summaryrefslogtreecommitdiff
path: root/core/src/fxge
diff options
context:
space:
mode:
Diffstat (limited to 'core/src/fxge')
-rw-r--r--core/src/fxge/Microsoft SDK/include/DWrite.h5006
-rw-r--r--core/src/fxge/Microsoft SDK/include/Dcommon.h65
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlus.h156
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusBase.h40
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusBitmap.h1004
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusBrush.h951
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusCachedBitmap.h71
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusColor.h209
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusColorMatrix.h63
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusEnums.h1252
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusFlat.h2740
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusFont.h299
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusFontCollection.h149
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusFontFamily.h271
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusGpStubs.h107
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusGraphics.h2726
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusHeaders.h793
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusImageCodec.h73
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusImaging.h540
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusLineCaps.h253
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusMatrix.h309
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusMem.h49
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusMetaFile.h374
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusMetaHeader.h213
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusPath.h1686
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusPen.h519
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusPixelFormats.h201
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusRegion.h498
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusStringFormat.h381
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusTypes.h826
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiPlusimageAttributes.h397
-rw-r--r--core/src/fxge/Microsoft SDK/include/GdiplusInit.h104
-rw-r--r--core/src/fxge/Microsoft SDK/include/sal.h729
-rw-r--r--core/src/fxge/Microsoft SDK/include/specstrings.h978
-rw-r--r--core/src/fxge/agg/agg23/agg_array.h510
-rw-r--r--core/src/fxge/agg/agg23/agg_basics.h282
-rw-r--r--core/src/fxge/agg/agg23/agg_clip_liang_barsky.h125
-rw-r--r--core/src/fxge/agg/agg23/agg_color_gray.h50
-rw-r--r--core/src/fxge/agg/agg23/agg_conv_adaptor_vcgen.h138
-rw-r--r--core/src/fxge/agg/agg23/agg_conv_dash.h61
-rw-r--r--core/src/fxge/agg/agg23/agg_conv_stroke.h110
-rw-r--r--core/src/fxge/agg/agg23/agg_curves.h191
-rw-r--r--core/src/fxge/agg/agg23/agg_math.h63
-rw-r--r--core/src/fxge/agg/agg23/agg_math_stroke.h272
-rw-r--r--core/src/fxge/agg/agg23/agg_path_storage.h172
-rw-r--r--core/src/fxge/agg/agg23/agg_pixfmt_gray.h177
-rw-r--r--core/src/fxge/agg/agg23/agg_rasterizer_scanline_aa.h472
-rw-r--r--core/src/fxge/agg/agg23/agg_render_scanlines.h50
-rw-r--r--core/src/fxge/agg/agg23/agg_renderer_base.h163
-rw-r--r--core/src/fxge/agg/agg23/agg_renderer_scanline.h93
-rw-r--r--core/src/fxge/agg/agg23/agg_rendering_buffer.h145
-rw-r--r--core/src/fxge/agg/agg23/agg_scanline_u.h150
-rw-r--r--core/src/fxge/agg/agg23/agg_shorten_path.h57
-rw-r--r--core/src/fxge/agg/agg23/agg_vcgen_dash.h75
-rw-r--r--core/src/fxge/agg/agg23/agg_vcgen_stroke.h120
-rw-r--r--core/src/fxge/agg/agg23/agg_vertex_sequence.h100
-rw-r--r--core/src/fxge/agg/agg23/fx_agg_curves.cpp109
-rw-r--r--core/src/fxge/agg/agg23/fx_agg_driver.cpp1636
-rw-r--r--core/src/fxge/agg/agg23/fx_agg_path_storage.cpp104
-rw-r--r--core/src/fxge/agg/agg23/fx_agg_rasterizer_scanline_aa.cpp495
-rw-r--r--core/src/fxge/agg/agg23/fx_agg_vcgen_dash.cpp176
-rw-r--r--core/src/fxge/agg/agg23/fx_agg_vcgen_stroke.cpp214
-rw-r--r--core/src/fxge/agg/include/fx_agg_driver.h121
-rw-r--r--core/src/fxge/agg/include/fxfx_agg_basics.h10
-rw-r--r--core/src/fxge/agg/include/fxfx_agg_clip_liang_barsky.h10
-rw-r--r--core/src/fxge/agg/include/fxfx_agg_conv_dash.h10
-rw-r--r--core/src/fxge/agg/include/fxfx_agg_conv_stroke.h10
-rw-r--r--core/src/fxge/agg/include/fxfx_agg_curves.h10
-rw-r--r--core/src/fxge/agg/include/fxfx_agg_path_storage.h10
-rw-r--r--core/src/fxge/agg/include/fxfx_agg_rasterizer_scanline_aa.h10
-rw-r--r--core/src/fxge/agg/include/fxfx_agg_renderer_scanline.h10
-rw-r--r--core/src/fxge/agg/include/fxfx_agg_rendering_buffer.h10
-rw-r--r--core/src/fxge/agg/include/fxfx_agg_scanline_u.h10
-rw-r--r--core/src/fxge/agg/src/fxfx_agg_curves.cpp7
-rw-r--r--core/src/fxge/agg/src/fxfx_agg_driver.cpp7
-rw-r--r--core/src/fxge/agg/src/fxfx_agg_path_storage.cpp7
-rw-r--r--core/src/fxge/agg/src/fxfx_agg_rasterizer_scanline_aa.cpp7
-rw-r--r--core/src/fxge/agg/src/fxfx_agg_vcgen_dash.cpp7
-rw-r--r--core/src/fxge/agg/src/fxfx_agg_vcgen_stroke.cpp7
-rw-r--r--core/src/fxge/android/fpf_skiafont.cpp203
-rw-r--r--core/src/fxge/android/fpf_skiafont.h57
-rw-r--r--core/src/fxge/android/fpf_skiafontmgr.cpp561
-rw-r--r--core/src/fxge/android/fpf_skiafontmgr.h117
-rw-r--r--core/src/fxge/android/fpf_skiamodule.cpp46
-rw-r--r--core/src/fxge/android/fpf_skiamodule.h22
-rw-r--r--core/src/fxge/android/fx_android_font.cpp87
-rw-r--r--core/src/fxge/android/fx_android_font.h36
-rw-r--r--core/src/fxge/android/fx_android_imp.cpp32
-rw-r--r--core/src/fxge/android/fx_fpf.h14
-rw-r--r--core/src/fxge/apple/apple_int.h246
-rw-r--r--core/src/fxge/apple/fx_apple_platform.cpp173
-rw-r--r--core/src/fxge/apple/fx_mac_imp.cpp117
-rw-r--r--core/src/fxge/apple/fx_quartz_device.cpp1138
-rw-r--r--core/src/fxge/dib/dib_int.h88
-rw-r--r--core/src/fxge/dib/fx_dib_composite.cpp4602
-rw-r--r--core/src/fxge/dib/fx_dib_convert.cpp1090
-rw-r--r--core/src/fxge/dib/fx_dib_engine.cpp867
-rw-r--r--core/src/fxge/dib/fx_dib_main.cpp1734
-rw-r--r--core/src/fxge/dib/fx_dib_transform.cpp797
-rw-r--r--core/src/fxge/fontdata/chromefontdata/FoxitDingbats.c3697
-rw-r--r--core/src/fxge/fontdata/chromefontdata/FoxitFixed.c2208
-rw-r--r--core/src/fxge/fontdata/chromefontdata/FoxitFixedBold.c2265
-rw-r--r--core/src/fxge/fontdata/chromefontdata/FoxitFixedBoldItalic.c2402
-rw-r--r--core/src/fxge/fontdata/chromefontdata/FoxitFixedItalic.c2352
-rw-r--r--core/src/fxge/fontdata/chromefontdata/FoxitSans.c1886
-rw-r--r--core/src/fxge/fontdata/chromefontdata/FoxitSansBold.c2051
-rw-r--r--core/src/fxge/fontdata/chromefontdata/FoxitSansBoldItalic.c2061
-rw-r--r--core/src/fxge/fontdata/chromefontdata/FoxitSansItalic.c2051
-rw-r--r--core/src/fxge/fontdata/chromefontdata/FoxitSansMM.c4191
-rw-r--r--core/src/fxge/fontdata/chromefontdata/FoxitSerif.c2442
-rw-r--r--core/src/fxge/fontdata/chromefontdata/FoxitSerifBold.c2433
-rw-r--r--core/src/fxge/fontdata/chromefontdata/FoxitSerifBoldItalic.c2600
-rw-r--r--core/src/fxge/fontdata/chromefontdata/FoxitSerifItalic.c2662
-rw-r--r--core/src/fxge/fontdata/chromefontdata/FoxitSerifMM.c7097
-rw-r--r--core/src/fxge/fontdata/chromefontdata/FoxitSymbol.c2099
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/foxitnames.h288
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/config/ftconfig.h599
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/config/ftheader.h832
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/config/ftmodule.h32
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/config/ftoption.h833
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/config/ftstdlib.h174
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/freetype.h4016
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftadvanc.h182
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftautoh.h357
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftbbox.h102
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftbdf.h209
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftbitmap.h227
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftbzip2.h102
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftcache.h1057
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftcffdrv.h151
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftchapters.h120
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftcid.h166
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/fterrdef.h249
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/fterrors.h198
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftgasp.h128
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftglyph.h620
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftgxval.h358
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftgzip.h102
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftimage.h1322
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftincrem.h353
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftlcdfil.h251
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftlist.h277
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftlzw.h99
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftmac.h274
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftmm.h378
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftmodapi.h641
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftmoderr.h194
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftotval.h203
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftoutln.h560
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftpfr.h172
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftrender.h238
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftsizes.h159
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftsnames.h200
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftstroke.h751
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftsynth.h81
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftsystem.h354
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/fttrigon.h350
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftttdrv.h150
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/fttypes.h598
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftwinfnt.h274
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftxf86.h83
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/autohint.h244
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftcalc.h167
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftdebug.h255
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftdriver.h409
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftgloadr.h168
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftmemory.h459
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftobjs.h1569
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftpic.h71
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftrfork.h258
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftserv.h763
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftstream.h536
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/fttrace.h152
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftvalid.h161
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/internal.h63
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/psaux.h877
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/pshints.h722
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svbdf.h82
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svcid.h89
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svgldict.h88
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svgxval.h72
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svkern.h51
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svmm.h113
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svotval.h55
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svpfr.h66
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svpostnm.h81
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svprop.h81
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svpscmap.h177
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svpsinfo.h111
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svsfnt.h103
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svttcmap.h107
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svtteng.h53
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svttglyf.h68
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svwinfnt.h50
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svxf86nm.h55
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/sfnt.h707
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/t1types.h255
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/tttypes.h1440
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/t1tables.h662
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ttnameid.h1237
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/tttables.h777
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/tttags.h109
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ttunpat.h59
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/include/ft2build.h40
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/Jamfile60
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/basepic.c108
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/basepic.h90
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftadvanc.c162
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftapi.c121
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftbase.h69
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftbbox.c649
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftbdf.c88
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftcalc.c972
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftcid.c117
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftdbgmem.c992
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftdebug.c266
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftfstype.c62
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftgasp.c61
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftgloadr.c405
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftgxval.c142
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftmac.c1061
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftobjs.c4867
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftotval.c91
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftoutln.c1081
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftpatent.c286
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftpfr.c146
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftpic.c55
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftrfork.c849
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftsnames.c94
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftstream.c865
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftstroke.c2418
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftsynth.c153
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/fttrigon.c492
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/fttype1.c120
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftutil.c548
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftwinfnt.c51
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftxf86.c40
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftbase.c44
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftbitmap.c760
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftglyph.c631
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftinit.c285
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftlcdfil.c381
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftmm.c206
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftsystem.c375
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/md5.c295
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/md5.h45
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/base/rules.mk99
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/Jamfile29
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2arrst.c241
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2arrst.h100
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2blues.c578
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2blues.h185
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2error.c52
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2error.h119
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2fixed.h95
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2font.c404
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2font.h114
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2ft.c639
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2ft.h147
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2glue.h144
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2hints.c1747
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2hints.h287
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2intrp.c1540
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2intrp.h83
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2read.c112
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2read.h68
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2stack.c205
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2stack.h106
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2types.h78
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffcmap.c210
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffcmap.h67
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffdrivr.c787
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffdrivr.h38
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cfferrs.h42
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffgload.c3072
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffgload.h240
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffload.c1696
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffload.h83
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffobjs.c1082
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffobjs.h183
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffparse.c1177
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffparse.h106
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffpic.c138
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffpic.h108
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cfftoken.h97
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cfftypes.h284
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/fxft_cff.c45
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/module.mk23
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cff/rules.mk86
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cid/Jamfile29
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cid/ciderrs.h41
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidgload.c442
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidgload.h51
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidload.c690
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidload.h53
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidobjs.c491
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidobjs.h154
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidparse.c225
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidparse.h123
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidriver.c236
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidriver.h43
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidtoken.h112
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cid/fxft_type1cid.c33
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cid/module.mk23
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/cid/rules.mk70
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/Jamfile31
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/afmparse.c964
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/afmparse.h88
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/fxft_psaux.c38
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/module.mk23
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psauxerr.h42
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psauxmod.c139
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psauxmod.h42
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psconv.c641
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psconv.h74
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psobjs.c1767
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psobjs.h212
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/rules.mk73
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/t1cmap.c341
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/t1cmap.h105
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/t1decode.c1620
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/t1decode.h64
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/Jamfile29
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/fxft_pshinter.c33
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/module.mk23
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshalgo.c2305
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshalgo.h246
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshglob.c805
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshglob.h196
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshmod.c119
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshmod.h39
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshnterr.h41
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshpic.c76
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshpic.h63
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshrec.c1225
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshrec.h176
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/rules.mk73
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/Jamfile29
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/fxft_psmodule.c670
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/module.mk23
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/psmodule.h38
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/psnamerr.h42
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/psnames.c26
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/pspic.c97
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/pspic.h66
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/pstables.h4184
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/rules.mk71
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/raster/Jamfile29
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/raster/ftmisc.h142
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/raster/ftraster.c3640
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/raster/ftraster.h46
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/raster/ftrend1.c306
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/raster/ftrend1.h44
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/raster/fxft_raster.c35
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/raster/module.mk23
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/raster/rasterrs.h42
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/raster/rastpic.c103
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/raster/rastpic.h69
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/raster/rules.mk70
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/Jamfile29
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/fxft_sfnt.c47
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/module.mk23
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/pngshim.c336
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/pngshim.h48
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/rules.mk78
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfdriver.c529
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfdriver.h38
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sferrors.h40
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfntpic.c143
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfntpic.h114
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfobjs.c1165
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfobjs.h54
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttbdf.c250
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttbdf.h46
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttcmap.c3560
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttcmap.h158
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttcmapc.h56
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttkern.c306
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttkern.h52
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttload.c1295
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttload.h112
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttmtx.c286
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttmtx.h55
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttpost.c563
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttpost.h46
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttsbit.c1177
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttsbit.h63
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/Jamfile29
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftgrays.c2137
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftgrays.h58
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftsmerrs.h42
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftsmooth.c534
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftsmooth.h49
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftspic.c118
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftspic.h74
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/fxft_smooth.c31
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/module.mk27
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/rules.mk70
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/Jamfile29
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/fxft_truetype.c42
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/module.mk23
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/rules.mk74
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttdriver.c572
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttdriver.h38
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/tterrors.h41
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttgload.c2337
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttgload.h61
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttgxvar.c1532
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttgxvar.h182
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttinterp.c8952
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttinterp.h397
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttobjs.c1346
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttobjs.h442
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttpic.c101
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttpic.h81
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttpload.c601
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttpload.h75
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttsubpix.c1011
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttsubpix.h110
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/type1/Jamfile29
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/type1/fxft_type1.c37
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/type1/module.mk23
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/type1/rules.mk73
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1afm.c396
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1afm.h54
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1driver.c726
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1driver.h42
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1errors.h41
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1gload.c517
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1gload.h53
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1load.c2272
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1load.h102
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1objs.c616
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1objs.h160
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1parse.c497
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1parse.h135
-rw-r--r--core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1tokens.h143
-rw-r--r--core/src/fxge/fx_freetype/include/fxft_cffobjs.h10
-rw-r--r--core/src/fxge/fx_freetype/include/fxft_cfftypes.h10
-rw-r--r--core/src/fxge/fx_freetype/include/fxft_freetype.h10
-rw-r--r--core/src/fxge/fx_freetype/include/fxft_ft2build.h10
-rw-r--r--core/src/fxge/fx_freetype/include/fxft_ftmm.h10
-rw-r--r--core/src/fxge/fx_freetype/include/fxft_ftobjs.h10
-rw-r--r--core/src/fxge/fx_freetype/include/fxft_ftotval.h10
-rw-r--r--core/src/fxge/fx_freetype/include/fxft_ftoutln.h10
-rw-r--r--core/src/fxge/fx_freetype/include/fxft_ftstream.h10
-rw-r--r--core/src/fxge/fx_freetype/include/fxft_tttables.h10
-rw-r--r--core/src/fxge/fx_freetype/include/fxft_tttypes.h10
-rw-r--r--core/src/fxge/fx_freetype/src/fxft_cff.c7
-rw-r--r--core/src/fxge/fx_freetype/src/fxft_ftbase.c7
-rw-r--r--core/src/fxge/fx_freetype/src/fxft_ftbitmap.c7
-rw-r--r--core/src/fxge/fx_freetype/src/fxft_ftglyph.c7
-rw-r--r--core/src/fxge/fx_freetype/src/fxft_ftinit.c7
-rw-r--r--core/src/fxge/fx_freetype/src/fxft_ftlcdfil.c7
-rw-r--r--core/src/fxge/fx_freetype/src/fxft_ftmm.c7
-rw-r--r--core/src/fxge/fx_freetype/src/fxft_ftsystem.c7
-rw-r--r--core/src/fxge/fx_freetype/src/fxft_psaux.c7
-rw-r--r--core/src/fxge/fx_freetype/src/fxft_pshinter.c7
-rw-r--r--core/src/fxge/fx_freetype/src/fxft_psmodule.c7
-rw-r--r--core/src/fxge/fx_freetype/src/fxft_raster.c7
-rw-r--r--core/src/fxge/fx_freetype/src/fxft_sfnt.c7
-rw-r--r--core/src/fxge/fx_freetype/src/fxft_smooth.c7
-rw-r--r--core/src/fxge/fx_freetype/src/fxft_truetype.c7
-rw-r--r--core/src/fxge/fx_freetype/src/fxft_type1.c7
-rw-r--r--core/src/fxge/fx_freetype/src/fxft_type1cid.c7
-rw-r--r--core/src/fxge/ge/fx_ge.cpp79
-rw-r--r--core/src/fxge/ge/fx_ge_device.cpp405
-rw-r--r--core/src/fxge/ge/fx_ge_font.cpp458
-rw-r--r--core/src/fxge/ge/fx_ge_fontmap.cpp1558
-rw-r--r--core/src/fxge/ge/fx_ge_linux.cpp259
-rw-r--r--core/src/fxge/ge/fx_ge_path.cpp654
-rw-r--r--core/src/fxge/ge/fx_ge_ps.cpp657
-rw-r--r--core/src/fxge/ge/fx_ge_text.cpp1774
-rw-r--r--core/src/fxge/ge/text_int.h100
-rw-r--r--core/src/fxge/win32/dwrite_int.h59
-rw-r--r--core/src/fxge/win32/fx_win32_device.cpp1200
-rw-r--r--core/src/fxge/win32/fx_win32_dib.cpp310
-rw-r--r--core/src/fxge/win32/fx_win32_dwrite.cpp480
-rw-r--r--core/src/fxge/win32/fx_win32_gdipext.cpp1286
-rw-r--r--core/src/fxge/win32/fx_win32_print.cpp426
-rw-r--r--core/src/fxge/win32/win32_int.h238
481 files changed, 229491 insertions, 0 deletions
diff --git a/core/src/fxge/Microsoft SDK/include/DWrite.h b/core/src/fxge/Microsoft SDK/include/DWrite.h
new file mode 100644
index 0000000000..70f998a437
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/DWrite.h
@@ -0,0 +1,5006 @@
+//+--------------------------------------------------------------------------
+//
+// Copyright (c) Microsoft Corporation. All rights reserved.
+//
+// Abstract:
+// DirectX Typography Services public API definitions.
+//
+//----------------------------------------------------------------------------
+
+#ifndef DWRITE_H_INCLUDED
+#define DWRITE_H_INCLUDED
+
+#if _MSC_VER > 1000
+#pragma once
+#endif
+
+#ifndef DWRITE_NO_WINDOWS_H
+
+#include "specstrings.h"
+#include "unknwn.h"
+
+#endif // DWRITE_NO_WINDOWS_H
+
+#include "dcommon.h"
+
+#if _FX_COMPILER_ == _FX_VC6_
+typedef signed char INT8, *PINT8;
+typedef signed short INT16, *PINT16;
+typedef signed int INT32, *PINT32;
+typedef signed __int64 INT64, *PINT64;
+typedef unsigned char UINT8, *PUINT8;
+typedef unsigned short UINT16, *PUINT16;
+typedef unsigned int UINT32, *PUINT32;
+typedef unsigned __int64 UINT64, *PUINT64;
+#endif
+
+#ifndef DWRITE_DECLARE_INTERFACE
+#define DWRITE_DECLARE_INTERFACE(iid) DECLSPEC_UUID(iid) DECLSPEC_NOVTABLE
+#endif
+
+#ifndef DWRITE_EXPORT
+#define DWRITE_EXPORT __declspec(dllimport) WINAPI
+#endif
+
+/// <summary>
+/// The type of a font represented by a single font file.
+/// Font formats that consist of multiple files, e.g. Type 1 .PFM and .PFB, have
+/// separate enum values for each of the file type.
+/// </summary>
+enum DWRITE_FONT_FILE_TYPE
+{
+ /// <summary>
+ /// Font type is not recognized by the DirectWrite font system.
+ /// </summary>
+ DWRITE_FONT_FILE_TYPE_UNKNOWN,
+
+ /// <summary>
+ /// OpenType font with CFF outlines.
+ /// </summary>
+ DWRITE_FONT_FILE_TYPE_CFF,
+
+ /// <summary>
+ /// OpenType font with TrueType outlines.
+ /// </summary>
+ DWRITE_FONT_FILE_TYPE_TRUETYPE,
+
+ /// <summary>
+ /// OpenType font that contains a TrueType collection.
+ /// </summary>
+ DWRITE_FONT_FILE_TYPE_TRUETYPE_COLLECTION,
+
+ /// <summary>
+ /// Type 1 PFM font.
+ /// </summary>
+ DWRITE_FONT_FILE_TYPE_TYPE1_PFM,
+
+ /// <summary>
+ /// Type 1 PFB font.
+ /// </summary>
+ DWRITE_FONT_FILE_TYPE_TYPE1_PFB,
+
+ /// <summary>
+ /// Vector .FON font.
+ /// </summary>
+ DWRITE_FONT_FILE_TYPE_VECTOR,
+
+ /// <summary>
+ /// Bitmap .FON font.
+ /// </summary>
+ DWRITE_FONT_FILE_TYPE_BITMAP
+};
+
+/// <summary>
+/// The file format of a complete font face.
+/// Font formats that consist of multiple files, e.g. Type 1 .PFM and .PFB, have
+/// a single enum entry.
+/// </summary>
+enum DWRITE_FONT_FACE_TYPE
+{
+ /// <summary>
+ /// OpenType font face with CFF outlines.
+ /// </summary>
+ DWRITE_FONT_FACE_TYPE_CFF,
+
+ /// <summary>
+ /// OpenType font face with TrueType outlines.
+ /// </summary>
+ DWRITE_FONT_FACE_TYPE_TRUETYPE,
+
+ /// <summary>
+ /// OpenType font face that is a part of a TrueType collection.
+ /// </summary>
+ DWRITE_FONT_FACE_TYPE_TRUETYPE_COLLECTION,
+
+ /// <summary>
+ /// A Type 1 font face.
+ /// </summary>
+ DWRITE_FONT_FACE_TYPE_TYPE1,
+
+ /// <summary>
+ /// A vector .FON format font face.
+ /// </summary>
+ DWRITE_FONT_FACE_TYPE_VECTOR,
+
+ /// <summary>
+ /// A bitmap .FON format font face.
+ /// </summary>
+ DWRITE_FONT_FACE_TYPE_BITMAP,
+
+ /// <summary>
+ /// Font face type is not recognized by the DirectWrite font system.
+ /// </summary>
+ DWRITE_FONT_FACE_TYPE_UNKNOWN
+};
+
+/// <summary>
+/// Specifies algorithmic style simulations to be applied to the font face.
+/// Bold and oblique simulations can be combined via bitwise OR operation.
+/// </summary>
+enum DWRITE_FONT_SIMULATIONS
+{
+ /// <summary>
+ /// No simulations are performed.
+ /// </summary>
+ DWRITE_FONT_SIMULATIONS_NONE = 0x0000,
+
+ /// <summary>
+ /// Algorithmic emboldening is performed.
+ /// </summary>
+ DWRITE_FONT_SIMULATIONS_BOLD = 0x0001,
+
+ /// <summary>
+ /// Algorithmic italicization is performed.
+ /// </summary>
+ DWRITE_FONT_SIMULATIONS_OBLIQUE = 0x0002
+};
+
+#ifdef DEFINE_ENUM_FLAG_OPERATORS
+DEFINE_ENUM_FLAG_OPERATORS(DWRITE_FONT_SIMULATIONS);
+#endif
+
+/// <summary>
+/// The font weight enumeration describes common values for degree of blackness or thickness of strokes of characters in a font.
+/// Font weight values less than 1 or greater than 999 are considered to be invalid, and they are rejected by font API functions.
+/// </summary>
+enum DWRITE_FONT_WEIGHT
+{
+ /// <summary>
+ /// Predefined font weight : Thin (100).
+ /// </summary>
+ DWRITE_FONT_WEIGHT_THIN = 100,
+
+ /// <summary>
+ /// Predefined font weight : Extra-light (200).
+ /// </summary>
+ DWRITE_FONT_WEIGHT_EXTRA_LIGHT = 200,
+
+ /// <summary>
+ /// Predefined font weight : Ultra-light (200).
+ /// </summary>
+ DWRITE_FONT_WEIGHT_ULTRA_LIGHT = 200,
+
+ /// <summary>
+ /// Predefined font weight : Light (300).
+ /// </summary>
+ DWRITE_FONT_WEIGHT_LIGHT = 300,
+
+ /// <summary>
+ /// Predefined font weight : Normal (400).
+ /// </summary>
+ DWRITE_FONT_WEIGHT_NORMAL = 400,
+
+ /// <summary>
+ /// Predefined font weight : Regular (400).
+ /// </summary>
+ DWRITE_FONT_WEIGHT_REGULAR = 400,
+
+ /// <summary>
+ /// Predefined font weight : Medium (500).
+ /// </summary>
+ DWRITE_FONT_WEIGHT_MEDIUM = 500,
+
+ /// <summary>
+ /// Predefined font weight : Demi-bold (600).
+ /// </summary>
+ DWRITE_FONT_WEIGHT_DEMI_BOLD = 600,
+
+ /// <summary>
+ /// Predefined font weight : Semi-bold (600).
+ /// </summary>
+ DWRITE_FONT_WEIGHT_SEMI_BOLD = 600,
+
+ /// <summary>
+ /// Predefined font weight : Bold (700).
+ /// </summary>
+ DWRITE_FONT_WEIGHT_BOLD = 700,
+
+ /// <summary>
+ /// Predefined font weight : Extra-bold (800).
+ /// </summary>
+ DWRITE_FONT_WEIGHT_EXTRA_BOLD = 800,
+
+ /// <summary>
+ /// Predefined font weight : Ultra-bold (800).
+ /// </summary>
+ DWRITE_FONT_WEIGHT_ULTRA_BOLD = 800,
+
+ /// <summary>
+ /// Predefined font weight : Black (900).
+ /// </summary>
+ DWRITE_FONT_WEIGHT_BLACK = 900,
+
+ /// <summary>
+ /// Predefined font weight : Heavy (900).
+ /// </summary>
+ DWRITE_FONT_WEIGHT_HEAVY = 900,
+
+ /// <summary>
+ /// Predefined font weight : Extra-black (950).
+ /// </summary>
+ DWRITE_FONT_WEIGHT_EXTRA_BLACK = 950,
+
+ /// <summary>
+ /// Predefined font weight : Ultra-black (950).
+ /// </summary>
+ DWRITE_FONT_WEIGHT_ULTRA_BLACK = 950
+};
+
+/// <summary>
+/// The font stretch enumeration describes relative change from the normal aspect ratio
+/// as specified by a font designer for the glyphs in a font.
+/// Values less than 1 or greater than 9 are considered to be invalid, and they are rejected by font API functions.
+/// </summary>
+enum DWRITE_FONT_STRETCH
+{
+ /// <summary>
+ /// Predefined font stretch : Not known (0).
+ /// </summary>
+ DWRITE_FONT_STRETCH_UNDEFINED = 0,
+
+ /// <summary>
+ /// Predefined font stretch : Ultra-condensed (1).
+ /// </summary>
+ DWRITE_FONT_STRETCH_ULTRA_CONDENSED = 1,
+
+ /// <summary>
+ /// Predefined font stretch : Extra-condensed (2).
+ /// </summary>
+ DWRITE_FONT_STRETCH_EXTRA_CONDENSED = 2,
+
+ /// <summary>
+ /// Predefined font stretch : Condensed (3).
+ /// </summary>
+ DWRITE_FONT_STRETCH_CONDENSED = 3,
+
+ /// <summary>
+ /// Predefined font stretch : Semi-condensed (4).
+ /// </summary>
+ DWRITE_FONT_STRETCH_SEMI_CONDENSED = 4,
+
+ /// <summary>
+ /// Predefined font stretch : Normal (5).
+ /// </summary>
+ DWRITE_FONT_STRETCH_NORMAL = 5,
+
+ /// <summary>
+ /// Predefined font stretch : Medium (5).
+ /// </summary>
+ DWRITE_FONT_STRETCH_MEDIUM = 5,
+
+ /// <summary>
+ /// Predefined font stretch : Semi-expanded (6).
+ /// </summary>
+ DWRITE_FONT_STRETCH_SEMI_EXPANDED = 6,
+
+ /// <summary>
+ /// Predefined font stretch : Expanded (7).
+ /// </summary>
+ DWRITE_FONT_STRETCH_EXPANDED = 7,
+
+ /// <summary>
+ /// Predefined font stretch : Extra-expanded (8).
+ /// </summary>
+ DWRITE_FONT_STRETCH_EXTRA_EXPANDED = 8,
+
+ /// <summary>
+ /// Predefined font stretch : Ultra-expanded (9).
+ /// </summary>
+ DWRITE_FONT_STRETCH_ULTRA_EXPANDED = 9
+};
+
+/// <summary>
+/// The font style enumeration describes the slope style of a font face, such as Normal, Italic or Oblique.
+/// Values other than the ones defined in the enumeration are considered to be invalid, and they are rejected by font API functions.
+/// </summary>
+enum DWRITE_FONT_STYLE
+{
+ /// <summary>
+ /// Font slope style : Normal.
+ /// </summary>
+ DWRITE_FONT_STYLE_NORMAL,
+
+ /// <summary>
+ /// Font slope style : Oblique.
+ /// </summary>
+ DWRITE_FONT_STYLE_OBLIQUE,
+
+ /// <summary>
+ /// Font slope style : Italic.
+ /// </summary>
+ DWRITE_FONT_STYLE_ITALIC
+
+};
+
+/// <summary>
+/// The informational string enumeration identifies a string in a font.
+/// </summary>
+enum DWRITE_INFORMATIONAL_STRING_ID
+{
+ /// <summary>
+ /// Unspecified name ID.
+ /// </summary>
+ DWRITE_INFORMATIONAL_STRING_NONE,
+
+ /// <summary>
+ /// Copyright notice provided by the font.
+ /// </summary>
+ DWRITE_INFORMATIONAL_STRING_COPYRIGHT_NOTICE,
+
+ /// <summary>
+ /// String containing a version number.
+ /// </summary>
+ DWRITE_INFORMATIONAL_STRING_VERSION_STRINGS,
+
+ /// <summary>
+ /// Trademark information provided by the font.
+ /// </summary>
+ DWRITE_INFORMATIONAL_STRING_TRADEMARK,
+
+ /// <summary>
+ /// Name of the font manufacturer.
+ /// </summary>
+ DWRITE_INFORMATIONAL_STRING_MANUFACTURER,
+
+ /// <summary>
+ /// Name of the font designer.
+ /// </summary>
+ DWRITE_INFORMATIONAL_STRING_DESIGNER,
+
+ /// <summary>
+ /// URL of font designer (with protocol, e.g., http://, ftp://).
+ /// </summary>
+ DWRITE_INFORMATIONAL_STRING_DESIGNER_URL,
+
+ /// <summary>
+ /// Description of the font. Can contain revision information, usage recommendations, history, features, etc.
+ /// </summary>
+ DWRITE_INFORMATIONAL_STRING_DESCRIPTION,
+
+ /// <summary>
+ /// URL of font vendor (with protocol, e.g., http://, ftp://). If a unique serial number is embedded in the URL, it can be used to register the font.
+ /// </summary>
+ DWRITE_INFORMATIONAL_STRING_FONT_VENDOR_URL,
+
+ /// <summary>
+ /// Description of how the font may be legally used, or different example scenarios for licensed use. This field should be written in plain language, not legalese.
+ /// </summary>
+ DWRITE_INFORMATIONAL_STRING_LICENSE_DESCRIPTION,
+
+ /// <summary>
+ /// URL where additional licensing information can be found.
+ /// </summary>
+ DWRITE_INFORMATIONAL_STRING_LICENSE_INFO_URL,
+
+ /// <summary>
+ /// GDI-compatible family name. Because GDI allows a maximum of four fonts per family, fonts in the same family may have different GDI-compatible family names
+ /// (e.g., "Arial", "Arial Narrow", "Arial Black").
+ /// </summary>
+ DWRITE_INFORMATIONAL_STRING_WIN32_FAMILY_NAMES,
+
+ /// <summary>
+ /// GDI-compatible subfamily name.
+ /// </summary>
+ DWRITE_INFORMATIONAL_STRING_WIN32_SUBFAMILY_NAMES,
+
+ /// <summary>
+ /// Family name preferred by the designer. This enables font designers to group more than four fonts in a single family without losing compatibility with
+ /// GDI. This name is typically only present if it differs from the GDI-compatible family name.
+ /// </summary>
+ DWRITE_INFORMATIONAL_STRING_PREFERRED_FAMILY_NAMES,
+
+ /// <summary>
+ /// Subfamily name preferred by the designer. This name is typically only present if it differs from the GDI-compatible subfamily name.
+ /// </summary>
+ DWRITE_INFORMATIONAL_STRING_PREFERRED_SUBFAMILY_NAMES,
+
+ /// <summary>
+ /// Sample text. This can be the font name or any other text that the designer thinks is the best example to display the font in.
+ /// </summary>
+ DWRITE_INFORMATIONAL_STRING_SAMPLE_TEXT
+};
+
+
+/// <summary>
+/// The DWRITE_FONT_METRICS structure specifies the metrics of a font face that
+/// are applicable to all glyphs within the font face.
+/// </summary>
+struct DWRITE_FONT_METRICS
+{
+ /// <summary>
+ /// The number of font design units per em unit.
+ /// Font files use their own coordinate system of font design units.
+ /// A font design unit is the smallest measurable unit in the em square,
+ /// an imaginary square that is used to size and align glyphs.
+ /// The concept of em square is used as a reference scale factor when defining font size and device transformation semantics.
+ /// The size of one em square is also commonly used to compute the paragraph identation value.
+ /// </summary>
+ UINT16 designUnitsPerEm;
+
+ /// <summary>
+ /// Ascent value of the font face in font design units.
+ /// Ascent is the distance from the top of font character alignment box to English baseline.
+ /// </summary>
+ UINT16 ascent;
+
+ /// <summary>
+ /// Descent value of the font face in font design units.
+ /// Descent is the distance from the bottom of font character alignment box to English baseline.
+ /// </summary>
+ UINT16 descent;
+
+ /// <summary>
+ /// Line gap in font design units.
+ /// Recommended additional white space to add between lines to improve legibility. The recommended line spacing
+ /// (baseline-to-baseline distance) is thus the sum of ascent, descent, and lineGap. The line gap is usually
+ /// positive or zero but can be negative, in which case the recommended line spacing is less than the height
+ /// of the character alignment box.
+ /// </summary>
+ INT16 lineGap;
+
+ /// <summary>
+ /// Cap height value of the font face in font design units.
+ /// Cap height is the distance from English baseline to the top of a typical English capital.
+ /// Capital "H" is often used as a reference character for the purpose of calculating the cap height value.
+ /// </summary>
+ UINT16 capHeight;
+
+ /// <summary>
+ /// x-height value of the font face in font design units.
+ /// x-height is the distance from English baseline to the top of lowercase letter "x", or a similar lowercase character.
+ /// </summary>
+ UINT16 xHeight;
+
+ /// <summary>
+ /// The underline position value of the font face in font design units.
+ /// Underline position is the position of underline relative to the English baseline.
+ /// The value is usually made negative in order to place the underline below the baseline.
+ /// </summary>
+ INT16 underlinePosition;
+
+ /// <summary>
+ /// The suggested underline thickness value of the font face in font design units.
+ /// </summary>
+ UINT16 underlineThickness;
+
+ /// <summary>
+ /// The strikethrough position value of the font face in font design units.
+ /// Strikethrough position is the position of strikethrough relative to the English baseline.
+ /// The value is usually made positive in order to place the strikethrough above the baseline.
+ /// </summary>
+ INT16 strikethroughPosition;
+
+ /// <summary>
+ /// The suggested strikethrough thickness value of the font face in font design units.
+ /// </summary>
+ UINT16 strikethroughThickness;
+};
+
+/// <summary>
+/// The DWRITE_GLYPH_METRICS structure specifies the metrics of an individual glyph.
+/// The units depend on how the metrics are obtained.
+/// </summary>
+struct DWRITE_GLYPH_METRICS
+{
+ /// <summary>
+ /// Specifies the X offset from the glyph origin to the left edge of the black box.
+ /// The glyph origin is the current horizontal writing position.
+ /// A negative value means the black box extends to the left of the origin (often true for lowercase italic 'f').
+ /// </summary>
+ INT32 leftSideBearing;
+
+ /// <summary>
+ /// Specifies the X offset from the origin of the current glyph to the origin of the next glyph when writing horizontally.
+ /// </summary>
+ UINT32 advanceWidth;
+
+ /// <summary>
+ /// Specifies the X offset from the right edge of the black box to the origin of the next glyph when writing horizontally.
+ /// The value is negative when the right edge of the black box overhangs the layout box.
+ /// </summary>
+ INT32 rightSideBearing;
+
+ /// <summary>
+ /// Specifies the vertical offset from the vertical origin to the top of the black box.
+ /// Thus, a positive value adds whitespace whereas a negative value means the glyph overhangs the top of the layout box.
+ /// </summary>
+ INT32 topSideBearing;
+
+ /// <summary>
+ /// Specifies the Y offset from the vertical origin of the current glyph to the vertical origin of the next glyph when writing vertically.
+ /// (Note that the term "origin" by itself denotes the horizontal origin. The vertical origin is different.
+ /// Its Y coordinate is specified by verticalOriginY value,
+ /// and its X coordinate is half the advanceWidth to the right of the horizontal origin).
+ /// </summary>
+ UINT32 advanceHeight;
+
+ /// <summary>
+ /// Specifies the vertical distance from the black box's bottom edge to the advance height.
+ /// Positive when the bottom edge of the black box is within the layout box.
+ /// Negative when the bottom edge of black box overhangs the layout box.
+ /// </summary>
+ INT32 bottomSideBearing;
+
+ /// <summary>
+ /// Specifies the Y coordinate of a glyph's vertical origin, in the font's design coordinate system.
+ /// The y coordinate of a glyph's vertical origin is the sum of the glyph's top side bearing
+ /// and the top (i.e. yMax) of the glyph's bounding box.
+ /// </summary>
+ INT32 verticalOriginY;
+};
+
+/// <summary>
+/// Optional adjustment to a glyph's position. An glyph offset changes the position of a glyph without affecting
+/// the pen position. Offsets are in logical, pre-transform units.
+/// </summary>
+struct DWRITE_GLYPH_OFFSET
+{
+ /// <summary>
+ /// Offset in the advance direction of the run. A positive advance offset moves the glyph to the right
+ /// (in pre-transform coordinates) if the run is left-to-right or to the left if the run is right-to-left.
+ /// </summary>
+ FLOAT advanceOffset;
+
+ /// <summary>
+ /// Offset in the ascent direction, i.e., the direction ascenders point. A positive ascender offset moves
+ /// the glyph up (in pre-transform coordinates).
+ /// </summary>
+ FLOAT ascenderOffset;
+};
+
+/// <summary>
+/// Specifies the type of DirectWrite factory object.
+/// DirectWrite factory contains internal state such as font loader registration and cached font data.
+/// In most cases it is recommended to use the shared factory object, because it allows multiple components
+/// that use DirectWrite to share internal DirectWrite state and reduce memory usage.
+/// However, there are cases when it is desirable to reduce the impact of a component,
+/// such as a plug-in from an untrusted source, on the rest of the process by sandboxing and isolating it
+/// from the rest of the process components. In such cases, it is recommended to use an isolated factory for the sandboxed
+/// component.
+/// </summary>
+enum DWRITE_FACTORY_TYPE
+{
+ /// <summary>
+ /// Shared factory allow for re-use of cached font data across multiple in process components.
+ /// Such factories also take advantage of cross process font caching components for better performance.
+ /// </summary>
+ DWRITE_FACTORY_TYPE_SHARED,
+
+ /// <summary>
+ /// Objects created from the isolated factory do not interact with internal DirectWrite state from other components.
+ /// </summary>
+ DWRITE_FACTORY_TYPE_ISOLATED
+};
+
+// Creates an OpenType tag as a 32bit integer such that
+// the first character in the tag is the lowest byte,
+// (least significant on little endian architectures)
+// which can be used to compare with tags in the font file.
+// This macro is compatible with DWRITE_FONT_FEATURE_TAG.
+//
+// Example: DWRITE_MAKE_OPENTYPE_TAG('c','c','m','p')
+// Dword: 0x706D6363
+//
+#define DWRITE_MAKE_OPENTYPE_TAG(a,b,c,d) ( \
+ (static_cast<UINT32>(static_cast<UINT8>(d)) << 24) | \
+ (static_cast<UINT32>(static_cast<UINT8>(c)) << 16) | \
+ (static_cast<UINT32>(static_cast<UINT8>(b)) << 8) | \
+ static_cast<UINT32>(static_cast<UINT8>(a)))
+
+interface IDWriteFontFileStream;
+
+/// <summary>
+/// Font file loader interface handles loading font file resources of a particular type from a key.
+/// The font file loader interface is recommended to be implemented by a singleton object.
+/// IMPORTANT: font file loader implementations must not register themselves with DirectWrite factory
+/// inside their constructors and must not unregister themselves in their destructors, because
+/// registration and unregistraton operations increment and decrement the object reference count respectively.
+/// Instead, registration and unregistration of font file loaders with DirectWrite factory should be performed
+/// outside of the font file loader implementation as a separate step.
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("727cad4e-d6af-4c9e-8a08-d695b11caa49") IDWriteFontFileLoader : public IUnknown
+{
+ /// <summary>
+ /// Creates a font file stream object that encapsulates an open file resource.
+ /// The resource is closed when the last reference to fontFileStream is released.
+ /// </summary>
+ /// <param name="fontFileReferenceKey">Font file reference key that uniquely identifies the font file resource
+ /// within the scope of the font loader being used.</param>
+ /// <param name="fontFileReferenceKeySize">Size of font file reference key in bytes.</param>
+ /// <param name="fontFileStream">Pointer to the newly created font file stream.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(CreateStreamFromKey)(
+ __in_bcount(fontFileReferenceKeySize) void const* fontFileReferenceKey,
+ UINT32 fontFileReferenceKeySize,
+ __out IDWriteFontFileStream** fontFileStream
+ ) PURE;
+};
+
+/// <summary>
+/// A built-in implementation of IDWriteFontFileLoader interface that operates on local font files
+/// and exposes local font file information from the font file reference key.
+/// Font file references created using CreateFontFileReference use this font file loader.
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("b2d9f3ec-c9fe-4a11-a2ec-d86208f7c0a2") IDWriteLocalFontFileLoader : public IDWriteFontFileLoader
+{
+ /// <summary>
+ /// Obtains the length of the absolute file path from the font file reference key.
+ /// </summary>
+ /// <param name="fontFileReferenceKey">Font file reference key that uniquely identifies the local font file
+ /// within the scope of the font loader being used.</param>
+ /// <param name="fontFileReferenceKeySize">Size of font file reference key in bytes.</param>
+ /// <param name="filePathLength">Length of the file path string not including the terminated NULL character.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetFilePathLengthFromKey)(
+ __in_bcount(fontFileReferenceKeySize) void const* fontFileReferenceKey,
+ UINT32 fontFileReferenceKeySize,
+ __out UINT32* filePathLength
+ ) PURE;
+
+ /// <summary>
+ /// Obtains the absolute font file path from the font file reference key.
+ /// </summary>
+ /// <param name="fontFileReferenceKey">Font file reference key that uniquely identifies the local font file
+ /// within the scope of the font loader being used.</param>
+ /// <param name="fontFileReferenceKeySize">Size of font file reference key in bytes.</param>
+ /// <param name="filePath">Character array that receives the local file path.</param>
+ /// <param name="filePathSize">Size of the filePath array in character count including the terminated NULL character.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetFilePathFromKey)(
+ __in_bcount(fontFileReferenceKeySize) void const* fontFileReferenceKey,
+ UINT32 fontFileReferenceKeySize,
+ __out_ecount_z(filePathSize) WCHAR* filePath,
+ UINT32 filePathSize
+ ) PURE;
+
+ /// <summary>
+ /// Obtains the last write time of the file from the font file reference key.
+ /// </summary>
+ /// <param name="fontFileReferenceKey">Font file reference key that uniquely identifies the local font file
+ /// within the scope of the font loader being used.</param>
+ /// <param name="fontFileReferenceKeySize">Size of font file reference key in bytes.</param>
+ /// <param name="lastWriteTime">Last modified time of the font file.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetLastWriteTimeFromKey)(
+ __in_bcount(fontFileReferenceKeySize) void const* fontFileReferenceKey,
+ UINT32 fontFileReferenceKeySize,
+ __out FILETIME* lastWriteTime
+ ) PURE;
+};
+
+/// <summary>
+/// The interface for loading font file data.
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("6d4865fe-0ab8-4d91-8f62-5dd6be34a3e0") IDWriteFontFileStream : public IUnknown
+{
+ /// <summary>
+ /// Reads a fragment from a file.
+ /// </summary>
+ /// <param name="fragmentStart">Receives the pointer to the start of the font file fragment.</param>
+ /// <param name="fileOffset">Offset of the fragment from the beginning of the font file.</param>
+ /// <param name="fragmentSize">Size of the fragment in bytes.</param>
+ /// <param name="fragmentContext">The client defined context to be passed to the ReleaseFileFragment.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ /// <remarks>
+ /// IMPORTANT: ReadFileFragment() implementations must check whether the requested file fragment
+ /// is within the file bounds. Otherwise, an error should be returned from ReadFileFragment.
+ /// </remarks>
+ STDMETHOD(ReadFileFragment)(
+ __deref_out_bcount(fragmentSize) void const** fragmentStart,
+ UINT64 fileOffset,
+ UINT64 fragmentSize,
+ __out void** fragmentContext
+ ) PURE;
+
+ /// <summary>
+ /// Releases a fragment from a file.
+ /// </summary>
+ /// <param name="fragmentContext">The client defined context of a font fragment returned from ReadFileFragment.</param>
+ STDMETHOD_(void, ReleaseFileFragment)(
+ void* fragmentContext
+ ) PURE;
+
+ /// <summary>
+ /// Obtains the total size of a file.
+ /// </summary>
+ /// <param name="fileSize">Receives the total size of the file.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ /// <remarks>
+ /// Implementing GetFileSize() for asynchronously loaded font files may require
+ /// downloading the complete file contents, therefore this method should only be used for operations that
+ /// either require complete font file to be loaded (e.g., copying a font file) or need to make
+ /// decisions based on the value of the file size (e.g., validation against a persisted file size).
+ /// </remarks>
+ STDMETHOD(GetFileSize)(
+ __out UINT64* fileSize
+ ) PURE;
+
+ /// <summary>
+ /// Obtains the last modified time of the file. The last modified time is used by DirectWrite font selection algorithms
+ /// to determine whether one font resource is more up to date than another one.
+ /// </summary>
+ /// <param name="lastWriteTime">Receives the last modifed time of the file in the format that represents
+ /// the number of 100-nanosecond intervals since January 1, 1601 (UTC).</param>
+ /// <returns>
+ /// Standard HRESULT error code. For resources that don't have a concept of the last modified time, the implementation of
+ /// GetLastWriteTime should return E_NOTIMPL.
+ /// </returns>
+ STDMETHOD(GetLastWriteTime)(
+ __out UINT64* lastWriteTime
+ ) PURE;
+};
+
+/// <summary>
+/// The interface that represents a reference to a font file.
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("739d886a-cef5-47dc-8769-1a8b41bebbb0") IDWriteFontFile : public IUnknown
+{
+ /// <summary>
+ /// This method obtains the pointer to the reference key of a font file. The pointer is only valid until the object that refers to it is released.
+ /// </summary>
+ /// <param name="fontFileReferenceKey">Pointer to the font file reference key.
+ /// IMPORTANT: The pointer value is valid until the font file reference object it is obtained from is released.</param>
+ /// <param name="fontFileReferenceKeySize">Size of font file reference key in bytes.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetReferenceKey)(
+ __deref_out_bcount(*fontFileReferenceKeySize) void const** fontFileReferenceKey,
+ __out UINT32* fontFileReferenceKeySize
+ ) PURE;
+
+ /// <summary>
+ /// Obtains the file loader associated with a font file object.
+ /// </summary>
+ /// <param name="fontFileLoader">The font file loader associated with the font file object.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetLoader)(
+ __out IDWriteFontFileLoader** fontFileLoader
+ ) PURE;
+
+ /// <summary>
+ /// Analyzes a file and returns whether it represents a font, and whether the font type is supported by the font system.
+ /// </summary>
+ /// <param name="isSupportedFontType">TRUE if the font type is supported by the font system, FALSE otherwise.</param>
+ /// <param name="fontFileType">The type of the font file. Note that even if isSupportedFontType is FALSE,
+ /// the fontFileType value may be different from DWRITE_FONT_FILE_TYPE_UNKNOWN.</param>
+ /// <param name="fontFaceType">The type of the font face that can be constructed from the font file.
+ /// Note that even if isSupportedFontType is FALSE, the fontFaceType value may be different from
+ /// DWRITE_FONT_FACE_TYPE_UNKNOWN.</param>
+ /// <param name="numberOfFaces">Number of font faces contained in the font file.</param>
+ /// <returns>
+ /// Standard HRESULT error code if there was a processing error during analysis.
+ /// </returns>
+ /// <remarks>
+ /// IMPORTANT: certain font file types are recognized, but not supported by the font system.
+ /// For example, the font system will recognize a file as a Type 1 font file,
+ /// but will not be able to construct a font face object from it. In such situations, Analyze will set
+ /// isSupportedFontType output parameter to FALSE.
+ /// </remarks>
+ STDMETHOD(Analyze)(
+ __out BOOL* isSupportedFontType,
+ __out DWRITE_FONT_FILE_TYPE* fontFileType,
+ __out_opt DWRITE_FONT_FACE_TYPE* fontFaceType,
+ __out UINT32* numberOfFaces
+ ) PURE;
+};
+
+/// <summary>
+/// Represents the internal structure of a device pixel (i.e., the physical arrangement of red,
+/// green, and blue color components) that is assumed for purposes of rendering text.
+/// </summary>
+#ifndef DWRITE_PIXEL_GEOMETRY_DEFINED
+enum DWRITE_PIXEL_GEOMETRY
+{
+ /// <summary>
+ /// The red, green, and blue color components of each pixel are assumed to occupy the same point.
+ /// </summary>
+ DWRITE_PIXEL_GEOMETRY_FLAT,
+
+ /// <summary>
+ /// Each pixel comprises three vertical stripes, with red on the left, green in the center, and
+ /// blue on the right. This is the most common pixel geometry for LCD monitors.
+ /// </summary>
+ DWRITE_PIXEL_GEOMETRY_RGB,
+
+ /// <summary>
+ /// Each pixel comprises three vertical stripes, with blue on the left, green in the center, and
+ /// red on the right.
+ /// </summary>
+ DWRITE_PIXEL_GEOMETRY_BGR
+};
+#define DWRITE_PIXEL_GEOMETRY_DEFINED
+#endif
+
+/// <summary>
+/// Represents a method of rendering glyphs.
+/// </summary>
+enum DWRITE_RENDERING_MODE
+{
+ /// <summary>
+ /// Specifies that the rendering mode is determined automatically based on the font and size.
+ /// </summary>
+ DWRITE_RENDERING_MODE_DEFAULT,
+
+ /// <summary>
+ /// Specifies that no anti-aliasing is performed. Each pixel is either set to the foreground
+ /// color of the text or retains the color of the background.
+ /// </summary>
+ DWRITE_RENDERING_MODE_ALIASED,
+
+ /// <summary>
+ /// Specifies ClearType rendering with the same metrics as aliased text. Glyphs can only
+ /// be positioned on whole-pixel boundaries.
+ /// </summary>
+ DWRITE_RENDERING_MODE_CLEARTYPE_GDI_CLASSIC,
+
+ /// <summary>
+ /// Specifies ClearType rendering with the same metrics as text rendering using GDI using a font
+ /// created with CLEARTYPE_NATURAL_QUALITY. Glyph metrics are closer to their ideal values than
+ /// with aliased text, but glyphs are still positioned on whole-pixel boundaries.
+ /// </summary>
+ DWRITE_RENDERING_MODE_CLEARTYPE_GDI_NATURAL,
+
+ /// <summary>
+ /// Specifies ClearType rendering with anti-aliasing in the horizontal dimension only. This is
+ /// typically used with small to medium font sizes (up to 16 ppem).
+ /// </summary>
+ DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL,
+
+ /// <summary>
+ /// Specifies ClearType rendering with anti-aliasing in both horizontal and vertical dimensions.
+ /// This is typically used at larger sizes to makes curves and diagonal lines look smoother, at
+ /// the expense of some softness.
+ /// </summary>
+ DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL_SYMMETRIC,
+
+ /// <summary>
+ /// Specifies that rendering should bypass the rasterizer and use the outlines directly. This is
+ /// typically used at very large sizes.
+ /// </summary>
+ DWRITE_RENDERING_MODE_OUTLINE
+};
+
+/// <summary>
+/// The DWRITE_MATRIX structure specifies the graphics transform to be applied
+/// to rendered glyphs.
+/// </summary>
+struct DWRITE_MATRIX
+{
+ /// <summary>
+ /// Horizontal scaling / cosine of rotation
+ /// </summary>
+ FLOAT m11;
+
+ /// <summary>
+ /// Vertical shear / sine of rotation
+ /// </summary>
+ FLOAT m12;
+
+ /// <summary>
+ /// Horizontal shear / negative sine of rotation
+ /// </summary>
+ FLOAT m21;
+
+ /// <summary>
+ /// Vertical scaling / cosine of rotation
+ /// </summary>
+ FLOAT m22;
+
+ /// <summary>
+ /// Horizontal shift (always orthogonal regardless of rotation)
+ /// </summary>
+ FLOAT dx;
+
+ /// <summary>
+ /// Vertical shift (always orthogonal regardless of rotation)
+ /// </summary>
+ FLOAT dy;
+};
+
+/// <summary>
+/// The interface that represents text rendering settings for glyph rasterization and filtering.
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("2f0da53a-2add-47cd-82ee-d9ec34688e75") IDWriteRenderingParams : public IUnknown
+{
+ /// <summary>
+ /// Gets the gamma value used for gamma correction. Valid values must be
+ /// greater than zero and cannot exceed 256.
+ /// </summary>
+ STDMETHOD_(FLOAT, GetGamma)() PURE;
+
+ /// <summary>
+ /// Gets the amount of contrast enhancement. Valid values are greater than
+ /// or equal to zero.
+ /// </summary>
+ STDMETHOD_(FLOAT, GetEnhancedContrast)() PURE;
+
+ /// <summary>
+ /// Gets the ClearType level. Valid values range from 0.0f (no ClearType)
+ /// to 1.0f (full ClearType).
+ /// </summary>
+ STDMETHOD_(FLOAT, GetClearTypeLevel)() PURE;
+
+ /// <summary>
+ /// Gets the pixel geometry.
+ /// </summary>
+ STDMETHOD_(DWRITE_PIXEL_GEOMETRY, GetPixelGeometry)() PURE;
+
+ /// <summary>
+ /// Gets the rendering mode.
+ /// </summary>
+ STDMETHOD_(DWRITE_RENDERING_MODE, GetRenderingMode)() PURE;
+};
+
+// Forward declarations of D2D types
+interface ID2D1SimplifiedGeometrySink;
+
+typedef ID2D1SimplifiedGeometrySink IDWriteGeometrySink;
+
+/// <summary>
+/// The interface that represents an absolute reference to a font face.
+/// It contains font face type, appropriate file references and face identification data.
+/// Various font data such as metrics, names and glyph outlines is obtained from IDWriteFontFace.
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("5f49804d-7024-4d43-bfa9-d25984f53849") IDWriteFontFace : public IUnknown
+{
+ /// <summary>
+ /// Obtains the file format type of a font face.
+ /// </summary>
+ STDMETHOD_(DWRITE_FONT_FACE_TYPE, GetType)() PURE;
+
+ /// <summary>
+ /// Obtains the font files representing a font face.
+ /// </summary>
+ /// <param name="numberOfFiles">The number of files representing the font face.</param>
+ /// <param name="fontFiles">User provided array that stores pointers to font files representing the font face.
+ /// This parameter can be NULL if the user is only interested in the number of files representing the font face.
+ /// This API increments reference count of the font file pointers returned according to COM conventions, and the client
+ /// should release them when finished.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetFiles)(
+ __inout UINT32* numberOfFiles,
+ __out_ecount_opt(*numberOfFiles) IDWriteFontFile** fontFiles
+ ) PURE;
+
+ /// <summary>
+ /// Obtains the zero-based index of the font face in its font file or files. If the font files contain a single face,
+ /// the return value is zero.
+ /// </summary>
+ STDMETHOD_(UINT32, GetIndex)() PURE;
+
+ /// <summary>
+ /// Obtains the algorithmic style simulation flags of a font face.
+ /// </summary>
+ STDMETHOD_(DWRITE_FONT_SIMULATIONS, GetSimulations)() PURE;
+
+ /// <summary>
+ /// Determines whether the font is a symbol font.
+ /// </summary>
+ STDMETHOD_(BOOL, IsSymbolFont)() PURE;
+
+ /// <summary>
+ /// Obtains design units and common metrics for the font face.
+ /// These metrics are applicable to all the glyphs within a fontface and are used by applications for layout calculations.
+ /// </summary>
+ /// <param name="fontFaceMetrics">Points to a DWRITE_FONT_METRICS structure to fill in.
+ /// The metrics returned by this function are in font design units.</param>
+ STDMETHOD_(void, GetMetrics)(
+ __out DWRITE_FONT_METRICS* fontFaceMetrics
+ ) PURE;
+
+ /// <summary>
+ /// Obtains the number of glyphs in the font face.
+ /// </summary>
+ STDMETHOD_(UINT16, GetGlyphCount)() PURE;
+
+ /// <summary>
+ /// Obtains ideal glyph metrics in font design units. Design glyphs metrics are used for glyph positioning.
+ /// </summary>
+ /// <param name="glyphIndices">An array of glyph indices to compute the metrics for.</param>
+ /// <param name="glyphCount">The number of elements in the glyphIndices array.</param>
+ /// <param name="glyphMetrics">Array of DWRITE_GLYPH_METRICS structures filled by this function.
+ /// The metrics returned by this function are in font design units.</param>
+ /// <param name="isSideways">Indicates whether the font is being used in a sideways run.
+ /// This can affect the glyph metrics if the font has oblique simulation
+ /// because sideways oblique simulation differs from non-sideways oblique simulation.</param>
+ /// <returns>
+ /// Standard HRESULT error code. If any of the input glyph indices are outside of the valid glyph index range
+ /// for the current font face, E_INVALIDARG will be returned.
+ /// </returns>
+ STDMETHOD(GetDesignGlyphMetrics)(
+ __in_ecount(glyphCount) UINT16 const* glyphIndices,
+ UINT32 glyphCount,
+ __out_ecount(glyphCount) DWRITE_GLYPH_METRICS* glyphMetrics,
+ BOOL isSideways = FALSE
+ ) PURE;
+
+ /// <summary>
+ /// Returns the nominal mapping of UCS4 Unicode code points to glyph indices as defined by the font 'CMAP' table.
+ /// Note that this mapping is primarily provided for line layout engines built on top of the physical font API.
+ /// Because of OpenType glyph substitution and line layout character substitution, the nominal conversion does not always correspond
+ /// to how a Unicode string will map to glyph indices when rendering using a particular font face.
+ /// Also, note that Unicode Variant Selectors provide for alternate mappings for character to glyph.
+ /// This call will always return the default variant.
+ /// </summary>
+ /// <param name="codePoints">An array of USC4 code points to obtain nominal glyph indices from.</param>
+ /// <param name="codePointCount">The number of elements in the codePoints array.</param>
+ /// <param name="glyphIndices">Array of nominal glyph indices filled by this function.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetGlyphIndices)(
+ __in_ecount(codePointCount) UINT32 const* codePoints,
+ UINT32 codePointCount,
+ __out_ecount(codePointCount) UINT16* glyphIndices
+ ) PURE;
+
+ /// <summary>
+ /// Finds the specified OpenType font table if it exists and returns a pointer to it.
+ /// The function accesses the underling font data via the IDWriteFontStream interface
+ /// implemented by the font file loader.
+ /// </summary>
+ /// <param name="openTypeTableTag">Four character tag of table to find.
+ /// Use the DWRITE_MAKE_OPENTYPE_TAG() macro to create it.
+ /// Unlike GDI, it does not support the special TTCF and null tags to access the whole font.</param>
+ /// <param name="tableData">
+ /// Pointer to base of table in memory.
+ /// The pointer is only valid so long as the FontFace used to get the font table still exists
+ /// (not any other FontFace, even if it actually refers to the same physical font).
+ /// </param>
+ /// <param name="tableSize">Byte size of table.</param>
+ /// <param name="tableContext">
+ /// Opaque context which must be freed by calling ReleaseFontTable.
+ /// The context actually comes from the lower level IDWriteFontFileStream,
+ /// which may be implemented by the application or DWrite itself.
+ /// It is possible for a NULL tableContext to be returned, especially if
+ /// the implementation directly memory maps the whole file.
+ /// Nevertheless, always release it later, and do not use it as a test for function success.
+ /// The same table can be queried multiple times,
+ /// but each returned context can be different, so release each separately.
+ /// </param>
+ /// <param name="exists">True if table exists.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// If a table can not be found, the function will not return an error, but the size will be 0, table NULL, and exists = FALSE.
+ /// The context does not need to be freed if the table was not found.
+ /// </returns>
+ /// <remarks>
+ /// The context for the same tag may be different for each call,
+ /// so each one must be held and released separately.
+ /// </remarks>
+ STDMETHOD(TryGetFontTable)(
+ __in UINT32 openTypeTableTag,
+ __deref_out_bcount(*tableSize) const void** tableData,
+ __out UINT32* tableSize,
+ __out void** tableContext,
+ __out BOOL* exists
+ ) PURE;
+
+ /// <summary>
+ /// Releases the table obtained earlier from TryGetFontTable.
+ /// </summary>
+ /// <param name="tableContext">Opaque context from TryGetFontTable.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD_(void, ReleaseFontTable)(
+ __in void* tableContext
+ ) PURE;
+
+ /// <summary>
+ /// Computes the outline of a run of glyphs by calling back to the outline sink interface.
+ /// </summary>
+ /// <param name="emSize">Logical size of the font in DIP units. A DIP ("device-independent pixel") equals 1/96 inch.</param>
+ /// <param name="glyphIndices">Array of glyph indices.</param>
+ /// <param name="glyphAdvances">Optional array of glyph advances in DIPs.</param>
+ /// <param name="glyphOffsets">Optional array of glyph offsets.</param>
+ /// <param name="glyphCount">Number of glyphs.</param>
+ /// <param name="isSideways">If true, specifies that glyphs are rotated 90 degrees to the left and vertical metrics are used.
+ /// A client can render a vertical run by specifying isSideways = true and rotating the resulting geometry 90 degrees to the
+ /// right using a transform. The isSideways and isRightToLeft parameters cannot both be true.</param>
+ /// <param name="isRightToLeft">If true, specifies that the advance direction is right to left. By default, the advance direction
+ /// is left to right.</param>
+ /// <param name="geometrySink">Interface the function calls back to draw each element of the geometry.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetGlyphRunOutline)(
+ FLOAT emSize,
+ __in_ecount(glyphCount) UINT16 const* glyphIndices,
+ __in_ecount_opt(glyphCount) FLOAT const* glyphAdvances,
+ __in_ecount_opt(glyphCount) DWRITE_GLYPH_OFFSET const* glyphOffsets,
+ UINT32 glyphCount,
+ BOOL isSideways,
+ BOOL isRightToLeft,
+ IDWriteGeometrySink* geometrySink
+ ) PURE;
+
+ /// <summary>
+ /// Determines the recommended rendering mode for the font given the specified size and rendering parameters.
+ /// </summary>
+ /// <param name="emSize">Logical size of the font in DIP units. A DIP ("device-independent pixel") equals 1/96 inch.</param>
+ /// <param name="pixelsPerDip">Number of physical pixels per DIP. For example, if the DPI of the rendering surface is 96 this
+ /// value is 1.0f. If the DPI is 120, this value is 120.0f/96.</param>
+ /// <param name="measuringMode">Specifies measuring method that will be used for glyphs in the font.
+ /// Renderer implementations may choose different rendering modes for given measuring methods, but
+ /// best results are seen when the corresponding modes match:
+ /// DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL for DWRITE_MEASURING_MODE_NATURAL
+ /// DWRITE_RENDERING_MODE_CLEARTYPE_GDI_CLASSIC for DWRITE_MEASURING_MODE_GDI_CLASSIC
+ /// DWRITE_RENDERING_MODE_CLEARTYPE_GDI_NATURAL for DWRITE_MEASURING_MODE_GDI_NATURAL
+ /// </param>
+ /// <param name="renderingParams">Rendering parameters object. This parameter is necessary in case the rendering parameters
+ /// object overrides the rendering mode.</param>
+ /// <param name="renderingMode">Receives the recommended rendering mode to use.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetRecommendedRenderingMode)(
+ FLOAT emSize,
+ FLOAT pixelsPerDip,
+ DWRITE_MEASURING_MODE measuringMode,
+ IDWriteRenderingParams* renderingParams,
+ __out DWRITE_RENDERING_MODE* renderingMode
+ ) PURE;
+
+ /// <summary>
+ /// Obtains design units and common metrics for the font face.
+ /// These metrics are applicable to all the glyphs within a fontface and are used by applications for layout calculations.
+ /// </summary>
+ /// <param name="emSize">Logical size of the font in DIP units. A DIP ("device-independent pixel") equals 1/96 inch.</param>
+ /// <param name="pixelsPerDip">Number of physical pixels per DIP. For example, if the DPI of the rendering surface is 96 this
+ /// value is 1.0f. If the DPI is 120, this value is 120.0f/96.</param>
+ /// <param name="transform">Optional transform applied to the glyphs and their positions. This transform is applied after the
+ /// scaling specified by the font size and pixelsPerDip.</param>
+ /// <param name="fontFaceMetrics">Points to a DWRITE_FONT_METRICS structure to fill in.
+ /// The metrics returned by this function are in font design units.</param>
+ STDMETHOD(GetGdiCompatibleMetrics)(
+ FLOAT emSize,
+ FLOAT pixelsPerDip,
+ __in_opt DWRITE_MATRIX const* transform,
+ __out DWRITE_FONT_METRICS* fontFaceMetrics
+ ) PURE;
+
+
+ /// <summary>
+ /// Obtains glyph metrics in font design units with the return values compatible with what GDI would produce.
+ /// Glyphs metrics are used for positioning of individual glyphs.
+ /// </summary>
+ /// <param name="emSize">Logical size of the font in DIP units. A DIP ("device-independent pixel") equals 1/96 inch.</param>
+ /// <param name="pixelsPerDip">Number of physical pixels per DIP. For example, if the DPI of the rendering surface is 96 this
+ /// value is 1.0f. If the DPI is 120, this value is 120.0f/96.</param>
+ /// <param name="transform">Optional transform applied to the glyphs and their positions. This transform is applied after the
+ /// scaling specified by the font size and pixelsPerDip.</param>
+ /// <param name="useGdiNatural">
+ /// When set to FALSE, the metrics are the same as the metrics of GDI aliased text.
+ /// When set to TRUE, the metrics are the same as the metrics of text measured by GDI using a font
+ /// created with CLEARTYPE_NATURAL_QUALITY.
+ /// </param>
+ /// <param name="glyphIndices">An array of glyph indices to compute the metrics for.</param>
+ /// <param name="glyphCount">The number of elements in the glyphIndices array.</param>
+ /// <param name="glyphMetrics">Array of DWRITE_GLYPH_METRICS structures filled by this function.
+ /// The metrics returned by this function are in font design units.</param>
+ /// <param name="isSideways">Indicates whether the font is being used in a sideways run.
+ /// This can affect the glyph metrics if the font has oblique simulation
+ /// because sideways oblique simulation differs from non-sideways oblique simulation.</param>
+ /// <returns>
+ /// Standard HRESULT error code. If any of the input glyph indices are outside of the valid glyph index range
+ /// for the current font face, E_INVALIDARG will be returned.
+ /// </returns>
+ STDMETHOD(GetGdiCompatibleGlyphMetrics)(
+ FLOAT emSize,
+ FLOAT pixelsPerDip,
+ __in_opt DWRITE_MATRIX const* transform,
+ BOOL useGdiNatural,
+ __in_ecount(glyphCount) UINT16 const* glyphIndices,
+ UINT32 glyphCount,
+ __out_ecount(glyphCount) DWRITE_GLYPH_METRICS* glyphMetrics,
+ BOOL isSideways = FALSE
+ ) PURE;
+};
+
+interface IDWriteFactory;
+interface IDWriteFontFileEnumerator;
+
+/// <summary>
+/// The font collection loader interface is used to construct a collection of fonts given a particular type of key.
+/// The font collection loader interface is recommended to be implemented by a singleton object.
+/// IMPORTANT: font collection loader implementations must not register themselves with a DirectWrite factory
+/// inside their constructors and must not unregister themselves in their destructors, because
+/// registration and unregistraton operations increment and decrement the object reference count respectively.
+/// Instead, registration and unregistration of font file loaders with DirectWrite factory should be performed
+/// outside of the font file loader implementation as a separate step.
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("cca920e4-52f0-492b-bfa8-29c72ee0a468") IDWriteFontCollectionLoader : public IUnknown
+{
+ /// <summary>
+ /// Creates a font file enumerator object that encapsulates a collection of font files.
+ /// The font system calls back to this interface to create a font collection.
+ /// </summary>
+ /// <param name="factory">Factory associated with the loader.</param>
+ /// <param name="collectionKey">Font collection key that uniquely identifies the collection of font files within
+ /// the scope of the font collection loader being used.</param>
+ /// <param name="collectionKeySize">Size of the font collection key in bytes.</param>
+ /// <param name="fontFileEnumerator">Pointer to the newly created font file enumerator.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(CreateEnumeratorFromKey)(
+ IDWriteFactory* factory,
+ __in_bcount(collectionKeySize) void const* collectionKey,
+ UINT32 collectionKeySize,
+ __out IDWriteFontFileEnumerator** fontFileEnumerator
+ ) PURE;
+};
+
+/// <summary>
+/// The font file enumerator interface encapsulates a collection of font files. The font system uses this interface
+/// to enumerate font files when building a font collection.
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("72755049-5ff7-435d-8348-4be97cfa6c7c") IDWriteFontFileEnumerator : public IUnknown
+{
+ /// <summary>
+ /// Advances to the next font file in the collection. When it is first created, the enumerator is positioned
+ /// before the first element of the collection and the first call to MoveNext advances to the first file.
+ /// </summary>
+ /// <param name="hasCurrentFile">Receives the value TRUE if the enumerator advances to a file, or FALSE if
+ /// the enumerator advanced past the last file in the collection.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(MoveNext)(
+ __out BOOL* hasCurrentFile
+ ) PURE;
+
+ /// <summary>
+ /// Gets a reference to the current font file.
+ /// </summary>
+ /// <param name="fontFile">Pointer to the newly created font file object.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetCurrentFontFile)(
+ __out IDWriteFontFile** fontFile
+ ) PURE;
+};
+
+/// <summary>
+/// Represents a collection of strings indexed by locale name.
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("08256209-099a-4b34-b86d-c22b110e7771") IDWriteLocalizedStrings : public IUnknown
+{
+ /// <summary>
+ /// Gets the number of language/string pairs.
+ /// </summary>
+ STDMETHOD_(UINT32, GetCount)() PURE;
+
+ /// <summary>
+ /// Gets the index of the item with the specified locale name.
+ /// </summary>
+ /// <param name="localeName">Locale name to look for.</param>
+ /// <param name="index">Receives the zero-based index of the locale name/string pair.</param>
+ /// <param name="exists">Receives TRUE if the locale name exists or FALSE if not.</param>
+ /// <returns>
+ /// Standard HRESULT error code. If the specified locale name does not exist, the return value is S_OK,
+ /// but *index is UINT_MAX and *exists is FALSE.
+ /// </returns>
+ STDMETHOD(FindLocaleName)(
+ __in_z WCHAR const* localeName,
+ __out UINT32* index,
+ __out BOOL* exists
+ ) PURE;
+
+ /// <summary>
+ /// Gets the length in characters (not including the null terminator) of the locale name with the specified index.
+ /// </summary>
+ /// <param name="index">Zero-based index of the locale name.</param>
+ /// <param name="length">Receives the length in characters, not including the null terminator.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetLocaleNameLength)(
+ UINT32 index,
+ __out UINT32* length
+ ) PURE;
+
+ /// <summary>
+ /// Copies the locale name with the specified index to the specified array.
+ /// </summary>
+ /// <param name="index">Zero-based index of the locale name.</param>
+ /// <param name="localeName">Character array that receives the locale name.</param>
+ /// <param name="size">Size of the array in characters. The size must include space for the terminating
+ /// null character.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetLocaleName)(
+ UINT32 index,
+ __out_ecount_z(size) WCHAR* localeName,
+ UINT32 size
+ ) PURE;
+
+ /// <summary>
+ /// Gets the length in characters (not including the null terminator) of the string with the specified index.
+ /// </summary>
+ /// <param name="index">Zero-based index of the string.</param>
+ /// <param name="length">Receives the length in characters, not including the null terminator.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetStringLength)(
+ UINT32 index,
+ __out UINT32* length
+ ) PURE;
+
+ /// <summary>
+ /// Copies the string with the specified index to the specified array.
+ /// </summary>
+ /// <param name="index">Zero-based index of the string.</param>
+ /// <param name="stringBuffer">Character array that receives the string.</param>
+ /// <param name="size">Size of the array in characters. The size must include space for the terminating
+ /// null character.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetString)(
+ UINT32 index,
+ __out_ecount_z(size) WCHAR* stringBuffer,
+ UINT32 size
+ ) PURE;
+};
+
+interface IDWriteFontFamily;
+interface IDWriteFont;
+
+/// <summary>
+/// The IDWriteFontCollection encapsulates a collection of fonts.
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("a84cee02-3eea-4eee-a827-87c1a02a0fcc") IDWriteFontCollection : public IUnknown
+{
+ /// <summary>
+ /// Gets the number of font families in the collection.
+ /// </summary>
+ STDMETHOD_(UINT32, GetFontFamilyCount)() PURE;
+
+ /// <summary>
+ /// Creates a font family object given a zero-based font family index.
+ /// </summary>
+ /// <param name="index">Zero-based index of the font family.</param>
+ /// <param name="fontFamily">Receives a pointer the newly created font family object.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetFontFamily)(
+ UINT32 index,
+ __out IDWriteFontFamily** fontFamily
+ ) PURE;
+
+ /// <summary>
+ /// Finds the font family with the specified family name.
+ /// </summary>
+ /// <param name="familyName">Name of the font family. The name is not case-sensitive but must otherwise exactly match a family name in the collection.</param>
+ /// <param name="index">Receives the zero-based index of the matching font family if the family name was found or UINT_MAX otherwise.</param>
+ /// <param name="exists">Receives TRUE if the family name exists or FALSE otherwise.</param>
+ /// <returns>
+ /// Standard HRESULT error code. If the specified family name does not exist, the return value is S_OK, but *index is UINT_MAX and *exists is FALSE.
+ /// </returns>
+ STDMETHOD(FindFamilyName)(
+ __in_z WCHAR const* familyName,
+ __out UINT32* index,
+ __out BOOL* exists
+ ) PURE;
+
+ /// <summary>
+ /// Gets the font object that corresponds to the same physical font as the specified font face object. The specified physical font must belong
+ /// to the font collection.
+ /// </summary>
+ /// <param name="fontFace">Font face object that specifies the physical font.</param>
+ /// <param name="font">Receives a pointer to the newly created font object if successful or NULL otherwise.</param>
+ /// <returns>
+ /// Standard HRESULT error code. If the specified physical font is not part of the font collection the return value is DWRITE_E_NOFONT.
+ /// </returns>
+ STDMETHOD(GetFontFromFontFace)(
+ IDWriteFontFace* fontFace,
+ __out IDWriteFont** font
+ ) PURE;
+};
+
+/// <summary>
+/// The IDWriteFontList interface represents a list of fonts.
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("1a0d8438-1d97-4ec1-aef9-a2fb86ed6acb") IDWriteFontList : public IUnknown
+{
+ /// <summary>
+ /// Gets the font collection that contains the fonts.
+ /// </summary>
+ /// <param name="fontCollection">Receives a pointer to the font collection object.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetFontCollection)(
+ __out IDWriteFontCollection** fontCollection
+ ) PURE;
+
+ /// <summary>
+ /// Gets the number of fonts in the font list.
+ /// </summary>
+ STDMETHOD_(UINT32, GetFontCount)() PURE;
+
+ /// <summary>
+ /// Gets a font given its zero-based index.
+ /// </summary>
+ /// <param name="index">Zero-based index of the font in the font list.</param>
+ /// <param name="font">Receives a pointer to the newly created font object.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetFont)(
+ UINT32 index,
+ __out IDWriteFont** font
+ ) PURE;
+};
+
+/// <summary>
+/// The IDWriteFontFamily interface represents a set of fonts that share the same design but are differentiated
+/// by weight, stretch, and style.
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("da20d8ef-812a-4c43-9802-62ec4abd7add") IDWriteFontFamily : public IDWriteFontList
+{
+ /// <summary>
+ /// Creates an localized strings object that contains the family names for the font family, indexed by locale name.
+ /// </summary>
+ /// <param name="names">Receives a pointer to the newly created localized strings object.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetFamilyNames)(
+ __out IDWriteLocalizedStrings** names
+ ) PURE;
+
+ /// <summary>
+ /// Gets the font that best matches the specified properties.
+ /// </summary>
+ /// <param name="weight">Requested font weight.</param>
+ /// <param name="stretch">Requested font stretch.</param>
+ /// <param name="style">Requested font style.</param>
+ /// <param name="matchingFont">Receives a pointer to the newly created font object.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetFirstMatchingFont)(
+ DWRITE_FONT_WEIGHT weight,
+ DWRITE_FONT_STRETCH stretch,
+ DWRITE_FONT_STYLE style,
+ __out IDWriteFont** matchingFont
+ ) PURE;
+
+ /// <summary>
+ /// Gets a list of fonts in the font family ranked in order of how well they match the specified properties.
+ /// </summary>
+ /// <param name="weight">Requested font weight.</param>
+ /// <param name="stretch">Requested font stretch.</param>
+ /// <param name="style">Requested font style.</param>
+ /// <param name="matchingFonts">Receives a pointer to the newly created font list object.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetMatchingFonts)(
+ DWRITE_FONT_WEIGHT weight,
+ DWRITE_FONT_STRETCH stretch,
+ DWRITE_FONT_STYLE style,
+ __out IDWriteFontList** matchingFonts
+ ) PURE;
+};
+
+/// <summary>
+/// The IDWriteFont interface represents a physical font in a font collection.
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("acd16696-8c14-4f5d-877e-fe3fc1d32737") IDWriteFont : public IUnknown
+{
+ /// <summary>
+ /// Gets the font family to which the specified font belongs.
+ /// </summary>
+ /// <param name="fontFamily">Receives a pointer to the font family object.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetFontFamily)(
+ __out IDWriteFontFamily** fontFamily
+ ) PURE;
+
+ /// <summary>
+ /// Gets the weight of the specified font.
+ /// </summary>
+ STDMETHOD_(DWRITE_FONT_WEIGHT, GetWeight)() PURE;
+
+ /// <summary>
+ /// Gets the stretch (aka. width) of the specified font.
+ /// </summary>
+ STDMETHOD_(DWRITE_FONT_STRETCH, GetStretch)() PURE;
+
+ /// <summary>
+ /// Gets the style (aka. slope) of the specified font.
+ /// </summary>
+ STDMETHOD_(DWRITE_FONT_STYLE, GetStyle)() PURE;
+
+ /// <summary>
+ /// Returns TRUE if the font is a symbol font or FALSE if not.
+ /// </summary>
+ STDMETHOD_(BOOL, IsSymbolFont)() PURE;
+
+ /// <summary>
+ /// Gets a localized strings collection containing the face names for the font (e.g., Regular or Bold), indexed by locale name.
+ /// </summary>
+ /// <param name="names">Receives a pointer to the newly created localized strings object.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetFaceNames)(
+ __out IDWriteLocalizedStrings** names
+ ) PURE;
+
+ /// <summary>
+ /// Gets a localized strings collection containing the specified informational strings, indexed by locale name.
+ /// </summary>
+ /// <param name="informationalStringID">Identifies the string to get.</param>
+ /// <param name="informationalStrings">Receives a pointer to the newly created localized strings object.</param>
+ /// <param name="exists">Receives the value TRUE if the font contains the specified string ID or FALSE if not.</param>
+ /// <returns>
+ /// Standard HRESULT error code. If the font does not contain the specified string, the return value is S_OK but
+ /// informationalStrings receives a NULL pointer and exists receives the value FALSE.
+ /// </returns>
+ STDMETHOD(GetInformationalStrings)(
+ DWRITE_INFORMATIONAL_STRING_ID informationalStringID,
+ __out IDWriteLocalizedStrings** informationalStrings,
+ __out BOOL* exists
+ ) PURE;
+
+ /// <summary>
+ /// Gets a value that indicates what simulation are applied to the specified font.
+ /// </summary>
+ STDMETHOD_(DWRITE_FONT_SIMULATIONS, GetSimulations)() PURE;
+
+ /// <summary>
+ /// Gets the metrics for the font.
+ /// </summary>
+ /// <param name="fontMetrics">Receives the font metrics.</param>
+ STDMETHOD_(void, GetMetrics)(
+ __out DWRITE_FONT_METRICS* fontMetrics
+ ) PURE;
+
+ /// <summary>
+ /// Determines whether the font supports the specified character.
+ /// </summary>
+ /// <param name="unicodeValue">Unicode (UCS-4) character value.</param>
+ /// <param name="exists">Receives the value TRUE if the font supports the specified character or FALSE if not.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(HasCharacter)(
+ UINT32 unicodeValue,
+ __out BOOL* exists
+ ) PURE;
+
+ /// <summary>
+ /// Creates a font face object for the font.
+ /// </summary>
+ /// <param name="fontFace">Receives a pointer to the newly created font face object.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(CreateFontFace)(
+ __out IDWriteFontFace** fontFace
+ ) PURE;
+};
+
+/// <summary>
+/// Direction for how reading progresses.
+/// </summary>
+enum DWRITE_READING_DIRECTION
+{
+ /// <summary>
+ /// Reading progresses from left to right.
+ /// </summary>
+ DWRITE_READING_DIRECTION_LEFT_TO_RIGHT,
+
+ /// <summary>
+ /// Reading progresses from right to left.
+ /// </summary>
+ DWRITE_READING_DIRECTION_RIGHT_TO_LEFT
+};
+
+/// <summary>
+/// Direction for how lines of text are placed relative to one another.
+/// </summary>
+enum DWRITE_FLOW_DIRECTION
+{
+ /// <summary>
+ /// Text lines are placed from top to bottom.
+ /// </summary>
+ DWRITE_FLOW_DIRECTION_TOP_TO_BOTTOM
+};
+
+/// <summary>
+/// Alignment of paragraph text along the reading direction axis relative to
+/// the leading and trailing edge of the layout box.
+/// </summary>
+enum DWRITE_TEXT_ALIGNMENT
+{
+ /// <summary>
+ /// The leading edge of the paragraph text is aligned to the layout box's leading edge.
+ /// </summary>
+ DWRITE_TEXT_ALIGNMENT_LEADING,
+
+ /// <summary>
+ /// The trailing edge of the paragraph text is aligned to the layout box's trailing edge.
+ /// </summary>
+ DWRITE_TEXT_ALIGNMENT_TRAILING,
+
+ /// <summary>
+ /// The center of the paragraph text is aligned to the center of the layout box.
+ /// </summary>
+ DWRITE_TEXT_ALIGNMENT_CENTER
+};
+
+/// <summary>
+/// Alignment of paragraph text along the flow direction axis relative to the
+/// flow's beginning and ending edge of the layout box.
+/// </summary>
+enum DWRITE_PARAGRAPH_ALIGNMENT
+{
+ /// <summary>
+ /// The first line of paragraph is aligned to the flow's beginning edge of the layout box.
+ /// </summary>
+ DWRITE_PARAGRAPH_ALIGNMENT_NEAR,
+
+ /// <summary>
+ /// The last line of paragraph is aligned to the flow's ending edge of the layout box.
+ /// </summary>
+ DWRITE_PARAGRAPH_ALIGNMENT_FAR,
+
+ /// <summary>
+ /// The center of the paragraph is aligned to the center of the flow of the layout box.
+ /// </summary>
+ DWRITE_PARAGRAPH_ALIGNMENT_CENTER
+};
+
+/// <summary>
+/// Word wrapping in multiline paragraph.
+/// </summary>
+enum DWRITE_WORD_WRAPPING
+{
+ /// <summary>
+ /// Words are broken across lines to avoid text overflowing the layout box.
+ /// </summary>
+ DWRITE_WORD_WRAPPING_WRAP,
+
+ /// <summary>
+ /// Words are kept within the same line even when it overflows the layout box.
+ /// This option is often used with scrolling to reveal overflow text.
+ /// </summary>
+ DWRITE_WORD_WRAPPING_NO_WRAP
+};
+
+/// <summary>
+/// The method used for line spacing in layout.
+/// </summary>
+enum DWRITE_LINE_SPACING_METHOD
+{
+ /// <summary>
+ /// Line spacing depends solely on the content, growing to accomodate the size of fonts and inline objects.
+ /// </summary>
+ DWRITE_LINE_SPACING_METHOD_DEFAULT,
+
+ /// <summary>
+ /// Lines are explicitly set to uniform spacing, regardless of contained font sizes.
+ /// This can be useful to avoid the uneven appearance that can occur from font fallback.
+ /// </summary>
+ DWRITE_LINE_SPACING_METHOD_UNIFORM
+};
+
+/// <summary>
+/// Text granularity used to trim text overflowing the layout box.
+/// </summary>
+enum DWRITE_TRIMMING_GRANULARITY
+{
+ /// <summary>
+ /// No trimming occurs. Text flows beyond the layout width.
+ /// </summary>
+ DWRITE_TRIMMING_GRANULARITY_NONE,
+
+ /// <summary>
+ /// Trimming occurs at character cluster boundary.
+ /// </summary>
+ DWRITE_TRIMMING_GRANULARITY_CHARACTER,
+
+ /// <summary>
+ /// Trimming occurs at word boundary.
+ /// </summary>
+ DWRITE_TRIMMING_GRANULARITY_WORD
+};
+
+/// <summary>
+/// Typographic feature of text supplied by the font.
+/// </summary>
+enum DWRITE_FONT_FEATURE_TAG
+{
+ DWRITE_FONT_FEATURE_TAG_ALTERNATIVE_FRACTIONS = 0x63726661, // 'afrc'
+ DWRITE_FONT_FEATURE_TAG_PETITE_CAPITALS_FROM_CAPITALS = 0x63703263, // 'c2pc'
+ DWRITE_FONT_FEATURE_TAG_SMALL_CAPITALS_FROM_CAPITALS = 0x63733263, // 'c2sc'
+ DWRITE_FONT_FEATURE_TAG_CONTEXTUAL_ALTERNATES = 0x746c6163, // 'calt'
+ DWRITE_FONT_FEATURE_TAG_CASE_SENSITIVE_FORMS = 0x65736163, // 'case'
+ DWRITE_FONT_FEATURE_TAG_GLYPH_COMPOSITION_DECOMPOSITION = 0x706d6363, // 'ccmp'
+ DWRITE_FONT_FEATURE_TAG_CONTEXTUAL_LIGATURES = 0x67696c63, // 'clig'
+ DWRITE_FONT_FEATURE_TAG_CAPITAL_SPACING = 0x70737063, // 'cpsp'
+ DWRITE_FONT_FEATURE_TAG_CONTEXTUAL_SWASH = 0x68777363, // 'cswh'
+ DWRITE_FONT_FEATURE_TAG_CURSIVE_POSITIONING = 0x73727563, // 'curs'
+ DWRITE_FONT_FEATURE_TAG_DEFAULT = 0x746c6664, // 'dflt'
+ DWRITE_FONT_FEATURE_TAG_DISCRETIONARY_LIGATURES = 0x67696c64, // 'dlig'
+ DWRITE_FONT_FEATURE_TAG_EXPERT_FORMS = 0x74707865, // 'expt'
+ DWRITE_FONT_FEATURE_TAG_FRACTIONS = 0x63617266, // 'frac'
+ DWRITE_FONT_FEATURE_TAG_FULL_WIDTH = 0x64697766, // 'fwid'
+ DWRITE_FONT_FEATURE_TAG_HALF_FORMS = 0x666c6168, // 'half'
+ DWRITE_FONT_FEATURE_TAG_HALANT_FORMS = 0x6e6c6168, // 'haln'
+ DWRITE_FONT_FEATURE_TAG_ALTERNATE_HALF_WIDTH = 0x746c6168, // 'halt'
+ DWRITE_FONT_FEATURE_TAG_HISTORICAL_FORMS = 0x74736968, // 'hist'
+ DWRITE_FONT_FEATURE_TAG_HORIZONTAL_KANA_ALTERNATES = 0x616e6b68, // 'hkna'
+ DWRITE_FONT_FEATURE_TAG_HISTORICAL_LIGATURES = 0x67696c68, // 'hlig'
+ DWRITE_FONT_FEATURE_TAG_HALF_WIDTH = 0x64697768, // 'hwid'
+ DWRITE_FONT_FEATURE_TAG_HOJO_KANJI_FORMS = 0x6f6a6f68, // 'hojo'
+ DWRITE_FONT_FEATURE_TAG_JIS04_FORMS = 0x3430706a, // 'jp04'
+ DWRITE_FONT_FEATURE_TAG_JIS78_FORMS = 0x3837706a, // 'jp78'
+ DWRITE_FONT_FEATURE_TAG_JIS83_FORMS = 0x3338706a, // 'jp83'
+ DWRITE_FONT_FEATURE_TAG_JIS90_FORMS = 0x3039706a, // 'jp90'
+ DWRITE_FONT_FEATURE_TAG_KERNING = 0x6e72656b, // 'kern'
+ DWRITE_FONT_FEATURE_TAG_STANDARD_LIGATURES = 0x6167696c, // 'liga'
+ DWRITE_FONT_FEATURE_TAG_LINING_FIGURES = 0x6d756e6c, // 'lnum'
+ DWRITE_FONT_FEATURE_TAG_LOCALIZED_FORMS = 0x6c636f6c, // 'locl'
+ DWRITE_FONT_FEATURE_TAG_MARK_POSITIONING = 0x6b72616d, // 'mark'
+ DWRITE_FONT_FEATURE_TAG_MATHEMATICAL_GREEK = 0x6b72676d, // 'mgrk'
+ DWRITE_FONT_FEATURE_TAG_MARK_TO_MARK_POSITIONING = 0x6b6d6b6d, // 'mkmk'
+ DWRITE_FONT_FEATURE_TAG_ALTERNATE_ANNOTATION_FORMS = 0x746c616e, // 'nalt'
+ DWRITE_FONT_FEATURE_TAG_NLC_KANJI_FORMS = 0x6b636c6e, // 'nlck'
+ DWRITE_FONT_FEATURE_TAG_OLD_STYLE_FIGURES = 0x6d756e6f, // 'onum'
+ DWRITE_FONT_FEATURE_TAG_ORDINALS = 0x6e64726f, // 'ordn'
+ DWRITE_FONT_FEATURE_TAG_PROPORTIONAL_ALTERNATE_WIDTH = 0x746c6170, // 'palt'
+ DWRITE_FONT_FEATURE_TAG_PETITE_CAPITALS = 0x70616370, // 'pcap'
+ DWRITE_FONT_FEATURE_TAG_PROPORTIONAL_FIGURES = 0x6d756e70, // 'pnum'
+ DWRITE_FONT_FEATURE_TAG_PROPORTIONAL_WIDTHS = 0x64697770, // 'pwid'
+ DWRITE_FONT_FEATURE_TAG_QUARTER_WIDTHS = 0x64697771, // 'qwid'
+ DWRITE_FONT_FEATURE_TAG_REQUIRED_LIGATURES = 0x67696c72, // 'rlig'
+ DWRITE_FONT_FEATURE_TAG_RUBY_NOTATION_FORMS = 0x79627572, // 'ruby'
+ DWRITE_FONT_FEATURE_TAG_STYLISTIC_ALTERNATES = 0x746c6173, // 'salt'
+ DWRITE_FONT_FEATURE_TAG_SCIENTIFIC_INFERIORS = 0x666e6973, // 'sinf'
+ DWRITE_FONT_FEATURE_TAG_SMALL_CAPITALS = 0x70636d73, // 'smcp'
+ DWRITE_FONT_FEATURE_TAG_SIMPLIFIED_FORMS = 0x6c706d73, // 'smpl'
+ DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_1 = 0x31307373, // 'ss01'
+ DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_2 = 0x32307373, // 'ss02'
+ DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_3 = 0x33307373, // 'ss03'
+ DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_4 = 0x34307373, // 'ss04'
+ DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_5 = 0x35307373, // 'ss05'
+ DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_6 = 0x36307373, // 'ss06'
+ DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_7 = 0x37307373, // 'ss07'
+ DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_8 = 0x38307373, // 'ss08'
+ DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_9 = 0x39307373, // 'ss09'
+ DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_10 = 0x30317373, // 'ss10'
+ DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_11 = 0x31317373, // 'ss11'
+ DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_12 = 0x32317373, // 'ss12'
+ DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_13 = 0x33317373, // 'ss13'
+ DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_14 = 0x34317373, // 'ss14'
+ DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_15 = 0x35317373, // 'ss15'
+ DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_16 = 0x36317373, // 'ss16'
+ DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_17 = 0x37317373, // 'ss17'
+ DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_18 = 0x38317373, // 'ss18'
+ DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_19 = 0x39317373, // 'ss19'
+ DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_20 = 0x30327373, // 'ss20'
+ DWRITE_FONT_FEATURE_TAG_SUBSCRIPT = 0x73627573, // 'subs'
+ DWRITE_FONT_FEATURE_TAG_SUPERSCRIPT = 0x73707573, // 'sups'
+ DWRITE_FONT_FEATURE_TAG_SWASH = 0x68737773, // 'swsh'
+ DWRITE_FONT_FEATURE_TAG_TITLING = 0x6c746974, // 'titl'
+ DWRITE_FONT_FEATURE_TAG_TRADITIONAL_NAME_FORMS = 0x6d616e74, // 'tnam'
+ DWRITE_FONT_FEATURE_TAG_TABULAR_FIGURES = 0x6d756e74, // 'tnum'
+ DWRITE_FONT_FEATURE_TAG_TRADITIONAL_FORMS = 0x64617274, // 'trad'
+ DWRITE_FONT_FEATURE_TAG_THIRD_WIDTHS = 0x64697774, // 'twid'
+ DWRITE_FONT_FEATURE_TAG_UNICASE = 0x63696e75, // 'unic'
+ DWRITE_FONT_FEATURE_TAG_SLASHED_ZERO = 0x6f72657a, // 'zero'
+};
+
+/// <summary>
+/// The DWRITE_TEXT_RANGE structure specifies a range of text positions where format is applied.
+/// </summary>
+struct DWRITE_TEXT_RANGE
+{
+ /// <summary>
+ /// The start text position of the range.
+ /// </summary>
+ UINT32 startPosition;
+
+ /// <summary>
+ /// The number of text positions in the range.
+ /// </summary>
+ UINT32 length;
+};
+
+/// <summary>
+/// The DWRITE_FONT_FEATURE structure specifies properties used to identify and execute typographic feature in the font.
+/// </summary>
+struct DWRITE_FONT_FEATURE
+{
+ /// <summary>
+ /// The feature OpenType name identifier.
+ /// </summary>
+ DWRITE_FONT_FEATURE_TAG nameTag;
+
+ /// <summary>
+ /// Execution parameter of the feature.
+ /// </summary>
+ /// <remarks>
+ /// The parameter should be non-zero to enable the feature. Once enabled, a feature can't be disabled again within
+ /// the same range. Features requiring a selector use this value to indicate the selector index.
+ /// </remarks>
+ UINT32 parameter;
+};
+
+/// <summary>
+/// Defines a set of typographic features to be applied during shaping.
+/// Notice the character range which this feature list spans is specified
+/// as a separate parameter to GetGlyphs.
+/// </summary>
+struct DWRITE_TYPOGRAPHIC_FEATURES
+{
+ /// <summary>
+ /// Array of font features.
+ /// </summary>
+ __field_ecount(featureCount) DWRITE_FONT_FEATURE* features;
+
+ /// <summary>
+ /// The number of features.
+ /// </summary>
+ UINT32 featureCount;
+};
+
+/// <summary>
+/// The DWRITE_TRIMMING structure specifies the trimming option for text overflowing the layout box.
+/// </summary>
+struct DWRITE_TRIMMING
+{
+ /// <summary>
+ /// Text granularity of which trimming applies.
+ /// </summary>
+ DWRITE_TRIMMING_GRANULARITY granularity;
+
+ /// <summary>
+ /// Character code used as the delimiter signaling the beginning of the portion of text to be preserved,
+ /// most useful for path ellipsis, where the delimeter would be a slash.
+ /// </summary>
+ UINT32 delimiter;
+
+ /// <summary>
+ /// How many occurences of the delimiter to step back.
+ /// </summary>
+ UINT32 delimiterCount;
+};
+
+
+interface IDWriteTypography;
+interface IDWriteInlineObject;
+
+/// <summary>
+/// The format of text used for text layout purpose.
+/// </summary>
+/// <remarks>
+/// This object may not be thread-safe and it may carry the state of text format change.
+/// </remarks>
+interface DWRITE_DECLARE_INTERFACE("9c906818-31d7-4fd3-a151-7c5e225db55a") IDWriteTextFormat : public IUnknown
+{
+ /// <summary>
+ /// Set alignment option of text relative to layout box's leading and trailing edge.
+ /// </summary>
+ /// <param name="textAlignment">Text alignment option</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(SetTextAlignment)(
+ DWRITE_TEXT_ALIGNMENT textAlignment
+ ) PURE;
+
+ /// <summary>
+ /// Set alignment option of paragraph relative to layout box's top and bottom edge.
+ /// </summary>
+ /// <param name="paragraphAlignment">Paragraph alignment option</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(SetParagraphAlignment)(
+ DWRITE_PARAGRAPH_ALIGNMENT paragraphAlignment
+ ) PURE;
+
+ /// <summary>
+ /// Set word wrapping option.
+ /// </summary>
+ /// <param name="wordWrapping">Word wrapping option</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(SetWordWrapping)(
+ DWRITE_WORD_WRAPPING wordWrapping
+ ) PURE;
+
+ /// <summary>
+ /// Set paragraph reading direction.
+ /// </summary>
+ /// <param name="readingDirection">Text reading direction</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(SetReadingDirection)(
+ DWRITE_READING_DIRECTION readingDirection
+ ) PURE;
+
+ /// <summary>
+ /// Set paragraph flow direction.
+ /// </summary>
+ /// <param name="flowDirection">Paragraph flow direction</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(SetFlowDirection)(
+ DWRITE_FLOW_DIRECTION flowDirection
+ ) PURE;
+
+ /// <summary>
+ /// Set incremental tab stop position.
+ /// </summary>
+ /// <param name="incrementalTabStop">The incremental tab stop value</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(SetIncrementalTabStop)(
+ FLOAT incrementalTabStop
+ ) PURE;
+
+ /// <summary>
+ /// Set trimming options for any trailing text exceeding the layout width
+ /// or for any far text exceeding the layout height.
+ /// </summary>
+ /// <param name="trimmingOptions">Text trimming options.</param>
+ /// <param name="trimmingSign">Application-defined omission sign. This parameter may be NULL if no trimming sign is desired.</param>
+ /// <remarks>
+ /// Any inline object can be used for the trimming sign, but CreateEllipsisTrimmingSign
+ /// provides a typical ellipsis symbol. Trimming is also useful vertically for hiding
+ /// partial lines.
+ /// </remarks>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(SetTrimming)(
+ __in DWRITE_TRIMMING const* trimmingOptions,
+ IDWriteInlineObject* trimmingSign
+ ) PURE;
+
+ /// <summary>
+ /// Set line spacing.
+ /// </summary>
+ /// <param name="lineSpacingMethod">How to determine line height.</param>
+ /// <param name="lineSpacing">The line height, or rather distance between one baseline to another.</param>
+ /// <param name="baseline">Distance from top of line to baseline. A reasonable ratio to lineSpacing is 80%.</param>
+ /// <remarks>
+ /// For the default method, spacing depends solely on the content.
+ /// For uniform spacing, the given line height will override the content.
+ /// </remarks>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(SetLineSpacing)(
+ DWRITE_LINE_SPACING_METHOD lineSpacingMethod,
+ FLOAT lineSpacing,
+ FLOAT baseline
+ ) PURE;
+
+ /// <summary>
+ /// Get alignment option of text relative to layout box's leading and trailing edge.
+ /// </summary>
+ STDMETHOD_(DWRITE_TEXT_ALIGNMENT, GetTextAlignment)() PURE;
+
+ /// <summary>
+ /// Get alignment option of paragraph relative to layout box's top and bottom edge.
+ /// </summary>
+ STDMETHOD_(DWRITE_PARAGRAPH_ALIGNMENT, GetParagraphAlignment)() PURE;
+
+ /// <summary>
+ /// Get word wrapping option.
+ /// </summary>
+ STDMETHOD_(DWRITE_WORD_WRAPPING, GetWordWrapping)() PURE;
+
+ /// <summary>
+ /// Get paragraph reading direction.
+ /// </summary>
+ STDMETHOD_(DWRITE_READING_DIRECTION, GetReadingDirection)() PURE;
+
+ /// <summary>
+ /// Get paragraph flow direction.
+ /// </summary>
+ STDMETHOD_(DWRITE_FLOW_DIRECTION, GetFlowDirection)() PURE;
+
+ /// <summary>
+ /// Get incremental tab stop position.
+ /// </summary>
+ STDMETHOD_(FLOAT, GetIncrementalTabStop)() PURE;
+
+ /// <summary>
+ /// Get trimming options for text overflowing the layout width.
+ /// </summary>
+ /// <param name="trimmingOptions">Text trimming options.</param>
+ /// <param name="trimmingSign">Trimming omission sign. This parameter may be NULL.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetTrimming)(
+ __out DWRITE_TRIMMING* trimmingOptions,
+ __out IDWriteInlineObject** trimmingSign
+ ) PURE;
+
+ /// <summary>
+ /// Get line spacing.
+ /// </summary>
+ /// <param name="lineSpacingMethod">How line height is determined.</param>
+ /// <param name="lineSpacing">The line height, or rather distance between one baseline to another.</param>
+ /// <param name="baseline">Distance from top of line to baseline.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetLineSpacing)(
+ __out DWRITE_LINE_SPACING_METHOD* lineSpacingMethod,
+ __out FLOAT* lineSpacing,
+ __out FLOAT* baseline
+ ) PURE;
+
+ /// <summary>
+ /// Get the font collection.
+ /// </summary>
+ /// <param name="fontCollection">The current font collection.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetFontCollection)(
+ __out IDWriteFontCollection** fontCollection
+ ) PURE;
+
+ /// <summary>
+ /// Get the length of the font family name, in characters, not including the terminating NULL character.
+ /// </summary>
+ STDMETHOD_(UINT32, GetFontFamilyNameLength)() PURE;
+
+ /// <summary>
+ /// Get a copy of the font family name.
+ /// </summary>
+ /// <param name="fontFamilyName">Character array that receives the current font family name</param>
+ /// <param name="nameSize">Size of the character array in character count including the terminated NULL character.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetFontFamilyName)(
+ __out_ecount_z(nameSize) WCHAR* fontFamilyName,
+ UINT32 nameSize
+ ) PURE;
+
+ /// <summary>
+ /// Get the font weight.
+ /// </summary>
+ STDMETHOD_(DWRITE_FONT_WEIGHT, GetFontWeight)() PURE;
+
+ /// <summary>
+ /// Get the font style.
+ /// </summary>
+ STDMETHOD_(DWRITE_FONT_STYLE, GetFontStyle)() PURE;
+
+ /// <summary>
+ /// Get the font stretch.
+ /// </summary>
+ STDMETHOD_(DWRITE_FONT_STRETCH, GetFontStretch)() PURE;
+
+ /// <summary>
+ /// Get the font em height.
+ /// </summary>
+ STDMETHOD_(FLOAT, GetFontSize)() PURE;
+
+ /// <summary>
+ /// Get the length of the locale name, in characters, not including the terminating NULL character.
+ /// </summary>
+ STDMETHOD_(UINT32, GetLocaleNameLength)() PURE;
+
+ /// <summary>
+ /// Get a copy of the locale name.
+ /// </summary>
+ /// <param name="localeName">Character array that receives the current locale name</param>
+ /// <param name="nameSize">Size of the character array in character count including the terminated NULL character.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetLocaleName)(
+ __out_ecount_z(nameSize) WCHAR* localeName,
+ UINT32 nameSize
+ ) PURE;
+};
+
+
+/// <summary>
+/// Font typography setting.
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("55f1112b-1dc2-4b3c-9541-f46894ed85b6") IDWriteTypography : public IUnknown
+{
+ /// <summary>
+ /// Add font feature.
+ /// </summary>
+ /// <param name="fontFeature">The font feature to add.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(AddFontFeature)(
+ DWRITE_FONT_FEATURE fontFeature
+ ) PURE;
+
+ /// <summary>
+ /// Get the number of font features.
+ /// </summary>
+ STDMETHOD_(UINT32, GetFontFeatureCount)() PURE;
+
+ /// <summary>
+ /// Get the font feature at the specified index.
+ /// </summary>
+ /// <param name="fontFeatureIndex">The zero-based index of the font feature to get.</param>
+ /// <param name="fontFeature">The font feature.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetFontFeature)(
+ UINT32 fontFeatureIndex,
+ __out DWRITE_FONT_FEATURE* fontFeature
+ ) PURE;
+};
+
+enum DWRITE_SCRIPT_SHAPES
+{
+ /// <summary>
+ /// No additional shaping requirement. Text is shaped with the writing system default behavior.
+ /// </summary>
+ DWRITE_SCRIPT_SHAPES_DEFAULT = 0,
+
+ /// <summary>
+ /// Text should leave no visual on display i.e. control or format control characters.
+ /// </summary>
+ DWRITE_SCRIPT_SHAPES_NO_VISUAL = 1
+};
+
+#ifdef DEFINE_ENUM_FLAG_OPERATORS
+DEFINE_ENUM_FLAG_OPERATORS(DWRITE_SCRIPT_SHAPES);
+#endif
+
+/// <summary>
+/// Association of text and its writing system script as well as some display attributes.
+/// </summary>
+struct DWRITE_SCRIPT_ANALYSIS
+{
+ /// <summary>
+ /// Zero-based index representation of writing system script.
+ /// </summary>
+ UINT16 script;
+
+ /// <summary>
+ /// Additional shaping requirement of text.
+ /// </summary>
+ DWRITE_SCRIPT_SHAPES shapes;
+};
+
+/// <summary>
+/// Condition at the edges of inline object or text used to determine
+/// line-breaking behavior.
+/// </summary>
+enum DWRITE_BREAK_CONDITION
+{
+ /// <summary>
+ /// Whether a break is allowed is determined by the condition of the
+ /// neighboring text span or inline object.
+ /// </summary>
+ DWRITE_BREAK_CONDITION_NEUTRAL,
+
+ /// <summary>
+ /// A break is allowed, unless overruled by the condition of the
+ /// neighboring text span or inline object, either prohibited by a
+ /// May Not or forced by a Must.
+ /// </summary>
+ DWRITE_BREAK_CONDITION_CAN_BREAK,
+
+ /// <summary>
+ /// There should be no break, unless overruled by a Must condition from
+ /// the neighboring text span or inline object.
+ /// </summary>
+ DWRITE_BREAK_CONDITION_MAY_NOT_BREAK,
+
+ /// <summary>
+ /// The break must happen, regardless of the condition of the adjacent
+ /// text span or inline object.
+ /// </summary>
+ DWRITE_BREAK_CONDITION_MUST_BREAK
+};
+
+/// <summary>
+/// Line breakpoint characteristics of a character.
+/// </summary>
+struct DWRITE_LINE_BREAKPOINT
+{
+ /// <summary>
+ /// Breaking condition before the character.
+ /// </summary>
+ UINT8 breakConditionBefore : 2;
+
+ /// <summary>
+ /// Breaking condition after the character.
+ /// </summary>
+ UINT8 breakConditionAfter : 2;
+
+ /// <summary>
+ /// The character is some form of whitespace, which may be meaningful
+ /// for justification.
+ /// </summary>
+ UINT8 isWhitespace : 1;
+
+ /// <summary>
+ /// The character is a soft hyphen, often used to indicate hyphenation
+ /// points inside words.
+ /// </summary>
+ UINT8 isSoftHyphen : 1;
+
+ UINT8 padding : 2;
+};
+
+/// <summary>
+/// How to apply number substitution on digits and related punctuation.
+/// </summary>
+enum DWRITE_NUMBER_SUBSTITUTION_METHOD
+{
+ /// <summary>
+ /// Specifies that the substitution method should be determined based
+ /// on LOCALE_IDIGITSUBSTITUTION value of the specified text culture.
+ /// </summary>
+ DWRITE_NUMBER_SUBSTITUTION_METHOD_FROM_CULTURE,
+
+ /// <summary>
+ /// If the culture is Arabic or Farsi, specifies that the number shape
+ /// depend on the context. Either traditional or nominal number shape
+ /// are used depending on the nearest preceding strong character or (if
+ /// there is none) the reading direction of the paragraph.
+ /// </summary>
+ DWRITE_NUMBER_SUBSTITUTION_METHOD_CONTEXTUAL,
+
+ /// <summary>
+ /// Specifies that code points 0x30-0x39 are always rendered as nominal numeral
+ /// shapes (ones of the European number), i.e., no substitution is performed.
+ /// </summary>
+ DWRITE_NUMBER_SUBSTITUTION_METHOD_NONE,
+
+ /// <summary>
+ /// Specifies that number are rendered using the national number shape
+ /// as specified by the LOCALE_SNATIVEDIGITS value of the specified text culture.
+ /// </summary>
+ DWRITE_NUMBER_SUBSTITUTION_METHOD_NATIONAL,
+
+ /// <summary>
+ /// Specifies that number are rendered using the traditional shape
+ /// for the specified culture. For most cultures, this is the same as
+ /// NativeNational. However, NativeNational results in Latin number
+ /// for some Arabic cultures, whereas this value results in Arabic
+ /// number for all Arabic cultures.
+ /// </summary>
+ DWRITE_NUMBER_SUBSTITUTION_METHOD_TRADITIONAL
+};
+
+/// <summary>
+/// Holds the appropriate digits and numeric punctuation for a given locale.
+/// </summary>
+interface DECLSPEC_UUID("14885CC9-BAB0-4f90-B6ED-5C366A2CD03D") DECLSPEC_NOVTABLE IDWriteNumberSubstitution : public IUnknown
+{
+};
+
+/// <summary>
+/// Shaping output properties per input character.
+/// </summary>
+struct DWRITE_SHAPING_TEXT_PROPERTIES
+{
+ /// <summary>
+ /// This character can be shaped independently from the others
+ /// (usually set for the space character).
+ /// </summary>
+ UINT16 isShapedAlone : 1;
+
+ /// <summary>
+ /// Reserved for use by shaping engine.
+ /// </summary>
+ UINT16 reserved : 15;
+};
+
+/// <summary>
+/// Shaping output properties per output glyph.
+/// </summary>
+struct DWRITE_SHAPING_GLYPH_PROPERTIES
+{
+ /// <summary>
+ /// Justification class, whether to use spacing, kashidas, or
+ /// another method. This exists for backwards compatibility
+ /// with Uniscribe's SCRIPT_JUSTIFY enum.
+ /// </summary>
+ UINT16 justification : 4;
+
+ /// <summary>
+ /// Indicates glyph is the first of a cluster.
+ /// </summary>
+ UINT16 isClusterStart : 1;
+
+ /// <summary>
+ /// Glyph is a diacritic.
+ /// </summary>
+ UINT16 isDiacritic : 1;
+
+ /// <summary>
+ /// Glyph has no width, blank, ZWJ, ZWNJ etc.
+ /// </summary>
+ UINT16 isZeroWidthSpace : 1;
+
+ /// <summary>
+ /// Reserved for use by shaping engine.
+ /// </summary>
+ UINT16 reserved : 9;
+};
+
+/// <summary>
+/// The interface implemented by the text analyzer's client to provide text to
+/// the analyzer. It allows the separation between the logical view of text as
+/// a continuous stream of characters identifiable by unique text positions,
+/// and the actual memory layout of potentially discrete blocks of text in the
+/// client's backing store.
+///
+/// If any of these callbacks returns an error, the analysis functions will
+/// stop prematurely and return a callback error. Rather than return E_NOTIMPL,
+/// an application should stub the method and return a constant/null and S_OK.
+/// </summary>
+interface DECLSPEC_UUID("688e1a58-5094-47c8-adc8-fbcea60ae92b") DECLSPEC_NOVTABLE IDWriteTextAnalysisSource : public IUnknown
+{
+ /// <summary>
+ /// Get a block of text starting at the specified text position.
+ /// Returning NULL indicates the end of text - the position is after
+ /// the last character. This function is called iteratively for
+ /// each consecutive block, tying together several fragmented blocks
+ /// in the backing store into a virtual contiguous string.
+ /// </summary>
+ /// <param name="textPosition">First position of the piece to obtain. All
+ /// positions are in UTF16 code-units, not whole characters, which
+ /// matters when supplementary characters are used.</param>
+ /// <param name="textString">Address that receives a pointer to the text block
+ /// at the specified position.</param>
+ /// <param name="textLength">Number of UTF16 units of the retrieved chunk.
+ /// The returned length is not the length of the block, but the length
+ /// remaining in the block, from the given position until its end.
+ /// So querying for a position that is 75 positions into a 100
+ /// postition block would return 25.</param>
+ /// <returns>Pointer to the first character at the given text position.
+ /// NULL indicates no chunk available at the specified position, either
+ /// because textPosition >= the entire text content length or because the
+ /// queried position is not mapped into the app's backing store.</returns>
+ /// <remarks>
+ /// Although apps can implement sparse textual content that only maps part of
+ /// the backing store, the app must map any text that is in the range passed
+ /// to any analysis functions.
+ /// </remarks>
+ STDMETHOD(GetTextAtPosition)(
+ UINT32 textPosition,
+ __out WCHAR const** textString,
+ __out UINT32* textLength
+ ) PURE;
+
+ /// <summary>
+ /// Get a block of text immediately preceding the specified position.
+ /// </summary>
+ /// <param name="textPosition">Position immediately after the last position of the chunk to obtain.</param>
+ /// <param name="textString">Address that receives a pointer to the text block
+ /// at the specified position.</param>
+ /// <param name="textLength">Number of UTF16 units of the retrieved block.
+ /// The length returned is from the given position to the front of
+ /// the block.</param>
+ /// <returns>Pointer to the first character at (textPosition - textLength).
+ /// NULL indicates no chunk available at the specified position, either
+ /// because textPosition == 0,the textPosition > the entire text content
+ /// length, or the queried position is not mapped into the app's backing
+ /// store.</returns>
+ /// <remarks>
+ /// Although apps can implement sparse textual content that only maps part of
+ /// the backing store, the app must map any text that is in the range passed
+ /// to any analysis functions.
+ /// </remarks>
+ STDMETHOD(GetTextBeforePosition)(
+ UINT32 textPosition,
+ __out WCHAR const** textString,
+ __out UINT32* textLength
+ ) PURE;
+
+ /// <summary>
+ /// Get paragraph reading direction.
+ /// </summary>
+ STDMETHOD_(DWRITE_READING_DIRECTION, GetParagraphReadingDirection)() PURE;
+
+ /// <summary>
+ /// Get locale name on the range affected by it.
+ /// </summary>
+ /// <param name="textPosition">Position to get the locale name of.</param>
+ /// <param name="textLength">Receives the length from the given position up to the
+ /// next differing locale.</param>
+ /// <param name="localeName">Address that receives a pointer to the locale
+ /// at the specified position.</param>
+ /// <remarks>
+ /// The localeName pointer must remain valid until the next call or until
+ /// the analysis returns.
+ /// </remarks>
+ STDMETHOD(GetLocaleName)(
+ UINT32 textPosition,
+ __out UINT32* textLength,
+ __out_z WCHAR const** localeName
+ ) PURE;
+
+ /// <summary>
+ /// Get number substitution on the range affected by it.
+ /// </summary>
+ /// <param name="textPosition">Position to get the number substitution of.</param>
+ /// <param name="textLength">Receives the length from the given position up to the
+ /// next differing number substitution.</param>
+ /// <param name="numberSubstitution">Address that receives a pointer to the number substitution
+ /// at the specified position.</param>
+ /// <remarks>
+ /// Any implementation should return the number substitution with an
+ /// incremented ref count, and the analysis will release when finished
+ /// with it (either before the next call or before it returns). However,
+ /// the sink callback may hold onto it after that.
+ /// </remarks>
+ STDMETHOD(GetNumberSubstitution)(
+ UINT32 textPosition,
+ __out UINT32* textLength,
+ __out IDWriteNumberSubstitution** numberSubstitution
+ ) PURE;
+};
+
+/// <summary>
+/// The interface implemented by the text analyzer's client to receive the
+/// output of a given text analysis. The Text analyzer disregards any current
+/// state of the analysis sink, therefore a Set method call on a range
+/// overwrites the previously set analysis result of the same range.
+/// </summary>
+interface DECLSPEC_UUID("5810cd44-0ca0-4701-b3fa-bec5182ae4f6") DECLSPEC_NOVTABLE IDWriteTextAnalysisSink : public IUnknown
+{
+ /// <summary>
+ /// Report script analysis for the text range.
+ /// </summary>
+ /// <param name="textPosition">Starting position to report from.</param>
+ /// <param name="textLength">Number of UTF16 units of the reported range.</param>
+ /// <param name="scriptAnalysis">Script analysis of characters in range.</param>
+ /// <returns>
+ /// A successful code or error code to abort analysis.
+ /// </returns>
+ STDMETHOD(SetScriptAnalysis)(
+ UINT32 textPosition,
+ UINT32 textLength,
+ __in DWRITE_SCRIPT_ANALYSIS const* scriptAnalysis
+ ) PURE;
+
+ /// <summary>
+ /// Repport line-break opportunities for each character, starting from
+ /// the specified position.
+ /// </summary>
+ /// <param name="textPosition">Starting position to report from.</param>
+ /// <param name="textLength">Number of UTF16 units of the reported range.</param>
+ /// <param name="lineBreakpoints">Breaking conditions for each character.</param>
+ /// <returns>
+ /// A successful code or error code to abort analysis.
+ /// </returns>
+ STDMETHOD(SetLineBreakpoints)(
+ UINT32 textPosition,
+ UINT32 textLength,
+ __in_ecount(textLength) DWRITE_LINE_BREAKPOINT const* lineBreakpoints
+ ) PURE;
+
+ /// <summary>
+ /// Set bidirectional level on the range, called once per each
+ /// level run change (either explicit or resolved implicit).
+ /// </summary>
+ /// <param name="textPosition">Starting position to report from.</param>
+ /// <param name="textLength">Number of UTF16 units of the reported range.</param>
+ /// <param name="explicitLevel">Explicit level from embedded control codes
+ /// RLE/RLO/LRE/LRO/PDF, determined before any additional rules.</param>
+ /// <param name="resolvedLevel">Final implicit level considering the
+ /// explicit level and characters' natural directionality, after all
+ /// Bidi rules have been applied.</param>
+ /// <returns>
+ /// A successful code or error code to abort analysis.
+ /// </returns>
+ STDMETHOD(SetBidiLevel)(
+ UINT32 textPosition,
+ UINT32 textLength,
+ UINT8 explicitLevel,
+ UINT8 resolvedLevel
+ ) PURE;
+
+ /// <summary>
+ /// Set number substitution on the range.
+ /// </summary>
+ /// <param name="textPosition">Starting position to report from.</param>
+ /// <param name="textLength">Number of UTF16 units of the reported range.</param>
+ /// <param name="numberSubstitution">The number substitution applicable to
+ /// the returned range of text. The sink callback may hold onto it by
+ /// incrementing its ref count.</param>
+ /// <returns>
+ /// A successful code or error code to abort analysis.
+ /// </returns>
+ /// <remark>
+ /// Unlike script and bidi analysis, where every character passed to the
+ /// analyzer has a result, this will only be called for those ranges where
+ /// substitution is applicable. For any other range, you will simply not
+ /// be called.
+ /// </remark>
+ STDMETHOD(SetNumberSubstitution)(
+ UINT32 textPosition,
+ UINT32 textLength,
+ __notnull IDWriteNumberSubstitution* numberSubstitution
+ ) PURE;
+};
+
+/// <summary>
+/// Analyzes various text properties for complex script processing.
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("b7e6163e-7f46-43b4-84b3-e4e6249c365d") IDWriteTextAnalyzer : public IUnknown
+{
+ /// <summary>
+ /// Analyzes a text range for script boundaries, reading text attributes
+ /// from the source and reporting the Unicode script ID to the sink
+ /// callback SetScript.
+ /// </summary>
+ /// <param name="analysisSource">Source object to analyze.</param>
+ /// <param name="textPosition">Starting position within the source object.</param>
+ /// <param name="textLength">Length to analyze.</param>
+ /// <param name="analysisSink">Callback object.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(AnalyzeScript)(
+ IDWriteTextAnalysisSource* analysisSource,
+ UINT32 textPosition,
+ UINT32 textLength,
+ IDWriteTextAnalysisSink* analysisSink
+ ) PURE;
+
+ /// <summary>
+ /// Analyzes a text range for script directionality, reading attributes
+ /// from the source and reporting levels to the sink callback SetBidiLevel.
+ /// </summary>
+ /// <param name="analysisSource">Source object to analyze.</param>
+ /// <param name="textPosition">Starting position within the source object.</param>
+ /// <param name="textLength">Length to analyze.</param>
+ /// <param name="analysisSink">Callback object.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ /// <remarks>
+ /// While the function can handle multiple paragraphs, the text range
+ /// should not arbitrarily split the middle of paragraphs. Otherwise the
+ /// returned levels may be wrong, since the Bidi algorithm is meant to
+ /// apply to the paragraph as a whole.
+ /// </remarks>
+ /// <remarks>
+ /// Embedded control codes (LRE/LRO/RLE/RLO/PDF) are taken into account.
+ /// </remarks>
+ STDMETHOD(AnalyzeBidi)(
+ IDWriteTextAnalysisSource* analysisSource,
+ UINT32 textPosition,
+ UINT32 textLength,
+ IDWriteTextAnalysisSink* analysisSink
+ ) PURE;
+
+ /// <summary>
+ /// Analyzes a text range for spans where number substitution is applicable,
+ /// reading attributes from the source and reporting substitutable ranges
+ /// to the sink callback SetNumberSubstitution.
+ /// </summary>
+ /// <param name="analysisSource">Source object to analyze.</param>
+ /// <param name="textPosition">Starting position within the source object.</param>
+ /// <param name="textLength">Length to analyze.</param>
+ /// <param name="analysisSink">Callback object.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ /// <remarks>
+ /// While the function can handle multiple ranges of differing number
+ /// substitutions, the text ranges should not arbitrarily split the
+ /// middle of numbers. Otherwise it will treat the numbers separately
+ /// and will not translate any intervening punctuation.
+ /// </remarks>
+ /// <remarks>
+ /// Embedded control codes (LRE/LRO/RLE/RLO/PDF) are taken into account.
+ /// </remarks>
+ STDMETHOD(AnalyzeNumberSubstitution)(
+ IDWriteTextAnalysisSource* analysisSource,
+ UINT32 textPosition,
+ UINT32 textLength,
+ IDWriteTextAnalysisSink* analysisSink
+ ) PURE;
+
+ /// <summary>
+ /// Analyzes a text range for potential breakpoint opportunities, reading
+ /// attributes from the source and reporting breakpoint opportunities to
+ /// the sink callback SetLineBreakpoints.
+ /// </summary>
+ /// <param name="analysisSource">Source object to analyze.</param>
+ /// <param name="textPosition">Starting position within the source object.</param>
+ /// <param name="textLength">Length to analyze.</param>
+ /// <param name="analysisSink">Callback object.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ /// <remarks>
+ /// While the function can handle multiple paragraphs, the text range
+ /// should not arbitrarily split the middle of paragraphs, unless the
+ /// given text span is considered a whole unit. Otherwise the
+ /// returned properties for the first and last characters will
+ /// inappropriately allow breaks.
+ /// </remarks>
+ /// <remarks>
+ /// Special cases include the first, last, and surrogate characters. Any
+ /// text span is treated as if adjacent to inline objects on either side.
+ /// So the rules with contingent-break opportunities are used, where the
+ /// edge between text and inline objects is always treated as a potential
+ /// break opportunity, dependent on any overriding rules of the adjacent
+ /// objects to prohibit or force the break (see Unicode TR #14).
+ /// Surrogate pairs never break between.
+ /// </remarks>
+ STDMETHOD(AnalyzeLineBreakpoints)(
+ IDWriteTextAnalysisSource* analysisSource,
+ UINT32 textPosition,
+ UINT32 textLength,
+ IDWriteTextAnalysisSink* analysisSink
+ ) PURE;
+
+ /// <summary>
+ /// Parses the input text string and maps it to the set of glyphs and associated glyph data
+ /// according to the font and the writing system's rendering rules.
+ /// </summary>
+ /// <param name="textString">The string to convert to glyphs.</param>
+ /// <param name="textLength">The length of textString.</param>
+ /// <param name="fontFace">The font face to get glyphs from.</param>
+ /// <param name="isSideways">Set to true if the text is intended to be
+ /// drawn vertically.</param>
+ /// <param name="isRightToLeft">Set to TRUE for right-to-left text.</param>
+ /// <param name="scriptAnalysis">Script analysis result from AnalyzeScript.</param>
+ /// <param name="localeName">The locale to use when selecting glyphs.
+ /// e.g. the same character may map to different glyphs for ja-jp vs zh-chs.
+ /// If this is NULL then the default mapping based on the script is used.</param>
+ /// <param name="numberSubstitution">Optional number substitution which
+ /// selects the appropriate glyphs for digits and related numeric characters,
+ /// depending on the results obtained from AnalyzeNumberSubstitution. Passing
+ /// null indicates that no substitution is needed and that the digits should
+ /// receive nominal glyphs.</param>
+ /// <param name="features">An array of pointers to the sets of typographic
+ /// features to use in each feature range.</param>
+ /// <param name="featureRangeLengths">The length of each feature range, in characters.
+ /// The sum of all lengths should be equal to textLength.</param>
+ /// <param name="featureRanges">The number of feature ranges.</param>
+ /// <param name="maxGlyphCount">The maximum number of glyphs that can be
+ /// returned.</param>
+ /// <param name="clusterMap">The mapping from character ranges to glyph
+ /// ranges.</param>
+ /// <param name="textProps">Per-character output properties.</param>
+ /// <param name="glyphIndices">Output glyph indices.</param>
+ /// <param name="glyphProps">Per-glyph output properties.</param>
+ /// <param name="actualGlyphCount">The actual number of glyphs returned if
+ /// the call succeeds.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ /// <remarks>
+ /// Note that the mapping from characters to glyphs is, in general, many-
+ /// to-many. The recommended estimate for the per-glyph output buffers is
+ /// (3 * textLength / 2 + 16). This is not guaranteed to be sufficient.
+ ///
+ /// The value of the actualGlyphCount parameter is only valid if the call
+ /// succeeds. In the event that maxGlyphCount is not big enough
+ /// E_NOT_SUFFICIENT_BUFFER, which is equivalent to HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER),
+ /// will be returned. The application should allocate a larger buffer and try again.
+ /// </remarks>
+ STDMETHOD(GetGlyphs)(
+ __in_ecount(textLength) WCHAR const* textString,
+ UINT32 textLength,
+ IDWriteFontFace* fontFace,
+ BOOL isSideways,
+ BOOL isRightToLeft,
+ __in DWRITE_SCRIPT_ANALYSIS const* scriptAnalysis,
+ __in_z_opt WCHAR const* localeName,
+ __maybenull IDWriteNumberSubstitution* numberSubstitution,
+ __in_ecount_opt(featureRanges) DWRITE_TYPOGRAPHIC_FEATURES const** features,
+ __in_ecount_opt(featureRanges) UINT32 const* featureRangeLengths,
+ UINT32 featureRanges,
+ UINT32 maxGlyphCount,
+ __out_ecount(textLength) UINT16* clusterMap,
+ __out_ecount(textLength) DWRITE_SHAPING_TEXT_PROPERTIES* textProps,
+ __out_ecount(maxGlyphCount) UINT16* glyphIndices,
+ __out_ecount(maxGlyphCount) DWRITE_SHAPING_GLYPH_PROPERTIES* glyphProps,
+ __out UINT32* actualGlyphCount
+ ) PURE;
+
+ /// <summary>
+ /// Place glyphs output from the GetGlyphs method according to the font
+ /// and the writing system's rendering rules.
+ /// </summary>
+ /// <param name="textString">The original string the glyphs came from.</param>
+ /// <param name="clusterMap">The mapping from character ranges to glyph
+ /// ranges. Returned by GetGlyphs.</param>
+ /// <param name="textProps">Per-character properties. Returned by
+ /// GetGlyphs.</param>
+ /// <param name="textLength">The length of textString.</param>
+ /// <param name="glyphIndices">Glyph indices. See GetGlyphs</param>
+ /// <param name="glyphProps">Per-glyph properties. See GetGlyphs</param>
+ /// <param name="glyphCount">The number of glyphs.</param>
+ /// <param name="fontFace">The font face the glyphs came from.</param>
+ /// <param name="fontEmSize">Logical font size in DIP's.</param>
+ /// <param name="isSideways">Set to true if the text is intended to be
+ /// drawn vertically.</param>
+ /// <param name="isRightToLeft">Set to TRUE for right-to-left text.</param>
+ /// <param name="scriptAnalysis">Script analysis result from AnalyzeScript.</param>
+ /// <param name="localeName">The locale to use when selecting glyphs.
+ /// e.g. the same character may map to different glyphs for ja-jp vs zh-chs.
+ /// If this is NULL then the default mapping based on the script is used.</param>
+ /// <param name="features">An array of pointers to the sets of typographic
+ /// features to use in each feature range.</param>
+ /// <param name="featureRangeLengths">The length of each feature range, in characters.
+ /// The sum of all lengths should be equal to textLength.</param>
+ /// <param name="featureRanges">The number of feature ranges.</param>
+ /// <param name="glyphAdvances">The advance width of each glyph.</param>
+ /// <param name="glyphOffsets">The offset of the origin of each glyph.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetGlyphPlacements)(
+ __in_ecount(textLength) WCHAR const* textString,
+ __in_ecount(textLength) UINT16 const* clusterMap,
+ __in_ecount(textLength) DWRITE_SHAPING_TEXT_PROPERTIES* textProps,
+ UINT32 textLength,
+ __in_ecount(glyphCount) UINT16 const* glyphIndices,
+ __in_ecount(glyphCount) DWRITE_SHAPING_GLYPH_PROPERTIES const* glyphProps,
+ UINT32 glyphCount,
+ IDWriteFontFace * fontFace,
+ FLOAT fontEmSize,
+ BOOL isSideways,
+ BOOL isRightToLeft,
+ __in DWRITE_SCRIPT_ANALYSIS const* scriptAnalysis,
+ __in_z_opt WCHAR const* localeName,
+ __in_ecount_opt(featureRanges) DWRITE_TYPOGRAPHIC_FEATURES const** features,
+ __in_ecount_opt(featureRanges) UINT32 const* featureRangeLengths,
+ UINT32 featureRanges,
+ __out_ecount(glyphCount) FLOAT* glyphAdvances,
+ __out_ecount(glyphCount) DWRITE_GLYPH_OFFSET* glyphOffsets
+ ) PURE;
+
+ /// <summary>
+ /// Place glyphs output from the GetGlyphs method according to the font
+ /// and the writing system's rendering rules.
+ /// </summary>
+ /// <param name="textString">The original string the glyphs came from.</param>
+ /// <param name="clusterMap">The mapping from character ranges to glyph
+ /// ranges. Returned by GetGlyphs.</param>
+ /// <param name="textProps">Per-character properties. Returned by
+ /// GetGlyphs.</param>
+ /// <param name="textLength">The length of textString.</param>
+ /// <param name="glyphIndices">Glyph indices. See GetGlyphs</param>
+ /// <param name="glyphProps">Per-glyph properties. See GetGlyphs</param>
+ /// <param name="glyphCount">The number of glyphs.</param>
+ /// <param name="fontFace">The font face the glyphs came from.</param>
+ /// <param name="fontEmSize">Logical font size in DIP's.</param>
+ /// <param name="pixelsPerDip">Number of physical pixels per DIP. For example, if the DPI of the rendering surface is 96 this
+ /// value is 1.0f. If the DPI is 120, this value is 120.0f/96.</param>
+ /// <param name="transform">Optional transform applied to the glyphs and their positions. This transform is applied after the
+ /// scaling specified by the font size and pixelsPerDip.</param>
+ /// <param name="useGdiNatural">
+ /// When set to FALSE, the metrics are the same as the metrics of GDI aliased text.
+ /// When set to TRUE, the metrics are the same as the metrics of text measured by GDI using a font
+ /// created with CLEARTYPE_NATURAL_QUALITY.
+ /// </param>
+ /// <param name="isSideways">Set to true if the text is intended to be
+ /// drawn vertically.</param>
+ /// <param name="isRightToLeft">Set to TRUE for right-to-left text.</param>
+ /// <param name="scriptAnalysis">Script analysis result from AnalyzeScript.</param>
+ /// <param name="localeName">The locale to use when selecting glyphs.
+ /// e.g. the same character may map to different glyphs for ja-jp vs zh-chs.
+ /// If this is NULL then the default mapping based on the script is used.</param>
+ /// <param name="features">An array of pointers to the sets of typographic
+ /// features to use in each feature range.</param>
+ /// <param name="featureRangeLengths">The length of each feature range, in characters.
+ /// The sum of all lengths should be equal to textLength.</param>
+ /// <param name="featureRanges">The number of feature ranges.</param>
+ /// <param name="glyphAdvances">The advance width of each glyph.</param>
+ /// <param name="glyphOffsets">The offset of the origin of each glyph.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetGdiCompatibleGlyphPlacements)(
+ __in_ecount(textLength) WCHAR const* textString,
+ __in_ecount(textLength) UINT16 const* clusterMap,
+ __in_ecount(textLength) DWRITE_SHAPING_TEXT_PROPERTIES* textProps,
+ UINT32 textLength,
+ __in_ecount(glyphCount) UINT16 const* glyphIndices,
+ __in_ecount(glyphCount) DWRITE_SHAPING_GLYPH_PROPERTIES const* glyphProps,
+ UINT32 glyphCount,
+ IDWriteFontFace * fontFace,
+ FLOAT fontEmSize,
+ FLOAT pixelsPerDip,
+ __in_opt DWRITE_MATRIX const* transform,
+ BOOL useGdiNatural,
+ BOOL isSideways,
+ BOOL isRightToLeft,
+ __in DWRITE_SCRIPT_ANALYSIS const* scriptAnalysis,
+ __in_z_opt WCHAR const* localeName,
+ __in_ecount_opt(featureRanges) DWRITE_TYPOGRAPHIC_FEATURES const** features,
+ __in_ecount_opt(featureRanges) UINT32 const* featureRangeLengths,
+ UINT32 featureRanges,
+ __out_ecount(glyphCount) FLOAT* glyphAdvances,
+ __out_ecount(glyphCount) DWRITE_GLYPH_OFFSET* glyphOffsets
+ ) PURE;
+};
+
+/// <summary>
+/// The DWRITE_GLYPH_RUN structure contains the information needed by renderers
+/// to draw glyph runs. All coordinates are in device independent pixels (DIPs).
+/// </summary>
+struct DWRITE_GLYPH_RUN
+{
+ /// <summary>
+ /// The physical font face to draw with.
+ /// </summary>
+ __notnull IDWriteFontFace* fontFace;
+
+ /// <summary>
+ /// Logical size of the font in DIPs, not points (equals 1/96 inch).
+ /// </summary>
+ FLOAT fontEmSize;
+
+ /// <summary>
+ /// The number of glyphs.
+ /// </summary>
+ UINT32 glyphCount;
+
+ /// <summary>
+ /// The indices to render.
+ /// </summary>
+ __field_ecount(glyphCount) UINT16 const* glyphIndices;
+
+ /// <summary>
+ /// Glyph advance widths.
+ /// </summary>
+ __field_ecount_opt(glyphCount) FLOAT const* glyphAdvances;
+
+ /// <summary>
+ /// Glyph offsets.
+ /// </summary>
+ __field_ecount_opt(glyphCount) DWRITE_GLYPH_OFFSET const* glyphOffsets;
+
+ /// <summary>
+ /// If true, specifies that glyphs are rotated 90 degrees to the left and
+ /// vertical metrics are used. Vertical writing is achieved by specifying
+ /// isSideways = true and rotating the entire run 90 degrees to the right
+ /// via a rotate transform.
+ /// </summary>
+ BOOL isSideways;
+
+ /// <summary>
+ /// The implicit resolved bidi level of the run. Odd levels indicate
+ /// right-to-left languages like Hebrew and Arabic, while even levels
+ /// indicate left-to-right languages like English and Japanese (when
+ /// written horizontally). For right-to-left languages, the text origin
+ /// is on the right, and text should be drawn to the left.
+ /// </summary>
+ UINT32 bidiLevel;
+};
+
+/// <summary>
+/// The DWRITE_GLYPH_RUN_DESCRIPTION structure contains additional properties
+/// related to those in DWRITE_GLYPH_RUN.
+/// </summary>
+struct DWRITE_GLYPH_RUN_DESCRIPTION
+{
+ /// <summary>
+ /// The locale name associated with this run.
+ /// </summary>
+ __nullterminated WCHAR const* localeName;
+
+ /// <summary>
+ /// The text associated with the glyphs.
+ /// </summary>
+ __field_ecount(stringLength) WCHAR const* string;
+
+ /// <summary>
+ /// The number of characters (UTF16 code-units).
+ /// Note that this may be different than the number of glyphs.
+ /// </summary>
+ UINT32 stringLength;
+
+ /// <summary>
+ /// An array of indices to the glyph indices array, of the first glyphs of
+ /// all the glyph clusters of the glyphs to render.
+ /// </summary>
+ __field_ecount(stringLength) UINT16 const* clusterMap;
+
+ /// <summary>
+ /// Corresponding text position in the original string
+ /// this glyph run came from.
+ /// </summary>
+ UINT32 textPosition;
+};
+
+/// <summary>
+/// The DWRITE_UNDERLINE structure contains about the size and placement of
+/// underlines. All coordinates are in device independent pixels (DIPs).
+/// </summary>
+struct DWRITE_UNDERLINE
+{
+ /// <summary>
+ /// Width of the underline, measured parallel to the baseline.
+ /// </summary>
+ FLOAT width;
+
+ /// <summary>
+ /// Thickness of the underline, measured perpendicular to the
+ /// baseline.
+ /// </summary>
+ FLOAT thickness;
+
+ /// <summary>
+ /// Offset of the underline from the baseline.
+ /// A positive offset represents a position below the baseline and
+ /// a negative offset is above.
+ /// </summary>
+ FLOAT offset;
+
+ /// <summary>
+ /// Height of the tallest run where the underline applies.
+ /// </summary>
+ FLOAT runHeight;
+
+ /// <summary>
+ /// Reading direction of the text associated with the underline. This
+ /// value is used to interpret whether the width value runs horizontally
+ /// or vertically.
+ /// </summary>
+ DWRITE_READING_DIRECTION readingDirection;
+
+ /// <summary>
+ /// Flow direction of the text associated with the underline. This value
+ /// is used to interpret whether the thickness value advances top to
+ /// bottom, left to right, or right to left.
+ /// </summary>
+ DWRITE_FLOW_DIRECTION flowDirection;
+
+ /// <summary>
+ /// Locale of the text the underline is being drawn under. Can be
+ /// pertinent where the locale affects how the underline is drawn.
+ /// For example, in vertical text, the underline belongs on the
+ /// left for Chinese but on the right for Japanese.
+ /// This choice is completely left up to higher levels.
+ /// </summary>
+ __nullterminated WCHAR const* localeName;
+
+ /// <summary>
+ /// The measuring mode can be useful to the renderer to determine how
+ /// underlines are rendered, e.g. rounding the thickness to a whole pixel
+ /// in GDI-compatible modes.
+ /// </summary>
+ DWRITE_MEASURING_MODE measuringMode;
+};
+
+/// <summary>
+/// The DWRITE_STRIKETHROUGH structure contains about the size and placement of
+/// strickthroughs. All coordinates are in device independent pixels (DIPs).
+/// </summary>
+struct DWRITE_STRIKETHROUGH
+{
+ /// <summary>
+ /// Width of the strikethrough, measured parallel to the baseline.
+ /// </summary>
+ FLOAT width;
+
+ /// <summary>
+ /// Thickness of the strikethrough, measured perpendicular to the
+ /// baseline.
+ /// </summary>
+ FLOAT thickness;
+
+ /// <summary>
+ /// Offset of the stikethrough from the baseline.
+ /// A positive offset represents a position below the baseline and
+ /// a negative offset is above.
+ /// </summary>
+ FLOAT offset;
+
+ /// <summary>
+ /// Reading direction of the text associated with the strikethrough. This
+ /// value is used to interpret whether the width value runs horizontally
+ /// or vertically.
+ /// </summary>
+ DWRITE_READING_DIRECTION readingDirection;
+
+ /// <summary>
+ /// Flow direction of the text associated with the strikethrough. This
+ /// value is used to interpret whether the thickness value advances top to
+ /// bottom, left to right, or right to left.
+ /// </summary>
+ DWRITE_FLOW_DIRECTION flowDirection;
+
+ /// <summary>
+ /// Locale of the range. Can be pertinent where the locale affects the style.
+ /// </summary>
+ __nullterminated WCHAR const* localeName;
+
+ /// <summary>
+ /// The measuring mode can be useful to the renderer to determine how
+ /// underlines are rendered, e.g. rounding the thickness to a whole pixel
+ /// in GDI-compatible modes.
+ /// </summary>
+ DWRITE_MEASURING_MODE measuringMode;
+};
+
+/// <summary>
+/// The DWRITE_LINE_METRICS structure contains information about a formatted
+/// line of text.
+/// </summary>
+struct DWRITE_LINE_METRICS
+{
+ /// <summary>
+ /// The number of total text positions in the line.
+ /// This includes any trailing whitespace and newline characters.
+ /// </summary>
+ UINT32 length;
+
+ /// <summary>
+ /// The number of whitespace positions at the end of the line. Newline
+ /// sequences are considered whitespace.
+ /// </summary>
+ UINT32 trailingWhitespaceLength;
+
+ /// <summary>
+ /// The number of characters in the newline sequence at the end of the line.
+ /// If the count is zero, then the line was either wrapped or it is the
+ /// end of the text.
+ /// </summary>
+ UINT32 newlineLength;
+
+ /// <summary>
+ /// Height of the line as measured from top to bottom.
+ /// </summary>
+ FLOAT height;
+
+ /// <summary>
+ /// Distance from the top of the line to its baseline.
+ /// </summary>
+ FLOAT baseline;
+
+ /// <summary>
+ /// The line is trimmed.
+ /// </summary>
+ BOOL isTrimmed;
+};
+
+
+/// <summary>
+/// The DWRITE_CLUSTER_METRICS structure contains information about a glyph cluster.
+/// </summary>
+struct DWRITE_CLUSTER_METRICS
+{
+ /// <summary>
+ /// The total advance width of all glyphs in the cluster.
+ /// </summary>
+ FLOAT width;
+
+ /// <summary>
+ /// The number of text positions in the cluster.
+ /// </summary>
+ UINT16 length;
+
+ /// <summary>
+ /// Indicate whether line can be broken right after the cluster.
+ /// </summary>
+ UINT16 canWrapLineAfter : 1;
+
+ /// <summary>
+ /// Indicate whether the cluster corresponds to whitespace character.
+ /// </summary>
+ UINT16 isWhitespace : 1;
+
+ /// <summary>
+ /// Indicate whether the cluster corresponds to a newline character.
+ /// </summary>
+ UINT16 isNewline : 1;
+
+ /// <summary>
+ /// Indicate whether the cluster corresponds to soft hyphen character.
+ /// </summary>
+ UINT16 isSoftHyphen : 1;
+
+ /// <summary>
+ /// Indicate whether the cluster is read from right to left.
+ /// </summary>
+ UINT16 isRightToLeft : 1;
+
+ UINT16 padding : 11;
+};
+
+
+/// <summary>
+/// Overall metrics associated with text after layout.
+/// All coordinates are in device independent pixels (DIPs).
+/// </summary>
+struct DWRITE_TEXT_METRICS
+{
+ /// <summary>
+ /// Left-most point of formatted text relative to layout box
+ /// (excluding any glyph overhang).
+ /// </summary>
+ FLOAT left;
+
+ /// <summary>
+ /// Top-most point of formatted text relative to layout box
+ /// (excluding any glyph overhang).
+ /// </summary>
+ FLOAT top;
+
+ /// <summary>
+ /// The width of the formatted text ignoring trailing whitespace
+ /// at the end of each line.
+ /// </summary>
+ FLOAT width;
+
+ /// <summary>
+ /// The width of the formatted text taking into account the
+ /// trailing whitespace at the end of each line.
+ /// </summary>
+ FLOAT widthIncludingTrailingWhitespace;
+
+ /// <summary>
+ /// The height of the formatted text. The height of an empty string
+ /// is determined by the size of the default font's line height.
+ /// </summary>
+ FLOAT height;
+
+ /// <summary>
+ /// Initial width given to the layout. Depending on whether the text
+ /// was wrapped or not, it can be either larger or smaller than the
+ /// text content width.
+ /// </summary>
+ FLOAT layoutWidth;
+
+ /// <summary>
+ /// Initial height given to the layout. Depending on the length of the
+ /// text, it may be larger or smaller than the text content height.
+ /// </summary>
+ FLOAT layoutHeight;
+
+ /// <summary>
+ /// The maximum reordering count of any line of text, used
+ /// to calculate the most number of hit-testing boxes needed.
+ /// If the layout has no bidirectional text or no text at all,
+ /// the minimum level is 1.
+ /// </summary>
+ UINT32 maxBidiReorderingDepth;
+
+ /// <summary>
+ /// Total number of lines.
+ /// </summary>
+ UINT32 lineCount;
+};
+
+
+/// <summary>
+/// Properties describing the geometric measurement of an
+/// application-defined inline object.
+/// </summary>
+struct DWRITE_INLINE_OBJECT_METRICS
+{
+ /// <summary>
+ /// Width of the inline object.
+ /// </summary>
+ FLOAT width;
+
+ /// <summary>
+ /// Height of the inline object as measured from top to bottom.
+ /// </summary>
+ FLOAT height;
+
+ /// <summary>
+ /// Distance from the top of the object to the baseline where it is lined up with the adjacent text.
+ /// If the baseline is at the bottom, baseline simply equals height.
+ /// </summary>
+ FLOAT baseline;
+
+ /// <summary>
+ /// Flag indicating whether the object is to be placed upright or alongside the text baseline
+ /// for vertical text.
+ /// </summary>
+ BOOL supportsSideways;
+};
+
+
+/// <summary>
+/// The DWRITE_OVERHANG_METRICS structure holds how much any visible pixels
+/// (in DIPs) overshoot each side of the layout or inline objects.
+/// </summary>
+/// <remarks>
+/// Positive overhangs indicate that the visible area extends outside the layout
+/// box or inline object, while negative values mean there is whitespace inside.
+/// The returned values are unaffected by rendering transforms or pixel snapping.
+/// Additionally, they may not exactly match final target's pixel bounds after
+/// applying grid fitting and hinting.
+/// </remarks>
+struct DWRITE_OVERHANG_METRICS
+{
+ /// <summary>
+ /// The distance from the left-most visible DIP to its left alignment edge.
+ /// </summary>
+ FLOAT left;
+
+ /// <summary>
+ /// The distance from the top-most visible DIP to its top alignment edge.
+ /// </summary>
+ FLOAT top;
+
+ /// <summary>
+ /// The distance from the right-most visible DIP to its right alignment edge.
+ /// </summary>
+ FLOAT right;
+
+ /// <summary>
+ /// The distance from the bottom-most visible DIP to its bottom alignment edge.
+ /// </summary>
+ FLOAT bottom;
+};
+
+
+/// <summary>
+/// Geometry enclosing of text positions.
+/// </summary>
+struct DWRITE_HIT_TEST_METRICS
+{
+ /// <summary>
+ /// First text position within the geometry.
+ /// </summary>
+ UINT32 textPosition;
+
+ /// <summary>
+ /// Number of text positions within the geometry.
+ /// </summary>
+ UINT32 length;
+
+ /// <summary>
+ /// Left position of the top-left coordinate of the geometry.
+ /// </summary>
+ FLOAT left;
+
+ /// <summary>
+ /// Top position of the top-left coordinate of the geometry.
+ /// </summary>
+ FLOAT top;
+
+ /// <summary>
+ /// Geometry's width.
+ /// </summary>
+ FLOAT width;
+
+ /// <summary>
+ /// Geometry's height.
+ /// </summary>
+ FLOAT height;
+
+ /// <summary>
+ /// Bidi level of text positions enclosed within the geometry.
+ /// </summary>
+ UINT32 bidiLevel;
+
+ /// <summary>
+ /// Geometry encloses text?
+ /// </summary>
+ BOOL isText;
+
+ /// <summary>
+ /// Range is trimmed.
+ /// </summary>
+ BOOL isTrimmed;
+};
+
+
+interface IDWriteTextRenderer;
+
+
+/// <summary>
+/// The IDWriteInlineObject interface wraps an application defined inline graphic,
+/// allowing DWrite to query metrics as if it was a glyph inline with the text.
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("8339FDE3-106F-47ab-8373-1C6295EB10B3") IDWriteInlineObject : public IUnknown
+{
+ /// <summary>
+ /// The application implemented rendering callback (IDWriteTextRenderer::DrawInlineObject)
+ /// can use this to draw the inline object without needing to cast or query the object
+ /// type. The text layout does not call this method directly.
+ /// </summary>
+ /// <param name="clientDrawingContext">The context passed to IDWriteTextLayout::Draw.</param>
+ /// <param name="renderer">The renderer passed to IDWriteTextLayout::Draw as the object's containing parent.</param>
+ /// <param name="originX">X-coordinate at the top-left corner of the inline object.</param>
+ /// <param name="originY">Y-coordinate at the top-left corner of the inline object.</param>
+ /// <param name="isSideways">The object should be drawn on its side.</param>
+ /// <param name="isRightToLeft">The object is in an right-to-left context and should be drawn flipped.</param>
+ /// <param name="clientDrawingEffect">The drawing effect set in IDWriteTextLayout::SetDrawingEffect.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(Draw)(
+ __maybenull void* clientDrawingContext,
+ IDWriteTextRenderer* renderer,
+ FLOAT originX,
+ FLOAT originY,
+ BOOL isSideways,
+ BOOL isRightToLeft,
+ __maybenull IUnknown* clientDrawingEffect
+ ) PURE;
+
+ /// <summary>
+ /// TextLayout calls this callback function to get the measurement of the inline object.
+ /// </summary>
+ /// <param name="metrics">Returned metrics</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetMetrics)(
+ __out DWRITE_INLINE_OBJECT_METRICS* metrics
+ ) PURE;
+
+ /// <summary>
+ /// TextLayout calls this callback function to get the visible extents (in DIPs) of the inline object.
+ /// In the case of a simple bitmap, with no padding and no overhang, all the overhangs will
+ /// simply be zeroes.
+ /// </summary>
+ /// <param name="overhangs">Overshoot of visible extents (in DIPs) outside the object.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ /// <remarks>
+ /// The overhangs should be returned relative to the reported size of the object
+ /// (DWRITE_INLINE_OBJECT_METRICS::width/height), and should not be baseline
+ /// adjusted. If you have an image that is actually 100x100 DIPs, but you want it
+ /// slightly inset (perhaps it has a glow) by 20 DIPs on each side, you would
+ /// return a width/height of 60x60 and four overhangs of 20 DIPs.
+ /// </remarks>
+ STDMETHOD(GetOverhangMetrics)(
+ __out DWRITE_OVERHANG_METRICS* overhangs
+ ) PURE;
+
+ /// <summary>
+ /// Layout uses this to determine the line breaking behavior of the inline object
+ /// amidst the text.
+ /// </summary>
+ /// <param name="breakConditionBefore">Line-breaking condition between the object and the content immediately preceding it.</param>
+ /// <param name="breakConditionAfter" >Line-breaking condition between the object and the content immediately following it.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetBreakConditions)(
+ __out DWRITE_BREAK_CONDITION* breakConditionBefore,
+ __out DWRITE_BREAK_CONDITION* breakConditionAfter
+ ) PURE;
+};
+
+/// <summary>
+/// The IDWritePixelSnapping interface defines the pixel snapping properties of a text renderer.
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("eaf3a2da-ecf4-4d24-b644-b34f6842024b") IDWritePixelSnapping : public IUnknown
+{
+ /// <summary>
+ /// Determines whether pixel snapping is disabled. The recommended default is FALSE,
+ /// unless doing animation that requires subpixel vertical placement.
+ /// </summary>
+ /// <param name="clientDrawingContext">The context passed to IDWriteTextLayout::Draw.</param>
+ /// <param name="isDisabled">Receives TRUE if pixel snapping is disabled or FALSE if it not.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(IsPixelSnappingDisabled)(
+ __maybenull void* clientDrawingContext,
+ __out BOOL* isDisabled
+ ) PURE;
+
+ /// <summary>
+ /// Gets the current transform that maps abstract coordinates to DIPs,
+ /// which may disable pixel snapping upon any rotation or shear.
+ /// </summary>
+ /// <param name="clientDrawingContext">The context passed to IDWriteTextLayout::Draw.</param>
+ /// <param name="transform">Receives the transform.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetCurrentTransform)(
+ __maybenull void* clientDrawingContext,
+ __out DWRITE_MATRIX* transform
+ ) PURE;
+
+ /// <summary>
+ /// Gets the number of physical pixels per DIP. A DIP (device-independent pixel) is 1/96 inch,
+ /// so the pixelsPerDip value is the number of logical pixels per inch divided by 96 (yielding
+ /// a value of 1 for 96 DPI and 1.25 for 120).
+ /// </summary>
+ /// <param name="clientDrawingContext">The context passed to IDWriteTextLayout::Draw.</param>
+ /// <param name="pixelsPerDip">Receives the number of physical pixels per DIP.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetPixelsPerDip)(
+ __maybenull void* clientDrawingContext,
+ __out FLOAT* pixelsPerDip
+ ) PURE;
+};
+
+/// <summary>
+/// The IDWriteTextLayout interface represents a set of application-defined
+/// callbacks that perform rendering of text, inline objects, and decorations
+/// such as underlines.
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("ef8a8135-5cc6-45fe-8825-c5a0724eb819") IDWriteTextRenderer : public IDWritePixelSnapping
+{
+ /// <summary>
+ /// IDWriteTextLayout::Draw calls this function to instruct the client to
+ /// render a run of glyphs.
+ /// </summary>
+ /// <param name="clientDrawingContext">The context passed to
+ /// IDWriteTextLayout::Draw.</param>
+ /// <param name="baselineOriginX">X-coordinate of the baseline.</param>
+ /// <param name="baselineOriginY">Y-coordinate of the baseline.</param>
+ /// <param name="measuringMode">Specifies measuring method for glyphs in the run.
+ /// Renderer implementations may choose different rendering modes for given measuring methods,
+ /// but best results are seen when the rendering mode matches the corresponding measuring mode:
+ /// DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL for DWRITE_MEASURING_MODE_NATURAL
+ /// DWRITE_RENDERING_MODE_CLEARTYPE_GDI_CLASSIC for DWRITE_MEASURING_MODE_GDI_CLASSIC
+ /// DWRITE_RENDERING_MODE_CLEARTYPE_GDI_NATURAL for DWRITE_MEASURING_MODE_GDI_NATURAL
+ /// </param>
+ /// <param name="glyphRun">The glyph run to draw.</param>
+ /// <param name="glyphRunDescription">Properties of the characters
+ /// associated with this run.</param>
+ /// <param name="clientDrawingEffect">The drawing effect set in
+ /// IDWriteTextLayout::SetDrawingEffect.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(DrawGlyphRun)(
+ __maybenull void* clientDrawingContext,
+ FLOAT baselineOriginX,
+ FLOAT baselineOriginY,
+ DWRITE_MEASURING_MODE measuringMode,
+ __in DWRITE_GLYPH_RUN const* glyphRun,
+ __in DWRITE_GLYPH_RUN_DESCRIPTION const* glyphRunDescription,
+ __maybenull IUnknown* clientDrawingEffect
+ ) PURE;
+
+ /// <summary>
+ /// IDWriteTextLayout::Draw calls this function to instruct the client to draw
+ /// an underline.
+ /// </summary>
+ /// <param name="clientDrawingContext">The context passed to
+ /// IDWriteTextLayout::Draw.</param>
+ /// <param name="baselineOriginX">X-coordinate of the baseline.</param>
+ /// <param name="baselineOriginY">Y-coordinate of the baseline.</param>
+ /// <param name="underline">Underline logical information.</param>
+ /// <param name="clientDrawingEffect">The drawing effect set in
+ /// IDWriteTextLayout::SetDrawingEffect.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ /// <remarks>
+ /// A single underline can be broken into multiple calls, depending on
+ /// how the formatting changes attributes. If font sizes/styles change
+ /// within an underline, the thickness and offset will be averaged
+ /// weighted according to characters.
+ /// To get the correct top coordinate of the underline rect, add underline::offset
+ /// to the baseline's Y. Otherwise the underline will be immediately under the text.
+ /// The x coordinate will always be passed as the left side, regardless
+ /// of text directionality. This simplifies drawing and reduces the
+ /// problem of round-off that could potentially cause gaps or a double
+ /// stamped alpha blend. To avoid alpha overlap, round the end points
+ /// to the nearest device pixel.
+ /// </remarks>
+ STDMETHOD(DrawUnderline)(
+ __maybenull void* clientDrawingContext,
+ FLOAT baselineOriginX,
+ FLOAT baselineOriginY,
+ __in DWRITE_UNDERLINE const* underline,
+ __maybenull IUnknown* clientDrawingEffect
+ ) PURE;
+
+ /// <summary>
+ /// IDWriteTextLayout::Draw calls this function to instruct the client to draw
+ /// a strikethrough.
+ /// </summary>
+ /// <param name="clientDrawingContext">The context passed to
+ /// IDWriteTextLayout::Draw.</param>
+ /// <param name="baselineOriginX">X-coordinate of the baseline.</param>
+ /// <param name="baselineOriginY">Y-coordinate of the baseline.</param>
+ /// <param name="strikethrough">Strikethrough logical information.</param>
+ /// <param name="clientDrawingEffect">The drawing effect set in
+ /// IDWriteTextLayout::SetDrawingEffect.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ /// <remarks>
+ /// A single strikethrough can be broken into multiple calls, depending on
+ /// how the formatting changes attributes. Strikethrough is not averaged
+ /// across font sizes/styles changes.
+ /// To get the correct top coordinate of the strikethrough rect,
+ /// add strikethrough::offset to the baseline's Y.
+ /// Like underlines, the x coordinate will always be passed as the left side,
+ /// regardless of text directionality.
+ /// </remarks>
+ STDMETHOD(DrawStrikethrough)(
+ __maybenull void* clientDrawingContext,
+ FLOAT baselineOriginX,
+ FLOAT baselineOriginY,
+ __in DWRITE_STRIKETHROUGH const* strikethrough,
+ __maybenull IUnknown* clientDrawingEffect
+ ) PURE;
+
+ /// <summary>
+ /// IDWriteTextLayout::Draw calls this application callback when it needs to
+ /// draw an inline object.
+ /// </summary>
+ /// <param name="clientDrawingContext">The context passed to IDWriteTextLayout::Draw.</param>
+ /// <param name="originX">X-coordinate at the top-left corner of the inline object.</param>
+ /// <param name="originY">Y-coordinate at the top-left corner of the inline object.</param>
+ /// <param name="inlineObject">The object set using IDWriteTextLayout::SetInlineObject.</param>
+ /// <param name="isSideways">The object should be drawn on its side.</param>
+ /// <param name="isRightToLeft">The object is in an right-to-left context and should be drawn flipped.</param>
+ /// <param name="clientDrawingEffect">The drawing effect set in
+ /// IDWriteTextLayout::SetDrawingEffect.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ /// <remarks>
+ /// The right-to-left flag is a hint for those cases where it would look
+ /// strange for the image to be shown normally (like an arrow pointing to
+ /// right to indicate a submenu).
+ /// </remarks>
+ STDMETHOD(DrawInlineObject)(
+ __maybenull void* clientDrawingContext,
+ FLOAT originX,
+ FLOAT originY,
+ IDWriteInlineObject* inlineObject,
+ BOOL isSideways,
+ BOOL isRightToLeft,
+ __maybenull IUnknown* clientDrawingEffect
+ ) PURE;
+};
+
+/// <summary>
+/// The IDWriteTextLayout interface represents a block of text after it has
+/// been fully analyzed and formatted.
+///
+/// All coordinates are in device independent pixels (DIPs).
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("53737037-6d14-410b-9bfe-0b182bb70961") IDWriteTextLayout : public IDWriteTextFormat
+{
+ /// <summary>
+ /// Set layout maximum width
+ /// </summary>
+ /// <param name="maxWidth">Layout maximum width</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(SetMaxWidth)(
+ FLOAT maxWidth
+ ) PURE;
+
+ /// <summary>
+ /// Set layout maximum height
+ /// </summary>
+ /// <param name="maxHeight">Layout maximum height</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(SetMaxHeight)(
+ FLOAT maxHeight
+ ) PURE;
+
+ /// <summary>
+ /// Set the font collection.
+ /// </summary>
+ /// <param name="fontCollection">The font collection to set</param>
+ /// <param name="textRange">Text range to which this change applies.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(SetFontCollection)(
+ IDWriteFontCollection* fontCollection,
+ DWRITE_TEXT_RANGE textRange
+ ) PURE;
+
+ /// <summary>
+ /// Set null-terminated font family name.
+ /// </summary>
+ /// <param name="fontFamilyName">Font family name</param>
+ /// <param name="textRange">Text range to which this change applies.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(SetFontFamilyName)(
+ __in_z WCHAR const* fontFamilyName,
+ DWRITE_TEXT_RANGE textRange
+ ) PURE;
+
+ /// <summary>
+ /// Set font weight.
+ /// </summary>
+ /// <param name="fontWeight">Font weight</param>
+ /// <param name="textRange">Text range to which this change applies.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(SetFontWeight)(
+ DWRITE_FONT_WEIGHT fontWeight,
+ DWRITE_TEXT_RANGE textRange
+ ) PURE;
+
+ /// <summary>
+ /// Set font style.
+ /// </summary>
+ /// <param name="fontStyle">Font style</param>
+ /// <param name="textRange">Text range to which this change applies.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(SetFontStyle)(
+ DWRITE_FONT_STYLE fontStyle,
+ DWRITE_TEXT_RANGE textRange
+ ) PURE;
+
+ /// <summary>
+ /// Set font stretch.
+ /// </summary>
+ /// <param name="fontStretch">font stretch</param>
+ /// <param name="textRange">Text range to which this change applies.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(SetFontStretch)(
+ DWRITE_FONT_STRETCH fontStretch,
+ DWRITE_TEXT_RANGE textRange
+ ) PURE;
+
+ /// <summary>
+ /// Set font em height.
+ /// </summary>
+ /// <param name="fontSize">Font em height</param>
+ /// <param name="textRange">Text range to which this change applies.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(SetFontSize)(
+ FLOAT fontSize,
+ DWRITE_TEXT_RANGE textRange
+ ) PURE;
+
+ /// <summary>
+ /// Set underline.
+ /// </summary>
+ /// <param name="hasUnderline">The Boolean flag indicates whether underline takes place</param>
+ /// <param name="textRange">Text range to which this change applies.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(SetUnderline)(
+ BOOL hasUnderline,
+ DWRITE_TEXT_RANGE textRange
+ ) PURE;
+
+ /// <summary>
+ /// Set strikethrough.
+ /// </summary>
+ /// <param name="hasStrikethrough">The Boolean flag indicates whether strikethrough takes place</param>
+ /// <param name="textRange">Text range to which this change applies.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(SetStrikethrough)(
+ BOOL hasStrikethrough,
+ DWRITE_TEXT_RANGE textRange
+ ) PURE;
+
+ /// <summary>
+ /// Set application-defined drawing effect.
+ /// </summary>
+ /// <param name="drawingEffect">Pointer to an application-defined drawing effect.</param>
+ /// <param name="textRange">Text range to which this change applies.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ /// <remarks>
+ /// This drawing effect is associated with the specified range and will be passed back
+ /// to the application via the callback when the range is drawn at drawing time.
+ /// </remarks>
+ STDMETHOD(SetDrawingEffect)(
+ IUnknown* drawingEffect,
+ DWRITE_TEXT_RANGE textRange
+ ) PURE;
+
+ /// <summary>
+ /// Set inline object.
+ /// </summary>
+ /// <param name="inlineObject">Pointer to an application-implemented inline object.</param>
+ /// <param name="textRange">Text range to which this change applies.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ /// <remarks>
+ /// This inline object applies to the specified range and will be passed back
+ /// to the application via the DrawInlineObject callback when the range is drawn.
+ /// Any text in that range will be suppressed.
+ /// </remarks>
+ STDMETHOD(SetInlineObject)(
+ IDWriteInlineObject* inlineObject,
+ DWRITE_TEXT_RANGE textRange
+ ) PURE;
+
+ /// <summary>
+ /// Set font typography features.
+ /// </summary>
+ /// <param name="typography">Pointer to font typography setting.</param>
+ /// <param name="textRange">Text range to which this change applies.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(SetTypography)(
+ IDWriteTypography* typography,
+ DWRITE_TEXT_RANGE textRange
+ ) PURE;
+
+ /// <summary>
+ /// Set locale name.
+ /// </summary>
+ /// <param name="localeName">Locale name</param>
+ /// <param name="textRange">Text range to which this change applies.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(SetLocaleName)(
+ __in_z WCHAR const* localeName,
+ DWRITE_TEXT_RANGE textRange
+ ) PURE;
+
+ /// <summary>
+ /// Get layout maximum width
+ /// </summary>
+ STDMETHOD_(FLOAT, GetMaxWidth)() PURE;
+
+ /// <summary>
+ /// Get layout maximum height
+ /// </summary>
+ STDMETHOD_(FLOAT, GetMaxHeight)() PURE;
+
+ /// <summary>
+ /// Get the font collection where the current position is at.
+ /// </summary>
+ /// <param name="currentPosition">The current text position.</param>
+ /// <param name="fontCollection">The current font collection</param>
+ /// <param name="textRange">Text range to which this change applies.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetFontCollection)(
+ UINT32 currentPosition,
+ __out IDWriteFontCollection** fontCollection,
+ __out_opt DWRITE_TEXT_RANGE* textRange = NULL
+ ) PURE;
+
+ /// <summary>
+ /// Get the length of the font family name where the current position is at.
+ /// </summary>
+ /// <param name="currentPosition">The current text position.</param>
+ /// <param name="nameLength">Size of the character array in character count not including the terminated NULL character.</param>
+ /// <param name="textRange">The position range of the current format.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetFontFamilyNameLength)(
+ UINT32 currentPosition,
+ __out UINT32* nameLength,
+ __out_opt DWRITE_TEXT_RANGE* textRange = NULL
+ ) PURE;
+
+ /// <summary>
+ /// Copy the font family name where the current position is at.
+ /// </summary>
+ /// <param name="currentPosition">The current text position.</param>
+ /// <param name="fontFamilyName">Character array that receives the current font family name</param>
+ /// <param name="nameSize">Size of the character array in character count including the terminated NULL character.</param>
+ /// <param name="textRange">The position range of the current format.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetFontFamilyName)(
+ UINT32 currentPosition,
+ __out_ecount_z(nameSize) WCHAR* fontFamilyName,
+ UINT32 nameSize,
+ __out_opt DWRITE_TEXT_RANGE* textRange = NULL
+ ) PURE;
+
+ /// <summary>
+ /// Get the font weight where the current position is at.
+ /// </summary>
+ /// <param name="currentPosition">The current text position.</param>
+ /// <param name="fontWeight">The current font weight</param>
+ /// <param name="textRange">The position range of the current format.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetFontWeight)(
+ UINT32 currentPosition,
+ __out DWRITE_FONT_WEIGHT* fontWeight,
+ __out_opt DWRITE_TEXT_RANGE* textRange = NULL
+ ) PURE;
+
+ /// <summary>
+ /// Get the font style where the current position is at.
+ /// </summary>
+ /// <param name="currentPosition">The current text position.</param>
+ /// <param name="fontStyle">The current font style</param>
+ /// <param name="textRange">The position range of the current format.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetFontStyle)(
+ UINT32 currentPosition,
+ __out DWRITE_FONT_STYLE* fontStyle,
+ __out_opt DWRITE_TEXT_RANGE* textRange = NULL
+ ) PURE;
+
+ /// <summary>
+ /// Get the font stretch where the current position is at.
+ /// </summary>
+ /// <param name="currentPosition">The current text position.</param>
+ /// <param name="fontStretch">The current font stretch</param>
+ /// <param name="textRange">The position range of the current format.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetFontStretch)(
+ UINT32 currentPosition,
+ __out DWRITE_FONT_STRETCH* fontStretch,
+ __out_opt DWRITE_TEXT_RANGE* textRange = NULL
+ ) PURE;
+
+ /// <summary>
+ /// Get the font em height where the current position is at.
+ /// </summary>
+ /// <param name="currentPosition">The current text position.</param>
+ /// <param name="fontSize">The current font em height</param>
+ /// <param name="textRange">The position range of the current format.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetFontSize)(
+ UINT32 currentPosition,
+ __out FLOAT* fontSize,
+ __out_opt DWRITE_TEXT_RANGE* textRange = NULL
+ ) PURE;
+
+ /// <summary>
+ /// Get the underline presence where the current position is at.
+ /// </summary>
+ /// <param name="currentPosition">The current text position.</param>
+ /// <param name="hasUnderline">The Boolean flag indicates whether text is underlined.</param>
+ /// <param name="textRange">The position range of the current format.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetUnderline)(
+ UINT32 currentPosition,
+ __out BOOL* hasUnderline,
+ __out_opt DWRITE_TEXT_RANGE* textRange = NULL
+ ) PURE;
+
+ /// <summary>
+ /// Get the strikethrough presence where the current position is at.
+ /// </summary>
+ /// <param name="currentPosition">The current text position.</param>
+ /// <param name="hasStrikethrough">The Boolean flag indicates whether text has strikethrough.</param>
+ /// <param name="textRange">The position range of the current format.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetStrikethrough)(
+ UINT32 currentPosition,
+ __out BOOL* hasStrikethrough,
+ __out_opt DWRITE_TEXT_RANGE* textRange = NULL
+ ) PURE;
+
+ /// <summary>
+ /// Get the application-defined drawing effect where the current position is at.
+ /// </summary>
+ /// <param name="currentPosition">The current text position.</param>
+ /// <param name="drawingEffect">The current application-defined drawing effect.</param>
+ /// <param name="textRange">The position range of the current format.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetDrawingEffect)(
+ UINT32 currentPosition,
+ __out IUnknown** drawingEffect,
+ __out_opt DWRITE_TEXT_RANGE* textRange = NULL
+ ) PURE;
+
+ /// <summary>
+ /// Get the inline object at the given position.
+ /// </summary>
+ /// <param name="currentPosition">The given text position.</param>
+ /// <param name="inlineObject">The inline object.</param>
+ /// <param name="textRange">The position range of the current format.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetInlineObject)(
+ UINT32 currentPosition,
+ __out IDWriteInlineObject** inlineObject,
+ __out_opt DWRITE_TEXT_RANGE* textRange = NULL
+ ) PURE;
+
+ /// <summary>
+ /// Get the typography setting where the current position is at.
+ /// </summary>
+ /// <param name="currentPosition">The current text position.</param>
+ /// <param name="typography">The current typography setting.</param>
+ /// <param name="textRange">The position range of the current format.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetTypography)(
+ UINT32 currentPosition,
+ __out IDWriteTypography** typography,
+ __out_opt DWRITE_TEXT_RANGE* textRange = NULL
+ ) PURE;
+
+ /// <summary>
+ /// Get the length of the locale name where the current position is at.
+ /// </summary>
+ /// <param name="currentPosition">The current text position.</param>
+ /// <param name="nameLength">Size of the character array in character count not including the terminated NULL character.</param>
+ /// <param name="textRange">The position range of the current format.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetLocaleNameLength)(
+ UINT32 currentPosition,
+ __out UINT32* nameLength,
+ __out_opt DWRITE_TEXT_RANGE* textRange = NULL
+ ) PURE;
+
+ /// <summary>
+ /// Get the locale name where the current position is at.
+ /// </summary>
+ /// <param name="currentPosition">The current text position.</param>
+ /// <param name="localeName">Character array that receives the current locale name</param>
+ /// <param name="nameSize">Size of the character array in character count including the terminated NULL character.</param>
+ /// <param name="textRange">The position range of the current format.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetLocaleName)(
+ UINT32 currentPosition,
+ __out_ecount_z(nameSize) WCHAR* localeName,
+ UINT32 nameSize,
+ __out_opt DWRITE_TEXT_RANGE* textRange = NULL
+ ) PURE;
+
+ /// <summary>
+ /// Initiate drawing of the text.
+ /// </summary>
+ /// <param name="clientDrawingContext">An application defined value
+ /// included in rendering callbacks.</param>
+ /// <param name="renderer">The set of application-defined callbacks that do
+ /// the actual rendering.</param>
+ /// <param name="originX">X-coordinate of the layout's left side.</param>
+ /// <param name="originY">Y-coordinate of the layout's top side.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(Draw)(
+ __maybenull void* clientDrawingContext,
+ IDWriteTextRenderer* renderer,
+ FLOAT originX,
+ FLOAT originY
+ ) PURE;
+
+ /// <summary>
+ /// GetLineMetrics returns properties of each line.
+ /// </summary>
+ /// <param name="lineMetrics">The array to fill with line information.</param>
+ /// <param name="maxLineCount">The maximum size of the lineMetrics array.</param>
+ /// <param name="actualLineCount">The actual size of the lineMetrics
+ /// array that is needed.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ /// <remarks>
+ /// If maxLineCount is not large enough E_NOT_SUFFICIENT_BUFFER,
+ /// which is equivalent to HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER),
+ /// is returned and *actualLineCount is set to the number of lines
+ /// needed.
+ /// </remarks>
+ STDMETHOD(GetLineMetrics)(
+ __out_ecount_opt(maxLineCount) DWRITE_LINE_METRICS* lineMetrics,
+ UINT32 maxLineCount,
+ __out UINT32* actualLineCount
+ ) PURE;
+
+ /// <summary>
+ /// GetMetrics retrieves overall metrics for the formatted string.
+ /// </summary>
+ /// <param name="textMetrics">The returned metrics.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ /// <remarks>
+ /// Drawing effects like underline and strikethrough do not contribute
+ /// to the text size, which is essentially the sum of advance widths and
+ /// line heights. Additionally, visible swashes and other graphic
+ /// adornments may extend outside the returned width and height.
+ /// </remarks>
+ STDMETHOD(GetMetrics)(
+ __out DWRITE_TEXT_METRICS* textMetrics
+ ) PURE;
+
+ /// <summary>
+ /// GetOverhangMetrics returns the overhangs (in DIPs) of the layout and all
+ /// objects contained in it, including text glyphs and inline objects.
+ /// </summary>
+ /// <param name="overhangs">Overshoots of visible extents (in DIPs) outside the layout.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ /// <remarks>
+ /// Any underline and strikethrough do not contribute to the black box
+ /// determination, since these are actually drawn by the renderer, which
+ /// is allowed to draw them in any variety of styles.
+ /// </remarks>
+ STDMETHOD(GetOverhangMetrics)(
+ __out DWRITE_OVERHANG_METRICS* overhangs
+ ) PURE;
+
+ /// <summary>
+ /// Retrieve logical properties and measurement of each cluster.
+ /// </summary>
+ /// <param name="clusterMetrics">The array to fill with cluster information.</param>
+ /// <param name="maxClusterCount">The maximum size of the clusterMetrics array.</param>
+ /// <param name="actualClusterCount">The actual size of the clusterMetrics array that is needed.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ /// <remarks>
+ /// If maxClusterCount is not large enough E_NOT_SUFFICIENT_BUFFER,
+ /// which is equivalent to HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER),
+ /// is returned and *actualClusterCount is set to the number of clusters
+ /// needed.
+ /// </remarks>
+ STDMETHOD(GetClusterMetrics)(
+ __out_ecount_opt(maxClusterCount) DWRITE_CLUSTER_METRICS* clusterMetrics,
+ UINT32 maxClusterCount,
+ __out UINT32* actualClusterCount
+ ) PURE;
+
+ /// <summary>
+ /// Determines the minimum possible width the layout can be set to without
+ /// emergency breaking between the characters of whole words.
+ /// </summary>
+ /// <param name="minWidth">Minimum width.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(DetermineMinWidth)(
+ __out FLOAT* minWidth
+ ) PURE;
+
+ /// <summary>
+ /// Given a coordinate (in DIPs) relative to the top-left of the layout box,
+ /// this returns the corresponding hit-test metrics of the text string where
+ /// the hit-test has occurred. This is useful for mapping mouse clicks to caret
+ /// positions. When the given coordinate is outside the text string, the function
+ /// sets the output value *isInside to false but returns the nearest character
+ /// position.
+ /// </summary>
+ /// <param name="pointX">X coordinate to hit-test, relative to the top-left location of the layout box.</param>
+ /// <param name="pointY">Y coordinate to hit-test, relative to the top-left location of the layout box.</param>
+ /// <param name="isTrailingHit">Output flag indicating whether the hit-test location is at the leading or the trailing
+ /// side of the character. When the output *isInside value is set to false, this value is set according to the output
+ /// *position value to represent the edge closest to the hit-test location. </param>
+ /// <param name="isInside">Output flag indicating whether the hit-test location is inside the text string.
+ /// When false, the position nearest the text's edge is returned.</param>
+ /// <param name="hitTestMetrics">Output geometry fully enclosing the hit-test location. When the output *isInside value
+ /// is set to false, this structure represents the geometry enclosing the edge closest to the hit-test location.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(HitTestPoint)(
+ FLOAT pointX,
+ FLOAT pointY,
+ __out BOOL* isTrailingHit,
+ __out BOOL* isInside,
+ __out DWRITE_HIT_TEST_METRICS* hitTestMetrics
+ ) PURE;
+
+ /// <summary>
+ /// Given a text position and whether the caret is on the leading or trailing
+ /// edge of that position, this returns the corresponding coordinate (in DIPs)
+ /// relative to the top-left of the layout box. This is most useful for drawing
+ /// the caret's current position, but it could also be used to anchor an IME to the
+ /// typed text or attach a floating menu near the point of interest. It may also be
+ /// used to programmatically obtain the geometry of a particular text position
+ /// for UI automation.
+ /// </summary>
+ /// <param name="textPosition">Text position to get the coordinate of.</param>
+ /// <param name="isTrailingHit">Flag indicating whether the location is of the leading or the trailing side of the specified text position. </param>
+ /// <param name="pointX">Output caret X, relative to the top-left of the layout box.</param>
+ /// <param name="pointY">Output caret Y, relative to the top-left of the layout box.</param>
+ /// <param name="hitTestMetrics">Output geometry fully enclosing the specified text position.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ /// <remarks>
+ /// When drawing a caret at the returned X,Y, it should should be centered on X
+ /// and drawn from the Y coordinate down. The height will be the size of the
+ /// hit-tested text (which can vary in size within a line).
+ /// Reading direction also affects which side of the character the caret is drawn.
+ /// However, the returned X coordinate will be correct for either case.
+ /// You can get a text length back that is larger than a single character.
+ /// This happens for complex scripts when multiple characters form a single cluster,
+ /// when diacritics join their base character, or when you test a surrogate pair.
+ /// </remarks>
+ STDMETHOD(HitTestTextPosition)(
+ UINT32 textPosition,
+ BOOL isTrailingHit,
+ __out FLOAT* pointX,
+ __out FLOAT* pointY,
+ __out DWRITE_HIT_TEST_METRICS* hitTestMetrics
+ ) PURE;
+
+ /// <summary>
+ /// The application calls this function to get a set of hit-test metrics
+ /// corresponding to a range of text positions. The main usage for this
+ /// is to draw highlighted selection of the text string.
+ ///
+ /// The function returns E_NOT_SUFFICIENT_BUFFER, which is equivalent to
+ /// HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER), when the buffer size of
+ /// hitTestMetrics is too small to hold all the regions calculated by the
+ /// function. In such situation, the function sets the output value
+ /// *actualHitTestMetricsCount to the number of geometries calculated.
+ /// The application is responsible to allocate a new buffer of greater
+ /// size and call the function again.
+ ///
+ /// A good value to use as an initial value for maxHitTestMetricsCount may
+ /// be calculated from the following equation:
+ /// maxHitTestMetricsCount = lineCount * maxBidiReorderingDepth
+ ///
+ /// where lineCount is obtained from the value of the output argument
+ /// *actualLineCount from the function IDWriteTextLayout::GetLineMetrics,
+ /// and the maxBidiReorderingDepth value from the DWRITE_TEXT_METRICS
+ /// structure of the output argument *textMetrics from the function
+ /// IDWriteFactory::CreateTextLayout.
+ /// </summary>
+ /// <param name="textPosition">First text position of the specified range.</param>
+ /// <param name="textLength">Number of positions of the specified range.</param>
+ /// <param name="originX">Offset of the X origin (left of the layout box) which is added to each of the hit-test metrics returned.</param>
+ /// <param name="originY">Offset of the Y origin (top of the layout box) which is added to each of the hit-test metrics returned.</param>
+ /// <param name="hitTestMetrics">Pointer to a buffer of the output geometry fully enclosing the specified position range.</param>
+ /// <param name="maxHitTestMetricsCount">Maximum number of distinct metrics it could hold in its buffer memory.</param>
+ /// <param name="actualHitTestMetricsCount">Actual number of metrics returned or needed.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ /// <remarks>
+ /// There are no gaps in the returned metrics. While there could be visual gaps,
+ /// depending on bidi ordering, each range is contiguous and reports all the text,
+ /// including any hidden characters and trimmed text.
+ /// The height of each returned range will be the same within each line, regardless
+ /// of how the font sizes vary.
+ /// </remarks>
+ STDMETHOD(HitTestTextRange)(
+ UINT32 textPosition,
+ UINT32 textLength,
+ FLOAT originX,
+ FLOAT originY,
+ __out_ecount_opt(maxHitTestMetricsCount) DWRITE_HIT_TEST_METRICS* hitTestMetrics,
+ UINT32 maxHitTestMetricsCount,
+ __out UINT32* actualHitTestMetricsCount
+ ) PURE;
+};
+
+/// <summary>
+/// Encapsulates a 32-bit device independent bitmap and device context, which can be used for rendering glyphs.
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("5e5a32a3-8dff-4773-9ff6-0696eab77267") IDWriteBitmapRenderTarget : public IUnknown
+{
+ /// <summary>
+ /// Draws a run of glyphs to the bitmap.
+ /// </summary>
+ /// <param name="baselineOriginX">Horizontal position of the baseline origin, in DIPs, relative to the upper-left corner of the DIB.</param>
+ /// <param name="baselineOriginY">Vertical position of the baseline origin, in DIPs, relative to the upper-left corner of the DIB.</param>
+ /// <param name="measuringMode">Specifies measuring method for glyphs in the run.
+ /// Renderer implementations may choose different rendering modes for different measuring methods, for example
+ /// DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL for DWRITE_MEASURING_MODE_NATURAL,
+ /// DWRITE_RENDERING_MODE_CLEARTYPE_GDI_CLASSIC for DWRITE_MEASURING_MODE_GDI_CLASSIC, and
+ /// DWRITE_RENDERING_MODE_CLEARTYPE_GDI_NATURAL for DWRITE_MEASURING_MODE_GDI_NATURAL.
+ /// </param>
+ /// <param name="glyphRun">Structure containing the properties of the glyph run.</param>
+ /// <param name="renderingParams">Object that controls rendering behavior.</param>
+ /// <param name="textColor">Specifies the foreground color of the text.</param>
+ /// <param name="blackBoxRect">Optional rectangle that receives the bounding box (in pixels not DIPs) of all the pixels affected by
+ /// drawing the glyph run. The black box rectangle may extend beyond the dimensions of the bitmap.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(DrawGlyphRun)(
+ FLOAT baselineOriginX,
+ FLOAT baselineOriginY,
+ DWRITE_MEASURING_MODE measuringMode,
+ __in DWRITE_GLYPH_RUN const* glyphRun,
+ IDWriteRenderingParams* renderingParams,
+ COLORREF textColor,
+ __out_opt RECT* blackBoxRect = NULL
+ ) PURE;
+
+ /// <summary>
+ /// Gets a handle to the memory device context.
+ /// </summary>
+ /// <returns>
+ /// Returns the device context handle.
+ /// </returns>
+ /// <remarks>
+ /// An application can use the device context to draw using GDI functions. An application can obtain the bitmap handle
+ /// (HBITMAP) by calling GetCurrentObject. An application that wants information about the underlying bitmap, including
+ /// a pointer to the pixel data, can call GetObject to fill in a DIBSECTION structure. The bitmap is always a 32-bit
+ /// top-down DIB.
+ /// </remarks>
+ STDMETHOD_(HDC, GetMemoryDC)() PURE;
+
+ /// <summary>
+ /// Gets the number of bitmap pixels per DIP. A DIP (device-independent pixel) is 1/96 inch so this value is the number
+ /// if pixels per inch divided by 96.
+ /// </summary>
+ /// <returns>
+ /// Returns the number of bitmap pixels per DIP.
+ /// </returns>
+ STDMETHOD_(FLOAT, GetPixelsPerDip)() PURE;
+
+ /// <summary>
+ /// Sets the number of bitmap pixels per DIP. A DIP (device-independent pixel) is 1/96 inch so this value is the number
+ /// if pixels per inch divided by 96.
+ /// </summary>
+ /// <param name="pixelsPerDip">Specifies the number of pixels per DIP.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(SetPixelsPerDip)(
+ FLOAT pixelsPerDip
+ ) PURE;
+
+ /// <summary>
+ /// Gets the transform that maps abstract coordinate to DIPs. By default this is the identity
+ /// transform. Note that this is unrelated to the world transform of the underlying device
+ /// context.
+ /// </summary>
+ /// <param name="transform">Receives the transform.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetCurrentTransform)(
+ __out DWRITE_MATRIX* transform
+ ) PURE;
+
+ /// <summary>
+ /// Sets the transform that maps abstract coordinate to DIPs. This does not affect the world
+ /// transform of the underlying device context.
+ /// </summary>
+ /// <param name="transform">Specifies the new transform. This parameter can be NULL, in which
+ /// case the identity transform is implied.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(SetCurrentTransform)(
+ __in_opt DWRITE_MATRIX const* transform
+ ) PURE;
+
+ /// <summary>
+ /// Gets the dimensions of the bitmap.
+ /// </summary>
+ /// <param name="size">Receives the size of the bitmap in pixels.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetSize)(
+ __out SIZE* size
+ ) PURE;
+
+ /// <summary>
+ /// Resizes the bitmap.
+ /// </summary>
+ /// <param name="width">New bitmap width, in pixels.</param>
+ /// <param name="height">New bitmap height, in pixels.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(Resize)(
+ UINT32 width,
+ UINT32 height
+ ) PURE;
+};
+
+/// <summary>
+/// The GDI interop interface provides interoperability with GDI.
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("1edd9491-9853-4299-898f-6432983b6f3a") IDWriteGdiInterop : public IUnknown
+{
+ /// <summary>
+ /// Creates a font object that matches the properties specified by the LOGFONT structure.
+ /// </summary>
+ /// <param name="logFont">Structure containing a GDI-compatible font description.</param>
+ /// <param name="font">Receives a newly created font object if successful, or NULL in case of error.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(CreateFontFromLOGFONT)(
+ __in LOGFONTW const* logFont,
+ __out IDWriteFont** font
+ ) PURE;
+
+ /// <summary>
+ /// Initializes a LOGFONT structure based on the GDI-compatible properties of the specified font.
+ /// </summary>
+ /// <param name="font">Specifies a font in the system font collection.</param>
+ /// <param name="logFont">Structure that receives a GDI-compatible font description.</param>
+ /// <param name="isSystemFont">Contains TRUE if the specified font object is part of the system font collection
+ /// or FALSE otherwise.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(ConvertFontToLOGFONT)(
+ IDWriteFont* font,
+ __out LOGFONTW* logFont,
+ __out BOOL* isSystemFont
+ ) PURE;
+
+ /// <summary>
+ /// Initializes a LOGFONT structure based on the GDI-compatible properties of the specified font.
+ /// </summary>
+ /// <param name="font">Specifies a font face.</param>
+ /// <param name="logFont">Structure that receives a GDI-compatible font description.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(ConvertFontFaceToLOGFONT)(
+ IDWriteFontFace* font,
+ __out LOGFONTW* logFont
+ ) PURE;
+
+ /// <summary>
+ /// Creates a font face object that corresponds to the currently selected HFONT.
+ /// </summary>
+ /// <param name="hdc">Handle to a device context into which a font has been selected. It is assumed that the client
+ /// has already performed font mapping and that the font selected into the DC is the actual font that would be used
+ /// for rendering glyphs.</param>
+ /// <param name="fontFace">Contains the newly created font face object, or NULL in case of failure.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(CreateFontFaceFromHdc)(
+ HDC hdc,
+ __out IDWriteFontFace** fontFace
+ ) PURE;
+
+ /// <summary>
+ /// Creates an object that encapsulates a bitmap and memory DC which can be used for rendering glyphs.
+ /// </summary>
+ /// <param name="hdc">Optional device context used to create a compatible memory DC.</param>
+ /// <param name="width">Width of the bitmap.</param>
+ /// <param name="height">Height of the bitmap.</param>
+ /// <param name="renderTarget">Receives a pointer to the newly created render target.</param>
+ STDMETHOD(CreateBitmapRenderTarget)(
+ __in_opt HDC hdc,
+ UINT32 width,
+ UINT32 height,
+ __out IDWriteBitmapRenderTarget** renderTarget
+ ) PURE;
+};
+
+/// <summary>
+/// The DWRITE_TEXTURE_TYPE enumeration identifies a type of alpha texture. An alpha texture is a bitmap of alpha values, each
+/// representing the darkness (i.e., opacity) of a pixel or subpixel.
+/// </summary>
+enum DWRITE_TEXTURE_TYPE
+{
+ /// <summary>
+ /// Specifies an alpha texture for aliased text rendering (i.e., bi-level, where each pixel is either fully opaque or fully transparent),
+ /// with one byte per pixel.
+ /// </summary>
+ DWRITE_TEXTURE_ALIASED_1x1,
+
+ /// <summary>
+ /// Specifies an alpha texture for ClearType text rendering, with three bytes per pixel in the horizontal dimension and
+ /// one byte per pixel in the vertical dimension.
+ /// </summary>
+ DWRITE_TEXTURE_CLEARTYPE_3x1
+};
+
+/// <summary>
+/// Maximum alpha value in a texture returned by IDWriteGlyphRunAnalysis::CreateAlphaTexture.
+/// </summary>
+#define DWRITE_ALPHA_MAX 255
+
+/// <summary>
+/// Interface that encapsulates information used to render a glyph run.
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("7d97dbf7-e085-42d4-81e3-6a883bded118") IDWriteGlyphRunAnalysis : public IUnknown
+{
+ /// <summary>
+ /// Gets the bounding rectangle of the physical pixels affected by the glyph run.
+ /// </summary>
+ /// <param name="textureType">Specifies the type of texture requested. If a bi-level texture is requested, the
+ /// bounding rectangle includes only bi-level glyphs. Otherwise, the bounding rectangle includes only anti-aliased
+ /// glyphs.</param>
+ /// <param name="textureBounds">Receives the bounding rectangle, or an empty rectangle if there are no glyphs
+ /// if the specified type.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetAlphaTextureBounds)(
+ DWRITE_TEXTURE_TYPE textureType,
+ __out RECT* textureBounds
+ ) PURE;
+
+ /// <summary>
+ /// Creates an alpha texture of the specified type.
+ /// </summary>
+ /// <param name="textureType">Specifies the type of texture requested. If a bi-level texture is requested, the
+ /// texture contains only bi-level glyphs. Otherwise, the texture contains only anti-aliased glyphs.</param>
+ /// <param name="textureBounds">Specifies the bounding rectangle of the texture, which can be different than
+ /// the bounding rectangle returned by GetAlphaTextureBounds.</param>
+ /// <param name="alphaValues">Receives the array of alpha values.</param>
+ /// <param name="bufferSize">Size of the alphaValues array. The minimum size depends on the dimensions of the
+ /// rectangle and the type of texture requested.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(CreateAlphaTexture)(
+ DWRITE_TEXTURE_TYPE textureType,
+ __in RECT const* textureBounds,
+ __out_bcount(bufferSize) BYTE* alphaValues,
+ UINT32 bufferSize
+ ) PURE;
+
+ /// <summary>
+ /// Gets properties required for ClearType blending.
+ /// </summary>
+ /// <param name="renderingParams">Rendering parameters object. In most cases, the values returned in the output
+ /// parameters are based on the properties of this object. The exception is if a GDI-compatible rendering mode
+ /// is specified.</param>
+ /// <param name="blendGamma">Receives the gamma value to use for gamma correction.</param>
+ /// <param name="blendEnhancedContrast">Receives the enhanced contrast value.</param>
+ /// <param name="blendClearTypeLevel">Receives the ClearType level.</param>
+ STDMETHOD(GetAlphaBlendParams)(
+ IDWriteRenderingParams* renderingParams,
+ __out FLOAT* blendGamma,
+ __out FLOAT* blendEnhancedContrast,
+ __out FLOAT* blendClearTypeLevel
+ ) PURE;
+};
+
+/// <summary>
+/// The root factory interface for all DWrite objects.
+/// </summary>
+interface DWRITE_DECLARE_INTERFACE("b859ee5a-d838-4b5b-a2e8-1adc7d93db48") IDWriteFactory : public IUnknown
+{
+ /// <summary>
+ /// Gets a font collection representing the set of installed fonts.
+ /// </summary>
+ /// <param name="fontCollection">Receives a pointer to the system font collection object, or NULL in case of failure.</param>
+ /// <param name="checkForUpdates">If this parameter is nonzero, the function performs an immediate check for changes to the set of
+ /// installed fonts. If this parameter is FALSE, the function will still detect changes if the font cache service is running, but
+ /// there may be some latency. For example, an application might specify TRUE if it has itself just installed a font and wants to
+ /// be sure the font collection contains that font.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetSystemFontCollection)(
+ __out IDWriteFontCollection** fontCollection,
+ BOOL checkForUpdates = FALSE
+ ) PURE;
+
+ /// <summary>
+ /// Creates a font collection using a custom font collection loader.
+ /// </summary>
+ /// <param name="collectionLoader">Application-defined font collection loader, which must have been previously
+ /// registered using RegisterFontCollectionLoader.</param>
+ /// <param name="collectionKey">Key used by the loader to identify a collection of font files.</param>
+ /// <param name="collectionKeySize">Size in bytes of the collection key.</param>
+ /// <param name="fontCollection">Receives a pointer to the system font collection object, or NULL in case of failure.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(CreateCustomFontCollection)(
+ IDWriteFontCollectionLoader* collectionLoader,
+ __in_bcount(collectionKeySize) void const* collectionKey,
+ UINT32 collectionKeySize,
+ __out IDWriteFontCollection** fontCollection
+ ) PURE;
+
+ /// <summary>
+ /// Registers a custom font collection loader with the factory object.
+ /// </summary>
+ /// <param name="fontCollectionLoader">Application-defined font collection loader.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(RegisterFontCollectionLoader)(
+ IDWriteFontCollectionLoader* fontCollectionLoader
+ ) PURE;
+
+ /// <summary>
+ /// Unregisters a custom font collection loader that was previously registered using RegisterFontCollectionLoader.
+ /// </summary>
+ /// <param name="fontCollectionLoader">Application-defined font collection loader.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(UnregisterFontCollectionLoader)(
+ IDWriteFontCollectionLoader* fontCollectionLoader
+ ) PURE;
+
+ /// <summary>
+ /// CreateFontFileReference creates a font file reference object from a local font file.
+ /// </summary>
+ /// <param name="filePath">Absolute file path. Subsequent operations on the constructed object may fail
+ /// if the user provided filePath doesn't correspond to a valid file on the disk.</param>
+ /// <param name="lastWriteTime">Last modified time of the input file path. If the parameter is omitted,
+ /// the function will access the font file to obtain its last write time, so the clients are encouraged to specify this value
+ /// to avoid extra disk access. Subsequent operations on the constructed object may fail
+ /// if the user provided lastWriteTime doesn't match the file on the disk.</param>
+ /// <param name="fontFile">Contains newly created font file reference object, or NULL in case of failure.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(CreateFontFileReference)(
+ __in_z WCHAR const* filePath,
+ __in_opt FILETIME const* lastWriteTime,
+ __out IDWriteFontFile** fontFile
+ ) PURE;
+
+ /// <summary>
+ /// CreateCustomFontFileReference creates a reference to an application specific font file resource.
+ /// This function enables an application or a document to use a font without having to install it on the system.
+ /// The fontFileReferenceKey has to be unique only in the scope of the fontFileLoader used in this call.
+ /// </summary>
+ /// <param name="fontFileReferenceKey">Font file reference key that uniquely identifies the font file resource
+ /// during the lifetime of fontFileLoader.</param>
+ /// <param name="fontFileReferenceKeySize">Size of font file reference key in bytes.</param>
+ /// <param name="fontFileLoader">Font file loader that will be used by the font system to load data from the file identified by
+ /// fontFileReferenceKey.</param>
+ /// <param name="fontFile">Contains the newly created font file object, or NULL in case of failure.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ /// <remarks>
+ /// This function is provided for cases when an application or a document needs to use a font
+ /// without having to install it on the system. fontFileReferenceKey has to be unique only in the scope
+ /// of the fontFileLoader used in this call.
+ /// </remarks>
+ STDMETHOD(CreateCustomFontFileReference)(
+ __in_bcount(fontFileReferenceKeySize) void const* fontFileReferenceKey,
+ UINT32 fontFileReferenceKeySize,
+ IDWriteFontFileLoader* fontFileLoader,
+ __out IDWriteFontFile** fontFile
+ ) PURE;
+
+ /// <summary>
+ /// Creates a font face object.
+ /// </summary>
+ /// <param name="fontFaceType">The file format of the font face.</param>
+ /// <param name="numberOfFiles">The number of font files require to represent the font face.</param>
+ /// <param name="fontFiles">Font files representing the font face. Since IDWriteFontFace maintains its own references
+ /// to the input font file objects, it's OK to release them after this call.</param>
+ /// <param name="faceIndex">The zero based index of a font face in cases when the font files contain a collection of font faces.
+ /// If the font files contain a single face, this value should be zero.</param>
+ /// <param name="fontFaceSimulationFlags">Font face simulation flags for algorithmic emboldening and italicization.</param>
+ /// <param name="fontFace">Contains the newly created font face object, or NULL in case of failure.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(CreateFontFace)(
+ DWRITE_FONT_FACE_TYPE fontFaceType,
+ UINT32 numberOfFiles,
+ __in_ecount(numberOfFiles) IDWriteFontFile* const* fontFiles,
+ UINT32 faceIndex,
+ DWRITE_FONT_SIMULATIONS fontFaceSimulationFlags,
+ __out IDWriteFontFace** fontFace
+ ) PURE;
+
+ /// <summary>
+ /// Creates a rendering parameters object with default settings for the primary monitor.
+ /// </summary>
+ /// <param name="renderingParams">Holds the newly created rendering parameters object, or NULL in case of failure.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(CreateRenderingParams)(
+ __out IDWriteRenderingParams** renderingParams
+ ) PURE;
+
+ /// <summary>
+ /// Creates a rendering parameters object with default settings for the specified monitor.
+ /// </summary>
+ /// <param name="monitor">The monitor to read the default values from.</param>
+ /// <param name="renderingParams">Holds the newly created rendering parameters object, or NULL in case of failure.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(CreateMonitorRenderingParams)(
+ HMONITOR monitor,
+ __out IDWriteRenderingParams** renderingParams
+ ) PURE;
+
+ /// <summary>
+ /// Creates a rendering parameters object with the specified properties.
+ /// </summary>
+ /// <param name="gamma">The gamma value used for gamma correction, which must be greater than zero and cannot exceed 256.</param>
+ /// <param name="enhancedContrast">The amount of contrast enhancement, zero or greater.</param>
+ /// <param name="clearTypeLevel">The degree of ClearType level, from 0.0f (no ClearType) to 1.0f (full ClearType).</param>
+ /// <param name="pixelGeometry">The geometry of a device pixel.</param>
+ /// <param name="renderingMode">Method of rendering glyphs. In most cases, this should be DWRITE_RENDERING_MODE_DEFAULT to automatically use an appropriate mode.</param>
+ /// <param name="renderingParams">Holds the newly created rendering parameters object, or NULL in case of failure.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(CreateCustomRenderingParams)(
+ FLOAT gamma,
+ FLOAT enhancedContrast,
+ FLOAT clearTypeLevel,
+ DWRITE_PIXEL_GEOMETRY pixelGeometry,
+ DWRITE_RENDERING_MODE renderingMode,
+ __out IDWriteRenderingParams** renderingParams
+ ) PURE;
+
+ /// <summary>
+ /// Registers a font file loader with DirectWrite.
+ /// </summary>
+ /// <param name="fontFileLoader">Pointer to the implementation of the IDWriteFontFileLoader for a particular file resource type.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ /// <remarks>
+ /// This function registers a font file loader with DirectWrite.
+ /// Font file loader interface handles loading font file resources of a particular type from a key.
+ /// The font file loader interface is recommended to be implemented by a singleton object.
+ /// A given instance can only be registered once.
+ /// Succeeding attempts will return an error that it has already been registered.
+ /// IMPORTANT: font file loader implementations must not register themselves with DirectWrite
+ /// inside their constructors and must not unregister themselves in their destructors, because
+ /// registration and unregistraton operations increment and decrement the object reference count respectively.
+ /// Instead, registration and unregistration of font file loaders with DirectWrite should be performed
+ /// outside of the font file loader implementation as a separate step.
+ /// </remarks>
+ STDMETHOD(RegisterFontFileLoader)(
+ IDWriteFontFileLoader* fontFileLoader
+ ) PURE;
+
+ /// <summary>
+ /// Unregisters a font file loader that was previously registered with the DirectWrite font system using RegisterFontFileLoader.
+ /// </summary>
+ /// <param name="fontFileLoader">Pointer to the file loader that was previously registered with the DirectWrite font system using RegisterFontFileLoader.</param>
+ /// <returns>
+ /// This function will succeed if the user loader is requested to be removed.
+ /// It will fail if the pointer to the file loader identifies a standard DirectWrite loader,
+ /// or a loader that is never registered or has already been unregistered.
+ /// </returns>
+ /// <remarks>
+ /// This function unregisters font file loader callbacks with the DirectWrite font system.
+ /// The font file loader interface is recommended to be implemented by a singleton object.
+ /// IMPORTANT: font file loader implementations must not register themselves with DirectWrite
+ /// inside their constructors and must not unregister themselves in their destructors, because
+ /// registration and unregistraton operations increment and decrement the object reference count respectively.
+ /// Instead, registration and unregistration of font file loaders with DirectWrite should be performed
+ /// outside of the font file loader implementation as a separate step.
+ /// </remarks>
+ STDMETHOD(UnregisterFontFileLoader)(
+ IDWriteFontFileLoader* fontFileLoader
+ ) PURE;
+
+ /// <summary>
+ /// Create a text format object used for text layout.
+ /// </summary>
+ /// <param name="fontFamilyName">Name of the font family</param>
+ /// <param name="fontCollection">Font collection. NULL indicates the system font collection.</param>
+ /// <param name="fontWeight">Font weight</param>
+ /// <param name="fontStyle">Font style</param>
+ /// <param name="fontStretch">Font stretch</param>
+ /// <param name="fontSize">Logical size of the font in DIP units. A DIP ("device-independent pixel") equals 1/96 inch.</param>
+ /// <param name="localeName">Locale name</param>
+ /// <param name="textFormat">Contains newly created text format object, or NULL in case of failure.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(CreateTextFormat)(
+ __in_z WCHAR const* fontFamilyName,
+ __maybenull IDWriteFontCollection* fontCollection,
+ DWRITE_FONT_WEIGHT fontWeight,
+ DWRITE_FONT_STYLE fontStyle,
+ DWRITE_FONT_STRETCH fontStretch,
+ FLOAT fontSize,
+ __in_z WCHAR const* localeName,
+ __out IDWriteTextFormat** textFormat
+ ) PURE;
+
+ /// <summary>
+ /// Create a typography object used in conjunction with text format for text layout.
+ /// </summary>
+ /// <param name="typography">Contains newly created typography object, or NULL in case of failure.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(CreateTypography)(
+ __out IDWriteTypography** typography
+ ) PURE;
+
+ /// <summary>
+ /// Create an object used for interoperability with GDI.
+ /// </summary>
+ /// <param name="gdiInterop">Receives the GDI interop object if successful, or NULL in case of failure.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(GetGdiInterop)(
+ __out IDWriteGdiInterop** gdiInterop
+ ) PURE;
+
+ /// <summary>
+ /// CreateTextLayout takes a string, format, and associated constraints
+ /// and produces and object representing the fully analyzed
+ /// and formatted result.
+ /// </summary>
+ /// <param name="string">The string to layout.</param>
+ /// <param name="stringLength">The length of the string.</param>
+ /// <param name="textFormat">The format to apply to the string.</param>
+ /// <param name="maxWidth">Width of the layout box.</param>
+ /// <param name="maxHeight">Height of the layout box.</param>
+ /// <param name="textLayout">The resultant object.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(CreateTextLayout)(
+ __in_ecount(stringLength) WCHAR const* string,
+ UINT32 stringLength,
+ IDWriteTextFormat* textFormat,
+ FLOAT maxWidth,
+ FLOAT maxHeight,
+ __out IDWriteTextLayout** textLayout
+ ) PURE;
+
+ /// <summary>
+ /// CreateGdiCompatibleTextLayout takes a string, format, and associated constraints
+ /// and produces and object representing the result formatted for a particular display resolution
+ /// and measuring method. The resulting text layout should only be used for the intended resolution,
+ /// and for cases where text scalability is desired, CreateTextLayout should be used instead.
+ /// </summary>
+ /// <param name="string">The string to layout.</param>
+ /// <param name="stringLength">The length of the string.</param>
+ /// <param name="textFormat">The format to apply to the string.</param>
+ /// <param name="layoutWidth">Width of the layout box.</param>
+ /// <param name="layoutHeight">Height of the layout box.</param>
+ /// <param name="pixelsPerDip">Number of physical pixels per DIP. For example, if rendering onto a 96 DPI device then pixelsPerDip
+ /// is 1. If rendering onto a 120 DPI device then pixelsPerDip is 120/96.</param>
+ /// <param name="transform">Optional transform applied to the glyphs and their positions. This transform is applied after the
+ /// scaling specified the font size and pixelsPerDip.</param>
+ /// <param name="useGdiNatural">
+ /// When set to FALSE, instructs the text layout to use the same metrics as GDI aliased text.
+ /// When set to TRUE, instructs the text layout to use the same metrics as text measured by GDI using a font
+ /// created with CLEARTYPE_NATURAL_QUALITY.
+ /// </param>
+ /// <param name="textLayout">The resultant object.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(CreateGdiCompatibleTextLayout)(
+ __in_ecount(stringLength) WCHAR const* string,
+ UINT32 stringLength,
+ IDWriteTextFormat* textFormat,
+ FLOAT layoutWidth,
+ FLOAT layoutHeight,
+ FLOAT pixelsPerDip,
+ __in_opt DWRITE_MATRIX const* transform,
+ BOOL useGdiNatural,
+ __out IDWriteTextLayout** textLayout
+ ) PURE;
+
+ /// <summary>
+ /// The application may call this function to create an inline object for trimming, using an ellipsis as the omission sign.
+ /// The ellipsis will be created using the current settings of the format, including base font, style, and any effects.
+ /// Alternate omission signs can be created by the application by implementing IDWriteInlineObject.
+ /// </summary>
+ /// <param name="textFormat">Text format used as a template for the omission sign.</param>
+ /// <param name="trimmingSign">Created omission sign.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(CreateEllipsisTrimmingSign)(
+ IDWriteTextFormat* textFormat,
+ __out IDWriteInlineObject** trimmingSign
+ ) PURE;
+
+ /// <summary>
+ /// Return an interface to perform text analysis with.
+ /// </summary>
+ /// <param name="textAnalyzer">The resultant object.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(CreateTextAnalyzer)(
+ __out IDWriteTextAnalyzer** textAnalyzer
+ ) PURE;
+
+ /// <summary>
+ /// Creates a number substitution object using a locale name,
+ /// substitution method, and whether to ignore user overrides (uses NLS
+ /// defaults for the given culture instead).
+ /// </summary>
+ /// <param name="substitutionMethod">Method of number substitution to use.</param>
+ /// <param name="localeName">Which locale to obtain the digits from.</param>
+ /// <param name="ignoreUserOverride">Ignore the user's settings and use the locale defaults</param>
+ /// <param name="numberSubstitution">Receives a pointer to the newly created object.</param>
+ STDMETHOD(CreateNumberSubstitution)(
+ __in DWRITE_NUMBER_SUBSTITUTION_METHOD substitutionMethod,
+ __in_z WCHAR const* localeName,
+ __in BOOL ignoreUserOverride,
+ __out IDWriteNumberSubstitution** numberSubstitution
+ ) PURE;
+
+ /// <summary>
+ /// Creates a glyph run analysis object, which encapsulates information
+ /// used to render a glyph run.
+ /// </summary>
+ /// <param name="glyphRun">Structure specifying the properties of the glyph run.</param>
+ /// <param name="pixelsPerDip">Number of physical pixels per DIP. For example, if rendering onto a 96 DPI bitmap then pixelsPerDip
+ /// is 1. If rendering onto a 120 DPI bitmap then pixelsPerDip is 120/96.</param>
+ /// <param name="transform">Optional transform applied to the glyphs and their positions. This transform is applied after the
+ /// scaling specified the emSize and pixelsPerDip.</param>
+ /// <param name="renderingMode">Specifies the rendering mode, which must be one of the raster rendering modes (i.e., not default
+ /// and not outline).</param>
+ /// <param name="measuringMode">Specifies the method to measure glyphs.</param>
+ /// <param name="baselineOriginX">Horizontal position of the baseline origin, in DIPs.</param>
+ /// <param name="baselineOriginY">Vertical position of the baseline origin, in DIPs.</param>
+ /// <param name="glyphRunAnalysis">Receives a pointer to the newly created object.</param>
+ /// <returns>
+ /// Standard HRESULT error code.
+ /// </returns>
+ STDMETHOD(CreateGlyphRunAnalysis)(
+ __in DWRITE_GLYPH_RUN const* glyphRun,
+ FLOAT pixelsPerDip,
+ __in_opt DWRITE_MATRIX const* transform,
+ DWRITE_RENDERING_MODE renderingMode,
+ DWRITE_MEASURING_MODE measuringMode,
+ FLOAT baselineOriginX,
+ FLOAT baselineOriginY,
+ __out IDWriteGlyphRunAnalysis** glyphRunAnalysis
+ ) PURE;
+
+}; // interface IDWriteFactory
+
+/// <summary>
+/// Creates a DirectWrite factory object that is used for subsequent creation of individual DirectWrite objects.
+/// </summary>
+/// <param name="factoryType">Identifies whether the factory object will be shared or isolated.</param>
+/// <param name="iid">Identifies the DirectWrite factory interface, such as __uuidof(IDWriteFactory).</param>
+/// <param name="factory">Receives the DirectWrite factory object.</param>
+/// <returns>
+/// Standard HRESULT error code.
+/// </returns>
+/// <remarks>
+/// Obtains DirectWrite factory object that is used for subsequent creation of individual DirectWrite classes.
+/// DirectWrite factory contains internal state such as font loader registration and cached font data.
+/// In most cases it is recommended to use the shared factory object, because it allows multiple components
+/// that use DirectWrite to share internal DirectWrite state and reduce memory usage.
+/// However, there are cases when it is desirable to reduce the impact of a component,
+/// such as a plug-in from an untrusted source, on the rest of the process by sandboxing and isolating it
+/// from the rest of the process components. In such cases, it is recommended to use an isolated factory for the sandboxed
+/// component.
+/// </remarks>
+EXTERN_C HRESULT DWRITE_EXPORT DWriteCreateFactory(
+ __in DWRITE_FACTORY_TYPE factoryType,
+ __in REFIID iid,
+ __out IUnknown **factory
+ );
+
+// Macros used to define DirectWrite error codes.
+#define FACILITY_DWRITE 0x898
+#define DWRITE_ERR_BASE 0x5000
+#define MAKE_DWRITE_HR(severity, code) MAKE_HRESULT(severity, FACILITY_DWRITE, (DWRITE_ERR_BASE + code))
+#define MAKE_DWRITE_HR_ERR(code) MAKE_DWRITE_HR(SEVERITY_ERROR, code)
+
+/// <summary>
+/// Indicates an error in an input file such as a font file.
+/// </summary>
+#define DWRITE_E_FILEFORMAT MAKE_DWRITE_HR_ERR(0x000)
+
+/// <summary>
+/// Indicates an error originating in DirectWrite code, which is not expected to occur but is safe to recover from.
+/// </summary>
+#define DWRITE_E_UNEXPECTED MAKE_DWRITE_HR_ERR(0x001)
+
+/// <summary>
+/// Indicates the specified font does not exist.
+/// </summary>
+#define DWRITE_E_NOFONT MAKE_DWRITE_HR_ERR(0x002)
+
+/// <summary>
+/// A font file could not be opened because the file, directory, network location, drive, or other storage
+/// location does not exist or is unavailable.
+/// </summary>
+#define DWRITE_E_FILENOTFOUND MAKE_DWRITE_HR_ERR(0x003)
+
+/// <summary>
+/// A font file exists but could not be opened due to access denied, sharing violation, or similar error.
+/// </summary>
+#define DWRITE_E_FILEACCESS MAKE_DWRITE_HR_ERR(0x004)
+
+/// <summary>
+/// A font collection is obsolete due to changes in the system.
+/// </summary>
+#define DWRITE_E_FONTCOLLECTIONOBSOLETE MAKE_DWRITE_HR_ERR(0x005)
+
+/// <summary>
+/// The given interface is already registered.
+/// </summary>
+#define DWRITE_E_ALREADYREGISTERED MAKE_DWRITE_HR_ERR(0x006)
+
+#endif /* DWRITE_H_INCLUDED */
diff --git a/core/src/fxge/Microsoft SDK/include/Dcommon.h b/core/src/fxge/Microsoft SDK/include/Dcommon.h
new file mode 100644
index 0000000000..a6c901aeac
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/Dcommon.h
@@ -0,0 +1,65 @@
+//+--------------------------------------------------------------------------
+//
+// Copyright (c) Microsoft Corporation. All rights reserved.
+//
+// Abstract:
+// Public API definitions for DWrite and D2D
+//
+//----------------------------------------------------------------------------
+
+#ifndef DCOMMON_H_INCLUDED
+#define DCOMMON_H_INCLUDED
+
+//
+//These macros are defined in the Windows 7 SDK, however to enable development using the technical preview,
+//they are included here temporarily.
+//
+#ifndef DEFINE_ENUM_FLAG_OPERATORS
+#define DEFINE_ENUM_FLAG_OPERATORS(ENUMTYPE) \
+extern "C++" { \
+inline ENUMTYPE operator | (ENUMTYPE a, ENUMTYPE b) { return ENUMTYPE(((int)a) | ((int)b)); } \
+inline ENUMTYPE &operator |= (ENUMTYPE &a, ENUMTYPE b) { return (ENUMTYPE &)(((int &)a) |= ((int)b)); } \
+inline ENUMTYPE operator & (ENUMTYPE a, ENUMTYPE b) { return ENUMTYPE(((int)a) & ((int)b)); } \
+inline ENUMTYPE &operator &= (ENUMTYPE &a, ENUMTYPE b) { return (ENUMTYPE &)(((int &)a) &= ((int)b)); } \
+inline ENUMTYPE operator ~ (ENUMTYPE a) { return ENUMTYPE(~((int)a)); } \
+inline ENUMTYPE operator ^ (ENUMTYPE a, ENUMTYPE b) { return ENUMTYPE(((int)a) ^ ((int)b)); } \
+inline ENUMTYPE &operator ^= (ENUMTYPE &a, ENUMTYPE b) { return (ENUMTYPE &)(((int &)a) ^= ((int)b)); } \
+}
+#endif
+
+#ifndef __field_ecount_opt
+#define __field_ecount_opt(x)
+#endif
+
+#ifndef __range
+#define __range(x,y)
+#endif
+
+#ifndef __field_ecount
+#define __field_ecount(x)
+#endif
+
+/// <summary>
+/// The measuring method used for text layout.
+/// </summary>
+typedef enum DWRITE_MEASURING_MODE
+{
+ /// <summary>
+ /// Text is measured using glyph ideal metrics whose values are independent to the current display resolution.
+ /// </summary>
+ DWRITE_MEASURING_MODE_NATURAL,
+
+ /// <summary>
+ /// Text is measured using glyph display compatible metrics whose values tuned for the current display resolution.
+ /// </summary>
+ DWRITE_MEASURING_MODE_GDI_CLASSIC,
+
+ /// <summary>
+ /// Text is measured using the same glyph display metrics as text measured by GDI using a font
+ /// created with CLEARTYPE_NATURAL_QUALITY.
+ /// </summary>
+ DWRITE_MEASURING_MODE_GDI_NATURAL
+
+} DWRITE_MEASURING_MODE;
+
+#endif /* DCOMMON_H_INCLUDED */
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlus.h b/core/src/fxge/Microsoft SDK/include/GdiPlus.h
new file mode 100644
index 0000000000..82393e7050
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlus.h
@@ -0,0 +1,156 @@
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* Gdiplus.h
+*
+* Abstract:
+*
+* GDI+ Native C++ public header file
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUS_H
+#define _GDIPLUS_H
+
+struct IDirectDrawSurface7;
+
+typedef signed short INT16;
+typedef unsigned short UINT16;
+
+#ifndef DCR_REMOVE_INTERNAL
+
+#ifndef DCR_USE_NEW_105760
+ #define DCR_USE_NEW_105760
+#endif
+#ifndef DCR_USE_NEW_127084
+ #define DCR_USE_NEW_127084
+#endif
+#ifndef DCR_USE_NEW_135429
+ #define DCR_USE_NEW_135429
+#endif
+#ifndef DCR_USE_NEW_140782
+ #define DCR_USE_NEW_140782
+#endif
+#ifndef DCR_USE_NEW_140855
+ #define DCR_USE_NEW_140855
+#endif
+#ifndef DCR_USE_NEW_140857
+ #define DCR_USE_NEW_140857
+#endif
+#ifndef DCR_USE_NEW_140861
+ #define DCR_USE_NEW_140861
+#endif
+#ifndef DCR_USE_NEW_145135
+ #define DCR_USE_NEW_145135
+#endif
+#ifndef DCR_USE_NEW_145138
+ #define DCR_USE_NEW_145138
+#endif
+#ifndef DCR_USE_NEW_145139
+ #define DCR_USE_NEW_145139
+#endif
+#ifndef DCR_USE_NEW_145804
+ #define DCR_USE_NEW_145804
+#endif
+#ifndef DCR_USE_NEW_146933
+ #define DCR_USE_NEW_146933
+#endif
+#ifndef DCR_USE_NEW_152154
+ #define DCR_USE_NEW_152154
+#endif
+#ifndef DCR_USE_NEW_175866
+ #define DCR_USE_NEW_175866
+#endif
+
+#ifndef DCR_USE_NEW_188922
+ #define DCR_USE_NEW_188922
+#endif
+#ifndef DCR_USE_NEW_137252
+ #define DCR_USE_NEW_137252
+#endif
+#ifndef DCR_USE_NEW_202903
+ #define DCR_USE_NEW_202903
+#endif
+#ifndef DCR_USE_NEW_197819
+ #define DCR_USE_NEW_197819
+#endif
+#ifndef DCR_USE_NEW_186091
+ #define DCR_USE_NEW_186091
+#endif
+#ifndef DCR_USE_NEW_125467
+ #define DCR_USE_NEW_125467
+#endif
+#ifndef DCR_USE_NEW_168772
+ #define DCR_USE_NEW_168772
+#endif
+#ifndef DCR_USE_NEW_186764
+ #define DCR_USE_NEW_186764
+#endif
+#ifndef DCR_USE_NEW_174340
+ #define DCR_USE_NEW_174340
+#endif
+#ifndef DCR_USE_NEW_186151
+ #define DCR_USE_NEW_186151
+#endif
+
+#ifndef DCR_USE_NEW_235072
+ #define DCR_USE_NEW_235072
+#endif
+
+#endif // DCR_REMOVE_INTERNAL
+
+namespace Gdiplus
+{
+ namespace DllExports
+ {
+ #include "GdiplusMem.h"
+ };
+
+ #include "GdiplusBase.h"
+
+ // The following headers are used internally as well
+ #include "GdiplusEnums.h"
+ #include "GdiplusTypes.h"
+ #include "GdiplusInit.h"
+ #include "GdiplusPixelFormats.h"
+ #include "GdiplusColor.h"
+ #include "GdiplusMetaHeader.h"
+ #include "GdiplusImaging.h"
+ #include "GdiplusColorMatrix.h"
+
+ // The rest of these are used only by the application
+
+ #include "GdiplusGpStubs.h"
+ #include "GdiplusHeaders.h"
+
+ namespace DllExports
+ {
+ #include "GdiplusFlat.h"
+ };
+
+
+ #include "GdiplusImageAttributes.h"
+ #include "GdiplusMatrix.h"
+ #include "GdiplusBrush.h"
+ #include "GdiplusPen.h"
+ #include "GdiplusStringFormat.h"
+ #include "GdiplusPath.h"
+ #include "GdiplusLineCaps.h"
+ #include "GdiplusMetafile.h"
+ #include "GdiplusGraphics.h"
+ #include "GdiplusCachedBitmap.h"
+ #include "GdiplusRegion.h"
+ #include "GdiplusFontCollection.h"
+ #include "GdiplusFontFamily.h"
+ #include "GdiplusFont.h"
+ #include "GdiplusBitmap.h"
+ #include "GdiplusImageCodec.h"
+
+}; // namespace Gdiplus
+
+
+
+#endif // !_GDIPLUS_HPP
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusBase.h b/core/src/fxge/Microsoft SDK/include/GdiPlusBase.h
new file mode 100644
index 0000000000..40a977d1b1
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusBase.h
@@ -0,0 +1,40 @@
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusBase.h
+*
+* Abstract:
+*
+* Represents the base class for GDIPlus memory allocation.
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUSBASE_H
+#define _GDIPLUSBASE_H
+
+class GdiplusBase
+{
+public:
+ void (operator delete)(void* in_pVoid)
+ {
+ DllExports::GdipFree(in_pVoid);
+ }
+ void* (operator new)(size_t in_size)
+ {
+ return DllExports::GdipAlloc(in_size);
+ }
+ void (operator delete[])(void* in_pVoid)
+ {
+ DllExports::GdipFree(in_pVoid);
+ }
+ void* (operator new[])(size_t in_size)
+ {
+ return DllExports::GdipAlloc(in_size);
+ }
+};
+
+#endif
+
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusBitmap.h b/core/src/fxge/Microsoft SDK/include/GdiPlusBitmap.h
new file mode 100644
index 0000000000..fbe0061d41
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusBitmap.h
@@ -0,0 +1,1004 @@
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusBitmap.h
+*
+* Abstract:
+*
+* Bitmap related declarations
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUSBITMAP_H
+#define _GDIPLUSBITMAP_H
+
+// NOTE:
+// Our current choice for the public API is to use constructors
+// instead of static load functions to create image objects.
+//
+// I've kept the static load functions here for now so that
+// existing test programs are not broken. But they should
+// eventually be taken out.
+
+#ifndef DCR_USE_NEW_140782
+
+inline
+Image::Image(
+ IN const WCHAR* filename
+ )
+{
+ nativeImage = NULL;
+ lastResult = DllExports::GdipLoadImageFromFile(filename, &nativeImage);
+}
+
+inline
+Image::Image(
+ IN IStream* stream
+ )
+{
+ nativeImage = NULL;
+ lastResult = DllExports::GdipLoadImageFromStream(stream, &nativeImage);
+}
+
+inline Image*
+Image::FromFile(
+ IN const WCHAR* filename
+ )
+{
+ return new Image(filename);
+}
+
+inline Image*
+Image::FromStream(
+ IN IStream* stream
+ )
+{
+ return new Image(stream);
+}
+
+#else
+
+inline
+Image::Image(
+ IN const WCHAR* filename,
+ IN BOOL useEmbeddedColorManagement
+ )
+{
+ nativeImage = NULL;
+ if(useEmbeddedColorManagement)
+ {
+ lastResult = DllExports::GdipLoadImageFromFileICM(
+ filename,
+ &nativeImage
+ );
+ }
+ else
+ {
+ lastResult = DllExports::GdipLoadImageFromFile(
+ filename,
+ &nativeImage
+ );
+ }
+}
+
+inline
+Image::Image(
+ IN IStream* stream,
+ IN BOOL useEmbeddedColorManagement
+ )
+{
+ nativeImage = NULL;
+ if(useEmbeddedColorManagement)
+ {
+ lastResult = DllExports::GdipLoadImageFromStreamICM(
+ stream,
+ &nativeImage
+ );
+ }
+ else
+ {
+ lastResult = DllExports::GdipLoadImageFromStream(
+ stream,
+ &nativeImage
+ );
+ }
+}
+
+inline Image*
+Image::FromFile(
+ IN const WCHAR* filename,
+ IN BOOL useEmbeddedColorManagement
+ )
+{
+ return new Image(
+ filename,
+ useEmbeddedColorManagement
+ );
+}
+
+inline Image*
+Image::FromStream(
+ IN IStream* stream,
+ IN BOOL useEmbeddedColorManagement
+ )
+{
+ return new Image(
+ stream,
+ useEmbeddedColorManagement
+ );
+}
+
+#endif
+
+inline
+Image::~Image()
+{
+ DllExports::GdipDisposeImage(nativeImage);
+}
+
+inline Image*
+Image::Clone()
+{
+ GpImage *cloneimage = NULL;
+
+ SetStatus(DllExports::GdipCloneImage(nativeImage, &cloneimage));
+
+ return new Image(cloneimage, lastResult);
+}
+
+// Encorder Parameter
+
+inline UINT
+Image::GetEncoderParameterListSize(
+ IN const CLSID* clsidEncoder
+ )
+{
+ UINT size = 0;
+
+ SetStatus(DllExports::GdipGetEncoderParameterListSize(nativeImage,
+ clsidEncoder,
+ &size));
+ return size;
+}
+
+inline Status
+Image::GetEncoderParameterList(
+ IN const CLSID* clsidEncoder,
+ IN UINT size,
+ OUT EncoderParameters* buffer
+ )
+{
+ return SetStatus(DllExports::GdipGetEncoderParameterList(nativeImage,
+ clsidEncoder,
+ size,
+ buffer));
+}
+
+// Save images
+
+inline Status
+Image::Save(
+ IN const WCHAR* filename,
+ IN const CLSID* clsidEncoder,
+ IN const EncoderParameters *encoderParams
+ )
+{
+ return SetStatus(DllExports::GdipSaveImageToFile(nativeImage,
+ filename,
+ clsidEncoder,
+ encoderParams));
+}
+
+inline Status
+Image::Save(
+ IN IStream* stream,
+ IN const CLSID* clsidEncoder,
+ IN const EncoderParameters *encoderParams
+ )
+{
+ return SetStatus(DllExports::GdipSaveImageToStream(nativeImage,
+ stream,
+ clsidEncoder,
+ encoderParams));
+}
+
+inline Status
+Image::SaveAdd(
+ IN const EncoderParameters *encoderParams
+ )
+{
+ return SetStatus(DllExports::GdipSaveAdd(nativeImage,
+ encoderParams));
+}
+
+inline Status
+Image::SaveAdd(
+ IN Image* newImage,
+ IN const EncoderParameters *encoderParams
+ )
+{
+ if ( newImage == NULL )
+ {
+ return SetStatus(InvalidParameter);
+ }
+
+ return SetStatus(DllExports::GdipSaveAddImage(nativeImage,
+ newImage->nativeImage,
+ encoderParams));
+}
+
+// Get size and type information
+inline ImageType
+Image::GetType() const
+{
+ ImageType type = ImageTypeUnknown;
+
+ SetStatus(DllExports::GdipGetImageType(nativeImage, &type));
+
+ return type;
+}
+
+inline Status
+Image::GetPhysicalDimension(
+ OUT SizeF* size
+ )
+{
+ if (size == NULL)
+ {
+ return SetStatus(InvalidParameter);
+ }
+
+ REAL width, height;
+ Status status;
+
+ status = SetStatus(DllExports::GdipGetImageDimension(nativeImage,
+ &width, &height));
+
+ size->Width = width;
+ size->Height = height;
+
+ return status;
+}
+
+inline Status
+Image::GetBounds(
+ OUT RectF *srcRect,
+ OUT Unit *srcUnit
+ )
+{
+ return SetStatus(DllExports::GdipGetImageBounds(nativeImage,
+ srcRect, srcUnit));
+}
+
+inline UINT
+Image::GetWidth()
+{
+ UINT width = 0;
+
+ SetStatus(DllExports::GdipGetImageWidth(nativeImage, &width));
+
+ return width;
+}
+
+inline UINT
+Image::GetHeight()
+{
+ UINT height = 0;
+
+ SetStatus(DllExports::GdipGetImageHeight(nativeImage, &height));
+
+ return height;
+}
+
+inline REAL
+Image::GetHorizontalResolution()
+{
+ REAL resolution = 0.0f;
+
+ SetStatus(DllExports::GdipGetImageHorizontalResolution(nativeImage, &resolution));
+
+ return resolution;
+}
+
+inline REAL
+Image::GetVerticalResolution()
+{
+ REAL resolution = 0.0f;
+
+ SetStatus(DllExports::GdipGetImageVerticalResolution(nativeImage, &resolution));
+
+ return resolution;
+}
+
+inline UINT
+Image::GetFlags()
+{
+ UINT flags = 0;
+
+ SetStatus(DllExports::GdipGetImageFlags(nativeImage, &flags));
+
+ return flags;
+}
+
+inline Status
+Image::GetRawFormat(OUT GUID *format)
+{
+ return SetStatus(DllExports::GdipGetImageRawFormat(nativeImage, format));
+}
+
+inline PixelFormat
+Image::GetPixelFormat()
+{
+ PixelFormat format;
+
+ SetStatus(DllExports::GdipGetImagePixelFormat(nativeImage, &format));
+
+ return format;
+}
+
+inline INT
+Image::GetPaletteSize()
+{
+ INT size = 0;
+
+ SetStatus(DllExports::GdipGetImagePaletteSize(nativeImage, &size));
+
+ return size;
+}
+
+inline Status
+Image::GetPalette(
+ OUT ColorPalette *palette,
+ IN INT size
+)
+{
+ return SetStatus(DllExports::GdipGetImagePalette(nativeImage, palette, size));
+}
+
+inline Status
+Image::SetPalette(
+ IN const ColorPalette *palette
+ )
+{
+ return SetStatus(DllExports::GdipSetImagePalette(nativeImage, palette));
+}
+
+// Thumbnail support
+
+inline Image*
+Image::GetThumbnailImage(
+ IN UINT thumbWidth,
+ IN UINT thumbHeight,
+ IN GetThumbnailImageAbort callback,
+ IN VOID* callbackData
+ )
+{
+ GpImage *thumbimage = NULL;
+
+ SetStatus(DllExports::GdipGetImageThumbnail(nativeImage,
+ thumbWidth, thumbHeight,
+ &thumbimage,
+ callback, callbackData));
+
+ Image *newImage = new Image(thumbimage, lastResult);
+
+ if (newImage == NULL)
+ {
+ DllExports::GdipDisposeImage(thumbimage);
+ }
+
+ return newImage;
+}
+
+// Multi-frame support
+inline UINT
+Image::GetFrameDimensionsCount()
+{
+ UINT count = 0;
+
+ SetStatus(DllExports::GdipImageGetFrameDimensionsCount(nativeImage,
+ &count));
+
+ return count;
+}
+
+inline Status
+Image::GetFrameDimensionsList(
+ OUT GUID* dimensionIDs,
+ IN UINT count
+ )
+{
+ return SetStatus(DllExports::GdipImageGetFrameDimensionsList(nativeImage,
+ dimensionIDs,
+ count));
+}
+
+inline UINT
+Image::GetFrameCount(
+ IN const GUID* dimensionID
+ )
+{
+ UINT count = 0;
+
+ SetStatus(DllExports::GdipImageGetFrameCount(nativeImage,
+ dimensionID,
+ &count));
+ return count;
+}
+
+inline Status
+Image::SelectActiveFrame(
+ IN const GUID *dimensionID,
+ IN UINT frameIndex
+ )
+{
+ return SetStatus(DllExports::GdipImageSelectActiveFrame(nativeImage,
+ dimensionID,
+ frameIndex));
+}
+
+inline Status
+Image::RotateFlip(
+ IN RotateFlipType rotateFlipType
+ )
+{
+ return SetStatus(DllExports::GdipImageRotateFlip(nativeImage,
+ rotateFlipType));
+}
+
+// Image property related functions
+
+inline UINT
+Image::GetPropertyCount()
+{
+ UINT numProperty = 0;
+
+ SetStatus(DllExports::GdipGetPropertyCount(nativeImage,
+ &numProperty));
+
+ return numProperty;
+}
+
+inline Status
+Image::GetPropertyIdList(
+ IN UINT numOfProperty,
+ OUT PROPID* list
+ )
+{
+ return SetStatus(DllExports::GdipGetPropertyIdList(nativeImage,
+ numOfProperty, list));
+}
+
+inline UINT
+Image::GetPropertyItemSize(
+ IN PROPID propId
+ )
+{
+ UINT size = 0;
+
+ SetStatus(DllExports::GdipGetPropertyItemSize(nativeImage,
+ propId,
+ &size));
+
+ return size;
+}
+
+inline Status
+Image::GetPropertyItem(
+ IN PROPID propId,
+ IN UINT propSize,
+ OUT PropertyItem* buffer
+ )
+{
+ return SetStatus(DllExports::GdipGetPropertyItem(nativeImage,
+ propId, propSize, buffer));
+}
+
+inline Status
+Image::GetPropertySize(
+ OUT UINT* totalBufferSize,
+ OUT UINT* numProperties
+ )
+{
+ return SetStatus(DllExports::GdipGetPropertySize(nativeImage,
+ totalBufferSize,
+ numProperties));
+}
+
+inline Status
+Image::GetAllPropertyItems(
+ IN UINT totalBufferSize,
+ IN UINT numProperties,
+ OUT PropertyItem* allItems
+ )
+{
+ if (allItems == NULL)
+ {
+ return SetStatus(InvalidParameter);
+ }
+ return SetStatus(DllExports::GdipGetAllPropertyItems(nativeImage,
+ totalBufferSize,
+ numProperties,
+ allItems));
+}
+
+inline Status
+Image::RemovePropertyItem(
+ IN PROPID propId
+ )
+{
+ return SetStatus(DllExports::GdipRemovePropertyItem(nativeImage, propId));
+}
+
+inline Status
+Image::SetPropertyItem(
+ IN const PropertyItem* item
+ )
+{
+ return SetStatus(DllExports::GdipSetPropertyItem(nativeImage, item));
+}
+
+// Get/SetLayout
+// Support for Middle East localization (right-to-left mirroring)
+
+inline ImageLayout
+Image::GetLayout() const
+{
+ ImageLayout layout;
+
+ SetStatus(DllExports::GdipGetImageLayout(nativeImage, &layout));
+
+ return layout;
+}
+
+inline Status
+Image::SetLayout(IN const ImageLayout layout)
+{
+ return SetStatus(
+ DllExports::GdipSetImageLayout(nativeImage, layout)
+ );
+}
+
+inline Status
+Image::GetLastStatus() const
+{
+ Status lastStatus = lastResult;
+ lastResult = Ok;
+
+ return lastStatus;
+}
+
+inline
+Image::Image(GpImage *nativeImage, Status status)
+{
+ SetNativeImage(nativeImage);
+ lastResult = status;
+}
+
+inline VOID
+Image::SetNativeImage(GpImage *nativeImage)
+{
+ this->nativeImage = nativeImage;
+}
+
+inline
+Bitmap::Bitmap(
+ IN const WCHAR *filename,
+ IN BOOL useEmbeddedColorManagement
+ )
+{
+ GpBitmap *bitmap = NULL;
+
+ if(useEmbeddedColorManagement)
+ {
+ lastResult = DllExports::GdipCreateBitmapFromFileICM(filename, &bitmap);
+ }
+ else
+ {
+ lastResult = DllExports::GdipCreateBitmapFromFile(filename, &bitmap);
+ }
+
+ SetNativeImage(bitmap);
+}
+
+inline
+Bitmap::Bitmap(
+ IN IStream *stream,
+ IN BOOL useEmbeddedColorManagement
+ )
+{
+ GpBitmap *bitmap = NULL;
+
+ if(useEmbeddedColorManagement)
+ {
+ lastResult = DllExports::GdipCreateBitmapFromStreamICM(stream, &bitmap);
+ }
+ else
+ {
+ lastResult = DllExports::GdipCreateBitmapFromStream(stream, &bitmap);
+ }
+
+ SetNativeImage(bitmap);
+}
+
+inline
+Bitmap::Bitmap(
+ IN INT width,
+ IN INT height,
+ IN INT stride,
+ IN PixelFormat format,
+ IN BYTE *scan0
+ )
+{
+ GpBitmap *bitmap = NULL;
+
+ lastResult = DllExports::GdipCreateBitmapFromScan0(width,
+ height,
+ stride,
+ format,
+ scan0,
+ &bitmap);
+
+ SetNativeImage(bitmap);
+}
+
+inline
+Bitmap::Bitmap(
+ IN INT width,
+ IN INT height,
+ IN PixelFormat format
+ )
+{
+ GpBitmap *bitmap = NULL;
+
+ lastResult = DllExports::GdipCreateBitmapFromScan0(width,
+ height,
+ 0,
+ format,
+ NULL,
+ &bitmap);
+
+ SetNativeImage(bitmap);
+}
+
+inline
+Bitmap::Bitmap(
+ IN INT width,
+ IN INT height,
+ IN Graphics* target)
+{
+ GpBitmap *bitmap = NULL;
+
+ lastResult = DllExports::GdipCreateBitmapFromGraphics(width,
+ height,
+ target->nativeGraphics,
+ &bitmap);
+
+ SetNativeImage(bitmap);
+}
+
+inline
+Bitmap::Bitmap(
+ IN IDirectDrawSurface7 * surface
+ )
+{
+ GpBitmap *bitmap = NULL;
+
+ lastResult = DllExports::GdipCreateBitmapFromDirectDrawSurface(surface,
+ &bitmap);
+
+ SetNativeImage(bitmap);
+}
+
+inline
+Bitmap::Bitmap(
+ IN const BITMAPINFO* gdiBitmapInfo,
+ IN VOID* gdiBitmapData
+ )
+{
+ GpBitmap *bitmap = NULL;
+
+ lastResult = DllExports::GdipCreateBitmapFromGdiDib(gdiBitmapInfo,
+ gdiBitmapData,
+ &bitmap);
+
+ SetNativeImage(bitmap);
+}
+
+inline
+Bitmap::Bitmap(
+ IN HBITMAP hbm,
+ IN HPALETTE hpal
+ )
+{
+ GpBitmap *bitmap = NULL;
+
+ lastResult = DllExports::GdipCreateBitmapFromHBITMAP(hbm, hpal, &bitmap);
+
+ SetNativeImage(bitmap);
+}
+
+inline
+Bitmap::Bitmap(
+ IN HICON hicon
+ )
+{
+ GpBitmap *bitmap = NULL;
+
+ lastResult = DllExports::GdipCreateBitmapFromHICON(hicon, &bitmap);
+
+ SetNativeImage(bitmap);
+}
+
+inline
+Bitmap::Bitmap(
+ IN HINSTANCE hInstance,
+ IN const WCHAR *bitmapName
+ )
+{
+ GpBitmap *bitmap = NULL;
+
+ lastResult = DllExports::GdipCreateBitmapFromResource(hInstance,
+ bitmapName,
+ &bitmap);
+
+ SetNativeImage(bitmap);
+}
+
+
+inline Bitmap*
+Bitmap::FromFile(
+ IN const WCHAR *filename,
+ IN BOOL useEmbeddedColorManagement
+ )
+{
+ return new Bitmap(
+ filename,
+ useEmbeddedColorManagement
+ );
+}
+
+inline Bitmap*
+Bitmap::FromStream(
+ IN IStream *stream,
+ IN BOOL useEmbeddedColorManagement
+ )
+{
+ return new Bitmap(
+ stream,
+ useEmbeddedColorManagement
+ );
+}
+
+inline Bitmap*
+Bitmap::FromDirectDrawSurface7(
+ IN IDirectDrawSurface7* surface
+ )
+{
+ return new Bitmap(surface);
+}
+
+inline Bitmap*
+Bitmap::FromBITMAPINFO(
+ IN const BITMAPINFO* gdiBitmapInfo,
+ IN VOID* gdiBitmapData)
+{
+ return new Bitmap(gdiBitmapInfo, gdiBitmapData);
+}
+
+inline Bitmap*
+Bitmap::FromHBITMAP(
+ IN HBITMAP hbm,
+ IN HPALETTE hpal
+ )
+{
+ return new Bitmap(hbm, hpal);
+}
+
+inline Bitmap*
+Bitmap::FromHICON(
+ IN HICON hicon
+ )
+{
+ return new Bitmap(hicon);
+}
+
+inline Bitmap*
+Bitmap::FromResource(
+ IN HINSTANCE hInstance,
+ IN const WCHAR *bitmapName)
+{
+ return new Bitmap(hInstance, bitmapName);
+}
+
+inline Status
+Bitmap::GetHBITMAP(
+ IN const Color& colorBackground,
+ OUT HBITMAP* hbmReturn
+ )
+{
+ return SetStatus(DllExports::GdipCreateHBITMAPFromBitmap(
+ static_cast<GpBitmap*>(nativeImage),
+ hbmReturn,
+ colorBackground.GetValue()));
+}
+
+inline Status
+Bitmap::GetHICON(
+ OUT HICON* hiconReturn
+ )
+{
+ return SetStatus(DllExports::GdipCreateHICONFromBitmap(
+ static_cast<GpBitmap*>(nativeImage),
+ hiconReturn));
+}
+
+inline Bitmap*
+Bitmap::Clone(
+ IN const Rect& rect,
+ IN PixelFormat format
+ )
+{
+ return Clone(rect.X, rect.Y, rect.Width, rect.Height, format);
+}
+
+inline Bitmap*
+Bitmap::Clone(
+ IN INT x,
+ IN INT y,
+ IN INT width,
+ IN INT height,
+ IN PixelFormat format
+ )
+{
+ GpBitmap* gpdstBitmap = NULL;
+ Bitmap* bitmap;
+
+ lastResult = DllExports::GdipCloneBitmapAreaI(
+ x,
+ y,
+ width,
+ height,
+ format,
+ (GpBitmap *)nativeImage,
+ &gpdstBitmap);
+
+ if (lastResult == Ok)
+ {
+ bitmap = new Bitmap(gpdstBitmap);
+
+ if (bitmap == NULL)
+ {
+ DllExports::GdipDisposeImage(gpdstBitmap);
+ }
+
+ return bitmap;
+ }
+ else
+ return NULL;
+}
+
+inline Bitmap*
+Bitmap::Clone(
+ IN const RectF& rect,
+ IN PixelFormat format
+ )
+{
+ return Clone(rect.X, rect.Y, rect.Width, rect.Height, format);
+}
+
+inline Bitmap*
+Bitmap::Clone(
+ IN REAL x,
+ IN REAL y,
+ IN REAL width,
+ IN REAL height,
+ IN PixelFormat format
+ )
+{
+ GpBitmap* gpdstBitmap = NULL;
+ Bitmap* bitmap;
+
+ SetStatus(DllExports::GdipCloneBitmapArea(
+ x,
+ y,
+ width,
+ height,
+ format,
+ (GpBitmap *)nativeImage,
+ &gpdstBitmap));
+
+ if (lastResult == Ok)
+ {
+ bitmap = new Bitmap(gpdstBitmap);
+
+ if (bitmap == NULL)
+ {
+ DllExports::GdipDisposeImage(gpdstBitmap);
+ }
+
+ return bitmap;
+ }
+ else
+ return NULL;
+}
+
+inline Bitmap::Bitmap(GpBitmap *nativeBitmap)
+{
+ lastResult = Ok;
+
+ SetNativeImage(nativeBitmap);
+}
+
+inline Status
+Bitmap::LockBits(
+ IN const Rect& rect,
+ IN UINT flags,
+ IN PixelFormat format,
+ OUT BitmapData* lockedBitmapData
+)
+{
+ return SetStatus(DllExports::GdipBitmapLockBits(
+ static_cast<GpBitmap*>(nativeImage),
+ &rect,
+ flags,
+ format,
+ lockedBitmapData));
+}
+
+inline Status
+Bitmap::UnlockBits(
+ IN BitmapData* lockedBitmapData
+ )
+{
+ return SetStatus(DllExports::GdipBitmapUnlockBits(
+ static_cast<GpBitmap*>(nativeImage),
+ lockedBitmapData));
+}
+
+inline Status
+Bitmap::GetPixel(
+ IN INT x,
+ IN INT y,
+ OUT Color *color)
+{
+ ARGB argb;
+
+ Status status = SetStatus(DllExports::GdipBitmapGetPixel(
+ static_cast<GpBitmap *>(nativeImage),
+ x, y,
+ &argb));
+
+ if (status == Ok)
+ {
+ color->SetValue(argb);
+ }
+
+ return status;
+}
+
+inline Status
+Bitmap::SetPixel(
+ IN INT x,
+ IN INT y,
+ IN const Color& color)
+{
+ return SetStatus(DllExports::GdipBitmapSetPixel(
+ static_cast<GpBitmap *>(nativeImage),
+ x, y,
+ color.GetValue()));
+}
+
+inline Status
+Bitmap::SetResolution(
+ IN REAL xdpi,
+ IN REAL ydpi)
+{
+ return SetStatus(DllExports::GdipBitmapSetResolution(
+ static_cast<GpBitmap *>(nativeImage),
+ xdpi, ydpi));
+}
+#endif
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusBrush.h b/core/src/fxge/Microsoft SDK/include/GdiPlusBrush.h
new file mode 100644
index 0000000000..a506f87982
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusBrush.h
@@ -0,0 +1,951 @@
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusBrush.h
+*
+* Abstract:
+*
+* Brush API related declarations
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUSBRUSH_H
+#define _GDIPLUSBRUSH_H
+
+//--------------------------------------------------------------------------
+// Abstract base class for various brush types
+//--------------------------------------------------------------------------
+
+class GraphicsPath;
+
+class Brush : public GdiplusBase
+{
+public:
+ friend class Pen;
+ friend class Graphics;
+
+ virtual ~Brush()
+ {
+ DllExports::GdipDeleteBrush(nativeBrush);
+ }
+
+ virtual Brush* Clone() const
+ {
+ GpBrush *brush = NULL;
+
+ SetStatus(DllExports::GdipCloneBrush(nativeBrush, &brush));
+
+ Brush *newBrush = new Brush(brush, lastResult);
+
+ if (newBrush == NULL)
+ {
+ DllExports::GdipDeleteBrush(brush);
+ }
+
+ return newBrush;
+ }
+
+ BrushType GetType() const
+ {
+ BrushType type = static_cast<BrushType>(-1);
+
+ SetStatus(DllExports::GdipGetBrushType(nativeBrush, &type));
+
+ return type;
+ }
+
+ Status GetLastStatus() const
+ {
+ Status lastStatus = lastResult;
+ lastResult = Ok;
+
+ return lastStatus;
+ }
+
+protected:
+
+ Brush()
+ {
+ SetStatus(NotImplemented);
+ }
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ Brush(const Brush& brush);
+ Brush& operator=(const Brush& brush);
+protected:
+
+#else
+
+ Brush(const Brush& brush)
+ {
+ brush;
+ SetStatus(NotImplemented);
+ }
+
+ Brush& operator=(const Brush& brush)
+ {
+ brush;
+ SetStatus(NotImplemented);
+ return *this;
+ }
+
+#endif
+
+ Brush(GpBrush* nativeBrush, Status status)
+ {
+ lastResult = status;
+ SetNativeBrush(nativeBrush);
+ }
+
+ VOID SetNativeBrush(GpBrush* nativeBrush)
+ {
+ this->nativeBrush = nativeBrush;
+ }
+
+ Status SetStatus(Status status) const
+ {
+ if (status != Ok)
+ return (lastResult = status);
+ else
+ return status;
+ }
+
+ GpBrush* nativeBrush;
+ mutable Status lastResult;
+};
+
+//--------------------------------------------------------------------------
+// Represent solid fill brush object
+//--------------------------------------------------------------------------
+
+class SolidBrush : public Brush
+{
+public:
+ friend class Pen;
+
+ SolidBrush(IN const Color& color)
+ {
+ GpSolidFill *brush = NULL;
+
+ lastResult = DllExports::GdipCreateSolidFill(color.GetValue(), &brush);
+
+ SetNativeBrush(brush);
+ }
+
+ Status GetColor(OUT Color* color) const
+ {
+ ARGB argb;
+
+ if (color == NULL)
+ {
+ return SetStatus(InvalidParameter);
+ }
+
+ SetStatus(DllExports::GdipGetSolidFillColor((GpSolidFill*)nativeBrush,
+ &argb));
+
+ *color = Color(argb);
+
+ return lastResult;
+ }
+
+ Status SetColor(IN const Color& color)
+ {
+ return SetStatus(DllExports::GdipSetSolidFillColor((GpSolidFill*)nativeBrush,
+ color.GetValue()));
+ }
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ SolidBrush(const SolidBrush &);
+ SolidBrush& operator=(const SolidBrush &);
+
+#endif
+
+protected:
+
+ SolidBrush()
+ {
+ }
+};
+
+class TextureBrush : public Brush
+{
+public:
+ friend class Pen;
+
+ TextureBrush(IN Image* image,
+ IN WrapMode wrapMode = WrapModeTile)
+ {
+ GpTexture *texture = NULL;
+
+ lastResult = DllExports::GdipCreateTexture(
+ image->nativeImage,
+ wrapMode, &texture);
+
+ SetNativeBrush(texture);
+ }
+
+ // When creating a texture brush from a metafile image, the dstRect
+ // is used to specify the size that the metafile image should be
+ // rendered at in the device units of the destination graphics.
+ // It is NOT used to crop the metafile image, so only the width
+ // and height values matter for metafiles.
+ TextureBrush(IN Image* image,
+ IN WrapMode wrapMode,
+ IN const RectF &dstRect)
+ {
+ GpTexture *texture = NULL;
+
+ lastResult = DllExports::GdipCreateTexture2(
+ image->nativeImage,
+ wrapMode,
+ dstRect.X,
+ dstRect.Y,
+ dstRect.Width,
+ dstRect.Height,
+ &texture);
+
+ SetNativeBrush(texture);
+ }
+
+ // When creating a texture brush from a metafile image, the dstRect
+ // is used to specify the size that the metafile image should be
+ // rendered at in the device units of the destination graphics.
+ // It is NOT used to crop the metafile image, so only the width
+ // and height values matter for metafiles.
+
+ TextureBrush(IN Image *image,
+ IN const RectF &dstRect,
+ IN const ImageAttributes *imageAttributes = NULL)
+ {
+ GpTexture *texture = NULL;
+
+ lastResult = DllExports::GdipCreateTextureIA(
+ image->nativeImage,
+ (imageAttributes)?imageAttributes->nativeImageAttr:NULL,
+ dstRect.X,
+ dstRect.Y,
+ dstRect.Width,
+ dstRect.Height,
+ &texture
+ );
+
+ SetNativeBrush(texture);
+ }
+
+ #ifdef DCR_USE_NEW_145138
+ TextureBrush(IN Image *image,
+ IN const Rect &dstRect,
+ IN const ImageAttributes *imageAttributes = NULL)
+ {
+ GpTexture *texture = NULL;
+
+ lastResult = DllExports::GdipCreateTextureIAI(
+ image->nativeImage,
+ (imageAttributes)?imageAttributes->nativeImageAttr:NULL,
+ dstRect.X,
+ dstRect.Y,
+ dstRect.Width,
+ dstRect.Height,
+ &texture
+ );
+
+ SetNativeBrush(texture);
+ }
+ #endif
+
+ // When creating a texture brush from a metafile image, the dstRect
+ // is used to specify the size that the metafile image should be
+ // rendered at in the device units of the destination graphics.
+ // It is NOT used to crop the metafile image, so only the width
+ // and height values matter for metafiles.
+
+ TextureBrush(
+ IN Image* image,
+ IN WrapMode wrapMode,
+
+ #ifdef DCR_USE_NEW_145138
+ const IN Rect &dstRect
+ #else
+ IN Rect &dstRect
+ #endif
+ )
+ {
+ GpTexture *texture = NULL;
+
+ lastResult = DllExports::GdipCreateTexture2I(
+ image->nativeImage,
+ wrapMode,
+ dstRect.X,
+ dstRect.Y,
+ dstRect.Width,
+ dstRect.Height,
+ &texture);
+
+ SetNativeBrush(texture);
+ }
+
+ // When creating a texture brush from a metafile image, the dstRect
+ // is used to specify the size that the metafile image should be
+ // rendered at in the device units of the destination graphics.
+ // It is NOT used to crop the metafile image, so only the width
+ // and height values matter for metafiles.
+ TextureBrush(IN Image* image,
+ IN WrapMode wrapMode,
+ IN REAL dstX,
+ IN REAL dstY,
+ IN REAL dstWidth,
+ IN REAL dstHeight)
+ {
+ GpTexture *texture = NULL;
+
+ lastResult = DllExports::GdipCreateTexture2(
+ image->nativeImage,
+ wrapMode,
+ dstX,
+ dstY,
+ dstWidth,
+ dstHeight,
+ &texture);
+
+ SetNativeBrush(texture);
+ }
+
+ // When creating a texture brush from a metafile image, the dstRect
+ // is used to specify the size that the metafile image should be
+ // rendered at in the device units of the destination graphics.
+ // It is NOT used to crop the metafile image, so only the width
+ // and height values matter for metafiles.
+ TextureBrush(IN Image* image,
+ IN WrapMode wrapMode,
+ IN INT dstX,
+ IN INT dstY,
+ IN INT dstWidth,
+ IN INT dstHeight)
+ {
+ GpTexture *texture = NULL;
+
+ lastResult = DllExports::GdipCreateTexture2I(
+ image->nativeImage,
+ wrapMode,
+ dstX,
+ dstY,
+ dstWidth,
+ dstHeight,
+ &texture);
+
+ SetNativeBrush(texture);
+ }
+
+ /**
+ * Set/get brush transform
+ */
+ Status SetTransform(IN const Matrix* matrix)
+ {
+ return SetStatus(DllExports::GdipSetTextureTransform((GpTexture*)nativeBrush,
+ matrix->nativeMatrix));
+ }
+
+ Status GetTransform(OUT Matrix* matrix) const
+ {
+ return SetStatus(DllExports::GdipGetTextureTransform((GpTexture*)nativeBrush,
+ matrix->nativeMatrix));
+ }
+
+ Status ResetTransform()
+ {
+ return SetStatus(DllExports::GdipResetTextureTransform((GpTexture*)nativeBrush));
+ }
+
+ Status MultiplyTransform(IN const Matrix* matrix,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipMultiplyTextureTransform((GpTexture*)nativeBrush,
+ matrix->nativeMatrix,
+ order));
+ }
+
+ Status TranslateTransform(IN REAL dx,
+ IN REAL dy,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipTranslateTextureTransform((GpTexture*)nativeBrush,
+ dx, dy, order));
+ }
+
+ Status ScaleTransform(IN REAL sx,
+ IN REAL sy,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipScaleTextureTransform((GpTexture*)nativeBrush,
+ sx, sy, order));
+ }
+
+ Status RotateTransform(IN REAL angle,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipRotateTextureTransform((GpTexture*)nativeBrush,
+ angle, order));
+ }
+
+ /**
+ * Set/get brush wrapping mode
+ */
+ Status SetWrapMode(IN WrapMode wrapMode)
+ {
+ return SetStatus(DllExports::GdipSetTextureWrapMode((GpTexture*)nativeBrush,
+ wrapMode));
+ }
+
+ WrapMode GetWrapMode() const
+ {
+ WrapMode wrapMode;
+
+ SetStatus(DllExports::GdipGetTextureWrapMode((GpTexture*)nativeBrush,
+ &wrapMode));
+ return wrapMode;
+ }
+
+ // Get texture brush attributes
+
+ Image *GetImage() const
+ {
+ GpImage *image;
+
+ SetStatus(DllExports::GdipGetTextureImage((GpTexture *)nativeBrush,
+ &image));
+
+ Image *retimage = new Image(image, lastResult);
+
+ if (retimage == NULL)
+ {
+ DllExports::GdipDisposeImage(image);
+ }
+
+ return retimage;
+ }
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ TextureBrush(const TextureBrush &);
+ TextureBrush& operator=(const TextureBrush &);
+
+#endif
+
+protected:
+
+ TextureBrush()
+ {
+ }
+};
+
+//--------------------------------------------------------------------------
+// Represent line gradient brush object
+//--------------------------------------------------------------------------
+
+class LinearGradientBrush : public Brush
+{
+public:
+ friend class Pen;
+
+ LinearGradientBrush(IN const PointF& point1,
+ IN const PointF& point2,
+ IN const Color& color1,
+ IN const Color& color2)
+ {
+ GpLineGradient *brush = NULL;
+
+ lastResult = DllExports::GdipCreateLineBrush(&point1,
+ &point2,
+ color1.GetValue(),
+ color2.GetValue(),
+ WrapModeTile,
+ &brush);
+
+ SetNativeBrush(brush);
+ }
+
+ LinearGradientBrush(IN const Point& point1,
+ IN const Point& point2,
+ IN const Color& color1,
+ IN const Color& color2)
+ {
+ GpLineGradient *brush = NULL;
+
+ lastResult = DllExports::GdipCreateLineBrushI(&point1,
+ &point2,
+ color1.GetValue(),
+ color2.GetValue(),
+ WrapModeTile,
+ &brush);
+
+ SetNativeBrush(brush);
+ }
+
+ LinearGradientBrush(IN const RectF& rect,
+ IN const Color& color1,
+ IN const Color& color2,
+ IN LinearGradientMode mode)
+ {
+ GpLineGradient *brush = NULL;
+
+ lastResult = DllExports::GdipCreateLineBrushFromRect(&rect,
+ color1.GetValue(),
+ color2.GetValue(),
+ mode,
+ WrapModeTile,
+ &brush);
+
+ SetNativeBrush(brush);
+ }
+
+ LinearGradientBrush(IN const Rect& rect,
+ IN const Color& color1,
+ IN const Color& color2,
+ IN LinearGradientMode mode)
+ {
+ GpLineGradient *brush = NULL;
+
+ lastResult = DllExports::GdipCreateLineBrushFromRectI(&rect,
+ color1.GetValue(),
+ color2.GetValue(),
+ mode,
+ WrapModeTile,
+ &brush);
+
+ SetNativeBrush(brush);
+ }
+
+ LinearGradientBrush(IN const RectF& rect,
+ IN const Color& color1,
+ IN const Color& color2,
+ IN REAL angle,
+ IN BOOL isAngleScalable = FALSE)
+ {
+ GpLineGradient *brush = NULL;
+
+ lastResult = DllExports::GdipCreateLineBrushFromRectWithAngle(&rect,
+ color1.GetValue(),
+ color2.GetValue(),
+ angle,
+ isAngleScalable,
+ WrapModeTile,
+ &brush);
+
+ SetNativeBrush(brush);
+ }
+
+ LinearGradientBrush(IN const Rect& rect,
+ IN const Color& color1,
+ IN const Color& color2,
+ IN REAL angle,
+ IN BOOL isAngleScalable = FALSE)
+ {
+ GpLineGradient *brush = NULL;
+
+ lastResult = DllExports::GdipCreateLineBrushFromRectWithAngleI(&rect,
+ color1.GetValue(),
+ color2.GetValue(),
+ angle,
+ isAngleScalable,
+ WrapModeTile,
+ &brush);
+
+ SetNativeBrush(brush);
+ }
+
+ // Get/set point attributes
+
+ Status SetLinearPoints(IN const PointF& point1,
+ IN const PointF& point2)
+ {
+ return SetStatus(DllExports::GdipSetLinePoints((GpLineGradient*)nativeBrush,
+ &point1, &point2));
+ }
+
+ Status GetLinearPoints(OUT PointF* points) const
+ {
+ return SetStatus(DllExports::GdipGetLinePoints((GpLineGradient*) nativeBrush,
+ points));
+ }
+
+ Status SetLinearPoints(IN const Point& point1,
+ IN const Point& point2)
+ {
+ return SetStatus(DllExports::GdipSetLinePointsI((GpLineGradient*)nativeBrush,
+ &point1, &point2));
+ }
+
+ Status GetLinearPoints(OUT Point* points) const
+ {
+ return SetStatus(DllExports::GdipGetLinePointsI((GpLineGradient*) nativeBrush,
+ points));
+ }
+ // Get/set color attributes
+
+ Status SetLinearColors(IN const Color& color1,
+ IN const Color& color2)
+ {
+ return SetStatus(DllExports::GdipSetLineColors((GpLineGradient*)nativeBrush,
+ color1.GetValue(),
+ color2.GetValue()));
+ }
+
+ Status GetLinearColors(OUT Color* colors) const
+ {
+ ARGB argb[2];
+
+ if (colors == NULL)
+ {
+ return SetStatus(InvalidParameter);
+ }
+
+ SetStatus(DllExports::GdipGetLineColors((GpLineGradient*) nativeBrush, argb));
+
+ if (lastResult == Ok)
+ {
+ // use bitwise copy operator for Color copy
+ colors[0] = Color(argb[0]);
+ colors[1] = Color(argb[1]);
+ }
+
+ return lastResult;
+ }
+
+ Status GetRectangle(OUT RectF* rect) const
+ {
+ return SetStatus(DllExports::GdipGetLineRect((GpLineGradient*)nativeBrush, rect));
+ }
+
+ // integer version
+ Status GetRectangle(OUT Rect* rect) const
+ {
+ return SetStatus(DllExports::GdipGetLineRectI((GpLineGradient*)nativeBrush, rect));
+ }
+
+ // Gamma correction in interporlation.
+
+ Status SetGammaCorrection(IN BOOL useGammaCorrection)
+ {
+ return SetStatus(DllExports::GdipSetLineGammaCorrection((GpLineGradient*)nativeBrush,
+ useGammaCorrection));
+ }
+
+ BOOL GetGammaCorrection() const
+ {
+ BOOL useGammaCorrection;
+
+ SetStatus(DllExports::GdipGetLineGammaCorrection((GpLineGradient*)nativeBrush,
+ &useGammaCorrection));
+
+ return useGammaCorrection;
+ }
+
+ INT GetBlendCount() const
+ {
+ INT count = 0;
+
+ SetStatus(DllExports::GdipGetLineBlendCount((GpLineGradient*)
+ nativeBrush,
+ &count));
+
+ return count;
+ }
+
+ Status SetBlend(IN const REAL* blendFactors,
+ IN const REAL* blendPositions,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipSetLineBlend((GpLineGradient*)
+ nativeBrush,
+ blendFactors,
+ blendPositions,
+ count));
+ }
+
+ Status GetBlend(OUT REAL* blendFactors,
+ OUT REAL* blendPositions,
+ IN INT count) const
+ {
+ return SetStatus(DllExports::GdipGetLineBlend((GpLineGradient*)nativeBrush,
+ blendFactors,
+ blendPositions,
+ count));
+ }
+
+ INT GetInterpolationColorCount() const
+ {
+ INT count = 0;
+
+ SetStatus(DllExports::GdipGetLinePresetBlendCount((GpLineGradient*)
+ nativeBrush,
+ &count));
+
+ return count;
+ }
+
+ Status SetInterpolationColors(IN const Color* presetColors,
+ IN const REAL* blendPositions,
+ IN INT count)
+ {
+ if ((count <= 0) || !presetColors)
+ return SetStatus(InvalidParameter);
+
+ ARGB *argbs = (ARGB*) new BYTE[count*sizeof(ARGB)];
+
+ if (argbs)
+ {
+ for (INT i = 0; i < count; i++)
+ {
+ argbs[i] = presetColors[i].GetValue();
+ }
+
+ Status status = SetStatus(DllExports::GdipSetLinePresetBlend(
+ (GpLineGradient*) nativeBrush,
+ argbs,
+ blendPositions,
+ count));
+ delete [] argbs;
+ return status;
+ }
+ else
+ {
+ return SetStatus(OutOfMemory);
+ }
+ }
+
+ Status GetInterpolationColors(OUT Color* presetColors,
+ OUT REAL* blendPositions,
+ IN INT count) const
+ {
+ if ((count <= 0) || !presetColors)
+ return SetStatus(InvalidParameter);
+
+ ARGB* argbs = (ARGB*) new BYTE[count*sizeof(ARGB)];
+
+ if (!argbs)
+ {
+ return SetStatus(OutOfMemory);
+ }
+
+ Status status = SetStatus(DllExports::GdipGetLinePresetBlend((GpLineGradient*)nativeBrush,
+ argbs,
+ blendPositions,
+ count));
+ if (status == Ok)
+ {
+ for (INT i = 0; i < count; i++)
+ {
+ presetColors[i] = Color(argbs[i]);
+ }
+ }
+
+ delete [] argbs;
+
+ return status;
+ }
+
+ Status SetBlendBellShape(IN REAL focus,
+ IN REAL scale = 1.0)
+ {
+ return SetStatus(DllExports::GdipSetLineSigmaBlend((GpLineGradient*)nativeBrush, focus, scale));
+ }
+
+ #ifdef DCR_USE_NEW_145135
+ Status SetBlendTriangularShape(
+ IN REAL focus,
+ IN REAL scale = 1.0
+ )
+ #else
+ Status SetBlendTrianglarShape(IN REAL focus,
+ IN REAL scale = 1.0)
+ #endif
+ {
+ return SetStatus(DllExports::GdipSetLineLinearBlend((GpLineGradient*)nativeBrush, focus, scale));
+ }
+
+ /**
+ * Set/get brush transform
+ */
+ Status SetTransform(IN const Matrix* matrix)
+ {
+ return SetStatus(DllExports::GdipSetLineTransform((GpLineGradient*)nativeBrush,
+ matrix->nativeMatrix));
+ }
+
+ Status GetTransform(OUT Matrix *matrix) const
+ {
+ return SetStatus(DllExports::GdipGetLineTransform((GpLineGradient*)nativeBrush,
+ matrix->nativeMatrix));
+ }
+
+ Status ResetTransform()
+ {
+ return SetStatus(DllExports::GdipResetLineTransform((GpLineGradient*)nativeBrush));
+ }
+
+ Status MultiplyTransform(IN const Matrix* matrix,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipMultiplyLineTransform((GpLineGradient*)nativeBrush,
+ matrix->nativeMatrix,
+ order));
+ }
+
+ Status TranslateTransform(IN REAL dx,
+ IN REAL dy,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipTranslateLineTransform((GpLineGradient*)nativeBrush,
+ dx, dy, order));
+ }
+
+ Status ScaleTransform(IN REAL sx,
+ IN REAL sy,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipScaleLineTransform((GpLineGradient*)nativeBrush,
+ sx, sy, order));
+ }
+
+ Status RotateTransform(IN REAL angle,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipRotateLineTransform((GpLineGradient*)nativeBrush,
+ angle, order));
+ }
+
+ /**
+ * Set/get brush wrapping mode
+ */
+ Status SetWrapMode(IN WrapMode wrapMode)
+ {
+ return SetStatus(DllExports::GdipSetLineWrapMode((GpLineGradient*)nativeBrush,
+ wrapMode));
+ }
+
+ WrapMode GetWrapMode() const
+ {
+ WrapMode wrapMode;
+
+ SetStatus(DllExports::GdipGetLineWrapMode((GpLineGradient*)
+ nativeBrush,
+ &wrapMode));
+
+ return wrapMode;
+ }
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ LinearGradientBrush(const LinearGradientBrush &);
+ LinearGradientBrush& operator=(const LinearGradientBrush &);
+
+#endif
+
+protected:
+
+ LinearGradientBrush()
+ {
+ }
+};
+
+//--------------------------------------------------------------------------
+// PathGradientBrush object is defined
+// in gdipluspath.h.
+//--------------------------------------------------------------------------
+
+//--------------------------------------------------------------------------
+// Represent hatch brush object
+//--------------------------------------------------------------------------
+
+class HatchBrush : public Brush
+{
+public:
+ friend class Pen;
+
+ // Constructors
+
+ HatchBrush(IN HatchStyle hatchStyle,
+ IN const Color& foreColor,
+ IN const Color& backColor = Color())
+ {
+ GpHatch *brush = NULL;
+
+ lastResult = DllExports::GdipCreateHatchBrush(hatchStyle,
+ foreColor.GetValue(),
+ backColor.GetValue(),
+ &brush);
+ SetNativeBrush(brush);
+ }
+
+ HatchStyle GetHatchStyle() const
+ {
+ HatchStyle hatchStyle;
+
+ SetStatus(DllExports::GdipGetHatchStyle((GpHatch*)nativeBrush,
+ &hatchStyle));
+
+ return hatchStyle;
+ }
+
+ Status GetForegroundColor(OUT Color* color) const
+ {
+ ARGB argb;
+
+ if (color == NULL)
+ {
+ return SetStatus(InvalidParameter);
+ }
+
+ Status status = SetStatus(DllExports::GdipGetHatchForegroundColor(
+ (GpHatch*)nativeBrush,
+ &argb));
+
+ color->SetValue(argb);
+
+ return status;
+ }
+
+ Status GetBackgroundColor(OUT Color *color) const
+ {
+ ARGB argb;
+
+ if (color == NULL)
+ {
+ return SetStatus(InvalidParameter);
+ }
+
+ Status status = SetStatus(DllExports::GdipGetHatchBackgroundColor(
+ (GpHatch*)nativeBrush,
+ &argb));
+
+ color->SetValue(argb);
+
+ return status;
+ }
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ HatchBrush(const HatchBrush &);
+ HatchBrush& operator=(const HatchBrush &);
+
+#endif
+
+protected:
+
+ HatchBrush()
+ {
+ }
+};
+
+#endif
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusCachedBitmap.h b/core/src/fxge/Microsoft SDK/include/GdiPlusCachedBitmap.h
new file mode 100644
index 0000000000..28fd8caea6
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusCachedBitmap.h
@@ -0,0 +1,71 @@
+/**************************************************************************
+*
+* Copyright (c) 2000 Microsoft Corporation
+*
+* Module Name:
+*
+* CachedBitmap class definition
+*
+* Abstract:
+*
+* CachedBitmap is a representation of an accelerated drawing
+* that has restrictions on what operations are allowed in order
+* to accelerate the drawing to the destination.
+*
+**************************************************************************/
+
+#ifndef _GDIPLUSCACHEDBITMAP_H
+#define _GDIPLUSCACHEDBITMAP_H
+
+/**************************************************************************
+*
+* Class Name:
+*
+* CachedBitmap
+*
+* Abstract:
+*
+* An object to store a bitmap prepared for rendering on a particular
+* Graphics object. The memory storage for the CachedBitmap is opaque
+* to the other Engine code, so the only operations supported are
+* initializing the data (with a bitmap) and using the graphics to
+* draw it on the screen with an integer offset.
+*
+* Look for the class definition in GdiplusHeaders.h
+*
+* Created:
+*
+* 04/23/2000 asecchia
+* Created it.
+*
+**************************************************************************/
+inline
+CachedBitmap::CachedBitmap(
+ IN Bitmap *bitmap,
+ IN Graphics *graphics)
+{
+ nativeCachedBitmap = NULL;
+
+ lastResult = DllExports::GdipCreateCachedBitmap(
+ (GpBitmap *)bitmap->nativeImage,
+ graphics->nativeGraphics,
+ &nativeCachedBitmap
+ );
+}
+
+inline
+CachedBitmap::~CachedBitmap()
+{
+ DllExports::GdipDeleteCachedBitmap(nativeCachedBitmap);
+}
+
+inline Status
+CachedBitmap::GetLastStatus() const
+{
+ Status lastStatus = lastResult;
+ lastResult = Ok;
+ return (lastStatus);
+}
+
+#endif
+
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusColor.h b/core/src/fxge/Microsoft SDK/include/GdiPlusColor.h
new file mode 100644
index 0000000000..72c21c295f
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusColor.h
@@ -0,0 +1,209 @@
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusColor.h
+*
+* Abstract:
+*
+* Represents a GDI+ color.
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUSCOLOR_H
+#define _GDIPLUSCOLOR_H
+
+//----------------------------------------------------------------------------
+// Color mode
+//----------------------------------------------------------------------------
+
+enum ColorMode
+{
+ ColorModeARGB32 = 0,
+ ColorModeARGB64 = 1
+};
+
+//----------------------------------------------------------------------------
+// Color Channel flags
+//----------------------------------------------------------------------------
+
+enum ColorChannelFlags
+{
+ ColorChannelFlagsC = 0,
+ ColorChannelFlagsM,
+ ColorChannelFlagsY,
+ ColorChannelFlagsK,
+ ColorChannelFlagsLast
+};
+
+//----------------------------------------------------------------------------
+// Color
+//----------------------------------------------------------------------------
+
+class Color
+{
+public:
+
+ Color()
+ {
+ Argb = (ARGB)Color::Black;
+ }
+
+ // Construct an opaque Color object with
+ // the specified R, G, B values.
+
+ Color(IN BYTE r,
+ IN BYTE g,
+ IN BYTE b)
+ {
+ Argb = MakeARGB(255, r, g, b);
+ }
+
+ // Construct a Color object with
+ // the specified A, R, G, B values.
+ //
+ // NOTE: R, G, B color values are not premultiplied.
+
+ Color(IN BYTE a,
+ IN BYTE r,
+ IN BYTE g,
+ IN BYTE b)
+ {
+ Argb = MakeARGB(a, r, g, b);
+ }
+
+ // Construct a Color object with
+ // the specified ARGB values.
+ //
+ // NOTE: R, G, B color components are not premultiplied.
+
+ Color(IN ARGB argb)
+ {
+ Argb = argb;
+ }
+
+ // Extract A, R, G, B components
+
+ BYTE GetAlpha() const
+ {
+ return (BYTE) (Argb >> AlphaShift);
+ }
+
+ BYTE GetA() const
+ {
+ return GetAlpha();
+ }
+
+ BYTE GetRed() const
+ {
+ return (BYTE) (Argb >> RedShift);
+ }
+
+ BYTE GetR() const
+ {
+ return GetRed();
+ }
+
+ BYTE GetGreen() const
+ {
+ return (BYTE) (Argb >> GreenShift);
+ }
+
+ BYTE GetG() const
+ {
+ return GetGreen();
+ }
+
+ BYTE GetBlue() const
+ {
+ return (BYTE) (Argb >> BlueShift);
+ }
+
+ BYTE GetB() const
+ {
+ return GetBlue();
+ }
+
+ // Retrieve ARGB values
+
+ ARGB GetValue() const
+ {
+ return Argb;
+ }
+
+ VOID SetValue(IN ARGB argb)
+ {
+ Argb = argb;
+ }
+
+ VOID SetFromCOLORREF(IN COLORREF rgb)
+ {
+ Argb = MakeARGB(255, GetRValue(rgb), GetGValue(rgb), GetBValue(rgb));
+ }
+
+ COLORREF ToCOLORREF() const
+ {
+ return RGB(GetRed(), GetGreen(), GetBlue());
+ }
+
+public:
+
+ // Standard color constants
+ enum
+ {
+ Black = 0xff000000,
+ Silver = 0xffc0c0c0,
+ Gray = 0xff808080,
+ White = 0xffffffff,
+ Maroon = 0xff800000,
+ Red = 0xffff0000,
+ Purple = 0xff800080,
+ Fuchsia = 0xffff00ff,
+ Green = 0xff008000,
+ Lime = 0xff00ff00,
+ Olive = 0xff808000,
+ Yellow = 0xffffff00,
+ Navy = 0xff000080,
+ Blue = 0xff0000ff,
+ Teal = 0xff008080,
+ Aqua = 0xff00ffff
+ };
+
+ // Shift count and bit mask for A, R, G, B components
+ enum
+ {
+ AlphaShift = 24,
+ RedShift = 16,
+ GreenShift = 8,
+ BlueShift = 0
+ };
+
+ enum
+ {
+ AlphaMask = 0xff000000,
+ RedMask = 0x00ff0000,
+ GreenMask = 0x0000ff00,
+ BlueMask = 0x000000ff
+ };
+
+ // Assemble A, R, G, B values into a 32-bit integer
+ static ARGB MakeARGB(IN BYTE a,
+ IN BYTE r,
+ IN BYTE g,
+ IN BYTE b)
+ {
+ return (((ARGB) (b) << BlueShift) |
+ ((ARGB) (g) << GreenShift) |
+ ((ARGB) (r) << RedShift) |
+ ((ARGB) (a) << AlphaShift));
+ }
+
+protected:
+
+ ARGB Argb;
+};
+
+#endif
+
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusColorMatrix.h b/core/src/fxge/Microsoft SDK/include/GdiPlusColorMatrix.h
new file mode 100644
index 0000000000..d1d9ebc534
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusColorMatrix.h
@@ -0,0 +1,63 @@
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusColorMatrix.h
+*
+* Abstract:
+*
+* Class for color adjustment object passed to Graphics.DrawImage
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUSCOLORMATRIX_H
+#define _GDIPLUSCOLORMATRIX_H
+
+//----------------------------------------------------------------------------
+// Color matrix
+//----------------------------------------------------------------------------
+
+struct ColorMatrix
+{
+ REAL m[5][5];
+};
+
+//----------------------------------------------------------------------------
+// Color Matrix flags
+//----------------------------------------------------------------------------
+
+enum ColorMatrixFlags
+{
+ ColorMatrixFlagsDefault = 0,
+ ColorMatrixFlagsSkipGrays = 1,
+ ColorMatrixFlagsAltGray = 2
+};
+
+//----------------------------------------------------------------------------
+// Color Adjust Type
+//----------------------------------------------------------------------------
+
+enum ColorAdjustType
+{
+ ColorAdjustTypeDefault,
+ ColorAdjustTypeBitmap,
+ ColorAdjustTypeBrush,
+ ColorAdjustTypePen,
+ ColorAdjustTypeText,
+ ColorAdjustTypeCount, // must be immediately after all the individual ones
+ ColorAdjustTypeAny // internal use: for querying if any type has recoloring
+};
+
+//----------------------------------------------------------------------------
+// Color Map
+//----------------------------------------------------------------------------
+
+struct ColorMap
+{
+ Color oldColor;
+ Color newColor;
+};
+
+#endif
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusEnums.h b/core/src/fxge/Microsoft SDK/include/GdiPlusEnums.h
new file mode 100644
index 0000000000..92a29c7463
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusEnums.h
@@ -0,0 +1,1252 @@
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusEnums.h
+*
+* Abstract:
+*
+* Various enumeration types
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUSENUMS_H
+#define _GDIPLUSENUMS_H
+
+
+//--------------------------------------------------------------------------
+// Default bezier flattening tolerance in device pixels.
+//--------------------------------------------------------------------------
+
+const float FlatnessDefault = 1.0f/4.0f;
+
+//--------------------------------------------------------------------------
+// Graphics and Container State cookies
+//--------------------------------------------------------------------------
+
+typedef UINT GraphicsState;
+typedef UINT GraphicsContainer;
+
+//--------------------------------------------------------------------------
+// Fill mode constants
+//--------------------------------------------------------------------------
+
+enum FillMode
+{
+ FillModeAlternate, // 0
+ FillModeWinding // 1
+};
+
+//--------------------------------------------------------------------------
+// Quality mode constants
+//--------------------------------------------------------------------------
+
+enum QualityMode
+{
+ QualityModeInvalid = -1,
+ QualityModeDefault = 0,
+ QualityModeLow = 1, // for apps that need the best performance
+ QualityModeHigh = 2 // for apps that need the best rendering quality
+};
+
+//--------------------------------------------------------------------------
+// Alpha compositing mode constants
+//--------------------------------------------------------------------------
+
+enum CompositingMode
+{
+ CompositingModeSourceOver, // 0
+ CompositingModeSourceCopy // 1
+};
+
+//--------------------------------------------------------------------------
+// Alpha compositing quality constants
+//--------------------------------------------------------------------------
+
+enum CompositingQuality
+{
+ CompositingQualityInvalid = QualityModeInvalid,
+ CompositingQualityDefault = QualityModeDefault,
+ CompositingQualityHighSpeed = QualityModeLow,
+ CompositingQualityHighQuality = QualityModeHigh,
+ CompositingQualityGammaCorrected,
+ CompositingQualityAssumeLinear
+};
+
+//--------------------------------------------------------------------------
+// Unit constants
+//--------------------------------------------------------------------------
+
+enum Unit
+{
+ UnitWorld, // 0 -- World coordinate (non-physical unit)
+ UnitDisplay, // 1 -- Variable -- for PageTransform only
+ UnitPixel, // 2 -- Each unit is one device pixel.
+ UnitPoint, // 3 -- Each unit is a printer's point, or 1/72 inch.
+ UnitInch, // 4 -- Each unit is 1 inch.
+ UnitDocument, // 5 -- Each unit is 1/300 inch.
+ UnitMillimeter // 6 -- Each unit is 1 millimeter.
+};
+
+//--------------------------------------------------------------------------
+// MetafileFrameUnit
+//
+// The frameRect for creating a metafile can be specified in any of these
+// units. There is an extra frame unit value (MetafileFrameUnitGdi) so
+// that units can be supplied in the same units that GDI expects for
+// frame rects -- these units are in .01 (1/100ths) millimeter units
+// as defined by GDI.
+//--------------------------------------------------------------------------
+enum MetafileFrameUnit
+{
+ MetafileFrameUnitPixel = UnitPixel,
+ MetafileFrameUnitPoint = UnitPoint,
+ MetafileFrameUnitInch = UnitInch,
+ MetafileFrameUnitDocument = UnitDocument,
+ MetafileFrameUnitMillimeter = UnitMillimeter,
+ MetafileFrameUnitGdi // GDI compatible .01 MM units
+};
+
+//--------------------------------------------------------------------------
+// Coordinate space identifiers
+//--------------------------------------------------------------------------
+
+enum CoordinateSpace
+{
+ CoordinateSpaceWorld, // 0
+ CoordinateSpacePage, // 1
+ CoordinateSpaceDevice // 2
+};
+
+//--------------------------------------------------------------------------
+// Various wrap modes for brushes
+//--------------------------------------------------------------------------
+
+enum WrapMode
+{
+ WrapModeTile, // 0
+ WrapModeTileFlipX, // 1
+ WrapModeTileFlipY, // 2
+ WrapModeTileFlipXY, // 3
+ WrapModeClamp // 4
+};
+
+//--------------------------------------------------------------------------
+// Various hatch styles
+//--------------------------------------------------------------------------
+
+enum HatchStyle
+{
+ HatchStyleHorizontal, // 0
+ HatchStyleVertical, // 1
+ HatchStyleForwardDiagonal, // 2
+ HatchStyleBackwardDiagonal, // 3
+ HatchStyleCross, // 4
+ HatchStyleDiagonalCross, // 5
+ HatchStyle05Percent, // 6
+ HatchStyle10Percent, // 7
+ HatchStyle20Percent, // 8
+ HatchStyle25Percent, // 9
+ HatchStyle30Percent, // 10
+ HatchStyle40Percent, // 11
+ HatchStyle50Percent, // 12
+ HatchStyle60Percent, // 13
+ HatchStyle70Percent, // 14
+ HatchStyle75Percent, // 15
+ HatchStyle80Percent, // 16
+ HatchStyle90Percent, // 17
+ HatchStyleLightDownwardDiagonal, // 18
+ HatchStyleLightUpwardDiagonal, // 19
+ HatchStyleDarkDownwardDiagonal, // 20
+ HatchStyleDarkUpwardDiagonal, // 21
+ HatchStyleWideDownwardDiagonal, // 22
+ HatchStyleWideUpwardDiagonal, // 23
+ HatchStyleLightVertical, // 24
+ HatchStyleLightHorizontal, // 25
+ HatchStyleNarrowVertical, // 26
+ HatchStyleNarrowHorizontal, // 27
+ HatchStyleDarkVertical, // 28
+ HatchStyleDarkHorizontal, // 29
+ HatchStyleDashedDownwardDiagonal, // 30
+ HatchStyleDashedUpwardDiagonal, // 31
+ HatchStyleDashedHorizontal, // 32
+ HatchStyleDashedVertical, // 33
+ HatchStyleSmallConfetti, // 34
+ HatchStyleLargeConfetti, // 35
+ HatchStyleZigZag, // 36
+ HatchStyleWave, // 37
+ HatchStyleDiagonalBrick, // 38
+ HatchStyleHorizontalBrick, // 39
+ HatchStyleWeave, // 40
+ HatchStylePlaid, // 41
+ HatchStyleDivot, // 42
+ HatchStyleDottedGrid, // 43
+ HatchStyleDottedDiamond, // 44
+ HatchStyleShingle, // 45
+ HatchStyleTrellis, // 46
+ HatchStyleSphere, // 47
+ HatchStyleSmallGrid, // 48
+ HatchStyleSmallCheckerBoard, // 49
+ HatchStyleLargeCheckerBoard, // 50
+ HatchStyleOutlinedDiamond, // 51
+ HatchStyleSolidDiamond, // 52
+
+ HatchStyleTotal, // must be after all unique hatch styles
+
+ HatchStyleLargeGrid = HatchStyleCross, // 4 an alias for the cross style
+
+ HatchStyleMin = HatchStyleHorizontal,
+ HatchStyleMax = HatchStyleTotal - 1,
+};
+
+//--------------------------------------------------------------------------
+// Dash style constants
+//--------------------------------------------------------------------------
+
+enum DashStyle
+{
+ DashStyleSolid, // 0
+ DashStyleDash, // 1
+ DashStyleDot, // 2
+ DashStyleDashDot, // 3
+ DashStyleDashDotDot, // 4
+ DashStyleCustom // 5
+};
+
+//--------------------------------------------------------------------------
+// Dash cap constants
+//--------------------------------------------------------------------------
+
+enum DashCap
+{
+ DashCapFlat = 0,
+ DashCapRound = 2,
+ DashCapTriangle = 3
+};
+
+//--------------------------------------------------------------------------
+// Line cap constants (only the lowest 8 bits are used).
+//--------------------------------------------------------------------------
+
+enum LineCap
+{
+ LineCapFlat = 0,
+ LineCapSquare = 1,
+ LineCapRound = 2,
+ LineCapTriangle = 3,
+
+ LineCapNoAnchor = 0x10, // corresponds to flat cap
+ LineCapSquareAnchor = 0x11, // corresponds to square cap
+ LineCapRoundAnchor = 0x12, // corresponds to round cap
+ LineCapDiamondAnchor = 0x13, // corresponds to triangle cap
+ LineCapArrowAnchor = 0x14, // no correspondence
+
+ LineCapCustom = 0xff, // custom cap
+
+ LineCapAnchorMask = 0xf0 // mask to check for anchor or not.
+};
+
+//--------------------------------------------------------------------------
+// Custom Line cap type constants
+//--------------------------------------------------------------------------
+
+enum CustomLineCapType
+{
+ CustomLineCapTypeDefault = 0,
+ CustomLineCapTypeAdjustableArrow = 1
+};
+
+//--------------------------------------------------------------------------
+// Line join constants
+//--------------------------------------------------------------------------
+
+enum LineJoin
+{
+ LineJoinMiter = 0,
+ LineJoinBevel = 1,
+ LineJoinRound = 2,
+ LineJoinMiterClipped = 3
+};
+
+//--------------------------------------------------------------------------
+// Path point types (only the lowest 8 bits are used.)
+// The lowest 3 bits are interpreted as point type
+// The higher 5 bits are reserved for flags.
+//--------------------------------------------------------------------------
+
+enum PathPointType
+{
+ PathPointTypeStart = 0, // move
+ PathPointTypeLine = 1, // line
+ PathPointTypeBezier = 3, // default Beizer (= cubic Bezier)
+ PathPointTypePathTypeMask = 0x07, // type mask (lowest 3 bits).
+ PathPointTypeDashMode = 0x10, // currently in dash mode.
+ PathPointTypePathMarker = 0x20, // a marker for the path.
+ PathPointTypeCloseSubpath = 0x80, // closed flag
+
+ // Path types used for advanced path.
+
+ PathPointTypeBezier2 = 2, // quadratic Beizer
+ PathPointTypeBezier3 = 3, // cubic Bezier
+ PathPointTypeBezier4 = 4, // quartic (4th order) Beizer
+ PathPointTypeBezier5 = 5, // quintic (5th order) Bezier
+ PathPointTypeBezier6 = 6 // hexaic (6th order) Bezier
+};
+
+
+//--------------------------------------------------------------------------
+// WarpMode constants
+//--------------------------------------------------------------------------
+
+enum WarpMode
+{
+ WarpModePerspective, // 0
+ WarpModeBilinear // 1
+};
+
+//--------------------------------------------------------------------------
+// LineGradient Mode
+//--------------------------------------------------------------------------
+
+enum LinearGradientMode
+{
+ LinearGradientModeHorizontal, // 0
+ LinearGradientModeVertical, // 1
+ LinearGradientModeForwardDiagonal, // 2
+ LinearGradientModeBackwardDiagonal // 3
+};
+
+//--------------------------------------------------------------------------
+// Region Comine Modes
+//--------------------------------------------------------------------------
+
+enum CombineMode
+{
+ CombineModeReplace, // 0
+ CombineModeIntersect, // 1
+ CombineModeUnion, // 2
+ CombineModeXor, // 3
+ CombineModeExclude, // 4
+ CombineModeComplement // 5 (does exclude from)
+};
+
+//--------------------------------------------------------------------------
+ // Image types
+//--------------------------------------------------------------------------
+
+enum ImageType
+{
+ ImageTypeUnknown, // 0
+ ImageTypeBitmap, // 1
+ ImageTypeMetafile // 2
+};
+
+//--------------------------------------------------------------------------
+// Interpolation modes
+//--------------------------------------------------------------------------
+
+enum InterpolationMode
+{
+ InterpolationModeInvalid = QualityModeInvalid,
+ InterpolationModeDefault = QualityModeDefault,
+ InterpolationModeLowQuality = QualityModeLow,
+ InterpolationModeHighQuality = QualityModeHigh,
+ InterpolationModeBilinear,
+ InterpolationModeBicubic,
+ InterpolationModeNearestNeighbor,
+ InterpolationModeHighQualityBilinear,
+ InterpolationModeHighQualityBicubic
+};
+
+//--------------------------------------------------------------------------
+// Pen types
+//--------------------------------------------------------------------------
+enum PenAlignment
+{
+ PenAlignmentCenter = 0,
+ PenAlignmentInset = 1,
+ PenAlignmentOutset = 2,
+ PenAlignmentLeft = 3,
+ PenAlignmentRight = 4
+};
+
+//--------------------------------------------------------------------------
+// Brush types
+//--------------------------------------------------------------------------
+
+enum BrushType
+{
+ BrushTypeSolidColor = 0,
+ BrushTypeHatchFill = 1,
+ BrushTypeTextureFill = 2,
+ BrushTypePathGradient = 3,
+ BrushTypeLinearGradient = 4
+};
+
+//--------------------------------------------------------------------------
+// Pen's Fill types
+//--------------------------------------------------------------------------
+
+enum PenType
+{
+ PenTypeSolidColor = BrushTypeSolidColor,
+ PenTypeHatchFill = BrushTypeHatchFill,
+ PenTypeTextureFill = BrushTypeTextureFill,
+ PenTypePathGradient = BrushTypePathGradient,
+ PenTypeLinearGradient = BrushTypeLinearGradient,
+ PenTypeUnknown = -1
+};
+
+//--------------------------------------------------------------------------
+// Matrix Order
+//--------------------------------------------------------------------------
+
+enum MatrixOrder
+{
+ MatrixOrderPrepend = 0,
+ MatrixOrderAppend = 1
+};
+
+//--------------------------------------------------------------------------
+// Generic font families
+//--------------------------------------------------------------------------
+
+enum GenericFontFamily
+{
+ GenericFontFamilySerif,
+ GenericFontFamilySansSerif,
+ GenericFontFamilyMonospace
+
+};
+
+//--------------------------------------------------------------------------
+// FontStyle: face types and common styles
+//--------------------------------------------------------------------------
+
+// These should probably be flags
+
+// Must have:
+// Regular = 0
+// Bold = 1
+// Italic = 2
+// BoldItalic = 3
+
+enum FontStyle
+{
+ FontStyleRegular = 0,
+ FontStyleBold = 1,
+ FontStyleItalic = 2,
+ FontStyleBoldItalic = 3,
+ FontStyleUnderline = 4,
+ FontStyleStrikeout = 8
+};
+
+//---------------------------------------------------------------------------
+// Smoothing Mode
+//---------------------------------------------------------------------------
+
+enum SmoothingMode
+{
+ SmoothingModeInvalid = QualityModeInvalid,
+ SmoothingModeDefault = QualityModeDefault,
+ SmoothingModeHighSpeed = QualityModeLow,
+ SmoothingModeHighQuality = QualityModeHigh,
+ SmoothingModeNone,
+ SmoothingModeAntiAlias
+};
+
+//---------------------------------------------------------------------------
+// Pixel Format Mode
+//---------------------------------------------------------------------------
+
+enum PixelOffsetMode
+{
+ PixelOffsetModeInvalid = QualityModeInvalid,
+ PixelOffsetModeDefault = QualityModeDefault,
+ PixelOffsetModeHighSpeed = QualityModeLow,
+ PixelOffsetModeHighQuality = QualityModeHigh,
+ PixelOffsetModeNone, // no pixel offset
+ PixelOffsetModeHalf // offset by -0.5, -0.5 for fast anti-alias perf
+};
+
+//---------------------------------------------------------------------------
+// Text Rendering Hint
+//---------------------------------------------------------------------------
+
+enum TextRenderingHint
+{
+#ifdef DCR_USE_NEW_186764
+ TextRenderingHintSystemDefault = 0, // Glyph with system default rendering hint
+ TextRenderingHintSingleBitPerPixelGridFit, // Glyph bitmap with hinting
+#else
+ TextRenderingHintSingleBitPerPixelGridFit = 0, // Glyph bitmap with hinting
+#endif // DCR_USE_NEW_186764
+ TextRenderingHintSingleBitPerPixel, // Glyph bitmap without hinting
+ TextRenderingHintAntiAliasGridFit, // Glyph anti-alias bitmap with hinting
+ TextRenderingHintAntiAlias, // Glyph anti-alias bitmap without hinting
+ TextRenderingHintClearTypeGridFit // Glyph CT bitmap with hinting
+};
+
+//---------------------------------------------------------------------------
+// Metafile Types
+//---------------------------------------------------------------------------
+enum MetafileType
+{
+ MetafileTypeInvalid, // Invalid metafile
+ MetafileTypeWmf, // Standard WMF
+ MetafileTypeWmfAldus, // Aldus Placeable Metafile format
+ MetafileTypeEmf, // EMF (not EMF+)
+ MetafileTypeEmfPlusOnly, // EMF+ without dual, down-level records
+ MetafileTypeEmfPlusDual // EMF+ with dual, down-level records
+};
+
+// Specifies the type of EMF to record
+enum EmfType
+{
+ EmfTypeEmfOnly = MetafileTypeEmf, // no EMF+, only EMF
+ EmfTypeEmfPlusOnly = MetafileTypeEmfPlusOnly, // no EMF, only EMF+
+ EmfTypeEmfPlusDual = MetafileTypeEmfPlusDual // both EMF+ and EMF
+};
+
+// All persistent objects must have a type listed here
+enum ObjectType
+{
+ ObjectTypeInvalid,
+ ObjectTypeBrush,
+ ObjectTypePen,
+ ObjectTypePath,
+ ObjectTypeRegion,
+ ObjectTypeImage,
+ ObjectTypeFont,
+ ObjectTypeStringFormat,
+ ObjectTypeImageAttributes,
+ ObjectTypeCustomLineCap,
+
+ ObjectTypeMax = ObjectTypeCustomLineCap,
+ ObjectTypeMin = ObjectTypeBrush
+};
+
+inline BOOL
+ObjectTypeIsValid(
+ ObjectType type
+ )
+{
+ return ((type >= ObjectTypeMin) && (type <= ObjectTypeMax));
+}
+
+//---------------------------------------------------------------------------
+// EMF+ Records
+//---------------------------------------------------------------------------
+
+// We have to change the WMF record numbers so that they don't conflict with
+// the EMF and EMF+ record numbers.
+enum EmfPlusRecordType;
+#define GDIP_EMFPLUS_RECORD_BASE 0x00004000
+#define GDIP_WMF_RECORD_BASE 0x00010000
+#define GDIP_WMF_RECORD_TO_EMFPLUS(n) ((EmfPlusRecordType)((n) | GDIP_WMF_RECORD_BASE))
+#define GDIP_EMFPLUS_RECORD_TO_WMF(n) ((n) & (~GDIP_WMF_RECORD_BASE))
+#define GDIP_IS_WMF_RECORDTYPE(n) (((n) & GDIP_WMF_RECORD_BASE) != 0)
+
+enum EmfPlusRecordType
+{
+ // Since we have to enumerate GDI records right along with GDI+ records,
+ // we list all the GDI records here so that they can be part of the
+ // same enumeration type which is used in the enumeration callback.
+
+ WmfRecordTypeSetBkColor = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETBKCOLOR),
+ WmfRecordTypeSetBkMode = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETBKMODE),
+ WmfRecordTypeSetMapMode = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETMAPMODE),
+ WmfRecordTypeSetROP2 = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETROP2),
+ WmfRecordTypeSetRelAbs = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETRELABS),
+ WmfRecordTypeSetPolyFillMode = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETPOLYFILLMODE),
+ WmfRecordTypeSetStretchBltMode = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETSTRETCHBLTMODE),
+ WmfRecordTypeSetTextCharExtra = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETTEXTCHAREXTRA),
+ WmfRecordTypeSetTextColor = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETTEXTCOLOR),
+ WmfRecordTypeSetTextJustification = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETTEXTJUSTIFICATION),
+ WmfRecordTypeSetWindowOrg = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETWINDOWORG),
+ WmfRecordTypeSetWindowExt = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETWINDOWEXT),
+ WmfRecordTypeSetViewportOrg = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETVIEWPORTORG),
+ WmfRecordTypeSetViewportExt = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETVIEWPORTEXT),
+ WmfRecordTypeOffsetWindowOrg = GDIP_WMF_RECORD_TO_EMFPLUS(META_OFFSETWINDOWORG),
+ WmfRecordTypeScaleWindowExt = GDIP_WMF_RECORD_TO_EMFPLUS(META_SCALEWINDOWEXT),
+ WmfRecordTypeOffsetViewportOrg = GDIP_WMF_RECORD_TO_EMFPLUS(META_OFFSETVIEWPORTORG),
+ WmfRecordTypeScaleViewportExt = GDIP_WMF_RECORD_TO_EMFPLUS(META_SCALEVIEWPORTEXT),
+ WmfRecordTypeLineTo = GDIP_WMF_RECORD_TO_EMFPLUS(META_LINETO),
+ WmfRecordTypeMoveTo = GDIP_WMF_RECORD_TO_EMFPLUS(META_MOVETO),
+ WmfRecordTypeExcludeClipRect = GDIP_WMF_RECORD_TO_EMFPLUS(META_EXCLUDECLIPRECT),
+ WmfRecordTypeIntersectClipRect = GDIP_WMF_RECORD_TO_EMFPLUS(META_INTERSECTCLIPRECT),
+ WmfRecordTypeArc = GDIP_WMF_RECORD_TO_EMFPLUS(META_ARC),
+ WmfRecordTypeEllipse = GDIP_WMF_RECORD_TO_EMFPLUS(META_ELLIPSE),
+ WmfRecordTypeFloodFill = GDIP_WMF_RECORD_TO_EMFPLUS(META_FLOODFILL),
+ WmfRecordTypePie = GDIP_WMF_RECORD_TO_EMFPLUS(META_PIE),
+ WmfRecordTypeRectangle = GDIP_WMF_RECORD_TO_EMFPLUS(META_RECTANGLE),
+ WmfRecordTypeRoundRect = GDIP_WMF_RECORD_TO_EMFPLUS(META_ROUNDRECT),
+ WmfRecordTypePatBlt = GDIP_WMF_RECORD_TO_EMFPLUS(META_PATBLT),
+ WmfRecordTypeSaveDC = GDIP_WMF_RECORD_TO_EMFPLUS(META_SAVEDC),
+ WmfRecordTypeSetPixel = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETPIXEL),
+ WmfRecordTypeOffsetClipRgn = GDIP_WMF_RECORD_TO_EMFPLUS(META_OFFSETCLIPRGN),
+ WmfRecordTypeTextOut = GDIP_WMF_RECORD_TO_EMFPLUS(META_TEXTOUT),
+ WmfRecordTypeBitBlt = GDIP_WMF_RECORD_TO_EMFPLUS(META_BITBLT),
+ WmfRecordTypeStretchBlt = GDIP_WMF_RECORD_TO_EMFPLUS(META_STRETCHBLT),
+ WmfRecordTypePolygon = GDIP_WMF_RECORD_TO_EMFPLUS(META_POLYGON),
+ WmfRecordTypePolyline = GDIP_WMF_RECORD_TO_EMFPLUS(META_POLYLINE),
+ WmfRecordTypeEscape = GDIP_WMF_RECORD_TO_EMFPLUS(META_ESCAPE),
+ WmfRecordTypeRestoreDC = GDIP_WMF_RECORD_TO_EMFPLUS(META_RESTOREDC),
+ WmfRecordTypeFillRegion = GDIP_WMF_RECORD_TO_EMFPLUS(META_FILLREGION),
+ WmfRecordTypeFrameRegion = GDIP_WMF_RECORD_TO_EMFPLUS(META_FRAMEREGION),
+ WmfRecordTypeInvertRegion = GDIP_WMF_RECORD_TO_EMFPLUS(META_INVERTREGION),
+ WmfRecordTypePaintRegion = GDIP_WMF_RECORD_TO_EMFPLUS(META_PAINTREGION),
+ WmfRecordTypeSelectClipRegion = GDIP_WMF_RECORD_TO_EMFPLUS(META_SELECTCLIPREGION),
+ WmfRecordTypeSelectObject = GDIP_WMF_RECORD_TO_EMFPLUS(META_SELECTOBJECT),
+ WmfRecordTypeSetTextAlign = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETTEXTALIGN),
+ WmfRecordTypeDrawText = GDIP_WMF_RECORD_TO_EMFPLUS(0x062F), // META_DRAWTEXT
+ WmfRecordTypeChord = GDIP_WMF_RECORD_TO_EMFPLUS(META_CHORD),
+ WmfRecordTypeSetMapperFlags = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETMAPPERFLAGS),
+ WmfRecordTypeExtTextOut = GDIP_WMF_RECORD_TO_EMFPLUS(META_EXTTEXTOUT),
+ WmfRecordTypeSetDIBToDev = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETDIBTODEV),
+ WmfRecordTypeSelectPalette = GDIP_WMF_RECORD_TO_EMFPLUS(META_SELECTPALETTE),
+ WmfRecordTypeRealizePalette = GDIP_WMF_RECORD_TO_EMFPLUS(META_REALIZEPALETTE),
+ WmfRecordTypeAnimatePalette = GDIP_WMF_RECORD_TO_EMFPLUS(META_ANIMATEPALETTE),
+ WmfRecordTypeSetPalEntries = GDIP_WMF_RECORD_TO_EMFPLUS(META_SETPALENTRIES),
+ WmfRecordTypePolyPolygon = GDIP_WMF_RECORD_TO_EMFPLUS(META_POLYPOLYGON),
+ WmfRecordTypeResizePalette = GDIP_WMF_RECORD_TO_EMFPLUS(META_RESIZEPALETTE),
+ WmfRecordTypeDIBBitBlt = GDIP_WMF_RECORD_TO_EMFPLUS(META_DIBBITBLT),
+ WmfRecordTypeDIBStretchBlt = GDIP_WMF_RECORD_TO_EMFPLUS(META_DIBSTRETCHBLT),
+ WmfRecordTypeDIBCreatePatternBrush = GDIP_WMF_RECORD_TO_EMFPLUS(META_DIBCREATEPATTERNBRUSH),
+ WmfRecordTypeStretchDIB = GDIP_WMF_RECORD_TO_EMFPLUS(META_STRETCHDIB),
+ WmfRecordTypeExtFloodFill = GDIP_WMF_RECORD_TO_EMFPLUS(META_EXTFLOODFILL),
+ WmfRecordTypeSetLayout = GDIP_WMF_RECORD_TO_EMFPLUS(0x0149), // META_SETLAYOUT
+ WmfRecordTypeResetDC = GDIP_WMF_RECORD_TO_EMFPLUS(0x014C), // META_RESETDC
+ WmfRecordTypeStartDoc = GDIP_WMF_RECORD_TO_EMFPLUS(0x014D), // META_STARTDOC
+ WmfRecordTypeStartPage = GDIP_WMF_RECORD_TO_EMFPLUS(0x004F), // META_STARTPAGE
+ WmfRecordTypeEndPage = GDIP_WMF_RECORD_TO_EMFPLUS(0x0050), // META_ENDPAGE
+ WmfRecordTypeAbortDoc = GDIP_WMF_RECORD_TO_EMFPLUS(0x0052), // META_ABORTDOC
+ WmfRecordTypeEndDoc = GDIP_WMF_RECORD_TO_EMFPLUS(0x005E), // META_ENDDOC
+ WmfRecordTypeDeleteObject = GDIP_WMF_RECORD_TO_EMFPLUS(META_DELETEOBJECT),
+ WmfRecordTypeCreatePalette = GDIP_WMF_RECORD_TO_EMFPLUS(META_CREATEPALETTE),
+ WmfRecordTypeCreateBrush = GDIP_WMF_RECORD_TO_EMFPLUS(0x00F8), // META_CREATEBRUSH
+ WmfRecordTypeCreatePatternBrush = GDIP_WMF_RECORD_TO_EMFPLUS(META_CREATEPATTERNBRUSH),
+ WmfRecordTypeCreatePenIndirect = GDIP_WMF_RECORD_TO_EMFPLUS(META_CREATEPENINDIRECT),
+ WmfRecordTypeCreateFontIndirect = GDIP_WMF_RECORD_TO_EMFPLUS(META_CREATEFONTINDIRECT),
+ WmfRecordTypeCreateBrushIndirect = GDIP_WMF_RECORD_TO_EMFPLUS(META_CREATEBRUSHINDIRECT),
+ WmfRecordTypeCreateBitmapIndirect = GDIP_WMF_RECORD_TO_EMFPLUS(0x02FD), // META_CREATEBITMAPINDIRECT
+ WmfRecordTypeCreateBitmap = GDIP_WMF_RECORD_TO_EMFPLUS(0x06FE), // META_CREATEBITMAP
+ WmfRecordTypeCreateRegion = GDIP_WMF_RECORD_TO_EMFPLUS(META_CREATEREGION),
+
+ EmfRecordTypeHeader = EMR_HEADER,
+ EmfRecordTypePolyBezier = EMR_POLYBEZIER,
+ EmfRecordTypePolygon = EMR_POLYGON,
+ EmfRecordTypePolyline = EMR_POLYLINE,
+ EmfRecordTypePolyBezierTo = EMR_POLYBEZIERTO,
+ EmfRecordTypePolyLineTo = EMR_POLYLINETO,
+ EmfRecordTypePolyPolyline = EMR_POLYPOLYLINE,
+ EmfRecordTypePolyPolygon = EMR_POLYPOLYGON,
+ EmfRecordTypeSetWindowExtEx = EMR_SETWINDOWEXTEX,
+ EmfRecordTypeSetWindowOrgEx = EMR_SETWINDOWORGEX,
+ EmfRecordTypeSetViewportExtEx = EMR_SETVIEWPORTEXTEX,
+ EmfRecordTypeSetViewportOrgEx = EMR_SETVIEWPORTORGEX,
+ EmfRecordTypeSetBrushOrgEx = EMR_SETBRUSHORGEX,
+ EmfRecordTypeEOF = EMR_EOF,
+ EmfRecordTypeSetPixelV = EMR_SETPIXELV,
+ EmfRecordTypeSetMapperFlags = EMR_SETMAPPERFLAGS,
+ EmfRecordTypeSetMapMode = EMR_SETMAPMODE,
+ EmfRecordTypeSetBkMode = EMR_SETBKMODE,
+ EmfRecordTypeSetPolyFillMode = EMR_SETPOLYFILLMODE,
+ EmfRecordTypeSetROP2 = EMR_SETROP2,
+ EmfRecordTypeSetStretchBltMode = EMR_SETSTRETCHBLTMODE,
+ EmfRecordTypeSetTextAlign = EMR_SETTEXTALIGN,
+ EmfRecordTypeSetColorAdjustment = EMR_SETCOLORADJUSTMENT,
+ EmfRecordTypeSetTextColor = EMR_SETTEXTCOLOR,
+ EmfRecordTypeSetBkColor = EMR_SETBKCOLOR,
+ EmfRecordTypeOffsetClipRgn = EMR_OFFSETCLIPRGN,
+ EmfRecordTypeMoveToEx = EMR_MOVETOEX,
+ EmfRecordTypeSetMetaRgn = EMR_SETMETARGN,
+ EmfRecordTypeExcludeClipRect = EMR_EXCLUDECLIPRECT,
+ EmfRecordTypeIntersectClipRect = EMR_INTERSECTCLIPRECT,
+ EmfRecordTypeScaleViewportExtEx = EMR_SCALEVIEWPORTEXTEX,
+ EmfRecordTypeScaleWindowExtEx = EMR_SCALEWINDOWEXTEX,
+ EmfRecordTypeSaveDC = EMR_SAVEDC,
+ EmfRecordTypeRestoreDC = EMR_RESTOREDC,
+ EmfRecordTypeSetWorldTransform = EMR_SETWORLDTRANSFORM,
+ EmfRecordTypeModifyWorldTransform = EMR_MODIFYWORLDTRANSFORM,
+ EmfRecordTypeSelectObject = EMR_SELECTOBJECT,
+ EmfRecordTypeCreatePen = EMR_CREATEPEN,
+ EmfRecordTypeCreateBrushIndirect = EMR_CREATEBRUSHINDIRECT,
+ EmfRecordTypeDeleteObject = EMR_DELETEOBJECT,
+ EmfRecordTypeAngleArc = EMR_ANGLEARC,
+ EmfRecordTypeEllipse = EMR_ELLIPSE,
+ EmfRecordTypeRectangle = EMR_RECTANGLE,
+ EmfRecordTypeRoundRect = EMR_ROUNDRECT,
+ EmfRecordTypeArc = EMR_ARC,
+ EmfRecordTypeChord = EMR_CHORD,
+ EmfRecordTypePie = EMR_PIE,
+ EmfRecordTypeSelectPalette = EMR_SELECTPALETTE,
+ EmfRecordTypeCreatePalette = EMR_CREATEPALETTE,
+ EmfRecordTypeSetPaletteEntries = EMR_SETPALETTEENTRIES,
+ EmfRecordTypeResizePalette = EMR_RESIZEPALETTE,
+ EmfRecordTypeRealizePalette = EMR_REALIZEPALETTE,
+ EmfRecordTypeExtFloodFill = EMR_EXTFLOODFILL,
+ EmfRecordTypeLineTo = EMR_LINETO,
+ EmfRecordTypeArcTo = EMR_ARCTO,
+ EmfRecordTypePolyDraw = EMR_POLYDRAW,
+ EmfRecordTypeSetArcDirection = EMR_SETARCDIRECTION,
+ EmfRecordTypeSetMiterLimit = EMR_SETMITERLIMIT,
+ EmfRecordTypeBeginPath = EMR_BEGINPATH,
+ EmfRecordTypeEndPath = EMR_ENDPATH,
+ EmfRecordTypeCloseFigure = EMR_CLOSEFIGURE,
+ EmfRecordTypeFillPath = EMR_FILLPATH,
+ EmfRecordTypeStrokeAndFillPath = EMR_STROKEANDFILLPATH,
+ EmfRecordTypeStrokePath = EMR_STROKEPATH,
+ EmfRecordTypeFlattenPath = EMR_FLATTENPATH,
+ EmfRecordTypeWidenPath = EMR_WIDENPATH,
+ EmfRecordTypeSelectClipPath = EMR_SELECTCLIPPATH,
+ EmfRecordTypeAbortPath = EMR_ABORTPATH,
+ EmfRecordTypeReserved_069 = 69, // Not Used
+ EmfRecordTypeGdiComment = EMR_GDICOMMENT,
+ EmfRecordTypeFillRgn = EMR_FILLRGN,
+ EmfRecordTypeFrameRgn = EMR_FRAMERGN,
+ EmfRecordTypeInvertRgn = EMR_INVERTRGN,
+ EmfRecordTypePaintRgn = EMR_PAINTRGN,
+ EmfRecordTypeExtSelectClipRgn = EMR_EXTSELECTCLIPRGN,
+ EmfRecordTypeBitBlt = EMR_BITBLT,
+ EmfRecordTypeStretchBlt = EMR_STRETCHBLT,
+ EmfRecordTypeMaskBlt = EMR_MASKBLT,
+ EmfRecordTypePlgBlt = EMR_PLGBLT,
+ EmfRecordTypeSetDIBitsToDevice = EMR_SETDIBITSTODEVICE,
+ EmfRecordTypeStretchDIBits = EMR_STRETCHDIBITS,
+ EmfRecordTypeExtCreateFontIndirect = EMR_EXTCREATEFONTINDIRECTW,
+ EmfRecordTypeExtTextOutA = EMR_EXTTEXTOUTA,
+ EmfRecordTypeExtTextOutW = EMR_EXTTEXTOUTW,
+ EmfRecordTypePolyBezier16 = EMR_POLYBEZIER16,
+ EmfRecordTypePolygon16 = EMR_POLYGON16,
+ EmfRecordTypePolyline16 = EMR_POLYLINE16,
+ EmfRecordTypePolyBezierTo16 = EMR_POLYBEZIERTO16,
+ EmfRecordTypePolylineTo16 = EMR_POLYLINETO16,
+ EmfRecordTypePolyPolyline16 = EMR_POLYPOLYLINE16,
+ EmfRecordTypePolyPolygon16 = EMR_POLYPOLYGON16,
+ EmfRecordTypePolyDraw16 = EMR_POLYDRAW16,
+ EmfRecordTypeCreateMonoBrush = EMR_CREATEMONOBRUSH,
+ EmfRecordTypeCreateDIBPatternBrushPt = EMR_CREATEDIBPATTERNBRUSHPT,
+ EmfRecordTypeExtCreatePen = EMR_EXTCREATEPEN,
+ EmfRecordTypePolyTextOutA = EMR_POLYTEXTOUTA,
+ EmfRecordTypePolyTextOutW = EMR_POLYTEXTOUTW,
+ EmfRecordTypeSetICMMode = 98, // EMR_SETICMMODE,
+ EmfRecordTypeCreateColorSpace = 99, // EMR_CREATECOLORSPACE,
+ EmfRecordTypeSetColorSpace = 100, // EMR_SETCOLORSPACE,
+ EmfRecordTypeDeleteColorSpace = 101, // EMR_DELETECOLORSPACE,
+ EmfRecordTypeGLSRecord = 102, // EMR_GLSRECORD,
+ EmfRecordTypeGLSBoundedRecord = 103, // EMR_GLSBOUNDEDRECORD,
+ EmfRecordTypePixelFormat = 104, // EMR_PIXELFORMAT,
+ EmfRecordTypeDrawEscape = 105, // EMR_RESERVED_105,
+ EmfRecordTypeExtEscape = 106, // EMR_RESERVED_106,
+ EmfRecordTypeStartDoc = 107, // EMR_RESERVED_107,
+ EmfRecordTypeSmallTextOut = 108, // EMR_RESERVED_108,
+ EmfRecordTypeForceUFIMapping = 109, // EMR_RESERVED_109,
+ EmfRecordTypeNamedEscape = 110, // EMR_RESERVED_110,
+ EmfRecordTypeColorCorrectPalette = 111, // EMR_COLORCORRECTPALETTE,
+ EmfRecordTypeSetICMProfileA = 112, // EMR_SETICMPROFILEA,
+ EmfRecordTypeSetICMProfileW = 113, // EMR_SETICMPROFILEW,
+ EmfRecordTypeAlphaBlend = 114, // EMR_ALPHABLEND,
+ EmfRecordTypeSetLayout = 115, // EMR_SETLAYOUT,
+ EmfRecordTypeTransparentBlt = 116, // EMR_TRANSPARENTBLT,
+ EmfRecordTypeReserved_117 = 117, // Not Used
+ EmfRecordTypeGradientFill = 118, // EMR_GRADIENTFILL,
+ EmfRecordTypeSetLinkedUFIs = 119, // EMR_RESERVED_119,
+ EmfRecordTypeSetTextJustification = 120, // EMR_RESERVED_120,
+ EmfRecordTypeColorMatchToTargetW = 121, // EMR_COLORMATCHTOTARGETW,
+ EmfRecordTypeCreateColorSpaceW = 122, // EMR_CREATECOLORSPACEW,
+ EmfRecordTypeMax = 122,
+ EmfRecordTypeMin = 1,
+
+ // That is the END of the GDI EMF records.
+
+ // Now we start the list of EMF+ records. We leave quite
+ // a bit of room here for the addition of any new GDI
+ // records that may be added later.
+
+ EmfPlusRecordTypeInvalid = GDIP_EMFPLUS_RECORD_BASE,
+ EmfPlusRecordTypeHeader,
+ EmfPlusRecordTypeEndOfFile,
+
+ EmfPlusRecordTypeComment,
+
+ EmfPlusRecordTypeGetDC, // the application grabbed the metafile dc
+
+ EmfPlusRecordTypeMultiFormatStart,
+ EmfPlusRecordTypeMultiFormatSection,
+ EmfPlusRecordTypeMultiFormatEnd,
+
+ // For all persistent objects
+ EmfPlusRecordTypeObject, // brush,pen,path,region,image,font,string-format
+
+ // Drawing Records
+ EmfPlusRecordTypeClear,
+ EmfPlusRecordTypeFillRects,
+ EmfPlusRecordTypeDrawRects,
+ EmfPlusRecordTypeFillPolygon,
+ EmfPlusRecordTypeDrawLines,
+ EmfPlusRecordTypeFillEllipse,
+ EmfPlusRecordTypeDrawEllipse,
+ EmfPlusRecordTypeFillPie,
+ EmfPlusRecordTypeDrawPie,
+ EmfPlusRecordTypeDrawArc,
+ EmfPlusRecordTypeFillRegion,
+ EmfPlusRecordTypeFillPath,
+ EmfPlusRecordTypeDrawPath,
+ EmfPlusRecordTypeFillClosedCurve,
+ EmfPlusRecordTypeDrawClosedCurve,
+ EmfPlusRecordTypeDrawCurve,
+ EmfPlusRecordTypeDrawBeziers,
+ EmfPlusRecordTypeDrawImage,
+ EmfPlusRecordTypeDrawImagePoints,
+ EmfPlusRecordTypeDrawString,
+
+ // Graphics State Records
+ EmfPlusRecordTypeSetRenderingOrigin,
+ EmfPlusRecordTypeSetAntiAliasMode,
+ EmfPlusRecordTypeSetTextRenderingHint,
+#ifdef DCR_USE_NEW_188922
+ EmfPlusRecordTypeSetTextContrast,
+#else
+ EmfPlusRecordTypeSetGammaValue,
+#endif // DCR_USE_NEW_188922
+ EmfPlusRecordTypeSetInterpolationMode,
+ EmfPlusRecordTypeSetPixelOffsetMode,
+ EmfPlusRecordTypeSetCompositingMode,
+ EmfPlusRecordTypeSetCompositingQuality,
+ EmfPlusRecordTypeSave,
+ EmfPlusRecordTypeRestore,
+ EmfPlusRecordTypeBeginContainer,
+ EmfPlusRecordTypeBeginContainerNoParams,
+ EmfPlusRecordTypeEndContainer,
+ EmfPlusRecordTypeSetWorldTransform,
+ EmfPlusRecordTypeResetWorldTransform,
+ EmfPlusRecordTypeMultiplyWorldTransform,
+ EmfPlusRecordTypeTranslateWorldTransform,
+ EmfPlusRecordTypeScaleWorldTransform,
+ EmfPlusRecordTypeRotateWorldTransform,
+ EmfPlusRecordTypeSetPageTransform,
+ EmfPlusRecordTypeResetClip,
+ EmfPlusRecordTypeSetClipRect,
+ EmfPlusRecordTypeSetClipPath,
+ EmfPlusRecordTypeSetClipRegion,
+ EmfPlusRecordTypeOffsetClip,
+
+ // New record types must be added here (at the end) -- do not add above,
+ // since that will invalidate previous metafiles!
+ EmfPlusRecordTypeDrawDriverString,
+
+ // Have this here so you don't need to keep changing the value of
+ // EmfPlusRecordTypeMax every time you add a new record.
+
+ EmfPlusRecordTotal,
+
+ EmfPlusRecordTypeMax = EmfPlusRecordTotal-1,
+ EmfPlusRecordTypeMin = EmfPlusRecordTypeHeader,
+};
+
+//---------------------------------------------------------------------------
+// StringFormatFlags
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+// String format flags
+//
+// DirectionRightToLeft - For horizontal text, the reading order is
+// right to left. This value is called
+// the base embedding level by the Unicode
+// bidirectional engine.
+// For vertical text, columns are read from
+// right to left.
+// By default, horizontal or vertical text is
+// read from left to right.
+//
+// DirectionVertical - Individual lines of text are vertical. In
+// each line, characters progress from top to
+// bottom.
+// By default, lines of text are horizontal,
+// each new line below the previous line.
+//
+// NoFitBlackBox - Allows parts of glyphs to overhang the
+// bounding rectangle.
+// By default glyphs are first aligned
+// inside the margines, then any glyphs which
+// still overhang the bounding box are
+// repositioned to avoid any overhang.
+// For example when an italic
+// lower case letter f in a font such as
+// Garamond is aligned at the far left of a
+// rectangle, the lower part of the f will
+// reach slightly further left than the left
+// edge of the rectangle. Setting this flag
+// will ensure the character aligns visually
+// with the lines above and below, but may
+// cause some pixels outside the formatting
+// rectangle to be clipped or painted.
+//
+#ifndef DCR_USE_NEW_137252
+// NumberContextArabic - Causes any initial numeric in the string to
+// be analysed for bidirection layout as if
+// it was preceeded by Arabic text.
+//
+// DisableKashidaJustification - Arabic text will not be justified by the
+// insertion of kashidas (i.e. extending the
+// joining line between characters). Instead
+// Arabic script will be justified by the
+// widening of the whitespace between words.
+//
+#endif
+// DisplayFormatControl - Causes control characters such as the
+// left-to-right mark to be shown in the
+// output with a representative glyph.
+//
+#ifndef DCR_USE_NEW_137252
+// DisableKerning - Disables Truetype and OpenType kerning.
+//
+// DisableLigatures - Disables Truetype and OpenType ligatures.
+//
+// LayoutLegacyBidi - Causes the bidirection algorithm to use
+// slightly different classifications for
+// '+', '-' and '/' that make their layout
+// much closer to that expected by files
+// generated in Windows or by Windows
+// applications.
+//
+// NoChanges - A text imager created with this flag set
+// does not support those APIs that change
+// it's contents or formatting, but for most
+// simple text will be significantly faster in
+// performing measurement and drawing
+// functions.
+//
+#endif
+// NoFontFallback - Disables fallback to alternate fonts for
+// characters not supported in the requested
+// font. Any missing characters will be
+// be displayed with the fonts missing glyph,
+// usually an open square.
+//
+// NoWrap - Disables wrapping of text between lines
+// when formatting within a rectangle.
+// NoWrap is implied when a point is passed
+// instead of a rectangle, or when the
+// specified rectangle has a zero line length.
+//
+// NoClip - By default text is clipped to the
+// formatting rectangle. Setting NoClip
+// allows overhanging pixels to affect the
+// device outside the formatting rectangle.
+// Pixels at the end of the line may be
+// affected if the glyphs overhang their
+// cells, and either the NoFitBlackBox flag
+// has been set, or the glyph extends to far
+// to be fitted.
+// Pixels above/before the first line or
+// below/after the last line may be affected
+// if the glyphs extend beyond their cell
+// ascent / descent. This can occur rarely
+// with unusual diacritic mark combinations.
+
+//---------------------------------------------------------------------------
+
+enum StringFormatFlags
+{
+ StringFormatFlagsDirectionRightToLeft = 0x00000001,
+ StringFormatFlagsDirectionVertical = 0x00000002,
+ StringFormatFlagsNoFitBlackBox = 0x00000004,
+#ifndef DCR_USE_NEW_137252
+ StringFormatFlagsNumberContextArabic = 0x00000008,
+ StringFormatFlagsDisableKashidaJustification = 0x00000010,
+#endif
+ StringFormatFlagsDisplayFormatControl = 0x00000020,
+#ifndef DCR_USE_NEW_137252
+ StringFormatFlagsDisableKerning = 0x00000040,
+ StringFormatFlagsDisableLigatures = 0x00000080,
+ StringFormatFlagsLayoutLegacyBidi = 0x00000100,
+ StringFormatFlagsNoChanges = 0x00000200,
+#endif
+ StringFormatFlagsNoFontFallback = 0x00000400,
+ StringFormatFlagsMeasureTrailingSpaces = 0x00000800,
+ StringFormatFlagsNoWrap = 0x00001000,
+ StringFormatFlagsLineLimit = 0x00002000,
+
+ StringFormatFlagsNoClip = 0x00004000
+};
+
+//---------------------------------------------------------------------------
+// StringTrimming
+//---------------------------------------------------------------------------
+
+enum StringTrimming {
+ StringTrimmingNone = 0,
+ StringTrimmingCharacter = 1,
+ StringTrimmingWord = 2,
+ StringTrimmingEllipsisCharacter = 3,
+ StringTrimmingEllipsisWord = 4,
+ StringTrimmingEllipsisPath = 5
+};
+
+#ifndef DCR_USE_NEW_137252
+//---------------------------------------------------------------------------
+// String units
+//
+// String units are like length units in CSS, they may be absolute, or
+// they may be relative to a font size.
+//
+//---------------------------------------------------------------------------
+
+enum StringUnit {
+ StringUnitWorld = UnitWorld,
+ StringUnitDisplay = UnitDisplay,
+ StringUnitPixel = UnitPixel,
+ StringUnitPoint = UnitPoint,
+ StringUnitInch = UnitInch,
+ StringUnitDocument = UnitDocument,
+ StringUnitMillimeter = UnitMillimeter,
+ StringUnitEm = 32
+};
+#endif
+
+#ifndef DCR_USE_NEW_152154
+//---------------------------------------------------------------------------
+// Line spacing flags
+//---------------------------------------------------------------------------
+
+enum LineSpacing {
+ LineSpacingWorld = UnitWorld,
+ LineSpacingDisplay = UnitDisplay,
+ LineSpacingPixel = UnitPixel,
+ LineSpacingPoint = UnitPoint,
+ LineSpacingInch = UnitInch,
+ LineSpacingDocument = UnitDocument,
+ LineSpacingMillimeter = UnitMillimeter,
+
+ LineSpacingRecommended = 32,
+ LineSpacingAtLeast = 33,
+ LineSpacingAtLeastMultiple = 34,
+ LineSpacingCell = 35,
+ LineSpacingCellAtLeast = 36,
+ LineSpacingCellAtLeastMultiple = 37
+};
+
+/// The following methods of linespacing are relative to the font size
+//
+// =========== Method =========== =============== Relative to ===============
+//
+// LineSpacingRecommended recommended line spacing specified by font
+// LineSpacingAtLeast max(recommended, tallest glyph cell)
+// LineSpacingAtLeastMultiple smallest multiple of recommended big enough
+// for all glyph cells on the line
+// LineSpacingCell cell height
+// LineSpacingCellAtLeast max(font cell height, tallest glyph cell)
+// LineSpacingCellAtLeastMultiple smallest multiple of cell height big enough
+// for all glyph cells on the line
+#endif
+
+
+//---------------------------------------------------------------------------
+// National language digit substitution
+//---------------------------------------------------------------------------
+
+enum StringDigitSubstitute
+{
+ StringDigitSubstituteUser = 0, // As NLS setting
+ StringDigitSubstituteNone = 1,
+ StringDigitSubstituteNational = 2,
+ StringDigitSubstituteTraditional = 3
+};
+
+//---------------------------------------------------------------------------
+// Hotkey prefix interpretation
+//---------------------------------------------------------------------------
+
+enum HotkeyPrefix
+{
+ HotkeyPrefixNone = 0,
+ HotkeyPrefixShow = 1,
+ HotkeyPrefixHide = 2
+};
+
+//---------------------------------------------------------------------------
+// Text alignment flags
+//---------------------------------------------------------------------------
+
+enum StringAlignment
+{
+ // Left edge for left-to-right text,
+ // right for right-to-left text,
+ // and top for vertical
+ StringAlignmentNear = 0,
+ StringAlignmentCenter = 1,
+ StringAlignmentFar = 2
+};
+
+//---------------------------------------------------------------------------
+// DriverStringOptions
+//---------------------------------------------------------------------------
+
+enum DriverStringOptions
+{
+ DriverStringOptionsCmapLookup = 1,
+ DriverStringOptionsVertical = 2,
+ DriverStringOptionsRealizedAdvance = 4,
+#ifndef DCR_USE_NEW_137252
+ DriverStringOptionsCompensateResolution = 8
+#endif
+};
+
+//---------------------------------------------------------------------------
+// Flush Intention flags
+//---------------------------------------------------------------------------
+
+enum FlushIntention
+{
+ FlushIntentionFlush = 0, // Flush all batched rendering operations
+ FlushIntentionSync = 1 // Flush all batched rendering operations
+ // and wait for them to complete
+};
+
+#ifndef DCR_USE_NEW_175866
+
+//---------------------------------------------------------------------------
+// Window Change Notification types
+//---------------------------------------------------------------------------
+
+enum WindowNotifyEnum
+{
+ WindowNotifyEnumEnable = 0,
+ WindowNotifyEnumDisable,
+ WindowNotifyEnumPalette,
+ WindowNotifyEnumDisplay,
+ WindowNotifyEnumSysColor
+};
+
+#endif
+
+//---------------------------------------------------------------------------
+// Image encoder parameter related types
+//---------------------------------------------------------------------------
+
+#ifdef DCR_USE_NEW_145804
+enum EncoderParameterValueType
+{
+ EncoderParameterValueTypeByte = 1, // 8-bit unsigned int
+ EncoderParameterValueTypeASCII = 2, // 8-bit byte containing one 7-bit ASCII
+ // code. NULL terminated.
+ EncoderParameterValueTypeShort = 3, // 16-bit unsigned int
+ EncoderParameterValueTypeLong = 4, // 32-bit unsigned int
+ EncoderParameterValueTypeRational = 5, // Two Longs. The first Long is the
+ // numerator, the second Long expresses the
+ // denomintor.
+ EncoderParameterValueTypeLongRange = 6, // Two longs which specify a range of
+ // integer values. The first Long specifies
+ // the lower end and the second one
+ // specifies the higher end. All values
+ // are inclusive at both ends
+ EncoderParameterValueTypeUndefined = 7, // 8-bit byte that can take any value
+ // depending on field definition
+ EncoderParameterValueTypeRationalRange = 8 // Two Rationals. The first Rational
+ // specifies the lower end and the second
+ // specifies the higher end. All values
+ // are inclusive at both ends
+};
+#else
+enum ValueType
+{
+ ValueTypeByte = 1, // 8-bit unsigned int
+ ValueTypeASCII = 2, // 8-bit byte containing one 7-bit ASCII
+ // code. NULL terminated.
+ ValueTypeShort = 3, // 16-bit unsigned int
+ ValueTypeLong = 4, // 32-bit unsigned int
+ ValueTypeRational = 5, // Two Longs. The first Long is the
+ // numerator, the second Long expresses the
+ // denomintor.
+ ValueTypeLongRange = 6, // Two longs which specify a range of
+ // integer values. The first Long specifies
+ // the lower end and the second one
+ // specifies the higher end. All values
+ // are inclusive at both ends
+ ValueTypeUndefined = 7, // 8-bit byte that can take any value
+ // depending on field definition
+ ValueTypeRationalRange = 8 // Two Rationals. The first Rational
+ // specifies the lower end and the second
+ // specifies the higher end. All values
+ // are inclusive at both ends
+};
+#endif
+
+//---------------------------------------------------------------------------
+// Image encoder value types
+//---------------------------------------------------------------------------
+
+enum EncoderValue
+{
+ EncoderValueColorTypeCMYK,
+ EncoderValueColorTypeYCCK,
+ EncoderValueCompressionLZW,
+ EncoderValueCompressionCCITT3,
+ EncoderValueCompressionCCITT4,
+ EncoderValueCompressionRle,
+ EncoderValueCompressionNone,
+ EncoderValueScanMethodInterlaced,
+ EncoderValueScanMethodNonInterlaced,
+ EncoderValueVersionGif87,
+ EncoderValueVersionGif89,
+ EncoderValueRenderProgressive,
+ EncoderValueRenderNonProgressive,
+ EncoderValueTransformRotate90,
+ EncoderValueTransformRotate180,
+ EncoderValueTransformRotate270,
+ EncoderValueTransformFlipHorizontal,
+ EncoderValueTransformFlipVertical,
+ #ifdef DCR_USE_NEW_140861
+ EncoderValueMultiFrame,
+ #else
+ EncodeValueMultiFrame,
+ #endif
+ EncoderValueLastFrame,
+ EncoderValueFlush,
+ #ifdef DCR_USE_NEW_140861
+ EncoderValueFrameDimensionTime,
+ EncoderValueFrameDimensionResolution,
+ EncoderValueFrameDimensionPage
+ #else
+ EncodeValueFrameDimensionTime,
+ EncodeValueFrameDimensionResolution,
+ EncodeValueFrameDimensionPage
+ #endif
+};
+
+//---------------------------------------------------------------------------
+// Graphics layout values (support for Middle East localization)
+//---------------------------------------------------------------------------
+
+enum GraphicsLayout
+{
+ GraphicsLayoutNormal,
+ GraphicsLayoutMirrored,
+ GraphicsLayoutMirroredIgnoreImages,
+ GraphicsLayoutMirroredForceImages
+};
+
+//---------------------------------------------------------------------------
+// Image layout values (support for Middle East localization)
+//---------------------------------------------------------------------------
+
+enum ImageLayout
+{
+ ImageLayoutNormal,
+ ImageLayoutIgnoreMirrored
+};
+
+enum EmfToWmfBitsFlags
+{
+ EmfToWmfBitsFlagsDefault = 0x00000000,
+ EmfToWmfBitsFlagsEmbedEmf = 0x00000001,
+ EmfToWmfBitsFlagsIncludeAPM = 0x00000002,
+ EmfToWmfBitsFlagsNoXORClip = 0x00000004
+};
+
+#endif // !_GDIPLUSENUMS_H
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusFlat.h b/core/src/fxge/Microsoft SDK/include/GdiPlusFlat.h
new file mode 100644
index 0000000000..8b5369e793
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusFlat.h
@@ -0,0 +1,2740 @@
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusFlat.h
+*
+* Abstract:
+*
+* Flat GDI+ API wrappers - header file
+*
+\**************************************************************************/
+
+// TODO: this file style needs to be made internally consistent with the way
+// it handles breaking the long argument lists across multiple lines
+
+#ifndef _FLATAPI_H
+#define _FLATAPI_H
+
+#define WINGDIPAPI __stdcall
+
+// currently, only C++ wrapper API's force const.
+
+#define GDIPCONST const
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef DCR_USE_NEW_175866
+
+VOID
+WINGDIPAPI
+GdipDisplayPaletteWindowNotify(WindowNotifyEnum notify);
+
+#endif
+
+//----------------------------------------------------------------------------
+// GraphicsPath methods
+//----------------------------------------------------------------------------
+
+GpStatus WINGDIPAPI
+GdipCreatePath(GpFillMode brushMode, GpPath **path);
+
+GpStatus WINGDIPAPI
+GdipCreatePath2(GDIPCONST GpPointF*, GDIPCONST BYTE*, INT, GpFillMode,
+ GpPath **path);
+
+GpStatus WINGDIPAPI
+GdipCreatePath2I(GDIPCONST GpPoint*, GDIPCONST BYTE*, INT, GpFillMode,
+ GpPath **path);
+
+GpStatus WINGDIPAPI
+GdipClonePath(GpPath* path, GpPath **clonePath);
+
+GpStatus WINGDIPAPI
+GdipDeletePath(GpPath* path);
+
+GpStatus WINGDIPAPI
+GdipResetPath(GpPath* path);
+
+GpStatus WINGDIPAPI
+GdipGetPointCount(GpPath* path, INT* count);
+
+GpStatus WINGDIPAPI
+GdipGetPathTypes(GpPath* path, BYTE* types, INT count);
+
+GpStatus WINGDIPAPI
+GdipGetPathPoints(GpPath*, GpPointF* points, INT count);
+
+GpStatus WINGDIPAPI
+GdipGetPathPointsI(GpPath*, GpPoint* points, INT count);
+
+GpStatus WINGDIPAPI
+GdipGetPathFillMode(GpPath *path, GpFillMode *fillmode);
+
+GpStatus WINGDIPAPI
+GdipSetPathFillMode(GpPath *path, GpFillMode fillmode);
+
+GpStatus WINGDIPAPI
+GdipGetPathData(GpPath *path, GpPathData* pathData);
+
+GpStatus WINGDIPAPI
+GdipStartPathFigure(GpPath *path);
+
+GpStatus WINGDIPAPI
+GdipClosePathFigure(GpPath *path);
+
+GpStatus WINGDIPAPI
+GdipClosePathFigures(GpPath *path);
+
+GpStatus WINGDIPAPI
+GdipSetPathMarker(GpPath* path);
+
+GpStatus WINGDIPAPI
+GdipClearPathMarkers(GpPath* path);
+
+GpStatus WINGDIPAPI
+GdipReversePath(GpPath* path);
+
+GpStatus WINGDIPAPI
+GdipGetPathLastPoint(GpPath* path, GpPointF* lastPoint);
+
+GpStatus WINGDIPAPI
+GdipAddPathLine(GpPath *path, REAL x1, REAL y1, REAL x2, REAL y2);
+
+GpStatus WINGDIPAPI
+GdipAddPathLine2(GpPath *path, GDIPCONST GpPointF *points, INT count);
+
+GpStatus WINGDIPAPI
+GdipAddPathArc(GpPath *path, REAL x, REAL y, REAL width, REAL height,
+ REAL startAngle, REAL sweepAngle);
+
+GpStatus WINGDIPAPI
+GdipAddPathBezier(GpPath *path, REAL x1, REAL y1, REAL x2, REAL y2,
+ REAL x3, REAL y3, REAL x4, REAL y4);
+
+GpStatus WINGDIPAPI
+GdipAddPathBeziers(GpPath *path, GDIPCONST GpPointF *points, INT count);
+
+GpStatus WINGDIPAPI
+GdipAddPathCurve(GpPath *path, GDIPCONST GpPointF *points, INT count);
+
+GpStatus WINGDIPAPI
+GdipAddPathCurve2(GpPath *path, GDIPCONST GpPointF *points, INT count,
+ REAL tension);
+
+GpStatus WINGDIPAPI
+GdipAddPathCurve3(GpPath *path, GDIPCONST GpPointF *points, INT count,
+ INT offset, INT numberOfSegments, REAL tension);
+
+GpStatus WINGDIPAPI
+GdipAddPathClosedCurve(GpPath *path, GDIPCONST GpPointF *points, INT count);
+
+GpStatus WINGDIPAPI
+GdipAddPathClosedCurve2(GpPath *path, GDIPCONST GpPointF *points, INT count,
+ REAL tension);
+
+GpStatus WINGDIPAPI
+GdipAddPathRectangle(GpPath *path, REAL x, REAL y, REAL width, REAL height);
+
+GpStatus WINGDIPAPI
+GdipAddPathRectangles(GpPath *path, GDIPCONST GpRectF *rects, INT count);
+
+GpStatus WINGDIPAPI
+GdipAddPathEllipse(GpPath *path, REAL x, REAL y, REAL width,
+ REAL height);
+
+GpStatus WINGDIPAPI
+GdipAddPathPie(GpPath *path, REAL x, REAL y, REAL width, REAL height,
+ REAL startAngle, REAL sweepAngle);
+
+GpStatus WINGDIPAPI
+GdipAddPathPolygon(GpPath *path, GDIPCONST GpPointF *points, INT count);
+
+GpStatus WINGDIPAPI
+GdipAddPathPath(GpPath *path, GDIPCONST GpPath* addingPath, BOOL connect);
+
+GpStatus WINGDIPAPI
+GdipAddPathString(GpPath *path, GDIPCONST WCHAR *string,
+ INT length, GDIPCONST GpFontFamily *family, INT style,
+ REAL emSize, GDIPCONST RectF *layoutRect,
+ GDIPCONST GpStringFormat *format);
+
+GpStatus WINGDIPAPI
+GdipAddPathStringI(GpPath *path, GDIPCONST WCHAR *string,
+ INT length, GDIPCONST GpFontFamily *family, INT style,
+ REAL emSize, GDIPCONST Rect *layoutRect,
+ GDIPCONST GpStringFormat *format);
+
+GpStatus WINGDIPAPI
+GdipAddPathLineI(GpPath *path, INT x1, INT y1, INT x2, INT y2);
+
+GpStatus WINGDIPAPI
+GdipAddPathLine2I(GpPath *path, GDIPCONST GpPoint *points, INT count);
+
+GpStatus WINGDIPAPI
+GdipAddPathArcI(GpPath *path, INT x, INT y, INT width, INT height,
+ REAL startAngle, REAL sweepAngle);
+
+GpStatus WINGDIPAPI
+GdipAddPathBezierI(GpPath *path, INT x1, INT y1, INT x2, INT y2,
+ INT x3, INT y3, INT x4, INT y4);
+
+GpStatus WINGDIPAPI
+GdipAddPathBeziersI(GpPath *path, GDIPCONST GpPoint *points, INT count);
+
+GpStatus WINGDIPAPI
+GdipAddPathCurveI(GpPath *path, GDIPCONST GpPoint *points, INT count);
+
+GpStatus WINGDIPAPI
+GdipAddPathCurve2I(GpPath *path, GDIPCONST GpPoint *points, INT count,
+ REAL tension);
+
+GpStatus WINGDIPAPI
+GdipAddPathCurve3I(GpPath *path, GDIPCONST GpPoint *points, INT count,
+ INT offset, INT numberOfSegments, REAL tension);
+
+GpStatus WINGDIPAPI
+GdipAddPathClosedCurveI(GpPath *path, GDIPCONST GpPoint *points, INT count);
+
+GpStatus WINGDIPAPI
+GdipAddPathClosedCurve2I(GpPath *path, GDIPCONST GpPoint *points, INT count,
+ REAL tension);
+
+GpStatus WINGDIPAPI
+GdipAddPathRectangleI(GpPath *path, INT x, INT y, INT width, INT height);
+
+GpStatus WINGDIPAPI
+GdipAddPathRectanglesI(GpPath *path, GDIPCONST GpRect *rects, INT count);
+
+GpStatus WINGDIPAPI
+GdipAddPathEllipseI(GpPath *path, INT x, INT y, INT width, INT height);
+
+GpStatus WINGDIPAPI
+GdipAddPathPieI(GpPath *path, INT x, INT y, INT width, INT height,
+ REAL startAngle, REAL sweepAngle);
+
+GpStatus WINGDIPAPI
+GdipAddPathPolygonI(GpPath *path, GDIPCONST GpPoint *points, INT count);
+
+GpStatus WINGDIPAPI
+GdipFlattenPath(GpPath *path, GpMatrix* matrix, REAL flatness);
+
+GpStatus WINGDIPAPI
+GdipWindingModeOutline(
+ GpPath *path,
+ GpMatrix *matrix,
+ REAL flatness
+);
+
+
+#ifdef DCR_USE_NEW_202903
+
+GpStatus WINGDIPAPI
+GdipWidenPath(
+ GpPath *nativePath,
+ GpPen *pen,
+ GpMatrix *matrix,
+ REAL flatness
+);
+
+#else
+
+GpStatus WINGDIPAPI
+GdipWidenPathWithMinimumResolutions(GpPath *path, GpPen *pen, REAL minXres,
+ REAL minYres, GpMatrix *matrix, BOOL removeSelftIntersects);
+
+#endif
+
+GpStatus WINGDIPAPI
+GdipWarpPath(GpPath *path, GpMatrix* matrix,
+ GDIPCONST GpPointF *points, INT count,
+ REAL srcx, REAL srcy, REAL srcwidth, REAL srcheight,
+ WarpMode warpMode, REAL flatness);
+
+GpStatus WINGDIPAPI
+GdipTransformPath(GpPath* path, GpMatrix* matrix);
+
+GpStatus WINGDIPAPI
+GdipGetPathWorldBounds(GpPath* path, GpRectF* bounds, GDIPCONST GpMatrix *matrix,
+ GDIPCONST GpPen *pen);
+
+GpStatus WINGDIPAPI
+GdipGetPathWorldBoundsI(GpPath* path, GpRect* bounds, GDIPCONST GpMatrix *matrix,
+ GDIPCONST GpPen *pen);
+
+GpStatus WINGDIPAPI
+GdipIsVisiblePathPoint(GpPath* path, REAL x, REAL y,
+ GpGraphics *graphics, BOOL *result);
+
+GpStatus WINGDIPAPI
+GdipIsVisiblePathPointI(GpPath* path, INT x, INT y,
+ GpGraphics *graphics, BOOL *result);
+
+GpStatus WINGDIPAPI
+GdipIsOutlineVisiblePathPoint(GpPath* path, REAL x, REAL y, GpPen *pen,
+ GpGraphics *graphics, BOOL *result);
+
+GpStatus WINGDIPAPI
+GdipIsOutlineVisiblePathPointI(GpPath* path, INT x, INT y, GpPen *pen,
+ GpGraphics *graphics, BOOL *result);
+
+
+//----------------------------------------------------------------------------
+// Path Enumeration methods
+//----------------------------------------------------------------------------
+
+GpStatus WINGDIPAPI
+GdipCreatePathIter(GpPathIterator **iterator, GpPath* path);
+
+GpStatus WINGDIPAPI
+GdipDeletePathIter(GpPathIterator *iterator);
+
+GpStatus WINGDIPAPI
+GdipPathIterNextSubpath(GpPathIterator* iterator, INT *resultCount,
+ INT* startIndex, INT* endIndex, BOOL* isClosed);
+
+GpStatus WINGDIPAPI
+GdipPathIterNextSubpathPath(GpPathIterator* iterator, INT* resultCount,
+ GpPath* path, BOOL* isClosed);
+
+GpStatus WINGDIPAPI
+GdipPathIterNextPathType(GpPathIterator* iterator, INT* resultCount,
+ BYTE* pathType, INT* startIndex, INT* endIndex);
+
+GpStatus WINGDIPAPI
+GdipPathIterNextMarker(GpPathIterator* iterator, INT *resultCount,
+ INT* startIndex, INT* endIndex);
+
+GpStatus WINGDIPAPI
+GdipPathIterNextMarkerPath(GpPathIterator* iterator, INT* resultCount,
+ GpPath* path);
+
+GpStatus WINGDIPAPI
+GdipPathIterGetCount(GpPathIterator* iterator, INT* count);
+
+GpStatus WINGDIPAPI
+GdipPathIterGetSubpathCount(GpPathIterator* iterator, INT* count);
+
+GpStatus WINGDIPAPI
+GdipPathIterIsValid(GpPathIterator* iterator, BOOL* valid);
+
+GpStatus WINGDIPAPI
+GdipPathIterHasCurve(GpPathIterator* iterator, BOOL* hasCurve);
+
+GpStatus WINGDIPAPI
+GdipPathIterRewind(GpPathIterator* iterator);
+
+GpStatus WINGDIPAPI
+GdipPathIterEnumerate(GpPathIterator* iterator, INT* resultCount,
+ GpPointF *points, BYTE *types, INT count);
+
+GpStatus WINGDIPAPI
+GdipPathIterCopyData(GpPathIterator* iterator, INT* resultCount,
+ GpPointF* points, BYTE* types, INT startIndex, INT endIndex);
+
+//----------------------------------------------------------------------------
+// Matrix methods
+//----------------------------------------------------------------------------
+
+GpStatus WINGDIPAPI
+GdipCreateMatrix(GpMatrix **matrix);
+
+GpStatus WINGDIPAPI
+GdipCreateMatrix2(REAL m11, REAL m12, REAL m21, REAL m22, REAL dx,
+ REAL dy, GpMatrix **matrix);
+
+GpStatus WINGDIPAPI
+GdipCreateMatrix3(GDIPCONST GpRectF *rect, GDIPCONST GpPointF *dstplg,
+ GpMatrix **matrix);
+
+GpStatus WINGDIPAPI
+GdipCreateMatrix3I(GDIPCONST GpRect *rect, GDIPCONST GpPoint *dstplg,
+ GpMatrix **matrix);
+
+GpStatus WINGDIPAPI
+GdipCloneMatrix(GpMatrix *matrix, GpMatrix **cloneMatrix);
+
+GpStatus WINGDIPAPI
+GdipDeleteMatrix(GpMatrix *matrix);
+
+GpStatus WINGDIPAPI
+GdipSetMatrixElements(GpMatrix *matrix, REAL m11, REAL m12, REAL m21, REAL m22,
+ REAL dx, REAL dy);
+
+GpStatus WINGDIPAPI
+GdipMultiplyMatrix(GpMatrix *matrix, GpMatrix* matrix2,
+ GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipTranslateMatrix(GpMatrix *matrix, REAL offsetX, REAL offsetY,
+ GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipScaleMatrix(GpMatrix *matrix, REAL scaleX, REAL scaleY,
+ GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipRotateMatrix(GpMatrix *matrix, REAL angle, GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipShearMatrix(GpMatrix *matrix, REAL shearX, REAL shearY,
+ GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipInvertMatrix(GpMatrix *matrix);
+
+GpStatus WINGDIPAPI
+GdipTransformMatrixPoints(GpMatrix *matrix, GpPointF *pts, INT count);
+
+GpStatus WINGDIPAPI
+GdipTransformMatrixPointsI(GpMatrix *matrix, GpPoint *pts, INT count);
+
+GpStatus WINGDIPAPI
+GdipVectorTransformMatrixPoints(GpMatrix *matrix, GpPointF *pts,
+ INT count);
+
+GpStatus WINGDIPAPI
+GdipVectorTransformMatrixPointsI(GpMatrix *matrix, GpPoint *pts,
+ INT count);
+
+GpStatus WINGDIPAPI
+GdipGetMatrixElements(GDIPCONST GpMatrix *matrix, REAL *matrixOut);
+
+GpStatus WINGDIPAPI
+GdipIsMatrixInvertible(GDIPCONST GpMatrix *matrix, BOOL *result);
+
+GpStatus WINGDIPAPI
+GdipIsMatrixIdentity(GDIPCONST GpMatrix *matrix, BOOL *result);
+
+GpStatus WINGDIPAPI
+GdipIsMatrixEqual(GDIPCONST GpMatrix *matrix, GDIPCONST GpMatrix *matrix2, BOOL *result);
+
+//----------------------------------------------------------------------------
+// Region methods
+//----------------------------------------------------------------------------
+
+GpStatus WINGDIPAPI
+GdipCreateRegion(GpRegion **region);
+
+GpStatus WINGDIPAPI
+GdipCreateRegionRect(GDIPCONST GpRectF *rect, GpRegion **region);
+
+GpStatus WINGDIPAPI
+GdipCreateRegionRectI(GDIPCONST GpRect *rect, GpRegion **region);
+
+GpStatus WINGDIPAPI
+GdipCreateRegionPath(GpPath *path, GpRegion **region);
+
+GpStatus WINGDIPAPI
+GdipCreateRegionRgnData(GDIPCONST BYTE *regionData, INT size, GpRegion **region);
+
+GpStatus WINGDIPAPI
+GdipCreateRegionHrgn(HRGN hRgn, GpRegion **region);
+
+GpStatus WINGDIPAPI
+GdipCloneRegion(GpRegion *region, GpRegion **cloneRegion);
+
+GpStatus WINGDIPAPI
+GdipDeleteRegion(GpRegion *region);
+
+GpStatus WINGDIPAPI
+GdipSetInfinite(GpRegion *region);
+
+GpStatus WINGDIPAPI
+GdipSetEmpty(GpRegion *region);
+
+GpStatus WINGDIPAPI
+GdipCombineRegionRect(GpRegion *region, GDIPCONST GpRectF *rect,
+ CombineMode combineMode);
+
+GpStatus WINGDIPAPI
+GdipCombineRegionRectI(GpRegion *region, GDIPCONST GpRect *rect,
+ CombineMode combineMode);
+
+GpStatus WINGDIPAPI
+GdipCombineRegionPath(GpRegion *region, GpPath *path, CombineMode combineMode);
+
+GpStatus WINGDIPAPI
+GdipCombineRegionRegion(GpRegion *region, GpRegion *region2,
+ CombineMode combineMode);
+
+GpStatus WINGDIPAPI
+GdipTranslateRegion(GpRegion *region, REAL dx, REAL dy);
+
+GpStatus WINGDIPAPI
+GdipTranslateRegionI(GpRegion *region, INT dx, INT dy);
+
+GpStatus WINGDIPAPI
+GdipTransformRegion(GpRegion *region, GpMatrix *matrix);
+
+GpStatus WINGDIPAPI
+GdipGetRegionBounds(GpRegion *region, GpGraphics *graphics,
+ GpRectF *rect);
+
+GpStatus WINGDIPAPI
+GdipGetRegionBoundsI(GpRegion *region, GpGraphics *graphics,
+ GpRect *rect);
+
+GpStatus WINGDIPAPI
+GdipGetRegionHRgn(GpRegion *region, GpGraphics *graphics, HRGN *hRgn);
+
+GpStatus WINGDIPAPI
+GdipIsEmptyRegion(GpRegion *region, GpGraphics *graphics,
+ BOOL *result);
+
+GpStatus WINGDIPAPI
+GdipIsInfiniteRegion(GpRegion *region, GpGraphics *graphics,
+ BOOL *result);
+
+GpStatus WINGDIPAPI
+GdipIsEqualRegion(GpRegion *region, GpRegion *region2,
+ GpGraphics *graphics, BOOL *result);
+
+GpStatus WINGDIPAPI
+GdipGetRegionDataSize(GpRegion *region, UINT * bufferSize);
+
+GpStatus WINGDIPAPI
+GdipGetRegionData(GpRegion *region, BYTE * buffer, UINT bufferSize, UINT * sizeFilled);
+
+GpStatus WINGDIPAPI
+GdipIsVisibleRegionPoint(GpRegion *region, REAL x, REAL y,
+ GpGraphics *graphics, BOOL *result);
+
+GpStatus WINGDIPAPI
+GdipIsVisibleRegionPointI(GpRegion *region, INT x, INT y,
+ GpGraphics *graphics, BOOL *result);
+
+GpStatus WINGDIPAPI
+GdipIsVisibleRegionRect(GpRegion *region, REAL x, REAL y, REAL width,
+ REAL height, GpGraphics *graphics, BOOL *result);
+
+GpStatus WINGDIPAPI
+GdipIsVisibleRegionRectI(GpRegion *region, INT x, INT y, INT width,
+ INT height, GpGraphics *graphics, BOOL *result);
+
+GpStatus WINGDIPAPI
+GdipGetRegionScansCount(GpRegion *region, UINT* count, GpMatrix* matrix);
+
+GpStatus WINGDIPAPI
+GdipGetRegionScans(GpRegion *region, GpRectF* rects, INT* count, GpMatrix* matrix);
+
+GpStatus WINGDIPAPI
+GdipGetRegionScansI(GpRegion *region, GpRect* rects, INT* count, GpMatrix* matrix);
+
+//----------------------------------------------------------------------------
+// Brush methods
+//----------------------------------------------------------------------------
+
+GpStatus WINGDIPAPI
+GdipCloneBrush(GpBrush *brush, GpBrush **cloneBrush);
+
+GpStatus WINGDIPAPI
+GdipDeleteBrush(GpBrush *brush);
+
+GpStatus WINGDIPAPI
+GdipGetBrushType(GpBrush *brush, GpBrushType *type);
+
+//----------------------------------------------------------------------------
+// Hatch Brush methods
+//----------------------------------------------------------------------------
+
+GpStatus WINGDIPAPI
+GdipCreateHatchBrush(GpHatchStyle hatchstyle, ARGB forecol,
+ ARGB backcol, GpHatch **brush);
+
+GpStatus WINGDIPAPI
+GdipGetHatchStyle(GpHatch *brush, GpHatchStyle *hatchstyle);
+
+GpStatus WINGDIPAPI
+GdipGetHatchForegroundColor(GpHatch *brush, ARGB* forecol);
+
+GpStatus WINGDIPAPI
+GdipGetHatchBackgroundColor(GpHatch *brush, ARGB* backcol);
+
+//----------------------------------------------------------------------------
+// Texture Brush methods
+//----------------------------------------------------------------------------
+
+GpStatus WINGDIPAPI
+GdipCreateTexture(GpImage *image, GpWrapMode wrapmode,
+ GpTexture **texture);
+
+GpStatus WINGDIPAPI
+GdipCreateTexture2(GpImage *image, GpWrapMode wrapmode, REAL x,
+ REAL y, REAL width, REAL height, GpTexture **texture);
+
+GpStatus WINGDIPAPI
+GdipCreateTextureIA(GpImage *image, GDIPCONST GpImageAttributes *imageAttributes,
+ REAL x, REAL y, REAL width, REAL height,
+ GpTexture **texture);
+
+GpStatus WINGDIPAPI
+GdipCreateTexture2I(GpImage *image, GpWrapMode wrapmode, INT x,
+ INT y, INT width, INT height, GpTexture **texture);
+
+GpStatus WINGDIPAPI
+GdipCreateTextureIAI(GpImage *image, GDIPCONST GpImageAttributes *imageAttributes,
+ INT x, INT y, INT width, INT height,
+ GpTexture **texture);
+
+
+GpStatus WINGDIPAPI
+GdipGetTextureTransform(GpTexture *brush, GpMatrix *matrix);
+
+GpStatus WINGDIPAPI
+GdipSetTextureTransform(GpTexture *brush, GDIPCONST GpMatrix *matrix);
+
+GpStatus WINGDIPAPI
+GdipResetTextureTransform(GpTexture* brush);
+
+GpStatus WINGDIPAPI
+GdipMultiplyTextureTransform(GpTexture* brush, GDIPCONST GpMatrix *matrix,
+ GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipTranslateTextureTransform(GpTexture* brush, REAL dx, REAL dy,
+ GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipScaleTextureTransform(GpTexture* brush, REAL sx, REAL sy,
+ GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipRotateTextureTransform(GpTexture* brush, REAL angle, GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipSetTextureWrapMode(GpTexture *brush, GpWrapMode wrapmode);
+
+GpStatus WINGDIPAPI
+GdipGetTextureWrapMode(GpTexture *brush, GpWrapMode *wrapmode);
+
+GpStatus WINGDIPAPI
+GdipGetTextureImage(GpTexture *brush, GpImage **image);
+
+//----------------------------------------------------------------------------
+// Solid Brush methods
+//----------------------------------------------------------------------------
+
+GpStatus WINGDIPAPI
+GdipCreateSolidFill(ARGB color, GpSolidFill **brush);
+
+GpStatus WINGDIPAPI
+GdipSetSolidFillColor(GpSolidFill *brush, ARGB color);
+
+GpStatus WINGDIPAPI
+GdipGetSolidFillColor(GpSolidFill *brush, ARGB *color);
+
+//----------------------------------------------------------------------------
+// LineBrush methods
+//----------------------------------------------------------------------------
+
+GpStatus WINGDIPAPI
+GdipCreateLineBrush(GDIPCONST GpPointF* point1,
+ GDIPCONST GpPointF* point2,
+ ARGB color1, ARGB color2,
+ GpWrapMode wrapMode,
+ GpLineGradient **lineGradient);
+
+GpStatus WINGDIPAPI
+GdipCreateLineBrushI(GDIPCONST GpPoint* point1,
+ GDIPCONST GpPoint* point2,
+ ARGB color1, ARGB color2,
+ GpWrapMode wrapMode,
+ GpLineGradient **lineGradient);
+
+GpStatus WINGDIPAPI
+GdipCreateLineBrushFromRect(GDIPCONST GpRectF* rect,
+ ARGB color1, ARGB color2,
+ LinearGradientMode mode,
+ GpWrapMode wrapMode,
+ GpLineGradient **lineGradient);
+
+GpStatus WINGDIPAPI
+GdipCreateLineBrushFromRectI(GDIPCONST GpRect* rect,
+ ARGB color1, ARGB color2,
+ LinearGradientMode mode,
+ GpWrapMode wrapMode,
+ GpLineGradient **lineGradient);
+
+GpStatus WINGDIPAPI
+GdipCreateLineBrushFromRectWithAngle(GDIPCONST GpRectF* rect,
+ ARGB color1, ARGB color2,
+ REAL angle,
+ BOOL isAngleScalable,
+ GpWrapMode wrapMode,
+ GpLineGradient **lineGradient);
+
+GpStatus WINGDIPAPI
+GdipCreateLineBrushFromRectWithAngleI(GDIPCONST GpRect* rect,
+ ARGB color1, ARGB color2,
+ REAL angle,
+ BOOL isAngleScalable,
+ GpWrapMode wrapMode,
+ GpLineGradient **lineGradient);
+
+GpStatus WINGDIPAPI
+GdipSetLinePoints(GpLineGradient *brush,
+ GDIPCONST GpPointF* point1,
+ GDIPCONST GpPointF* point2);
+
+GpStatus WINGDIPAPI
+GdipSetLinePointsI(GpLineGradient *brush,
+ GDIPCONST GpPoint* point1,
+ GDIPCONST GpPoint* point2);
+
+GpStatus WINGDIPAPI
+GdipGetLinePoints(GpLineGradient *brush, GpPointF* points);
+
+GpStatus WINGDIPAPI
+GdipGetLinePointsI(GpLineGradient *brush, GpPoint* points);
+
+GpStatus WINGDIPAPI
+GdipSetLineColors(GpLineGradient *brush, ARGB color1, ARGB color2);
+
+GpStatus WINGDIPAPI
+GdipGetLineColors(GpLineGradient *brush, ARGB* colors);
+
+GpStatus WINGDIPAPI
+GdipGetLineRect(GpLineGradient *brush, GpRectF *rect);
+
+GpStatus WINGDIPAPI
+GdipGetLineRectI(GpLineGradient *brush, GpRect *rect);
+
+GpStatus WINGDIPAPI
+GdipSetLineGammaCorrection(GpLineGradient *brush, BOOL useGammaCorrection);
+
+GpStatus WINGDIPAPI
+GdipGetLineGammaCorrection(GpLineGradient *brush, BOOL *useGammaCorrection);
+
+GpStatus WINGDIPAPI
+GdipGetLineBlendCount(GpLineGradient *brush, INT *count);
+
+GpStatus WINGDIPAPI
+GdipGetLineBlend(GpLineGradient *brush, REAL *blend, REAL* positions,
+ INT count);
+
+GpStatus WINGDIPAPI
+GdipSetLineBlend(GpLineGradient *brush, GDIPCONST REAL *blend,
+ GDIPCONST REAL* positions, INT count);
+
+GpStatus WINGDIPAPI
+GdipGetLinePresetBlendCount(GpLineGradient *brush, INT *count);
+
+GpStatus WINGDIPAPI
+GdipGetLinePresetBlend(GpLineGradient *brush, ARGB *blend,
+ REAL* positions, INT count);
+
+GpStatus WINGDIPAPI
+GdipSetLinePresetBlend(GpLineGradient *brush, GDIPCONST ARGB *blend,
+ GDIPCONST REAL* positions, INT count);
+
+GpStatus WINGDIPAPI
+GdipSetLineSigmaBlend(GpLineGradient *brush, REAL focus, REAL scale);
+
+GpStatus WINGDIPAPI
+GdipSetLineLinearBlend(GpLineGradient *brush, REAL focus, REAL scale);
+
+GpStatus WINGDIPAPI
+GdipSetLineWrapMode(GpLineGradient *brush, GpWrapMode wrapmode);
+
+GpStatus WINGDIPAPI
+GdipGetLineWrapMode(GpLineGradient *brush, GpWrapMode *wrapmode);
+
+GpStatus WINGDIPAPI
+GdipGetLineTransform(GpLineGradient *brush, GpMatrix *matrix);
+
+GpStatus WINGDIPAPI
+GdipSetLineTransform(GpLineGradient *brush, GDIPCONST GpMatrix *matrix);
+
+GpStatus WINGDIPAPI
+GdipResetLineTransform(GpLineGradient* brush);
+
+GpStatus WINGDIPAPI
+GdipMultiplyLineTransform(GpLineGradient* brush, GDIPCONST GpMatrix *matrix,
+ GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipTranslateLineTransform(GpLineGradient* brush, REAL dx, REAL dy,
+ GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipScaleLineTransform(GpLineGradient* brush, REAL sx, REAL sy,
+ GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipRotateLineTransform(GpLineGradient* brush, REAL angle, GpMatrixOrder order);
+
+//----------------------------------------------------------------------------
+// PathGradient Brush
+//----------------------------------------------------------------------------
+
+GpStatus WINGDIPAPI
+GdipCreatePathGradient(GDIPCONST GpPointF* points,
+ INT count,
+ GpWrapMode wrapMode,
+ GpPathGradient **polyGradient);
+
+GpStatus WINGDIPAPI
+GdipCreatePathGradientI(GDIPCONST GpPoint* points,
+ INT count,
+ GpWrapMode wrapMode,
+ GpPathGradient **polyGradient);
+
+GpStatus WINGDIPAPI
+GdipCreatePathGradientFromPath(GDIPCONST GpPath* path,
+ GpPathGradient **polyGradient);
+
+GpStatus WINGDIPAPI
+GdipGetPathGradientCenterColor(
+ GpPathGradient *brush, ARGB* colors);
+
+GpStatus WINGDIPAPI
+GdipSetPathGradientCenterColor(
+ GpPathGradient *brush, ARGB colors);
+
+GpStatus WINGDIPAPI
+GdipGetPathGradientSurroundColorsWithCount(
+ GpPathGradient *brush, ARGB* color, INT* count);
+
+GpStatus WINGDIPAPI
+GdipSetPathGradientSurroundColorsWithCount(
+ GpPathGradient *brush,
+ GDIPCONST ARGB* color, INT* count);
+
+GpStatus WINGDIPAPI
+GdipGetPathGradientPath(GpPathGradient *brush, GpPath *path);
+
+GpStatus WINGDIPAPI
+GdipSetPathGradientPath(GpPathGradient *brush, GDIPCONST GpPath *path);
+
+GpStatus WINGDIPAPI
+GdipGetPathGradientCenterPoint(
+ GpPathGradient *brush, GpPointF* points);
+
+GpStatus WINGDIPAPI
+GdipGetPathGradientCenterPointI(
+ GpPathGradient *brush, GpPoint* points);
+
+GpStatus WINGDIPAPI
+GdipSetPathGradientCenterPoint(
+ GpPathGradient *brush, GDIPCONST GpPointF* points);
+
+GpStatus WINGDIPAPI
+GdipSetPathGradientCenterPointI(
+ GpPathGradient *brush, GDIPCONST GpPoint* points);
+
+GpStatus WINGDIPAPI
+GdipGetPathGradientRect(GpPathGradient *brush, GpRectF *rect);
+
+GpStatus WINGDIPAPI
+GdipGetPathGradientRectI(GpPathGradient *brush, GpRect *rect);
+
+GpStatus WINGDIPAPI
+GdipGetPathGradientPointCount(GpPathGradient *brush, INT* count);
+
+GpStatus WINGDIPAPI
+GdipGetPathGradientSurroundColorCount(GpPathGradient *brush, INT* count);
+
+GpStatus WINGDIPAPI
+GdipSetPathGradientGammaCorrection(GpPathGradient *brush, BOOL useGammaCorrection);
+
+GpStatus WINGDIPAPI
+GdipGetPathGradientGammaCorrection(GpPathGradient *brush, BOOL *useGammaCorrection);
+
+GpStatus WINGDIPAPI
+GdipGetPathGradientBlendCount(GpPathGradient *brush,
+ INT *count);
+
+GpStatus WINGDIPAPI
+GdipGetPathGradientBlend(GpPathGradient *brush,
+ REAL *blend, REAL *positions, INT count);
+
+GpStatus WINGDIPAPI
+GdipSetPathGradientBlend(GpPathGradient *brush,
+ GDIPCONST REAL *blend, GDIPCONST REAL *positions, INT count);
+
+GpStatus WINGDIPAPI
+GdipGetPathGradientPresetBlendCount(GpPathGradient *brush, INT *count);
+
+GpStatus WINGDIPAPI
+GdipGetPathGradientPresetBlend(GpPathGradient *brush, ARGB *blend,
+ REAL* positions, INT count);
+
+GpStatus WINGDIPAPI
+GdipSetPathGradientPresetBlend(GpPathGradient *brush, GDIPCONST ARGB *blend,
+ GDIPCONST REAL* positions, INT count);
+
+GpStatus WINGDIPAPI
+GdipSetPathGradientSigmaBlend(GpPathGradient *brush, REAL focus, REAL scale);
+
+GpStatus WINGDIPAPI
+GdipSetPathGradientLinearBlend(GpPathGradient *brush, REAL focus, REAL scale);
+
+GpStatus WINGDIPAPI
+GdipGetPathGradientWrapMode(GpPathGradient *brush,
+ GpWrapMode *wrapmode);
+
+GpStatus WINGDIPAPI
+GdipSetPathGradientWrapMode(GpPathGradient *brush,
+ GpWrapMode wrapmode);
+
+GpStatus WINGDIPAPI
+GdipGetPathGradientTransform(GpPathGradient *brush,
+ GpMatrix *matrix);
+
+GpStatus WINGDIPAPI
+GdipSetPathGradientTransform(GpPathGradient *brush,
+ GpMatrix *matrix);
+
+GpStatus WINGDIPAPI
+GdipResetPathGradientTransform(GpPathGradient* brush);
+
+GpStatus WINGDIPAPI
+GdipMultiplyPathGradientTransform(GpPathGradient* brush, GDIPCONST GpMatrix *matrix,
+ GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipTranslatePathGradientTransform(GpPathGradient* brush, REAL dx, REAL dy,
+ GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipScalePathGradientTransform(GpPathGradient* brush, REAL sx, REAL sy,
+ GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipRotatePathGradientTransform(GpPathGradient* brush, REAL angle,
+ GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipGetPathGradientFocusScales(GpPathGradient *brush, REAL* xScale, REAL* yScale);
+
+GpStatus WINGDIPAPI
+GdipSetPathGradientFocusScales(GpPathGradient *brush, REAL xScale, REAL yScale);
+
+//----------------------------------------------------------------------------
+// Pen methods
+//----------------------------------------------------------------------------
+
+GpStatus WINGDIPAPI
+GdipCreatePen1(ARGB color, REAL width, GpUnit unit, GpPen **pen);
+
+GpStatus WINGDIPAPI
+GdipCreatePen2(GpBrush *brush, REAL width, GpUnit unit,
+ GpPen **pen);
+
+GpStatus WINGDIPAPI
+GdipClonePen(GpPen *pen, GpPen **clonepen);
+
+GpStatus WINGDIPAPI
+GdipDeletePen(GpPen *pen);
+
+GpStatus WINGDIPAPI
+GdipSetPenWidth(GpPen *pen, REAL width);
+
+GpStatus WINGDIPAPI
+GdipGetPenWidth(GpPen *pen, REAL *width);
+
+GpStatus WINGDIPAPI
+GdipSetPenUnit(GpPen *pen, GpUnit unit);
+
+GpStatus WINGDIPAPI
+GdipGetPenUnit(GpPen *pen, GpUnit *unit);
+
+#ifdef DCR_USE_NEW_197819
+GpStatus WINGDIPAPI
+GdipSetPenLineCap197819(GpPen *pen, GpLineCap startCap, GpLineCap endCap,
+ GpDashCap dashCap);
+#else
+GpStatus WINGDIPAPI
+GdipSetPenLineCap(GpPen *pen, GpLineCap startCap, GpLineCap endCap,
+ GpLineCap dashCap);
+#endif // DCR_USE_NEW_197819
+
+
+GpStatus WINGDIPAPI
+GdipSetPenStartCap(GpPen *pen, GpLineCap startCap);
+
+GpStatus WINGDIPAPI
+GdipSetPenEndCap(GpPen *pen, GpLineCap endCap);
+
+#ifdef DCR_USE_NEW_197819
+GpStatus WINGDIPAPI
+GdipSetPenDashCap197819(GpPen *pen, GpDashCap dashCap);
+#else
+GpStatus WINGDIPAPI
+GdipSetPenDashCap(GpPen *pen, GpLineCap dashCap);
+#endif // DCR_USE_NEW_197819
+
+GpStatus WINGDIPAPI
+GdipGetPenStartCap(GpPen *pen, GpLineCap *startCap);
+
+GpStatus WINGDIPAPI
+GdipGetPenEndCap(GpPen *pen, GpLineCap *endCap);
+
+#ifdef DCR_USE_NEW_197819
+GpStatus WINGDIPAPI
+GdipGetPenDashCap197819(GpPen *pen, GpDashCap *dashCap);
+#else
+GpStatus WINGDIPAPI
+GdipGetPenDashCap(GpPen *pen, GpLineCap *dashCap);
+#endif // DCR_USE_NEW_197819
+
+GpStatus WINGDIPAPI
+GdipSetPenLineJoin(GpPen *pen, GpLineJoin lineJoin);
+
+GpStatus WINGDIPAPI
+GdipGetPenLineJoin(GpPen *pen, GpLineJoin *lineJoin);
+
+GpStatus WINGDIPAPI
+GdipSetPenCustomStartCap(GpPen *pen, GpCustomLineCap* customCap);
+
+GpStatus WINGDIPAPI
+GdipGetPenCustomStartCap(GpPen *pen, GpCustomLineCap** customCap);
+
+GpStatus WINGDIPAPI
+GdipSetPenCustomEndCap(GpPen *pen, GpCustomLineCap* customCap);
+
+GpStatus WINGDIPAPI
+GdipGetPenCustomEndCap(GpPen *pen, GpCustomLineCap** customCap);
+
+GpStatus WINGDIPAPI
+GdipSetPenMiterLimit(GpPen *pen, REAL miterLimit);
+
+GpStatus WINGDIPAPI
+GdipGetPenMiterLimit(GpPen *pen, REAL *miterLimit);
+
+GpStatus WINGDIPAPI
+GdipSetPenMode(GpPen *pen, GpPenAlignment penMode);
+
+GpStatus WINGDIPAPI
+GdipGetPenMode(GpPen *pen, GpPenAlignment *penMode);
+
+GpStatus WINGDIPAPI
+GdipSetPenTransform(GpPen *pen, GpMatrix *matrix);
+
+GpStatus WINGDIPAPI
+GdipGetPenTransform(GpPen *pen, GpMatrix *matrix);
+
+GpStatus WINGDIPAPI
+GdipResetPenTransform(GpPen *pen);
+
+GpStatus WINGDIPAPI
+GdipMultiplyPenTransform(GpPen *pen, GDIPCONST GpMatrix *matrix,
+ GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipTranslatePenTransform(GpPen *pen, REAL dx, REAL dy,
+ GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipScalePenTransform(GpPen *pen, REAL sx, REAL sy,
+ GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipRotatePenTransform(GpPen *pen, REAL angle, GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipSetPenColor(GpPen *pen, ARGB argb);
+
+GpStatus WINGDIPAPI
+GdipGetPenColor(GpPen *pen, ARGB *argb);
+
+GpStatus WINGDIPAPI
+GdipSetPenBrushFill(GpPen *pen, GpBrush *brush);
+
+GpStatus WINGDIPAPI
+GdipGetPenBrushFill(GpPen *pen, GpBrush **brush);
+
+GpStatus WINGDIPAPI
+GdipGetPenFillType(GpPen *pen, GpPenType* type);
+
+GpStatus WINGDIPAPI
+GdipGetPenDashStyle(GpPen *pen, GpDashStyle *dashstyle);
+
+GpStatus WINGDIPAPI
+GdipSetPenDashStyle(GpPen *pen, GpDashStyle dashstyle);
+
+GpStatus WINGDIPAPI
+GdipGetPenDashOffset(GpPen *pen, REAL *offset);
+
+GpStatus WINGDIPAPI
+GdipSetPenDashOffset(GpPen *pen, REAL offset);
+
+GpStatus WINGDIPAPI
+GdipGetPenDashCount(GpPen *pen, INT *count);
+
+GpStatus WINGDIPAPI
+GdipSetPenDashArray(GpPen *pen, GDIPCONST REAL *dash, INT count);
+
+GpStatus WINGDIPAPI
+GdipGetPenDashArray(GpPen *pen, REAL *dash, INT count);
+
+GpStatus WINGDIPAPI
+GdipGetPenCompoundCount(GpPen *pen, INT *count);
+
+GpStatus WINGDIPAPI
+GdipSetPenCompoundArray(GpPen *pen, GDIPCONST REAL *dash, INT count);
+
+GpStatus WINGDIPAPI
+GdipGetPenCompoundArray(GpPen *pen, REAL *dash, INT count);
+
+//----------------------------------------------------------------------------
+// CustomLineCap methods
+//----------------------------------------------------------------------------
+
+GpStatus WINGDIPAPI
+GdipCreateCustomLineCap(GpPath* fillPath, GpPath* strokePath,
+ GpLineCap baseCap, REAL baseInset, GpCustomLineCap **customCap);
+
+GpStatus WINGDIPAPI
+GdipDeleteCustomLineCap(GpCustomLineCap* customCap);
+
+GpStatus WINGDIPAPI
+GdipCloneCustomLineCap(GpCustomLineCap* customCap,
+ GpCustomLineCap** clonedCap);
+
+GpStatus WINGDIPAPI
+GdipGetCustomLineCapType(GpCustomLineCap* customCap,
+ CustomLineCapType* capType);
+
+GpStatus WINGDIPAPI
+GdipSetCustomLineCapStrokeCaps(GpCustomLineCap* customCap,
+ GpLineCap startCap, GpLineCap endCap);
+
+GpStatus WINGDIPAPI
+GdipGetCustomLineCapStrokeCaps(GpCustomLineCap* customCap,
+ GpLineCap* startCap, GpLineCap* endCap);
+
+GpStatus WINGDIPAPI
+GdipSetCustomLineCapStrokeJoin(GpCustomLineCap* customCap, GpLineJoin lineJoin);
+
+GpStatus WINGDIPAPI
+GdipGetCustomLineCapStrokeJoin(GpCustomLineCap* customCap, GpLineJoin* lineJoin);
+
+GpStatus WINGDIPAPI
+GdipSetCustomLineCapBaseCap(GpCustomLineCap* customCap, GpLineCap baseCap);
+
+GpStatus WINGDIPAPI
+GdipGetCustomLineCapBaseCap(GpCustomLineCap* customCap, GpLineCap* baseCap);
+
+GpStatus WINGDIPAPI
+GdipSetCustomLineCapBaseInset(GpCustomLineCap* customCap, REAL inset);
+
+GpStatus WINGDIPAPI
+GdipGetCustomLineCapBaseInset(GpCustomLineCap* customCap, REAL* inset);
+
+GpStatus WINGDIPAPI
+GdipSetCustomLineCapWidthScale(GpCustomLineCap* customCap, REAL widthScale);
+
+GpStatus WINGDIPAPI
+GdipGetCustomLineCapWidthScale(GpCustomLineCap* customCap, REAL* widthScale);
+
+//----------------------------------------------------------------------------
+// AdjustableArrowCap methods
+//----------------------------------------------------------------------------
+
+GpStatus WINGDIPAPI
+GdipCreateAdjustableArrowCap(REAL height, REAL width, BOOL isFilled,
+ GpAdjustableArrowCap **cap);
+
+GpStatus WINGDIPAPI
+GdipSetAdjustableArrowCapHeight(GpAdjustableArrowCap* cap, REAL height);
+
+GpStatus WINGDIPAPI
+GdipGetAdjustableArrowCapHeight(GpAdjustableArrowCap* cap, REAL* height);
+
+GpStatus WINGDIPAPI
+GdipSetAdjustableArrowCapWidth(GpAdjustableArrowCap* cap, REAL width);
+
+GpStatus WINGDIPAPI
+GdipGetAdjustableArrowCapWidth(GpAdjustableArrowCap* cap, REAL* width);
+
+GpStatus WINGDIPAPI
+GdipSetAdjustableArrowCapMiddleInset(GpAdjustableArrowCap* cap, REAL middleInset);
+
+GpStatus WINGDIPAPI
+GdipGetAdjustableArrowCapMiddleInset(GpAdjustableArrowCap* cap, REAL* middleInset);
+
+GpStatus WINGDIPAPI
+GdipSetAdjustableArrowCapFillState(GpAdjustableArrowCap* cap, BOOL fillState);
+
+GpStatus WINGDIPAPI
+GdipGetAdjustableArrowCapFillState(GpAdjustableArrowCap* cap, BOOL* fillState);
+
+//----------------------------------------------------------------------------
+// Image methods
+//----------------------------------------------------------------------------
+
+GpStatus WINGDIPAPI
+GdipLoadImageFromStream(IStream* stream, GpImage **image);
+
+GpStatus WINGDIPAPI
+GdipLoadImageFromFile(GDIPCONST WCHAR* filename, GpImage **image);
+
+GpStatus WINGDIPAPI
+GdipLoadImageFromStreamICM(IStream* stream, GpImage **image);
+
+GpStatus WINGDIPAPI
+GdipLoadImageFromFileICM(GDIPCONST WCHAR* filename, GpImage **image);
+
+GpStatus WINGDIPAPI
+GdipCloneImage(GpImage *image, GpImage **cloneImage);
+
+GpStatus WINGDIPAPI
+GdipDisposeImage(GpImage *image);
+
+GpStatus WINGDIPAPI
+GdipSaveImageToFile(GpImage *image, GDIPCONST WCHAR* filename,
+ GDIPCONST CLSID* clsidEncoder, GDIPCONST EncoderParameters* encoderParams);
+
+GpStatus WINGDIPAPI
+GdipSaveImageToStream(GpImage *image, IStream* stream,
+ GDIPCONST CLSID* clsidEncoder, GDIPCONST EncoderParameters* encoderParams);
+
+GpStatus WINGDIPAPI
+GdipSaveAdd(GpImage *image, GDIPCONST EncoderParameters* encoderParams);
+
+GpStatus WINGDIPAPI
+GdipSaveAddImage(GpImage *image, GpImage* newImage,
+ GDIPCONST EncoderParameters* encoderParams);
+
+GpStatus WINGDIPAPI
+GdipGetImageGraphicsContext(GpImage *image, GpGraphics **graphics);
+
+GpStatus WINGDIPAPI
+GdipGetImageBounds(GpImage *image, GpRectF *srcRect, GpUnit *srcUnit);
+
+GpStatus WINGDIPAPI
+GdipGetImageDimension(GpImage *image, REAL *width, REAL *height);
+
+GpStatus WINGDIPAPI
+GdipGetImageType(GpImage *image, ImageType *type);
+
+GpStatus WINGDIPAPI
+GdipGetImageWidth(GpImage *image, UINT *width);
+
+GpStatus WINGDIPAPI
+GdipGetImageHeight(GpImage *image, UINT *height);
+
+GpStatus WINGDIPAPI
+GdipGetImageHorizontalResolution(GpImage *image, REAL *resolution);
+
+GpStatus WINGDIPAPI
+GdipGetImageVerticalResolution(GpImage *image, REAL *resolution);
+
+GpStatus WINGDIPAPI
+GdipGetImageFlags(GpImage *image, UINT *flags);
+
+GpStatus WINGDIPAPI
+GdipGetImageRawFormat(GpImage *image, GUID *format);
+
+GpStatus WINGDIPAPI
+GdipGetImagePixelFormat(GpImage *image, PixelFormat *format);
+
+GpStatus WINGDIPAPI
+GdipGetImageThumbnail(GpImage *image, UINT thumbWidth, UINT thumbHeight,
+ GpImage **thumbImage,
+ GetThumbnailImageAbort callback, VOID * callbackData);
+
+GpStatus WINGDIPAPI
+GdipGetEncoderParameterListSize(GpImage *image, GDIPCONST CLSID* clsidEncoder,
+ UINT* size);
+
+GpStatus WINGDIPAPI
+GdipGetEncoderParameterList(GpImage *image, GDIPCONST CLSID* clsidEncoder,
+ UINT size, EncoderParameters* buffer);
+
+GpStatus WINGDIPAPI
+GdipImageGetFrameDimensionsCount(GpImage* image, UINT* count);
+
+GpStatus WINGDIPAPI
+GdipImageGetFrameDimensionsList(GpImage* image, GUID* dimensionIDs, UINT count);
+
+GpStatus WINGDIPAPI
+GdipImageGetFrameCount(GpImage *image, GDIPCONST GUID* dimensionID, UINT* count);
+
+GpStatus WINGDIPAPI
+GdipImageSelectActiveFrame(GpImage *image, GDIPCONST GUID* dimensionID,
+ UINT frameIndex);
+
+GpStatus WINGDIPAPI
+GdipImageRotateFlip(GpImage *image, RotateFlipType rfType);
+
+GpStatus WINGDIPAPI
+GdipGetImagePalette(GpImage *image, ColorPalette *palette, INT size);
+
+GpStatus WINGDIPAPI
+GdipSetImagePalette(GpImage *image, GDIPCONST ColorPalette *palette);
+
+GpStatus WINGDIPAPI
+GdipGetImagePaletteSize(GpImage *image, INT *size);
+
+GpStatus WINGDIPAPI
+GdipGetPropertyCount(GpImage *image, UINT* numOfProperty);
+
+GpStatus WINGDIPAPI
+GdipGetPropertyIdList(GpImage *image, UINT numOfProperty, PROPID* list);
+
+GpStatus WINGDIPAPI
+GdipGetPropertyItemSize(GpImage *image, PROPID propId, UINT* size);
+
+GpStatus WINGDIPAPI
+GdipGetPropertyItem(GpImage *image, PROPID propId,UINT propSize,
+ PropertyItem* buffer);
+
+GpStatus WINGDIPAPI
+GdipGetPropertySize(GpImage *image, UINT* totalBufferSize, UINT* numProperties);
+
+GpStatus WINGDIPAPI
+GdipGetAllPropertyItems(GpImage *image, UINT totalBufferSize,
+ UINT numProperties, PropertyItem* allItems);
+
+GpStatus WINGDIPAPI
+GdipRemovePropertyItem(GpImage *image, PROPID propId);
+
+GpStatus WINGDIPAPI
+GdipSetPropertyItem(GpImage *image, GDIPCONST PropertyItem* item);
+
+GpStatus WINGDIPAPI
+GdipImageForceValidation(GpImage *image);
+
+GpStatus WINGDIPAPI
+GdipGetImageLayout(GpImage *image, ImageLayout* layout);
+
+GpStatus WINGDIPAPI
+GdipSetImageLayout(GpImage *image, GDIPCONST ImageLayout layout);
+
+//----------------------------------------------------------------------------
+// Bitmap methods
+//----------------------------------------------------------------------------
+
+GpStatus WINGDIPAPI
+GdipCreateBitmapFromStream(IStream* stream, GpBitmap **bitmap);
+
+GpStatus WINGDIPAPI
+GdipCreateBitmapFromFile(GDIPCONST WCHAR* filename, GpBitmap **bitmap);
+
+GpStatus WINGDIPAPI
+GdipCreateBitmapFromStreamICM(IStream* stream, GpBitmap **bitmap);
+
+GpStatus WINGDIPAPI
+GdipCreateBitmapFromFileICM(GDIPCONST WCHAR* filename, GpBitmap **bitmap);
+
+GpStatus WINGDIPAPI
+GdipCreateBitmapFromScan0(INT width,
+ INT height,
+ INT stride,
+ PixelFormat format,
+ BYTE* scan0,
+ GpBitmap** bitmap);
+
+GpStatus WINGDIPAPI
+GdipCreateBitmapFromGraphics(INT width,
+ INT height,
+ GpGraphics* target,
+ GpBitmap** bitmap);
+
+GpStatus WINGDIPAPI
+GdipCreateBitmapFromDirectDrawSurface(IDirectDrawSurface7* surface,
+ GpBitmap** bitmap);
+
+GpStatus WINGDIPAPI
+GdipCreateBitmapFromGdiDib(GDIPCONST BITMAPINFO* gdiBitmapInfo,
+ VOID* gdiBitmapData,
+ GpBitmap** bitmap);
+
+GpStatus WINGDIPAPI
+GdipCreateBitmapFromHBITMAP(HBITMAP hbm,
+ HPALETTE hpal,
+ GpBitmap** bitmap);
+
+GpStatus WINGDIPAPI
+GdipCreateHBITMAPFromBitmap(GpBitmap* bitmap,
+ HBITMAP* hbmReturn,
+ ARGB background);
+
+GpStatus WINGDIPAPI
+GdipCreateBitmapFromHICON(HICON hicon,
+ GpBitmap** bitmap);
+
+GpStatus WINGDIPAPI
+GdipCreateHICONFromBitmap(GpBitmap* bitmap,
+ HICON* hbmReturn);
+
+GpStatus WINGDIPAPI
+GdipCreateBitmapFromResource(HINSTANCE hInstance,
+ GDIPCONST WCHAR* lpBitmapName,
+ GpBitmap** bitmap);
+
+GpStatus WINGDIPAPI
+GdipCloneBitmapArea(REAL x, REAL y, REAL width, REAL height,
+ PixelFormat format,
+ GpBitmap *srcBitmap,
+ GpBitmap **dstBitmap);
+
+GpStatus WINGDIPAPI
+GdipCloneBitmapAreaI(INT x,
+ INT y,
+ INT width,
+ INT height,
+ PixelFormat format,
+ GpBitmap *srcBitmap,
+ GpBitmap **dstBitmap);
+
+GpStatus WINGDIPAPI
+GdipBitmapLockBits(GpBitmap* bitmap,
+ GDIPCONST GpRect* rect,
+ UINT flags,
+ PixelFormat format,
+ BitmapData* lockedBitmapData);
+
+GpStatus WINGDIPAPI
+GdipBitmapUnlockBits(GpBitmap* bitmap,
+ BitmapData* lockedBitmapData);
+
+GpStatus WINGDIPAPI
+GdipBitmapGetPixel(GpBitmap* bitmap, INT x, INT y, ARGB *color);
+
+GpStatus WINGDIPAPI
+GdipBitmapSetPixel(GpBitmap* bitmap, INT x, INT y, ARGB color);
+
+GpStatus WINGDIPAPI
+GdipBitmapSetResolution(GpBitmap* bitmap, REAL xdpi, REAL ydpi);
+
+//----------------------------------------------------------------------------
+// ImageAttributes methods
+//----------------------------------------------------------------------------
+
+GpStatus WINGDIPAPI
+GdipCreateImageAttributes(GpImageAttributes **imageattr);
+
+GpStatus WINGDIPAPI
+GdipCloneImageAttributes(GDIPCONST GpImageAttributes *imageattr,
+ GpImageAttributes **cloneImageattr);
+
+GpStatus WINGDIPAPI
+GdipDisposeImageAttributes(GpImageAttributes *imageattr);
+
+GpStatus WINGDIPAPI
+GdipSetImageAttributesToIdentity(GpImageAttributes *imageattr,
+ ColorAdjustType type);
+GpStatus WINGDIPAPI
+GdipResetImageAttributes(GpImageAttributes *imageattr,
+ ColorAdjustType type);
+
+GpStatus WINGDIPAPI
+GdipSetImageAttributesColorMatrix(GpImageAttributes *imageattr,
+ ColorAdjustType type,
+ BOOL enableFlag,
+ GDIPCONST ColorMatrix* colorMatrix,
+ GDIPCONST ColorMatrix* grayMatrix,
+ ColorMatrixFlags flags);
+
+GpStatus WINGDIPAPI
+GdipSetImageAttributesThreshold(GpImageAttributes *imageattr,
+ ColorAdjustType type,
+ BOOL enableFlag,
+ REAL threshold);
+
+GpStatus WINGDIPAPI
+GdipSetImageAttributesGamma(GpImageAttributes *imageattr,
+ ColorAdjustType type,
+ BOOL enableFlag,
+ REAL gamma);
+
+GpStatus WINGDIPAPI
+GdipSetImageAttributesNoOp(GpImageAttributes *imageattr,
+ ColorAdjustType type,
+ BOOL enableFlag);
+
+GpStatus WINGDIPAPI
+GdipSetImageAttributesColorKeys(GpImageAttributes *imageattr,
+ ColorAdjustType type,
+ BOOL enableFlag,
+ ARGB colorLow,
+ ARGB colorHigh);
+
+GpStatus WINGDIPAPI
+GdipSetImageAttributesOutputChannel(GpImageAttributes *imageattr,
+ ColorAdjustType type,
+ BOOL enableFlag,
+ ColorChannelFlags channelFlags);
+
+GpStatus WINGDIPAPI
+GdipSetImageAttributesOutputChannelColorProfile(GpImageAttributes *imageattr,
+ ColorAdjustType type,
+ BOOL enableFlag,
+ GDIPCONST WCHAR *colorProfileFilename);
+
+GpStatus WINGDIPAPI
+GdipSetImageAttributesRemapTable(GpImageAttributes *imageattr,
+ ColorAdjustType type,
+ BOOL enableFlag,
+ UINT mapSize,
+ GDIPCONST ColorMap *map);
+GpStatus WINGDIPAPI
+GdipSetImageAttributesWrapMode(
+ GpImageAttributes *imageAttr,
+ WrapMode wrap,
+ ARGB argb,
+ BOOL clamp
+);
+
+GpStatus WINGDIPAPI
+GdipSetImageAttributesICMMode(
+ GpImageAttributes *imageAttr,
+ BOOL on
+);
+
+GpStatus WINGDIPAPI
+GdipGetImageAttributesAdjustedPalette(
+ GpImageAttributes *imageAttr,
+ ColorPalette * colorPalette,
+ ColorAdjustType colorAdjustType
+);
+
+//----------------------------------------------------------------------------
+// Graphics methods
+//----------------------------------------------------------------------------
+
+GpStatus WINGDIPAPI
+GdipFlush(GpGraphics *graphics, GpFlushIntention intention);
+
+GpStatus WINGDIPAPI
+GdipCreateFromHDC(HDC hdc, GpGraphics **graphics);
+
+GpStatus WINGDIPAPI
+GdipCreateFromHDC2(HDC hdc, HANDLE hDevice, GpGraphics **graphics);
+
+GpStatus WINGDIPAPI
+GdipCreateFromHWND(HWND hwnd, GpGraphics **graphics);
+
+GpStatus WINGDIPAPI
+GdipCreateFromHWNDICM(HWND hwnd, GpGraphics **graphics);
+
+GpStatus WINGDIPAPI
+GdipDeleteGraphics(GpGraphics *graphics);
+
+GpStatus WINGDIPAPI
+GdipGetDC(GpGraphics* graphics, HDC * hdc);
+
+GpStatus WINGDIPAPI
+GdipReleaseDC(GpGraphics* graphics, HDC hdc);
+
+GpStatus WINGDIPAPI
+GdipSetCompositingMode(GpGraphics *graphics, CompositingMode compositingMode);
+
+GpStatus WINGDIPAPI
+GdipGetCompositingMode(GpGraphics *graphics, CompositingMode *compositingMode);
+
+GpStatus WINGDIPAPI
+GdipSetRenderingOrigin(GpGraphics *graphics, INT x, INT y);
+
+GpStatus WINGDIPAPI
+GdipGetRenderingOrigin(GpGraphics *graphics, INT *x, INT *y);
+
+GpStatus WINGDIPAPI
+GdipSetCompositingQuality(GpGraphics *graphics, CompositingQuality compositingQuality);
+
+GpStatus WINGDIPAPI
+GdipGetCompositingQuality(GpGraphics *graphics, CompositingQuality *compositingQuality);
+
+GpStatus WINGDIPAPI
+GdipSetSmoothingMode(GpGraphics *graphics, SmoothingMode smoothingMode);
+
+GpStatus WINGDIPAPI
+GdipGetSmoothingMode(GpGraphics *graphics, SmoothingMode *smoothingMode);
+
+GpStatus WINGDIPAPI
+GdipSetPixelOffsetMode(GpGraphics* graphics, PixelOffsetMode pixelOffsetMode);
+
+GpStatus WINGDIPAPI
+GdipGetPixelOffsetMode(GpGraphics *graphics, PixelOffsetMode *pixelOffsetMode);
+
+GpStatus WINGDIPAPI
+GdipSetTextRenderingHint(GpGraphics *graphics, TextRenderingHint mode);
+
+GpStatus WINGDIPAPI
+GdipGetTextRenderingHint(GpGraphics *graphics, TextRenderingHint *mode);
+
+#ifdef DCR_USE_NEW_188922
+GpStatus WINGDIPAPI
+GdipSetTextContrast(GpGraphics *graphics, UINT contrast);
+
+GpStatus WINGDIPAPI
+GdipGetTextContrast(GpGraphics *graphics, UINT * contrast);
+#else
+GpStatus WINGDIPAPI
+GdipSetTextGammaValue(GpGraphics *graphics, UINT gammaValue);
+
+GpStatus WINGDIPAPI
+GdipGetTextGammaValue(GpGraphics *graphics, UINT * gammaValue);
+#endif // DCR_USE_NEW_188922
+
+
+GpStatus WINGDIPAPI
+GdipSetInterpolationMode(GpGraphics *graphics, InterpolationMode interpolationMode);
+
+GpStatus WINGDIPAPI
+GdipGetInterpolationMode(GpGraphics *graphics, InterpolationMode *interpolationMode);
+
+GpStatus WINGDIPAPI
+GdipSetWorldTransform(GpGraphics *graphics, GpMatrix *matrix);
+
+GpStatus WINGDIPAPI
+GdipResetWorldTransform(GpGraphics *graphics);
+
+GpStatus WINGDIPAPI
+GdipMultiplyWorldTransform(GpGraphics *graphics, GDIPCONST GpMatrix *matrix,
+ GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipTranslateWorldTransform(GpGraphics *graphics, REAL dx, REAL dy,
+ GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipScaleWorldTransform(GpGraphics *graphics, REAL sx, REAL sy,
+ GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipRotateWorldTransform(GpGraphics *graphics, REAL angle, GpMatrixOrder order);
+
+GpStatus WINGDIPAPI
+GdipGetWorldTransform(GpGraphics *graphics, GpMatrix *matrix);
+
+GpStatus WINGDIPAPI
+GdipResetPageTransform(GpGraphics *graphics);
+
+GpStatus WINGDIPAPI
+GdipGetPageUnit(GpGraphics *graphics, GpUnit *unit);
+
+GpStatus WINGDIPAPI
+GdipGetPageScale(GpGraphics *graphics, REAL *scale);
+
+GpStatus WINGDIPAPI
+GdipSetPageUnit(GpGraphics *graphics, GpUnit unit);
+
+GpStatus WINGDIPAPI
+GdipSetPageScale(GpGraphics *graphics, REAL scale);
+
+GpStatus WINGDIPAPI
+GdipGetDpiX(GpGraphics *graphics, REAL* dpi);
+
+GpStatus WINGDIPAPI
+GdipGetDpiY(GpGraphics *graphics, REAL* dpi);
+
+GpStatus WINGDIPAPI
+GdipTransformPoints(GpGraphics *graphics, GpCoordinateSpace destSpace,
+ GpCoordinateSpace srcSpace, GpPointF *points,
+ INT count);
+
+GpStatus WINGDIPAPI
+GdipTransformPointsI(GpGraphics *graphics, GpCoordinateSpace destSpace,
+ GpCoordinateSpace srcSpace, GpPoint *points,
+ INT count);
+
+GpStatus WINGDIPAPI
+GdipGetNearestColor(GpGraphics *graphics, ARGB* argb);
+
+// Create the Win9x Halftone Palette (even on NT) with correct Desktop colors
+HPALETTE WINGDIPAPI
+GdipCreateHalftonePalette();
+
+GpStatus WINGDIPAPI
+GdipDrawLine(GpGraphics *graphics, GpPen *pen, REAL x1, REAL y1,
+ REAL x2, REAL y2);
+
+GpStatus WINGDIPAPI
+GdipDrawLineI(GpGraphics *graphics, GpPen *pen, INT x1, INT y1,
+ INT x2, INT y2);
+
+GpStatus WINGDIPAPI
+GdipDrawLines(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *points,
+ INT count);
+
+GpStatus WINGDIPAPI
+GdipDrawLinesI(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPoint *points,
+ INT count);
+
+GpStatus WINGDIPAPI
+GdipDrawArc(GpGraphics *graphics, GpPen *pen, REAL x, REAL y,
+ REAL width, REAL height, REAL startAngle, REAL sweepAngle);
+
+GpStatus WINGDIPAPI
+GdipDrawArcI(GpGraphics *graphics, GpPen *pen, INT x, INT y,
+ INT width, INT height, REAL startAngle, REAL sweepAngle);
+
+GpStatus WINGDIPAPI
+GdipDrawBezier(GpGraphics *graphics, GpPen *pen, REAL x1, REAL y1,
+ REAL x2, REAL y2, REAL x3, REAL y3, REAL x4, REAL y4);
+
+GpStatus WINGDIPAPI
+GdipDrawBezierI(GpGraphics *graphics, GpPen *pen, INT x1, INT y1,
+ INT x2, INT y2, INT x3, INT y3, INT x4, INT y4);
+
+GpStatus WINGDIPAPI
+GdipDrawBeziers(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *points,
+ INT count);
+
+GpStatus WINGDIPAPI
+GdipDrawBeziersI(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPoint *points,
+ INT count);
+
+GpStatus WINGDIPAPI
+GdipDrawRectangle(GpGraphics *graphics, GpPen *pen, REAL x, REAL y,
+ REAL width, REAL height);
+
+GpStatus WINGDIPAPI
+GdipDrawRectangleI(GpGraphics *graphics, GpPen *pen, INT x, INT y,
+ INT width, INT height);
+
+GpStatus WINGDIPAPI
+GdipDrawRectangles(GpGraphics *graphics, GpPen *pen, GDIPCONST GpRectF *rects,
+ INT count);
+
+GpStatus WINGDIPAPI
+GdipDrawRectanglesI(GpGraphics *graphics, GpPen *pen, GDIPCONST GpRect *rects,
+ INT count);
+
+GpStatus WINGDIPAPI
+GdipDrawEllipse(GpGraphics *graphics, GpPen *pen, REAL x, REAL y,
+ REAL width, REAL height);
+
+GpStatus WINGDIPAPI
+GdipDrawEllipseI(GpGraphics *graphics, GpPen *pen, INT x, INT y,
+ INT width, INT height);
+
+GpStatus WINGDIPAPI
+GdipDrawPie(GpGraphics *graphics, GpPen *pen, REAL x, REAL y,
+ REAL width, REAL height, REAL startAngle, REAL sweepAngle);
+
+GpStatus WINGDIPAPI
+GdipDrawPieI(GpGraphics *graphics, GpPen *pen, INT x, INT y,
+ INT width, INT height, REAL startAngle, REAL sweepAngle);
+
+GpStatus WINGDIPAPI
+GdipDrawPolygon(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *points,
+ INT count);
+
+GpStatus WINGDIPAPI
+GdipDrawPolygonI(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPoint *points,
+ INT count);
+
+GpStatus WINGDIPAPI
+GdipDrawPath(GpGraphics *graphics, GpPen *pen, GpPath *path);
+
+GpStatus WINGDIPAPI
+GdipDrawCurve(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *points,
+ INT count);
+
+GpStatus WINGDIPAPI
+GdipDrawCurveI(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPoint *points,
+ INT count);
+
+GpStatus WINGDIPAPI
+GdipDrawCurve2(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *points,
+ INT count, REAL tension);
+
+GpStatus WINGDIPAPI
+GdipDrawCurve2I(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPoint *points,
+ INT count, REAL tension);
+
+GpStatus WINGDIPAPI
+GdipDrawCurve3(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *points,
+ INT count, INT offset, INT numberOfSegments, REAL tension);
+
+GpStatus WINGDIPAPI
+GdipDrawCurve3I(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPoint *points,
+ INT count, INT offset, INT numberOfSegments, REAL tension);
+
+GpStatus WINGDIPAPI
+GdipDrawClosedCurve(GpGraphics *graphics, GpPen *pen,
+ GDIPCONST GpPointF *points, INT count);
+
+GpStatus WINGDIPAPI
+GdipDrawClosedCurveI(GpGraphics *graphics, GpPen *pen,
+ GDIPCONST GpPoint *points, INT count);
+
+GpStatus WINGDIPAPI
+GdipDrawClosedCurve2(GpGraphics *graphics, GpPen *pen,
+ GDIPCONST GpPointF *points, INT count, REAL tension);
+
+GpStatus WINGDIPAPI
+GdipDrawClosedCurve2I(GpGraphics *graphics, GpPen *pen,
+ GDIPCONST GpPoint *points, INT count, REAL tension);
+
+GpStatus WINGDIPAPI
+GdipGraphicsClear(GpGraphics *graphics, ARGB color);
+
+GpStatus WINGDIPAPI
+GdipFillRectangle(GpGraphics *graphics, GpBrush *brush, REAL x, REAL y,
+ REAL width, REAL height);
+
+GpStatus WINGDIPAPI
+GdipFillRectangleI(GpGraphics *graphics, GpBrush *brush, INT x, INT y,
+ INT width, INT height);
+
+GpStatus WINGDIPAPI
+GdipFillRectangles(GpGraphics *graphics, GpBrush *brush,
+ GDIPCONST GpRectF *rects, INT count);
+
+GpStatus WINGDIPAPI
+GdipFillRectanglesI(GpGraphics *graphics, GpBrush *brush,
+ GDIPCONST GpRect *rects, INT count);
+
+GpStatus WINGDIPAPI
+GdipFillPolygon(GpGraphics *graphics, GpBrush *brush,
+ GDIPCONST GpPointF *points, INT count, GpFillMode fillMode);
+
+GpStatus WINGDIPAPI
+GdipFillPolygonI(GpGraphics *graphics, GpBrush *brush,
+ GDIPCONST GpPoint *points, INT count, GpFillMode fillMode);
+
+GpStatus WINGDIPAPI
+GdipFillPolygon2(GpGraphics *graphics, GpBrush *brush,
+ GDIPCONST GpPointF *points, INT count);
+
+GpStatus WINGDIPAPI
+GdipFillPolygon2I(GpGraphics *graphics, GpBrush *brush,
+ GDIPCONST GpPoint *points, INT count);
+
+GpStatus WINGDIPAPI
+GdipFillEllipse(GpGraphics *graphics, GpBrush *brush, REAL x, REAL y,
+ REAL width, REAL height);
+
+GpStatus WINGDIPAPI
+GdipFillEllipseI(GpGraphics *graphics, GpBrush *brush, INT x, INT y,
+ INT width, INT height);
+
+GpStatus WINGDIPAPI
+GdipFillPie(GpGraphics *graphics, GpBrush *brush, REAL x, REAL y,
+ REAL width, REAL height, REAL startAngle, REAL sweepAngle);
+
+GpStatus WINGDIPAPI
+GdipFillPieI(GpGraphics *graphics, GpBrush *brush, INT x, INT y,
+ INT width, INT height, REAL startAngle, REAL sweepAngle);
+
+GpStatus WINGDIPAPI
+GdipFillPath(GpGraphics *graphics, GpBrush *brush, GpPath *path);
+
+GpStatus WINGDIPAPI
+GdipFillClosedCurve(GpGraphics *graphics, GpBrush *brush,
+ GDIPCONST GpPointF *points, INT count);
+
+GpStatus WINGDIPAPI
+GdipFillClosedCurveI(GpGraphics *graphics, GpBrush *brush,
+ GDIPCONST GpPoint *points, INT count);
+
+GpStatus WINGDIPAPI
+GdipFillClosedCurve2(GpGraphics *graphics, GpBrush *brush,
+ GDIPCONST GpPointF *points, INT count,
+ REAL tension, GpFillMode fillMode);
+
+GpStatus WINGDIPAPI
+GdipFillClosedCurve2I(GpGraphics *graphics, GpBrush *brush,
+ GDIPCONST GpPoint *points, INT count,
+ REAL tension, GpFillMode fillMode);
+
+GpStatus WINGDIPAPI
+GdipFillRegion(GpGraphics *graphics, GpBrush *brush,
+ GpRegion *region);
+
+GpStatus WINGDIPAPI
+GdipDrawImage(GpGraphics *graphics, GpImage *image, REAL x, REAL y);
+
+GpStatus WINGDIPAPI
+GdipDrawImageI(GpGraphics *graphics, GpImage *image, INT x, INT y);
+
+GpStatus WINGDIPAPI
+GdipDrawImageRect(GpGraphics *graphics, GpImage *image, REAL x, REAL y,
+ REAL width, REAL height);
+
+GpStatus WINGDIPAPI
+GdipDrawImageRectI(GpGraphics *graphics, GpImage *image, INT x, INT y,
+ INT width, INT height);
+
+GpStatus WINGDIPAPI
+GdipDrawImagePoints(GpGraphics *graphics, GpImage *image,
+ GDIPCONST GpPointF *dstpoints, INT count);
+
+GpStatus WINGDIPAPI
+GdipDrawImagePointsI(GpGraphics *graphics, GpImage *image,
+ GDIPCONST GpPoint *dstpoints, INT count);
+
+GpStatus WINGDIPAPI
+GdipDrawImagePointRect(GpGraphics *graphics, GpImage *image, REAL x,
+ REAL y, REAL srcx, REAL srcy, REAL srcwidth,
+ REAL srcheight, GpUnit srcUnit);
+
+GpStatus WINGDIPAPI
+GdipDrawImagePointRectI(GpGraphics *graphics, GpImage *image, INT x,
+ INT y, INT srcx, INT srcy, INT srcwidth,
+ INT srcheight, GpUnit srcUnit);
+
+GpStatus WINGDIPAPI
+GdipDrawImageRectRect(GpGraphics *graphics, GpImage *image, REAL dstx,
+ REAL dsty, REAL dstwidth, REAL dstheight,
+ REAL srcx, REAL srcy, REAL srcwidth, REAL srcheight,
+ GpUnit srcUnit,
+ GDIPCONST GpImageAttributes* imageAttributes,
+ DrawImageAbort callback, VOID * callbackData);
+
+GpStatus WINGDIPAPI
+GdipDrawImageRectRectI(GpGraphics *graphics, GpImage *image, INT dstx,
+ INT dsty, INT dstwidth, INT dstheight,
+ INT srcx, INT srcy, INT srcwidth, INT srcheight,
+ GpUnit srcUnit,
+ GDIPCONST GpImageAttributes* imageAttributes,
+ DrawImageAbort callback, VOID * callbackData);
+
+GpStatus WINGDIPAPI
+GdipDrawImagePointsRect(GpGraphics *graphics, GpImage *image,
+ GDIPCONST GpPointF *points, INT count, REAL srcx,
+ REAL srcy, REAL srcwidth, REAL srcheight,
+ GpUnit srcUnit,
+ GDIPCONST GpImageAttributes* imageAttributes,
+ DrawImageAbort callback, VOID * callbackData);
+
+GpStatus WINGDIPAPI
+GdipDrawImagePointsRectI(GpGraphics *graphics, GpImage *image,
+ GDIPCONST GpPoint *points, INT count, INT srcx,
+ INT srcy, INT srcwidth, INT srcheight,
+ GpUnit srcUnit,
+ GDIPCONST GpImageAttributes* imageAttributes,
+ DrawImageAbort callback, VOID * callbackData);
+
+GpStatus WINGDIPAPI
+GdipEnumerateMetafileDestPoint(
+ GpGraphics * graphics,
+ GDIPCONST GpMetafile * metafile,
+ GDIPCONST PointF & destPoint,
+ EnumerateMetafileProc callback,
+ VOID * callbackData,
+ GDIPCONST GpImageAttributes * imageAttributes
+ );
+
+GpStatus WINGDIPAPI
+GdipEnumerateMetafileDestPointI(
+ GpGraphics * graphics,
+ GDIPCONST GpMetafile * metafile,
+ GDIPCONST Point & destPoint,
+ EnumerateMetafileProc callback,
+ VOID * callbackData,
+ GDIPCONST GpImageAttributes * imageAttributes
+ );
+
+GpStatus WINGDIPAPI
+GdipEnumerateMetafileDestRect(
+ GpGraphics * graphics,
+ GDIPCONST GpMetafile * metafile,
+ GDIPCONST RectF & destRect,
+ EnumerateMetafileProc callback,
+ VOID * callbackData,
+ GDIPCONST GpImageAttributes * imageAttributes
+ );
+
+GpStatus WINGDIPAPI
+GdipEnumerateMetafileDestRectI(
+ GpGraphics * graphics,
+ GDIPCONST GpMetafile * metafile,
+ GDIPCONST Rect & destRect,
+ EnumerateMetafileProc callback,
+ VOID * callbackData,
+ GDIPCONST GpImageAttributes * imageAttributes
+ );
+
+GpStatus WINGDIPAPI
+GdipEnumerateMetafileDestPoints(
+ GpGraphics * graphics,
+ GDIPCONST GpMetafile * metafile,
+ GDIPCONST PointF * destPoints,
+ INT count,
+ EnumerateMetafileProc callback,
+ VOID * callbackData,
+ GDIPCONST GpImageAttributes * imageAttributes
+ );
+
+GpStatus WINGDIPAPI
+GdipEnumerateMetafileDestPointsI(
+ GpGraphics * graphics,
+ GDIPCONST GpMetafile * metafile,
+ GDIPCONST Point * destPoints,
+ INT count,
+ EnumerateMetafileProc callback,
+ VOID * callbackData,
+ GDIPCONST GpImageAttributes * imageAttributes
+ );
+
+GpStatus WINGDIPAPI
+GdipEnumerateMetafileSrcRectDestPoint(
+ GpGraphics * graphics,
+ GDIPCONST GpMetafile * metafile,
+ GDIPCONST PointF & destPoint,
+ GDIPCONST RectF & srcRect,
+ Unit srcUnit,
+ EnumerateMetafileProc callback,
+ VOID * callbackData,
+ GDIPCONST GpImageAttributes * imageAttributes
+ );
+
+GpStatus WINGDIPAPI
+GdipEnumerateMetafileSrcRectDestPointI(
+ GpGraphics * graphics,
+ GDIPCONST GpMetafile * metafile,
+ GDIPCONST Point & destPoint,
+ GDIPCONST Rect & srcRect,
+ Unit srcUnit,
+ EnumerateMetafileProc callback,
+ VOID * callbackData,
+ GDIPCONST GpImageAttributes * imageAttributes
+ );
+
+GpStatus WINGDIPAPI
+GdipEnumerateMetafileSrcRectDestRect(
+ GpGraphics * graphics,
+ GDIPCONST GpMetafile * metafile,
+ GDIPCONST RectF & destRect,
+ GDIPCONST RectF & srcRect,
+ Unit srcUnit,
+ EnumerateMetafileProc callback,
+ VOID * callbackData,
+ GDIPCONST GpImageAttributes * imageAttributes
+ );
+
+GpStatus WINGDIPAPI
+GdipEnumerateMetafileSrcRectDestRectI(
+ GpGraphics * graphics,
+ GDIPCONST GpMetafile * metafile,
+ GDIPCONST Rect & destRect,
+ GDIPCONST Rect & srcRect,
+ Unit srcUnit,
+ EnumerateMetafileProc callback,
+ VOID * callbackData,
+ GDIPCONST GpImageAttributes * imageAttributes
+ );
+
+GpStatus WINGDIPAPI
+GdipEnumerateMetafileSrcRectDestPoints(
+ GpGraphics * graphics,
+ GDIPCONST GpMetafile * metafile,
+ GDIPCONST PointF * destPoints,
+ INT count,
+ GDIPCONST RectF & srcRect,
+ Unit srcUnit,
+ EnumerateMetafileProc callback,
+ VOID * callbackData,
+ GDIPCONST GpImageAttributes * imageAttributes
+ );
+
+GpStatus WINGDIPAPI
+GdipEnumerateMetafileSrcRectDestPointsI(
+ GpGraphics * graphics,
+ GDIPCONST GpMetafile * metafile,
+ GDIPCONST Point * destPoints,
+ INT count,
+ GDIPCONST Rect & srcRect,
+ Unit srcUnit,
+ EnumerateMetafileProc callback,
+ VOID * callbackData,
+ GDIPCONST GpImageAttributes * imageAttributes
+ );
+
+GpStatus WINGDIPAPI
+GdipPlayMetafileRecord(
+ GDIPCONST GpMetafile * metafile,
+ EmfPlusRecordType recordType,
+ UINT flags,
+ UINT dataSize,
+ GDIPCONST BYTE * data
+ );
+
+GpStatus WINGDIPAPI
+GdipSetClipGraphics(GpGraphics *graphics, GpGraphics *srcgraphics,
+ CombineMode combineMode);
+
+GpStatus WINGDIPAPI
+GdipSetClipRect(GpGraphics *graphics, REAL x, REAL y,
+ REAL width, REAL height, CombineMode combineMode);
+
+GpStatus WINGDIPAPI
+GdipSetClipRectI(GpGraphics *graphics, INT x, INT y,
+ INT width, INT height, CombineMode combineMode);
+
+GpStatus WINGDIPAPI
+GdipSetClipPath(GpGraphics *graphics, GpPath *path, CombineMode combineMode);
+
+GpStatus WINGDIPAPI
+GdipSetClipRegion(GpGraphics *graphics, GpRegion *region,
+ CombineMode combineMode);
+
+GpStatus WINGDIPAPI
+GdipSetClipHrgn(GpGraphics *graphics, HRGN hRgn, CombineMode combineMode);
+
+GpStatus WINGDIPAPI
+GdipResetClip(GpGraphics *graphics);
+
+GpStatus WINGDIPAPI
+GdipTranslateClip(GpGraphics *graphics, REAL dx, REAL dy);
+
+GpStatus WINGDIPAPI
+GdipTranslateClipI(GpGraphics *graphics, INT dx, INT dy);
+
+GpStatus WINGDIPAPI
+GdipGetClip(GpGraphics *graphics, GpRegion *region);
+
+GpStatus WINGDIPAPI
+GdipGetClipBounds(GpGraphics *graphics, GpRectF *rect);
+
+GpStatus WINGDIPAPI
+GdipGetClipBoundsI(GpGraphics *graphics, GpRect *rect);
+
+GpStatus WINGDIPAPI
+GdipIsClipEmpty(GpGraphics *graphics, BOOL *result);
+
+GpStatus WINGDIPAPI
+GdipGetVisibleClipBounds(GpGraphics *graphics, GpRectF *rect);
+
+GpStatus WINGDIPAPI
+GdipGetVisibleClipBoundsI(GpGraphics *graphics, GpRect *rect);
+
+GpStatus WINGDIPAPI
+GdipIsVisibleClipEmpty(GpGraphics *graphics, BOOL *result);
+
+GpStatus WINGDIPAPI
+GdipIsVisiblePoint(GpGraphics *graphics, REAL x, REAL y,
+ BOOL *result);
+
+GpStatus WINGDIPAPI
+GdipIsVisiblePointI(GpGraphics *graphics, INT x, INT y,
+ BOOL *result);
+
+GpStatus WINGDIPAPI
+GdipIsVisibleRect(GpGraphics *graphics, REAL x, REAL y,
+ REAL width, REAL height, BOOL *result);
+
+GpStatus WINGDIPAPI
+GdipIsVisibleRectI(GpGraphics *graphics, INT x, INT y,
+ INT width, INT height, BOOL *result);
+
+GpStatus WINGDIPAPI
+GdipSaveGraphics(GpGraphics *graphics, GraphicsState *state);
+
+GpStatus WINGDIPAPI
+GdipRestoreGraphics(GpGraphics *graphics, GraphicsState state);
+
+GpStatus WINGDIPAPI
+GdipBeginContainer(GpGraphics *graphics, GDIPCONST GpRectF* dstrect,
+ GDIPCONST GpRectF *srcrect, GpUnit unit, GraphicsContainer *state);
+
+GpStatus WINGDIPAPI
+GdipBeginContainerI(GpGraphics *graphics, GDIPCONST GpRect* dstrect,
+ GDIPCONST GpRect *srcrect, GpUnit unit, GraphicsContainer *state);
+
+GpStatus WINGDIPAPI
+GdipBeginContainer2(GpGraphics *graphics, GraphicsContainer* state);
+
+GpStatus WINGDIPAPI
+GdipEndContainer(GpGraphics *graphics, GraphicsContainer state);
+
+GpStatus
+GdipGetMetafileHeaderFromWmf(
+ HMETAFILE hWmf,
+ GDIPCONST APMFileHeader * apmFileHeader,
+ MetafileHeader * header
+ );
+
+GpStatus
+WINGDIPAPI
+GdipGetMetafileHeaderFromEmf(
+ HENHMETAFILE hEmf,
+ MetafileHeader * header
+ );
+
+GpStatus
+WINGDIPAPI
+GdipGetMetafileHeaderFromFile(
+ GDIPCONST WCHAR* filename,
+ MetafileHeader * header
+ );
+
+GpStatus
+WINGDIPAPI
+GdipGetMetafileHeaderFromStream(
+ IStream * stream,
+ MetafileHeader * header
+ );
+
+GpStatus
+WINGDIPAPI
+GdipGetMetafileHeaderFromMetafile(
+ GpMetafile * metafile,
+ MetafileHeader * header
+ );
+
+GpStatus
+WINGDIPAPI
+GdipGetHemfFromMetafile(
+ GpMetafile * metafile,
+ HENHMETAFILE * hEmf
+ );
+
+GpStatus WINGDIPAPI
+GdipCreateStreamOnFile(GDIPCONST WCHAR * filename, UINT access, IStream **stream);
+
+GpStatus WINGDIPAPI
+GdipCreateMetafileFromWmf(HMETAFILE hWmf, BOOL deleteWmf,
+ GDIPCONST APMFileHeader * apmFileHeader, GpMetafile **metafile);
+
+GpStatus WINGDIPAPI
+GdipCreateMetafileFromEmf(HENHMETAFILE hEmf, BOOL deleteEmf,
+ GpMetafile **metafile);
+
+GpStatus WINGDIPAPI
+GdipCreateMetafileFromFile(GDIPCONST WCHAR* file, GpMetafile **metafile);
+
+GpStatus WINGDIPAPI
+GdipCreateMetafileFromWmfFile(GDIPCONST WCHAR* file, GDIPCONST APMFileHeader * apmFileHeader, GpMetafile **metafile);
+
+GpStatus WINGDIPAPI
+GdipCreateMetafileFromStream(IStream * stream, GpMetafile **metafile);
+
+GpStatus WINGDIPAPI
+GdipRecordMetafile(
+ HDC referenceHdc,
+ EmfType type,
+ GDIPCONST GpRectF * frameRect,
+ MetafileFrameUnit frameUnit,
+ GDIPCONST WCHAR * description,
+ GpMetafile ** metafile
+ );
+
+GpStatus WINGDIPAPI
+GdipRecordMetafileI(
+ HDC referenceHdc,
+ EmfType type,
+ GDIPCONST GpRect * frameRect,
+ MetafileFrameUnit frameUnit,
+ GDIPCONST WCHAR * description,
+ GpMetafile ** metafile
+ );
+
+GpStatus WINGDIPAPI
+GdipRecordMetafileFileName(
+ GDIPCONST WCHAR* fileName,
+ HDC referenceHdc,
+ EmfType type,
+ GDIPCONST GpRectF * frameRect,
+ MetafileFrameUnit frameUnit,
+ GDIPCONST WCHAR * description,
+ GpMetafile ** metafile
+ );
+
+GpStatus WINGDIPAPI
+GdipRecordMetafileFileNameI(
+ GDIPCONST WCHAR* fileName,
+ HDC referenceHdc,
+ EmfType type,
+ GDIPCONST GpRect * frameRect,
+ MetafileFrameUnit frameUnit,
+ GDIPCONST WCHAR * description,
+ GpMetafile ** metafile
+ );
+
+GpStatus WINGDIPAPI
+GdipRecordMetafileStream(
+ IStream * stream,
+ HDC referenceHdc,
+ EmfType type,
+ GDIPCONST GpRectF * frameRect,
+ MetafileFrameUnit frameUnit,
+ GDIPCONST WCHAR * description,
+ GpMetafile ** metafile
+ );
+
+GpStatus WINGDIPAPI
+GdipRecordMetafileStreamI(
+ IStream * stream,
+ HDC referenceHdc,
+ EmfType type,
+ GDIPCONST GpRect * frameRect,
+ MetafileFrameUnit frameUnit,
+ GDIPCONST WCHAR * description,
+ GpMetafile ** metafile
+ );
+
+GpStatus WINGDIPAPI
+GdipSetMetafileDownLevelRasterizationLimit(
+ GpMetafile * metafile,
+ UINT metafileRasterizationLimitDpi
+ );
+
+GpStatus WINGDIPAPI
+GdipGetMetafileDownLevelRasterizationLimit(
+ GDIPCONST GpMetafile * metafile,
+ UINT * metafileRasterizationLimitDpi
+ );
+
+GpStatus WINGDIPAPI
+GdipGetImageDecodersSize(UINT *numDecoders, UINT *size);
+
+GpStatus WINGDIPAPI
+GdipGetImageDecoders(UINT numDecoders,
+ UINT size,
+ ImageCodecInfo *decoders);
+
+GpStatus WINGDIPAPI
+GdipGetImageEncodersSize(UINT *numEncoders, UINT *size);
+
+GpStatus WINGDIPAPI
+GdipGetImageEncoders(UINT numEncoders,
+ UINT size,
+ ImageCodecInfo *encoders);
+
+GpStatus WINGDIPAPI
+GdipAddImageCodec(GDIPCONST ImageCodecInfo *codec);
+
+GpStatus WINGDIPAPI
+GdipRemoveImageCodec(GDIPCONST ImageCodecInfo *codec);
+
+#ifndef DCR_USE_NEW_186091
+GpStatus WINGDIPAPI
+GdipGetGraphicsPixel(GpGraphics* graphics, REAL x, REAL y, ARGB* argb);
+#endif
+
+GpStatus WINGDIPAPI
+GdipComment(GpGraphics* graphics, UINT sizeData, GDIPCONST BYTE * data);
+
+GpStatus WINGDIPAPI
+GdipGetGraphicsLayout(GpGraphics* graphics, GraphicsLayout* layout);
+
+GpStatus WINGDIPAPI
+GdipSetGraphicsLayout(GpGraphics* graphics, GDIPCONST GraphicsLayout layout);
+
+//----------------------------------------------------------------------------
+// FontFamily
+//----------------------------------------------------------------------------
+
+GpStatus WINGDIPAPI
+GdipCreateFontFamilyFromName(GDIPCONST WCHAR *name,
+ GpFontCollection *fontCollection,
+ GpFontFamily **FontFamily);
+
+GpStatus WINGDIPAPI
+GdipDeleteFontFamily(GpFontFamily *FontFamily);
+
+GpStatus WINGDIPAPI
+GdipCloneFontFamily(GpFontFamily *FontFamily, GpFontFamily **clonedFontFamily);
+
+GpStatus WINGDIPAPI
+GdipGetGenericFontFamilySansSerif(GpFontFamily **nativeFamily);
+
+GpStatus WINGDIPAPI
+GdipGetGenericFontFamilySerif(GpFontFamily **nativeFamily);
+
+GpStatus WINGDIPAPI
+GdipGetGenericFontFamilyMonospace(GpFontFamily **nativeFamily);
+
+
+GpStatus WINGDIPAPI
+GdipGetFamilyName(
+ GDIPCONST GpFontFamily *family,
+ WCHAR name[LF_FACESIZE],
+ LANGID language
+);
+
+GpStatus WINGDIPAPI
+GdipIsStyleAvailable(GDIPCONST GpFontFamily *family, INT style, BOOL * IsStyleAvailable);
+
+GpStatus WINGDIPAPI
+GdipFontCollectionEnumerable(
+ GpFontCollection* fontCollection,
+ GpGraphics* graphics,
+ INT * numFound
+);
+
+GpStatus WINGDIPAPI GdipFontCollectionEnumerate(
+ GpFontCollection* fontCollection,
+ INT numSought,
+ GpFontFamily* gpfamilies[],
+ INT* numFound,
+ GpGraphics* graphics
+);
+
+//-----------------------------------
+// New API
+//-----------------------------------
+
+GpStatus WINGDIPAPI
+GdipGetEmHeight(GDIPCONST GpFontFamily *family, INT style, UINT16 * EmHeight);
+
+GpStatus WINGDIPAPI
+GdipGetCellAscent(GDIPCONST GpFontFamily *family, INT style, UINT16 * CellAscent);
+
+GpStatus WINGDIPAPI
+GdipGetCellDescent(GDIPCONST GpFontFamily *family, INT style, UINT16 * CellDescent);
+
+GpStatus WINGDIPAPI
+GdipGetLineSpacing(GDIPCONST GpFontFamily *family, INT style, UINT16 * LineSpacing);
+
+
+//----------------------------------------------------------------------------
+// Font
+//----------------------------------------------------------------------------
+
+GpStatus WINGDIPAPI
+GdipCreateFontFromDC(
+ HDC hdc,
+ GpFont **font
+);
+
+GpStatus WINGDIPAPI
+GdipCreateFontFromLogfontA(
+ HDC hdc,
+ GDIPCONST LOGFONTA *logfont,
+ GpFont **font
+);
+
+GpStatus WINGDIPAPI
+GdipCreateFontFromLogfontW(
+ HDC hdc,
+ GDIPCONST LOGFONTW *logfont,
+ GpFont **font
+);
+
+GpStatus WINGDIPAPI
+GdipCreateFont(
+ GDIPCONST GpFontFamily *fontFamily,
+ REAL emSize,
+ INT style,
+ Unit unit,
+ GpFont **font
+);
+
+GpStatus WINGDIPAPI
+GdipCloneFont(GpFont* font, GpFont** cloneFont);
+
+GpStatus WINGDIPAPI
+GdipDeleteFont(GpFont* font);
+
+GpStatus WINGDIPAPI
+GdipGetFamily(GpFont *font, GpFontFamily **family);
+
+GpStatus WINGDIPAPI
+GdipGetFontStyle(GpFont *font, INT *style);
+
+GpStatus WINGDIPAPI
+GdipGetFontSize(GpFont *font, REAL *size);
+
+GpStatus WINGDIPAPI
+GdipGetFontUnit(GpFont *font, Unit *unit);
+
+GpStatus WINGDIPAPI
+GdipGetFontHeight(GDIPCONST GpFont *font, GDIPCONST GpGraphics *graphics, REAL *height);
+
+#ifdef DCR_USE_NEW_125467
+GpStatus WINGDIPAPI
+GdipGetFontHeightGivenDPI(GDIPCONST GpFont *font, REAL dpi, REAL *height);
+#endif
+
+GpStatus WINGDIPAPI
+GdipGetLogFontA(GpFont * font, GpGraphics *graphics, LOGFONTA * logfontA);
+
+GpStatus WINGDIPAPI
+GdipGetLogFontW(GpFont * font, GpGraphics *graphics, LOGFONTW * logfontW);
+
+// FontCollection
+
+GpStatus WINGDIPAPI
+GdipNewInstalledFontCollection(GpFontCollection** fontCollection);
+
+GpStatus WINGDIPAPI
+GdipNewPrivateFontCollection(GpFontCollection** fontCollection);
+
+GpStatus WINGDIPAPI
+GdipDeletePrivateFontCollection(GpFontCollection** fontCollection);
+
+GpStatus WINGDIPAPI
+GdipGetFontCollectionFamilyCount(
+ GpFontCollection* fontCollection,
+ INT * numFound
+);
+
+GpStatus WINGDIPAPI
+GdipGetFontCollectionFamilyList(
+ GpFontCollection* fontCollection,
+ INT numSought,
+ GpFontFamily* gpfamilies[],
+ INT* numFound
+);
+
+#ifndef DCR_USE_NEW_235072
+GpStatus WINGDIPAPI
+GdipInstallFontFile(
+ GpFontCollection* fontCollection,
+ GDIPCONST WCHAR* filename
+);
+
+GpStatus WINGDIPAPI
+GdipUninstallFontFile(
+ GpFontCollection* fontCollection,
+ GDIPCONST WCHAR* filename
+);
+#endif
+
+GpStatus WINGDIPAPI
+GdipPrivateAddFontFile(
+ GpFontCollection* fontCollection,
+ GDIPCONST WCHAR* filename
+);
+
+GpStatus WINGDIPAPI
+GdipPrivateAddMemoryFont(
+ GpFontCollection* fontCollection,
+ GDIPCONST void* memory,
+ INT length
+);
+
+//----------------------------------------------------------------------------
+// Text
+//----------------------------------------------------------------------------
+
+GpStatus WINGDIPAPI
+GdipDrawString(
+ GpGraphics *graphics,
+ GDIPCONST WCHAR *string,
+ INT length,
+ GDIPCONST GpFont *font,
+ GDIPCONST RectF *layoutRect,
+ GDIPCONST GpStringFormat *stringFormat,
+ GDIPCONST GpBrush *brush
+);
+
+GpStatus WINGDIPAPI
+GdipMeasureString(
+ GpGraphics *graphics,
+ GDIPCONST WCHAR *string,
+ INT length,
+ GDIPCONST GpFont *font,
+ GDIPCONST RectF *layoutRect,
+ GDIPCONST GpStringFormat *stringFormat,
+ RectF *boundingBox,
+ INT *codepointsFitted,
+ INT *linesFilled
+);
+
+#ifndef DCR_USE_NEW_174340
+GpStatus WINGDIPAPI
+GdipMeasureStringRegion(
+ GpGraphics *graphics,
+ GDIPCONST WCHAR *string,
+ INT length,
+ GDIPCONST GpFont *font,
+ GDIPCONST RectF &layoutRect,
+ GDIPCONST GpStringFormat *stringFormat,
+ INT firstCharacterIndex,
+ INT characterCount,
+ GpRegion *region
+);
+#endif
+
+#ifdef DCR_USE_NEW_174340
+GpStatus
+WINGDIPAPI
+GdipMeasureCharacterRanges(
+ GpGraphics *graphics,
+ GDIPCONST WCHAR *string,
+ INT length,
+ GDIPCONST GpFont *font,
+ GDIPCONST RectF &layoutRect,
+ GDIPCONST GpStringFormat *stringFormat,
+ INT regionCount,
+ GpRegion **regions
+);
+#endif
+
+GpStatus WINGDIPAPI
+GdipDrawDriverString(
+ GpGraphics *graphics,
+ GDIPCONST UINT16 *text,
+ INT length,
+ GDIPCONST GpFont *font,
+ GDIPCONST GpBrush *brush,
+ GDIPCONST PointF *positions,
+ INT flags,
+ GDIPCONST GpMatrix *matrix
+);
+
+GpStatus WINGDIPAPI
+GdipMeasureDriverString(
+ GpGraphics *graphics,
+ GDIPCONST UINT16 *text,
+ INT length,
+ GDIPCONST GpFont *font,
+ GDIPCONST PointF *positions,
+ INT flags,
+ GDIPCONST GpMatrix *matrix,
+ RectF *boundingBox
+);
+
+#ifndef DCR_USE_NEW_168772
+GpStatus WINGDIPAPI
+GdipDriverStringPointToCodepoint(
+ GpGraphics *graphics,
+ GDIPCONST UINT16 *text,
+ INT length,
+ GDIPCONST GpFont *font,
+ GDIPCONST PointF *positions,
+ INT flags,
+ GpMatrix *matrix,
+ GDIPCONST PointF *hit,
+ INT *index,
+ BOOL *rightEdge,
+ REAL *distance
+);
+#endif
+
+//----------------------------------------------------------------------------
+// String format APIs
+//----------------------------------------------------------------------------
+
+GpStatus WINGDIPAPI
+GdipCreateStringFormat(
+ INT formatAttributes,
+ LANGID language,
+ GpStringFormat **format
+);
+
+GpStatus WINGDIPAPI
+GdipStringFormatGetGenericDefault(GpStringFormat **format);
+
+GpStatus WINGDIPAPI
+GdipStringFormatGetGenericTypographic(GpStringFormat **format);
+
+GpStatus WINGDIPAPI
+GdipDeleteStringFormat(GpStringFormat *format);
+
+GpStatus WINGDIPAPI
+GdipCloneStringFormat(GDIPCONST GpStringFormat *format, GpStringFormat **newFormat);
+
+GpStatus WINGDIPAPI
+GdipSetStringFormatFlags(GpStringFormat *format, INT flags);
+
+GpStatus WINGDIPAPI GdipGetStringFormatFlags(GDIPCONST GpStringFormat *format, INT *flags);
+
+#ifndef DCR_USE_NEW_152154
+GpStatus WINGDIPAPI
+GdipSetStringFormatLineSpacing(GpStringFormat *format, REAL amount,
+ LineSpacing method);
+
+GpStatus WINGDIPAPI
+GdipGetStringFormatLineSpacingAmount(GDIPCONST GpStringFormat *format, REAL *amount);
+GpStatus WINGDIPAPI
+GdipGetStringFormatLineSpacingMethod(GDIPCONST GpStringFormat *format, LineSpacing *method);
+#endif
+
+GpStatus WINGDIPAPI
+GdipSetStringFormatAlign(GpStringFormat *format, StringAlignment align);
+
+GpStatus WINGDIPAPI
+GdipGetStringFormatAlign(GDIPCONST GpStringFormat *format, StringAlignment *align);
+
+GpStatus WINGDIPAPI
+GdipSetStringFormatLineAlign(GpStringFormat *format,
+ StringAlignment align);
+
+GpStatus WINGDIPAPI
+GdipGetStringFormatLineAlign(GDIPCONST GpStringFormat *format,
+ StringAlignment *align);
+
+GpStatus WINGDIPAPI
+GdipSetStringFormatTrimming(
+ GpStringFormat *format,
+ StringTrimming trimming
+);
+
+GpStatus WINGDIPAPI
+GdipGetStringFormatTrimming(
+ GDIPCONST GpStringFormat *format,
+ StringTrimming *trimming
+);
+
+GpStatus WINGDIPAPI
+GdipSetStringFormatHotkeyPrefix(GpStringFormat *format, INT hotkeyPrefix);
+
+GpStatus WINGDIPAPI
+GdipGetStringFormatHotkeyPrefix(GDIPCONST GpStringFormat *format, INT *hotkeyPrefix);
+
+GpStatus WINGDIPAPI
+GdipSetStringFormatTabStops(GpStringFormat *format, REAL firstTabOffset, INT count, GDIPCONST REAL *tabStops);
+
+GpStatus WINGDIPAPI
+GdipGetStringFormatTabStops(GDIPCONST GpStringFormat *format, INT count, REAL *firstTabOffset, REAL *tabStops);
+
+GpStatus WINGDIPAPI
+GdipGetStringFormatTabStopCount(GDIPCONST GpStringFormat *format, INT * count);
+
+#ifdef DCR_USE_NEW_146933
+GpStatus WINGDIPAPI
+GdipSetStringFormatDigitSubstitution(GpStringFormat *format, LANGID language,
+ StringDigitSubstitute substitute);
+
+GpStatus WINGDIPAPI
+GdipGetStringFormatDigitSubstitution(GDIPCONST GpStringFormat *format, LANGID *language,
+ StringDigitSubstitute *substitute);
+#endif // DCR_USE_NEW_146933
+
+#ifdef DCR_USE_NEW_174340
+GpStatus WINGDIPAPI
+GdipGetStringFormatMeasurableCharacterRangeCount(
+ GDIPCONST GpStringFormat *format,
+ INT *count
+);
+
+GpStatus WINGDIPAPI
+GdipSetStringFormatMeasurableCharacterRanges(
+ GpStringFormat *format,
+ INT rangeCount,
+ GDIPCONST CharacterRange *ranges
+);
+#endif
+
+//----------------------------------------------------------------------------
+// Cached Bitmap APIs
+//----------------------------------------------------------------------------
+
+GpStatus WINGDIPAPI
+GdipCreateCachedBitmap(
+ GpBitmap *bitmap,
+ GpGraphics *graphics,
+ GpCachedBitmap **cachedBitmap
+);
+
+GpStatus WINGDIPAPI
+GdipDeleteCachedBitmap(GpCachedBitmap *cachedBitmap);
+
+GpStatus WINGDIPAPI
+GdipDrawCachedBitmap(
+ GpGraphics *graphics,
+ GpCachedBitmap *cachedBitmap,
+ INT x,
+ INT y
+);
+
+UINT WINGDIPAPI
+GdipEmfToWmfBits(
+ HENHMETAFILE hemf,
+ UINT cbData16,
+ LPBYTE pData16,
+ INT iMapMode,
+ INT eFlags
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // !_FLATAPI_H
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusFont.h b/core/src/fxge/Microsoft SDK/include/GdiPlusFont.h
new file mode 100644
index 0000000000..c9ff050561
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusFont.h
@@ -0,0 +1,299 @@
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusFont.h
+*
+* Abstract:
+*
+* Font related declarations
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUSFONT_H
+#define _GDIPLUSFONT_H
+
+inline
+Font::Font(IN HDC hdc)
+{
+ GpFont *font = NULL;
+ lastResult = DllExports::GdipCreateFontFromDC(hdc, &font);
+
+#ifndef DCR_USE_NEW_135429
+ if ((INT) lastResult >= 10)
+ lastResult = NotFound;
+#endif
+
+ SetNativeFont(font);
+}
+
+#ifdef DCR_USE_NEW_127084
+inline
+Font::Font(IN HDC hdc,
+ IN const HFONT hfont)
+{
+ GpFont *font = NULL;
+
+ if (hfont)
+ {
+ LOGFONTA lf;
+
+ if(GetObjectA(hfont, sizeof(LOGFONTA), &lf))
+ lastResult = DllExports::GdipCreateFontFromLogfontA(hdc, &lf, &font);
+ else
+ lastResult = DllExports::GdipCreateFontFromDC(hdc, &font);
+ }
+ else
+ {
+ lastResult = DllExports::GdipCreateFontFromDC(hdc, &font);
+ }
+
+#ifndef DCR_USE_NEW_135429
+ if ((INT) lastResult >= 10)
+ lastResult = NotFound;
+#endif
+
+ SetNativeFont(font);
+}
+#endif
+
+inline
+Font::Font(IN HDC hdc,
+ IN const LOGFONTW* logfont)
+{
+ GpFont *font = NULL;
+ if (logfont)
+ {
+ lastResult = DllExports::GdipCreateFontFromLogfontW(hdc, logfont, &font);
+ }
+ else
+ {
+ lastResult = DllExports::GdipCreateFontFromDC(hdc, &font);
+ }
+
+#ifndef DCR_USE_NEW_135429
+ if ((INT) lastResult >= 10)
+ lastResult = NotFound;
+#endif
+
+ SetNativeFont(font);
+}
+
+inline
+Font::Font(IN HDC hdc,
+ IN const LOGFONTA* logfont)
+{
+ GpFont *font = NULL;
+
+ if (logfont)
+ {
+ lastResult = DllExports::GdipCreateFontFromLogfontA(hdc, logfont, &font);
+ }
+ else
+ {
+ lastResult = DllExports::GdipCreateFontFromDC(hdc, &font);
+ }
+
+#ifndef DCR_USE_NEW_135429
+ if ((INT) lastResult >= 10)
+ lastResult = NotFound;
+#endif
+
+ SetNativeFont(font);
+}
+
+inline
+Font::Font(
+ IN const FontFamily * family,
+ IN REAL emSize,
+ IN INT style,
+ IN Unit unit
+)
+{
+ GpFont *font = NULL;
+
+ lastResult = DllExports::GdipCreateFont(family ? family->nativeFamily : NULL,
+ emSize,
+ style,
+ unit,
+ &font);
+
+#ifndef DCR_USE_NEW_135429
+ if ((INT) lastResult >= 10)
+ lastResult = NotFound;
+#endif
+
+ SetNativeFont(font);
+}
+
+inline
+Font::Font(
+ IN const WCHAR * familyName,
+ IN REAL emSize,
+ IN INT style,
+ IN Unit unit,
+ IN const FontCollection * fontCollection
+)
+{
+ FontFamily family(familyName, fontCollection);
+
+ GpFont * font = NULL;
+
+ lastResult = family.GetLastStatus();
+
+ if (lastResult == Ok)
+ {
+ lastResult = DllExports::GdipCreateFont(family.nativeFamily,
+ emSize,
+ style,
+ unit,
+ &font);
+ }
+
+#ifndef DCR_USE_NEW_135429
+ if ((INT) lastResult >= 10)
+ lastResult = NotFound;
+#endif
+
+ SetNativeFont(font);
+}
+
+inline Status
+Font::GetLogFontA(IN const Graphics *g,
+ OUT LOGFONTA *logfontA) const
+{
+ return SetStatus(DllExports::GdipGetLogFontA(nativeFont, g ? g->nativeGraphics : NULL, logfontA));
+
+}
+
+inline Status
+Font::GetLogFontW(IN const Graphics *g,
+ OUT LOGFONTW *logfontW) const
+{
+ return SetStatus(DllExports::GdipGetLogFontW(nativeFont, g ? g->nativeGraphics : NULL, logfontW));
+}
+
+
+inline Font*
+Font::Clone() const
+{
+ GpFont *cloneFont = NULL;
+
+ SetStatus(DllExports::GdipCloneFont(nativeFont, &cloneFont));
+
+ return new Font(cloneFont, lastResult);
+}
+
+inline
+Font::~Font()
+{
+ DllExports::GdipDeleteFont(nativeFont);
+}
+
+// Operations
+
+inline BOOL
+Font::IsAvailable() const
+{
+ return (nativeFont ? TRUE : FALSE);
+}
+
+inline Status
+Font::GetFamily(OUT FontFamily *family) const
+{
+ if (family == NULL)
+ {
+ return SetStatus(InvalidParameter);
+ }
+
+ Status status = DllExports::GdipGetFamily(nativeFont, &(family->nativeFamily));
+ family->SetStatus(status);
+
+ return SetStatus(status);
+}
+
+inline INT
+Font::GetStyle() const
+{
+ INT style;
+
+ SetStatus(DllExports::GdipGetFontStyle(nativeFont, &style));
+
+ return style;
+}
+
+inline REAL
+Font::GetSize() const
+{
+ REAL size;
+ SetStatus(DllExports::GdipGetFontSize(nativeFont, &size));
+ return size;
+}
+
+inline Unit
+Font::GetUnit() const
+{
+ Unit unit;
+ SetStatus(DllExports::GdipGetFontUnit(nativeFont, &unit));
+ return unit;
+}
+
+inline REAL
+Font::GetHeight(IN const Graphics *graphics) const
+{
+ REAL height;
+ SetStatus(DllExports::GdipGetFontHeight(
+ nativeFont,
+ graphics ? graphics->nativeGraphics : NULL,
+ &height
+ ));
+ return height;
+}
+
+
+#ifdef DCR_USE_NEW_125467
+inline REAL
+Font::GetHeight(IN REAL dpi = 0) const
+{
+ REAL height;
+ SetStatus(DllExports::GdipGetFontHeightGivenDPI(nativeFont, dpi, &height));
+ return height;
+}
+#endif
+
+
+// protected method
+inline
+Font::Font(IN GpFont* font,
+ IN Status status)
+{
+ lastResult = status;
+ SetNativeFont(font);
+}
+
+// protected method
+inline VOID
+Font::SetNativeFont(GpFont *Font)
+{
+ nativeFont = Font;
+}
+
+inline Status
+Font::GetLastStatus(void) const
+{
+ return lastResult;
+}
+
+// protected method
+inline Status
+Font::SetStatus(IN Status status) const
+{
+ if (status != Ok)
+ return (lastResult = status);
+ else
+ return status;
+}
+
+#endif
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusFontCollection.h b/core/src/fxge/Microsoft SDK/include/GdiPlusFontCollection.h
new file mode 100644
index 0000000000..d2257ba456
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusFontCollection.h
@@ -0,0 +1,149 @@
+/**************************************************************************\
+*
+* Copyright (c) 2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusFontCollection.h
+*
+* Abstract:
+*
+* Font collections (Installed and Private)
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUSFONTCOLL_H
+#define _GDIPLUSFONTCOLL_H
+
+inline
+FontCollection::FontCollection()
+{
+ nativeFontCollection = NULL;
+}
+
+inline
+FontCollection::~FontCollection()
+{
+}
+
+inline INT
+FontCollection::GetFamilyCount() const
+{
+ INT numFound = 0;
+
+ lastResult = DllExports::GdipGetFontCollectionFamilyCount(
+ nativeFontCollection, &numFound);
+
+
+
+ return numFound;
+}
+
+inline Status
+FontCollection::GetFamilies(
+ IN INT numSought,
+ OUT FontFamily * gpfamilies,
+ OUT INT * numFound
+) const
+{
+ if (numSought <= 0 || gpfamilies == NULL || numFound == NULL)
+ {
+ return SetStatus(InvalidParameter);
+ }
+ *numFound = 0;
+ GpFontFamily **nativeFamilyList = new GpFontFamily*[numSought];
+
+ if (nativeFamilyList == NULL)
+ {
+ return SetStatus(OutOfMemory);
+ }
+
+ Status status = SetStatus(DllExports::GdipGetFontCollectionFamilyList(
+ nativeFontCollection,
+ numSought,
+ nativeFamilyList,
+ numFound
+ ));
+ if (status == Ok)
+ {
+ for (INT i = 0; i < *numFound; i++)
+ {
+ DllExports::GdipCloneFontFamily(nativeFamilyList[i],
+ &gpfamilies[i].nativeFamily);
+ }
+ }
+
+ delete [] nativeFamilyList;
+
+ return status;
+}
+
+inline Status FontCollection::GetLastStatus () const
+{
+ return lastResult;
+}
+
+// protected method
+inline Status
+FontCollection::SetStatus(IN Status status) const
+{
+ lastResult = status;
+ return lastResult;
+}
+
+inline
+InstalledFontCollection::InstalledFontCollection()
+{
+ nativeFontCollection = NULL;
+ lastResult = DllExports::GdipNewInstalledFontCollection(&nativeFontCollection);
+}
+
+inline
+InstalledFontCollection::~InstalledFontCollection()
+{
+}
+
+#ifndef DCR_USE_NEW_235072
+inline Status
+InstalledFontCollection::InstallFontFile(IN const WCHAR* filename)
+{
+ return SetStatus(DllExports::GdipInstallFontFile(nativeFontCollection, filename));
+}
+
+inline Status
+InstalledFontCollection::UninstallFontFile(IN const WCHAR* filename)
+{
+ return SetStatus(DllExports::GdipUninstallFontFile(nativeFontCollection, filename));
+}
+#endif
+
+inline
+PrivateFontCollection::PrivateFontCollection()
+{
+ nativeFontCollection = NULL;
+ lastResult = DllExports::GdipNewPrivateFontCollection(&nativeFontCollection);
+}
+
+inline
+PrivateFontCollection::~PrivateFontCollection()
+{
+ DllExports::GdipDeletePrivateFontCollection(&nativeFontCollection);
+}
+
+inline Status
+PrivateFontCollection::AddFontFile(IN const WCHAR* filename)
+{
+ return SetStatus(DllExports::GdipPrivateAddFontFile(nativeFontCollection, filename));
+}
+
+inline Status
+PrivateFontCollection::AddMemoryFont(IN const void* memory,
+ IN INT length)
+{
+ return SetStatus(DllExports::GdipPrivateAddMemoryFont(
+ nativeFontCollection,
+ memory,
+ length));
+}
+
+#endif // _GDIPLUSFONTCOLL_H
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusFontFamily.h b/core/src/fxge/Microsoft SDK/include/GdiPlusFontFamily.h
new file mode 100644
index 0000000000..ef2f3dde9b
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusFontFamily.h
@@ -0,0 +1,271 @@
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusFontFamily.h
+*
+* Abstract:
+*
+* Font family API related declarations
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUS_FONT_FAMILY_H
+#define _GDIPLUS_FONT_FAMILY_H
+
+inline
+FontFamily::FontFamily() :
+ nativeFamily (NULL),
+ lastResult (Ok)
+{
+}
+
+inline
+FontFamily::FontFamily(
+ IN const WCHAR* name,
+ IN const FontCollection* fontCollection
+)
+{
+ nativeFamily = NULL;
+ lastResult = DllExports::GdipCreateFontFamilyFromName(
+ name,
+ fontCollection ? fontCollection->nativeFontCollection : NULL,
+ &nativeFamily
+ );
+
+#ifndef DCR_USE_NEW_135429
+ if ((INT) lastResult >= 10)
+ lastResult = NotFound;
+#endif
+}
+
+// private method
+inline
+FontFamily::FontFamily(
+ IN GpFontFamily *nativeOrig,
+ IN Status status
+)
+{
+ lastResult = status;
+ nativeFamily = nativeOrig;
+}
+
+// Generic font family access
+
+inline const FontFamily *
+FontFamily::GenericSansSerif()
+{
+ if (GenericSansSerifFontFamily != NULL)
+ {
+ return GenericSansSerifFontFamily;
+ }
+
+ GenericSansSerifFontFamily =
+ (FontFamily*) GenericSansSerifFontFamilyBuffer;
+
+ GenericSansSerifFontFamily->lastResult =
+ DllExports::GdipGetGenericFontFamilySansSerif(
+ &(GenericSansSerifFontFamily->nativeFamily)
+ );
+
+#ifndef DCR_USE_NEW_135429
+ if ((INT) GenericSansSerifFontFamily->lastResult >= 10)
+ GenericSansSerifFontFamily->lastResult = NotFound;
+#endif
+
+ return GenericSansSerifFontFamily;
+}
+
+inline const FontFamily *
+FontFamily::GenericSerif()
+{
+ if (GenericSerifFontFamily != NULL)
+ {
+ return GenericSerifFontFamily;
+ }
+
+ GenericSerifFontFamily =
+ (FontFamily*) GenericSerifFontFamilyBuffer;
+
+ GenericSerifFontFamily->lastResult =
+ DllExports::GdipGetGenericFontFamilySerif(
+ &(GenericSerifFontFamily->nativeFamily)
+ );
+
+#ifndef DCR_USE_NEW_135429
+ if ((INT) GenericSerifFontFamily->lastResult >= 10)
+ GenericSerifFontFamily->lastResult = NotFound;
+#endif
+
+ return GenericSerifFontFamily;
+}
+
+inline const FontFamily *
+FontFamily::GenericMonospace()
+{
+ if (GenericMonospaceFontFamily != NULL)
+ {
+ return GenericMonospaceFontFamily;
+ }
+
+ GenericMonospaceFontFamily =
+ (FontFamily*) GenericMonospaceFontFamilyBuffer;
+
+ GenericMonospaceFontFamily->lastResult =
+ DllExports::GdipGetGenericFontFamilyMonospace(
+ &(GenericMonospaceFontFamily->nativeFamily)
+ );
+
+#ifndef DCR_USE_NEW_135429
+ if ((INT) GenericMonospaceFontFamily->lastResult >= 10)
+ GenericMonospaceFontFamily->lastResult = NotFound;
+#endif
+
+ return GenericMonospaceFontFamily;
+}
+
+inline FontFamily::~FontFamily()
+{
+ DllExports::GdipDeleteFontFamily (nativeFamily);
+}
+
+inline FontFamily *
+FontFamily::Clone() const
+{
+ GpFontFamily * clonedFamily = NULL;
+
+ SetStatus(DllExports::GdipCloneFontFamily (nativeFamily, &clonedFamily));
+
+ return new FontFamily(clonedFamily, lastResult);
+}
+
+inline Status
+FontFamily::GetFamilyName(
+ IN WCHAR name[LF_FACESIZE],
+ IN LANGID language
+) const
+{
+ return SetStatus(DllExports::GdipGetFamilyName(nativeFamily,
+ name,
+ language));
+}
+
+inline BOOL
+FontFamily::IsStyleAvailable(IN INT style) const
+{
+ BOOL StyleAvailable;
+ Status status;
+
+ status = SetStatus(DllExports::GdipIsStyleAvailable(nativeFamily, style, &StyleAvailable));
+
+ if (status != Ok)
+ StyleAvailable = FALSE;
+
+ return StyleAvailable;
+}
+
+
+inline UINT16
+FontFamily::GetEmHeight(IN INT style) const
+{
+ UINT16 EmHeight;
+
+ SetStatus(DllExports::GdipGetEmHeight(nativeFamily, style, &EmHeight));
+
+ return EmHeight;
+}
+
+inline UINT16
+FontFamily::GetCellAscent(IN INT style) const
+{
+ UINT16 CellAscent;
+
+ SetStatus(DllExports::GdipGetCellAscent(nativeFamily, style, &CellAscent));
+
+ return CellAscent;
+}
+
+inline UINT16
+FontFamily::GetCellDescent(IN INT style) const
+{
+ UINT16 CellDescent;
+
+ SetStatus(DllExports::GdipGetCellDescent(nativeFamily, style, &CellDescent));
+
+ return CellDescent;
+}
+
+
+inline UINT16
+FontFamily::GetLineSpacing(IN INT style) const
+{
+ UINT16 LineSpacing;
+
+ SetStatus(DllExports::GdipGetLineSpacing(nativeFamily, style, &LineSpacing));
+
+ return LineSpacing;
+
+}
+
+#ifdef TEXTV2
+
+// The following APIs return data from the font OS/2 table
+
+inline INT16
+FontFamily::GetTypographicAscent(IN INT style) const
+{
+ INT16 TypographicAscent;
+
+ SetStatus(DllExports::GdipGetTypographicAscent(nativeFamily, style, &TypographicAscent));
+
+ return TypographicAscent;
+}
+
+inline INT16
+FontFamily::GetTypographicDescent(IN INT style) const
+{
+ INT16 TypographicDescent;
+
+ SetStatus(DllExports::GdipGetTypographicDescent(nativeFamily, style, &TypographicDescent));
+
+ return TypographicDescent;
+}
+
+inline INT16
+FontFamily::GetTypographicLineGap(IN INT style) const
+{
+ INT16 TypographicLineGap;
+
+ SetStatus(DllExports::GdipGetTypographicLineGap(nativeFamily, style, &TypographicLineGap));
+
+ return TypographicLineGap;
+}
+
+#endif
+
+///////////////////////////////////////////////////////////
+
+// GetLastStatus - return last error code and clear error code
+
+inline Status
+FontFamily::GetLastStatus() const
+{
+ Status lastStatus = lastResult;
+ lastResult = Ok;
+
+ return lastStatus;
+}
+
+// protected method
+inline Status
+FontFamily::SetStatus(Status status) const
+{
+ if (status != Ok)
+ return (lastResult = status);
+ else
+ return status;
+}
+
+#endif
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusGpStubs.h b/core/src/fxge/Microsoft SDK/include/GdiPlusGpStubs.h
new file mode 100644
index 0000000000..121288de57
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusGpStubs.h
@@ -0,0 +1,107 @@
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusGpStubs.h
+*
+* Abstract:
+*
+* GDI+ Native C++ public header file
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUSGPSTUBS_H
+#define _GDIPLUSGPSTUBS_H
+
+//---------------------------------------------------------------------------
+// GDI+ classes for forward reference
+//---------------------------------------------------------------------------
+
+class Graphics;
+class Pen;
+class Brush;
+class Matrix;
+class Bitmap;
+class Metafile;
+class GraphicsPath;
+class PathIterator;
+class Region;
+class Image;
+class TextureBrush;
+class HatchBrush;
+class SolidBrush;
+class LinearGradientBrush;
+class PathGradientBrush;
+class Font;
+class FontFamily;
+class FontCollection;
+class InstalledFontCollection;
+class PrivateFontCollection;
+class ImageAttributes;
+class CachedBitmap;
+
+//---------------------------------------------------------------------------
+// Internal GDI+ classes for internal type checking
+//---------------------------------------------------------------------------
+class GpGraphics {};
+
+class GpBrush {};
+class GpTexture : public GpBrush {};
+class GpSolidFill : public GpBrush {};
+class GpLineGradient : public GpBrush {};
+class GpPathGradient : public GpBrush {};
+class GpHatch : public GpBrush {};
+
+class GpPen {};
+class GpCustomLineCap {};
+class GpAdjustableArrowCap : public GpCustomLineCap {};
+
+class GpImage {};
+class GpBitmap : public GpImage {};
+class GpMetafile : public GpImage {};
+class GpImageAttributes {};
+
+class GpPath {};
+class GpRegion {};
+class GpPathIterator {};
+
+class GpFontFamily {};
+class GpFont {};
+class GpStringFormat {};
+class GpFontCollection {};
+class GpInstalledFontCollection : public GpFontCollection {};
+class GpPrivateFontCollection : public GpFontCollection {};
+
+class GpCachedBitmap;
+
+typedef Status GpStatus;
+typedef FillMode GpFillMode;
+typedef WrapMode GpWrapMode;
+typedef Unit GpUnit;
+typedef CoordinateSpace GpCoordinateSpace;
+typedef PointF GpPointF;
+typedef Point GpPoint;
+typedef RectF GpRectF;
+typedef Rect GpRect;
+typedef SizeF GpSizeF;
+typedef HatchStyle GpHatchStyle;
+typedef DashStyle GpDashStyle;
+typedef LineCap GpLineCap;
+typedef DashCap GpDashCap;
+
+
+typedef PenAlignment GpPenAlignment;
+
+typedef LineJoin GpLineJoin;
+typedef PenType GpPenType;
+
+typedef Matrix GpMatrix;
+typedef BrushType GpBrushType;
+typedef MatrixOrder GpMatrixOrder;
+typedef FlushIntention GpFlushIntention;
+typedef PathData GpPathData;
+
+#endif // !_GDIPLUSGPSTUBS.HPP
+
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusGraphics.h b/core/src/fxge/Microsoft SDK/include/GdiPlusGraphics.h
new file mode 100644
index 0000000000..7b39a6ea71
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusGraphics.h
@@ -0,0 +1,2726 @@
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusGraphics.h
+*
+* Abstract:
+*
+* Declarations for Graphics class
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUSGRAPHICS_H
+#define _GDIPLUSGRAPHICS_H
+
+/**
+ * Represent a graphics context
+ */
+class Graphics : public GdiplusBase
+{
+public:
+ friend class Region;
+ friend class GraphicsPath;
+ friend class Image;
+ friend class Bitmap;
+ friend class Metafile;
+ friend class Font;
+ friend class FontFamily;
+ friend class FontCollection;
+ friend class CachedBitmap;
+
+ // Get a graphics context from an existing Win32 HDC or HWND
+ static Graphics* FromHDC(IN HDC hdc)
+ {
+ return new Graphics(hdc);
+ }
+
+ static Graphics* FromHDC(IN HDC hdc,
+ IN HANDLE hdevice)
+ {
+ return new Graphics(hdc, hdevice);
+ }
+
+ static Graphics* FromHWND(IN HWND hwnd,
+ IN BOOL icm = FALSE)
+ {
+ return new Graphics(hwnd, icm);
+ }
+
+ static Graphics* FromImage(IN Image *image)
+ {
+ return new Graphics(image);
+ }
+
+ Graphics(IN HDC hdc)
+ {
+ GpGraphics *graphics = NULL;
+
+ lastResult = DllExports::GdipCreateFromHDC(hdc, &graphics);
+
+ SetNativeGraphics(graphics);
+ }
+
+ Graphics(IN HDC hdc,
+ IN HANDLE hdevice)
+ {
+ GpGraphics *graphics = NULL;
+
+ lastResult = DllExports::GdipCreateFromHDC2(hdc, hdevice, &graphics);
+
+ SetNativeGraphics(graphics);
+ }
+
+ Graphics(IN HWND hwnd,
+ IN BOOL icm = FALSE)
+ {
+ GpGraphics *graphics = NULL;
+
+ if (icm)
+ {
+ lastResult = DllExports::GdipCreateFromHWNDICM(hwnd, &graphics);
+ }
+ else
+ {
+ lastResult = DllExports::GdipCreateFromHWND(hwnd, &graphics);
+ }
+
+ SetNativeGraphics(graphics);
+ }
+
+ Graphics(IN Image* image)
+ {
+ GpGraphics *graphics = NULL;
+
+ if (image != NULL)
+ {
+ lastResult = DllExports::GdipGetImageGraphicsContext(
+ image->nativeImage, &graphics);
+ }
+ SetNativeGraphics(graphics);
+ }
+
+ ~Graphics()
+ {
+ DllExports::GdipDeleteGraphics(nativeGraphics);
+ }
+
+ VOID Flush(IN FlushIntention intention = FlushIntentionFlush)
+ {
+ DllExports::GdipFlush(nativeGraphics, intention);
+ }
+
+ //------------------------------------------------------------------------
+ // Interop methods
+ //------------------------------------------------------------------------
+
+ // Locks the graphics until ReleaseDC is called
+ HDC GetHDC()
+ {
+ HDC hdc = NULL;
+
+ SetStatus(DllExports::GdipGetDC(nativeGraphics, &hdc));
+
+ return hdc;
+ }
+
+ VOID ReleaseHDC(IN HDC hdc)
+ {
+ SetStatus(DllExports::GdipReleaseDC(nativeGraphics, hdc));
+ }
+
+ //------------------------------------------------------------------------
+ // Rendering modes
+ //------------------------------------------------------------------------
+
+ Status SetRenderingOrigin(IN INT x, IN INT y)
+ {
+ return SetStatus(
+ DllExports::GdipSetRenderingOrigin(
+ nativeGraphics, x, y
+ )
+ );
+ }
+
+ Status GetRenderingOrigin(OUT INT *x, OUT INT *y) const
+ {
+ return SetStatus(
+ DllExports::GdipGetRenderingOrigin(
+ nativeGraphics, x, y
+ )
+ );
+ }
+
+ Status SetCompositingMode(IN CompositingMode compositingMode)
+ {
+ return SetStatus(DllExports::GdipSetCompositingMode(nativeGraphics,
+ compositingMode));
+ }
+
+ CompositingMode GetCompositingMode() const
+ {
+ CompositingMode mode;
+
+ SetStatus(DllExports::GdipGetCompositingMode(nativeGraphics,
+ &mode));
+
+ return mode;
+ }
+
+ Status SetCompositingQuality(IN CompositingQuality compositingQuality)
+ {
+ return SetStatus(DllExports::GdipSetCompositingQuality(
+ nativeGraphics,
+ compositingQuality));
+ }
+
+ CompositingQuality GetCompositingQuality() const
+ {
+ CompositingQuality quality;
+
+ SetStatus(DllExports::GdipGetCompositingQuality(
+ nativeGraphics,
+ &quality));
+
+ return quality;
+ }
+
+ Status SetTextRenderingHint(IN TextRenderingHint newMode)
+ {
+#ifndef DCR_USE_NEW_186764
+ /* temporarly set the high bit to warn that we are using the new definition for the flag */
+ newMode = (TextRenderingHint) (newMode | 0x0f000);
+#endif // DCR_USE_NEW_186764
+ return SetStatus(DllExports::GdipSetTextRenderingHint(nativeGraphics,
+ newMode));
+ }
+
+ TextRenderingHint GetTextRenderingHint() const
+ {
+ TextRenderingHint hint;
+
+ SetStatus(DllExports::GdipGetTextRenderingHint(nativeGraphics,
+ &hint));
+
+ return hint;
+ }
+
+#ifdef DCR_USE_NEW_188922
+ Status SetTextContrast(IN UINT contrast)
+ {
+ return SetStatus(DllExports::GdipSetTextContrast(nativeGraphics,
+ contrast));
+ }
+
+ UINT GetTextContrast() const
+ {
+ UINT contrast;
+
+ SetStatus(DllExports::GdipGetTextContrast(nativeGraphics,
+ &contrast));
+
+ return contrast;
+ }
+#else
+ Status SetTextGammaValue(IN UINT gammaValue)
+ {
+ return SetStatus(DllExports::GdipSetTextGammaValue(nativeGraphics,
+ gammaValue));
+ }
+
+ UINT GetTextGammaValue() const
+ {
+ UINT gammaValue;
+
+ SetStatus(DllExports::GdipGetTextGammaValue(nativeGraphics,
+ &gammaValue));
+
+ return gammaValue;
+ }
+
+#endif // DCR_USE_NEW_188922
+
+
+ InterpolationMode GetInterpolationMode() const
+ {
+ InterpolationMode mode = InterpolationModeInvalid;
+
+ SetStatus(DllExports::GdipGetInterpolationMode(nativeGraphics,
+ &mode));
+
+ return mode;
+ }
+
+ Status SetInterpolationMode(IN InterpolationMode interpolationMode)
+ {
+ return SetStatus(DllExports::GdipSetInterpolationMode(nativeGraphics,
+ interpolationMode));
+ }
+
+ SmoothingMode GetSmoothingMode() const
+ {
+ SmoothingMode smoothingMode = SmoothingModeInvalid;
+
+ SetStatus(DllExports::GdipGetSmoothingMode(nativeGraphics,
+ &smoothingMode));
+
+ return smoothingMode;
+ }
+
+ Status SetSmoothingMode(IN SmoothingMode smoothingMode)
+ {
+ return SetStatus(DllExports::GdipSetSmoothingMode(nativeGraphics,
+ smoothingMode));
+ }
+
+ PixelOffsetMode GetPixelOffsetMode() const
+ {
+ PixelOffsetMode pixelOffsetMode = PixelOffsetModeInvalid;
+
+ SetStatus(DllExports::GdipGetPixelOffsetMode(nativeGraphics,
+ &pixelOffsetMode));
+
+ return pixelOffsetMode;
+ }
+
+ Status SetPixelOffsetMode(IN PixelOffsetMode pixelOffsetMode)
+ {
+ return SetStatus(DllExports::GdipSetPixelOffsetMode(nativeGraphics,
+ pixelOffsetMode));
+ }
+
+ //------------------------------------------------------------------------
+ // Manipulate the current world transform
+ //------------------------------------------------------------------------
+
+ Status SetTransform(IN const Matrix* matrix)
+ {
+ return SetStatus(DllExports::GdipSetWorldTransform(nativeGraphics,
+ matrix->nativeMatrix));
+ }
+ Status ResetTransform()
+ {
+ return SetStatus(DllExports::GdipResetWorldTransform(nativeGraphics));
+ }
+
+ Status MultiplyTransform(IN const Matrix* matrix,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipMultiplyWorldTransform(nativeGraphics,
+ matrix->nativeMatrix,
+ order));
+ }
+
+ Status TranslateTransform(IN REAL dx,
+ IN REAL dy,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipTranslateWorldTransform(nativeGraphics,
+ dx, dy, order));
+ }
+
+ Status ScaleTransform(IN REAL sx,
+ IN REAL sy,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipScaleWorldTransform(nativeGraphics,
+ sx, sy, order));
+ }
+
+ Status RotateTransform(IN REAL angle,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipRotateWorldTransform(nativeGraphics,
+ angle, order));
+ }
+
+ /**
+ * Return the current world transform
+ */
+
+ Status GetTransform(OUT Matrix* matrix) const
+ {
+ return SetStatus(DllExports::GdipGetWorldTransform(nativeGraphics,
+ matrix->nativeMatrix));
+ }
+
+ /**
+ * Manipulate the current page transform
+ */
+
+ Status SetPageUnit(IN Unit unit)
+ {
+ return SetStatus(DllExports::GdipSetPageUnit(nativeGraphics,
+ unit));
+ }
+
+ Status SetPageScale(IN REAL scale)
+ {
+ return SetStatus(DllExports::GdipSetPageScale(nativeGraphics,
+ scale));
+ }
+
+ /**
+ * Retrieve the current page transform information
+ * notes @ these are atomic
+ */
+ Unit GetPageUnit() const
+ {
+ Unit unit;
+
+ SetStatus(DllExports::GdipGetPageUnit(nativeGraphics, &unit));
+
+ return unit;
+ }
+
+ REAL GetPageScale() const
+ {
+ REAL scale;
+
+ SetStatus(DllExports::GdipGetPageScale(nativeGraphics, &scale));
+
+ return scale;
+ }
+
+ REAL GetDpiX() const
+ {
+ REAL dpi;
+
+ SetStatus(DllExports::GdipGetDpiX(nativeGraphics, &dpi));
+
+ return dpi;
+ }
+
+ REAL GetDpiY() const
+ {
+ REAL dpi;
+
+ SetStatus(DllExports::GdipGetDpiY(nativeGraphics, &dpi));
+
+ return dpi;
+ }
+
+ /**
+ * Transform points in the current graphics context
+ */
+ // float version
+ Status TransformPoints(IN CoordinateSpace destSpace,
+ IN CoordinateSpace srcSpace,
+ IN OUT PointF* pts,
+ IN INT count) const
+ {
+ return SetStatus(DllExports::GdipTransformPoints(nativeGraphics,
+ destSpace,
+ srcSpace,
+ pts,
+ count));
+ }
+
+ // integer version
+ Status TransformPoints(IN CoordinateSpace destSpace,
+ IN CoordinateSpace srcSpace,
+ IN OUT Point* pts,
+ IN INT count) const
+ {
+
+ return SetStatus(DllExports::GdipTransformPointsI(nativeGraphics,
+ destSpace,
+ srcSpace,
+ pts,
+ count));
+ }
+
+ //------------------------------------------------------------------------
+ // GetNearestColor (for <= 8bpp surfaces)
+ // Note: alpha is ignored
+ //------------------------------------------------------------------------
+ Status GetNearestColor(IN OUT Color* color) const
+ {
+ if (color == NULL)
+ {
+ return SetStatus(InvalidParameter);
+ }
+
+ ARGB argb = color->GetValue();
+
+ Status status = SetStatus(DllExports::GdipGetNearestColor(nativeGraphics, &argb));
+
+ color->SetValue(argb);
+
+ return status;
+ }
+
+ /**
+ * Vector drawing methods
+ *
+ * @notes Do we need a set of methods that take
+ * integer coordinate parameters?
+ */
+
+ // float version
+ Status DrawLine(IN const Pen* pen,
+ IN REAL x1,
+ IN REAL y1,
+ IN REAL x2,
+ IN REAL y2)
+ {
+ return SetStatus(DllExports::GdipDrawLine(nativeGraphics,
+ pen->nativePen, x1, y1, x2,
+ y2));
+ }
+
+ Status DrawLine(IN const Pen* pen,
+ IN const PointF& pt1,
+ IN const PointF& pt2)
+ {
+ return DrawLine(pen, pt1.X, pt1.Y, pt2.X, pt2.Y);
+ }
+
+ Status DrawLines(IN const Pen* pen,
+ IN const PointF* points,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipDrawLines(nativeGraphics,
+ pen->nativePen,
+ points, count));
+ }
+
+ // int version
+ Status DrawLine(IN const Pen* pen,
+ IN INT x1,
+ IN INT y1,
+ IN INT x2,
+ IN INT y2)
+ {
+ return SetStatus(DllExports::GdipDrawLineI(nativeGraphics,
+ pen->nativePen,
+ x1,
+ y1,
+ x2,
+ y2));
+ }
+
+ Status DrawLine(IN const Pen* pen,
+ IN const Point& pt1,
+ IN const Point& pt2)
+ {
+ return DrawLine(pen,
+ pt1.X,
+ pt1.Y,
+ pt2.X,
+ pt2.Y);
+ }
+
+ Status DrawLines(IN const Pen* pen,
+ IN const Point* points,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipDrawLinesI(nativeGraphics,
+ pen->nativePen,
+ points,
+ count));
+ }
+
+ // float version
+ Status DrawArc(IN const Pen* pen,
+ IN REAL x,
+ IN REAL y,
+ IN REAL width,
+ IN REAL height,
+ IN REAL startAngle,
+ IN REAL sweepAngle)
+ {
+ return SetStatus(DllExports::GdipDrawArc(nativeGraphics,
+ pen->nativePen,
+ x,
+ y,
+ width,
+ height,
+ startAngle,
+ sweepAngle));
+ }
+
+ Status DrawArc(IN const Pen* pen,
+ IN const RectF& rect,
+ IN REAL startAngle,
+ IN REAL sweepAngle)
+ {
+ return DrawArc(pen, rect.X, rect.Y, rect.Width, rect.Height,
+ startAngle, sweepAngle);
+ }
+
+ // int version
+ Status DrawArc(IN const Pen* pen,
+ IN INT x,
+ IN INT y,
+ IN INT width,
+ IN INT height,
+ IN REAL startAngle,
+ IN REAL sweepAngle)
+ {
+ return SetStatus(DllExports::GdipDrawArcI(nativeGraphics,
+ pen->nativePen,
+ x,
+ y,
+ width,
+ height,
+ startAngle,
+ sweepAngle));
+ }
+
+
+ Status DrawArc(IN const Pen* pen,
+ IN const Rect& rect,
+ IN REAL startAngle,
+ IN REAL sweepAngle)
+ {
+ return DrawArc(pen,
+ rect.X,
+ rect.Y,
+ rect.Width,
+ rect.Height,
+ startAngle,
+ sweepAngle);
+ }
+
+ // float version
+ Status DrawBezier(IN const Pen* pen,
+ IN REAL x1,
+ IN REAL y1,
+ IN REAL x2,
+ IN REAL y2,
+ IN REAL x3,
+ IN REAL y3,
+ IN REAL x4,
+ IN REAL y4)
+ {
+ return SetStatus(DllExports::GdipDrawBezier(nativeGraphics,
+ pen->nativePen, x1, y1,
+ x2, y2, x3, y3, x4, y4));
+ }
+
+ Status DrawBezier(IN const Pen* pen,
+ IN const PointF& pt1,
+ IN const PointF& pt2,
+ IN const PointF& pt3,
+ IN const PointF& pt4)
+ {
+ return DrawBezier(pen,
+ pt1.X,
+ pt1.Y,
+ pt2.X,
+ pt2.Y,
+ pt3.X,
+ pt3.Y,
+ pt4.X,
+ pt4.Y);
+ }
+
+ Status DrawBeziers(IN const Pen* pen,
+ IN const PointF* points,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipDrawBeziers(nativeGraphics,
+ pen->nativePen,
+ points,
+ count));
+ }
+
+ // int version
+ Status DrawBezier(IN const Pen* pen,
+ IN INT x1,
+ IN INT y1,
+ IN INT x2,
+ IN INT y2,
+ IN INT x3,
+ IN INT y3,
+ IN INT x4,
+ IN INT y4)
+ {
+ return SetStatus(DllExports::GdipDrawBezierI(nativeGraphics,
+ pen->nativePen,
+ x1,
+ y1,
+ x2,
+ y2,
+ x3,
+ y3,
+ x4,
+ y4));
+ }
+
+ Status DrawBezier(IN const Pen* pen,
+ IN const Point& pt1,
+ IN const Point& pt2,
+ IN const Point& pt3,
+ IN const Point& pt4)
+ {
+ return DrawBezier(pen,
+ pt1.X,
+ pt1.Y,
+ pt2.X,
+ pt2.Y,
+ pt3.X,
+ pt3.Y,
+ pt4.X,
+ pt4.Y);
+ }
+
+ Status DrawBeziers(IN const Pen* pen,
+ IN const Point* points,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipDrawBeziersI(nativeGraphics,
+ pen->nativePen,
+ points,
+ count));
+ }
+
+ // float version
+ Status DrawRectangle(IN const Pen* pen,
+ IN const RectF& rect)
+ {
+ return DrawRectangle(pen, rect.X, rect.Y, rect.Width, rect.Height);
+ }
+
+ Status DrawRectangle(IN const Pen* pen,
+ IN REAL x,
+ IN REAL y,
+ IN REAL width,
+ IN REAL height)
+ {
+ return SetStatus(DllExports::GdipDrawRectangle(nativeGraphics,
+ pen->nativePen, x, y,
+ width, height));
+ }
+
+ Status DrawRectangles(IN const Pen* pen,
+ IN const RectF* rects,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipDrawRectangles(nativeGraphics,
+ pen->nativePen,
+ rects, count));
+ }
+
+ // integer version
+ Status DrawRectangle(IN const Pen* pen,
+ IN const Rect& rect)
+ {
+ return DrawRectangle(pen,
+ rect.X,
+ rect.Y,
+ rect.Width,
+ rect.Height);
+ }
+
+ Status DrawRectangle(IN const Pen* pen,
+ IN INT x,
+ IN INT y,
+ IN INT width,
+ IN INT height)
+ {
+ return SetStatus(DllExports::GdipDrawRectangleI(nativeGraphics,
+ pen->nativePen,
+ x,
+ y,
+ width,
+ height));
+ }
+
+ Status DrawRectangles(IN const Pen* pen,
+ IN const Rect* rects,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipDrawRectanglesI(nativeGraphics,
+ pen->nativePen,
+ rects,
+ count));
+ }
+
+ // float version
+ Status DrawEllipse(IN const Pen* pen,
+ IN const RectF& rect)
+ {
+ return DrawEllipse(pen, rect.X, rect.Y, rect.Width, rect.Height);
+ }
+
+ Status DrawEllipse(IN const Pen* pen,
+ IN REAL x,
+ IN REAL y,
+ IN REAL width,
+ IN REAL height)
+ {
+ return SetStatus(DllExports::GdipDrawEllipse(nativeGraphics,
+ pen->nativePen,
+ x,
+ y,
+ width,
+ height));
+ }
+
+ // integer version
+ Status DrawEllipse(IN const Pen* pen,
+ IN const Rect& rect)
+ {
+ return DrawEllipse(pen,
+ rect.X,
+ rect.Y,
+ rect.Width,
+ rect.Height);
+ }
+
+ Status DrawEllipse(IN const Pen* pen,
+ IN INT x,
+ IN INT y,
+ IN INT width,
+ IN INT height)
+ {
+ return SetStatus(DllExports::GdipDrawEllipseI(nativeGraphics,
+ pen->nativePen,
+ x,
+ y,
+ width,
+ height));
+ }
+
+ // floating point version
+ Status DrawPie(IN const Pen* pen,
+ IN const RectF& rect,
+ IN REAL startAngle,
+ IN REAL sweepAngle)
+ {
+ return DrawPie(pen,
+ rect.X,
+ rect.Y,
+ rect.Width,
+ rect.Height,
+ startAngle,
+ sweepAngle);
+ }
+
+ Status DrawPie(IN const Pen* pen,
+ IN REAL x,
+ IN REAL y,
+ IN REAL width,
+ IN REAL height,
+ IN REAL startAngle,
+ IN REAL sweepAngle)
+ {
+ return SetStatus(DllExports::GdipDrawPie(nativeGraphics,
+ pen->nativePen,
+ x,
+ y,
+ width,
+ height,
+ startAngle,
+ sweepAngle));
+ }
+
+ // integer point version
+ Status DrawPie(IN const Pen* pen,
+ IN const Rect& rect,
+ IN REAL startAngle,
+ IN REAL sweepAngle)
+ {
+ return DrawPie(pen,
+ rect.X,
+ rect.Y,
+ rect.Width,
+ rect.Height,
+ startAngle,
+ sweepAngle);
+ }
+
+ Status DrawPie(IN const Pen* pen,
+ IN INT x,
+ IN INT y,
+ IN INT width,
+ IN INT height,
+ IN REAL startAngle,
+ IN REAL sweepAngle)
+ {
+ return SetStatus(DllExports::GdipDrawPieI(nativeGraphics,
+ pen->nativePen,
+ x,
+ y,
+ width,
+ height,
+ startAngle,
+ sweepAngle));
+ }
+
+ // float version
+ Status DrawPolygon(IN const Pen* pen,
+ IN const PointF* points,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipDrawPolygon(nativeGraphics,
+ pen->nativePen,
+ points,
+ count));
+ }
+
+ // integer version
+ Status DrawPolygon(IN const Pen* pen,
+ IN const Point* points,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipDrawPolygonI(nativeGraphics,
+ pen->nativePen,
+ points,
+ count));
+ }
+
+ // float version
+ Status DrawPath(IN const Pen* pen,
+ IN const GraphicsPath* path)
+ {
+ return SetStatus(DllExports::GdipDrawPath(nativeGraphics,
+ pen ? pen->nativePen : NULL,
+ path ? path->nativePath : NULL));
+ }
+
+ // float version
+ Status DrawCurve(IN const Pen* pen,
+ IN const PointF* points,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipDrawCurve(nativeGraphics,
+ pen->nativePen, points,
+ count));
+ }
+
+ Status DrawCurve(IN const Pen* pen,
+ IN const PointF* points,
+ IN INT count,
+ IN REAL tension)
+ {
+ return SetStatus(DllExports::GdipDrawCurve2(nativeGraphics,
+ pen->nativePen, points,
+ count, tension));
+ }
+
+ Status DrawCurve(IN const Pen* pen,
+ IN const PointF* points,
+ IN INT count,
+ IN INT offset,
+ IN INT numberOfSegments,
+ IN REAL tension = 0.5f)
+ {
+ return SetStatus(DllExports::GdipDrawCurve3(nativeGraphics,
+ pen->nativePen, points,
+ count, offset,
+ numberOfSegments, tension));
+ }
+
+ // integer version
+ Status DrawCurve(IN const Pen* pen,
+ IN const Point* points,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipDrawCurveI(nativeGraphics,
+ pen->nativePen,
+ points,
+ count));
+ }
+
+ Status DrawCurve(IN const Pen* pen,
+ IN const Point* points,
+ IN INT count,
+ IN REAL tension)
+ {
+ return SetStatus(DllExports::GdipDrawCurve2I(nativeGraphics,
+ pen->nativePen,
+ points,
+ count,
+ tension));
+ }
+
+ Status DrawCurve(IN const Pen* pen,
+ IN const Point* points,
+ IN INT count,
+ IN INT offset,
+ IN INT numberOfSegments,
+ IN REAL tension = 0.5f)
+ {
+ return SetStatus(DllExports::GdipDrawCurve3I(nativeGraphics,
+ pen->nativePen,
+ points,
+ count,
+ offset,
+ numberOfSegments,
+ tension));
+ }
+
+ // float version
+ Status DrawClosedCurve(IN const Pen* pen,
+ IN const PointF* points,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipDrawClosedCurve(nativeGraphics,
+ pen->nativePen,
+ points, count));
+ }
+
+ Status DrawClosedCurve(IN const Pen *pen,
+ IN const PointF* points,
+ IN INT count,
+ IN REAL tension)
+ {
+ return SetStatus(DllExports::GdipDrawClosedCurve2(nativeGraphics,
+ pen->nativePen,
+ points, count,
+ tension));
+ }
+
+ // integer version
+ Status DrawClosedCurve(IN const Pen* pen,
+ IN const Point* points,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipDrawClosedCurveI(nativeGraphics,
+ pen->nativePen,
+ points,
+ count));
+ }
+
+ Status DrawClosedCurve(IN const Pen *pen,
+ IN const Point* points,
+ IN INT count,
+ IN REAL tension)
+ {
+ return SetStatus(DllExports::GdipDrawClosedCurve2I(nativeGraphics,
+ pen->nativePen,
+ points,
+ count,
+ tension));
+ }
+
+ Status Clear(IN const Color &color)
+ {
+ return SetStatus(DllExports::GdipGraphicsClear(
+ nativeGraphics,
+ color.GetValue()));
+ }
+
+ // float version
+ Status FillRectangle(IN const Brush* brush,
+ IN const RectF& rect)
+ {
+ return FillRectangle(brush, rect.X, rect.Y, rect.Width, rect.Height);
+ }
+
+ Status FillRectangle(IN const Brush* brush,
+ IN REAL x,
+ IN REAL y,
+ IN REAL width,
+ IN REAL height)
+ {
+ return SetStatus(DllExports::GdipFillRectangle(nativeGraphics,
+ brush->nativeBrush, x, y,
+ width, height));
+ }
+
+ Status FillRectangles(IN const Brush* brush,
+ IN const RectF* rects,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipFillRectangles(nativeGraphics,
+ brush->nativeBrush,
+ rects, count));
+ }
+
+ // integer version
+ Status FillRectangle(IN const Brush* brush,
+ IN const Rect& rect)
+ {
+ return FillRectangle(brush,
+ rect.X,
+ rect.Y,
+ rect.Width,
+ rect.Height);
+ }
+
+ Status FillRectangle(IN const Brush* brush,
+ IN INT x,
+ IN INT y,
+ IN INT width,
+ IN INT height)
+ {
+ return SetStatus(DllExports::GdipFillRectangleI(nativeGraphics,
+ brush->nativeBrush,
+ x,
+ y,
+ width,
+ height));
+ }
+
+ Status FillRectangles(IN const Brush* brush,
+ IN const Rect* rects,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipFillRectanglesI(nativeGraphics,
+ brush->nativeBrush,
+ rects,
+ count));
+ }
+
+ // float version
+ Status FillPolygon(IN const Brush* brush,
+ IN const PointF* points,
+ IN INT count)
+ {
+ return FillPolygon(brush, points, count, FillModeAlternate);
+ }
+
+ Status FillPolygon(IN const Brush* brush,
+ IN const PointF* points,
+ IN INT count,
+ IN FillMode fillMode)
+ {
+ return SetStatus(DllExports::GdipFillPolygon(nativeGraphics,
+ brush->nativeBrush,
+ points, count, fillMode));
+ }
+
+ // integer version
+ Status FillPolygon(IN const Brush* brush,
+ IN const Point* points,
+ IN INT count)
+ {
+ return FillPolygon(brush, points, count, FillModeAlternate);
+ }
+
+ Status FillPolygon(IN const Brush* brush,
+ IN const Point* points,
+ IN INT count,
+ IN FillMode fillMode)
+ {
+ return SetStatus(DllExports::GdipFillPolygonI(nativeGraphics,
+ brush->nativeBrush,
+ points, count,
+ fillMode));
+ }
+
+ // float version
+ Status FillEllipse(IN const Brush* brush,
+ IN const RectF& rect)
+ {
+ return FillEllipse(brush, rect.X, rect.Y, rect.Width, rect.Height);
+ }
+
+ Status FillEllipse(IN const Brush* brush,
+ IN REAL x,
+ IN REAL y,
+ IN REAL width,
+ IN REAL height)
+ {
+ return SetStatus(DllExports::GdipFillEllipse(nativeGraphics,
+ brush->nativeBrush, x, y,
+ width, height));
+ }
+
+ // integer version
+ Status FillEllipse(IN const Brush* brush,
+ IN const Rect& rect)
+ {
+ return FillEllipse(brush, rect.X, rect.Y, rect.Width, rect.Height);
+ }
+
+ Status FillEllipse(IN const Brush* brush,
+ IN INT x,
+ IN INT y,
+ IN INT width,
+ IN INT height)
+ {
+ return SetStatus(DllExports::GdipFillEllipseI(nativeGraphics,
+ brush->nativeBrush,
+ x,
+ y,
+ width,
+ height));
+ }
+
+ // float version
+ Status FillPie(IN const Brush* brush,
+ IN const RectF& rect,
+ IN REAL startAngle,
+ IN REAL sweepAngle)
+ {
+ return FillPie(brush, rect.X, rect.Y, rect.Width, rect.Height,
+ startAngle, sweepAngle);
+ }
+
+ Status FillPie(IN const Brush* brush,
+ IN REAL x,
+ IN REAL y,
+ IN REAL width,
+ IN REAL height,
+ IN REAL startAngle,
+ IN REAL sweepAngle)
+ {
+ return SetStatus(DllExports::GdipFillPie(nativeGraphics,
+ brush->nativeBrush, x, y,
+ width, height, startAngle,
+ sweepAngle));
+ }
+
+ // integer version
+ Status FillPie(IN const Brush* brush,
+ IN const Rect& rect,
+ IN REAL startAngle,
+ IN REAL sweepAngle)
+ {
+ return FillPie(brush, rect.X, rect.Y, rect.Width, rect.Height,
+ startAngle, sweepAngle);
+ }
+
+ Status FillPie(IN const Brush* brush,
+ IN INT x,
+ IN INT y,
+ IN INT width,
+ IN INT height,
+ IN REAL startAngle,
+ IN REAL sweepAngle)
+ {
+ return SetStatus(DllExports::GdipFillPieI(nativeGraphics,
+ brush->nativeBrush,
+ x,
+ y,
+ width,
+ height,
+ startAngle,
+ sweepAngle));
+ }
+
+ Status FillPath(IN const Brush* brush,
+ IN const GraphicsPath* path)
+ {
+ return SetStatus(DllExports::GdipFillPath(nativeGraphics,
+ brush->nativeBrush,
+ path->nativePath));
+ }
+
+ // float version
+ Status FillClosedCurve(IN const Brush* brush,
+ IN const PointF* points,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipFillClosedCurve(nativeGraphics,
+ brush->nativeBrush,
+ points, count));
+
+ }
+
+ Status FillClosedCurve(IN const Brush* brush,
+ IN const PointF* points,
+ IN INT count,
+ IN FillMode fillMode,
+ IN REAL tension = 0.5f)
+ {
+ return SetStatus(DllExports::GdipFillClosedCurve2(nativeGraphics,
+ brush->nativeBrush,
+ points, count,
+ tension, fillMode));
+ }
+
+ // integer version
+ Status FillClosedCurve(IN const Brush* brush,
+ IN const Point* points,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipFillClosedCurveI(nativeGraphics,
+ brush->nativeBrush,
+ points,
+ count));
+ }
+
+ Status FillClosedCurve(IN const Brush* brush,
+ IN const Point* points,
+ IN INT count,
+ IN FillMode fillMode,
+ IN REAL tension = 0.5f)
+ {
+ return SetStatus(DllExports::GdipFillClosedCurve2I(nativeGraphics,
+ brush->nativeBrush,
+ points, count,
+ tension, fillMode));
+ }
+
+ // float version
+ Status FillRegion(IN const Brush* brush,
+ IN const Region* region)
+ {
+ return SetStatus(DllExports::GdipFillRegion(nativeGraphics,
+ brush->nativeBrush,
+ region->nativeRegion));
+ }
+
+ // DrawString and MeasureString
+ Status
+ DrawString(
+ IN const WCHAR *string,
+ IN INT length,
+ IN const Font *font,
+ IN const RectF &layoutRect,
+ IN const StringFormat *stringFormat,
+ IN const Brush *brush
+ )
+ {
+ return SetStatus(DllExports::GdipDrawString(
+ nativeGraphics,
+ string,
+ length,
+ font ? font->nativeFont : NULL,
+ &layoutRect,
+ stringFormat ? stringFormat->nativeFormat : NULL,
+ brush ? brush->nativeBrush : NULL
+ ));
+ }
+
+ Status
+ DrawString(
+ const WCHAR *string,
+ INT length,
+ const Font *font,
+ const PointF &origin,
+ const Brush *brush
+ )
+ {
+ RectF rect(origin.X, origin.Y, 0.0f, 0.0f);
+
+ return SetStatus(DllExports::GdipDrawString(
+ nativeGraphics,
+ string,
+ length,
+ font ? font->nativeFont : NULL,
+ &rect,
+ NULL,
+ brush ? brush->nativeBrush : NULL
+ ));
+ }
+
+ Status
+ DrawString(
+ const WCHAR *string,
+ INT length,
+ const Font *font,
+ const PointF &origin,
+ const StringFormat *stringFormat,
+ const Brush *brush
+ )
+ {
+ RectF rect(origin.X, origin.Y, 0.0f, 0.0f);
+
+ return SetStatus(DllExports::GdipDrawString(
+ nativeGraphics,
+ string,
+ length,
+ font ? font->nativeFont : NULL,
+ &rect,
+ stringFormat ? stringFormat->nativeFormat : NULL,
+ brush ? brush->nativeBrush : NULL
+ ));
+ }
+
+ Status
+ MeasureString(
+ IN const WCHAR *string,
+ IN INT length,
+ IN const Font *font,
+ IN const RectF &layoutRect,
+ IN const StringFormat *stringFormat,
+ OUT RectF *boundingBox,
+ OUT INT *codepointsFitted = 0,
+ OUT INT *linesFilled = 0
+ ) const
+ {
+ return SetStatus(DllExports::GdipMeasureString(
+ nativeGraphics,
+ string,
+ length,
+ font ? font->nativeFont : NULL,
+ &layoutRect,
+ stringFormat ? stringFormat->nativeFormat : NULL,
+ boundingBox,
+ codepointsFitted,
+ linesFilled
+ ));
+ }
+
+ Status
+ MeasureString(
+ IN const WCHAR *string,
+ IN INT length,
+ IN const Font *font,
+ IN const SizeF &layoutRectSize,
+ IN const StringFormat *stringFormat,
+ OUT SizeF *size,
+ OUT INT *codepointsFitted = 0,
+ OUT INT *linesFilled = 0
+ ) const
+ {
+ RectF layoutRect(0, 0, layoutRectSize.Width, layoutRectSize.Height);
+ RectF boundingBox;
+ Status status;
+
+ if (size == NULL)
+ {
+ return SetStatus(InvalidParameter);
+ }
+
+ status = SetStatus(DllExports::GdipMeasureString(
+ nativeGraphics,
+ string,
+ length,
+ font ? font->nativeFont : NULL,
+ &layoutRect,
+ stringFormat ? stringFormat->nativeFormat : NULL,
+ size ? &boundingBox : NULL,
+ codepointsFitted,
+ linesFilled
+ ));
+
+ if (size && status == Ok)
+ {
+ size->Width = boundingBox.Width;
+ size->Height = boundingBox.Height;
+ }
+
+ return status;
+ }
+
+ Status
+ MeasureString(
+ IN const WCHAR *string,
+ IN INT length,
+ IN const Font *font,
+ IN const PointF &origin,
+ IN const StringFormat *stringFormat,
+ OUT RectF *boundingBox
+ ) const
+ {
+ RectF rect(origin.X, origin.Y, 0.0f, 0.0f);
+
+ return SetStatus(DllExports::GdipMeasureString(
+ nativeGraphics,
+ string,
+ length,
+ font ? font->nativeFont : NULL,
+ &rect,
+ stringFormat ? stringFormat->nativeFormat : NULL,
+ boundingBox,
+ NULL,
+ NULL
+ ));
+ }
+
+
+ Status
+ MeasureString(
+ IN const WCHAR *string,
+ IN INT length,
+ IN const Font *font,
+ IN const RectF &layoutRect,
+ OUT RectF *boundingBox
+ ) const
+ {
+ return SetStatus(DllExports::GdipMeasureString(
+ nativeGraphics,
+ string,
+ length,
+ font ? font->nativeFont : NULL,
+ &layoutRect,
+ NULL,
+ boundingBox,
+ NULL,
+ NULL
+ ));
+ }
+
+ Status
+ MeasureString(
+ IN const WCHAR *string,
+ IN INT length,
+ IN const Font *font,
+ IN const PointF &origin,
+ OUT RectF *boundingBox
+ ) const
+ {
+ RectF rect(origin.X, origin.Y, 0.0f, 0.0f);
+
+ return SetStatus(DllExports::GdipMeasureString(
+ nativeGraphics,
+ string,
+ length,
+ font ? font->nativeFont : NULL,
+ &rect,
+ NULL,
+ boundingBox,
+ NULL,
+ NULL
+ ));
+ }
+
+
+#ifdef DCR_USE_NEW_174340
+ Status
+ MeasureCharacterRanges(
+ IN const WCHAR *string,
+ IN INT length,
+ IN const Font *font,
+ IN const RectF &layoutRect,
+ IN const StringFormat *stringFormat,
+ IN INT regionCount,
+ OUT Region *regions
+ ) const
+ {
+ if (!regions || regionCount <= 0)
+ {
+ return InvalidParameter;
+ }
+
+ GpRegion **nativeRegions = new GpRegion* [regionCount];
+
+ if (!nativeRegions)
+ {
+ return OutOfMemory;
+ }
+
+ for (INT i = 0; i < regionCount; i++)
+ {
+ nativeRegions[i] = regions[i].nativeRegion;
+ }
+
+ Status status = SetStatus(DllExports::GdipMeasureCharacterRanges(
+ nativeGraphics,
+ string,
+ length,
+ font ? font->nativeFont : NULL,
+ layoutRect,
+ stringFormat ? stringFormat->nativeFormat : NULL,
+ regionCount,
+ nativeRegions
+ ));
+
+ delete [] nativeRegions;
+
+ return status;
+ }
+#endif
+
+
+#ifndef DCR_USE_NEW_174340
+ Status
+ MeasureStringRegion(
+ IN const WCHAR *string,
+ IN INT length,
+ IN const Font *font,
+ IN const RectF &layoutRect,
+ IN const StringFormat *stringFormat,
+ IN INT firstCharacterIndex,
+ IN INT characterCount,
+ OUT Region *region
+ ) const
+ {
+ if (region == NULL)
+ {
+ return SetStatus(InvalidParameter);
+ }
+
+ return (SetStatus(DllExports::GdipMeasureStringRegion(
+ nativeGraphics,
+ string,
+ length,
+ font ? font->nativeFont : NULL,
+ layoutRect,
+ stringFormat ? stringFormat->nativeFormat : NULL,
+ firstCharacterIndex,
+ characterCount,
+ region->nativeRegion)));
+ }
+#endif
+
+ Status DrawDriverString(
+ IN const UINT16 *text,
+ IN INT length,
+ IN const Font *font,
+ IN const Brush *brush,
+ IN const PointF *positions,
+ IN INT flags,
+ IN const Matrix *matrix
+ )
+ {
+ return SetStatus(DllExports::GdipDrawDriverString(
+ nativeGraphics,
+ text,
+ length,
+ font ? font->nativeFont : NULL,
+ brush ? brush->nativeBrush : NULL,
+ positions,
+ flags,
+ matrix ? matrix->nativeMatrix : NULL
+ ));
+ }
+
+ Status MeasureDriverString(
+ IN const UINT16 *text,
+ IN INT length,
+ IN const Font *font,
+ IN const PointF *positions,
+ IN INT flags,
+ IN const Matrix *matrix,
+ OUT RectF *boundingBox
+ ) const
+ {
+ return SetStatus(DllExports::GdipMeasureDriverString(
+ nativeGraphics,
+ text,
+ length,
+ font ? font->nativeFont : NULL,
+ positions,
+ flags,
+ matrix ? matrix->nativeMatrix : NULL,
+ boundingBox
+ ));
+ }
+
+#ifndef DCR_USE_NEW_168772
+ Status DriverStringPointToCodepoint(
+ IN const UINT16 *text,
+ IN INT length,
+ IN const Font *font,
+ IN const PointF *positions,
+ IN INT flags,
+ IN const Matrix *matrix,
+ IN const PointF &hit,
+ OUT INT *index,
+ OUT BOOL *rightEdge,
+ OUT REAL *distance
+ )
+ {
+ return SetStatus(DllExports::GdipDriverStringPointToCodepoint(
+ nativeGraphics,
+ text,
+ length,
+ font ? font->nativeFont : NULL,
+ positions,
+ flags,
+ matrix ? matrix->nativeMatrix : NULL,
+ &hit,
+ index,
+ rightEdge,
+ distance
+ ));
+ }
+#endif
+
+ // Draw a cached bitmap on this graphics destination offset by
+ // x, y. Note this will fail with WrongState if the CachedBitmap
+ // native format differs from this Graphics.
+
+ Status DrawCachedBitmap(IN CachedBitmap *cb,
+ IN INT x,
+ IN INT y)
+ {
+ return SetStatus(DllExports::GdipDrawCachedBitmap(
+ nativeGraphics,
+ cb->nativeCachedBitmap,
+ x, y
+ ));
+ }
+
+ /**
+ * Draw images (both bitmap and vector)
+ */
+ // float version
+ Status DrawImage(IN Image* image,
+ IN const PointF& point)
+ {
+ return DrawImage(image, point.X, point.Y);
+ }
+
+ Status DrawImage(IN Image* image,
+ IN REAL x,
+ IN REAL y)
+ {
+ return SetStatus(DllExports::GdipDrawImage(nativeGraphics,
+ image ? image->nativeImage
+ : NULL,
+ x,
+ y));
+ }
+
+ Status DrawImage(IN Image* image,
+ IN const RectF& rect)
+ {
+ return DrawImage(image, rect.X, rect.Y, rect.Width, rect.Height);
+ }
+
+ Status DrawImage(IN Image* image,
+ IN REAL x,
+ IN REAL y,
+ IN REAL width,
+ IN REAL height)
+ {
+ return SetStatus(DllExports::GdipDrawImageRect(nativeGraphics,
+ image ? image->nativeImage
+ : NULL,
+ x,
+ y,
+ width,
+ height));
+ }
+
+ // integer version
+ Status DrawImage(IN Image* image,
+ IN const Point& point)
+ {
+ return DrawImage(image, point.X, point.Y);
+ }
+
+ Status DrawImage(IN Image* image,
+ IN INT x,
+ IN INT y)
+ {
+ return SetStatus(DllExports::GdipDrawImageI(nativeGraphics,
+ image ? image->nativeImage
+ : NULL,
+ x,
+ y));
+ }
+
+ Status DrawImage(IN Image* image,
+ IN const Rect& rect)
+ {
+ return DrawImage(image,
+ rect.X,
+ rect.Y,
+ rect.Width,
+ rect.Height);
+ }
+
+ Status DrawImage(IN Image* image,
+ IN INT x,
+ IN INT y,
+ IN INT width,
+ IN INT height) {
+ return SetStatus(DllExports::GdipDrawImageRectI(nativeGraphics,
+ image ? image->nativeImage
+ : NULL,
+ x,
+ y,
+ width,
+ height));
+ }
+
+ /**
+ * Affine or perspective blt
+ * destPoints.length = 3: rect => parallelogram
+ * destPoints[0] <=> top-left corner of the source rectangle
+ * destPoints[1] <=> top-right corner
+ * destPoints[2] <=> bottom-left corner
+ * destPoints.length = 4: rect => quad
+ * destPoints[3] <=> bottom-right corner
+ *
+ * @notes Perspective blt only works for bitmap images.
+ */
+ Status DrawImage(IN Image* image,
+ IN const PointF* destPoints,
+ IN INT count)
+ {
+ if (count != 3 && count != 4)
+ return SetStatus(InvalidParameter);
+
+ return SetStatus(DllExports::GdipDrawImagePoints(nativeGraphics,
+ image ? image->nativeImage
+ : NULL,
+ destPoints, count));
+ }
+
+ Status DrawImage(IN Image* image,
+ IN const Point* destPoints,
+ IN INT count)
+ {
+ if (count != 3 && count != 4)
+ return SetStatus(InvalidParameter);
+
+ return SetStatus(DllExports::GdipDrawImagePointsI(nativeGraphics,
+ image ? image->nativeImage
+ : NULL,
+ destPoints,
+ count));
+ }
+
+ /**
+ * We need another set of methods similar to the ones above
+ * that take an additional Rect parameter to specify the
+ * portion of the source image to be drawn.
+ */
+ // float version
+ Status DrawImage(IN Image* image,
+ IN REAL x,
+ IN REAL y,
+ IN REAL srcx,
+ IN REAL srcy,
+ IN REAL srcwidth,
+ IN REAL srcheight,
+ IN Unit srcUnit)
+ {
+ return SetStatus(DllExports::GdipDrawImagePointRect(nativeGraphics,
+ image ? image->nativeImage
+ : NULL,
+ x, y,
+ srcx, srcy,
+ srcwidth, srcheight, srcUnit));
+ }
+
+ Status DrawImage(IN Image* image,
+ IN const RectF& destRect,
+ IN REAL srcx,
+ IN REAL srcy,
+ IN REAL srcwidth,
+ IN REAL srcheight,
+ IN Unit srcUnit,
+ IN const ImageAttributes* imageAttributes = NULL,
+ IN DrawImageAbort callback = NULL,
+ IN VOID* callbackData = NULL)
+ {
+ return SetStatus(DllExports::GdipDrawImageRectRect(nativeGraphics,
+ image ? image->nativeImage
+ : NULL,
+ destRect.X,
+ destRect.Y,
+ destRect.Width,
+ destRect.Height,
+ srcx, srcy,
+ srcwidth, srcheight,
+ srcUnit,
+ imageAttributes
+ ? imageAttributes->nativeImageAttr
+ : NULL,
+ callback,
+ callbackData));
+ }
+
+ Status DrawImage(IN Image* image,
+ IN const PointF* destPoints,
+ IN INT count,
+ IN REAL srcx,
+ IN REAL srcy,
+ IN REAL srcwidth,
+ IN REAL srcheight,
+ IN Unit srcUnit,
+ IN const ImageAttributes* imageAttributes = NULL,
+ IN DrawImageAbort callback = NULL,
+ IN VOID* callbackData = NULL)
+ {
+ return SetStatus(DllExports::GdipDrawImagePointsRect(nativeGraphics,
+ image ? image->nativeImage
+ : NULL,
+ destPoints, count,
+ srcx, srcy,
+ srcwidth,
+ srcheight,
+ srcUnit,
+ imageAttributes
+ ? imageAttributes->nativeImageAttr
+ : NULL,
+ callback,
+ callbackData));
+ }
+
+ // integer version
+ Status DrawImage(IN Image* image,
+ IN INT x,
+ IN INT y,
+ IN INT srcx,
+ IN INT srcy,
+ IN INT srcwidth,
+ IN INT srcheight,
+ IN Unit srcUnit)
+ {
+ return SetStatus(DllExports::GdipDrawImagePointRectI(nativeGraphics,
+ image ? image->nativeImage
+ : NULL,
+ x,
+ y,
+ srcx,
+ srcy,
+ srcwidth,
+ srcheight,
+ srcUnit));
+ }
+
+ Status DrawImage(IN Image* image,
+ IN const Rect& destRect,
+ IN INT srcx,
+ IN INT srcy,
+ IN INT srcwidth,
+ IN INT srcheight,
+ IN Unit srcUnit,
+ IN const ImageAttributes* imageAttributes = NULL,
+ IN DrawImageAbort callback = NULL,
+ IN VOID* callbackData = NULL)
+ {
+ return SetStatus(DllExports::GdipDrawImageRectRectI(nativeGraphics,
+ image ? image->nativeImage
+ : NULL,
+ destRect.X,
+ destRect.Y,
+ destRect.Width,
+ destRect.Height,
+ srcx,
+ srcy,
+ srcwidth,
+ srcheight,
+ srcUnit,
+ imageAttributes
+ ? imageAttributes->nativeImageAttr
+ : NULL,
+ callback,
+ callbackData));
+ }
+
+ Status DrawImage(IN Image* image,
+ IN const Point* destPoints,
+ IN INT count,
+ IN INT srcx,
+ IN INT srcy,
+ IN INT srcwidth,
+ IN INT srcheight,
+ IN Unit srcUnit,
+ IN const ImageAttributes* imageAttributes = NULL,
+ IN DrawImageAbort callback = NULL,
+ IN VOID* callbackData = NULL)
+ {
+ return SetStatus(DllExports::GdipDrawImagePointsRectI(nativeGraphics,
+ image ? image->nativeImage
+ : NULL,
+ destPoints,
+ count,
+ srcx,
+ srcy,
+ srcwidth,
+ srcheight,
+ srcUnit,
+ imageAttributes
+ ? imageAttributes->nativeImageAttr
+ : NULL,
+ callback,
+ callbackData));
+ }
+
+ // The following methods are for playing an EMF+ to a graphics
+ // via the enumeration interface. Each record of the EMF+ is
+ // sent to the callback (along with the callbackData). Then
+ // the callback can invoke the Metafile::PlayRecord method
+ // to play the particular record.
+
+ Status
+ EnumerateMetafile(
+ IN const Metafile * metafile,
+ IN const PointF & destPoint,
+ IN EnumerateMetafileProc callback,
+ IN VOID * callbackData = NULL,
+ IN const ImageAttributes * imageAttributes = NULL
+ )
+ {
+ return SetStatus(DllExports::GdipEnumerateMetafileDestPoint(
+ nativeGraphics,
+ (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
+ destPoint,
+ callback,
+ callbackData,
+ imageAttributes ? imageAttributes->nativeImageAttr : NULL));
+ }
+
+ Status
+ EnumerateMetafile(
+ IN const Metafile * metafile,
+ IN const Point & destPoint,
+ IN EnumerateMetafileProc callback,
+ IN VOID * callbackData = NULL,
+ IN const ImageAttributes * imageAttributes = NULL
+ )
+ {
+ return SetStatus(DllExports::GdipEnumerateMetafileDestPointI(
+ nativeGraphics,
+ (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
+ destPoint,
+ callback,
+ callbackData,
+ imageAttributes ? imageAttributes->nativeImageAttr : NULL));
+ }
+
+ Status
+ EnumerateMetafile(
+ IN const Metafile * metafile,
+ IN const RectF & destRect,
+ IN EnumerateMetafileProc callback,
+ IN VOID * callbackData = NULL,
+ IN const ImageAttributes * imageAttributes = NULL
+ )
+ {
+ return SetStatus(DllExports::GdipEnumerateMetafileDestRect(
+ nativeGraphics,
+ (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
+ destRect,
+ callback,
+ callbackData,
+ imageAttributes ? imageAttributes->nativeImageAttr : NULL));
+ }
+
+ Status
+ EnumerateMetafile(
+ IN const Metafile * metafile,
+ IN const Rect & destRect,
+ IN EnumerateMetafileProc callback,
+ IN VOID * callbackData = NULL,
+ IN const ImageAttributes * imageAttributes = NULL
+ )
+ {
+ return SetStatus(DllExports::GdipEnumerateMetafileDestRectI(
+ nativeGraphics,
+ (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
+ destRect,
+ callback,
+ callbackData,
+ imageAttributes ? imageAttributes->nativeImageAttr : NULL));
+ }
+
+ Status
+ EnumerateMetafile(
+ IN const Metafile * metafile,
+ IN const PointF * destPoints,
+ IN INT count,
+ IN EnumerateMetafileProc callback,
+ IN VOID * callbackData = NULL,
+ IN const ImageAttributes * imageAttributes = NULL
+ )
+ {
+ return SetStatus(DllExports::GdipEnumerateMetafileDestPoints(
+ nativeGraphics,
+ (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
+ destPoints,
+ count,
+ callback,
+ callbackData,
+ imageAttributes ? imageAttributes->nativeImageAttr : NULL));
+ }
+
+ Status
+ EnumerateMetafile(
+ IN const Metafile * metafile,
+ IN const Point * destPoints,
+ IN INT count,
+ IN EnumerateMetafileProc callback,
+ IN VOID * callbackData = NULL,
+ IN const ImageAttributes * imageAttributes = NULL
+ )
+ {
+ return SetStatus(DllExports::GdipEnumerateMetafileDestPointsI(
+ nativeGraphics,
+ (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
+ destPoints,
+ count,
+ callback,
+ callbackData,
+ imageAttributes ? imageAttributes->nativeImageAttr : NULL));
+ }
+
+ Status
+ EnumerateMetafile(
+ IN const Metafile * metafile,
+ IN const PointF & destPoint,
+ IN const RectF & srcRect,
+ IN Unit srcUnit,
+ IN EnumerateMetafileProc callback,
+ IN VOID * callbackData = NULL,
+ IN const ImageAttributes * imageAttributes = NULL
+ )
+ {
+ return SetStatus(DllExports::GdipEnumerateMetafileSrcRectDestPoint(
+ nativeGraphics,
+ (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
+ destPoint,
+ srcRect,
+ srcUnit,
+ callback,
+ callbackData,
+ imageAttributes ? imageAttributes->nativeImageAttr : NULL));
+ }
+
+ Status
+ EnumerateMetafile(
+ IN const Metafile * metafile,
+ IN const Point & destPoint,
+ IN const Rect & srcRect,
+ IN Unit srcUnit,
+ IN EnumerateMetafileProc callback,
+ IN VOID * callbackData = NULL,
+ IN const ImageAttributes * imageAttributes = NULL
+ )
+ {
+ return SetStatus(DllExports::GdipEnumerateMetafileSrcRectDestPointI(
+ nativeGraphics,
+ (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
+ destPoint,
+ srcRect,
+ srcUnit,
+ callback,
+ callbackData,
+ imageAttributes ? imageAttributes->nativeImageAttr : NULL));
+ }
+
+ Status
+ EnumerateMetafile(
+ IN const Metafile * metafile,
+ IN const RectF & destRect,
+ IN const RectF & srcRect,
+ IN Unit srcUnit,
+ IN EnumerateMetafileProc callback,
+ IN VOID * callbackData = NULL,
+ IN const ImageAttributes * imageAttributes = NULL
+ )
+ {
+ return SetStatus(DllExports::GdipEnumerateMetafileSrcRectDestRect(
+ nativeGraphics,
+ (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
+ destRect,
+ srcRect,
+ srcUnit,
+ callback,
+ callbackData,
+ imageAttributes ? imageAttributes->nativeImageAttr : NULL));
+ }
+
+ Status
+ EnumerateMetafile(
+ IN const Metafile * metafile,
+ IN const Rect & destRect,
+ IN const Rect & srcRect,
+ IN Unit srcUnit,
+ IN EnumerateMetafileProc callback,
+ IN VOID * callbackData = NULL,
+ IN const ImageAttributes * imageAttributes = NULL
+ )
+ {
+ return SetStatus(DllExports::GdipEnumerateMetafileSrcRectDestRectI(
+ nativeGraphics,
+ (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
+ destRect,
+ srcRect,
+ srcUnit,
+ callback,
+ callbackData,
+ imageAttributes ? imageAttributes->nativeImageAttr : NULL));
+ }
+
+ Status
+ EnumerateMetafile(
+ IN const Metafile * metafile,
+ IN const PointF * destPoints,
+ IN INT count,
+ IN const RectF & srcRect,
+ IN Unit srcUnit,
+ IN EnumerateMetafileProc callback,
+ IN VOID * callbackData = NULL,
+ IN const ImageAttributes * imageAttributes = NULL
+ )
+ {
+ return SetStatus(DllExports::GdipEnumerateMetafileSrcRectDestPoints(
+ nativeGraphics,
+ (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
+ destPoints,
+ count,
+ srcRect,
+ srcUnit,
+ callback,
+ callbackData,
+ imageAttributes ? imageAttributes->nativeImageAttr : NULL));
+ }
+
+ Status
+ EnumerateMetafile(
+ IN const Metafile * metafile,
+ IN const Point * destPoints,
+ IN INT count,
+ IN const Rect & srcRect,
+ IN Unit srcUnit,
+ IN EnumerateMetafileProc callback,
+ IN VOID * callbackData = NULL,
+ IN const ImageAttributes * imageAttributes = NULL
+ )
+ {
+ return SetStatus(DllExports::GdipEnumerateMetafileSrcRectDestPointsI(
+ nativeGraphics,
+ (const GpMetafile *)(metafile ? metafile->nativeImage:NULL),
+ destPoints,
+ count,
+ srcRect,
+ srcUnit,
+ callback,
+ callbackData,
+ imageAttributes ? imageAttributes->nativeImageAttr : NULL));
+ }
+
+ /**
+ * Clipping region operations
+ *
+ * @notes Simply incredible redundancy here.
+ */
+ Status SetClip(IN const Graphics* g,
+ IN CombineMode combineMode = CombineModeReplace)
+ {
+ return SetStatus(DllExports::GdipSetClipGraphics(nativeGraphics,
+ g->nativeGraphics,
+ combineMode));
+ }
+
+ Status SetClip(IN const RectF& rect,
+ IN CombineMode combineMode = CombineModeReplace)
+ {
+ return SetStatus(DllExports::GdipSetClipRect(nativeGraphics,
+ rect.X, rect.Y,
+ rect.Width, rect.Height,
+ combineMode));
+ }
+
+ Status SetClip(IN const Rect& rect,
+ IN CombineMode combineMode = CombineModeReplace)
+ {
+ return SetStatus(DllExports::GdipSetClipRectI(nativeGraphics,
+ rect.X, rect.Y,
+ rect.Width, rect.Height,
+ combineMode));
+ }
+
+ Status SetClip(IN const GraphicsPath* path,
+ IN CombineMode combineMode = CombineModeReplace)
+ {
+ return SetStatus(DllExports::GdipSetClipPath(nativeGraphics,
+ path->nativePath,
+ combineMode));
+ }
+
+ Status SetClip(IN const Region* region,
+ IN CombineMode combineMode = CombineModeReplace)
+ {
+ return SetStatus(DllExports::GdipSetClipRegion(nativeGraphics,
+ region->nativeRegion,
+ combineMode));
+ }
+
+ // This is different than the other SetClip methods because it assumes
+ // that the HRGN is already in device units, so it doesn't transform
+ // the coordinates in the HRGN.
+ Status SetClip(IN HRGN hRgn,
+ IN CombineMode combineMode = CombineModeReplace)
+ {
+ return SetStatus(DllExports::GdipSetClipHrgn(nativeGraphics, hRgn,
+ combineMode));
+ }
+
+ Status IntersectClip(IN const RectF& rect)
+ {
+ return SetStatus(DllExports::GdipSetClipRect(nativeGraphics,
+ rect.X, rect.Y,
+ rect.Width, rect.Height,
+ CombineModeIntersect));
+ }
+
+ Status IntersectClip(IN const Rect& rect)
+ {
+ return SetStatus(DllExports::GdipSetClipRectI(nativeGraphics,
+ rect.X, rect.Y,
+ rect.Width, rect.Height,
+ CombineModeIntersect));
+ }
+
+ Status IntersectClip(IN const Region* region)
+ {
+ return SetStatus(DllExports::GdipSetClipRegion(nativeGraphics,
+ region->nativeRegion,
+ CombineModeIntersect));
+ }
+
+ Status ExcludeClip(IN const RectF& rect)
+ {
+ return SetStatus(DllExports::GdipSetClipRect(nativeGraphics,
+ rect.X, rect.Y,
+ rect.Width, rect.Height,
+ CombineModeExclude));
+ }
+
+ Status ExcludeClip(IN const Rect& rect)
+ {
+ return SetStatus(DllExports::GdipSetClipRectI(nativeGraphics,
+ rect.X, rect.Y,
+ rect.Width, rect.Height,
+ CombineModeExclude));
+ }
+
+ Status ExcludeClip(IN const Region* region)
+ {
+ return SetStatus(DllExports::GdipSetClipRegion(nativeGraphics,
+ region->nativeRegion,
+ CombineModeExclude));
+ }
+
+ Status ResetClip()
+ {
+ return SetStatus(DllExports::GdipResetClip(nativeGraphics));
+ }
+
+ Status TranslateClip(IN REAL dx,
+ IN REAL dy)
+ {
+ return SetStatus(DllExports::GdipTranslateClip(nativeGraphics, dx, dy));
+ }
+
+ Status TranslateClip(IN INT dx,
+ IN INT dy)
+ {
+ return SetStatus(DllExports::GdipTranslateClipI(nativeGraphics,
+ dx, dy));
+ }
+
+ /**
+ * GetClip region from graphics context
+ */
+ Status GetClip(OUT Region* region) const
+ {
+ return SetStatus(DllExports::GdipGetClip(nativeGraphics,
+ region->nativeRegion));
+ }
+
+ /**
+ * Hit testing operations
+ */
+ Status GetClipBounds(OUT RectF* rect) const
+ {
+ return SetStatus(DllExports::GdipGetClipBounds(nativeGraphics, rect));
+ }
+
+ Status GetClipBounds(OUT Rect* rect) const
+ {
+ return SetStatus(DllExports::GdipGetClipBoundsI(nativeGraphics, rect));
+ }
+
+ BOOL IsClipEmpty() const
+ {
+ BOOL booln = FALSE;
+
+ SetStatus(DllExports::GdipIsClipEmpty(nativeGraphics, &booln));
+
+ return booln;
+ }
+
+ Status GetVisibleClipBounds(OUT RectF *rect) const
+ {
+
+ return SetStatus(DllExports::GdipGetVisibleClipBounds(nativeGraphics,
+ rect));
+ }
+
+ Status GetVisibleClipBounds(OUT Rect *rect) const
+ {
+ return SetStatus(DllExports::GdipGetVisibleClipBoundsI(nativeGraphics,
+ rect));
+ }
+
+ BOOL IsVisibleClipEmpty() const
+ {
+ BOOL booln = FALSE;
+
+ SetStatus(DllExports::GdipIsVisibleClipEmpty(nativeGraphics, &booln));
+
+ return booln;
+ }
+
+ BOOL IsVisible(IN INT x,
+ IN INT y) const
+ {
+ return IsVisible(Point(x,y));
+ }
+
+ BOOL IsVisible(IN const Point& point) const
+ {
+ BOOL booln = FALSE;
+
+ SetStatus(DllExports::GdipIsVisiblePointI(nativeGraphics,
+ point.X,
+ point.Y,
+ &booln));
+
+ return booln;
+ }
+
+ BOOL IsVisible(IN INT x,
+ IN INT y,
+ IN INT width,
+ IN INT height) const
+ {
+ return IsVisible(Rect(x, y, width, height));
+ }
+
+ BOOL IsVisible(IN const Rect& rect) const
+ {
+
+ BOOL booln = TRUE;
+
+ SetStatus(DllExports::GdipIsVisibleRectI(nativeGraphics,
+ rect.X,
+ rect.Y,
+ rect.Width,
+ rect.Height,
+ &booln));
+ return booln;
+ }
+
+ BOOL IsVisible(IN REAL x,
+ IN REAL y) const
+ {
+ return IsVisible(PointF(x, y));
+ }
+
+ BOOL IsVisible(IN const PointF& point) const
+ {
+ BOOL booln = FALSE;
+
+ SetStatus(DllExports::GdipIsVisiblePoint(nativeGraphics,
+ point.X,
+ point.Y,
+ &booln));
+
+ return booln;
+ }
+
+ BOOL IsVisible(IN REAL x,
+ IN REAL y,
+ IN REAL width,
+ IN REAL height) const
+ {
+ return IsVisible(RectF(x, y, width, height));
+ }
+
+ BOOL IsVisible(IN const RectF& rect) const
+ {
+ BOOL booln = TRUE;
+
+ SetStatus(DllExports::GdipIsVisibleRect(nativeGraphics,
+ rect.X,
+ rect.Y,
+ rect.Width,
+ rect.Height,
+ &booln));
+ return booln;
+ }
+
+ /**
+ * Save/restore graphics state
+ */
+ GraphicsState Save() const
+ {
+ GraphicsState gstate;
+
+ SetStatus(DllExports::GdipSaveGraphics(nativeGraphics, &gstate));
+
+ return gstate;
+ }
+
+ Status Restore(IN GraphicsState gstate)
+ {
+ return SetStatus(DllExports::GdipRestoreGraphics(nativeGraphics,
+ gstate));
+ }
+
+ /**
+ * Begin and end container drawing
+ */
+ GraphicsContainer BeginContainer(IN const RectF &dstrect,
+ IN const RectF &srcrect,
+ IN Unit unit)
+ {
+ GraphicsContainer state;
+
+ SetStatus(DllExports::GdipBeginContainer(nativeGraphics, &dstrect,
+ &srcrect, unit, &state));
+
+ return state;
+ }
+
+ /**
+ * Begin and end container drawing
+ */
+ GraphicsContainer BeginContainer(IN const Rect &dstrect,
+ IN const Rect &srcrect,
+ IN Unit unit)
+ {
+ GraphicsContainer state;
+
+ SetStatus(DllExports::GdipBeginContainerI(nativeGraphics, &dstrect,
+ &srcrect, unit, &state));
+
+ return state;
+ }
+
+ GraphicsContainer BeginContainer()
+ {
+ GraphicsContainer state;
+
+ SetStatus(DllExports::GdipBeginContainer2(nativeGraphics, &state));
+
+ return state;
+ }
+
+ Status EndContainer(IN GraphicsContainer state)
+ {
+ return SetStatus(DllExports::GdipEndContainer(nativeGraphics, state));
+ }
+
+ // only valid when recording metafiles
+ Status AddMetafileComment(IN const BYTE * data,
+ IN UINT sizeData)
+ {
+ return SetStatus(DllExports::GdipComment(nativeGraphics, sizeData, data));
+ }
+
+ /**
+ * Get/SetLayout
+ * Support for Middle East localization (right-to-left mirroring)
+ */
+ GraphicsLayout GetLayout() const
+ {
+ GraphicsLayout layout;
+
+ SetStatus(DllExports::GdipGetGraphicsLayout(nativeGraphics, &layout));
+
+ return layout;
+ }
+
+ Status SetLayout(IN const GraphicsLayout layout)
+ {
+ return SetStatus(
+ DllExports::GdipSetGraphicsLayout(nativeGraphics, layout)
+ );
+ }
+
+ static HPALETTE GetHalftonePalette()
+ {
+ return DllExports::GdipCreateHalftonePalette();
+ }
+
+ Status GetLastStatus() const
+ {
+ Status lastStatus = lastResult;
+ lastResult = Ok;
+
+ return lastStatus;
+ }
+
+protected:
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ Graphics(const Graphics &);
+ Graphics& operator=(const Graphics &);
+protected:
+
+#else
+
+ Graphics(const Graphics& graphics)
+ {
+ graphics;
+ SetStatus(NotImplemented);
+ }
+
+ Graphics& operator=(const Graphics& graphics)
+ {
+ graphics;
+ SetStatus(NotImplemented);
+ return *this;
+ }
+
+#endif
+
+ Graphics(GpGraphics* graphics)
+ {
+ lastResult = Ok;
+ SetNativeGraphics(graphics);
+ }
+
+ VOID SetNativeGraphics(GpGraphics *graphics)
+ {
+ this->nativeGraphics = graphics;
+ }
+
+ Status SetStatus(Status status) const
+ {
+ if (status != Ok)
+ return (lastResult = status);
+ else
+ return status;
+ }
+
+ // Methods necessary to subclass Graphics for extension test.
+
+ GpGraphics* GetNativeGraphics() const
+ {
+ return this->nativeGraphics;
+ }
+
+ GpPen* GetNativePen(const Pen* pen)
+ {
+ return pen->nativePen;
+ }
+
+protected:
+ GpGraphics* nativeGraphics;
+ mutable Status lastResult;
+
+};
+
+//----------------------------------------------------------------------------
+// Extra implementation of GraphicsPath methods that use Graphics
+//----------------------------------------------------------------------------
+
+/**
+ * Get the bounds of the path object with the given transform.
+ * This is not always the tightest bounds.
+ */
+
+inline Status
+GraphicsPath::GetBounds(
+ OUT RectF* bounds,
+ IN const Matrix* matrix,
+ IN const Pen* pen) const
+{
+ GpMatrix* nativeMatrix = NULL;
+ GpPen* nativePen = NULL;
+
+ if (matrix)
+ nativeMatrix = matrix->nativeMatrix;
+
+ if (pen)
+ nativePen = pen->nativePen;
+
+ return SetStatus(DllExports::GdipGetPathWorldBounds(nativePath, bounds,
+ nativeMatrix, nativePen));
+}
+
+// integer version
+inline Status
+GraphicsPath::GetBounds(
+ OUT Rect* bounds,
+ IN const Matrix* matrix,
+ IN const Pen* pen
+) const
+{
+ GpMatrix* nativeMatrix = NULL;
+ GpPen* nativePen = NULL;
+
+ if (matrix)
+ nativeMatrix = matrix->nativeMatrix;
+
+ if (pen)
+ nativePen = pen->nativePen;
+
+ return SetStatus(DllExports::GdipGetPathWorldBoundsI(nativePath, bounds,
+ nativeMatrix, nativePen));
+}
+
+//----------------------------------------------------------------------------
+// Hit testing operations
+//----------------------------------------------------------------------------
+
+inline BOOL
+GraphicsPath::IsVisible(
+ IN REAL x,
+ IN REAL y,
+ IN const Graphics* g) const
+{
+ BOOL booln = FALSE;
+
+ GpGraphics* nativeGraphics = NULL;
+
+ if (g)
+ nativeGraphics = g->nativeGraphics;
+
+ SetStatus(DllExports::GdipIsVisiblePathPoint(nativePath,
+ x, y, nativeGraphics,
+ &booln));
+ return booln;
+}
+
+inline BOOL
+GraphicsPath::IsVisible(
+ IN INT x,
+ IN INT y,
+ IN const Graphics* g) const
+{
+ BOOL booln = FALSE;
+
+ GpGraphics* nativeGraphics = NULL;
+
+ if (g)
+ nativeGraphics = g->nativeGraphics;
+
+ SetStatus(DllExports::GdipIsVisiblePathPointI(nativePath,
+ x, y, nativeGraphics,
+ &booln));
+ return booln;
+}
+
+inline BOOL
+GraphicsPath::IsOutlineVisible(
+ IN REAL x,
+ IN REAL y,
+ IN const Pen* pen,
+ IN const Graphics* g) const
+{
+ BOOL booln = FALSE;
+
+ GpGraphics* nativeGraphics = NULL;
+ GpPen* nativePen = NULL;
+
+ if(g)
+ nativeGraphics = g->nativeGraphics;
+ if(pen)
+ nativePen = pen->nativePen;
+
+ SetStatus(DllExports::GdipIsOutlineVisiblePathPoint(nativePath,
+ x, y, nativePen, nativeGraphics,
+ &booln));
+ return booln;
+}
+
+inline BOOL
+GraphicsPath::IsOutlineVisible(
+ IN INT x,
+ IN INT y,
+ IN const Pen* pen,
+ IN const Graphics* g) const
+{
+ BOOL booln = FALSE;
+
+ GpGraphics* nativeGraphics = NULL;
+ GpPen* nativePen = NULL;
+
+ if(g)
+ nativeGraphics = g->nativeGraphics;
+ if(pen)
+ nativePen = pen->nativePen;
+
+ SetStatus(DllExports::GdipIsOutlineVisiblePathPointI(nativePath,
+ x, y, nativePen, nativeGraphics,
+ &booln));
+ return booln;
+}
+
+#endif
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusHeaders.h b/core/src/fxge/Microsoft SDK/include/GdiPlusHeaders.h
new file mode 100644
index 0000000000..215c4d09ea
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusHeaders.h
@@ -0,0 +1,793 @@
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusHeaders.h
+*
+* Abstract:
+*
+* GDI+ Native C++ public header file
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUSHEADERS_H
+#define _GDIPLUSHEADERS_H
+
+//--------------------------------------------------------------------------
+// Abstract base class for regions
+//--------------------------------------------------------------------------
+
+// Include the class declarations here and have inline class implementation
+// in separate file to avoid circular references.
+
+class Region : public GdiplusBase
+{
+public:
+ friend class Graphics;
+
+ Region();
+ Region(IN const RectF& rect);
+ Region(IN const Rect& rect);
+ Region(IN const GraphicsPath* path);
+ Region(IN const BYTE* regionData, IN INT size);
+ Region(IN HRGN hRgn);
+ static Region* FromHRGN(IN HRGN hRgn);
+
+ ~Region();
+ Region* Clone() const;
+
+ Status MakeInfinite();
+ Status MakeEmpty();
+
+ // Get the size of the buffer needed for the GetData method
+ UINT GetDataSize() const;
+
+ // buffer - where to put the data
+ // bufferSize - how big the buffer is (should be at least as big as GetDataSize())
+ // sizeFilled - if not NULL, this is an OUT param that says how many bytes
+ // of data were written to the buffer.
+ Status GetData(OUT BYTE* buffer,
+ IN UINT bufferSize,
+ OUT UINT* sizeFilled = NULL) const;
+
+ Status Intersect(IN const Rect& rect);
+ Status Intersect(IN const RectF& rect);
+ Status Intersect(IN const GraphicsPath* path);
+ Status Intersect(IN const Region* region);
+ Status Union(IN const Rect& rect);
+ Status Union(IN const RectF& rect);
+ Status Union(IN const GraphicsPath* path);
+ Status Union(IN const Region* region);
+ Status Xor(IN const Rect& rect);
+ Status Xor(IN const RectF& rect);
+ Status Xor(IN const GraphicsPath* path);
+ Status Xor(IN const Region* region);
+ Status Exclude(IN const Rect& rect);
+ Status Exclude(IN const RectF& rect);
+ Status Exclude(IN const GraphicsPath* path);
+ Status Exclude(IN const Region* region);
+ Status Complement(IN const Rect& rect);
+ Status Complement(IN const RectF& rect);
+ Status Complement(IN const GraphicsPath* path);
+ Status Complement(IN const Region* region);
+ Status Translate(IN REAL dx,
+ IN REAL dy);
+ Status Translate(IN INT dx,
+ IN INT dy);
+ Status Transform(IN const Matrix* matrix);
+
+ Status GetBounds(OUT Rect* rect,
+ IN const Graphics* g) const;
+
+ Status GetBounds(OUT RectF* rect,
+ IN const Graphics* g) const;
+
+ HRGN GetHRGN (IN const Graphics * g) const;
+
+ BOOL IsEmpty(IN const Graphics *g) const;
+ BOOL IsInfinite(IN const Graphics *g) const;
+
+ BOOL IsVisible(IN INT x,
+ IN INT y,
+ IN const Graphics* g = NULL) const
+ {
+ return IsVisible(Point(x, y), g);
+ }
+
+ BOOL IsVisible(IN const Point& point,
+ IN const Graphics* g = NULL) const;
+
+ BOOL IsVisible(IN REAL x,
+ IN REAL y,
+ IN const Graphics* g = NULL) const
+ {
+ return IsVisible(PointF(x, y), g);
+ }
+
+ BOOL IsVisible(IN const PointF& point,
+ IN const Graphics* g = NULL) const;
+
+ BOOL IsVisible(IN INT x,
+ IN INT y,
+ IN INT width,
+ IN INT height,
+ IN const Graphics* g) const
+ {
+ return IsVisible(Rect(x, y, width, height), g);
+ }
+
+ BOOL IsVisible(IN const Rect& rect,
+ IN const Graphics* g = NULL) const;
+
+ BOOL IsVisible(IN REAL x,
+ IN REAL y,
+ IN REAL width,
+ IN REAL height,
+ IN const Graphics* g = NULL) const
+ {
+ return IsVisible(RectF(x, y, width, height), g);
+ }
+
+ BOOL IsVisible(IN const RectF& rect,
+ IN const Graphics* g = NULL) const;
+
+ BOOL Equals(IN const Region* region,
+ IN const Graphics* g) const;
+
+ UINT GetRegionScansCount(IN const Matrix* matrix) const;
+ Status GetRegionScans(IN const Matrix* matrix,
+ OUT RectF* rects,
+ OUT INT* count) const;
+ Status GetRegionScans(IN const Matrix* matrix,
+ OUT Rect* rects,
+ OUT INT* count) const;
+ Status GetLastStatus() const;
+
+protected:
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ Region(const Region &region);
+ Region& operator=(const Region &region);
+protected:
+
+#else
+ Region(const Region &region)
+ {
+ region; // reference parameter
+ SetStatus(NotImplemented);
+ }
+
+ Region& operator=(const Region &region)
+ {
+ region; // reference parameter
+ SetStatus(NotImplemented);
+ return *this;
+ }
+#endif
+
+ Status SetStatus(Status status) const
+ {
+ if (status != Ok)
+ return (lastResult = status);
+ else
+ return status;
+ }
+
+ Region(GpRegion* nativeRegion);
+
+ VOID SetNativeRegion(GpRegion* nativeRegion);
+
+protected:
+ GpRegion* nativeRegion;
+ mutable Status lastResult;
+};
+
+
+//--------------------------------------------------------------------------
+// Abstract base class for FontFamily
+//--------------------------------------------------------------------------
+
+class FontFamily : public GdiplusBase
+{
+public:
+ friend class Font;
+ friend class Graphics;
+ friend class GraphicsPath;
+ friend class FontCollection;
+
+ FontFamily();
+
+ FontFamily(
+ IN const WCHAR *name,
+ IN const FontCollection *fontCollection = NULL
+ );
+
+ ~FontFamily();
+
+ static const FontFamily *GenericSansSerif();
+ static const FontFamily *GenericSerif();
+ static const FontFamily *GenericMonospace();
+
+ Status GetFamilyName(
+ OUT WCHAR name[LF_FACESIZE],
+ IN LANGID language = 0
+ ) const;
+
+// Copy operator
+ FontFamily * Clone() const;
+
+ BOOL IsAvailable() const
+ {
+ return (nativeFamily != NULL);
+ };
+
+ BOOL IsStyleAvailable(IN INT style) const;
+
+ UINT16 GetEmHeight (IN INT style) const;
+ UINT16 GetCellAscent (IN INT style) const;
+ UINT16 GetCellDescent (IN INT style) const;
+ UINT16 GetLineSpacing (IN INT style) const;
+
+ ///////////////////////////////////////////////////////////
+
+ Status GetLastStatus() const;
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ FontFamily(const FontFamily &);
+ FontFamily& operator=(const FontFamily &);
+
+#endif
+
+protected:
+ Status SetStatus(Status status) const;
+
+ // private constructor for copy
+ FontFamily(GpFontFamily * nativeFamily, Status status);
+
+///////////////////////////////////////
+// Data members
+protected:
+
+ GpFontFamily *nativeFamily;
+ mutable Status lastResult;
+};
+
+static FontFamily *GenericSansSerifFontFamily = NULL;
+static FontFamily *GenericSerifFontFamily = NULL;
+static FontFamily *GenericMonospaceFontFamily = NULL;
+
+static BYTE GenericSansSerifFontFamilyBuffer[sizeof(FontFamily)] = {0};
+static BYTE GenericSerifFontFamilyBuffer [sizeof(FontFamily)] = {0};
+static BYTE GenericMonospaceFontFamilyBuffer[sizeof(FontFamily)] = {0};
+
+
+//--------------------------------------------------------------------------
+// Abstract base class for fonts
+//--------------------------------------------------------------------------
+
+class Font : public GdiplusBase
+{
+public:
+ friend class Graphics;
+
+ Font(IN HDC hdc);
+ Font(IN HDC hdc,
+ IN const LOGFONTA* logfont);
+ Font(IN HDC hdc,
+ IN const LOGFONTW* logfont);
+#ifdef DCR_USE_NEW_127084
+ Font(IN HDC hdc,
+ IN const HFONT hfont);
+#endif
+ Font(
+ IN const FontFamily * family,
+ IN REAL emSize,
+ IN INT style = FontStyleRegular,
+ IN Unit unit = UnitPoint
+ );
+
+ Font(
+ IN const WCHAR * familyName,
+ IN REAL emSize,
+ IN INT style = FontStyleRegular,
+ IN Unit unit = UnitPoint,
+ IN const FontCollection * fontCollection = NULL
+ );
+
+ Status GetLogFontA(IN const Graphics* g,
+ OUT LOGFONTA * logfontA) const;
+ Status GetLogFontW(IN const Graphics* g,
+ OUT LOGFONTW * logfontW) const;
+
+ Font* Clone() const;
+ ~Font();
+ BOOL IsAvailable() const;
+ INT GetStyle() const;
+ REAL GetSize() const;
+ Unit GetUnit() const;
+ Status GetLastStatus() const;
+ REAL GetHeight(IN const Graphics *graphics = NULL) const;
+#ifdef DCR_USE_NEW_125467
+ REAL GetHeight(IN REAL dpi) const;
+#endif
+
+ Status GetFamily(OUT FontFamily *family) const;
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ Font(const Font &);
+ Font& operator=(const Font &);
+
+#endif
+
+protected:
+ Font(GpFont* font, Status status);
+ VOID SetNativeFont(GpFont *Font);
+ Status SetStatus(Status status) const;
+
+protected:
+ /*
+ * handle to native line texture object
+ */
+
+ GpFont* nativeFont;
+ mutable Status lastResult;
+};
+
+//--------------------------------------------------------------------------
+// Abstract base classes for font collections
+//--------------------------------------------------------------------------
+
+class FontCollection : public GdiplusBase
+{
+public:
+ friend class FontFamily;
+
+ FontCollection();
+ virtual ~FontCollection();
+
+ INT GetFamilyCount() const; // number of enumerable families in the collection
+
+ Status GetFamilies( // enumerate the fonts in a collection
+ IN INT numSought,
+ OUT FontFamily * gpfamilies,
+ OUT INT * numFound
+ ) const;
+
+ Status GetLastStatus() const;
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ FontCollection(const FontCollection &);
+ FontCollection& operator=(const FontCollection &);
+
+#endif
+
+protected:
+ Status SetStatus(Status status) const ;
+
+ GpFontCollection *nativeFontCollection;
+ mutable Status lastResult;
+};
+
+
+class InstalledFontCollection : public FontCollection
+{
+public:
+ InstalledFontCollection();
+ ~InstalledFontCollection();
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ InstalledFontCollection(const InstalledFontCollection &);
+ InstalledFontCollection& operator=(const InstalledFontCollection &);
+
+#endif
+
+protected:
+#ifndef DCR_USE_NEW_235072
+ Status InstallFontFile(IN const WCHAR* filename);
+ Status UninstallFontFile(IN const WCHAR* filename);
+#endif
+ Status SetStatus(Status status) const ;
+};
+
+
+class PrivateFontCollection : public FontCollection
+{
+public:
+ PrivateFontCollection();
+ ~PrivateFontCollection();
+
+ Status AddFontFile(IN const WCHAR* filename);
+ Status AddMemoryFont(IN const VOID* memory,
+ IN INT length);
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ PrivateFontCollection(const PrivateFontCollection &);
+ PrivateFontCollection& operator=(const PrivateFontCollection &);
+
+#endif
+};
+
+
+//--------------------------------------------------------------------------
+// Abstract base class for bitmap image and metafile
+//--------------------------------------------------------------------------
+
+// !!! Note:
+// Include the class declarations here and have the inline class
+// implementation in a separate file. This is done to resolve a
+// circular dependency since one of the Bitmap methods needs to
+// access the private member nativeGraphics of the Graphics object.
+
+class Image : public GdiplusBase
+{
+public:
+ friend class Brush;
+ friend class TextureBrush;
+ friend class Graphics;
+
+#ifndef DCR_USE_NEW_140782
+ Image(
+ IN const WCHAR* filename
+ );
+
+ Image(
+ IN IStream* stream
+ );
+
+ static Image* FromFile(
+ IN const WCHAR* filename
+ );
+
+ static Image* FromStream(
+ IN IStream* stream
+ );
+#else
+ Image(
+ IN const WCHAR* filename,
+ IN BOOL useEmbeddedColorManagement = FALSE
+ );
+
+ Image(
+ IN IStream* stream,
+ IN BOOL useEmbeddedColorManagement = FALSE
+ );
+
+ static Image* FromFile(
+ IN const WCHAR* filename,
+ IN BOOL useEmbeddedColorManagement = FALSE
+ );
+
+ static Image* FromStream(
+ IN IStream* stream,
+ IN BOOL useEmbeddedColorManagement = FALSE
+ );
+#endif
+
+ virtual ~Image();
+ virtual Image* Clone();
+
+ Status Save(IN const WCHAR* filename,
+ IN const CLSID* clsidEncoder,
+ IN const EncoderParameters *encoderParams = NULL);
+ Status Save(IN IStream* stream,
+ IN const CLSID* clsidEncoder,
+ IN const EncoderParameters *encoderParams = NULL);
+ Status SaveAdd(IN const EncoderParameters* encoderParams);
+ Status SaveAdd(IN Image* newImage,
+ IN const EncoderParameters* encoderParams);
+
+ ImageType GetType() const;
+ Status GetPhysicalDimension(OUT SizeF* size);
+ Status GetBounds(OUT RectF* srcRect,
+ OUT Unit* srcUnit);
+
+ UINT GetWidth();
+ UINT GetHeight();
+ REAL GetHorizontalResolution();
+ REAL GetVerticalResolution();
+ UINT GetFlags();
+ Status GetRawFormat(OUT GUID *format);
+ PixelFormat GetPixelFormat();
+
+ INT GetPaletteSize();
+ Status GetPalette(OUT ColorPalette* palette,
+ IN INT size);
+ Status SetPalette(IN const ColorPalette* palette);
+
+ Image* GetThumbnailImage(IN UINT thumbWidth,
+ IN UINT thumbHeight,
+ IN GetThumbnailImageAbort callback = NULL,
+ IN VOID* callbackData = NULL);
+ UINT GetFrameDimensionsCount();
+ Status GetFrameDimensionsList(OUT GUID* dimensionIDs,
+ IN UINT count);
+ UINT GetFrameCount(IN const GUID* dimensionID);
+ Status SelectActiveFrame(IN const GUID* dimensionID,
+ IN UINT frameIndex);
+ Status RotateFlip(IN RotateFlipType rotateFlipType);
+ UINT GetPropertyCount();
+ Status GetPropertyIdList(IN UINT numOfProperty,
+ OUT PROPID* list);
+ UINT GetPropertyItemSize(IN PROPID propId);
+ Status GetPropertyItem(IN PROPID propId,
+ IN UINT propSize,
+ OUT PropertyItem* buffer);
+ Status GetPropertySize(OUT UINT* totalBufferSize,
+ OUT UINT* numProperties);
+ Status GetAllPropertyItems(IN UINT totalBufferSize,
+ IN UINT numProperties,
+ OUT PropertyItem* allItems);
+ Status RemovePropertyItem(IN PROPID propId);
+ Status SetPropertyItem(IN const PropertyItem* item);
+
+ UINT GetEncoderParameterListSize(IN const CLSID* clsidEncoder);
+ Status GetEncoderParameterList(IN const CLSID* clsidEncoder,
+ IN UINT size,
+ OUT EncoderParameters* buffer);
+
+ // Support for Middle East localization (right-to-left mirroring)
+ ImageLayout GetLayout() const;
+ Status SetLayout(IN const ImageLayout layout);
+
+ Status GetLastStatus() const;
+
+protected:
+
+ Image() {}
+
+ Image(GpImage *nativeImage, Status status);
+
+ VOID SetNativeImage(GpImage* nativeImage);
+
+ Status SetStatus(Status status) const
+ {
+ if (status != Ok)
+ return (lastResult = status);
+ else
+ return status;
+ }
+
+ GpImage* nativeImage;
+ mutable Status lastResult;
+ mutable Status loadStatus;
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+
+#else
+
+protected:
+
+#endif
+
+ // Disable copy constructor and assignment operator
+
+ Image(IN const Image& C);
+ Image& operator=(IN const Image& C);
+};
+
+class Bitmap : public Image
+{
+public:
+ friend class Image;
+ friend class CachedBitmap;
+
+ Bitmap(
+ IN const WCHAR *filename,
+ IN BOOL useEmbeddedColorManagement = FALSE
+ );
+
+ Bitmap(
+ IN IStream *stream,
+ IN BOOL useEmbeddedColorManagement = FALSE
+ );
+
+ static Bitmap* FromFile(
+ IN const WCHAR *filename,
+ IN BOOL useEmbeddedColorManagement = FALSE
+ );
+
+ static Bitmap* FromStream(
+ IN IStream *stream,
+ IN BOOL useEmbeddedColorManagement = FALSE
+ );
+
+ Bitmap(IN INT width,
+ IN INT height,
+ IN INT stride, PixelFormat format,
+ IN BYTE* scan0);
+ Bitmap(IN INT width,
+ IN INT height,
+ IN PixelFormat format = PixelFormat32bppARGB);
+ Bitmap(IN INT width,
+ IN INT height,
+ IN Graphics* target);
+
+ Bitmap* Clone(IN const Rect& rect,
+ IN PixelFormat format);
+ Bitmap* Clone(IN INT x,
+ IN INT y,
+ IN INT width,
+ IN INT height,
+ IN PixelFormat format);
+ Bitmap* Clone(IN const RectF& rect,
+ IN PixelFormat format);
+ Bitmap* Clone(IN REAL x,
+ IN REAL y,
+ IN REAL width,
+ IN REAL height,
+ IN PixelFormat format);
+
+ Status LockBits(IN const Rect& rect,
+ IN UINT flags,
+ IN PixelFormat format,
+ OUT BitmapData* lockedBitmapData);
+ Status UnlockBits(IN BitmapData* lockedBitmapData);
+ Status GetPixel(IN INT x,
+ IN INT y,
+ OUT Color *color);
+ Status SetPixel(IN INT x,
+ IN INT y,
+ IN const Color &color);
+ Status SetResolution(IN REAL xdpi,
+ IN REAL ydpi);
+
+ // GDI interop:
+
+ Bitmap(IN IDirectDrawSurface7* surface);
+ Bitmap(IN const BITMAPINFO* gdiBitmapInfo,
+ IN VOID* gdiBitmapData);
+ Bitmap(IN HBITMAP hbm,
+ IN HPALETTE hpal);
+ Bitmap(IN HICON hicon);
+ Bitmap(IN HINSTANCE hInstance,
+ IN const WCHAR * bitmapName);
+ static Bitmap* FromDirectDrawSurface7(IN IDirectDrawSurface7* surface);
+ static Bitmap* FromBITMAPINFO(IN const BITMAPINFO* gdiBitmapInfo,
+ IN VOID* gdiBitmapData);
+ static Bitmap* FromHBITMAP(IN HBITMAP hbm,
+ IN HPALETTE hpal);
+ static Bitmap* FromHICON(IN HICON hicon);
+ static Bitmap* FromResource(IN HINSTANCE hInstance,
+ IN const WCHAR * bitmapName);
+
+ Status GetHBITMAP(IN const Color& colorBackground,
+ OUT HBITMAP *hbmReturn);
+ Status GetHICON(HICON *hicon);
+
+#ifdef DCR_USE_NEW_250932
+private:
+ Bitmap(const Bitmap &);
+ Bitmap& operator=(const Bitmap &);
+#endif
+
+protected:
+ Bitmap(GpBitmap *nativeBitmap);
+};
+
+class CustomLineCap : public GdiplusBase
+{
+public:
+ friend class Pen;
+
+ CustomLineCap(
+ IN const GraphicsPath* fillPath,
+ IN const GraphicsPath* strokePath,
+ IN LineCap baseCap = LineCapFlat,
+ IN REAL baseInset = 0
+ );
+ virtual ~CustomLineCap();
+
+ CustomLineCap* Clone() const;
+
+ Status SetStrokeCap(IN LineCap strokeCap)
+ {
+ // This changes both start and and caps.
+
+ return SetStrokeCaps(strokeCap, strokeCap);
+ }
+
+ Status SetStrokeCaps(IN LineCap startCap,
+ IN LineCap endCap);
+ Status GetStrokeCaps(OUT LineCap* startCap,
+ OUT LineCap* endCap) const;
+ Status SetStrokeJoin(IN LineJoin lineJoin);
+ LineJoin GetStrokeJoin() const;
+ Status SetBaseCap(IN LineCap baseCap);
+ LineCap GetBaseCap() const;
+ Status SetBaseInset(IN REAL inset);
+ REAL GetBaseInset() const;
+ Status SetWidthScale(IN REAL widthScale);
+ REAL GetWidthScale() const;
+
+protected:
+ CustomLineCap();
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ CustomLineCap(const CustomLineCap &);
+ CustomLineCap& operator=(const CustomLineCap &);
+protected:
+
+#else
+
+ CustomLineCap(const CustomLineCap& customLineCap)
+ {
+ customLineCap;
+ SetStatus(NotImplemented);
+ }
+
+ CustomLineCap& operator=(const CustomLineCap& customLineCap)
+ {
+ customLineCap;
+ SetStatus(NotImplemented);
+ return *this;
+ }
+
+#endif
+
+ CustomLineCap(GpCustomLineCap* nativeCap, Status status)
+ {
+ lastResult = status;
+ SetNativeCap(nativeCap);
+ }
+
+ VOID SetNativeCap(GpCustomLineCap* nativeCap)
+ {
+ this->nativeCap = nativeCap;
+ }
+
+ Status SetStatus(Status status) const
+ {
+ if (status != Ok)
+ return (lastResult = status);
+ else
+ return status;
+ }
+
+protected:
+ GpCustomLineCap* nativeCap;
+ mutable Status lastResult;
+};
+
+class CachedBitmap : public GdiplusBase
+{
+ friend Graphics;
+
+public:
+ CachedBitmap(IN Bitmap *bitmap,
+ IN Graphics *graphics);
+ virtual ~CachedBitmap();
+
+ Status GetLastStatus() const;
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ CachedBitmap(const CachedBitmap &);
+ CachedBitmap& operator=(const CachedBitmap &);
+
+#endif
+
+protected:
+ GpCachedBitmap *nativeCachedBitmap;
+ mutable Status lastResult;
+};
+
+#endif // !_GDIPLUSHEADERS.HPP
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusImageCodec.h b/core/src/fxge/Microsoft SDK/include/GdiPlusImageCodec.h
new file mode 100644
index 0000000000..e9c02deb7e
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusImageCodec.h
@@ -0,0 +1,73 @@
+/**************************************************************************\
+*
+* Copyright (c) 2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusImageCodec.h
+*
+* Abstract:
+*
+* APIs for imaging codecs.
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUSIMAGECODEC_H
+#define _GDIPLUSIMAGECODEC_H
+
+//--------------------------------------------------------------------------
+// Codec Management APIs
+//--------------------------------------------------------------------------
+
+inline Status
+GetImageDecodersSize(
+ OUT UINT *numDecoders,
+ OUT UINT *size)
+{
+ return DllExports::GdipGetImageDecodersSize(numDecoders, size);
+}
+
+
+inline Status
+GetImageDecoders(
+ IN UINT numDecoders,
+ IN UINT size,
+ OUT ImageCodecInfo *decoders)
+{
+ return DllExports::GdipGetImageDecoders(numDecoders, size, decoders);
+}
+
+
+inline Status
+GetImageEncodersSize(
+ OUT UINT *numEncoders,
+ OUT UINT *size)
+{
+ return DllExports::GdipGetImageEncodersSize(numEncoders, size);
+}
+
+
+inline Status
+GetImageEncoders(
+ IN UINT numEncoders,
+ IN UINT size,
+ OUT ImageCodecInfo *encoders)
+{
+ return DllExports::GdipGetImageEncoders(numEncoders, size, encoders);
+}
+
+inline Status
+AddImageCodec(
+ IN const ImageCodecInfo* codec)
+{
+ return DllExports::GdipAddImageCodec(codec);
+}
+
+inline Status
+RemoveImageCodec(
+ IN const ImageCodecInfo* codec)
+{
+ return DllExports::GdipRemoveImageCodec(codec);
+}
+
+#endif // _GDIPLUSIMAGECODEC_H
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusImaging.h b/core/src/fxge/Microsoft SDK/include/GdiPlusImaging.h
new file mode 100644
index 0000000000..35dd4d0634
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusImaging.h
@@ -0,0 +1,540 @@
+/**************************************************************************\
+*
+* Copyright (c) 1999-2000 Microsoft Corporation
+*
+* Module Name:
+*
+* GdiplusImaging.h
+*
+* Abstract:
+*
+* GUIDs defined and used by the imaging library
+*
+\**************************************************************************/
+#ifndef _GDIPLUSIMAGING_H
+#define _GDIPLUSIMAGING_H
+
+//---------------------------------------------------------------------------
+// Image file format identifiers
+//---------------------------------------------------------------------------
+
+DEFINE_GUID(ImageFormatUndefined, 0xb96b3ca9,0x0728,0x11d3,0x9d,0x7b,0x00,0x00,0xf8,0x1e,0xf3,0x2e);
+DEFINE_GUID(ImageFormatMemoryBMP, 0xb96b3caa,0x0728,0x11d3,0x9d,0x7b,0x00,0x00,0xf8,0x1e,0xf3,0x2e);
+DEFINE_GUID(ImageFormatBMP, 0xb96b3cab,0x0728,0x11d3,0x9d,0x7b,0x00,0x00,0xf8,0x1e,0xf3,0x2e);
+DEFINE_GUID(ImageFormatEMF, 0xb96b3cac,0x0728,0x11d3,0x9d,0x7b,0x00,0x00,0xf8,0x1e,0xf3,0x2e);
+DEFINE_GUID(ImageFormatWMF, 0xb96b3cad,0x0728,0x11d3,0x9d,0x7b,0x00,0x00,0xf8,0x1e,0xf3,0x2e);
+DEFINE_GUID(ImageFormatJPEG, 0xb96b3cae,0x0728,0x11d3,0x9d,0x7b,0x00,0x00,0xf8,0x1e,0xf3,0x2e);
+DEFINE_GUID(ImageFormatPNG, 0xb96b3caf,0x0728,0x11d3,0x9d,0x7b,0x00,0x00,0xf8,0x1e,0xf3,0x2e);
+DEFINE_GUID(ImageFormatGIF, 0xb96b3cb0,0x0728,0x11d3,0x9d,0x7b,0x00,0x00,0xf8,0x1e,0xf3,0x2e);
+DEFINE_GUID(ImageFormatTIFF, 0xb96b3cb1,0x0728,0x11d3,0x9d,0x7b,0x00,0x00,0xf8,0x1e,0xf3,0x2e);
+DEFINE_GUID(ImageFormatEXIF, 0xb96b3cb2,0x0728,0x11d3,0x9d,0x7b,0x00,0x00,0xf8,0x1e,0xf3,0x2e);
+#ifndef DCR_USE_NEW_140855
+DEFINE_GUID(ImageFormatPhotoCD, 0xb96b3cb3,0x0728,0x11d3,0x9d,0x7b,0x00,0x00,0xf8,0x1e,0xf3,0x2e);
+DEFINE_GUID(ImageFormatFlashPIX, 0xb96b3cb4,0x0728,0x11d3,0x9d,0x7b,0x00,0x00,0xf8,0x1e,0xf3,0x2e);
+#endif
+DEFINE_GUID(ImageFormatIcon, 0xb96b3cb5,0x0728,0x11d3,0x9d,0x7b,0x00,0x00,0xf8,0x1e,0xf3,0x2e);
+
+//---------------------------------------------------------------------------
+// Predefined multi-frame dimension IDs
+//---------------------------------------------------------------------------
+
+DEFINE_GUID(FrameDimensionTime, 0x6aedbd6d,0x3fb5,0x418a,0x83,0xa6,0x7f,0x45,0x22,0x9d,0xc8,0x72);
+DEFINE_GUID(FrameDimensionResolution, 0x84236f7b,0x3bd3,0x428f,0x8d,0xab,0x4e,0xa1,0x43,0x9c,0xa3,0x15);
+DEFINE_GUID(FrameDimensionPage, 0x7462dc86,0x6180,0x4c7e,0x8e,0x3f,0xee,0x73,0x33,0xa7,0xa4,0x83);
+
+//---------------------------------------------------------------------------
+// Property sets
+//---------------------------------------------------------------------------
+
+DEFINE_GUID(FormatIDImageInformation, 0xe5836cbe,0x5eef,0x4f1d,0xac,0xde,0xae,0x4c,0x43,0xb6,0x08,0xce);
+DEFINE_GUID(FormatIDJpegAppHeaders, 0x1c4afdcd,0x6177,0x43cf,0xab,0xc7,0x5f,0x51,0xaf,0x39,0xee,0x85);
+
+#ifndef DCR_USE_NEW_140855
+//---------------------------------------------------------------------------
+// Decoder parameter sets
+//---------------------------------------------------------------------------
+DEFINE_GUID(DecoderTransColor, 0xb7a98c8f,0xdce7,0x457d,0xbf,0xa5,0xce,0xa7,0x1b,0xd1,0x4d,0xd6);
+DEFINE_GUID(DecoderTransRange, 0xabeed189,0xd988,0x4d03,0xb4,0x25,0x57,0x10,0x55,0xc7,0x6a,0xd1);
+DEFINE_GUID(DecoderOutputChannel, 0x2ff8f51e,0x724d,0x45fe,0x86,0xce,0x17,0x77,0xa0,0x56,0xda,0x60);
+DEFINE_GUID(DecoderIconRes, 0x5c656eec,0xe94f,0x45ba,0xa6,0xf6,0x10,0x62,0xe8,0x5f,0x4a,0x7f);
+#endif
+
+//---------------------------------------------------------------------------
+// Encoder parameter sets
+//---------------------------------------------------------------------------
+
+DEFINE_GUID(EncoderCompression, 0xe09d739d,0xccd4,0x44ee,0x8e,0xba,0x3f,0xbf,0x8b,0xe4,0xfc,0x58);
+DEFINE_GUID(EncoderColorDepth, 0x66087055,0xad66,0x4c7c,0x9a,0x18,0x38,0xa2,0x31,0x0b,0x83,0x37);
+DEFINE_GUID(EncoderScanMethod, 0x3a4e2661,0x3109,0x4e56,0x85,0x36,0x42,0xc1,0x56,0xe7,0xdc,0xfa);
+DEFINE_GUID(EncoderVersion, 0x24d18c76,0x814a,0x41a4,0xbf,0x53,0x1c,0x21,0x9c,0xcc,0xf7,0x97);
+DEFINE_GUID(EncoderRenderMethod, 0x6d42c53a,0x229a,0x4825,0x8b,0xb7,0x5c,0x99,0xe2,0xb9,0xa8,0xb8);
+DEFINE_GUID(EncoderQuality, 0x1d5be4b5,0xfa4a,0x452d,0x9c,0xdd,0x5d,0xb3,0x51,0x05,0xe7,0xeb);
+DEFINE_GUID(EncoderTransformation,0x8d0eb2d1,0xa58e,0x4ea8,0xaa,0x14,0x10,0x80,0x74,0xb7,0xb6,0xf9);
+DEFINE_GUID(EncoderLuminanceTable,0xedb33bce,0x0266,0x4a77,0xb9,0x04,0x27,0x21,0x60,0x99,0xe7,0x17);
+DEFINE_GUID(EncoderChrominanceTable,0xf2e455dc,0x09b3,0x4316,0x82,0x60,0x67,0x6a,0xda,0x32,0x48,0x1c);
+DEFINE_GUID(EncoderSaveFlag,0x292266fc,0xac40,0x47bf,0x8c, 0xfc, 0xa8, 0x5b, 0x89, 0xa6, 0x55, 0xde);
+
+DEFINE_GUID(CodecIImageBytes,0x025d1823,0x6c7d,0x447b,0xbb, 0xdb, 0xa3, 0xcb, 0xc3, 0xdf, 0xa2, 0xfc);
+
+MIDL_INTERFACE("025D1823-6C7D-447B-BBDB-A3CBC3DFA2FC")
+IImageBytes : public IUnknown
+{
+public:
+ // Return total number of bytes in the IStream
+
+ STDMETHOD(CountBytes)(
+ OUT UINT *pcb
+ ) = 0;
+
+ // Locks "cb" bytes, starting from "ulOffset" in the stream, and returns the
+ // pointer to the beginning of the locked memory chunk in "ppvBytes"
+
+ STDMETHOD(LockBytes)(
+ IN UINT cb,
+ IN ULONG ulOffset,
+ OUT const VOID ** ppvBytes
+ ) = 0;
+
+ // Unlocks "cb" bytes, pointed by "pvBytes", starting from "ulOffset" in the
+ // stream
+
+ STDMETHOD(UnlockBytes)(
+ IN const VOID *pvBytes,
+ IN UINT cb,
+ IN ULONG ulOffset
+ ) = 0;
+};
+
+//--------------------------------------------------------------------------
+// ImageCodecInfo structure
+//--------------------------------------------------------------------------
+
+class ImageCodecInfo
+{
+public:
+ CLSID Clsid;
+ GUID FormatID;
+ const WCHAR* CodecName;
+ const WCHAR* DllName;
+ const WCHAR* FormatDescription;
+ const WCHAR* FilenameExtension;
+ const WCHAR* MimeType;
+ DWORD Flags;
+ DWORD Version;
+ DWORD SigCount;
+ DWORD SigSize;
+ const BYTE* SigPattern;
+ const BYTE* SigMask;
+};
+
+//--------------------------------------------------------------------------
+// Information flags about image codecs
+//--------------------------------------------------------------------------
+
+enum ImageCodecFlags
+{
+ ImageCodecFlagsEncoder = 0x00000001,
+ ImageCodecFlagsDecoder = 0x00000002,
+ ImageCodecFlagsSupportBitmap = 0x00000004,
+ ImageCodecFlagsSupportVector = 0x00000008,
+ ImageCodecFlagsSeekableEncode = 0x00000010,
+ ImageCodecFlagsBlockingDecode = 0x00000020,
+
+ ImageCodecFlagsBuiltin = 0x00010000,
+ ImageCodecFlagsSystem = 0x00020000,
+ ImageCodecFlagsUser = 0x00040000
+};
+
+//---------------------------------------------------------------------------
+// Access modes used when calling Image::LockBits
+//---------------------------------------------------------------------------
+
+enum ImageLockMode
+{
+ ImageLockModeRead = 0x0001,
+ ImageLockModeWrite = 0x0002,
+ ImageLockModeUserInputBuf= 0x0004
+};
+
+//---------------------------------------------------------------------------
+// Information about image pixel data
+//---------------------------------------------------------------------------
+
+class BitmapData
+{
+public:
+ UINT Width;
+ UINT Height;
+ INT Stride;
+ PixelFormat PixelFormat;
+ VOID* Scan0;
+ UINT_PTR Reserved;
+};
+
+//---------------------------------------------------------------------------
+// Image flags
+//---------------------------------------------------------------------------
+
+enum ImageFlags
+{
+ ImageFlagsNone = 0,
+
+ // Low-word: shared with SINKFLAG_x
+
+ ImageFlagsScalable = 0x0001,
+ ImageFlagsHasAlpha = 0x0002,
+ ImageFlagsHasTranslucent = 0x0004,
+ ImageFlagsPartiallyScalable = 0x0008,
+
+ // Low-word: color space definition
+
+ ImageFlagsColorSpaceRGB = 0x0010,
+ ImageFlagsColorSpaceCMYK = 0x0020,
+ ImageFlagsColorSpaceGRAY = 0x0040,
+ ImageFlagsColorSpaceYCBCR = 0x0080,
+ ImageFlagsColorSpaceYCCK = 0x0100,
+
+ // Low-word: image size info
+
+ ImageFlagsHasRealDPI = 0x1000,
+ ImageFlagsHasRealPixelSize = 0x2000,
+
+ // High-word
+
+ ImageFlagsReadOnly = 0x00010000,
+ ImageFlagsCaching = 0x00020000
+};
+
+enum RotateFlipType
+{
+ RotateNoneFlipNone = 0,
+ Rotate90FlipNone = 1,
+ Rotate180FlipNone = 2,
+ Rotate270FlipNone = 3,
+
+ RotateNoneFlipX = 4,
+ Rotate90FlipX = 5,
+ Rotate180FlipX = 6,
+ Rotate270FlipX = 7,
+
+ RotateNoneFlipY = Rotate180FlipX,
+ Rotate90FlipY = Rotate270FlipX,
+ Rotate180FlipY = RotateNoneFlipX,
+ Rotate270FlipY = Rotate90FlipX,
+
+ RotateNoneFlipXY = Rotate180FlipNone,
+ Rotate90FlipXY = Rotate270FlipNone,
+ Rotate180FlipXY = RotateNoneFlipNone,
+ Rotate270FlipXY = Rotate90FlipNone
+};
+
+//---------------------------------------------------------------------------
+// Encoder Parameter structure
+//---------------------------------------------------------------------------
+class EncoderParameter
+{
+public:
+ GUID Guid; // GUID of the parameter
+ ULONG NumberOfValues; // Number of the parameter values
+ ULONG Type; // Value type, like ValueTypeLONG etc.
+ VOID* Value; // A pointer to the parameter values
+};
+
+//---------------------------------------------------------------------------
+// Encoder Parameters structure
+//---------------------------------------------------------------------------
+class EncoderParameters
+{
+public:
+ UINT Count; // Number of parameters in this structure
+ EncoderParameter Parameter[1]; // Parameter values
+};
+
+//---------------------------------------------------------------------------
+// Property Item
+//---------------------------------------------------------------------------
+class PropertyItem
+{
+public:
+ PROPID id; // ID of this property
+ ULONG length; // Length of the property value, in bytes
+ WORD type; // Type of the value, as one of TAG_TYPE_XXX
+ // defined above
+ VOID* value; // property value
+};
+
+#ifdef DCR_USE_NEW_140857
+//---------------------------------------------------------------------------
+// Image property types
+//---------------------------------------------------------------------------
+#define PropertyTagTypeByte 1
+#define PropertyTagTypeASCII 2
+#define PropertyTagTypeShort 3
+#define PropertyTagTypeLong 4
+#define PropertyTagTypeRational 5
+#define PropertyTagTypeUndefined 7
+#define PropertyTagTypeSLONG 9
+#define PropertyTagTypeSRational 10
+#endif
+
+//---------------------------------------------------------------------------
+// Image property ID tags
+//---------------------------------------------------------------------------
+
+#define PropertyTagExifIFD 0x8769
+#define PropertyTagGpsIFD 0x8825
+
+#define PropertyTagNewSubfileType 0x00FE
+#define PropertyTagSubfileType 0x00FF
+#define PropertyTagImageWidth 0x0100
+#define PropertyTagImageHeight 0x0101
+#define PropertyTagBitsPerSample 0x0102
+#define PropertyTagCompression 0x0103
+#define PropertyTagPhotometricInterp 0x0106
+#define PropertyTagThreshHolding 0x0107
+#define PropertyTagCellWidth 0x0108
+#define PropertyTagCellHeight 0x0109
+#define PropertyTagFillOrder 0x010A
+#define PropertyTagDocumentName 0x010D
+#define PropertyTagImageDescription 0x010E
+#define PropertyTagEquipMake 0x010F
+#define PropertyTagEquipModel 0x0110
+#define PropertyTagStripOffsets 0x0111
+#define PropertyTagOrientation 0x0112
+#define PropertyTagSamplesPerPixel 0x0115
+#define PropertyTagRowsPerStrip 0x0116
+#define PropertyTagStripBytesCount 0x0117
+#define PropertyTagMinSampleValue 0x0118
+#define PropertyTagMaxSampleValue 0x0119
+#define PropertyTagXResolution 0x011A // Image resolution in width direction
+#define PropertyTagYResolution 0x011B // Image resolution in height direction
+#define PropertyTagPlanarConfig 0x011C // Image data arrangement
+#define PropertyTagPageName 0x011D
+#define PropertyTagXPosition 0x011E
+#define PropertyTagYPosition 0x011F
+#define PropertyTagFreeOffset 0x0120
+#define PropertyTagFreeByteCounts 0x0121
+#define PropertyTagGrayResponseUnit 0x0122
+#define PropertyTagGrayResponseCurve 0x0123
+#define PropertyTagT4Option 0x0124
+#define PropertyTagT6Option 0x0125
+#define PropertyTagResolutionUnit 0x0128 // Unit of X and Y resolution
+#define PropertyTagPageNumber 0x0129
+#define PropertyTagTransferFuncition 0x012D
+#define PropertyTagSoftwareUsed 0x0131
+#define PropertyTagDateTime 0x0132
+#define PropertyTagArtist 0x013B
+#define PropertyTagHostComputer 0x013C
+#define PropertyTagPredictor 0x013D
+#define PropertyTagWhitePoint 0x013E
+#define PropertyTagPrimaryChromaticities 0x013F
+#define PropertyTagColorMap 0x0140
+#define PropertyTagHalftoneHints 0x0141
+#define PropertyTagTileWidth 0x0142
+#define PropertyTagTileLength 0x0143
+#define PropertyTagTileOffset 0x0144
+#define PropertyTagTileByteCounts 0x0145
+#define PropertyTagInkSet 0x014C
+#define PropertyTagInkNames 0x014D
+#define PropertyTagNumberOfInks 0x014E
+#define PropertyTagDotRange 0x0150
+#define PropertyTagTargetPrinter 0x0151
+#define PropertyTagExtraSamples 0x0152
+#define PropertyTagSampleFormat 0x0153
+#define PropertyTagSMinSampleValue 0x0154
+#define PropertyTagSMaxSampleValue 0x0155
+#define PropertyTagTransferRange 0x0156
+
+#define PropertyTagJPEGProc 0x0200
+#define PropertyTagJPEGInterFormat 0x0201
+#define PropertyTagJPEGInterLength 0x0202
+#define PropertyTagJPEGRestartInterval 0x0203
+#define PropertyTagJPEGLosslessPredictors 0x0205
+#define PropertyTagJPEGPointTransforms 0x0206
+#define PropertyTagJPEGQTables 0x0207
+#define PropertyTagJPEGDCTables 0x0208
+#define PropertyTagJPEGACTables 0x0209
+
+#define PropertyTagYCbCrCoefficients 0x0211
+#define PropertyTagYCbCrSubsampling 0x0212
+#define PropertyTagYCbCrPositioning 0x0213
+#define PropertyTagREFBlackWhite 0x0214
+
+#define PropertyTagICCProfile 0x8773 // This TAG is defined by ICC
+ // for embedded ICC in TIFF
+#define PropertyTagGamma 0x0301
+#define PropertyTagICCProfileDescriptor 0x0302
+#define PropertyTagSRGBRenderingIntent 0x0303
+
+#define PropertyTagImageTitle 0x0320
+#define PropertyTagCopyright 0x8298
+
+// Extra TAGs (Like Adobe Image Information tags etc.)
+
+#define PropertyTagResolutionXUnit 0x5001
+#define PropertyTagResolutionYUnit 0x5002
+#define PropertyTagResolutionXLengthUnit 0x5003
+#define PropertyTagResolutionYLengthUnit 0x5004
+#define PropertyTagPrintFlags 0x5005
+#define PropertyTagPrintFlagsVersion 0x5006
+#define PropertyTagPrintFlagsCrop 0x5007
+#define PropertyTagPrintFlagsBleedWidth 0x5008
+#define PropertyTagPrintFlagsBleedWidthScale 0x5009
+#define PropertyTagHalftoneLPI 0x500A
+#define PropertyTagHalftoneLPIUnit 0x500B
+#define PropertyTagHalftoneDegree 0x500C
+#define PropertyTagHalftoneShape 0x500D
+#define PropertyTagHalftoneMisc 0x500E
+#define PropertyTagHalftoneScreen 0x500F
+#define PropertyTagJPEGQuality 0x5010
+#define PropertyTagGridSize 0x5011
+#define PropertyTagThumbnailFormat 0x5012 // 1 = JPEG, 0 = RAW RGB
+#define PropertyTagThumbnailWidth 0x5013
+#define PropertyTagThumbnailHeight 0x5014
+#define PropertyTagThumbnailColorDepth 0x5015
+#define PropertyTagThumbnailPlanes 0x5016
+#define PropertyTagThumbnailRawBytes 0x5017
+#define PropertyTagThumbnailSize 0x5018
+#define PropertyTagThumbnailCompressedSize 0x5019
+#define PropertyTagColorTransferFunction 0x501A
+#define PropertyTagThumbnailData 0x501B// RAW thumbnail bits in
+ // JPEG format or RGB format
+ // depends on
+ // PropertyTagThumbnailFormat
+
+// Thumbnail related TAGs
+
+#define PropertyTagThumbnailImageWidth 0x5020 // Thumbnail width
+#define PropertyTagThumbnailImageHeight 0x5021 // Thumbnail height
+#define PropertyTagThumbnailBitsPerSample 0x5022 // Number of bits per
+ // component
+#define PropertyTagThumbnailCompression 0x5023 // Compression Scheme
+#define PropertyTagThumbnailPhotometricInterp 0x5024 // Pixel composition
+#define PropertyTagThumbnailImageDescription 0x5025 // Image Tile
+#define PropertyTagThumbnailEquipMake 0x5026 // Manufacturer of Image
+ // Input equipment
+#define PropertyTagThumbnailEquipModel 0x5027 // Model of Image input
+ // equipment
+#define PropertyTagThumbnailStripOffsets 0x5028 // Image data location
+#define PropertyTagThumbnailOrientation 0x5029 // Orientation of image
+#define PropertyTagThumbnailSamplesPerPixel 0x502A // Number of components
+#define PropertyTagThumbnailRowsPerStrip 0x502B // Number of rows per strip
+#define PropertyTagThumbnailStripBytesCount 0x502C // Bytes per compressed
+ // strip
+#define PropertyTagThumbnailResolutionX 0x502D // Resolution in width
+ // direction
+#define PropertyTagThumbnailResolutionY 0x502E // Resolution in height
+ // direction
+#define PropertyTagThumbnailPlanarConfig 0x502F // Image data arrangement
+#define PropertyTagThumbnailResolutionUnit 0x5030 // Unit of X and Y
+ // Resolution
+#define PropertyTagThumbnailTransferFunction 0x5031 // Transfer function
+#define PropertyTagThumbnailSoftwareUsed 0x5032 // Software used
+#define PropertyTagThumbnailDateTime 0x5033 // File change date and
+ // time
+#define PropertyTagThumbnailArtist 0x5034 // Person who created the
+ // image
+#define PropertyTagThumbnailWhitePoint 0x5035 // White point chromaticity
+#define PropertyTagThumbnailPrimaryChromaticities 0x5036
+ // Chromaticities of
+ // primaries
+#define PropertyTagThumbnailYCbCrCoefficients 0x5037 // Color space transforma-
+ // tion coefficients
+#define PropertyTagThumbnailYCbCrSubsampling 0x5038 // Subsampling ratio of Y
+ // to C
+#define PropertyTagThumbnailYCbCrPositioning 0x5039 // Y and C position
+#define PropertyTagThumbnailRefBlackWhite 0x503A // Pair of black and white
+ // reference values
+#define PropertyTagThumbnailCopyRight 0x503B // CopyRight holder
+
+#define PropertyTagLuminanceTable 0x5090
+#define PropertyTagChrominanceTable 0x5091
+
+#define PropertyTagFrameDelay 0x5100
+#define PropertyTagLoopCount 0x5101
+
+#define PropertyTagPixelUnit 0x5110 // Unit specifier for pixel/unit
+#define PropertyTagPixelPerUnitX 0x5111 // Pixels per unit in X
+#define PropertyTagPixelPerUnitY 0x5112 // Pixels per unit in Y
+#define PropertyTagPaletteHistogram 0x5113 // Palette histogram
+
+// EXIF specific tag
+
+#define PropertyTagExifExposureTime 0x829A
+#define PropertyTagExifFNumber 0x829D
+
+#define PropertyTagExifExposureProg 0x8822
+#define PropertyTagExifSpectralSense 0x8824
+#define PropertyTagExifISOSpeed 0x8827
+#define PropertyTagExifOECF 0x8828
+
+#define PropertyTagExifVer 0x9000
+#define PropertyTagExifDTOrig 0x9003 // Date & time of original
+#define PropertyTagExifDTDigitized 0x9004 // Date & time of digital data generation
+
+#define PropertyTagExifCompConfig 0x9101
+#define PropertyTagExifCompBPP 0x9102
+
+#define PropertyTagExifShutterSpeed 0x9201
+#define PropertyTagExifAperture 0x9202
+#define PropertyTagExifBrightness 0x9203
+#define PropertyTagExifExposureBias 0x9204
+#define PropertyTagExifMaxAperture 0x9205
+#define PropertyTagExifSubjectDist 0x9206
+#define PropertyTagExifMeteringMode 0x9207
+#define PropertyTagExifLightSource 0x9208
+#define PropertyTagExifFlash 0x9209
+#define PropertyTagExifFocalLength 0x920A
+#define PropertyTagExifMakerNote 0x927C
+#define PropertyTagExifUserComment 0x9286
+#define PropertyTagExifDTSubsec 0x9290 // Date & Time subseconds
+#define PropertyTagExifDTOrigSS 0x9291 // Date & Time original subseconds
+#define PropertyTagExifDTDigSS 0x9292 // Date & TIme digitized subseconds
+
+#define PropertyTagExifFPXVer 0xA000
+#define PropertyTagExifColorSpace 0xA001
+#define PropertyTagExifPixXDim 0xA002
+#define PropertyTagExifPixYDim 0xA003
+#define PropertyTagExifRelatedWav 0xA004 // related sound file
+#define PropertyTagExifInterop 0xA005
+#define PropertyTagExifFlashEnergy 0xA20B
+#define PropertyTagExifSpatialFR 0xA20C // Spatial Frequency Response
+#define PropertyTagExifFocalXRes 0xA20E // Focal Plane X Resolution
+#define PropertyTagExifFocalYRes 0xA20F // Focal Plane Y Resolution
+#define PropertyTagExifFocalResUnit 0xA210 // Focal Plane Resolution Unit
+#define PropertyTagExifSubjectLoc 0xA214
+#define PropertyTagExifExposureIndex 0xA215
+#define PropertyTagExifSensingMethod 0xA217
+#define PropertyTagExifFileSource 0xA300
+#define PropertyTagExifSceneType 0xA301
+#define PropertyTagExifCfaPattern 0xA302
+
+#define PropertyTagGpsVer 0x0000
+#define PropertyTagGpsLatitudeRef 0x0001
+#define PropertyTagGpsLatitude 0x0002
+#define PropertyTagGpsLongitudeRef 0x0003
+#define PropertyTagGpsLongitude 0x0004
+#define PropertyTagGpsAltitudeRef 0x0005
+#define PropertyTagGpsAltitude 0x0006
+#define PropertyTagGpsGpsTime 0x0007
+#define PropertyTagGpsGpsSatellites 0x0008
+#define PropertyTagGpsGpsStatus 0x0009
+#define PropertyTagGpsGpsMeasureMode 0x00A
+#define PropertyTagGpsGpsDop 0x000B // Measurement precision
+#define PropertyTagGpsSpeedRef 0x000C
+#define PropertyTagGpsSpeed 0x000D
+#define PropertyTagGpsTrackRef 0x000E
+#define PropertyTagGpsTrack 0x000F
+#define PropertyTagGpsImgDirRef 0x0010
+#define PropertyTagGpsImgDir 0x0011
+#define PropertyTagGpsMapDatum 0x0012
+#define PropertyTagGpsDestLatRef 0x0013
+#define PropertyTagGpsDestLat 0x0014
+#define PropertyTagGpsDestLongRef 0x0015
+#define PropertyTagGpsDestLong 0x0016
+#define PropertyTagGpsDestBearRef 0x0017
+#define PropertyTagGpsDestBear 0x0018
+#define PropertyTagGpsDestDistRef 0x0019
+#define PropertyTagGpsDestDist 0x001A
+
+#endif
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusLineCaps.h b/core/src/fxge/Microsoft SDK/include/GdiPlusLineCaps.h
new file mode 100644
index 0000000000..e8a2951f43
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusLineCaps.h
@@ -0,0 +1,253 @@
+/**************************************************************************\
+*
+* Copyright (c) 2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusLineCaps.h
+*
+* Abstract:
+*
+* APIs for Custom Line Caps
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUSLINECAPS_H
+#define _GDIPLUSLINECAPS_H
+
+inline
+CustomLineCap::CustomLineCap(
+ IN const GraphicsPath* fillPath,
+ IN const GraphicsPath* strokePath,
+ IN LineCap baseCap,
+ IN REAL baseInset
+ )
+{
+ nativeCap = NULL;
+ GpPath* nativeFillPath = NULL;
+ GpPath* nativeStrokePath = NULL;
+
+ if(fillPath)
+ nativeFillPath = fillPath->nativePath;
+ if(strokePath)
+ nativeStrokePath = strokePath->nativePath;
+
+ lastResult = DllExports::GdipCreateCustomLineCap(
+ nativeFillPath, nativeStrokePath,
+ baseCap, baseInset, &nativeCap);
+}
+
+inline
+CustomLineCap::CustomLineCap()
+{
+ // This is used for default constructor for subclasses.
+ // So don't create a nativeCap.
+
+ nativeCap = NULL;
+ lastResult = Ok;
+}
+
+inline
+CustomLineCap::~CustomLineCap()
+{
+ DllExports::GdipDeleteCustomLineCap(nativeCap);
+}
+
+inline Status
+CustomLineCap::SetStrokeCaps(
+ IN LineCap startCap,
+ IN LineCap endCap)
+{
+ return SetStatus(DllExports::GdipSetCustomLineCapStrokeCaps(nativeCap,
+ startCap, endCap));
+}
+
+inline Status
+CustomLineCap::GetStrokeCaps(
+ OUT LineCap* startCap,
+ OUT LineCap* endCap) const
+{
+ return SetStatus(DllExports::GdipGetCustomLineCapStrokeCaps(nativeCap,
+ startCap, endCap));
+}
+
+inline Status
+CustomLineCap::SetStrokeJoin(
+ IN LineJoin lineJoin)
+{
+ return SetStatus(DllExports::GdipSetCustomLineCapStrokeJoin(nativeCap, lineJoin));
+}
+
+inline LineJoin
+CustomLineCap::GetStrokeJoin() const
+{
+ LineJoin lineJoin;
+
+ SetStatus(DllExports::GdipGetCustomLineCapStrokeJoin(nativeCap, &lineJoin));
+
+ return lineJoin;
+}
+
+inline Status
+CustomLineCap::SetBaseCap(IN LineCap baseCap)
+{
+ return SetStatus(DllExports::GdipSetCustomLineCapBaseCap(nativeCap, baseCap));
+}
+
+inline LineCap
+CustomLineCap::GetBaseCap() const
+{
+ LineCap baseCap;
+ SetStatus(DllExports::GdipGetCustomLineCapBaseCap(nativeCap, &baseCap));
+
+ return baseCap;
+}
+
+inline Status
+CustomLineCap::SetBaseInset(IN REAL inset)
+{
+ return SetStatus(DllExports::GdipSetCustomLineCapBaseInset(nativeCap, inset));
+}
+
+inline REAL
+CustomLineCap::GetBaseInset() const
+{
+ REAL inset;
+ SetStatus(DllExports::GdipGetCustomLineCapBaseInset(nativeCap, &inset));
+
+ return inset;
+}
+
+
+inline Status
+CustomLineCap::SetWidthScale(IN REAL widthScale)
+{
+ return SetStatus(DllExports::GdipSetCustomLineCapWidthScale(nativeCap, widthScale));
+}
+
+inline REAL
+CustomLineCap::GetWidthScale() const
+{
+ REAL widthScale;
+ SetStatus(DllExports::GdipGetCustomLineCapWidthScale(nativeCap, &widthScale));
+
+ return widthScale;
+}
+
+inline CustomLineCap*
+CustomLineCap::Clone() const
+{
+ GpCustomLineCap *newNativeLineCap = NULL;
+
+ SetStatus(DllExports::GdipCloneCustomLineCap(nativeCap, &newNativeLineCap));
+
+ if (lastResult == Ok)
+ {
+ CustomLineCap *newLineCap = new CustomLineCap(newNativeLineCap, lastResult);
+ if (newLineCap == NULL)
+ {
+ SetStatus(DllExports::GdipDeleteCustomLineCap(newNativeLineCap));
+ }
+
+ return newLineCap;
+ }
+
+ return NULL;
+}
+
+class AdjustableArrowCap : public CustomLineCap
+{
+public:
+
+ AdjustableArrowCap(
+ IN REAL height,
+ IN REAL width,
+ IN BOOL isFilled = TRUE
+ )
+ {
+ GpAdjustableArrowCap* cap = NULL;
+
+ lastResult = DllExports::GdipCreateAdjustableArrowCap(
+ height, width, isFilled, &cap);
+ SetNativeCap(cap);
+ }
+
+ Status SetHeight(IN REAL height)
+ {
+ GpAdjustableArrowCap* cap = (GpAdjustableArrowCap*) nativeCap;
+ return SetStatus(DllExports::GdipSetAdjustableArrowCapHeight(
+ cap, height));
+ }
+
+ REAL GetHeight() const
+ {
+ GpAdjustableArrowCap* cap = (GpAdjustableArrowCap*) nativeCap;
+ REAL height;
+ SetStatus(DllExports::GdipGetAdjustableArrowCapHeight(
+ cap, &height));
+
+ return height;
+ }
+
+ Status SetWidth(IN REAL width)
+ {
+ GpAdjustableArrowCap* cap = (GpAdjustableArrowCap*) nativeCap;
+ return SetStatus(DllExports::GdipSetAdjustableArrowCapWidth(
+ cap, width));
+ }
+
+ REAL GetWidth() const
+ {
+ GpAdjustableArrowCap* cap = (GpAdjustableArrowCap*) nativeCap;
+ REAL width;
+ SetStatus(DllExports::GdipGetAdjustableArrowCapWidth(
+ cap, &width));
+
+ return width;
+ }
+
+ Status SetMiddleInset(IN REAL middleInset)
+ {
+ GpAdjustableArrowCap* cap = (GpAdjustableArrowCap*) nativeCap;
+ return SetStatus(DllExports::GdipSetAdjustableArrowCapMiddleInset(
+ cap, middleInset));
+ }
+
+ REAL GetMiddleInset() const
+ {
+ GpAdjustableArrowCap* cap = (GpAdjustableArrowCap*) nativeCap;
+ REAL middleInset;
+ SetStatus(DllExports::GdipGetAdjustableArrowCapMiddleInset(
+ cap, &middleInset));
+
+ return middleInset;
+ }
+
+ Status SetFillState(IN BOOL isFilled)
+ {
+ GpAdjustableArrowCap* cap = (GpAdjustableArrowCap*) nativeCap;
+ return SetStatus(DllExports::GdipSetAdjustableArrowCapFillState(
+ cap, isFilled));
+ }
+
+ BOOL IsFilled() const
+ {
+ GpAdjustableArrowCap* cap = (GpAdjustableArrowCap*) nativeCap;
+ BOOL isFilled;
+ SetStatus(DllExports::GdipGetAdjustableArrowCapFillState(
+ cap, &isFilled));
+
+ return isFilled;
+ }
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ AdjustableArrowCap(const AdjustableArrowCap &);
+ AdjustableArrowCap& operator=(const AdjustableArrowCap &);
+
+#endif
+
+};
+
+#endif
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusMatrix.h b/core/src/fxge/Microsoft SDK/include/GdiPlusMatrix.h
new file mode 100644
index 0000000000..7fa3df8cd1
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusMatrix.h
@@ -0,0 +1,309 @@
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusMatrix.h
+*
+* Abstract:
+*
+* GDI+ Matrix class
+*
+\**************************************************************************/
+
+class Matrix : public GdiplusBase
+{
+public:
+ friend class Graphics;
+ friend class GraphicsPath;
+ friend class TextureBrush;
+ friend class LinearGradientBrush;
+ friend class PathGradientBrush;
+ friend class Pen;
+ friend class Region;
+
+ // Default constructor - set to identity matrix
+
+ Matrix()
+ {
+ GpMatrix *matrix = NULL;
+
+ lastResult = DllExports::GdipCreateMatrix(&matrix);
+
+ SetNativeMatrix(matrix);
+ }
+
+ Matrix(IN REAL m11,
+ IN REAL m12,
+ IN REAL m21,
+ IN REAL m22,
+ IN REAL dx,
+ IN REAL dy)
+ {
+ GpMatrix *matrix = NULL;
+
+ lastResult = DllExports::GdipCreateMatrix2(m11, m12, m21, m22,
+ dx, dy, &matrix);
+
+ SetNativeMatrix(matrix);
+ }
+
+ Matrix(IN const RectF& rect,
+ IN const PointF* dstplg)
+ {
+ GpMatrix *matrix = NULL;
+
+ lastResult = DllExports::GdipCreateMatrix3(&rect,
+ dstplg,
+ &matrix);
+
+ SetNativeMatrix(matrix);
+ }
+
+ Matrix(IN const Rect& rect,
+ IN const Point* dstplg)
+ {
+ GpMatrix *matrix = NULL;
+
+ lastResult = DllExports::GdipCreateMatrix3I(&rect,
+ dstplg,
+ &matrix);
+
+ SetNativeMatrix(matrix);
+ }
+
+ ~Matrix()
+ {
+ DllExports::GdipDeleteMatrix(nativeMatrix);
+ }
+
+ Matrix *Clone() const
+ {
+ GpMatrix *cloneMatrix = NULL;
+
+ SetStatus(DllExports::GdipCloneMatrix(nativeMatrix,
+ &cloneMatrix));
+
+ if (lastResult != Ok)
+ return NULL;
+
+ return new Matrix(cloneMatrix);
+ }
+
+ Status GetElements(OUT REAL *m) const
+ {
+ return SetStatus(DllExports::GdipGetMatrixElements(nativeMatrix, m));
+ }
+
+ Status SetElements(IN REAL m11,
+ IN REAL m12,
+ IN REAL m21,
+ IN REAL m22,
+ IN REAL dx,
+ IN REAL dy)
+ {
+ return SetStatus(DllExports::GdipSetMatrixElements(nativeMatrix,
+ m11, m12, m21, m22, dx, dy));
+ }
+
+ REAL OffsetX() const
+ {
+ REAL elements[6];
+
+ if (GetElements(&elements[0]) == Ok)
+ return elements[4];
+ else
+ return 0.0f;
+ }
+
+ REAL OffsetY() const
+ {
+ REAL elements[6];
+
+ if (GetElements(&elements[0]) == Ok)
+ return elements[5];
+ else
+ return 0.0f;
+ }
+
+ Status Reset()
+ {
+ // set identity matrix elements
+ return SetStatus(DllExports::GdipSetMatrixElements(nativeMatrix,
+ 1.0, 0.0, 0.0, 1.0, 0.0, 0.0));
+ }
+
+ Status Multiply(IN const Matrix *matrix,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipMultiplyMatrix(nativeMatrix,
+ matrix->nativeMatrix,
+ order));
+ }
+
+ Status Translate(IN REAL offsetX,
+ IN REAL offsetY,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipTranslateMatrix(nativeMatrix, offsetX, offsetY, order));
+ }
+
+ Status Scale(IN REAL scaleX,
+ IN REAL scaleY,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipScaleMatrix(nativeMatrix, scaleX, scaleY, order));
+ }
+
+ Status Rotate(IN REAL angle,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipRotateMatrix(nativeMatrix, angle, order));
+ }
+
+ Status RotateAt(IN REAL angle,
+ IN const PointF& center,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ if(order == MatrixOrderPrepend)
+ {
+ SetStatus(DllExports::GdipTranslateMatrix(nativeMatrix, center.X, center.Y, order));
+ SetStatus(DllExports::GdipRotateMatrix(nativeMatrix, angle, order));
+ return SetStatus(DllExports::GdipTranslateMatrix(nativeMatrix, - center.X, - center.Y, order));
+ }
+ else
+ {
+ SetStatus(DllExports::GdipTranslateMatrix(nativeMatrix, - center.X, - center.Y, order));
+ SetStatus(DllExports::GdipRotateMatrix(nativeMatrix, angle, order));
+ return SetStatus(DllExports::GdipTranslateMatrix(nativeMatrix, center.X, center.Y, order));
+ }
+ }
+
+ Status Shear(IN REAL shearX,
+ IN REAL shearY,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipShearMatrix(nativeMatrix, shearX, shearY, order));
+ }
+
+ Status Invert()
+ {
+ return SetStatus(DllExports::GdipInvertMatrix(nativeMatrix));
+ }
+
+ // float version
+ Status TransformPoints(IN OUT PointF* pts,
+ IN INT count = 1) const
+ {
+ return SetStatus(DllExports::GdipTransformMatrixPoints(nativeMatrix, pts, count));
+ }
+
+ Status TransformPoints(IN OUT Point* pts,
+ IN INT count = 1) const
+ {
+ return SetStatus(DllExports::GdipTransformMatrixPointsI(nativeMatrix,
+ pts,
+ count));
+ }
+
+ Status TransformVectors(IN OUT PointF* pts,
+ IN INT count = 1) const
+ {
+ return SetStatus(DllExports::GdipVectorTransformMatrixPoints(nativeMatrix, pts, count));
+ }
+
+ Status TransformVectors(IN OUT Point* pts,
+ IN INT count = 1) const
+ {
+ return SetStatus(DllExports::GdipVectorTransformMatrixPointsI(nativeMatrix,
+ pts,
+ count));
+ }
+
+ BOOL IsInvertible() const
+ {
+ BOOL result = FALSE;
+
+ SetStatus(DllExports::GdipIsMatrixInvertible(nativeMatrix, &result));
+
+ return result;
+ }
+
+ BOOL IsIdentity() const
+ {
+ BOOL result = FALSE;
+
+ SetStatus(DllExports::GdipIsMatrixIdentity(nativeMatrix, &result));
+
+ return result;
+ }
+
+ BOOL Equals(IN const Matrix *matrix) const
+ {
+ BOOL result = FALSE;
+
+ SetStatus(DllExports::GdipIsMatrixEqual(nativeMatrix,
+ matrix->nativeMatrix, &result));
+
+ return result;
+ }
+
+ Status GetLastStatus() const
+ {
+ Status lastStatus = lastResult;
+ lastResult = Ok;
+
+ return lastStatus;
+ }
+
+protected:
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ Matrix(const Matrix &);
+ Matrix& operator=(const Matrix &);
+protected:
+
+#else
+
+ Matrix(const Matrix& matrix)
+ {
+ matrix;
+ SetStatus(NotImplemented);
+ SetNativeMatrix(NULL);
+ }
+
+ Matrix& operator=(const Matrix& matrix)
+ {
+ matrix;
+ SetStatus(NotImplemented);
+ return *this;
+ }
+
+#endif
+
+ Matrix(GpMatrix *nativeMatrix)
+ {
+ lastResult = Ok;
+ SetNativeMatrix(nativeMatrix);
+ }
+
+ VOID SetNativeMatrix(GpMatrix *nativeMatrix)
+ {
+ this->nativeMatrix = nativeMatrix;
+ }
+
+ Status SetStatus(Status status) const
+ {
+ if (status != Ok)
+ return (lastResult = status);
+ else
+ return status;
+ }
+
+protected:
+ GpMatrix *nativeMatrix;
+ mutable Status lastResult;
+};
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusMem.h b/core/src/fxge/Microsoft SDK/include/GdiPlusMem.h
new file mode 100644
index 0000000000..5f92c1e141
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusMem.h
@@ -0,0 +1,49 @@
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusMem.h
+*
+* Abstract:
+*
+* Flat GDI+ Memory Allocators - header file
+*
+\**************************************************************************/
+
+// TODO: this file style needs to be made internally consistent with the way
+// it handles breaking the long argument lists across multiple lines
+
+#ifndef _GDIPLUSMEM_H
+#define _GDIPLUSMEM_H
+
+#define WINGDIPAPI __stdcall
+
+// currently, only C++ wrapper API's force const.
+
+#ifdef _GDIPLUS_H
+#define GDIPCONST const
+#else
+#define GDIPCONST
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+//----------------------------------------------------------------------------
+// Memory Allocation APIs
+//----------------------------------------------------------------------------
+
+void* WINGDIPAPI
+GdipAlloc(size_t size);
+
+void WINGDIPAPI
+GdipFree(void* ptr);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // !_GDIPLUSMEM_H
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusMetaFile.h b/core/src/fxge/Microsoft SDK/include/GdiPlusMetaFile.h
new file mode 100644
index 0000000000..3d07dd64d3
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusMetaFile.h
@@ -0,0 +1,374 @@
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusMetafile.h
+*
+* Abstract:
+*
+* Metafile related declarations
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUSMETAFILE_H
+#define _GDIPLUSMETAFILE_H
+
+class Metafile : public Image
+{
+public:
+ friend class Image;
+
+ // Read a metafile
+ Metafile()
+ {
+ SetNativeImage(NULL);
+ lastResult = Ok;
+ }
+
+ // Playback a metafile from a HMETAFILE
+ // If deleteWmf is TRUE, then when the metafile is deleted,
+ // the hWmf will also be deleted. Otherwise, it won't be.
+ Metafile(IN HMETAFILE hWmf,
+ IN const APMFileHeader * apmFileHeader,
+ IN BOOL deleteWmf = FALSE)
+ {
+ GpMetafile * metafile = NULL;
+
+ lastResult = DllExports::GdipCreateMetafileFromWmf(hWmf, deleteWmf, apmFileHeader, &metafile);
+
+ SetNativeImage(metafile);
+ }
+
+ // Playback a metafile from a HENHMETAFILE
+ // If deleteEmf is TRUE, then when the metafile is deleted,
+ // the hEmf will also be deleted. Otherwise, it won't be.
+ Metafile(IN HENHMETAFILE hEmf,
+ IN BOOL deleteEmf = FALSE)
+ {
+ GpMetafile * metafile = NULL;
+
+ lastResult = DllExports::GdipCreateMetafileFromEmf(hEmf, deleteEmf, &metafile);
+
+ SetNativeImage(metafile);
+ }
+
+ // Playback a metafile from a file
+ Metafile(IN const WCHAR* filename)
+ {
+ GpMetafile * metafile = NULL;
+
+ lastResult = DllExports::GdipCreateMetafileFromFile(filename, &metafile);
+
+ SetNativeImage(metafile);
+ }
+
+ // Playback a WMF metafile from a file
+ Metafile(IN const WCHAR* filename,
+ IN const APMFileHeader * apmFileHeader
+ )
+ {
+ GpMetafile * metafile = NULL;
+
+ lastResult = DllExports::GdipCreateMetafileFromWmfFile(filename, apmFileHeader, &metafile);
+
+ SetNativeImage(metafile);
+ }
+
+ // Playback a metafile from a stream
+ Metafile(IN IStream* stream)
+ {
+ GpMetafile * metafile = NULL;
+
+ lastResult = DllExports::GdipCreateMetafileFromStream(stream, &metafile);
+
+ SetNativeImage(metafile);
+ }
+
+ // Record a metafile to memory
+ Metafile(
+ IN HDC referenceHdc,
+ IN EmfType type = EmfTypeEmfPlusDual,
+ IN const WCHAR * description = NULL
+ )
+ {
+ GpMetafile * metafile = NULL;
+
+ lastResult = DllExports::GdipRecordMetafile(
+ referenceHdc, type, NULL, MetafileFrameUnitGdi,
+ description, &metafile);
+
+ SetNativeImage(metafile);
+ }
+
+ // Record a metafile to memory
+ Metafile(
+ IN HDC referenceHdc,
+ IN const RectF & frameRect,
+ IN MetafileFrameUnit frameUnit = MetafileFrameUnitGdi,
+ IN EmfType type = EmfTypeEmfPlusDual,
+ IN const WCHAR * description = NULL
+ )
+ {
+ GpMetafile * metafile = NULL;
+
+ lastResult = DllExports::GdipRecordMetafile(
+ referenceHdc, type, &frameRect, frameUnit,
+ description, &metafile);
+
+ SetNativeImage(metafile);
+ }
+
+ // Record a metafile to memory
+ Metafile(
+ IN HDC referenceHdc,
+ IN const Rect & frameRect,
+ IN MetafileFrameUnit frameUnit = MetafileFrameUnitGdi,
+ IN EmfType type = EmfTypeEmfPlusDual,
+ IN const WCHAR * description = NULL
+ )
+ {
+ GpMetafile * metafile = NULL;
+
+ lastResult = DllExports::GdipRecordMetafileI(
+ referenceHdc, type, &frameRect, frameUnit,
+ description, &metafile);
+
+ SetNativeImage(metafile);
+ }
+
+ // Record a metafile to a file
+ Metafile(
+ IN const WCHAR* fileName,
+ IN HDC referenceHdc,
+ IN EmfType type = EmfTypeEmfPlusDual,
+ IN const WCHAR * description = NULL
+ )
+ {
+ GpMetafile * metafile = NULL;
+
+ lastResult = DllExports::GdipRecordMetafileFileName(fileName,
+ referenceHdc, type, NULL, MetafileFrameUnitGdi,
+ description, &metafile);
+
+ SetNativeImage(metafile);
+ }
+
+ // Record a metafile to a file
+ Metafile(
+ IN const WCHAR* fileName,
+ IN HDC referenceHdc,
+ IN const RectF & frameRect,
+ IN MetafileFrameUnit frameUnit = MetafileFrameUnitGdi,
+ IN EmfType type = EmfTypeEmfPlusDual,
+ IN const WCHAR * description = NULL
+ )
+ {
+ GpMetafile * metafile = NULL;
+
+ lastResult = DllExports::GdipRecordMetafileFileName(fileName,
+ referenceHdc, type, &frameRect, frameUnit,
+ description, &metafile);
+
+ SetNativeImage(metafile);
+ }
+
+ // Record a metafile to a file
+ Metafile(
+ IN const WCHAR* fileName,
+ IN HDC referenceHdc,
+ IN const Rect & frameRect,
+ IN MetafileFrameUnit frameUnit = MetafileFrameUnitGdi,
+ IN EmfType type = EmfTypeEmfPlusDual,
+ IN const WCHAR * description = NULL
+ )
+ {
+ GpMetafile * metafile = NULL;
+
+ lastResult = DllExports::GdipRecordMetafileFileNameI(fileName,
+ referenceHdc, type, &frameRect, frameUnit,
+ description, &metafile);
+
+ SetNativeImage(metafile);
+ }
+
+ // Record a metafile to a stream
+ Metafile(
+ IN IStream * stream,
+ IN HDC referenceHdc,
+ IN EmfType type = EmfTypeEmfPlusDual,
+ IN const WCHAR * description = NULL
+ )
+ {
+ GpMetafile * metafile = NULL;
+
+ lastResult = DllExports::GdipRecordMetafileStream(stream,
+ referenceHdc, type, NULL, MetafileFrameUnitGdi,
+ description, &metafile);
+
+ SetNativeImage(metafile);
+ }
+
+ // Record a metafile to a stream
+ Metafile(
+ IN IStream * stream,
+ IN HDC referenceHdc,
+ IN const RectF & frameRect,
+ IN MetafileFrameUnit frameUnit = MetafileFrameUnitGdi,
+ IN EmfType type = EmfTypeEmfPlusDual,
+ IN const WCHAR * description = NULL
+ )
+ {
+ GpMetafile * metafile = NULL;
+
+ lastResult = DllExports::GdipRecordMetafileStream(stream,
+ referenceHdc, type, &frameRect, frameUnit,
+ description, &metafile);
+
+ SetNativeImage(metafile);
+ }
+
+ // Write a metafile to a stream with down-level GDI records
+ Metafile(
+ IN IStream * stream,
+ IN HDC referenceHdc,
+ IN const Rect & frameRect,
+ IN MetafileFrameUnit frameUnit = MetafileFrameUnitGdi,
+ IN EmfType type = EmfTypeEmfPlusDual,
+ IN const WCHAR * description = NULL
+ )
+ {
+ GpMetafile * metafile = NULL;
+
+ lastResult = DllExports::GdipRecordMetafileStreamI(stream,
+ referenceHdc, type, &frameRect, frameUnit,
+ description, &metafile);
+
+ SetNativeImage(metafile);
+ }
+
+ static Status GetMetafileHeader(
+ IN HMETAFILE hWmf,
+ IN const APMFileHeader * apmFileHeader,
+ OUT MetafileHeader * header
+ )
+ {
+ return DllExports::GdipGetMetafileHeaderFromWmf(hWmf, apmFileHeader, header);
+ }
+
+ static Status GetMetafileHeader(
+ IN HENHMETAFILE hEmf,
+ OUT MetafileHeader * header
+ )
+ {
+ return DllExports::GdipGetMetafileHeaderFromEmf(hEmf, header);
+ }
+
+ static Status GetMetafileHeader(
+ IN const WCHAR* filename,
+ OUT MetafileHeader * header
+ )
+ {
+ return DllExports::GdipGetMetafileHeaderFromFile(filename, header);
+ }
+
+ static Status GetMetafileHeader(
+ IN IStream * stream,
+ OUT MetafileHeader * header
+ )
+ {
+ return DllExports::GdipGetMetafileHeaderFromStream(stream, header);
+ }
+
+ Status GetMetafileHeader(
+ OUT MetafileHeader * header
+ ) const
+ {
+ return SetStatus(DllExports::GdipGetMetafileHeaderFromMetafile(
+ (GpMetafile *)nativeImage,
+ header));
+ }
+
+ // Once this method is called, the Metafile object is in an invalid state
+ // and can no longer be used. It is the responsiblity of the caller to
+ // invoke DeleteEnhMetaFile to delete this hEmf.
+
+ HENHMETAFILE GetHENHMETAFILE()
+ {
+ HENHMETAFILE hEmf;
+
+ SetStatus(DllExports::GdipGetHemfFromMetafile((GpMetafile *)nativeImage, &hEmf));
+
+ return hEmf;
+ }
+
+ // Used in conjuction with Graphics::EnumerateMetafile to play an EMF+
+ // The data must be DWORD aligned if it's an EMF or EMF+. It must be
+ // WORD aligned if it's a WMF.
+ Status
+ PlayRecord(
+ IN EmfPlusRecordType recordType,
+ IN UINT flags,
+ IN UINT dataSize,
+ IN const BYTE * data
+ ) const
+ {
+ return SetStatus(DllExports::GdipPlayMetafileRecord(
+ (GpMetafile *)nativeImage,
+ recordType,
+ flags,
+ dataSize,
+ data));
+ }
+
+ // If you're using a printer HDC for the metafile, but you want the
+ // metafile rasterized at screen resolution, then use this API to set
+ // the rasterization dpi of the metafile to the screen resolution,
+ // e.g. 96 dpi or 120 dpi.
+ Status SetDownLevelRasterizationLimit(
+ IN UINT metafileRasterizationLimitDpi
+ )
+ {
+ return SetStatus(DllExports::GdipSetMetafileDownLevelRasterizationLimit(
+ (GpMetafile *)nativeImage,
+ metafileRasterizationLimitDpi));
+ }
+
+ UINT GetDownLevelRasterizationLimit() const
+ {
+ UINT metafileRasterizationLimitDpi = 0;
+
+ SetStatus(DllExports::GdipGetMetafileDownLevelRasterizationLimit(
+ (GpMetafile *)nativeImage,
+ &metafileRasterizationLimitDpi));
+
+ return metafileRasterizationLimitDpi;
+ }
+
+ static UINT Metafile::EmfToWmfBits(
+ IN HENHMETAFILE hemf,
+ IN UINT cbData16,
+ IN LPBYTE pData16,
+ IN INT iMapMode = MM_ANISOTROPIC,
+ IN EmfToWmfBitsFlags eFlags = EmfToWmfBitsFlagsDefault
+ )
+ {
+ return DllExports::GdipEmfToWmfBits(
+ hemf,
+ cbData16,
+ pData16,
+ iMapMode,
+ eFlags);
+ }
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ Metafile(const Metafile &);
+ Metafile& operator=(const Metafile &);
+
+#endif
+};
+
+#endif // !_METAFILE_H
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusMetaHeader.h b/core/src/fxge/Microsoft SDK/include/GdiPlusMetaHeader.h
new file mode 100644
index 0000000000..79b5bc9533
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusMetaHeader.h
@@ -0,0 +1,213 @@
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* Metafile headers
+*
+* Abstract:
+*
+* Declarations for various metafile header structures.
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUSMETAHEADER_H
+#define _GDIPLUSMETAHEADER_H
+
+typedef struct
+{
+ DWORD iType; // Record type EMR_HEADER
+ DWORD nSize; // Record size in bytes. This may be greater
+ // than the sizeof(ENHMETAHEADER).
+ RECTL rclBounds; // Inclusive-inclusive bounds in device units
+ RECTL rclFrame; // Inclusive-inclusive Picture Frame of metafile in .01 mm units
+ DWORD dSignature; // Signature. Must be ENHMETA_SIGNATURE.
+ DWORD nVersion; // Version number
+ DWORD nBytes; // Size of the metafile in bytes
+ DWORD nRecords; // Number of records in the metafile
+ WORD nHandles; // Number of handles in the handle table
+ // Handle index zero is reserved.
+ WORD sReserved; // Reserved. Must be zero.
+ DWORD nDescription; // Number of chars in the unicode description string
+ // This is 0 if there is no description string
+ DWORD offDescription; // Offset to the metafile description record.
+ // This is 0 if there is no description string
+ DWORD nPalEntries; // Number of entries in the metafile palette.
+ SIZEL szlDevice; // Size of the reference device in pels
+ SIZEL szlMillimeters; // Size of the reference device in millimeters
+} ENHMETAHEADER3;
+
+// Aldus Placeable Metafiles
+
+// Placeable Metafiles were created by Aldus Corporation as a non-standard
+// way of specifying how a metafile is mapped and scaled on an output device.
+// Placeable metafiles are quite wide-spread, but not directly supported by
+// the Windows API. To playback a placeable metafile using the Windows API,
+// you will first need to strip the placeable metafile header from the file.
+// This is typically performed by copying the metafile to a temporary file
+// starting at file offset 22 (0x16). The contents of the temporary file may
+// then be used as input to the Windows GetMetaFile(), PlayMetaFile(),
+// CopyMetaFile(), etc. GDI functions.
+
+// Each placeable metafile begins with a 22-byte header,
+// followed by a standard metafile:
+
+#include <pshpack2.h> // set structure packing to 2
+
+typedef struct
+{
+ INT16 Left;
+ INT16 Top;
+ INT16 Right;
+ INT16 Bottom;
+} APMRect16;
+
+typedef struct
+{
+ UINT32 Key; // GDIP_WMF_ALDUSKEY
+ INT16 Hmf; // Metafile HANDLE number (always 0)
+ APMRect16 BoundingBox; // Coordinates in metafile units
+ INT16 Inch; // Number of metafile units per inch
+ UINT32 Reserved; // Reserved (always 0)
+ INT16 Checksum; // Checksum value for previous 10 WORDs
+} APMFileHeader;
+
+#include <poppack.h>
+
+// Key contains a special identification value that indicates the presence
+// of a placeable metafile header and is always 0x9AC6CDD7.
+
+// Handle is used to stored the handle of the metafile in memory. When written
+// to disk, this field is not used and will always contains the value 0.
+
+// Left, Top, Right, and Bottom contain the coordinates of the upper-left
+// and lower-right corners of the image on the output device. These are
+// measured in twips.
+
+// A twip (meaning "twentieth of a point") is the logical unit of measurement
+// used in Windows Metafiles. A twip is equal to 1/1440 of an inch. Thus 720
+// twips equal 1/2 inch, while 32,768 twips is 22.75 inches.
+
+// Inch contains the number of twips per inch used to represent the image.
+// Normally, there are 1440 twips per inch; however, this number may be
+// changed to scale the image. A value of 720 indicates that the image is
+// double its normal size, or scaled to a factor of 2:1. A value of 360
+// indicates a scale of 4:1, while a value of 2880 indicates that the image
+// is scaled down in size by a factor of two. A value of 1440 indicates
+// a 1:1 scale ratio.
+
+// Reserved is not used and is always set to 0.
+
+// Checksum contains a checksum value for the previous 10 WORDs in the header.
+// This value can be used in an attempt to detect if the metafile has become
+// corrupted. The checksum is calculated by XORing each WORD value to an
+// initial value of 0.
+
+// If the metafile was recorded with a reference Hdc that was a display.
+#define GDIP_EMFPLUSFLAGS_DISPLAY 0x00000001
+
+class MetafileHeader
+{
+public:
+ MetafileType Type;
+ UINT Size; // Size of the metafile (in bytes)
+ UINT Version; // EMF+, EMF, or WMF version
+ UINT EmfPlusFlags;
+ REAL DpiX;
+ REAL DpiY;
+ INT X; // Bounds in device units
+ INT Y;
+ INT Width;
+ INT Height;
+ union
+ {
+ METAHEADER WmfHeader;
+ ENHMETAHEADER3 EmfHeader;
+ };
+ INT EmfPlusHeaderSize; // size of the EMF+ header in file
+ INT LogicalDpiX; // Logical Dpi of reference Hdc
+ INT LogicalDpiY; // usually valid only for EMF+ files
+
+public:
+ // Get the metafile type
+ MetafileType GetType() const { return Type; }
+
+ // Get the size of the metafile in BYTEs
+ UINT GetMetafileSize() const { return Size; }
+
+ // If IsEmfPlus, this is the EMF+ version; else it is the WMF or EMF version
+ UINT GetVersion() const { return Version; }
+
+ // Get the EMF+ flags associated with the metafile
+ UINT GetEmfPlusFlags() const { return EmfPlusFlags; }
+
+ // Get the X Dpi of the metafile
+ REAL GetDpiX() const { return DpiX; }
+
+ // Get the Y Dpi of the metafile
+ REAL GetDpiY() const { return DpiY; }
+
+ // Get the bounds of the metafile in device units
+ VOID GetBounds (OUT Rect *rect) const
+ {
+ rect->X = X;
+ rect->Y = Y;
+ rect->Width = Width;
+ rect->Height = Height;
+ }
+
+ // Is it any type of WMF (standard or Aldus Placeable Metafile)?
+ BOOL IsWmf() const
+ {
+ return ((Type == MetafileTypeWmf) || (Type == MetafileTypeWmfAldus));
+ }
+
+ // Is this an Aldus Placeable Metafile?
+ BOOL IsWmfAldus() const { return (Type == MetafileTypeWmf); }
+
+ // Is this an EMF (not an EMF+)?
+ BOOL IsEmf() const { return (Type == MetafileTypeEmf); }
+
+ // Is this an EMF or EMF+ file?
+ BOOL IsEmfOrEmfPlus() const { return (Type >= MetafileTypeEmf); }
+
+ // Is this an EMF+ file?
+ BOOL IsEmfPlus() const { return (Type >= MetafileTypeEmfPlusOnly); }
+
+ // Is this an EMF+ dual (has dual, down-level records) file?
+ BOOL IsEmfPlusDual() const { return (Type == MetafileTypeEmfPlusDual); }
+
+ // Is this an EMF+ only (no dual records) file?
+ BOOL IsEmfPlusOnly() const { return (Type == MetafileTypeEmfPlusOnly); }
+
+ // If it's an EMF+ file, was it recorded against a display Hdc?
+ BOOL IsDisplay() const
+ {
+ return (IsEmfPlus() &&
+ ((EmfPlusFlags & GDIP_EMFPLUSFLAGS_DISPLAY) != 0));
+ }
+
+ // Get the WMF header of the metafile (if it is a WMF)
+ const METAHEADER * GetWmfHeader() const
+ {
+ if (IsWmf())
+ {
+ return &WmfHeader;
+ }
+ return NULL;
+ }
+
+ // Get the EMF header of the metafile (if it is an EMF)
+ const ENHMETAHEADER3 * GetEmfHeader() const
+ {
+ if (IsEmfOrEmfPlus())
+ {
+ return &EmfHeader;
+ }
+ return NULL;
+ }
+};
+
+#endif
+
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusPath.h b/core/src/fxge/Microsoft SDK/include/GdiPlusPath.h
new file mode 100644
index 0000000000..cff0e1d9ce
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusPath.h
@@ -0,0 +1,1686 @@
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusPath.h
+*
+* Abstract:
+*
+* Path related declarations
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUSPATH_H
+#define _GDIPLUSPATH_H
+
+class GraphicsPath : public GdiplusBase
+{
+public:
+ friend class Graphics;
+ friend class Region;
+ friend class PathGradientBrush;
+ friend class GraphicsPathIterator;
+ friend class CustomLineCap;
+
+ // Path constructors
+
+ GraphicsPath(IN FillMode fillMode = FillModeAlternate)
+ {
+ nativePath = NULL;
+ lastResult = DllExports::GdipCreatePath(fillMode, &nativePath);
+ }
+
+ GraphicsPath(IN const PointF* points,
+ IN const BYTE* types,
+ IN INT count,
+ IN FillMode fillMode = FillModeAlternate)
+ {
+ nativePath = NULL;
+ lastResult = DllExports::GdipCreatePath2(points,
+ types,
+ count,
+ fillMode,
+ &nativePath);
+ }
+
+ GraphicsPath(IN const Point* points,
+ IN const BYTE* types,
+ IN INT count,
+ IN FillMode fillMode = FillModeAlternate)
+ {
+ nativePath = NULL;
+ lastResult = DllExports::GdipCreatePath2I(points,
+ types,
+ count,
+ fillMode,
+ &nativePath);
+ }
+
+ ~GraphicsPath()
+ {
+ DllExports::GdipDeletePath(nativePath);
+ }
+
+ /**
+ * Make a copy of the current path object
+ */
+ GraphicsPath* Clone() const
+ {
+ GpPath *clonepath = NULL;
+
+ SetStatus(DllExports::GdipClonePath(nativePath, &clonepath));
+
+ return new GraphicsPath(clonepath);
+ }
+
+ /**
+ * Reset the path object to empty (and fill mode to FillModeAlternate)
+ */
+ Status Reset()
+ {
+ return SetStatus(DllExports::GdipResetPath(nativePath));
+ }
+
+ /**
+ * Get path fill mode information
+ */
+ FillMode GetFillMode() const
+ {
+ FillMode fillmode = FillModeAlternate;
+
+ SetStatus(DllExports::GdipGetPathFillMode(nativePath, &fillmode));
+
+ return fillmode;
+ }
+
+ /**
+ * Set path fill mode information
+ */
+ Status SetFillMode(IN FillMode fillmode)
+ {
+ return SetStatus(DllExports::GdipSetPathFillMode(nativePath, fillmode));
+ }
+
+ /**
+ * Set/get path data
+ */
+ Status GetPathData(OUT PathData* pathData) const
+ {
+ if (pathData == NULL)
+ {
+ return SetStatus(InvalidParameter);
+ }
+
+ INT count = GetPointCount();
+
+ if ((count <= 0) || (pathData->Count>0 && pathData->Count<count))
+ {
+ pathData->Count = 0;
+ if (pathData->Points)
+ {
+ delete pathData->Points;
+ pathData->Points = NULL;
+ }
+
+ if (pathData->Types)
+ {
+ delete pathData->Types;
+ pathData->Types = NULL;
+ }
+
+ if (count <= 0)
+ {
+ return lastResult;
+ }
+ }
+
+ if (pathData->Count == 0)
+ {
+ pathData->Points = new PointF[count];
+ if (pathData->Points == NULL)
+ {
+ return SetStatus(OutOfMemory);
+
+ }
+ pathData->Types = new byte[count];
+ if (pathData->Types == NULL)
+ {
+ delete pathData->Points;
+ pathData->Points = NULL;
+
+ return SetStatus(OutOfMemory);
+ }
+ pathData->Count = count;
+ }
+
+ return SetStatus(DllExports::GdipGetPathData(nativePath, pathData));
+ }
+
+ /**
+ * Start/end a subpath
+ */
+ Status StartFigure()
+ {
+ return SetStatus(DllExports::GdipStartPathFigure(nativePath));
+ }
+
+ Status CloseFigure()
+ {
+ return SetStatus(DllExports::GdipClosePathFigure(nativePath));
+ }
+
+ Status CloseAllFigures()
+ {
+ return SetStatus(DllExports::GdipClosePathFigures(nativePath));
+ }
+
+ Status SetMarker()
+ {
+ return SetStatus(DllExports::GdipSetPathMarker(nativePath));
+ }
+
+ Status ClearMarkers()
+ {
+ return SetStatus(DllExports::GdipClearPathMarkers(nativePath));
+ }
+
+ Status Reverse()
+ {
+ return SetStatus(DllExports::GdipReversePath(nativePath));
+ }
+
+ Status GetLastPoint(OUT PointF* lastPoint) const
+ {
+ return SetStatus(DllExports::GdipGetPathLastPoint(nativePath, lastPoint));
+ }
+
+ /**
+ * Add lines to the path object
+ */
+ // float version
+ Status AddLine(IN const PointF& pt1,
+ IN const PointF& pt2)
+ {
+ return AddLine(pt1.X, pt1.Y, pt2.X, pt2.Y);
+ }
+
+ Status AddLine(IN REAL x1,
+ IN REAL y1,
+ IN REAL x2,
+ IN REAL y2)
+ {
+ return SetStatus(DllExports::GdipAddPathLine(nativePath, x1, y1, x2, y2));
+ }
+
+ Status AddLines(IN const PointF* points,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipAddPathLine2(nativePath, points, count));
+ }
+
+ // integer version
+ Status AddLine(IN const Point& pt1,
+ IN const Point& pt2)
+ {
+ return AddLine(pt1.X,
+ pt1.Y,
+ pt2.X,
+ pt2.Y);
+ }
+
+ Status AddLine(IN INT x1,
+ IN INT y1,
+ IN INT x2,
+ IN INT y2)
+ {
+ return SetStatus(DllExports::GdipAddPathLineI(nativePath,
+ x1,
+ y1,
+ x2,
+ y2));
+ }
+
+ Status AddLines(IN const Point* points,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipAddPathLine2I(nativePath,
+ points,
+ count));
+ }
+
+ /**
+ * Add an arc to the path object
+ */
+ // float version
+ Status AddArc(IN const RectF& rect,
+ IN REAL startAngle,
+ IN REAL sweepAngle)
+ {
+ return AddArc(rect.X, rect.Y, rect.Width, rect.Height,
+ startAngle, sweepAngle);
+ }
+
+ Status AddArc(IN REAL x,
+ IN REAL y,
+ IN REAL width,
+ IN REAL height,
+ IN REAL startAngle,
+ IN REAL sweepAngle)
+ {
+ return SetStatus(DllExports::GdipAddPathArc(nativePath, x, y, width, height,
+ startAngle, sweepAngle));
+ }
+
+ // integer version
+ Status AddArc(IN const Rect& rect,
+ IN REAL startAngle,
+ IN REAL sweepAngle)
+ {
+ return AddArc(rect.X, rect.Y, rect.Width, rect.Height,
+ startAngle, sweepAngle);
+ }
+
+ Status AddArc(IN INT x,
+ IN INT y,
+ IN INT width,
+ IN INT height,
+ IN REAL startAngle,
+ IN REAL sweepAngle)
+ {
+ return SetStatus(DllExports::GdipAddPathArcI(nativePath,
+ x,
+ y,
+ width,
+ height,
+ startAngle,
+ sweepAngle));
+ }
+
+ /**
+ * Add Bezier curves to the path object
+ */
+ // float version
+ Status AddBezier(IN const PointF& pt1,
+ IN const PointF& pt2,
+ IN const PointF& pt3,
+ IN const PointF& pt4)
+ {
+ return AddBezier(pt1.X, pt1.Y, pt2.X, pt2.Y, pt3.X, pt3.Y, pt4.X,
+ pt4.Y);
+ }
+
+ Status AddBezier(IN REAL x1,
+ IN REAL y1,
+ IN REAL x2,
+ IN REAL y2,
+ IN REAL x3,
+ IN REAL y3,
+ IN REAL x4,
+ IN REAL y4)
+ {
+ return SetStatus(DllExports::GdipAddPathBezier(nativePath, x1, y1, x2, y2,
+ x3, y3, x4, y4));
+ }
+
+ Status AddBeziers(IN const PointF* points,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipAddPathBeziers(nativePath, points, count));
+ }
+
+ // integer version
+ Status AddBezier(IN const Point& pt1,
+ IN const Point& pt2,
+ IN const Point& pt3,
+ IN const Point& pt4)
+ {
+ return AddBezier(pt1.X, pt1.Y, pt2.X, pt2.Y, pt3.X, pt3.Y, pt4.X,
+ pt4.Y);
+ }
+
+ Status AddBezier(IN INT x1,
+ IN INT y1,
+ IN INT x2,
+ IN INT y2,
+ IN INT x3,
+ IN INT y3,
+ IN INT x4,
+ IN INT y4)
+ {
+ return SetStatus(DllExports::GdipAddPathBezierI(nativePath,
+ x1,
+ y1,
+ x2,
+ y2,
+ x3,
+ y3,
+ x4,
+ y4));
+ }
+
+ Status AddBeziers(IN const Point* points,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipAddPathBeziersI(nativePath,
+ points,
+ count));
+ }
+
+ // float version
+ Status AddCurve(IN const PointF* points,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipAddPathCurve(nativePath,
+ points,
+ count));
+ }
+
+ Status AddCurve(IN const PointF* points,
+ IN INT count,
+ IN REAL tension)
+ {
+ return SetStatus(DllExports::GdipAddPathCurve2(nativePath,
+ points,
+ count,
+ tension));
+ }
+
+ Status AddCurve(IN const PointF* points,
+ IN INT count,
+ IN INT offset,
+ IN INT numberOfSegments,
+ IN REAL tension)
+ {
+ return SetStatus(DllExports::GdipAddPathCurve3(nativePath,
+ points,
+ count,
+ offset,
+ numberOfSegments,
+ tension));
+ }
+
+ // integer version
+ Status AddCurve(IN const Point* points,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipAddPathCurveI(nativePath,
+ points,
+ count));
+ }
+
+ Status AddCurve(IN const Point* points,
+ IN INT count,
+ IN REAL tension)
+ {
+ return SetStatus(DllExports::GdipAddPathCurve2I(nativePath,
+ points,
+ count,
+ tension));
+ }
+
+ Status AddCurve(IN const Point* points,
+ IN INT count,
+ IN INT offset,
+ IN INT numberOfSegments,
+ IN REAL tension)
+ {
+ return SetStatus(DllExports::GdipAddPathCurve3I(nativePath,
+ points,
+ count,
+ offset,
+ numberOfSegments,
+ tension));
+ }
+
+ // float version
+ Status AddClosedCurve(IN const PointF* points,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipAddPathClosedCurve(nativePath,
+ points,
+ count));
+ }
+
+ Status AddClosedCurve(IN const PointF* points,
+ IN INT count,
+ IN REAL tension)
+ {
+ return SetStatus(DllExports::GdipAddPathClosedCurve2(nativePath,
+ points,
+ count,
+ tension));
+ }
+
+ // integer version
+ Status AddClosedCurve(IN const Point* points,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipAddPathClosedCurveI(nativePath,
+ points,
+ count));
+ }
+
+
+ Status AddClosedCurve(IN const Point* points,
+ IN INT count,
+ IN REAL tension)
+ {
+ return SetStatus(DllExports::GdipAddPathClosedCurve2I(nativePath,
+ points,
+ count,
+ tension));
+ }
+
+
+ /**
+ * Add closed shapes to the path object
+ */
+
+ // float version
+ Status AddRectangle(IN const RectF& rect)
+ {
+ return SetStatus(DllExports::GdipAddPathRectangle(nativePath,
+ rect.X,
+ rect.Y,
+ rect.Width,
+ rect.Height));
+ }
+
+ Status AddRectangles(IN const RectF* rects,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipAddPathRectangles(nativePath,
+ rects,
+ count));
+ }
+
+ // integer version
+ Status AddRectangle(IN const Rect& rect)
+ {
+ return SetStatus(DllExports::GdipAddPathRectangleI(nativePath,
+ rect.X,
+ rect.Y,
+ rect.Width,
+ rect.Height));
+ }
+
+ Status AddRectangles(IN const Rect* rects, INT count)
+ {
+ return SetStatus(DllExports::GdipAddPathRectanglesI(nativePath,
+ rects,
+ count));
+ }
+
+ // float version
+ Status AddEllipse(IN const RectF& rect)
+ {
+ return AddEllipse(rect.X, rect.Y, rect.Width, rect.Height);
+ }
+
+ Status AddEllipse(IN REAL x,
+ IN REAL y,
+ IN REAL width,
+ IN REAL height)
+ {
+ return SetStatus(DllExports::GdipAddPathEllipse(nativePath,
+ x,
+ y,
+ width,
+ height));
+ }
+
+ // integer version
+ Status AddEllipse(IN const Rect& rect)
+ {
+ return AddEllipse(rect.X, rect.Y, rect.Width, rect.Height);
+ }
+
+ Status AddEllipse(IN INT x,
+ IN INT y,
+ IN INT width,
+ IN INT height)
+ {
+ return SetStatus(DllExports::GdipAddPathEllipseI(nativePath,
+ x,
+ y,
+ width,
+ height));
+ }
+
+ // float version
+ Status AddPie(IN const RectF& rect,
+ IN REAL startAngle,
+ IN REAL sweepAngle)
+ {
+ return AddPie(rect.X, rect.Y, rect.Width, rect.Height, startAngle,
+ sweepAngle);
+ }
+
+ Status AddPie(IN REAL x,
+ IN REAL y,
+ IN REAL width,
+ IN REAL height,
+ IN REAL startAngle,
+ IN REAL sweepAngle)
+ {
+ return SetStatus(DllExports::GdipAddPathPie(nativePath, x, y, width, height,
+ startAngle, sweepAngle));
+ }
+
+ // integer version
+ Status AddPie(IN const Rect& rect,
+ IN REAL startAngle,
+ IN REAL sweepAngle)
+ {
+ return AddPie(rect.X,
+ rect.Y,
+ rect.Width,
+ rect.Height,
+ startAngle,
+ sweepAngle);
+ }
+
+ Status AddPie(IN INT x,
+ IN INT y,
+ IN INT width,
+ IN INT height,
+ IN REAL startAngle,
+ IN REAL sweepAngle)
+ {
+ return SetStatus(DllExports::GdipAddPathPieI(nativePath,
+ x,
+ y,
+ width,
+ height,
+ startAngle,
+ sweepAngle));
+ }
+
+ // float version
+ Status AddPolygon(IN const PointF* points,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipAddPathPolygon(nativePath, points, count));
+ }
+
+ // integer version
+ Status AddPolygon(IN const Point* points,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipAddPathPolygonI(nativePath, points, count));
+ }
+
+ Status AddPath(IN const GraphicsPath* addingPath,
+ IN BOOL connect)
+ {
+ GpPath* nativePath2 = NULL;
+ if(addingPath)
+ nativePath2 = addingPath->nativePath;
+
+ return SetStatus(DllExports::GdipAddPathPath(nativePath, nativePath2, connect));
+ }
+
+ // AddString point version
+
+ Status AddString(
+ IN const WCHAR *string,
+ IN INT length,
+ IN const FontFamily *family,
+ IN INT style,
+ IN REAL emSize, // In world units
+ IN const PointF &origin,
+ IN const StringFormat *format
+ )
+ {
+ RectF rect(origin.X, origin.Y, 0.0f, 0.0f);
+
+ return SetStatus(DllExports::GdipAddPathString(
+ nativePath,
+ string,
+ length,
+ family ? family->nativeFamily : NULL,
+ style,
+ emSize,
+ &rect,
+ format ? format->nativeFormat : NULL
+ ));
+ }
+
+ // AddString rectangle version
+
+ Status AddString(
+ IN const WCHAR *string,
+ IN INT length,
+ IN const FontFamily *family,
+ IN INT style,
+ IN REAL emSize, // In world units
+ IN const RectF &layoutRect,
+ IN const StringFormat *format
+ )
+ {
+ return SetStatus(DllExports::GdipAddPathString(
+ nativePath,
+ string,
+ length,
+ family ? family->nativeFamily : NULL,
+ style,
+ emSize,
+ &layoutRect,
+ format ? format->nativeFormat : NULL
+ ));
+ }
+
+ Status AddString(
+ IN const WCHAR *string,
+ IN INT length,
+ IN const FontFamily *family,
+ IN INT style,
+ IN REAL emSize, // In world units
+ IN const Point &origin,
+ IN const StringFormat *format
+ )
+ {
+ Rect rect(origin.X, origin.Y, 0, 0);
+
+ return SetStatus(DllExports::GdipAddPathStringI(
+ nativePath,
+ string,
+ length,
+ family ? family->nativeFamily : NULL,
+ style,
+ emSize,
+ &rect,
+ format ? format->nativeFormat : NULL
+ ));
+ }
+
+ // AddString rectangle version
+
+ Status AddString(
+ IN const WCHAR *string,
+ IN INT length,
+ IN const FontFamily *family,
+ IN INT style,
+ IN REAL emSize, // In world units
+ IN const Rect &layoutRect,
+ IN const StringFormat *format
+ )
+ {
+ return SetStatus(DllExports::GdipAddPathStringI(
+ nativePath,
+ string,
+ length,
+ family ? family->nativeFamily : NULL,
+ style,
+ emSize,
+ &layoutRect,
+ format ? format->nativeFormat : NULL
+ ));
+ }
+
+ /**
+ * Transforms the path object
+ */
+ Status Transform(IN const Matrix* matrix)
+ {
+ if(matrix)
+ return SetStatus(DllExports::GdipTransformPath(nativePath, matrix->nativeMatrix));
+ else
+ return Ok; // No need to transform.
+ }
+
+ /**
+ * Get the bounds of the path object with the given transform.
+ * This is not always the tightest bounds.
+ *
+ * Defined in GdiplusGraphics.h.
+ */
+ Status GetBounds(OUT RectF* bounds,
+ IN const Matrix* matrix = NULL,
+ IN const Pen* pen = NULL) const;
+
+ // integer version (defined in GdiplusGraphics.h)
+ Status GetBounds(OUT Rect* bounds,
+ IN const Matrix* matrix = NULL,
+ IN const Pen* pen = NULL) const;
+
+ /**
+ * Flatten the path object
+ * Once this is called, the resultant path is made of line segments and
+ * the original path information is lost.
+ * When matrix = NULL, the identity matrix is assumed.
+ */
+ Status Flatten(IN const Matrix* matrix = NULL,
+ IN REAL flatness = FlatnessDefault)
+ {
+ GpMatrix* nativeMatrix = NULL;
+ if(matrix)
+ {
+ nativeMatrix = matrix->nativeMatrix;
+ }
+
+ return SetStatus(DllExports::GdipFlattenPath(
+ nativePath,
+ nativeMatrix,
+ flatness
+ ));
+ }
+
+#ifdef DCR_USE_NEW_202903
+
+ Status Widen(
+ IN const Pen* pen,
+ IN const Matrix* matrix = NULL,
+ IN REAL flatness = FlatnessDefault
+ )
+ {
+ GpMatrix* nativeMatrix = NULL;
+ if(matrix)
+ nativeMatrix = matrix->nativeMatrix;
+
+ return SetStatus(DllExports::GdipWidenPath(
+ nativePath,
+ pen->nativePen,
+ nativeMatrix,
+ flatness
+ ));
+ }
+
+#else
+
+ /**
+ * Widen the path object
+ * When removeSelfIntersects is TRUE, this returns the widened path
+ * without self intersections.
+ * When it is FALSE, it returns the widened path with selfintersections.
+ * The latter is faster and is usually safficient for filling.
+ */
+ Status Widen(IN const Pen* pen,
+ IN const Matrix* matrix = NULL,
+ IN BOOL removeSelfIntersects = TRUE)
+ {
+ GpMatrix* nativeMatrix = NULL;
+ if(matrix)
+ nativeMatrix = matrix->nativeMatrix;
+
+ return SetStatus(DllExports::GdipWidenPathWithMinimumResolutions(nativePath, pen->nativePen,
+ 0, 0, nativeMatrix, removeSelfIntersects));
+ }
+
+ /**
+ * Widen the path object
+ * This is equivalent to Widen() method except that
+ * The widths of the widened path are larger than the given
+ * minimum resolutions in x and y coordinates after the transform.
+ * This is usefull when widening a path with the limited device resolutions.
+ */
+
+ Status Widen(IN const Pen* pen,
+ IN REAL minXres,
+ IN REAL minYres,
+ IN const Matrix* matrix = NULL,
+ IN BOOL removeSelfIntersects = TRUE)
+ {
+ GpMatrix* nativeMatrix = NULL;
+ if(matrix)
+ nativeMatrix = matrix->nativeMatrix;
+
+ return SetStatus(DllExports::GdipWidenPathWithMinimumResolutions(nativePath, pen->nativePen,
+ minXres, minYres, nativeMatrix, removeSelfIntersects));
+ }
+
+#endif // DCR_USE_NEW_202903
+
+ Status Outline(
+ IN const Matrix *matrix = NULL,
+ IN REAL flatness = FlatnessDefault
+ )
+ {
+ GpMatrix* nativeMatrix = NULL;
+ if(matrix)
+ {
+ nativeMatrix = matrix->nativeMatrix;
+ }
+
+ return SetStatus(DllExports::GdipWindingModeOutline(
+ nativePath, nativeMatrix, flatness
+ ));
+ }
+
+ /**
+ * Warp the path object
+ * Once this is called, the resultant path is made of line segments and
+ * the original path information is lost.
+ * When matrix = NULL, the identity matrix is assumed.
+ */
+ Status Warp(IN const PointF* destPoints,
+ IN INT count,
+ IN const RectF& srcRect,
+ IN const Matrix* matrix = NULL,
+ IN WarpMode warpMode = WarpModePerspective,
+ IN REAL flatness = FlatnessDefault)
+ {
+ GpMatrix* nativeMatrix = NULL;
+ if(matrix)
+ nativeMatrix = matrix->nativeMatrix;
+
+ return SetStatus(DllExports::GdipWarpPath(
+ nativePath,
+ nativeMatrix,
+ destPoints,
+ count,
+ srcRect.X,
+ srcRect.Y,
+ srcRect.Width,
+ srcRect.Height,
+ warpMode,
+ flatness));
+ }
+
+ /**
+ * Return the number of points in the current path
+ */
+ INT GetPointCount() const
+ {
+ INT count = 0;
+
+ SetStatus(DllExports::GdipGetPointCount(nativePath, &count));
+
+ return count;
+ }
+
+ /**
+ * Return the path point type information
+ */
+ Status GetPathTypes(OUT BYTE* types,
+ IN INT count) const
+ {
+ return SetStatus(DllExports::GdipGetPathTypes(nativePath, types, count));
+ }
+
+ /**
+ * Return the path point coordinate information
+ * @notes Should there be PathData that contains types[] and points[]
+ * for get & set purposes.
+ */
+ Status GetPathPoints(OUT PointF* points,
+ IN INT count) const
+ {
+ return SetStatus(DllExports::GdipGetPathPoints(nativePath, points, count));
+ }
+
+ // integer version
+ Status GetPathPoints(OUT Point* points,
+ IN INT count) const
+ {
+ return SetStatus(DllExports::GdipGetPathPointsI(nativePath, points, count));
+ }
+
+ Status GetLastStatus() const
+ {
+ Status lastStatus = lastResult;
+ lastResult = Ok;
+
+ return lastStatus;
+ }
+
+ /**
+ * Hit testing operations
+ *
+ * inline implementation is in gdiplusgraphics.h.
+ */
+
+ BOOL IsVisible(IN const PointF& point,
+ IN const Graphics* g = NULL) const
+ {
+ return IsVisible(point.X, point.Y, g);
+ }
+
+ BOOL IsVisible(IN REAL x,
+ IN REAL y,
+ IN const Graphics* g = NULL) const;
+
+ BOOL IsVisible(IN const Point& point,
+ IN const Graphics* g = NULL) const
+ {
+ return IsVisible(point.X, point.Y, g);
+ }
+
+ BOOL IsVisible(IN INT x,
+ IN INT y,
+ IN const Graphics* g = NULL) const;
+
+ BOOL IsOutlineVisible(IN const PointF& point,
+ IN const Pen* pen,
+ IN const Graphics* g = NULL) const
+ {
+ return IsOutlineVisible(point.X, point.Y, pen, g);
+ }
+
+ BOOL IsOutlineVisible(IN REAL x,
+ IN REAL y,
+ IN const Pen* pen,
+ IN const Graphics* g = NULL) const;
+
+ BOOL IsOutlineVisible(IN const Point& point,
+ IN const Pen* pen,
+ IN const Graphics* g = NULL) const
+ {
+ return IsOutlineVisible(point.X, point.Y, pen, g);
+ }
+
+ BOOL IsOutlineVisible(IN INT x,
+ IN INT y,
+ IN const Pen* pen,
+ IN const Graphics* g = NULL) const;
+
+protected:
+
+ GraphicsPath(const GraphicsPath& path)
+ {
+ GpPath *clonepath = NULL;
+ SetStatus(DllExports::GdipClonePath(path.nativePath, &clonepath));
+ SetNativePath(clonepath);
+ }
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ GraphicsPath& operator=(const GraphicsPath &);
+protected:
+
+#else
+
+ GraphicsPath& operator=(const GraphicsPath& path)
+ {
+ path;
+ SetStatus(NotImplemented);
+ return *this;
+ }
+
+#endif
+
+ GraphicsPath(GpPath* nativePath)
+ {
+ lastResult = Ok;
+ SetNativePath(nativePath);
+ }
+
+ VOID SetNativePath(GpPath *nativePath)
+ {
+ this->nativePath = nativePath;
+ }
+
+ Status SetStatus(Status status) const
+ {
+ if (status != Ok)
+ return (lastResult = status);
+ else
+ return status;
+ }
+
+protected:
+ GpPath* nativePath;
+ mutable Status lastResult;
+};
+
+
+//--------------------------------------------------------------------------
+// GraphisPathIterator class
+//--------------------------------------------------------------------------
+
+class GraphicsPathIterator : public GdiplusBase
+{
+public:
+
+ GraphicsPathIterator(IN const GraphicsPath* path)
+ {
+ GpPath* nativePath = NULL;
+ if(path)
+ nativePath = path->nativePath;
+
+ GpPathIterator *iter = NULL;
+ lastResult = DllExports::GdipCreatePathIter(&iter, nativePath);
+ SetNativeIterator(iter);
+ }
+
+ ~GraphicsPathIterator()
+ {
+ DllExports::GdipDeletePathIter(nativeIterator);
+ }
+
+
+ INT NextSubpath(OUT INT* startIndex,
+ OUT INT* endIndex,
+ OUT BOOL* isClosed)
+ {
+ INT resultCount;
+
+ SetStatus(DllExports::GdipPathIterNextSubpath(nativeIterator,
+ &resultCount, startIndex, endIndex, isClosed));
+
+ return resultCount;
+ }
+
+
+ INT NextSubpath(IN const GraphicsPath* path,
+ OUT BOOL* isClosed)
+ {
+ GpPath* nativePath = NULL;
+
+ INT resultCount;
+
+ if(path)
+ nativePath= path->nativePath;
+
+ SetStatus(DllExports::GdipPathIterNextSubpathPath(nativeIterator,
+ &resultCount, nativePath, isClosed));
+
+ return resultCount;
+ }
+
+ INT NextPathType(OUT BYTE* pathType,
+ OUT INT* startIndex,
+ OUT INT* endIndex)
+ {
+ INT resultCount;
+
+ SetStatus(DllExports::GdipPathIterNextPathType(nativeIterator,
+ &resultCount, pathType, startIndex, endIndex));
+
+ return resultCount;
+ }
+
+ INT NextMarker(OUT INT* startIndex,
+ OUT INT* endIndex)
+ {
+ INT resultCount;
+
+ SetStatus(DllExports::GdipPathIterNextMarker(nativeIterator,
+ &resultCount, startIndex, endIndex));
+
+ return resultCount;
+ }
+
+
+ INT NextMarker(IN const GraphicsPath* path)
+ {
+ GpPath* nativePath = NULL;
+
+ INT resultCount;
+
+ if(path)
+ nativePath= path->nativePath;
+
+ SetStatus(DllExports::GdipPathIterNextMarkerPath(nativeIterator,
+ &resultCount, nativePath));
+
+ return resultCount;
+ }
+
+ INT GetCount() const
+ {
+ INT resultCount;
+
+ SetStatus(DllExports::GdipPathIterGetCount(nativeIterator, &resultCount));
+
+ return resultCount;
+ }
+
+ INT GetSubpathCount() const
+ {
+ INT resultCount;
+
+ SetStatus(DllExports::GdipPathIterGetSubpathCount(nativeIterator, &resultCount));
+
+ return resultCount;
+ }
+
+ BOOL HasCurve() const
+ {
+ BOOL hasCurve;
+
+ SetStatus(DllExports::GdipPathIterHasCurve(nativeIterator, &hasCurve));
+
+ return hasCurve;
+ }
+
+ VOID Rewind()
+ {
+ SetStatus(DllExports::GdipPathIterRewind(nativeIterator));
+ }
+
+ INT Enumerate(OUT PointF *points,
+ OUT BYTE *types,
+ IN INT count)
+ {
+ INT resultCount;
+
+ SetStatus(DllExports::GdipPathIterEnumerate(nativeIterator,
+ &resultCount, points, types, count));
+
+ return resultCount;
+ }
+
+ INT CopyData(OUT PointF* points,
+ OUT BYTE* types,
+ IN INT startIndex,
+ IN INT endIndex)
+ {
+ INT resultCount;
+
+ SetStatus(DllExports::GdipPathIterCopyData(nativeIterator,
+ &resultCount, points, types, startIndex, endIndex));
+
+ return resultCount;
+ }
+
+ Status GetLastStatus() const
+ {
+ Status lastStatus = lastResult;
+ lastResult = Ok;
+
+ return lastStatus;
+ }
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ GraphicsPathIterator(const GraphicsPathIterator &);
+ GraphicsPathIterator& operator=(const GraphicsPathIterator &);
+
+#endif
+
+protected:
+ VOID SetNativeIterator(GpPathIterator *nativeIterator)
+ {
+ this->nativeIterator = nativeIterator;
+ }
+
+ Status SetStatus(Status status) const
+ {
+ if (status != Ok)
+ return (lastResult = status);
+ else
+ return status;
+ }
+
+protected:
+ GpPathIterator* nativeIterator;
+ mutable Status lastResult;
+};
+
+
+//--------------------------------------------------------------------------
+// Represent polygon gradient brush object
+//--------------------------------------------------------------------------
+
+class PathGradientBrush : public Brush
+{
+public:
+ friend class Pen;
+
+ PathGradientBrush(
+ IN const PointF* points,
+ IN INT count,
+ IN WrapMode wrapMode = WrapModeClamp)
+ {
+ GpPathGradient *brush = NULL;
+
+ lastResult = DllExports::GdipCreatePathGradient(
+ points, count,
+ wrapMode, &brush);
+ SetNativeBrush(brush);
+ }
+
+ PathGradientBrush(
+ IN const Point* points,
+ IN INT count,
+ IN WrapMode wrapMode = WrapModeClamp)
+ {
+ GpPathGradient *brush = NULL;
+
+ lastResult = DllExports::GdipCreatePathGradientI(
+ points, count,
+ wrapMode, &brush);
+
+ SetNativeBrush(brush);
+ }
+
+ PathGradientBrush(
+ IN const GraphicsPath* path
+ )
+ {
+ GpPathGradient *brush = NULL;
+
+ lastResult = DllExports::GdipCreatePathGradientFromPath(
+ path->nativePath, &brush);
+ SetNativeBrush(brush);
+ }
+
+ // Get/set colors
+
+ Status GetCenterColor(OUT Color* color) const
+ {
+ ARGB argb;
+
+ if (color == NULL)
+ {
+ return SetStatus(InvalidParameter);
+ }
+
+ SetStatus(DllExports::GdipGetPathGradientCenterColor(
+ (GpPathGradient*) nativeBrush, &argb));
+
+ color->SetValue(argb);
+
+ return lastResult;
+ }
+
+ Status SetCenterColor(IN const Color& color)
+ {
+ SetStatus(DllExports::GdipSetPathGradientCenterColor(
+ (GpPathGradient*) nativeBrush,
+ color.GetValue()));
+
+ return lastResult;
+ }
+
+ INT GetPointCount() const
+ {
+ INT count;
+
+ SetStatus(DllExports::GdipGetPathGradientPointCount(
+ (GpPathGradient*) nativeBrush, &count));
+
+ return count;
+ }
+
+ INT GetSurroundColorCount() const
+ {
+ INT count;
+
+ SetStatus(DllExports::GdipGetPathGradientSurroundColorCount(
+ (GpPathGradient*) nativeBrush, &count));
+
+ return count;
+ }
+
+ Status GetSurroundColors(OUT Color* colors,
+ IN OUT INT* count) const
+ {
+ if(colors == NULL || count == NULL)
+ {
+ return SetStatus(InvalidParameter);
+ }
+
+ INT count1;
+
+ SetStatus(DllExports::GdipGetPathGradientSurroundColorCount(
+ (GpPathGradient*) nativeBrush, &count1));
+
+ if(lastResult != Ok)
+ return lastResult;
+
+ if((*count < count1) || (count1 <= 0))
+ return SetStatus(InsufficientBuffer);
+
+ ARGB* argbs = (ARGB*) new ARGB[count1];
+ if(argbs == NULL)
+ return SetStatus(OutOfMemory);
+
+ SetStatus(DllExports::GdipGetPathGradientSurroundColorsWithCount(
+ (GpPathGradient*)nativeBrush, argbs, &count1));
+
+ if(lastResult == Ok)
+ {
+ for(INT i = 0; i < count1; i++)
+ {
+ colors[i].SetValue(argbs[i]);
+ }
+ *count = count1;
+ }
+
+ delete [] argbs;
+ return lastResult;
+ }
+
+ Status SetSurroundColors(IN const Color* colors,
+ IN OUT INT* count)
+ {
+ if(colors == NULL || count == NULL)
+ {
+ return SetStatus(InvalidParameter);
+ }
+
+ INT count1 = GetPointCount();
+
+ if((*count > count1) || (count1 <= 0))
+ return SetStatus(InvalidParameter);
+
+ count1 = *count;
+
+ ARGB* argbs = (ARGB*) new ARGB[count1];
+ if(argbs == NULL)
+ return SetStatus(OutOfMemory);
+
+ for(INT i = 0; i < count1; i++)
+ {
+ argbs[i] = colors[i].GetValue();
+ }
+
+ SetStatus(DllExports::GdipSetPathGradientSurroundColorsWithCount(
+ (GpPathGradient*)nativeBrush, argbs, &count1));
+
+ if(lastResult == Ok)
+ *count = count1;
+
+ delete [] argbs;
+
+ return lastResult;
+ }
+
+ Status GetGraphicsPath(OUT GraphicsPath* path) const
+ {
+ if(path == NULL)
+ return SetStatus(InvalidParameter);
+
+ return SetStatus(DllExports::GdipGetPathGradientPath(
+ (GpPathGradient*)nativeBrush, path->nativePath));
+ }
+
+ Status SetGraphicsPath(IN const GraphicsPath* path)
+ {
+ if(path == NULL)
+ return SetStatus(InvalidParameter);
+
+ return SetStatus(DllExports::GdipSetPathGradientPath(
+ (GpPathGradient*)nativeBrush, path->nativePath));
+ }
+
+ Status GetCenterPoint(OUT PointF* point) const
+ {
+ return SetStatus(DllExports::GdipGetPathGradientCenterPoint(
+ (GpPathGradient*)nativeBrush,
+ point));
+ }
+
+
+ Status GetCenterPoint(OUT Point* point) const
+ {
+ return SetStatus(DllExports::GdipGetPathGradientCenterPointI(
+ (GpPathGradient*)nativeBrush,
+ point));
+ }
+
+ Status SetCenterPoint(IN const PointF& point)
+ {
+ return SetStatus(DllExports::GdipSetPathGradientCenterPoint(
+ (GpPathGradient*)nativeBrush,
+ &point));
+ }
+
+ Status SetCenterPoint(IN const Point& point)
+ {
+ return SetStatus(DllExports::GdipSetPathGradientCenterPointI(
+ (GpPathGradient*)nativeBrush,
+ &point));
+ }
+
+ Status GetRectangle(OUT RectF* rect) const
+ {
+ return SetStatus(DllExports::GdipGetPathGradientRect(
+ (GpPathGradient*)nativeBrush, rect));
+ }
+
+ Status GetRectangle(OUT Rect* rect) const
+ {
+ return SetStatus(DllExports::GdipGetPathGradientRectI(
+ (GpPathGradient*)nativeBrush, rect));
+ }
+
+ // Gamma correction.
+
+ Status SetGammaCorrection(IN BOOL useGammaCorrection)
+ {
+ return SetStatus(DllExports::GdipSetPathGradientGammaCorrection(
+ (GpPathGradient*)nativeBrush, useGammaCorrection));
+ }
+
+ BOOL GetGammaCorrection() const
+ {
+ BOOL useGammaCorrection;
+
+ SetStatus(DllExports::GdipGetPathGradientGammaCorrection(
+ (GpPathGradient*)nativeBrush, &useGammaCorrection));
+
+ return useGammaCorrection;
+ }
+
+ INT GetBlendCount() const
+ {
+ INT count = 0;
+
+ SetStatus(DllExports::GdipGetPathGradientBlendCount(
+ (GpPathGradient*) nativeBrush, &count));
+
+ return count;
+ }
+
+ Status GetBlend(OUT REAL* blendFactors,
+ OUT REAL* blendPositions,
+ IN INT count) const
+ {
+ return SetStatus(DllExports::GdipGetPathGradientBlend(
+ (GpPathGradient*)nativeBrush,
+ blendFactors, blendPositions, count));
+ }
+
+ Status SetBlend(IN const REAL* blendFactors,
+ IN const REAL* blendPositions,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipSetPathGradientBlend(
+ (GpPathGradient*)nativeBrush,
+ blendFactors, blendPositions, count));
+ }
+
+ INT GetInterpolationColorCount() const
+ {
+ INT count = 0;
+
+ SetStatus(DllExports::GdipGetPathGradientPresetBlendCount(
+ (GpPathGradient*) nativeBrush, &count));
+
+ return count;
+ }
+
+ Status SetInterpolationColors(IN const Color* presetColors,
+ IN const REAL* blendPositions,
+ IN INT count)
+ {
+ if ((count <= 0) || !presetColors)
+ {
+ return SetStatus(InvalidParameter);
+ }
+
+ ARGB* argbs = (ARGB*) new ARGB[count];
+ if(argbs)
+ {
+ for(INT i = 0; i < count; i++)
+ {
+ argbs[i] = presetColors[i].GetValue();
+ }
+
+ Status status = SetStatus(DllExports::GdipSetPathGradientPresetBlend(
+ (GpPathGradient*) nativeBrush,
+ argbs,
+ blendPositions,
+ count));
+ delete[] argbs;
+ return status;
+ }
+ else
+ {
+ return SetStatus(OutOfMemory);
+ }
+ }
+
+ Status GetInterpolationColors(OUT Color* presetColors,
+ OUT REAL* blendPositions,
+ IN INT count) const
+ {
+ if ((count <= 0) || !presetColors)
+ {
+ return SetStatus(InvalidParameter);
+ }
+
+ ARGB* argbs = (ARGB*) new ARGB[count];
+
+ if (!argbs)
+ {
+ return SetStatus(OutOfMemory);
+ }
+
+ GpStatus status = SetStatus(DllExports::GdipGetPathGradientPresetBlend(
+ (GpPathGradient*)nativeBrush,
+ argbs,
+ blendPositions,
+ count));
+
+ for(INT i = 0; i < count; i++)
+ {
+ presetColors[i] = Color(argbs[i]);
+ }
+ delete [] argbs;
+
+ return status;
+ }
+
+ Status SetBlendBellShape(IN REAL focus,
+ IN REAL scale = 1.0)
+ {
+ return SetStatus(DllExports::GdipSetPathGradientSigmaBlend(
+ (GpPathGradient*)nativeBrush, focus, scale));
+ }
+
+ #ifdef DCR_USE_NEW_145135
+ Status SetBlendTriangularShape(
+ IN REAL focus,
+ IN REAL scale = 1.0
+ )
+ #else
+ Status SetBlendTrianglarShape(IN REAL focus,
+ IN REAL scale = 1.0)
+ #endif
+ {
+ return SetStatus(DllExports::GdipSetPathGradientLinearBlend(
+ (GpPathGradient*)nativeBrush, focus, scale));
+ }
+
+ /**
+ * Get/set brush transform
+ */
+ Status GetTransform(OUT Matrix *matrix) const
+ {
+ return SetStatus(DllExports::GdipGetPathGradientTransform(
+ (GpPathGradient*) nativeBrush, matrix->nativeMatrix));
+ }
+
+ Status SetTransform(IN const Matrix* matrix)
+ {
+ return SetStatus(DllExports::GdipSetPathGradientTransform(
+ (GpPathGradient*) nativeBrush, matrix->nativeMatrix));
+ }
+
+ Status ResetTransform()
+ {
+ return SetStatus(DllExports::GdipResetPathGradientTransform((GpPathGradient*)nativeBrush));
+ }
+
+ Status MultiplyTransform(IN const Matrix* matrix,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipMultiplyPathGradientTransform((GpPathGradient*)nativeBrush,
+ matrix->nativeMatrix,
+ order));
+ }
+
+ Status TranslateTransform(IN REAL dx,
+ IN REAL dy,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipTranslatePathGradientTransform((GpPathGradient*)nativeBrush,
+ dx, dy, order));
+ }
+
+ Status ScaleTransform(IN REAL sx,
+ IN REAL sy,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipScalePathGradientTransform((GpPathGradient*)nativeBrush,
+ sx, sy, order));
+ }
+
+ Status RotateTransform(IN REAL angle,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipRotatePathGradientTransform((GpPathGradient*)nativeBrush,
+ angle, order));
+ }
+
+ /**
+ * Get/set brush focus scales
+ */
+ Status GetFocusScales(OUT REAL* xScale,
+ OUT REAL* yScale) const
+ {
+ return SetStatus(DllExports::GdipGetPathGradientFocusScales(
+ (GpPathGradient*) nativeBrush, xScale, yScale));
+ }
+
+ Status SetFocusScales(IN REAL xScale,
+ IN REAL yScale)
+ {
+ return SetStatus(DllExports::GdipSetPathGradientFocusScales(
+ (GpPathGradient*) nativeBrush, xScale, yScale));
+ }
+
+ /**
+ * Get/set brush wrapping mode
+ */
+ WrapMode GetWrapMode() const
+ {
+ WrapMode wrapMode;
+
+ SetStatus(DllExports::GdipGetPathGradientWrapMode(
+ (GpPathGradient*) nativeBrush, &wrapMode));
+
+ return wrapMode;
+ }
+
+ Status SetWrapMode(IN WrapMode wrapMode)
+ {
+ return SetStatus(DllExports::GdipSetPathGradientWrapMode(
+ (GpPathGradient*) nativeBrush, wrapMode));
+ }
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ PathGradientBrush(const PathGradientBrush &);
+ PathGradientBrush& operator=(const PathGradientBrush &);
+
+#endif
+
+protected:
+
+ PathGradientBrush()
+ {
+ }
+};
+
+
+#endif // !_GRAPHICSPATH_HPP
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusPen.h b/core/src/fxge/Microsoft SDK/include/GdiPlusPen.h
new file mode 100644
index 0000000000..20653db36e
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusPen.h
@@ -0,0 +1,519 @@
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusPen.h
+*
+* Abstract:
+*
+* Pen API related declarations
+*
+\**************************************************************************/
+#ifndef _GDIPLUSPEN_H
+#define _GDIPLUSPEN_H
+
+//--------------------------------------------------------------------------
+// class for various pen types
+//--------------------------------------------------------------------------
+
+class Pen : public GdiplusBase
+{
+public:
+ friend class GraphicsPath;
+ friend class Graphics;
+
+ // abstract Clone() can't be implemented here because it can't
+ // new an object with pure virtual functions
+
+ // Constructors
+
+ Pen(IN const Color& color,
+ IN REAL width = 1.0f)
+ {
+ Unit unit = UnitWorld;
+ nativePen = NULL;
+ lastResult = DllExports::GdipCreatePen1(color.GetValue(),
+ width, unit, &nativePen);
+ }
+
+ Pen(IN const Brush* brush,
+ IN REAL width = 1.0f)
+ {
+ Unit unit = UnitWorld;
+ nativePen = NULL;
+ lastResult = DllExports::GdipCreatePen2(brush->nativeBrush,
+ width, unit, &nativePen);
+ }
+
+ ~Pen()
+ {
+ DllExports::GdipDeletePen(nativePen);
+ }
+
+ Pen* Clone() const
+ {
+ GpPen *clonePen = NULL;
+
+ lastResult = DllExports::GdipClonePen(nativePen, &clonePen);
+
+ return new Pen(clonePen, lastResult);
+ }
+
+ Status SetWidth(IN REAL width)
+ {
+ return SetStatus(DllExports::GdipSetPenWidth(nativePen, width));
+ }
+
+ REAL GetWidth() const
+ {
+ REAL width;
+
+ SetStatus(DllExports::GdipGetPenWidth(nativePen, &width));
+
+ return width;
+ }
+
+ // Set/get line caps: start, end, and dash
+
+ // Line cap and join APIs by using LineCap and LineJoin enums.
+
+ #ifdef DCR_USE_NEW_197819
+ Status SetLineCap(IN LineCap startCap,
+ IN LineCap endCap,
+ IN DashCap dashCap)
+ {
+ return SetStatus(DllExports::GdipSetPenLineCap197819(nativePen,
+ startCap, endCap, dashCap));
+ }
+ #else
+ Status SetLineCap(IN LineCap startCap,
+ IN LineCap endCap,
+ IN LineCap dashCap)
+ {
+ return SetStatus(DllExports::GdipSetPenLineCap(nativePen,
+ startCap, endCap, dashCap));
+ }
+ #endif // DCR_USE_NEW_197819
+
+ Status SetStartCap(IN LineCap startCap)
+ {
+ return SetStatus(DllExports::GdipSetPenStartCap(nativePen, startCap));
+ }
+
+ Status SetEndCap(IN LineCap endCap)
+ {
+ return SetStatus(DllExports::GdipSetPenEndCap(nativePen, endCap));
+ }
+
+ #ifdef DCR_USE_NEW_197819
+ Status SetDashCap(IN DashCap dashCap)
+ {
+ return SetStatus(DllExports::GdipSetPenDashCap197819(nativePen,
+ dashCap));
+ }
+ #else
+ Status SetDashCap(IN LineCap dashCap)
+ {
+ return SetStatus(DllExports::GdipSetPenDashCap(nativePen, dashCap));
+ }
+ #endif // DCR_USE_NEW_197819
+
+ LineCap GetStartCap() const
+ {
+ LineCap startCap;
+
+ SetStatus(DllExports::GdipGetPenStartCap(nativePen, &startCap));
+
+ return startCap;
+ }
+
+ LineCap GetEndCap() const
+ {
+ LineCap endCap;
+
+ SetStatus(DllExports::GdipGetPenEndCap(nativePen, &endCap));
+
+ return endCap;
+ }
+
+ #ifdef DCR_USE_NEW_197819
+ DashCap GetDashCap() const
+ {
+ DashCap dashCap;
+
+ SetStatus(DllExports::GdipGetPenDashCap197819(nativePen,
+ &dashCap));
+
+ return dashCap;
+ }
+ #else
+ LineCap GetDashCap() const
+ {
+ LineCap dashCap;
+
+ SetStatus(DllExports::GdipGetPenDashCap(nativePen, &dashCap));
+
+ return dashCap;
+ }
+ #endif // DCR_USE_NEW_197819
+
+
+ // Set/get line join
+
+ Status SetLineJoin(IN LineJoin lineJoin)
+ {
+ return SetStatus(DllExports::GdipSetPenLineJoin(nativePen, lineJoin));
+ }
+
+ LineJoin GetLineJoin() const
+ {
+ LineJoin lineJoin;
+
+ SetStatus(DllExports::GdipGetPenLineJoin(nativePen, &lineJoin));
+
+ return lineJoin;
+ }
+
+ Status SetCustomStartCap(IN const CustomLineCap* customCap)
+ {
+ GpCustomLineCap* nativeCap = NULL;
+ if(customCap)
+ nativeCap = customCap->nativeCap;
+
+ return SetStatus(DllExports::GdipSetPenCustomStartCap(nativePen, nativeCap));
+ }
+
+ Status GetCustomStartCap(OUT CustomLineCap* customCap) const
+ {
+ if(!customCap)
+ return SetStatus(InvalidParameter);
+
+ return SetStatus(DllExports::GdipGetPenCustomStartCap(nativePen, &(customCap->nativeCap)));
+ }
+
+ Status SetCustomEndCap(IN const CustomLineCap* customCap)
+ {
+ GpCustomLineCap* nativeCap = NULL;
+ if(customCap)
+ nativeCap = customCap->nativeCap;
+
+ return SetStatus(DllExports::GdipSetPenCustomEndCap(nativePen, nativeCap));
+ }
+
+ Status GetCustomEndCap(OUT CustomLineCap* customCap) const
+ {
+ if(!customCap)
+ return SetStatus(InvalidParameter);
+
+ return SetStatus(DllExports::GdipGetPenCustomEndCap(nativePen, &(customCap->nativeCap)));
+ }
+
+ Status SetMiterLimit(IN REAL miterLimit)
+ {
+ return SetStatus(DllExports::GdipSetPenMiterLimit(nativePen, miterLimit));
+ }
+
+ REAL GetMiterLimit() const
+ {
+ REAL miterLimit;
+
+ SetStatus(DllExports::GdipGetPenMiterLimit(nativePen, &miterLimit));
+
+ return miterLimit;
+ }
+
+ // Set/get pen mode
+ Status SetAlignment(IN PenAlignment penAlignment)
+ {
+ return SetStatus(DllExports::GdipSetPenMode(nativePen, penAlignment));
+ }
+
+ PenAlignment GetAlignment() const
+ {
+ PenAlignment penAlignment;
+
+ SetStatus(DllExports::GdipGetPenMode(nativePen, &penAlignment));
+
+ return penAlignment;
+ }
+
+ // Set/get pen transform
+ Status SetTransform(IN const Matrix* matrix)
+ {
+ return SetStatus(DllExports::GdipSetPenTransform(nativePen,
+ matrix->nativeMatrix));
+ }
+
+ Status GetTransform(OUT Matrix* matrix) const
+ {
+ return SetStatus(DllExports::GdipGetPenTransform(nativePen, matrix->nativeMatrix));
+ }
+
+ Status ResetTransform()
+ {
+ return SetStatus(DllExports::GdipResetPenTransform(nativePen));
+ }
+
+ Status MultiplyTransform(IN const Matrix* matrix,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipMultiplyPenTransform(nativePen,
+ matrix->nativeMatrix,
+ order));
+ }
+
+ Status TranslateTransform(IN REAL dx,
+ IN REAL dy,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipTranslatePenTransform(nativePen,
+ dx, dy, order));
+ }
+
+ Status ScaleTransform(IN REAL sx,
+ IN REAL sy,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipScalePenTransform(nativePen,
+ sx, sy, order));
+ }
+
+ Status RotateTransform(IN REAL angle,
+ IN MatrixOrder order = MatrixOrderPrepend)
+ {
+ return SetStatus(DllExports::GdipRotatePenTransform(nativePen,
+ angle, order));
+ }
+
+ PenType GetPenType() const
+ {
+ PenType type;
+ SetStatus(DllExports::GdipGetPenFillType(nativePen, &type));
+
+ return type;
+ }
+
+ Status SetColor(IN const Color& color)
+ {
+ return SetStatus(DllExports::GdipSetPenColor(nativePen,
+ color.GetValue()));
+ }
+
+ Status SetBrush(IN const Brush* brush)
+ {
+ return SetStatus(DllExports::GdipSetPenBrushFill(nativePen,
+ brush->nativeBrush));
+ }
+
+ Status GetColor(OUT Color* color) const
+ {
+ if (color == NULL)
+ {
+ return SetStatus(InvalidParameter);
+ }
+
+ PenType type = GetPenType();
+
+ if (type != PenTypeSolidColor)
+ {
+ return WrongState;
+ }
+
+ ARGB argb;
+
+ SetStatus(DllExports::GdipGetPenColor(nativePen,
+ &argb));
+ if (lastResult == Ok)
+ {
+ color->SetValue(argb);
+ }
+
+ return lastResult;
+ }
+
+ Brush* GetBrush() const
+ {
+ PenType type = GetPenType();
+
+ Brush* brush = NULL;
+
+ switch(type)
+ {
+ case PenTypeSolidColor:
+ brush = new SolidBrush();
+ break;
+
+ case PenTypeHatchFill:
+ brush = new HatchBrush();
+ break;
+
+ case PenTypeTextureFill:
+ brush = new TextureBrush();
+ break;
+
+ case PenTypePathGradient:
+ brush = new Brush();
+ break;
+
+ case PenTypeLinearGradient:
+ brush = new LinearGradientBrush();
+ break;
+
+ default:
+ break;
+ }
+
+ if(brush)
+ {
+ GpBrush* nativeBrush;
+
+ SetStatus(DllExports::GdipGetPenBrushFill(nativePen, &nativeBrush));
+ brush->SetNativeBrush(nativeBrush);
+ }
+
+ return brush;
+ }
+
+ DashStyle GetDashStyle() const
+ {
+ DashStyle dashStyle;
+
+ SetStatus(DllExports::GdipGetPenDashStyle(nativePen, &dashStyle));
+
+ return dashStyle;
+ }
+
+ Status SetDashStyle(IN DashStyle dashStyle)
+ {
+ return SetStatus(DllExports::GdipSetPenDashStyle(nativePen, dashStyle));
+ }
+
+ REAL GetDashOffset() const
+ {
+ REAL dashOffset;
+
+ SetStatus(DllExports::GdipGetPenDashOffset(nativePen, &dashOffset));
+
+ return dashOffset;
+ }
+
+ Status SetDashOffset(IN REAL dashOffset)
+ {
+ return SetStatus(DllExports::GdipSetPenDashOffset(nativePen, dashOffset));
+ }
+
+ Status SetDashPattern(IN const REAL* dashArray, IN INT count)
+ {
+ return SetStatus(DllExports::GdipSetPenDashArray(nativePen, dashArray,
+ count));
+ }
+
+ INT GetDashPatternCount() const
+ {
+ INT count = 0;
+
+ SetStatus(DllExports::GdipGetPenDashCount(nativePen, &count));
+
+ return count;
+ }
+
+ Status GetDashPattern(OUT REAL* dashArray,
+ IN INT count) const
+ {
+ if (dashArray == NULL || count <= 0)
+ return SetStatus(InvalidParameter);
+
+ return SetStatus(DllExports::GdipGetPenDashArray(nativePen,
+ dashArray,
+ count));
+ }
+
+ Status SetCompoundArray(IN const REAL* compoundArray,
+ IN INT count)
+ {
+ return SetStatus(DllExports::GdipSetPenCompoundArray(nativePen, compoundArray,
+ count));
+ }
+
+ INT GetCompoundArrayCount() const
+ {
+ INT count = 0;
+
+ SetStatus(DllExports::GdipGetPenCompoundCount(nativePen, &count));
+
+ return count;
+ }
+
+ Status GetCompoundArray(OUT REAL* compoundArray,
+ IN INT count) const
+ {
+ if (compoundArray == NULL || count <= 0)
+ return SetStatus(InvalidParameter);
+
+ return SetStatus(DllExports::GdipGetPenCompoundArray(nativePen,
+ compoundArray,
+ count));
+ }
+
+ Status GetLastStatus() const
+ {
+ Status lastStatus = lastResult;
+ lastResult = Ok;
+
+ return lastStatus;
+ }
+
+protected:
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ Pen(const Pen &);
+ Pen& operator=(const Pen &);
+protected:
+
+#else
+
+ Pen(const Pen& pen)
+ {
+ pen;
+ SetStatus(NotImplemented);
+ SetNativePen(NULL);
+ }
+
+ Pen& operator=(const Pen& pen)
+ {
+ pen;
+ SetStatus(NotImplemented);
+ return *this;
+ }
+
+#endif
+
+ Pen(GpPen* nativePen, Status status)
+ {
+ lastResult = status;
+ SetNativePen(nativePen);
+ }
+
+ VOID SetNativePen(GpPen* nativePen)
+ {
+ this->nativePen = nativePen;
+ }
+
+ Status SetStatus(Status status) const
+ {
+ if (status != Ok)
+ return (lastResult = status);
+ else
+ return status;
+ }
+
+protected:
+ GpPen* nativePen;
+ mutable Status lastResult;
+};
+
+#endif
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusPixelFormats.h b/core/src/fxge/Microsoft SDK/include/GdiPlusPixelFormats.h
new file mode 100644
index 0000000000..f9dc5991d4
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusPixelFormats.h
@@ -0,0 +1,201 @@
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* Gdiplus pixel formats
+*
+* Abstract:
+*
+* Definitions for color types, palettes, pixel format IDs.
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUSPIXELFORMATS_H
+#define _GDIPLUSPIXELFORMATS_H
+
+/*
+ * 32-bit and 64-bit ARGB pixel value
+ */
+
+typedef DWORD ARGB;
+typedef DWORDLONG ARGB64;
+
+#define ALPHA_SHIFT 24
+#define RED_SHIFT 16
+#define GREEN_SHIFT 8
+#define BLUE_SHIFT 0
+#define ALPHA_MASK ((ARGB) 0xff << ALPHA_SHIFT)
+
+/*
+ * In-memory pixel data formats:
+ * bits 0-7 = format index
+ * bits 8-15 = pixel size (in bits)
+ * bits 16-23 = flags
+ * bits 24-31 = reserved
+ */
+
+#ifndef DCR_USE_NEW_105760
+
+enum PixelFormat
+{
+ PixelFormatIndexed = 0x00010000, // Indexes into a palette
+ PixelFormatGDI = 0x00020000, // Is a GDI-supported format
+ PixelFormatAlpha = 0x00040000, // Has an alpha component
+ PixelFormatPAlpha = 0x00080000, // Uses pre-multiplied alpha
+ PixelFormatExtended = 0x00100000, // Uses extended color (16 bits per channel)
+ PixelFormatCanonical = 0x00200000, // ?
+
+ PixelFormatUndefined = 0,
+ PixelFormatDontCare = 0,
+
+ PixelFormat1bppIndexed = 1 | ( 1 << 8) | PixelFormatIndexed
+ | PixelFormatGDI,
+ PixelFormat4bppIndexed = 2 | ( 4 << 8) | PixelFormatIndexed
+ | PixelFormatGDI,
+ PixelFormat8bppIndexed = 3 | ( 8 << 8) | PixelFormatIndexed
+ | PixelFormatGDI,
+ PixelFormat16bppGrayScale = 4 | (16 << 8) | PixelFormatExtended,
+ PixelFormat16bppRGB555 = 5 | (16 << 8) | PixelFormatGDI,
+ PixelFormat16bppRGB565 = 6 | (16 << 8) | PixelFormatGDI,
+ PixelFormat16bppARGB1555 = 7 | (16 << 8) | PixelFormatAlpha
+ | PixelFormatGDI,
+ PixelFormat24bppRGB = 8 | (24 << 8) | PixelFormatGDI,
+ PixelFormat32bppRGB = 9 | (32 << 8) | PixelFormatGDI,
+ PixelFormat32bppARGB = 10 | (32 << 8) | PixelFormatAlpha
+ | PixelFormatGDI
+ | PixelFormatCanonical,
+ PixelFormat32bppPARGB = 11 | (32 << 8) | PixelFormatAlpha
+ | PixelFormatPAlpha
+ | PixelFormatGDI,
+ PixelFormat48bppRGB = 12 | (48 << 8) | PixelFormatExtended,
+ PixelFormat64bppARGB = 13 | (64 << 8) | PixelFormatAlpha
+ | PixelFormatCanonical
+ | PixelFormatExtended,
+ PixelFormat64bppPARGB = 14 | (64 << 8) | PixelFormatAlpha
+ | PixelFormatPAlpha
+ | PixelFormatExtended,
+ PixelFormat24bppBGR = 15 | (24 << 8) | PixelFormatGDI,
+ PixelFormatMax = 16
+};
+
+#else
+
+typedef INT PixelFormat;
+
+#define PixelFormatIndexed 0x00010000 // Indexes into a palette
+#define PixelFormatGDI 0x00020000 // Is a GDI-supported format
+#define PixelFormatAlpha 0x00040000 // Has an alpha component
+#define PixelFormatPAlpha 0x00080000 // Uses pre-multiplied alpha
+#define PixelFormatExtended 0x00100000 // Uses extended color (16 bits per channel)
+#define PixelFormatCanonical 0x00200000 // ?
+
+#define PixelFormatUndefined 0
+#define PixelFormatDontCare 0
+
+#define PixelFormat1bppIndexed (1 | ( 1 << 8) | PixelFormatIndexed | PixelFormatGDI)
+#define PixelFormat4bppIndexed (2 | ( 4 << 8) | PixelFormatIndexed | PixelFormatGDI)
+#define PixelFormat8bppIndexed (3 | ( 8 << 8) | PixelFormatIndexed | PixelFormatGDI)
+#define PixelFormat16bppGrayScale (4 | (16 << 8) | PixelFormatExtended)
+#define PixelFormat16bppRGB555 (5 | (16 << 8) | PixelFormatGDI)
+#define PixelFormat16bppRGB565 (6 | (16 << 8) | PixelFormatGDI)
+#define PixelFormat16bppARGB1555 (7 | (16 << 8) | PixelFormatAlpha | PixelFormatGDI)
+#define PixelFormat24bppRGB (8 | (24 << 8) | PixelFormatGDI)
+#define PixelFormat32bppRGB (9 | (32 << 8) | PixelFormatGDI)
+#define PixelFormat32bppARGB (10 | (32 << 8) | PixelFormatAlpha | PixelFormatGDI | PixelFormatCanonical)
+#define PixelFormat32bppPARGB (11 | (32 << 8) | PixelFormatAlpha | PixelFormatPAlpha | PixelFormatGDI)
+#define PixelFormat48bppRGB (12 | (48 << 8) | PixelFormatExtended)
+#define PixelFormat64bppARGB (13 | (64 << 8) | PixelFormatAlpha | PixelFormatCanonical | PixelFormatExtended)
+#define PixelFormat64bppPARGB (14 | (64 << 8) | PixelFormatAlpha | PixelFormatPAlpha | PixelFormatExtended)
+#define PixelFormatMax 15
+
+#endif
+
+
+/*
+ * Return the pixel size for the specified format (in bits)
+ */
+
+inline UINT
+GetPixelFormatSize(
+ PixelFormat pixfmt
+ )
+{
+ return (pixfmt >> 8) & 0xff;
+}
+
+/*
+ * Determine if the specified pixel format is an indexed color format
+ */
+
+inline BOOL
+IsIndexedPixelFormat(
+ PixelFormat pixfmt
+ )
+{
+ return (pixfmt & PixelFormatIndexed) != 0;
+}
+
+/*
+ * Determine if the pixel format can have alpha channel
+ */
+
+inline BOOL
+IsAlphaPixelFormat(
+ PixelFormat pixfmt
+)
+{
+ return (pixfmt & PixelFormatAlpha) != 0;
+}
+
+/*
+ * Determine if the pixel format is an extended format,
+ * i.e. supports 16-bit per channel
+ */
+
+inline BOOL
+IsExtendedPixelFormat(
+ PixelFormat pixfmt
+ )
+{
+ return (pixfmt & PixelFormatExtended) != 0;
+}
+
+/*
+ * Determine if the pixel format is canonical format:
+ * PixelFormat32bppARGB
+ * PixelFormat32bppPARGB
+ * PixelFormat64bppARGB
+ * PixelFormat64bppPARGB
+ */
+
+inline BOOL
+IsCanonicalPixelFormat(
+ PixelFormat pixfmt
+ )
+{
+ return (pixfmt & PixelFormatCanonical) != 0;
+}
+
+/*
+ * Color palette
+ * palette entries are limited to 32bpp ARGB pixel format
+ */
+
+enum PaletteFlags
+{
+ PaletteFlagsHasAlpha = 0x0001,
+ PaletteFlagsGrayScale = 0x0002,
+ PaletteFlagsHalftone = 0x0004
+};
+
+struct ColorPalette
+{
+public:
+ UINT Flags; // palette flags
+ UINT Count; // number of color entries
+ ARGB Entries[1]; // palette color entries
+};
+
+#endif
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusRegion.h b/core/src/fxge/Microsoft SDK/include/GdiPlusRegion.h
new file mode 100644
index 0000000000..dd1d20e273
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusRegion.h
@@ -0,0 +1,498 @@
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusRegion.h
+*
+* Abstract:
+*
+* Region API related declarations
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUSREGION_H
+#define _GDIPLUSREGION_H
+
+/**
+ * Construct a new region object
+ */
+
+inline
+Region::Region()
+{
+ GpRegion *region = NULL;
+
+ lastResult = DllExports::GdipCreateRegion(&region);
+
+ SetNativeRegion(region);
+}
+
+inline
+Region::Region(IN const RectF& rect)
+{
+ GpRegion *region = NULL;
+
+ lastResult = DllExports::GdipCreateRegionRect(&rect, &region);
+
+ SetNativeRegion(region);
+}
+
+inline
+Region::Region(IN const Rect& rect)
+{
+ GpRegion *region = NULL;
+
+ lastResult = DllExports::GdipCreateRegionRectI(&rect, &region);
+
+ SetNativeRegion(region);
+}
+
+inline
+Region::Region(IN const GraphicsPath* path)
+{
+ GpRegion *region = NULL;
+
+ lastResult = DllExports::GdipCreateRegionPath(path->nativePath, &region);
+
+ SetNativeRegion(region);
+}
+
+inline
+Region::Region(IN const BYTE* regionData, IN INT size)
+{
+ GpRegion *region = NULL;
+
+ lastResult = DllExports::GdipCreateRegionRgnData(regionData, size, &region);
+
+ SetNativeRegion(region);
+}
+
+inline
+Region::Region(IN HRGN hRgn)
+{
+ GpRegion *region = NULL;
+
+ lastResult = DllExports::GdipCreateRegionHrgn(hRgn, &region);
+
+ SetNativeRegion(region);
+}
+
+inline
+Region* Region::FromHRGN(IN HRGN hRgn)
+{
+ GpRegion *region = NULL;
+
+ if (DllExports::GdipCreateRegionHrgn(hRgn, &region) == Ok)
+ {
+ Region* newRegion = new Region(region);
+
+ if (newRegion == NULL)
+ {
+ DllExports::GdipDeleteRegion(region);
+ }
+
+ return newRegion;
+ }
+ else
+ return NULL;
+}
+
+inline
+Region::~Region()
+{
+ DllExports::GdipDeleteRegion(nativeRegion);
+}
+
+/**
+ * Make a copy of the region object
+ */
+inline Region*
+Region::Clone() const
+{
+ GpRegion *region = NULL;
+
+ SetStatus(DllExports::GdipCloneRegion(nativeRegion, &region));
+
+ return new Region(region);
+}
+
+inline Status
+Region::MakeInfinite()
+{
+ return SetStatus(DllExports::GdipSetInfinite(nativeRegion));
+}
+
+inline Status
+Region::MakeEmpty()
+{
+ return SetStatus(DllExports::GdipSetEmpty(nativeRegion));
+}
+
+/**
+ * Region operations
+ */
+inline Status
+Region::Intersect(IN const RectF& rect)
+{
+ return SetStatus(DllExports::GdipCombineRegionRect(nativeRegion, &rect, CombineModeIntersect));
+}
+
+inline Status
+Region::Intersect(IN const Rect& rect)
+{
+ return SetStatus(DllExports::GdipCombineRegionRectI(nativeRegion, &rect, CombineModeIntersect));
+}
+
+inline Status
+Region::Intersect(IN const GraphicsPath* path)
+{
+ return SetStatus(DllExports::GdipCombineRegionPath(nativeRegion, path->nativePath, CombineModeIntersect));
+}
+
+inline Status
+Region::Intersect(IN const Region* region)
+{
+ return SetStatus(DllExports::GdipCombineRegionRegion(nativeRegion, region->nativeRegion, CombineModeIntersect));
+}
+
+inline Status
+Region::Union(IN const RectF& rect)
+{
+ return SetStatus(DllExports::GdipCombineRegionRect(nativeRegion, &rect, CombineModeUnion));
+}
+
+inline Status
+Region::Union(IN const Rect& rect)
+{
+ return SetStatus(DllExports::GdipCombineRegionRectI(nativeRegion, &rect, CombineModeUnion));
+}
+
+inline Status
+Region::Union(IN const GraphicsPath* path)
+{
+ return SetStatus(DllExports::GdipCombineRegionPath(nativeRegion, path->nativePath, CombineModeUnion));
+}
+
+inline Status
+Region::Union(IN const Region* region)
+{
+ return SetStatus(DllExports::GdipCombineRegionRegion(nativeRegion, region->nativeRegion, CombineModeUnion));
+}
+
+inline Status
+Region::Xor(IN const RectF& rect)
+{
+ return SetStatus(DllExports::GdipCombineRegionRect(nativeRegion, &rect, CombineModeXor));
+}
+
+inline Status
+Region::Xor(IN const Rect& rect)
+{
+ return SetStatus(DllExports::GdipCombineRegionRectI(nativeRegion, &rect, CombineModeXor));
+}
+
+inline Status
+Region::Xor(IN const GraphicsPath* path)
+{
+ return SetStatus(DllExports::GdipCombineRegionPath(nativeRegion, path->nativePath, CombineModeXor));
+}
+
+inline Status
+Region::Xor(IN const Region* region)
+{
+ return SetStatus(DllExports::GdipCombineRegionRegion(nativeRegion, region->nativeRegion, CombineModeXor));
+}
+
+inline Status
+Region::Exclude(IN const RectF& rect)
+{
+ return SetStatus(DllExports::GdipCombineRegionRect(nativeRegion, &rect, CombineModeExclude));
+}
+
+inline Status
+Region::Exclude(IN const Rect& rect)
+{
+ return SetStatus(DllExports::GdipCombineRegionRectI(nativeRegion, &rect, CombineModeExclude));
+}
+
+inline Status
+Region::Exclude(IN const GraphicsPath* path)
+{
+ return SetStatus(DllExports::GdipCombineRegionPath(nativeRegion, path->nativePath, CombineModeExclude));
+}
+
+inline Status
+Region::Exclude(IN const Region* region)
+{
+ return SetStatus(DllExports::GdipCombineRegionRegion(nativeRegion,
+ region->nativeRegion, CombineModeExclude));
+}
+
+inline Status
+Region::Complement(IN const RectF& rect)
+{
+ return SetStatus(DllExports::GdipCombineRegionRect(nativeRegion, &rect, CombineModeComplement));
+}
+
+inline Status
+Region::Complement(IN const Rect& rect)
+{
+ return SetStatus(DllExports::GdipCombineRegionRectI(nativeRegion, &rect, CombineModeComplement));
+}
+
+inline Status
+Region::Complement(IN const GraphicsPath* path)
+{
+ return SetStatus(DllExports::GdipCombineRegionPath(nativeRegion,
+ path->nativePath, CombineModeComplement));
+}
+
+inline Status
+Region::Complement(IN const Region* region)
+{
+ return SetStatus(DllExports::GdipCombineRegionRegion(nativeRegion,
+ region->nativeRegion, CombineModeComplement));
+}
+
+/**
+ * Transform operations
+ */
+inline Status
+Region::Translate(IN REAL dx,
+ IN REAL dy)
+{
+ return SetStatus(DllExports::GdipTranslateRegion(nativeRegion, dx, dy));
+}
+
+inline Status
+Region::Translate(IN INT dx,
+ IN INT dy)
+{
+ return SetStatus(DllExports::GdipTranslateRegionI(nativeRegion, dx, dy));
+}
+
+inline Status
+Region::Transform(IN const Matrix* matrix)
+{
+ return SetStatus(DllExports::GdipTransformRegion(nativeRegion, matrix->nativeMatrix));
+}
+
+/**
+ * Get region attributes
+ */
+inline Status
+Region::GetBounds(OUT RectF* rect,
+ IN const Graphics* g) const
+{
+ return SetStatus(DllExports::GdipGetRegionBounds(nativeRegion,
+ g->nativeGraphics,
+ rect));
+}
+
+inline Status
+Region::GetBounds(OUT Rect* rect,
+ IN const Graphics* g) const
+{
+ return SetStatus(DllExports::GdipGetRegionBoundsI(nativeRegion,
+ g->nativeGraphics,
+ rect));
+}
+
+inline HRGN
+Region::GetHRGN(IN const Graphics* g) const
+{
+ HRGN hrgn;
+
+ SetStatus(DllExports::GdipGetRegionHRgn(nativeRegion,
+ g->nativeGraphics,
+ &hrgn));
+
+ return hrgn;
+}
+
+inline BOOL
+Region::IsEmpty(IN const Graphics *g) const
+{
+ BOOL booln = FALSE;
+
+ SetStatus(DllExports::GdipIsEmptyRegion(nativeRegion,
+ g->nativeGraphics,
+ &booln));
+
+ return booln;
+}
+
+inline BOOL
+Region::IsInfinite(IN const Graphics *g) const
+{
+ BOOL booln = FALSE;
+
+ SetStatus(DllExports::GdipIsInfiniteRegion(nativeRegion,
+ g->nativeGraphics,
+ &booln));
+
+ return booln;
+}
+
+inline BOOL
+Region::Equals(IN const Region* region,
+ IN const Graphics* g) const
+{
+ BOOL booln = FALSE;
+
+ SetStatus(DllExports::GdipIsEqualRegion(nativeRegion,
+ region->nativeRegion,
+ g->nativeGraphics,
+ &booln));
+ return booln;
+}
+
+// Get the size of the buffer needed for the GetData method
+inline UINT
+Region::GetDataSize() const
+{
+ UINT bufferSize = 0;
+
+ SetStatus(DllExports::GdipGetRegionDataSize(nativeRegion, &bufferSize));
+
+ return bufferSize;
+}
+
+// buffer - where to put the data
+// bufferSize - how big the buffer is (should be at least as big as GetDataSize())
+// sizeFilled - if not NULL, this is an OUT param that says how many bytes
+// of data were written to the buffer.
+inline Status
+Region::GetData(OUT BYTE* buffer,
+ IN UINT bufferSize,
+ OUT UINT* sizeFilled) const
+{
+ return SetStatus(DllExports::GdipGetRegionData(nativeRegion, buffer, bufferSize, sizeFilled));
+}
+
+/**
+ * Hit testing operations
+ */
+inline BOOL
+Region::IsVisible(IN const PointF& point,
+ IN const Graphics* g) const
+{
+ BOOL booln = FALSE;
+
+ SetStatus(DllExports::GdipIsVisibleRegionPoint(nativeRegion,
+ point.X, point.Y,
+ (g == NULL) ? NULL : g->nativeGraphics,
+ &booln));
+ return booln;
+}
+
+inline BOOL
+Region::IsVisible(IN const RectF& rect,
+ IN const Graphics* g) const
+{
+ BOOL booln = FALSE;
+
+ SetStatus(DllExports::GdipIsVisibleRegionRect(nativeRegion, rect.X,
+ rect.Y, rect.Width,
+ rect.Height,
+ (g == NULL) ? NULL : g->nativeGraphics,
+ &booln));
+ return booln;
+}
+
+inline BOOL
+Region::IsVisible(IN const Point& point,
+ IN const Graphics* g) const
+{
+ BOOL booln = FALSE;
+
+
+ SetStatus(DllExports::GdipIsVisibleRegionPointI(nativeRegion,
+ point.X,
+ point.Y,
+ (g == NULL) ? NULL : g->nativeGraphics,
+ &booln));
+ return booln;
+}
+
+inline BOOL
+Region::IsVisible(IN const Rect& rect,
+ IN const Graphics* g) const
+{
+ BOOL booln = FALSE;
+
+ SetStatus(DllExports::GdipIsVisibleRegionRectI(nativeRegion,
+ rect.X,
+ rect.Y,
+ rect.Width,
+ rect.Height,
+ (g == NULL) ? NULL : g->nativeGraphics,
+ &booln));
+ return booln;
+}
+
+inline UINT
+Region::GetRegionScansCount(IN const Matrix* matrix) const
+{
+ UINT count = 0;
+
+ SetStatus(DllExports::GdipGetRegionScansCount(nativeRegion,
+ &count,
+ matrix->nativeMatrix));
+ return count;
+}
+
+inline Status
+Region::GetRegionScans(
+ IN const Matrix* matrix,
+ OUT RectF* rects,
+ IN OUT INT* count) const
+{
+ return SetStatus(DllExports::GdipGetRegionScans(nativeRegion,
+ rects,
+ count,
+ matrix->nativeMatrix));
+}
+
+// If rects is NULL, return the count of rects in the region.
+// Otherwise, assume rects is big enough to hold all the region rects
+// and fill them in and return the number of rects filled in.
+// The rects are returned in the units specified by the matrix
+// (which is typically a world-to-device transform).
+// Note that the number of rects returned can vary, depending on the
+// matrix that is used.
+inline Status
+Region::GetRegionScans(
+ IN const Matrix* matrix,
+ OUT Rect* rects, // NULL to just get the count
+ IN OUT INT* count) const
+{
+ return SetStatus(DllExports::GdipGetRegionScansI(nativeRegion,
+ rects,
+ count,
+ matrix->nativeMatrix));
+}
+
+// protected method
+inline Region::Region(GpRegion* nativeRegion)
+{
+ SetNativeRegion(nativeRegion);
+}
+
+// protected method
+inline VOID Region::SetNativeRegion(GpRegion* nativeRegion)
+{
+ this->nativeRegion = nativeRegion;
+}
+
+inline Status Region::GetLastStatus() const
+{
+ Status lastStatus = lastResult;
+ lastResult = Ok;
+
+ return lastStatus;
+}
+
+#endif // !_GDIPLUSREGION_H
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusStringFormat.h b/core/src/fxge/Microsoft SDK/include/GdiPlusStringFormat.h
new file mode 100644
index 0000000000..1c9ddb50ec
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusStringFormat.h
@@ -0,0 +1,381 @@
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusStringFormat.h
+*
+* Abstract:
+*
+* String format specification for DrawString and text APIs
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUSSTRINGFORMAT_H
+#define _GDIPLUSSTRINGFORMAT_H
+
+
+class StringFormat : public GdiplusBase
+{
+public:
+ friend class Graphics;
+ friend class GraphicsPath;
+
+
+ StringFormat(
+ IN INT formatFlags = 0,
+ IN LANGID language = LANG_NEUTRAL
+ )
+ {
+ nativeFormat = NULL;
+ lastError = DllExports::GdipCreateStringFormat(
+ formatFlags,
+ language,
+ &nativeFormat
+ );
+ }
+
+ static const StringFormat *GenericDefault();
+ static const StringFormat *GenericTypographic();
+
+ // Constructor based on existing string format
+
+ StringFormat(
+ IN const StringFormat *format
+ )
+ {
+ nativeFormat = NULL;
+ lastError = DllExports::GdipCloneStringFormat(
+ format ? format->nativeFormat : NULL,
+ &nativeFormat
+ );
+ }
+
+ StringFormat *Clone() const
+ {
+ GpStringFormat *clonedStringFormat = NULL;
+
+ lastError = DllExports::GdipCloneStringFormat(
+ nativeFormat,
+ &clonedStringFormat
+ );
+
+ if (lastError == Ok)
+ return new StringFormat(clonedStringFormat, lastError);
+ else
+ return NULL;
+ }
+
+ ~StringFormat()
+ {
+ DllExports::GdipDeleteStringFormat(nativeFormat);
+ }
+
+ Status SetFormatFlags(IN INT flags)
+ {
+ return SetStatus(DllExports::GdipSetStringFormatFlags(
+ nativeFormat,
+ flags
+ ));
+ }
+
+ INT GetFormatFlags() const
+ {
+ INT flags;
+ SetStatus(DllExports::GdipGetStringFormatFlags(nativeFormat, &flags));
+ return flags;
+ }
+
+#ifndef DCR_USE_NEW_152154
+ Status SetLineSpacing(
+ IN REAL amount = 1.0f,
+ IN LineSpacing method = LineSpacingRecommended
+ )
+ {
+ return SetStatus(DllExports::GdipSetStringFormatLineSpacing(
+ nativeFormat,
+ amount,
+ method
+ ));
+ }
+#endif
+
+ Status SetAlignment(IN StringAlignment align)
+ {
+ return SetStatus(DllExports::GdipSetStringFormatAlign(
+ nativeFormat,
+ align
+ ));
+ }
+
+ StringAlignment GetAlignment() const
+ {
+ StringAlignment alignment;
+ SetStatus(DllExports::GdipGetStringFormatAlign(
+ nativeFormat,
+ &alignment
+ ));
+ return alignment;
+ }
+
+ Status SetLineAlignment(IN StringAlignment align)
+ {
+ return SetStatus(DllExports::GdipSetStringFormatLineAlign(
+ nativeFormat,
+ align
+ ));
+ }
+
+ StringAlignment GetLineAlignment() const
+ {
+ StringAlignment alignment;
+ SetStatus(DllExports::GdipGetStringFormatLineAlign(
+ nativeFormat,
+ &alignment
+ ));
+ return alignment;
+ }
+
+ Status SetHotkeyPrefix(IN HotkeyPrefix hotkeyPrefix)
+ {
+ return SetStatus(DllExports::GdipSetStringFormatHotkeyPrefix(
+ nativeFormat,
+ (INT)hotkeyPrefix
+ ));
+ }
+
+ HotkeyPrefix GetHotkeyPrefix() const
+ {
+ HotkeyPrefix hotkeyPrefix;
+ SetStatus(DllExports::GdipGetStringFormatHotkeyPrefix(
+ nativeFormat,
+ (INT*)&hotkeyPrefix
+ ));
+ return hotkeyPrefix;
+ }
+
+ Status SetTabStops(
+ IN REAL firstTabOffset,
+ IN INT count,
+ IN const REAL *tabStops
+ )
+ {
+ return SetStatus(DllExports::GdipSetStringFormatTabStops(
+ nativeFormat,
+ firstTabOffset,
+ count,
+ tabStops
+ ));
+ }
+
+ INT GetTabStopCount() const
+ {
+ INT count;
+ SetStatus(DllExports::GdipGetStringFormatTabStopCount(nativeFormat, &count));
+ return count;
+ }
+
+ Status GetTabStops(
+ IN INT count,
+ OUT REAL *firstTabOffset,
+ OUT REAL *tabStops
+ ) const
+ {
+ return SetStatus(DllExports::GdipGetStringFormatTabStops(
+ nativeFormat,
+ count,
+ firstTabOffset,
+ tabStops
+ ));
+ }
+
+#ifdef DCR_USE_NEW_146933
+ Status SetDigitSubstitution(
+ IN LANGID language,
+ IN StringDigitSubstitute substitute
+ )
+ {
+ return SetStatus(DllExports::GdipSetStringFormatDigitSubstitution(
+ nativeFormat,
+ language,
+ substitute
+ ));
+ }
+
+ LANGID GetDigitSubstitutionLanguage(
+ ) const
+ {
+ LANGID language;
+ SetStatus(DllExports::GdipGetStringFormatDigitSubstitution(
+ nativeFormat,
+ &language,
+ NULL
+ ));
+ return language;
+ }
+
+ StringDigitSubstitute GetDigitSubstitutionMethod(
+ ) const
+ {
+ StringDigitSubstitute substitute;
+ SetStatus(DllExports::GdipGetStringFormatDigitSubstitution(
+ nativeFormat,
+ NULL,
+ &substitute
+ ));
+ return substitute;
+ }
+#endif // DCR_USE_NEW_146933
+
+ // String trimming. How to handle more text than can be displayed
+ // in the limits available.
+
+ Status SetTrimming(IN StringTrimming trimming)
+ {
+ return SetStatus(DllExports::GdipSetStringFormatTrimming(
+ nativeFormat,
+ trimming
+ ));
+ }
+
+ StringTrimming StringFormat::GetTrimming() const
+ {
+ StringTrimming trimming;
+ SetStatus(DllExports::GdipGetStringFormatTrimming(
+ nativeFormat,
+ &trimming
+ ));
+ return trimming;
+ }
+
+#ifdef DCR_USE_NEW_174340
+ Status SetMeasurableCharacterRanges(
+ IN INT rangeCount,
+ IN const CharacterRange *ranges
+ )
+ {
+ return SetStatus(DllExports::GdipSetStringFormatMeasurableCharacterRanges(
+ nativeFormat,
+ rangeCount,
+ ranges
+ ));
+ }
+
+ INT GetMeasurableCharacterRangeCount()
+ {
+ INT count;
+ SetStatus(DllExports::GdipGetStringFormatMeasurableCharacterRangeCount(
+ nativeFormat,
+ &count
+ ));
+ return count;
+ }
+#endif
+
+ // GetLastStatus - return last error code and clear error code
+
+ Status GetLastStatus() const
+ {
+ Status lastStatus = lastError;
+ lastError = Ok;
+
+ return lastStatus;
+ }
+
+protected:
+
+ Status SetStatus(GpStatus newStatus) const
+ {
+ if (newStatus == Ok)
+ {
+ return Ok;
+ }
+ else
+ {
+ return lastError = newStatus;
+ }
+ }
+
+
+// Not allowed and move to private
+ StringFormat(const StringFormat &source)
+ {
+ nativeFormat = NULL;
+ lastError = DllExports::GdipCloneStringFormat(
+ source.nativeFormat,
+ &nativeFormat
+ );
+ }
+
+ StringFormat& operator=(const StringFormat &source)
+ {
+ DllExports::GdipDeleteStringFormat(nativeFormat);
+ lastError = DllExports::GdipCloneStringFormat(
+ source.nativeFormat,
+ &nativeFormat
+ );
+ return *this;
+ }
+
+
+ // private constructor for copy
+ StringFormat(GpStringFormat * clonedStringFormat, Status status)
+ {
+ lastError = status;
+ nativeFormat = clonedStringFormat;
+
+ }
+
+ GpStringFormat *nativeFormat;
+ mutable Status lastError;
+};
+
+// Generic constant string formats.
+
+static BYTE GenericTypographicStringFormatBuffer[sizeof(StringFormat)] = {0};
+static BYTE GenericDefaultStringFormatBuffer[sizeof(StringFormat)] = {0};
+
+static StringFormat *GenericTypographicStringFormat = NULL;
+static StringFormat *GenericDefaultStringFormat = NULL;
+
+// Define the generic string formats
+
+
+inline const StringFormat *StringFormat::GenericDefault()
+{
+ if (GenericDefaultStringFormat != NULL)
+ {
+ return GenericDefaultStringFormat;
+ }
+
+ GenericDefaultStringFormat =
+ (StringFormat*)GenericDefaultStringFormatBuffer;
+
+ GenericDefaultStringFormat->lastError =
+ DllExports::GdipStringFormatGetGenericDefault(
+ &(GenericDefaultStringFormat->nativeFormat)
+ );
+
+ return GenericDefaultStringFormat;
+}
+
+inline const StringFormat *StringFormat::GenericTypographic()
+{
+ if (GenericTypographicStringFormat != NULL)
+ {
+ return GenericTypographicStringFormat;
+ }
+
+ GenericTypographicStringFormat =
+ (StringFormat*)GenericTypographicStringFormatBuffer;
+
+ GenericTypographicStringFormat->lastError =
+ DllExports::GdipStringFormatGetGenericTypographic(
+ &GenericTypographicStringFormat->nativeFormat
+ );
+
+ return GenericTypographicStringFormat;
+}
+
+#endif // !_GDIPLUSSTRINGFORMAT_H
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusTypes.h b/core/src/fxge/Microsoft SDK/include/GdiPlusTypes.h
new file mode 100644
index 0000000000..58c584dc1d
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusTypes.h
@@ -0,0 +1,826 @@
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* GdiplusTypes.h
+*
+* Abstract:
+*
+* Basic types used by GDI+
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUSTYPES_H
+#define _GDIPLUSTYPES_H
+
+#ifndef DCR_USE_NEW_175866
+
+//--------------------------------------------------------------------------
+// LIB version initialization functions
+//--------------------------------------------------------------------------
+
+typedef VOID (__cdecl *DEBUGEVENTFUNCTION)(INT level, CHAR *message);
+
+extern "C" BOOL __stdcall InitializeGdiplus(DEBUGEVENTFUNCTION);
+extern "C" VOID __stdcall UninitializeGdiplus();
+
+#endif
+
+//--------------------------------------------------------------------------
+// Callback functions
+//--------------------------------------------------------------------------
+
+extern "C" {
+typedef BOOL (CALLBACK * ImageAbort)(VOID *);
+typedef ImageAbort DrawImageAbort;
+typedef ImageAbort GetThumbnailImageAbort;
+}
+
+// Callback for EnumerateMetafile methods. The parameters are:
+
+// recordType WMF, EMF, or EMF+ record type
+// flags (always 0 for WMF/EMF records)
+// dataSize size of the record data (in bytes), or 0 if no data
+// data pointer to the record data, or NULL if no data
+// callbackData pointer to callbackData, if any
+
+// This method can then call Metafile::PlayRecord to play the
+// record that was just enumerated. If this method returns
+// FALSE, the enumeration process is aborted. Otherwise, it continues.
+
+extern "C" {
+typedef BOOL (CALLBACK * EnumerateMetafileProc)(EmfPlusRecordType,UINT,UINT,const BYTE*,VOID*);
+}
+
+//--------------------------------------------------------------------------
+// Primitive data types
+//
+// NOTE:
+// Types already defined in standard header files:
+// INT8
+// UINT8
+// INT16
+// UINT16
+// INT32
+// UINT32
+// INT64
+// UINT64
+//
+// Avoid using the following types:
+// LONG - use INT
+// ULONG - use UINT
+// DWORD - use UINT32
+//--------------------------------------------------------------------------
+
+typedef float REAL;
+
+#define REAL_MAX FLT_MAX
+#define REAL_MIN FLT_MIN
+#define REAL_TOLERANCE (FLT_MIN * 100)
+#define REAL_EPSILON 1.192092896e-07F /* FLT_EPSILON */
+
+//--------------------------------------------------------------------------
+// Forward declarations of various internal classes
+//--------------------------------------------------------------------------
+
+class Size;
+class SizeF;
+class Point;
+class PointF;
+class Rect;
+class RectF;
+class CharacterRange;
+
+//--------------------------------------------------------------------------
+// Return values from any GDI+ API
+//--------------------------------------------------------------------------
+
+enum Status
+{
+ Ok = 0,
+ GenericError = 1,
+ InvalidParameter = 2,
+ OutOfMemory = 3,
+ ObjectBusy = 4,
+ InsufficientBuffer = 5,
+ NotImplemented = 6,
+ Win32Error = 7,
+ WrongState = 8,
+ Aborted = 9,
+#ifdef DCR_USE_NEW_135429
+ FileNotFound = 10,
+ ValueOverflow = 11,
+ AccessDenied = 12,
+ UnknownImageFormat = 13,
+ FontFamilyNotFound = 14,
+ FontStyleNotFound = 15,
+ NotTrueTypeFont = 16,
+#else
+ NotFound = 10,
+ ValueOverflow = 11,
+#endif
+ UnsupportedGdiplusVersion = 17,
+ GdiplusNotInitialized
+
+};
+
+//--------------------------------------------------------------------------
+// Represents a dimension in a 2D coordinate system
+// (floating-point coordinates)
+//--------------------------------------------------------------------------
+
+class SizeF
+{
+public:
+
+ // Default constructor
+ SizeF()
+ {
+ Width = Height = 0.0f;
+ }
+
+ SizeF(IN const SizeF& size)
+ {
+ Width = size.Width;
+ Height = size.Height;
+ }
+
+ SizeF(IN REAL width,
+ IN REAL height)
+ {
+ Width = width;
+ Height = height;
+ }
+
+ SizeF operator+(IN const SizeF& sz) const
+ {
+ return SizeF(Width + sz.Width,
+ Height + sz.Height);
+ }
+
+ SizeF operator-(IN const SizeF& sz) const
+ {
+ return SizeF(Width - sz.Width,
+ Height - sz.Height);
+ }
+
+ BOOL Equals(IN const SizeF& sz) const
+ {
+ return (Width == sz.Width) && (Height == sz.Height);
+ }
+
+ BOOL Empty() const
+ {
+ return (Width == 0.0f && Height == 0.0f);
+ }
+
+public:
+
+ REAL Width;
+ REAL Height;
+};
+
+//--------------------------------------------------------------------------
+// Represents a dimension in a 2D coordinate system
+// (integer coordinates)
+//--------------------------------------------------------------------------
+
+class Size
+{
+public:
+
+ // Default constructor
+ Size()
+ {
+ Width = Height = 0;
+ }
+
+ Size(IN const Size& size)
+ {
+ Width = size.Width;
+ Height = size.Height;
+ }
+
+ Size(IN INT width,
+ IN INT height)
+ {
+ Width = width;
+ Height = height;
+ }
+
+ Size operator+(IN const Size& sz) const
+ {
+ return Size(Width + sz.Width,
+ Height + sz.Height);
+ }
+
+ Size operator-(IN const Size& sz) const
+ {
+ return Size(Width - sz.Width,
+ Height - sz.Height);
+ }
+
+ BOOL Equals(IN const Size& sz) const
+ {
+ return (Width == sz.Width) && (Height == sz.Height);
+ }
+
+ BOOL Empty() const
+ {
+ return (Width == 0 && Height == 0);
+ }
+
+public:
+
+ INT Width;
+ INT Height;
+};
+
+//--------------------------------------------------------------------------
+// Represents a location in a 2D coordinate system
+// (floating-point coordinates)
+//--------------------------------------------------------------------------
+
+class PointF
+{
+public:
+ PointF()
+ {
+ X = Y = 0.0f;
+ }
+
+ PointF(IN const PointF &point)
+ {
+ X = point.X;
+ Y = point.Y;
+ }
+
+ PointF(IN const SizeF &size)
+ {
+ X = size.Width;
+ Y = size.Height;
+ }
+
+ PointF(IN REAL x,
+ IN REAL y)
+ {
+ X = x;
+ Y = y;
+ }
+
+ PointF operator+(IN const PointF& point) const
+ {
+ return PointF(X + point.X,
+ Y + point.Y);
+ }
+
+ PointF operator-(IN const PointF& point) const
+ {
+ return PointF(X - point.X,
+ Y - point.Y);
+ }
+
+ BOOL Equals(IN const PointF& point)
+ {
+ return (X == point.X) && (Y == point.Y);
+ }
+
+public:
+
+ REAL X;
+ REAL Y;
+};
+
+//--------------------------------------------------------------------------
+// Represents a location in a 2D coordinate system
+// (integer coordinates)
+//--------------------------------------------------------------------------
+
+class Point
+{
+public:
+ Point()
+ {
+ X = Y = 0;
+ }
+
+ Point(IN const Point &point)
+ {
+ X = point.X;
+ Y = point.Y;
+ }
+
+ Point(IN const Size &size)
+ {
+ X = size.Width;
+ Y = size.Height;
+ }
+
+ Point(IN INT x,
+ IN INT y)
+ {
+ X = x;
+ Y = y;
+ }
+
+ Point operator+(IN const Point& point) const
+ {
+ return Point(X + point.X,
+ Y + point.Y);
+ }
+
+ Point operator-(IN const Point& point) const
+ {
+ return Point(X - point.X,
+ Y - point.Y);
+ }
+
+ BOOL Equals(IN const Point& point)
+ {
+ return (X == point.X) && (Y == point.Y);
+ }
+
+public:
+
+ INT X;
+ INT Y;
+};
+
+//--------------------------------------------------------------------------
+// Represents a rectangle in a 2D coordinate system
+// (floating-point coordinates)
+//--------------------------------------------------------------------------
+
+class RectF
+{
+public:
+
+ // Default constructor
+
+ RectF()
+ {
+ X = Y = Width = Height = 0.0f;
+ }
+
+ RectF(IN REAL x,
+ IN REAL y,
+ IN REAL width,
+ IN REAL height)
+ {
+ X = x;
+ Y = y;
+ Width = width;
+ Height = height;
+ }
+
+ RectF(IN const PointF& location,
+ IN const SizeF& size)
+ {
+ X = location.X;
+ Y = location.Y;
+ Width = size.Width;
+ Height = size.Height;
+ }
+
+ RectF* Clone() const
+ {
+ return new RectF(X, Y, Width, Height);
+ }
+
+ VOID GetLocation(OUT PointF* point) const
+ {
+ point->X = X;
+ point->Y = Y;
+ }
+
+ VOID GetSize(OUT SizeF* size) const
+ {
+ size->Width = Width;
+ size->Height = Height;
+ }
+
+ VOID GetBounds(OUT RectF* rect) const
+ {
+ rect->X = X;
+ rect->Y = Y;
+ rect->Width = Width;
+ rect->Height = Height;
+ }
+
+ // Return the left, top, right, and bottom
+ // coordinates of the rectangle
+
+ REAL GetLeft() const
+ {
+ return X;
+ }
+
+ REAL GetTop() const
+ {
+ return Y;
+ }
+
+ REAL GetRight() const
+ {
+ return X+Width;
+ }
+
+ REAL GetBottom() const
+ {
+ return Y+Height;
+ }
+
+ // Determine if the rectangle is empty
+ BOOL IsEmptyArea() const
+ {
+ return (Width <= REAL_EPSILON) || (Height <= REAL_EPSILON);
+ }
+
+ BOOL Equals(IN const RectF & rect) const
+ {
+ return X == rect.X &&
+ Y == rect.Y &&
+ Width == rect.Width &&
+ Height == rect.Height;
+ }
+
+ BOOL Contains(IN REAL x,
+ IN REAL y) const
+ {
+ return x >= X && x < X+Width &&
+ y >= Y && y < Y+Height;
+ }
+
+ BOOL Contains(IN const PointF& pt) const
+ {
+ return Contains(pt.X, pt.Y);
+ }
+
+ BOOL Contains(IN const RectF& rect) const
+ {
+ return (X <= rect.X) && (rect.GetRight() <= GetRight()) &&
+ (Y <= rect.Y) && (rect.GetBottom() <= GetBottom());
+ }
+
+ VOID Inflate(IN REAL dx,
+ IN REAL dy)
+ {
+ X -= dx;
+ Y -= dy;
+ Width += 2*dx;
+ Height += 2*dy;
+ }
+
+ VOID Inflate(IN const PointF& point)
+ {
+ Inflate(point.X, point.Y);
+ }
+
+ // Intersect the current rect with the specified object
+
+ BOOL Intersect(IN const RectF& rect)
+ {
+ return Intersect(*this, *this, rect);
+ }
+
+ // Intersect rect a and b and save the result into c
+ // Notice that c may be the same object as a or b.
+
+ static BOOL Intersect(OUT RectF& c,
+ IN const RectF& a,
+ IN const RectF& b)
+ {
+ REAL right = min(a.GetRight(), b.GetRight());
+ REAL bottom = min(a.GetBottom(), b.GetBottom());
+ REAL left = max(a.GetLeft(), b.GetLeft());
+ REAL top = max(a.GetTop(), b.GetTop());
+
+ c.X = left;
+ c.Y = top;
+ c.Width = right - left;
+ c.Height = bottom - top;
+ return !c.IsEmptyArea();
+ }
+
+ // Determine if the specified rect intersects with the
+ // current rect object.
+
+ BOOL IntersectsWith(IN const RectF& rect) const
+ {
+ return (GetLeft() < rect.GetRight() &&
+ GetTop() < rect.GetTop() &&
+ GetRight() > rect.GetLeft() &&
+ GetBottom() > rect.GetTop());
+ }
+
+ static BOOL Union(OUT RectF& c,
+ IN const RectF& a,
+ IN const RectF& b)
+ {
+ REAL right = max(a.GetRight(), b.GetRight());
+ REAL bottom = max(a.GetBottom(), b.GetBottom());
+ REAL left = min(a.GetLeft(), b.GetLeft());
+ REAL top = min(a.GetTop(), b.GetTop());
+
+ c.X = left;
+ c.Y = top;
+ c.Width = right - left;
+ c.Height = bottom - top;
+ return !c.IsEmptyArea();
+ }
+
+ VOID Offset(IN const PointF& point)
+ {
+ Offset(point.X, point.Y);
+ }
+
+ VOID Offset(IN REAL dx,
+ IN REAL dy)
+ {
+ X += dx;
+ Y += dy;
+ }
+
+public:
+
+ REAL X;
+ REAL Y;
+ REAL Width;
+ REAL Height;
+};
+
+//--------------------------------------------------------------------------
+// Represents a rectangle in a 2D coordinate system
+// (integer coordinates)
+//--------------------------------------------------------------------------
+
+class Rect
+{
+public:
+
+ // Default constructor
+
+ Rect()
+ {
+ X = Y = Width = Height = 0;
+ }
+
+ Rect(IN INT x,
+ IN INT y,
+ IN INT width,
+ IN INT height)
+ {
+ X = x;
+ Y = y;
+ Width = width;
+ Height = height;
+ }
+
+ Rect(IN const Point& location,
+ IN const Size& size)
+ {
+ X = location.X;
+ Y = location.Y;
+ Width = size.Width;
+ Height = size.Height;
+ }
+
+ Rect* Clone() const
+ {
+ return new Rect(X, Y, Width, Height);
+ }
+
+ VOID GetLocation(OUT Point* point) const
+ {
+ point->X = X;
+ point->Y = Y;
+ }
+
+ VOID GetSize(OUT Size* size) const
+ {
+ size->Width = Width;
+ size->Height = Height;
+ }
+
+ VOID GetBounds(OUT Rect* rect) const
+ {
+ rect->X = X;
+ rect->Y = Y;
+ rect->Width = Width;
+ rect->Height = Height;
+ }
+
+ // Return the left, top, right, and bottom
+ // coordinates of the rectangle
+
+ INT GetLeft() const
+ {
+ return X;
+ }
+
+ INT GetTop() const
+ {
+ return Y;
+ }
+
+ INT GetRight() const
+ {
+ return X+Width;
+ }
+
+ INT GetBottom() const
+ {
+ return Y+Height;
+ }
+
+ // Determine if the rectangle is empty
+ BOOL IsEmptyArea() const
+ {
+ return (Width <= 0) || (Height <= 0);
+ }
+
+ BOOL Equals(IN const Rect & rect) const
+ {
+ return X == rect.X &&
+ Y == rect.Y &&
+ Width == rect.Width &&
+ Height == rect.Height;
+ }
+
+ BOOL Contains(IN INT x,
+ IN INT y) const
+ {
+ return x >= X && x < X+Width &&
+ y >= Y && y < Y+Height;
+ }
+
+ BOOL Contains(IN const Point& pt) const
+ {
+ return Contains(pt.X, pt.Y);
+ }
+
+ BOOL Contains(IN Rect& rect) const
+ {
+ return (X <= rect.X) && (rect.GetRight() <= GetRight()) &&
+ (Y <= rect.Y) && (rect.GetBottom() <= GetBottom());
+ }
+
+ VOID Inflate(IN INT dx,
+ IN INT dy)
+ {
+ X -= dx;
+ Y -= dy;
+ Width += 2*dx;
+ Height += 2*dy;
+ }
+
+ VOID Inflate(IN const Point& point)
+ {
+ Inflate(point.X, point.Y);
+ }
+
+ // Intersect the current rect with the specified object
+
+ BOOL Intersect(IN const Rect& rect)
+ {
+ return Intersect(*this, *this, rect);
+ }
+
+ // Intersect rect a and b and save the result into c
+ // Notice that c may be the same object as a or b.
+
+ static BOOL Intersect(OUT Rect& c,
+ IN const Rect& a,
+ IN const Rect& b)
+ {
+ INT right = min(a.GetRight(), b.GetRight());
+ INT bottom = min(a.GetBottom(), b.GetBottom());
+ INT left = max(a.GetLeft(), b.GetLeft());
+ INT top = max(a.GetTop(), b.GetTop());
+
+ c.X = left;
+ c.Y = top;
+ c.Width = right - left;
+ c.Height = bottom - top;
+ return !c.IsEmptyArea();
+ }
+
+ // Determine if the specified rect intersects with the
+ // current rect object.
+
+ BOOL IntersectsWith(IN const Rect& rect) const
+ {
+ return (GetLeft() < rect.GetRight() &&
+ GetTop() < rect.GetTop() &&
+ GetRight() > rect.GetLeft() &&
+ GetBottom() > rect.GetTop());
+ }
+
+ static BOOL Union(OUT Rect& c,
+ IN const Rect& a,
+ IN const Rect& b)
+ {
+ INT right = max(a.GetRight(), b.GetRight());
+ INT bottom = max(a.GetBottom(), b.GetBottom());
+ INT left = min(a.GetLeft(), b.GetLeft());
+ INT top = min(a.GetTop(), b.GetTop());
+
+ c.X = left;
+ c.Y = top;
+ c.Width = right - left;
+ c.Height = bottom - top;
+ return !c.IsEmptyArea();
+ }
+
+ VOID Offset(IN const Point& point)
+ {
+ Offset(point.X, point.Y);
+ }
+
+ VOID Offset(IN INT dx,
+ IN INT dy)
+ {
+ X += dx;
+ Y += dy;
+ }
+
+public:
+
+ INT X;
+ INT Y;
+ INT Width;
+ INT Height;
+};
+
+// A user must mange memory for PathData.
+
+class PathData
+{
+public:
+ PathData()
+ {
+ Count = 0;
+ Points = NULL;
+ Types = NULL;
+ }
+
+ ~PathData()
+ {
+ if (Points != NULL)
+ {
+ delete Points;
+ }
+
+ if (Types != NULL)
+ {
+ delete Types;
+ }
+ }
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ PathData(const PathData &);
+ PathData& operator=(const PathData &);
+
+#endif
+
+public:
+ INT Count;
+ PointF* Points;
+ BYTE* Types;
+};
+
+
+//-----------------------------
+// text character range
+//-----------------------------
+
+class CharacterRange
+{
+public:
+ CharacterRange(
+ INT first,
+ INT length
+ ) :
+ First (first),
+ Length (length)
+ {}
+
+ CharacterRange() : First(0), Length(0)
+ {}
+
+ CharacterRange & operator = (const CharacterRange &rhs)
+ {
+ First = rhs.First;
+ Length = rhs.Length;
+ return *this;
+ }
+
+ INT First;
+ INT Length;
+};
+
+#endif // !_GDIPLUSTYPES_HPP
diff --git a/core/src/fxge/Microsoft SDK/include/GdiPlusimageAttributes.h b/core/src/fxge/Microsoft SDK/include/GdiPlusimageAttributes.h
new file mode 100644
index 0000000000..0a514772bc
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiPlusimageAttributes.h
@@ -0,0 +1,397 @@
+/**************************************************************************\
+*
+* Copyright (c) 1998-2000, Microsoft Corp. All Rights Reserved.
+*
+* Module Name:
+*
+* Image Attributes
+*
+* Abstract:
+*
+* Class for color adjustment object passed to Graphics.DrawImage
+*
+\**************************************************************************/
+
+#ifndef _GDIPLUSIMAGEATTRIBUTES_H
+#define _GDIPLUSIMAGEATTRIBUTES_H
+
+class GpImageAttributes;
+
+// There are 5 possible sets of color adjustments:
+// ColorAdjustDefault,
+// ColorAdjustBitmap,
+// ColorAdjustBrush,
+// ColorAdjustPen,
+// ColorAdjustText,
+
+// Bitmaps, Brushes, Pens, and Text will all use any color adjustments
+// that have been set into the default ImageAttributes until their own
+// color adjustments have been set. So as soon as any "Set" method is
+// called for Bitmaps, Brushes, Pens, or Text, then they start from
+// scratch with only the color adjustments that have been set for them.
+// Calling Reset removes any individual color adjustments for a type
+// and makes it revert back to using all the default color adjustments
+// (if any). The SetToIdentity method is a way to force a type to
+// have no color adjustments at all, regardless of what previous adjustments
+// have been set for the defaults or for that type.
+
+class ImageAttributes : public GdiplusBase
+{
+ friend class Graphics;
+ friend class TextureBrush;
+
+public:
+
+ ImageAttributes()
+ {
+ nativeImageAttr = NULL;
+ lastResult = DllExports::GdipCreateImageAttributes(&nativeImageAttr);
+ }
+
+ ~ImageAttributes()
+ {
+ DllExports::GdipDisposeImageAttributes(nativeImageAttr);
+ }
+
+ ImageAttributes* Clone() const
+ {
+ GpImageAttributes* clone;
+
+ SetStatus(DllExports::GdipCloneImageAttributes(
+ nativeImageAttr,
+ &clone));
+
+ return new ImageAttributes(clone, lastResult);
+ }
+
+ // Set to identity, regardless of what the default color adjustment is.
+ Status
+ SetToIdentity(
+ IN ColorAdjustType type = ColorAdjustTypeDefault
+ )
+ {
+ return SetStatus(DllExports::GdipSetImageAttributesToIdentity(
+ nativeImageAttr,
+ type));
+ }
+
+ // Remove any individual color adjustments, and go back to using the default
+ Status
+ Reset(
+ IN ColorAdjustType type = ColorAdjustTypeDefault
+ )
+ {
+ return SetStatus(DllExports::GdipResetImageAttributes(
+ nativeImageAttr,
+ type));
+ }
+
+ Status
+ SetColorMatrix(
+ IN const ColorMatrix *colorMatrix,
+ IN ColorMatrixFlags mode = ColorMatrixFlagsDefault,
+ IN ColorAdjustType type = ColorAdjustTypeDefault
+ )
+ {
+ return SetStatus(DllExports::GdipSetImageAttributesColorMatrix(
+ nativeImageAttr,
+ type,
+ TRUE,
+ colorMatrix,
+ NULL,
+ mode));
+ }
+
+ Status ClearColorMatrix(
+ IN ColorAdjustType type = ColorAdjustTypeDefault
+ )
+ {
+ return SetStatus(DllExports::GdipSetImageAttributesColorMatrix(
+ nativeImageAttr,
+ type,
+ FALSE,
+ NULL,
+ NULL,
+ ColorMatrixFlagsDefault));
+ }
+
+ Status
+ SetColorMatrices(
+ IN const ColorMatrix *colorMatrix,
+ IN const ColorMatrix *grayMatrix,
+ IN ColorMatrixFlags mode = ColorMatrixFlagsDefault,
+ IN ColorAdjustType type = ColorAdjustTypeDefault
+ )
+ {
+ return SetStatus(DllExports::GdipSetImageAttributesColorMatrix(
+ nativeImageAttr,
+ type,
+ TRUE,
+ colorMatrix,
+ grayMatrix,
+ mode));
+ }
+
+ Status ClearColorMatrices(
+ IN ColorAdjustType type = ColorAdjustTypeDefault
+ )
+ {
+ return SetStatus(DllExports::GdipSetImageAttributesColorMatrix(
+ nativeImageAttr,
+ type,
+ FALSE,
+ NULL,
+ NULL,
+ ColorMatrixFlagsDefault));
+ }
+
+ Status SetThreshold(
+ IN REAL threshold,
+ IN ColorAdjustType type = ColorAdjustTypeDefault
+ )
+ {
+ return SetStatus(DllExports::GdipSetImageAttributesThreshold(
+ nativeImageAttr,
+ type,
+ TRUE,
+ threshold));
+ }
+
+ Status ClearThreshold(
+ IN ColorAdjustType type = ColorAdjustTypeDefault
+ )
+ {
+ return SetStatus(DllExports::GdipSetImageAttributesThreshold(
+ nativeImageAttr,
+ type,
+ FALSE,
+ 0.0));
+ }
+
+ Status SetGamma(
+ IN REAL gamma,
+ IN ColorAdjustType type = ColorAdjustTypeDefault
+ )
+ {
+ return SetStatus(DllExports::GdipSetImageAttributesGamma(
+ nativeImageAttr,
+ type,
+ TRUE,
+ gamma));
+ }
+
+ Status ClearGamma(
+ IN ColorAdjustType type = ColorAdjustTypeDefault
+ )
+ {
+ return SetStatus(DllExports::GdipSetImageAttributesGamma(
+ nativeImageAttr,
+ type,
+ FALSE,
+ 0.0));
+ }
+
+ Status SetNoOp(
+ IN ColorAdjustType type = ColorAdjustTypeDefault
+ )
+ {
+ return SetStatus(DllExports::GdipSetImageAttributesNoOp(
+ nativeImageAttr,
+ type,
+ TRUE));
+ }
+
+ Status ClearNoOp(
+ IN ColorAdjustType type = ColorAdjustTypeDefault
+ )
+ {
+ return SetStatus(DllExports::GdipSetImageAttributesNoOp(
+ nativeImageAttr,
+ type,
+ FALSE));
+ }
+
+ Status SetColorKey(
+ IN const Color& colorLow,
+ IN const Color& colorHigh,
+ IN ColorAdjustType type = ColorAdjustTypeDefault
+ )
+ {
+ return SetStatus(DllExports::GdipSetImageAttributesColorKeys(
+ nativeImageAttr,
+ type,
+ TRUE,
+ colorLow.GetValue(),
+ colorHigh.GetValue()));
+ }
+
+ Status ClearColorKey(
+ IN ColorAdjustType type = ColorAdjustTypeDefault
+ )
+ {
+ return SetStatus(DllExports::GdipSetImageAttributesColorKeys(
+ nativeImageAttr,
+ type,
+ FALSE,
+ NULL,
+ NULL));
+ }
+
+ Status SetOutputChannel(
+ IN ColorChannelFlags channelFlags,
+ IN ColorAdjustType type = ColorAdjustTypeDefault
+ )
+ {
+ return SetStatus(DllExports::GdipSetImageAttributesOutputChannel(
+ nativeImageAttr,
+ type,
+ TRUE,
+ channelFlags));
+ }
+
+ Status ClearOutputChannel(
+ IN ColorAdjustType type = ColorAdjustTypeDefault
+ )
+ {
+ return SetStatus(DllExports::GdipSetImageAttributesOutputChannel(
+ nativeImageAttr,
+ type,
+ FALSE,
+ ColorChannelFlagsLast));
+ }
+
+ Status SetOutputChannelColorProfile(
+ IN const WCHAR *colorProfileFilename,
+ IN ColorAdjustType type = ColorAdjustTypeDefault
+ )
+ {
+ return SetStatus(DllExports::GdipSetImageAttributesOutputChannelColorProfile(
+ nativeImageAttr,
+ type,
+ TRUE,
+ colorProfileFilename));
+ }
+
+ Status ClearOutputChannelColorProfile(
+ IN ColorAdjustType type = ColorAdjustTypeDefault
+ )
+ {
+ return SetStatus(DllExports::GdipSetImageAttributesOutputChannelColorProfile(
+ nativeImageAttr,
+ type,
+ FALSE,
+ NULL));
+ }
+
+ Status SetRemapTable(
+ IN UINT mapSize,
+ IN const ColorMap *map,
+ IN ColorAdjustType type = ColorAdjustTypeDefault
+ )
+ {
+ return SetStatus(DllExports::GdipSetImageAttributesRemapTable(
+ nativeImageAttr,
+ type,
+ TRUE,
+ mapSize,
+ map));
+ }
+
+ Status ClearRemapTable(
+ IN ColorAdjustType type = ColorAdjustTypeDefault
+ )
+ {
+ return SetStatus(DllExports::GdipSetImageAttributesRemapTable(
+ nativeImageAttr,
+ type,
+ FALSE,
+ 0,
+ NULL));
+ }
+
+ Status SetBrushRemapTable(IN UINT mapSize,
+ IN const ColorMap *map)
+ {
+ return this->SetRemapTable(mapSize, map, ColorAdjustTypeBrush);
+ }
+
+ Status ClearBrushRemapTable()
+ {
+ return this->ClearRemapTable(ColorAdjustTypeBrush);
+ }
+
+ Status SetWrapMode(IN WrapMode wrap,
+ IN const Color& color = Color(),
+ IN BOOL clamp = FALSE)
+ {
+ ARGB argb = color.GetValue();
+
+ return SetStatus(DllExports::GdipSetImageAttributesWrapMode(
+ nativeImageAttr, wrap, argb, clamp));
+ }
+
+ #ifndef DCR_USE_NEW_145139
+ Status SetICMMode(IN BOOL on)
+ {
+ on;
+ // This is not implemented.
+ // The supported method for doing ICM conversion from the embedded
+ // ICC profile is to use the Bitmap constructor from a file or stream
+ // and specify TRUE for the useIcm parameter. This will cause the
+ // image to be ICM converted when it's loaded from the file/stream
+ // if the profile exists.
+ return SetStatus(NotImplemented);
+// DllExports::GdipSetImageAttributesICMMode(nativeImageAttr, on)
+ }
+ #endif
+
+ // The flags of the palette are ignored.
+ Status GetAdjustedPalette(IN OUT ColorPalette* colorPalette,
+ IN ColorAdjustType colorAdjustType) const
+ {
+ return SetStatus(DllExports::GdipGetImageAttributesAdjustedPalette(
+ nativeImageAttr, colorPalette, colorAdjustType));
+ }
+
+ Status GetLastStatus() const
+ {
+ Status lastStatus = lastResult;
+ lastResult = Ok;
+
+ return lastStatus;
+ }
+
+#ifdef DCR_USE_NEW_250932
+
+private:
+ ImageAttributes(const ImageAttributes &);
+ ImageAttributes& operator=(const ImageAttributes &);
+
+#endif
+
+protected:
+ ImageAttributes(GpImageAttributes* imageAttr, Status status)
+ {
+ SetNativeImageAttr(imageAttr);
+ lastResult = status;
+ }
+
+ VOID SetNativeImageAttr(GpImageAttributes* nativeImageAttr)
+ {
+ this->nativeImageAttr = nativeImageAttr;
+ }
+
+ Status SetStatus(Status status) const
+ {
+ if (status != Ok)
+ return (lastResult = status);
+ else
+ return status;
+ }
+
+protected:
+ GpImageAttributes* nativeImageAttr;
+ mutable Status lastResult;
+};
+
+#endif
diff --git a/core/src/fxge/Microsoft SDK/include/GdiplusInit.h b/core/src/fxge/Microsoft SDK/include/GdiplusInit.h
new file mode 100644
index 0000000000..3320fa4b7e
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/GdiplusInit.h
@@ -0,0 +1,104 @@
+/**************************************************************************
+*
+* Copyright (c) 2000 Microsoft Corporation
+*
+* Module Name:
+*
+* Gdiplus init
+*
+* Abstract:
+*
+* GDI+ startup/shutdown API's
+*
+* Created:
+*
+* 09/02/2000 agodfrey
+* Created it.
+*
+**************************************************************************/
+
+#ifndef _GDIPLUSINIT_H
+#define _GDIPLUSINIT_H
+//************************************************************************
+#if _FX_COMPILER_ == _FX_VC6_
+typedef unsigned long ULONG_PTR, *PULONG_PTR; //johnson add here.
+#endif
+//************************************************************************
+
+// Used for debug event notification (debug builds only)
+
+enum DebugEventLevel
+{
+ DebugEventLevelFatal,
+ DebugEventLevelWarning
+};
+
+// Callback function that GDI+ can call, on debug builds, for assertions
+// and warnings.
+
+typedef VOID (WINAPI *DebugEventProc)(DebugEventLevel level, CHAR *message);
+
+// Notification functions which the user must call appropriately if
+// "SuppressBackgroundThread" (below) is set.
+
+typedef Status (WINAPI *NotificationHookProc)(OUT ULONG_PTR *token);
+typedef VOID (WINAPI *NotificationUnhookProc)(ULONG_PTR token);
+
+// Input structure for GdiplusStartup()
+
+struct GdiplusStartupInput
+{
+ UINT32 GdiplusVersion; // Must be 1
+ DebugEventProc DebugEventCallback; // Ignored on free builds
+ BOOL SuppressBackgroundThread; // FALSE unless you're prepared to call
+ // the hook/unhook functions properly
+ BOOL SuppressExternalCodecs; // FALSE unless you want GDI+ only to use
+ // its internal image codecs.
+
+ GdiplusStartupInput(
+ DebugEventProc debugEventCallback = NULL,
+ BOOL suppressBackgroundThread = FALSE,
+ BOOL suppressExternalCodecs = FALSE)
+ {
+ GdiplusVersion = 1;
+ DebugEventCallback = debugEventCallback;
+ SuppressBackgroundThread = suppressBackgroundThread;
+ SuppressExternalCodecs = suppressExternalCodecs;
+ }
+};
+
+// Output structure for GdiplusStartup()
+
+struct GdiplusStartupOutput
+{
+ // The following 2 fields are NULL if SuppressBackgroundThread is FALSE.
+ // Otherwise, they are functions which must be called appropriately to
+ // replace the background thread.
+ //
+ // These should be called on the application's main message loop - i.e.
+ // a message loop which is active for the lifetime of GDI+.
+ // "NotificationHook" should be called before starting the loop,
+ // and "NotificationUnhook" should be called after the loop ends.
+
+ NotificationHookProc NotificationHook;
+ NotificationUnhookProc NotificationUnhook;
+};
+
+// GDI+ initialization. Must be called before GDI+ API's are used.
+//
+// token - may not be NULL - accepts a token to be passed in the corresponding
+// GdiplusShutdown call.
+// input - may not be NULL
+// output - may be NULL only if input->SuppressBackgroundThread is FALSE.
+
+extern "C" Status WINAPI GdiplusStartup(
+ OUT ULONG_PTR *token,
+ const GdiplusStartupInput *input,
+ OUT GdiplusStartupOutput *output);
+
+// GDI+ termination. Must be called before GDI+ is unloaded. GDI+ API's may not
+// be called after this.
+
+extern "C" VOID WINAPI GdiplusShutdown(ULONG_PTR token);
+
+#endif
diff --git a/core/src/fxge/Microsoft SDK/include/sal.h b/core/src/fxge/Microsoft SDK/include/sal.h
new file mode 100644
index 0000000000..136996974a
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/sal.h
@@ -0,0 +1,729 @@
+/***
+*sal.h - markers for documenting the semantics of APIs
+*
+* Copyright (c) Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* sal.h provides a set of annotations to describe how a function uses its
+* parameters - the assumptions it makes about them, and the guarantees it makes
+* upon finishing.
+*
+* [Public]
+*
+****/
+
+/*
+ -------------------------------------------------------------------------------
+ Introduction
+
+ sal.h provides a set of annotations to describe how a function uses its
+ parameters - the assumptions it makes about them, and the guarantees it makes
+ upon finishing.
+
+ Annotations may be placed before either a function parameter's type or its return
+ type, and describe the function's behavior regarding the parameter or return value.
+ There are two classes of annotations: buffer annotations and advanced annotations.
+ Buffer annotations describe how functions use their pointer parameters, and
+ advanced annotations either describe complex/unusual buffer behavior, or provide
+ additional information about a parameter that is not otherwise expressible.
+
+ -------------------------------------------------------------------------------
+ Buffer Annotations
+
+ The most important annotations in sal.h provide a consistent way to annotate
+ buffer parameters or return values for a function. Each of these annotations describes
+ a single buffer (which could be a string, a fixed-length or variable-length array,
+ or just a pointer) that the function interacts with: where it is, how large it is,
+ how much is initialized, and what the function does with it.
+
+ The appropriate macro for a given buffer can be constructed using the table below.
+ Just pick the appropriate values from each category, and combine them together
+ with a leading underscore. Some combinations of values do not make sense as buffer
+ annotations. Only meaningful annotations can be added to your code; for a list of
+ these, see the buffer annotation definitions section.
+
+ Only a single buffer annotation should be used for each parameter.
+
+ |------------|------------|---------|--------|----------|----------|---------------|
+ | Level | Usage | Size | Output | NullTerm | Optional | Parameters |
+ |------------|------------|---------|--------|----------|----------|---------------|
+ | <> | <> | <> | <> | _z | <> | <> |
+ | _deref | _in | _ecount | _full | _nz | _opt | (size) |
+ | _deref_opt | _out | _bcount | _part | | | (size,length) |
+ | | _inout | | | | | |
+ | | | | | | | |
+ |------------|------------|---------|--------|----------|----------|---------------|
+
+ Level: Describes the buffer pointer's level of indirection from the parameter or
+ return value 'p'.
+
+ <> : p is the buffer pointer.
+ _deref : *p is the buffer pointer. p must not be NULL.
+ _deref_opt : *p may be the buffer pointer. p may be NULL, in which case the rest of
+ the annotation is ignored.
+
+ Usage: Describes how the function uses the buffer.
+
+ <> : The buffer is not accessed. If used on the return value or with _deref, the
+ function will provide the buffer, and it will be uninitialized at exit.
+ Otherwise, the caller must provide the buffer. This should only be used
+ for alloc and free functions.
+ _in : The function will only read from the buffer. The caller must provide the
+ buffer and initialize it. Cannot be used with _deref.
+ _out : The function will only write to the buffer. If used on the return value or
+ with _deref, the function will provide the buffer and initialize it.
+ Otherwise, the caller must provide the buffer, and the function will
+ initialize it.
+ _inout : The function may freely read from and write to the buffer. The caller must
+ provide the buffer and initialize it. If used with _deref, the buffer may
+ be reallocated by the function.
+
+ Size: Describes the total size of the buffer. This may be less than the space actually
+ allocated for the buffer, in which case it describes the accessible amount.
+
+ <> : No buffer size is given. If the type specifies the buffer size (such as
+ with LPSTR and LPWSTR), that amount is used. Otherwise, the buffer is one
+ element long. Must be used with _in, _out, or _inout.
+ _ecount : The buffer size is an explicit element count.
+ _bcount : The buffer size is an explicit byte count.
+
+ Output: Describes how much of the buffer will be initialized by the function. For
+ _inout buffers, this also describes how much is initialized at entry. Omit this
+ category for _in buffers; they must be fully initialized by the caller.
+
+ <> : The type specifies how much is initialized. For instance, a function initializing
+ an LPWSTR must NULL-terminate the string.
+ _full : The function initializes the entire buffer.
+ _part : The function initializes part of the buffer, and explicitly indicates how much.
+
+ NullTerm: States if the present of a '\0' marks the end of valid elements in the buffer.
+ _z : A '\0' indicated the end of the buffer
+ _nz : The buffer may not be null terminated and a '\0' does not indicate the end of the
+ buffer.
+ Optional: Describes if the buffer itself is optional.
+
+ <> : The pointer to the buffer must not be NULL.
+ _opt : The pointer to the buffer might be NULL. It will be checked before being dereferenced.
+
+ Parameters: Gives explicit counts for the size and length of the buffer.
+
+ <> : There is no explicit count. Use when neither _ecount nor _bcount is used.
+ (size) : Only the buffer's total size is given. Use with _ecount or _bcount but not _part.
+ (size,length) : The buffer's total size and initialized length are given. Use with _ecount_part
+ and _bcount_part.
+
+ -------------------------------------------------------------------------------
+ Buffer Annotation Examples
+
+ LWSTDAPI_(BOOL) StrToIntExA(
+ LPCSTR pszString, -- No annotation required, const implies __in.
+ DWORD dwFlags,
+ __out int *piRet -- A pointer whose dereference will be filled in.
+ );
+
+ void MyPaintingFunction(
+ __in HWND hwndControl, -- An initialized read-only parameter.
+ __in_opt HDC hdcOptional, -- An initialized read-only parameter that might be NULL.
+ __inout IPropertyStore *ppsStore -- An initialized parameter that may be freely used
+ -- and modified.
+ );
+
+ LWSTDAPI_(BOOL) PathCompactPathExA(
+ __out_ecount(cchMax) LPSTR pszOut, -- A string buffer with cch elements that will
+ -- be NULL terminated on exit.
+ LPCSTR pszSrc, -- No annotation required, const implies __in.
+ UINT cchMax,
+ DWORD dwFlags
+ );
+
+ HRESULT SHLocalAllocBytes(
+ size_t cb,
+ __deref_bcount(cb) T **ppv -- A pointer whose dereference will be set to an
+ -- uninitialized buffer with cb bytes.
+ );
+
+ __inout_bcount_full(cb) : A buffer with cb elements that is fully initialized at
+ entry and exit, and may be written to by this function.
+
+ __out_ecount_part(count, *countOut) : A buffer with count elements that will be
+ partially initialized by this function. The function indicates how much it
+ initialized by setting *countOut.
+
+ -------------------------------------------------------------------------------
+ Advanced Annotations
+
+ Advanced annotations describe behavior that is not expressible with the regular
+ buffer macros. These may be used either to annotate buffer parameters that involve
+ complex or conditional behavior, or to enrich existing annotations with additional
+ information.
+
+ __success(expr) f :
+ <expr> indicates whether function f succeeded or not. If <expr> is true at exit,
+ all the function's guarantees (as given by other annotations) must hold. If <expr>
+ is false at exit, the caller should not expect any of the function's guarantees
+ to hold. If not used, the function must always satisfy its guarantees. Added
+ automatically to functions that indicate success in standard ways, such as by
+ returning an HRESULT.
+
+ __nullterminated p :
+ Pointer p is a buffer that may be read or written up to and including the first
+ NULL character or pointer. May be used on typedefs, which marks valid (properly
+ initialized) instances of that type as being NULL-terminated.
+
+ __nullnullterminated p :
+ Pointer p is a buffer that may be read or written up to and including the first
+ sequence of two NULL characters or pointers. May be used on typedefs, which marks
+ valid instances of that type as being double-NULL terminated.
+
+ __reserved v :
+ Value v must be 0/NULL, reserved for future use.
+
+ __checkReturn v :
+ Return value v must not be ignored by callers of this function.
+
+ __typefix(ctype) v :
+ Value v should be treated as an instance of ctype, rather than its declared type.
+
+ __override f :
+ Specify C#-style 'override' behaviour for overriding virtual methods.
+
+ __callback f :
+ Function f can be used as a function pointer.
+
+ __format_string p :
+ Pointer p is a string that contains % markers in the style of printf.
+
+ __blocksOn(resource) f :
+ Function f blocks on the resource 'resource'.
+
+ __fallthrough :
+ Annotates switch statement labels where fall-through is desired, to distinguish
+ from forgotten break statements.
+
+ -------------------------------------------------------------------------------
+ Advanced Annotation Examples
+
+ __success(return == TRUE) LWSTDAPI_(BOOL)
+ PathCanonicalizeA(__out_ecount(MAX_PATH) LPSTR pszBuf, LPCSTR pszPath) :
+ pszBuf is only guaranteed to be NULL-terminated when TRUE is returned.
+
+ typedef __nullterminated WCHAR* LPWSTR : Initialized LPWSTRs are NULL-terminated strings.
+
+ __out_ecount(cch) __typefix(LPWSTR) void *psz : psz is a buffer parameter which will be
+ a NULL-terminated WCHAR string at exit, and which initially contains cch WCHARs.
+
+ -------------------------------------------------------------------------------
+*/
+
+#pragma once
+
+#define __specstrings
+
+#ifdef __cplusplus
+#ifndef __nothrow
+# define __nothrow __declspec(nothrow)
+#endif
+extern "C" {
+#else
+#ifndef __nothrow
+# define __nothrow
+#endif
+#endif /* #ifdef __cplusplus */
+
+/*
+ -------------------------------------------------------------------------------
+ Helper Macro Definitions
+
+ These express behavior common to many of the high-level annotations.
+ DO NOT USE THESE IN YOUR CODE.
+ -------------------------------------------------------------------------------
+*/
+
+/*
+The helper annotations are only understood by the compiler version used by various
+defect detection tools. When the regular compiler is running, they are defined into
+nothing, and do not affect the compiled code.
+*/
+
+#if !defined(__midl) && defined(_PREFAST_)
+
+ /*
+ In the primitive __declspec("SAL_*") annotations "SAL" stands for Standard
+ Annotation Language. These __declspec("SAL_*") annotations are the
+ primitives the compiler understands and all high-level SpecString MACROs
+ will decompose into these primivates.
+ */
+
+ #define SPECSTRINGIZE( x ) #x
+
+ /*
+ __null p
+ __notnull p
+ __maybenull p
+
+ Annotates a pointer p. States that pointer p is null. Commonly used
+ in the negated form __notnull or the possibly null form __maybenull.
+ */
+
+ #define __null __declspec("SAL_null")
+ #define __notnull __declspec("SAL_notnull")
+ #define __maybenull __declspec("SAL_maybenull")
+
+ /*
+ __readonly l
+ __notreadonly l
+ __mabyereadonly l
+
+ Annotates a location l. States that location l is not modified after
+ this point. If the annotation is placed on the precondition state of
+ a function, the restriction only applies until the postcondition state
+ of the function. __maybereadonly states that the annotated location
+ may be modified, whereas __notreadonly states that a location must be
+ modified.
+ */
+
+ #define __readonly __declspec("SAL_readonly")
+ #define __notreadonly __declspec("SAL_notreadonly")
+ #define __maybereadonly __declspec("SAL_maybereadonly")
+
+ /*
+ __valid v
+ __notvalid v
+ __maybevalid v
+
+ Annotates any value v. States that the value satisfies all properties of
+ valid values of its type. For example, for a string buffer, valid means
+ that the buffer pointer is either NULL or points to a NULL-terminated string.
+ */
+
+ #define __valid __declspec("SAL_valid")
+ #define __notvalid __declspec("SAL_notvalid")
+ #define __maybevalid __declspec("SAL_maybevalid")
+
+ /*
+ __readableTo(extent) p
+
+ Annotates a buffer pointer p. If the buffer can be read, extent describes
+ how much of the buffer is readable. For a reader of the buffer, this is
+ an explicit permission to read up to that amount, rather than a restriction to
+ read only up to it.
+ */
+
+ #define __readableTo(extent) __declspec("SAL_readableTo("SPECSTRINGIZE(extent)")")
+
+ /*
+
+ __elem_readableTo(size)
+
+ Annotates a buffer pointer p as being readable to size elements.
+ */
+
+ #define __elem_readableTo(size) __declspec("SAL_readableTo(elementCount("SPECSTRINGIZE(size)"))")
+
+ /*
+ __byte_readableTo(size)
+
+ Annotates a buffer pointer p as being readable to size bytes.
+ */
+ #define __byte_readableTo(size) __declspec("SAL_readableTo(byteCount("SPECSTRINGIZE(size)"))")
+
+ /*
+ __writableTo(extent) p
+
+ Annotates a buffer pointer p. If the buffer can be modified, extent
+ describes how much of the buffer is writable (usually the allocation
+ size). For a writer of the buffer, this is an explicit permission to
+ write up to that amount, rather than a restriction to write only up to it.
+ */
+ #define __writableTo(size) __declspec("SAL_writableTo("SPECSTRINGIZE(size)")")
+
+ /*
+ __elem_writableTo(size)
+
+ Annotates a buffer pointer p as being writable to size elements.
+ */
+ #define __elem_writableTo(size) __declspec("SAL_writableTo(elementCount("SPECSTRINGIZE(size)"))")
+
+ /*
+ __byte_writableTo(size)
+
+ Annotates a buffer pointer p as being writable to size bytes.
+ */
+ #define __byte_writableTo(size) __declspec("SAL_writableTo(byteCount("SPECSTRINGIZE(size)"))")
+
+ /*
+ __deref p
+
+ Annotates a pointer p. The next annotation applies one dereference down
+ in the type. If readableTo(p, size) then the next annotation applies to
+ all elements *(p+i) for which i satisfies the size. If p is a pointer
+ to a struct, the next annotation applies to all fields of the struct.
+ */
+ #define __deref __declspec("SAL_deref")
+
+ /*
+ __pre __next_annotation
+
+ The next annotation applies in the precondition state
+ */
+ #define __pre __declspec("SAL_pre")
+
+ /*
+ __post __next_annotation
+
+ The next annotation applies in the postcondition state
+ */
+ #define __post __declspec("SAL_post")
+
+ /*
+ __precond(<expr>)
+
+ When <expr> is true, the next annotation applies in the precondition state
+ (currently not enabled)
+ */
+ #define __precond(expr) __pre
+
+ /*
+ __postcond(<expr>)
+
+ When <expr> is true, the next annotation applies in the postcondition state
+ (currently not enabled)
+ */
+ #define __postcond(expr) __post
+
+ /*
+ __exceptthat
+
+ Given a set of annotations Q containing __exceptthat maybeP, the effect of
+ the except clause is to erase any P or notP annotations (explicit or
+ implied) within Q at the same level of dereferencing that the except
+ clause appears, and to replace it with maybeP.
+
+ Example 1: __valid __exceptthat __maybenull on a pointer p means that the
+ pointer may be null, and is otherwise valid, thus overriding
+ the implicit notnull annotation implied by __valid on
+ pointers.
+
+ Example 2: __valid __deref __exceptthat __maybenull on an int **p means
+ that p is not null (implied by valid), but the elements
+ pointed to by p could be null, and are otherwise valid.
+ */
+ #define __exceptthat __declspec("SAL_except")
+ #define __execeptthat __exceptthat
+
+ /*
+ _refparam
+
+ Added to all out parameter macros to indicate that they are all reference
+ parameters.
+ */
+ #define __refparam __deref __notreadonly
+
+ /*
+ __inner_*
+
+ Helper macros that directly correspond to certain high-level annotations.
+
+ */
+
+ /*
+ Macros to classify the entrypoints and indicate their category.
+
+ Pre-defined control point categories include: RPC, LPC, DeviceDriver, UserToKernel, ISAPI, COM.
+
+ */
+ #define __inner_control_entrypoint(category) __declspec("SAL_entrypoint(controlEntry, "SPECSTRINGIZE(category)")")
+
+ /*
+ Pre-defined data entry point categories include: Registry, File, Network.
+ */
+ #define __inner_data_entrypoint(category) __declspec("SAL_entrypoint(dataEntry, "SPECSTRINGIZE(category)")")
+
+ #define __inner_success(expr) __declspec("SAL_success("SPECSTRINGIZE(expr)")")
+ #define __inner_checkReturn __declspec("SAL_checkReturn")
+ #define __inner_typefix(ctype) __declspec("SAL_typefix("SPECSTRINGIZE(ctype)")")
+ #define __inner_override __declspec("__override")
+ #define __inner_callback __declspec("__callback")
+ #define __inner_blocksOn(resource) __declspec("SAL_blocksOn("SPECSTRINGIZE(resource)")")
+ #define __inner_fallthrough_dec __inline __nothrow void __FallThrough() {}
+ #define __inner_fallthrough __FallThrough();
+
+#else
+ #define __null
+ #define __notnull
+ #define __maybenull
+ #define __readonly
+ #define __notreadonly
+ #define __maybereadonly
+ #define __valid
+ #define __notvalid
+ #define __maybevalid
+ #define __readableTo(extent)
+ #define __elem_readableTo(size)
+ #define __byte_readableTo(size)
+ #define __writableTo(size)
+ #define __elem_writableTo(size)
+ #define __byte_writableTo(size)
+ #define __deref
+ #define __pre
+ #define __post
+ #define __precond(expr)
+ #define __postcond(expr)
+ #define __exceptthat
+ #define __execeptthat
+ #define __inner_success(expr)
+ #define __inner_checkReturn
+ #define __inner_typefix(ctype)
+ #define __inner_override
+ #define __inner_callback
+ #define __inner_blocksOn(resource)
+ #define __inner_fallthrough_dec
+ #define __inner_fallthrough
+ #define __refparam
+ #define __inner_control_entrypoint(category)
+ #define __inner_data_entrypoint(category)
+#endif /* #if !defined(__midl) && defined(_PREFAST_) */
+
+/*
+-------------------------------------------------------------------------------
+Buffer Annotation Definitions
+
+Any of these may be used to directly annotate functions, but only one should
+be used for each parameter. To determine which annotation to use for a given
+buffer, use the table in the buffer annotations section.
+-------------------------------------------------------------------------------
+*/
+
+#define __ecount(size) __notnull __elem_writableTo(size)
+#define __bcount(size) __notnull __byte_writableTo(size)
+#define __in __pre __valid __pre __deref __readonly
+#define __in_ecount(size) __in __pre __elem_readableTo(size)
+#define __in_bcount(size) __in __pre __byte_readableTo(size)
+#define __in_z __in __pre __nullterminated
+#define __in_ecount_z(size) __in_ecount(size) __pre __nullterminated
+#define __in_bcount_z(size) __in_bcount(size) __pre __nullterminated
+#define __in_nz __in
+#define __in_ecount_nz(size) __in_ecount(size)
+#define __in_bcount_nz(size) __in_bcount(size)
+#define __out __ecount(1) __post __valid __refparam
+#define __out_ecount(size) __ecount(size) __post __valid __refparam
+#define __out_bcount(size) __bcount(size) __post __valid __refparam
+#define __out_ecount_part(size,length) __out_ecount(size) __post __elem_readableTo(length)
+#define __out_bcount_part(size,length) __out_bcount(size) __post __byte_readableTo(length)
+#define __out_ecount_full(size) __out_ecount_part(size,size)
+#define __out_bcount_full(size) __out_bcount_part(size,size)
+#define __out_z __post __valid __refparam __post __nullterminated
+#define __out_z_opt __post __valid __refparam __post __nullterminated __exceptthat __maybenull
+#define __out_ecount_z(size) __ecount(size) __post __valid __refparam __post __nullterminated
+#define __out_bcount_z(size) __bcount(size) __post __valid __refparam __post __nullterminated
+#define __out_ecount_part_z(size,length) __out_ecount_part(size,length) __post __nullterminated
+#define __out_bcount_part_z(size,length) __out_bcount_part(size,length) __post __nullterminated
+#define __out_ecount_full_z(size) __out_ecount_full(size) __post __nullterminated
+#define __out_bcount_full_z(size) __out_bcount_full(size) __post __nullterminated
+#define __out_nz __post __valid __refparam __post
+#define __out_nz_opt __post __valid __refparam __post __exceptthat __maybenull
+#define __out_ecount_nz(size) __ecount(size) __post __valid __refparam
+#define __out_bcount_nz(size) __bcount(size) __post __valid __refparam
+#define __inout __pre __valid __post __valid __refparam
+#define __inout_ecount(size) __out_ecount(size) __pre __valid
+#define __inout_bcount(size) __out_bcount(size) __pre __valid
+#define __inout_ecount_part(size,length) __out_ecount_part(size,length) __pre __valid __pre __elem_readableTo(length)
+#define __inout_bcount_part(size,length) __out_bcount_part(size,length) __pre __valid __pre __byte_readableTo(length)
+#define __inout_ecount_full(size) __inout_ecount_part(size,size)
+#define __inout_bcount_full(size) __inout_bcount_part(size,size)
+#define __inout_z __inout __pre __nullterminated __post __nullterminated
+#define __inout_ecount_z(size) __inout_ecount(size) __pre __nullterminated __post __nullterminated
+#define __inout_bcount_z(size) __inout_bcount(size) __pre __nullterminated __post __nullterminated
+#define __inout_nz __inout
+#define __inout_ecount_nz(size) __inout_ecount(size)
+#define __inout_bcount_nz(size) __inout_bcount(size)
+#define __ecount_opt(size) __ecount(size) __exceptthat __maybenull
+#define __bcount_opt(size) __bcount(size) __exceptthat __maybenull
+#define __in_opt __in __exceptthat __maybenull
+#define __in_ecount_opt(size) __in_ecount(size) __exceptthat __maybenull
+#define __in_bcount_opt(size) __in_bcount(size) __exceptthat __maybenull
+#define __in_z_opt __in_opt __pre __nullterminated
+#define __in_ecount_z_opt(size) __in_ecount_opt(size) __pre __nullterminated
+#define __in_bcount_z_opt(size) __in_bcount_opt(size) __pre __nullterminated
+#define __in_nz_opt __in_opt
+#define __in_ecount_nz_opt(size) __in_ecount_opt(size)
+#define __in_bcount_nz_opt(size) __in_bcount_opt(size)
+#define __out_opt __out __exceptthat __maybenull
+#define __out_ecount_opt(size) __out_ecount(size) __exceptthat __maybenull
+#define __out_bcount_opt(size) __out_bcount(size) __exceptthat __maybenull
+#define __out_ecount_part_opt(size,length) __out_ecount_part(size,length) __exceptthat __maybenull
+#define __out_bcount_part_opt(size,length) __out_bcount_part(size,length) __exceptthat __maybenull
+#define __out_ecount_full_opt(size) __out_ecount_full(size) __exceptthat __maybenull
+#define __out_bcount_full_opt(size) __out_bcount_full(size) __exceptthat __maybenull
+#define __out_ecount_z_opt(size) __out_ecount_opt(size) __post __nullterminated
+#define __out_bcount_z_opt(size) __out_bcount_opt(size) __post __nullterminated
+#define __out_ecount_part_z_opt(size,length) __out_ecount_part_opt(size,length) __post __nullterminated
+#define __out_bcount_part_z_opt(size,length) __out_bcount_part_opt(size,length) __post __nullterminated
+#define __out_ecount_full_z_opt(size) __out_ecount_full_opt(size) __post __nullterminated
+#define __out_bcount_full_z_opt(size) __out_bcount_full_opt(size) __post __nullterminated
+#define __out_ecount_nz_opt(size) __out_ecount_opt(size) __post __nullterminated
+#define __out_bcount_nz_opt(size) __out_bcount_opt(size) __post __nullterminated
+#define __inout_opt __inout __exceptthat __maybenull
+#define __inout_ecount_opt(size) __inout_ecount(size) __exceptthat __maybenull
+#define __inout_bcount_opt(size) __inout_bcount(size) __exceptthat __maybenull
+#define __inout_ecount_part_opt(size,length) __inout_ecount_part(size,length) __exceptthat __maybenull
+#define __inout_bcount_part_opt(size,length) __inout_bcount_part(size,length) __exceptthat __maybenull
+#define __inout_ecount_full_opt(size) __inout_ecount_full(size) __exceptthat __maybenull
+#define __inout_bcount_full_opt(size) __inout_bcount_full(size) __exceptthat __maybenull
+#define __inout_z_opt __inout_opt __pre __nullterminated __post __nullterminated
+#define __inout_ecount_z_opt(size) __inout_ecount_opt(size) __pre __nullterminated __post __nullterminated
+#define __inout_ecount_z_opt(size) __inout_ecount_opt(size) __pre __nullterminated __post __nullterminated
+#define __inout_bcount_z_opt(size) __inout_bcount_opt(size)
+#define __inout_nz_opt __inout_opt
+#define __inout_ecount_nz_opt(size) __inout_ecount_opt(size)
+#define __inout_bcount_nz_opt(size) __inout_bcount_opt(size)
+#define __deref_ecount(size) __ecount(1) __post __elem_readableTo(1) __post __deref __notnull __post __deref __elem_writableTo(size)
+#define __deref_bcount(size) __ecount(1) __post __elem_readableTo(1) __post __deref __notnull __post __deref __byte_writableTo(size)
+#define __deref_out __deref_ecount(1) __post __deref __valid __refparam
+#define __deref_out_ecount(size) __deref_ecount(size) __post __deref __valid __refparam
+#define __deref_out_bcount(size) __deref_bcount(size) __post __deref __valid __refparam
+#define __deref_out_ecount_part(size,length) __deref_out_ecount(size) __post __deref __elem_readableTo(length)
+#define __deref_out_bcount_part(size,length) __deref_out_bcount(size) __post __deref __byte_readableTo(length)
+#define __deref_out_ecount_full(size) __deref_out_ecount_part(size,size)
+#define __deref_out_bcount_full(size) __deref_out_bcount_part(size,size)
+#define __deref_out_z __post __deref __valid __refparam __post __deref __nullterminated
+#define __deref_out_ecount_z(size) __deref_out_ecount(size) __post __deref __nullterminated
+#define __deref_out_bcount_z(size) __deref_out_ecount(size) __post __deref __nullterminated
+#define __deref_out_nz __deref_out
+#define __deref_out_ecount_nz(size) __deref_out_ecount(size)
+#define __deref_out_bcount_nz(size) __deref_out_ecount(size)
+#define __deref_inout __notnull __elem_readableTo(1) __pre __deref __valid __post __deref __valid __refparam
+#define __deref_inout_z __deref_inout __pre __deref __nullterminated __post __deref __nullterminated
+#define __deref_inout_ecount(size) __deref_inout __pre __deref __elem_writableTo(size) __post __deref __elem_writableTo(size)
+#define __deref_inout_bcount(size) __deref_inout __pre __deref __byte_writableTo(size) __post __deref __byte_writableTo(size)
+#define __deref_inout_ecount_part(size,length) __deref_inout_ecount(size) __pre __deref __elem_readableTo(length) __post __deref __elem_readableTo(length)
+#define __deref_inout_bcount_part(size,length) __deref_inout_bcount(size) __pre __deref __byte_readableTo(length) __post __deref __byte_readableTo(length)
+#define __deref_inout_ecount_full(size) __deref_inout_ecount_part(size,size)
+#define __deref_inout_bcount_full(size) __deref_inout_bcount_part(size,size)
+#define __deref_inout_z __deref_inout __pre __deref __nullterminated __post __deref __nullterminated
+#define __deref_inout_ecount_z(size) __deref_inout_ecount(size) __pre __deref __nullterminated __post __deref __nullterminated
+#define __deref_inout_bcount_z(size) __deref_inout_ecount(size) __pre __deref __nullterminated __post __deref __nullterminated
+#define __deref_inout_nz __deref_inout
+#define __deref_inout_ecount_nz(size) __deref_inout_ecount(size)
+#define __deref_inout_bcount_nz(size) __deref_inout_ecount(size)
+#define __deref_ecount_opt(size) __deref_ecount(size) __post __deref __exceptthat __maybenull
+#define __deref_bcount_opt(size) __deref_bcount(size) __post __deref __exceptthat __maybenull
+#define __deref_out_opt __deref_out __post __deref __exceptthat __maybenull
+#define __deref_out_ecount_opt(size) __deref_out_ecount(size) __post __deref __exceptthat __maybenull
+#define __deref_out_bcount_opt(size) __deref_out_bcount(size) __post __deref __exceptthat __maybenull
+#define __deref_out_ecount_part_opt(size,length) __deref_out_ecount_part(size,length) __post __deref __exceptthat __maybenull
+#define __deref_out_bcount_part_opt(size,length) __deref_out_bcount_part(size,length) __post __deref __exceptthat __maybenull
+#define __deref_out_ecount_full_opt(size) __deref_out_ecount_full(size) __post __deref __exceptthat __maybenull
+#define __deref_out_bcount_full_opt(size) __deref_out_bcount_full(size) __post __deref __exceptthat __maybenull
+#define __deref_out_z_opt __post __deref __valid __refparam __execeptthat __maybenull __post __deref __nullterminated
+#define __deref_out_ecount_z_opt(size) __deref_out_ecount_opt(size) __post __deref __nullterminated
+#define __deref_out_bcount_z_opt(size) __deref_out_bcount_opt(size) __post __deref __nullterminated
+#define __deref_out_nz_opt __deref_out_opt
+#define __deref_out_ecount_nz_opt(size) __deref_out_ecount_opt(size)
+#define __deref_out_bcount_nz_opt(size) __deref_out_bcount_opt(size)
+#define __deref_inout_opt __deref_inout __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull
+#define __deref_inout_ecount_opt(size) __deref_inout_ecount(size) __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull
+#define __deref_inout_bcount_opt(size) __deref_inout_bcount(size) __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull
+#define __deref_inout_ecount_part_opt(size,length) __deref_inout_ecount_part(size,length) __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull
+#define __deref_inout_bcount_part_opt(size,length) __deref_inout_bcount_part(size,length) __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull
+#define __deref_inout_ecount_full_opt(size) __deref_inout_ecount_full(size) __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull
+#define __deref_inout_bcount_full_opt(size) __deref_inout_bcount_full(size) __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull
+#define __deref_inout_z_opt __deref_inout_opt __pre __deref __nullterminated __post __deref __nullterminated
+#define __deref_inout_ecount_z_opt(size) __deref_inout_ecount_opt(size) __pre __deref __nullterminated __post __deref __nullterminated
+#define __deref_inout_bcount_z_opt(size) __deref_inout_bcount_opt(size) __pre __deref __nullterminated __post __deref __nullterminated
+#define __deref_inout_nz_opt __deref_inout_opt
+#define __deref_inout_ecount_nz_opt(size) __deref_inout_ecount_opt(size)
+#define __deref_inout_bcount_nz_opt(size) __deref_inout_bcount_opt(size)
+#define __deref_opt_ecount(size) __deref_ecount(size) __exceptthat __maybenull
+#define __deref_opt_bcount(size) __deref_bcount(size) __exceptthat __maybenull
+#define __deref_opt_out __deref_out __exceptthat __maybenull
+#define __deref_opt_out_z __deref_opt_out __post __deref __nullterminated
+#define __deref_opt_out_ecount(size) __deref_out_ecount(size) __exceptthat __maybenull
+#define __deref_opt_out_bcount(size) __deref_out_bcount(size) __exceptthat __maybenull
+#define __deref_opt_out_ecount_part(size,length) __deref_out_ecount_part(size,length) __exceptthat __maybenull
+#define __deref_opt_out_bcount_part(size,length) __deref_out_bcount_part(size,length) __exceptthat __maybenull
+#define __deref_opt_out_ecount_full(size) __deref_out_ecount_full(size) __exceptthat __maybenull
+#define __deref_opt_out_bcount_full(size) __deref_out_bcount_full(size) __exceptthat __maybenull
+#define __deref_opt_inout __deref_inout __exceptthat __maybenull
+#define __deref_opt_inout_ecount(size) __deref_inout_ecount(size) __exceptthat __maybenull
+#define __deref_opt_inout_bcount(size) __deref_inout_bcount(size) __exceptthat __maybenull
+#define __deref_opt_inout_ecount_part(size,length) __deref_inout_ecount_part(size,length) __exceptthat __maybenull
+#define __deref_opt_inout_bcount_part(size,length) __deref_inout_bcount_part(size,length) __exceptthat __maybenull
+#define __deref_opt_inout_ecount_full(size) __deref_inout_ecount_full(size) __exceptthat __maybenull
+#define __deref_opt_inout_bcount_full(size) __deref_inout_bcount_full(size) __exceptthat __maybenull
+#define __deref_opt_inout_z __deref_opt_inout __pre __deref __nullterminated __post __deref __nullterminated
+#define __deref_opt_inout_ecount_z(size) __deref_opt_inout_ecount(size) __pre __deref __nullterminated __post __deref __nullterminated
+#define __deref_opt_inout_bcount_z(size) __deref_opt_inout_bcount(size) __pre __deref __nullterminated __post __deref __nullterminated
+#define __deref_opt_inout_nz __deref_opt_inout
+#define __deref_opt_inout_ecount_nz(size) __deref_opt_inout_ecount(size)
+#define __deref_opt_inout_bcount_nz(size) __deref_opt_inout_bcount(size)
+#define __deref_opt_ecount_opt(size) __deref_ecount_opt(size) __exceptthat __maybenull
+#define __deref_opt_bcount_opt(size) __deref_bcount_opt(size) __exceptthat __maybenull
+#define __deref_opt_out_opt __deref_out_opt __exceptthat __maybenull
+#define __deref_opt_out_ecount_opt(size) __deref_out_ecount_opt(size) __exceptthat __maybenull
+#define __deref_opt_out_bcount_opt(size) __deref_out_bcount_opt(size) __exceptthat __maybenull
+#define __deref_opt_out_ecount_part_opt(size,length) __deref_out_ecount_part_opt(size,length) __exceptthat __maybenull
+#define __deref_opt_out_bcount_part_opt(size,length) __deref_out_bcount_part_opt(size,length) __exceptthat __maybenull
+#define __deref_opt_out_ecount_full_opt(size) __deref_out_ecount_full_opt(size) __exceptthat __maybenull
+#define __deref_opt_out_bcount_full_opt(size) __deref_out_bcount_full_opt(size) __exceptthat __maybenull
+#define __deref_opt_out_z_opt __post __deref __valid __refparam __exceptthat __maybenull __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull __post __deref __nullterminated
+#define __deref_opt_out_ecount_z_opt(size) __deref_opt_out_ecount_opt(size) __post __deref __nullterminated
+#define __deref_opt_out_bcount_z_opt(size) __deref_opt_out_bcount_opt(size) __post __deref __nullterminated
+#define __deref_opt_out_nz_opt __deref_opt_out_opt
+#define __deref_opt_out_ecount_nz_opt(size) __deref_opt_out_ecount_opt(size)
+#define __deref_opt_out_bcount_nz_opt(size) __deref_opt_out_bcount_opt(size)
+#define __deref_opt_inout_opt __deref_inout_opt __exceptthat __maybenull
+#define __deref_opt_inout_ecount_opt(size) __deref_inout_ecount_opt(size) __exceptthat __maybenull
+#define __deref_opt_inout_bcount_opt(size) __deref_inout_bcount_opt(size) __exceptthat __maybenull
+#define __deref_opt_inout_ecount_part_opt(size,length) __deref_inout_ecount_part_opt(size,length) __exceptthat __maybenull
+#define __deref_opt_inout_bcount_part_opt(size,length) __deref_inout_bcount_part_opt(size,length) __exceptthat __maybenull
+#define __deref_opt_inout_ecount_full_opt(size) __deref_inout_ecount_full_opt(size) __exceptthat __maybenull
+#define __deref_opt_inout_bcount_full_opt(size) __deref_inout_bcount_full_opt(size) __exceptthat __maybenull
+#define __deref_opt_inout_z_opt __deref_opt_inout_opt __pre __deref __nullterminated __post __deref __nullterminated
+#define __deref_opt_inout_ecount_z_opt(size) __deref_opt_inout_ecount_opt(size) __pre __deref __nullterminated __post __deref __nullterminated
+#define __deref_opt_inout_bcount_z_opt(size) __deref_opt_inout_bcount_opt(size) __pre __deref __nullterminated __post __deref __nullterminated
+#define __deref_opt_inout_nz_opt __deref_opt_inout_opt
+#define __deref_opt_inout_ecount_nz_opt(size) __deref_opt_inout_ecount_opt(size)
+#define __deref_opt_inout_bcount_nz_opt(size) __deref_opt_inout_bcount_opt(size)
+
+/*
+-------------------------------------------------------------------------------
+Advanced Annotation Definitions
+
+Any of these may be used to directly annotate functions, and may be used in
+combination with each other or with regular buffer macros. For an explanation
+of each annotation, see the advanced annotations section.
+-------------------------------------------------------------------------------
+*/
+
+#define __success(expr) __inner_success(expr)
+#define __nullterminated __readableTo(sentinel(0))
+#define __nullnullterminated
+#define __reserved __pre __null
+#define __checkReturn __inner_checkReturn
+#define __typefix(ctype) __inner_typefix(ctype)
+#define __override __inner_override
+#define __callback __inner_callback
+#define __format_string
+#define __blocksOn(resource) __inner_blocksOn(resource)
+#define __control_entrypoint(category) __inner_control_entrypoint(category)
+#define __data_entrypoint(category) __inner_data_entrypoint(category)
+
+#ifndef __fallthrough
+ __inner_fallthrough_dec
+ #define __fallthrough __inner_fallthrough
+#endif
+
+#ifndef __analysis_assume
+#ifdef _PREFAST_
+#define __analysis_assume(expr) __assume(expr)
+#else
+#define __analysis_assume(expr)
+#endif
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+
diff --git a/core/src/fxge/Microsoft SDK/include/specstrings.h b/core/src/fxge/Microsoft SDK/include/specstrings.h
new file mode 100644
index 0000000000..00cdd332ec
--- /dev/null
+++ b/core/src/fxge/Microsoft SDK/include/specstrings.h
@@ -0,0 +1,978 @@
+/***************************************************************\
+* *
+* SpecStrings.h - markers for documenting the semantics of APIs *
+* *
+* Version 1.0 *
+* *
+* Copyright (c) Microsoft Corporation. All rights reserved. *
+* *
+\***************************************************************/
+
+// @@BEGIN_DDKSPLIT
+
+// -------------------------------------------------------------------------------
+// Introduction
+//
+// SpecStrings.h provides a set of annotations to describe how a function uses its
+// parameters - the assumptions it makes about them, and the guarantees it makes
+// upon finishing.
+//
+// Annotations may be placed before either a function parameter's type or its return
+// type, and describe the function's behavior regarding the parameter or return value.
+// There are two classes of annotations: buffer annotations and advanced annotations.
+// Buffer annotations describe how functions use their pointer parameters, and
+// advanced annotations either describe complex/unusual buffer behavior, or provide
+// additional information about a parameter that is not otherwise expressible.
+//
+// -------------------------------------------------------------------------------
+// Buffer Annotations
+//
+// The most important annotations in SpecStrings.h provide a consistent way to annotate
+// buffer parameters or return values for a function. Each of these annotations describes
+// a single buffer (which could be a string, a fixed-length or variable-length array,
+// or just a pointer) that the function interacts with: where it is, how large it is,
+// how much is initialized, and what the function does with it.
+//
+// The appropriate macro for a given buffer can be constructed using the table below.
+// Just pick the appropriate values from each category, and combine them together
+// with a leading underscore. Some combinations of values do not make sense as buffer
+// annotations. Only meaningful annotations can be added to your code; for a list of
+// these, see the buffer annotation definitions section.
+//
+// Only a single buffer annotation should be used for each parameter.
+//
+// |------------|------------|---------|--------|----------|---------------|
+// | Level | Usage | Size | Output | Optional | Parameters |
+// |------------|------------|---------|--------|----------|---------------|
+// | <> | <> | <> | <> | <> | <> |
+// | _deref | _in | _ecount | _full | _opt | (size) |
+// | _deref_opt | _out | _bcount | _part | | (size,length) |
+// | | _inout | | | | |
+// | | | | | | |
+// |------------|------------|---------|--------|----------|---------------|
+//
+// Level: Describes the buffer pointer's level of indirection from the parameter or
+// return value 'p'.
+//
+// <> : p is the buffer pointer.
+// _deref : *p is the buffer pointer. p must not be NULL.
+// _deref_opt : *p may be the buffer pointer. p may be NULL, in which case the rest of
+// the annotation is ignored.
+//
+// Usage: Describes how the function uses the buffer.
+//
+// <> : The buffer is not accessed. If used on the return value or with _deref, the
+// function will provide the buffer, and it will be uninitialized at exit.
+// Otherwise, the caller must provide the buffer. This should only be used
+// for alloc and free functions.
+// _in : The function will only read from the buffer. The caller must provide the
+// buffer and initialize it.
+// _out : The function will only write to the buffer. If used on the return value or
+// with _deref, the function will provide the buffer and initialize it.
+// Otherwise, the caller must provide the buffer, and the function will
+// initialize it.
+// _inout : The function may freely read from and write to the buffer. The caller must
+// provide the buffer and initialize it. If used with _deref, the buffer may
+// be reallocated by the function.
+//
+// Size: Describes the total size of the buffer. This may be less than the space actually
+// allocated for the buffer, in which case it describes the accessible amount.
+//
+// <> : No buffer size is given. If the type specifies the buffer size (such as
+// with LPSTR and LPWSTR), that amount is used. Otherwise, the buffer is one
+// element long. Must be used with _in, _out, or _inout.
+// _ecount : The buffer size is an explicit element count.
+// _bcount : The buffer size is an explicit byte count.
+//
+// Output: Describes how much of the buffer will be initialized by the function. For
+// _inout buffers, this also describes how much is initialized at entry. Omit this
+// category for _in buffers; they must be fully initialized by the caller.
+//
+// <> : The type specifies how much is initialized. For instance, a function initializing
+// an LPWSTR must NULL-terminate the string.
+// _full : The function initializes the entire buffer.
+// _part : The function initializes part of the buffer, and explicitly indicates how much.
+//
+// Optional: Describes if the buffer itself is optional.
+//
+// <> : The pointer to the buffer must not be NULL.
+// _opt : The pointer to the buffer might be NULL. It will be checked before being dereferenced.
+//
+// Parameters: Gives explicit counts for the size and length of the buffer.
+//
+// <> : There is no explicit count. Use when neither _ecount nor _bcount is used.
+// (size) : Only the buffer's total size is given. Use with _ecount or _bcount but not _part.
+// (size,length) : The buffer's total size and initialized length are given. Use with _ecount_part
+// and _bcount_part.
+//
+// -------------------------------------------------------------------------------
+// Buffer Annotation Examples
+//
+// LWSTDAPI_(BOOL) StrToIntExA(
+// LPCSTR pszString, // No annotation required, const implies __in.
+// DWORD dwFlags,
+// __out int *piRet // A pointer whose dereference will be filled in.
+// );
+//
+// void MyPaintingFunction(
+// __in HWND hwndControl, // An initialized read-only parameter.
+// __in_opt HDC hdcOptional, // An initialized read-only parameter that might be NULL.
+// __inout IPropertyStore *ppsStore // An initialized parameter that may be freely used
+// // and modified.
+// );
+//
+// LWSTDAPI_(BOOL) PathCompactPathExA(
+// __out_ecount(cchMax) LPSTR pszOut, // A string buffer with cch elements that will
+// // be NULL terminated on exit.
+// LPCSTR pszSrc, // No annotation required, const implies __in.
+// UINT cchMax,
+// DWORD dwFlags
+// );
+//
+// HRESULT SHLocalAllocBytes(
+// size_t cb,
+// __deref_bcount(cb) T **ppv // A pointer whose dereference will be set to an
+// // uninitialized buffer with cb bytes.
+// );
+//
+// __inout_bcount_full(cb) : A buffer with cb elements that is fully initialized at
+// entry and exit, and may be written to by this function.
+//
+// __out_ecount_part(count, *countOut) : A buffer with count elements that will be
+// partially initialized by this function. The function indicates how much it
+// initialized by setting *countOut.
+//
+// -------------------------------------------------------------------------------
+// Advanced Annotations
+//
+// Advanced annotations describe behavior that is not expressible with the regular
+// buffer macros. These may be used either to annotate buffer parameters that involve
+// complex or conditional behavior, or to enrich existing annotations with additional
+// information.
+//
+// __success(expr) f :
+// <expr> indicates whether function f succeeded or not. If <expr> is true at exit,
+// all the function's guarantees (as given by other annotations) must hold. If <expr>
+// is false at exit, the caller should not expect any of the function's guarantees
+// to hold. If not used, the function must always satisfy its guarantees. Added
+// automatically to functions that indicate success in standard ways, such as by
+// returning an HRESULT.
+//
+// __out_awcount(expr, size) p :
+// Pointer p is a buffer whose size may be given in either bytes or elements. If
+// <expr> is true, this acts like __out_bcount. If <expr> is false, this acts
+// like __out_ecount. This should only be used to annotate old APIs.
+//
+// __in_awcount(expr, size) p :
+// Pointer p is a buffer whose size may be given in either bytes or elements. If
+// <expr> is true, this acts like __in_bcount. If <expr> is false, this acts
+// like __in_ecount. This should only be used to annotate old APIs.
+//
+// __nullterminated p :
+// Pointer p is a buffer that may be read or written up to and including the first
+// NULL character or pointer. May be used on typedefs, which marks valid (properly
+// initialized) instances of that type as being NULL-terminated.
+//
+// __nullnullterminated p :
+// Pointer p is a buffer that may be read or written up to and including the first
+// sequence of two NULL characters or pointers. May be used on typedefs, which marks
+// valid instances of that type as being double-NULL terminated.
+//
+// __reserved v :
+// Value v must be 0/NULL, reserved for future use.
+//
+// __checkReturn v :
+// Return value v must not be ignored by callers of this function.
+//
+// __typefix(ctype) v :
+// Value v should be treated as an instance of ctype, rather than its declared type.
+//
+// __override f :
+// Specify C#-style 'override' behaviour for overriding virtual methods.
+//
+// __callback f :
+// Function f can be used as a function pointer.
+//
+// __format_string p :
+// Pointer p is a string that contains % markers in the style of printf.
+//
+// __blocksOn(resource) f :
+// Function f blocks on the resource 'resource'.
+//
+// __fallthrough :
+// Annotates switch statement labels where fall-through is desired, to distinguish
+// from forgotten break statements.
+//
+// -------------------------------------------------------------------------------
+// Advanced Annotation Examples
+//
+// __success(return == TRUE) LWSTDAPI_(BOOL)
+// PathCanonicalizeA(__out_ecount(MAX_PATH) LPSTR pszBuf, LPCSTR pszPath) :
+// pszBuf is only guaranteed to be NULL-terminated when TRUE is returned.
+//
+// typedef __nullterminated WCHAR* LPWSTR : Initialized LPWSTRs are NULL-terminated strings.
+//
+// __out_ecount(cch) __typefix(LPWSTR) void *psz : psz is a buffer parameter which will be
+// a NULL-terminated WCHAR string at exit, and which initially contains cch WCHARs.
+//
+// -------------------------------------------------------------------------------
+
+// @@END_DDKSPLIT
+
+#if _MSC_VER > 1000
+#pragma once
+#endif // #if _MSC_VER > 1000
+
+#define __specstrings
+
+#ifdef __cplusplus
+#ifndef __nothrow
+# define __nothrow __declspec(nothrow)
+#endif
+extern "C" {
+#else
+#ifndef __nothrow
+# define __nothrow
+#endif
+#endif // #ifdef __cplusplus
+
+// @@BEGIN_DDKSPLIT
+
+// -------------------------------------------------------------------------------
+// Helper Macro Definitions
+//
+// These express behavior common to many of the high-level annotations.
+// DO NOT USE THESE IN YOUR CODE.
+// -------------------------------------------------------------------------------
+
+// The helper annotations are only understood by the compiler version used by various
+// defect detection tools. When the regular compiler is running, they are defined into
+// nothing, and do not affect the compiled code.
+#if (_MSC_VER >= 1000) && !defined(MIDL_PASS) && defined(_PREFAST_)
+
+ // In the primitive __declspec("SAL_*") annotations "SAL" stands for Standard
+ // Annotation Language. These __declspec("SAL_*") annotations are the
+ // primitives the compiler understands and all high-level SpecString MACROs
+ // will decompose into these primivates.
+
+ #define SPECSTRINGIZE( x ) #x
+
+ //
+ // __null p
+ // __notnull p
+ // __maybenull p
+ //
+ // Annotates a pointer p. States that pointer p is null. Commonly used
+ // in the negated form __notnull or the possibly null form __maybenull.
+ //
+ #define __null __declspec("SAL_null")
+ #define __notnull __declspec("SAL_notnull")
+ #define __maybenull __declspec("SAL_maybenull")
+
+ //
+ // __readonly l
+ // __notreadonly l
+ // __mabyereadonly l
+ //
+ // Annotates a location l. States that location l is not modified after
+ // this point. If the annotation is placed on the precondition state of
+ // a function, the restriction only applies until the postcondition state
+ // of the function. __maybereadonly states that the annotated location
+ // may be modified, whereas __notreadonly states that a location must be
+ // modified.
+ //
+ #define __readonly __declspec("SAL_readonly")
+ #define __notreadonly __declspec("SAL_notreadonly")
+ #define __maybereadonly __declspec("SAL_maybereadonly")
+
+ //
+ // __valid v
+ // __notvalid v
+ // __maybevalid v
+ //
+ // Annotates any value v. States that the value satisfies all properties of
+ // valid values of its type. For example, for a string buffer, valid means
+ // that the buffer pointer is either NULL or points to a NULL-terminated string.
+ //
+ #define __valid __declspec("SAL_valid")
+ #define __notvalid __declspec("SAL_notvalid")
+ #define __maybevalid __declspec("SAL_maybevalid")
+
+ //
+ // __readableTo(extent) p
+ //
+ // Annotates a buffer pointer p. If the buffer can be read, extent describes
+ // how much of the buffer is readable. For a reader of the buffer, this is
+ // an explicit permission to read up to that amount, rather than a restriction to
+ // read only up to it.
+ //
+ #define __readableTo(extent) __declspec("SAL_readableTo("SPECSTRINGIZE(extent)")")
+
+ //
+ // __elem_readableTo(size)
+ //
+ // Annotates a buffer pointer p as being readable to size elements.
+ //
+ #define __elem_readableTo(size) __declspec("SAL_readableTo(elementCount("SPECSTRINGIZE(size)"))")
+
+ //
+ // __byte_readableTo(size)
+ //
+ // Annotates a buffer pointer p as being readable to size bytes.
+ //
+ #define __byte_readableTo(size) __declspec("SAL_readableTo(byteCount("SPECSTRINGIZE(size)"))")
+
+ //
+ // __writableTo(extent) p
+ //
+ // Annotates a buffer pointer p. If the buffer can be modified, extent
+ // describes how much of the buffer is writable (usually the allocation
+ // size). For a writer of the buffer, this is an explicit permission to
+ // write up to that amount, rather than a restriction to write only up to it.
+ //
+ #define __writableTo(size) __declspec("SAL_writableTo("SPECSTRINGIZE(size)")")
+
+ //
+ // __elem_writableTo(size)
+ //
+ // Annotates a buffer pointer p as being writable to size elements.
+ //
+ #define __elem_writableTo(size) __declspec("SAL_writableTo(elementCount("SPECSTRINGIZE(size)"))")
+
+ //
+ // __byte_writableTo(size)
+ //
+ // Annotates a buffer pointer p as being writable to size bytes.
+ //
+ #define __byte_writableTo(size) __declspec("SAL_writableTo(byteCount("SPECSTRINGIZE(size)"))")
+
+ //
+ // __deref p
+ //
+ // Annotates a pointer p. The next annotation applies one dereference down
+ // in the type. If readableTo(p, size) then the next annotation applies to
+ // all elements *(p+i) for which i satisfies the size. If p is a pointer
+ // to a struct, the next annotation applies to all fields of the struct.
+ //
+ #define __deref __declspec("SAL_deref")
+
+ //
+ // __pre __next_annotation
+ //
+ // The next annotation applies in the precondition state
+ //
+ #define __pre __declspec("SAL_pre")
+
+ //
+ // __post __next_annotation
+ //
+ // The next annotation applies in the postcondition state
+ //
+ #define __post __declspec("SAL_post")
+
+ //
+ // __precond(<expr>)
+ //
+ // When <expr> is true, the next annotation applies in the precondition state
+ // (currently not enabled)
+ //
+ #define __precond(expr) __pre
+
+ //
+ // __postcond(<expr>)
+ //
+ // When <expr> is true, the next annotation applies in the postcondition state
+ // (currently not enabled)
+ //
+ #define __postcond(expr) __post
+
+ //
+ // __exceptthat
+ //
+ // Given a set of annotations Q containing __exceptthat maybeP, the effect of
+ // the except clause is to erase any P or notP annotations (explicit or
+ // implied) within Q at the same level of dereferencing that the except
+ // clause appears, and to replace it with maybeP.
+ //
+ // Example 1: __valid __exceptthat __maybenull on a pointer p means that the
+ // pointer may be null, and is otherwise valid, thus overriding
+ // the implicit notnull annotation implied by __valid on
+ // pointers.
+ //
+ // Example 2: __valid __deref __exceptthat __maybenull on an int **p means
+ // that p is not null (implied by valid), but the elements
+ // pointed to by p could be null, and are otherwise valid.
+ //
+ #define __exceptthat __declspec("SAL_except")
+
+ //
+ // _refparam
+ //
+ // Added to all out parameter macros to indicate that they are all reference
+ // parameters.
+ //
+ #define __refparam __deref __notreadonly
+
+ //
+ // __inner_*
+ //
+ // Helper macros that directly correspond to certain high-level annotations.
+ //
+ //
+
+ // Macros to classify the entrypoints and indicate their category.
+ //
+ //
+ // Pre-defined control point categories include: RPC, LPC, DeviceDriver, UserToKernel, ISAPI, COM.
+ //
+ #define __inner_control_entrypoint(category) __declspec("SAL_entrypoint(controlEntry, "SPECSTRINGIZE(category)")")
+
+ //
+ // Pre-defined data entry point categories include: Registry, File, Network.
+ //
+ #define __inner_data_entrypoint(category) __declspec("SAL_entrypoint(dataEntry, "SPECSTRINGIZE(category)")")
+
+ #define __inner_success(expr) __declspec("SAL_success("SPECSTRINGIZE(expr)")")
+ #define __inner_checkReturn __declspec("SAL_checkReturn")
+ #define __inner_typefix(ctype) __declspec("SAL_typefix("SPECSTRINGIZE(ctype)")")
+ #define __inner_override __declspec("__override")
+ #define __inner_callback __declspec("__callback")
+ #define __inner_blocksOn(resource) __declspec("SAL_blocksOn("SPECSTRINGIZE(resource)")")
+ #define __inner_fallthrough_dec __inline __nothrow void __FallThrough() {}
+ #define __inner_fallthrough __FallThrough();
+
+#else
+
+// @@END_DDKSPLIT
+
+#ifndef __null
+ #define __null
+#endif
+#ifndef __notnull
+ #define __notnull
+#endif
+#ifndef __maybenull
+ #define __maybenull
+#endif
+#ifndef __readonly
+ #define __readonly
+#endif
+#ifndef __notreadonly
+ #define __notreadonly
+#endif
+#ifndef __maybereadonly
+ #define __maybereadonly
+#endif
+#ifndef __valid
+ #define __valid
+#endif
+#ifndef __notvalid
+ #define __notvalid
+#endif
+#ifndef __maybevalid
+ #define __maybevalid
+#endif
+#ifndef __readableTo
+ #define __readableTo(extent)
+#endif
+#ifndef __elem_readableTo
+ #define __elem_readableTo(size)
+#endif
+#ifndef __byte_readableTo
+ #define __byte_readableTo(size)
+#endif
+#ifndef __writableTo
+ #define __writableTo(size)
+#endif
+#ifndef __elem_writableTo
+ #define __elem_writableTo(size)
+#endif
+#ifndef __byte_writableTo
+ #define __byte_writableTo(size)
+#endif
+#ifndef __deref
+ #define __deref
+#endif
+#ifndef __pre
+ #define __pre
+#endif
+#ifndef __post
+ #define __post
+#endif
+#ifndef __precond
+ #define __precond(expr)
+#endif
+#ifndef __postcond
+ #define __postcond(expr)
+#endif
+#ifndef __exceptthat
+ #define __exceptthat
+#endif
+#ifndef __inner_success
+ #define __inner_success(expr)
+#endif
+#ifndef __inner_checkReturn
+ #define __inner_checkReturn
+#endif
+#ifndef __inner_typefix
+ #define __inner_typefix(ctype)
+#endif
+#ifndef __inner_override
+ #define __inner_override
+#endif
+#ifndef __inner_callback
+ #define __inner_callback
+#endif
+#ifndef __inner_blocksOn
+ #define __inner_blocksOn(resource)
+#endif
+#ifndef __inner_fallthrough_dec
+ #define __inner_fallthrough_dec
+#endif
+#ifndef __inner_fallthrough
+ #define __inner_fallthrough
+#endif
+#ifndef __refparam
+ #define __refparam
+#endif
+#ifndef __inner_control_entrypoint
+ #define __inner_control_entrypoint(category)
+#endif
+#ifndef __inner_data_entrypoint
+ #define __inner_data_entrypoint(category)
+#endif
+// @@BEGIN_DDKSPLIT
+#endif // #if (_MSC_VER >= 1000) && !defined(MIDL_PASS) && defined(_PREFAST_)
+// -------------------------------------------------------------------------------
+// Buffer Annotation Definitions
+//
+// Any of these may be used to directly annotate functions, but only one should
+// be used for each parameter. To determine which annotation to use for a given
+// buffer, use the table in the buffer annotations section.
+// -------------------------------------------------------------------------------
+// @@END_DDKSPLIT
+
+#ifndef __ecount
+#define __ecount(size) __notnull __elem_writableTo(size)
+#endif
+#ifndef __bcount
+#define __bcount(size) __notnull __byte_writableTo(size)
+#endif
+#ifndef __in
+#define __in __pre __valid __pre __deref __readonly
+#endif
+#ifndef __in_ecount
+#define __in_ecount(size) __in __pre __elem_readableTo(size)
+#endif
+#ifndef __in_bcount
+#define __in_bcount(size) __in __pre __byte_readableTo(size)
+#endif
+#ifndef __out
+#define __out __ecount(1) __post __valid __refparam
+#endif
+#ifndef __out_ecount
+#define __out_ecount(size) __ecount(size) __post __valid __refparam
+#endif
+#ifndef __out_bcount
+#define __out_bcount(size) __bcount(size) __post __valid __refparam
+#endif
+#ifndef __out_ecount_part
+#define __out_ecount_part(size,length) __out_ecount(size) __post __elem_readableTo(length)
+#endif
+#ifndef __out_bcount_part
+#define __out_bcount_part(size,length) __out_bcount(size) __post __byte_readableTo(length)
+#endif
+#ifndef __out_ecount_full
+#define __out_ecount_full(size) __out_ecount_part(size,size)
+#endif
+#ifndef __out_bcount_full
+#define __out_bcount_full(size) __out_bcount_part(size,size)
+#endif
+#ifndef __inout
+#define __inout __pre __valid __post __valid __refparam
+#endif
+#ifndef __inout_ecount
+#define __inout_ecount(size) __out_ecount(size) __pre __valid
+#endif
+#ifndef __inout_bcount
+#define __inout_bcount(size) __out_bcount(size) __pre __valid
+#endif
+#ifndef __inout_ecount_part
+#define __inout_ecount_part(size,length) __out_ecount_part(size,length) __pre __valid __pre __elem_readableTo(length)
+#endif
+#ifndef __inout_bcount_part
+#define __inout_bcount_part(size,length) __out_bcount_part(size,length) __pre __valid __pre __byte_readableTo(length)
+#endif
+#ifndef __inout_ecount_full
+#define __inout_ecount_full(size) __inout_ecount_part(size,size)
+#endif
+#ifndef __inout_bcount_full
+#define __inout_bcount_full(size) __inout_bcount_part(size,size)
+#endif
+
+#ifndef __ecount_opt
+#define __ecount_opt(size) __ecount(size) __exceptthat __maybenull
+#endif
+#ifndef __bcount_opt
+#define __bcount_opt(size) __bcount(size) __exceptthat __maybenull
+#endif
+#ifndef __in_opt
+#define __in_opt __in __exceptthat __maybenull
+#endif
+#ifndef __in_ecount_opt
+#define __in_ecount_opt(size) __in_ecount(size) __exceptthat __maybenull
+#endif
+#ifndef __in_bcount_opt
+#define __in_bcount_opt(size) __in_bcount(size) __exceptthat __maybenull
+#endif
+#ifndef __out_opt
+#define __out_opt __out __exceptthat __maybenull
+#endif
+#ifndef __out_ecount_opt
+#define __out_ecount_opt(size) __out_ecount(size) __exceptthat __maybenull
+#endif
+#ifndef __out_bcount_opt
+#define __out_bcount_opt(size) __out_bcount(size) __exceptthat __maybenull
+#endif
+#ifndef __out_ecount_part_opt
+#define __out_ecount_part_opt(size,length) __out_ecount_part(size,length) __exceptthat __maybenull
+#endif
+#ifndef __out_bcount_part_opt
+#define __out_bcount_part_opt(size,length) __out_bcount_part(size,length) __exceptthat __maybenull
+#endif
+#ifndef __out_ecount_full_opt
+#define __out_ecount_full_opt(size) __out_ecount_full(size) __exceptthat __maybenull
+#endif
+#ifndef __out_bcount_full_opt
+#define __out_bcount_full_opt(size) __out_bcount_full(size) __exceptthat __maybenull
+#endif
+#ifndef __inout_opt
+#define __inout_opt __inout __exceptthat __maybenull
+#endif
+#ifndef __inout_ecount_opt
+#define __inout_ecount_opt(size) __inout_ecount(size) __exceptthat __maybenull
+#endif
+#ifndef __inout_bcount_opt
+#define __inout_bcount_opt(size) __inout_bcount(size) __exceptthat __maybenull
+#endif
+#ifndef __inout_ecount_part_opt
+#define __inout_ecount_part_opt(size,length) __inout_ecount_part(size,length) __exceptthat __maybenull
+#endif
+#ifndef __inout_bcount_part_opt
+#define __inout_bcount_part_opt(size,length) __inout_bcount_part(size,length) __exceptthat __maybenull
+#endif
+#ifndef __inout_ecount_full_opt
+#define __inout_ecount_full_opt(size) __inout_ecount_full(size) __exceptthat __maybenull
+#endif
+#ifndef __inout_bcount_full_opt
+#define __inout_bcount_full_opt(size) __inout_bcount_full(size) __exceptthat __maybenull
+#endif
+
+#ifndef __deref_ecount
+#define __deref_ecount(size) __ecount(1) __post __elem_readableTo(1) __post __deref __notnull __post __deref __elem_writableTo(size)
+#endif
+#ifndef __deref_bcount
+#define __deref_bcount(size) __ecount(1) __post __elem_readableTo(1) __post __deref __notnull __post __deref __byte_writableTo(size)
+#endif
+#ifndef __deref_in
+#define __deref_in __in __pre __deref __deref __readonly
+#endif
+#ifndef __deref_in_ecount
+#define __deref_in_ecount(size) __deref_in __pre __deref __elem_readableTo(size)
+#endif
+#ifndef __deref_in_bcount
+#define __deref_in_bcount(size) __deref_in __pre __deref __byte_readableTo(size)
+#endif
+#ifndef __deref_out
+#define __deref_out __deref_ecount(1) __post __deref __valid __refparam
+#endif
+#ifndef __deref_out_ecount
+#define __deref_out_ecount(size) __deref_ecount(size) __post __deref __valid __refparam
+#endif
+#ifndef __deref_out_bcount
+#define __deref_out_bcount(size) __deref_bcount(size) __post __deref __valid __refparam
+#endif
+#ifndef __deref_out_ecount_part
+#define __deref_out_ecount_part(size,length) __deref_out_ecount(size) __post __deref __elem_readableTo(length)
+#endif
+#ifndef __deref_out_bcount_part
+#define __deref_out_bcount_part(size,length) __deref_out_bcount(size) __post __deref __byte_readableTo(length)
+#endif
+#ifndef __deref_out_ecount_full
+#define __deref_out_ecount_full(size) __deref_out_ecount_part(size,size)
+#endif
+#ifndef __deref_out_bcount_full
+#define __deref_out_bcount_full(size) __deref_out_bcount_part(size,size)
+#endif
+#ifndef __deref_inout
+#define __deref_inout __notnull __elem_readableTo(1) __pre __deref __valid __post __deref __valid __refparam
+#endif
+#ifndef __deref_inout_ecount
+#define __deref_inout_ecount(size) __deref_inout __pre __deref __elem_writableTo(size) __post __deref __elem_writableTo(size)
+#endif
+#ifndef __deref_inout_bcount
+#define __deref_inout_bcount(size) __deref_inout __pre __deref __byte_writableTo(size) __post __deref __byte_writableTo(size)
+#endif
+#ifndef __deref_inout_ecount_part
+#define __deref_inout_ecount_part(size,length) __deref_inout_ecount(size) __pre __deref __elem_readableTo(length) __post __deref __elem_readableTo(length)
+#endif
+#ifndef __deref_inout_bcount_part
+#define __deref_inout_bcount_part(size,length) __deref_inout_bcount(size) __pre __deref __byte_readableTo(length) __post __deref __byte_readableTo(length)
+#endif
+#ifndef __deref_inout_ecount_full
+#define __deref_inout_ecount_full(size) __deref_inout_ecount_part(size,size)
+#endif
+#ifndef __deref_inout_bcount_full
+#define __deref_inout_bcount_full(size) __deref_inout_bcount_part(size,size)
+#endif
+
+#ifndef __deref_ecount_opt
+#define __deref_ecount_opt(size) __deref_ecount(size) __post __deref __exceptthat __maybenull
+#endif
+#ifndef __deref_bcount_opt
+#define __deref_bcount_opt(size) __deref_bcount(size) __post __deref __exceptthat __maybenull
+#endif
+#ifndef __deref_in_opt
+#define __deref_in_opt __deref_in __pre __deref __exceptthat __maybenull
+#endif
+#ifndef __deref_in_ecount_opt
+#define __deref_in_ecount_opt(size) __deref_in_ecount(size) __pre __deref __exceptthat __maybenull
+#endif
+#ifndef __deref_in_bcount_opt
+#define __deref_in_bcount_opt(size) __deref_in_bcount(size) __pre __deref __exceptthat __maybenull
+#endif
+#ifndef __deref_out_opt
+#define __deref_out_opt __deref_out __post __deref __exceptthat __maybenull
+#endif
+#ifndef __deref_out_ecount_opt
+#define __deref_out_ecount_opt(size) __deref_out_ecount(size) __post __deref __exceptthat __maybenull
+#endif
+#ifndef __deref_out_bcount_opt
+#define __deref_out_bcount_opt(size) __deref_out_bcount(size) __post __deref __exceptthat __maybenull
+#endif
+#ifndef __deref_out_ecount_part_opt
+#define __deref_out_ecount_part_opt(size,length) __deref_out_ecount_part(size,length) __post __deref __exceptthat __maybenull
+#endif
+#ifndef __deref_out_bcount_part_opt
+#define __deref_out_bcount_part_opt(size,length) __deref_out_bcount_part(size,length) __post __deref __exceptthat __maybenull
+#endif
+#ifndef __deref_out_ecount_full_opt
+#define __deref_out_ecount_full_opt(size) __deref_out_ecount_full(size) __post __deref __exceptthat __maybenull
+#endif
+#ifndef __deref_out_bcount_full_opt
+#define __deref_out_bcount_full_opt(size) __deref_out_bcount_full(size) __post __deref __exceptthat __maybenull
+#endif
+#ifndef __deref_inout_opt
+#define __deref_inout_opt __deref_inout __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull
+#endif
+#ifndef __deref_inout_ecount_opt
+#define __deref_inout_ecount_opt(size) __deref_inout_ecount(size) __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull
+#endif
+#ifndef __deref_inout_bcount_opt
+#define __deref_inout_bcount_opt(size) __deref_inout_bcount(size) __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull
+#endif
+#ifndef __deref_inout_ecount_part_opt
+#define __deref_inout_ecount_part_opt(size,length) __deref_inout_ecount_part(size,length) __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull
+#endif
+#ifndef __deref_inout_bcount_part_opt
+#define __deref_inout_bcount_part_opt(size,length) __deref_inout_bcount_part(size,length) __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull
+#endif
+#ifndef __deref_inout_ecount_full_opt
+#define __deref_inout_ecount_full_opt(size) __deref_inout_ecount_full(size) __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull
+#endif
+#ifndef __deref_inout_bcount_full_opt
+#define __deref_inout_bcount_full_opt(size) __deref_inout_bcount_full(size) __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull
+#endif
+
+#ifndef __deref_opt_ecount
+#define __deref_opt_ecount(size) __deref_ecount(size) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_bcount
+#define __deref_opt_bcount(size) __deref_bcount(size) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_in
+#define __deref_opt_in __deref_in __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_in_ecount
+#define __deref_opt_in_ecount(size) __deref_in_ecount(size) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_in_bcount
+#define __deref_opt_in_bcount(size) __deref_in_bcount(size) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_out
+#define __deref_opt_out __deref_out __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_out_ecount
+#define __deref_opt_out_ecount(size) __deref_out_ecount(size) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_out_bcount
+#define __deref_opt_out_bcount(size) __deref_out_bcount(size) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_out_ecount_part
+#define __deref_opt_out_ecount_part(size,length) __deref_out_ecount_part(size,length) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_out_bcount_part
+#define __deref_opt_out_bcount_part(size,length) __deref_out_bcount_part(size,length) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_out_ecount_full
+#define __deref_opt_out_ecount_full(size) __deref_out_ecount_full(size) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_out_bcount_full
+#define __deref_opt_out_bcount_full(size) __deref_out_bcount_full(size) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_inout
+#define __deref_opt_inout __deref_inout __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_inout_ecount
+#define __deref_opt_inout_ecount(size) __deref_inout_ecount(size) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_inout_bcount
+#define __deref_opt_inout_bcount(size) __deref_inout_bcount(size) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_inout_ecount_part
+#define __deref_opt_inout_ecount_part(size,length) __deref_inout_ecount_part(size,length) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_inout_bcount_part
+#define __deref_opt_inout_bcount_part(size,length) __deref_inout_bcount_part(size,length) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_inout_ecount_full
+#define __deref_opt_inout_ecount_full(size) __deref_inout_ecount_full(size) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_inout_bcount_full
+#define __deref_opt_inout_bcount_full(size) __deref_inout_bcount_full(size) __exceptthat __maybenull
+#endif
+
+#ifndef __deref_opt_ecount_opt
+#define __deref_opt_ecount_opt(size) __deref_ecount_opt(size) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_bcount_opt
+#define __deref_opt_bcount_opt(size) __deref_bcount_opt(size) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_in_opt
+#define __deref_opt_in_opt __deref_in_opt __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_in_ecount_opt
+#define __deref_opt_in_ecount_opt(size) __deref_in_ecount_opt(size) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_in_bcount_opt
+#define __deref_opt_in_bcount_opt(size) __deref_in_bcount_opt(size) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_out_opt
+#define __deref_opt_out_opt __deref_out_opt __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_out_ecount_opt
+#define __deref_opt_out_ecount_opt(size) __deref_out_ecount_opt(size) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_out_bcount_opt
+#define __deref_opt_out_bcount_opt(size) __deref_out_bcount_opt(size) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_out_ecount_part_opt
+#define __deref_opt_out_ecount_part_opt(size,length) __deref_out_ecount_part_opt(size,length) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_out_bcount_part_opt
+#define __deref_opt_out_bcount_part_opt(size,length) __deref_out_bcount_part_opt(size,length) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_out_ecount_full_opt
+#define __deref_opt_out_ecount_full_opt(size) __deref_out_ecount_full_opt(size) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_out_bcount_full_opt
+#define __deref_opt_out_bcount_full_opt(size) __deref_out_bcount_full_opt(size) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_inout_opt
+#define __deref_opt_inout_opt __deref_inout_opt __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_inout_ecount_opt
+#define __deref_opt_inout_ecount_opt(size) __deref_inout_ecount_opt(size) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_inout_bcount_opt
+#define __deref_opt_inout_bcount_opt(size) __deref_inout_bcount_opt(size) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_inout_ecount_part_opt
+#define __deref_opt_inout_ecount_part_opt(size,length) __deref_inout_ecount_part_opt(size,length) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_inout_bcount_part_opt
+#define __deref_opt_inout_bcount_part_opt(size,length) __deref_inout_bcount_part_opt(size,length) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_inout_ecount_full_opt
+#define __deref_opt_inout_ecount_full_opt(size) __deref_inout_ecount_full_opt(size) __exceptthat __maybenull
+#endif
+#ifndef __deref_opt_inout_bcount_full_opt
+#define __deref_opt_inout_bcount_full_opt(size) __deref_inout_bcount_full_opt(size) __exceptthat __maybenull
+#endif
+
+// @@BEGIN_DDKSPLIT
+// -------------------------------------------------------------------------------
+// Advanced Annotation Definitions
+//
+// Any of these may be used to directly annotate functions, and may be used in
+// combination with each other or with regular buffer macros. For an explanation
+// of each annotation, see the advanced annotations section.
+// -------------------------------------------------------------------------------
+// @@END_DDKSPLIT
+
+#ifndef __out_awcount
+#define __out_awcount(expr,size) __pre __notnull \
+ __precond(expr) __byte_writableTo(size) \
+ __precond(!(expr)) __byte_writableTo((size)*2) \
+ __post __valid __refparam
+#endif
+#ifndef __in_awcount
+#define __in_awcount(expr,size) __pre __valid \
+ __pre __deref __readonly \
+ __precond(expr) __byte_readableTo(size) \
+ __precond(!(expr)) __elem_readableTo(size)
+#endif
+#ifndef __success
+#define __success(expr) __inner_success(expr)
+#endif
+#ifndef __nullterminated
+#define __nullterminated __readableTo(sentinel(0))
+#endif
+#ifndef __nullnullterminated
+#define __nullnullterminated
+#endif
+#ifndef __reserved
+#define __reserved __pre __null
+#endif
+#ifndef __checkReturn
+#define __checkReturn __inner_checkReturn
+#endif
+#ifndef __typefix
+#define __typefix(ctype) __inner_typefix(ctype)
+#endif
+#ifndef __override
+#define __override __inner_override
+#endif
+#ifndef __callback
+#define __callback __inner_callback
+#endif
+#ifndef __format_string
+#define __format_string
+#endif
+#ifndef __blocksOn
+#define __blocksOn(resource) __inner_blocksOn(resource)
+#endif
+#ifndef __control_entrypoint
+#define __control_entrypoint(category) __inner_control_entrypoint(category)
+#endif
+#ifndef __data_entrypoint
+#define __data_entrypoint(category) __inner_data_entrypoint(category)
+#endif
+
+#ifndef __fallthrough
+ __inner_fallthrough_dec
+ #define __fallthrough __inner_fallthrough
+#endif
+
+// -------------------------------------------------------------------------------
+// Deprecated Annotation Definitions
+//
+// These should be removed from existing code.
+// -------------------------------------------------------------------------------
+
+// #define __opt __exceptthat __maybenull
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/core/src/fxge/agg/agg23/agg_array.h b/core/src/fxge/agg/agg23/agg_array.h
new file mode 100644
index 0000000000..f5680d90fe
--- /dev/null
+++ b/core/src/fxge/agg/agg23/agg_array.h
@@ -0,0 +1,510 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+// mcseemagg@yahoo.com
+// http://www.antigrain.com
+//----------------------------------------------------------------------------
+#ifndef AGG_ARRAY_INCLUDED
+#define AGG_ARRAY_INCLUDED
+#include "agg_basics.h"
+namespace agg
+{
+template<class T> class pod_array : public CFX_Object
+{
+public:
+ typedef T value_type;
+ ~pod_array()
+ {
+ FX_Free(m_array);
+ }
+ pod_array() : m_size(0), m_capacity(0), m_array(0) {}
+ pod_array(unsigned cap, unsigned extra_tail = 0);
+ pod_array(const pod_array<T>&);
+ const pod_array<T>& operator = (const pod_array<T>&);
+ void capacity(unsigned cap, unsigned extra_tail = 0);
+ unsigned capacity() const
+ {
+ return m_capacity;
+ }
+ void allocate(unsigned size, unsigned extra_tail = 0);
+ void resize(unsigned new_size);
+ void zero()
+ {
+ FXSYS_memset(m_array, 0, sizeof(T) * m_size);
+ }
+ void add(const T& v)
+ {
+ m_array[m_size++] = v;
+ }
+ void inc_size(unsigned size)
+ {
+ m_size += size;
+ }
+ unsigned size() const
+ {
+ return m_size;
+ }
+ unsigned byte_size() const
+ {
+ return m_size * sizeof(T);
+ }
+ const T& operator [] (unsigned i) const
+ {
+ return m_array[i];
+ }
+ T& operator [] (unsigned i)
+ {
+ return m_array[i];
+ }
+ const T& at(unsigned i) const
+ {
+ return m_array[i];
+ }
+ T& at(unsigned i)
+ {
+ return m_array[i];
+ }
+ T value_at(unsigned i) const
+ {
+ return m_array[i];
+ }
+ const T* data() const
+ {
+ return m_array;
+ }
+ T* data()
+ {
+ return m_array;
+ }
+ void remove_all()
+ {
+ m_size = 0;
+ }
+ void cut_at(unsigned num)
+ {
+ if(num < m_size) {
+ m_size = num;
+ }
+ }
+private:
+ unsigned m_size;
+ unsigned m_capacity;
+ T* m_array;
+};
+template<class T>
+void pod_array<T>::capacity(unsigned cap, unsigned extra_tail)
+{
+ m_size = 0;
+ unsigned full_cap = cap + extra_tail;
+ if(full_cap < cap) {
+ FX_Free(m_array);
+ m_array = 0;
+ m_capacity = 0;
+ } else if(full_cap > m_capacity) {
+ FX_Free(m_array);
+ m_array = 0;
+ m_capacity = 0;
+ m_array = FX_Alloc(T, full_cap);
+ if (m_array) {
+ m_capacity = full_cap;
+ }
+ }
+}
+template<class T>
+void pod_array<T>::allocate(unsigned size, unsigned extra_tail)
+{
+ capacity(size, extra_tail);
+ m_size = size;
+}
+template<class T>
+void pod_array<T>::resize(unsigned new_size)
+{
+ if(new_size > m_size) {
+ if(new_size > m_capacity) {
+ T* data = FX_Alloc(T, new_size);
+ FXSYS_memcpy(data, m_array, m_size * sizeof(T));
+ FX_Free(m_array);
+ m_array = data;
+ }
+ } else {
+ m_size = new_size;
+ }
+}
+template<class T> pod_array<T>::pod_array(unsigned cap, unsigned extra_tail) :
+ m_size(0), m_capacity(cap + extra_tail), m_array(FX_Alloc(T, m_capacity)) {}
+template<class T> pod_array<T>::pod_array(const pod_array<T>& v) :
+ m_size(v.m_size),
+ m_capacity(v.m_capacity),
+ m_array(v.m_capacity ? FX_Alloc(T, v.m_capacity) : 0)
+{
+ FXSYS_memcpy(m_array, v.m_array, sizeof(T) * v.m_size);
+}
+template<class T> const pod_array<T>&
+pod_array<T>::operator = (const pod_array<T>&v)
+{
+ allocate(v.m_size);
+ if(v.m_size) {
+ FXSYS_memcpy(m_array, v.m_array, sizeof(T) * v.m_size);
+ }
+ return *this;
+}
+template<class T, unsigned S = 6> class pod_deque : public CFX_Object
+{
+public:
+ enum block_scale_e {
+ block_shift = S,
+ block_size = 1 << block_shift,
+ block_mask = block_size - 1
+ };
+ typedef T value_type;
+ ~pod_deque();
+ pod_deque();
+ pod_deque(unsigned block_ptr_inc);
+ pod_deque(const pod_deque<T, S>& v);
+ const pod_deque<T, S>& operator = (const pod_deque<T, S>& v);
+ void remove_all()
+ {
+ m_size = 0;
+ }
+ void free_all()
+ {
+ free_tail(0);
+ }
+ void free_tail(unsigned size);
+ void add(const T& val);
+ void modify_last(const T& val);
+ void remove_last();
+ int allocate_continuous_block(unsigned num_elements);
+ void add_array(const T* ptr, unsigned num_elem)
+ {
+ while(num_elem--) {
+ add(*ptr++);
+ }
+ }
+ template<class DataAccessor> void add_data(DataAccessor& data)
+ {
+ while(data.size()) {
+ add(*data);
+ ++data;
+ }
+ }
+ void cut_at(unsigned size)
+ {
+ if(size < m_size) {
+ m_size = size;
+ }
+ }
+ unsigned size() const
+ {
+ return m_size;
+ }
+ const T& operator [] (unsigned i) const
+ {
+ return m_blocks[i >> block_shift][i & block_mask];
+ }
+ T& operator [] (unsigned i)
+ {
+ return m_blocks[i >> block_shift][i & block_mask];
+ }
+ const T& at(unsigned i) const
+ {
+ return m_blocks[i >> block_shift][i & block_mask];
+ }
+ T& at(unsigned i)
+ {
+ return m_blocks[i >> block_shift][i & block_mask];
+ }
+ T value_at(unsigned i) const
+ {
+ return m_blocks[i >> block_shift][i & block_mask];
+ }
+ const T& curr(unsigned idx) const
+ {
+ return (*this)[idx];
+ }
+ T& curr(unsigned idx)
+ {
+ return (*this)[idx];
+ }
+ const T& prev(unsigned idx) const
+ {
+ return (*this)[(idx + m_size - 1) % m_size];
+ }
+ T& prev(unsigned idx)
+ {
+ return (*this)[(idx + m_size - 1) % m_size];
+ }
+ const T& next(unsigned idx) const
+ {
+ return (*this)[(idx + 1) % m_size];
+ }
+ T& next(unsigned idx)
+ {
+ return (*this)[(idx + 1) % m_size];
+ }
+ const T& last() const
+ {
+ return (*this)[m_size - 1];
+ }
+ T& last()
+ {
+ return (*this)[m_size - 1];
+ }
+ unsigned byte_size() const;
+ const T* block(unsigned nb) const
+ {
+ return m_blocks[nb];
+ }
+public:
+ void allocate_block(unsigned nb);
+ T* data_ptr();
+ unsigned m_size;
+ unsigned m_num_blocks;
+ unsigned m_max_blocks;
+ T** m_blocks;
+ unsigned m_block_ptr_inc;
+};
+template<class T, unsigned S> pod_deque<T, S>::~pod_deque()
+{
+ if(m_num_blocks) {
+ T** blk = m_blocks + m_num_blocks - 1;
+ while(m_num_blocks--) {
+ FX_Free(*blk);
+ --blk;
+ }
+ FX_Free(m_blocks);
+ }
+}
+template<class T, unsigned S>
+void pod_deque<T, S>::free_tail(unsigned size)
+{
+ if(size < m_size) {
+ unsigned nb = (size + block_mask) >> block_shift;
+ while(m_num_blocks > nb) {
+ FX_Free(m_blocks[--m_num_blocks]);
+ }
+ m_size = size;
+ }
+}
+template<class T, unsigned S> pod_deque<T, S>::pod_deque() :
+ m_size(0),
+ m_num_blocks(0),
+ m_max_blocks(0),
+ m_blocks(0),
+ m_block_ptr_inc(block_size)
+{
+}
+template<class T, unsigned S>
+pod_deque<T, S>::pod_deque(unsigned block_ptr_inc) :
+ m_size(0),
+ m_num_blocks(0),
+ m_max_blocks(0),
+ m_blocks(0),
+ m_block_ptr_inc(block_ptr_inc)
+{
+}
+template<class T, unsigned S>
+pod_deque<T, S>::pod_deque(const pod_deque<T, S>& v) :
+ m_size(v.m_size),
+ m_num_blocks(v.m_num_blocks),
+ m_max_blocks(v.m_max_blocks),
+ m_blocks(v.m_max_blocks ? FX_Alloc(T*, v.m_max_blocks) : 0),
+ m_block_ptr_inc(v.m_block_ptr_inc)
+{
+ unsigned i;
+ for(i = 0; i < v.m_num_blocks; ++i) {
+ m_blocks[i] = FX_Alloc(T, block_size);
+ FXSYS_memcpy(m_blocks[i], v.m_blocks[i], block_size * sizeof(T));
+ }
+}
+template<class T, unsigned S>
+const pod_deque<T, S>& pod_deque<T, S>::operator = (const pod_deque<T, S>& v)
+{
+ unsigned i;
+ for(i = m_num_blocks; i < v.m_num_blocks; ++i) {
+ allocate_block(i);
+ }
+ for(i = 0; i < v.m_num_blocks; ++i) {
+ FXSYS_memcpy(m_blocks[i], v.m_blocks[i], block_size * sizeof(T));
+ }
+ m_size = v.m_size;
+ return *this;
+}
+template<class T, unsigned S>
+void pod_deque<T, S>::allocate_block(unsigned nb)
+{
+ if(nb >= m_max_blocks) {
+ T** new_blocks = FX_Alloc(T*, m_max_blocks + m_block_ptr_inc);
+ if(m_blocks) {
+ FXSYS_memcpy(new_blocks,
+ m_blocks,
+ m_num_blocks * sizeof(T*));
+ FX_Free(m_blocks);
+ }
+ m_blocks = new_blocks;
+ m_max_blocks += m_block_ptr_inc;
+ }
+ m_blocks[nb] = FX_Alloc(T, block_size);
+ m_num_blocks++;
+}
+template<class T, unsigned S>
+inline T* pod_deque<T, S>::data_ptr()
+{
+ unsigned nb = m_size >> block_shift;
+ if(nb >= m_num_blocks) {
+ allocate_block(nb);
+ }
+ return m_blocks[nb] + (m_size & block_mask);
+}
+template<class T, unsigned S>
+inline void pod_deque<T, S>::add(const T& val)
+{
+ *data_ptr() = val;
+ ++m_size;
+}
+template<class T, unsigned S>
+inline void pod_deque<T, S>::remove_last()
+{
+ if(m_size) {
+ --m_size;
+ }
+}
+template<class T, unsigned S>
+void pod_deque<T, S>::modify_last(const T& val)
+{
+ remove_last();
+ add(val);
+}
+template<class T, unsigned S>
+int pod_deque<T, S>::allocate_continuous_block(unsigned num_elements)
+{
+ if(num_elements < block_size) {
+ data_ptr();
+ unsigned rest = block_size - (m_size & block_mask);
+ unsigned index;
+ if(num_elements <= rest) {
+ index = m_size;
+ m_size += num_elements;
+ return index;
+ }
+ m_size += rest;
+ data_ptr();
+ index = m_size;
+ m_size += num_elements;
+ return index;
+ }
+ return -1;
+}
+template<class T, unsigned S>
+unsigned pod_deque<T, S>::byte_size() const
+{
+ return m_size * sizeof(T);
+}
+class pod_allocator : public CFX_Object
+{
+public:
+ void remove_all()
+ {
+ if(m_num_blocks) {
+ int8u** blk = m_blocks + m_num_blocks - 1;
+ while(m_num_blocks--) {
+ FX_Free(*blk);
+ --blk;
+ }
+ FX_Free(m_blocks);
+ }
+ m_num_blocks = 0;
+ m_max_blocks = 0;
+ m_blocks = 0;
+ m_buf_ptr = 0;
+ m_rest = 0;
+ }
+ ~pod_allocator()
+ {
+ remove_all();
+ }
+ pod_allocator(unsigned block_size, unsigned block_ptr_inc = 256 - 8) :
+ m_block_size(block_size),
+ m_block_ptr_inc(block_ptr_inc),
+ m_num_blocks(0),
+ m_max_blocks(0),
+ m_blocks(0),
+ m_buf_ptr(0),
+ m_rest(0)
+ {
+ }
+ int8u* allocate(unsigned size, unsigned alignment = 1)
+ {
+ if(size == 0) {
+ return 0;
+ }
+ if(size <= m_rest) {
+ int8u* ptr = m_buf_ptr;
+ if(alignment > 1) {
+ unsigned align = (alignment - unsigned((size_t)ptr) % alignment) % alignment;
+ size += align;
+ ptr += align;
+ if(size <= m_rest) {
+ m_rest -= size;
+ m_buf_ptr += size;
+ return ptr;
+ }
+ allocate_block(size);
+ return allocate(size - align, alignment);
+ }
+ m_rest -= size;
+ m_buf_ptr += size;
+ return ptr;
+ }
+ allocate_block(size + alignment - 1);
+ return allocate(size, alignment);
+ }
+private:
+ void allocate_block(unsigned size)
+ {
+ if(size < m_block_size) {
+ size = m_block_size;
+ }
+ if(m_num_blocks >= m_max_blocks) {
+ int8u** new_blocks = FX_Alloc(int8u*, m_max_blocks + m_block_ptr_inc);
+ if(m_blocks) {
+ FXSYS_memcpy(new_blocks,
+ m_blocks,
+ m_num_blocks * sizeof(int8u*));
+ FX_Free(m_blocks);
+ }
+ m_blocks = new_blocks;
+ m_max_blocks += m_block_ptr_inc;
+ }
+ m_blocks[m_num_blocks] = m_buf_ptr = FX_Alloc(int8u, size);
+ m_num_blocks++;
+ m_rest = size;
+ }
+ unsigned m_block_size;
+ unsigned m_block_ptr_inc;
+ unsigned m_num_blocks;
+ unsigned m_max_blocks;
+ int8u** m_blocks;
+ int8u* m_buf_ptr;
+ unsigned m_rest;
+};
+enum quick_sort_threshold_e {
+ quick_sort_threshold = 9
+};
+template<class T> inline void swap_elements(T& a, T& b)
+{
+ T temp = a;
+ a = b;
+ b = temp;
+}
+}
+#endif
diff --git a/core/src/fxge/agg/agg23/agg_basics.h b/core/src/fxge/agg/agg23/agg_basics.h
new file mode 100644
index 0000000000..a78fed8c23
--- /dev/null
+++ b/core/src/fxge/agg/agg23/agg_basics.h
@@ -0,0 +1,282 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+// mcseemagg@yahoo.com
+// http://www.antigrain.com
+//----------------------------------------------------------------------------
+#ifndef AGG_BASICS_INCLUDED
+#define AGG_BASICS_INCLUDED
+#ifndef AGG_INT8
+#define AGG_INT8 signed char
+#endif
+#ifndef AGG_INT8U
+#define AGG_INT8U unsigned char
+#endif
+#ifndef AGG_INT16
+#define AGG_INT16 short
+#endif
+#ifndef AGG_INT16U
+#define AGG_INT16U unsigned short
+#endif
+#ifndef AGG_INT32
+#define AGG_INT32 int
+#endif
+#ifndef AGG_INT32U
+#define AGG_INT32U unsigned
+#endif
+#ifndef AGG_INT64
+#define AGG_INT64 signed long long
+#endif
+#ifndef AGG_INT64U
+#define AGG_INT64U unsigned long long
+#endif
+#define AGG_INLINE inline
+namespace agg
+{
+typedef AGG_INT8 int8;
+typedef AGG_INT8U int8u;
+typedef AGG_INT16 int16;
+typedef AGG_INT16U int16u;
+typedef AGG_INT32 int32;
+typedef AGG_INT32U int32u;
+typedef AGG_INT64 int64;
+typedef AGG_INT64U int64u;
+typedef unsigned char cover_type;
+enum cover_scale_e {
+ cover_shift = 8,
+ cover_size = 1 << cover_shift,
+ cover_mask = cover_size - 1,
+ cover_none = 0,
+ cover_full = cover_mask
+};
+template<class T> struct rect_base : public CFX_Object {
+ typedef rect_base<T> self_type;
+ T x1;
+ T y1;
+ T x2;
+ T y2;
+ rect_base() {}
+ rect_base(T x1_, T y1_, T x2_, T y2_) :
+ x1(x1_), y1(y1_), x2(x2_), y2(y2_) {}
+ const self_type& normalize()
+ {
+ T t;
+ if(x1 > x2) {
+ t = x1;
+ x1 = x2;
+ x2 = t;
+ }
+ if(y1 > y2) {
+ t = y1;
+ y1 = y2;
+ y2 = t;
+ }
+ return *this;
+ }
+ bool clip(const self_type& r)
+ {
+ if(x2 > r.x2) {
+ x2 = r.x2;
+ }
+ if(y2 > r.y2) {
+ y2 = r.y2;
+ }
+ if(x1 < r.x1) {
+ x1 = r.x1;
+ }
+ if(y1 < r.y1) {
+ y1 = r.y1;
+ }
+ return x1 <= x2 && y1 <= y2;
+ }
+ bool is_valid() const
+ {
+ return x1 <= x2 && y1 <= y2;
+ }
+};
+template<class Rect>
+inline Rect intersect_rectangles(const Rect& r1, const Rect& r2)
+{
+ Rect r = r1;
+ if(r.x2 > r2.x2) {
+ r.x2 = r2.x2;
+ }
+ if(r.y2 > r2.y2) {
+ r.y2 = r2.y2;
+ }
+ if(r.x1 < r2.x1) {
+ r.x1 = r2.x1;
+ }
+ if(r.y1 < r2.y1) {
+ r.y1 = r2.y1;
+ }
+ return r;
+}
+template<class Rect>
+inline Rect unite_rectangles(const Rect& r1, const Rect& r2)
+{
+ Rect r = r1;
+ if(r.x2 < r2.x2) {
+ r.x2 = r2.x2;
+ }
+ if(r.y2 < r2.y2) {
+ r.y2 = r2.y2;
+ }
+ if(r.x1 > r2.x1) {
+ r.x1 = r2.x1;
+ }
+ if(r.y1 > r2.y1) {
+ r.y1 = r2.y1;
+ }
+ return r;
+}
+typedef rect_base<int> rect;
+typedef rect_base<FX_FLOAT> rect_d;
+enum path_commands_e {
+ path_cmd_stop = 0,
+ path_cmd_move_to = 1,
+ path_cmd_line_to = 2,
+ path_cmd_curve3 = 3,
+ path_cmd_curve4 = 4,
+ path_cmd_curveN = 5,
+ path_cmd_catrom = 6,
+ path_cmd_ubspline = 7,
+ path_cmd_end_poly = 0x0F,
+ path_cmd_mask = 0x0F
+};
+enum path_flags_e {
+ path_flags_none = 0,
+ path_flags_ccw = 0x10,
+ path_flags_cw = 0x20,
+ path_flags_close = 0x40,
+ path_flags_jr = 0x80,
+ path_flags_mask = 0xF0
+};
+inline bool is_vertex(unsigned c)
+{
+ c &= ~path_flags_jr;
+ return c >= path_cmd_move_to && c < path_cmd_end_poly;
+}
+inline bool is_drawing(unsigned c)
+{
+ c &= ~path_flags_jr;
+ return c >= path_cmd_line_to && c < path_cmd_end_poly;
+}
+inline bool is_stop(unsigned c)
+{
+ c &= ~path_flags_jr;
+ return c == path_cmd_stop;
+}
+inline bool is_move_to(unsigned c)
+{
+ c &= ~path_flags_jr;
+ return c == path_cmd_move_to;
+}
+inline bool is_line_to(unsigned c)
+{
+ c &= ~path_flags_jr;
+ return c == path_cmd_line_to;
+}
+inline bool is_curve(unsigned c)
+{
+ c &= ~path_flags_jr;
+ return c == path_cmd_curve3 || c == path_cmd_curve4;
+}
+inline bool is_curve3(unsigned c)
+{
+ c &= ~path_flags_jr;
+ return c == path_cmd_curve3;
+}
+inline bool is_curve4(unsigned c)
+{
+ c &= ~path_flags_jr;
+ return c == path_cmd_curve4;
+}
+inline bool is_end_poly(unsigned c)
+{
+ c &= ~path_flags_jr;
+ return (c & path_cmd_mask) == path_cmd_end_poly;
+}
+inline bool is_close(unsigned c)
+{
+ c &= ~path_flags_jr;
+ return (c & ~(path_flags_cw | path_flags_ccw)) ==
+ (path_cmd_end_poly | path_flags_close);
+}
+inline bool is_next_poly(unsigned c)
+{
+ c &= ~path_flags_jr;
+ return is_stop(c) || is_move_to(c) || is_end_poly(c);
+}
+inline bool is_cw(unsigned c)
+{
+ c &= ~path_flags_jr;
+ return (c & path_flags_cw) != 0;
+}
+inline bool is_ccw(unsigned c)
+{
+ c &= ~path_flags_jr;
+ return (c & path_flags_ccw) != 0;
+}
+inline bool is_oriented(unsigned c)
+{
+ c &= ~path_flags_jr;
+ return (c & (path_flags_cw | path_flags_ccw)) != 0;
+}
+inline bool is_closed(unsigned c)
+{
+ c &= ~path_flags_jr;
+ return (c & path_flags_close) != 0;
+}
+inline unsigned get_close_flag(unsigned c)
+{
+ c &= ~path_flags_jr;
+ return c & path_flags_close;
+}
+inline unsigned clear_orientation(unsigned c)
+{
+ c &= ~path_flags_jr;
+ return c & ~(path_flags_cw | path_flags_ccw);
+}
+inline unsigned get_orientation(unsigned c)
+{
+ c &= ~path_flags_jr;
+ return c & (path_flags_cw | path_flags_ccw);
+}
+inline unsigned set_orientation(unsigned c, unsigned o)
+{
+ c &= ~path_flags_jr;
+ return clear_orientation(c) | o;
+}
+struct point_type : public CFX_Object {
+ FX_FLOAT x, y;
+ unsigned flag;
+ point_type() {}
+ point_type(FX_FLOAT x_, FX_FLOAT y_, unsigned flag_ = 0) : x(x_), y(y_), flag(flag_) {}
+};
+struct point_type_flag : public point_type {
+ unsigned flag;
+ point_type_flag()
+ {
+ flag = 0;
+ }
+ point_type_flag(FX_FLOAT x_, FX_FLOAT y_, unsigned flag_ = 0) : point_type(x_, y_), flag(flag_) {}
+};
+struct vertex_type : public CFX_Object {
+ FX_FLOAT x, y;
+ unsigned cmd;
+ vertex_type() {}
+ vertex_type(FX_FLOAT x_, FX_FLOAT y_, unsigned cmd_) :
+ x(x_), y(y_), cmd(cmd_) {}
+};
+}
+#endif
diff --git a/core/src/fxge/agg/agg23/agg_clip_liang_barsky.h b/core/src/fxge/agg/agg23/agg_clip_liang_barsky.h
new file mode 100644
index 0000000000..cfc4c91f60
--- /dev/null
+++ b/core/src/fxge/agg/agg23/agg_clip_liang_barsky.h
@@ -0,0 +1,125 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+// mcseemagg@yahoo.com
+// http://www.antigrain.com
+//----------------------------------------------------------------------------
+//
+// Liang-Barsky clipping
+//
+//----------------------------------------------------------------------------
+#ifndef AGG_CLIP_LIANG_BARSKY_INCLUDED
+#define AGG_CLIP_LIANG_BARSKY_INCLUDED
+#include "agg_basics.h"
+namespace agg
+{
+template<class T>
+inline unsigned clipping_flags(T x, T y, const rect_base<T>& clip_box)
+{
+ return (x > clip_box.x2) |
+ ((y > clip_box.y2) << 1) |
+ ((x < clip_box.x1) << 2) |
+ ((y < clip_box.y1) << 3);
+}
+template<class T>
+inline unsigned clip_liang_barsky(T x1, T y1, T x2, T y2,
+ const rect_base<T>& clip_box,
+ T* x, T* y)
+{
+ const FX_FLOAT nearzero = 1e-30f;
+ FX_FLOAT deltax = (FX_FLOAT)(x2 - x1);
+ FX_FLOAT deltay = (FX_FLOAT)(y2 - y1);
+ unsigned np = 0;
+ if(deltax == 0) {
+ deltax = (x1 > clip_box.x1) ? -nearzero : nearzero;
+ }
+ FX_FLOAT xin, xout;
+ if(deltax > 0) {
+ xin = (FX_FLOAT)clip_box.x1;
+ xout = (FX_FLOAT)clip_box.x2;
+ } else {
+ xin = (FX_FLOAT)clip_box.x2;
+ xout = (FX_FLOAT)clip_box.x1;
+ }
+ FX_FLOAT tinx = FXSYS_Div(xin - x1, deltax);
+ if(deltay == 0) {
+ deltay = (y1 > clip_box.y1) ? -nearzero : nearzero;
+ }
+ FX_FLOAT yin, yout;
+ if(deltay > 0) {
+ yin = (FX_FLOAT)clip_box.y1;
+ yout = (FX_FLOAT)clip_box.y2;
+ } else {
+ yin = (FX_FLOAT)clip_box.y2;
+ yout = (FX_FLOAT)clip_box.y1;
+ }
+ FX_FLOAT tiny = FXSYS_Div(yin - y1, deltay);
+ FX_FLOAT tin1, tin2;
+ if (tinx < tiny) {
+ tin1 = tinx;
+ tin2 = tiny;
+ } else {
+ tin1 = tiny;
+ tin2 = tinx;
+ }
+ if(tin1 <= 1.0f) {
+ if(0 < tin1) {
+ *x++ = (T)xin;
+ *y++ = (T)yin;
+ ++np;
+ }
+ if(tin2 <= 1.0f) {
+ FX_FLOAT toutx = FXSYS_Div(xout - x1, deltax);
+ FX_FLOAT touty = FXSYS_Div(yout - y1, deltay);
+ FX_FLOAT tout1 = (toutx < touty) ? toutx : touty;
+ if(tin2 > 0 || tout1 > 0) {
+ if(tin2 <= tout1) {
+ if(tin2 > 0) {
+ if(tinx > tiny) {
+ *x++ = (T)xin;
+ *y++ = (T)(y1 + FXSYS_Mul(deltay, tinx));
+ } else {
+ *x++ = (T)(x1 + FXSYS_Mul(deltax, tiny));
+ *y++ = (T)yin;
+ }
+ ++np;
+ }
+ if(tout1 < 1.0f) {
+ if(toutx < touty) {
+ *x++ = (T)xout;
+ *y++ = (T)(y1 + FXSYS_Mul(deltay, toutx));
+ } else {
+ *x++ = (T)(x1 + FXSYS_Mul(deltax, touty));
+ *y++ = (T)yout;
+ }
+ } else {
+ *x++ = x2;
+ *y++ = y2;
+ }
+ ++np;
+ } else {
+ if(tinx > tiny) {
+ *x++ = (T)xin;
+ *y++ = (T)yout;
+ } else {
+ *x++ = (T)xout;
+ *y++ = (T)yin;
+ }
+ ++np;
+ }
+ }
+ }
+ }
+ return np;
+}
+}
+#endif
diff --git a/core/src/fxge/agg/agg23/agg_color_gray.h b/core/src/fxge/agg/agg23/agg_color_gray.h
new file mode 100644
index 0000000000..5db7bcaf28
--- /dev/null
+++ b/core/src/fxge/agg/agg23/agg_color_gray.h
@@ -0,0 +1,50 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+// mcseemagg@yahoo.com
+// http://www.antigrain.com
+//----------------------------------------------------------------------------
+//
+// Adaptation for high precision colors has been sponsored by
+// Liberty Technology Systems, Inc., visit http://lib-sys.com
+//
+// Liberty Technology Systems, Inc. is the provider of
+// PostScript and PDF technology for software developers.
+//
+//----------------------------------------------------------------------------
+//
+// color types gray8, gray16
+//
+//----------------------------------------------------------------------------
+#ifndef AGG_COLOR_GRAY_INCLUDED
+#define AGG_COLOR_GRAY_INCLUDED
+#include "agg_basics.h"
+namespace agg
+{
+struct gray8 {
+ typedef int8u value_type;
+ typedef int32u calc_type;
+ typedef int32 long_type;
+ enum base_scale_e {
+ base_shift = 8,
+ base_size = 1 << base_shift,
+ base_mask = base_size - 1
+ };
+ typedef gray8 self_type;
+ value_type v;
+ value_type a;
+ gray8() {}
+ gray8(unsigned v_, unsigned a_ = base_mask) :
+ v(int8u(v_)), a(int8u(a_)) {}
+};
+}
+#endif
diff --git a/core/src/fxge/agg/agg23/agg_conv_adaptor_vcgen.h b/core/src/fxge/agg/agg23/agg_conv_adaptor_vcgen.h
new file mode 100644
index 0000000000..1cf817a1c7
--- /dev/null
+++ b/core/src/fxge/agg/agg23/agg_conv_adaptor_vcgen.h
@@ -0,0 +1,138 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+// mcseemagg@yahoo.com
+// http://www.antigrain.com
+//----------------------------------------------------------------------------
+#ifndef AGG_CONV_ADAPTOR_VCGEN_INCLUDED
+#define AGG_CONV_ADAPTOR_VCGEN_INCLUDED
+#include "agg_basics.h"
+namespace agg
+{
+struct null_markers : public CFX_Object {
+ void remove_all() {}
+ void add_vertex(FX_FLOAT, FX_FLOAT, unsigned) {}
+ void prepare_src() {}
+ void rewind(unsigned) {}
+ unsigned vertex(FX_FLOAT*, FX_FLOAT*)
+ {
+ return path_cmd_stop;
+ }
+};
+template<class VertexSource,
+ class Generator,
+ class Markers = null_markers> class conv_adaptor_vcgen : public CFX_Object
+{
+ enum status {
+ initial,
+ accumulate,
+ generate
+ };
+public:
+ conv_adaptor_vcgen(VertexSource& source) :
+ m_source(&source),
+ m_status(initial)
+ {}
+ void set_source(VertexSource& source)
+ {
+ m_source = &source;
+ }
+ Generator& generator()
+ {
+ return m_generator;
+ }
+ const Generator& generator() const
+ {
+ return m_generator;
+ }
+ Markers& markers()
+ {
+ return m_markers;
+ }
+ const Markers& markers() const
+ {
+ return m_markers;
+ }
+ void rewind(unsigned path_id)
+ {
+ m_source->rewind(path_id);
+ m_status = initial;
+ }
+ unsigned vertex(FX_FLOAT* x, FX_FLOAT* y);
+private:
+ conv_adaptor_vcgen(const conv_adaptor_vcgen<VertexSource, Generator, Markers>&);
+ const conv_adaptor_vcgen<VertexSource, Generator, Markers>&
+ operator = (const conv_adaptor_vcgen<VertexSource, Generator, Markers>&);
+ VertexSource* m_source;
+ Generator m_generator;
+ Markers m_markers;
+ status m_status;
+ unsigned m_last_cmd;
+ FX_FLOAT m_start_x;
+ FX_FLOAT m_start_y;
+};
+template<class VertexSource, class Generator, class Markers>
+unsigned conv_adaptor_vcgen<VertexSource, Generator, Markers>::vertex(FX_FLOAT* x, FX_FLOAT* y)
+{
+ unsigned cmd = path_cmd_stop;
+ bool done = false;
+ while(!done) {
+ switch(m_status) {
+ case initial:
+ m_markers.remove_all();
+ m_last_cmd = m_source->vertex(&m_start_x, &m_start_y);
+ m_status = accumulate;
+ case accumulate:
+ if(is_stop(m_last_cmd)) {
+ return path_cmd_stop;
+ }
+ m_generator.remove_all();
+ m_generator.add_vertex(m_start_x, m_start_y, path_cmd_move_to);
+ m_markers.add_vertex(m_start_x, m_start_y, path_cmd_move_to);
+ for(;;) {
+ cmd = m_source->vertex(x, y);
+ if(is_vertex(cmd)) {
+ m_last_cmd = cmd;
+ if(is_move_to(cmd)) {
+ m_start_x = *x;
+ m_start_y = *y;
+ break;
+ }
+ m_generator.add_vertex(*x, *y, cmd);
+ m_markers.add_vertex(*x, *y, path_cmd_line_to);
+ } else {
+ if(is_stop(cmd)) {
+ m_last_cmd = path_cmd_stop;
+ break;
+ }
+ if(is_end_poly(cmd)) {
+ m_generator.add_vertex(*x, *y, cmd);
+ break;
+ }
+ }
+ }
+ m_generator.rewind(0);
+ m_status = generate;
+ case generate:
+ cmd = m_generator.vertex(x, y);
+ if(is_stop(cmd)) {
+ m_status = accumulate;
+ break;
+ }
+ done = true;
+ break;
+ }
+ }
+ return cmd;
+}
+}
+#endif
diff --git a/core/src/fxge/agg/agg23/agg_conv_dash.h b/core/src/fxge/agg/agg23/agg_conv_dash.h
new file mode 100644
index 0000000000..63b2019dde
--- /dev/null
+++ b/core/src/fxge/agg/agg23/agg_conv_dash.h
@@ -0,0 +1,61 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+// mcseemagg@yahoo.com
+// http://www.antigrain.com
+//----------------------------------------------------------------------------
+//
+// conv_dash
+//
+//----------------------------------------------------------------------------
+#ifndef AGG_CONV_DASH_INCLUDED
+#define AGG_CONV_DASH_INCLUDED
+#include "agg_basics.h"
+#include "agg_vcgen_dash.h"
+#include "agg_conv_adaptor_vcgen.h"
+namespace agg
+{
+template<class VertexSource, class Markers = null_markers>
+struct conv_dash : public conv_adaptor_vcgen<VertexSource, vcgen_dash, Markers> {
+ typedef Markers marker_type;
+ typedef conv_adaptor_vcgen<VertexSource, vcgen_dash, Markers> base_type;
+ conv_dash(VertexSource& vs) :
+ conv_adaptor_vcgen<VertexSource, vcgen_dash, Markers>(vs)
+ {
+ }
+ void remove_all_dashes()
+ {
+ base_type::generator().remove_all_dashes();
+ }
+ void add_dash(FX_FLOAT dash_len, FX_FLOAT gap_len)
+ {
+ base_type::generator().add_dash(dash_len, gap_len);
+ }
+ void dash_start(FX_FLOAT ds)
+ {
+ base_type::generator().dash_start(ds);
+ }
+ void shorten(FX_FLOAT s)
+ {
+ base_type::generator().shorten(s);
+ }
+ double shorten() const
+ {
+ return base_type::generator().shorten();
+ }
+private:
+ conv_dash(const conv_dash<VertexSource, Markers>&);
+ const conv_dash<VertexSource, Markers>&
+ operator = (const conv_dash<VertexSource, Markers>&);
+};
+}
+#endif
diff --git a/core/src/fxge/agg/agg23/agg_conv_stroke.h b/core/src/fxge/agg/agg23/agg_conv_stroke.h
new file mode 100644
index 0000000000..5a36bd73bb
--- /dev/null
+++ b/core/src/fxge/agg/agg23/agg_conv_stroke.h
@@ -0,0 +1,110 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+// mcseemagg@yahoo.com
+// http://www.antigrain.com
+//----------------------------------------------------------------------------
+//
+// conv_stroke
+//
+//----------------------------------------------------------------------------
+#ifndef AGG_CONV_STROKE_INCLUDED
+#define AGG_CONV_STROKE_INCLUDED
+#include "agg_basics.h"
+#include "agg_vcgen_stroke.h"
+#include "agg_conv_adaptor_vcgen.h"
+namespace agg
+{
+template<class VertexSource, class Markers = null_markers>
+struct conv_stroke :
+ public conv_adaptor_vcgen<VertexSource, vcgen_stroke, Markers> {
+ typedef Markers marker_type;
+ typedef conv_adaptor_vcgen<VertexSource, vcgen_stroke, Markers> base_type;
+ conv_stroke(VertexSource& vs) :
+ conv_adaptor_vcgen<VertexSource, vcgen_stroke, Markers>(vs)
+ {
+ }
+ void line_cap(line_cap_e lc)
+ {
+ base_type::generator().line_cap(lc);
+ }
+ void line_join(line_join_e lj)
+ {
+ base_type::generator().line_join(lj);
+ }
+ void inner_join(inner_join_e ij)
+ {
+ base_type::generator().inner_join(ij);
+ }
+ line_cap_e line_cap() const
+ {
+ return base_type::generator().line_cap();
+ }
+ line_join_e line_join() const
+ {
+ return base_type::generator().line_join();
+ }
+ inner_join_e inner_join() const
+ {
+ return base_type::generator().inner_join();
+ }
+ void width(FX_FLOAT w)
+ {
+ base_type::generator().width(w);
+ }
+ void miter_limit(FX_FLOAT ml)
+ {
+ base_type::generator().miter_limit(ml);
+ }
+ void miter_limit_theta(FX_FLOAT t)
+ {
+ base_type::generator().miter_limit_theta(t);
+ }
+ void inner_miter_limit(FX_FLOAT ml)
+ {
+ base_type::generator().inner_miter_limit(ml);
+ }
+ void approximation_scale(FX_FLOAT as)
+ {
+ base_type::generator().approximation_scale(as);
+ }
+ FX_FLOAT width() const
+ {
+ return base_type::generator().width();
+ }
+ FX_FLOAT miter_limit() const
+ {
+ return base_type::generator().miter_limit();
+ }
+ FX_FLOAT inner_miter_limit() const
+ {
+ return base_type::generator().inner_miter_limit();
+ }
+ FX_FLOAT approximation_scale() const
+ {
+ return base_type::generator().approximation_scale();
+ }
+ void shorten(FX_FLOAT s)
+ {
+ base_type::generator().shorten(s);
+ }
+ FX_FLOAT shorten() const
+ {
+ return base_type::generator().shorten();
+ }
+private:
+ conv_stroke(const conv_stroke<VertexSource, Markers>&);
+ const conv_stroke<VertexSource, Markers>&
+ operator = (const conv_stroke<VertexSource, Markers>&);
+};
+}
+#endif
diff --git a/core/src/fxge/agg/agg23/agg_curves.h b/core/src/fxge/agg/agg23/agg_curves.h
new file mode 100644
index 0000000000..5719cbf508
--- /dev/null
+++ b/core/src/fxge/agg/agg23/agg_curves.h
@@ -0,0 +1,191 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+// Copyright (C) 2005 Tony Juricic (tonygeek@yahoo.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+// mcseemagg@yahoo.com
+// http://www.antigrain.com
+//----------------------------------------------------------------------------
+#ifndef AGG_CURVES_INCLUDED
+#define AGG_CURVES_INCLUDED
+#include "agg_array.h"
+namespace agg
+{
+struct curve4_points : public CFX_Object {
+ FX_FLOAT cp[8];
+ curve4_points() {}
+ curve4_points(FX_FLOAT x1, FX_FLOAT y1,
+ FX_FLOAT x2, FX_FLOAT y2,
+ FX_FLOAT x3, FX_FLOAT y3,
+ FX_FLOAT x4, FX_FLOAT y4)
+ {
+ cp[0] = x1;
+ cp[1] = y1;
+ cp[2] = x2;
+ cp[3] = y2;
+ cp[4] = x3;
+ cp[5] = y3;
+ cp[6] = x4;
+ cp[7] = y4;
+ }
+ void init(FX_FLOAT x1, FX_FLOAT y1,
+ FX_FLOAT x2, FX_FLOAT y2,
+ FX_FLOAT x3, FX_FLOAT y3,
+ FX_FLOAT x4, FX_FLOAT y4)
+ {
+ cp[0] = x1;
+ cp[1] = y1;
+ cp[2] = x2;
+ cp[3] = y2;
+ cp[4] = x3;
+ cp[5] = y3;
+ cp[6] = x4;
+ cp[7] = y4;
+ }
+ FX_FLOAT operator [] (unsigned i) const
+ {
+ return cp[i];
+ }
+ FX_FLOAT& operator [] (unsigned i)
+ {
+ return cp[i];
+ }
+};
+class curve4_div : public CFX_Object
+{
+public:
+ curve4_div() :
+ m_cusp_limit(0),
+ m_count(0)
+ {}
+ curve4_div(FX_FLOAT x1, FX_FLOAT y1,
+ FX_FLOAT x2, FX_FLOAT y2,
+ FX_FLOAT x3, FX_FLOAT y3,
+ FX_FLOAT x4, FX_FLOAT y4) :
+ m_cusp_limit(0),
+ m_count(0)
+ {
+ init(x1, y1, x2, y2, x3, y3, x4, y4);
+ }
+ curve4_div(const curve4_points& cp) :
+ m_count(0)
+ {
+ init(cp[0], cp[1], cp[2], cp[3], cp[4], cp[5], cp[6], cp[7]);
+ }
+ void reset()
+ {
+ m_points.remove_all();
+ m_count = 0;
+ }
+ void init(FX_FLOAT x1, FX_FLOAT y1,
+ FX_FLOAT x2, FX_FLOAT y2,
+ FX_FLOAT x3, FX_FLOAT y3,
+ FX_FLOAT x4, FX_FLOAT y4);
+ void init(const curve4_points& cp)
+ {
+ init(cp[0], cp[1], cp[2], cp[3], cp[4], cp[5], cp[6], cp[7]);
+ }
+ void rewind(unsigned)
+ {
+ m_count = 0;
+ }
+ unsigned vertex(FX_FLOAT* x, FX_FLOAT* y)
+ {
+ if(m_count >= m_points.size()) {
+ return path_cmd_stop;
+ }
+ const point_type& p = m_points[m_count++];
+ *x = p.x;
+ *y = p.y;
+ return (m_count == 1) ? path_cmd_move_to : path_cmd_line_to;
+ }
+ unsigned vertex_flag(FX_FLOAT* x, FX_FLOAT* y, int& flag)
+ {
+ if(m_count >= m_points.size()) {
+ return path_cmd_stop;
+ }
+ const point_type& p = m_points[m_count++];
+ *x = p.x;
+ *y = p.y;
+ flag = p.flag;
+ return (m_count == 1) ? path_cmd_move_to : path_cmd_line_to;
+ }
+ int count()
+ {
+ return m_points.size();
+ }
+private:
+ void bezier(FX_FLOAT x1, FX_FLOAT y1,
+ FX_FLOAT x2, FX_FLOAT y2,
+ FX_FLOAT x3, FX_FLOAT y3,
+ FX_FLOAT x4, FX_FLOAT y4);
+ void recursive_bezier(FX_FLOAT x1, FX_FLOAT y1,
+ FX_FLOAT x2, FX_FLOAT y2,
+ FX_FLOAT x3, FX_FLOAT y3,
+ FX_FLOAT x4, FX_FLOAT y4,
+ unsigned level);
+ FX_FLOAT m_distance_tolerance_square;
+ FX_FLOAT m_distance_tolerance_manhattan;
+ FX_FLOAT m_cusp_limit;
+ unsigned m_count;
+ pod_deque<point_type> m_points;
+};
+class curve4 : public CFX_Object
+{
+public:
+ curve4() {}
+ curve4(FX_FLOAT x1, FX_FLOAT y1,
+ FX_FLOAT x2, FX_FLOAT y2,
+ FX_FLOAT x3, FX_FLOAT y3,
+ FX_FLOAT x4, FX_FLOAT y4)
+ {
+ init(x1, y1, x2, y2, x3, y3, x4, y4);
+ }
+ curve4(const curve4_points& cp)
+ {
+ init(cp[0], cp[1], cp[2], cp[3], cp[4], cp[5], cp[6], cp[7]);
+ }
+ void reset()
+ {
+ m_curve_div.reset();
+ }
+ void init(FX_FLOAT x1, FX_FLOAT y1,
+ FX_FLOAT x2, FX_FLOAT y2,
+ FX_FLOAT x3, FX_FLOAT y3,
+ FX_FLOAT x4, FX_FLOAT y4)
+ {
+ m_curve_div.init(x1, y1, x2, y2, x3, y3, x4, y4);
+ }
+ void init(const curve4_points& cp)
+ {
+ init(cp[0], cp[1], cp[2], cp[3], cp[4], cp[5], cp[6], cp[7]);
+ }
+ void rewind(unsigned path_id)
+ {
+ m_curve_div.rewind(path_id);
+ }
+ unsigned vertex(FX_FLOAT* x, FX_FLOAT* y)
+ {
+ return m_curve_div.vertex(x, y);
+ }
+ unsigned vertex_curve_flag(FX_FLOAT* x, FX_FLOAT* y, int& flag)
+ {
+ return m_curve_div.vertex_flag(x, y, flag);
+ }
+ int count()
+ {
+ return m_curve_div.count();
+ }
+private:
+ curve4_div m_curve_div;
+};
+}
+#endif
diff --git a/core/src/fxge/agg/agg23/agg_math.h b/core/src/fxge/agg/agg23/agg_math.h
new file mode 100644
index 0000000000..31e0daf3bb
--- /dev/null
+++ b/core/src/fxge/agg/agg23/agg_math.h
@@ -0,0 +1,63 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+// mcseemagg@yahoo.com
+// http://www.antigrain.com
+//----------------------------------------------------------------------------
+// Bessel function (besj) was adapted for use in AGG library by Andy Wilk
+// Contact: castor.vulgaris@gmail.com
+//----------------------------------------------------------------------------
+#ifndef AGG_MATH_INCLUDED
+#define AGG_MATH_INCLUDED
+#include "agg_basics.h"
+namespace agg
+{
+const FX_FLOAT intersection_epsilon = 1.0e-30f;
+AGG_INLINE FX_FLOAT calc_point_location(FX_FLOAT x1, FX_FLOAT y1,
+ FX_FLOAT x2, FX_FLOAT y2,
+ FX_FLOAT x, FX_FLOAT y)
+{
+ return FXSYS_Mul(x - x2, y2 - y1) - FXSYS_Mul(y - y2, x2 - x1);
+}
+AGG_INLINE FX_FLOAT calc_distance(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2)
+{
+ FX_FLOAT dx = x2 - x1;
+ FX_FLOAT dy = y2 - y1;
+ return FXSYS_sqrt2(dx, dy);
+}
+AGG_INLINE FX_FLOAT calc_line_point_distance(FX_FLOAT x1, FX_FLOAT y1,
+ FX_FLOAT x2, FX_FLOAT y2,
+ FX_FLOAT x, FX_FLOAT y)
+{
+ FX_FLOAT dx = x2 - x1;
+ FX_FLOAT dy = y2 - y1;
+ FX_FLOAT d = FXSYS_sqrt2(dx, dy);
+ if(d < intersection_epsilon) {
+ return calc_distance(x1, y1, x, y);
+ }
+ return FXSYS_MulDiv(x - x2, dy, d) - FXSYS_MulDiv(y - y2, dx, d);
+}
+AGG_INLINE bool calc_intersection(FX_FLOAT ax, FX_FLOAT ay, FX_FLOAT bx, FX_FLOAT by,
+ FX_FLOAT cx, FX_FLOAT cy, FX_FLOAT dx, FX_FLOAT dy,
+ FX_FLOAT* x, FX_FLOAT* y)
+{
+ FX_FLOAT num = FXSYS_Mul(ay - cy, dx - cx) - FXSYS_Mul(ax - cx, dy - cy);
+ FX_FLOAT den = FXSYS_Mul(bx - ax, dy - cy) - FXSYS_Mul(by - ay, dx - cx);
+ if (FXSYS_fabs(den) < intersection_epsilon) {
+ return false;
+ }
+ *x = ax + FXSYS_MulDiv(bx - ax, num, den);
+ *y = ay + FXSYS_MulDiv(by - ay, num, den);
+ return true;
+}
+}
+#endif
diff --git a/core/src/fxge/agg/agg23/agg_math_stroke.h b/core/src/fxge/agg/agg23/agg_math_stroke.h
new file mode 100644
index 0000000000..620d675312
--- /dev/null
+++ b/core/src/fxge/agg/agg23/agg_math_stroke.h
@@ -0,0 +1,272 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+// mcseemagg@yahoo.com
+// http://www.antigrain.com
+//----------------------------------------------------------------------------
+//
+// Stroke math
+//
+//----------------------------------------------------------------------------
+#ifndef AGG_STROKE_MATH_INCLUDED
+#define AGG_STROKE_MATH_INCLUDED
+#include "agg_math.h"
+#include "agg_vertex_sequence.h"
+namespace agg
+{
+enum line_cap_e {
+ butt_cap,
+ square_cap,
+ round_cap
+};
+enum line_join_e {
+ miter_join = 0,
+ miter_join_revert = 1,
+ miter_join_round = 4,
+ round_join = 2,
+ bevel_join = 3
+};
+enum inner_join_e {
+ inner_bevel,
+ inner_miter,
+ inner_jag,
+ inner_round
+};
+const FX_FLOAT stroke_theta = 1.0f / 1000.0f;
+template<class VertexConsumer>
+void stroke_calc_arc(VertexConsumer& out_vertices,
+ FX_FLOAT x, FX_FLOAT y,
+ FX_FLOAT dx1, FX_FLOAT dy1,
+ FX_FLOAT dx2, FX_FLOAT dy2,
+ FX_FLOAT width,
+ FX_FLOAT approximation_scale)
+{
+ typedef typename VertexConsumer::value_type coord_type;
+ FX_FLOAT a1 = FXSYS_atan2(dy1, dx1);
+ FX_FLOAT a2 = FXSYS_atan2(dy2, dx2);
+ FX_FLOAT da = a1 - a2;
+ bool ccw = da > 0 && da < FX_PI;
+ if(width < 0) {
+ width = -width;
+ }
+ da = FXSYS_acos(FXSYS_Div(width, width + FXSYS_Div(1.0f / 8, approximation_scale))) * 2;
+ out_vertices.add(coord_type(x + dx1, y + dy1));
+ if(!ccw) {
+ if(a1 > a2) {
+ a2 += 2 * FX_PI;
+ }
+ a2 -= da / 4;
+ a1 += da;
+ while(a1 < a2) {
+ out_vertices.add(coord_type(x + FXSYS_Mul(width, FXSYS_cos(a1)),
+ y + FXSYS_Mul(width, FXSYS_sin(a1))));
+ a1 += da;
+ }
+ } else {
+ if(a1 < a2) {
+ a2 -= 2 * FX_PI;
+ }
+ a2 += da / 4;
+ a1 -= da;
+ while(a1 > a2) {
+ out_vertices.add(coord_type(x + FXSYS_Mul(width, FXSYS_cos(a1)),
+ y + FXSYS_Mul(width, FXSYS_sin(a1))));
+ a1 -= da;
+ }
+ }
+ out_vertices.add(coord_type(x + dx2, y + dy2));
+}
+template<class VertexConsumer>
+void stroke_calc_miter(VertexConsumer& out_vertices,
+ const vertex_dist& v0,
+ const vertex_dist& v1,
+ const vertex_dist& v2,
+ FX_FLOAT dx1, FX_FLOAT dy1,
+ FX_FLOAT dx2, FX_FLOAT dy2,
+ FX_FLOAT width,
+ line_join_e line_join,
+ FX_FLOAT miter_limit,
+ FX_FLOAT approximation_scale)
+{
+ typedef typename VertexConsumer::value_type coord_type;
+ FX_FLOAT xi = v1.x;
+ FX_FLOAT yi = v1.y;
+ bool miter_limit_exceeded = true;
+ if(calc_intersection(v0.x + dx1, v0.y - dy1,
+ v1.x + dx1, v1.y - dy1,
+ v1.x + dx2, v1.y - dy2,
+ v2.x + dx2, v2.y - dy2,
+ &xi, &yi)) {
+ FX_FLOAT d1 = calc_distance(v1.x, v1.y, xi, yi);
+ FX_FLOAT lim = FXSYS_Mul(width, miter_limit);
+ if(d1 <= lim) {
+ out_vertices.add(coord_type(xi, yi));
+ miter_limit_exceeded = false;
+ }
+ } else {
+ FX_FLOAT x2 = v1.x + dx1;
+ FX_FLOAT y2 = v1.y - dy1;
+ if((FXSYS_Mul(x2 - v0.x, dy1) - FXSYS_Mul(v0.y - y2, dx1) < 0) !=
+ (FXSYS_Mul(x2 - v2.x, dy1) - FXSYS_Mul(v2.y - y2, dx1) < 0)) {
+ out_vertices.add(coord_type(v1.x + dx1, v1.y - dy1));
+ miter_limit_exceeded = false;
+ }
+ }
+ if(miter_limit_exceeded) {
+ switch(line_join) {
+ case miter_join_revert:
+ out_vertices.add(coord_type(v1.x + dx1, v1.y - dy1));
+ out_vertices.add(coord_type(v1.x + dx2, v1.y - dy2));
+ break;
+ case miter_join_round:
+ stroke_calc_arc(out_vertices,
+ v1.x, v1.y, dx1, -dy1, dx2, -dy2,
+ width, approximation_scale);
+ break;
+ default:
+ out_vertices.add(coord_type(v1.x + dx1 + FXSYS_Mul(dy1, miter_limit),
+ v1.y - dy1 + FXSYS_Mul(dx1, miter_limit)));
+ out_vertices.add(coord_type(v1.x + dx2 - FXSYS_Mul(dy2, miter_limit),
+ v1.y - dy2 - FXSYS_Mul(dx2, miter_limit)));
+ break;
+ }
+ }
+}
+template<class VertexConsumer>
+void stroke_calc_cap(VertexConsumer& out_vertices,
+ const vertex_dist& v0,
+ const vertex_dist& v1,
+ FX_FLOAT len,
+ line_cap_e line_cap,
+ FX_FLOAT width,
+ FX_FLOAT approximation_scale)
+{
+ typedef typename VertexConsumer::value_type coord_type;
+ out_vertices.remove_all();
+ FX_FLOAT dx1 = FXSYS_Div(v1.y - v0.y, len);
+ FX_FLOAT dy1 = FXSYS_Div(v1.x - v0.x, len);
+ FX_FLOAT dx2 = 0;
+ FX_FLOAT dy2 = 0;
+ dx1 = FXSYS_Mul(dx1, width);
+ dy1 = FXSYS_Mul(dy1, width);
+ if(line_cap != round_cap) {
+ if(line_cap == square_cap) {
+ dx2 = dy1;
+ dy2 = dx1;
+ }
+ out_vertices.add(coord_type(v0.x - dx1 - dx2, v0.y + dy1 - dy2));
+ out_vertices.add(coord_type(v0.x + dx1 - dx2, v0.y - dy1 - dy2));
+ } else {
+ FX_FLOAT a1 = FXSYS_atan2(dy1, -dx1);
+ FX_FLOAT a2 = a1 + FX_PI;
+ FX_FLOAT da = FXSYS_acos(FXSYS_Div(width, width +
+ FXSYS_Div(1.0f / 8, approximation_scale))) * 2;
+ out_vertices.add(coord_type(v0.x - dx1, v0.y + dy1));
+ a1 += da;
+ a2 -= da / 4;
+ while(a1 < a2) {
+ out_vertices.add(coord_type(v0.x + FXSYS_Mul(width, FXSYS_cos(a1)),
+ v0.y + FXSYS_Mul(width, FXSYS_sin(a1))));
+ a1 += da;
+ }
+ out_vertices.add(coord_type(v0.x + dx1, v0.y - dy1));
+ }
+}
+template<class VertexConsumer>
+void stroke_calc_join(VertexConsumer& out_vertices,
+ const vertex_dist& v0,
+ const vertex_dist& v1,
+ const vertex_dist& v2,
+ FX_FLOAT len1,
+ FX_FLOAT len2,
+ FX_FLOAT width,
+ line_join_e line_join,
+ inner_join_e inner_join,
+ FX_FLOAT miter_limit,
+ FX_FLOAT inner_miter_limit,
+ FX_FLOAT approximation_scale)
+{
+ typedef typename VertexConsumer::value_type coord_type;
+ FX_FLOAT dx1, dy1, dx2, dy2;
+ dx1 = FXSYS_MulDiv(width, v1.y - v0.y, len1);
+ dy1 = FXSYS_MulDiv(width, v1.x - v0.x, len1);
+ dx2 = FXSYS_MulDiv(width, v2.y - v1.y, len2);
+ dy2 = FXSYS_MulDiv(width, v2.x - v1.x, len2);
+ out_vertices.remove_all();
+ if(calc_point_location(v0.x, v0.y, v1.x, v1.y, v2.x, v2.y) > 0) {
+ switch(inner_join) {
+ default:
+ out_vertices.add(coord_type(v1.x + dx1, v1.y - dy1));
+ out_vertices.add(coord_type(v1.x + dx2, v1.y - dy2));
+ break;
+ case inner_miter:
+ stroke_calc_miter(out_vertices,
+ v0, v1, v2, dx1, dy1, dx2, dy2,
+ width,
+ miter_join_revert,
+ inner_miter_limit,
+ 1.0f);
+ break;
+ case inner_jag:
+ case inner_round: {
+ FX_FLOAT d = (dx1 - dx2) * (dx1 - dx2) + (dy1 - dy2) * (dy1 - dy2);
+ if(d < len1 * len1 && d < len2 * len2) {
+ stroke_calc_miter(out_vertices,
+ v0, v1, v2, dx1, dy1, dx2, dy2,
+ width,
+ miter_join_revert,
+ inner_miter_limit,
+ 1.0f);
+ } else {
+ if(inner_join == inner_jag) {
+ out_vertices.add(coord_type(v1.x + dx1, v1.y - dy1));
+ out_vertices.add(coord_type(v1.x, v1.y ));
+ out_vertices.add(coord_type(v1.x + dx2, v1.y - dy2));
+ } else {
+ out_vertices.add(coord_type(v1.x + dx1, v1.y - dy1));
+ out_vertices.add(coord_type(v1.x, v1.y ));
+ stroke_calc_arc(out_vertices,
+ v1.x, v1.y, dx2, -dy2, dx1, -dy1,
+ width, approximation_scale);
+ out_vertices.add(coord_type(v1.x, v1.y ));
+ out_vertices.add(coord_type(v1.x + dx2, v1.y - dy2));
+ }
+ }
+ }
+ break;
+ }
+ } else {
+ switch(line_join) {
+ case miter_join:
+ case miter_join_revert:
+ case miter_join_round:
+ stroke_calc_miter(out_vertices,
+ v0, v1, v2, dx1, dy1, dx2, dy2,
+ width,
+ line_join,
+ miter_limit,
+ approximation_scale);
+ break;
+ case round_join:
+ stroke_calc_arc(out_vertices,
+ v1.x, v1.y, dx1, -dy1, dx2, -dy2,
+ width, approximation_scale);
+ break;
+ default:
+ out_vertices.add(coord_type(v1.x + dx1, v1.y - dy1));
+ out_vertices.add(coord_type(v1.x + dx2, v1.y - dy2));
+ break;
+ }
+ }
+}
+}
+#endif
diff --git a/core/src/fxge/agg/agg23/agg_path_storage.h b/core/src/fxge/agg/agg23/agg_path_storage.h
new file mode 100644
index 0000000000..64ea0b4753
--- /dev/null
+++ b/core/src/fxge/agg/agg23/agg_path_storage.h
@@ -0,0 +1,172 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+// mcseemagg@yahoo.com
+// http://www.antigrain.com
+//----------------------------------------------------------------------------
+#ifndef AGG_PATH_STORAGE_INCLUDED
+#define AGG_PATH_STORAGE_INCLUDED
+#include "agg_basics.h"
+namespace agg
+{
+class path_storage : public CFX_Object
+{
+ enum block_scale_e {
+ block_shift = 8,
+ block_size = 1 << block_shift,
+ block_mask = block_size - 1,
+ block_pool = 256
+ };
+public:
+ class vertex_source : public CFX_Object
+ {
+ public:
+ vertex_source() {}
+ vertex_source(const path_storage& p) : m_path(&p), m_vertex_idx(0) {}
+ void rewind(unsigned path_id)
+ {
+ m_vertex_idx = path_id;
+ }
+ unsigned vertex(FX_FLOAT* x, FX_FLOAT* y)
+ {
+ return (m_vertex_idx < m_path->total_vertices()) ?
+ m_path->vertex(m_vertex_idx++, x, y) :
+ path_cmd_stop;
+ }
+ private:
+ const path_storage* m_path;
+ unsigned m_vertex_idx;
+ };
+ ~path_storage();
+ path_storage();
+ unsigned last_vertex(FX_FLOAT* x, FX_FLOAT* y) const;
+ unsigned prev_vertex(FX_FLOAT* x, FX_FLOAT* y) const;
+ void move_to(FX_FLOAT x, FX_FLOAT y);
+ void line_to(FX_FLOAT x, FX_FLOAT y);
+ void curve4(FX_FLOAT x_ctrl1, FX_FLOAT y_ctrl1,
+ FX_FLOAT x_ctrl2, FX_FLOAT y_ctrl2,
+ FX_FLOAT x_to, FX_FLOAT y_to);
+ template<class VertexSource>
+ void add_path(VertexSource& vs,
+ unsigned path_id = 0,
+ bool solid_path = true)
+ {
+ FX_FLOAT x, y;
+ unsigned cmd;
+ vs.rewind(path_id);
+ while(!is_stop(cmd = vs.vertex(&x, &y))) {
+ if(is_move_to(cmd) && solid_path && m_total_vertices) {
+ cmd = path_cmd_line_to;
+ }
+ add_vertex(x, y, cmd);
+ }
+ }
+ template<class VertexSource>
+ void add_path_curve(VertexSource& vs,
+ unsigned path_id = 0,
+ bool solid_path = true)
+ {
+ FX_FLOAT x, y;
+ unsigned cmd;
+ int flag;
+ vs.rewind(path_id);
+ while(!is_stop(cmd = vs.vertex_curve_flag(&x, &y, flag))) {
+ if(is_move_to(cmd) && solid_path && m_total_vertices) {
+ cmd = path_cmd_line_to | flag;
+ }
+ add_vertex(x, y, cmd | flag);
+ }
+ }
+ unsigned total_vertices() const
+ {
+ return m_total_vertices;
+ }
+ unsigned vertex(unsigned idx, FX_FLOAT* x, FX_FLOAT* y) const
+ {
+ unsigned nb = idx >> block_shift;
+ const FX_FLOAT* pv = m_coord_blocks[nb] + ((idx & block_mask) << 1);
+ *x = *pv++;
+ *y = *pv;
+ return m_cmd_blocks[nb][idx & block_mask];
+ }
+ unsigned command(unsigned idx) const
+ {
+ return m_cmd_blocks[idx >> block_shift][idx & block_mask];
+ }
+ unsigned getflag(unsigned idx) const
+ {
+ return m_cmd_blocks[idx >> block_shift][idx & block_mask] & path_flags_jr;
+ }
+ void rewind(unsigned path_id);
+ unsigned vertex(FX_FLOAT* x, FX_FLOAT* y);
+ void add_vertex(FX_FLOAT x, FX_FLOAT y, unsigned cmd);
+ void end_poly();
+private:
+ void allocate_block(unsigned nb);
+ unsigned char* storage_ptrs(FX_FLOAT** xy_ptr);
+private:
+ unsigned m_total_vertices;
+ unsigned m_total_blocks;
+ unsigned m_max_blocks;
+ FX_FLOAT** m_coord_blocks;
+ unsigned char** m_cmd_blocks;
+ unsigned m_iterator;
+};
+inline unsigned path_storage::vertex(FX_FLOAT* x, FX_FLOAT* y)
+{
+ if(m_iterator >= m_total_vertices) {
+ return path_cmd_stop;
+ }
+ return vertex(m_iterator++, x, y);
+}
+inline unsigned path_storage::prev_vertex(FX_FLOAT* x, FX_FLOAT* y) const
+{
+ if(m_total_vertices > 1) {
+ return vertex(m_total_vertices - 2, x, y);
+ }
+ return path_cmd_stop;
+}
+inline unsigned path_storage::last_vertex(FX_FLOAT* x, FX_FLOAT* y) const
+{
+ if(m_total_vertices) {
+ return vertex(m_total_vertices - 1, x, y);
+ }
+ return path_cmd_stop;
+}
+inline unsigned char* path_storage::storage_ptrs(FX_FLOAT** xy_ptr)
+{
+ unsigned nb = m_total_vertices >> block_shift;
+ if(nb >= m_total_blocks) {
+ allocate_block(nb);
+ }
+ *xy_ptr = m_coord_blocks[nb] + ((m_total_vertices & block_mask) << 1);
+ return m_cmd_blocks[nb] + (m_total_vertices & block_mask);
+}
+inline void path_storage::add_vertex(FX_FLOAT x, FX_FLOAT y, unsigned cmd)
+{
+ FX_FLOAT* coord_ptr = 0;
+ unsigned char* cmd_ptr = storage_ptrs(&coord_ptr);
+ *cmd_ptr = (unsigned char)cmd;
+ *coord_ptr++ = x;
+ *coord_ptr = y;
+ m_total_vertices++;
+}
+inline void path_storage::move_to(FX_FLOAT x, FX_FLOAT y)
+{
+ add_vertex(x, y, path_cmd_move_to);
+}
+inline void path_storage::line_to(FX_FLOAT x, FX_FLOAT y)
+{
+ add_vertex(x, y, path_cmd_line_to);
+}
+}
+#endif
diff --git a/core/src/fxge/agg/agg23/agg_pixfmt_gray.h b/core/src/fxge/agg/agg23/agg_pixfmt_gray.h
new file mode 100644
index 0000000000..052a2e35d8
--- /dev/null
+++ b/core/src/fxge/agg/agg23/agg_pixfmt_gray.h
@@ -0,0 +1,177 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+// mcseemagg@yahoo.com
+// http://www.antigrain.com
+//----------------------------------------------------------------------------
+//
+// Adaptation for high precision colors has been sponsored by
+// Liberty Technology Systems, Inc., visit http://lib-sys.com
+//
+// Liberty Technology Systems, Inc. is the provider of
+// PostScript and PDF technology for software developers.
+//
+//----------------------------------------------------------------------------
+#ifndef AGG_PIXFMT_GRAY_INCLUDED
+#define AGG_PIXFMT_GRAY_INCLUDED
+#include "agg_basics.h"
+#include "agg_color_gray.h"
+#include "agg_rendering_buffer.h"
+namespace agg
+{
+template<class ColorT> struct blender_gray : public CFX_Object {
+ typedef ColorT color_type;
+ typedef typename color_type::value_type value_type;
+ typedef typename color_type::calc_type calc_type;
+ enum base_scale_e { base_shift = color_type::base_shift };
+ static AGG_INLINE void blend_pix(value_type* p, unsigned cv,
+ unsigned alpha, unsigned cover = 0)
+ {
+ *p = (value_type)((((cv - calc_type(*p)) * alpha) + (calc_type(*p) << base_shift)) >> base_shift);
+ }
+};
+template<class Blender, unsigned Step = 1, unsigned Offset = 0>
+class pixel_formats_gray : public CFX_Object
+{
+public:
+ typedef rendering_buffer::row_data row_data;
+ typedef rendering_buffer::span_data span_data;
+ typedef typename Blender::color_type color_type;
+ typedef typename color_type::value_type value_type;
+ typedef typename color_type::calc_type calc_type;
+ enum base_scale_e {
+ base_shift = color_type::base_shift,
+ base_size = color_type::base_size,
+ base_mask = color_type::base_mask
+ };
+private:
+ static AGG_INLINE void copy_or_blend_pix(value_type* p,
+ const color_type& c,
+ unsigned cover)
+ {
+ if (c.a) {
+ calc_type alpha = (calc_type(c.a) * (cover + 1)) >> 8;
+ if(alpha == base_mask) {
+ *p = c.v;
+ } else {
+ Blender::blend_pix(p, c.v, alpha, cover);
+ }
+ }
+ }
+ static AGG_INLINE void copy_or_blend_pix(value_type* p,
+ const color_type& c)
+ {
+ if (c.a) {
+ if(c.a == base_mask) {
+ *p = c.v;
+ } else {
+ Blender::blend_pix(p, c.v, c.a);
+ }
+ }
+ }
+public:
+ pixel_formats_gray(rendering_buffer& rb) :
+ m_rbuf(&rb)
+ {}
+ AGG_INLINE unsigned width() const
+ {
+ return m_rbuf->width();
+ }
+ AGG_INLINE unsigned height() const
+ {
+ return m_rbuf->height();
+ }
+ AGG_INLINE color_type pixel(int x, int y) const
+ {
+ value_type* p = (value_type*)m_rbuf->row(y) + x * Step + Offset;
+ return color_type(*p);
+ }
+ row_data row(int x, int y) const
+ {
+ return row_data(x,
+ width() - 1,
+ m_rbuf->row(y) +
+ x * Step * sizeof(value_type) +
+ Offset * sizeof(value_type));
+ }
+ span_data span(int x, int y, unsigned len)
+ {
+ return span_data(x, len,
+ m_rbuf->row(y) +
+ x * Step * sizeof(value_type) +
+ Offset * sizeof(value_type));
+ }
+ AGG_INLINE void copy_pixel(int x, int y, const color_type& c)
+ {
+ *((value_type*)m_rbuf->row(y) + x * Step + Offset) = c.v;
+ }
+ AGG_INLINE void blend_pixel(int x, int y, const color_type& c, int8u cover)
+ {
+ copy_or_blend_pix((value_type*)m_rbuf->row(y) + x * Step + Offset, c, cover);
+ }
+ AGG_INLINE void copy_hline(int x, int y,
+ unsigned len,
+ const color_type& c)
+ {
+ value_type* p = (value_type*)m_rbuf->row(y) + x * Step + Offset;
+ do {
+ *p = c.v;
+ p += Step;
+ } while(--len);
+ }
+ void blend_hline(int x, int y,
+ unsigned len,
+ const color_type& c,
+ int8u cover)
+ {
+ if (c.a) {
+ value_type* p = (value_type*)m_rbuf->row(y) + x * Step + Offset;
+ calc_type alpha = (calc_type(c.a) * (cover + 1)) >> 8;
+ if(alpha == base_mask) {
+ do {
+ *p = c.v;
+ p += Step;
+ } while(--len);
+ } else {
+ do {
+ Blender::blend_pix(p, c.v, alpha, cover);
+ p += Step;
+ } while(--len);
+ }
+ }
+ }
+ void blend_solid_hspan(int x, int y,
+ unsigned len,
+ const color_type& c,
+ const int8u* covers)
+ {
+ if (c.a) {
+ value_type* p = (value_type*)m_rbuf->row(y) + x * Step + Offset;
+ do {
+ calc_type alpha = (calc_type(c.a) * (calc_type(*covers) + 1)) >> 8;
+ if(alpha == base_mask) {
+ *p = c.v;
+ } else {
+ Blender::blend_pix(p, c.v, alpha, *covers);
+ }
+ p += Step;
+ ++covers;
+ } while(--len);
+ }
+ }
+private:
+ rendering_buffer* m_rbuf;
+};
+typedef blender_gray<gray8> blender_gray8;
+typedef pixel_formats_gray<blender_gray8, 1, 0> pixfmt_gray8;
+}
+#endif
diff --git a/core/src/fxge/agg/agg23/agg_rasterizer_scanline_aa.h b/core/src/fxge/agg/agg23/agg_rasterizer_scanline_aa.h
new file mode 100644
index 0000000000..e9f0defbe8
--- /dev/null
+++ b/core/src/fxge/agg/agg23/agg_rasterizer_scanline_aa.h
@@ -0,0 +1,472 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+//
+// The author gratefully acknowleges the support of David Turner,
+// Robert Wilhelm, and Werner Lemberg - the authors of the FreeType
+// libray - in producing this work. See http://www.freetype.org for details.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+// mcseemagg@yahoo.com
+// http://www.antigrain.com
+//----------------------------------------------------------------------------
+//
+// Adaptation for 32-bit screen coordinates has been sponsored by
+// Liberty Technology Systems, Inc., visit http://lib-sys.com
+//
+// Liberty Technology Systems, Inc. is the provider of
+// PostScript and PDF technology for software developers.
+//
+//----------------------------------------------------------------------------
+#ifndef AGG_RASTERIZER_SCANLINE_AA_INCLUDED
+#define AGG_RASTERIZER_SCANLINE_AA_INCLUDED
+#include "../../../../include/fxge/fx_ge.h"
+#include "agg_basics.h"
+#include "agg_math.h"
+#include "agg_array.h"
+#include "agg_clip_liang_barsky.h"
+#include "agg_render_scanlines.h"
+namespace agg
+{
+enum poly_base_scale_e {
+ poly_base_shift = 8,
+ poly_base_size = 1 << poly_base_shift,
+ poly_base_mask = poly_base_size - 1
+};
+inline int poly_coord(FX_FLOAT c)
+{
+ return int(c * poly_base_size);
+}
+struct cell_aa : public CFX_Object {
+ int x;
+ int y;
+ int cover;
+ int area;
+ void set(int x, int y, int c, int a);
+ void set_coord(int x, int y);
+ void set_cover(int c, int a);
+ void add_cover(int c, int a);
+};
+class outline_aa : public CFX_Object
+{
+ enum cell_block_scale_e {
+ cell_block_shift = 12,
+ cell_block_size = 1 << cell_block_shift,
+ cell_block_mask = cell_block_size - 1,
+ cell_block_pool = 256,
+ cell_block_limit = 1024
+ };
+ struct sorted_y : public CFX_Object {
+ unsigned start;
+ unsigned num;
+ };
+public:
+ ~outline_aa();
+ outline_aa();
+ void reset();
+ void move_to(int x, int y);
+ void line_to(int x, int y);
+ int min_x() const
+ {
+ return m_min_x;
+ }
+ int min_y() const
+ {
+ return m_min_y;
+ }
+ int max_x() const
+ {
+ return m_max_x;
+ }
+ int max_y() const
+ {
+ return m_max_y;
+ }
+ void sort_cells();
+ unsigned total_cells() const
+ {
+ return m_num_cells;
+ }
+ unsigned scanline_num_cells(unsigned y) const
+ {
+ return m_sorted_y[y - m_min_y].num;
+ }
+ const cell_aa* const* scanline_cells(unsigned y) const
+ {
+ return m_sorted_cells.data() + m_sorted_y[y - m_min_y].start;
+ }
+ bool sorted() const
+ {
+ return m_sorted;
+ }
+private:
+ outline_aa(const outline_aa&);
+ const outline_aa& operator = (const outline_aa&);
+ void set_cur_cell(int x, int y);
+ void add_cur_cell();
+ void render_hline(int ey, int x1, int y1, int x2, int y2);
+ void render_line(int x1, int y1, int x2, int y2);
+ void allocate_block();
+private:
+ unsigned m_num_blocks;
+ unsigned m_max_blocks;
+ unsigned m_cur_block;
+ unsigned m_num_cells;
+ cell_aa** m_cells;
+ cell_aa* m_cur_cell_ptr;
+ pod_array<cell_aa*> m_sorted_cells;
+ pod_array<sorted_y> m_sorted_y;
+ cell_aa m_cur_cell;
+ int m_cur_x;
+ int m_cur_y;
+ int m_min_x;
+ int m_min_y;
+ int m_max_x;
+ int m_max_y;
+ bool m_sorted;
+};
+class scanline_hit_test : public CFX_Object
+{
+public:
+ scanline_hit_test(int x) : m_x(x), m_hit(false) {}
+ void reset_spans() {}
+ void finalize(int) {}
+ void add_cell(int x, int)
+ {
+ if(m_x == x) {
+ m_hit = true;
+ }
+ }
+ void add_span(int x, int len, int)
+ {
+ if(m_x >= x && m_x < x + len) {
+ m_hit = true;
+ }
+ }
+ unsigned num_spans() const
+ {
+ return 1;
+ }
+ bool hit() const
+ {
+ return m_hit;
+ }
+private:
+ int m_x;
+ bool m_hit;
+};
+enum filling_rule_e {
+ fill_non_zero,
+ fill_even_odd
+};
+class rasterizer_scanline_aa : public CFX_Object
+{
+ enum status {
+ status_initial,
+ status_line_to,
+ status_closed
+ };
+public:
+ enum aa_scale_e {
+ aa_num = 1 << 8,
+ aa_mask = aa_num - 1,
+ aa_2num = aa_num * 2,
+ aa_2mask = aa_2num - 1
+ };
+ rasterizer_scanline_aa() :
+ m_filling_rule(fill_non_zero),
+ m_clipped_start_x(0),
+ m_clipped_start_y(0),
+ m_status(status_initial),
+ m_clipping(false)
+ {
+ }
+ ~rasterizer_scanline_aa() {}
+ void filling_rule(filling_rule_e filling_rule)
+ {
+ m_filling_rule = filling_rule;
+ }
+ int min_x() const
+ {
+ return m_outline.min_x();
+ }
+ int min_y() const
+ {
+ return m_outline.min_y();
+ }
+ int max_x() const
+ {
+ return m_outline.max_x();
+ }
+ int max_y() const
+ {
+ return m_outline.max_y();
+ }
+ void reset()
+ {
+ m_outline.reset();
+ m_status = status_initial;
+ }
+ void clip_box(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2)
+ {
+ m_clip_box = rect(poly_coord(x1), poly_coord(y1),
+ poly_coord(x2), poly_coord(y2));
+ m_clip_box.normalize();
+ m_clipping = true;
+ }
+ void add_vertex(FX_FLOAT x, FX_FLOAT y, unsigned cmd)
+ {
+ if(is_close(cmd)) {
+ close_polygon();
+ } else {
+ if(is_move_to(cmd)) {
+ move_to(poly_coord(x), poly_coord(y));
+ } else {
+ if(is_vertex(cmd)) {
+ line_to(poly_coord(x), poly_coord(y));
+ }
+ }
+ }
+ }
+ void move_to(int x, int y)
+ {
+ if(m_clipping) {
+ if(m_outline.sorted()) {
+ reset();
+ }
+ if(m_status == status_line_to) {
+ close_polygon();
+ }
+ m_prev_x = m_start_x = x;
+ m_prev_y = m_start_y = y;
+ m_status = status_initial;
+ m_prev_flags = clipping_flags(x, y, m_clip_box);
+ if(m_prev_flags == 0) {
+ move_to_no_clip(x, y);
+ }
+ } else {
+ move_to_no_clip(x, y);
+ }
+ }
+ void line_to(int x, int y)
+ {
+ if(m_clipping) {
+ clip_segment(x, y);
+ } else {
+ line_to_no_clip(x, y);
+ }
+ }
+ void close_polygon()
+ {
+ if (m_status != status_line_to) {
+ return;
+ }
+ if(m_clipping) {
+ clip_segment(m_start_x, m_start_y);
+ }
+ close_polygon_no_clip();
+ }
+ AGG_INLINE unsigned calculate_alpha(int area, bool no_smooth) const
+ {
+ int cover = area >> (poly_base_shift * 2 + 1 - 8);
+ if(cover < 0) {
+ cover = -cover;
+ }
+ if(m_filling_rule == fill_even_odd) {
+ cover &= aa_2mask;
+ if(cover > aa_num) {
+ cover = aa_2num - cover;
+ }
+ }
+ if (no_smooth) {
+ cover = cover > aa_mask / 2 ? aa_mask : 0;
+ }
+ if(cover > aa_mask) {
+ cover = aa_mask;
+ }
+ return cover;
+ }
+ AGG_INLINE void sort()
+ {
+ m_outline.sort_cells();
+ }
+ AGG_INLINE bool rewind_scanlines()
+ {
+ close_polygon();
+ m_outline.sort_cells();
+ if(m_outline.total_cells() == 0) {
+ return false;
+ }
+ m_cur_y = m_outline.min_y();
+ return true;
+ }
+ AGG_INLINE bool navigate_scanline(int y)
+ {
+ close_polygon();
+ m_outline.sort_cells();
+ if(m_outline.total_cells() == 0 ||
+ y < m_outline.min_y() ||
+ y > m_outline.max_y()) {
+ return false;
+ }
+ m_cur_y = y;
+ return true;
+ }
+ template<class Scanline> bool sweep_scanline(Scanline& sl, bool no_smooth)
+ {
+ for(;;) {
+ if(m_cur_y > m_outline.max_y()) {
+ return false;
+ }
+ sl.reset_spans();
+ unsigned num_cells = m_outline.scanline_num_cells(m_cur_y);
+ const cell_aa* const* cells = m_outline.scanline_cells(m_cur_y);
+ int cover = 0;
+ while(num_cells) {
+ const cell_aa* cur_cell = *cells;
+ int x = cur_cell->x;
+ int area = cur_cell->area;
+ unsigned alpha;
+ cover += cur_cell->cover;
+ while(--num_cells) {
+ cur_cell = *++cells;
+ if(cur_cell->x != x) {
+ break;
+ }
+ area += cur_cell->area;
+ cover += cur_cell->cover;
+ }
+ if(area) {
+ alpha = calculate_alpha((cover << (poly_base_shift + 1)) - area, no_smooth);
+ if(alpha) {
+ sl.add_cell(x, alpha);
+ }
+ x++;
+ }
+ if(num_cells && cur_cell->x > x) {
+ alpha = calculate_alpha(cover << (poly_base_shift + 1), no_smooth);
+ if(alpha) {
+ sl.add_span(x, cur_cell->x - x, alpha);
+ }
+ }
+ }
+ if(sl.num_spans()) {
+ break;
+ }
+ ++m_cur_y;
+ }
+ sl.finalize(m_cur_y);
+ ++m_cur_y;
+ return true;
+ }
+ template<class VertexSource>
+ void add_path(VertexSource& vs, unsigned path_id = 0)
+ {
+ FX_FLOAT x;
+ FX_FLOAT y;
+ unsigned cmd;
+ vs.rewind(path_id);
+ while(!is_stop(cmd = vs.vertex(&x, &y))) {
+ add_vertex(x, y, cmd);
+ }
+ }
+ template<class VertexSource>
+ void add_path_transformed(VertexSource& vs, const CFX_AffineMatrix* pMatrix, unsigned path_id = 0)
+ {
+ FX_FLOAT x;
+ FX_FLOAT y;
+ unsigned cmd;
+ vs.rewind(path_id);
+ while(!is_stop(cmd = vs.vertex(&x, &y))) {
+ if (pMatrix) {
+ pMatrix->Transform(x, y);
+ }
+ add_vertex(x, y, cmd);
+ }
+ }
+private:
+ rasterizer_scanline_aa(const rasterizer_scanline_aa&);
+ const rasterizer_scanline_aa&
+ operator = (const rasterizer_scanline_aa&);
+ void move_to_no_clip(int x, int y)
+ {
+ if(m_status == status_line_to) {
+ close_polygon_no_clip();
+ }
+ m_outline.move_to(x * 1, y);
+ m_clipped_start_x = x;
+ m_clipped_start_y = y;
+ m_status = status_line_to;
+ }
+ void line_to_no_clip(int x, int y)
+ {
+ if(m_status != status_initial) {
+ m_outline.line_to(x * 1, y);
+ m_status = status_line_to;
+ }
+ }
+ void close_polygon_no_clip()
+ {
+ if(m_status == status_line_to) {
+ m_outline.line_to(m_clipped_start_x * 1, m_clipped_start_y);
+ m_status = status_closed;
+ }
+ }
+ void clip_segment(int x, int y)
+ {
+ unsigned flags = clipping_flags(x, y, m_clip_box);
+ if(m_prev_flags == flags) {
+ if(flags == 0) {
+ if(m_status == status_initial) {
+ move_to_no_clip(x, y);
+ } else {
+ line_to_no_clip(x, y);
+ }
+ }
+ } else {
+ int cx[4];
+ int cy[4];
+ unsigned n = clip_liang_barsky(m_prev_x, m_prev_y,
+ x, y,
+ m_clip_box,
+ cx, cy);
+ const int* px = cx;
+ const int* py = cy;
+ while(n--) {
+ if(m_status == status_initial) {
+ move_to_no_clip(*px++, *py++);
+ } else {
+ line_to_no_clip(*px++, *py++);
+ }
+ }
+ }
+ m_prev_flags = flags;
+ m_prev_x = x;
+ m_prev_y = y;
+ }
+private:
+ outline_aa m_outline;
+ filling_rule_e m_filling_rule;
+ int m_clipped_start_x;
+ int m_clipped_start_y;
+ int m_start_x;
+ int m_start_y;
+ int m_prev_x;
+ int m_prev_y;
+ unsigned m_prev_flags;
+ unsigned m_status;
+ rect m_clip_box;
+ bool m_clipping;
+ int m_cur_y;
+};
+}
+#endif
diff --git a/core/src/fxge/agg/agg23/agg_render_scanlines.h b/core/src/fxge/agg/agg23/agg_render_scanlines.h
new file mode 100644
index 0000000000..0dfd6d259f
--- /dev/null
+++ b/core/src/fxge/agg/agg23/agg_render_scanlines.h
@@ -0,0 +1,50 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+// mcseemagg@yahoo.com
+// http://www.antigrain.com
+//----------------------------------------------------------------------------
+#ifndef AGG_RENDER_SCANLINES_INCLUDED
+#define AGG_RENDER_SCANLINES_INCLUDED
+#include "agg_basics.h"
+namespace agg
+{
+template<class Rasterizer, class Scanline, class Renderer>
+void render_scanlines(Rasterizer& ras, Scanline& sl, Renderer& ren, bool no_smooth)
+{
+ if(ras.rewind_scanlines()) {
+ sl.reset(ras.min_x(), ras.max_x());
+ ren.prepare(unsigned(ras.max_x() - ras.min_x() + 2));
+ while(ras.sweep_scanline(sl, no_smooth)) {
+ ren.render(sl);
+ }
+ }
+}
+template<class Rasterizer, class Scanline, class Renderer,
+ class VertexSource, class ColorStorage, class PathId>
+void render_all_paths(Rasterizer& ras,
+ Scanline& sl,
+ Renderer& r,
+ VertexSource& vs,
+ const ColorStorage& as,
+ const PathId& path_id,
+ unsigned num_paths)
+{
+ for(unsigned i = 0; i < num_paths; i++) {
+ ras.reset();
+ ras.add_path(vs, path_id[i]);
+ r.color(as[i]);
+ render_scanlines(ras, sl, r);
+ }
+}
+}
+#endif
diff --git a/core/src/fxge/agg/agg23/agg_renderer_base.h b/core/src/fxge/agg/agg23/agg_renderer_base.h
new file mode 100644
index 0000000000..3e20a6d408
--- /dev/null
+++ b/core/src/fxge/agg/agg23/agg_renderer_base.h
@@ -0,0 +1,163 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+// mcseemagg@yahoo.com
+// http://www.antigrain.com
+//----------------------------------------------------------------------------
+//
+// class renderer_base
+//
+//----------------------------------------------------------------------------
+#ifndef AGG_RENDERER_BASE_INCLUDED
+#define AGG_RENDERER_BASE_INCLUDED
+#include "agg_basics.h"
+#include "agg_rendering_buffer.h"
+namespace agg
+{
+template<class PixelFormat> class renderer_base : public CFX_Object
+{
+public:
+ typedef PixelFormat pixfmt_type;
+ typedef typename pixfmt_type::color_type color_type;
+ typedef typename pixfmt_type::row_data row_data;
+ typedef typename pixfmt_type::span_data span_data;
+ renderer_base() : m_ren(0), m_clip_box(1, 1, 0, 0) {}
+ renderer_base(pixfmt_type& ren) :
+ m_ren(&ren),
+ m_clip_box(0, 0, ren.width() - 1, ren.height() - 1)
+ {}
+ void attach(pixfmt_type& ren)
+ {
+ m_ren = &ren;
+ m_clip_box = rect(0, 0, ren.width() - 1, ren.height() - 1);
+ }
+ const pixfmt_type& ren() const
+ {
+ return *m_ren;
+ }
+ pixfmt_type& ren()
+ {
+ return *m_ren;
+ }
+ unsigned width() const
+ {
+ return m_ren->width();
+ }
+ unsigned height() const
+ {
+ return m_ren->height();
+ }
+ void first_clip_box() {}
+ bool next_clip_box()
+ {
+ return false;
+ }
+ const rect& clip_box() const
+ {
+ return m_clip_box;
+ }
+ int xmin() const
+ {
+ return m_clip_box.x1;
+ }
+ int ymin() const
+ {
+ return m_clip_box.y1;
+ }
+ int xmax() const
+ {
+ return m_clip_box.x2;
+ }
+ int ymax() const
+ {
+ return m_clip_box.y2;
+ }
+ const rect& bounding_clip_box() const
+ {
+ return m_clip_box;
+ }
+ int bounding_xmin() const
+ {
+ return m_clip_box.x1;
+ }
+ int bounding_ymin() const
+ {
+ return m_clip_box.y1;
+ }
+ int bounding_xmax() const
+ {
+ return m_clip_box.x2;
+ }
+ int bounding_ymax() const
+ {
+ return m_clip_box.y2;
+ }
+ void blend_hline(int x1, int y, int x2,
+ const color_type& c, cover_type cover)
+ {
+ if(x1 > x2) {
+ int t = x2;
+ x2 = x1;
+ x1 = t;
+ }
+ if(y > ymax()) {
+ return;
+ }
+ if(y < ymin()) {
+ return;
+ }
+ if(x1 > xmax()) {
+ return;
+ }
+ if(x2 < xmin()) {
+ return;
+ }
+ if(x1 < xmin()) {
+ x1 = xmin();
+ }
+ if(x2 > xmax()) {
+ x2 = xmax();
+ }
+ m_ren->blend_hline(x1, y, x2 - x1 + 1, c, cover);
+ }
+ void blend_solid_hspan(int x, int y, int len,
+ const color_type& c,
+ const cover_type* covers)
+ {
+ if(y > ymax()) {
+ return;
+ }
+ if(y < ymin()) {
+ return;
+ }
+ if(x < xmin()) {
+ len -= xmin() - x;
+ if(len <= 0) {
+ return;
+ }
+ covers += xmin() - x;
+ x = xmin();
+ }
+ if(x + len > xmax()) {
+ len = xmax() - x + 1;
+ if(len <= 0) {
+ return;
+ }
+ }
+ m_ren->blend_solid_hspan(x, y, len, c, covers);
+ }
+private:
+ pixfmt_type* m_ren;
+ rect m_clip_box;
+};
+}
+#endif
diff --git a/core/src/fxge/agg/agg23/agg_renderer_scanline.h b/core/src/fxge/agg/agg23/agg_renderer_scanline.h
new file mode 100644
index 0000000000..b02b6b5f66
--- /dev/null
+++ b/core/src/fxge/agg/agg23/agg_renderer_scanline.h
@@ -0,0 +1,93 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+// mcseemagg@yahoo.com
+// http://www.antigrain.com
+//----------------------------------------------------------------------------
+#ifndef AGG_RENDERER_SCANLINE_INCLUDED
+#define AGG_RENDERER_SCANLINE_INCLUDED
+#include "agg_basics.h"
+#include "agg_renderer_base.h"
+#include "agg_render_scanlines.h"
+namespace agg
+{
+template<class BaseRenderer, class SpanGenerator> class renderer_scanline_aa : public CFX_Object
+{
+public:
+ typedef BaseRenderer base_ren_type;
+ typedef SpanGenerator span_gen_type;
+ renderer_scanline_aa() : m_ren(0), m_span_gen(0) {}
+ renderer_scanline_aa(base_ren_type& ren, span_gen_type& span_gen) :
+ m_ren(&ren),
+ m_span_gen(&span_gen)
+ {}
+ void attach(base_ren_type& ren, span_gen_type& span_gen)
+ {
+ m_ren = &ren;
+ m_span_gen = &span_gen;
+ }
+ void prepare(unsigned max_span_len)
+ {
+ m_span_gen->prepare(max_span_len);
+ }
+ template<class Scanline> void render(const Scanline& sl)
+ {
+ int y = sl.y();
+ m_ren->first_clip_box();
+ do {
+ int xmin = m_ren->xmin();
+ int xmax = m_ren->xmax();
+ if(y >= m_ren->ymin() && y <= m_ren->ymax()) {
+ unsigned num_spans = sl.num_spans();
+ typename Scanline::const_iterator span = sl.begin();
+ for(;;) {
+ int x = span->x;
+ int len = span->len;
+ bool solid = false;
+ const typename Scanline::cover_type* covers = span->covers;
+ if(len < 0) {
+ solid = true;
+ len = -len;
+ }
+ if(x < xmin) {
+ len -= xmin - x;
+ if(!solid) {
+ covers += xmin - x;
+ }
+ x = xmin;
+ }
+ if(len > 0) {
+ if(x + len > xmax) {
+ len = xmax - x + 1;
+ }
+ if(len > 0) {
+ m_ren->blend_color_hspan_no_clip(
+ x, y, len,
+ m_span_gen->generate(x, y, len),
+ solid ? 0 : covers,
+ *covers);
+ }
+ }
+ if(--num_spans == 0) {
+ break;
+ }
+ ++span;
+ }
+ }
+ } while(m_ren->next_clip_box());
+ }
+private:
+ base_ren_type* m_ren;
+ SpanGenerator* m_span_gen;
+};
+}
+#endif
diff --git a/core/src/fxge/agg/agg23/agg_rendering_buffer.h b/core/src/fxge/agg/agg23/agg_rendering_buffer.h
new file mode 100644
index 0000000000..5a8681b537
--- /dev/null
+++ b/core/src/fxge/agg/agg23/agg_rendering_buffer.h
@@ -0,0 +1,145 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+// mcseemagg@yahoo.com
+// http://www.antigrain.com
+//----------------------------------------------------------------------------
+//
+// class rendering_buffer
+//
+//----------------------------------------------------------------------------
+#ifndef AGG_RENDERING_BUFFER_INCLUDED
+#define AGG_RENDERING_BUFFER_INCLUDED
+#include "agg_basics.h"
+namespace agg
+{
+class rendering_buffer : public CFX_Object
+{
+public:
+ struct row_data : public CFX_Object {
+ int x1, x2;
+ const int8u* ptr;
+ row_data() {}
+ row_data(int x1_, int x2_, const int8u* ptr_) :
+ x1(x1_), x2(x2_), ptr(ptr_) {}
+ };
+ struct span_data : public CFX_Object {
+ int x;
+ unsigned len;
+ int8u* ptr;
+ span_data() {}
+ span_data(int) : x(0), len(0), ptr(0) {}
+ span_data(int x_, unsigned len_, int8u* ptr_) :
+ x(x_), len(len_), ptr(ptr_) {}
+ };
+ ~rendering_buffer()
+ {
+ FX_Free(m_rows);
+ }
+ rendering_buffer() :
+ m_buf(0),
+ m_rows(0),
+ m_width(0),
+ m_height(0),
+ m_stride(0),
+ m_max_height(0)
+ {
+ }
+ rendering_buffer(int8u* buf, unsigned width, unsigned height, int stride) :
+ m_buf(0),
+ m_rows(0),
+ m_width(0),
+ m_height(0),
+ m_stride(0),
+ m_max_height(0)
+ {
+ attach(buf, width, height, stride);
+ }
+ void attach(int8u* buf, unsigned width, unsigned height, int stride)
+ {
+ m_buf = buf;
+ m_width = width;
+ m_height = height;
+ m_stride = stride;
+ if(height > m_max_height) {
+ FX_Free(m_rows);
+ m_rows = FX_Alloc(int8u*, m_max_height = height);
+ }
+ int8u* row_ptr = m_buf;
+ if(stride < 0) {
+ row_ptr = m_buf - int(height - 1) * stride;
+ }
+ int8u** rows = m_rows;
+ while(height--) {
+ *rows++ = row_ptr;
+ row_ptr += stride;
+ }
+ }
+ int8u* buf()
+ {
+ return m_buf;
+ }
+ const int8u* buf() const
+ {
+ return m_buf;
+ }
+ unsigned width() const
+ {
+ return m_width;
+ }
+ unsigned height() const
+ {
+ return m_height;
+ }
+ int stride() const
+ {
+ return m_stride;
+ }
+ unsigned stride_abs() const
+ {
+ return (m_stride < 0) ?
+ unsigned(-m_stride) :
+ unsigned(m_stride);
+ }
+ int8u* row(unsigned y)
+ {
+ return m_rows[y];
+ }
+ const int8u* row(unsigned y) const
+ {
+ return m_rows[y];
+ }
+ int8u* next_row(void* p)
+ {
+ return (int8u*)p + m_stride;
+ }
+ const int8u* next_row(const void* p) const
+ {
+ return (int8u*)p + m_stride;
+ }
+ int8u const* const* rows() const
+ {
+ return m_rows;
+ }
+private:
+ rendering_buffer(const rendering_buffer&);
+ const rendering_buffer& operator = (const rendering_buffer&);
+private:
+ int8u* m_buf;
+ int8u** m_rows;
+ unsigned m_width;
+ unsigned m_height;
+ int m_stride;
+ unsigned m_max_height;
+};
+}
+#endif
diff --git a/core/src/fxge/agg/agg23/agg_scanline_u.h b/core/src/fxge/agg/agg23/agg_scanline_u.h
new file mode 100644
index 0000000000..f99feef91c
--- /dev/null
+++ b/core/src/fxge/agg/agg23/agg_scanline_u.h
@@ -0,0 +1,150 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+// mcseemagg@yahoo.com
+// http://www.antigrain.com
+//----------------------------------------------------------------------------
+//
+// Adaptation for 32-bit screen coordinates (scanline32_u) has been sponsored by
+// Liberty Technology Systems, Inc., visit http://lib-sys.com
+//
+// Liberty Technology Systems, Inc. is the provider of
+// PostScript and PDF technology for software developers.
+//
+//----------------------------------------------------------------------------
+#ifndef AGG_SCANLINE_U_INCLUDED
+#define AGG_SCANLINE_U_INCLUDED
+#include "agg_array.h"
+namespace agg
+{
+template<class CoverT> class scanline_u : public CFX_Object
+{
+public:
+ typedef scanline_u<CoverT> self_type;
+ typedef CoverT cover_type;
+ typedef int16 coord_type;
+ struct span : public CFX_Object {
+ coord_type x;
+ coord_type len;
+ cover_type* covers;
+ };
+ typedef span* iterator;
+ typedef const span* const_iterator;
+ ~scanline_u()
+ {
+ FX_Free(m_spans);
+ FX_Free(m_covers);
+ }
+ scanline_u() :
+ m_min_x(0),
+ m_max_len(0),
+ m_last_x(0x7FFFFFF0),
+ m_covers(0),
+ m_spans(0),
+ m_cur_span(0)
+ {}
+ void reset(int min_x, int max_x)
+ {
+ unsigned max_len = max_x - min_x + 2;
+ if(max_len > m_max_len) {
+ FX_Free(m_spans);
+ FX_Free(m_covers);
+ m_covers = FX_Alloc( cover_type , max_len);
+ m_spans = FX_Alloc( span , max_len);
+ m_max_len = max_len;
+ }
+ m_last_x = 0x7FFFFFF0;
+ m_min_x = min_x;
+ m_cur_span = m_spans;
+ }
+ void add_cell(int x, unsigned cover)
+ {
+ x -= m_min_x;
+ m_covers[x] = (cover_type)cover;
+ if(x == m_last_x + 1) {
+ m_cur_span->len++;
+ } else {
+ m_cur_span++;
+ m_cur_span->x = (coord_type)(x + m_min_x);
+ m_cur_span->len = 1;
+ m_cur_span->covers = m_covers + x;
+ }
+ m_last_x = x;
+ }
+ void add_cells(int x, unsigned len, const CoverT* covers)
+ {
+ x -= m_min_x;
+ FXSYS_memcpy(m_covers + x, covers, len * sizeof(CoverT));
+ if(x == m_last_x + 1) {
+ m_cur_span->len += (coord_type)len;
+ } else {
+ m_cur_span++;
+ m_cur_span->x = (coord_type)(x + m_min_x);
+ m_cur_span->len = (coord_type)len;
+ m_cur_span->covers = m_covers + x;
+ }
+ m_last_x = x + len - 1;
+ }
+ void add_span(int x, unsigned len, unsigned cover)
+ {
+ x -= m_min_x;
+ FXSYS_memset8(m_covers + x, cover, len);
+ if(x == m_last_x + 1) {
+ m_cur_span->len += (coord_type)len;
+ } else {
+ m_cur_span++;
+ m_cur_span->x = (coord_type)(x + m_min_x);
+ m_cur_span->len = (coord_type)len;
+ m_cur_span->covers = m_covers + x;
+ }
+ m_last_x = x + len - 1;
+ }
+ void finalize(int y)
+ {
+ m_y = y;
+ }
+ void reset_spans()
+ {
+ m_last_x = 0x7FFFFFF0;
+ m_cur_span = m_spans;
+ }
+ int y() const
+ {
+ return m_y;
+ }
+ unsigned num_spans() const
+ {
+ return unsigned(m_cur_span - m_spans);
+ }
+ const_iterator begin() const
+ {
+ return m_spans + 1;
+ }
+ iterator begin()
+ {
+ return m_spans + 1;
+ }
+private:
+ scanline_u(const self_type&);
+ const self_type& operator = (const self_type&);
+private:
+ int m_min_x;
+ unsigned m_max_len;
+ int m_last_x;
+ int m_y;
+ cover_type* m_covers;
+ span* m_spans;
+ span* m_cur_span;
+};
+typedef scanline_u<int8u> scanline_u8;
+}
+#endif
diff --git a/core/src/fxge/agg/agg23/agg_shorten_path.h b/core/src/fxge/agg/agg23/agg_shorten_path.h
new file mode 100644
index 0000000000..d7eb4be018
--- /dev/null
+++ b/core/src/fxge/agg/agg23/agg_shorten_path.h
@@ -0,0 +1,57 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+// mcseemagg@yahoo.com
+// http://www.antigrain.com
+//----------------------------------------------------------------------------
+#ifndef AGG_SHORTEN_PATH_INCLUDED
+#define AGG_SHORTEN_PATH_INCLUDED
+#include "agg_basics.h"
+#include "agg_vertex_sequence.h"
+namespace agg
+{
+template<class VertexSequence>
+void shorten_path(VertexSequence& vs, FX_FLOAT s, unsigned closed = 0)
+{
+ typedef typename VertexSequence::value_type vertex_type;
+ if(s > 0 && vs.size() > 1) {
+ FX_FLOAT d;
+ int n = int(vs.size() - 2);
+ while(n) {
+ d = vs[n].dist;
+ if(d > s) {
+ break;
+ }
+ vs.remove_last();
+ s -= d;
+ --n;
+ }
+ if(vs.size() < 2) {
+ vs.remove_all();
+ } else {
+ n = vs.size() - 1;
+ vertex_type& prev = vs[n - 1];
+ vertex_type& last = vs[n];
+ d = (prev.dist - s) / prev.dist;
+ FX_FLOAT x = prev.x + (last.x - prev.x) * d;
+ FX_FLOAT y = prev.y + (last.y - prev.y) * d;
+ last.x = x;
+ last.y = y;
+ if(!prev(last)) {
+ vs.remove_last();
+ }
+ vs.close(closed != 0);
+ }
+ }
+}
+}
+#endif
diff --git a/core/src/fxge/agg/agg23/agg_vcgen_dash.h b/core/src/fxge/agg/agg23/agg_vcgen_dash.h
new file mode 100644
index 0000000000..961da2d718
--- /dev/null
+++ b/core/src/fxge/agg/agg23/agg_vcgen_dash.h
@@ -0,0 +1,75 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+// mcseemagg@yahoo.com
+// http://www.antigrain.com
+//----------------------------------------------------------------------------
+//
+// Line dash generator
+//
+//----------------------------------------------------------------------------
+#ifndef AGG_VCGEN_DASH_INCLUDED
+#define AGG_VCGEN_DASH_INCLUDED
+#include "agg_basics.h"
+#include "agg_vertex_sequence.h"
+namespace agg
+{
+class vcgen_dash : public CFX_Object
+{
+ enum max_dashes_e {
+ max_dashes = 32
+ };
+ enum status_e {
+ initial,
+ ready,
+ polyline,
+ stop
+ };
+public:
+ typedef vertex_sequence<vertex_dist, 6> vertex_storage;
+ vcgen_dash();
+ void remove_all_dashes();
+ void add_dash(FX_FLOAT dash_len, FX_FLOAT gap_len);
+ void dash_start(FX_FLOAT ds);
+ void shorten(FX_FLOAT s)
+ {
+ m_shorten = s;
+ }
+ double shorten() const
+ {
+ return m_shorten;
+ }
+ void remove_all();
+ void add_vertex(FX_FLOAT x, FX_FLOAT y, unsigned cmd);
+ void rewind(unsigned path_id);
+ unsigned vertex(FX_FLOAT* x, FX_FLOAT* y);
+private:
+ vcgen_dash(const vcgen_dash&);
+ const vcgen_dash& operator = (const vcgen_dash&);
+ void calc_dash_start(FX_FLOAT ds);
+ FX_FLOAT m_dashes[max_dashes];
+ FX_FLOAT m_total_dash_len;
+ unsigned m_num_dashes;
+ FX_FLOAT m_dash_start;
+ FX_FLOAT m_shorten;
+ FX_FLOAT m_curr_dash_start;
+ unsigned m_curr_dash;
+ FX_FLOAT m_curr_rest;
+ const vertex_dist* m_v1;
+ const vertex_dist* m_v2;
+ vertex_storage m_src_vertices;
+ unsigned m_closed;
+ status_e m_status;
+ unsigned m_src_vertex;
+};
+}
+#endif
diff --git a/core/src/fxge/agg/agg23/agg_vcgen_stroke.h b/core/src/fxge/agg/agg23/agg_vcgen_stroke.h
new file mode 100644
index 0000000000..38fe1fc25d
--- /dev/null
+++ b/core/src/fxge/agg/agg23/agg_vcgen_stroke.h
@@ -0,0 +1,120 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+// mcseemagg@yahoo.com
+// http://www.antigrain.com
+//----------------------------------------------------------------------------
+#ifndef AGG_VCGEN_STROKE_INCLUDED
+#define AGG_VCGEN_STROKE_INCLUDED
+#include "agg_math_stroke.h"
+namespace agg
+{
+class vcgen_stroke : public CFX_Object
+{
+ enum status_e {
+ initial,
+ ready,
+ cap1,
+ cap2,
+ outline1,
+ close_first,
+ outline2,
+ out_vertices,
+ end_poly1,
+ end_poly2,
+ stop
+ };
+public:
+ typedef vertex_sequence<vertex_dist_cmd, 6> vertex_storage;
+ typedef pod_deque<point_type, 6> coord_storage;
+ vcgen_stroke();
+ void line_cap(line_cap_e lc)
+ {
+ m_line_cap = lc;
+ }
+ void line_join(line_join_e lj)
+ {
+ m_line_join = lj;
+ }
+ void inner_join(inner_join_e ij)
+ {
+ m_inner_join = ij;
+ }
+ line_cap_e line_cap() const
+ {
+ return m_line_cap;
+ }
+ line_join_e line_join() const
+ {
+ return m_line_join;
+ }
+ inner_join_e inner_join() const
+ {
+ return m_inner_join;
+ }
+ void width(FX_FLOAT w)
+ {
+ m_width = w / 2;
+ }
+ void miter_limit(FX_FLOAT ml)
+ {
+ m_miter_limit = ml;
+ }
+ void miter_limit_theta(FX_FLOAT t);
+ void inner_miter_limit(FX_FLOAT ml)
+ {
+ m_inner_miter_limit = ml;
+ }
+ void approximation_scale(FX_FLOAT as)
+ {
+ m_approx_scale = as;
+ }
+ FX_FLOAT width() const
+ {
+ return m_width * 2;
+ }
+ FX_FLOAT miter_limit() const
+ {
+ return m_miter_limit;
+ }
+ FX_FLOAT inner_miter_limit() const
+ {
+ return m_inner_miter_limit;
+ }
+ FX_FLOAT approximation_scale() const
+ {
+ return m_approx_scale;
+ }
+ void remove_all();
+ void add_vertex(FX_FLOAT x, FX_FLOAT y, unsigned cmd);
+ void rewind(unsigned path_id);
+ unsigned vertex(FX_FLOAT* x, FX_FLOAT* y);
+private:
+ vcgen_stroke(const vcgen_stroke&);
+ const vcgen_stroke& operator = (const vcgen_stroke&);
+ vertex_storage m_src_vertices;
+ coord_storage m_out_vertices;
+ FX_FLOAT m_width;
+ FX_FLOAT m_miter_limit;
+ FX_FLOAT m_inner_miter_limit;
+ FX_FLOAT m_approx_scale;
+ line_cap_e m_line_cap;
+ line_join_e m_line_join;
+ inner_join_e m_inner_join;
+ unsigned m_closed;
+ status_e m_status;
+ status_e m_prev_status;
+ unsigned m_src_vertex;
+ unsigned m_out_vertex;
+};
+}
+#endif
diff --git a/core/src/fxge/agg/agg23/agg_vertex_sequence.h b/core/src/fxge/agg/agg23/agg_vertex_sequence.h
new file mode 100644
index 0000000000..29486d4787
--- /dev/null
+++ b/core/src/fxge/agg/agg23/agg_vertex_sequence.h
@@ -0,0 +1,100 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+// mcseemagg@yahoo.com
+// http://www.antigrain.com
+//----------------------------------------------------------------------------
+//
+// vertex_sequence container and vertex_dist struct
+//
+//----------------------------------------------------------------------------
+#ifndef AGG_VERTEX_SEQUENCE_INCLUDED
+#define AGG_VERTEX_SEQUENCE_INCLUDED
+#include "agg_basics.h"
+#include "agg_array.h"
+#include "agg_math.h"
+namespace agg
+{
+template<class T, unsigned S = 6>
+class vertex_sequence : public pod_deque<T, S>
+{
+public:
+ typedef pod_deque<T, S> base_type;
+ void add(const T& val);
+ void modify_last(const T& val);
+ void close(bool remove_flag);
+};
+template<class T, unsigned S>
+void vertex_sequence<T, S>::add(const T& val)
+{
+ if(base_type::size() > 1) {
+ if(!(*this)[base_type::size() - 2]((*this)[base_type::size() - 1])) {
+ base_type::remove_last();
+ }
+ }
+ base_type::add(val);
+}
+template<class T, unsigned S>
+void vertex_sequence<T, S>::modify_last(const T& val)
+{
+ base_type::remove_last();
+ add(val);
+}
+template<class T, unsigned S>
+void vertex_sequence<T, S>::close(bool closed)
+{
+ while(base_type::size() > 1) {
+ if((*this)[base_type::size() - 2]((*this)[base_type::size() - 1])) {
+ break;
+ }
+ T t = (*this)[base_type::size() - 1];
+ base_type::remove_last();
+ modify_last(t);
+ }
+ if(closed) {
+ while(base_type::size() > 1) {
+ if((*this)[base_type::size() - 1]((*this)[0])) {
+ break;
+ }
+ base_type::remove_last();
+ }
+ }
+}
+const FX_FLOAT vertex_dist_epsilon = 1e-14f;
+struct vertex_dist : public CFX_Object {
+ FX_FLOAT x;
+ FX_FLOAT y;
+ FX_FLOAT dist;
+ vertex_dist() {}
+ vertex_dist(FX_FLOAT x_, FX_FLOAT y_) :
+ x(x_),
+ y(y_),
+ dist(0)
+ {
+ }
+ bool operator () (const vertex_dist& val)
+ {
+ bool ret = (dist = calc_distance(x, y, val.x, val.y)) > vertex_dist_epsilon;
+ return ret;
+ }
+};
+struct vertex_dist_cmd : public vertex_dist {
+ unsigned cmd;
+ vertex_dist_cmd() {}
+ vertex_dist_cmd(FX_FLOAT x_, FX_FLOAT y_, unsigned cmd_) :
+ vertex_dist(x_, y_),
+ cmd(cmd_)
+ {
+ }
+};
+}
+#endif
diff --git a/core/src/fxge/agg/agg23/fx_agg_curves.cpp b/core/src/fxge/agg/agg23/fx_agg_curves.cpp
new file mode 100644
index 0000000000..861320ee70
--- /dev/null
+++ b/core/src/fxge/agg/agg23/fx_agg_curves.cpp
@@ -0,0 +1,109 @@
+
+//----------------------------------------------------------------------------
+// XYQ: 2006-01-22 Copied from AGG project.
+// TODO: This file uses intensive floating point operations, so it's NOT suitable
+// for platforms like Symbian OS. We need to change to FIX format.
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+// mcseemagg@yahoo.com
+// http://www.antigrain.com
+//----------------------------------------------------------------------------
+#include "../../../../include/fxcrt/fx_basic.h"
+#include "agg_curves.h"
+#include "agg_math.h"
+namespace agg
+{
+const FX_FLOAT curve_collinearity_epsilon = 1e-30f;
+enum curve_recursion_limit_e { curve_recursion_limit = 16 };
+void curve4_div::init(FX_FLOAT x1, FX_FLOAT y1,
+ FX_FLOAT x2, FX_FLOAT y2,
+ FX_FLOAT x3, FX_FLOAT y3,
+ FX_FLOAT x4, FX_FLOAT y4)
+{
+ m_points.remove_all();
+ m_distance_tolerance_square = 1.0f / 4;
+ m_distance_tolerance_manhattan = 1.0f * 4;
+ bezier(x1, y1, x2, y2, x3, y3, x4, y4);
+ m_count = 0;
+}
+void curve4_div::recursive_bezier(FX_FLOAT x1, FX_FLOAT y1,
+ FX_FLOAT x2, FX_FLOAT y2,
+ FX_FLOAT x3, FX_FLOAT y3,
+ FX_FLOAT x4, FX_FLOAT y4,
+ unsigned level)
+{
+ if(level > curve_recursion_limit) {
+ return;
+ }
+ FX_FLOAT x12 = (x1 + x2) / 2;
+ FX_FLOAT y12 = (y1 + y2) / 2;
+ FX_FLOAT x23 = (x2 + x3) / 2;
+ FX_FLOAT y23 = (y2 + y3) / 2;
+ FX_FLOAT x34 = (x3 + x4) / 2;
+ FX_FLOAT y34 = (y3 + y4) / 2;
+ FX_FLOAT x123 = (x12 + x23) / 2;
+ FX_FLOAT y123 = (y12 + y23) / 2;
+ FX_FLOAT x234 = (x23 + x34) / 2;
+ FX_FLOAT y234 = (y23 + y34) / 2;
+ FX_FLOAT x1234 = (x123 + x234) / 2;
+ FX_FLOAT y1234 = (y123 + y234) / 2;
+ FX_FLOAT dx = x4 - x1;
+ FX_FLOAT dy = y4 - y1;
+ FX_FLOAT d2 = FXSYS_fabs(FXSYS_Mul(x2 - x4, dy) - FXSYS_Mul(y2 - y4, dx));
+ FX_FLOAT d3 = FXSYS_fabs(FXSYS_Mul(x3 - x4, dy) - FXSYS_Mul(y3 - y4, dx));
+ switch((int(d2 > curve_collinearity_epsilon) << 1) +
+ int(d3 > curve_collinearity_epsilon)) {
+ case 0:
+ if(FXSYS_fabs(x1 + x3 - x2 - x2) +
+ FXSYS_fabs(y1 + y3 - y2 - y2) +
+ FXSYS_fabs(x2 + x4 - x3 - x3) +
+ FXSYS_fabs(y2 + y4 - y3 - y3) <= m_distance_tolerance_manhattan) {
+ m_points.add(point_type(x1234, y1234, path_flags_jr));
+ return;
+ }
+ break;
+ case 1:
+ if(FXSYS_Mul(d3, d3) <= FXSYS_Mul(m_distance_tolerance_square,
+ FXSYS_Mul(dx, dx) + FXSYS_Mul(dy, dy))) {
+ m_points.add(point_type(x23, y23, path_flags_jr));
+ return;
+ }
+ break;
+ case 2:
+ if(FXSYS_Mul(d2, d2) <= FXSYS_Mul(m_distance_tolerance_square,
+ FXSYS_Mul(dx, dx) + FXSYS_Mul(dy, dy))) {
+ m_points.add(point_type(x23, y23, path_flags_jr));
+ return;
+ }
+ break;
+ case 3:
+ if(FXSYS_Mul(d2 + d3, d2 + d3) <= FXSYS_Mul(m_distance_tolerance_square,
+ FXSYS_Mul(dx, dx) + FXSYS_Mul(dy, dy))) {
+ m_points.add(point_type(x23, y23, path_flags_jr));
+ return;
+ }
+ break;
+ }
+ recursive_bezier(x1, y1, x12, y12, x123, y123, x1234, y1234, level + 1);
+ recursive_bezier(x1234, y1234, x234, y234, x34, y34, x4, y4, level + 1);
+}
+void curve4_div::bezier(FX_FLOAT x1, FX_FLOAT y1,
+ FX_FLOAT x2, FX_FLOAT y2,
+ FX_FLOAT x3, FX_FLOAT y3,
+ FX_FLOAT x4, FX_FLOAT y4)
+{
+ m_points.add(point_type(x1, y1));
+ recursive_bezier(x1, y1, x2, y2, x3, y3, x4, y4, 0);
+ m_points.add(point_type(x4, y4));
+}
+}
diff --git a/core/src/fxge/agg/agg23/fx_agg_driver.cpp b/core/src/fxge/agg/agg23/fx_agg_driver.cpp
new file mode 100644
index 0000000000..557f134205
--- /dev/null
+++ b/core/src/fxge/agg/agg23/fx_agg_driver.cpp
@@ -0,0 +1,1636 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../../include/fxge/fx_ge.h"
+#include "../../dib/dib_int.h"
+#include "../../ge/text_int.h"
+#include "../../../../include/fxcodec/fx_codec.h"
+#include "agg_pixfmt_gray.h"
+#include "agg_path_storage.h"
+#include "agg_scanline_u.h"
+#include "agg_rasterizer_scanline_aa.h"
+#include "agg_renderer_scanline.h"
+#include "agg_curves.h"
+#include "agg_conv_stroke.h"
+#include "agg_conv_dash.h"
+using namespace agg;
+#include "../include/fx_agg_driver.h"
+void _HardClip(FX_FLOAT& x, FX_FLOAT& y)
+{
+ if (x > 50000) {
+ x = 50000;
+ }
+ if (x < -50000) {
+ x = -50000;
+ }
+ if (y > 50000) {
+ y = 50000;
+ }
+ if (y < -50000) {
+ y = -50000;
+ }
+}
+void CAgg_PathData::BuildPath(const CFX_PathData* pPathData, const CFX_AffineMatrix* pObject2Device)
+{
+ int nPoints = pPathData->GetPointCount();
+ FX_PATHPOINT* pPoints = pPathData->GetPoints();
+ for (int i = 0; i < nPoints; i ++) {
+ FX_FLOAT x = pPoints[i].m_PointX, y = pPoints[i].m_PointY;
+ if (pObject2Device) {
+ pObject2Device->Transform(x, y);
+ }
+ _HardClip(x, y);
+ int point_type = pPoints[i].m_Flag & FXPT_TYPE;
+ if (point_type == FXPT_MOVETO) {
+ m_PathData.move_to(x, y);
+ } else if (point_type == FXPT_LINETO) {
+ if (pPoints[i - 1].m_Flag == FXPT_MOVETO && (i == nPoints - 1 || pPoints[i + 1].m_Flag == FXPT_MOVETO) &&
+ pPoints[i].m_PointX == pPoints[i - 1].m_PointX && pPoints[i].m_PointY == pPoints[i - 1].m_PointY) {
+ x += 1;
+ }
+ m_PathData.line_to(x, y);
+ } else if (point_type == FXPT_BEZIERTO) {
+ FX_FLOAT x0 = pPoints[i - 1].m_PointX, y0 = pPoints[i - 1].m_PointY;
+ FX_FLOAT x2 = pPoints[i + 1].m_PointX, y2 = pPoints[i + 1].m_PointY;
+ FX_FLOAT x3 = pPoints[i + 2].m_PointX, y3 = pPoints[i + 2].m_PointY;
+ if (pObject2Device) {
+ pObject2Device->Transform(x0, y0);
+ pObject2Device->Transform(x2, y2);
+ pObject2Device->Transform(x3, y3);
+ }
+ curve4 curve(x0, y0, x, y, x2, y2, x3, y3);
+ i += 2;
+ m_PathData.add_path_curve(curve);
+ }
+ if (pPoints[i].m_Flag & FXPT_CLOSEFIGURE) {
+ m_PathData.end_poly();
+ }
+ }
+}
+namespace agg
+{
+template<class BaseRenderer> class renderer_scanline_aa_offset
+{
+public:
+ typedef BaseRenderer base_ren_type;
+ typedef typename base_ren_type::color_type color_type;
+ renderer_scanline_aa_offset(base_ren_type& ren, unsigned left, unsigned top) :
+ m_ren(&ren), m_left(left), m_top(top)
+ {}
+ void color(const color_type& c)
+ {
+ m_color = c;
+ }
+ const color_type& color() const
+ {
+ return m_color;
+ }
+ void prepare(unsigned) {}
+ template<class Scanline> void render(const Scanline& sl)
+ {
+ int y = sl.y();
+ unsigned num_spans = sl.num_spans();
+ typename Scanline::const_iterator span = sl.begin();
+ for(;;) {
+ int x = span->x;
+ if(span->len > 0) {
+ m_ren->blend_solid_hspan(x - m_left, y - m_top, (unsigned)span->len,
+ m_color,
+ span->covers);
+ } else {
+ m_ren->blend_hline(x - m_left, y - m_top, (unsigned)(x - span->len - 1),
+ m_color,
+ *(span->covers));
+ }
+ if(--num_spans == 0) {
+ break;
+ }
+ ++span;
+ }
+ }
+private:
+ base_ren_type* m_ren;
+ color_type m_color;
+ unsigned m_left, m_top;
+};
+}
+static void RasterizeStroke(rasterizer_scanline_aa& rasterizer, path_storage& path_data,
+ const CFX_AffineMatrix* pObject2Device,
+ const CFX_GraphStateData* pGraphState, FX_FLOAT scale = 1.0f,
+ FX_BOOL bStrokeAdjust = FALSE, FX_BOOL bTextMode = FALSE)
+{
+ line_cap_e cap;
+ switch (pGraphState->m_LineCap) {
+ case CFX_GraphStateData::LineCapRound:
+ cap = round_cap;
+ break;
+ case CFX_GraphStateData::LineCapSquare:
+ cap = square_cap;
+ break;
+ default:
+ cap = butt_cap;
+ break;
+ }
+ line_join_e join;
+ switch (pGraphState->m_LineJoin) {
+ case CFX_GraphStateData::LineJoinRound:
+ join = round_join;
+ break;
+ case CFX_GraphStateData::LineJoinBevel:
+ join = bevel_join;
+ break;
+ default:
+ join = miter_join_revert;
+ break;
+ }
+ FX_FLOAT width = pGraphState->m_LineWidth * scale;
+ FX_FLOAT unit = 1.f;
+ if (pObject2Device) {
+ unit = FXSYS_Div(1.0f, (pObject2Device->GetXUnit() + pObject2Device->GetYUnit()) / 2);
+ }
+ if (width < unit) {
+ width = unit;
+ }
+ if (pGraphState->m_DashArray == NULL) {
+ conv_stroke<path_storage> stroke(path_data);
+ stroke.line_join(join);
+ stroke.line_cap(cap);
+ stroke.miter_limit(pGraphState->m_MiterLimit);
+ stroke.width(width);
+ rasterizer.add_path_transformed(stroke, pObject2Device);
+ } else {
+ typedef conv_dash<path_storage> dash_converter;
+ dash_converter dash(path_data);
+ for (int i = 0; i < (pGraphState->m_DashCount + 1) / 2; i ++) {
+ FX_FLOAT on = pGraphState->m_DashArray[i * 2];
+ if (on <= 0.000001f) {
+ on = 1.0f / 10;
+ }
+ FX_FLOAT off = i * 2 + 1 == pGraphState->m_DashCount ? on :
+ pGraphState->m_DashArray[i * 2 + 1];
+ if (off < 0) {
+ off = 0;
+ }
+ dash.add_dash(on * scale, off * scale);
+ }
+ dash.dash_start(pGraphState->m_DashPhase * scale);
+ typedef conv_stroke<dash_converter> dash_stroke;
+ dash_stroke stroke(dash);
+ stroke.line_join(join);
+ stroke.line_cap(cap);
+ stroke.miter_limit(pGraphState->m_MiterLimit);
+ stroke.width(width);
+ rasterizer.add_path_transformed(stroke, pObject2Device);
+ }
+}
+IFX_RenderDeviceDriver* IFX_RenderDeviceDriver::CreateFxgeDriver(CFX_DIBitmap* pBitmap, FX_BOOL bRgbByteOrder, CFX_DIBitmap* pOriDevice, FX_BOOL bGroupKnockout)
+{
+ return FX_NEW CFX_AggDeviceDriver(pBitmap, 0, bRgbByteOrder, pOriDevice, bGroupKnockout);
+}
+CFX_AggDeviceDriver::CFX_AggDeviceDriver(CFX_DIBitmap* pBitmap, int dither_bits, FX_BOOL bRgbByteOrder, CFX_DIBitmap* pOriDevice, FX_BOOL bGroupKnockout)
+{
+ m_pBitmap = pBitmap;
+ m_DitherBits = dither_bits;
+ m_pClipRgn = NULL;
+ m_pPlatformBitmap = NULL;
+ m_pPlatformGraphics = NULL;
+ m_pDwRenderTartget = NULL;
+ m_bRgbByteOrder = bRgbByteOrder;
+ m_pOriDevice = pOriDevice;
+ m_bGroupKnockout = bGroupKnockout;
+ m_FillFlags = 0;
+ InitPlatform();
+}
+CFX_AggDeviceDriver::~CFX_AggDeviceDriver()
+{
+ if (m_pClipRgn) {
+ delete m_pClipRgn;
+ }
+ for (int i = 0; i < m_StateStack.GetSize(); i ++)
+ if (m_StateStack[i]) {
+ delete (CFX_ClipRgn*)m_StateStack[i];
+ }
+ DestroyPlatform();
+}
+#if ((_FXM_PLATFORM_ != _FXM_PLATFORM_APPLE_)|| defined(_FPDFAPI_MINI_))
+void CFX_AggDeviceDriver::InitPlatform()
+{
+}
+void CFX_AggDeviceDriver::DestroyPlatform()
+{
+}
+FX_BOOL CFX_AggDeviceDriver::DrawDeviceText(int nChars, const FXTEXT_CHARPOS* pCharPos, CFX_Font* pFont,
+ CFX_FontCache* pCache, const CFX_AffineMatrix* pObject2Device, FX_FLOAT font_size, FX_DWORD color,
+ int alpha_flag, void* pIccTransform)
+{
+ return FALSE;
+}
+#endif
+int CFX_AggDeviceDriver::GetDeviceCaps(int caps_id)
+{
+ switch (caps_id) {
+ case FXDC_DEVICE_CLASS:
+ return FXDC_DISPLAY;
+ case FXDC_PIXEL_WIDTH:
+ return m_pBitmap->GetWidth();
+ case FXDC_PIXEL_HEIGHT:
+ return m_pBitmap->GetHeight();
+ case FXDC_BITS_PIXEL:
+ return m_pBitmap->GetBPP();
+ case FXDC_HORZ_SIZE:
+ case FXDC_VERT_SIZE:
+ return 0;
+ case FXDC_RENDER_CAPS: {
+ int flags = FXRC_GET_BITS | FXRC_ALPHA_PATH | FXRC_ALPHA_IMAGE | FXRC_BLEND_MODE | FXRC_SOFT_CLIP;
+ if (m_pBitmap->HasAlpha()) {
+ flags |= FXRC_ALPHA_OUTPUT;
+ } else if (m_pBitmap->IsAlphaMask()) {
+ if (m_pBitmap->GetBPP() == 1) {
+ flags |= FXRC_BITMASK_OUTPUT;
+ } else {
+ flags |= FXRC_BYTEMASK_OUTPUT;
+ }
+ }
+ if (m_pBitmap->IsCmykImage()) {
+ flags |= FXRC_CMYK_OUTPUT;
+ }
+ return flags;
+ }
+ case FXDC_DITHER_BITS:
+ return m_DitherBits;
+ }
+ return 0;
+}
+void CFX_AggDeviceDriver::SaveState()
+{
+ void* pClip = NULL;
+ if (m_pClipRgn) {
+ pClip = FX_NEW CFX_ClipRgn(*m_pClipRgn);
+ if (!pClip) {
+ return;
+ }
+ }
+ m_StateStack.Add(pClip);
+}
+void CFX_AggDeviceDriver::RestoreState(FX_BOOL bKeepSaved)
+{
+ if (m_StateStack.GetSize() == 0) {
+ if (m_pClipRgn) {
+ delete m_pClipRgn;
+ m_pClipRgn = NULL;
+ }
+ return;
+ }
+ CFX_ClipRgn* pSavedClip = (CFX_ClipRgn*)m_StateStack[m_StateStack.GetSize() - 1];
+ if (m_pClipRgn) {
+ delete m_pClipRgn;
+ m_pClipRgn = NULL;
+ }
+ if (bKeepSaved) {
+ if (pSavedClip) {
+ m_pClipRgn = FX_NEW CFX_ClipRgn(*pSavedClip);
+ }
+ } else {
+ m_StateStack.RemoveAt(m_StateStack.GetSize() - 1);
+ m_pClipRgn = pSavedClip;
+ }
+}
+void CFX_AggDeviceDriver::SetClipMask(rasterizer_scanline_aa& rasterizer)
+{
+ FX_RECT path_rect(rasterizer.min_x(), rasterizer.min_y(),
+ rasterizer.max_x() + 1, rasterizer.max_y() + 1);
+ path_rect.Intersect(m_pClipRgn->GetBox());
+ CFX_DIBitmapRef mask;
+ CFX_DIBitmap* pThisLayer = mask.New();
+ if (!pThisLayer) {
+ return;
+ }
+ pThisLayer->Create(path_rect.Width(), path_rect.Height(), FXDIB_8bppMask);
+ pThisLayer->Clear(0);
+ rendering_buffer raw_buf(pThisLayer->GetBuffer(), pThisLayer->GetWidth(), pThisLayer->GetHeight(), pThisLayer->GetPitch());
+ pixfmt_gray8 pixel_buf(raw_buf);
+ renderer_base<pixfmt_gray8> base_buf(pixel_buf);
+ renderer_scanline_aa_offset<renderer_base<pixfmt_gray8> > final_render(base_buf, path_rect.left, path_rect.top);
+ final_render.color(gray8(255));
+ scanline_u8 scanline;
+ render_scanlines(rasterizer, scanline, final_render, (m_FillFlags & FXFILL_NOPATHSMOOTH) != 0);
+ m_pClipRgn->IntersectMaskF(path_rect.left, path_rect.top, mask);
+}
+FX_BOOL CFX_AggDeviceDriver::SetClip_PathFill(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ int fill_mode
+ )
+{
+ m_FillFlags = fill_mode;
+ if (m_pClipRgn == NULL) {
+ m_pClipRgn = FX_NEW CFX_ClipRgn(GetDeviceCaps(FXDC_PIXEL_WIDTH), GetDeviceCaps(FXDC_PIXEL_HEIGHT));
+ if (!m_pClipRgn) {
+ return FALSE;
+ }
+ }
+ if (pPathData->GetPointCount() == 5 || pPathData->GetPointCount() == 4) {
+ CFX_FloatRect rectf;
+ if (pPathData->IsRect(pObject2Device, &rectf)) {
+ rectf.Intersect(CFX_FloatRect(0, 0, (FX_FLOAT)GetDeviceCaps(FXDC_PIXEL_WIDTH), (FX_FLOAT)GetDeviceCaps(FXDC_PIXEL_HEIGHT)));
+ FX_RECT rect = rectf.GetOutterRect();
+ m_pClipRgn->IntersectRect(rect);
+ return TRUE;
+ }
+ }
+ CAgg_PathData path_data;
+ path_data.BuildPath(pPathData, pObject2Device);
+ path_data.m_PathData.end_poly();
+ rasterizer_scanline_aa rasterizer;
+ rasterizer.clip_box(0.0f, 0.0f, (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_WIDTH)), (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_HEIGHT)));
+ rasterizer.add_path(path_data.m_PathData);
+ rasterizer.filling_rule((fill_mode & 3) == FXFILL_WINDING ? fill_non_zero : fill_even_odd);
+ SetClipMask(rasterizer);
+ return TRUE;
+}
+FX_BOOL CFX_AggDeviceDriver::SetClip_PathStroke(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ const CFX_GraphStateData* pGraphState
+ )
+{
+ if (m_pClipRgn == NULL) {
+ m_pClipRgn = FX_NEW CFX_ClipRgn(GetDeviceCaps(FXDC_PIXEL_WIDTH), GetDeviceCaps(FXDC_PIXEL_HEIGHT));
+ if (!m_pClipRgn) {
+ return FALSE;
+ }
+ }
+ CAgg_PathData path_data;
+ path_data.BuildPath(pPathData, NULL);
+ rasterizer_scanline_aa rasterizer;
+ rasterizer.clip_box(0.0f, 0.0f, (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_WIDTH)), (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_HEIGHT)));
+ RasterizeStroke(rasterizer, path_data.m_PathData, pObject2Device, pGraphState);
+ rasterizer.filling_rule(fill_non_zero);
+ SetClipMask(rasterizer);
+ return TRUE;
+}
+class CFX_Renderer : public CFX_Object
+{
+private:
+ int m_Alpha,
+ m_Red,
+ m_Green,
+ m_Blue,
+ m_Gray;
+ FX_DWORD m_Color;
+ FX_BOOL m_bFullCover;
+ FX_BOOL m_bRgbByteOrder;
+ CFX_DIBitmap* m_pOriDevice;
+ FX_RECT m_ClipBox;
+ const CFX_DIBitmap* m_pClipMask;
+ CFX_DIBitmap* m_pDevice;
+ const CFX_ClipRgn* m_pClipRgn;
+ void (CFX_Renderer::*composite_span)(FX_LPBYTE, int, int, int, FX_LPBYTE, int, int, FX_LPBYTE, FX_LPBYTE);
+public:
+ void prepare(unsigned) {}
+ void CompositeSpan(FX_LPBYTE dest_scan, FX_LPBYTE ori_scan, int Bpp, FX_BOOL bDestAlpha,
+ int span_left, int span_len, FX_LPBYTE cover_scan,
+ int clip_left, int clip_right, FX_LPBYTE clip_scan)
+ {
+ ASSERT(!m_pDevice->IsCmykImage());
+ int col_start = span_left < clip_left ? clip_left - span_left : 0;
+ int col_end = (span_left + span_len) < clip_right ? span_len : (clip_right - span_left);
+ if (Bpp) {
+ dest_scan += col_start * Bpp;
+ ori_scan += col_start * Bpp;
+ } else {
+ dest_scan += col_start / 8;
+ ori_scan += col_start / 8;
+ }
+ if (m_bRgbByteOrder) {
+ if (Bpp == 4 && bDestAlpha) {
+ for (int col = col_start; col < col_end; col ++) {
+ int src_alpha;
+ if (clip_scan) {
+ src_alpha = m_Alpha * clip_scan[col] / 255;
+ } else {
+ src_alpha = m_Alpha;
+ }
+ FX_BYTE dest_alpha = ori_scan[3] + src_alpha - ori_scan[3] * src_alpha / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ if (m_bFullCover) {
+ *dest_scan++ = FXDIB_ALPHA_MERGE(*ori_scan++, m_Red, alpha_ratio);
+ *dest_scan++ = FXDIB_ALPHA_MERGE(*ori_scan++, m_Green, alpha_ratio);
+ *dest_scan++ = FXDIB_ALPHA_MERGE(*ori_scan++, m_Blue, alpha_ratio);
+ dest_scan++;
+ ori_scan++;
+ } else {
+ int r = FXDIB_ALPHA_MERGE(*ori_scan++, m_Red, alpha_ratio);
+ int g = FXDIB_ALPHA_MERGE(*ori_scan++, m_Green, alpha_ratio);
+ int b = FXDIB_ALPHA_MERGE(*ori_scan++, m_Blue, alpha_ratio);
+ ori_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE( *dest_scan, r, cover_scan[col]);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, g, cover_scan[col]);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, b, cover_scan[col]);
+ dest_scan += 2;
+ }
+ }
+ return;
+ } else if (Bpp == 3 || Bpp == 4) {
+ for (int col = col_start; col < col_end; col ++) {
+ int src_alpha;
+ if (clip_scan) {
+ src_alpha = m_Alpha * clip_scan[col] / 255 ;
+ } else {
+ src_alpha = m_Alpha;
+ }
+ int r = FXDIB_ALPHA_MERGE(*ori_scan++, m_Red, src_alpha);
+ int g = FXDIB_ALPHA_MERGE(*ori_scan++, m_Green, src_alpha);
+ int b = FXDIB_ALPHA_MERGE(*ori_scan, m_Blue, src_alpha);
+ ori_scan += Bpp - 2;
+ *dest_scan = FXDIB_ALPHA_MERGE( *dest_scan, r, cover_scan[col]);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, g, cover_scan[col]);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, b, cover_scan[col]);
+ dest_scan += Bpp - 2;
+ }
+ }
+ return;
+ }
+ if (Bpp == 4 && bDestAlpha) {
+ for (int col = col_start; col < col_end; col ++) {
+ int src_alpha;
+ if (clip_scan) {
+ src_alpha = m_Alpha * clip_scan[col] / 255;
+ } else {
+ src_alpha = m_Alpha;
+ }
+ int src_alpha_covered = src_alpha * cover_scan[col] / 255;
+ if (src_alpha_covered == 0) {
+ dest_scan += 4;
+ continue;
+ }
+ if (cover_scan[col] == 255) {
+ dest_scan[3] = src_alpha_covered;
+ *dest_scan ++ = m_Blue;
+ *dest_scan ++ = m_Green;
+ *dest_scan = m_Red;
+ dest_scan += 2;
+ continue;
+ } else {
+ if (dest_scan[3] == 0) {
+ dest_scan[3] = src_alpha_covered;
+ *dest_scan ++ = m_Blue;
+ *dest_scan ++ = m_Green;
+ *dest_scan = m_Red;
+ dest_scan += 2;
+ continue;
+ }
+ FX_BYTE cover = cover_scan[col];
+ dest_scan[3] = FXDIB_ALPHA_MERGE(dest_scan[3], src_alpha, cover);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, cover);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, cover);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, cover);
+ dest_scan += 2;
+ }
+ }
+ return;
+ } else if (Bpp == 3 || Bpp == 4) {
+ for (int col = col_start; col < col_end; col ++) {
+ int src_alpha;
+ if (clip_scan) {
+ src_alpha = m_Alpha * clip_scan[col] / 255;
+ } else {
+ src_alpha = m_Alpha;
+ }
+ if (m_bFullCover) {
+ *dest_scan++ = FXDIB_ALPHA_MERGE(*ori_scan++, m_Blue, src_alpha);
+ *dest_scan++ = FXDIB_ALPHA_MERGE(*ori_scan++, m_Green, src_alpha);
+ *dest_scan = FXDIB_ALPHA_MERGE(*ori_scan, m_Red, src_alpha);
+ dest_scan += Bpp - 2;
+ ori_scan += Bpp - 2;
+ continue;
+ }
+ int b = FXDIB_ALPHA_MERGE(*ori_scan++, m_Blue, src_alpha);
+ int g = FXDIB_ALPHA_MERGE(*ori_scan++, m_Green, src_alpha);
+ int r = FXDIB_ALPHA_MERGE(*ori_scan, m_Red, src_alpha);
+ ori_scan += Bpp - 2;
+ *dest_scan = FXDIB_ALPHA_MERGE( *dest_scan, b, cover_scan[col]);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, g, cover_scan[col]);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, r, cover_scan[col]);
+ dest_scan += Bpp - 2;
+ continue;
+ }
+ return;
+ } else if (Bpp == 1) {
+ for (int col = col_start; col < col_end; col ++) {
+ int src_alpha;
+ if (clip_scan) {
+ src_alpha = m_Alpha * clip_scan[col] / 255;
+ } else {
+ src_alpha = m_Alpha;
+ }
+ if (m_bFullCover) {
+ *dest_scan = FXDIB_ALPHA_MERGE(*ori_scan++, m_Gray, src_alpha);
+ } else {
+ int gray = FXDIB_ALPHA_MERGE(*ori_scan++, m_Gray, src_alpha);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, cover_scan[col]);
+ dest_scan++;
+ }
+ }
+ } else {
+ int index = 0;
+ if (m_pDevice->GetPalette() == NULL) {
+ index = ((FX_BYTE)m_Color == 0xff) ? 1 : 0;
+ } else {
+ for (int i = 0; i < 2; i ++)
+ if (FXARGB_TODIB(m_pDevice->GetPalette()[i]) == m_Color) {
+ index = i;
+ }
+ }
+ FX_LPBYTE dest_scan1 = dest_scan;
+ for (int col = col_start; col < col_end; col ++) {
+ int src_alpha;
+ if (clip_scan) {
+ src_alpha = m_Alpha * cover_scan[col] * clip_scan[col] / 255 / 255;
+ } else {
+ src_alpha = m_Alpha * cover_scan[col] / 255;
+ }
+ if (src_alpha) {
+ if (!index) {
+ *dest_scan1 &= ~(1 << (7 - (col + span_left) % 8));
+ } else {
+ *dest_scan1 |= 1 << (7 - (col + span_left) % 8);
+ }
+ }
+ dest_scan1 = dest_scan + (span_left % 8 + col - col_start + 1) / 8;
+ }
+ }
+ }
+ void CompositeSpan1bpp(FX_LPBYTE dest_scan, int Bpp,
+ int span_left, int span_len, FX_LPBYTE cover_scan,
+ int clip_left, int clip_right, FX_LPBYTE clip_scan,
+ FX_LPBYTE dest_extra_alpha_scan)
+ {
+ ASSERT(!m_bRgbByteOrder);
+ ASSERT(!m_pDevice->IsCmykImage());
+ int col_start = span_left < clip_left ? clip_left - span_left : 0;
+ int col_end = (span_left + span_len) < clip_right ? span_len : (clip_right - span_left);
+ dest_scan += col_start / 8;
+ int index = 0;
+ if (m_pDevice->GetPalette() == NULL) {
+ index = ((FX_BYTE)m_Color == 0xff) ? 1 : 0;
+ } else {
+ for (int i = 0; i < 2; i ++)
+ if (FXARGB_TODIB(m_pDevice->GetPalette()[i]) == m_Color) {
+ index = i;
+ }
+ }
+ FX_LPBYTE dest_scan1 = dest_scan;
+ for (int col = col_start; col < col_end; col ++) {
+ int src_alpha;
+ if (clip_scan) {
+ src_alpha = m_Alpha * cover_scan[col] * clip_scan[col] / 255 / 255;
+ } else {
+ src_alpha = m_Alpha * cover_scan[col] / 255;
+ }
+ if (src_alpha) {
+ if (!index) {
+ *dest_scan1 &= ~(1 << (7 - (col + span_left) % 8));
+ } else {
+ *dest_scan1 |= 1 << (7 - (col + span_left) % 8);
+ }
+ }
+ dest_scan1 = dest_scan + (span_left % 8 + col - col_start + 1) / 8;
+ }
+ }
+ void CompositeSpanGray(FX_LPBYTE dest_scan, int Bpp,
+ int span_left, int span_len, FX_LPBYTE cover_scan,
+ int clip_left, int clip_right, FX_LPBYTE clip_scan,
+ FX_LPBYTE dest_extra_alpha_scan)
+ {
+ ASSERT(!m_bRgbByteOrder);
+ int col_start = span_left < clip_left ? clip_left - span_left : 0;
+ int col_end = (span_left + span_len) < clip_right ? span_len : (clip_right - span_left);
+ dest_scan += col_start;
+ Bpp;
+ if (dest_extra_alpha_scan) {
+ for (int col = col_start; col < col_end; col ++) {
+ int src_alpha;
+ if (m_bFullCover) {
+ if (clip_scan) {
+ src_alpha = m_Alpha * clip_scan[col] / 255;
+ } else {
+ src_alpha = m_Alpha;
+ }
+ } else {
+ if (clip_scan) {
+ src_alpha = m_Alpha * cover_scan[col] * clip_scan[col] / 255 / 255;
+ } else {
+ src_alpha = m_Alpha * cover_scan[col] / 255;
+ }
+ }
+ if (src_alpha) {
+ if (src_alpha == 255) {
+ *dest_scan = m_Gray;
+ *dest_extra_alpha_scan = m_Alpha;
+ } else {
+ FX_BYTE dest_alpha = (*dest_extra_alpha_scan) + src_alpha -
+ (*dest_extra_alpha_scan) * src_alpha / 255;
+ *dest_extra_alpha_scan++ = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Gray, alpha_ratio);
+ dest_scan ++;
+ continue;
+ }
+ }
+ dest_extra_alpha_scan ++;
+ dest_scan ++;
+ }
+ } else {
+ for (int col = col_start; col < col_end; col ++) {
+ int src_alpha;
+ if (clip_scan) {
+ src_alpha = m_Alpha * cover_scan[col] * clip_scan[col] / 255 / 255;
+ } else {
+ src_alpha = m_Alpha * cover_scan[col] / 255;
+ }
+ if (src_alpha) {
+ if (src_alpha == 255) {
+ *dest_scan = m_Gray;
+ } else {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Gray, src_alpha);
+ }
+ }
+ dest_scan ++;
+ }
+ }
+ }
+ void CompositeSpanARGB(FX_LPBYTE dest_scan, int Bpp,
+ int span_left, int span_len, FX_LPBYTE cover_scan,
+ int clip_left, int clip_right, FX_LPBYTE clip_scan,
+ FX_LPBYTE dest_extra_alpha_scan)
+ {
+ int col_start = span_left < clip_left ? clip_left - span_left : 0;
+ int col_end = (span_left + span_len) < clip_right ? span_len : (clip_right - span_left);
+ dest_scan += col_start * Bpp;
+ if (m_bRgbByteOrder) {
+ for (int col = col_start; col < col_end; col ++) {
+ int src_alpha;
+ if (m_bFullCover) {
+ if (clip_scan) {
+ src_alpha = m_Alpha * clip_scan[col] / 255;
+ } else {
+ src_alpha = m_Alpha;
+ }
+ } else {
+ if (clip_scan) {
+ src_alpha = m_Alpha * cover_scan[col] * clip_scan[col] / 255 / 255;
+ } else {
+ src_alpha = m_Alpha * cover_scan[col] / 255;
+ }
+ }
+ if (src_alpha) {
+ if (src_alpha == 255) {
+ *(FX_DWORD*)dest_scan = m_Color;
+ } else {
+ FX_BYTE dest_alpha = dest_scan[3] + src_alpha - dest_scan[3] * src_alpha / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, alpha_ratio);
+ dest_scan += 2;
+ continue;
+ }
+ }
+ dest_scan += 4;
+ }
+ return;
+ }
+ for (int col = col_start; col < col_end; col ++) {
+ int src_alpha;
+ if (m_bFullCover) {
+ if (clip_scan) {
+ src_alpha = m_Alpha * clip_scan[col] / 255;
+ } else {
+ src_alpha = m_Alpha;
+ }
+ } else {
+ if (clip_scan) {
+ src_alpha = m_Alpha * cover_scan[col] * clip_scan[col] / 255 / 255;
+ } else {
+ src_alpha = m_Alpha * cover_scan[col] / 255;
+ }
+ }
+ if (src_alpha) {
+ if (src_alpha == 255) {
+ *(FX_DWORD*)dest_scan = m_Color;
+ } else {
+ if (dest_scan[3] == 0) {
+ dest_scan[3] = src_alpha;
+ *dest_scan++ = m_Blue;
+ *dest_scan++ = m_Green;
+ *dest_scan = m_Red;
+ dest_scan += 2;
+ continue;
+ }
+ FX_BYTE dest_alpha = dest_scan[3] + src_alpha - dest_scan[3] * src_alpha / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, alpha_ratio);
+ dest_scan += 2;
+ continue;
+ }
+ }
+ dest_scan += Bpp;
+ }
+ }
+ void CompositeSpanRGB(FX_LPBYTE dest_scan, int Bpp,
+ int span_left, int span_len, FX_LPBYTE cover_scan,
+ int clip_left, int clip_right, FX_LPBYTE clip_scan,
+ FX_LPBYTE dest_extra_alpha_scan)
+ {
+ int col_start = span_left < clip_left ? clip_left - span_left : 0;
+ int col_end = (span_left + span_len) < clip_right ? span_len : (clip_right - span_left);
+ dest_scan += col_start * Bpp;
+ if (m_bRgbByteOrder) {
+ for (int col = col_start; col < col_end; col ++) {
+ int src_alpha;
+ if (clip_scan) {
+ src_alpha = m_Alpha * cover_scan[col] * clip_scan[col] / 255 / 255;
+ } else {
+ src_alpha = m_Alpha * cover_scan[col] / 255;
+ }
+ if (src_alpha) {
+ if (src_alpha == 255) {
+ if (Bpp == 4) {
+ *(FX_DWORD*)dest_scan = m_Color;
+ } else if (Bpp == 3) {
+ *dest_scan++ = m_Red;
+ *dest_scan++ = m_Green;
+ *dest_scan++ = m_Blue;
+ continue;
+ }
+ } else {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, src_alpha);
+ dest_scan++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, src_alpha);
+ dest_scan++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, src_alpha);
+ dest_scan += Bpp - 2;
+ continue;
+ }
+ }
+ dest_scan += Bpp;
+ }
+ return;
+ }
+ if (Bpp == 3 && dest_extra_alpha_scan) {
+ for (int col = col_start; col < col_end; col ++) {
+ int src_alpha;
+ if (m_bFullCover) {
+ if (clip_scan) {
+ src_alpha = m_Alpha * clip_scan[col] / 255;
+ } else {
+ src_alpha = m_Alpha;
+ }
+ } else {
+ if (clip_scan) {
+ src_alpha = m_Alpha * cover_scan[col] * clip_scan[col] / 255 / 255;
+ } else {
+ src_alpha = m_Alpha * cover_scan[col] / 255;
+ }
+ }
+ if (src_alpha) {
+ if (src_alpha == 255) {
+ *dest_scan++ = (FX_BYTE)m_Blue;
+ *dest_scan++ = (FX_BYTE)m_Green;
+ *dest_scan++ = (FX_BYTE)m_Red;
+ *dest_extra_alpha_scan++ = (FX_BYTE)m_Alpha;
+ continue;
+ } else {
+ FX_BYTE dest_alpha = (*dest_extra_alpha_scan) + src_alpha -
+ (*dest_extra_alpha_scan) * src_alpha / 255;
+ *dest_extra_alpha_scan++ = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, alpha_ratio);
+ dest_scan ++;
+ continue;
+ }
+ }
+ dest_extra_alpha_scan++;
+ dest_scan += Bpp;
+ }
+ } else {
+ for (int col = col_start; col < col_end; col ++) {
+ int src_alpha;
+ if (m_bFullCover) {
+ if (clip_scan) {
+ src_alpha = m_Alpha * clip_scan[col] / 255;
+ } else {
+ src_alpha = m_Alpha;
+ }
+ } else {
+ if (clip_scan) {
+ src_alpha = m_Alpha * cover_scan[col] * clip_scan[col] / 255 / 255;
+ } else {
+ src_alpha = m_Alpha * cover_scan[col] / 255;
+ }
+ }
+ if (src_alpha) {
+ if (src_alpha == 255) {
+ if (Bpp == 4) {
+ *(FX_DWORD*)dest_scan = m_Color;
+ } else if (Bpp == 3) {
+ *dest_scan++ = m_Blue;
+ *dest_scan++ = m_Green;
+ *dest_scan++ = m_Red;
+ continue;
+ }
+ } else {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, src_alpha);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, src_alpha);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, src_alpha);
+ dest_scan += Bpp - 2;
+ continue;
+ }
+ }
+ dest_scan += Bpp;
+ }
+ }
+ }
+ void CompositeSpanCMYK(FX_LPBYTE dest_scan, int Bpp,
+ int span_left, int span_len, FX_LPBYTE cover_scan,
+ int clip_left, int clip_right, FX_LPBYTE clip_scan,
+ FX_LPBYTE dest_extra_alpha_scan)
+ {
+ ASSERT(!m_bRgbByteOrder);
+ int col_start = span_left < clip_left ? clip_left - span_left : 0;
+ int col_end = (span_left + span_len) < clip_right ? span_len : (clip_right - span_left);
+ dest_scan += col_start * 4;
+ Bpp;
+ if (dest_extra_alpha_scan) {
+ for (int col = col_start; col < col_end; col ++) {
+ int src_alpha;
+ if (m_bFullCover) {
+ if (clip_scan) {
+ src_alpha = m_Alpha * clip_scan[col] / 255;
+ } else {
+ src_alpha = m_Alpha;
+ }
+ } else {
+ if (clip_scan) {
+ src_alpha = m_Alpha * cover_scan[col] * clip_scan[col] / 255 / 255;
+ } else {
+ src_alpha = m_Alpha * cover_scan[col] / 255;
+ }
+ }
+ if (src_alpha) {
+ if (src_alpha == 255) {
+ *(FX_CMYK*)dest_scan = m_Color;
+ *dest_extra_alpha_scan = (FX_BYTE)m_Alpha;
+ } else {
+ FX_BYTE dest_alpha = (*dest_extra_alpha_scan) + src_alpha -
+ (*dest_extra_alpha_scan) * src_alpha / 255;
+ *dest_extra_alpha_scan++ = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Gray, alpha_ratio);
+ dest_scan ++;
+ continue;
+ }
+ }
+ dest_extra_alpha_scan++;
+ dest_scan += 4;
+ }
+ } else {
+ for (int col = col_start; col < col_end; col ++) {
+ int src_alpha;
+ if (clip_scan) {
+ src_alpha = m_Alpha * cover_scan[col] * clip_scan[col] / 255 / 255;
+ } else {
+ src_alpha = m_Alpha * cover_scan[col] / 255;
+ }
+ if (src_alpha) {
+ if (src_alpha == 255) {
+ *(FX_CMYK*)dest_scan = m_Color;
+ } else {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Red, src_alpha);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Green, src_alpha);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Blue, src_alpha);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, m_Gray, src_alpha);
+ dest_scan ++;
+ continue;
+ }
+ }
+ dest_scan += 4;
+ }
+ }
+ }
+ template<class Scanline> void render(const Scanline& sl)
+ {
+ if (m_pOriDevice == NULL && composite_span == NULL) {
+ return;
+ }
+ int y = sl.y();
+ if (y < m_ClipBox.top || y >= m_ClipBox.bottom) {
+ return;
+ }
+ FX_LPBYTE dest_scan = m_pDevice->GetBuffer() + m_pDevice->GetPitch() * y;
+ FX_LPBYTE dest_scan_extra_alpha = NULL;
+ CFX_DIBitmap* pAlphaMask = m_pDevice->m_pAlphaMask;
+ if (pAlphaMask) {
+ dest_scan_extra_alpha = pAlphaMask->GetBuffer() + pAlphaMask->GetPitch() * y;
+ }
+ FX_LPBYTE ori_scan = NULL;
+ if (m_pOriDevice) {
+ ori_scan = m_pOriDevice->GetBuffer() + m_pOriDevice->GetPitch() * y;
+ }
+ int Bpp = m_pDevice->GetBPP() / 8;
+ FX_BOOL bDestAlpha = m_pDevice->HasAlpha() || m_pDevice->IsAlphaMask();
+ unsigned num_spans = sl.num_spans();
+ typename Scanline::const_iterator span = sl.begin();
+ while (1) {
+ int x = span->x;
+ ASSERT(span->len > 0);
+ FX_LPBYTE dest_pos = NULL;
+ FX_LPBYTE dest_extra_alpha_pos = NULL;
+ FX_LPBYTE ori_pos = NULL;
+ if (Bpp) {
+ ori_pos = ori_scan ? ori_scan + x * Bpp : NULL;
+ dest_pos = dest_scan + x * Bpp;
+ dest_extra_alpha_pos = dest_scan_extra_alpha ? dest_scan_extra_alpha + x : NULL;
+ } else {
+ dest_pos = dest_scan + x / 8;
+ ori_pos = ori_scan ? ori_scan + x / 8 : NULL;
+ }
+ FX_LPBYTE clip_pos = NULL;
+ if (m_pClipMask) {
+ clip_pos = m_pClipMask->GetBuffer() + (y - m_ClipBox.top) * m_pClipMask->GetPitch() + x - m_ClipBox.left;
+ }
+ if (ori_pos) {
+ CompositeSpan(dest_pos, ori_pos, Bpp, bDestAlpha, x, span->len, span->covers, m_ClipBox.left, m_ClipBox.right, clip_pos);
+ } else {
+ (this->*composite_span)(dest_pos, Bpp, x, span->len, span->covers, m_ClipBox.left, m_ClipBox.right, clip_pos, dest_extra_alpha_pos);
+ }
+ if(--num_spans == 0) {
+ break;
+ }
+ ++span;
+ }
+ }
+
+ FX_BOOL Init(CFX_DIBitmap* pDevice, CFX_DIBitmap* pOriDevice, const CFX_ClipRgn* pClipRgn, FX_DWORD color, FX_BOOL bFullCover, FX_BOOL bRgbByteOrder,
+ int alpha_flag = 0, void* pIccTransform = NULL)
+ {
+ m_pDevice = pDevice;
+ m_pClipRgn = pClipRgn;
+ composite_span = NULL;
+ m_bRgbByteOrder = bRgbByteOrder;
+ m_pOriDevice = pOriDevice;
+ if (m_pClipRgn) {
+ m_ClipBox = m_pClipRgn->GetBox();
+ } else {
+ m_ClipBox.left = m_ClipBox.top = 0;
+ m_ClipBox.right = m_pDevice->GetWidth();
+ m_ClipBox.bottom = m_pDevice->GetHeight();
+ }
+ m_pClipMask = NULL;
+ if (m_pClipRgn && m_pClipRgn->GetType() == CFX_ClipRgn::MaskF) {
+ m_pClipMask = m_pClipRgn->GetMask();
+ }
+ m_bFullCover = bFullCover;
+ FX_BOOL bObjectCMYK = FXGETFLAG_COLORTYPE(alpha_flag);
+ FX_BOOL bDeviceCMYK = pDevice->IsCmykImage();
+ m_Alpha = bObjectCMYK ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXARGB_A(color);
+ ICodec_IccModule* pIccModule = NULL;
+ if (!CFX_GEModule::Get()->GetCodecModule() || !CFX_GEModule::Get()->GetCodecModule()->GetIccModule()) {
+ pIccTransform = NULL;
+ } else {
+ pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ }
+ if (m_pDevice->GetBPP() == 8) {
+ ASSERT(!m_bRgbByteOrder);
+ composite_span = &CFX_Renderer::CompositeSpanGray;
+ if (m_pDevice->IsAlphaMask()) {
+ m_Gray = 255;
+ } else {
+ if (pIccTransform) {
+ FX_BYTE gray;
+ color = bObjectCMYK ? FXCMYK_TODIB(color) : FXARGB_TODIB(color);
+ pIccModule->TranslateScanline(pIccTransform, &gray, (FX_LPCBYTE)&color, 1);
+ m_Gray = gray;
+ } else {
+ if (bObjectCMYK) {
+ FX_BYTE r, g, b;
+ AdobeCMYK_to_sRGB1(FXSYS_GetCValue(color), FXSYS_GetMValue(color), FXSYS_GetYValue(color), FXSYS_GetKValue(color),
+ r, g, b);
+ m_Gray = FXRGB2GRAY(r, g, b);
+ } else {
+ m_Gray = FXRGB2GRAY(FXARGB_R(color), FXARGB_G(color), FXARGB_B(color));
+ }
+ }
+ }
+ return TRUE;
+ }
+ if (bDeviceCMYK) {
+ ASSERT(!m_bRgbByteOrder);
+ composite_span = &CFX_Renderer::CompositeSpanCMYK;
+ if (bObjectCMYK) {
+ m_Color = FXCMYK_TODIB(color);
+ if (pIccTransform) {
+ pIccModule->TranslateScanline(pIccTransform, (FX_LPBYTE)&m_Color, (FX_LPCBYTE)&m_Color, 1);
+ }
+ } else {
+ if (!pIccTransform) {
+ return FALSE;
+ }
+ color = FXARGB_TODIB(color);
+ pIccModule->TranslateScanline(pIccTransform, (FX_LPBYTE)&m_Color, (FX_LPCBYTE)&color, 1);
+ }
+ m_Red = ((FX_LPBYTE)&m_Color)[0];
+ m_Green = ((FX_LPBYTE)&m_Color)[1];
+ m_Blue = ((FX_LPBYTE)&m_Color)[2];
+ m_Gray = ((FX_LPBYTE)&m_Color)[3];
+ } else {
+ composite_span = (pDevice->GetFormat() == FXDIB_Argb) ? &CFX_Renderer::CompositeSpanARGB : &CFX_Renderer::CompositeSpanRGB;
+ if (pIccTransform) {
+ color = bObjectCMYK ? FXCMYK_TODIB(color) : FXARGB_TODIB(color);
+ pIccModule->TranslateScanline(pIccTransform, (FX_LPBYTE)&m_Color, (FX_LPCBYTE)&color, 1);
+ ((FX_LPBYTE)&m_Color)[3] = m_Alpha;
+ m_Red = ((FX_LPBYTE)&m_Color)[2];
+ m_Green = ((FX_LPBYTE)&m_Color)[1];
+ m_Blue = ((FX_LPBYTE)&m_Color)[0];
+ if (m_bRgbByteOrder) {
+ m_Color = FXARGB_TODIB(m_Color);
+ m_Color = FXARGB_TOBGRORDERDIB(m_Color);
+ }
+ } else {
+ if (bObjectCMYK) {
+ FX_BYTE r, g, b;
+ AdobeCMYK_to_sRGB1(FXSYS_GetCValue(color), FXSYS_GetMValue(color), FXSYS_GetYValue(color), FXSYS_GetKValue(color),
+ r, g, b);
+ m_Color = FXARGB_MAKE(m_Alpha, r, g, b);
+ if (m_bRgbByteOrder) {
+ m_Color = FXARGB_TOBGRORDERDIB(m_Color);
+ } else {
+ m_Color = FXARGB_TODIB(m_Color);
+ }
+ m_Red = r;
+ m_Green = g;
+ m_Blue = b;
+ } else {
+ if (m_bRgbByteOrder) {
+ m_Color = FXARGB_TOBGRORDERDIB(color);
+ } else {
+ m_Color = FXARGB_TODIB(color);
+ }
+ ArgbDecode(color, m_Alpha, m_Red, m_Green, m_Blue);
+ }
+ }
+ }
+ if (m_pDevice->GetBPP() == 1) {
+ composite_span = &CFX_Renderer::CompositeSpan1bpp;
+ }
+ return TRUE;
+ }
+};
+FX_BOOL CFX_AggDeviceDriver::RenderRasterizer(rasterizer_scanline_aa& rasterizer, FX_DWORD color, FX_BOOL bFullCover, FX_BOOL bGroupKnockout,
+ int alpha_flag, void* pIccTransform)
+{
+ CFX_DIBitmap* pt = bGroupKnockout ? m_pOriDevice : NULL;
+ CFX_Renderer render;
+ if (!render.Init(m_pBitmap, pt, m_pClipRgn, color, bFullCover, m_bRgbByteOrder, alpha_flag, pIccTransform)) {
+ return FALSE;
+ }
+ scanline_u8 scanline;
+ render_scanlines(rasterizer, scanline, render, (m_FillFlags & FXFILL_NOPATHSMOOTH) != 0);
+ return TRUE;
+}
+FX_BOOL CFX_AggDeviceDriver::DrawPath(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ const CFX_GraphStateData* pGraphState,
+ FX_DWORD fill_color,
+ FX_DWORD stroke_color,
+ int fill_mode,
+ int alpha_flag,
+ void* pIccTransform,
+ int blend_type
+ )
+{
+ if (blend_type != FXDIB_BLEND_NORMAL) {
+ return FALSE;
+ }
+ if (GetBuffer() == NULL) {
+ return TRUE;
+ }
+ m_FillFlags = fill_mode;
+ if ((fill_mode & 3) && fill_color) {
+ CAgg_PathData path_data;
+ path_data.BuildPath(pPathData, pObject2Device);
+ rasterizer_scanline_aa rasterizer;
+ rasterizer.clip_box(0.0f, 0.0f, (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_WIDTH)), (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_HEIGHT)));
+ rasterizer.add_path(path_data.m_PathData);
+ rasterizer.filling_rule((fill_mode & 3) == FXFILL_WINDING ? fill_non_zero : fill_even_odd);
+ if (!RenderRasterizer(rasterizer, fill_color, fill_mode & FXFILL_FULLCOVER, FALSE, alpha_flag, pIccTransform)) {
+ return FALSE;
+ }
+ }
+ int stroke_alpha = FXGETFLAG_COLORTYPE(alpha_flag) ? FXGETFLAG_ALPHA_STROKE(alpha_flag) : FXARGB_A(stroke_color);
+ if (pGraphState && stroke_alpha) {
+ if (fill_mode & FX_ZEROAREA_FILL) {
+ CAgg_PathData path_data;
+ path_data.BuildPath(pPathData, pObject2Device);
+ rasterizer_scanline_aa rasterizer;
+ rasterizer.clip_box(0.0f, 0.0f, (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_WIDTH)), (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_HEIGHT)));
+ RasterizeStroke(rasterizer, path_data.m_PathData, NULL, pGraphState, 1, FALSE, fill_mode & FX_STROKE_TEXT_MODE);
+ int fill_flag = FXGETFLAG_COLORTYPE(alpha_flag) << 8 | FXGETFLAG_ALPHA_STROKE(alpha_flag);
+ if (!RenderRasterizer(rasterizer, stroke_color, fill_mode & FXFILL_FULLCOVER, m_bGroupKnockout, fill_flag, pIccTransform)) {
+ return FALSE;
+ }
+ return TRUE;
+ }
+ CFX_AffineMatrix matrix1, matrix2;
+ if (pObject2Device) {
+ matrix1.a = FX_MAX(FXSYS_fabs(pObject2Device->a), FXSYS_fabs(pObject2Device->b));
+ matrix1.d = matrix1.a;
+ matrix2.Set(pObject2Device->a / matrix1.a, pObject2Device->b / matrix1.a,
+ pObject2Device->c / matrix1.d, pObject2Device->d / matrix1.d,
+ 0, 0);
+ CFX_AffineMatrix mtRervese;
+ mtRervese.SetReverse(matrix2);
+ matrix1 = *pObject2Device;
+ matrix1.Concat(mtRervese);
+ }
+ CAgg_PathData path_data;
+ path_data.BuildPath(pPathData, &matrix1);
+ rasterizer_scanline_aa rasterizer;
+ rasterizer.clip_box(0.0f, 0.0f, (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_WIDTH)), (FX_FLOAT)(GetDeviceCaps(FXDC_PIXEL_HEIGHT)));
+ RasterizeStroke(rasterizer, path_data.m_PathData, &matrix2, pGraphState, matrix1.a, FALSE, fill_mode & FX_STROKE_TEXT_MODE);
+ int fill_flag = FXGETFLAG_COLORTYPE(alpha_flag) << 8 | FXGETFLAG_ALPHA_STROKE(alpha_flag);
+ if (!RenderRasterizer(rasterizer, stroke_color, fill_mode & FXFILL_FULLCOVER, m_bGroupKnockout, fill_flag, pIccTransform)) {
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+void RgbByteOrderSetPixel(CFX_DIBitmap* pBitmap, int x, int y, FX_DWORD argb)
+{
+ if (x < 0 || x >= pBitmap->GetWidth() || y < 0 || y >= pBitmap->GetHeight()) {
+ return;
+ }
+ FX_LPBYTE pos = (FX_BYTE*)pBitmap->GetBuffer() + y * pBitmap->GetPitch() + x * pBitmap->GetBPP() / 8;
+ if (pBitmap->GetFormat() == FXDIB_Argb) {
+ FXARGB_SETRGBORDERDIB(pos, ArgbGamma(argb));
+ } else {
+ int alpha = FXARGB_A(argb);
+ pos[0] = (FXARGB_R(argb) * alpha + pos[0] * (255 - alpha)) / 255;
+ pos[1] = (FXARGB_G(argb) * alpha + pos[1] * (255 - alpha)) / 255;
+ pos[2] = (FXARGB_B(argb) * alpha + pos[2] * (255 - alpha)) / 255;
+ }
+}
+void RgbByteOrderCompositeRect(CFX_DIBitmap* pBitmap, int left, int top, int width, int height, FX_ARGB argb)
+{
+ int src_alpha = FXARGB_A(argb);
+ if (src_alpha == 0) {
+ return;
+ }
+ FX_RECT rect(left, top, left + width, top + height);
+ rect.Intersect(0, 0, pBitmap->GetWidth(), pBitmap->GetHeight());
+ width = rect.Width();
+ int src_r = FXARGB_R(argb), src_g = FXARGB_G(argb), src_b = FXARGB_B(argb);
+ int Bpp = pBitmap->GetBPP() / 8;
+ FX_BOOL bAlpha = pBitmap->HasAlpha();
+ int dib_argb = FXARGB_TOBGRORDERDIB(argb);
+ FX_BYTE* pBuffer = pBitmap->GetBuffer();
+ if (src_alpha == 255) {
+ for (int row = rect.top; row < rect.bottom; row ++) {
+ FX_LPBYTE dest_scan = pBuffer + row * pBitmap->GetPitch() + rect.left * Bpp;
+ if (Bpp == 4) {
+ FX_DWORD* scan = (FX_DWORD*)dest_scan;
+ for (int col = 0; col < width; col ++) {
+ *scan ++ = dib_argb;
+ }
+ } else {
+ for (int col = 0; col < width; col ++) {
+ *dest_scan ++ = src_r;
+ *dest_scan ++ = src_g;
+ *dest_scan ++ = src_b;
+ }
+ }
+ }
+ return;
+ }
+ src_r = FX_GAMMA(src_r);
+ src_g = FX_GAMMA(src_g);
+ src_b = FX_GAMMA(src_b);
+ for (int row = rect.top; row < rect.bottom; row ++) {
+ FX_LPBYTE dest_scan = pBuffer + row * pBitmap->GetPitch() + rect.left * Bpp;
+ if (bAlpha) {
+ for (int col = 0; col < width; col ++) {
+ FX_BYTE back_alpha = dest_scan[3];
+ if (back_alpha == 0) {
+ FXARGB_SETRGBORDERDIB(dest_scan, FXARGB_MAKE(src_alpha, src_r, src_g, src_b));
+ dest_scan += 4;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
+ dest_scan++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
+ dest_scan++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
+ dest_scan += 2;
+ }
+ } else {
+ for (int col = 0; col < width; col ++) {
+ *dest_scan = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(*dest_scan), src_r, src_alpha));
+ dest_scan++;
+ *dest_scan = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(*dest_scan), src_g, src_alpha));
+ dest_scan++;
+ *dest_scan = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(*dest_scan), src_b, src_alpha));
+ dest_scan++;
+ if (Bpp == 4) {
+ dest_scan++;
+ }
+ }
+ }
+ }
+}
+void RgbByteOrderTransferBitmap(CFX_DIBitmap* pBitmap, int dest_left, int dest_top, int width, int height,
+ const CFX_DIBSource* pSrcBitmap, int src_left, int src_top)
+{
+ if (pBitmap == NULL) {
+ return;
+ }
+ pBitmap->GetOverlapRect(dest_left, dest_top, width, height, pSrcBitmap->GetWidth(), pSrcBitmap->GetHeight(), src_left, src_top, NULL);
+ if (width == 0 || height == 0) {
+ return;
+ }
+ int Bpp = pBitmap->GetBPP() / 8;
+ FXDIB_Format dest_format = pBitmap->GetFormat();
+ FXDIB_Format src_format = pSrcBitmap->GetFormat();
+ int pitch = pBitmap->GetPitch();
+ FX_BYTE* buffer = pBitmap->GetBuffer();
+ if (dest_format == src_format) {
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = buffer + (dest_top + row) * pitch + dest_left * Bpp;
+ FX_LPBYTE src_scan = (FX_LPBYTE)pSrcBitmap->GetScanline(src_top + row) + src_left * Bpp;
+ if (Bpp == 4) {
+ for (int col = 0; col < width; col ++) {
+ FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_scan[3], src_scan[0], src_scan[1], src_scan[2]));
+ dest_scan += 4;
+ src_scan += 4;
+ }
+ } else {
+ for (int col = 0; col < width; col ++) {
+ *dest_scan++ = src_scan[2];
+ *dest_scan++ = src_scan[1];
+ *dest_scan++ = src_scan[0];
+ src_scan += 3;
+ }
+ }
+ }
+ return;
+ }
+ int src_pitch = pSrcBitmap->GetPitch();
+ FX_ARGB* src_pal = pSrcBitmap->GetPalette();
+ FX_LPBYTE dest_buf = buffer + dest_top * pitch + dest_left * Bpp;
+ if (dest_format == FXDIB_Rgb) {
+ if (src_format == FXDIB_Rgb32) {
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * pitch;
+ FX_LPBYTE src_scan = (FX_BYTE*)pSrcBitmap->GetScanline(src_top + row) + src_left * 4;
+ for (int col = 0; col < width; col ++) {
+ *dest_scan++ = src_scan[2];
+ *dest_scan++ = src_scan[1];
+ *dest_scan++ = src_scan[0];
+ src_scan += 4;
+ }
+ }
+ } else {
+ ASSERT(FALSE);
+ }
+ } else if (dest_format == FXDIB_Argb || dest_format == FXDIB_Rgb32) {
+ if (src_format == FXDIB_Rgb) {
+ for (int row = 0; row < height; row ++) {
+ FX_BYTE* dest_scan = (FX_BYTE*)(dest_buf + row * pitch);
+ FX_LPBYTE src_scan = (FX_BYTE*)pSrcBitmap->GetScanline(src_top + row) + src_left * 3;
+ if (src_format == FXDIB_Argb) {
+ for (int col = 0; col < width; col ++) {
+ FXARGB_SETDIB(dest_scan, FXARGB_MAKE(0xff, FX_GAMMA(src_scan[0]), FX_GAMMA(src_scan[1]), FX_GAMMA(src_scan[2])));
+ dest_scan += 4;
+ src_scan += 3;
+ }
+ } else {
+ for (int col = 0; col < width; col ++) {
+ FXARGB_SETDIB(dest_scan, FXARGB_MAKE(0xff, src_scan[0], src_scan[1], src_scan[2]));
+ dest_scan += 4;
+ src_scan += 3;
+ }
+ }
+ }
+ } else if (src_format == FXDIB_Rgb32) {
+ ASSERT(dest_format == FXDIB_Argb);
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * pitch;
+ FX_LPBYTE src_scan = (FX_LPBYTE)(pSrcBitmap->GetScanline(src_top + row) + src_left * 4);
+ for (int col = 0; col < width; col++) {
+ FXARGB_SETDIB(dest_scan, FXARGB_MAKE(0xff, src_scan[0], src_scan[1], src_scan[2]));
+ src_scan += 4;
+ dest_scan += 4;
+ }
+ }
+ }
+ } else {
+ ASSERT(FALSE);
+ }
+}
+FX_ARGB _DefaultCMYK2ARGB(FX_CMYK cmyk, FX_BYTE alpha)
+{
+ FX_BYTE r, g, b;
+ AdobeCMYK_to_sRGB1(FXSYS_GetCValue(cmyk), FXSYS_GetMValue(cmyk), FXSYS_GetYValue(cmyk), FXSYS_GetKValue(cmyk),
+ r, g, b);
+ return ArgbEncode(alpha, r, g, b);
+}
+FX_BOOL _DibSetPixel(CFX_DIBitmap* pDevice, int x, int y, FX_DWORD color, int alpha_flag, void* pIccTransform)
+{
+ FX_BOOL bObjCMYK = FXGETFLAG_COLORTYPE(alpha_flag);
+ int alpha = bObjCMYK ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXARGB_A(color);
+ if (pIccTransform) {
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ color = bObjCMYK ? FXCMYK_TODIB(color) : FXARGB_TODIB(color);
+ pIccModule->TranslateScanline(pIccTransform, (FX_LPBYTE)&color, (FX_LPBYTE)&color, 1);
+ color = bObjCMYK ? FXCMYK_TODIB(color) : FXARGB_TODIB(color);
+ if (!pDevice->IsCmykImage()) {
+ color = (color & 0xffffff) | (alpha << 24);
+ }
+ } else {
+ if (pDevice->IsCmykImage()) {
+ if (!bObjCMYK) {
+ return FALSE;
+ }
+ } else {
+ if (bObjCMYK) {
+ color = _DefaultCMYK2ARGB(color, alpha);
+ }
+ }
+ }
+ pDevice->SetPixel(x, y, color);
+ if (pDevice->m_pAlphaMask) {
+ pDevice->m_pAlphaMask->SetPixel(x, y, alpha << 24);
+ }
+ return TRUE;
+}
+FX_BOOL CFX_AggDeviceDriver::SetPixel(int x, int y, FX_DWORD color, int alpha_flag, void* pIccTransform)
+{
+ if (m_pBitmap->GetBuffer() == NULL) {
+ return TRUE;
+ }
+ if (!CFX_GEModule::Get()->GetCodecModule() || !CFX_GEModule::Get()->GetCodecModule()->GetIccModule()) {
+ pIccTransform = NULL;
+ }
+ if (m_pClipRgn == NULL) {
+ if (m_bRgbByteOrder) {
+ RgbByteOrderSetPixel(m_pBitmap, x, y, color);
+ } else {
+ return _DibSetPixel(m_pBitmap, x, y, color, alpha_flag, pIccTransform);
+ }
+ } else if (m_pClipRgn->GetBox().Contains(x, y)) {
+ if (m_pClipRgn->GetType() == CFX_ClipRgn::RectI) {
+ if (m_bRgbByteOrder) {
+ RgbByteOrderSetPixel(m_pBitmap, x, y, color);
+ } else {
+ return _DibSetPixel(m_pBitmap, x, y, color, alpha_flag, pIccTransform);
+ }
+ } else if (m_pClipRgn->GetType() == CFX_ClipRgn::MaskF) {
+ const CFX_DIBitmap* pMask = m_pClipRgn->GetMask();
+ FX_BOOL bCMYK = FXGETFLAG_COLORTYPE(alpha_flag);
+ int new_alpha = bCMYK ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXARGB_A(color);
+ new_alpha = new_alpha * pMask->GetScanline(y)[x] / 255;
+ if (m_bRgbByteOrder) {
+ RgbByteOrderSetPixel(m_pBitmap, x, y, (color & 0xffffff) | (new_alpha << 24));
+ return TRUE;
+ }
+ if (bCMYK) {
+ FXSETFLAG_ALPHA_FILL(alpha_flag, new_alpha);
+ } else {
+ color = (color & 0xffffff) | (new_alpha << 24);
+ }
+ return _DibSetPixel(m_pBitmap, x, y, color, alpha_flag, pIccTransform);
+ }
+ }
+ return TRUE;
+}
+FX_BOOL CFX_AggDeviceDriver::FillRect(const FX_RECT* pRect, FX_DWORD fill_color, int alpha_flag, void* pIccTransform, int blend_type)
+{
+ if (blend_type != FXDIB_BLEND_NORMAL) {
+ return FALSE;
+ }
+ if (m_pBitmap->GetBuffer() == NULL) {
+ return TRUE;
+ }
+ FX_RECT clip_rect;
+ GetClipBox(&clip_rect);
+ FX_RECT draw_rect = clip_rect;
+ if (pRect) {
+ draw_rect.Intersect(*pRect);
+ }
+ if (draw_rect.IsEmpty()) {
+ return TRUE;
+ }
+ if (m_pClipRgn == NULL || m_pClipRgn->GetType() == CFX_ClipRgn::RectI) {
+ if (m_bRgbByteOrder) {
+ RgbByteOrderCompositeRect(m_pBitmap, draw_rect.left, draw_rect.top, draw_rect.Width(), draw_rect.Height(), fill_color);
+ } else {
+ m_pBitmap->CompositeRect(draw_rect.left, draw_rect.top, draw_rect.Width(), draw_rect.Height(), fill_color, alpha_flag, pIccTransform);
+ }
+ return TRUE;
+ }
+ m_pBitmap->CompositeMask(draw_rect.left, draw_rect.top, draw_rect.Width(), draw_rect.Height(), (const CFX_DIBitmap*)m_pClipRgn->GetMask(),
+ fill_color, draw_rect.left - clip_rect.left, draw_rect.top - clip_rect.top, FXDIB_BLEND_NORMAL, NULL, m_bRgbByteOrder, alpha_flag, pIccTransform);
+ return TRUE;
+}
+FX_BOOL CFX_AggDeviceDriver::GetClipBox(FX_RECT* pRect)
+{
+ if (m_pClipRgn == NULL) {
+ pRect->left = pRect->top = 0;
+ pRect->right = GetDeviceCaps(FXDC_PIXEL_WIDTH);
+ pRect->bottom = GetDeviceCaps(FXDC_PIXEL_HEIGHT);
+ return TRUE;
+ }
+ *pRect = m_pClipRgn->GetBox();
+ return TRUE;
+}
+FX_BOOL CFX_AggDeviceDriver::GetDIBits(CFX_DIBitmap* pBitmap, int left, int top, void* pIccTransform, FX_BOOL bDEdge)
+{
+ if (m_pBitmap->GetBuffer() == NULL) {
+ return TRUE;
+ }
+ if (bDEdge) {
+ if (m_bRgbByteOrder) {
+ RgbByteOrderTransferBitmap(pBitmap, 0, 0, pBitmap->GetWidth(), pBitmap->GetHeight(), m_pBitmap, left, top);
+ } else {
+ return pBitmap->TransferBitmap(0, 0, pBitmap->GetWidth(), pBitmap->GetHeight(), m_pBitmap, left, top, pIccTransform);
+ }
+ return TRUE;
+ }
+ FX_RECT rect(left, top, left + pBitmap->GetWidth(), top + pBitmap->GetHeight());
+ CFX_DIBitmap *pBack = NULL;
+ if (m_pOriDevice) {
+ pBack = m_pOriDevice->Clone(&rect);
+ if (!pBack) {
+ return TRUE;
+ }
+ pBack->CompositeBitmap(0, 0, pBack->GetWidth(), pBack->GetHeight(), m_pBitmap, 0, 0);
+ } else {
+ pBack = m_pBitmap->Clone(&rect);
+ }
+ if (!pBack) {
+ return TRUE;
+ }
+ FX_BOOL bRet = TRUE;
+ left = left >= 0 ? 0 : left;
+ top = top >= 0 ? 0 : top;
+ if (m_bRgbByteOrder) {
+ RgbByteOrderTransferBitmap(pBitmap, 0, 0, rect.Width(), rect.Height(), pBack, left, top);
+ } else {
+ bRet = pBitmap->TransferBitmap(0, 0, rect.Width(), rect.Height(), pBack, left, top, pIccTransform);
+ }
+ delete pBack;
+ return bRet;
+}
+FX_BOOL CFX_AggDeviceDriver::SetDIBits(const CFX_DIBSource* pBitmap, FX_DWORD argb, const FX_RECT* pSrcRect, int left, int top, int blend_type,
+ int alpha_flag, void* pIccTransform)
+{
+ if (m_pBitmap->GetBuffer() == NULL) {
+ return TRUE;
+ }
+ if (pBitmap->IsAlphaMask())
+ return m_pBitmap->CompositeMask(left, top, pSrcRect->Width(), pSrcRect->Height(), pBitmap, argb,
+ pSrcRect->left, pSrcRect->top, blend_type, m_pClipRgn, m_bRgbByteOrder, alpha_flag, pIccTransform);
+ return m_pBitmap->CompositeBitmap(left, top, pSrcRect->Width(), pSrcRect->Height(), pBitmap,
+ pSrcRect->left, pSrcRect->top, blend_type, m_pClipRgn, m_bRgbByteOrder, pIccTransform);
+}
+FX_BOOL CFX_AggDeviceDriver::StretchDIBits(const CFX_DIBSource* pSource, FX_DWORD argb, int dest_left, int dest_top,
+ int dest_width, int dest_height, const FX_RECT* pClipRect, FX_DWORD flags,
+ int alpha_flag, void* pIccTransform, int blend_type)
+{
+ if (m_pBitmap->GetBuffer() == NULL) {
+ return TRUE;
+ }
+ if (dest_width == pSource->GetWidth() && dest_height == pSource->GetHeight()) {
+ FX_RECT rect(0, 0, dest_width, dest_height);
+ return SetDIBits(pSource, argb, &rect, dest_left, dest_top, blend_type, alpha_flag, pIccTransform);
+ }
+ FX_RECT dest_rect(dest_left, dest_top, dest_left + dest_width, dest_top + dest_height);
+ dest_rect.Normalize();
+ FX_RECT dest_clip = dest_rect;
+ dest_clip.Intersect(*pClipRect);
+ CFX_BitmapComposer composer;
+ composer.Compose(m_pBitmap, m_pClipRgn, 255, argb, dest_clip, FALSE, FALSE, FALSE, m_bRgbByteOrder, alpha_flag, pIccTransform, blend_type);
+ dest_clip.Offset(-dest_rect.left, -dest_rect.top);
+ CFX_ImageStretcher stretcher;
+ if (stretcher.Start(&composer, pSource, dest_width, dest_height, dest_clip, flags)) {
+ stretcher.Continue(NULL);
+ }
+ return TRUE;
+}
+FX_BOOL CFX_AggDeviceDriver::StartDIBits(const CFX_DIBSource* pSource, int bitmap_alpha, FX_DWORD argb,
+ const CFX_AffineMatrix* pMatrix, FX_DWORD render_flags, FX_LPVOID& handle,
+ int alpha_flag, void* pIccTransform, int blend_type)
+{
+ if (m_pBitmap->GetBuffer() == NULL) {
+ return TRUE;
+ }
+ CFX_ImageRenderer* pRenderer = FX_NEW CFX_ImageRenderer;
+ if (!pRenderer) {
+ return FALSE;
+ }
+ pRenderer->Start(m_pBitmap, m_pClipRgn, pSource, bitmap_alpha, argb, pMatrix, render_flags, m_bRgbByteOrder, alpha_flag, pIccTransform);
+ handle = pRenderer;
+ return TRUE;
+}
+FX_BOOL CFX_AggDeviceDriver::ContinueDIBits(FX_LPVOID pHandle, IFX_Pause* pPause)
+{
+ if (m_pBitmap->GetBuffer() == NULL) {
+ return TRUE;
+ }
+ return ((CFX_ImageRenderer*)pHandle)->Continue(pPause);
+}
+void CFX_AggDeviceDriver::CancelDIBits(FX_LPVOID pHandle)
+{
+ if (m_pBitmap->GetBuffer() == NULL) {
+ return;
+ }
+ delete (CFX_ImageRenderer*)pHandle;
+}
+CFX_FxgeDevice::CFX_FxgeDevice()
+{
+ m_bOwnedBitmap = FALSE;
+}
+FX_BOOL CFX_FxgeDevice::Attach(CFX_DIBitmap* pBitmap, int dither_bits, FX_BOOL bRgbByteOrder, CFX_DIBitmap* pOriDevice, FX_BOOL bGroupKnockout)
+{
+ if (pBitmap == NULL) {
+ return FALSE;
+ }
+ SetBitmap(pBitmap);
+ IFX_RenderDeviceDriver* pDriver = FX_NEW CFX_AggDeviceDriver(pBitmap, dither_bits, bRgbByteOrder, pOriDevice, bGroupKnockout);
+ if (!pDriver) {
+ return FALSE;
+ }
+ SetDeviceDriver(pDriver);
+ return TRUE;
+}
+FX_BOOL CFX_FxgeDevice::Create(int width, int height, FXDIB_Format format, int dither_bits, CFX_DIBitmap* pOriDevice)
+{
+ m_bOwnedBitmap = TRUE;
+ CFX_DIBitmap* pBitmap = FX_NEW CFX_DIBitmap;
+ if (!pBitmap) {
+ return FALSE;
+ }
+ if (!pBitmap->Create(width, height, format)) {
+ delete pBitmap;
+ return FALSE;
+ }
+ SetBitmap(pBitmap);
+ IFX_RenderDeviceDriver* pDriver = FX_NEW CFX_AggDeviceDriver(pBitmap, dither_bits, FALSE, pOriDevice, FALSE);
+ if (!pDriver) {
+ return FALSE;
+ }
+ SetDeviceDriver(pDriver);
+ return TRUE;
+}
+CFX_FxgeDevice::~CFX_FxgeDevice()
+{
+ if (m_bOwnedBitmap && GetBitmap()) {
+ delete GetBitmap();
+ }
+}
diff --git a/core/src/fxge/agg/agg23/fx_agg_path_storage.cpp b/core/src/fxge/agg/agg23/fx_agg_path_storage.cpp
new file mode 100644
index 0000000000..8c4b701ebe
--- /dev/null
+++ b/core/src/fxge/agg/agg23/fx_agg_path_storage.cpp
@@ -0,0 +1,104 @@
+
+//----------------------------------------------------------------------------
+// XYQ: 2006-01-22 Copied from AGG project.
+// TODO: This file uses intensive floating point operations, so it's NOT suitable
+// for platforms like Symbian OS. We need to change to FIX format.
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+// mcseemagg@yahoo.com
+// http://www.antigrain.com
+//----------------------------------------------------------------------------
+//
+// Class path_storage
+//
+//----------------------------------------------------------------------------
+#include "../../../../include/fxcrt/fx_basic.h"
+#include "agg_path_storage.h"
+#include "agg_math.h"
+namespace agg
+{
+path_storage::~path_storage()
+{
+ if(m_total_blocks) {
+ FX_FLOAT** coord_blk = m_coord_blocks + m_total_blocks - 1;
+ while(m_total_blocks--) {
+ FX_Free(*coord_blk);
+ --coord_blk;
+ }
+ FX_Free(m_coord_blocks);
+ }
+}
+path_storage::path_storage() :
+ m_total_vertices(0),
+ m_total_blocks(0),
+ m_max_blocks(0),
+ m_coord_blocks(0),
+ m_cmd_blocks(0),
+ m_iterator(0)
+{
+}
+void path_storage::allocate_block(unsigned nb)
+{
+ if(nb >= m_max_blocks) {
+ FX_FLOAT** new_coords =
+ FX_Alloc( FX_FLOAT*, (m_max_blocks + block_pool) * 2);
+ if (!new_coords) {
+ return;
+ }
+ unsigned char** new_cmds =
+ (unsigned char**)(new_coords + m_max_blocks + block_pool);
+ if(m_coord_blocks) {
+ FXSYS_memcpy32(new_coords,
+ m_coord_blocks,
+ m_max_blocks * sizeof(FX_FLOAT*));
+ FXSYS_memcpy32(new_cmds,
+ m_cmd_blocks,
+ m_max_blocks * sizeof(unsigned char*));
+ FX_Free(m_coord_blocks);
+ }
+ m_coord_blocks = new_coords;
+ m_cmd_blocks = new_cmds;
+ m_max_blocks += block_pool;
+ }
+ m_coord_blocks[nb] =
+ FX_Alloc( FX_FLOAT, block_size * 2 +
+ block_size /
+ (sizeof(FX_FLOAT) / sizeof(unsigned char)));
+ if (!m_coord_blocks[nb]) {
+ return;
+ }
+ m_cmd_blocks[nb] =
+ (unsigned char*)(m_coord_blocks[nb] + block_size * 2);
+ m_total_blocks++;
+}
+void path_storage::rewind(unsigned path_id)
+{
+ m_iterator = path_id;
+}
+void path_storage::curve4(FX_FLOAT x_ctrl1, FX_FLOAT y_ctrl1,
+ FX_FLOAT x_ctrl2, FX_FLOAT y_ctrl2,
+ FX_FLOAT x_to, FX_FLOAT y_to)
+{
+ add_vertex(x_ctrl1, y_ctrl1, path_cmd_curve4);
+ add_vertex(x_ctrl2, y_ctrl2, path_cmd_curve4);
+ add_vertex(x_to, y_to, path_cmd_curve4);
+}
+void path_storage::end_poly()
+{
+ if(m_total_vertices) {
+ if(is_vertex(command(m_total_vertices - 1))) {
+ add_vertex(0, 0, path_cmd_end_poly | path_flags_close);
+ }
+ }
+}
+}
diff --git a/core/src/fxge/agg/agg23/fx_agg_rasterizer_scanline_aa.cpp b/core/src/fxge/agg/agg23/fx_agg_rasterizer_scanline_aa.cpp
new file mode 100644
index 0000000000..634d10a3be
--- /dev/null
+++ b/core/src/fxge/agg/agg23/fx_agg_rasterizer_scanline_aa.cpp
@@ -0,0 +1,495 @@
+
+//----------------------------------------------------------------------------
+// XYQ: 2006-01-22 Copied from AGG project.
+// This file uses only integer data, so it's suitable for all platforms.
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+//
+// The author gratefully acknowleges the support of David Turner,
+// Robert Wilhelm, and Werner Lemberg - the authors of the FreeType
+// libray - in producing this work. See http://www.freetype.org for details.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+// mcseemagg@yahoo.com
+// http://www.antigrain.com
+//----------------------------------------------------------------------------
+//
+// Adaptation for 32-bit screen coordinates has been sponsored by
+// Liberty Technology Systems, Inc., visit http://lib-sys.com
+//
+// Liberty Technology Systems, Inc. is the provider of
+// PostScript and PDF technology for software developers.
+//
+//----------------------------------------------------------------------------
+//
+// Class outline_aa - implementation.
+//
+// Initially the rendering algorithm was designed by David Turner and the
+// other authors of the FreeType library - see the above notice. I nearly
+// created a similar renderer, but still I was far from David's work.
+// I completely redesigned the original code and adapted it for Anti-Grain
+// ideas. Two functions - render_line and render_hline are the core of
+// the algorithm - they calculate the exact coverage of each pixel cell
+// of the polygon. I left these functions almost as is, because there's
+// no way to improve the perfection - hats off to David and his group!
+//
+// All other code is very different from the original.
+//
+//----------------------------------------------------------------------------
+#include "../../../../include/fxcrt/fx_ext.h"
+#include <limits.h>
+#include "agg_rasterizer_scanline_aa.h"
+namespace agg
+{
+AGG_INLINE void cell_aa::set_cover(int c, int a)
+{
+ cover = c;
+ area = a;
+}
+AGG_INLINE void cell_aa::add_cover(int c, int a)
+{
+ cover += c;
+ area += a;
+}
+AGG_INLINE void cell_aa::set_coord(int cx, int cy)
+{
+ x = cx;
+ y = cy;
+}
+AGG_INLINE void cell_aa::set(int cx, int cy, int c, int a)
+{
+ x = cx;
+ y = cy;
+ cover = c;
+ area = a;
+}
+outline_aa::~outline_aa()
+{
+ if(m_num_blocks) {
+ cell_aa** ptr = m_cells + m_num_blocks - 1;
+ while(m_num_blocks--) {
+ FX_Free(*ptr);
+ ptr--;
+ }
+ FX_Free(m_cells);
+ }
+}
+outline_aa::outline_aa() :
+ m_num_blocks(0),
+ m_max_blocks(0),
+ m_cur_block(0),
+ m_num_cells(0),
+ m_cells(0),
+ m_cur_cell_ptr(0),
+ m_cur_x(0),
+ m_cur_y(0),
+ m_min_x(0x7FFFFFFF),
+ m_min_y(0x7FFFFFFF),
+ m_max_x(-0x7FFFFFFF),
+ m_max_y(-0x7FFFFFFF),
+ m_sorted(false)
+{
+ m_cur_cell.set(0x7FFF, 0x7FFF, 0, 0);
+}
+void outline_aa::reset()
+{
+ m_num_cells = 0;
+ m_cur_block = 0;
+ m_cur_cell.set(0x7FFF, 0x7FFF, 0, 0);
+ m_sorted = false;
+ m_min_x = 0x7FFFFFFF;
+ m_min_y = 0x7FFFFFFF;
+ m_max_x = -0x7FFFFFFF;
+ m_max_y = -0x7FFFFFFF;
+}
+void outline_aa::allocate_block()
+{
+ if(m_cur_block >= m_num_blocks) {
+ if(m_num_blocks >= m_max_blocks) {
+ cell_aa** new_cells = FX_Alloc( cell_aa*, m_max_blocks + cell_block_pool);
+ if (!new_cells) {
+ return;
+ }
+ if(m_cells) {
+ FXSYS_memcpy32(new_cells, m_cells, m_max_blocks * sizeof(cell_aa*));
+ FX_Free(m_cells);
+ }
+ m_cells = new_cells;
+ m_max_blocks += cell_block_pool;
+ }
+ m_cells[m_num_blocks++] = FX_Alloc(cell_aa, cell_block_size);
+ if (!m_cells[m_num_blocks - 1]) {
+ return;
+ }
+ }
+ m_cur_cell_ptr = m_cells[m_cur_block++];
+}
+AGG_INLINE void outline_aa::add_cur_cell()
+{
+ if(m_cur_cell.area | m_cur_cell.cover) {
+ if((m_num_cells & cell_block_mask) == 0) {
+ if(m_num_blocks >= cell_block_limit) {
+ return;
+ }
+ allocate_block();
+ }
+ *m_cur_cell_ptr++ = m_cur_cell;
+ ++m_num_cells;
+ }
+}
+AGG_INLINE void outline_aa::set_cur_cell(int x, int y)
+{
+ if(m_cur_cell.x != x || m_cur_cell.y != y) {
+ add_cur_cell();
+ m_cur_cell.set(x, y, 0, 0);
+ if(x < m_min_x) {
+ m_min_x = x;
+ }
+ if(x > m_max_x) {
+ m_max_x = x;
+ }
+ if(y < m_min_y) {
+ m_min_y = y;
+ }
+ if(y > m_max_y) {
+ m_max_y = y;
+ }
+ }
+}
+AGG_INLINE void outline_aa::render_hline(int ey, int x1, int y1, int x2, int y2)
+{
+ int ex1 = x1 >> poly_base_shift;
+ int ex2 = x2 >> poly_base_shift;
+ int fx1 = x1 & poly_base_mask;
+ int fx2 = x2 & poly_base_mask;
+ int delta, p, first, dx;
+ int incr, lift, mod, rem;
+ if(y1 == y2) {
+ set_cur_cell(ex2, ey);
+ return;
+ }
+ if(ex1 == ex2) {
+ delta = y2 - y1;
+ m_cur_cell.add_cover(delta, (fx1 + fx2) * delta);
+ return;
+ }
+ p = (poly_base_size - fx1) * (y2 - y1);
+ first = poly_base_size;
+ incr = 1;
+ dx = x2 - x1;
+ if(dx < 0) {
+ p = fx1 * (y2 - y1);
+ first = 0;
+ incr = -1;
+ dx = -dx;
+ }
+ delta = p / dx;
+ mod = p % dx;
+ if(mod < 0) {
+ delta--;
+ mod += dx;
+ }
+ m_cur_cell.add_cover(delta, (fx1 + first) * delta);
+ ex1 += incr;
+ set_cur_cell(ex1, ey);
+ y1 += delta;
+ if(ex1 != ex2) {
+ p = poly_base_size * (y2 - y1 + delta);
+ lift = p / dx;
+ rem = p % dx;
+ if (rem < 0) {
+ lift--;
+ rem += dx;
+ }
+ mod -= dx;
+ while (ex1 != ex2) {
+ delta = lift;
+ mod += rem;
+ if(mod >= 0) {
+ mod -= dx;
+ delta++;
+ }
+ m_cur_cell.add_cover(delta, (poly_base_size) * delta);
+ y1 += delta;
+ ex1 += incr;
+ set_cur_cell(ex1, ey);
+ }
+ }
+ delta = y2 - y1;
+ m_cur_cell.add_cover(delta, (fx2 + poly_base_size - first) * delta);
+}
+void outline_aa::render_line(int x1, int y1, int x2, int y2)
+{
+ enum dx_limit_e { dx_limit = 16384 << poly_base_shift };
+ int dx = x2 - x1;
+ if(dx >= dx_limit || dx <= -dx_limit) {
+ int cx = (x1 + x2) >> 1;
+ int cy = (y1 + y2) >> 1;
+ render_line(x1, y1, cx, cy);
+ render_line(cx, cy, x2, y2);
+ }
+ int dy = y2 - y1;
+ int ey1 = y1 >> poly_base_shift;
+ int ey2 = y2 >> poly_base_shift;
+ int fy1 = y1 & poly_base_mask;
+ int fy2 = y2 & poly_base_mask;
+ int x_from, x_to;
+ int p, rem, mod, lift, delta, first, incr;
+ if(ey1 == ey2) {
+ render_hline(ey1, x1, fy1, x2, fy2);
+ return;
+ }
+ incr = 1;
+ if(dx == 0) {
+ int ex = x1 >> poly_base_shift;
+ int two_fx = (x1 - (ex << poly_base_shift)) << 1;
+ int area;
+ first = poly_base_size;
+ if(dy < 0) {
+ first = 0;
+ incr = -1;
+ }
+ x_from = x1;
+ delta = first - fy1;
+ m_cur_cell.add_cover(delta, two_fx * delta);
+ ey1 += incr;
+ set_cur_cell(ex, ey1);
+ delta = first + first - poly_base_size;
+ area = two_fx * delta;
+ while(ey1 != ey2) {
+ m_cur_cell.set_cover(delta, area);
+ ey1 += incr;
+ set_cur_cell(ex, ey1);
+ }
+ delta = fy2 - poly_base_size + first;
+ m_cur_cell.add_cover(delta, two_fx * delta);
+ return;
+ }
+ p = (poly_base_size - fy1) * dx;
+ first = poly_base_size;
+ if(dy < 0) {
+ p = fy1 * dx;
+ first = 0;
+ incr = -1;
+ dy = -dy;
+ }
+ delta = p / dy;
+ mod = p % dy;
+ if(mod < 0) {
+ delta--;
+ mod += dy;
+ }
+ x_from = x1 + delta;
+ render_hline(ey1, x1, fy1, x_from, first);
+ ey1 += incr;
+ set_cur_cell(x_from >> poly_base_shift, ey1);
+ if(ey1 != ey2) {
+ p = poly_base_size * dx;
+ lift = p / dy;
+ rem = p % dy;
+ if(rem < 0) {
+ lift--;
+ rem += dy;
+ }
+ mod -= dy;
+ while(ey1 != ey2) {
+ delta = lift;
+ mod += rem;
+ if (mod >= 0) {
+ mod -= dy;
+ delta++;
+ }
+ x_to = x_from + delta;
+ render_hline(ey1, x_from, poly_base_size - first, x_to, first);
+ x_from = x_to;
+ ey1 += incr;
+ set_cur_cell(x_from >> poly_base_shift, ey1);
+ }
+ }
+ render_hline(ey1, x_from, poly_base_size - first, x2, fy2);
+}
+void outline_aa::move_to(int x, int y)
+{
+ if(m_sorted) {
+ reset();
+ }
+ set_cur_cell(x >> poly_base_shift, y >> poly_base_shift);
+ m_cur_x = x;
+ m_cur_y = y;
+}
+void outline_aa::line_to(int x, int y)
+{
+ render_line(m_cur_x, m_cur_y, x, y);
+ m_cur_x = x;
+ m_cur_y = y;
+ m_sorted = false;
+}
+template <class T> static AGG_INLINE void swap_cells(T* a, T* b)
+{
+ T temp = *a;
+ *a = *b;
+ *b = temp;
+}
+enum {
+ qsort_threshold = 9
+};
+static void qsort_cells(cell_aa** start, unsigned num)
+{
+ cell_aa** stack[80];
+ cell_aa*** top;
+ cell_aa** limit;
+ cell_aa** base;
+ limit = start + num;
+ base = start;
+ top = stack;
+ for (;;) {
+ int len = int(limit - base);
+ cell_aa** i;
+ cell_aa** j;
+ cell_aa** pivot;
+ if(len > qsort_threshold) {
+ pivot = base + len / 2;
+ swap_cells(base, pivot);
+ i = base + 1;
+ j = limit - 1;
+ if((*j)->x < (*i)->x) {
+ swap_cells(i, j);
+ }
+ if((*base)->x < (*i)->x) {
+ swap_cells(base, i);
+ }
+ if((*j)->x < (*base)->x) {
+ swap_cells(base, j);
+ }
+ for(;;) {
+ int x = (*base)->x;
+ do {
+ i++;
+ } while( (*i)->x < x );
+ do {
+ j--;
+ } while( x < (*j)->x );
+ if(i > j) {
+ break;
+ }
+ swap_cells(i, j);
+ }
+ swap_cells(base, j);
+ if(j - base > limit - i) {
+ top[0] = base;
+ top[1] = j;
+ base = i;
+ } else {
+ top[0] = i;
+ top[1] = limit;
+ limit = j;
+ }
+ top += 2;
+ } else {
+ j = base;
+ i = j + 1;
+ for(; i < limit; j = i, i++) {
+ for(; j[1]->x < (*j)->x; j--) {
+ swap_cells(j + 1, j);
+ if (j == base) {
+ break;
+ }
+ }
+ }
+ if(top > stack) {
+ top -= 2;
+ base = top[0];
+ limit = top[1];
+ } else {
+ break;
+ }
+ }
+ }
+}
+void outline_aa::sort_cells()
+{
+ if(m_sorted) {
+ return;
+ }
+ add_cur_cell();
+ if(m_num_cells == 0) {
+ return;
+ }
+ m_sorted_cells.allocate(m_num_cells, 16);
+ if (m_max_y > 0 && m_min_y < 0 && -m_min_y > INT_MAX - m_max_y) {
+ return;
+ }
+ unsigned size = m_max_y - m_min_y;
+ if (size + 1 < size) {
+ return;
+ }
+ size++;
+ m_sorted_y.allocate(size, 16);
+ m_sorted_y.zero();
+ cell_aa** block_ptr = m_cells;
+ cell_aa* cell_ptr = NULL;
+ unsigned nb = m_num_cells >> cell_block_shift;
+ unsigned i;
+ while(nb--) {
+ cell_ptr = *block_ptr++;
+ i = cell_block_size;
+ while(i--) {
+ m_sorted_y[cell_ptr->y - m_min_y].start++;
+ ++cell_ptr;
+ }
+ }
+ i = m_num_cells & cell_block_mask;
+ if (i) {
+ cell_ptr = *block_ptr++;
+ }
+ while(i--) {
+ m_sorted_y[cell_ptr->y - m_min_y].start++;
+ ++cell_ptr;
+ }
+ unsigned start = 0;
+ for(i = 0; i < m_sorted_y.size(); i++) {
+ unsigned v = m_sorted_y[i].start;
+ m_sorted_y[i].start = start;
+ start += v;
+ }
+ block_ptr = m_cells;
+ nb = m_num_cells >> cell_block_shift;
+ while(nb--) {
+ cell_ptr = *block_ptr++;
+ i = cell_block_size;
+ while(i--) {
+ sorted_y& cur_y = m_sorted_y[cell_ptr->y - m_min_y];
+ m_sorted_cells[cur_y.start + cur_y.num] = cell_ptr;
+ ++cur_y.num;
+ ++cell_ptr;
+ }
+ }
+ i = m_num_cells & cell_block_mask;
+ if (i) {
+ cell_ptr = *block_ptr++;
+ }
+ while(i--) {
+ sorted_y& cur_y = m_sorted_y[cell_ptr->y - m_min_y];
+ m_sorted_cells[cur_y.start + cur_y.num] = cell_ptr;
+ ++cur_y.num;
+ ++cell_ptr;
+ }
+ for(i = 0; i < m_sorted_y.size(); i++) {
+ const sorted_y& cur_y = m_sorted_y[i];
+ if(cur_y.num) {
+ qsort_cells(m_sorted_cells.data() + cur_y.start, cur_y.num);
+ }
+ }
+ m_sorted = true;
+}
+}
diff --git a/core/src/fxge/agg/agg23/fx_agg_vcgen_dash.cpp b/core/src/fxge/agg/agg23/fx_agg_vcgen_dash.cpp
new file mode 100644
index 0000000000..0b6c29051b
--- /dev/null
+++ b/core/src/fxge/agg/agg23/fx_agg_vcgen_dash.cpp
@@ -0,0 +1,176 @@
+
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+// mcseemagg@yahoo.com
+// http://www.antigrain.com
+//----------------------------------------------------------------------------
+//
+// Line dash generator
+//
+//----------------------------------------------------------------------------
+#include "../../../../include/fxcrt/fx_basic.h"
+#include "agg_vcgen_dash.h"
+#include "agg_shorten_path.h"
+namespace agg
+{
+vcgen_dash::vcgen_dash() :
+ m_total_dash_len(0),
+ m_num_dashes(0),
+ m_dash_start(0),
+ m_shorten(0),
+ m_curr_dash_start(0),
+ m_curr_dash(0),
+ m_src_vertices(),
+ m_closed(0),
+ m_status(initial),
+ m_src_vertex(0)
+{
+}
+void vcgen_dash::remove_all_dashes()
+{
+ m_total_dash_len = 0;
+ m_num_dashes = 0;
+ m_curr_dash_start = 0;
+ m_curr_dash = 0;
+}
+void vcgen_dash::add_dash(FX_FLOAT dash_len, FX_FLOAT gap_len)
+{
+ if(m_num_dashes < max_dashes) {
+ m_total_dash_len += dash_len + gap_len;
+ m_dashes[m_num_dashes++] = dash_len;
+ m_dashes[m_num_dashes++] = gap_len;
+ }
+}
+void vcgen_dash::dash_start(FX_FLOAT ds)
+{
+ m_dash_start = ds;
+ calc_dash_start(FXSYS_fabs(ds));
+}
+void vcgen_dash::calc_dash_start(FX_FLOAT ds)
+{
+ m_curr_dash = 0;
+ m_curr_dash_start = 0;
+ while(ds > 0) {
+ if(ds > m_dashes[m_curr_dash]) {
+ ds -= m_dashes[m_curr_dash];
+ ++m_curr_dash;
+ m_curr_dash_start = 0;
+ if(m_curr_dash >= m_num_dashes) {
+ m_curr_dash = 0;
+ }
+ } else {
+ m_curr_dash_start = ds;
+ ds = 0;
+ }
+ }
+}
+void vcgen_dash::remove_all()
+{
+ m_status = initial;
+ m_src_vertices.remove_all();
+ m_closed = 0;
+}
+void vcgen_dash::add_vertex(FX_FLOAT x, FX_FLOAT y, unsigned cmd)
+{
+ m_status = initial;
+ if(is_move_to(cmd)) {
+ m_src_vertices.modify_last(vertex_dist(x, y));
+ } else {
+ if(is_vertex(cmd)) {
+ m_src_vertices.add(vertex_dist(x, y));
+ } else {
+ m_closed = get_close_flag(cmd);
+ }
+ }
+}
+void vcgen_dash::rewind(unsigned)
+{
+ if(m_status == initial) {
+ m_src_vertices.close(m_closed != 0);
+ shorten_path(m_src_vertices, m_shorten, m_closed);
+ }
+ m_status = ready;
+ m_src_vertex = 0;
+}
+unsigned vcgen_dash::vertex(FX_FLOAT* x, FX_FLOAT* y)
+{
+ unsigned cmd = path_cmd_move_to;
+ while(!is_stop(cmd)) {
+ switch(m_status) {
+ case initial:
+ rewind(0);
+ case ready:
+ if(m_num_dashes < 2 || m_src_vertices.size() < 2) {
+ cmd = path_cmd_stop;
+ break;
+ }
+ m_status = polyline;
+ m_src_vertex = 1;
+ m_v1 = &m_src_vertices[0];
+ m_v2 = &m_src_vertices[1];
+ m_curr_rest = m_v1->dist;
+ *x = m_v1->x;
+ *y = m_v1->y;
+ if(m_dash_start >= 0) {
+ calc_dash_start(m_dash_start);
+ }
+ return path_cmd_move_to;
+ case polyline: {
+ FX_FLOAT dash_rest = m_dashes[m_curr_dash] - m_curr_dash_start;
+ unsigned cmd = (m_curr_dash & 1) ?
+ path_cmd_move_to :
+ path_cmd_line_to;
+ if(m_curr_rest > dash_rest) {
+ m_curr_rest -= dash_rest;
+ ++m_curr_dash;
+ if(m_curr_dash >= m_num_dashes) {
+ m_curr_dash = 0;
+ }
+ m_curr_dash_start = 0;
+ *x = m_v2->x - (m_v2->x - m_v1->x) * m_curr_rest / m_v1->dist;
+ *y = m_v2->y - (m_v2->y - m_v1->y) * m_curr_rest / m_v1->dist;
+ } else {
+ m_curr_dash_start += m_curr_rest;
+ *x = m_v2->x;
+ *y = m_v2->y;
+ ++m_src_vertex;
+ m_v1 = m_v2;
+ m_curr_rest = m_v1->dist;
+ if(m_closed) {
+ if(m_src_vertex > m_src_vertices.size()) {
+ m_status = stop;
+ } else {
+ m_v2 = &m_src_vertices
+ [
+ (m_src_vertex >= m_src_vertices.size()) ? 0 :
+ m_src_vertex
+ ];
+ }
+ } else {
+ if(m_src_vertex >= m_src_vertices.size()) {
+ m_status = stop;
+ } else {
+ m_v2 = &m_src_vertices[m_src_vertex];
+ }
+ }
+ }
+ return cmd;
+ }
+ break;
+ case stop:
+ cmd = path_cmd_stop;
+ break;
+ }
+ }
+ return path_cmd_stop;
+}
+}
diff --git a/core/src/fxge/agg/agg23/fx_agg_vcgen_stroke.cpp b/core/src/fxge/agg/agg23/fx_agg_vcgen_stroke.cpp
new file mode 100644
index 0000000000..425ac45aca
--- /dev/null
+++ b/core/src/fxge/agg/agg23/fx_agg_vcgen_stroke.cpp
@@ -0,0 +1,214 @@
+
+//----------------------------------------------------------------------------
+// XYQ: 2006-01-22 Copied from AGG project.
+// TODO: This file uses intensive floating point operations, so it's NOT suitable
+// for platforms like Symbian OS. We need to change to FIX format.
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.3
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+// mcseemagg@yahoo.com
+// http://www.antigrain.com
+//----------------------------------------------------------------------------
+//
+// Stroke generator
+//
+//----------------------------------------------------------------------------
+#include "../../../../include/fxcrt/fx_basic.h"
+#include "agg_vcgen_stroke.h"
+namespace agg
+{
+
+vcgen_stroke::vcgen_stroke() :
+ m_src_vertices(),
+ m_out_vertices(),
+ m_width(0.5f),
+ m_miter_limit(4 * 1.0f),
+ m_inner_miter_limit(1.0f + 1.0f / 100),
+ m_approx_scale(1.0f),
+ m_line_cap(butt_cap),
+ m_line_join(miter_join),
+ m_inner_join(inner_miter),
+ m_closed(0),
+ m_status(initial),
+ m_src_vertex(0),
+ m_out_vertex(0)
+{
+}
+void vcgen_stroke::remove_all()
+{
+ m_src_vertices.remove_all();
+ m_closed = 0;
+ m_status = initial;
+}
+void vcgen_stroke::add_vertex(FX_FLOAT x, FX_FLOAT y, unsigned cmd)
+{
+ m_status = initial;
+ if(is_move_to(cmd)) {
+ m_src_vertices.modify_last(vertex_dist_cmd(x, y, cmd));
+ } else {
+ if(is_vertex(cmd)) {
+ m_src_vertices.add(vertex_dist_cmd(x, y, cmd));
+ } else {
+ m_closed = get_close_flag(cmd);
+ }
+ }
+}
+static inline void calc_butt_cap(FX_FLOAT* cap,
+ const vertex_dist& v0,
+ const vertex_dist& v1,
+ FX_FLOAT len,
+ FX_FLOAT width)
+{
+ FX_FLOAT dx = FXSYS_MulDiv(v1.y - v0.y, width, len);
+ FX_FLOAT dy = FXSYS_MulDiv(v1.x - v0.x, width, len);
+ cap[0] = v0.x - dx;
+ cap[1] = v0.y + dy;
+ cap[2] = v0.x + dx;
+ cap[3] = v0.y - dy;
+}
+void vcgen_stroke::rewind(unsigned)
+{
+ if(m_status == initial) {
+ m_src_vertices.close(m_closed != 0);
+ if(m_src_vertices.size() < 3) {
+ m_closed = 0;
+ }
+ }
+ m_status = ready;
+ m_src_vertex = 0;
+ m_out_vertex = 0;
+}
+unsigned vcgen_stroke::vertex(FX_FLOAT* x, FX_FLOAT* y)
+{
+ unsigned cmd = path_cmd_line_to;
+ line_join_e curj;
+ while(!is_stop(cmd)) {
+ switch(m_status) {
+ case initial:
+ rewind(0);
+ case ready:
+ if(m_src_vertices.size() < 2 + unsigned(m_closed != 0)) {
+ cmd = path_cmd_stop;
+ break;
+ }
+ m_status = m_closed ? outline1 : cap1;
+ cmd = path_cmd_move_to;
+ m_src_vertex = 0;
+ m_out_vertex = 0;
+ break;
+ case cap1:
+ stroke_calc_cap(m_out_vertices,
+ m_src_vertices[0],
+ m_src_vertices[1],
+ m_src_vertices[0].dist,
+ m_line_cap,
+ m_width,
+ m_approx_scale);
+ m_src_vertex = 1;
+ m_prev_status = outline1;
+ m_status = out_vertices;
+ m_out_vertex = 0;
+ break;
+ case cap2:
+ stroke_calc_cap(m_out_vertices,
+ m_src_vertices[m_src_vertices.size() - 1],
+ m_src_vertices[m_src_vertices.size() - 2],
+ m_src_vertices[m_src_vertices.size() - 2].dist,
+ m_line_cap,
+ m_width,
+ m_approx_scale);
+ m_prev_status = outline2;
+ m_status = out_vertices;
+ m_out_vertex = 0;
+ break;
+ case outline1:
+ if(m_closed) {
+ if(m_src_vertex >= m_src_vertices.size()) {
+ m_prev_status = close_first;
+ m_status = end_poly1;
+ break;
+ }
+ } else {
+ if(m_src_vertex >= m_src_vertices.size() - 1) {
+ m_status = cap2;
+ break;
+ }
+ }
+ curj = m_src_vertices[m_src_vertex].cmd & path_flags_jr ? miter_join_round : m_line_join;
+ stroke_calc_join(m_out_vertices,
+ m_src_vertices.prev(m_src_vertex),
+ m_src_vertices.curr(m_src_vertex),
+ m_src_vertices.next(m_src_vertex),
+ m_src_vertices.prev(m_src_vertex).dist,
+ m_src_vertices.curr(m_src_vertex).dist,
+ m_width,
+ curj,
+ m_inner_join,
+ m_miter_limit,
+ m_inner_miter_limit,
+ m_approx_scale);
+ ++m_src_vertex;
+ m_prev_status = m_status;
+ m_status = out_vertices;
+ m_out_vertex = 0;
+ break;
+ case close_first:
+ m_status = outline2;
+ cmd = path_cmd_move_to;
+ case outline2:
+ if(m_src_vertex <= unsigned(m_closed == 0)) {
+ m_status = end_poly2;
+ m_prev_status = stop;
+ break;
+ }
+ --m_src_vertex;
+ curj = m_src_vertices[m_src_vertex].cmd & path_flags_jr ? miter_join_round : m_line_join;
+ stroke_calc_join(m_out_vertices,
+ m_src_vertices.next(m_src_vertex),
+ m_src_vertices.curr(m_src_vertex),
+ m_src_vertices.prev(m_src_vertex),
+ m_src_vertices.curr(m_src_vertex).dist,
+ m_src_vertices.prev(m_src_vertex).dist,
+ m_width,
+ curj,
+ m_inner_join,
+ m_miter_limit,
+ m_inner_miter_limit,
+ m_approx_scale);
+ m_prev_status = m_status;
+ m_status = out_vertices;
+ m_out_vertex = 0;
+ break;
+ case out_vertices:
+ if(m_out_vertex >= m_out_vertices.size()) {
+ m_status = m_prev_status;
+ } else {
+ const point_type& c = m_out_vertices[m_out_vertex++];
+ *x = c.x;
+ *y = c.y;
+ return cmd;
+ }
+ break;
+ case end_poly1:
+ m_status = m_prev_status;
+ return path_cmd_end_poly | path_flags_close | path_flags_ccw;
+ case end_poly2:
+ m_status = m_prev_status;
+ return path_cmd_end_poly | path_flags_close | path_flags_cw;
+ case stop:
+ cmd = path_cmd_stop;
+ break;
+ }
+ }
+ return cmd;
+}
+}
diff --git a/core/src/fxge/agg/include/fx_agg_driver.h b/core/src/fxge/agg/include/fx_agg_driver.h
new file mode 100644
index 0000000000..c3411905b9
--- /dev/null
+++ b/core/src/fxge/agg/include/fx_agg_driver.h
@@ -0,0 +1,121 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FX_AGG_DEVICE_DRIVER_
+#define _FX_AGG_DEVICE_DRIVER_
+#include "fxfx_agg_path_storage.h"
+#include "fxfx_agg_rasterizer_scanline_aa.h"
+class CAgg_PathData : public CFX_Object
+{
+public:
+ CAgg_PathData() {}
+ ~CAgg_PathData() {}
+ FX_NAMESPACE_DECLARE(agg, path_storage) m_PathData;
+ void BuildPath(const CFX_PathData* pPathData, const CFX_AffineMatrix* pObject2Device);
+};
+class CFX_AggDeviceDriver : public IFX_RenderDeviceDriver
+{
+public:
+ CFX_AggDeviceDriver(CFX_DIBitmap* pBitmap, int dither_bits, FX_BOOL bRgbByteOrder, CFX_DIBitmap* pOriDevice, FX_BOOL bGroupKnockout);
+ virtual ~CFX_AggDeviceDriver();
+ void InitPlatform();
+ void DestroyPlatform();
+
+
+ virtual int GetDeviceCaps(int caps_id);
+
+
+ virtual void SaveState();
+ virtual void RestoreState(FX_BOOL bKeepSaved);
+
+
+ virtual FX_BOOL SetClip_PathFill(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ int fill_mode
+ );
+
+
+ virtual FX_BOOL SetClip_PathStroke(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ const CFX_GraphStateData* pGraphState
+ );
+
+
+ virtual FX_BOOL DrawPath(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ const CFX_GraphStateData* pGraphState,
+ FX_DWORD fill_color,
+ FX_DWORD stroke_color,
+ int fill_mode,
+ int alpha_flag,
+ void* pIccTransform,
+ int blend_type
+ );
+
+ virtual FX_BOOL SetPixel(int x, int y, FX_DWORD color,
+ int alpha_flag, void* pIccTransform);
+
+ virtual FX_BOOL FillRect(const FX_RECT* pRect,
+ FX_DWORD fill_color, int alpha_flag, void* pIccTransform, int blend_type);
+
+
+ virtual FX_BOOL DrawCosmeticLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2, FX_DWORD color,
+ int alpha_flag, void* pIccTransform, int blend_type)
+ {
+ return FALSE;
+ }
+
+ virtual FX_BOOL GetClipBox(FX_RECT* pRect);
+
+
+ virtual FX_BOOL GetDIBits(CFX_DIBitmap* pBitmap, int left, int top, void* pIccTransform = NULL, FX_BOOL bDEdge = FALSE);
+ virtual CFX_DIBitmap* GetBackDrop()
+ {
+ return m_pOriDevice;
+ }
+
+ virtual FX_BOOL SetDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, const FX_RECT* pSrcRect, int left, int top, int blend_type,
+ int alpha_flag, void* pIccTransform);
+ virtual FX_BOOL StretchDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, int dest_left, int dest_top,
+ int dest_width, int dest_height, const FX_RECT* pClipRect, FX_DWORD flags,
+ int alpha_flag, void* pIccTransform, int blend_type);
+
+ virtual FX_BOOL StartDIBits(const CFX_DIBSource* pBitmap, int bitmap_alpha, FX_DWORD color,
+ const CFX_AffineMatrix* pMatrix, FX_DWORD flags, FX_LPVOID& handle,
+ int alpha_flag, void* pIccTransform, int blend_type);
+ virtual FX_BOOL ContinueDIBits(FX_LPVOID handle, IFX_Pause* pPause);
+ virtual void CancelDIBits(FX_LPVOID handle);
+
+ virtual FX_BOOL DrawDeviceText(int nChars, const FXTEXT_CHARPOS* pCharPos, CFX_Font* pFont,
+ CFX_FontCache* pCache, const CFX_AffineMatrix* pObject2Device, FX_FLOAT font_size, FX_DWORD color,
+ int alpha_flag, void* pIccTransform);
+ virtual FX_BOOL RenderRasterizer(FX_NAMESPACE_DECLARE(agg, rasterizer_scanline_aa)& rasterizer, FX_DWORD color, FX_BOOL bFullCover, FX_BOOL bGroupKnockout,
+ int alpha_flag, void* pIccTransform);
+
+ void SetClipMask(FX_NAMESPACE_DECLARE(agg, rasterizer_scanline_aa)& rasterizer);
+
+ virtual FX_LPBYTE GetBuffer() const
+ {
+ return m_pBitmap->GetBuffer();
+ }
+ virtual int GetDriverType()
+ {
+ return 1;
+ }
+
+ CFX_DIBitmap* m_pBitmap;
+ CFX_ClipRgn* m_pClipRgn;
+ CFX_PtrArray m_StateStack;
+ void* m_pPlatformGraphics;
+ void* m_pPlatformBitmap;
+ void* m_pDwRenderTartget;
+ int m_FillFlags;
+ int m_DitherBits;
+ FX_BOOL m_bRgbByteOrder;
+ CFX_DIBitmap* m_pOriDevice;
+ FX_BOOL m_bGroupKnockout;
+};
+#endif
diff --git a/core/src/fxge/agg/include/fxfx_agg_basics.h b/core/src/fxge/agg/include/fxfx_agg_basics.h
new file mode 100644
index 0000000000..57fbd2ebb9
--- /dev/null
+++ b/core/src/fxge/agg/include/fxfx_agg_basics.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXFX_AGG_BASICS_H_
+#define _FXFX_AGG_BASICS_H_
+#include "../agg23/agg_basics.h"
+#endif
diff --git a/core/src/fxge/agg/include/fxfx_agg_clip_liang_barsky.h b/core/src/fxge/agg/include/fxfx_agg_clip_liang_barsky.h
new file mode 100644
index 0000000000..948b619355
--- /dev/null
+++ b/core/src/fxge/agg/include/fxfx_agg_clip_liang_barsky.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXFX_AGG_CLIP_LIANG_BARSKY_H_
+#define _FXFX_AGG_CLIP_LIANG_BARSKY_H_
+#include "../agg23/agg_clip_liang_barsky.h"
+#endif
diff --git a/core/src/fxge/agg/include/fxfx_agg_conv_dash.h b/core/src/fxge/agg/include/fxfx_agg_conv_dash.h
new file mode 100644
index 0000000000..5f80a06e19
--- /dev/null
+++ b/core/src/fxge/agg/include/fxfx_agg_conv_dash.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXFX_AGG_CONV_DASH_H_
+#define _FXFX_AGG_CONV_DASH_H_
+#include "../agg23/agg_conv_dash.h"
+#endif
diff --git a/core/src/fxge/agg/include/fxfx_agg_conv_stroke.h b/core/src/fxge/agg/include/fxfx_agg_conv_stroke.h
new file mode 100644
index 0000000000..de38386ea2
--- /dev/null
+++ b/core/src/fxge/agg/include/fxfx_agg_conv_stroke.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXFX_AGG_CONV_STROKE_H_
+#define _FXFX_AGG_CONV_STROKE_H_
+#include "../agg23/agg_conv_stroke.h"
+#endif
diff --git a/core/src/fxge/agg/include/fxfx_agg_curves.h b/core/src/fxge/agg/include/fxfx_agg_curves.h
new file mode 100644
index 0000000000..54efaa2b26
--- /dev/null
+++ b/core/src/fxge/agg/include/fxfx_agg_curves.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXFX_AGG_CURVERS_H_
+#define _FXFX_AGG_CURVERS_H_
+#include "../agg23/agg_curves.h"
+#endif
diff --git a/core/src/fxge/agg/include/fxfx_agg_path_storage.h b/core/src/fxge/agg/include/fxfx_agg_path_storage.h
new file mode 100644
index 0000000000..9168eb26a8
--- /dev/null
+++ b/core/src/fxge/agg/include/fxfx_agg_path_storage.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXFX_AGG_PATH_STORAGE_H_
+#define _FXFX_AGG_PATH_STORAGE_H_
+#include "../agg23/agg_path_storage.h"
+#endif
diff --git a/core/src/fxge/agg/include/fxfx_agg_rasterizer_scanline_aa.h b/core/src/fxge/agg/include/fxfx_agg_rasterizer_scanline_aa.h
new file mode 100644
index 0000000000..3f61cec51a
--- /dev/null
+++ b/core/src/fxge/agg/include/fxfx_agg_rasterizer_scanline_aa.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXFX_AGG_RASTERIZER_SCANLINE_AA_H_
+#define _FXFX_AGG_RASTERIZER_SCANLINE_AA_H_
+#include "../agg23/agg_rasterizer_scanline_aa.h"
+#endif
diff --git a/core/src/fxge/agg/include/fxfx_agg_renderer_scanline.h b/core/src/fxge/agg/include/fxfx_agg_renderer_scanline.h
new file mode 100644
index 0000000000..11d8cbb0a8
--- /dev/null
+++ b/core/src/fxge/agg/include/fxfx_agg_renderer_scanline.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXFX_AGG_RENDER_SCANLINE_H_
+#define _FXFX_AGG_RENDER_SCANLINE_H_
+#include "../agg23/agg_renderer_scanline.h"
+#endif
diff --git a/core/src/fxge/agg/include/fxfx_agg_rendering_buffer.h b/core/src/fxge/agg/include/fxfx_agg_rendering_buffer.h
new file mode 100644
index 0000000000..eb6886e8de
--- /dev/null
+++ b/core/src/fxge/agg/include/fxfx_agg_rendering_buffer.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXFX_AGG_RENDERING_BUFFER_H_
+#define _FXFX_AGG_RENDERING_BUFFER_H_
+#include "../agg23/agg_rendering_buffer.h"
+#endif
diff --git a/core/src/fxge/agg/include/fxfx_agg_scanline_u.h b/core/src/fxge/agg/include/fxfx_agg_scanline_u.h
new file mode 100644
index 0000000000..cc7d2e7f75
--- /dev/null
+++ b/core/src/fxge/agg/include/fxfx_agg_scanline_u.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXFX_AGG_SCANLINE_U_H_
+#define _FXFX_AGG_SCANLINE_U_H_
+#include "../agg23/agg_scanline_u.h"
+#endif
diff --git a/core/src/fxge/agg/src/fxfx_agg_curves.cpp b/core/src/fxge/agg/src/fxfx_agg_curves.cpp
new file mode 100644
index 0000000000..83817f7680
--- /dev/null
+++ b/core/src/fxge/agg/src/fxfx_agg_curves.cpp
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../agg23/fx_agg_curves.cpp"
diff --git a/core/src/fxge/agg/src/fxfx_agg_driver.cpp b/core/src/fxge/agg/src/fxfx_agg_driver.cpp
new file mode 100644
index 0000000000..a4e6a30d44
--- /dev/null
+++ b/core/src/fxge/agg/src/fxfx_agg_driver.cpp
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../agg23/fx_agg_driver.cpp"
diff --git a/core/src/fxge/agg/src/fxfx_agg_path_storage.cpp b/core/src/fxge/agg/src/fxfx_agg_path_storage.cpp
new file mode 100644
index 0000000000..fabc526a24
--- /dev/null
+++ b/core/src/fxge/agg/src/fxfx_agg_path_storage.cpp
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../agg23/fx_agg_path_storage.cpp"
diff --git a/core/src/fxge/agg/src/fxfx_agg_rasterizer_scanline_aa.cpp b/core/src/fxge/agg/src/fxfx_agg_rasterizer_scanline_aa.cpp
new file mode 100644
index 0000000000..229e3ba93a
--- /dev/null
+++ b/core/src/fxge/agg/src/fxfx_agg_rasterizer_scanline_aa.cpp
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../agg23/fx_agg_rasterizer_scanline_aa.cpp"
diff --git a/core/src/fxge/agg/src/fxfx_agg_vcgen_dash.cpp b/core/src/fxge/agg/src/fxfx_agg_vcgen_dash.cpp
new file mode 100644
index 0000000000..4a259c022c
--- /dev/null
+++ b/core/src/fxge/agg/src/fxfx_agg_vcgen_dash.cpp
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../agg23/fx_agg_vcgen_dash.cpp"
diff --git a/core/src/fxge/agg/src/fxfx_agg_vcgen_stroke.cpp b/core/src/fxge/agg/src/fxfx_agg_vcgen_stroke.cpp
new file mode 100644
index 0000000000..2311e1abd2
--- /dev/null
+++ b/core/src/fxge/agg/src/fxfx_agg_vcgen_stroke.cpp
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../agg23/fx_agg_vcgen_stroke.cpp"
diff --git a/core/src/fxge/android/fpf_skiafont.cpp b/core/src/fxge/android/fpf_skiafont.cpp
new file mode 100644
index 0000000000..97eeb2f683
--- /dev/null
+++ b/core/src/fxge/android/fpf_skiafont.cpp
@@ -0,0 +1,203 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "fx_fpf.h"
+#if _FX_OS_ == _FX_ANDROID_
+#include "fpf_skiafont.h"
+#include "fpf_skiafontmgr.h"
+#define FPF_EM_ADJUST(em, a) (em == 0 ? (a) : (a) * 1000 / em)
+CFPF_SkiaFont::CFPF_SkiaFont()
+ : m_pFontMgr(NULL)
+ , m_pFontDes(NULL)
+ , m_Face(NULL)
+ , m_dwStyle(0)
+ , m_uCharset(0)
+ , m_dwRefCount(0)
+{
+}
+CFPF_SkiaFont::~CFPF_SkiaFont()
+{
+ if (m_Face) {
+ FXFT_Done_Face(m_Face);
+ }
+}
+void CFPF_SkiaFont::Release()
+{
+ if (--m_dwRefCount == 0) {
+ delete this;
+ }
+}
+IFPF_Font* CFPF_SkiaFont::Retain()
+{
+ m_dwRefCount++;
+ return (IFPF_Font*)this;
+}
+FPF_HFONT CFPF_SkiaFont::GetHandle()
+{
+ return NULL;
+}
+CFX_ByteString CFPF_SkiaFont::GetFamilyName()
+{
+ if (!m_Face) {
+ return CFX_ByteString();
+ }
+ return CFX_ByteString(FXFT_Get_Face_Family_Name(m_Face));
+}
+CFX_WideString CFPF_SkiaFont::GetPsName()
+{
+ if (!m_Face) {
+ return CFX_WideString();
+ }
+ return CFX_WideString::FromLocal(FXFT_Get_Postscript_Name(m_Face));
+}
+FX_INT32 CFPF_SkiaFont::GetGlyphIndex(FX_WCHAR wUnicode)
+{
+ if (!m_Face) {
+ return wUnicode;
+ }
+ if (FXFT_Select_Charmap(m_Face, FXFT_ENCODING_UNICODE)) {
+ return 0;
+ }
+ return FXFT_Get_Char_Index(m_Face, wUnicode);
+}
+FX_INT32 CFPF_SkiaFont::GetGlyphWidth(FX_INT32 iGlyphIndex)
+{
+ if (!m_Face) {
+ return 0;
+ }
+ if (FXFT_Load_Glyph(m_Face, iGlyphIndex, FXFT_LOAD_NO_SCALE | FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH)) {
+ return 0;
+ }
+ return FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Glyph_HoriAdvance(m_Face));
+}
+FX_INT32 CFPF_SkiaFont::GetAscent() const
+{
+ if (!m_Face) {
+ return 0;
+ }
+ return FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_Ascender(m_Face));
+}
+FX_INT32 CFPF_SkiaFont::GetDescent() const
+{
+ if (!m_Face) {
+ return 0;
+ }
+ return FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_Descender(m_Face));
+}
+FX_BOOL CFPF_SkiaFont::GetGlyphBBox(FX_INT32 iGlyphIndex, FX_RECT &rtBBox)
+{
+ if (!m_Face) {
+ return FALSE;
+ }
+ if (FXFT_Is_Face_Tricky(m_Face)) {
+ if (FXFT_Set_Char_Size(m_Face, 0, 1000 * 64, 72, 72)) {
+ return FALSE;
+ }
+ if (FXFT_Load_Glyph(m_Face, iGlyphIndex, FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH)) {
+ FXFT_Set_Pixel_Sizes(m_Face, 0, 64);
+ return FALSE;
+ }
+ FXFT_Glyph glyph;
+ if (FXFT_Get_Glyph(m_Face->glyph, &glyph)) {
+ FXFT_Set_Pixel_Sizes(m_Face, 0, 64);
+ return FALSE;
+ }
+ FXFT_BBox cbox;
+ FXFT_Glyph_Get_CBox(glyph, FXFT_GLYPH_BBOX_PIXELS, &cbox);
+ FX_INT32 x_ppem = m_Face->size->metrics.x_ppem;
+ FX_INT32 y_ppem = m_Face->size->metrics.y_ppem;
+ rtBBox.left = FPF_EM_ADJUST(x_ppem, cbox.xMin);
+ rtBBox.right = FPF_EM_ADJUST(x_ppem, cbox.xMax);
+ rtBBox.top = FPF_EM_ADJUST(y_ppem, cbox.yMax);
+ rtBBox.bottom = FPF_EM_ADJUST(y_ppem, cbox.yMin);
+ rtBBox.top = FX_MIN(rtBBox.top, GetAscent());
+ rtBBox.bottom = FX_MAX(rtBBox.bottom, GetDescent());
+ FXFT_Done_Glyph(glyph);
+ return FXFT_Set_Pixel_Sizes(m_Face, 0, 64) == 0;
+ }
+ if (FXFT_Load_Glyph(m_Face, iGlyphIndex, FXFT_LOAD_NO_SCALE | FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH)) {
+ return FALSE;
+ }
+ rtBBox.left = FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Glyph_HoriBearingX(m_Face));
+ rtBBox.bottom = FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Glyph_HoriBearingY(m_Face));
+ rtBBox.right = FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Glyph_HoriBearingX(m_Face) + FXFT_Get_Glyph_Width(m_Face));
+ rtBBox.top = FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Glyph_HoriBearingY(m_Face) - FXFT_Get_Glyph_Height(m_Face));
+ return TRUE;
+}
+FX_BOOL CFPF_SkiaFont::GetBBox(FX_RECT &rtBBox)
+{
+ if (!m_Face) {
+ return FALSE;
+ }
+ rtBBox.left = FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_xMin(m_Face));
+ rtBBox.top = FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_yMin(m_Face));
+ rtBBox.right = FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_xMax(m_Face));
+ rtBBox.bottom = FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_yMax(m_Face));
+ return TRUE;
+}
+FX_INT32 CFPF_SkiaFont::GetHeight() const
+{
+ if (!m_Face) {
+ return 0;
+ }
+ return FPF_EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_Height(m_Face));
+}
+FX_INT32 CFPF_SkiaFont::GetItalicAngle() const
+{
+ if (!m_Face) {
+ return 0;
+ }
+ TT_Postscript *ttInfo = (TT_Postscript*)FT_Get_Sfnt_Table(m_Face, ft_sfnt_post);
+ if (ttInfo) {
+ return ttInfo->italicAngle;
+ }
+ return 0;
+}
+FX_DWORD CFPF_SkiaFont::GetFontData(FX_DWORD dwTable, FX_LPBYTE pBuffer, FX_DWORD dwSize)
+{
+ if (!m_Face) {
+ return FALSE;
+ }
+ if (FXFT_Load_Sfnt_Table(m_Face, dwTable, 0, pBuffer, (unsigned long*)&dwSize)) {
+ return 0;
+ }
+ return dwSize;
+}
+FX_BOOL CFPF_SkiaFont::InitFont(CFPF_SkiaFontMgr *pFontMgr, CFPF_SkiaFontDescriptor *pFontDes, FX_BSTR bsFamily, FX_DWORD dwStyle, FX_BYTE uCharset)
+{
+ if (!pFontMgr || !pFontDes) {
+ return FALSE;
+ }
+ switch (pFontDes->GetType()) {
+ case FPF_SKIAFONTTYPE_Path: {
+ CFPF_SkiaPathFont *pFont = (CFPF_SkiaPathFont*)pFontDes;
+ m_Face = pFontMgr->GetFontFace(pFont->m_pPath, pFont->m_iFaceIndex);
+ }
+ break;
+ case FPF_SKIAFONTTYPE_File: {
+ CFPF_SkiaFileFont *pFont = (CFPF_SkiaFileFont*)pFontDes;
+ m_Face = pFontMgr->GetFontFace(pFont->m_pFile, pFont->m_iFaceIndex);
+ }
+ break;
+ case FPF_SKIAFONTTYPE_Buffer: {
+ CFPF_SkiaBufferFont *pFont = (CFPF_SkiaBufferFont*)pFontDes;
+ m_Face = pFontMgr->GetFontFace((FX_LPCBYTE)pFont->m_pBuffer, pFont->m_szBuffer, pFont->m_iFaceIndex);
+ }
+ break;
+ default:
+ return FALSE;
+ }
+ if (!m_Face) {
+ return FALSE;
+ }
+ m_dwStyle = dwStyle;
+ m_uCharset = uCharset;
+ m_pFontMgr = pFontMgr;
+ m_pFontDes = pFontDes;
+ m_dwRefCount = 1;
+ return TRUE;
+}
+#endif
diff --git a/core/src/fxge/android/fpf_skiafont.h b/core/src/fxge/android/fpf_skiafont.h
new file mode 100644
index 0000000000..1d1073c1fe
--- /dev/null
+++ b/core/src/fxge/android/fpf_skiafont.h
@@ -0,0 +1,57 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FPF_SKIA_FONT_H_
+#define _FPF_SKIA_FONT_H_
+#if _FX_OS_ == _FX_ANDROID_
+class CFPF_SkiaFontDescriptor;
+class CFPF_SkiaFontMgr;
+class SkTypeface;
+class CFPF_SkiaFont : public IFPF_Font, public CFX_Object
+{
+public:
+ CFPF_SkiaFont();
+ virtual ~CFPF_SkiaFont();
+ virtual void Release();
+ virtual IFPF_Font* Retain();
+
+ virtual FPF_HFONT GetHandle();
+
+ virtual CFX_ByteString GetFamilyName();
+ virtual CFX_WideString GetPsName();
+
+ virtual FX_DWORD GetFontStyle() const
+ {
+ return m_dwStyle;
+ }
+ virtual FX_BYTE GetCharset() const
+ {
+ return m_uCharset;
+ }
+
+ virtual FX_INT32 GetGlyphIndex(FX_WCHAR wUnicode);
+ virtual FX_INT32 GetGlyphWidth(FX_INT32 iGlyphIndex);
+
+ virtual FX_INT32 GetAscent() const;
+ virtual FX_INT32 GetDescent() const;
+
+ virtual FX_BOOL GetGlyphBBox(FX_INT32 iGlyphIndex, FX_RECT &rtBBox);
+ virtual FX_BOOL GetBBox(FX_RECT &rtBBox);
+
+ virtual FX_INT32 GetHeight() const;
+ virtual FX_INT32 GetItalicAngle() const;
+ virtual FX_DWORD GetFontData(FX_DWORD dwTable, FX_LPBYTE pBuffer, FX_DWORD dwSize);
+ FX_BOOL InitFont(CFPF_SkiaFontMgr *pFontMgr, CFPF_SkiaFontDescriptor *pFontDes, FX_BSTR bsFamily, FX_DWORD dwStyle, FX_BYTE uCharset);
+protected:
+ CFPF_SkiaFontMgr *m_pFontMgr;
+ CFPF_SkiaFontDescriptor *m_pFontDes;
+ FXFT_Face m_Face;
+ FX_DWORD m_dwStyle;
+ FX_BYTE m_uCharset;
+ FX_DWORD m_dwRefCount;
+};
+#endif
+#endif
diff --git a/core/src/fxge/android/fpf_skiafontmgr.cpp b/core/src/fxge/android/fpf_skiafontmgr.cpp
new file mode 100644
index 0000000000..cf93e5beaf
--- /dev/null
+++ b/core/src/fxge/android/fpf_skiafontmgr.cpp
@@ -0,0 +1,561 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "fx_fpf.h"
+#if _FX_OS_ == _FX_ANDROID_
+#define FPF_SKIAMATCHWEIGHT_NAME1 62
+#define FPF_SKIAMATCHWEIGHT_NAME2 60
+#define FPF_SKIAMATCHWEIGHT_1 16
+#define FPF_SKIAMATCHWEIGHT_2 8
+#include "fpf_skiafontmgr.h"
+#include "fpf_skiafont.h"
+#ifdef __cplusplus
+extern "C" {
+#endif
+static unsigned long FPF_SkiaStream_Read(FXFT_Stream stream, unsigned long offset, unsigned char* buffer, unsigned long count)
+{
+ IFX_FileRead *pFileRead = (IFX_FileRead*)stream->descriptor.pointer;
+ if (!pFileRead) {
+ return 0;
+ }
+ if (count > 0) {
+ if (pFileRead->ReadBlock(buffer, (FX_FILESIZE)offset, (size_t)count) != count) {
+ return 0;
+ }
+ }
+ return count;
+}
+static void FPF_SkiaStream_Close(FXFT_Stream stream)
+{
+}
+#ifdef __cplusplus
+};
+#endif
+typedef struct _FPF_SKIAFONTMAP {
+ FX_DWORD dwFamily;
+ FX_DWORD dwSubSt;
+} FPF_SKIAFONTMAP, *FPF_LPSKIAFONTMAP;
+typedef FPF_SKIAFONTMAP const * FPF_LPCSKIAFONTMAP;
+static const FPF_SKIAFONTMAP g_SkiaFontmap[] = {
+ {0x58c5083, 0xc8d2e345},
+ {0x5dfade2, 0xe1633081},
+ {0x684317d, 0xe1633081},
+ {0x14ee2d13, 0xc8d2e345},
+ {0x3918fe2d, 0xbbeeec72},
+ {0x3b98b31c, 0xe1633081},
+ {0x3d49f40e, 0xe1633081},
+ {0x432c41c5, 0xe1633081},
+ {0x491b6ad0, 0xe1633081},
+ {0x5612cab1, 0x59b9f8f1},
+ {0x779ce19d, 0xc8d2e345},
+ {0x7cc9510b, 0x59b9f8f1},
+ {0x83746053, 0xbbeeec72},
+ {0xaaa60c03, 0xbbeeec72},
+ {0xbf85ff26, 0xe1633081},
+ {0xc04fe601, 0xbbeeec72},
+ {0xca3812d5, 0x59b9f8f1},
+ {0xca383e15, 0x59b9f8f1},
+ {0xcad5eaf6, 0x59b9f8f1},
+ {0xcb7a04c8, 0xc8d2e345},
+ {0xfb4ce0de, 0xe1633081},
+};
+FX_DWORD FPF_SkiaGetSubstFont(FX_DWORD dwHash)
+{
+ FX_INT32 iStart = 0;
+ FX_INT32 iEnd = sizeof(g_SkiaFontmap) / sizeof(FPF_SKIAFONTMAP);
+ while (iStart <= iEnd) {
+ FX_INT32 iMid = (iStart + iEnd) / 2;
+ FPF_LPCSKIAFONTMAP pItem = &g_SkiaFontmap[iMid];
+ if (dwHash < pItem->dwFamily) {
+ iEnd = iMid - 1;
+ } else if (dwHash > pItem->dwFamily) {
+ iStart = iMid + 1;
+ } else {
+ return pItem->dwSubSt;
+ }
+ }
+ return NULL;
+}
+static const FPF_SKIAFONTMAP g_SkiaSansFontMap[] = {
+ {0x58c5083, 0xd5b8d10f},
+ {0x14ee2d13, 0xd5b8d10f},
+ {0x779ce19d, 0xd5b8d10f},
+ {0xcb7a04c8, 0xd5b8d10f},
+ {0xfb4ce0de, 0xd5b8d10f},
+};
+FX_DWORD FPF_SkiaGetSansFont(FX_DWORD dwHash)
+{
+ FX_INT32 iStart = 0;
+ FX_INT32 iEnd = sizeof(g_SkiaSansFontMap) / sizeof(FPF_SKIAFONTMAP);
+ while (iStart <= iEnd) {
+ FX_INT32 iMid = (iStart + iEnd) / 2;
+ FPF_LPCSKIAFONTMAP pItem = &g_SkiaSansFontMap[iMid];
+ if (dwHash < pItem->dwFamily) {
+ iEnd = iMid - 1;
+ } else if (dwHash > pItem->dwFamily) {
+ iStart = iMid + 1;
+ } else {
+ return pItem->dwSubSt;
+ }
+ }
+ return 0;
+}
+static FX_UINT32 FPF_GetHashCode_StringA(FX_LPCSTR pStr, FX_INT32 iLength, FX_BOOL bIgnoreCase = FALSE)
+{
+ if (!pStr) {
+ return 0;
+ }
+ if (iLength < 0) {
+ iLength = FXSYS_strlen(pStr);
+ }
+ FX_LPCSTR pStrEnd = pStr + iLength;
+ FX_UINT32 uHashCode = 0;
+ if (bIgnoreCase) {
+ while (pStr < pStrEnd) {
+ uHashCode = 31 * uHashCode + FXSYS_tolower(*pStr++);
+ }
+ } else {
+ while (pStr < pStrEnd) {
+ uHashCode = 31 * uHashCode + *pStr ++;
+ }
+ }
+ return uHashCode;
+}
+enum FPF_SKIACHARSET {
+ FPF_SKIACHARSET_Ansi = 1 << 0,
+ FPF_SKIACHARSET_Default = 1 << 1,
+ FPF_SKIACHARSET_Symbol = 1 << 2,
+ FPF_SKIACHARSET_ShiftJIS = 1 << 3,
+ FPF_SKIACHARSET_Korean = 1 << 4,
+ FPF_SKIACHARSET_Johab = 1 << 5,
+ FPF_SKIACHARSET_GB2312 = 1 << 6,
+ FPF_SKIACHARSET_BIG5 = 1 << 7,
+ FPF_SKIACHARSET_Greek = 1 << 8,
+ FPF_SKIACHARSET_Turkish = 1 << 9,
+ FPF_SKIACHARSET_Vietnamese = 1 << 10,
+ FPF_SKIACHARSET_Hebrew = 1 << 11,
+ FPF_SKIACHARSET_Arabic = 1 << 12,
+ FPF_SKIACHARSET_Baltic = 1 << 13,
+ FPF_SKIACHARSET_Cyrillic = 1 << 14,
+ FPF_SKIACHARSET_Thai = 1 << 15,
+ FPF_SKIACHARSET_EeasternEuropean = 1 << 16,
+ FPF_SKIACHARSET_PC = 1 << 17,
+ FPF_SKIACHARSET_OEM = 1 << 18,
+};
+static FX_DWORD FPF_SkiaGetCharset(FX_BYTE uCharset)
+{
+ switch (uCharset) {
+ case FXFONT_ANSI_CHARSET:
+ return FPF_SKIACHARSET_Ansi;
+ case FXFONT_DEFAULT_CHARSET:
+ return FPF_SKIACHARSET_Default;
+ case FXFONT_SYMBOL_CHARSET:
+ return FPF_SKIACHARSET_Symbol;
+ case FXFONT_SHIFTJIS_CHARSET:
+ return FPF_SKIACHARSET_ShiftJIS;
+ case FXFONT_HANGEUL_CHARSET:
+ return FPF_SKIACHARSET_Korean;
+ case FXFONT_GB2312_CHARSET:
+ return FPF_SKIACHARSET_GB2312;
+ case FXFONT_CHINESEBIG5_CHARSET:
+ return FPF_SKIACHARSET_BIG5;
+ case FXFONT_GREEK_CHARSET:
+ return FPF_SKIACHARSET_Greek;
+ case FXFONT_TURKISH_CHARSET:
+ return FPF_SKIACHARSET_Turkish;
+ case FXFONT_HEBREW_CHARSET:
+ return FPF_SKIACHARSET_Hebrew;
+ case FXFONT_ARABIC_CHARSET:
+ return FPF_SKIACHARSET_Arabic;
+ case FXFONT_BALTIC_CHARSET:
+ return FPF_SKIACHARSET_Baltic;
+ case FXFONT_RUSSIAN_CHARSET:
+ return FPF_SKIACHARSET_Cyrillic;
+ case FXFONT_THAI_CHARSET:
+ return FPF_SKIACHARSET_Thai;
+ case FXFONT_EASTEUROPE_CHARSET:
+ return FPF_SKIACHARSET_EeasternEuropean;
+ }
+ return FPF_SKIACHARSET_Default;
+}
+static FX_DWORD FPF_SKIANormalizeFontName(FX_BSTR bsfamily)
+{
+ FX_DWORD dwHash = 0;
+ FX_INT32 iLength = bsfamily.GetLength();
+ FX_LPCSTR pBuffer = bsfamily.GetCStr();
+ for (FX_INT32 i = 0; i < iLength; i++) {
+ FX_CHAR ch = pBuffer[i];
+ if (ch == ' ' || ch == '-' || ch == ',') {
+ continue;
+ }
+ dwHash = 31 * dwHash + FXSYS_tolower(ch);
+ }
+ return dwHash;
+}
+static FX_DWORD FPF_SKIAGetFamilyHash(FX_BSTR bsFamily, FX_DWORD dwStyle, FX_BYTE uCharset)
+{
+ CFX_ByteString bsFont(bsFamily);
+ if (dwStyle & FXFONT_BOLD) {
+ bsFont += "Bold";
+ }
+ if (dwStyle & FXFONT_ITALIC) {
+ bsFont += "Italic";
+ }
+ if (dwStyle & FXFONT_SERIF) {
+ bsFont += "Serif";
+ }
+ bsFont += uCharset;
+ return FPF_GetHashCode_StringA((FX_LPCSTR)bsFont, bsFont.GetLength(), TRUE);
+}
+static FX_BOOL FPF_SkiaIsCJK(FX_BYTE uCharset)
+{
+ return (uCharset == FXFONT_GB2312_CHARSET) || (uCharset == FXFONT_CHINESEBIG5_CHARSET)
+ || (uCharset == FXFONT_HANGEUL_CHARSET) || (uCharset == FXFONT_SHIFTJIS_CHARSET);
+}
+static FX_BOOL FPF_SkiaMaybeSymbol(FX_BSTR bsFacename)
+{
+ CFX_ByteString bsName = bsFacename;
+ bsName.MakeLower();
+ return bsName.Find("symbol") > -1;
+}
+static FX_BOOL FPF_SkiaMaybeArabic(FX_BSTR bsFacename)
+{
+ CFX_ByteString bsName = bsFacename;
+ bsName.MakeLower();
+ return bsName.Find("arabic") > -1;
+}
+CFPF_SkiaFontMgr::CFPF_SkiaFontMgr()
+ : m_bLoaded(FALSE), m_FTLibrary(NULL)
+{
+}
+CFPF_SkiaFontMgr::~CFPF_SkiaFontMgr()
+{
+ void *pkey = NULL;
+ CFPF_SkiaFont *pValue = NULL;
+ FX_POSITION pos = m_FamilyFonts.GetStartPosition();
+ while (pos) {
+ m_FamilyFonts.GetNextAssoc(pos, pkey, (void*&)pValue);
+ if (pValue) {
+ pValue->Release();
+ }
+ }
+ m_FamilyFonts.RemoveAll();
+ for (FX_INT32 i = m_FontFaces.GetUpperBound(); i >= 0; i--) {
+ CFPF_SkiaFontDescriptor *pFont = (CFPF_SkiaFontDescriptor*)m_FontFaces.ElementAt(i);
+ if (pFont) {
+ delete pFont;
+ }
+ }
+ m_FontFaces.RemoveAll();
+ if (m_FTLibrary) {
+ FXFT_Done_FreeType(m_FTLibrary);
+ }
+}
+FX_BOOL CFPF_SkiaFontMgr::InitFTLibrary()
+{
+ if (m_FTLibrary == NULL) {
+ FXFT_Init_FreeType(&m_FTLibrary);
+ }
+ return m_FTLibrary != NULL;
+}
+void CFPF_SkiaFontMgr::LoadSystemFonts()
+{
+ if (m_bLoaded) {
+ return;
+ }
+ ScanPath(FX_BSTRC("/system/fonts"));
+ OutputSystemFonts();
+ m_bLoaded = TRUE;
+}
+void CFPF_SkiaFontMgr::LoadPrivateFont(IFX_FileRead* pFontFile)
+{
+}
+void CFPF_SkiaFontMgr::LoadPrivateFont(FX_BSTR bsFileName)
+{
+}
+void CFPF_SkiaFontMgr::LoadPrivateFont(FX_LPVOID pBuffer, size_t szBuffer)
+{
+}
+IFPF_Font* CFPF_SkiaFontMgr::CreateFont(FX_BSTR bsFamilyname, FX_BYTE uCharset, FX_DWORD dwStyle, FX_DWORD dwMatch)
+{
+ FX_DWORD dwHash = FPF_SKIAGetFamilyHash(bsFamilyname, dwStyle, uCharset);
+ IFPF_Font *pFont = NULL;
+ if (m_FamilyFonts.Lookup((void*)dwHash, (void*&)pFont)) {
+ if (pFont) {
+ return pFont->Retain();
+ }
+ }
+ FX_DWORD dwFaceName = FPF_SKIANormalizeFontName(bsFamilyname);
+ FX_DWORD dwSubst = FPF_SkiaGetSubstFont(dwFaceName);
+ FX_DWORD dwSubstSans = FPF_SkiaGetSansFont(dwFaceName);
+ FX_BOOL bMaybeSymbol = FPF_SkiaMaybeSymbol(bsFamilyname);
+ if (uCharset != FXFONT_ARABIC_CHARSET && FPF_SkiaMaybeArabic(bsFamilyname)) {
+ uCharset = FXFONT_ARABIC_CHARSET;
+ } else if (uCharset == FXFONT_ANSI_CHARSET && (dwMatch & FPF_MATCHFONT_REPLACEANSI)) {
+ uCharset = FXFONT_DEFAULT_CHARSET;
+ }
+ FX_INT32 nExpectVal = FPF_SKIAMATCHWEIGHT_NAME1 + FPF_SKIAMATCHWEIGHT_1 * 3 + FPF_SKIAMATCHWEIGHT_2 * 2;
+ FX_INT32 nItem = -1;
+ FX_INT32 nMax = -1;
+ FX_INT32 nGlyphNum = 0;
+ for (FX_INT32 i = m_FontFaces.GetUpperBound(); i >= 0; i--) {
+ CFPF_SkiaPathFont *pFontDes = (CFPF_SkiaPathFont*)m_FontFaces.ElementAt(i);
+ if(!(pFontDes->m_dwCharsets & FPF_SkiaGetCharset(uCharset))) {
+ continue;
+ }
+ FX_INT32 nFind = 0;
+ FX_DWORD dwSysFontName = FPF_SKIANormalizeFontName(pFontDes->m_pFamily);
+ if (dwFaceName == dwSysFontName) {
+ nFind += FPF_SKIAMATCHWEIGHT_NAME1;
+ }
+ FX_BOOL bMatchedName = (nFind == FPF_SKIAMATCHWEIGHT_NAME1);
+ if ((dwStyle & FXFONT_BOLD) == (pFontDes->m_dwStyle & FXFONT_BOLD)) {
+ nFind += FPF_SKIAMATCHWEIGHT_1;
+ }
+ if ((dwStyle & FXFONT_ITALIC) == (pFontDes->m_dwStyle & FXFONT_ITALIC)) {
+ nFind += FPF_SKIAMATCHWEIGHT_1;
+ }
+ if ((dwStyle & FXFONT_FIXED_PITCH) == (pFontDes->m_dwStyle & FXFONT_FIXED_PITCH)) {
+ nFind += FPF_SKIAMATCHWEIGHT_2;
+ }
+ if ((dwStyle & FXFONT_SERIF) == (pFontDes->m_dwStyle & FXFONT_SERIF)) {
+ nFind += FPF_SKIAMATCHWEIGHT_1;
+ }
+ if ((dwStyle & FXFONT_SCRIPT) == (pFontDes->m_dwStyle & FXFONT_SCRIPT)) {
+ nFind += FPF_SKIAMATCHWEIGHT_2;
+ }
+ if (dwSubst == dwSysFontName || dwSubstSans == dwSysFontName) {
+ nFind += FPF_SKIAMATCHWEIGHT_NAME2;
+ bMatchedName = TRUE;
+ }
+ if (uCharset == FXFONT_DEFAULT_CHARSET || bMaybeSymbol) {
+ if (nFind > nMax && bMatchedName) {
+ nMax = nFind;
+ nItem = i;
+ }
+ } else if (FPF_SkiaIsCJK(uCharset)) {
+ if (bMatchedName || pFontDes->m_iGlyphNum > nGlyphNum) {
+ nItem = i;
+ nGlyphNum = pFontDes->m_iGlyphNum;
+ }
+ } else if (nFind > nMax) {
+ nMax = nFind;
+ nItem = i;
+ }
+ if (nExpectVal <= nFind) {
+ nItem = i;
+ break;
+ }
+ }
+ if (nItem > -1) {
+ CFPF_SkiaFontDescriptor *pFontDes = (CFPF_SkiaFontDescriptor*)m_FontFaces.ElementAt(nItem);
+ CFPF_SkiaFont *pFont = FX_NEW CFPF_SkiaFont;
+ if (pFont) {
+ if (pFont->InitFont(this, pFontDes, bsFamilyname, dwStyle, uCharset)) {
+ m_FamilyFonts.SetAt((void*)dwHash, (void*)pFont);
+ return pFont->Retain();
+ }
+ pFont->Release();
+ pFont = NULL;
+ }
+ return pFont;
+ }
+ return NULL;
+}
+FXFT_Face CFPF_SkiaFontMgr::GetFontFace(IFX_FileRead *pFileRead, FX_INT32 iFaceIndex)
+{
+ if (!pFileRead) {
+ return NULL;
+ }
+ if (pFileRead->GetSize() == 0) {
+ return NULL;
+ }
+ if (iFaceIndex < 0) {
+ return NULL;
+ }
+ FXFT_StreamRec streamRec;
+ FXSYS_memset32(&streamRec, 0, sizeof(FXFT_StreamRec));
+ streamRec.size = pFileRead->GetSize();
+ streamRec.descriptor.pointer = pFileRead;
+ streamRec.read = FPF_SkiaStream_Read;
+ streamRec.close = FPF_SkiaStream_Close;
+ FXFT_Open_Args args;
+ args.flags = FT_OPEN_STREAM;
+ args.stream = &streamRec;
+ FXFT_Face face;
+ if (FXFT_Open_Face(m_FTLibrary, &args, iFaceIndex, &face)) {
+ return NULL;
+ }
+ FXFT_Set_Pixel_Sizes(face, 0, 64);
+ return face;
+}
+FXFT_Face CFPF_SkiaFontMgr::GetFontFace(FX_BSTR bsFile, FX_INT32 iFaceIndex )
+{
+ if (bsFile.IsEmpty()) {
+ return NULL;
+ }
+ if (iFaceIndex < 0) {
+ return NULL;
+ }
+ FXFT_Open_Args args;
+ args.flags = FT_OPEN_PATHNAME;
+ args.pathname = (FT_String*)bsFile.GetCStr();
+ FXFT_Face face;
+ if (FXFT_Open_Face(m_FTLibrary, &args, iFaceIndex, &face)) {
+ return FALSE;
+ }
+ FXFT_Set_Pixel_Sizes(face, 0, 64);
+ return face;
+}
+FXFT_Face CFPF_SkiaFontMgr::GetFontFace(FX_LPCBYTE pBuffer, size_t szBuffer, FX_INT32 iFaceIndex )
+{
+ if (!pBuffer || szBuffer < 1) {
+ return NULL;
+ }
+ if (iFaceIndex < 0) {
+ return NULL;
+ }
+ FXFT_Open_Args args;
+ args.flags = FT_OPEN_MEMORY;
+ args.memory_base = pBuffer;
+ args.memory_size = szBuffer;
+ FXFT_Face face;
+ if (FXFT_Open_Face(m_FTLibrary, &args, iFaceIndex, &face)) {
+ return FALSE;
+ }
+ FXFT_Set_Pixel_Sizes(face, 0, 64);
+ return face;
+}
+void CFPF_SkiaFontMgr::ScanPath(FX_BSTR path)
+{
+ void *handle = FX_OpenFolder(path.GetCStr());
+ if (!handle) {
+ return;
+ }
+ CFX_ByteString filename;
+ FX_BOOL bFolder = FALSE;
+ while (FX_GetNextFile(handle, filename, bFolder)) {
+ if (bFolder) {
+ if (filename == FX_BSTRC(".") || filename == FX_BSTRC("..")) {
+ continue;
+ }
+ } else {
+ CFX_ByteString ext = filename.Right(4);
+ ext.MakeLower();
+ if (ext != FX_BSTRC(".ttf") && ext != FX_BSTRC(".ttc")) {
+ continue;
+ }
+ }
+ CFX_ByteString fullpath = path;
+ fullpath += "/";
+ fullpath += filename;
+ if (bFolder) {
+ ScanPath(fullpath);
+ } else {
+ ScanFile(fullpath);
+ }
+ }
+ FX_CloseFolder(handle);
+}
+void CFPF_SkiaFontMgr::ScanFile(FX_BSTR file)
+{
+ FXFT_Face face = GetFontFace(file);
+ if (face) {
+ CFPF_SkiaPathFont *pFontDesc = FX_NEW CFPF_SkiaPathFont;
+ if (!pFontDesc) {
+ return;
+ }
+ pFontDesc->SetPath(file.GetCStr());
+ ReportFace(face, pFontDesc);
+ m_FontFaces.Add(pFontDesc);
+ FXFT_Done_Face(face);
+ }
+}
+static const FX_DWORD g_FPFSkiaFontCharsets [] = {
+ FPF_SKIACHARSET_Ansi,
+ FPF_SKIACHARSET_EeasternEuropean,
+ FPF_SKIACHARSET_Cyrillic,
+ FPF_SKIACHARSET_Greek,
+ FPF_SKIACHARSET_Turkish,
+ FPF_SKIACHARSET_Hebrew,
+ FPF_SKIACHARSET_Arabic,
+ FPF_SKIACHARSET_Baltic,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ FPF_SKIACHARSET_Thai,
+ FPF_SKIACHARSET_ShiftJIS,
+ FPF_SKIACHARSET_GB2312,
+ FPF_SKIACHARSET_Korean,
+ FPF_SKIACHARSET_BIG5,
+ FPF_SKIACHARSET_Johab,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ FPF_SKIACHARSET_OEM,
+ FPF_SKIACHARSET_Symbol,
+};
+static FX_DWORD FPF_SkiaGetFaceCharset(TT_OS2 *pOS2)
+{
+ FX_DWORD dwCharset = 0;
+ if (pOS2) {
+ for (FX_INT32 i = 0; i < 32; i++) {
+ if (pOS2->ulCodePageRange1 & (1 << i)) {
+ dwCharset |= g_FPFSkiaFontCharsets[i];
+ }
+ }
+ }
+ dwCharset |= FPF_SKIACHARSET_Default;
+ return dwCharset;
+}
+void CFPF_SkiaFontMgr::ReportFace(FXFT_Face face, CFPF_SkiaFontDescriptor *pFontDesc)
+{
+ if (!face || !pFontDesc) {
+ return;
+ }
+ pFontDesc->SetFamily(FXFT_Get_Face_Family_Name(face));
+ if (FXFT_Is_Face_Bold(face)) {
+ pFontDesc->m_dwStyle |= FXFONT_BOLD;
+ }
+ if (FXFT_Is_Face_Italic(face)) {
+ pFontDesc->m_dwStyle |= FXFONT_ITALIC;
+ }
+ if (FT_IS_FIXED_WIDTH(face)) {
+ pFontDesc->m_dwStyle |= FXFONT_FIXED_PITCH;
+ }
+ TT_OS2 *pOS2 = (TT_OS2*)FT_Get_Sfnt_Table(face, ft_sfnt_os2);
+ if (pOS2) {
+ if (pOS2->ulCodePageRange1 & (1 << 31)) {
+ pFontDesc->m_dwStyle |= FXFONT_SYMBOLIC;
+ }
+ if (pOS2->panose[0] == 2) {
+ FX_BYTE uSerif = pOS2->panose[1];
+ if ((uSerif > 1 && uSerif < 10) || uSerif > 13) {
+ pFontDesc->m_dwStyle |= FXFONT_SERIF;
+ }
+ }
+ }
+ if (pOS2 && (pOS2->ulCodePageRange1 & (1 << 31))) {
+ pFontDesc->m_dwStyle |= FXFONT_SYMBOLIC;
+ }
+ pFontDesc->m_dwCharsets = FPF_SkiaGetFaceCharset(pOS2);
+ pFontDesc->m_iFaceIndex = face->face_index;
+ pFontDesc->m_iGlyphNum = face->num_glyphs;
+}
+void CFPF_SkiaFontMgr::OutputSystemFonts()
+{
+}
+#endif
diff --git a/core/src/fxge/android/fpf_skiafontmgr.h b/core/src/fxge/android/fpf_skiafontmgr.h
new file mode 100644
index 0000000000..472fbbd416
--- /dev/null
+++ b/core/src/fxge/android/fpf_skiafontmgr.h
@@ -0,0 +1,117 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FPF_SKIA_FONTMGR_H_
+#define _FPF_SKIA_FONTMGR_H_
+#if _FX_OS_ == _FX_ANDROID_
+#define FPF_SKIAFONTTYPE_Unknown 0
+#define FPF_SKIAFONTTYPE_Path 1
+#define FPF_SKIAFONTTYPE_File 2
+#define FPF_SKIAFONTTYPE_Buffer 3
+class CFPF_SkiaFontDescriptor : public CFX_Object
+{
+public:
+ CFPF_SkiaFontDescriptor() : m_pFamily(NULL), m_dwStyle(0), m_iFaceIndex(0), m_dwCharsets(0), m_iGlyphNum(0) {}
+ virtual ~CFPF_SkiaFontDescriptor()
+ {
+ if (m_pFamily) {
+ FX_Free(m_pFamily);
+ }
+ }
+ virtual FX_INT32 GetType() const
+ {
+ return FPF_SKIAFONTTYPE_Unknown;
+ }
+ void SetFamily(FX_LPCSTR pFamily)
+ {
+ if (m_pFamily) {
+ FX_Free(m_pFamily);
+ }
+ FX_INT32 iSize = FXSYS_strlen(pFamily);
+ m_pFamily = FX_Alloc(FX_CHAR, iSize + 1);
+ FXSYS_memcpy32(m_pFamily, pFamily, iSize * sizeof(FX_CHAR));
+ m_pFamily[iSize] = 0;
+ }
+ FX_LPSTR m_pFamily;
+ FX_DWORD m_dwStyle;
+ FX_INT32 m_iFaceIndex;
+ FX_DWORD m_dwCharsets;
+ FX_INT32 m_iGlyphNum;
+};
+class CFPF_SkiaPathFont : public CFPF_SkiaFontDescriptor
+{
+public:
+ CFPF_SkiaPathFont() : m_pPath(NULL) {}
+ virtual ~CFPF_SkiaPathFont()
+ {
+ if (m_pPath) {
+ FX_Free(m_pPath);
+ }
+ }
+ virtual FX_INT32 GetType() const
+ {
+ return FPF_SKIAFONTTYPE_Path;
+ }
+ void SetPath(FX_LPCSTR pPath)
+ {
+ if (m_pPath) {
+ FX_Free(m_pPath);
+ }
+ FX_INT32 iSize = FXSYS_strlen(pPath);
+ m_pPath = FX_Alloc(FX_CHAR, iSize + 1);
+ FXSYS_memcpy32(m_pPath, pPath, iSize * sizeof(FX_CHAR));
+ m_pPath[iSize] = 0;
+ }
+ FX_LPSTR m_pPath;
+};
+class CFPF_SkiaFileFont : public CFPF_SkiaFontDescriptor
+{
+public:
+ CFPF_SkiaFileFont() : m_pFile(NULL) {}
+ virtual FX_INT32 GetType() const
+ {
+ return FPF_SKIAFONTTYPE_File;
+ }
+ IFX_FileRead *m_pFile;
+};
+class CFPF_SkiaBufferFont : public CFPF_SkiaFontDescriptor
+{
+public:
+ CFPF_SkiaBufferFont() : m_pBuffer(NULL), m_szBuffer(0) {}
+ virtual FX_INT32 GetType() const
+ {
+ return FPF_SKIAFONTTYPE_Buffer;
+ }
+ FX_LPVOID m_pBuffer;
+ size_t m_szBuffer;
+};
+class CFPF_SkiaFontMgr : public IFPF_FontMgr, public CFX_Object
+{
+public:
+ CFPF_SkiaFontMgr();
+ virtual ~CFPF_SkiaFontMgr();
+ FX_BOOL InitFTLibrary();
+ virtual void LoadSystemFonts();
+ virtual void LoadPrivateFont(IFX_FileRead* pFontFile);
+ virtual void LoadPrivateFont(FX_BSTR bsFileName);
+ virtual void LoadPrivateFont(FX_LPVOID pBuffer, size_t szBuffer);
+
+ virtual IFPF_Font* CreateFont(FX_BSTR bsFamilyname, FX_BYTE uCharset, FX_DWORD dwStyle, FX_DWORD dwMatch = 0);
+ FXFT_Face GetFontFace(IFX_FileRead *pFileRead, FX_INT32 iFaceIndex = 0);
+ FXFT_Face GetFontFace(FX_BSTR bsFile, FX_INT32 iFaceIndex = 0);
+ FXFT_Face GetFontFace(FX_LPCBYTE pBuffer, size_t szBuffer, FX_INT32 iFaceIndex = 0);
+protected:
+ void ScanPath(FX_BSTR path);
+ void ScanFile(FX_BSTR file);
+ void ReportFace(FXFT_Face face, CFPF_SkiaFontDescriptor *pFontDesc);
+ void OutputSystemFonts();
+ FX_BOOL m_bLoaded;
+ CFX_PtrArray m_FontFaces;
+ FXFT_Library m_FTLibrary;
+ CFX_MapPtrToPtr m_FamilyFonts;
+};
+#endif
+#endif
diff --git a/core/src/fxge/android/fpf_skiamodule.cpp b/core/src/fxge/android/fpf_skiamodule.cpp
new file mode 100644
index 0000000000..94e68885fc
--- /dev/null
+++ b/core/src/fxge/android/fpf_skiamodule.cpp
@@ -0,0 +1,46 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "fx_fpf.h"
+#if _FX_OS_ == _FX_ANDROID_
+#include "fpf_skiamodule.h"
+#include "fpf_skiafontmgr.h"
+static IFPF_DeviceModule *gs_pPFModule = NULL;
+IFPF_DeviceModule* FPF_GetDeviceModule()
+{
+ if (!gs_pPFModule) {
+ gs_pPFModule = FX_NEW CFPF_SkiaDeviceModule;
+ }
+ return gs_pPFModule;
+}
+CFPF_SkiaDeviceModule::~CFPF_SkiaDeviceModule()
+{
+ if (m_pFontMgr) {
+ delete m_pFontMgr;
+ }
+}
+void CFPF_SkiaDeviceModule::Destroy()
+{
+ if (gs_pPFModule) {
+ delete (CFPF_SkiaDeviceModule*)gs_pPFModule;
+ gs_pPFModule = NULL;
+ }
+}
+IFPF_FontMgr* CFPF_SkiaDeviceModule::GetFontMgr()
+{
+ if (!m_pFontMgr) {
+ m_pFontMgr = FX_NEW CFPF_SkiaFontMgr;
+ if (!m_pFontMgr) {
+ return NULL;
+ }
+ if (!m_pFontMgr->InitFTLibrary()) {
+ delete m_pFontMgr;
+ return NULL;
+ }
+ }
+ return (IFPF_FontMgr*)m_pFontMgr;
+}
+#endif
diff --git a/core/src/fxge/android/fpf_skiamodule.h b/core/src/fxge/android/fpf_skiamodule.h
new file mode 100644
index 0000000000..c3a78bf658
--- /dev/null
+++ b/core/src/fxge/android/fpf_skiamodule.h
@@ -0,0 +1,22 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FPF_MODULE_H_
+#define _FPF_MODULE_H_
+#if _FX_OS_ == _FX_ANDROID_
+class CFPF_SkiaFontMgr;
+class CFPF_SkiaDeviceModule : public IFPF_DeviceModule, public CFX_Object
+{
+public:
+ CFPF_SkiaDeviceModule() : m_pFontMgr(NULL) {}
+ virtual ~CFPF_SkiaDeviceModule();
+ virtual void Destroy();
+ virtual IFPF_FontMgr* GetFontMgr();
+protected:
+ CFPF_SkiaFontMgr *m_pFontMgr;
+};
+#endif
+#endif
diff --git a/core/src/fxge/android/fx_android_font.cpp b/core/src/fxge/android/fx_android_font.cpp
new file mode 100644
index 0000000000..5f8aafc393
--- /dev/null
+++ b/core/src/fxge/android/fx_android_font.cpp
@@ -0,0 +1,87 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "fx_fpf.h"
+#if _FX_OS_ == _FX_ANDROID_
+CFX_AndroidFontInfo::CFX_AndroidFontInfo()
+ : m_pFontMgr(NULL)
+{
+}
+FX_BOOL CFX_AndroidFontInfo::Init(IFPF_FontMgr *pFontMgr)
+{
+ if (!pFontMgr) {
+ return FALSE;
+ }
+ pFontMgr->LoadSystemFonts();
+ m_pFontMgr = pFontMgr;
+ return TRUE;
+}
+FX_BOOL CFX_AndroidFontInfo::EnumFontList(CFX_FontMapper* pMapper)
+{
+ return FALSE;
+}
+void* CFX_AndroidFontInfo::MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR face, FX_BOOL& bExact)
+{
+ if (!m_pFontMgr) {
+ return NULL;
+ }
+ FX_DWORD dwStyle = 0;
+ if (weight >= 700) {
+ dwStyle |= FXFONT_BOLD;
+ }
+ if (bItalic) {
+ dwStyle |= FXFONT_ITALIC;
+ }
+ if (pitch_family & FXFONT_FF_FIXEDPITCH) {
+ dwStyle |= FXFONT_FIXED_PITCH;
+ }
+ if (pitch_family & FXFONT_FF_SCRIPT) {
+ dwStyle |= FXFONT_SCRIPT;
+ }
+ if (pitch_family & FXFONT_FF_ROMAN) {
+ dwStyle |= FXFONT_SERIF;
+ }
+ return m_pFontMgr->CreateFont(face, charset, dwStyle, FPF_MATCHFONT_REPLACEANSI);
+}
+void* CFX_AndroidFontInfo::GetFont(FX_LPCSTR face)
+{
+ return NULL;
+}
+FX_DWORD CFX_AndroidFontInfo::GetFontData(void* hFont, FX_DWORD table, FX_LPBYTE buffer, FX_DWORD size)
+{
+ if (!hFont) {
+ return 0;
+ }
+ return ((IFPF_Font*)hFont)->GetFontData(table, buffer, size);
+}
+FX_BOOL CFX_AndroidFontInfo::GetFaceName(void* hFont, CFX_ByteString& name)
+{
+ if (!hFont) {
+ return FALSE;
+ }
+ name = ((IFPF_Font*)hFont)->GetFamilyName();
+ return TRUE;
+}
+FX_BOOL CFX_AndroidFontInfo::GetFontCharset(void* hFont, int& charset)
+{
+ if (!hFont) {
+ return FALSE;
+ }
+ charset = ((IFPF_Font*)hFont)->GetCharset();
+ return FALSE;
+}
+void CFX_AndroidFontInfo::DeleteFont(void* hFont)
+{
+ if (!hFont) {
+ return;
+ }
+ ((IFPF_Font*)hFont)->Release();
+}
+void* CFX_AndroidFontInfo::RetainFont(void* hFont)
+{
+ return NULL;
+}
+#endif
diff --git a/core/src/fxge/android/fx_android_font.h b/core/src/fxge/android/fx_android_font.h
new file mode 100644
index 0000000000..b6bfdf9396
--- /dev/null
+++ b/core/src/fxge/android/fx_android_font.h
@@ -0,0 +1,36 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FX_ANDROID_FONT_H_
+#define _FX_ANDROID_FONT_H_
+#if _FX_OS_ == _FX_ANDROID_
+class IFPF_FontMgr;
+class CFX_AndroidFontInfo : public IFX_SystemFontInfo
+{
+public:
+ CFX_AndroidFontInfo();
+ virtual void Release()
+ {
+ delete this;
+ }
+
+ virtual FX_BOOL EnumFontList(CFX_FontMapper* pMapper);
+
+ virtual void* MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR face, FX_BOOL& bExact);
+
+ virtual void* GetFont(FX_LPCSTR face);
+ virtual FX_DWORD GetFontData(void* hFont, FX_DWORD table, FX_LPBYTE buffer, FX_DWORD size);
+ virtual FX_BOOL GetFaceName(void* hFont, CFX_ByteString& name);
+ virtual FX_BOOL GetFontCharset(void* hFont, int& charset);
+
+ virtual void DeleteFont(void* hFont);
+ virtual void* RetainFont(void* hFont);
+ FX_BOOL Init(IFPF_FontMgr *pFontMgr);
+protected:
+ IFPF_FontMgr *m_pFontMgr;
+};
+#endif
+#endif
diff --git a/core/src/fxge/android/fx_android_imp.cpp b/core/src/fxge/android/fx_android_imp.cpp
new file mode 100644
index 0000000000..528877ef89
--- /dev/null
+++ b/core/src/fxge/android/fx_android_imp.cpp
@@ -0,0 +1,32 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "fx_fpf.h"
+#if _FX_OS_ == _FX_ANDROID_
+void CFX_GEModule::InitPlatform()
+{
+ IFPF_DeviceModule *pDeviceModule = FPF_GetDeviceModule();
+ if (!pDeviceModule) {
+ return;
+ }
+ IFPF_FontMgr *pFontMgr = pDeviceModule->GetFontMgr();
+ if (pFontMgr) {
+ CFX_AndroidFontInfo *pFontInfo = FX_NEW CFX_AndroidFontInfo;
+ if (!pFontInfo) {
+ return;
+ }
+ pFontInfo->Init(pFontMgr);
+ m_pFontMgr->SetSystemFontInfo(pFontInfo);
+ }
+ m_pPlatformData = pDeviceModule;
+}
+void CFX_GEModule::DestroyPlatform()
+{
+ if (m_pPlatformData) {
+ ((IFPF_DeviceModule*)m_pPlatformData)->Destroy();
+ }
+}
+#endif
diff --git a/core/src/fxge/android/fx_fpf.h b/core/src/fxge/android/fx_fpf.h
new file mode 100644
index 0000000000..1108fffed4
--- /dev/null
+++ b/core/src/fxge/android/fx_fpf.h
@@ -0,0 +1,14 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FX_FPF_H_
+#define _FX_FPF_H_
+#include "../../../include/fxcrt/fx_ext.h"
+#include "../../../include/fxge/fx_ge.h"
+#include "../../../include/fxge/fx_freetype.h"
+#include "../../../include/fxge/fpf.h"
+#include "fx_android_font.h"
+#endif
diff --git a/core/src/fxge/apple/apple_int.h b/core/src/fxge/apple/apple_int.h
new file mode 100644
index 0000000000..5c42f1b1fb
--- /dev/null
+++ b/core/src/fxge/apple/apple_int.h
@@ -0,0 +1,246 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _APPLE_INT_H_
+#define _APPLE_INT_H_
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+#if _FX_OS_ == _FX_MACOSX_
+#include <Carbon/Carbon.h>
+#endif
+typedef enum eFXIOSFONTCHARSET {
+ eFXFontCharsetDEFAULT = 0,
+ eFXFontCharsetANSI = 1,
+ eFXFontCharsetSYMBOL = 1 << 1,
+ eFXFontCharsetSHIFTJIS = 1 << 2,
+ eFXFontCharsetHANGEUL = 1 << 3,
+ eFXFontCharsetGB2312 = 1 << 4,
+ eFXFontCharsetCHINESEBIG5 = 1 << 5,
+ eFXFontCharsetTHAI = 1 << 6,
+ eFXFontCharsetEASTEUROPE = 1 << 7,
+ eFXFontCharsetRUSSIAN = 1 << 8,
+ eFXFontCharsetGREEK = 1 << 9,
+ eFXFontCharsetTURKISH = 1 << 10,
+ eFXFontCharsetHEBREW = 1 << 11,
+ eFXFontCharsetARABIC = 1 << 12,
+ eFXFontCharsetBALTIC = 1 << 13,
+} FX_IOSCHARSET;
+FX_IOSCHARSET FX_GetiOSCharset(int charset);
+typedef enum eFXIOSFONTFLAG {
+ eFXFontFlagBold = 1,
+ eFXFontFlagItalic = 1 << 1,
+ eFXFontFlagFixedPitch = 1 << 2,
+ eFXFontFlagSerif = 1 << 3,
+ eFXFontFlagScript = 1 << 4,
+} FX_IOSFONTFLAG;
+typedef struct _IOS_FONTDATA {
+ FX_DWORD nHashCode;
+ const char* psName;
+ FX_DWORD charsets;
+ FX_DWORD styles;
+} IOS_FONTDATA;
+class CQuartz2D
+{
+public:
+ void* createGraphics(CFX_DIBitmap* bitmap);
+ void destroyGraphics(void* graphics);
+
+ void* CreateFont(FX_LPCBYTE pFontData, FX_DWORD dwFontSize);
+ void DestroyFont(void* pFont);
+ void setGraphicsTextMatrix(void* graphics, CFX_AffineMatrix* matrix);
+ FX_BOOL drawGraphicsString(void* graphics,
+ void* font,
+ FX_FLOAT fontSize,
+ FX_WORD* glyphIndices,
+ CGPoint* glyphPositions,
+ FX_INT32 chars,
+ FX_ARGB argb,
+ CFX_AffineMatrix* matrix = NULL);
+ void saveGraphicsState(void* graphics);
+ void restoreGraphicsState(void* graphics);
+};
+class CApplePlatform : public CFX_Object
+{
+public:
+ CApplePlatform()
+ {
+ m_pFontMapper = NULL;
+ }
+ ~CApplePlatform()
+ {
+ if (m_pFontMapper) {
+ delete m_pFontMapper;
+ }
+ }
+ CQuartz2D _quartz2d;
+ IFX_FontMapper* m_pFontMapper;
+};
+class CFX_QuartzDeviceDriver : public IFX_RenderDeviceDriver
+{
+public:
+ CFX_QuartzDeviceDriver(CGContextRef context, FX_INT32 deviceClass);
+ virtual ~CFX_QuartzDeviceDriver();
+
+ virtual int GetDeviceCaps(int caps_id);
+ virtual CFX_Matrix GetCTM() const;
+ virtual CFX_DIBitmap* GetBackDrop()
+ {
+ return NULL;
+ }
+ virtual void* GetPlatformSurface()
+ {
+ return NULL;
+ }
+ virtual FX_BOOL IsPSPrintDriver()
+ {
+ return FALSE;
+ }
+ virtual FX_BOOL StartRendering()
+ {
+ return TRUE;
+ }
+ virtual void EndRendering() {}
+ virtual void SaveState();
+ virtual void RestoreState(FX_BOOL bKeepSaved);
+ virtual FX_BOOL SetClip_PathFill(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ int fill_mode
+ );
+ virtual FX_BOOL SetClip_PathStroke(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ const CFX_GraphStateData* pGraphState
+ );
+ virtual FX_BOOL DrawPath(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ const CFX_GraphStateData* pGraphState,
+ FX_DWORD fill_color,
+ FX_DWORD stroke_color,
+ int fill_mode,
+ int alpha_flag = 0,
+ void* pIccTransform = NULL,
+ int blend_type = FXDIB_BLEND_NORMAL
+ );
+ virtual FX_BOOL SetPixel(int x, int y, FX_DWORD color,
+ int alpha_flag = 0, void* pIccTransform = NULL)
+ {
+ return FALSE;
+ }
+ virtual FX_BOOL FillRect(const FX_RECT* pRect, FX_DWORD fill_color,
+ int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL);
+ virtual FX_BOOL DrawCosmeticLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2, FX_DWORD color,
+ int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL);
+ virtual FX_BOOL GetClipBox(FX_RECT* pRect);
+ virtual FX_BOOL GetDIBits(CFX_DIBitmap* pBitmap, int left, int top, void* pIccTransform = NULL, FX_BOOL bDEdge = FALSE);
+ virtual FX_BOOL SetDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, const FX_RECT* pSrcRect,
+ int dest_left, int dest_top, int blend_type,
+ int alpha_flag = 0, void* pIccTransform = NULL);
+ virtual FX_BOOL StretchDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, int dest_left, int dest_top,
+ int dest_width, int dest_height, const FX_RECT* pClipRect, FX_DWORD flags,
+ int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL);
+ virtual FX_BOOL StartDIBits(const CFX_DIBSource* pBitmap, int bitmap_alpha, FX_DWORD color,
+ const CFX_AffineMatrix* pMatrix, FX_DWORD flags, FX_LPVOID& handle,
+ int alpha_flag = 0, void* pIccTransform = NULL,
+ int blend_type = FXDIB_BLEND_NORMAL)
+ {
+ return FALSE;
+ }
+ virtual FX_BOOL ContinueDIBits(FX_LPVOID handle, IFX_Pause* pPause)
+ {
+ return FALSE;
+ }
+ virtual void CancelDIBits(FX_LPVOID handle) {}
+ virtual FX_BOOL DrawDeviceText(int nChars, const FXTEXT_CHARPOS* pCharPos, CFX_Font* pFont,
+ CFX_FontCache* pCache, const CFX_AffineMatrix* pObject2Device, FX_FLOAT font_size, FX_DWORD color,
+ int alpha_flag = 0, void* pIccTransform = NULL);
+ virtual void ClearDriver();
+protected:
+ void setStrokeInfo(const CFX_GraphStateData * graphState, FX_ARGB argb, FX_FLOAT lineWidth);
+ void setFillInfo(FX_ARGB argb);
+ void setPathToContext(const CFX_PathData * pathData);
+ FX_FLOAT getLineWidth(const CFX_GraphStateData * graphState, CGAffineTransform ctm);
+ FX_BOOL CG_DrawGlypRun(int nChars,
+ const FXTEXT_CHARPOS* pCharPos,
+ CFX_Font* pFont,
+ CFX_FontCache* pCache,
+ const CFX_AffineMatrix* pGlyphMatrix,
+ const CFX_AffineMatrix* pObject2Device,
+ FX_FLOAT font_size,
+ FX_DWORD argb,
+ int alpha_flag,
+ void* pIccTransform);
+ void CG_SetImageTransform(int dest_left, int dest_top, int dest_width, int dest_height, CGRect* rect = NULL);
+protected:
+ CGContextRef _context;
+ CGAffineTransform _foxitDevice2User;
+ CGAffineTransform _user2FoxitDevice;
+ FX_INT32 m_saveCount;
+
+ FX_INT32 _width;
+ FX_INT32 _height;
+ FX_INT32 _bitsPerPixel;
+ FX_INT32 _deviceClass;
+ FX_INT32 _renderCaps;
+ FX_INT32 _horzSize;
+ FX_INT32 _vertSize;
+};
+class CFX_FontProvider : public IFX_FileRead
+{
+public:
+ virtual void Release()
+ {
+ delete this;
+ }
+ virtual FX_FILESIZE GetSize()
+ {
+ return (FX_FILESIZE)_totalSize;
+ }
+ virtual FX_BOOL ReadBlock(void* buffer, FX_FILESIZE offset, size_t size);
+
+ virtual FX_BOOL IsEOF()
+ {
+ return _offSet == _totalSize;
+ }
+ virtual FX_FILESIZE GetPosition()
+ {
+ return (FX_FILESIZE)_offSet;
+ }
+ virtual size_t ReadBlock(void* buffer, size_t size);
+public:
+ CFX_FontProvider(CGFontRef cgFont);
+ ~CFX_FontProvider();
+ void InitTableOffset();
+ unsigned long Read(unsigned long offset, unsigned char *buffer, unsigned long count);
+protected:
+ uint32_t CalcTableCheckSum(const uint32_t *table, uint32_t numberOfBytesInTable);
+ uint32_t CalcTableDataRefCheckSum(CFDataRef dataRef);
+private:
+ CGFontRef m_cgFont;
+ UInt32 m_iTableSize;
+ size_t _offSet;
+ typedef struct FontHeader {
+ int32_t fVersion;
+ uint16_t fNumTables;
+ uint16_t fSearchRange;
+ uint16_t fEntrySelector;
+ uint16_t fRangeShift;
+ } FontHeader;
+ typedef struct TableEntry {
+ uint32_t fTag;
+ uint32_t fCheckSum;
+ uint32_t fOffset;
+ uint32_t fLength;
+ } TableEntry;
+ FontHeader _fontHeader;
+ unsigned char * _tableEntries;
+ size_t * _tableOffsets;
+ int _tableCount;
+ int _totalSize;
+};
+FX_UINT32 FX_GetHashCode( FX_LPCSTR pStr);
+FX_DWORD FX_IOSGetMatchFamilyNameHashcode(FX_LPCSTR pFontName);
+FX_UINT32 FX_IOSGetFamilyNamesCount();
+FX_LPCSTR FX_IOSGetFamilyName( FX_UINT32 uIndex);
+#endif
+#endif
diff --git a/core/src/fxge/apple/fx_apple_platform.cpp b/core/src/fxge/apple/fx_apple_platform.cpp
new file mode 100644
index 0000000000..229d1785da
--- /dev/null
+++ b/core/src/fxge/apple/fx_apple_platform.cpp
@@ -0,0 +1,173 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxcrt/fx_ext.h"
+#include "../../../include/fxge/fx_ge.h"
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+#include "apple_int.h"
+#include "../../../include/fxge/fx_ge_apple.h"
+#include "../agg/include/fxfx_agg_clip_liang_barsky.h"
+#include "../ge/text_int.h"
+#include "../dib/dib_int.h"
+#include "../agg/include/fx_agg_driver.h"
+#include "../../../include/fxge/fx_freetype.h"
+#if (_FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ && (!defined(_FPDFAPI_MINI_)))
+void CFX_AggDeviceDriver::InitPlatform()
+{
+ CQuartz2D & quartz2d = ((CApplePlatform *) CFX_GEModule::Get()->GetPlatformData())->_quartz2d;
+ m_pPlatformGraphics = quartz2d.createGraphics(m_pBitmap);
+}
+void CFX_AggDeviceDriver::DestroyPlatform()
+{
+ CQuartz2D & quartz2d = ((CApplePlatform *) CFX_GEModule::Get()->GetPlatformData())->_quartz2d;
+ if (m_pPlatformGraphics) {
+ quartz2d.destroyGraphics(m_pPlatformGraphics);
+ m_pPlatformGraphics = NULL;
+ }
+}
+void CFX_FaceCache::InitPlatform() {}
+void CFX_FaceCache::DestroyPlatform() {}
+CFX_GlyphBitmap* CFX_FaceCache::RenderGlyph_Nativetext(CFX_Font * pFont,
+ FX_DWORD glyph_index,
+ const CFX_AffineMatrix * pMatrix,
+ int dest_width,
+ int anti_alias)
+{
+ return NULL;
+}
+static FX_BOOL _CGDrawGlyphRun(CGContextRef pContext,
+ int nChars,
+ const FXTEXT_CHARPOS* pCharPos,
+ CFX_Font* pFont,
+ CFX_FontCache* pCache,
+ const CFX_AffineMatrix* pObject2Device,
+ FX_FLOAT font_size,
+ FX_DWORD argb,
+ int alpha_flag,
+ void* pIccTransform)
+{
+ if (nChars == 0) {
+ return TRUE;
+ }
+ CFX_AffineMatrix new_matrix;
+ FX_BOOL bNegSize = font_size < 0;
+ if (bNegSize) {
+ font_size = -font_size;
+ }
+ FX_FLOAT ori_x = pCharPos[0].m_OriginX, ori_y = pCharPos[0].m_OriginY;
+ new_matrix.Transform(ori_x, ori_y);
+ if (pObject2Device) {
+ new_matrix.Concat(*pObject2Device);
+ }
+ CQuartz2D& quartz2d = ((CApplePlatform *) CFX_GEModule::Get()->GetPlatformData())->_quartz2d;
+ if (!pFont->m_pPlatformFont) {
+ if (pFont->GetPsName() == CFX_WideString::FromLocal("DFHeiStd-W5")) {
+ return FALSE;
+ }
+ pFont->m_pPlatformFont = quartz2d.CreateFont(pFont->m_pFontData, pFont->m_dwSize);
+ if (NULL == pFont->m_pPlatformFont) {
+ return FALSE;
+ }
+ }
+ CFX_FixedBufGrow<FX_WORD, 32> glyph_indices(nChars);
+ CFX_FixedBufGrow<CGPoint, 32> glyph_positions(nChars);
+ for (int i = 0; i < nChars; i++ ) {
+ glyph_indices[i] = pCharPos[i].m_ExtGID;
+ if (bNegSize) {
+ glyph_positions[i].x = -pCharPos[i].m_OriginX;
+ } else {
+ glyph_positions[i].x = pCharPos[i].m_OriginX;
+ }
+ glyph_positions[i].y = pCharPos[i].m_OriginY;
+ }
+ if (bNegSize) {
+ new_matrix.a = -new_matrix.a;
+ } else {
+ new_matrix.b = -new_matrix.b;
+ new_matrix.d = -new_matrix.d;
+ }
+ quartz2d.setGraphicsTextMatrix(pContext, &new_matrix);
+ return quartz2d.drawGraphicsString(pContext,
+ pFont->m_pPlatformFont,
+ font_size,
+ glyph_indices,
+ glyph_positions,
+ nChars,
+ argb,
+ NULL);
+}
+static void _DoNothing(void *info, const void *data, size_t size) {}
+FX_BOOL CFX_AggDeviceDriver::DrawDeviceText(int nChars,
+ const FXTEXT_CHARPOS * pCharPos,
+ CFX_Font * pFont,
+ CFX_FontCache * pCache,
+ const CFX_AffineMatrix * pObject2Device,
+ FX_FLOAT font_size,
+ FX_DWORD argb,
+ int alpha_flag, void* pIccTransform)
+{
+ if (!pFont) {
+ return FALSE;
+ }
+ FX_BOOL bBold = pFont->IsBold();
+ if (!bBold && pFont->GetSubstFont() &&
+ pFont->GetSubstFont()->m_Weight >= 500 &&
+ pFont->GetSubstFont()->m_Weight <= 600) {
+ return FALSE;
+ }
+ for (int i = 0; i < nChars; i ++) {
+ if (pCharPos[i].m_bGlyphAdjust) {
+ return FALSE;
+ }
+ }
+ CGContextRef ctx = CGContextRef(m_pPlatformGraphics);
+ if (NULL == ctx) {
+ return FALSE;
+ }
+ CGContextSaveGState(ctx);
+ CGContextSetTextDrawingMode(ctx, kCGTextFillClip);
+ CGRect rect_cg;
+ CGImageRef pImageCG = NULL;
+ if (m_pClipRgn) {
+ rect_cg = CGRectMake(m_pClipRgn->GetBox().left, m_pClipRgn->GetBox().top, m_pClipRgn->GetBox().Width(), m_pClipRgn->GetBox().Height());
+ const CFX_DIBitmap* pClipMask = m_pClipRgn->GetMask();
+ if (pClipMask) {
+ CGDataProviderRef pClipMaskDataProvider = CGDataProviderCreateWithData(NULL,
+ pClipMask->GetBuffer(),
+ pClipMask->GetPitch() * pClipMask->GetHeight(),
+ _DoNothing);
+ CGFloat decode_f[2] = {255.f, 0.f};
+ pImageCG = CGImageMaskCreate(pClipMask->GetWidth(), pClipMask->GetHeight(),
+ 8, 8, pClipMask->GetPitch(), pClipMaskDataProvider,
+ decode_f, FALSE);
+ CGDataProviderRelease(pClipMaskDataProvider);
+ }
+ } else {
+ rect_cg = CGRectMake(0, 0, m_pBitmap->GetWidth(), m_pBitmap->GetHeight());
+ }
+ rect_cg = CGContextConvertRectToDeviceSpace(ctx, rect_cg);
+ if (pImageCG) {
+ CGContextClipToMask(ctx, rect_cg, pImageCG);
+ } else {
+ CGContextClipToRect(ctx, rect_cg);
+ }
+ FX_BOOL ret = _CGDrawGlyphRun(ctx, nChars, pCharPos, pFont, pCache, pObject2Device, font_size, argb, alpha_flag, pIccTransform);
+ if (pImageCG) {
+ CGImageRelease(pImageCG);
+ }
+ CGContextRestoreGState(ctx);
+ return ret;
+}
+void CFX_Font::ReleasePlatformResource()
+{
+ if (m_pPlatformFont) {
+ CQuartz2D & quartz2d = ((CApplePlatform *) CFX_GEModule::Get()->GetPlatformData())->_quartz2d;
+ quartz2d.DestroyFont(m_pPlatformFont);
+ m_pPlatformFont = NULL;
+ }
+}
+#endif
+#endif
diff --git a/core/src/fxge/apple/fx_mac_imp.cpp b/core/src/fxge/apple/fx_mac_imp.cpp
new file mode 100644
index 0000000000..9a1218bf0b
--- /dev/null
+++ b/core/src/fxge/apple/fx_mac_imp.cpp
@@ -0,0 +1,117 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxge/fx_ge.h"
+#include "apple_int.h"
+#if _FX_OS_ == _FX_MACOSX_
+static const struct {
+ FX_LPCSTR m_pName;
+ FX_LPCSTR m_pSubstName;
+}
+Base14Substs[] = {
+ {"Courier", "Courier New"},
+ {"Courier-Bold", "Courier New Bold"},
+ {"Courier-BoldOblique", "Courier New Bold Italic"},
+ {"Courier-Oblique", "Courier New Italic"},
+ {"Helvetica", "Arial"},
+ {"Helvetica-Bold", "Arial Bold"},
+ {"Helvetica-BoldOblique", "Arial Bold Italic"},
+ {"Helvetica-Oblique", "Arial Italic"},
+ {"Times-Roman", "Times New Roman"},
+ {"Times-Bold", "Times New Roman Bold"},
+ {"Times-BoldItalic", "Times New Roman Bold Italic"},
+ {"Times-Italic", "Times New Roman Italic"},
+};
+#if !defined(_FPDFAPI_MINI_)
+class CFX_MacFontInfo : public CFX_FolderFontInfo
+{
+public:
+ virtual void* MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR family, FX_BOOL& bExact);
+};
+#define JAPAN_GOTHIC "Hiragino Kaku Gothic Pro W6"
+#define JAPAN_MINCHO "Hiragino Mincho Pro W6"
+static void GetJapanesePreference(CFX_ByteString& face, int weight, int picth_family)
+{
+ if (face.Find("Gothic") >= 0) {
+ face = JAPAN_GOTHIC;
+ return;
+ }
+ if (!(picth_family & FXFONT_FF_ROMAN) && weight > 400) {
+ face = JAPAN_GOTHIC;
+ } else {
+ face = JAPAN_MINCHO;
+ }
+}
+void* CFX_MacFontInfo::MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR cstr_face, FX_BOOL& bExact)
+{
+ CFX_ByteString face = cstr_face;
+ int iBaseFont;
+ for (iBaseFont = 0; iBaseFont < 12; iBaseFont ++)
+ if (face == CFX_ByteStringC(Base14Substs[iBaseFont].m_pName)) {
+ face = Base14Substs[iBaseFont].m_pSubstName;
+ bExact = TRUE;
+ break;
+ }
+ if (iBaseFont < 12) {
+ return GetFont(face);
+ }
+ FX_LPVOID p;
+ if (m_FontList.Lookup(face, p)) {
+ return p;
+ }
+ if (charset == FXFONT_ANSI_CHARSET && (pitch_family & FXFONT_FF_FIXEDPITCH)) {
+ return GetFont("Courier New");
+ }
+ if (charset == FXFONT_ANSI_CHARSET || charset == FXFONT_SYMBOL_CHARSET) {
+ return NULL;
+ }
+ switch (charset) {
+ case FXFONT_SHIFTJIS_CHARSET:
+ GetJapanesePreference(face, weight, pitch_family);
+ break;
+ case FXFONT_GB2312_CHARSET:
+ face = "STSong";
+ break;
+ case FXFONT_HANGEUL_CHARSET:
+ face = "AppleMyungjo";
+ break;
+ case FXFONT_CHINESEBIG5_CHARSET:
+ face = "LiSong Pro Light";
+ }
+ if (m_FontList.Lookup(face, p)) {
+ return p;
+ }
+ return NULL;
+}
+#endif
+IFX_SystemFontInfo* IFX_SystemFontInfo::CreateDefault()
+{
+#if !defined(_FPDFAPI_MINI_)
+ CFX_MacFontInfo* pInfo = FX_NEW CFX_MacFontInfo;
+ if (!pInfo) {
+ return NULL;
+ }
+ pInfo->AddPath("~/Library/Fonts");
+ pInfo->AddPath("/Library/Fonts");
+ pInfo->AddPath("/System/Library/Fonts");
+ return pInfo;
+#else
+ return NULL;
+#endif
+}
+void CFX_GEModule::InitPlatform()
+{
+ m_pPlatformData = FX_NEW CApplePlatform;
+ m_pFontMgr->SetSystemFontInfo(IFX_SystemFontInfo::CreateDefault());
+}
+void CFX_GEModule::DestroyPlatform()
+{
+ if (m_pPlatformData) {
+ delete (CApplePlatform *) m_pPlatformData;
+ }
+ m_pPlatformData = NULL;
+}
+#endif
diff --git a/core/src/fxge/apple/fx_quartz_device.cpp b/core/src/fxge/apple/fx_quartz_device.cpp
new file mode 100644
index 0000000000..bef45163f7
--- /dev/null
+++ b/core/src/fxge/apple/fx_quartz_device.cpp
@@ -0,0 +1,1138 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxcrt/fx_ext.h"
+#include "../../../include/fxge/fx_ge.h"
+#include "../agg/include/fxfx_agg_clip_liang_barsky.h"
+#include "../ge/text_int.h"
+#include "../dib/dib_int.h"
+#include "../agg/include/fx_agg_driver.h"
+#include "../../../include/fxge/fx_freetype.h"
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+#include "apple_int.h"
+#include "../../../include/fxge/fx_ge_apple.h"
+#ifndef CGFLOAT_IS_DOUBLE
+#error Expected CGFLOAT_IS_DOUBLE to be defined by CoreGraphics headers
+#endif
+void* CQuartz2D::createGraphics(CFX_DIBitmap* pBitmap)
+{
+ if (!pBitmap) {
+ return NULL;
+ }
+ CGBitmapInfo bmpInfo = kCGBitmapByteOrder32Little;
+ switch (pBitmap->GetFormat()) {
+ case FXDIB_Rgb32:
+ bmpInfo |= kCGImageAlphaNoneSkipFirst;
+ break;
+ case FXDIB_Argb:
+ default:
+ return NULL;
+ }
+ CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
+ CGContextRef context = CGBitmapContextCreate(pBitmap->GetBuffer(),
+ pBitmap->GetWidth(),
+ pBitmap->GetHeight(),
+ 8,
+ pBitmap->GetPitch(),
+ colorSpace,
+ bmpInfo);
+ CGColorSpaceRelease(colorSpace);
+ return context;
+}
+void CQuartz2D::destroyGraphics(void* graphics)
+{
+ if (graphics) {
+ CGContextRelease((CGContextRef) graphics);
+ }
+}
+void* CQuartz2D::CreateFont(FX_LPCBYTE pFontData, FX_DWORD dwFontSize)
+{
+ CGDataProviderRef pDataProvider = CGDataProviderCreateWithData(NULL, pFontData, (size_t)dwFontSize, NULL);
+ if (NULL == pDataProvider) {
+ return NULL;
+ }
+ CGFontRef pCGFont = CGFontCreateWithDataProvider(pDataProvider);
+ CGDataProviderRelease(pDataProvider);
+ return pCGFont;
+}
+void CQuartz2D::DestroyFont(void* pFont)
+{
+ CGFontRelease((CGFontRef)pFont);
+}
+void CQuartz2D::setGraphicsTextMatrix(void* graphics, CFX_AffineMatrix* matrix)
+{
+ if (!graphics || !matrix) {
+ return;
+ }
+ CGContextRef context = (CGContextRef) graphics;
+ CGFloat ty = CGBitmapContextGetHeight(context) - matrix->f;
+ CGContextSetTextMatrix(context, CGAffineTransformMake(matrix->a,
+ matrix->b,
+ matrix->c,
+ matrix->d,
+ matrix->e,
+ ty));
+}
+FX_BOOL CQuartz2D::drawGraphicsString(void* graphics,
+ void* font,
+ FX_FLOAT fontSize,
+ FX_WORD* glyphIndices,
+ CGPoint* glyphPositions,
+ FX_INT32 charsCount,
+ FX_ARGB argb,
+ CFX_AffineMatrix* matrix )
+{
+ if (!graphics) {
+ return FALSE;
+ }
+ CGContextRef context = (CGContextRef) graphics;
+ CGContextSetFont(context, (CGFontRef)font);
+ CGContextSetFontSize(context, fontSize);
+ if (matrix) {
+ CGAffineTransform m = CGContextGetTextMatrix(context);
+ m = CGAffineTransformConcat(m,
+ CGAffineTransformMake(matrix->a,
+ matrix->b,
+ matrix->c,
+ matrix->d,
+ matrix->e,
+ matrix->f));
+ CGContextSetTextMatrix(context, m);
+ }
+ FX_INT32 a, r, g, b;
+ ArgbDecode(argb, a, r, g, b);
+ CGContextSetRGBFillColor(context,
+ r / 255.f,
+ g / 255.f,
+ b / 255.f,
+ a / 255.f);
+ CGContextSaveGState(context);
+#if CGFLOAT_IS_DOUBLE
+ CGPoint* glyphPositionsCG = new CGPoint[charsCount];
+ if (!glyphPositionsCG) {
+ return FALSE;
+ }
+ for (int index = 0; index < charsCount; ++index) {
+ glyphPositionsCG[index].x = glyphPositions[index].x;
+ glyphPositionsCG[index].y = glyphPositions[index].y;
+ }
+#else
+ CGPoint* glyphPositionsCG = (CGPoint*)glyphPositions;
+#endif
+ CGContextShowGlyphsAtPositions(context,
+ (CGGlyph *) glyphIndices,
+ glyphPositionsCG,
+ charsCount);
+#if CGFLOAT_IS_DOUBLE
+ delete[] glyphPositionsCG;
+#endif
+ CGContextRestoreGState(context);
+ return TRUE;
+}
+void CQuartz2D::saveGraphicsState(void * graphics)
+{
+ if (graphics) {
+ CGContextSaveGState((CGContextRef) graphics);
+ }
+}
+void CQuartz2D::restoreGraphicsState(void * graphics)
+{
+ if (graphics) {
+ CGContextRestoreGState((CGContextRef) graphics);
+ }
+}
+static CGContextRef createContextWithBitmap(CFX_DIBitmap* pBitmap)
+{
+ if (!pBitmap || pBitmap->IsCmykImage() || pBitmap->GetBPP() < 32) {
+ return NULL;
+ }
+ CGBitmapInfo bitmapInfo = kCGBitmapByteOrder32Little;
+ if (pBitmap->HasAlpha()) {
+ bitmapInfo |= kCGImageAlphaPremultipliedFirst;
+ } else {
+ bitmapInfo |= kCGImageAlphaNoneSkipFirst;
+ }
+ CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
+ CGContextRef context = CGBitmapContextCreate(pBitmap->GetBuffer(),
+ pBitmap->GetWidth(),
+ pBitmap->GetHeight(),
+ 8,
+ pBitmap->GetPitch(),
+ colorSpace,
+ bitmapInfo);
+ CGColorSpaceRelease(colorSpace);
+ return context;
+}
+CFX_QuartzDeviceDriver::CFX_QuartzDeviceDriver(CGContextRef context, FX_INT32 deviceClass)
+{
+ m_saveCount = 0;
+ _context = context;
+ _deviceClass = deviceClass;
+ CGContextRetain(_context);
+ CGRect r = CGContextGetClipBoundingBox(context);
+ _width = FXSYS_round(r.size.width);
+ _height = FXSYS_round(r.size.height);
+ _renderCaps = FXRC_SOFT_CLIP | FXRC_BLEND_MODE |
+ FXRC_ALPHA_PATH | FXRC_ALPHA_IMAGE |
+ FXRC_BIT_MASK | FXRC_ALPHA_MASK;
+ if (_deviceClass != FXDC_DISPLAY) {
+ } else {
+ CGImageRef image = CGBitmapContextCreateImage(_context);
+ if (image) {
+ _renderCaps |= FXRC_GET_BITS;
+ _width = CGImageGetWidth(image);
+ _height = CGImageGetHeight(image);
+ CGImageAlphaInfo alphaInfo = CGImageGetAlphaInfo(image);
+ if (kCGImageAlphaPremultipliedFirst == alphaInfo ||
+ kCGImageAlphaPremultipliedLast == alphaInfo ||
+ kCGImageAlphaOnly == alphaInfo) {
+ _renderCaps |= FXRC_ALPHA_OUTPUT;
+ }
+ }
+ CGImageRelease(image);
+ }
+ CGAffineTransform ctm = CGContextGetCTM(_context);
+ CGContextSaveGState(_context);
+ m_saveCount++;
+ if (ctm.d >= 0) {
+ CGFloat offset_x, offset_y;
+ offset_x = ctm.tx;
+ offset_y = ctm.ty;
+ CGContextTranslateCTM(_context, -offset_x, -offset_y);
+ CGContextConcatCTM(_context, CGAffineTransformMake(1, 0, 0, -1, offset_x, _height + offset_y));
+ }
+ _foxitDevice2User = CGAffineTransformIdentity;
+ _user2FoxitDevice = CGAffineTransformInvert(_foxitDevice2User);
+}
+CFX_QuartzDeviceDriver::~CFX_QuartzDeviceDriver()
+{
+ CGContextRestoreGState(_context);
+ m_saveCount--;
+ for (int i = 0; i < m_saveCount; ++i) {
+ CGContextRestoreGState(_context);
+ }
+ if (_context) {
+ CGContextRelease(_context);
+ }
+}
+int CFX_QuartzDeviceDriver::GetDeviceCaps(int capsID)
+{
+ switch (capsID) {
+ case FXDC_DEVICE_CLASS: {
+ return _deviceClass;
+ }
+ case FXDC_PIXEL_WIDTH: {
+ return _width;
+ }
+ case FXDC_PIXEL_HEIGHT: {
+ return _height;
+ }
+ case FXDC_BITS_PIXEL: {
+ return 32;
+ }
+ case FXDC_RENDER_CAPS: {
+ return _renderCaps;
+ }
+ default: {
+ return 0;
+ }
+ }
+}
+CFX_Matrix CFX_QuartzDeviceDriver::GetCTM() const
+{
+ CGAffineTransform ctm = CGContextGetCTM(_context);
+ return CFX_Matrix(ctm.a, ctm.b, ctm.c, ctm.d, ctm.tx, ctm.ty);
+}
+void CFX_QuartzDeviceDriver::SaveState()
+{
+ CGContextSaveGState(_context);
+ m_saveCount++;
+}
+void CFX_QuartzDeviceDriver::RestoreState(FX_BOOL isKeepSaved )
+{
+ CGContextRestoreGState(_context);
+ if (isKeepSaved) {
+ CGContextSaveGState(_context);
+ } else {
+ m_saveCount--;
+ }
+}
+FX_BOOL CFX_QuartzDeviceDriver::SetClip_PathFill(const CFX_PathData* pathData,
+ const CFX_AffineMatrix* matrix,
+ int fillMode )
+{
+ SaveState();
+ CGAffineTransform m = CGAffineTransformIdentity;
+ if (matrix) {
+ m = CGAffineTransformMake(matrix->GetA(), matrix->GetB(), matrix->GetC(), matrix->GetD(), matrix->GetE(), matrix->GetF());
+ }
+ m = CGAffineTransformConcat(m, _foxitDevice2User);
+ CGContextConcatCTM(_context, m);
+ setPathToContext(pathData);
+ RestoreState(FALSE);
+ if ((fillMode & 3) == FXFILL_WINDING) {
+ CGContextClip(_context);
+ } else {
+ CGContextEOClip(_context);
+ }
+ return TRUE;
+}
+FX_FLOAT CFX_QuartzDeviceDriver::getLineWidth(const CFX_GraphStateData * graphState, CGAffineTransform ctm)
+{
+ FX_FLOAT lineWidth = graphState->m_LineWidth;
+ if (graphState->m_LineWidth <= 0.f) {
+ CGSize size;
+ size.width = 1;
+ size.height = 1;
+ CGSize temp = CGSizeApplyAffineTransform(size, ctm);
+ CGFloat x = 1 / temp.width;
+ CGFloat y = 1 / temp.height;
+ lineWidth = x > y ? x : y;
+ }
+ return lineWidth;
+}
+FX_BOOL CFX_QuartzDeviceDriver::SetClip_PathStroke(const CFX_PathData* pathData,
+ const CFX_AffineMatrix* matrix,
+ const CFX_GraphStateData* graphState )
+{
+ SaveState();
+ CGAffineTransform m = CGAffineTransformIdentity;
+ if (matrix) {
+ m = CGAffineTransformMake(matrix->GetA(), matrix->GetB(), matrix->GetC(), matrix->GetD(), matrix->GetE(), matrix->GetF());
+ }
+ m = CGAffineTransformConcat(m, _foxitDevice2User);
+ CGContextConcatCTM(_context, m);
+ FX_FLOAT lineWidth = getLineWidth(graphState, m);
+ setStrokeInfo(graphState, 0xFF000000, lineWidth);
+ setPathToContext(pathData);
+ CGContextReplacePathWithStrokedPath(_context);
+ RestoreState(FALSE);
+ CGContextClip(_context);
+ return TRUE;
+}
+static CGBlendMode GetCGBlendMode(int blend_type)
+{
+ CGBlendMode mode = kCGBlendModeNormal;
+ switch (blend_type) {
+ case FXDIB_BLEND_NORMAL:
+ mode = kCGBlendModeNormal;
+ break;
+ case FXDIB_BLEND_MULTIPLY:
+ mode = kCGBlendModeMultiply;
+ break;
+ case FXDIB_BLEND_SCREEN:
+ mode = kCGBlendModeScreen;
+ break;
+ case FXDIB_BLEND_OVERLAY:
+ mode = kCGBlendModeOverlay;
+ break;
+ case FXDIB_BLEND_DARKEN:
+ mode = kCGBlendModeDarken;
+ break;
+ case FXDIB_BLEND_LIGHTEN:
+ mode = kCGBlendModeLighten;
+ break;
+ case FXDIB_BLEND_COLORDODGE:
+ mode = kCGBlendModeColorDodge;
+ break;
+ case FXDIB_BLEND_COLORBURN:
+ mode = kCGBlendModeColorBurn;
+ break;
+ case FXDIB_BLEND_HARDLIGHT:
+ mode = kCGBlendModeHardLight;
+ break;
+ case FXDIB_BLEND_SOFTLIGHT:
+ mode = kCGBlendModeSoftLight;
+ break;
+ case FXDIB_BLEND_DIFFERENCE:
+ mode = kCGBlendModeDifference;
+ break;
+ case FXDIB_BLEND_EXCLUSION:
+ mode = kCGBlendModeExclusion;
+ break;
+ case FXDIB_BLEND_HUE:
+ mode = kCGBlendModeHue;
+ break;
+ case FXDIB_BLEND_SATURATION:
+ mode = kCGBlendModeSaturation;
+ break;
+ case FXDIB_BLEND_COLOR:
+ mode = kCGBlendModeColor;
+ break;
+ case FXDIB_BLEND_LUMINOSITY:
+ mode = kCGBlendModeLuminosity;
+ break;
+ default:
+ mode = kCGBlendModeNormal;
+ break;
+ }
+ return mode;
+}
+FX_BOOL CFX_QuartzDeviceDriver::DrawPath(const CFX_PathData* pathData,
+ const CFX_AffineMatrix* matrix,
+ const CFX_GraphStateData* graphState,
+ FX_DWORD fillArgb,
+ FX_DWORD strokeArgb,
+ int fillMode,
+ int alpha_flag,
+ void* pIccTransform,
+ int blend_type
+ )
+{
+ SaveState();
+ CGBlendMode mode = GetCGBlendMode(blend_type);
+ if (mode != kCGBlendModeNormal) {
+ CGContextSetBlendMode(_context, mode);
+ }
+ CGAffineTransform m = CGAffineTransformIdentity;
+ if (matrix) {
+ m = CGAffineTransformMake(matrix->GetA(), matrix->GetB(), matrix->GetC(), matrix->GetD(), matrix->GetE(), matrix->GetF());
+ }
+ m = CGAffineTransformConcat(m, _foxitDevice2User);
+ CGContextConcatCTM(_context, m);
+ int pathMode = 0;
+ if (graphState && strokeArgb) {
+ CGContextSetMiterLimit(_context, graphState->m_MiterLimit);
+ FX_FLOAT lineWidth = getLineWidth(graphState, m);
+ setStrokeInfo(graphState, strokeArgb, lineWidth);
+ pathMode |= 4;
+ }
+ if (fillMode && fillArgb) {
+ setFillInfo(fillArgb);
+ if ((fillMode & 3) == FXFILL_WINDING) {
+ pathMode |= 1;
+ } else if ((fillMode & 3) == FXFILL_ALTERNATE) {
+ pathMode |= 2;
+ }
+ }
+ setPathToContext(pathData);
+ if (fillMode & FXFILL_FULLCOVER) {
+ CGContextSetShouldAntialias(_context, false);
+ }
+ if (pathMode == 4) {
+ CGContextStrokePath(_context);
+ } else if (pathMode == 1) {
+ CGContextFillPath(_context);
+ } else if (pathMode == 2) {
+ CGContextEOFillPath(_context);
+ } else if (pathMode == 5) {
+ CGContextDrawPath(_context, kCGPathFillStroke);
+ } else if (pathMode == 6) {
+ CGContextDrawPath(_context, kCGPathEOFillStroke);
+ }
+ RestoreState(FALSE);
+ return TRUE;
+}
+FX_BOOL CFX_QuartzDeviceDriver::FillRect(const FX_RECT* rect,
+ FX_ARGB fillArgb,
+ int alphaFlag ,
+ void* iccTransform ,
+ int blend_type )
+{
+ CGBlendMode mode = GetCGBlendMode(blend_type);
+ if (mode != kCGBlendModeNormal) {
+ CGContextSetBlendMode(_context, mode);
+ }
+ CGRect rect_fx = CGRectMake(rect->left, rect->top, rect->Width(), rect->Height());
+ CGRect rect_usr = CGRectApplyAffineTransform(rect_fx, _foxitDevice2User);
+ FX_INT32 a, r, g, b;
+ ArgbDecode(fillArgb, a, r, g, b);
+ CGContextSetRGBFillColor(_context,
+ r / 255.f,
+ g / 255.f,
+ b / 255.f,
+ a / 255.f);
+ CGContextFillRect(_context, rect_usr);
+ if (mode != kCGBlendModeNormal) {
+ CGContextSetBlendMode(_context, kCGBlendModeNormal);
+ }
+ return TRUE;
+}
+FX_BOOL CFX_QuartzDeviceDriver::DrawCosmeticLine(FX_FLOAT x1,
+ FX_FLOAT y1,
+ FX_FLOAT x2,
+ FX_FLOAT y2,
+ FX_DWORD argb,
+ int alphaFlag ,
+ void* iccTransform ,
+ int blend_type )
+{
+ CGBlendMode mode = GetCGBlendMode(blend_type);
+ if (mode != kCGBlendModeNormal) {
+ CGContextSetBlendMode(_context, mode);
+ }
+ CGPoint pt = CGPointApplyAffineTransform(CGPointMake(x1, y1), _foxitDevice2User);
+ x1 = pt.x;
+ y1 = pt.y;
+ pt = CGPointApplyAffineTransform(CGPointMake(x2, y2), _foxitDevice2User);
+ x2 = pt.x;
+ y2 = pt.y;
+ FX_INT32 a, r, g, b;
+ ArgbDecode(argb, a, r, g, b);
+ CGContextSetRGBStrokeColor(_context,
+ r / 255.f,
+ g / 255.f,
+ b / 255.f,
+ a / 255.f);
+ CGContextMoveToPoint(_context, x1, y1);
+ CGContextAddLineToPoint(_context, x2, y2);
+ CGContextStrokePath(_context);
+ if (mode != kCGBlendModeNormal) {
+ CGContextSetBlendMode(_context, kCGBlendModeNormal);
+ }
+ return TRUE;
+}
+FX_BOOL CFX_QuartzDeviceDriver::GetClipBox(FX_RECT* rect)
+{
+ CGRect r = CGContextGetClipBoundingBox(_context);
+ r = CGRectApplyAffineTransform(r, _user2FoxitDevice);
+ rect->left = FXSYS_floor(r.origin.x);
+ rect->top = FXSYS_floor(r.origin.y);
+ rect->right = FXSYS_ceil(r.origin.x + r.size.width);
+ rect->bottom = FXSYS_ceil(r.origin.y + r.size.height);
+ return TRUE;
+}
+FX_BOOL CFX_QuartzDeviceDriver::GetDIBits(CFX_DIBitmap* bitmap,
+ FX_INT32 left,
+ FX_INT32 top,
+ void* pIccTransform,
+ FX_BOOL bDEdge)
+{
+ if (FXDC_PRINTER == _deviceClass) {
+ return FALSE;
+ }
+ if (bitmap->GetBPP() < 32) {
+ return FALSE;
+ }
+ if (!(_renderCaps | FXRC_GET_BITS)) {
+ return FALSE;
+ }
+ CGPoint pt = CGPointMake(left, top);
+ pt = CGPointApplyAffineTransform(pt, _foxitDevice2User);
+ CGAffineTransform ctm = CGContextGetCTM(_context);
+ pt.x *= FXSYS_fabs(ctm.a);
+ pt.y *= FXSYS_fabs(ctm.d);
+ CGImageRef image = CGBitmapContextCreateImage(_context);
+ if (NULL == image) {
+ return FALSE;
+ }
+ CGFloat width = (CGFloat) bitmap->GetWidth();
+ CGFloat height = (CGFloat) bitmap->GetHeight();
+ if (width + pt.x > _width) {
+ width -= (width + pt.x - _width);
+ }
+ if (height + pt.y > _height) {
+ height -= (height + pt.y - _height);
+ }
+ CGImageRef subImage = CGImageCreateWithImageInRect(image,
+ CGRectMake(pt.x,
+ pt.y,
+ width,
+ height));
+ CGContextRef context = createContextWithBitmap(bitmap);
+ CGRect rect = CGContextGetClipBoundingBox(context);
+ CGContextClearRect(context, rect);
+ CGContextDrawImage(context, rect, subImage);
+ CGContextRelease(context);
+ CGImageRelease(subImage);
+ CGImageRelease(image);
+ if (bitmap->HasAlpha()) {
+ for (int row = 0; row < bitmap->GetHeight(); row ++) {
+ FX_LPBYTE pScanline = (FX_LPBYTE)bitmap->GetScanline(row);
+ for (int col = 0; col < bitmap->GetWidth(); col ++) {
+ if (pScanline[3] > 0) {
+ pScanline[0] = (pScanline[0] * 255.f / pScanline[3] + .5f);
+ pScanline[1] = (pScanline[1] * 255.f / pScanline[3] + .5f);
+ pScanline[2] = (pScanline[2] * 255.f / pScanline[3] + .5f);
+ }
+ pScanline += 4;
+ }
+ }
+ }
+ return TRUE;
+}
+FX_BOOL CFX_QuartzDeviceDriver::SetDIBits(const CFX_DIBSource* pBitmap,
+ FX_ARGB argb,
+ const FX_RECT* srcRect,
+ int dest_left,
+ int dest_top,
+ int blendType,
+ int alphaFlag ,
+ void* iccTransform )
+{
+ SaveState();
+ CGFloat src_left, src_top, src_width, src_height;
+ if (srcRect) {
+ src_left = srcRect->left;
+ src_top = srcRect->top;
+ src_width = srcRect->Width();
+ src_height = srcRect->Height();
+ } else {
+ src_left = src_top = 0;
+ src_width = pBitmap->GetWidth();
+ src_height = pBitmap->GetHeight();
+ }
+ CGAffineTransform ctm = CGContextGetCTM(_context);
+ CGFloat scale_x = FXSYS_fabs(ctm.a);
+ CGFloat scale_y = FXSYS_fabs(ctm.d);
+ src_left /= scale_x;
+ src_top /= scale_y;
+ src_width /= scale_x;
+ src_height /= scale_y;
+ CGRect rect_fx = CGRectMake(dest_left, dest_top, src_width, src_height);
+ CGRect rect_usr = CGRectApplyAffineTransform(rect_fx, _foxitDevice2User);
+ CGContextBeginPath(_context);
+ CGContextAddRect(_context, rect_usr);
+ CGContextClip(_context);
+ rect_usr.size = CGSizeMake(pBitmap->GetWidth() / scale_x, pBitmap->GetHeight() / scale_y);
+ rect_usr = CGRectOffset(rect_usr, -src_left, -src_top);
+ CG_SetImageTransform(dest_left, dest_top, src_width, src_height, &rect_usr);
+ CFX_DIBitmap* pBitmap1 = NULL;
+ if (pBitmap->IsAlphaMask()) {
+ if (pBitmap->GetBuffer()) {
+ pBitmap1 = (CFX_DIBitmap*)pBitmap;
+ } else {
+ pBitmap1 = pBitmap->Clone();
+ }
+ if (NULL == pBitmap1) {
+ RestoreState(FALSE);
+ return FALSE;
+ }
+ CGDataProviderRef pBitmapProvider = CGDataProviderCreateWithData(NULL,
+ pBitmap1->GetBuffer(),
+ pBitmap1->GetPitch() * pBitmap1->GetHeight(),
+ NULL);
+ CGColorSpaceRef pColorSpace = CGColorSpaceCreateDeviceGray();
+ CGBitmapInfo bitmapInfo = kCGImageAlphaNone | kCGBitmapByteOrderDefault;
+ CGImageRef pImage = CGImageCreate(pBitmap1->GetWidth(),
+ pBitmap1->GetHeight(),
+ pBitmap1->GetBPP(),
+ pBitmap1->GetBPP(),
+ pBitmap1->GetPitch(),
+ pColorSpace,
+ bitmapInfo,
+ pBitmapProvider, NULL, true,
+ kCGRenderingIntentDefault);
+ CGContextClipToMask(_context, rect_usr, pImage);
+ CGContextSetRGBFillColor(_context,
+ FXARGB_R(argb) / 255.f,
+ FXARGB_G(argb) / 255.f,
+ FXARGB_B(argb) / 255.f,
+ FXARGB_A(argb) / 255.f);
+ CGContextFillRect(_context, rect_usr);
+ CGImageRelease(pImage);
+ CGColorSpaceRelease(pColorSpace);
+ CGDataProviderRelease(pBitmapProvider);
+ if (pBitmap1 != pBitmap) {
+ delete pBitmap1;
+ }
+ RestoreState(FALSE);
+ return TRUE;
+ }
+ if (pBitmap->GetBPP() < 32) {
+ pBitmap1 = pBitmap->CloneConvert(FXDIB_Rgb32);
+ } else {
+ if (pBitmap->GetBuffer()) {
+ pBitmap1 = (CFX_DIBitmap*)pBitmap;
+ } else {
+ pBitmap1 = pBitmap->Clone();
+ }
+ }
+ if (NULL == pBitmap1) {
+ RestoreState(FALSE);
+ return FALSE;
+ }
+ if (pBitmap1->HasAlpha()) {
+ if (pBitmap1 == pBitmap) {
+ pBitmap1 = pBitmap->Clone();
+ if (!pBitmap1) {
+ RestoreState(FALSE);
+ return FALSE;
+ }
+ }
+ for (int row = 0; row < pBitmap1->GetHeight(); row ++) {
+ FX_LPBYTE pScanline = (FX_LPBYTE)pBitmap1->GetScanline(row);
+ for (int col = 0; col < pBitmap1->GetWidth(); col ++) {
+ pScanline[0] = (FX_BYTE)(pScanline[0] * pScanline[3] / 255.f + .5f);
+ pScanline[1] = (FX_BYTE)(pScanline[1] * pScanline[3] / 255.f + .5f);
+ pScanline[2] = (FX_BYTE)(pScanline[2] * pScanline[3] / 255.f + .5f);
+ pScanline += 4;
+ }
+ }
+ }
+ CGContextRef ctx = createContextWithBitmap(pBitmap1);
+ CGImageRef image = CGBitmapContextCreateImage(ctx);
+ int blend_mode = blendType;
+ if (FXDIB_BLEND_HARDLIGHT == blendType) {
+ blend_mode = kCGBlendModeSoftLight;
+ } else if (FXDIB_BLEND_SOFTLIGHT == blendType) {
+ blend_mode = kCGBlendModeHardLight;
+ } else if (blendType >= FXDIB_BLEND_NONSEPARABLE && blendType <= FXDIB_BLEND_LUMINOSITY) {
+ blend_mode = blendType - 9;
+ } else if (blendType > FXDIB_BLEND_LUMINOSITY || blendType < 0) {
+ blend_mode = kCGBlendModeNormal;
+ }
+ CGContextSetBlendMode(_context, (CGBlendMode)blend_mode);
+ CGContextDrawImage(_context, rect_usr, image);
+ CGImageRelease(image);
+ CGContextRelease(ctx);
+ if (pBitmap1 != pBitmap) {
+ delete pBitmap1;
+ }
+ RestoreState(FALSE);
+ return TRUE;
+}
+FX_BOOL CFX_QuartzDeviceDriver::StretchDIBits(const CFX_DIBSource* pBitmap,
+ FX_ARGB argb,
+ int dest_left,
+ int dest_top,
+ int dest_width,
+ int dest_height,
+ const FX_RECT* clipRect,
+ FX_DWORD flags,
+ int alphaFlag ,
+ void* iccTransform ,
+ int blend_type)
+{
+ SaveState();
+ if (clipRect) {
+ CGContextBeginPath(_context);
+ CGRect rect_clip = CGRectMake(clipRect->left, clipRect->top, clipRect->Width(), clipRect->Height());
+ rect_clip = CGRectApplyAffineTransform(rect_clip, _foxitDevice2User);
+ CGContextAddRect(_context, rect_clip);
+ CGContextClip(_context);
+ }
+ CGRect rect = CGRectMake(dest_left, dest_top, dest_width, dest_height);
+ rect = CGRectApplyAffineTransform(rect, _foxitDevice2User);
+ if (FXDIB_BICUBIC_INTERPOL == flags) {
+ CGContextSetInterpolationQuality(_context, kCGInterpolationHigh);
+ } else if (FXDIB_DOWNSAMPLE == flags) {
+ CGContextSetInterpolationQuality(_context, kCGInterpolationNone);
+ } else {
+ CGContextSetInterpolationQuality(_context, kCGInterpolationMedium);
+ }
+ CG_SetImageTransform(dest_left, dest_top, dest_width, dest_height);
+ CFX_DIBitmap* pBitmap1 = NULL;
+ if (pBitmap->IsAlphaMask()) {
+ if (pBitmap->GetBuffer()) {
+ pBitmap1 = (CFX_DIBitmap*)pBitmap;
+ } else {
+ pBitmap1 = pBitmap->Clone();
+ }
+ if (NULL == pBitmap1) {
+ RestoreState(FALSE);
+ return FALSE;
+ }
+ CGDataProviderRef pBitmapProvider = CGDataProviderCreateWithData(NULL,
+ pBitmap1->GetBuffer(),
+ pBitmap1->GetPitch() * pBitmap1->GetHeight(),
+ NULL);
+ CGColorSpaceRef pColorSpace = CGColorSpaceCreateDeviceGray();
+ CGBitmapInfo bitmapInfo = kCGImageAlphaNone | kCGBitmapByteOrderDefault;
+ CGImageRef pImage = CGImageCreate(pBitmap1->GetWidth(),
+ pBitmap1->GetHeight(),
+ pBitmap1->GetBPP(),
+ pBitmap1->GetBPP(),
+ pBitmap1->GetPitch(),
+ pColorSpace,
+ bitmapInfo,
+ pBitmapProvider, NULL, true,
+ kCGRenderingIntentDefault);
+ CGContextClipToMask(_context, rect, pImage);
+ CGContextSetRGBFillColor(_context,
+ FXARGB_R(argb) / 255.f,
+ FXARGB_G(argb) / 255.f,
+ FXARGB_B(argb) / 255.f,
+ FXARGB_A(argb) / 255.f);
+ CGContextFillRect(_context, rect);
+ CGImageRelease(pImage);
+ CGColorSpaceRelease(pColorSpace);
+ CGDataProviderRelease(pBitmapProvider);
+ if (pBitmap1 != pBitmap) {
+ delete pBitmap1;
+ }
+ RestoreState(FALSE);
+ return TRUE;
+ }
+ if (pBitmap->GetBPP() < 32) {
+ pBitmap1 = pBitmap->CloneConvert(FXDIB_Rgb32);
+ } else {
+ if (pBitmap->GetBuffer()) {
+ pBitmap1 = (CFX_DIBitmap*)pBitmap;
+ } else {
+ pBitmap1 = pBitmap->Clone();
+ }
+ }
+ if (NULL == pBitmap1) {
+ RestoreState(FALSE);
+ return FALSE;
+ }
+ if (pBitmap1->HasAlpha()) {
+ if (pBitmap1 == pBitmap) {
+ pBitmap1 = pBitmap->Clone();
+ if (!pBitmap1) {
+ RestoreState(FALSE);
+ return FALSE;
+ }
+ }
+ for (int row = 0; row < pBitmap1->GetHeight(); row ++) {
+ FX_LPBYTE pScanline = (FX_LPBYTE)pBitmap1->GetScanline(row);
+ for (int col = 0; col < pBitmap1->GetWidth(); col ++) {
+ pScanline[0] = (FX_BYTE)(pScanline[0] * pScanline[3] / 255.f + .5f);
+ pScanline[1] = (FX_BYTE)(pScanline[1] * pScanline[3] / 255.f + .5f);
+ pScanline[2] = (FX_BYTE)(pScanline[2] * pScanline[3] / 255.f + .5f);
+ pScanline += 4;
+ }
+ }
+ }
+ CGContextRef ctx = createContextWithBitmap(pBitmap1);
+ CGImageRef image = CGBitmapContextCreateImage(ctx);
+ CGContextDrawImage(_context, rect, image);
+ CGImageRelease(image);
+ CGContextRelease(ctx);
+ if (pBitmap1 != pBitmap) {
+ delete pBitmap1;
+ }
+ RestoreState(FALSE);
+ return TRUE;
+}
+FX_BOOL CFX_QuartzDeviceDriver::CG_DrawGlypRun(int nChars,
+ const FXTEXT_CHARPOS* pCharPos,
+ CFX_Font* pFont,
+ CFX_FontCache* pCache,
+ const CFX_AffineMatrix* pGlyphMatrix,
+ const CFX_AffineMatrix* pObject2Device,
+ FX_FLOAT font_size,
+ FX_DWORD argb,
+ int alpha_flag,
+ void* pIccTransform)
+{
+ if (nChars == 0) {
+ return TRUE;
+ }
+ CQuartz2D& quartz2d = ((CApplePlatform *) CFX_GEModule::Get()->GetPlatformData())->_quartz2d;
+ if (!pFont->m_pPlatformFont) {
+ if (pFont->GetPsName() == CFX_WideString::FromLocal("DFHeiStd-W5")) {
+ return FALSE;
+ }
+ pFont->m_pPlatformFont = quartz2d.CreateFont(pFont->m_pFontData, pFont->m_dwSize);
+ if (NULL == pFont->m_pPlatformFont) {
+ return FALSE;
+ }
+ }
+ CFX_FixedBufGrow<FX_WORD, 32> glyph_indices(nChars);
+ CFX_FixedBufGrow<CGPoint, 32> glyph_positions(nChars);
+ for (int i = 0; i < nChars; i++ ) {
+ glyph_indices[i] = pCharPos[i].m_ExtGID;
+ glyph_positions[i].x = pCharPos[i].m_OriginX;
+ glyph_positions[i].y = pCharPos[i].m_OriginY;
+ }
+ CFX_AffineMatrix text_matrix;
+ if (pObject2Device) {
+ text_matrix.Concat(*pObject2Device);
+ }
+ CGAffineTransform matrix_cg = CGAffineTransformMake(text_matrix.a,
+ text_matrix.b,
+ text_matrix.c,
+ text_matrix.d,
+ text_matrix.e,
+ text_matrix.f);
+ matrix_cg = CGAffineTransformConcat(matrix_cg, _foxitDevice2User);
+ CGContextSetTextMatrix(_context, matrix_cg);
+ CGContextSetFont(_context, (CGFontRef)pFont->m_pPlatformFont);
+ CGContextSetFontSize(_context, FXSYS_fabs(font_size));
+ FX_INT32 a, r, g, b;
+ ArgbDecode(argb, a, r, g, b);
+ CGContextSetRGBFillColor(_context,
+ r / 255.f,
+ g / 255.f,
+ b / 255.f,
+ a / 255.f);
+ SaveState();
+ if (pGlyphMatrix) {
+ CGAffineTransform ctm = CGContextGetCTM(_context);
+ CGPoint origin = CGPointMake( glyph_positions[0].x, glyph_positions[0].y);
+ origin = CGPointApplyAffineTransform(origin, matrix_cg);
+ CGContextTranslateCTM(_context, origin.x, origin.y);
+ CGAffineTransform glyph_matrix = CGAffineTransformMake(pGlyphMatrix->a,
+ pGlyphMatrix->b,
+ pGlyphMatrix->c,
+ pGlyphMatrix->d,
+ pGlyphMatrix->e,
+ pGlyphMatrix->f);
+ if (_foxitDevice2User.d < 0) {
+ glyph_matrix = CGAffineTransformInvert(glyph_matrix);
+ }
+ CGContextConcatCTM(_context, glyph_matrix);
+ CGContextTranslateCTM(_context, -origin.x, -origin.y);
+ }
+ CGContextShowGlyphsAtPositions(_context,
+ (CGGlyph*)glyph_indices,
+ glyph_positions,
+ nChars);
+ RestoreState(FALSE);
+ return TRUE;
+}
+FX_BOOL CFX_QuartzDeviceDriver::DrawDeviceText(int nChars,
+ const FXTEXT_CHARPOS* pCharPos,
+ CFX_Font* pFont,
+ CFX_FontCache* pCache,
+ const CFX_AffineMatrix* pObject2Device,
+ FX_FLOAT font_size,
+ FX_DWORD color,
+ int alpha_flag ,
+ void* pIccTransform)
+{
+ if (NULL == pFont || NULL == _context) {
+ return FALSE;
+ }
+ FX_BOOL bBold = pFont->IsBold();
+ if (!bBold && pFont->GetSubstFont() &&
+ pFont->GetSubstFont()->m_Weight >= 500 &&
+ pFont->GetSubstFont()->m_Weight <= 600) {
+ return FALSE;
+ }
+ SaveState();
+ CGContextSetTextDrawingMode(_context, kCGTextFillClip);
+ FX_BOOL ret = FALSE;
+ FX_INT32 i = 0;
+ while (i < nChars) {
+ if (pCharPos[i].m_bGlyphAdjust || font_size < 0) {
+ if (i > 0) {
+ ret = CG_DrawGlypRun(i, pCharPos, pFont, pCache, NULL, pObject2Device, font_size, color, alpha_flag, pIccTransform);
+ if (!ret) {
+ RestoreState(FALSE);
+ return ret;
+ }
+ }
+ const FXTEXT_CHARPOS* char_pos = pCharPos + i;
+ CFX_AffineMatrix glphy_matrix;
+ if (font_size < 0) {
+ glphy_matrix.Concat(-1, 0, 0, -1, 0, 0);
+ }
+ if (char_pos->m_bGlyphAdjust) {
+ glphy_matrix.Concat(char_pos->m_AdjustMatrix[0],
+ char_pos->m_AdjustMatrix[1],
+ char_pos->m_AdjustMatrix[2],
+ char_pos->m_AdjustMatrix[3], 0, 0);
+ }
+ ret = CG_DrawGlypRun(1, char_pos, pFont, pCache, &glphy_matrix, pObject2Device, font_size, color, alpha_flag, pIccTransform);
+ if (!ret) {
+ RestoreState(FALSE);
+ return ret;
+ }
+ i ++;
+ pCharPos += i;
+ nChars -= i;
+ i = 0;
+ } else {
+ i ++;
+ }
+ }
+ if (i > 0) {
+ ret = CG_DrawGlypRun(i, pCharPos, pFont, pCache, NULL, pObject2Device, font_size, color, alpha_flag, pIccTransform);
+ }
+ RestoreState(FALSE);
+ return ret;
+}
+void CFX_QuartzDeviceDriver::setStrokeInfo(const CFX_GraphStateData* graphState, FX_ARGB argb, FX_FLOAT lineWidth)
+{
+ if (NULL == graphState) {
+ return;
+ }
+ CGContextSetLineWidth(_context, lineWidth);
+ CGLineCap cap;
+ switch (graphState->m_LineCap) {
+ case CFX_GraphStateData::LineCapRound: {
+ cap = kCGLineCapRound;
+ break;
+ }
+ case CFX_GraphStateData::LineCapSquare: {
+ cap = kCGLineCapSquare;
+ break;
+ }
+ case CFX_GraphStateData::LineCapButt:
+ default: {
+ cap = kCGLineCapButt;
+ }
+ }
+ CGContextSetLineCap(_context, cap);
+ CGLineJoin join;
+ switch (graphState->m_LineJoin) {
+ case CFX_GraphStateData::LineJoinRound: {
+ join = kCGLineJoinRound;
+ break;
+ }
+ case CFX_GraphStateData::LineJoinBevel: {
+ join = kCGLineJoinBevel;
+ break;
+ }
+ case CFX_GraphStateData::LineJoinMiter:
+ default: {
+ join = kCGLineJoinMiter;
+ }
+ }
+ CGContextSetLineJoin(_context, join);
+ if (graphState->m_DashCount) {
+#if CGFLOAT_IS_DOUBLE
+ CGFloat* dashArray = new CGFloat[graphState->m_DashCount];
+ if (!dashArray) {
+ return;
+ }
+ for (int index = 0; index < graphState->m_DashCount; ++index) {
+ dashArray[index] = graphState->m_DashArray[index];
+ }
+#else
+ CGFloat* dashArray = (CGFloat*)graphState->m_DashArray;
+#endif
+ CGContextSetLineDash(_context, graphState->m_DashPhase, dashArray, graphState->m_DashCount);
+#if CGFLOAT_IS_DOUBLE
+ delete[] dashArray;
+#endif
+ }
+ FX_INT32 a, r, g, b;
+ ArgbDecode(argb, a, r, g, b);
+ CGContextSetRGBStrokeColor(_context,
+ r / 255.f,
+ g / 255.f,
+ b / 255.f,
+ a / 255.f);
+}
+void CFX_QuartzDeviceDriver::setFillInfo(FX_ARGB argb)
+{
+ FX_INT32 a, r, g, b;
+ ArgbDecode(argb, a, r, g, b);
+ CGContextSetRGBFillColor(_context,
+ r / 255.f,
+ g / 255.f,
+ b / 255.f,
+ a / 255.f);
+}
+void CFX_QuartzDeviceDriver::setPathToContext(const CFX_PathData* pathData)
+{
+ FX_INT32 count = pathData->GetPointCount();
+ FX_PATHPOINT* points = pathData->GetPoints();
+ CGContextBeginPath(_context);
+ for (FX_INT32 i = 0; i < count; i ++) {
+ switch (points[i].m_Flag & FXPT_TYPE) {
+ case FXPT_MOVETO:
+ CGContextMoveToPoint(_context, points[i].m_PointX, points[i].m_PointY);
+ break;
+ case FXPT_LINETO:
+ CGContextAddLineToPoint(_context, points[i].m_PointX, points[i].m_PointY);
+ break;
+ case FXPT_BEZIERTO: {
+ CGContextAddCurveToPoint(_context,
+ points[i].m_PointX, points[i].m_PointY,
+ points[i + 1].m_PointX, points[i + 1].m_PointY,
+ points[i + 2].m_PointX, points[i + 2].m_PointY);
+ i += 2;
+ }
+ }
+ if (points[i].m_Flag & FXPT_CLOSEFIGURE) {
+ CGContextClosePath(_context);
+ }
+ }
+}
+void CFX_QuartzDeviceDriver::CG_SetImageTransform(int dest_left, int dest_top, int dest_width, int dest_height,
+ CGRect* rect )
+{
+ int flip_y = _foxitDevice2User.d * dest_height < 0 ? 1 : -1;
+ int flip_x = _foxitDevice2User.a * dest_width > 0 ? 1 : -1;
+ if (flip_y < 0 || flip_x < 0) {
+ if (dest_height < 0) {
+ dest_height = -dest_height;
+ dest_top -= dest_height;
+ }
+ CGRect rt = CGRectApplyAffineTransform(CGRectMake(dest_left, dest_top, dest_width, dest_height), _foxitDevice2User);
+ CGFloat offset_x = (rt.origin.x) + rt.size.width / 2.f,
+ offset_y = (rt.origin.y) + rt.size.height / 2.f;
+ CGAffineTransform transform = CGAffineTransformIdentity;
+ transform = CGAffineTransformConcat(transform, CGAffineTransformMake(1, 0, 0, 1, -offset_x, -offset_y));
+ transform = CGAffineTransformConcat(transform, CGAffineTransformMake(flip_x, 0, 0, flip_y, 0, 0));
+ transform = CGAffineTransformConcat(transform, CGAffineTransformMake(1, 0, 0, 1, offset_x, offset_y));
+ CGContextConcatCTM(_context, transform);
+ if (rect) {
+ *rect = CGRectApplyAffineTransform(*rect, transform);
+ }
+ }
+}
+void CFX_QuartzDeviceDriver::ClearDriver()
+{
+ if (NULL == _context) {
+ return;
+ }
+ for (int i = 0; i < m_saveCount; ++i) {
+ CGContextRestoreGState(_context);
+ }
+ m_saveCount = 0;
+ if (_context) {
+ CGContextRelease(_context);
+ }
+}
+CFX_QuartzDevice::CFX_QuartzDevice()
+{
+ m_bOwnedBitmap = FALSE;
+ m_pContext = NULL;
+}
+CFX_QuartzDevice::~CFX_QuartzDevice()
+{
+ if (m_pContext) {
+ CGContextRelease(m_pContext);
+ }
+ if (GetBitmap() && m_bOwnedBitmap) {
+ delete GetBitmap();
+ }
+}
+CGContextRef CFX_QuartzDevice::GetContext()
+{
+ return m_pContext;
+}
+FX_BOOL CFX_QuartzDevice::Attach(CGContextRef context, FX_INT32 nDeviceClass)
+{
+ if (m_pContext) {
+ CGContextRelease(m_pContext);
+ }
+ m_pContext = context;
+ CGContextRetain(m_pContext);
+ IFX_RenderDeviceDriver* pDriver = FX_NEW CFX_QuartzDeviceDriver(m_pContext, nDeviceClass);
+ if (!pDriver) {
+ return FALSE;
+ }
+ SetDeviceDriver(pDriver);
+ return TRUE;
+}
+FX_BOOL CFX_QuartzDevice::Attach(CFX_DIBitmap* pBitmap)
+{
+ SetBitmap(pBitmap);
+ m_pContext = createContextWithBitmap(pBitmap);
+ if (NULL == m_pContext) {
+ return FALSE;
+ }
+ IFX_RenderDeviceDriver* pDriver = FX_NEW CFX_QuartzDeviceDriver(m_pContext, FXDC_DISPLAY);
+ if (!pDriver) {
+ return FALSE;
+ }
+ SetDeviceDriver(pDriver);
+ return TRUE;
+}
+FX_BOOL CFX_QuartzDevice::Create(FX_INT32 width, FX_INT32 height, FXDIB_Format format)
+{
+ if ((FX_BYTE)format < 32) {
+ return FALSE;
+ }
+ CFX_DIBitmap* pBitmap = FX_NEW CFX_DIBitmap;
+ if (!pBitmap) {
+ return FALSE;
+ }
+ if (!pBitmap->Create(width, height, format)) {
+ delete pBitmap;
+ return FALSE;
+ }
+ m_bOwnedBitmap = TRUE;
+ return Attach(pBitmap);
+}
+#endif
diff --git a/core/src/fxge/dib/dib_int.h b/core/src/fxge/dib/dib_int.h
new file mode 100644
index 0000000000..a9d0b027c5
--- /dev/null
+++ b/core/src/fxge/dib/dib_int.h
@@ -0,0 +1,88 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+class CPDF_FixedMatrix : public CFX_Object
+{
+public:
+ CPDF_FixedMatrix(const CFX_AffineMatrix& src, int bits)
+ {
+ base = 1 << bits;
+ a = FXSYS_round(src.a * base);
+ b = FXSYS_round(src.b * base);
+ c = FXSYS_round(src.c * base);
+ d = FXSYS_round(src.d * base);
+ e = FXSYS_round(src.e * base);
+ f = FXSYS_round(src.f * base);
+ }
+ inline void Transform(int x, int y, int& x1, int& y1)
+ {
+ x1 = (a * x + c * y + e + base / 2) / base;
+ y1 = (b * x + d * y + f + base / 2) / base;
+ }
+ int a, b, c, d, e, f;
+ int base;
+};
+#define FPDF_HUGE_IMAGE_SIZE 60000000
+struct PixelWeight {
+ int m_SrcStart;
+ int m_SrcEnd;
+ int m_Weights[1];
+};
+class CWeightTable : public CFX_Object
+{
+public:
+ CWeightTable()
+ {
+ m_pWeightTables = NULL;
+ }
+ ~CWeightTable()
+ {
+ if(m_pWeightTables) {
+ FX_Free(m_pWeightTables);
+ }
+ m_pWeightTables = NULL;
+ }
+ void Calc(int dest_len, int dest_min, int dest_max, int src_len, int src_min, int src_max, int flags);
+ PixelWeight* GetPixelWeight(int pixel)
+ {
+ return (PixelWeight*)(m_pWeightTables + (pixel - m_DestMin) * m_ItemSize);
+ }
+ int m_DestMin, m_ItemSize;
+ FX_LPBYTE m_pWeightTables;
+};
+class CStretchEngine : public CFX_Object
+{
+public:
+ CStretchEngine(IFX_ScanlineComposer* pDestBitmap, FXDIB_Format dest_format,
+ int dest_width, int dest_height, const FX_RECT& clip_rect,
+ const CFX_DIBSource* pSrcBitmap, int flags);
+ ~CStretchEngine();
+ FX_BOOL Continue(IFX_Pause* pPause);
+public:
+ FXDIB_Format m_DestFormat;
+ int m_DestBpp, m_SrcBpp, m_bHasAlpha;
+ IFX_ScanlineComposer* m_pDestBitmap;
+ int m_DestWidth, m_DestHeight;
+ FX_RECT m_DestClip;
+ FX_LPBYTE m_pDestScanline;
+ FX_LPBYTE m_pDestMaskScanline;
+ FX_RECT m_SrcClip;
+ const CFX_DIBSource* m_pSource;
+ FX_DWORD* m_pSrcPalette;
+ int m_SrcWidth, m_SrcHeight;
+ int m_SrcPitch, m_InterPitch;
+ int m_ExtraMaskPitch;
+ unsigned char* m_pInterBuf;
+ unsigned char* m_pExtraAlphaBuf;
+ int m_TransMethod;
+ int m_Flags;
+ CWeightTable m_WeightTable;
+ int m_CurRow;
+ FX_BOOL StartStretchHorz();
+ FX_BOOL ContinueStretchHorz(IFX_Pause* pPause);
+ void StretchVert();
+ int m_State;
+};
diff --git a/core/src/fxge/dib/fx_dib_composite.cpp b/core/src/fxge/dib/fx_dib_composite.cpp
new file mode 100644
index 0000000000..8e9b4912a8
--- /dev/null
+++ b/core/src/fxge/dib/fx_dib_composite.cpp
@@ -0,0 +1,4602 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxge/fx_ge.h"
+#include "../../../include/fxcodec/fx_codec.h"
+#include "dib_int.h"
+const FX_BYTE g_GammaRamp[256] = {
+ 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3,
+ 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7,
+ 8, 8, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 12, 12, 12, 13,
+ 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 17, 18, 18, 19, 19, 20,
+ 20, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 27, 27, 28, 29, 29,
+ 30, 30, 31, 32, 32, 33, 34, 35, 35, 36, 37, 37, 38, 39, 40, 41,
+ 41, 42, 43, 44, 45, 45, 46, 47, 48, 49, 50, 51, 51, 52, 53, 54,
+ 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70,
+ 71, 72, 73, 74, 76, 77, 78, 79, 80, 81, 82, 84, 85, 86, 87, 88,
+ 90, 91, 92, 93, 95, 96, 97, 99, 100, 101, 103, 104, 105, 107, 108, 109,
+ 111, 112, 114, 115, 116, 118, 119, 121, 122, 124, 125, 127, 128, 130, 131, 133,
+ 134, 136, 138, 139, 141, 142, 144, 146, 147, 149, 151, 152, 154, 156, 157, 159,
+ 161, 163, 164, 166, 168, 170, 171, 173, 175, 177, 179, 181, 183, 184, 186, 188,
+ 190, 192, 194, 196, 198, 200, 202, 204, 206, 208, 210, 212, 214, 216, 218, 220,
+ 222, 224, 226, 229, 231, 233, 235, 237, 239, 242, 244, 246, 248, 250, 253, 255,
+};
+const FX_BYTE g_GammaInverse[256] = {
+ 0, 13, 22, 28, 34, 38, 42, 46, 50, 53, 56, 59, 61, 64, 66, 69,
+ 71, 73, 75, 77, 79, 81, 83, 85, 86, 88, 90, 92, 93, 95, 96, 98,
+ 99, 101, 102, 104, 105, 106, 108, 109, 110, 112, 113, 114, 115, 117, 118, 119,
+ 120, 121, 122, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136,
+ 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 148, 149, 150, 151,
+ 152, 153, 154, 155, 155, 156, 157, 158, 159, 159, 160, 161, 162, 163, 163, 164,
+ 165, 166, 167, 167, 168, 169, 170, 170, 171, 172, 173, 173, 174, 175, 175, 176,
+ 177, 178, 178, 179, 180, 180, 181, 182, 182, 183, 184, 185, 185, 186, 187, 187,
+ 188, 189, 189, 190, 190, 191, 192, 192, 193, 194, 194, 195, 196, 196, 197, 197,
+ 198, 199, 199, 200, 200, 201, 202, 202, 203, 203, 204, 205, 205, 206, 206, 207,
+ 208, 208, 209, 209, 210, 210, 211, 212, 212, 213, 213, 214, 214, 215, 215, 216,
+ 216, 217, 218, 218, 219, 219, 220, 220, 221, 221, 222, 222, 223, 223, 224, 224,
+ 225, 226, 226, 227, 227, 228, 228, 229, 229, 230, 230, 231, 231, 232, 232, 233,
+ 233, 234, 234, 235, 235, 236, 236, 237, 237, 238, 238, 238, 239, 239, 240, 240,
+ 241, 241, 242, 242, 243, 243, 244, 244, 245, 245, 246, 246, 246, 247, 247, 248,
+ 248, 249, 249, 250, 250, 251, 251, 251, 252, 252, 253, 253, 254, 254, 255, 255,
+};
+const FX_BYTE _color_sqrt[256] = {
+ 0x00, 0x03, 0x07, 0x0B, 0x0F, 0x12, 0x16, 0x19, 0x1D, 0x20, 0x23, 0x26, 0x29, 0x2C, 0x2F, 0x32,
+ 0x35, 0x37, 0x3A, 0x3C, 0x3F, 0x41, 0x43, 0x46, 0x48, 0x4A, 0x4C, 0x4E, 0x50, 0x52, 0x54, 0x56,
+ 0x57, 0x59, 0x5B, 0x5C, 0x5E, 0x60, 0x61, 0x63, 0x64, 0x65, 0x67, 0x68, 0x69, 0x6B, 0x6C, 0x6D,
+ 0x6E, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E,
+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E,
+ 0x8F, 0x90, 0x91, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C,
+ 0x9C, 0x9D, 0x9E, 0x9F, 0xA0, 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA4, 0xA5, 0xA6, 0xA7, 0xA7, 0xA8,
+ 0xA9, 0xAA, 0xAA, 0xAB, 0xAC, 0xAD, 0xAD, 0xAE, 0xAF, 0xB0, 0xB0, 0xB1, 0xB2, 0xB3, 0xB3, 0xB4,
+ 0xB5, 0xB5, 0xB6, 0xB7, 0xB7, 0xB8, 0xB9, 0xBA, 0xBA, 0xBB, 0xBC, 0xBC, 0xBD, 0xBE, 0xBE, 0xBF,
+ 0xC0, 0xC0, 0xC1, 0xC2, 0xC2, 0xC3, 0xC4, 0xC4, 0xC5, 0xC6, 0xC6, 0xC7, 0xC7, 0xC8, 0xC9, 0xC9,
+ 0xCA, 0xCB, 0xCB, 0xCC, 0xCC, 0xCD, 0xCE, 0xCE, 0xCF, 0xD0, 0xD0, 0xD1, 0xD1, 0xD2, 0xD3, 0xD3,
+ 0xD4, 0xD4, 0xD5, 0xD6, 0xD6, 0xD7, 0xD7, 0xD8, 0xD9, 0xD9, 0xDA, 0xDA, 0xDB, 0xDC, 0xDC, 0xDD,
+ 0xDD, 0xDE, 0xDE, 0xDF, 0xE0, 0xE0, 0xE1, 0xE1, 0xE2, 0xE2, 0xE3, 0xE4, 0xE4, 0xE5, 0xE5, 0xE6,
+ 0xE6, 0xE7, 0xE7, 0xE8, 0xE9, 0xE9, 0xEA, 0xEA, 0xEB, 0xEB, 0xEC, 0xEC, 0xED, 0xED, 0xEE, 0xEE,
+ 0xEF, 0xF0, 0xF0, 0xF1, 0xF1, 0xF2, 0xF2, 0xF3, 0xF3, 0xF4, 0xF4, 0xF5, 0xF5, 0xF6, 0xF6, 0xF7,
+ 0xF7, 0xF8, 0xF8, 0xF9, 0xF9, 0xFA, 0xFA, 0xFB, 0xFB, 0xFC, 0xFC, 0xFD, 0xFD, 0xFE, 0xFE, 0xFF
+};
+int _BLEND(int blend_mode, int back_color, int src_color)
+{
+ switch (blend_mode) {
+ case FXDIB_BLEND_NORMAL:
+ return src_color;
+ case FXDIB_BLEND_MULTIPLY:
+ return src_color * back_color / 255;
+ case FXDIB_BLEND_SCREEN:
+ return src_color + back_color - src_color * back_color / 255;
+ case FXDIB_BLEND_OVERLAY:
+ return _BLEND(FXDIB_BLEND_HARDLIGHT, src_color, back_color);
+ case FXDIB_BLEND_DARKEN:
+ return src_color < back_color ? src_color : back_color;
+ case FXDIB_BLEND_LIGHTEN:
+ return src_color > back_color ? src_color : back_color;
+ case FXDIB_BLEND_COLORDODGE: {
+ if (src_color == 255) {
+ return src_color;
+ }
+ int result = back_color * 255 / (255 - src_color);
+ if (result > 255) {
+ return 255;
+ }
+ return result;
+ }
+ case FXDIB_BLEND_COLORBURN: {
+ if (src_color == 0) {
+ return src_color;
+ }
+ int result = (255 - back_color) * 255 / src_color;
+ if (result > 255) {
+ result = 255;
+ }
+ return 255 - result;
+ }
+ case FXDIB_BLEND_HARDLIGHT:
+ if (src_color < 128) {
+ return (src_color * back_color * 2) / 255;
+ }
+ return _BLEND(FXDIB_BLEND_SCREEN, back_color, 2 * src_color - 255);
+ case FXDIB_BLEND_SOFTLIGHT: {
+ if (src_color < 128) {
+ return back_color - (255 - 2 * src_color) * back_color * (255 - back_color) / 255 / 255;
+ }
+ return back_color + (2 * src_color - 255) * (_color_sqrt[back_color] - back_color) / 255;
+ }
+ case FXDIB_BLEND_DIFFERENCE:
+ return back_color < src_color ? src_color - back_color : back_color - src_color;
+ case FXDIB_BLEND_EXCLUSION:
+ return back_color + src_color - 2 * back_color * src_color / 255;
+ }
+ return src_color;
+}
+struct _RGB {
+ int red;
+ int green;
+ int blue;
+};
+static inline int _Lum(_RGB color)
+{
+ return (color.red * 30 + color.green * 59 + color.blue * 11) / 100;
+}
+static _RGB _ClipColor(_RGB color)
+{
+ int l = _Lum(color);
+ int n = color.red;
+ if (color.green < n) {
+ n = color.green;
+ }
+ if (color.blue < n) {
+ n = color.blue;
+ }
+ int x = color.red;
+ if (color.green > x) {
+ x = color.green;
+ }
+ if (color.blue > x) {
+ x = color.blue;
+ }
+ if (n < 0) {
+ color.red = l + ((color.red - l) * l / (l - n));
+ color.green = l + ((color.green - l) * l / (l - n));
+ color.blue = l + ((color.blue - l) * l / (l - n));
+ }
+ if (x > 255) {
+ color.red = l + ((color.red - l) * (255 - l) / (x - l));
+ color.green = l + ((color.green - l) * (255 - l) / (x - l));
+ color.blue = l + ((color.blue - l) * (255 - l) / (x - l));
+ }
+ return color;
+}
+static _RGB _SetLum(_RGB color, int l)
+{
+ int d = l - _Lum(color);
+ color.red += d;
+ color.green += d;
+ color.blue += d;
+ return _ClipColor(color);
+}
+static int _Sat(_RGB color)
+{
+ int n = color.red;
+ if (color.green < n) {
+ n = color.green;
+ }
+ if (color.blue < n) {
+ n = color.blue;
+ }
+ int x = color.red;
+ if (color.green > x) {
+ x = color.green;
+ }
+ if (color.blue > x) {
+ x = color.blue;
+ }
+ return x - n;
+}
+static _RGB _SetSat(_RGB color, int s)
+{
+ int* max = &color.red;
+ int* mid = &color.red;
+ int* min = &color.red;
+ if (color.green > *max) {
+ max = &color.green;
+ }
+ if (color.blue > *max) {
+ max = &color.blue;
+ }
+ if (color.green < *min) {
+ min = &color.green;
+ }
+ if (color.blue < *min) {
+ min = &color.blue;
+ }
+ if (*max == *min) {
+ color.red = 0;
+ color.green = 0;
+ color.blue = 0;
+ return color;
+ }
+ if (max == &color.red) {
+ if (min == &color.green) {
+ mid = &color.blue;
+ } else {
+ mid = &color.green;
+ }
+ } else if (max == &color.green) {
+ if (min == &color.red) {
+ mid = &color.blue;
+ } else {
+ mid = &color.red;
+ }
+ } else {
+ if (min == &color.green) {
+ mid = &color.red;
+ } else {
+ mid = &color.green;
+ }
+ }
+ if (*max > *min) {
+ *mid = (*mid - *min) * s / (*max - *min);
+ *max = s;
+ *min = 0;
+ }
+ return color;
+}
+void _RGB_Blend(int blend_mode, FX_LPCBYTE src_scan, FX_BYTE* dest_scan, int results[3])
+{
+ _RGB src, back, result;
+ src.red = src_scan[2];
+ src.green = src_scan[1];
+ src.blue = src_scan[0];
+ back.red = dest_scan[2];
+ back.green = dest_scan[1];
+ back.blue = dest_scan[0];
+ switch (blend_mode) {
+ case FXDIB_BLEND_HUE:
+ result = _SetLum(_SetSat(src, _Sat(back)), _Lum(back));
+ break;
+ case FXDIB_BLEND_SATURATION:
+ result = _SetLum(_SetSat(back, _Sat(src)), _Lum(back));
+ break;
+ case FXDIB_BLEND_COLOR:
+ result = _SetLum(src, _Lum(back));
+ break;
+ case FXDIB_BLEND_LUMINOSITY:
+ result = _SetLum(back, _Lum(src));
+ break;
+ }
+ results[0] = result.blue;
+ results[1] = result.green;
+ results[2] = result.red;
+}
+inline void _CompositeRow_Argb2Mask(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int pixel_count, FX_LPCBYTE clip_scan)
+{
+ src_scan += 3;
+ for (int col = 0; col < pixel_count; col ++) {
+ int src_alpha = *src_scan;
+ if (clip_scan) {
+ src_alpha = clip_scan[col] * src_alpha / 255;
+ }
+ FX_BYTE back_alpha = *dest_scan;
+ if (!back_alpha) {
+ *dest_scan = src_alpha;
+ } else if (src_alpha) {
+ *dest_scan = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ }
+ dest_scan ++;
+ src_scan += 4;
+ }
+}
+void _CompositeRow_Rgba2Mask(FX_LPBYTE dest_scan, FX_LPCBYTE src_alpha_scan, int pixel_count, FX_LPCBYTE clip_scan)
+{
+ for (int col = 0; col < pixel_count; col ++) {
+ int src_alpha = *src_alpha_scan++;
+ if (clip_scan) {
+ src_alpha = clip_scan[col] * src_alpha / 255;
+ }
+ FX_BYTE back_alpha = *dest_scan;
+ if (!back_alpha) {
+ *dest_scan = src_alpha;
+ } else if (src_alpha) {
+ *dest_scan = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ }
+ dest_scan ++;
+ }
+}
+void _CompositeRow_Rgb2Mask(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, FX_LPCBYTE clip_scan)
+{
+ if (clip_scan) {
+ for (int i = 0; i < width; i ++) {
+ *dest_scan = FXDIB_ALPHA_UNION(*dest_scan, *clip_scan);
+ dest_scan ++;
+ clip_scan ++;
+ }
+ } else {
+ FXSYS_memset8(dest_scan, 0xff, width);
+ }
+}
+void _CompositeRow_Argb2Graya(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int pixel_count, int blend_type, FX_LPCBYTE clip_scan,
+ FX_LPCBYTE src_alpha_scan, FX_LPBYTE dst_alpha_scan, void* pIccTransform)
+{
+ ICodec_IccModule* pIccModule = NULL;
+ if (pIccTransform) {
+ pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ }
+ if (blend_type) {
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ int blended_color;
+ if (src_alpha_scan) {
+ for (int col = 0; col < pixel_count; col ++) {
+ FX_BYTE back_alpha = *dst_alpha_scan;
+ if (back_alpha == 0) {
+ int src_alpha = *src_alpha_scan++;
+ if (clip_scan) {
+ src_alpha = clip_scan[col] * src_alpha / 255;
+ }
+ if (src_alpha) {
+ if (pIccTransform) {
+ pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1);
+ } else {
+ *dest_scan = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
+ }
+ *dst_alpha_scan = src_alpha;
+ }
+ dest_scan ++;
+ dst_alpha_scan ++;
+ src_scan += 3;
+ continue;
+ }
+ FX_BYTE src_alpha = *src_alpha_scan++;
+ if (clip_scan) {
+ src_alpha = clip_scan[col] * src_alpha / 255;
+ }
+ if (src_alpha == 0) {
+ dest_scan ++;
+ dst_alpha_scan ++;
+ src_scan += 3;
+ continue;
+ }
+ *dst_alpha_scan = FXDIB_ALPHA_UNION(back_alpha, src_alpha);
+ int alpha_ratio = src_alpha * 255 / (*dst_alpha_scan);
+ FX_BYTE gray;
+ if (pIccTransform) {
+ pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
+ } else {
+ gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
+ }
+ if (bNonseparableBlend) {
+ blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
+ }
+ gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
+ dest_scan ++;
+ dst_alpha_scan++;
+ src_scan += 3;
+ }
+ } else
+ for (int col = 0; col < pixel_count; col ++) {
+ FX_BYTE back_alpha = *dst_alpha_scan;
+ if (back_alpha == 0) {
+ int src_alpha = src_scan[3];
+ if (clip_scan) {
+ src_alpha = clip_scan[col] * src_alpha / 255;
+ }
+ if (src_alpha) {
+ if (pIccTransform) {
+ pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1);
+ } else {
+ *dest_scan = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
+ }
+ *dst_alpha_scan = src_alpha;
+ }
+ dest_scan ++;
+ dst_alpha_scan ++;
+ src_scan += 4;
+ continue;
+ }
+ FX_BYTE src_alpha = src_scan[3];
+ if (clip_scan) {
+ src_alpha = clip_scan[col] * src_alpha / 255;
+ }
+ if (src_alpha == 0) {
+ dest_scan ++;
+ dst_alpha_scan ++;
+ src_scan += 4;
+ continue;
+ }
+ *dst_alpha_scan = FXDIB_ALPHA_UNION(back_alpha, src_alpha);
+ int alpha_ratio = src_alpha * 255 / (*dst_alpha_scan);
+ FX_BYTE gray;
+ if (pIccTransform) {
+ pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
+ } else {
+ gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
+ }
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
+ dest_scan ++;
+ dst_alpha_scan++;
+ src_scan += 4;
+ }
+ return;
+ }
+ if (src_alpha_scan) {
+ for (int col = 0; col < pixel_count; col ++) {
+ FX_BYTE back_alpha = *dst_alpha_scan;
+ if (back_alpha == 0) {
+ int src_alpha = *src_alpha_scan++;
+ if (clip_scan) {
+ src_alpha = clip_scan[col] * src_alpha / 255;
+ }
+ if (src_alpha) {
+ if (pIccTransform) {
+ pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1);
+ } else {
+ *dest_scan = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
+ }
+ *dst_alpha_scan = src_alpha;
+ }
+ dest_scan ++;
+ dst_alpha_scan ++;
+ src_scan += 3;
+ continue;
+ }
+ FX_BYTE src_alpha = *src_alpha_scan++;
+ if (clip_scan) {
+ src_alpha = clip_scan[col] * src_alpha / 255;
+ }
+ if (src_alpha == 0) {
+ dest_scan ++;
+ dst_alpha_scan ++;
+ src_scan += 3;
+ continue;
+ }
+ *dst_alpha_scan = FXDIB_ALPHA_UNION(back_alpha, src_alpha);
+ int alpha_ratio = src_alpha * 255 / (*dst_alpha_scan);
+ FX_BYTE gray;
+ if (pIccTransform) {
+ pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
+ } else {
+ gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
+ }
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
+ dest_scan ++;
+ dst_alpha_scan++;
+ src_scan += 3;
+ }
+ } else
+ for (int col = 0; col < pixel_count; col ++) {
+ FX_BYTE back_alpha = *dst_alpha_scan;
+ if (back_alpha == 0) {
+ int src_alpha = src_scan[3];
+ if (clip_scan) {
+ src_alpha = clip_scan[col] * src_alpha / 255;
+ }
+ if (src_alpha) {
+ if (pIccTransform) {
+ pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1);
+ } else {
+ *dest_scan = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
+ }
+ *dst_alpha_scan = src_alpha;
+ }
+ dest_scan ++;
+ dst_alpha_scan ++;
+ src_scan += 4;
+ continue;
+ }
+ FX_BYTE src_alpha = src_scan[3];
+ if (clip_scan) {
+ src_alpha = clip_scan[col] * src_alpha / 255;
+ }
+ if (src_alpha == 0) {
+ dest_scan ++;
+ dst_alpha_scan ++;
+ src_scan += 4;
+ continue;
+ }
+ *dst_alpha_scan = FXDIB_ALPHA_UNION(back_alpha, src_alpha);
+ int alpha_ratio = src_alpha * 255 / (*dst_alpha_scan);
+ FX_BYTE gray;
+ if (pIccTransform) {
+ pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
+ } else {
+ gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
+ }
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
+ dest_scan ++;
+ dst_alpha_scan++;
+ src_scan += 4;
+ }
+}
+inline void _CompositeRow_Argb2Gray(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int pixel_count,
+ int blend_type, FX_LPCBYTE clip_scan,
+ FX_LPCBYTE src_alpha_scan, void* pIccTransform)
+{
+ ICodec_IccModule* pIccModule = NULL;
+ FX_BYTE gray;
+ if (pIccTransform) {
+ pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ }
+ if (blend_type) {
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ int blended_color;
+ if (src_alpha_scan) {
+ for (int col = 0; col < pixel_count; col ++) {
+ int src_alpha = *src_alpha_scan++;
+ if (clip_scan) {
+ src_alpha = clip_scan[col] * src_alpha / 255;
+ }
+ if (src_alpha) {
+ if (pIccTransform) {
+ pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
+ } else {
+ gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
+ }
+ if (bNonseparableBlend) {
+ blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
+ }
+ gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha);
+ }
+ dest_scan ++;
+ src_scan += 3;
+ }
+ } else
+ for (int col = 0; col < pixel_count; col ++) {
+ int src_alpha = src_scan[3];
+ if (clip_scan) {
+ src_alpha = clip_scan[col] * src_alpha / 255;
+ }
+ if (src_alpha) {
+ if (pIccTransform) {
+ pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
+ } else {
+ gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
+ }
+ if (bNonseparableBlend) {
+ blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
+ }
+ gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha);
+ }
+ dest_scan ++;
+ src_scan += 4;
+ }
+ return;
+ }
+ if (src_alpha_scan) {
+ for (int col = 0; col < pixel_count; col ++) {
+ int src_alpha = *src_alpha_scan++;
+ if (clip_scan) {
+ src_alpha = clip_scan[col] * src_alpha / 255;
+ }
+ if (src_alpha) {
+ if (pIccTransform) {
+ pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
+ } else {
+ gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
+ }
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha);
+ }
+ dest_scan ++;
+ src_scan += 3;
+ }
+ } else
+ for (int col = 0; col < pixel_count; col ++) {
+ int src_alpha = src_scan[3];
+ if (clip_scan) {
+ src_alpha = clip_scan[col] * src_alpha / 255;
+ }
+ if (src_alpha) {
+ if (pIccTransform) {
+ pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
+ } else {
+ gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
+ }
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha);
+ }
+ dest_scan ++;
+ src_scan += 4;
+ }
+}
+inline void _CompositeRow_Rgb2Gray(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_Bpp, int pixel_count,
+ int blend_type, FX_LPCBYTE clip_scan,
+ void* pIccTransform)
+{
+ ICodec_IccModule* pIccModule = NULL;
+ FX_BYTE gray;
+ if (pIccTransform) {
+ pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ }
+ if (blend_type) {
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ int blended_color;
+ for (int col = 0; col < pixel_count; col ++) {
+ if (pIccTransform) {
+ pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
+ } else {
+ gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
+ }
+ if (bNonseparableBlend) {
+ blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
+ }
+ gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);
+ if (clip_scan && clip_scan[col] < 255) {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, clip_scan[col]);
+ } else {
+ *dest_scan = gray;
+ }
+ dest_scan ++;
+ src_scan += src_Bpp;
+ }
+ return;
+ }
+ for (int col = 0; col < pixel_count; col ++) {
+ if (pIccTransform) {
+ pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
+ } else {
+ gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
+ }
+ if (clip_scan && clip_scan[col] < 255) {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, clip_scan[col]);
+ } else {
+ *dest_scan = gray;
+ }
+ dest_scan ++;
+ src_scan += src_Bpp;
+ }
+}
+void _CompositeRow_Rgb2Graya(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_Bpp, int pixel_count,
+ int blend_type, FX_LPCBYTE clip_scan,
+ FX_LPBYTE dest_alpha_scan, void* pIccTransform)
+{
+ ICodec_IccModule* pIccModule = NULL;
+ if (pIccTransform) {
+ pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ }
+ if (blend_type) {
+ int blended_color;
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ for (int col = 0; col < pixel_count; col ++) {
+ int back_alpha = *dest_alpha_scan;
+ if (back_alpha == 0) {
+ if (pIccTransform) {
+ pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1);
+ } else {
+ *dest_scan = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
+ }
+ dest_scan ++;
+ dest_alpha_scan++;
+ src_scan += src_Bpp;
+ continue;
+ }
+ int src_alpha = 255;
+ if (clip_scan) {
+ src_alpha = clip_scan[col];
+ }
+ if (src_alpha == 0) {
+ dest_scan ++;
+ dest_alpha_scan ++;
+ src_scan += src_Bpp;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ *dest_alpha_scan++ = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ FX_BYTE gray;
+ if (pIccTransform) {
+ pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
+ } else {
+ gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
+ }
+ if (bNonseparableBlend) {
+ blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
+ }
+ gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
+ dest_scan ++;
+ src_scan += src_Bpp;
+ }
+ return;
+ }
+ for (int col = 0; col < pixel_count; col ++) {
+ int src_alpha = 255;
+ if (clip_scan) {
+ src_alpha = clip_scan[col];
+ }
+ if (src_alpha == 255) {
+ if (pIccTransform) {
+ pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1);
+ } else {
+ *dest_scan = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
+ }
+ dest_scan ++;
+ *dest_alpha_scan++ = 255;
+ src_scan += src_Bpp;
+ continue;
+ }
+ if (src_alpha == 0) {
+ dest_scan ++;
+ dest_alpha_scan ++;
+ src_scan += src_Bpp;
+ continue;
+ }
+ int back_alpha = *dest_alpha_scan;
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ *dest_alpha_scan++ = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ FX_BYTE gray;
+ if (pIccTransform) {
+ pIccModule->TranslateScanline(pIccTransform, &gray, src_scan, 1);
+ } else {
+ gray = FXRGB2GRAY(src_scan[2], src_scan[1], *src_scan);
+ }
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
+ dest_scan ++;
+ src_scan += src_Bpp;
+ }
+}
+void _CompositeRow_Argb2Argb(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int pixel_count, int blend_type, FX_LPCBYTE clip_scan,
+ FX_LPBYTE dest_alpha_scan, FX_LPCBYTE src_alpha_scan)
+{
+ int blended_colors[3];
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ if (dest_alpha_scan == NULL) {
+ if (src_alpha_scan == NULL) {
+ FX_BYTE back_alpha = 0;
+ for (int col = 0; col < pixel_count; col ++) {
+ back_alpha = dest_scan[3];
+ if (back_alpha == 0) {
+ if (clip_scan) {
+ int src_alpha = clip_scan[col] * src_scan[3] / 255;
+ FXARGB_SETDIB(dest_scan, (FXARGB_GETDIB(src_scan) & 0xffffff) | (src_alpha << 24));
+ } else {
+ FXARGB_COPY(dest_scan, src_scan);
+ }
+ dest_scan += 4;
+ src_scan += 4;
+ continue;
+ }
+ FX_BYTE src_alpha;
+ if (clip_scan == NULL) {
+ src_alpha = src_scan[3];
+ } else {
+ src_alpha = clip_scan[col] * src_scan[3] / 255;
+ }
+ if (src_alpha == 0) {
+ dest_scan += 4;
+ src_scan += 4;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ if (bNonseparableBlend) {
+ _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
+ }
+ for (int color = 0; color < 3; color ++) {
+ if (blend_type) {
+ int blended = bNonseparableBlend ? blended_colors[color] :
+ _BLEND(blend_type, *dest_scan, *src_scan);
+ blended = FXDIB_ALPHA_MERGE(*src_scan, blended, back_alpha);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
+ } else {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, alpha_ratio);
+ }
+ dest_scan ++;
+ src_scan ++;
+ }
+ dest_scan ++;
+ src_scan ++;
+ }
+ } else {
+ for (int col = 0; col < pixel_count; col ++) {
+ FX_BYTE back_alpha = dest_scan[3];
+ if (back_alpha == 0) {
+ if (clip_scan) {
+ int src_alpha = clip_scan[col] * (*src_alpha_scan) / 255;
+ FXARGB_SETDIB(dest_scan, FXARGB_MAKE((src_alpha << 24), src_scan[2], src_scan[1], *src_scan));
+ } else {
+ FXARGB_SETDIB(dest_scan, FXARGB_MAKE((*src_alpha_scan << 24), src_scan[2], src_scan[1], *src_scan));
+ }
+ dest_scan += 4;
+ src_scan += 3;
+ src_alpha_scan ++;
+ continue;
+ }
+ FX_BYTE src_alpha;
+ if (clip_scan == NULL) {
+ src_alpha = *src_alpha_scan ++;
+ } else {
+ src_alpha = clip_scan[col] * (*src_alpha_scan ++) / 255;
+ }
+ if (src_alpha == 0) {
+ dest_scan += 4;
+ src_scan += 3;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ if (bNonseparableBlend) {
+ _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
+ }
+ for (int color = 0; color < 3; color ++) {
+ if (blend_type) {
+ int blended = bNonseparableBlend ? blended_colors[color] :
+ _BLEND(blend_type, *dest_scan, *src_scan);
+ blended = FXDIB_ALPHA_MERGE(*src_scan, blended, back_alpha);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
+ } else {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, alpha_ratio);
+ }
+ dest_scan ++;
+ src_scan ++;
+ }
+ dest_scan ++;
+ }
+ }
+ } else {
+ if (src_alpha_scan) {
+ for (int col = 0; col < pixel_count; col ++) {
+ FX_BYTE back_alpha = *dest_alpha_scan;
+ if (back_alpha == 0) {
+ if (clip_scan) {
+ int src_alpha = clip_scan[col] * (*src_alpha_scan) / 255;
+ *dest_alpha_scan = src_alpha;
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ } else {
+ *dest_alpha_scan = *src_alpha_scan;
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ }
+ dest_alpha_scan ++;
+ src_alpha_scan ++;
+ continue;
+ }
+ FX_BYTE src_alpha;
+ if (clip_scan == NULL) {
+ src_alpha = *src_alpha_scan ++;
+ } else {
+ src_alpha = clip_scan[col] * (*src_alpha_scan ++) / 255;
+ }
+ if (src_alpha == 0) {
+ dest_scan += 3;
+ src_scan += 3;
+ dest_alpha_scan ++;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ *dest_alpha_scan ++ = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ if (bNonseparableBlend) {
+ _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
+ }
+ for (int color = 0; color < 3; color ++) {
+ if (blend_type) {
+ int blended = bNonseparableBlend ? blended_colors[color] :
+ _BLEND(blend_type, *dest_scan, *src_scan);
+ blended = FXDIB_ALPHA_MERGE(*src_scan, blended, back_alpha);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
+ } else {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, alpha_ratio);
+ }
+ dest_scan ++;
+ src_scan ++;
+ }
+ }
+ } else {
+ for (int col = 0; col < pixel_count; col ++) {
+ FX_BYTE back_alpha = *dest_alpha_scan;
+ if (back_alpha == 0) {
+ if (clip_scan) {
+ int src_alpha = clip_scan[col] * src_scan[3] / 255;
+ *dest_alpha_scan = src_alpha;
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ } else {
+ *dest_alpha_scan = src_scan[3];
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ }
+ dest_alpha_scan ++;
+ src_scan ++;
+ continue;
+ }
+ FX_BYTE src_alpha;
+ if (clip_scan == NULL) {
+ src_alpha = src_scan[3];
+ } else {
+ src_alpha = clip_scan[col] * src_scan[3] / 255;
+ }
+ if (src_alpha == 0) {
+ dest_scan += 3;
+ src_scan += 4;
+ dest_alpha_scan ++;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ *dest_alpha_scan++ = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ if (bNonseparableBlend) {
+ _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
+ }
+ for (int color = 0; color < 3; color ++) {
+ if (blend_type) {
+ int blended = bNonseparableBlend ? blended_colors[color] :
+ _BLEND(blend_type, *dest_scan, *src_scan);
+ blended = FXDIB_ALPHA_MERGE(*src_scan, blended, back_alpha);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
+ } else {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, alpha_ratio);
+ }
+ dest_scan ++;
+ src_scan ++;
+ }
+ src_scan ++;
+ }
+ }
+ }
+}
+void _CompositeRow_Rgb2Argb_Blend_NoClip(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int src_Bpp,
+ FX_LPBYTE dest_alpha_scan)
+{
+ int blended_colors[3];
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ int src_gap = src_Bpp - 3;
+ if (dest_alpha_scan == NULL) {
+ for (int col = 0; col < width; col ++) {
+ FX_BYTE back_alpha = dest_scan[3];
+ if (back_alpha == 0) {
+ if (src_Bpp == 4) {
+ FXARGB_SETDIB(dest_scan, 0xff000000 | FXARGB_GETDIB(src_scan));
+ } else {
+ FXARGB_SETDIB(dest_scan, FXARGB_MAKE(0xff, src_scan[2], src_scan[1], src_scan[0]));
+ }
+ dest_scan += 4;
+ src_scan += src_Bpp;
+ continue;
+ }
+ dest_scan[3] = 0xff;
+ if (bNonseparableBlend) {
+ _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
+ }
+ for (int color = 0; color < 3; color ++) {
+ int src_color = *src_scan;
+ int blended = bNonseparableBlend ? blended_colors[color] :
+ _BLEND(blend_type, *dest_scan, src_color);
+ *dest_scan = FXDIB_ALPHA_MERGE(src_color, blended, back_alpha);
+ dest_scan ++;
+ src_scan ++;
+ }
+ dest_scan ++;
+ src_scan += src_gap;
+ }
+ } else {
+ for (int col = 0; col < width; col ++) {
+ FX_BYTE back_alpha = *dest_alpha_scan;
+ if (back_alpha == 0) {
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ *dest_alpha_scan++ = 0xff;
+ src_scan += src_gap;
+ continue;
+ }
+ *dest_alpha_scan++ = 0xff;
+ if (bNonseparableBlend) {
+ _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
+ }
+ for (int color = 0; color < 3; color ++) {
+ int src_color = *src_scan;
+ int blended = bNonseparableBlend ? blended_colors[color] :
+ _BLEND(blend_type, *dest_scan, src_color);
+ *dest_scan = FXDIB_ALPHA_MERGE(src_color, blended, back_alpha);
+ dest_scan ++;
+ src_scan ++;
+ }
+ src_scan += src_gap;
+ }
+ }
+}
+inline void _CompositeRow_Rgb2Argb_Blend_Clip(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int src_Bpp, FX_LPCBYTE clip_scan,
+ FX_LPBYTE dest_alpha_scan)
+{
+ int blended_colors[3];
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ int src_gap = src_Bpp - 3;
+ if (dest_alpha_scan == NULL) {
+ for (int col = 0; col < width; col ++) {
+ int src_alpha = *clip_scan ++;
+ FX_BYTE back_alpha = dest_scan[3];
+ if (back_alpha == 0) {
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ src_scan += src_gap;
+ dest_scan ++;
+ continue;
+ }
+ if (src_alpha == 0) {
+ dest_scan += 4;
+ src_scan += src_Bpp;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ if (bNonseparableBlend) {
+ _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
+ }
+ for (int color = 0; color < 3; color ++) {
+ int src_color = *src_scan;
+ int blended = bNonseparableBlend ? blended_colors[color] :
+ _BLEND(blend_type, *dest_scan, src_color);
+ blended = FXDIB_ALPHA_MERGE(src_color, blended, back_alpha);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
+ dest_scan ++;
+ src_scan ++;
+ }
+ dest_scan ++;
+ src_scan += src_gap;
+ }
+ } else {
+ for (int col = 0; col < width; col ++) {
+ int src_alpha = *clip_scan ++;
+ FX_BYTE back_alpha = *dest_alpha_scan;
+ if (back_alpha == 0) {
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ src_scan += src_gap;
+ dest_alpha_scan++;
+ continue;
+ }
+ if (src_alpha == 0) {
+ dest_scan += 3;
+ dest_alpha_scan++;
+ src_scan += src_Bpp;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ *dest_alpha_scan++ = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ if (bNonseparableBlend) {
+ _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
+ }
+ for (int color = 0; color < 3; color ++) {
+ int src_color = *src_scan;
+ int blended = bNonseparableBlend ? blended_colors[color] :
+ _BLEND(blend_type, *dest_scan, src_color);
+ blended = FXDIB_ALPHA_MERGE(src_color, blended, back_alpha);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
+ dest_scan ++;
+ src_scan ++;
+ }
+ src_scan += src_gap;
+ }
+ }
+}
+inline void _CompositeRow_Rgb2Argb_NoBlend_Clip(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int src_Bpp, FX_LPCBYTE clip_scan,
+ FX_LPBYTE dest_alpha_scan)
+{
+ int src_gap = src_Bpp - 3;
+ if (dest_alpha_scan == NULL) {
+ for (int col = 0; col < width; col ++) {
+ int src_alpha = clip_scan[col];
+ if (src_alpha == 255) {
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = 255;
+ src_scan += src_gap;
+ continue;
+ }
+ if (src_alpha == 0) {
+ dest_scan += 4;
+ src_scan += src_Bpp;
+ continue;
+ }
+ int back_alpha = dest_scan[3];
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ for (int color = 0; color < 3; color ++) {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, alpha_ratio);
+ dest_scan ++;
+ src_scan ++;
+ }
+ dest_scan ++;
+ src_scan += src_gap;
+ }
+ } else {
+ for (int col = 0; col < width; col ++) {
+ int src_alpha = clip_scan[col];
+ if (src_alpha == 255) {
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ *dest_alpha_scan++ = 255;
+ src_scan += src_gap;
+ continue;
+ }
+ if (src_alpha == 0) {
+ dest_scan += 3;
+ dest_alpha_scan ++;
+ src_scan += src_Bpp;
+ continue;
+ }
+ int back_alpha = *dest_alpha_scan;
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ *dest_alpha_scan ++ = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ for (int color = 0; color < 3; color ++) {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, alpha_ratio);
+ dest_scan ++;
+ src_scan ++;
+ }
+ src_scan += src_gap;
+ }
+ }
+}
+inline void _CompositeRow_Rgb2Argb_NoBlend_NoClip(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int src_Bpp,
+ FX_LPBYTE dest_alpha_scan)
+{
+ if (dest_alpha_scan == NULL) {
+ for (int col = 0; col < width; col ++) {
+ if (src_Bpp == 4) {
+ FXARGB_SETDIB(dest_scan, 0xff000000 | FXARGB_GETDIB(src_scan));
+ } else {
+ FXARGB_SETDIB(dest_scan, FXARGB_MAKE(0xff, src_scan[2], src_scan[1], src_scan[0]));
+ }
+ dest_scan += 4;
+ src_scan += src_Bpp;
+ }
+ } else {
+ int src_gap = src_Bpp - 3;
+ for (int col = 0; col < width; col ++) {
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ *dest_alpha_scan++ = 0xff;
+ src_scan += src_gap;
+ }
+ }
+}
+inline void _CompositeRow_Argb2Rgb_Blend(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int dest_Bpp, FX_LPCBYTE clip_scan,
+ FX_LPCBYTE src_alpha_scan)
+{
+ int blended_colors[3];
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ int dest_gap = dest_Bpp - 3;
+ if (src_alpha_scan == NULL) {
+ for (int col = 0; col < width; col ++) {
+ FX_BYTE src_alpha;
+ if (clip_scan) {
+ src_alpha = src_scan[3] * (*clip_scan++) / 255;
+ } else {
+ src_alpha = src_scan[3];
+ }
+ if (src_alpha == 0) {
+ dest_scan += dest_Bpp;
+ src_scan += 4;
+ continue;
+ }
+ if (bNonseparableBlend) {
+ _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
+ }
+ for (int color = 0; color < 3; color ++) {
+ int back_color = *dest_scan;
+ int blended = bNonseparableBlend ? blended_colors[color] :
+ _BLEND(blend_type, back_color, *src_scan);
+ *dest_scan = FXDIB_ALPHA_MERGE(back_color, blended, src_alpha);
+ dest_scan ++;
+ src_scan ++;
+ }
+ dest_scan += dest_gap;
+ src_scan ++;
+ }
+ } else {
+ for (int col = 0; col < width; col ++) {
+ FX_BYTE src_alpha;
+ if (clip_scan) {
+ src_alpha = (*src_alpha_scan++) * (*clip_scan++) / 255;
+ } else {
+ src_alpha = *src_alpha_scan++;
+ }
+ if (src_alpha == 0) {
+ dest_scan += dest_Bpp;
+ src_scan += 3;
+ continue;
+ }
+ if (bNonseparableBlend) {
+ _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
+ }
+ for (int color = 0; color < 3; color ++) {
+ int back_color = *dest_scan;
+ int blended = bNonseparableBlend ? blended_colors[color] :
+ _BLEND(blend_type, back_color, *src_scan);
+ *dest_scan = FXDIB_ALPHA_MERGE(back_color, blended, src_alpha);
+ dest_scan ++;
+ src_scan ++;
+ }
+ dest_scan += dest_gap;
+ }
+ }
+}
+inline void _CompositeRow_Argb2Rgb_NoBlend(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int dest_Bpp, FX_LPCBYTE clip_scan,
+ FX_LPCBYTE src_alpha_scan)
+{
+ int dest_gap = dest_Bpp - 3;
+ if (src_alpha_scan == NULL) {
+ for (int col = 0; col < width; col ++) {
+ FX_BYTE src_alpha;
+ if (clip_scan) {
+ src_alpha = src_scan[3] * (*clip_scan++) / 255;
+ } else {
+ src_alpha = src_scan[3];
+ }
+ if (src_alpha == 255) {
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ dest_scan += dest_gap;
+ src_scan ++;
+ continue;
+ }
+ if (src_alpha == 0) {
+ dest_scan += dest_Bpp;
+ src_scan += 4;
+ continue;
+ }
+ for (int color = 0; color < 3; color ++) {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, src_alpha);
+ dest_scan ++;
+ src_scan ++;
+ }
+ dest_scan += dest_gap;
+ src_scan ++;
+ }
+ } else {
+ for (int col = 0; col < width; col ++) {
+ FX_BYTE src_alpha;
+ if (clip_scan) {
+ src_alpha = (*src_alpha_scan++) * (*clip_scan++) / 255;
+ } else {
+ src_alpha = *src_alpha_scan++;
+ }
+ if (src_alpha == 255) {
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ dest_scan += dest_gap;
+ continue;
+ }
+ if (src_alpha == 0) {
+ dest_scan += dest_Bpp;
+ src_scan += 3;
+ continue;
+ }
+ for (int color = 0; color < 3; color ++) {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, src_alpha);
+ dest_scan ++;
+ src_scan ++;
+ }
+ dest_scan += dest_gap;
+ }
+ }
+}
+inline void _CompositeRow_Rgb2Rgb_Blend_NoClip(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int dest_Bpp, int src_Bpp)
+{
+ int blended_colors[3];
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ int dest_gap = dest_Bpp - 3;
+ int src_gap = src_Bpp - 3;
+ for (int col = 0; col < width; col ++) {
+ if (bNonseparableBlend) {
+ _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
+ }
+ for (int color = 0; color < 3; color ++) {
+ int back_color = *dest_scan;
+ int src_color = *src_scan;
+ int blended = bNonseparableBlend ? blended_colors[color] :
+ _BLEND(blend_type, back_color, src_color);
+ *dest_scan = blended;
+ dest_scan ++;
+ src_scan ++;
+ }
+ dest_scan += dest_gap;
+ src_scan += src_gap;
+ }
+}
+inline void _CompositeRow_Rgb2Rgb_Blend_Clip(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int dest_Bpp, int src_Bpp, FX_LPCBYTE clip_scan)
+{
+ int blended_colors[3];
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ int dest_gap = dest_Bpp - 3;
+ int src_gap = src_Bpp - 3;
+ for (int col = 0; col < width; col ++) {
+ FX_BYTE src_alpha = *clip_scan ++;
+ if (src_alpha == 0) {
+ dest_scan += dest_Bpp;
+ src_scan += src_Bpp;
+ continue;
+ }
+ if (bNonseparableBlend) {
+ _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
+ }
+ for (int color = 0; color < 3; color ++) {
+ int src_color = *src_scan;
+ int back_color = *dest_scan;
+ int blended = bNonseparableBlend ? blended_colors[color] :
+ _BLEND(blend_type, back_color, src_color);
+ *dest_scan = FXDIB_ALPHA_MERGE(back_color, blended, src_alpha);
+ dest_scan ++;
+ src_scan ++;
+ }
+ dest_scan += dest_gap;
+ src_scan += src_gap;
+ }
+}
+inline void _CompositeRow_Rgb2Rgb_NoBlend_NoClip(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int dest_Bpp, int src_Bpp)
+{
+ if (dest_Bpp == src_Bpp) {
+ FXSYS_memcpy32(dest_scan, src_scan, width * dest_Bpp);
+ return;
+ }
+ for (int col = 0; col < width; col ++) {
+ dest_scan[0] = src_scan[0];
+ dest_scan[1] = src_scan[1];
+ dest_scan[2] = src_scan[2];
+ dest_scan += dest_Bpp;
+ src_scan += src_Bpp;
+ }
+}
+inline void _CompositeRow_Rgb2Rgb_NoBlend_Clip(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int dest_Bpp, int src_Bpp, FX_LPCBYTE clip_scan)
+{
+ for (int col = 0; col < width; col ++) {
+ int src_alpha = clip_scan[col];
+ if (src_alpha == 255) {
+ dest_scan[0] = src_scan[0];
+ dest_scan[1] = src_scan[1];
+ dest_scan[2] = src_scan[2];
+ } else if (src_alpha) {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, src_alpha);
+ dest_scan ++;
+ src_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, src_alpha);
+ dest_scan ++;
+ src_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_scan, src_alpha);
+ dest_scan += dest_Bpp - 2;
+ src_scan += src_Bpp - 2;
+ continue;
+ }
+ dest_scan += dest_Bpp;
+ src_scan += src_Bpp;
+ }
+}
+void _CompositeRow_Argb2Argb_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int pixel_count, int blend_type, FX_LPCBYTE clip_scan,
+ FX_LPBYTE dest_alpha_scan, FX_LPCBYTE src_alpha_scan, FX_LPBYTE src_cache_scan, void* pIccTransform)
+{
+ FX_LPBYTE dp = src_cache_scan;
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ if (src_alpha_scan) {
+ if (dest_alpha_scan == NULL) {
+ for (int col = 0; col < pixel_count; col ++) {
+ pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
+ dp[3] = *src_alpha_scan++;
+ src_scan += 3;
+ dp += 4;
+ }
+ src_alpha_scan = NULL;
+ } else {
+ pIccModule->TranslateScanline(pIccTransform, dp, src_scan, pixel_count);
+ }
+ } else {
+ if (dest_alpha_scan == NULL) {
+ for (int col = 0; col < pixel_count; col ++) {
+ pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
+ dp[3] = src_scan[3];
+ src_scan += 4;
+ dp += 4;
+ }
+ } else {
+ int blended_colors[3];
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ for (int col = 0; col < pixel_count; col ++) {
+ pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, 1);
+ FX_BYTE back_alpha = *dest_alpha_scan;
+ if (back_alpha == 0) {
+ if (clip_scan) {
+ int src_alpha = clip_scan[col] * src_scan[3] / 255;
+ *dest_alpha_scan = src_alpha;
+ *dest_scan++ = *src_cache_scan++;
+ *dest_scan++ = *src_cache_scan++;
+ *dest_scan++ = *src_cache_scan++;
+ } else {
+ *dest_alpha_scan = src_scan[3];
+ *dest_scan++ = *src_cache_scan++;
+ *dest_scan++ = *src_cache_scan++;
+ *dest_scan++ = *src_cache_scan++;
+ }
+ dest_alpha_scan ++;
+ src_scan += 4;
+ continue;
+ }
+ FX_BYTE src_alpha;
+ if (clip_scan == NULL) {
+ src_alpha = src_scan[3];
+ } else {
+ src_alpha = clip_scan[col] * src_scan[3] / 255;
+ }
+ src_scan += 4;
+ if (src_alpha == 0) {
+ dest_scan += 3;
+ src_cache_scan += 3;
+ dest_alpha_scan ++;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ *dest_alpha_scan ++ = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ if (bNonseparableBlend) {
+ _RGB_Blend(blend_type, src_cache_scan, dest_scan, blended_colors);
+ }
+ for (int color = 0; color < 3; color ++) {
+ if (blend_type) {
+ int blended = bNonseparableBlend ? blended_colors[color] :
+ _BLEND(blend_type, *dest_scan, *src_cache_scan);
+ blended = FXDIB_ALPHA_MERGE(*src_cache_scan, blended, back_alpha);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
+ } else {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_cache_scan, alpha_ratio);
+ }
+ dest_scan ++;
+ src_cache_scan ++;
+ }
+ }
+ return;
+ }
+ }
+ _CompositeRow_Argb2Argb(dest_scan, src_cache_scan, pixel_count, blend_type, clip_scan, dest_alpha_scan, src_alpha_scan);
+}
+void _CompositeRow_Rgb2Argb_Blend_NoClip_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int src_Bpp,
+ FX_LPBYTE dest_alpha_scan, FX_LPBYTE src_cache_scan, void* pIccTransform)
+{
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ if (src_Bpp == 3) {
+ pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);
+ } else {
+ FX_LPBYTE dp = src_cache_scan;
+ for (int col = 0; col < width; col ++) {
+ pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
+ src_scan += 4;
+ dp += 3;
+ }
+ }
+ _CompositeRow_Rgb2Argb_Blend_NoClip(dest_scan, src_cache_scan, width, blend_type, 3, dest_alpha_scan);
+}
+inline void _CompositeRow_Rgb2Argb_Blend_Clip_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int src_Bpp, FX_LPCBYTE clip_scan,
+ FX_LPBYTE dest_alpha_scan, FX_LPBYTE src_cache_scan, void* pIccTransform)
+{
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ if (src_Bpp == 3) {
+ pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);
+ } else {
+ FX_LPBYTE dp = src_cache_scan;
+ for (int col = 0; col < width; col ++) {
+ pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
+ src_scan += 4;
+ dp += 3;
+ }
+ }
+ _CompositeRow_Rgb2Argb_Blend_Clip(dest_scan, src_cache_scan, width, blend_type, 3, clip_scan, dest_alpha_scan);
+}
+inline void _CompositeRow_Rgb2Argb_NoBlend_Clip_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int src_Bpp, FX_LPCBYTE clip_scan,
+ FX_LPBYTE dest_alpha_scan, FX_LPBYTE src_cache_scan, void* pIccTransform)
+{
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ if (src_Bpp == 3) {
+ pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);
+ } else {
+ FX_LPBYTE dp = src_cache_scan;
+ for (int col = 0; col < width; col ++) {
+ pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
+ src_scan += 4;
+ dp += 3;
+ }
+ }
+ _CompositeRow_Rgb2Argb_NoBlend_Clip(dest_scan, src_cache_scan, width, 3, clip_scan, dest_alpha_scan);
+}
+inline void _CompositeRow_Rgb2Argb_NoBlend_NoClip_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int src_Bpp,
+ FX_LPBYTE dest_alpha_scan, FX_LPBYTE src_cache_scan, void* pIccTransform)
+{
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ if (src_Bpp == 3) {
+ pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);
+ } else {
+ FX_LPBYTE dp = src_cache_scan;
+ for (int col = 0; col < width; col ++) {
+ pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
+ src_scan += 4;
+ dp += 3;
+ }
+ }
+ _CompositeRow_Rgb2Argb_NoBlend_NoClip(dest_scan, src_cache_scan, width, 3, dest_alpha_scan);
+}
+inline void _CompositeRow_Argb2Rgb_Blend_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int dest_Bpp, FX_LPCBYTE clip_scan,
+ FX_LPCBYTE src_alpha_scan, FX_LPBYTE src_cache_scan, void* pIccTransform)
+{
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ if (src_alpha_scan) {
+ pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);
+ } else {
+ int blended_colors[3];
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ int dest_gap = dest_Bpp - 3;
+ for (int col = 0; col < width; col ++) {
+ pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, 1);
+ FX_BYTE src_alpha;
+ if (clip_scan) {
+ src_alpha = src_scan[3] * (*clip_scan++) / 255;
+ } else {
+ src_alpha = src_scan[3];
+ }
+ src_scan += 4;
+ if (src_alpha == 0) {
+ dest_scan += dest_Bpp;
+ src_cache_scan += 3;
+ continue;
+ }
+ if (bNonseparableBlend) {
+ _RGB_Blend(blend_type, src_cache_scan, dest_scan, blended_colors);
+ }
+ for (int color = 0; color < 3; color ++) {
+ int back_color = *dest_scan;
+ int blended = bNonseparableBlend ? blended_colors[color] :
+ _BLEND(blend_type, back_color, *src_cache_scan);
+ *dest_scan = FXDIB_ALPHA_MERGE(back_color, blended, src_alpha);
+ dest_scan ++;
+ src_cache_scan ++;
+ }
+ dest_scan += dest_gap;
+ }
+ return;
+ }
+ _CompositeRow_Argb2Rgb_Blend(dest_scan, src_cache_scan, width, blend_type, dest_Bpp, clip_scan, src_alpha_scan);
+}
+inline void _CompositeRow_Argb2Rgb_NoBlend_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int dest_Bpp, FX_LPCBYTE clip_scan,
+ FX_LPCBYTE src_alpha_scan, FX_LPBYTE src_cache_scan, void* pIccTransform)
+{
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ if (src_alpha_scan) {
+ pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);
+ } else {
+ int dest_gap = dest_Bpp - 3;
+ for (int col = 0; col < width; col ++) {
+ pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, 1);
+ FX_BYTE src_alpha;
+ if (clip_scan) {
+ src_alpha = src_scan[3] * (*clip_scan++) / 255;
+ } else {
+ src_alpha = src_scan[3];
+ }
+ src_scan += 4;
+ if (src_alpha == 255) {
+ *dest_scan++ = *src_cache_scan++;
+ *dest_scan++ = *src_cache_scan++;
+ *dest_scan++ = *src_cache_scan++;
+ dest_scan += dest_gap;
+ continue;
+ }
+ if (src_alpha == 0) {
+ dest_scan += dest_Bpp;
+ src_cache_scan += 3;
+ continue;
+ }
+ for (int color = 0; color < 3; color ++) {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, *src_cache_scan, src_alpha);
+ dest_scan ++;
+ src_cache_scan ++;
+ }
+ dest_scan += dest_gap;
+ }
+ return;
+ }
+ _CompositeRow_Argb2Rgb_NoBlend(dest_scan, src_cache_scan, width, dest_Bpp, clip_scan, src_alpha_scan);
+}
+inline void _CompositeRow_Rgb2Rgb_Blend_NoClip_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int dest_Bpp, int src_Bpp,
+ FX_LPBYTE src_cache_scan, void* pIccTransform)
+{
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ if (src_Bpp == 3) {
+ pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);
+ } else {
+ FX_LPBYTE dp = src_cache_scan;
+ for (int col = 0; col < width; col ++) {
+ pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
+ src_scan += 4;
+ dp += 3;
+ }
+ }
+ _CompositeRow_Rgb2Rgb_Blend_NoClip(dest_scan, src_cache_scan, width, blend_type, dest_Bpp, 3);
+}
+inline void _CompositeRow_Rgb2Rgb_Blend_Clip_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int dest_Bpp, int src_Bpp, FX_LPCBYTE clip_scan,
+ FX_LPBYTE src_cache_scan, void* pIccTransform)
+{
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ if (src_Bpp == 3) {
+ pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);
+ } else {
+ FX_LPBYTE dp = src_cache_scan;
+ for (int col = 0; col < width; col ++) {
+ pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
+ src_scan += 4;
+ dp += 3;
+ }
+ }
+ _CompositeRow_Rgb2Rgb_Blend_Clip(dest_scan, src_cache_scan, width, blend_type, dest_Bpp, 3, clip_scan);
+}
+inline void _CompositeRow_Rgb2Rgb_NoBlend_NoClip_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int dest_Bpp, int src_Bpp,
+ FX_LPBYTE src_cache_scan, void* pIccTransform)
+{
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ if (src_Bpp == 3) {
+ pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);
+ } else {
+ FX_LPBYTE dp = src_cache_scan;
+ for (int col = 0; col < width; col ++) {
+ pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
+ src_scan += 4;
+ dp += 3;
+ }
+ }
+ _CompositeRow_Rgb2Rgb_NoBlend_NoClip(dest_scan, src_cache_scan, width, dest_Bpp, 3);
+}
+inline void _CompositeRow_Rgb2Rgb_NoBlend_Clip_Transform(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int dest_Bpp, int src_Bpp, FX_LPCBYTE clip_scan,
+ FX_LPBYTE src_cache_scan, void* pIccTransform)
+{
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ if (src_Bpp == 3) {
+ pIccModule->TranslateScanline(pIccTransform, src_cache_scan, src_scan, width);
+ } else {
+ FX_LPBYTE dp = src_cache_scan;
+ for (int col = 0; col < width; col ++) {
+ pIccModule->TranslateScanline(pIccTransform, dp, src_scan, 1);
+ src_scan += 4;
+ dp += 3;
+ }
+ }
+ _CompositeRow_Rgb2Rgb_NoBlend_Clip(dest_scan, src_cache_scan, width, dest_Bpp, 3, clip_scan);
+}
+inline void _CompositeRow_8bppPal2Gray(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, FX_LPCBYTE pPalette, int pixel_count,
+ int blend_type, FX_LPCBYTE clip_scan,
+ FX_LPCBYTE src_alpha_scan)
+{
+ if (src_alpha_scan) {
+ if (blend_type) {
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ int blended_color;
+ for (int col = 0; col < pixel_count; col ++) {
+ FX_BYTE gray = pPalette[*src_scan];
+ int src_alpha = *src_alpha_scan++;
+ if (clip_scan) {
+ src_alpha = clip_scan[col] * src_alpha / 255;
+ }
+ if (bNonseparableBlend) {
+ blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
+ }
+ gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);
+ if (src_alpha) {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha);
+ } else {
+ *dest_scan = gray;
+ }
+ dest_scan ++;
+ src_scan ++;
+ }
+ return;
+ }
+ for (int col = 0; col < pixel_count; col ++) {
+ FX_BYTE gray = pPalette[*src_scan];
+ int src_alpha = *src_alpha_scan++;
+ if (clip_scan) {
+ src_alpha = clip_scan[col] * src_alpha / 255;
+ }
+ if (src_alpha) {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha);
+ } else {
+ *dest_scan = gray;
+ }
+ dest_scan ++;
+ src_scan ++;
+ }
+ } else {
+ if (blend_type) {
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ int blended_color;
+ for (int col = 0; col < pixel_count; col ++) {
+ FX_BYTE gray = pPalette[*src_scan];
+ if (bNonseparableBlend) {
+ blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
+ }
+ gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);
+ if (clip_scan && clip_scan[col] < 255) {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, clip_scan[col]);
+ } else {
+ *dest_scan = gray;
+ }
+ dest_scan ++;
+ src_scan ++;
+ }
+ return;
+ }
+ for (int col = 0; col < pixel_count; col ++) {
+ FX_BYTE gray = pPalette[*src_scan];
+ if (clip_scan && clip_scan[col] < 255) {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, clip_scan[col]);
+ } else {
+ *dest_scan = gray;
+ }
+ dest_scan ++;
+ src_scan ++;
+ }
+ }
+}
+inline void _CompositeRow_8bppPal2Graya(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, FX_LPCBYTE pPalette, int pixel_count,
+ int blend_type, FX_LPCBYTE clip_scan,
+ FX_LPBYTE dest_alpha_scan, FX_LPCBYTE src_alpha_scan)
+{
+ if (src_alpha_scan) {
+ if (blend_type) {
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ int blended_color;
+ for (int col = 0; col < pixel_count; col ++) {
+ FX_BYTE gray = pPalette[*src_scan];
+ src_scan ++;
+ FX_BYTE back_alpha = *dest_alpha_scan;
+ if (back_alpha == 0) {
+ int src_alpha = *src_alpha_scan ++;
+ if (clip_scan) {
+ src_alpha = clip_scan[col] * src_alpha / 255;
+ }
+ if (src_alpha) {
+ *dest_scan = gray;
+ *dest_alpha_scan = src_alpha;
+ }
+ dest_scan ++;
+ dest_alpha_scan ++;
+ continue;
+ }
+ FX_BYTE src_alpha = *src_alpha_scan++;
+ if (clip_scan) {
+ src_alpha = clip_scan[col] * src_alpha / 255;
+ }
+ if (src_alpha == 0) {
+ dest_scan ++;
+ dest_alpha_scan ++;
+ continue;
+ }
+ *dest_alpha_scan = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ int alpha_ratio = src_alpha * 255 / (*dest_alpha_scan);
+ if (bNonseparableBlend) {
+ blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
+ }
+ gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
+ dest_alpha_scan ++;
+ dest_scan ++;
+ }
+ return;
+ }
+ for (int col = 0; col < pixel_count; col ++) {
+ FX_BYTE gray = pPalette[*src_scan];
+ src_scan ++;
+ FX_BYTE back_alpha = *dest_alpha_scan;
+ if (back_alpha == 0) {
+ int src_alpha = *src_alpha_scan ++;
+ if (clip_scan) {
+ src_alpha = clip_scan[col] * src_alpha / 255;
+ }
+ if (src_alpha) {
+ *dest_scan = gray;
+ *dest_alpha_scan = src_alpha;
+ }
+ dest_scan ++;
+ dest_alpha_scan ++;
+ continue;
+ }
+ FX_BYTE src_alpha = *src_alpha_scan++;
+ if (clip_scan) {
+ src_alpha = clip_scan[col] * src_alpha / 255;
+ }
+ if (src_alpha == 0) {
+ dest_scan ++;
+ dest_alpha_scan ++;
+ continue;
+ }
+ *dest_alpha_scan = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ int alpha_ratio = src_alpha * 255 / (*dest_alpha_scan);
+ dest_alpha_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
+ dest_scan ++;
+ }
+ } else {
+ if (blend_type) {
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ int blended_color;
+ for (int col = 0; col < pixel_count; col ++) {
+ FX_BYTE gray = pPalette[*src_scan];
+ src_scan ++;
+ if (clip_scan == NULL || clip_scan[col] == 255) {
+ *dest_scan++ = gray;
+ *dest_alpha_scan++ = 255;
+ continue;
+ }
+ int src_alpha = clip_scan[col];
+ if (src_alpha == 0) {
+ dest_scan ++;
+ dest_alpha_scan ++;
+ continue;
+ }
+ int back_alpha = *dest_alpha_scan;
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ *dest_alpha_scan ++ = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ if (bNonseparableBlend) {
+ blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
+ }
+ gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
+ dest_scan ++;
+ }
+ return;
+ }
+ for (int col = 0; col < pixel_count; col ++) {
+ FX_BYTE gray = pPalette[*src_scan];
+ src_scan ++;
+ if (clip_scan == NULL || clip_scan[col] == 255) {
+ *dest_scan++ = gray;
+ *dest_alpha_scan++ = 255;
+ continue;
+ }
+ int src_alpha = clip_scan[col];
+ if (src_alpha == 0) {
+ dest_scan ++;
+ dest_alpha_scan ++;
+ continue;
+ }
+ int back_alpha = *dest_alpha_scan;
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ *dest_alpha_scan ++ = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
+ dest_scan ++;
+ }
+ }
+}
+inline void _CompositeRow_1bppPal2Gray(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left,
+ FX_LPCBYTE pPalette, int pixel_count, int blend_type, FX_LPCBYTE clip_scan)
+{
+ int reset_gray = pPalette[0];
+ int set_gray = pPalette[1];
+ if (blend_type) {
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ int blended_color;
+ for (int col = 0; col < pixel_count; col ++) {
+ FX_BYTE gray = (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) ? set_gray : reset_gray;
+ if (bNonseparableBlend) {
+ blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
+ }
+ gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);
+ if (clip_scan && clip_scan[col] < 255) {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, clip_scan[col]);
+ } else {
+ *dest_scan = gray;
+ }
+ dest_scan ++;
+ }
+ return;
+ }
+ for (int col = 0; col < pixel_count; col ++) {
+ FX_BYTE gray = (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) ? set_gray : reset_gray;
+ if (clip_scan && clip_scan[col] < 255) {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, clip_scan[col]);
+ } else {
+ *dest_scan = gray;
+ }
+ dest_scan ++;
+ }
+}
+inline void _CompositeRow_1bppPal2Graya(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left,
+ FX_LPCBYTE pPalette, int pixel_count, int blend_type, FX_LPCBYTE clip_scan,
+ FX_LPBYTE dest_alpha_scan)
+{
+ int reset_gray = pPalette[0];
+ int set_gray = pPalette[1];
+ if (blend_type) {
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ int blended_color;
+ for (int col = 0; col < pixel_count; col ++) {
+ FX_BYTE gray = (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) ? set_gray : reset_gray;
+ if (clip_scan == NULL || clip_scan[col] == 255) {
+ *dest_scan++ = gray;
+ *dest_alpha_scan ++ = 255;
+ continue;
+ }
+ int src_alpha = clip_scan[col];
+ if (src_alpha == 0) {
+ dest_scan ++;
+ dest_alpha_scan ++;
+ continue;
+ }
+ int back_alpha = *dest_alpha_scan;
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ *dest_alpha_scan ++ = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ if (bNonseparableBlend) {
+ blended_color = blend_type == FXDIB_BLEND_LUMINOSITY ? gray : *dest_scan;
+ }
+ gray = bNonseparableBlend ? blended_color : _BLEND(blend_type, *dest_scan, gray);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
+ dest_scan ++;
+ }
+ return;
+ }
+ for (int col = 0; col < pixel_count; col ++) {
+ FX_BYTE gray = (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) ? set_gray : reset_gray;
+ if (clip_scan == NULL || clip_scan[col] == 255) {
+ *dest_scan++ = gray;
+ *dest_alpha_scan ++ = 255;
+ continue;
+ }
+ int src_alpha = clip_scan[col];
+ if (src_alpha == 0) {
+ dest_scan ++;
+ dest_alpha_scan ++;
+ continue;
+ }
+ int back_alpha = *dest_alpha_scan;
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ *dest_alpha_scan ++ = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, alpha_ratio);
+ dest_scan ++;
+ }
+}
+inline void _CompositeRow_8bppRgb2Rgb_NoBlend(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, FX_DWORD* pPalette, int pixel_count,
+ int DestBpp, FX_LPCBYTE clip_scan,
+ FX_LPCBYTE src_alpha_scan)
+{
+ if (src_alpha_scan) {
+ int dest_gap = DestBpp - 3;
+ FX_ARGB argb = 0;
+ for (int col = 0; col < pixel_count; col ++) {
+ argb = pPalette[*src_scan];
+ int src_r = FXARGB_R(argb);
+ int src_g = FXARGB_G(argb);
+ int src_b = FXARGB_B(argb);
+ src_scan ++;
+ FX_BYTE src_alpha = 0;
+ if (clip_scan) {
+ src_alpha = (*src_alpha_scan++) * (*clip_scan++) / 255;
+ } else {
+ src_alpha = *src_alpha_scan++;
+ }
+ if (src_alpha == 255) {
+ *dest_scan++ = src_b;
+ *dest_scan++ = src_g;
+ *dest_scan++ = src_r;
+ dest_scan += dest_gap;
+ continue;
+ }
+ if (src_alpha == 0) {
+ dest_scan += DestBpp;
+ continue;
+ }
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, src_alpha);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, src_alpha);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, src_alpha);
+ dest_scan ++;
+ dest_scan += dest_gap;
+ }
+ } else {
+ FX_ARGB argb = 0;
+ for (int col = 0; col < pixel_count; col ++) {
+ argb = pPalette[*src_scan];
+ int src_r = FXARGB_R(argb);
+ int src_g = FXARGB_G(argb);
+ int src_b = FXARGB_B(argb);
+ if (clip_scan && clip_scan[col] < 255) {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, clip_scan[col]);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, clip_scan[col]);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, clip_scan[col]);
+ dest_scan ++;
+ } else {
+ *dest_scan++ = src_b;
+ *dest_scan++ = src_g;
+ *dest_scan++ = src_r;
+ }
+ if (DestBpp == 4) {
+ dest_scan++;
+ }
+ src_scan ++;
+ }
+ }
+}
+inline void _CompositeRow_1bppRgb2Rgb_NoBlend(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left,
+ FX_DWORD* pPalette, int pixel_count, int DestBpp, FX_LPCBYTE clip_scan)
+{
+ int reset_r, reset_g, reset_b;
+ int set_r, set_g, set_b;
+ reset_r = FXARGB_R(pPalette[0]);
+ reset_g = FXARGB_G(pPalette[0]);
+ reset_b = FXARGB_B(pPalette[0]);
+ set_r = FXARGB_R(pPalette[1]);
+ set_g = FXARGB_G(pPalette[1]);
+ set_b = FXARGB_B(pPalette[1]);
+ for (int col = 0; col < pixel_count; col ++) {
+ int src_r, src_g, src_b;
+ if (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) {
+ src_r = set_r;
+ src_g = set_g;
+ src_b = set_b;
+ } else {
+ src_r = reset_r;
+ src_g = reset_g;
+ src_b = reset_b;
+ }
+ if (clip_scan && clip_scan[col] < 255) {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, clip_scan[col]);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, clip_scan[col]);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, clip_scan[col]);
+ dest_scan ++;
+ } else {
+ *dest_scan++ = src_b;
+ *dest_scan++ = src_g;
+ *dest_scan++ = src_r;
+ }
+ if (DestBpp == 4) {
+ dest_scan++;
+ }
+ }
+}
+inline void _CompositeRow_8bppRgb2Argb_NoBlend(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width,
+ FX_DWORD* pPalette, FX_LPCBYTE clip_scan,
+ FX_LPCBYTE src_alpha_scan)
+{
+ if (src_alpha_scan) {
+ for (int col = 0; col < width; col ++) {
+ FX_ARGB argb = pPalette[*src_scan];
+ src_scan ++;
+ int src_r = FXARGB_R(argb);
+ int src_g = FXARGB_G(argb);
+ int src_b = FXARGB_B(argb);
+ FX_BYTE back_alpha = dest_scan[3];
+ if (back_alpha == 0) {
+ if (clip_scan) {
+ int src_alpha = clip_scan[col] * (*src_alpha_scan) / 255;
+ FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha, src_r, src_g, src_b));
+ } else {
+ FXARGB_SETDIB(dest_scan, FXARGB_MAKE(*src_alpha_scan, src_r, src_g, src_b));
+ }
+ dest_scan += 4;
+ src_alpha_scan ++;
+ continue;
+ }
+ FX_BYTE src_alpha;
+ if (clip_scan == NULL) {
+ src_alpha = *src_alpha_scan ++;
+ } else {
+ src_alpha = clip_scan[col] * (*src_alpha_scan++) / 255;
+ }
+ if (src_alpha == 0) {
+ dest_scan += 4;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
+ dest_scan ++;
+ dest_scan ++;
+ }
+ } else
+ for (int col = 0; col < width; col ++) {
+ FX_ARGB argb = pPalette[*src_scan];
+ int src_r = FXARGB_R(argb);
+ int src_g = FXARGB_G(argb);
+ int src_b = FXARGB_B(argb);
+ if (clip_scan == NULL || clip_scan[col] == 255) {
+ *dest_scan++ = src_b;
+ *dest_scan++ = src_g;
+ *dest_scan++ = src_r;
+ *dest_scan++ = 255;
+ src_scan ++;
+ continue;
+ }
+ int src_alpha = clip_scan[col];
+ if (src_alpha == 0) {
+ dest_scan += 4;
+ src_scan ++;
+ continue;
+ }
+ int back_alpha = dest_scan[3];
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
+ dest_scan ++;
+ dest_scan ++;
+ src_scan ++;
+ }
+}
+void _CompositeRow_8bppRgb2Rgba_NoBlend(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width,
+ FX_DWORD* pPalette, FX_LPCBYTE clip_scan,
+ FX_LPBYTE dest_alpha_scan, FX_LPCBYTE src_alpha_scan)
+{
+ if (src_alpha_scan) {
+ for (int col = 0; col < width; col ++) {
+ FX_ARGB argb = pPalette[*src_scan];
+ src_scan ++;
+ int src_r = FXARGB_R(argb);
+ int src_g = FXARGB_G(argb);
+ int src_b = FXARGB_B(argb);
+ FX_BYTE back_alpha = *dest_alpha_scan;
+ if (back_alpha == 0) {
+ if (clip_scan) {
+ int src_alpha = clip_scan[col] * (*src_alpha_scan) / 255;
+ *dest_alpha_scan ++ = src_alpha;
+ } else {
+ *dest_alpha_scan ++ = *src_alpha_scan;
+ }
+ *dest_scan ++ = src_b;
+ *dest_scan ++ = src_g;
+ *dest_scan ++ = src_r;
+ src_alpha_scan ++;
+ continue;
+ }
+ FX_BYTE src_alpha;
+ if (clip_scan == NULL) {
+ src_alpha = *src_alpha_scan++;
+ } else {
+ src_alpha = clip_scan[col] * (*src_alpha_scan++) / 255;
+ }
+ if (src_alpha == 0) {
+ dest_scan += 3;
+ dest_alpha_scan ++;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ *dest_alpha_scan ++ = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
+ dest_scan ++;
+ }
+ } else
+ for (int col = 0; col < width; col ++) {
+ FX_ARGB argb = pPalette[*src_scan];
+ int src_r = FXARGB_R(argb);
+ int src_g = FXARGB_G(argb);
+ int src_b = FXARGB_B(argb);
+ if (clip_scan == NULL || clip_scan[col] == 255) {
+ *dest_scan++ = src_b;
+ *dest_scan++ = src_g;
+ *dest_scan++ = src_r;
+ *dest_alpha_scan++ = 255;
+ src_scan ++;
+ continue;
+ }
+ int src_alpha = clip_scan[col];
+ if (src_alpha == 0) {
+ dest_scan += 3;
+ dest_alpha_scan ++;
+ src_scan ++;
+ continue;
+ }
+ int back_alpha = *dest_alpha_scan;
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ *dest_alpha_scan ++ = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
+ dest_scan ++;
+ src_scan ++;
+ }
+}
+inline void _CompositeRow_1bppRgb2Argb_NoBlend(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left, int width,
+ FX_DWORD* pPalette, FX_LPCBYTE clip_scan)
+{
+ int reset_r, reset_g, reset_b;
+ int set_r, set_g, set_b;
+ reset_r = FXARGB_R(pPalette[0]);
+ reset_g = FXARGB_G(pPalette[0]);
+ reset_b = FXARGB_B(pPalette[0]);
+ set_r = FXARGB_R(pPalette[1]);
+ set_g = FXARGB_G(pPalette[1]);
+ set_b = FXARGB_B(pPalette[1]);
+ for (int col = 0; col < width; col ++) {
+ int src_r, src_g, src_b;
+ if (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) {
+ src_r = set_r;
+ src_g = set_g;
+ src_b = set_b;
+ } else {
+ src_r = reset_r;
+ src_g = reset_g;
+ src_b = reset_b;
+ }
+ if (clip_scan == NULL || clip_scan[col] == 255) {
+ *dest_scan++ = src_b;
+ *dest_scan++ = src_g;
+ *dest_scan++ = src_r;
+ *dest_scan++ = 255;
+ continue;
+ }
+ int src_alpha = clip_scan[col];
+ if (src_alpha == 0) {
+ dest_scan += 4;
+ continue;
+ }
+ int back_alpha = dest_scan[3];
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
+ dest_scan ++;
+ dest_scan ++;
+ }
+}
+void _CompositeRow_1bppRgb2Rgba_NoBlend(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left, int width,
+ FX_DWORD* pPalette, FX_LPCBYTE clip_scan,
+ FX_LPBYTE dest_alpha_scan)
+{
+ int reset_r, reset_g, reset_b;
+ int set_r, set_g, set_b;
+ reset_r = FXARGB_R(pPalette[0]);
+ reset_g = FXARGB_G(pPalette[0]);
+ reset_b = FXARGB_B(pPalette[0]);
+ set_r = FXARGB_R(pPalette[1]);
+ set_g = FXARGB_G(pPalette[1]);
+ set_b = FXARGB_B(pPalette[1]);
+ for (int col = 0; col < width; col ++) {
+ int src_r, src_g, src_b;
+ if (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) {
+ src_r = set_r;
+ src_g = set_g;
+ src_b = set_b;
+ } else {
+ src_r = reset_r;
+ src_g = reset_g;
+ src_b = reset_b;
+ }
+ if (clip_scan == NULL || clip_scan[col] == 255) {
+ *dest_scan++ = src_b;
+ *dest_scan++ = src_g;
+ *dest_scan++ = src_r;
+ *dest_alpha_scan++ = 255;
+ continue;
+ }
+ int src_alpha = clip_scan[col];
+ if (src_alpha == 0) {
+ dest_scan += 3;
+ dest_alpha_scan ++;
+ continue;
+ }
+ int back_alpha = *dest_alpha_scan;
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ *dest_alpha_scan ++ = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
+ dest_scan ++;
+ }
+}
+void _CompositeRow_ByteMask2Argb(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b, int pixel_count,
+ int blend_type, FX_LPCBYTE clip_scan)
+{
+ for (int col = 0; col < pixel_count; col ++) {
+ int src_alpha;
+ if (clip_scan) {
+ src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;
+ } else {
+ src_alpha = mask_alpha * src_scan[col] / 255;
+ }
+ FX_BYTE back_alpha = dest_scan[3];
+ if (back_alpha == 0) {
+ FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha, src_r, src_g, src_b));
+ dest_scan += 4;
+ continue;
+ }
+ if (src_alpha == 0) {
+ dest_scan += 4;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
+ int blended_colors[3];
+ FX_BYTE src_scan[3];
+ src_scan[0] = src_b;
+ src_scan[1] = src_g;
+ src_scan[2] = src_r;
+ _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[0], alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[1], alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[2], alpha_ratio);
+ } else if (blend_type) {
+ int blended = _BLEND(blend_type, *dest_scan, src_b);
+ blended = FXDIB_ALPHA_MERGE(src_b, blended, back_alpha);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
+ dest_scan ++;
+ blended = _BLEND(blend_type, *dest_scan, src_g);
+ blended = FXDIB_ALPHA_MERGE(src_g, blended, back_alpha);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
+ dest_scan ++;
+ blended = _BLEND(blend_type, *dest_scan, src_r);
+ blended = FXDIB_ALPHA_MERGE(src_r, blended, back_alpha);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
+ } else {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
+ }
+ dest_scan += 2;
+ }
+}
+void _CompositeRow_ByteMask2Rgba(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b, int pixel_count,
+ int blend_type, FX_LPCBYTE clip_scan,
+ FX_LPBYTE dest_alpha_scan)
+{
+ for (int col = 0; col < pixel_count; col ++) {
+ int src_alpha;
+ if (clip_scan) {
+ src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;
+ } else {
+ src_alpha = mask_alpha * src_scan[col] / 255;
+ }
+ FX_BYTE back_alpha = *dest_alpha_scan;
+ if (back_alpha == 0) {
+ *dest_scan ++ = src_b;
+ *dest_scan ++ = src_g;
+ *dest_scan ++ = src_r;
+ *dest_alpha_scan ++ = src_alpha;
+ continue;
+ }
+ if (src_alpha == 0) {
+ dest_scan += 3;
+ dest_alpha_scan ++;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ *dest_alpha_scan ++ = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
+ int blended_colors[3];
+ FX_BYTE src_scan[3];
+ src_scan[0] = src_b;
+ src_scan[1] = src_g;
+ src_scan[2] = src_r;
+ _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[0], alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[1], alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[2], alpha_ratio);
+ dest_scan ++;
+ } else if (blend_type) {
+ int blended = _BLEND(blend_type, *dest_scan, src_b);
+ blended = FXDIB_ALPHA_MERGE(src_b, blended, back_alpha);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
+ dest_scan ++;
+ blended = _BLEND(blend_type, *dest_scan, src_g);
+ blended = FXDIB_ALPHA_MERGE(src_g, blended, back_alpha);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
+ dest_scan ++;
+ blended = _BLEND(blend_type, *dest_scan, src_r);
+ blended = FXDIB_ALPHA_MERGE(src_r, blended, back_alpha);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
+ dest_scan ++;
+ } else {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
+ dest_scan ++;
+ }
+ }
+}
+void _CompositeRow_ByteMask2Rgb(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b, int pixel_count,
+ int blend_type, int Bpp, FX_LPCBYTE clip_scan)
+{
+ for (int col = 0; col < pixel_count; col ++) {
+ int src_alpha;
+ if (clip_scan) {
+ src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;
+ } else {
+ src_alpha = mask_alpha * src_scan[col] / 255;
+ }
+ if (src_alpha == 0) {
+ dest_scan += Bpp;
+ continue;
+ }
+ if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
+ int blended_colors[3];
+ FX_BYTE src_scan[3];
+ src_scan[0] = src_b;
+ src_scan[1] = src_g;
+ src_scan[2] = src_r;
+ _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[0], src_alpha);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[1], src_alpha);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[2], src_alpha);
+ } else if (blend_type) {
+ int blended = _BLEND(blend_type, *dest_scan, src_b);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, src_alpha);
+ dest_scan ++;
+ blended = _BLEND(blend_type, *dest_scan, src_g);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, src_alpha);
+ dest_scan ++;
+ blended = _BLEND(blend_type, *dest_scan, src_r);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, src_alpha);
+ } else {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, src_alpha);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, src_alpha);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, src_alpha);
+ }
+ dest_scan += Bpp - 2;
+ }
+}
+void _CompositeRow_ByteMask2Mask(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int pixel_count,
+ FX_LPCBYTE clip_scan)
+{
+ for (int col = 0; col < pixel_count; col ++) {
+ int src_alpha;
+ if (clip_scan) {
+ src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;
+ } else {
+ src_alpha = mask_alpha * src_scan[col] / 255;
+ }
+ FX_BYTE back_alpha = *dest_scan;
+ if (!back_alpha) {
+ *dest_scan = src_alpha;
+ } else if (src_alpha) {
+ *dest_scan = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ }
+ dest_scan ++;
+ }
+}
+void _CompositeRow_ByteMask2Gray(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_gray,
+ int pixel_count, FX_LPCBYTE clip_scan)
+{
+ for (int col = 0; col < pixel_count; col ++) {
+ int src_alpha;
+ if (clip_scan) {
+ src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;
+ } else {
+ src_alpha = mask_alpha * src_scan[col] / 255;
+ }
+ if (src_alpha) {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_gray, src_alpha);
+ }
+ dest_scan ++;
+ }
+}
+void _CompositeRow_ByteMask2Graya(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_gray,
+ int pixel_count, FX_LPCBYTE clip_scan,
+ FX_LPBYTE dest_alpha_scan)
+{
+ for (int col = 0; col < pixel_count; col ++) {
+ int src_alpha;
+ if (clip_scan) {
+ src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;
+ } else {
+ src_alpha = mask_alpha * src_scan[col] / 255;
+ }
+ FX_BYTE back_alpha = *dest_alpha_scan;
+ if (back_alpha == 0) {
+ *dest_scan ++ = src_gray;
+ *dest_alpha_scan ++ = src_alpha;
+ continue;
+ }
+ if (src_alpha == 0) {
+ dest_scan ++;
+ dest_alpha_scan ++;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ *dest_alpha_scan++ = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_gray, alpha_ratio);
+ dest_scan ++;
+ }
+}
+void _CompositeRow_BitMask2Argb(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b,
+ int src_left, int pixel_count, int blend_type, FX_LPCBYTE clip_scan)
+{
+ if (blend_type == FXDIB_BLEND_NORMAL && clip_scan == NULL && mask_alpha == 255) {
+ FX_ARGB argb = FXARGB_MAKE(0xff, src_r, src_g, src_b);
+ for (int col = 0; col < pixel_count; col ++) {
+ if (src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8))) {
+ FXARGB_SETDIB(dest_scan, argb);
+ }
+ dest_scan += 4;
+ }
+ return;
+ }
+ for (int col = 0; col < pixel_count; col ++) {
+ if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) {
+ dest_scan += 4;
+ continue;
+ }
+ int src_alpha;
+ if (clip_scan) {
+ src_alpha = mask_alpha * clip_scan[col] / 255;
+ } else {
+ src_alpha = mask_alpha;
+ }
+ FX_BYTE back_alpha = dest_scan[3];
+ if (back_alpha == 0) {
+ FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha, src_r, src_g, src_b));
+ dest_scan += 4;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
+ int blended_colors[3];
+ FX_BYTE src_scan[3];
+ src_scan[0] = src_b;
+ src_scan[1] = src_g;
+ src_scan[2] = src_r;
+ _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[0], alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[1], alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[2], alpha_ratio);
+ } else if (blend_type) {
+ int blended = _BLEND(blend_type, *dest_scan, src_b);
+ blended = FXDIB_ALPHA_MERGE(src_b, blended, back_alpha);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
+ dest_scan ++;
+ blended = _BLEND(blend_type, *dest_scan, src_g);
+ blended = FXDIB_ALPHA_MERGE(src_g, blended, back_alpha);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
+ dest_scan ++;
+ blended = _BLEND(blend_type, *dest_scan, src_r);
+ blended = FXDIB_ALPHA_MERGE(src_r, blended, back_alpha);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
+ } else {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
+ }
+ dest_scan += 2;
+ }
+}
+void _CompositeRow_BitMask2Rgba(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b,
+ int src_left, int pixel_count, int blend_type, FX_LPCBYTE clip_scan,
+ FX_LPBYTE dest_alpha_scan)
+{
+ if (blend_type == FXDIB_BLEND_NORMAL && clip_scan == NULL && mask_alpha == 255) {
+ for (int col = 0; col < pixel_count; col ++) {
+ if (src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8))) {
+ dest_scan[0] = src_b;
+ dest_scan[1] = src_g;
+ dest_scan[2] = src_r;
+ *dest_alpha_scan = mask_alpha;
+ }
+ dest_scan += 3;
+ dest_alpha_scan ++;
+ }
+ return;
+ }
+ for (int col = 0; col < pixel_count; col ++) {
+ if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) {
+ dest_scan += 3;
+ dest_alpha_scan ++;
+ continue;
+ }
+ int src_alpha;
+ if (clip_scan) {
+ src_alpha = mask_alpha * clip_scan[col] / 255;
+ } else {
+ src_alpha = mask_alpha;
+ }
+ FX_BYTE back_alpha = dest_scan[3];
+ if (back_alpha == 0) {
+ *dest_scan ++ = src_b;
+ *dest_scan ++ = src_g;
+ *dest_scan ++ = src_r;
+ *dest_alpha_scan ++ = mask_alpha;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ *dest_alpha_scan ++ = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
+ int blended_colors[3];
+ FX_BYTE src_scan[3];
+ src_scan[0] = src_b;
+ src_scan[1] = src_g;
+ src_scan[2] = src_r;
+ _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[0], alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[1], alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[2], alpha_ratio);
+ dest_scan ++;
+ } else if (blend_type) {
+ int blended = _BLEND(blend_type, *dest_scan, src_b);
+ blended = FXDIB_ALPHA_MERGE(src_b, blended, back_alpha);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
+ dest_scan ++;
+ blended = _BLEND(blend_type, *dest_scan, src_g);
+ blended = FXDIB_ALPHA_MERGE(src_g, blended, back_alpha);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
+ dest_scan ++;
+ blended = _BLEND(blend_type, *dest_scan, src_r);
+ blended = FXDIB_ALPHA_MERGE(src_r, blended, back_alpha);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, alpha_ratio);
+ dest_scan ++;
+ } else {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, alpha_ratio);
+ dest_scan ++;
+ }
+ }
+}
+void _CompositeRow_BitMask2Rgb(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b,
+ int src_left, int pixel_count, int blend_type, int Bpp, FX_LPCBYTE clip_scan)
+{
+ if (blend_type == FXDIB_BLEND_NORMAL && clip_scan == NULL && mask_alpha == 255) {
+ for (int col = 0; col < pixel_count; col ++) {
+ if (src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8))) {
+ dest_scan[2] = src_r;
+ dest_scan[1] = src_g;
+ dest_scan[0] = src_b;
+ }
+ dest_scan += Bpp;
+ }
+ return;
+ }
+ for (int col = 0; col < pixel_count; col ++) {
+ if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) {
+ dest_scan += Bpp;
+ continue;
+ }
+ int src_alpha;
+ if (clip_scan) {
+ src_alpha = mask_alpha * clip_scan[col] / 255;
+ } else {
+ src_alpha = mask_alpha;
+ }
+ if (src_alpha == 0) {
+ dest_scan += Bpp;
+ continue;
+ }
+ if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
+ int blended_colors[3];
+ FX_BYTE src_scan[3];
+ src_scan[0] = src_b;
+ src_scan[1] = src_g;
+ src_scan[2] = src_r;
+ _RGB_Blend(blend_type, src_scan, dest_scan, blended_colors);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[0], src_alpha);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[1], src_alpha);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended_colors[2], src_alpha);
+ } else if (blend_type) {
+ int blended = _BLEND(blend_type, *dest_scan, src_b);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, src_alpha);
+ dest_scan++;
+ blended = _BLEND(blend_type, *dest_scan, src_g);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, src_alpha);
+ dest_scan++;
+ blended = _BLEND(blend_type, *dest_scan, src_r);
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, blended, src_alpha);
+ } else {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_b, src_alpha);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_g, src_alpha);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_r, src_alpha);
+ }
+ dest_scan += Bpp - 2;
+ }
+}
+void _CompositeRow_BitMask2Mask(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_left,
+ int pixel_count, FX_LPCBYTE clip_scan)
+{
+ for (int col = 0; col < pixel_count; col ++) {
+ if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) {
+ dest_scan ++;
+ continue;
+ }
+ int src_alpha;
+ if (clip_scan) {
+ src_alpha = mask_alpha * clip_scan[col] / 255;
+ } else {
+ src_alpha = mask_alpha;
+ }
+ FX_BYTE back_alpha = *dest_scan;
+ if (!back_alpha) {
+ *dest_scan = src_alpha;
+ } else if (src_alpha) {
+ *dest_scan = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ }
+ dest_scan ++;
+ }
+}
+void _CompositeRow_BitMask2Gray(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_gray,
+ int src_left, int pixel_count, FX_LPCBYTE clip_scan)
+{
+ for (int col = 0; col < pixel_count; col ++) {
+ if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) {
+ dest_scan ++;
+ continue;
+ }
+ int src_alpha;
+ if (clip_scan) {
+ src_alpha = mask_alpha * clip_scan[col] / 255;
+ } else {
+ src_alpha = mask_alpha;
+ }
+ if (src_alpha) {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_gray, src_alpha);
+ }
+ dest_scan ++;
+ }
+}
+void _CompositeRow_BitMask2Graya(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_gray,
+ int src_left, int pixel_count, FX_LPCBYTE clip_scan,
+ FX_LPBYTE dest_alpha_scan)
+{
+ for (int col = 0; col < pixel_count; col ++) {
+ if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) {
+ dest_scan ++;
+ dest_alpha_scan ++;
+ continue;
+ }
+ int src_alpha;
+ if (clip_scan) {
+ src_alpha = mask_alpha * clip_scan[col] / 255;
+ } else {
+ src_alpha = mask_alpha;
+ }
+ FX_BYTE back_alpha = *dest_alpha_scan;
+ if (back_alpha == 0) {
+ *dest_scan ++ = src_gray;
+ *dest_alpha_scan ++ = src_alpha;
+ continue;
+ }
+ if (src_alpha == 0) {
+ dest_scan ++;
+ dest_alpha_scan ++;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ *dest_alpha_scan++ = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, src_gray, alpha_ratio);
+ dest_scan ++;
+ }
+}
+void _CompositeRow_Argb2Argb_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int pixel_count, int blend_type, FX_LPCBYTE clip_scan)
+{
+ int blended_colors[3];
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ for (int col = 0; col < pixel_count; col ++) {
+ FX_BYTE back_alpha = dest_scan[3];
+ if (back_alpha == 0) {
+ if (clip_scan) {
+ int src_alpha = clip_scan[col] * src_scan[3] / 255;
+ dest_scan[3] = src_alpha;
+ dest_scan[0] = src_scan[2];
+ dest_scan[1] = src_scan[1];
+ dest_scan[2] = src_scan[0];
+ } else {
+ FXARGB_RGBORDERCOPY(dest_scan, src_scan);
+ }
+ dest_scan += 4;
+ src_scan += 4;
+ continue;
+ }
+ FX_BYTE src_alpha;
+ if (clip_scan == NULL) {
+ src_alpha = src_scan[3];
+ } else {
+ src_alpha = clip_scan[col] * src_scan[3] / 255;
+ }
+ if (src_alpha == 0) {
+ dest_scan += 4;
+ src_scan += 4;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ if (bNonseparableBlend) {
+ FX_BYTE dest_scan_o[3];
+ dest_scan_o[0] = dest_scan[2];
+ dest_scan_o[1] = dest_scan[1];
+ dest_scan_o[2] = dest_scan[0];
+ _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
+ }
+ for (int color = 0; color < 3; color ++) {
+ int index = 2 - color;
+ if (blend_type) {
+ int blended = bNonseparableBlend ? blended_colors[color] :
+ _BLEND(blend_type, dest_scan[index], *src_scan);
+ blended = FXDIB_ALPHA_MERGE(*src_scan, blended, back_alpha);
+ dest_scan[index] = FXDIB_ALPHA_MERGE(dest_scan[index], blended, alpha_ratio);
+ } else {
+ dest_scan[index] = FXDIB_ALPHA_MERGE(dest_scan[index], *src_scan, alpha_ratio);
+ }
+ src_scan ++;
+ }
+ dest_scan += 4;
+ src_scan++;
+ }
+}
+void _CompositeRow_Rgb2Argb_Blend_NoClip_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int src_Bpp)
+{
+ int blended_colors[3];
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ int src_gap = src_Bpp - 3;
+ for (int col = 0; col < width; col ++) {
+ FX_BYTE back_alpha = dest_scan[3];
+ if (back_alpha == 0) {
+ if (src_Bpp == 4) {
+ FXARGB_SETRGBORDERDIB(dest_scan, 0xff000000 | FXARGB_GETDIB(src_scan));
+ } else {
+ FXARGB_SETRGBORDERDIB(dest_scan, FXARGB_MAKE(0xff, src_scan[2], src_scan[1], src_scan[0]));
+ }
+ dest_scan += 4;
+ src_scan += src_Bpp;
+ continue;
+ }
+ dest_scan[3] = 0xff;
+ if (bNonseparableBlend) {
+ FX_BYTE dest_scan_o[3];
+ dest_scan_o[0] = dest_scan[2];
+ dest_scan_o[1] = dest_scan[1];
+ dest_scan_o[2] = dest_scan[0];
+ _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
+ }
+ for (int color = 0; color < 3; color ++) {
+ int index = 2 - color;
+ int src_color = FX_GAMMA(*src_scan);
+ int blended = bNonseparableBlend ? blended_colors[color] :
+ _BLEND(blend_type, dest_scan[index], src_color);
+ dest_scan[index] = FXDIB_ALPHA_MERGE(src_color, blended, back_alpha);
+ src_scan ++;
+ }
+ dest_scan += 4;
+ src_scan += src_gap;
+ }
+}
+inline void _CompositeRow_Argb2Rgb_Blend_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int dest_Bpp, FX_LPCBYTE clip_scan)
+{
+ int blended_colors[3];
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ for (int col = 0; col < width; col ++) {
+ FX_BYTE src_alpha;
+ if (clip_scan) {
+ src_alpha = src_scan[3] * (*clip_scan++) / 255;
+ } else {
+ src_alpha = src_scan[3];
+ }
+ if (src_alpha == 0) {
+ dest_scan += dest_Bpp;
+ src_scan += 4;
+ continue;
+ }
+ if (bNonseparableBlend) {
+ FX_BYTE dest_scan_o[3];
+ dest_scan_o[0] = dest_scan[2];
+ dest_scan_o[1] = dest_scan[1];
+ dest_scan_o[2] = dest_scan[0];
+ _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
+ }
+ for (int color = 0; color < 3; color ++) {
+ int index = 2 - color;
+ int back_color = FX_GAMMA(dest_scan[index]);
+ int blended = bNonseparableBlend ? blended_colors[color] :
+ _BLEND(blend_type, back_color, *src_scan);
+ dest_scan[index] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(back_color, blended, src_alpha));
+ src_scan ++;
+ }
+ dest_scan += dest_Bpp;
+ src_scan ++;
+ }
+}
+inline void _CompositeRow_Rgb2Argb_NoBlend_NoClip_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int src_Bpp)
+{
+ int src_gap = src_Bpp - 3;
+ for (int col = 0; col < width; col ++) {
+ if (src_Bpp == 4) {
+ FXARGB_SETRGBORDERDIB(dest_scan, 0xff000000 | FXARGB_GETDIB(src_scan));
+ } else {
+ FXARGB_SETRGBORDERDIB(dest_scan, FXARGB_MAKE(0xff, src_scan[2], src_scan[1], src_scan[0]));
+ }
+ dest_scan += 4;
+ src_scan += src_Bpp;
+ }
+}
+inline void _CompositeRow_Rgb2Rgb_Blend_NoClip_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int dest_Bpp, int src_Bpp)
+{
+ int blended_colors[3];
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ int src_gap = src_Bpp - 3;
+ for (int col = 0; col < width; col ++) {
+ if (bNonseparableBlend) {
+ FX_BYTE dest_scan_o[3];
+ dest_scan_o[0] = dest_scan[2];
+ dest_scan_o[1] = dest_scan[1];
+ dest_scan_o[2] = dest_scan[0];
+ _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
+ }
+ for (int color = 0; color < 3; color ++) {
+ int index = 2 - color;
+ int back_color = FX_GAMMA(dest_scan[index]);
+ int src_color = FX_GAMMA(*src_scan);
+ int blended = bNonseparableBlend ? blended_colors[color] :
+ _BLEND(blend_type, back_color, src_color);
+ dest_scan[index] = FX_GAMMA_INVERSE(blended);
+ src_scan ++;
+ }
+ dest_scan += dest_Bpp;
+ src_scan += src_gap;
+ }
+}
+inline void _CompositeRow_Argb2Rgb_NoBlend_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int dest_Bpp, FX_LPCBYTE clip_scan)
+{
+ for (int col = 0; col < width; col ++) {
+ FX_BYTE src_alpha;
+ if (clip_scan) {
+ src_alpha = src_scan[3] * (*clip_scan++) / 255;
+ } else {
+ src_alpha = src_scan[3];
+ }
+ if (src_alpha == 255) {
+ dest_scan[2] = FX_GAMMA_INVERSE(*src_scan++);
+ dest_scan[1] = FX_GAMMA_INVERSE(*src_scan++);
+ dest_scan[0] = FX_GAMMA_INVERSE(*src_scan++);
+ dest_scan += dest_Bpp;
+ src_scan ++;
+ continue;
+ }
+ if (src_alpha == 0) {
+ dest_scan += dest_Bpp;
+ src_scan += 4;
+ continue;
+ }
+ for (int color = 0; color < 3; color ++) {
+ int index = 2 - color;
+ dest_scan[index] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[index]), *src_scan, src_alpha));
+ src_scan ++;
+ }
+ dest_scan += dest_Bpp;
+ src_scan ++;
+ }
+}
+inline void _CompositeRow_Rgb2Rgb_NoBlend_NoClip_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int dest_Bpp, int src_Bpp)
+{
+ for (int col = 0; col < width; col ++) {
+ dest_scan[2] = src_scan[0];
+ dest_scan[1] = src_scan[1];
+ dest_scan[0] = src_scan[2];
+ dest_scan += dest_Bpp;
+ src_scan += src_Bpp;
+ }
+}
+inline void _CompositeRow_Rgb2Argb_Blend_Clip_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int src_Bpp, FX_LPCBYTE clip_scan)
+{
+ int blended_colors[3];
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ int src_gap = src_Bpp - 3;
+ for (int col = 0; col < width; col ++) {
+ int src_alpha = *clip_scan ++;
+ FX_BYTE back_alpha = dest_scan[3];
+ if (back_alpha == 0) {
+ dest_scan[2] = FX_GAMMA(*src_scan++);
+ dest_scan[1] = FX_GAMMA(*src_scan++);
+ dest_scan[0] = FX_GAMMA(*src_scan++);
+ src_scan += src_gap;
+ dest_scan += 4;
+ continue;
+ }
+ if (src_alpha == 0) {
+ dest_scan += 4;
+ src_scan += src_Bpp;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ if (bNonseparableBlend) {
+ FX_BYTE dest_scan_o[3];
+ dest_scan_o[0] = dest_scan[2];
+ dest_scan_o[1] = dest_scan[1];
+ dest_scan_o[2] = dest_scan[0];
+ _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
+ }
+ for (int color = 0; color < 3; color ++) {
+ int index = 2 - color;
+ int src_color = FX_GAMMA(*src_scan);
+ int blended = bNonseparableBlend ? blended_colors[color] :
+ _BLEND(blend_type, dest_scan[index], src_color);
+ blended = FXDIB_ALPHA_MERGE(src_color, blended, back_alpha);
+ dest_scan[index] = FXDIB_ALPHA_MERGE(dest_scan[index], blended, alpha_ratio);
+ src_scan ++;
+ }
+ dest_scan += 4;
+ src_scan += src_gap;
+ }
+}
+inline void _CompositeRow_Rgb2Rgb_Blend_Clip_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int blend_type, int dest_Bpp, int src_Bpp, FX_LPCBYTE clip_scan)
+{
+ int blended_colors[3];
+ FX_BOOL bNonseparableBlend = blend_type >= FXDIB_BLEND_NONSEPARABLE;
+ int src_gap = src_Bpp - 3;
+ for (int col = 0; col < width; col ++) {
+ FX_BYTE src_alpha = *clip_scan ++;
+ if (src_alpha == 0) {
+ dest_scan += dest_Bpp;
+ src_scan += src_Bpp;
+ continue;
+ }
+ if (bNonseparableBlend) {
+ FX_BYTE dest_scan_o[3];
+ dest_scan_o[0] = dest_scan[2];
+ dest_scan_o[1] = dest_scan[1];
+ dest_scan_o[2] = dest_scan[0];
+ _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
+ }
+ for (int color = 0; color < 3; color ++) {
+ int index = 2 - color;
+ int src_color = FX_GAMMA(*src_scan);
+ int back_color = FX_GAMMA(dest_scan[index]);
+ int blended = bNonseparableBlend ? blended_colors[color] :
+ _BLEND(blend_type, back_color, src_color);
+ dest_scan[index] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(back_color, blended, src_alpha));
+ src_scan ++;
+ }
+ dest_scan += dest_Bpp;
+ src_scan += src_gap;
+ }
+}
+inline void _CompositeRow_Rgb2Argb_NoBlend_Clip_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int src_Bpp, FX_LPCBYTE clip_scan)
+{
+ int src_gap = src_Bpp - 3;
+ for (int col = 0; col < width; col ++) {
+ int src_alpha = clip_scan[col];
+ if (src_alpha == 255) {
+ dest_scan[2] = FX_GAMMA(*src_scan++);
+ dest_scan[1] = FX_GAMMA(*src_scan++);
+ dest_scan[0] = FX_GAMMA(*src_scan++);
+ dest_scan[3] = 255;
+ dest_scan += 4;
+ src_scan += src_gap;
+ continue;
+ }
+ if (src_alpha == 0) {
+ dest_scan += 4;
+ src_scan += src_Bpp;
+ continue;
+ }
+ int back_alpha = dest_scan[3];
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ for (int color = 0; color < 3; color ++) {
+ int index = 2 - color;
+ dest_scan[index] = FXDIB_ALPHA_MERGE(dest_scan[index], FX_GAMMA(*src_scan), alpha_ratio);
+ src_scan ++;
+ }
+ dest_scan += 4;
+ src_scan += src_gap;
+ }
+}
+inline void _CompositeRow_Rgb2Rgb_NoBlend_Clip_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, int dest_Bpp, int src_Bpp, FX_LPCBYTE clip_scan)
+{
+ for (int col = 0; col < width; col ++) {
+ int src_alpha = clip_scan[col];
+ if (src_alpha == 255) {
+ dest_scan[2] = src_scan[0];
+ dest_scan[1] = src_scan[1];
+ dest_scan[0] = src_scan[2];
+ } else if (src_alpha) {
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), FX_GAMMA(*src_scan), src_alpha));
+ src_scan ++;
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), FX_GAMMA(*src_scan), src_alpha));
+ src_scan ++;
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), FX_GAMMA(*src_scan), src_alpha));
+ dest_scan += dest_Bpp;
+ src_scan += src_Bpp - 2;
+ continue;
+ }
+ dest_scan += dest_Bpp;
+ src_scan += src_Bpp;
+ }
+}
+inline void _CompositeRow_8bppRgb2Rgb_NoBlend_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, FX_ARGB* pPalette, int pixel_count,
+ int DestBpp, FX_LPCBYTE clip_scan)
+{
+ for (int col = 0; col < pixel_count; col ++) {
+ FX_ARGB argb = pPalette ? pPalette[*src_scan] : (*src_scan) * 0x010101;
+ int src_r = FXARGB_R(argb);
+ int src_g = FXARGB_G(argb);
+ int src_b = FXARGB_B(argb);
+ if (clip_scan && clip_scan[col] < 255) {
+ dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], src_b, clip_scan[col]);
+ dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], src_g, clip_scan[col]);
+ dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], src_r, clip_scan[col]);
+ } else {
+ dest_scan[2] = src_b;
+ dest_scan[1] = src_g;
+ dest_scan[0] = src_r;
+ }
+ dest_scan += DestBpp;
+ src_scan ++;
+ }
+}
+inline void _CompositeRow_1bppRgb2Rgb_NoBlend_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left,
+ FX_ARGB* pPalette, int pixel_count, int DestBpp, FX_LPCBYTE clip_scan)
+{
+ int reset_r, reset_g, reset_b;
+ int set_r, set_g, set_b;
+ if (pPalette) {
+ reset_r = FXARGB_R(pPalette[0]);
+ reset_g = FXARGB_G(pPalette[0]);
+ reset_b = FXARGB_B(pPalette[0]);
+ set_r = FXARGB_R(pPalette[1]);
+ set_g = FXARGB_G(pPalette[1]);
+ set_b = FXARGB_B(pPalette[1]);
+ } else {
+ reset_r = reset_g = reset_b = 0;
+ set_r = set_g = set_b = 255;
+ }
+ for (int col = 0; col < pixel_count; col ++) {
+ int src_r, src_g, src_b;
+ if (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) {
+ src_r = set_r;
+ src_g = set_g;
+ src_b = set_b;
+ } else {
+ src_r = reset_r;
+ src_g = reset_g;
+ src_b = reset_b;
+ }
+ if (clip_scan && clip_scan[col] < 255) {
+ dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], src_b, clip_scan[col]);
+ dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], src_g, clip_scan[col]);
+ dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], src_r, clip_scan[col]);
+ } else {
+ dest_scan[2] = src_b;
+ dest_scan[1] = src_g;
+ dest_scan[0] = src_r;
+ }
+ dest_scan += DestBpp;
+ }
+}
+inline void _CompositeRow_8bppRgb2Argb_NoBlend_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width,
+ FX_ARGB* pPalette, FX_LPCBYTE clip_scan)
+{
+ for (int col = 0; col < width; col ++) {
+ int src_r, src_g, src_b;
+ if (pPalette) {
+ FX_ARGB argb = pPalette[*src_scan];
+ src_r = FXARGB_R(argb);
+ src_g = FXARGB_G(argb);
+ src_b = FXARGB_B(argb);
+ } else {
+ src_r = src_g = src_b = *src_scan;
+ }
+ if (clip_scan == NULL || clip_scan[col] == 255) {
+ dest_scan[2] = FX_GAMMA(src_b);
+ dest_scan[1] = FX_GAMMA(src_g);
+ dest_scan[0] = FX_GAMMA(src_r);
+ dest_scan[3] = 255;
+ src_scan ++;
+ dest_scan += 4;
+ continue;
+ }
+ int src_alpha = clip_scan[col];
+ if (src_alpha == 0) {
+ dest_scan += 4;
+ src_scan ++;
+ continue;
+ }
+ int back_alpha = dest_scan[3];
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], FX_GAMMA(src_b), alpha_ratio);
+ dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], FX_GAMMA(src_g), alpha_ratio);
+ dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], FX_GAMMA(src_r), alpha_ratio);
+ dest_scan += 4;
+ src_scan ++;
+ }
+}
+inline void _CompositeRow_1bppRgb2Argb_NoBlend_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left, int width,
+ FX_ARGB* pPalette, FX_LPCBYTE clip_scan)
+{
+ int reset_r, reset_g, reset_b;
+ int set_r, set_g, set_b;
+ if (pPalette) {
+ reset_r = FXARGB_R(pPalette[0]);
+ reset_g = FXARGB_G(pPalette[0]);
+ reset_b = FXARGB_B(pPalette[0]);
+ set_r = FXARGB_R(pPalette[1]);
+ set_g = FXARGB_G(pPalette[1]);
+ set_b = FXARGB_B(pPalette[1]);
+ } else {
+ reset_r = reset_g = reset_b = 0;
+ set_r = set_g = set_b = 255;
+ }
+ for (int col = 0; col < width; col ++) {
+ int src_r, src_g, src_b;
+ if (src_scan[(col + src_left) / 8] & (1 << (7 - (col + src_left) % 8))) {
+ src_r = set_r;
+ src_g = set_g;
+ src_b = set_b;
+ } else {
+ src_r = reset_r;
+ src_g = reset_g;
+ src_b = reset_b;
+ }
+ if (clip_scan == NULL || clip_scan[col] == 255) {
+ dest_scan[2] = FX_GAMMA(src_b);
+ dest_scan[1] = FX_GAMMA(src_g);
+ dest_scan[0] = FX_GAMMA(src_r);
+ dest_scan[3] = 255;
+ dest_scan += 4;
+ continue;
+ }
+ int src_alpha = clip_scan[col];
+ if (src_alpha == 0) {
+ dest_scan += 4;
+ continue;
+ }
+ int back_alpha = dest_scan[3];
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], FX_GAMMA(src_b), alpha_ratio);
+ dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], FX_GAMMA(src_g), alpha_ratio);
+ dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], FX_GAMMA(src_r), alpha_ratio);
+ dest_scan += 4;
+ }
+}
+void _CompositeRow_ByteMask2Argb_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b, int pixel_count,
+ int blend_type, FX_LPCBYTE clip_scan)
+{
+ for (int col = 0; col < pixel_count; col ++) {
+ int src_alpha;
+ if (clip_scan) {
+ src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;
+ } else {
+ src_alpha = mask_alpha * src_scan[col] / 255;
+ }
+ FX_BYTE back_alpha = dest_scan[3];
+ if (back_alpha == 0) {
+ FXARGB_SETRGBORDERDIB(dest_scan, FXARGB_MAKE(src_alpha, src_r, src_g, src_b));
+ dest_scan += 4;
+ continue;
+ }
+ if (src_alpha == 0) {
+ dest_scan += 4;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
+ int blended_colors[3];
+ FX_BYTE src_scan[3];
+ FX_BYTE dest_scan_o[3];
+ src_scan[0] = src_b;
+ src_scan[1] = src_g;
+ src_scan[2] = src_r;
+ dest_scan_o[0] = dest_scan[2];
+ dest_scan_o[1] = dest_scan[1];
+ dest_scan_o[2] = dest_scan[0];
+ _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
+ dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], blended_colors[0], alpha_ratio);
+ dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], blended_colors[1], alpha_ratio);
+ dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], blended_colors[2], alpha_ratio);
+ } else if (blend_type) {
+ int blended = _BLEND(blend_type, dest_scan[2], src_b);
+ blended = FXDIB_ALPHA_MERGE(src_b, blended, back_alpha);
+ dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], blended, alpha_ratio);
+ blended = _BLEND(blend_type, dest_scan[1], src_g);
+ blended = FXDIB_ALPHA_MERGE(src_g, blended, back_alpha);
+ dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], blended, alpha_ratio);
+ blended = _BLEND(blend_type, dest_scan[0], src_r);
+ blended = FXDIB_ALPHA_MERGE(src_r, blended, back_alpha);
+ dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], blended, alpha_ratio);
+ } else {
+ dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], src_b, alpha_ratio);
+ dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], src_g, alpha_ratio);
+ dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], src_r, alpha_ratio);
+ }
+ dest_scan += 4;
+ }
+}
+void _CompositeRow_ByteMask2Rgb_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b, int pixel_count,
+ int blend_type, int Bpp, FX_LPCBYTE clip_scan)
+{
+ for (int col = 0; col < pixel_count; col ++) {
+ int src_alpha;
+ if (clip_scan) {
+ src_alpha = mask_alpha * clip_scan[col] * src_scan[col] / 255 / 255;
+ } else {
+ src_alpha = mask_alpha * src_scan[col] / 255;
+ }
+ if (src_alpha == 0) {
+ dest_scan += Bpp;
+ continue;
+ }
+ if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
+ int blended_colors[3];
+ FX_BYTE src_scan[3];
+ FX_BYTE dest_scan_o[3];
+ src_scan[0] = src_b;
+ src_scan[1] = src_g;
+ src_scan[2] = src_r;
+ dest_scan_o[0] = dest_scan[2];
+ dest_scan_o[1] = dest_scan[1];
+ dest_scan_o[2] = dest_scan[0];
+ _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
+ dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], blended_colors[0], src_alpha);
+ dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], blended_colors[1], src_alpha);
+ dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], blended_colors[2], src_alpha);
+ } else if (blend_type) {
+ int blended = _BLEND(blend_type, dest_scan[2], src_b);
+ dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], blended, src_alpha);
+ blended = _BLEND(blend_type, dest_scan[1], src_g);
+ dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], blended, src_alpha);
+ blended = _BLEND(blend_type, dest_scan[0], src_r);
+ dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], blended, src_alpha);
+ } else {
+ dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], src_b, src_alpha);
+ dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], src_g, src_alpha);
+ dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], src_r, src_alpha);
+ }
+ dest_scan += Bpp;
+ }
+}
+void _CompositeRow_BitMask2Argb_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b,
+ int src_left, int pixel_count, int blend_type, FX_LPCBYTE clip_scan)
+{
+ if (blend_type == FXDIB_BLEND_NORMAL && clip_scan == NULL && mask_alpha == 255) {
+ FX_ARGB argb = FXARGB_MAKE(0xff, src_r, src_g, src_b);
+ for (int col = 0; col < pixel_count; col ++) {
+ if (src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8))) {
+ FXARGB_SETRGBORDERDIB(dest_scan, argb);
+ }
+ dest_scan += 4;
+ }
+ return;
+ }
+ for (int col = 0; col < pixel_count; col ++) {
+ if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) {
+ dest_scan += 4;
+ continue;
+ }
+ int src_alpha;
+ if (clip_scan) {
+ src_alpha = mask_alpha * clip_scan[col] / 255;
+ } else {
+ src_alpha = mask_alpha;
+ }
+ FX_BYTE back_alpha = dest_scan[3];
+ if (back_alpha == 0) {
+ FXARGB_SETRGBORDERDIB(dest_scan, FXARGB_MAKE(src_alpha, src_r, src_g, src_b));
+ dest_scan += 4;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
+ int blended_colors[3];
+ FX_BYTE src_scan[3];
+ FX_BYTE dest_scan_o[3];
+ src_scan[0] = src_b;
+ src_scan[1] = src_g;
+ src_scan[2] = src_r;
+ dest_scan_o[0] = dest_scan[2];
+ dest_scan_o[1] = dest_scan[1];
+ dest_scan_o[2] = dest_scan[0];
+ _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
+ dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], blended_colors[0], alpha_ratio);
+ dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], blended_colors[1], alpha_ratio);
+ dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], blended_colors[2], alpha_ratio);
+ } else if (blend_type) {
+ int blended = _BLEND(blend_type, dest_scan[2], src_b);
+ blended = FXDIB_ALPHA_MERGE(src_b, blended, back_alpha);
+ dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], blended, alpha_ratio);
+ blended = _BLEND(blend_type, dest_scan[1], src_g);
+ blended = FXDIB_ALPHA_MERGE(src_g, blended, back_alpha);
+ dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], blended, alpha_ratio);
+ blended = _BLEND(blend_type, dest_scan[0], src_r);
+ blended = FXDIB_ALPHA_MERGE(src_r, blended, back_alpha);
+ dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], blended, alpha_ratio);
+ } else {
+ dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], src_b, alpha_ratio);
+ dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], src_g, alpha_ratio);
+ dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], src_r, alpha_ratio);
+ }
+ dest_scan += 4;
+ }
+}
+void _CompositeRow_BitMask2Rgb_RgbByteOrder(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int mask_alpha, int src_r, int src_g, int src_b,
+ int src_left, int pixel_count, int blend_type, int Bpp, FX_LPCBYTE clip_scan)
+{
+ if (blend_type == FXDIB_BLEND_NORMAL && clip_scan == NULL && mask_alpha == 255) {
+ for (int col = 0; col < pixel_count; col ++) {
+ if (src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8))) {
+ dest_scan[2] = src_b;
+ dest_scan[1] = src_g;
+ dest_scan[0] = src_r;
+ }
+ dest_scan += Bpp;
+ }
+ return;
+ }
+ for (int col = 0; col < pixel_count; col ++) {
+ if (!(src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8)))) {
+ dest_scan += Bpp;
+ continue;
+ }
+ int src_alpha;
+ if (clip_scan) {
+ src_alpha = mask_alpha * clip_scan[col] / 255;
+ } else {
+ src_alpha = mask_alpha;
+ }
+ if (src_alpha == 0) {
+ dest_scan += Bpp;
+ continue;
+ }
+ if (blend_type >= FXDIB_BLEND_NONSEPARABLE) {
+ int blended_colors[3];
+ FX_BYTE src_scan[3];
+ FX_BYTE dest_scan_o[3];
+ src_scan[0] = src_b;
+ src_scan[1] = src_g;
+ src_scan[2] = src_r;
+ dest_scan_o[0] = dest_scan[2];
+ dest_scan_o[1] = dest_scan[1];
+ dest_scan_o[2] = dest_scan[0];
+ _RGB_Blend(blend_type, src_scan, dest_scan_o, blended_colors);
+ dest_scan[2] = FXDIB_ALPHA_MERGE(dest_scan[2], blended_colors[0], src_alpha);
+ dest_scan[1] = FXDIB_ALPHA_MERGE(dest_scan[1], blended_colors[1], src_alpha);
+ dest_scan[0] = FXDIB_ALPHA_MERGE(dest_scan[0], blended_colors[2], src_alpha);
+ } else if (blend_type) {
+ int back_color = FX_GAMMA(dest_scan[2]);
+ int blended = _BLEND(blend_type, back_color, src_b);
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(back_color, blended, src_alpha));
+ back_color = FX_GAMMA(dest_scan[1]);
+ blended = _BLEND(blend_type, back_color, src_g);
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(back_color, blended, src_alpha));
+ back_color = FX_GAMMA(dest_scan[0]);
+ blended = _BLEND(blend_type, back_color, src_r);
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(back_color, blended, src_alpha));
+ } else {
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), src_b, src_alpha));
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), src_g, src_alpha));
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), src_r, src_alpha));
+ }
+ dest_scan += Bpp;
+ }
+}
+inline FX_BOOL _ScanlineCompositor_InitSourceMask(FXDIB_Format dest_format, int alpha_flag, FX_DWORD mask_color, int& mask_alpha,
+ int& mask_red, int& mask_green, int& mask_blue, int& mask_black,
+ void* icc_module, void* pIccTransform)
+{
+ ICodec_IccModule* pIccModule = (ICodec_IccModule*)icc_module;
+ if (alpha_flag >> 8) {
+ mask_alpha = alpha_flag & 0xff;
+ mask_red = FXSYS_GetCValue(mask_color);
+ mask_green = FXSYS_GetMValue(mask_color);
+ mask_blue = FXSYS_GetYValue(mask_color);
+ mask_black = FXSYS_GetKValue(mask_color);
+ } else {
+ mask_alpha = FXARGB_A(mask_color);
+ mask_red = FXARGB_R(mask_color);
+ mask_green = FXARGB_G(mask_color);
+ mask_blue = FXARGB_B(mask_color);
+ }
+ if (dest_format == FXDIB_8bppMask) {
+ return TRUE;
+ }
+ if ((dest_format & 0xff) == 8) {
+ if (pIccTransform) {
+ mask_color = (alpha_flag >> 8) ? FXCMYK_TODIB(mask_color) : FXARGB_TODIB(mask_color);
+ FX_LPBYTE gray_p = (FX_LPBYTE)&mask_color;
+ pIccModule->TranslateScanline(pIccTransform, gray_p, gray_p, 1);
+ mask_red = dest_format & 0x0400 ? FX_CCOLOR(gray_p[0]) : gray_p[0];
+ } else {
+ if (alpha_flag >> 8) {
+ FX_BYTE r, g, b;
+ AdobeCMYK_to_sRGB1(mask_red, mask_green, mask_blue, mask_black,
+ r, g, b);
+ mask_red = FXRGB2GRAY(r, g, b);
+ } else {
+ mask_red = FXRGB2GRAY(mask_red, mask_green, mask_blue);
+ }
+ if (dest_format & 0x0400) {
+ mask_red = FX_CCOLOR(mask_red);
+ }
+ }
+ } else {
+ FX_LPBYTE mask_color_p = (FX_LPBYTE)&mask_color;
+ mask_color = (alpha_flag >> 8) ? FXCMYK_TODIB(mask_color) : FXARGB_TODIB(mask_color);
+ if (pIccTransform) {
+ pIccModule->TranslateScanline(pIccTransform, mask_color_p, mask_color_p, 1);
+ mask_red = mask_color_p[2];
+ mask_green = mask_color_p[1];
+ mask_blue = mask_color_p[0];
+ } else if (alpha_flag >> 8) {
+ AdobeCMYK_to_sRGB1(mask_color_p[0], mask_color_p[1], mask_color_p[2], mask_color_p[3],
+ mask_color_p[2], mask_color_p[1], mask_color_p[0]);
+ mask_red = mask_color_p[2];
+ mask_green = mask_color_p[1];
+ mask_blue = mask_color_p[0];
+ }
+ }
+ return TRUE;
+}
+inline void _ScanlineCompositor_InitSourcePalette(FXDIB_Format src_format, FXDIB_Format dest_format,
+ FX_DWORD*& pDestPalette, FX_DWORD* pSrcPalette,
+ void* icc_module, void* pIccTransform)
+{
+ ICodec_IccModule* pIccModule = (ICodec_IccModule*)icc_module;
+ FX_BOOL isSrcCmyk = src_format & 0x0400 ? TRUE : FALSE;
+ FX_BOOL isDstCmyk = dest_format & 0x0400 ? TRUE : FALSE;
+ pDestPalette = NULL;
+ if (pIccTransform) {
+ if (pSrcPalette) {
+ if ((dest_format & 0xff) == 8) {
+ int pal_count = 1 << (src_format & 0xff);
+ FX_LPBYTE gray_pal = FX_Alloc(FX_BYTE, pal_count);
+ if (!gray_pal) {
+ return;
+ }
+ pDestPalette = (FX_DWORD*)gray_pal;
+ for (int i = 0; i < pal_count; i ++) {
+ FX_DWORD color = isSrcCmyk ? FXCMYK_TODIB(pSrcPalette[i]) : FXARGB_TODIB(pSrcPalette[i]);
+ pIccModule->TranslateScanline(pIccTransform, gray_pal, (FX_LPCBYTE)&color, 1);
+ gray_pal ++;
+ }
+ } else {
+ int palsize = 1 << (src_format & 0xff);
+ pDestPalette = FX_Alloc(FX_DWORD, palsize);
+ if (!pDestPalette) {
+ return;
+ }
+ for (int i = 0; i < palsize; i ++) {
+ FX_DWORD color = isSrcCmyk ? FXCMYK_TODIB(pSrcPalette[i]) : FXARGB_TODIB(pSrcPalette[i]);
+ pIccModule->TranslateScanline(pIccTransform, (FX_LPBYTE)&color, (FX_LPCBYTE)&color, 1);
+ pDestPalette[i] = isDstCmyk ? FXCMYK_TODIB(color) : FXARGB_TODIB(color);
+ }
+ }
+ } else {
+ int pal_count = 1 << (src_format & 0xff);
+ FX_LPBYTE gray_pal = FX_Alloc(FX_BYTE, pal_count);
+ if (!gray_pal) {
+ return;
+ }
+ if (pal_count == 2) {
+ gray_pal[0] = 0;
+ gray_pal[1] = 255;
+ } else {
+ for (int i = 0; i < pal_count; i++) {
+ gray_pal[i] = i;
+ }
+ }
+ if ((dest_format & 0xff) == 8) {
+ pIccModule->TranslateScanline(pIccTransform, gray_pal, gray_pal, pal_count);
+ pDestPalette = (FX_DWORD*)gray_pal;
+ } else {
+ pDestPalette = FX_Alloc(FX_DWORD, pal_count);
+ if (!pDestPalette) {
+ FX_Free(gray_pal);
+ return;
+ }
+ for (int i = 0; i < pal_count; i ++) {
+ pIccModule->TranslateScanline(pIccTransform, (FX_LPBYTE)&pDestPalette[i], &gray_pal[i], 1);
+ pDestPalette[i] = isDstCmyk ? FXCMYK_TODIB(pDestPalette[i]) : FXARGB_TODIB(pDestPalette[i]);
+ }
+ FX_Free(gray_pal);
+ }
+ }
+ } else {
+ if (pSrcPalette) {
+ if ((dest_format & 0xff) == 8) {
+ int pal_count = 1 << (src_format & 0xff);
+ FX_LPBYTE gray_pal = FX_Alloc(FX_BYTE, pal_count);
+ if (!gray_pal) {
+ return;
+ }
+ pDestPalette = (FX_DWORD*)gray_pal;
+ if (isSrcCmyk) {
+ for (int i = 0; i < pal_count; i ++) {
+ FX_CMYK cmyk = pSrcPalette[i];
+ FX_BYTE r, g, b;
+ AdobeCMYK_to_sRGB1(FXSYS_GetCValue(cmyk), FXSYS_GetMValue(cmyk), FXSYS_GetYValue(cmyk), FXSYS_GetKValue(cmyk),
+ r, g, b);
+ *gray_pal ++ = FXRGB2GRAY(r, g, b);
+ }
+ } else
+ for (int i = 0; i < pal_count; i ++) {
+ FX_ARGB argb = pSrcPalette[i];
+ *gray_pal ++ = FXRGB2GRAY(FXARGB_R(argb), FXARGB_G(argb), FXARGB_B(argb));
+ }
+ } else {
+ int palsize = 1 << (src_format & 0xff);
+ pDestPalette = FX_Alloc(FX_DWORD, palsize);
+ if (!pDestPalette) {
+ return;
+ }
+ if (isDstCmyk == isSrcCmyk) {
+ FXSYS_memcpy32(pDestPalette, pSrcPalette, palsize * sizeof(FX_DWORD));
+ } else {
+ for (int i = 0; i < palsize; i ++) {
+ FX_CMYK cmyk = pSrcPalette[i];
+ FX_BYTE r, g, b;
+ AdobeCMYK_to_sRGB1(FXSYS_GetCValue(cmyk), FXSYS_GetMValue(cmyk), FXSYS_GetYValue(cmyk), FXSYS_GetKValue(cmyk),
+ r, g, b);
+ pDestPalette[i] = FXARGB_MAKE(0xff, r, g, b);
+ }
+ }
+ }
+ } else {
+ if ((dest_format & 0xff) == 8) {
+ int pal_count = 1 << (src_format & 0xff);
+ FX_LPBYTE gray_pal = FX_Alloc(FX_BYTE, pal_count);
+ if (!gray_pal) {
+ return;
+ }
+ if (pal_count == 2) {
+ gray_pal[0] = 0;
+ gray_pal[1] = 255;
+ } else {
+ for (int i = 0; i < pal_count; i++) {
+ gray_pal[i] = i;
+ }
+ }
+ pDestPalette = (FX_DWORD*)gray_pal;
+ } else {
+ int palsize = 1 << (src_format & 0xff);
+ pDestPalette = FX_Alloc(FX_DWORD, palsize);
+ if (!pDestPalette) {
+ return;
+ }
+ if (palsize == 2) {
+ pDestPalette[0] = isSrcCmyk ? 255 : 0xff000000;
+ pDestPalette[1] = isSrcCmyk ? 0 : 0xffffffff;
+ } else {
+ for (int i = 0; i < palsize; i++) {
+ pDestPalette[i] = isSrcCmyk ? FX_CCOLOR(i) : (i * 0x10101);
+ }
+ }
+ if (isSrcCmyk != isDstCmyk) {
+ for (int i = 0; i < palsize; i ++) {
+ FX_CMYK cmyk = pDestPalette[i];
+ FX_BYTE r, g, b;
+ AdobeCMYK_to_sRGB1(FXSYS_GetCValue(cmyk), FXSYS_GetMValue(cmyk), FXSYS_GetYValue(cmyk), FXSYS_GetKValue(cmyk),
+ r, g, b);
+ pDestPalette[i] = FXARGB_MAKE(0xff, r, g, b);
+ }
+ }
+ }
+ }
+ }
+}
+CFX_ScanlineCompositor::CFX_ScanlineCompositor()
+{
+ m_pSrcPalette = NULL;
+ m_pCacheScanline = NULL;
+ m_CacheSize = 0;
+ m_bRgbByteOrder = FALSE;
+ m_BlendType = FXDIB_BLEND_NORMAL;
+}
+CFX_ScanlineCompositor::~CFX_ScanlineCompositor()
+{
+ if (m_pSrcPalette) {
+ FX_Free(m_pSrcPalette);
+ }
+ if (m_pCacheScanline) {
+ FX_Free(m_pCacheScanline);
+ }
+}
+FX_BOOL CFX_ScanlineCompositor::Init(FXDIB_Format dest_format, FXDIB_Format src_format, FX_INT32 width, FX_DWORD* pSrcPalette,
+ FX_DWORD mask_color, int blend_type, FX_BOOL bClip, FX_BOOL bRgbByteOrder, int alpha_flag, void* pIccTransform)
+{
+ m_SrcFormat = src_format;
+ m_DestFormat = dest_format;
+ m_BlendType = blend_type;
+ m_bRgbByteOrder = bRgbByteOrder;
+ ICodec_IccModule* pIccModule = NULL;
+ if (CFX_GEModule::Get()->GetCodecModule()) {
+ pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ }
+ if (pIccModule == NULL) {
+ pIccTransform = NULL;
+ }
+ m_pIccTransform = pIccTransform;
+ if ((dest_format & 0xff) == 1) {
+ return FALSE;
+ }
+ if (m_SrcFormat == FXDIB_1bppMask || m_SrcFormat == FXDIB_8bppMask) {
+ return _ScanlineCompositor_InitSourceMask(dest_format, alpha_flag, mask_color,
+ m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue, m_MaskBlack,
+ pIccModule, pIccTransform);
+ }
+ if (pIccTransform == NULL && (~src_format & 0x0400) && (dest_format & 0x0400)) {
+ return FALSE;
+ }
+ if ((m_SrcFormat & 0xff) <= 8) {
+ if (dest_format == FXDIB_8bppMask) {
+ return TRUE;
+ }
+ _ScanlineCompositor_InitSourcePalette(src_format, dest_format, m_pSrcPalette, pSrcPalette,
+ pIccModule, pIccTransform);
+ m_Transparency = (dest_format == FXDIB_Argb ? 1 : 0)
+ + (dest_format & 0x0200 ? 2 : 0)
+ + (dest_format & 0x0400 ? 4 : 0)
+ + ((src_format & 0xff) == 1 ? 8 : 0);
+ return TRUE;
+ }
+ m_Transparency = (src_format & 0x0200 ? 0 : 1)
+ + (dest_format & 0x0200 ? 0 : 2)
+ + (blend_type == FXDIB_BLEND_NORMAL ? 4 : 0)
+ + (bClip ? 8 : 0)
+ + (src_format & 0x0400 ? 16 : 0)
+ + (dest_format & 0x0400 ? 32 : 0)
+ + (pIccTransform ? 64 : 0);
+ return TRUE;
+}
+void CFX_ScanlineCompositor::CompositeRgbBitmapLine(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, FX_LPCBYTE clip_scan,
+ FX_LPCBYTE src_extra_alpha, FX_LPBYTE dst_extra_alpha)
+{
+ int src_Bpp = (m_SrcFormat & 0xff) >> 3;
+ int dest_Bpp = (m_DestFormat & 0xff) >> 3;
+ int dest_Size = width * dest_Bpp + 4;
+ if (m_bRgbByteOrder) {
+ switch (m_Transparency) {
+ case 0:
+ case 4:
+ case 8:
+ case 12:
+ _CompositeRow_Argb2Argb_RgbByteOrder(dest_scan, src_scan, width, m_BlendType, clip_scan);
+ break;
+ case 1:
+ _CompositeRow_Rgb2Argb_Blend_NoClip_RgbByteOrder(dest_scan, src_scan, width, m_BlendType, src_Bpp);
+ break;
+ case 2:
+ case 10:
+ _CompositeRow_Argb2Rgb_Blend_RgbByteOrder(dest_scan, src_scan, width, m_BlendType, dest_Bpp, clip_scan);
+ break;
+ case 3:
+ _CompositeRow_Rgb2Rgb_Blend_NoClip_RgbByteOrder(dest_scan, src_scan, width, m_BlendType, dest_Bpp, src_Bpp);
+ break;
+ case 5:
+ _CompositeRow_Rgb2Argb_NoBlend_NoClip_RgbByteOrder(dest_scan, src_scan, width, src_Bpp);
+ break;
+ case 6:
+ case 14:
+ _CompositeRow_Argb2Rgb_NoBlend_RgbByteOrder(dest_scan, src_scan, width, dest_Bpp, clip_scan);
+ break;
+ case 7:
+ _CompositeRow_Rgb2Rgb_NoBlend_NoClip_RgbByteOrder(dest_scan, src_scan, width, dest_Bpp, src_Bpp);
+ break;
+ case 9:
+ _CompositeRow_Rgb2Argb_Blend_Clip_RgbByteOrder(dest_scan, src_scan, width, m_BlendType, src_Bpp, clip_scan);
+ break;
+ case 11:
+ _CompositeRow_Rgb2Rgb_Blend_Clip_RgbByteOrder(dest_scan, src_scan, width, m_BlendType, dest_Bpp, src_Bpp, clip_scan);
+ break;
+ case 13:
+ _CompositeRow_Rgb2Argb_NoBlend_Clip_RgbByteOrder(dest_scan, src_scan, width, src_Bpp, clip_scan);
+ break;
+ case 15:
+ _CompositeRow_Rgb2Rgb_NoBlend_Clip_RgbByteOrder(dest_scan, src_scan, width, dest_Bpp, src_Bpp, clip_scan);
+ break;
+ }
+ return;
+ }
+ if (m_DestFormat == FXDIB_8bppMask) {
+ if (m_SrcFormat & 0x0200) {
+ if (m_SrcFormat == FXDIB_Argb) {
+ _CompositeRow_Argb2Mask(dest_scan, src_scan, width, clip_scan);
+ } else {
+ _CompositeRow_Rgba2Mask(dest_scan, src_extra_alpha, width, clip_scan);
+ }
+ } else {
+ _CompositeRow_Rgb2Mask(dest_scan, src_scan, width, clip_scan);
+ }
+ } else if ((m_DestFormat & 0xff) == 8) {
+ if (m_DestFormat & 0x0400) {
+ for (int i = 0; i < width; i ++) {
+ *dest_scan = ~*dest_scan;
+ dest_scan++;
+ }
+ }
+ if (m_SrcFormat & 0x0200) {
+ if (m_DestFormat & 0x0200) {
+ _CompositeRow_Argb2Graya(dest_scan, src_scan, width, m_BlendType, clip_scan, src_extra_alpha, dst_extra_alpha, m_pIccTransform);
+ } else {
+ _CompositeRow_Argb2Gray(dest_scan, src_scan, width, m_BlendType, clip_scan, src_extra_alpha, m_pIccTransform);
+ }
+ } else {
+ if (m_DestFormat & 0x0200) {
+ _CompositeRow_Rgb2Graya(dest_scan, src_scan, src_Bpp, width, m_BlendType, clip_scan, dst_extra_alpha, m_pIccTransform);
+ } else {
+ _CompositeRow_Rgb2Gray(dest_scan, src_scan, src_Bpp, width, m_BlendType, clip_scan, m_pIccTransform);
+ }
+ }
+ if (m_DestFormat & 0x0400) {
+ for (int i = 0; i < width; i ++) {
+ *dest_scan = ~*dest_scan;
+ dest_scan++;
+ }
+ }
+ } else {
+ if (dest_Size > m_CacheSize) {
+ m_pCacheScanline = FX_Realloc(FX_BYTE, m_pCacheScanline, dest_Size);
+ if (!m_pCacheScanline) {
+ return;
+ }
+ m_CacheSize = dest_Size;
+ }
+ switch (m_Transparency) {
+ case 0:
+ case 4:
+ case 8:
+ case 4+8: {
+ _CompositeRow_Argb2Argb(dest_scan, src_scan, width, m_BlendType, clip_scan,
+ dst_extra_alpha, src_extra_alpha);
+ }
+ break;
+ case 64:
+ case 4+64:
+ case 8+64:
+ case 4+8+64: {
+ _CompositeRow_Argb2Argb_Transform(dest_scan, src_scan, width, m_BlendType, clip_scan,
+ dst_extra_alpha, src_extra_alpha, m_pCacheScanline, m_pIccTransform);
+ }
+ break;
+ case 1:
+ _CompositeRow_Rgb2Argb_Blend_NoClip(dest_scan, src_scan, width, m_BlendType, src_Bpp,
+ dst_extra_alpha);
+ break;
+ case 1+64:
+ _CompositeRow_Rgb2Argb_Blend_NoClip_Transform(dest_scan, src_scan, width, m_BlendType, src_Bpp,
+ dst_extra_alpha, m_pCacheScanline, m_pIccTransform);
+ break;
+ case 1+8:
+ _CompositeRow_Rgb2Argb_Blend_Clip(dest_scan, src_scan, width, m_BlendType, src_Bpp, clip_scan,
+ dst_extra_alpha);
+ break;
+ case 1+8+64:
+ _CompositeRow_Rgb2Argb_Blend_Clip_Transform(dest_scan, src_scan, width, m_BlendType, src_Bpp, clip_scan,
+ dst_extra_alpha, m_pCacheScanline, m_pIccTransform);
+ break;
+ case 1+4:
+ _CompositeRow_Rgb2Argb_NoBlend_NoClip(dest_scan, src_scan, width, src_Bpp,
+ dst_extra_alpha);
+ break;
+ case 1+4+64:
+ _CompositeRow_Rgb2Argb_NoBlend_NoClip_Transform(dest_scan, src_scan, width, src_Bpp,
+ dst_extra_alpha, m_pCacheScanline, m_pIccTransform);
+ break;
+ case 1+4+8:
+ _CompositeRow_Rgb2Argb_NoBlend_Clip(dest_scan, src_scan, width, src_Bpp, clip_scan,
+ dst_extra_alpha);
+ break;
+ case 1+4+8+64:
+ _CompositeRow_Rgb2Argb_NoBlend_Clip_Transform(dest_scan, src_scan, width, src_Bpp, clip_scan,
+ dst_extra_alpha, m_pCacheScanline, m_pIccTransform);
+ break;
+ case 2:
+ case 2+8:
+ _CompositeRow_Argb2Rgb_Blend(dest_scan, src_scan, width, m_BlendType, dest_Bpp, clip_scan,
+ src_extra_alpha);
+ break;
+ case 2+64:
+ case 2+8+64:
+ _CompositeRow_Argb2Rgb_Blend_Transform(dest_scan, src_scan, width, m_BlendType, dest_Bpp, clip_scan,
+ src_extra_alpha, m_pCacheScanline, m_pIccTransform);
+ break;
+ case 2+4:
+ case 2+4+8:
+ _CompositeRow_Argb2Rgb_NoBlend(dest_scan, src_scan, width, dest_Bpp, clip_scan,
+ src_extra_alpha);
+ break;
+ case 2+4+64:
+ case 2+4+8+64:
+ _CompositeRow_Argb2Rgb_NoBlend_Transform(dest_scan, src_scan, width, dest_Bpp, clip_scan,
+ src_extra_alpha, m_pCacheScanline, m_pIccTransform);
+ break;
+ case 1+2:
+ _CompositeRow_Rgb2Rgb_Blend_NoClip(dest_scan, src_scan, width, m_BlendType, dest_Bpp, src_Bpp);
+ break;
+ case 1+2+64:
+ _CompositeRow_Rgb2Rgb_Blend_NoClip_Transform(dest_scan, src_scan, width, m_BlendType, dest_Bpp, src_Bpp,
+ m_pCacheScanline, m_pIccTransform);
+ break;
+ case 1+2+8:
+ _CompositeRow_Rgb2Rgb_Blend_Clip(dest_scan, src_scan, width, m_BlendType, dest_Bpp, src_Bpp, clip_scan);
+ break;
+ case 1+2+8+64:
+ _CompositeRow_Rgb2Rgb_Blend_Clip_Transform(dest_scan, src_scan, width, m_BlendType, dest_Bpp, src_Bpp, clip_scan,
+ m_pCacheScanline, m_pIccTransform);
+ break;
+ case 1+2+4:
+ _CompositeRow_Rgb2Rgb_NoBlend_NoClip(dest_scan, src_scan, width, dest_Bpp, src_Bpp);
+ break;
+ case 1+2+4+64:
+ _CompositeRow_Rgb2Rgb_NoBlend_NoClip_Transform(dest_scan, src_scan, width, dest_Bpp, src_Bpp,
+ m_pCacheScanline, m_pIccTransform);
+ break;
+ case 1+2+4+8:
+ _CompositeRow_Rgb2Rgb_NoBlend_Clip(dest_scan, src_scan, width, dest_Bpp, src_Bpp, clip_scan);
+ break;
+ case 1+2+4+8+64:
+ _CompositeRow_Rgb2Rgb_NoBlend_Clip_Transform(dest_scan, src_scan, width, dest_Bpp, src_Bpp, clip_scan,
+ m_pCacheScanline, m_pIccTransform);
+ break;
+ }
+ }
+}
+void CFX_ScanlineCompositor::CompositePalBitmapLine(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left, int width, FX_LPCBYTE clip_scan,
+ FX_LPCBYTE src_extra_alpha, FX_LPBYTE dst_extra_alpha)
+{
+ if (m_bRgbByteOrder) {
+ if (m_SrcFormat == FXDIB_1bppRgb) {
+ if (m_DestFormat == FXDIB_8bppRgb) {
+ return;
+ } else if(m_DestFormat == FXDIB_Argb) {
+ _CompositeRow_1bppRgb2Argb_NoBlend_RgbByteOrder(dest_scan, src_scan, src_left, width, m_pSrcPalette, clip_scan);
+ } else {
+ _CompositeRow_1bppRgb2Rgb_NoBlend_RgbByteOrder(dest_scan, src_scan, src_left, m_pSrcPalette, width, (m_DestFormat & 0xff) >> 3, clip_scan);
+ }
+ } else {
+ if (m_DestFormat == FXDIB_8bppRgb) {
+ return;
+ } else if (m_DestFormat == FXDIB_Argb) {
+ _CompositeRow_8bppRgb2Argb_NoBlend_RgbByteOrder(dest_scan, src_scan, width, m_pSrcPalette, clip_scan);
+ } else {
+ _CompositeRow_8bppRgb2Rgb_NoBlend_RgbByteOrder(dest_scan, src_scan, m_pSrcPalette, width, (m_DestFormat & 0xff) >> 3, clip_scan);
+ }
+ }
+ return;
+ }
+ if (m_DestFormat == FXDIB_8bppMask) {
+ _CompositeRow_Rgb2Mask(dest_scan, src_scan, width, clip_scan);
+ return;
+ } else if ((m_DestFormat & 0xff) == 8) {
+ if (m_Transparency & 8) {
+ if (m_DestFormat & 0x0200) {
+ _CompositeRow_1bppPal2Graya(dest_scan, src_scan, src_left, (FX_LPCBYTE)m_pSrcPalette, width, m_BlendType, clip_scan, dst_extra_alpha);
+ } else {
+ _CompositeRow_1bppPal2Gray(dest_scan, src_scan, src_left, (FX_LPCBYTE)m_pSrcPalette, width, m_BlendType, clip_scan);
+ }
+ } else {
+ if (m_DestFormat & 0x0200)
+ _CompositeRow_8bppPal2Graya(dest_scan, src_scan, (FX_LPCBYTE)m_pSrcPalette, width, m_BlendType, clip_scan,
+ dst_extra_alpha, src_extra_alpha);
+ else
+ _CompositeRow_8bppPal2Gray(dest_scan, src_scan, (FX_LPCBYTE)m_pSrcPalette, width, m_BlendType, clip_scan,
+ src_extra_alpha);
+ }
+ } else {
+ switch (m_Transparency) {
+ case 1+2:
+ _CompositeRow_8bppRgb2Argb_NoBlend(dest_scan, src_scan, width, m_pSrcPalette, clip_scan,
+ src_extra_alpha);
+ break;
+ case 1+2+8:
+ _CompositeRow_1bppRgb2Argb_NoBlend(dest_scan, src_scan, src_left, width, m_pSrcPalette, clip_scan);
+ break;
+ case 0:
+ _CompositeRow_8bppRgb2Rgb_NoBlend(dest_scan, src_scan, m_pSrcPalette, width, (m_DestFormat & 0xff) >> 3, clip_scan,
+ src_extra_alpha);
+ break;
+ case 0+8:
+ _CompositeRow_1bppRgb2Rgb_NoBlend(dest_scan, src_scan, src_left, m_pSrcPalette, width, (m_DestFormat & 0xff) >> 3, clip_scan);
+ break;
+ case 0+2:
+ _CompositeRow_8bppRgb2Rgb_NoBlend(dest_scan, src_scan, m_pSrcPalette, width, (m_DestFormat & 0xff) >> 3, clip_scan,
+ src_extra_alpha);
+ break;
+ case 0+2+8:
+ _CompositeRow_1bppRgb2Rgba_NoBlend(dest_scan, src_scan, src_left, width, m_pSrcPalette, clip_scan,
+ dst_extra_alpha);
+ break;
+ break;
+ }
+ }
+}
+void CFX_ScanlineCompositor::CompositeByteMaskLine(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int width, FX_LPCBYTE clip_scan,
+ FX_LPBYTE dst_extra_alpha)
+{
+ if (m_DestFormat == FXDIB_8bppMask) {
+ _CompositeRow_ByteMask2Mask(dest_scan, src_scan, m_MaskAlpha, width, clip_scan);
+ } else if ((m_DestFormat & 0xff) == 8) {
+ if (m_DestFormat & 0x0200) {
+ _CompositeRow_ByteMask2Graya(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, width, clip_scan, dst_extra_alpha);
+ } else {
+ _CompositeRow_ByteMask2Gray(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, width, clip_scan);
+ }
+ } else if (m_bRgbByteOrder) {
+ if (m_DestFormat == FXDIB_Argb)
+ _CompositeRow_ByteMask2Argb_RgbByteOrder(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue,
+ width, m_BlendType, clip_scan);
+ else
+ _CompositeRow_ByteMask2Rgb_RgbByteOrder(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue,
+ width, m_BlendType, (m_DestFormat & 0xff) >> 3, clip_scan);
+ return;
+ } else if (m_DestFormat == FXDIB_Argb)
+ _CompositeRow_ByteMask2Argb(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue,
+ width, m_BlendType, clip_scan);
+ else if (m_DestFormat == FXDIB_Rgb || m_DestFormat == FXDIB_Rgb32)
+ _CompositeRow_ByteMask2Rgb(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue,
+ width, m_BlendType, (m_DestFormat & 0xff) >> 3, clip_scan);
+ else if (m_DestFormat == FXDIB_Rgba)
+ _CompositeRow_ByteMask2Rgba(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue,
+ width, m_BlendType, clip_scan, dst_extra_alpha);
+}
+void CFX_ScanlineCompositor::CompositeBitMaskLine(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int src_left, int width, FX_LPCBYTE clip_scan,
+ FX_LPBYTE dst_extra_alpha)
+{
+ if (m_DestFormat == FXDIB_8bppMask) {
+ _CompositeRow_BitMask2Mask(dest_scan, src_scan, m_MaskAlpha, src_left, width, clip_scan);
+ } else if ((m_DestFormat & 0xff) == 8) {
+ if (m_DestFormat & 0x0200)
+ _CompositeRow_BitMask2Graya(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, src_left, width, clip_scan,
+ dst_extra_alpha);
+ else {
+ _CompositeRow_BitMask2Gray(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, src_left, width, clip_scan);
+ }
+ } else if (m_bRgbByteOrder) {
+ if (m_DestFormat == FXDIB_Argb)
+ _CompositeRow_BitMask2Argb_RgbByteOrder(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue,
+ src_left, width, m_BlendType, clip_scan);
+ else
+ _CompositeRow_BitMask2Rgb_RgbByteOrder(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue,
+ src_left, width, m_BlendType, (m_DestFormat & 0xff) >> 3, clip_scan);
+ return;
+ } else if (m_DestFormat == FXDIB_Argb)
+ _CompositeRow_BitMask2Argb(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue,
+ src_left, width, m_BlendType, clip_scan);
+ else if (m_DestFormat == FXDIB_Rgb || m_DestFormat == FXDIB_Rgb32)
+ _CompositeRow_BitMask2Rgb(dest_scan, src_scan, m_MaskAlpha, m_MaskRed, m_MaskGreen, m_MaskBlue,
+ src_left, width, m_BlendType, (m_DestFormat & 0xff) >> 3, clip_scan);
+}
+FX_BOOL CFX_DIBitmap::CompositeBitmap(int dest_left, int dest_top, int width, int height,
+ const CFX_DIBSource* pSrcBitmap, int src_left, int src_top,
+ int blend_type, const CFX_ClipRgn* pClipRgn, FX_BOOL bRgbByteOrder, void* pIccTransform)
+{
+ if (m_pBuffer == NULL) {
+ return FALSE;
+ }
+ ASSERT(!pSrcBitmap->IsAlphaMask());
+ ASSERT(m_bpp >= 8);
+ if (pSrcBitmap->IsAlphaMask() || m_bpp < 8) {
+ return FALSE;
+ }
+ GetOverlapRect(dest_left, dest_top, width, height, pSrcBitmap->GetWidth(), pSrcBitmap->GetHeight(),
+ src_left, src_top, pClipRgn);
+ if (width == 0 || height == 0) {
+ return TRUE;
+ }
+ const CFX_DIBitmap* pClipMask = NULL;
+ FX_RECT clip_box;
+ if (pClipRgn && pClipRgn->GetType() != CFX_ClipRgn::RectI) {
+ ASSERT(pClipRgn->GetType() == CFX_ClipRgn::MaskF);
+ pClipMask = pClipRgn->GetMask();
+ clip_box = pClipRgn->GetBox();
+ }
+ CFX_ScanlineCompositor compositor;
+ if (!compositor.Init(GetFormat(), pSrcBitmap->GetFormat(), width, pSrcBitmap->GetPalette(), 0, blend_type,
+ pClipMask != NULL, bRgbByteOrder, 0, pIccTransform)) {
+ return FALSE;
+ }
+ int dest_Bpp = m_bpp / 8;
+ int src_Bpp = pSrcBitmap->GetBPP() / 8;
+ FX_BOOL bRgb = FALSE;
+ FX_BOOL bCmyk = FALSE;
+ if (src_Bpp > 1) {
+ if (pSrcBitmap->IsCmykImage()) {
+ bCmyk = TRUE;
+ } else {
+ bRgb = TRUE;
+ }
+ }
+ CFX_DIBitmap* pSrcAlphaMask = pSrcBitmap->m_pAlphaMask;
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = m_pBuffer + (dest_top + row) * m_Pitch + dest_left * dest_Bpp;
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * src_Bpp;
+ FX_LPCBYTE src_scan_extra_alpha = pSrcAlphaMask ? pSrcAlphaMask->GetScanline(src_top + row) + src_left : NULL;
+ FX_LPBYTE dst_scan_extra_alpha = m_pAlphaMask ? (FX_LPBYTE)m_pAlphaMask->GetScanline(dest_top + row) + dest_left : NULL;
+ FX_LPCBYTE clip_scan = NULL;
+ if (pClipMask) {
+ clip_scan = pClipMask->m_pBuffer + (dest_top + row - clip_box.top) * pClipMask->m_Pitch + (dest_left - clip_box.left);
+ }
+ if (bRgb) {
+ compositor.CompositeRgbBitmapLine(dest_scan, src_scan, width, clip_scan, src_scan_extra_alpha, dst_scan_extra_alpha);
+ } else {
+ compositor.CompositePalBitmapLine(dest_scan, src_scan, src_left, width, clip_scan, src_scan_extra_alpha, dst_scan_extra_alpha);
+ }
+ }
+ return TRUE;
+}
+FX_BOOL CFX_DIBitmap::CompositeMask(int dest_left, int dest_top, int width, int height,
+ const CFX_DIBSource* pMask, FX_DWORD color, int src_left, int src_top,
+ int blend_type, const CFX_ClipRgn* pClipRgn, FX_BOOL bRgbByteOrder, int alpha_flag, void* pIccTransform)
+{
+ if (m_pBuffer == NULL) {
+ return FALSE;
+ }
+ ASSERT(pMask->IsAlphaMask());
+ ASSERT(m_bpp >= 8);
+ if (!pMask->IsAlphaMask() || m_bpp < 8) {
+ return FALSE;
+ }
+ GetOverlapRect(dest_left, dest_top, width, height, pMask->GetWidth(), pMask->GetHeight(), src_left, src_top, pClipRgn);
+ if (width == 0 || height == 0) {
+ return TRUE;
+ }
+ int src_alpha = (FX_BYTE)(alpha_flag >> 8) ? (alpha_flag & 0xff) : FXARGB_A(color);
+ if (src_alpha == 0) {
+ return TRUE;
+ }
+ const CFX_DIBitmap* pClipMask = NULL;
+ FX_RECT clip_box;
+ if (pClipRgn && pClipRgn->GetType() != CFX_ClipRgn::RectI) {
+ ASSERT(pClipRgn->GetType() == CFX_ClipRgn::MaskF);
+ pClipMask = pClipRgn->GetMask();
+ clip_box = pClipRgn->GetBox();
+ }
+ int src_bpp = pMask->GetBPP();
+ int Bpp = GetBPP() / 8;
+ CFX_ScanlineCompositor compositor;
+ if (!compositor.Init(GetFormat(), pMask->GetFormat(), width, NULL, color, blend_type, pClipMask != NULL, bRgbByteOrder, alpha_flag, pIccTransform)) {
+ return FALSE;
+ }
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = m_pBuffer + (dest_top + row) * m_Pitch + dest_left * Bpp;
+ FX_LPCBYTE src_scan = pMask->GetScanline(src_top + row);
+ FX_LPBYTE dst_scan_extra_alpha = m_pAlphaMask ? (FX_LPBYTE)m_pAlphaMask->GetScanline(dest_top + row) + dest_left : NULL;
+ FX_LPCBYTE clip_scan = NULL;
+ if (pClipMask) {
+ clip_scan = pClipMask->m_pBuffer + (dest_top + row - clip_box.top) * pClipMask->m_Pitch + (dest_left - clip_box.left);
+ }
+ if (src_bpp == 1) {
+ compositor.CompositeBitMaskLine(dest_scan, src_scan, src_left, width, clip_scan, dst_scan_extra_alpha);
+ } else {
+ compositor.CompositeByteMaskLine(dest_scan, src_scan + src_left, width, clip_scan, dst_scan_extra_alpha);
+ }
+ }
+ return TRUE;
+}
+FX_BOOL CFX_DIBitmap::CompositeRect(int left, int top, int width, int height, FX_DWORD color, int alpha_flag, void* pIccTransform)
+{
+ if (m_pBuffer == NULL) {
+ return FALSE;
+ }
+ int src_alpha = (alpha_flag >> 8) ? (alpha_flag & 0xff) : FXARGB_A(color);
+ if (src_alpha == 0) {
+ return TRUE;
+ }
+ FX_RECT rect(left, top, left + width, top + height);
+ rect.Intersect(0, 0, m_Width, m_Height);
+ if (rect.IsEmpty()) {
+ return TRUE;
+ }
+ width = rect.Width();
+ FX_DWORD dst_color;
+ if (alpha_flag >> 8) {
+ dst_color = FXCMYK_TODIB(color);
+ } else {
+ dst_color = FXARGB_TODIB(color);
+ }
+ FX_LPBYTE color_p = (FX_LPBYTE)&dst_color;
+ if (m_bpp == 8) {
+ FX_BYTE gray = 255;
+ if (!IsAlphaMask()) {
+ if (pIccTransform && CFX_GEModule::Get()->GetCodecModule() && CFX_GEModule::Get()->GetCodecModule()->GetIccModule()) {
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ pIccModule->TranslateScanline(pIccTransform, &gray, color_p, 1);
+ } else {
+ if (alpha_flag >> 8) {
+ FX_BYTE r, g, b;
+ AdobeCMYK_to_sRGB1(color_p[0], color_p[1], color_p[2], color_p[3],
+ r, g, b);
+ gray = FXRGB2GRAY(r, g, b);
+ } else {
+ gray = (FX_BYTE)FXRGB2GRAY((int)color_p[2], color_p[1], color_p[0]);
+ }
+ }
+ if (IsCmykImage()) {
+ gray = ~gray;
+ }
+ }
+ for (int row = rect.top; row < rect.bottom; row ++) {
+ FX_LPBYTE dest_scan = m_pBuffer + row * m_Pitch + rect.left;
+ if (src_alpha == 255) {
+ FXSYS_memset8(dest_scan, gray, width);
+ } else
+ for (int col = 0; col < width; col ++) {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, gray, src_alpha);
+ dest_scan ++;
+ }
+ }
+ return TRUE;
+ } else if (m_bpp == 1) {
+ ASSERT(!IsCmykImage() && (FX_BYTE)(alpha_flag >> 8) == 0);
+ int left_shift = rect.left % 8;
+ int right_shift = rect.right % 8;
+ int width = rect.right / 8 - rect.left / 8;
+ int index = 0;
+ if (m_pPalette == NULL) {
+ index = ((FX_BYTE)color == 0xff) ? 1 : 0;
+ } else {
+ for (int i = 0; i < 2; i ++)
+ if (m_pPalette[i] == color) {
+ index = i;
+ }
+ }
+ for (int row = rect.top; row < rect.bottom; row ++) {
+ FX_BYTE* dest_scan_top = (FX_BYTE*)GetScanline(row) + rect.left / 8;
+ FX_BYTE* dest_scan_top_r = (FX_BYTE*)GetScanline(row) + rect.right / 8;
+ FX_BYTE left_flag = *dest_scan_top & (255 << (8 - left_shift));
+ FX_BYTE right_flag = *dest_scan_top_r & (255 >> right_shift);
+ if (width) {
+ FXSYS_memset8(dest_scan_top + 1, index ? 255 : 0, width - 1);
+ if (!index) {
+ *dest_scan_top &= left_flag;
+ *dest_scan_top_r &= right_flag;
+ } else {
+ *dest_scan_top |= ~left_flag;
+ *dest_scan_top_r |= ~right_flag;
+ }
+ } else {
+ if (!index) {
+ *dest_scan_top &= left_flag | right_flag;
+ } else {
+ *dest_scan_top |= ~(left_flag | right_flag);
+ }
+ }
+ }
+ return TRUE;
+ }
+ ASSERT(m_bpp >= 24);
+ if (m_bpp < 24) {
+ return FALSE;
+ }
+ if (pIccTransform && CFX_GEModule::Get()->GetCodecModule()) {
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ pIccModule->TranslateScanline(pIccTransform, color_p, color_p, 1);
+ } else {
+ if (alpha_flag >> 8 && !IsCmykImage())
+ AdobeCMYK_to_sRGB1(FXSYS_GetCValue(color), FXSYS_GetMValue(color), FXSYS_GetYValue(color), FXSYS_GetKValue(color),
+ color_p[2], color_p[1], color_p[0]);
+ else if (!(alpha_flag >> 8) && IsCmykImage()) {
+ return FALSE;
+ }
+ }
+ if(!IsCmykImage()) {
+ color_p[3] = (FX_BYTE)src_alpha;
+ }
+ int Bpp = m_bpp / 8;
+ FX_BOOL bAlpha = HasAlpha();
+ FX_BOOL bArgb = GetFormat() == FXDIB_Argb ? TRUE : FALSE;
+ if (src_alpha == 255) {
+ for (int row = rect.top; row < rect.bottom; row ++) {
+ FX_LPBYTE dest_scan = m_pBuffer + row * m_Pitch + rect.left * Bpp;
+ FX_LPBYTE dest_scan_alpha = m_pAlphaMask ? (FX_LPBYTE)m_pAlphaMask->GetScanline(row) + rect.left : NULL;
+ if (dest_scan_alpha) {
+ FXSYS_memset8(dest_scan_alpha, 0xff, width);
+ }
+ if (Bpp == 4) {
+ FX_DWORD* scan = (FX_DWORD*)dest_scan;
+ for (int col = 0; col < width; col ++) {
+ *scan ++ = dst_color;
+ }
+ } else {
+ for (int col = 0; col < width; col ++) {
+ *dest_scan ++ = color_p[0];
+ *dest_scan ++ = color_p[1];
+ *dest_scan ++ = color_p[2];
+ }
+ }
+ }
+ return TRUE;
+ }
+ for (int row = rect.top; row < rect.bottom; row ++) {
+ FX_LPBYTE dest_scan = m_pBuffer + row * m_Pitch + rect.left * Bpp;
+ if (bAlpha) {
+ if (bArgb) {
+ for (int col = 0; col < width; col ++) {
+ FX_BYTE back_alpha = dest_scan[3];
+ if (back_alpha == 0) {
+ FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha, color_p[2], color_p[1], color_p[0]));
+ dest_scan += 4;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, color_p[0], alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, color_p[1], alpha_ratio);
+ dest_scan ++;
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, color_p[2], alpha_ratio);
+ dest_scan ++;
+ *dest_scan++ = dest_alpha;
+ }
+ } else {
+ FX_LPBYTE dest_scan_alpha = (FX_LPBYTE)m_pAlphaMask->GetScanline(row) + rect.left;
+ for (int col = 0; col < width; col ++) {
+ FX_BYTE back_alpha = *dest_scan_alpha;
+ if (back_alpha == 0) {
+ *dest_scan_alpha++ = src_alpha;
+ FXSYS_memcpy32(dest_scan, color_p, Bpp);
+ dest_scan += Bpp;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha - back_alpha * src_alpha / 255;
+ *dest_scan_alpha ++ = dest_alpha;
+ int alpha_ratio = src_alpha * 255 / dest_alpha;
+ for(int comps = 0; comps < Bpp; comps ++) {
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, color_p[comps], alpha_ratio);
+ dest_scan ++;
+ }
+ }
+ }
+ } else {
+ for (int col = 0; col < width; col ++) {
+ for(int comps = 0; comps < Bpp; comps ++) {
+ if (comps == 3) {
+ *dest_scan ++ = 255;
+ continue;
+ }
+ *dest_scan = FXDIB_ALPHA_MERGE(*dest_scan, color_p[comps], src_alpha);
+ dest_scan ++;
+ }
+ }
+ }
+ }
+ return TRUE;
+}
+CFX_BitmapComposer::CFX_BitmapComposer()
+{
+ m_pScanlineV = NULL;
+ m_pScanlineAlphaV = NULL;
+ m_pClipScanV = NULL;
+ m_pAddClipScan = NULL;
+ m_bRgbByteOrder = FALSE;
+ m_BlendType = FXDIB_BLEND_NORMAL;
+}
+CFX_BitmapComposer::~CFX_BitmapComposer()
+{
+ if (m_pScanlineV) {
+ FX_Free(m_pScanlineV);
+ }
+ if (m_pScanlineAlphaV) {
+ FX_Free(m_pScanlineAlphaV);
+ }
+ if (m_pClipScanV) {
+ FX_Free(m_pClipScanV);
+ }
+ if (m_pAddClipScan) {
+ FX_Free(m_pAddClipScan);
+ }
+}
+void CFX_BitmapComposer::Compose(CFX_DIBitmap* pDest, const CFX_ClipRgn* pClipRgn, int bitmap_alpha,
+ FX_DWORD mask_color, FX_RECT& dest_rect, FX_BOOL bVertical,
+ FX_BOOL bFlipX, FX_BOOL bFlipY, FX_BOOL bRgbByteOrder,
+ int alpha_flag, void* pIccTransform, int blend_type)
+{
+ m_pBitmap = pDest;
+ m_pClipRgn = pClipRgn;
+ m_DestLeft = dest_rect.left;
+ m_DestTop = dest_rect.top;
+ m_DestWidth = dest_rect.Width();
+ m_DestHeight = dest_rect.Height();
+ m_BitmapAlpha = bitmap_alpha;
+ m_MaskColor = mask_color;
+ m_pClipMask = NULL;
+ if (pClipRgn && pClipRgn->GetType() != CFX_ClipRgn::RectI) {
+ m_pClipMask = pClipRgn->GetMask();
+ }
+ m_bVertical = bVertical;
+ m_bFlipX = bFlipX;
+ m_bFlipY = bFlipY;
+ m_AlphaFlag = alpha_flag;
+ m_pIccTransform = pIccTransform;
+ m_bRgbByteOrder = bRgbByteOrder;
+ m_BlendType = blend_type;
+}
+FX_BOOL CFX_BitmapComposer::SetInfo(int width, int height, FXDIB_Format src_format, FX_DWORD* pSrcPalette)
+{
+ m_SrcFormat = src_format;
+ if (!m_Compositor.Init(m_pBitmap->GetFormat(), src_format, width, pSrcPalette, m_MaskColor, FXDIB_BLEND_NORMAL,
+ m_pClipMask != NULL || (m_BitmapAlpha < 255), m_bRgbByteOrder, m_AlphaFlag, m_pIccTransform)) {
+ return FALSE;
+ }
+ if (m_bVertical) {
+ m_pScanlineV = FX_Alloc(FX_BYTE, m_pBitmap->GetBPP() / 8 * width + 4);
+ if (!m_pScanlineV) {
+ return FALSE;
+ }
+ m_pClipScanV = FX_Alloc(FX_BYTE, m_pBitmap->GetHeight());
+ if (!m_pClipScanV) {
+ return FALSE;
+ }
+ if (m_pBitmap->m_pAlphaMask) {
+ m_pScanlineAlphaV = FX_Alloc(FX_BYTE, width + 4);
+ if (!m_pScanlineAlphaV) {
+ return FALSE;
+ }
+ }
+ }
+ if (m_BitmapAlpha < 255) {
+ m_pAddClipScan = FX_Alloc(FX_BYTE, m_bVertical ? m_pBitmap->GetHeight() : m_pBitmap->GetWidth());
+ if (!m_pAddClipScan) {
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+void CFX_BitmapComposer::DoCompose(FX_LPBYTE dest_scan, FX_LPCBYTE src_scan, int dest_width, FX_LPCBYTE clip_scan,
+ FX_LPCBYTE src_extra_alpha, FX_LPBYTE dst_extra_alpha)
+{
+ if (m_BitmapAlpha < 255) {
+ if (clip_scan) {
+ for (int i = 0; i < dest_width; i ++) {
+ m_pAddClipScan[i] = clip_scan[i] * m_BitmapAlpha / 255;
+ }
+ } else {
+ FXSYS_memset8(m_pAddClipScan, m_BitmapAlpha, dest_width);
+ }
+ clip_scan = m_pAddClipScan;
+ }
+ if (m_SrcFormat == FXDIB_8bppMask) {
+ m_Compositor.CompositeByteMaskLine(dest_scan, src_scan, dest_width, clip_scan, dst_extra_alpha);
+ } else if ((m_SrcFormat & 0xff) == 8) {
+ m_Compositor.CompositePalBitmapLine(dest_scan, src_scan, 0, dest_width, clip_scan, src_extra_alpha, dst_extra_alpha);
+ } else {
+ m_Compositor.CompositeRgbBitmapLine(dest_scan, src_scan, dest_width, clip_scan, src_extra_alpha, dst_extra_alpha);
+ }
+}
+void CFX_BitmapComposer::ComposeScanline(int line, FX_LPCBYTE scanline, FX_LPCBYTE scan_extra_alpha)
+{
+ if (m_bVertical) {
+ ComposeScanlineV(line, scanline, scan_extra_alpha);
+ return;
+ }
+ FX_LPCBYTE clip_scan = NULL;
+ if (m_pClipMask)
+ clip_scan = m_pClipMask->GetBuffer() + (m_DestTop + line - m_pClipRgn->GetBox().top) *
+ m_pClipMask->GetPitch() + (m_DestLeft - m_pClipRgn->GetBox().left);
+ FX_LPBYTE dest_scan = (FX_LPBYTE)m_pBitmap->GetScanline(line + m_DestTop) +
+ m_DestLeft * m_pBitmap->GetBPP() / 8;
+ FX_LPBYTE dest_alpha_scan = m_pBitmap->m_pAlphaMask ?
+ (FX_LPBYTE)m_pBitmap->m_pAlphaMask->GetScanline(line + m_DestTop) + m_DestLeft : NULL;
+ DoCompose(dest_scan, scanline, m_DestWidth, clip_scan, scan_extra_alpha, dest_alpha_scan);
+}
+void CFX_BitmapComposer::ComposeScanlineV(int line, FX_LPCBYTE scanline, FX_LPCBYTE scan_extra_alpha)
+{
+ int i;
+ int Bpp = m_pBitmap->GetBPP() / 8;
+ int dest_pitch = m_pBitmap->GetPitch();
+ int dest_alpha_pitch = m_pBitmap->m_pAlphaMask ? m_pBitmap->m_pAlphaMask->GetPitch() : 0;
+ int dest_x = m_DestLeft + (m_bFlipX ? (m_DestWidth - line - 1) : line);
+ FX_LPBYTE dest_buf = m_pBitmap->GetBuffer() + dest_x * Bpp + m_DestTop * dest_pitch;
+ FX_LPBYTE dest_alpha_buf = m_pBitmap->m_pAlphaMask ?
+ m_pBitmap->m_pAlphaMask->GetBuffer() + dest_x + m_DestTop * dest_alpha_pitch : NULL;
+ if (m_bFlipY) {
+ dest_buf += dest_pitch * (m_DestHeight - 1);
+ dest_alpha_buf += dest_alpha_pitch * (m_DestHeight - 1);
+ }
+ int y_step = dest_pitch;
+ int y_alpha_step = dest_alpha_pitch;
+ if (m_bFlipY) {
+ y_step = -y_step;
+ y_alpha_step = -y_alpha_step;
+ }
+ FX_LPBYTE src_scan = m_pScanlineV;
+ FX_LPBYTE dest_scan = dest_buf;
+ for (i = 0; i < m_DestHeight; i ++) {
+ for (int j = 0; j < Bpp; j ++) {
+ *src_scan++ = dest_scan[j];
+ }
+ dest_scan += y_step;
+ }
+ FX_LPBYTE src_alpha_scan = m_pScanlineAlphaV;
+ FX_LPBYTE dest_alpha_scan = dest_alpha_buf;
+ if (dest_alpha_scan) {
+ for (i = 0; i < m_DestHeight; i ++) {
+ *src_alpha_scan++ = *dest_alpha_scan;
+ dest_alpha_scan += y_alpha_step;
+ }
+ }
+ FX_LPBYTE clip_scan = NULL;
+ if (m_pClipMask) {
+ clip_scan = m_pClipScanV;
+ int clip_pitch = m_pClipMask->GetPitch();
+ FX_LPCBYTE src_clip = m_pClipMask->GetBuffer() + (m_DestTop - m_pClipRgn->GetBox().top) *
+ clip_pitch + (dest_x - m_pClipRgn->GetBox().left);
+ if (m_bFlipY) {
+ src_clip += clip_pitch * (m_DestHeight - 1);
+ clip_pitch = -clip_pitch;
+ }
+ for (i = 0; i < m_DestHeight; i ++) {
+ clip_scan[i] = *src_clip;
+ src_clip += clip_pitch;
+ }
+ }
+ DoCompose(m_pScanlineV, scanline, m_DestHeight, clip_scan, scan_extra_alpha, m_pScanlineAlphaV);
+ src_scan = m_pScanlineV;
+ dest_scan = dest_buf;
+ for (i = 0; i < m_DestHeight; i ++) {
+ for (int j = 0; j < Bpp; j ++) {
+ dest_scan[j] = *src_scan++;
+ }
+ dest_scan += y_step;
+ }
+ src_alpha_scan = m_pScanlineAlphaV;
+ dest_alpha_scan = dest_alpha_buf;
+ if (dest_alpha_scan) {
+ for (i = 0; i < m_DestHeight; i ++) {
+ *dest_alpha_scan = *src_alpha_scan++;
+ dest_alpha_scan += y_alpha_step;
+ }
+ }
+}
diff --git a/core/src/fxge/dib/fx_dib_convert.cpp b/core/src/fxge/dib/fx_dib_convert.cpp
new file mode 100644
index 0000000000..fe4a7bfd9a
--- /dev/null
+++ b/core/src/fxge/dib/fx_dib_convert.cpp
@@ -0,0 +1,1090 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxge/fx_dib.h"
+#include "../../../include/fxge/fx_ge.h"
+#include "../../../include/fxcodec/fx_codec.h"
+const FX_DWORD g_dwWinPalette[256] = {
+ 0xff000000, 0xff800000, 0xff008000, 0xff808000, 0xff000080, 0xff800080,
+ 0xff008080, 0xff808080, 0xffC0DCC0, 0xffA6CAF0, 0xff2A3FAA, 0xff2A3FFF,
+ 0xff2A5F00, 0xff2A5F55, 0xff2A5FAA, 0xff2A5FFF, 0xff2A7F00, 0xff2A7F55,
+ 0xff2A7FAA, 0xff2A7FFF, 0xff2A9F00, 0xff2A9F55, 0xff2A9FAA, 0xff2A9FFF,
+ 0xff2ABF00, 0xff2ABF55, 0xff2ABFAA, 0xff2ABFFF, 0xff2ADF00, 0xff2ADF55,
+ 0xff2ADFAA, 0xff2ADFFF, 0xff2AFF00, 0xff2AFF55, 0xff2AFFAA, 0xff2AFFFF,
+ 0xff550000, 0xff550055, 0xff5500AA, 0xff5500FF, 0xff551F00, 0xff551F55,
+ 0xff551FAA, 0xff551FFF, 0xff553F00, 0xff553F55, 0xff553FAA, 0xff553FFF,
+ 0xff555F00, 0xff555F55, 0xff555FAA, 0xff555FFF, 0xff557F00, 0xff557F55,
+ 0xff557FAA, 0xff557FFF, 0xff559F00, 0xff559F55, 0xff559FAA, 0xff559FFF,
+ 0xff55BF00, 0xff55BF55, 0xff55BFAA, 0xff55BFFF, 0xff55DF00, 0xff55DF55,
+ 0xff55DFAA, 0xff55DFFF, 0xff55FF00, 0xff55FF55, 0xff55FFAA, 0xff55FFFF,
+ 0xff7F0000, 0xff7F0055, 0xff7F00AA, 0xff7F00FF, 0xff7F1F00, 0xff7F1F55,
+ 0xff7F1FAA, 0xff7F1FFF, 0xff7F3F00, 0xff7F3F55, 0xff7F3FAA, 0xff7F3FFF,
+ 0xff7F5F00, 0xff7F5F55, 0xff7F5FAA, 0xff7F5FFF, 0xff7F7F00, 0xff7F7F55,
+ 0xff7F7FAA, 0xff7F7FFF, 0xff7F9F00, 0xff7F9F55, 0xff7F9FAA, 0xff7F9FFF,
+ 0xff7FBF00, 0xff7FBF55, 0xff7FBFAA, 0xff7FBFFF, 0xff7FDF00, 0xff7FDF55,
+ 0xff7FDFAA, 0xff7FDFFF, 0xff00FF7F, 0xff7FFF55, 0xff7FFFAA, 0xff7FFFFF,
+ 0xffAA0000, 0xffAA0055, 0xffAA00AA, 0xffAA00FF, 0xffAA1F00, 0xffAA1F55,
+ 0xffAA1FAA, 0xffAA1FFF, 0xffAA3F00, 0xffAA3F55, 0xffAA3FAA, 0xffAA3FFF,
+ 0xffAA5F00, 0xffAA5F55, 0xffAA5FAA, 0xffAA5FFF, 0xffAA7F00, 0xffAA7F55,
+ 0xffAA7FAA, 0xffAA7FFF, 0xffAA9F00, 0xffAA9F55, 0xffAA9FAA, 0xffAA9FFF,
+ 0xffAABF00, 0xffAABF55, 0xffAABFAA, 0xffAABFFF, 0xffAADF00, 0xffAADF55,
+ 0xffAADFAA, 0xffAADFFF, 0xffAAFF00, 0xffAAFF55, 0xffAAFFAA, 0xffAAFFFF,
+ 0xffD40000, 0xffD40055, 0xffD400AA, 0xffD400FF, 0xffD41F00, 0xffD41F55,
+ 0xffD41FAA, 0xffD41FFF, 0xffD43F00, 0xffD43F55, 0xffD43FAA, 0xffD43FFF,
+ 0xffD45F00, 0xffD45F55, 0xffD45FAA, 0xffD45FFF, 0xffD47F00, 0xffD47F55,
+ 0xffD47FAA, 0xffD4F7FF, 0xffD49F00, 0xffD49F55, 0xffD49FAA, 0xffD49FFF,
+ 0xffD4BF00, 0xffD4BF55, 0xffD4BFAA, 0xffD4BFFF, 0xffD4DF00, 0xffD4DF55,
+ 0xffD4DFAA, 0xffD4DFFF, 0xffD4FF00, 0xffD4FF55, 0xffD4FFAA, 0xffD4FFFF,
+ 0xffFF0055, 0xffFF00AA, 0xffFF1F00, 0xffFF1F55, 0xffFF1FAA, 0xffFF1FFF,
+ 0xffFF3F00, 0xffFF3F55, 0xffFF3FAA, 0xffFF3FFF, 0xffFF5F00, 0xffFF5F55,
+ 0xffFF5FAA, 0xffFF5FFF, 0xffFF7F00, 0xffFF7F55, 0xffFF7FAA, 0xffFF7FFF,
+ 0xffFF9F00, 0xffFF9F55, 0xffFF9FAA, 0xffFF9FFF, 0xffFFBF00, 0xffFFBF55,
+ 0xffFFBFAA, 0xffFFBFFF, 0xffFFDF00, 0xffFFDF55, 0xffFFDFAA, 0xffFFDFFF,
+ 0xffFFFF55, 0xffFFFFAA, 0xffCCCCFF, 0xffFFCCFF, 0xff33FFFF, 0xff66FFFF,
+ 0xff99FFFF, 0xffCCFFFF, 0xff007F00, 0xff007F55, 0xff007FAA, 0xff007FFF,
+ 0xff009F00, 0xff009F55, 0xff009FAA, 0xff009FFF, 0xff00BF00, 0xff00BF55,
+ 0xff00BFAA, 0xff00BFFF, 0xff00DF00, 0xff00DF55, 0xff00DFAA, 0xff00DFFF,
+ 0xff00FF55, 0xff00FFAA, 0xff2A0000, 0xff2A0055, 0xff2A00AA, 0xff2A00FF,
+ 0xff2A1F00, 0xff2A1F55, 0xff2A1FAA, 0xff2A1FFF, 0xff2A3F00, 0xff2A3F55,
+ 0xffFFFBF0, 0xffA0A0A4, 0xff808080, 0xffFF0000, 0xff00FF00, 0xffFF0000,
+ 0xff0000FF, 0xffFF00FF, 0xff00FFFF, 0xffFFFFFF
+};
+const FX_DWORD g_dwMacPalette[256] = {
+ 0xffFFFFFF, 0xffFFFFCC, 0xffFFFF99, 0xffFFFF66, 0xffFFFF33, 0xffFFFF00,
+ 0xffFFCCFF, 0xffFFCCCC, 0xffFFCC99, 0xffFFCC66, 0xffFFCC33, 0xffFFCC00,
+ 0xffFF99FF, 0xffFF99CC, 0xffFF9999, 0xffFF9966, 0xffFF9933, 0xffFF9900,
+ 0xffFF66FF, 0xffFF66CC, 0xffFF6699, 0xffFF6666, 0xffFF6633, 0xffFF6600,
+ 0xffFF33FF, 0xffFF33CC, 0xffFF3399, 0xffFF3366, 0xffFF3333, 0xffFF3300,
+ 0xffFF00FF, 0xffFF00CC, 0xffFF0099, 0xffFF0066, 0xffFF0033, 0xffFF0000,
+ 0xffCCFFFF, 0xffCCFFCC, 0xffCCFF99, 0xffCCFF66, 0xffCCFF33, 0xffCCFF00,
+ 0xffCCCCFF, 0xffCCCCCC, 0xffCCCC99, 0xffCCCC66, 0xffCCCC33, 0xffCCCC00,
+ 0xffCC99FF, 0xffCC99CC, 0xffCC9999, 0xffCC9966, 0xffCC9933, 0xffCC9900,
+ 0xffCC66FF, 0xffCC66CC, 0xffCC6699, 0xffCC6666, 0xffCC6633, 0xffCC6600,
+ 0xffCC33FF, 0xffCC33CC, 0xffCC3399, 0xffCC3366, 0xffCC3333, 0xffCC3300,
+ 0xffCC00FF, 0xffCC00CC, 0xffCC0099, 0xffCC0066, 0xffCC0033, 0xffCC0000,
+ 0xff99FFFF, 0xff99FFCC, 0xff99FF99, 0xff99FF66, 0xff99FF33, 0xff99FF00,
+ 0xff99CCFF, 0xff99CCCC, 0xff99CC99, 0xff99CC66, 0xff99CC33, 0xff99CC00,
+ 0xff9999FF, 0xff9999CC, 0xff999999, 0xff999966, 0xff999933, 0xff999900,
+ 0xff9966FF, 0xff9966CC, 0xff996699, 0xff996666, 0xff996633, 0xff996600,
+ 0xff9933FF, 0xff9933CC, 0xff993399, 0xff993366, 0xff993333, 0xff993300,
+ 0xff9900FF, 0xff9900CC, 0xff990099, 0xff990066, 0xff990033, 0xff990000,
+ 0xff66FFFF, 0xff66FFCC, 0xff66FF99, 0xff66FF66, 0xff66FF33, 0xff66FF00,
+ 0xff66CCFF, 0xff66CCCC, 0xff66CC99, 0xff66CC66, 0xff66CC33, 0xff66CC00,
+ 0xff6699FF, 0xff6699CC, 0xff669999, 0xff669966, 0xff669933, 0xff669900,
+ 0xff6666FF, 0xff6666CC, 0xff666699, 0xff666666, 0xff666633, 0xff666600,
+ 0xff6633FF, 0xff6633CC, 0xff663399, 0xff663366, 0xff663333, 0xff663300,
+ 0xff6600FF, 0xff6600CC, 0xff660099, 0xff660066, 0xff660033, 0xff660000,
+ 0xff33FFFF, 0xff33FFCC, 0xff33FF99, 0xff33FF66, 0xff33FF33, 0xff33FF00,
+ 0xff33CCFF, 0xff33CCCC, 0xff33CC99, 0xff33CC66, 0xff33CC33, 0xff33CC00,
+ 0xff3399FF, 0xff3399CC, 0xff339999, 0xff339966, 0xff339933, 0xff339900,
+ 0xff3366FF, 0xff3366CC, 0xff336699, 0xff336666, 0xff336633, 0xff336600,
+ 0xff3333FF, 0xff3333CC, 0xff333399, 0xff333366, 0xff333333, 0xff333300,
+ 0xff3300FF, 0xff3300CC, 0xff330099, 0xff330066, 0xff330033, 0xff330000,
+ 0xff00FFFF, 0xff00FFCC, 0xff00FF99, 0xff00FF66, 0xff00FF33, 0xff00FF00,
+ 0xff00CCFF, 0xff00CCCC, 0xff00CC99, 0xff00CC66, 0xff00CC33, 0xff00CC00,
+ 0xff0099FF, 0xff0099CC, 0xff009999, 0xff009966, 0xff009933, 0xff009900,
+ 0xff0066FF, 0xff0066CC, 0xff006699, 0xff006666, 0xff006633, 0xff006600,
+ 0xff0033FF, 0xff0033CC, 0xff003399, 0xff003366, 0xff003333, 0xff003300,
+ 0xff0000FF, 0xff0000CC, 0xff000099, 0xff000066, 0xff000033,
+ 0xffEE0000, 0xffDD0000, 0xffBB0000, 0xffAA0000, 0xff880000, 0xff770000,
+ 0xff550000, 0xff440000, 0xff220000, 0xff110000, 0xff00EE00, 0xff00DD00,
+ 0xff00BB00, 0xff00AA00, 0xff008800, 0xff007700, 0xff005500, 0xff004400,
+ 0xff002200, 0xff001100, 0xff0000EE, 0xff0000DD, 0xff0000BB, 0xff0000AA,
+ 0xff000088, 0xff000077, 0xff000055, 0xff000044, 0xff000022, 0xff000011,
+ 0xffEEEEEE, 0xffDDDDDD, 0xffBBBBBB, 0xffAAAAAA, 0xff888888, 0xff777777,
+ 0xff555555, 0xff444444, 0xff222222, 0xff111111, 0xff000000
+};
+class CFX_Palette : public CFX_Object
+{
+public:
+ CFX_Palette();
+ ~CFX_Palette();
+public:
+ FX_BOOL BuildPalette(const CFX_DIBSource* pBitmap, int dwPaletteType);
+ FX_DWORD* GetPalette() const
+ {
+ return m_pPalette;
+ }
+
+ FX_DWORD* GetColorLut()const
+ {
+ return m_cLut;
+ }
+ FX_DWORD* GetAmountLut()const
+ {
+ return m_aLut;
+ }
+ FX_INT32 Getlut()const
+ {
+ return m_lut;
+ }
+protected:
+ FX_DWORD* m_pPalette;
+ FX_DWORD* m_cLut;
+ FX_DWORD* m_aLut;
+ int m_lut;
+};
+int _Partition(FX_DWORD* alut, FX_DWORD* clut, int l, int r)
+{
+ FX_DWORD p_a = alut[l];
+ FX_DWORD p_c = clut[l];
+ while(l < r) {
+ while(l < r && alut[r] >= p_a) {
+ r--;
+ }
+ if (l < r) {
+ alut[l] = alut[r];
+ clut[l++] = clut[r];
+ }
+ while(l < r && alut[l] <= p_a) {
+ l++;
+ }
+ if (l < r) {
+ alut[r] = alut[l];
+ clut[r--] = clut[l];
+ }
+ }
+ alut[l] = p_a;
+ clut[l] = p_c;
+ return l;
+}
+void _Qsort(FX_DWORD* alut, FX_DWORD* clut, int l, int r)
+{
+ if(l < r) {
+ int pI = _Partition(alut, clut, l, r);
+ _Qsort(alut, clut, l, pI - 1);
+ _Qsort(alut, clut, pI + 1, r);
+ }
+}
+void _ColorDecode(FX_DWORD pal_v, FX_BYTE& r, FX_BYTE& g, FX_BYTE& b)
+{
+ r = (FX_BYTE)((pal_v & 0xf00) >> 4);
+ g = (FX_BYTE)(pal_v & 0x0f0);
+ b = (FX_BYTE)((pal_v & 0x00f) << 4);
+}
+void _Obtain_Pal(FX_DWORD* aLut, FX_DWORD*cLut, FX_DWORD* dest_pal, int pal_type, FX_DWORD* win_mac_pal, FX_DWORD lut)
+{
+ int row, col;
+ FX_DWORD lut_1 = lut - 1;
+ if (pal_type == FXDIB_PALETTE_LOC) {
+ for (row = 0; row < 256; row++) {
+ int lut_offset = lut_1 - row;
+ if (lut_offset < 0) {
+ lut_offset += 256;
+ }
+ FX_DWORD color = cLut[lut_offset];
+ FX_BYTE r, g, b;
+ _ColorDecode(color, r, g, b);
+ dest_pal[row] = ((FX_DWORD)r << 16) | ((FX_DWORD)g << 8) | b | 0xff000000;
+ aLut[lut_offset] = row;
+ }
+ } else {
+ for (row = 0; row < 256; row++) {
+ int lut_offset = lut_1 - row;
+ if (lut_offset < 0) {
+ lut_offset += 256;
+ }
+ FX_BYTE r, g, b;
+ _ColorDecode(cLut[lut_offset], r, g, b);
+ int error, min_error = 1000000;
+ int c_index = 0;
+ for (col = 0; col < 256; col++) {
+ FX_DWORD p_color = win_mac_pal[col];
+ int d_r = r - (FX_BYTE)(p_color >> 16);
+ int d_g = g - (FX_BYTE)(p_color >> 8);
+ int d_b = b - (FX_BYTE)p_color;
+ error = d_r * d_r + d_g * d_g + d_b * d_b;
+ if (error < min_error) {
+ min_error = error;
+ c_index = col;
+ }
+ }
+ dest_pal[row] = win_mac_pal[c_index];
+ aLut[lut_offset] = row;
+ }
+ }
+}
+CFX_Palette::CFX_Palette()
+{
+ m_pPalette = NULL;
+ m_cLut = NULL;
+ m_aLut = NULL;
+ m_lut = 0;
+}
+CFX_Palette::~CFX_Palette()
+{
+ if (m_pPalette) {
+ FX_Free(m_pPalette);
+ }
+ if (m_cLut) {
+ FX_Free(m_cLut);
+ }
+ if (m_aLut) {
+ FX_Free(m_aLut);
+ }
+ m_lut = 0;
+}
+FX_BOOL CFX_Palette::BuildPalette(const CFX_DIBSource* pBitmap, int pal_type)
+{
+ if (pBitmap == NULL) {
+ return FALSE;
+ }
+ if (m_pPalette != NULL) {
+ FX_Free(m_pPalette);
+ }
+ m_pPalette = FX_Alloc(FX_DWORD, 256);
+ if (!m_pPalette) {
+ return FALSE;
+ }
+ FXSYS_memset32(m_pPalette, 0, sizeof(FX_DWORD) * 256);
+ int bpp = pBitmap->GetBPP() / 8;
+ int width = pBitmap->GetWidth();
+ int height = pBitmap->GetHeight();
+ if (m_cLut) {
+ FX_Free(m_cLut);
+ m_cLut = NULL;
+ }
+ if (m_aLut) {
+ FX_Free(m_aLut);
+ m_aLut = NULL;
+ }
+ m_cLut = FX_Alloc(FX_DWORD, 4096);
+ if (!m_cLut) {
+ return FALSE;
+ }
+ m_aLut = FX_Alloc(FX_DWORD, 4096);
+ if (!m_aLut) {
+ return FALSE;
+ }
+ FXSYS_memset32(m_aLut, 0, sizeof(FX_DWORD) * 4096);
+ FXSYS_memset32(m_cLut, 0, sizeof(FX_DWORD) * 4096);
+ int row, col;
+ m_lut = 0;
+ for (row = 0; row < height; row++) {
+ FX_BYTE* scan_line = (FX_BYTE*)pBitmap->GetScanline(row);
+ for (col = 0; col < width; col++) {
+ FX_BYTE* src_port = scan_line + col * bpp;
+ FX_DWORD b = src_port[0] & 0xf0;
+ FX_DWORD g = src_port[1] & 0xf0;
+ FX_DWORD r = src_port[2] & 0xf0;
+ FX_DWORD index = (r << 4) + g + (b >> 4);
+ m_aLut[index]++;
+ }
+ }
+ for (row = 0; row < 4096; row++) {
+ if (m_aLut[row] != 0) {
+ m_aLut[m_lut] = m_aLut[row];
+ m_cLut[m_lut] = row;
+ m_lut++;
+ }
+ }
+ _Qsort(m_aLut, m_cLut, 0, m_lut - 1);
+ FX_DWORD* win_mac_pal = NULL;
+ if (pal_type == FXDIB_PALETTE_WIN) {
+ win_mac_pal = (FX_DWORD*)g_dwWinPalette;
+ } else if (pal_type == FXDIB_PALETTE_MAC) {
+ win_mac_pal = (FX_DWORD*)g_dwMacPalette;
+ }
+ _Obtain_Pal(m_aLut, m_cLut, m_pPalette, pal_type, win_mac_pal, m_lut);
+ return TRUE;
+}
+FX_BOOL _ConvertBuffer_1bppMask2Gray(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
+ const CFX_DIBSource* pSrcBitmap, int src_left, int src_top)
+{
+ FX_BYTE set_gray, reset_gray;
+ set_gray = 0xff;
+ reset_gray = 0x00;
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ FXSYS_memset8(dest_scan, reset_gray, width);
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row);
+ for (int col = src_left; col < src_left + width; col ++) {
+ if (src_scan[col / 8] & (1 << (7 - col % 8))) {
+ *dest_scan = set_gray;
+ }
+ dest_scan ++;
+ }
+ }
+ return TRUE;
+}
+FX_BOOL _ConvertBuffer_8bppMask2Gray(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
+ const CFX_DIBSource* pSrcBitmap, int src_left, int src_top)
+{
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left;
+ FXSYS_memcpy32(dest_scan, src_scan, width);
+ }
+ return TRUE;
+}
+FX_BOOL _ConvertBuffer_1bppPlt2Gray(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
+ const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)
+{
+ FX_DWORD* src_plt = pSrcBitmap->GetPalette();
+ FX_BYTE gray[2];
+ if (pIccTransform) {
+ FX_DWORD plt[2];
+ if (pSrcBitmap->IsCmykImage()) {
+ plt[0] = FXCMYK_TODIB(src_plt[0]);
+ plt[1] = FXCMYK_TODIB(src_plt[1]);
+ } else {
+ FX_LPBYTE bgr_ptr = (FX_LPBYTE)plt;
+ bgr_ptr[0] = FXARGB_B(src_plt[0]);
+ bgr_ptr[1] = FXARGB_G(src_plt[0]);
+ bgr_ptr[2] = FXARGB_R(src_plt[0]);
+ bgr_ptr[3] = FXARGB_B(src_plt[1]);
+ bgr_ptr[4] = FXARGB_G(src_plt[1]);
+ bgr_ptr[5] = FXARGB_R(src_plt[1]);
+ }
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ pIccModule->TranslateScanline(pIccTransform, gray, (FX_LPCBYTE)plt, 2);
+ } else {
+ FX_BYTE reset_r, reset_g, reset_b,
+ set_r, set_g, set_b;
+ if (pSrcBitmap->IsCmykImage()) {
+ AdobeCMYK_to_sRGB1(FXSYS_GetCValue(src_plt[0]), FXSYS_GetMValue(src_plt[0]), FXSYS_GetYValue(src_plt[0]), FXSYS_GetKValue(src_plt[0]),
+ reset_r, reset_g, reset_b);
+ AdobeCMYK_to_sRGB1(FXSYS_GetCValue(src_plt[1]), FXSYS_GetMValue(src_plt[1]), FXSYS_GetYValue(src_plt[1]), FXSYS_GetKValue(src_plt[1]),
+ set_r, set_g, set_b);
+ } else {
+ reset_r = FXARGB_R(src_plt[0]);
+ reset_g = FXARGB_G(src_plt[0]);
+ reset_b = FXARGB_B(src_plt[0]);
+ set_r = FXARGB_R(src_plt[1]);
+ set_g = FXARGB_G(src_plt[1]);
+ set_b = FXARGB_B(src_plt[1]);
+ }
+ gray[0] = FXRGB2GRAY(reset_r, reset_g, reset_b);
+ gray[1] = FXRGB2GRAY(set_r, set_g, set_b);
+ }
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ FXSYS_memset8(dest_scan, gray[0], width);
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row);
+ for (int col = src_left; col < src_left + width; col ++) {
+ if (src_scan[col / 8] & (1 << (7 - col % 8))) {
+ *dest_scan = gray[1];
+ }
+ dest_scan ++;
+ }
+ }
+ return TRUE;
+}
+FX_BOOL _ConvertBuffer_8bppPlt2Gray(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
+ const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)
+{
+ FX_DWORD* src_plt = pSrcBitmap->GetPalette();
+ FX_BYTE gray[256];
+ if (pIccTransform) {
+ FX_DWORD plt[256];
+ if (pSrcBitmap->IsCmykImage()) {
+ for (int i = 0; i < 256; i ++) {
+ plt[i] = FXCMYK_TODIB(src_plt[i]);
+ }
+ } else {
+ FX_LPBYTE bgr_ptr = (FX_LPBYTE)plt;
+ for (int i = 0; i < 256; i ++) {
+ *bgr_ptr++ = FXARGB_B(src_plt[i]);
+ *bgr_ptr++ = FXARGB_G(src_plt[i]);
+ *bgr_ptr++ = FXARGB_R(src_plt[i]);
+ }
+ }
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ pIccModule->TranslateScanline(pIccTransform, gray, (FX_LPCBYTE)plt, 256);
+ } else {
+ if (pSrcBitmap->IsCmykImage()) {
+ FX_BYTE r, g, b;
+ for (int i = 0; i < 256; i ++) {
+ AdobeCMYK_to_sRGB1(FXSYS_GetCValue(src_plt[i]), FXSYS_GetMValue(src_plt[i]), FXSYS_GetYValue(src_plt[i]), FXSYS_GetKValue(src_plt[i]),
+ r, g, b);
+ gray[i] = FXRGB2GRAY(r, g, b);
+ }
+ } else
+ for (int i = 0; i < 256; i ++) {
+ gray[i] = FXRGB2GRAY(FXARGB_R(src_plt[i]), FXARGB_G(src_plt[i]), FXARGB_B(src_plt[i]));
+ }
+ }
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left;
+ for (int col = 0; col < width; col ++) {
+ *dest_scan++ = gray[*src_scan++];
+ }
+ }
+ return TRUE;
+}
+FX_BOOL _ConvertBuffer_RgbOrCmyk2Gray(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
+ const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)
+{
+ int Bpp = pSrcBitmap->GetBPP() / 8;
+ if (pIccTransform) {
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ if (Bpp == 3 || pSrcBitmap->IsCmykImage()) {
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * Bpp;
+ pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, width);
+ }
+ } else {
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * 4;
+ for (int col = 0; col < width; col ++) {
+ pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1);
+ dest_scan++;
+ src_scan += 4;
+ }
+ }
+ }
+ } else {
+ if (pSrcBitmap->IsCmykImage()) {
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * 4;
+ for (int col = 0; col < width; col ++) {
+ FX_BYTE r, g, b;
+ AdobeCMYK_to_sRGB1(FXSYS_GetCValue((FX_DWORD)src_scan[0]), FXSYS_GetMValue((FX_DWORD)src_scan[1]), FXSYS_GetYValue((FX_DWORD)src_scan[2]), FXSYS_GetKValue((FX_DWORD)src_scan[3]),
+ r, g, b);
+ *dest_scan++ = FXRGB2GRAY(r, g, b);
+ src_scan += 4;
+ }
+ }
+ } else
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * Bpp;
+ for (int col = 0; col < width; col ++) {
+ *dest_scan++ = FXRGB2GRAY(src_scan[2], src_scan[1], src_scan[0]);
+ src_scan += Bpp;
+ }
+ }
+ }
+ return TRUE;
+}
+inline void _ConvertBuffer_IndexCopy(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
+ const CFX_DIBSource* pSrcBitmap, int src_left, int src_top)
+{
+ if (pSrcBitmap->GetBPP() == 1) {
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ FXSYS_memset32(dest_scan, 0, width);
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row);
+ for (int col = src_left; col < src_left + width; col ++) {
+ if (src_scan[col / 8] & (1 << (7 - col % 8))) {
+ *dest_scan = 1;
+ }
+ dest_scan ++;
+ }
+ }
+ } else {
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left;
+ FXSYS_memcpy32(dest_scan, src_scan, width);
+ }
+ }
+}
+FX_BOOL _ConvertBuffer_Plt2PltRgb8(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
+ const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, FX_DWORD* dst_plt, void* pIccTransform)
+{
+ _ConvertBuffer_IndexCopy(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top);
+ FX_DWORD* src_plt = pSrcBitmap->GetPalette();
+ int plt_size = pSrcBitmap->GetPaletteSize();
+ if (pIccTransform) {
+ FX_DWORD plt[256];
+ FX_LPBYTE bgr_ptr = (FX_LPBYTE)plt;
+ if (pSrcBitmap->IsCmykImage()) {
+ for (int i = 0; i < plt_size; i ++) {
+ plt[i] = FXCMYK_TODIB(src_plt[i]);
+ }
+ } else {
+ for (int i = 0; i < plt_size; i ++) {
+ *bgr_ptr++ = FXARGB_B(src_plt[i]);
+ *bgr_ptr++ = FXARGB_G(src_plt[i]);
+ *bgr_ptr++ = FXARGB_R(src_plt[i]);
+ }
+ bgr_ptr = (FX_LPBYTE)plt;
+ }
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ pIccModule->TranslateScanline(pIccTransform, (FX_LPBYTE)plt, (FX_LPCBYTE)plt, plt_size);
+ for (int i = 0; i < plt_size; i ++) {
+ dst_plt[i] = FXARGB_MAKE(0xff, bgr_ptr[2], bgr_ptr[1], bgr_ptr[0]);
+ bgr_ptr += 3;
+ }
+ } else {
+ if (pSrcBitmap->IsCmykImage()) {
+ for (int i = 0; i < plt_size; i ++) {
+ FX_BYTE r, g, b;
+ AdobeCMYK_to_sRGB1(FXSYS_GetCValue(src_plt[i]), FXSYS_GetMValue(src_plt[i]), FXSYS_GetYValue(src_plt[i]), FXSYS_GetKValue(src_plt[i]),
+ r, g, b);
+ dst_plt[i] = FXARGB_MAKE(0xff, r, g, b);
+ }
+ } else {
+ FXSYS_memcpy32(dst_plt, src_plt, plt_size * 4);
+ }
+ }
+ return TRUE;
+}
+inline FX_BOOL _ConvertBuffer_Rgb2PltRgb8_NoTransform(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
+ const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, FX_DWORD* dst_plt)
+{
+ int bpp = pSrcBitmap->GetBPP() / 8;
+ int row, col;
+ CFX_Palette palette;
+ palette.BuildPalette(pSrcBitmap, FXDIB_PALETTE_LOC);
+ FX_DWORD* cLut = palette.GetColorLut();
+ FX_DWORD* aLut = palette.GetAmountLut();
+ if (cLut == NULL || aLut == NULL) {
+ return FALSE;
+ }
+ int lut = palette.Getlut();
+ FX_DWORD* pPalette = palette.GetPalette();
+ if (lut > 256) {
+ int err, min_err;
+ int lut_256 = lut - 256;
+ for (row = 0; row < lut_256; row++) {
+ min_err = 1000000;
+ FX_BYTE r, g, b;
+ _ColorDecode(cLut[row], r, g, b);
+ int clrindex = 0;
+ for (int col = 0; col < 256; col++) {
+ FX_DWORD p_color = *(pPalette + col);
+ int d_r = r - (FX_BYTE)(p_color >> 16);
+ int d_g = g - (FX_BYTE)(p_color >> 8);
+ int d_b = b - (FX_BYTE)(p_color);
+ err = d_r * d_r + d_g * d_g + d_b * d_b;
+ if (err < min_err) {
+ min_err = err;
+ clrindex = col;
+ }
+ }
+ aLut[row] = clrindex;
+ }
+ }
+ FX_INT32 lut_1 = lut - 1;
+ for (row = 0; row < height; row ++) {
+ FX_BYTE* src_scan = (FX_BYTE*)pSrcBitmap->GetScanline(src_top + row) + src_left;
+ FX_BYTE* dest_scan = dest_buf + row * dest_pitch;
+ for (col = 0; col < width; col++) {
+ FX_BYTE* src_port = src_scan + col * bpp;
+ int r = src_port[2] & 0xf0;
+ int g = src_port[1] & 0xf0;
+ int b = src_port[0] & 0xf0;
+ FX_DWORD clrindex = (r << 4) + g + (b >> 4);
+ for (int i = lut_1; i >= 0; i--)
+ if (clrindex == cLut[i]) {
+ *(dest_scan + col) = (FX_BYTE)(aLut[i]);
+ break;
+ }
+ }
+ }
+ FXSYS_memcpy32(dst_plt, pPalette, sizeof(FX_DWORD) * 256);
+ return TRUE;
+}
+FX_BOOL _ConvertBuffer_Rgb2PltRgb8(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
+ const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, FX_DWORD* dst_plt, void* pIccTransform)
+{
+ ICodec_IccModule* pIccModule = NULL;
+ if (pIccTransform) {
+ pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ }
+ FX_BOOL ret = _ConvertBuffer_Rgb2PltRgb8_NoTransform(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, dst_plt);
+ if (ret && pIccTransform) {
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ for (int i = 0; i < 256; i++) {
+ FX_ARGB* plt = dst_plt + i;
+ FX_ARGB plt_entry = FXARGB_TODIB(*plt);
+ pIccModule->TranslateScanline(pIccTransform, (FX_LPBYTE)&plt_entry, (FX_LPCBYTE)&plt_entry, 1);
+ *plt = FXARGB_TODIB(plt_entry);
+ }
+ }
+ return ret;
+}
+FX_BOOL _ConvertBuffer_1bppMask2Rgb(FXDIB_Format dst_format, FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
+ const CFX_DIBSource* pSrcBitmap, int src_left, int src_top)
+{
+ int comps = (dst_format & 0xff) / 8;
+ FX_BYTE set_gray, reset_gray;
+ set_gray = 0xff;
+ reset_gray = 0x00;
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row);
+ for (int col = src_left; col < src_left + width; col ++) {
+ if (src_scan[col / 8] & (1 << (7 - col % 8))) {
+ dest_scan[0] = set_gray;
+ dest_scan[1] = set_gray;
+ dest_scan[2] = set_gray;
+ } else {
+ dest_scan[0] = reset_gray;
+ dest_scan[1] = reset_gray;
+ dest_scan[2] = reset_gray;
+ }
+ dest_scan += comps;
+ }
+ }
+ return TRUE;
+}
+FX_BOOL _ConvertBuffer_8bppMask2Rgb(FXDIB_Format dst_format, FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
+ const CFX_DIBSource* pSrcBitmap, int src_left, int src_top)
+{
+ int comps = (dst_format & 0xff) / 8;
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left;
+ FX_BYTE src_pixel;
+ for (int col = 0; col < width; col ++) {
+ src_pixel = *src_scan++;
+ *dest_scan++ = src_pixel;
+ *dest_scan++ = src_pixel;
+ *dest_scan = src_pixel;
+ dest_scan += comps - 2;
+ }
+ }
+ return TRUE;
+}
+FX_BOOL _ConvertBuffer_1bppPlt2Rgb(FXDIB_Format dst_format, FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
+ const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)
+{
+ int comps = (dst_format & 0xff) / 8;
+ FX_DWORD* src_plt = pSrcBitmap->GetPalette();
+ FX_DWORD plt[2];
+ FX_LPBYTE bgr_ptr = (FX_LPBYTE)plt;
+ if (pSrcBitmap->IsCmykImage()) {
+ plt[0] = FXCMYK_TODIB(src_plt[0]);
+ plt[1] = FXCMYK_TODIB(src_plt[1]);
+ } else {
+ bgr_ptr[0] = FXARGB_B(src_plt[0]);
+ bgr_ptr[1] = FXARGB_G(src_plt[0]);
+ bgr_ptr[2] = FXARGB_R(src_plt[0]);
+ bgr_ptr[3] = FXARGB_B(src_plt[1]);
+ bgr_ptr[4] = FXARGB_G(src_plt[1]);
+ bgr_ptr[5] = FXARGB_R(src_plt[1]);
+ }
+ if (pIccTransform) {
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ pIccModule->TranslateScanline(pIccTransform, (FX_LPBYTE)plt, (FX_LPCBYTE)plt, 2);
+ } else {
+ if (pSrcBitmap->IsCmykImage()) {
+ AdobeCMYK_to_sRGB1(FXSYS_GetCValue(src_plt[0]), FXSYS_GetMValue(src_plt[0]), FXSYS_GetYValue(src_plt[0]), FXSYS_GetKValue(src_plt[0]),
+ bgr_ptr[2], bgr_ptr[1], bgr_ptr[0]);
+ AdobeCMYK_to_sRGB1(FXSYS_GetCValue(src_plt[1]), FXSYS_GetMValue(src_plt[1]), FXSYS_GetYValue(src_plt[1]), FXSYS_GetKValue(src_plt[1]),
+ bgr_ptr[5], bgr_ptr[4], bgr_ptr[3]);
+ }
+ }
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row);
+ for (int col = src_left; col < src_left + width; col ++) {
+ if (src_scan[col / 8] & (1 << (7 - col % 8))) {
+ *dest_scan++ = bgr_ptr[3];
+ *dest_scan++ = bgr_ptr[4];
+ *dest_scan = bgr_ptr[5];
+ } else {
+ *dest_scan++ = bgr_ptr[0];
+ *dest_scan++ = bgr_ptr[1];
+ *dest_scan = bgr_ptr[2];
+ }
+ dest_scan += comps - 2;
+ }
+ }
+ return TRUE;
+}
+FX_BOOL _ConvertBuffer_8bppPlt2Rgb(FXDIB_Format dst_format, FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
+ const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)
+{
+ int comps = (dst_format & 0xff) / 8;
+ FX_DWORD* src_plt = pSrcBitmap->GetPalette();
+ FX_DWORD plt[256];
+ FX_LPBYTE bgr_ptr = (FX_LPBYTE)plt;
+ if (!pSrcBitmap->IsCmykImage()) {
+ for (int i = 0; i < 256; i++) {
+ *bgr_ptr++ = FXARGB_B(src_plt[i]);
+ *bgr_ptr++ = FXARGB_G(src_plt[i]);
+ *bgr_ptr++ = FXARGB_R(src_plt[i]);
+ }
+ bgr_ptr = (FX_LPBYTE)plt;
+ }
+ if (pIccTransform) {
+ if (pSrcBitmap->IsCmykImage()) {
+ for (int i = 0; i < 256; i++) {
+ plt[i] = FXCMYK_TODIB(src_plt[i]);
+ }
+ }
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ pIccModule->TranslateScanline(pIccTransform, (FX_LPBYTE)plt, (FX_LPCBYTE)plt, 256);
+ } else {
+ if (pSrcBitmap->IsCmykImage()) {
+ for (int i = 0; i < 256; i++) {
+ AdobeCMYK_to_sRGB1(FXSYS_GetCValue(src_plt[i]), FXSYS_GetMValue(src_plt[i]), FXSYS_GetYValue(src_plt[i]), FXSYS_GetKValue(src_plt[i]),
+ bgr_ptr[2], bgr_ptr[1], bgr_ptr[0]);
+ bgr_ptr += 3;
+ }
+ bgr_ptr = (FX_LPBYTE)plt;
+ }
+ }
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left;
+ for (int col = 0; col < width; col ++) {
+ FX_LPBYTE src_pixel = bgr_ptr + 3 * (*src_scan++);
+ *dest_scan++ = *src_pixel++;
+ *dest_scan++ = *src_pixel++;
+ *dest_scan = *src_pixel++;
+ dest_scan += comps - 2;
+ }
+ }
+ return TRUE;
+}
+FX_BOOL _ConvertBuffer_24bppRgb2Rgb24(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
+ const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)
+{
+ if (pIccTransform) {
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * 3;
+ pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, width);
+ }
+ } else {
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * 3;
+ FXSYS_memcpy32(dest_scan, src_scan, width * 3);
+ }
+ }
+ return TRUE;
+}
+FX_BOOL _ConvertBuffer_32bppRgb2Rgb24(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
+ const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)
+{
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * 4;
+ for (int col = 0; col < width; col ++) {
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ src_scan++;
+ }
+ }
+ if (pIccTransform) {
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ pIccModule->TranslateScanline(pIccTransform, dest_scan, dest_scan, width);
+ }
+ }
+ return TRUE;
+}
+FX_BOOL _ConvertBuffer_Rgb2Rgb32(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
+ const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)
+{
+ int comps = pSrcBitmap->GetBPP() / 8;
+ if (pIccTransform) {
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * comps;
+ for (int col = 0; col < width; col ++) {
+ pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1);
+ dest_scan += 4;
+ src_scan += comps;
+ }
+ }
+ } else {
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * comps;
+ for (int col = 0; col < width; col ++) {
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ dest_scan++;
+ src_scan += comps - 3;
+ }
+ }
+ }
+ return TRUE;
+}
+FX_BOOL _ConvertBuffer_32bppCmyk2Rgb32(FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
+ const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)
+{
+ if (pIccTransform) {
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * 4;
+ for (int col = 0; col < width; col ++) {
+ pIccModule->TranslateScanline(pIccTransform, dest_scan, src_scan, 1);
+ dest_scan += 4;
+ src_scan += 4;
+ }
+ }
+ } else {
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * 4;
+ for (int col = 0; col < width; col ++) {
+ AdobeCMYK_to_sRGB1(src_scan[0], src_scan[1], src_scan[2], src_scan[3],
+ dest_scan[2], dest_scan[1], dest_scan[0]);
+ dest_scan += 4;
+ src_scan += 4;
+ }
+ }
+ }
+ return TRUE;
+}
+FX_BOOL ConvertBuffer(FXDIB_Format dest_format, FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
+ const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, FX_DWORD*& d_pal, void* pIccTransform)
+{
+ FXDIB_Format src_format = pSrcBitmap->GetFormat();
+ if (!CFX_GEModule::Get()->GetCodecModule() || !CFX_GEModule::Get()->GetCodecModule()->GetIccModule()) {
+ pIccTransform = NULL;
+ }
+ switch (dest_format) {
+ case FXDIB_Invalid:
+ case FXDIB_1bppCmyk:
+ case FXDIB_1bppMask:
+ case FXDIB_1bppRgb:
+ ASSERT(FALSE);
+ return FALSE;
+ case FXDIB_8bppMask: {
+ if ((src_format & 0xff) == 1) {
+ if (pSrcBitmap->GetPalette()) {
+ return _ConvertBuffer_1bppPlt2Gray(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);
+ }
+ return _ConvertBuffer_1bppMask2Gray(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top);
+ } else if ((src_format & 0xff) == 8) {
+ if (pSrcBitmap->GetPalette()) {
+ return _ConvertBuffer_8bppPlt2Gray(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);
+ }
+ return _ConvertBuffer_8bppMask2Gray(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top);
+ } else if ((src_format & 0xff) >= 24) {
+ return _ConvertBuffer_RgbOrCmyk2Gray(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);
+ }
+ return FALSE;
+ }
+ case FXDIB_8bppRgb:
+ case FXDIB_8bppRgba: {
+ if ((src_format & 0xff) == 8 && pSrcBitmap->GetPalette() == NULL) {
+ return ConvertBuffer(FXDIB_8bppMask, dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, d_pal, pIccTransform);
+ }
+ d_pal = FX_Alloc(FX_DWORD, 256);
+ if (!d_pal) {
+ return FALSE;
+ }
+ FXSYS_memset32(d_pal, 0, sizeof(FX_DWORD) * 256);
+ if (((src_format & 0xff) == 1 || (src_format & 0xff) == 8) && pSrcBitmap->GetPalette()) {
+ return _ConvertBuffer_Plt2PltRgb8(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, d_pal, pIccTransform);
+ } else if ((src_format & 0xff) >= 24) {
+ return _ConvertBuffer_Rgb2PltRgb8(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, d_pal, pIccTransform);
+ }
+ return FALSE;
+ }
+ case FXDIB_Rgb:
+ case FXDIB_Rgba: {
+ if ((src_format & 0xff) == 1) {
+ if (pSrcBitmap->GetPalette()) {
+ return _ConvertBuffer_1bppPlt2Rgb(dest_format, dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);
+ }
+ return _ConvertBuffer_1bppMask2Rgb(dest_format, dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top);
+ } else if ((src_format & 0xff) == 8) {
+ if (pSrcBitmap->GetPalette()) {
+ return _ConvertBuffer_8bppPlt2Rgb(dest_format, dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);
+ }
+ return _ConvertBuffer_8bppMask2Rgb(dest_format, dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top);
+ } else if ((src_format & 0xff) == 24) {
+ return _ConvertBuffer_24bppRgb2Rgb24(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);
+ } else if ((src_format & 0xff) == 32) {
+ return _ConvertBuffer_32bppRgb2Rgb24(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);
+ }
+ return FALSE;
+ }
+ case FXDIB_Argb:
+ case FXDIB_Rgb32: {
+ if ((src_format & 0xff) == 1) {
+ if (pSrcBitmap->GetPalette()) {
+ return _ConvertBuffer_1bppPlt2Rgb(dest_format, dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);
+ }
+ return _ConvertBuffer_1bppMask2Rgb(dest_format, dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top);
+ } else if ((src_format & 0xff) == 8) {
+ if (pSrcBitmap->GetPalette()) {
+ return _ConvertBuffer_8bppPlt2Rgb(dest_format, dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);
+ }
+ return _ConvertBuffer_8bppMask2Rgb(dest_format, dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top);
+ } else if ((src_format & 0xff) >= 24) {
+ if (src_format & 0x0400) {
+ return _ConvertBuffer_32bppCmyk2Rgb32(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);
+ }
+ return _ConvertBuffer_Rgb2Rgb32(dest_buf, dest_pitch, width, height, pSrcBitmap, src_left, src_top, pIccTransform);
+ }
+ return FALSE;
+ }
+ default:
+ return FALSE;
+ }
+ return FALSE;
+}
+CFX_DIBitmap* CFX_DIBSource::CloneConvert(FXDIB_Format dest_format, const FX_RECT* pClip, void* pIccTransform) const
+{
+ if(dest_format == GetFormat() && pIccTransform == NULL) {
+ return Clone(pClip);
+ }
+ if (pClip) {
+ CFX_DIBitmap* pClone = Clone(pClip);
+ if (pClone == NULL) {
+ return NULL;
+ }
+ if(!pClone->ConvertFormat(dest_format, pIccTransform)) {
+ delete pClone;
+ return NULL;
+ }
+ return pClone;
+ }
+ CFX_DIBitmap* pClone = FX_NEW CFX_DIBitmap;
+ if (!pClone) {
+ return NULL;
+ }
+ if(!pClone->Create(m_Width, m_Height, dest_format)) {
+ delete pClone;
+ return NULL;
+ }
+ FX_BOOL ret = TRUE;
+ CFX_DIBitmap* pSrcAlpha = NULL;
+ if (m_AlphaFlag & 2) {
+ pSrcAlpha = (GetFormat() == FXDIB_Argb) ? GetAlphaMask() : m_pAlphaMask;
+ if (pSrcAlpha == NULL) {
+ delete pClone;
+ return NULL;
+ }
+ }
+ if (dest_format & 0x0200) {
+ if (dest_format == FXDIB_Argb)
+ ret = pSrcAlpha ?
+ pClone->LoadChannel(FXDIB_Alpha, pSrcAlpha, FXDIB_Alpha) :
+ pClone->LoadChannel(FXDIB_Alpha, 0xff);
+ else {
+ ret = pClone->CopyAlphaMask(pSrcAlpha);
+ }
+ }
+ if (pSrcAlpha && pSrcAlpha != m_pAlphaMask) {
+ delete pSrcAlpha;
+ pSrcAlpha = NULL;
+ }
+ if (!ret) {
+ delete pClone;
+ return NULL;
+ }
+ FX_DWORD* pal_8bpp = NULL;
+ ret = ConvertBuffer(dest_format, pClone->GetBuffer(), pClone->GetPitch(), m_Width, m_Height, this, 0, 0, pal_8bpp, pIccTransform);
+ if (!ret) {
+ if (pal_8bpp) {
+ FX_Free(pal_8bpp);
+ }
+ delete pClone;
+ return NULL;
+ }
+ if (pal_8bpp) {
+ pClone->CopyPalette(pal_8bpp);
+ FX_Free(pal_8bpp);
+ pal_8bpp = NULL;
+ }
+ return pClone;
+}
+FX_BOOL CFX_DIBitmap::ConvertFormat(FXDIB_Format dest_format, void* pIccTransform)
+{
+ FXDIB_Format src_format = GetFormat();
+ if (dest_format == src_format && pIccTransform == NULL) {
+ return TRUE;
+ }
+ if (dest_format == FXDIB_8bppMask && src_format == FXDIB_8bppRgb && m_pPalette == NULL) {
+ m_AlphaFlag = 1;
+ return TRUE;
+ }
+ if (dest_format == FXDIB_Argb && src_format == FXDIB_Rgb32 && pIccTransform == NULL) {
+ m_AlphaFlag = 2;
+ for (int row = 0; row < m_Height; row ++) {
+ FX_LPBYTE scanline = m_pBuffer + row * m_Pitch + 3;
+ for (int col = 0; col < m_Width; col ++) {
+ *scanline = 0xff;
+ scanline += 4;
+ }
+ }
+ return TRUE;
+ }
+ int dest_bpp = dest_format & 0xff;
+ int dest_pitch = (dest_bpp * m_Width + 31) / 32 * 4;
+ FX_LPBYTE dest_buf = FX_AllocNL(FX_BYTE, dest_pitch * m_Height + 4);
+ if (dest_buf == NULL) {
+ return FALSE;
+ }
+ CFX_DIBitmap* pAlphaMask = NULL;
+ if (dest_format == FXDIB_Argb) {
+ FXSYS_memset8(dest_buf, 0xff, dest_pitch * m_Height + 4);
+ if (m_pAlphaMask) {
+ for (int row = 0; row < m_Height; row ++) {
+ FX_LPBYTE pDstScanline = dest_buf + row * dest_pitch + 3;
+ FX_LPCBYTE pSrcScanline = m_pAlphaMask->GetScanline(row);
+ for (int col = 0; col < m_Width; col ++) {
+ *pDstScanline = *pSrcScanline++;
+ pDstScanline += 4;
+ }
+ }
+ }
+ } else if (dest_format & 0x0200) {
+ if (src_format == FXDIB_Argb) {
+ pAlphaMask = GetAlphaMask();
+ if (pAlphaMask == NULL) {
+ FX_Free(dest_buf);
+ return FALSE;
+ }
+ } else {
+ if (m_pAlphaMask == NULL) {
+ if (!BuildAlphaMask()) {
+ FX_Free(dest_buf);
+ return FALSE;
+ }
+ pAlphaMask = m_pAlphaMask;
+ m_pAlphaMask = NULL;
+ } else {
+ pAlphaMask = m_pAlphaMask;
+ }
+ }
+ }
+ FX_BOOL ret = FALSE;
+ FX_DWORD* pal_8bpp = NULL;
+ ret = ConvertBuffer(dest_format, dest_buf, dest_pitch, m_Width, m_Height, this, 0, 0, pal_8bpp, pIccTransform);
+ if (!ret) {
+ if (pal_8bpp) {
+ FX_Free(pal_8bpp);
+ }
+ if (pAlphaMask != m_pAlphaMask) {
+ delete pAlphaMask;
+ }
+ if (dest_buf) {
+ FX_Free(dest_buf);
+ }
+ return FALSE;
+ }
+ if (m_pAlphaMask && pAlphaMask != m_pAlphaMask) {
+ delete m_pAlphaMask;
+ }
+ m_pAlphaMask = pAlphaMask;
+ if (m_pPalette) {
+ FX_Free(m_pPalette);
+ }
+ m_pPalette = pal_8bpp;
+ if (!m_bExtBuf) {
+ FX_Free(m_pBuffer);
+ }
+ m_bExtBuf = FALSE;
+ m_pBuffer = dest_buf;
+ m_bpp = (FX_BYTE)dest_format;
+ m_AlphaFlag = (FX_BYTE)(dest_format >> 8);
+ m_Pitch = dest_pitch;
+ return TRUE;
+}
diff --git a/core/src/fxge/dib/fx_dib_engine.cpp b/core/src/fxge/dib/fx_dib_engine.cpp
new file mode 100644
index 0000000000..3ddbff6409
--- /dev/null
+++ b/core/src/fxge/dib/fx_dib_engine.cpp
@@ -0,0 +1,867 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxge/fx_dib.h"
+#include "../../../include/fxge/fx_ge.h"
+#include "dib_int.h"
+#include <limits.h>
+extern int SDP_Table[513];
+void CWeightTable::Calc(int dest_len, int dest_min, int dest_max, int src_len, int src_min, int src_max, int flags)
+{
+ if (m_pWeightTables) {
+ FX_Free(m_pWeightTables);
+ m_pWeightTables = NULL;
+ }
+ double scale, base;
+ scale = FXSYS_Div((FX_FLOAT)(src_len), (FX_FLOAT)(dest_len));
+ if (dest_len < 0) {
+ base = (FX_FLOAT)(src_len);
+ } else {
+ base = 0;
+ }
+ int ext_size = flags & FXDIB_BICUBIC_INTERPOL ? 3 : 1;
+ m_ItemSize = sizeof(int) * 2 + (int)(sizeof(int) * (FXSYS_ceil(FXSYS_fabs((FX_FLOAT)scale)) + ext_size));
+ m_DestMin = dest_min;
+ if ((dest_max - dest_min) > (int)((1U << 30) - 4) / m_ItemSize) {
+ return;
+ }
+ m_pWeightTables = FX_AllocNL(FX_BYTE, (dest_max - dest_min) * m_ItemSize + 4);
+ if (m_pWeightTables == NULL) {
+ return;
+ }
+ FXSYS_memset32(m_pWeightTables, 0, sizeof(FX_BYTE) * ((dest_max - dest_min)*m_ItemSize + 4));
+ if ((flags & FXDIB_NOSMOOTH) != 0 || FXSYS_fabs((FX_FLOAT)scale) < 1.0f) {
+ for (int dest_pixel = dest_min; dest_pixel < dest_max; dest_pixel ++) {
+ PixelWeight& pixel_weights = *GetPixelWeight(dest_pixel);
+ double src_pos = dest_pixel * scale + scale / 2 + base;
+ if (flags & FXDIB_INTERPOL) {
+ pixel_weights.m_SrcStart = (int)FXSYS_floor((FX_FLOAT)src_pos - 1.0f / 2);
+ pixel_weights.m_SrcEnd = (int)FXSYS_floor((FX_FLOAT)src_pos + 1.0f / 2);
+ if (pixel_weights.m_SrcStart < src_min) {
+ pixel_weights.m_SrcStart = src_min;
+ }
+ if (pixel_weights.m_SrcEnd >= src_max) {
+ pixel_weights.m_SrcEnd = src_max - 1;
+ }
+ if (pixel_weights.m_SrcStart == pixel_weights.m_SrcEnd) {
+ pixel_weights.m_Weights[0] = 65536;
+ } else {
+ pixel_weights.m_Weights[1] = FXSYS_round((FX_FLOAT)(src_pos - pixel_weights.m_SrcStart - 1.0f / 2) * 65536);
+ pixel_weights.m_Weights[0] = 65536 - pixel_weights.m_Weights[1];
+ }
+ } else if (flags & FXDIB_BICUBIC_INTERPOL) {
+ pixel_weights.m_SrcStart = (int)FXSYS_floor((FX_FLOAT)src_pos - 1.0f / 2);
+ pixel_weights.m_SrcEnd = (int)FXSYS_floor((FX_FLOAT)src_pos + 1.0f / 2);
+ int start = pixel_weights.m_SrcStart - 1;
+ int end = pixel_weights.m_SrcEnd + 1;
+ if (start < src_min) {
+ start = src_min;
+ }
+ if (end >= src_max) {
+ end = src_max - 1;
+ }
+ if (pixel_weights.m_SrcStart < src_min) {
+ src_pos += src_min - pixel_weights.m_SrcStart;
+ pixel_weights.m_SrcStart = src_min;
+ }
+ if (pixel_weights.m_SrcEnd >= src_max) {
+ pixel_weights.m_SrcEnd = src_max - 1;
+ }
+ int weight;
+ weight = FXSYS_round((FX_FLOAT)(src_pos - pixel_weights.m_SrcStart - 1.0f / 2) * 256);
+ if (start == end) {
+ pixel_weights.m_Weights[0] = (SDP_Table[256 + weight] + SDP_Table[weight] + SDP_Table[256 - weight] + SDP_Table[512 - weight]) << 8;
+ } else if ((start == pixel_weights.m_SrcStart && (pixel_weights.m_SrcStart == pixel_weights.m_SrcEnd ||
+ end == pixel_weights.m_SrcEnd) && start < end) || (start < pixel_weights.m_SrcStart && pixel_weights.m_SrcStart == pixel_weights.m_SrcEnd && end == pixel_weights.m_SrcEnd)) {
+ if (start < pixel_weights.m_SrcStart) {
+ pixel_weights.m_Weights[0] = SDP_Table[256 + weight] << 8;
+ pixel_weights.m_Weights[1] = (SDP_Table[weight] + SDP_Table[256 - weight] + SDP_Table[512 - weight]) << 8;
+ } else {
+ if (pixel_weights.m_SrcStart == pixel_weights.m_SrcEnd) {
+ pixel_weights.m_Weights[0] = (SDP_Table[256 + weight] + SDP_Table[weight] + SDP_Table[256 - weight]) << 8;
+ pixel_weights.m_Weights[1] = SDP_Table[512 - weight] << 8;
+ } else {
+ pixel_weights.m_Weights[0] = (SDP_Table[256 + weight] + SDP_Table[weight]) << 8;
+ pixel_weights.m_Weights[1] = (SDP_Table[256 - weight] + SDP_Table[512 - weight]) << 8;
+ }
+ }
+ if (pixel_weights.m_SrcStart == pixel_weights.m_SrcEnd) {
+ pixel_weights.m_SrcEnd = end;
+ }
+ if (start < pixel_weights.m_SrcStart) {
+ pixel_weights.m_SrcStart = start;
+ }
+ } else if (start == pixel_weights.m_SrcStart &&
+ start < pixel_weights.m_SrcEnd &&
+ pixel_weights.m_SrcEnd < end) {
+ pixel_weights.m_Weights[0] = (SDP_Table[256 + weight] + SDP_Table[weight]) << 8;
+ pixel_weights.m_Weights[1] = SDP_Table[256 - weight] << 8;
+ pixel_weights.m_Weights[2] = SDP_Table[512 - weight] << 8;
+ pixel_weights.m_SrcEnd = end;
+ } else if (start < pixel_weights.m_SrcStart &&
+ pixel_weights.m_SrcStart < pixel_weights.m_SrcEnd &&
+ pixel_weights.m_SrcEnd == end) {
+ pixel_weights.m_Weights[0] = SDP_Table[256 + weight] << 8;
+ pixel_weights.m_Weights[1] = SDP_Table[weight] << 8;
+ pixel_weights.m_Weights[2] = (SDP_Table[256 - weight] + SDP_Table[512 - weight]) << 8;
+ pixel_weights.m_SrcStart = start;
+ } else {
+ pixel_weights.m_Weights[0] = SDP_Table[256 + weight] << 8;
+ pixel_weights.m_Weights[1] = SDP_Table[weight] << 8;
+ pixel_weights.m_Weights[2] = SDP_Table[256 - weight] << 8;
+ pixel_weights.m_Weights[3] = SDP_Table[512 - weight] << 8;
+ pixel_weights.m_SrcStart = start;
+ pixel_weights.m_SrcEnd = end;
+ }
+ } else {
+ pixel_weights.m_SrcStart = pixel_weights.m_SrcEnd = (int)FXSYS_floor((FX_FLOAT)src_pos);
+ if (pixel_weights.m_SrcStart < src_min) {
+ pixel_weights.m_SrcStart = src_min;
+ }
+ if (pixel_weights.m_SrcEnd >= src_max) {
+ pixel_weights.m_SrcEnd = src_max - 1;
+ }
+ pixel_weights.m_Weights[0] = 65536;
+ }
+ }
+ return;
+ }
+ for (int dest_pixel = dest_min; dest_pixel < dest_max; dest_pixel ++) {
+ PixelWeight& pixel_weights = *GetPixelWeight(dest_pixel);
+ double src_start = dest_pixel * scale + base;
+ double src_end = src_start + scale;
+ int start_i, end_i;
+ if (src_start < src_end) {
+ start_i = (int)FXSYS_floor((FX_FLOAT)src_start);
+ end_i = (int)FXSYS_ceil((FX_FLOAT)src_end);
+ } else {
+ start_i = (int)FXSYS_floor((FX_FLOAT)src_end);
+ end_i = (int)FXSYS_ceil((FX_FLOAT)src_start);
+ }
+ if (start_i < src_min) {
+ start_i = src_min;
+ }
+ if (end_i >= src_max) {
+ end_i = src_max - 1;
+ }
+ if (start_i > end_i) {
+ if (start_i >= src_max) {
+ start_i = src_max - 1;
+ }
+ pixel_weights.m_SrcStart = start_i;
+ pixel_weights.m_SrcEnd = start_i;
+ continue;
+ }
+ pixel_weights.m_SrcStart = start_i;
+ pixel_weights.m_SrcEnd = end_i;
+ for (int j = start_i; j <= end_i; j ++) {
+ double dest_start = FXSYS_Div((FX_FLOAT)(j) - base, scale);
+ double dest_end = FXSYS_Div((FX_FLOAT)(j + 1) - base, scale);
+ if (dest_start > dest_end) {
+ double temp = dest_start;
+ dest_start = dest_end;
+ dest_end = temp;
+ }
+ double area_start = dest_start > (FX_FLOAT)(dest_pixel) ? dest_start : (FX_FLOAT)(dest_pixel);
+ double area_end = dest_end > (FX_FLOAT)(dest_pixel + 1) ? (FX_FLOAT)(dest_pixel + 1) : dest_end;
+ double weight = area_start >= area_end ? 0.0f : area_end - area_start;
+ if (weight == 0 && j == end_i) {
+ pixel_weights.m_SrcEnd --;
+ break;
+ }
+ pixel_weights.m_Weights[j - start_i] = FXSYS_round((FX_FLOAT)(weight * 65536));
+ }
+ }
+}
+CStretchEngine::CStretchEngine(IFX_ScanlineComposer* pDestBitmap, FXDIB_Format dest_format,
+ int dest_width, int dest_height, const FX_RECT& clip_rect,
+ const CFX_DIBSource* pSrcBitmap, int flags)
+{
+ m_State = 0;
+ m_DestFormat = dest_format;
+ m_DestBpp = dest_format & 0xff;
+ m_SrcBpp = pSrcBitmap->GetFormat() & 0xff;
+ m_bHasAlpha = pSrcBitmap->GetFormat() & 0x200;
+ m_pSrcPalette = pSrcBitmap->GetPalette();
+ m_pDestBitmap = pDestBitmap;
+ m_DestWidth = dest_width;
+ m_DestHeight = dest_height;
+ m_pInterBuf = NULL;
+ m_pExtraAlphaBuf = NULL;
+ m_pDestMaskScanline = NULL;
+ m_DestClip = clip_rect;
+ FX_DWORD size = clip_rect.Width();
+ if (size && m_DestBpp > (int)(INT_MAX / size)) {
+ return;
+ }
+ size *= m_DestBpp;
+ if (size > INT_MAX - 31) {
+ return;
+ }
+ size += 31;
+ size = size / 32 * 4;
+ m_pDestScanline = FX_AllocNL(FX_BYTE, size);
+ if (m_pDestScanline == NULL) {
+ return;
+ }
+ FXSYS_memset32(m_pDestScanline, 0, sizeof(FX_BYTE) * size);
+ if (dest_format == FXDIB_Rgb32) {
+ FXSYS_memset8(m_pDestScanline, 255, size);
+ }
+ m_InterPitch = (m_DestClip.Width() * m_DestBpp + 31) / 32 * 4;
+ m_ExtraMaskPitch = (m_DestClip.Width() * 8 + 31) / 32 * 4;
+ m_pInterBuf = NULL;
+ m_pSource = pSrcBitmap;
+ m_SrcWidth = pSrcBitmap->GetWidth();
+ m_SrcHeight = pSrcBitmap->GetHeight();
+ m_SrcPitch = (m_SrcWidth * m_SrcBpp + 31) / 32 * 4;
+ if ((flags & FXDIB_NOSMOOTH) == 0) {
+ FX_BOOL bInterpol = flags & FXDIB_INTERPOL || flags & FXDIB_BICUBIC_INTERPOL;
+ if (!bInterpol && FXSYS_abs(dest_width) != 0 && FXSYS_abs(dest_height) < m_SrcWidth * m_SrcHeight * 8 / FXSYS_abs(dest_width)) {
+ flags = FXDIB_INTERPOL;
+ }
+ m_Flags = flags;
+ } else {
+ m_Flags = FXDIB_NOSMOOTH;
+ if (flags & FXDIB_DOWNSAMPLE) {
+ m_Flags |= FXDIB_DOWNSAMPLE;
+ }
+ }
+ double scale_x = FXSYS_Div((FX_FLOAT)(m_SrcWidth), (FX_FLOAT)(m_DestWidth));
+ double scale_y = FXSYS_Div((FX_FLOAT)(m_SrcHeight), (FX_FLOAT)(m_DestHeight));
+ double base_x = m_DestWidth > 0 ? 0.0f : (FX_FLOAT)(m_DestWidth);
+ double base_y = m_DestHeight > 0 ? 0.0f : (FX_FLOAT)(m_DestHeight);
+ double src_left = FXSYS_Mul(scale_x, (FX_FLOAT)(clip_rect.left) + base_x);
+ double src_right = FXSYS_Mul(scale_x, (FX_FLOAT)(clip_rect.right) + base_x);
+ double src_top = FXSYS_Mul(scale_y, (FX_FLOAT)(clip_rect.top) + base_y);
+ double src_bottom = FXSYS_Mul(scale_y, (FX_FLOAT)(clip_rect.bottom) + base_y);
+ if (src_left > src_right) {
+ double temp = src_left;
+ src_left = src_right;
+ src_right = temp;
+ }
+ if (src_top > src_bottom) {
+ double temp = src_top;
+ src_top = src_bottom;
+ src_bottom = temp;
+ }
+ m_SrcClip.left = (int)FXSYS_floor((FX_FLOAT)src_left);
+ m_SrcClip.right = (int)FXSYS_ceil((FX_FLOAT)src_right);
+ m_SrcClip.top = (int)FXSYS_floor((FX_FLOAT)src_top);
+ m_SrcClip.bottom = (int)FXSYS_ceil((FX_FLOAT)src_bottom);
+ FX_RECT src_rect(0, 0, m_SrcWidth, m_SrcHeight);
+ m_SrcClip.Intersect(src_rect);
+ if (m_SrcBpp == 1) {
+ if (m_DestBpp == 8) {
+ m_TransMethod = 1;
+ } else {
+ m_TransMethod = 2;
+ }
+ } else if (m_SrcBpp == 8) {
+ if (m_DestBpp == 8) {
+ if (!m_bHasAlpha) {
+ m_TransMethod = 3;
+ } else {
+ m_TransMethod = 4;
+ }
+ } else {
+ if (!m_bHasAlpha) {
+ m_TransMethod = 5;
+ } else {
+ m_TransMethod = 6;
+ }
+ }
+ } else {
+ if (!m_bHasAlpha) {
+ m_TransMethod = 7;
+ } else {
+ m_TransMethod = 8;
+ }
+ }
+}
+FX_BOOL CStretchEngine::Continue(IFX_Pause* pPause)
+{
+ while (m_State == 1) {
+ if (ContinueStretchHorz(pPause)) {
+ return TRUE;
+ }
+ m_State = 2;
+ StretchVert();
+ }
+ return FALSE;
+}
+CStretchEngine::~CStretchEngine()
+{
+ if (m_pDestScanline) {
+ FX_Free(m_pDestScanline);
+ }
+ if (m_pInterBuf) {
+ FX_Free(m_pInterBuf);
+ }
+ if (m_pExtraAlphaBuf) {
+ FX_Free(m_pExtraAlphaBuf);
+ }
+ if (m_pDestMaskScanline) {
+ FX_Free(m_pDestMaskScanline);
+ }
+}
+FX_BOOL CStretchEngine::StartStretchHorz()
+{
+ if (m_DestWidth == 0 || m_pDestScanline == NULL || m_SrcClip.Height() > (int)((1U << 29) / m_InterPitch) || m_SrcClip.Height() == 0) {
+ return FALSE;
+ }
+#ifndef _FPDFAPI_MINI_
+ m_pInterBuf = FX_AllocNL(unsigned char, m_SrcClip.Height() * m_InterPitch);
+#else
+ m_pInterBuf = FX_Alloc(unsigned char, m_SrcClip.Height() * m_InterPitch);
+#endif
+ if (m_pInterBuf == NULL) {
+ return FALSE;
+ }
+ if (m_pSource && m_bHasAlpha && m_pSource->m_pAlphaMask) {
+ m_pExtraAlphaBuf = FX_Alloc(unsigned char, m_SrcClip.Height() * m_ExtraMaskPitch);
+ if (!m_pExtraAlphaBuf) {
+ return FALSE;
+ }
+ FX_DWORD size = (m_DestClip.Width() * 8 + 31) / 32 * 4;
+ m_pDestMaskScanline = FX_AllocNL(unsigned char, size);
+ if (!m_pDestMaskScanline) {
+ return FALSE;
+ }
+ }
+ m_WeightTable.Calc(m_DestWidth, m_DestClip.left, m_DestClip.right, m_SrcWidth, m_SrcClip.left, m_SrcClip.right, m_Flags);
+ if (m_WeightTable.m_pWeightTables == NULL) {
+ return FALSE;
+ }
+ m_CurRow = m_SrcClip.top;
+ m_State = 1;
+ return TRUE;
+}
+#define FX_STRECH_PAUSE_ROWS 10
+FX_BOOL CStretchEngine::ContinueStretchHorz(IFX_Pause* pPause)
+{
+ if (!m_DestWidth) {
+ return 0;
+ }
+ if (m_pSource->SkipToScanline(m_CurRow, pPause)) {
+ return TRUE;
+ }
+ int Bpp = m_DestBpp / 8;
+ int rows_to_go = FX_STRECH_PAUSE_ROWS;
+ for (; m_CurRow < m_SrcClip.bottom; m_CurRow ++) {
+ if (rows_to_go == 0) {
+ if (pPause && pPause->NeedToPauseNow()) {
+ return TRUE;
+ } else {
+ rows_to_go = FX_STRECH_PAUSE_ROWS;
+ }
+ }
+ FX_LPCBYTE src_scan = m_pSource->GetScanline(m_CurRow);
+ FX_LPBYTE dest_scan = m_pInterBuf + (m_CurRow - m_SrcClip.top) * m_InterPitch;
+ FX_LPCBYTE src_scan_mask = NULL;
+ FX_LPBYTE dest_scan_mask = NULL;
+ if (m_pExtraAlphaBuf) {
+ src_scan_mask = m_pSource->m_pAlphaMask->GetScanline(m_CurRow);
+ dest_scan_mask = m_pExtraAlphaBuf + (m_CurRow - m_SrcClip.top) * m_ExtraMaskPitch;
+ }
+ switch (m_TransMethod) {
+ case 1:
+ case 2: {
+ for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {
+ PixelWeight* pPixelWeights = m_WeightTable.GetPixelWeight(col);
+ int dest_a = 0;
+ for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {
+ int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];
+ if (src_scan[j / 8] & (1 << (7 - j % 8))) {
+ dest_a += pixel_weight * 255;
+ }
+ }
+ if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
+ dest_a = dest_a < 0 ? 0 : dest_a > 16711680 ? 16711680 : dest_a;
+ }
+ *dest_scan++ = (FX_BYTE)(dest_a >> 16);
+ }
+ break;
+ }
+ case 3: {
+ for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {
+ PixelWeight* pPixelWeights = m_WeightTable.GetPixelWeight(col);
+ int dest_a = 0;
+ for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {
+ int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];
+ dest_a += pixel_weight * src_scan[j];
+ }
+ if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
+ dest_a = dest_a < 0 ? 0 : dest_a > 16711680 ? 16711680 : dest_a;
+ }
+ *dest_scan++ = (FX_BYTE)(dest_a >> 16);
+ }
+ break;
+ }
+ case 4: {
+ for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {
+ PixelWeight* pPixelWeights = m_WeightTable.GetPixelWeight(col);
+ int dest_a = 0, dest_r = 0;
+ for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {
+ int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];
+ pixel_weight = pixel_weight * src_scan_mask[j] / 255;
+ dest_r += pixel_weight * src_scan[j];
+ dest_a += pixel_weight;
+ }
+ if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
+ dest_r = dest_r < 0 ? 0 : dest_r > 16711680 ? 16711680 : dest_r;
+ dest_a = dest_a < 0 ? 0 : dest_a > 65536 ? 65536 : dest_a;
+ }
+ *dest_scan++ = (FX_BYTE)(dest_r >> 16);
+ *dest_scan_mask++ = (FX_BYTE)((dest_a * 255) >> 16);
+ }
+ break;
+ }
+ case 5: {
+ for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {
+ PixelWeight* pPixelWeights = m_WeightTable.GetPixelWeight(col);
+ int dest_r_y = 0, dest_g_m = 0, dest_b_c = 0, dest_k = 0;
+ for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {
+ int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];
+ unsigned long argb_cmyk = m_pSrcPalette[src_scan[j]];
+ if (m_DestFormat == FXDIB_Rgb) {
+ dest_r_y += pixel_weight * (FX_BYTE)(argb_cmyk >> 16);
+ dest_g_m += pixel_weight * (FX_BYTE)(argb_cmyk >> 8);
+ dest_b_c += pixel_weight * (FX_BYTE)argb_cmyk;
+ } else {
+ dest_b_c += pixel_weight * (FX_BYTE)(argb_cmyk >> 24);
+ dest_g_m += pixel_weight * (FX_BYTE)(argb_cmyk >> 16);
+ dest_r_y += pixel_weight * (FX_BYTE)(argb_cmyk >> 8);
+ }
+ }
+ if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
+ dest_r_y = dest_r_y < 0 ? 0 : dest_r_y > 16711680 ? 16711680 : dest_r_y;
+ dest_g_m = dest_g_m < 0 ? 0 : dest_g_m > 16711680 ? 16711680 : dest_g_m;
+ dest_b_c = dest_b_c < 0 ? 0 : dest_b_c > 16711680 ? 16711680 : dest_b_c;
+ }
+ *dest_scan++ = (FX_BYTE)(dest_b_c >> 16);
+ *dest_scan++ = (FX_BYTE)(dest_g_m >> 16);
+ *dest_scan++ = (FX_BYTE)(dest_r_y >> 16);
+ }
+ break;
+ }
+ case 6: {
+ for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {
+ PixelWeight* pPixelWeights = m_WeightTable.GetPixelWeight(col);
+ int dest_a = 0, dest_r_y = 0, dest_g_m = 0, dest_b_c = 0, dest_k = 0;
+ for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {
+ int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];
+ pixel_weight = pixel_weight * src_scan_mask[j] / 255;
+ unsigned long argb_cmyk = m_pSrcPalette[src_scan[j]];
+ if (m_DestFormat == FXDIB_Rgba) {
+ dest_r_y += pixel_weight * (FX_BYTE)(argb_cmyk >> 16);
+ dest_g_m += pixel_weight * (FX_BYTE)(argb_cmyk >> 8);
+ dest_b_c += pixel_weight * (FX_BYTE)argb_cmyk;
+ } else {
+ dest_b_c += pixel_weight * (FX_BYTE)(argb_cmyk >> 24);
+ dest_g_m += pixel_weight * (FX_BYTE)(argb_cmyk >> 16);
+ dest_r_y += pixel_weight * (FX_BYTE)(argb_cmyk >> 8);
+ }
+ dest_a += pixel_weight;
+ }
+ if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
+ dest_k = dest_k < 0 ? 0 : dest_k > 16711680 ? 16711680 : dest_k;
+ dest_b_c = dest_b_c < 0 ? 0 : dest_b_c > 16711680 ? 16711680 : dest_b_c;
+ dest_g_m = dest_g_m < 0 ? 0 : dest_g_m > 16711680 ? 16711680 : dest_g_m;
+ dest_r_y = dest_r_y < 0 ? 0 : dest_r_y > 16711680 ? 16711680 : dest_r_y;
+ dest_a = dest_a < 0 ? 0 : dest_a > 65536 ? 65536 : dest_a;
+ }
+ *dest_scan++ = (FX_BYTE)(dest_b_c >> 16);
+ *dest_scan++ = (FX_BYTE)(dest_g_m >> 16);
+ *dest_scan++ = (FX_BYTE)(dest_r_y >> 16);
+ *dest_scan_mask++ = (FX_BYTE)((dest_a * 255) >> 16);
+ }
+ break;
+ }
+ case 7: {
+ for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {
+ PixelWeight* pPixelWeights = m_WeightTable.GetPixelWeight(col);
+ int dest_r_y = 0, dest_g_m = 0, dest_b_c = 0, dest_k = 0;
+ for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {
+ int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];
+ FX_LPCBYTE src_pixel = src_scan + j * Bpp;
+ dest_b_c += pixel_weight * (*src_pixel++);
+ dest_g_m += pixel_weight * (*src_pixel++);
+ dest_r_y += pixel_weight * (*src_pixel);
+ }
+ if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
+ dest_b_c = dest_b_c < 0 ? 0 : dest_b_c > 16711680 ? 16711680 : dest_b_c;
+ dest_g_m = dest_g_m < 0 ? 0 : dest_g_m > 16711680 ? 16711680 : dest_g_m;
+ dest_r_y = dest_r_y < 0 ? 0 : dest_r_y > 16711680 ? 16711680 : dest_r_y;
+ }
+ *dest_scan++ = (FX_BYTE)((dest_b_c) >> 16);
+ *dest_scan++ = (FX_BYTE)((dest_g_m) >> 16);
+ *dest_scan++ = (FX_BYTE)((dest_r_y) >> 16);
+ dest_scan += Bpp - 3;
+ }
+ break;
+ }
+ case 8: {
+ for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {
+ PixelWeight* pPixelWeights = m_WeightTable.GetPixelWeight(col);
+ int dest_a = 0, dest_r_y = 0, dest_g_m = 0, dest_b_c = 0, dest_k = 0;
+ for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {
+ int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];
+ FX_LPCBYTE src_pixel = src_scan + j * Bpp;
+ if (m_DestFormat == FXDIB_Argb) {
+ pixel_weight = pixel_weight * src_pixel[3] / 255;
+ } else {
+ pixel_weight = pixel_weight * src_scan_mask[j] / 255;
+ }
+ dest_b_c += pixel_weight * (*src_pixel++);
+ dest_g_m += pixel_weight * (*src_pixel++);
+ dest_r_y += pixel_weight * (*src_pixel);
+ dest_a += pixel_weight;
+ }
+ if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
+ dest_r_y = dest_r_y < 0 ? 0 : dest_r_y > 16711680 ? 16711680 : dest_r_y;
+ dest_g_m = dest_g_m < 0 ? 0 : dest_g_m > 16711680 ? 16711680 : dest_g_m;
+ dest_b_c = dest_b_c < 0 ? 0 : dest_b_c > 16711680 ? 16711680 : dest_b_c;
+ dest_a = dest_a < 0 ? 0 : dest_a > 65536 ? 65536 : dest_a;
+ }
+ *dest_scan++ = (FX_BYTE)((dest_b_c) >> 16);
+ *dest_scan++ = (FX_BYTE)((dest_g_m) >> 16);
+ *dest_scan++ = (FX_BYTE)((dest_r_y) >> 16);
+ if (m_DestFormat == FXDIB_Argb) {
+ *dest_scan = (FX_BYTE)((dest_a * 255) >> 16);
+ }
+ if (dest_scan_mask) {
+ *dest_scan_mask++ = (FX_BYTE)((dest_a * 255) >> 16);
+ }
+ dest_scan += Bpp - 3;
+ }
+ break;
+ }
+ }
+ rows_to_go --;
+ }
+ return FALSE;
+}
+void CStretchEngine::StretchVert()
+{
+ if (m_DestHeight == 0) {
+ return;
+ }
+ CWeightTable table;
+ table.Calc(m_DestHeight, m_DestClip.top, m_DestClip.bottom, m_SrcHeight, m_SrcClip.top, m_SrcClip.bottom, m_Flags);
+ if (table.m_pWeightTables == NULL) {
+ return;
+ }
+ int DestBpp = m_DestBpp / 8;
+ for (int row = m_DestClip.top; row < m_DestClip.bottom; row ++) {
+ unsigned char* dest_scan = m_pDestScanline;
+ unsigned char* dest_sacn_mask = m_pDestMaskScanline;
+ PixelWeight* pPixelWeights = table.GetPixelWeight(row);
+ switch(m_TransMethod) {
+ case 1:
+ case 2:
+ case 3: {
+ for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {
+ unsigned char* src_scan = m_pInterBuf + (col - m_DestClip.left) * DestBpp;
+ int dest_a = 0;
+ for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {
+ int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];
+ dest_a += pixel_weight * src_scan[(j - m_SrcClip.top) * m_InterPitch];
+ }
+ if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
+ dest_a = dest_a < 0 ? 0 : dest_a > 16711680 ? 16711680 : dest_a;
+ }
+ *dest_scan = (FX_BYTE)(dest_a >> 16);
+ dest_scan += DestBpp;
+ }
+ break;
+ }
+ case 4: {
+ for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {
+ unsigned char* src_scan = m_pInterBuf + (col - m_DestClip.left) * DestBpp;
+ unsigned char* src_scan_mask = m_pExtraAlphaBuf + (col - m_DestClip.left);
+ int dest_a = 0, dest_k = 0;
+ for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {
+ int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];
+ dest_k += pixel_weight * src_scan[(j - m_SrcClip.top) * m_InterPitch];
+ dest_a += pixel_weight * src_scan_mask[(j - m_SrcClip.top) * m_ExtraMaskPitch];
+ }
+ if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
+ dest_k = dest_k < 0 ? 0 : dest_k > 16711680 ? 16711680 : dest_k;
+ dest_a = dest_a < 0 ? 0 : dest_a > 16711680 ? 16711680 : dest_a;
+ }
+ *dest_scan = (FX_BYTE)(dest_k >> 16);
+ dest_scan += DestBpp;
+ *dest_sacn_mask++ = (FX_BYTE)(dest_a >> 16);
+ }
+ break;
+ }
+ case 5:
+ case 7: {
+ for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {
+ unsigned char* src_scan = m_pInterBuf + (col - m_DestClip.left) * DestBpp;
+ int dest_r_y = 0, dest_g_m = 0, dest_b_c = 0, dest_k = 0;
+ for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {
+ int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];
+ FX_LPCBYTE src_pixel = src_scan + (j - m_SrcClip.top) * m_InterPitch;
+ dest_b_c += pixel_weight * (*src_pixel++);
+ dest_g_m += pixel_weight * (*src_pixel++);
+ dest_r_y += pixel_weight * (*src_pixel);
+ }
+ if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
+ dest_r_y = dest_r_y < 0 ? 0 : dest_r_y > 16711680 ? 16711680 : dest_r_y;
+ dest_g_m = dest_g_m < 0 ? 0 : dest_g_m > 16711680 ? 16711680 : dest_g_m;
+ dest_b_c = dest_b_c < 0 ? 0 : dest_b_c > 16711680 ? 16711680 : dest_b_c;
+ }
+ dest_scan[0] = (FX_BYTE)((dest_b_c) >> 16);
+ dest_scan[1] = (FX_BYTE)((dest_g_m) >> 16);
+ dest_scan[2] = (FX_BYTE)((dest_r_y) >> 16);
+ dest_scan += DestBpp;
+ }
+ break;
+ }
+ case 6:
+ case 8: {
+ for (int col = m_DestClip.left; col < m_DestClip.right; col ++) {
+ unsigned char* src_scan = m_pInterBuf + (col - m_DestClip.left) * DestBpp;
+ unsigned char* src_scan_mask = NULL;
+ if (m_DestFormat != FXDIB_Argb) {
+ src_scan_mask = m_pExtraAlphaBuf + (col - m_DestClip.left);
+ }
+ int dest_a = 0, dest_k = 0, dest_r_y = 0, dest_g_m = 0, dest_b_c = 0;
+ for (int j = pPixelWeights->m_SrcStart; j <= pPixelWeights->m_SrcEnd; j ++) {
+ int pixel_weight = pPixelWeights->m_Weights[j - pPixelWeights->m_SrcStart];
+ FX_LPCBYTE src_pixel = src_scan + (j - m_SrcClip.top) * m_InterPitch;
+ int mask_v = 255;
+ if (src_scan_mask) {
+ mask_v = src_scan_mask[(j - m_SrcClip.top) * m_ExtraMaskPitch];
+ }
+ dest_b_c += pixel_weight * (*src_pixel++);
+ dest_g_m += pixel_weight * (*src_pixel++);
+ dest_r_y += pixel_weight * (*src_pixel);
+ if (m_DestFormat == FXDIB_Argb) {
+ dest_a += pixel_weight * (*(src_pixel + 1));
+ } else {
+ dest_a += pixel_weight * mask_v;
+ }
+ }
+ if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
+ dest_r_y = dest_r_y < 0 ? 0 : dest_r_y > 16711680 ? 16711680 : dest_r_y;
+ dest_g_m = dest_g_m < 0 ? 0 : dest_g_m > 16711680 ? 16711680 : dest_g_m;
+ dest_b_c = dest_b_c < 0 ? 0 : dest_b_c > 16711680 ? 16711680 : dest_b_c;
+ dest_a = dest_a < 0 ? 0 : dest_a > 16711680 ? 16711680 : dest_a;
+ }
+ if (dest_a) {
+ int r = ((FX_DWORD)dest_r_y) * 255 / dest_a;
+ int g = ((FX_DWORD)dest_g_m) * 255 / dest_a;
+ int b = ((FX_DWORD)dest_b_c) * 255 / dest_a;
+ dest_scan[0] = b > 255 ? 255 : b < 0 ? 0 : b;
+ dest_scan[1] = g > 255 ? 255 : g < 0 ? 0 : g;
+ dest_scan[2] = r > 255 ? 255 : r < 0 ? 0 : r;
+ }
+ if (m_DestFormat == FXDIB_Argb) {
+ dest_scan[3] = (FX_BYTE)((dest_a) >> 16);
+ } else {
+ *dest_sacn_mask = (FX_BYTE)((dest_a) >> 16);
+ }
+ dest_scan += DestBpp;
+ if (dest_sacn_mask) {
+ dest_sacn_mask++;
+ }
+ }
+ break;
+ }
+ }
+ m_pDestBitmap->ComposeScanline(row - m_DestClip.top, m_pDestScanline, m_pDestMaskScanline);
+ }
+}
+CFX_ImageStretcher::CFX_ImageStretcher()
+{
+ m_pScanline = NULL;
+ m_pStretchEngine = NULL;
+ m_pMaskScanline = NULL;
+}
+CFX_ImageStretcher::~CFX_ImageStretcher()
+{
+ if (m_pScanline) {
+ FX_Free(m_pScanline);
+ }
+ if (m_pStretchEngine) {
+ delete m_pStretchEngine;
+ }
+ if (m_pMaskScanline) {
+ FX_Free(m_pMaskScanline);
+ }
+}
+FXDIB_Format _GetStretchedFormat(const CFX_DIBSource* pSrc)
+{
+ FXDIB_Format format = pSrc->GetFormat();
+ if (format == FXDIB_1bppMask) {
+ format = FXDIB_8bppMask;
+ } else if (format == FXDIB_1bppRgb) {
+ format = FXDIB_8bppRgb;
+ } else if (format == FXDIB_8bppRgb) {
+ if (pSrc->GetPalette()) {
+ format = FXDIB_Rgb;
+ }
+ }
+ return format;
+}
+FX_BOOL CFX_ImageStretcher::Start(IFX_ScanlineComposer* pDest,
+ const CFX_DIBSource* pSource, int dest_width, int dest_height,
+ const FX_RECT& rect, FX_DWORD flags)
+{
+ m_DestFormat = _GetStretchedFormat(pSource);
+ m_DestBPP = m_DestFormat & 0xff;
+ m_pDest = pDest;
+ m_pSource = pSource;
+ m_DestWidth = dest_width;
+ m_DestHeight = dest_height;
+ m_ClipRect = rect;
+ m_Flags = flags;
+ if (pSource->GetFormat() == FXDIB_1bppRgb && pSource->GetPalette()) {
+ FX_ARGB pal[256];
+ int a0, r0, g0, b0, a1, r1, g1, b1;
+ ArgbDecode(pSource->GetPaletteEntry(0), a0, r0, g0, b0);
+ ArgbDecode(pSource->GetPaletteEntry(1), a1, r1, g1, b1);
+ for (int i = 0; i < 256; i ++) {
+ int a = a0 + (a1 - a0) * i / 255;
+ int r = r0 + (r1 - r0) * i / 255;
+ int g = g0 + (g1 - g0) * i / 255;
+ int b = b0 + (b1 - b0) * i / 255;
+ pal[i] = ArgbEncode(a, r, g, b);
+ }
+ if (!pDest->SetInfo(rect.Width(), rect.Height(), m_DestFormat, pal)) {
+ return FALSE;
+ }
+ } else if (pSource->GetFormat() == FXDIB_1bppCmyk && pSource->GetPalette()) {
+ FX_CMYK pal[256];
+ int c0, m0, y0, k0, c1, m1, y1, k1;
+ CmykDecode(pSource->GetPaletteEntry(0), c0, m0, y0, k0);
+ CmykDecode(pSource->GetPaletteEntry(1), c1, m1, y1, k1);
+ for (int i = 0; i < 256; i ++) {
+ int c = c0 + (c1 - c0) * i / 255;
+ int m = m0 + (m1 - m0) * i / 255;
+ int y = y0 + (y1 - y0) * i / 255;
+ int k = k0 + (k1 - k0) * i / 255;
+ pal[i] = CmykEncode(c, m, y, k);
+ }
+ if (!pDest->SetInfo(rect.Width(), rect.Height(), m_DestFormat, pal)) {
+ return FALSE;
+ }
+ } else if (!pDest->SetInfo(rect.Width(), rect.Height(), m_DestFormat, NULL)) {
+ return FALSE;
+ }
+ if (flags & FXDIB_DOWNSAMPLE) {
+ return StartQuickStretch();
+ } else {
+ return StartStretch();
+ }
+}
+FX_BOOL CFX_ImageStretcher::Continue(IFX_Pause* pPause)
+{
+ if (m_Flags & FXDIB_DOWNSAMPLE) {
+ return ContinueQuickStretch(pPause);
+ } else {
+ return ContinueStretch(pPause);
+ }
+}
+#ifndef _FPDFAPI_MINI_
+#define MAX_PROGRESSIVE_STRETCH_PIXELS 1000000
+#else
+#define MAX_PROGRESSIVE_STRETCH_PIXELS 100000
+#endif
+FX_BOOL CFX_ImageStretcher::StartStretch()
+{
+ m_pStretchEngine = FX_NEW CStretchEngine(m_pDest, m_DestFormat, m_DestWidth, m_DestHeight, m_ClipRect, m_pSource, m_Flags);
+ if (!m_pStretchEngine) {
+ return FALSE;
+ }
+ m_pStretchEngine->StartStretchHorz();
+ if (m_pSource->GetWidth() * m_pSource->GetHeight() < MAX_PROGRESSIVE_STRETCH_PIXELS) {
+ m_pStretchEngine->Continue(NULL);
+ return FALSE;
+ }
+ return TRUE;
+}
+FX_BOOL CFX_ImageStretcher::ContinueStretch(IFX_Pause* pPause)
+{
+ if (m_pStretchEngine == NULL) {
+ return FALSE;
+ }
+ return m_pStretchEngine->Continue(pPause);
+}
+FX_BOOL CFX_ImageStretcher::StartQuickStretch()
+{
+#ifdef _FPDFAPI_MINI_
+ m_pSource->SetDownSampleSize(m_DestWidth, m_DestHeight);
+#endif
+ m_bFlipX = FALSE;
+ m_bFlipY = FALSE;
+ if (m_DestWidth < 0) {
+ m_bFlipX = TRUE;
+ m_DestWidth = -m_DestWidth;
+ }
+ if (m_DestHeight < 0) {
+ m_bFlipY = TRUE;
+ m_DestHeight = -m_DestHeight;
+ }
+ m_LineIndex = 0;
+ FX_DWORD size = m_ClipRect.Width();
+ if (size && m_DestBPP > (int)(INT_MAX / size)) {
+ return FALSE;
+ }
+ size *= m_DestBPP;
+ m_pScanline = FX_Alloc(FX_BYTE, (size / 8 + 3) / 4 * 4);
+ if (!m_pScanline) {
+ return FALSE;
+ }
+ if (m_pSource->m_pAlphaMask) {
+ m_pMaskScanline = FX_Alloc(FX_BYTE, (m_ClipRect.Width() + 3) / 4 * 4);
+ if (!m_pMaskScanline) {
+ return FALSE;
+ }
+ }
+ if (m_pSource->GetWidth() * m_pSource->GetHeight() < MAX_PROGRESSIVE_STRETCH_PIXELS) {
+ ContinueQuickStretch(NULL);
+ return FALSE;
+ }
+ return TRUE;
+}
+FX_BOOL CFX_ImageStretcher::ContinueQuickStretch(IFX_Pause* pPause)
+{
+ if (m_pScanline == NULL) {
+ return FALSE;
+ }
+ int result_width = m_ClipRect.Width(), result_height = m_ClipRect.Height();
+ int src_width = m_pSource->GetWidth(), src_height = m_pSource->GetHeight();
+ for (; m_LineIndex < result_height; m_LineIndex ++) {
+ int dest_y, src_y;
+ if (m_bFlipY) {
+ dest_y = result_height - m_LineIndex - 1;
+ src_y = (m_DestHeight - (dest_y + m_ClipRect.top) - 1) * src_height / m_DestHeight;
+ } else {
+ dest_y = m_LineIndex;
+ src_y = (dest_y + m_ClipRect.top) * src_height / m_DestHeight;
+ }
+ if (src_y >= src_height) {
+ src_y = src_height - 1;
+ }
+ if (src_y < 0) {
+ src_y = 0;
+ }
+ if (m_pSource->SkipToScanline(src_y, pPause)) {
+ return TRUE;
+ }
+ m_pSource->DownSampleScanline(src_y, m_pScanline, m_DestBPP, m_DestWidth, m_bFlipX, m_ClipRect.left, result_width);
+ FX_LPBYTE scan_extra_alpha = NULL;
+ if (m_pMaskScanline) {
+ m_pSource->m_pAlphaMask->DownSampleScanline(src_y, m_pMaskScanline, 1, m_DestWidth, m_bFlipX, m_ClipRect.left, result_width);
+ }
+ m_pDest->ComposeScanline(dest_y, m_pScanline, m_pMaskScanline);
+ }
+ return FALSE;
+}
diff --git a/core/src/fxge/dib/fx_dib_main.cpp b/core/src/fxge/dib/fx_dib_main.cpp
new file mode 100644
index 0000000000..0953f2d2e5
--- /dev/null
+++ b/core/src/fxge/dib/fx_dib_main.cpp
@@ -0,0 +1,1734 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxge/fx_dib.h"
+#include "../../../include/fxge/fx_ge.h"
+#include "../../../include/fxcodec/fx_codec.h"
+#include "dib_int.h"
+#include <limits.h>
+FX_BOOL ConvertBuffer(FXDIB_Format dest_format, FX_LPBYTE dest_buf, int dest_pitch, int width, int height,
+ const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, FX_DWORD*& pal, void* pIccTransform);
+void CmykDecode(FX_DWORD cmyk, int& c, int& m, int& y, int& k)
+{
+ c = FXSYS_GetCValue(cmyk);
+ m = FXSYS_GetMValue(cmyk);
+ y = FXSYS_GetYValue(cmyk);
+ k = FXSYS_GetKValue(cmyk);
+}
+void ArgbDecode(FX_DWORD argb, int& a, int& r, int& g, int& b)
+{
+ a = FXARGB_A(argb);
+ r = FXARGB_R(argb);
+ g = FXARGB_G(argb);
+ b = FXARGB_B(argb);
+}
+void ArgbDecode(FX_DWORD argb, int& a, FX_COLORREF& rgb)
+{
+ a = FXARGB_A(argb);
+ rgb = FXSYS_RGB(FXARGB_R(argb), FXARGB_G(argb), FXARGB_B(argb));
+}
+FX_DWORD ArgbEncode(int a, FX_COLORREF rgb)
+{
+ return FXARGB_MAKE(a, FXSYS_GetRValue(rgb), FXSYS_GetGValue(rgb), FXSYS_GetBValue(rgb));
+}
+CFX_DIBSource::CFX_DIBSource()
+{
+ m_bpp = 0;
+ m_AlphaFlag = 0;
+ m_Width = m_Height = 0;
+ m_Pitch = 0;
+ m_pPalette = NULL;
+ m_pAlphaMask = NULL;
+}
+CFX_DIBSource::~CFX_DIBSource()
+{
+ if (m_pPalette) {
+ FX_Free(m_pPalette);
+ }
+ if (m_pAlphaMask) {
+ delete m_pAlphaMask;
+ }
+}
+CFX_DIBitmap::CFX_DIBitmap()
+{
+ m_bExtBuf = FALSE;
+ m_pBuffer = NULL;
+ m_pPalette = NULL;
+}
+#define _MAX_OOM_LIMIT_ 12000000
+FX_BOOL CFX_DIBitmap::Create(int width, int height, FXDIB_Format format, FX_LPBYTE pBuffer, int pitch)
+{
+ m_pBuffer = NULL;
+ m_bpp = (FX_BYTE)format;
+ m_AlphaFlag = (FX_BYTE)(format >> 8);
+ m_Width = m_Height = m_Pitch = 0;
+ if (width <= 0 || height <= 0 || pitch < 0) {
+ return FALSE;
+ }
+ if ((INT_MAX - 31) / width < (format & 0xff)) {
+ return FALSE;
+ }
+ if (!pitch) {
+ pitch = (width * (format & 0xff) + 31) / 32 * 4;
+ }
+ if ((1 << 30) / pitch < height) {
+ return FALSE;
+ }
+ if (pBuffer) {
+ m_pBuffer = pBuffer;
+ m_bExtBuf = TRUE;
+ } else {
+ int size = pitch * height + 4;
+ int oomlimit = _MAX_OOM_LIMIT_;
+ if (oomlimit >= 0 && size >= oomlimit) {
+ m_pBuffer = FX_AllocNL(FX_BYTE, size);
+ } else {
+ m_pBuffer = FX_Alloc(FX_BYTE, size);
+ }
+ if (m_pBuffer == NULL) {
+ return FALSE;
+ }
+ FXSYS_memset32(m_pBuffer, 0, sizeof (FX_BYTE) * size);
+ }
+ m_Width = width;
+ m_Height = height;
+ m_Pitch = pitch;
+ if (HasAlpha() && format != FXDIB_Argb) {
+ FX_BOOL ret = TRUE;
+ ret = BuildAlphaMask();
+ if (!ret) {
+ if (!m_bExtBuf && m_pBuffer) {
+ FX_Free(m_pBuffer);
+ m_pBuffer = NULL;
+ m_Width = m_Height = m_Pitch = 0;
+ return FALSE;
+ }
+ }
+ }
+ return TRUE;
+}
+FX_BOOL CFX_DIBitmap::Copy(const CFX_DIBSource* pSrc)
+{
+ if (m_pBuffer) {
+ return FALSE;
+ }
+ if (!Create(pSrc->GetWidth(), pSrc->GetHeight(), pSrc->GetFormat())) {
+ return FALSE;
+ }
+ CopyPalette(pSrc->GetPalette());
+ CopyAlphaMask(pSrc->m_pAlphaMask);
+ for (int row = 0; row < pSrc->GetHeight(); row ++) {
+ FXSYS_memcpy32(m_pBuffer + row * m_Pitch, pSrc->GetScanline(row), m_Pitch);
+ }
+ return TRUE;
+}
+CFX_DIBitmap::~CFX_DIBitmap()
+{
+ if (m_pBuffer && !m_bExtBuf) {
+ FX_Free(m_pBuffer);
+ }
+ m_pBuffer = NULL;
+}
+void CFX_DIBitmap::TakeOver(CFX_DIBitmap* pSrcBitmap)
+{
+ if (m_pBuffer && !m_bExtBuf) {
+ FX_Free(m_pBuffer);
+ }
+ if (m_pPalette) {
+ FX_Free(m_pPalette);
+ }
+ if (m_pAlphaMask) {
+ delete m_pAlphaMask;
+ }
+ m_pBuffer = pSrcBitmap->m_pBuffer;
+ m_pPalette = pSrcBitmap->m_pPalette;
+ m_pAlphaMask = pSrcBitmap->m_pAlphaMask;
+ pSrcBitmap->m_pBuffer = NULL;
+ pSrcBitmap->m_pPalette = NULL;
+ pSrcBitmap->m_pAlphaMask = NULL;
+ m_bpp = pSrcBitmap->m_bpp;
+ m_bExtBuf = pSrcBitmap->m_bExtBuf;
+ m_AlphaFlag = pSrcBitmap->m_AlphaFlag;
+ m_Width = pSrcBitmap->m_Width;
+ m_Height = pSrcBitmap->m_Height;
+ m_Pitch = pSrcBitmap->m_Pitch;
+}
+CFX_DIBitmap* CFX_DIBSource::Clone(const FX_RECT* pClip) const
+{
+ FX_RECT rect(0, 0, m_Width, m_Height);
+ if (pClip) {
+ rect.Intersect(*pClip);
+ if (rect.IsEmpty()) {
+ return NULL;
+ }
+ }
+ CFX_DIBitmap* pNewBitmap = FX_NEW CFX_DIBitmap;
+ if (!pNewBitmap) {
+ return NULL;
+ }
+ if (!pNewBitmap->Create(rect.Width(), rect.Height(), GetFormat())) {
+ delete pNewBitmap;
+ return NULL;
+ }
+ pNewBitmap->CopyPalette(m_pPalette);
+ pNewBitmap->CopyAlphaMask(m_pAlphaMask, pClip);
+ if (GetBPP() == 1 && rect.left % 8 != 0) {
+ int left_shift = rect.left % 32;
+ int right_shift = 32 - left_shift;
+ int dword_count = pNewBitmap->m_Pitch / 4;
+ for (int row = rect.top; row < rect.bottom; row ++) {
+ FX_DWORD* src_scan = (FX_DWORD*)GetScanline(row) + rect.left / 32;
+ FX_DWORD* dest_scan = (FX_DWORD*)pNewBitmap->GetScanline(row - rect.top);
+ for (int i = 0; i < dword_count; i ++) {
+ dest_scan[i] = (src_scan[i] << left_shift) | (src_scan[i + 1] >> right_shift);
+ }
+ }
+ } else {
+ int copy_len = (pNewBitmap->GetWidth() * pNewBitmap->GetBPP() + 7) / 8;
+ if (m_Pitch < (FX_DWORD)copy_len) {
+ copy_len = m_Pitch;
+ }
+ for (int row = rect.top; row < rect.bottom; row ++) {
+ FX_LPCBYTE src_scan = GetScanline(row) + rect.left * m_bpp / 8;
+ FX_LPBYTE dest_scan = (FX_LPBYTE)pNewBitmap->GetScanline(row - rect.top);
+ FXSYS_memcpy32(dest_scan, src_scan, copy_len);
+ }
+ }
+ return pNewBitmap;
+}
+void CFX_DIBSource::BuildPalette()
+{
+ if (m_pPalette) {
+ return;
+ }
+ if (GetBPP() == 1) {
+ m_pPalette = FX_Alloc(FX_DWORD, 2);
+ if (!m_pPalette) {
+ return;
+ }
+ if(IsCmykImage()) {
+ m_pPalette[0] = 0xff;
+ m_pPalette[1] = 0;
+ } else {
+ m_pPalette[0] = 0xff000000;
+ m_pPalette[1] = 0xffffffff;
+ }
+ } else if (GetBPP() == 8) {
+ m_pPalette = FX_Alloc(FX_DWORD, 256);
+ if (!m_pPalette) {
+ return;
+ }
+ if(IsCmykImage()) {
+ for (int i = 0; i < 256; i ++) {
+ m_pPalette[i] = 0xff - i;
+ }
+ } else {
+ for (int i = 0; i < 256; i ++) {
+ m_pPalette[i] = 0xff000000 | (i * 0x10101);
+ }
+ }
+ }
+}
+FX_BOOL CFX_DIBSource::BuildAlphaMask()
+{
+ if (m_pAlphaMask) {
+ return TRUE;
+ }
+ m_pAlphaMask = FX_NEW CFX_DIBitmap;
+ if (!m_pAlphaMask) {
+ return FALSE;
+ }
+ if (!m_pAlphaMask->Create(m_Width, m_Height, FXDIB_8bppMask)) {
+ delete m_pAlphaMask;
+ m_pAlphaMask = NULL;
+ return FALSE;
+ }
+ FXSYS_memset8(m_pAlphaMask->GetBuffer(), 0xff, m_pAlphaMask->GetHeight()*m_pAlphaMask->GetPitch());
+ return TRUE;
+}
+FX_DWORD CFX_DIBSource::GetPaletteEntry(int index) const
+{
+ ASSERT((GetBPP() == 1 || GetBPP() == 8) && !IsAlphaMask());
+ if (m_pPalette) {
+ return m_pPalette[index];
+ }
+ if (IsCmykImage()) {
+ if (GetBPP() == 1) {
+ return index ? 0 : 0xff;
+ }
+ return 0xff - index;
+ }
+ if (GetBPP() == 1) {
+ return index ? 0xffffffff : 0xff000000;
+ }
+ return index * 0x10101 | 0xff000000;
+}
+void CFX_DIBSource::SetPaletteEntry(int index, FX_DWORD color)
+{
+ ASSERT((GetBPP() == 1 || GetBPP() == 8) && !IsAlphaMask());
+ if (m_pPalette == NULL) {
+ BuildPalette();
+ }
+ m_pPalette[index] = color;
+}
+int CFX_DIBSource::FindPalette(FX_DWORD color) const
+{
+ ASSERT((GetBPP() == 1 || GetBPP() == 8) && !IsAlphaMask());
+ if (m_pPalette == NULL) {
+ if (IsCmykImage()) {
+ if (GetBPP() == 1) {
+ return ((FX_BYTE)color == 0xff) ? 0 : 1;
+ }
+ return 0xff - (FX_BYTE)color;
+ }
+ if (GetBPP() == 1) {
+ return ((FX_BYTE)color == 0xff) ? 1 : 0;
+ }
+ return (FX_BYTE)color;
+ }
+ int palsize = (1 << GetBPP());
+ for (int i = 0; i < palsize; i ++)
+ if (m_pPalette[i] == color) {
+ return i;
+ }
+ return -1;
+}
+void CFX_DIBitmap::Clear(FX_DWORD color)
+{
+ if (m_pBuffer == NULL) {
+ return;
+ }
+ switch (GetFormat()) {
+ case FXDIB_1bppMask:
+ FXSYS_memset8(m_pBuffer, (color & 0xff000000) ? 0xff : 0, m_Pitch * m_Height);
+ break;
+ case FXDIB_1bppRgb: {
+ int index = FindPalette(color);
+ FXSYS_memset8(m_pBuffer, index ? 0xff : 0, m_Pitch * m_Height);
+ break;
+ }
+ case FXDIB_8bppMask:
+ FXSYS_memset8(m_pBuffer, color >> 24, m_Pitch * m_Height);
+ break;
+ case FXDIB_8bppRgb: {
+ int index = FindPalette(color);
+ FXSYS_memset8(m_pBuffer, index, m_Pitch * m_Height);
+ break;
+ }
+ case FXDIB_Rgb:
+ case FXDIB_Rgba: {
+ int a, r, g, b;
+ ArgbDecode(color, a, r, g, b);
+ if (r == g && g == b) {
+ FXSYS_memset8(m_pBuffer, r, m_Pitch * m_Height);
+ } else {
+ int byte_pos = 0;
+ for (int col = 0; col < m_Width; col ++) {
+ m_pBuffer[byte_pos++] = b;
+ m_pBuffer[byte_pos++] = g;
+ m_pBuffer[byte_pos++] = r;
+ }
+ for (int row = 1; row < m_Height; row ++) {
+ FXSYS_memcpy32(m_pBuffer + row * m_Pitch, m_pBuffer, m_Pitch);
+ }
+ }
+ break;
+ }
+ case FXDIB_Rgb32:
+ case FXDIB_Argb: {
+ color = IsCmykImage() ? FXCMYK_TODIB(color) : FXARGB_TODIB(color);
+ for (int i = 0; i < m_Width; i ++) {
+ ((FX_DWORD*)m_pBuffer)[i] = color;
+ }
+ for (int row = 1; row < m_Height; row ++) {
+ FXSYS_memcpy32(m_pBuffer + row * m_Pitch, m_pBuffer, m_Pitch);
+ }
+ break;
+ }
+ default:
+ break;
+ }
+}
+void CFX_DIBSource::GetOverlapRect(int& dest_left, int& dest_top, int& width, int& height,
+ int src_width, int src_height, int& src_left, int& src_top,
+ const CFX_ClipRgn* pClipRgn)
+{
+ if (width == 0 || height == 0) {
+ return;
+ }
+ ASSERT(width > 0 && height > 0);
+ if (dest_left > m_Width || dest_top > m_Height) {
+ width = 0;
+ height = 0;
+ return;
+ }
+ int x_offset = dest_left - src_left;
+ int y_offset = dest_top - src_top;
+ FX_RECT src_rect(src_left, src_top, src_left + width, src_top + height);
+ FX_RECT src_bound(0, 0, src_width, src_height);
+ src_rect.Intersect(src_bound);
+ FX_RECT dest_rect(src_rect.left + x_offset, src_rect.top + y_offset,
+ src_rect.right + x_offset, src_rect.bottom + y_offset);
+ FX_RECT dest_bound(0, 0, m_Width, m_Height);
+ dest_rect.Intersect(dest_bound);
+ if (pClipRgn) {
+ dest_rect.Intersect(pClipRgn->GetBox());
+ }
+ dest_left = dest_rect.left;
+ dest_top = dest_rect.top;
+ src_left = dest_left - x_offset;
+ src_top = dest_top - y_offset;
+ width = dest_rect.right - dest_rect.left;
+ height = dest_rect.bottom - dest_rect.top;
+}
+FX_BOOL CFX_DIBitmap::TransferBitmap(int dest_left, int dest_top, int width, int height,
+ const CFX_DIBSource* pSrcBitmap, int src_left, int src_top, void* pIccTransform)
+{
+ if (m_pBuffer == NULL) {
+ return FALSE;
+ }
+ GetOverlapRect(dest_left, dest_top, width, height, pSrcBitmap->GetWidth(), pSrcBitmap->GetHeight(), src_left, src_top, NULL);
+ if (width == 0 || height == 0) {
+ return TRUE;
+ }
+ FXDIB_Format dest_format = GetFormat();
+ FXDIB_Format src_format = pSrcBitmap->GetFormat();
+ if (dest_format == src_format && pIccTransform == NULL) {
+ if (GetBPP() == 1) {
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = m_pBuffer + (dest_top + row) * m_Pitch;
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row);
+ for (int col = 0; col < width; col ++) {
+ if (src_scan[(src_left + col) / 8] & (1 << (7 - (src_left + col) % 8))) {
+ dest_scan[(dest_left + col) / 8] |= 1 << (7 - (dest_left + col) % 8);
+ } else {
+ dest_scan[(dest_left + col) / 8] &= ~(1 << (7 - (dest_left + col) % 8));
+ }
+ }
+ }
+ } else {
+ int Bpp = GetBPP() / 8;
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_scan = m_pBuffer + (dest_top + row) * m_Pitch + dest_left * Bpp;
+ FX_LPCBYTE src_scan = pSrcBitmap->GetScanline(src_top + row) + src_left * Bpp;
+ FXSYS_memcpy32(dest_scan, src_scan, width * Bpp);
+ }
+ }
+ } else {
+ if (m_pPalette) {
+ return FALSE;
+ }
+ if (m_bpp == 8) {
+ dest_format = FXDIB_8bppMask;
+ }
+ FX_LPBYTE dest_buf = m_pBuffer + dest_top * m_Pitch + dest_left * GetBPP() / 8;
+ FX_DWORD* d_plt = NULL;
+ if(!ConvertBuffer(dest_format, dest_buf, m_Pitch, width, height, pSrcBitmap, src_left, src_top, d_plt, pIccTransform)) {
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+#ifndef _FPDFAPI_MINI_
+FX_BOOL CFX_DIBitmap::TransferMask(int dest_left, int dest_top, int width, int height,
+ const CFX_DIBSource* pMask, FX_DWORD color, int src_left, int src_top, int alpha_flag, void* pIccTransform)
+{
+ if (m_pBuffer == NULL) {
+ return FALSE;
+ }
+ ASSERT(HasAlpha() && (m_bpp >= 24));
+ ASSERT(pMask->IsAlphaMask());
+ if (!HasAlpha() || !pMask->IsAlphaMask() || m_bpp < 24) {
+ return FALSE;
+ }
+ GetOverlapRect(dest_left, dest_top, width, height, pMask->GetWidth(), pMask->GetHeight(), src_left, src_top, NULL);
+ if (width == 0 || height == 0) {
+ return TRUE;
+ }
+ int src_pitch = pMask->GetPitch();
+ int src_bpp = pMask->GetBPP();
+ int alpha;
+ FX_DWORD dst_color;
+ if (alpha_flag >> 8) {
+ alpha = alpha_flag & 0xff;
+ dst_color = FXCMYK_TODIB(color);
+ } else {
+ alpha = FXARGB_A(color);
+ dst_color = FXARGB_TODIB(color);
+ }
+ FX_LPBYTE color_p = (FX_LPBYTE)&dst_color;
+ if (pIccTransform && CFX_GEModule::Get()->GetCodecModule() && CFX_GEModule::Get()->GetCodecModule()->GetIccModule()) {
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ pIccModule->TranslateScanline(pIccTransform, color_p, color_p, 1);
+ } else {
+ if (alpha_flag >> 8 && !IsCmykImage())
+ AdobeCMYK_to_sRGB1(FXSYS_GetCValue(color), FXSYS_GetMValue(color), FXSYS_GetYValue(color), FXSYS_GetKValue(color),
+ color_p[2], color_p[1], color_p[0]);
+ else if (!(alpha_flag >> 8) && IsCmykImage()) {
+ return FALSE;
+ }
+ }
+ if(!IsCmykImage()) {
+ color_p[3] = (FX_BYTE)alpha;
+ }
+ if (GetFormat() == FXDIB_Argb) {
+ for (int row = 0; row < height; row ++) {
+ FX_DWORD* dest_pos = (FX_DWORD*)(m_pBuffer + (dest_top + row) * m_Pitch + dest_left * 4);
+ FX_LPCBYTE src_scan = pMask->GetScanline(src_top + row);
+ if (src_bpp == 1) {
+ for (int col = 0; col < width; col ++) {
+ int src_bitpos = src_left + col;
+ if (src_scan[src_bitpos / 8] & (1 << (7 - src_bitpos % 8))) {
+ *dest_pos = dst_color;
+ } else {
+ *dest_pos = 0;
+ }
+ dest_pos ++;
+ }
+ } else {
+ src_scan += src_left;
+ dst_color = FXARGB_TODIB(dst_color);
+ dst_color &= 0xffffff;
+ for (int col = 0; col < width; col ++) {
+ FXARGB_SETDIB(dest_pos++, dst_color | ((alpha * (*src_scan++) / 255) << 24));
+ }
+ }
+ }
+ } else {
+ int comps = m_bpp / 8;
+ for (int row = 0; row < height; row ++) {
+ FX_LPBYTE dest_color_pos = m_pBuffer + (dest_top + row) * m_Pitch + dest_left * comps;
+ FX_LPBYTE dest_alpha_pos = (FX_LPBYTE)m_pAlphaMask->GetScanline(dest_top + row) + dest_left;
+ FX_LPCBYTE src_scan = pMask->GetScanline(src_top + row);
+ if (src_bpp == 1) {
+ for (int col = 0; col < width; col ++) {
+ int src_bitpos = src_left + col;
+ if (src_scan[src_bitpos / 8] & (1 << (7 - src_bitpos % 8))) {
+ FXSYS_memcpy32(dest_color_pos, color_p, comps);
+ *dest_alpha_pos = 0xff;
+ } else {
+ FXSYS_memset32(dest_color_pos, 0, comps);
+ *dest_alpha_pos = 0;
+ }
+ dest_color_pos += comps;
+ dest_alpha_pos ++;
+ }
+ } else {
+ src_scan += src_left;
+ for (int col = 0; col < width; col ++) {
+ FXSYS_memcpy32(dest_color_pos, color_p, comps);
+ dest_color_pos += comps;
+ *dest_alpha_pos++ = (alpha * (*src_scan++) / 255);
+ }
+ }
+ }
+ }
+ return TRUE;
+}
+#endif
+void CFX_DIBSource::CopyPalette(const FX_DWORD* pSrc, FX_DWORD size)
+{
+ if (pSrc == NULL || GetBPP() > 8) {
+ if (m_pPalette) {
+ FX_Free(m_pPalette);
+ }
+ m_pPalette = NULL;
+ } else {
+ FX_DWORD pal_size = 1 << GetBPP();
+ if (m_pPalette == NULL) {
+ m_pPalette = FX_Alloc(FX_DWORD, pal_size);
+ }
+ if (!m_pPalette) {
+ return;
+ }
+ if (pal_size > size) {
+ pal_size = size;
+ }
+ FXSYS_memcpy32(m_pPalette, pSrc, pal_size * sizeof(FX_DWORD));
+ }
+}
+void CFX_DIBSource::GetPalette(FX_DWORD* pal, int alpha) const
+{
+ ASSERT(GetBPP() <= 8 && !IsCmykImage());
+ if (GetBPP() == 1) {
+ pal[0] = ((m_pPalette ? m_pPalette[0] : 0xff000000) & 0xffffff) | (alpha << 24);
+ pal[1] = ((m_pPalette ? m_pPalette[1] : 0xffffffff) & 0xffffff) | (alpha << 24);
+ return;
+ }
+ if (m_pPalette) {
+ for (int i = 0; i < 256; i ++) {
+ pal[i] = (m_pPalette[i] & 0x00ffffff) | (alpha << 24);
+ }
+ } else {
+ for (int i = 0; i < 256; i ++) {
+ pal[i] = (i * 0x10101) | (alpha << 24);
+ }
+ }
+}
+CFX_DIBitmap* CFX_DIBSource::GetAlphaMask(const FX_RECT* pClip) const
+{
+ ASSERT(GetFormat() == FXDIB_Argb);
+ FX_RECT rect(0, 0, m_Width, m_Height);
+ if (pClip) {
+ rect.Intersect(*pClip);
+ if (rect.IsEmpty()) {
+ return NULL;
+ }
+ }
+ CFX_DIBitmap* pMask = FX_NEW CFX_DIBitmap;
+ if (!pMask) {
+ return NULL;
+ }
+ if (!pMask->Create(rect.Width(), rect.Height(), FXDIB_8bppMask)) {
+ delete pMask;
+ return NULL;
+ }
+ for (int row = rect.top; row < rect.bottom; row ++) {
+ FX_LPCBYTE src_scan = GetScanline(row) + rect.left * 4 + 3;
+ FX_LPBYTE dest_scan = (FX_LPBYTE)pMask->GetScanline(row - rect.top);
+ for (int col = rect.left; col < rect.right; col ++) {
+ *dest_scan ++ = *src_scan;
+ src_scan += 4;
+ }
+ }
+ return pMask;
+}
+FX_BOOL CFX_DIBSource::CopyAlphaMask(const CFX_DIBSource* pAlphaMask, const FX_RECT* pClip)
+{
+ if (!HasAlpha() || GetFormat() == FXDIB_Argb) {
+ return FALSE;
+ }
+ if (pAlphaMask) {
+ FX_RECT rect(0, 0, pAlphaMask->m_Width, pAlphaMask->m_Height);
+ if (pClip) {
+ rect.Intersect(*pClip);
+ if (rect.IsEmpty() || rect.Width() != m_Width || rect.Height() != m_Height) {
+ return FALSE;
+ }
+ } else {
+ if (pAlphaMask->m_Width != m_Width || pAlphaMask->m_Height != m_Height) {
+ return FALSE;
+ }
+ }
+ for (int row = 0; row < m_Height; row ++)
+ FXSYS_memcpy32((void*)m_pAlphaMask->GetScanline(row),
+ pAlphaMask->GetScanline(row + rect.top) + rect.left, m_pAlphaMask->m_Pitch);
+ } else {
+ m_pAlphaMask->Clear(0xff000000);
+ }
+ return TRUE;
+}
+const int g_ChannelOffset[] = {0, 2, 1, 0, 0, 1, 2, 3, 3};
+FX_BOOL CFX_DIBitmap::LoadChannel(FXDIB_Channel destChannel, const CFX_DIBSource* pSrcBitmap, FXDIB_Channel srcChannel)
+{
+ if (m_pBuffer == NULL) {
+ return FALSE;
+ }
+ CFX_DIBSource* pSrcClone = (CFX_DIBSource*)pSrcBitmap;
+ CFX_DIBitmap* pDst = this;
+ int destOffset, srcOffset;
+ if (srcChannel == FXDIB_Alpha) {
+ if (!pSrcBitmap->HasAlpha() && !pSrcBitmap->IsAlphaMask()) {
+ return FALSE;
+ }
+ if (pSrcBitmap->GetBPP() == 1) {
+ pSrcClone = pSrcBitmap->CloneConvert(FXDIB_8bppMask);
+ if (pSrcClone == NULL) {
+ return FALSE;
+ }
+ }
+ if(pSrcBitmap->GetFormat() == FXDIB_Argb) {
+ srcOffset = 3;
+ } else {
+ srcOffset = 0;
+ }
+ } else {
+ if (pSrcBitmap->IsAlphaMask()) {
+ return FALSE;
+ }
+ if (pSrcBitmap->GetBPP() < 24) {
+ if (pSrcBitmap->IsCmykImage()) {
+ pSrcClone = pSrcBitmap->CloneConvert((FXDIB_Format)((pSrcBitmap->GetFormat() & 0xff00) | 0x20));
+ } else {
+ pSrcClone = pSrcBitmap->CloneConvert((FXDIB_Format)((pSrcBitmap->GetFormat() & 0xff00) | 0x18));
+ }
+ if (pSrcClone == NULL) {
+ return FALSE;
+ }
+ }
+ srcOffset = g_ChannelOffset[srcChannel];
+ }
+ if (destChannel == FXDIB_Alpha) {
+ if (IsAlphaMask()) {
+ if(!ConvertFormat(FXDIB_8bppMask)) {
+ if (pSrcClone != pSrcBitmap) {
+ delete pSrcClone;
+ }
+ return FALSE;
+ }
+ destOffset = 0;
+ } else {
+ destOffset = 0;
+ if(!ConvertFormat(IsCmykImage() ? FXDIB_Cmyka : FXDIB_Argb)) {
+ if (pSrcClone != pSrcBitmap) {
+ delete pSrcClone;
+ }
+ return FALSE;
+ }
+ if (GetFormat() == FXDIB_Argb) {
+ destOffset = 3;
+ }
+ }
+ } else {
+ if (IsAlphaMask()) {
+ if (pSrcClone != pSrcBitmap) {
+ delete pSrcClone;
+ }
+ return FALSE;
+ }
+ if (GetBPP() < 24) {
+ if (HasAlpha()) {
+ if (!ConvertFormat(IsCmykImage() ? FXDIB_Cmyka : FXDIB_Argb)) {
+ if (pSrcClone != pSrcBitmap) {
+ delete pSrcClone;
+ }
+ return FALSE;
+ }
+ } else
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ if (!ConvertFormat(IsCmykImage() ? FXDIB_Cmyk : FXDIB_Rgb32)) {
+#else
+ if (!ConvertFormat(IsCmykImage() ? FXDIB_Cmyk : FXDIB_Rgb)) {
+#endif
+ if (pSrcClone != pSrcBitmap) {
+ delete pSrcClone;
+ }
+ return FALSE;
+ }
+ }
+ destOffset = g_ChannelOffset[destChannel];
+ }
+ if (srcChannel == FXDIB_Alpha && pSrcClone->m_pAlphaMask) {
+ CFX_DIBitmap* pAlphaMask = pSrcClone->m_pAlphaMask;
+ if (pSrcClone->GetWidth() != m_Width || pSrcClone->GetHeight() != m_Height) {
+ if (pAlphaMask) {
+ pAlphaMask = pAlphaMask->StretchTo(m_Width, m_Height);
+ if (pAlphaMask == NULL) {
+ if (pSrcClone != pSrcBitmap) {
+ delete pSrcClone;
+ }
+ return FALSE;
+ }
+ }
+ }
+ if (pSrcClone != pSrcBitmap) {
+ pSrcClone->m_pAlphaMask = NULL;
+ delete pSrcClone;
+ }
+ pSrcClone = pAlphaMask;
+ srcOffset = 0;
+ } else if (pSrcClone->GetWidth() != m_Width || pSrcClone->GetHeight() != m_Height) {
+ CFX_DIBitmap* pSrcMatched = pSrcClone->StretchTo(m_Width, m_Height);
+ if (pSrcClone != pSrcBitmap) {
+ delete pSrcClone;
+ }
+ if (pSrcMatched == NULL) {
+ return FALSE;
+ }
+ pSrcClone = pSrcMatched;
+ }
+ if (destChannel == FXDIB_Alpha && m_pAlphaMask) {
+ pDst = m_pAlphaMask;
+ destOffset = 0;
+ }
+ int srcBytes = pSrcClone->GetBPP() / 8;
+ int destBytes = pDst->GetBPP() / 8;
+ for (int row = 0; row < m_Height; row ++) {
+ FX_LPBYTE dest_pos = (FX_LPBYTE)pDst->GetScanline(row) + destOffset;
+ FX_LPCBYTE src_pos = pSrcClone->GetScanline(row) + srcOffset;
+ for (int col = 0; col < m_Width; col ++) {
+ *dest_pos = *src_pos;
+ dest_pos += destBytes;
+ src_pos += srcBytes;
+ }
+ }
+ if (pSrcClone != pSrcBitmap && pSrcClone != pSrcBitmap->m_pAlphaMask) {
+ delete pSrcClone;
+ }
+ return TRUE;
+}
+FX_BOOL CFX_DIBitmap::LoadChannel(FXDIB_Channel destChannel, int value)
+{
+ if (m_pBuffer == NULL) {
+ return FALSE;
+ }
+ int destOffset;
+ if (destChannel == FXDIB_Alpha) {
+ if (IsAlphaMask()) {
+ if(!ConvertFormat(FXDIB_8bppMask)) {
+ return FALSE;
+ }
+ destOffset = 0;
+ } else {
+ destOffset = 0;
+ if(!ConvertFormat(IsCmykImage() ? FXDIB_Cmyka : FXDIB_Argb)) {
+ return FALSE;
+ }
+ if (GetFormat() == FXDIB_Argb) {
+ destOffset = 3;
+ }
+ }
+ } else {
+ if (IsAlphaMask()) {
+ return FALSE;
+ }
+ if (GetBPP() < 24) {
+ if (HasAlpha()) {
+ if (!ConvertFormat(IsCmykImage() ? FXDIB_Cmyka : FXDIB_Argb)) {
+ return FALSE;
+ }
+ } else
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ if (!ConvertFormat(IsCmykImage() ? FXDIB_Cmyk : FXDIB_Rgb)) {
+ return FALSE;
+ }
+#else
+ if (!ConvertFormat(IsCmykImage() ? FXDIB_Cmyk : FXDIB_Rgb32)) {
+ return FALSE;
+ }
+#endif
+ }
+ destOffset = g_ChannelOffset[destChannel];
+ }
+ int Bpp = GetBPP() / 8;
+ if (Bpp == 1) {
+ FXSYS_memset8(m_pBuffer, value, m_Height * m_Pitch);
+ return TRUE;
+ }
+ if (destChannel == FXDIB_Alpha && m_pAlphaMask) {
+ FXSYS_memset8(m_pAlphaMask->GetBuffer(), value, m_pAlphaMask->GetHeight()*m_pAlphaMask->GetPitch());
+ return TRUE;
+ }
+ for (int row = 0; row < m_Height; row ++) {
+ FX_LPBYTE scan_line = m_pBuffer + row * m_Pitch + destOffset;
+ for (int col = 0; col < m_Width; col ++) {
+ *scan_line = value;
+ scan_line += Bpp;
+ }
+ }
+ return TRUE;
+}
+FX_BOOL CFX_DIBitmap::MultiplyAlpha(const CFX_DIBSource* pSrcBitmap)
+{
+ if (m_pBuffer == NULL) {
+ return FALSE;
+ }
+ ASSERT(pSrcBitmap->IsAlphaMask());
+ if (!pSrcBitmap->IsAlphaMask()) {
+ return FALSE;
+ }
+ if (!IsAlphaMask() && !HasAlpha()) {
+ return LoadChannel(FXDIB_Alpha, pSrcBitmap, FXDIB_Alpha);
+ }
+ CFX_DIBitmap* pSrcClone = (CFX_DIBitmap*)pSrcBitmap;
+ if (pSrcBitmap->GetWidth() != m_Width || pSrcBitmap->GetHeight() != m_Height) {
+ pSrcClone = pSrcBitmap->StretchTo(m_Width, m_Height);
+ ASSERT(pSrcClone != NULL);
+ if (pSrcClone == NULL) {
+ return FALSE;
+ }
+ }
+ if (IsAlphaMask()) {
+ if(!ConvertFormat(FXDIB_8bppMask)) {
+ if (pSrcClone != pSrcBitmap) {
+ delete pSrcClone;
+ }
+ return FALSE;
+ }
+ for (int row = 0; row < m_Height; row ++) {
+ FX_LPBYTE dest_scan = m_pBuffer + m_Pitch * row;
+ FX_LPBYTE src_scan = pSrcClone->m_pBuffer + pSrcClone->m_Pitch * row;
+ if (pSrcClone->GetBPP() == 1) {
+ for (int col = 0; col < m_Width; col ++) {
+ if (!((1 << (7 - col % 8)) & src_scan[col / 8])) {
+ dest_scan[col] = 0;
+ }
+ }
+ } else {
+ for (int col = 0; col < m_Width; col ++) {
+ *dest_scan = (*dest_scan) * src_scan[col] / 255;
+ dest_scan ++;
+ }
+ }
+ }
+ } else {
+ if(GetFormat() == FXDIB_Argb) {
+ if (pSrcClone->GetBPP() == 1) {
+ if (pSrcClone != pSrcBitmap) {
+ delete pSrcClone;
+ }
+ return FALSE;
+ }
+ for (int row = 0; row < m_Height; row ++) {
+ FX_LPBYTE dest_scan = m_pBuffer + m_Pitch * row + 3;
+ FX_LPBYTE src_scan = pSrcClone->m_pBuffer + pSrcClone->m_Pitch * row;
+ for (int col = 0; col < m_Width; col ++) {
+ *dest_scan = (*dest_scan) * src_scan[col] / 255;
+ dest_scan += 4;
+ }
+ }
+ } else {
+ m_pAlphaMask->MultiplyAlpha(pSrcClone);
+ }
+ }
+ if (pSrcClone != pSrcBitmap) {
+ delete pSrcClone;
+ }
+ return TRUE;
+}
+FX_BOOL CFX_DIBitmap::GetGrayData(void* pIccTransform)
+{
+ if (m_pBuffer == NULL) {
+ return FALSE;
+ }
+ switch (GetFormat()) {
+ case FXDIB_1bppRgb: {
+ if (m_pPalette == NULL) {
+ return FALSE;
+ }
+ FX_BYTE gray[2];
+ for (int i = 0; i < 2; i ++) {
+ int r = (FX_BYTE)(m_pPalette[i] >> 16);
+ int g = (FX_BYTE)(m_pPalette[i] >> 8);
+ int b = (FX_BYTE)m_pPalette[i];
+ gray[i] = (FX_BYTE)FXRGB2GRAY(r, g, b);
+ }
+ CFX_DIBitmap* pMask = FX_NEW CFX_DIBitmap;
+ if (!pMask) {
+ return FALSE;
+ }
+ if (!pMask->Create(m_Width, m_Height, FXDIB_8bppMask)) {
+ delete pMask;
+ return FALSE;
+ }
+ FXSYS_memset8(pMask->GetBuffer(), gray[0], pMask->GetPitch() * m_Height);
+ for (int row = 0; row < m_Height; row ++) {
+ FX_LPBYTE src_pos = m_pBuffer + row * m_Pitch;
+ FX_LPBYTE dest_pos = (FX_LPBYTE)pMask->GetScanline(row);
+ for (int col = 0; col < m_Width; col ++) {
+ if (src_pos[col / 8] & (1 << (7 - col % 8))) {
+ *dest_pos = gray[1];
+ }
+ dest_pos ++;
+ }
+ }
+ TakeOver(pMask);
+ delete pMask;
+ break;
+ }
+ case FXDIB_8bppRgb: {
+ if (m_pPalette == NULL) {
+ return FALSE;
+ }
+ FX_BYTE gray[256];
+ for (int i = 0; i < 256; i ++) {
+ int r = (FX_BYTE)(m_pPalette[i] >> 16);
+ int g = (FX_BYTE)(m_pPalette[i] >> 8);
+ int b = (FX_BYTE)m_pPalette[i];
+ gray[i] = (FX_BYTE)FXRGB2GRAY(r, g, b);
+ }
+ CFX_DIBitmap* pMask = FX_NEW CFX_DIBitmap;
+ if (!pMask) {
+ return FALSE;
+ }
+ if (!pMask->Create(m_Width, m_Height, FXDIB_8bppMask)) {
+ delete pMask;
+ return FALSE;
+ }
+ for (int row = 0; row < m_Height; row ++) {
+ FX_LPBYTE dest_pos = pMask->GetBuffer() + row * pMask->GetPitch();
+ FX_LPBYTE src_pos = m_pBuffer + row * m_Pitch;
+ for (int col = 0; col < m_Width; col ++) {
+ *dest_pos ++ = gray[*src_pos ++];
+ }
+ }
+ TakeOver(pMask);
+ delete pMask;
+ break;
+ }
+ case FXDIB_Rgb: {
+ CFX_DIBitmap* pMask = FX_NEW CFX_DIBitmap;
+ if (!pMask) {
+ return FALSE;
+ }
+ if (!pMask->Create(m_Width, m_Height, FXDIB_8bppMask)) {
+ delete pMask;
+ return FALSE;
+ }
+ for (int row = 0; row < m_Height; row ++) {
+ FX_LPBYTE src_pos = m_pBuffer + row * m_Pitch;
+ FX_LPBYTE dest_pos = pMask->GetBuffer() + row * pMask->GetPitch();
+ for (int col = 0; col < m_Width; col ++) {
+ *dest_pos ++ = FXRGB2GRAY(src_pos[2], src_pos[1], *src_pos);
+ src_pos += 3;
+ }
+ }
+ TakeOver(pMask);
+ delete pMask;
+ break;
+ }
+ case FXDIB_Rgb32: {
+ CFX_DIBitmap* pMask = FX_NEW CFX_DIBitmap;
+ if (!pMask) {
+ return FALSE;
+ }
+ if (!pMask->Create(m_Width, m_Height, FXDIB_8bppMask)) {
+ delete pMask;
+ return FALSE;
+ }
+ for (int row = 0; row < m_Height; row ++) {
+ FX_LPBYTE src_pos = m_pBuffer + row * m_Pitch;
+ FX_LPBYTE dest_pos = pMask->GetBuffer() + row * pMask->GetPitch();
+ for (int col = 0; col < m_Width; col ++) {
+ *dest_pos ++ = FXRGB2GRAY(src_pos[2], src_pos[1], *src_pos);
+ src_pos += 4;
+ }
+ }
+ TakeOver(pMask);
+ delete pMask;
+ break;
+ }
+ default:
+ return FALSE;
+ }
+ return TRUE;
+}
+FX_BOOL CFX_DIBitmap::MultiplyAlpha(int alpha)
+{
+ if (m_pBuffer == NULL) {
+ return FALSE;
+ }
+ switch (GetFormat()) {
+ case FXDIB_1bppMask:
+ if (!ConvertFormat(FXDIB_8bppMask)) {
+ return FALSE;
+ }
+ MultiplyAlpha(alpha);
+ break;
+ case FXDIB_8bppMask: {
+ for (int row = 0; row < m_Height; row ++) {
+ FX_LPBYTE scan_line = m_pBuffer + row * m_Pitch;
+ for (int col = 0; col < m_Width; col ++) {
+ scan_line[col] = scan_line[col] * alpha / 255;
+ }
+ }
+ break;
+ }
+ case FXDIB_Argb: {
+ for (int row = 0; row < m_Height; row ++) {
+ FX_LPBYTE scan_line = m_pBuffer + row * m_Pitch + 3;
+ for (int col = 0; col < m_Width; col ++) {
+ *scan_line = (*scan_line) * alpha / 255;
+ scan_line += 4;
+ }
+ }
+ break;
+ }
+ default:
+ if (HasAlpha()) {
+ m_pAlphaMask->MultiplyAlpha(alpha);
+ } else if (IsCmykImage()) {
+ if (!ConvertFormat((FXDIB_Format)(GetFormat() | 0x0200))) {
+ return FALSE;
+ }
+ m_pAlphaMask->MultiplyAlpha(alpha);
+ } else {
+ if (!ConvertFormat(FXDIB_Argb)) {
+ return FALSE;
+ }
+ MultiplyAlpha(alpha);
+ }
+ break;
+ }
+ return TRUE;
+}
+#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)
+FX_DWORD CFX_DIBitmap::GetPixel(int x, int y) const
+{
+ if (m_pBuffer == NULL) {
+ return 0;
+ }
+ FX_LPBYTE pos = m_pBuffer + y * m_Pitch + x * GetBPP() / 8;
+ switch (GetFormat()) {
+ case FXDIB_1bppMask: {
+ if ((*pos) & (1 << (7 - x % 8))) {
+ return 0xff000000;
+ }
+ return 0;
+ }
+ case FXDIB_1bppRgb: {
+ if ((*pos) & (1 << (7 - x % 8))) {
+ return m_pPalette ? m_pPalette[1] : 0xffffffff;
+ } else {
+ return m_pPalette ? m_pPalette[0] : 0xff000000;
+ }
+ break;
+ }
+ case FXDIB_8bppMask:
+ return (*pos) << 24;
+ case FXDIB_8bppRgb:
+ return m_pPalette ? m_pPalette[*pos] : (0xff000000 | ((*pos) * 0x10101));
+ case FXDIB_Rgb:
+ case FXDIB_Rgba:
+ case FXDIB_Rgb32:
+ return FXARGB_GETDIB(pos) | 0xff000000;
+ case FXDIB_Argb:
+ return FXARGB_GETDIB(pos);
+ default:
+ break;
+ }
+ return 0;
+}
+#endif
+void CFX_DIBitmap::SetPixel(int x, int y, FX_DWORD color)
+{
+ if (m_pBuffer == NULL) {
+ return;
+ }
+ if (x < 0 || x >= m_Width || y < 0 || y >= m_Height) {
+ return;
+ }
+ FX_LPBYTE pos = m_pBuffer + y * m_Pitch + x * GetBPP() / 8;
+ switch (GetFormat()) {
+ case FXDIB_1bppMask:
+ if (color >> 24) {
+ *pos |= 1 << (7 - x % 8);
+ } else {
+ *pos &= ~(1 << (7 - x % 8));
+ }
+ break;
+ case FXDIB_1bppRgb:
+ if (m_pPalette) {
+ if (color == m_pPalette[1]) {
+ *pos |= 1 << (7 - x % 8);
+ } else {
+ *pos &= ~(1 << (7 - x % 8));
+ }
+ } else {
+ if (color == 0xffffffff) {
+ *pos |= 1 << (7 - x % 8);
+ } else {
+ *pos &= ~(1 << (7 - x % 8));
+ }
+ }
+ break;
+ case FXDIB_8bppMask:
+ *pos = (FX_BYTE)(color >> 24);
+ break;
+ case FXDIB_8bppRgb: {
+ if (m_pPalette) {
+ for (int i = 0; i < 256; i ++) {
+ if (m_pPalette[i] == color) {
+ *pos = (FX_BYTE)i;
+ return;
+ }
+ }
+ *pos = 0;
+ } else {
+ *pos = FXRGB2GRAY(FXARGB_R(color), FXARGB_G(color), FXARGB_B(color));
+ }
+ break;
+ }
+ case FXDIB_Rgb:
+ case FXDIB_Rgb32: {
+ int alpha = FXARGB_A(color);
+ pos[0] = (FXARGB_B(color) * alpha + pos[0] * (255 - alpha)) / 255;
+ pos[1] = (FXARGB_G(color) * alpha + pos[1] * (255 - alpha)) / 255;
+ pos[2] = (FXARGB_R(color) * alpha + pos[2] * (255 - alpha)) / 255;
+ break;
+ }
+ case FXDIB_Rgba: {
+ pos[0] = FXARGB_B(color);
+ pos[1] = FXARGB_G(color);
+ pos[2] = FXARGB_R(color);
+ break;
+ }
+ case FXDIB_Argb:
+ FXARGB_SETDIB(pos, color);
+ break;
+ default:
+ break;
+ }
+}
+void CFX_DIBitmap::DownSampleScanline(int line, FX_LPBYTE dest_scan, int dest_bpp,
+ int dest_width, FX_BOOL bFlipX, int clip_left, int clip_width) const
+{
+ if (m_pBuffer == NULL) {
+ return;
+ }
+ int src_Bpp = m_bpp / 8;
+ FX_LPBYTE scanline = m_pBuffer + line * m_Pitch;
+ if (src_Bpp == 0) {
+ for (int i = 0; i < clip_width; i ++) {
+ FX_DWORD dest_x = clip_left + i;
+ FX_DWORD src_x = dest_x * m_Width / dest_width;
+ if (bFlipX) {
+ src_x = m_Width - src_x - 1;
+ }
+#ifdef FOXIT_CHROME_BUILD
+ src_x %= m_Width;
+#endif
+ dest_scan[i] = (scanline[src_x / 8] & (1 << (7 - src_x % 8))) ? 255 : 0;
+ }
+ } else if (src_Bpp == 1) {
+ for (int i = 0; i < clip_width; i ++) {
+ FX_DWORD dest_x = clip_left + i;
+ FX_DWORD src_x = dest_x * m_Width / dest_width;
+ if (bFlipX) {
+ src_x = m_Width - src_x - 1;
+ }
+#ifdef FOXIT_CHROME_BUILD
+ src_x %= m_Width;
+#endif
+ int dest_pos = i;
+ if (m_pPalette) {
+ if (!IsCmykImage()) {
+ dest_pos *= 3;
+ FX_ARGB argb = m_pPalette[scanline[src_x]];
+ dest_scan[dest_pos] = FXARGB_B(argb);
+ dest_scan[dest_pos + 1] = FXARGB_G(argb);
+ dest_scan[dest_pos + 2] = FXARGB_R(argb);
+ } else {
+ dest_pos *= 4;
+ FX_CMYK cmyk = m_pPalette[scanline[src_x]];
+ dest_scan[dest_pos] = FXSYS_GetCValue(cmyk);
+ dest_scan[dest_pos + 1] = FXSYS_GetMValue(cmyk);
+ dest_scan[dest_pos + 2] = FXSYS_GetYValue(cmyk);
+ dest_scan[dest_pos + 3] = FXSYS_GetKValue(cmyk);
+ }
+ } else {
+ dest_scan[dest_pos] = scanline[src_x];
+ }
+ }
+ } else {
+ for (int i = 0; i < clip_width; i ++) {
+ FX_DWORD dest_x = clip_left + i;
+ FX_DWORD src_x = bFlipX ? (m_Width - dest_x * m_Width / dest_width - 1) * src_Bpp : (dest_x * m_Width / dest_width) * src_Bpp;
+#ifdef FOXIT_CHROME_BUILD
+ src_x %= m_Width * src_Bpp;
+#endif
+ int dest_pos = i * src_Bpp;
+ for (int b = 0; b < src_Bpp; b ++) {
+ dest_scan[dest_pos + b] = scanline[src_x + b];
+ }
+ }
+ }
+}
+FX_BOOL CFX_DIBitmap::ConvertColorScale(FX_DWORD forecolor, FX_DWORD backcolor)
+{
+ ASSERT(!IsAlphaMask());
+ if (m_pBuffer == NULL || IsAlphaMask()) {
+ return FALSE;
+ }
+ int fc, fm, fy, fk, bc, bm, by, bk;
+ int fr, fg, fb, br, bg, bb;
+ FX_BOOL isCmykImage = IsCmykImage();
+ if (isCmykImage) {
+ fc = FXSYS_GetCValue(forecolor);
+ fm = FXSYS_GetMValue(forecolor);
+ fy = FXSYS_GetYValue(forecolor);
+ fk = FXSYS_GetKValue(forecolor);
+ bc = FXSYS_GetCValue(backcolor);
+ bm = FXSYS_GetMValue(backcolor);
+ by = FXSYS_GetYValue(backcolor);
+ bk = FXSYS_GetKValue(backcolor);
+ } else {
+ fr = FXSYS_GetRValue(forecolor);
+ fg = FXSYS_GetGValue(forecolor);
+ fb = FXSYS_GetBValue(forecolor);
+ br = FXSYS_GetRValue(backcolor);
+ bg = FXSYS_GetGValue(backcolor);
+ bb = FXSYS_GetBValue(backcolor);
+ }
+ if (m_bpp <= 8) {
+ if (isCmykImage) {
+ if (forecolor == 0xff && backcolor == 0 && m_pPalette == NULL) {
+ return TRUE;
+ }
+ } else if (forecolor == 0 && backcolor == 0xffffff && m_pPalette == NULL) {
+ return TRUE;
+ }
+ if (m_pPalette == NULL) {
+ BuildPalette();
+ }
+ int size = 1 << m_bpp;
+ if (isCmykImage) {
+ for (int i = 0; i < size; i ++) {
+ FX_BYTE b, g, r;
+ AdobeCMYK_to_sRGB1(FXSYS_GetCValue(m_pPalette[i]), FXSYS_GetMValue(m_pPalette[i]), FXSYS_GetYValue(m_pPalette[i]), FXSYS_GetKValue(m_pPalette[i]),
+ r, g, b);
+ int gray = 255 - FXRGB2GRAY(r, g, b);
+ m_pPalette[i] = CmykEncode(bc + (fc - bc) * gray / 255, bm + (fm - bm) * gray / 255,
+ by + (fy - by) * gray / 255, bk + (fk - bk) * gray / 255);
+ }
+ } else
+ for (int i = 0; i < size; i ++) {
+ int gray = FXRGB2GRAY(FXARGB_R(m_pPalette[i]), FXARGB_G(m_pPalette[i]), FXARGB_B(m_pPalette[i]));
+ m_pPalette[i] = FXARGB_MAKE(0xff, br + (fr - br) * gray / 255, bg + (fg - bg) * gray / 255,
+ bb + (fb - bb) * gray / 255);
+ }
+ return TRUE;
+ }
+ if (isCmykImage) {
+ if (forecolor == 0xff && backcolor == 0x00) {
+ for (int row = 0; row < m_Height; row ++) {
+ FX_LPBYTE scanline = m_pBuffer + row * m_Pitch;
+ for (int col = 0; col < m_Width; col ++) {
+ FX_BYTE b, g, r;
+ AdobeCMYK_to_sRGB1(scanline[0], scanline[1], scanline[2], scanline[3],
+ r, g, b);
+ *scanline ++ = 0;
+ *scanline ++ = 0;
+ *scanline ++ = 0;
+ *scanline ++ = 255 - FXRGB2GRAY(r, g, b);
+ }
+ }
+ return TRUE;
+ }
+ } else if (forecolor == 0 && backcolor == 0xffffff) {
+ for (int row = 0; row < m_Height; row ++) {
+ FX_LPBYTE scanline = m_pBuffer + row * m_Pitch;
+ int gap = m_bpp / 8 - 2;
+ for (int col = 0; col < m_Width; col ++) {
+ int gray = FXRGB2GRAY(scanline[2], scanline[1], scanline[0]);
+ *scanline ++ = gray;
+ *scanline ++ = gray;
+ *scanline = gray;
+ scanline += gap;
+ }
+ }
+ return TRUE;
+ }
+ if (isCmykImage) {
+ for (int row = 0; row < m_Height; row ++) {
+ FX_LPBYTE scanline = m_pBuffer + row * m_Pitch;
+ for (int col = 0; col < m_Width; col ++) {
+ FX_BYTE b, g, r;
+ AdobeCMYK_to_sRGB1(scanline[0], scanline[1], scanline[2], scanline[3],
+ r, g, b);
+ int gray = 255 - FXRGB2GRAY(r, g, b);
+ *scanline ++ = bc + (fc - bc) * gray / 255;
+ *scanline ++ = bm + (fm - bm) * gray / 255;
+ *scanline ++ = by + (fy - by) * gray / 255;
+ *scanline ++ = bk + (fk - bk) * gray / 255;
+ }
+ }
+ } else
+ for (int row = 0; row < m_Height; row ++) {
+ FX_LPBYTE scanline = m_pBuffer + row * m_Pitch;
+ int gap = m_bpp / 8 - 2;
+ for (int col = 0; col < m_Width; col ++) {
+ int gray = FXRGB2GRAY(scanline[2], scanline[1], scanline[0]);
+ *scanline ++ = bb + (fb - bb) * gray / 255;
+ *scanline ++ = bg + (fg - bg) * gray / 255;
+ *scanline = br + (fr - br) * gray / 255;
+ scanline += gap;
+ }
+ }
+ return TRUE;
+}
+FX_BOOL CFX_DIBitmap::DitherFS(const FX_DWORD* pPalette, int pal_size, const FX_RECT* pRect)
+{
+ if (m_pBuffer == NULL) {
+ return FALSE;
+ }
+ if (m_bpp != 8 && m_pPalette != NULL && m_AlphaFlag != 0) {
+ return FALSE;
+ }
+ if (m_Width < 4 && m_Height < 4) {
+ return FALSE;
+ }
+ FX_RECT rect(0, 0, m_Width, m_Height);
+ if (pRect) {
+ rect.Intersect(*pRect);
+ }
+ FX_BYTE translate[256];
+ for (int i = 0; i < 256; i ++) {
+ int err2 = 65536;
+ for (int j = 0; j < pal_size; j ++) {
+ FX_BYTE entry = (FX_BYTE)pPalette[j];
+ int err = (int)entry - i;
+ if (err * err < err2) {
+ err2 = err * err;
+ translate[i] = entry;
+ }
+ }
+ }
+ for (int row = rect.top; row < rect.bottom; row ++) {
+ FX_LPBYTE scan = m_pBuffer + row * m_Pitch;
+ FX_LPBYTE next_scan = m_pBuffer + (row + 1) * m_Pitch;
+ for (int col = rect.left; col < rect.right; col ++) {
+ int src_pixel = scan[col];
+ int dest_pixel = translate[src_pixel];
+ scan[col] = (FX_BYTE)dest_pixel;
+ int error = -dest_pixel + src_pixel;
+ if (col < rect.right - 1) {
+ int src = scan[col + 1];
+ src += error * 7 / 16;
+ if (src > 255) {
+ scan[col + 1] = 255;
+ } else if (src < 0) {
+ scan[col + 1] = 0;
+ } else {
+ scan[col + 1] = src;
+ }
+ }
+ if (col < rect.right - 1 && row < rect.bottom - 1) {
+ int src = next_scan[col + 1];
+ src += error * 1 / 16;
+ if (src > 255) {
+ next_scan[col + 1] = 255;
+ } else if (src < 0) {
+ next_scan[col + 1] = 0;
+ } else {
+ next_scan[col + 1] = src;
+ }
+ }
+ if (row < rect.bottom - 1) {
+ int src = next_scan[col];
+ src += error * 5 / 16;
+ if (src > 255) {
+ next_scan[col] = 255;
+ } else if (src < 0) {
+ next_scan[col] = 0;
+ } else {
+ next_scan[col] = src;
+ }
+ }
+ if (col > rect.left && row < rect.bottom - 1) {
+ int src = next_scan[col - 1];
+ src += error * 3 / 16;
+ if (src > 255) {
+ next_scan[col - 1] = 255;
+ } else if (src < 0) {
+ next_scan[col - 1] = 0;
+ } else {
+ next_scan[col - 1] = src;
+ }
+ }
+ }
+ }
+ return TRUE;
+}
+CFX_DIBitmap* CFX_DIBSource::FlipImage(FX_BOOL bXFlip, FX_BOOL bYFlip) const
+{
+ CFX_DIBitmap* pFlipped = FX_NEW CFX_DIBitmap;
+ if (!pFlipped) {
+ return NULL;
+ }
+ if (!pFlipped->Create(m_Width, m_Height, GetFormat())) {
+ delete pFlipped;
+ return NULL;
+ }
+ pFlipped->CopyPalette(m_pPalette);
+ FX_LPBYTE pDestBuffer = pFlipped->GetBuffer();
+ int Bpp = m_bpp / 8;
+ for (int row = 0; row < m_Height; row ++) {
+ FX_LPCBYTE src_scan = GetScanline(row);
+ FX_LPBYTE dest_scan = pDestBuffer + m_Pitch * (bYFlip ? (m_Height - row - 1) : row);
+ if (!bXFlip) {
+ FXSYS_memcpy32(dest_scan, src_scan, m_Pitch);
+ continue;
+ }
+ if (m_bpp == 1) {
+ FXSYS_memset32(dest_scan, 0, m_Pitch);
+ for (int col = 0; col < m_Width; col ++)
+ if (src_scan[col / 8] & (1 << (7 - col % 8))) {
+ int dest_col = m_Width - col - 1;
+ dest_scan[dest_col / 8] |= (1 << (7 - dest_col % 8));
+ }
+ } else {
+ dest_scan += (m_Width - 1) * Bpp;
+ if (Bpp == 1) {
+ for (int col = 0; col < m_Width; col ++) {
+ *dest_scan = *src_scan;
+ dest_scan --;
+ src_scan ++;
+ }
+ } else if (Bpp == 3) {
+ for (int col = 0; col < m_Width; col ++) {
+ dest_scan[0] = src_scan[0];
+ dest_scan[1] = src_scan[1];
+ dest_scan[2] = src_scan[2];
+ dest_scan -= 3;
+ src_scan += 3;
+ }
+ } else {
+ ASSERT(Bpp == 4);
+ for (int col = 0; col < m_Width; col ++) {
+ *(FX_DWORD*)dest_scan = *(FX_DWORD*)src_scan;
+ dest_scan -= 4;
+ src_scan += 4;
+ }
+ }
+ }
+ }
+ if (m_pAlphaMask) {
+ pDestBuffer = pFlipped->m_pAlphaMask->GetBuffer();
+ FX_DWORD dest_pitch = pFlipped->m_pAlphaMask->GetPitch();
+ for (int row = 0; row < m_Height; row ++) {
+ FX_LPCBYTE src_scan = m_pAlphaMask->GetScanline(row);
+ FX_LPBYTE dest_scan = pDestBuffer + dest_pitch * (bYFlip ? (m_Height - row - 1) : row);
+ if (!bXFlip) {
+ FXSYS_memcpy32(dest_scan, src_scan, dest_pitch);
+ continue;
+ }
+ dest_scan += (m_Width - 1);
+ for (int col = 0; col < m_Width; col ++) {
+ *dest_scan = *src_scan;
+ dest_scan --;
+ src_scan ++;
+ }
+ }
+ }
+ return pFlipped;
+}
+CFX_DIBExtractor::CFX_DIBExtractor(const CFX_DIBSource* pSrc)
+{
+ m_pBitmap = NULL;
+ if (pSrc->GetBuffer() == NULL) {
+ m_pBitmap = pSrc->Clone();
+ } else {
+ m_pBitmap = FX_NEW CFX_DIBitmap;
+ if (!m_pBitmap) {
+ return;
+ }
+ if (!m_pBitmap->Create(pSrc->GetWidth(), pSrc->GetHeight(), pSrc->GetFormat(), pSrc->GetBuffer())) {
+ delete m_pBitmap;
+ m_pBitmap = NULL;
+ return;
+ }
+ m_pBitmap->CopyPalette(pSrc->GetPalette());
+ m_pBitmap->CopyAlphaMask(pSrc->m_pAlphaMask);
+ }
+}
+CFX_DIBExtractor::~CFX_DIBExtractor()
+{
+ if (m_pBitmap) {
+ delete m_pBitmap;
+ }
+}
+CFX_FilteredDIB::CFX_FilteredDIB()
+{
+ m_pScanline = NULL;
+ m_pSrc = NULL;
+}
+CFX_FilteredDIB::~CFX_FilteredDIB()
+{
+ if (m_pSrc && m_bAutoDropSrc) {
+ delete m_pSrc;
+ }
+ if (m_pScanline) {
+ FX_Free(m_pScanline);
+ }
+}
+void CFX_FilteredDIB::LoadSrc(const CFX_DIBSource* pSrc, FX_BOOL bAutoDropSrc)
+{
+ m_pSrc = pSrc;
+ m_bAutoDropSrc = bAutoDropSrc;
+ m_Width = pSrc->GetWidth();
+ m_Height = pSrc->GetHeight();
+ FXDIB_Format format = GetDestFormat();
+ m_bpp = (FX_BYTE)format;
+ m_AlphaFlag = (FX_BYTE)(format >> 8);
+ m_Pitch = (m_Width * (format & 0xff) + 31) / 32 * 4;
+ m_pPalette = GetDestPalette();
+ m_pScanline = FX_Alloc(FX_BYTE, m_Pitch);
+}
+FX_LPCBYTE CFX_FilteredDIB::GetScanline(int line) const
+{
+ TranslateScanline(m_pScanline, m_pSrc->GetScanline(line));
+ return m_pScanline;
+}
+void CFX_FilteredDIB::DownSampleScanline(int line, FX_LPBYTE dest_scan, int dest_bpp,
+ int dest_width, FX_BOOL bFlipX, int clip_left, int clip_width) const
+{
+ m_pSrc->DownSampleScanline(line, dest_scan, dest_bpp, dest_width, bFlipX, clip_left, clip_width);
+ TranslateDownSamples(dest_scan, dest_scan, clip_width, dest_bpp);
+}
+CFX_ImageRenderer::CFX_ImageRenderer()
+{
+ m_Status = 0;
+ m_pTransformer = NULL;
+ m_bRgbByteOrder = FALSE;
+ m_BlendType = FXDIB_BLEND_NORMAL;
+}
+CFX_ImageRenderer::~CFX_ImageRenderer()
+{
+ if (m_pTransformer) {
+ delete m_pTransformer;
+ }
+}
+extern FX_RECT _FXDIB_SwapClipBox(FX_RECT& clip, int width, int height, FX_BOOL bFlipX, FX_BOOL bFlipY);
+FX_BOOL CFX_ImageRenderer::Start(CFX_DIBitmap* pDevice, const CFX_ClipRgn* pClipRgn,
+ const CFX_DIBSource* pSource, int bitmap_alpha,
+ FX_DWORD mask_color, const CFX_AffineMatrix* pMatrix,
+ FX_DWORD dib_flags, FX_BOOL bRgbByteOrder,
+ int alpha_flag, void* pIccTransform, int blend_type)
+{
+ m_Matrix = *pMatrix;
+ CFX_FloatRect image_rect_f = m_Matrix.GetUnitRect();
+ FX_RECT image_rect = image_rect_f.GetOutterRect();
+ m_ClipBox = pClipRgn ? pClipRgn->GetBox() : FX_RECT(0, 0, pDevice->GetWidth(), pDevice->GetHeight());
+ m_ClipBox.Intersect(image_rect);
+ if (m_ClipBox.IsEmpty()) {
+ return FALSE;
+ }
+ m_pDevice = pDevice;
+ m_pClipRgn = pClipRgn;
+ m_MaskColor = mask_color;
+ m_BitmapAlpha = bitmap_alpha;
+ m_Matrix = *pMatrix;
+ m_Flags = dib_flags;
+ m_AlphaFlag = alpha_flag;
+ m_pIccTransform = pIccTransform;
+ m_bRgbByteOrder = bRgbByteOrder;
+ m_BlendType = blend_type;
+ FX_BOOL ret = TRUE;
+ if ((FXSYS_fabs(m_Matrix.b) >= 0.5f || m_Matrix.a == 0) ||
+ (FXSYS_fabs(m_Matrix.c) >= 0.5f || m_Matrix.d == 0) ) {
+ if (FXSYS_fabs(m_Matrix.a) < FXSYS_fabs(m_Matrix.b) / 20 && FXSYS_fabs(m_Matrix.d) < FXSYS_fabs(m_Matrix.c) / 20 &&
+ FXSYS_fabs(m_Matrix.a) < 0.5f && FXSYS_fabs(m_Matrix.d) < 0.5f) {
+ int dest_width = image_rect.Width();
+ int dest_height = image_rect.Height();
+ FX_RECT bitmap_clip = m_ClipBox;
+ bitmap_clip.Offset(-image_rect.left, -image_rect.top);
+ bitmap_clip = _FXDIB_SwapClipBox(bitmap_clip, dest_width, dest_height, m_Matrix.c > 0, m_Matrix.b < 0);
+ m_Composer.Compose(pDevice, pClipRgn, bitmap_alpha, mask_color, m_ClipBox, TRUE,
+ m_Matrix.c > 0, m_Matrix.b < 0, m_bRgbByteOrder, alpha_flag, pIccTransform, m_BlendType);
+ if (!m_Stretcher.Start(&m_Composer, pSource, dest_height, dest_width, bitmap_clip, dib_flags)) {
+ return FALSE;
+ }
+ m_Status = 1;
+ return TRUE;
+ }
+ m_Status = 2;
+ m_pTransformer = FX_NEW CFX_ImageTransformer;
+ if (!m_pTransformer) {
+ return FALSE;
+ }
+ m_pTransformer->Start(pSource, &m_Matrix, dib_flags, &m_ClipBox);
+ return TRUE;
+ }
+ int dest_width = image_rect.Width();
+ if (m_Matrix.a < 0) {
+ dest_width = -dest_width;
+ }
+ int dest_height = image_rect.Height();
+ if (m_Matrix.d > 0) {
+ dest_height = -dest_height;
+ }
+ if (dest_width == 0 || dest_height == 0) {
+ return FALSE;
+ }
+ FX_RECT bitmap_clip = m_ClipBox;
+ bitmap_clip.Offset(-image_rect.left, -image_rect.top);
+ m_Composer.Compose(pDevice, pClipRgn, bitmap_alpha, mask_color,
+ m_ClipBox, FALSE, FALSE, FALSE, m_bRgbByteOrder, alpha_flag, pIccTransform, m_BlendType);
+ m_Status = 1;
+ ret = m_Stretcher.Start(&m_Composer, pSource, dest_width, dest_height, bitmap_clip, dib_flags);
+ return ret;
+}
+FX_BOOL CFX_ImageRenderer::Continue(IFX_Pause* pPause)
+{
+ if (m_Status == 1) {
+ return m_Stretcher.Continue(pPause);
+ } else if (m_Status == 2) {
+ if (m_pTransformer->Continue(pPause)) {
+ return TRUE;
+ }
+ CFX_DIBitmap* pBitmap = m_pTransformer->m_Storer.Detach();
+ if (pBitmap == NULL) {
+ return FALSE;
+ }
+ if (pBitmap->GetBuffer() == NULL) {
+ delete pBitmap;
+ return FALSE;
+ }
+ if (pBitmap->IsAlphaMask()) {
+ if (m_BitmapAlpha != 255) {
+ if (m_AlphaFlag >> 8) {
+ m_AlphaFlag = (((FX_BYTE)((m_AlphaFlag & 0xff) * m_BitmapAlpha / 255)) | ((m_AlphaFlag >> 8) << 8));
+ } else {
+ m_MaskColor = FXARGB_MUL_ALPHA(m_MaskColor, m_BitmapAlpha);
+ }
+ }
+ m_pDevice->CompositeMask(m_pTransformer->m_ResultLeft, m_pTransformer->m_ResultTop,
+ pBitmap->GetWidth(), pBitmap->GetHeight(), pBitmap, m_MaskColor,
+ 0, 0, m_BlendType, m_pClipRgn, m_bRgbByteOrder, m_AlphaFlag, m_pIccTransform);
+ } else {
+ if (m_BitmapAlpha != 255) {
+ pBitmap->MultiplyAlpha(m_BitmapAlpha);
+ }
+ m_pDevice->CompositeBitmap(m_pTransformer->m_ResultLeft, m_pTransformer->m_ResultTop,
+ pBitmap->GetWidth(), pBitmap->GetHeight(), pBitmap, 0, 0, m_BlendType, m_pClipRgn, m_bRgbByteOrder, m_pIccTransform);
+ }
+ delete pBitmap;
+ return FALSE;
+ }
+ return FALSE;
+}
+CFX_BitmapStorer::CFX_BitmapStorer()
+{
+ m_pBitmap = NULL;
+}
+CFX_BitmapStorer::~CFX_BitmapStorer()
+{
+ if (m_pBitmap) {
+ delete m_pBitmap;
+ }
+}
+CFX_DIBitmap* CFX_BitmapStorer::Detach()
+{
+ CFX_DIBitmap* pBitmap = m_pBitmap;
+ m_pBitmap = NULL;
+ return pBitmap;
+}
+void CFX_BitmapStorer::Replace(CFX_DIBitmap* pBitmap)
+{
+ if (m_pBitmap) {
+ delete m_pBitmap;
+ }
+ m_pBitmap = pBitmap;
+}
+void CFX_BitmapStorer::ComposeScanline(int line, FX_LPCBYTE scanline, FX_LPCBYTE scan_extra_alpha)
+{
+ FX_LPBYTE dest_buf = (FX_LPBYTE)m_pBitmap->GetScanline(line);
+ FX_LPBYTE dest_alpha_buf = m_pBitmap->m_pAlphaMask ?
+ (FX_LPBYTE)m_pBitmap->m_pAlphaMask->GetScanline(line) : NULL;
+ if (dest_buf) {
+ FXSYS_memcpy32(dest_buf, scanline, m_pBitmap->GetPitch());
+ }
+ if (dest_alpha_buf) {
+ FXSYS_memcpy32(dest_alpha_buf, scan_extra_alpha, m_pBitmap->m_pAlphaMask->GetPitch());
+ }
+}
+FX_BOOL CFX_BitmapStorer::SetInfo(int width, int height, FXDIB_Format src_format, FX_DWORD* pSrcPalette)
+{
+ m_pBitmap = FX_NEW CFX_DIBitmap;
+ if (!m_pBitmap) {
+ return FALSE;
+ }
+ if (!m_pBitmap->Create(width, height, src_format)) {
+ delete m_pBitmap;
+ m_pBitmap = NULL;
+ return FALSE;
+ }
+ if (pSrcPalette) {
+ m_pBitmap->CopyPalette(pSrcPalette);
+ }
+ return TRUE;
+}
diff --git a/core/src/fxge/dib/fx_dib_transform.cpp b/core/src/fxge/dib/fx_dib_transform.cpp
new file mode 100644
index 0000000000..4d83005161
--- /dev/null
+++ b/core/src/fxge/dib/fx_dib_transform.cpp
@@ -0,0 +1,797 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxge/fx_dib.h"
+#include "dib_int.h"
+int SDP_Table[513] = {
+ 256, 256, 256, 256, 256, 256, 256, 256, 256, 255, 255, 255, 255, 255, 255, 254, 254, 254, 254,
+ 253, 253, 253, 252, 252, 252, 251, 251, 251, 250, 250, 249, 249, 249, 248, 248, 247, 247, 246,
+ 246, 245, 244, 244, 243, 243, 242, 242, 241, 240, 240, 239, 238, 238, 237, 236, 236, 235, 234,
+ 233, 233, 232, 231, 230, 230, 229, 228, 227, 226, 226, 225, 224, 223, 222, 221, 220, 219, 218,
+ 218, 217, 216, 215, 214, 213, 212, 211, 210, 209, 208, 207, 206, 205, 204, 203, 202, 201, 200,
+ 199, 198, 196, 195, 194, 193, 192, 191, 190, 189, 188, 186, 185, 184, 183, 182, 181, 179, 178,
+ 177, 176, 175, 173, 172, 171, 170, 169, 167, 166, 165, 164, 162, 161, 160, 159, 157, 156, 155,
+ 154, 152, 151, 150, 149, 147, 146, 145, 143, 142, 141, 140, 138, 137, 136, 134, 133, 132, 130,
+ 129, 128, 126, 125, 124, 122, 121, 120, 119, 117, 116, 115, 113, 112, 111, 109, 108, 107, 105,
+ 104, 103, 101, 100, 99, 97, 96, 95, 93, 92, 91, 89, 88, 87, 85, 84, 83, 81, 80, 79, 77, 76, 75,
+ 73, 72, 71, 69, 68, 67, 66, 64, 63, 62, 60, 59, 58, 57, 55, 54, 53, 52, 50, 49, 48, 47, 45, 44,
+ 43, 42, 40, 39, 38, 37, 36, 34, 33, 32, 31, 30, 28, 27, 26, 25, 24, 23, 21, 20, 19, 18, 17, 16,
+ 15, 14, 13, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0, -1, -2, -3, -4, -5, -6, -7, -7, -8, -9, -10,
+ -11, -12, -12, -13, -14, -15, -15, -16, -17, -17, -18, -19, -19, -20, -21, -21, -22, -22, -23, -24,
+ -24, -25, -25, -26, -26, -27, -27, -27, -28, -28, -29, -29, -30, -30, -30, -31, -31, -31, -32, -32,
+ -32, -33, -33, -33, -33, -34, -34, -34, -34, -35, -35, -35, -35, -35, -36, -36, -36, -36, -36, -36,
+ -36, -36, -36, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37, -37,
+ -37, -37, -37, -37, -36, -36, -36, -36, -36, -36, -36, -36, -36, -35, -35, -35, -35, -35, -35, -34,
+ -34, -34, -34, -34, -33, -33, -33, -33, -33, -32, -32, -32, -32, -31, -31, -31, -31, -30, -30, -30,
+ -30, -29, -29, -29, -29, -28, -28, -28, -27, -27, -27, -27, -26, -26, -26, -25, -25, -25, -24, -24,
+ -24, -23, -23, -23, -22, -22, -22, -22, -21, -21, -21, -20, -20, -20, -19, -19, -19, -18, -18, -18,
+ -17, -17, -17, -16, -16, -16, -15, -15, -15, -14, -14, -14, -13, -13, -13, -12, -12, -12, -11, -11,
+ -11, -10, -10, -10, -9, -9, -9, -9, -8, -8, -8, -7, -7, -7, -7, -6, -6, -6, -6, -5, -5, -5, -5, -4,
+ -4, -4, -4, -3, -3, -3, -3, -3, -2, -2, -2, -2, -2, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+};
+class CFX_BilinearMatrix : public CPDF_FixedMatrix
+{
+public:
+ CFX_BilinearMatrix(const CFX_AffineMatrix& src, int bits): CPDF_FixedMatrix(src, bits)
+ {}
+ inline void Transform(int x, int y, int& x1, int& y1, int&res_x, int&res_y)
+ {
+ x1 = a * x + c * y + e + base / 2;
+ y1 = b * x + d * y + f + base / 2;
+ res_x = x1 % base;
+ res_y = y1 % base;
+ if (res_x < 0 && res_x > -base) {
+ res_x = base + res_x;
+ }
+ if (res_y < 0 && res_x > -base) {
+ res_y = base + res_y;
+ }
+ x1 /= base;
+ y1 /= base;
+ }
+};
+CFX_DIBitmap* CFX_DIBSource::SwapXY(FX_BOOL bXFlip, FX_BOOL bYFlip, const FX_RECT* pDestClip) const
+{
+ FX_RECT dest_clip(0, 0, m_Height, m_Width);
+ if (pDestClip) {
+ dest_clip.Intersect(*pDestClip);
+ }
+ if (dest_clip.IsEmpty()) {
+ return NULL;
+ }
+ CFX_DIBitmap* pTransBitmap = FX_NEW CFX_DIBitmap;
+ if (!pTransBitmap) {
+ return NULL;
+ }
+ int result_height = dest_clip.Height(), result_width = dest_clip.Width();
+ if (!pTransBitmap->Create(result_width, result_height, GetFormat())) {
+ delete pTransBitmap;
+ return NULL;
+ }
+ pTransBitmap->CopyPalette(m_pPalette);
+ int src_pitch = m_Pitch;
+ int dest_pitch = pTransBitmap->GetPitch();
+ FX_LPBYTE dest_buf = pTransBitmap->GetBuffer();
+ int row_start = bXFlip ? m_Height - dest_clip.right : dest_clip.left;
+ int row_end = bXFlip ? m_Height - dest_clip.left : dest_clip.right;
+ int col_start = bYFlip ? m_Width - dest_clip.bottom : dest_clip.top;
+ int col_end = bYFlip ? m_Width - dest_clip.top : dest_clip.bottom;
+ if (GetBPP() == 1) {
+ FXSYS_memset8(dest_buf, 0xff, dest_pitch * result_height);
+ for (int row = row_start; row < row_end; row ++) {
+ FX_LPCBYTE src_scan = GetScanline(row);
+ int dest_col = (bXFlip ? dest_clip.right - (row - row_start) - 1 : row) - dest_clip.left;
+ FX_LPBYTE dest_scan = dest_buf;
+ if (bYFlip) {
+ dest_scan += (result_height - 1) * dest_pitch;
+ }
+ int dest_step = bYFlip ? -dest_pitch : dest_pitch;
+ for (int col = col_start; col < col_end; col ++) {
+ if (!(src_scan[col / 8] & (1 << (7 - col % 8)))) {
+ dest_scan[dest_col / 8] &= ~(1 << (7 - dest_col % 8));
+ }
+ dest_scan += dest_step;
+ }
+ }
+ } else {
+ int nBytes = GetBPP() / 8;
+ int dest_step = bYFlip ? -dest_pitch : dest_pitch;
+ if (nBytes == 3) {
+ dest_step -= 2;
+ }
+ for (int row = row_start; row < row_end; row ++) {
+ int dest_col = (bXFlip ? dest_clip.right - (row - row_start) - 1 : row) - dest_clip.left;
+ FX_LPBYTE dest_scan = dest_buf + dest_col * nBytes;
+ if (bYFlip) {
+ dest_scan += (result_height - 1) * dest_pitch;
+ }
+ if (nBytes == 4) {
+ FX_DWORD* src_scan = (FX_DWORD*)GetScanline(row) + col_start;
+ for (int col = col_start; col < col_end; col ++) {
+ *(FX_DWORD*)dest_scan = *src_scan++;
+ dest_scan += dest_step;
+ }
+ } else {
+ FX_LPCBYTE src_scan = GetScanline(row) + col_start * nBytes;
+ if (nBytes == 1)
+ for (int col = col_start; col < col_end; col ++) {
+ *dest_scan = *src_scan++;
+ dest_scan += dest_step;
+ }
+ else
+ for (int col = col_start; col < col_end; col ++) {
+ *dest_scan++ = *src_scan++;
+ *dest_scan++ = *src_scan++;
+ *dest_scan = *src_scan++;
+ dest_scan += dest_step;
+ }
+ }
+ }
+ }
+ if (m_pAlphaMask) {
+ src_pitch = m_pAlphaMask->m_Pitch;
+ dest_pitch = pTransBitmap->m_pAlphaMask->GetPitch();
+ dest_buf = pTransBitmap->m_pAlphaMask->GetBuffer();
+ int dest_step = bYFlip ? -dest_pitch : dest_pitch;
+ for (int row = row_start; row < row_end; row ++) {
+ int dest_col = (bXFlip ? dest_clip.right - (row - row_start) - 1 : row) - dest_clip.left;
+ FX_LPBYTE dest_scan = dest_buf + dest_col;
+ if (bYFlip) {
+ dest_scan += (result_height - 1) * dest_pitch;
+ }
+ FX_LPCBYTE src_scan = m_pAlphaMask->GetScanline(row) + col_start;
+ for (int col = col_start; col < col_end; col ++) {
+ *dest_scan = *src_scan++;
+ dest_scan += dest_step;
+ }
+ }
+ }
+ return pTransBitmap;
+}
+#define FIX16_005 0.05f
+FX_RECT _FXDIB_SwapClipBox(FX_RECT& clip, int width, int height, FX_BOOL bFlipX, FX_BOOL bFlipY)
+{
+ FX_RECT rect;
+ if (bFlipY) {
+ rect.left = height - clip.top;
+ rect.right = height - clip.bottom;
+ } else {
+ rect.left = clip.top;
+ rect.right = clip.bottom;
+ }
+ if (bFlipX) {
+ rect.top = width - clip.left;
+ rect.bottom = width - clip.right;
+ } else {
+ rect.top = clip.left;
+ rect.bottom = clip.right;
+ }
+ rect.Normalize();
+ return rect;
+}
+CFX_DIBitmap* CFX_DIBSource::TransformTo(const CFX_AffineMatrix* pDestMatrix, int& result_left, int& result_top,
+ FX_DWORD flags, const FX_RECT* pDestClip) const
+{
+ CFX_ImageTransformer transformer;
+ transformer.Start(this, pDestMatrix, flags, pDestClip);
+ transformer.Continue(NULL);
+ result_left = transformer.m_ResultLeft;
+ result_top = transformer.m_ResultTop;
+ CFX_DIBitmap* pTransformed = transformer.m_Storer.Detach();
+ return pTransformed;
+}
+CFX_DIBitmap* CFX_DIBSource::StretchTo(int dest_width, int dest_height, FX_DWORD flags, const FX_RECT* pClip) const
+{
+ FX_RECT clip_rect(0, 0, FXSYS_abs(dest_width), FXSYS_abs(dest_height));
+ if (pClip) {
+ clip_rect.Intersect(*pClip);
+ }
+ if (clip_rect.IsEmpty()) {
+ return NULL;
+ }
+ if (dest_width == m_Width && dest_height == m_Height) {
+ return Clone(&clip_rect);
+ }
+ CFX_ImageStretcher stretcher;
+ CFX_BitmapStorer storer;
+ if (stretcher.Start(&storer, this, dest_width, dest_height, clip_rect, flags)) {
+ stretcher.Continue(NULL);
+ }
+ return storer.Detach();
+}
+CFX_ImageTransformer::CFX_ImageTransformer()
+{
+ m_Status = 0;
+ m_pMatrix = NULL;
+}
+CFX_ImageTransformer::~CFX_ImageTransformer()
+{
+}
+FX_BOOL CFX_ImageTransformer::Start(const CFX_DIBSource* pSrc, const CFX_AffineMatrix* pDestMatrix, int flags, const FX_RECT* pDestClip)
+{
+ m_pMatrix = (CFX_AffineMatrix*)pDestMatrix;
+ CFX_FloatRect unit_rect = pDestMatrix->GetUnitRect();
+ FX_RECT result_rect = unit_rect.GetClosestRect();
+ FX_RECT result_clip = result_rect;
+ if (pDestClip) {
+ result_clip.Intersect(*pDestClip);
+ }
+ if (result_clip.IsEmpty()) {
+ return FALSE;
+ }
+ m_ResultLeft = result_clip.left;
+ m_ResultTop = result_clip.top;
+ m_ResultWidth = result_clip.Width();
+ m_ResultHeight = result_clip.Height();
+ m_Flags = flags;
+ if (FXSYS_fabs(pDestMatrix->a) < FXSYS_fabs(pDestMatrix->b) / 20 &&
+ FXSYS_fabs(pDestMatrix->d) < FXSYS_fabs(pDestMatrix->c) / 20 &&
+ FXSYS_fabs(pDestMatrix->a) < 0.5f && FXSYS_fabs(pDestMatrix->d) < 0.5f) {
+ int dest_width = result_rect.Width();
+ int dest_height = result_rect.Height();
+ result_clip.Offset(-result_rect.left, -result_rect.top);
+ result_clip = _FXDIB_SwapClipBox(result_clip, dest_width, dest_height, pDestMatrix->c > 0, pDestMatrix->b < 0);
+ m_Stretcher.Start(&m_Storer, pSrc, dest_height, dest_width, result_clip, flags);
+ m_Status = 1;
+ return TRUE;
+ }
+ if (FXSYS_fabs(pDestMatrix->b) < FIX16_005 && FXSYS_fabs(pDestMatrix->c) < FIX16_005) {
+ int dest_width = pDestMatrix->a > 0 ? (int)FXSYS_ceil(pDestMatrix->a) : (int)FXSYS_floor(pDestMatrix->a);
+ int dest_height = pDestMatrix->d > 0 ? (int) - FXSYS_ceil(pDestMatrix->d) : (int) - FXSYS_floor(pDestMatrix->d);
+ result_clip.Offset(-result_rect.left, -result_rect.top);
+ m_Stretcher.Start(&m_Storer, pSrc, dest_width, dest_height, result_clip, flags);
+ m_Status = 2;
+ return TRUE;
+ }
+ int stretch_width = (int)FXSYS_ceil(FXSYS_sqrt2(pDestMatrix->a, pDestMatrix->b));
+ int stretch_height = (int)FXSYS_ceil(FXSYS_sqrt2(pDestMatrix->c, pDestMatrix->d));
+ CFX_AffineMatrix stretch2dest(1.0f, 0.0f, 0.0f, -1.0f, 0.0f, (FX_FLOAT)(stretch_height));
+ stretch2dest.Concat(pDestMatrix->a / stretch_width, pDestMatrix->b / stretch_width,
+ pDestMatrix->c / stretch_height, pDestMatrix->d / stretch_height, pDestMatrix->e, pDestMatrix->f);
+ m_dest2stretch.SetReverse(stretch2dest);
+ CFX_FloatRect clip_rect_f(result_clip);
+ clip_rect_f.Transform(&m_dest2stretch);
+ m_StretchClip = clip_rect_f.GetOutterRect();
+ m_StretchClip.Intersect(0, 0, stretch_width, stretch_height);
+ m_Stretcher.Start(&m_Storer, pSrc, stretch_width, stretch_height, m_StretchClip, flags);
+ m_Status = 3;
+ return TRUE;
+}
+FX_BYTE _bilinear_interpol(FX_LPCBYTE buf, int row_offset_l, int row_offset_r,
+ int src_col_l, int src_col_r, int res_x, int res_y,
+ int bpp, int c_offset)
+{
+ int i_resx = 255 - res_x;
+ int col_bpp_l = src_col_l * bpp;
+ int col_bpp_r = src_col_r * bpp;
+ FX_LPCBYTE buf_u = buf + row_offset_l + c_offset;
+ FX_LPCBYTE buf_d = buf + row_offset_r + c_offset;
+ FX_LPCBYTE src_pos0 = buf_u + col_bpp_l;
+ FX_LPCBYTE src_pos1 = buf_u + col_bpp_r;
+ FX_LPCBYTE src_pos2 = buf_d + col_bpp_l;
+ FX_LPCBYTE src_pos3 = buf_d + col_bpp_r;
+ FX_BYTE r_pos_0 = (*src_pos0 * i_resx + *src_pos1 * res_x) >> 8;
+ FX_BYTE r_pos_1 = (*src_pos2 * i_resx + *src_pos3 * res_x) >> 8;
+ return (r_pos_0 * (255 - res_y) + r_pos_1 * res_y) >> 8;
+}
+FX_BYTE _bicubic_interpol(FX_LPCBYTE buf, int pitch, int pos_pixel[], int u_w[], int v_w[], int res_x, int res_y,
+ int bpp, int c_offset)
+{
+ int s_result = 0;
+ for (int i = 0; i < 4; i ++) {
+ int a_result = 0;
+ for (int j = 0; j < 4; j ++) {
+ a_result += u_w[j] * (*(FX_BYTE*)(buf + pos_pixel[i + 4] * pitch + pos_pixel[j] * bpp + c_offset));
+ }
+ s_result += a_result * v_w[i];
+ }
+ s_result >>= 16;
+ return (FX_BYTE)(s_result < 0 ? 0 : s_result > 255 ? 255 : s_result);
+}
+void _bicubic_get_pos_weight(int pos_pixel[], int u_w[], int v_w[], int src_col_l, int src_row_l,
+ int res_x, int res_y, int stretch_width, int stretch_height)
+{
+ pos_pixel[0] = src_col_l - 1;
+ pos_pixel[1] = src_col_l;
+ pos_pixel[2] = src_col_l + 1;
+ pos_pixel[3] = src_col_l + 2;
+ pos_pixel[4] = src_row_l - 1;
+ pos_pixel[5] = src_row_l;
+ pos_pixel[6] = src_row_l + 1;
+ pos_pixel[7] = src_row_l + 2;
+ for (int i = 0 ; i < 4; i ++) {
+ if (pos_pixel[i] < 0) {
+ pos_pixel[i] = 0;
+ }
+ if (pos_pixel[i] >= stretch_width) {
+ pos_pixel[i] = stretch_width - 1;
+ }
+ if (pos_pixel[i + 4] < 0) {
+ pos_pixel[i + 4] = 0;
+ }
+ if (pos_pixel[i + 4] >= stretch_height) {
+ pos_pixel[i + 4] = stretch_height - 1;
+ }
+ }
+ u_w[0] = SDP_Table[256 + res_x];
+ u_w[1] = SDP_Table[res_x];
+ u_w[2] = SDP_Table[256 - res_x];
+ u_w[3] = SDP_Table[512 - res_x];
+ v_w[0] = SDP_Table[256 + res_y];
+ v_w[1] = SDP_Table[res_y];
+ v_w[2] = SDP_Table[256 - res_y];
+ v_w[3] = SDP_Table[512 - res_y];
+}
+FXDIB_Format _GetTransformedFormat(const CFX_DIBSource* pDrc)
+{
+ FXDIB_Format format = pDrc->GetFormat();
+ if (pDrc->IsAlphaMask()) {
+ format = FXDIB_8bppMask;
+ } else if (format >= 1025) {
+ format = FXDIB_Cmyka;
+ } else if (format <= 32 || format == FXDIB_Argb) {
+ format = FXDIB_Argb;
+ } else {
+ format = FXDIB_Rgba;
+ }
+ return format;
+}
+FX_BOOL CFX_ImageTransformer::Continue(IFX_Pause* pPause)
+{
+ if (m_Status == 1) {
+ if (m_Stretcher.Continue(pPause)) {
+ return TRUE;
+ }
+ if (m_Storer.GetBitmap()) {
+ m_Storer.Replace(m_Storer.GetBitmap()->SwapXY(m_pMatrix->c > 0, m_pMatrix->b < 0));
+ }
+ return FALSE;
+ } else if (m_Status == 2) {
+ return m_Stretcher.Continue(pPause);
+ } else if (m_Status != 3) {
+ return FALSE;
+ }
+ if (m_Stretcher.Continue(pPause)) {
+ return TRUE;
+ }
+ int stretch_width = m_StretchClip.Width();
+ int stretch_height = m_StretchClip.Height();
+ if (m_Storer.GetBitmap() == NULL) {
+ return FALSE;
+ }
+ FX_LPCBYTE stretch_buf = m_Storer.GetBitmap()->GetBuffer();
+ FX_LPCBYTE stretch_buf_mask = NULL;
+ if (m_Storer.GetBitmap()->m_pAlphaMask) {
+ stretch_buf_mask = m_Storer.GetBitmap()->m_pAlphaMask->GetBuffer();
+ }
+ int stretch_pitch = m_Storer.GetBitmap()->GetPitch();
+ CFX_DIBitmap* pTransformed = FX_NEW CFX_DIBitmap;
+ if (!pTransformed) {
+ return FALSE;
+ }
+ FXDIB_Format transformF = _GetTransformedFormat(m_Stretcher.m_pSource);
+ if (!pTransformed->Create(m_ResultWidth, m_ResultHeight, transformF)) {
+ delete pTransformed;
+ return FALSE;
+ }
+ pTransformed->Clear(0);
+ if (pTransformed->m_pAlphaMask) {
+ pTransformed->m_pAlphaMask->Clear(0);
+ }
+ CFX_AffineMatrix result2stretch(1.0f, 0.0f, 0.0f, 1.0f, (FX_FLOAT)(m_ResultLeft), (FX_FLOAT)(m_ResultTop));
+ result2stretch.Concat(m_dest2stretch);
+ result2stretch.TranslateI(-m_StretchClip.left, -m_StretchClip.top);
+ if (stretch_buf_mask == NULL && pTransformed->m_pAlphaMask) {
+ pTransformed->m_pAlphaMask->Clear(0xff000000);
+ } else if (pTransformed->m_pAlphaMask) {
+ int stretch_pitch_mask = m_Storer.GetBitmap()->m_pAlphaMask->GetPitch();
+ if (!(m_Flags & FXDIB_DOWNSAMPLE) && !(m_Flags & FXDIB_BICUBIC_INTERPOL)) {
+ CFX_BilinearMatrix result2stretch_fix(result2stretch, 8);
+ for (int row = 0; row < m_ResultHeight; row ++) {
+ FX_BYTE* dest_pos_mask = (FX_BYTE*)pTransformed->m_pAlphaMask->GetScanline(row);
+ for (int col = 0; col < m_ResultWidth; col ++) {
+ int src_col_l, src_row_l, res_x, res_y;
+ result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, res_y);
+ if (src_col_l >= 0 && src_col_l <= stretch_width && src_row_l >= 0 && src_row_l <= stretch_height) {
+ if (src_col_l == stretch_width) {
+ src_col_l--;
+ }
+ if (src_row_l == stretch_height) {
+ src_row_l--;
+ }
+ int src_col_r = src_col_l + 1;
+ int src_row_r = src_row_l + 1;
+ if (src_col_r == stretch_width) {
+ src_col_r--;
+ }
+ if (src_row_r == stretch_height) {
+ src_row_r--;
+ }
+ int row_offset_l = src_row_l * stretch_pitch_mask;
+ int row_offset_r = src_row_r * stretch_pitch_mask;
+ *dest_pos_mask = _bilinear_interpol(stretch_buf_mask, row_offset_l, row_offset_r, src_col_l, src_col_r, res_x, res_y, 1, 0);
+ }
+ dest_pos_mask++;
+ }
+ }
+ } else if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
+ CFX_BilinearMatrix result2stretch_fix(result2stretch, 8);
+ int pos_pixel[8];
+ for (int row = 0; row < m_ResultHeight; row ++) {
+ FX_BYTE* dest_pos_mask = (FX_BYTE*)pTransformed->m_pAlphaMask->GetScanline(row);
+ for (int col = 0; col < m_ResultWidth; col ++) {
+ int src_col_l, src_row_l, res_x, res_y;
+ result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, res_y);
+ if (src_col_l >= 0 && src_col_l <= stretch_width && src_row_l >= 0 && src_row_l <= stretch_height) {
+ int u_w[4], v_w[4];
+ if (src_col_l == stretch_width) {
+ src_col_l--;
+ }
+ if (src_row_l == stretch_height) {
+ src_row_l--;
+ }
+ _bicubic_get_pos_weight(pos_pixel, u_w, v_w, src_col_l, src_row_l, res_x, res_y, stretch_width, stretch_height);
+ *dest_pos_mask = _bicubic_interpol(stretch_buf_mask, stretch_pitch_mask, pos_pixel, u_w, v_w, res_x, res_y, 1, 0);
+ }
+ dest_pos_mask++;
+ }
+ }
+ } else {
+ CPDF_FixedMatrix result2stretch_fix(result2stretch, 8);
+ for (int row = 0; row < m_ResultHeight; row ++) {
+ FX_BYTE* dest_pos_mask = (FX_BYTE*)pTransformed->m_pAlphaMask->GetScanline(row);
+ for (int col = 0; col < m_ResultWidth; col ++) {
+ int src_col, src_row;
+ result2stretch_fix.Transform(col, row, src_col, src_row);
+ if (src_col >= 0 && src_col <= stretch_width && src_row >= 0 && src_row <= stretch_height) {
+ if (src_col == stretch_width) {
+ src_col --;
+ }
+ if (src_row == stretch_height) {
+ src_row --;
+ }
+ *dest_pos_mask = stretch_buf_mask[src_row * stretch_pitch_mask + src_col];
+ }
+ dest_pos_mask++;
+ }
+ }
+ }
+ }
+ if (m_Storer.GetBitmap()->IsAlphaMask()) {
+ if (!(m_Flags & FXDIB_DOWNSAMPLE) && !(m_Flags & FXDIB_BICUBIC_INTERPOL)) {
+ CFX_BilinearMatrix result2stretch_fix(result2stretch, 8);
+ for (int row = 0; row < m_ResultHeight; row ++) {
+ FX_LPBYTE dest_scan = (FX_LPBYTE)pTransformed->GetScanline(row);
+ for (int col = 0; col < m_ResultWidth; col ++) {
+ int src_col_l, src_row_l, res_x, res_y;
+ result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, res_y);
+ if (src_col_l >= 0 && src_col_l <= stretch_width && src_row_l >= 0 && src_row_l <= stretch_height) {
+ if (src_col_l == stretch_width) {
+ src_col_l--;
+ }
+ if (src_row_l == stretch_height) {
+ src_row_l--;
+ }
+ int src_col_r = src_col_l + 1;
+ int src_row_r = src_row_l + 1;
+ if (src_col_r == stretch_width) {
+ src_col_r--;
+ }
+ if (src_row_r == stretch_height) {
+ src_row_r--;
+ }
+ int row_offset_l = src_row_l * stretch_pitch;
+ int row_offset_r = src_row_r * stretch_pitch;
+ *dest_scan = _bilinear_interpol(stretch_buf, row_offset_l, row_offset_r, src_col_l, src_col_r, res_x, res_y, 1, 0);
+ }
+ dest_scan ++;
+ }
+ }
+ } else if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
+ CFX_BilinearMatrix result2stretch_fix(result2stretch, 8);
+ int pos_pixel[8];
+ for (int row = 0; row < m_ResultHeight; row ++) {
+ FX_LPBYTE dest_scan = (FX_LPBYTE)pTransformed->GetScanline(row);
+ for (int col = 0; col < m_ResultWidth; col ++) {
+ int src_col_l, src_row_l, res_x, res_y;
+ result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, res_y);
+ if (src_col_l >= 0 && src_col_l <= stretch_width && src_row_l >= 0 && src_row_l <= stretch_height) {
+ int u_w[4], v_w[4];
+ if (src_col_l == stretch_width) {
+ src_col_l--;
+ }
+ if (src_row_l == stretch_height) {
+ src_row_l--;
+ }
+ _bicubic_get_pos_weight(pos_pixel, u_w, v_w, src_col_l, src_row_l, res_x, res_y, stretch_width, stretch_height);
+ *dest_scan = _bicubic_interpol(stretch_buf, stretch_pitch, pos_pixel, u_w, v_w, res_x, res_y, 1, 0);
+ }
+ dest_scan ++;
+ }
+ }
+ } else {
+ CPDF_FixedMatrix result2stretch_fix(result2stretch, 8);
+ for (int row = 0; row < m_ResultHeight; row ++) {
+ FX_LPBYTE dest_scan = (FX_LPBYTE)pTransformed->GetScanline(row);
+ for (int col = 0; col < m_ResultWidth; col ++) {
+ int src_col, src_row;
+ result2stretch_fix.Transform(col, row, src_col, src_row);
+ if (src_col >= 0 && src_col <= stretch_width && src_row >= 0 && src_row <= stretch_height) {
+ if (src_col == stretch_width) {
+ src_col --;
+ }
+ if (src_row == stretch_height) {
+ src_row --;
+ }
+ FX_LPCBYTE src_pixel = stretch_buf + stretch_pitch * src_row + src_col;
+ *dest_scan = *src_pixel;
+ }
+ dest_scan ++;
+ }
+ }
+ }
+ } else {
+ int Bpp = m_Storer.GetBitmap()->GetBPP() / 8;
+ int destBpp = pTransformed->GetBPP() / 8;
+ if (Bpp == 1) {
+ FX_BOOL bHasAlpha = m_Storer.GetBitmap()->HasAlpha();
+ FX_DWORD argb[256];
+ FX_ARGB* pPal = m_Storer.GetBitmap()->GetPalette();
+ if (pPal) {
+ for (int i = 0; i < 256; i ++) {
+ argb[i] = pPal[i];
+ }
+ } else {
+ if (m_Storer.GetBitmap()->IsCmykImage())
+ for (int i = 0; i < 256; i ++) {
+ argb[i] = 255 - i;
+ }
+ else
+ for (int i = 0; i < 256; i ++) {
+ argb[i] = 0xff000000 | (i * 0x010101);
+ }
+ }
+ if (!(m_Flags & FXDIB_DOWNSAMPLE) && !(m_Flags & FXDIB_BICUBIC_INTERPOL)) {
+ CFX_BilinearMatrix result2stretch_fix(result2stretch, 8);
+ for (int row = 0; row < m_ResultHeight; row ++) {
+ FX_BYTE* dest_pos = (FX_BYTE*)pTransformed->GetScanline(row);
+ for (int col = 0; col < m_ResultWidth; col ++) {
+ int src_col_l, src_row_l, res_x, res_y;
+ result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, res_y);
+ if (src_col_l >= 0 && src_col_l <= stretch_width && src_row_l >= 0 && src_row_l <= stretch_height) {
+ if (src_col_l == stretch_width) {
+ src_col_l--;
+ }
+ if (src_row_l == stretch_height) {
+ src_row_l--;
+ }
+ int src_col_r = src_col_l + 1;
+ int src_row_r = src_row_l + 1;
+ if (src_col_r == stretch_width) {
+ src_col_r--;
+ }
+ if (src_row_r == stretch_height) {
+ src_row_r--;
+ }
+ int row_offset_l = src_row_l * stretch_pitch;
+ int row_offset_r = src_row_r * stretch_pitch;
+ FX_DWORD r_bgra_cmyk = argb[_bilinear_interpol(stretch_buf, row_offset_l, row_offset_r, src_col_l, src_col_r, res_x, res_y, 1, 0)];
+ if (transformF == FXDIB_Rgba) {
+ dest_pos[0] = (FX_BYTE)(r_bgra_cmyk >> 24);
+ dest_pos[1] = (FX_BYTE)(r_bgra_cmyk >> 16);
+ dest_pos[2] = (FX_BYTE)(r_bgra_cmyk >> 8);
+ } else {
+ *(FX_DWORD*)dest_pos = r_bgra_cmyk;
+ }
+ }
+ dest_pos += destBpp;
+ }
+ }
+ } else if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
+ CFX_BilinearMatrix result2stretch_fix(result2stretch, 8);
+ int pos_pixel[8];
+ for (int row = 0; row < m_ResultHeight; row ++) {
+ FX_BYTE* dest_pos = (FX_BYTE*)pTransformed->GetScanline(row);
+ for (int col = 0; col < m_ResultWidth; col ++) {
+ int src_col_l, src_row_l, res_x, res_y;
+ result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, res_y);
+ if (src_col_l >= 0 && src_col_l <= stretch_width && src_row_l >= 0 && src_row_l <= stretch_height) {
+ int u_w[4], v_w[4];
+ if (src_col_l == stretch_width) {
+ src_col_l--;
+ }
+ if (src_row_l == stretch_height) {
+ src_row_l--;
+ }
+ _bicubic_get_pos_weight(pos_pixel, u_w, v_w, src_col_l, src_row_l, res_x, res_y, stretch_width, stretch_height);
+ FX_DWORD r_bgra_cmyk = argb[_bicubic_interpol(stretch_buf, stretch_pitch, pos_pixel, u_w, v_w, res_x, res_y, 1, 0)];
+ if (transformF == FXDIB_Rgba) {
+ dest_pos[0] = (FX_BYTE)(r_bgra_cmyk >> 24);
+ dest_pos[1] = (FX_BYTE)(r_bgra_cmyk >> 16);
+ dest_pos[2] = (FX_BYTE)(r_bgra_cmyk >> 8);
+ } else {
+ *(FX_DWORD*)dest_pos = r_bgra_cmyk;
+ }
+ }
+ dest_pos += destBpp;
+ }
+ }
+ } else {
+ CPDF_FixedMatrix result2stretch_fix(result2stretch, 8);
+ for (int row = 0; row < m_ResultHeight; row ++) {
+ FX_BYTE* dest_pos = (FX_BYTE*)pTransformed->GetScanline(row);
+ for (int col = 0; col < m_ResultWidth; col ++) {
+ int src_col, src_row;
+ result2stretch_fix.Transform(col, row, src_col, src_row);
+ if (src_col >= 0 && src_col <= stretch_width && src_row >= 0 && src_row <= stretch_height) {
+ if (src_col == stretch_width) {
+ src_col --;
+ }
+ if (src_row == stretch_height) {
+ src_row --;
+ }
+ FX_DWORD r_bgra_cmyk = argb[stretch_buf[src_row * stretch_pitch + src_col]];
+ if (transformF == FXDIB_Rgba) {
+ dest_pos[0] = (FX_BYTE)(r_bgra_cmyk >> 24);
+ dest_pos[1] = (FX_BYTE)(r_bgra_cmyk >> 16);
+ dest_pos[2] = (FX_BYTE)(r_bgra_cmyk >> 8);
+ } else {
+ *(FX_DWORD*)dest_pos = r_bgra_cmyk;
+ }
+ }
+ dest_pos += destBpp;
+ }
+ }
+ }
+ } else {
+ FX_BOOL bHasAlpha = m_Storer.GetBitmap()->HasAlpha();
+ int destBpp = pTransformed->GetBPP() / 8;
+ if (!(m_Flags & FXDIB_DOWNSAMPLE) && !(m_Flags & FXDIB_BICUBIC_INTERPOL)) {
+ CFX_BilinearMatrix result2stretch_fix(result2stretch, 8);
+ for (int row = 0; row < m_ResultHeight; row ++) {
+ FX_BYTE* dest_pos = (FX_BYTE*)pTransformed->GetScanline(row);
+ for (int col = 0; col < m_ResultWidth; col ++) {
+ int src_col_l, src_row_l, res_x, res_y, r_pos_k_r = 0;
+ result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, res_y);
+ if (src_col_l >= 0 && src_col_l <= stretch_width && src_row_l >= 0 && src_row_l <= stretch_height) {
+ if (src_col_l == stretch_width) {
+ src_col_l--;
+ }
+ if (src_row_l == stretch_height) {
+ src_row_l--;
+ }
+ int src_col_r = src_col_l + 1;
+ int src_row_r = src_row_l + 1;
+ if (src_col_r == stretch_width) {
+ src_col_r--;
+ }
+ if (src_row_r == stretch_height) {
+ src_row_r--;
+ }
+ int row_offset_l = src_row_l * stretch_pitch;
+ int row_offset_r = src_row_r * stretch_pitch;
+ FX_BYTE r_pos_red_y_r = _bilinear_interpol(stretch_buf, row_offset_l, row_offset_r, src_col_l, src_col_r, res_x, res_y, Bpp, 2);
+ FX_BYTE r_pos_green_m_r = _bilinear_interpol(stretch_buf, row_offset_l, row_offset_r, src_col_l, src_col_r, res_x, res_y, Bpp, 1);
+ FX_BYTE r_pos_blue_c_r = _bilinear_interpol(stretch_buf, row_offset_l, row_offset_r, src_col_l, src_col_r, res_x, res_y, Bpp, 0);
+ if (bHasAlpha) {
+ if (transformF != FXDIB_Argb) {
+ if (transformF == FXDIB_Rgba) {
+ dest_pos[0] = r_pos_blue_c_r;
+ dest_pos[1] = r_pos_green_m_r;
+ dest_pos[2] = r_pos_red_y_r;
+ } else {
+ r_pos_k_r = _bilinear_interpol(stretch_buf, row_offset_l, row_offset_r, src_col_l, src_col_r, res_x, res_y, Bpp, 3);
+ *(FX_DWORD*)dest_pos = FXCMYK_TODIB(CmykEncode(r_pos_blue_c_r, r_pos_green_m_r, r_pos_red_y_r, r_pos_k_r));
+ }
+ } else {
+ FX_BYTE r_pos_a_r = _bilinear_interpol(stretch_buf, row_offset_l, row_offset_r, src_col_l, src_col_r, res_x, res_y, Bpp, 3);
+ *(FX_DWORD*)dest_pos = FXARGB_TODIB(FXARGB_MAKE(r_pos_a_r, r_pos_red_y_r, r_pos_green_m_r, r_pos_blue_c_r));
+ }
+ } else {
+ r_pos_k_r = 0xff;
+ if (transformF == FXDIB_Cmyka) {
+ r_pos_k_r = _bilinear_interpol(stretch_buf, row_offset_l, row_offset_r, src_col_l, src_col_r, res_x, res_y, Bpp, 3);
+ *(FX_DWORD*)dest_pos = FXCMYK_TODIB(CmykEncode(r_pos_blue_c_r, r_pos_green_m_r, r_pos_red_y_r, r_pos_k_r));
+ } else {
+ *(FX_DWORD*)dest_pos = FXARGB_TODIB(FXARGB_MAKE(r_pos_k_r, r_pos_red_y_r, r_pos_green_m_r, r_pos_blue_c_r));
+ }
+ }
+ }
+ dest_pos += destBpp;
+ }
+ }
+ } else if (m_Flags & FXDIB_BICUBIC_INTERPOL) {
+ CFX_BilinearMatrix result2stretch_fix(result2stretch, 8);
+ int pos_pixel[8];
+ for (int row = 0; row < m_ResultHeight; row ++) {
+ FX_BYTE* dest_pos = (FX_BYTE*)pTransformed->GetScanline(row);
+ for (int col = 0; col < m_ResultWidth; col ++) {
+ int src_col_l, src_row_l, res_x, res_y, r_pos_k_r = 0;
+ result2stretch_fix.Transform(col, row, src_col_l, src_row_l, res_x, res_y);
+ if (src_col_l >= 0 && src_col_l <= stretch_width && src_row_l >= 0 && src_row_l <= stretch_height) {
+ int u_w[4], v_w[4];
+ if (src_col_l == stretch_width) {
+ src_col_l--;
+ }
+ if (src_row_l == stretch_height) {
+ src_row_l--;
+ }
+ _bicubic_get_pos_weight(pos_pixel, u_w, v_w, src_col_l, src_row_l, res_x, res_y, stretch_width, stretch_height);
+ FX_BYTE r_pos_red_y_r = _bicubic_interpol(stretch_buf, stretch_pitch, pos_pixel, u_w, v_w, res_x, res_y, Bpp, 2);
+ FX_BYTE r_pos_green_m_r = _bicubic_interpol(stretch_buf, stretch_pitch, pos_pixel, u_w, v_w, res_x, res_y, Bpp, 1);
+ FX_BYTE r_pos_blue_c_r = _bicubic_interpol(stretch_buf, stretch_pitch, pos_pixel, u_w, v_w, res_x, res_y, Bpp, 0);
+ if (bHasAlpha) {
+ if (transformF != FXDIB_Argb) {
+ if (transformF == FXDIB_Rgba) {
+ dest_pos[0] = r_pos_blue_c_r;
+ dest_pos[1] = r_pos_green_m_r;
+ dest_pos[2] = r_pos_red_y_r;
+ } else {
+ r_pos_k_r = _bicubic_interpol(stretch_buf, stretch_pitch, pos_pixel, u_w, v_w, res_x, res_y, Bpp, 3);
+ *(FX_DWORD*)dest_pos = FXCMYK_TODIB(CmykEncode(r_pos_blue_c_r, r_pos_green_m_r, r_pos_red_y_r, r_pos_k_r));
+ }
+ } else {
+ FX_BYTE r_pos_a_r = _bicubic_interpol(stretch_buf, stretch_pitch, pos_pixel, u_w, v_w, res_x, res_y, Bpp, 3);
+ *(FX_DWORD*)dest_pos = FXARGB_TODIB(FXARGB_MAKE(r_pos_a_r, r_pos_red_y_r, r_pos_green_m_r, r_pos_blue_c_r));
+ }
+ } else {
+ r_pos_k_r = 0xff;
+ if (transformF == FXDIB_Cmyka) {
+ r_pos_k_r = _bicubic_interpol(stretch_buf, stretch_pitch, pos_pixel, u_w, v_w, res_x, res_y, Bpp, 3);
+ *(FX_DWORD*)dest_pos = FXCMYK_TODIB(CmykEncode(r_pos_blue_c_r, r_pos_green_m_r, r_pos_red_y_r, r_pos_k_r));
+ } else {
+ *(FX_DWORD*)dest_pos = FXARGB_TODIB(FXARGB_MAKE(r_pos_k_r, r_pos_red_y_r, r_pos_green_m_r, r_pos_blue_c_r));
+ }
+ }
+ }
+ dest_pos += destBpp;
+ }
+ }
+ } else {
+ CPDF_FixedMatrix result2stretch_fix(result2stretch, 8);
+ for (int row = 0; row < m_ResultHeight; row ++) {
+ FX_BYTE* dest_pos = (FX_BYTE*)pTransformed->GetScanline(row);
+ for (int col = 0; col < m_ResultWidth; col ++) {
+ int src_col, src_row;
+ result2stretch_fix.Transform(col, row, src_col, src_row);
+ if (src_col >= 0 && src_col <= stretch_width && src_row >= 0 && src_row <= stretch_height) {
+ if (src_col == stretch_width) {
+ src_col --;
+ }
+ if (src_row == stretch_height) {
+ src_row --;
+ }
+ FX_LPCBYTE src_pos = stretch_buf + src_row * stretch_pitch + src_col * Bpp;
+ if (bHasAlpha) {
+ if (transformF != FXDIB_Argb) {
+ if (transformF == FXDIB_Rgba) {
+ dest_pos[0] = src_pos[0];
+ dest_pos[1] = src_pos[1];
+ dest_pos[2] = src_pos[2];
+ } else {
+ *(FX_DWORD*)dest_pos = FXCMYK_TODIB(CmykEncode(src_pos[0], src_pos[1], src_pos[2], src_pos[3]));
+ }
+ } else {
+ *(FX_DWORD*)dest_pos = FXARGB_TODIB(FXARGB_MAKE(src_pos[3], src_pos[2], src_pos[1], src_pos[0]));
+ }
+ } else {
+ if (transformF == FXDIB_Cmyka) {
+ *(FX_DWORD*)dest_pos = FXCMYK_TODIB(CmykEncode(src_pos[0], src_pos[1], src_pos[2], src_pos[3]));
+ } else {
+ *(FX_DWORD*)dest_pos = FXARGB_TODIB(FXARGB_MAKE(0xff, src_pos[2], src_pos[1], src_pos[0]));
+ }
+ }
+ }
+ dest_pos += destBpp;
+ }
+ }
+ }
+ }
+ }
+ m_Storer.Replace(pTransformed);
+ return FALSE;
+}
diff --git a/core/src/fxge/fontdata/chromefontdata/FoxitDingbats.c b/core/src/fxge/fontdata/chromefontdata/FoxitDingbats.c
new file mode 100644
index 0000000000..b4c2ac132f
--- /dev/null
+++ b/core/src/fxge/fontdata/chromefontdata/FoxitDingbats.c
@@ -0,0 +1,3697 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+const unsigned char g_FoxitDingbatsFontData [29513] = {0x1,
+ 0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0x11,
+ 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x44, 0x69, 0x6e,
+ 0x67, 0x62, 0x61, 0x74, 0x73, 0x4f, 0x54, 0x46,
+ 0x0, 0x1, 0x1, 0x1, 0x25, 0xf8, 0x10, 0x0,
+ 0xf8, 0xe4, 0x1, 0xf8, 0xe5, 0x2, 0xf8, 0xe5,
+ 0x3, 0xf8, 0xe6, 0x4, 0x8a, 0xfb, 0x38, 0xfa,
+ 0x69, 0xf9, 0xce, 0x5, 0x1c, 0x4, 0xdc, 0xf,
+ 0x1c, 0x4, 0xe3, 0x11, 0xa7, 0x1c, 0x6e, 0x3f,
+ 0x12, 0x0, 0xcc, 0x2, 0x0, 0x1, 0x0, 0x3,
+ 0x0, 0x6, 0x0, 0xa, 0x0, 0xe, 0x0, 0x12,
+ 0x0, 0x16, 0x0, 0x1a, 0x0, 0x1e, 0x0, 0x22,
+ 0x0, 0x26, 0x0, 0x2a, 0x0, 0x2e, 0x0, 0x31,
+ 0x0, 0x35, 0x0, 0x39, 0x0, 0x3d, 0x0, 0x41,
+ 0x0, 0x45, 0x0, 0x49, 0x0, 0x4c, 0x0, 0x50,
+ 0x0, 0x54, 0x0, 0x58, 0x0, 0x5c, 0x0, 0x60,
+ 0x0, 0x64, 0x0, 0x68, 0x0, 0x6c, 0x0, 0x70,
+ 0x0, 0x74, 0x0, 0x77, 0x0, 0x7b, 0x0, 0x7f,
+ 0x0, 0x83, 0x0, 0x87, 0x0, 0x8b, 0x0, 0x8f,
+ 0x0, 0x93, 0x0, 0x97, 0x0, 0x9b, 0x0, 0x9f,
+ 0x0, 0xa2, 0x0, 0xa6, 0x0, 0xaa, 0x0, 0xae,
+ 0x0, 0xb2, 0x0, 0xb6, 0x0, 0xba, 0x0, 0xbe,
+ 0x0, 0xc2, 0x0, 0xc6, 0x0, 0xca, 0x0, 0xcd,
+ 0x0, 0xd1, 0x0, 0xd5, 0x0, 0xd9, 0x0, 0xdd,
+ 0x0, 0xe1, 0x0, 0xe5, 0x0, 0xe9, 0x0, 0xed,
+ 0x0, 0xf1, 0x0, 0xf5, 0x0, 0xf8, 0x0, 0xfc,
+ 0x1, 0x0, 0x1, 0x4, 0x1, 0x8, 0x1, 0xc,
+ 0x1, 0x10, 0x1, 0x14, 0x1, 0x18, 0x1, 0x1c,
+ 0x1, 0x20, 0x1, 0x23, 0x1, 0x27, 0x1, 0x2b,
+ 0x1, 0x2f, 0x1, 0x33, 0x1, 0x37, 0x1, 0x3b,
+ 0x1, 0x3f, 0x1, 0x43, 0x1, 0x47, 0x1, 0x4b,
+ 0x1, 0x4e, 0x1, 0x52, 0x1, 0x56, 0x1, 0x5a,
+ 0x1, 0x5e, 0x1, 0x62, 0x1, 0x66, 0x1, 0x6a,
+ 0x1, 0x6e, 0x1, 0x72, 0x1, 0x76, 0x1, 0x79,
+ 0x1, 0x7d, 0x1, 0x81, 0x1, 0x85, 0x1, 0x89,
+ 0x1, 0x8d, 0x1, 0x91, 0x1, 0x95, 0x1, 0x99,
+ 0x1, 0x9d, 0x1, 0xa1, 0x1, 0xa3, 0x1, 0xa6,
+ 0x1, 0xaa, 0x1, 0xae, 0x1, 0xb2, 0x1, 0xb6,
+ 0x1, 0xba, 0x1, 0xbe, 0x1, 0xc2, 0x1, 0xc5,
+ 0x1, 0xc8, 0x1, 0xcb, 0x1, 0xce, 0x1, 0xd1,
+ 0x1, 0xd4, 0x1, 0xd7, 0x1, 0xda, 0x1, 0xdd,
+ 0x1, 0xdf, 0x1, 0xe2, 0x1, 0xe5, 0x1, 0xe8,
+ 0x1, 0xeb, 0x1, 0xee, 0x1, 0xf1, 0x1, 0xf4,
+ 0x1, 0xf7, 0x1, 0xfa, 0x1, 0xfd, 0x1, 0xff,
+ 0x2, 0x2, 0x2, 0x5, 0x2, 0x8, 0x2, 0xb,
+ 0x2, 0xe, 0x2, 0x11, 0x2, 0x14, 0x2, 0x17,
+ 0x2, 0x1a, 0x2, 0x1d, 0x2, 0x1f, 0x2, 0x22,
+ 0x2, 0x25, 0x2, 0x28, 0x2, 0x2b, 0x2, 0x2e,
+ 0x2, 0x31, 0x2, 0x34, 0x2, 0x37, 0x2, 0x3a,
+ 0x2, 0x3d, 0x2, 0x3f, 0x2, 0x42, 0x2, 0x45,
+ 0x2, 0x48, 0x2, 0x4b, 0x2, 0x4e, 0x2, 0x51,
+ 0x2, 0x54, 0x2, 0x57, 0x2, 0x5a, 0x2, 0x5d,
+ 0x2, 0x5f, 0x2, 0x62, 0x2, 0x65, 0x2, 0x68,
+ 0x2, 0x6b, 0x2, 0x6e, 0x2, 0x71, 0x2, 0x74,
+ 0x2, 0x77, 0x2, 0x7a, 0x2, 0x7d, 0x2, 0x7f,
+ 0x2, 0x82, 0x2, 0x85, 0x2, 0x88, 0x2, 0x8b,
+ 0x2, 0x8e, 0x2, 0x91, 0x2, 0x94, 0x2, 0x97,
+ 0x2, 0x9a, 0x2, 0x9c, 0x2, 0x9f, 0x2, 0xa2,
+ 0x2, 0xa5, 0x2, 0xa8, 0x2, 0xab, 0x2, 0xae,
+ 0x2, 0xb1, 0x2, 0xb4, 0x2, 0xb7, 0x2, 0xba,
+ 0x2, 0xe4, 0x2, 0xf6, 0x2, 0xfc, 0x61, 0x31,
+ 0x61, 0x31, 0x30, 0x61, 0x31, 0x30, 0x30, 0x61,
+ 0x31, 0x30, 0x31, 0x61, 0x31, 0x30, 0x32, 0x61,
+ 0x31, 0x30, 0x33, 0x61, 0x31, 0x30, 0x34, 0x61,
+ 0x31, 0x30, 0x35, 0x61, 0x31, 0x30, 0x36, 0x61,
+ 0x31, 0x30, 0x37, 0x61, 0x31, 0x30, 0x38, 0x61,
+ 0x31, 0x30, 0x39, 0x61, 0x31, 0x31, 0x61, 0x31,
+ 0x31, 0x30, 0x61, 0x31, 0x31, 0x31, 0x61, 0x31,
+ 0x31, 0x32, 0x61, 0x31, 0x31, 0x37, 0x61, 0x31,
+ 0x31, 0x38, 0x61, 0x31, 0x31, 0x39, 0x61, 0x31,
+ 0x32, 0x61, 0x31, 0x32, 0x30, 0x61, 0x31, 0x32,
+ 0x31, 0x61, 0x31, 0x32, 0x32, 0x61, 0x31, 0x32,
+ 0x33, 0x61, 0x31, 0x32, 0x34, 0x61, 0x31, 0x32,
+ 0x35, 0x61, 0x31, 0x32, 0x36, 0x61, 0x31, 0x32,
+ 0x37, 0x61, 0x31, 0x32, 0x38, 0x61, 0x31, 0x32,
+ 0x39, 0x61, 0x31, 0x33, 0x61, 0x31, 0x33, 0x30,
+ 0x61, 0x31, 0x33, 0x31, 0x61, 0x31, 0x33, 0x32,
+ 0x61, 0x31, 0x33, 0x33, 0x61, 0x31, 0x33, 0x34,
+ 0x61, 0x31, 0x33, 0x35, 0x61, 0x31, 0x33, 0x36,
+ 0x61, 0x31, 0x33, 0x37, 0x61, 0x31, 0x33, 0x38,
+ 0x61, 0x31, 0x33, 0x39, 0x61, 0x31, 0x34, 0x61,
+ 0x31, 0x34, 0x30, 0x61, 0x31, 0x34, 0x31, 0x61,
+ 0x31, 0x34, 0x32, 0x61, 0x31, 0x34, 0x33, 0x61,
+ 0x31, 0x34, 0x34, 0x61, 0x31, 0x34, 0x35, 0x61,
+ 0x31, 0x34, 0x36, 0x61, 0x31, 0x34, 0x37, 0x61,
+ 0x31, 0x34, 0x38, 0x61, 0x31, 0x34, 0x39, 0x61,
+ 0x31, 0x35, 0x61, 0x31, 0x35, 0x30, 0x61, 0x31,
+ 0x35, 0x31, 0x61, 0x31, 0x35, 0x32, 0x61, 0x31,
+ 0x35, 0x33, 0x61, 0x31, 0x35, 0x34, 0x61, 0x31,
+ 0x35, 0x35, 0x61, 0x31, 0x35, 0x36, 0x61, 0x31,
+ 0x35, 0x37, 0x61, 0x31, 0x35, 0x38, 0x61, 0x31,
+ 0x35, 0x39, 0x61, 0x31, 0x36, 0x61, 0x31, 0x36,
+ 0x30, 0x61, 0x31, 0x36, 0x31, 0x61, 0x31, 0x36,
+ 0x32, 0x61, 0x31, 0x36, 0x33, 0x61, 0x31, 0x36,
+ 0x34, 0x61, 0x31, 0x36, 0x35, 0x61, 0x31, 0x36,
+ 0x36, 0x61, 0x31, 0x36, 0x37, 0x61, 0x31, 0x36,
+ 0x38, 0x61, 0x31, 0x36, 0x39, 0x61, 0x31, 0x37,
+ 0x61, 0x31, 0x37, 0x30, 0x61, 0x31, 0x37, 0x31,
+ 0x61, 0x31, 0x37, 0x32, 0x61, 0x31, 0x37, 0x33,
+ 0x61, 0x31, 0x37, 0x34, 0x61, 0x31, 0x37, 0x35,
+ 0x61, 0x31, 0x37, 0x36, 0x61, 0x31, 0x37, 0x37,
+ 0x61, 0x31, 0x37, 0x38, 0x61, 0x31, 0x37, 0x39,
+ 0x61, 0x31, 0x38, 0x61, 0x31, 0x38, 0x30, 0x61,
+ 0x31, 0x38, 0x31, 0x61, 0x31, 0x38, 0x32, 0x61,
+ 0x31, 0x38, 0x33, 0x61, 0x31, 0x38, 0x34, 0x61,
+ 0x31, 0x38, 0x35, 0x61, 0x31, 0x38, 0x36, 0x61,
+ 0x31, 0x38, 0x37, 0x61, 0x31, 0x38, 0x38, 0x61,
+ 0x31, 0x38, 0x39, 0x61, 0x31, 0x39, 0x61, 0x31,
+ 0x39, 0x30, 0x61, 0x31, 0x39, 0x31, 0x61, 0x31,
+ 0x39, 0x32, 0x61, 0x31, 0x39, 0x33, 0x61, 0x31,
+ 0x39, 0x34, 0x61, 0x31, 0x39, 0x35, 0x61, 0x31,
+ 0x39, 0x36, 0x61, 0x31, 0x39, 0x37, 0x61, 0x31,
+ 0x39, 0x38, 0x61, 0x31, 0x39, 0x39, 0x61, 0x32,
+ 0x61, 0x32, 0x30, 0x61, 0x32, 0x30, 0x30, 0x61,
+ 0x32, 0x30, 0x31, 0x61, 0x32, 0x30, 0x32, 0x61,
+ 0x32, 0x30, 0x33, 0x61, 0x32, 0x30, 0x34, 0x61,
+ 0x32, 0x30, 0x35, 0x61, 0x32, 0x30, 0x36, 0x61,
+ 0x32, 0x31, 0x61, 0x32, 0x32, 0x61, 0x32, 0x33,
+ 0x61, 0x32, 0x34, 0x61, 0x32, 0x35, 0x61, 0x32,
+ 0x36, 0x61, 0x32, 0x37, 0x61, 0x32, 0x38, 0x61,
+ 0x32, 0x39, 0x61, 0x33, 0x61, 0x33, 0x30, 0x61,
+ 0x33, 0x31, 0x61, 0x33, 0x32, 0x61, 0x33, 0x33,
+ 0x61, 0x33, 0x34, 0x61, 0x33, 0x35, 0x61, 0x33,
+ 0x36, 0x61, 0x33, 0x37, 0x61, 0x33, 0x38, 0x61,
+ 0x33, 0x39, 0x61, 0x34, 0x61, 0x34, 0x30, 0x61,
+ 0x34, 0x31, 0x61, 0x34, 0x32, 0x61, 0x34, 0x33,
+ 0x61, 0x34, 0x34, 0x61, 0x34, 0x35, 0x61, 0x34,
+ 0x36, 0x61, 0x34, 0x37, 0x61, 0x34, 0x38, 0x61,
+ 0x34, 0x39, 0x61, 0x35, 0x61, 0x35, 0x30, 0x61,
+ 0x35, 0x31, 0x61, 0x35, 0x32, 0x61, 0x35, 0x33,
+ 0x61, 0x35, 0x34, 0x61, 0x35, 0x35, 0x61, 0x35,
+ 0x36, 0x61, 0x35, 0x37, 0x61, 0x35, 0x38, 0x61,
+ 0x35, 0x39, 0x61, 0x36, 0x61, 0x36, 0x30, 0x61,
+ 0x36, 0x31, 0x61, 0x36, 0x32, 0x61, 0x36, 0x33,
+ 0x61, 0x36, 0x34, 0x61, 0x36, 0x35, 0x61, 0x36,
+ 0x36, 0x61, 0x36, 0x37, 0x61, 0x36, 0x38, 0x61,
+ 0x36, 0x39, 0x61, 0x37, 0x61, 0x37, 0x30, 0x61,
+ 0x37, 0x31, 0x61, 0x37, 0x32, 0x61, 0x37, 0x33,
+ 0x61, 0x37, 0x34, 0x61, 0x37, 0x35, 0x61, 0x37,
+ 0x36, 0x61, 0x37, 0x37, 0x61, 0x37, 0x38, 0x61,
+ 0x37, 0x39, 0x61, 0x38, 0x61, 0x38, 0x31, 0x61,
+ 0x38, 0x32, 0x61, 0x38, 0x33, 0x61, 0x38, 0x34,
+ 0x61, 0x38, 0x35, 0x61, 0x38, 0x36, 0x61, 0x38,
+ 0x37, 0x61, 0x38, 0x38, 0x61, 0x38, 0x39, 0x61,
+ 0x39, 0x61, 0x39, 0x30, 0x61, 0x39, 0x31, 0x61,
+ 0x39, 0x32, 0x61, 0x39, 0x33, 0x61, 0x39, 0x34,
+ 0x61, 0x39, 0x35, 0x61, 0x39, 0x36, 0x61, 0x39,
+ 0x37, 0x61, 0x39, 0x38, 0x61, 0x39, 0x39, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x20, 0x44,
+ 0x69, 0x6e, 0x67, 0x62, 0x61, 0x74, 0x73, 0x20,
+ 0x4f, 0x54, 0x46, 0x4e, 0x6f, 0x72, 0x6d, 0x61,
+ 0x6c, 0x0, 0x0, 0x1, 0x1, 0x87, 0xc8, 0x0,
+ 0x1, 0x0, 0x0, 0xcb, 0x2, 0x0, 0x1, 0x0,
+ 0x4, 0x1, 0x3, 0x1, 0x8d, 0x1, 0xfa, 0x2,
+ 0x4a, 0x2, 0x95, 0x2, 0xe3, 0x3, 0x25, 0x3,
+ 0x71, 0x3, 0xc9, 0x4, 0xe0, 0x6, 0x2f, 0x6,
+ 0x9f, 0x7, 0xcc, 0x8, 0x9, 0x8, 0x4e, 0x8,
+ 0xce, 0x9, 0x5d, 0xb, 0x1d, 0xc, 0xf8, 0xe,
+ 0x27, 0xe, 0x74, 0xe, 0xe7, 0xf, 0x55, 0xf,
+ 0xa7, 0x10, 0x36, 0x10, 0x90, 0x10, 0xde, 0x11,
+ 0x71, 0x12, 0x22, 0x12, 0xaa, 0x14, 0x21, 0x14,
+ 0x5e, 0x14, 0xca, 0x15, 0x6f, 0x15, 0xce, 0x16,
+ 0x5e, 0x16, 0xe9, 0x17, 0x2d, 0x17, 0xa2, 0x18,
+ 0x1c, 0x18, 0xaa, 0x1a, 0x1f, 0x1a, 0x45, 0x1a,
+ 0x95, 0x1a, 0xfe, 0x1b, 0x34, 0x1b, 0x91, 0x1c,
+ 0xa, 0x1c, 0x3e, 0x1c, 0xbf, 0x1d, 0x35, 0x1d,
+ 0x97, 0x1d, 0xe3, 0x1e, 0x1, 0x1e, 0x56, 0x1e,
+ 0xbc, 0x1e, 0xfa, 0x1f, 0x45, 0x1f, 0xa3, 0x1f,
+ 0xcd, 0x20, 0x42, 0x20, 0xa9, 0x21, 0x14, 0x21,
+ 0x57, 0x21, 0x87, 0x21, 0xb7, 0x21, 0xcc, 0x22,
+ 0x15, 0x22, 0x5f, 0x22, 0x8f, 0x23, 0x15, 0x23,
+ 0x69, 0x23, 0x8f, 0x23, 0xb6, 0x24, 0x5f, 0x24,
+ 0xa1, 0x24, 0xf7, 0x25, 0x18, 0x25, 0x2b, 0x25,
+ 0x40, 0x25, 0x72, 0x25, 0xa2, 0x25, 0xc4, 0x25,
+ 0xf4, 0x26, 0x38, 0x26, 0xa7, 0x26, 0xfc, 0x27,
+ 0x3c, 0x27, 0x82, 0x27, 0xc8, 0x28, 0x22, 0x28,
+ 0x67, 0x28, 0xca, 0x29, 0x3f, 0x29, 0xa5, 0x29,
+ 0xcb, 0x2a, 0x28, 0x2a, 0x4d, 0x2a, 0x81, 0x2a,
+ 0xb0, 0x2a, 0xf3, 0x2b, 0x4e, 0x2b, 0xbc, 0x2b,
+ 0xec, 0x2c, 0x47, 0x2c, 0xb5, 0x2d, 0xc, 0x2d,
+ 0xcd, 0x2e, 0x37, 0x2e, 0x78, 0x2e, 0xbf, 0x2f,
+ 0x84, 0x2f, 0xb8, 0x2f, 0xdf, 0x30, 0x10, 0x30,
+ 0x2d, 0x30, 0xaf, 0x31, 0x34, 0x31, 0xf2, 0x32,
+ 0xcd, 0x33, 0x1a, 0x33, 0x46, 0x33, 0x7e, 0x33,
+ 0xb6, 0x36, 0x8, 0x36, 0xf2, 0x38, 0x52, 0x39,
+ 0x3f, 0x3b, 0x97, 0x3c, 0x1a, 0x3c, 0x82, 0x3c,
+ 0xb1, 0x3d, 0x6, 0x3d, 0x60, 0x3d, 0xb0, 0x3d,
+ 0xdd, 0x40, 0x4b, 0x40, 0x76, 0x40, 0xb1, 0x41,
+ 0x1b, 0x41, 0x81, 0x41, 0xbf, 0x42, 0x1b, 0x42,
+ 0xa2, 0x43, 0x2, 0x45, 0xaf, 0x45, 0xe5, 0x47,
+ 0xc, 0x47, 0xb8, 0x47, 0xfc, 0x48, 0x55, 0x49,
+ 0x91, 0x4a, 0xda, 0x4b, 0xee, 0x4c, 0xb1, 0x4e,
+ 0x67, 0x4f, 0x36, 0x51, 0x49, 0x51, 0x6f, 0x54,
+ 0xde, 0x55, 0x5e, 0x58, 0xd9, 0x59, 0xc7, 0x5a,
+ 0xb9, 0x5b, 0xa5, 0x5c, 0xb1, 0x5d, 0xb9, 0x5e,
+ 0x95, 0x60, 0xef, 0x61, 0x45, 0x62, 0xd, 0x62,
+ 0x38, 0x62, 0x8b, 0x62, 0x9a, 0x62, 0xcb, 0x62,
+ 0xf5, 0x63, 0x9, 0x63, 0x20, 0x63, 0x36, 0x63,
+ 0x8e, 0x63, 0xf7, 0x64, 0x17, 0x64, 0x24, 0x64,
+ 0x32, 0x64, 0x42, 0x64, 0x72, 0x64, 0x8c, 0x64,
+ 0xaa, 0x64, 0xca, 0x65, 0x2, 0x65, 0x74, 0x65,
+ 0xad, 0x65, 0xc5, 0x65, 0xdb, 0x66, 0xb, 0x66,
+ 0x3b, 0x66, 0x8f, 0x66, 0xe5, 0x67, 0x29, 0x67,
+ 0x6c, 0x67, 0xbf, 0x67, 0xc2, 0xfc, 0xc5, 0xe,
+ 0xf7, 0x1b, 0xf7, 0x18, 0x9f, 0x9d, 0xae, 0xbf,
+ 0xb9, 0x88, 0xa6, 0x71, 0xa6, 0xf7, 0x6a, 0xb3,
+ 0x64, 0xb3, 0x12, 0xf8, 0xfa, 0xac, 0xa2, 0xb1,
+ 0x65, 0xf7, 0x15, 0xfb, 0x13, 0xf7, 0x12, 0x9f,
+ 0xb5, 0x62, 0xb5, 0xbe, 0xbb, 0x5c, 0xbb, 0x13,
+ 0xe5, 0x34, 0xf9, 0x33, 0xf7, 0x95, 0x15, 0xbb,
+ 0x89, 0x9c, 0x83, 0xae, 0x6a, 0x8, 0x73, 0xa4,
+ 0xac, 0x77, 0xaf, 0x1b, 0x13, 0xe5, 0x32, 0xb9,
+ 0xbd, 0xb1, 0xbc, 0x1f, 0x13, 0xcd, 0x34, 0xba,
+ 0x63, 0xa3, 0x60, 0x56, 0x52, 0x78, 0x87, 0x54,
+ 0x1e, 0x64, 0x88, 0x5, 0x13, 0xe5, 0x34, 0xfc,
+ 0x64, 0xfb, 0x3e, 0x15, 0xf8, 0x42, 0x9f, 0xfb,
+ 0x38, 0x6, 0xf7, 0x3d, 0xf5, 0x8f, 0xc2, 0xb5,
+ 0xb2, 0xb2, 0xaf, 0xbc, 0xa1, 0xb5, 0xab, 0x19,
+ 0x13, 0xe5, 0x2c, 0xa1, 0x9c, 0x9d, 0xa3, 0xa8,
+ 0x1a, 0x13, 0xe3, 0x34, 0xb6, 0x65, 0xa7, 0x62,
+ 0x1e, 0x13, 0xe5, 0x94, 0x45, 0x67, 0x4f, 0x4d,
+ 0x85, 0x1f, 0x85, 0x50, 0x6f, 0x71, 0x60, 0x67,
+ 0xfb, 0x76, 0xfb, 0x50, 0x18, 0xfb, 0x31, 0x6,
+ 0xfb, 0x60, 0xcb, 0x15, 0xf8, 0x45, 0x9d, 0xf3,
+ 0xe2, 0x5, 0x8c, 0x7, 0xfc, 0xb0, 0x2c, 0x5,
+ 0xf9, 0x55, 0xf7, 0x95, 0x15, 0x13, 0xe3, 0x34,
+ 0xaa, 0xb0, 0xa7, 0xa8, 0x1e, 0x13, 0xe5, 0x2c,
+ 0xa4, 0x9f, 0x76, 0x72, 0x6c, 0x68, 0x71, 0x6e,
+ 0x1f, 0x13, 0xe5, 0x94, 0x73, 0x74, 0x9e, 0xa4,
+ 0x1f, 0x13, 0xcd, 0x54, 0xe6, 0xfb, 0x80, 0x15,
+ 0xac, 0xac, 0x9f, 0xa9, 0x1e, 0x13, 0xe5, 0x32,
+ 0xa6, 0xa3, 0x7a, 0x6e, 0x6a, 0x6c, 0x7a, 0x6d,
+ 0x1f, 0x13, 0xd5, 0x54, 0x71, 0x70, 0x98, 0xa9,
+ 0x1f, 0xfb, 0x6d, 0xaf, 0x15, 0x93, 0x90, 0x93,
+ 0x94, 0x94, 0x94, 0x84, 0x82, 0x83, 0x82, 0x84,
+ 0x83, 0x82, 0x85, 0x91, 0x94, 0x1e, 0xe, 0xfb,
+ 0x27, 0x92, 0x76, 0xf7, 0x4b, 0xae, 0xf7, 0xb0,
+ 0xaf, 0xf7, 0x49, 0x54, 0xa, 0xf7, 0x3d, 0x15,
+ 0xf7, 0x61, 0x6, 0xf5, 0xfb, 0x4b, 0xf5, 0xf7,
+ 0x4b, 0x5, 0xf7, 0x61, 0x6, 0x25, 0xf7, 0x45,
+ 0xf1, 0xf7, 0x46, 0x5, 0xfb, 0x61, 0x6, 0x21,
+ 0xf7, 0x49, 0x21, 0xfb, 0x49, 0x5, 0xfb, 0x61,
+ 0x6, 0xf0, 0xfb, 0x46, 0x5, 0xf8, 0x23, 0xb2,
+ 0x15, 0x4c, 0xf2, 0x5, 0xf7, 0xe, 0x6, 0xfb,
+ 0xc, 0xfb, 0xb0, 0x15, 0xc8, 0xf3, 0xc5, 0x23,
+ 0x5, 0xfc, 0x86, 0x16, 0xca, 0xf3, 0xc9, 0x23,
+ 0x5, 0x4d, 0xf7, 0x49, 0x15, 0x4f, 0xf2, 0x5,
+ 0xf7, 0xd, 0x6, 0xb6, 0xfb, 0xb0, 0x15, 0x39,
+ 0xf7, 0x22, 0xdd, 0xf7, 0x22, 0x5, 0xf7, 0x3d,
+ 0x6, 0xdd, 0xfb, 0x22, 0x39, 0xfb, 0x22, 0x5,
+ 0xfb, 0x29, 0xf7, 0xd4, 0x15, 0xcb, 0xf7, 0x3,
+ 0xca, 0xfb, 0x3, 0x5, 0xfb, 0xd, 0xfb, 0xf7,
+ 0x15, 0xf7, 0x10, 0x6, 0x49, 0xfb, 0x0, 0x5,
+ 0xe, 0xfb, 0x3f, 0x73, 0xa, 0xf8, 0xee, 0xfc,
+ 0x24, 0xeb, 0xf7, 0x65, 0xea, 0x13, 0xb0, 0xdb,
+ 0xf7, 0x78, 0x15, 0xf7, 0xc, 0x68, 0xa, 0x1e,
+ 0x13, 0xc0, 0x31, 0x54, 0x42, 0x44, 0x53, 0xa4,
+ 0x6a, 0x9f, 0x7f, 0x1f, 0x96, 0x85, 0x9a, 0x87,
+ 0x9c, 0x90, 0x8, 0x90, 0x9c, 0x95, 0x90, 0xa4,
+ 0x1b, 0x13, 0xb0, 0xb1, 0xa3, 0x76, 0x61, 0x59,
+ 0x6a, 0x4a, 0xfb, 0x16, 0x6b, 0x1f, 0x8f, 0x76,
+ 0x5, 0xf7, 0xc5, 0x16, 0xf7, 0xb, 0x68, 0xa,
+ 0x31, 0x54, 0x42, 0x44, 0x53, 0xa4, 0x6a, 0xa0,
+ 0x7f, 0x1e, 0x96, 0x85, 0x99, 0x87, 0x9c, 0x90,
+ 0x8, 0x90, 0x9d, 0x94, 0x90, 0xa5, 0x1b, 0xb0,
+ 0xa4, 0x76, 0x61, 0x59, 0x69, 0x4a, 0xfb, 0x16,
+ 0x6b, 0x1f, 0x90, 0x76, 0x5, 0xe, 0x20, 0xfb,
+ 0x38, 0xd6, 0xf9, 0xaa, 0x77, 0xf7, 0x25, 0x77,
+ 0x1, 0xf8, 0x8c, 0xa7, 0x3, 0xf7, 0x94, 0x2f,
+ 0x15, 0x65, 0x9d, 0xab, 0x69, 0xb6, 0x1b, 0xd5,
+ 0xf7, 0x1, 0xbb, 0xf7, 0x8d, 0x1f, 0xf8, 0xcc,
+ 0x7, 0xb7, 0xf7, 0x11, 0x40, 0x7d, 0x86, 0xfb,
+ 0x3, 0x5, 0x72, 0x6, 0xfb, 0x41, 0xfb, 0x22,
+ 0x33, 0xfb, 0x42, 0xfb, 0x4d, 0xf7, 0x3a, 0x3d,
+ 0xf7, 0x15, 0x91, 0x95, 0x8e, 0x99, 0xb0, 0x1f,
+ 0x5f, 0x7, 0xfb, 0x58, 0x34, 0x61, 0x32, 0x7b,
+ 0x6b, 0x90, 0x91, 0x7d, 0x1e, 0xe, 0xfb, 0xbb,
+ 0x92, 0x76, 0xf9, 0x64, 0x77, 0x1, 0xf7, 0xa4,
+ 0xf7, 0xa4, 0x15, 0x9f, 0xd2, 0xaa, 0x96, 0xcc,
+ 0xa8, 0x8, 0xd3, 0xa9, 0xa7, 0xc5, 0xdc, 0x1a,
+ 0xf7, 0x27, 0xfb, 0x1, 0x92, 0xfb, 0x5, 0x25,
+ 0xfb, 0x0, 0x78, 0xfb, 0x15, 0x37, 0xa4, 0x51,
+ 0xd6, 0x6a, 0x1e, 0xcd, 0x6e, 0xa9, 0x80, 0x9f,
+ 0x44, 0x8, 0xfb, 0x10, 0xfb, 0x35, 0x15, 0x47,
+ 0xc4, 0x52, 0xcf, 0xd1, 0xc2, 0xc4, 0xcf, 0xd1,
+ 0x54, 0xc2, 0x45, 0x47, 0x52, 0x54, 0x45, 0x1e,
+ 0xe, 0xfb, 0xbb, 0x3a, 0xa, 0xf7, 0xa3, 0xf7,
+ 0xa8, 0x15, 0xa4, 0xcd, 0xbe, 0xa8, 0xc8, 0xa5,
+ 0x8, 0xcd, 0xa8, 0xad, 0xd8, 0xd6, 0x1a, 0xd1,
+ 0x62, 0xc4, 0x3f, 0x4a, 0x63, 0x55, 0x52, 0x7c,
+ 0x1e, 0xc4, 0x7f, 0x5f, 0xc1, 0x4c, 0x1b, 0x3a,
+ 0x66, 0x4e, 0x42, 0x45, 0xb4, 0x3d, 0xc7, 0x71,
+ 0x1f, 0xc8, 0x70, 0xbe, 0x6f, 0xa3, 0x49, 0x8,
+ 0xfb, 0x12, 0xfb, 0x38, 0x15, 0x46, 0xc3, 0x52,
+ 0xd1, 0xd1, 0xc3, 0xc4, 0xd0, 0xd2, 0x53, 0xc2,
+ 0x45, 0x46, 0x52, 0x54, 0x44, 0x1e, 0xe, 0xd2,
+ 0xc8, 0x76, 0xf8, 0xf7, 0x77, 0x1, 0xf8, 0x5b,
+ 0xb3, 0x15, 0xb0, 0xe2, 0xe3, 0xbe, 0xe0, 0xab,
+ 0x8, 0xf7, 0x2d, 0xc3, 0xc4, 0xdc, 0xec, 0x1a,
+ 0xf7, 0xb, 0x39, 0xe3, 0xfb, 0xd, 0xfb, 0x3,
+ 0x40, 0x2c, 0x25, 0x6c, 0x1e, 0xf1, 0x6f, 0x3a,
+ 0xea, 0xfb, 0x1, 0x1b, 0xfb, 0xd, 0x3a, 0x32,
+ 0xfb, 0xb, 0x2e, 0xc6, 0x35, 0xe2, 0x6c, 0x1f,
+ 0xf7, 0x29, 0x54, 0xe3, 0x59, 0xb0, 0x33, 0x8,
+ 0xe, 0xd3, 0x61, 0x76, 0xcc, 0x76, 0xf8, 0xb4,
+ 0x77, 0xe6, 0x77, 0x1, 0xf8, 0xde, 0x96, 0x3,
+ 0xf7, 0x23, 0xc0, 0x15, 0xa0, 0x75, 0xf8, 0x3a,
+ 0xf8, 0x39, 0x8c, 0x6f, 0xfc, 0x2c, 0xfc, 0x2c,
+ 0x96, 0x81, 0xf8, 0x2a, 0xf8, 0x2a, 0xaf, 0x7d,
+ 0xfc, 0x35, 0xfc, 0x35, 0xbb, 0x5a, 0xf8, 0x43,
+ 0xf8, 0x43, 0xf2, 0xf7, 0x72, 0x80, 0x96, 0xfb,
+ 0x74, 0xfb, 0x10, 0x5, 0xb0, 0x5c, 0x15, 0x88,
+ 0xab, 0xf7, 0x17, 0xd8, 0x95, 0x82, 0x34, 0xfb,
+ 0x1d, 0x80, 0xa0, 0x5, 0xe, 0xfb, 0x40, 0x92,
+ 0x76, 0xf7, 0xea, 0xaf, 0xf7, 0xe9, 0x54, 0xa,
+ 0xf8, 0xea, 0x3, 0xf7, 0x59, 0xf7, 0xe6, 0x15,
+ 0x36, 0x7b, 0x3e, 0x44, 0x32, 0x1a, 0x2b, 0xd8,
+ 0x3b, 0xec, 0xb3, 0xaf, 0x96, 0xa3, 0xab, 0x1e,
+ 0xda, 0xc6, 0x88, 0xf7, 0x4, 0xd2, 0xcf, 0x8,
+ 0xac, 0xae, 0xbc, 0xae, 0xbc, 0x1b, 0xaf, 0x89,
+ 0x5, 0xb3, 0x7, 0x67, 0x89, 0x63, 0x8e, 0x61,
+ 0xa5, 0x69, 0xa4, 0x19, 0x3a, 0xc6, 0x8c, 0xf7,
+ 0x1, 0x4a, 0xcf, 0x8, 0xab, 0x6b, 0x60, 0x9e,
+ 0x5e, 0x1b, 0x28, 0x39, 0x40, 0x27, 0x33, 0xd8,
+ 0x42, 0xe0, 0x7c, 0x1f, 0xe, 0x3c, 0x81, 0xab,
+ 0xee, 0xa4, 0x90, 0xde, 0xf7, 0x4a, 0x94, 0x82,
+ 0xf7, 0x4, 0xf7, 0x0, 0xa2, 0x12, 0x9d, 0xb9,
+ 0xf7, 0x2b, 0xf7, 0x10, 0x60, 0x9d, 0xf7, 0x16,
+ 0xaf, 0x7e, 0xf7, 0x36, 0xd2, 0xb5, 0x13, 0xef,
+ 0x50, 0xf7, 0xce, 0xf7, 0x34, 0x15, 0x8d, 0x6,
+ 0x84, 0x92, 0x94, 0x89, 0x98, 0x1b, 0x9c, 0xe0,
+ 0x95, 0xc6, 0xd7, 0x1f, 0xc2, 0xb6, 0xbe, 0xc6,
+ 0xd9, 0x1a, 0xb2, 0x72, 0xb7, 0x56, 0x60, 0x6b,
+ 0x71, 0x6b, 0x71, 0x1e, 0x87, 0x8d, 0x5, 0x9f,
+ 0xaf, 0x99, 0xa5, 0xb5, 0x1a, 0xb8, 0x71, 0xde,
+ 0xfb, 0x9, 0xfb, 0x50, 0xfb, 0x17, 0xfb, 0x50,
+ 0xfb, 0x44, 0xfb, 0x2d, 0xe2, 0xfb, 0x2c, 0xf7,
+ 0x6b, 0xf7, 0x71, 0xf7, 0x5d, 0xf7, 0x5e, 0xf7,
+ 0x70, 0xf7, 0xa, 0x48, 0xd7, 0x59, 0x7f, 0x7f,
+ 0x84, 0x7e, 0x84, 0x1e, 0x90, 0x88, 0x97, 0x87,
+ 0x96, 0x84, 0x8, 0xb7, 0x6c, 0xad, 0x49, 0x33,
+ 0x1a, 0xfb, 0x5f, 0xfb, 0x27, 0xfb, 0x36, 0xfb,
+ 0x62, 0xfb, 0x45, 0x21, 0xf7, 0x1d, 0xf7, 0x3c,
+ 0x1e, 0x13, 0xf6, 0xb0, 0xf7, 0x22, 0xe3, 0xf7,
+ 0x3b, 0xf7, 0x31, 0xf3, 0xaa, 0x38, 0x5b, 0x1e,
+ 0x8c, 0x75, 0x87, 0x72, 0x85, 0x7a, 0x8, 0x89,
+ 0x6, 0xb0, 0x82, 0x76, 0xbd, 0x4a, 0x1b, 0x40,
+ 0x5b, 0x42, 0x45, 0x64, 0x95, 0x78, 0xa3, 0x6a,
+ 0x1f, 0xb1, 0x57, 0x97, 0x79, 0x88, 0x66, 0x8,
+ 0x69, 0x88, 0x6d, 0x84, 0x84, 0x1b, 0x67, 0x74,
+ 0xb6, 0xa3, 0x8d, 0x1f, 0x8c, 0x96, 0x87, 0x8e,
+ 0x83, 0x81, 0x8, 0x81, 0x7f, 0x87, 0x7f, 0x7c,
+ 0x1a, 0x69, 0xa4, 0x74, 0xaf, 0xb4, 0xa4, 0x9b,
+ 0xa2, 0x98, 0x1e, 0x13, 0xf7, 0x50, 0xa4, 0xf7,
+ 0x23, 0x15, 0xc1, 0xa9, 0xc1, 0xc6, 0x90, 0x1e,
+ 0x96, 0x8c, 0x8b, 0x89, 0x90, 0x85, 0x8, 0x13,
+ 0xf7, 0x30, 0x98, 0x7c, 0x95, 0x74, 0x6f, 0x1a,
+ 0x59, 0x67, 0x5b, 0x59, 0x80, 0x1e, 0x7f, 0x88,
+ 0x8a, 0x8c, 0x84, 0x93, 0x8, 0x7f, 0x99, 0x81,
+ 0xa0, 0xa7, 0x1a, 0xe, 0x3c, 0xcf, 0xf7, 0x37,
+ 0xfb, 0x37, 0xf7, 0x38, 0x4b, 0xca, 0xf7, 0xa,
+ 0xf7, 0x44, 0xca, 0x77, 0x12, 0x96, 0xe0, 0x74,
+ 0xcf, 0xc7, 0xa0, 0x8b, 0xdf, 0x9e, 0xac, 0xf7,
+ 0xed, 0xb3, 0x13, 0x9b, 0xe0, 0xf7, 0xcb, 0xf7,
+ 0xb5, 0x15, 0x85, 0x86, 0x75, 0x7c, 0x80, 0x7b,
+ 0x8, 0x7d, 0x78, 0x86, 0x77, 0x7b, 0x1a, 0x7b,
+ 0x92, 0x65, 0xb3, 0x67, 0x1e, 0x6a, 0xb0, 0xb5,
+ 0x84, 0xa1, 0x1b, 0xba, 0xbf, 0xa6, 0xb1, 0xaa,
+ 0x1f, 0xbb, 0xc5, 0x9a, 0x94, 0xb8, 0x96, 0xad,
+ 0x93, 0xa8, 0x9d, 0x9d, 0x99, 0x8, 0x9a, 0x98,
+ 0x93, 0xa0, 0x98, 0x1a, 0xa2, 0x7f, 0x9c, 0x78,
+ 0x7a, 0x81, 0x7c, 0x83, 0x87, 0x1e, 0x88, 0x84,
+ 0x8e, 0x85, 0x8f, 0x8a, 0x8, 0x93, 0x88, 0x95,
+ 0x84, 0x7f, 0x1a, 0x79, 0x7d, 0x7e, 0x77, 0x79,
+ 0x6a, 0x8e, 0xf2, 0x64, 0x1e, 0x85, 0x9b, 0x85,
+ 0x9b, 0x85, 0x99, 0x8, 0xd5, 0x6d, 0x6d, 0xbe,
+ 0x3b, 0x1b, 0x6f, 0x6a, 0x7e, 0x73, 0x75, 0x1f,
+ 0x77, 0x75, 0x7f, 0x6d, 0x6d, 0x1a, 0x6e, 0x9a,
+ 0x6c, 0x8f, 0x85, 0x1e, 0x8e, 0x85, 0x8b, 0x88,
+ 0x87, 0x88, 0x85, 0x8a, 0x84, 0x8c, 0x85, 0x8c,
+ 0x7e, 0x8c, 0x6a, 0x95, 0x6b, 0xa1, 0x8, 0x9a,
+ 0x82, 0x9c, 0x83, 0x97, 0x1e, 0x83, 0x96, 0x85,
+ 0x8f, 0x73, 0x85, 0x8, 0x78, 0x99, 0x7f, 0x9d,
+ 0xaa, 0x1a, 0xaa, 0x91, 0x99, 0x91, 0x9a, 0x1e,
+ 0x90, 0x95, 0x8e, 0x90, 0x82, 0x96, 0x8, 0x99,
+ 0x81, 0x7e, 0x95, 0x82, 0x1b, 0x70, 0x77, 0x59,
+ 0x75, 0x82, 0x8f, 0x78, 0xab, 0x60, 0x1f, 0xa7,
+ 0x67, 0xad, 0x6b, 0xa9, 0x74, 0x8d, 0x73, 0x85,
+ 0x68, 0x7a, 0x6d, 0x8, 0x74, 0x7e, 0x77, 0x80,
+ 0x78, 0x1b, 0x13, 0x3d, 0xe0, 0x72, 0x84, 0x9f,
+ 0x99, 0x94, 0x8b, 0x89, 0x89, 0x8e, 0x1f, 0x90,
+ 0x84, 0x81, 0x91, 0x7e, 0x1b, 0x6f, 0x72, 0x72,
+ 0x6b, 0x68, 0xab, 0x71, 0xb0, 0xa0, 0xa0, 0x90,
+ 0x9d, 0xa4, 0x1f, 0xb7, 0xab, 0xab, 0xcb, 0x8a,
+ 0xbe, 0x9d, 0x81, 0xbb, 0x77, 0x95, 0x88, 0x98,
+ 0x86, 0x87, 0x84, 0x8f, 0x87, 0x8, 0xbd, 0x8e,
+ 0x15, 0x87, 0x96, 0x8b, 0x8d, 0x91, 0x92, 0x8,
+ 0x9e, 0x9b, 0x9f, 0x9d, 0xb4, 0x1b, 0xbc, 0xaa,
+ 0x61, 0x67, 0x97, 0x1f, 0x8e, 0x83, 0x8a, 0x88,
+ 0x85, 0x87, 0x8, 0x13, 0x5d, 0xe0, 0x7d, 0x7a,
+ 0x6d, 0x81, 0x6b, 0x1b, 0x58, 0x6e, 0xb0, 0xa2,
+ 0x83, 0x1f, 0xe, 0xfb, 0x69, 0xa0, 0x76, 0xf9,
+ 0x7a, 0x77, 0x1, 0xf7, 0xba, 0xb1, 0x3, 0xf7,
+ 0x6e, 0x16, 0xea, 0x6, 0xea, 0x96, 0x6, 0x5f,
+ 0xcc, 0x70, 0xf5, 0x86, 0xf7, 0x20, 0x8, 0x93,
+ 0x6, 0x8f, 0x75, 0x5, 0x4b, 0x97, 0xbd, 0x64,
+ 0xbb, 0x1b, 0xbb, 0xcd, 0xa8, 0xe7, 0xb4, 0x74,
+ 0xae, 0x6f, 0xa7, 0x1f, 0x6d, 0xa9, 0x68, 0xa2,
+ 0x79, 0xa0, 0x61, 0xba, 0x57, 0xd8, 0x79, 0xf7,
+ 0xc, 0x82, 0x8d, 0x18, 0x82, 0x89, 0x79, 0xfb,
+ 0xc, 0x57, 0x3e, 0x61, 0x5c, 0x19, 0x78, 0x76,
+ 0x65, 0x72, 0x6d, 0x6b, 0x8, 0x71, 0x6f, 0x76,
+ 0x6b, 0x63, 0x1a, 0x2f, 0xcd, 0x6e, 0xbb, 0xbb,
+ 0xbd, 0xb2, 0xcb, 0x97, 0x1e, 0x8f, 0xa1, 0x5,
+ 0x93, 0x6, 0x86, 0xfb, 0x20, 0x70, 0x21, 0x5f,
+ 0x4a, 0x8, 0xe, 0xf7, 0xd, 0xf7, 0x2e, 0x76,
+ 0xf7, 0xb7, 0xda, 0x43, 0xd3, 0xa9, 0x77, 0x12,
+ 0x13, 0xd0, 0xf8, 0x25, 0xf7, 0xd7, 0x15, 0xf7,
+ 0x6e, 0x42, 0xb5, 0x91, 0xb0, 0xc1, 0x5, 0xad,
+ 0x7, 0x52, 0xd4, 0xb9, 0x8d, 0xb9, 0x8d, 0xb9,
+ 0x8e, 0x19, 0x13, 0xb0, 0xaf, 0x8d, 0xaf, 0x8e,
+ 0xaf, 0x8d, 0x8, 0xa2, 0x8d, 0x9e, 0x95, 0xa4,
+ 0x1a, 0xa5, 0x76, 0x95, 0x73, 0x1e, 0xfc, 0x3,
+ 0x8a, 0xd2, 0x3f, 0x5, 0x8e, 0x88, 0x8d, 0x7b,
+ 0x87, 0x1a, 0x83, 0x89, 0x81, 0x85, 0x85, 0x1e,
+ 0xc2, 0x6f, 0x89, 0x81, 0x3b, 0x93, 0x7b, 0x8d,
+ 0x82, 0x8a, 0x7c, 0x8e, 0x19, 0x74, 0x8f, 0x65,
+ 0x98, 0x73, 0x91, 0x8, 0x74, 0x88, 0x81, 0x79,
+ 0x76, 0x1a, 0x87, 0x8b, 0x87, 0x8c, 0x87, 0x1e,
+ 0x8e, 0x33, 0x15, 0xf7, 0x22, 0x55, 0x9d, 0x8e,
+ 0xaa, 0xc5, 0xfb, 0x5c, 0xce, 0x5, 0x81, 0x86,
+ 0x85, 0x82, 0x80, 0x1a, 0x7a, 0x99, 0x78, 0x96,
+ 0x7e, 0x1e, 0xfb, 0xf4, 0x67, 0x15, 0xf7, 0x22,
+ 0x98, 0x9e, 0x82, 0xd6, 0x67, 0x9a, 0x87, 0x19,
+ 0x91, 0x89, 0xd6, 0x84, 0x96, 0x8a, 0x8, 0x7f,
+ 0x97, 0x7c, 0x9d, 0x9d, 0x1a, 0x98, 0x93, 0x95,
+ 0x96, 0x91, 0x1e, 0x7f, 0x9b, 0x7f, 0x9f, 0xa0,
+ 0x1a, 0x92, 0x8d, 0x92, 0x8e, 0x91, 0x1e, 0x7d,
+ 0x6f, 0x6c, 0x84, 0x6c, 0x1b, 0x7b, 0x7c, 0x8d,
+ 0x8e, 0x7c, 0x1f, 0x8e, 0x9b, 0x5, 0x88, 0x9a,
+ 0x9a, 0x8a, 0x9b, 0x1b, 0xb1, 0xad, 0x95, 0xa0,
+ 0xaa, 0x1f, 0xab, 0x9f, 0xa2, 0xab, 0x8f, 0x1e,
+ 0xdb, 0x75, 0x34, 0xc8, 0x4e, 0x79, 0x87, 0x9a,
+ 0xc4, 0x9c, 0x95, 0xb5, 0x9b, 0x86, 0x81, 0x66,
+ 0xe3, 0x4d, 0x5, 0x89, 0x8d, 0x9a, 0x8a, 0x8f,
+ 0x1b, 0x9d, 0x97, 0x8e, 0x9e, 0x1f, 0x90, 0x8a,
+ 0x90, 0x90, 0x1a, 0x20, 0xf7, 0x1, 0xfb, 0x33,
+ 0x91, 0xfb, 0x17, 0xfb, 0xf, 0xfb, 0x17, 0x8f,
+ 0x5, 0x78, 0x6e, 0x82, 0x68, 0x68, 0x1a, 0x62,
+ 0x97, 0x63, 0xa0, 0x68, 0x1e, 0xf8, 0x4, 0x58,
+ 0x15, 0xbd, 0x7c, 0xa9, 0x9b, 0xa0, 0xa3, 0xfb,
+ 0xe, 0xba, 0x5, 0x83, 0x88, 0x86, 0x84, 0x82,
+ 0x1a, 0x78, 0x9f, 0x75, 0x99, 0x7f, 0x1e, 0xe,
+ 0xfb, 0x25, 0x92, 0x76, 0xf9, 0x4d, 0x77, 0x1,
+ 0xf7, 0xef, 0x7d, 0x15, 0xa8, 0xf3, 0xf2, 0xf7,
+ 0x25, 0xd8, 0xec, 0x8, 0xc2, 0xd0, 0xbb, 0xcb,
+ 0xe8, 0x1a, 0xe0, 0x49, 0xc9, 0x36, 0x3a, 0x4c,
+ 0x3d, 0x3f, 0x7a, 0x1e, 0xda, 0x76, 0x52, 0xd6,
+ 0x33, 0x1b, 0x3a, 0x4a, 0x49, 0x39, 0x33, 0xc4,
+ 0x42, 0xc0, 0x4a, 0x1f, 0xe0, 0x23, 0xe8, 0xfb,
+ 0x1d, 0xa3, 0x23, 0x8, 0xe, 0xfb, 0x88, 0x94,
+ 0x76, 0xf9, 0x86, 0x77, 0x1, 0xcb, 0xf8, 0x66,
+ 0x3, 0xf7, 0xb4, 0x81, 0x15, 0x94, 0x89, 0x94,
+ 0x8d, 0xa5, 0xf7, 0x39, 0xf1, 0xf7, 0x22, 0xe9,
+ 0xc6, 0x19, 0x8d, 0x94, 0x89, 0x94, 0x2d, 0xc6,
+ 0x25, 0xf7, 0x22, 0x71, 0xf7, 0x39, 0x19, 0x82,
+ 0x8d, 0x82, 0x89, 0x71, 0xfb, 0x39, 0x25, 0xfb,
+ 0x22, 0x2d, 0x50, 0x19, 0x89, 0x82, 0x8d, 0x82,
+ 0xe9, 0x50, 0xf1, 0xfb, 0x22, 0xa5, 0xfb, 0x39,
+ 0x19, 0xe, 0x4c, 0xa0, 0x76, 0xf7, 0xd0, 0xad,
+ 0xf7, 0xf2, 0x77, 0x12, 0xf8, 0x5, 0xb1, 0x66,
+ 0xaf, 0x13, 0xf0, 0xf7, 0xb9, 0x16, 0xea, 0x6,
+ 0xea, 0x96, 0x6, 0x5f, 0xcb, 0x71, 0xf3, 0x85,
+ 0xf7, 0x1d, 0x8, 0x9a, 0x6, 0x48, 0x93, 0xc4,
+ 0x58, 0xd0, 0x1b, 0xd6, 0xc7, 0xc7, 0xd6, 0xd6,
+ 0x4f, 0xc7, 0x40, 0x46, 0x52, 0x58, 0x48, 0x83,
+ 0x1f, 0x13, 0xe8, 0x7b, 0x6, 0x94, 0x8b, 0x94,
+ 0x94, 0x1a, 0xc1, 0x7, 0xcd, 0x94, 0xbe, 0xc4,
+ 0xcf, 0x1a, 0xd6, 0x4f, 0xc7, 0x40, 0x40, 0x4f,
+ 0x4f, 0x40, 0x47, 0xbe, 0x52, 0xcd, 0x82, 0x1e,
+ 0x55, 0x7, 0x82, 0x8b, 0x82, 0x82, 0x1a, 0x7b,
+ 0x6, 0xce, 0x83, 0x52, 0xbe, 0x46, 0x1b, 0x40,
+ 0x4f, 0x4f, 0x40, 0x40, 0xc7, 0x4f, 0xd6, 0xd0,
+ 0xc4, 0xbe, 0xce, 0x93, 0x1f, 0x13, 0xf0, 0x9a,
+ 0x6, 0x85, 0xfb, 0x1d, 0x71, 0x23, 0x5f, 0x4b,
+ 0x8, 0xe, 0xfb, 0x29, 0xf7, 0x33, 0x76, 0xb3,
+ 0xf7, 0xe4, 0xfb, 0x8f, 0xf7, 0x39, 0xf7, 0x11,
+ 0x77, 0x12, 0xc1, 0xf8, 0xa, 0xfb, 0x37, 0xf8,
+ 0x1a, 0xfb, 0xcc, 0xf7, 0xcc, 0x13, 0xb2, 0xae,
+ 0xf7, 0x1e, 0x15, 0xf9, 0x0, 0xf8, 0x33, 0xfd,
+ 0x0, 0x6, 0x13, 0xd8, 0xf8, 0x1d, 0xfb, 0x6e,
+ 0x15, 0xa2, 0x7, 0xf7, 0x64, 0xf7, 0x30, 0x5,
+ 0xfb, 0xe4, 0x7, 0xfc, 0xda, 0x76, 0x15, 0x13,
+ 0xb4, 0xf7, 0x67, 0xf7, 0x34, 0x5, 0x68, 0x99,
+ 0xa9, 0x78, 0xb1, 0x1b, 0xaf, 0xa7, 0xa1, 0xab,
+ 0x98, 0x1f, 0xf7, 0x66, 0xfb, 0x34, 0x5, 0x13,
+ 0xb8, 0x13, 0xb4, 0xfc, 0x5, 0xf7, 0x6e, 0x15,
+ 0x13, 0xb8, 0xfb, 0x67, 0xf7, 0x36, 0x5, 0xf8,
+ 0xda, 0x6, 0xfb, 0x69, 0xfb, 0x36, 0x5, 0x13,
+ 0xb2, 0xad, 0x7e, 0x6d, 0x9e, 0x66, 0x1b, 0x13,
+ 0xd4, 0x6a, 0x69, 0x75, 0x6c, 0x80, 0x1f, 0x13,
+ 0xd8, 0xfb, 0x67, 0xfb, 0x59, 0x15, 0xf7, 0xe4,
+ 0x7, 0xf7, 0x63, 0xfb, 0x30, 0x5, 0x74, 0x7,
+ 0xe, 0x5b, 0xf7, 0x23, 0x9f, 0xc3, 0x9f, 0x84,
+ 0x99, 0x8a, 0x9f, 0xa7, 0x9f, 0x95, 0x9f, 0x8f,
+ 0x9f, 0xed, 0xa3, 0xf3, 0x77, 0x12, 0xf7, 0x1f,
+ 0x9f, 0x80, 0x9f, 0xf7, 0x5f, 0x99, 0xab, 0x9f,
+ 0x96, 0xa9, 0xda, 0x9f, 0x93, 0xa5, 0x13, 0xdf,
+ 0xdf, 0x8d, 0xf8, 0x12, 0x15, 0xce, 0x72, 0x5,
+ 0x7b, 0x8c, 0x95, 0x79, 0xa1, 0x1b, 0x99, 0x95,
+ 0x90, 0x91, 0x92, 0x1f, 0x91, 0x8a, 0x5, 0x73,
+ 0x9a, 0x7b, 0xa2, 0x96, 0x94, 0x8e, 0x90, 0x94,
+ 0x1e, 0x8c, 0x8a, 0x77, 0x7d, 0x7f, 0x7a, 0x85,
+ 0x75, 0x19, 0x13, 0xdf, 0xbf, 0x81, 0x7e, 0x80,
+ 0x7b, 0x76, 0x1a, 0x67, 0xa6, 0x79, 0xa4, 0xad,
+ 0xb0, 0x9e, 0xa5, 0xab, 0x1e, 0xd8, 0xcb, 0xb0,
+ 0x92, 0x5, 0x75, 0x8e, 0x9a, 0x79, 0xa7, 0x1b,
+ 0x13, 0xaf, 0xdf, 0xa0, 0x9d, 0x99, 0x98, 0x98,
+ 0x1f, 0xa9, 0xaa, 0x97, 0x8d, 0x5, 0x13, 0xdf,
+ 0xbf, 0x76, 0x8f, 0x9e, 0x7e, 0x9e, 0x1b, 0xa7,
+ 0xa6, 0xaa, 0x9f, 0x9d, 0x1f, 0xaf, 0x91, 0xdd,
+ 0xc2, 0x5, 0x99, 0x7, 0xfb, 0x79, 0x84, 0x34,
+ 0x90, 0x94, 0x9a, 0x94, 0x99, 0x92, 0x9b, 0x19,
+ 0xcf, 0xa6, 0xbc, 0xbc, 0x8a, 0x8f, 0x29, 0x82,
+ 0xab, 0xf5, 0x87, 0x8d, 0x3d, 0x60, 0x66, 0x48,
+ 0x5d, 0x94, 0x59, 0x74, 0x5, 0x88, 0x7, 0xcd,
+ 0x69, 0x78, 0x74, 0x6e, 0x7c, 0x72, 0x7b, 0x19,
+ 0xfb, 0xa1, 0xbe, 0x53, 0x6b, 0x5, 0x86, 0x8b,
+ 0x86, 0x86, 0x1a, 0xf8, 0xd3, 0x31, 0x15, 0x93,
+ 0x8c, 0x5, 0x7f, 0x8f, 0x85, 0x94, 0x93, 0x90,
+ 0x95, 0x97, 0x1e, 0xb3, 0x90, 0x5, 0x7b, 0x7c,
+ 0x76, 0x76, 0x7b, 0x1b, 0x7a, 0x84, 0x97, 0x9a,
+ 0x8d, 0x1f, 0xfb, 0x54, 0x78, 0x15, 0x86, 0xa5,
+ 0xa9, 0xa2, 0xb2, 0xa7, 0xf7, 0x4, 0x85, 0x18,
+ 0xf7, 0x4b, 0x91, 0x5c, 0x6d, 0xfb, 0x9a, 0x67,
+ 0x7e, 0x89, 0x77, 0x86, 0x7a, 0x87, 0x19, 0xad,
+ 0xf7, 0x40, 0x15, 0x61, 0xa1, 0x94, 0x8f, 0xb6,
+ 0x83, 0x5, 0x93, 0xfb, 0x52, 0x15, 0x96, 0x8c,
+ 0x5, 0x7f, 0x89, 0x8f, 0x80, 0x96, 0x1b, 0x97,
+ 0x91, 0x96, 0x9b, 0x8a, 0x1f, 0xbb, 0x92, 0x72,
+ 0x72, 0x5, 0x81, 0x81, 0x7e, 0x80, 0x7c, 0x1b,
+ 0x74, 0x86, 0x9d, 0x9b, 0x8d, 0x1f, 0xfb, 0x8c,
+ 0x6b, 0x15, 0x86, 0x92, 0x96, 0x87, 0x9d, 0x1b,
+ 0xa1, 0x84, 0x94, 0xa4, 0x6d, 0x81, 0x71, 0x95,
+ 0x83, 0x8e, 0x19, 0x97, 0xa8, 0xa6, 0x97, 0xa6,
+ 0x9c, 0xeb, 0xc7, 0x18, 0x9d, 0x96, 0x9c, 0x97,
+ 0x9a, 0x99, 0xa0, 0xa0, 0x95, 0xa3, 0x9a, 0xa5,
+ 0xab, 0xc3, 0x18, 0xae, 0x9e, 0x6f, 0x2f, 0xd9,
+ 0x92, 0x80, 0x80, 0x43, 0x6f, 0x80, 0x70, 0x7b,
+ 0x73, 0x7b, 0x73, 0x19, 0x63, 0x70, 0x66, 0x6d,
+ 0x92, 0x6e, 0x3b, 0x49, 0x18, 0x78, 0x74, 0x68,
+ 0x76, 0x6a, 0x1b, 0x13, 0xaf, 0xdf, 0x7a, 0x7c,
+ 0x98, 0xa0, 0x9e, 0x96, 0x99, 0x95, 0x96, 0x1f,
+ 0xc5, 0xd6, 0x15, 0xfb, 0x6a, 0xd7, 0xa7, 0x9b,
+ 0xf7, 0x93, 0x5b, 0x5, 0xfb, 0x31, 0x73, 0x15,
+ 0xb5, 0x7c, 0x5, 0x86, 0x84, 0x83, 0x88, 0x82,
+ 0x1b, 0x7d, 0x85, 0x96, 0x97, 0x8d, 0x1f, 0x45,
+ 0xa3, 0x15, 0xaa, 0x80, 0x5, 0x87, 0x86, 0x86,
+ 0x89, 0x83, 0x1b, 0x81, 0x88, 0x93, 0x94, 0x1f,
+ 0xe, 0x5a, 0xaf, 0x9f, 0xbd, 0xc5, 0xc0, 0xf5,
+ 0x29, 0xf7, 0x3, 0x61, 0xe7, 0x9d, 0xea, 0x9d,
+ 0x9f, 0x93, 0xcd, 0x84, 0xca, 0x12, 0xc9, 0xa3,
+ 0x80, 0xb6, 0x76, 0xa0, 0xf8, 0xd1, 0x9f, 0x13,
+ 0xe6, 0xd8, 0xcc, 0xf8, 0xa1, 0x15, 0xaf, 0x97,
+ 0xb8, 0xb6, 0xeb, 0x1b, 0xc1, 0xcd, 0x7c, 0x7d,
+ 0xcc, 0x1f, 0x13, 0xe7, 0x58, 0x7c, 0xce, 0xce,
+ 0x7c, 0xbc, 0x1b, 0xc8, 0xbe, 0xa4, 0xa1, 0xa9,
+ 0x1f, 0x78, 0xd3, 0x5, 0x71, 0x6d, 0x61, 0x70,
+ 0x57, 0x1b, 0x54, 0x4f, 0x98, 0x99, 0x4e, 0x1f,
+ 0x13, 0xe6, 0xd8, 0x99, 0x4c, 0x4b, 0x9a, 0x4e,
+ 0x1b, 0xfb, 0x7, 0x5c, 0x50, 0x53, 0x82, 0x8f,
+ 0x82, 0x8d, 0x82, 0x1f, 0xb6, 0xfb, 0x83, 0x15,
+ 0x85, 0x7b, 0x86, 0x80, 0x70, 0x1a, 0x2f, 0xf7,
+ 0x3, 0x23, 0xf7, 0x58, 0xf7, 0x3f, 0xf7, 0x1c,
+ 0xde, 0xf7, 0x9, 0xa2, 0x86, 0x96, 0x85, 0x9b,
+ 0x1e, 0x8b, 0x96, 0xaa, 0xa2, 0x1a, 0xf7, 0x1,
+ 0xfb, 0x18, 0xe3, 0xfb, 0x44, 0x22, 0x3a, 0x6b,
+ 0x66, 0x5c, 0x1e, 0x69, 0x95, 0x62, 0xa2, 0x82,
+ 0xad, 0x8, 0x13, 0xe7, 0x28, 0x85, 0x86, 0x86,
+ 0x7f, 0x80, 0x1a, 0x5e, 0x9e, 0x73, 0xa8, 0x7a,
+ 0x1e, 0x13, 0xe7, 0x58, 0x7a, 0x71, 0x82, 0x78,
+ 0x67, 0x1a, 0x72, 0x8e, 0x7f, 0x93, 0x7a, 0x1e,
+ 0x95, 0xc1, 0x15, 0xed, 0xf7, 0x13, 0xda, 0xf7,
+ 0x32, 0xf7, 0x32, 0xf7, 0x16, 0x3c, 0x29, 0x2a,
+ 0xfb, 0x16, 0x3c, 0xfb, 0x32, 0xfb, 0x32, 0xfb,
+ 0x13, 0xda, 0xec, 0x1e, 0x93, 0x48, 0x15, 0x97,
+ 0x77, 0xa4, 0x71, 0x9e, 0x7e, 0x8, 0x79, 0x87,
+ 0x7f, 0x8a, 0x83, 0x1a, 0x6e, 0xd1, 0x4c, 0xa6,
+ 0x94, 0x94, 0x92, 0x96, 0x96, 0x1e, 0x83, 0xa7,
+ 0xc5, 0x7e, 0xc2, 0x1b, 0xc0, 0xc1, 0x9d, 0x97,
+ 0x9f, 0x1f, 0x92, 0x85, 0x9e, 0x77, 0x99, 0x94,
+ 0x9d, 0x96, 0x9c, 0x99, 0x9a, 0x9f, 0x8, 0x99,
+ 0x9e, 0x93, 0x9c, 0x98, 0x1a, 0x90, 0x85, 0x91,
+ 0x83, 0x90, 0x1e, 0x98, 0x95, 0x9c, 0x9f, 0x93,
+ 0x99, 0x8, 0x90, 0x83, 0x8e, 0x7d, 0x78, 0x1a,
+ 0x2b, 0xfb, 0x13, 0x3b, 0xfb, 0x35, 0xfb, 0x33,
+ 0xfb, 0x11, 0xdc, 0xe8, 0x9e, 0x8f, 0x9b, 0x8f,
+ 0x93, 0x1e, 0xf7, 0x82, 0xf7, 0x1c, 0x15, 0x8e,
+ 0x86, 0x94, 0x8a, 0x91, 0x8d, 0x96, 0x8d, 0xa6,
+ 0x8c, 0x9b, 0x87, 0x97, 0x88, 0x8f, 0x8e, 0x8f,
+ 0x90, 0xbf, 0xcf, 0x18, 0x90, 0x92, 0x85, 0x8d,
+ 0x81, 0x8d, 0x55, 0x97, 0x66, 0x8f, 0x44, 0x80,
+ 0x82, 0x8a, 0x85, 0x85, 0x8e, 0x87, 0x8, 0xf7,
+ 0x37, 0xfb, 0x5a, 0x15, 0xdc, 0x54, 0x94, 0x85,
+ 0x91, 0x8d, 0x92, 0x90, 0x19, 0xb1, 0xa5, 0x9e,
+ 0x9f, 0x98, 0xb7, 0x8, 0x91, 0x8d, 0x86, 0x90,
+ 0x82, 0x1b, 0x13, 0xd7, 0x58, 0xfb, 0x10, 0x90,
+ 0x5, 0x81, 0x87, 0x87, 0x87, 0x1f, 0x8a, 0x83,
+ 0x82, 0x7d, 0x7e, 0x82, 0x82, 0x86, 0x8e, 0x87,
+ 0x91, 0x87, 0x8, 0xfb, 0x31, 0xc3, 0x15, 0x13,
+ 0xcf, 0x58, 0x72, 0xad, 0x76, 0xb4, 0xb4, 0xad,
+ 0xa0, 0xa4, 0xa4, 0x69, 0xa0, 0x62, 0x62, 0x69,
+ 0x76, 0x72, 0x1e, 0x2f, 0xfb, 0xc, 0x15, 0x93,
+ 0x87, 0x95, 0x8b, 0x8f, 0x8f, 0xd6, 0xc8, 0x18,
+ 0x91, 0x90, 0x87, 0x8f, 0x85, 0x8e, 0x82, 0x90,
+ 0x7b, 0x98, 0x87, 0x95, 0x88, 0x93, 0x85, 0x8c,
+ 0x82, 0x8a, 0xfb, 0xc, 0x7f, 0x18, 0x7e, 0x8a,
+ 0xe0, 0x31, 0x8d, 0x85, 0x9a, 0x69, 0x46, 0xcb,
+ 0xc1, 0x6d, 0x8, 0xe, 0xef, 0xf7, 0x2c, 0x76,
+ 0xd1, 0xa5, 0xf7, 0x3d, 0xa5, 0x78, 0xa4, 0xbd,
+ 0xa3, 0x90, 0xa4, 0x8f, 0x77, 0x12, 0x9f, 0xa4,
+ 0x13, 0xed, 0xc2, 0xf7, 0x57, 0x15, 0xf7, 0x1f,
+ 0x98, 0xf1, 0x5c, 0xde, 0x84, 0xda, 0x74, 0xad,
+ 0x9b, 0x9e, 0xa4, 0xb6, 0x96, 0xab, 0xc5, 0xc8,
+ 0x93, 0xb2, 0xc6, 0x5, 0xb3, 0x7, 0x5d, 0xc0,
+ 0xf7, 0x7, 0x8f, 0xf7, 0x5, 0x91, 0x5, 0xa4,
+ 0x8c, 0x9f, 0x9f, 0xa2, 0x1a, 0xa3, 0x74, 0x9e,
+ 0x6a, 0x8c, 0x1e, 0xfb, 0xf7, 0x91, 0x73, 0xa3,
+ 0x5, 0x13, 0xeb, 0xfb, 0x46, 0x92, 0xfb, 0xe,
+ 0xfb, 0xa, 0xfb, 0x13, 0x90, 0x5, 0x75, 0x69,
+ 0x82, 0x66, 0x65, 0x1a, 0x8c, 0x62, 0x97, 0x61,
+ 0xa1, 0x67, 0x8, 0xf7, 0xe5, 0xf7, 0x16, 0x15,
+ 0x87, 0xa1, 0x90, 0xa3, 0xa8, 0x90, 0xdb, 0x75,
+ 0x18, 0xf7, 0x5, 0x7f, 0x8d, 0x95, 0x57, 0xa6,
+ 0x95, 0x95, 0x89, 0xa2, 0x86, 0x95, 0x19, 0x56,
+ 0xc5, 0xf7, 0xe5, 0x88, 0x5, 0xa2, 0x97, 0x81,
+ 0x7e, 0x7f, 0x83, 0x81, 0x75, 0x8a, 0x1f, 0x25,
+ 0x86, 0xfb, 0x32, 0x84, 0xcb, 0x3b, 0x5, 0x74,
+ 0x7, 0x6e, 0x5f, 0x4f, 0x83, 0x5, 0xfb, 0x46,
+ 0x74, 0x15, 0x78, 0xa2, 0x78, 0xab, 0xa9, 0x9a,
+ 0xf7, 0x45, 0x51, 0x18, 0x72, 0x5a, 0x6e, 0x85,
+ 0x5, 0xfc, 0x4c, 0xa3, 0x15, 0x7b, 0xa8, 0x83,
+ 0xab, 0xaa, 0x1a, 0xaa, 0x91, 0xa9, 0x98, 0xa3,
+ 0x1e, 0xf7, 0x10, 0x85, 0xf7, 0xe, 0xf7, 0xa,
+ 0xf7, 0x35, 0x83, 0xdf, 0x32, 0x90, 0x83, 0x89,
+ 0x7b, 0x87, 0x89, 0x19, 0x7f, 0x81, 0x7d, 0x8b,
+ 0x78, 0x8f, 0x37, 0xc5, 0x18, 0x95, 0xaf, 0x7c,
+ 0x8f, 0x82, 0x63, 0x55, 0x7c, 0x8f, 0x7c, 0x5,
+ 0x13, 0xdd, 0xc4, 0x9d, 0xdd, 0x50, 0x3f, 0xa0,
+ 0x6d, 0x88, 0x77, 0x73, 0x8c, 0x6f, 0x19, 0x60,
+ 0x6e, 0x5e, 0x84, 0x57, 0x95, 0x89, 0x7c, 0x18,
+ 0xb7, 0x83, 0xb7, 0x8e, 0xb3, 0x9f, 0x81, 0x78,
+ 0x92, 0x6f, 0xa0, 0x72, 0x72, 0x7b, 0x90, 0x75,
+ 0x98, 0x78, 0x46, 0x91, 0x18, 0x23, 0xba, 0x5,
+ 0xf7, 0x59, 0x51, 0x15, 0x7d, 0x99, 0x7a, 0xa7,
+ 0xa4, 0x96, 0xf1, 0x63, 0x18, 0x7a, 0x77, 0x78,
+ 0x81, 0x5, 0xe, 0x7d, 0xae, 0xe5, 0xab, 0xf7,
+ 0xe3, 0x9c, 0xf7, 0x43, 0x4c, 0xa, 0xf7, 0xb2,
+ 0xe7, 0xf7, 0xa3, 0xae, 0x17, 0xae, 0xf7, 0xee,
+ 0x37, 0xa, 0x13, 0x6c, 0x33, 0xa, 0x1f, 0xf7,
+ 0x5e, 0x6b, 0xa, 0xf7, 0x9c, 0xa9, 0x6, 0x57,
+ 0x8f, 0x5, 0x65, 0x8e, 0x8d, 0x97, 0xa7, 0x1a,
+ 0xf8, 0x1d, 0x56, 0x7, 0x67, 0x5a, 0x64, 0x6f,
+ 0x4d, 0x82, 0x8, 0x7a, 0xc5, 0x7, 0xb5, 0x89,
+ 0x89, 0x61, 0x1f, 0xfb, 0x8a, 0x7, 0x74, 0x81,
+ 0x79, 0x72, 0x89, 0x1e, 0x5a, 0x87, 0x5, 0xe,
+ 0x7d, 0xae, 0x68, 0xf7, 0x11, 0xf8, 0x70, 0xf7,
+ 0xa, 0x68, 0x4c, 0xa, 0x68, 0xf7, 0x53, 0xf7,
+ 0xdc, 0xf7, 0x5c, 0xfb, 0x51, 0xf7, 0x51, 0x68,
+ 0xae, 0x13, 0x98, 0x80, 0x22, 0xa, 0x13, 0x66,
+ 0x0, 0xf7, 0x30, 0x6b, 0xa, 0xa2, 0x7, 0xd4,
+ 0xbd, 0xc1, 0xc2, 0xb4, 0x1e, 0xc1, 0xb3, 0xcb,
+ 0xbb, 0xd6, 0x1a, 0xb3, 0x7c, 0xb8, 0x5c, 0x7b,
+ 0x6a, 0x7b, 0x78, 0x1e, 0x7f, 0x91, 0x81, 0x7f,
+ 0x1a, 0x71, 0x76, 0x77, 0x71, 0x6c, 0x78, 0xa3,
+ 0xa9, 0xa7, 0x99, 0xa1, 0xa0, 0x9c, 0x1e, 0xa4,
+ 0xaa, 0xb2, 0x91, 0xb1, 0x1b, 0xd8, 0xe2, 0x68,
+ 0x31, 0xfb, 0x2e, 0xfb, 0x6d, 0x9a, 0x58, 0xfb,
+ 0xf, 0x1f, 0xf7, 0x60, 0x6, 0xba, 0x8e, 0xb1,
+ 0xc1, 0x96, 0x1f, 0x13, 0x65, 0x0, 0x99, 0xfb,
+ 0x49, 0x6, 0xe, 0x7d, 0xae, 0xf9, 0x1a, 0x77,
+ 0x1, 0x22, 0xa, 0xf7, 0x8f, 0x91, 0x15, 0x8c,
+ 0xab, 0x8b, 0x9c, 0xc7, 0xae, 0x68, 0x4f, 0x54,
+ 0x66, 0x46, 0x4f, 0x78, 0x6d, 0x9d, 0xa3, 0x1e,
+ 0x96, 0x91, 0x96, 0x96, 0x1a, 0xa7, 0x79, 0xa1,
+ 0x6c, 0x68, 0x77, 0x77, 0x68, 0x68, 0xa5, 0x71,
+ 0xa7, 0x7b, 0x1e, 0x7a, 0xaa, 0xb0, 0x84, 0xad,
+ 0x1b, 0xe6, 0xf3, 0xb9, 0xf4, 0xf7, 0x2, 0xfb,
+ 0x19, 0x92, 0x88, 0x91, 0x1f, 0x89, 0x8f, 0xf4,
+ 0xb1, 0xcd, 0x1a, 0xdc, 0x3c, 0xa0, 0x48, 0x55,
+ 0x2a, 0x79, 0x45, 0x6f, 0x9f, 0x79, 0xa6, 0xa5,
+ 0x9f, 0xa3, 0xa3, 0x92, 0x8a, 0x92, 0x87, 0x91,
+ 0x1e, 0xa2, 0xa8, 0x9d, 0x9d, 0xbb, 0xa0, 0x5d,
+ 0x60, 0x50, 0x5b, 0x6a, 0x54, 0x1e, 0x75, 0x6,
+ 0xe, 0x7d, 0xae, 0xe5, 0xf7, 0x3d, 0x5a, 0xbc,
+ 0xf8, 0x1a, 0x4c, 0xa, 0xf7, 0xc2, 0xe4, 0xf7,
+ 0x96, 0xae, 0x13, 0xbe, 0x22, 0xa, 0xf7, 0x1,
+ 0xfb, 0x7, 0x15, 0xf7, 0x55, 0x78, 0x6, 0x48,
+ 0x7b, 0x8b, 0x6e, 0x88, 0x1e, 0x77, 0x89, 0x5,
+ 0x13, 0xde, 0x6e, 0xf7, 0x71, 0xa8, 0x7, 0x79,
+ 0x8e, 0x5, 0x54, 0x94, 0x91, 0x89, 0xc9, 0x1a,
+ 0x13, 0xbe, 0x9e, 0xee, 0xbc, 0x28, 0xf7, 0xc1,
+ 0x33, 0x7, 0xfb, 0x56, 0xfb, 0xd4, 0x5, 0xce,
+ 0x9e, 0x15, 0xf7, 0x12, 0xf7, 0x63, 0x5, 0xfb,
+ 0x63, 0x7, 0xe, 0x7e, 0xae, 0xdd, 0xaf, 0xf7,
+ 0x6c, 0xb5, 0xdf, 0xe1, 0xf1, 0x4c, 0xa, 0xf7,
+ 0x43, 0xb4, 0xf7, 0x33, 0xf7, 0x6, 0xf7, 0x34,
+ 0xae, 0x17, 0x23, 0xa, 0xae, 0x16, 0x40, 0xa,
+ 0x41, 0xa, 0x1e, 0x13, 0xf3, 0x80, 0x28, 0xa,
+ 0xfb, 0x24, 0xfb, 0x48, 0x1f, 0x13, 0x77, 0x0,
+ 0xfb, 0x47, 0xfb, 0x25, 0xf7, 0x24, 0xf7, 0x48,
+ 0x1f, 0xf7, 0x43, 0x76, 0x15, 0xb4, 0x7a, 0x5,
+ 0xa4, 0x9d, 0xa7, 0xa2, 0xab, 0x1b, 0xc3, 0xa4,
+ 0x56, 0x5a, 0x57, 0x6a, 0x4d, 0x50, 0x79, 0x6b,
+ 0x93, 0xa2, 0x1f, 0x98, 0x95, 0x94, 0x9b, 0x1a,
+ 0xaa, 0x71, 0x9a, 0x6f, 0x6b, 0x79, 0x72, 0x6d,
+ 0x43, 0xef, 0x73, 0xc4, 0xe8, 0xef, 0xc4, 0xf1,
+ 0xe3, 0x3b, 0xba, 0x3b, 0x66, 0x5d, 0x81, 0x72,
+ 0x6d, 0x1e, 0xf7, 0xd, 0x7, 0xe9, 0x88, 0x5,
+ 0xb1, 0xca, 0x86, 0xa4, 0xab, 0x1f, 0x9d, 0x99,
+ 0x9c, 0xb7, 0x90, 0xa3, 0x8, 0x7f, 0x65, 0x63,
+ 0x88, 0x64, 0x1b, 0x51, 0x44, 0x92, 0x98, 0x4d,
+ 0x1f, 0xe, 0x7d, 0xae, 0xf9, 0x1d, 0xae, 0x1,
+ 0x22, 0xa, 0xf7, 0x75, 0x78, 0x15, 0xb7, 0xa8,
+ 0xc5, 0xa9, 0xc0, 0x1b, 0xda, 0xc7, 0x56, 0x39,
+ 0x28, 0x38, 0x4c, 0x2c, 0xfb, 0x1d, 0x4e, 0xf7,
+ 0x1, 0xf7, 0x11, 0xf7, 0x11, 0xce, 0xf7, 0x11,
+ 0xf7, 0x1c, 0xc1, 0xe6, 0x74, 0x47, 0x6e, 0x7b,
+ 0x71, 0x6c, 0x71, 0x77, 0x9e, 0xa5, 0x1f, 0x96,
+ 0x90, 0x98, 0x95, 0x1a, 0xa3, 0x65, 0x96, 0x78,
+ 0x2c, 0x80, 0xfb, 0x9, 0x41, 0x1e, 0x91, 0xfb,
+ 0xe, 0x15, 0x55, 0xb1, 0x58, 0xc6, 0xc6, 0xa4,
+ 0xc4, 0xbf, 0xba, 0x76, 0xc7, 0x52, 0x4c, 0x63,
+ 0x57, 0x50, 0x1e, 0xe, 0x7d, 0xae, 0xf8, 0x6b,
+ 0xe4, 0xe4, 0x4c, 0xa, 0xf7, 0x72, 0xf7, 0x4,
+ 0xfb, 0x4, 0xf7, 0xc, 0xf7, 0xc7, 0xae, 0x13,
+ 0xf6, 0x22, 0xa, 0xf7, 0x27, 0xcd, 0x15, 0x9f,
+ 0x6, 0xb8, 0x9f, 0x8d, 0xae, 0xb2, 0x1b, 0xf7,
+ 0x50, 0x6, 0x20, 0xfb, 0x24, 0x5, 0x67, 0x5c,
+ 0x58, 0x46, 0x4d, 0x1a, 0x65, 0xa1, 0x6f, 0xb3,
+ 0xae, 0xa2, 0xa2, 0xaf, 0x1e, 0x13, 0xfa, 0xa2,
+ 0x83, 0xa2, 0xa2, 0x1a, 0xce, 0xbb, 0xd0, 0xab,
+ 0xc2, 0x1e, 0xe7, 0xf7, 0x32, 0x5, 0xfb, 0xf6,
+ 0x6, 0xe, 0x7d, 0xae, 0xde, 0xb1, 0xf8, 0x30,
+ 0xad, 0xdd, 0x4c, 0xa, 0xf7, 0x2e, 0xc5, 0x71,
+ 0xd9, 0xf7, 0x1d, 0xbd, 0x60, 0xe3, 0xf7, 0x2d,
+ 0xae, 0x13, 0xfc, 0xc0, 0xf7, 0xd7, 0xf7, 0xfe,
+ 0x15, 0x55, 0x6c, 0x5e, 0x6a, 0x46, 0x1a, 0x2f,
+ 0xde, 0x6a, 0xd9, 0xe3, 0xe8, 0xc0, 0xeb, 0xd5,
+ 0x5c, 0xaf, 0x4e, 0xa9, 0x1e, 0x13, 0xbb, 0x40,
+ 0xb1, 0xa4, 0xa4, 0xa4, 0xbd, 0x1a, 0xd1, 0x49,
+ 0xa4, 0x51, 0x1e, 0x42, 0x47, 0x5d, 0x3c, 0x5a,
+ 0xa8, 0x6e, 0xb1, 0x74, 0x1f, 0xf0, 0xbb, 0x15,
+ 0x5b, 0xa4, 0x61, 0x9d, 0xb4, 0x1a, 0xae, 0xa8,
+ 0xa4, 0xad, 0x1e, 0x13, 0x99, 0x40, 0xb4, 0xac,
+ 0x74, 0x60, 0x69, 0x79, 0x6f, 0x6e, 0x7b, 0x1f,
+ 0x48, 0x48, 0x15, 0x13, 0xdc, 0xc0, 0xa0, 0x7f,
+ 0x9e, 0x81, 0x9a, 0x81, 0x8, 0xb8, 0x6f, 0xa0,
+ 0x76, 0x6a, 0x1a, 0x54, 0x62, 0x6b, 0x57, 0x53,
+ 0x5c, 0xb6, 0xc2, 0xb4, 0xb2, 0xb5, 0xaf, 0x9f,
+ 0x1e, 0xfb, 0xd6, 0x8e, 0x37, 0xa, 0x13, 0x8,
+ 0x0, 0x33, 0xa, 0x1f, 0xe, 0x7d, 0xae, 0xde,
+ 0xac, 0x6a, 0xf7, 0x26, 0xb4, 0xba, 0x98, 0x77,
+ 0xf7, 0x72, 0xae, 0xdd, 0x4c, 0xa, 0xf7, 0x2d,
+ 0xdc, 0x4c, 0xe8, 0xf7, 0x24, 0xf7, 0x1, 0x23,
+ 0xf3, 0x25, 0xf1, 0xf7, 0x18, 0xae, 0x13, 0xcf,
+ 0x94, 0x2e, 0xa, 0xf7, 0x5b, 0xf7, 0x5a, 0x25,
+ 0xa, 0xfb, 0x5a, 0xfb, 0x5b, 0x2a, 0xa, 0xae,
+ 0x16, 0x40, 0xa, 0xf7, 0x25, 0xf7, 0x48, 0xf7,
+ 0x47, 0x2f, 0xa, 0xfb, 0x47, 0xfb, 0x48, 0x36,
+ 0xa, 0x1e, 0xf8, 0x31, 0x90, 0x15, 0x13, 0xcf,
+ 0x4c, 0x8d, 0x6, 0x22, 0x8e, 0x7a, 0xfb, 0x1,
+ 0x32, 0x1b, 0x77, 0x69, 0x95, 0xa3, 0x1f, 0x94,
+ 0x91, 0x96, 0x98, 0x1a, 0x13, 0xb7, 0x54, 0xa4,
+ 0x78, 0xa0, 0x72, 0x6d, 0x78, 0x72, 0x6e, 0x48,
+ 0xe2, 0x72, 0xc1, 0xcd, 0xbd, 0x9b, 0xc4, 0xb2,
+ 0x1e, 0xae, 0xbf, 0x9a, 0xce, 0xc9, 0x1a, 0xf7,
+ 0xa, 0x49, 0xf7, 0x4, 0xfb, 0x16, 0x1e, 0x13,
+ 0xd7, 0xa4, 0x2a, 0x44, 0x4f, 0x23, 0x39, 0xbc,
+ 0x58, 0xdb, 0x1f, 0x13, 0xcf, 0x94, 0xbf, 0xbc,
+ 0x9c, 0xb6, 0xa9, 0x1f, 0xfb, 0x47, 0xe6, 0x15,
+ 0xc2, 0xa3, 0xc3, 0xca, 0x1e, 0x13, 0xd7, 0xa4,
+ 0xc1, 0xac, 0x57, 0x5a, 0x53, 0x70, 0x51, 0x4c,
+ 0x50, 0x72, 0xc0, 0xbe, 0x1f, 0xe, 0x7d, 0xae,
+ 0xe4, 0xaf, 0xf7, 0xee, 0x9b, 0xb0, 0xad, 0xe6,
+ 0x4c, 0xa, 0xf7, 0x42, 0xdf, 0xba, 0xeb, 0xf2,
+ 0xeb, 0xbc, 0xae, 0x17, 0xf8, 0xb, 0xf7, 0xea,
+ 0x15, 0x13, 0xff, 0xc0, 0x22, 0x9d, 0xfb, 0x13,
+ 0xf7, 0x15, 0xf7, 0x16, 0x9d, 0xf7, 0x10, 0xf7,
+ 0x0, 0xe9, 0x7a, 0xf7, 0x23, 0xfb, 0x11, 0xfb,
+ 0x1b, 0x79, 0xfb, 0x16, 0x20, 0x1e, 0xeb, 0x16,
+ 0xb3, 0x8a, 0xf7, 0x37, 0xc0, 0xc1, 0x88, 0xfb,
+ 0x38, 0x64, 0x66, 0x8c, 0xfb, 0x33, 0x57, 0x55,
+ 0x8d, 0xf7, 0x32, 0xb1, 0x1e, 0xfc, 0x48, 0x8f,
+ 0x21, 0xa, 0xf7, 0x8, 0x6b, 0xa, 0xf7, 0x5c,
+ 0xad, 0x6, 0x80, 0x8c, 0x5, 0x5a, 0x8f, 0x8d,
+ 0x91, 0x9d, 0x1a, 0xf8, 0x2b, 0x54, 0x7, 0x6f,
+ 0x5b, 0x69, 0x75, 0x58, 0x88, 0x8, 0x7b, 0xa5,
+ 0x7, 0x13, 0x2, 0x0, 0xab, 0xa5, 0x8f, 0x64,
+ 0x1f, 0xfb, 0xaf, 0x7, 0x76, 0x83, 0x86, 0x78,
+ 0x8a, 0x1e, 0x6c, 0x89, 0x5, 0xe, 0xfb, 0xb6,
+ 0x58, 0xa3, 0xb8, 0x76, 0xf7, 0x7c, 0x9a, 0x92,
+ 0x9a, 0xf7, 0xa, 0x9a, 0xb6, 0xa3, 0xf7, 0x57,
+ 0xa4, 0x86, 0xa3, 0x12, 0xf7, 0x1e, 0xa4, 0xc2,
+ 0x99, 0xae, 0x9a, 0x8b, 0x9b, 0xa1, 0x9b, 0xa9,
+ 0xa4, 0xac, 0xa4, 0x80, 0xa3, 0x13, 0xfd, 0xfe,
+ 0xea, 0x88, 0x15, 0x6a, 0xa4, 0xae, 0x7c, 0xaf,
+ 0x1b, 0xab, 0xab, 0x95, 0x9e, 0xa6, 0x1f, 0xbc,
+ 0xf7, 0x1e, 0xb1, 0xb1, 0xb7, 0xd4, 0xbb, 0xa6,
+ 0x90, 0xb2, 0x75, 0xb6, 0x8f, 0xb3, 0x90, 0xc4,
+ 0x6e, 0xaa, 0x6c, 0x8f, 0x74, 0x7f, 0xa1, 0xf7,
+ 0x5b, 0x5, 0xab, 0x8f, 0x76, 0x9d, 0x74, 0x1b,
+ 0x77, 0x76, 0x7f, 0x70, 0x84, 0x1f, 0x5b, 0xfb,
+ 0x56, 0x71, 0xe6, 0x79, 0xdb, 0x5, 0x13, 0xfe,
+ 0xfd, 0xa4, 0x85, 0x82, 0x9d, 0x6d, 0x1b, 0x6b,
+ 0x87, 0x6a, 0x7a, 0x8c, 0x1f, 0x98, 0xfb, 0x8b,
+ 0x74, 0x88, 0x72, 0x74, 0x78, 0xfb, 0x21, 0xba,
+ 0xfb, 0x7, 0x5, 0xf7, 0x68, 0xf7, 0x29, 0x15,
+ 0xba, 0xaa, 0x75, 0x7d, 0xa9, 0x9e, 0xa4, 0x95,
+ 0x18, 0x94, 0x9a, 0x9a, 0x6e, 0x88, 0x78, 0x81,
+ 0x86, 0x65, 0x7e, 0x5b, 0x76, 0x86, 0xa5, 0x19,
+ 0xfb, 0x6b, 0xfb, 0x92, 0x15, 0xa9, 0xf6, 0x5a,
+ 0xf7, 0x8, 0x9c, 0xf7, 0x12, 0x99, 0x97, 0xf7,
+ 0x1a, 0xa0, 0x98, 0x89, 0x93, 0x7d, 0x81, 0x7d,
+ 0x19, 0x79, 0x72, 0x61, 0x7b, 0x6e, 0x80, 0x60,
+ 0xa2, 0x18, 0x85, 0x7d, 0xb3, 0x77, 0xa2, 0x72,
+ 0x94, 0x6c, 0x91, 0x61, 0x19, 0x99, 0x8e, 0x85,
+ 0xb3, 0x85, 0xa8, 0x77, 0xa5, 0x19, 0xaa, 0x96,
+ 0xb3, 0x9b, 0x9e, 0xa5, 0x8, 0x91, 0x93, 0x8d,
+ 0x95, 0x93, 0x1a, 0x9a, 0x80, 0x98, 0x77, 0x8c,
+ 0x1e, 0x29, 0x7c, 0x7e, 0xf7, 0x92, 0x5, 0x9d,
+ 0x8a, 0x91, 0x90, 0x90, 0x1b, 0x97, 0x8f, 0x88,
+ 0x77, 0x8f, 0x1f, 0x9d, 0x3b, 0xb1, 0xfb, 0x19,
+ 0x5, 0xa6, 0x6, 0xc6, 0xf7, 0x80, 0x5, 0x13,
+ 0xfd, 0xfe, 0x98, 0x8e, 0x94, 0x92, 0x94, 0x1b,
+ 0x95, 0x94, 0x83, 0x7c, 0x89, 0x1f, 0x70, 0xfb,
+ 0x8a, 0xc5, 0xaa, 0x99, 0x89, 0x9b, 0x79, 0x86,
+ 0x5d, 0x86, 0x61, 0x7e, 0x76, 0xfb, 0x0, 0x5b,
+ 0x85, 0x8c, 0x85, 0x8e, 0x89, 0x91, 0x19, 0x85,
+ 0x9d, 0xb5, 0xa2, 0x9c, 0x98, 0xb0, 0xcb, 0x18,
+ 0x7f, 0x91, 0x56, 0x5c, 0x9b, 0x7c, 0x5, 0x81,
+ 0x84, 0x5c, 0x71, 0x72, 0x1a, 0x88, 0x8b, 0x88,
+ 0x8c, 0x88, 0x1e, 0x80, 0x8f, 0x99, 0x82, 0x98,
+ 0x1b, 0xa1, 0x93, 0x5, 0x76, 0x8c, 0x98, 0x82,
+ 0x9d, 0x1b, 0x95, 0x97, 0x8d, 0x8f, 0x98, 0x1f,
+ 0x64, 0x49, 0x63, 0x65, 0x5c, 0xfb, 0x1e, 0x5,
+ 0x7f, 0x78, 0x71, 0x83, 0x72, 0x1b, 0x70, 0x71,
+ 0x94, 0x9f, 0x7a, 0x1f, 0xe, 0x7d, 0xef, 0xf8,
+ 0x9c, 0xee, 0x1, 0xf7, 0xf4, 0xf0, 0x26, 0xa,
+ 0xf7, 0x74, 0xfb, 0x98, 0x15, 0xac, 0x7, 0xc1,
+ 0x8e, 0xad, 0x8d, 0x91, 0xad, 0x8a, 0xa6, 0x19,
+ 0xf7, 0x98, 0x7, 0xb7, 0x8c, 0x8e, 0x5e, 0x1e,
+ 0x4a, 0x9f, 0x6, 0xd0, 0x95, 0xa4, 0xa8, 0xb2,
+ 0xc2, 0x8, 0xd8, 0xfc, 0x39, 0x6, 0x4a, 0x9b,
+ 0x90, 0xc9, 0x86, 0x1e, 0x9f, 0x8a, 0x5, 0x6a,
+ 0x7, 0xe, 0x7d, 0xef, 0xf8, 0xa3, 0xe7, 0x12,
+ 0xae, 0xf7, 0x43, 0xfb, 0x43, 0xf7, 0x58, 0xf7,
+ 0xe8, 0xf7, 0x4b, 0xfb, 0x3f, 0xf7, 0x3f, 0x13,
+ 0xe8, 0x23, 0xa, 0xf7, 0x43, 0xfb, 0x98, 0x15,
+ 0x89, 0xf6, 0xc2, 0xc6, 0xc8, 0xb8, 0x8, 0xc7,
+ 0xb8, 0xd1, 0xc0, 0xde, 0x1a, 0xb7, 0x7c, 0xbd,
+ 0x56, 0x7b, 0x65, 0x79, 0x77, 0x1e, 0x7e, 0x92,
+ 0x80, 0x7d, 0x1a, 0x6e, 0x73, 0x74, 0x6e, 0x1e,
+ 0x13, 0xd8, 0x69, 0x76, 0xa6, 0xac, 0xd9, 0xe3,
+ 0xaa, 0xcc, 0xe2, 0xef, 0x67, 0x25, 0x2f, 0x43,
+ 0x63, 0x42, 0x68, 0x1f, 0x54, 0x72, 0x42, 0x63,
+ 0x74, 0x51, 0x8, 0xf7, 0x75, 0x6, 0x9b, 0x8a,
+ 0x9c, 0x8b, 0x92, 0x9c, 0xa4, 0xe0, 0x18, 0x13,
+ 0xe4, 0x9d, 0xfb, 0x5c, 0x6, 0xe, 0x7d, 0xe6,
+ 0xf7, 0xa9, 0x77, 0xba, 0xde, 0x38, 0xf7, 0x55,
+ 0xb2, 0xe7, 0x12, 0xae, 0xf7, 0x3c, 0xfb, 0x3c,
+ 0xf7, 0x53, 0xe7, 0xf7, 0x2e, 0xfb, 0x24, 0xf7,
+ 0xf, 0xf2, 0xf7, 0x5c, 0xfb, 0x37, 0xf7, 0x37,
+ 0x13, 0xdc, 0xc0, 0x23, 0xa, 0xf7, 0xaa, 0x94,
+ 0x15, 0xa5, 0xa3, 0x7, 0xc9, 0xbf, 0xb4, 0xcc,
+ 0xbb, 0x74, 0xb2, 0x55, 0x69, 0x7a, 0x76, 0x82,
+ 0x1f, 0x83, 0x90, 0x8a, 0x78, 0x1a, 0x13, 0xea,
+ 0xc0, 0x70, 0x74, 0x72, 0x70, 0x6c, 0x76, 0xa0,
+ 0xa9, 0xd8, 0xf6, 0xa0, 0xc6, 0xd5, 0xe3, 0x74,
+ 0x31, 0x4a, 0x61, 0x6d, 0x53, 0x7a, 0x1e, 0x88,
+ 0x8a, 0x7e, 0x89, 0x87, 0x1a, 0x85, 0x93, 0x8a,
+ 0x8f, 0x99, 0xb5, 0x7e, 0x85, 0x97, 0x1e, 0x13,
+ 0xdd, 0x20, 0xb8, 0x76, 0xa5, 0x62, 0x5a, 0x1a,
+ 0xfb, 0x5, 0xfb, 0x5, 0x55, 0x28, 0x65, 0x64,
+ 0x91, 0x9c, 0x69, 0x1e, 0x6a, 0x9c, 0x6b, 0xaa,
+ 0xb4, 0x1a, 0xb1, 0xa0, 0xa1, 0xb3, 0xac, 0xa0,
+ 0x74, 0x6b, 0x1e, 0x7e, 0x84, 0x80, 0x7e, 0x1a,
+ 0x71, 0xac, 0x82, 0xa0, 0xcd, 0xb4, 0xcd, 0xc8,
+ 0xcd, 0x65, 0xb2, 0x48, 0x79, 0x79, 0x90, 0x87,
+ 0x79, 0x1e, 0xe, 0x7d, 0xef, 0x8b, 0xd3, 0xf8,
+ 0x54, 0xee, 0x12, 0xae, 0xf8, 0xb3, 0xfb, 0x2,
+ 0xf7, 0xb2, 0x13, 0xf0, 0x29, 0xa, 0x1e, 0x13,
+ 0xe8, 0x24, 0xa, 0x1f, 0x13, 0xf0, 0x27, 0xa,
+ 0x1f, 0xf7, 0xd, 0xfb, 0x13, 0x15, 0xac, 0x7,
+ 0xf7, 0x6d, 0xf7, 0xf6, 0x5, 0x13, 0xe8, 0xea,
+ 0xfb, 0xe1, 0x6, 0x13, 0xf0, 0xf7, 0x2, 0x55,
+ 0x6, 0x13, 0xe8, 0xfb, 0x2, 0x4c, 0x6, 0x78,
+ 0x93, 0x84, 0x9b, 0x88, 0x1e, 0xbe, 0x82, 0x5,
+ 0x6b, 0xfb, 0xa0, 0xab, 0x7, 0xd2, 0x94, 0x5,
+ 0xa0, 0x8e, 0x8e, 0xa0, 0x92, 0x1a, 0xc8, 0x7,
+ 0xfb, 0x2b, 0xc1, 0x15, 0xf7, 0x2b, 0xf7, 0x97,
+ 0x6, 0xe, 0x7b, 0xe7, 0x31, 0xe7, 0xf7, 0xab,
+ 0x77, 0xce, 0xe8, 0xe9, 0xf7, 0x6, 0x12, 0xae,
+ 0xf7, 0x2e, 0xfb, 0x2e, 0xf7, 0x57, 0xd5, 0xf7,
+ 0x26, 0xf7, 0x12, 0xf7, 0x46, 0x13, 0xbd, 0x80,
+ 0x3b, 0xa, 0x13, 0x7d, 0x80, 0x2c, 0xa, 0x13,
+ 0xbb, 0x80, 0xf7, 0x57, 0x74, 0x15, 0x8c, 0xf7,
+ 0xb7, 0x5, 0x7d, 0xcc, 0xda, 0x82, 0xc8, 0x1b,
+ 0xb8, 0xb9, 0x8e, 0x99, 0xb6, 0x1f, 0x85, 0x72,
+ 0x79, 0x58, 0x78, 0x7d, 0x8, 0x6f, 0x66, 0x47,
+ 0x90, 0x5f, 0x1b, 0x23, 0x8f, 0x5, 0xfb, 0x1a,
+ 0x7, 0xa7, 0xac, 0xbf, 0x96, 0xb4, 0x1b, 0xb4,
+ 0xb4, 0x82, 0x72, 0xac, 0x1f, 0xb0, 0x71, 0xa3,
+ 0x61, 0x5d, 0x1a, 0x13, 0x7d, 0x80, 0xfb, 0x7,
+ 0xfb, 0x2, 0x4c, 0x23, 0x4d, 0xfb, 0x3, 0xa6,
+ 0xdb, 0xac, 0x9f, 0xa7, 0xaf, 0xaa, 0xa7, 0x7a,
+ 0x69, 0x1e, 0x78, 0x81, 0x81, 0x7e, 0x1a, 0x71,
+ 0xae, 0x82, 0x9f, 0xcc, 0xaf, 0xd0, 0xc4, 0xc1,
+ 0x70, 0xc6, 0x4d, 0x67, 0x6d, 0x71, 0x70, 0x76,
+ 0x1e, 0xe, 0x7d, 0xe7, 0xf7, 0xa9, 0x77, 0xd3,
+ 0xb9, 0x5d, 0xf7, 0x3f, 0xae, 0xe7, 0x12, 0xae,
+ 0xf7, 0x29, 0xf7, 0x7, 0xf7, 0x55, 0x6a, 0xf2,
+ 0x8b, 0xf7, 0x54, 0xfb, 0x3a, 0xf7, 0x3a, 0x13,
+ 0xee, 0x40, 0x23, 0xa, 0xf7, 0x97, 0x76, 0x15,
+ 0xbc, 0xaa, 0xc3, 0xac, 0xc5, 0x1b, 0xe3, 0xc8,
+ 0x49, 0x31, 0xfb, 0x3, 0x34, 0x4d, 0x22, 0x49,
+ 0x52, 0xa0, 0xc0, 0x63, 0x1f, 0x65, 0xbe, 0x80,
+ 0xcc, 0xca, 0x1a, 0xcb, 0x93, 0xcf, 0xad, 0xc2,
+ 0x1e, 0xcf, 0xb5, 0xc4, 0xa6, 0xda, 0x1b, 0x13,
+ 0xed, 0x80, 0xc7, 0xed, 0x72, 0x40, 0x6b, 0x7a,
+ 0x6f, 0x68, 0x6e, 0x75, 0x9f, 0xa8, 0x1f, 0x98,
+ 0x91, 0x99, 0x96, 0x1a, 0x13, 0xde, 0x40, 0xa5,
+ 0x63, 0x97, 0x76, 0x56, 0x7c, 0x6d, 0x5e, 0x78,
+ 0x1e, 0x7c, 0x5a, 0x8b, 0x45, 0x83, 0x50, 0x8,
+ 0x90, 0x33, 0x15, 0x4e, 0xa6, 0x4f, 0xd1, 0xcd,
+ 0xa9, 0xcb, 0xc5, 0xbf, 0x72, 0xcc, 0x4e, 0x48,
+ 0x63, 0x55, 0x4b, 0x1e, 0xe, 0x7d, 0xe8, 0xf8,
+ 0xa4, 0xed, 0x1, 0xae, 0xf7, 0x38, 0x26, 0xa,
+ 0xf7, 0x38, 0xd5, 0x15, 0x8c, 0xf7, 0x4f, 0x5,
+ 0xf8, 0x1e, 0x6, 0x25, 0xfb, 0x44, 0x5, 0x68,
+ 0x4e, 0x56, 0x3f, 0x42, 0x71, 0x94, 0x6c, 0x77,
+ 0x1a, 0x64, 0x72, 0x71, 0x64, 0x5f, 0x73, 0xaa,
+ 0xb5, 0xcf, 0xc2, 0xd7, 0xb4, 0xbf, 0x1e, 0xf7,
+ 0xa, 0xf7, 0x34, 0x5, 0xfb, 0x6b, 0x6, 0x76,
+ 0x80, 0x84, 0x71, 0x84, 0x1f, 0x79, 0x54, 0x5,
+ 0xe, 0x7d, 0xe7, 0xf8, 0xab, 0xe7, 0x12, 0xae,
+ 0xf7, 0x3f, 0xd7, 0xf7, 0x61, 0xfb, 0x34, 0xf7,
+ 0x2c, 0xf4, 0xf7, 0x3e, 0x13, 0xec, 0x23, 0xa,
+ 0xf7, 0xad, 0x9d, 0x15, 0x60, 0xa5, 0x75, 0xab,
+ 0xc2, 0x1a, 0xe1, 0xcd, 0xbd, 0xdb, 0xcb, 0xd5,
+ 0x6c, 0x3e, 0x53, 0x6f, 0x73, 0x61, 0x70, 0x1e,
+ 0xce, 0x6a, 0xbf, 0x63, 0x3a, 0x1a, 0x20, 0x29,
+ 0x50, 0x2a, 0x35, 0x2a, 0xb0, 0xf1, 0xd7, 0xbc,
+ 0xb0, 0xc8, 0xad, 0x1e, 0xf7, 0x4, 0xbf, 0x15,
+ 0xaa, 0x9e, 0x9f, 0xaa, 0xb0, 0x1a, 0xbb, 0x66,
+ 0xa5, 0x5e, 0x66, 0x6a, 0x66, 0x65, 0x5f, 0xb7,
+ 0x7f, 0xac, 0x7a, 0x1e, 0x58, 0x34, 0x15, 0x13,
+ 0xf4, 0x61, 0x75, 0x6e, 0x5d, 0x5b, 0x1a, 0x50,
+ 0xb5, 0x5c, 0xc7, 0xc4, 0xb9, 0xaf, 0xc7, 0xbc,
+ 0x60, 0xa5, 0x66, 0xa0, 0x1e, 0xe, 0x7d, 0xe7,
+ 0xb0, 0xf7, 0x3e, 0x5e, 0xb8, 0xf7, 0xdc, 0xe7,
+ 0x12, 0xae, 0xf7, 0x36, 0xfb, 0x36, 0xf7, 0x51,
+ 0xd1, 0xf7, 0x55, 0xf7, 0x6, 0xf7, 0x2d, 0x13,
+ 0xbb, 0x23, 0xa, 0xf8, 0x5e, 0x90, 0x15, 0x5e,
+ 0x6a, 0x54, 0x76, 0x54, 0x1b, 0x30, 0x4d, 0xd3,
+ 0xe9, 0xf7, 0x0, 0xe4, 0xc1, 0xf3, 0xf7, 0x27,
+ 0xcb, 0xfb, 0xf, 0xfb, 0x1c, 0x47, 0x82, 0x4a,
+ 0x65, 0x52, 0x1f, 0x49, 0x61, 0x51, 0x77, 0x3f,
+ 0x1b, 0x13, 0xb7, 0x4f, 0x2d, 0xa7, 0xd5, 0xab,
+ 0xa0, 0xa7, 0xad, 0xa6, 0xa0, 0x73, 0x70, 0x1f,
+ 0x7d, 0x85, 0x7f, 0x81, 0x1a, 0x13, 0xdb, 0x70,
+ 0xab, 0x80, 0xa0, 0xee, 0x9f, 0xf7, 0x1b, 0xd7,
+ 0x1e, 0xfb, 0x5b, 0xf7, 0x13, 0x15, 0x52, 0xa7,
+ 0x50, 0xcb, 0xd1, 0xaa, 0xcb, 0xc8, 0xc2, 0x66,
+ 0xc5, 0x4f, 0x45, 0x71, 0x4e, 0x4e, 0x1e, 0xe,
+ 0x7d, 0xe7, 0x2f, 0xef, 0xf8, 0x4c, 0xf7, 0x47,
+ 0x28, 0xee, 0x2f, 0xe7, 0x12, 0xae, 0xf7, 0x55,
+ 0xe8, 0xc4, 0xf1, 0xf7, 0x5, 0xeb, 0xcc, 0x13,
+ 0x67, 0x80, 0x23, 0xa, 0xf7, 0x15, 0xfb, 0x98,
+ 0x15, 0xb0, 0x7, 0xad, 0x8e, 0x5, 0xb0, 0x8d,
+ 0x84, 0xa1, 0xa9, 0x1a, 0xf7, 0xb5, 0x7, 0xb5,
+ 0x72, 0x87, 0x67, 0x1e, 0x6b, 0x9e, 0x6, 0x13,
+ 0x57, 0x80, 0xc4, 0x8e, 0x9b, 0xa3, 0xaa, 0xc0,
+ 0x8, 0xdd, 0xfc, 0x3e, 0x6, 0x56, 0x88, 0x8e,
+ 0xc2, 0x86, 0x1e, 0x98, 0x89, 0x5, 0x66, 0x7,
+ 0x83, 0xf7, 0x93, 0x15, 0x13, 0x8f, 0x80, 0xf7,
+ 0xa, 0x93, 0xf7, 0x2e, 0xf7, 0x2a, 0xf7, 0x1e,
+ 0x9a, 0xfb, 0x3c, 0x23, 0xfb, 0x0, 0x7e, 0xfb,
+ 0x2f, 0xfb, 0x1f, 0xfb, 0x29, 0x81, 0xf7, 0x22,
+ 0xf7, 0xd, 0x1e, 0xf1, 0x16, 0x60, 0x89, 0xfb,
+ 0x48, 0xc6, 0xc4, 0x8a, 0xf7, 0x4b, 0xb3, 0x1e,
+ 0xf7, 0x45, 0x80, 0x81, 0xc4, 0x67, 0x1b, 0x54,
+ 0x8a, 0xfb, 0x57, 0x64, 0x1f, 0xe, 0x9b, 0xae,
+ 0x76, 0xc3, 0xa4, 0x86, 0xa5, 0xab, 0x9a, 0x97,
+ 0xa3, 0x96, 0x9d, 0xf7, 0x6, 0xf7, 0x3d, 0x67,
+ 0xa5, 0x79, 0xa8, 0x70, 0xf7, 0x32, 0x12, 0x9e,
+ 0xa4, 0xf8, 0x3b, 0x9a, 0xf7, 0x7b, 0x9b, 0xb3,
+ 0xa4, 0x13, 0xbc, 0xbc, 0xcf, 0xb5, 0x15, 0xf7,
+ 0x1f, 0xc2, 0x5, 0x13, 0xdc, 0xbc, 0x80, 0xaa,
+ 0xb3, 0x7b, 0xac, 0x1b, 0xb5, 0xb5, 0x9d, 0xa2,
+ 0xb4, 0x1f, 0xd0, 0x70, 0xc9, 0xad, 0xc4, 0x97,
+ 0xa6, 0x67, 0xae, 0x78, 0xb6, 0xa9, 0x19, 0x8c,
+ 0x8e, 0x8e, 0x86, 0xdc, 0x32, 0x94, 0x91, 0x68,
+ 0xf7, 0x5, 0x73, 0xb5, 0x9a, 0x8e, 0x98, 0x94,
+ 0x90, 0x9c, 0x19, 0x86, 0xf7, 0x24, 0xfb, 0xc,
+ 0xf7, 0x18, 0x54, 0x9f, 0x61, 0x8e, 0x5, 0x13,
+ 0xbc, 0x7c, 0x3a, 0xf7, 0x20, 0x5, 0x40, 0x6,
+ 0xda, 0xfb, 0x1b, 0x25, 0x91, 0x58, 0x7a, 0xfb,
+ 0x87, 0xfb, 0x34, 0x58, 0x80, 0x5, 0x73, 0x66,
+ 0x83, 0x53, 0x5f, 0x1a, 0x5c, 0x9f, 0x4b, 0xa8,
+ 0x67, 0x1e, 0x13, 0xbe, 0x3c, 0xf8, 0xec, 0xf7,
+ 0xc0, 0x15, 0x3d, 0xf7, 0x1b, 0xa0, 0x8a, 0xba,
+ 0x79, 0xf7, 0x2, 0xfb, 0xc, 0x8e, 0xfb, 0x16,
+ 0x86, 0x82, 0x83, 0x8a, 0x83, 0x8c, 0x19, 0x69,
+ 0xc5, 0x5, 0x94, 0x95, 0x8f, 0x98, 0x97, 0x1a,
+ 0xa2, 0x78, 0x9f, 0x73, 0x8f, 0x1e, 0x59, 0xfb,
+ 0x4b, 0x15, 0x78, 0xd3, 0xb2, 0x93, 0xc3, 0x29,
+ 0x86, 0x7a, 0x6b, 0x79, 0x74, 0xaa, 0x7b, 0xa1,
+ 0x19, 0xfb, 0x20, 0x8c, 0x15, 0x81, 0x93, 0x87,
+ 0x93, 0x92, 0x1a, 0x99, 0x96, 0x97, 0x9e, 0x94,
+ 0x1e, 0x8b, 0xc7, 0x91, 0xa9, 0x90, 0x1e, 0x9e,
+ 0x44, 0x54, 0x7f, 0x5, 0xfc, 0x7a, 0x44, 0x15,
+ 0x75, 0xaf, 0x7d, 0xb0, 0xb7, 0x1a, 0xb8, 0x8e,
+ 0xaf, 0x9e, 0xac, 0x1e, 0xb9, 0x95, 0x5, 0x13,
+ 0xbd, 0x3c, 0xf7, 0x87, 0xf7, 0x36, 0xb8, 0x98,
+ 0xf7, 0x5, 0x85, 0xd5, 0xfb, 0x14, 0x5a, 0x93,
+ 0x39, 0xad, 0x92, 0xac, 0x79, 0x8e, 0x7b, 0x44,
+ 0xfb, 0x24, 0x7d, 0x8c, 0x7c, 0xf7, 0x6a, 0x9f,
+ 0xf7, 0x4c, 0x70, 0x5, 0x9e, 0x88, 0x95, 0x7b,
+ 0x7b, 0x1a, 0x81, 0x88, 0x81, 0x82, 0x84, 0x1e,
+ 0x77, 0x42, 0x2a, 0x7d, 0x4f, 0x1b, 0x6d, 0x98,
+ 0x65, 0x59, 0x43, 0x69, 0x4a, 0x89, 0x3e, 0x9d,
+ 0x19, 0x88, 0x7c, 0xd7, 0x79, 0xca, 0x8d, 0xd1,
+ 0xa8, 0x19, 0xa6, 0x63, 0x5, 0x13, 0xdc, 0xbc,
+ 0x79, 0x6a, 0x63, 0x78, 0x65, 0x1b, 0x6c, 0x5f,
+ 0x9d, 0x95, 0x6e, 0x1f, 0xf7, 0x7b, 0x99, 0x15,
+ 0x6f, 0xb4, 0x8e, 0x8d, 0xa0, 0xa6, 0xbe, 0x92,
+ 0x5, 0x82, 0x83, 0x82, 0x81, 0x7b, 0x1a, 0x7b,
+ 0x95, 0x7f, 0x98, 0x82, 0x1e, 0xbf, 0x81, 0x64,
+ 0x76, 0x5, 0xe, 0x7d, 0xae, 0xf8, 0x52, 0xa0,
+ 0xf7, 0x4a, 0x74, 0xa, 0xf7, 0xbe, 0xc9, 0xf7,
+ 0xb5, 0xae, 0x3, 0x22, 0xa, 0xf7, 0xbe, 0x6b,
+ 0xa, 0xc9, 0xf8, 0x6a, 0x51, 0x6, 0x7e, 0x4a,
+ 0x71, 0x70, 0x4d, 0x8a, 0x8, 0x76, 0xec, 0x7,
+ 0xe, 0x7d, 0xae, 0xe5, 0xbe, 0xf8, 0xb, 0xbd,
+ 0xde, 0x74, 0xa, 0xf7, 0x3f, 0xc7, 0xf7, 0x47,
+ 0xcc, 0xf7, 0x42, 0xae, 0x3, 0x22, 0xa, 0xf7,
+ 0x46, 0x6b, 0xa, 0xf7, 0xbe, 0xbe, 0xfb, 0x7e,
+ 0x6, 0x9a, 0xae, 0xae, 0xa0, 0xa9, 0x9f, 0x8,
+ 0xd7, 0xbe, 0xd8, 0xbb, 0xf2, 0x1a, 0xe4, 0x44,
+ 0xc5, 0x35, 0x38, 0x4a, 0x4d, 0xfb, 0x1, 0x8c,
+ 0x1e, 0xc7, 0x86, 0x5, 0xd5, 0xa3, 0xbf, 0xc9,
+ 0xc6, 0xad, 0x5e, 0x52, 0x3d, 0x50, 0x66, 0x51,
+ 0x65, 0x1e, 0x54, 0x68, 0x4e, 0x58, 0x45, 0x1a,
+ 0xe, 0x7d, 0xae, 0xde, 0xbf, 0xf8, 0x15, 0xba,
+ 0xdd, 0x4c, 0xa, 0xf8, 0x25, 0xc9, 0x5b, 0xc8,
+ 0xf7, 0x41, 0xae, 0x13, 0xfb, 0x22, 0xa, 0xf7,
+ 0x4b, 0x30, 0x15, 0xfb, 0x3, 0x8a, 0xcf, 0x63,
+ 0xd3, 0x1b, 0xdb, 0xd5, 0xc0, 0xdf, 0xc2, 0x71,
+ 0xb9, 0x54, 0x99, 0x1f, 0x8d, 0x7, 0x13, 0xfd,
+ 0xba, 0x9d, 0xa0, 0xa8, 0xbe, 0x1a, 0xdb, 0x47,
+ 0xbf, 0x40, 0x40, 0x50, 0x5c, 0x3f, 0x8d, 0x1e,
+ 0xc1, 0x85, 0x5, 0xbc, 0x89, 0xa5, 0xac, 0xc0,
+ 0x1b, 0xc1, 0xa7, 0x6b, 0x56, 0x53, 0x5e, 0x71,
+ 0x58, 0x1f, 0x72, 0x8c, 0x5, 0x63, 0x7, 0x13,
+ 0xfb, 0xc8, 0x92, 0xd5, 0x6f, 0x42, 0x1a, 0x52,
+ 0x66, 0x6f, 0x53, 0x56, 0x64, 0xb7, 0xc2, 0x92,
+ 0x1e, 0xe, 0x7d, 0xae, 0xf7, 0x64, 0xc0, 0xf8,
+ 0x18, 0x74, 0xa, 0xf7, 0xe6, 0xc2, 0xf7, 0x94,
+ 0xae, 0x3, 0x22, 0xa, 0xf7, 0x16, 0xfb, 0x9,
+ 0x15, 0xf7, 0x64, 0xfb, 0xa, 0xc2, 0xf7, 0xa,
+ 0xda, 0xc0, 0x3c, 0xf7, 0xc5, 0x6, 0x58, 0x8c,
+ 0xfb, 0x68, 0xfb, 0xc6, 0x5, 0xc3, 0x16, 0xf7,
+ 0x2c, 0xf7, 0x75, 0x5, 0xfb, 0x75, 0x7, 0xe,
+ 0x7d, 0xae, 0xde, 0xbd, 0xf7, 0x70, 0xc2, 0xee,
+ 0xc0, 0xe4, 0x4c, 0xa, 0xf7, 0x54, 0xbf, 0x5e,
+ 0xbe, 0xf7, 0x41, 0xca, 0xf7, 0x37, 0xae, 0x13,
+ 0xfe, 0xc0, 0x22, 0xa, 0xf7, 0x54, 0xfb, 0xe,
+ 0x15, 0x42, 0x8f, 0xc5, 0x5c, 0xd3, 0x1b, 0xf2,
+ 0xc4, 0xd4, 0xec, 0xdc, 0x55, 0xd5, 0x35, 0x1f,
+ 0x13, 0xfd, 0xc0, 0x66, 0x63, 0x82, 0x69, 0x78,
+ 0x1f, 0xf7, 0x22, 0xf7, 0x76, 0xc0, 0xfb, 0xa9,
+ 0xfb, 0xab, 0x7, 0x13, 0xfe, 0xc0, 0xb8, 0x6,
+ 0xb9, 0x93, 0xa9, 0xa5, 0xbd, 0x1b, 0xc9, 0xa8,
+ 0x60, 0x54, 0x48, 0x77, 0x54, 0x3d, 0x5f, 0x64,
+ 0xb0, 0xb8, 0x8d, 0x1f, 0xe, 0x7d, 0xae, 0xde,
+ 0xb9, 0xf7, 0x67, 0xbf, 0xf7, 0x10, 0xbe, 0xdd,
+ 0x4c, 0xa, 0xf7, 0x37, 0xc3, 0x53, 0xcd, 0xf7,
+ 0x45, 0xc3, 0xf7, 0x4f, 0xae, 0x13, 0xfe, 0xc0,
+ 0x22, 0xa, 0xf7, 0x6f, 0x8a, 0x15, 0xe6, 0x9f,
+ 0xf0, 0xe1, 0xbc, 0x9b, 0x70, 0x61, 0x94, 0x1e,
+ 0xbd, 0x98, 0x5, 0xcf, 0x81, 0x5f, 0xb2, 0x46,
+ 0x1b, 0x53, 0x53, 0x65, 0x58, 0x73, 0x1f, 0x75,
+ 0x5b, 0x86, 0x54, 0x57, 0x1a, 0x59, 0x8f, 0x4c,
+ 0xa1, 0x5e, 0x1e, 0x58, 0xa3, 0xbd, 0x6c, 0xc4,
+ 0x1b, 0xe4, 0xc0, 0xda, 0xde, 0xd9, 0x5a, 0xd0,
+ 0x38, 0x73, 0x74, 0x86, 0x7f, 0x78, 0x1f, 0x77,
+ 0x80, 0x7c, 0x7a, 0x81, 0x74, 0x8, 0x13, 0xfd,
+ 0xc0, 0x95, 0x3b, 0x15, 0xbf, 0xac, 0xb7, 0xc2,
+ 0xcb, 0xa4, 0x5d, 0x53, 0x56, 0x76, 0x53, 0x4d,
+ 0x4b, 0x6d, 0xc3, 0xc6, 0x1e, 0xe, 0x7d, 0xae,
+ 0xf8, 0x8e, 0xc1, 0xe4, 0x74, 0xa, 0xf7, 0x3b,
+ 0xf7, 0xcc, 0xf7, 0x3e, 0xae, 0x3, 0x22, 0xa,
+ 0xf7, 0x72, 0x6b, 0xa, 0xce, 0x6, 0xa4, 0xf7,
+ 0x2e, 0xd7, 0xf7, 0x1f, 0xe4, 0xf7, 0x13, 0x8,
+ 0xbd, 0xfb, 0xcc, 0x55, 0xf7, 0x89, 0x7, 0x29,
+ 0xfb, 0xb, 0x48, 0xfb, 0x23, 0x72, 0xfb, 0x2e,
+ 0x8, 0xe, 0x7d, 0xae, 0xe8, 0xbf, 0xf7, 0x37,
+ 0xc1, 0xf7, 0x32, 0xba, 0xdd, 0x4c, 0xa, 0xf7,
+ 0x44, 0xc3, 0x64, 0xc3, 0xf7, 0x35, 0xbf, 0x5e,
+ 0xc3, 0xf7, 0x44, 0xae, 0x13, 0xfe, 0x60, 0xf7,
+ 0xe3, 0xf7, 0xfb, 0x15, 0x55, 0x7c, 0x68, 0x64,
+ 0x50, 0x1a, 0x39, 0xc9, 0x59, 0xdc, 0xdc, 0xd4,
+ 0xb6, 0xe1, 0xc4, 0x6d, 0xb6, 0x54, 0x9b, 0x1e,
+ 0x8d, 0x7, 0x13, 0xfd, 0xa0, 0xbc, 0x9a, 0xa4,
+ 0xae, 0xc0, 0x1a, 0xd5, 0x50, 0xbd, 0x43, 0x43,
+ 0x49, 0x5b, 0x3e, 0x5c, 0xa7, 0x63, 0xb7, 0x7c,
+ 0x1e, 0x7b, 0xf2, 0x15, 0xba, 0xab, 0xa9, 0xba,
+ 0xbd, 0xab, 0x6f, 0x5a, 0x58, 0x6b, 0x6d, 0x58,
+ 0x56, 0x72, 0xaa, 0xbd, 0x1e, 0x13, 0xfe, 0x60,
+ 0x7a, 0xfb, 0x74, 0x15, 0xbe, 0xad, 0xb1, 0xc0,
+ 0xc4, 0xb4, 0x74, 0x4f, 0x52, 0x69, 0x74, 0x51,
+ 0x56, 0x63, 0xa0, 0xc0, 0x1e, 0xfb, 0x9f, 0xf5,
+ 0x21, 0xa, 0xe, 0x7d, 0xae, 0xde, 0xbd, 0xf7,
+ 0x13, 0xbf, 0xf7, 0x67, 0xb7, 0xdd, 0x4c, 0xa,
+ 0xf7, 0x42, 0xc3, 0x67, 0xbc, 0xf7, 0x39, 0xcd,
+ 0x53, 0xc3, 0xf7, 0x43, 0xae, 0x13, 0xfd, 0x60,
+ 0x22, 0xa, 0xf7, 0x56, 0xfb, 0x20, 0x15, 0x4a,
+ 0x93, 0xb6, 0x66, 0xce, 0x1b, 0xc9, 0xc1, 0xb5,
+ 0xc2, 0xa2, 0x1f, 0x9c, 0xb3, 0x91, 0xd1, 0xb7,
+ 0x1a, 0xf1, 0x71, 0xf7, 0x17, 0xfb, 0x14, 0x1e,
+ 0x13, 0xfe, 0x60, 0x32, 0x52, 0x41, 0x36, 0x3b,
+ 0xba, 0x47, 0xe0, 0xbd, 0xb6, 0xa1, 0xb9, 0x9e,
+ 0x1f, 0x43, 0x83, 0xfb, 0xf, 0x29, 0x1e, 0x13,
+ 0xfd, 0xa0, 0x67, 0x70, 0xa7, 0xad, 0x85, 0x1f,
+ 0xd7, 0xf7, 0x9, 0x15, 0x13, 0xfe, 0xa0, 0x4e,
+ 0x6f, 0xb3, 0xc3, 0xc8, 0xa0, 0xc1, 0xd1, 0xc4,
+ 0xa9, 0x53, 0x58, 0x52, 0x70, 0x5c, 0x4d, 0x1f,
+ 0xe, 0x7d, 0xae, 0xdd, 0xb8, 0xf8, 0x1e, 0xb8,
+ 0xde, 0x74, 0xa, 0xf7, 0x3a, 0xc8, 0xbc, 0xc3,
+ 0xf7, 0x44, 0xc3, 0xe0, 0xae, 0x3, 0xf8, 0x26,
+ 0x4d, 0xa, 0xc4, 0x93, 0xf7, 0x1f, 0xdd, 0xe2,
+ 0x8a, 0xfb, 0x1b, 0x4e, 0x53, 0x85, 0xfb, 0x22,
+ 0x3b, 0x35, 0x87, 0xf7, 0x1d, 0xc8, 0x1e, 0x53,
+ 0x16, 0x34, 0xab, 0xfb, 0x30, 0xf7, 0x6, 0xf7,
+ 0x17, 0x96, 0xf7, 0x23, 0xef, 0xeb, 0x79, 0xf7,
+ 0x25, 0xfb, 0x10, 0xfb, 0x18, 0x7d, 0xfb, 0x21,
+ 0x27, 0x1e, 0xfb, 0xcb, 0x16, 0x20, 0xa, 0xf7,
+ 0x3a, 0x6b, 0xa, 0xc8, 0xf8, 0x6a, 0x58, 0x6,
+ 0x85, 0x56, 0x65, 0x69, 0x5b, 0x8c, 0x8, 0x6d,
+ 0xdd, 0x7, 0xe, 0xd3, 0xa0, 0x76, 0xf7, 0x5a,
+ 0x96, 0xf8, 0x51, 0x77, 0x1, 0xf3, 0xf9, 0x2c,
+ 0x3, 0xf8, 0xaa, 0xf2, 0x15, 0xf7, 0x73, 0x24,
+ 0x96, 0x96, 0xfb, 0x10, 0xf7, 0x74, 0xfc, 0x37,
+ 0xf8, 0x37, 0x75, 0x75, 0xf8, 0x39, 0xfc, 0x39,
+ 0x6f, 0x89, 0xfc, 0x2c, 0xf8, 0x2c, 0x80, 0x81,
+ 0xf8, 0x2b, 0xfc, 0x2b, 0x7d, 0x68, 0xfc, 0x36,
+ 0xf8, 0x35, 0x5b, 0x5a, 0x5, 0xf8, 0x5c, 0xfc,
+ 0x17, 0x15, 0xa0, 0x97, 0x9a, 0xb2, 0xac, 0x8e,
+ 0xd8, 0xfb, 0x17, 0x82, 0x82, 0x5, 0xe, 0x7d,
+ 0x72, 0xa, 0x1, 0xf7, 0xf6, 0xe5, 0x26, 0xa,
+ 0xf7, 0xd3, 0x6b, 0xa, 0xf7, 0xf8, 0x2a, 0xae,
+ 0x7, 0xd2, 0x8c, 0xa8, 0xa1, 0x97, 0xd1, 0x8,
+ 0xd6, 0xfc, 0x78, 0x6, 0xe, 0x7d, 0xf7, 0x11,
+ 0xf8, 0x7e, 0xf3, 0x12, 0xae, 0xf7, 0x54, 0xfb,
+ 0x54, 0xf7, 0x5c, 0xdb, 0xf7, 0x2c, 0xe7, 0xf7,
+ 0x57, 0x13, 0xec, 0x23, 0xa, 0x13, 0xdc, 0xf7,
+ 0x5c, 0x6b, 0xa, 0x89, 0xec, 0xce, 0xbf, 0xc5,
+ 0xb0, 0x8, 0xc2, 0xae, 0xc1, 0xaf, 0xd4, 0x1a,
+ 0xbd, 0x72, 0xb1, 0x54, 0x54, 0x79, 0x5e, 0x46,
+ 0x8c, 0x1e, 0x13, 0xec, 0x33, 0x93, 0x5, 0xf7,
+ 0x8, 0xd5, 0xc9, 0xe3, 0xe6, 0xda, 0x4a, 0x2c,
+ 0x22, 0x37, 0x5c, 0x3d, 0x57, 0x1e, 0x74, 0x7c,
+ 0x6a, 0x77, 0x80, 0x71, 0x8, 0xf7, 0x7a, 0x4a,
+ 0x6, 0xe, 0x7d, 0xf7, 0xa, 0xcd, 0xf7, 0x36,
+ 0xc3, 0xf7, 0x25, 0xd0, 0xf2, 0x1, 0xf7, 0xd4,
+ 0xf7, 0x2b, 0xe3, 0xf7, 0x57, 0x26, 0xa, 0xf7,
+ 0x60, 0x40, 0x15, 0xdc, 0x8c, 0x5, 0x4e, 0x8f,
+ 0x61, 0xcf, 0x8c, 0x1e, 0xbf, 0x8c, 0xa6, 0xab,
+ 0xbd, 0x1a, 0xc3, 0x66, 0xa2, 0x58, 0x1e, 0x5c,
+ 0x88, 0x5, 0xc9, 0x7, 0xb2, 0x88, 0x5, 0xbd,
+ 0xac, 0xa4, 0xbf, 0xb3, 0x79, 0xa7, 0x5f, 0x50,
+ 0x7e, 0x6b, 0x59, 0x8d, 0x1f, 0x39, 0x94, 0x5,
+ 0xe8, 0x89, 0xce, 0xbc, 0xe3, 0x1b, 0xd7, 0xd5,
+ 0x56, 0x3a, 0x5c, 0x79, 0x68, 0x60, 0x75, 0x1f,
+ 0xbc, 0x71, 0xa3, 0x6e, 0x4f, 0x1a, 0x30, 0x3e,
+ 0x55, 0x36, 0x3f, 0x39, 0xb4, 0xe1, 0x1e, 0xe,
+ 0x7d, 0xf7, 0x11, 0xf8, 0x80, 0xf1, 0x12, 0xf7,
+ 0x4e, 0xf7, 0xb7, 0xfb, 0x5e, 0xf7, 0xb, 0x13,
+ 0xd0, 0x23, 0xa, 0x13, 0xe0, 0xf7, 0x2b, 0xfb,
+ 0x9, 0x15, 0xc7, 0x7, 0xf7, 0x5f, 0xf7, 0xce,
+ 0x5, 0xe3, 0xfb, 0xc7, 0xdf, 0x48, 0x37, 0xfb,
+ 0xa, 0x6, 0x13, 0xd0, 0x38, 0xf7, 0xa, 0x6,
+ 0x13, 0xe0, 0x13, 0xd0, 0xfb, 0xb, 0xce, 0x15,
+ 0xf7, 0xb, 0xf7, 0x56, 0x6, 0xe, 0x7d, 0xf7,
+ 0xa, 0xf7, 0xf1, 0xd6, 0xce, 0xf7, 0x2, 0x1,
+ 0xf8, 0xce, 0xf7, 0x4c, 0x26, 0xa, 0xf7, 0x69,
+ 0xfb, 0x2, 0x15, 0xda, 0x9d, 0x5, 0x61, 0x87,
+ 0xa5, 0x66, 0xb9, 0x1b, 0xd0, 0x9b, 0xc8, 0xc5,
+ 0xbb, 0x74, 0xb4, 0x54, 0x5a, 0x77, 0x6e, 0x61,
+ 0x84, 0x1f, 0x44, 0xf7, 0xaf, 0xf7, 0xbf, 0x48,
+ 0xfb, 0x70, 0x2d, 0x6, 0x97, 0xa4, 0xa2, 0x92,
+ 0xa7, 0x1b, 0xef, 0xc7, 0x44, 0x2a, 0x27, 0x42,
+ 0x3a, 0x26, 0x3c, 0x49, 0xbd, 0xdd, 0x88, 0x1f,
+ 0xe, 0x7d, 0xf7, 0xa, 0xd1, 0xf7, 0x4e, 0xce,
+ 0xf5, 0xd0, 0xf2, 0x1, 0xae, 0xf7, 0x4c, 0xe5,
+ 0xf7, 0x2e, 0x26, 0xa, 0xf7, 0xa0, 0xb9, 0x15,
+ 0xa4, 0xa9, 0xa7, 0x95, 0xb2, 0x1b, 0xe4, 0xc4,
+ 0x47, 0x34, 0x31, 0x4d, 0x3d, 0x2d, 0xfb, 0x20,
+ 0x6c, 0xf7, 0x1a, 0xf7, 0x5, 0xf7, 0x4, 0xb2,
+ 0xf7, 0x1f, 0xf7, 0x1e, 0xd7, 0xbf, 0x61, 0x40,
+ 0x95, 0x1f, 0x3f, 0x76, 0x5, 0xb0, 0x81, 0x86,
+ 0xab, 0x5a, 0x1b, 0x45, 0x78, 0x36, 0x53, 0x89,
+ 0x1f, 0x91, 0xfb, 0xc, 0x15, 0x58, 0xa5, 0x5c,
+ 0xc5, 0xc2, 0x9a, 0xb9, 0xb8, 0xbb, 0x79, 0xba,
+ 0x51, 0x59, 0x6f, 0x5f, 0x5f, 0x1e, 0xe, 0x7d,
+ 0x72, 0xa, 0x1, 0xf7, 0x73, 0xf7, 0xe8, 0x26,
+ 0xa, 0xf7, 0x9a, 0x6b, 0xa, 0xa2, 0xf7, 0x2c,
+ 0xc1, 0xf7, 0x21, 0xed, 0xf7, 0xf, 0x8, 0xfb,
+ 0x8d, 0xcf, 0xf7, 0xe8, 0x4d, 0x6, 0x32, 0xfb,
+ 0x17, 0x3d, 0xfb, 0x18, 0x73, 0xfb, 0x33, 0x8,
+ 0xe, 0x7d, 0xf7, 0xa, 0xd0, 0xf7, 0x2a, 0xda,
+ 0xf7, 0x16, 0xd0, 0xf3, 0x12, 0xae, 0xf7, 0x59,
+ 0xde, 0xf7, 0x33, 0xfb, 0x24, 0xf7, 0x1c, 0xe6,
+ 0xf7, 0x59, 0x13, 0xfb, 0x23, 0xa, 0xf7, 0xab,
+ 0xa0, 0x15, 0x64, 0x9c, 0x72, 0xb5, 0xb4, 0x1a,
+ 0xdf, 0xd4, 0xbd, 0xd9, 0xd7, 0xd0, 0x56, 0x3a,
+ 0x5b, 0x76, 0x6a, 0x5e, 0x78, 0x1e, 0xbe, 0x6f,
+ 0xa5, 0x6d, 0x4d, 0x1a, 0x34, 0x3d, 0x53, 0x38,
+ 0x33, 0x3f, 0xbc, 0xe9, 0xc1, 0xaa, 0xbb, 0xbe,
+ 0x9d, 0x1e, 0x9b, 0xef, 0x15, 0x62, 0xa2, 0x73,
+ 0xb7, 0xb9, 0xa2, 0xa1, 0xb6, 0xb5, 0x75, 0xa2,
+ 0x5e, 0x5b, 0x76, 0x75, 0x60, 0x1e, 0x13, 0xfd,
+ 0x7c, 0xfb, 0x70, 0x15, 0x5c, 0xaa, 0x70, 0xbc,
+ 0xc0, 0xa5, 0xa4, 0xbc, 0xbb, 0x6f, 0xa7, 0x5a,
+ 0x56, 0x6e, 0x72, 0x58, 0x1e, 0xe, 0x7d, 0xf7,
+ 0xa, 0xd1, 0xf6, 0xcf, 0xf7, 0x4d, 0xce, 0xf3,
+ 0x1, 0xae, 0xf7, 0x57, 0xdf, 0xf7, 0x32, 0xe0,
+ 0xf7, 0x59, 0x26, 0xa, 0xf7, 0x6a, 0xfb, 0x14,
+ 0x15, 0xd7, 0x99, 0x5, 0x6c, 0x90, 0x9b, 0x70,
+ 0xaf, 0x1b, 0xd4, 0x99, 0xe0, 0xc2, 0x8e, 0x1f,
+ 0x73, 0x72, 0x67, 0x82, 0x68, 0x1b, 0x30, 0x54,
+ 0xce, 0xe3, 0xe7, 0xcc, 0xd4, 0xea, 0xf7, 0x18,
+ 0xae, 0xfb, 0xe, 0xfb, 0x3, 0x58, 0x86, 0x3b,
+ 0x72, 0x5e, 0x1f, 0x52, 0x6c, 0x54, 0x6c, 0x4b,
+ 0x1b, 0x45, 0x57, 0xb7, 0xd1, 0x85, 0x1f, 0xcc,
+ 0xf7, 0x68, 0x15, 0x5c, 0xa3, 0x69, 0xbe, 0xc3,
+ 0xa1, 0xb4, 0xbc, 0xbc, 0x71, 0xb9, 0x53, 0x4e,
+ 0x81, 0x51, 0x5d, 0x1e, 0xe, 0x7d, 0xf7, 0x9,
+ 0xfb, 0x9, 0x72, 0xa, 0x23, 0xf3, 0x12, 0xae,
+ 0xf7, 0x4f, 0xf7, 0x53, 0xf7, 0x29, 0xdf, 0xf7,
+ 0x0, 0x13, 0x6e, 0xf7, 0x72, 0xf7, 0x3, 0x15,
+ 0xf7, 0xf6, 0x39, 0xad, 0x7, 0xc1, 0x8a, 0xad,
+ 0xb0, 0x90, 0xc7, 0x8, 0xd9, 0xfc, 0x78, 0x6,
+ 0xfb, 0xa8, 0xf7, 0x7f, 0x15, 0x2c, 0xa, 0xf7,
+ 0xbb, 0x97, 0x15, 0x13, 0x9e, 0xf7, 0x2, 0x9d,
+ 0xf7, 0x19, 0xf7, 0x21, 0xf7, 0x1a, 0xa2, 0xfb,
+ 0x1d, 0x21, 0xfb, 0x2, 0x7a, 0xfb, 0x25, 0xfb,
+ 0x20, 0xfb, 0xe, 0x66, 0xf7, 0x33, 0xeb, 0x1e,
+ 0xde, 0x16, 0x59, 0x8e, 0xfb, 0x26, 0xd4, 0xce,
+ 0x91, 0xf7, 0x2a, 0xb9, 0xbf, 0x8c, 0xf7, 0x1c,
+ 0x41, 0x46, 0x84, 0xfb, 0x1f, 0x5a, 0x1e, 0xe,
+ 0xe9, 0xf7, 0x89, 0xd0, 0x49, 0xf7, 0xb, 0x6c,
+ 0xce, 0x7c, 0xaa, 0x1, 0xa2, 0xf7, 0x8c, 0x15,
+ 0xf8, 0xf5, 0x6, 0xf7, 0x7a, 0xe0, 0x5, 0x9a,
+ 0x7, 0xfb, 0x8a, 0xd2, 0x5, 0xfc, 0xe5, 0x6c,
+ 0xf8, 0xe8, 0x6, 0x78, 0x76, 0x5, 0xfc, 0xd5,
+ 0x7c, 0xf8, 0xd3, 0x6, 0x9a, 0x68, 0x5, 0xfc,
+ 0xe2, 0x6, 0xf8, 0xe8, 0x77, 0x15, 0x92, 0xa2,
+ 0x7a, 0xb2, 0xa0, 0xa4, 0xf7, 0x27, 0x65, 0x5,
+ 0x7e, 0x7, 0xe, 0xc2, 0xa3, 0x76, 0xf7, 0xb9,
+ 0xe2, 0xf7, 0xba, 0x77, 0x1, 0xc1, 0xf9, 0xb9,
+ 0x3, 0xc1, 0xf7, 0xb5, 0x15, 0xf7, 0xc4, 0x9a,
+ 0x5, 0xfb, 0xc0, 0x7, 0x8d, 0x8a, 0xf8, 0x87,
+ 0xf7, 0xe4, 0x75, 0xa, 0xfc, 0x87, 0xf7, 0xe4,
+ 0x89, 0x8a, 0x5, 0xfb, 0xc0, 0x7, 0xfb, 0xc4,
+ 0x9a, 0x5, 0xe, 0x8a, 0xf7, 0x41, 0x76, 0xf7,
+ 0x4b, 0xa2, 0xf7, 0x4a, 0x54, 0xa, 0xf7, 0xe3,
+ 0x15, 0xf8, 0xbe, 0x6, 0x61, 0x57, 0x65, 0x4d,
+ 0x8e, 0x46, 0xca, 0xe2, 0xf7, 0x12, 0xd1, 0xf1,
+ 0xb0, 0x25, 0xb0, 0xfb, 0x10, 0xd1, 0x4a, 0xe2,
+ 0x8a, 0x4c, 0xab, 0x3e, 0xb9, 0x61, 0x8, 0xfc,
+ 0xbe, 0x6, 0xe, 0x49, 0xa, 0xf7, 0xba, 0xfb,
+ 0x8c, 0x5, 0xfb, 0x4b, 0xfb, 0x44, 0x15, 0xf7,
+ 0x78, 0xf7, 0x44, 0x5, 0xf8, 0x39, 0x6, 0xe,
+ 0xf7, 0x45, 0xf7, 0x41, 0x76, 0xf7, 0x4b, 0xa2,
+ 0xf7, 0x4a, 0x77, 0x1, 0xad, 0x4d, 0xa, 0xf2,
+ 0x65, 0xed, 0x45, 0xcc, 0x35, 0x8c, 0xca, 0x6b,
+ 0xd6, 0x5d, 0xb8, 0x8, 0xf8, 0xce, 0x6, 0x61,
+ 0x57, 0x64, 0x4d, 0x8f, 0x46, 0xca, 0xe2, 0xf0,
+ 0xd1, 0xf0, 0xb0, 0x25, 0xaf, 0x29, 0xd2, 0x4a,
+ 0xe2, 0x8a, 0x4c, 0xaa, 0x3d, 0xba, 0x62, 0x8,
+ 0xfc, 0xce, 0x6, 0xb5, 0xbd, 0xb1, 0xc9, 0x88,
+ 0xd1, 0x4c, 0x33, 0x26, 0x45, 0x25, 0x67, 0x8,
+ 0xe, 0xfc, 0x11, 0x23, 0x76, 0xfa, 0x45, 0x77,
+ 0x1, 0xf7, 0x6d, 0xa2, 0x3, 0xae, 0xf7, 0x1e,
+ 0x15, 0xe2, 0x4c, 0xd1, 0x28, 0xb0, 0x26, 0xaf,
+ 0xf1, 0xd2, 0xeb, 0xe1, 0xcc, 0x4d, 0x8c, 0x3d,
+ 0x6c, 0x61, 0x5c, 0x8, 0xf8, 0xce, 0x7, 0xbe,
+ 0x61, 0xc9, 0x65, 0xd0, 0x8e, 0x34, 0xca, 0x45,
+ 0xf0, 0x67, 0xf1, 0x65, 0x24, 0x45, 0x29, 0x35,
+ 0x4a, 0xca, 0x8a, 0xd6, 0xab, 0xb7, 0xb9, 0x8,
+ 0xfc, 0xce, 0x7, 0x58, 0xb5, 0x4d, 0xb2, 0x46,
+ 0x87, 0x8, 0xe, 0xe0, 0xcb, 0x76, 0xf7, 0x97,
+ 0xd5, 0xf7, 0x98, 0x77, 0x1, 0xc3, 0xf9, 0xcc,
+ 0x3, 0xc3, 0xf7, 0xbc, 0x15, 0xf8, 0x12, 0x98,
+ 0x5, 0xfb, 0x9d, 0x7, 0x8c, 0x8a, 0xf8, 0x4d,
+ 0xf7, 0xbc, 0x75, 0xa, 0xfc, 0x4d, 0xf7, 0xbb,
+ 0x8a, 0x8a, 0x5, 0xfb, 0x9d, 0x7, 0xfc, 0x12,
+ 0x98, 0x5, 0xe, 0xda, 0xf7, 0xdb, 0xa5, 0x71,
+ 0xa6, 0x7f, 0x94, 0x12, 0x9f, 0xfa, 0x3, 0x13,
+ 0x90, 0xc3, 0xf7, 0xd9, 0x15, 0xf9, 0x1c, 0x8f,
+ 0x3c, 0x7a, 0xfb, 0x0, 0x57, 0x75, 0x58, 0x19,
+ 0x7d, 0x85, 0x8c, 0x82, 0x8f, 0x1b, 0x8d, 0x8f,
+ 0x8e, 0x8e, 0x8d, 0x1f, 0xca, 0xe0, 0xf7, 0x5a,
+ 0xb4, 0xf3, 0x9a, 0x8, 0x8d, 0x8c, 0x8c, 0x8d,
+ 0x8c, 0x1f, 0x13, 0x30, 0x8e, 0x8d, 0x8e, 0x8e,
+ 0x95, 0x1b, 0x92, 0x8c, 0x94, 0x8e, 0x8e, 0x1a,
+ 0x8c, 0x88, 0x8c, 0x88, 0x1e, 0xfb, 0x19, 0x95,
+ 0xfb, 0x2f, 0xb1, 0x46, 0xe6, 0x8, 0x8d, 0x89,
+ 0x89, 0x8e, 0x8a, 0x1b, 0x89, 0x8d, 0x81, 0x80,
+ 0x8f, 0x1f, 0xa2, 0x53, 0xdd, 0x67, 0xd7, 0x6d,
+ 0x8, 0x13, 0x50, 0xfc, 0xf7, 0x8d, 0x5, 0x70,
+ 0x66, 0x94, 0x8d, 0x78, 0x1f, 0x88, 0x8c, 0x87,
+ 0x89, 0x88, 0x1a, 0x88, 0x8e, 0x88, 0x90, 0x86,
+ 0x1e, 0x90, 0x86, 0x95, 0x7e, 0x9a, 0x84, 0x8,
+ 0xe, 0xe3, 0xc0, 0x76, 0xf7, 0x7c, 0xf7, 0x38,
+ 0xf7, 0x7c, 0x77, 0x12, 0xae, 0xf9, 0xed, 0x17,
+ 0xf8, 0xda, 0xf7, 0x9c, 0x15, 0x4d, 0x4d, 0x5,
+ 0x76, 0x74, 0x7d, 0x74, 0x6a, 0x1a, 0x57, 0xb3,
+ 0x64, 0xbe, 0xaf, 0xa4, 0xa3, 0xa4, 0xa0, 0x1e,
+ 0x13, 0x30, 0xf7, 0x7e, 0xf7, 0x9d, 0xfb, 0x81,
+ 0xf7, 0xa1, 0x5, 0xa3, 0x77, 0x72, 0xa0, 0x6a,
+ 0x1b, 0x13, 0x50, 0x56, 0x64, 0x61, 0x56, 0x6f,
+ 0xa1, 0x70, 0x9e, 0x78, 0x1f, 0xc3, 0x4c, 0x5,
+ 0xfc, 0x48, 0x6, 0x51, 0x56, 0x7a, 0x4a, 0x47,
+ 0xbf, 0x7d, 0xc6, 0x1f, 0xe, 0xe4, 0xf7, 0x2a,
+ 0x76, 0xf7, 0x5c, 0xac, 0xf7, 0x5c, 0x54, 0xa,
+ 0xf9, 0xec, 0x3, 0xae, 0xf7, 0xdd, 0x15, 0xf8,
+ 0xff, 0xfb, 0x5c, 0x6, 0xf7, 0x81, 0xf7, 0x6d,
+ 0xfb, 0x81, 0xf7, 0x6c, 0x5, 0xfb, 0x5c, 0xfc,
+ 0xff, 0x7, 0xe, 0xe4, 0xf7, 0x29, 0x76, 0xf7,
+ 0x34, 0xf7, 0x8, 0xf7, 0x33, 0x54, 0xa, 0xf9,
+ 0xee, 0x3, 0xae, 0xf7, 0xb4, 0x15, 0xf8, 0xff,
+ 0xfb, 0x34, 0x6, 0xf7, 0x83, 0xf7, 0x6e, 0xfb,
+ 0x83, 0xf7, 0x6d, 0x5, 0xfb, 0x33, 0xfc, 0xff,
+ 0x7, 0xe, 0xf5, 0x43, 0x76, 0xf9, 0xd6, 0x77,
+ 0x1, 0x34, 0xa, 0xfc, 0x7d, 0xfc, 0xc3, 0x15,
+ 0xb5, 0x64, 0xf7, 0xc, 0xd6, 0xf7, 0x25, 0xaf,
+ 0xf7, 0x1f, 0x99, 0x19, 0xbc, 0xf7, 0x58, 0xcb,
+ 0xd9, 0xf7, 0x11, 0xf7, 0x2e, 0x8, 0x8e, 0x94,
+ 0x8d, 0x93, 0x94, 0x1a, 0xb6, 0x61, 0xb8, 0x5d,
+ 0x7b, 0x7b, 0x86, 0x7e, 0x7b, 0x1e, 0xfb, 0x19,
+ 0xfb, 0x1e, 0x21, 0x36, 0xfb, 0x32, 0xfb, 0x0,
+ 0x6a, 0x31, 0x4d, 0xfb, 0x7, 0x4e, 0x41, 0x8,
+ 0xb1, 0x95, 0x15, 0xa3, 0xa9, 0xa7, 0xb3, 0x9b,
+ 0xa8, 0xa7, 0xbd, 0xa4, 0xbe, 0x9e, 0xbf, 0xe0,
+ 0xc5, 0xde, 0xc8, 0xd8, 0xce, 0xbe, 0xb7, 0xba,
+ 0xba, 0xba, 0xbb, 0x8, 0x95, 0x95, 0x8f, 0x90,
+ 0x9b, 0x1b, 0xa9, 0xad, 0x6d, 0x6d, 0x81, 0x87,
+ 0x85, 0x86, 0x84, 0x1f, 0x72, 0x6b, 0x70, 0x6b,
+ 0x73, 0x6a, 0x3d, 0x24, 0x61, 0x38, 0x6a, 0xfb,
+ 0x11, 0xfb, 0x0, 0x7f, 0xfb, 0xa, 0x6e, 0x26,
+ 0x5b, 0x7b, 0x84, 0x78, 0x80, 0x81, 0x84, 0x8a,
+ 0x8c, 0x18, 0xf7, 0x21, 0xf7, 0x2a, 0x5, 0xa8,
+ 0xab, 0xae, 0xa7, 0x92, 0x84, 0x93, 0x83, 0x6e,
+ 0x65, 0x68, 0x6d, 0x90, 0x1f, 0xfb, 0x1d, 0xfb,
+ 0x2c, 0x5, 0xe, 0x86, 0xf7, 0x44, 0x76, 0xf2,
+ 0xf7, 0x44, 0xf2, 0x54, 0xa, 0xa4, 0xcb, 0xba,
+ 0xaf, 0xd9, 0x3, 0xf7, 0xca, 0xf7, 0x96, 0x15,
+ 0xf7, 0x99, 0x24, 0x6, 0xf7, 0x78, 0xf7, 0x53,
+ 0xfb, 0x78, 0xf7, 0x53, 0x5, 0x24, 0xfb, 0x99,
+ 0x7, 0x24, 0xfb, 0x44, 0x15, 0xd9, 0xf7, 0x44,
+ 0x3d, 0x6, 0x38, 0xfb, 0x44, 0x15, 0xba, 0xf7,
+ 0x44, 0x5c, 0x6, 0x32, 0xfb, 0x44, 0x15, 0xa4,
+ 0xf7, 0x44, 0x72, 0x6, 0xe, 0xad, 0xf7, 0x6,
+ 0x76, 0xf8, 0x8e, 0x54, 0xa, 0xa2, 0xd3, 0xab,
+ 0xc6, 0xbe, 0xb1, 0xd5, 0x3, 0xf8, 0x2c, 0xf7,
+ 0x5b, 0x15, 0xf7, 0x3a, 0x21, 0x92, 0x6, 0xb7,
+ 0xf7, 0xb, 0xf4, 0xe3, 0xf7, 0x0, 0xb9, 0xfb,
+ 0x2, 0xba, 0xfb, 0x0, 0xe6, 0x64, 0xf7, 0x7,
+ 0x8, 0x84, 0x21, 0xfb, 0x3a, 0x6, 0x29, 0xfb,
+ 0xba, 0x15, 0xd5, 0xf7, 0xba, 0x41, 0x6, 0x32,
+ 0xfb, 0xba, 0x15, 0xbe, 0xf7, 0xba, 0x58, 0x6,
+ 0x30, 0xfb, 0xba, 0x15, 0xab, 0xf7, 0xba, 0x6b,
+ 0x6, 0x2c, 0xfb, 0xba, 0x15, 0xa2, 0xf7, 0xba,
+ 0x74, 0x6, 0xe, 0x80, 0xf7, 0x11, 0x76, 0xf8,
+ 0x78, 0x54, 0xa, 0xf9, 0x88, 0x3, 0xae, 0xf7,
+ 0x5d, 0x15, 0xf8, 0x8b, 0x2a, 0x6, 0xf7, 0x91,
+ 0xf7, 0x86, 0xfb, 0x91, 0xf7, 0x86, 0x5, 0x2a,
+ 0xfc, 0x8b, 0x7, 0xe, 0x49, 0xa, 0xf7, 0xbc,
+ 0xfb, 0x8c, 0x5, 0xb8, 0x16, 0xfb, 0x70, 0xf7,
+ 0x44, 0xf9, 0x13, 0xfb, 0x44, 0x5, 0xe, 0xd9,
+ 0x3d, 0xa, 0xf9, 0xe3, 0x7a, 0xa, 0xf9, 0xe3,
+ 0xf7, 0xee, 0xfd, 0xe3, 0xf7, 0xee, 0xf7, 0x67,
+ 0xfb, 0xee, 0x5, 0xe, 0xe6, 0xf4, 0x76, 0xf7,
+ 0xaf, 0xd8, 0xf7, 0x38, 0x54, 0xa, 0xb3, 0x3,
+ 0xf8, 0xb5, 0xdf, 0x15, 0x76, 0xa, 0x23, 0xfb,
+ 0xcb, 0x7, 0x25, 0x8a, 0x52, 0xa8, 0xf7, 0x1c,
+ 0x1a, 0x63, 0xfb, 0x85, 0x6, 0x8c, 0x4e, 0x8b,
+ 0x6f, 0xb8, 0x5c, 0x8, 0x62, 0xb1, 0xb9, 0x87,
+ 0xc0, 0x1b, 0xf7, 0xdb, 0x6, 0xe, 0xe7, 0xf4,
+ 0x76, 0xf7, 0x37, 0xf7, 0x97, 0xf1, 0x54, 0xa,
+ 0xb3, 0x3, 0xae, 0xdf, 0x15, 0xb3, 0x6, 0xf7,
+ 0x1c, 0xc5, 0xa7, 0xf1, 0x8a, 0x1e, 0xf7, 0xca,
+ 0x24, 0x6, 0x76, 0xa, 0x25, 0xfb, 0xdb, 0x7,
+ 0x56, 0x5e, 0x86, 0x62, 0x64, 0x1f, 0x5f, 0x5d,
+ 0x8a, 0x6e, 0x8a, 0x4f, 0x8, 0xe, 0xfc, 0xc,
+ 0x3d, 0x76, 0xfa, 0xe, 0x54, 0xa, 0xf8, 0x1e,
+ 0x3, 0xae, 0xc2, 0x15, 0xf7, 0x14, 0xfb, 0x2e,
+ 0x6, 0xf7, 0x9e, 0xf8, 0x51, 0xfb, 0x9e, 0xf8,
+ 0x51, 0x5, 0xfb, 0x2e, 0xfb, 0x14, 0x7, 0xe,
+ 0xb7, 0xe7, 0x76, 0xf8, 0xbc, 0x77, 0x1, 0xf8,
+ 0x42, 0x96, 0x3, 0xae, 0xf7, 0x38, 0x15, 0xf8,
+ 0x1f, 0x2e, 0x96, 0x6, 0xae, 0xd2, 0xf7, 0x7e,
+ 0xf7, 0x71, 0xf7, 0x1e, 0x77, 0x8, 0x94, 0x7,
+ 0xfb, 0x3d, 0x9f, 0xfb, 0x29, 0xf6, 0x32, 0xf7,
+ 0x24, 0x8, 0x80, 0x2d, 0xfc, 0x1f, 0x6, 0xe,
+ 0x88, 0xb7, 0xa0, 0x76, 0x6c, 0xa, 0x76, 0xa0,
+ 0x12, 0xae, 0xa5, 0xf7, 0xe4, 0xa5, 0x13, 0xb7,
+ 0xae, 0xf7, 0x5d, 0x15, 0xf7, 0xfe, 0x6, 0x13,
+ 0x4b, 0xfb, 0x31, 0xf7, 0x28, 0x7, 0xf7, 0x95,
+ 0xf7, 0xc2, 0xfb, 0x95, 0xf7, 0xc2, 0x5, 0xfb,
+ 0x28, 0x6, 0x13, 0xb7, 0xfb, 0x31, 0xfb, 0xfe,
+ 0x7, 0xa5, 0xfb, 0x9d, 0x15, 0xf7, 0x84, 0xf7,
+ 0xfe, 0xf7, 0x35, 0x7, 0xf7, 0x8e, 0xfb, 0xad,
+ 0xfb, 0x8e, 0x7d, 0xa, 0xf7, 0x1b, 0x50, 0x76,
+ 0xf8, 0x57, 0xf7, 0x47, 0x8b, 0xb3, 0x8b, 0xa0,
+ 0xf7, 0x16, 0x77, 0x1, 0xc6, 0xf9, 0xde, 0x3,
+ 0x34, 0xa, 0xfc, 0x6f, 0xfc, 0xc1, 0x15, 0x96,
+ 0x83, 0xf7, 0x2b, 0xf7, 0x3b, 0x5, 0xa9, 0x86,
+ 0xb1, 0xae, 0xa8, 0x1b, 0x93, 0x92, 0x83, 0x84,
+ 0x6f, 0x6b, 0x68, 0x6e, 0x1f, 0xfb, 0x30, 0xfb,
+ 0x3a, 0x93, 0x83, 0xf7, 0x6, 0xd2, 0xf7, 0x2b,
+ 0xb0, 0xf7, 0x15, 0x99, 0x19, 0xb8, 0xf7, 0x4a,
+ 0xca, 0xdd, 0xf7, 0x9, 0xf7, 0x24, 0x8, 0x89,
+ 0x6, 0xbd, 0x91, 0x6f, 0xbd, 0x52, 0x1b, 0x83,
+ 0x83, 0x89, 0x8a, 0x83, 0x1f, 0x6b, 0x69, 0xfb,
+ 0x1, 0xfb, 0x5, 0xfb, 0x10, 0x2e, 0xfb, 0x15,
+ 0x33, 0x19, 0x6f, 0x3e, 0x4c, 0xfb, 0xf, 0x50,
+ 0x44, 0x8, 0xe, 0xa7, 0x90, 0xf9, 0x4e, 0x1,
+ 0xc5, 0xf9, 0x73, 0x3, 0xf3, 0xf7, 0xbe, 0x15,
+ 0xbc, 0xf7, 0x44, 0xf7, 0x8f, 0x64, 0x5, 0x8b,
+ 0xc8, 0xf7, 0x51, 0x88, 0x1a, 0x88, 0x8a, 0xf7,
+ 0xa7, 0xfb, 0x86, 0x8b, 0x1a, 0x88, 0x7, 0x8e,
+ 0xfc, 0x28, 0xfb, 0x75, 0x8b, 0x1e, 0x8a, 0xb9,
+ 0xf7, 0x48, 0x8b, 0x1e, 0xfb, 0xd5, 0xfb, 0x16,
+ 0x15, 0xf7, 0x92, 0xb4, 0x6b, 0xfb, 0x16, 0x88,
+ 0xfb, 0x0, 0xf8, 0x98, 0xf7, 0xad, 0x5, 0xf5,
+ 0x7, 0xfb, 0xee, 0xf7, 0xcb, 0x44, 0xfb, 0x6e,
+ 0xfb, 0x91, 0xb2, 0x4d, 0xfb, 0x76, 0x5, 0xe,
+ 0xfb, 0x23, 0xcc, 0x76, 0xe4, 0xe4, 0xf7, 0xb8,
+ 0xa8, 0xf4, 0x54, 0xa, 0xa7, 0xf7, 0x78, 0xa5,
+ 0x3, 0xf7, 0xd, 0xf7, 0x19, 0x15, 0xf7, 0x3e,
+ 0x71, 0x6, 0xd7, 0x4c, 0xf7, 0xba, 0xf7, 0xb0,
+ 0xfc, 0x6, 0xf7, 0xd4, 0x5, 0x22, 0xfb, 0x94,
+ 0xfb, 0xe6, 0x7, 0xa7, 0x9c, 0x15, 0xf7, 0xb8,
+ 0xf7, 0x92, 0xd6, 0x7, 0xf7, 0x96, 0xfb, 0x72,
+ 0xfb, 0x96, 0xfb, 0x88, 0x5, 0xee, 0x7, 0xe,
+ 0xae, 0xed, 0x76, 0xeb, 0xcf, 0xf7, 0x99, 0xa5,
+ 0xe6, 0x77, 0x1, 0xf8, 0xb6, 0xa3, 0x3, 0xf3,
+ 0xf7, 0x41, 0x15, 0xf8, 0x4e, 0x66, 0x6, 0xc9,
+ 0x50, 0xf7, 0x7c, 0xf7, 0x8a, 0xfb, 0xba, 0xf7,
+ 0xbc, 0x5, 0x30, 0xfc, 0x91, 0x7, 0xd8, 0xfb,
+ 0x31, 0x3c, 0xfb, 0x16, 0x5, 0xa7, 0x16, 0xd9,
+ 0xf7, 0x16, 0x4b, 0xf7, 0x17, 0x5, 0xf8, 0x81,
+ 0xc7, 0x6, 0xf7, 0x4e, 0xfb, 0x53, 0xfb, 0x4e,
+ 0xfb, 0x4b, 0x5, 0xc0, 0x7, 0xe, 0x3c, 0x9c,
+ 0x76, 0xf9, 0x43, 0x77, 0x1, 0xb6, 0xf7, 0x3c,
+ 0x3, 0xb6, 0xf7, 0xe8, 0x15, 0xfb, 0x52, 0xf7,
+ 0x2b, 0xfb, 0x2e, 0xf7, 0x4e, 0xf7, 0x4e, 0xf7,
+ 0x2b, 0xf7, 0x2e, 0xf7, 0x52, 0xf7, 0x52, 0xfb,
+ 0x2b, 0xf7, 0x2d, 0xfb, 0x4e, 0xfb, 0x4e, 0xfb,
+ 0x2b, 0xfb, 0x2d, 0xfb, 0x52, 0x1e, 0xf7, 0x3c,
+ 0xfb, 0xb4, 0x15, 0xf8, 0xd4, 0x7, 0x8c, 0x8c,
+ 0xf8, 0x87, 0xfb, 0xb4, 0x80, 0xa, 0xfc, 0x87,
+ 0xfb, 0xb4, 0x5, 0xe, 0xf6, 0xf7, 0xb, 0x76,
+ 0xf7, 0xd, 0xad, 0xd2, 0xab, 0xd2, 0xad, 0xf7,
+ 0xd, 0x77, 0x1, 0xf9, 0x3a, 0xac, 0x3, 0xb2,
+ 0xf7, 0x6f, 0x15, 0xf7, 0xed, 0x6, 0xec, 0xf4,
+ 0x5, 0xf7, 0x59, 0xfb, 0x76, 0x6, 0xf7, 0x7d,
+ 0xf7, 0x86, 0xfb, 0x7d, 0xf7, 0x86, 0x5, 0xfb,
+ 0x76, 0xfb, 0x59, 0x7, 0x2a, 0xf4, 0x5, 0xfb,
+ 0xed, 0x6, 0xf7, 0x6, 0xfb, 0xd, 0x5, 0xf8,
+ 0xc2, 0xfb, 0x3b, 0x15, 0xf7, 0xe2, 0x7, 0xf7,
+ 0x32, 0xfb, 0x3b, 0x5, 0xfd, 0x8b, 0x34, 0x15,
+ 0xdf, 0xe2, 0x37, 0xe2, 0x5, 0xf7, 0x9f, 0x6,
+ 0xda, 0x34, 0x3c, 0x34, 0x5, 0xe, 0xa5, 0xf8,
+ 0x87, 0xf7, 0xda, 0x15, 0xf7, 0x2d, 0x6, 0x71,
+ 0x69, 0x8b, 0x5c, 0xaa, 0x6a, 0xb3, 0xc7, 0xce,
+ 0xb4, 0xcd, 0xb2, 0x48, 0xa6, 0x49, 0xb3, 0x63,
+ 0xc8, 0x69, 0x6e, 0x8e, 0x54, 0xa5, 0x6d, 0x8,
+ 0xfb, 0x2d, 0x6, 0xfc, 0x64, 0xfb, 0x33, 0x15,
+ 0xf7, 0xe8, 0x6, 0xf7, 0xb, 0xf7, 0xb, 0x5,
+ 0xfb, 0xe6, 0x6, 0xb3, 0x4, 0xf7, 0xe6, 0x6,
+ 0x90, 0xfb, 0x11, 0xf7, 0x7, 0x8b, 0x1f, 0xfb,
+ 0xe7, 0x6, 0xe, 0xf7, 0x14, 0xf7, 0x25, 0x76,
+ 0xf7, 0x61, 0xad, 0xf7, 0x61, 0x77, 0x1, 0xf7,
+ 0x4a, 0xf8, 0x73, 0x3, 0xae, 0xf7, 0x23, 0x15,
+ 0xf7, 0xe6, 0x6, 0x91, 0xc0, 0xa0, 0xd2, 0xb6,
+ 0xaa, 0x8, 0xa9, 0xb5, 0xd8, 0x8c, 0xbd, 0x1b,
+ 0xe7, 0x6, 0x56, 0x53, 0x88, 0x31, 0x98, 0x50,
+ 0xd5, 0xe6, 0xe2, 0xe2, 0xf7, 0x2, 0xb7, 0xfb,
+ 0x2, 0xb9, 0x30, 0xdd, 0x45, 0xe9, 0x7e, 0x64,
+ 0x90, 0xfb, 0x7, 0xbe, 0x58, 0x8, 0x2f, 0x6,
+ 0x4f, 0x4e, 0x8b, 0xb5, 0x5b, 0x1f, 0x65, 0xab,
+ 0x70, 0xc8, 0x86, 0xbe, 0x8, 0xfb, 0xe6, 0x6,
+ 0x97, 0x30, 0xbb, 0x3d, 0xe2, 0x69, 0x35, 0x6c,
+ 0x56, 0x37, 0x83, 0x33, 0x8, 0xe, 0x83, 0xf7,
+ 0xb, 0x76, 0xf7, 0x64, 0xd3, 0x5b, 0xa1, 0xf7,
+ 0x7c, 0x77, 0x12, 0xa3, 0xf9, 0xa3, 0x13, 0xb8,
+ 0xf9, 0x7e, 0xf7, 0xde, 0x15, 0x60, 0x71, 0xfb,
+ 0x6, 0x45, 0x45, 0x62, 0x8, 0x63, 0x74, 0x83,
+ 0x7b, 0x75, 0x1a, 0x72, 0xa3, 0x82, 0x95, 0x9e,
+ 0x93, 0x94, 0xa7, 0xa5, 0x1e, 0xcd, 0xd1, 0xf4,
+ 0xe9, 0xd9, 0xb6, 0x8, 0x89, 0x7, 0x8d, 0x7,
+ 0x3b, 0xb6, 0x23, 0xe6, 0x49, 0xd2, 0x8, 0xa7,
+ 0x71, 0x82, 0x94, 0x78, 0x1b, 0x81, 0x75, 0x82,
+ 0x72, 0x75, 0x94, 0x7b, 0xb3, 0x74, 0x1f, 0xd1,
+ 0x63, 0xf7, 0x7, 0x44, 0xb4, 0x71, 0x8, 0x13,
+ 0xd8, 0xfb, 0xaf, 0xfb, 0xb5, 0xa5, 0x2f, 0x1b,
+ 0x64, 0x78, 0x7d, 0x74, 0x72, 0xa0, 0x81, 0xb1,
+ 0x1f, 0x13, 0xb8, 0xea, 0xf7, 0xbc, 0xa3, 0xf7,
+ 0xa4, 0x1b, 0xe, 0xad, 0xdc, 0x76, 0xf7, 0x9f,
+ 0xa3, 0xf7, 0xa5, 0x77, 0x1, 0xf9, 0xab, 0xf7,
+ 0xdb, 0x15, 0x5e, 0x71, 0xfb, 0x7, 0x55, 0x35,
+ 0x71, 0x8, 0x4d, 0x78, 0x8e, 0x58, 0x66, 0x1a,
+ 0x62, 0xc1, 0x7e, 0xb4, 0x9c, 0xa9, 0xa1, 0x9d,
+ 0x98, 0x1e, 0xc9, 0xe0, 0xc6, 0xf7, 0x3, 0xdd,
+ 0xb7, 0x38, 0xb8, 0x42, 0xf7, 0xf, 0x4c, 0xe1,
+ 0x8, 0x9c, 0x7f, 0x6f, 0x98, 0x7a, 0x1b, 0x5c,
+ 0x5f, 0x70, 0x62, 0x63, 0xa4, 0x61, 0xb6, 0x7a,
+ 0x1f, 0xde, 0x6c, 0xf7, 0xa, 0x5a, 0xb7, 0x71,
+ 0x8, 0xfb, 0xbb, 0xfb, 0x96, 0xe7, 0x2b, 0x1b,
+ 0x54, 0x52, 0x41, 0x6d, 0x64, 0xc3, 0x4b, 0xc4,
+ 0x1f, 0xee, 0xf7, 0x9f, 0xe6, 0xf7, 0xaf, 0x1b,
+ 0xe, 0xe3, 0xf7, 0x5f, 0xf7, 0xa6, 0x1, 0xa9,
+ 0xf9, 0xf8, 0x3, 0xa9, 0xf7, 0x5f, 0x15, 0xf9,
+ 0x19, 0x6, 0xf7, 0x73, 0xf7, 0x1c, 0x75, 0xa,
+ 0xfb, 0x73, 0xf7, 0x1c, 0x5, 0xfd, 0x19, 0x6,
+ 0xf7, 0x18, 0xfb, 0x1c, 0x80, 0xa, 0xe, 0x37,
+ 0x93, 0x76, 0xf9, 0x62, 0x77, 0x1, 0xad, 0xf9,
+ 0x43, 0x3, 0xf8, 0x66, 0xf8, 0xb6, 0x15, 0xfb,
+ 0xf2, 0xfb, 0x7f, 0x7b, 0x74, 0x81, 0x1b, 0x80,
+ 0x82, 0xa7, 0x93, 0x88, 0x1f, 0xca, 0x71, 0x89,
+ 0x9c, 0x77, 0x1b, 0x71, 0x6d, 0x7a, 0x7c, 0x76,
+ 0x1f, 0x7e, 0x82, 0x81, 0x83, 0x7a, 0x1a, 0x59,
+ 0xb2, 0x27, 0xa1, 0x5d, 0x1e, 0x92, 0x7d, 0x90,
+ 0x7d, 0x95, 0x84, 0x8, 0x86, 0x92, 0x9a, 0x8b,
+ 0xab, 0x1b, 0x99, 0xa7, 0x8c, 0x90, 0x92, 0x1f,
+ 0x94, 0x91, 0xf7, 0xf3, 0xf8, 0xd0, 0xf7, 0xb,
+ 0xf7, 0x5, 0xa1, 0xa0, 0x18, 0x55, 0x33, 0x77,
+ 0x63, 0x67, 0x1f, 0xe, 0xf7, 0x17, 0xd4, 0xf8,
+ 0xaa, 0x1, 0xa9, 0xf9, 0xf8, 0x3, 0xa9, 0xd4,
+ 0x15, 0xf9, 0x19, 0x6, 0xf7, 0x73, 0xf7, 0x9e,
+ 0x75, 0xa, 0xfb, 0x73, 0xf7, 0x9e, 0x5, 0xfd,
+ 0x19, 0x6, 0xf7, 0x18, 0xfb, 0x9e, 0x80, 0xa,
+ 0xe, 0xda, 0x91, 0xf9, 0x30, 0x1, 0xe4, 0xf9,
+ 0xa2, 0x3, 0xe4, 0x91, 0x15, 0xf9, 0xa2, 0xf7,
+ 0xe1, 0x75, 0xa, 0xfd, 0xa2, 0xf7, 0xe1, 0x5,
+ 0x38, 0x7, 0xf8, 0xe7, 0xfb, 0x8e, 0x80, 0xa,
+ 0xfc, 0xe7, 0xfb, 0x8e, 0x5, 0x95, 0xf7, 0x16,
+ 0x15, 0xf7, 0xe1, 0xf7, 0xc, 0x75, 0xa, 0xfb,
+ 0xe1, 0xf7, 0xc, 0x5, 0xe, 0x30, 0xbb, 0x76,
+ 0xf8, 0x87, 0x77, 0x1, 0xd4, 0xf8, 0xef, 0x3,
+ 0xf7, 0x12, 0xdd, 0x15, 0xf7, 0x63, 0xf7, 0x38,
+ 0xf7, 0x2f, 0xfb, 0x6e, 0x8c, 0x8a, 0xf7, 0x4f,
+ 0xf8, 0x87, 0x5, 0x8a, 0x6, 0xfc, 0xa9, 0x81,
+ 0x8c, 0x8a, 0xf7, 0x2d, 0xfb, 0x6e, 0xfb, 0x73,
+ 0xfb, 0x1f, 0x5, 0xe, 0x88, 0xb7, 0x6c, 0xa,
+ 0x12, 0xae, 0xf7, 0x4, 0xf7, 0x81, 0xf7, 0xb,
+ 0x13, 0x6c, 0xae, 0xf7, 0x5d, 0x15, 0xf7, 0xf1,
+ 0x6, 0x13, 0x9c, 0xfb, 0x31, 0xf7, 0x1a, 0x7,
+ 0xf7, 0xb0, 0xf7, 0xc2, 0xfb, 0xb0, 0xf7, 0xc2,
+ 0x5, 0xfb, 0x1a, 0x6, 0x13, 0xac, 0xfb, 0x31,
+ 0xfb, 0xf1, 0x7, 0xf7, 0x4, 0xfb, 0x9d, 0x15,
+ 0xf7, 0x84, 0xf7, 0xf8, 0xf7, 0x35, 0x7, 0xf7,
+ 0x9c, 0xfb, 0xad, 0xfb, 0x9c, 0x7d, 0xa, 0x47,
+ 0xc5, 0x76, 0xf8, 0x91, 0xea, 0x99, 0x77, 0x12,
+ 0xf8, 0xee, 0xe0, 0x13, 0xb0, 0xf8, 0x7e, 0xf8,
+ 0x3d, 0x15, 0xf7, 0x4, 0xe7, 0x8f, 0x63, 0xb4,
+ 0x6d, 0xb3, 0x80, 0x19, 0x88, 0xe5, 0xaa, 0xcf,
+ 0xa0, 0xc8, 0x8, 0x13, 0xd0, 0x45, 0x77, 0x3b,
+ 0x7c, 0x44, 0xa0, 0x8c, 0x66, 0xa7, 0x56, 0xad,
+ 0x86, 0xfb, 0x4, 0x2f, 0x18, 0xfc, 0x44, 0xfb,
+ 0x63, 0x15, 0xf7, 0x3d, 0x7e, 0xf7, 0x97, 0xf7,
+ 0x6e, 0xfb, 0x3b, 0x99, 0x5, 0x36, 0xfc, 0x41,
+ 0x15, 0xf7, 0x98, 0xf7, 0x6e, 0x5, 0xcd, 0x92,
+ 0xbf, 0x94, 0xbc, 0x1e, 0xfb, 0x98, 0xfb, 0x6e,
+ 0x5, 0xe, 0xbc, 0x8d, 0x76, 0xf7, 0xf1, 0xf7,
+ 0x39, 0xf7, 0x6d, 0x77, 0x12, 0xf9, 0x46, 0xec,
+ 0x13, 0xb0, 0xad, 0xf7, 0xb8, 0x15, 0x5e, 0xba,
+ 0xc7, 0x6e, 0xcd, 0x1b, 0xa3, 0xa3, 0x8f, 0x94,
+ 0xa2, 0x1f, 0x78, 0x68, 0x83, 0x68, 0x64, 0x1a,
+ 0x5a, 0x9d, 0x59, 0xa5, 0x61, 0x1e, 0xf7, 0x97,
+ 0xf7, 0x6d, 0x5, 0x13, 0xd0, 0x72, 0xb2, 0x7d,
+ 0xba, 0xb9, 0x1a, 0xd7, 0xc0, 0xb7, 0xbf, 0xb8,
+ 0x1e, 0xd1, 0xc4, 0x8a, 0x3a, 0xbc, 0x49, 0xbc,
+ 0x66, 0x19, 0xf7, 0x28, 0x9b, 0xee, 0xbd, 0xec,
+ 0x1e, 0xfb, 0x6, 0x68, 0xfb, 0xd, 0x95, 0xfb,
+ 0x8, 0xa0, 0xaa, 0x4f, 0xc4, 0x4e, 0xd9, 0x82,
+ 0x43, 0x51, 0x18, 0x68, 0x62, 0x57, 0x63, 0x53,
+ 0x1b, 0x58, 0x4a, 0xa8, 0xae, 0x65, 0x1f, 0xe,
+ 0x30, 0xed, 0x76, 0xf8, 0x4d, 0x77, 0xd9, 0x77,
+ 0x1, 0xce, 0xf8, 0xf1, 0x3, 0xf7, 0x20, 0xde,
+ 0x15, 0xf8, 0xa8, 0x85, 0x75, 0xa, 0xfb, 0x54,
+ 0xf8, 0x85, 0x80, 0xa, 0xfb, 0x2c, 0xfb, 0x6e,
+ 0xfb, 0x64, 0xf7, 0x36, 0x56, 0x40, 0xf7, 0x75,
+ 0xfb, 0x1f, 0xfb, 0x2c, 0xfb, 0x70, 0x5, 0xe,
+ 0x47, 0xc5, 0x76, 0xa3, 0xdc, 0xf8, 0x95, 0x77,
+ 0x1, 0xf8, 0xe9, 0xe5, 0x3, 0xf8, 0x66, 0xf7,
+ 0x82, 0x15, 0xf6, 0x2b, 0x69, 0x86, 0x74, 0x5a,
+ 0x8a, 0x66, 0x19, 0x93, 0xa4, 0xa7, 0x8d, 0xa6,
+ 0x1b, 0xbb, 0xbd, 0x80, 0x7e, 0xb6, 0x1f, 0x76,
+ 0xc8, 0x6c, 0xcf, 0x8e, 0xe5, 0x63, 0x80, 0x5d,
+ 0x69, 0x87, 0x63, 0x20, 0xeb, 0x18, 0xfb, 0x57,
+ 0x62, 0x15, 0xf7, 0x3b, 0x99, 0xfb, 0x97, 0xf7,
+ 0x6e, 0xfb, 0x3d, 0x7e, 0x5, 0xf7, 0x54, 0xb6,
+ 0x15, 0xf7, 0x98, 0xfb, 0x6e, 0x5, 0x8f, 0x88,
+ 0x77, 0xf7, 0x3e, 0x8b, 0x1a, 0xfb, 0x98, 0xf7,
+ 0x6e, 0x5, 0xe, 0xbc, 0x8d, 0x76, 0xa2, 0xf7,
+ 0x7, 0xf8, 0xe5, 0x77, 0x1, 0xf9, 0x3f, 0xf3,
+ 0x3, 0xf7, 0xb9, 0xf7, 0x4c, 0x15, 0xae, 0xb1,
+ 0xcc, 0xa8, 0xbe, 0x1b, 0xc3, 0xbf, 0x63, 0x68,
+ 0xb4, 0x1f, 0xcc, 0x55, 0x3d, 0x82, 0x57, 0x48,
+ 0x6e, 0x51, 0x19, 0x96, 0xc6, 0xc9, 0x93, 0xc7,
+ 0x1b, 0xc5, 0xc3, 0x85, 0x7a, 0xc3, 0x1f, 0x59,
+ 0xec, 0x7b, 0xee, 0xf7, 0x28, 0x1a, 0x5f, 0x70,
+ 0x4e, 0x43, 0x8c, 0x3a, 0x4c, 0xc0, 0x18, 0x57,
+ 0xb8, 0x56, 0xb7, 0xd7, 0x1a, 0xb9, 0x99, 0xba,
+ 0xa4, 0xb2, 0x1e, 0xfb, 0x97, 0xf7, 0x6d, 0x5,
+ 0x71, 0x61, 0x79, 0x59, 0x5a, 0x1a, 0x64, 0x93,
+ 0x68, 0x9e, 0x68, 0x1e, 0x94, 0x74, 0x73, 0x8f,
+ 0x73, 0x1b, 0x49, 0x4f, 0x6e, 0x5e, 0x5c, 0x1f,
+ 0xe, 0xa7, 0xa4, 0x76, 0xf8, 0x89, 0x77, 0xf7,
+ 0x6d, 0x77, 0x1, 0xbb, 0xf9, 0x9b, 0x3, 0xf7,
+ 0x18, 0xf7, 0x7d, 0x15, 0x63, 0xf7, 0x44, 0xf7,
+ 0xad, 0x69, 0x5, 0x8b, 0x5d, 0xf7, 0x48, 0x8a,
+ 0x8b, 0xf8, 0x1d, 0xfb, 0x75, 0x8e, 0x1a, 0x88,
+ 0x7, 0x8b, 0xfb, 0xaa, 0xfb, 0x86, 0x8e, 0x8a,
+ 0x1e, 0x88, 0x5f, 0xf7, 0x51, 0x8b, 0x1e, 0xfb,
+ 0xc2, 0x32, 0x15, 0xf7, 0xa4, 0xb2, 0xc0, 0xfb,
+ 0x6e, 0xf7, 0xf4, 0xf7, 0xcb, 0xba, 0xec, 0xfc,
+ 0x7a, 0xf7, 0xb6, 0x4d, 0xfb, 0x0, 0xaf, 0xfb,
+ 0x16, 0xfb, 0x5d, 0xb4, 0x4d, 0x2b, 0x5, 0xe,
+ 0xf7, 0xe, 0xee, 0xb3, 0xf0, 0xf7, 0x50, 0x44,
+ 0x77, 0xf7, 0x55, 0xb3, 0x12, 0xf9, 0x96, 0xf7,
+ 0xa, 0x8b, 0xbb, 0x13, 0xdc, 0xf9, 0x39, 0xf7,
+ 0xed, 0x15, 0xb7, 0x9e, 0xbc, 0xa0, 0xc1, 0x93,
+ 0xbd, 0x9f, 0x19, 0xac, 0x98, 0xa8, 0xa4, 0xb2,
+ 0x1a, 0xbc, 0x5d, 0xaa, 0x5d, 0x51, 0x68, 0x5e,
+ 0x59, 0x78, 0x1e, 0x7a, 0x5d, 0x80, 0x7b, 0x5f,
+ 0x73, 0x8, 0xfd, 0x1e, 0xf7, 0x1d, 0x15, 0xf8,
+ 0xf0, 0xfb, 0x85, 0xc1, 0x75, 0xb1, 0x7a, 0xa3,
+ 0x52, 0x19, 0x58, 0xa1, 0xb1, 0x64, 0xc5, 0x1b,
+ 0xb9, 0xb7, 0xaa, 0xbc, 0xb2, 0x6c, 0xa6, 0x69,
+ 0x97, 0x1f, 0x57, 0x9e, 0x54, 0x92, 0x59, 0xa1,
+ 0x55, 0xa3, 0x18, 0x75, 0xc1, 0xfd, 0x8, 0xf7,
+ 0x31, 0x5, 0x93, 0xfc, 0x34, 0x15, 0xf8, 0xb7,
+ 0xf7, 0x31, 0x5, 0x8c, 0x7, 0xfb, 0x6, 0xb8,
+ 0xfc, 0x47, 0xfb, 0x54, 0x5, 0xf9, 0x84, 0xf7,
+ 0xe8, 0x15, 0xab, 0xae, 0xa2, 0xa9, 0xa5, 0xa6,
+ 0x7a, 0x6e, 0x6a, 0x6a, 0x74, 0x6c, 0x70, 0x70,
+ 0x9d, 0xa8, 0x1e, 0x8d, 0xfb, 0xaf, 0x15, 0xa9,
+ 0xa4, 0x9d, 0xa7, 0xa9, 0xaf, 0x78, 0x6a, 0x6e,
+ 0x76, 0x77, 0x6e, 0x6e, 0x63, 0x9f, 0xac, 0x1e,
+ 0xfb, 0x50, 0xf7, 0x28, 0x15, 0x13, 0xbc, 0x94,
+ 0x93, 0x93, 0x94, 0x94, 0x93, 0x83, 0x82, 0x82,
+ 0x83, 0x83, 0x82, 0x82, 0x83, 0x93, 0x94, 0x1e,
+ 0xe, 0x92, 0x3a, 0xa, 0xaf, 0xf9, 0x9b, 0x3,
+ 0xc2, 0xf3, 0x15, 0x87, 0x69, 0xa9, 0x74, 0xa2,
+ 0x78, 0x8, 0x81, 0x98, 0xb4, 0x6b, 0xb0, 0x1b,
+ 0xa5, 0xea, 0xe3, 0xa2, 0xa4, 0x1f, 0xf8, 0x4f,
+ 0xf8, 0x5d, 0x5, 0xa1, 0xa1, 0x90, 0x8b, 0xa8,
+ 0x1a, 0xcc, 0x7, 0xa8, 0x8b, 0x91, 0x6b, 0x79,
+ 0x83, 0x87, 0x81, 0x7e, 0x1e, 0xfb, 0x71, 0xfb,
+ 0x5f, 0x5, 0xfb, 0x71, 0xfb, 0x76, 0x83, 0x83,
+ 0x83, 0x1b, 0x6b, 0x87, 0xac, 0xa3, 0x87, 0x1f,
+ 0x82, 0xc1, 0x5, 0x88, 0x9f, 0x84, 0xad, 0x9f,
+ 0x1a, 0xbe, 0x4d, 0x85, 0x69, 0x7f, 0x1e, 0x76,
+ 0x84, 0x78, 0x72, 0x7e, 0x7b, 0x8, 0x6a, 0x64,
+ 0x8b, 0x92, 0x57, 0x1a, 0x5f, 0x8b, 0x6a, 0x90,
+ 0x60, 0x1e, 0xe, 0xfb, 0x23, 0xcc, 0x76, 0xf4,
+ 0xa8, 0xf7, 0xb8, 0xe4, 0xe4, 0x54, 0xa, 0xa7,
+ 0xf7, 0x78, 0xa5, 0x3, 0xae, 0xf7, 0x29, 0x15,
+ 0xf7, 0x94, 0x22, 0x6, 0xf8, 0x6, 0xf7, 0xd9,
+ 0xfb, 0xb9, 0xf7, 0xab, 0x3e, 0x4c, 0x5, 0x71,
+ 0xfb, 0x3e, 0x7, 0x35, 0x43, 0x5, 0xa7, 0xfb,
+ 0xc9, 0x15, 0xf7, 0xb8, 0xf7, 0x92, 0xee, 0x7,
+ 0xf7, 0x96, 0xfb, 0x88, 0xfb, 0x96, 0xfb, 0x72,
+ 0x5, 0xd6, 0x7, 0xe, 0xae, 0xe9, 0x76, 0xe6,
+ 0xa5, 0xf7, 0x99, 0xcf, 0xeb, 0x77, 0x1, 0xf8,
+ 0xb8, 0xa3, 0x3, 0xb0, 0xf7, 0x38, 0x15, 0xf8,
+ 0x93, 0x30, 0x6, 0xf7, 0xb8, 0xf7, 0xba, 0xfb,
+ 0x7c, 0xf7, 0x8c, 0x4f, 0x56, 0x5, 0x60, 0xfc,
+ 0x50, 0x7, 0x46, 0x47, 0xd0, 0xfb, 0x16, 0x5,
+ 0x70, 0xfb, 0x17, 0x15, 0xc1, 0xf7, 0x17, 0x47,
+ 0xf7, 0x16, 0x5, 0xf8, 0x91, 0xc0, 0x6, 0xf7,
+ 0x4e, 0xfb, 0x4b, 0xfb, 0x4e, 0xfb, 0x53, 0x5,
+ 0xc7, 0x7, 0xe, 0xf7, 0x1b, 0xec, 0xb3, 0xf7,
+ 0x6b, 0xa6, 0xeb, 0xae, 0xb1, 0x77, 0x12, 0xf9,
+ 0x32, 0xb1, 0x65, 0xf7, 0x15, 0x9f, 0xb5, 0xbf,
+ 0xbb, 0x13, 0xf7, 0xf9, 0x36, 0xf8, 0xe, 0x15,
+ 0xb2, 0x88, 0x5, 0x87, 0xc2, 0xc4, 0x78, 0xc0,
+ 0x1b, 0xb6, 0xb3, 0xa3, 0xba, 0xbc, 0x59, 0xb1,
+ 0x5d, 0x67, 0x6a, 0x77, 0x73, 0x72, 0x1f, 0x68,
+ 0x6a, 0x7a, 0x83, 0x5b, 0x89, 0x8, 0xfc, 0x61,
+ 0xf4, 0x15, 0xf7, 0x31, 0x6, 0xf7, 0x76, 0xfb,
+ 0x50, 0xb6, 0x67, 0xa7, 0x71, 0x91, 0x50, 0x19,
+ 0x4d, 0x91, 0xaf, 0x4f, 0xd1, 0x1b, 0xb4, 0xb1,
+ 0xa7, 0xb6, 0xa8, 0x79, 0xa3, 0x75, 0x9c, 0x1f,
+ 0x61, 0xab, 0x5a, 0xa1, 0x64, 0xaf, 0x61, 0xb2,
+ 0x18, 0x87, 0xc2, 0xfb, 0x3d, 0xf5, 0x5, 0xf7,
+ 0x38, 0x9f, 0xfc, 0x42, 0x6, 0xfb, 0x63, 0x2c,
+ 0x15, 0xf8, 0xb0, 0x2c, 0x5, 0x8c, 0x7, 0x23,
+ 0xe2, 0xfc, 0x45, 0x9d, 0x5, 0xf9, 0xad, 0x6b,
+ 0x15, 0xa9, 0xa6, 0x98, 0xa5, 0xa9, 0xaa, 0x7a,
+ 0x6a, 0x6e, 0x73, 0x7a, 0x70, 0x6d, 0x6a, 0x9f,
+ 0xac, 0x1e, 0xfb, 0x6e, 0x67, 0x15, 0x94, 0x92,
+ 0x91, 0x94, 0x93, 0x94, 0x84, 0x83, 0x82, 0x82,
+ 0x84, 0x82, 0x82, 0x85, 0x93, 0x93, 0x1e, 0x13,
+ 0xfb, 0xf7, 0x13, 0xfb, 0x5c, 0x15, 0xa4, 0xa2,
+ 0x9e, 0xa3, 0xa8, 0xae, 0x71, 0x6c, 0x72, 0x77,
+ 0x76, 0x72, 0x6e, 0x66, 0xa7, 0xaa, 0x1e, 0xe,
+ 0x3e, 0x8b, 0xa9, 0xf8, 0xab, 0xa7, 0x6f, 0xf7,
+ 0x13, 0x12, 0xae, 0xa8, 0xf8, 0xa9, 0xa7, 0x6f,
+ 0xf7, 0x16, 0x13, 0xd8, 0xae, 0x16, 0xf8, 0xe2,
+ 0xf5, 0x6, 0x13, 0xb4, 0xf1, 0xf8, 0xde, 0xfc,
+ 0xdb, 0x6, 0x13, 0xd8, 0x28, 0xfb, 0x1, 0x7,
+ 0xa8, 0xfc, 0xc7, 0x15, 0xf8, 0xab, 0xf8, 0xa9,
+ 0xfc, 0xab, 0x7, 0xe, 0x3b, 0x8b, 0xab, 0xf8,
+ 0xad, 0xf7, 0xf, 0x1, 0xae, 0xaa, 0xf8, 0xa8,
+ 0xf7, 0x13, 0x7a, 0xa, 0xf8, 0xcd, 0x6, 0xf7,
+ 0xd, 0xf7, 0xb, 0x5, 0xf8, 0xd1, 0xfc, 0xc6,
+ 0x7, 0xfb, 0x14, 0xfb, 0x7, 0x5, 0xaa, 0xfc,
+ 0xb5, 0x6d, 0xa, 0x66, 0xa, 0xaf, 0xf7, 0xe9,
+ 0x15, 0xe6, 0x54, 0xf7, 0x3f, 0xfb, 0x1f, 0xf7,
+ 0x34, 0xfb, 0x5b, 0x9a, 0x96, 0x18, 0x5f, 0xf7,
+ 0xb, 0x33, 0xf7, 0x3d, 0x47, 0xe9, 0xca, 0xdf,
+ 0xe8, 0xf7, 0x65, 0xad, 0xde, 0x80, 0x98, 0x18,
+ 0xfb, 0x38, 0xfb, 0x56, 0xfb, 0x42, 0xfb, 0x27,
+ 0x3d, 0x5b, 0x8, 0xe, 0xfc, 0x41, 0x38, 0xa,
+ 0xf7, 0x1b, 0x8b, 0x3, 0xf7, 0x1b, 0x16, 0xf7,
+ 0x84, 0x6, 0x27, 0xf7, 0xee, 0xef, 0xf7, 0xee,
+ 0x5, 0xfb, 0x84, 0x6, 0x27, 0xfb, 0xee, 0x5,
+ 0xe, 0x3e, 0x8f, 0xf9, 0x3f, 0x1, 0xab, 0xf9,
+ 0x4e, 0x3, 0xb1, 0x93, 0x15, 0xa4, 0x90, 0xd6,
+ 0xa0, 0x9d, 0x95, 0xa3, 0x97, 0xd4, 0xd0, 0xed,
+ 0xf5, 0x91, 0x91, 0x9d, 0x89, 0x90, 0x85, 0xce,
+ 0x41, 0xda, 0x40, 0xa3, 0x73, 0x8, 0x64, 0xb3,
+ 0xab, 0x7e, 0xa3, 0x1b, 0x94, 0xcb, 0x95, 0x91,
+ 0x93, 0x1f, 0x8e, 0x97, 0x69, 0xa5, 0xfb, 0x42,
+ 0xf7, 0x45, 0x40, 0xe7, 0x19, 0xf7, 0x3c, 0xf7,
+ 0x4c, 0xd8, 0xf7, 0x3, 0x9f, 0xb1, 0x84, 0x99,
+ 0x18, 0x5b, 0x85, 0x38, 0x7d, 0x87, 0x83, 0x63,
+ 0x4e, 0x3f, 0x26, 0x3c, 0x39, 0x59, 0xb3, 0xfb,
+ 0x2f, 0xf7, 0x50, 0x6f, 0xc4, 0x8, 0x80, 0x6,
+ 0x7f, 0x82, 0x68, 0x5e, 0x81, 0x78, 0x84, 0x78,
+ 0x8b, 0x83, 0xa0, 0x65, 0x9d, 0x6c, 0xd9, 0x34,
+ 0xee, 0xfb, 0x2, 0x90, 0x84, 0x8b, 0x80, 0x86,
+ 0x84, 0x67, 0x5e, 0xfb, 0x4d, 0xfb, 0x5c, 0x6d,
+ 0x70, 0x8, 0xe, 0x3d, 0xa5, 0x76, 0xf9, 0x21,
+ 0x99, 0xa5, 0x77, 0x1, 0xa8, 0xf9, 0x53, 0x3,
+ 0xae, 0x94, 0x15, 0xa7, 0x8e, 0xea, 0x9a, 0xaf,
+ 0xa2, 0x9f, 0x97, 0xb2, 0xa6, 0xe0, 0xf6, 0x90,
+ 0x92, 0x9c, 0x89, 0x94, 0x82, 0xba, 0x58, 0xc1,
+ 0x4e, 0xa4, 0x74, 0x8, 0x64, 0xb6, 0xa9, 0x7e,
+ 0xa3, 0x1b, 0x97, 0xf7, 0x8, 0x94, 0x90, 0x95,
+ 0x1f, 0x8d, 0x9a, 0x66, 0xad, 0xfb, 0x32, 0xf7,
+ 0x4f, 0x49, 0xe5, 0x19, 0xe0, 0xe2, 0xf7, 0x31,
+ 0xf7, 0x4d, 0x9b, 0xb4, 0x82, 0x99, 0x18, 0x63,
+ 0x88, 0xfb, 0x13, 0x7a, 0x87, 0x84, 0x6c, 0x5a,
+ 0x42, 0x2a, 0x55, 0x55, 0x46, 0xd0, 0x2e, 0xf7,
+ 0x14, 0x6e, 0xc3, 0x8, 0x7d, 0x6, 0x73, 0x80,
+ 0x3b, 0x38, 0x83, 0x79, 0x84, 0x79, 0x8d, 0x7a,
+ 0xa0, 0x66, 0x9d, 0x6b, 0xc3, 0x47, 0xe6, 0x24,
+ 0x90, 0x85, 0x89, 0x7c, 0x86, 0x86, 0x67, 0x5d,
+ 0xfb, 0x32, 0xfb, 0x50, 0x6d, 0x70, 0x8, 0xe,
+ 0xfb, 0xa0, 0x5c, 0x76, 0xf9, 0x6d, 0x77, 0x1,
+ 0xf7, 0x50, 0xf7, 0x98, 0x3, 0xf7, 0xb4, 0xf7,
+ 0x96, 0x15, 0xfb, 0x34, 0xee, 0x9f, 0x67, 0x98,
+ 0x1b, 0x97, 0x9e, 0x98, 0x97, 0x8d, 0x1f, 0x89,
+ 0x8f, 0x88, 0x91, 0x8f, 0x1a, 0x91, 0x9b, 0x91,
+ 0x8f, 0x8f, 0x1e, 0x93, 0x7, 0x92, 0x8e, 0x8f,
+ 0x8f, 0x8e, 0x92, 0xfb, 0x1, 0xf7, 0x79, 0x18,
+ 0xe3, 0xf7, 0x13, 0xe3, 0xf3, 0x96, 0x95, 0x8,
+ 0x8f, 0x8f, 0x92, 0x91, 0x91, 0x1a, 0x92, 0x7b,
+ 0x96, 0x87, 0x95, 0x1e, 0x8d, 0x8a, 0x89, 0x91,
+ 0x88, 0x1b, 0x88, 0x85, 0x84, 0x88, 0x89, 0x1f,
+ 0x80, 0x81, 0x5, 0x90, 0x85, 0x67, 0x86, 0x85,
+ 0x1b, 0xfb, 0x31, 0xfb, 0x41, 0x3f, 0xf7, 0x2a,
+ 0x5, 0x93, 0x87, 0x88, 0x95, 0x80, 0x1b, 0x80,
+ 0x83, 0x7b, 0x81, 0x82, 0x89, 0x8, 0x8f, 0x86,
+ 0x87, 0x90, 0x84, 0x1b, 0x79, 0x7d, 0x82, 0x82,
+ 0x84, 0x1a, 0x82, 0x93, 0x7a, 0x8e, 0x83, 0x1e,
+ 0xd7, 0xfb, 0x54, 0x49, 0x3c, 0x3d, 0x25, 0x62,
+ 0x43, 0x19, 0x6c, 0x56, 0x7a, 0x73, 0x7e, 0x1a,
+ 0x88, 0x8e, 0x89, 0x8d, 0x89, 0x1e, 0x92, 0x85,
+ 0x87, 0x85, 0x89, 0x83, 0x8, 0x89, 0x85, 0x8a,
+ 0x87, 0x85, 0x1a, 0x80, 0x94, 0x80, 0x91, 0x82,
+ 0x1e, 0x81, 0x91, 0x8d, 0x81, 0x98, 0x1b, 0x99,
+ 0xa5, 0x8e, 0x94, 0x97, 0x1f, 0xe, 0xfb, 0x36,
+ 0x93, 0x76, 0xf9, 0x62, 0x77, 0x1, 0xf7, 0x5f,
+ 0xf7, 0x64, 0x3, 0xf3, 0x93, 0x15, 0x9e, 0x76,
+ 0x5, 0x98, 0x6, 0x92, 0x94, 0xf7, 0x26, 0xf7,
+ 0x58, 0xb1, 0x5a, 0xa9, 0x53, 0xb7, 0x5e, 0x19,
+ 0x8e, 0x8e, 0x89, 0x8d, 0x9b, 0xa0, 0xad, 0x90,
+ 0x1b, 0x8e, 0x93, 0x83, 0x8a, 0x8d, 0x1f, 0x88,
+ 0x8f, 0x91, 0x85, 0x90, 0x1b, 0x90, 0x93, 0x94,
+ 0x8e, 0x8e, 0x1f, 0x92, 0x91, 0x94, 0x8e, 0x87,
+ 0x95, 0x8, 0x91, 0x89, 0x96, 0x99, 0x8d, 0x1b,
+ 0x93, 0x6, 0x94, 0x97, 0xa4, 0x91, 0x8e, 0x1f,
+ 0x92, 0x97, 0x8b, 0x8a, 0x8d, 0x98, 0xfb, 0x28,
+ 0xf7, 0x4b, 0x18, 0xf7, 0x4b, 0xf7, 0x70, 0xbb,
+ 0x89, 0xb5, 0x1a, 0x7c, 0xae, 0x86, 0x92, 0x8b,
+ 0x8c, 0x84, 0x89, 0x19, 0x7f, 0x88, 0x87, 0xab,
+ 0x90, 0x1a, 0x8e, 0x8d, 0x8d, 0x8d, 0x8d, 0x1e,
+ 0x96, 0x92, 0x59, 0x92, 0x89, 0x1b, 0x7f, 0xfb,
+ 0x5b, 0xfb, 0x65, 0x70, 0x74, 0x1f, 0xfb, 0xa,
+ 0xf7, 0x45, 0x5, 0x92, 0x87, 0x83, 0x96, 0x82,
+ 0x1b, 0x7e, 0x7d, 0x80, 0x7e, 0x8c, 0x1f, 0x82,
+ 0x88, 0x81, 0x80, 0x88, 0x7d, 0x9d, 0x8c, 0x86,
+ 0x1e, 0x7d, 0x7e, 0x7e, 0x7d, 0x82, 0x7a, 0xa6,
+ 0x2f, 0xb7, 0x35, 0xb8, 0x37, 0xfb, 0x3b, 0xfb,
+ 0x5b, 0x18, 0x7e, 0x9b, 0x7b, 0x81, 0x7e, 0x7f,
+ 0x85, 0x84, 0x1a, 0x87, 0x93, 0x82, 0x8d, 0x88,
+ 0x1e, 0x92, 0x7f, 0x93, 0x7a, 0x98, 0x85, 0x8,
+ 0x8e, 0x93, 0x92, 0x90, 0x94, 0x1b, 0x8d, 0x8e,
+ 0x89, 0x88, 0x1f, 0x87, 0x88, 0x85, 0x87, 0x1a,
+ 0xe, 0x3f, 0x86, 0xb0, 0xf7, 0x7a, 0xaf, 0xdc,
+ 0xb0, 0xf7, 0x77, 0xb0, 0x1, 0xbc, 0xb0, 0xf7,
+ 0x6c, 0xae, 0xe3, 0xb0, 0xf7, 0x6b, 0xb0, 0x3,
+ 0xbc, 0xf7, 0x9a, 0x15, 0xf7, 0x91, 0xfb, 0x9f,
+ 0xf7, 0x34, 0xf7, 0x9f, 0xf7, 0x90, 0xf7, 0x2e,
+ 0xfb, 0x91, 0x6, 0x8c, 0xf7, 0x9c, 0x5, 0xfb,
+ 0x35, 0xfb, 0x9c, 0xfb, 0x90, 0x6, 0xb0, 0xfb,
+ 0xa, 0x15, 0xdc, 0xf7, 0x90, 0xf7, 0x9c, 0xe2,
+ 0xfb, 0x9c, 0xf7, 0x90, 0x3a, 0xfb, 0x90, 0xfb,
+ 0x9e, 0x33, 0xf7, 0x9e, 0x7, 0xe, 0x3c, 0xa0,
+ 0x76, 0xf7, 0x7c, 0xf7, 0x7a, 0xf7, 0x7a, 0x77,
+ 0x1, 0xf7, 0x9b, 0xf7, 0x7c, 0x3, 0xae, 0xf7,
+ 0x7c, 0x15, 0xf7, 0x78, 0xfb, 0x7c, 0xf7, 0x7c,
+ 0xf7, 0x7c, 0xf7, 0x7b, 0xf7, 0x7a, 0xfb, 0x7b,
+ 0xf7, 0x7a, 0xfb, 0x7c, 0xfb, 0x7a, 0xfb, 0x78,
+ 0x6, 0xe, 0x3b, 0xa0, 0x76, 0xf7, 0xb2, 0xf7,
+ 0xc, 0xf7, 0xb2, 0x77, 0x1, 0xf7, 0xd5, 0xf7,
+ 0x9, 0x3, 0xae, 0xf7, 0xa8, 0x15, 0xf7, 0xa8,
+ 0xfb, 0xa8, 0xf7, 0x1d, 0xf7, 0xa8, 0xf7, 0xa9,
+ 0xf7, 0x20, 0xfb, 0xa9, 0xf7, 0xa8, 0xfb, 0x1d,
+ 0xfb, 0xa8, 0xfb, 0xa8, 0x6, 0xf7, 0xa8, 0xfb,
+ 0x20, 0x15, 0xf7, 0x20, 0xf7, 0x1d, 0xfb, 0x20,
+ 0x7, 0xe, 0x36, 0xa0, 0x76, 0xf7, 0x7f, 0xf7,
+ 0x6d, 0xf7, 0x84, 0x77, 0x1, 0xf7, 0x9e, 0xf7,
+ 0x70, 0x3, 0xae, 0xf7, 0x7f, 0x15, 0xf7, 0x7b,
+ 0xfb, 0x7f, 0xf7, 0x71, 0xf7, 0x7f, 0xf7, 0x7d,
+ 0xf7, 0x6d, 0xfb, 0x7d, 0xf7, 0x84, 0xfb, 0x71,
+ 0xfb, 0x84, 0xfb, 0x7b, 0x6, 0xf7, 0x7b, 0xfb,
+ 0x6d, 0x15, 0xf7, 0x6d, 0xf7, 0x70, 0xfb, 0x6d,
+ 0x7, 0xe, 0x56, 0x7b, 0x76, 0xf7, 0xb9, 0xac,
+ 0x6a, 0xad, 0xaf, 0xa9, 0xaf, 0xae, 0xf7, 0xb6,
+ 0x77, 0x12, 0xf7, 0xcb, 0xad, 0xa2, 0xa9, 0xb8,
+ 0xaf, 0x69, 0xad, 0x13, 0xdf, 0x80, 0xf8, 0xe,
+ 0xf7, 0xc3, 0x15, 0x86, 0x53, 0x7b, 0x63, 0x7b,
+ 0x69, 0x8, 0x7a, 0x65, 0x7a, 0x6c, 0x64, 0x1a,
+ 0x6c, 0x98, 0x78, 0xa5, 0x79, 0x1e, 0x98, 0x83,
+ 0x9d, 0x81, 0x91, 0x85, 0x8, 0x89, 0x8d, 0x8f,
+ 0x83, 0x8f, 0x1b, 0x8f, 0x8f, 0x93, 0x8d, 0x8d,
+ 0x1f, 0x91, 0x91, 0x9d, 0x95, 0x98, 0x93, 0x8,
+ 0xa5, 0x9d, 0x98, 0x9e, 0xaa, 0x1a, 0xb7, 0x79,
+ 0xab, 0x79, 0xb2, 0x1e, 0x7c, 0xac, 0x7c, 0xb1,
+ 0x86, 0xbf, 0x95, 0x90, 0x93, 0x93, 0x90, 0x96,
+ 0xbe, 0x86, 0xb1, 0x7d, 0xab, 0x7c, 0x8, 0x78,
+ 0xb5, 0xab, 0x77, 0xb5, 0x1b, 0xaa, 0x9e, 0x98,
+ 0xa5, 0x9d, 0x1f, 0x93, 0x98, 0x95, 0x9d, 0x91,
+ 0x91, 0x8, 0x8d, 0x8d, 0x93, 0x8f, 0x8f, 0x1a,
+ 0x8f, 0x83, 0x8f, 0x89, 0x8d, 0x1e, 0x85, 0x91,
+ 0x81, 0x9d, 0x83, 0x98, 0x8, 0xa5, 0x79, 0x75,
+ 0x99, 0x6c, 0x1b, 0x5a, 0x6a, 0x74, 0x77, 0x5d,
+ 0x1f, 0x6e, 0x7e, 0x69, 0x80, 0x5e, 0x87, 0x87,
+ 0x94, 0x83, 0x93, 0x82, 0x8e, 0x8f, 0xbd, 0x98,
+ 0xb0, 0x99, 0xaa, 0x8, 0x9e, 0xb7, 0xa0, 0xac,
+ 0xb7, 0x1a, 0xaa, 0x7e, 0x9e, 0x71, 0x9d, 0x1e,
+ 0x7e, 0x93, 0x79, 0x95, 0x85, 0x91, 0x8, 0x8d,
+ 0x89, 0x87, 0x93, 0x87, 0x1b, 0x87, 0x87, 0x83,
+ 0x89, 0x89, 0x1f, 0x85, 0x85, 0x79, 0x81, 0x7e,
+ 0x83, 0x8, 0x71, 0x79, 0x7e, 0x78, 0x6c, 0x1a,
+ 0x5e, 0x9e, 0x6a, 0x9e, 0x62, 0x1e, 0x99, 0x6b,
+ 0x9a, 0x66, 0x8f, 0x58, 0x81, 0x87, 0x84, 0x84,
+ 0x87, 0x82, 0x53, 0x90, 0x64, 0x9b, 0x69, 0x9a,
+ 0x8, 0x9d, 0x64, 0x6c, 0x9c, 0x63, 0x1b, 0x6c,
+ 0x78, 0x7d, 0x71, 0x79, 0x1f, 0x83, 0x7e, 0x81,
+ 0x79, 0x85, 0x85, 0x8, 0x89, 0x89, 0x83, 0x87,
+ 0x87, 0x1a, 0x87, 0x93, 0x87, 0x8d, 0x89, 0x1e,
+ 0x91, 0x85, 0x95, 0x79, 0x93, 0x7e, 0x8, 0x71,
+ 0x9d, 0x9f, 0x80, 0xa9, 0x1b, 0xb5, 0xab, 0x9b,
+ 0x9c, 0xb0, 0x1f, 0xad, 0x9a, 0xb1, 0x9c, 0xc2,
+ 0x90, 0x8f, 0x81, 0x93, 0x83, 0x95, 0x86, 0x8,
+ 0x96, 0xf7, 0x7f, 0x15, 0x89, 0xa0, 0x7f, 0x96,
+ 0x80, 0x94, 0x8, 0x7f, 0x95, 0x80, 0x93, 0x9b,
+ 0x1a, 0x9c, 0x94, 0x96, 0x9b, 0x96, 0x1e, 0x92,
+ 0x8f, 0x96, 0x92, 0x8f, 0x8f, 0x8, 0x8b, 0x8f,
+ 0x93, 0x8c, 0x1e, 0x8d, 0x89, 0x8f, 0x87, 0x8c,
+ 0x8a, 0x8e, 0x87, 0x96, 0x84, 0x91, 0x86, 0x8,
+ 0x9b, 0x80, 0x92, 0x82, 0x7a, 0x1a, 0x77, 0x7b,
+ 0x83, 0x7d, 0x7d, 0x1e, 0x82, 0x82, 0x83, 0x81,
+ 0x89, 0x7a, 0x8, 0xf7, 0x59, 0xfb, 0x59, 0x15,
+ 0x8a, 0x8f, 0x9e, 0x8e, 0x96, 0x94, 0x94, 0x95,
+ 0x19, 0x98, 0x97, 0x93, 0x98, 0x9c, 0x1b, 0x9c,
+ 0x97, 0x83, 0x7b, 0x96, 0x1f, 0x8e, 0x84, 0x93,
+ 0x81, 0x8f, 0x87, 0x8c, 0x8a, 0x8f, 0x87, 0x8d,
+ 0x89, 0x8, 0x8a, 0x85, 0x88, 0x89, 0x8a, 0x1e,
+ 0x87, 0x87, 0x85, 0x7f, 0x86, 0x85, 0x8, 0x13,
+ 0xbf, 0x40, 0x7b, 0x80, 0x83, 0x84, 0x79, 0x1b,
+ 0x79, 0x83, 0x99, 0x98, 0x80, 0x1f, 0x82, 0x96,
+ 0x80, 0x95, 0x77, 0x8d, 0x8, 0xfc, 0x1f, 0x87,
+ 0x15, 0x79, 0x88, 0x81, 0x83, 0x82, 0x82, 0x8,
+ 0x7e, 0x7f, 0x83, 0x7d, 0x79, 0x1b, 0x78, 0x81,
+ 0x93, 0x9b, 0x80, 0x1f, 0x87, 0x92, 0x84, 0x96,
+ 0x87, 0x8f, 0x8, 0x8b, 0x85, 0x8e, 0x8c, 0x8d,
+ 0x1e, 0x8a, 0x8d, 0x91, 0x8e, 0x8b, 0x1a, 0x8f,
+ 0x90, 0x92, 0x95, 0x8f, 0x92, 0x8, 0x13, 0xdf,
+ 0x40, 0x9b, 0x96, 0x94, 0x92, 0x9c, 0x1b, 0x9c,
+ 0x93, 0x7e, 0x7f, 0x96, 0x1f, 0x95, 0x80, 0x97,
+ 0x80, 0xa0, 0x88, 0x8, 0xf7, 0x59, 0xfb, 0x59,
+ 0x15, 0x8f, 0x8d, 0x8e, 0x79, 0x93, 0x80, 0x94,
+ 0x82, 0x19, 0x98, 0x7e, 0x9a, 0x82, 0x8a, 0x79,
+ 0x8, 0x79, 0x83, 0x81, 0x7b, 0x80, 0x1e, 0x84,
+ 0x88, 0x80, 0x82, 0x88, 0x88, 0x8, 0x89, 0x89,
+ 0x88, 0x87, 0x8a, 0x1b, 0x8a, 0x86, 0x91, 0x8b,
+ 0x1f, 0x86, 0x8f, 0x82, 0x93, 0x83, 0x90, 0x8,
+ 0x7c, 0x95, 0x83, 0x93, 0x9c, 0x1a, 0x9d, 0x99,
+ 0x93, 0x98, 0x97, 0x1e, 0x96, 0x94, 0x95, 0x97,
+ 0x8e, 0x9e, 0x8, 0xe, 0xf7, 0x21, 0xee, 0xb3,
+ 0xef, 0xf7, 0x52, 0x42, 0x77, 0xf7, 0x58, 0xb2,
+ 0x12, 0xf9, 0x9b, 0xf7, 0xa, 0x8b, 0xbc, 0x13,
+ 0xdc, 0xf9, 0x3c, 0xf7, 0xef, 0x15, 0xb7, 0x9e,
+ 0xbd, 0xa1, 0xc2, 0x90, 0xbd, 0xa0, 0x19, 0xac,
+ 0x99, 0xa9, 0xa5, 0xb2, 0x1a, 0xbc, 0x5c, 0xa8,
+ 0x5e, 0x51, 0x67, 0x5f, 0x59, 0x78, 0x1e, 0x79,
+ 0x5d, 0x7f, 0x7a, 0x5f, 0x74, 0x8, 0xfd, 0x1c,
+ 0xf7, 0x20, 0x15, 0xf8, 0xf1, 0xfb, 0x8b, 0xc1,
+ 0x75, 0xaf, 0x7a, 0xa4, 0x52, 0x19, 0x58, 0xa1,
+ 0xb0, 0x65, 0xc6, 0x1b, 0xb9, 0xb8, 0xaa, 0xbc,
+ 0xb1, 0x6a, 0xa6, 0x6a, 0x97, 0x1f, 0x57, 0x9d,
+ 0x54, 0x93, 0x59, 0xa1, 0x55, 0xa3, 0x18, 0x76,
+ 0xc1, 0xfd, 0x8, 0xf7, 0x36, 0x5, 0x92, 0xfc,
+ 0x3a, 0x15, 0xf8, 0xb8, 0xf7, 0x33, 0x8a, 0x8c,
+ 0xfb, 0x2, 0xb7, 0xfc, 0x4b, 0xfb, 0x55, 0x5,
+ 0xf9, 0x84, 0xf7, 0xeb, 0x15, 0xab, 0xae, 0xa3,
+ 0xa9, 0xa5, 0xa6, 0x7a, 0x6e, 0x69, 0x6c, 0x74,
+ 0x6a, 0x71, 0x6f, 0x9d, 0xa8, 0x1e, 0x8e, 0xfb,
+ 0xb1, 0x15, 0xa9, 0xa4, 0x9d, 0xa7, 0xa9, 0xae,
+ 0x78, 0x6a, 0x6e, 0x77, 0x78, 0x6e, 0x6e, 0x63,
+ 0x9d, 0xad, 0x1e, 0xfc, 0xf2, 0xf7, 0xbc, 0x15,
+ 0xf8, 0x5a, 0xfb, 0x10, 0x9d, 0x5b, 0xc1, 0x74,
+ 0x7a, 0x7f, 0x7a, 0x95, 0x79, 0x93, 0x79, 0x92,
+ 0x19, 0xfc, 0x5d, 0xf7, 0x49, 0x5, 0x90, 0xfb,
+ 0xc2, 0x15, 0xf7, 0xb3, 0xf7, 0xe, 0xbd, 0x75,
+ 0xfb, 0xe4, 0x26, 0x5, 0xf8, 0x31, 0xf7, 0x31,
+ 0x15, 0x82, 0x92, 0x84, 0x94, 0x94, 0x92, 0x92,
+ 0x94, 0x1e, 0x13, 0xbc, 0x94, 0x84, 0x92, 0x82,
+ 0x82, 0x84, 0x84, 0x82, 0x1e, 0xe, 0x9e, 0xc2,
+ 0xea, 0xc2, 0x58, 0xf7, 0xa, 0xec, 0xf7, 0x2,
+ 0x5a, 0xc2, 0x54, 0xc3, 0xe9, 0xc2, 0x12, 0xd6,
+ 0xc2, 0x56, 0xc0, 0xeb, 0xc2, 0x58, 0xf7, 0x6,
+ 0xea, 0xf7, 0x8, 0x5a, 0xc3, 0x54, 0xc2, 0xe9,
+ 0xc2, 0x13, 0xd3, 0x52, 0xf7, 0x7e, 0xf7, 0x64,
+ 0x15, 0x95, 0x7a, 0x78, 0x91, 0x77, 0x1b, 0x52,
+ 0x5d, 0x5d, 0x52, 0x52, 0xb9, 0x5e, 0xc4, 0xc4,
+ 0xb9, 0xb9, 0xc4, 0x9f, 0x86, 0x9e, 0x80, 0x9b,
+ 0x1f, 0xd9, 0xd8, 0x94, 0x86, 0x94, 0x87, 0x95,
+ 0x89, 0x19, 0x13, 0xb2, 0xca, 0x98, 0x45, 0x5,
+ 0x9d, 0x6, 0x98, 0xd1, 0x96, 0x8d, 0x95, 0x8f,
+ 0x94, 0x91, 0x19, 0xd9, 0x3d, 0x5, 0x80, 0x7a,
+ 0x85, 0x78, 0x77, 0x1a, 0x53, 0xb8, 0x5d, 0xc4,
+ 0xc4, 0xb9, 0xb9, 0xc4, 0x1e, 0x13, 0xca, 0xd2,
+ 0xc3, 0x5d, 0xb9, 0x53, 0x78, 0x78, 0x85, 0x81,
+ 0x7b, 0x1e, 0x3d, 0xd9, 0x91, 0x94, 0x8e, 0x95,
+ 0x8e, 0x95, 0x19, 0xcd, 0x97, 0x5, 0x9d, 0x7,
+ 0x4b, 0x97, 0x89, 0x96, 0x87, 0x96, 0x85, 0x95,
+ 0x19, 0xd6, 0xd7, 0x5, 0x81, 0x9c, 0x9e, 0x85,
+ 0x9f, 0x1b, 0xc4, 0xb9, 0xb9, 0xc4, 0xc4, 0x5d,
+ 0xb8, 0x52, 0x1f, 0x13, 0xd2, 0xc6, 0x53, 0x5c,
+ 0x5e, 0x52, 0x78, 0x91, 0x78, 0x95, 0x7a, 0x1f,
+ 0x3e, 0x40, 0x81, 0x92, 0x81, 0x90, 0x7f, 0x8d,
+ 0x19, 0x7f, 0xc9, 0x5, 0x79, 0x6, 0x7f, 0x4c,
+ 0x80, 0x88, 0x81, 0x87, 0x81, 0x85, 0x19, 0x41,
+ 0xd6, 0x5, 0x95, 0x9b, 0x90, 0x9e, 0x9e, 0x1a,
+ 0xc4, 0x5d, 0xb9, 0x52, 0x52, 0x5e, 0x5e, 0x52,
+ 0x1e, 0x13, 0xc6, 0xa6, 0x52, 0xb8, 0x5d, 0xc4,
+ 0x9e, 0x9f, 0x91, 0x95, 0x9b, 0x1e, 0xd6, 0x3f,
+ 0x85, 0x81, 0x87, 0x80, 0x89, 0x80, 0x19, 0x48,
+ 0x7f, 0x5, 0x79, 0x7, 0xd0, 0x7e, 0x8e, 0x81,
+ 0x8e, 0x82, 0x91, 0x82, 0x19, 0xf7, 0x8f, 0xf7,
+ 0x9e, 0x15, 0xa6, 0x9f, 0x9f, 0xa6, 0xa6, 0x9f,
+ 0x77, 0x70, 0x70, 0x77, 0x77, 0x70, 0x70, 0x77,
+ 0x9f, 0xa6, 0x1e, 0xfb, 0x6e, 0xfb, 0x68, 0x15,
+ 0x13, 0xb2, 0xb2, 0xa5, 0xa0, 0xa1, 0xa5, 0xa5,
+ 0xa1, 0x75, 0x71, 0x71, 0x75, 0x74, 0x71, 0x71,
+ 0x76, 0xa3, 0xa4, 0x1e, 0xf7, 0x6d, 0xfb, 0x6f,
+ 0x15, 0x13, 0xca, 0xd2, 0xa5, 0xa1, 0xa1, 0xa5,
+ 0xa5, 0xa0, 0x75, 0x71, 0x71, 0x76, 0x76, 0x71,
+ 0x71, 0x75, 0xa0, 0xa5, 0x1e, 0xfc, 0x43, 0xf8,
+ 0x43, 0x15, 0xa5, 0xa1, 0xa0, 0x69, 0xa, 0xa1,
+ 0xa5, 0x1e, 0xfc, 0x43, 0x4, 0xa5, 0xa1, 0xa1,
+ 0x69, 0xa, 0xa0, 0xa5, 0x1e, 0xe, 0x9f, 0xf7,
+ 0x18, 0xfb, 0x4, 0x76, 0xf7, 0x77, 0xc8, 0x6c,
+ 0xf7, 0x15, 0x69, 0xd0, 0x48, 0xce, 0xea, 0xf7,
+ 0x10, 0xfb, 0x10, 0xf7, 0x11, 0x12, 0xd5, 0xf7,
+ 0x13, 0xfb, 0x12, 0xf7, 0x12, 0xea, 0xcd, 0x49,
+ 0xce, 0x6a, 0xf7, 0x14, 0x6b, 0xcb, 0x4d, 0xc9,
+ 0xea, 0xf7, 0x15, 0xfb, 0x15, 0xf7, 0x16, 0x13,
+ 0xa5, 0xa2, 0x80, 0xf7, 0xc4, 0xf7, 0xaa, 0x15,
+ 0x9e, 0x72, 0x6d, 0x95, 0x6c, 0x1b, 0x3c, 0x4a,
+ 0x4b, 0x3c, 0x3c, 0xcc, 0x4a, 0xda, 0xda, 0xcc,
+ 0xc9, 0xdb, 0xaa, 0x80, 0xaa, 0x79, 0xa4, 0x1f,
+ 0x13, 0x51, 0x55, 0x0, 0x9f, 0x9a, 0xa1, 0x92,
+ 0xa3, 0x1b, 0xa6, 0x9c, 0x83, 0x78, 0x9d, 0x1f,
+ 0x78, 0x72, 0x80, 0x6c, 0x6c, 0x1a, 0x3c, 0xce,
+ 0x4b, 0xd9, 0xda, 0xcb, 0xcb, 0xda, 0xda, 0x4a,
+ 0xcc, 0x3c, 0x6d, 0x6d, 0x81, 0x79, 0x73, 0x1e,
+ 0x13, 0xaa, 0x48, 0x80, 0x76, 0x9e, 0x84, 0x99,
+ 0xa8, 0x1a, 0xa4, 0x94, 0x9d, 0x9d, 0x9d, 0x1e,
+ 0x78, 0xa4, 0xaa, 0x80, 0xaa, 0x1b, 0xda, 0xcb,
+ 0xce, 0xd9, 0xda, 0x4b, 0xcb, 0x3c, 0x1f, 0x13,
+ 0x91, 0x52, 0x80, 0x3c, 0x4a, 0x49, 0x3c, 0x6d,
+ 0x95, 0x6d, 0x9d, 0x73, 0x1f, 0x78, 0x79, 0x7a,
+ 0x85, 0x71, 0x1b, 0x73, 0x77, 0x91, 0x9e, 0x7a,
+ 0x1f, 0x9d, 0xa4, 0x96, 0xa9, 0xaa, 0x1a, 0xda,
+ 0x4a, 0xcc, 0x3c, 0x3c, 0x4a, 0x4b, 0x3c, 0x1e,
+ 0x13, 0xa5, 0x48, 0x80, 0x3c, 0xcd, 0x4a, 0xda,
+ 0xa9, 0xa9, 0x95, 0x9d, 0xa3, 0x1e, 0x9d, 0x79,
+ 0x93, 0x7b, 0x71, 0x1a, 0x6f, 0x85, 0x7c, 0x77,
+ 0x77, 0x1e, 0x13, 0xa5, 0x52, 0x80, 0xf7, 0x4e,
+ 0xf7, 0x65, 0x42, 0xa, 0xfb, 0xb5, 0xf7, 0xb4,
+ 0x42, 0xa, 0xe, 0x5a, 0x8b, 0xf7, 0xc, 0x6d,
+ 0xf6, 0x22, 0xa7, 0xbf, 0x93, 0x83, 0x95, 0xb2,
+ 0xe8, 0x30, 0xe9, 0x66, 0xf7, 0xb, 0x39, 0xbd,
+ 0x63, 0xa4, 0x72, 0xf7, 0x17, 0x2f, 0xac, 0x6c,
+ 0xe5, 0xa3, 0xa7, 0x6f, 0xf6, 0x31, 0x96, 0xc0,
+ 0xa3, 0xe7, 0x77, 0x12, 0xf7, 0x24, 0xab, 0x6e,
+ 0xf4, 0x71, 0x95, 0xb4, 0xe8, 0x30, 0xf7, 0x20,
+ 0x38, 0xae, 0x68, 0xf7, 0xb, 0x35, 0xbd, 0x59,
+ 0xf7, 0x26, 0xfb, 0x18, 0xa4, 0x97, 0xe7, 0xa5,
+ 0xf5, 0x2f, 0x98, 0xbe, 0xa9, 0x7e, 0xa, 0xf8,
+ 0x4d, 0xf8, 0x14, 0x79, 0xa, 0x93, 0x9c, 0x86,
+ 0x90, 0x86, 0x92, 0x78, 0x81, 0x7c, 0x7b, 0x7b,
+ 0x7a, 0x83, 0x7a, 0x90, 0x86, 0x8, 0x9e, 0xfb,
+ 0x14, 0x78, 0xa, 0x83, 0x9c, 0x7b, 0x9c, 0x7c,
+ 0x9b, 0x78, 0x94, 0x86, 0x86, 0x86, 0x85, 0x93,
+ 0x7a, 0x9b, 0x7b, 0x8, 0xfb, 0x28, 0xf7, 0x28,
+ 0x78, 0xa, 0x82, 0x9c, 0x7b, 0x9c, 0x7c, 0x9b,
+ 0x78, 0x95, 0x86, 0x84, 0x86, 0x86, 0x94, 0x7a,
+ 0x9b, 0x7b, 0x8, 0xd2, 0xfb, 0x74, 0x15, 0x13,
+ 0x44, 0x54, 0xea, 0xb, 0x94, 0x7f, 0x78, 0x93,
+ 0x7d, 0x1b, 0x6a, 0x71, 0x74, 0x6c, 0x70, 0x9f,
+ 0x71, 0xab, 0x1f, 0x13, 0x34, 0x54, 0xe8, 0x83,
+ 0x90, 0x91, 0x8c, 0x8c, 0x90, 0x1f, 0x8c, 0x8d,
+ 0x8b, 0x8c, 0x1b, 0x87, 0x85, 0x80, 0x80, 0x77,
+ 0x1a, 0x13, 0x94, 0x54, 0xe8, 0x83, 0x6d, 0xa6,
+ 0x72, 0xab, 0xac, 0xa6, 0xa4, 0xa9, 0xa0, 0x83,
+ 0x92, 0x87, 0x93, 0x1e, 0x93, 0x89, 0x5, 0x89,
+ 0x93, 0x92, 0x8b, 0x92, 0x1b, 0x13, 0x44, 0x54,
+ 0xe8, 0x23, 0xa7, 0x99, 0xa7, 0xa8, 0x1f, 0x13,
+ 0x44, 0x54, 0xe8, 0x83, 0xaa, 0x70, 0xa1, 0x6a,
+ 0x1e, 0x13, 0x8a, 0x24, 0xec, 0x1c, 0x7d, 0x74,
+ 0x85, 0x82, 0x81, 0x1f, 0x8c, 0xb5, 0x89, 0xc7,
+ 0xa1, 0xa1, 0xa4, 0xa4, 0xc4, 0x8b, 0xb7, 0x87,
+ 0x8, 0x81, 0x81, 0x84, 0x76, 0x7d, 0x1a, 0x6a,
+ 0xa3, 0x71, 0xaa, 0xa4, 0xa5, 0xa0, 0xa8, 0x91,
+ 0x8a, 0x91, 0x8a, 0x91, 0x1e, 0x8c, 0x8b, 0x8e,
+ 0x8c, 0x1a, 0x13, 0x91, 0x4, 0xec, 0x1b, 0x87,
+ 0x93, 0x95, 0x7f, 0x9d, 0x1b, 0xaa, 0xa4, 0xa7,
+ 0xab, 0xac, 0x72, 0xa5, 0x6c, 0x77, 0x86, 0x83,
+ 0x87, 0x83, 0x1f, 0x8c, 0x94, 0x5, 0x8c, 0x90,
+ 0x8b, 0x90, 0x90, 0x1a, 0x13, 0x94, 0x24, 0xec,
+ 0x1c, 0xac, 0x73, 0x99, 0x6a, 0x6d, 0x75, 0x72,
+ 0x6a, 0x1e, 0x13, 0x94, 0x51, 0xec, 0x1b, 0x7b,
+ 0x90, 0x77, 0x94, 0x7f, 0x1e, 0x54, 0x8a, 0x5e,
+ 0x8b, 0x74, 0xa2, 0x71, 0xa5, 0x91, 0xc8, 0x8a,
+ 0xb1, 0x8, 0x13, 0x94, 0x52, 0x6c, 0x1b, 0x82,
+ 0x95, 0xa0, 0x83, 0x98, 0x1b, 0xac, 0xa6, 0xa2,
+ 0xaa, 0xa6, 0x76, 0xa5, 0x6c, 0x1f, 0x13, 0x94,
+ 0x54, 0xe9, 0x1b, 0x86, 0x86, 0x8a, 0x8a, 0x85,
+ 0x1f, 0x88, 0x8a, 0x8b, 0x8a, 0x1b, 0x8f, 0x92,
+ 0x96, 0x96, 0x9e, 0x1a, 0xa9, 0x71, 0xa4, 0x6a,
+ 0x6b, 0x70, 0x72, 0x6d, 0x76, 0x92, 0x84, 0x8f,
+ 0x83, 0x1e, 0x83, 0x8d, 0x5, 0x8d, 0x84, 0x85,
+ 0x8b, 0x86, 0x1b, 0x7e, 0xa, 0x6d, 0x7d, 0x70,
+ 0x6d, 0x6c, 0xa4, 0x75, 0xac, 0x9b, 0x9f, 0x91,
+ 0x94, 0x97, 0x1f, 0x8a, 0x69, 0x92, 0x4e, 0x6f,
+ 0x6f, 0x7a, 0x7a, 0x45, 0x85, 0x65, 0x8c, 0x8,
+ 0x13, 0x91, 0x4, 0xd4, 0x1b, 0x94, 0x97, 0x92,
+ 0x9e, 0x99, 0x1a, 0xac, 0x74, 0xa5, 0x6d, 0x72,
+ 0x70, 0x79, 0x6f, 0x84, 0x8a, 0x84, 0x8d, 0x83,
+ 0x1e, 0x8a, 0x8b, 0x8a, 0x88, 0x1a, 0x8f, 0x83,
+ 0x83, 0x97, 0x77, 0x1b, 0x6c, 0x72, 0x70, 0x6a,
+ 0x6a, 0xa4, 0x71, 0xaa, 0xa0, 0x91, 0x93, 0x8f,
+ 0x91, 0x1f, 0x7e, 0xa, 0x8a, 0x82, 0x5, 0x8a,
+ 0x86, 0x8b, 0x87, 0x87, 0x1a, 0x69, 0xa2, 0x7c,
+ 0xad, 0x1e, 0x13, 0x92, 0x54, 0xd4, 0x1b, 0xaa,
+ 0xa0, 0xa4, 0xac, 0x9b, 0x86, 0x9f, 0x82, 0x97,
+ 0x1f, 0xb3, 0x8e, 0xc4, 0x8d, 0xa5, 0x71, 0x8,
+ 0xa4, 0x72, 0x88, 0x49, 0x68, 0x1a, 0x30, 0xc3,
+ 0x79, 0xa, 0x94, 0x9c, 0x86, 0x91, 0x86, 0x90,
+ 0x78, 0x82, 0x7c, 0x7b, 0x7b, 0x7a, 0x82, 0x7a,
+ 0x90, 0x86, 0x8, 0xf7, 0xa5, 0xf5, 0x50, 0xa,
+ 0x1e, 0x13, 0x94, 0x8c, 0xe8, 0x4b, 0x51, 0xa,
+ 0xfb, 0x58, 0xf7, 0x56, 0x44, 0xa, 0xfb, 0x56,
+ 0xfb, 0x58, 0x44, 0xa, 0xf7, 0x59, 0xfb, 0x56,
+ 0x44, 0xa, 0xe, 0x5d, 0x9b, 0x76, 0xf7, 0xd1,
+ 0xc3, 0xf7, 0xd1, 0x77, 0x1, 0xf8, 0x6, 0xbf,
+ 0x3, 0xf7, 0x94, 0xf7, 0x57, 0x15, 0xf7, 0x20,
+ 0xfb, 0x5c, 0xf7, 0x20, 0xf7, 0x5c, 0xf7, 0x6f,
+ 0xf7, 0x25, 0xfb, 0x6f, 0xf7, 0x25, 0xfb, 0x20,
+ 0xf7, 0x5c, 0xfb, 0x20, 0xfb, 0x5c, 0xfb, 0x6f,
+ 0xfb, 0x25, 0x5, 0xf8, 0x15, 0xad, 0x15, 0xa3,
+ 0xc2, 0xc8, 0xa4, 0x90, 0x8f, 0x88, 0x86, 0x72,
+ 0x4f, 0x51, 0x73, 0x87, 0x8a, 0x8d, 0x8f, 0x1e,
+ 0x52, 0x85, 0x15, 0x73, 0x4f, 0xc5, 0xa4, 0x90,
+ 0x8f, 0x8e, 0x90, 0xa4, 0xc2, 0x4e, 0x73, 0x87,
+ 0x8a, 0x89, 0x87, 0x1f, 0xc4, 0x4d, 0x15, 0x8f,
+ 0x8c, 0x8d, 0x8f, 0xa3, 0xc7, 0x51, 0x72, 0x86,
+ 0x87, 0x88, 0x86, 0x72, 0x54, 0xc8, 0xa3, 0x1e,
+ 0xfb, 0x21, 0x3e, 0x15, 0xa4, 0xc7, 0xc5, 0xa3,
+ 0x8f, 0x8c, 0x89, 0x87, 0x73, 0x54, 0x4e, 0x72,
+ 0x86, 0x87, 0x8e, 0x90, 0x1e, 0xe, 0x5e, 0x78,
+ 0xf9, 0x54, 0x1, 0xb1, 0xf9, 0x62, 0x3, 0xf7,
+ 0x99, 0xf7, 0x58, 0x15, 0xf7, 0x1c, 0xfb, 0x6b,
+ 0xf7, 0x27, 0xf7, 0x73, 0xf7, 0x68, 0xf7, 0x1c,
+ 0xfb, 0x6e, 0xf7, 0x22, 0xfb, 0x21, 0xf7, 0x5f,
+ 0xfb, 0x1e, 0xfb, 0x5f, 0xfb, 0x71, 0xfb, 0x22,
+ 0x5, 0xf7, 0x7e, 0xfb, 0x1a, 0x15, 0x9e, 0xca,
+ 0xfb, 0x36, 0xbc, 0x92, 0x9d, 0x83, 0x9d, 0xf7,
+ 0x33, 0xc7, 0x79, 0xc6, 0xc4, 0x78, 0xbc, 0xf7,
+ 0x37, 0xa1, 0x7e, 0xa0, 0x99, 0xbf, 0xfb, 0x33,
+ 0xc8, 0x9a, 0x79, 0x52, 0xf7, 0x35, 0x55, 0x84,
+ 0x78, 0x95, 0x7a, 0xfb, 0x33, 0x55, 0x9e, 0x4d,
+ 0x4f, 0xa1, 0x4f, 0xfb, 0x37, 0x77, 0x93, 0x79,
+ 0x82, 0x5c, 0xf7, 0x32, 0x5, 0xe, 0x74, 0x3a,
+ 0xa, 0xf7, 0xd6, 0xf7, 0x78, 0x3, 0xf7, 0x45,
+ 0x7d, 0x15, 0xf7, 0x7b, 0xf7, 0x3d, 0xf7, 0x7c,
+ 0xfb, 0x3d, 0x31, 0xf7, 0xa9, 0xf7, 0x7c, 0xf7,
+ 0x41, 0x5, 0xfb, 0xb5, 0x6, 0x36, 0xf7, 0xa1,
+ 0x35, 0xfb, 0xa1, 0x5, 0xfb, 0xb3, 0x6, 0xf7,
+ 0x7e, 0xfb, 0x41, 0x5, 0xe, 0x7b, 0x92, 0x76,
+ 0xf8, 0x4c, 0xa6, 0xf7, 0x90, 0x54, 0xa, 0xf9,
+ 0x84, 0x3, 0xf7, 0x46, 0x7d, 0x15, 0xf7, 0x7d,
+ 0xf7, 0x2d, 0xf7, 0x7d, 0xfb, 0x2d, 0x45, 0xf7,
+ 0xa3, 0xf7, 0x69, 0xf7, 0x4f, 0xfb, 0xa8, 0x9e,
+ 0x27, 0xf7, 0x86, 0x27, 0xfb, 0x86, 0xfb, 0xa8,
+ 0x78, 0xf7, 0x60, 0xfb, 0x4f, 0x5, 0x63, 0xfb,
+ 0x86, 0x15, 0xe6, 0xf7, 0x8e, 0xfb, 0x71, 0xf7,
+ 0x3b, 0xf7, 0xa1, 0x80, 0xd4, 0xf7, 0x90, 0xd4,
+ 0xfb, 0x90, 0xf7, 0xa1, 0x96, 0xfb, 0x78, 0xfb,
+ 0x3b, 0xec, 0xfb, 0x8e, 0xfb, 0x67, 0xf7, 0x44,
+ 0x5, 0xe, 0x59, 0x92, 0x76, 0xf9, 0x45, 0xa9,
+ 0x8b, 0x54, 0xa, 0xb9, 0xf9, 0xd, 0xb3, 0x3,
+ 0xae, 0xf7, 0xec, 0x15, 0xfb, 0x5b, 0xf7, 0x37,
+ 0xfb, 0x33, 0xf7, 0x59, 0xf7, 0x5b, 0xf7, 0x34,
+ 0xf7, 0x36, 0xf7, 0x5a, 0xf7, 0x5a, 0xfb, 0x34,
+ 0xf7, 0x35, 0xfb, 0x5a, 0xfb, 0x5d, 0xfb, 0x34,
+ 0xfb, 0x35, 0xfb, 0x5c, 0x1e, 0xf7, 0x32, 0xfb,
+ 0xa3, 0x15, 0xda, 0xf7, 0x7e, 0xfb, 0x53, 0xf7,
+ 0x24, 0x5, 0xf7, 0x84, 0x6, 0xd6, 0xf7, 0x74,
+ 0xd7, 0xfb, 0x74, 0x5, 0xf7, 0x86, 0x6, 0xfb,
+ 0x59, 0xfb, 0x24, 0xd4, 0xfb, 0x7e, 0xfb, 0x56,
+ 0xf7, 0x25, 0x5, 0xe, 0x8d, 0x92, 0x76, 0xf7,
+ 0x53, 0xad, 0x8b, 0xf7, 0x4f, 0xf7, 0xc7, 0x77,
+ 0x1, 0xf7, 0xb1, 0xac, 0x8b, 0xf7, 0x50, 0x8b,
+ 0xaf, 0x3, 0xf7, 0x49, 0x7d, 0x15, 0xf7, 0x7e,
+ 0xf7, 0x53, 0xf7, 0x84, 0xfb, 0x53, 0xfb, 0x5,
+ 0xf7, 0xb0, 0xf7, 0x9d, 0xf7, 0x26, 0xfb, 0xcc,
+ 0x89, 0x36, 0xf7, 0xb7, 0x3b, 0xfb, 0xb7, 0xfb,
+ 0xbb, 0x8d, 0xf7, 0x8e, 0xfb, 0x26, 0x5, 0xac,
+ 0xb3, 0x15, 0xbf, 0xb6, 0xaf, 0xbf, 0xbd, 0xb6,
+ 0x66, 0x58, 0x59, 0x63, 0x5a, 0x56, 0x58, 0x5f,
+ 0xb9, 0xc0, 0x1e, 0xe, 0x7b, 0xb2, 0x76, 0xf7,
+ 0x7b, 0xf7, 0x4a, 0x86, 0xb0, 0xf7, 0xa7, 0x77,
+ 0x12, 0xf7, 0xd4, 0xf7, 0x4a, 0x13, 0xb8, 0xf7,
+ 0x45, 0x35, 0xa, 0xec, 0x15, 0x13, 0xd8, 0x59,
+ 0xb4, 0x62, 0xbd, 0xbd, 0xb4, 0xb4, 0xbd, 0xbd,
+ 0x62, 0xb4, 0x59, 0x59, 0x62, 0x62, 0x59, 0x1e,
+ 0xe, 0xfb, 0xc, 0xc6, 0xa8, 0xf7, 0x5c, 0xc7,
+ 0x9e, 0xe1, 0xb3, 0xaf, 0x75, 0x77, 0xf7, 0x39,
+ 0x77, 0x12, 0xf8, 0xae, 0xa2, 0xce, 0xa5, 0x13,
+ 0xef, 0xf8, 0xae, 0xf8, 0x6a, 0x15, 0x90, 0x8d,
+ 0x97, 0x90, 0x8e, 0x8f, 0x8f, 0x9a, 0x8b, 0xa1,
+ 0x8a, 0x9c, 0x7b, 0x7b, 0x73, 0x82, 0x7e, 0x88,
+ 0x8, 0x8b, 0x9f, 0x71, 0x95, 0x80, 0x1e, 0xfc,
+ 0xc, 0x97, 0x15, 0x97, 0x96, 0xd0, 0xb5, 0xdb,
+ 0xaf, 0xbb, 0xa1, 0xc7, 0xa2, 0xa6, 0x94, 0x8,
+ 0x9c, 0x91, 0x94, 0x8d, 0x90, 0x1a, 0x94, 0x52,
+ 0x90, 0x7e, 0x7e, 0x4d, 0x73, 0x68, 0x3b, 0x1e,
+ 0x3b, 0x68, 0x34, 0x5f, 0x7f, 0x1a, 0x80, 0xa4,
+ 0x83, 0x99, 0x85, 0x1e, 0x99, 0x85, 0x92, 0x8d,
+ 0x95, 0x94, 0x8, 0xfb, 0xe, 0x4c, 0x15, 0x75,
+ 0x95, 0xaf, 0x6d, 0xaf, 0x1b, 0xaf, 0xbd, 0xaf,
+ 0x96, 0x93, 0x1f, 0x91, 0x98, 0x95, 0xa2, 0x9e,
+ 0x99, 0x9e, 0x98, 0xb2, 0xa1, 0xab, 0x9b, 0xa2,
+ 0x97, 0xb3, 0x9f, 0xb1, 0x8c, 0x9c, 0x8c, 0xa1,
+ 0x85, 0x9c, 0x78, 0xa2, 0x91, 0xb0, 0x9c, 0x8a,
+ 0x95, 0x8, 0xa3, 0x8a, 0x6f, 0xbd, 0x7e, 0x1b,
+ 0x82, 0x26, 0x66, 0x6a, 0x42, 0x1f, 0x42, 0x6a,
+ 0x47, 0x5c, 0x83, 0x86, 0x8, 0x86, 0x83, 0x7b,
+ 0x79, 0x81, 0x1b, 0x81, 0x79, 0x94, 0x90, 0x7e,
+ 0x1f, 0x83, 0x8e, 0x79, 0x97, 0x83, 0x95, 0x7e,
+ 0x7f, 0x81, 0x7d, 0x80, 0x5c, 0x8, 0xf7, 0xf,
+ 0xfb, 0x29, 0x15, 0x8b, 0xf7, 0x7c, 0xfb, 0x4d,
+ 0x97, 0x81, 0x1e, 0x81, 0x97, 0x9a, 0x85, 0x92,
+ 0x1b, 0x92, 0x90, 0x8e, 0x92, 0x96, 0x1f, 0x96,
+ 0x92, 0xf7, 0x2c, 0xf4, 0x96, 0x94, 0x8, 0x96,
+ 0x94, 0x8f, 0x9d, 0x98, 0x98, 0x8c, 0x94, 0x9d,
+ 0x1a, 0x9d, 0x86, 0x9b, 0x7a, 0xa3, 0x1e, 0x7a,
+ 0xa3, 0x29, 0xf7, 0x9, 0x80, 0x98, 0x83, 0x95,
+ 0x7f, 0xa0, 0x7a, 0x94, 0x8, 0x13, 0xf7, 0x83,
+ 0x8f, 0x82, 0x8f, 0x7d, 0x8a, 0x77, 0x8a, 0x66,
+ 0x7e, 0x6d, 0x7b, 0x78, 0x81, 0x61, 0x77, 0x72,
+ 0x78, 0x77, 0x7b, 0x84, 0x72, 0x88, 0x74, 0x84,
+ 0x54, 0x87, 0x79, 0x84, 0x83, 0x80, 0x7e, 0x73,
+ 0x7d, 0x78, 0x87, 0x8, 0xfb, 0x15, 0xf7, 0x11,
+ 0x15, 0x8c, 0x7a, 0x8d, 0x6b, 0x90, 0x75, 0x8,
+ 0x77, 0x97, 0xb3, 0x77, 0xa9, 0x1b, 0xa9, 0xa8,
+ 0x94, 0x9e, 0x9e, 0x1f, 0x92, 0xa1, 0x8f, 0xa9,
+ 0x8e, 0xa2, 0x8, 0x80, 0x81, 0x67, 0x6b, 0x5d,
+ 0x1b, 0x5d, 0x6c, 0xaf, 0x9a, 0x7e, 0x1f, 0xf8,
+ 0x44, 0x8e, 0x15, 0x76, 0xa2, 0xae, 0xa0, 0x9f,
+ 0x74, 0x5, 0x87, 0x54, 0x15, 0x79, 0xa0, 0xac,
+ 0xa0, 0x9c, 0x76, 0x5, 0x88, 0x55, 0x15, 0x79,
+ 0x9e, 0xaa, 0xa1, 0x9d, 0x77, 0x5, 0x53, 0x4,
+ 0x77, 0xa2, 0xa9, 0xa0, 0x9f, 0x77, 0x5, 0xfb,
+ 0x40, 0xb9, 0x15, 0x75, 0xa2, 0xaf, 0xa3, 0xa1,
+ 0x73, 0x5, 0x86, 0x51, 0x15, 0x77, 0xa0, 0xae,
+ 0xa3, 0xa0, 0x75, 0x5, 0x86, 0x50, 0x15, 0x78,
+ 0x9f, 0xaf, 0xa4, 0x9d, 0x78, 0x5, 0x86, 0x50,
+ 0x15, 0x76, 0xa3, 0xad, 0xa4, 0xa0, 0x73, 0x5,
+ 0xfb, 0x91, 0xf1, 0x15, 0x97, 0x93, 0xf7, 0x17,
+ 0xd9, 0x94, 0x90, 0x8, 0x90, 0x94, 0x94, 0x8f,
+ 0x92, 0x1b, 0x92, 0x8c, 0x88, 0x86, 0x86, 0x84,
+ 0x88, 0x7e, 0x83, 0x1f, 0x6e, 0x7a, 0x22, 0x4d,
+ 0x81, 0x85, 0x8, 0x84, 0x80, 0x7e, 0x7e, 0x80,
+ 0x1b, 0x85, 0x88, 0x8b, 0x91, 0x93, 0x90, 0x8e,
+ 0x9d, 0x97, 0x1f, 0xd7, 0x58, 0x15, 0x78, 0xa2,
+ 0xab, 0x9f, 0x9f, 0x74, 0x5, 0x8e, 0x51, 0x15,
+ 0x76, 0xa2, 0xa8, 0xa0, 0xa1, 0x74, 0x5, 0x8c,
+ 0x53, 0x15, 0x79, 0xa0, 0xa8, 0x9e, 0x9d, 0x78,
+ 0x5, 0x8a, 0x54, 0x15, 0x77, 0xa2, 0xa9, 0xa1,
+ 0xa1, 0x72, 0x5, 0x42, 0x48, 0x15, 0x83, 0x95,
+ 0x2f, 0xf4, 0x7c, 0x9c, 0x7c, 0x9c, 0x8c, 0x94,
+ 0x8f, 0x8e, 0x90, 0x8f, 0x9c, 0x7c, 0x93, 0x82,
+ 0x95, 0x80, 0xe6, 0x20, 0x92, 0x84, 0x8, 0x84,
+ 0x92, 0x93, 0x87, 0x8f, 0x1b, 0x8f, 0x95, 0x91,
+ 0x90, 0x92, 0x1f, 0x92, 0x90, 0xf7, 0x6, 0xd8,
+ 0x92, 0x90, 0x8, 0x90, 0x92, 0x94, 0x92, 0x8f,
+ 0x1b, 0x8f, 0x91, 0x88, 0x86, 0x86, 0x82, 0x84,
+ 0x82, 0x86, 0x1f, 0x82, 0x86, 0xfb, 0x16, 0x33,
+ 0x84, 0x86, 0x84, 0x86, 0x89, 0x89, 0x89, 0x85,
+ 0x89, 0x85, 0x8c, 0x70, 0x8a, 0x82, 0x8, 0x78,
+ 0x88, 0x8b, 0x79, 0x86, 0x1b, 0x86, 0x88, 0x95,
+ 0x9b, 0x93, 0x88, 0x9e, 0x8a, 0x9d, 0x1f, 0x8a,
+ 0x95, 0x86, 0x94, 0x83, 0x95, 0x8, 0xe, 0x85,
+ 0xb2, 0x76, 0xf8, 0x2, 0xb5, 0x8b, 0xb0, 0xf7,
+ 0xa7, 0x77, 0x1, 0xf7, 0x4a, 0x35, 0xa, 0x6e,
+ 0x15, 0xe6, 0xd7, 0xe6, 0x3f, 0x5f, 0xf7, 0x3,
+ 0xf0, 0xca, 0xfb, 0xb, 0x83, 0x6e, 0xf7, 0x7,
+ 0x6e, 0xfb, 0x7, 0xfb, 0xb, 0x93, 0xf0, 0x4c,
+ 0x5, 0xe, 0x74, 0xb2, 0x76, 0xf7, 0x75, 0xa9,
+ 0xf7, 0x19, 0xa5, 0x85, 0xb0, 0xf7, 0xa7, 0x77,
+ 0x12, 0x13, 0xe8, 0xf7, 0x42, 0x4f, 0xa, 0x5,
+ 0x13, 0xd8, 0x32, 0xa, 0xfb, 0x10, 0x42, 0x15,
+ 0xf7, 0x10, 0xf2, 0xf7, 0x10, 0x24, 0x4f, 0xf7,
+ 0x29, 0xf7, 0x1c, 0xe1, 0xfb, 0x34, 0x81, 0x63,
+ 0xf7, 0x30, 0x63, 0xfb, 0x30, 0xfb, 0x34, 0x95,
+ 0xf7, 0x1c, 0x35, 0x5, 0xe, 0x83, 0x92, 0x76,
+ 0xf8, 0x3f, 0xa0, 0xf7, 0xa3, 0x77, 0x1, 0xf8,
+ 0x38, 0xd9, 0x3, 0xf7, 0x3f, 0x7d, 0x15, 0xf7,
+ 0x8d, 0xf7, 0x44, 0xf7, 0x95, 0xfb, 0x44, 0x25,
+ 0xf7, 0xae, 0xf7, 0x71, 0xf7, 0x3a, 0x5, 0xfb,
+ 0xad, 0x6, 0x2c, 0xf7, 0xa3, 0x2a, 0xfb, 0xa3,
+ 0x5, 0xfb, 0xb4, 0x6, 0xf7, 0x7d, 0xfb, 0x3a,
+ 0x5, 0xf7, 0x2c, 0xba, 0x15, 0x38, 0xed, 0xde,
+ 0xf7, 0x8d, 0x5, 0xfb, 0xef, 0x4, 0xd9, 0xed,
+ 0x5, 0xf7, 0x92, 0x6, 0xfc, 0x61, 0xfb, 0x1f,
+ 0x15, 0xfb, 0x69, 0xf7, 0x24, 0xf7, 0xea, 0x24,
+ 0x5, 0x8b, 0x4, 0xf7, 0x19, 0x62, 0xf2, 0xfb,
+ 0x9f, 0x5, 0xfc, 0x61, 0x95, 0x15, 0xf7, 0x75,
+ 0xf7, 0xbd, 0x5, 0xfb, 0x16, 0x7, 0xe, 0xdf,
+ 0x92, 0x76, 0xf8, 0x47, 0xa0, 0xf7, 0x9b, 0x77,
+ 0x1, 0xf7, 0xd3, 0xf7, 0xed, 0x3, 0xf7, 0x43,
+ 0x92, 0x15, 0xf7, 0xd, 0x76, 0xf7, 0x47, 0xf7,
+ 0x17, 0xf7, 0x35, 0xfb, 0x12, 0xf7, 0xf, 0x86,
+ 0x2c, 0xf7, 0xa9, 0xf7, 0x74, 0xf7, 0x32, 0x4e,
+ 0xa0, 0x5, 0xfb, 0x73, 0x6, 0x37, 0xf7, 0x89,
+ 0xfb, 0x4, 0x9d, 0x32, 0xfb, 0x9b, 0x5, 0xfb,
+ 0xb0, 0x6, 0xf7, 0x76, 0xfb, 0x41, 0x5, 0x55,
+ 0xfb, 0x7c, 0x15, 0xdb, 0xf7, 0x86, 0xfb, 0x53,
+ 0xf7, 0x22, 0x5, 0xf7, 0x84, 0x6, 0xdc, 0xf7,
+ 0x8b, 0xdd, 0xfb, 0x8b, 0x5, 0xf7, 0x8c, 0x6,
+ 0xfb, 0x5f, 0xfb, 0x22, 0xda, 0xfb, 0x91, 0xfb,
+ 0x62, 0xf7, 0x38, 0x5, 0xe, 0x2c, 0x9d, 0x76,
+ 0xf9, 0x4b, 0x77, 0x1, 0xbf, 0xf9, 0x14, 0x3,
+ 0xd2, 0xf7, 0x3, 0x15, 0xf7, 0x82, 0xf7, 0x9,
+ 0xf7, 0x2d, 0xfb, 0x7b, 0xa0, 0x98, 0x68, 0xf7,
+ 0xa0, 0xf7, 0x88, 0xd6, 0x5, 0xa3, 0x7, 0xfb,
+ 0x8c, 0xb3, 0xa2, 0xf7, 0x9e, 0x70, 0x94, 0xfb,
+ 0x1e, 0xfb, 0x86, 0xfb, 0x7f, 0xf7, 0x14, 0x7c,
+ 0x76, 0xf7, 0x38, 0xfb, 0x71, 0xfb, 0x36, 0xfb,
+ 0x5d, 0x5, 0xe, 0xfb, 0x8, 0x9a, 0x76, 0xf7,
+ 0x99, 0xf7, 0x3f, 0xf7, 0x9b, 0x77, 0x1, 0xf7,
+ 0x85, 0x96, 0x8b, 0xf7, 0x3c, 0x3, 0xc4, 0xf7,
+ 0x3, 0x15, 0xf7, 0x91, 0xf7, 0x20, 0xf7, 0x2f,
+ 0xfb, 0x95, 0x9e, 0x99, 0x4f, 0xf7, 0xac, 0xf7,
+ 0x9b, 0xc9, 0x5, 0xa7, 0x7, 0xfb, 0xa2, 0x9e,
+ 0xb8, 0xf7, 0xab, 0x6f, 0x98, 0xfb, 0x16, 0xfb,
+ 0xa0, 0xfb, 0x8f, 0xf7, 0x2e, 0x7a, 0x76, 0xf7,
+ 0x61, 0xfb, 0x71, 0xfb, 0x5a, 0xfb, 0x5c, 0x5,
+ 0xf7, 0x65, 0xf7, 0x64, 0x15, 0xb9, 0xb0, 0xb2,
+ 0xbb, 0xba, 0xaf, 0x64, 0x5d, 0x5c, 0x67, 0x64,
+ 0x5c, 0x5b, 0x66, 0xb2, 0xba, 0x1e, 0xe, 0x31,
+ 0xa0, 0x76, 0xf9, 0x30, 0x77, 0x1, 0xb3, 0xf9,
+ 0x31, 0x3, 0xf7, 0x4, 0xf7, 0x10, 0x15, 0xf7,
+ 0x83, 0xf7, 0x45, 0xfb, 0x5, 0xfb, 0xa8, 0xb2,
+ 0x8a, 0xa4, 0x85, 0xb1, 0x79, 0x19, 0xb4, 0xf7,
+ 0xb8, 0xf7, 0x9, 0xfb, 0xa5, 0xa7, 0xa5, 0xa2,
+ 0x9b, 0xb1, 0x95, 0x19, 0xfb, 0x48, 0xf7, 0x82,
+ 0xf7, 0xa9, 0xfb, 0x3, 0x88, 0xaa, 0x99, 0xb2,
+ 0x99, 0xa8, 0x19, 0xfb, 0xb9, 0xb5, 0xf7, 0xa6,
+ 0xf7, 0x9, 0x74, 0xa3, 0x76, 0xb0, 0x82, 0xa6,
+ 0x19, 0xfb, 0x82, 0xfb, 0x45, 0xf7, 0x4, 0xf7,
+ 0xa8, 0x6c, 0x8c, 0x62, 0x96, 0x6f, 0x98, 0x19,
+ 0x60, 0xfb, 0xb8, 0xfb, 0x8, 0xf7, 0xa5, 0x77,
+ 0x79, 0x68, 0x76, 0x6a, 0x7e, 0x19, 0x8c, 0x6,
+ 0xf7, 0x45, 0xfb, 0x82, 0xfb, 0xa8, 0xf7, 0x3,
+ 0x5, 0x64, 0x80, 0x70, 0x7c, 0x6a, 0x1e, 0xf7,
+ 0xb9, 0x60, 0xfb, 0xa5, 0xfb, 0x8, 0xa4, 0x6f,
+ 0x98, 0x74, 0x99, 0x66, 0x19, 0xe, 0x5a, 0x9f,
+ 0x76, 0xf8, 0x8f, 0x77, 0xae, 0x77, 0xf7, 0x46,
+ 0x77, 0x12, 0xc2, 0xf9, 0x3c, 0x13, 0xd8, 0xeb,
+ 0xf7, 0x31, 0x15, 0xf7, 0x8b, 0xf7, 0x6, 0x5c,
+ 0xfb, 0xa1, 0x9d, 0x88, 0xe7, 0xf7, 0x93, 0xf7,
+ 0x31, 0xfb, 0x73, 0x99, 0x94, 0xfb, 0x7, 0xf7,
+ 0x8b, 0xf7, 0xa2, 0x5c, 0x8e, 0x9b, 0xfb, 0x93,
+ 0xe9, 0xf7, 0x73, 0xf7, 0x30, 0x5, 0x13, 0xb8,
+ 0x80, 0x9a, 0xfb, 0x89, 0xfb, 0x6, 0xba, 0xf7,
+ 0xa1, 0x79, 0x8e, 0x2d, 0xfb, 0x93, 0xfb, 0x2f,
+ 0xf7, 0x73, 0x7c, 0x82, 0xf7, 0x8, 0xfb, 0x8b,
+ 0xfb, 0xa2, 0xba, 0x88, 0x7b, 0xf7, 0x93, 0x2d,
+ 0xfb, 0x73, 0xfb, 0x30, 0x5, 0xe, 0x5c, 0x78,
+ 0x60, 0xa, 0x8e, 0xbe, 0x7e, 0x67, 0xa, 0x95,
+ 0x77, 0xb8, 0xcf, 0x48, 0xcf, 0xd7, 0xa7, 0x8c,
+ 0x77, 0x12, 0xb0, 0x60, 0xa, 0x95, 0xbe, 0x77,
+ 0x67, 0xa, 0xae, 0xcf, 0x48, 0xcf, 0xd7, 0xa7,
+ 0x13, 0xec, 0x52, 0xb4, 0x55, 0x40, 0xf7, 0x8a,
+ 0xa1, 0x15, 0x73, 0xa6, 0x7f, 0xb9, 0xae, 0x1a,
+ 0xb8, 0x9d, 0xb5, 0xab, 0xab, 0x1e, 0x8d, 0x89,
+ 0x5, 0x81, 0x7a, 0x85, 0x76, 0x78, 0x1a, 0x61,
+ 0xa3, 0x6c, 0xb4, 0x82, 0x1e, 0x49, 0x97, 0xbf,
+ 0x4e, 0xd2, 0x1b, 0xa5, 0xa3, 0x95, 0x9d, 0x9e,
+ 0x1f, 0x79, 0x8c, 0x79, 0x92, 0x7b, 0x93, 0x4f,
+ 0xa9, 0x65, 0xc3, 0x8a, 0xcf, 0x8e, 0x8c, 0x18,
+ 0x64, 0x94, 0xaf, 0x64, 0xb6, 0x1b, 0x9b, 0x9b,
+ 0x91, 0x93, 0x98, 0x1f, 0x78, 0xa7, 0xad, 0x80,
+ 0xad, 0x1b, 0xc9, 0xc0, 0xb2, 0xcc, 0x8e, 0x1f,
+ 0x73, 0x70, 0x5d, 0x7f, 0x68, 0x1b, 0x5e, 0x61,
+ 0x9d, 0xab, 0x6b, 0x7f, 0xa, 0x13, 0xd1, 0x52,
+ 0xb9, 0x21, 0x40, 0x81, 0x9c, 0xa0, 0x85, 0x9e,
+ 0x1b, 0xb5, 0xaa, 0xa3, 0xb4, 0x94, 0x1f, 0xcd,
+ 0x97, 0xc8, 0xbf, 0xd2, 0x1a, 0xa5, 0x81, 0xa3,
+ 0x79, 0x9e, 0x1e, 0x8a, 0x79, 0x84, 0x79, 0x83,
+ 0x7b, 0x6d, 0x4f, 0x53, 0x65, 0x47, 0x8a, 0x8a,
+ 0x8e, 0x18, 0xb2, 0x94, 0xb2, 0xaf, 0xb6, 0x1a,
+ 0x9b, 0x85, 0x9b, 0x83, 0x98, 0x1e, 0x13, 0xe5,
+ 0x52, 0xb9, 0x54, 0xc0, 0x9e, 0xa7, 0x96, 0xad,
+ 0xad, 0x1a, 0x13, 0xe5, 0x52, 0xb9, 0x21, 0x40,
+ 0xc9, 0x64, 0xc0, 0x4a, 0x8e, 0x1e, 0x13, 0xe5,
+ 0x52, 0xb9, 0x54, 0xc0, 0xa3, 0x70, 0x97, 0x5d,
+ 0x68, 0x1a, 0x5e, 0x79, 0x61, 0x6b, 0x6b, 0x1e,
+ 0x89, 0x8d, 0x5, 0x13, 0xe4, 0x82, 0xb9, 0x49,
+ 0x40, 0x95, 0x9c, 0x91, 0xa0, 0x9e, 0x1a, 0xb5,
+ 0x73, 0xaa, 0x62, 0x94, 0x1e, 0x13, 0xe5, 0x46,
+ 0x79, 0x49, 0x40, 0xcd, 0x7f, 0x57, 0xc8, 0x44,
+ 0x1b, 0x71, 0x73, 0x81, 0x79, 0x78, 0x1f, 0x9d,
+ 0x8a, 0x9d, 0x84, 0x9b, 0x83, 0xc7, 0x6d, 0xb1,
+ 0x53, 0x8c, 0x47, 0x88, 0x8a, 0x18, 0xb2, 0x82,
+ 0x67, 0xb2, 0x60, 0x1b, 0x7b, 0x7b, 0x85, 0x83,
+ 0x7e, 0x1f, 0x13, 0xe5, 0x51, 0xb9, 0x55, 0x40,
+ 0x9e, 0x6f, 0x69, 0x96, 0x69, 0x1b, 0x6e, 0xa,
+ 0x4d, 0x56, 0x64, 0x4a, 0x88, 0x1f, 0x13, 0xe5,
+ 0x51, 0xb9, 0x55, 0x40, 0xa3, 0xa6, 0xb9, 0x97,
+ 0xae, 0x1b, 0xb8, 0xb5, 0x79, 0x6b, 0xab, 0x1f,
+ 0x89, 0x89, 0x5, 0x13, 0xe8, 0x22, 0xb9, 0x55,
+ 0x40, 0x95, 0x7a, 0x76, 0x91, 0x78, 0x1b, 0x61,
+ 0x6c, 0x73, 0x62, 0x82, 0x1f, 0x49, 0x7f, 0x4e,
+ 0x57, 0x44, 0x1a, 0x71, 0x95, 0x73, 0x9d, 0x78,
+ 0x1e, 0x8c, 0x9d, 0x92, 0x9d, 0x93, 0x9b, 0xa9,
+ 0xc7, 0xc3, 0xb1, 0xcf, 0x8c, 0x8c, 0x88, 0x18,
+ 0x64, 0x82, 0x64, 0x67, 0x60, 0x1a, 0x7b, 0x91,
+ 0x7b, 0x93, 0x7e, 0x1e, 0x78, 0x6f, 0x80, 0x69,
+ 0x69, 0x1a, 0x4d, 0xb2, 0x56, 0xcc, 0x88, 0x1e,
+ 0xc6, 0xf7, 0x6, 0x15, 0x81, 0x9b, 0x87, 0x9e,
+ 0x9e, 0x1a, 0x13, 0xe3, 0x52, 0xb9, 0x55, 0x40,
+ 0xb6, 0xa1, 0xbc, 0xb4, 0x9d, 0x1e, 0x8a, 0x8d,
+ 0x5, 0x8e, 0x7f, 0x7e, 0x8d, 0x7f, 0x1b, 0x65,
+ 0x4c, 0x79, 0x6e, 0x70, 0x1f, 0x6e, 0xa, 0xbd,
+ 0x98, 0xc2, 0xb1, 0xbd, 0x1b, 0x96, 0x96, 0x89,
+ 0x87, 0x95, 0x1f, 0x8c, 0x8d, 0x73, 0xb6, 0x42,
+ 0xb8, 0x59, 0x8a, 0x19, 0x13, 0xe5, 0x4a, 0xb2,
+ 0x15, 0x40, 0x95, 0x9b, 0x9e, 0x8f, 0x9e, 0x1b,
+ 0x13, 0xe5, 0x52, 0xb8, 0xd5, 0x40, 0xb6, 0xbc,
+ 0x75, 0x62, 0x9d, 0x1f, 0x8d, 0x8c, 0x5, 0x8e,
+ 0x97, 0x8d, 0x98, 0x97, 0x1a, 0xb1, 0x79, 0xca,
+ 0x6e, 0xa6, 0x1e, 0x13, 0xe5, 0x52, 0xb9, 0x21,
+ 0x40, 0xbd, 0x7e, 0xb1, 0x54, 0x59, 0x1a, 0x80,
+ 0x89, 0x80, 0x87, 0x81, 0x1e, 0x8d, 0x8a, 0xb6,
+ 0xa3, 0xb8, 0xd4, 0x8a, 0xbd, 0x19, 0x13, 0xc8,
+ 0x82, 0xb9, 0x53, 0x40, 0x95, 0x7b, 0x8f, 0x78,
+ 0x78, 0x1a, 0x60, 0x75, 0x5a, 0x62, 0x79, 0x1e,
+ 0x8c, 0x89, 0x5, 0x88, 0x97, 0x98, 0x89, 0x97,
+ 0x1b, 0xb1, 0xca, 0x9d, 0xa8, 0xa6, 0x1f, 0x59,
+ 0x7e, 0x54, 0x65, 0x59, 0x1b, 0x80, 0x80, 0x8d,
+ 0x8f, 0x81, 0x1f, 0x8a, 0x89, 0x5, 0x13, 0xe5,
+ 0x52, 0xb9, 0x55, 0x40, 0xa3, 0x60, 0xd4, 0x5e,
+ 0xbd, 0x8c, 0x8, 0x13, 0xe5, 0x52, 0xb2, 0x21,
+ 0x40, 0x81, 0x7b, 0x78, 0x87, 0x78, 0x1b, 0x60,
+ 0x5a, 0xa1, 0xb4, 0x79, 0x1f, 0x89, 0x8a, 0x5,
+ 0x88, 0x7f, 0x89, 0x7e, 0x7f, 0x1a, 0x65, 0x9d,
+ 0x4c, 0xa8, 0x70, 0x1e, 0x59, 0x98, 0x65, 0xc2,
+ 0xbd, 0x1a, 0x96, 0x8d, 0x96, 0x8f, 0x95, 0x1e,
+ 0x89, 0x8c, 0x5, 0x13, 0xe5, 0x52, 0xb9, 0x55,
+ 0x40, 0x60, 0x73, 0x5e, 0x42, 0x8c, 0x59, 0x8,
+ 0xd1, 0xf7, 0x39, 0x15, 0xa4, 0x97, 0xa6, 0x86,
+ 0x87, 0xa6, 0x98, 0xa4, 0x70, 0x8f, 0x78, 0x9f,
+ 0x7e, 0x73, 0x5, 0x6e, 0xa, 0x72, 0x7f, 0x9f,
+ 0x77, 0x5, 0xe, 0xfb, 0x24, 0x92, 0x76, 0xf9,
+ 0x64, 0x77, 0x1, 0xb2, 0xf8, 0xfd, 0x3, 0xb2,
+ 0xf7, 0x3e, 0x15, 0xf7, 0x8d, 0xd7, 0xc6, 0xfb,
+ 0x98, 0xc7, 0xf7, 0x98, 0xf7, 0x8d, 0x3e, 0xfb,
+ 0x5a, 0xf7, 0x44, 0xf7, 0x5f, 0xf7, 0x44, 0xfb,
+ 0x92, 0x3c, 0x51, 0xf7, 0x9c, 0x4e, 0xfb, 0x9c,
+ 0xfb, 0x91, 0xda, 0xf7, 0x5e, 0xfb, 0x44, 0x5,
+ 0xe, 0x59, 0x4c, 0xa2, 0xf7, 0x6a, 0xa8, 0xf8,
+ 0x8a, 0x77, 0x1, 0xf7, 0x51, 0xcd, 0x15, 0x81,
+ 0x7c, 0x87, 0x79, 0x79, 0x1a, 0x5b, 0xa4, 0x6d,
+ 0xbc, 0xa7, 0xa8, 0x95, 0x97, 0xa5, 0x1e, 0xc0,
+ 0xa4, 0xba, 0xb1, 0xb5, 0xb3, 0x8, 0xb4, 0xb6,
+ 0xdb, 0xd2, 0xca, 0x1b, 0xa2, 0x9e, 0x82, 0x79,
+ 0x99, 0x1f, 0x8f, 0x9c, 0x9d, 0x8e, 0x5, 0xa3,
+ 0x7a, 0x72, 0x97, 0x6e, 0x1b, 0x4c, 0x46, 0x56,
+ 0x61, 0x5f, 0x1f, 0x5a, 0x58, 0xfb, 0x2, 0x28,
+ 0x40, 0x1b, 0x6e, 0x6d, 0xa1, 0xaa, 0x97, 0x8f,
+ 0x97, 0x90, 0x96, 0x1f, 0x84, 0x92, 0x99, 0x7d,
+ 0x95, 0x1b, 0x90, 0x8e, 0x8d, 0x8f, 0x8e, 0x1f,
+ 0xe8, 0xf7, 0x13, 0x5, 0x8f, 0x91, 0x8c, 0x98,
+ 0x92, 0x1a, 0x94, 0x89, 0x9f, 0x84, 0x91, 0x1e,
+ 0x81, 0x94, 0x77, 0x9b, 0x9a, 0x1a, 0xad, 0xc4,
+ 0xe0, 0x9f, 0xa7, 0x1e, 0xa5, 0x9e, 0xb7, 0xc8,
+ 0xb1, 0xac, 0xa5, 0x71, 0x95, 0x1b, 0x90, 0x8f,
+ 0x8f, 0x8f, 0x8e, 0x1f, 0xe7, 0xf7, 0x13, 0x5,
+ 0x8f, 0x90, 0x8b, 0x97, 0x91, 0x1a, 0x93, 0x8b,
+ 0x9d, 0x84, 0x91, 0x1e, 0xa0, 0x73, 0x54, 0x9b,
+ 0x6c, 0x1b, 0x7c, 0x7d, 0x88, 0x83, 0x7f, 0x1f,
+ 0x4a, 0x60, 0x32, 0xfb, 0x5, 0x5c, 0x4a, 0x59,
+ 0x46, 0x41, 0xfb, 0x0, 0x72, 0x39, 0x8, 0x88,
+ 0x80, 0x89, 0x7e, 0x7f, 0x1a, 0x65, 0x9d, 0x67,
+ 0xa2, 0x6e, 0x1e, 0xa8, 0xb3, 0x15, 0x72, 0x9d,
+ 0x74, 0xb1, 0xaa, 0x1a, 0xbb, 0xf7, 0x8, 0xf7,
+ 0x3f, 0xaa, 0xb6, 0x1e, 0xba, 0xcc, 0xd9, 0xf4,
+ 0xcc, 0xb8, 0x8, 0x92, 0x95, 0x97, 0x8d, 0x97,
+ 0x1b, 0xa4, 0xad, 0x80, 0x7c, 0x9f, 0x1f, 0x8e,
+ 0x88, 0x8f, 0x88, 0x86, 0x1a, 0x83, 0x4d, 0x3a,
+ 0x82, 0x7f, 0x1e, 0x88, 0x89, 0x87, 0x87, 0x87,
+ 0x84, 0x79, 0x9d, 0x79, 0x1b, 0x7b, 0x7e, 0x85,
+ 0x82, 0x7e, 0x1f, 0x54, 0x66, 0x37, 0xfb, 0x16,
+ 0x6e, 0x4c, 0x8, 0x87, 0x82, 0x7d, 0x6e, 0x81,
+ 0x7e, 0xb0, 0x73, 0x83, 0x1a, 0x81, 0x4a, 0x37,
+ 0x81, 0x7e, 0x1e, 0x88, 0x89, 0x88, 0x89, 0x87,
+ 0x1b, 0x87, 0x88, 0x8d, 0x8d, 0x88, 0x1f, 0xe,
+ 0x4c, 0x9a, 0x76, 0xf9, 0x55, 0x54, 0xa, 0xf9,
+ 0x56, 0x3, 0xf7, 0xad, 0xf7, 0x86, 0x15, 0x62,
+ 0xfb, 0x7d, 0x5, 0x7e, 0x89, 0x8c, 0x89, 0x8c,
+ 0x1b, 0x91, 0x92, 0x95, 0x8f, 0x8e, 0x1f, 0xf7,
+ 0x16, 0xf7, 0x4c, 0xf7, 0x1b, 0xfb, 0x53, 0x5,
+ 0x85, 0x90, 0x8c, 0x8a, 0x8d, 0x1b, 0x8f, 0x8e,
+ 0x8d, 0x93, 0x89, 0x1f, 0x5e, 0xf7, 0x82, 0xf7,
+ 0x7b, 0x5f, 0x5, 0x9d, 0x88, 0x8e, 0x8c, 0x8d,
+ 0x1a, 0x90, 0x7f, 0x93, 0x89, 0x8c, 0x1e, 0xfb,
+ 0x53, 0xf7, 0x1b, 0xf7, 0x51, 0xf7, 0x17, 0x5,
+ 0x94, 0x91, 0x92, 0x93, 0x8f, 0x1a, 0x90, 0x7c,
+ 0x8b, 0x81, 0x88, 0x1e, 0xfb, 0x77, 0x62, 0xb4,
+ 0xf7, 0x6e, 0x5, 0x9f, 0x8f, 0x8b, 0x8f, 0x89,
+ 0x1b, 0x81, 0x82, 0x7b, 0x8a, 0x8a, 0x1f, 0xfb,
+ 0x12, 0xfb, 0x49, 0xfb, 0x16, 0xf7, 0x4c, 0x5,
+ 0x8d, 0x8a, 0x84, 0x97, 0x87, 0x1b, 0x81, 0x91,
+ 0x7a, 0x87, 0x1f, 0xb4, 0xfb, 0x71, 0xfb, 0x74,
+ 0xb4, 0x5, 0x86, 0x8c, 0x7a, 0x90, 0x82, 0x1a,
+ 0x85, 0x97, 0x85, 0x8d, 0x89, 0x1e, 0xf7, 0x50,
+ 0xfb, 0x1a, 0xfb, 0x4f, 0xfb, 0x12, 0x5, 0x87,
+ 0x88, 0x80, 0x84, 0x87, 0x1a, 0x84, 0x9c, 0x8e,
+ 0x8f, 0x8c, 0x1e, 0xe, 0x44, 0x99, 0x76, 0xf9,
+ 0x56, 0x54, 0xa, 0xf9, 0x4f, 0x3, 0xae, 0xf7,
+ 0x58, 0x15, 0xf7, 0x6c, 0xa8, 0x70, 0xfb, 0x7c,
+ 0xf7, 0x32, 0xf7, 0x3d, 0xf7, 0x32, 0xfb, 0x3d,
+ 0x72, 0xf7, 0x7c, 0xf7, 0x6f, 0x6e, 0xfb, 0x3d,
+ 0xf7, 0x31, 0xf7, 0x39, 0xf7, 0x31, 0xfb, 0x6b,
+ 0x6e, 0xa4, 0xf7, 0x6e, 0xfb, 0x32, 0xfb, 0x3d,
+ 0xfb, 0x32, 0xf7, 0x3d, 0xa6, 0xfb, 0x6e, 0xfb,
+ 0x6c, 0xa8, 0xf7, 0x3c, 0xfb, 0x31, 0x5, 0xe,
+ 0x5c, 0x3a, 0xa, 0xdf, 0xf9, 0x7, 0x3, 0xdf,
+ 0xf7, 0x35, 0x15, 0xf7, 0x48, 0xbb, 0x5b, 0xfb,
+ 0x41, 0xf7, 0x18, 0xf7, 0x16, 0xc7, 0xfb, 0x48,
+ 0xb5, 0xf7, 0x41, 0xf7, 0x14, 0xfb, 0xf, 0x5b,
+ 0xf7, 0x3f, 0xf7, 0x49, 0x63, 0xfb, 0x14, 0xf7,
+ 0x18, 0xf7, 0x42, 0xb9, 0xfb, 0x41, 0xba, 0xf7,
+ 0x17, 0xf7, 0x10, 0xfb, 0x50, 0x62, 0xb9, 0xf7,
+ 0x47, 0xfb, 0x12, 0xfb, 0x14, 0x5b, 0xf7, 0x47,
+ 0x5a, 0xfb, 0x43, 0xfb, 0x15, 0xf7, 0x12, 0xb8,
+ 0xfb, 0x49, 0xfb, 0x4a, 0xba, 0xf7, 0x19, 0xfb,
+ 0x19, 0xfb, 0x4a, 0x56, 0xf7, 0x44, 0x5c, 0x5,
+ 0xe, 0x3b, 0x9c, 0x76, 0xa3, 0x76, 0xf7, 0xa4,
+ 0x7c, 0xa, 0xe6, 0x77, 0xa0, 0x77, 0xf7, 0x5f,
+ 0x77, 0x12, 0xf7, 0xcb, 0x7c, 0xa, 0x13, 0x6e,
+ 0xd8, 0xf7, 0x7, 0xf7, 0xb, 0x15, 0x99, 0x82,
+ 0xa0, 0x76, 0x94, 0x7d, 0xf7, 0x49, 0xf7, 0x63,
+ 0x18, 0x8c, 0x8a, 0xfb, 0xe, 0xfb, 0x8b, 0x9c,
+ 0x88, 0xa6, 0x81, 0x99, 0x80, 0x19, 0xe3, 0xf7,
+ 0x99, 0x5, 0x8d, 0x6, 0x13, 0xae, 0xd8, 0x79,
+ 0xfb, 0xa7, 0x9c, 0x8f, 0xa7, 0x8b, 0x9c, 0x87,
+ 0x19, 0x79, 0xf7, 0xa7, 0x5, 0x8c, 0x6, 0xe4,
+ 0xfb, 0x99, 0x99, 0x96, 0xa5, 0x95, 0x9c, 0x8e,
+ 0x19, 0xfb, 0xe, 0xf7, 0x8b, 0x8d, 0x8c, 0xf7,
+ 0x49, 0xfb, 0x63, 0x94, 0x99, 0xa0, 0xa0, 0x99,
+ 0x94, 0x19, 0xfb, 0x63, 0xf7, 0x49, 0x8c, 0x8c,
+ 0xf7, 0x8b, 0xfb, 0xe, 0x8e, 0x9c, 0x95, 0xa6,
+ 0x96, 0x99, 0x19, 0xfb, 0x99, 0xe3, 0x75, 0xa,
+ 0xf7, 0xa7, 0x79, 0x87, 0x9c, 0x8b, 0xa7, 0x8f,
+ 0x9c, 0x19, 0xfb, 0xa7, 0x79, 0x5, 0x8c, 0x7,
+ 0xf7, 0x99, 0xe4, 0x80, 0x99, 0x81, 0xa5, 0x88,
+ 0x9c, 0x19, 0xfb, 0x8b, 0xfb, 0xe, 0x8a, 0x8d,
+ 0xf7, 0x63, 0xf7, 0x49, 0x7d, 0x94, 0x76, 0xa0,
+ 0x82, 0x99, 0x19, 0xfb, 0x49, 0xfb, 0x63, 0x8a,
+ 0x8c, 0xf7, 0xe, 0xf7, 0x8b, 0x7a, 0x8e, 0x70,
+ 0x95, 0x7d, 0x96, 0x19, 0x33, 0xfb, 0x99, 0x5,
+ 0x89, 0x6, 0x9d, 0xf7, 0xa7, 0x7a, 0x87, 0x6f,
+ 0x8b, 0x7a, 0x8f, 0x19, 0x9d, 0xfb, 0xa7, 0x5,
+ 0x8a, 0x6, 0x32, 0xf7, 0x99, 0x5, 0x7d, 0x7e,
+ 0x71, 0x81, 0x79, 0x1b, 0xf7, 0xe, 0xfb, 0x8b,
+ 0x89, 0x8a, 0xfb, 0x49, 0xf7, 0x63, 0x82, 0x7d,
+ 0x76, 0x76, 0x7d, 0x82, 0x19, 0xf7, 0x63, 0xfb,
+ 0x49, 0x8a, 0x8a, 0x5, 0x13, 0x75, 0xe8, 0xfb,
+ 0x8b, 0xf7, 0xe, 0x88, 0x7a, 0x81, 0x70, 0x80,
+ 0x7d, 0x19, 0xf7, 0x99, 0x33, 0x80, 0xa, 0xfb,
+ 0xa7, 0x9d, 0x8f, 0x7a, 0x8b, 0x6f, 0x87, 0x7a,
+ 0x19, 0xf7, 0xa7, 0x9d, 0x5, 0x8a, 0x7, 0xfb,
+ 0x99, 0x32, 0x96, 0x7d, 0x95, 0x71, 0x8e, 0x7a,
+ 0x19, 0xf7, 0x8b, 0xf7, 0xe, 0x8c, 0x89, 0x5,
+ 0x8e, 0xb3, 0x15, 0xa9, 0xa4, 0xa4, 0xa9, 0xa9,
+ 0xa4, 0x72, 0x6d, 0x6d, 0x72, 0x72, 0x6d, 0x6d,
+ 0x72, 0xa4, 0xa9, 0x1e, 0xe, 0xfb, 0x18, 0xac,
+ 0x76, 0xf7, 0xc8, 0xa0, 0x89, 0xa0, 0xf7, 0xc8,
+ 0x77, 0x12, 0xf7, 0xe1, 0xa0, 0x89, 0xa0, 0x13,
+ 0xb8, 0xa4, 0xf7, 0x99, 0x15, 0x47, 0xf7, 0x8,
+ 0xaa, 0xaa, 0x99, 0x1e, 0xa3, 0x96, 0xa4, 0x99,
+ 0xa4, 0x99, 0xa4, 0x99, 0xa5, 0x99, 0xa0, 0x97,
+ 0x8, 0x8d, 0x8f, 0x8e, 0x8c, 0x8d, 0x1b, 0x8f,
+ 0x8d, 0x89, 0x87, 0x89, 0x8a, 0x88, 0x89, 0x87,
+ 0x1f, 0x7f, 0x74, 0x7c, 0x71, 0x7c, 0x70, 0x8,
+ 0x71, 0x5e, 0x6d, 0x5a, 0x57, 0x1a, 0x6e, 0x93,
+ 0x61, 0xad, 0xae, 0xa6, 0xbe, 0xa7, 0x92, 0x1e,
+ 0x94, 0xac, 0x8d, 0xb9, 0xb9, 0xa8, 0x8c, 0xa7,
+ 0xa4, 0x1a, 0x93, 0x8e, 0x90, 0x8f, 0x8e, 0x8f,
+ 0x88, 0x86, 0x8e, 0x1e, 0x99, 0x75, 0x9a, 0x71,
+ 0x9b, 0x70, 0xa2, 0x65, 0xa3, 0x64, 0xa1, 0x75,
+ 0xa4, 0x72, 0xc1, 0x6d, 0xa6, 0xa6, 0xa6, 0xa6,
+ 0x6d, 0xc1, 0x72, 0xa4, 0x73, 0xa3, 0x64, 0xa4,
+ 0x63, 0xa2, 0x72, 0x9a, 0x72, 0x9a, 0x76, 0x97,
+ 0x8, 0x86, 0x8e, 0x88, 0x8f, 0x8e, 0x1a, 0x8f,
+ 0x90, 0x8e, 0x93, 0x1e, 0x8c, 0xa5, 0xa9, 0x8b,
+ 0xaa, 0x1b, 0xb8, 0x8c, 0xb7, 0x8d, 0xaa, 0x93,
+ 0x8, 0xa9, 0x93, 0xbc, 0xa4, 0xaf, 0x1a, 0x13,
+ 0xd4, 0x99, 0x83, 0x95, 0x7f, 0x92, 0x1e, 0x67,
+ 0xa1, 0x57, 0x7e, 0x67, 0x7b, 0x73, 0x80, 0x70,
+ 0x7d, 0x71, 0x7c, 0x72, 0x7d, 0x72, 0x7d, 0x75,
+ 0x7f, 0x8, 0x89, 0x87, 0x88, 0x8a, 0x89, 0x1b,
+ 0x87, 0x89, 0x8d, 0x8f, 0x8d, 0x8c, 0x8e, 0x8d,
+ 0x8f, 0x1f, 0x97, 0xa2, 0x9a, 0xa5, 0x9a, 0xa6,
+ 0x9a, 0xa5, 0x99, 0xa6, 0x95, 0xa3, 0x8, 0xaa,
+ 0x99, 0xa4, 0xf7, 0x1, 0x4b, 0x1b, 0x66, 0x74,
+ 0x5a, 0x6d, 0x82, 0x1f, 0x82, 0x6a, 0x89, 0x5d,
+ 0x5d, 0x6e, 0x8a, 0x6f, 0x72, 0x1a, 0x83, 0x88,
+ 0x86, 0x87, 0x88, 0x87, 0x8e, 0x90, 0x88, 0x1e,
+ 0x7d, 0xa1, 0x7c, 0xa5, 0x7b, 0xa6, 0x74, 0xb1,
+ 0x73, 0xb2, 0x75, 0xa1, 0x72, 0xa4, 0x55, 0xa9,
+ 0x70, 0x70, 0x70, 0x70, 0xa9, 0x55, 0xa4, 0x72,
+ 0xa3, 0x73, 0xb2, 0x72, 0xb3, 0x74, 0xa4, 0x7c,
+ 0xa4, 0x7c, 0xa0, 0x7f, 0x8, 0x90, 0x88, 0x8e,
+ 0x87, 0x88, 0x1a, 0x87, 0x86, 0x88, 0x83, 0x1e,
+ 0x8a, 0x71, 0x6d, 0x8b, 0x6c, 0x1b, 0x5e, 0x8a,
+ 0x5f, 0x89, 0x6c, 0x83, 0x8, 0x13, 0xd8, 0x6c,
+ 0x83, 0x5b, 0x71, 0x68, 0x1a, 0xe, 0xfb, 0x17,
+ 0xae, 0x76, 0xf7, 0x64, 0xf7, 0x8, 0x63, 0xb3,
+ 0x94, 0xf7, 0xa, 0xf7, 0x63, 0x77, 0x12, 0xf7,
+ 0x80, 0xf7, 0xa, 0x9d, 0xf7, 0xc, 0x13, 0xde,
+ 0xa4, 0xf7, 0x9a, 0x15, 0x6b, 0xbe, 0x83, 0xa3,
+ 0x1e, 0x13, 0xbe, 0xda, 0xc2, 0xd7, 0xb6, 0x1b,
+ 0x9d, 0x9a, 0x7d, 0x79, 0x1f, 0x6e, 0x3f, 0x45,
+ 0x3c, 0x1a, 0x73, 0x92, 0x59, 0xac, 0xad, 0xa7,
+ 0xbd, 0xa7, 0x93, 0x1e, 0x91, 0x9f, 0x8d, 0xa0,
+ 0xa0, 0xa2, 0x88, 0xa0, 0xa2, 0x1a, 0xa2, 0x8d,
+ 0xa5, 0xaa, 0x97, 0x93, 0x86, 0x81, 0x92, 0x1e,
+ 0xa8, 0x61, 0x95, 0x61, 0xb3, 0x63, 0x8, 0x77,
+ 0x9f, 0xac, 0x79, 0xa7, 0x1b, 0xa1, 0x99, 0x97,
+ 0xa2, 0xa7, 0x77, 0xad, 0x78, 0x9e, 0x1f, 0x64,
+ 0xb2, 0x62, 0x96, 0x5f, 0xa7, 0x8, 0x81, 0x92,
+ 0x84, 0x94, 0x98, 0x1a, 0xa4, 0xa1, 0x91, 0xa0,
+ 0x1e, 0xa2, 0xa2, 0x89, 0xa2, 0x1b, 0xa2, 0xa2,
+ 0x8d, 0x91, 0xa1, 0x1f, 0xa7, 0x93, 0xbd, 0xa7,
+ 0xad, 0x1a, 0xac, 0x59, 0x94, 0x72, 0x1e, 0x3e,
+ 0x44, 0x3c, 0x6c, 0x1b, 0x7a, 0x7d, 0x9a, 0x9c,
+ 0x1f, 0xa9, 0xd9, 0xd6, 0xd6, 0x1a, 0xa3, 0x82,
+ 0xbd, 0x6b, 0x69, 0x6d, 0x59, 0x6f, 0x84, 0x1e,
+ 0x84, 0x71, 0x8a, 0x71, 0x70, 0x74, 0x8d, 0x74,
+ 0x75, 0x1a, 0x79, 0x81, 0x79, 0x77, 0x7e, 0x81,
+ 0x94, 0x95, 0x84, 0x1e, 0x85, 0x95, 0x85, 0x97,
+ 0x86, 0x96, 0x7a, 0xac, 0x79, 0xac, 0x71, 0xa5,
+ 0x8, 0x9e, 0x78, 0x6b, 0x9e, 0x6f, 0x1b, 0x74,
+ 0x7d, 0x7d, 0x74, 0x6f, 0x9e, 0x6b, 0x9e, 0x78,
+ 0x1f, 0xb0, 0x66, 0xb8, 0x7b, 0xb6, 0x71, 0x8,
+ 0x95, 0x85, 0x94, 0x81, 0x7e, 0x1a, 0x76, 0x74,
+ 0x81, 0x79, 0x1e, 0x72, 0x73, 0x8d, 0x72, 0x1b,
+ 0x75, 0x74, 0x8a, 0x85, 0x76, 0x1f, 0x6f, 0x83,
+ 0x57, 0x6e, 0x69, 0x1a, 0xf7, 0xa5, 0xda, 0x15,
+ 0xaa, 0xa4, 0xa4, 0xaa, 0xaa, 0xa4, 0x72, 0x6c,
+ 0x6c, 0x72, 0x72, 0x6c, 0x6c, 0x72, 0xa4, 0xaa,
+ 0x1e, 0xe, 0xfb, 0x31, 0x3f, 0xa, 0x12, 0xf7,
+ 0x9d, 0xf7, 0x2f, 0x2f, 0xa3, 0x13, 0xd0, 0xae,
+ 0xf7, 0x49, 0x15, 0xc2, 0x52, 0xd6, 0x96, 0xb2,
+ 0xc4, 0x8, 0x13, 0xe0, 0xae, 0xbb, 0xb0, 0xc1,
+ 0xbf, 0xa9, 0x8, 0x56, 0x7b, 0x5d, 0x7b, 0x63,
+ 0x1e, 0x73, 0x4d, 0x84, 0x76, 0x73, 0x1a, 0x5b,
+ 0xae, 0x6b, 0xb6, 0x7f, 0x1e, 0x13, 0xd0, 0xb7,
+ 0x97, 0xac, 0xac, 0xbe, 0x1a, 0x67, 0xf5, 0x7c,
+ 0xae, 0x79, 0xbc, 0x8c, 0xbf, 0x19, 0xbe, 0x6e,
+ 0xaf, 0x57, 0xad, 0x5d, 0xa7, 0x4a, 0xec, 0x83,
+ 0xbc, 0xc2, 0x8, 0xd3, 0x6d, 0xb1, 0x48, 0x94,
+ 0x1e, 0x20, 0x9a, 0x60, 0x98, 0x64, 0x9f, 0xc0,
+ 0xab, 0xc9, 0x92, 0xc7, 0x94, 0x8, 0xd5, 0x94,
+ 0xb0, 0xb0, 0xe1, 0x1a, 0x4a, 0xb4, 0x4b, 0x7b,
+ 0x5e, 0x53, 0x3b, 0x2b, 0x6f, 0x72, 0x7e, 0x86,
+ 0x89, 0xcb, 0x98, 0xa8, 0xa3, 0xc4, 0x8, 0x94,
+ 0xa0, 0xa2, 0xc4, 0xa2, 0x1a, 0xb5, 0x63, 0xaa,
+ 0x67, 0x97, 0x1e, 0x5f, 0x7f, 0x66, 0x6c, 0x5a,
+ 0x1a, 0x6c, 0x9d, 0x67, 0x96, 0x70, 0x1e, 0x9a,
+ 0x68, 0xa1, 0x53, 0x50, 0x1a, 0x5e, 0xa0, 0x67,
+ 0xbe, 0x6f, 0xb3, 0x61, 0xc7, 0x50, 0xaf, 0x38,
+ 0x59, 0x8, 0xfb, 0xc, 0xd0, 0x84, 0xcc, 0x81,
+ 0x1e, 0xbe, 0x84, 0xbf, 0x81, 0xba, 0x70, 0x67,
+ 0x75, 0x5e, 0x7f, 0x2a, 0x7d, 0x8, 0x45, 0x82,
+ 0x67, 0x79, 0x31, 0x1a, 0xe, 0xfb, 0x1e, 0x95,
+ 0xc3, 0x87, 0xb4, 0xef, 0xa7, 0x7c, 0xcc, 0x57,
+ 0xdb, 0xa0, 0x96, 0x89, 0x96, 0x91, 0x77, 0xaf,
+ 0xda, 0x57, 0xcd, 0x7c, 0xa6, 0xa5, 0x77, 0xea,
+ 0xb3, 0x87, 0xc3, 0x12, 0x90, 0xcc, 0xb0, 0xab,
+ 0xb2, 0xa4, 0xe6, 0xd1, 0x66, 0xb5, 0x65, 0xb5,
+ 0x68, 0xcf, 0xe8, 0xa2, 0xb1, 0xac, 0xb1, 0xcb,
+ 0x13, 0xa4, 0x9b, 0xa7, 0xf7, 0x8, 0x5b, 0xa,
+ 0x62, 0x86, 0x99, 0xfb, 0x12, 0x58, 0xa, 0x13,
+ 0x64, 0x9b, 0x8f, 0x59, 0xa, 0xad, 0x81, 0xae,
+ 0x7f, 0xab, 0x7f, 0xa, 0x13, 0x8c, 0x37, 0x97,
+ 0x43, 0xa, 0x71, 0xa, 0x19, 0x4e, 0xa, 0x13,
+ 0xa4, 0x9b, 0xc7, 0x57, 0xa, 0x69, 0x95, 0x68,
+ 0x3c, 0xa, 0xf7, 0xa9, 0xf7, 0xbf, 0x15, 0x8f,
+ 0x96, 0x8d, 0x97, 0x97, 0x1a, 0x9e, 0x86, 0x7b,
+ 0xa, 0x97, 0x1a, 0x13, 0x8c, 0x37, 0xc7, 0xa5,
+ 0xad, 0x9a, 0xa1, 0xb0, 0xb5, 0x6c, 0x64, 0x68,
+ 0x6a, 0x90, 0x75, 0x80, 0x1e, 0x75, 0x80, 0x78,
+ 0x74, 0x83, 0x74, 0x8, 0xcf, 0x30, 0x15, 0x92,
+ 0x7, 0xb8, 0x94, 0x9d, 0xa6, 0x98, 0xa1, 0x8,
+ 0x9b, 0x95, 0x93, 0x99, 0x9b, 0x1b, 0xae, 0xa2,
+ 0x61, 0x6c, 0x72, 0x7a, 0x60, 0x6d, 0x79, 0x7e,
+ 0xa2, 0x94, 0x7b, 0x1f, 0x13, 0xa1, 0x9b, 0xc7,
+ 0x95, 0x79, 0x76, 0x90, 0x77, 0x1b, 0x86, 0x86,
+ 0x8b, 0x8a, 0x86, 0x1f, 0x96, 0xe5, 0x15, 0x7b,
+ 0x67, 0x76, 0x5f, 0x62, 0x7e, 0x8, 0x13, 0x92,
+ 0x9b, 0xa7, 0x8a, 0x88, 0x87, 0x8a, 0x87, 0x1b,
+ 0x55, 0xa, 0x47, 0xa, 0x13, 0x52, 0x5b, 0x97,
+ 0x61, 0xa, 0xfb, 0x78, 0xf7, 0x23, 0x15, 0xa2,
+ 0x77, 0x6e, 0x99, 0x6d, 0x1b, 0x7e, 0x7f, 0x8b,
+ 0x8d, 0x81, 0x1f, 0x7e, 0x8e, 0x82, 0x94, 0xa2,
+ 0x1a, 0xb6, 0xb3, 0xac, 0xb4, 0x9e, 0xa4, 0x81,
+ 0x74, 0x1e, 0x7d, 0x83, 0x7e, 0x7c, 0x1a, 0x72,
+ 0x94, 0x70, 0x9b, 0x78, 0x1e, 0xf7, 0x1d, 0xfb,
+ 0x4b, 0x15, 0x91, 0x8f, 0x5, 0x74, 0x9f, 0xa8,
+ 0x7d, 0xa9, 0x1b, 0xa9, 0xa6, 0x8e, 0x63, 0x60,
+ 0x63, 0x6a, 0x62, 0x78, 0x72, 0x95, 0xa2, 0x1f,
+ 0x99, 0x93, 0x98, 0x9a, 0x1a, 0xa4, 0x82, 0xa6,
+ 0x7b, 0x9e, 0x1e, 0xfb, 0x71, 0xf7, 0x26, 0x15,
+ 0x8d, 0x9a, 0x9b, 0x8d, 0x9a, 0x1b, 0x13, 0xa1,
+ 0x9b, 0xa7, 0xa2, 0xc8, 0x7d, 0x6e, 0x1f, 0x13,
+ 0xa4, 0x9b, 0x97, 0x77, 0xa, 0x1e, 0x48, 0xa,
+ 0x9b, 0xaf, 0xa0, 0xb7, 0xb4, 0x98, 0x8, 0x8c,
+ 0x8e, 0x8f, 0x8c, 0x8f, 0x1b, 0x5d, 0xa, 0x97,
+ 0xdf, 0x15, 0x66, 0x84, 0x79, 0x78, 0x7e, 0x78,
+ 0x8, 0x75, 0x7c, 0x84, 0x76, 0x77, 0x1b, 0x68,
+ 0x74, 0xb6, 0xaa, 0xa4, 0x9c, 0xb5, 0xa9, 0x98,
+ 0x95, 0x7e, 0x7e, 0x9c, 0x1f, 0x80, 0x99, 0x9e,
+ 0x81, 0xaa, 0x1b, 0x91, 0x90, 0x8b, 0x8c, 0x91,
+ 0x1f, 0xd0, 0x2f, 0x15, 0x91, 0x88, 0x5, 0x13,
+ 0xa4, 0x9b, 0x8f, 0x87, 0x7f, 0x89, 0x7e, 0x7f,
+ 0x1a, 0x75, 0x92, 0x7c, 0x92, 0x7e, 0x1e, 0x93,
+ 0x7c, 0x94, 0x80, 0x80, 0x1a, 0x71, 0x69, 0x7c,
+ 0x75, 0x66, 0x61, 0xaa, 0xb2, 0xae, 0xac, 0x85,
+ 0xa1, 0x97, 0x1e, 0xa0, 0x96, 0x9f, 0xa2, 0x93,
+ 0xa2, 0x8, 0xe, 0x7e, 0xaa, 0x76, 0xf7, 0x6f,
+ 0xbf, 0xbc, 0x96, 0x89, 0x96, 0xbc, 0xbf, 0xbf,
+ 0x77, 0xf7, 0x4f, 0x77, 0x12, 0xf8, 0x1a, 0xb5,
+ 0x65, 0xb5, 0x83, 0xf7, 0x31, 0xfb, 0x12, 0x95,
+ 0x13, 0xef, 0x20, 0xf7, 0x47, 0x5b, 0xa, 0x8a,
+ 0x83, 0x8b, 0x83, 0x83, 0x1a, 0x65, 0x9a, 0x22,
+ 0xbe, 0xb7, 0xc1, 0xbe, 0xac, 0xa4, 0x1e, 0x53,
+ 0xa, 0x8f, 0x9c, 0x8d, 0x9e, 0x63, 0xa, 0xc2,
+ 0x75, 0xb7, 0x1b, 0xb6, 0x95, 0xaa, 0xb0, 0xad,
+ 0x81, 0xaf, 0x7f, 0xaa, 0x7f, 0xa, 0x5c, 0xa,
+ 0x77, 0x99, 0x77, 0x39, 0xa, 0x5, 0x13, 0xee,
+ 0x40, 0x71, 0xa, 0x8, 0xb3, 0x8f, 0x7f, 0xf7,
+ 0x13, 0x62, 0xa, 0x13, 0xde, 0xa0, 0x52, 0xa,
+ 0x87, 0x7a, 0x89, 0x78, 0x64, 0xa, 0x54, 0xa1,
+ 0x5f, 0x1b, 0x60, 0x81, 0x6c, 0x66, 0x69, 0x95,
+ 0x67, 0x97, 0x6c, 0x4a, 0xa, 0x9f, 0x7d, 0x9f,
+ 0x81, 0x8, 0x65, 0x7a, 0x3b, 0x45, 0xa, 0xf7,
+ 0xfe, 0xf7, 0xbb, 0x15, 0x7a, 0x65, 0x78, 0x63,
+ 0x61, 0x7c, 0x8, 0x8a, 0x87, 0x88, 0x8a, 0x87,
+ 0x1b, 0x13, 0xef, 0x20, 0x55, 0xa, 0x13, 0xee,
+ 0x40, 0x47, 0xa, 0x13, 0xde, 0xa0, 0x61, 0xa,
+ 0xfb, 0xc6, 0xf7, 0x2, 0x15, 0x8d, 0x9a, 0x9b,
+ 0x8d, 0x9a, 0x1b, 0x13, 0xef, 0x20, 0xa2, 0xc8,
+ 0x7d, 0x6e, 0x77, 0xa, 0x1f, 0x48, 0xa, 0x9c,
+ 0xb1, 0x9e, 0xb3, 0xb5, 0x9a, 0x8, 0x8c, 0x8f,
+ 0x8e, 0x8c, 0x8f, 0x1b, 0x13, 0xee, 0xa0, 0x5d,
+ 0xa, 0xe, 0x73, 0x95, 0xb3, 0x97, 0xa9, 0xf7,
+ 0xf, 0xaa, 0x7a, 0x9c, 0xc1, 0xdb, 0x75, 0x77,
+ 0xeb, 0x9c, 0x7a, 0xaa, 0xb1, 0x77, 0xf4, 0xa9,
+ 0x97, 0xb3, 0x12, 0xca, 0xb5, 0xc7, 0xa7, 0xb6,
+ 0xa2, 0xbf, 0xb0, 0x8f, 0x9c, 0x86, 0x9d, 0x7d,
+ 0xdb, 0x7d, 0x9d, 0x86, 0x9c, 0x8f, 0xb0, 0x66,
+ 0xf7, 0x4b, 0x2d, 0xa2, 0xb6, 0xa7, 0xc7, 0xb5,
+ 0x13, 0xda, 0xff, 0x14, 0x80, 0xf7, 0x42, 0x5b,
+ 0xa, 0x63, 0x86, 0x99, 0xfb, 0x13, 0x58, 0xa,
+ 0x59, 0xa, 0xae, 0x81, 0xad, 0x7f, 0xab, 0x7f,
+ 0xa, 0x43, 0xa, 0x5, 0x13, 0xd6, 0xff, 0x2b,
+ 0x80, 0x71, 0xa, 0x8, 0x4e, 0xa, 0x57, 0xa,
+ 0x68, 0x95, 0x69, 0x3c, 0xa, 0xf7, 0xa8, 0xf7,
+ 0xc1, 0x15, 0x8f, 0x96, 0x8d, 0x96, 0x97, 0x1a,
+ 0x9d, 0x87, 0x7b, 0xa, 0x96, 0x1a, 0xab, 0xbd,
+ 0xa5, 0xa7, 0xb1, 0x9e, 0x5e, 0x6a, 0x71, 0x81,
+ 0x84, 0x73, 0x86, 0x1e, 0x6b, 0x84, 0x6f, 0x6e,
+ 0x80, 0x6d, 0x8, 0xd3, 0x2f, 0x15, 0x8a, 0x92,
+ 0xad, 0x90, 0xa5, 0xa1, 0x9a, 0xa9, 0x19, 0x92,
+ 0x99, 0x90, 0x95, 0x9b, 0x8e, 0x8, 0x8c, 0x8e,
+ 0x8d, 0x8b, 0x8e, 0x1b, 0xab, 0xb8, 0x6c, 0x69,
+ 0x6e, 0x66, 0x5f, 0x6d, 0x7f, 0x82, 0x98, 0x97,
+ 0x7c, 0x1f, 0x97, 0x7d, 0x78, 0x96, 0x6a, 0x1b,
+ 0x85, 0x85, 0x8a, 0x8a, 0x85, 0x1f, 0xfb, 0x55,
+ 0xd3, 0x15, 0x13, 0xe9, 0xff, 0x2b, 0x80, 0xa3,
+ 0x78, 0x6c, 0x98, 0x6c, 0x85, 0x86, 0x8b, 0x85,
+ 0x1b, 0x6b, 0x83, 0xa7, 0xa6, 0xb0, 0x9b, 0xaa,
+ 0xb4, 0xa2, 0xb9, 0x7f, 0x6e, 0x1f, 0x7c, 0x83,
+ 0x7c, 0x7b, 0x1a, 0x73, 0x94, 0x71, 0x9b, 0x78,
+ 0x1e, 0xfb, 0x13, 0xfb, 0x90, 0x15, 0xaa, 0xca,
+ 0xa8, 0xc1, 0xcf, 0xaa, 0x8a, 0x8d, 0x18, 0x43,
+ 0x94, 0x5d, 0xb6, 0x5b, 0xbd, 0x8, 0x8c, 0x9d,
+ 0x9e, 0x8c, 0x9d, 0x1b, 0xbe, 0xb7, 0x82, 0x6d,
+ 0xb5, 0x1f, 0x8c, 0x8d, 0x5, 0x80, 0xa4, 0x87,
+ 0xa7, 0xa7, 0x1a, 0xb2, 0x95, 0xb0, 0x96, 0xb1,
+ 0x1e, 0xad, 0x58, 0xaa, 0x5a, 0x4b, 0x1a, 0x84,
+ 0x8b, 0x84, 0x8a, 0x84, 0x1e, 0x8d, 0x6, 0xb7,
+ 0xc5, 0xc8, 0x9e, 0xce, 0x9b, 0x6c, 0x4c, 0x6e,
+ 0x55, 0x47, 0x6c, 0x8c, 0x89, 0x18, 0xd3, 0x82,
+ 0xb9, 0x60, 0xbb, 0x59, 0x8, 0x8a, 0x79, 0x78,
+ 0x8a, 0x79, 0x1b, 0x58, 0x5f, 0x94, 0xa9, 0x61,
+ 0x1f, 0x8a, 0x89, 0x5, 0x96, 0x72, 0x8f, 0x6f,
+ 0x6f, 0x1a, 0x13, 0xea, 0xfe, 0x9b, 0x80, 0x64,
+ 0x81, 0x66, 0x80, 0x65, 0x1e, 0x69, 0xbe, 0x6c,
+ 0xbc, 0xcb, 0x1a, 0x92, 0x8b, 0x92, 0x8c, 0x92,
+ 0x1e, 0x89, 0x6, 0x5f, 0x51, 0x4e, 0x78, 0x48,
+ 0x7b, 0x8, 0xf7, 0xa3, 0xcf, 0x15, 0x90, 0x8f,
+ 0x5, 0x73, 0x9e, 0xaa, 0x7e, 0xaa, 0x91, 0x90,
+ 0x8b, 0x91, 0x1b, 0xab, 0x93, 0x6f, 0x70, 0x66,
+ 0x7b, 0x6c, 0x62, 0x74, 0x5d, 0x97, 0xa8, 0x1f,
+ 0x9a, 0x93, 0x9a, 0x9b, 0x1a, 0xa3, 0x82, 0xa5,
+ 0x7b, 0x9e, 0x1e, 0xfb, 0x4f, 0xd0, 0x15, 0x69,
+ 0x86, 0x71, 0x75, 0x7c, 0x6d, 0x84, 0x7d, 0x86,
+ 0x81, 0x7b, 0x88, 0x8, 0x6a, 0x80, 0x57, 0xb6,
+ 0xab, 0x1a, 0xa8, 0xb0, 0xb7, 0xa9, 0x94, 0x92,
+ 0x84, 0x82, 0x94, 0x1e, 0x7d, 0x9a, 0xa0, 0x79,
+ 0xb4, 0x1b, 0x91, 0x91, 0x8c, 0x8c, 0x91, 0x1f,
+ 0xd3, 0x2f, 0x15, 0x13, 0xda, 0xfe, 0xab, 0x80,
+ 0x91, 0x88, 0x5, 0x87, 0x80, 0x89, 0x80, 0x7f,
+ 0x1a, 0x75, 0x92, 0x7b, 0x92, 0x7d, 0x1e, 0x93,
+ 0x7c, 0x93, 0x80, 0x82, 0x1a, 0x6b, 0x59, 0x71,
+ 0x6f, 0x65, 0x78, 0xb8, 0xac, 0xa5, 0x95, 0x92,
+ 0xa3, 0x90, 0x1e, 0xab, 0x92, 0xa7, 0xa8, 0x96,
+ 0xa9, 0x8, 0x13, 0xda, 0xfe, 0x4b, 0x80, 0x8f,
+ 0xf7, 0x0, 0x15, 0x75, 0x9d, 0x79, 0xa1, 0xa1,
+ 0x9d, 0x9d, 0xa1, 0xa1, 0x79, 0x9d, 0x75, 0x75,
+ 0x79, 0x79, 0x75, 0x1e, 0xe, 0xfb, 0xed, 0xa0,
+ 0x76, 0xf8, 0x36, 0xea, 0xf7, 0x47, 0x77, 0x1,
+ 0xf7, 0x5c, 0xeb, 0x3, 0xf7, 0x5c, 0x16, 0xeb,
+ 0xf8, 0x36, 0xf7, 0x38, 0xea, 0xfb, 0x38, 0xf7,
+ 0x47, 0x2b, 0xfb, 0x47, 0xfb, 0x39, 0x2c, 0xf7,
+ 0x39, 0x6, 0xe, 0x59, 0x83, 0x56, 0xa, 0x8d,
+ 0x77, 0xb4, 0x5e, 0xa, 0x12, 0xb9, 0x56, 0xa,
+ 0xa2, 0x5e, 0xa, 0x13, 0xb2, 0x9a, 0x96, 0x96,
+ 0xa0, 0xb9, 0xf8, 0x19, 0x15, 0x57, 0xb2, 0x70,
+ 0xbb, 0xa3, 0xa3, 0x92, 0x90, 0xa2, 0x1e, 0x90,
+ 0xa6, 0xa7, 0x8f, 0xa6, 0x1b, 0x92, 0xa1, 0x8b,
+ 0x81, 0x1f, 0x13, 0x74, 0x9a, 0x95, 0xa, 0xa0,
+ 0x84, 0x7a, 0x82, 0x85, 0x89, 0x1e, 0x74, 0x81,
+ 0x73, 0x83, 0x72, 0x84, 0x8, 0x56, 0x7d, 0x3f,
+ 0x80, 0x43, 0x1a, 0x61, 0xaf, 0x69, 0xb5, 0xbf,
+ 0xa5, 0xbe, 0xb0, 0xa4, 0x1e, 0x98, 0x9f, 0x9a,
+ 0x9d, 0x9b, 0x9d, 0x8, 0x92, 0x91, 0x99, 0x9b,
+ 0x95, 0x1b, 0x13, 0xb4, 0x9a, 0x96, 0x56, 0x60,
+ 0x8f, 0x8f, 0x88, 0x86, 0x85, 0x87, 0x81, 0x89,
+ 0x85, 0x1f, 0x82, 0x73, 0x80, 0x74, 0x7e, 0x75,
+ 0x8, 0x78, 0x6a, 0x71, 0x6a, 0x63, 0x1a, 0x61,
+ 0xac, 0x6a, 0xb5, 0xbf, 0xa6, 0xb2, 0xbb, 0xa3,
+ 0x84, 0xa3, 0x86, 0xa2, 0x1e, 0x86, 0xa6, 0x87,
+ 0xa7, 0xa6, 0x1a, 0x13, 0xb2, 0x9a, 0x96, 0x56,
+ 0x88, 0x92, 0x8b, 0xa1, 0x95, 0x1e, 0x13, 0xa8,
+ 0x2a, 0x96, 0x56, 0xa0, 0x92, 0x94, 0x7a, 0x85,
+ 0x8d, 0x1f, 0x95, 0x74, 0x93, 0x73, 0x92, 0x72,
+ 0x8, 0x65, 0xa, 0x56, 0x99, 0x96, 0x3f, 0xd3,
+ 0x1b, 0x70, 0xa, 0xb5, 0xad, 0xaf, 0xb5, 0xbf,
+ 0x58, 0xa5, 0x66, 0xa4, 0x1f, 0x77, 0x98, 0x79,
+ 0x9a, 0x79, 0x9b, 0x8, 0x13, 0xb2, 0x9a, 0x96,
+ 0x56, 0x90, 0x86, 0x90, 0x79, 0x9b, 0x93, 0x1a,
+ 0x13, 0xb2, 0x99, 0x96, 0x56, 0xa0, 0x8f, 0x8f,
+ 0x90, 0x8f, 0x91, 0x95, 0x87, 0x89, 0x91, 0x1e,
+ 0xa3, 0x82, 0xa2, 0x80, 0xa1, 0x7e, 0x8, 0x78,
+ 0xac, 0xac, 0x71, 0xb3, 0x1b, 0xb5, 0xac, 0xac,
+ 0xb5, 0xbf, 0x64, 0xa6, 0x5b, 0x1f, 0x70, 0xa,
+ 0x73, 0x73, 0x84, 0x86, 0x74, 0x1f, 0x86, 0x70,
+ 0x6f, 0x87, 0x70, 0x1b, 0x13, 0xb2, 0x9a, 0x36,
+ 0x56, 0xa0, 0x84, 0x75, 0x8b, 0x95, 0x1f, 0x13,
+ 0xb2, 0x9a, 0x96, 0x60, 0xa0, 0x92, 0x9c, 0x94,
+ 0x91, 0x8d, 0x1e, 0xa2, 0x95, 0xa3, 0x93, 0xa4,
+ 0x92, 0x8, 0xc0, 0x99, 0xd7, 0x96, 0xd3, 0x1a,
+ 0x6f, 0xa, 0xb5, 0x67, 0xad, 0x61, 0x57, 0x71,
+ 0x58, 0x66, 0x72, 0x1e, 0x7e, 0x77, 0x7c, 0x79,
+ 0x7b, 0x79, 0x8, 0x13, 0xb2, 0x9a, 0x56, 0x56,
+ 0xa0, 0x84, 0x85, 0x7d, 0x7b, 0x81, 0x1b, 0x87,
+ 0x87, 0x8e, 0x90, 0x91, 0x8f, 0x95, 0x8d, 0x91,
+ 0x1f, 0x94, 0xa3, 0x96, 0xa2, 0x98, 0xa1, 0x8,
+ 0x9e, 0xac, 0xa5, 0xac, 0xb3, 0x1a, 0xb5, 0x6a,
+ 0xac, 0x61, 0x57, 0x70, 0x64, 0x5b, 0x1e, 0x6f,
+ 0xa, 0x73, 0x92, 0x73, 0x90, 0x74, 0x1e, 0x90,
+ 0x70, 0x8f, 0x6f, 0x70, 0x1a, 0x84, 0x8b, 0x75,
+ 0x81, 0x1e, 0x13, 0xb3, 0x2, 0x8e, 0x96, 0xa0,
+ 0x84, 0x82, 0x9c, 0x91, 0x89, 0x1f, 0x81, 0xa2,
+ 0x83, 0xa3, 0x84, 0xa4, 0x8, 0xc0, 0x7d, 0x80,
+ 0xd7, 0x43, 0x1b, 0x61, 0x69, 0x67, 0x61, 0x57,
+ 0xbe, 0x71, 0xb0, 0x72, 0x1f, 0x9f, 0x7e, 0x9d,
+ 0x7c, 0x9d, 0x7b, 0x8, 0x91, 0x85, 0x9c, 0x7c,
+ 0x82, 0x1a, 0x86, 0x87, 0x88, 0x87, 0x85, 0x81,
+ 0x8f, 0x8d, 0x85, 0x1e, 0x73, 0x94, 0x74, 0x96,
+ 0x75, 0x98, 0x8, 0x9e, 0x6a, 0x6a, 0xa5, 0x63,
+ 0x1b, 0x61, 0x6a, 0x6a, 0x61, 0x1f, 0xf8, 0x2c,
+ 0x8c, 0x15, 0xa3, 0xa0, 0xa2, 0xa0, 0x9e, 0xa4,
+ 0x8, 0x13, 0xb2, 0x99, 0x96, 0x56, 0xa0, 0xa4,
+ 0x9e, 0xa4, 0xb2, 0xaf, 0x1b, 0x13, 0xb2, 0x9a,
+ 0x96, 0x56, 0x90, 0x9e, 0x9c, 0x7a, 0x78, 0x65,
+ 0x51, 0x7a, 0x6e, 0x81, 0x1f, 0x6c, 0x81, 0x6e,
+ 0x7d, 0x6f, 0x7c, 0x8, 0x4f, 0xb0, 0x15, 0x8d,
+ 0xaa, 0x8c, 0xab, 0x87, 0xaa, 0x8, 0x89, 0x9b,
+ 0x88, 0x9c, 0x9b, 0x1a, 0x13, 0xb2, 0x9a, 0x36,
+ 0x56, 0xa0, 0xa5, 0x94, 0xaf, 0xab, 0x1e, 0x70,
+ 0xa, 0xa4, 0x97, 0x7b, 0x73, 0x6d, 0x7e, 0x76,
+ 0x7e, 0x71, 0x1f, 0x7d, 0x6e, 0x7f, 0x6d, 0x82,
+ 0x6c, 0x8, 0xc5, 0x2d, 0x15, 0x8d, 0x96, 0xaa,
+ 0x89, 0xab, 0x8a, 0xaa, 0x8f, 0x19, 0x8d, 0x9b,
+ 0x9c, 0x8e, 0x9b, 0x1b, 0x13, 0xb4, 0x9a, 0x96,
+ 0x56, 0x88, 0xa5, 0xaf, 0x82, 0x6b, 0x72, 0x7b,
+ 0x7f, 0x73, 0x6d, 0x76, 0x98, 0x98, 0x71, 0x1f,
+ 0x6e, 0x99, 0x6d, 0x97, 0x6c, 0x94, 0x8, 0xfb,
+ 0x12, 0xd9, 0x15, 0x76, 0xa3, 0x76, 0xa2, 0x72,
+ 0x9e, 0x8, 0x72, 0x9e, 0x64, 0xa4, 0xaf, 0x1a,
+ 0x13, 0xb2, 0x9a, 0x56, 0x56, 0xa0, 0x9e, 0x9c,
+ 0x9c, 0x9e, 0xb1, 0x9c, 0x51, 0x6e, 0x95, 0x1e,
+ 0x95, 0x6c, 0x99, 0x6e, 0x9a, 0x6f, 0x8, 0x13,
+ 0xb3, 0x2, 0x96, 0x56, 0xa0, 0x89, 0x2a, 0x15,
+ 0x8e, 0xa0, 0x5, 0x65, 0xa, 0x7f, 0x9d, 0x9c,
+ 0x98, 0x5, 0x13, 0xb2, 0x9a, 0x96, 0x60, 0xa0,
+ 0x90, 0xa0, 0xa0, 0x88, 0x9d, 0x97, 0x98, 0x7a,
+ 0x5, 0x13, 0xa8, 0x2a, 0x96, 0x56, 0xa0, 0xa0,
+ 0x86, 0x5, 0x65, 0xa, 0x88, 0x76, 0x97, 0x79,
+ 0x7a, 0x7e, 0x5, 0x13, 0xb2, 0x9a, 0x95, 0xa,
+ 0xa0, 0x86, 0x76, 0x76, 0x8e, 0x79, 0x7f, 0x7e,
+ 0x9c, 0x5, 0x13, 0xb3, 0x2, 0x96, 0x56, 0xa0,
+ 0xca, 0x6b, 0x15, 0x94, 0x92, 0xa0, 0x73, 0xa0,
+ 0x74, 0xa4, 0x78, 0x19, 0x13, 0x72, 0x9a, 0x96,
+ 0x56, 0x60, 0xa4, 0x78, 0xb2, 0x72, 0x67, 0x1a,
+ 0x78, 0x7a, 0x7a, 0x78, 0x65, 0x7a, 0xc5, 0xa8,
+ 0x81, 0x1e, 0x81, 0xaa, 0x7d, 0xa8, 0x7c, 0xa7,
+ 0x8, 0xfb, 0xb, 0xd5, 0x15, 0x65, 0xa, 0x8c,
+ 0x7b, 0x7b, 0x8c, 0x7b, 0x1b, 0x7c, 0x7b, 0x8a,
+ 0x89, 0x7c, 0x1f, 0x89, 0x7b, 0x7a, 0x88, 0x7b,
+ 0x1b, 0x71, 0x67, 0x94, 0xab, 0x1f, 0x6f, 0xa,
+ 0xa4, 0x9b, 0x97, 0xa3, 0xa9, 0xa0, 0x7e, 0x7e,
+ 0xa5, 0x1e, 0xa8, 0x7d, 0xa9, 0x7f, 0xaa, 0x82,
+ 0x8, 0xc5, 0x2d, 0x15, 0x96, 0x89, 0x89, 0x6c,
+ 0x8a, 0x6b, 0x8f, 0x6c, 0x19, 0x8d, 0x7b, 0x8e,
+ 0x7a, 0x7b, 0x1a, 0x13, 0xb2, 0x9a, 0x8e, 0x96,
+ 0xa0, 0x71, 0x82, 0x67, 0x6b, 0x72, 0x7f, 0x9b,
+ 0xa3, 0xa9, 0x98, 0xa0, 0x98, 0xa5, 0x1e, 0x99,
+ 0xa8, 0x97, 0xa9, 0x94, 0xaa, 0x8, 0x5a, 0xae,
+ 0x15, 0x92, 0x82, 0x73, 0x76, 0x74, 0x76, 0x78,
+ 0x72, 0x19, 0x72, 0x78, 0x72, 0x64, 0x67, 0x1b,
+ 0x78, 0x7a, 0x9c, 0x9e, 0xb1, 0xc5, 0x9c, 0xa8,
+ 0x95, 0x1f, 0xaa, 0x95, 0xa8, 0x99, 0xa7, 0x9a,
+ 0x8, 0xe, 0x59, 0x94, 0x76, 0xa9, 0x76, 0xf7,
+ 0x6d, 0x9e, 0xf7, 0x69, 0x9e, 0xf7, 0x7a, 0x77,
+ 0x12, 0xf7, 0xa3, 0x9b, 0xf7, 0x6b, 0x9c, 0x13,
+ 0xbe, 0xf7, 0x2c, 0xdf, 0x15, 0xf7, 0x55, 0xf7,
+ 0x16, 0xb8, 0xfb, 0x76, 0x5, 0x13, 0x7e, 0x9c,
+ 0x94, 0x5, 0x87, 0xb9, 0xf7, 0x6e, 0x8b, 0x1f,
+ 0xf7, 0x50, 0xfb, 0x11, 0x98, 0x91, 0xfb, 0x17,
+ 0xf7, 0x54, 0xf7, 0x75, 0xb9, 0x91, 0x98, 0xfb,
+ 0x7b, 0xb7, 0xf7, 0x11, 0xf7, 0x4f, 0x86, 0x9c,
+ 0xfb, 0x56, 0xfb, 0x16, 0x5d, 0xf7, 0x7a, 0x7e,
+ 0x85, 0x5e, 0xfb, 0x75, 0xfb, 0x4e, 0xf7, 0x10,
+ 0x7c, 0x85, 0xf7, 0x17, 0xfb, 0x54, 0xfb, 0x71,
+ 0x5f, 0x80, 0x7d, 0xf7, 0x7c, 0x5e, 0xfb, 0x10,
+ 0xfb, 0x4b, 0x5, 0xf7, 0x20, 0xf7, 0x80, 0x15,
+ 0xc6, 0xbc, 0xba, 0xc6, 0xc6, 0xbb, 0x5c, 0x50,
+ 0x50, 0x5a, 0x5b, 0x50, 0x50, 0x5b, 0xbb, 0xc6,
+ 0x1e, 0xe, 0xfb, 0x18, 0x97, 0xc3, 0x92, 0xd6,
+ 0xae, 0xac, 0x6a, 0xe6, 0x77, 0x9f, 0x97, 0xc1,
+ 0x64, 0x9f, 0x9a, 0xc1, 0x68, 0x9f, 0xa6, 0x9f,
+ 0x77, 0xe6, 0x6a, 0xac, 0x94, 0x77, 0xb0, 0x77,
+ 0xa8, 0xd6, 0x92, 0xc3, 0x12, 0xa0, 0xd1, 0x8d,
+ 0xb4, 0xc8, 0xa1, 0x85, 0xcd, 0x73, 0x9f, 0xa2,
+ 0xb5, 0x65, 0xa5, 0x80, 0xaa, 0x99, 0xaa, 0x74,
+ 0xb5, 0x6d, 0xa5, 0xa2, 0xcd, 0x4d, 0x9f, 0xaf,
+ 0xa1, 0xc8, 0xb4, 0x8d, 0xd1, 0x13, 0xec, 0xd7,
+ 0xec, 0x33, 0xf8, 0x8, 0xf8, 0x30, 0x15, 0x8e,
+ 0x8f, 0x92, 0x8d, 0x8c, 0x1f, 0x95, 0x9c, 0x98,
+ 0x9a, 0x9a, 0x98, 0x98, 0x97, 0x9a, 0x94, 0x9b,
+ 0x92, 0x8, 0x8d, 0x8c, 0x90, 0x8e, 0x8e, 0x1a,
+ 0x13, 0xea, 0xcb, 0xea, 0x53, 0x8e, 0x85, 0x8b,
+ 0x89, 0x63, 0x56, 0x67, 0x60, 0x89, 0x8b, 0x80,
+ 0x8f, 0x1e, 0xc0, 0x58, 0x15, 0x87, 0x95, 0x8b,
+ 0x8d, 0x9f, 0x9e, 0x87, 0x85, 0x9e, 0x1e, 0x9c,
+ 0x85, 0x9a, 0x83, 0x99, 0x81, 0x8, 0x89, 0x8d,
+ 0x8e, 0x8a, 0x8e, 0x1b, 0x8d, 0x8c, 0x8b, 0x8d,
+ 0x8e, 0x89, 0x8f, 0x89, 0x8d, 0x1f, 0xa5, 0x7a,
+ 0x68, 0x9f, 0x6c, 0x1b, 0x83, 0x6b, 0x85, 0x81,
+ 0x1f, 0xfb, 0x13, 0xa9, 0x15, 0x8d, 0x8b, 0x8c,
+ 0x8d, 0x1f, 0x13, 0xec, 0xd7, 0xec, 0x93, 0x8e,
+ 0x89, 0x8f, 0x89, 0x8e, 0x1e, 0x81, 0x9c, 0x85,
+ 0x9f, 0x87, 0x9e, 0x8, 0x89, 0x96, 0x8a, 0x96,
+ 0x97, 0x92, 0x8c, 0x91, 0x92, 0x1a, 0x8d, 0x8b,
+ 0x90, 0x88, 0x80, 0x84, 0x5e, 0x82, 0x70, 0x95,
+ 0x6e, 0xa3, 0x7c, 0x1e, 0x89, 0x8e, 0x90, 0x88,
+ 0x8e, 0x1b, 0x13, 0xec, 0xd7, 0xd4, 0x33, 0xfb,
+ 0xa9, 0xfb, 0x4, 0x15, 0x4c, 0xcf, 0x6c, 0xc1,
+ 0xcb, 0xc2, 0xb0, 0xb7, 0xb6, 0x1e, 0x93, 0x93,
+ 0x95, 0x92, 0x97, 0x1b, 0x9b, 0x94, 0x7e, 0x7c,
+ 0x1f, 0x13, 0xeb, 0x57, 0xec, 0x8f, 0x73, 0x80,
+ 0x6c, 0x7c, 0x79, 0x1e, 0x78, 0x74, 0x72, 0x7e,
+ 0x6e, 0x87, 0x8, 0x69, 0x86, 0x7b, 0x71, 0x6a,
+ 0x1a, 0x63, 0xa9, 0x73, 0xb2, 0xca, 0xbc, 0xcc,
+ 0xc4, 0x95, 0x1e, 0x8e, 0x9a, 0x8c, 0x9a, 0x9b,
+ 0x1a, 0xa7, 0x85, 0xa5, 0x84, 0xa6, 0x1e, 0x8a,
+ 0x90, 0x8a, 0x91, 0x91, 0x1a, 0x9b, 0x94, 0x98,
+ 0x9c, 0x1e, 0x13, 0xeb, 0x27, 0xe9, 0x53, 0x91,
+ 0x8f, 0x8a, 0x88, 0x90, 0x1f, 0xac, 0x76, 0xa3,
+ 0x66, 0x63, 0x6f, 0x7d, 0x78, 0x77, 0x1a, 0x6a,
+ 0xb0, 0x6d, 0xab, 0xb7, 0xa4, 0xbb, 0xb2, 0xb7,
+ 0x74, 0xb8, 0x69, 0xa7, 0x1e, 0x67, 0xaa, 0x69,
+ 0x98, 0x5e, 0x97, 0x8, 0x7d, 0x8f, 0x7a, 0x94,
+ 0x9c, 0x1a, 0xa9, 0xbe, 0x94, 0xa2, 0x1e, 0xda,
+ 0x8e, 0x49, 0xbb, 0x1b, 0xae, 0xaf, 0xa5, 0xb0,
+ 0xca, 0x47, 0xaa, 0x55, 0x4b, 0x54, 0x66, 0x5f,
+ 0x60, 0x1f, 0x13, 0xec, 0xd7, 0xea, 0x93, 0x83,
+ 0x83, 0x81, 0x84, 0x7f, 0x1b, 0x7b, 0x82, 0x98,
+ 0x9a, 0x1f, 0x13, 0xec, 0xd7, 0xe9, 0x93, 0xa3,
+ 0x96, 0xaa, 0x9a, 0x9d, 0x1e, 0x9e, 0xa2, 0xa4,
+ 0x98, 0xa8, 0x8f, 0x8, 0xad, 0x90, 0x9b, 0xa5,
+ 0xac, 0x1a, 0xb3, 0x6d, 0xa3, 0x64, 0x4c, 0x5a,
+ 0x4a, 0x52, 0x81, 0x1e, 0x88, 0x7c, 0x8a, 0x7c,
+ 0x7b, 0x1a, 0x6f, 0x91, 0x71, 0x92, 0x70, 0x1e,
+ 0x8c, 0x86, 0x8c, 0x85, 0x85, 0x1a, 0x7b, 0x82,
+ 0x7e, 0x7a, 0x1e, 0x13, 0xd4, 0xd7, 0xd4, 0x93,
+ 0x85, 0x87, 0x8c, 0x8e, 0x86, 0x1f, 0x6a, 0xa0,
+ 0x73, 0xb0, 0xb3, 0xa7, 0x99, 0x9e, 0x9f, 0x1a,
+ 0xac, 0x66, 0xa9, 0x6b, 0x5f, 0x72, 0x5b, 0x64,
+ 0x5f, 0xa2, 0x5e, 0xad, 0x6f, 0x1e, 0xaf, 0x6c,
+ 0xad, 0x7e, 0xb8, 0x7f, 0x8, 0x99, 0x87, 0x9c,
+ 0x82, 0x7a, 0x1a, 0x6d, 0x58, 0x82, 0x74, 0x56,
+ 0x78, 0xa9, 0x9f, 0x76, 0x1e, 0x94, 0x81, 0x80,
+ 0x92, 0x7b, 0x1b, 0x68, 0x67, 0x71, 0x66, 0x1f,
+ 0x13, 0xec, 0xd7, 0xec, 0x33, 0xf8, 0x15, 0x92,
+ 0x15, 0x13, 0xec, 0xd7, 0xec, 0x4f, 0x88, 0x8d,
+ 0x87, 0x8d, 0x88, 0x1e, 0x95, 0x7a, 0x91, 0x77,
+ 0x8f, 0x78, 0x8, 0x8d, 0x80, 0x8c, 0x80, 0x7f,
+ 0x84, 0x8a, 0x85, 0x84, 0x1a, 0x89, 0x8b, 0x86,
+ 0x8e, 0x96, 0x92, 0xb8, 0x94, 0xa6, 0x81, 0xa8,
+ 0x73, 0x9a, 0x1e, 0x8d, 0x88, 0x86, 0x8e, 0x88,
+ 0x1b, 0x13, 0xea, 0xd7, 0xd4, 0x33, 0x89, 0x8b,
+ 0x8a, 0x89, 0x1f, 0xfb, 0x8c, 0xca, 0x15, 0x71,
+ 0x9c, 0xae, 0x77, 0xaa, 0x1b, 0x93, 0xab, 0x91,
+ 0x95, 0x8f, 0x81, 0x8b, 0x89, 0x77, 0x78, 0x8f,
+ 0x91, 0x78, 0x1f, 0x7a, 0x91, 0x7c, 0x93, 0x7d,
+ 0x95, 0x8, 0x8d, 0x89, 0x88, 0x8c, 0x88, 0x1b,
+ 0x89, 0x8a, 0x8b, 0x89, 0x88, 0x8d, 0x87, 0x8d,
+ 0x89, 0x1f, 0xda, 0xfb, 0x3e, 0x15, 0x88, 0x91,
+ 0x8b, 0x8d, 0xb3, 0xc0, 0xaf, 0xb6, 0x8d, 0x8b,
+ 0x96, 0x87, 0x1e, 0x13, 0xeb, 0x57, 0xea, 0x33,
+ 0x88, 0x87, 0x84, 0x89, 0x8a, 0x1f, 0x81, 0x7a,
+ 0x7e, 0x7c, 0x7c, 0x7e, 0x7e, 0x7f, 0x7c, 0x82,
+ 0x7b, 0x84, 0x8, 0x89, 0x8a, 0x86, 0x88, 0x88,
+ 0x1a, 0xf7, 0x68, 0xf7, 0x88, 0x15, 0xa6, 0xa8,
+ 0xb3, 0x97, 0xb2, 0x1b, 0xa3, 0xad, 0x81, 0x6d,
+ 0x79, 0x7f, 0x7f, 0x79, 0x82, 0x84, 0x8e, 0x90,
+ 0x84, 0x1f, 0x6d, 0xa3, 0x5e, 0x91, 0x67, 0x7f,
+ 0x8, 0xfb, 0xe, 0xba, 0x15, 0x89, 0x95, 0x8a,
+ 0x94, 0x95, 0x1a, 0xb0, 0xa3, 0xdc, 0xb9, 0x9b,
+ 0x9c, 0x7e, 0x7a, 0x7e, 0x7f, 0x7e, 0x80, 0x86,
+ 0x1e, 0x6a, 0x7e, 0x69, 0x65, 0x86, 0x67, 0x8,
+ 0xf7, 0x1f, 0xfb, 0x3a, 0x15, 0xb4, 0x7e, 0xc5,
+ 0x58, 0x5c, 0x1a, 0x77, 0x7f, 0x7a, 0x76, 0x79,
+ 0x7f, 0x9c, 0x9c, 0x1e, 0x13, 0xec, 0xd7, 0xec,
+ 0x2f, 0x91, 0x8d, 0x91, 0x91, 0x1a, 0xaa, 0x7b,
+ 0xb5, 0x72, 0x9e, 0x1e, 0xfb, 0x81, 0xe3, 0x15,
+ 0x62, 0x98, 0x51, 0xbe, 0xba, 0x1a, 0x9f, 0x97,
+ 0x9c, 0xa0, 0x9d, 0x97, 0x7a, 0x7a, 0x1e, 0x85,
+ 0x89, 0x85, 0x85, 0x1a, 0x6c, 0x9b, 0x61, 0xa4,
+ 0x78, 0x1e, 0xf7, 0x21, 0xfb, 0x3f, 0x15, 0x8d,
+ 0x81, 0x8c, 0x82, 0x81, 0x1a, 0x66, 0x73, 0x3a,
+ 0x5d, 0x1e, 0x13, 0xec, 0xd7, 0xd2, 0x93, 0x7b,
+ 0x7a, 0x98, 0x9c, 0x98, 0x97, 0x98, 0x96, 0x90,
+ 0x1f, 0xac, 0x98, 0xad, 0xb1, 0x90, 0xaf, 0x8,
+ 0xfb, 0x7, 0xb4, 0x15, 0x70, 0x6e, 0x63, 0x7f,
+ 0x64, 0x1b, 0x73, 0x69, 0x95, 0xa9, 0x9d, 0x97,
+ 0x97, 0x9d, 0x94, 0x92, 0x88, 0x86, 0x92, 0x1f,
+ 0x7a, 0xa0, 0xa7, 0x84, 0xa6, 0x1b, 0x97, 0x97,
+ 0x8c, 0x90, 0x96, 0x1f, 0xe, 0xfb, 0x2c, 0x99,
+ 0x76, 0xf9, 0x4a, 0x77, 0x1, 0xf7, 0xda, 0xaf,
+ 0x3, 0xd1, 0xf7, 0xd, 0x15, 0xae, 0x81, 0xa3,
+ 0xdf, 0xc3, 0xab, 0x70, 0x2b, 0xae, 0x81, 0xb0,
+ 0xf7, 0x18, 0xdc, 0xba, 0x9a, 0x82, 0x5, 0x2e,
+ 0x7, 0x2b, 0x29, 0xa5, 0x71, 0xd1, 0xd3, 0x5,
+ 0x4a, 0x7, 0x4e, 0x4c, 0xa5, 0x72, 0xc0, 0xc1,
+ 0xc0, 0x55, 0xa5, 0xa4, 0x4e, 0xca, 0x5, 0xcc,
+ 0x7, 0xd1, 0x43, 0xa5, 0xa5, 0x2b, 0xed, 0x5,
+ 0xe8, 0x7, 0x9a, 0x94, 0xdc, 0x5c, 0xb0, 0xfb,
+ 0x18, 0xae, 0x95, 0x70, 0xeb, 0xc3, 0x6b, 0xa3,
+ 0x37, 0xae, 0x95, 0x77, 0xd4, 0xd4, 0x9d, 0x82,
+ 0xae, 0x36, 0x76, 0x53, 0xac, 0xec, 0xa3, 0x82,
+ 0xaf, 0xfb, 0x19, 0x69, 0x3a, 0xb9, 0x5, 0x9d,
+ 0x7, 0xdc, 0xb9, 0xf7, 0x19, 0x69, 0x94, 0xaf,
+ 0x2a, 0xa3, 0xc3, 0xac, 0xe0, 0x76, 0x94, 0xae,
+ 0x42, 0x9e, 0x9f, 0xd3, 0x68, 0x95, 0x73, 0x37,
+ 0x53, 0x6b, 0xa6, 0xeb, 0x68, 0x95, 0x66, 0xfb,
+ 0x18, 0x3a, 0x5c, 0x7c, 0x94, 0x5, 0xe8, 0x7,
+ 0xeb, 0xed, 0x71, 0xa5, 0x45, 0x43, 0x5, 0xcc,
+ 0x7, 0xc8, 0xca, 0x71, 0xa4, 0x56, 0x55, 0x56,
+ 0xc1, 0x71, 0x72, 0xc8, 0x4c, 0x5, 0x4a, 0x7,
+ 0x45, 0xd3, 0x71, 0x71, 0xeb, 0x29, 0x5, 0x2e,
+ 0x7, 0x7c, 0x82, 0x3a, 0xba, 0x66, 0xf7, 0x18,
+ 0x68, 0x81, 0xa6, 0x2b, 0x53, 0xab, 0x73, 0xdf,
+ 0x68, 0x81, 0x9f, 0x43, 0x42, 0x78, 0x94, 0x68,
+ 0xe0, 0xa0, 0xc3, 0x6a, 0x2a, 0x73, 0x94, 0x67,
+ 0xf7, 0x19, 0xad, 0xdc, 0x5d, 0x5, 0x79, 0x7,
+ 0x3a, 0x5d, 0xfb, 0x19, 0xad, 0x82, 0x67, 0xec,
+ 0x73, 0x53, 0x6a, 0x36, 0xa0, 0x82, 0x68, 0xd4,
+ 0x78, 0x5, 0xe, 0xfb, 0x23, 0x9e, 0x76, 0xf9,
+ 0x40, 0x77, 0x12, 0xf7, 0x71, 0xb0, 0xd0, 0xb3,
+ 0x64, 0xb3, 0xcf, 0xb0, 0x67, 0xb0, 0x13, 0xf2,
+ 0xdb, 0xf7, 0xc, 0x15, 0xb1, 0x7f, 0xa3, 0xe5,
+ 0xdd, 0xba, 0x86, 0x27, 0xa4, 0x7d, 0x5, 0x13,
+ 0xea, 0xdf, 0xc1, 0x5, 0x2d, 0x7, 0x49, 0x49,
+ 0xa8, 0x70, 0xc4, 0xc4, 0xc4, 0x52, 0xa8, 0xa6,
+ 0x49, 0xcd, 0x5, 0xe9, 0x7, 0xdf, 0x55, 0xa4,
+ 0x99, 0x86, 0xef, 0xdd, 0x5c, 0xa3, 0x31, 0xb1,
+ 0x97, 0x76, 0xd9, 0xd9, 0x9f, 0x82, 0xb2, 0x31,
+ 0x73, 0x39, 0xba, 0xe4, 0xb9, 0x5, 0xa7, 0x7,
+ 0x32, 0xb9, 0xdd, 0xba, 0xe5, 0x73, 0x94, 0xb2,
+ 0x3d, 0xa0, 0xa0, 0xd8, 0x65, 0x97, 0x73, 0x31,
+ 0x39, 0x5c, 0x90, 0xef, 0x72, 0x99, 0x37, 0x55,
+ 0x5, 0xe9, 0x7, 0xcd, 0xcd, 0x6e, 0xa6, 0x52,
+ 0x52, 0x52, 0xc4, 0x6e, 0x70, 0xcd, 0x49, 0x5,
+ 0x2d, 0x7, 0x37, 0xc1, 0x72, 0x7d, 0x90, 0x27,
+ 0x39, 0xba, 0x73, 0xe5, 0x65, 0x7f, 0xa0, 0x3e,
+ 0x3d, 0x76, 0x94, 0x64, 0xe5, 0xa3, 0xdd, 0x5c,
+ 0x32, 0x5d, 0x5, 0x6f, 0x7, 0xe4, 0x5d, 0x39,
+ 0x5c, 0x31, 0xa3, 0x82, 0x64, 0xd9, 0x76, 0x5,
+ 0xf7, 0x9f, 0xf7, 0x46, 0x15, 0xd9, 0x7, 0xd2,
+ 0xb7, 0x5, 0x13, 0xf4, 0x88, 0x38, 0x5, 0x13,
+ 0xea, 0x5b, 0x41, 0x15, 0xcf, 0xb2, 0xd5, 0x64,
+ 0x41, 0x64, 0x5, 0xfb, 0x14, 0xd5, 0x15, 0x47,
+ 0xb2, 0x88, 0xde, 0xd2, 0x5f, 0x5, 0xb3, 0xfb,
+ 0x76, 0x15, 0xd9, 0x7, 0x13, 0xf4, 0xcf, 0x64,
+ 0x8e, 0x38, 0x5, 0x13, 0xea, 0xfb, 0x5b, 0xf7,
+ 0xa, 0x15, 0x41, 0xb2, 0xd5, 0xb2, 0xcf, 0x64,
+ 0x5, 0x58, 0xfb, 0x31, 0x15, 0x8e, 0xde, 0xcf,
+ 0xb2, 0x5, 0x3d, 0x7, 0xe, 0xfb, 0x2a, 0x9b,
+ 0x76, 0xf9, 0x46, 0x77, 0x1, 0xf7, 0xd2, 0xbf,
+ 0x3, 0xd3, 0xf7, 0xe, 0x15, 0xbd, 0x7d, 0xa3,
+ 0xe2, 0xac, 0x9e, 0x74, 0x35, 0xbc, 0x7e, 0xb0,
+ 0xf7, 0x1c, 0xd4, 0xb5, 0x8e, 0x8a, 0x5, 0x36,
+ 0x7, 0x28, 0x27, 0xaf, 0x67, 0xca, 0xca, 0x5,
+ 0x65, 0x7, 0x4b, 0x4b, 0xb0, 0x66, 0xc0, 0xbf,
+ 0xc0, 0x57, 0xb0, 0xb0, 0x4b, 0xcb, 0x5, 0xb1,
+ 0x7, 0xca, 0x4c, 0xaf, 0xaf, 0x28, 0xef, 0x5,
+ 0xe0, 0x7, 0x8e, 0x8c, 0xd4, 0x61, 0xb0, 0xfb,
+ 0x1c, 0xbc, 0x98, 0x74, 0xe1, 0xac, 0x78, 0xa3,
+ 0x34, 0xbd, 0x99, 0x79, 0xd3, 0xd2, 0x9e, 0x7e,
+ 0xbe, 0x33, 0x74, 0x6a, 0x9e, 0xe1, 0xa2, 0x7e,
+ 0xbc, 0xfb, 0x1c, 0x67, 0x42, 0xb6, 0x75, 0xa,
+ 0xd4, 0xb6, 0xf7, 0x1c, 0x67, 0x98, 0xbc, 0x35,
+ 0xa2, 0xac, 0x9e, 0xe3, 0x74, 0x98, 0xbe, 0x44,
+ 0x9f, 0x9d, 0xd2, 0x59, 0x99, 0x73, 0x34, 0x6a,
+ 0x78, 0xa2, 0xe1, 0x5a, 0x98, 0x66, 0xfb, 0x1c,
+ 0x42, 0x61, 0x88, 0x8c, 0x5, 0xe0, 0x7, 0xee,
+ 0xef, 0x67, 0xaf, 0x4c, 0x4c, 0x5, 0xb1, 0x7,
+ 0xcb, 0xcb, 0x66, 0xb0, 0x56, 0x57, 0x56, 0xbf,
+ 0x66, 0x66, 0xcb, 0x4b, 0x5, 0x65, 0x7, 0x4c,
+ 0xca, 0x67, 0x67, 0xee, 0x27, 0x5, 0x36, 0x7,
+ 0x88, 0x8a, 0x42, 0xb5, 0x66, 0xf7, 0x1c, 0x5a,
+ 0x7e, 0xa2, 0x35, 0x6a, 0x9e, 0x73, 0xe2, 0x59,
+ 0x7d, 0x9d, 0x44, 0x44, 0x77, 0x98, 0x58, 0xe3,
+ 0xa2, 0xac, 0x78, 0x35, 0x74, 0x98, 0x5a, 0xf7,
+ 0x1c, 0xaf, 0xd4, 0x60, 0x80, 0xa, 0x42, 0x60,
+ 0xfb, 0x1c, 0xaf, 0x7e, 0x5a, 0xe1, 0x74, 0x6a,
+ 0x78, 0x33, 0xa2, 0x7e, 0x58, 0xd2, 0x77, 0x5,
+ 0xe, 0x56, 0x97, 0x76, 0xa5, 0x76, 0xf7, 0xdc,
+ 0xaa, 0xf7, 0xe2, 0x77, 0x12, 0xf8, 0xd, 0xaa,
+ 0x13, 0xb8, 0xf8, 0x30, 0xf8, 0x13, 0x15, 0x94,
+ 0x86, 0xf7, 0x3d, 0xf7, 0x8f, 0x76, 0x8f, 0x81,
+ 0x91, 0x7d, 0x9b, 0x19, 0xfb, 0x1, 0xfb, 0xbc,
+ 0x15, 0xf7, 0xa4, 0xf7, 0x19, 0x7b, 0x99, 0x85,
+ 0x95, 0x87, 0xa0, 0x19, 0xfb, 0x8f, 0xfb, 0x3d,
+ 0x5, 0x60, 0x9e, 0x15, 0x95, 0x6, 0xa0, 0xf7,
+ 0xc2, 0x5, 0x88, 0x82, 0x83, 0x89, 0x83, 0x1b,
+ 0x83, 0x83, 0x8c, 0x8f, 0x80, 0x1f, 0xd4, 0xfb,
+ 0xf6, 0x15, 0xf7, 0xc2, 0x76, 0x5, 0x87, 0x95,
+ 0x8a, 0x93, 0x93, 0x1a, 0x93, 0x8c, 0x93, 0x8f,
+ 0x95, 0x1e, 0xfb, 0xc2, 0x76, 0x5, 0x40, 0xac,
+ 0x15, 0x94, 0x90, 0xfb, 0x19, 0xf7, 0xa4, 0x7d,
+ 0x7b, 0x81, 0x85, 0x76, 0x87, 0x19, 0xf7, 0x7f,
+ 0xfb, 0xd1, 0x15, 0xf7, 0x8f, 0xfb, 0x3d, 0x8f,
+ 0xa0, 0x91, 0x95, 0x9b, 0x99, 0x19, 0xfb, 0xa4,
+ 0xf7, 0x19, 0x5, 0x35, 0xb1, 0x15, 0x90, 0x94,
+ 0xfb, 0x8f, 0xf7, 0x3d, 0x87, 0x76, 0x85, 0x81,
+ 0x7b, 0x7d, 0x19, 0xf7, 0xe2, 0xfb, 0x57, 0x15,
+ 0xf7, 0x19, 0xfb, 0xa4, 0x99, 0x9b, 0x95, 0x91,
+ 0xa0, 0x8f, 0x19, 0xfb, 0x3d, 0xf7, 0x8f, 0x5,
+ 0xfc, 0xd, 0x97, 0x15, 0xf7, 0xc2, 0xa0, 0x5,
+ 0x95, 0x7, 0xfb, 0xc2, 0xa0, 0x5, 0x8f, 0x80,
+ 0x8c, 0x84, 0x82, 0x1a, 0x83, 0x89, 0x83, 0x88,
+ 0x82, 0x1e, 0xf7, 0xd7, 0xfb, 0xd7, 0x15, 0x13,
+ 0x78, 0x8e, 0x95, 0x93, 0x8d, 0x93, 0x1b, 0x13,
+ 0xb8, 0x93, 0x93, 0x89, 0x88, 0x95, 0x1f, 0x76,
+ 0xf7, 0xc2, 0x5, 0x81, 0x6, 0xfb, 0xb0, 0xfb,
+ 0x2a, 0x15, 0xf7, 0x8f, 0xf7, 0x3d, 0x86, 0x94,
+ 0xfb, 0xa4, 0xfb, 0x19, 0x9b, 0x7d, 0x91, 0x81,
+ 0x8f, 0x76, 0x19, 0xe7, 0x2f, 0x15, 0xa0, 0x87,
+ 0x95, 0x85, 0x99, 0x7b, 0xf7, 0x19, 0xf7, 0xa4,
+ 0x18, 0x82, 0x90, 0x5, 0xe, 0x57, 0x97, 0x76,
+ 0xa5, 0x76, 0xf9, 0x49, 0x77, 0x12, 0xb7, 0xf9,
+ 0x4e, 0x13, 0xb0, 0xf8, 0x35, 0xf8, 0x7, 0x15,
+ 0xf7, 0x55, 0xf7, 0x8b, 0x78, 0x8e, 0x55, 0xaa,
+ 0x7f, 0x9a, 0x19, 0xfb, 0x9, 0xfb, 0xb7, 0x5,
+ 0xa0, 0x76, 0x15, 0xf7, 0xb7, 0xf7, 0x9, 0x7c,
+ 0x97, 0x6c, 0xc1, 0x88, 0x9e, 0x19, 0xfb, 0x8b,
+ 0xfb, 0x55, 0x5, 0x67, 0x9a, 0x15, 0x95, 0x6,
+ 0xb7, 0xf7, 0xca, 0x5, 0x87, 0x82, 0x77, 0x8a,
+ 0x77, 0x1b, 0x77, 0x77, 0x8c, 0x8f, 0x82, 0x1f,
+ 0xe3, 0xfb, 0xf6, 0x15, 0xf7, 0xca, 0x5f, 0x5,
+ 0x87, 0x94, 0x8a, 0xa0, 0x9f, 0x1a, 0x9f, 0x8d,
+ 0x9e, 0x8e, 0x94, 0x1e, 0xfb, 0xca, 0x5f, 0x5,
+ 0x4c, 0xa5, 0x15, 0x94, 0x90, 0xfb, 0x9, 0xf7,
+ 0xb7, 0x7f, 0x7c, 0x55, 0x6c, 0x78, 0x88, 0x19,
+ 0xf7, 0x8c, 0xfb, 0xc2, 0x15, 0xf7, 0x8b, 0xfb,
+ 0x55, 0x8e, 0x9e, 0xaa, 0xc1, 0x9a, 0x97, 0x19,
+ 0xfb, 0xb7, 0xf7, 0x9, 0x5, 0x43, 0xa9, 0x15,
+ 0x90, 0x94, 0xfb, 0x8b, 0xf7, 0x55, 0x88, 0x78,
+ 0x6c, 0x55, 0x7c, 0x7f, 0x19, 0xf8, 0x5f, 0xfc,
+ 0x5f, 0x15, 0x97, 0x9a, 0xc1, 0xaa, 0x9e, 0x8e,
+ 0xfb, 0x55, 0xf7, 0x8b, 0x18, 0x82, 0x86, 0x5,
+ 0xfc, 0x0, 0x7e, 0x15, 0xf7, 0xca, 0xb7, 0x5,
+ 0x95, 0x7, 0xfb, 0xca, 0xb7, 0x5, 0x8f, 0x82,
+ 0x8c, 0x76, 0x77, 0x1a, 0x77, 0x89, 0x78, 0x88,
+ 0x82, 0x1e, 0xf7, 0xc0, 0xfb, 0xc0, 0x15, 0x13,
+ 0x70, 0x8e, 0x94, 0x9e, 0x8d, 0x9f, 0x1b, 0x13,
+ 0xb0, 0x9f, 0xa0, 0x8a, 0x87, 0x94, 0x1f, 0x5f,
+ 0xf7, 0xca, 0x5, 0x81, 0x6, 0xfb, 0xa5, 0xfb,
+ 0x46, 0x15, 0xf7, 0x8b, 0xf7, 0x55, 0x86, 0x94,
+ 0xfb, 0xb7, 0xfb, 0x9, 0x9a, 0x7f, 0xaa, 0x55,
+ 0x8e, 0x78, 0x19, 0xc8, 0x4e, 0x15, 0x9e, 0x88,
+ 0xc1, 0x6c, 0x97, 0x7c, 0xf7, 0x9, 0xf7, 0xb7,
+ 0x18, 0x82, 0x90, 0x5, 0xe, 0xfb, 0x12, 0x92,
+ 0x76, 0xf7, 0x1f, 0xf7, 0x43, 0xe6, 0xf7, 0x42,
+ 0xf7, 0x15, 0x77, 0x12, 0xae, 0xf7, 0x45, 0xc5,
+ 0xf7, 0x42, 0x22, 0xae, 0xf7, 0x14, 0xf7, 0x44,
+ 0x13, 0xfb, 0xf7, 0xe7, 0xf7, 0x35, 0x15, 0x66,
+ 0x7f, 0x6b, 0x6b, 0x61, 0x1a, 0x59, 0xaf, 0x64,
+ 0xbe, 0xbd, 0xb0, 0xb3, 0xbc, 0xb6, 0x6b, 0xaa,
+ 0x65, 0x97, 0x1e, 0xf7, 0x30, 0x7, 0xf7, 0x18,
+ 0x3e, 0x5, 0x89, 0x83, 0x89, 0x83, 0x82, 0x1a,
+ 0x5a, 0xb3, 0x62, 0xbc, 0x1e, 0x13, 0xfd, 0xbd,
+ 0xb0, 0xb1, 0xbc, 0xba, 0x65, 0xb4, 0x5a, 0x6f,
+ 0x76, 0x7f, 0x78, 0x77, 0x1f, 0x13, 0xfb, 0xfb,
+ 0x16, 0xd7, 0xf7, 0x16, 0xd7, 0x5, 0x76, 0xa0,
+ 0x9f, 0x82, 0xa9, 0x1b, 0xbc, 0xaf, 0xb6, 0xba,
+ 0xbd, 0x62, 0xad, 0x5b, 0x5e, 0x61, 0x63, 0x5e,
+ 0x81, 0x8c, 0x80, 0x8e, 0x83, 0x1f, 0xfb, 0x18,
+ 0x3d, 0x5, 0xf7, 0x31, 0x7, 0xb1, 0x96, 0xab,
+ 0xab, 0xb5, 0x1a, 0xbd, 0x66, 0xb3, 0x59, 0x59,
+ 0x66, 0x63, 0x59, 0x61, 0xaa, 0x6b, 0xb1, 0x80,
+ 0x1e, 0xfb, 0x31, 0x7, 0xfb, 0x18, 0xd9, 0x5,
+ 0x8e, 0x92, 0x8d, 0x93, 0x95, 0x1a, 0xbc, 0x63,
+ 0xb3, 0x5a, 0x1e, 0x13, 0xfd, 0x59, 0x65, 0x66,
+ 0x59, 0x5c, 0xb2, 0x62, 0xbb, 0xa8, 0xa0, 0x97,
+ 0x9e, 0x9f, 0x1f, 0x13, 0xfb, 0xf7, 0x16, 0x3f,
+ 0xfb, 0x16, 0x3f, 0x5, 0xa1, 0x76, 0x77, 0x94,
+ 0x6c, 0x1b, 0x5a, 0x67, 0x5f, 0x5c, 0x59, 0xb5,
+ 0x69, 0xbb, 0xb7, 0xb6, 0xb3, 0xb8, 0x96, 0x7e,
+ 0x99, 0x93, 0x90, 0x1f, 0xf7, 0x18, 0xd8, 0x5,
+ 0xe, 0x5b, 0x97, 0x76, 0xf7, 0x83, 0xf7, 0xf,
+ 0x71, 0xf7, 0xf, 0xf7, 0x83, 0x77, 0x12, 0xf7,
+ 0xb2, 0xf7, 0xf, 0x71, 0xf7, 0xf, 0x13, 0xd4,
+ 0xf8, 0x39, 0xf7, 0xf1, 0x15, 0xbf, 0xaf, 0xbb,
+ 0x9f, 0xc7, 0x9b, 0xa8, 0x93, 0xa9, 0x92, 0xa4,
+ 0x9d, 0x9a, 0x95, 0x8b, 0x9e, 0x8c, 0x9e, 0x8c,
+ 0x95, 0x8b, 0x96, 0x8f, 0x94, 0x8, 0x8c, 0x8d,
+ 0x8b, 0x8d, 0x8d, 0x1a, 0x93, 0x84, 0x8c, 0x84,
+ 0x81, 0x81, 0x8e, 0x8e, 0x82, 0x1e, 0x8e, 0x81,
+ 0x81, 0x8f, 0x81, 0x1b, 0x6f, 0x67, 0x56, 0x76,
+ 0x7c, 0x1f, 0x6f, 0x63, 0x6e, 0x68, 0x65, 0x6c,
+ 0x82, 0x84, 0x82, 0x85, 0x82, 0x85, 0x8, 0x78,
+ 0x91, 0x15, 0x98, 0x88, 0x96, 0xc9, 0xa0, 0xbb,
+ 0xaa, 0xc1, 0x19, 0x98, 0xa2, 0xa2, 0xb3, 0xa6,
+ 0x1a, 0x98, 0x83, 0x93, 0x83, 0x94, 0x1e, 0x81,
+ 0x96, 0x83, 0x94, 0x84, 0x98, 0x8, 0x8e, 0x8a,
+ 0x88, 0x90, 0x87, 0x1b, 0x86, 0x8b, 0x89, 0x88,
+ 0x87, 0x1f, 0x7f, 0x80, 0x80, 0x87, 0x82, 0x86,
+ 0x8, 0x77, 0x81, 0x7e, 0x85, 0x61, 0x1a, 0x75,
+ 0x8f, 0x76, 0x8f, 0x76, 0x1e, 0x91, 0x6b, 0x8f,
+ 0x6b, 0x6a, 0x1a, 0x71, 0x89, 0x71, 0x86, 0x71,
+ 0x1e, 0xa5, 0x65, 0x15, 0xc9, 0x80, 0xbb, 0x76,
+ 0xc1, 0x6c, 0x8, 0x7e, 0xa2, 0xb3, 0x74, 0xa6,
+ 0x1b, 0x98, 0x94, 0x93, 0x93, 0x93, 0x1f, 0x96,
+ 0x95, 0x94, 0x93, 0x98, 0x92, 0x8, 0x8e, 0x8c,
+ 0x90, 0x8e, 0x8f, 0x1a, 0x90, 0x89, 0x8b, 0x88,
+ 0x8f, 0x1e, 0x82, 0x96, 0x85, 0x94, 0x87, 0x94,
+ 0x8, 0xa1, 0x80, 0x87, 0x99, 0x5f, 0x1b, 0x75,
+ 0x76, 0x87, 0x87, 0x76, 0x1f, 0x85, 0x6b, 0x6b,
+ 0x87, 0x6a, 0x1b, 0x71, 0x71, 0x8d, 0x90, 0x71,
+ 0x1f, 0x5b, 0x9a, 0x15, 0x97, 0x93, 0x67, 0xbf,
+ 0x77, 0xbb, 0x7b, 0xc7, 0x19, 0x83, 0xa8, 0x84,
+ 0xa9, 0x79, 0xa4, 0x82, 0x98, 0x7c, 0x8d, 0x7b,
+ 0x8c, 0x7e, 0x8c, 0x7e, 0x8b, 0x7f, 0x8f, 0x8,
+ 0x8c, 0x89, 0x89, 0x8b, 0x89, 0x1b, 0x83, 0x8a,
+ 0x84, 0x84, 0x80, 0x88, 0x80, 0x87, 0x81, 0x1f,
+ 0x88, 0x82, 0x88, 0x82, 0x82, 0x1a, 0x6f, 0xc0,
+ 0x67, 0xa0, 0x7c, 0x1e, 0xb3, 0x6f, 0xae, 0x6e,
+ 0xaa, 0x65, 0x92, 0x82, 0x91, 0x82, 0x91, 0x82,
+ 0x8, 0xa9, 0x61, 0x15, 0xaf, 0x57, 0x9f, 0x5b,
+ 0x9b, 0x4f, 0x93, 0x6e, 0x92, 0x6d, 0x9d, 0x72,
+ 0x94, 0x7d, 0x9c, 0x8a, 0x9c, 0x8a, 0x97, 0x8a,
+ 0x97, 0x8b, 0x96, 0x87, 0x8, 0x8a, 0x8d, 0x8d,
+ 0x8b, 0x8d, 0x1b, 0x93, 0x8c, 0x92, 0x92, 0x94,
+ 0x8d, 0x93, 0x8e, 0x94, 0x1f, 0x8f, 0x96, 0x8f,
+ 0x96, 0x96, 0x1a, 0xa7, 0x56, 0xaf, 0x76, 0x9a,
+ 0x1e, 0x63, 0xa7, 0x68, 0xa8, 0x6c, 0xb1, 0x84,
+ 0x94, 0x85, 0x94, 0x85, 0x94, 0x8, 0x5b, 0x9a,
+ 0x15, 0x8e, 0x98, 0x4d, 0x96, 0x5b, 0xa0, 0x55,
+ 0xaa, 0x19, 0x13, 0xb8, 0x98, 0x74, 0x63, 0xa2,
+ 0x70, 0x1b, 0x7e, 0x82, 0x83, 0x83, 0x83, 0x1f,
+ 0x80, 0x81, 0x82, 0x83, 0x7e, 0x84, 0x8, 0x88,
+ 0x8a, 0x86, 0x88, 0x87, 0x1a, 0x86, 0x8d, 0x8b,
+ 0x8e, 0x87, 0x1e, 0x95, 0x80, 0x91, 0x80, 0x8f,
+ 0x82, 0x8, 0x76, 0x95, 0x90, 0x7e, 0xb6, 0x1b,
+ 0xa1, 0xa0, 0x8f, 0x8f, 0xa0, 0x1f, 0x91, 0xab,
+ 0xab, 0x8f, 0xac, 0x1b, 0xa5, 0xa5, 0x89, 0x86,
+ 0xa5, 0x1f, 0x9b, 0x75, 0x15, 0x80, 0x4d, 0x76,
+ 0x5b, 0x6c, 0x55, 0x8, 0x7e, 0x74, 0x74, 0x63,
+ 0x70, 0x1a, 0x7e, 0x93, 0x82, 0x93, 0x83, 0x1e,
+ 0x95, 0x80, 0x93, 0x82, 0x92, 0x7e, 0x8, 0x88,
+ 0x8c, 0x8e, 0x86, 0x8f, 0x1b, 0x90, 0x8b, 0x8d,
+ 0x8e, 0x8f, 0x1f, 0x94, 0x93, 0x93, 0x90, 0x93,
+ 0x8f, 0x8, 0xa3, 0x97, 0x9b, 0x8d, 0xba, 0x1a,
+ 0xa1, 0x87, 0xa0, 0x87, 0xa0, 0x1e, 0x85, 0xab,
+ 0x87, 0xab, 0xac, 0x1a, 0xa5, 0x8d, 0xa5, 0x90,
+ 0xa5, 0x1e, 0x78, 0x91, 0x15, 0x83, 0x97, 0x57,
+ 0x67, 0x5b, 0x77, 0x4f, 0x7b, 0x19, 0x6e, 0x83,
+ 0x6d, 0x84, 0x72, 0x79, 0x7e, 0x82, 0x89, 0x7b,
+ 0x8a, 0x7a, 0x8a, 0x7f, 0x8b, 0x7e, 0x87, 0x80,
+ 0x8, 0x8a, 0x89, 0x8b, 0x89, 0x89, 0x1a, 0x83,
+ 0x92, 0x8a, 0x92, 0x95, 0x95, 0x88, 0x88, 0x95,
+ 0x1e, 0x88, 0x95, 0x94, 0x87, 0x95, 0x1b, 0xa7,
+ 0xaf, 0xc0, 0xa0, 0x9a, 0x1f, 0xa7, 0xb3, 0xa8,
+ 0xae, 0xb1, 0xaa, 0x94, 0x92, 0x94, 0x91, 0x94,
+ 0x91, 0x8, 0xe, 0xfb, 0xb3, 0x8b, 0xcd, 0xf7,
+ 0xb6, 0xd1, 0xe7, 0xa4, 0xf7, 0xf, 0xa5, 0x1,
+ 0xae, 0xa4, 0xf7, 0xf, 0xa6, 0xe8, 0xd3, 0xd4,
+ 0xd0, 0x3, 0xf7, 0x4b, 0xc8, 0x15, 0xe4, 0x4e,
+ 0x5, 0xf2, 0xf7, 0xf8, 0xf7, 0x22, 0xf7, 0x9,
+ 0x6, 0x4b, 0xd1, 0x5, 0x3d, 0xd7, 0x6, 0x46,
+ 0xd4, 0x5, 0xfb, 0xf, 0xfb, 0x29, 0xfb, 0x28,
+ 0xfb, 0xd, 0x6, 0xe6, 0x49, 0x5, 0xc4, 0x6,
+ 0xa6, 0xfb, 0xb6, 0x15, 0xf7, 0xfc, 0xfb, 0x2a,
+ 0xe7, 0xf7, 0x2a, 0xf7, 0x28, 0xe8, 0xfb, 0x28,
+ 0xf7, 0x25, 0x2f, 0xfb, 0x25, 0xfb, 0xfc, 0x7,
+ 0xe, 0x55, 0x3a, 0xa, 0xf7, 0xdf, 0xf7, 0xc9,
+ 0x15, 0xfb, 0x33, 0xfb, 0x3, 0x72, 0x7a, 0x7d,
+ 0x7a, 0x86, 0x73, 0x19, 0x69, 0x84, 0xa6, 0x6d,
+ 0xad, 0x1b, 0xa3, 0x9a, 0xa2, 0xaa, 0xa4, 0x1f,
+ 0xf7, 0x2, 0xf7, 0x2e, 0x9e, 0x83, 0x64, 0xfb,
+ 0x66, 0x5, 0x65, 0x84, 0xa1, 0x61, 0xb6, 0x1b,
+ 0xba, 0x9b, 0xb4, 0xb2, 0x83, 0x1f, 0x65, 0xf7,
+ 0x66, 0x9d, 0x93, 0xf7, 0x4, 0xfb, 0x32, 0x5,
+ 0x70, 0x9f, 0x98, 0x74, 0xb1, 0x1b, 0xac, 0xa1,
+ 0xa9, 0xaa, 0xa4, 0x7d, 0x99, 0x77, 0x98, 0x1f,
+ 0xfb, 0x46, 0xf7, 0xc, 0x93, 0x9f, 0xf7, 0x51,
+ 0x6d, 0x5, 0xb4, 0x85, 0xc5, 0x86, 0xc5, 0x1a,
+ 0xca, 0x51, 0x89, 0x60, 0x84, 0x1e, 0xfb, 0x4f,
+ 0x67, 0x83, 0x9f, 0xf7, 0x44, 0xf7, 0xd, 0x5,
+ 0x8b, 0xab, 0xa7, 0xa4, 0x1a, 0xa9, 0x72, 0xa9,
+ 0x6c, 0x6c, 0x7e, 0x7c, 0x74, 0x7b, 0x1e, 0xfb,
+ 0xa, 0xfb, 0x40, 0x79, 0x94, 0xab, 0xf7, 0x4d,
+ 0x5, 0xb5, 0x92, 0x8a, 0xc8, 0x50, 0x1b, 0x5d,
+ 0x78, 0x69, 0x46, 0x97, 0x1f, 0xb1, 0xfb, 0x4d,
+ 0x78, 0x82, 0xfb, 0x2, 0xf7, 0x29, 0x5, 0xa1,
+ 0x7b, 0x79, 0xab, 0x6c, 0x1b, 0x6a, 0x6f, 0x74,
+ 0x69, 0x65, 0xa7, 0x7e, 0xa6, 0x78, 0x1f, 0xf7,
+ 0x30, 0x26, 0x83, 0x78, 0xfb, 0x4e, 0xaf, 0x5,
+ 0x60, 0x93, 0x51, 0x8a, 0x4e, 0x1a, 0x4e, 0xc6,
+ 0x94, 0xb4, 0x91, 0x1e, 0xf7, 0x4f, 0xa7, 0x5,
+ 0xe, 0x5b, 0x3a, 0xa, 0xae, 0xf9, 0x66, 0x3,
+ 0x3b, 0xa, 0xfb, 0x5c, 0xf7, 0x37, 0xfb, 0x34,
+ 0xf7, 0x5b, 0xf7, 0x5a, 0xf7, 0x36, 0xf7, 0x36,
+ 0xf7, 0x5a, 0xf7, 0x5a, 0xfb, 0x36, 0xf7, 0x35,
+ 0xfb, 0x5a, 0xfb, 0x5b, 0xfb, 0x37, 0xfb, 0x33,
+ 0xfb, 0x5c, 0x1e, 0xe, 0xad, 0x7d, 0xae, 0xf9,
+ 0x1c, 0xaf, 0x1, 0xae, 0x9f, 0xf9, 0x1e, 0xf7,
+ 0x19, 0x3, 0xae, 0xf7, 0xec, 0x15, 0xfb, 0x75,
+ 0xf7, 0x49, 0xfb, 0x19, 0xf7, 0x6a, 0xf7, 0x6b,
+ 0xf7, 0x55, 0xf7, 0x13, 0xf7, 0x7b, 0xf7, 0x77,
+ 0xfb, 0x52, 0xf7, 0x1a, 0xfb, 0x69, 0xfb, 0x69,
+ 0xfb, 0x4f, 0xfb, 0x1b, 0xfb, 0x76, 0x1e, 0x9f,
+ 0x16, 0xf7, 0x48, 0xf7, 0x28, 0x41, 0xa, 0xf7,
+ 0x46, 0xf7, 0x25, 0xfb, 0x27, 0xfb, 0x46, 0xfb,
+ 0x46, 0xfb, 0x25, 0x3e, 0xa, 0xfb, 0x49, 0xfb,
+ 0x25, 0xf7, 0x23, 0xf7, 0x48, 0x1e, 0xe, 0x3d,
+ 0x3d, 0xa, 0xf9, 0x47, 0x7a, 0xa, 0xf9, 0x47,
+ 0xf9, 0x48, 0xfd, 0x47, 0x6, 0xe, 0x3e, 0x8b,
+ 0xf7, 0x12, 0x6e, 0xa8, 0xf8, 0xac, 0xa9, 0x12,
+ 0xae, 0xa8, 0xf8, 0xa9, 0xa8, 0x13, 0x78, 0xae,
+ 0xec, 0x15, 0xf7, 0x0, 0x6, 0x13, 0xb8, 0x2a,
+ 0xf8, 0xdc, 0xf8, 0xde, 0x26, 0xf5, 0xfc, 0xe3,
+ 0x7, 0x13, 0x78, 0xa8, 0xfc, 0xca, 0x15, 0xf8,
+ 0xac, 0xf8, 0xa9, 0xfc, 0xac, 0x7, 0xe, 0x3b,
+ 0x8b, 0xf7, 0xf, 0xf8, 0xad, 0xab, 0x1, 0xae,
+ 0xaa, 0xf8, 0xa8, 0xf7, 0x13, 0x3, 0xae, 0xf7,
+ 0x7, 0x15, 0xf7, 0xa, 0xfb, 0x7, 0x5, 0xf8,
+ 0xd0, 0xf8, 0xc7, 0x6, 0xfb, 0xd, 0xf7, 0x15,
+ 0x5, 0xfc, 0xcd, 0x6, 0xaa, 0xfc, 0xcd, 0x6d,
+ 0xa, 0xc0, 0xa0, 0x76, 0xf9, 0x55, 0x54, 0xa,
+ 0xf9, 0xcb, 0x7a, 0xa, 0xf9, 0xcb, 0x6, 0xfc,
+ 0x30, 0xf9, 0x55, 0x5, 0xe, 0xc0, 0x92, 0x76,
+ 0xf9, 0x56, 0x54, 0xa, 0xf9, 0xcb, 0x3, 0xf8,
+ 0x52, 0x7d, 0x15, 0xf8, 0x30, 0xf9, 0x56, 0x5,
+ 0xfd, 0xcb, 0x6, 0xe, 0x3a, 0xa, 0xa3, 0xf9,
+ 0x63, 0x3, 0x3b, 0xa, 0xf7, 0xfb, 0xfb, 0xfc,
+ 0xf7, 0xfc, 0xf7, 0xfc, 0xfb, 0xfc, 0xf7, 0xfb,
+ 0x5, 0xe, 0x54, 0x3f, 0xa, 0x12, 0xaf, 0xf9,
+ 0x5d, 0xfc, 0x8e, 0xf7, 0xc6, 0x13, 0xd0, 0xf8,
+ 0x1c, 0xf8, 0x21, 0x15, 0xf7, 0x2d, 0xf7, 0x2d,
+ 0xfb, 0x2d, 0xf7, 0x2f, 0xfb, 0x2d, 0xfb, 0x2e,
+ 0x5, 0xf7, 0x5f, 0xfb, 0x5f, 0x15, 0xf7, 0x2c,
+ 0xfb, 0x2c, 0x5, 0x13, 0xe0, 0xf7, 0x2f, 0xf7,
+ 0x25, 0xfb, 0x2d, 0xf7, 0x35, 0x5, 0xfb, 0xf9,
+ 0xfb, 0xfb, 0x15, 0xf7, 0x2d, 0xfb, 0x31, 0xf7,
+ 0x30, 0xf7, 0x31, 0xfb, 0x30, 0xf7, 0x2f, 0x5,
+ 0xfb, 0x5f, 0x25, 0x15, 0xf7, 0x2d, 0xf7, 0x2c,
+ 0xfb, 0x2f, 0xf7, 0x2e, 0xfb, 0x2b, 0xfb, 0x2e,
+ 0x5, 0xe, 0xfb, 0xc2, 0x8b, 0xa4, 0xf7, 0xdb,
+ 0xa2, 0xaa, 0xda, 0xaa, 0xa4, 0xf7, 0x12, 0xa4,
+ 0x1, 0xae, 0xa3, 0xf7, 0x6, 0xa4, 0xaa, 0xdc,
+ 0xa9, 0xa3, 0xf7, 0x6, 0xa4, 0x3, 0xf7, 0x41,
+ 0x16, 0xf7, 0x53, 0xf7, 0xf4, 0xf7, 0x1f, 0xf7,
+ 0x51, 0xfb, 0x1f, 0xf7, 0x2b, 0xfb, 0x53, 0xfb,
+ 0x2b, 0xfb, 0x1e, 0xfb, 0x51, 0xf7, 0x1e, 0x6,
+ 0xa4, 0xfb, 0xdb, 0x15, 0xf7, 0xf2, 0xfb, 0x1f,
+ 0xf7, 0x21, 0xf7, 0x1f, 0xf7, 0x2b, 0xf7, 0x22,
+ 0xfb, 0x2b, 0xf7, 0x1e, 0xfb, 0x21, 0xfb, 0x1e,
+ 0xfb, 0xf2, 0x7, 0xfb, 0x3, 0xa9, 0x15, 0xdc,
+ 0xf7, 0xf3, 0xf7, 0x1d, 0xda, 0xfb, 0x1d, 0xf7,
+ 0x2a, 0x3a, 0xfb, 0x2a, 0xfb, 0x1f, 0x3c, 0xf7,
+ 0x1f, 0x6, 0xe, 0xfc, 0x25, 0x3a, 0xa, 0xae,
+ 0xf8, 0x4, 0x3, 0xae, 0x7d, 0x15, 0xf7, 0x66,
+ 0xf7, 0x32, 0xf7, 0x35, 0xf7, 0x5c, 0xf7, 0x5c,
+ 0xfb, 0x37, 0xf7, 0x32, 0xfb, 0x61, 0x1f, 0xfd,
+ 0x63, 0x7, 0xe, 0xfd, 0x51, 0x3d, 0xa, 0xd0,
+ 0x7a, 0xa, 0xd0, 0xf9, 0x48, 0x46, 0x6, 0xe,
+ 0xfc, 0xc6, 0x5a, 0xa, 0xae, 0x16, 0xf7, 0x63,
+ 0xf9, 0x48, 0xfb, 0x63, 0x6, 0xe, 0xfc, 0x3c,
+ 0x3d, 0xa, 0xf7, 0xed, 0x7a, 0xa, 0xf7, 0xed,
+ 0xf9, 0x48, 0xfb, 0xed, 0x6, 0xe, 0x66, 0xa,
+ 0xb9, 0x64, 0x15, 0x96, 0x7e, 0xf7, 0x38, 0xf7,
+ 0x56, 0xf7, 0x42, 0xf7, 0x27, 0xd9, 0xbb, 0x19,
+ 0x30, 0xc2, 0xfb, 0x3f, 0xf7, 0x1f, 0xfb, 0x34,
+ 0xf7, 0x5b, 0x7c, 0x80, 0x18, 0xb7, 0xfb, 0xb,
+ 0xe3, 0xfb, 0x3d, 0xcf, 0x2d, 0x4c, 0x37, 0x2e,
+ 0xfb, 0x65, 0x69, 0x38, 0x8, 0xe, 0xfc, 0x41,
+ 0x3d, 0xa, 0xf7, 0xe8, 0x7a, 0xa, 0xf7, 0x84,
+ 0x6, 0xef, 0xf7, 0xee, 0x27, 0xf7, 0xee, 0x5,
+ 0xfb, 0x84, 0x6, 0xef, 0xfb, 0xee, 0x5, 0xe,
+ 0xfc, 0xf1, 0x3a, 0xa, 0xae, 0xc7, 0x3, 0xae,
+ 0xd3, 0x15, 0xf7, 0x22, 0x35, 0xa1, 0xa0, 0x23,
+ 0xd2, 0x5, 0xf8, 0xaf, 0x7, 0xf3, 0xcf, 0x75,
+ 0x9f, 0xfb, 0x22, 0x33, 0x5, 0xe, 0xfc, 0xf1,
+ 0x3a, 0xa, 0xf7, 0x1e, 0xc8, 0x3, 0xae, 0x93,
+ 0x15, 0xa0, 0x75, 0xf7, 0x23, 0xe1, 0x5, 0xf8,
+ 0xb5, 0x7, 0xfb, 0x23, 0xe3, 0x76, 0x77, 0xf2,
+ 0x47, 0x5, 0xfc, 0xae, 0x7, 0xe, 0xfc, 0x55,
+ 0x3a, 0xa, 0xae, 0xf7, 0x10, 0x3, 0xf7, 0xf2,
+ 0x7d, 0x15, 0x91, 0x96, 0x5, 0xfb, 0x25, 0xbc,
+ 0x57, 0xf7, 0x32, 0xf7, 0x21, 0x1a, 0xf7, 0x1e,
+ 0xc3, 0xf7, 0x38, 0xf7, 0x21, 0xba, 0x1e, 0x83,
+ 0x96, 0x5, 0xfb, 0x52, 0x54, 0xfb, 0xf, 0x20,
+ 0xfb, 0x5a, 0x1a, 0xfb, 0x5b, 0xf7, 0x1a, 0xfb,
+ 0x2, 0xf7, 0x49, 0x59, 0x1e, 0xe, 0xfb, 0x9a,
+ 0xf3, 0xa2, 0xf7, 0x55, 0xb3, 0xf7, 0x69, 0xa2,
+ 0x1, 0xae, 0xa2, 0xf7, 0x66, 0xb4, 0xf7, 0x66,
+ 0xa2, 0x14, 0x1c, 0xf4, 0xf3, 0x15, 0xf8, 0x4,
+ 0x6, 0x81, 0xa2, 0x5, 0x21, 0x5b, 0xe2, 0xf7,
+ 0x4, 0x1f, 0xf7, 0xa, 0xe7, 0x5c, 0x20, 0x1f,
+ 0xa2, 0x81, 0x5, 0xf8, 0x4, 0x7, 0x74, 0x81,
+ 0x8e, 0xfb, 0x5, 0xfb, 0x0, 0x65, 0x22, 0x88,
+ 0x19, 0xf2, 0xb6, 0xf7, 0x2, 0xf7, 0x3, 0x85,
+ 0x1e, 0x95, 0xa2, 0x5, 0xfc, 0x4, 0x6, 0x95,
+ 0x74, 0x5, 0xf6, 0x88, 0xb9, 0x31, 0xfb, 0x6,
+ 0x1a, 0xfb, 0x2, 0x22, 0xbb, 0xf5, 0x90, 0x1f,
+ 0x74, 0x95, 0x5, 0xfc, 0x4, 0x7, 0xa2, 0x95,
+ 0x8c, 0xf6, 0xf7, 0x0, 0xc4, 0xf0, 0x81, 0x19,
+ 0x22, 0x63, 0x29, 0xfb, 0x5, 0x8f, 0x1e, 0xe,
+ 0xfc, 0x55, 0x3a, 0xa, 0xf7, 0x7c, 0xf7, 0xf,
+ 0x3, 0xae, 0x88, 0x15, 0x92, 0x80, 0x5, 0xf7,
+ 0x50, 0xbf, 0xf7, 0x11, 0xf7, 0x0, 0xf7, 0x5b,
+ 0x1a, 0xf7, 0x59, 0xfb, 0xf, 0xf7, 0x0, 0xfb,
+ 0x52, 0xc2, 0x1e, 0x84, 0x80, 0x5, 0xf7, 0x20,
+ 0x5b, 0xc4, 0xfb, 0x37, 0xfb, 0x1e, 0x1a, 0xfb,
+ 0x21, 0x56, 0xfb, 0x32, 0xfb, 0x24, 0x5a, 0x1e,
+ 0xe, 0xfc, 0xc7, 0x5a, 0xa, 0xf7, 0x19, 0x16,
+ 0xf7, 0x1, 0x6, 0x26, 0xf7, 0xed, 0xf0, 0xf7,
+ 0xef, 0x5, 0x22, 0x6, 0x25, 0xfb, 0xef, 0x5,
+ 0xe, 0xfc, 0xc7, 0x5a, 0xa, 0xae, 0x16, 0xf5,
+ 0x6, 0xf0, 0xf7, 0xed, 0x24, 0xf7, 0xef, 0x5,
+ 0x23, 0x6, 0xef, 0xfb, 0xef, 0x5, 0xe, 0xfc,
+ 0x9e, 0x3d, 0xa, 0xf7, 0x34, 0x3, 0xf7, 0x4c,
+ 0x16, 0xee, 0x6, 0x54, 0xf7, 0x4, 0x6a, 0xf7,
+ 0x4, 0xf7, 0x11, 0x1a, 0xf7, 0x12, 0xa9, 0xed,
+ 0xbd, 0xf7, 0xb, 0x1e, 0x2b, 0x6, 0x3a, 0x29,
+ 0x4c, 0xfb, 0xc, 0xfb, 0x14, 0x1a, 0xfb, 0x12,
+ 0xcc, 0xfb, 0x13, 0xdf, 0x2e, 0x1e, 0xe, 0xfc,
+ 0x9e, 0x38, 0xa, 0xf7, 0xc, 0xf7, 0x37, 0x7a,
+ 0xa, 0xee, 0x6, 0xde, 0xe7, 0xcd, 0xf7, 0x14,
+ 0xf7, 0x11, 0x1a, 0xf7, 0x16, 0x4b, 0xf7, 0x9,
+ 0x3b, 0xef, 0x1e, 0x28, 0x6, 0xc0, 0xfb, 0xc,
+ 0xa6, 0x2a, 0xfb, 0x12, 0x1a, 0xfb, 0x10, 0x6c,
+ 0xfb, 0x5, 0x55, 0xfb, 0x4, 0x1e, 0xe, 0xfc,
+ 0x8d, 0x38, 0xa, 0xe1, 0xf7, 0x1b, 0x3, 0xf7,
+ 0xbf, 0x16, 0x99, 0x7, 0x3d, 0x8b, 0xc1, 0xc1,
+ 0xf7, 0x2e, 0x8f, 0xc0, 0x38, 0x9c, 0x1f, 0xde,
+ 0x9d, 0x87, 0xc6, 0xf7, 0x24, 0x1a, 0xd7, 0x8b,
+ 0xaf, 0xd9, 0x1e, 0x98, 0x61, 0x7, 0x67, 0x39,
+ 0x8b, 0x7c, 0x76, 0x1f, 0x6c, 0x75, 0x87, 0x70,
+ 0x68, 0x1a, 0x91, 0xfb, 0x3e, 0x5, 0x64, 0x7f,
+ 0x6d, 0x61, 0x83, 0x1e, 0xb5, 0x83, 0x97, 0x6f,
+ 0x63, 0x1a, 0x85, 0xfb, 0x3d, 0x5, 0x68, 0x8c,
+ 0x69, 0xaf, 0x79, 0x1e, 0x7f, 0xa3, 0xd2, 0x89,
+ 0xaf, 0x1b, 0xe, 0xfc, 0x8d, 0x38, 0xa, 0xf7,
+ 0x5, 0xf7, 0x1b, 0x7a, 0xa, 0xbb, 0x6, 0xaf,
+ 0xdc, 0x8b, 0x99, 0x99, 0x1f, 0xaf, 0x9d, 0x8c,
+ 0xad, 0xae, 0x1a, 0x85, 0xf7, 0x3d, 0x8a, 0xb4,
+ 0x98, 0xa6, 0xb5, 0x93, 0x19, 0x61, 0x93, 0x7d,
+ 0xa0, 0x8d, 0xbb, 0x91, 0xf7, 0x3e, 0x18, 0xae,
+ 0x88, 0xa7, 0x6b, 0xa0, 0x1e, 0x9a, 0x74, 0x3b,
+ 0x8b, 0x67, 0x1b, 0x61, 0x7e, 0x6, 0xd9, 0x8b,
+ 0x54, 0x56, 0x1f, 0x37, 0x7, 0x45, 0x87, 0x56,
+ 0xdd, 0x79, 0x1e, 0x39, 0x7a, 0x8f, 0x56, 0x45,
+ 0x1a, 0x37, 0x7, 0x55, 0x8b, 0x55, 0x3d, 0x1e,
+ 0xe, 0xfc, 0x53, 0x73, 0xa, 0xf0, 0x26, 0xf7,
+ 0xd0, 0x13, 0xa0, 0xf7, 0xcc, 0xf9, 0x3a, 0x15,
+ 0x86, 0xa0, 0x5, 0xfb, 0x13, 0x7a, 0xfb, 0x23,
+ 0x4b, 0xfb, 0x5b, 0x1a, 0x36, 0xc6, 0x21, 0xf2,
+ 0xeb, 0xc5, 0xd4, 0xd2, 0xc3, 0x71, 0xac, 0x75,
+ 0x97, 0x1e, 0x7e, 0x91, 0x7a, 0x8f, 0x7c, 0x86,
+ 0x8, 0x86, 0x78, 0x81, 0x86, 0x70, 0x1b, 0x13,
+ 0xc0, 0x63, 0x71, 0xa0, 0xb5, 0xbd, 0xaf, 0xcc,
+ 0xf7, 0x1e, 0xab, 0x1f, 0xe, 0xfc, 0x53, 0x73,
+ 0xa, 0xf7, 0xd0, 0x26, 0xf0, 0x13, 0xc0, 0xde,
+ 0xf7, 0x78, 0x15, 0xf7, 0x13, 0x9c, 0xf7, 0x23,
+ 0xcb, 0xf7, 0x5b, 0x1a, 0xe0, 0x50, 0xf5, 0x24,
+ 0x2b, 0x51, 0x42, 0x44, 0x53, 0xa5, 0x6a, 0xa1,
+ 0x7f, 0x1e, 0x97, 0x85, 0x9a, 0x87, 0x9d, 0x90,
+ 0x8, 0x90, 0x9e, 0x95, 0x90, 0xa6, 0x1b, 0x13,
+ 0xa0, 0xb3, 0xa5, 0x76, 0x61, 0x59, 0x67, 0x4a,
+ 0xfb, 0x1e, 0x6b, 0x1f, 0x90, 0x76, 0x5, 0xe,
+ 0xfb, 0x3f, 0xf8, 0xec, 0xf9, 0x3a, 0x15, 0x87,
+ 0xa0, 0x5, 0xfb, 0xc, 0x5f, 0xa, 0x73, 0xac,
+ 0x76, 0x97, 0x1e, 0x80, 0x91, 0x7c, 0x8f, 0x7a,
+ 0x86, 0x8, 0x86, 0x7a, 0x81, 0x86, 0x72, 0x1b,
+ 0x65, 0x73, 0xa0, 0xb5, 0xbd, 0xac, 0xcc, 0xf7,
+ 0x16, 0xab, 0x1f, 0xfb, 0xc4, 0x16, 0x86, 0xa0,
+ 0x5, 0xfb, 0xb, 0x5f, 0xa, 0x72, 0xac, 0x76,
+ 0x97, 0x1e, 0x80, 0x91, 0x7d, 0x8f, 0x7a, 0x86,
+ 0x8, 0x86, 0x79, 0x82, 0x86, 0x71, 0x1b, 0x66,
+ 0x72, 0xa0, 0xb5, 0xbd, 0xad, 0xcc, 0xf7, 0x16,
+ 0xab, 0x1f, 0xe, 0xfc, 0xc5, 0xe, 0x7d, 0x99,
+ 0xf7, 0xee, 0x98, 0xf7, 0xe1, 0x98, 0x6, 0x1e,
+ 0xa0, 0x39, 0x63, 0xff, 0xc, 0x9, 0xa7, 0xa,
+ 0xe5, 0xb, 0xf9, 0xa8, 0x14, 0xf9, 0xdb, 0x15,
+ 0xa7, 0x13, 0x0, 0x61, 0x2, 0x0, 0x1, 0x0,
+ 0x7, 0x0, 0xb, 0x0, 0x11, 0x0, 0x18, 0x0,
+ 0x1f, 0x0, 0x2c, 0x0, 0x30, 0x0, 0x39, 0x0,
+ 0x3e, 0x0, 0x43, 0x0, 0x4b, 0x0, 0x52, 0x0,
+ 0x5a, 0x0, 0x5f, 0x0, 0x64, 0x0, 0x69, 0x0,
+ 0x78, 0x0, 0x7f, 0x0, 0xba, 0x0, 0xbf, 0x1,
+ 0xb, 0x1, 0x11, 0x1, 0x18, 0x1, 0x1d, 0x1,
+ 0x24, 0x1, 0x3e, 0x1, 0x42, 0x1, 0x46, 0x1,
+ 0x55, 0x1, 0x59, 0x1, 0x5e, 0x1, 0x64, 0x1,
+ 0x69, 0x1, 0x6e, 0x1, 0x85, 0x1, 0x8d, 0x1,
+ 0x92, 0x1, 0xa5, 0x1, 0xaa, 0x1, 0xc7, 0x1,
+ 0xe2, 0x1, 0xfc, 0x2, 0xb, 0x2, 0x16, 0x2,
+ 0x1b, 0x2, 0x1f, 0x2, 0x29, 0x2, 0x37, 0x2,
+ 0x41, 0x2, 0x4b, 0x2, 0x58, 0x2, 0x65, 0x2,
+ 0x69, 0x2, 0x7f, 0x2, 0x95, 0x2, 0xa4, 0x2,
+ 0xaf, 0x2, 0xbe, 0x2, 0xc4, 0x2, 0xcf, 0x2,
+ 0xda, 0x2, 0xec, 0x2, 0xfe, 0x3, 0xf, 0x3,
+ 0x20, 0x3, 0x2f, 0x3, 0x38, 0x3, 0x41, 0x3,
+ 0x4a, 0x3, 0x51, 0x3, 0x5e, 0x3, 0x6b, 0x3,
+ 0x77, 0x3, 0x83, 0x3, 0x89, 0x3, 0x8d, 0x3,
+ 0x98, 0x3, 0xa1, 0x3, 0xa8, 0x3, 0xaf, 0x3,
+ 0xb6, 0x3, 0xbd, 0x3, 0xc4, 0x3, 0xcb, 0x3,
+ 0xd0, 0x3, 0xd4, 0x3, 0xde, 0x3, 0xe8, 0x3,
+ 0xf2, 0x3, 0xfc, 0x4, 0x0, 0x4, 0x9, 0x4,
+ 0x12, 0x4, 0x19, 0x4, 0x1f, 0x4, 0x24, 0x4,
+ 0x28, 0x30, 0xa, 0x33, 0xa, 0x1e, 0xb, 0x15,
+ 0x20, 0xa, 0xb, 0xae, 0xf7, 0xee, 0x21, 0xa,
+ 0xb, 0xae, 0xf7, 0xee, 0x15, 0x2c, 0xa, 0xb,
+ 0xf7, 0x5b, 0x25, 0xa, 0xfb, 0x5b, 0xb, 0xf7,
+ 0x35, 0xf7, 0x35, 0xf7, 0x5b, 0xf7, 0x5a, 0xfb,
+ 0x35, 0xf7, 0x35, 0xb, 0x3, 0x23, 0xa, 0xb,
+ 0xfb, 0x5a, 0xfb, 0x35, 0xfb, 0x35, 0xfb, 0x5a,
+ 0xb, 0xf7, 0x48, 0x2d, 0xa, 0xb, 0x2e, 0xa,
+ 0xf7, 0x5a, 0xb, 0xfb, 0x35, 0xfb, 0x35, 0xfb,
+ 0x5a, 0x1e, 0xb, 0xfb, 0x5b, 0xf7, 0x35, 0xfb,
+ 0x35, 0xb, 0x46, 0xa, 0x24, 0xa, 0x27, 0xa,
+ 0x1e, 0xb, 0xf7, 0x25, 0x31, 0xa, 0xb, 0x3b,
+ 0xa, 0x2b, 0xa, 0xb, 0x2d, 0xa, 0xfb, 0x25,
+ 0xb, 0x2c, 0xa, 0xae, 0x16, 0x40, 0xa, 0x41,
+ 0xa, 0xf7, 0x48, 0x2f, 0xa, 0xfb, 0x48, 0xb,
+ 0x3e, 0xa, 0xfb, 0x48, 0xfb, 0x25, 0xb, 0xf7,
+ 0x7e, 0xf7, 0x3e, 0x5, 0xfb, 0xb5, 0x6, 0x32,
+ 0xf7, 0xa7, 0x32, 0xfb, 0xa7, 0x5, 0xfb, 0xb5,
+ 0x6, 0xf7, 0x7e, 0xfb, 0x3e, 0x5, 0x68, 0xfb,
+ 0x5b, 0x15, 0xe1, 0xf7, 0x6c, 0xfb, 0x58, 0xf7,
+ 0x10, 0xf7, 0x7c, 0x7c, 0xc4, 0xf7, 0x75, 0xc4,
+ 0xfb, 0x75, 0xf7, 0x7c, 0x9a, 0xfb, 0x58, 0xfb,
+ 0x10, 0xe1, 0xfb, 0x6c, 0xfb, 0x47, 0xf7, 0x29,
+ 0x5, 0xb, 0xfb, 0x47, 0x36, 0xa, 0xb, 0xf8,
+ 0xaa, 0xf8, 0x8d, 0x15, 0xaf, 0xae, 0x5, 0xa2,
+ 0x98, 0xa9, 0xa6, 0xac, 0x1b, 0xba, 0xc5, 0x5f,
+ 0x4d, 0x71, 0x75, 0x6b, 0x70, 0x7a, 0x1f, 0x6e,
+ 0x65, 0xc1, 0x8e, 0xb3, 0xbe, 0x93, 0xb6, 0x19,
+ 0xf7, 0x12, 0xe9, 0x71, 0xf7, 0x2e, 0xfb, 0x23,
+ 0xfb, 0x1b, 0x7d, 0x98, 0x7a, 0x95, 0x77, 0x92,
+ 0x19, 0xf7, 0x5, 0xf7, 0x16, 0x5, 0x7a, 0x65,
+ 0x87, 0x83, 0x7d, 0x1f, 0x2f, 0xfb, 0x4, 0x5,
+ 0x52, 0x84, 0x61, 0x50, 0x68, 0x87, 0x8b, 0x88,
+ 0x87, 0x1a, 0xb, 0x4f, 0xa, 0x32, 0xa, 0x30,
+ 0xb, 0xfb, 0x25, 0xf7, 0x25, 0xf7, 0x48, 0xb,
+ 0x15, 0x30, 0xa, 0x1e, 0xb, 0xa0, 0x76, 0xf9,
+ 0x48, 0x77, 0x1, 0xb, 0x95, 0x8, 0xb2, 0x9c,
+ 0xda, 0xc4, 0xba, 0x1a, 0xbd, 0x26, 0xa7, 0x64,
+ 0x90, 0x1e, 0x8a, 0x8e, 0x97, 0x9b, 0x97, 0x9c,
+ 0x95, 0x9c, 0x19, 0x87, 0x8e, 0xb, 0x3f, 0xa,
+ 0x1, 0xb, 0xae, 0x4d, 0xa, 0xb, 0x97, 0x6b,
+ 0x4a, 0xa, 0x9e, 0x7d, 0xa0, 0x81, 0x8, 0x64,
+ 0x7a, 0x3c, 0x45, 0xa, 0xb, 0x38, 0xa, 0xae,
+ 0xb, 0xfb, 0x25, 0xfb, 0x47, 0xb, 0x92, 0x76,
+ 0xf9, 0x63, 0x77, 0xb, 0xf7, 0x47, 0xf7, 0x25,
+ 0xb, 0xf7, 0x25, 0xf7, 0x47, 0xb, 0x15, 0xa6,
+ 0x9f, 0xa0, 0xa6, 0xa6, 0xa0, 0x76, 0x4b, 0xa,
+ 0xfb, 0xb4, 0x4, 0xa6, 0x9f, 0x9f, 0xa6, 0xa6,
+ 0xa0, 0x77, 0x4b, 0xa, 0xb, 0x5c, 0xa, 0x78,
+ 0x99, 0x76, 0x39, 0xa, 0xb, 0x50, 0xa, 0x51,
+ 0xa, 0xb, 0x52, 0x5c, 0x1a, 0x59, 0xf0, 0x6f,
+ 0xb2, 0x86, 0x1e, 0x8c, 0x88, 0x7f, 0x7b, 0x7f,
+ 0x7a, 0x81, 0x7a, 0x19, 0xb, 0x2b, 0xa, 0xf7,
+ 0x5a, 0xb, 0xa1, 0x6e, 0xa1, 0x6d, 0x65, 0x1a,
+ 0x7f, 0x88, 0x73, 0x7b, 0x72, 0x82, 0xc3, 0x9e,
+ 0x9f, 0x90, 0x9e, 0x8f, 0x9e, 0x1e, 0x6a, 0xa,
+ 0x89, 0x7c, 0x7b, 0x89, 0x7c, 0x1b, 0xb, 0x6a,
+ 0xa, 0x75, 0xa8, 0x75, 0xa9, 0xb1, 0x1a, 0x97,
+ 0x8e, 0xa3, 0x9b, 0xa4, 0x94, 0x53, 0x78, 0x77,
+ 0x86, 0x78, 0x87, 0x78, 0x1e, 0xfb, 0x2d, 0xc2,
+ 0x15, 0xb, 0xe0, 0xf7, 0xb, 0x76, 0xf7, 0x8c,
+ 0x77, 0xf7, 0xa0, 0x54, 0xa, 0xf9, 0xea, 0x3,
+ 0xae, 0xed, 0x15, 0xf9, 0xea, 0xf7, 0x8c, 0xfd,
+ 0xea, 0xf7, 0x8c, 0xb, 0x1f, 0x89, 0x89, 0x5,
+ 0x8e, 0x77, 0x76, 0x8c, 0x77, 0x1b, 0x86, 0x7,
+ 0x9c, 0x7c, 0xb, 0x70, 0x70, 0x76, 0x77, 0x70,
+ 0x70, 0x77, 0x9f, 0xa6, 0x1e, 0xb, 0xae, 0x12,
+ 0xae, 0xae, 0xb, 0xf7, 0xee, 0x15, 0xb, 0xb4,
+ 0x8f, 0x7f, 0xf7, 0x12, 0x62, 0xa, 0x52, 0xa,
+ 0xb, 0x9d, 0x15, 0xf7, 0x7e, 0xf7, 0x3e, 0xf7,
+ 0x7e, 0xfb, 0x3e, 0x31, 0xf7, 0xa7, 0xb, 0x15,
+ 0x7d, 0x96, 0x80, 0x99, 0x99, 0x96, 0x96, 0x99,
+ 0xb, 0x99, 0x80, 0x96, 0x7d, 0x7d, 0x80, 0x80,
+ 0x7d, 0x1e, 0xb, 0x88, 0x8c, 0x84, 0x9e, 0x81,
+ 0x9d, 0x81, 0x9c, 0x19, 0x87, 0x89, 0x5, 0xb,
+ 0x8e, 0x8a, 0x92, 0x78, 0x95, 0x79, 0x95, 0x7a,
+ 0x19, 0x8f, 0x8d, 0x5, 0xb, 0x77, 0x1, 0xae,
+ 0xb, 0x83, 0x83, 0x90, 0x94, 0x91, 0x8d, 0x90,
+ 0x8e, 0x90, 0x1f, 0xa2, 0xb3, 0xaf, 0x97, 0xb4,
+ 0x98, 0x8, 0xfb, 0x2d, 0xc2, 0x15, 0xb, 0xcc,
+ 0x77, 0xc8, 0x92, 0xc1, 0xc4, 0xb8, 0x5e, 0xf7,
+ 0x2e, 0xfb, 0x1, 0xb0, 0x70, 0xae, 0x8f, 0xf7,
+ 0x2e, 0xfb, 0x1b, 0x9d, 0xb, 0x87, 0x79, 0x89,
+ 0x79, 0x64, 0xa, 0x55, 0xa1, 0x5e, 0x1b, 0x60,
+ 0x81, 0x6c, 0x66, 0xb, 0xc3, 0x1b, 0xb7, 0xc1,
+ 0xbe, 0xac, 0xa4, 0x1f, 0x53, 0xa, 0xb, 0x8f,
+ 0x9d, 0x8d, 0x9d, 0x63, 0xa, 0xc1, 0x75, 0xb8,
+ 0x1b, 0xb6, 0x95, 0xaa, 0xb0, 0xb, 0x3d, 0xa,
+ 0xf7, 0x63, 0x3, 0xb, 0xf7, 0x27, 0x15, 0xa1,
+ 0x92, 0xa0, 0x95, 0x9e, 0x98, 0x8, 0xb, 0x88,
+ 0x9f, 0xa0, 0x8a, 0x9f, 0x1b, 0x90, 0x7, 0x7a,
+ 0x9a, 0xb, 0x93, 0x93, 0x86, 0x82, 0x85, 0x89,
+ 0x86, 0x88, 0x86, 0x1f, 0x74, 0x63, 0x67, 0x7f,
+ 0x62, 0x7e, 0x8, 0xb, 0xae, 0x70, 0xb0, 0x8b,
+ 0xb8, 0x62, 0xb8, 0xc0, 0xc1, 0x59, 0xc1, 0x8e,
+ 0xc8, 0x52, 0xc8, 0x77, 0xcc, 0xb, 0x7a, 0xfb,
+ 0x1b, 0x4b, 0xfb, 0x5b, 0x1a, 0x36, 0xc3, 0x21,
+ 0xec, 0xe5, 0xc2, 0xd4, 0xd2, 0xc3, 0xb, 0xa7,
+ 0xd8, 0xcf, 0xaf, 0xb8, 0x5e, 0xf7, 0xa, 0xfb,
+ 0xa, 0xf7, 0x22, 0x38, 0xc6, 0x83, 0x92, 0xb,
+ 0x74, 0x4e, 0x99, 0xa8, 0x98, 0x99, 0x8d, 0x95,
+ 0xbb, 0xa3, 0x72, 0x6e, 0xad, 0x1f, 0xb, 0x52,
+ 0x1b, 0x5f, 0x55, 0x58, 0x6a, 0x72, 0x1f, 0xb,
+ 0x9d, 0x90, 0x8a, 0x90, 0x90, 0x1a, 0x71, 0xaf,
+ 0xb, 0x79, 0x86, 0x8c, 0x86, 0x86, 0x1a, 0xa5,
+ 0x67, 0xb, 0x13, 0xb2, 0x5a, 0x96, 0x56, 0xa0,
+ 0xb, 0xfb, 0xde, 0x6c, 0x76, 0xf9, 0xa2, 0x77,
+ 0x1, 0xaf, 0xf8, 0x49, 0x3, 0xb, 0xf7, 0x22,
+ 0xfb, 0xb, 0xc6, 0x51, 0xf7, 0xa, 0x5d, 0xb8,
+ 0x5f, 0xb8, 0xb, 0x9c, 0xf7, 0x1b, 0xcb, 0xf7,
+ 0x5b, 0x1a, 0xe0, 0x53, 0xf5, 0x2a, 0xb, 0xa5,
+ 0xa5, 0xa1, 0x76, 0x71, 0x71, 0x75, 0x75, 0x71,
+ 0x71, 0x75, 0xb, 0xf7, 0x4a, 0xfb, 0x6b, 0x15,
+ 0xb, 0xfb, 0x7f, 0x15, 0xb, 0xf7, 0x4a, 0x72,
+ 0xa4, 0xf7, 0x84, 0xa4, 0x72, 0xf7, 0x4a, 0xb,
+ 0x15, 0xf8, 0xad, 0xf8, 0xa8, 0xfc, 0xad, 0x7,
+ 0xe, 0x13, 0xe4, 0x82, 0xb9, 0x55, 0x40, 0xb,
+ 0x13, 0xb2, 0x96, 0x96, 0x56, 0xa0, 0xb, 0x13,
+ 0xb2, 0x9a, 0x96, 0x55, 0xa0, 0xb, 0x75, 0x84,
+ 0x76, 0x81, 0x78, 0x7e, 0xb, 0xf7, 0x11, 0xf8,
+ 0x78, 0xf7, 0x2, 0xb, 0xf7, 0x78, 0xf8, 0x6b,
+ 0x12, 0xb0, 0xb, 0xae, 0x1, 0xae, 0xae, 0xb,
+ 0x5, 0x8d, 0x7, 0xb, 0xf7, 0xf3, 0xf7, 0x7c,
+ 0xfb, 0xf3, 0xf7, 0x7c, 0x5, 0xb, 0x7e, 0x7d,
+ 0x89, 0x81, 0x5b, 0x73, 0xa4, 0xa8, 0x69, 0xb,
+ 0x15, 0x9b, 0x7b, 0x9d, 0x82, 0x90, 0x90, 0x90,
+ 0x90, 0xb, 0x15, 0x90, 0x86, 0x9d, 0x94, 0x9b,
+ 0x9b, 0x9b, 0x9b, 0xb, 0x3, 0xae, 0x16, 0xb,
+ 0x9a, 0x85, 0x97, 0x1e, 0x82, 0x9d, 0x80, 0x98,
+ 0xb, 0x99, 0x8b, 0xf7, 0x2, 0x3e, 0xb7, 0xac,
+ 0x99, 0xb, 0xfb, 0xad, 0x5, 0xf7, 0x35, 0x7,
+ 0xe, 0x13, 0x94, 0x54, 0xec, 0x1b, 0xb, 0x1f,
+ 0x8d, 0x8d, 0x5, 0xb, 0x5, 0x89, 0x7, 0xb
+ };
diff --git a/core/src/fxge/fontdata/chromefontdata/FoxitFixed.c b/core/src/fxge/fontdata/chromefontdata/FoxitFixed.c
new file mode 100644
index 0000000000..8bae0fa82b
--- /dev/null
+++ b/core/src/fxge/fontdata/chromefontdata/FoxitFixed.c
@@ -0,0 +1,2208 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+const unsigned char g_FoxitFixedFontData [17597] = {0x1,
+ 0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0xe,
+ 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x46, 0x69, 0x78,
+ 0x65, 0x64, 0x4f, 0x54, 0x46, 0x0, 0x1, 0x1,
+ 0x1, 0x23, 0xf8, 0x10, 0x0, 0xf8, 0x2a, 0x1,
+ 0xf8, 0x2b, 0x2, 0xf8, 0x2b, 0x3, 0xf8, 0x18,
+ 0x4, 0x6f, 0xfb, 0x8d, 0xf9, 0x8, 0xf9, 0xb7,
+ 0x5, 0xf7, 0x85, 0xf, 0xf9, 0x6c, 0x11, 0xaa,
+ 0x1c, 0x3e, 0x6b, 0x12, 0x0, 0x11, 0x1, 0x1,
+ 0x5, 0xb, 0xd, 0x11, 0x19, 0x22, 0x2b, 0x34,
+ 0x3e, 0x45, 0x4b, 0x4d, 0x51, 0x5d, 0x65, 0x8f,
+ 0x9e, 0x45, 0x75, 0x72, 0x6f, 0x47, 0x63, 0x61,
+ 0x72, 0x6f, 0x6e, 0x49, 0x4a, 0x49, 0x64, 0x6f,
+ 0x74, 0x53, 0x63, 0x65, 0x64, 0x69, 0x6c, 0x6c,
+ 0x61, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x62, 0x6f,
+ 0x74, 0x68, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x64,
+ 0x6f, 0x77, 0x6e, 0x61, 0x72, 0x72, 0x6f, 0x77,
+ 0x6c, 0x65, 0x66, 0x74, 0x61, 0x72, 0x72, 0x6f,
+ 0x77, 0x72, 0x69, 0x67, 0x68, 0x74, 0x61, 0x72,
+ 0x72, 0x6f, 0x77, 0x75, 0x70, 0x67, 0x63, 0x61,
+ 0x72, 0x6f, 0x6e, 0x69, 0x6a, 0x6c, 0x69, 0x72,
+ 0x61, 0x70, 0x72, 0x65, 0x73, 0x63, 0x72, 0x69,
+ 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x63, 0x65,
+ 0x64, 0x69, 0x6c, 0x6c, 0x61, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x68, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x43,
+ 0x68, 0x72, 0x6f, 0x6d, 0x20, 0x46, 0x69, 0x78,
+ 0x65, 0x64, 0x20, 0x4f, 0x54, 0x46, 0x0, 0x0,
+ 0x0, 0x0, 0x22, 0x0, 0x8a, 0x0, 0xab, 0x0,
+ 0xac, 0x0, 0xad, 0x0, 0xae, 0x0, 0xaf, 0x0,
+ 0xb0, 0x0, 0x23, 0x0, 0x24, 0x0, 0xb1, 0x0,
+ 0x25, 0x0, 0x26, 0x0, 0xb2, 0x0, 0xb3, 0x0,
+ 0xb4, 0x0, 0xb5, 0x0, 0x9a, 0x1, 0x87, 0x0,
+ 0x27, 0x0, 0x28, 0x1, 0x88, 0x0, 0x29, 0x0,
+ 0x2a, 0x1, 0x89, 0x0, 0xb6, 0x0, 0xb7, 0x0,
+ 0xb8, 0x1, 0x8a, 0x0, 0xb9, 0x0, 0x2b, 0x0,
+ 0x2c, 0x0, 0x2d, 0x0, 0x8c, 0x0, 0x2e, 0x0,
+ 0x2f, 0x0, 0xba, 0x0, 0x30, 0x0, 0x8e, 0x0,
+ 0xbb, 0x0, 0xbc, 0x0, 0xbd, 0x0, 0xbe, 0x0,
+ 0x8d, 0x0, 0xbf, 0x0, 0x31, 0x0, 0x32, 0x0,
+ 0x33, 0x0, 0x34, 0x0, 0xc0, 0x1, 0x8b, 0x0,
+ 0x35, 0x0, 0x9d, 0x0, 0x36, 0x0, 0xc1, 0x0,
+ 0xc2, 0x0, 0xc3, 0x0, 0xc4, 0x0, 0x37, 0x0,
+ 0x38, 0x0, 0x39, 0x0, 0x3a, 0x0, 0xc5, 0x0,
+ 0xc6, 0x0, 0x3b, 0x0, 0xc7, 0x0, 0x42, 0x0,
+ 0xc8, 0x0, 0xc9, 0x0, 0x7d, 0x0, 0xca, 0x0,
+ 0x90, 0x0, 0xcb, 0x0, 0x7, 0x0, 0xcc, 0x1,
+ 0x8c, 0x1, 0x8d, 0x1, 0x8e, 0x1, 0x8f, 0x1,
+ 0x90, 0x0, 0x3f, 0x0, 0x5f, 0x0, 0xb, 0x0,
+ 0x21, 0x0, 0xcd, 0x0, 0x43, 0x0, 0x3d, 0x0,
+ 0x5d, 0x0, 0x5c, 0x0, 0x5e, 0x0, 0x3c, 0x0,
+ 0x3e, 0x0, 0x81, 0x0, 0xa0, 0x0, 0x74, 0x0,
+ 0x44, 0x0, 0x88, 0x0, 0xce, 0x0, 0x85, 0x0,
+ 0x61, 0x0, 0x7e, 0x0, 0x1b, 0x0, 0xd, 0x0,
+ 0xaa, 0x0, 0x67, 0x0, 0x45, 0x0, 0x70, 0x0,
+ 0x71, 0x0, 0xa1, 0x0, 0x83, 0x0, 0x9f, 0x0,
+ 0x5, 0x0, 0x82, 0x0, 0x91, 0x0, 0x46, 0x0,
+ 0xcf, 0x0, 0xd0, 0x0, 0xd1, 0x0, 0xd2, 0x0,
+ 0x19, 0x0, 0x79, 0x0, 0x89, 0x0, 0x6f, 0x0,
+ 0x1e, 0x0, 0xa7, 0x0, 0x2, 0x0, 0x60, 0x0,
+ 0x47, 0x0, 0x6d, 0x0, 0x16, 0x0, 0x6e, 0x0,
+ 0x65, 0x0, 0x15, 0x0, 0x63, 0x0, 0x48, 0x1,
+ 0x91, 0x0, 0x95, 0x0, 0x7c, 0x0, 0x1f, 0x0,
+ 0x6a, 0x0, 0x78, 0x0, 0x6b, 0x0, 0x6c, 0x0,
+ 0x49, 0x0, 0x86, 0x0, 0xe, 0x0, 0x4a, 0x0,
+ 0xd3, 0x0, 0xd4, 0x0, 0xd5, 0x0, 0xd6, 0x1,
+ 0x92, 0x0, 0x4b, 0x0, 0x4c, 0x0, 0x4d, 0x0,
+ 0x1d, 0x1, 0x93, 0x0, 0x97, 0x0, 0x92, 0x0,
+ 0x4e, 0x0, 0x80, 0x0, 0xa6, 0x0, 0x98, 0x0,
+ 0xa8, 0x0, 0x4f, 0x0, 0x1a, 0x0, 0xd7, 0x0,
+ 0x4, 0x0, 0x50, 0x0, 0xd8, 0x0, 0xd9, 0x0,
+ 0xda, 0x0, 0x94, 0x0, 0x87, 0x0, 0xdb, 0x0,
+ 0x12, 0x0, 0x9b, 0x0, 0x9e, 0x0, 0x96, 0x0,
+ 0x8b, 0x0, 0x8f, 0x0, 0x93, 0x0, 0xdc, 0x0,
+ 0x51, 0x0, 0x73, 0x0, 0x9, 0x0, 0xa, 0x0,
+ 0x6, 0x0, 0xf, 0x0, 0x72, 0x0, 0x7a, 0x0,
+ 0xc, 0x0, 0x9c, 0x1, 0x94, 0x0, 0x52, 0x0,
+ 0x20, 0x0, 0x7b, 0x0, 0x3, 0x0, 0x76, 0x0,
+ 0x69, 0x0, 0x77, 0x0, 0x41, 0x0, 0x8, 0x0,
+ 0x75, 0x0, 0x68, 0x0, 0x53, 0x0, 0xa5, 0x0,
+ 0x84, 0x0, 0x54, 0x0, 0xdd, 0x1, 0x95, 0x0,
+ 0x66, 0x0, 0x1c, 0x0, 0x18, 0x0, 0x17, 0x0,
+ 0x10, 0x0, 0x1, 0x0, 0x62, 0x0, 0x55, 0x0,
+ 0xa2, 0x0, 0x14, 0x0, 0xa3, 0x0, 0xa9, 0x0,
+ 0x7f, 0x0, 0x99, 0x0, 0x13, 0x0, 0xa4, 0x0,
+ 0x56, 0x0, 0xde, 0x0, 0xdf, 0x0, 0xe0, 0x0,
+ 0xe1, 0x0, 0x40, 0x0, 0x57, 0x0, 0x58, 0x0,
+ 0x59, 0x0, 0x5a, 0x0, 0xe2, 0x0, 0xe3, 0x0,
+ 0x64, 0x0, 0x5b, 0x0, 0xe4, 0x0, 0x11, 0x0,
+ 0xf4, 0x2, 0x0, 0x1, 0x0, 0x2, 0x0, 0x4e,
+ 0x0, 0xa8, 0x0, 0xc5, 0x0, 0xf1, 0x1, 0x22,
+ 0x1, 0x41, 0x1, 0x8a, 0x1, 0xd7, 0x2, 0x3b,
+ 0x2, 0x86, 0x3, 0x4, 0x3, 0x3e, 0x3, 0x79,
+ 0x3, 0x92, 0x3, 0xbf, 0x3, 0xf5, 0x4, 0xa,
+ 0x4, 0x57, 0x4, 0xd4, 0x5, 0xb, 0x5, 0x3c,
+ 0x5, 0x71, 0x5, 0xac, 0x5, 0xc9, 0x6, 0x15,
+ 0x6, 0x32, 0x6, 0x5b, 0x6, 0x78, 0x6, 0xa1,
+ 0x6, 0xbd, 0x6, 0xef, 0x7, 0x39, 0x7, 0x5b,
+ 0x7, 0x95, 0x7, 0xd5, 0x8, 0x7, 0x8, 0x7a,
+ 0x8, 0xc3, 0x9, 0x1c, 0x9, 0x39, 0x9, 0x4b,
+ 0x9, 0x6d, 0x9, 0x88, 0xa, 0x1, 0xa, 0x47,
+ 0xa, 0x8b, 0xb, 0x27, 0xb, 0x83, 0xb, 0xfa,
+ 0xc, 0x80, 0xd, 0x26, 0xd, 0x5f, 0xd, 0xb9,
+ 0xd, 0xf8, 0xe, 0x15, 0xe, 0x25, 0xe, 0x46,
+ 0xe, 0x61, 0xe, 0x92, 0xe, 0xd8, 0xf, 0x1d,
+ 0xf, 0x5a, 0xf, 0x78, 0xf, 0x9e, 0xf, 0xc9,
+ 0x10, 0x10, 0x10, 0x73, 0x10, 0x89, 0x10, 0xab,
+ 0x10, 0xbd, 0x10, 0xf4, 0x11, 0x88, 0x11, 0x9e,
+ 0x12, 0x1d, 0x12, 0x5b, 0x12, 0x79, 0x12, 0xa1,
+ 0x12, 0xae, 0x12, 0xc6, 0x12, 0xec, 0x13, 0x1b,
+ 0x13, 0x5f, 0x13, 0x95, 0x14, 0x31, 0x14, 0x84,
+ 0x14, 0xe3, 0x14, 0xfb, 0x15, 0x10, 0x15, 0x61,
+ 0x15, 0xb3, 0x15, 0xd1, 0x15, 0xed, 0x16, 0x11,
+ 0x16, 0x2e, 0x16, 0x4f, 0x16, 0x96, 0x16, 0xb8,
+ 0x17, 0x37, 0x17, 0x77, 0x17, 0xd2, 0x17, 0xf7,
+ 0x18, 0xb, 0x18, 0x1e, 0x18, 0xa6, 0x19, 0x15,
+ 0x19, 0x73, 0x19, 0x96, 0x19, 0xda, 0x1a, 0x13,
+ 0x1a, 0x35, 0x1a, 0x58, 0x1a, 0xdf, 0x1a, 0xf1,
+ 0x1b, 0x7, 0x1b, 0x5b, 0x1b, 0x71, 0x1b, 0x93,
+ 0x1b, 0xa5, 0x1b, 0xc1, 0x1c, 0x36, 0x1c, 0x82,
+ 0x1c, 0x94, 0x1c, 0xa7, 0x1c, 0xc6, 0x1d, 0x38,
+ 0x1d, 0x70, 0x1d, 0x9f, 0x1d, 0xe4, 0x1e, 0x17,
+ 0x1e, 0x6b, 0x1e, 0x98, 0x1e, 0xf6, 0x1f, 0x2c,
+ 0x1f, 0x41, 0x1f, 0x7b, 0x1f, 0xc1, 0x20, 0x4a,
+ 0x20, 0x5b, 0x20, 0x82, 0x20, 0xb1, 0x20, 0xe2,
+ 0x21, 0x2, 0x21, 0x23, 0x21, 0x67, 0x21, 0x7d,
+ 0x21, 0x90, 0x21, 0xb5, 0x21, 0xcd, 0x21, 0xf6,
+ 0x22, 0x15, 0x22, 0x2d, 0x22, 0x85, 0x22, 0xc6,
+ 0x23, 0xc, 0x23, 0x25, 0x23, 0x4a, 0x23, 0xeb,
+ 0x24, 0x2, 0x24, 0x36, 0x24, 0x91, 0x24, 0xa6,
+ 0x24, 0xb9, 0x25, 0xa, 0x25, 0x36, 0x25, 0x76,
+ 0x25, 0xc8, 0x26, 0x55, 0x26, 0xb1, 0x26, 0xf3,
+ 0x27, 0xc, 0x27, 0x33, 0x27, 0x53, 0x27, 0xd5,
+ 0x28, 0x4, 0x28, 0x1d, 0x28, 0x41, 0x28, 0xac,
+ 0x29, 0xf, 0x29, 0x33, 0x29, 0x8f, 0x29, 0xca,
+ 0x2a, 0x3f, 0x2a, 0x92, 0x2a, 0xe1, 0x2b, 0xb,
+ 0x2b, 0x3e, 0x2b, 0x71, 0x2b, 0xb3, 0x2b, 0xcc,
+ 0x2b, 0xed, 0x2c, 0x52, 0x2c, 0x77, 0x2c, 0xa7,
+ 0x2d, 0x19, 0x2d, 0x66, 0x2d, 0xab, 0x2e, 0x7,
+ 0x2e, 0x1e, 0x2e, 0x26, 0x2e, 0x48, 0x2e, 0x50,
+ 0x2e, 0x5e, 0x2e, 0x6c, 0x2e, 0x7a, 0x2e, 0x90,
+ 0x2e, 0xda, 0x2f, 0x66, 0x2f, 0x9f, 0x30, 0xc,
+ 0x30, 0x94, 0x31, 0x3a, 0x31, 0xe9, 0x32, 0x9,
+ 0x32, 0x27, 0x32, 0x79, 0x32, 0x90, 0x32, 0x91,
+ 0x33, 0x25, 0x33, 0x63, 0x33, 0xbd, 0x34, 0x1f,
+ 0x34, 0xb8, 0x35, 0x15, 0x35, 0x56, 0x35, 0x9a,
+ 0x35, 0xe0, 0x36, 0x1f, 0x36, 0x64, 0x36, 0x7b,
+ 0x36, 0x9b, 0x36, 0xcd, 0x36, 0xe4, 0x36, 0xf4,
+ 0x37, 0x25, 0x37, 0x65, 0x37, 0xb2, 0x37, 0xec,
+ 0x38, 0x36, 0x38, 0x8f, 0x38, 0xe7, 0x39, 0x10,
+ 0x39, 0x5a, 0x39, 0xa7, 0xe, 0x8b, 0xc1, 0xf7,
+ 0x4, 0xc1, 0xf7, 0xb4, 0xc1, 0x1, 0x8e, 0xf7,
+ 0x63, 0xab, 0xee, 0xbf, 0xf7, 0x60, 0x3, 0x8e,
+ 0x16, 0xf7, 0x63, 0xc1, 0x33, 0x6, 0xb6, 0xf7,
+ 0x4, 0x5, 0xf7, 0xaa, 0x6, 0xb7, 0xfb, 0x4,
+ 0x5, 0x2d, 0x55, 0xf7, 0x60, 0xc1, 0x56, 0x6,
+ 0xfb, 0x5f, 0xf8, 0x90, 0x5, 0xfb, 0x81, 0x55,
+ 0xf7, 0x1e, 0x6, 0xfb, 0x46, 0xfc, 0x5a, 0x5,
+ 0x4e, 0x6, 0xf7, 0x4a, 0xf7, 0x3a, 0x15, 0xf7,
+ 0x7, 0xf7, 0xba, 0xf7, 0xf, 0xfb, 0xba, 0x5,
+ 0xe, 0x8b, 0xc2, 0xf7, 0x3, 0xc2, 0xac, 0xc2,
+ 0xf7, 0x5b, 0xc1, 0x1, 0xdc, 0xc4, 0xf7, 0xa,
+ 0xc3, 0x8b, 0xc2, 0xdc, 0xc1, 0x9c, 0xc2, 0x3,
+ 0xa5, 0x16, 0xf7, 0x5a, 0xc2, 0x35, 0x6, 0xb7,
+ 0xf7, 0x3, 0x5, 0xf7, 0x16, 0xfb, 0x3a, 0xf7,
+ 0x9a, 0xf7, 0x2e, 0x54, 0x28, 0xfb, 0x2c, 0xf7,
+ 0x5b, 0xdc, 0x53, 0xc1, 0xf7, 0x3a, 0x55, 0x54,
+ 0x3a, 0xf7, 0x5b, 0xf7, 0x2c, 0x25, 0xc2, 0xf7,
+ 0x30, 0xfc, 0x2c, 0x55, 0xe5, 0x6, 0xfb, 0x43,
+ 0xfc, 0x59, 0x5, 0x54, 0x6, 0xf7, 0x44, 0xf7,
+ 0x3a, 0x15, 0xf7, 0x2, 0xf7, 0xb2, 0x5, 0xfb,
+ 0xb2, 0x7, 0xe, 0x4d, 0xa, 0xf7, 0x78, 0x77,
+ 0x1, 0x54, 0xa, 0x3, 0x8e, 0x16, 0x24, 0xa,
+ 0xfb, 0x95, 0xf8, 0x18, 0x15, 0xf7, 0xac, 0xf0,
+ 0x6a, 0xd4, 0xfb, 0x96, 0xfb, 0x24, 0x5, 0xe,
+ 0x4d, 0xa, 0xf7, 0x2f, 0xc2, 0x1, 0x54, 0xa,
+ 0x3, 0xf7, 0x2d, 0xf8, 0xf1, 0x15, 0xf7, 0x26,
+ 0xf7, 0x7, 0xf7, 0x22, 0xfb, 0x7, 0xb3, 0x9d,
+ 0xfb, 0x24, 0xf7, 0x2c, 0x5, 0x3d, 0x6, 0xfb,
+ 0x25, 0xfb, 0x2c, 0x5, 0xfb, 0x3, 0xfd, 0x3,
+ 0x15, 0x24, 0xa, 0xe, 0x8b, 0xc1, 0xf7, 0x11,
+ 0xc1, 0xf7, 0xaa, 0xc1, 0xda, 0xf7, 0x9, 0x12,
+ 0x8e, 0xf7, 0x63, 0x73, 0xdc, 0xca, 0xdc, 0x79,
+ 0xf7, 0x60, 0x13, 0xf6, 0xf7, 0xde, 0xf9, 0x18,
+ 0x72, 0xa, 0xfb, 0x24, 0xfb, 0x9, 0x72, 0xa,
+ 0xfb, 0x4b, 0xfd, 0x8d, 0x15, 0x2d, 0xa, 0x6,
+ 0x13, 0xe9, 0x39, 0xa, 0xe, 0x4d, 0xa, 0x12,
+ 0x54, 0xa, 0x17, 0x8e, 0x16, 0x25, 0xa, 0x13,
+ 0x40, 0xf7, 0x3, 0xf7, 0xbb, 0xf7, 0xb, 0xfb,
+ 0xbb, 0x5, 0xfb, 0x9f, 0xf8, 0x7d, 0x79, 0xa,
+ 0xf7, 0x24, 0x5, 0xe, 0x4d, 0xa, 0xb0, 0xbd,
+ 0xdb, 0xbe, 0x12, 0x8e, 0xf7, 0x63, 0x83, 0xbe,
+ 0xdb, 0xc0, 0x92, 0xf7, 0x60, 0x13, 0xfb, 0x80,
+ 0xf7, 0x5e, 0xf9, 0x47, 0x15, 0x58, 0xb4, 0x65,
+ 0xbe, 0xbe, 0xb4, 0xb1, 0xbe, 0xbe, 0x62, 0xb4,
+ 0x58, 0x58, 0x62, 0x62, 0x58, 0x1e, 0xbe, 0x8c,
+ 0x15, 0xa1, 0x9d, 0x9d, 0xa1, 0xa1, 0x9d, 0x79,
+ 0x75, 0x75, 0x79, 0x79, 0x75, 0x75, 0x79, 0x9d,
+ 0xa1, 0x1e, 0x13, 0xfd, 0x80, 0xfb, 0x8e, 0xfd,
+ 0x48, 0x15, 0x24, 0xa, 0xe, 0x8b, 0xc1, 0xf7,
+ 0xb, 0xc1, 0xf7, 0xa7, 0xc1, 0xdd, 0xbc, 0x1,
+ 0x54, 0xa, 0x3, 0xf7, 0x31, 0xf9, 0x17, 0x15,
+ 0x9e, 0x93, 0x9e, 0xb4, 0xbc, 0x1b, 0xa1, 0x9d,
+ 0x7e, 0x7c, 0xa0, 0x1f, 0x79, 0xa4, 0xa7, 0x78,
+ 0xb2, 0x1b, 0xcf, 0xad, 0xca, 0xb1, 0x96, 0x1f,
+ 0x58, 0x94, 0x5, 0x73, 0x83, 0x72, 0x66, 0x65,
+ 0x1b, 0x75, 0x7a, 0x9d, 0x9c, 0x75, 0x1f, 0x9a,
+ 0x77, 0x72, 0x9a, 0x63, 0x1b, 0x52, 0x5b, 0x5d,
+ 0x56, 0x78, 0x1f, 0x23, 0xfd, 0x21, 0x15, 0x24,
+ 0xa, 0xe, 0x8b, 0xc1, 0xf7, 0x5b, 0xc2, 0xf7,
+ 0x5c, 0xc1, 0x12, 0xf7, 0xb, 0xc2, 0xf7, 0xb0,
+ 0xc9, 0x74, 0xc8, 0x13, 0xf4, 0xb5, 0x16, 0xf7,
+ 0xbd, 0x6, 0xf7, 0x17, 0xe3, 0xb6, 0xf7, 0x0,
+ 0xd8, 0x4b, 0xb5, 0x4b, 0x97, 0x1f, 0x13, 0xf8,
+ 0xc0, 0x9b, 0xb0, 0xc7, 0xc1, 0x1a, 0xf7, 0xb,
+ 0x34, 0xaa, 0xfb, 0xc, 0x1e, 0xfb, 0xa3, 0x55,
+ 0xd8, 0xfc, 0x5a, 0x3e, 0x6, 0xf7, 0x18, 0xf7,
+ 0x8f, 0x15, 0xf7, 0x5f, 0x7, 0xf7, 0x2d, 0xf7,
+ 0x17, 0x92, 0x24, 0x32, 0x34, 0x79, 0x55, 0x1f,
+ 0xfb, 0x23, 0xfb, 0x8f, 0x15, 0xf7, 0x58, 0x7,
+ 0x13, 0xf4, 0xf7, 0x5d, 0xf7, 0xe, 0x7c, 0x36,
+ 0x37, 0x2e, 0x7f, 0x4a, 0x1f, 0xe, 0x79, 0xc1,
+ 0xf8, 0x7e, 0xc1, 0x1, 0xb9, 0xc3, 0xf8, 0x13,
+ 0xc1, 0x3, 0xf8, 0x9b, 0xf5, 0x15, 0x64, 0x56,
+ 0x39, 0x6c, 0x47, 0x1b, 0xfb, 0x9, 0x2a, 0xe9,
+ 0xf7, 0x32, 0xf7, 0x3f, 0xf7, 0x1f, 0xce, 0xd6,
+ 0xcb, 0xd5, 0x64, 0x59, 0xaa, 0x1f, 0x31, 0xc1,
+ 0xf7, 0x7d, 0x55, 0x4e, 0x7, 0xbd, 0x56, 0x4c,
+ 0x96, 0x56, 0x1b, 0xfb, 0x31, 0xfb, 0x5, 0xfb,
+ 0x1f, 0xfb, 0x2d, 0xfb, 0x39, 0xec, 0xfb, 0x21,
+ 0xf7, 0x41, 0xda, 0xe8, 0xa9, 0xb8, 0xc8, 0x1f,
+ 0xe, 0xfb, 0x16, 0x76, 0xf7, 0x3f, 0xbf, 0xf8,
+ 0x5d, 0xbe, 0x1, 0xbd, 0xc4, 0xf8, 0x15, 0xc4,
+ 0x3, 0xf7, 0x7c, 0xfb, 0xb, 0x15, 0x83, 0x92,
+ 0xa2, 0x73, 0xa7, 0x1b, 0xad, 0xb0, 0xa0, 0xc5,
+ 0xab, 0x7a, 0xa8, 0x6f, 0x94, 0x1f, 0x8d, 0xa1,
+ 0x5, 0xe6, 0xd9, 0xa3, 0xb5, 0xc9, 0x1f, 0x73,
+ 0xbb, 0x5, 0x66, 0x55, 0x47, 0x72, 0x46, 0x1b,
+ 0xfb, 0x15, 0x29, 0xe1, 0xf7, 0x28, 0xf7, 0x43,
+ 0xf7, 0x1f, 0xbb, 0xd7, 0xcc, 0xc7, 0x6e, 0x5f,
+ 0xb8, 0x1f, 0x35, 0xc4, 0xf7, 0x66, 0x52, 0x52,
+ 0x7, 0xbd, 0x43, 0x59, 0x92, 0x54, 0x1b, 0xfb,
+ 0x33, 0x21, 0xfb, 0x11, 0xfb, 0x24, 0xfb, 0x1e,
+ 0xd4, 0xfb, 0xe, 0xf7, 0x28, 0x70, 0x1f, 0x82,
+ 0x42, 0x5, 0x8f, 0x94, 0x94, 0x8b, 0x94, 0x1b,
+ 0x9a, 0x97, 0x7d, 0x7f, 0x76, 0x7d, 0x81, 0x7c,
+ 0x7d, 0x7b, 0x90, 0x9a, 0x82, 0x1f, 0xe, 0x46,
+ 0xa, 0xf7, 0x3, 0xc4, 0xf7, 0xe6, 0xc6, 0x3,
+ 0xad, 0x16, 0xf7, 0x7a, 0x6, 0xf7, 0x21, 0xf7,
+ 0x34, 0xc4, 0xf7, 0x7b, 0xf7, 0x62, 0xfb, 0x1c,
+ 0xcf, 0xfb, 0x39, 0x1f, 0xfb, 0x7a, 0x54, 0xd8,
+ 0xfc, 0x58, 0x3e, 0x6, 0xf7, 0x1a, 0x16, 0xf8,
+ 0x58, 0xeb, 0x7, 0xf7, 0x31, 0xe0, 0x47, 0xfb,
+ 0x2b, 0xfb, 0x35, 0x31, 0x43, 0xfb, 0x2c, 0x1f,
+ 0xe, 0x8b, 0xc0, 0xf7, 0x5c, 0xc1, 0xf7, 0x5d,
+ 0xc1, 0x1, 0xf7, 0x1a, 0xc3, 0xf7, 0x7, 0xc4,
+ 0xef, 0xc3, 0x3, 0xbf, 0x16, 0xf8, 0x66, 0xf7,
+ 0x4f, 0x53, 0xfb, 0x1a, 0xfb, 0xa4, 0xf7, 0x5c,
+ 0xf7, 0x7, 0x39, 0xc4, 0xf7, 0x6f, 0x52, 0x38,
+ 0xfb, 0x7, 0xf7, 0x5d, 0xf7, 0xa4, 0xfb, 0x1a,
+ 0xc3, 0xf7, 0x50, 0xfc, 0x66, 0x55, 0xdd, 0xfc,
+ 0x5b, 0x39, 0x6, 0xe, 0x47, 0xa, 0xf7, 0x58,
+ 0xf8, 0xfe, 0x15, 0xf7, 0xb8, 0xf0, 0x69, 0xd5,
+ 0xfb, 0xa3, 0xfb, 0x25, 0x5, 0xfb, 0x18, 0xfd,
+ 0x1c, 0x15, 0x2f, 0xa, 0xe, 0x4e, 0xa, 0xf7,
+ 0x7a, 0x77, 0x12, 0x61, 0xa, 0x17, 0xf7, 0x36,
+ 0xf9, 0x5, 0x15, 0x13, 0xfe, 0xf7, 0x2d, 0xf7,
+ 0x7, 0xf7, 0x29, 0xfb, 0x7, 0xb5, 0x9d, 0xfb,
+ 0x2b, 0xf7, 0x2c, 0x5, 0x39, 0x6, 0xfb, 0x2b,
+ 0xfb, 0x2b, 0x5, 0x44, 0xfd, 0x18, 0x15, 0x2f,
+ 0xa, 0xe, 0x4e, 0xa, 0xe5, 0xf7, 0x8, 0x12,
+ 0xf7, 0x1a, 0xc2, 0x93, 0xe0, 0xcb, 0xe1, 0x3c,
+ 0xc4, 0xdd, 0xc3, 0x13, 0xfe, 0x80, 0xf7, 0xee,
+ 0xf9, 0x23, 0x15, 0xe1, 0xf7, 0x8, 0x35, 0x6,
+ 0xfb, 0x29, 0xfb, 0x8, 0x15, 0xe0, 0xf7, 0x8,
+ 0x36, 0x6, 0xfb, 0x26, 0xfd, 0x97, 0x15, 0x40,
+ 0xa, 0x6, 0x13, 0xfd, 0x80, 0x2e, 0xa, 0xe,
+ 0x47, 0xa, 0xbe, 0x16, 0x2f, 0xa, 0xf8, 0x27,
+ 0xf8, 0xc9, 0x15, 0x96, 0xa9, 0xfb, 0xa4, 0xf7,
+ 0x24, 0x69, 0x42, 0x5, 0xe, 0x8b, 0xc1, 0xf7,
+ 0x56, 0xc0, 0xf7, 0x63, 0xc1, 0x1, 0xf7, 0x1,
+ 0xc3, 0xf7, 0xeb, 0xcb, 0x3, 0xa7, 0x16, 0xf7,
+ 0x8d, 0x6, 0xf7, 0x35, 0xf7, 0x1a, 0xc4, 0xf7,
+ 0x7f, 0xf7, 0x68, 0xfb, 0x33, 0xc5, 0xfb, 0x37,
+ 0x1f, 0xfb, 0x72, 0x55, 0xdc, 0xfb, 0x63, 0x3d,
+ 0x56, 0xd9, 0xfb, 0x56, 0x3a, 0x6, 0xf7, 0x1d,
+ 0x16, 0xf7, 0x56, 0xf7, 0x4d, 0xc0, 0xfb, 0x4d,
+ 0xf7, 0x63, 0xe0, 0x7, 0xf7, 0x37, 0xea, 0x4c,
+ 0xfb, 0x2d, 0xfb, 0x3b, 0x41, 0x44, 0xfb, 0x31,
+ 0x1f, 0xe, 0x8b, 0xbf, 0xf7, 0x27, 0xbf, 0xc3,
+ 0xc0, 0xf7, 0x2b, 0xbe, 0x1, 0xd8, 0xc7, 0xf8,
+ 0x25, 0xc6, 0x3, 0x8e, 0xf7, 0x57, 0x15, 0xe0,
+ 0x6, 0xfb, 0x9, 0xaa, 0xe8, 0x3d, 0xf7, 0x30,
+ 0x1b, 0xde, 0xdc, 0xa6, 0xb6, 0xcc, 0x1f, 0x71,
+ 0xb8, 0x5, 0x65, 0x53, 0x44, 0x72, 0x44, 0x1b,
+ 0x20, 0x35, 0xb8, 0xed, 0x6b, 0x1f, 0xf7, 0x83,
+ 0x6, 0xa1, 0xbf, 0x5, 0xfb, 0xa4, 0x6, 0x9b,
+ 0x89, 0xa7, 0x8d, 0x9b, 0x1e, 0xf7, 0xb7, 0x6,
+ 0x9f, 0xc0, 0x5, 0xfb, 0xc1, 0x6, 0xe4, 0xa4,
+ 0xd8, 0xc9, 0xf0, 0x1b, 0xd5, 0xd5, 0x73, 0x64,
+ 0xb3, 0x1f, 0x3e, 0xc6, 0xf7, 0x53, 0x50, 0x5a,
+ 0x7, 0xac, 0x56, 0x54, 0x9b, 0x3e, 0x1b, 0xfb,
+ 0x1f, 0x28, 0x33, 0xfb, 0x6, 0x6e, 0x1f, 0x4e,
+ 0x6, 0x75, 0x56, 0x5, 0xd5, 0x6, 0x70, 0x8c,
+ 0x75, 0x8c, 0x80, 0x1e, 0x55, 0x6, 0xe, 0x8b,
+ 0xc2, 0xf7, 0x5f, 0xc2, 0xf7, 0x56, 0xc2, 0x1,
+ 0xf7, 0x18, 0xc2, 0xf7, 0x35, 0xc2, 0xe3, 0xc2,
+ 0x3, 0xc1, 0x16, 0xf7, 0x9c, 0xc2, 0xfb, 0x17,
+ 0xf7, 0x5f, 0xf7, 0x35, 0x38, 0xc2, 0xf7, 0x72,
+ 0x54, 0x37, 0xfb, 0x35, 0xf7, 0x56, 0xf7, 0xc4,
+ 0xfb, 0x11, 0xc2, 0xf7, 0x48, 0xfc, 0x80, 0x54,
+ 0xd9, 0xfc, 0x58, 0x3d, 0x6, 0xe, 0x79, 0xc2,
+ 0xf7, 0x39, 0xc2, 0xf7, 0xa0, 0xc2, 0x1, 0xad,
+ 0xc5, 0xf8, 0x12, 0xc2, 0x3, 0xf7, 0xcc, 0x7c,
+ 0xa, 0x7b, 0x6a, 0x48, 0x79, 0x54, 0x1b, 0xfb,
+ 0x23, 0x37, 0xf7, 0x8, 0xf7, 0x12, 0xf7, 0x44,
+ 0xf7, 0x2, 0x43, 0xa, 0x23, 0xfb, 0x1d, 0xfb,
+ 0x37, 0xfb, 0x21, 0xdd, 0x53, 0xa, 0xe, 0x79,
+ 0xc2, 0xf7, 0x3b, 0xc2, 0xf7, 0x9e, 0xc2, 0x1,
+ 0xa7, 0xc5, 0xf8, 0x11, 0xc2, 0x3, 0xf7, 0xc5,
+ 0x7c, 0xa, 0x76, 0x4b, 0x67, 0x7e, 0x54, 0x1b,
+ 0xfb, 0x23, 0x38, 0xf7, 0x8, 0xf7, 0x12, 0xf7,
+ 0x44, 0xf7, 0x1, 0x43, 0xa, 0x24, 0xfb, 0x1d,
+ 0xfb, 0x37, 0xfb, 0x21, 0xdc, 0x53, 0xa, 0x68,
+ 0xf8, 0x6, 0x37, 0xa, 0x8b, 0xc2, 0xf7, 0x5a,
+ 0xc2, 0xf7, 0x5b, 0xc2, 0x1, 0xf7, 0x1, 0xc1,
+ 0xf7, 0xa6, 0xc1, 0x3, 0xab, 0x16, 0xf7, 0x70,
+ 0xc2, 0x32, 0xf7, 0x5a, 0xf7, 0xa6, 0xfb, 0x5a,
+ 0x33, 0x54, 0xf7, 0x6f, 0xc2, 0x3e, 0xf8, 0x58,
+ 0xd8, 0xc2, 0xfb, 0x65, 0x54, 0xd9, 0xfb, 0x5b,
+ 0xfb, 0xa6, 0xf7, 0x5b, 0xda, 0xc2, 0xfb, 0x66,
+ 0x54, 0xd8, 0xfc, 0x58, 0x3e, 0x6, 0xe, 0x46,
+ 0xa, 0xf7, 0xa3, 0xc2, 0x3, 0xeb, 0x16, 0xf8,
+ 0x2c, 0xc2, 0xfb, 0x46, 0xf8, 0x58, 0xf7, 0x38,
+ 0xc2, 0xfc, 0x11, 0x54, 0xf7, 0x36, 0xfc, 0x58,
+ 0xfb, 0x43, 0x6, 0xe, 0x79, 0xc3, 0xf8, 0x68,
+ 0xc3, 0x1, 0xec, 0xc5, 0xf7, 0xd, 0xc2, 0xf7,
+ 0x22, 0xc4, 0x3, 0xa3, 0x79, 0x15, 0xf7, 0x62,
+ 0xc3, 0x40, 0xf8, 0x68, 0xd1, 0xc3, 0xfb, 0x5c,
+ 0x53, 0xd3, 0xfc, 0x68, 0x42, 0x6, 0xf7, 0x90,
+ 0xa0, 0x15, 0x85, 0x8c, 0xaa, 0x44, 0xf1, 0x1b,
+ 0xf7, 0xb, 0x8c, 0xf7, 0x24, 0xc2, 0x1f, 0x8c,
+ 0xf7, 0xda, 0x5, 0xb7, 0xc2, 0xfb, 0x4c, 0x54,
+ 0xde, 0x6, 0x8a, 0xfb, 0xd9, 0x5, 0x6f, 0x8e,
+ 0xfb, 0xc, 0x45, 0x71, 0x5a, 0x95, 0x7f, 0xa,
+ 0x6c, 0xa, 0x1, 0xf7, 0xa3, 0xc5, 0x3, 0xf7,
+ 0x48, 0xf8, 0xfe, 0x15, 0xf7, 0xc7, 0xf2, 0x68,
+ 0xd3, 0xfb, 0xb1, 0xfb, 0x25, 0x5, 0x44, 0xfd,
+ 0x1c, 0x15, 0x32, 0xa, 0xe, 0x6c, 0xa, 0x1,
+ 0xf7, 0xa3, 0xc5, 0x3, 0xf7, 0x25, 0xf8, 0xfb,
+ 0x15, 0xf7, 0x2e, 0xf7, 0x7, 0xf7, 0x30, 0xfb,
+ 0x7, 0xb7, 0x9d, 0xfb, 0x31, 0xf7, 0x2c, 0x5,
+ 0x35, 0x6, 0xfb, 0x2f, 0xfb, 0x2c, 0x5, 0x86,
+ 0xfd, 0xd, 0x15, 0x32, 0xa, 0xe, 0x6c, 0xa,
+ 0xe3, 0xf7, 0x8, 0x1, 0xf7, 0xa3, 0xc5, 0x3,
+ 0xf7, 0xe6, 0xf9, 0x20, 0x76, 0xa, 0xfb, 0x31,
+ 0xfb, 0x8, 0x76, 0xa, 0x36, 0xfd, 0x94, 0x15,
+ 0x32, 0xa, 0xe, 0x8b, 0xc1, 0xf8, 0x5e, 0xc1,
+ 0xcd, 0xf7, 0x8, 0x12, 0xf7, 0x95, 0xe5, 0x3f,
+ 0xc5, 0x13, 0xe8, 0xeb, 0x16, 0xf8, 0x2c, 0xc1,
+ 0xfb, 0x43, 0xf8, 0x5e, 0x42, 0xa, 0xfc, 0x5e,
+ 0xfb, 0x43, 0x6, 0x13, 0xf0, 0xf7, 0x35, 0xf8,
+ 0xd6, 0x76, 0xa, 0xe, 0x6c, 0xa, 0x1, 0x8b,
+ 0xa0, 0xf7, 0x8e, 0xc5, 0x3, 0xeb, 0x16, 0x32,
+ 0xa, 0xb9, 0xf9, 0x2d, 0x15, 0xf7, 0xc8, 0x26,
+ 0x97, 0xa9, 0xfb, 0xaf, 0xf7, 0x25, 0x5, 0xe,
+ 0x79, 0xba, 0xf8, 0x72, 0xc2, 0x1, 0xb7, 0xc2,
+ 0xf7, 0xa2, 0xc0, 0x3, 0xb7, 0xca, 0x15, 0x4c,
+ 0xc8, 0xd7, 0x79, 0xd0, 0x1b, 0xf7, 0x31, 0x9a,
+ 0xf4, 0xe9, 0x1f, 0xf7, 0xda, 0xf7, 0x1a, 0xc2,
+ 0xfc, 0x15, 0x54, 0xf7, 0x5a, 0xfb, 0xd9, 0x7,
+ 0x36, 0x80, 0x47, 0xfb, 0x6, 0x50, 0x35, 0x9a,
+ 0x7f, 0xa, 0x8b, 0xc1, 0xf8, 0x59, 0xc2, 0x1,
+ 0xf6, 0xc0, 0xf7, 0x47, 0xf7, 0x59, 0x3, 0xa7,
+ 0x16, 0xf7, 0x71, 0xc1, 0x32, 0xf7, 0x38, 0x6,
+ 0xdd, 0xdd, 0xe6, 0xfb, 0xa, 0xbd, 0x2d, 0xb6,
+ 0x33, 0x19, 0xf7, 0x26, 0xc1, 0xfb, 0x6, 0x6,
+ 0x5e, 0xea, 0x4c, 0xf0, 0x44, 0xde, 0xf7, 0x4d,
+ 0xf7, 0x42, 0x18, 0xd3, 0xc2, 0xfb, 0x59, 0x54,
+ 0xc5, 0x6, 0xfb, 0x81, 0xfb, 0x73, 0x5, 0xf7,
+ 0x73, 0xd9, 0xc2, 0xfb, 0x66, 0x54, 0xda, 0xfc,
+ 0x59, 0x3c, 0x7, 0xe, 0x46, 0xa, 0xf7, 0x2c,
+ 0xc2, 0xf7, 0xb7, 0xc2, 0x3, 0xb9, 0x16, 0xf8,
+ 0x8f, 0xf7, 0x8b, 0x54, 0xfb, 0x54, 0xfb, 0xb7,
+ 0xf8, 0x58, 0xf7, 0x11, 0xc2, 0xfb, 0xb2, 0x54,
+ 0xf5, 0xfc, 0x58, 0x21, 0x6, 0xe, 0x75, 0xa,
+ 0xf7, 0x2d, 0xc3, 0xf7, 0xb4, 0xc3, 0x3, 0xb9,
+ 0x16, 0xf8, 0x8f, 0xf7, 0x91, 0x53, 0xfb, 0x5b,
+ 0xfb, 0xb4, 0xf7, 0x4e, 0x6, 0xf7, 0x43, 0xd1,
+ 0x5, 0xc2, 0x7, 0xfb, 0x43, 0x44, 0x5, 0xf7,
+ 0x6a, 0xf7, 0x12, 0xc1, 0xfb, 0xb5, 0x55, 0xf6,
+ 0xfb, 0x80, 0x7, 0x37, 0x69, 0x5, 0x55, 0x7,
+ 0xdf, 0xad, 0x5, 0xfb, 0x38, 0x20, 0x7, 0xe,
+ 0x46, 0xa, 0xd1, 0xc3, 0xf7, 0xf2, 0xc3, 0x3,
+ 0xa0, 0x16, 0xf7, 0x3a, 0xc2, 0x4e, 0xf8, 0x58,
+ 0x93, 0x6, 0xf7, 0x26, 0xfc, 0xe, 0x5, 0xb6,
+ 0x6, 0xf7, 0x23, 0xf8, 0xe, 0x5, 0x95, 0xfc,
+ 0x58, 0x52, 0x54, 0xf7, 0x34, 0xc2, 0x5c, 0xf8,
+ 0x58, 0xb9, 0xc2, 0xfb, 0x25, 0x6, 0xfb, 0x16,
+ 0xfb, 0xeb, 0xfb, 0x19, 0xf7, 0xeb, 0x5, 0xfb,
+ 0x29, 0x54, 0xbc, 0xfc, 0x58, 0x5a, 0x6, 0xe,
+ 0x46, 0xa, 0xe4, 0xc4, 0xf7, 0xcd, 0xc3, 0x3,
+ 0x92, 0x16, 0xf7, 0x8d, 0xc2, 0xfb, 0x2, 0xf8,
+ 0x41, 0x6, 0xf7, 0xba, 0xfc, 0x78, 0x5, 0xd6,
+ 0xf8, 0x8f, 0xd9, 0xc2, 0xfb, 0x93, 0x54, 0xf7,
+ 0xd, 0xfc, 0x44, 0x6, 0xfb, 0xb9, 0xf8, 0x7b,
+ 0x5, 0xfb, 0x33, 0x54, 0xdd, 0xfc, 0x58, 0x39,
+ 0x6, 0xe, 0x8c, 0xbf, 0xf8, 0x5b, 0xc0, 0xd7,
+ 0xbf, 0x99, 0xbc, 0x1, 0xe4, 0xc4, 0xf7, 0xcd,
+ 0xc3, 0x3, 0x92, 0x8c, 0x15, 0xf7, 0x8d, 0xbf,
+ 0xfb, 0x2, 0xf8, 0x45, 0x6, 0xf7, 0xba, 0xfc,
+ 0x79, 0x5, 0xd6, 0xf8, 0x8f, 0xd9, 0xc0, 0xfb,
+ 0x88, 0x56, 0xf7, 0x2, 0xfc, 0x47, 0x6, 0xfb,
+ 0xb9, 0xf8, 0x7c, 0x5, 0xfb, 0x33, 0x56, 0xdd,
+ 0xfc, 0x5b, 0x39, 0x6, 0xf7, 0x2e, 0xf8, 0xe0,
+ 0x15, 0x9f, 0x93, 0x9f, 0xb5, 0xbd, 0x1b, 0xa5,
+ 0xa1, 0x78, 0x79, 0xa4, 0x1f, 0x7a, 0xa3, 0xa5,
+ 0x7f, 0xaf, 0x1b, 0xd2, 0xae, 0xca, 0xb3, 0x96,
+ 0x1f, 0x57, 0x94, 0x5, 0x72, 0x81, 0x72, 0x68,
+ 0x64, 0x1b, 0x71, 0x7b, 0x9c, 0x9e, 0x71, 0x1f,
+ 0x99, 0x77, 0x72, 0x98, 0x64, 0x1b, 0x50, 0x59,
+ 0x5d, 0x55, 0x78, 0x1f, 0xe, 0x79, 0xc2, 0xf8,
+ 0x7c, 0xc2, 0x1, 0xb6, 0xc2, 0xf8, 0x22, 0xc8,
+ 0x3, 0xb6, 0xf7, 0xa7, 0x15, 0xfb, 0x38, 0xeb,
+ 0xfb, 0x15, 0xf7, 0x32, 0xf7, 0x36, 0xed, 0xf7,
+ 0x12, 0xf7, 0x3b, 0xf7, 0x16, 0x4b, 0xf7, 0x43,
+ 0xfb, 0x57, 0xfb, 0x45, 0x3d, 0xfb, 0x38, 0xfb,
+ 0x21, 0x1e, 0xc2, 0x16, 0xee, 0xb9, 0xf7, 0x2b,
+ 0xf7, 0x2d, 0xf7, 0x2d, 0xb9, 0xfb, 0x2e, 0x2b,
+ 0xfb, 0x1e, 0x3d, 0x27, 0xfb, 0xd, 0xfb, 0x9,
+ 0x39, 0xec, 0xf7, 0x21, 0x1e, 0xe, 0x87, 0xc1,
+ 0xf7, 0x4f, 0xc2, 0xf7, 0x6c, 0xc1, 0x12, 0x9f,
+ 0xc3, 0xf7, 0x81, 0xc3, 0xd2, 0xc2, 0xa8, 0xc3,
+ 0x17, 0xf8, 0x5, 0xbd, 0x15, 0xf7, 0x60, 0xd2,
+ 0x4a, 0xc2, 0xf7, 0x4c, 0x54, 0x4b, 0x44, 0xf7,
+ 0x5b, 0x7, 0x13, 0xfa, 0xf7, 0x2f, 0x27, 0xc3,
+ 0xf7, 0x2e, 0xfb, 0xac, 0x6, 0xfb, 0x64, 0x43,
+ 0xfb, 0x1a, 0xfb, 0x2b, 0xfb, 0x1d, 0xd3, 0xfb,
+ 0x24, 0xf7, 0x56, 0x1f, 0xf7, 0xba, 0xf7, 0x32,
+ 0x53, 0x23, 0x6, 0xfb, 0x67, 0x16, 0xfb, 0x1a,
+ 0x87, 0x24, 0xd3, 0xf7, 0x34, 0x1a, 0xf7, 0x3e,
+ 0xf2, 0xcd, 0xf7, 0x1a, 0x85, 0x1e, 0xe, 0x64,
+ 0xa, 0xf7, 0x6d, 0x77, 0x57, 0xa, 0xf7, 0x51,
+ 0xf8, 0xfe, 0x15, 0xf7, 0xb0, 0xf0, 0x6a, 0xd5,
+ 0xfb, 0x9b, 0xfb, 0x25, 0x5, 0xfb, 0x1a, 0xfc,
+ 0x5, 0x20, 0xa, 0xe, 0x64, 0xa, 0xd1, 0x76,
+ 0x57, 0xa, 0xf7, 0x32, 0xf9, 0x5, 0x49, 0xa,
+ 0x41, 0xfb, 0xff, 0x20, 0xa, 0xe, 0x64, 0xa,
+ 0xcf, 0xf7, 0x9, 0x1, 0xb6, 0xc1, 0xe9, 0xde,
+ 0xca, 0xde, 0xdc, 0xc3, 0x3, 0xf7, 0xe5, 0xf9,
+ 0x18, 0x62, 0xa, 0xfb, 0x26, 0xfb, 0x9, 0x62,
+ 0xa, 0xfb, 0x28, 0xfc, 0x76, 0x20, 0xa, 0xe,
+ 0x64, 0xa, 0xf7, 0x49, 0x77, 0x57, 0xa, 0xb6,
+ 0xf7, 0xab, 0x20, 0xa, 0xc6, 0xf8, 0x2f, 0x15,
+ 0xf7, 0xb0, 0x45, 0x96, 0xa9, 0xfb, 0x9a, 0xf7,
+ 0x1, 0x5, 0xe, 0x7a, 0x76, 0xa5, 0xc2, 0xf8,
+ 0x7b, 0xc2, 0x9c, 0x77, 0x12, 0xb2, 0xc2, 0xf8,
+ 0x2d, 0xc4, 0x13, 0xdc, 0xc1, 0x85, 0x15, 0xb6,
+ 0x6b, 0xc2, 0xd6, 0x5, 0x6c, 0xb4, 0xbe, 0x79,
+ 0xc5, 0x1b, 0xf7, 0x36, 0xeb, 0xf7, 0x1b, 0xf7,
+ 0x38, 0xbf, 0x7c, 0xe1, 0x5a, 0xcd, 0x1f, 0xc5,
+ 0xd9, 0x60, 0xac, 0x56, 0x44, 0x5, 0x13, 0xec,
+ 0xab, 0x65, 0x59, 0xa1, 0x48, 0x1b, 0xfb, 0x45,
+ 0x34, 0xfb, 0x31, 0xfb, 0x21, 0x38, 0xa5, 0x3f,
+ 0xba, 0x55, 0x1f, 0xd4, 0x93, 0x15, 0xf7, 0xa8,
+ 0xf7, 0xff, 0x5, 0xad, 0x56, 0x93, 0x49, 0x62,
+ 0x1a, 0xfb, 0x13, 0x46, 0xfb, 0x7, 0xfb, 0x17,
+ 0x5d, 0x63, 0x9a, 0xa3, 0x6b, 0x1e, 0x65, 0xb1,
+ 0x15, 0x69, 0xb7, 0x78, 0xc6, 0xc9, 0x1a, 0xe4,
+ 0xc0, 0xf7, 0x30, 0xf7, 0x2e, 0xc0, 0xb3, 0x7a,
+ 0x71, 0xa9, 0x1e, 0xe, 0x64, 0xa, 0xcc, 0xbc,
+ 0x98, 0xbc, 0x57, 0xa, 0xf7, 0x3c, 0xf9, 0x15,
+ 0x15, 0x9f, 0x92, 0x9e, 0xb5, 0xbc, 0x1b, 0xa9,
+ 0x9f, 0x7c, 0x79, 0xa1, 0x1f, 0x7b, 0xa0, 0xa2,
+ 0x7e, 0xb0, 0x1b, 0xcf, 0xad, 0xc6, 0xb2, 0x96,
+ 0x1f, 0x58, 0x94, 0x5, 0x73, 0x82, 0x75, 0x69,
+ 0x65, 0x1b, 0x73, 0x7b, 0x9a, 0x9d, 0x75, 0x1f,
+ 0x9a, 0x78, 0x72, 0x99, 0x61, 0x1b, 0x52, 0x5b,
+ 0x52, 0x55, 0x78, 0x1f, 0x41, 0xfb, 0xfe, 0x20,
+ 0xa, 0xe, 0x8b, 0xc2, 0xf7, 0x1c, 0xc1, 0xf7,
+ 0x9b, 0xc1, 0x1, 0xf7, 0x1e, 0xc2, 0xf7, 0xb7,
+ 0xc2, 0x3, 0xc7, 0x16, 0xf7, 0xb2, 0xc2, 0xfb,
+ 0x2d, 0xf7, 0x1c, 0xf7, 0x1a, 0x6, 0xf7, 0x5,
+ 0xee, 0xca, 0xf7, 0xe, 0xe1, 0x50, 0xef, 0xfb,
+ 0x2c, 0x1f, 0xfb, 0xa0, 0x55, 0xd9, 0xfc, 0x59,
+ 0x3d, 0x6, 0xf7, 0x19, 0xf7, 0x52, 0x15, 0xf7,
+ 0x9b, 0xf7, 0x18, 0x7, 0xdb, 0xda, 0x6a, 0x28,
+ 0x27, 0x37, 0x6c, 0x42, 0x1f, 0xe, 0xfb, 0x9,
+ 0x76, 0xb6, 0xf7, 0x11, 0x56, 0xc0, 0xf8, 0x86,
+ 0xbf, 0x12, 0xb6, 0xc2, 0xf8, 0x26, 0xc4, 0x13,
+ 0xdc, 0xf7, 0x16, 0x31, 0x15, 0xa0, 0x5e, 0x5,
+ 0xa3, 0xb8, 0xaf, 0x9b, 0xb9, 0x1b, 0xaa, 0xa6,
+ 0x7f, 0x80, 0xa4, 0x1f, 0x81, 0xa2, 0xa5, 0x81,
+ 0xb0, 0x1b, 0xae, 0xae, 0x98, 0xa1, 0xa5, 0x1f,
+ 0x76, 0xb8, 0x5, 0x7d, 0x76, 0x71, 0x81, 0x72,
+ 0x1b, 0x72, 0x74, 0x95, 0x95, 0x73, 0x1f, 0x96,
+ 0x72, 0x71, 0x95, 0x6e, 0x1b, 0x7c, 0x7c, 0x86,
+ 0x89, 0x7c, 0x1f, 0x13, 0xbc, 0x99, 0x92, 0x97,
+ 0x92, 0x97, 0x96, 0x8, 0xf7, 0x2a, 0xf7, 0x8,
+ 0xf7, 0xc, 0xf7, 0x42, 0xf7, 0x32, 0x3f, 0xf7,
+ 0x2b, 0xfb, 0x4a, 0xfb, 0x33, 0x2a, 0xfb, 0x2a,
+ 0xfb, 0x33, 0xfb, 0x24, 0xcf, 0xfb, 0x0, 0xf7,
+ 0x10, 0x66, 0x1f, 0x70, 0x70, 0x5f, 0x70, 0x69,
+ 0x79, 0x8, 0x6b, 0xf7, 0xfd, 0x15, 0xf7, 0x16,
+ 0xe0, 0xf7, 0x13, 0xf7, 0x7, 0xf7, 0x13, 0xd6,
+ 0xfb, 0xf, 0xfb, 0x1a, 0xfb, 0x4a, 0xfb, 0x1d,
+ 0x50, 0x49, 0x48, 0xfb, 0x18, 0xc1, 0xf7, 0x4f,
+ 0x1e, 0xe, 0x8b, 0xc2, 0xf7, 0x55, 0xc2, 0xf7,
+ 0x60, 0xc2, 0x1, 0xf5, 0xc2, 0xf7, 0xac, 0xc2,
+ 0x3, 0xa4, 0x16, 0xf7, 0x6e, 0xc2, 0x39, 0xf7,
+ 0x55, 0xf7, 0x8, 0x6, 0xb2, 0x5c, 0xe4, 0xfb,
+ 0x19, 0xb2, 0x47, 0x8, 0xf7, 0x17, 0xc2, 0x24,
+ 0x6, 0x6a, 0xc1, 0x4f, 0xe8, 0x63, 0xbb, 0x8,
+ 0xce, 0x90, 0xe5, 0xab, 0xf7, 0xc, 0x1a, 0xdf,
+ 0x5b, 0xd2, 0xfb, 0xe, 0x1e, 0xfb, 0xc1, 0x54,
+ 0xdc, 0xfc, 0x58, 0x3a, 0x6, 0xf7, 0x1c, 0xf7,
+ 0x8c, 0x15, 0xf7, 0x60, 0xf7, 0x26, 0x7, 0xd2,
+ 0xca, 0x74, 0x3c, 0x20, 0x24, 0x90, 0x41, 0x1f,
+ 0x69, 0x68, 0x8b, 0x69, 0x1b, 0xe, 0x77, 0xbf,
+ 0x76, 0x76, 0xf8, 0xae, 0xbf, 0x7e, 0x77, 0x12,
+ 0xd3, 0xc2, 0x6e, 0xc1, 0xf7, 0xc2, 0xc1, 0x67,
+ 0xc2, 0x13, 0x6a, 0xd3, 0x81, 0x15, 0xc2, 0xb3,
+ 0x6, 0x13, 0xa5, 0x60, 0xc9, 0xd8, 0x84, 0xb9,
+ 0x1b, 0xf7, 0x4, 0xf2, 0xc1, 0xf7, 0x9, 0xf7,
+ 0xd, 0xfb, 0x2, 0x9a, 0x28, 0x9a, 0x1f, 0x42,
+ 0x97, 0x2e, 0xaa, 0xd8, 0x1a, 0xcb, 0xcc, 0xb5,
+ 0xe5, 0x1e, 0x13, 0x9a, 0xbf, 0xc6, 0x75, 0x68,
+ 0xaf, 0x1f, 0x32, 0xc1, 0xf7, 0x4d, 0x55, 0x6d,
+ 0x7, 0x13, 0xa5, 0xa7, 0x64, 0x50, 0x9a, 0x57,
+ 0x1b, 0xfb, 0x23, 0x4c, 0x3a, 0x37, 0xfb, 0xe,
+ 0xf7, 0x14, 0x67, 0xdf, 0x80, 0x1f, 0xdd, 0x80,
+ 0xdb, 0x80, 0x3a, 0x1a, 0x4a, 0x4a, 0x5d, 0x23,
+ 0x1e, 0x13, 0x6a, 0x4c, 0x4b, 0x9f, 0xb3, 0x5a,
+ 0x1f, 0xd9, 0x54, 0x7, 0xe, 0x77, 0xc3, 0x73,
+ 0x76, 0xf8, 0xac, 0xc3, 0x7f, 0x77, 0xab, 0xb7,
+ 0xf7, 0x46, 0x77, 0x12, 0xd2, 0xc3, 0x6d, 0xc2,
+ 0xf7, 0xc1, 0xc2, 0x62, 0xc8, 0x13, 0x6e, 0x80,
+ 0xd2, 0x82, 0x15, 0xc3, 0xbe, 0x6, 0x13, 0xad,
+ 0x40, 0x5f, 0xca, 0xd9, 0x79, 0xba, 0x1b, 0xf7,
+ 0x5, 0xef, 0xc2, 0xf7, 0xa, 0xf7, 0x9, 0xfb,
+ 0xe, 0x9b, 0x2e, 0x95, 0x1f, 0x44, 0x93, 0x31,
+ 0x9e, 0xe4, 0x1a, 0xcc, 0xcd, 0xbd, 0xe7, 0x1e,
+ 0x13, 0x9e, 0x80, 0xbf, 0xc1, 0x6f, 0x67, 0xb0,
+ 0x1f, 0x3b, 0xc2, 0xf7, 0x50, 0x54, 0x62, 0x7,
+ 0x13, 0xad, 0x40, 0xa8, 0x63, 0x55, 0xa3, 0x57,
+ 0x1b, 0xfb, 0x26, 0x4b, 0x28, 0x36, 0xfb, 0x11,
+ 0xf7, 0x1c, 0x73, 0xe2, 0x82, 0x1f, 0xd8, 0x83,
+ 0xd1, 0x7e, 0x3f, 0x1a, 0x49, 0x53, 0x61, 0x22,
+ 0x1e, 0x13, 0x6e, 0x80, 0x4b, 0x4a, 0xa7, 0xb4,
+ 0x59, 0x1f, 0xd0, 0x53, 0x7, 0xf7, 0x5d, 0xf8,
+ 0x59, 0x37, 0xa, 0xfb, 0x16, 0x76, 0xf7, 0x47,
+ 0xca, 0xf7, 0x48, 0xc9, 0xf7, 0x49, 0xcd, 0x12,
+ 0xd2, 0xc6, 0x57, 0xc5, 0xf7, 0x1e, 0xef, 0xd1,
+ 0xc6, 0x63, 0xcc, 0x13, 0xfa, 0x80, 0xd2, 0xa7,
+ 0x15, 0xc6, 0xcd, 0x6, 0xb6, 0x73, 0xb5, 0x6e,
+ 0xc8, 0x81, 0x88, 0x3f, 0x18, 0x8e, 0x92, 0x95,
+ 0x8c, 0x94, 0x1b, 0x99, 0x98, 0x7f, 0x7a, 0x77,
+ 0x7a, 0x80, 0x78, 0x7e, 0x7d, 0x90, 0x95, 0x81,
+ 0x1f, 0x7c, 0x60, 0x5, 0x7c, 0x9c, 0xa2, 0x84,
+ 0x9e, 0x1b, 0xb4, 0xaf, 0xb2, 0xbd, 0xb5, 0x72,
+ 0xa2, 0x77, 0x8d, 0x1f, 0xa2, 0x7, 0xf7, 0x9,
+ 0x8d, 0xdd, 0xce, 0xf2, 0x1a, 0xe5, 0x3f, 0xb1,
+ 0x3f, 0x90, 0x1e, 0x13, 0xf7, 0x0, 0x40, 0x92,
+ 0xfb, 0x39, 0x7a, 0xf2, 0x1a, 0xd6, 0xec, 0x98,
+ 0xba, 0xc7, 0xc5, 0x6b, 0x6a, 0xb9, 0x1e, 0x51,
+ 0xc6, 0xf7, 0x51, 0x50, 0x4f, 0x7, 0xac, 0x5a,
+ 0x52, 0xa6, 0x4d, 0x1b, 0xfb, 0xb, 0x3c, 0x4d,
+ 0x24, 0xfb, 0x22, 0xf7, 0x42, 0x8d, 0xe3, 0x87,
+ 0x1f, 0x13, 0xfa, 0x80, 0xbf, 0x89, 0xd2, 0x86,
+ 0x43, 0x1a, 0x33, 0xfb, 0x5, 0x7e, 0x63, 0x46,
+ 0x50, 0xb1, 0xb7, 0x57, 0x1e, 0xc6, 0x50, 0x7,
+ 0xe, 0x8b, 0xc2, 0xf7, 0xd3, 0xf7, 0x50, 0x54,
+ 0xc2, 0x12, 0xb0, 0xc3, 0xf7, 0x46, 0xc3, 0xf7,
+ 0x47, 0xc3, 0x13, 0xbc, 0xf7, 0x26, 0x16, 0xf7,
+ 0xc6, 0xc2, 0xfb, 0x11, 0xf8, 0x58, 0xf7, 0x47,
+ 0x6, 0x13, 0xdc, 0xfb, 0x19, 0xc3, 0xf7, 0x50,
+ 0xfc, 0xa1, 0xfb, 0x50, 0xc3, 0x7, 0x13, 0xbc,
+ 0xf7, 0x19, 0xf7, 0x46, 0xfc, 0x58, 0xfb, 0x11,
+ 0x7, 0xe, 0x8b, 0xc1, 0xf5, 0xc1, 0xf7, 0x42,
+ 0xc1, 0xf7, 0x12, 0xc1, 0x1, 0xf7, 0x40, 0xbc,
+ 0xf7, 0x95, 0xbe, 0x3, 0xf7, 0xf9, 0x16, 0xc1,
+ 0xfb, 0x1c, 0xf5, 0xf7, 0x1a, 0x7, 0xf7, 0x15,
+ 0xb8, 0xc5, 0xde, 0xe6, 0x5f, 0xbd, 0xfb, 0x18,
+ 0x1f, 0xfb, 0x18, 0xf7, 0x12, 0xee, 0xc1, 0xfb,
+ 0x8e, 0x55, 0xf1, 0xfc, 0x96, 0x25, 0x55, 0x6,
+ 0xf7, 0x2b, 0xf8, 0x18, 0x15, 0xf7, 0x18, 0x6,
+ 0xaf, 0xa9, 0x85, 0x80, 0xa2, 0x1f, 0xa3, 0x80,
+ 0x97, 0x73, 0x66, 0x1a, 0x68, 0x7f, 0x74, 0x73,
+ 0x80, 0x1e, 0x80, 0x74, 0x6e, 0x86, 0x68, 0x1b,
+ 0xfb, 0x1a, 0x6, 0xe, 0x79, 0xbe, 0xf8, 0x6e,
+ 0xc2, 0x1, 0xec, 0xbf, 0xf7, 0xc5, 0xbf, 0x3,
+ 0x9c, 0xf8, 0x8f, 0x15, 0xdb, 0xfb, 0xd1, 0x6,
+ 0xfb, 0x17, 0xc1, 0x3e, 0xf7, 0x2c, 0xf7, 0x12,
+ 0xd8, 0xd4, 0xf7, 0x1b, 0x1e, 0xf7, 0xd1, 0xd8,
+ 0xc2, 0xfb, 0x7c, 0x54, 0xf2, 0xfb, 0xd1, 0x7,
+ 0xfb, 0xf, 0x42, 0x69, 0x3c, 0x21, 0x5c, 0xb8,
+ 0xf7, 0x4, 0x1e, 0xf7, 0xd1, 0xf5, 0xc2, 0xfb,
+ 0x82, 0x7, 0xe, 0x6b, 0xa, 0xf7, 0x7a, 0x77,
+ 0x55, 0xa, 0xf7, 0x52, 0xf8, 0xfe, 0x15, 0xf7,
+ 0xab, 0xf0, 0x6b, 0xd5, 0xfb, 0x97, 0xfb, 0x25,
+ 0x5, 0xfb, 0x35, 0xfb, 0x20, 0x34, 0xa, 0xe,
+ 0x6b, 0xa, 0x5b, 0xa, 0xfb, 0x14, 0xd5, 0x2a,
+ 0x30, 0xa, 0xf7, 0x21, 0xc9, 0x49, 0xa, 0xe,
+ 0x6b, 0xa, 0xf7, 0x10, 0xf7, 0x9, 0x5b, 0xa,
+ 0xfb, 0x1b, 0xcf, 0x31, 0xf7, 0x1f, 0x31, 0xa,
+ 0xbf, 0xf7, 0xc, 0x4f, 0xa, 0xf7, 0xd0, 0xdc,
+ 0x62, 0xa, 0xfb, 0x22, 0xfb, 0x9, 0x62, 0xa,
+ 0xe, 0x6b, 0xa, 0xf7, 0x7a, 0x77, 0x1, 0xeb,
+ 0xbf, 0xf7, 0xc6, 0xbf, 0x3, 0x9c, 0xf8, 0x90,
+ 0x34, 0xa, 0xf7, 0x1e, 0xf7, 0x30, 0x79, 0xa,
+ 0xf7, 0x25, 0x5, 0xe, 0x93, 0x76, 0xf8, 0x9c,
+ 0xc2, 0x1, 0x87, 0xf7, 0x77, 0xf7, 0x31, 0xf7,
+ 0x74, 0x3, 0xf7, 0x9b, 0x7e, 0x15, 0xd4, 0x6,
+ 0xf7, 0x5c, 0xf8, 0x9c, 0x5, 0xcf, 0xc2, 0xfb,
+ 0x74, 0x54, 0xeb, 0x6, 0xfb, 0x45, 0xfc, 0x61,
+ 0xfb, 0x43, 0xf8, 0x61, 0x5, 0xee, 0xc2, 0xfb,
+ 0x77, 0x54, 0xcb, 0x6, 0xe, 0x96, 0x76, 0xf8,
+ 0x63, 0x77, 0xd5, 0xc2, 0x1, 0x9f, 0xf7, 0x5a,
+ 0xf7, 0x37, 0xf7, 0x5b, 0x3, 0xf7, 0x10, 0x81,
+ 0x15, 0xca, 0x6, 0xf7, 0x5, 0xf7, 0xfd, 0xf7,
+ 0xa, 0xfb, 0xfd, 0x5, 0xc8, 0x6, 0xc4, 0xf8,
+ 0x99, 0x5, 0xb7, 0xc2, 0xfb, 0x5b, 0x54, 0xee,
+ 0x6, 0x63, 0xfc, 0x36, 0xfb, 0xa, 0xf8, 0x0,
+ 0x5, 0x62, 0x6, 0xfb, 0x8, 0xfc, 0x2, 0x5e,
+ 0xf8, 0x38, 0x5, 0xed, 0xc2, 0xfb, 0x5a, 0x54,
+ 0xb9, 0x6, 0xe, 0x46, 0xa, 0xa2, 0x16, 0xf7,
+ 0x7e, 0xc2, 0x22, 0x6, 0xf7, 0x2a, 0xf7, 0x58,
+ 0xf7, 0x26, 0xfb, 0x58, 0x5, 0x2d, 0x54, 0xf7,
+ 0x73, 0xc2, 0x4a, 0x6, 0xfb, 0x46, 0xf7, 0x84,
+ 0xf7, 0x32, 0xf7, 0x68, 0x5, 0xcd, 0xc2, 0xfb,
+ 0x53, 0x54, 0xc8, 0x6, 0xfb, 0x13, 0xfb, 0x3f,
+ 0xfb, 0x14, 0xf7, 0x3f, 0x5, 0xcf, 0xc2, 0xfb,
+ 0x5a, 0x54, 0xce, 0x6, 0xf7, 0x32, 0xfb, 0x68,
+ 0xfb, 0x48, 0xfb, 0x84, 0x5, 0x4a, 0x6, 0xe,
+ 0x75, 0xa, 0xa3, 0xf7, 0x5f, 0xbb, 0xc3, 0xb9,
+ 0xf7, 0x5b, 0x3, 0xf7, 0x27, 0x16, 0xf7, 0xcb,
+ 0xc1, 0xfb, 0x13, 0xf7, 0x43, 0x6, 0xf7, 0x46,
+ 0xf7, 0xab, 0x5, 0xce, 0xc1, 0xfb, 0x5b, 0x55,
+ 0xd2, 0x6, 0xfb, 0x25, 0xfb, 0x76, 0xfb, 0x28,
+ 0xf7, 0x76, 0x5, 0xd3, 0xc1, 0xfb, 0x5f, 0x55,
+ 0xd0, 0x6, 0xf7, 0x4a, 0xfb, 0xab, 0x5, 0xfb,
+ 0x43, 0xfb, 0x14, 0x7, 0xe, 0x8b, 0xc1, 0xf8,
+ 0x5d, 0xc1, 0xf7, 0x78, 0x77, 0x81, 0xa, 0xf7,
+ 0x27, 0x16, 0x36, 0xa, 0xb0, 0xf8, 0xc9, 0x15,
+ 0xf7, 0xba, 0xf0, 0x69, 0xd4, 0xfb, 0xa4, 0xfb,
+ 0x24, 0x5, 0xe, 0x8b, 0xc1, 0xf8, 0x5d, 0xc1,
+ 0xf7, 0xe, 0xf7, 0x15, 0x81, 0xa, 0xf7, 0xe5,
+ 0xf9, 0x43, 0x15, 0xe1, 0xf7, 0x15, 0x35, 0x6,
+ 0xfb, 0x2b, 0xfb, 0x15, 0x15, 0xe0, 0xf7, 0x15,
+ 0x36, 0x6, 0x64, 0xfd, 0xc4, 0x15, 0x36, 0xa,
+ 0xe, 0x75, 0xa, 0xf7, 0xa, 0xbf, 0xf7, 0xb5,
+ 0xc2, 0x3, 0xe1, 0x16, 0xf8, 0x40, 0xf7, 0x5f,
+ 0x54, 0xfb, 0x29, 0xfb, 0xc1, 0x6, 0xf7, 0xf8,
+ 0xf8, 0x5d, 0x5, 0xbe, 0xfc, 0x20, 0xfb, 0x51,
+ 0xbf, 0xf7, 0x1b, 0xf7, 0xa3, 0x7, 0xfb, 0xf7,
+ 0xfc, 0x5b, 0x5, 0xe, 0x8b, 0xc2, 0xf8, 0x63,
+ 0xc2, 0x1, 0xf7, 0xa, 0xbf, 0xf7, 0xb7, 0xc0,
+ 0x3, 0xe1, 0x16, 0xf8, 0x40, 0xf7, 0x78, 0x56,
+ 0xfb, 0x41, 0xfb, 0xc2, 0x6, 0xf7, 0xf7, 0xf8,
+ 0x66, 0x5, 0xbf, 0xfc, 0x20, 0xfb, 0x68, 0xbf,
+ 0xf7, 0x31, 0xf7, 0xa4, 0x7, 0xfb, 0xf8, 0xfc,
+ 0x64, 0x5, 0xf7, 0x52, 0xf8, 0xd2, 0x15, 0xd9,
+ 0x6, 0xf7, 0x21, 0xf7, 0x33, 0x63, 0x9d, 0xfb,
+ 0x20, 0xfb, 0xb, 0xfb, 0x23, 0xf7, 0xb, 0x64,
+ 0x78, 0x5, 0xe, 0x88, 0xc2, 0xf7, 0x33, 0xc1,
+ 0xf7, 0xb, 0xc4, 0x1, 0xba, 0xc4, 0xf7, 0xca,
+ 0xc2, 0x3, 0xf1, 0xf7, 0xe1, 0x15, 0xd2, 0xa9,
+ 0xcf, 0xa1, 0xbc, 0x8a, 0xdf, 0x8a, 0xbb, 0x6b,
+ 0x83, 0x28, 0x8, 0x95, 0x5e, 0x5b, 0x8e, 0x5d,
+ 0x1b, 0xfb, 0xd, 0x20, 0x5c, 0x29, 0x4a, 0xc0,
+ 0x45, 0xf7, 0x8, 0xea, 0xd7, 0xc2, 0xb4, 0xa7,
+ 0x1f, 0x37, 0xf7, 0x1e, 0xc2, 0x37, 0xf7, 0x85,
+ 0x7, 0xf4, 0x49, 0xb6, 0xfb, 0x7, 0x40, 0x3b,
+ 0x6e, 0x71, 0x5c, 0x1e, 0xf7, 0xdc, 0xfb, 0x83,
+ 0x15, 0x4f, 0x58, 0x46, 0x55, 0x39, 0x1b, 0x4c,
+ 0x5e, 0xbb, 0xb1, 0xd2, 0xdd, 0xa0, 0xe3, 0xbc,
+ 0xc0, 0x88, 0x80, 0xb1, 0x1f, 0xe, 0x3e, 0xa,
+ 0xf7, 0x30, 0xf8, 0x83, 0x15, 0xf7, 0xbb, 0xf2,
+ 0x69, 0xd5, 0xfb, 0xa5, 0xfb, 0x26, 0x5, 0x5a,
+ 0xfb, 0x44, 0x23, 0xa, 0x3e, 0xa, 0xf7, 0x16,
+ 0xf8, 0x74, 0x15, 0xf7, 0x2d, 0xf7, 0xa, 0xf7,
+ 0x2a, 0xfb, 0xa, 0xb6, 0x9c, 0xfb, 0x2c, 0xf7,
+ 0x31, 0x5, 0x38, 0x6, 0xfb, 0x2d, 0xfb, 0x31,
+ 0x5, 0x92, 0xfb, 0x27, 0x23, 0xa, 0x6e, 0xa,
+ 0xf7, 0x61, 0xf8, 0x85, 0x15, 0xf7, 0x64, 0xf1,
+ 0x5e, 0xd4, 0xfb, 0x4a, 0xfb, 0x24, 0x5, 0xe,
+ 0x7c, 0xc3, 0x6a, 0xc3, 0xf7, 0x2b, 0xc3, 0xf7,
+ 0x7, 0xc3, 0xe3, 0xf7, 0x7, 0x12, 0xba, 0xc5,
+ 0xbf, 0xe2, 0xcc, 0xe1, 0x9e, 0xc3, 0x13, 0x7f,
+ 0x80, 0xf7, 0xc9, 0xf8, 0xa6, 0x15, 0xe1, 0xf7,
+ 0x7, 0x35, 0x6, 0xfb, 0x2c, 0x60, 0xa, 0x4d,
+ 0xfb, 0xbb, 0x28, 0xa, 0x1f, 0x13, 0xbf, 0x80,
+ 0x3d, 0xa, 0x1e, 0x29, 0xa, 0x2a, 0xa, 0x7c,
+ 0xc1, 0xf7, 0x42, 0xc2, 0xf7, 0xa, 0xc2, 0x1,
+ 0xa3, 0xc4, 0xf7, 0x4e, 0xc3, 0x3, 0xf7, 0xba,
+ 0xd7, 0x15, 0x58, 0x9f, 0xbf, 0x63, 0xda, 0x1b,
+ 0xb8, 0xb9, 0x96, 0x96, 0xb2, 0x1f, 0x7f, 0xc1,
+ 0x5, 0x82, 0x6b, 0x65, 0x7e, 0x67, 0x1b, 0x2e,
+ 0x62, 0xda, 0xde, 0x1f, 0x97, 0xf7, 0x8f, 0x7,
+ 0xf4, 0x8c, 0x76, 0xf7, 0xf, 0xfb, 0x13, 0x1b,
+ 0x53, 0x6a, 0x71, 0x62, 0x70, 0x1f, 0x99, 0x85,
+ 0x7d, 0xc0, 0x2b, 0x1b, 0x54, 0x58, 0x7e, 0x7b,
+ 0x5f, 0x1f, 0x96, 0x56, 0x5, 0x98, 0xad, 0xbe,
+ 0x99, 0xb4, 0x1b, 0xd2, 0x99, 0x68, 0x53, 0x1f,
+ 0x70, 0x7, 0xfb, 0x7, 0x8c, 0xfb, 0x14, 0x75,
+ 0xfb, 0x1e, 0x1a, 0x34, 0xcd, 0x66, 0xc9, 0xa5,
+ 0xc4, 0x90, 0xe1, 0xc6, 0x1e, 0xaa, 0xf7, 0x54,
+ 0x15, 0xcb, 0x8f, 0xb3, 0xc1, 0xc9, 0x1b, 0xd6,
+ 0x91, 0x49, 0x57, 0x92, 0x1f, 0xfb, 0x90, 0xfb,
+ 0x21, 0x15, 0x75, 0x7f, 0x64, 0x49, 0x4b, 0x1b,
+ 0x63, 0x6c, 0xa6, 0xb9, 0xf0, 0xf7, 0x0, 0x8b,
+ 0xd9, 0x1f, 0xe, 0x3e, 0xa, 0xf7, 0x1a, 0xf8,
+ 0xe8, 0x15, 0xf7, 0xbd, 0x24, 0x96, 0xaa, 0xfb,
+ 0xa5, 0xf7, 0x28, 0x5, 0x41, 0xfb, 0xd6, 0x23,
+ 0xa, 0x86, 0xc0, 0x64, 0xc2, 0xf7, 0x3e, 0xc1,
+ 0xf7, 0x5f, 0xbf, 0x1, 0xc9, 0xc2, 0x91, 0xbf,
+ 0x3, 0xf7, 0xf4, 0xbb, 0x15, 0xae, 0x59, 0x5,
+ 0xf7, 0x2a, 0xc2, 0xfb, 0x11, 0x6, 0x72, 0xb0,
+ 0xa6, 0xb0, 0xa1, 0xc0, 0x91, 0xc2, 0x19, 0xd8,
+ 0xc1, 0xfb, 0xd, 0x6, 0x60, 0x7b, 0x43, 0x71,
+ 0x63, 0x1e, 0xfb, 0x22, 0xf7, 0x5e, 0x87, 0x8f,
+ 0x69, 0xb8, 0x8a, 0xb2, 0x19, 0xc0, 0x89, 0xc2,
+ 0x99, 0xb5, 0x1b, 0xb9, 0xa9, 0x74, 0x7a, 0x9a,
+ 0x1f, 0xa9, 0xb7, 0x5, 0xa7, 0x6e, 0x5d, 0x9f,
+ 0x5e, 0x1b, 0x40, 0x42, 0x68, 0x42, 0x5f, 0xa4,
+ 0x5c, 0xa6, 0x64, 0x1f, 0x20, 0x50, 0x85, 0x38,
+ 0x6b, 0x1a, 0x50, 0xb0, 0x34, 0xf6, 0xc3, 0xc0,
+ 0xa2, 0xb3, 0xb0, 0x1e, 0x6e, 0xb7, 0x15, 0x75,
+ 0x73, 0x6e, 0x6b, 0x54, 0x1b, 0x59, 0x5b, 0xa7,
+ 0xd8, 0xc3, 0xbb, 0xbd, 0xb0, 0x9b, 0x1f, 0xe,
+ 0x41, 0xa, 0xc8, 0xf7, 0x38, 0x12, 0xba, 0xc5,
+ 0xe6, 0xf7, 0x46, 0xb3, 0xc3, 0x13, 0xbf, 0xf7,
+ 0x58, 0xf8, 0xe4, 0x15, 0x5d, 0xb2, 0x67, 0xbd,
+ 0xbd, 0xb2, 0xaf, 0xb9, 0xb9, 0x64, 0xaf, 0x59,
+ 0x59, 0x64, 0x67, 0x5d, 0x1e, 0xc1, 0x16, 0x9d,
+ 0x9b, 0x99, 0x9e, 0x9e, 0x9b, 0x7d, 0x79, 0x7a,
+ 0x7b, 0x7c, 0x78, 0x78, 0x7b, 0x9a, 0x9c, 0x1e,
+ 0xfb, 0x2f, 0xfb, 0x86, 0x2c, 0xa, 0xf7, 0xa4,
+ 0xbe, 0x1, 0x6f, 0xf9, 0x24, 0x3, 0xf7, 0x5d,
+ 0x70, 0xa, 0xf8, 0x55, 0x80, 0xa, 0xa7, 0x5e,
+ 0xf7, 0x7a, 0xf7, 0x4b, 0xfb, 0x7a, 0x78, 0xa,
+ 0xfc, 0x59, 0x5d, 0xa, 0x7c, 0xf9, 0x3, 0x1,
+ 0xf7, 0xa8, 0xbe, 0x3, 0xf7, 0x8, 0xf7, 0x66,
+ 0x15, 0xf7, 0x4d, 0xfb, 0x75, 0xf7, 0x4b, 0xf7,
+ 0x7b, 0x5e, 0xa7, 0xfb, 0x4, 0xfb, 0x2e, 0x5,
+ 0xf8, 0x9a, 0x58, 0xfc, 0x9c, 0x7, 0xfb, 0xf,
+ 0xf7, 0x2f, 0x5, 0xe, 0x7d, 0xa, 0xf7, 0x61,
+ 0x70, 0xa, 0xf8, 0xb5, 0xbe, 0xfc, 0xb7, 0x5d,
+ 0xa, 0x7d, 0xa, 0x73, 0xf7, 0xa4, 0x15, 0xf8,
+ 0xb5, 0x80, 0xa, 0xa7, 0x5e, 0xf7, 0x79, 0xf7,
+ 0x4b, 0xfb, 0x79, 0x78, 0xa, 0xfc, 0xb7, 0x6,
+ 0xe, 0xf8, 0x1c, 0xf7, 0x14, 0x1, 0xf7, 0xa8,
+ 0xbe, 0x3, 0xf7, 0xa8, 0x16, 0xbe, 0xf8, 0x9a,
+ 0x6, 0xf7, 0x4, 0xfb, 0x2e, 0xb8, 0xa7, 0xfb,
+ 0x4b, 0xf7, 0x75, 0xfb, 0x4d, 0xfb, 0x75, 0xb0,
+ 0x6f, 0xf7, 0xf, 0xf7, 0x30, 0x5, 0xe, 0xf8,
+ 0xb, 0x76, 0xf7, 0xa0, 0x77, 0x1, 0xe9, 0xf8,
+ 0x30, 0x3, 0xe9, 0xf7, 0xf6, 0x15, 0xd8, 0xa6,
+ 0xd2, 0xc6, 0xc5, 0xc5, 0xc7, 0x4e, 0xd0, 0x53,
+ 0xd8, 0x71, 0x8, 0xba, 0x7, 0x2a, 0xd6, 0x5e,
+ 0xb9, 0x63, 0xee, 0x8, 0x58, 0x6, 0x68, 0x2d,
+ 0x5a, 0x53, 0x2c, 0x44, 0x8, 0xe, 0xf7, 0x5b,
+ 0xbe, 0x9e, 0xbe, 0x12, 0xc8, 0xf8, 0x71, 0x17,
+ 0xf6, 0xf7, 0x59, 0x15, 0xaa, 0xa1, 0xa6, 0xb4,
+ 0xb2, 0x1b, 0xb1, 0xaa, 0x77, 0x78, 0xac, 0x1f,
+ 0x7a, 0xa9, 0xaa, 0x7b, 0xb1, 0x1b, 0xcd, 0xb6,
+ 0xba, 0xb8, 0xac, 0x1f, 0x5f, 0xaa, 0x5, 0x77,
+ 0x7d, 0x5e, 0x57, 0x65, 0x1b, 0x71, 0x73, 0x9b,
+ 0x9b, 0x6f, 0x1f, 0x13, 0xe0, 0x9e, 0x6a, 0x64,
+ 0xa0, 0x53, 0x1b, 0x4c, 0x6b, 0x5e, 0x62, 0x68,
+ 0x1f, 0xe, 0xf7, 0x95, 0xf7, 0xf2, 0x1, 0xf7,
+ 0xa0, 0xcb, 0x3, 0xf7, 0x37, 0xf7, 0xc0, 0x15,
+ 0xcc, 0x60, 0xd5, 0xf7, 0x16, 0xd5, 0xfb, 0x16,
+ 0xc8, 0xb5, 0x2a, 0xf7, 0x9, 0xf7, 0x24, 0xa6,
+ 0x79, 0xcf, 0xfb, 0x20, 0x57, 0x98, 0xf7, 0x28,
+ 0x5, 0x40, 0x6, 0x94, 0xfb, 0x29, 0xfb, 0x1d,
+ 0xc0, 0x77, 0x47, 0xf7, 0x26, 0x6f, 0x5, 0xe,
+ 0x7c, 0xb1, 0xde, 0xb1, 0xf7, 0x68, 0xb5, 0xf7,
+ 0x1, 0xb2, 0x1, 0xb0, 0xb6, 0xe5, 0xb3, 0xf7,
+ 0x24, 0xb7, 0xf7, 0xd, 0xb7, 0x3, 0xf7, 0xf6,
+ 0xf7, 0x40, 0x15, 0x6e, 0x93, 0xa0, 0x66, 0xb9,
+ 0x1b, 0xdc, 0xc0, 0xe9, 0xf7, 0x0, 0xf7, 0x23,
+ 0xfb, 0x1, 0xea, 0xfb, 0x24, 0xfb, 0x47, 0x2d,
+ 0xfb, 0x15, 0xfb, 0x31, 0xfb, 0x3a, 0xf7, 0x0,
+ 0xfb, 0x1, 0xf7, 0x44, 0xdf, 0xd0, 0xa7, 0xb3,
+ 0xcc, 0x1f, 0x77, 0xb3, 0x5, 0x76, 0x6e, 0x2c,
+ 0x5a, 0x41, 0x1b, 0xfb, 0x11, 0xfb, 0x8, 0xdd,
+ 0xf7, 0x2f, 0xf7, 0xe, 0xd2, 0xf7, 0x11, 0xf7,
+ 0x33, 0xf7, 0xb, 0xe5, 0x36, 0xfb, 0x5, 0x3e,
+ 0x67, 0x33, 0x58, 0x59, 0x91, 0xd9, 0xb6, 0x95,
+ 0x1f, 0xac, 0xf7, 0x1c, 0x5, 0x5f, 0x6, 0x7f,
+ 0x5a, 0x5, 0xb6, 0x76, 0x72, 0x8e, 0x6c, 0x1b,
+ 0x3d, 0x59, 0x2a, 0x2a, 0x5e, 0x99, 0x56, 0xce,
+ 0xb4, 0xb6, 0xac, 0xac, 0x9e, 0x1f, 0xfb, 0x24,
+ 0xa9, 0x15, 0xc1, 0xa6, 0xef, 0xc8, 0xbd, 0x91,
+ 0x67, 0x79, 0x4a, 0x64, 0x30, 0x51, 0x69, 0x7e,
+ 0xad, 0xa1, 0x1e, 0xe, 0x7c, 0xc3, 0x5f, 0xc3,
+ 0xf7, 0x34, 0xc3, 0xf7, 0x1c, 0xc3, 0xc7, 0xbd,
+ 0x9b, 0xbc, 0x12, 0xba, 0xc5, 0xf7, 0xc9, 0xc3,
+ 0x13, 0xbf, 0xf7, 0x15, 0xf8, 0xa1, 0x15, 0x99,
+ 0x8f, 0x9f, 0xbb, 0xaf, 0x1b, 0xa7, 0x9d, 0x7d,
+ 0x7c, 0x9f, 0x1f, 0x79, 0xa2, 0xa6, 0x78, 0xb9,
+ 0x1b, 0xcb, 0xbc, 0xb9, 0xc3, 0x9e, 0x1f, 0x58,
+ 0x94, 0x5, 0x72, 0x82, 0x6e, 0x67, 0x66, 0x1b,
+ 0x70, 0x78, 0x9b, 0x9d, 0x74, 0x1f, 0x9b, 0x76,
+ 0x73, 0x9a, 0x65, 0x1b, 0x57, 0x55, 0x67, 0x4a,
+ 0x75, 0x1f, 0x9d, 0xfb, 0x4d, 0x2c, 0xa, 0x7c,
+ 0xc2, 0x60, 0xc3, 0xf7, 0xea, 0xc3, 0x12, 0xf5,
+ 0xc4, 0xf7, 0xf9, 0xc7, 0x13, 0x78, 0x9e, 0x88,
+ 0x15, 0xf7, 0x24, 0xd1, 0x6, 0x13, 0xb8, 0x7b,
+ 0x99, 0xb5, 0x49, 0xf7, 0x18, 0x1b, 0xf7, 0x1e,
+ 0xe6, 0xf7, 0xa, 0xf7, 0x2, 0xf7, 0x2b, 0x27,
+ 0xe2, 0xfb, 0x13, 0xfb, 0x4, 0x4f, 0x4c, 0x72,
+ 0x79, 0x1f, 0xf7, 0x9e, 0xfb, 0x24, 0x54, 0xe2,
+ 0x7, 0x13, 0x78, 0xfc, 0x9d, 0x34, 0x7, 0xf7,
+ 0x25, 0xf7, 0x3d, 0x15, 0xf5, 0xe4, 0xce, 0xe4,
+ 0xf7, 0xc, 0xc6, 0x36, 0x2a, 0x8a, 0x1e, 0x13,
+ 0xb8, 0x24, 0x8a, 0x34, 0x45, 0x31, 0x1b, 0x38,
+ 0x2c, 0xc5, 0xf7, 0x10, 0x1f, 0xe, 0xfb, 0x1d,
+ 0xf9, 0xce, 0x1, 0xcf, 0xf8, 0x64, 0x3, 0xf8,
+ 0x7b, 0xfb, 0x1d, 0x15, 0xb8, 0xa3, 0xfc, 0x37,
+ 0xf9, 0xb6, 0x5e, 0x70, 0x5, 0xe, 0xfb, 0x79,
+ 0x76, 0xfa, 0x7c, 0x77, 0x68, 0xa, 0xbe, 0x3,
+ 0xf7, 0xa6, 0xfb, 0x8e, 0x15, 0xbe, 0xfa, 0x7c,
+ 0x58, 0x6, 0xe, 0xfb, 0x78, 0xbf, 0xf9, 0xf1,
+ 0xc4, 0x1, 0xf7, 0x9f, 0xc5, 0x3, 0xf7, 0x40,
+ 0xf7, 0x82, 0x15, 0xd9, 0x72, 0x9c, 0x75, 0x2b,
+ 0x1a, 0xfb, 0x50, 0x7, 0x49, 0xae, 0x46, 0xf7,
+ 0x11, 0x1e, 0xbf, 0x7, 0x4e, 0x8e, 0x62, 0xae,
+ 0xbb, 0x1a, 0xf7, 0x4d, 0x7, 0xcc, 0x8a, 0xc7,
+ 0x3a, 0xb0, 0x1e, 0xdc, 0xb4, 0x8c, 0xbe, 0xd1,
+ 0x1a, 0xf7, 0x5c, 0x7, 0xbb, 0xb4, 0x9a, 0xc8,
+ 0x8e, 0x1e, 0xc4, 0x7, 0xfb, 0x17, 0x6e, 0x4e,
+ 0x41, 0x1f, 0xfb, 0x50, 0x7, 0x2b, 0x77, 0x75,
+ 0x40, 0x72, 0x1e, 0xe, 0xfb, 0x78, 0xbf, 0xf9,
+ 0xf5, 0xc0, 0x68, 0xa, 0xc5, 0x3, 0xf7, 0x40,
+ 0xfb, 0x44, 0x15, 0x57, 0x7, 0xf7, 0x11, 0xae,
+ 0xd0, 0xcd, 0x1f, 0xf7, 0x50, 0x7, 0xeb, 0x9c,
+ 0xa1, 0xd9, 0xa4, 0x1e, 0xb1, 0x7, 0x40, 0xa4,
+ 0x77, 0xa1, 0xeb, 0x1a, 0xf7, 0x50, 0x7, 0xd5,
+ 0x6e, 0xc8, 0xfb, 0x17, 0x1e, 0x56, 0x7, 0xc8,
+ 0x88, 0xb4, 0x78, 0x5b, 0x1a, 0xfb, 0x5c, 0x7,
+ 0x45, 0x8c, 0x58, 0xdc, 0x62, 0x1e, 0x3a, 0x66,
+ 0x8a, 0x4f, 0x4a, 0x1a, 0xfb, 0x4d, 0x7, 0x5b,
+ 0x62, 0x68, 0x4e, 0x88, 0x1e, 0xe, 0x3d, 0x77,
+ 0x9f, 0xc1, 0xf9, 0x2, 0xc1, 0x1, 0xf7, 0x69,
+ 0xc2, 0x3, 0xf7, 0x69, 0x3d, 0x15, 0xf7, 0x41,
+ 0xc1, 0xfb, 0xa, 0xf9, 0x2, 0xf7, 0xa, 0xc1,
+ 0xfb, 0x41, 0x6, 0xe, 0x3d, 0xc1, 0xf9, 0x2,
+ 0xc1, 0x1, 0xf7, 0xdf, 0xc2, 0x3, 0xf7, 0x69,
+ 0x73, 0x15, 0x55, 0xf7, 0x41, 0xf9, 0x6e, 0xfb,
+ 0x41, 0x55, 0xf7, 0xa, 0xfd, 0x2, 0x7, 0xe,
+ 0xf8, 0x89, 0xb2, 0x1, 0xf7, 0x2d, 0xf8, 0xf5,
+ 0x15, 0x3b, 0xaf, 0xc3, 0x6f, 0xc4, 0x1b, 0xd5,
+ 0xc0, 0xbc, 0xc6, 0x9d, 0x1f, 0x61, 0x6, 0x6d,
+ 0x80, 0x64, 0x64, 0x55, 0x1b, 0x60, 0x63, 0xa5,
+ 0xb6, 0x78, 0x1f, 0xe, 0xfb, 0x2e, 0x76, 0xf9,
+ 0xe6, 0x77, 0x68, 0xa, 0xbe, 0x3, 0xf7, 0xa6,
+ 0xf7, 0xaf, 0x15, 0xbe, 0xf8, 0x1c, 0x58, 0x6,
+ 0xfd, 0xe6, 0x4, 0xbe, 0xf8, 0x1c, 0x58, 0x6,
+ 0xe, 0xf7, 0x16, 0xf7, 0x91, 0x1, 0xf7, 0x40,
+ 0xf7, 0x94, 0x3, 0xf7, 0x40, 0xf7, 0x95, 0x15,
+ 0x45, 0xc4, 0x52, 0xd2, 0xd3, 0xc3, 0xc4, 0xd1,
+ 0xd1, 0x53, 0xc3, 0x43, 0x44, 0x52, 0x53, 0x45,
+ 0x1e, 0xe, 0x7c, 0xc0, 0xf7, 0xef, 0xc3, 0x1,
+ 0xcf, 0xc1, 0xf7, 0xe4, 0xc1, 0x3, 0xf8, 0x89,
+ 0xf7, 0x8, 0x15, 0x76, 0x74, 0x34, 0x52, 0x3b,
+ 0x1b, 0xfb, 0x19, 0x53, 0xe7, 0xdf, 0xe4, 0xd4,
+ 0xdd, 0xf7, 0x4, 0xc4, 0xbf, 0x73, 0x67, 0xb5,
+ 0x1f, 0x46, 0xc1, 0xf7, 0x4d, 0x55, 0x5b, 0x7,
+ 0xaa, 0x5e, 0x5c, 0x9c, 0x51, 0x1b, 0xfb, 0x3e,
+ 0x45, 0xfb, 0x19, 0x30, 0xfb, 0x28, 0xec, 0x37,
+ 0xf7, 0x24, 0xeb, 0xcb, 0xab, 0xbb, 0xc9, 0x1f,
+ 0xe, 0xf8, 0x80, 0xc3, 0x1, 0xf7, 0x10, 0xf7,
+ 0xf4, 0x3, 0xf7, 0x9c, 0xf8, 0x80, 0x15, 0xd6,
+ 0x6, 0xf7, 0x1d, 0xf7, 0x31, 0x64, 0x9f, 0xfb,
+ 0x1c, 0xfb, 0xd, 0xfb, 0x1f, 0xf7, 0xc, 0x65,
+ 0x77, 0x5, 0xe, 0xfb, 0x21, 0x76, 0xf7, 0x40,
+ 0xbd, 0xf7, 0xdc, 0xc0, 0x12, 0xcf, 0xc2, 0xf7,
+ 0x2d, 0xe9, 0x5d, 0xb9, 0xea, 0xc2, 0x13, 0xfa,
+ 0xf7, 0xab, 0x95, 0x15, 0x86, 0x44, 0x5, 0x9c,
+ 0x92, 0xac, 0x8b, 0x71, 0x1a, 0x13, 0x72, 0x6d,
+ 0x5d, 0x85, 0x74, 0xa1, 0x1e, 0x7d, 0x65, 0x5,
+ 0x13, 0x76, 0x79, 0xa9, 0x9d, 0x8a, 0x93, 0x1b,
+ 0xb2, 0xad, 0xad, 0xb7, 0xb0, 0x73, 0x9f, 0x78,
+ 0x8d, 0x1f, 0xa3, 0x7, 0xde, 0x8f, 0xcd, 0xa8,
+ 0xc2, 0xb4, 0x75, 0xbf, 0x18, 0x76, 0x72, 0x3c,
+ 0x54, 0x3a, 0x1b, 0xfb, 0x31, 0x56, 0xf5, 0xc8,
+ 0xdf, 0xdd, 0xd8, 0xf7, 0x7, 0xc4, 0xc0, 0x7e,
+ 0x69, 0xb7, 0x1f, 0x41, 0xc2, 0xf7, 0x42, 0x54,
+ 0x7, 0x13, 0x4, 0x5e, 0x7, 0xa8, 0x5c, 0x5b,
+ 0x9b, 0x51, 0x1b, 0xfb, 0x43, 0x46, 0xfb, 0x11,
+ 0x35, 0xfb, 0x14, 0xec, 0x3a, 0xf7, 0x6, 0x80,
+ 0x1f, 0xe, 0xfb, 0x2b, 0xb3, 0xbb, 0xb3, 0x12,
+ 0xf7, 0xa5, 0xbd, 0x87, 0xbd, 0x13, 0xd0, 0xf7,
+ 0x7b, 0xfb, 0x1b, 0x15, 0x80, 0x9c, 0x9d, 0x86,
+ 0x9e, 0x1b, 0xb6, 0xb4, 0xa7, 0xb8, 0x1f, 0x13,
+ 0xe0, 0xae, 0x71, 0x9d, 0x77, 0x8d, 0x1e, 0xac,
+ 0x59, 0x7, 0x83, 0x3d, 0x5, 0x8f, 0x98, 0x94,
+ 0x8c, 0x93, 0x1b, 0x9e, 0x90, 0x7e, 0x80, 0x7a,
+ 0x7c, 0x84, 0x7a, 0x7c, 0x7b, 0x90, 0x93, 0x81,
+ 0x1f, 0xe, 0x6f, 0x76, 0xf7, 0x22, 0xc2, 0xf7,
+ 0x94, 0xc2, 0x1, 0xed, 0xc1, 0xf7, 0x8, 0xc3,
+ 0xf7, 0x1, 0xc1, 0x3, 0xf7, 0xa0, 0x5a, 0x15,
+ 0xc3, 0xf7, 0x22, 0x6, 0xd0, 0x8d, 0xd3, 0xa7,
+ 0xaf, 0xaa, 0x75, 0xbd, 0x18, 0x6b, 0x57, 0x56,
+ 0x73, 0x4b, 0x1b, 0xfb, 0xb, 0x64, 0xd2, 0xbe,
+ 0xd3, 0xc3, 0xc9, 0xed, 0xb8, 0xb3, 0x82, 0x71,
+ 0xb5, 0x1f, 0x55, 0xc1, 0xf7, 0x3c, 0x55, 0x56,
+ 0x7, 0x61, 0xa1, 0x6e, 0x8e, 0x65, 0x8f, 0x8,
+ 0xf7, 0x32, 0x53, 0xfb, 0x32, 0x7, 0x42, 0x84,
+ 0x2a, 0x52, 0xfb, 0xf, 0x1a, 0xfb, 0x8, 0xe1,
+ 0x51, 0xdf, 0x86, 0x1e, 0xe, 0xf8, 0xe9, 0xc4,
+ 0x1, 0xf7, 0x10, 0xf7, 0xf4, 0x3, 0xf7, 0x36,
+ 0xf8, 0x71, 0x15, 0xf7, 0x1e, 0xf7, 0xc, 0xf7,
+ 0x1d, 0xfb, 0xc, 0xb2, 0x9d, 0xfb, 0x1e, 0xf7,
+ 0x33, 0x5, 0x40, 0x6, 0xfb, 0x1f, 0xfb, 0x33,
+ 0x5, 0xe, 0xf4, 0xf7, 0xe, 0xf7, 0x30, 0xf7,
+ 0xe, 0x7a, 0xa, 0xf8, 0x50, 0x15, 0x52, 0xa,
+ 0xfb, 0xaa, 0x4, 0x52, 0xa, 0xe, 0xf7, 0x6e,
+ 0xf7, 0x37, 0x3, 0xf7, 0x6e, 0xfb, 0x4, 0x15,
+ 0xca, 0x6, 0xef, 0xf7, 0x7e, 0x5, 0x2e, 0x6,
+ 0xe, 0x79, 0xb9, 0xe2, 0xc0, 0xf7, 0x84, 0xbb,
+ 0xdb, 0xb7, 0x1, 0x8b, 0xb9, 0xf2, 0xba, 0xf7,
+ 0xfb, 0xb8, 0x3, 0xf7, 0xab, 0x4, 0xfb, 0x38,
+ 0xf7, 0x1a, 0xfb, 0x19, 0xf7, 0x3b, 0xf7, 0x35,
+ 0xf7, 0x1e, 0xf7, 0xe, 0xf7, 0x43, 0xf7, 0x4b,
+ 0xfb, 0x21, 0xf7, 0xa, 0xfb, 0x32, 0xfb, 0x2f,
+ 0xfb, 0x26, 0xfb, 0xb, 0xfb, 0x4a, 0x1e, 0xb9,
+ 0x16, 0xf7, 0x18, 0xee, 0xf7, 0x11, 0xf7, 0x30,
+ 0xf7, 0x21, 0xf7, 0x5, 0xfb, 0xc, 0xfb, 0x1d,
+ 0xfb, 0x22, 0xfb, 0x4, 0xfb, 0x1, 0xfb, 0x22,
+ 0xfb, 0x1b, 0xfb, 0xc, 0xf7, 0x1, 0xf7, 0x22,
+ 0x1e, 0xf8, 0x7, 0x43, 0x15, 0x6f, 0x71, 0x64,
+ 0x80, 0x65, 0x1b, 0x4f, 0x51, 0xb6, 0xd2, 0xda,
+ 0xc3, 0xba, 0xc9, 0xa6, 0xb2, 0x81, 0x75, 0x9e,
+ 0x1f, 0xac, 0xac, 0x5, 0xad, 0x6a, 0x5d, 0x98,
+ 0x64, 0x1b, 0x33, 0x3e, 0x3f, 0x29, 0x20, 0xdc,
+ 0x4f, 0xdf, 0xbc, 0xbe, 0x9e, 0xb2, 0xae, 0x1f,
+ 0xe, 0xd7, 0xba, 0xf7, 0xd2, 0xba, 0x1, 0xe9,
+ 0xba, 0xf7, 0xd2, 0xbb, 0x3, 0xd4, 0xe1, 0x15,
+ 0xab, 0x6f, 0xcc, 0xca, 0x5, 0x63, 0xc0, 0xb9,
+ 0x86, 0xaa, 0x1b, 0xbd, 0xba, 0x9b, 0xa8, 0xb1,
+ 0x1f, 0xc9, 0x4c, 0xa9, 0xa8, 0x4b, 0xcb, 0x5,
+ 0xa8, 0xb1, 0x9a, 0xba, 0xbb, 0x1a, 0xba, 0x7d,
+ 0xba, 0x6d, 0xae, 0x1e, 0xcb, 0xcb, 0x6c, 0xa8,
+ 0x4d, 0x4c, 0x5, 0xaa, 0x66, 0x5d, 0x99, 0x5b,
+ 0x1b, 0x59, 0x59, 0x7b, 0x6d, 0x67, 0x1f, 0x4c,
+ 0xcb, 0x6c, 0x6c, 0xcd, 0x4c, 0x5, 0x68, 0x5f,
+ 0x81, 0x5f, 0x63, 0x1a, 0x5b, 0x9a, 0x5b, 0xaa,
+ 0x67, 0x1e, 0x8c, 0xf7, 0x16, 0x15, 0xda, 0xc9,
+ 0xdb, 0xee, 0xe9, 0xca, 0x3e, 0x39, 0x2a, 0x40,
+ 0x4d, 0x38, 0x33, 0x43, 0xd1, 0xe4, 0x1e, 0xe,
+ 0x7c, 0xc2, 0x61, 0xc2, 0xf7, 0xe1, 0xc7, 0xf7,
+ 0x14, 0xc2, 0x12, 0xa6, 0xc4, 0xf7, 0xf3, 0xc3,
+ 0x13, 0x7c, 0xf8, 0x47, 0x89, 0x15, 0xf7, 0x1e,
+ 0xc2, 0x39, 0xf8, 0xd4, 0xfb, 0x4d, 0x54, 0xf7,
+ 0x15, 0xfb, 0x70, 0x6, 0xd7, 0x5e, 0x40, 0x9b,
+ 0x54, 0x1b, 0xfb, 0x1f, 0x2d, 0x27, 0xfb, 0x15,
+ 0x1f, 0x13, 0xbc, 0xfb, 0x8, 0xda, 0xfb, 0x8,
+ 0xf7, 0x2a, 0xd3, 0xce, 0xa8, 0xc5, 0xb3, 0x1e,
+ 0x13, 0x7c, 0xfb, 0xf3, 0xf7, 0x25, 0x15, 0xe7,
+ 0xd1, 0xd8, 0xf2, 0xf7, 0xf, 0xbd, 0x2b, 0x46,
+ 0x1e, 0x13, 0xbc, 0x21, 0x45, 0x40, 0x24, 0xfb,
+ 0x5, 0x4f, 0xe5, 0xe2, 0x1e, 0xe, 0xf7, 0xfc,
+ 0xc2, 0xf7, 0x39, 0x77, 0x1, 0xf7, 0xa5, 0xc2,
+ 0x3, 0xf7, 0xa5, 0x3c, 0x15, 0xc2, 0xf8, 0x4b,
+ 0xf7, 0x17, 0xc2, 0xfb, 0x17, 0xf7, 0x39, 0x54,
+ 0xfb, 0x39, 0xfb, 0x18, 0x54, 0xf7, 0x18, 0x6,
+ 0xe, 0xd0, 0xf7, 0xc9, 0xfb, 0x8e, 0xf7, 0xca,
+ 0x12, 0xf7, 0x21, 0xf7, 0x52, 0x13, 0xa0, 0xf7,
+ 0x21, 0xd0, 0x15, 0xf7, 0x15, 0xfb, 0x27, 0xc8,
+ 0xf7, 0x27, 0xf7, 0x14, 0x6, 0x13, 0x60, 0xc6,
+ 0xfb, 0x14, 0x7, 0x13, 0xa0, 0xf7, 0x8e, 0xf7,
+ 0x14, 0x7, 0x13, 0x60, 0xc7, 0xfb, 0x14, 0xf7,
+ 0x22, 0x4e, 0xfb, 0x22, 0xfb, 0x15, 0x7, 0x13,
+ 0xa0, 0x4f, 0xf7, 0x15, 0x7, 0x13, 0x60, 0xfb,
+ 0x8e, 0xfb, 0x15, 0x7, 0xe, 0xf7, 0xa4, 0xc9,
+ 0xf7, 0x76, 0xc9, 0x1, 0xf7, 0xf, 0xc9, 0xf7,
+ 0x77, 0xcc, 0x3, 0xf7, 0xf, 0xf8, 0x51, 0x15,
+ 0x2c, 0xd6, 0x3a, 0xf1, 0xeb, 0xdc, 0xd3, 0xf6,
+ 0xd8, 0x58, 0xec, 0xfb, 0x10, 0x25, 0x3e, 0x3b,
+ 0x2a, 0x1e, 0xc9, 0x16, 0xbc, 0xb0, 0xcd, 0xdb,
+ 0xe0, 0xa4, 0x3d, 0x66, 0x49, 0x59, 0x5b, 0x4d,
+ 0x46, 0x5d, 0xc5, 0xc3, 0x1e, 0xe, 0xf8, 0x80,
+ 0xf2, 0x1, 0xf7, 0x27, 0xf7, 0x4, 0xdc, 0xf7,
+ 0x4, 0x3, 0xf7, 0x27, 0xf8, 0x80, 0x15, 0xf7,
+ 0x4, 0xf2, 0xfb, 0x4, 0x6, 0xf7, 0x55, 0x24,
+ 0x15, 0xf7, 0x4, 0xf2, 0xfb, 0x4, 0x6, 0xe,
+ 0xbb, 0xf3, 0xd5, 0xca, 0xd5, 0xf3, 0x1, 0xf7,
+ 0x8a, 0xf3, 0x14, 0xe0, 0xe2, 0xf7, 0x76, 0x15,
+ 0xf8, 0x3e, 0xca, 0xfc, 0x3e, 0x6, 0xf7, 0x33,
+ 0xf7, 0x12, 0x15, 0x51, 0xa, 0xfb, 0xcf, 0x4,
+ 0x51, 0xa, 0xe, 0x22, 0x76, 0xf7, 0x20, 0xbb,
+ 0xf8, 0x4b, 0xbf, 0x9a, 0x77, 0xf7, 0x4, 0x77,
+ 0x12, 0xf7, 0x0, 0xc0, 0xf7, 0x2, 0xc2, 0xec,
+ 0xc1, 0x62, 0xc3, 0x13, 0xee, 0x80, 0xf6, 0x99,
+ 0x15, 0xc1, 0xbb, 0x6, 0xab, 0x73, 0xa0, 0x7b,
+ 0xc4, 0x83, 0x8, 0xfb, 0x20, 0xc2, 0xf7, 0x20,
+ 0x7, 0xf7, 0x4, 0x94, 0xc1, 0xd3, 0xd8, 0x1a,
+ 0xf7, 0x0, 0xfb, 0x20, 0xa2, 0x48, 0x9f, 0x1e,
+ 0x66, 0x96, 0x34, 0xa9, 0xbf, 0x1a, 0xc7, 0xcb,
+ 0xa4, 0xce, 0x1e, 0x13, 0xdf, 0x0, 0xc0, 0xc1,
+ 0x7c, 0x70, 0xa3, 0x1f, 0x58, 0xc1, 0xf7, 0x34,
+ 0x55, 0x5b, 0x7, 0x13, 0xee, 0x80, 0x74, 0xa0,
+ 0x60, 0x94, 0x6b, 0x8e, 0x8, 0xf6, 0x54, 0x20,
+ 0x7, 0x4b, 0x29, 0x64, 0x24, 0x1f, 0x8b, 0x7,
+ 0x43, 0xcf, 0x62, 0xee, 0x70, 0x1e, 0xd5, 0x76,
+ 0xe2, 0x74, 0x50, 0x1a, 0x47, 0x51, 0x65, 0x45,
+ 0x4f, 0x53, 0xa5, 0xb0, 0x6c, 0x1e, 0xc3, 0x55,
+ 0x7, 0xe, 0xf8, 0x71, 0xf2, 0x1, 0xf7, 0x8c,
+ 0xf2, 0x3, 0xf7, 0x8c, 0xf8, 0x71, 0x15, 0xf2,
+ 0xf2, 0x24, 0x6, 0xe, 0x74, 0xa, 0xf7, 0xa6,
+ 0x73, 0xa, 0xc1, 0xfb, 0x44, 0xf8, 0x8, 0xfb,
+ 0x5b, 0x55, 0xf7, 0x24, 0xfb, 0xd2, 0xfb, 0x47,
+ 0x6, 0xe, 0x7f, 0xc1, 0xf7, 0x3c, 0xc2, 0xf7,
+ 0x12, 0xc3, 0x1, 0xca, 0xc4, 0x3, 0xf7, 0xc,
+ 0xf7, 0x66, 0x15, 0xf8, 0x2e, 0x6, 0xf7, 0x12,
+ 0x48, 0xf7, 0x3, 0xfb, 0x35, 0xfb, 0x19, 0x21,
+ 0x2f, 0xfb, 0x1e, 0xfb, 0xa, 0xd0, 0xfb, 0x3,
+ 0xf7, 0x43, 0xdc, 0xdf, 0x99, 0xac, 0xcb, 0x1e,
+ 0x7a, 0xc0, 0x5, 0x64, 0x41, 0x39, 0x84, 0x5c,
+ 0x1b, 0x5c, 0x5e, 0x91, 0xa3, 0x65, 0x1f, 0x67,
+ 0xa2, 0x6d, 0xc1, 0xc0, 0x1a, 0x8d, 0xca, 0x15,
+ 0xc6, 0x93, 0xc6, 0xce, 0xf7, 0x5, 0x1b, 0xf7,
+ 0x1e, 0xaa, 0x26, 0x72, 0x1f, 0xe, 0x5a, 0xa,
+ 0xf7, 0x46, 0xf8, 0x81, 0x15, 0xf7, 0xb9, 0xf2,
+ 0x69, 0xd7, 0xfb, 0xa3, 0xfb, 0x28, 0x5, 0x5a,
+ 0xfb, 0xd9, 0x22, 0xa, 0x5a, 0xa, 0xf7, 0x2c,
+ 0xf8, 0x7d, 0x15, 0xf7, 0x2c, 0xf7, 0xa, 0xf7,
+ 0x29, 0xfb, 0xa, 0xb6, 0x9d, 0xfb, 0x2c, 0xf7,
+ 0x31, 0x5, 0x3a, 0x6, 0xfb, 0x2d, 0xfb, 0x31,
+ 0x5, 0x92, 0xfb, 0xc8, 0x22, 0xa, 0x5e, 0xa,
+ 0xdc, 0xf7, 0x7, 0x56, 0xa, 0xf7, 0xde, 0xf8,
+ 0xa6, 0x59, 0xa, 0x4d, 0xfc, 0x52, 0x22, 0xa,
+ 0x7c, 0x82, 0xa, 0xf7, 0x1f, 0xc3, 0x56, 0xa,
+ 0xf7, 0x31, 0xf8, 0xe8, 0x15, 0xf7, 0xb9, 0x24,
+ 0x97, 0xaa, 0xfb, 0xa3, 0xf7, 0x28, 0x5, 0x41,
+ 0xfc, 0x6d, 0x22, 0xa, 0x7c, 0xbd, 0xf7, 0x8a,
+ 0xc2, 0xf7, 0x7e, 0xbf, 0x12, 0xf1, 0xc4, 0x61,
+ 0xc5, 0xf7, 0x8c, 0xc6, 0x61, 0xc5, 0x13, 0xf2,
+ 0xf7, 0x56, 0xf7, 0xcc, 0x15, 0x75, 0x7e, 0x45,
+ 0x5c, 0x2b, 0x1a, 0x30, 0xc7, 0x3b, 0xf7, 0x1c,
+ 0xf7, 0x15, 0xd2, 0xd5, 0xee, 0xea, 0x4b, 0xb7,
+ 0x67, 0x9a, 0x1e, 0x13, 0xec, 0xaa, 0x96, 0xc0,
+ 0xb9, 0xe2, 0x1a, 0xc9, 0x5e, 0xf3, 0xfb, 0x1b,
+ 0x22, 0x3b, 0x49, 0x27, 0x4a, 0xb8, 0x50, 0xab,
+ 0x77, 0x1e, 0x13, 0xf2, 0x68, 0xfb, 0x2e, 0x15,
+ 0xcf, 0xc9, 0xc2, 0xd9, 0xd9, 0xca, 0x54, 0x47,
+ 0x47, 0x4c, 0x54, 0x3d, 0x3d, 0x4d, 0xc2, 0xcf,
+ 0x1e, 0x13, 0xec, 0x9b, 0xf7, 0xbe, 0x15, 0xcd,
+ 0xc3, 0xbb, 0xcf, 0xcf, 0xc3, 0x5b, 0x49, 0x49,
+ 0x53, 0x55, 0x47, 0x47, 0x53, 0xc1, 0xcd, 0x1e,
+ 0xe, 0x7c, 0xf7, 0x12, 0x1, 0xb0, 0xf7, 0x11,
+ 0xd4, 0xf7, 0x14, 0xd4, 0xf7, 0x13, 0x3, 0xf8,
+ 0x48, 0xba, 0x15, 0x6c, 0xa4, 0x6c, 0xb3, 0xa9,
+ 0xab, 0xa5, 0xae, 0xac, 0x72, 0xab, 0x65, 0x67,
+ 0x6f, 0x6e, 0x68, 0x1e, 0xfb, 0x5d, 0x16, 0x6c,
+ 0xa4, 0x6c, 0xb4, 0xaa, 0xaa, 0xa5, 0xae, 0xac,
+ 0x73, 0xab, 0x65, 0x65, 0x6f, 0x6e, 0x68, 0x1e,
+ 0xfb, 0x5a, 0x16, 0x6c, 0xa3, 0x6c, 0xb3, 0xaa,
+ 0xa9, 0xa5, 0xae, 0xac, 0x73, 0xab, 0x65, 0x67,
+ 0x70, 0x6e, 0x68, 0x1e, 0xe, 0xf7, 0x7b, 0xc1,
+ 0x1, 0x8b, 0xf8, 0xec, 0x3, 0xf7, 0x7b, 0x4,
+ 0xf8, 0xec, 0xc1, 0xfc, 0xec, 0x6, 0xe, 0xf7,
+ 0x7b, 0xc1, 0x1, 0xd6, 0xf8, 0x56, 0x3, 0xd6,
+ 0xf7, 0x7b, 0x15, 0xf8, 0x56, 0xc1, 0xfc, 0x56,
+ 0x6, 0xe, 0xf7, 0x1e, 0xc7, 0xf7, 0x8, 0xc8,
+ 0x1, 0xe5, 0xf8, 0x37, 0x3, 0xe5, 0xf7, 0xcf,
+ 0x15, 0xf8, 0x37, 0xc8, 0xfc, 0x37, 0x6, 0xfb,
+ 0x82, 0x4, 0xf8, 0x37, 0xc7, 0xfc, 0x37, 0x6,
+ 0xe, 0x7c, 0xbf, 0xf7, 0xe3, 0xbf, 0x1, 0xc9,
+ 0xc0, 0xf8, 0x0, 0xc6, 0x3, 0xf7, 0x6f, 0xf8,
+ 0x59, 0x15, 0xf4, 0xd1, 0xd5, 0x5c, 0xb1, 0x3a,
+ 0x91, 0x7e, 0x19, 0xa9, 0x67, 0x4f, 0x97, 0x58,
+ 0x1b, 0xfb, 0x36, 0x44, 0xfb, 0xd, 0x28, 0xfb,
+ 0x1b, 0xf1, 0x37, 0xf7, 0x1a, 0xf7, 0x3a, 0xd3,
+ 0xf7, 0x7, 0xf7, 0xd, 0x8d, 0x1f, 0x8e, 0x7,
+ 0xe5, 0x65, 0xf7, 0x2c, 0xfb, 0x11, 0xe6, 0x1e,
+ 0xe1, 0xc5, 0x71, 0xb9, 0xfb, 0x2, 0x42, 0x66,
+ 0x9e, 0x53, 0x96, 0x61, 0x91, 0x19, 0x79, 0x5c,
+ 0xaa, 0x88, 0xb3, 0x82, 0xa9, 0x7e, 0x19, 0x3b,
+ 0x51, 0x5, 0x3d, 0xfb, 0xb6, 0x15, 0xea, 0xcc,
+ 0xd4, 0xf7, 0x2, 0xf7, 0x2c, 0xb0, 0x22, 0x4d,
+ 0x26, 0x3f, 0x48, 0x23, 0xfb, 0x2, 0x41, 0xd6,
+ 0xe7, 0x1e, 0xe, 0x7c, 0xf7, 0x14, 0xf8, 0x64,
+ 0x77, 0x12, 0xf7, 0x80, 0xf7, 0x14, 0x2c, 0xcd,
+ 0x13, 0xd0, 0xf7, 0xaa, 0xf7, 0x49, 0x15, 0xbb,
+ 0x6, 0x9d, 0xf8, 0x18, 0x5, 0x37, 0x6, 0x13,
+ 0xe0, 0x73, 0xfc, 0x9d, 0x15, 0x6c, 0xa4, 0x6b,
+ 0xb2, 0x1e, 0xb3, 0xa3, 0xaa, 0xac, 0xab, 0x6d,
+ 0xab, 0x6b, 0x1f, 0x13, 0x60, 0x60, 0x74, 0x69,
+ 0x6c, 0x1f, 0xe, 0xfb, 0x1c, 0x76, 0xf8, 0x67,
+ 0xf7, 0xc, 0x1, 0xf7, 0xa2, 0xc8, 0x3, 0xf7,
+ 0x80, 0xf8, 0x5, 0x15, 0x6b, 0xa7, 0x70, 0xaf,
+ 0xb5, 0xa1, 0xa9, 0xa9, 0xa9, 0x71, 0xa9, 0x64,
+ 0x63, 0x74, 0x6f, 0x6a, 0x1e, 0xa4, 0xfc, 0xa2,
+ 0x15, 0xd9, 0x6, 0x7b, 0xf8, 0x21, 0x5, 0x5f,
+ 0x6, 0xe, 0x8b, 0xc2, 0xf7, 0xd8, 0xc2, 0xf7,
+ 0x1f, 0xc2, 0x1, 0xf7, 0x58, 0xc3, 0x3, 0xe6,
+ 0x16, 0xf8, 0xd, 0xc2, 0xfb, 0x6c, 0xf7, 0xd8,
+ 0xf7, 0x62, 0xc2, 0xfb, 0x62, 0x6, 0x8c, 0xf7,
+ 0x11, 0x8a, 0x98, 0xf7, 0x7, 0x8c, 0x8, 0xb1,
+ 0xc9, 0x81, 0x85, 0xaf, 0x1f, 0x90, 0xc3, 0x5,
+ 0x90, 0x6a, 0x45, 0x95, 0x63, 0x1b, 0xfb, 0x20,
+ 0x8c, 0x6f, 0x6a, 0x8a, 0xfb, 0x36, 0x8, 0x22,
+ 0x54, 0xf4, 0xfb, 0xd8, 0x22, 0x6, 0xe, 0x8b,
+ 0xc0, 0xf7, 0xd5, 0xc0, 0xde, 0xf7, 0xd, 0x1,
+ 0xf7, 0x1, 0xc2, 0xf7, 0xa3, 0xc2, 0x3, 0xf8,
+ 0x37, 0xf8, 0x92, 0x15, 0xd2, 0xf7, 0xb, 0x44,
+ 0x6, 0x33, 0xfd, 0x9, 0x15, 0xf7, 0x9e, 0xc0,
+ 0x20, 0xf8, 0xa, 0xfb, 0x1c, 0x56, 0xdc, 0xfb,
+ 0xd5, 0x23, 0x6, 0xfb, 0xdc, 0x56, 0x48, 0xa,
+ 0x4a, 0xa, 0x7c, 0xc3, 0xf7, 0xa5, 0xc9, 0xf7,
+ 0x40, 0xc6, 0x1, 0xf7, 0x14, 0xc9, 0xf7, 0x8d,
+ 0xc9, 0x3, 0xec, 0xa7, 0x15, 0x6c, 0xd2, 0xc5,
+ 0x7f, 0xc2, 0x1b, 0xf7, 0x1c, 0xe0, 0xdc, 0xf7,
+ 0x9, 0x8a, 0x1f, 0xf7, 0xc, 0x8a, 0x38, 0xd4,
+ 0xfb, 0x5, 0x1b, 0x63, 0x6b, 0x80, 0x76, 0x61,
+ 0x1f, 0xf7, 0x60, 0xf7, 0xa8, 0xc6, 0xfb, 0xe6,
+ 0xfb, 0xd5, 0x7, 0xb5, 0x73, 0x5, 0xaf, 0xb6,
+ 0xbb, 0x9b, 0xb6, 0x1b, 0xd6, 0xc7, 0x5b, 0x35,
+ 0x2b, 0x42, 0x61, 0x36, 0x8a, 0x1f, 0x55, 0x8a,
+ 0x51, 0x9a, 0x58, 0xaa, 0x8, 0xe, 0x8b, 0xc2,
+ 0xf7, 0xd3, 0xc0, 0xf7, 0x26, 0xc3, 0x8d, 0x77,
+ 0x12, 0xf7, 0x1, 0xc2, 0xf7, 0xa5, 0xc1, 0x13,
+ 0xec, 0xf7, 0xdf, 0x16, 0xf7, 0x9e, 0xc2, 0x21,
+ 0xf8, 0xd2, 0xfb, 0x25, 0x53, 0xe6, 0xfc, 0x9a,
+ 0x21, 0x6, 0xfb, 0xdc, 0x54, 0x48, 0xa, 0x13,
+ 0xdc, 0x4a, 0xa, 0xfb, 0x23, 0xc6, 0xf8, 0x4b,
+ 0xc4, 0xf7, 0x2d, 0xc4, 0x1, 0xab, 0xf8, 0xab,
+ 0x3, 0xbf, 0x37, 0x15, 0x77, 0x50, 0x5, 0xd0,
+ 0x6, 0xf7, 0x2c, 0x9c, 0xc7, 0xf7, 0x2, 0x9f,
+ 0x1f, 0xc6, 0xf7, 0xdc, 0x5, 0xf6, 0x6, 0x92,
+ 0xc4, 0x5, 0x23, 0x6, 0xf7, 0x7, 0xa2, 0x84,
+ 0xb1, 0xf7, 0x5, 0x1b, 0x9d, 0xa8, 0x88, 0x8a,
+ 0x9d, 0x1f, 0x99, 0xc5, 0x4f, 0x8e, 0x5, 0x54,
+ 0x52, 0x86, 0x64, 0x66, 0x1f, 0x62, 0x61, 0x88,
+ 0x4b, 0x80, 0x4f, 0x8, 0xfb, 0x0, 0x6, 0x85,
+ 0x52, 0x5, 0xf3, 0x6, 0x51, 0xfb, 0xd5, 0x77,
+ 0xfb, 0x6, 0x59, 0x78, 0xfb, 0x5, 0x9a, 0x19,
+ 0xe, 0x95, 0xc3, 0xf7, 0x16, 0xc7, 0xf8, 0x2,
+ 0x77, 0x1, 0xf7, 0xfe, 0xc9, 0x3, 0xe4, 0xf7,
+ 0x4f, 0x15, 0xf7, 0xa5, 0xfb, 0x17, 0xfb, 0x2,
+ 0x53, 0xf7, 0x97, 0xc3, 0x34, 0xf7, 0x17, 0xe2,
+ 0xc7, 0x34, 0xf8, 0xb, 0x34, 0x6, 0xfb, 0x8c,
+ 0xfc, 0x11, 0x5, 0xcc, 0x91, 0x15, 0xf7, 0x64,
+ 0xf7, 0xd1, 0x5, 0xfb, 0xd1, 0x7, 0xe, 0x52,
+ 0xf9, 0x66, 0x1, 0xe6, 0xf8, 0x35, 0x3, 0xe6,
+ 0x66, 0x15, 0xb3, 0x77, 0xf8, 0xd, 0xf9, 0x50,
+ 0x64, 0xa1, 0x5, 0xe, 0xfb, 0x31, 0xbe, 0xf7,
+ 0x37, 0xbf, 0xf7, 0xac, 0xbf, 0x7f, 0x77, 0x12,
+ 0xb2, 0xc0, 0xf7, 0xf5, 0xc0, 0x13, 0xdc, 0xde,
+ 0x3c, 0x15, 0x80, 0x59, 0x50, 0xa, 0x41, 0x7,
+ 0x13, 0xec, 0xbc, 0x70, 0x43, 0xb0, 0x44, 0xa,
+ 0x70, 0x31, 0x48, 0x2c, 0x9b, 0x96, 0x57, 0x1e,
+ 0x94, 0xf7, 0xda, 0x15, 0xe0, 0xde, 0xc4, 0xe9,
+ 0xf7, 0x8, 0xc4, 0x69, 0xa, 0xe, 0xfb, 0x31,
+ 0xbe, 0x8b, 0xf7, 0x37, 0x8b, 0xbf, 0xf7, 0xac,
+ 0xbf, 0x7f, 0x77, 0xab, 0xbd, 0x12, 0xb2, 0xc0,
+ 0xf7, 0xf5, 0xc0, 0x13, 0xef, 0xde, 0x43, 0x15,
+ 0x80, 0x52, 0x50, 0xa, 0x55, 0x7, 0x13, 0xf7,
+ 0xae, 0x6a, 0x49, 0xaa, 0x44, 0xa, 0x6f, 0x31,
+ 0x8c, 0x1e, 0x48, 0x8c, 0x2c, 0x9f, 0x57, 0x96,
+ 0x8, 0x94, 0xf7, 0xd5, 0x15, 0xe0, 0xde, 0xc4,
+ 0xe9, 0xf7, 0x1e, 0xae, 0x69, 0xa, 0xf7, 0x43,
+ 0xf7, 0x88, 0x37, 0xa, 0x7c, 0xc0, 0x63, 0xc3,
+ 0xf7, 0xdf, 0xc2, 0xf7, 0x1a, 0xc2, 0x12, 0xf7,
+ 0x3, 0xc2, 0xd9, 0xc4, 0xf7, 0x17, 0xc2, 0xa7,
+ 0xc2, 0x13, 0x7f, 0xa9, 0x89, 0x15, 0xf7, 0x1c,
+ 0xf8, 0x77, 0x6, 0xde, 0xa1, 0x95, 0xf2, 0xd8,
+ 0xcb, 0x88, 0x56, 0x59, 0x5e, 0x88, 0x55, 0x72,
+ 0x1e, 0x5e, 0x77, 0x5f, 0x72, 0x58, 0x1a, 0x4d,
+ 0xc1, 0x6f, 0xbb, 0x78, 0x1e, 0xf7, 0x17, 0x59,
+ 0xb1, 0x80, 0x5d, 0x1a, 0x13, 0xbf, 0x4f, 0x4f,
+ 0x70, 0x48, 0x88, 0x1e, 0x45, 0x88, 0x41, 0xa7,
+ 0x74, 0xa4, 0x75, 0x54, 0x18, 0x6d, 0xb2, 0xd2,
+ 0x79, 0xd0, 0x1b, 0xec, 0xea, 0xb8, 0xf4, 0xd7,
+ 0x38, 0xaa, 0x40, 0xa4, 0x1f, 0x4f, 0x9f, 0x58,
+ 0x9a, 0xb4, 0x1a, 0xb3, 0xbb, 0x97, 0xbd, 0x9f,
+ 0x1e, 0xc4, 0xa2, 0xaa, 0x9a, 0xce, 0x1a, 0xdf,
+ 0x35, 0xa4, 0x2b, 0xfb, 0x3a, 0x6f, 0x6b, 0xfb,
+ 0x31, 0x1e, 0x3a, 0x54, 0xdc, 0x6, 0x13, 0x7f,
+ 0xfb, 0xdf, 0x3a, 0x7, 0xe, 0x6e, 0xa, 0xf8,
+ 0x20, 0xf8, 0x85, 0x15, 0x9c, 0xa8, 0xfb, 0x49,
+ 0xf7, 0x26, 0x5d, 0x46, 0x5, 0xe, 0xb5, 0xd0,
+ 0xf7, 0xbf, 0xc9, 0x1, 0xf8, 0x44, 0xce, 0x3,
+ 0xf8, 0x87, 0xf7, 0xbd, 0x15, 0xfc, 0x22, 0xf7,
+ 0x43, 0x5, 0x4d, 0x7, 0xf7, 0xdf, 0xfb, 0x2b,
+ 0xfb, 0xdf, 0xfb, 0x28, 0x5, 0x46, 0x7, 0xf8,
+ 0x22, 0xf7, 0x46, 0x5, 0xe, 0x7b, 0xa, 0xf7,
+ 0x95, 0xf7, 0x96, 0x15, 0xf7, 0x7e, 0xfb, 0x50,
+ 0x9c, 0xba, 0xfb, 0x3d, 0xf7, 0x21, 0xf7, 0x3d,
+ 0xf7, 0x21, 0x78, 0xba, 0x5, 0xfc, 0x21, 0xfb,
+ 0x50, 0x15, 0xf7, 0x79, 0xfb, 0x50, 0xa0, 0xba,
+ 0xfb, 0x40, 0xf7, 0x21, 0xf7, 0x3d, 0xf7, 0x1f,
+ 0x75, 0xbc, 0x5, 0xe, 0x7b, 0xa, 0xf7, 0x2,
+ 0xd1, 0x15, 0xf7, 0x7d, 0xf7, 0x50, 0xfb, 0x7d,
+ 0xf7, 0x50, 0x79, 0x5c, 0xf7, 0x3d, 0xfb, 0x21,
+ 0xfb, 0x3d, 0xfb, 0x21, 0x5, 0xf7, 0x51, 0x5c,
+ 0x15, 0xf7, 0x77, 0xf7, 0x50, 0xfb, 0x73, 0xf7,
+ 0x50, 0x73, 0x5a, 0xf7, 0x3d, 0xfb, 0x1f, 0xfb,
+ 0x40, 0xfb, 0x21, 0x5, 0xe, 0xd1, 0xf8, 0xc,
+ 0x1, 0xf7, 0x2b, 0xf7, 0xbd, 0x3, 0xf7, 0x2b,
+ 0xf7, 0x96, 0x15, 0xf7, 0xa3, 0xfb, 0x50, 0xa5,
+ 0xb3, 0xfb, 0x66, 0xf7, 0x28, 0xf7, 0x66, 0xf7,
+ 0x27, 0x71, 0xb4, 0x5, 0xe, 0xd1, 0xf8, 0xc,
+ 0x1, 0xf7, 0x2f, 0xf7, 0xba, 0x3, 0xf7, 0x46,
+ 0xd1, 0x15, 0xf7, 0xa3, 0xf7, 0x50, 0xfb, 0xa3,
+ 0xf7, 0x50, 0x70, 0x62, 0xf7, 0x67, 0xfb, 0x27,
+ 0xfb, 0x63, 0xfb, 0x28, 0x5, 0xe, 0x8b, 0xc2,
+ 0xf7, 0xf0, 0xc2, 0xf7, 0x8, 0xc2, 0x1, 0xf5,
+ 0xc3, 0xf7, 0xab, 0xc3, 0x3, 0x9e, 0x16, 0xf7,
+ 0x83, 0xc2, 0x2b, 0xf7, 0x99, 0x6, 0xb6, 0xbb,
+ 0xcb, 0xb7, 0xce, 0x1b, 0xe0, 0x9a, 0x59, 0x54,
+ 0x1f, 0xfb, 0x87, 0x36, 0x54, 0xf7, 0x76, 0xc2,
+ 0x36, 0xf7, 0x9d, 0x7, 0xca, 0x6e, 0xd6, 0xfb,
+ 0x13, 0x4a, 0x4e, 0x66, 0x5e, 0x56, 0x1e, 0xf7,
+ 0x91, 0xfb, 0x24, 0x54, 0xe3, 0xfc, 0x9b, 0x34,
+ 0x7, 0xe, 0xf8, 0x85, 0xf7, 0x43, 0x1, 0xf7,
+ 0x17, 0xf7, 0xe6, 0x3, 0xf7, 0x17, 0xf8, 0x9d,
+ 0x71, 0xa, 0x7d, 0xfb, 0x2b, 0x71, 0xa, 0xe,
+ 0xf7, 0x7b, 0xc1, 0x1, 0xf2, 0xf8, 0x1e, 0x3,
+ 0xf2, 0xf7, 0x7b, 0x15, 0xf8, 0x1e, 0xc1, 0xfc,
+ 0x1e, 0x6, 0xe, 0x8b, 0xc2, 0xf7, 0xd9, 0xc2,
+ 0xed, 0xf7, 0x10, 0x81, 0xa, 0xf7, 0x95, 0x7e,
+ 0xa, 0xfb, 0x36, 0xfd, 0x25, 0x15, 0xf8, 0x2e,
+ 0xc2, 0xfb, 0x43, 0xf8, 0x10, 0xfb, 0x5d, 0x54,
+ 0xf7, 0x24, 0xfb, 0xd9, 0xfb, 0x46, 0x6, 0xe,
+ 0x6f, 0xa, 0xf7, 0x31, 0xf8, 0x82, 0x15, 0xf7,
+ 0xb7, 0xf1, 0x69, 0xd7, 0xfb, 0xa1, 0xfb, 0x27,
+ 0x5, 0x59, 0xfc, 0xa1, 0x15, 0x35, 0xa, 0xe,
+ 0x8b, 0xc2, 0xf7, 0xdd, 0x82, 0xa, 0x68, 0xa,
+ 0xc3, 0x3, 0xe9, 0xf8, 0x86, 0x15, 0xb4, 0x79,
+ 0xf7, 0x29, 0xf7, 0xa, 0xf7, 0x27, 0xfb, 0xa,
+ 0xb6, 0x9d, 0xfb, 0x29, 0xf7, 0x30, 0x5, 0x3a,
+ 0x6, 0xfb, 0x29, 0xfd, 0x22, 0x15, 0x35, 0xa,
+ 0xe, 0x8b, 0xc2, 0xf7, 0xdb, 0xc2, 0xe8, 0xf7,
+ 0x7, 0x12, 0xf7, 0x3a, 0xe2, 0xa0, 0xc3, 0x7e,
+ 0xe0, 0x13, 0xf8, 0xea, 0x16, 0x35, 0xa, 0x13,
+ 0xf4, 0xf7, 0x72, 0xf8, 0x6f, 0x59, 0xa, 0xe,
+ 0x6f, 0xa, 0xf7, 0x1c, 0xf8, 0xe8, 0x15, 0xf7,
+ 0xb9, 0x25, 0x96, 0xaa, 0xfb, 0xa2, 0xf7, 0x27,
+ 0x5, 0x40, 0xfd, 0x34, 0x15, 0x35, 0xa, 0xe,
+ 0xfb, 0x31, 0xc1, 0xf8, 0x76, 0xc5, 0xee, 0xf7,
+ 0x10, 0x1, 0xf7, 0x18, 0xc4, 0xf7, 0xa9, 0xc7,
+ 0x3, 0xf7, 0x8, 0x7e, 0xa, 0x60, 0xfd, 0x8c,
+ 0x15, 0x55, 0xf7, 0x3f, 0xc1, 0x54, 0xf8, 0xae,
+ 0x25, 0x54, 0xb8, 0xfc, 0x77, 0x7, 0xf7, 0xbc,
+ 0xf9, 0x17, 0x15, 0xd5, 0xf7, 0x9, 0x41, 0x6,
+ 0xfb, 0x2, 0xfd, 0x7a, 0x15, 0x7c, 0x55, 0x5,
+ 0x85, 0x91, 0xb6, 0x7f, 0xbf, 0x1b, 0xef, 0xa1,
+ 0xbd, 0xf7, 0xc, 0x1f, 0xf8, 0x3c, 0xfb, 0x32,
+ 0x51, 0xed, 0xfb, 0xf4, 0x7, 0x32, 0x88, 0x62,
+ 0x50, 0x56, 0x89, 0x93, 0x95, 0x6c, 0x1e, 0xe,
+ 0xfb, 0x31, 0xc1, 0xf8, 0x7b, 0xc0, 0xf2, 0xf7,
+ 0x9, 0x1, 0xf8, 0x28, 0xc7, 0x3, 0xf8, 0x2,
+ 0xf8, 0xb0, 0x15, 0xd5, 0xf7, 0x9, 0x41, 0x6,
+ 0xfb, 0x70, 0xfd, 0x7a, 0x15, 0x81, 0x53, 0x5,
+ 0x82, 0xb5, 0xbf, 0x84, 0xbf, 0x1b, 0xef, 0xdd,
+ 0xbd, 0xf7, 0xc, 0x1f, 0xf8, 0x3c, 0xfb, 0xd2,
+ 0x56, 0xf7, 0x96, 0xfb, 0xf9, 0x7, 0x32, 0x53,
+ 0x62, 0x49, 0x56, 0x5b, 0x96, 0x92, 0x68, 0x1e,
+ 0xe, 0x8b, 0xc2, 0xf7, 0xda, 0xc2, 0xf7, 0x1e,
+ 0xc2, 0x1, 0xf7, 0xa, 0xc3, 0x3, 0xaa, 0x16,
+ 0xf7, 0x23, 0xf7, 0x5a, 0x6, 0xc5, 0xb5, 0xb4,
+ 0x6a, 0xe0, 0x32, 0xbd, 0x4c, 0x19, 0x52, 0x54,
+ 0xf7, 0x6d, 0xc2, 0x2c, 0x6, 0x4d, 0xda, 0x4b,
+ 0xd3, 0x3f, 0xc9, 0xf7, 0x33, 0xf7, 0x5, 0x18,
+ 0xee, 0xc2, 0xfb, 0x72, 0x54, 0xba, 0x6, 0xfb,
+ 0x48, 0xfb, 0x14, 0x5, 0xf8, 0xc, 0xfb, 0x23,
+ 0x54, 0xe2, 0xfc, 0x9b, 0x34, 0x7, 0xe, 0x8b,
+ 0xc2, 0xf8, 0x9b, 0xc2, 0x68, 0xa, 0x73, 0xa,
+ 0xc2, 0xfb, 0x44, 0xf8, 0xd2, 0xfb, 0x6b, 0x54,
+ 0xf7, 0x34, 0xfc, 0x9b, 0xfb, 0x47, 0x6, 0xe,
+ 0xb5, 0xc9, 0xf7, 0xbf, 0xd0, 0x1, 0xf0, 0xce,
+ 0x3, 0xf0, 0xf7, 0x6d, 0x15, 0xf8, 0x22, 0xfb,
+ 0x43, 0x5, 0xc9, 0x7, 0xfb, 0xdf, 0xf7, 0x2b,
+ 0xf7, 0xdf, 0xf7, 0x28, 0x5, 0xd0, 0x7, 0xfc,
+ 0x22, 0xfb, 0x46, 0x5, 0xe, 0x76, 0xbe, 0xf7,
+ 0x37, 0xc3, 0xd7, 0xc5, 0xf7, 0x3e, 0xc5, 0x1,
+ 0xf7, 0x39, 0xc2, 0x3, 0xd6, 0xaa, 0x15, 0xa5,
+ 0x57, 0xa8, 0x94, 0xd8, 0xac, 0xb0, 0x8a, 0x19,
+ 0xaf, 0x8a, 0x90, 0x8c, 0xad, 0x7a, 0x8, 0x81,
+ 0x9f, 0x9f, 0x7d, 0xbc, 0x1b, 0xb6, 0xb6, 0x9d,
+ 0xa7, 0xaa, 0x1f, 0x76, 0xb8, 0x5, 0x7f, 0x7a,
+ 0x61, 0x6f, 0x68, 0x1b, 0x69, 0x81, 0x93, 0x9f,
+ 0x6c, 0x1f, 0x99, 0x75, 0x73, 0x90, 0x7c, 0x1b,
+ 0x6a, 0x6f, 0x84, 0x7a, 0x67, 0x1f, 0xc3, 0xb7,
+ 0x9b, 0xa9, 0x86, 0xcd, 0x8, 0xf7, 0x19, 0xc3,
+ 0xfb, 0x1d, 0x6, 0x87, 0x97, 0x88, 0xaf, 0x88,
+ 0xa7, 0x8, 0xf7, 0x27, 0xc5, 0x6, 0xfb, 0x2d,
+ 0x8c, 0x5, 0x89, 0xa3, 0x89, 0x97, 0x97, 0x1a,
+ 0xe8, 0xc6, 0xa7, 0xbe, 0xbe, 0xbd, 0x72, 0x59,
+ 0xa4, 0x1e, 0xc0, 0x9e, 0x5, 0xc4, 0x70, 0x50,
+ 0xc4, 0x2f, 0x1b, 0x22, 0x4e, 0x3f, 0x36, 0x7b,
+ 0x8d, 0x78, 0x8e, 0x6c, 0x1f, 0x2e, 0x4f, 0xef,
+ 0x6, 0x8f, 0x6f, 0x8b, 0x69, 0x8f, 0x7e, 0x8,
+ 0xfb, 0x0, 0x53, 0xf7, 0x4, 0x6, 0x96, 0x4c,
+ 0x53, 0x5a, 0x46, 0x59, 0x8, 0xe, 0xf7, 0xc7,
+ 0xc9, 0x1, 0xf8, 0x54, 0xc2, 0x3, 0xf8, 0x54,
+ 0xf7, 0xc7, 0x15, 0xfb, 0x5b, 0xc2, 0xf7, 0x99,
+ 0xfc, 0x3e, 0x4d, 0x7, 0xe, 0x8b, 0xc3, 0xf8,
+ 0x99, 0xc3, 0x1, 0xf7, 0xa5, 0x73, 0xa, 0xc3,
+ 0xfb, 0x45, 0xf7, 0x88, 0x6, 0xf7, 0x18, 0xc0,
+ 0x5, 0xc3, 0x7, 0xfb, 0x18, 0x55, 0x5, 0xf7,
+ 0xa6, 0xfb, 0x78, 0x53, 0xf7, 0x41, 0xfb, 0x84,
+ 0x7, 0xfb, 0x19, 0x55, 0x5, 0x54, 0x7, 0xf7,
+ 0x19, 0xc1, 0x5, 0xfb, 0x72, 0xfb, 0x46, 0x7,
+ 0xe, 0x8b, 0xc2, 0xf7, 0xdf, 0xc2, 0x1, 0xc2,
+ 0xc4, 0xf7, 0x3c, 0xc3, 0xf7, 0x2c, 0xc4, 0x3,
+ 0xc2, 0x16, 0xf7, 0xd, 0xc1, 0x4b, 0xf7, 0xa2,
+ 0x6, 0xa7, 0x9f, 0xa1, 0xad, 0xba, 0x1b, 0xd0,
+ 0x95, 0x40, 0x81, 0x1f, 0xfb, 0xc1, 0xf7, 0xd,
+ 0xc2, 0x4a, 0xf7, 0x96, 0x7, 0x96, 0xa7, 0xca,
+ 0xc4, 0xc9, 0x90, 0x54, 0x75, 0x1e, 0xfb, 0xca,
+ 0xf7, 0x4, 0xc2, 0x54, 0xf7, 0x96, 0x7, 0xcd,
+ 0x6a, 0xc9, 0x3d, 0x56, 0x6e, 0x68, 0x68, 0x6f,
+ 0x1e, 0xaf, 0x7c, 0x62, 0xad, 0x55, 0x1b, 0x5e,
+ 0x6f, 0x6f, 0x6e, 0x6e, 0x1f, 0xb7, 0xfb, 0x4,
+ 0x55, 0xc2, 0x7, 0xe, 0xf8, 0xa1, 0xb3, 0x1,
+ 0xf7, 0xc, 0xf7, 0xfc, 0x3, 0xf7, 0xc, 0xf8,
+ 0xa1, 0x15, 0xf7, 0xfc, 0xb3, 0xfb, 0xfc, 0x6,
+ 0xe, 0xf7, 0x7c, 0xbe, 0x1, 0xdb, 0xf8, 0x4c,
+ 0x3, 0xdb, 0xf7, 0x7c, 0x15, 0xf8, 0x4c, 0xbe,
+ 0xfc, 0x4c, 0x6, 0xe, 0xfb, 0x1c, 0x76, 0xf7,
+ 0x2c, 0xbf, 0x62, 0xb4, 0x62, 0xc1, 0xf7, 0xcd,
+ 0xc0, 0x12, 0xf7, 0x3, 0xc2, 0xf7, 0x9f, 0xc2,
+ 0x13, 0xce, 0xf7, 0x3a, 0xae, 0x15, 0x6f, 0xa7,
+ 0xb1, 0x7f, 0xb3, 0x1b, 0xc8, 0xcb, 0xae, 0xc5,
+ 0xaf, 0x1f, 0x13, 0xae, 0x39, 0xf7, 0x1d, 0x7,
+ 0x13, 0x9e, 0xc1, 0x39, 0xf8, 0x2, 0xfb, 0x1d,
+ 0x56, 0xdd, 0xfb, 0x18, 0x7, 0x13, 0xce, 0x5a,
+ 0x68, 0xfb, 0x25, 0xfb, 0x11, 0x49, 0x62, 0xb8,
+ 0xc6, 0x1e, 0xf7, 0xa7, 0xfb, 0x1d, 0x56, 0xdd,
+ 0xfc, 0xa6, 0xc2, 0x7, 0xe, 0xc9, 0x76, 0x1,
+ 0xe1, 0xdb, 0x15, 0xaf, 0x65, 0xf7, 0x45, 0xf7,
+ 0x43, 0xf7, 0x44, 0xfb, 0x42, 0xb2, 0xb2, 0xfb,
+ 0x44, 0xf7, 0x43, 0xf7, 0x44, 0xf7, 0x44, 0x69,
+ 0xb4, 0xfb, 0x49, 0xfb, 0x46, 0xfb, 0x43, 0xf7,
+ 0x42, 0x65, 0x64, 0xf7, 0x43, 0xfb, 0x43, 0x5,
+ 0xe, 0x8b, 0xc2, 0xf7, 0xe0, 0xc2, 0x1, 0xf7,
+ 0x1, 0xc2, 0xf7, 0xa5, 0xc2, 0x3, 0xa4, 0x16,
+ 0xf7, 0x73, 0xc2, 0x37, 0xf7, 0x85, 0x6, 0xb8,
+ 0xb5, 0xd0, 0xb9, 0xc9, 0x1b, 0xb7, 0xc3, 0x7e,
+ 0x47, 0x1f, 0xfb, 0x8f, 0x38, 0x54, 0xf7, 0x70,
+ 0xc2, 0x39, 0xf7, 0x90, 0x7, 0xe1, 0x5a, 0xbc,
+ 0x21, 0x45, 0x45, 0x5e, 0x62, 0x6a, 0x1e, 0xe1,
+ 0xfb, 0x1f, 0x54, 0xdf, 0xfb, 0xe0, 0x37, 0x7,
+ 0xe, 0x7c, 0xc4, 0xf7, 0x4a, 0xc9, 0xf7, 0xa9,
+ 0xc6, 0x1, 0xf5, 0xc7, 0xf7, 0xa2, 0xc5, 0x3,
+ 0xf5, 0x7c, 0x15, 0xf7, 0x8d, 0xf7, 0x1f, 0xf7,
+ 0x5, 0xf7, 0x7c, 0xf7, 0x62, 0x2d, 0xe1, 0xfb,
+ 0x6, 0x23, 0x3f, 0x27, 0x20, 0x28, 0xcb, 0x2f,
+ 0xf7, 0x2, 0xd9, 0xbc, 0xb9, 0xb3, 0xa8, 0x1f,
+ 0xfb, 0x5a, 0xfb, 0x34, 0x3d, 0xfb, 0x3e, 0x93,
+ 0x1e, 0xf7, 0xd9, 0xf7, 0xf2, 0x15, 0x54, 0x70,
+ 0x59, 0x58, 0x4a, 0x1b, 0x43, 0x58, 0xc0, 0xd9,
+ 0xc5, 0xab, 0xe3, 0xe3, 0xe2, 0xc1, 0x2d, 0x3e,
+ 0x8f, 0x1f, 0xe, 0x8b, 0xbf, 0xf7, 0xed, 0xc0,
+ 0x5b, 0xc0, 0xc7, 0xbb, 0x8c, 0xbc, 0x12, 0xa4,
+ 0xf7, 0x20, 0x54, 0xc2, 0xf7, 0xa5, 0xc1, 0x13,
+ 0xbd, 0xeb, 0xf8, 0xa1, 0x15, 0xbe, 0x81, 0x5,
+ 0x99, 0x8f, 0x9f, 0xae, 0xaf, 0x1b, 0xad, 0xaa,
+ 0x85, 0x7c, 0xa1, 0x1f, 0x7c, 0xa1, 0x9b, 0x7e,
+ 0xb4, 0x1b, 0xc9, 0xb6, 0xb6, 0xc2, 0x9e, 0x1f,
+ 0x59, 0x94, 0x5, 0x72, 0x82, 0x6e, 0x69, 0x67,
+ 0x1b, 0x76, 0x7a, 0x97, 0x98, 0x78, 0x1f, 0x9c,
+ 0x73, 0x71, 0x93, 0x5f, 0x1b, 0x58, 0x56, 0x74,
+ 0x4a, 0x75, 0x1f, 0x44, 0xfc, 0xa1, 0x15, 0xf7,
+ 0x73, 0xbf, 0x38, 0xf7, 0x93, 0x6, 0xb7, 0xb5,
+ 0xd0, 0xbe, 0xc8, 0x1b, 0xb7, 0xc4, 0x7f, 0x49,
+ 0x1f, 0xfb, 0xa4, 0x38, 0x57, 0xf7, 0x6f, 0xbf,
+ 0x39, 0xf7, 0xa5, 0x7, 0xdd, 0x62, 0xbb, 0x2a,
+ 0x45, 0x47, 0x65, 0x5f, 0x58, 0x1e, 0x13, 0xdd,
+ 0xd0, 0xfb, 0x20, 0x56, 0x7, 0x13, 0xdb, 0xe0,
+ 0xfb, 0xe5, 0x6, 0x13, 0xdd, 0x36, 0x6, 0xe,
+ 0xf7, 0x1f, 0xc1, 0xf7, 0x35, 0xc1, 0x1, 0xf7,
+ 0x3b, 0x3d, 0x15, 0xbd, 0x6, 0x95, 0xf7, 0x6d,
+ 0x5, 0xf7, 0x23, 0x6, 0x86, 0xfb, 0x6d, 0x5,
+ 0xbd, 0x6, 0x91, 0xf7, 0x6d, 0x5, 0xef, 0xc1,
+ 0x2b, 0x6, 0x8f, 0xf7, 0x35, 0x5, 0xe7, 0xc1,
+ 0x32, 0x6, 0x90, 0xf7, 0x6f, 0x5, 0x58, 0x6,
+ 0x87, 0xfb, 0x6f, 0x5, 0xfb, 0x25, 0x6, 0x8e,
+ 0xf7, 0x6f, 0x5, 0x57, 0x6, 0x88, 0xfb, 0x6f,
+ 0x5, 0x20, 0x55, 0xf4, 0x6, 0x86, 0xfb, 0x35,
+ 0x5, 0x27, 0x55, 0xec, 0x6, 0xc1, 0xc1, 0x15,
+ 0x90, 0xf7, 0x35, 0x5, 0xf7, 0x24, 0x6, 0x86,
+ 0xfb, 0x35, 0x5, 0xe, 0x7a, 0xc2, 0xf7, 0xf2,
+ 0xc2, 0x1, 0xc7, 0xc1, 0xf8, 0x2, 0xc6, 0x3,
+ 0xc7, 0xf7, 0x67, 0x15, 0xfb, 0x1f, 0xf6, 0x32,
+ 0xf7, 0x18, 0xf7, 0x1e, 0xf1, 0xe6, 0xf7, 0x1e,
+ 0xf7, 0x22, 0x24, 0xe4, 0xfb, 0x1d, 0xfb, 0x1f,
+ 0x27, 0x34, 0xfb, 0x25, 0x1e, 0xc1, 0x16, 0xf7,
+ 0x6, 0xd8, 0xca, 0xf5, 0xf5, 0xd8, 0x4d, 0xfb,
+ 0x6, 0xfb, 0xa, 0x43, 0x53, 0xfb, 0x3, 0x22,
+ 0x3d, 0xc5, 0xf7, 0x7, 0x1e, 0xe, 0x63, 0xa,
+ 0x58, 0xa, 0xf7, 0x4c, 0xf8, 0x95, 0x15, 0xf7,
+ 0xa6, 0xde, 0x6b, 0xd7, 0xfb, 0x92, 0xfb, 0x13,
+ 0x5, 0xfb, 0x2, 0xfb, 0xdd, 0x21, 0xa, 0x63,
+ 0xa, 0xf7, 0x62, 0x77, 0x58, 0xa, 0xf7, 0x32,
+ 0xf8, 0x7d, 0x15, 0xf7, 0x22, 0xf7, 0x3, 0xf7,
+ 0x20, 0xfb, 0x3, 0xb3, 0x9d, 0xfb, 0x22, 0xf7,
+ 0x27, 0x5, 0x3f, 0x6, 0xfb, 0x23, 0xfb, 0x27,
+ 0x5, 0x52, 0xfb, 0xb7, 0x21, 0xa, 0x63, 0xa,
+ 0xd2, 0xf7, 0x8, 0x58, 0xa, 0xf7, 0xf6, 0xf8,
+ 0x9b, 0x15, 0xda, 0xf7, 0x8, 0x3c, 0x6, 0xfb,
+ 0x54, 0xfb, 0x8, 0x15, 0xdd, 0xf7, 0x8, 0x39,
+ 0x6, 0x27, 0xfc, 0x37, 0x21, 0xa, 0x7c, 0xc2,
+ 0xf7, 0x2c, 0xc6, 0xf7, 0x1b, 0xc2, 0x1, 0xa9,
+ 0xc1, 0xf7, 0x59, 0xc0, 0xf7, 0x4b, 0xbf, 0x3,
+ 0xf7, 0xc8, 0xd3, 0x15, 0x58, 0xa4, 0xb2, 0x67,
+ 0xe0, 0x1b, 0xb6, 0xac, 0x96, 0x97, 0xaf, 0x1f,
+ 0x81, 0xc1, 0x5, 0x81, 0x6f, 0x65, 0x7f, 0x68,
+ 0x1b, 0x3f, 0x55, 0xbb, 0xf3, 0x91, 0x1f, 0xf7,
+ 0x7f, 0x6, 0xec, 0x8c, 0x82, 0xf7, 0x2c, 0xfb,
+ 0x14, 0x1b, 0x48, 0x66, 0x5a, 0x6d, 0x7d, 0x1f,
+ 0xb9, 0x76, 0x63, 0xac, 0x4b, 0x1b, 0xfb, 0x1d,
+ 0x74, 0xfb, 0x21, 0xfb, 0x3, 0xfb, 0x51, 0xf7,
+ 0x9, 0x7b, 0xad, 0xe3, 0xa9, 0xcb, 0xa3, 0x94,
+ 0x1f, 0xa6, 0xf7, 0x47, 0x15, 0xcb, 0x81, 0xba,
+ 0xcf, 0xc5, 0x1b, 0xd1, 0x9c, 0x3b, 0x57, 0x1f,
+ 0xfc, 0x45, 0x52, 0x15, 0xe3, 0x9d, 0xf3, 0xdf,
+ 0xd9, 0x9c, 0x35, 0x49, 0x47, 0x90, 0xfb, 0x12,
+ 0x24, 0x31, 0x82, 0xf7, 0x12, 0xa7, 0x1e, 0xe,
+ 0xfb, 0x2b, 0xc1, 0x1, 0xf7, 0x78, 0xcd, 0x3,
+ 0xf7, 0xb9, 0x16, 0x67, 0x7b, 0x6e, 0x6a, 0x67,
+ 0x1a, 0x61, 0xaf, 0x73, 0xb1, 0xa1, 0xa1, 0x93,
+ 0x9a, 0x9c, 0x1e, 0x93, 0xc3, 0x5, 0x7c, 0x82,
+ 0x75, 0x81, 0x79, 0x1b, 0x7b, 0x7f, 0x95, 0x9f,
+ 0xb1, 0xba, 0x9d, 0xa4, 0x96, 0x1f, 0xe, 0x63,
+ 0xa, 0x58, 0xa, 0xf7, 0x36, 0xf8, 0xe7, 0x15,
+ 0xf7, 0xa8, 0x24, 0x96, 0xaa, 0xfb, 0x93, 0xf7,
+ 0x29, 0x5, 0xfb, 0x18, 0xfc, 0x5c, 0x21, 0xa,
+ 0x8b, 0xc2, 0xf8, 0xcb, 0x77, 0x1, 0xf7, 0xa9,
+ 0xc2, 0x3, 0xea, 0x16, 0xf8, 0x2d, 0xc2, 0xfb,
+ 0x40, 0xf8, 0xcb, 0x6, 0xfb, 0x71, 0x58, 0x5,
+ 0x54, 0x7, 0xf7, 0x3a, 0xaf, 0x5, 0xfc, 0x85,
+ 0xfb, 0x4a, 0x7, 0xe, 0x5d, 0xc1, 0x5f, 0x76,
+ 0xf7, 0xd4, 0xc0, 0x7c, 0xc1, 0xf7, 0xca, 0x77,
+ 0x12, 0xf0, 0xc0, 0xf8, 0x3, 0xbe, 0x13, 0x5e,
+ 0xb9, 0x6e, 0x15, 0xb0, 0x6f, 0xf8, 0x9a, 0xf9,
+ 0x46, 0x66, 0xab, 0x5, 0xfc, 0xc8, 0xfc, 0x0,
+ 0x15, 0xf7, 0x94, 0xc1, 0x25, 0xf7, 0xc6, 0x6,
+ 0xfb, 0x25, 0x73, 0x5, 0x55, 0x7, 0xe7, 0x99,
+ 0x5, 0xfb, 0x86, 0x26, 0x7, 0xf7, 0xfa, 0xfb,
+ 0xf2, 0x15, 0x13, 0xae, 0x58, 0xf7, 0x6a, 0xc1,
+ 0xfb, 0x22, 0x7, 0xf1, 0xe5, 0xb3, 0xb0, 0xd2,
+ 0x1a, 0xc3, 0x69, 0xc1, 0x46, 0x65, 0x67, 0x78,
+ 0x69, 0x73, 0x1e, 0x4c, 0xb8, 0x7, 0xb0, 0x84,
+ 0xa9, 0xa5, 0xa9, 0x1b, 0xae, 0x9c, 0x6c, 0x69,
+ 0x59, 0x24, 0x39, 0x4f, 0x4e, 0x1f, 0xe, 0x5e,
+ 0xc1, 0x5e, 0x76, 0xf7, 0xf, 0xc3, 0xf7, 0x47,
+ 0xc1, 0xf7, 0xc6, 0x77, 0x12, 0xef, 0xbc, 0xf7,
+ 0xcc, 0xbd, 0x13, 0xbe, 0xf7, 0xd6, 0xc8, 0x15,
+ 0xf7, 0x1f, 0x57, 0x54, 0x55, 0xf7, 0x2b, 0xc1,
+ 0x5d, 0xbf, 0xb9, 0xc3, 0x5d, 0xf7, 0x55, 0x51,
+ 0x6, 0xfb, 0x17, 0xfb, 0x66, 0x5, 0xca, 0x9c,
+ 0x15, 0xd7, 0xf7, 0x8, 0x5, 0xfb, 0x8, 0x7,
+ 0xfc, 0x14, 0xfb, 0x24, 0x15, 0x13, 0x7e, 0xb3,
+ 0x6d, 0xf8, 0x77, 0xf9, 0x47, 0x63, 0x9f, 0x5,
+ 0xfc, 0xc4, 0xfb, 0xf5, 0x15, 0xf7, 0x87, 0xc1,
+ 0x2d, 0xf7, 0xc6, 0x6, 0xfb, 0x19, 0x73, 0x5,
+ 0x55, 0x7, 0xdf, 0x99, 0x5, 0xfb, 0x86, 0x27,
+ 0x7, 0xe, 0xf7, 0x8d, 0xc3, 0xf7, 0xd1, 0x77,
+ 0x68, 0xa, 0xc1, 0x3, 0xf7, 0x40, 0xf7, 0x8d,
+ 0x15, 0xf7, 0x94, 0xc3, 0x27, 0xf7, 0xd1, 0x6,
+ 0xfb, 0x25, 0x71, 0x5, 0x53, 0x7, 0xe6, 0x9a,
+ 0x5, 0xfb, 0x8e, 0x25, 0x7, 0xe, 0xf7, 0x8d,
+ 0xbf, 0xe7, 0xbe, 0xe4, 0xba, 0x1, 0xf7, 0xf1,
+ 0xb7, 0x3, 0xf7, 0xf2, 0xf7, 0x95, 0x15, 0xe8,
+ 0xc2, 0x59, 0xf7, 0x27, 0x6, 0xd6, 0x75, 0xb9,
+ 0x3e, 0x5f, 0x5b, 0x7a, 0x7c, 0x69, 0x1e, 0x96,
+ 0x5b, 0x5, 0xa8, 0xc0, 0xb0, 0x8f, 0xa8, 0x1b,
+ 0xac, 0x9d, 0x6a, 0x58, 0x1f, 0x7e, 0x7, 0x8f,
+ 0x75, 0x73, 0x8f, 0x73, 0x1b, 0x26, 0x76, 0x4a,
+ 0x69, 0x5c, 0xac, 0x5a, 0xc2, 0xb3, 0xaf, 0xa6,
+ 0xad, 0xa8, 0x1f, 0x8a, 0xcf, 0x15, 0x5f, 0x72,
+ 0x66, 0x6a, 0x64, 0x1b, 0x70, 0x76, 0x9e, 0xa4,
+ 0xa4, 0xa4, 0xa2, 0xba, 0xb1, 0xb2, 0x7c, 0x8b,
+ 0x1f, 0xe, 0xf7, 0x8d, 0xc1, 0xf7, 0x75, 0xbf,
+ 0x1, 0xf7, 0x31, 0xc2, 0xf7, 0x44, 0xc2, 0x3,
+ 0xf7, 0x31, 0xf8, 0x34, 0x15, 0xfb, 0x13, 0xed,
+ 0x63, 0xb8, 0xc3, 0xe2, 0xba, 0xf7, 0xa, 0xe5,
+ 0x55, 0xd7, 0x34, 0x4b, 0x3a, 0x59, 0xfb, 0x6,
+ 0x1e, 0xc2, 0x16, 0xc5, 0xad, 0xc1, 0xc4, 0xd1,
+ 0x9a, 0x3b, 0x6b, 0x45, 0x63, 0x60, 0x5d, 0x5f,
+ 0x5d, 0xb7, 0xd0, 0x1e, 0xe, 0x7f, 0xbd, 0x69,
+ 0x76, 0xf8, 0x33, 0xbd, 0x8e, 0x77, 0x12, 0xc8,
+ 0xbf, 0xf8, 0x0, 0xc2, 0x13, 0x6c, 0xc8, 0xa3,
+ 0x15, 0xaf, 0x62, 0xc0, 0xbe, 0x5, 0x13, 0x9c,
+ 0x69, 0xb7, 0xc1, 0x7f, 0xbe, 0x1b, 0xf7, 0x12,
+ 0xf6, 0xdd, 0xf7, 0x29, 0xbf, 0x7e, 0xbf, 0x6c,
+ 0xb1, 0x1f, 0xbd, 0xbc, 0x67, 0xb4, 0x57, 0x58,
+ 0x5, 0x13, 0xac, 0xac, 0x60, 0x57, 0x9a, 0x54,
+ 0x1b, 0xfb, 0x2d, 0x35, 0x22, 0xfb, 0x11, 0x55,
+ 0x9c, 0x54, 0xac, 0x65, 0x1f, 0xda, 0x8d, 0x15,
+ 0xf7, 0x96, 0xf7, 0x8d, 0x5, 0x98, 0x77, 0x9b,
+ 0x69, 0x4b, 0x1a, 0x50, 0x5a, 0x20, 0xfb, 0x16,
+ 0x64, 0x65, 0x99, 0xa0, 0x6c, 0x1e, 0x63, 0xb0,
+ 0x15, 0x73, 0xa7, 0x7e, 0xb3, 0xb3, 0x1a, 0xf6,
+ 0xdd, 0xd4, 0xf3, 0xa9, 0xb7, 0x7f, 0x72, 0xb0,
+ 0x1e, 0xe, 0x63, 0xa, 0xc9, 0xbd, 0x9c, 0xbc,
+ 0x12, 0xc9, 0xc5, 0xf7, 0xfa, 0xc7, 0x17, 0xf7,
+ 0x0, 0xf8, 0xa1, 0x15, 0xbb, 0x80, 0x5, 0x9a,
+ 0x8f, 0x9e, 0xbb, 0xad, 0x1b, 0xad, 0x9e, 0x76,
+ 0x79, 0xa3, 0x1f, 0x13, 0xfc, 0x7c, 0x9e, 0xa0,
+ 0x7e, 0xad, 0x1b, 0x13, 0xec, 0xc6, 0xb9, 0xbb,
+ 0xc2, 0x9d, 0x1f, 0x5c, 0x94, 0x5, 0x73, 0x82,
+ 0x70, 0x65, 0x69, 0x1b, 0x77, 0x7c, 0x94, 0x96,
+ 0x7c, 0x1f, 0x13, 0xdc, 0x9e, 0x71, 0x72, 0xa6,
+ 0x61, 0x1b, 0x5b, 0x59, 0x67, 0x4a, 0x76, 0x1f,
+ 0x5d, 0xfb, 0xc9, 0x21, 0xa, 0x66, 0xa, 0xe7,
+ 0xc2, 0xf7, 0xf1, 0xc4, 0x13, 0xdc, 0x92, 0x21,
+ 0x15, 0x58, 0xf7, 0xbd, 0xbe, 0xfb, 0x31, 0xf7,
+ 0x5f, 0x7, 0x67, 0xac, 0xc3, 0x62, 0xea, 0x1b,
+ 0xf7, 0x11, 0xec, 0xe8, 0xf7, 0x12, 0xf7, 0x4,
+ 0x2b, 0xde, 0xfb, 0xe, 0x33, 0x4d, 0x70, 0x60,
+ 0x65, 0x1f, 0x13, 0xec, 0xcc, 0xfb, 0x20, 0x58,
+ 0xe0, 0xfc, 0x78, 0x7, 0xc6, 0xf7, 0xe4, 0x15,
+ 0x13, 0xdc, 0xe4, 0xd8, 0xca, 0xeb, 0xeb, 0xd7,
+ 0x4c, 0x32, 0x32, 0x3f, 0x43, 0x2b, 0x2b, 0x3e,
+ 0xd3, 0xe4, 0x1e, 0xe, 0xf8, 0xa8, 0xa9, 0x1,
+ 0xf7, 0xd1, 0xb7, 0xd9, 0xb6, 0x3, 0xf7, 0xd1,
+ 0x3d, 0x15, 0xb7, 0xf8, 0xf6, 0xd9, 0xfc, 0xf6,
+ 0xb6, 0xf8, 0xf6, 0xbb, 0xa9, 0xfb, 0x6e, 0x6,
+ 0xfb, 0x38, 0x3c, 0x4f, 0xfb, 0xa, 0x4d, 0xc2,
+ 0x2a, 0xf7, 0x55, 0x8a, 0x1f, 0xe, 0xfb, 0x0,
+ 0xf9, 0x6e, 0x1, 0xf7, 0x6a, 0xc2, 0x3, 0xf8,
+ 0x16, 0xf9, 0x2, 0x15, 0x56, 0x6, 0x51, 0x31,
+ 0x4e, 0xfb, 0x29, 0xfb, 0x27, 0x1a, 0x26, 0xbb,
+ 0xfb, 0x1a, 0xd1, 0xfb, 0x1, 0x1e, 0xc1, 0x6,
+ 0x4e, 0xf7, 0x7, 0x53, 0xe5, 0xf7, 0x1f, 0x1a,
+ 0xf7, 0x3a, 0xd1, 0xf7, 0x1c, 0xba, 0xdf, 0x1e,
+ 0xe, 0xfb, 0x0, 0xf9, 0x6e, 0x1, 0xf7, 0xdf,
+ 0xc2, 0x3, 0xf7, 0x6a, 0xfb, 0x0, 0x15, 0xc0,
+ 0x6, 0xc5, 0xe5, 0xc8, 0xf7, 0x29, 0xf7, 0x27,
+ 0x1a, 0xf0, 0x5b, 0xf7, 0x1a, 0x45, 0xf7, 0x1,
+ 0x1e, 0x55, 0x6, 0xc8, 0xfb, 0x7, 0xc3, 0x31,
+ 0xfb, 0x1f, 0x1a, 0xfb, 0x3a, 0x45, 0xfb, 0x1c,
+ 0x5c, 0x37, 0x1e, 0xe, 0x7c, 0xc1, 0xf7, 0x22,
+ 0xc4, 0xf7, 0x20, 0xc1, 0xf7, 0x19, 0xc4, 0x12,
+ 0xf7, 0x1, 0xc3, 0xc3, 0xc3, 0xa9, 0xc2, 0xc4,
+ 0xc2, 0x17, 0xf0, 0xf7, 0x5d, 0x15, 0xf8, 0x35,
+ 0xf7, 0x3c, 0x78, 0xba, 0xfc, 0x36, 0xfb, 0x38,
+ 0x5, 0xf7, 0x58, 0xfb, 0x22, 0x65, 0xa, 0x64,
+ 0x6b, 0xab, 0xb2, 0x1e, 0x4b, 0xa, 0x53, 0xf8,
+ 0x13, 0x65, 0xa, 0x1e, 0x13, 0x3a, 0x64, 0x6b,
+ 0xab, 0xb2, 0x1f, 0x4b, 0xa, 0xe, 0x7c, 0xf7,
+ 0x10, 0x7a, 0xa, 0xb7, 0x15, 0x65, 0xab, 0x76,
+ 0xb1, 0xab, 0xb3, 0xa0, 0xb1, 0xb2, 0x6b, 0xa5,
+ 0x63, 0x65, 0x6b, 0x73, 0x62, 0x1e, 0xe, 0xf7,
+ 0x51, 0xf7, 0x1e, 0x1, 0xf7, 0x72, 0xf7, 0x30,
+ 0x3, 0xf7, 0x72, 0xf7, 0x95, 0x15, 0x69, 0xaa,
+ 0x69, 0xbc, 0xb1, 0xb1, 0xa7, 0xb2, 0xaf, 0x6d,
+ 0xae, 0x5c, 0x5f, 0x68, 0x6c, 0x64, 0x1e, 0xe,
+ 0x7c, 0xc2, 0xf7, 0x21, 0xc1, 0xf7, 0x1d, 0xc2,
+ 0xf7, 0x21, 0xc1, 0x12, 0xa4, 0xc3, 0x7d, 0xc3,
+ 0xf2, 0xc1, 0x7f, 0xc1, 0xa0, 0xc3, 0xf7, 0x25,
+ 0xc1, 0x13, 0xfa, 0xc0, 0xa4, 0xf8, 0x84, 0x15,
+ 0x49, 0xbd, 0x51, 0xd9, 0xd4, 0xc1, 0xc4, 0xcf,
+ 0xcd, 0x62, 0xc6, 0x33, 0x3e, 0x5a, 0x4f, 0x49,
+ 0x1e, 0xc3, 0x8a, 0x15, 0xb6, 0xa7, 0xa9, 0xb9,
+ 0xb8, 0xa5, 0x6a, 0x64, 0x69, 0x72, 0x68, 0x5d,
+ 0x61, 0x6b, 0xa5, 0xb5, 0x1e, 0xf7, 0x9a, 0xfc,
+ 0x15, 0x3a, 0xa, 0x13, 0xf5, 0xc0, 0xfb, 0xe0,
+ 0x8c, 0x3a, 0xa, 0x27, 0xf2, 0x15, 0x13, 0x0,
+ 0x0, 0xf8, 0x46, 0xf7, 0x47, 0x75, 0xbe, 0xfc,
+ 0x46, 0xfb, 0x47, 0x5, 0xe, 0xcc, 0x76, 0xf7,
+ 0x5a, 0xc1, 0xf7, 0x42, 0x77, 0x68, 0xa, 0xc1,
+ 0x3, 0xdb, 0xf7, 0x86, 0x15, 0xf7, 0x56, 0xfb,
+ 0x5a, 0xc1, 0xf7, 0x5a, 0xf7, 0x54, 0xc1, 0xfb,
+ 0x54, 0xf7, 0x42, 0x55, 0xfb, 0x42, 0xfb, 0x56,
+ 0x6, 0xe, 0xb7, 0xc2, 0xf7, 0x76, 0xc2, 0xf7,
+ 0x46, 0x77, 0x68, 0xa, 0xc2, 0x3, 0xf7, 0xa6,
+ 0xf7, 0x1e, 0x15, 0xc2, 0xf7, 0x4f, 0xf7, 0x4c,
+ 0xc2, 0xfb, 0x4c, 0xf7, 0x46, 0x54, 0xfb, 0x46,
+ 0xfb, 0x4f, 0x54, 0xf7, 0x4f, 0x6, 0xfb, 0x4f,
+ 0xfb, 0xad, 0x15, 0xf8, 0x3e, 0xc2, 0xfc, 0x3e,
+ 0x6, 0xe, 0x7c, 0xc2, 0xf7, 0x5c, 0xc2, 0xf7,
+ 0x68, 0xc2, 0x1, 0xf5, 0xc2, 0xf7, 0xab, 0xc2,
+ 0x3, 0xa4, 0x7c, 0x15, 0xf7, 0x6d, 0xc2, 0x3a,
+ 0xf7, 0x5c, 0xf7, 0x8, 0x6, 0xa2, 0x6d, 0xb5,
+ 0x4e, 0xb1, 0x4f, 0x47, 0x47, 0x18, 0xaf, 0x67,
+ 0xc7, 0xc7, 0x98, 0x74, 0x98, 0x77, 0x94, 0x7a,
+ 0x19, 0xf7, 0x18, 0xc2, 0x23, 0x6, 0x83, 0x97,
+ 0x83, 0x9a, 0x81, 0x9a, 0xd5, 0xd5, 0x18, 0x67,
+ 0xaf, 0x4a, 0x4a, 0x70, 0xb5, 0x6d, 0xb7, 0x74,
+ 0xa8, 0x19, 0xcf, 0x90, 0xe4, 0xac, 0xf7, 0xf,
+ 0x1a, 0xe1, 0x5b, 0xd4, 0xfb, 0xe, 0x1e, 0xfb,
+ 0xc0, 0x54, 0xdc, 0xfc, 0x67, 0x3a, 0x6, 0xf7,
+ 0x1c, 0xf7, 0x93, 0x15, 0xf7, 0x68, 0xf7, 0x26,
+ 0x7, 0xd1, 0xca, 0x72, 0x3a, 0xfb, 0x2, 0x24,
+ 0x8f, 0x42, 0x1f, 0xe, 0x66, 0xa, 0xba, 0xc4,
+ 0xf7, 0xf1, 0xc2, 0x13, 0xec, 0xf7, 0xbc, 0x21,
+ 0x15, 0x58, 0xf7, 0xbd, 0xbe, 0x36, 0xf8, 0x78,
+ 0xe0, 0xbe, 0xfb, 0x20, 0x4a, 0x7, 0x13, 0xdc,
+ 0xb6, 0x65, 0x4d, 0xa6, 0x33, 0x1b, 0xfb, 0xe,
+ 0x2b, 0x38, 0xfb, 0x4, 0xfb, 0x12, 0xec, 0x2e,
+ 0xf7, 0x11, 0xea, 0xc3, 0xb4, 0xaf, 0xac, 0x1f,
+ 0xfb, 0x5f, 0x7, 0x87, 0xf7, 0xe4, 0x15, 0x32,
+ 0x3e, 0x43, 0x2b, 0x2b, 0x3f, 0xd3, 0xe4, 0xe4,
+ 0xd7, 0xca, 0xeb, 0xeb, 0xd8, 0x4c, 0x32, 0x1e,
+ 0xe, 0x7c, 0xf7, 0xb, 0xf8, 0x34, 0xbf, 0x1,
+ 0xf7, 0xa, 0xc1, 0xaa, 0xf7, 0x19, 0xe7, 0xc0,
+ 0x3, 0xf7, 0x86, 0xf7, 0x44, 0x15, 0xc2, 0xcd,
+ 0x6, 0xcc, 0x8f, 0xf7, 0xb, 0xb3, 0xf7, 0xc,
+ 0x1a, 0xf7, 0x6, 0x2c, 0xbf, 0x27, 0x4f, 0x4d,
+ 0x79, 0x69, 0x5d, 0x1e, 0x27, 0xc1, 0xc9, 0x7,
+ 0xa7, 0xb0, 0xb4, 0x95, 0xb1, 0x1b, 0xd7, 0xcb,
+ 0x5c, 0x4a, 0x29, 0xfb, 0x5, 0x7c, 0x42, 0x7d,
+ 0x1f, 0x64, 0xfb, 0x81, 0x4c, 0xa, 0xfb, 0x31,
+ 0xc1, 0xf7, 0xb, 0x76, 0xf7, 0xd2, 0xf7, 0x9,
+ 0x1, 0xf7, 0xa, 0xc0, 0xe6, 0xf7, 0x1b, 0xa9,
+ 0xc1, 0x3, 0xf7, 0x9a, 0xf8, 0x9, 0x15, 0x6c,
+ 0xa5, 0x6e, 0xb4, 0xb1, 0xa9, 0xa5, 0xac, 0xa8,
+ 0x70, 0xa8, 0x61, 0x6a, 0x6a, 0x73, 0x6a, 0x1e,
+ 0xb4, 0xfb, 0x52, 0x15, 0x40, 0x77, 0xfb, 0x2,
+ 0x67, 0xfb, 0xb, 0x1a, 0x21, 0xea, 0x50, 0xf1,
+ 0xc6, 0xc7, 0x9b, 0x9c, 0xba, 0x1e, 0xf7, 0xb,
+ 0x55, 0x44, 0x7, 0x7b, 0x68, 0x63, 0x80, 0x63,
+ 0x1b, 0xfb, 0x5, 0x6f, 0xd3, 0xb0, 0xec, 0xf7,
+ 0x6, 0xa0, 0xd4, 0x98, 0x1f, 0xf7, 0x6, 0x54,
+ 0x7, 0xe, 0xf8, 0xc2, 0x77, 0x1, 0xf7, 0x58,
+ 0xca, 0xdc, 0xca, 0x3, 0xf7, 0x62, 0xf7, 0xc7,
+ 0x77, 0xa, 0xf7, 0x37, 0xfb, 0x8f, 0x77, 0xa,
+ 0xe, 0xfb, 0x1a, 0x6d, 0xa, 0xfb, 0x1a, 0x45,
+ 0xa, 0xf7, 0xdc, 0xf7, 0x7e, 0x8b, 0x77, 0x1,
+ 0xf7, 0x1c, 0xf7, 0xdc, 0x3, 0xf8, 0x29, 0xf7,
+ 0xdc, 0x15, 0xc6, 0x6, 0x46, 0xf7, 0x7e, 0x5,
+ 0x2e, 0x6, 0x4a, 0xfb, 0x7e, 0x15, 0xc8, 0x6,
+ 0x45, 0x5c, 0xa, 0xf7, 0xdc, 0x6d, 0xa, 0xf7,
+ 0xdc, 0x45, 0xa, 0xf7, 0xdc, 0x5f, 0xa, 0xf7,
+ 0xd6, 0xf7, 0xdc, 0x15, 0xc6, 0x6, 0x44, 0x5c,
+ 0xa, 0xf7, 0xdc, 0x5f, 0xa, 0xf7, 0x6e, 0xf7,
+ 0xdc, 0x15, 0xc6, 0x6, 0xf3, 0x5c, 0xa, 0xfb,
+ 0x1a, 0x5f, 0xa, 0xf7, 0x6e, 0xfb, 0x1a, 0x15,
+ 0xc6, 0x6, 0xf3, 0x5c, 0xa, 0xf8, 0xc6, 0x77,
+ 0x1, 0xf7, 0x97, 0xdd, 0x3, 0xf7, 0xae, 0xf7,
+ 0xc7, 0x15, 0xae, 0x6, 0xa3, 0xf7, 0x93, 0x5,
+ 0x39, 0x6, 0xe, 0x8b, 0xc1, 0xf7, 0xd4, 0xc1,
+ 0x63, 0xc0, 0x12, 0xbd, 0xf7, 0x4a, 0x54, 0xc2,
+ 0x13, 0xb0, 0xbd, 0x16, 0xf8, 0xf, 0xc1, 0xfb,
+ 0x59, 0xf7, 0x51, 0x6, 0xf1, 0xf7, 0x2, 0xc2,
+ 0xb6, 0xb6, 0x1b, 0xa4, 0x9e, 0x85, 0x69, 0x92,
+ 0x1f, 0xc5, 0x90, 0x5, 0xbf, 0x88, 0x6a, 0xaf,
+ 0x54, 0x1b, 0x2c, 0x3f, 0x36, 0x57, 0x54, 0x1f,
+ 0x13, 0xd0, 0xf7, 0x10, 0xfb, 0x4a, 0x55, 0x7,
+ 0x13, 0xc8, 0xf7, 0x13, 0xfb, 0xd4, 0x6, 0x13,
+ 0xd0, 0xfb, 0x13, 0x6, 0xe, 0x79, 0xb9, 0xf8,
+ 0x7, 0xba, 0xe4, 0xb8, 0x1, 0x8b, 0xb9, 0xf7,
+ 0x2f, 0xbb, 0xf7, 0xd, 0xbe, 0xf7, 0x17, 0xbb,
+ 0x3, 0xf7, 0xaa, 0x4, 0xfb, 0x37, 0xf7, 0x1c,
+ 0xfb, 0x19, 0xf7, 0x3b, 0xf7, 0x36, 0xf7, 0x1b,
+ 0xf7, 0x14, 0xf7, 0x43, 0xf7, 0x3b, 0xfb, 0x1e,
+ 0xf7, 0x14, 0xfb, 0x33, 0xfb, 0x2f, 0xfb, 0x28,
+ 0xfb, 0xc, 0xfb, 0x4a, 0x1e, 0xb9, 0x8d, 0x15,
+ 0xf7, 0x16, 0xf1, 0xf7, 0x11, 0xf7, 0x30, 0xf7,
+ 0x22, 0xf5, 0xfb, 0x8, 0xfb, 0x1d, 0xfb, 0x22,
+ 0xfb, 0x1, 0xfb, 0x4, 0xfb, 0x21, 0xfb, 0x1b,
+ 0xfb, 0xd, 0xf7, 0x2, 0xf7, 0x22, 0x1e, 0xf7,
+ 0x2f, 0xfb, 0x30, 0x15, 0xbb, 0xf7, 0xe, 0xc0,
+ 0x6, 0xd4, 0xfb, 0xe, 0x5, 0xc6, 0x6, 0x3d,
+ 0xf7, 0x1a, 0x5, 0xb1, 0x99, 0xa6, 0xba, 0xae,
+ 0x1a, 0xd1, 0x4f, 0xa1, 0x52, 0x1e, 0x24, 0x6,
+ 0xbb, 0xfb, 0x2d, 0x15, 0xf5, 0xc1, 0x7, 0xb8,
+ 0xa1, 0x71, 0x74, 0x65, 0x67, 0x78, 0x6d, 0x1f,
+ 0xe, 0xf8, 0x63, 0xbd, 0xab, 0x8b, 0xab, 0xbd,
+ 0x1, 0xf7, 0x6e, 0xbd, 0xcb, 0xbd, 0x14, 0xe0,
+ 0xf7, 0x6e, 0xf8, 0xb5, 0x15, 0x5d, 0xaf, 0x67,
+ 0xb9, 0xb9, 0xaf, 0xaf, 0xb9, 0xb9, 0x67, 0xaf,
+ 0x5d, 0x5d, 0x67, 0x67, 0x5d, 0x1e, 0xbd, 0x16,
+ 0x9d, 0x99, 0x99, 0x9d, 0x9d, 0x99, 0x7d, 0x79,
+ 0x79, 0x7d, 0x7d, 0x79, 0x79, 0x7d, 0x99, 0x9d,
+ 0x1e, 0xe, 0x7e, 0xc2, 0xf7, 0x2b, 0xc0, 0xf7,
+ 0x20, 0xc2, 0x12, 0xdf, 0xc2, 0x5a, 0xc1, 0xf7,
+ 0xba, 0xc1, 0x69, 0xc5, 0x13, 0xf4, 0xdf, 0x7f,
+ 0x15, 0xc2, 0xb8, 0x6, 0x74, 0xbc, 0xc5, 0x75,
+ 0xdb, 0x1b, 0x13, 0xea, 0xf7, 0x3, 0xda, 0xc4,
+ 0xe1, 0xf7, 0xb, 0xfb, 0x28, 0x80, 0x32, 0x92,
+ 0x1f, 0x5f, 0x8e, 0x30, 0x99, 0xc1, 0x1a, 0xc9,
+ 0xee, 0x92, 0xb6, 0xc2, 0xc2, 0x7a, 0x70, 0xb5,
+ 0x1e, 0x50, 0xc1, 0xf7, 0x32, 0x55, 0x63, 0x7,
+ 0xa6, 0x5e, 0x55, 0x98, 0x53, 0x1b, 0xfb, 0x2,
+ 0x38, 0x5c, 0x35, 0x33, 0xf7, 0xc, 0x72, 0xce,
+ 0x89, 0x1f, 0xc1, 0x89, 0xf7, 0x13, 0x85, 0x4f,
+ 0x1a, 0x45, 0x20, 0x7f, 0x66, 0x4c, 0x4b, 0x9e,
+ 0xb0, 0x5b, 0x1e, 0xc6, 0x54, 0x7, 0xe, 0x7c,
+ 0xc2, 0x8b, 0xf7, 0x27, 0x8b, 0xc1, 0x8b, 0xf7,
+ 0x2b, 0x8b, 0xc2, 0x8b, 0xb7, 0x12, 0xde, 0xc3,
+ 0xf7, 0xbd, 0xc2, 0x17, 0xf7, 0x96, 0xf8, 0x7f,
+ 0x15, 0xdd, 0x6, 0xf7, 0x2a, 0xf7, 0x32, 0x60,
+ 0x9f, 0xfb, 0x28, 0xfb, 0xe, 0xfb, 0x2d, 0xf7,
+ 0xd, 0x61, 0x77, 0x5, 0x76, 0xfd, 0x2b, 0x15,
+ 0xc3, 0xc2, 0x6, 0x74, 0xbd, 0xbe, 0x6b, 0xdd,
+ 0x1b, 0xf7, 0x5, 0xdc, 0xc4, 0xe2, 0xdf, 0x3f,
+ 0xa2, 0x44, 0x90, 0x1f, 0x44, 0x90, 0xfb, 0x2c,
+ 0x7b, 0xe1, 0x1a, 0xca, 0xe6, 0x98, 0xb7, 0x1e,
+ 0x13, 0xef, 0xc3, 0xc3, 0x70, 0x70, 0xb6, 0x1f,
+ 0x59, 0xc2, 0xf7, 0x33, 0x54, 0x59, 0x7, 0xa6,
+ 0x5d, 0x54, 0xa2, 0x51, 0x1b, 0xfb, 0x4, 0x41,
+ 0x56, 0x34, 0xfb, 0xa, 0xf7, 0x2a, 0x8c, 0xdd,
+ 0x88, 0x1f, 0xbc, 0x89, 0xdf, 0x91, 0x47, 0x1a,
+ 0x40, 0xfb, 0x1, 0x83, 0x65, 0x4b, 0x52, 0xa9,
+ 0xb0, 0x5a, 0x1e, 0xbc, 0x53, 0x7, 0xe, 0xfb,
+ 0x2b, 0xf7, 0x5a, 0x56, 0xc0, 0xf7, 0x22, 0xbd,
+ 0xf7, 0x29, 0xc0, 0x12, 0xde, 0xc3, 0x5a, 0xc2,
+ 0xf7, 0xb6, 0xc3, 0x6c, 0xc3, 0x13, 0x7a, 0xde,
+ 0x85, 0x15, 0xc3, 0xc0, 0x6, 0xb3, 0x78, 0xb3,
+ 0x73, 0xc4, 0x83, 0x89, 0x4a, 0x18, 0x8e, 0x92,
+ 0x95, 0x8c, 0x95, 0x1b, 0x98, 0x96, 0x84, 0x7e,
+ 0x7b, 0x7c, 0x82, 0x7a, 0x7d, 0x7d, 0x8e, 0x94,
+ 0x81, 0x1f, 0x7d, 0x68, 0x5, 0x13, 0xba, 0x7f,
+ 0x9b, 0xa0, 0x85, 0x9e, 0x1b, 0xb1, 0xae, 0xab,
+ 0xb3, 0xad, 0x73, 0x9e, 0x77, 0x8c, 0x1f, 0x13,
+ 0x75, 0x9e, 0x7, 0xf7, 0x3, 0x8c, 0xda, 0xb4,
+ 0xde, 0x1a, 0xdc, 0x4f, 0xae, 0x43, 0x8f, 0x1e,
+ 0x45, 0x90, 0xfb, 0x3d, 0x85, 0xde, 0x1a, 0xc8,
+ 0xe6, 0x91, 0xb7, 0x1e, 0x13, 0xb6, 0xc4, 0xc2,
+ 0x70, 0x70, 0xb6, 0x1f, 0x5c, 0xc3, 0xf7, 0x2e,
+ 0x53, 0x5b, 0x7, 0xa5, 0x5d, 0x55, 0xa1, 0x50,
+ 0x1b, 0xfb, 0x4, 0x41, 0x5d, 0x38, 0xfb, 0x7,
+ 0xf7, 0x2e, 0x86, 0xdd, 0x88, 0x1f, 0x13, 0xb9,
+ 0xbd, 0x89, 0xdf, 0x83, 0x48, 0x1a, 0x44, 0xfb,
+ 0x5, 0x91, 0x65, 0x4a, 0x53, 0xa7, 0xaf, 0x5a,
+ 0x1e, 0xb1, 0x53, 0x7, 0xe, 0x3e, 0xc0, 0xf8,
+ 0xa3, 0xc0, 0x1, 0xf7, 0x16, 0xc0, 0xf7, 0x74,
+ 0xc0, 0x3, 0xf7, 0x16, 0xdd, 0x15, 0xfb, 0x33,
+ 0xf7, 0x53, 0x7, 0xa5, 0xa7, 0x8c, 0x8f, 0xa0,
+ 0x1f, 0xa5, 0x91, 0xac, 0x9e, 0xb7, 0x1a, 0xa7,
+ 0x7a, 0xa7, 0x74, 0x9e, 0x1e, 0x8b, 0x7c, 0x96,
+ 0x84, 0x92, 0x1e, 0xe3, 0x9e, 0x8c, 0xc6, 0xa2,
+ 0x1a, 0x8c, 0x7, 0xad, 0x72, 0xa6, 0x71, 0x9f,
+ 0x1e, 0xfb, 0x67, 0xf7, 0x33, 0x5, 0x74, 0x9d,
+ 0x84, 0x93, 0x96, 0x1a, 0xa9, 0xae, 0x8f, 0x9f,
+ 0x1e, 0xf7, 0x36, 0x21, 0xc0, 0xf7, 0x33, 0xfb,
+ 0x47, 0x6, 0x69, 0x68, 0x8a, 0x81, 0x6e, 0x1f,
+ 0x6e, 0x82, 0x7a, 0x70, 0x6d, 0x1a, 0x6c, 0x9f,
+ 0x76, 0xa1, 0x77, 0x1e, 0x9e, 0x7a, 0x5, 0x6d,
+ 0x83, 0x59, 0x6b, 0x52, 0x1a, 0x69, 0x9e, 0x6d,
+ 0xa3, 0x79, 0x1e, 0xf7, 0x65, 0xfb, 0x32, 0x5,
+ 0xa8, 0x76, 0x8e, 0x7d, 0x80, 0x1a, 0x81, 0x86,
+ 0x76, 0x6a, 0x1e, 0xfb, 0x49, 0xf5, 0x6, 0xf7,
+ 0x3f, 0xbb, 0x15, 0xfb, 0x2c, 0xf7, 0x6, 0x5,
+ 0x7d, 0x96, 0x7a, 0x9b, 0xa0, 0x1a, 0xb0, 0xb5,
+ 0xa2, 0xa5, 0x1e, 0xf7, 0x31, 0xfb, 0x5, 0x5,
+ 0x9b, 0x7e, 0x9f, 0x7a, 0x75, 0x1a, 0x7c, 0x80,
+ 0x61, 0x48, 0x1e, 0xe, 0xa8, 0x76, 0xf7, 0x8e,
+ 0xf7, 0x15, 0x8b, 0xf7, 0xb, 0x1, 0xf7, 0x99,
+ 0xf7, 0x19, 0x3, 0xf7, 0x61, 0x93, 0x15, 0xcb,
+ 0x6, 0xf1, 0xf7, 0x8e, 0x5, 0x2b, 0x6, 0x7d,
+ 0xf7, 0x50, 0x4c, 0xa, 0xa0, 0x76, 0xf8, 0xbb,
+ 0xc3, 0x1, 0xee, 0xc3, 0x3, 0xf7, 0x8a, 0x16,
+ 0xc8, 0x6, 0xf7, 0x55, 0xf8, 0xb8, 0x5, 0xc6,
+ 0xfc, 0x25, 0xfb, 0x28, 0xc3, 0xe7, 0xf7, 0xb3,
+ 0x7, 0xe, 0x7c, 0xc6, 0xf7, 0xa9, 0xc9, 0xf7,
+ 0x4a, 0xc4, 0x1, 0xf1, 0xc5, 0xf7, 0xaa, 0xc7,
+ 0x3, 0xf7, 0x34, 0xf7, 0xbd, 0x15, 0xf7, 0x72,
+ 0xf7, 0x39, 0xb9, 0xf7, 0x37, 0x1e, 0xc4, 0x7,
+ 0xfb, 0x8d, 0xfb, 0x1d, 0x38, 0xfb, 0x9a, 0xfb,
+ 0x62, 0xe8, 0x35, 0xf7, 0x6, 0xf3, 0xe0, 0xef,
+ 0xf6, 0xee, 0x42, 0xe7, 0xfb, 0x2, 0x3d, 0x5b,
+ 0x5d, 0x63, 0x6e, 0x1f, 0x8e, 0x39, 0x15, 0xc2,
+ 0xa6, 0xbe, 0xbe, 0xcc, 0x1b, 0xd3, 0xc7, 0x56,
+ 0x3d, 0x51, 0x62, 0x33, 0x2c, 0x34, 0x5b, 0xe9,
+ 0xd8, 0x87, 0x1f, 0xe, 0x3b, 0xf9, 0x59, 0x1,
+ 0xf7, 0x11, 0xf7, 0xf2, 0x3, 0xf7, 0x11, 0x4d,
+ 0x15, 0xb3, 0x79, 0xf7, 0xca, 0xf9, 0x46, 0x63,
+ 0x9e, 0x5, 0xe, 0xe, 0x76, 0xc5, 0x70, 0xc4,
+ 0xf7, 0x64, 0xc5, 0xf7, 0x71, 0xc4, 0x12, 0xf7,
+ 0x25, 0xc1, 0x89, 0xc0, 0x13, 0xb8, 0xf7, 0xa,
+ 0xaa, 0x15, 0xa3, 0x57, 0x5, 0x13, 0x78, 0xa4,
+ 0xc3, 0xb5, 0x91, 0xad, 0x1b, 0x13, 0xb8, 0xc8,
+ 0xae, 0x6c, 0xae, 0x1b, 0xb6, 0xb2, 0x9d, 0xa6,
+ 0xaa, 0x1f, 0x76, 0xb9, 0x5, 0x7f, 0x7a, 0x6e,
+ 0x76, 0x68, 0x1b, 0x13, 0x74, 0x6e, 0x8a, 0x5f,
+ 0xa9, 0x50, 0x8c, 0x8, 0x6e, 0x69, 0x86, 0x77,
+ 0x66, 0x1f, 0x88, 0x6, 0xb6, 0xc1, 0xa3, 0xb7,
+ 0x8d, 0xb8, 0x8c, 0xa8, 0x88, 0xa8, 0x81, 0xab,
+ 0x8, 0xf7, 0x61, 0xc5, 0xfb, 0x73, 0x6, 0x13,
+ 0xb8, 0x80, 0xa3, 0x81, 0xbb, 0xa2, 0x1a, 0xdd,
+ 0xbf, 0xb7, 0xd8, 0xbe, 0xb9, 0x67, 0x5a, 0xa4,
+ 0x1e, 0xc0, 0xa9, 0x5, 0xc3, 0x70, 0x52, 0xc3,
+ 0x31, 0x1b, 0xfb, 0xb, 0x4a, 0x38, 0x2f, 0x69,
+ 0x93, 0x67, 0x9c, 0x6a, 0x1f, 0x32, 0x51, 0xf4,
+ 0x6, 0x13, 0xb4, 0x93, 0x73, 0x8e, 0x73, 0x74,
+ 0x1a, 0x48, 0x6d, 0x51, 0x5a, 0x5b, 0x1e, 0xe,
+ 0x7c, 0xc2, 0xf7, 0xe4, 0xc2, 0xf7, 0x16, 0x77,
+ 0x1, 0xf7, 0x2a, 0xc1, 0x3, 0xd9, 0xf8, 0xc,
+ 0x15, 0xd3, 0xfb, 0x98, 0x6, 0xfb, 0x5, 0xf7,
+ 0x0, 0x79, 0xbf, 0xd5, 0xd5, 0xa8, 0xa6, 0xca,
+ 0x1e, 0x85, 0xc1, 0x5, 0x77, 0x57, 0x41, 0x68,
+ 0x47, 0x1b, 0x3f, 0x62, 0x9d, 0xdd, 0x1f, 0xf7,
+ 0x80, 0xf7, 0x8c, 0xc2, 0xfb, 0x8c, 0xf7, 0x16,
+ 0x55, 0xfb, 0x16, 0x43, 0x7, 0xe, 0xfb, 0x31,
+ 0xc0, 0xf7, 0x16, 0xc1, 0xf7, 0xe1, 0xc1, 0xf7,
+ 0x1, 0xc0, 0x1, 0xf6, 0xc3, 0xf7, 0xfb, 0xc5,
+ 0x3, 0x9e, 0x23, 0x15, 0x56, 0xf7, 0xc5, 0xc0,
+ 0xfb, 0x35, 0xf7, 0x65, 0x7, 0x64, 0xab, 0xc6,
+ 0x63, 0xea, 0x1b, 0xf7, 0x14, 0xf2, 0xea, 0xf7,
+ 0x15, 0xf7, 0x14, 0xfb, 0x2, 0xe4, 0xfb, 0x8,
+ 0x31, 0x4b, 0x67, 0x5e, 0x66, 0x1f, 0xf7, 0x87,
+ 0xfb, 0x24, 0x56, 0xe3, 0xfd, 0x3c, 0x7, 0xc6,
+ 0xf7, 0xf4, 0x15, 0xe2, 0xd0, 0xd9, 0xf7, 0x4,
+ 0xf7, 0x1e, 0xb0, 0xfb, 0x1, 0x54, 0x21, 0x45,
+ 0x4c, 0x20, 0x2a, 0x39, 0xcf, 0xef, 0x1e, 0xe,
+ 0x7c, 0xbf, 0xf7, 0x7e, 0xc6, 0xf7, 0x7c, 0xc7,
+ 0x12, 0xf8, 0x2b, 0xc9, 0x6b, 0xc5, 0x13, 0xe8,
+ 0xf3, 0xa6, 0x15, 0x70, 0xbc, 0xcd, 0x7c, 0xca,
+ 0x1b, 0xf7, 0x2, 0xf2, 0xbb, 0xf7, 0x11, 0xf7,
+ 0x1, 0x33, 0xae, 0x65, 0x91, 0x1f, 0x13, 0xf0,
+ 0xb6, 0x9e, 0xc4, 0xc8, 0xd6, 0x1a, 0xf7, 0x3,
+ 0x31, 0xbb, 0x32, 0x4d, 0x4a, 0x70, 0x67, 0x5a,
+ 0x1e, 0xa8, 0x58, 0x5, 0xae, 0xb4, 0xc0, 0x9e,
+ 0xba, 0x1b, 0xcd, 0xc4, 0x74, 0x3d, 0x55, 0x49,
+ 0x3e, 0x30, 0x1f, 0x88, 0x50, 0x6, 0x13, 0xe8,
+ 0xd2, 0x8a, 0xf7, 0xb, 0x79, 0x2f, 0x1a, 0x35,
+ 0x42, 0x66, 0x3a, 0x53, 0x4f, 0x9c, 0xa9, 0x61,
+ 0x1e, 0xe, 0x62, 0xc2, 0x5a, 0x76, 0xf7, 0xd,
+ 0xc1, 0xf7, 0x47, 0xc2, 0xf7, 0x99, 0xbf, 0x12,
+ 0xf7, 0x44, 0xc1, 0x6a, 0xbf, 0xf7, 0x64, 0xbf,
+ 0x13, 0xbd, 0xf7, 0xca, 0xcc, 0x15, 0xf7, 0x27,
+ 0x58, 0x50, 0x54, 0xf7, 0x34, 0xc2, 0x5a, 0xbe,
+ 0xbc, 0xc1, 0x5a, 0xf7, 0x56, 0x4e, 0x6, 0xfb,
+ 0x1e, 0xfb, 0x65, 0x5, 0xce, 0x9a, 0x15, 0xdb,
+ 0xf7, 0x8, 0x5, 0xfb, 0x8, 0x7, 0xfc, 0x32,
+ 0xfb, 0x24, 0x15, 0x13, 0x7b, 0xb6, 0x6c, 0xf8,
+ 0x8e, 0xf9, 0x47, 0x60, 0xaa, 0x5, 0xfc, 0xb2,
+ 0xfb, 0xe7, 0x15, 0x7c, 0xa8, 0xbb, 0x7d, 0xb3,
+ 0x1b, 0xca, 0xc9, 0xb3, 0xce, 0xc0, 0x74, 0x9d,
+ 0x6f, 0x99, 0x1f, 0x13, 0xbd, 0xa0, 0x9d, 0x96,
+ 0x9f, 0xad, 0x1a, 0xcb, 0x5d, 0xb3, 0x4e, 0x63,
+ 0x61, 0x7b, 0x75, 0x6d, 0x1e, 0x9f, 0x57, 0x5,
+ 0xa2, 0x9b, 0xb5, 0x9a, 0xae, 0x1b, 0xa7, 0xa3,
+ 0x7b, 0x68, 0x69, 0x72, 0x74, 0x47, 0x8d, 0x1f,
+ 0x56, 0x7, 0x13, 0xbb, 0xbb, 0xcd, 0x8b, 0x59,
+ 0x68, 0x67, 0x7a, 0x63, 0x65, 0x61, 0x94, 0xa0,
+ 0x77, 0x1f, 0xe, 0xf7, 0x84, 0xc2, 0xf7, 0xa3,
+ 0xc3, 0x12, 0xf7, 0xf3, 0xc3, 0x63, 0xc5, 0x13,
+ 0xd0, 0xf7, 0x42, 0xf7, 0xa2, 0x15, 0x7c, 0xaa,
+ 0xbd, 0x7c, 0xb4, 0x1b, 0xcc, 0xcb, 0xb3, 0xd2,
+ 0xc2, 0x73, 0x9d, 0x6f, 0x99, 0x1f, 0x13, 0xe0,
+ 0xa5, 0xa2, 0x93, 0xab, 0xaa, 0x1a, 0xbe, 0x60,
+ 0xba, 0x48, 0x60, 0x5e, 0x7a, 0x73, 0x6b, 0x1e,
+ 0xa2, 0x5d, 0x5, 0xa0, 0xa4, 0xb4, 0x95, 0xa7,
+ 0x1b, 0xaa, 0xa5, 0x7b, 0x67, 0x69, 0x6f, 0x72,
+ 0x45, 0x8d, 0x1f, 0x55, 0x7, 0x13, 0xd0, 0xbd,
+ 0x8c, 0xcb, 0x88, 0x59, 0x1a, 0x63, 0x67, 0x7b,
+ 0x61, 0x66, 0x62, 0x97, 0x9f, 0x75, 0x1e, 0xe,
+ 0xf8, 0x7d, 0xbc, 0x9d, 0xbd, 0x1, 0xf0, 0xf8,
+ 0x8c, 0x15, 0xbe, 0x80, 0x5, 0x99, 0x8f, 0xa4,
+ 0xbc, 0xaf, 0x1b, 0xa9, 0x9d, 0x77, 0x79, 0xa3,
+ 0x1f, 0x7c, 0x9f, 0xa2, 0x7d, 0xb1, 0x1b, 0xc9,
+ 0xbb, 0xba, 0xc3, 0x9e, 0x1f, 0x59, 0x95, 0x82,
+ 0x72, 0x6e, 0x65, 0x62, 0x8a, 0x19, 0x73, 0x7a,
+ 0x97, 0x99, 0x7a, 0x1f, 0x9e, 0x74, 0x74, 0xa2,
+ 0x63, 0x1b, 0x58, 0x57, 0x66, 0x4a, 0x75, 0x1f,
+ 0xe, 0xf7, 0xb0, 0x76, 0xf7, 0x93, 0xb7, 0x1,
+ 0xf7, 0x10, 0xb8, 0xf7, 0x3, 0xb7, 0xf7, 0x4a,
+ 0xb7, 0x3, 0xf7, 0xac, 0xf7, 0x9b, 0x15, 0xb7,
+ 0xf7, 0x98, 0x6, 0xcb, 0xfb, 0x98, 0x5, 0xc4,
+ 0x6, 0xc8, 0xf7, 0x97, 0x5, 0xfb, 0x97, 0xb7,
+ 0xf7, 0xbf, 0x39, 0x7, 0x56, 0xfb, 0x7c, 0x55,
+ 0xf7, 0x7c, 0x5, 0x3a, 0x6, 0xfb, 0x30, 0xfb,
+ 0xbf, 0x15, 0xb8, 0xf7, 0x93, 0xd7, 0xb7, 0xfb,
+ 0x58, 0x5f, 0xd6, 0x6, 0xe, 0x8b, 0xc2, 0xf8,
+ 0x1f, 0x77, 0xf7, 0x1a, 0xc5, 0x1, 0xf8, 0x4c,
+ 0xc7, 0x3, 0xee, 0x16, 0xf8, 0x25, 0xf7, 0x24,
+ 0x51, 0x32, 0xfb, 0x9d, 0x6, 0xf7, 0x6d, 0xf7,
+ 0x44, 0xf5, 0xde, 0xf7, 0x4, 0x1a, 0xf7, 0x17,
+ 0x3b, 0xcc, 0xfb, 0x1, 0x37, 0x4b, 0x66, 0x3f,
+ 0x61, 0x1e, 0x50, 0xc1, 0x7, 0xd2, 0xc4, 0xb6,
+ 0xd9, 0xdd, 0xbb, 0x5d, 0x2f, 0x3f, 0x2f, 0x3f,
+ 0x6e, 0x72, 0x1e, 0x42, 0x4c, 0x41, 0x46, 0x42,
+ 0x4d, 0x8, 0xe, 0xf7, 0x8d, 0xc2, 0xf7, 0x9c,
+ 0xc1, 0x1, 0xf7, 0x53, 0xbf, 0xf7, 0x14, 0xbf,
+ 0x3, 0xf7, 0x44, 0xf7, 0x8d, 0x15, 0xf7, 0x8b,
+ 0xc2, 0xfb, 0x38, 0x6, 0xf7, 0x9, 0xe8, 0xba,
+ 0xb3, 0xd3, 0x1a, 0xc5, 0x64, 0xc2, 0x3b, 0x60,
+ 0x5c, 0x80, 0x4a, 0x74, 0x1e, 0x55, 0xbf, 0x7,
+ 0xc3, 0x83, 0xb0, 0x9f, 0xab, 0x1b, 0xb5, 0xa4,
+ 0x6b, 0x68, 0x55, 0xfb, 0x1f, 0x26, 0x53, 0x5e,
+ 0x1f, 0xe, 0x7c, 0xc0, 0x62, 0xc1, 0xf7, 0xd5,
+ 0xc1, 0x12, 0xf7, 0x4, 0xc0, 0xf7, 0xa2, 0xc0,
+ 0x13, 0xb8, 0xa8, 0xf8, 0x8, 0x15, 0xde, 0xfb,
+ 0x8b, 0x6, 0x31, 0xcf, 0x59, 0xe3, 0xb2, 0xbf,
+ 0x9b, 0xd3, 0xd7, 0x1e, 0x13, 0x78, 0x3f, 0xf7,
+ 0x1b, 0xc1, 0x39, 0xf8, 0xb, 0xfb, 0x1c, 0x55,
+ 0xde, 0xfb, 0x71, 0x7, 0x13, 0xb8, 0x5a, 0x62,
+ 0x54, 0x4b, 0x4f, 0x1b, 0x42, 0x62, 0xb5, 0xd3,
+ 0x1f, 0xf7, 0xa6, 0xfb, 0x1c, 0x7, 0xe, 0x3f,
+ 0xa, 0xf7, 0x41, 0xf8, 0x82, 0x15, 0xf7, 0xb3,
+ 0xf3, 0x6a, 0xd5, 0xfb, 0x9e, 0xfb, 0x26, 0x5,
+ 0xfb, 0x18, 0xfb, 0x25, 0x2b, 0xa, 0x3f, 0xa,
+ 0xf7, 0x0, 0xf8, 0x8f, 0x15, 0xb3, 0x79, 0xf7,
+ 0x27, 0xf7, 0xb, 0xf7, 0x26, 0xfb, 0xb, 0xb4,
+ 0x9d, 0xfb, 0x27, 0xf7, 0x31, 0x5, 0x3c, 0x6,
+ 0xfb, 0x77, 0xfb, 0xaf, 0x2b, 0xa, 0x7c, 0xc1,
+ 0x61, 0x67, 0xa, 0xe7, 0xf7, 0x9, 0x12, 0xf7,
+ 0x4, 0xc0, 0x94, 0xe0, 0xca, 0xdc, 0xaa, 0xc0,
+ 0x13, 0xbf, 0xf7, 0xd6, 0xf8, 0xa4, 0x72, 0xa,
+ 0xfb, 0x28, 0xfb, 0x9, 0x15, 0xe0, 0xf7, 0x9,
+ 0x36, 0x6, 0xfb, 0x25, 0xfb, 0x9c, 0x38, 0xa,
+ 0x13, 0x7f, 0x3b, 0xa, 0x13, 0xbf, 0x33, 0xa,
+ 0x3f, 0xa, 0xf7, 0x2c, 0xf8, 0xe8, 0x15, 0xf7,
+ 0xb3, 0x24, 0x96, 0xaa, 0xfb, 0x9c, 0xf7, 0x28,
+ 0x5, 0xfb, 0x31, 0xfb, 0xb7, 0x2b, 0xa, 0xfb,
+ 0x11, 0xbd, 0x1, 0x8b, 0xf8, 0xec, 0x3, 0x40,
+ 0x4, 0x59, 0xf8, 0xec, 0xbd, 0x7, 0xe, 0x96,
+ 0x76, 0xf8, 0x11, 0xc2, 0x1, 0x9a, 0xf7, 0x68,
+ 0xf7, 0x25, 0xf7, 0x69, 0x3, 0xf7, 0x9e, 0x81,
+ 0x15, 0xcc, 0x6, 0xf7, 0x45, 0xf8, 0x11, 0x5,
+ 0xd8, 0xc2, 0xfb, 0x69, 0x54, 0xd5, 0x6, 0xfb,
+ 0x27, 0xfb, 0xd1, 0xfb, 0x28, 0xf7, 0xd1, 0x5,
+ 0xd7, 0xc2, 0xfb, 0x68, 0x54, 0xd4, 0x6, 0xe,
+ 0x96, 0x76, 0xf8, 0x11, 0xc2, 0x1, 0x98, 0xf7,
+ 0x39, 0xf7, 0x8c, 0xf7, 0x34, 0x3, 0xf7, 0x31,
+ 0x81, 0x15, 0xca, 0x6, 0xdc, 0xf7, 0x9b, 0xdb,
+ 0xfb, 0x9b, 0x5, 0xc9, 0x6, 0xf6, 0xf8, 0x11,
+ 0x5, 0xaf, 0xc2, 0xfb, 0x34, 0x54, 0xce, 0x6,
+ 0x39, 0xfb, 0xc4, 0x34, 0xf7, 0xb0, 0x5, 0x5c,
+ 0x6, 0x35, 0xfb, 0xae, 0x33, 0xf7, 0xc2, 0x5,
+ 0xd6, 0xc2, 0xfb, 0x39, 0x54, 0xad, 0x6, 0xe,
+ 0x74, 0xa, 0xb0, 0xf7, 0x5b, 0xf7, 0x18, 0xf7,
+ 0x50, 0x3, 0x9f, 0x16, 0xf7, 0x6d, 0xc1, 0x43,
+ 0x6, 0xf7, 0x1a, 0xf7, 0x1b, 0xf7, 0x1a, 0xfb,
+ 0x1b, 0x5, 0x43, 0x55, 0xf7, 0x6f, 0xc1, 0x3f,
+ 0x6, 0xfb, 0x40, 0xf7, 0x3e, 0xf7, 0x28, 0xf7,
+ 0x28, 0x5, 0xd7, 0xc1, 0xfb, 0x50, 0x55, 0xb6,
+ 0x6, 0xfb, 0x5, 0xfb, 0x5, 0xfb, 0x4, 0xf7,
+ 0x5, 0x5, 0xbd, 0xc1, 0xfb, 0x5b, 0x55, 0xdb,
+ 0x6, 0xf7, 0x28, 0xfb, 0x27, 0xfb, 0x40, 0xfb,
+ 0x3f, 0x5, 0x42, 0x6, 0xe, 0xfb, 0x31, 0xbe,
+ 0xf8, 0x75, 0xbe, 0x6a, 0xa, 0x13, 0xe8, 0x13,
+ 0xd8, 0xc0, 0x21, 0x15, 0x58, 0xf7, 0x9a, 0xbe,
+ 0x32, 0x7, 0xf7, 0xc1, 0xf8, 0x75, 0x5, 0xcc,
+ 0xbe, 0xfb, 0x4b, 0x58, 0xc4, 0x6, 0xfb, 0x3d,
+ 0xfb, 0xa1, 0xfb, 0x34, 0xf7, 0xa1, 0x5, 0xcd,
+ 0xbe, 0xfb, 0x58, 0x58, 0xd0, 0x6, 0xf7, 0x53,
+ 0xfb, 0xd3, 0x25, 0xfb, 0x36, 0x5, 0xe, 0xfb,
+ 0x31, 0xc0, 0xf8, 0x87, 0xc0, 0x6a, 0xa, 0x13,
+ 0xd8, 0xf7, 0x3e, 0xf8, 0x89, 0x15, 0xf7, 0xbc,
+ 0xee, 0x69, 0xd3, 0xfb, 0xa6, 0xfb, 0x21, 0x5,
+ 0x22, 0xfd, 0xf, 0x15, 0x56, 0xf7, 0x9a, 0xc0,
+ 0x32, 0x7, 0xf7, 0xc1, 0xf8, 0x87, 0x5, 0xcc,
+ 0xc0, 0xfb, 0x4b, 0x56, 0xc4, 0x6, 0xfb, 0x3c,
+ 0xfb, 0xab, 0xfb, 0x35, 0xf7, 0xab, 0x5, 0x13,
+ 0xe8, 0xcd, 0xc0, 0xfb, 0x58, 0x56, 0xd0, 0x6,
+ 0xf7, 0x54, 0xfb, 0xe0, 0x24, 0xfb, 0x3b, 0x5,
+ 0xe, 0xfb, 0x31, 0xbd, 0xf8, 0x66, 0xbc, 0xd6,
+ 0xf7, 0x4, 0x12, 0x92, 0xf7, 0x58, 0x6b, 0xe2,
+ 0xce, 0xe0, 0x8a, 0xf7, 0x4b, 0x13, 0xec, 0xf7,
+ 0xd9, 0xf8, 0x77, 0x15, 0xe0, 0xf7, 0x4, 0x36,
+ 0x80, 0xa, 0x15, 0xe2, 0xf7, 0x4, 0x34, 0x6,
+ 0x13, 0xd2, 0xfb, 0xa, 0xfd, 0x52, 0x15, 0x59,
+ 0xf7, 0x9a, 0xbd, 0x32, 0x7, 0xf7, 0xc1, 0xf8,
+ 0x66, 0x5, 0xcc, 0xbc, 0xfb, 0x4b, 0x5a, 0xc4,
+ 0x6, 0xfb, 0x3c, 0xfb, 0x99, 0xfb, 0x35, 0xf7,
+ 0x99, 0x5, 0xcd, 0xbc, 0xfb, 0x58, 0x5a, 0xd0,
+ 0x6, 0xf7, 0x54, 0xfb, 0xc9, 0x24, 0xfb, 0x31,
+ 0x5, 0xe, 0x8b, 0xc1, 0xd8, 0xc1, 0xd1, 0xc2,
+ 0xf7, 0x5a, 0xc1, 0x1, 0xa5, 0xf7, 0x60, 0xb9,
+ 0xc1, 0xb4, 0xf7, 0x5f, 0x3, 0xf7, 0x3c, 0x16,
+ 0xf7, 0xa1, 0xc1, 0x20, 0xd8, 0xf7, 0x15, 0xc1,
+ 0xfb, 0x15, 0xd1, 0xf7, 0x15, 0xc2, 0xfb, 0xd,
+ 0x6, 0xf7, 0x47, 0xf7, 0x5a, 0x5, 0xc4, 0xc1,
+ 0xfb, 0x5f, 0x55, 0xce, 0x6, 0xfb, 0x1d, 0xfb,
+ 0x2b, 0xfb, 0x1d, 0xf7, 0x2b, 0x5, 0xcd, 0xc1,
+ 0xfb, 0x60, 0x55, 0xca, 0x6, 0xf7, 0x43, 0xfb,
+ 0x5a, 0x5, 0xfb, 0x9, 0x54, 0xf7, 0x15, 0x45,
+ 0xfb, 0x15, 0x55, 0xf7, 0x15, 0x3e, 0xfb, 0x0,
+ 0x6, 0xe, 0x74, 0xa, 0xf7, 0x4, 0xc1, 0xf7,
+ 0xad, 0xc1, 0x3, 0xed, 0x16, 0xf8, 0x27, 0xf7,
+ 0x2e, 0x55, 0x27, 0xfb, 0xa3, 0x6, 0xf7, 0xd9,
+ 0xf7, 0xd6, 0x5, 0xbd, 0xfc, 0x19, 0xfb, 0x2b,
+ 0xc1, 0xec, 0xf7, 0x94, 0x7, 0xfb, 0xd8, 0xfb,
+ 0xd5, 0x5, 0xe, 0x8b, 0x67, 0xa, 0xbf, 0xc4,
+ 0x1, 0xf7, 0x3, 0xc1, 0xf7, 0xad, 0xc2, 0x3,
+ 0xf7, 0x9e, 0xf8, 0x7f, 0x15, 0xda, 0x6, 0xf7,
+ 0x27, 0xf7, 0x32, 0x62, 0x9f, 0xfb, 0x26, 0xfb,
+ 0xd, 0xfb, 0x28, 0xf7, 0xc, 0x62, 0x77, 0x5,
+ 0x79, 0xfd, 0x1c, 0x15, 0xf8, 0x27, 0xf7, 0x31,
+ 0x54, 0x25, 0xfb, 0xa3, 0x6, 0xf7, 0xda, 0xf7,
+ 0xdd, 0x5, 0xc2, 0xfc, 0x1a, 0xfb, 0x32, 0xc1,
+ 0x7, 0x8c, 0xf2, 0x5, 0xf7, 0x98, 0x6, 0xfb,
+ 0xdc, 0xfb, 0xe0, 0x5, 0xe, 0x7d, 0xc1, 0xf8,
+ 0xa3, 0xc2, 0x1, 0xf5, 0xc4, 0xf7, 0xa5, 0xc5,
+ 0x3, 0xf5, 0xf7, 0xc4, 0x15, 0xfb, 0x29, 0xa2,
+ 0xfb, 0x3d, 0xf7, 0x40, 0xf7, 0x45, 0x9b, 0xf7,
+ 0x40, 0xf7, 0x26, 0xf7, 0x1b, 0x78, 0xf7, 0x4b,
+ 0xfb, 0x41, 0xfb, 0x41, 0x74, 0xfb, 0x49, 0xfb,
+ 0x1d, 0x1e, 0xc4, 0x16, 0xf7, 0xf, 0x9e, 0xf7,
+ 0x20, 0xf7, 0xc, 0xf7, 0x3, 0xa2, 0xfb, 0x1f,
+ 0xfb, 0x10, 0xfb, 0x17, 0x78, 0xfb, 0x19, 0xfb,
+ 0xa, 0xfb, 0x6, 0x75, 0xf7, 0x17, 0xf7, 0x19,
+ 0x1e, 0xe, 0x79, 0x9d, 0xf8, 0x3e, 0x9a, 0xf7,
+ 0xd, 0x9d, 0xa9, 0x97, 0x6, 0xfb, 0x31, 0x8b,
+ 0x7, 0x1e, 0xa0, 0x39, 0x63, 0xff, 0xc, 0x9,
+ 0xc2, 0xa, 0xc2, 0xb, 0xf8, 0xec, 0x14, 0xaa,
+ 0x13, 0x0, 0x63, 0x2, 0x0, 0x1, 0x0, 0x3d,
+ 0x0, 0x70, 0x0, 0xae, 0x0, 0xb8, 0x0, 0xbd,
+ 0x0, 0xc2, 0x0, 0xc8, 0x0, 0xe5, 0x0, 0xff,
+ 0x1, 0x18, 0x1, 0x2e, 0x1, 0x38, 0x1, 0x42,
+ 0x1, 0x55, 0x1, 0x71, 0x1, 0x76, 0x1, 0x80,
+ 0x1, 0x9a, 0x1, 0xa9, 0x1, 0xba, 0x1, 0xc6,
+ 0x1, 0xd8, 0x2, 0x7, 0x2, 0x1c, 0x2, 0x2c,
+ 0x2, 0x33, 0x2, 0x5a, 0x2, 0x69, 0x2, 0x73,
+ 0x2, 0x7d, 0x2, 0x88, 0x2, 0x97, 0x2, 0xa3,
+ 0x2, 0xae, 0x2, 0xb7, 0x2, 0xcf, 0x2, 0xe7,
+ 0x2, 0xfd, 0x3, 0x4, 0x3, 0xe, 0x3, 0x24,
+ 0x3, 0x3a, 0x3, 0x4e, 0x3, 0x63, 0x3, 0x76,
+ 0x3, 0x7f, 0x3, 0x88, 0x3, 0x91, 0x3, 0xa5,
+ 0x3, 0xb7, 0x3, 0xc9, 0x3, 0xdb, 0x3, 0xe3,
+ 0x3, 0xeb, 0x3, 0xf3, 0x3, 0xfb, 0x4, 0x3,
+ 0x4, 0xe, 0x4, 0x13, 0x4, 0x1e, 0x4, 0x24,
+ 0x4, 0x31, 0x4, 0x38, 0x4, 0x41, 0x4, 0x4a,
+ 0x4, 0x53, 0x4, 0x5a, 0x4, 0x60, 0x4, 0x66,
+ 0x4, 0x74, 0x4, 0x81, 0x4, 0x86, 0x4, 0x8a,
+ 0x4, 0x96, 0x4, 0xa2, 0x4, 0xa8, 0x4, 0xae,
+ 0x4, 0xb9, 0x4, 0xc4, 0x4, 0xce, 0x4, 0xd9,
+ 0x4, 0xe4, 0x4, 0xeb, 0x4, 0xf2, 0x4, 0xf9,
+ 0x5, 0x0, 0x5, 0x7, 0x5, 0x11, 0x5, 0x1b,
+ 0x5, 0x24, 0x5, 0x2d, 0x5, 0x36, 0x5, 0x3f,
+ 0x5, 0x48, 0x5, 0x51, 0x5, 0x58, 0x5, 0x5e,
+ 0x5, 0x64, 0x5, 0x69, 0x15, 0xfb, 0x37, 0xf3,
+ 0xfb, 0x1a, 0xf7, 0x30, 0xf7, 0x34, 0xe9, 0xf7,
+ 0x1a, 0xf7, 0x37, 0xe9, 0x5a, 0xf7, 0x5f, 0xfb,
+ 0x60, 0xfb, 0x43, 0x35, 0xfb, 0x31, 0xfb, 0x20,
+ 0x1e, 0xc1, 0x89, 0x15, 0xe4, 0xc1, 0xf7, 0x31,
+ 0xf7, 0x2b, 0xf7, 0x2c, 0xba, 0xfb, 0x3d, 0x3e,
+ 0xfb, 0x13, 0x47, 0xfb, 0x7, 0xfb, 0x15, 0xfb,
+ 0x15, 0x3d, 0xf7, 0x7, 0xf7, 0x13, 0x1e, 0xb,
+ 0x15, 0xfb, 0x1b, 0xe2, 0x2b, 0xf7, 0x2a, 0xf7,
+ 0x25, 0xe9, 0xed, 0xf7, 0x19, 0xf7, 0x20, 0x2f,
+ 0xe7, 0xfb, 0x25, 0xfb, 0x1b, 0x23, 0x33, 0xfb,
+ 0x24, 0x1e, 0xc5, 0x8a, 0x15, 0xe9, 0xc9, 0xdd,
+ 0xf7, 0xb, 0xf7, 0xe, 0xc2, 0x38, 0x2e, 0x39,
+ 0x4b, 0x2f, 0xfb, 0x8, 0xfb, 0xa, 0x4f, 0xe7,
+ 0xdd, 0x1e, 0xe, 0x15, 0xf8, 0x36, 0x6, 0xf7,
+ 0x14, 0x45, 0xf7, 0xe, 0xfb, 0x3b, 0xfb, 0x1c,
+ 0x24, 0x24, 0xfb, 0x1f, 0xfb, 0xc, 0xd1, 0x25,
+ 0xf7, 0x47, 0xdd, 0xe0, 0xa6, 0xb0, 0xcd, 0x1e,
+ 0x7a, 0xc0, 0x5, 0x5f, 0x3b, 0x3c, 0x79, 0x5b,
+ 0x1b, 0x2a, 0x24, 0xb8, 0xf7, 0x6, 0x1f, 0x8d,
+ 0xc3, 0x15, 0xc7, 0x93, 0xc2, 0xd9, 0xf7, 0x8,
+ 0x1b, 0xf7, 0x19, 0xa9, 0x2e, 0x5e, 0x96, 0x1f,
+ 0xe, 0x26, 0xa, 0x13, 0x7c, 0x29, 0xa, 0x13,
+ 0xbc, 0x2a, 0xa, 0x25, 0xa, 0x3c, 0xa, 0xb,
+ 0x2d, 0xa, 0x27, 0xa, 0xb, 0x28, 0xa, 0x3d,
+ 0xa, 0x1f, 0xb, 0xf7, 0x60, 0xc1, 0x57, 0x6,
+ 0xfb, 0x60, 0xf8, 0x93, 0x5, 0xfb, 0x82, 0x55,
+ 0xf7, 0x20, 0x6, 0xfb, 0x48, 0xfc, 0x5d, 0x5,
+ 0x4f, 0x6, 0xf7, 0x4e, 0xf7, 0x45, 0x15, 0xb,
+ 0x15, 0x9a, 0xab, 0xe0, 0xa7, 0xd1, 0x1b, 0xd7,
+ 0xc3, 0x8b, 0x21, 0x1f, 0x6b, 0x7, 0x92, 0x5e,
+ 0x59, 0x92, 0x59, 0x1b, 0xfb, 0x3c, 0x55, 0x33,
+ 0x50, 0xb, 0x36, 0xf7, 0x1e, 0xc3, 0x38, 0xf7,
+ 0x88, 0x7, 0xeb, 0x59, 0xc3, 0xfb, 0x14, 0x45,
+ 0x3a, 0x77, 0x73, 0x4f, 0x1e, 0xf7, 0xe1, 0xfb,
+ 0x94, 0x15, 0xb, 0x4e, 0x58, 0x46, 0x5c, 0x38,
+ 0x1b, 0x4c, 0x60, 0xb4, 0xb2, 0xe1, 0xf7, 0x6,
+ 0x91, 0xcb, 0xb8, 0xb6, 0x85, 0x83, 0xb6, 0x1f,
+ 0xe, 0x38, 0xa, 0x13, 0x78, 0x3b, 0xa, 0x13,
+ 0xb8, 0x33, 0xa, 0x26, 0xa, 0x13, 0x7f, 0x29,
+ 0xa, 0x13, 0xbf, 0x2a, 0xa, 0xf7, 0x63, 0xc1,
+ 0x32, 0x6, 0xb9, 0xf7, 0xf, 0x5, 0xf7, 0xa6,
+ 0x6, 0xba, 0xfb, 0xf, 0x5, 0x2c, 0x55, 0xb,
+ 0xf7, 0x38, 0x39, 0xc4, 0xf7, 0x6f, 0x52, 0x38,
+ 0xfb, 0x38, 0xf7, 0x5e, 0xf7, 0xc2, 0xfb, 0x1b,
+ 0xc4, 0xf7, 0x51, 0xfc, 0x85, 0x55, 0xde, 0xfc,
+ 0x5d, 0x38, 0x6, 0xb, 0x40, 0xa, 0x2e, 0xa,
+ 0xb, 0xf7, 0x19, 0x31, 0xa, 0xb7, 0xf7, 0x14,
+ 0x4f, 0xa, 0xb, 0xf7, 0x11, 0xd9, 0xd6, 0xf7,
+ 0x27, 0x1e, 0xf7, 0xc4, 0xd8, 0xc2, 0xfb, 0x7c,
+ 0x54, 0xf2, 0xfb, 0xc3, 0x7, 0xfb, 0xe, 0x42,
+ 0x5d, 0x3c, 0x31, 0x4b, 0xb, 0xf8, 0x2c, 0xc1,
+ 0xfb, 0x43, 0xf8, 0x5c, 0x42, 0xa, 0xfc, 0x5c,
+ 0xfb, 0x43, 0x6, 0xb, 0x58, 0x63, 0x57, 0x54,
+ 0x4b, 0x1b, 0x42, 0x63, 0xb6, 0xd5, 0x1f, 0xf7,
+ 0xac, 0xfb, 0x1c, 0x7, 0xe, 0x15, 0xda, 0xfb,
+ 0xc1, 0x6, 0xfb, 0x1a, 0xd5, 0x30, 0x30, 0xa,
+ 0xb, 0xf8, 0x2e, 0xc2, 0xfb, 0x43, 0xf8, 0x12,
+ 0xfb, 0x5c, 0x54, 0xf7, 0x24, 0xfb, 0xdb, 0xfb,
+ 0x47, 0x6, 0xb, 0xf7, 0xc8, 0xc1, 0xfb, 0x11,
+ 0xf7, 0x43, 0x6, 0xf7, 0x45, 0xf7, 0xae, 0x5,
+ 0xd0, 0xc1, 0xfb, 0x5c, 0x55, 0xd1, 0x6, 0xfb,
+ 0x25, 0xfb, 0x78, 0xfb, 0x27, 0xf7, 0x78, 0x5,
+ 0xd2, 0xc1, 0xfb, 0x5d, 0x55, 0xcf, 0x6, 0xf7,
+ 0x49, 0xfb, 0xae, 0x5, 0xfb, 0x43, 0xfb, 0x12,
+ 0x7, 0xb, 0x15, 0xdd, 0x6, 0xf7, 0x2a, 0xf7,
+ 0x34, 0x60, 0x9d, 0xfb, 0x27, 0xfb, 0xd, 0xfb,
+ 0x2c, 0xf7, 0xd, 0x62, 0x78, 0x5, 0xe, 0x15,
+ 0xde, 0xfb, 0x90, 0x6, 0x2e, 0xcf, 0x58, 0xe2,
+ 0xb3, 0xbe, 0x9b, 0xd5, 0xd7, 0x1e, 0xb, 0x27,
+ 0xa, 0x13, 0x40, 0x3c, 0xa, 0xb, 0x15, 0x48,
+ 0xbd, 0x51, 0xd9, 0xd4, 0xc1, 0xc4, 0xd0, 0xcc,
+ 0x62, 0xc6, 0x33, 0x3e, 0x5a, 0x4f, 0x4a, 0x1e,
+ 0xc3, 0x8a, 0x15, 0xb5, 0xa6, 0xa9, 0xb9, 0xb8,
+ 0xa6, 0x6a, 0x65, 0x68, 0x71, 0x68, 0x5d, 0x61,
+ 0x6c, 0xa5, 0xb6, 0x1e, 0xb, 0x3d, 0xf7, 0x1c,
+ 0xc2, 0x38, 0xf8, 0x14, 0xfb, 0x1c, 0x54, 0xde,
+ 0xfb, 0x80, 0x7, 0xb, 0xf7, 0x3, 0xf7, 0xbb,
+ 0xf7, 0xb, 0xfb, 0xbb, 0x5, 0xb, 0x49, 0xc5,
+ 0x44, 0xf4, 0xd9, 0xd2, 0xb7, 0xc0, 0xc3, 0xb,
+ 0x41, 0xa, 0x12, 0xba, 0xc5, 0xf7, 0xc9, 0xc3,
+ 0x13, 0xbc, 0xb, 0x7c, 0xc1, 0x61, 0x67, 0xa,
+ 0x12, 0xf7, 0x4, 0xc0, 0xf7, 0xa1, 0xc0, 0x13,
+ 0xb8, 0xb, 0xf8, 0x85, 0xf7, 0x51, 0x53, 0xfb,
+ 0x1b, 0xfb, 0xc3, 0xf7, 0x5d, 0xb, 0x7c, 0xc3,
+ 0x5f, 0xc3, 0xf7, 0x34, 0xc3, 0xf7, 0x10, 0xc3,
+ 0xb, 0xf7, 0x3e, 0xc1, 0xfc, 0x24, 0x55, 0xf7,
+ 0x40, 0xb, 0xd1, 0xee, 0xcf, 0xc8, 0x67, 0x5b,
+ 0xb7, 0x1f, 0x40, 0xc2, 0xf7, 0x6a, 0x54, 0x49,
+ 0x7, 0xae, 0x65, 0x4f, 0xaa, 0x40, 0x1b, 0xfb,
+ 0x37, 0xb, 0x3c, 0x1b, 0xfb, 0x2a, 0x3d, 0x22,
+ 0x32, 0x30, 0xd3, 0x28, 0xf7, 0x2f, 0xcc, 0xd5,
+ 0xa1, 0xba, 0xb3, 0x1f, 0xfb, 0x9, 0x7, 0x33,
+ 0x51, 0xb, 0x15, 0xc3, 0x6, 0xef, 0xf7, 0x7e,
+ 0x5, 0x31, 0x6, 0xe7, 0xfb, 0x7e, 0x15, 0xc6,
+ 0x6, 0xec, 0xf7, 0x7e, 0x5, 0x32, 0x6, 0xe,
+ 0x8b, 0xc2, 0xf8, 0x58, 0xc2, 0x1, 0xb, 0x4e,
+ 0xa, 0xf7, 0x78, 0x77, 0x1, 0x61, 0xa, 0x3,
+ 0xb, 0x15, 0xf7, 0x9f, 0xc0, 0x21, 0xf7, 0xd5,
+ 0xf5, 0xc0, 0x21, 0xcd, 0x6, 0xdb, 0xce, 0x9e,
+ 0xde, 0x74, 0x1e, 0x94, 0xbe, 0x5, 0xb, 0x15,
+ 0xf7, 0x27, 0xe9, 0xf7, 0x24, 0x2d, 0xb4, 0x9c,
+ 0xfb, 0x26, 0xf7, 0x19, 0x5, 0x3b, 0x6, 0xfb,
+ 0x27, 0xfb, 0x19, 0x5, 0xb, 0x92, 0x72, 0x71,
+ 0x8f, 0x74, 0x1b, 0x3c, 0x4e, 0x62, 0x30, 0x1f,
+ 0x43, 0x21, 0x56, 0xf5, 0xfb, 0xd5, 0x21, 0x7,
+ 0xe, 0x53, 0x8c, 0x15, 0x46, 0xc4, 0x52, 0xd0,
+ 0xd0, 0xc5, 0xc4, 0xd0, 0xd0, 0x51, 0xc5, 0x46,
+ 0x46, 0x52, 0x51, 0x46, 0x1e, 0xb, 0x15, 0x6d,
+ 0xa6, 0x6e, 0xb5, 0xab, 0xab, 0xa3, 0xad, 0xaa,
+ 0x72, 0xa9, 0x63, 0x65, 0x6d, 0x70, 0x6a, 0x1e,
+ 0xe, 0x8b, 0xc1, 0xf7, 0xf, 0xc1, 0xf7, 0xac,
+ 0xc1, 0xb, 0x8b, 0xc1, 0xf7, 0x5d, 0xc1, 0xf7,
+ 0x5e, 0xc1, 0xb, 0x1e, 0xf7, 0xbf, 0xf5, 0xc2,
+ 0xfb, 0x81, 0x7, 0xb, 0x5, 0x80, 0xbf, 0xe8,
+ 0x7a, 0xdd, 0x1b, 0xf7, 0xe, 0xd8, 0xc0, 0xf0,
+ 0x1f, 0xf8, 0x11, 0xc9, 0xbe, 0xfb, 0x7, 0xb,
+ 0x6e, 0xa2, 0x74, 0xa8, 0xa8, 0xa2, 0xa2, 0xa8,
+ 0xa8, 0x74, 0xa2, 0x6e, 0x6e, 0x74, 0x74, 0x6e,
+ 0x1e, 0xb, 0x64, 0xab, 0x75, 0xb2, 0xb2, 0xab,
+ 0xa1, 0xb2, 0xb2, 0x6b, 0xa1, 0x64, 0x64, 0x6b,
+ 0x75, 0x64, 0x1e, 0xb, 0xfb, 0x31, 0xf7, 0x60,
+ 0xd4, 0xd4, 0xa0, 0xa5, 0xca, 0x1f, 0xf7, 0x41,
+ 0xbd, 0xc2, 0xfb, 0x9f, 0x7, 0xb, 0x8e, 0xf7,
+ 0x63, 0xf7, 0x4b, 0xf7, 0x60, 0xb, 0x1, 0xeb,
+ 0xbf, 0xf7, 0xc6, 0xbf, 0x3, 0xb, 0x1, 0xc6,
+ 0xc5, 0xf7, 0xf7, 0xca, 0x3, 0xb, 0x1, 0xb6,
+ 0xc1, 0xf8, 0x28, 0xc3, 0x3, 0xb, 0x1, 0xc9,
+ 0xc5, 0xf7, 0xfa, 0xc7, 0x3, 0xb, 0x15, 0xe0,
+ 0xf7, 0x7, 0x36, 0x6, 0xfb, 0x2b, 0x60, 0xa,
+ 0xb, 0x5e, 0xa, 0x56, 0xa, 0xb, 0x55, 0xa,
+ 0x9c, 0xf8, 0x90, 0x15, 0xda, 0xfb, 0xc1, 0x6,
+ 0xb, 0xf7, 0x7e, 0x5, 0x2f, 0x6, 0xe, 0x6,
+ 0xf7, 0x30, 0xf7, 0xf, 0x6f, 0xb0, 0xfb, 0x79,
+ 0xfb, 0x4d, 0x5, 0xe, 0x7c, 0x82, 0xa, 0xf7,
+ 0x1e, 0xc3, 0xb, 0xf7, 0x7e, 0x1, 0xf7, 0x6e,
+ 0xf7, 0x37, 0x3, 0xb, 0xfb, 0x7, 0x15, 0xe2,
+ 0xf7, 0x7, 0x34, 0x6, 0xb, 0xf7, 0x1a, 0xc2,
+ 0xf7, 0x38, 0xc4, 0xdd, 0xc3, 0xb, 0x15, 0xde,
+ 0xf7, 0x9, 0x38, 0x6, 0xb, 0x7c, 0xc3, 0xf7,
+ 0xf2, 0xc4, 0xb, 0x79, 0xc0, 0xf8, 0x7c, 0xc0,
+ 0xb, 0x15, 0xb2, 0xab, 0xab, 0xb2, 0xb2, 0xab,
+ 0x6b, 0x64, 0x64, 0x6b, 0x6b, 0x64, 0xb, 0xfb,
+ 0x31, 0xbe, 0xf7, 0x12, 0xbc, 0xf7, 0xc9, 0xbe,
+ 0x5c, 0xbf, 0x12, 0xb, 0xc2, 0xf7, 0xdd, 0xc2,
+ 0xb, 0x1, 0xf7, 0xa6, 0xb, 0x32, 0x58, 0x3a,
+ 0x3e, 0x50, 0x29, 0x27, 0x40, 0xc9, 0xd7, 0x1e,
+ 0xb, 0x12, 0x92, 0xf7, 0x58, 0xfb, 0x2a, 0xf7,
+ 0x9a, 0xe9, 0xf7, 0x4b, 0xb, 0x79, 0xc2, 0xf8,
+ 0x6b, 0xc2, 0xb, 0x8b, 0xc1, 0xf8, 0x5c, 0xc1,
+ 0xb, 0xf7, 0x7e, 0x1, 0xf7, 0x23, 0xf7, 0xce,
+ 0x3, 0xf7, 0x23, 0xb, 0xf8, 0x85, 0xf7, 0x43,
+ 0x1, 0xf7, 0x4e, 0xf7, 0x77, 0x3, 0xb, 0x8b,
+ 0xc2, 0xf7, 0xdb, 0xc2, 0x68, 0xa, 0xc3, 0x3,
+ 0xb, 0xf7, 0x7, 0x15, 0xa7, 0xb8, 0xfb, 0x2e,
+ 0xf7, 0x4, 0x5, 0xb, 0x15, 0xa7, 0x73, 0xf7,
+ 0x3e, 0xf7, 0x10, 0x5f, 0xbe, 0x5, 0xb, 0x15,
+ 0xdc, 0xf7, 0x9, 0x3a, 0x6, 0xb, 0xc2, 0x3,
+ 0xea, 0x16, 0xf8, 0x2e, 0xb, 0x8b, 0xc1, 0xf7,
+ 0xd2, 0xc1, 0x1, 0xb, 0x8b, 0xc1, 0xf8, 0x5a,
+ 0xc1, 0x1, 0xb, 0x15, 0xe5, 0xf7, 0x8, 0x31,
+ 0x6, 0xb, 0x15, 0xb7, 0x6, 0x9d, 0xf7, 0x8f,
+ 0x5, 0x3a, 0x6, 0xb, 0xf7, 0x4d, 0x6f, 0x66,
+ 0xf7, 0x30, 0xfb, 0xf, 0x5, 0xb, 0x15, 0xf7,
+ 0xac, 0x26, 0x96, 0xa9, 0xfb, 0x96, 0xb, 0x1,
+ 0xf7, 0x79, 0xf7, 0x22, 0x3, 0xf7, 0x79, 0xb,
+ 0xd1, 0xf8, 0xc, 0x1, 0xe7, 0xf8, 0x34, 0x3,
+ 0xb, 0xf7, 0x5e, 0x15, 0xf7, 0x36, 0xfb, 0x17,
+ 0x6, 0xb, 0xf7, 0xa4, 0xbe, 0x1, 0x73, 0xf9,
+ 0x1c, 0x3, 0xb, 0xf8, 0xa9, 0x15, 0xd4, 0xf7,
+ 0x10, 0x42, 0x6, 0xb, 0xf7, 0xf, 0x1e, 0xf0,
+ 0x54, 0x7, 0xe, 0x6, 0xfb, 0x2e, 0xfb, 0x4,
+ 0xb, 0x1, 0xf7, 0xa5, 0xc4, 0x3, 0xb, 0xc2,
+ 0xf7, 0x33, 0xc3, 0xb
+ };
diff --git a/core/src/fxge/fontdata/chromefontdata/FoxitFixedBold.c b/core/src/fxge/fontdata/chromefontdata/FoxitFixedBold.c
new file mode 100644
index 0000000000..eb4fb8f5d6
--- /dev/null
+++ b/core/src/fxge/fontdata/chromefontdata/FoxitFixedBold.c
@@ -0,0 +1,2265 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+const unsigned char g_FoxitFixedBoldFontData [18055] = {0x1,
+ 0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0x13,
+ 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x46, 0x69, 0x78,
+ 0x65, 0x64, 0x4f, 0x54, 0x46, 0x2d, 0x42, 0x6f,
+ 0x6c, 0x64, 0x0, 0x1, 0x1, 0x1, 0x24, 0xf8,
+ 0x10, 0x0, 0xf8, 0x2a, 0x1, 0xf8, 0x2b, 0x2,
+ 0xf8, 0x2c, 0x3, 0xf8, 0x14, 0x4, 0xfb, 0x5,
+ 0xfb, 0x8d, 0xf9, 0x5d, 0xf9, 0xbf, 0x5, 0xf7,
+ 0xa0, 0xf, 0xf9, 0x6, 0x11, 0xae, 0x1c, 0x40,
+ 0xc8, 0x12, 0x0, 0x12, 0x1, 0x1, 0x5, 0x7,
+ 0x9, 0x11, 0x19, 0x1f, 0x25, 0x29, 0x2d, 0x39,
+ 0x42, 0x49, 0x53, 0x5c, 0x65, 0x8f, 0xa3, 0xb2,
+ 0x49, 0x64, 0x6f, 0x74, 0x49, 0x4a, 0x69, 0x6a,
+ 0x53, 0x63, 0x65, 0x64, 0x69, 0x6c, 0x6c, 0x61,
+ 0x73, 0x63, 0x65, 0x64, 0x69, 0x6c, 0x6c, 0x61,
+ 0x47, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x67, 0x63,
+ 0x61, 0x72, 0x6f, 0x6e, 0x6c, 0x69, 0x72, 0x61,
+ 0x45, 0x75, 0x72, 0x6f, 0x70, 0x72, 0x65, 0x73,
+ 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e,
+ 0x61, 0x72, 0x72, 0x6f, 0x77, 0x6c, 0x65, 0x66,
+ 0x74, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x75, 0x70,
+ 0x61, 0x72, 0x72, 0x6f, 0x77, 0x72, 0x69, 0x67,
+ 0x68, 0x74, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x64,
+ 0x6f, 0x77, 0x6e, 0x61, 0x72, 0x72, 0x6f, 0x77,
+ 0x62, 0x6f, 0x74, 0x68, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x43, 0x68,
+ 0x72, 0x6f, 0x6d, 0x20, 0x46, 0x69, 0x78, 0x65,
+ 0x64, 0x20, 0x4f, 0x54, 0x46, 0x20, 0x42, 0x6f,
+ 0x6c, 0x64, 0x43, 0x68, 0x72, 0x6F, 0x6D, 0x20,
+ 0x46, 0x69, 0x78, 0x65, 0x64, 0x20, 0x4f, 0x54,
+ 0x46, 0x0, 0x0, 0x1, 0x0, 0x1, 0x6, 0x0,
+ 0x68, 0x0, 0x0, 0x9, 0x37, 0x0, 0x7c, 0x0,
+ 0x0, 0x42, 0x20, 0x0, 0x67, 0x0, 0x0, 0x64,
+ 0x0, 0x0, 0xa0, 0x0, 0x0, 0x66, 0x0, 0x0,
+ 0x83, 0x0, 0x0, 0xaa, 0x0, 0x0, 0x8b, 0x0,
+ 0x0, 0x6a, 0x0, 0x0, 0x97, 0x0, 0x0, 0xa5,
+ 0x0, 0x0, 0x80, 0x0, 0x0, 0xa1, 0x0, 0x0,
+ 0x9c, 0x0, 0x0, 0xa4, 0x0, 0x0, 0xa9, 0x0,
+ 0x0, 0x7d, 0x0, 0x0, 0x98, 0x0, 0x0, 0x73,
+ 0x0, 0x0, 0x72, 0x0, 0x0, 0x85, 0x0, 0x0,
+ 0x96, 0x0, 0x0, 0x8f, 0x0, 0x0, 0x78, 0x0,
+ 0x0, 0x9e, 0x0, 0x0, 0x9b, 0x0, 0x0, 0xa3,
+ 0x0, 0x0, 0x7b, 0x0, 0x0, 0xae, 0x0, 0x0,
+ 0xab, 0x1, 0x0, 0xb0, 0x0, 0x0, 0xad, 0x0,
+ 0x0, 0xaf, 0x0, 0x0, 0x8a, 0x0, 0x0, 0xb1,
+ 0x0, 0x0, 0xb5, 0x0, 0x0, 0xb2, 0x2, 0x0,
+ 0xb9, 0x0, 0x0, 0xb6, 0x2, 0x0, 0x9a, 0x0,
+ 0x0, 0xba, 0x0, 0x0, 0xbe, 0x0, 0x0, 0xbb,
+ 0x1, 0x0, 0xbf, 0x0, 0x0, 0xbd, 0x0, 0x0,
+ 0xa8, 0x0, 0x0, 0x8d, 0x0, 0x0, 0xc4, 0x0,
+ 0x0, 0xc1, 0x2, 0x0, 0xc5, 0x0, 0x0, 0x9d,
+ 0x0, 0x0, 0x95, 0x0, 0x0, 0xcb, 0x0, 0x0,
+ 0xc8, 0x1, 0x0, 0xcd, 0x0, 0x0, 0xca, 0x0,
+ 0x0, 0xcc, 0x0, 0x0, 0x90, 0x0, 0x0, 0xce,
+ 0x0, 0x0, 0xd2, 0x0, 0x0, 0xcf, 0x2, 0x0,
+ 0xd6, 0x0, 0x0, 0xd3, 0x2, 0x0, 0xa7, 0x0,
+ 0x0, 0xd7, 0x0, 0x0, 0xdb, 0x0, 0x0, 0xd8,
+ 0x1, 0x0, 0xdc, 0x0, 0x0, 0xda, 0x0, 0x0,
+ 0x9f, 0x0, 0x0, 0x93, 0x0, 0x0, 0xe1, 0x0,
+ 0x0, 0xde, 0x2, 0x0, 0xe2, 0x0, 0x0, 0xa2,
+ 0x0, 0x0, 0xe3, 0x0, 0x1, 0x87, 0x0, 0x0,
+ 0x91, 0x0, 0x1, 0x88, 0x1, 0x0, 0x8c, 0x0,
+ 0x0, 0x92, 0x0, 0x0, 0x8e, 0x0, 0x0, 0x94,
+ 0x0, 0x1, 0x8a, 0x1, 0x0, 0xc0, 0x0, 0x0,
+ 0xdd, 0x0, 0x0, 0xc6, 0x1, 0x0, 0xe4, 0x0,
+ 0x0, 0x65, 0x0, 0x1, 0x8c, 0x1, 0x0, 0x7e,
+ 0x0, 0x0, 0x88, 0x0, 0x0, 0x81, 0x1, 0x0,
+ 0x84, 0x0, 0x0, 0x87, 0x0, 0x0, 0x7f, 0x0,
+ 0x0, 0x86, 0x0, 0x0, 0x6f, 0x0, 0x0, 0x89,
+ 0x0, 0x0, 0x41, 0x0, 0x0, 0x8, 0x0, 0x0,
+ 0x75, 0x0, 0x0, 0x69, 0x0, 0x0, 0x77, 0x0,
+ 0x0, 0x76, 0x0, 0x0, 0x70, 0x1, 0x0, 0x74,
+ 0x0, 0x0, 0x79, 0x1, 0x0, 0x6b, 0x1, 0x0,
+ 0x63, 0x0, 0x1, 0x8e, 0x2, 0x0, 0x99, 0x0,
+ 0x1, 0x91, 0x4, 0x0, 0xa6, 0x0, 0x0, 0x6d,
+ 0x1, 0x0, 0xf4, 0x2, 0x0, 0x1, 0x0, 0x2,
+ 0x0, 0x3, 0x0, 0x34, 0x0, 0x60, 0x0, 0xc1,
+ 0x1, 0x42, 0x1, 0xcc, 0x2, 0x52, 0x2, 0x68,
+ 0x2, 0x9d, 0x2, 0xd2, 0x3, 0x2, 0x3, 0x26,
+ 0x3, 0x39, 0x3, 0x4e, 0x3, 0x67, 0x3, 0x7e,
+ 0x3, 0xc4, 0x3, 0xe8, 0x4, 0x2f, 0x4, 0x8e,
+ 0x4, 0xc1, 0x5, 0xf, 0x5, 0x77, 0x5, 0x96,
+ 0x6, 0xc, 0x6, 0x73, 0x6, 0x86, 0x6, 0xa9,
+ 0x6, 0xc6, 0x6, 0xe4, 0x7, 0x1, 0x7, 0x5f,
+ 0x7, 0xff, 0x8, 0x3d, 0x8, 0xa0, 0x8, 0xee,
+ 0x9, 0x22, 0x9, 0x69, 0x9, 0xb0, 0x9, 0xd8,
+ 0xa, 0x12, 0xa, 0x26, 0xa, 0x57, 0xa, 0x94,
+ 0xa, 0xb6, 0xa, 0xf8, 0xb, 0x2d, 0xb, 0x76,
+ 0xb, 0xb7, 0xc, 0x32, 0xc, 0x86, 0xc, 0xfa,
+ 0xd, 0x26, 0xd, 0x64, 0xd, 0x94, 0xd, 0xcc,
+ 0xe, 0xf, 0xe, 0x45, 0xe, 0x6f, 0xe, 0x8b,
+ 0xe, 0x9f, 0xe, 0xbb, 0xe, 0xea, 0xe, 0xf6,
+ 0xf, 0xc, 0xf, 0x73, 0xf, 0xd4, 0x10, 0x1d,
+ 0x10, 0x7c, 0x10, 0xc8, 0x11, 0x6, 0x11, 0x43,
+ 0x11, 0x90, 0x11, 0xc3, 0x12, 0x7, 0x12, 0x43,
+ 0x12, 0x56, 0x12, 0xb6, 0x12, 0xfd, 0x13, 0x39,
+ 0x13, 0x97, 0x13, 0xdd, 0x14, 0x1d, 0x14, 0x95,
+ 0x14, 0xd4, 0x15, 0x29, 0x15, 0x51, 0x15, 0x91,
+ 0x15, 0xd0, 0x16, 0x7, 0x16, 0x3f, 0x16, 0xa5,
+ 0x16, 0xb5, 0x17, 0x1b, 0x17, 0x62, 0x17, 0x94,
+ 0x17, 0xe6, 0x18, 0x64, 0x18, 0xd4, 0x19, 0x29,
+ 0x19, 0x41, 0x19, 0xe1, 0x1a, 0x7, 0x1a, 0x90,
+ 0x1a, 0xf6, 0x1b, 0x29, 0x1b, 0x44, 0x1b, 0xd1,
+ 0x1b, 0xe4, 0x1c, 0x1e, 0x1c, 0x4b, 0x1c, 0x95,
+ 0x1c, 0xfe, 0x1d, 0x14, 0x1d, 0x76, 0x1d, 0xa3,
+ 0x1d, 0xbf, 0x1d, 0xf9, 0x1e, 0x25, 0x1e, 0x5f,
+ 0x1e, 0x93, 0x1e, 0xf6, 0x1f, 0x64, 0x1f, 0xff,
+ 0x20, 0x60, 0x20, 0x81, 0x20, 0xa0, 0x20, 0xca,
+ 0x21, 0x23, 0x21, 0x4c, 0x21, 0x8d, 0x21, 0xf8,
+ 0x22, 0x7b, 0x22, 0x8e, 0x22, 0xc1, 0x22, 0xf5,
+ 0x23, 0x31, 0x23, 0x49, 0x23, 0x68, 0x23, 0x93,
+ 0x23, 0xc1, 0x24, 0xc, 0x24, 0x7f, 0x24, 0xa0,
+ 0x24, 0xba, 0x24, 0xdf, 0x25, 0x33, 0x25, 0x5a,
+ 0x25, 0x89, 0x26, 0x6, 0x26, 0x1e, 0x26, 0x35,
+ 0x26, 0x5d, 0x26, 0x92, 0x26, 0xdd, 0x27, 0x26,
+ 0x27, 0xb4, 0x27, 0xd5, 0x27, 0xf6, 0x28, 0x26,
+ 0x28, 0x8b, 0x28, 0xcc, 0x29, 0x8, 0x29, 0xb0,
+ 0x2a, 0x2c, 0x2a, 0x46, 0x2a, 0x5f, 0x2a, 0x83,
+ 0x2a, 0xa2, 0x2a, 0xb8, 0x2a, 0xcd, 0x2a, 0xf5,
+ 0x2b, 0x3a, 0x2b, 0xab, 0x2c, 0x35, 0x2c, 0x54,
+ 0x2c, 0x70, 0x2c, 0x95, 0x2c, 0xe7, 0x2d, 0xa,
+ 0x2d, 0x29, 0x2d, 0xbd, 0x2d, 0xd4, 0x2d, 0xea,
+ 0x2e, 0xe, 0x2e, 0x5a, 0x2e, 0x86, 0x2e, 0xe6,
+ 0x2f, 0x21, 0x2f, 0x4b, 0x2f, 0x5c, 0x2f, 0xa1,
+ 0x30, 0x14, 0x30, 0x4e, 0x30, 0x7b, 0x30, 0xe8,
+ 0x31, 0x65, 0x32, 0x14, 0x32, 0xc5, 0x33, 0x60,
+ 0x33, 0xf4, 0x34, 0x57, 0x34, 0xa2, 0x34, 0xf2,
+ 0x35, 0x4f, 0x35, 0x9b, 0x35, 0xeb, 0x36, 0xe,
+ 0x36, 0x1b, 0x36, 0x4a, 0x36, 0x61, 0x36, 0x96,
+ 0x36, 0xca, 0x37, 0x9, 0x37, 0x31, 0x37, 0x44,
+ 0x37, 0x57, 0x37, 0x6e, 0x37, 0x80, 0x37, 0x94,
+ 0x37, 0xa2, 0x37, 0xb7, 0x37, 0xce, 0x37, 0xee,
+ 0x38, 0x22, 0x38, 0x43, 0x38, 0x90, 0x39, 0x34,
+ 0x39, 0x4d, 0x39, 0x6b, 0x39, 0x82, 0x3a, 0x8,
+ 0x3a, 0x89, 0x3a, 0xf0, 0x3b, 0x34, 0x3b, 0x41,
+ 0x3b, 0x63, 0x3b, 0x71, 0x3b, 0x94, 0x3b, 0xa8,
+ 0x3b, 0xb4, 0x3c, 0x11, 0x3c, 0x6a, 0xe, 0xe,
+ 0x7c, 0xf7, 0x31, 0xf8, 0x44, 0x77, 0x1, 0xf7,
+ 0x7e, 0xf7, 0x17, 0x3, 0xf7, 0x89, 0xf7, 0x4b,
+ 0x15, 0xf7, 0x2, 0x6, 0x9f, 0xf8, 0x19, 0x5,
+ 0xfb, 0x2b, 0x6, 0x75, 0xfc, 0x90, 0x15, 0x5f,
+ 0xb7, 0x68, 0xc1, 0xc1, 0xb7, 0xae, 0xb7, 0xb7,
+ 0x5f, 0xad, 0x55, 0x55, 0x5f, 0x69, 0x5f, 0x1e,
+ 0xe, 0xf7, 0xb8, 0x76, 0xf7, 0xb7, 0x77, 0x1,
+ 0xf7, 0x28, 0xf7, 0x6, 0xd6, 0xf7, 0x5, 0x3,
+ 0xf7, 0xe5, 0xf7, 0xa9, 0x15, 0xf7, 0x5, 0x6,
+ 0x9a, 0x59, 0xa, 0xfb, 0x22, 0x6, 0xfb, 0x43,
+ 0xfb, 0xb1, 0x15, 0xf7, 0x6, 0x6, 0x9b, 0x59,
+ 0xa, 0xfb, 0x23, 0x6, 0xe, 0x5e, 0x76, 0xf7,
+ 0x75, 0xe6, 0xf3, 0xe6, 0xf7, 0x54, 0x77, 0x1,
+ 0xf7, 0x24, 0xe3, 0xf3, 0xe7, 0x3, 0xf7, 0x1d,
+ 0x5e, 0x15, 0xe4, 0x6, 0x98, 0xf7, 0x60, 0x5,
+ 0xf4, 0x6, 0x7c, 0xfb, 0x60, 0x5, 0xe8, 0x6,
+ 0x98, 0xf7, 0x60, 0x5, 0xf7, 0x1, 0xe6, 0x24,
+ 0x6, 0x91, 0xf3, 0x5, 0xec, 0xe6, 0x30, 0x6,
+ 0x92, 0xf7, 0x62, 0x5, 0x31, 0x6, 0x83, 0xfb,
+ 0x62, 0x5, 0x24, 0x6, 0x92, 0xf7, 0x62, 0x5,
+ 0x32, 0x6, 0x82, 0xfb, 0x62, 0x5, 0xfb, 0x4,
+ 0x30, 0xf6, 0x6, 0x84, 0x23, 0x5, 0x27, 0x30,
+ 0xea, 0x6, 0xe9, 0xe6, 0x15, 0x93, 0xf3, 0x5,
+ 0xf1, 0x6, 0x85, 0x23, 0x5, 0xe, 0x22, 0x76,
+ 0xf7, 0x13, 0xf7, 0x54, 0xf7, 0x56, 0xf7, 0x53,
+ 0x20, 0xf7, 0x57, 0x12, 0xe0, 0xef, 0xcb, 0xef,
+ 0xbf, 0xee, 0x3a, 0xee, 0x13, 0xdd, 0xdc, 0x8c,
+ 0x15, 0xef, 0xa9, 0x6, 0x84, 0x9f, 0xa6, 0x86,
+ 0xa0, 0x1b, 0xfb, 0x25, 0xef, 0xf7, 0x24, 0x7,
+ 0xb1, 0x92, 0xf7, 0x17, 0xa1, 0xf7, 0x13, 0x1a,
+ 0xf3, 0x37, 0x9e, 0x20, 0xa7, 0x1e, 0x62, 0x97,
+ 0x26, 0x9d, 0xc1, 0x1a, 0xc0, 0xd9, 0x94, 0xaa,
+ 0x1e, 0x13, 0xee, 0xb0, 0xb0, 0x81, 0x7c, 0xac,
+ 0x1f, 0x50, 0xee, 0xf7, 0x53, 0x28, 0x6c, 0x7,
+ 0x7b, 0x93, 0x7a, 0x91, 0x78, 0x8e, 0x8, 0x13,
+ 0xdd, 0xf1, 0x27, 0x26, 0x7, 0x46, 0x82, 0x2c,
+ 0x67, 0xfb, 0x7, 0x1a, 0x21, 0xde, 0x76, 0xf7,
+ 0xe, 0x69, 0x1e, 0xb6, 0x80, 0xe1, 0x83, 0x56,
+ 0x1a, 0x55, 0x25, 0x87, 0x6f, 0x66, 0x67, 0x91,
+ 0x9a, 0x68, 0x1e, 0xc5, 0x27, 0x7, 0xe, 0x91,
+ 0x76, 0xf7, 0x5f, 0xd1, 0xdd, 0xd0, 0xf7, 0x1c,
+ 0xd2, 0x12, 0xc7, 0xd2, 0xf7, 0x9, 0xd2, 0x64,
+ 0xd1, 0xf7, 0xa, 0xd2, 0x13, 0xfb, 0xc7, 0xf8,
+ 0x71, 0x15, 0x42, 0xc3, 0x4c, 0xe3, 0x8a, 0x1e,
+ 0xdb, 0xcd, 0xc5, 0xdb, 0xd1, 0x52, 0xcf, 0x34,
+ 0x36, 0x4e, 0x48, 0x43, 0x1f, 0xd2, 0x8c, 0x15,
+ 0xae, 0xa5, 0xab, 0xba, 0x1e, 0x13, 0xeb, 0xba,
+ 0xa8, 0x6c, 0x67, 0x5d, 0x64, 0x74, 0x65, 0x5e,
+ 0x70, 0xac, 0xaf, 0x1f, 0x13, 0xfd, 0xf7, 0x9,
+ 0xfb, 0xf7, 0x15, 0x43, 0xc5, 0x4a, 0xe3, 0x8a,
+ 0x1e, 0x13, 0x45, 0xda, 0xcd, 0xc5, 0xdc, 0xd2,
+ 0x52, 0xce, 0x35, 0x36, 0x4c, 0x49, 0x42, 0x1f,
+ 0xd2, 0x8c, 0x15, 0xad, 0xa6, 0xad, 0xbb, 0x1e,
+ 0x13, 0x5, 0xb9, 0xa7, 0x6a, 0x68, 0x5c, 0x66,
+ 0x76, 0x65, 0x5d, 0x6f, 0xab, 0xaf, 0x1f, 0xfb,
+ 0x6b, 0xb3, 0x15, 0x13, 0x0, 0xf8, 0x46, 0xf7,
+ 0x63, 0x6f, 0xcf, 0xfc, 0x47, 0xfb, 0x6a, 0x5,
+ 0xe, 0x7c, 0xe7, 0x3b, 0xe8, 0xf7, 0xa, 0xe8,
+ 0xf7, 0x28, 0xe9, 0x12, 0xb8, 0xec, 0x68, 0xec,
+ 0x13, 0xb8, 0xf7, 0x2f, 0xf7, 0xc4, 0x15, 0x4d,
+ 0x6d, 0x5b, 0x4f, 0x45, 0x1a, 0x46, 0xbd, 0x31,
+ 0xf7, 0xb, 0xdb, 0xad, 0xad, 0x9d, 0xa3, 0x1e,
+ 0x13, 0x74, 0xb3, 0x63, 0x5, 0xf7, 0x37, 0xe8,
+ 0xfb, 0xc, 0x6, 0x6f, 0xa4, 0x9f, 0xa8, 0x97,
+ 0xac, 0x98, 0xaa, 0x19, 0xde, 0xe8, 0xfb, 0x27,
+ 0x6, 0x86, 0x73, 0x77, 0x52, 0x7c, 0x71, 0x30,
+ 0xf7, 0xd, 0x18, 0x7c, 0x9f, 0x65, 0xbd, 0xa2,
+ 0x1a, 0xaa, 0xa8, 0x95, 0xae, 0xb5, 0xbe, 0x73,
+ 0x79, 0x98, 0x1e, 0xc2, 0xd0, 0x5, 0xb3, 0x66,
+ 0x4b, 0xa6, 0x4f, 0x1b, 0x38, 0x3d, 0x63, 0x2e,
+ 0x5a, 0xb2, 0x64, 0x93, 0x7b, 0x1f, 0xbe, 0x43,
+ 0x15, 0xe7, 0x6a, 0xa, 0x13, 0xb8, 0x74, 0x77,
+ 0x6d, 0x7d, 0x6c, 0x1b, 0x54, 0x78, 0xb5, 0xa9,
+ 0xb8, 0xb1, 0xa4, 0xa4, 0x9a, 0x1f, 0xe, 0x4c,
+ 0xa, 0xf7, 0x7d, 0xf7, 0x19, 0x3, 0xf7, 0x84,
+ 0xf7, 0xa9, 0x15, 0xf7, 0xb, 0x6, 0x99, 0x59,
+ 0xa, 0xfb, 0x26, 0x6, 0xe, 0x3a, 0x76, 0xf9,
+ 0x62, 0x77, 0x1, 0xf7, 0x47, 0xf7, 0x1, 0x3,
+ 0xf7, 0xd3, 0x25, 0x15, 0xf1, 0x6, 0x53, 0xe2,
+ 0x3e, 0xf7, 0xf, 0xf7, 0x52, 0x1a, 0xf7, 0x2b,
+ 0xc4, 0xc0, 0xd7, 0xf7, 0x6, 0x1e, 0x29, 0x6,
+ 0x32, 0x27, 0x54, 0x27, 0xfb, 0xb, 0x1a, 0xfb,
+ 0x17, 0xa0, 0xfb, 0x0, 0xf7, 0xb, 0xfb, 0x34,
+ 0x1e, 0xe, 0x3a, 0x76, 0xf9, 0x62, 0x77, 0x1,
+ 0xf7, 0xcc, 0xf7, 0x1, 0x3, 0xf7, 0x47, 0x25,
+ 0x15, 0xf1, 0x6, 0xf7, 0xb, 0xf7, 0x34, 0xa0,
+ 0xf7, 0x0, 0xf7, 0x17, 0x1a, 0xf7, 0xb, 0x54,
+ 0xef, 0x32, 0xef, 0x1e, 0x29, 0x6, 0xd7, 0xfb,
+ 0x6, 0xc4, 0x56, 0xfb, 0x2b, 0x1a, 0xfb, 0x52,
+ 0x3e, 0xfb, 0xf, 0x53, 0x34, 0x1e, 0xe, 0xf7,
+ 0x8e, 0xf1, 0x3, 0xf7, 0x22, 0xf7, 0xac, 0x15,
+ 0xdf, 0x4e, 0xd6, 0xf7, 0xc, 0xd6, 0xfb, 0xb,
+ 0xdf, 0xc8, 0x33, 0xf2, 0xf7, 0x1d, 0xad, 0x69,
+ 0xed, 0xfb, 0x14, 0x59, 0x95, 0xf7, 0x1b, 0x5,
+ 0x6b, 0xa, 0x93, 0xfb, 0x19, 0xfb, 0x13, 0xbb,
+ 0x67, 0x28, 0xf7, 0x20, 0x6a, 0x5, 0xe, 0xc7,
+ 0x76, 0xf7, 0x41, 0xe9, 0xf7, 0x40, 0x67, 0xa,
+ 0xed, 0x3, 0xd2, 0xf7, 0x68, 0x15, 0xf7, 0x48,
+ 0xfb, 0x41, 0xed, 0xf7, 0x41, 0xf7, 0x48, 0xe9,
+ 0xfb, 0x48, 0xf7, 0x40, 0x29, 0xfb, 0x40, 0xfb,
+ 0x48, 0x6, 0xe, 0x31, 0x45, 0xa, 0xf7, 0x39,
+ 0xfb, 0x3, 0x15, 0xf7, 0x14, 0x6, 0xf7, 0x22,
+ 0x59, 0xa, 0xfb, 0x3d, 0x6, 0xe, 0xf7, 0x5f,
+ 0xf7, 0x2, 0x1, 0xef, 0xf8, 0x24, 0x3, 0xef,
+ 0xf7, 0x5f, 0x15, 0xf8, 0x24, 0xf7, 0x2, 0xfc,
+ 0x24, 0x6, 0xe, 0x7c, 0xf7, 0x4e, 0x6d, 0xa,
+ 0xd9, 0x15, 0x58, 0xbc, 0x61, 0xc6, 0xc6, 0xbc,
+ 0xb5, 0xbe, 0xbe, 0x5a, 0xb5, 0x50, 0x50, 0x5a,
+ 0x61, 0x58, 0x1e, 0xe, 0x53, 0x76, 0xf9, 0x53,
+ 0x77, 0x1, 0xed, 0xf8, 0x28, 0x3, 0xed, 0x5d,
+ 0x15, 0xd0, 0x6c, 0xf7, 0xe3, 0xf9, 0x34, 0x45,
+ 0xaa, 0x5, 0xe, 0x7c, 0xe8, 0xf8, 0x51, 0xe8,
+ 0x1, 0xe2, 0xed, 0xf7, 0x7c, 0xeb, 0x3, 0xe2,
+ 0xf7, 0xbe, 0x15, 0x42, 0x99, 0xfb, 0x84, 0xf7,
+ 0x5c, 0xf7, 0x60, 0x93, 0xf7, 0x84, 0xd5, 0xd4,
+ 0x78, 0xf7, 0x88, 0xfb, 0x53, 0xfb, 0x66, 0x85,
+ 0xfb, 0x86, 0x3f, 0x1e, 0xed, 0x8c, 0x15, 0xc6,
+ 0x8d, 0x90, 0xf7, 0x39, 0xf7, 0x1, 0x1b, 0xf7,
+ 0x3, 0x90, 0xfb, 0x3c, 0x50, 0x3b, 0x7c, 0xfb,
+ 0x1e, 0x28, 0x20, 0x80, 0xf7, 0x1f, 0xdd, 0x1f,
+ 0xe, 0x8b, 0xe8, 0xf8, 0x9f, 0x77, 0x1, 0xf7,
+ 0x91, 0xec, 0x3, 0xd2, 0x16, 0xf8, 0x5e, 0xe8,
+ 0xfb, 0x47, 0xf8, 0x9f, 0x6, 0xfb, 0x9e, 0x56,
+ 0x5, 0x30, 0x7, 0xf7, 0x3d, 0xad, 0x5, 0xfc,
+ 0x31, 0xfb, 0x4a, 0x7, 0xe, 0x8b, 0xea, 0x2c,
+ 0xf7, 0x34, 0xf7, 0xfe, 0xe9, 0x12, 0xf2, 0xed,
+ 0xf7, 0x6f, 0xee, 0x13, 0x78, 0xdc, 0x16, 0xf8,
+ 0x4a, 0xf7, 0x34, 0x2c, 0x6, 0x13, 0xb8, 0x4a,
+ 0xfb, 0x4c, 0x7, 0xf7, 0x1, 0xe8, 0xf7, 0x3e,
+ 0xf7, 0x17, 0xef, 0x1a, 0xef, 0x42, 0xec, 0xfb,
+ 0x1d, 0x39, 0x43, 0x69, 0x4d, 0x57, 0x1e, 0x34,
+ 0xed, 0x7, 0xdf, 0xe1, 0x90, 0xa6, 0xca, 0xb6,
+ 0x68, 0x48, 0x58, 0xfb, 0xb, 0x28, 0xfb, 0x70,
+ 0xfb, 0x45, 0x1e, 0xe, 0x7c, 0xe8, 0xf7, 0x50,
+ 0xe8, 0xf7, 0x37, 0xe9, 0x12, 0xf8, 0x1b, 0xf2,
+ 0x44, 0xeb, 0x13, 0xe8, 0xdc, 0xb3, 0x15, 0x79,
+ 0xbe, 0xcc, 0x66, 0xed, 0x1b, 0xdb, 0xf7, 0x24,
+ 0xb7, 0xf7, 0x23, 0xe1, 0x5e, 0xaa, 0x5b, 0xac,
+ 0x1f, 0x13, 0xf0, 0xba, 0xa1, 0xa1, 0xc4, 0xc1,
+ 0x1a, 0xf7, 0x6, 0x8a, 0x2a, 0xba, 0x23, 0x1b,
+ 0x40, 0x6a, 0x6f, 0x66, 0x4f, 0x1f, 0xad, 0x42,
+ 0x5, 0xb2, 0xd3, 0x9f, 0x90, 0xb6, 0x1b, 0xc8,
+ 0xb0, 0x77, 0x50, 0x3e, 0x33, 0x84, 0x4e, 0x1f,
+ 0x2e, 0x7, 0x13, 0xe8, 0xe6, 0xe4, 0x7f, 0x39,
+ 0x4d, 0x4f, 0x6b, 0x46, 0x57, 0x56, 0x9b, 0xaf,
+ 0x40, 0x1f, 0xe, 0x8b, 0xe9, 0xdf, 0xe9, 0xf7,
+ 0xec, 0x77, 0x1, 0xf7, 0xe3, 0xeb, 0x3, 0xd4,
+ 0xf7, 0x46, 0x15, 0xf7, 0x9a, 0x37, 0x23, 0x2d,
+ 0xf7, 0xbc, 0xe9, 0x2b, 0xdf, 0xe8, 0xe9, 0x2e,
+ 0xf7, 0xec, 0x24, 0x6, 0xfb, 0x93, 0xfb, 0xf9,
+ 0x5, 0xf7, 0x2, 0x98, 0x15, 0xf7, 0x2c, 0xf7,
+ 0x73, 0x5, 0xfb, 0x73, 0x7, 0xe, 0x7c, 0xe7,
+ 0xf7, 0x75, 0xe5, 0xf7, 0x8, 0xe8, 0x1, 0xf7,
+ 0x9, 0xeb, 0xf7, 0x6c, 0xeb, 0x3, 0xd5, 0xaf,
+ 0x15, 0x7b, 0xb1, 0xeb, 0x68, 0xe1, 0x1b, 0xf7,
+ 0x31, 0xd5, 0xee, 0xf6, 0xf7, 0x7, 0x3f, 0xe1,
+ 0xfb, 0xa, 0x67, 0x63, 0x89, 0x7e, 0x61, 0x1f,
+ 0xf7, 0x17, 0xf7, 0xb2, 0xe8, 0xfc, 0x12, 0xfb,
+ 0xaf, 0x7, 0xbc, 0x52, 0xb3, 0xa8, 0xbd, 0x98,
+ 0xb8, 0x8a, 0x19, 0xd0, 0x8a, 0xc6, 0x64, 0x41,
+ 0x1a, 0x4c, 0x5b, 0x5b, 0x36, 0x48, 0x4d, 0xa3,
+ 0xa1, 0x51, 0x1e, 0xe, 0x7c, 0xe4, 0xf7, 0x69,
+ 0xe9, 0xf7, 0x1c, 0xe6, 0x1, 0xdf, 0xf7, 0x2,
+ 0xf7, 0x6a, 0xec, 0x3, 0xf7, 0x51, 0xf7, 0xee,
+ 0x15, 0xf7, 0x19, 0xa5, 0xf7, 0x1, 0xb1, 0xf7,
+ 0xd, 0x1b, 0xa0, 0xa0, 0x8f, 0x87, 0xa0, 0x1f,
+ 0x92, 0xe9, 0x5, 0x8e, 0x73, 0x73, 0x85, 0x75,
+ 0x1b, 0xfb, 0xf, 0x31, 0x6c, 0x40, 0x46, 0x1f,
+ 0x5f, 0x59, 0x68, 0x32, 0x30, 0x1a, 0xfb, 0x21,
+ 0xce, 0xfb, 0x26, 0xf7, 0x30, 0xf6, 0xe6, 0xde,
+ 0xf7, 0x3, 0xf7, 0x12, 0x45, 0xd7, 0xfb, 0x16,
+ 0x56, 0x75, 0x7f, 0x74, 0x62, 0x1e, 0x90, 0xfb,
+ 0x17, 0x15, 0x8b, 0xa2, 0xd3, 0xdf, 0xdc, 0xa5,
+ 0x5a, 0x53, 0x48, 0x5e, 0x62, 0x51, 0x43, 0x64,
+ 0xd6, 0xcd, 0x1e, 0xe, 0xa0, 0x76, 0xf8, 0x90,
+ 0xe8, 0x1, 0xe5, 0xed, 0x3, 0xf7, 0x5d, 0x16,
+ 0xf6, 0x6, 0xf7, 0x5c, 0xf8, 0x8e, 0x8c, 0xea,
+ 0x5, 0xfc, 0x37, 0xfb, 0x48, 0xed, 0xe2, 0xf7,
+ 0x6e, 0x6, 0xe, 0x7c, 0xe8, 0xf7, 0x53, 0xe9,
+ 0xf7, 0x22, 0xe9, 0x12, 0xde, 0xee, 0x32, 0xee,
+ 0xf7, 0x6c, 0xec, 0x36, 0xec, 0x13, 0xf2, 0xf7,
+ 0x3d, 0xf7, 0xd5, 0x15, 0x58, 0x69, 0x68, 0x57,
+ 0x4d, 0x1a, 0xfb, 0x13, 0xf7, 0x9, 0x4e, 0xef,
+ 0xf7, 0x10, 0xe8, 0xc7, 0xf7, 0x12, 0xcc, 0x6c,
+ 0xbc, 0x55, 0xb0, 0x1e, 0x13, 0xec, 0xb7, 0xac,
+ 0xa8, 0xb8, 0xc9, 0x1a, 0xf0, 0x34, 0xc5, 0xfb,
+ 0xa, 0xfb, 0x16, 0x3e, 0x43, 0x31, 0x54, 0xa7,
+ 0x5c, 0xbb, 0x67, 0x1e, 0xa2, 0xf7, 0x19, 0x15,
+ 0xbb, 0xb7, 0xaa, 0xcb, 0xe0, 0xa2, 0x6b, 0x5d,
+ 0x51, 0x54, 0x6c, 0x56, 0x50, 0x5a, 0xae, 0xc0,
+ 0x1e, 0x13, 0xf2, 0x81, 0xfb, 0xaf, 0x15, 0xc0,
+ 0xc2, 0xb8, 0xca, 0xde, 0xb0, 0x57, 0x5d, 0x4f,
+ 0x69, 0x6d, 0x37, 0x3e, 0x60, 0xb6, 0xba, 0x1e,
+ 0xe, 0x7c, 0xe8, 0xf7, 0x1a, 0xed, 0xf7, 0x68,
+ 0xe9, 0x1, 0xe5, 0xf1, 0xf7, 0x6d, 0xf5, 0x3,
+ 0xdf, 0x81, 0x15, 0x88, 0xa6, 0xa5, 0x89, 0xa4,
+ 0x1b, 0xf7, 0x3c, 0xf7, 0xf, 0xcd, 0xf7, 0x28,
+ 0xb7, 0x1f, 0x97, 0xb3, 0x91, 0xb8, 0xbf, 0x1a,
+ 0xf7, 0x3, 0x6d, 0xf7, 0x42, 0xfb, 0x4e, 0xfb,
+ 0xb, 0x31, 0x2d, 0x26, 0xfb, 0x0, 0xd8, 0x23,
+ 0xf7, 0x13, 0xb6, 0xac, 0x9c, 0x9a, 0xa4, 0x1e,
+ 0xfb, 0xd, 0x6f, 0x3b, 0x5c, 0xfb, 0x14, 0x1b,
+ 0x75, 0x74, 0x8d, 0x8d, 0x73, 0x1f, 0xf7, 0xd3,
+ 0xf7, 0xcd, 0x15, 0x87, 0x8c, 0x6f, 0x3c, 0x37,
+ 0x1b, 0x50, 0x5c, 0xb8, 0xd1, 0xd4, 0xca, 0xa6,
+ 0xb9, 0xe1, 0x97, 0x42, 0x50, 0x95, 0x1f, 0xe,
+ 0x7c, 0xf7, 0x44, 0xe1, 0xf7, 0x44, 0x6d, 0xa,
+ 0xf7, 0xe5, 0x15, 0x37, 0xa, 0xfb, 0x9c, 0x4,
+ 0x37, 0xa, 0xe, 0x31, 0x76, 0xf8, 0x7, 0xf7,
+ 0x44, 0x1, 0xf7, 0x76, 0xf7, 0x6c, 0x3, 0xf7,
+ 0x31, 0xfb, 0x3, 0x15, 0xf7, 0x1c, 0x6, 0xf7,
+ 0x29, 0xf7, 0xad, 0x5, 0xfb, 0x46, 0x6, 0x65,
+ 0xf7, 0x3b, 0x15, 0x37, 0xa, 0xe, 0x5e, 0xa,
+ 0xf7, 0x5c, 0x15, 0xf8, 0x5d, 0xfb, 0x4d, 0x5,
+ 0xe9, 0x7, 0xfb, 0xf6, 0xf7, 0x2a, 0xf7, 0xf6,
+ 0xf7, 0x28, 0x5, 0xe9, 0x7, 0xfc, 0x5d, 0xfb,
+ 0x4c, 0x5, 0xe, 0xf7, 0xa, 0xf1, 0xd7, 0xf1,
+ 0x1, 0xd2, 0xf8, 0x5e, 0x3, 0xd2, 0xf7, 0xbc,
+ 0x15, 0xf8, 0x5e, 0xf1, 0xfc, 0x5e, 0x6, 0xfb,
+ 0xac, 0x4, 0xf8, 0x5e, 0xf1, 0xfc, 0x5e, 0x6,
+ 0xe, 0x5e, 0xa, 0x9a, 0x15, 0xf8, 0x5d, 0xf7,
+ 0x4d, 0x5, 0xf7, 0x9, 0x7, 0xfc, 0x5d, 0xf7,
+ 0x4c, 0x5, 0x2d, 0x7, 0xf7, 0xf9, 0xfb, 0x28,
+ 0xfb, 0xf9, 0xfb, 0x2a, 0x5, 0xe, 0x80, 0xf7,
+ 0x2a, 0xf7, 0xf1, 0xe7, 0x12, 0xed, 0xec, 0x7e,
+ 0xf7, 0x41, 0xbd, 0xeb, 0x13, 0xe8, 0xf7, 0x70,
+ 0xf7, 0x45, 0x15, 0xec, 0xc8, 0x6, 0xc0, 0x97,
+ 0xf7, 0x17, 0xb0, 0xf7, 0x10, 0x1a, 0xf7, 0x1,
+ 0x2b, 0xc7, 0xfb, 0xd, 0x53, 0x3e, 0x7d, 0x77,
+ 0x56, 0x1e, 0xfb, 0x23, 0xec, 0xd6, 0x7, 0xa8,
+ 0x92, 0xae, 0x8f, 0xad, 0x8a, 0x8, 0xc6, 0x8a,
+ 0xc0, 0x76, 0x54, 0x1a, 0x13, 0x90, 0x40, 0x2b,
+ 0x7a, 0x32, 0x7d, 0x1e, 0x13, 0xd8, 0x65, 0xfb,
+ 0x88, 0x15, 0x62, 0xb1, 0x69, 0xbb, 0xbb, 0xb2,
+ 0xad, 0xb4, 0xb4, 0x64, 0xad, 0x5b, 0x5b, 0x65,
+ 0x69, 0x62, 0x1e, 0xe, 0x79, 0xd3, 0xd2, 0xd4,
+ 0xf7, 0x85, 0x77, 0xe6, 0xd0, 0x1, 0x9e, 0xdf,
+ 0xcc, 0xd0, 0xf7, 0x9b, 0xdb, 0x3, 0xf7, 0xea,
+ 0xf7, 0x3b, 0x15, 0x6a, 0xa1, 0xaf, 0x82, 0x9d,
+ 0x1b, 0xc8, 0xf0, 0xc0, 0xf7, 0x26, 0xbd, 0x81,
+ 0xbc, 0x72, 0xb3, 0x1f, 0xde, 0x57, 0x2f, 0xac,
+ 0x30, 0x1b, 0xfb, 0x2d, 0xfb, 0x1e, 0x23, 0xfb,
+ 0x5d, 0xfb, 0x1, 0xbf, 0xfb, 0x4b, 0xf7, 0x78,
+ 0xf7, 0x13, 0xd4, 0xc4, 0xa4, 0xb1, 0x1f, 0x6f,
+ 0xcf, 0x5, 0x54, 0x3d, 0x4c, 0x74, 0x3f, 0x1b,
+ 0xfb, 0x2d, 0x67, 0xf7, 0x1b, 0xe3, 0xc9, 0xa2,
+ 0xf7, 0x3f, 0xf7, 0x4c, 0xf7, 0xb, 0xd2, 0x44,
+ 0x23, 0x3c, 0x69, 0x51, 0x63, 0x7d, 0x77, 0x91,
+ 0xa3, 0x90, 0x8b, 0x8f, 0x8d, 0x91, 0x1f, 0xbe,
+ 0xf7, 0x52, 0x5, 0x46, 0x6, 0x85, 0x79, 0x5,
+ 0xa3, 0x74, 0x7e, 0x8b, 0x7d, 0x1b, 0xfb, 0x4,
+ 0x63, 0xfb, 0xe, 0x3a, 0x35, 0xbe, 0x72, 0xad,
+ 0xac, 0xab, 0x9c, 0xa4, 0xa3, 0x1f, 0x22, 0xd0,
+ 0x15, 0xc3, 0xa5, 0xd4, 0xbc, 0xa3, 0x8d, 0x74,
+ 0x82, 0x70, 0x77, 0xfb, 0x0, 0x4f, 0x7b, 0x86,
+ 0x9d, 0x9f, 0x1e, 0xe, 0x8b, 0xe6, 0xd8, 0xe6,
+ 0xf7, 0x68, 0xe6, 0x1, 0x82, 0x16, 0xf7, 0x8d,
+ 0xe6, 0x31, 0x6, 0xab, 0xd8, 0x5, 0xf7, 0x80,
+ 0x6, 0xae, 0x3e, 0x5, 0x35, 0x30, 0xf7, 0x86,
+ 0xe6, 0x52, 0x6, 0xfb, 0x62, 0xf8, 0x6b, 0x5,
+ 0xfb, 0x90, 0x30, 0xf7, 0x15, 0x6, 0xfb, 0x3f,
+ 0xfc, 0x10, 0x5, 0x4e, 0x6, 0xf7, 0x7c, 0xf7,
+ 0x3c, 0x15, 0xdb, 0xf7, 0x40, 0xd7, 0xfb, 0x40,
+ 0x5, 0xe, 0x8b, 0xe6, 0xf7, 0x2e, 0xe6, 0xf7,
+ 0x1b, 0xe6, 0x12, 0xf7, 0x2, 0xeb, 0xf7, 0x7f,
+ 0xea, 0x4e, 0xeb, 0x13, 0xf4, 0xa7, 0x16, 0xf7,
+ 0xc4, 0x6, 0xf7, 0x49, 0xc5, 0xcf, 0xeb, 0xb8,
+ 0x78, 0xb5, 0x3f, 0xb7, 0x1f, 0x13, 0xf8, 0xb2,
+ 0xa8, 0xa0, 0xb4, 0xb7, 0x1a, 0xcd, 0x5a, 0xe2,
+ 0xfb, 0x2d, 0x1e, 0xfb, 0xc6, 0x30, 0xdd, 0xfc,
+ 0x10, 0x39, 0x6, 0xf7, 0x46, 0xf7, 0x89, 0x15,
+ 0xf7, 0x1b, 0xf7, 0x12, 0x7, 0xe6, 0x9d, 0x67,
+ 0x6e, 0x4d, 0x3e, 0x83, 0x6b, 0x1f, 0xfb, 0x12,
+ 0xfb, 0x89, 0x15, 0xf7, 0x2e, 0xf7, 0x12, 0x7,
+ 0x13, 0xf4, 0xa4, 0xf7, 0xa, 0x8a, 0x3b, 0x4a,
+ 0x55, 0x83, 0x32, 0x1f, 0xe, 0x79, 0xe7, 0xf8,
+ 0x33, 0xe6, 0x1, 0xaa, 0xec, 0xf7, 0xed, 0xeb,
+ 0x3, 0xf8, 0x95, 0xf7, 0x20, 0x15, 0x74, 0x6a,
+ 0x40, 0x60, 0x37, 0x1b, 0xfb, 0x1c, 0x52, 0xf3,
+ 0xf5, 0xf7, 0x2e, 0xf7, 0x8, 0xbe, 0xd6, 0xc1,
+ 0xc1, 0x77, 0x70, 0xb9, 0x1f, 0x22, 0xeb, 0xf7,
+ 0x87, 0x2b, 0x61, 0x7, 0x95, 0x7d, 0x55, 0xab,
+ 0x34, 0x1b, 0xfb, 0x3a, 0xfb, 0xd, 0xfb, 0x10,
+ 0xfb, 0x3f, 0xfb, 0x8, 0xcf, 0xfb, 0x4f, 0xf7,
+ 0x75, 0xda, 0xe0, 0x90, 0xd1, 0xdb, 0x1f, 0x8c,
+ 0x8a, 0x5, 0xe, 0x32, 0xa, 0xf0, 0xeb, 0xf7,
+ 0xaf, 0xf1, 0x3, 0x9d, 0x16, 0xf7, 0x87, 0x6,
+ 0xf7, 0x30, 0xf7, 0x39, 0xce, 0xf7, 0x75, 0xf7,
+ 0x47, 0xfb, 0x9, 0xe6, 0xfb, 0x45, 0x1f, 0xfb,
+ 0xa2, 0x7a, 0xa, 0x6, 0xf7, 0x47, 0x16, 0xf8,
+ 0x10, 0x7, 0xf7, 0x90, 0xaa, 0x39, 0x26, 0xfb,
+ 0x1d, 0x41, 0x4f, 0xfb, 0x65, 0x1f, 0xe, 0x8b,
+ 0xe6, 0x30, 0xf7, 0x58, 0xb8, 0xe5, 0xac, 0xf7,
+ 0x5a, 0x30, 0xe6, 0x12, 0xf7, 0x7, 0xef, 0xf7,
+ 0x3, 0xee, 0xb6, 0xee, 0x13, 0x77, 0xb1, 0x16,
+ 0xf8, 0xa5, 0xf7, 0x58, 0x28, 0x6, 0x13, 0xaf,
+ 0x22, 0xfb, 0x91, 0xf7, 0x2a, 0xf7, 0x3, 0x4a,
+ 0xee, 0xf7, 0x70, 0x28, 0x4a, 0xfb, 0x3, 0xf7,
+ 0x20, 0xf7, 0x91, 0x7, 0x13, 0xb7, 0x20, 0xee,
+ 0xf7, 0x5a, 0xfc, 0xa5, 0x7, 0x13, 0xaf, 0x30,
+ 0xd8, 0xfc, 0x10, 0x3e, 0x7, 0xe, 0x8b, 0xe6,
+ 0xf7, 0x28, 0xe6, 0xae, 0xf7, 0x58, 0x31, 0xe5,
+ 0x90, 0x77, 0x12, 0xf7, 0x6, 0xed, 0xf7, 0x8,
+ 0xed, 0xb2, 0xef, 0x13, 0xd7, 0xad, 0x16, 0xf7,
+ 0xd5, 0xe6, 0xfb, 0x23, 0xf7, 0x28, 0xf7, 0x8,
+ 0x4b, 0xed, 0xf7, 0x70, 0x29, 0x4a, 0xfb, 0x8,
+ 0xf7, 0x21, 0xf7, 0x91, 0x6, 0x13, 0xe7, 0x21,
+ 0xef, 0x7, 0x13, 0xcf, 0xf7, 0x5d, 0x7, 0x13,
+ 0xd7, 0xfc, 0xa7, 0x2b, 0x6, 0xdb, 0x8c, 0x5,
+ 0xfc, 0x10, 0x3b, 0x7, 0xe, 0x79, 0xe9, 0xf1,
+ 0xea, 0xf7, 0x6c, 0xe6, 0x1, 0x99, 0xed, 0xf7,
+ 0xc7, 0xed, 0x3, 0x46, 0xa, 0xda, 0xf7, 0x17,
+ 0xf7, 0x21, 0xe6, 0xc9, 0xed, 0x41, 0xa, 0xfb,
+ 0x5, 0xfb, 0x4d, 0xfb, 0x62, 0xf7, 0x33, 0x2d,
+ 0xf7, 0x36, 0x58, 0xa, 0xe, 0x8b, 0xe6, 0xf7,
+ 0x23, 0xe6, 0xf7, 0x26, 0xe6, 0x1, 0xec, 0xe8,
+ 0xf7, 0x70, 0xe8, 0x3, 0x9f, 0x16, 0xf7, 0x8c,
+ 0xe6, 0x3d, 0xf7, 0x23, 0xf7, 0x70, 0xfb, 0x23,
+ 0x3e, 0x30, 0xf7, 0x8b, 0xe6, 0x3e, 0xf8, 0x10,
+ 0xd8, 0xe6, 0xfb, 0x88, 0x30, 0xd5, 0xfb, 0x26,
+ 0xfb, 0x70, 0xf7, 0x26, 0xd7, 0xe6, 0xfb, 0x8a,
+ 0x30, 0xd8, 0xfc, 0x10, 0x3e, 0x6, 0xe, 0x32,
+ 0xa, 0xf7, 0x8f, 0xf0, 0x60, 0xa, 0xe6, 0xfb,
+ 0x3f, 0xf8, 0x10, 0x74, 0xa, 0xfc, 0x10, 0xfb,
+ 0x42, 0x6, 0xe, 0x79, 0xe5, 0xf8, 0x22, 0xe7,
+ 0x1, 0x9d, 0xed, 0xf7, 0x85, 0xeb, 0x3, 0x9d,
+ 0xbd, 0x15, 0x7a, 0xab, 0xef, 0x58, 0xf5, 0x1b,
+ 0xf7, 0x12, 0xd2, 0xd5, 0xf7, 0x1f, 0x1f, 0xf7,
+ 0xa7, 0xf7, 0x15, 0xe7, 0xfc, 0x24, 0x2f, 0xf7,
+ 0x43, 0xfb, 0xa8, 0x7, 0x49, 0x80, 0x53, 0x2e,
+ 0x3d, 0x50, 0x78, 0xa, 0x32, 0xa, 0xe9, 0xee,
+ 0x3, 0x96, 0x16, 0xf7, 0x9c, 0xe6, 0x39, 0xf7,
+ 0x2, 0x6, 0xc6, 0xc0, 0xcf, 0x34, 0xc5, 0x2a,
+ 0xbe, 0x45, 0x19, 0xf7, 0x34, 0xe6, 0x20, 0x6,
+ 0x5d, 0xce, 0x4c, 0xe1, 0x54, 0xcf, 0xf7, 0x44,
+ 0xf7, 0x33, 0x18, 0xcf, 0xe6, 0xfb, 0x86, 0x30,
+ 0xb6, 0x6, 0xfb, 0x3e, 0xfb, 0x2d, 0x5, 0xf7,
+ 0x2d, 0xda, 0xe6, 0xfb, 0x99, 0x7a, 0xa, 0x7,
+ 0xe, 0x32, 0xa, 0xf7, 0x17, 0xec, 0xf7, 0x86,
+ 0xee, 0x3, 0xa9, 0x16, 0xf8, 0xaf, 0xf7, 0x92,
+ 0x28, 0xfb, 0x37, 0xfb, 0x86, 0xf8, 0x10, 0xf7,
+ 0x14, 0xe6, 0xfb, 0xda, 0x30, 0xf0, 0xfc, 0x10,
+ 0x26, 0x6, 0xe, 0x32, 0xa, 0xd2, 0xe7, 0xf7,
+ 0xab, 0xe7, 0x3, 0x89, 0x16, 0xf7, 0x90, 0xe6,
+ 0x2c, 0x6, 0x9b, 0xf7, 0xce, 0xf1, 0xfb, 0xa2,
+ 0x5, 0xc6, 0x6, 0xf4, 0xf7, 0x9f, 0x96, 0xfb,
+ 0xcb, 0x5, 0x32, 0x30, 0xf7, 0x86, 0xe6, 0x4d,
+ 0x6, 0x81, 0xf8, 0x10, 0x5, 0xd4, 0xe6, 0xfb,
+ 0x52, 0x6, 0x20, 0xfb, 0xac, 0x25, 0xf7, 0xac,
+ 0x5, 0xfb, 0x5f, 0x30, 0xda, 0x6, 0x7b, 0xfc,
+ 0x10, 0x5, 0x4a, 0x6, 0xe, 0x7f, 0xe8, 0xf8,
+ 0x18, 0xe8, 0x1, 0xd8, 0xe8, 0xf7, 0x9a, 0xe5,
+ 0x3, 0x8a, 0x7f, 0x15, 0xf7, 0x8e, 0xe8, 0x3c,
+ 0xf7, 0xd1, 0x6, 0xf7, 0x9a, 0xfc, 0x2e, 0x5,
+ 0xe5, 0xf8, 0x75, 0xda, 0xe8, 0xfb, 0x96, 0x2e,
+ 0xe0, 0xfb, 0xc5, 0x6, 0xfb, 0x8b, 0xf8, 0x22,
+ 0x5, 0xfb, 0x4a, 0x2e, 0xd9, 0xfc, 0x18, 0x3d,
+ 0x6, 0xe, 0x79, 0xe7, 0xf8, 0x30, 0xe9, 0x1,
+ 0xa1, 0xee, 0xf7, 0xfd, 0xeb, 0x3, 0xa1, 0xf7,
+ 0xab, 0x15, 0xfb, 0x5c, 0xf7, 0x25, 0x2a, 0xf7,
+ 0x1a, 0xf2, 0xf7, 0x42, 0xd5, 0xf7, 0x76, 0xf7,
+ 0x21, 0x2f, 0xf7, 0x31, 0xfb, 0x4d, 0xfb, 0x42,
+ 0x22, 0xfb, 0x25, 0xfb, 0x30, 0x1e, 0xeb, 0x8e,
+ 0x15, 0xe9, 0xca, 0xf7, 0x2, 0xf7, 0xc, 0xf7,
+ 0x1d, 0xb9, 0xfb, 0x16, 0x44, 0x38, 0x5a, 0xfb,
+ 0x14, 0xfb, 0x1a, 0xfb, 0xd, 0x4d, 0xf7, 0x0,
+ 0xef, 0x1e, 0xe, 0x8b, 0xe6, 0xef, 0xe7, 0xf7,
+ 0x50, 0xe6, 0x1, 0xf7, 0x13, 0xed, 0xf7, 0x7d,
+ 0xec, 0x3, 0xb7, 0x16, 0xf7, 0xca, 0xe6, 0xfb,
+ 0x15, 0xef, 0x6, 0xf7, 0x8d, 0xdc, 0xbd, 0xf7,
+ 0x17, 0xf7, 0x5f, 0xfb, 0x36, 0x78, 0xfb, 0xf1,
+ 0x91, 0x1f, 0x7a, 0xa, 0x7, 0xf7, 0x49, 0xf7,
+ 0x54, 0x15, 0xf7, 0x50, 0x7, 0xf7, 0x20, 0x84,
+ 0xe8, 0x99, 0x24, 0x1a, 0x26, 0x25, 0x9b, 0xfb,
+ 0x17, 0x84, 0x1e, 0xe, 0xfb, 0x9, 0x76, 0xb8,
+ 0xf7, 0x49, 0xf8, 0x24, 0xe7, 0x12, 0xa6, 0xeb,
+ 0xf7, 0xf7, 0xea, 0x17, 0xf7, 0xa, 0x46, 0x15,
+ 0xb6, 0x46, 0x5, 0xab, 0xc7, 0xa5, 0x98, 0xaf,
+ 0x1b, 0xa9, 0xa4, 0x80, 0x81, 0xa4, 0x1f, 0x81,
+ 0xa3, 0xa4, 0x82, 0xa8, 0x1b, 0xc2, 0xaa, 0xa6,
+ 0xb8, 0xb9, 0x1f, 0x51, 0xca, 0x5, 0x68, 0x66,
+ 0x7e, 0x83, 0x79, 0x1b, 0x73, 0x70, 0x9b, 0xa1,
+ 0x6b, 0x1f, 0xf7, 0x26, 0xb1, 0xca, 0xf7, 0xf,
+ 0xf7, 0x10, 0x1a, 0xde, 0x5a, 0xf7, 0x6b, 0xfb,
+ 0x75, 0xfb, 0x1f, 0xfb, 0x19, 0x27, 0xfb, 0x56,
+ 0xfb, 0x20, 0xd1, 0x2f, 0xf0, 0x62, 0x1e, 0x40,
+ 0xf7, 0xa6, 0x15, 0xf7, 0x2e, 0xf6, 0xba, 0xd0,
+ 0x1e, 0x13, 0x58, 0xf7, 0xb, 0xc7, 0x24, 0x25,
+ 0x1f, 0x13, 0x50, 0xfb, 0x2c, 0x21, 0x60, 0x41,
+ 0x3b, 0x2c, 0xbc, 0xf7, 0x2a, 0x1e, 0xe, 0x8b,
+ 0xe6, 0xf7, 0x18, 0xe6, 0xf7, 0x31, 0xe6, 0x1,
+ 0xec, 0xef, 0xf7, 0x7a, 0xee, 0x3, 0x97, 0x16,
+ 0xf7, 0x9d, 0xe6, 0x3b, 0xf7, 0x18, 0xde, 0x6,
+ 0xe4, 0xfb, 0x9, 0xb6, 0x4d, 0xa9, 0x5f, 0x8,
+ 0xf7, 0x25, 0xe6, 0x33, 0x6, 0xfb, 0x4, 0xf7,
+ 0x2a, 0x5, 0xf6, 0x9d, 0xab, 0xcf, 0xd1, 0x1a,
+ 0xf7, 0x8, 0x27, 0xbc, 0xfb, 0x8, 0x1e, 0xfb,
+ 0xba, 0x30, 0xdc, 0xfc, 0x10, 0x36, 0x6, 0xf7,
+ 0x4d, 0xf7, 0x73, 0x15, 0xf7, 0x31, 0x7, 0xf7,
+ 0x49, 0xbc, 0x92, 0x39, 0x31, 0x39, 0x93, 0xfb,
+ 0x28, 0x1f, 0xe, 0x8b, 0xe3, 0xf8, 0x17, 0xe3,
+ 0x94, 0x77, 0x12, 0xd3, 0xe6, 0x41, 0xe7, 0xf7,
+ 0x80, 0xe6, 0x45, 0xe5, 0x13, 0xd2, 0xd3, 0x16,
+ 0xe6, 0xae, 0x6, 0x81, 0x9f, 0xb9, 0x72, 0xd5,
+ 0x1b, 0xf7, 0xe, 0xf2, 0xcc, 0xf5, 0xf7, 0x24,
+ 0xfb, 0x2a, 0x87, 0x21, 0x9a, 0x1f, 0x13, 0xcc,
+ 0x72, 0x8f, 0x49, 0x95, 0xc5, 0x1a, 0xb5, 0xb9,
+ 0xae, 0xdc, 0xb2, 0xb0, 0x88, 0x7d, 0xac, 0x1e,
+ 0x2e, 0xe6, 0x7, 0x13, 0xb4, 0xf7, 0x63, 0x30,
+ 0x76, 0x7, 0x13, 0xca, 0x99, 0x6a, 0x64, 0x89,
+ 0x62, 0x1b, 0xfb, 0x22, 0x42, 0x32, 0x3d, 0xfb,
+ 0x22, 0xf7, 0x1d, 0x81, 0xf7, 0x6, 0x82, 0x1f,
+ 0xbd, 0x87, 0xbb, 0x78, 0x62, 0x1a, 0x5b, 0x64,
+ 0x68, 0x2b, 0x1e, 0x13, 0xd4, 0x58, 0x5c, 0x9b,
+ 0xa3, 0x61, 0x1f, 0xd3, 0x30, 0x7, 0xe, 0x32,
+ 0xa, 0xb4, 0xee, 0xf7, 0x3, 0xed, 0xf7, 0x3,
+ 0xee, 0x14, 0x38, 0xf7, 0xe, 0x16, 0xf7, 0xe6,
+ 0xe6, 0xfb, 0x3, 0xf8, 0x10, 0xf7, 0x3, 0xfb,
+ 0x5, 0xee, 0xf7, 0x60, 0xfc, 0x9a, 0xfb, 0x60,
+ 0xee, 0xf7, 0x5, 0xf7, 0x3, 0xfc, 0x10, 0xfb,
+ 0x15, 0x6, 0xe, 0x79, 0xe7, 0xf8, 0x20, 0xe7,
+ 0x1, 0xde, 0xe9, 0xf7, 0x8b, 0xe9, 0x3, 0x8f,
+ 0xf8, 0x6a, 0x15, 0xda, 0xfb, 0xa2, 0x6, 0xfb,
+ 0x28, 0xd2, 0x45, 0xf7, 0x25, 0xf7, 0x13, 0xe7,
+ 0xc4, 0xf7, 0x21, 0x1e, 0xf7, 0xb6, 0xd9, 0xe7,
+ 0xfb, 0x96, 0x2f, 0xe1, 0xfb, 0x9a, 0x7, 0x35,
+ 0x73, 0x5b, 0x24, 0xfb, 0x4, 0x83, 0xcb, 0xc0,
+ 0x1e, 0xf7, 0xab, 0xdf, 0xe7, 0xfb, 0x95, 0x7,
+ 0xe, 0xa0, 0x76, 0xf8, 0x6b, 0xe6, 0x1, 0x7e,
+ 0xf7, 0x8a, 0xf7, 0x1a, 0xf7, 0x8a, 0x3, 0xf7,
+ 0x90, 0x16, 0xeb, 0x6, 0xf7, 0x58, 0xf8, 0x6b,
+ 0x5, 0xd0, 0xe6, 0xfb, 0x8a, 0x30, 0xde, 0x6,
+ 0xfb, 0x28, 0xfb, 0xf4, 0xfb, 0x1f, 0xf7, 0xf4,
+ 0x5, 0xd1, 0xe6, 0xfb, 0x8a, 0x30, 0xd8, 0x6,
+ 0xe, 0xa0, 0x76, 0xf8, 0x6b, 0xe6, 0x1, 0xed,
+ 0x16, 0xde, 0x6, 0xf7, 0xa, 0xf7, 0xbc, 0xf7,
+ 0xc, 0xfb, 0xbc, 0x5, 0xdd, 0x6, 0xcf, 0xf8,
+ 0x6b, 0x5, 0xbc, 0xe6, 0xfb, 0x78, 0x30, 0xe1,
+ 0x6, 0x69, 0xfb, 0xab, 0x21, 0xf7, 0x94, 0x5,
+ 0x45, 0x6, 0x23, 0xfb, 0x96, 0x67, 0xf7, 0xad,
+ 0x5, 0xe0, 0xe6, 0xfb, 0x79, 0x30, 0xbc, 0x6,
+ 0xe, 0x32, 0xa, 0x97, 0x16, 0xf7, 0x8c, 0xe6,
+ 0x45, 0x6, 0xf7, 0x1, 0xf7, 0x1b, 0xf7, 0x1,
+ 0xfb, 0x1b, 0x5, 0x4d, 0x30, 0xf7, 0x86, 0xe6,
+ 0x47, 0x6, 0xfb, 0x37, 0xf7, 0x5f, 0xf7, 0x23,
+ 0xf7, 0x45, 0x5, 0xd1, 0xe6, 0xfb, 0x77, 0x30,
+ 0xbb, 0x6, 0x34, 0xfb, 0x0, 0x32, 0xf7, 0x0,
+ 0x5, 0xb7, 0xe6, 0xfb, 0x7a, 0x30, 0xd2, 0x6,
+ 0xf7, 0x25, 0xfb, 0x45, 0xfb, 0x39, 0xfb, 0x5f,
+ 0x5, 0x47, 0x6, 0xe, 0x32, 0xa, 0xf7, 0x8e,
+ 0xec, 0x3, 0xf7, 0x12, 0x16, 0xf7, 0xec, 0xe6,
+ 0xfb, 0xf, 0xf7, 0x1c, 0x6, 0xf7, 0x35, 0xf7,
+ 0x88, 0x5, 0xdb, 0xe6, 0xfb, 0x81, 0x30, 0xc2,
+ 0x6, 0x22, 0xfb, 0x31, 0x22, 0xf7, 0x31, 0x5,
+ 0xc0, 0xe6, 0xfb, 0x82, 0x30, 0xda, 0x6, 0xf7,
+ 0x34, 0xfb, 0x88, 0x5, 0xfb, 0x1c, 0xfb, 0x10,
+ 0x7, 0xe, 0x32, 0xa, 0xcc, 0xed, 0xf7, 0xaa,
+ 0xec, 0x3, 0xc8, 0x16, 0xf8, 0x71, 0xf7, 0x70,
+ 0x2a, 0xfb, 0x15, 0xfb, 0x8d, 0x6, 0xf7, 0xd6,
+ 0xf8, 0x2a, 0x5, 0xcc, 0xfc, 0x55, 0xfb, 0x61,
+ 0xed, 0xf7, 0x6, 0xf7, 0x6c, 0x7, 0xfb, 0xd2,
+ 0xfc, 0x25, 0x5, 0xe, 0x25, 0xe7, 0xf8, 0xaa,
+ 0xe7, 0x1, 0xf7, 0x4d, 0xed, 0x3, 0xf7, 0x4d,
+ 0x25, 0x15, 0xf7, 0x7a, 0xe7, 0xfb, 0x18, 0xf8,
+ 0xaa, 0xf7, 0x18, 0xe7, 0xfb, 0x7a, 0x6, 0xe,
+ 0x53, 0x76, 0xf9, 0x53, 0x77, 0x1, 0xf8, 0x43,
+ 0x3e, 0x15, 0xd2, 0xa8, 0xfb, 0xe1, 0xf9, 0x36,
+ 0x44, 0x6e, 0x5, 0xe, 0x25, 0xe7, 0xf8, 0xaa,
+ 0xe7, 0x1, 0xf7, 0xd2, 0xec, 0x3, 0xf7, 0x4d,
+ 0x81, 0x15, 0x2f, 0xf7, 0x7a, 0xf9, 0x62, 0xfb,
+ 0x7a, 0x2f, 0xf7, 0x19, 0xfc, 0xaa, 0x7, 0xe,
+ 0xf7, 0xa3, 0x76, 0xf8, 0x2, 0x77, 0x1, 0xf7,
+ 0x0, 0xf7, 0x8e, 0x15, 0xd3, 0xb1, 0xce, 0xcc,
+ 0xc1, 0xd8, 0xc2, 0x3a, 0xcb, 0x4e, 0xd3, 0x66,
+ 0x8, 0xcb, 0x7, 0x30, 0xf7, 0x2, 0x6c, 0xc2,
+ 0x66, 0xf7, 0x1c, 0x8, 0x47, 0x6, 0x6b, 0xfb,
+ 0x14, 0x68, 0x45, 0x31, 0x23, 0x8, 0xe, 0xfb,
+ 0x11, 0xbd, 0x1, 0x40, 0x4, 0x59, 0xf8, 0xec,
+ 0xbd, 0x7, 0xe, 0xf8, 0xa5, 0x76, 0xf7, 0x2d,
+ 0x77, 0x1, 0xf7, 0x3c, 0xf8, 0xcd, 0x15, 0xf7,
+ 0x89, 0x4e, 0x9d, 0xbb, 0xfb, 0x7b, 0xf4, 0x5,
+ 0xe, 0x7c, 0xe9, 0x3a, 0xe9, 0xf1, 0xed, 0xd0,
+ 0xe8, 0x34, 0xa, 0x13, 0xbc, 0xf4, 0xf7, 0xcf,
+ 0x15, 0x9a, 0xa8, 0xe6, 0xaa, 0xd3, 0x1b, 0xbe,
+ 0xb4, 0x75, 0x5c, 0x1f, 0x7f, 0x7, 0x92, 0x67,
+ 0x68, 0x90, 0x6c, 0x1b, 0xfb, 0x33, 0x2b, 0x48,
+ 0x2d, 0x2d, 0xeb, 0x57, 0xed, 0xc8, 0xc9, 0x9e,
+ 0xb4, 0xb3, 0x1f, 0x13, 0x7a, 0x5c, 0xf7, 0x46,
+ 0xe9, 0x7, 0x13, 0x7c, 0x38, 0xf7, 0x3a, 0x6,
+ 0xf7, 0x11, 0x6e, 0xd2, 0xfb, 0x29, 0x31, 0x28,
+ 0x67, 0x75, 0x58, 0x1e, 0xf7, 0xd7, 0xfb, 0x83,
+ 0x15, 0x13, 0xbc, 0x60, 0x5b, 0x4f, 0x68, 0x47,
+ 0x1b, 0x60, 0x62, 0x9e, 0xab, 0xb8, 0xd7, 0x9e,
+ 0xc6, 0xc6, 0xb6, 0x86, 0x89, 0xa2, 0x1f, 0xe,
+ 0x7c, 0xe8, 0x3b, 0xe9, 0xf7, 0x9d, 0xe7, 0xde,
+ 0xe9, 0x12, 0x93, 0xf7, 0x4c, 0x28, 0xee, 0xf7,
+ 0xbf, 0xf0, 0x13, 0x7a, 0x94, 0x89, 0x15, 0xf7,
+ 0x4b, 0xb1, 0x6, 0x13, 0xba, 0x68, 0xbb, 0xc2,
+ 0x7b, 0xc0, 0x1b, 0xf7, 0x12, 0xf7, 0xa, 0xea,
+ 0xf7, 0x1f, 0xf7, 0x1b, 0xfb, 0x7, 0xea, 0xfb,
+ 0x12, 0x55, 0x53, 0x7d, 0x67, 0x5a, 0x1f, 0xf7,
+ 0x77, 0xfb, 0x4c, 0x2d, 0x7, 0x13, 0x76, 0xe0,
+ 0xfc, 0x4c, 0x37, 0x6, 0xf7, 0x48, 0xf7, 0x10,
+ 0x15, 0xd6, 0xb8, 0xcd, 0xf7, 0x0, 0xf7, 0x0,
+ 0xb4, 0x34, 0x59, 0x1e, 0x13, 0xba, 0x3e, 0x4b,
+ 0x4a, 0x34, 0x5d, 0x22, 0xa6, 0xf7, 0x3, 0x1e,
+ 0xe, 0x7c, 0xe9, 0xf7, 0xb2, 0xe9, 0x1, 0xba,
+ 0xeb, 0xf7, 0xab, 0xeb, 0x3, 0xf8, 0x3a, 0xf7,
+ 0x8b, 0x15, 0xeb, 0xf7, 0x68, 0x2b, 0x78, 0x6,
+ 0x98, 0x68, 0x65, 0x91, 0x65, 0x1b, 0xfb, 0x49,
+ 0x38, 0xfb, 0x11, 0xfb, 0x4, 0xfb, 0x2b, 0xf7,
+ 0x11, 0x35, 0xf7, 0x12, 0xeb, 0xe4, 0xb4, 0xc2,
+ 0xd0, 0x1f, 0x55, 0xd5, 0x5, 0x62, 0x52, 0x54,
+ 0x68, 0x3c, 0x1b, 0x39, 0x39, 0xbb, 0xe9, 0xdc,
+ 0xcb, 0xca, 0xf3, 0xb2, 0xb3, 0x81, 0x7a, 0xab,
+ 0x1f, 0xe, 0x7c, 0xe9, 0x3a, 0xe9, 0xf7, 0x9d,
+ 0xe9, 0xdc, 0xe9, 0x12, 0x99, 0xec, 0xf7, 0xbe,
+ 0xec, 0x2a, 0xf7, 0x44, 0x13, 0x7a, 0xf8, 0x2f,
+ 0x89, 0x15, 0xf7, 0x42, 0xe9, 0x3c, 0x6, 0x13,
+ 0x7c, 0xf8, 0xaa, 0xfb, 0x72, 0x2d, 0xf7, 0x11,
+ 0xfb, 0x17, 0x7, 0xad, 0x65, 0x52, 0x9b, 0x53,
+ 0x1b, 0xfb, 0x24, 0x27, 0xfb, 0x3, 0xfb, 0xe,
+ 0xfb, 0x11, 0xf4, 0xfb, 0x0, 0xf7, 0x23, 0x1f,
+ 0x13, 0xbc, 0xc2, 0xc1, 0x9c, 0xab, 0xb3, 0x1f,
+ 0xfb, 0xc0, 0xf7, 0x4e, 0x15, 0xd9, 0xcd, 0xc6,
+ 0xe2, 0xe6, 0xc1, 0x4c, 0x3e, 0xfb, 0xd, 0xfb,
+ 0x7, 0x7a, 0x69, 0x3a, 0x47, 0xc8, 0xdb, 0x1e,
+ 0xe, 0x7c, 0xe8, 0xee, 0xea, 0xe3, 0xe9, 0x1,
+ 0xf7, 0x22, 0xf7, 0x45, 0x15, 0xf8, 0x22, 0x6,
+ 0xf7, 0x3a, 0x9f, 0x29, 0xf7, 0x3, 0xfb, 0x37,
+ 0x1b, 0xfb, 0xe, 0xfb, 0x1f, 0x3c, 0xfb, 0x32,
+ 0xfb, 0xe, 0xe4, 0xfb, 0x2, 0xf7, 0x41, 0xe8,
+ 0xe7, 0xaa, 0xb6, 0xd7, 0x1f, 0x5f, 0xda, 0x5,
+ 0x6c, 0x4a, 0x44, 0x6e, 0x3d, 0x1b, 0xfb, 0x10,
+ 0x6b, 0xcc, 0xad, 0x86, 0x1f, 0x8d, 0xea, 0x15,
+ 0xc5, 0xa0, 0xce, 0xa9, 0xc9, 0x1b, 0xc9, 0xc9,
+ 0x78, 0x46, 0x9e, 0x1f, 0xe, 0x7c, 0xa, 0xe8,
+ 0xeb, 0xe7, 0x1, 0xf7, 0x44, 0xf5, 0x3, 0xcf,
+ 0x16, 0xf8, 0x50, 0xe9, 0xfb, 0x7a, 0xf7, 0x8f,
+ 0xf7, 0x7a, 0xe8, 0xfb, 0x7a, 0xae, 0x6, 0xb1,
+ 0x8d, 0xa2, 0xdb, 0xbd, 0xa9, 0x84, 0x80, 0xb9,
+ 0x1e, 0xb5, 0xe7, 0x5, 0x96, 0x35, 0x4d, 0x92,
+ 0x5a, 0x1b, 0x24, 0x53, 0x51, 0x24, 0x1f, 0x70,
+ 0xfb, 0x0, 0x2e, 0xf7, 0x0, 0xfb, 0x8f, 0xfb,
+ 0x0, 0x7, 0xe, 0xfb, 0x26, 0xe4, 0xf1, 0xe3,
+ 0xf7, 0x71, 0xe4, 0x3e, 0xe3, 0x69, 0xa, 0x13,
+ 0xec, 0x50, 0xa, 0xe9, 0xf2, 0x1f, 0xf7, 0xc3,
+ 0x7, 0x13, 0xea, 0xd7, 0xe4, 0xfb, 0x3c, 0x6e,
+ 0x6, 0x13, 0xdc, 0x5a, 0xa, 0xfb, 0x9, 0xee,
+ 0x36, 0xf7, 0x21, 0xc0, 0xbe, 0x94, 0xa7, 0xb1,
+ 0x1f, 0x67, 0x7, 0x51, 0x88, 0x5e, 0x42, 0xa,
+ 0x63, 0x33, 0x43, 0x44, 0xb7, 0xd2, 0x1e, 0xe,
+ 0x8b, 0xe9, 0xf7, 0x8b, 0xe8, 0xed, 0xe9, 0x12,
+ 0x91, 0xf7, 0x48, 0x2a, 0xec, 0xf7, 0x77, 0xec,
+ 0x13, 0xf4, 0x91, 0x16, 0xf7, 0x96, 0xe9, 0x3d,
+ 0xf7, 0x61, 0x6, 0xbd, 0xd5, 0xc2, 0x94, 0xa8,
+ 0x1b, 0xc3, 0x98, 0x6a, 0x69, 0x1f, 0xfb, 0x59,
+ 0x3d, 0x2d, 0xf7, 0x96, 0xe9, 0x38, 0xf7, 0x52,
+ 0x7, 0xd8, 0x71, 0xe5, 0xfb, 0x1f, 0x4e, 0x5b,
+ 0x75, 0x71, 0x59, 0x1e, 0xf7, 0x73, 0xfb, 0x48,
+ 0x2d, 0x7, 0x13, 0xec, 0xde, 0xfc, 0x4a, 0x6,
+ 0x13, 0xf4, 0x38, 0x6, 0xe, 0x8b, 0xea, 0xf7,
+ 0x92, 0xeb, 0xd1, 0xf7, 0x23, 0x12, 0xf7, 0x83,
+ 0xf7, 0x3, 0x29, 0xed, 0x13, 0xf0, 0xf7, 0x83,
+ 0xf8, 0x97, 0x79, 0xa, 0x6b, 0xa, 0xfb, 0x36,
+ 0xfd, 0x26, 0x15, 0xf8, 0x52, 0xea, 0xfb, 0x41,
+ 0xf7, 0xf2, 0xfb, 0x7f, 0x2b, 0x6, 0x13, 0xe8,
+ 0xf7, 0x1d, 0xfb, 0x92, 0xfb, 0x43, 0x6, 0xe,
+ 0xfb, 0x26, 0xe7, 0xf8, 0x37, 0xe6, 0xc5, 0xf7,
+ 0x24, 0x12, 0xf7, 0xf4, 0xf7, 0xa, 0x35, 0xf3,
+ 0x13, 0xf0, 0xf7, 0xf4, 0xf8, 0x96, 0x73, 0xa,
+ 0xfb, 0x6d, 0xfd, 0x49, 0x15, 0x73, 0x30, 0x5,
+ 0x81, 0xc2, 0xc4, 0x81, 0xc4, 0x1b, 0x13, 0xe8,
+ 0xf7, 0x63, 0x8c, 0xf7, 0x1b, 0xc6, 0x1f, 0xf8,
+ 0x2c, 0xfc, 0x2, 0x30, 0xf7, 0x9a, 0xfb, 0xcd,
+ 0x7, 0x46, 0x81, 0x66, 0x31, 0x55, 0x4d, 0x98,
+ 0x91, 0x6a, 0x1e, 0xe, 0x7c, 0xa, 0xe9, 0xe8,
+ 0xe9, 0x1, 0xec, 0xed, 0x3, 0x9c, 0x16, 0xf7,
+ 0x46, 0xf7, 0x3e, 0x6, 0xaf, 0xa2, 0xf7, 0xe,
+ 0x28, 0x5, 0x70, 0x2d, 0xf7, 0x94, 0xe9, 0xfb,
+ 0x0, 0x6, 0xfb, 0x41, 0xf7, 0x25, 0xf7, 0x37,
+ 0xf5, 0x5, 0xda, 0xe9, 0xfb, 0xb1, 0x2d, 0xd2,
+ 0x6, 0xfb, 0x1a, 0x39, 0x5, 0xf7, 0xff, 0xfb,
+ 0x46, 0x2d, 0xdb, 0xfc, 0x4a, 0x3b, 0x7, 0xe,
+ 0x8b, 0xe9, 0xf8, 0x4a, 0x40, 0xa, 0xf8, 0xa8,
+ 0xfb, 0x92, 0x2d, 0xf7, 0x2f, 0xfc, 0x4a, 0xfb,
+ 0x41, 0x6, 0xe, 0x90, 0xe9, 0xf7, 0x99, 0xe9,
+ 0x1, 0xc1, 0xe9, 0xf7, 0x3, 0xe6, 0xf7, 0x5,
+ 0xe7, 0x3, 0x73, 0x16, 0xf7, 0x8e, 0xe9, 0x3d,
+ 0xf7, 0x7b, 0x6, 0x9e, 0x9d, 0xa2, 0x9b, 0xa3,
+ 0x1b, 0xb1, 0x93, 0x6a, 0x77, 0x1f, 0xfb, 0xc7,
+ 0xf7, 0x38, 0xe9, 0x42, 0xf7, 0x73, 0x7, 0xad,
+ 0xa4, 0xa6, 0x94, 0x9c, 0x1b, 0xac, 0x96, 0x6d,
+ 0x81, 0x1f, 0xfb, 0xd4, 0xf7, 0x35, 0xe9, 0x46,
+ 0xf7, 0x72, 0x7, 0xd7, 0x5a, 0xc9, 0x38, 0x62,
+ 0x61, 0x79, 0x6c, 0x71, 0x1e, 0xb5, 0x72, 0x66,
+ 0x92, 0x73, 0x1b, 0x6c, 0x6d, 0x7f, 0x74, 0x78,
+ 0x1f, 0xa1, 0xfb, 0x40, 0x2d, 0xd9, 0xfb, 0x91,
+ 0x3d, 0x7, 0xe, 0x8b, 0xe9, 0xf7, 0x91, 0xe9,
+ 0x3b, 0xe8, 0x12, 0x98, 0xf7, 0x48, 0xf7, 0x75,
+ 0xea, 0x13, 0xb8, 0x9a, 0x16, 0xf7, 0x97, 0xe9,
+ 0x3a, 0xf7, 0x67, 0x6, 0xb7, 0xbd, 0xcf, 0x97,
+ 0xa9, 0x1b, 0xd1, 0x92, 0x55, 0x64, 0x1f, 0xfb,
+ 0x42, 0x46, 0x2d, 0xf7, 0x82, 0xe9, 0x41, 0xf7,
+ 0x42, 0x7, 0xf7, 0x12, 0x60, 0xc7, 0xfb, 0xc,
+ 0x52, 0x51, 0x79, 0x6f, 0x61, 0x1e, 0x13, 0xd0,
+ 0xac, 0xfb, 0x48, 0x2d, 0xde, 0xfb, 0x91, 0x3a,
+ 0x7, 0xe, 0x7c, 0xe9, 0xf7, 0xad, 0xe9, 0x4b,
+ 0xa, 0xa9, 0xf7, 0x6d, 0x15, 0xfb, 0x40, 0xf7,
+ 0x2f, 0x4f, 0xf7, 0x6, 0xf7, 0xe, 0xf7, 0x29,
+ 0xce, 0xf7, 0x39, 0xf7, 0x31, 0xfb, 0x18, 0xdb,
+ 0xfb, 0x1f, 0xfb, 0x1d, 0xfb, 0x18, 0x3b, 0xfb,
+ 0x31, 0x1e, 0xef, 0x16, 0xe2, 0xd6, 0xc3, 0xe9,
+ 0xe7, 0xdb, 0x50, 0x37, 0x28, 0x36, 0x64, 0x34,
+ 0x3c, 0x31, 0xb2, 0xee, 0x1e, 0xe, 0xfb, 0x22,
+ 0xe3, 0xd6, 0xe2, 0xf7, 0x89, 0xe3, 0x40, 0xe3,
+ 0x12, 0x9c, 0xf7, 0x43, 0x2c, 0xea, 0xf7, 0xbd,
+ 0xeb, 0x13, 0xda, 0x9c, 0x55, 0x15, 0x33, 0xf7,
+ 0xcc, 0xe3, 0xfb, 0x1d, 0xf7, 0xe, 0x7, 0x7d,
+ 0xa1, 0xc1, 0x6a, 0xd9, 0x1b, 0xf7, 0x1f, 0xef,
+ 0xed, 0xf7, 0xd, 0xf7, 0x28, 0xfb, 0x21, 0xcd,
+ 0x25, 0x56, 0x52, 0x7b, 0x6d, 0x63, 0x1f, 0x13,
+ 0xe6, 0xac, 0xfb, 0x46, 0x33, 0xde, 0xfc, 0x2b,
+ 0x7, 0x13, 0xda, 0xe6, 0xf7, 0xb8, 0x15, 0xf7,
+ 0x1, 0xf7, 0x4, 0x9e, 0xb4, 0xd9, 0xd1, 0x5e,
+ 0x38, 0x3c, 0x43, 0x58, 0x3e, 0x5f, 0xfb, 0x0,
+ 0xa4, 0xf4, 0x1e, 0xe, 0xf8, 0xda, 0x55, 0x15,
+ 0x33, 0xfb, 0xcc, 0xe3, 0xf7, 0x1d, 0xf7, 0xe,
+ 0x7, 0x7d, 0x75, 0x55, 0x6a, 0x3d, 0x1b, 0xfb,
+ 0x1f, 0x27, 0xed, 0xf7, 0xd, 0xf7, 0x28, 0xf7,
+ 0x21, 0xcd, 0xf1, 0xc0, 0xc4, 0x7b, 0x6d, 0xb3,
+ 0x1f, 0xac, 0xf7, 0x46, 0x33, 0x38, 0xfc, 0x2b,
+ 0x7, 0x30, 0xf7, 0xb8, 0x15, 0xf7, 0x1, 0xfb,
+ 0x4, 0x9e, 0x62, 0x3d, 0x45, 0x5e, 0x38, 0x3c,
+ 0xd3, 0x58, 0xd8, 0xb7, 0xf7, 0x0, 0xa4, 0xf4,
+ 0x1e, 0xe, 0x8b, 0xe9, 0xf7, 0x90, 0xe9, 0x3b,
+ 0xe9, 0x12, 0xf7, 0x28, 0xee, 0x13, 0xb0, 0xac,
+ 0x16, 0xf8, 0x21, 0xe9, 0xfb, 0x4b, 0xf7, 0x35,
+ 0x6, 0xae, 0xba, 0xd1, 0xd1, 0xd6, 0x1b, 0xa5,
+ 0x8f, 0x81, 0x71, 0x8e, 0x1f, 0xe9, 0x99, 0x5,
+ 0xb3, 0x89, 0x77, 0xd7, 0x22, 0x1b, 0x41, 0x4b,
+ 0x5e, 0x63, 0x55, 0x1f, 0x13, 0xd0, 0xd2, 0xfb,
+ 0x6a, 0x2d, 0xf7, 0x7, 0xfb, 0x90, 0xfb, 0x7,
+ 0x7, 0xe, 0x7a, 0xeb, 0xeb, 0xe3, 0x9b, 0xf7,
+ 0x48, 0x2b, 0xeb, 0x12, 0xcd, 0xed, 0x36, 0xe0,
+ 0x36, 0xea, 0xf7, 0x84, 0xee, 0x40, 0xea, 0x13,
+ 0xe8, 0x80, 0xcd, 0x7a, 0x15, 0xed, 0xad, 0x6,
+ 0x72, 0xb9, 0xc1, 0x82, 0xc2, 0x1b, 0xf7, 0xb,
+ 0xea, 0xc4, 0xe6, 0xf5, 0x21, 0x9f, 0x35, 0x91,
+ 0x1f, 0x13, 0xd3, 0x0, 0x2b, 0x93, 0x44, 0x91,
+ 0xb2, 0x1a, 0xb5, 0xe5, 0x90, 0xa2, 0xb7, 0xc2,
+ 0x80, 0x72, 0xa7, 0x1e, 0x13, 0xe5, 0x0, 0x5b,
+ 0xee, 0xf7, 0x48, 0x28, 0x69, 0x7, 0xa0, 0x6e,
+ 0x50, 0x98, 0x5c, 0x1b, 0x2e, 0x20, 0x64, 0x25,
+ 0xfb, 0x12, 0xf7, 0x2a, 0x81, 0xd6, 0x84, 0x1f,
+ 0x13, 0xe8, 0x80, 0xaf, 0x88, 0xed, 0x8a, 0x63,
+ 0x1a, 0x69, 0x47, 0x79, 0x53, 0x44, 0x54, 0x96,
+ 0x9e, 0x73, 0x1e, 0x13, 0xe9, 0x0, 0xd0, 0x29,
+ 0x7, 0xe, 0x7c, 0xe6, 0xf7, 0x99, 0xe8, 0xf7,
+ 0x18, 0x77, 0x1, 0xf7, 0x11, 0xee, 0x3, 0xc4,
+ 0xf7, 0xe5, 0x15, 0xcf, 0xfb, 0x57, 0x6, 0xfb,
+ 0x1d, 0xf7, 0x0, 0x77, 0xd7, 0xdc, 0xdd, 0xab,
+ 0xa6, 0xd1, 0x1e, 0x7a, 0xe8, 0x5, 0x7a, 0x65,
+ 0xfb, 0x0, 0x5f, 0x47, 0x1b, 0x39, 0x86, 0xb7,
+ 0xb6, 0x1f, 0xf7, 0x42, 0xf7, 0x9e, 0xe8, 0xfb,
+ 0x9e, 0xf7, 0x18, 0x28, 0xfb, 0x18, 0x47, 0x7,
+ 0xe, 0x7c, 0xe7, 0x3c, 0xe9, 0xf7, 0x91, 0xe9,
+ 0x12, 0x9a, 0xf7, 0x43, 0x2c, 0xea, 0xf7, 0x22,
+ 0xf7, 0x42, 0x2b, 0xeb, 0x2b, 0xf7, 0x43, 0x13,
+ 0xb4, 0x9a, 0xf7, 0xed, 0x15, 0x13, 0xaa, 0xdb,
+ 0xfb, 0x4e, 0x6, 0xfb, 0x5, 0xd0, 0x4e, 0xf7,
+ 0x1, 0xc0, 0xc2, 0xa6, 0xa7, 0xa8, 0x1e, 0x13,
+ 0x71, 0x61, 0xf7, 0x43, 0xe9, 0x7, 0x13, 0x74,
+ 0x3c, 0xf7, 0xef, 0xfb, 0x42, 0x2d, 0x6, 0x13,
+ 0xb2, 0xd9, 0xfb, 0x56, 0x6, 0x6c, 0x69, 0x65,
+ 0x60, 0x4d, 0x1b, 0x38, 0x88, 0xc4, 0xa2, 0x1f,
+ 0xf7, 0xae, 0xfb, 0x43, 0x7, 0xe, 0xa0, 0x76,
+ 0xf7, 0xed, 0xe9, 0x1, 0xf7, 0x98, 0x16, 0xe3,
+ 0x6, 0xf7, 0x3c, 0xf7, 0xed, 0x5, 0xe0, 0xe9,
+ 0xfb, 0x86, 0x2d, 0xc8, 0x6, 0xfb, 0x7, 0xfb,
+ 0x82, 0xfb, 0x8, 0xf7, 0x82, 0x5, 0xcf, 0xe9,
+ 0xfb, 0x96, 0x2d, 0xe0, 0x6, 0xe, 0xa0, 0x76,
+ 0xf7, 0xed, 0xe9, 0x1, 0x79, 0xf7, 0x6d, 0xf7,
+ 0x64, 0xf7, 0x67, 0x3, 0xf7, 0x24, 0x16, 0xda,
+ 0x6, 0xd5, 0xf7, 0x68, 0xe1, 0xfb, 0x68, 0x5,
+ 0xd7, 0x6, 0xf7, 0x2, 0xf7, 0xed, 0x5, 0xbc,
+ 0xe9, 0xfb, 0x67, 0x2d, 0xd3, 0x6, 0x4f, 0xfb,
+ 0x57, 0x36, 0xf7, 0x6f, 0x5, 0x49, 0x6, 0x3d,
+ 0xfb, 0x6f, 0x4e, 0xf7, 0x57, 0x5, 0xd1, 0xe9,
+ 0xfb, 0x6d, 0x2d, 0xbc, 0x6, 0xe, 0x7c, 0xa,
+ 0xe9, 0x1, 0x91, 0x16, 0xf7, 0x91, 0xe9, 0x62,
+ 0x6, 0xda, 0xd8, 0xdd, 0x3e, 0x5, 0x64, 0x2d,
+ 0xf7, 0x92, 0xe9, 0x37, 0x6, 0xfb, 0x28, 0xf7,
+ 0x1c, 0xf7, 0x10, 0xf7, 0x7, 0x5, 0xdc, 0xe9,
+ 0xfb, 0x75, 0x2d, 0x9e, 0x6, 0x4f, 0x52, 0x49,
+ 0xc4, 0x5, 0xa1, 0xe9, 0xfb, 0x82, 0x2d, 0xe1,
+ 0x6, 0xf7, 0x14, 0xfb, 0x9, 0xfb, 0x22, 0xfb,
+ 0x1a, 0x5, 0x36, 0x6, 0xe, 0xfb, 0x22, 0xe3,
+ 0xf8, 0x29, 0xe3, 0x12, 0x13, 0xc0, 0xb4, 0x55,
+ 0x15, 0x33, 0xf7, 0xb4, 0xe3, 0x48, 0x7, 0xf7,
+ 0x9e, 0xf8, 0x29, 0x5, 0xd6, 0xe3, 0xfb, 0x80,
+ 0x33, 0xc3, 0x6, 0xfb, 0x14, 0xfb, 0x55, 0xfb,
+ 0x6, 0xf7, 0x55, 0x5, 0xc6, 0xe3, 0xfb, 0x86,
+ 0x33, 0xd7, 0x6, 0xf7, 0x3b, 0xfb, 0xa8, 0x35,
+ 0xfb, 0x15, 0x5, 0xe, 0x8b, 0xe9, 0x2d, 0xf7,
+ 0x51, 0xd4, 0xf7, 0x45, 0x2e, 0xe8, 0x12, 0xea,
+ 0xec, 0xf7, 0x7a, 0xec, 0x13, 0x6c, 0xdb, 0x16,
+ 0xf8, 0x4b, 0xf7, 0x51, 0x2a, 0x6, 0x13, 0xac,
+ 0x2c, 0xfb, 0x51, 0x7, 0xf7, 0xb2, 0xf7, 0xa9,
+ 0x5, 0xcf, 0xfc, 0x3c, 0xfb, 0x45, 0xec, 0x7,
+ 0x13, 0x9c, 0xdf, 0xf7, 0x41, 0x7, 0xfb, 0xb1,
+ 0xfb, 0xa6, 0x5, 0xe, 0xf7, 0x86, 0xe4, 0x3,
+ 0xf8, 0x6b, 0xfb, 0x88, 0x15, 0xe8, 0x7, 0x65,
+ 0x64, 0x8b, 0x95, 0x69, 0x1f, 0x75, 0x92, 0x84,
+ 0xa5, 0xa1, 0x1a, 0xf7, 0x28, 0x7, 0xd4, 0x6a,
+ 0xde, 0x4d, 0xae, 0x1e, 0xc9, 0xae, 0xac, 0xdc,
+ 0xd4, 0x1a, 0xf7, 0x28, 0x7, 0xa1, 0x92, 0xa5,
+ 0xa1, 0x92, 0x1e, 0x95, 0xad, 0xb2, 0x8b, 0xb1,
+ 0x1b, 0xe8, 0x7, 0x5b, 0x4f, 0x8b, 0x79, 0x5d,
+ 0x1f, 0x56, 0x76, 0x75, 0x52, 0x5c, 0x1a, 0xfb,
+ 0x9, 0x7, 0xfb, 0x0, 0x82, 0x49, 0x22, 0x7c,
+ 0x1e, 0x2d, 0x7, 0xf4, 0x7c, 0x94, 0x49, 0xfb,
+ 0x0, 0x1a, 0xfb, 0x9, 0x7, 0x5c, 0xa1, 0x52,
+ 0xc0, 0x76, 0x1e, 0x79, 0xb9, 0xc7, 0x8b, 0xbb,
+ 0x1b, 0xe, 0xfb, 0x79, 0x76, 0xfa, 0x7c, 0x6e,
+ 0xa, 0xfb, 0x8e, 0x15, 0xe5, 0xfa, 0x7c, 0x31,
+ 0x6, 0xe, 0xf7, 0xa0, 0xe4, 0x3, 0xf7, 0x14,
+ 0xfb, 0x2c, 0x15, 0x2f, 0x7, 0xbb, 0xc6, 0x8b,
+ 0x9d, 0xba, 0x1f, 0xbf, 0x9f, 0xa2, 0xc5, 0xba,
+ 0x1a, 0xf7, 0x9, 0x7, 0xf7, 0x0, 0x94, 0xcc,
+ 0xf4, 0x9b, 0x1e, 0xe9, 0x7, 0x22, 0x9b, 0x82,
+ 0xcc, 0xf7, 0x0, 0x1a, 0xf7, 0x9, 0x7, 0xba,
+ 0x75, 0xc5, 0x56, 0x9f, 0x1e, 0x9d, 0x5c, 0x50,
+ 0x8b, 0x5b, 0x1b, 0x2e, 0x7, 0xb2, 0xb0, 0x8b,
+ 0x81, 0xae, 0x1f, 0xa2, 0x84, 0x91, 0x72, 0x74,
+ 0x1a, 0xfb, 0x28, 0x7, 0x43, 0xac, 0x39, 0xc9,
+ 0x68, 0x1e, 0x4d, 0x68, 0x6a, 0x38, 0x42, 0x1a,
+ 0xfb, 0x28, 0x7, 0x74, 0x85, 0x72, 0x74, 0x84,
+ 0x1e, 0x80, 0x67, 0x67, 0x8b, 0x64, 0x1b, 0xe,
+ 0xf7, 0x45, 0xef, 0x62, 0xf0, 0x12, 0x13, 0x40,
+ 0xd1, 0xf7, 0x67, 0x15, 0xcc, 0x51, 0x5, 0xab,
+ 0xa0, 0x9d, 0xbe, 0xb3, 0x1b, 0xa8, 0xb2, 0x75,
+ 0x7a, 0xb2, 0x1f, 0x13, 0x80, 0x80, 0xa4, 0xa5,
+ 0x82, 0xa3, 0x1b, 0xb4, 0xc3, 0xaf, 0xe0, 0xaf,
+ 0x1f, 0x4e, 0xc5, 0x5, 0x75, 0x7d, 0x6b, 0x52,
+ 0x71, 0x1b, 0x73, 0x74, 0x97, 0x99, 0x71, 0x1f,
+ 0x13, 0x40, 0x9b, 0x6b, 0x67, 0x9d, 0x5d, 0x1b,
+ 0x47, 0x65, 0x45, 0x53, 0x6a, 0x1f, 0xe, 0xfb,
+ 0x11, 0x76, 0xf8, 0x4a, 0xf7, 0x31, 0x1, 0xf7,
+ 0x7e, 0xf7, 0x17, 0x3, 0xf7, 0x74, 0xfb, 0x26,
+ 0x15, 0xf7, 0x2b, 0x6, 0x77, 0xf8, 0x22, 0x5,
+ 0xfb, 0x2, 0x6, 0x60, 0xf7, 0xa, 0x15, 0x5f,
+ 0xb7, 0x69, 0xc1, 0xc1, 0xb7, 0xad, 0xb7, 0xb7,
+ 0x5f, 0xae, 0x55, 0x55, 0x5f, 0x68, 0x5f, 0x1e,
+ 0xe, 0x6f, 0x76, 0x1, 0xd5, 0xec, 0xd9, 0xec,
+ 0xc8, 0xe9, 0x3, 0xf7, 0x8d, 0x5a, 0x15, 0xec,
+ 0xf7, 0x14, 0x6, 0xce, 0x95, 0xc5, 0xaf, 0xc2,
+ 0xb2, 0x5e, 0xd2, 0x18, 0x61, 0x41, 0x60, 0x73,
+ 0x4a, 0x1b, 0xfb, 0x6, 0x7d, 0xe7, 0xa2, 0xc9,
+ 0xc0, 0xca, 0xda, 0xaf, 0xb1, 0x7c, 0x7a, 0xa9,
+ 0x1f, 0x54, 0xe9, 0xf7, 0x44, 0x2d, 0x6c, 0x7,
+ 0x7b, 0x97, 0x72, 0x94, 0x77, 0x8e, 0x8, 0xf2,
+ 0x2a, 0x25, 0x7, 0xfb, 0xb, 0x72, 0x53, 0x2e,
+ 0x31, 0x1a, 0xfb, 0x24, 0xf7, 0x12, 0x5c, 0xbc,
+ 0x7e, 0x1e, 0xe, 0x84, 0x76, 0xf7, 0xb9, 0xe8,
+ 0xf7, 0x34, 0xe8, 0x12, 0xf7, 0xf, 0xe9, 0x5d,
+ 0xec, 0x13, 0xe8, 0xdf, 0xaf, 0x15, 0xbe, 0x4b,
+ 0x5, 0x93, 0x97, 0xce, 0xb0, 0xbb, 0x1b, 0xa1,
+ 0xac, 0x82, 0x83, 0xa6, 0x1f, 0x84, 0xa2, 0xa3,
+ 0x85, 0x9f, 0x1b, 0xd3, 0xb2, 0xb6, 0x71, 0xa,
+ 0x70, 0x79, 0x64, 0xa, 0x75, 0x94, 0x7c, 0x1b,
+ 0x78, 0x61, 0x84, 0x85, 0x7f, 0x1f, 0x9f, 0xac,
+ 0x9b, 0xab, 0xae, 0x1a, 0xa1, 0x8b, 0xa3, 0x84,
+ 0xa5, 0x1e, 0xf7, 0x5f, 0xd8, 0xfb, 0x74, 0x6,
+ 0x13, 0xf0, 0x7f, 0xa4, 0x86, 0xb4, 0xa2, 0x6c,
+ 0xa, 0xbd, 0x7c, 0x5e, 0xa0, 0x1f, 0xd5, 0xb9,
+ 0x5, 0xb9, 0x70, 0x5d, 0xc8, 0x63, 0xa, 0x76,
+ 0x8f, 0x66, 0x93, 0x77, 0x1e, 0x3d, 0x3e, 0xef,
+ 0x6, 0x13, 0xe8, 0x92, 0x76, 0x8c, 0x76, 0x75,
+ 0x1a, 0x8a, 0x49, 0x66, 0x49, 0x60, 0x6a, 0x8,
+ 0xe, 0xcf, 0xe3, 0xf7, 0x92, 0xe3, 0x1, 0xdc,
+ 0xe5, 0xf7, 0x97, 0xe5, 0x3, 0xc1, 0xf5, 0x15,
+ 0xc8, 0x52, 0xc8, 0xc4, 0x5, 0x71, 0xae, 0xb8,
+ 0x7f, 0xb9, 0x1b, 0xb8, 0xb7, 0x98, 0xa5, 0xad,
+ 0x1f, 0xc9, 0x51, 0xc6, 0xc6, 0x4c, 0xc5, 0x5,
+ 0xa3, 0xaa, 0x98, 0xb5, 0xb5, 0x1a, 0xb7, 0x7f,
+ 0xb7, 0x72, 0xac, 0x1e, 0xca, 0xc5, 0x51, 0xc4,
+ 0x4e, 0x50, 0x68, 0xa7, 0x5a, 0x98, 0x5b, 0x8a,
+ 0x19, 0x5f, 0x8a, 0x60, 0x7f, 0x6a, 0x72, 0x4e,
+ 0xc4, 0x18, 0x4f, 0x50, 0xca, 0x51, 0x5, 0x73,
+ 0x6a, 0x7f, 0x60, 0x61, 0x1a, 0x61, 0x97, 0x60,
+ 0xa4, 0x6b, 0x1e, 0xc0, 0xf7, 0xa, 0x15, 0xd0,
+ 0xc4, 0xc5, 0xd3, 0xd3, 0xc5, 0x51, 0x46, 0x45,
+ 0x51, 0x52, 0x43, 0x43, 0x52, 0xc4, 0xd1, 0x1e,
+ 0xe, 0x8b, 0xe2, 0xc4, 0xc1, 0xb5, 0xc0, 0xf7,
+ 0x4a, 0xe2, 0x1, 0x95, 0xf7, 0x84, 0xf3, 0xf7,
+ 0x80, 0x3, 0xf7, 0x22, 0x16, 0xf7, 0xd3, 0xe2,
+ 0xfb, 0x5, 0xc3, 0xf7, 0x25, 0xc1, 0xfb, 0x25,
+ 0xb6, 0xf7, 0x25, 0xc0, 0xfb, 0x20, 0x6, 0xf7,
+ 0x34, 0xf7, 0x4a, 0x5, 0xd8, 0xe2, 0xfb, 0x80,
+ 0x34, 0xb7, 0x6, 0x2b, 0xfb, 0x7, 0x2a, 0xf7,
+ 0x7, 0x5, 0xb8, 0xe2, 0xfb, 0x84, 0x34, 0xdc,
+ 0x6, 0xf7, 0x36, 0xfb, 0x4a, 0x5, 0xfb, 0x24,
+ 0x56, 0xf7, 0x26, 0x60, 0xfb, 0x26, 0x55, 0xf7,
+ 0x26, 0x53, 0xfb, 0x5, 0x6, 0xe, 0xfb, 0x2e,
+ 0x76, 0xf9, 0xe6, 0x6e, 0xa, 0xf7, 0xb1, 0x15,
+ 0xe5, 0xf8, 0x1a, 0x31, 0x6, 0xfd, 0xe6, 0x4,
+ 0xe5, 0xf8, 0x1b, 0x31, 0x6, 0xe, 0x45, 0xe8,
+ 0x2e, 0xf7, 0x40, 0xf7, 0xd5, 0xf7, 0x40, 0xfb,
+ 0x1, 0xe9, 0x12, 0xe3, 0xf1, 0xf7, 0x60, 0xf1,
+ 0x13, 0x9c, 0xe3, 0x45, 0x15, 0xf7, 0x84, 0x6,
+ 0xe8, 0xcd, 0xa4, 0xd4, 0xb1, 0x7d, 0x9f, 0x75,
+ 0x9f, 0x1f, 0xa5, 0x96, 0xb3, 0xaa, 0xc1, 0x1a,
+ 0xaf, 0x74, 0xab, 0x6b, 0xa2, 0x1e, 0xfb, 0x91,
+ 0xf7, 0x41, 0x5, 0x8b, 0x86, 0x8e, 0x90, 0x1a,
+ 0x96, 0x98, 0x8c, 0xa2, 0x1e, 0xf7, 0x2e, 0x4c,
+ 0x6, 0x13, 0xac, 0xf1, 0xf7, 0x40, 0xfb, 0x88,
+ 0x6, 0x49, 0x36, 0x78, 0x26, 0x6e, 0xa0, 0x74,
+ 0xa1, 0x78, 0x1f, 0x73, 0x7b, 0x66, 0x72, 0x50,
+ 0x1a, 0x59, 0xa7, 0x71, 0xbb, 0x6b, 0x1e, 0xf7,
+ 0x5e, 0xfb, 0x1d, 0x5, 0xa1, 0x7d, 0x8e, 0x88,
+ 0x82, 0x1a, 0x82, 0x7e, 0x8a, 0x7a, 0x1e, 0xfb,
+ 0x3a, 0xda, 0x6, 0x13, 0x6c, 0x25, 0x6, 0xf7,
+ 0xac, 0xcc, 0x15, 0xfb, 0x37, 0xf7, 0x1, 0x5,
+ 0x80, 0x92, 0x82, 0x97, 0x97, 0x1a, 0xa0, 0xa5,
+ 0x95, 0x98, 0x92, 0x1e, 0xf7, 0x48, 0xfb, 0xd,
+ 0x5, 0x94, 0x86, 0x92, 0x83, 0x82, 0x1a, 0x71,
+ 0x68, 0x84, 0x7a, 0x89, 0x1e, 0xe, 0xf8, 0x79,
+ 0xf7, 0x20, 0x1, 0xf7, 0x14, 0xf7, 0x17, 0xde,
+ 0xf7, 0x16, 0x3, 0xf7, 0xea, 0xf8, 0x79, 0x15,
+ 0xf7, 0x16, 0xf7, 0x20, 0xfb, 0x16, 0x6, 0xfb,
+ 0x6a, 0xfb, 0x20, 0x15, 0xf7, 0x17, 0xf7, 0x20,
+ 0xfb, 0x17, 0x6, 0xe, 0x79, 0xb8, 0xe7, 0xb9,
+ 0xf7, 0x8d, 0xba, 0xd5, 0xb8, 0x1, 0x8b, 0xb8,
+ 0xf3, 0xb9, 0xf7, 0xfc, 0xb8, 0x3, 0xf7, 0xad,
+ 0x4, 0xfb, 0x39, 0xf7, 0x1a, 0xfb, 0x1a, 0xf7,
+ 0x39, 0xf7, 0x3a, 0xf7, 0x1b, 0xf7, 0x1a, 0xf7,
+ 0x39, 0xf7, 0x39, 0xfb, 0x1b, 0xf7, 0x1a, 0xfb,
+ 0x3a, 0xfb, 0x39, 0xfb, 0x1a, 0xfb, 0x1a, 0xfb,
+ 0x39, 0x1e, 0xb8, 0x16, 0xf7, 0x21, 0xf7, 0x5,
+ 0xf7, 0x5, 0xf7, 0x21, 0xf7, 0x21, 0xf7, 0x7,
+ 0xfb, 0x5, 0xfb, 0x21, 0xfb, 0x21, 0xfb, 0x7,
+ 0xfb, 0x5, 0xfb, 0x21, 0xfb, 0x21, 0xfb, 0x5,
+ 0xf7, 0x5, 0xf7, 0x21, 0x1e, 0xf8, 0x9, 0x49,
+ 0x15, 0x71, 0x73, 0x61, 0x73, 0x64, 0x1b, 0x46,
+ 0x5a, 0xc7, 0xcc, 0xcd, 0xc0, 0xc5, 0xcb, 0xae,
+ 0xa7, 0x79, 0x75, 0xa1, 0x1f, 0xb1, 0xb2, 0x5,
+ 0xa8, 0x6a, 0x5f, 0x9e, 0x5e, 0x1b, 0x37, 0x3b,
+ 0x43, 0x29, 0x35, 0xcd, 0x35, 0xf2, 0xc4, 0xc9,
+ 0xb7, 0xa0, 0x9b, 0x1f, 0xe, 0xf7, 0x58, 0xde,
+ 0xf7, 0x71, 0xdb, 0x12, 0xf7, 0x27, 0xcf, 0xf7,
+ 0xd, 0xce, 0x48, 0xf7, 0x9, 0x13, 0xe8, 0xf7,
+ 0xe4, 0xf7, 0x60, 0x15, 0xf7, 0x9, 0xdd, 0x59,
+ 0x6, 0x13, 0xf0, 0xf7, 0x23, 0x7, 0xde, 0x86,
+ 0xcf, 0xfb, 0x8, 0x5c, 0x59, 0x7c, 0x77, 0x6d,
+ 0x1e, 0x9f, 0x47, 0x5, 0x99, 0xa5, 0xc6, 0x94,
+ 0xa2, 0x1b, 0xad, 0x9e, 0x7e, 0x62, 0x1f, 0x94,
+ 0x77, 0x75, 0x8e, 0x76, 0x1b, 0x24, 0x74, 0x3d,
+ 0x5b, 0x44, 0xb8, 0x4a, 0xce, 0xa7, 0xa7, 0xa0,
+ 0xa8, 0xa0, 0x1f, 0xf7, 0x12, 0x4, 0x63, 0x80,
+ 0x6b, 0x56, 0x67, 0x1b, 0x6d, 0x7f, 0xa4, 0x9d,
+ 0xb8, 0xb6, 0x95, 0xb1, 0x9a, 0x9a, 0x88, 0x89,
+ 0x95, 0x1f, 0xe, 0x7b, 0xa, 0xba, 0xf8, 0x8b,
+ 0x3, 0xf7, 0xa3, 0xf7, 0x98, 0x15, 0xf7, 0x77,
+ 0xfb, 0x52, 0xc1, 0xc9, 0xfb, 0x2d, 0xf7, 0x13,
+ 0xf7, 0x2b, 0xf7, 0x10, 0x54, 0xca, 0x5, 0xfc,
+ 0x54, 0xfb, 0x4e, 0x15, 0xf7, 0x6c, 0xfb, 0x52,
+ 0xc2, 0xc9, 0xfb, 0x28, 0xf7, 0x13, 0xf7, 0x26,
+ 0xf7, 0x10, 0x53, 0xca, 0x5, 0xe, 0xf7, 0x10,
+ 0x76, 0xf7, 0x5d, 0xf7, 0x1, 0x1, 0xf8, 0x45,
+ 0xeb, 0x3, 0xd2, 0xf7, 0xc4, 0x15, 0xf7, 0xfe,
+ 0xfb, 0x5d, 0xeb, 0xf7, 0xca, 0xfc, 0x5e, 0x6,
+ 0xe, 0x79, 0xb8, 0xf7, 0xf6, 0xb9, 0xf7, 0x0,
+ 0xb8, 0x1, 0x8b, 0xb8, 0xf7, 0x2f, 0xbb, 0xf7,
+ 0x5, 0xbd, 0xf7, 0x24, 0xb8, 0x3, 0xf7, 0xad,
+ 0x4, 0xfb, 0x39, 0xf7, 0x1b, 0xfb, 0x1a, 0xf7,
+ 0x39, 0xf7, 0x3a, 0xf7, 0x1a, 0xf7, 0x1a, 0xf7,
+ 0x39, 0xf7, 0x39, 0xfb, 0x1a, 0xf7, 0x1a, 0xfb,
+ 0x3a, 0xfb, 0x39, 0xfb, 0x1b, 0xfb, 0x1a, 0xfb,
+ 0x39, 0x1e, 0xb8, 0x16, 0xf7, 0x20, 0xf7, 0x7,
+ 0xf7, 0x6, 0xf7, 0x20, 0xf7, 0x22, 0xf7, 0x5,
+ 0xfb, 0x6, 0xfb, 0x20, 0xfb, 0x20, 0xfb, 0x5,
+ 0xfb, 0x6, 0xfb, 0x22, 0xfb, 0x20, 0xfb, 0x7,
+ 0xf7, 0x6, 0xf7, 0x20, 0x1e, 0xf7, 0x2f, 0xfb,
+ 0x27, 0x15, 0xbb, 0xf7, 0x8, 0xc1, 0x6, 0xbe,
+ 0xfb, 0x8, 0x5, 0xc5, 0x6, 0x54, 0xf7, 0x13,
+ 0x5, 0x9e, 0x91, 0xaf, 0xa4, 0xc7, 0x1a, 0xed,
+ 0x42, 0x86, 0xfb, 0x1e, 0x8d, 0x1e, 0xbb, 0xfb,
+ 0x29, 0x15, 0xf2, 0x7, 0xde, 0xa9, 0x83, 0x5f,
+ 0x5f, 0x64, 0x84, 0x41, 0x1f, 0xe, 0xf8, 0x8d,
+ 0xdb, 0x1, 0xe3, 0xf8, 0x3c, 0x3, 0xe3, 0xf8,
+ 0x8d, 0x15, 0xf8, 0x3c, 0xdb, 0xfc, 0x3c, 0x6,
+ 0xe, 0xf7, 0x87, 0xe6, 0xf7, 0x53, 0xe6, 0x1,
+ 0xf5, 0xea, 0xf7, 0x5b, 0xe9, 0x3, 0xf5, 0xf8,
+ 0x41, 0x15, 0x24, 0xe1, 0x38, 0xf7, 0x0, 0xf7,
+ 0x1, 0xe0, 0xde, 0xf2, 0xf3, 0x36, 0xde, 0xfb,
+ 0x1, 0xfb, 0x0, 0x35, 0x38, 0x23, 0x1e, 0xea,
+ 0x16, 0xc1, 0xb6, 0xb5, 0xc3, 0xc4, 0xb6, 0x61,
+ 0x55, 0x56, 0x60, 0x61, 0x52, 0x53, 0x60, 0xb5,
+ 0xc0, 0x1e, 0xe, 0xa3, 0xdc, 0xf7, 0x4a, 0xe3,
+ 0xf7, 0x20, 0x67, 0xa, 0xeb, 0x3, 0xd2, 0xf7,
+ 0xb3, 0x15, 0xf7, 0x48, 0xfb, 0x27, 0xeb, 0xf7,
+ 0x27, 0xf7, 0x4a, 0xe3, 0xfb, 0x4a, 0xf7, 0x20,
+ 0x2b, 0xfb, 0x20, 0xfb, 0x48, 0x6, 0xfb, 0xf3,
+ 0x4, 0xf8, 0x5e, 0xdc, 0xfc, 0x5e, 0x6, 0xe,
+ 0xf7, 0x7a, 0xd6, 0xf7, 0x39, 0xf7, 0x26, 0x3e,
+ 0xd8, 0x12, 0xf8, 0x0, 0xdd, 0x13, 0xb0, 0xf7,
+ 0x2d, 0xf7, 0x7a, 0x15, 0xf7, 0xb9, 0xd6, 0xfb,
+ 0x38, 0x6, 0xf7, 0x1, 0xe0, 0x5, 0xa7, 0xa0,
+ 0xa5, 0xb0, 0xb7, 0x1a, 0xae, 0x6e, 0xe4, 0xfb,
+ 0x5, 0x54, 0x57, 0x73, 0x56, 0x6c, 0x1e, 0x13,
+ 0xd0, 0x46, 0xde, 0x7, 0x13, 0xb0, 0xa1, 0x87,
+ 0xba, 0xc6, 0xa4, 0xaf, 0x82, 0x64, 0x78, 0x82,
+ 0x7c, 0x79, 0x7c, 0x1e, 0xfb, 0x4c, 0xfb, 0x27,
+ 0x5, 0xe, 0xf7, 0x72, 0xd6, 0xee, 0xd4, 0xf7,
+ 0x27, 0x77, 0x12, 0xf7, 0x83, 0xf7, 0x50, 0x3b,
+ 0xdb, 0x4e, 0xdc, 0x13, 0xe4, 0xf7, 0x2c, 0xf7,
+ 0x96, 0x15, 0x71, 0xcb, 0xb2, 0x81, 0xb3, 0x1b,
+ 0xe9, 0xc5, 0xc6, 0xce, 0xae, 0x7a, 0xae, 0x6d,
+ 0xa2, 0x1f, 0x13, 0xe8, 0x97, 0x97, 0x9a, 0xa1,
+ 0xab, 0x1a, 0xd7, 0x50, 0xac, 0x4a, 0x57, 0x54,
+ 0x78, 0x6a, 0x69, 0x1e, 0xb5, 0x4b, 0x5, 0x9d,
+ 0xaa, 0xaf, 0xa1, 0xaf, 0x1b, 0x9c, 0xa2, 0x84,
+ 0x70, 0x70, 0x75, 0x80, 0x70, 0x1f, 0x13, 0xf0,
+ 0x88, 0x7b, 0x8c, 0x63, 0x1b, 0x42, 0xce, 0x7,
+ 0x13, 0xe4, 0xb6, 0x9c, 0x74, 0x72, 0x6e, 0x73,
+ 0x75, 0x64, 0x1f, 0x5e, 0x8c, 0x66, 0x99, 0x67,
+ 0x9d, 0x8, 0xe, 0xf8, 0xa5, 0x76, 0xf7, 0x2d,
+ 0x77, 0x1, 0xf7, 0x4e, 0xf8, 0x90, 0x15, 0xf7,
+ 0x89, 0xcc, 0x6b, 0xe3, 0xfb, 0x7b, 0x24, 0x5,
+ 0xe, 0xfb, 0xd, 0x76, 0xf7, 0x36, 0xd9, 0x3d,
+ 0xe5, 0xf7, 0x83, 0xe5, 0x12, 0x9a, 0xf7, 0x45,
+ 0x2a, 0xec, 0xf7, 0x1c, 0xf7, 0x46, 0x2a, 0xec,
+ 0x2a, 0xf7, 0x44, 0x13, 0xd9, 0x0, 0xea, 0xfb,
+ 0x22, 0x15, 0xec, 0xf7, 0x51, 0x6, 0x77, 0x9e,
+ 0xaa, 0x83, 0xab, 0x1b, 0xc0, 0xc6, 0xa1, 0xa9,
+ 0xa2, 0x1f, 0x58, 0x7, 0x13, 0xb8, 0x80, 0xf7,
+ 0x44, 0xe5, 0x6, 0x13, 0xba, 0x0, 0x3c, 0xf7,
+ 0xdd, 0xfb, 0x46, 0x31, 0x6, 0x13, 0xd9, 0x0,
+ 0xdc, 0xfb, 0x56, 0x6, 0x6b, 0x71, 0x55, 0x72,
+ 0x5c, 0x1b, 0x5b, 0x61, 0xa0, 0xca, 0x1f, 0xf7,
+ 0x95, 0xfb, 0x45, 0x31, 0x7, 0x13, 0xd6, 0x0,
+ 0xdb, 0x6, 0xe, 0x5a, 0x76, 0xf9, 0x0, 0xa9,
+ 0x1, 0xf7, 0xd4, 0xc2, 0xeb, 0xc0, 0x3, 0xf7,
+ 0xd4, 0x45, 0x15, 0xc2, 0xf9, 0x0, 0xeb, 0xfd,
+ 0x0, 0xc0, 0xf9, 0x0, 0xc8, 0xa9, 0xfb, 0x98,
+ 0x6, 0xfb, 0x60, 0x21, 0x4f, 0xfb, 0xc, 0xfb,
+ 0x2, 0xf5, 0x57, 0xf7, 0x5b, 0x8a, 0x1f, 0xe,
+ 0xf7, 0x39, 0xf7, 0x4e, 0x1, 0xf7, 0x58, 0xf7,
+ 0x96, 0x15, 0x58, 0xba, 0x61, 0xc4, 0xc4, 0xba,
+ 0xb5, 0xbe, 0xbe, 0x5c, 0xb5, 0x52, 0x52, 0x5c,
+ 0x61, 0x58, 0x1e, 0xe, 0xfb, 0x4d, 0x76, 0xf7,
+ 0x62, 0x77, 0x12, 0xf7, 0x91, 0x16, 0x80, 0x2d,
+ 0x5, 0x8f, 0x92, 0x9a, 0x8d, 0x99, 0x1b, 0x9d,
+ 0x9b, 0x85, 0x77, 0x7d, 0x7e, 0x83, 0x7b, 0x1f,
+ 0x13, 0xc0, 0x7c, 0x74, 0x90, 0x94, 0x82, 0x1f,
+ 0x70, 0x53, 0x5, 0x79, 0xa4, 0xa6, 0x81, 0xa9,
+ 0x1b, 0xc9, 0xb1, 0xb8, 0xc2, 0xc8, 0x60, 0x9a,
+ 0x7b, 0x8f, 0x1f, 0xa5, 0x7, 0xe, 0xf7, 0x7a,
+ 0xd8, 0xf7, 0xc9, 0x77, 0x12, 0xf7, 0x3a, 0xf7,
+ 0x45, 0x3b, 0xdb, 0x13, 0xe0, 0xf7, 0x2d, 0xf7,
+ 0x7a, 0x15, 0xf7, 0xba, 0xd8, 0x23, 0xf7, 0xc9,
+ 0x6, 0xfb, 0x45, 0x75, 0x5, 0x3f, 0x7, 0x13,
+ 0xd0, 0xec, 0x91, 0x5, 0xfb, 0x6d, 0xfb, 0x2,
+ 0x7, 0xe, 0xf7, 0x58, 0xde, 0xf7, 0x6e, 0xde,
+ 0x1, 0xf7, 0x27, 0xcf, 0xf7, 0x3f, 0xce, 0x3,
+ 0xf7, 0x27, 0xf8, 0x18, 0x15, 0x21, 0xca, 0x35,
+ 0xe7, 0xda, 0xd3, 0xd6, 0xf7, 0x9, 0xe9, 0x53,
+ 0xed, 0x29, 0x2a, 0x54, 0x24, 0x32, 0x1e, 0xcf,
+ 0x89, 0x15, 0xbe, 0xa7, 0xc7, 0xc5, 0xc5, 0xa6,
+ 0x4c, 0x5d, 0x49, 0x66, 0x60, 0x5b, 0x53, 0x6d,
+ 0xbe, 0xc3, 0x1e, 0xe, 0x7b, 0xa, 0xbc, 0xf8,
+ 0x8b, 0x3, 0xf0, 0xd1, 0x15, 0xf7, 0x77, 0xf7,
+ 0x52, 0xfb, 0x74, 0xf7, 0x4e, 0x54, 0x4c, 0xf7,
+ 0x2b, 0xfb, 0x10, 0xfb, 0x2d, 0xfb, 0x13, 0x5,
+ 0xf7, 0xb5, 0x4d, 0x15, 0xf7, 0x6c, 0xf7, 0x52,
+ 0xfb, 0x69, 0xf7, 0x4e, 0x53, 0x4c, 0xf7, 0x26,
+ 0xfb, 0x10, 0xfb, 0x28, 0xfb, 0x13, 0x5, 0xe,
+ 0x64, 0x76, 0xa2, 0xc4, 0x5a, 0x76, 0xf7, 0x6,
+ 0xca, 0xf7, 0x43, 0xd0, 0x8b, 0xf7, 0x4f, 0xe1,
+ 0x77, 0x12, 0xbf, 0xd5, 0xf8, 0x8, 0xd7, 0x13,
+ 0xdf, 0x80, 0xf7, 0xf0, 0xcb, 0x15, 0xf7, 0x2a,
+ 0x5f, 0x3f, 0x52, 0xf7, 0x59, 0xc4, 0x5e, 0xb7,
+ 0xb8, 0xca, 0x5e, 0xf7, 0x41, 0x42, 0x6, 0xfb,
+ 0x2d, 0xfb, 0x52, 0x5, 0xe3, 0x9c, 0x15, 0xc9,
+ 0xd7, 0x5, 0x3f, 0x7, 0xfc, 0x71, 0xfb, 0x10,
+ 0x15, 0x13, 0x3f, 0x80, 0x65, 0xa, 0x50, 0xc6,
+ 0x5, 0xfd, 0x12, 0xfb, 0xea, 0x15, 0xf7, 0xa0,
+ 0xd0, 0x2d, 0xf7, 0xa4, 0x6, 0xfb, 0x37, 0x78,
+ 0x5, 0x47, 0x7, 0xe4, 0x90, 0x5, 0xfb, 0x52,
+ 0x27, 0x7, 0xe, 0x51, 0xce, 0xf7, 0x33, 0xf7,
+ 0x16, 0x47, 0xcf, 0x8a, 0xd1, 0x8b, 0xf7, 0x52,
+ 0xe2, 0x77, 0xb0, 0x77, 0x12, 0xbc, 0xd1, 0x13,
+ 0xcb, 0xf8, 0x20, 0x97, 0x15, 0x51, 0xf7, 0x90,
+ 0xce, 0xfb, 0x22, 0x7, 0xf7, 0xa, 0xeb, 0xa2,
+ 0xaa, 0xb3, 0x1a, 0xa9, 0x71, 0xdb, 0x29, 0x5d,
+ 0x62, 0x75, 0x67, 0x6d, 0x1e, 0x43, 0xd2, 0x7,
+ 0x13, 0xab, 0x9e, 0x87, 0xb6, 0xbd, 0xa1, 0xac,
+ 0x82, 0x69, 0x79, 0x82, 0x7e, 0xfb, 0x41, 0xfb,
+ 0x24, 0x1e, 0x13, 0x9b, 0xfc, 0x4f, 0xf7, 0xb1,
+ 0x15, 0xf7, 0x91, 0xd1, 0x34, 0xf7, 0xa8, 0x6,
+ 0x13, 0x9d, 0xfb, 0x2e, 0x78, 0x5, 0x46, 0x7,
+ 0xdf, 0x90, 0x5, 0xfb, 0x55, 0x2b, 0x7, 0xc7,
+ 0xfc, 0x0, 0x15, 0x65, 0xa, 0x50, 0xc6, 0x5,
+ 0xe, 0x5e, 0xc4, 0x58, 0x76, 0xaa, 0x76, 0xf5,
+ 0xcb, 0xf7, 0x3c, 0xd0, 0xe5, 0xcb, 0xc8, 0xcd,
+ 0x91, 0x77, 0xb0, 0x77, 0x12, 0x13, 0x5e, 0x80,
+ 0xf7, 0xe7, 0xc3, 0x15, 0xf7, 0x29, 0x6, 0x13,
+ 0x9e, 0x80, 0x5f, 0x41, 0x52, 0xf7, 0x56, 0xc4,
+ 0x5d, 0xb7, 0xb9, 0xcb, 0x5d, 0xf7, 0x46, 0x45,
+ 0x7, 0xfb, 0x2d, 0xfb, 0x56, 0x5, 0xe3, 0x9b,
+ 0x15, 0xc8, 0xd9, 0x5, 0x3d, 0x7, 0xfc, 0xa8,
+ 0xf7, 0x5f, 0x15, 0x71, 0xc7, 0xaf, 0x82, 0xb3,
+ 0x1b, 0xe1, 0xbe, 0xc1, 0xc9, 0xaa, 0x7c, 0xaa,
+ 0x70, 0x9f, 0x1f, 0x96, 0x95, 0x98, 0xa0, 0xa9,
+ 0x1a, 0xc9, 0x56, 0xa8, 0x4f, 0x5b, 0x57, 0x7b,
+ 0x6d, 0x6b, 0x1e, 0xb4, 0x56, 0x5, 0x9d, 0x99,
+ 0xad, 0x9a, 0xb0, 0x1b, 0xa4, 0x9f, 0x83, 0x79,
+ 0x71, 0x76, 0x82, 0x73, 0x1f, 0x55, 0x4b, 0xca,
+ 0x6, 0xb2, 0x9a, 0x76, 0x75, 0x71, 0x75, 0x76,
+ 0x69, 0x1f, 0x89, 0x6, 0x61, 0x8c, 0x69, 0x98,
+ 0x69, 0x9a, 0x8, 0xa8, 0xfc, 0x13, 0x15, 0x13,
+ 0x3e, 0x80, 0x65, 0xa, 0x5, 0x13, 0x5d, 0x0,
+ 0x50, 0xc6, 0x5, 0xe, 0xfb, 0x26, 0xe7, 0xf7,
+ 0xf1, 0xf7, 0x2e, 0x12, 0xed, 0xec, 0xba, 0xf7,
+ 0x44, 0x7c, 0xed, 0x13, 0xe8, 0xf7, 0xad, 0xf7,
+ 0x59, 0x15, 0x57, 0x7f, 0xfb, 0x17, 0x66, 0xfb,
+ 0xf, 0x1a, 0xfb, 0x2, 0xeb, 0x4e, 0xf7, 0xd,
+ 0xc2, 0xd9, 0x9a, 0x9f, 0xc0, 0x1e, 0xf7, 0x24,
+ 0x29, 0x3f, 0x7, 0x85, 0x6f, 0x6d, 0x86, 0x6e,
+ 0x1b, 0x48, 0x55, 0xa3, 0xc2, 0xd5, 0xe9, 0x9c,
+ 0xe4, 0x99, 0x1f, 0xf7, 0x13, 0x7, 0x13, 0x50,
+ 0x2a, 0x6, 0x13, 0xf0, 0x64, 0xf7, 0x7, 0x15,
+ 0x60, 0xb2, 0x69, 0xbc, 0x1e, 0x13, 0x50, 0xbc,
+ 0xb2, 0xad, 0xb6, 0xb6, 0x64, 0xad, 0x5a, 0x5a,
+ 0x64, 0x69, 0x60, 0x1f, 0xe, 0x8b, 0xe5, 0xcc,
+ 0xe5, 0xf7, 0x7a, 0xe5, 0xf7, 0x6f, 0x77, 0x44,
+ 0xa, 0xf7, 0x19, 0xf9, 0x3c, 0x15, 0xf7, 0xcf,
+ 0x40, 0xa5, 0xc5, 0xfb, 0xbe, 0xf7, 0xd, 0x5,
+ 0xfb, 0x4d, 0xfd, 0xa4, 0x22, 0xa, 0x8b, 0xe5,
+ 0xcc, 0xe5, 0xf7, 0x6d, 0xe5, 0xf7, 0x7c, 0x77,
+ 0x44, 0xa, 0x82, 0x16, 0x20, 0xa, 0xfb, 0x60,
+ 0xf7, 0xfc, 0x15, 0xf7, 0xd2, 0xd5, 0x62, 0xf4,
+ 0xfb, 0xbd, 0x6a, 0xa, 0xe, 0x8b, 0xe4, 0xcd,
+ 0xe4, 0xf7, 0x6d, 0xe4, 0xf7, 0x7a, 0x77, 0x44,
+ 0xa, 0xf7, 0x20, 0xf8, 0xef, 0x15, 0xf7, 0x2c,
+ 0xf1, 0xf7, 0x2b, 0x25, 0xc7, 0xaf, 0xfb, 0x36,
+ 0xf7, 0x21, 0x5, 0x2a, 0x6, 0xfb, 0x39, 0xfb,
+ 0x20, 0x5, 0x33, 0xfd, 0x14, 0x22, 0xa, 0x8b,
+ 0xe5, 0xcc, 0xe5, 0xf7, 0x6d, 0xe5, 0xc7, 0xde,
+ 0x74, 0xde, 0x8f, 0x77, 0x12, 0x82, 0xf7, 0x97,
+ 0xf4, 0xf7, 0x92, 0x13, 0xeb, 0xde, 0xf9, 0x10,
+ 0x15, 0xe3, 0x71, 0x5, 0xaf, 0x99, 0x98, 0xa5,
+ 0xa7, 0x1b, 0xaf, 0x9f, 0x78, 0x7b, 0xa4, 0x1f,
+ 0x13, 0xf7, 0x7e, 0x9f, 0xa1, 0x7f, 0xae, 0x1b,
+ 0xd9, 0xbd, 0xc6, 0xca, 0x9a, 0x1f, 0x35, 0xa4,
+ 0x5, 0x75, 0x84, 0x7d, 0x61, 0x66, 0x1b, 0x6d,
+ 0x76, 0x99, 0x9a, 0x75, 0x1f, 0x13, 0xeb, 0x9a,
+ 0x74, 0x73, 0x9b, 0x66, 0x1b, 0x38, 0x5e, 0x49,
+ 0x56, 0x7c, 0x1f, 0x2f, 0xfd, 0x10, 0x22, 0xa,
+ 0x8b, 0xe3, 0xcc, 0xe3, 0xf7, 0x69, 0xe3, 0xdf,
+ 0xf7, 0xe, 0x44, 0xa, 0xf7, 0xda, 0xf9, 0x10,
+ 0x15, 0xf7, 0x3, 0xf7, 0xe, 0x6b, 0xa, 0xfb,
+ 0x4b, 0xfb, 0xe, 0x15, 0xf7, 0x5, 0xf7, 0xe,
+ 0xfb, 0x5, 0x6, 0xfb, 0x2c, 0xfd, 0x8a, 0x22,
+ 0xa, 0x8b, 0xe8, 0xcf, 0xe9, 0xf7, 0x7e, 0xe8,
+ 0x9e, 0xc9, 0xd7, 0xc9, 0x1, 0xf7, 0x4d, 0xcc,
+ 0xdb, 0xcb, 0x3, 0xf7, 0x4d, 0xf9, 0x51, 0x15,
+ 0x54, 0xba, 0x5e, 0xc5, 0xc4, 0xba, 0xb8, 0xc2,
+ 0xc2, 0x5c, 0xb8, 0x52, 0x51, 0x5c, 0x5e, 0x54,
+ 0x1e, 0xcd, 0x16, 0xa0, 0x9c, 0x9c, 0xa1, 0xa1,
+ 0x9d, 0x7a, 0x76, 0x76, 0x79, 0x7a, 0x75, 0x75,
+ 0x7a, 0x9c, 0xa0, 0x1e, 0xfb, 0x98, 0xfd, 0x51,
+ 0x22, 0xa, 0x8b, 0xe5, 0x31, 0xf7, 0x40, 0x7e,
+ 0xe6, 0x48, 0xf7, 0x50, 0x9d, 0xf7, 0x41, 0x31,
+ 0xe5, 0x12, 0xf7, 0xbe, 0xed, 0xb5, 0xda, 0x9d,
+ 0xdc, 0x13, 0xab, 0x80, 0x7c, 0x16, 0xf7, 0x89,
+ 0xe5, 0x3e, 0x6, 0xa9, 0xd0, 0x5, 0xf7, 0x7,
+ 0xfb, 0x33, 0xf7, 0xd2, 0x6, 0x13, 0x5b, 0x80,
+ 0xf7, 0x40, 0x3a, 0x7, 0x13, 0x97, 0x80, 0x39,
+ 0xfb, 0x1f, 0xf7, 0x22, 0xb5, 0x5a, 0xda, 0xf7,
+ 0x50, 0x3c, 0x5a, 0x61, 0xf7, 0x2a, 0xf7, 0x1f,
+ 0x7, 0x13, 0xab, 0x80, 0x38, 0xdc, 0xf7, 0x41,
+ 0xfc, 0x7b, 0x7, 0x13, 0xa7, 0x80, 0x31, 0xea,
+ 0x7, 0xfb, 0x40, 0xfc, 0x12, 0x5, 0x48, 0x6,
+ 0xf7, 0x83, 0xf7, 0x34, 0x15, 0xd5, 0xf7, 0x39,
+ 0x5, 0xfb, 0x39, 0x7, 0xe, 0xfb, 0x4d, 0x76,
+ 0xf7, 0x54, 0xe7, 0xf8, 0x2e, 0xe7, 0x1, 0xaa,
+ 0xec, 0xf7, 0x16, 0xf7, 0x22, 0xcb, 0xec, 0x3,
+ 0xf7, 0x9b, 0x82, 0x15, 0x82, 0x2e, 0x5, 0x8e,
+ 0x98, 0x9f, 0x8e, 0x97, 0x1b, 0x94, 0x99, 0x84,
+ 0x7f, 0x7c, 0x80, 0x84, 0x7d, 0x7d, 0x79, 0x91,
+ 0x95, 0x7d, 0x1f, 0x6f, 0x52, 0x5, 0x71, 0xac,
+ 0xa0, 0x89, 0xa1, 0x1b, 0xc2, 0xb9, 0xac, 0xca,
+ 0x98, 0x8b, 0xc3, 0x4f, 0x99, 0x1f, 0x8c, 0x98,
+ 0xe3, 0x8f, 0xcf, 0xb2, 0xd3, 0xb9, 0x19, 0x52,
+ 0xcf, 0x5, 0x72, 0x60, 0x4a, 0x63, 0x36, 0x1b,
+ 0xfb, 0x21, 0x59, 0xf7, 0x15, 0xd7, 0xf7, 0x2f,
+ 0xf7, 0x6, 0xbd, 0xd7, 0xc1, 0xbd, 0x78, 0x71,
+ 0xb5, 0x1f, 0x21, 0xec, 0xf7, 0x87, 0x2a, 0x60,
+ 0x7, 0xa4, 0x6a, 0x55, 0x9d, 0x4e, 0x1b, 0xfb,
+ 0x1e, 0xfb, 0x27, 0x2a, 0xfb, 0x5e, 0xfb, 0x21,
+ 0xea, 0xfb, 0x13, 0xf7, 0x1d, 0x75, 0x1f, 0xe,
+ 0x48, 0xa, 0xc1, 0xed, 0x3, 0xb1, 0x16, 0x35,
+ 0xa, 0xf6, 0xf8, 0xe2, 0x15, 0xf7, 0xd2, 0x40,
+ 0xa6, 0x77, 0xa, 0x48, 0xa, 0xbf, 0xee, 0x3,
+ 0xb1, 0x16, 0xf8, 0xa5, 0x6, 0x8a, 0xf7, 0x5e,
+ 0x5, 0x28, 0xfb, 0x4, 0xfb, 0x91, 0x38, 0xa,
+ 0xf7, 0x91, 0xfb, 0x6, 0xee, 0xf7, 0x60, 0xfc,
+ 0xa1, 0x31, 0xd7, 0xfc, 0x8, 0x3c, 0x6, 0xf7,
+ 0x2b, 0xf8, 0x97, 0x15, 0xf7, 0xd8, 0xd5, 0x61,
+ 0xf4, 0xfb, 0xc3, 0x6a, 0xa, 0xe, 0x8b, 0xe4,
+ 0xf7, 0x26, 0xe4, 0xf7, 0x1d, 0xe4, 0xf7, 0x7a,
+ 0x77, 0x1, 0xf7, 0x9, 0xec, 0xf1, 0xee, 0xc0,
+ 0xee, 0x3, 0xf7, 0x2b, 0xf8, 0xef, 0x15, 0xf7,
+ 0x2d, 0xf1, 0xf7, 0x2d, 0x25, 0xc8, 0xaf, 0xfb,
+ 0x37, 0xf7, 0x21, 0x5, 0x27, 0x6, 0xfb, 0x3b,
+ 0xfb, 0x20, 0x5, 0x59, 0xfd, 0x14, 0x15, 0x35,
+ 0xa, 0xe, 0x8b, 0xe3, 0xf7, 0x24, 0xe2, 0xf7,
+ 0x1b, 0xe3, 0xdf, 0xf7, 0xe, 0x12, 0xf7, 0x9,
+ 0xec, 0x4f, 0xf7, 0x6, 0xbb, 0xee, 0x40, 0xf7,
+ 0x4, 0x9c, 0xed, 0x13, 0xf5, 0x80, 0xf7, 0xe8,
+ 0xf9, 0x10, 0x15, 0xf7, 0x4, 0xf7, 0xe, 0xfb,
+ 0x4, 0x56, 0xa, 0xfb, 0x8, 0xfd, 0x8a, 0x15,
+ 0xf8, 0xa5, 0xf7, 0x5e, 0x29, 0xfb, 0x4, 0x6,
+ 0x13, 0xfa, 0x80, 0x2d, 0xa, 0xe, 0x8b, 0xe5,
+ 0xf8, 0x8, 0x5f, 0xa, 0xf7, 0x90, 0xef, 0x3,
+ 0xd8, 0x16, 0x31, 0xa, 0xcd, 0xf8, 0xe2, 0x15,
+ 0xf7, 0xd4, 0x40, 0xa5, 0x77, 0xa, 0x8b, 0xe5,
+ 0xf8, 0x8, 0x5f, 0xa, 0xf7, 0x90, 0xef, 0x3,
+ 0xf7, 0x50, 0xf8, 0xf1, 0x15, 0xf7, 0xd9, 0xd5,
+ 0x60, 0xf4, 0xfb, 0xc2, 0x6a, 0xa, 0x30, 0xfd,
+ 0x2c, 0x15, 0x31, 0xa, 0xe, 0x8b, 0xe4, 0xf8,
+ 0x8, 0xe4, 0xf7, 0x7a, 0x67, 0xa, 0xef, 0x3,
+ 0xf7, 0x29, 0xf8, 0xef, 0x15, 0xf7, 0x2e, 0xf1,
+ 0xf7, 0x2d, 0x25, 0xc8, 0xaf, 0xfb, 0x38, 0xf7,
+ 0x21, 0x5, 0x28, 0x6, 0xfb, 0x3c, 0xfb, 0x20,
+ 0x5, 0x82, 0xfd, 0x14, 0x15, 0x31, 0xa, 0xe,
+ 0x8b, 0xe3, 0xf8, 0x2, 0xe3, 0xdf, 0xf7, 0xe,
+ 0x12, 0xf7, 0x2d, 0xf7, 0x6, 0x7c, 0xef, 0x7e,
+ 0xf7, 0x5, 0x13, 0xf4, 0xf7, 0xe7, 0xf9, 0x10,
+ 0x15, 0xf7, 0x5, 0xf7, 0xe, 0xfb, 0x5, 0x56,
+ 0xa, 0x3f, 0xfd, 0x8a, 0x15, 0xf8, 0x52, 0xe5,
+ 0x6, 0x13, 0xe8, 0x30, 0xa, 0xe, 0x8b, 0xe6,
+ 0xf7, 0x30, 0xce, 0xf7, 0x31, 0xe6, 0x1, 0xf0,
+ 0xeb, 0xf7, 0xb5, 0xeb, 0x3, 0x9d, 0x16, 0xf7,
+ 0xa1, 0x6, 0xf7, 0x2f, 0xf7, 0x20, 0xce, 0xf7,
+ 0x75, 0xf7, 0x39, 0x39, 0xf4, 0xfb, 0x4e, 0x1f,
+ 0xfb, 0xbc, 0x30, 0xde, 0xfb, 0x31, 0x43, 0x48,
+ 0xd3, 0xfb, 0x30, 0x38, 0x6, 0xf7, 0x47, 0x16,
+ 0xf7, 0x30, 0xf7, 0x12, 0xce, 0xfb, 0x12, 0xf7,
+ 0x31, 0xf7, 0xb, 0x7, 0xf7, 0xf, 0xba, 0x38,
+ 0x27, 0xfb, 0x12, 0x46, 0x44, 0xfb, 0x1a, 0x1f,
+ 0xe, 0x7f, 0xe7, 0xf8, 0x13, 0xe7, 0xc1, 0xdf,
+ 0x12, 0xd9, 0xe8, 0xf7, 0x97, 0xe8, 0x17, 0x8a,
+ 0x7f, 0x15, 0xf7, 0x99, 0xe7, 0x32, 0xf7, 0xd6,
+ 0x6, 0xf7, 0x9b, 0xfc, 0x32, 0x5, 0xe4, 0xf8,
+ 0x79, 0xd9, 0xe7, 0xfb, 0x9e, 0x2f, 0xea, 0xfb,
+ 0xcb, 0x6, 0xfb, 0x8b, 0xf8, 0x27, 0x5, 0xfb,
+ 0x4c, 0x2f, 0xda, 0xfc, 0x1d, 0x3c, 0x6, 0xe8,
+ 0xf8, 0xc7, 0x15, 0xe0, 0x71, 0x5, 0xaf, 0x9a,
+ 0x97, 0xa6, 0xa7, 0x1b, 0xb2, 0x9f, 0x79, 0x7a,
+ 0xa2, 0x1f, 0x13, 0x60, 0x7d, 0x9e, 0x9f, 0x7f,
+ 0xac, 0x1b, 0xd7, 0xbb, 0xc7, 0xcb, 0x9a, 0x1f,
+ 0x38, 0xa5, 0x5, 0x75, 0x84, 0x7c, 0x5f, 0x68,
+ 0x1b, 0x6f, 0x7b, 0x99, 0x99, 0x79, 0x1f, 0x9b,
+ 0x77, 0x73, 0x9c, 0x5c, 0x1b, 0x3a, 0x5f, 0x48,
+ 0x55, 0x7c, 0x1f, 0xe, 0x61, 0xa, 0xf7, 0x72,
+ 0x54, 0xa, 0xa1, 0xf7, 0xa2, 0x2f, 0xa, 0xf7,
+ 0x2b, 0x2e, 0xf7, 0x1f, 0x26, 0xa, 0xa3, 0xf8,
+ 0x2a, 0x15, 0xf7, 0xd0, 0x40, 0xa5, 0xc5, 0xfb,
+ 0xbf, 0xf7, 0xe, 0x5, 0xe, 0x61, 0xa, 0xf7,
+ 0x72, 0x54, 0xa, 0xa1, 0xf7, 0xa2, 0x25, 0xa,
+ 0xd0, 0xf7, 0xdf, 0x15, 0xf7, 0xd4, 0xd5, 0x61,
+ 0xf5, 0xfb, 0xbe, 0xfb, 0xd, 0x5, 0xe, 0x61,
+ 0xa, 0xf7, 0x6e, 0x54, 0xa, 0xf7, 0x2b, 0xf8,
+ 0xee, 0x15, 0xf7, 0x2c, 0xf2, 0xf7, 0x2c, 0x24,
+ 0xc6, 0xaf, 0xfb, 0x35, 0xf7, 0x22, 0x5, 0x29,
+ 0x6, 0xfb, 0x3a, 0xfb, 0x21, 0x5, 0x48, 0xfc,
+ 0x5, 0x25, 0xa, 0xe, 0x61, 0xa, 0xbb, 0xdf,
+ 0x73, 0xdf, 0x90, 0x77, 0x12, 0xa1, 0xed, 0xf7,
+ 0xff, 0xea, 0x13, 0xd6, 0xe7, 0xf9, 0xe, 0x15,
+ 0xe3, 0x71, 0x5, 0xae, 0x99, 0x99, 0xa6, 0xa6,
+ 0x1b, 0xac, 0x9e, 0x7d, 0x7d, 0xa0, 0x1f, 0x13,
+ 0xee, 0x7d, 0xa0, 0xa2, 0x79, 0xb6, 0x1b, 0xd9,
+ 0xbe, 0xc6, 0xcb, 0x9a, 0x1f, 0x36, 0xa5, 0x5,
+ 0x75, 0x83, 0x7c, 0x60, 0x66, 0x1b, 0x6a, 0x7c,
+ 0x9d, 0x9b, 0x74, 0x1f, 0x13, 0xd6, 0x98, 0x78,
+ 0x72, 0x98, 0x5f, 0x1b, 0x39, 0x5e, 0x49, 0x55,
+ 0x7b, 0x1f, 0x45, 0xfc, 0x0, 0x25, 0xa, 0xe,
+ 0x79, 0xe4, 0xf8, 0x15, 0xe6, 0xd8, 0xf7, 0x10,
+ 0x1, 0xa1, 0xed, 0xae, 0xf7, 0x5, 0xd1, 0xf7,
+ 0x5, 0xab, 0xea, 0x3, 0xf7, 0xe6, 0xf9, 0xe,
+ 0x53, 0xa, 0xfb, 0x4b, 0xfb, 0x10, 0x53, 0xa,
+ 0xfb, 0x19, 0xfc, 0x7c, 0x25, 0xa, 0xe, 0xc7,
+ 0x76, 0xf8, 0x4b, 0x77, 0x1, 0xdc, 0xef, 0x15,
+ 0xc8, 0x4e, 0xf7, 0x32, 0xf7, 0x33, 0xf7, 0x32,
+ 0xfb, 0x33, 0xc8, 0xc8, 0xfb, 0x31, 0xf7, 0x32,
+ 0xf7, 0x30, 0xf7, 0x30, 0x4f, 0xc8, 0xfb, 0x33,
+ 0xfb, 0x30, 0xfb, 0x32, 0xf7, 0x33, 0x4e, 0x4f,
+ 0xf7, 0x33, 0xfb, 0x33, 0x5, 0xe, 0x7c, 0xe6,
+ 0x3e, 0x76, 0xf8, 0x93, 0xe8, 0x8d, 0x77, 0x12,
+ 0xa1, 0xee, 0xf8, 0x2, 0xe6, 0x13, 0x6c, 0xad,
+ 0xa3, 0x15, 0xcc, 0x5d, 0xba, 0xbf, 0x5, 0x13,
+ 0x9c, 0x6d, 0xbb, 0xc1, 0x7c, 0xc2, 0x1b, 0xf2,
+ 0xf7, 0x40, 0xd1, 0xf7, 0x76, 0xce, 0x78, 0xd3,
+ 0x61, 0xc4, 0x1f, 0xbc, 0xc6, 0x4b, 0xbb, 0x62,
+ 0x58, 0x5, 0x13, 0xac, 0xa9, 0x61, 0x56, 0x9e,
+ 0x4c, 0x1b, 0xfb, 0x44, 0x8a, 0x22, 0xfb, 0x24,
+ 0xfb, 0x30, 0x1a, 0x38, 0xa3, 0x4b, 0xb2, 0x5a,
+ 0x1e, 0xcd, 0xda, 0x15, 0x77, 0xa9, 0x81, 0xb9,
+ 0xb4, 0x1a, 0xe9, 0xc7, 0xf7, 0x6, 0xf7, 0xe,
+ 0xb2, 0xab, 0x80, 0x7a, 0xa4, 0x1e, 0xfb, 0x54,
+ 0xfb, 0xfa, 0x15, 0xf7, 0x8a, 0xf7, 0xbd, 0x5,
+ 0xa1, 0x6a, 0x97, 0x54, 0x6c, 0x1a, 0x38, 0x58,
+ 0xfb, 0xe, 0xfb, 0x19, 0x65, 0x6a, 0x95, 0x9c,
+ 0x72, 0x1e, 0xe, 0x4f, 0xa, 0xf7, 0x20, 0xf9,
+ 0x3b, 0x15, 0xf7, 0xca, 0x41, 0xa5, 0xc5, 0xfb,
+ 0xb9, 0xf7, 0xd, 0x5, 0xfb, 0x47, 0xfb, 0xd8,
+ 0x15, 0x27, 0xa, 0x4f, 0xa, 0xf7, 0x4d, 0xf8,
+ 0xf1, 0x15, 0xf7, 0xcd, 0xd4, 0x62, 0xf5, 0xfb,
+ 0xb9, 0x6a, 0xa, 0xfb, 0x34, 0xfb, 0x60, 0x15,
+ 0x27, 0xa, 0x79, 0xe6, 0xf8, 0x16, 0xe5, 0xf7,
+ 0x7b, 0x52, 0xa, 0xf7, 0x26, 0xf8, 0xef, 0x15,
+ 0xf7, 0x2a, 0xf1, 0xf7, 0x28, 0x25, 0xc5, 0xae,
+ 0xfb, 0x32, 0xf7, 0x22, 0x5, 0x2c, 0x6, 0xfb,
+ 0x37, 0xfb, 0x21, 0x5, 0x39, 0xfb, 0x47, 0x15,
+ 0x27, 0xa, 0x79, 0xe4, 0xf8, 0x11, 0xe3, 0xe1,
+ 0xf7, 0xe, 0x12, 0xdf, 0xea, 0x6d, 0xf7, 0x3,
+ 0xd0, 0xf7, 0x2, 0x7c, 0xea, 0x13, 0xec, 0xf7,
+ 0xdd, 0xf9, 0x10, 0x15, 0xf7, 0x2, 0xf7, 0xe,
+ 0xfb, 0x2, 0x6, 0xfb, 0x48, 0xfb, 0xe, 0x15,
+ 0xf7, 0x3, 0xf7, 0xe, 0x6b, 0xa, 0xfb, 0x25,
+ 0xfb, 0xbe, 0x15, 0x13, 0xf2, 0x27, 0xa, 0x8b,
+ 0xe5, 0xf8, 0x9, 0xe5, 0xf7, 0x7b, 0x77, 0x1,
+ 0xf7, 0x8e, 0xec, 0x3, 0xf7, 0x12, 0x16, 0xf7,
+ 0xeb, 0xe5, 0xfb, 0xe, 0xf7, 0x6, 0x6, 0xf7,
+ 0x34, 0xf7, 0x97, 0x5, 0xdc, 0xe5, 0xfb, 0x82,
+ 0x31, 0xc2, 0x6, 0x21, 0xfb, 0x41, 0x24, 0xf7,
+ 0x41, 0x5, 0xc0, 0xe5, 0xfb, 0x82, 0x31, 0xda,
+ 0x6, 0xf7, 0x34, 0xfb, 0x97, 0x5, 0xfb, 0x6,
+ 0xfb, 0x10, 0x7, 0xc9, 0xf8, 0x98, 0x15, 0xf7,
+ 0xce, 0xd4, 0x62, 0xf4, 0xfb, 0xbb, 0xfb, 0xb,
+ 0x5, 0xe, 0x8b, 0xe6, 0xbe, 0xdb, 0xf7, 0x9,
+ 0xdb, 0xbf, 0xe6, 0x1, 0xf7, 0x2a, 0xde, 0xf7,
+ 0x81, 0xdf, 0x3, 0xb8, 0x16, 0xf7, 0xc5, 0xe6,
+ 0xfb, 0x9, 0xbe, 0xf7, 0xf, 0x6, 0xee, 0xee,
+ 0x9c, 0xf7, 0x13, 0xf7, 0x29, 0xfb, 0x1d, 0x7b,
+ 0x28, 0x1f, 0x36, 0xbf, 0xf7, 0xb, 0xe6, 0xfb,
+ 0xc5, 0x30, 0xf2, 0xfc, 0x10, 0x22, 0x6, 0xf7,
+ 0x50, 0xf7, 0x17, 0x15, 0xf7, 0x9, 0xf7, 0x16,
+ 0x7, 0xb1, 0xd0, 0x8c, 0x50, 0x48, 0x47, 0x93,
+ 0x6a, 0x1f, 0xe, 0x7c, 0xe9, 0x39, 0xe9, 0xf7,
+ 0x90, 0xe9, 0xea, 0xe9, 0x12, 0x98, 0xf7, 0x46,
+ 0x2b, 0xeb, 0xf7, 0x78, 0xeb, 0x72, 0xec, 0x13,
+ 0x7a, 0x98, 0x88, 0x15, 0xf7, 0x46, 0xf8, 0x56,
+ 0x6, 0xdc, 0xab, 0x8f, 0xcf, 0xd7, 0xbf, 0x87,
+ 0x70, 0x6e, 0x55, 0x7d, 0x62, 0x75, 0x1e, 0x66,
+ 0x77, 0x63, 0x6e, 0x5a, 0x1a, 0x38, 0xd4, 0x71,
+ 0xd9, 0x6f, 0x1e, 0x13, 0xb9, 0xab, 0x80, 0xc7,
+ 0x7f, 0x62, 0x1a, 0x69, 0x5a, 0x73, 0x4e, 0x66,
+ 0x42, 0x97, 0xa5, 0x73, 0x1e, 0x6e, 0x34, 0x5,
+ 0x67, 0xc8, 0xb3, 0x82, 0xc1, 0x1b, 0xf7, 0x18,
+ 0xde, 0xd4, 0xe0, 0xe5, 0x3d, 0xa2, 0x42, 0xa3,
+ 0x1f, 0x5b, 0x9b, 0x5f, 0x9b, 0xa4, 0x1a, 0xa1,
+ 0xaf, 0x9b, 0xb0, 0x9c, 0x1e, 0x13, 0xb6, 0xc6,
+ 0xa6, 0xb2, 0x9f, 0xcb, 0x1a, 0xd5, 0x51, 0xbc,
+ 0xfb, 0x40, 0xfb, 0x3a, 0x73, 0x4a, 0xfb, 0x10,
+ 0x1e, 0x13, 0xba, 0x39, 0x2d, 0x6, 0x13, 0x76,
+ 0xdd, 0xfb, 0x90, 0x6, 0x13, 0x7a, 0x39, 0x6,
+ 0xe, 0x39, 0xa, 0xf7, 0x78, 0x77, 0x3b, 0xa,
+ 0xf7, 0x13, 0xf8, 0xc1, 0x15, 0xf7, 0xd5, 0x3f,
+ 0xa2, 0xc5, 0xfb, 0xc2, 0xf7, 0xe, 0x5, 0x42,
+ 0xfb, 0xf8, 0x51, 0xa, 0xaa, 0x70, 0x5b, 0x8a,
+ 0x21, 0xa, 0x39, 0xa, 0xf7, 0x78, 0x77, 0x3b,
+ 0xa, 0xf7, 0x42, 0xf8, 0x75, 0x15, 0xf7, 0xd5,
+ 0xd7, 0x61, 0xf3, 0xfb, 0xc2, 0xfb, 0xe, 0x5,
+ 0x54, 0xfb, 0x7e, 0x51, 0xa, 0xab, 0x70, 0x5b,
+ 0x89, 0x21, 0xa, 0x39, 0xa, 0xf7, 0x74, 0x77,
+ 0x3b, 0xa, 0xf7, 0x1a, 0xf8, 0x72, 0x15, 0xf7,
+ 0x2c, 0xf3, 0xf7, 0x2d, 0x23, 0xc7, 0xae, 0xfb,
+ 0x36, 0xf7, 0x24, 0x5, 0x27, 0x6, 0xfb, 0x3a,
+ 0xfb, 0x23, 0x5, 0xa4, 0xfb, 0x65, 0x15, 0x9b,
+ 0xa9, 0xf4, 0xa4, 0xd7, 0x1b, 0xbf, 0xa9, 0x70,
+ 0x5b, 0x21, 0xa, 0x39, 0xa, 0xf7, 0x7, 0xe0,
+ 0x8e, 0x77, 0x34, 0xa, 0x13, 0xbb, 0x0, 0xf7,
+ 0x32, 0xf8, 0x7a, 0x15, 0xa3, 0x98, 0x94, 0xb1,
+ 0xb1, 0x1b, 0xa0, 0xa8, 0x7a, 0x7b, 0xa9, 0x1f,
+ 0x7d, 0xa5, 0xa6, 0x7f, 0xa4, 0x1b, 0xf2, 0xac,
+ 0xe3, 0xad, 0x96, 0x1f, 0x13, 0xb7, 0x0, 0x35,
+ 0xa4, 0x5, 0x61, 0x78, 0x80, 0x76, 0x6e, 0x1b,
+ 0x77, 0x74, 0x96, 0x98, 0x74, 0x1f, 0x13, 0xbb,
+ 0x0, 0x9c, 0x6d, 0x6b, 0x9e, 0x6c, 0x1b, 0x28,
+ 0x6c, 0x3d, 0x5f, 0x79, 0x1f, 0xa4, 0xfb, 0x62,
+ 0x15, 0x9b, 0xa9, 0xf4, 0xa4, 0xd7, 0x1b, 0x3d,
+ 0xa, 0x13, 0x7a, 0x80, 0x4d, 0xa, 0x13, 0x7b,
+ 0x0, 0x2b, 0xa, 0x13, 0xbb, 0x0, 0x29, 0xa,
+ 0x39, 0xa, 0xcf, 0xf7, 0x10, 0x12, 0xab, 0xec,
+ 0x90, 0xf7, 0x5, 0xd4, 0xf7, 0x4, 0x60, 0xea,
+ 0x2c, 0xf7, 0x46, 0x13, 0xbf, 0x0, 0xf7, 0xd4,
+ 0xf8, 0x89, 0x15, 0xf7, 0x4, 0xf7, 0x10, 0xfb,
+ 0x4, 0x6, 0xfb, 0x4e, 0xfb, 0x10, 0x53, 0xa,
+ 0x65, 0xfb, 0xd4, 0x3f, 0xa, 0x13, 0xbe, 0x80,
+ 0x3d, 0xa, 0x13, 0x7e, 0x40, 0x4d, 0xa, 0x13,
+ 0x7e, 0x80, 0x2b, 0xa, 0x13, 0xbe, 0x80, 0x29,
+ 0xa, 0x39, 0xa, 0xba, 0xf7, 0x5a, 0x3b, 0xa,
+ 0xf7, 0x46, 0xf8, 0xe0, 0x15, 0x55, 0xbc, 0x62,
+ 0xc8, 0xc8, 0xbc, 0xb4, 0xc1, 0xc1, 0x5a, 0xaf,
+ 0x4e, 0x4e, 0x5a, 0x67, 0x55, 0x1e, 0xcc, 0x16,
+ 0xa0, 0xa0, 0x95, 0xa3, 0xa4, 0x9e, 0x81, 0x76,
+ 0x75, 0x78, 0x7e, 0x72, 0x73, 0x76, 0x98, 0xa1,
+ 0x1e, 0xfb, 0x27, 0xfb, 0xaf, 0x51, 0xa, 0xa6,
+ 0x70, 0x5b, 0x8e, 0x21, 0xa, 0x7c, 0xed, 0x3f,
+ 0x76, 0xf7, 0x53, 0xe8, 0x40, 0xe6, 0xd5, 0xe9,
+ 0x12, 0x89, 0xec, 0xf7, 0x29, 0xee, 0x13, 0xae,
+ 0xf7, 0xb9, 0xc5, 0x15, 0x52, 0xa6, 0xc6, 0x7b,
+ 0xcc, 0x1b, 0xc0, 0xc6, 0x99, 0xa0, 0xba, 0x1f,
+ 0x6b, 0xe7, 0x5, 0x73, 0x4d, 0x62, 0x86, 0x74,
+ 0x1b, 0x37, 0x7d, 0xd1, 0xa0, 0x1f, 0x8e, 0xf7,
+ 0x89, 0x7, 0x8d, 0x9f, 0x8c, 0x9e, 0x9e, 0x1a,
+ 0xf7, 0x11, 0x5d, 0xe9, 0xfb, 0xa, 0x5f, 0x5b,
+ 0x78, 0x68, 0x6e, 0x1e, 0x7f, 0xb0, 0x5b, 0x9a,
+ 0x54, 0x8c, 0x48, 0x8c, 0x3e, 0x78, 0x6e, 0x74,
+ 0xa5, 0x39, 0x18, 0x9b, 0xb5, 0xc0, 0x99, 0xb6,
+ 0x1b, 0xbb, 0x97, 0x7a, 0x4d, 0x89, 0x1f, 0x13,
+ 0x5e, 0x8d, 0x73, 0x78, 0x8e, 0x66, 0x1b, 0xfb,
+ 0xb, 0x5c, 0x31, 0x44, 0x3d, 0xc4, 0x4e, 0xe1,
+ 0xd3, 0xbb, 0xb9, 0xa5, 0xab, 0x1f, 0x13, 0xae,
+ 0xbd, 0xf7, 0x68, 0x15, 0xc8, 0x8f, 0xb3, 0xa8,
+ 0xb5, 0x1b, 0xc4, 0x96, 0x47, 0x75, 0x8d, 0x1f,
+ 0xfb, 0x93, 0xfb, 0x1d, 0x15, 0x6e, 0x6f, 0x69,
+ 0x73, 0x62, 0x1b, 0x79, 0x6f, 0x98, 0xad, 0x1f,
+ 0x13, 0x9e, 0xb0, 0xa3, 0xaa, 0xc3, 0x9e, 0xa2,
+ 0x88, 0x84, 0xa6, 0x1e, 0xe, 0xfb, 0x4d, 0x76,
+ 0xf7, 0x5b, 0xe7, 0xf7, 0xa2, 0xe9, 0x12, 0xba,
+ 0xec, 0xf7, 0x13, 0xf7, 0x21, 0x95, 0xeb, 0x17,
+ 0xf7, 0x80, 0xfb, 0x45, 0x15, 0x7a, 0xa0, 0xa6,
+ 0x7f, 0xaa, 0x1b, 0xcc, 0xab, 0xbe, 0xbd, 0xa6,
+ 0x82, 0xb7, 0x5a, 0x97, 0x1f, 0x9d, 0x7, 0xd5,
+ 0x97, 0xd0, 0xad, 0xc2, 0xb7, 0x55, 0xd4, 0x18,
+ 0x62, 0x51, 0x55, 0x6a, 0x3c, 0x1b, 0x39, 0x3a,
+ 0xb8, 0xe9, 0xdb, 0xca, 0xbe, 0xf3, 0xb2, 0xb3,
+ 0x8b, 0x7c, 0xab, 0x1f, 0x30, 0xeb, 0xf7, 0x5c,
+ 0x2b, 0x82, 0x7, 0x95, 0x68, 0x65, 0x8a, 0x65,
+ 0x1b, 0xfb, 0x49, 0x38, 0xfb, 0x4, 0xfb, 0x3,
+ 0xfb, 0x21, 0xf7, 0x3, 0x39, 0xf7, 0x9, 0x81,
+ 0x1f, 0x84, 0x2e, 0x5, 0x8c, 0x95, 0xa0, 0x91,
+ 0x9b, 0x1b, 0x97, 0x94, 0x85, 0x7c, 0x7d, 0x80,
+ 0x84, 0x7d, 0x7a, 0x77, 0x8f, 0x94, 0x82, 0x1f,
+ 0xe, 0x55, 0xa, 0xf7, 0x77, 0x77, 0x1, 0xf7,
+ 0x1e, 0xf8, 0xc3, 0x15, 0xf7, 0xd2, 0x3f, 0xa1,
+ 0xc6, 0xfb, 0xbd, 0xf7, 0xb, 0x5, 0x5e, 0xfc,
+ 0x7f, 0x24, 0xa, 0x55, 0xa, 0xf7, 0x77, 0x77,
+ 0x1, 0xf7, 0x4d, 0xf8, 0x76, 0x15, 0xf7, 0xd3,
+ 0xd7, 0x60, 0xf2, 0xfb, 0xbf, 0x6a, 0xa, 0x71,
+ 0xfc, 0x7, 0x24, 0xa, 0x55, 0xa, 0xf7, 0x73,
+ 0x77, 0x1, 0xf7, 0x23, 0xf8, 0x73, 0x15, 0xf7,
+ 0x2c, 0xf2, 0xf7, 0x2c, 0x24, 0xc7, 0xad, 0xfb,
+ 0x36, 0xf7, 0x24, 0x5, 0x28, 0x6, 0xfb, 0x39,
+ 0xfb, 0x23, 0x5, 0xc2, 0xfb, 0xec, 0x24, 0xa,
+ 0x55, 0xa, 0xcc, 0xf7, 0x12, 0x1, 0xf7, 0x24,
+ 0xf7, 0x4, 0xd2, 0xf7, 0x4, 0x3, 0xf7, 0xdb,
+ 0xf8, 0x87, 0x72, 0xa, 0xfb, 0x4b, 0xfb, 0x12,
+ 0x72, 0xa, 0x83, 0xfc, 0x5b, 0x24, 0xa, 0x57,
+ 0xa, 0xf7, 0x17, 0xf8, 0xc2, 0x15, 0xf7, 0xd4,
+ 0x40, 0xa3, 0xc5, 0xfb, 0xc1, 0xf7, 0xc, 0x5,
+ 0x2a, 0xfd, 0x29, 0x33, 0xa, 0x57, 0xa, 0xf7,
+ 0x48, 0xf8, 0x77, 0x15, 0xf7, 0xd2, 0xd6, 0x61,
+ 0xf2, 0xfb, 0xc0, 0x6a, 0xa, 0x3c, 0xfc, 0xb1,
+ 0x33, 0xa, 0x8b, 0xe5, 0xf7, 0x84, 0xe6, 0xf7,
+ 0x80, 0x77, 0x1, 0xf7, 0x8d, 0xf1, 0x3, 0xd1,
+ 0xf8, 0x98, 0x15, 0xcb, 0x67, 0xf7, 0x31, 0xf1,
+ 0xf7, 0x31, 0x25, 0xc9, 0xae, 0xfb, 0x3b, 0xf7,
+ 0x22, 0x5, 0x24, 0x6, 0xfb, 0x30, 0xfd, 0x25,
+ 0x33, 0xa, 0x8b, 0xe6, 0xf7, 0x86, 0xe6, 0xd7,
+ 0xf7, 0x11, 0x12, 0xf7, 0x20, 0xf7, 0x4, 0x8a,
+ 0xec, 0x72, 0xf7, 0x5, 0x13, 0xf4, 0xf7, 0xd7,
+ 0xf8, 0x88, 0x15, 0xf7, 0x5, 0xf7, 0x11, 0xfb,
+ 0x5, 0x6, 0xfb, 0x4b, 0xfb, 0x11, 0x15, 0xf7,
+ 0x4, 0xf7, 0x11, 0xfb, 0x4, 0x6, 0x4c, 0xfd,
+ 0x5, 0x15, 0xf8, 0x52, 0xe6, 0x6, 0x13, 0xe8,
+ 0xfb, 0x43, 0xf7, 0xe1, 0xfb, 0x7e, 0x30, 0xf7,
+ 0x1d, 0xfb, 0x86, 0xfb, 0x42, 0x6, 0xe, 0x70,
+ 0xe3, 0xf7, 0x96, 0xe4, 0xf7, 0x6e, 0x77, 0x1,
+ 0xc4, 0xe8, 0xf7, 0xc1, 0xe6, 0x3, 0xf7, 0x51,
+ 0xf8, 0x48, 0x15, 0xf7, 0x5, 0xc2, 0xd1, 0x62,
+ 0xb7, 0x47, 0x8c, 0x87, 0x19, 0x9d, 0x6d, 0x77,
+ 0x97, 0x4c, 0x1b, 0xfb, 0x39, 0x39, 0xfb, 0x0,
+ 0xfb, 0x3, 0xfb, 0x0, 0xdd, 0xfb, 0x0, 0xf7,
+ 0x37, 0xf7, 0x3a, 0xd5, 0xf7, 0x3, 0xf7, 0x17,
+ 0xf7, 0x44, 0xfb, 0xa, 0xf6, 0x59, 0xaa, 0x1f,
+ 0xea, 0xb5, 0x6c, 0xc1, 0xfb, 0x15, 0x4e, 0x6f,
+ 0x9d, 0x3c, 0xb0, 0x63, 0x92, 0x19, 0x70, 0x4f,
+ 0xad, 0x83, 0xad, 0x7b, 0xab, 0x7d, 0x19, 0x3b,
+ 0x65, 0x5, 0x86, 0xfb, 0xc2, 0x15, 0xe7, 0xdb,
+ 0xb2, 0xd1, 0xf5, 0xb8, 0x49, 0x4c, 0x30, 0x3d,
+ 0x65, 0x45, 0x40, 0x3d, 0xb0, 0xe5, 0x1e, 0xe,
+ 0x8b, 0xe7, 0xf7, 0x97, 0xe5, 0x31, 0xe7, 0xf7,
+ 0x55, 0x77, 0x12, 0x98, 0xf7, 0x46, 0x2b, 0xeb,
+ 0xf7, 0x72, 0xeb, 0x13, 0xda, 0xe8, 0xf8, 0x95,
+ 0x15, 0xe1, 0x71, 0x96, 0x9f, 0x93, 0xad, 0xa1,
+ 0x8d, 0x19, 0xa1, 0x8d, 0xa4, 0x82, 0xb1, 0x77,
+ 0x8, 0x7e, 0xa4, 0xa8, 0x7e, 0xac, 0x1b, 0xf0,
+ 0xab, 0xe3, 0xad, 0x97, 0x1f, 0x35, 0xa3, 0x5,
+ 0x62, 0x79, 0x81, 0x76, 0x6e, 0x1b, 0x79, 0x77,
+ 0x94, 0x96, 0x77, 0x1f, 0x9c, 0x6b, 0x6a, 0xa2,
+ 0x6a, 0x1b, 0x2a, 0x6d, 0x3d, 0x60, 0x79, 0x1f,
+ 0x3c, 0xfc, 0x95, 0x15, 0xf7, 0x95, 0xe7, 0x3b,
+ 0xf7, 0x56, 0x6, 0xb6, 0xbd, 0xce, 0xa1, 0xa9,
+ 0x1b, 0xd0, 0x91, 0x6c, 0x64, 0x1f, 0xfb, 0x51,
+ 0x3d, 0x2f, 0xf7, 0x90, 0xe7, 0x3d, 0xf7, 0x66,
+ 0x7, 0xe6, 0x43, 0xbb, 0x31, 0x53, 0x51, 0x70,
+ 0x70, 0x61, 0x1e, 0x13, 0xba, 0xc3, 0xfb, 0x46,
+ 0x2f, 0x7, 0x13, 0xb6, 0xdd, 0xfb, 0x97, 0x3a,
+ 0x6, 0xe, 0x7b, 0xe7, 0xf7, 0xa0, 0xe7, 0xf7,
+ 0x75, 0x77, 0x4b, 0xa, 0xf7, 0x24, 0xf8, 0xc1,
+ 0x15, 0xf7, 0xda, 0x40, 0xa2, 0xc5, 0xfb, 0xc7,
+ 0xf7, 0xd, 0x5, 0xfb, 0x30, 0xfc, 0x5a, 0x23,
+ 0xa, 0x62, 0xa, 0xf7, 0x75, 0x77, 0x4b, 0xa,
+ 0xf7, 0x53, 0xf8, 0x76, 0x15, 0xf7, 0xda, 0xd6,
+ 0x61, 0xf3, 0xfb, 0xc7, 0xfb, 0xd, 0x5, 0xfb,
+ 0x1e, 0xfb, 0xe1, 0x23, 0xa, 0x62, 0xa, 0xf7,
+ 0x71, 0x77, 0x4b, 0xa, 0xf7, 0x2a, 0xf8, 0x72,
+ 0x15, 0xf7, 0x30, 0xf3, 0xf7, 0x2f, 0x23, 0xc7,
+ 0xad, 0xfb, 0x38, 0xf7, 0x25, 0x5, 0x24, 0x6,
+ 0xfb, 0x3b, 0xfb, 0x23, 0x5, 0x52, 0xfb, 0xc7,
+ 0x23, 0xa, 0x62, 0xa, 0xf7, 0x5, 0xe0, 0x8d,
+ 0x77, 0x12, 0xa9, 0xef, 0xf7, 0xe9, 0xee, 0x13,
+ 0xec, 0xe3, 0xf8, 0x94, 0x15, 0xe4, 0x71, 0x5,
+ 0xa5, 0x96, 0x98, 0xb0, 0xae, 0x1b, 0x9f, 0xa0,
+ 0x7e, 0x7d, 0xa3, 0x1f, 0x7b, 0xa7, 0xa9, 0x7a,
+ 0xb0, 0x1b, 0xf5, 0xac, 0xe4, 0xad, 0x95, 0x1f,
+ 0x13, 0xdc, 0x33, 0xa3, 0x5, 0x62, 0x79, 0x81,
+ 0x76, 0x6d, 0x1b, 0x74, 0x71, 0x99, 0x9a, 0x70,
+ 0x1f, 0x13, 0xec, 0x9a, 0x6f, 0x6e, 0x9b, 0x6f,
+ 0x1b, 0x26, 0x6b, 0x3d, 0x5f, 0x7a, 0x1f, 0x51,
+ 0xfb, 0xc5, 0x23, 0xa, 0x62, 0xa, 0xca, 0xf7,
+ 0x12, 0x1, 0xa9, 0xef, 0xa0, 0xf7, 0x6, 0xd5,
+ 0xf7, 0x6, 0x9d, 0xee, 0x3, 0xf7, 0xe7, 0xf8,
+ 0x87, 0x70, 0xa, 0xfb, 0x50, 0xfb, 0x12, 0x70,
+ 0xa, 0xfb, 0xd, 0xfc, 0x36, 0x23, 0xa, 0x9b,
+ 0xf7, 0x1d, 0xbd, 0xf7, 0x2, 0xbd, 0xf7, 0x1d,
+ 0x1, 0xf7, 0x79, 0xf7, 0x28, 0x14, 0xe0, 0x5c,
+ 0xa, 0xf7, 0x32, 0xf7, 0xa, 0x15, 0x49, 0xa,
+ 0xfb, 0xef, 0x4, 0x49, 0xa, 0xe, 0x7a, 0xe9,
+ 0x3b, 0x76, 0xf8, 0x1c, 0xea, 0x12, 0xa9, 0xed,
+ 0xf7, 0xed, 0xec, 0x13, 0x78, 0xb2, 0xa9, 0x15,
+ 0x8d, 0xc1, 0x56, 0x8a, 0x8d, 0x1f, 0x8b, 0xa1,
+ 0x9e, 0xaa, 0xa7, 0x1e, 0x13, 0xb8, 0x72, 0xb6,
+ 0xbe, 0x7c, 0xc3, 0x1b, 0xf7, 0x29, 0xf7, 0xd,
+ 0xf6, 0xf7, 0x18, 0xc0, 0x77, 0xbd, 0x69, 0xb3,
+ 0x1f, 0xa7, 0xa6, 0x9b, 0x9c, 0x8b, 0x8b, 0x53,
+ 0xbf, 0x8a, 0x1a, 0x8b, 0x77, 0x7f, 0x6c, 0x6e,
+ 0x1e, 0xa6, 0x60, 0x56, 0x9c, 0x52, 0x1b, 0xfb,
+ 0x29, 0xfb, 0xd, 0xfb, 0x1, 0xfb, 0x18, 0x53,
+ 0xa0, 0x59, 0xaf, 0x62, 0x1f, 0x6d, 0x6f, 0x79,
+ 0x7a, 0x8b, 0x1a, 0xf7, 0xa, 0xf7, 0x3, 0x15,
+ 0x78, 0xa2, 0x81, 0xa6, 0xa9, 0x1a, 0xdb, 0xd8,
+ 0xce, 0xea, 0xa7, 0xa7, 0x83, 0x81, 0xa3, 0x1e,
+ 0x45, 0x4a, 0x36, 0x3b, 0x47, 0x4b, 0x8, 0xcd,
+ 0x5a, 0x15, 0xd0, 0xcb, 0xe1, 0xdb, 0xce, 0xca,
+ 0x8, 0x9d, 0x75, 0x95, 0x70, 0x6e, 0x1a, 0x3b,
+ 0x3d, 0x4b, 0x2c, 0x6f, 0x71, 0x90, 0x95, 0x74,
+ 0x1e, 0xe, 0x3c, 0xa, 0xf7, 0x17, 0xf8, 0xc3,
+ 0x15, 0xf7, 0xcc, 0x3d, 0xa2, 0xc7, 0xfb, 0xbc,
+ 0xf7, 0xc, 0x5, 0xfb, 0x2f, 0xfb, 0xde, 0x28,
+ 0xa, 0x3c, 0xa, 0xf7, 0x43, 0xf8, 0x76, 0x15,
+ 0xf7, 0xcf, 0xd7, 0x62, 0xf2, 0xfb, 0xbd, 0x6a,
+ 0xa, 0xfb, 0x1d, 0xfb, 0x66, 0x28, 0xa, 0x4a,
+ 0xa, 0xf7, 0x7f, 0x36, 0xa, 0xf7, 0x1d, 0xf8,
+ 0x71, 0x15, 0xf7, 0x2a, 0xf4, 0xf7, 0x29, 0x22,
+ 0xc6, 0xae, 0xfb, 0x34, 0xf7, 0x25, 0x5, 0x2b,
+ 0x6, 0xfb, 0x37, 0xfb, 0x24, 0x5, 0x4e, 0xfb,
+ 0x4a, 0x28, 0xa, 0x4a, 0xa, 0xd9, 0xf7, 0x11,
+ 0x12, 0x9a, 0xf7, 0x42, 0x2e, 0xe8, 0x5a, 0xf7,
+ 0x2, 0xd0, 0xf7, 0x2, 0x29, 0xf7, 0x41, 0x2d,
+ 0xe9, 0x2d, 0xf7, 0x43, 0x13, 0xb3, 0x0, 0xf7,
+ 0xd3, 0xf8, 0x88, 0x6f, 0xa, 0xfb, 0x47, 0xfb,
+ 0x11, 0x6f, 0xa, 0x13, 0xb9, 0x0, 0xfb, 0x11,
+ 0xfb, 0xba, 0x15, 0x13, 0xb4, 0x40, 0x2e, 0xa,
+ 0x13, 0x78, 0x20, 0x64, 0xf7, 0x43, 0xe6, 0x7,
+ 0x13, 0x78, 0x80, 0x3a, 0xf7, 0xe1, 0xfb, 0x41,
+ 0x30, 0x6, 0x13, 0xb8, 0x40, 0x2c, 0xa, 0xfb,
+ 0x22, 0xe2, 0xf8, 0x26, 0xe2, 0xf7, 0x77, 0x77,
+ 0x1, 0xf7, 0x59, 0xf8, 0x7f, 0x15, 0xf7, 0xcf,
+ 0xd2, 0x62, 0xee, 0xfb, 0xbe, 0xfb, 0x7, 0x5,
+ 0xfb, 0x19, 0xfc, 0xed, 0x15, 0x34, 0xf7, 0xc9,
+ 0xe2, 0x33, 0x3a, 0xa, 0xfb, 0xa7, 0x35, 0xfb,
+ 0x13, 0x5, 0xe, 0xfb, 0x22, 0xe4, 0xe0, 0xe3,
+ 0xf7, 0x9a, 0xe4, 0xcd, 0xe4, 0x12, 0x93, 0xf7,
+ 0x49, 0x29, 0xed, 0xf7, 0xc4, 0xee, 0x13, 0xfa,
+ 0x93, 0x56, 0x15, 0x32, 0xf7, 0xe1, 0xe4, 0xfb,
+ 0x2c, 0xf7, 0x18, 0x7, 0x7d, 0xa1, 0xc3, 0x6a,
+ 0xde, 0x1b, 0xf7, 0x21, 0xf0, 0xee, 0xf7, 0x10,
+ 0xf7, 0x2b, 0xfb, 0x23, 0xcc, 0x24, 0x51, 0x51,
+ 0x7b, 0x6d, 0x62, 0x1f, 0xf7, 0x5d, 0xfb, 0x49,
+ 0x32, 0x7, 0x13, 0xf6, 0xde, 0xfc, 0xe2, 0x6,
+ 0x13, 0xfa, 0xe9, 0xf7, 0xc6, 0x15, 0xf7, 0x2,
+ 0xf7, 0x9, 0x9e, 0xb4, 0xdb, 0xd1, 0x5d, 0x38,
+ 0x3b, 0x43, 0x56, 0x3c, 0x5c, 0xfb, 0x2, 0xa5,
+ 0xf6, 0x1e, 0xe, 0xfb, 0x22, 0xe1, 0xf8, 0x26,
+ 0xe2, 0xd3, 0xf7, 0xc, 0x1, 0xf7, 0x31, 0xf7,
+ 0x3, 0xd2, 0xf7, 0x3, 0x3, 0xf7, 0xe7, 0xf8,
+ 0x8d, 0x15, 0xf7, 0x3, 0xf7, 0xc, 0x6b, 0xa,
+ 0xfb, 0x4a, 0xfb, 0xc, 0x15, 0xf7, 0x3, 0xf7,
+ 0xc, 0x6b, 0xa, 0xfb, 0x9, 0xfd, 0x3d, 0x15,
+ 0x35, 0xf7, 0xbf, 0xe1, 0x3d, 0x3a, 0xa, 0xfb,
+ 0xa5, 0x35, 0xfb, 0x15, 0x5, 0xe, 0x8b, 0xe6,
+ 0xf7, 0xf2, 0xe6, 0x4e, 0xe6, 0xb6, 0xf7, 0x23,
+ 0x12, 0xf7, 0x8f, 0xf0, 0x13, 0xb8, 0x66, 0xa,
+ 0xe6, 0xfb, 0x3f, 0x6, 0x13, 0xd8, 0xf7, 0xf2,
+ 0x74, 0xa, 0xfb, 0xf2, 0xfb, 0x42, 0x7, 0xf7,
+ 0x3d, 0xf8, 0x96, 0x79, 0xa, 0x6b, 0xa, 0xe,
+ 0x7c, 0xa, 0x40, 0xa, 0xf7, 0xed, 0xfb, 0x7f,
+ 0x2d, 0xf7, 0x1c, 0xfb, 0x8f, 0xfb, 0x41, 0x6,
+ 0xe, 0x79, 0xe6, 0xf8, 0x22, 0xe6, 0x1, 0xcb,
+ 0xf0, 0xf3, 0xed, 0xf0, 0xeb, 0x3, 0x7c, 0x79,
+ 0x15, 0xf7, 0x99, 0xe6, 0x3a, 0xf8, 0x22, 0xd9,
+ 0xe6, 0xfb, 0x95, 0x30, 0xd9, 0xfc, 0x22, 0x3c,
+ 0x6, 0xf7, 0xb0, 0x74, 0x15, 0x78, 0x9e, 0xa2,
+ 0x5a, 0xf5, 0x1b, 0xf7, 0x12, 0xa0, 0xd5, 0xf7,
+ 0x1f, 0x1f, 0xf7, 0xa7, 0xbe, 0xe7, 0xfb, 0x9a,
+ 0x2f, 0xf7, 0x7, 0xfb, 0xa8, 0x7, 0x49, 0x8a,
+ 0x53, 0x56, 0x5b, 0x8c, 0x78, 0xa, 0xfb, 0x23,
+ 0xe4, 0x32, 0xea, 0xf8, 0x31, 0xe6, 0x80, 0x77,
+ 0xe4, 0xf7, 0x24, 0x12, 0xae, 0xf7, 0x25, 0xfb,
+ 0x3, 0xf7, 0x3, 0x29, 0xed, 0xf7, 0x9f, 0xf7,
+ 0xa, 0x13, 0xac, 0x80, 0xd0, 0xf8, 0x97, 0x79,
+ 0xa, 0x6, 0x13, 0x5a, 0x80, 0x6b, 0xa, 0x56,
+ 0xfd, 0x56, 0x15, 0x2c, 0xf7, 0x77, 0xea, 0x4c,
+ 0xf8, 0x81, 0x7, 0x13, 0x9c, 0x80, 0xfb, 0x25,
+ 0x2b, 0x6, 0x13, 0x69, 0x80, 0xba, 0xfc, 0x21,
+ 0x6, 0xf8, 0x1, 0xf8, 0xc6, 0x73, 0xa, 0xfb,
+ 0x24, 0xfd, 0x49, 0x15, 0x73, 0x30, 0x5, 0x87,
+ 0xa9, 0x9a, 0x7b, 0xc8, 0x1b, 0xf7, 0x63, 0x82,
+ 0xf7, 0x1b, 0xc6, 0x1f, 0xf8, 0x2c, 0xfb, 0x80,
+ 0x30, 0xf7, 0x18, 0xfb, 0xcd, 0x7, 0x46, 0x81,
+ 0x66, 0x3b, 0x64, 0x7d, 0x94, 0x95, 0x6a, 0x1e,
+ 0xe, 0x32, 0xa, 0xf7, 0x17, 0xed, 0xf7, 0x85,
+ 0xee, 0x3, 0xa9, 0x16, 0xf8, 0xaf, 0xf7, 0x9c,
+ 0x28, 0xfb, 0x41, 0xfb, 0x85, 0xf7, 0x2e, 0x6,
+ 0xf7, 0x36, 0xbb, 0x5, 0xc9, 0x7, 0xfb, 0x36,
+ 0x5d, 0x5, 0xf7, 0x36, 0xf7, 0x13, 0xe6, 0xfb,
+ 0xda, 0x30, 0xf0, 0xfb, 0x50, 0x7, 0x36, 0x73,
+ 0x5, 0x4c, 0x7, 0xe0, 0xa1, 0x5, 0xfb, 0x13,
+ 0x26, 0x7, 0xe, 0x8b, 0xe9, 0xf8, 0x4a, 0x40,
+ 0xa, 0xf7, 0x68, 0x6, 0xf7, 0x12, 0xaf, 0x5,
+ 0xcd, 0x7, 0xfb, 0x12, 0x67, 0x5, 0xf7, 0x92,
+ 0xfb, 0x9e, 0x2d, 0xf7, 0x3b, 0xfb, 0x4f, 0x7,
+ 0xfb, 0x9, 0x69, 0x5, 0x4b, 0x7, 0xf7, 0x9,
+ 0xab, 0x5, 0xfb, 0x4d, 0xfb, 0x41, 0x7, 0xe,
+ 0x8b, 0xe6, 0x30, 0xf7, 0x3e, 0xa0, 0xf7, 0x4f,
+ 0x94, 0xf7, 0x43, 0x30, 0xe6, 0x12, 0x81, 0xe9,
+ 0xf7, 0x6f, 0xea, 0xaf, 0xd6, 0xa5, 0xd6, 0x13,
+ 0xaf, 0x80, 0xf8, 0x22, 0xe6, 0x15, 0xf7, 0x2b,
+ 0xaf, 0x58, 0xd6, 0xf7, 0x4f, 0x40, 0x5d, 0x67,
+ 0xf7, 0x1f, 0xf7, 0x1d, 0x7, 0x13, 0xb7, 0x80,
+ 0x37, 0xd6, 0xf7, 0x43, 0xfc, 0x16, 0x7, 0xfb,
+ 0xe, 0xfb, 0x4, 0xfb, 0x7, 0xfb, 0x43, 0xfb,
+ 0x43, 0xf7, 0x5, 0x2a, 0xf2, 0x1f, 0xf8, 0x28,
+ 0x6, 0x13, 0x77, 0x80, 0xf7, 0x3e, 0x40, 0x7,
+ 0x13, 0xaf, 0x80, 0x3c, 0x7, 0xfb, 0x7c, 0xbc,
+ 0x15, 0x5c, 0x5d, 0x89, 0x79, 0x23, 0x58, 0xd3,
+ 0xf7, 0x1, 0xf7, 0xf, 0xd2, 0xd7, 0xe8, 0x9b,
+ 0xb2, 0x8a, 0x66, 0x1e, 0xe, 0x7c, 0xe9, 0xec,
+ 0xea, 0xe3, 0xea, 0x1, 0x7d, 0xed, 0xf7, 0x3a,
+ 0xed, 0x3, 0xf7, 0xf5, 0xf7, 0x44, 0x15, 0xf7,
+ 0x8f, 0x6, 0xf7, 0xf, 0x9d, 0x61, 0xf7, 0x2f,
+ 0xfb, 0x23, 0x1b, 0x5c, 0x60, 0x78, 0x68, 0x6a,
+ 0x1f, 0xb1, 0x6a, 0x58, 0x9b, 0x57, 0x1b, 0xfb,
+ 0x18, 0x4f, 0x22, 0xfb, 0x1c, 0x49, 0x9b, 0xfb,
+ 0x36, 0xf7, 0x39, 0xd1, 0xba, 0xb8, 0xa2, 0x9d,
+ 0x1f, 0x6a, 0xaa, 0xa8, 0x68, 0xe5, 0x1b, 0xc4,
+ 0xbe, 0x9a, 0xa0, 0xc2, 0x1f, 0x73, 0xe6, 0x5,
+ 0x73, 0x4d, 0x53, 0x82, 0x74, 0x1b, 0x38, 0x7d,
+ 0xd6, 0x9f, 0x1f, 0x86, 0xec, 0x15, 0xb3, 0x8f,
+ 0xa7, 0xbb, 0xc1, 0x1b, 0xcf, 0x93, 0x48, 0x76,
+ 0x8c, 0x1f, 0xfc, 0x3f, 0x51, 0x15, 0xab, 0x8b,
+ 0xf7, 0x6, 0xe6, 0xd3, 0x8e, 0xfb, 0x2, 0x67,
+ 0x67, 0x87, 0x29, 0x3a, 0x47, 0x7e, 0xef, 0xad,
+ 0x1e, 0xe, 0xfb, 0x4d, 0x76, 0xf7, 0x7d, 0xf4,
+ 0xf7, 0xc, 0xf1, 0xf7, 0xa, 0xf7, 0x2, 0x12,
+ 0xba, 0xf7, 0x0, 0x30, 0xf1, 0xd9, 0xf7, 0x2e,
+ 0xa5, 0xf6, 0x39, 0xf3, 0x13, 0xfa, 0x80, 0xba,
+ 0xa6, 0x15, 0xf7, 0x0, 0xb9, 0x6, 0xa6, 0x80,
+ 0xa9, 0x7e, 0xab, 0x82, 0x8, 0xfb, 0x13, 0x7,
+ 0x8d, 0x95, 0x9c, 0x92, 0x9d, 0x1b, 0x9d, 0x95,
+ 0x81, 0x78, 0x7c, 0x7e, 0x7e, 0x7d, 0x8a, 0x1f,
+ 0x74, 0x89, 0x78, 0x93, 0x81, 0x94, 0x6e, 0x55,
+ 0x18, 0x79, 0xa1, 0xa9, 0x7e, 0xac, 0x1b, 0xd0,
+ 0xae, 0xc2, 0xc0, 0xa8, 0x81, 0xbb, 0x57, 0x97,
+ 0x1f, 0x8c, 0xaf, 0x5, 0xf7, 0xc, 0x90, 0xeb,
+ 0xcd, 0xf2, 0x1a, 0xf7, 0x11, 0xfb, 0xc, 0xaa,
+ 0x2f, 0x88, 0x1e, 0x13, 0xf7, 0x0, 0x28, 0x92,
+ 0x3f, 0x93, 0xb7, 0x1a, 0xbf, 0xed, 0x92, 0xa3,
+ 0xb9, 0xbf, 0x73, 0x75, 0xb1, 0x1e, 0x54, 0xf6,
+ 0xf7, 0x67, 0x20, 0x63, 0x7, 0x9b, 0x62, 0x55,
+ 0xa3, 0x59, 0x1b, 0x27, 0xfb, 0x7, 0x5d, 0xfb,
+ 0xd, 0xfb, 0x25, 0xf7, 0x35, 0x7f, 0xdb, 0x85,
+ 0x1f, 0x13, 0xfa, 0x80, 0xb3, 0x88, 0xf3, 0x98,
+ 0x4e, 0x1a, 0x62, 0x43, 0x6f, 0x4f, 0x3e, 0x52,
+ 0xb3, 0x96, 0x6f, 0x1e, 0xd2, 0xfb, 0x0, 0x7,
+ 0xe, 0xfb, 0x4d, 0x76, 0xf7, 0x59, 0xe3, 0xf1,
+ 0xe1, 0x99, 0xf7, 0x46, 0x2e, 0xe8, 0x12, 0xcd,
+ 0xef, 0x35, 0xe1, 0x35, 0xea, 0xd3, 0xf7, 0x23,
+ 0xa3, 0xee, 0x3f, 0xeb, 0x13, 0xf4, 0xa0, 0xcd,
+ 0x82, 0x15, 0xef, 0xb1, 0x6, 0xa4, 0x82, 0xa6,
+ 0x80, 0xa8, 0x84, 0x8, 0xfb, 0x0, 0x7, 0x8d,
+ 0x95, 0x9a, 0x91, 0x9b, 0x1b, 0x9d, 0x93, 0x82,
+ 0x7c, 0x7e, 0x80, 0x80, 0x7d, 0x8a, 0x1f, 0x76,
+ 0x89, 0x7a, 0x92, 0x81, 0x93, 0x71, 0x5d, 0x18,
+ 0x7c, 0x9f, 0xa7, 0x80, 0xa9, 0x1b, 0xcc, 0xab,
+ 0xb9, 0xb8, 0xa3, 0x82, 0xb4, 0x5b, 0x95, 0x1f,
+ 0x8c, 0xaa, 0x5, 0xf7, 0x2, 0x90, 0xe4, 0xc2,
+ 0xe1, 0x1a, 0xf5, 0xfb, 0x3, 0xa6, 0x36, 0x88,
+ 0x1e, 0x13, 0xe9, 0xc0, 0x2f, 0x91, 0x45, 0x92,
+ 0xaf, 0x1a, 0xb8, 0xe5, 0x90, 0xa2, 0xb6, 0xbb,
+ 0x77, 0x79, 0xae, 0x1e, 0x13, 0xf2, 0xc0, 0x5c,
+ 0xee, 0xf7, 0x46, 0x28, 0x69, 0x7, 0x99, 0x65,
+ 0x59, 0x9f, 0x5d, 0x1b, 0x2e, 0x20, 0x64, 0x24,
+ 0xfb, 0xe, 0xf7, 0x2a, 0x82, 0xd5, 0x86, 0x1f,
+ 0x13, 0xf4, 0xa0, 0xaf, 0x88, 0xec, 0x95, 0x58,
+ 0x1a, 0x69, 0x48, 0x73, 0x53, 0x44, 0x58, 0xae,
+ 0x94, 0x71, 0x1e, 0x13, 0xf4, 0xc0, 0xc7, 0x27,
+ 0x7, 0xe, 0x75, 0xe6, 0x8b, 0xf7, 0x27, 0xf7,
+ 0x97, 0xe6, 0x8b, 0xb6, 0x6d, 0xb6, 0xf7, 0x3c,
+ 0x77, 0x12, 0xba, 0xf1, 0x36, 0xe0, 0x36, 0xf2,
+ 0xf7, 0x99, 0xf1, 0x3d, 0xf0, 0x13, 0xed, 0x20,
+ 0xba, 0x75, 0x15, 0xf1, 0xae, 0x6, 0x82, 0xa1,
+ 0xbc, 0x71, 0xdc, 0x1b, 0xf7, 0x1d, 0xf7, 0x7,
+ 0xcc, 0xf7, 0x0, 0xe7, 0x3e, 0xb5, 0x3a, 0x98,
+ 0x1f, 0x13, 0xf4, 0xc0, 0x53, 0x93, 0xfb, 0x40,
+ 0x7e, 0xe7, 0x1a, 0xb5, 0xbc, 0xbb, 0xe6, 0xb6,
+ 0xb5, 0x7f, 0x7c, 0xaf, 0x1e, 0x22, 0xf1, 0xf7,
+ 0x73, 0x25, 0x73, 0x7, 0x9a, 0x67, 0x5f, 0x94,
+ 0x5e, 0x1b, 0xfb, 0x32, 0x3a, 0x26, 0x3b, 0xfb,
+ 0x2e, 0xf7, 0x48, 0x85, 0xf7, 0xa, 0x82, 0x1f,
+ 0x13, 0xed, 0x20, 0xc3, 0x87, 0xad, 0x79, 0x60,
+ 0x1a, 0x5b, 0x60, 0x69, 0xfb, 0x0, 0x54, 0x57,
+ 0x9a, 0xa4, 0x5e, 0x1e, 0xde, 0x7, 0x13, 0xee,
+ 0x40, 0x25, 0x6, 0x13, 0xf5, 0x40, 0xf7, 0x62,
+ 0xf8, 0x35, 0x15, 0xf5, 0x6, 0xf7, 0x3e, 0xf7,
+ 0x24, 0x4c, 0xaf, 0xfb, 0x35, 0x24, 0xfb, 0x31,
+ 0xf3, 0x49, 0x69, 0x5, 0xe, 0x7a, 0xe1, 0xed,
+ 0xdf, 0x8b, 0xeb, 0x3a, 0xf7, 0x41, 0x2f, 0xe7,
+ 0x7d, 0xb9, 0x12, 0xcd, 0xed, 0x37, 0xdf, 0x37,
+ 0xea, 0xf7, 0x83, 0xee, 0x40, 0xea, 0x13, 0xe6,
+ 0x20, 0xf7, 0x99, 0xf8, 0x79, 0x15, 0xf0, 0x6,
+ 0xf7, 0x38, 0xf7, 0x25, 0x4d, 0xb0, 0xfb, 0x2e,
+ 0x22, 0xfb, 0x2e, 0xf4, 0x4c, 0x67, 0x5, 0x70,
+ 0xfd, 0x1c, 0x15, 0xed, 0xb1, 0x6, 0x7b, 0xb9,
+ 0xc3, 0x75, 0xc0, 0x1b, 0xf7, 0xb, 0xea, 0xc2,
+ 0xe2, 0xf2, 0xfb, 0x3, 0xa5, 0x36, 0x88, 0x1f,
+ 0x13, 0xe4, 0xc0, 0x30, 0x92, 0x44, 0x91, 0xaf,
+ 0x1a, 0x13, 0xea, 0x40, 0xb5, 0xe6, 0x90, 0xa1,
+ 0xb6, 0xba, 0x78, 0x7a, 0xaf, 0x1e, 0x13, 0xd1,
+ 0x40, 0x5e, 0xee, 0xf7, 0x41, 0x28, 0x6a, 0x7,
+ 0x99, 0x64, 0x5a, 0x9e, 0x5d, 0x1b, 0x2e, 0x20,
+ 0x65, 0x28, 0xfb, 0xc, 0xf7, 0x2a, 0x82, 0xd5,
+ 0x85, 0x1f, 0x13, 0xe6, 0x20, 0xaf, 0x88, 0xed,
+ 0x96, 0x59, 0x1a, 0x6a, 0x47, 0x74, 0x53, 0x45,
+ 0x56, 0xab, 0x94, 0x70, 0x1e, 0xc6, 0x29, 0x7,
+ 0xe, 0x8b, 0xe3, 0xf8, 0x1b, 0xe8, 0xe3, 0xf7,
+ 0x15, 0x12, 0x99, 0xf7, 0x80, 0x2b, 0xf7, 0x4,
+ 0xd1, 0xf7, 0x4, 0x28, 0xf7, 0x80, 0x13, 0xec,
+ 0xf7, 0x13, 0x16, 0xf7, 0xe9, 0xe8, 0xfb, 0xe,
+ 0xf7, 0x14, 0x6, 0xf7, 0x34, 0xf7, 0x96, 0x5,
+ 0x13, 0xea, 0xda, 0xe8, 0xfb, 0x80, 0x2e, 0xc3,
+ 0x6, 0x22, 0xfb, 0x3d, 0x23, 0xf7, 0x3d, 0x5,
+ 0x13, 0xf4, 0xc1, 0xe8, 0xfb, 0x80, 0x2e, 0xd8,
+ 0x6, 0xf7, 0x34, 0xfb, 0x96, 0x5, 0xfb, 0x14,
+ 0xfb, 0x10, 0x7, 0xf7, 0x62, 0xf8, 0xcb, 0x15,
+ 0xf7, 0x1, 0xf7, 0x15, 0xfb, 0x1, 0x6, 0xfb,
+ 0x48, 0xfb, 0x15, 0x15, 0xf7, 0x2, 0xf7, 0x15,
+ 0xfb, 0x2, 0x6, 0xe, 0x8b, 0xe6, 0xf8, 0xc,
+ 0xe5, 0x8b, 0xc1, 0xf7, 0x47, 0x77, 0x12, 0xcd,
+ 0xed, 0xf7, 0xa8, 0xed, 0x17, 0xc8, 0x16, 0xf8,
+ 0x71, 0xf7, 0x6e, 0x29, 0xfb, 0x13, 0xfb, 0x8a,
+ 0x6, 0xf7, 0xd5, 0xf8, 0x26, 0x5, 0x13, 0x78,
+ 0xcb, 0xfc, 0x55, 0xfb, 0x5f, 0xed, 0xf7, 0x5,
+ 0xf7, 0x6d, 0x7, 0xfb, 0xd4, 0xfc, 0x22, 0x5,
+ 0xf7, 0x4f, 0xf8, 0xb2, 0x15, 0xf0, 0x6, 0xf7,
+ 0x36, 0xf7, 0x22, 0x51, 0xaf, 0xfb, 0x30, 0x25,
+ 0xfb, 0x2b, 0xf2, 0x4d, 0x69, 0x5, 0xe, 0x8b,
+ 0xe7, 0xf7, 0x2f, 0xf7, 0x43, 0x30, 0xe6, 0x8b,
+ 0xc8, 0xf7, 0x4c, 0x77, 0x12, 0xe9, 0xee, 0xf7,
+ 0x79, 0xec, 0x13, 0xde, 0xf7, 0x94, 0xf8, 0x77,
+ 0x15, 0xf0, 0x6, 0xf7, 0x36, 0xf7, 0x26, 0x4e,
+ 0xb1, 0xfb, 0x2c, 0x21, 0xfb, 0x2e, 0xf5, 0x4c,
+ 0x66, 0x5, 0x82, 0xfd, 0xa, 0x15, 0xf8, 0x4b,
+ 0xf7, 0x4e, 0x2a, 0x2d, 0xfb, 0x51, 0x6, 0xf7,
+ 0xb2, 0xf7, 0x9c, 0x5, 0xcd, 0xfc, 0x3d, 0xfb,
+ 0x43, 0xee, 0x7, 0x13, 0xbe, 0xdf, 0xf7, 0x40,
+ 0x7, 0xfb, 0xb1, 0xfb, 0x98, 0x5, 0xe, 0xfb,
+ 0x17, 0xe9, 0xf8, 0x9, 0xe8, 0xeb, 0xe6, 0x1,
+ 0xa4, 0x6c, 0x15, 0x71, 0x2f, 0x5, 0x87, 0xb1,
+ 0xab, 0x87, 0xb7, 0x1b, 0xdd, 0xde, 0xa9, 0xf2,
+ 0x9f, 0x1f, 0xd1, 0xf7, 0xe2, 0x5, 0xf6, 0x6,
+ 0x9d, 0xe8, 0x5, 0xfb, 0x1, 0x6, 0xe5, 0x93,
+ 0xad, 0x91, 0xd7, 0x1b, 0xab, 0xaa, 0x87, 0x89,
+ 0x9f, 0x1f, 0x9b, 0xe5, 0x5, 0x8d, 0x68, 0x67,
+ 0x90, 0x66, 0x1b, 0xfb, 0x10, 0x8a, 0x4b, 0x5f,
+ 0x7b, 0xfb, 0x22, 0x8, 0x25, 0x6, 0x78, 0x2e,
+ 0x5, 0xf3, 0x6, 0x4f, 0xfb, 0xae, 0x5, 0x3d,
+ 0x7d, 0x79, 0x7e, 0x51, 0x1b, 0x73, 0x5a, 0x8f,
+ 0x8d, 0x73, 0x1f, 0xe, 0x79, 0xe9, 0x8b, 0xf1,
+ 0x8b, 0xea, 0x8b, 0xd1, 0xf7, 0x26, 0xe6, 0x8b,
+ 0xaf, 0xf7, 0x42, 0x77, 0x12, 0x99, 0xed, 0xf7,
+ 0xdd, 0xea, 0x35, 0xed, 0x13, 0xff, 0x80, 0x46,
+ 0xa, 0xd0, 0xf7, 0x17, 0xf7, 0x21, 0xe6, 0xd3,
+ 0xed, 0x1f, 0x13, 0xff, 0x40, 0x41, 0xa, 0xfb,
+ 0xf, 0xfb, 0x4d, 0xfb, 0x62, 0xf7, 0x33, 0x37,
+ 0xf7, 0x36, 0x1f, 0x13, 0xff, 0x80, 0x58, 0xa,
+ 0x64, 0xf7, 0xeb, 0x15, 0xe7, 0x6, 0xf7, 0x29,
+ 0xf7, 0x1e, 0x5, 0x13, 0xff, 0x40, 0x3e, 0xa,
+ 0xfb, 0x26, 0xe4, 0xed, 0xe3, 0x3d, 0xe3, 0xf7,
+ 0x6b, 0xe4, 0x3e, 0xe3, 0x8b, 0xb2, 0xf7, 0x42,
+ 0x77, 0x69, 0xa, 0x13, 0xd7, 0x80, 0x50, 0xa,
+ 0xf3, 0xf2, 0x1f, 0xf7, 0xb9, 0x7, 0x13, 0xd7,
+ 0x40, 0xd7, 0xe4, 0xfb, 0x3c, 0x6e, 0x6, 0x13,
+ 0xcf, 0x80, 0x5a, 0xa, 0x1f, 0x13, 0xaf, 0x80,
+ 0xfb, 0x9, 0xee, 0x3c, 0xf7, 0x21, 0xc0, 0xbe,
+ 0x98, 0xa7, 0xb1, 0x1e, 0x67, 0x7, 0x51, 0x88,
+ 0x54, 0x42, 0xa, 0x69, 0x33, 0x43, 0x44, 0xb1,
+ 0xd2, 0x1e, 0xf7, 0x1d, 0xf7, 0x89, 0x43, 0xa,
+ 0xf8, 0x8c, 0x76, 0xf7, 0x42, 0x77, 0x1, 0xf7,
+ 0x35, 0xf8, 0x77, 0x15, 0xf7, 0x20, 0xf7, 0x2,
+ 0xf7, 0x20, 0xfb, 0x2, 0xc3, 0xac, 0xfb, 0x29,
+ 0xf7, 0x21, 0x5, 0x2e, 0x6, 0xfb, 0x2c, 0xfb,
+ 0x20, 0x5, 0xe, 0xf8, 0x96, 0x76, 0xf7, 0x42,
+ 0x77, 0x1, 0xf7, 0x94, 0xf8, 0x81, 0x43, 0xa,
+ 0xf8, 0x68, 0xde, 0x38, 0xf7, 0x37, 0x12, 0x13,
+ 0x40, 0xde, 0xf9, 0xb, 0x15, 0x43, 0x98, 0xcb,
+ 0x30, 0xf7, 0x21, 0x1b, 0xf7, 0x32, 0xbd, 0xf7,
+ 0x4, 0xbe, 0x93, 0x1f, 0x2e, 0x6, 0x13, 0x80,
+ 0x63, 0x7a, 0x70, 0x63, 0x3c, 0x1b, 0x13, 0x40,
+ 0x3d, 0x66, 0xb6, 0xb0, 0x83, 0x1f, 0xe, 0xf8,
+ 0x79, 0xf7, 0x20, 0x1, 0xf7, 0x7a, 0xf7, 0x20,
+ 0x3, 0xf7, 0x7a, 0xf8, 0x79, 0x15, 0xf7, 0x20,
+ 0xf7, 0x20, 0xfb, 0x20, 0x6, 0xe, 0xf8, 0x75,
+ 0xf7, 0x59, 0x1, 0xf7, 0x5a, 0xc8, 0xdd, 0xc8,
+ 0x3, 0xf7, 0x5a, 0xf8, 0xd7, 0x15, 0x56, 0xb9,
+ 0x5e, 0xc2, 0xc4, 0xb9, 0xb8, 0xc0, 0xc1, 0x5d,
+ 0xb8, 0x52, 0x54, 0x5d, 0x5e, 0x55, 0x1e, 0xc8,
+ 0x16, 0xa2, 0x9d, 0x9d, 0xa1, 0xa3, 0x9d, 0x79,
+ 0x74, 0x75, 0x79, 0x79, 0x73, 0x75, 0x79, 0x9d,
+ 0xa1, 0x1e, 0xe, 0xfb, 0x5b, 0xf7, 0x5b, 0x12,
+ 0xf7, 0x5d, 0xe4, 0x32, 0xf7, 0x51, 0x13, 0xc0,
+ 0xf7, 0xbe, 0x16, 0x7d, 0x88, 0x38, 0x68, 0x42,
+ 0x1a, 0x5d, 0xaf, 0x61, 0xc0, 0x1e, 0x13, 0xa0,
+ 0xab, 0xb9, 0x9e, 0xa0, 0xa1, 0x1f, 0xd7, 0x7,
+ 0x13, 0xc0, 0x79, 0x73, 0x39, 0x60, 0xc5, 0x1a,
+ 0xb6, 0xde, 0xad, 0xa5, 0x9a, 0x1e, 0xe, 0xe3,
+ 0xf8, 0x3b, 0x3, 0xe3, 0xf8, 0x9a, 0x15, 0xdc,
+ 0x72, 0x5, 0xa3, 0x98, 0x95, 0xae, 0xac, 0x1b,
+ 0x9e, 0xa0, 0x7e, 0x7d, 0xa2, 0x1f, 0x7d, 0xa4,
+ 0xa7, 0x7c, 0xab, 0x1b, 0xec, 0xaa, 0xdf, 0xab,
+ 0x95, 0x1f, 0x3a, 0xa3, 0x5, 0x64, 0x78, 0x83,
+ 0x76, 0x6e, 0x1b, 0x78, 0x76, 0x96, 0x97, 0x75,
+ 0x1f, 0x9b, 0x6f, 0x6e, 0x9d, 0x6e, 0x1b, 0x2d,
+ 0x6f, 0x41, 0x62, 0x7b, 0x1f, 0xe, 0xf8, 0x8f,
+ 0x76, 0xf7, 0x43, 0x77, 0x1, 0xb3, 0xf8, 0x9c,
+ 0x3, 0xf7, 0x93, 0xf8, 0x8f, 0x15, 0xc8, 0x76,
+ 0xf7, 0x88, 0xf7, 0x25, 0x28, 0xa9, 0x5, 0xfc,
+ 0x39, 0xfb, 0x2e, 0x15, 0xc8, 0x76, 0xf7, 0x8a,
+ 0xf7, 0x25, 0x28, 0xa9, 0x5, 0xe, 0xf7, 0x5f,
+ 0xef, 0x1, 0xcc, 0xf8, 0x6a, 0x3, 0xcc, 0xf7,
+ 0x5f, 0x15, 0xf8, 0x6a, 0xef, 0xfc, 0x6a, 0x6,
+ 0xe, 0xf7, 0x5f, 0xef, 0x1, 0x81, 0xf9, 0x0,
+ 0x3, 0x81, 0xf7, 0x5f, 0x15, 0xf9, 0x0, 0xef,
+ 0xfd, 0x0, 0x6, 0xe, 0xf7, 0xbe, 0x76, 0xf7,
+ 0xb5, 0x77, 0x1, 0xf7, 0xc7, 0xf7, 0xa9, 0x15,
+ 0xf7, 0xa, 0x6, 0x2b, 0xf7, 0xb5, 0x5, 0xfb,
+ 0x2e, 0x6, 0xe, 0x4c, 0xa, 0xf7, 0x42, 0xf7,
+ 0xa9, 0x15, 0xf7, 0xa, 0x6, 0xf7, 0x1a, 0x59,
+ 0xa, 0xfb, 0x30, 0x6, 0xe, 0xfb, 0xd, 0x45,
+ 0xa, 0xf7, 0x42, 0xfb, 0x22, 0x15, 0xf7, 0xd,
+ 0x6, 0xf7, 0x17, 0x59, 0xa, 0xfb, 0x2f, 0x6,
+ 0xe, 0x4c, 0xa, 0xf8, 0x33, 0xf7, 0xa9, 0x5d,
+ 0xa, 0x36, 0xfb, 0xb1, 0x5d, 0xa, 0xe, 0x4c,
+ 0xa, 0xf7, 0xad, 0xf7, 0xa9, 0x15, 0xf7, 0xb,
+ 0x6, 0xf7, 0x18, 0x59, 0xa, 0xfb, 0x2d, 0x6,
+ 0xfb, 0xcb, 0x4e, 0xa, 0xfb, 0xd, 0x45, 0xa,
+ 0xf7, 0xad, 0xfb, 0x22, 0x15, 0xf7, 0xa, 0x6,
+ 0xf7, 0x19, 0x59, 0xa, 0xfb, 0x2e, 0x6, 0xfb,
+ 0xca, 0x4e, 0xa, 0xf7, 0xdc, 0xed, 0x1, 0xf7,
+ 0x8e, 0xef, 0x3, 0xf7, 0x8e, 0x45, 0x15, 0xef,
+ 0xf8, 0x29, 0xf7, 0x24, 0xed, 0xfb, 0x24, 0xf7,
+ 0x1d, 0x27, 0xfb, 0x1d, 0xfb, 0x24, 0x29, 0xf7,
+ 0x24, 0x6, 0xe, 0x5a, 0x76, 0xf7, 0x53, 0xed,
+ 0xf6, 0xed, 0xf7, 0x30, 0x77, 0x1, 0xf7, 0x90,
+ 0xee, 0x3, 0xf5, 0xf7, 0xd, 0x15, 0xf7, 0x26,
+ 0xfb, 0x53, 0xee, 0xf7, 0x53, 0xf7, 0x23, 0xed,
+ 0xfb, 0x23, 0xf6, 0xf7, 0x23, 0xed, 0xfb, 0x23,
+ 0xf7, 0x30, 0x28, 0xfb, 0x30, 0xfb, 0x26, 0x29,
+ 0xf7, 0x26, 0x20, 0xfb, 0x26, 0x6, 0xe, 0xf7,
+ 0xc, 0xf7, 0xfe, 0x1, 0xf7, 0xc, 0xf7, 0xfc,
+ 0x3, 0xf8, 0x74, 0xf7, 0xc1, 0x15, 0xef, 0x3b,
+ 0xdc, 0x27, 0x27, 0x3b, 0x3a, 0x27, 0x27, 0xdb,
+ 0x3a, 0xef, 0xef, 0xdb, 0xdc, 0xef, 0x1e, 0xe,
+ 0x7c, 0xf7, 0x17, 0x1, 0xa5, 0xf7, 0x1c, 0xd1,
+ 0xf7, 0x1c, 0xd1, 0xf7, 0x1c, 0x14, 0x70, 0xf8,
+ 0x4a, 0xbd, 0x15, 0x6c, 0xa3, 0x69, 0xb9, 0xb6,
+ 0xa2, 0xad, 0xab, 0xad, 0x75, 0xaa, 0x5e, 0x5a,
+ 0x77, 0x66, 0x6e, 0x1e, 0xfb, 0x62, 0x16, 0x6c,
+ 0xa3, 0x69, 0xb9, 0xb7, 0xa1, 0xad, 0xab, 0xad,
+ 0x75, 0xaa, 0x5e, 0x5b, 0x76, 0x66, 0x6e, 0x1e,
+ 0xfb, 0x62, 0x16, 0x6c, 0xa4, 0x69, 0xb8, 0xb7,
+ 0xa1, 0xad, 0xab, 0xad, 0x76, 0xaa, 0x5d, 0x5b,
+ 0x76, 0x66, 0x6e, 0x1e, 0xe, 0x7c, 0xd1, 0xf7,
+ 0x1d, 0xd1, 0xd9, 0xd1, 0xf7, 0x1c, 0xd1, 0x12,
+ 0xfb, 0x5, 0xd8, 0xf3, 0xd7, 0x74, 0xd7, 0xf3,
+ 0xd8, 0xa3, 0xd7, 0xf7, 0x32, 0xd8, 0x13, 0xfb,
+ 0xc0, 0xf8, 0x26, 0xf7, 0xf, 0x15, 0x43, 0xc6,
+ 0x4a, 0xeb, 0x8a, 0x1e, 0xe1, 0xd1, 0xc6, 0xdb,
+ 0xd2, 0x4f, 0xce, 0x2d, 0x2f, 0x4a, 0x68, 0xa,
+ 0xc0, 0xbd, 0xa8, 0x6b, 0x67, 0x5c, 0x63, 0x75,
+ 0x63, 0x58, 0x70, 0xac, 0xaf, 0x1e, 0xfc, 0xe3,
+ 0xf7, 0xf5, 0x15, 0x43, 0xc6, 0x4b, 0xea, 0x8a,
+ 0x1e, 0xe2, 0xd0, 0xc6, 0xda, 0xd2, 0x50, 0xce,
+ 0x2c, 0x2f, 0x4b, 0x49, 0x42, 0x1f, 0xd8, 0x8c,
+ 0x15, 0xae, 0xa4, 0xac, 0xbf, 0xbe, 0xa8, 0x6b,
+ 0x67, 0x5d, 0x64, 0x75, 0x61, 0x5a, 0x70, 0xab,
+ 0xaf, 0x1e, 0x13, 0xfd, 0xc0, 0xf3, 0xfb, 0xf7,
+ 0x15, 0x43, 0xc5, 0x4a, 0xea, 0x8a, 0x1e, 0xe2,
+ 0xd1, 0xc6, 0xdb, 0xd2, 0x4f, 0xce, 0x2c, 0x2f,
+ 0x4c, 0x68, 0xa, 0xbe, 0xbe, 0xa8, 0x6b, 0x67,
+ 0x5c, 0x64, 0x75, 0x61, 0x5a, 0x70, 0xac, 0xaf,
+ 0x1e, 0xfb, 0x5b, 0xc0, 0x15, 0xf8, 0x55, 0xf7,
+ 0x52, 0x6c, 0xca, 0xfc, 0x56, 0xfb, 0x51, 0x5,
+ 0xe, 0x7b, 0xa, 0xf7, 0x21, 0xf7, 0x96, 0x15,
+ 0xf7, 0x9f, 0xfb, 0x50, 0xbc, 0xca, 0xfb, 0x4b,
+ 0xf7, 0x15, 0xf7, 0x4b, 0xf7, 0xd, 0x5a, 0xca,
+ 0x5, 0xe, 0x7b, 0xa, 0xf7, 0x21, 0xf7, 0xd0,
+ 0x3, 0xf7, 0x52, 0xf8, 0x52, 0x15, 0x5a, 0x4c,
+ 0xf7, 0x4b, 0xfb, 0xd, 0xfb, 0x4b, 0xfb, 0x15,
+ 0xbc, 0x4c, 0xf7, 0x9f, 0xf7, 0x50, 0x5, 0xe,
+ 0x64, 0x76, 0xf9, 0x65, 0x77, 0x1, 0xa3, 0xf8,
+ 0xbb, 0x3, 0xa3, 0x83, 0x15, 0xd1, 0x57, 0xf8,
+ 0x75, 0xf9, 0x34, 0x44, 0xbc, 0x5, 0xe, 0x84,
+ 0x76, 0xf7, 0x5f, 0xd4, 0xba, 0xd4, 0xf7, 0x2b,
+ 0xe8, 0x1, 0xf7, 0xf, 0xe9, 0x3, 0xc7, 0xaf,
+ 0x15, 0xbe, 0x4b, 0x5, 0x93, 0x97, 0xec, 0xb0,
+ 0xbb, 0x1b, 0xa1, 0xa6, 0x82, 0x83, 0xa6, 0x1f,
+ 0x84, 0xa2, 0xad, 0x85, 0x9f, 0x1b, 0xd3, 0xa8,
+ 0xbd, 0x71, 0xa, 0x7a, 0x72, 0x64, 0xa, 0x6b,
+ 0x94, 0x7c, 0x1b, 0x7a, 0x50, 0x86, 0x85, 0x7c,
+ 0x1f, 0xa6, 0x9a, 0x93, 0xb7, 0x89, 0xa0, 0x8,
+ 0xf7, 0x45, 0xd4, 0xfb, 0x50, 0x6, 0x88, 0x93,
+ 0x87, 0xa3, 0x8a, 0x9a, 0x8, 0xf7, 0x58, 0xd4,
+ 0xfb, 0x5a, 0x6, 0x89, 0xa8, 0x8a, 0xa4, 0x94,
+ 0x6c, 0xa, 0xba, 0x72, 0x5e, 0xa0, 0x1f, 0xde,
+ 0xaf, 0x5, 0xb9, 0x70, 0x57, 0xdc, 0x63, 0xa,
+ 0x83, 0x8b, 0x77, 0x8d, 0x73, 0x1e, 0x47, 0x42,
+ 0xd0, 0x6, 0x8e, 0x75, 0x8b, 0x79, 0x8d, 0x84,
+ 0x8, 0x41, 0x42, 0xe1, 0x6, 0x91, 0x59, 0x63,
+ 0x4d, 0x5a, 0x70, 0x8, 0xe, 0x8b, 0xde, 0xe5,
+ 0xd5, 0xc1, 0xd4, 0xf4, 0xde, 0x1, 0xd8, 0xee,
+ 0xf7, 0xdd, 0xed, 0x3, 0x82, 0xf7, 0x4c, 0x15,
+ 0xef, 0x6, 0xfb, 0xe, 0xae, 0xf7, 0x8, 0x4d,
+ 0xf7, 0xd, 0x1b, 0xe3, 0xe1, 0xaa, 0xbc, 0xd3,
+ 0x1f, 0x53, 0xc3, 0x5, 0x63, 0x65, 0x3a, 0x79,
+ 0x48, 0x1b, 0x46, 0x8c, 0x44, 0xb3, 0x6d, 0xcc,
+ 0x8, 0xf7, 0x40, 0x6, 0xa5, 0xd5, 0x5, 0xfb,
+ 0x6e, 0x6, 0x8a, 0x91, 0x8b, 0x94, 0x91, 0x92,
+ 0x8c, 0x93, 0x92, 0x1a, 0xf7, 0x7b, 0x6, 0xa6,
+ 0xd4, 0x5, 0xfb, 0x83, 0x6, 0xd5, 0xa3, 0xd5,
+ 0xaa, 0xd3, 0x1b, 0xbf, 0x8a, 0xbf, 0x79, 0xae,
+ 0x63, 0x8, 0x47, 0xed, 0xf7, 0x66, 0x29, 0x5c,
+ 0x7, 0xaa, 0x5e, 0x56, 0x9b, 0x54, 0x1b, 0xfb,
+ 0xa, 0xfb, 0x3, 0x43, 0xfb, 0x8, 0x6a, 0x1f,
+ 0x43, 0x6, 0x70, 0x42, 0x5, 0xe1, 0x79, 0x6,
+ 0x8c, 0x72, 0x5, 0x4f, 0x6, 0xe, 0x7c, 0xe8,
+ 0xf7, 0x1c, 0xe8, 0xf7, 0x36, 0xe8, 0x1, 0xec,
+ 0xee, 0xf7, 0x7b, 0xed, 0x3, 0x97, 0x7c, 0x15,
+ 0xf7, 0x9c, 0xe8, 0x3b, 0xf7, 0x1c, 0xde, 0x6,
+ 0xad, 0x5d, 0xb0, 0x5d, 0xa1, 0x6b, 0x5b, 0x55,
+ 0x18, 0xd1, 0x58, 0xaa, 0xa9, 0x95, 0x7c, 0x8d,
+ 0x88, 0x93, 0x7f, 0x19, 0xf7, 0x22, 0xe8, 0x32,
+ 0x6, 0x7f, 0x9f, 0xcc, 0xe4, 0x44, 0xbc, 0x5c,
+ 0x4a, 0x5d, 0xc8, 0x5, 0xf5, 0x9e, 0xab, 0xd1,
+ 0xd3, 0x1a, 0xf7, 0xb, 0x28, 0xbd, 0xfb, 0x8,
+ 0x1e, 0xfb, 0xba, 0x2e, 0xdc, 0xfc, 0x1b, 0x36,
+ 0x6, 0xf7, 0x4c, 0xf7, 0x79, 0x15, 0xf7, 0x36,
+ 0x7, 0xf7, 0x4a, 0xbc, 0x92, 0x37, 0x2e, 0x39,
+ 0x93, 0xfb, 0x29, 0x1f, 0xe, 0xf7, 0x8f, 0x76,
+ 0xf7, 0xae, 0xbc, 0x1, 0xf7, 0x4, 0xbb, 0xf7,
+ 0xb, 0xba, 0xf7, 0x58, 0xbb, 0x3, 0xf7, 0xab,
+ 0xf7, 0x7a, 0x15, 0xba, 0xf7, 0xb5, 0x6, 0xd1,
+ 0xfb, 0xb5, 0x5, 0xc7, 0x6, 0xcd, 0xf7, 0xb4,
+ 0x5, 0xfb, 0xb4, 0xbb, 0xf7, 0xe0, 0x32, 0x7,
+ 0x52, 0xfb, 0x97, 0x51, 0xf7, 0x97, 0x5, 0x34,
+ 0x6, 0xfb, 0x3b, 0xfb, 0xe0, 0x15, 0xbb, 0xf7,
+ 0xae, 0xdd, 0xbc, 0xfb, 0x69, 0x5a, 0xde, 0x6,
+ 0xe, 0x75, 0xa, 0xf7, 0x33, 0x76, 0xa, 0xf8,
+ 0x7e, 0xe1, 0xfc, 0x79, 0x5b, 0xa, 0x8e, 0xf9,
+ 0x3, 0x1, 0xf7, 0x92, 0xe1, 0x3, 0xf7, 0x92,
+ 0x8e, 0x15, 0xe1, 0xf8, 0x5b, 0x6, 0xbf, 0x45,
+ 0xcb, 0xbd, 0xfb, 0x31, 0xf7, 0x50, 0xfb, 0x2f,
+ 0xfb, 0x4d, 0xca, 0x58, 0xba, 0xca, 0x5, 0xe,
+ 0x75, 0xa, 0x6e, 0xf7, 0x96, 0x15, 0xf8, 0x7e,
+ 0x47, 0xa, 0xfc, 0x79, 0x6, 0xe, 0x91, 0x76,
+ 0x1, 0xf7, 0x92, 0xe1, 0x3, 0xf7, 0x24, 0xf7,
+ 0x3e, 0x15, 0xf7, 0x2f, 0xfb, 0x4d, 0xf7, 0x31,
+ 0xf7, 0x50, 0x4b, 0xbd, 0x57, 0x45, 0x5, 0xf8,
+ 0x5b, 0x35, 0xfc, 0x56, 0x7, 0x5c, 0xca, 0x5,
+ 0xe, 0xf7, 0x96, 0xe1, 0x1, 0x73, 0xf9, 0x1c,
+ 0x3, 0xf7, 0x38, 0x76, 0xa, 0xf7, 0xcc, 0x47,
+ 0xa, 0xfb, 0xc2, 0x5b, 0xa, 0xf7, 0x5f, 0xf7,
+ 0x2, 0x1, 0xd2, 0xf8, 0x5e, 0x3, 0x5c, 0xa,
+ 0xe, 0x8b, 0xe5, 0xf7, 0x87, 0xe5, 0xd7, 0xf7,
+ 0x13, 0x73, 0x77, 0x12, 0xf4, 0xe5, 0xf7, 0x12,
+ 0xf7, 0x42, 0x2f, 0xe7, 0x13, 0xea, 0xf8, 0x27,
+ 0xf8, 0x87, 0x15, 0xe7, 0xf7, 0x13, 0x2f, 0x6,
+ 0x2f, 0xfd, 0x6, 0x15, 0xf7, 0xab, 0xe5, 0x2c,
+ 0xf7, 0xe1, 0x6, 0x13, 0xec, 0xfb, 0x42, 0x31,
+ 0x6, 0x13, 0xda, 0xdd, 0xfb, 0x87, 0x2f, 0x6,
+ 0xfb, 0xc2, 0x31, 0x15, 0xf7, 0xae, 0xe5, 0x2b,
+ 0xf7, 0x87, 0xeb, 0xe5, 0x2b, 0xbf, 0x6, 0xb4,
+ 0xdf, 0x87, 0xa4, 0x1e, 0x8e, 0xe5, 0x5, 0x21,
+ 0x2b, 0x8c, 0xfb, 0x1d, 0x1f, 0x60, 0x2b, 0x31,
+ 0xeb, 0xfb, 0x87, 0x2b, 0x7, 0xe, 0x8b, 0xe8,
+ 0xf7, 0x90, 0xe8, 0xea, 0xe5, 0x8e, 0x77, 0x12,
+ 0xf4, 0xe5, 0xf7, 0x3d, 0xf7, 0x17, 0x31, 0xe5,
+ 0x13, 0xdc, 0xf7, 0xcc, 0x16, 0xf7, 0xaa, 0xe8,
+ 0x2c, 0xf8, 0xa9, 0xfb, 0x17, 0x6, 0x13, 0xec,
+ 0x2e, 0x7, 0x13, 0xea, 0xb4, 0xfc, 0x4c, 0x2e,
+ 0x6, 0xfb, 0xc3, 0x2e, 0x15, 0xf7, 0xac, 0xe8,
+ 0x2d, 0xf7, 0x90, 0xe9, 0xe8, 0x2d, 0xbe, 0x6,
+ 0xab, 0xb6, 0x96, 0xb1, 0x8c, 0x1e, 0xa5, 0x8c,
+ 0xa3, 0x8b, 0x91, 0x89, 0x8c, 0xe6, 0x18, 0x20,
+ 0xfb, 0xd, 0x8b, 0xfb, 0x20, 0x1f, 0x5e, 0x2b,
+ 0x2e, 0xeb, 0xfb, 0x90, 0x2b, 0x7, 0xe, 0x79,
+ 0x9d, 0xf8, 0x4b, 0x9f, 0xf2, 0x9d, 0x9f, 0x95,
+ 0x95, 0x95, 0x6, 0xfb, 0x26, 0x8f, 0x7, 0x1e,
+ 0xa0, 0x39, 0x63, 0xff, 0xc, 0x9, 0xe8, 0xa,
+ 0xe8, 0xb, 0x8c, 0xc, 0xe, 0xf8, 0xec, 0x14,
+ 0xae, 0x13, 0x0, 0x5d, 0x2, 0x0, 0x1, 0x0,
+ 0x35, 0x0, 0x43, 0x0, 0x47, 0x0, 0x7a, 0x0,
+ 0xba, 0x0, 0xc4, 0x0, 0xe9, 0x1, 0x17, 0x1,
+ 0x34, 0x1, 0x4c, 0x1, 0x65, 0x1, 0x7d, 0x1,
+ 0x94, 0x1, 0xa8, 0x1, 0xbb, 0x1, 0xca, 0x1,
+ 0xdc, 0x1, 0xe2, 0x1, 0xe9, 0x1, 0xfc, 0x2,
+ 0x6, 0x2, 0x10, 0x2, 0x24, 0x2, 0x36, 0x2,
+ 0x43, 0x2, 0x4c, 0x2, 0x6c, 0x2, 0x71, 0x2,
+ 0x78, 0x2, 0x7f, 0x2, 0x8d, 0x2, 0x95, 0x2,
+ 0xa0, 0x2, 0xb8, 0x2, 0xcf, 0x2, 0xd8, 0x2,
+ 0xe1, 0x2, 0xe7, 0x2, 0xfa, 0x3, 0xd, 0x3,
+ 0x1c, 0x3, 0x2e, 0x3, 0x36, 0x3, 0x3e, 0x3,
+ 0x43, 0x3, 0x49, 0x3, 0x57, 0x3, 0x61, 0x3,
+ 0x71, 0x3, 0x75, 0x3, 0x7e, 0x3, 0x87, 0x3,
+ 0x90, 0x3, 0x97, 0x3, 0xa5, 0x3, 0xb1, 0x3,
+ 0xbf, 0x3, 0xc3, 0x3, 0xd0, 0x3, 0xdb, 0x3,
+ 0xe7, 0x3, 0xf2, 0x3, 0xfe, 0x4, 0x4, 0x4,
+ 0x8, 0x4, 0xe, 0x4, 0x14, 0x4, 0x1f, 0x4,
+ 0x2a, 0x4, 0x31, 0x4, 0x36, 0x4, 0x3b, 0x4,
+ 0x45, 0x4, 0x4f, 0x4, 0x53, 0x4, 0x57, 0x4,
+ 0x60, 0x4, 0x69, 0x4, 0x72, 0x4, 0x7b, 0x4,
+ 0x84, 0x4, 0x8d, 0x4, 0x96, 0x4, 0x9f, 0x4,
+ 0xa8, 0x4, 0xb1, 0x4, 0xba, 0x4, 0xc1, 0x4,
+ 0xc8, 0x4, 0xce, 0x4, 0xd4, 0x4, 0xd9, 0x4,
+ 0xde, 0xf7, 0x97, 0xe5, 0x27, 0x6, 0xa9, 0xcc,
+ 0x5, 0xf7, 0x86, 0x6, 0xa9, 0x4a, 0x5, 0x2a,
+ 0x31, 0xf7, 0x92, 0xe5, 0x51, 0x6, 0xfb, 0x62,
+ 0xf8, 0x62, 0x5, 0xfb, 0x8f, 0x31, 0xf7, 0x15,
+ 0x6, 0xfb, 0x3f, 0xfc, 0x8, 0x5, 0x4e, 0x6,
+ 0xf7, 0x7a, 0xf7, 0x2f, 0x15, 0xdc, 0xf7, 0x47,
+ 0xdc, 0xfb, 0x47, 0x5, 0xb, 0x2a, 0xa, 0x13,
+ 0x7d, 0x4d, 0xa, 0x13, 0x7e, 0x2b, 0xa, 0x13,
+ 0xbe, 0x29, 0xa, 0x15, 0x20, 0xa, 0xe, 0x15,
+ 0xfb, 0x39, 0xf7, 0x2a, 0x51, 0xf7, 0xa, 0xf7,
+ 0xf, 0xf7, 0x29, 0xcb, 0xf7, 0x33, 0xf7, 0x24,
+ 0xfb, 0x6, 0xe0, 0xfb, 0x32, 0xfb, 0x21, 0xfb,
+ 0x13, 0x3d, 0xfb, 0x2b, 0x1e, 0xef, 0x16, 0xdf,
+ 0xd4, 0xc0, 0xea, 0xf7, 0x7, 0xc5, 0x52, 0x3b,
+ 0x34, 0x28, 0x5b, 0x41, 0x47, 0x27, 0xb7, 0xe6,
+ 0x1e, 0xe, 0x15, 0xf8, 0x23, 0x6, 0xf7, 0x1c,
+ 0xa5, 0x32, 0xf7, 0x14, 0xfb, 0x43, 0x1b, 0xfb,
+ 0xc, 0xfb, 0x1f, 0x3f, 0xfb, 0x2b, 0xfb, 0x8,
+ 0xe3, 0x21, 0xf7, 0x41, 0xe5, 0xeb, 0xa9, 0xb4,
+ 0xd7, 0x1f, 0x5f, 0xda, 0x5, 0x6d, 0x4b, 0x3b,
+ 0x6d, 0x41, 0x1b, 0xfb, 0x10, 0x69, 0xc7, 0xae,
+ 0x86, 0x1f, 0x92, 0xe6, 0x15, 0xc3, 0xa0, 0xce,
+ 0xa4, 0xc8, 0x1b, 0xc7, 0xca, 0x7a, 0x4b, 0x9e,
+ 0x1f, 0xe, 0x2f, 0xa, 0xf7, 0x2e, 0x2e, 0xf7,
+ 0x1c, 0x26, 0xa, 0xb, 0xfb, 0x4c, 0xfb, 0x42,
+ 0x22, 0xfb, 0x21, 0xfb, 0x2b, 0x1e, 0xed, 0x8e,
+ 0x15, 0xe6, 0xc8, 0xf6, 0xf7, 0xc, 0xf7, 0x1c,
+ 0xb9, 0xfb, 0x13, 0x47, 0x3a, 0x5a, 0xfb, 0x10,
+ 0xfb, 0x19, 0xfb, 0xd, 0x4f, 0xf3, 0xed, 0x1e,
+ 0xb, 0xdb, 0xfb, 0xa2, 0x6, 0xfb, 0x11, 0xd3,
+ 0x38, 0xf7, 0x25, 0xf7, 0x11, 0xe8, 0xdc, 0xf7,
+ 0x12, 0x1e, 0xf7, 0xa3, 0xd8, 0xe6, 0xfb, 0x96,
+ 0x30, 0xe1, 0xfb, 0x8d, 0x7, 0x35, 0x74, 0x57,
+ 0x25, 0xfb, 0x4, 0x83, 0xe2, 0xc0, 0x1e, 0xf7,
+ 0x8b, 0xdf, 0xe6, 0xfb, 0x97, 0x7, 0xe, 0x15,
+ 0x13, 0xb5, 0x0, 0x2e, 0xa, 0x13, 0x78, 0x80,
+ 0x64, 0xf7, 0x43, 0xe6, 0x7, 0x13, 0x7a, 0x0,
+ 0x3a, 0xf7, 0xe1, 0xfb, 0x41, 0x30, 0x6, 0x13,
+ 0xb9, 0x0, 0x2c, 0xa, 0x61, 0x5b, 0x4f, 0x69,
+ 0x47, 0x1b, 0x60, 0x62, 0x9c, 0xab, 0xb7, 0xbf,
+ 0x9d, 0xc6, 0x8c, 0x1f, 0xc7, 0x8c, 0xcd, 0x85,
+ 0xa2, 0x89, 0x8, 0xe, 0x1f, 0x8f, 0x67, 0x63,
+ 0x8e, 0x66, 0x1b, 0xfb, 0x7f, 0x82, 0xfb, 0x19,
+ 0x78, 0x4b, 0xcb, 0x3e, 0xf7, 0xa, 0xda, 0xb0,
+ 0xa1, 0xae, 0xc6, 0x1f, 0xb, 0x38, 0xf7, 0x37,
+ 0x6, 0xf7, 0xe, 0x5d, 0xc8, 0xfb, 0x10, 0xfb,
+ 0x0, 0xfb, 0xe, 0x66, 0x7f, 0x7a, 0x1e, 0xf7,
+ 0xd6, 0xfb, 0x7c, 0x15, 0xb, 0xda, 0xfb, 0x4f,
+ 0x6, 0x75, 0x63, 0x52, 0x71, 0x59, 0x8a, 0x8,
+ 0x5a, 0x8a, 0x60, 0xa0, 0xbf, 0x1a, 0xf7, 0xa5,
+ 0xfb, 0x42, 0x7, 0xe, 0xfb, 0x93, 0x38, 0xa,
+ 0xf7, 0x93, 0xfb, 0x6, 0xed, 0xf7, 0x60, 0xfc,
+ 0xa2, 0x31, 0xd7, 0xfc, 0x8, 0x3c, 0x6, 0xb,
+ 0xdc, 0xfb, 0x48, 0x6, 0xfb, 0x2, 0xc7, 0x54,
+ 0xf7, 0xa, 0x8a, 0x1e, 0xbf, 0xbe, 0xa1, 0xa9,
+ 0xac, 0x1f, 0xb, 0x15, 0xfb, 0x56, 0xf7, 0x25,
+ 0x2d, 0xf7, 0x1a, 0xf3, 0xf7, 0x41, 0xd2, 0xf7,
+ 0x6f, 0xb, 0xfb, 0x3f, 0xf8, 0x8, 0xf7, 0x36,
+ 0xe5, 0xfc, 0x3f, 0x31, 0xf7, 0x39, 0xfc, 0x8,
+ 0xfb, 0x43, 0x6, 0xb, 0xf8, 0x52, 0xe5, 0x30,
+ 0xa, 0xb, 0x8b, 0xe6, 0xf8, 0x10, 0xe6, 0x1,
+ 0xb, 0x15, 0xf8, 0x52, 0xe6, 0xfb, 0x43, 0xf7,
+ 0xe0, 0xfb, 0x7e, 0x30, 0xf7, 0x1d, 0xfb, 0x85,
+ 0xfb, 0x42, 0x6, 0xe, 0x12, 0xab, 0xec, 0xf7,
+ 0x98, 0xea, 0x2c, 0xf7, 0x46, 0xb, 0xf8, 0xa5,
+ 0xf7, 0x5e, 0x29, 0xfb, 0x4, 0x2d, 0xa, 0xb,
+ 0x77, 0x12, 0x9a, 0xf7, 0x42, 0x2e, 0xe8, 0xf7,
+ 0x22, 0xf7, 0x41, 0x2d, 0xe9, 0x2d, 0xf7, 0x43,
+ 0x13, 0xba, 0x0, 0xb, 0x5a, 0xbb, 0x64, 0xc7,
+ 0xc7, 0xbb, 0xb2, 0xbc, 0xbc, 0x5b, 0xb2, 0x4f,
+ 0x4f, 0x5b, 0x64, 0x5a, 0x1e, 0xb, 0xf7, 0x27,
+ 0xf1, 0x4b, 0xee, 0xf7, 0x6c, 0x28, 0x4b, 0x25,
+ 0xf7, 0x1d, 0xb, 0x7c, 0xe6, 0x3c, 0xe5, 0xf0,
+ 0xe5, 0xcf, 0xe2, 0xb, 0x7, 0xf7, 0x9e, 0xf8,
+ 0x26, 0x5, 0xd7, 0xe2, 0xfb, 0x76, 0x34, 0xb8,
+ 0x6, 0xfb, 0x14, 0xfb, 0x54, 0xfb, 0x6, 0xf7,
+ 0x54, 0x5, 0xbc, 0xe2, 0xfb, 0x7b, 0x34, 0xd7,
+ 0x6, 0xf7, 0x3a, 0xb, 0x34, 0xa, 0x13, 0xbe,
+ 0xb, 0x4a, 0xa, 0xf7, 0x83, 0x36, 0xa, 0xb,
+ 0xbf, 0xa9, 0x70, 0x5b, 0x2a, 0xa, 0xb, 0x53,
+ 0xaf, 0xfb, 0x20, 0xfb, 0x1, 0xfb, 0x20, 0xf7,
+ 0x1, 0x51, 0x68, 0x5, 0xe, 0x15, 0x9b, 0xa9,
+ 0xf4, 0xa4, 0xd7, 0x1b, 0xb, 0xe9, 0x1, 0xf7,
+ 0x8e, 0xee, 0x60, 0xa, 0xe9, 0xfb, 0x42, 0xb,
+ 0xc9, 0xaf, 0x75, 0x6d, 0xbe, 0x1f, 0x2d, 0xed,
+ 0xf7, 0x81, 0x29, 0x5c, 0x7, 0xa5, 0x62, 0x66,
+ 0xa0, 0x41, 0x1b, 0xfb, 0x32, 0xfb, 0x12, 0xb,
+ 0xfb, 0xa, 0x42, 0x39, 0xa3, 0x95, 0x64, 0x1e,
+ 0xa7, 0xf7, 0xa3, 0x15, 0xd2, 0xcd, 0xba, 0xd9,
+ 0xdf, 0xc6, 0x5f, 0x3f, 0x42, 0x53, 0xb, 0x15,
+ 0xe7, 0x6, 0xf7, 0x29, 0xf7, 0x1e, 0x3e, 0xa,
+ 0x1, 0x82, 0xf7, 0x97, 0xf4, 0xf7, 0x92, 0x3,
+ 0xb, 0x76, 0xf7, 0xb1, 0x77, 0x1, 0xb, 0xf7,
+ 0xc4, 0xf7, 0x46, 0x15, 0xf7, 0x1d, 0x32, 0x6,
+ 0x81, 0x62, 0x64, 0x88, 0x67, 0x1b, 0xfb, 0x14,
+ 0x36, 0xb, 0x6, 0x45, 0x57, 0xbd, 0x4c, 0xf7,
+ 0x50, 0xf7, 0x30, 0xfb, 0x4d, 0xf7, 0x30, 0x58,
+ 0x4c, 0xca, 0x5b, 0x5, 0xb, 0x8b, 0xe5, 0xf7,
+ 0x27, 0xe3, 0xf7, 0x1d, 0x5f, 0xa, 0xf7, 0x9,
+ 0xec, 0xf1, 0xee, 0xb, 0x66, 0xac, 0x6c, 0xb4,
+ 0xb4, 0xac, 0xaa, 0xb0, 0xb2, 0x6a, 0xa9, 0x62,
+ 0x62, 0x6a, 0x6d, 0x64, 0x1e, 0xb, 0x7c, 0xe7,
+ 0x3c, 0xe6, 0xf7, 0x86, 0xe6, 0xb, 0x1, 0xa9,
+ 0xef, 0xf7, 0xe9, 0xee, 0x3, 0xb, 0xf7, 0xbe,
+ 0x45, 0xa, 0xb, 0x5e, 0xf7, 0x46, 0xe5, 0x7,
+ 0xb, 0xfb, 0xb1, 0x15, 0xf7, 0x9, 0x6, 0xf7,
+ 0x1a, 0x59, 0xa, 0xfb, 0x2e, 0x6, 0xe, 0x79,
+ 0xe6, 0xf8, 0x17, 0xe6, 0xf7, 0x7d, 0x52, 0xa,
+ 0xb, 0xe7, 0x74, 0x15, 0x75, 0x32, 0x5, 0x79,
+ 0xdf, 0xc8, 0x7b, 0xd5, 0x1b, 0xf7, 0x50, 0xa1,
+ 0xb, 0x3f, 0xa, 0xbf, 0xb, 0x77, 0x1, 0xdf,
+ 0xea, 0xf7, 0x89, 0xea, 0x3, 0xb, 0x15, 0xf7,
+ 0x5, 0xf7, 0x10, 0xfb, 0x5, 0x6, 0xb, 0x77,
+ 0x1, 0xa1, 0xed, 0xf7, 0xff, 0xea, 0x3, 0xb,
+ 0x7c, 0xe5, 0xea, 0xe6, 0xdc, 0xe7, 0xb, 0x6,
+ 0xfb, 0x4e, 0xfb, 0xe, 0x15, 0xf7, 0x6, 0xf7,
+ 0xe, 0xfb, 0x6, 0x6, 0xb, 0x8b, 0xe6, 0xf7,
+ 0x85, 0xe6, 0xf7, 0x82, 0x67, 0xa, 0xec, 0x3,
+ 0xb, 0xd2, 0xd2, 0x9c, 0xaa, 0xc6, 0x1f, 0xf7,
+ 0x28, 0xbd, 0xea, 0xfb, 0xae, 0x7, 0xb, 0xf7,
+ 0xb1, 0x5, 0xb, 0xa7, 0x66, 0x5a, 0x97, 0x56,
+ 0x1b, 0xfb, 0x23, 0x27, 0x30, 0xfb, 0x8, 0xb,
+ 0x6, 0xca, 0xbb, 0x58, 0xca, 0xfb, 0x4d, 0xfb,
+ 0x30, 0x5, 0xe, 0xd2, 0xf7, 0x5f, 0x15, 0xf8,
+ 0x5e, 0xf7, 0x2, 0xfc, 0x5e, 0x6, 0xb, 0x15,
+ 0xf7, 0x9, 0x6, 0x2b, 0x59, 0xa, 0xfb, 0x2c,
+ 0x6, 0xb, 0xaf, 0x76, 0xf8, 0x7a, 0x77, 0x1,
+ 0xd2, 0xf8, 0x5d, 0x3, 0xd2, 0xb, 0xe5, 0xf7,
+ 0x7c, 0x77, 0x1, 0xb, 0x3, 0x66, 0xa, 0xb,
+ 0x79, 0xe4, 0xf8, 0x24, 0xe6, 0xb, 0x7c, 0xe7,
+ 0xf7, 0x9f, 0xe7, 0xb, 0xfb, 0x12, 0x1b, 0xfb,
+ 0x1b, 0x45, 0x2b, 0x2c, 0x8c, 0x1f, 0xb, 0x67,
+ 0x1b, 0x81, 0x7c, 0x8f, 0x91, 0x7b, 0x1f, 0x92,
+ 0x76, 0xb, 0xc3, 0x56, 0xf8, 0xd0, 0xf9, 0xf,
+ 0xb, 0xd8, 0x16, 0xf8, 0x52, 0xb, 0x77, 0x1,
+ 0xf7, 0x8f, 0xb, 0x49, 0x42, 0x1f, 0xd7, 0x8c,
+ 0x15, 0xae, 0xa5, 0xac, 0xb, 0x12, 0xa4, 0xea,
+ 0xf7, 0xb3, 0xe7, 0x2f, 0xf7, 0x3c, 0xb, 0xfb,
+ 0xc, 0x5, 0xb, 0xfb, 0x3, 0x6, 0xb, 0x1a,
+ 0xbc, 0x8a, 0xb2, 0xb1, 0xd5, 0x1b, 0xbf, 0xb,
+ 0x1, 0xf7, 0x54, 0xf7, 0x6c, 0x3, 0xf7, 0x54,
+ 0xb, 0x77, 0x1, 0xf7, 0x93, 0xe5, 0x3, 0xf7,
+ 0x93, 0xb, 0x15, 0xf7, 0x2, 0xf7, 0x11, 0xfb,
+ 0x2, 0x6, 0xb, 0x15, 0xf7, 0x6, 0xf7, 0x12,
+ 0xfb, 0x6, 0x6, 0xb, 0xa4, 0xa0, 0x1f, 0x53,
+ 0xca, 0x5, 0x77, 0x71, 0xb, 0x15, 0xf7, 0x4,
+ 0xf7, 0x12, 0xfb, 0x4, 0x6, 0xb, 0x15, 0xf7,
+ 0xa, 0xf7, 0x24, 0xfb, 0xa, 0x6, 0xb, 0xf7,
+ 0x3c, 0xe6, 0xfc, 0x4c, 0x30, 0xf7, 0x3f, 0xb,
+ 0xf7, 0x96, 0xe1, 0x1, 0x6e, 0xf9, 0x26, 0x3,
+ 0xb, 0xf7, 0x23, 0x15, 0xbd, 0xca, 0x45, 0xbf,
+ 0x5, 0xb, 0xc5, 0xfb, 0xc3, 0xf7, 0xd, 0x5,
+ 0xe, 0xa1, 0xd8, 0x1e, 0xf6, 0x29, 0x7, 0xe,
+ 0x15, 0xf7, 0x3, 0xf7, 0x23, 0xb, 0x30, 0xde,
+ 0xfc, 0x10, 0x38, 0xb, 0xd1, 0xf8, 0xc, 0x1,
+ 0xb, 0x8b, 0xe9, 0xf7, 0x8f, 0xb
+ };
diff --git a/core/src/fxge/fontdata/chromefontdata/FoxitFixedBoldItalic.c b/core/src/fxge/fontdata/chromefontdata/FoxitFixedBoldItalic.c
new file mode 100644
index 0000000000..45847f671c
--- /dev/null
+++ b/core/src/fxge/fontdata/chromefontdata/FoxitFixedBoldItalic.c
@@ -0,0 +1,2402 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+const unsigned char g_FoxitFixedBoldItalicFontData [19151] = {0x1,
+ 0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0x19,
+ 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x46, 0x69, 0x78,
+ 0x65, 0x64, 0x4f, 0x54, 0x46, 0x2d, 0x42, 0x6f,
+ 0x6c, 0x64, 0x49, 0x74, 0x61, 0x6c, 0x69, 0x63,
+ 0x0, 0x1, 0x1, 0x1, 0x24, 0xf8, 0x10, 0x0,
+ 0xf8, 0x2a, 0x1, 0xf8, 0x2b, 0x2, 0xf8, 0x2c,
+ 0x3, 0xf8, 0x14, 0x4, 0xfb, 0xa, 0xfb, 0x8d,
+ 0xf9, 0x49, 0xf9, 0xbf, 0x5, 0xf7, 0xad, 0xf,
+ 0xf9, 0x94, 0x11, 0xac, 0x1c, 0x44, 0x2e, 0x12,
+ 0x0, 0x12, 0x1, 0x1, 0x5, 0xb, 0xd, 0x11,
+ 0x19, 0x22, 0x2b, 0x34, 0x3e, 0x45, 0x4b, 0x4d,
+ 0x51, 0x5d, 0x65, 0x8f, 0xaa, 0xb9, 0x45, 0x75,
+ 0x72, 0x6f, 0x47, 0x63, 0x61, 0x72, 0x6f, 0x6e,
+ 0x49, 0x4a, 0x49, 0x64, 0x6f, 0x74, 0x53, 0x63,
+ 0x65, 0x64, 0x69, 0x6c, 0x6c, 0x61, 0x61, 0x72,
+ 0x72, 0x6f, 0x77, 0x62, 0x6f, 0x74, 0x68, 0x61,
+ 0x72, 0x72, 0x6f, 0x77, 0x64, 0x6f, 0x77, 0x6e,
+ 0x61, 0x72, 0x72, 0x6f, 0x77, 0x6c, 0x65, 0x66,
+ 0x74, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x72, 0x69,
+ 0x67, 0x68, 0x74, 0x61, 0x72, 0x72, 0x6f, 0x77,
+ 0x75, 0x70, 0x67, 0x63, 0x61, 0x72, 0x6f, 0x6e,
+ 0x69, 0x6a, 0x6c, 0x69, 0x72, 0x61, 0x70, 0x72,
+ 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69,
+ 0x6f, 0x6e, 0x73, 0x63, 0x65, 0x64, 0x69, 0x6c,
+ 0x6c, 0x61, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x43, 0x68, 0x72, 0x6f,
+ 0x6d, 0x20, 0x46, 0x69, 0x78, 0x65, 0x64, 0x20,
+ 0x4f, 0x54, 0x46, 0x20, 0x42, 0x6f, 0x6c, 0x64,
+ 0x20, 0x49, 0x74, 0x61, 0x6c, 0x69, 0x63, 0x43,
+ 0x68, 0x72, 0x6F, 0x68, 0x20, 0x46, 0x69, 0x78,
+ 0x65, 0x64, 0x20, 0x4f, 0x54, 0x46, 0x0, 0x0,
+ 0x0, 0x0, 0x22, 0x0, 0x8a, 0x0, 0xab, 0x0,
+ 0xac, 0x0, 0xad, 0x0, 0xae, 0x0, 0xaf, 0x0,
+ 0xb0, 0x0, 0x23, 0x0, 0x24, 0x0, 0xb1, 0x0,
+ 0x25, 0x0, 0x26, 0x0, 0xb2, 0x0, 0xb3, 0x0,
+ 0xb4, 0x0, 0xb5, 0x0, 0x9a, 0x1, 0x87, 0x0,
+ 0x27, 0x0, 0x28, 0x1, 0x88, 0x0, 0x29, 0x0,
+ 0x2a, 0x1, 0x89, 0x0, 0xb6, 0x0, 0xb7, 0x0,
+ 0xb8, 0x1, 0x8a, 0x0, 0xb9, 0x0, 0x2b, 0x0,
+ 0x2c, 0x0, 0x2d, 0x0, 0x8c, 0x0, 0x2e, 0x0,
+ 0x2f, 0x0, 0xba, 0x0, 0x30, 0x0, 0x8e, 0x0,
+ 0xbb, 0x0, 0xbc, 0x0, 0xbd, 0x0, 0xbe, 0x0,
+ 0x8d, 0x0, 0xbf, 0x0, 0x31, 0x0, 0x32, 0x0,
+ 0x33, 0x0, 0x34, 0x0, 0xc0, 0x1, 0x8b, 0x0,
+ 0x35, 0x0, 0x9d, 0x0, 0x36, 0x0, 0xc1, 0x0,
+ 0xc2, 0x0, 0xc3, 0x0, 0xc4, 0x0, 0x37, 0x0,
+ 0x38, 0x0, 0x39, 0x0, 0x3a, 0x0, 0xc5, 0x0,
+ 0xc6, 0x0, 0x3b, 0x0, 0xc7, 0x0, 0x42, 0x0,
+ 0xc8, 0x0, 0xc9, 0x0, 0x7d, 0x0, 0xca, 0x0,
+ 0x90, 0x0, 0xcb, 0x0, 0x7, 0x0, 0xcc, 0x1,
+ 0x8c, 0x1, 0x8d, 0x1, 0x8e, 0x1, 0x8f, 0x1,
+ 0x90, 0x0, 0x3f, 0x0, 0x5f, 0x0, 0xb, 0x0,
+ 0x21, 0x0, 0xcd, 0x0, 0x43, 0x0, 0x3d, 0x0,
+ 0x5d, 0x0, 0x5c, 0x0, 0x5e, 0x0, 0x3c, 0x0,
+ 0x3e, 0x0, 0x81, 0x0, 0xa0, 0x0, 0x74, 0x0,
+ 0x44, 0x0, 0x88, 0x0, 0xce, 0x0, 0x85, 0x0,
+ 0x61, 0x0, 0x7e, 0x0, 0x1b, 0x0, 0xd, 0x0,
+ 0xaa, 0x0, 0x67, 0x0, 0x45, 0x0, 0x70, 0x0,
+ 0x71, 0x0, 0xa1, 0x0, 0x83, 0x0, 0x9f, 0x0,
+ 0x5, 0x0, 0x82, 0x0, 0x91, 0x0, 0x46, 0x0,
+ 0xcf, 0x0, 0xd0, 0x0, 0xd1, 0x0, 0xd2, 0x0,
+ 0x19, 0x0, 0x79, 0x0, 0x89, 0x0, 0x6f, 0x0,
+ 0x1e, 0x0, 0xa7, 0x0, 0x2, 0x0, 0x60, 0x0,
+ 0x47, 0x0, 0x6d, 0x0, 0x16, 0x0, 0x6e, 0x0,
+ 0x65, 0x0, 0x15, 0x0, 0x63, 0x0, 0x48, 0x1,
+ 0x91, 0x0, 0x95, 0x0, 0x7c, 0x0, 0x1f, 0x0,
+ 0x6a, 0x0, 0x78, 0x0, 0x6b, 0x0, 0x6c, 0x0,
+ 0x49, 0x0, 0x86, 0x0, 0xe, 0x0, 0x4a, 0x0,
+ 0xd3, 0x0, 0xd4, 0x0, 0xd5, 0x0, 0xd6, 0x1,
+ 0x92, 0x0, 0x4b, 0x0, 0x4c, 0x0, 0x4d, 0x0,
+ 0x1d, 0x1, 0x93, 0x0, 0x97, 0x0, 0x92, 0x0,
+ 0x4e, 0x0, 0x80, 0x0, 0xa6, 0x0, 0x98, 0x0,
+ 0xa8, 0x0, 0x4f, 0x0, 0x1a, 0x0, 0xd7, 0x0,
+ 0x4, 0x0, 0x50, 0x0, 0xd8, 0x0, 0xd9, 0x0,
+ 0xda, 0x0, 0x94, 0x0, 0x87, 0x0, 0xdb, 0x0,
+ 0x12, 0x0, 0x9b, 0x0, 0x9e, 0x0, 0x96, 0x0,
+ 0x8b, 0x0, 0x8f, 0x0, 0x93, 0x0, 0xdc, 0x0,
+ 0x51, 0x0, 0x73, 0x0, 0x9, 0x0, 0xa, 0x0,
+ 0x6, 0x0, 0xf, 0x0, 0x72, 0x0, 0x7a, 0x0,
+ 0xc, 0x0, 0x9c, 0x1, 0x94, 0x0, 0x52, 0x0,
+ 0x20, 0x0, 0x7b, 0x0, 0x3, 0x0, 0x76, 0x0,
+ 0x69, 0x0, 0x77, 0x0, 0x41, 0x0, 0x8, 0x0,
+ 0x75, 0x0, 0x68, 0x0, 0x53, 0x0, 0xa5, 0x0,
+ 0x84, 0x0, 0x54, 0x0, 0xdd, 0x1, 0x95, 0x0,
+ 0x66, 0x0, 0x1c, 0x0, 0x18, 0x0, 0x17, 0x0,
+ 0x10, 0x0, 0x1, 0x0, 0x62, 0x0, 0x55, 0x0,
+ 0xa2, 0x0, 0x14, 0x0, 0xa3, 0x0, 0xa9, 0x0,
+ 0x7f, 0x0, 0x99, 0x0, 0x13, 0x0, 0xa4, 0x0,
+ 0x56, 0x0, 0xde, 0x0, 0xdf, 0x0, 0xe0, 0x0,
+ 0xe1, 0x0, 0x40, 0x0, 0x57, 0x0, 0x58, 0x0,
+ 0x59, 0x0, 0x5a, 0x0, 0xe2, 0x0, 0xe3, 0x0,
+ 0x64, 0x0, 0x5b, 0x0, 0xe4, 0x0, 0x11, 0x0,
+ 0xf4, 0x2, 0x0, 0x1, 0x0, 0x2, 0x0, 0x44,
+ 0x0, 0xc1, 0x0, 0xdc, 0x1, 0x2, 0x1, 0x26,
+ 0x1, 0x40, 0x1, 0x76, 0x1, 0xbf, 0x2, 0x29,
+ 0x2, 0x78, 0x2, 0xfe, 0x3, 0x37, 0x3, 0x84,
+ 0x3, 0xa1, 0x3, 0xc9, 0x3, 0xed, 0x4, 0x13,
+ 0x4, 0x6e, 0x4, 0xf0, 0x5, 0x3a, 0x5, 0x9a,
+ 0x6, 0x8, 0x6, 0x5e, 0x6, 0x83, 0x6, 0xdb,
+ 0x6, 0xf4, 0x7, 0x1d, 0x7, 0x38, 0x7, 0x6e,
+ 0x7, 0x84, 0x7, 0xc1, 0x8, 0x19, 0x8, 0x45,
+ 0x8, 0x85, 0x8, 0xc9, 0x8, 0xf8, 0x9, 0x6e,
+ 0x9, 0xb6, 0xa, 0x36, 0xa, 0x52, 0xa, 0x75,
+ 0xa, 0x9a, 0xa, 0xbb, 0xb, 0x3c, 0xb, 0x86,
+ 0xb, 0xd0, 0xc, 0x48, 0xc, 0xa7, 0xd, 0x1b,
+ 0xd, 0x8b, 0xe, 0x2b, 0xe, 0x5c, 0xe, 0xba,
+ 0xf, 0x17, 0xf, 0x33, 0xf, 0x59, 0xf, 0x81,
+ 0xf, 0x9a, 0xf, 0xcb, 0x10, 0xd, 0x10, 0x56,
+ 0x10, 0x8f, 0x10, 0xe0, 0x11, 0x4b, 0x11, 0x7d,
+ 0x11, 0xce, 0x12, 0x48, 0x12, 0x67, 0x12, 0x9b,
+ 0x12, 0xaf, 0x12, 0xdd, 0x13, 0x88, 0x13, 0xa6,
+ 0x14, 0x29, 0x14, 0x62, 0x14, 0x83, 0x14, 0xa5,
+ 0x14, 0xc3, 0x14, 0xdc, 0x15, 0x0, 0x15, 0x32,
+ 0x15, 0x7e, 0x15, 0xad, 0x16, 0x4c, 0x16, 0xaa,
+ 0x17, 0x8, 0x17, 0x21, 0x17, 0x3b, 0x17, 0xb4,
+ 0x18, 0x2c, 0x18, 0x4c, 0x18, 0x70, 0x18, 0x94,
+ 0x18, 0xbd, 0x18, 0xde, 0x19, 0x29, 0x19, 0x44,
+ 0x19, 0xc2, 0x19, 0xfe, 0x1a, 0x5d, 0x1a, 0x7a,
+ 0x1a, 0xb5, 0x1a, 0xd3, 0x1b, 0x5a, 0x1b, 0xd7,
+ 0x1c, 0x39, 0x1c, 0x6a, 0x1c, 0xaf, 0x1c, 0xeb,
+ 0x1d, 0x15, 0x1d, 0x3f, 0x1d, 0xd5, 0x1d, 0xee,
+ 0x1e, 0xd, 0x1e, 0x5d, 0x1e, 0x73, 0x1e, 0x9e,
+ 0x1e, 0xc0, 0x1e, 0xe9, 0x1f, 0x63, 0x1f, 0x88,
+ 0x1f, 0x9e, 0x1f, 0xb4, 0x1f, 0xd9, 0x20, 0x4c,
+ 0x20, 0x7d, 0x20, 0xad, 0x20, 0xff, 0x21, 0x5c,
+ 0x21, 0xa9, 0x22, 0x9, 0x22, 0x6d, 0x22, 0xae,
+ 0x22, 0xbf, 0x23, 0x2f, 0x23, 0xa9, 0x24, 0x38,
+ 0x24, 0x4c, 0x24, 0x6c, 0x24, 0x85, 0x24, 0xbe,
+ 0x24, 0xde, 0x24, 0xf9, 0x25, 0x4d, 0x25, 0x75,
+ 0x25, 0x8d, 0x25, 0xc1, 0x25, 0xda, 0x25, 0xff,
+ 0x26, 0x27, 0x26, 0x40, 0x26, 0xb0, 0x26, 0xf8,
+ 0x27, 0x45, 0x27, 0x67, 0x27, 0x87, 0x27, 0xec,
+ 0x28, 0xa, 0x28, 0x44, 0x28, 0xc6, 0x28, 0xdc,
+ 0x28, 0xeb, 0x29, 0x3d, 0x29, 0x6a, 0x29, 0xc9,
+ 0x2a, 0x25, 0x2a, 0xc0, 0x2b, 0x2d, 0x2b, 0x6f,
+ 0x2b, 0x86, 0x2b, 0xb0, 0x2b, 0xc9, 0x2c, 0x4a,
+ 0x2c, 0x78, 0x2c, 0x8f, 0x2c, 0xb2, 0x2d, 0x2e,
+ 0x2d, 0x9e, 0x2d, 0xc6, 0x2e, 0x2f, 0x2e, 0x6d,
+ 0x2e, 0xe8, 0x2f, 0x32, 0x2f, 0x92, 0x2f, 0xcc,
+ 0x2f, 0xff, 0x30, 0x32, 0x30, 0x60, 0x30, 0x7f,
+ 0x30, 0xa0, 0x30, 0xed, 0x31, 0x1c, 0x31, 0x5e,
+ 0x31, 0xca, 0x32, 0x26, 0x32, 0x81, 0x32, 0xdd,
+ 0x33, 0x4, 0x33, 0x25, 0x33, 0x46, 0x33, 0x70,
+ 0x33, 0x82, 0x33, 0x9e, 0x33, 0xb7, 0x33, 0xd1,
+ 0x34, 0xd, 0x34, 0x97, 0x34, 0xce, 0x35, 0x41,
+ 0x35, 0xca, 0x36, 0x73, 0x37, 0xe, 0x37, 0x41,
+ 0x37, 0x65, 0x37, 0xc8, 0x37, 0xdd, 0x37, 0xde,
+ 0x38, 0x2f, 0x38, 0x7d, 0x38, 0xe4, 0x39, 0x44,
+ 0x39, 0xf0, 0x3a, 0x51, 0x3a, 0x94, 0x3a, 0xe9,
+ 0x3b, 0x3a, 0x3b, 0x88, 0x3b, 0xde, 0x3b, 0xff,
+ 0x3c, 0x26, 0x3c, 0x4a, 0x3c, 0x61, 0x3c, 0x72,
+ 0x3c, 0xa1, 0x3c, 0xe1, 0x3d, 0x2c, 0x3d, 0x78,
+ 0x3d, 0xba, 0x3e, 0xe, 0x3e, 0x76, 0x3e, 0xac,
+ 0x3f, 0x0, 0x3f, 0x42, 0xe, 0x8b, 0xe6, 0xd8,
+ 0xe6, 0xf7, 0x68, 0xe6, 0x1, 0x63, 0x16, 0xf7,
+ 0x8d, 0x34, 0xa, 0x31, 0x6, 0xba, 0xd8, 0x5,
+ 0xf7, 0x82, 0x6, 0x9e, 0x3e, 0x5, 0x34, 0x36,
+ 0xa, 0xf7, 0x8a, 0x42, 0xa, 0x50, 0x6, 0xfb,
+ 0x0, 0xf8, 0x6b, 0x5, 0xfb, 0x92, 0x4b, 0xa,
+ 0xf7, 0x15, 0x6, 0xfb, 0x8d, 0x7d, 0xa, 0x4c,
+ 0x6, 0xf7, 0x9e, 0xf7, 0x3c, 0x15, 0xf7, 0x9,
+ 0xf7, 0x41, 0xb5, 0xfb, 0x41, 0x5, 0xe, 0x8b,
+ 0xe5, 0x31, 0xf7, 0x40, 0x7e, 0xe6, 0x52, 0xf7,
+ 0x50, 0x93, 0xf7, 0x41, 0x31, 0xe5, 0x12, 0x13,
+ 0xa8, 0xfb, 0xa, 0x16, 0xf7, 0x85, 0x6, 0x9f,
+ 0xe5, 0x5, 0x3d, 0x6, 0xb8, 0xd0, 0x5, 0xf7,
+ 0x4, 0x6, 0x6a, 0xfb, 0x33, 0x5, 0xf7, 0xcc,
+ 0x6, 0x13, 0x58, 0xaf, 0xf7, 0x40, 0x5, 0x3c,
+ 0x6, 0x13, 0x94, 0x7a, 0x39, 0x5, 0xfb, 0x1e,
+ 0x6, 0xab, 0xf7, 0x2c, 0x5, 0xb1, 0x6, 0x81,
+ 0x5a, 0x5c, 0xa, 0xb3, 0xf7, 0x50, 0x5, 0x3c,
+ 0x6, 0x82, 0x5a, 0x5, 0x64, 0x6, 0xa8, 0x97,
+ 0xa, 0xf7, 0x1e, 0x6, 0x13, 0xa8, 0x7a, 0x38,
+ 0x5c, 0xa, 0xaf, 0xf7, 0x41, 0x5, 0xfc, 0x6f,
+ 0x6, 0x13, 0xa4, 0x77, 0x31, 0x5, 0xe8, 0x6,
+ 0xfb, 0x8e, 0xfc, 0x12, 0x5, 0x4a, 0x6, 0xf7,
+ 0xa0, 0xf7, 0x34, 0x15, 0xf5, 0xf7, 0x39, 0x69,
+ 0xfb, 0x39, 0x5, 0xe, 0x40, 0xa, 0xf7, 0x7a,
+ 0x77, 0x1, 0xf7, 0xb6, 0xf8, 0xf3, 0x15, 0xf7,
+ 0xef, 0xd5, 0x77, 0xf2, 0xfb, 0xe4, 0xfb, 0xa,
+ 0x5, 0xfb, 0xc2, 0xfd, 0x2e, 0x23, 0xa, 0x40,
+ 0xa, 0xf7, 0x76, 0x77, 0x1, 0xf7, 0x91, 0xf8,
+ 0xee, 0x15, 0xf7, 0x42, 0xf7, 0x4, 0xf7, 0x13,
+ 0xfb, 0x4, 0xcd, 0xae, 0xfb, 0x16, 0xf7, 0x23,
+ 0x66, 0xa, 0xfb, 0x55, 0xfb, 0x22, 0x5, 0xfb,
+ 0x71, 0xfd, 0x12, 0x23, 0xa, 0x40, 0xa, 0xd3,
+ 0xf7, 0xe, 0x1, 0xf8, 0x57, 0xf9, 0x6, 0x6d,
+ 0xa, 0xa5, 0xf7, 0xe, 0x5, 0xfb, 0x4, 0x6,
+ 0xfb, 0x66, 0xfb, 0xe, 0x5a, 0xa, 0xa5, 0xf7,
+ 0xe, 0x4c, 0xa, 0xfb, 0xd0, 0xfd, 0x80, 0x23,
+ 0xa, 0x40, 0xa, 0xf7, 0x7a, 0x77, 0x1, 0x76,
+ 0x16, 0x20, 0xa, 0xfb, 0x31, 0xf8, 0x44, 0x15,
+ 0xf7, 0xc2, 0x3a, 0xb2, 0xc5, 0xfb, 0xa7, 0xf7,
+ 0xb, 0x5, 0xe, 0x40, 0xa, 0xba, 0xf7, 0x5c,
+ 0x1, 0xf7, 0xd1, 0xf9, 0x3f, 0x15, 0x5d, 0xae,
+ 0x67, 0xbf, 0xce, 0xc7, 0xc1, 0xc9, 0xba, 0x69,
+ 0xb0, 0x57, 0x4d, 0x49, 0x58, 0x48, 0x1e, 0xce,
+ 0x95, 0x15, 0xa5, 0x9e, 0x9f, 0xa8, 0x9e, 0x9a,
+ 0x7d, 0x79, 0x73, 0x70, 0x77, 0x75, 0x79, 0x7c,
+ 0x99, 0x9b, 0x1e, 0xfc, 0x29, 0xfd, 0x49, 0x23,
+ 0xa, 0x40, 0xa, 0xc5, 0x77, 0xf7, 0x3b, 0x77,
+ 0x1, 0xf7, 0x50, 0xf9, 0x10, 0x15, 0xd6, 0x72,
+ 0x5, 0xae, 0xa1, 0x9c, 0xa5, 0xa6, 0x1b, 0xa2,
+ 0x9d, 0x7d, 0x7d, 0x9f, 0x1f, 0x7b, 0xa1, 0xa2,
+ 0x7b, 0xaa, 0x1b, 0xd3, 0xc6, 0xc6, 0xca, 0xa6,
+ 0x1f, 0x3f, 0xa4, 0x5, 0x76, 0x80, 0x75, 0x61,
+ 0x69, 0x1b, 0x7a, 0x7b, 0x93, 0x96, 0x7b, 0x1f,
+ 0x9c, 0x70, 0x70, 0xa2, 0x69, 0x1b, 0x3d, 0x55,
+ 0x49, 0x56, 0x73, 0x1f, 0xfb, 0x65, 0xfd, 0x10,
+ 0x23, 0xa, 0x8b, 0xe6, 0xf7, 0x36, 0xe6, 0xf7,
+ 0x13, 0xe6, 0x12, 0xf8, 0x64, 0xed, 0x3c, 0xeb,
+ 0x13, 0xf0, 0x77, 0x16, 0xf7, 0xee, 0x6, 0xf7,
+ 0x17, 0xf4, 0xdc, 0xed, 0x1f, 0x8c, 0xb1, 0x77,
+ 0xaf, 0x6a, 0xa1, 0x6e, 0x9e, 0x18, 0x13, 0xe8,
+ 0xc8, 0xab, 0xb0, 0xb1, 0xce, 0x1a, 0xc9, 0x66,
+ 0xd0, 0xfb, 0x1f, 0x1e, 0xfb, 0xc6, 0x36, 0xa,
+ 0xdd, 0x74, 0xa, 0x39, 0x6, 0xf7, 0x79, 0xf7,
+ 0x91, 0x15, 0xa8, 0xf7, 0x13, 0x5, 0xf7, 0x20,
+ 0x6, 0xc8, 0xa3, 0x70, 0x71, 0x8c, 0x1f, 0x44,
+ 0x23, 0x88, 0x71, 0x1e, 0xfb, 0x43, 0xfb, 0x91,
+ 0x15, 0xaa, 0xf7, 0x36, 0x5, 0xf6, 0x6, 0x13,
+ 0xf0, 0xb3, 0xf7, 0x0, 0x80, 0x4d, 0x4f, 0x38,
+ 0x6e, 0x6d, 0x1f, 0xe, 0x79, 0xe8, 0xf8, 0x1d,
+ 0xe7, 0x1, 0xa9, 0xec, 0x3, 0xf8, 0x7a, 0xf7,
+ 0x1e, 0x15, 0x76, 0x65, 0x38, 0x61, 0x39, 0x1b,
+ 0xfb, 0x0, 0x5b, 0xcb, 0xdb, 0xf7, 0x41, 0xf7,
+ 0x24, 0xd7, 0xe7, 0xc2, 0xbc, 0x77, 0x6f, 0xb2,
+ 0x1f, 0x76, 0x22, 0x5, 0xea, 0x6, 0xbc, 0xf7,
+ 0x89, 0x7a, 0xa, 0x83, 0x60, 0x5, 0x96, 0x80,
+ 0x5c, 0xab, 0x34, 0x1b, 0xfb, 0x4d, 0xfb, 0x39,
+ 0xfb, 0x25, 0xfb, 0x59, 0xfb, 0x2, 0xc0, 0xfb,
+ 0x12, 0xf7, 0x4c, 0xb4, 0xf7, 0x16, 0x9d, 0xd1,
+ 0xe7, 0x1f, 0xe, 0xfb, 0x4d, 0x76, 0xf7, 0x56,
+ 0xe5, 0xf8, 0x19, 0xe7, 0x8c, 0x77, 0x12, 0x8b,
+ 0xee, 0x13, 0xe8, 0xf7, 0x0, 0xfb, 0x46, 0x15,
+ 0x71, 0xa7, 0xa0, 0x89, 0xa0, 0x1b, 0xc9, 0xca,
+ 0xb5, 0xd5, 0xa1, 0x84, 0xad, 0x64, 0x94, 0x1f,
+ 0x8f, 0x98, 0x5, 0xe8, 0xd7, 0xba, 0xb3, 0xd7,
+ 0x1f, 0x60, 0xcf, 0x5, 0x72, 0x5b, 0x42, 0x63,
+ 0x37, 0x1b, 0xfb, 0x1d, 0x75, 0xed, 0xd7, 0xf7,
+ 0x2b, 0xf7, 0x2e, 0xcb, 0xe0, 0xc1, 0xba, 0x79,
+ 0x70, 0xb0, 0x1f, 0x76, 0x24, 0x5, 0xeb, 0x6,
+ 0x13, 0xd8, 0xbc, 0xf7, 0x85, 0x7a, 0xa, 0x83,
+ 0x60, 0x5, 0x13, 0xe8, 0xa4, 0x6f, 0x58, 0x9c,
+ 0x4e, 0x1b, 0xfb, 0x42, 0xfb, 0x4a, 0x25, 0xfb,
+ 0x84, 0xfb, 0x8, 0xd6, 0x2e, 0xf7, 0x1, 0x7a,
+ 0x1f, 0x70, 0x2e, 0x5, 0x8e, 0x95, 0x9e, 0x8e,
+ 0x9b, 0x1b, 0x94, 0x95, 0x85, 0x80, 0x7f, 0x7e,
+ 0x81, 0x7c, 0x80, 0x7d, 0x8f, 0x95, 0x7c, 0x1f,
+ 0xe, 0x3a, 0xa, 0xf8, 0x78, 0xeb, 0x3, 0x55,
+ 0x16, 0xf7, 0xa2, 0x6, 0xf7, 0x57, 0xf7, 0x3d,
+ 0xf4, 0xf7, 0x91, 0xf7, 0xc, 0x40, 0xdf, 0xfb,
+ 0x27, 0x1f, 0xfb, 0xbc, 0x36, 0xa, 0xdf, 0x74,
+ 0xa, 0x38, 0x6, 0xf7, 0x48, 0x16, 0xda, 0xf8,
+ 0x10, 0x5, 0xf7, 0xb, 0x6, 0xea, 0xb9, 0x59,
+ 0x46, 0xfb, 0x28, 0x2d, 0xfb, 0x5, 0xfb, 0x1d,
+ 0x1f, 0xe, 0x8b, 0xe6, 0xd6, 0xf7, 0x39, 0x31,
+ 0xe5, 0xf7, 0x20, 0xe6, 0x12, 0x13, 0xb0, 0x75,
+ 0x16, 0xf8, 0xa4, 0x6, 0xb5, 0xf7, 0x59, 0x66,
+ 0xa, 0x73, 0x21, 0x5, 0xfb, 0x9a, 0x6, 0xa9,
+ 0xf7, 0x2a, 0x5, 0xf7, 0x10, 0x6, 0x13, 0xd0,
+ 0x7b, 0x40, 0x56, 0xa, 0xbc, 0xf7, 0x84, 0x4e,
+ 0xa, 0x7c, 0x40, 0x5, 0xfb, 0xe, 0x6, 0xa8,
+ 0x97, 0xa, 0xf7, 0x9a, 0x6, 0x76, 0x25, 0x96,
+ 0xa, 0xb3, 0xf7, 0x55, 0x5, 0xfc, 0xa2, 0x4b,
+ 0xa, 0xd1, 0x74, 0xa, 0x43, 0x6, 0xe, 0x54,
+ 0xa, 0xf7, 0x7a, 0x77, 0x12, 0x13, 0xb8, 0xf7,
+ 0x99, 0xf8, 0xf3, 0x15, 0xf7, 0xe4, 0xd5, 0x77,
+ 0xf2, 0xfb, 0xd9, 0xfb, 0xa, 0x5, 0xfb, 0xa6,
+ 0xfd, 0x2e, 0x28, 0xa, 0x54, 0xa, 0xf7, 0x76,
+ 0x77, 0x12, 0x13, 0xb8, 0xf7, 0x73, 0xf8, 0xee,
+ 0x15, 0xf7, 0x44, 0xf7, 0x4, 0xf7, 0x13, 0xfb,
+ 0x4, 0xcf, 0xae, 0xfb, 0x18, 0xf7, 0x23, 0x4e,
+ 0xa, 0xfb, 0x58, 0xfb, 0x22, 0x5, 0xfb, 0x52,
+ 0xfd, 0x12, 0x28, 0xa, 0x54, 0xa, 0xd4, 0xf7,
+ 0xd, 0x12, 0x13, 0xb8, 0xf8, 0x34, 0xf9, 0x7,
+ 0x92, 0xa, 0xa5, 0xf7, 0xd, 0x4c, 0xa, 0xfb,
+ 0x66, 0xfb, 0xd, 0x6d, 0xa, 0xa5, 0xf7, 0xd,
+ 0x65, 0xa, 0xfb, 0xac, 0xfd, 0x80, 0x28, 0xa,
+ 0x8b, 0xe5, 0xf7, 0x27, 0xe4, 0xa1, 0x8b, 0x1,
+ 0xdc, 0xea, 0xf7, 0x14, 0xed, 0xbd, 0xeb, 0x3,
+ 0x75, 0x16, 0x33, 0xa, 0x2a, 0xa, 0xf7, 0x7f,
+ 0xf8, 0xe4, 0x15, 0xf7, 0xc0, 0x40, 0xb1, 0xc5,
+ 0xfb, 0xa5, 0xf7, 0xb, 0x5, 0xe, 0x8b, 0xe6,
+ 0xf7, 0x30, 0xce, 0xf7, 0x31, 0xe6, 0x1, 0xf8,
+ 0x86, 0xee, 0x3, 0x70, 0x16, 0xf7, 0xa2, 0x6,
+ 0xf7, 0x36, 0xf7, 0x54, 0xf3, 0xf7, 0x8f, 0xf7,
+ 0xd, 0x4c, 0xe1, 0xfb, 0x28, 0x1f, 0xfb, 0xbc,
+ 0x36, 0xa, 0xde, 0x6, 0x6a, 0xfb, 0x31, 0x5,
+ 0x4d, 0x6, 0x7e, 0x48, 0x5, 0xc8, 0x6, 0x6b,
+ 0xfb, 0x30, 0x5, 0x38, 0x6, 0xf7, 0x48, 0x16,
+ 0xac, 0xf7, 0x30, 0x5, 0xf7, 0x12, 0x6, 0x99,
+ 0xce, 0x5, 0xfb, 0x12, 0x6, 0xaa, 0xf7, 0x31,
+ 0x5, 0xf7, 0xc, 0x6, 0xec, 0xaa, 0x57, 0x44,
+ 0xfb, 0x28, 0x39, 0xfb, 0x1, 0xfb, 0x33, 0x1f,
+ 0xe, 0x8b, 0xdd, 0xe9, 0xd3, 0xc1, 0xd3, 0xf5,
+ 0xdd, 0x1, 0xf8, 0x7b, 0xe4, 0x3, 0x77, 0xf7,
+ 0x44, 0x15, 0xe7, 0x6, 0x23, 0x91, 0xca, 0x43,
+ 0xf7, 0x25, 0x1b, 0xb2, 0xf7, 0x5, 0x9e, 0xc9,
+ 0xe2, 0x1f, 0x61, 0xc8, 0x5, 0x77, 0x68, 0x47,
+ 0x63, 0x3d, 0x1b, 0x45, 0x5a, 0xa9, 0xcb, 0x7d,
+ 0x1f, 0xf7, 0x32, 0x6, 0xb2, 0xd3, 0x5, 0xfb,
+ 0x5d, 0x6, 0x8c, 0x9b, 0x8f, 0xa3, 0x90, 0x99,
+ 0x8, 0xf7, 0x6a, 0x6, 0xb3, 0xd3, 0x5, 0xfb,
+ 0x71, 0x6, 0xcd, 0xae, 0xc7, 0xb3, 0xdd, 0x1b,
+ 0xbe, 0xbe, 0x6f, 0x6a, 0x98, 0x1f, 0x7e, 0x48,
+ 0x5, 0xe4, 0x6, 0xb7, 0xf7, 0x66, 0x5, 0x31,
+ 0x6, 0x81, 0x5c, 0x5, 0xaa, 0x6c, 0x59, 0x9b,
+ 0x5e, 0x1b, 0xfb, 0x10, 0x22, 0x40, 0xfb, 0x5,
+ 0x55, 0x1f, 0x48, 0x6, 0x63, 0x43, 0x5, 0xda,
+ 0x6, 0x85, 0x71, 0x89, 0x79, 0x8a, 0x81, 0x8,
+ 0x54, 0x6, 0xe, 0x8b, 0xe6, 0xdf, 0xf7, 0x2f,
+ 0xf7, 0x21, 0xe6, 0x1, 0xd8, 0xec, 0xf7, 0x18,
+ 0xed, 0xd5, 0xed, 0x3, 0x75, 0x16, 0xf7, 0xc7,
+ 0x6, 0x9f, 0xe6, 0x5, 0xfb, 0x17, 0x6, 0xaa,
+ 0xf7, 0x28, 0x5, 0xf7, 0x6, 0x6, 0x7e, 0x4b,
+ 0x56, 0xa, 0xb9, 0xf7, 0x70, 0x4e, 0xa, 0x7c,
+ 0x4a, 0x65, 0xa, 0xa9, 0xf7, 0x21, 0x88, 0xa,
+ 0x70, 0xfb, 0x12, 0x56, 0xa, 0xb9, 0xf7, 0x6d,
+ 0x5, 0xfc, 0xa2, 0x4b, 0xa, 0xda, 0x6, 0x3b,
+ 0x7d, 0xa, 0x3b, 0x6, 0xe, 0x79, 0xe8, 0xf5,
+ 0xe9, 0xf7, 0x56, 0xe5, 0x1, 0x9f, 0xee, 0x3,
+ 0xf7, 0xa7, 0xf7, 0x49, 0x15, 0xf7, 0x32, 0x6,
+ 0x7c, 0x3f, 0x5, 0x78, 0x65, 0x56, 0x80, 0x58,
+ 0x1b, 0x3a, 0x3f, 0xb1, 0xeb, 0xf7, 0x33, 0xf7,
+ 0xc, 0xf4, 0xf7, 0x9, 0xc9, 0xaa, 0x87, 0x6d,
+ 0xb9, 0x1f, 0x77, 0x2d, 0x96, 0xa, 0xba, 0xf7,
+ 0x6e, 0x66, 0xa, 0x82, 0x65, 0x5, 0xa1, 0x71,
+ 0x62, 0x9b, 0x41, 0x1b, 0xfb, 0x38, 0xfb, 0x50,
+ 0xfb, 0x23, 0xfb, 0x64, 0xfb, 0x2b, 0xf7, 0x1,
+ 0x3c, 0xf7, 0x1f, 0xeb, 0xf7, 0x5, 0xb6, 0x94,
+ 0xa3, 0x1f, 0xa7, 0xf7, 0x27, 0x5, 0xba, 0x55,
+ 0xa, 0xfb, 0xc1, 0x6, 0xe, 0x79, 0xe2, 0x8b,
+ 0xee, 0xa6, 0xe3, 0x70, 0xcd, 0xf7, 0x70, 0xcd,
+ 0x12, 0x8b, 0xee, 0x13, 0xec, 0xf7, 0x93, 0xf7,
+ 0x3c, 0x15, 0xf7, 0x32, 0x6, 0x7c, 0x44, 0x5,
+ 0x7a, 0x67, 0x59, 0x80, 0x5a, 0x1b, 0x37, 0x3b,
+ 0xac, 0xe8, 0xf7, 0x29, 0xf7, 0xc, 0xf7, 0x4,
+ 0xf7, 0x9, 0xc9, 0xaa, 0x78, 0x6f, 0xb9, 0x1f,
+ 0x13, 0xdc, 0x77, 0x34, 0x96, 0xa, 0xba, 0xf7,
+ 0x70, 0x66, 0xa, 0x82, 0x60, 0x5, 0xa2, 0x67,
+ 0x6c, 0x9f, 0x41, 0x1b, 0xfb, 0x42, 0xfb, 0x46,
+ 0xfb, 0x2a, 0xfb, 0x57, 0xfb, 0x21, 0xf7, 0x1,
+ 0x41, 0xf7, 0x1f, 0xeb, 0xf7, 0x5, 0xb3, 0x94,
+ 0xa3, 0x1f, 0xa7, 0xf7, 0x1d, 0x5, 0xba, 0x6,
+ 0x9f, 0xe3, 0x5, 0xfb, 0xc1, 0x6, 0xab, 0xf7,
+ 0xf4, 0x48, 0xa, 0x8b, 0xe6, 0xf7, 0x23, 0xe6,
+ 0xf7, 0x26, 0xe6, 0x1, 0xc4, 0xe9, 0xf7, 0x72,
+ 0xea, 0x3, 0x64, 0x16, 0xf7, 0x90, 0x34, 0xa,
+ 0x3a, 0x6, 0xa8, 0xf7, 0x23, 0x5, 0xf7, 0x72,
+ 0x6, 0x6e, 0xfb, 0x23, 0x5, 0x3b, 0x6, 0x79,
+ 0x30, 0x5, 0xf7, 0x8f, 0x34, 0xa, 0x3e, 0x6,
+ 0xd7, 0xf8, 0x10, 0x5, 0xd9, 0x42, 0xa, 0xfb,
+ 0x8f, 0x36, 0xa, 0xdb, 0x6, 0x6d, 0xfb, 0x26,
+ 0x5, 0xfb, 0x72, 0x6, 0xa9, 0xf7, 0x26, 0x5,
+ 0xdc, 0x6, 0x9d, 0xe6, 0x5, 0xfb, 0x90, 0x36,
+ 0xa, 0xd8, 0x6, 0x3f, 0x7d, 0xa, 0x3d, 0x6,
+ 0xe, 0x3a, 0xa, 0xf7, 0x67, 0xf0, 0x3, 0x9c,
+ 0x16, 0xf8, 0x54, 0x6, 0x9f, 0xe6, 0x5, 0xfb,
+ 0x41, 0x6, 0xdb, 0xf8, 0x10, 0x5, 0xf7, 0x3f,
+ 0x34, 0xa, 0xfc, 0x51, 0x36, 0xa, 0xf7, 0x41,
+ 0x6, 0x3b, 0xfc, 0x10, 0x43, 0xa, 0x79, 0xe6,
+ 0xf8, 0x22, 0xe6, 0x1, 0x41, 0x79, 0x15, 0xf7,
+ 0xaa, 0x6, 0x9f, 0xe6, 0x5, 0x2e, 0x6, 0xdb,
+ 0xf8, 0x22, 0x5, 0xe6, 0x34, 0xa, 0xfb, 0xa7,
+ 0x36, 0xa, 0xde, 0x6, 0x3b, 0xfc, 0x22, 0x5,
+ 0x36, 0x6, 0xf7, 0xd3, 0x72, 0x15, 0x76, 0xa2,
+ 0xa4, 0x5e, 0xe9, 0x1b, 0xf7, 0x1e, 0x87, 0x8c,
+ 0xa, 0xac, 0x5b, 0xa, 0xfb, 0xa6, 0x6, 0x79,
+ 0x2f, 0x5, 0xf7, 0x25, 0x6, 0x53, 0xfb, 0xa8,
+ 0x5, 0x40, 0x7c, 0x84, 0x5c, 0x5e, 0x1b, 0x73,
+ 0x83, 0x97, 0x9e, 0x9d, 0x91, 0xa3, 0x91, 0xa4,
+ 0x1f, 0xa1, 0xec, 0x4e, 0xa, 0xe, 0x68, 0xa,
+ 0xf7, 0x90, 0xf8, 0xf3, 0x15, 0xf7, 0xde, 0xd5,
+ 0x78, 0xf2, 0xfb, 0xd3, 0xfb, 0xa, 0x5, 0xfb,
+ 0x77, 0xfd, 0x2e, 0x15, 0x2b, 0xa, 0xe, 0x75,
+ 0xa, 0xf7, 0x76, 0x77, 0x62, 0xa, 0xf7, 0x6b,
+ 0xf8, 0xf0, 0x15, 0xf7, 0x49, 0xf7, 0x2, 0xf7,
+ 0xa, 0xfb, 0x2, 0xcf, 0xae, 0xfb, 0x16, 0xf7,
+ 0x21, 0x66, 0xa, 0xfb, 0x56, 0xfb, 0x20, 0x5,
+ 0xfb, 0x24, 0xfd, 0x14, 0x15, 0x2b, 0xa, 0xe,
+ 0x75, 0xa, 0xd2, 0xf7, 0xf, 0x62, 0xa, 0xf8,
+ 0x34, 0xf9, 0x5, 0x4a, 0xa, 0xfb, 0x69, 0xfb,
+ 0xf, 0x4a, 0xa, 0xfb, 0x84, 0xfd, 0x80, 0x15,
+ 0x2b, 0xa, 0xe, 0x8b, 0xe3, 0xf8, 0x2, 0xe3,
+ 0xde, 0xf7, 0xf, 0x62, 0xa, 0xf7, 0xca, 0xf9,
+ 0x5, 0x4a, 0xa, 0xfb, 0xd4, 0xfd, 0x80, 0x15,
+ 0xf8, 0x55, 0x6, 0x9e, 0xe3, 0x5, 0xfb, 0x40,
+ 0x6, 0xdb, 0xf8, 0x2, 0x5, 0xf7, 0x3e, 0x6,
+ 0x9e, 0xe3, 0x5, 0xfc, 0x51, 0x6, 0x78, 0x33,
+ 0x5, 0xf7, 0x41, 0x6, 0x3b, 0xfc, 0x2, 0x43,
+ 0xa, 0x68, 0xa, 0x9c, 0x16, 0x2b, 0xa, 0xf7,
+ 0x56, 0xf8, 0xe6, 0x15, 0xf7, 0xc5, 0x3e, 0xb3,
+ 0xc5, 0xfb, 0xac, 0xf7, 0xb, 0x5, 0xe, 0x79,
+ 0xe5, 0xf8, 0x22, 0xe7, 0x1, 0x9a, 0xed, 0xf7,
+ 0x73, 0xe8, 0x3, 0x6d, 0xbb, 0x15, 0x76, 0xa2,
+ 0xf7, 0xa, 0x5e, 0xe9, 0x1b, 0xf7, 0x1e, 0xc8,
+ 0x8c, 0xa, 0xf7, 0x11, 0x5b, 0xa, 0xfc, 0x29,
+ 0x6, 0x79, 0x2f, 0x5, 0xf7, 0x4c, 0x6, 0x53,
+ 0xfb, 0xa8, 0x5, 0x40, 0x7c, 0x67, 0x5c, 0x3a,
+ 0x1b, 0x45, 0x50, 0xa1, 0xd7, 0x9b, 0x1f, 0xa1,
+ 0xec, 0x4e, 0xa, 0xe, 0x3a, 0xa, 0xcf, 0xed,
+ 0xf7, 0x8e, 0xf7, 0x17, 0x3, 0x68, 0x16, 0xf7,
+ 0x9d, 0x34, 0xa, 0x38, 0x6, 0xa0, 0xf0, 0xd1,
+ 0xc0, 0x9f, 0x70, 0xa1, 0x66, 0x9a, 0x71, 0x19,
+ 0xa6, 0x56, 0xa6, 0x58, 0x9b, 0x58, 0x8, 0xf7,
+ 0x34, 0x34, 0xa, 0x20, 0x6, 0x7b, 0xb7, 0x76,
+ 0xa6, 0x75, 0xb5, 0x7e, 0xa8, 0x66, 0xc0, 0x80,
+ 0x9c, 0xf7, 0x67, 0xf7, 0x3c, 0x18, 0xd0, 0x34,
+ 0xa, 0xfb, 0x87, 0x6e, 0xa, 0xb7, 0x6, 0xfb,
+ 0x61, 0xfb, 0x36, 0xae, 0xf7, 0x36, 0x5, 0xdd,
+ 0x34, 0xa, 0xfb, 0x9c, 0x6e, 0xa, 0xdf, 0x74,
+ 0xa, 0x37, 0x6, 0xe, 0x3a, 0xa, 0xf7, 0xf,
+ 0xed, 0x3, 0x8d, 0x16, 0xf8, 0xb4, 0x6, 0xbf,
+ 0xf7, 0x92, 0x5, 0x27, 0x6, 0x6b, 0xfb, 0x37,
+ 0x5, 0xfb, 0x89, 0x6, 0xdd, 0xf8, 0x10, 0x5,
+ 0xf7, 0x14, 0x34, 0xa, 0xfb, 0xdd, 0x36, 0xa,
+ 0xf0, 0x6, 0x3b, 0x7d, 0xa, 0x26, 0x6, 0xe,
+ 0x3a, 0xa, 0xf7, 0xe, 0xed, 0x3, 0x8d, 0x16,
+ 0xf8, 0xb1, 0x6, 0xc2, 0xf7, 0x9c, 0x7b, 0xa,
+ 0x66, 0xfb, 0x41, 0x5, 0xfb, 0x86, 0x6, 0xae,
+ 0xf7, 0x37, 0xf7, 0x34, 0xb4, 0x9a, 0xc9, 0xfb,
+ 0x36, 0x63, 0xac, 0xf7, 0x2e, 0x5, 0xf7, 0x14,
+ 0x34, 0xa, 0xfb, 0xdc, 0x36, 0xa, 0xf0, 0x6,
+ 0x66, 0xfb, 0x47, 0x30, 0x74, 0x7f, 0x4b, 0xe4,
+ 0xa2, 0x6e, 0xfb, 0x1d, 0x5, 0x26, 0x6, 0xe,
+ 0x3a, 0xa, 0x4e, 0x16, 0xf7, 0x77, 0x34, 0xa,
+ 0x3e, 0x6, 0xda, 0xf7, 0xce, 0xc5, 0xfb, 0xac,
+ 0x5, 0xc7, 0x6, 0xf7, 0x2b, 0xf7, 0xa4, 0x5b,
+ 0xfb, 0xc6, 0x5, 0x41, 0x6, 0x7a, 0x30, 0x5,
+ 0xf7, 0x71, 0x42, 0xa, 0x55, 0x6, 0xc9, 0xf8,
+ 0x10, 0x5, 0xdb, 0x42, 0xa, 0xfb, 0x61, 0x6,
+ 0xfb, 0x32, 0xfb, 0xb6, 0x5b, 0xf7, 0xb6, 0x5,
+ 0xfb, 0x5f, 0x4b, 0xa, 0xd7, 0x6, 0x2e, 0x7d,
+ 0xa, 0x53, 0x6, 0xe, 0x7f, 0xe8, 0xf8, 0x18,
+ 0xe8, 0x1, 0x4f, 0x7f, 0x15, 0xf7, 0xa4, 0x94,
+ 0xa, 0x28, 0x6, 0xc9, 0xf7, 0xd1, 0xf7, 0x4a,
+ 0xfc, 0x2e, 0x5, 0xe7, 0x6, 0xeb, 0xf8, 0x75,
+ 0x6c, 0xa, 0xea, 0x6, 0x4e, 0xfb, 0xd0, 0xfb,
+ 0x3e, 0xf8, 0x2d, 0x7e, 0xa, 0xfc, 0x18, 0x5,
+ 0x3c, 0x6, 0xe, 0x7f, 0xe7, 0xf8, 0x13, 0xe8,
+ 0xc1, 0xe0, 0x73, 0xdf, 0x8f, 0x77, 0x12, 0x13,
+ 0xd0, 0x4f, 0x7f, 0x15, 0xf7, 0xa5, 0x5b, 0xa,
+ 0x27, 0x6, 0xca, 0xf7, 0xcd, 0xf7, 0x4c, 0xfc,
+ 0x29, 0x5, 0xe5, 0x6, 0xea, 0xf8, 0x6f, 0x6c,
+ 0xa, 0xeb, 0x6, 0x4e, 0xfb, 0xc6, 0xfb, 0x3e,
+ 0xf8, 0x23, 0x7e, 0xa, 0xfc, 0x13, 0x5, 0x3b,
+ 0x6, 0xf7, 0x62, 0xf8, 0xbe, 0x15, 0xdb, 0x72,
+ 0x5, 0xae, 0xa0, 0x9e, 0xa6, 0xa7, 0x1b, 0xa6,
+ 0xa0, 0x79, 0x7b, 0xa3, 0x1f, 0x13, 0xe8, 0x7d,
+ 0xa0, 0xa1, 0x7e, 0xa8, 0x1b, 0xd6, 0xca, 0xc7,
+ 0xcb, 0xa6, 0x1f, 0x3c, 0xa4, 0x5, 0x76, 0x7f,
+ 0x74, 0x60, 0x67, 0x1b, 0x77, 0x79, 0x95, 0x98,
+ 0x78, 0x1f, 0x13, 0xd0, 0x9c, 0x72, 0x70, 0x9f,
+ 0x6a, 0x1b, 0x39, 0x52, 0x48, 0x55, 0x71, 0x1f,
+ 0xe, 0x79, 0xe7, 0xf8, 0x1f, 0xe9, 0x1, 0xa2,
+ 0xf1, 0xf7, 0xff, 0xec, 0x3, 0xa2, 0xf7, 0x57,
+ 0x15, 0xfb, 0x24, 0xf3, 0x46, 0xf7, 0x6, 0xf7,
+ 0x4f, 0xf7, 0x31, 0xf7, 0xe, 0xf7, 0x8d, 0xf7,
+ 0xb, 0x45, 0xe6, 0xfb, 0x2d, 0xfb, 0x5d, 0xfb,
+ 0x1e, 0xfb, 0x49, 0xfb, 0x4f, 0x1e, 0xf1, 0x9a,
+ 0x15, 0xf7, 0xc, 0xd4, 0xf7, 0x1f, 0xf7, 0x24,
+ 0xf7, 0x0, 0xb1, 0x4d, 0x46, 0x23, 0x3e, 0xfb,
+ 0x34, 0xfb, 0x2c, 0x2f, 0x61, 0xc9, 0xd5, 0x1e,
+ 0xe, 0x8b, 0xe6, 0x30, 0xf7, 0x3d, 0xa4, 0xf7,
+ 0x4f, 0x92, 0xf7, 0x42, 0x30, 0xe6, 0x12, 0x66,
+ 0xea, 0x13, 0xac, 0xf7, 0xe2, 0xe6, 0x15, 0xaa,
+ 0xf7, 0x2b, 0x5, 0xaf, 0x6, 0x81, 0x58, 0x5,
+ 0xd4, 0x6, 0xb1, 0xf7, 0x4f, 0x5, 0x41, 0x6,
+ 0x83, 0x5d, 0x5, 0x65, 0x6, 0xa7, 0xf7, 0x1f,
+ 0x5, 0xf7, 0x1a, 0x6, 0x13, 0xb4, 0x7b, 0x38,
+ 0x5, 0xd5, 0x6, 0xae, 0xf7, 0x42, 0x5, 0xfc,
+ 0x10, 0x6, 0xfb, 0x1e, 0xfb, 0x30, 0xfb, 0xf,
+ 0xfb, 0x7a, 0xfb, 0x1c, 0xe2, 0x42, 0xe4, 0x1f,
+ 0xf8, 0x16, 0x6, 0x13, 0x74, 0xae, 0xf7, 0x3d,
+ 0x5, 0x40, 0x6, 0x13, 0xac, 0x7a, 0x3d, 0x5,
+ 0xfc, 0x2e, 0xf7, 0x25, 0x15, 0xf7, 0x8, 0xed,
+ 0xf7, 0xb, 0xf6, 0x99, 0xb2, 0x8a, 0x66, 0x84,
+ 0x1e, 0x50, 0xfb, 0xb9, 0x5, 0x5c, 0x82, 0x67,
+ 0x89, 0x7a, 0x1b, 0x30, 0x64, 0xc3, 0xe4, 0x1f,
+ 0xe, 0x77, 0xa, 0xf7, 0x71, 0x77, 0x58, 0xa,
+ 0xf7, 0x8d, 0xf8, 0xf0, 0x15, 0xf7, 0xe4, 0xd8,
+ 0x76, 0xf2, 0xfb, 0xd7, 0xfb, 0xd, 0x5, 0xfb,
+ 0x72, 0xfc, 0x61, 0x24, 0xa, 0x77, 0xa, 0xf7,
+ 0x6d, 0x77, 0x58, 0xa, 0xf7, 0x3f, 0xf9, 0x13,
+ 0x15, 0xc0, 0x66, 0xf7, 0x46, 0xf3, 0xf7, 0xa,
+ 0x22, 0xcc, 0xaf, 0xfb, 0x14, 0xf7, 0x23, 0x5,
+ 0x2c, 0x6, 0xfb, 0xeb, 0xfc, 0xd6, 0x24, 0xa,
+ 0x77, 0xa, 0xc9, 0xf7, 0xf, 0x58, 0xa, 0xf8,
+ 0x38, 0xf9, 0x5, 0x5a, 0xa, 0xa4, 0xf7, 0xf,
+ 0x4c, 0xa, 0xfb, 0x65, 0xfb, 0xf, 0x5a, 0xa,
+ 0xa5, 0xf7, 0xf, 0x5, 0xfb, 0x4, 0x6, 0xfb,
+ 0x88, 0xfc, 0xb6, 0x24, 0xa, 0x79, 0xe4, 0xf8,
+ 0x21, 0xe6, 0x1, 0x9e, 0xf1, 0xf7, 0xee, 0xed,
+ 0x3, 0xf7, 0x81, 0xf9, 0x3d, 0x15, 0xf7, 0xc2,
+ 0x40, 0xb2, 0xc5, 0xfb, 0xa7, 0xf7, 0xc, 0x5,
+ 0xfb, 0xb0, 0xfc, 0xda, 0x24, 0xa, 0x7c, 0xe6,
+ 0x3e, 0x76, 0xf8, 0x93, 0xe6, 0x8f, 0x77, 0x12,
+ 0x97, 0xf2, 0xf8, 0x5, 0xeb, 0x13, 0x6c, 0x7f,
+ 0xa7, 0x15, 0xbf, 0x59, 0xc1, 0xbf, 0x5, 0x13,
+ 0x9c, 0x6d, 0xb5, 0xbe, 0x7c, 0xbf, 0x1b, 0xf7,
+ 0x62, 0xf7, 0x1c, 0xf7, 0x2c, 0xf7, 0x7b, 0x8a,
+ 0x1f, 0xb2, 0x81, 0xb0, 0x7a, 0xac, 0x1e, 0xc6,
+ 0xc6, 0x57, 0xbb, 0x56, 0x58, 0x5, 0x13, 0xac,
+ 0xa9, 0x68, 0x59, 0x9c, 0x4c, 0x1b, 0xfb, 0x92,
+ 0x2e, 0xfb, 0x6e, 0xfb, 0x2f, 0x5b, 0x97, 0x62,
+ 0x9e, 0x6a, 0x1f, 0xdd, 0xda, 0x15, 0x83, 0x9e,
+ 0x88, 0xa5, 0x8c, 0xa5, 0x8, 0xf7, 0x3, 0xe4,
+ 0xf7, 0x23, 0xf7, 0x1b, 0xb3, 0xaa, 0x80, 0x7a,
+ 0xa1, 0x1e, 0xfb, 0x9b, 0xfb, 0xfa, 0x15, 0xf7,
+ 0xc4, 0xf7, 0xbd, 0x5, 0x93, 0x78, 0x8e, 0x74,
+ 0x74, 0x1a, 0x27, 0x41, 0xfb, 0x33, 0xfb, 0x2d,
+ 0x67, 0x6c, 0x95, 0x9c, 0x76, 0x1e, 0xe, 0x77,
+ 0xa, 0xbb, 0xdf, 0xcb, 0x77, 0x58, 0xa, 0xf7,
+ 0x2c, 0xf9, 0xf, 0x15, 0xd9, 0x71, 0xa0, 0xaf,
+ 0x9d, 0xa6, 0xa6, 0x8a, 0x19, 0xa4, 0x8a, 0x9e,
+ 0x80, 0x9b, 0x80, 0x8, 0x7a, 0xa3, 0xa0, 0x77,
+ 0xaf, 0x1b, 0xd5, 0xc6, 0xc6, 0xcb, 0xa6, 0x1f,
+ 0x3f, 0xa4, 0x5, 0x76, 0x80, 0x73, 0x60, 0x69,
+ 0x1b, 0x74, 0x7a, 0x9a, 0x9a, 0x76, 0x1f, 0x9a,
+ 0x77, 0x73, 0x9a, 0x68, 0x1b, 0x3c, 0x53, 0x48,
+ 0x56, 0x72, 0x1f, 0xfb, 0x19, 0xfc, 0x45, 0x24,
+ 0xa, 0x8b, 0xe7, 0xe5, 0xe6, 0xf7, 0x59, 0xe7,
+ 0x1, 0xf8, 0x7d, 0xed, 0x3, 0x84, 0x16, 0xf7,
+ 0xca, 0x5b, 0xa, 0xfb, 0x15, 0x46, 0xa, 0xf7,
+ 0x11, 0x6, 0xf7, 0x3b, 0xdf, 0xe6, 0xf7, 0x16,
+ 0x1f, 0xf3, 0x8a, 0x3a, 0xc2, 0xfb, 0xa, 0x1b,
+ 0xfb, 0xa8, 0x6, 0x78, 0x2f, 0x5, 0xde, 0x6,
+ 0x3b, 0xfc, 0xe, 0x5, 0x38, 0x6, 0xf7, 0x6f,
+ 0xf7, 0x49, 0x15, 0xb3, 0xf7, 0x59, 0x5, 0xeb,
+ 0x6, 0xc5, 0xcb, 0x73, 0x51, 0x20, 0x2b, 0x83,
+ 0x3d, 0x1f, 0xe, 0xfb, 0x9, 0x76, 0xc1, 0xf7,
+ 0x40, 0xf8, 0x11, 0xe6, 0x1, 0xba, 0xec, 0xf7,
+ 0xfd, 0xe9, 0x3, 0xd7, 0x45, 0x15, 0xa8, 0x47,
+ 0x5, 0xab, 0xcb, 0xa8, 0xa1, 0xaf, 0x1b, 0xa7,
+ 0xa1, 0x7e, 0x7e, 0xa2, 0x1f, 0x7f, 0xa1, 0xa1,
+ 0x80, 0xa7, 0x1b, 0xc3, 0xac, 0xa6, 0xb8, 0xc3,
+ 0x1f, 0x5f, 0xca, 0x5, 0x67, 0x60, 0x7c, 0x83,
+ 0x78, 0x1b, 0x73, 0x76, 0x9b, 0xa2, 0x6f, 0x1f,
+ 0xf7, 0x3f, 0xb5, 0xed, 0xf7, 0x28, 0xf7, 0x27,
+ 0x1a, 0xeb, 0x5e, 0xf7, 0x16, 0xfb, 0x3d, 0xfb,
+ 0x37, 0xfb, 0x43, 0xfb, 0x11, 0xfb, 0x6c, 0xfb,
+ 0x7, 0xbd, 0x48, 0xd4, 0x73, 0x1e, 0x69, 0x62,
+ 0x5, 0x93, 0xf7, 0x95, 0x15, 0xf7, 0x3b, 0xf7,
+ 0x22, 0xd4, 0xdb, 0xec, 0xb5, 0x40, 0x3a, 0xfb,
+ 0x13, 0xfb, 0x1c, 0x29, 0x37, 0x47, 0x42, 0xb0,
+ 0xf3, 0x1e, 0xe, 0x8b, 0xe7, 0xf7, 0xe, 0xe7,
+ 0xf7, 0x38, 0xe7, 0x1, 0xf5, 0xed, 0xf7, 0xb8,
+ 0xee, 0x3, 0x8e, 0x16, 0xf7, 0x98, 0x5b, 0xa,
+ 0x3d, 0x6, 0xa4, 0xf7, 0xe, 0x5, 0xdd, 0x6,
+ 0xd2, 0xfb, 0x2, 0x9d, 0x6a, 0x9b, 0x67, 0x95,
+ 0x68, 0x19, 0xf7, 0x22, 0x5b, 0xa, 0x3c, 0x6,
+ 0x2e, 0x97, 0xa, 0xf7, 0xa, 0x9d, 0xc9, 0xdf,
+ 0xe6, 0x1a, 0xe9, 0x3b, 0xb6, 0x26, 0x1e, 0xfb,
+ 0xb5, 0x6, 0x78, 0x2f, 0x8a, 0xa, 0x3b, 0xfc,
+ 0xe, 0x5, 0x37, 0x6, 0xf7, 0x77, 0xf7, 0x6a,
+ 0x15, 0xad, 0xf7, 0x38, 0x5, 0xf7, 0x18, 0x6,
+ 0xa2, 0xc5, 0x83, 0x5b, 0x2c, 0x25, 0x7e, 0x59,
+ 0x1f, 0xe, 0x75, 0xe9, 0xf8, 0x34, 0xe9, 0x12,
+ 0xeb, 0xf6, 0xf7, 0x81, 0xf4, 0x13, 0xe0, 0x82,
+ 0x75, 0x15, 0xf2, 0x6, 0x95, 0xba, 0x5, 0x80,
+ 0x9a, 0xdb, 0x67, 0xd2, 0x1b, 0x13, 0x70, 0xf7,
+ 0x41, 0xf1, 0xc3, 0xf7, 0x1e, 0xf7, 0x3, 0xfb,
+ 0x1c, 0x99, 0x33, 0x9d, 0x1f, 0x4c, 0x98, 0x54,
+ 0xac, 0xb4, 0x1a, 0xc7, 0xca, 0xa5, 0xee, 0xb6,
+ 0xb1, 0x76, 0x7b, 0xac, 0x1e, 0x13, 0xe0, 0x79,
+ 0x33, 0x5, 0xf2, 0x6, 0xb8, 0xf7, 0x6f, 0x5,
+ 0x24, 0x6, 0x85, 0x69, 0x5, 0x9b, 0x69, 0x55,
+ 0x9d, 0x5f, 0x1b, 0xfb, 0x45, 0x2c, 0x41, 0xfb,
+ 0xc, 0x34, 0xf0, 0x4d, 0xea, 0x81, 0x1f, 0xc1,
+ 0x84, 0xe9, 0x81, 0x55, 0x1a, 0x58, 0x4c, 0x68,
+ 0xfb, 0x0, 0x54, 0x5b, 0xa5, 0xa4, 0x61, 0x1e,
+ 0x9a, 0xcf, 0x5, 0x24, 0x6, 0xe, 0x75, 0xe6,
+ 0xf8, 0x2b, 0xe6, 0x1, 0xe4, 0xef, 0xf7, 0x6e,
+ 0xee, 0x3, 0x82, 0x75, 0x15, 0xec, 0x6, 0x95,
+ 0xb9, 0x5, 0x79, 0x9f, 0xbc, 0x6f, 0xd8, 0x1b,
+ 0xf7, 0x3a, 0xeb, 0xcb, 0xf7, 0x3, 0xf7, 0x2,
+ 0x41, 0xa5, 0x31, 0x98, 0x1f, 0x62, 0x90, 0xfb,
+ 0x4, 0x95, 0xcd, 0x1a, 0xb5, 0xcd, 0xbe, 0xe1,
+ 0xb2, 0xae, 0x75, 0x7c, 0xaa, 0x1e, 0x7c, 0x36,
+ 0x96, 0xa, 0xb5, 0xf7, 0x69, 0x7a, 0xa, 0x84,
+ 0x69, 0x5, 0x9a, 0x6b, 0x66, 0x9e, 0x61, 0x1b,
+ 0xfb, 0x36, 0x22, 0x3c, 0xfb, 0x13, 0x31, 0xdb,
+ 0x65, 0xdb, 0x82, 0x1f, 0xbf, 0x86, 0xf5, 0x83,
+ 0x51, 0x1a, 0x59, 0x45, 0x69, 0x35, 0x56, 0x64,
+ 0x99, 0xb0, 0x62, 0x1e, 0x97, 0xcb, 0x7a, 0xa,
+ 0xf7, 0xb1, 0xf8, 0x3c, 0x48, 0xa, 0xa1, 0xf7,
+ 0x57, 0xf7, 0xaa, 0xe2, 0x1, 0xea, 0xf6, 0xf7,
+ 0x7d, 0xf4, 0x3, 0xf7, 0x42, 0x2f, 0x15, 0x8e,
+ 0x96, 0xa0, 0x8f, 0x9e, 0x1b, 0x94, 0x96, 0x84,
+ 0x7f, 0x7e, 0x7c, 0x80, 0x7b, 0x7f, 0x7b, 0x8f,
+ 0x96, 0x7a, 0x1f, 0x59, 0x4c, 0x5, 0x6f, 0xab,
+ 0xa2, 0x89, 0xa2, 0x1b, 0xd1, 0xd1, 0xb9, 0xdc,
+ 0xa4, 0x83, 0xb0, 0x60, 0x95, 0x1f, 0x95, 0xa8,
+ 0x5, 0xf7, 0x30, 0x93, 0xe3, 0xc6, 0xee, 0x1a,
+ 0xf4, 0x3c, 0xa4, 0x2b, 0x97, 0x1e, 0x5f, 0x90,
+ 0xfb, 0xb, 0x94, 0xca, 0x1a, 0xb4, 0xd3, 0xba,
+ 0xe6, 0xb4, 0xb1, 0x76, 0x7d, 0xac, 0x1e, 0x7a,
+ 0x3b, 0x5, 0xf2, 0x6, 0xb9, 0xf7, 0x5e, 0x5,
+ 0x25, 0x6, 0x84, 0x6b, 0x5, 0x99, 0x68, 0x64,
+ 0x9d, 0x5e, 0x1b, 0xfb, 0x40, 0xfb, 0x6, 0x40,
+ 0xfb, 0xc, 0x35, 0xe0, 0x67, 0xe1, 0x82, 0x1f,
+ 0xc2, 0x86, 0xf7, 0x6, 0x83, 0x54, 0x1a, 0x5b,
+ 0x40, 0x6b, 0x2f, 0x53, 0x61, 0x98, 0xae, 0x60,
+ 0x1e, 0x97, 0xc8, 0x5, 0x25, 0x6, 0x5d, 0xfb,
+ 0x58, 0x5, 0xf2, 0x6, 0x96, 0xb6, 0x9c, 0x7e,
+ 0xad, 0x78, 0xc0, 0x83, 0x19, 0xe, 0x3a, 0xa,
+ 0xc6, 0x16, 0xf7, 0xf3, 0x34, 0xa, 0xfb, 0x12,
+ 0x6, 0xd9, 0xf8, 0x10, 0x5, 0xf7, 0x14, 0x6,
+ 0x75, 0xfb, 0x5, 0x56, 0xa, 0xb4, 0xf7, 0x60,
+ 0x5, 0xfc, 0xbb, 0x6, 0x62, 0xfb, 0x60, 0x96,
+ 0xa, 0xa3, 0xf7, 0x5, 0x5, 0xf7, 0x15, 0x6,
+ 0x3d, 0x7d, 0xa, 0xfb, 0x15, 0x6, 0xe, 0x8b,
+ 0xe6, 0xb4, 0xe5, 0xf7, 0x9, 0xe5, 0xb5, 0xe6,
+ 0x1, 0xf7, 0x26, 0xe0, 0xf7, 0xa0, 0xe1, 0x3,
+ 0x99, 0x16, 0xf7, 0xd4, 0x6, 0x9c, 0xe6, 0x5,
+ 0xfb, 0xc, 0x6, 0x92, 0xb4, 0x5, 0xf7, 0x9,
+ 0x6, 0xf7, 0x14, 0xf1, 0xaf, 0xf7, 0x28, 0xe6,
+ 0x45, 0xa1, 0x36, 0x1f, 0xfb, 0x1e, 0x6, 0x92,
+ 0xb5, 0x5, 0xf7, 0xf, 0x6, 0x9b, 0xe6, 0x5,
+ 0xfb, 0xd4, 0x6, 0x7a, 0x30, 0x5, 0xf7, 0x6,
+ 0x6, 0x46, 0x7d, 0xa, 0xfb, 0x7, 0x6, 0xf7,
+ 0x73, 0xf7, 0x17, 0x15, 0xa1, 0xf7, 0x9, 0x5,
+ 0xf7, 0x10, 0x6, 0xaa, 0xcf, 0x8a, 0x60, 0x3c,
+ 0x38, 0x91, 0x6c, 0x1f, 0xe, 0x79, 0xe7, 0xf8,
+ 0x20, 0xe7, 0x1, 0xd6, 0xea, 0xf7, 0x8a, 0xea,
+ 0x3, 0x84, 0xf8, 0x6a, 0x15, 0xdd, 0x6, 0x54,
+ 0xfb, 0xa3, 0x5, 0x87, 0x77, 0x88, 0x79, 0x7a,
+ 0x1a, 0xfb, 0x1, 0x8c, 0xc2, 0x56, 0xf7, 0x12,
+ 0x1b, 0xf7, 0x15, 0xf1, 0xc3, 0xf7, 0x2e, 0xab,
+ 0x1f, 0xc0, 0xf7, 0xaa, 0x5c, 0xa, 0x9d, 0xe7,
+ 0x5, 0xfb, 0xa0, 0x6, 0x78, 0x2f, 0x5, 0xeb,
+ 0x6, 0x57, 0xfb, 0x9b, 0x5, 0x35, 0x7a, 0x6a,
+ 0x5c, 0x25, 0x1b, 0x35, 0x7a, 0xaf, 0xb4, 0x8a,
+ 0x1f, 0x98, 0x8e, 0x98, 0x8d, 0x98, 0x1e, 0xc4,
+ 0xf7, 0xac, 0x5, 0xe9, 0x5b, 0xa, 0xfb, 0xa4,
+ 0x6, 0xe, 0x79, 0xa, 0xf7, 0x7e, 0x77, 0x59,
+ 0xa, 0xf7, 0x61, 0xf8, 0xf0, 0x15, 0xf7, 0xdc,
+ 0xd7, 0x77, 0xf3, 0xfb, 0xd0, 0xfb, 0xd, 0x8f,
+ 0xa, 0xfb, 0x5f, 0x25, 0xa, 0xe, 0x79, 0xa,
+ 0xf7, 0x7a, 0x77, 0x59, 0xa, 0xf7, 0x3a, 0xf8,
+ 0xed, 0x15, 0xf7, 0x41, 0xf5, 0xf7, 0x11, 0x21,
+ 0xcd, 0xaf, 0xfb, 0x15, 0xf7, 0x23, 0x5, 0x2c,
+ 0x6, 0xfb, 0x55, 0xfb, 0x22, 0x5, 0x31, 0xfb,
+ 0x46, 0x25, 0xa, 0xe, 0x79, 0xa, 0xd6, 0xf7,
+ 0xf, 0x59, 0xa, 0xf7, 0xf8, 0xf9, 0x5, 0x15,
+ 0xf7, 0x1, 0x6, 0xa5, 0xf7, 0xf, 0x86, 0xa,
+ 0xfb, 0x62, 0xfb, 0xf, 0x15, 0xf7, 0x2, 0x6,
+ 0xa6, 0xf7, 0xf, 0x86, 0xa, 0xfb, 0x47, 0xfb,
+ 0xb4, 0x25, 0xa, 0xe, 0x79, 0xa, 0x59, 0xa,
+ 0xa2, 0xf8, 0x60, 0x25, 0xa, 0xf7, 0x1a, 0xf7,
+ 0x17, 0x15, 0xf7, 0xbb, 0x3e, 0xb0, 0xc5, 0xfb,
+ 0xa0, 0xf7, 0xe, 0x5, 0xe, 0xf8, 0x6b, 0xe6,
+ 0x1, 0xf7, 0x2b, 0xec, 0xf7, 0x55, 0xe9, 0x3,
+ 0xf7, 0x2b, 0x89, 0x15, 0xec, 0x6, 0xf7, 0xb3,
+ 0xf8, 0x6d, 0x5, 0xd1, 0x34, 0xa, 0xfb, 0x96,
+ 0x36, 0xa, 0xe9, 0x6, 0xfb, 0x6a, 0xfc, 0x0,
+ 0x40, 0xf8, 0x0, 0x5, 0xdc, 0x34, 0xa, 0xfb,
+ 0x95, 0x36, 0xa, 0xd8, 0x6, 0xe, 0xa0, 0x76,
+ 0xf8, 0x5e, 0x77, 0xac, 0xe6, 0x1, 0x93, 0xed,
+ 0x3, 0x84, 0x16, 0xdd, 0x6, 0xf7, 0x49, 0xf7,
+ 0xc6, 0xc3, 0xfb, 0xc6, 0x5, 0xdd, 0x6, 0xf7,
+ 0x39, 0xf8, 0x6b, 0x5, 0xbc, 0x34, 0xa, 0xfb,
+ 0x82, 0x36, 0xa, 0xec, 0x6, 0x2e, 0xfb, 0xab,
+ 0x59, 0xf7, 0x9e, 0x5, 0x47, 0x6, 0xfb, 0x34,
+ 0xfb, 0xa0, 0xa0, 0xf7, 0xad, 0x5, 0xeb, 0x34,
+ 0xa, 0xfb, 0x83, 0x36, 0xa, 0xbd, 0x6, 0xe,
+ 0x3a, 0xa, 0x65, 0x16, 0xf7, 0x97, 0x34, 0xa,
+ 0x3b, 0x6, 0xf7, 0x1b, 0xf7, 0x11, 0xdf, 0xfb,
+ 0x11, 0x5, 0x4c, 0x6e, 0xa, 0xf7, 0x89, 0x34,
+ 0xa, 0x47, 0x6, 0xfb, 0x11, 0xf7, 0x55, 0xf7,
+ 0x4b, 0xf7, 0x4f, 0x5, 0xd1, 0x34, 0xa, 0xfb,
+ 0x76, 0x6e, 0xa, 0xba, 0x6, 0xfb, 0x5, 0xfb,
+ 0xa, 0x4b, 0xf7, 0xa, 0x5, 0xc2, 0x34, 0xa,
+ 0xfb, 0x84, 0x36, 0xa, 0xd2, 0x6, 0xf5, 0xfb,
+ 0x4f, 0xfb, 0x62, 0xfb, 0x55, 0x5, 0x47, 0x6,
+ 0xe, 0x3a, 0xa, 0x9d, 0x16, 0xf7, 0xf0, 0x42,
+ 0xa, 0xfb, 0x10, 0x6, 0xa7, 0xf7, 0x1c, 0xf7,
+ 0x68, 0xf7, 0x88, 0x5, 0xdc, 0x42, 0xa, 0xfb,
+ 0x83, 0x36, 0xa, 0xc3, 0x6, 0xfb, 0x1e, 0xfb,
+ 0x31, 0x41, 0xf7, 0x31, 0x5, 0xc2, 0x34, 0xa,
+ 0xfb, 0x85, 0x4b, 0xa, 0xda, 0x6, 0xf7, 0x3,
+ 0xfb, 0x88, 0x70, 0xfb, 0x1c, 0x5, 0xfb, 0x11,
+ 0x6, 0xe, 0x8b, 0xe5, 0xf8, 0x8, 0xe5, 0x1,
+ 0x9c, 0x16, 0xf7, 0xef, 0x6, 0x9f, 0xe5, 0x5,
+ 0xfb, 0x11, 0x6, 0xa7, 0xf7, 0x19, 0xf7, 0x69,
+ 0xf7, 0x83, 0x5, 0xdc, 0x46, 0xa, 0xfb, 0x84,
+ 0x6, 0x79, 0x31, 0x5, 0xc2, 0x6, 0xfb, 0x1f,
+ 0xfb, 0x2d, 0x43, 0xf7, 0x2d, 0x5, 0xc1, 0x46,
+ 0xa, 0xfb, 0x83, 0x6, 0x79, 0x31, 0x5c, 0xa,
+ 0xf7, 0x5, 0xfb, 0x83, 0x6d, 0xfb, 0x19, 0x5,
+ 0xfb, 0x10, 0x6, 0xf7, 0x3e, 0xf8, 0x97, 0x15,
+ 0xf7, 0xe1, 0xd8, 0x77, 0xf1, 0xfb, 0xd5, 0xfb,
+ 0xc, 0x5, 0xe, 0x8b, 0xe3, 0xf8, 0x1b, 0xe8,
+ 0xe3, 0xf7, 0x15, 0x12, 0xf7, 0x38, 0xeb, 0x3b,
+ 0xf7, 0x2, 0xd1, 0xf7, 0x3, 0x13, 0xf4, 0xa0,
+ 0x16, 0xf7, 0xec, 0x6, 0x9d, 0xe8, 0x5, 0xfb,
+ 0xf, 0x6, 0xa5, 0xf7, 0x14, 0xf7, 0x69, 0xf7,
+ 0x96, 0x5, 0xda, 0x94, 0xa, 0xfb, 0x82, 0x6,
+ 0x79, 0x2e, 0x5, 0xc3, 0x6, 0xfb, 0x20, 0xfb,
+ 0x3d, 0x45, 0xf7, 0x3d, 0x5, 0xc1, 0x6, 0x9d,
+ 0xe8, 0x5, 0xfb, 0x81, 0x82, 0xa, 0xd9, 0x6,
+ 0xf7, 0x1, 0xfb, 0x96, 0x71, 0xfb, 0x14, 0x5,
+ 0xfb, 0x11, 0x6, 0xf7, 0xd5, 0xf8, 0xcb, 0x92,
+ 0xa, 0xa5, 0xf7, 0x15, 0x4c, 0xa, 0x13, 0xec,
+ 0xfb, 0x62, 0xfb, 0x15, 0x15, 0xf7, 0x2, 0x6,
+ 0xa5, 0xf7, 0x15, 0x86, 0xa, 0xe, 0x3a, 0xa,
+ 0xe4, 0xec, 0x3, 0x98, 0x16, 0xf8, 0x74, 0x6,
+ 0xbc, 0xf7, 0x70, 0x66, 0xa, 0x6c, 0xfb, 0x15,
+ 0x5, 0xfb, 0x8e, 0x6, 0xf8, 0x2e, 0xf8, 0x2a,
+ 0x98, 0xcc, 0x5, 0xfc, 0x58, 0x6, 0x5d, 0xfb,
+ 0x61, 0x96, 0xa, 0xa7, 0xf7, 0x6, 0x5, 0xf7,
+ 0x6e, 0x6, 0xfc, 0x28, 0xfc, 0x25, 0x5, 0xe,
+ 0x8b, 0xe4, 0xf8, 0xd, 0xe5, 0x1, 0xd7, 0xea,
+ 0xf7, 0x8d, 0xea, 0x3, 0x8c, 0x16, 0xf8, 0x68,
+ 0x6, 0xb9, 0xf7, 0x6d, 0x5, 0x2c, 0x6, 0x71,
+ 0xfb, 0x14, 0x5, 0xfb, 0x89, 0x6, 0xf8, 0x23,
+ 0xf8, 0x27, 0x99, 0xcb, 0x5, 0xfc, 0x4d, 0x6,
+ 0x5e, 0xfb, 0x5f, 0x5, 0xea, 0x6, 0xa5, 0xf7,
+ 0x5, 0x5, 0xf7, 0x6a, 0x6, 0xfc, 0x20, 0xfc,
+ 0x23, 0x5, 0xf7, 0xbd, 0xf8, 0xb3, 0x15, 0xed,
+ 0x6, 0xf7, 0x50, 0xf7, 0x23, 0x58, 0xaf, 0xfb,
+ 0x42, 0x21, 0xfb, 0x11, 0xf6, 0x46, 0x69, 0x5,
+ 0xe, 0x7c, 0xea, 0x35, 0xea, 0xf5, 0xe9, 0xd0,
+ 0xeb, 0x12, 0xaf, 0xed, 0xf7, 0xbd, 0xed, 0x13,
+ 0x7c, 0xf8, 0x6, 0x85, 0x15, 0xf7, 0x44, 0x6,
+ 0x9e, 0xea, 0x5, 0x3a, 0x6, 0xad, 0xf7, 0x3f,
+ 0x92, 0xa7, 0x90, 0xaa, 0x8a, 0xa7, 0x19, 0xee,
+ 0xfb, 0x1e, 0x93, 0x6f, 0x3d, 0x2c, 0x71, 0x6e,
+ 0x42, 0x1e, 0xa0, 0x3a, 0x5, 0xa2, 0xcb, 0xd6,
+ 0x9c, 0xc9, 0x1b, 0xa2, 0xd0, 0x8a, 0x61, 0x80,
+ 0x89, 0x80, 0x8a, 0x80, 0x1f, 0x8f, 0x67, 0x64,
+ 0x8e, 0x65, 0x1b, 0xfb, 0x8c, 0x6c, 0xfb, 0x25,
+ 0x68, 0x1f, 0x13, 0xbc, 0x4e, 0xbc, 0x4c, 0xf5,
+ 0xdc, 0xb5, 0xa2, 0xae, 0xcc, 0x1e, 0x13, 0x7c,
+ 0xa3, 0xf7, 0x5, 0x15, 0x13, 0xbc, 0x5f, 0x51,
+ 0x48, 0x6b, 0x47, 0x1b, 0x66, 0x64, 0x96, 0xa4,
+ 0xc7, 0xed, 0x9e, 0xbc, 0xc6, 0xb1, 0x85, 0x89,
+ 0xab, 0x1f, 0xe, 0x41, 0xa, 0xf7, 0x75, 0x77,
+ 0x12, 0xa6, 0xeb, 0x13, 0x7c, 0xf7, 0x87, 0xf8,
+ 0x77, 0x15, 0xf7, 0xde, 0xd7, 0x77, 0xf1, 0xfb,
+ 0xd4, 0xfb, 0xd, 0x5, 0xf7, 0xe, 0xfc, 0xb3,
+ 0x21, 0xa, 0x8b, 0xe5, 0xee, 0xe4, 0xcc, 0xe6,
+ 0x1, 0xae, 0xe9, 0xf7, 0x7e, 0xef, 0x3, 0xf7,
+ 0x61, 0xf8, 0x73, 0x15, 0xf7, 0x3f, 0xf4, 0xf7,
+ 0x10, 0x22, 0xcc, 0xae, 0xfb, 0x14, 0xf7, 0x23,
+ 0x66, 0xa, 0xfb, 0x50, 0xfb, 0x22, 0x5, 0xf7,
+ 0x67, 0xfc, 0x9a, 0x22, 0xa, 0x3b, 0xa, 0x1f,
+ 0xa1, 0xf7, 0x1, 0x15, 0x2c, 0xa, 0xf7, 0x35,
+ 0xf7, 0xb2, 0x3, 0xf7, 0x35, 0xf8, 0x90, 0x15,
+ 0xf7, 0xb2, 0xca, 0x7a, 0xe5, 0xfb, 0xaa, 0x23,
+ 0x5, 0xe, 0x41, 0xa, 0xca, 0xf7, 0x12, 0x12,
+ 0xb3, 0xeb, 0x13, 0x7c, 0xf8, 0x35, 0xf8, 0x87,
+ 0x15, 0xf7, 0x8, 0x6, 0xa4, 0xf7, 0x12, 0x5,
+ 0xfb, 0x8, 0x6, 0xfb, 0x6a, 0xfb, 0x12, 0x15,
+ 0xf7, 0x6, 0x6, 0xa6, 0xf7, 0x12, 0x5, 0xfb,
+ 0x9, 0x6, 0xf7, 0x8, 0xfd, 0x8, 0x21, 0xa,
+ 0x7c, 0xea, 0xe0, 0xeb, 0x39, 0xec, 0xde, 0xea,
+ 0x12, 0x13, 0xd0, 0xf7, 0xa4, 0xc5, 0x15, 0x71,
+ 0x97, 0xad, 0x5c, 0xe6, 0x1b, 0xc3, 0xbc, 0x99,
+ 0xa0, 0xc7, 0x1f, 0x7d, 0xe7, 0x5, 0x74, 0x47,
+ 0x64, 0x82, 0x73, 0x1b, 0x36, 0x8b, 0xcb, 0x9e,
+ 0x8e, 0x1f, 0x8c, 0x8d, 0x5, 0xf7, 0x89, 0x6,
+ 0x98, 0xb2, 0x94, 0xb3, 0xb4, 0x1a, 0xde, 0x6c,
+ 0xe1, 0x2b, 0x60, 0x56, 0x78, 0x68, 0x67, 0x1e,
+ 0xb1, 0x77, 0x72, 0x9b, 0x47, 0x1b, 0x42, 0x2d,
+ 0x66, 0x89, 0x86, 0x1f, 0x94, 0x2d, 0x5, 0x9c,
+ 0xba, 0xc0, 0xa0, 0xb7, 0x1b, 0xac, 0x9b, 0x7f,
+ 0x6c, 0x81, 0x8a, 0x80, 0x88, 0x7d, 0x1f, 0x89,
+ 0x81, 0x5, 0x13, 0xb0, 0x8d, 0x72, 0x79, 0x8e,
+ 0x67, 0x1b, 0xfb, 0x14, 0x40, 0x2c, 0x34, 0x1f,
+ 0x4d, 0x8c, 0xb7, 0x5c, 0xd6, 0x1b, 0xd3, 0xc4,
+ 0xba, 0xa5, 0xb1, 0x1f, 0x13, 0xd0, 0xe7, 0xf7,
+ 0x5f, 0x15, 0xc6, 0x9a, 0xba, 0xb2, 0xb4, 0x1b,
+ 0xc5, 0x87, 0x3e, 0x76, 0x89, 0x1f, 0xfb, 0xae,
+ 0xfb, 0x1e, 0x15, 0x6e, 0x6a, 0x63, 0x7d, 0x63,
+ 0x1b, 0x79, 0x78, 0x95, 0xae, 0x1f, 0x13, 0xb0,
+ 0x95, 0x9a, 0xb7, 0xe3, 0x96, 0xab, 0x8a, 0x87,
+ 0x9a, 0x1e, 0xe, 0x41, 0xa, 0xf7, 0x75, 0x77,
+ 0x12, 0xae, 0xeb, 0x13, 0x7c, 0xf7, 0x74, 0xf8,
+ 0xc6, 0x15, 0xf7, 0xc4, 0x3b, 0xb0, 0xc5, 0xfb,
+ 0xa9, 0xf7, 0xd, 0x5, 0xd6, 0xfd, 0x2c, 0x21,
+ 0xa, 0x7c, 0xe9, 0x39, 0xe9, 0xf7, 0x17, 0xe9,
+ 0xf7, 0x18, 0xea, 0x12, 0xad, 0xf2, 0x9b, 0xed,
+ 0x13, 0x7c, 0xf7, 0xda, 0xb0, 0x15, 0xa0, 0x63,
+ 0x5, 0xf7, 0x45, 0x3f, 0xa, 0xfb, 0x19, 0x6,
+ 0x7f, 0xa1, 0xa5, 0xa8, 0x9d, 0xbc, 0xa0, 0xaa,
+ 0x19, 0xdf, 0x3f, 0xa, 0xfb, 0x2a, 0x6, 0x81,
+ 0x74, 0x6c, 0x44, 0x76, 0x71, 0x8, 0x3c, 0xf7,
+ 0x22, 0x73, 0xb3, 0xab, 0x1a, 0xa7, 0xab, 0x94,
+ 0xa9, 0x8c, 0x1e, 0xb9, 0x8c, 0xc3, 0x74, 0x9c,
+ 0x76, 0xd2, 0xd0, 0x18, 0xb1, 0x64, 0x4b, 0xaa,
+ 0x4d, 0x1b, 0x2c, 0x31, 0x4c, 0x34, 0x64, 0xa3,
+ 0x6c, 0x8f, 0x7d, 0x1f, 0x89, 0x7, 0x39, 0x69,
+ 0x4a, 0x3e, 0x34, 0x1a, 0x13, 0xbc, 0x4e, 0xb4,
+ 0x4c, 0xf1, 0xda, 0xb5, 0xad, 0x9d, 0xa7, 0x1e,
+ 0x62, 0xd9, 0x15, 0x74, 0x72, 0x6b, 0x7e, 0x6c,
+ 0x1b, 0x5f, 0x7b, 0xa5, 0xa4, 0xbf, 0xbd, 0xb2,
+ 0xaa, 0x9a, 0x1f, 0xe, 0x41, 0xa, 0xf7, 0x4b,
+ 0x77, 0x12, 0xb3, 0xeb, 0x13, 0x7c, 0xf7, 0xb1,
+ 0xf8, 0xc4, 0x15, 0x5e, 0xb0, 0x68, 0xc0, 0xcd,
+ 0xd0, 0xc0, 0xca, 0xb9, 0x65, 0xaf, 0x55, 0x49,
+ 0x48, 0x54, 0x4c, 0x1e, 0xcf, 0x91, 0x15, 0xa7,
+ 0xa6, 0xa4, 0xa5, 0xa0, 0x9b, 0x7d, 0x79, 0x72,
+ 0x70, 0x75, 0x70, 0x77, 0x7b, 0x96, 0x9a, 0x1e,
+ 0x9a, 0xfc, 0xcd, 0x21, 0xa, 0xf7, 0xa2, 0xcf,
+ 0x1, 0x73, 0xf9, 0x1c, 0x3, 0xf7, 0x3, 0xf7,
+ 0x23, 0x15, 0xc9, 0xbf, 0x48, 0xd7, 0xf8, 0x1,
+ 0x8a, 0x2c, 0x4b, 0x6a, 0xa, 0x4a, 0x5, 0xfb,
+ 0xeb, 0x6, 0xdd, 0xc1, 0x8e, 0xa, 0x9b, 0x76,
+ 0xf8, 0xef, 0x77, 0x1, 0xf7, 0x95, 0x86, 0x15,
+ 0xf7, 0x5f, 0xf7, 0x36, 0x58, 0xc0, 0x38, 0x40,
+ 0xf7, 0xe, 0xf8, 0x5a, 0x44, 0x94, 0xfb, 0xe,
+ 0xfc, 0x5f, 0x5a, 0xd4, 0x49, 0x5c, 0x5, 0xe,
+ 0xf7, 0x99, 0xd1, 0x1, 0x69, 0xf9, 0x26, 0x3,
+ 0xf0, 0xf7, 0x23, 0x15, 0xc9, 0xbf, 0x51, 0xcd,
+ 0x5, 0xf8, 0x9b, 0x6, 0x95, 0xd1, 0x5, 0xfc,
+ 0x96, 0x6, 0xe9, 0xc8, 0x8e, 0xa, 0xf7, 0x9f,
+ 0xd1, 0x1, 0x69, 0xf9, 0x30, 0x3, 0x69, 0xf7,
+ 0x9f, 0x15, 0xf8, 0x96, 0x6, 0x2d, 0x4e, 0x6a,
+ 0xa, 0x49, 0x5, 0xfc, 0x9b, 0x6, 0xe, 0xa1,
+ 0xf8, 0x3b, 0x1, 0xf7, 0x2d, 0xd1, 0x3, 0xf7,
+ 0x2d, 0xa1, 0x15, 0xd1, 0x82, 0xf7, 0xe, 0xf8,
+ 0x5e, 0xbc, 0x42, 0xcd, 0xba, 0xfb, 0x9, 0xf7,
+ 0x3f, 0xfb, 0x5f, 0xfb, 0x37, 0xbe, 0x56, 0xde,
+ 0xd6, 0x5, 0xe, 0xf7, 0x8f, 0xf8, 0x1, 0x1,
+ 0xf7, 0x0, 0xf8, 0xc, 0x3, 0xf7, 0x0, 0xf7,
+ 0x8e, 0x15, 0xd7, 0xb1, 0xd9, 0xdb, 0xca, 0xd8,
+ 0xb5, 0x3a, 0xbf, 0x3f, 0xcc, 0x66, 0x93, 0xcb,
+ 0x18, 0x41, 0xf7, 0x2, 0x6a, 0xc2, 0x78, 0xf7,
+ 0x1c, 0x8, 0x5c, 0x6, 0x5b, 0xfb, 0x15, 0x56,
+ 0x46, 0x25, 0x23, 0x8, 0xe, 0xf7, 0x3a, 0xf2,
+ 0x2c, 0x76, 0xde, 0xf3, 0x9b, 0x77, 0x12, 0xcc,
+ 0xf8, 0x69, 0x13, 0x68, 0xf7, 0xc, 0xf7, 0x2d,
+ 0x15, 0xab, 0xa3, 0xa7, 0xbe, 0xb4, 0x1b, 0x9a,
+ 0xaa, 0x76, 0x7a, 0xae, 0x1f, 0x7f, 0xa3, 0xa5,
+ 0x81, 0xa4, 0x1b, 0xb6, 0xd2, 0xad, 0xdf, 0xbe,
+ 0x1f, 0x13, 0x98, 0x58, 0xc9, 0x5, 0x75, 0x7c,
+ 0x65, 0x54, 0x61, 0x1b, 0x74, 0x73, 0x96, 0x98,
+ 0x73, 0x1f, 0x13, 0x68, 0x9c, 0x6b, 0x6c, 0x9f,
+ 0x71, 0x1b, 0x44, 0x59, 0x48, 0x55, 0x61, 0x1f,
+ 0xe, 0xf7, 0x4e, 0xf0, 0x3, 0xf7, 0x4e, 0xf7,
+ 0x6f, 0x15, 0xf0, 0xf7, 0x7, 0xbd, 0xfb, 0x6,
+ 0xec, 0xc7, 0x52, 0xf3, 0xf7, 0x18, 0xad, 0x7c,
+ 0xee, 0xfb, 0x1d, 0x56, 0xb0, 0xf7, 0x1d, 0x4c,
+ 0xa, 0x78, 0xfb, 0x19, 0xfb, 0xb, 0xbc, 0x55,
+ 0x27, 0xf7, 0x16, 0x6a, 0x20, 0x22, 0x5, 0xe,
+ 0x79, 0xd3, 0xd2, 0xd4, 0xf7, 0x3b, 0xd5, 0xd2,
+ 0xd0, 0x1, 0x91, 0xe1, 0xc6, 0xd2, 0xf7, 0xb4,
+ 0xdb, 0x3, 0xf7, 0xcf, 0xf7, 0x3b, 0x15, 0x6a,
+ 0x9b, 0xad, 0x82, 0x9d, 0x1b, 0xf7, 0x0, 0xee,
+ 0xf7, 0x1c, 0xf7, 0xe, 0xf7, 0x16, 0x25, 0xcd,
+ 0xfb, 0x10, 0xfb, 0x3b, 0xfb, 0x53, 0xfb, 0x22,
+ 0xfb, 0x75, 0x22, 0xb6, 0xfb, 0x11, 0xf7, 0x50,
+ 0xf7, 0x13, 0xdf, 0xc4, 0xa4, 0xb5, 0x1f, 0x7d,
+ 0xcf, 0x5, 0x54, 0x32, 0x47, 0x74, 0x3f, 0x1b,
+ 0xfb, 0xb, 0x6b, 0xdd, 0xd8, 0xe5, 0xd6, 0xf7,
+ 0x63, 0xf7, 0x4b, 0xf2, 0xc4, 0x55, 0x39, 0x3a,
+ 0x54, 0x2c, 0x59, 0x7d, 0x79, 0x91, 0xa3, 0x8f,
+ 0x1f, 0x8c, 0x90, 0x8c, 0x8f, 0x8e, 0x91, 0xe2,
+ 0xf7, 0x48, 0x18, 0x46, 0x6, 0x82, 0x79, 0x5,
+ 0xa3, 0x78, 0x7e, 0x8b, 0x7d, 0x1b, 0x25, 0x2f,
+ 0xfb, 0x1d, 0x30, 0x51, 0xb1, 0x79, 0xa8, 0xac,
+ 0xaf, 0x9c, 0xa4, 0xa7, 0x1f, 0xa8, 0xf7, 0x3a,
+ 0x15, 0x70, 0x85, 0x62, 0xfb, 0x0, 0x4f, 0x1b,
+ 0x80, 0x87, 0x93, 0x97, 0xc5, 0xd1, 0xe4, 0xab,
+ 0xa3, 0x88, 0x74, 0x82, 0x8a, 0x1f, 0xe, 0x41,
+ 0xa, 0xf7, 0x1e, 0x77, 0xdd, 0x77, 0x12, 0x95,
+ 0xeb, 0x13, 0x7e, 0xf7, 0x12, 0xf8, 0x95, 0x15,
+ 0xdb, 0x71, 0x9a, 0x9f, 0x94, 0xa2, 0xa3, 0x98,
+ 0x19, 0xa3, 0x98, 0xa9, 0x7a, 0xaa, 0x79, 0x8,
+ 0x7c, 0xa6, 0xa7, 0x7b, 0xa4, 0x1b, 0xf0, 0xbf,
+ 0xe3, 0xad, 0x9d, 0x1f, 0x39, 0xa3, 0x5, 0x62,
+ 0x70, 0x7d, 0x76, 0x6f, 0x1b, 0x79, 0x79, 0x94,
+ 0x97, 0x78, 0x1f, 0x9c, 0x6f, 0x6f, 0xa1, 0x6b,
+ 0x1b, 0x29, 0x5c, 0x3d, 0x60, 0x72, 0x1f, 0xf7,
+ 0x68, 0xfc, 0x98, 0x22, 0xa, 0x1f, 0x13, 0xbe,
+ 0x3b, 0xa, 0x1e, 0x13, 0x7e, 0xa1, 0xf7, 0x1,
+ 0x15, 0x13, 0xbe, 0x2c, 0xa, 0x7c, 0xe8, 0x3a,
+ 0xe9, 0xf7, 0x9d, 0xe9, 0xdd, 0xe9, 0x12, 0xf8,
+ 0x94, 0xef, 0x13, 0x78, 0x80, 0x88, 0x15, 0xf7,
+ 0x47, 0x6, 0x94, 0xbb, 0x5, 0x13, 0xb8, 0x70,
+ 0xad, 0xb2, 0x6a, 0xd7, 0x1b, 0xf7, 0x5a, 0xe3,
+ 0xf7, 0x18, 0xf7, 0x1e, 0xf3, 0x42, 0xe6, 0xfb,
+ 0x14, 0x53, 0x54, 0x84, 0x69, 0x5b, 0x1f, 0xb8,
+ 0xf7, 0x6d, 0x5, 0xfb, 0x49, 0x44, 0xa, 0xdd,
+ 0x6, 0x13, 0x78, 0x32, 0xfc, 0x4d, 0x5, 0x3a,
+ 0x6, 0xf7, 0x5b, 0xef, 0x15, 0xe6, 0xc7, 0xd5,
+ 0xf7, 0xd, 0xe8, 0xa9, 0x48, 0x58, 0x1e, 0x13,
+ 0xb8, 0x35, 0x2d, 0x41, 0x34, 0x63, 0x38, 0xa5,
+ 0xe2, 0x1e, 0xe, 0xfb, 0x1d, 0xf9, 0x8f, 0x1,
+ 0xf7, 0x37, 0xf7, 0xa5, 0x3, 0xf7, 0xfe, 0xfb,
+ 0x1d, 0x15, 0xd5, 0xa8, 0xfb, 0x5b, 0xf9, 0x72,
+ 0x41, 0x6e, 0x5, 0xe, 0xfb, 0x73, 0x76, 0xfa,
+ 0x7c, 0x77, 0x1, 0xf7, 0x1a, 0xe3, 0x3, 0xf7,
+ 0x1a, 0xfb, 0x88, 0x15, 0xe3, 0x6, 0xf7, 0x88,
+ 0xfa, 0x7c, 0x5, 0x33, 0x6, 0xe, 0xf7, 0x34,
+ 0xdc, 0x3, 0xd5, 0xf7, 0x71, 0x15, 0xdc, 0x7f,
+ 0x95, 0x60, 0x61, 0x1a, 0x85, 0x80, 0x45, 0x74,
+ 0xfb, 0x19, 0x1e, 0x83, 0x5c, 0x97, 0x52, 0xbd,
+ 0x76, 0x8, 0x79, 0xb6, 0xc7, 0x8b, 0xbc, 0x1b,
+ 0x9d, 0xe8, 0x5, 0x64, 0x63, 0x8b, 0x95, 0x6b,
+ 0x1f, 0x76, 0x92, 0x89, 0xa4, 0x8f, 0xa2, 0x9e,
+ 0xf7, 0x9, 0x95, 0xcb, 0x8c, 0x96, 0x8, 0x8c,
+ 0x97, 0x8b, 0x93, 0x90, 0x1a, 0xb3, 0x74, 0xc3,
+ 0x63, 0xa5, 0x1e, 0xd0, 0xae, 0xbd, 0xdd, 0x98,
+ 0xd3, 0xa7, 0xf7, 0x28, 0x18, 0x8f, 0xa2, 0x96,
+ 0xa5, 0xa3, 0x91, 0x8, 0x95, 0xb2, 0xaf, 0x8b,
+ 0xb2, 0x1b, 0x9e, 0xe8, 0x5, 0x5a, 0x51, 0x8b,
+ 0x79, 0x57, 0x1f, 0x52, 0x77, 0x67, 0x51, 0x83,
+ 0x5c, 0x75, 0xfb, 0x9, 0x18, 0x76, 0xfb, 0x0,
+ 0x77, 0x4a, 0xfb, 0x3, 0x7b, 0x8, 0xe, 0xf8,
+ 0x2, 0xda, 0x3, 0xd5, 0xfb, 0x78, 0x15, 0xbc,
+ 0xc5, 0x8b, 0x9d, 0xbf, 0x1f, 0xc4, 0x9f, 0xaf,
+ 0xc5, 0x93, 0xba, 0xa1, 0xf7, 0x9, 0x18, 0xa0,
+ 0xf7, 0x0, 0x9f, 0xcc, 0xf7, 0x3, 0x9b, 0x9c,
+ 0xe9, 0x18, 0x3a, 0x97, 0x81, 0xb6, 0xb5, 0x1a,
+ 0x91, 0x96, 0xd1, 0xa2, 0xf7, 0x19, 0x1e, 0x93,
+ 0xba, 0x7f, 0xc4, 0x59, 0xa0, 0x8, 0x9d, 0x60,
+ 0x4f, 0x8b, 0x5a, 0x1b, 0x79, 0x2e, 0x5, 0xb2,
+ 0xb3, 0x8b, 0x81, 0xab, 0x1f, 0xa0, 0x84, 0x8d,
+ 0x72, 0x87, 0x74, 0x78, 0xfb, 0x9, 0x81, 0x4b,
+ 0x8a, 0x7f, 0x8, 0x8a, 0x80, 0x8b, 0x83, 0x86,
+ 0x1a, 0x63, 0xa2, 0x53, 0xb3, 0x71, 0x1e, 0x46,
+ 0x68, 0x59, 0x39, 0x7e, 0x43, 0x6f, 0xfb, 0x28,
+ 0x18, 0x87, 0x74, 0x80, 0x71, 0x73, 0x85, 0x8,
+ 0x81, 0x64, 0x67, 0x8b, 0x64, 0x1b, 0xe, 0x25,
+ 0xe7, 0xf8, 0xaa, 0xe7, 0x1, 0xf7, 0x0, 0x25,
+ 0x15, 0xf7, 0x7c, 0x6, 0x9f, 0xe7, 0x5, 0xfb,
+ 0x1b, 0x6, 0xf7, 0x5, 0xf8, 0xaa, 0x5, 0xf7,
+ 0x1a, 0x5b, 0xa, 0xfb, 0x7c, 0x6, 0xe, 0x25,
+ 0xe7, 0xf8, 0xaa, 0xe7, 0x1, 0xf7, 0x13, 0x81,
+ 0x15, 0x78, 0x2f, 0x5, 0xf7, 0x7b, 0x6, 0xf7,
+ 0x2c, 0xf9, 0x62, 0x5, 0xfb, 0x7c, 0x6, 0x77,
+ 0x2f, 0x5, 0xf7, 0x1b, 0x6, 0xfb, 0x6, 0xfc,
+ 0xaa, 0x5, 0xe, 0xf8, 0x68, 0xd5, 0x1, 0xdf,
+ 0xf9, 0xb, 0x15, 0x44, 0xb7, 0x2f, 0xf7, 0x22,
+ 0xf7, 0x31, 0xd3, 0xf7, 0x5, 0xbd, 0x9d, 0x1e,
+ 0x2f, 0x6, 0x3d, 0x64, 0x41, 0x80, 0x70, 0x1b,
+ 0x3c, 0x71, 0xc0, 0xaf, 0x8a, 0x1f, 0xe, 0xfb,
+ 0x2e, 0x76, 0xf9, 0xe6, 0x77, 0x1, 0xf7, 0x39,
+ 0xc6, 0xf7, 0x2c, 0xc6, 0x3, 0xf7, 0xac, 0xf7,
+ 0xb0, 0x15, 0xc6, 0x6, 0xeb, 0xf8, 0x1b, 0x5,
+ 0x50, 0x6, 0xfb, 0x67, 0xfd, 0xe6, 0x15, 0xc6,
+ 0x6, 0xed, 0xf8, 0x1a, 0x5, 0x50, 0x6, 0xe,
+ 0xf7, 0x18, 0xf7, 0xbe, 0x1, 0xf7, 0x1d, 0xf7,
+ 0xd9, 0x3, 0xf7, 0x1d, 0xf7, 0x8c, 0x15, 0x48,
+ 0xbf, 0x5a, 0xd8, 0xed, 0xed, 0xdb, 0xeb, 0xd1,
+ 0x57, 0xbf, 0x3c, 0x23, 0x31, 0x38, 0x28, 0x1e,
+ 0xe, 0x7c, 0xea, 0xf7, 0xb0, 0xea, 0x1, 0xae,
+ 0xf2, 0x3, 0xf8, 0x89, 0xf7, 0x2e, 0x15, 0x62,
+ 0x46, 0x4c, 0x6a, 0x38, 0x1b, 0x3e, 0x44, 0xb0,
+ 0xd5, 0xee, 0xe5, 0xd5, 0xf7, 0xd, 0xb3, 0xb3,
+ 0x80, 0x7c, 0xab, 0x1f, 0x77, 0x30, 0x5, 0xef,
+ 0x6, 0xb7, 0xf7, 0x68, 0x7b, 0xa, 0x86, 0x78,
+ 0x5, 0x98, 0x69, 0x65, 0x91, 0x62, 0x1b, 0xfb,
+ 0x64, 0xfb, 0x11, 0xfb, 0x27, 0xfb, 0x20, 0xfb,
+ 0xc, 0xf4, 0x48, 0xf7, 0xa, 0xf0, 0xf0, 0xb3,
+ 0xc3, 0xdf, 0x1f, 0xe, 0xf7, 0x79, 0xe6, 0x3,
+ 0xf7, 0x79, 0xf8, 0x81, 0x15, 0xe6, 0x6, 0xf7,
+ 0x45, 0xf7, 0x1e, 0x5b, 0xaf, 0xfb, 0x36, 0x25,
+ 0xfb, 0xc, 0xf1, 0x4b, 0x68, 0x5, 0xe, 0xfb,
+ 0x4d, 0x76, 0xf7, 0x58, 0xe8, 0xf7, 0xae, 0xe9,
+ 0x1, 0xa4, 0xf1, 0x3, 0xf7, 0x23, 0xfb, 0x46,
+ 0x15, 0x7b, 0x9e, 0xa6, 0x7f, 0xac, 0x1b, 0xd3,
+ 0xc0, 0xc2, 0xc5, 0xa5, 0x85, 0xac, 0x62, 0x95,
+ 0x1f, 0x8f, 0x9c, 0xdd, 0x98, 0xda, 0xad, 0xcf,
+ 0xb7, 0x19, 0x60, 0xd4, 0x5, 0x61, 0x46, 0x4c,
+ 0x6b, 0x38, 0x1b, 0x3f, 0x43, 0xaf, 0xd2, 0xee,
+ 0xe4, 0xd7, 0xf7, 0xe, 0xb5, 0xb2, 0x81, 0x7b,
+ 0xaa, 0x1f, 0x77, 0x31, 0x5, 0xef, 0x6, 0xb8,
+ 0xf7, 0x66, 0x5, 0x27, 0x6, 0x87, 0x78, 0x5,
+ 0x98, 0x69, 0x64, 0x91, 0x62, 0x1b, 0xfb, 0x62,
+ 0xfb, 0x12, 0xfb, 0x26, 0xfb, 0x1d, 0xfb, 0x4,
+ 0xe4, 0x4a, 0xf6, 0x82, 0x1f, 0x70, 0x31, 0x5,
+ 0x8c, 0x95, 0x9f, 0x91, 0x9c, 0x1b, 0x96, 0x95,
+ 0x87, 0x7d, 0x7c, 0x79, 0x83, 0x79, 0x7b, 0x7b,
+ 0x91, 0x93, 0x83, 0x1f, 0xe, 0xfb, 0x62, 0xd1,
+ 0xb4, 0xea, 0x1, 0xf7, 0xae, 0xd9, 0x3, 0xf7,
+ 0x5d, 0xfb, 0x46, 0x15, 0x79, 0xa1, 0xa3, 0x81,
+ 0xa9, 0x1b, 0xce, 0xc2, 0xc0, 0xca, 0xb8, 0x6b,
+ 0x9a, 0x80, 0x8f, 0x1f, 0x8f, 0xa5, 0x5, 0x3d,
+ 0x6, 0x6b, 0x24, 0x5, 0x8d, 0x94, 0xa4, 0x91,
+ 0x9c, 0x1b, 0x95, 0x92, 0x86, 0x81, 0x78, 0x78,
+ 0x84, 0x75, 0x7e, 0x7f, 0x91, 0x93, 0x84, 0x1f,
+ 0xe, 0x6f, 0x76, 0xf7, 0xfd, 0xf7, 0x4e, 0xf7,
+ 0x8, 0x77, 0x1, 0xc5, 0xf0, 0x3, 0xf7, 0x43,
+ 0x5a, 0x15, 0xed, 0x6, 0xa5, 0xf7, 0x1d, 0xd1,
+ 0x95, 0xcc, 0xa4, 0xca, 0xb2, 0x19, 0x6c, 0xd3,
+ 0x5, 0x60, 0x37, 0x5b, 0x72, 0x49, 0x1b, 0x33,
+ 0x76, 0xc1, 0xb0, 0xd6, 0xd2, 0xd3, 0xe6, 0xaf,
+ 0xae, 0x80, 0x7c, 0xa8, 0x1f, 0x7c, 0x49, 0x96,
+ 0xa, 0xb1, 0xf7, 0x4e, 0x7a, 0xa, 0x85, 0x6c,
+ 0x78, 0x91, 0x76, 0x90, 0x78, 0x8e, 0x19, 0xa6,
+ 0xf7, 0x19, 0x66, 0xa, 0x70, 0xfb, 0x18, 0x5,
+ 0xfb, 0x23, 0x6c, 0x39, 0x2b, 0xfb, 0x9, 0x1a,
+ 0xfb, 0x0, 0xf2, 0x6e, 0xb5, 0x7f, 0x1e, 0xe,
+ 0xf7, 0xaf, 0xe7, 0x3, 0xf7, 0x2d, 0xf8, 0x77,
+ 0x15, 0xf7, 0x37, 0xf2, 0xf7, 0xa, 0x24, 0xca,
+ 0xad, 0xfb, 0xe, 0x97, 0xa, 0x2f, 0x6, 0xfb,
+ 0x48, 0xfb, 0x1f, 0x5, 0xe, 0x7c, 0xf7, 0x41,
+ 0xe9, 0xf7, 0x41, 0x1, 0xf7, 0x6f, 0xf7, 0xd4,
+ 0x15, 0x6e, 0xa3, 0x64, 0xd0, 0xcf, 0xc3, 0xbc,
+ 0xc8, 0xac, 0x6c, 0xa9, 0x51, 0x48, 0x4e, 0x56,
+ 0x57, 0x1e, 0x53, 0xfb, 0x9e, 0x15, 0x6e, 0xa4,
+ 0x63, 0xd0, 0xc8, 0xbf, 0xb3, 0xb9, 0x96, 0x1e,
+ 0x8c, 0x90, 0x8b, 0x91, 0x90, 0x1a, 0xaf, 0x70,
+ 0xae, 0x4c, 0x4a, 0x4b, 0x58, 0x56, 0x1e, 0xe,
+ 0xfb, 0x3, 0xf7, 0xb5, 0x1, 0xf7, 0x1a, 0xf7,
+ 0x13, 0xac, 0xf7, 0x3f, 0x3, 0xf7, 0x1a, 0xfb,
+ 0x3, 0x15, 0xf7, 0x13, 0x6, 0xf7, 0x60, 0xf7,
+ 0xb5, 0x5, 0xfb, 0x3f, 0x6, 0xe, 0x79, 0xb8,
+ 0xe9, 0xb9, 0xf7, 0x8c, 0xb9, 0xd5, 0xb8, 0x1,
+ 0x84, 0xb9, 0xf7, 0x2, 0xb9, 0xf8, 0x1, 0xba,
+ 0x3, 0x84, 0xf7, 0x6d, 0x15, 0xfb, 0x18, 0xf6,
+ 0x24, 0xf7, 0x21, 0xf7, 0x78, 0xf7, 0x1e, 0xf7,
+ 0x44, 0xf7, 0x48, 0xf7, 0x1d, 0x25, 0xf4, 0xfb,
+ 0x24, 0xfb, 0x4d, 0xfb, 0x4b, 0xfb, 0x1c, 0xfb,
+ 0x77, 0x1e, 0xb9, 0x9c, 0x15, 0xf7, 0x35, 0xf7,
+ 0x2f, 0xf7, 0x20, 0xf7, 0x30, 0xf7, 0x13, 0xde,
+ 0x30, 0xfb, 0xc, 0xfb, 0x32, 0xfb, 0x28, 0xfb,
+ 0x1f, 0xfb, 0x35, 0xfb, 0x11, 0x34, 0xe5, 0xf7,
+ 0x9, 0x1e, 0xf7, 0xfd, 0x77, 0x15, 0x72, 0x6f,
+ 0x62, 0x75, 0x63, 0x1b, 0x4e, 0x69, 0xb8, 0xc3,
+ 0x8a, 0x1f, 0xd6, 0xd4, 0xd3, 0xd2, 0xae, 0xaf,
+ 0x7a, 0x76, 0x9d, 0x1e, 0xae, 0xab, 0x5, 0xa9,
+ 0x72, 0x61, 0xa1, 0x5d, 0x1b, 0x2b, 0x22, 0x36,
+ 0xfb, 0x9, 0x42, 0xbb, 0x4a, 0xe4, 0xcc, 0xc7,
+ 0xaf, 0x9e, 0x9f, 0x1f, 0xe, 0xce, 0xe4, 0x35,
+ 0x76, 0xf7, 0xfd, 0xe3, 0x9e, 0x77, 0x12, 0xd7,
+ 0xe7, 0xf7, 0x9e, 0xe7, 0x13, 0x6c, 0x9c, 0xf5,
+ 0x15, 0xbe, 0x52, 0xd2, 0xc4, 0x5, 0x13, 0xac,
+ 0x6f, 0xac, 0xb7, 0x80, 0xb9, 0x1b, 0xb8, 0xba,
+ 0x9a, 0xa4, 0xaf, 0x1f, 0x13, 0x5c, 0xbe, 0x51,
+ 0xd2, 0xc6, 0x58, 0xc5, 0x5, 0xb2, 0xb2, 0xa5,
+ 0xc7, 0xc4, 0x1a, 0xa7, 0x86, 0xa7, 0x7f, 0xa3,
+ 0x1e, 0xd5, 0xc5, 0x5e, 0xc4, 0x40, 0x50, 0x5,
+ 0x13, 0xac, 0xa7, 0x6b, 0x5f, 0x97, 0x5e, 0x1b,
+ 0x5c, 0x5a, 0x7d, 0x73, 0x67, 0x1f, 0x13, 0x9c,
+ 0x5a, 0xc4, 0x43, 0x50, 0xbd, 0x51, 0x5, 0x67,
+ 0x63, 0x70, 0x51, 0x53, 0x1a, 0x6e, 0x8f, 0x70,
+ 0x98, 0x72, 0x1e, 0xd6, 0xec, 0x15, 0x13, 0xac,
+ 0xda, 0xdc, 0xd0, 0xd8, 0xcb, 0xb7, 0x5d, 0x50,
+ 0x3b, 0x3a, 0x46, 0x3d, 0x4b, 0x60, 0xb9, 0xc7,
+ 0x1e, 0xe, 0x7c, 0xe9, 0x39, 0xe9, 0xf7, 0x7f,
+ 0xe9, 0xf7, 0x4, 0xe9, 0x12, 0x9d, 0xef, 0x13,
+ 0x78, 0xf8, 0xe, 0x88, 0x15, 0xf7, 0x46, 0x3f,
+ 0xa, 0x3c, 0x6, 0xf4, 0xf8, 0xab, 0x5, 0xfb,
+ 0x73, 0x87, 0xa, 0xf7, 0x11, 0x6, 0x70, 0xfb,
+ 0x1c, 0x5, 0xac, 0x6a, 0x53, 0x91, 0x53, 0x1b,
+ 0xfb, 0x32, 0xfb, 0x1d, 0xfb, 0x16, 0xfb, 0x24,
+ 0x1f, 0x13, 0xb8, 0x24, 0xde, 0x42, 0xf7, 0x13,
+ 0xc1, 0xc6, 0xa5, 0xab, 0xba, 0x1e, 0x13, 0x78,
+ 0xfb, 0xa2, 0xf7, 0x20, 0x15, 0xe6, 0xe3, 0xce,
+ 0xea, 0xd9, 0xba, 0x68, 0x52, 0x1e, 0x13, 0xb8,
+ 0xfb, 0x18, 0xfb, 0x1e, 0x65, 0x5f, 0x44, 0x54,
+ 0xb1, 0xcd, 0x1e, 0xe, 0xf7, 0xcf, 0xed, 0xf7,
+ 0x3b, 0x77, 0x1, 0xf7, 0x3a, 0xee, 0x3, 0xf7,
+ 0x3a, 0x45, 0x15, 0xee, 0x6, 0xd6, 0xf8, 0x15,
+ 0x5, 0xf7, 0x26, 0x6, 0x9e, 0xed, 0x5, 0xfb,
+ 0x26, 0x6, 0xad, 0xf7, 0x3b, 0x7b, 0xa, 0x69,
+ 0xfb, 0x3b, 0x5, 0xfb, 0x26, 0x6, 0x78, 0x29,
+ 0x5, 0xf7, 0x25, 0x6, 0xe, 0xf7, 0x4, 0xee,
+ 0xf7, 0x9, 0xec, 0xf7, 0x2f, 0x77, 0x1, 0xf7,
+ 0x4b, 0xf0, 0x3, 0xcf, 0xf7, 0xe, 0x15, 0xf7,
+ 0x2e, 0x6, 0x64, 0xfb, 0x54, 0x5, 0xf0, 0x6,
+ 0xaf, 0xf7, 0x54, 0x70, 0xa, 0x9f, 0xee, 0x85,
+ 0xa, 0xa3, 0xf6, 0x70, 0xa, 0x9f, 0xec, 0x85,
+ 0xa, 0xa9, 0xf7, 0x2f, 0x66, 0xa, 0x68, 0xfb,
+ 0x2f, 0x5, 0xfb, 0x2a, 0x6, 0x77, 0x2a, 0x5,
+ 0xf7, 0x2a, 0x6, 0x77, 0x20, 0x5, 0xfb, 0x2e,
+ 0x6, 0xe, 0xf7, 0x87, 0xe6, 0xf7, 0x53, 0xe6,
+ 0x1, 0xf1, 0xed, 0xf7, 0x5e, 0xeb, 0x3, 0xf1,
+ 0xf8, 0x15, 0x15, 0x39, 0xcf, 0x4f, 0xe8, 0xf7,
+ 0x21, 0xe9, 0xf4, 0xf7, 0xd, 0xe2, 0x4a, 0xc7,
+ 0x2d, 0xfb, 0xa, 0xfb, 0xb, 0x2d, 0xfb, 0x1d,
+ 0x1e, 0xed, 0xa1, 0x15, 0xcc, 0xc1, 0xc0, 0xcd,
+ 0xbf, 0xa9, 0x6a, 0x5e, 0x4e, 0x51, 0x57, 0x4d,
+ 0x5a, 0x6a, 0xab, 0xb4, 0x1e, 0xe, 0xf8, 0x79,
+ 0xf7, 0x20, 0x1, 0xf7, 0x12, 0xf7, 0xe, 0xd8,
+ 0xf7, 0xf, 0x3, 0xf7, 0xd9, 0xf8, 0x79, 0x15,
+ 0xf7, 0xf, 0x6, 0xa5, 0x97, 0xa, 0xfb, 0xe,
+ 0x6, 0xfb, 0x76, 0xfb, 0x20, 0x15, 0xf7, 0xe,
+ 0x6, 0xa6, 0x97, 0xa, 0xfb, 0xf, 0x6, 0xe,
+ 0x9b, 0xf7, 0x2b, 0xaf, 0xf7, 0x2, 0xaf, 0xf7,
+ 0x2b, 0x12, 0xf7, 0x57, 0xf7, 0x23, 0x4d, 0xf7,
+ 0x23, 0x14, 0xe0, 0x13, 0xe8, 0xf7, 0xa8, 0xf8,
+ 0x29, 0x4f, 0xa, 0xfb, 0x6d, 0xfb, 0x5e, 0x73,
+ 0xa, 0x13, 0xf0, 0xf7, 0x9, 0xfb, 0x85, 0x4f,
+ 0xa, 0xe, 0x22, 0x76, 0xf7, 0x8, 0xf7, 0x4a,
+ 0xf7, 0x75, 0xf7, 0x49, 0x20, 0xe9, 0x2d, 0xf7,
+ 0x57, 0x12, 0xf7, 0x4, 0xf5, 0xf7, 0x4e, 0xf0,
+ 0x13, 0xce, 0xa8, 0x81, 0x15, 0xf0, 0x6, 0x93,
+ 0xbe, 0x5, 0x7b, 0x9c, 0xa4, 0x85, 0xa0, 0x1b,
+ 0x6e, 0xfb, 0x25, 0x5, 0xf0, 0x6, 0xa9, 0xf7,
+ 0x24, 0x5, 0xd5, 0x8c, 0xf7, 0x14, 0xbb, 0xf7,
+ 0x1f, 0x1a, 0xda, 0x31, 0xa1, 0x31, 0xa5, 0x1e,
+ 0x68, 0x94, 0x43, 0x9f, 0xb1, 0x1a, 0xcf, 0xe0,
+ 0x8e, 0xb1, 0xb0, 0xa5, 0x82, 0x71, 0xb1, 0x1e,
+ 0x13, 0xe6, 0x83, 0x64, 0x5, 0xee, 0x6, 0xb1,
+ 0xf7, 0x49, 0x5, 0x27, 0x6, 0x83, 0x62, 0x80,
+ 0x9e, 0x79, 0x90, 0x79, 0x8e, 0x19, 0x13, 0xce,
+ 0xa1, 0xf1, 0x5, 0x24, 0x6, 0x13, 0xd6, 0x77,
+ 0x26, 0x5, 0x3c, 0x8a, 0xfb, 0x10, 0x54, 0xfb,
+ 0x11, 0x1a, 0x8a, 0x3c, 0xd7, 0x6c, 0xf3, 0x6d,
+ 0x8, 0xb1, 0x81, 0xd6, 0x82, 0x56, 0x1a, 0x56,
+ 0xfb, 0x6, 0x86, 0x6f, 0x65, 0x69, 0x93, 0xa2,
+ 0x6c, 0x1e, 0x93, 0xa6, 0x5, 0x26, 0x6, 0xe,
+ 0xf8, 0x79, 0xf7, 0x20, 0x1, 0xf7, 0x78, 0xf7,
+ 0x9, 0x3, 0xf7, 0x78, 0xf8, 0x79, 0x15, 0xf7,
+ 0x9, 0x6, 0xa6, 0x97, 0xa, 0xfb, 0x9, 0x6,
+ 0xe, 0x7f, 0xa, 0xcd, 0xf8, 0x55, 0x3, 0xcd,
+ 0x16, 0xf8, 0x55, 0x6, 0x9e, 0xe9, 0x3e, 0xa,
+ 0xd1, 0xf7, 0xed, 0x5, 0xfb, 0x80, 0x6f, 0xa,
+ 0xf7, 0x1e, 0x6, 0x58, 0xfb, 0x8f, 0x43, 0xa,
+ 0x7c, 0xea, 0xe0, 0xeb, 0xec, 0xeb, 0x1, 0xf8,
+ 0x65, 0xea, 0x3, 0xf7, 0x26, 0xf7, 0x48, 0x15,
+ 0xf8, 0x23, 0x6, 0x91, 0xa0, 0x94, 0xb5, 0xa8,
+ 0x1a, 0xf4, 0x34, 0xd8, 0xfb, 0xc, 0xfb, 0x1a,
+ 0xfb, 0x49, 0x35, 0xfb, 0x5c, 0x26, 0xdb, 0x39,
+ 0xf7, 0x30, 0xe7, 0xe7, 0xab, 0xb2, 0xda, 0x1e,
+ 0x6d, 0xda, 0x5, 0x66, 0x44, 0x49, 0x79, 0x3e,
+ 0x1b, 0xfb, 0x11, 0x74, 0xbd, 0xae, 0x8c, 0x1f,
+ 0xa7, 0xeb, 0x15, 0xd1, 0xaa, 0xd9, 0xa6, 0xc7,
+ 0x1b, 0xcb, 0xc4, 0x6c, 0x49, 0x8c, 0x1f, 0xe,
+ 0x5f, 0xa, 0xf7, 0x82, 0xf8, 0x76, 0x15, 0xf7,
+ 0xd9, 0xd9, 0x77, 0xf0, 0xfb, 0xcf, 0xfb, 0xc,
+ 0x5, 0x34, 0xfc, 0x13, 0x32, 0xa, 0x61, 0xa,
+ 0xf7, 0x73, 0x77, 0x76, 0xa, 0xf7, 0x5c, 0xf8,
+ 0x73, 0x15, 0xf7, 0x40, 0xf4, 0xf7, 0x11, 0x22,
+ 0xcc, 0xad, 0xfb, 0x14, 0xf7, 0x24, 0x66, 0xa,
+ 0xfb, 0x52, 0xfb, 0x23, 0x5, 0x85, 0xfb, 0xf8,
+ 0x35, 0xa, 0xfb, 0x49, 0x93, 0xa, 0xd2, 0x31,
+ 0xa, 0x61, 0xa, 0xce, 0xf7, 0x10, 0x76, 0xa,
+ 0xf8, 0x25, 0xf8, 0x89, 0x6d, 0xa, 0xa5, 0xf7,
+ 0x10, 0x83, 0xa, 0xfb, 0x66, 0xfb, 0x10, 0x5a,
+ 0xa, 0xa4, 0xf7, 0x10, 0x65, 0xa, 0x28, 0xfc,
+ 0x67, 0x32, 0xa, 0x5f, 0xa, 0xf7, 0x6e, 0xf8,
+ 0xc3, 0x15, 0xf7, 0xc3, 0x3e, 0xaf, 0xc5, 0xfb,
+ 0xa7, 0xf7, 0xd, 0x5, 0xfb, 0x21, 0xfc, 0x8b,
+ 0x35, 0xa, 0xfb, 0x4a, 0x93, 0xa, 0xd3, 0x3c,
+ 0xf7, 0x2a, 0xea, 0xd9, 0xa0, 0xb5, 0xdd, 0x1f,
+ 0x81, 0xdc, 0x2f, 0xa, 0x7c, 0xe7, 0xf7, 0x49,
+ 0xea, 0xf7, 0x3e, 0xe8, 0x12, 0xc2, 0xf0, 0x6e,
+ 0xed, 0xf7, 0x45, 0xeb, 0x56, 0xee, 0x13, 0xf4,
+ 0xf7, 0x47, 0xf7, 0xc9, 0x15, 0x46, 0x62, 0x54,
+ 0x49, 0x3d, 0x1a, 0x2c, 0xf0, 0x5f, 0xe3, 0xf7,
+ 0x3d, 0xdf, 0xf7, 0x6, 0xe3, 0x8c, 0x1e, 0x8c,
+ 0xbe, 0x7b, 0xb3, 0x60, 0xab, 0x8, 0x13, 0xea,
+ 0xc9, 0xb0, 0xb5, 0xc7, 0xd4, 0x1a, 0xdb, 0x45,
+ 0xc3, 0x23, 0xfb, 0x1c, 0x20, 0x29, 0x25, 0x61,
+ 0x9c, 0x67, 0xae, 0x6e, 0x1e, 0xb9, 0xf7, 0x0,
+ 0x15, 0xc5, 0xc1, 0xbb, 0xd2, 0xd5, 0xa1, 0x67,
+ 0x6a, 0x8a, 0x1e, 0x4b, 0x47, 0x66, 0x51, 0x58,
+ 0x60, 0xa3, 0xb3, 0x1e, 0x13, 0xf4, 0x46, 0xfb,
+ 0x9b, 0x15, 0xc8, 0xd4, 0xb6, 0xcf, 0xd2, 0xaa,
+ 0x6c, 0x67, 0x8e, 0x1e, 0x46, 0x42, 0x5e, 0x4e,
+ 0x48, 0x5e, 0xaf, 0xb4, 0x1e, 0xe, 0x7c, 0xf7,
+ 0x17, 0x1, 0xa3, 0xf7, 0x21, 0xca, 0xf7, 0x21,
+ 0xcc, 0xf7, 0x21, 0x3, 0xa3, 0xaf, 0x15, 0x60,
+ 0xa, 0xa7, 0x7a, 0xa5, 0x63, 0x54, 0x6e, 0x5f,
+ 0x67, 0x1e, 0xf8, 0x2e, 0x50, 0xa, 0xfb, 0x62,
+ 0x50, 0xa, 0xe, 0xf7, 0x5f, 0xef, 0x1, 0x75,
+ 0xf9, 0x5, 0x3, 0x75, 0xf7, 0x5f, 0x15, 0xf9,
+ 0x5, 0x6, 0x9e, 0xef, 0x5, 0xfd, 0x5, 0x6,
+ 0xe, 0xf7, 0x5f, 0xef, 0x1, 0xc0, 0xf8, 0x6f,
+ 0x3, 0xc0, 0xf7, 0x5f, 0x15, 0xf8, 0x6f, 0x6,
+ 0x9e, 0xef, 0x5, 0xfc, 0x6f, 0x6, 0xe, 0xf7,
+ 0xa, 0xf2, 0xd5, 0xf2, 0x1, 0xb4, 0xf8, 0x64,
+ 0x3, 0xd6, 0xf7, 0xbb, 0x15, 0xf8, 0x65, 0x6,
+ 0x9e, 0xf2, 0x5, 0xfc, 0x64, 0x6, 0x55, 0xfb,
+ 0xac, 0x15, 0xf8, 0x64, 0x6, 0x9f, 0xf2, 0x5,
+ 0xfc, 0x65, 0x6, 0xe, 0x70, 0xe2, 0xf7, 0x95,
+ 0xe1, 0x91, 0xa, 0x9b, 0xf7, 0x0, 0xf7, 0xed,
+ 0xf7, 0x7, 0x3, 0xf7, 0x80, 0xf8, 0x42, 0x15,
+ 0xf7, 0x1d, 0xc1, 0xd0, 0x62, 0xa8, 0x4a, 0x8c,
+ 0x87, 0x19, 0x9d, 0x6d, 0x78, 0x96, 0x44, 0x1b,
+ 0xfb, 0x5c, 0xfb, 0x1c, 0xfb, 0x1, 0xfb, 0x2c,
+ 0x31, 0xd5, 0x3c, 0xf7, 0x35, 0xf7, 0x80, 0xec,
+ 0xf7, 0x2c, 0xf7, 0x41, 0xf7, 0x10, 0x39, 0xd4,
+ 0x63, 0xa5, 0x1f, 0xf7, 0xb, 0xbf, 0x74, 0xc0,
+ 0xfb, 0x2d, 0x46, 0x6c, 0x9d, 0x3f, 0xa7, 0x60,
+ 0x93, 0x19, 0x4f, 0x58, 0xb1, 0x84, 0xbc, 0x77,
+ 0xac, 0x7d, 0x19, 0x22, 0x5d, 0x5, 0x35, 0xfb,
+ 0xd0, 0x15, 0xf7, 0x0, 0xf7, 0x7, 0xbf, 0xe4,
+ 0xf2, 0xb1, 0x58, 0x55, 0x23, 0xfb, 0x7, 0x5b,
+ 0x39, 0x3e, 0x44, 0xa8, 0xcf, 0x1e, 0xe, 0x7c,
+ 0xf7, 0x2e, 0xf8, 0x45, 0x77, 0x1, 0xf7, 0x34,
+ 0xf7, 0x5d, 0x3, 0xf7, 0x80, 0xf7, 0x48, 0x15,
+ 0xee, 0x6, 0xf3, 0xf8, 0x1c, 0x5, 0xfb, 0x1e,
+ 0x6, 0xfb, 0x21, 0xfc, 0xa1, 0x15, 0x5f, 0xbf,
+ 0x79, 0xac, 0xc9, 0xc1, 0xb2, 0xc3, 0xab, 0x6b,
+ 0xa6, 0x56, 0x43, 0x5f, 0x5b, 0x5f, 0x1e, 0xe,
+ 0xfb, 0x11, 0x76, 0xf8, 0x4b, 0xf7, 0x30, 0x1,
+ 0xf7, 0x83, 0xf7, 0x5d, 0x3, 0xf7, 0x83, 0xf7,
+ 0xf9, 0x15, 0x69, 0xa9, 0x6d, 0xc0, 0xd4, 0xb8,
+ 0xb1, 0xc0, 0xbb, 0x57, 0x9c, 0x6a, 0x4e, 0x54,
+ 0x66, 0x54, 0x1e, 0x3c, 0xfc, 0x8b, 0x15, 0xf7,
+ 0x1f, 0x6, 0xcb, 0xf8, 0x22, 0x7b, 0xa, 0xe,
+ 0x8b, 0xe9, 0xf7, 0x90, 0xe8, 0xea, 0xe6, 0x1,
+ 0xf7, 0x87, 0xf3, 0x3, 0xb6, 0x16, 0xf8, 0x49,
+ 0x55, 0xa, 0xfb, 0x77, 0x6, 0xc0, 0xf7, 0x90,
+ 0x5, 0xf7, 0x78, 0x89, 0xa, 0xfb, 0x77, 0x6,
+ 0xd5, 0x9c, 0x93, 0xa0, 0xdb, 0x1b, 0xbc, 0xc0,
+ 0x82, 0x83, 0xb8, 0x1f, 0xb1, 0xe8, 0x3e, 0x95,
+ 0x52, 0x91, 0x5c, 0x8a, 0x19, 0x58, 0x8a, 0x65,
+ 0x83, 0x66, 0x78, 0x55, 0x6d, 0x7c, 0x5a, 0x80,
+ 0x58, 0x84, 0x6f, 0x18, 0x21, 0x6, 0x77, 0x2e,
+ 0x5, 0xf5, 0x6, 0x55, 0xfb, 0x90, 0x5, 0x21,
+ 0x6, 0xe, 0xf8, 0x75, 0xf8, 0x74, 0x15, 0xf5,
+ 0x6, 0xa8, 0xf7, 0x26, 0x5, 0x21, 0x6, 0xfb,
+ 0x68, 0xfd, 0x6, 0x15, 0xf7, 0xb4, 0x37, 0xa,
+ 0x29, 0x6, 0xcc, 0xf7, 0xd8, 0x5, 0xfb, 0x48,
+ 0x3c, 0xa, 0xe1, 0x6, 0x5e, 0xfb, 0x7e, 0x66,
+ 0xa, 0xfb, 0xe0, 0x31, 0x15, 0xf7, 0xb6, 0x37,
+ 0xa, 0x28, 0x6, 0xb9, 0xf7, 0x7e, 0x5, 0xee,
+ 0x37, 0xa, 0x28, 0x6, 0x99, 0xc9, 0x99, 0xc2,
+ 0xe1, 0x7c, 0xad, 0x88, 0x19, 0xab, 0xe5, 0xfb,
+ 0x2, 0x90, 0xfb, 0xe, 0x88, 0x6d, 0xfb, 0x1e,
+ 0x19, 0x7f, 0x56, 0x5, 0x29, 0x3c, 0xa, 0xed,
+ 0x6, 0x5e, 0xfb, 0x7e, 0x4e, 0xa, 0xe, 0x7c,
+ 0xe7, 0xf7, 0x7e, 0xe7, 0xf4, 0xe8, 0x1, 0xf8,
+ 0x37, 0xef, 0x3, 0xa7, 0xaf, 0x15, 0x7d, 0xad,
+ 0xe6, 0x66, 0xe3, 0x1b, 0xf7, 0x43, 0xf2, 0xf7,
+ 0xe, 0xf7, 0x17, 0xde, 0x55, 0xdd, 0xfb, 0x10,
+ 0x6a, 0x5c, 0x85, 0x77, 0x75, 0x1f, 0xa6, 0xf7,
+ 0x17, 0x5, 0xf7, 0xb3, 0x94, 0xa, 0xfc, 0x15,
+ 0x6, 0x4b, 0xfb, 0xd8, 0xcd, 0x71, 0x5, 0xc7,
+ 0xbb, 0xb4, 0x8b, 0xa6, 0x1b, 0xcb, 0xbd, 0x61,
+ 0x52, 0x3f, 0x4b, 0x50, 0x2d, 0x49, 0x4f, 0x9d,
+ 0xa1, 0x53, 0x1f, 0xe, 0x8b, 0xe8, 0xf7, 0x86,
+ 0xe9, 0xef, 0xe8, 0x8f, 0x77, 0x12, 0x13, 0xd0,
+ 0xf7, 0xbf, 0x16, 0xf7, 0xb8, 0x94, 0xa, 0x27,
+ 0x6, 0xf5, 0xf8, 0xa9, 0x5, 0xfb, 0x1b, 0x82,
+ 0xa, 0xb5, 0x6, 0x34, 0xfc, 0x4c, 0x7b, 0xa,
+ 0xfb, 0xe1, 0x2e, 0x15, 0xf7, 0xb9, 0x6, 0x9d,
+ 0xe8, 0x5, 0x27, 0x6, 0xbc, 0xf7, 0x86, 0x5,
+ 0xee, 0x6, 0x9d, 0xe9, 0x5, 0x27, 0x6, 0x9a,
+ 0xc2, 0x5, 0x13, 0xe0, 0x97, 0xc3, 0xe9, 0x7e,
+ 0xad, 0x8d, 0xaa, 0xe8, 0x18, 0xfb, 0x16, 0x8e,
+ 0xfb, 0x0, 0x8a, 0x6e, 0xfb, 0x22, 0x80, 0x56,
+ 0x18, 0x27, 0x44, 0xa, 0xef, 0x6, 0x5b, 0xfb,
+ 0x86, 0x7b, 0xa, 0xe, 0xfb, 0x17, 0xea, 0xf8,
+ 0x6, 0xea, 0xe8, 0xe9, 0x1, 0xf7, 0xc3, 0xee,
+ 0x3, 0x8d, 0x6d, 0x15, 0x3b, 0x2e, 0x5, 0x88,
+ 0xa7, 0xc0, 0x86, 0xbd, 0x1b, 0xdc, 0xe8, 0xa8,
+ 0xf1, 0xb3, 0x1f, 0xf7, 0x1b, 0xf7, 0xe2, 0x5,
+ 0xf7, 0x3, 0x6, 0xb1, 0xea, 0x65, 0xa, 0xd0,
+ 0xaa, 0xa3, 0xa3, 0xc2, 0x1b, 0xa4, 0xaa, 0x87,
+ 0x88, 0xa0, 0x1f, 0xc1, 0xe9, 0x5, 0x90, 0x5e,
+ 0x8b, 0x8d, 0x65, 0x1b, 0xfb, 0x10, 0x43, 0x5c,
+ 0x22, 0x5f, 0x1f, 0x7b, 0x68, 0x5, 0x20, 0x6,
+ 0x64, 0x2c, 0x5, 0xf7, 0x1, 0x6, 0xfb, 0x5,
+ 0xfb, 0xae, 0x5, 0x3e, 0x6d, 0x74, 0x80, 0x50,
+ 0x1b, 0x71, 0x70, 0x8f, 0x8d, 0x74, 0x1f, 0xe,
+ 0x8b, 0xe8, 0xd6, 0xe8, 0xf7, 0xf7, 0x77, 0x1,
+ 0xf7, 0xd0, 0xef, 0x3, 0xc9, 0xf7, 0x3c, 0x15,
+ 0xf7, 0xa4, 0x6, 0x79, 0x40, 0x5, 0xfb, 0x0,
+ 0x82, 0xa, 0xf7, 0xbd, 0x89, 0xa, 0x31, 0x6,
+ 0x9c, 0xd6, 0x5, 0xe0, 0x89, 0xa, 0x35, 0x6,
+ 0xd4, 0xf7, 0xf7, 0x5, 0xfb, 0x0, 0x6, 0xfb,
+ 0xe5, 0xfc, 0x4, 0x5, 0xf7, 0x6, 0x98, 0x15,
+ 0xf7, 0x62, 0xf7, 0x7d, 0x5b, 0xfb, 0x7d, 0x5,
+ 0xe, 0x61, 0xf9, 0x41, 0x3, 0x61, 0x83, 0x15,
+ 0xc8, 0x57, 0xf9, 0x4, 0xf9, 0x34, 0x4b, 0xbc,
+ 0x5, 0xe, 0xfb, 0x26, 0xe5, 0xea, 0xe3, 0xf7,
+ 0x6f, 0xe4, 0x45, 0xe4, 0x12, 0xb1, 0xed, 0x13,
+ 0xe8, 0xb8, 0x73, 0x15, 0x62, 0x31, 0x5, 0x79,
+ 0xdb, 0xd0, 0x7d, 0xd5, 0x1b, 0xf7, 0x50, 0xb4,
+ 0xe7, 0xf2, 0xa0, 0x1f, 0xc9, 0xf7, 0xbd, 0x5c,
+ 0xa, 0x9e, 0xe4, 0x5, 0xfb, 0x3d, 0x6, 0x83,
+ 0x6b, 0x5, 0x13, 0xd8, 0xa8, 0x6a, 0x5f, 0xa1,
+ 0x58, 0x1b, 0xfb, 0x2e, 0xfb, 0x1f, 0xfb, 0x0,
+ 0xfb, 0x1b, 0x27, 0xd6, 0x43, 0xf7, 0x14, 0xbe,
+ 0xc0, 0x8e, 0xa9, 0xb8, 0x1f, 0x2c, 0x77, 0x81,
+ 0x6a, 0xfb, 0x9, 0x1b, 0x41, 0x33, 0xa0, 0x96,
+ 0x67, 0x1f, 0xe6, 0xf7, 0x8e, 0x15, 0xdb, 0xe1,
+ 0xc6, 0xe1, 0xd4, 0xb9, 0x60, 0x4e, 0x8a, 0x1e,
+ 0x33, 0x41, 0x5d, 0x2c, 0x4a, 0x53, 0xb2, 0xc7,
+ 0x1e, 0xe, 0xfb, 0x26, 0xde, 0xe3, 0xdc, 0xf7,
+ 0x70, 0xdd, 0x1, 0x9d, 0xed, 0x3, 0xa4, 0x6a,
+ 0x15, 0x62, 0x38, 0x5, 0x7a, 0xdb, 0xd0, 0x7e,
+ 0xd5, 0x1b, 0xf7, 0x50, 0xb4, 0xe0, 0xea, 0xa0,
+ 0x1f, 0xc9, 0xf7, 0xae, 0x5c, 0xa, 0x9e, 0xdd,
+ 0x5, 0xfb, 0x3d, 0x6, 0x83, 0x66, 0x5, 0xa6,
+ 0x6a, 0x5f, 0x9f, 0x58, 0x1b, 0xfb, 0x2e, 0xfb,
+ 0x1f, 0x27, 0xfb, 0x10, 0x2e, 0xd6, 0x49, 0xf7,
+ 0x14, 0xbe, 0xc0, 0x8e, 0xa6, 0xb8, 0x1f, 0x34,
+ 0x77, 0x81, 0x6c, 0xfb, 0x9, 0x1b, 0x41, 0x33,
+ 0x9e, 0x96, 0x67, 0x1f, 0xe6, 0xf7, 0x7a, 0x15,
+ 0xd5, 0xe1, 0xc2, 0xe1, 0xd4, 0xb9, 0x63, 0x53,
+ 0x8a, 0x1e, 0x39, 0x41, 0x61, 0x2c, 0x4a, 0x53,
+ 0xaf, 0xc2, 0x1e, 0xf7, 0x65, 0xf7, 0xb5, 0x15,
+ 0xee, 0x6, 0xf7, 0x54, 0xf7, 0x24, 0x57, 0xaf,
+ 0xfb, 0x46, 0x5e, 0xa, 0x7c, 0xe9, 0x39, 0xe9,
+ 0xf7, 0x90, 0xe9, 0xf5, 0xde, 0x12, 0xf7, 0xb1,
+ 0xed, 0xf7, 0xe, 0xed, 0x13, 0x7c, 0x88, 0x88,
+ 0x15, 0xf7, 0x45, 0x6, 0xe6, 0xf8, 0x56, 0x5,
+ 0xdf, 0x9b, 0xad, 0x97, 0xdd, 0x1b, 0xbe, 0xb7,
+ 0x82, 0x6a, 0x6b, 0x40, 0x77, 0x74, 0x86, 0x1f,
+ 0x4d, 0x7d, 0x5c, 0x56, 0x46, 0x1a, 0x4f, 0xc9,
+ 0x74, 0xcb, 0x73, 0x1e, 0xaa, 0x80, 0xca, 0x81,
+ 0x6f, 0x1a, 0x13, 0xbc, 0x69, 0x4d, 0x64, 0x4d,
+ 0x66, 0x62, 0x9d, 0x97, 0x70, 0x1e, 0x46, 0x46,
+ 0x5, 0x67, 0xc2, 0xb0, 0x78, 0xc2, 0x1b, 0xf7,
+ 0x1f, 0xf7, 0x2, 0xda, 0xf6, 0xca, 0x46, 0xa4,
+ 0x4c, 0xa0, 0x1f, 0x71, 0x93, 0x4d, 0x99, 0xad,
+ 0x1a, 0xa3, 0xbc, 0x9e, 0xa7, 0x94, 0x1e, 0xcd,
+ 0xa0, 0xc9, 0xa1, 0xd3, 0x1a, 0xd6, 0x77, 0xbb,
+ 0xfb, 0x3f, 0xfb, 0x2f, 0x5c, 0x55, 0xfb, 0x5,
+ 0x74, 0x1e, 0x86, 0x75, 0x5, 0x3b, 0x6f, 0xa,
+ 0xdd, 0x6, 0x13, 0x7c, 0x59, 0xfb, 0x90, 0x5,
+ 0x38, 0x6, 0xe, 0xf7, 0x4c, 0xf7, 0x7b, 0x3,
+ 0xf7, 0x4c, 0xf8, 0xcf, 0x15, 0xf7, 0x63, 0x4c,
+ 0xa3, 0xbc, 0xfb, 0x50, 0xf3, 0x5, 0xe, 0xaf,
+ 0x76, 0xf8, 0x7a, 0x77, 0x1, 0xc1, 0x9a, 0x15,
+ 0xf8, 0x6b, 0xf7, 0x4b, 0xa0, 0xf7, 0xa, 0xfc,
+ 0x25, 0xf7, 0x4d, 0x7a, 0x2d, 0xf7, 0xd1, 0xfb,
+ 0x2a, 0xfc, 0xa, 0xfb, 0x28, 0x5, 0xe, 0xd1,
+ 0xc5, 0xf7, 0x96, 0xc7, 0x1, 0xc5, 0xf7, 0x5,
+ 0xf7, 0x2, 0xf7, 0x5, 0x3, 0xc5, 0xf7, 0x9b,
+ 0x51, 0xa, 0x9c, 0xfb, 0x4b, 0x51, 0xa, 0xe,
+ 0xe6, 0x76, 0xf8, 0xc, 0x77, 0x1, 0xf7, 0x86,
+ 0xf7, 0xa, 0xd0, 0xf7, 0x5, 0x3, 0xc5, 0xf7,
+ 0x19, 0x15, 0xaf, 0x4c, 0xf7, 0x9e, 0xf7, 0x4e,
+ 0xfb, 0x5e, 0xf7, 0x52, 0x53, 0x4d, 0xf7, 0x20,
+ 0xfb, 0x13, 0x5, 0x9a, 0xfb, 0x10, 0x15, 0xae,
+ 0x4c, 0xf7, 0x8e, 0xf7, 0x4e, 0xfb, 0x4c, 0xf7,
+ 0x52, 0x53, 0x4d, 0xf7, 0x13, 0xfb, 0x13, 0x5,
+ 0xe, 0xd1, 0xf8, 0xc, 0x1, 0xf7, 0x12, 0xf7,
+ 0xbd, 0x3, 0xf7, 0x12, 0xf7, 0x97, 0x15, 0xf7,
+ 0x7f, 0xfb, 0x51, 0xc9, 0xbf, 0xfb, 0x3f, 0xf7,
+ 0x1c, 0xf7, 0x72, 0xf7, 0x11, 0x65, 0xca, 0x5,
+ 0xe, 0xd1, 0xf8, 0xc, 0x1, 0xf7, 0x12, 0xf7,
+ 0x18, 0x15, 0xb2, 0x4d, 0xf7, 0xc9, 0xf7, 0x51,
+ 0xfb, 0x7a, 0xf7, 0x4f, 0x4b, 0x56, 0xf7, 0x3d,
+ 0xfb, 0x12, 0x5, 0xe, 0x81, 0xa, 0xf1, 0xec,
+ 0x3, 0x8d, 0x16, 0xf7, 0x94, 0x55, 0xa, 0x3c,
+ 0x6, 0xb2, 0xf7, 0x57, 0x5, 0xbc, 0xdc, 0xc4,
+ 0x94, 0xa7, 0x1b, 0xb1, 0x9f, 0x7b, 0x76, 0x82,
+ 0x89, 0x81, 0x89, 0x81, 0x1f, 0x66, 0xfb, 0x4f,
+ 0x5, 0x3b, 0x6f, 0xa, 0xf7, 0x96, 0x3f, 0xa,
+ 0x3a, 0x6, 0xaf, 0xf7, 0x48, 0x5, 0x8f, 0x9c,
+ 0x8f, 0x9d, 0x9d, 0x1a, 0xc5, 0x77, 0xc2, 0xfb,
+ 0x8, 0x4f, 0x57, 0x76, 0x71, 0x55, 0x1e, 0xbb,
+ 0xf7, 0x7d, 0x5, 0xfb, 0x46, 0x44, 0xa, 0xdd,
+ 0x6, 0x31, 0xfc, 0x4a, 0x5, 0x3a, 0x6, 0xe,
+ 0xf8, 0x7c, 0xf7, 0x41, 0x1, 0xba, 0xc2, 0xf7,
+ 0x34, 0xc2, 0x3, 0xf7, 0x9a, 0xf8, 0x8f, 0x15,
+ 0xc2, 0x78, 0xf7, 0x80, 0xf7, 0x23, 0x31, 0xa9,
+ 0x5, 0xfc, 0x34, 0xfb, 0x2e, 0x15, 0xc2, 0x78,
+ 0xf7, 0x82, 0xf7, 0x23, 0x31, 0xa9, 0x5, 0xe,
+ 0xf7, 0x5f, 0xf7, 0x2, 0x1, 0xe3, 0xf8, 0x25,
+ 0x3, 0xe3, 0xf7, 0x5f, 0x15, 0xf8, 0x25, 0x6,
+ 0xa2, 0xf7, 0x2, 0x5, 0xfc, 0x25, 0x6, 0xe,
+ 0x8b, 0xea, 0xf7, 0x93, 0xea, 0xc9, 0xf7, 0x2b,
+ 0x1, 0xf7, 0xf3, 0xf7, 0x4, 0x3, 0xf7, 0xd4,
+ 0x69, 0xa, 0xfb, 0xbb, 0xfd, 0x26, 0x15, 0xf8,
+ 0x54, 0x6, 0x9f, 0xea, 0x8f, 0xa, 0x6, 0xd1,
+ 0xf7, 0xf2, 0x5, 0xfb, 0x7f, 0x6, 0x77, 0x2c,
+ 0x5, 0xf7, 0x1d, 0x6, 0x59, 0xfb, 0x93, 0x5,
+ 0xfb, 0x44, 0x6, 0xe, 0x78, 0xa, 0x91, 0xa,
+ 0xf7, 0x7e, 0xf8, 0x77, 0x15, 0xf7, 0xdf, 0xd8,
+ 0x78, 0xf0, 0xfb, 0xd6, 0xfb, 0xc, 0x5, 0xfb,
+ 0x48, 0xfc, 0xb1, 0x2e, 0xa, 0x78, 0xa, 0xf7,
+ 0x6f, 0x77, 0x1, 0xf7, 0x5f, 0xf8, 0x74, 0x15,
+ 0xf7, 0x37, 0xf3, 0xf7, 0x9, 0x23, 0xc8, 0xae,
+ 0xfb, 0xc, 0xf7, 0x22, 0x5, 0x30, 0x6, 0xfb,
+ 0x48, 0xfb, 0x21, 0x5, 0xfb, 0x1, 0xfc, 0x98,
+ 0x2e, 0xa, 0x78, 0xa, 0xc9, 0xf7, 0x11, 0x1,
+ 0xf8, 0x27, 0xf8, 0x89, 0x15, 0xf7, 0x1, 0x89,
+ 0xa4, 0xf7, 0x12, 0x86, 0xa, 0xfb, 0x5e, 0xfb,
+ 0x10, 0x15, 0xf7, 0x0, 0x6, 0xa4, 0xf7, 0x10,
+ 0x5, 0xfb, 0x1, 0x6, 0xfb, 0x61, 0xfd, 0x5,
+ 0x2e, 0xa, 0x78, 0xa, 0x91, 0xa, 0xf7, 0x73,
+ 0xf8, 0xc4, 0x15, 0xf7, 0xaa, 0x3e, 0xac, 0xc5,
+ 0xfb, 0x90, 0xf7, 0xc, 0x5, 0xfb, 0x82, 0xfd,
+ 0x29, 0x2e, 0xa, 0xfb, 0x26, 0xea, 0xf8, 0x35,
+ 0xe6, 0xbd, 0xf7, 0x2b, 0xfb, 0x25, 0xf7, 0x25,
+ 0x12, 0x13, 0xe0, 0xf7, 0x20, 0x69, 0xa, 0xfb,
+ 0x61, 0xfd, 0x59, 0x15, 0x77, 0x2c, 0x5, 0xf7,
+ 0x82, 0x6, 0x9f, 0xea, 0x5, 0x41, 0x6, 0xf7,
+ 0x2, 0xf8, 0x84, 0x5, 0xfb, 0x39, 0x6, 0x77,
+ 0x2c, 0x5, 0xce, 0x6, 0x31, 0xfc, 0x25, 0x5,
+ 0x13, 0xd0, 0xf8, 0x69, 0xf8, 0xc8, 0x15, 0xf7,
+ 0xc, 0x6, 0xac, 0xf7, 0x25, 0x5, 0xfb, 0xd,
+ 0x6, 0xfb, 0xa1, 0xfd, 0x4a, 0x15, 0x5e, 0x30,
+ 0x5, 0x86, 0x9a, 0xa4, 0x7d, 0xc5, 0x1b, 0xf7,
+ 0x4b, 0x9e, 0x8b, 0xa, 0xfb, 0x67, 0x6e, 0xa,
+ 0xf4, 0x6, 0x44, 0xfb, 0xce, 0x5, 0x45, 0x7b,
+ 0x6c, 0x66, 0x61, 0x1b, 0x57, 0x7f, 0x9a, 0x8f,
+ 0x81, 0x1f, 0xe, 0xfb, 0x26, 0xe6, 0xf8, 0x39,
+ 0xe6, 0xc3, 0xf7, 0x25, 0x1, 0xf7, 0xc5, 0xf4,
+ 0x3, 0xf8, 0xf, 0xf8, 0x95, 0x15, 0xf7, 0xb,
+ 0x6, 0xac, 0xf7, 0x25, 0x5, 0xfb, 0xc, 0x6,
+ 0xfc, 0xe, 0xfd, 0x4a, 0x15, 0x5e, 0x30, 0x5,
+ 0x82, 0xc1, 0xc2, 0x81, 0xc5, 0x1b, 0xf7, 0x66,
+ 0xab, 0x8b, 0xa, 0xfc, 0x7, 0x6e, 0xa, 0xf7,
+ 0x9d, 0x6, 0x44, 0xfb, 0xce, 0x5, 0x45, 0x7b,
+ 0x6a, 0x66, 0x3b, 0x1b, 0x57, 0x5d, 0x93, 0x96,
+ 0x5e, 0x1f, 0xe, 0x8b, 0xe9, 0x1, 0xe9, 0xd9,
+ 0xf7, 0x15, 0xf7, 0x91, 0x3, 0x87, 0x16, 0xf7,
+ 0x44, 0x6, 0xae, 0xf7, 0x3d, 0xb2, 0xa3, 0xb1,
+ 0x72, 0xae, 0x68, 0xa7, 0x64, 0x19, 0x6f, 0x87,
+ 0xa, 0xf7, 0x91, 0x6, 0x9d, 0xe9, 0x5, 0x21,
+ 0x6, 0x6a, 0xbd, 0x44, 0xcc, 0x68, 0xac, 0xf7,
+ 0x2a, 0xf2, 0x18, 0xf7, 0x0, 0x55, 0xa, 0xfb,
+ 0xa3, 0x6f, 0xa, 0x9f, 0x6, 0x20, 0x43, 0xd3,
+ 0xf7, 0xf5, 0x5, 0xfb, 0x44, 0x6f, 0xa, 0xdb,
+ 0x6, 0x32, 0xfc, 0x4a, 0x5, 0x3c, 0x6, 0xe,
+ 0x81, 0xa, 0xf7, 0x98, 0xee, 0x3, 0xcd, 0x16,
+ 0xf8, 0x54, 0x6, 0x9f, 0xe9, 0x3e, 0xa, 0xf7,
+ 0x1, 0xf8, 0xa8, 0x5, 0xfb, 0x94, 0x87, 0xa,
+ 0xf7, 0x30, 0x6, 0x31, 0xfc, 0x4a, 0x8f, 0xa,
+ 0x6, 0xe, 0xaf, 0x76, 0xf8, 0x7a, 0x77, 0x1,
+ 0xc1, 0xf7, 0x5c, 0x15, 0xf8, 0x25, 0xfb, 0x4d,
+ 0x9c, 0xe9, 0xfb, 0xd1, 0xf7, 0x2a, 0xf8, 0x9,
+ 0xf7, 0x28, 0x9c, 0xe9, 0xfc, 0x6a, 0xfb, 0x4b,
+ 0x5, 0xe, 0x84, 0x76, 0xb0, 0x76, 0xf7, 0x46,
+ 0xde, 0xce, 0xde, 0xf7, 0xb, 0xe8, 0x12, 0xf7,
+ 0x3f, 0xea, 0x13, 0xbc, 0x52, 0xa, 0x13, 0x7c,
+ 0x3d, 0xa, 0x7c, 0x7f, 0x88, 0x83, 0x7f, 0x1f,
+ 0x9c, 0x9a, 0xa8, 0xbe, 0x89, 0x8e, 0x8, 0xf7,
+ 0x47, 0x6, 0x9f, 0xde, 0x5, 0xfb, 0x3e, 0x6,
+ 0x89, 0x92, 0x91, 0xa8, 0x8a, 0xaa, 0x8, 0xf7,
+ 0x27, 0x6, 0x9f, 0xde, 0x5, 0xfb, 0x3a, 0x92,
+ 0x6, 0xcb, 0xab, 0x47, 0xa, 0x3f, 0x3e, 0xfb,
+ 0x10, 0x1f, 0x80, 0x3b, 0x7, 0x78, 0x38, 0x5,
+ 0xeb, 0x6, 0x6c, 0x83, 0x6e, 0x8c, 0x84, 0x1e,
+ 0x27, 0x6, 0x78, 0x38, 0x5, 0xe8, 0x6, 0x8c,
+ 0x6f, 0x67, 0x56, 0x43, 0x5a, 0x8, 0xe, 0xf7,
+ 0xc0, 0xf7, 0x5, 0x1, 0xf8, 0x18, 0xee, 0x3,
+ 0xc6, 0xf7, 0xc0, 0x15, 0xf7, 0xff, 0x6, 0x69,
+ 0xfb, 0x59, 0x5, 0xee, 0x6, 0xc1, 0xf7, 0xca,
+ 0x5, 0xfc, 0x63, 0x6, 0xe, 0x81, 0xa, 0xf7,
+ 0x91, 0xf4, 0x3, 0xbc, 0x16, 0xf8, 0x6d, 0x55,
+ 0xa, 0xfb, 0x4c, 0x6, 0xbb, 0xf7, 0x73, 0xf7,
+ 0x16, 0xaa, 0x99, 0xcd, 0xfb, 0x15, 0x6b, 0xc0,
+ 0xf7, 0x88, 0x5, 0xfb, 0xae, 0x6, 0x76, 0x2d,
+ 0x5, 0xf7, 0x46, 0x6, 0x64, 0xfb, 0x45, 0xfb,
+ 0x18, 0x6a, 0x7e, 0x4a, 0xf7, 0x17, 0xab, 0x60,
+ 0xfb, 0x57, 0x5, 0xfb, 0x4b, 0x6, 0xe, 0x8b,
+ 0xea, 0xf7, 0x90, 0xea, 0x1, 0xd4, 0xdd, 0xf5,
+ 0xee, 0x3, 0x76, 0x16, 0xf7, 0x8a, 0x6, 0x9c,
+ 0xea, 0x5, 0x34, 0x6, 0xb6, 0xf7, 0x7b, 0x5,
+ 0x9c, 0xa0, 0xb0, 0x9b, 0xa1, 0x1b, 0xaa, 0x96,
+ 0x77, 0x78, 0x86, 0x8b, 0x87, 0x8a, 0x87, 0x1f,
+ 0x51, 0xfb, 0xc7, 0x5, 0xf7, 0x35, 0x6, 0x9b,
+ 0xea, 0x5, 0x3d, 0x6, 0xb6, 0xf7, 0x73, 0x5,
+ 0xab, 0xa7, 0xae, 0x94, 0x9b, 0x1b, 0xad, 0x97,
+ 0x6f, 0x81, 0x89, 0x1f, 0x4f, 0xfb, 0xd5, 0x5,
+ 0xf7, 0x1f, 0x6, 0x9b, 0xea, 0x5, 0x53, 0x6,
+ 0xb7, 0xf7, 0x72, 0x5, 0x8d, 0x95, 0x8c, 0x96,
+ 0x94, 0x1a, 0xc9, 0x65, 0xb8, 0x46, 0x62, 0x5f,
+ 0x79, 0x6c, 0x6a, 0x1e, 0xb5, 0x7b, 0x66, 0x92,
+ 0x75, 0x1b, 0x6c, 0x6c, 0x7f, 0x73, 0x73, 0x1f,
+ 0x8e, 0xa3, 0x5, 0xfb, 0x3b, 0x6, 0x79, 0x2c,
+ 0x5c, 0xa, 0x5a, 0xfb, 0x90, 0x5, 0x3d, 0x6,
+ 0xe, 0xf8, 0x8d, 0xdb, 0x1, 0xda, 0xf8, 0x3b,
+ 0x3, 0xda, 0xf8, 0x8d, 0x15, 0xf8, 0x3b, 0x6,
+ 0x9d, 0xdb, 0x5, 0xfc, 0x3b, 0x6, 0xe, 0xf7,
+ 0x5f, 0xf7, 0x2, 0x1, 0xc6, 0xf8, 0x63, 0x3,
+ 0xc6, 0xf7, 0x5f, 0x73, 0xa, 0xe, 0xfb, 0xd,
+ 0x76, 0xf7, 0x2a, 0xe0, 0x42, 0xe4, 0xf7, 0x85,
+ 0xe4, 0x12, 0x13, 0xd0, 0xa8, 0xfb, 0x22, 0x15,
+ 0xeb, 0x6, 0xb1, 0xf7, 0x48, 0x5, 0x7d, 0x98,
+ 0x9d, 0x7b, 0xb2, 0x1b, 0xcc, 0xb8, 0xab, 0xab,
+ 0xb7, 0x1f, 0x13, 0xb0, 0x7f, 0x57, 0x5, 0xf7,
+ 0x44, 0x6, 0x9e, 0xe4, 0x5, 0x3b, 0x6, 0xcf,
+ 0xf7, 0xde, 0x8d, 0xa, 0x63, 0xfb, 0x57, 0x5,
+ 0x13, 0xd0, 0x68, 0x5c, 0x62, 0x70, 0x50, 0x1b,
+ 0x5f, 0x74, 0xa1, 0xad, 0x92, 0x8b, 0x94, 0x8d,
+ 0x93, 0x1f, 0xc1, 0xf7, 0x9e, 0x8d, 0xa, 0xe,
+ 0xbc, 0xf8, 0x4e, 0x3, 0xbc, 0xef, 0x15, 0xbc,
+ 0x4e, 0xf7, 0x52, 0xf7, 0x35, 0xf7, 0x15, 0xfb,
+ 0x35, 0xd5, 0xc8, 0xfb, 0x15, 0xf7, 0x33, 0xf7,
+ 0x50, 0xf7, 0x30, 0x5b, 0xc7, 0xfb, 0x53, 0xfb,
+ 0x31, 0xfb, 0x13, 0xf7, 0x34, 0x41, 0x4f, 0xf7,
+ 0x16, 0xfb, 0x33, 0x5, 0xe, 0x8b, 0xe9, 0xf7,
+ 0x90, 0xea, 0x3b, 0xe8, 0x12, 0x13, 0xa0, 0x8d,
+ 0x16, 0xf7, 0x96, 0x3f, 0xa, 0x39, 0x6, 0xb4,
+ 0xf7, 0x5d, 0x5, 0xb6, 0xc6, 0xd3, 0xa2, 0xaa,
+ 0x1b, 0xbd, 0x9a, 0x7a, 0x72, 0x82, 0x89, 0x81,
+ 0x89, 0x80, 0x1f, 0x64, 0xfb, 0x57, 0x5, 0x3c,
+ 0x44, 0xa, 0xf7, 0x93, 0x3f, 0xa, 0x3b, 0x6,
+ 0xb7, 0xf7, 0x6d, 0x5, 0x13, 0xc0, 0x8e, 0x98,
+ 0x8d, 0x96, 0x96, 0x1a, 0x13, 0xa0, 0xd0, 0x4d,
+ 0xb2, 0x3e, 0x52, 0x4b, 0x6f, 0x6f, 0x5a, 0x1e,
+ 0x13, 0xc0, 0x93, 0xb6, 0x5, 0xfb, 0x46, 0x6,
+ 0x78, 0x2c, 0x5, 0xde, 0x6, 0x58, 0xfb, 0x90,
+ 0x5, 0x3b, 0x6, 0xe, 0x7c, 0xe4, 0xf7, 0x1b,
+ 0xe8, 0xf7, 0x70, 0xe9, 0x1, 0xf7, 0x1d, 0xf1,
+ 0xf7, 0x77, 0xe7, 0x3, 0xb5, 0x82, 0x15, 0x87,
+ 0xaa, 0xb5, 0x89, 0xbd, 0x1b, 0xf7, 0x5a, 0xf7,
+ 0x57, 0xf7, 0x28, 0xf7, 0xb0, 0xf2, 0x62, 0xeb,
+ 0xfb, 0x1a, 0xfb, 0x15, 0xfb, 0x9, 0xfb, 0x5,
+ 0xfb, 0xa, 0x1f, 0x2e, 0x89, 0xce, 0x38, 0xf1,
+ 0x1b, 0xb6, 0xb5, 0x9d, 0x9b, 0xa8, 0x1f, 0xfb,
+ 0xc, 0x6a, 0xfb, 0x1e, 0x5a, 0xfb, 0x48, 0x1b,
+ 0xf8, 0x23, 0xf7, 0xc6, 0x15, 0x86, 0x53, 0x42,
+ 0x37, 0x56, 0x69, 0xb1, 0xc4, 0xdf, 0xdb, 0xb4,
+ 0xbe, 0xe3, 0x97, 0x3d, 0x4b, 0x87, 0x1e, 0xe,
+ 0x8b, 0xe7, 0xf7, 0x89, 0xe7, 0xf7, 0xc, 0xe0,
+ 0x1, 0xf7, 0x38, 0xf8, 0x95, 0x15, 0xda, 0x71,
+ 0x5, 0xa4, 0x9a, 0x9c, 0xb0, 0xaf, 0x1b, 0xa1,
+ 0xa1, 0x7a, 0x7b, 0xa3, 0x1f, 0x7d, 0xa1, 0xa1,
+ 0x7e, 0xa4, 0x1b, 0xed, 0xbc, 0xe3, 0xaf, 0x9c,
+ 0x1f, 0x3d, 0xa2, 0x5, 0x62, 0x71, 0x7e, 0x75,
+ 0x6e, 0x1b, 0x78, 0x77, 0x98, 0x98, 0x77, 0x1f,
+ 0x9c, 0x72, 0x72, 0x9d, 0x6f, 0x1b, 0x2d, 0x5d,
+ 0x3d, 0x60, 0x72, 0x1f, 0xfb, 0x44, 0xfc, 0x95,
+ 0x15, 0xf7, 0x8c, 0x6, 0x9c, 0xe7, 0x5, 0x3d,
+ 0x6, 0xb1, 0xf7, 0x56, 0x5, 0xb6, 0xc4, 0xd1,
+ 0xa1, 0xa7, 0x1b, 0xba, 0x9b, 0x7c, 0x75, 0x81,
+ 0x8a, 0x80, 0x89, 0x7f, 0x1f, 0x66, 0xfb, 0x51,
+ 0x5, 0x3f, 0x6, 0x78, 0x2f, 0x5, 0xf7, 0x88,
+ 0x6, 0x9d, 0xe7, 0x5, 0x40, 0x6, 0xb4, 0xf7,
+ 0x66, 0x5, 0x8e, 0x98, 0x8c, 0x97, 0x97, 0x1a,
+ 0xcd, 0x50, 0xb0, 0x42, 0x55, 0x4b, 0x6f, 0x70,
+ 0x5e, 0x1e, 0x94, 0xb5, 0x5, 0xfb, 0x40, 0x6,
+ 0x79, 0x2f, 0x8a, 0xa, 0x5a, 0xfb, 0x89, 0x5,
+ 0x3e, 0x6, 0xe, 0xf7, 0x29, 0xe6, 0xf7, 0x6,
+ 0xe6, 0x12, 0xf7, 0x4, 0xe9, 0x84, 0xe5, 0x9f,
+ 0xe7, 0x81, 0xe9, 0x13, 0xe8, 0xce, 0x5e, 0x15,
+ 0xe2, 0x6, 0xbf, 0xf7, 0x56, 0x5, 0xf2, 0x6,
+ 0x56, 0x98, 0xa, 0xea, 0x6, 0xbd, 0xf7, 0x56,
+ 0x5, 0xf7, 0x5, 0x34, 0xa, 0x21, 0x6, 0xab,
+ 0xf7, 0x6, 0x5, 0xed, 0x34, 0xa, 0x13, 0xd4,
+ 0x30, 0x6, 0xc1, 0xf7, 0x62, 0x5, 0x30, 0x6,
+ 0x52, 0xfb, 0x62, 0x5, 0x25, 0x6, 0xc2, 0xf7,
+ 0x62, 0x5, 0x32, 0x6, 0x53, 0xfb, 0x62, 0x5,
+ 0xfb, 0x5, 0x36, 0xa, 0xf6, 0x6, 0x6b, 0xfb,
+ 0x6, 0x5, 0x28, 0x36, 0xa, 0x13, 0xe8, 0xe3,
+ 0x6, 0xf7, 0xb, 0xe6, 0x15, 0xab, 0xf7, 0x6,
+ 0x5, 0xf3, 0x6, 0x6b, 0xfb, 0x6, 0x5, 0xe,
+ 0x7c, 0xeb, 0xf7, 0xa9, 0xeb, 0x1, 0xa4, 0xf1,
+ 0xf7, 0xef, 0xf0, 0x3, 0xa4, 0xf7, 0x3c, 0x15,
+ 0xfb, 0x1b, 0xf7, 0x17, 0x5b, 0xf4, 0xf7, 0x31,
+ 0xf7, 0x31, 0xe5, 0xf7, 0x4d, 0xee, 0x4b, 0xea,
+ 0xfb, 0x35, 0xfb, 0x2e, 0xfb, 0x3f, 0x22, 0xfb,
+ 0x49, 0x1e, 0xf1, 0x9b, 0x15, 0xf3, 0xe8, 0xd1,
+ 0xf6, 0xf7, 0x3, 0xaf, 0x51, 0x54, 0xfb, 0x5,
+ 0xfb, 0x1, 0x58, 0x33, 0x54, 0x2c, 0x9e, 0xdf,
+ 0x1e, 0xe, 0x5d, 0xa, 0xf7, 0x88, 0xf8, 0x77,
+ 0x15, 0xf7, 0xdf, 0xd8, 0x77, 0xf0, 0xfb, 0xd6,
+ 0xfb, 0xc, 0x5, 0xfb, 0x65, 0xfc, 0x12, 0x29,
+ 0xa, 0x63, 0xa, 0xf7, 0x71, 0x77, 0x45, 0xa,
+ 0xf7, 0x2b, 0xf8, 0x95, 0x15, 0xc0, 0x67, 0xf7,
+ 0x45, 0xf7, 0x0, 0xf7, 0x13, 0xfb, 0x0, 0xce,
+ 0xae, 0xfb, 0x18, 0xf7, 0x25, 0x4e, 0xa, 0xfb,
+ 0xd5, 0xfc, 0x86, 0x30, 0xa, 0xfb, 0x3, 0xfb,
+ 0x3a, 0x2d, 0xa, 0x63, 0xa, 0xcc, 0xf7, 0x10,
+ 0x45, 0xa, 0xf8, 0x21, 0xf8, 0x89, 0x72, 0xa,
+ 0xfb, 0x68, 0xfb, 0x10, 0x72, 0xa, 0xfb, 0x69,
+ 0xfc, 0x66, 0x29, 0xa, 0x7c, 0xea, 0xe0, 0xea,
+ 0xed, 0xeb, 0x1, 0x76, 0xef, 0x3, 0xf7, 0xab,
+ 0xc1, 0x15, 0x69, 0xa3, 0xa1, 0x68, 0xe7, 0x1b,
+ 0xc3, 0xbc, 0x99, 0xa0, 0xc6, 0x1f, 0x7e, 0xe7,
+ 0x5, 0x74, 0x46, 0x62, 0x82, 0x73, 0x1b, 0x4a,
+ 0x77, 0xb0, 0xa6, 0x94, 0x8c, 0x92, 0x8e, 0x90,
+ 0x1f, 0xf7, 0x8a, 0x6, 0x97, 0xad, 0x95, 0xb9,
+ 0xb8, 0x1a, 0xde, 0x6c, 0xdc, 0x2c, 0x5c, 0x5a,
+ 0x78, 0x68, 0x63, 0x1e, 0xb1, 0x71, 0x5c, 0x9b,
+ 0x58, 0x1b, 0xfb, 0x32, 0x29, 0xfb, 0x32, 0xfb,
+ 0x32, 0x44, 0xa8, 0x39, 0xf7, 0xe, 0xd2, 0xc1,
+ 0xb8, 0xa3, 0xa3, 0x1f, 0xe1, 0xf7, 0x62, 0x15,
+ 0xb3, 0x97, 0xb6, 0xc5, 0xbf, 0x1b, 0xd0, 0x7d,
+ 0x3f, 0x75, 0x88, 0x1f, 0xfc, 0x51, 0xfb, 0xc,
+ 0x15, 0xc2, 0xb1, 0xf7, 0x37, 0xea, 0xbb, 0x96,
+ 0x66, 0x6b, 0x41, 0x60, 0xfb, 0x1b, 0x38, 0x60,
+ 0x74, 0xa1, 0xb1, 0x1e, 0xe, 0xfb, 0x5b, 0xd4,
+ 0x1, 0xf7, 0x59, 0xe2, 0x3, 0xf7, 0xc9, 0x8a,
+ 0x15, 0x78, 0x2e, 0x56, 0x40, 0x64, 0xa5, 0x6c,
+ 0xb7, 0xa9, 0xa9, 0x97, 0xa0, 0xa5, 0x1f, 0xa7,
+ 0xdd, 0x5, 0x7b, 0x80, 0x64, 0x71, 0x72, 0x1b,
+ 0x7e, 0x82, 0x91, 0x9e, 0xb1, 0xe7, 0xba, 0xa6,
+ 0x9a, 0x1f, 0xe, 0x5d, 0xa, 0xf7, 0x6d, 0xf8,
+ 0xc3, 0x15, 0xf7, 0xc9, 0x3e, 0xae, 0xc6, 0xfb,
+ 0xab, 0xf7, 0xc, 0x5, 0xfb, 0x96, 0xfc, 0x8a,
+ 0x29, 0xa, 0x8b, 0xe8, 0x1, 0xf7, 0x9c, 0xeb,
+ 0x3, 0xcd, 0x16, 0xf8, 0x55, 0x94, 0xa, 0xfb,
+ 0x42, 0x6, 0xf5, 0xf8, 0x9f, 0xfb, 0xa3, 0x56,
+ 0x78, 0x30, 0xf7, 0x3f, 0xad, 0x38, 0xfc, 0x31,
+ 0x5, 0xfb, 0x47, 0x6, 0xe, 0x5d, 0xce, 0x4f,
+ 0x76, 0xf7, 0xb7, 0xcf, 0x8a, 0xd0, 0xf7, 0xba,
+ 0x77, 0x12, 0xc4, 0xcf, 0xf7, 0x7d, 0xce, 0xeb,
+ 0xcf, 0x13, 0xaf, 0xf7, 0xc6, 0x5d, 0x15, 0xf7,
+ 0x82, 0x6, 0x98, 0xce, 0x5, 0xfb, 0x1a, 0x6,
+ 0xf1, 0xd8, 0x5, 0xac, 0xa0, 0xaa, 0xb4, 0xb9,
+ 0x1a, 0xaf, 0x7b, 0xc4, 0x3b, 0x5f, 0x5e, 0x75,
+ 0x68, 0x68, 0x1e, 0x80, 0x4c, 0x5, 0xce, 0x6,
+ 0xa4, 0x90, 0x91, 0xa6, 0xb6, 0x1b, 0x9f, 0xa1,
+ 0x81, 0x75, 0x79, 0x7e, 0x73, 0x79, 0x7e, 0x1f,
+ 0xfb, 0x41, 0xfb, 0x19, 0x5, 0xfb, 0xfe, 0x77,
+ 0x15, 0x13, 0x5f, 0xc5, 0x58, 0xf9, 0xd, 0xf9,
+ 0x35, 0x4d, 0xbb, 0x5, 0xfd, 0xa, 0xfb, 0xff,
+ 0x15, 0xf7, 0x83, 0x6, 0x99, 0xd0, 0x5, 0x39,
+ 0x6, 0xbf, 0xf7, 0xa9, 0xfb, 0x22, 0x6e, 0x7e,
+ 0x46, 0xd4, 0x9a, 0x65, 0x98, 0xa, 0x32, 0x6,
+ 0xe, 0x5c, 0xc4, 0x5a, 0x76, 0xf7, 0x6, 0xca,
+ 0xf7, 0x48, 0xd0, 0xf7, 0xbb, 0x77, 0x12, 0x13,
+ 0xb8, 0xf7, 0x96, 0xc1, 0x15, 0xf7, 0x19, 0x6,
+ 0x84, 0x5f, 0x5, 0x52, 0x6, 0x80, 0x52, 0x5,
+ 0xf7, 0x37, 0x6, 0x96, 0xc4, 0x5, 0x63, 0x6,
+ 0x93, 0xb7, 0x5, 0xb3, 0x6, 0x98, 0xca, 0x5,
+ 0x63, 0x6, 0xac, 0xf7, 0x46, 0x5, 0x4c, 0x6,
+ 0xfb, 0x41, 0x98, 0xa, 0xdd, 0x9b, 0x15, 0xd0,
+ 0xdc, 0x7c, 0x3a, 0x5, 0xfc, 0x52, 0xfb, 0x12,
+ 0x15, 0x13, 0x78, 0xc6, 0x58, 0xf9, 0x9, 0xf9,
+ 0x34, 0x4c, 0xbc, 0x5, 0xfd, 0x9, 0xfc, 0x0,
+ 0x15, 0xf7, 0x82, 0x6, 0x99, 0xd0, 0x5, 0x38,
+ 0x6, 0xbf, 0xf7, 0xa8, 0xfb, 0x1f, 0x6e, 0x7e,
+ 0x47, 0xd2, 0x9a, 0x66, 0x98, 0xa, 0x32, 0x6,
+ 0xe, 0xf7, 0x70, 0xd7, 0xf7, 0xd4, 0x77, 0x1,
+ 0xf7, 0xa4, 0xda, 0x3, 0xf7, 0x29, 0xf7, 0x70,
+ 0x15, 0xf7, 0xb0, 0x6, 0x9c, 0xd7, 0x7b, 0xa,
+ 0xc9, 0xf7, 0xd4, 0xfb, 0x3b, 0x6a, 0x7b, 0x3f,
+ 0xe0, 0x9c, 0x60, 0xfb, 0x78, 0x5, 0x21, 0x6,
+ 0xe, 0xf7, 0x58, 0xde, 0xed, 0xda, 0xb4, 0xde,
+ 0x1, 0xf7, 0x17, 0xd8, 0x3, 0xf7, 0xd6, 0xf7,
+ 0x60, 0x15, 0xf7, 0x17, 0x6, 0x9a, 0xdd, 0x5,
+ 0x53, 0x6, 0xa4, 0xf7, 0x22, 0x5, 0x8f, 0xa1,
+ 0x8d, 0xa5, 0xa1, 0x1a, 0xc9, 0x51, 0x9f, 0x53,
+ 0x55, 0x4e, 0x7b, 0x7d, 0x67, 0x1e, 0x9a, 0x3c,
+ 0x5, 0x99, 0xb2, 0xc3, 0x97, 0xb1, 0x1b, 0xaa,
+ 0x98, 0x77, 0x6c, 0x87, 0x1f, 0x92, 0x75, 0x74,
+ 0x8e, 0x73, 0x1b, 0xfb, 0x13, 0x64, 0x32, 0x4b,
+ 0x51, 0xb2, 0x5a, 0xcb, 0xab, 0xae, 0xa0, 0xa7,
+ 0xa7, 0x1f, 0xa2, 0xf7, 0x12, 0x15, 0x63, 0x76,
+ 0x60, 0x57, 0x63, 0x1b, 0x69, 0x85, 0xa0, 0x9e,
+ 0xb3, 0xbd, 0x9d, 0xb2, 0xa1, 0xac, 0x85, 0x8b,
+ 0x1f, 0xe, 0xf7, 0x58, 0xde, 0xf7, 0x6e, 0xde,
+ 0x1, 0xf7, 0x10, 0xd9, 0xf7, 0x58, 0xd9, 0x3,
+ 0xf7, 0x10, 0xf8, 0x3, 0x15, 0x35, 0xbf, 0x36,
+ 0xe6, 0xf7, 0x3, 0xed, 0xf7, 0xa, 0xf7, 0x14,
+ 0xdc, 0x5e, 0xe9, 0x2b, 0xfb, 0x16, 0x3a, 0xfb,
+ 0x26, 0x23, 0x1e, 0xd9, 0x99, 0x15, 0xc5, 0xb3,
+ 0xea, 0xd7, 0xc4, 0xa2, 0x4b, 0x61, 0x41, 0x54,
+ 0x40, 0x4c, 0x56, 0x72, 0xc4, 0xb8, 0x1e, 0xe,
+ 0x7d, 0xea, 0x37, 0x76, 0xf8, 0x18, 0xea, 0x8f,
+ 0x77, 0x12, 0xac, 0xf0, 0xf7, 0xe4, 0xec, 0x13,
+ 0x6c, 0x94, 0xa7, 0x15, 0xba, 0x57, 0xc6, 0xbb,
+ 0x5, 0x13, 0x9c, 0x70, 0xb7, 0xc1, 0x80, 0xbb,
+ 0x1b, 0xf7, 0x14, 0xf7, 0x46, 0xea, 0xf7, 0x4e,
+ 0x1f, 0x8c, 0xaf, 0x83, 0xae, 0x78, 0xaa, 0xbd,
+ 0xb4, 0x18, 0x5d, 0xc0, 0x56, 0x60, 0x5, 0x13,
+ 0xac, 0xa3, 0x68, 0x5c, 0x9a, 0x4d, 0x1b, 0xfb,
+ 0x29, 0xfb, 0x3a, 0x20, 0xfb, 0x48, 0x63, 0x96,
+ 0x6a, 0x9d, 0x70, 0x1f, 0xf7, 0x20, 0xa1, 0x15,
+ 0xf7, 0x93, 0xf7, 0x64, 0x5, 0x93, 0x7d, 0x90,
+ 0x7b, 0x7b, 0x1a, 0xfb, 0x5, 0xfb, 0x3, 0x4d,
+ 0x39, 0x76, 0x6e, 0x8e, 0x95, 0x72, 0x1e, 0x53,
+ 0xb8, 0x15, 0x7e, 0xa0, 0x8c, 0xa5, 0x9f, 0x1a,
+ 0xe9, 0xf0, 0xcb, 0xe7, 0xab, 0xa4, 0x86, 0x82,
+ 0x9f, 0x1e, 0xe, 0x63, 0xa, 0xf7, 0x1e, 0x77,
+ 0xdd, 0x77, 0x45, 0xa, 0xf7, 0x1b, 0xf8, 0x95,
+ 0x15, 0xd9, 0x71, 0x5, 0xa0, 0x9c, 0x99, 0xb4,
+ 0xad, 0x1b, 0x9e, 0x9f, 0x81, 0x7e, 0x9f, 0x1f,
+ 0x7a, 0xa5, 0xa6, 0x78, 0xa9, 0x1b, 0xee, 0xbc,
+ 0xe3, 0xad, 0x9c, 0x1f, 0x3d, 0xa3, 0x5, 0x62,
+ 0x70, 0x7e, 0x76, 0x6e, 0x1b, 0x76, 0x77, 0x98,
+ 0x99, 0x76, 0x1f, 0x9b, 0x73, 0x72, 0x9c, 0x70,
+ 0x1b, 0x2c, 0x5d, 0x3d, 0x60, 0x73, 0x1f, 0xfb,
+ 0x3, 0xfb, 0xf6, 0x29, 0xa, 0xfb, 0x22, 0xe3,
+ 0xea, 0x76, 0xf7, 0xe1, 0xe3, 0x40, 0xe3, 0x12,
+ 0xb7, 0xe9, 0xf7, 0xf6, 0xee, 0x13, 0xdc, 0x67,
+ 0x90, 0xa, 0x9e, 0xe3, 0x85, 0xa, 0xa2, 0xf7,
+ 0x3, 0x5, 0x7d, 0x9d, 0xbd, 0x74, 0xdb, 0x1b,
+ 0xf7, 0x39, 0xf7, 0xf, 0xf7, 0x7, 0xf7, 0x24,
+ 0xf7, 0x7, 0x3b, 0xc7, 0xfb, 0x1, 0x54, 0x44,
+ 0x72, 0x6c, 0x5b, 0x1f, 0x13, 0xec, 0x94, 0xb6,
+ 0x3e, 0xa, 0x79, 0x33, 0x8a, 0xa, 0x35, 0xfc,
+ 0x2b, 0x5, 0xf7, 0x29, 0xf7, 0x8f, 0x15, 0x13,
+ 0xdc, 0xf7, 0xe, 0xf7, 0x18, 0xae, 0xc0, 0xce,
+ 0xba, 0x6a, 0x56, 0x39, 0x2f, 0x3a, 0x3d, 0x63,
+ 0x32, 0x99, 0xd9, 0x1e, 0xe, 0xf8, 0xba, 0xa9,
+ 0x1, 0xf7, 0xb, 0xbf, 0xea, 0xc0, 0x3, 0xf7,
+ 0xb, 0x45, 0x15, 0xbf, 0x6, 0xf7, 0x7a, 0xf9,
+ 0x0, 0x5, 0xea, 0x6, 0xfb, 0x7a, 0xfd, 0x0,
+ 0x5, 0xc0, 0x6, 0xf7, 0x78, 0xf9, 0x0, 0x5,
+ 0xc8, 0x6, 0x96, 0xa9, 0x5, 0xfb, 0x97, 0x6,
+ 0xfb, 0x4e, 0xfb, 0x55, 0x59, 0xfb, 0x2a, 0x47,
+ 0xce, 0x49, 0xf7, 0x4a, 0x81, 0x1f, 0xe, 0x3a,
+ 0x76, 0xf9, 0x62, 0x77, 0x1, 0xf7, 0x1d, 0xf2,
+ 0x3, 0xf7, 0x5b, 0x25, 0x15, 0xec, 0x6, 0x6e,
+ 0xd1, 0x70, 0xec, 0xf6, 0x1a, 0xf7, 0x46, 0xf7,
+ 0xe, 0xf7, 0x23, 0xf0, 0xf7, 0xf, 0x1e, 0x2b,
+ 0x6, 0xfb, 0x1a, 0xfb, 0x23, 0x2b, 0xfb, 0x26,
+ 0xfb, 0x46, 0x1a, 0x48, 0x98, 0x32, 0xbc, 0x2c,
+ 0x1e, 0xe, 0x3a, 0x76, 0xf9, 0x62, 0x77, 0x1,
+ 0xf7, 0xfc, 0xf2, 0x3, 0xf7, 0x1c, 0x25, 0x15,
+ 0xeb, 0x6, 0xf7, 0x1a, 0xf7, 0x23, 0xec, 0xf7,
+ 0x26, 0xf7, 0x46, 0x1a, 0xce, 0x7e, 0xe4, 0x5a,
+ 0xea, 0x1e, 0x2a, 0x6, 0xa8, 0x45, 0xa6, 0x2a,
+ 0x20, 0x1a, 0xfb, 0x46, 0xfb, 0xf, 0xfb, 0x23,
+ 0x26, 0xfb, 0xf, 0x1e, 0xe, 0x7c, 0xd1, 0xf7,
+ 0x1c, 0xd1, 0xda, 0xd1, 0xf7, 0x1c, 0xd1, 0x1,
+ 0xc3, 0xdc, 0xd5, 0xdc, 0x9b, 0xdc, 0xd5, 0xdc,
+ 0x3, 0xc3, 0xf8, 0x5a, 0x39, 0xa, 0xd5, 0xfb,
+ 0xfd, 0x39, 0xa, 0xfb, 0x69, 0xce, 0x15, 0xf8,
+ 0x5e, 0xf7, 0x4a, 0x7a, 0xcb, 0xfc, 0x5f, 0xfb,
+ 0x4c, 0x5, 0xe, 0x7c, 0xf7, 0x4e, 0x1, 0xf7,
+ 0x52, 0xf7, 0x6f, 0x3, 0xf7, 0x52, 0xcb, 0x15,
+ 0x68, 0xa3, 0x5f, 0xd1, 0xc7, 0xcc, 0xb2, 0xcf,
+ 0xb3, 0x6d, 0xb2, 0x4d, 0x4b, 0x4c, 0x60, 0x4b,
+ 0x1e, 0xe, 0xf7, 0x39, 0xf7, 0x4e, 0x1, 0xf7,
+ 0x56, 0xf7, 0x68, 0x3, 0xf7, 0x56, 0xf7, 0x87,
+ 0x15, 0x6c, 0x9f, 0x5c, 0xd3, 0xc9, 0xc5, 0xbc,
+ 0xc5, 0xb3, 0x72, 0xb2, 0x4c, 0x49, 0x51, 0x55,
+ 0x55, 0x1e, 0xe, 0x7c, 0xd1, 0xf7, 0x1b, 0xd1,
+ 0xdb, 0xd1, 0xf7, 0x1c, 0xd1, 0x1, 0x3f, 0xd9,
+ 0xab, 0xd9, 0xc2, 0xd7, 0xad, 0xd7, 0xa0, 0xd9,
+ 0xf7, 0x39, 0xd7, 0x3, 0x3f, 0xf8, 0x57, 0x49,
+ 0xa, 0xc0, 0x3a, 0xfb, 0xa, 0x42, 0x3c, 0x35,
+ 0x1e, 0xd9, 0x95, 0x15, 0xb7, 0xaf, 0xb4, 0xc8,
+ 0xb5, 0xa5, 0x72, 0x53, 0xa, 0x3f, 0xfb, 0xaa,
+ 0x15, 0xf8, 0x77, 0xf7, 0x4f, 0x7a, 0xc9, 0xfc,
+ 0x79, 0xfb, 0x50, 0x5, 0xf8, 0x67, 0xfb, 0x28,
+ 0x38, 0xa, 0xfc, 0x36, 0x81, 0x38, 0xa, 0xe,
+ 0xf7, 0x68, 0xe9, 0xf7, 0x40, 0x77, 0x1, 0xf7,
+ 0x62, 0xed, 0x3, 0xc6, 0xf7, 0x68, 0x15, 0xf7,
+ 0x4a, 0x6, 0x68, 0xfb, 0x3d, 0x56, 0xa, 0xae,
+ 0xf7, 0x3d, 0x5, 0xf7, 0x4b, 0x3f, 0xa, 0xfb,
+ 0x4a, 0x6, 0xae, 0xf7, 0x40, 0x4e, 0xa, 0x68,
+ 0xfb, 0x40, 0x5, 0xfb, 0x4b, 0x6, 0xe, 0xa9,
+ 0xdc, 0xf7, 0x43, 0xdc, 0xf7, 0x28, 0x77, 0x1,
+ 0xf7, 0x82, 0xed, 0x3, 0xf7, 0x82, 0xf7, 0x1e,
+ 0x15, 0xed, 0x6, 0xad, 0xf7, 0x28, 0x5, 0xf7,
+ 0x48, 0x6, 0x9e, 0xdc, 0x5, 0xfb, 0x48, 0x6,
+ 0xae, 0xf7, 0x28, 0x4e, 0xa, 0x69, 0xfb, 0x28,
+ 0x5, 0xfb, 0x47, 0x6, 0x78, 0x3a, 0x5, 0xf7,
+ 0x47, 0x6, 0xfb, 0x86, 0xfb, 0x9a, 0x15, 0xf8,
+ 0x5c, 0x6, 0x9e, 0xdc, 0x5, 0xfc, 0x5c, 0x6,
+ 0xe, 0x7c, 0xe9, 0xf7, 0x12, 0xe9, 0xf7, 0x3d,
+ 0xe9, 0x1, 0xf8, 0x89, 0xf1, 0x3, 0xf7, 0xdc,
+ 0xb0, 0x15, 0xc8, 0x57, 0xb5, 0xb7, 0x96, 0x7c,
+ 0x95, 0x7d, 0x90, 0x7c, 0x19, 0xf7, 0xa, 0x55,
+ 0xa, 0x3a, 0x6, 0x7d, 0xa0, 0xdb, 0xdd, 0x54,
+ 0xbf, 0x46, 0x46, 0x65, 0xc5, 0x5, 0xf7, 0xd,
+ 0x9e, 0xcb, 0xe1, 0xe8, 0x1a, 0xec, 0x39, 0xb7,
+ 0x23, 0x1e, 0xfb, 0xbc, 0x44, 0xa, 0xdd, 0x6,
+ 0x39, 0xfc, 0x19, 0x5, 0x34, 0x44, 0xa, 0xf7,
+ 0x9f, 0x3f, 0xa, 0x3b, 0x6, 0xa5, 0xf7, 0x12,
+ 0x5, 0xdf, 0x6, 0xd3, 0xfb, 0x4, 0x5, 0xfb,
+ 0x1c, 0xf7, 0x62, 0x15, 0xae, 0xf7, 0x3d, 0x5,
+ 0xf7, 0x1b, 0x6, 0xa3, 0xc6, 0x82, 0x5a, 0x2a,
+ 0x23, 0x7d, 0x58, 0x1f, 0xe, 0xfb, 0x22, 0xe3,
+ 0xd6, 0xe1, 0xf7, 0x8c, 0xe3, 0x3f, 0xe2, 0x12,
+ 0x81, 0xf1, 0x13, 0xe8, 0xf7, 0x4a, 0x90, 0xa,
+ 0xa0, 0xe3, 0x5, 0x3b, 0x6, 0xe3, 0xf8, 0x2d,
+ 0x5c, 0xa, 0x9f, 0xe3, 0x3e, 0xa, 0x7f, 0x5e,
+ 0x5, 0x13, 0xd8, 0xad, 0x69, 0x5c, 0xa1, 0x53,
+ 0x1b, 0xfb, 0x31, 0xfb, 0x21, 0xfb, 0xf, 0xfb,
+ 0x18, 0x29, 0xd7, 0x3b, 0xf7, 0x14, 0xc1, 0xc2,
+ 0x90, 0xa9, 0xbb, 0x1f, 0x75, 0xfb, 0x2, 0x5,
+ 0xfb, 0x81, 0xf7, 0x9c, 0x15, 0xe1, 0xdc, 0xd2,
+ 0xf0, 0xed, 0xa0, 0x49, 0x56, 0xfb, 0x11, 0xfb,
+ 0x1a, 0x7b, 0x5e, 0x46, 0x56, 0xb4, 0xc9, 0x1e,
+ 0xe, 0x7d, 0xf7, 0x2c, 0xf7, 0xf2, 0xe7, 0x1,
+ 0xeb, 0xf7, 0x54, 0xf7, 0x8, 0xef, 0x3, 0xf7,
+ 0x3d, 0xf7, 0x4a, 0x15, 0xed, 0x6, 0x98, 0xc5,
+ 0x5, 0xe3, 0x9a, 0xf7, 0x1c, 0xc2, 0xf7, 0x1a,
+ 0x1a, 0xe4, 0x3c, 0xba, 0xfb, 0x0, 0x53, 0x3c,
+ 0x7d, 0x77, 0x52, 0x1e, 0x6e, 0xfb, 0x24, 0x5,
+ 0xee, 0x6, 0x99, 0xd7, 0x5, 0x91, 0xa7, 0xa9,
+ 0x8f, 0xa7, 0x1b, 0xc6, 0xbd, 0x7a, 0x62, 0x30,
+ 0xfb, 0x2, 0x79, 0x28, 0x7c, 0x1f, 0x28, 0xfb,
+ 0x9e, 0x15, 0x6a, 0xae, 0x76, 0xba, 0xd8, 0xac,
+ 0xbd, 0xb6, 0xa2, 0x7b, 0xaf, 0x4c, 0x4a, 0x5b,
+ 0x5c, 0x58, 0x1e, 0xe, 0xfb, 0x26, 0xe8, 0xf7,
+ 0xf2, 0xf7, 0x2c, 0x1, 0xeb, 0xed, 0xf7, 0xc,
+ 0xf7, 0x52, 0x3, 0xf7, 0xce, 0xf8, 0x2, 0x15,
+ 0x78, 0x8a, 0x90, 0x59, 0xd6, 0x1b, 0xce, 0xb7,
+ 0xb8, 0xbb, 0xaf, 0x6a, 0xa2, 0x5b, 0x44, 0x65,
+ 0x5d, 0x66, 0x1f, 0x8e, 0xfb, 0x3e, 0x15, 0x4b,
+ 0x85, 0xfb, 0x31, 0x4a, 0xfb, 0x1b, 0x1a, 0x33,
+ 0xd9, 0x5b, 0xf6, 0xc1, 0xdf, 0x99, 0x9f, 0xc4,
+ 0x1e, 0xa7, 0xf7, 0x1a, 0x66, 0xa, 0x7d, 0x49,
+ 0x5, 0x86, 0x6e, 0x68, 0x87, 0x6e, 0x1b, 0x51,
+ 0x5b, 0x9c, 0xb4, 0xe7, 0xf7, 0x2, 0x9d, 0xec,
+ 0x9a, 0x1f, 0xa4, 0xf7, 0x13, 0x66, 0xa, 0xe,
+ 0xf8, 0xc6, 0x77, 0x1, 0xf7, 0x6, 0xf7, 0x4,
+ 0xd5, 0xf7, 0x2, 0x3, 0xf7, 0xc0, 0xf7, 0xa9,
+ 0x15, 0xf7, 0x2, 0x6, 0xd7, 0x71, 0xa, 0xfb,
+ 0x20, 0x6, 0xfb, 0x7c, 0xfb, 0xb1, 0x5a, 0xa,
+ 0xd7, 0x71, 0xa, 0xfb, 0x20, 0x6, 0xe, 0xfb,
+ 0x22, 0xf7, 0xb1, 0x1, 0xf7, 0x90, 0xfb, 0x22,
+ 0x15, 0xf7, 0x9, 0x80, 0xa, 0xfb, 0x31, 0x6,
+ 0xfc, 0x3, 0xfb, 0xb1, 0x15, 0xf7, 0x7, 0x6,
+ 0xf7, 0x57, 0x71, 0xa, 0xfb, 0x32, 0x6, 0xe,
+ 0xf7, 0x46, 0xf7, 0x5, 0xed, 0xf7, 0x5, 0x3,
+ 0xf8, 0x19, 0xf7, 0xa9, 0x6d, 0xa, 0x63, 0x71,
+ 0xa, 0xfb, 0x2d, 0x6, 0xfb, 0x17, 0xfb, 0xb1,
+ 0x6d, 0xa, 0x64, 0x71, 0xa, 0xfb, 0x2e, 0x6,
+ 0xe, 0xf7, 0xbe, 0x76, 0xf7, 0xb1, 0x77, 0x1,
+ 0xb1, 0xf7, 0x8, 0xee, 0xf7, 0xa, 0x3, 0xf7,
+ 0x91, 0xf7, 0xa9, 0x15, 0xf7, 0xa, 0x6, 0xf7,
+ 0x53, 0x71, 0xa, 0xfb, 0x32, 0x6, 0xfc, 0x2,
+ 0xfb, 0xb1, 0x15, 0xf7, 0x8, 0x80, 0xa, 0xfb,
+ 0x33, 0x6, 0xe, 0xf7, 0xa9, 0xf7, 0xb1, 0x1,
+ 0xf7, 0xaf, 0xf7, 0xa9, 0x5a, 0xa, 0x65, 0x71,
+ 0xa, 0xfb, 0x2c, 0x6, 0xe, 0xf7, 0xbe, 0x76,
+ 0xf7, 0xb1, 0x77, 0x1, 0xf7, 0x24, 0xf7, 0xa,
+ 0x3, 0xf7, 0x24, 0xf7, 0xa9, 0x15, 0xf7, 0xa,
+ 0x6, 0xf7, 0x56, 0x71, 0xa, 0xfb, 0x35, 0x6,
+ 0xe, 0xfb, 0xd, 0x76, 0xf7, 0xae, 0x77, 0x1,
+ 0xf7, 0x24, 0xf7, 0xb, 0x3, 0xf7, 0x24, 0xfb,
+ 0x22, 0x15, 0xf7, 0xb, 0x80, 0xa, 0xfb, 0x34,
+ 0x6, 0xe, 0xf7, 0xbb, 0x76, 0xf7, 0xb4, 0x77,
+ 0x1, 0xf7, 0x62, 0xf7, 0x5, 0x3, 0xf7, 0x62,
+ 0xf7, 0xa6, 0x6d, 0xa, 0xd6, 0xf7, 0xb4, 0x5,
+ 0xfb, 0x20, 0x6, 0xe, 0x7f, 0xa, 0xf7, 0x2b,
+ 0xee, 0x3, 0x9c, 0x16, 0xf8, 0x2c, 0x3f, 0xa,
+ 0xfb, 0x56, 0x6, 0xac, 0xf7, 0x2b, 0x5, 0xc2,
+ 0xcd, 0xcc, 0xc7, 0xdf, 0x1b, 0xa4, 0x8d, 0x81,
+ 0x72, 0x8a, 0x1f, 0xed, 0x99, 0x5, 0xcb, 0x8b,
+ 0xbe, 0x22, 0x41, 0x40, 0x53, 0x63, 0x4e, 0x1e,
+ 0x98, 0xdc, 0x5, 0xfb, 0x6b, 0x87, 0xa, 0xf7,
+ 0x7, 0x6, 0x58, 0xfb, 0x8f, 0x83, 0xa, 0xe,
+ 0x79, 0xb8, 0xf6, 0xf7, 0x37, 0xf2, 0xba, 0xe3,
+ 0xb8, 0x1, 0x84, 0xba, 0xf7, 0xe5, 0xba, 0xf7,
+ 0x1d, 0xb9, 0x3, 0x84, 0xf7, 0x6e, 0x15, 0xfb,
+ 0x1a, 0xf5, 0x25, 0xf7, 0x24, 0xf7, 0x4c, 0xf7,
+ 0x48, 0xf7, 0x3b, 0xf7, 0x51, 0xf7, 0x1d, 0x25,
+ 0xf4, 0xfb, 0x25, 0xfb, 0x4f, 0xfb, 0x48, 0xfb,
+ 0x3f, 0xfb, 0x53, 0x1e, 0xba, 0x9e, 0x15, 0xf7,
+ 0x32, 0xf7, 0x34, 0xf7, 0x20, 0xf7, 0x2b, 0xf7,
+ 0x13, 0xde, 0x2e, 0xfb, 0xc, 0xfb, 0x31, 0xfb,
+ 0x34, 0xfb, 0x1e, 0xfb, 0x2a, 0xfb, 0x12, 0x36,
+ 0xe6, 0xf7, 0xb, 0x1e, 0xf7, 0x18, 0x24, 0x15,
+ 0xbb, 0x6, 0xa5, 0xf7, 0x8, 0x5, 0xbf, 0x6,
+ 0xa6, 0xfb, 0x8, 0x5, 0xc5, 0x6, 0x6e, 0xf7,
+ 0x13, 0x5, 0xb6, 0x95, 0xa6, 0xb4, 0xc4, 0x1a,
+ 0xcf, 0x53, 0x95, 0x4e, 0x1e, 0x41, 0x6, 0xa1,
+ 0xfb, 0x2a, 0x15, 0x9b, 0xf2, 0x5, 0xbb, 0x6,
+ 0xa8, 0xa8, 0x83, 0x6f, 0x55, 0x61, 0x7e, 0x6c,
+ 0x1f, 0xe, 0xf8, 0x75, 0xc6, 0xda, 0xc6, 0x1,
+ 0xf7, 0x57, 0xc9, 0xdf, 0xca, 0x3, 0xf7, 0x57,
+ 0xf8, 0xc5, 0x15, 0x5e, 0xad, 0x68, 0xbd, 0xcf,
+ 0xc4, 0xc4, 0xcb, 0xb6, 0x69, 0xac, 0x5a, 0x49,
+ 0x4f, 0x54, 0x4d, 0x1e, 0xc9, 0x96, 0x15, 0xa5,
+ 0xa3, 0xa0, 0xa6, 0x9f, 0x98, 0x7f, 0x7a, 0x71,
+ 0x76, 0x73, 0x6f, 0x76, 0x7d, 0x99, 0x9d, 0x1e,
+ 0xe, 0x7a, 0xe6, 0xf4, 0xd9, 0xa0, 0xf7, 0x49,
+ 0x2b, 0xeb, 0x12, 0xf7, 0x2, 0xe9, 0xf7, 0x76,
+ 0xed, 0x13, 0xdc, 0xa9, 0x7a, 0x15, 0xed, 0x6,
+ 0x93, 0xb2, 0x5, 0x76, 0xb5, 0xbe, 0x79, 0xc0,
+ 0x1b, 0xf7, 0x1e, 0xf7, 0x0, 0xab, 0xf7, 0x1,
+ 0xe8, 0x33, 0xab, 0x40, 0x93, 0x1f, 0xfb, 0x5,
+ 0x96, 0x5b, 0x97, 0xac, 0x1a, 0xb6, 0xef, 0x92,
+ 0xa2, 0xb6, 0xb7, 0x7c, 0x75, 0xab, 0x1e, 0x13,
+ 0xec, 0x81, 0x5b, 0x56, 0xa, 0xaf, 0xf7, 0x49,
+ 0x4e, 0xa, 0x85, 0x69, 0x5, 0x9a, 0x66, 0x5f,
+ 0x9e, 0x5c, 0x1b, 0xfb, 0x13, 0x26, 0x5b, 0x24,
+ 0x2b, 0xf7, 0xf, 0x70, 0xd4, 0x85, 0x1f, 0xad,
+ 0x88, 0xe5, 0x83, 0x57, 0x1a, 0x67, 0x3e, 0x85,
+ 0x52, 0x45, 0x5d, 0xa3, 0x9c, 0x71, 0x1e, 0x98,
+ 0xc8, 0x7b, 0xa, 0xe, 0x7a, 0xe0, 0xf7, 0x57,
+ 0xf7, 0x40, 0x1, 0xe8, 0xe4, 0xf7, 0x6c, 0xe6,
+ 0x3, 0xf7, 0xc1, 0xf8, 0x79, 0x15, 0xeb, 0x6,
+ 0xf7, 0x4d, 0xf7, 0x25, 0x58, 0xb0, 0xfb, 0x3d,
+ 0xfb, 0x0, 0xfb, 0x10, 0xf7, 0x0, 0x48, 0x67,
+ 0x5, 0xfb, 0x2e, 0xfd, 0x1c, 0x15, 0xe8, 0x6,
+ 0x93, 0xb1, 0x5, 0x7b, 0xb4, 0xc2, 0x75, 0xbf,
+ 0x1b, 0xf7, 0x24, 0xda, 0xc1, 0xe3, 0xdd, 0x4c,
+ 0xaf, 0x38, 0x92, 0x1f, 0x26, 0x93, 0x4f, 0x91,
+ 0xaf, 0x1a, 0xbf, 0xe5, 0x8b, 0xa2, 0xb4, 0xb9,
+ 0x73, 0x7a, 0xa9, 0x1e, 0x82, 0x5e, 0x5, 0xe9,
+ 0x6, 0xad, 0xf7, 0x40, 0x5, 0x2e, 0x6, 0x84,
+ 0x6b, 0x5, 0x98, 0x68, 0x5d, 0x9e, 0x5e, 0x1b,
+ 0x28, 0xfb, 0x4, 0x72, 0xfb, 0x3, 0x8a, 0x1f,
+ 0x2a, 0xf7, 0x9, 0x6b, 0xd0, 0x85, 0x1e, 0xac,
+ 0x88, 0xe1, 0x8f, 0x60, 0x1a, 0x6a, 0x4a, 0x73,
+ 0x55, 0x48, 0x57, 0xac, 0x94, 0x74, 0x1e, 0x95,
+ 0xc6, 0x5, 0x2d, 0x6, 0xe, 0xfb, 0x62, 0xce,
+ 0xf7, 0xe, 0xf7, 0x57, 0x81, 0xe2, 0xa4, 0xf7,
+ 0x47, 0x12, 0xf7, 0x2, 0xe8, 0x9f, 0xcd, 0xf7,
+ 0x26, 0xed, 0x13, 0xde, 0xa9, 0x7a, 0x15, 0xed,
+ 0x6, 0x93, 0xb3, 0xa4, 0x81, 0xa9, 0x7e, 0xab,
+ 0x84, 0x19, 0x6b, 0x26, 0x5, 0x8e, 0x94, 0x9d,
+ 0x8e, 0x9a, 0x1b, 0x93, 0x94, 0x85, 0x81, 0x80,
+ 0x7e, 0x81, 0x7e, 0x81, 0x7e, 0x8f, 0x94, 0x7c,
+ 0x1f, 0x62, 0x55, 0x5, 0x73, 0xa6, 0x9e, 0x89,
+ 0x9d, 0x1b, 0xc6, 0xc5, 0xb3, 0xd0, 0xa1, 0x85,
+ 0xab, 0x67, 0x93, 0x1f, 0x90, 0x9d, 0x5, 0xf7,
+ 0x2b, 0x8a, 0xe0, 0xc4, 0xe8, 0x1a, 0x13, 0xbe,
+ 0xe1, 0x49, 0xb1, 0x34, 0x92, 0x1e, 0x21, 0x93,
+ 0x4c, 0x92, 0xb0, 0x1a, 0xc2, 0xea, 0x8a, 0xa3,
+ 0xb6, 0xbb, 0x73, 0x79, 0xaa, 0x1e, 0x82, 0x5c,
+ 0x56, 0xa, 0xb0, 0xf7, 0x47, 0x4e, 0xa, 0x84,
+ 0x69, 0x5, 0x99, 0x66, 0x5b, 0x9f, 0x5c, 0x1b,
+ 0x23, 0xfb, 0xa, 0x72, 0xfb, 0x9, 0x8a, 0x1f,
+ 0x26, 0xf7, 0xe, 0x69, 0xd4, 0x85, 0x1e, 0xad,
+ 0x88, 0xe5, 0x8f, 0x5e, 0x1a, 0x68, 0x47, 0x72,
+ 0x53, 0x44, 0x55, 0xae, 0x94, 0x73, 0x1e, 0x13,
+ 0xde, 0x95, 0xc9, 0x4e, 0xa, 0xe, 0x45, 0xe9,
+ 0xf8, 0x62, 0xe8, 0x1, 0xcc, 0xf2, 0xf7, 0x9b,
+ 0xf1, 0x3, 0xa6, 0x45, 0x15, 0xf7, 0x82, 0x6,
+ 0xe6, 0xe7, 0xa7, 0xdf, 0xa8, 0x85, 0x9d, 0x7c,
+ 0x9c, 0x1f, 0xad, 0x95, 0xc1, 0xbe, 0xc5, 0x1a,
+ 0x8a, 0xa6, 0x7d, 0xa3, 0x74, 0x9d, 0xfb, 0x6c,
+ 0xf7, 0x41, 0x18, 0x8b, 0x88, 0x8e, 0x8f, 0x1a,
+ 0x96, 0x9c, 0x8c, 0x91, 0x1e, 0xf7, 0x3c, 0x6,
+ 0x79, 0x35, 0x5, 0xf1, 0x6, 0xb2, 0xf7, 0x48,
+ 0xfb, 0x88, 0x8a, 0x5, 0x32, 0x37, 0x76, 0x38,
+ 0x6f, 0x96, 0x75, 0x9d, 0x78, 0x1f, 0x56, 0x76,
+ 0x68, 0x60, 0x5c, 0x1a, 0x6b, 0x9d, 0x68, 0xb2,
+ 0x6c, 0x1e, 0xf7, 0x42, 0xfb, 0x1e, 0x5, 0x9c,
+ 0x7d, 0x8d, 0x88, 0x83, 0x1a, 0x82, 0x7b, 0x8a,
+ 0x87, 0x1e, 0xfb, 0x45, 0x6, 0x9e, 0xe3, 0x5,
+ 0x24, 0x6, 0xf7, 0xb7, 0xc3, 0x15, 0xfb, 0x1f,
+ 0xf7, 0x1, 0x5, 0x82, 0x92, 0x87, 0x97, 0x97,
+ 0x1a, 0xa0, 0xab, 0x95, 0x99, 0x92, 0x1e, 0xf7,
+ 0x30, 0xfb, 0xd, 0x5, 0x92, 0x86, 0x8d, 0x83,
+ 0x82, 0x1a, 0x71, 0x61, 0x84, 0x7a, 0x89, 0x1e,
+ 0xe, 0x31, 0x76, 0xf7, 0xfc, 0xf7, 0x44, 0x1,
+ 0xf7, 0xa5, 0xf7, 0x6d, 0x3, 0xf7, 0xa5, 0xf7,
+ 0xd6, 0x15, 0x6e, 0x9f, 0x5f, 0xd3, 0xce, 0xc5,
+ 0xbc, 0xc6, 0xae, 0x6e, 0xac, 0x4e, 0x45, 0x52,
+ 0x58, 0x57, 0x1e, 0xfb, 0x38, 0xfc, 0x45, 0x15,
+ 0xf7, 0x12, 0x6, 0xf7, 0x5d, 0xf7, 0xac, 0x5,
+ 0xfb, 0x3b, 0x6, 0xe, 0xa0, 0x76, 0xf8, 0x39,
+ 0xf7, 0x48, 0x1, 0xf4, 0xf5, 0x3, 0xf4, 0x16,
+ 0xf5, 0x6, 0xf7, 0xcc, 0xf8, 0xa9, 0x99, 0xcf,
+ 0x5, 0xfc, 0x4a, 0x6, 0x66, 0xfb, 0x48, 0x56,
+ 0xa, 0x9d, 0xe2, 0x5, 0xf7, 0x80, 0x6, 0xe,
+ 0x7c, 0xe6, 0xf7, 0x74, 0xe8, 0xf7, 0x1e, 0xdf,
+ 0x8a, 0x77, 0x12, 0xf8, 0x3, 0xed, 0x13, 0xe8,
+ 0xf7, 0x48, 0xf7, 0xfb, 0x15, 0xf7, 0x19, 0xda,
+ 0xf7, 0x6, 0xb2, 0xf7, 0x33, 0x1b, 0x13, 0xd8,
+ 0xa5, 0xde, 0x5, 0x13, 0xe8, 0x75, 0x69, 0x8c,
+ 0x5b, 0x1b, 0xfb, 0x5d, 0x8c, 0xfb, 0x67, 0xfb,
+ 0x50, 0xfb, 0x89, 0x1a, 0x20, 0xd3, 0x30, 0xf7,
+ 0xc, 0xf7, 0x7, 0xf7, 0x8, 0xf7, 0x7, 0xf7,
+ 0x8, 0xe3, 0x5b, 0xe4, 0xfb, 0x6, 0x56, 0x73,
+ 0x7f, 0x75, 0x5d, 0x1e, 0x65, 0xfb, 0x1c, 0x15,
+ 0x8b, 0xc0, 0xd8, 0xdf, 0xd3, 0x9b, 0x53, 0x60,
+ 0x40, 0x46, 0x59, 0x51, 0x41, 0x65, 0xe0, 0xc9,
+ 0x99, 0x1e, 0xe, 0xf9, 0x6, 0x77, 0x1, 0xab,
+ 0xf8, 0x69, 0x3, 0xab, 0x5d, 0x15, 0xcb, 0x6c,
+ 0xf8, 0x6b, 0xf9, 0x32, 0x49, 0xac, 0x5, 0xe,
+ 0xe, 0x84, 0x76, 0xb0, 0x76, 0xf7, 0xaa, 0xe8,
+ 0xf7, 0x33, 0xe8, 0x12, 0xf7, 0x21, 0xea, 0x36,
+ 0xed, 0x13, 0xb8, 0x52, 0xa, 0x13, 0x74, 0x3d,
+ 0xa, 0x7b, 0x7d, 0x87, 0x81, 0x7e, 0x1f, 0xb6,
+ 0xc1, 0xa0, 0xbb, 0xd1, 0x1a, 0xf7, 0x69, 0x89,
+ 0xa, 0xfb, 0x84, 0x6, 0x13, 0xb8, 0x86, 0x9b,
+ 0x8a, 0x9b, 0x9a, 0x1a, 0xcb, 0xc9, 0x47, 0xa,
+ 0x21, 0x3e, 0xfb, 0x10, 0x7a, 0x89, 0x7a, 0x8d,
+ 0x7a, 0x1f, 0x3b, 0x82, 0xa, 0x13, 0xb4, 0xf7,
+ 0x1, 0x6, 0x8a, 0x2e, 0x59, 0x33, 0x43, 0x5a,
+ 0x8, 0xe, 0x7c, 0xe7, 0xf7, 0x96, 0xe8, 0xf7,
+ 0x1a, 0x77, 0x1, 0xf4, 0xf7, 0xe3, 0x15, 0xd1,
+ 0x6, 0x62, 0x98, 0xa, 0x88, 0x7b, 0x89, 0x7e,
+ 0x7e, 0x1a, 0x29, 0xe9, 0x7b, 0xcf, 0xe0, 0xe6,
+ 0xab, 0xa6, 0xda, 0x1e, 0x8e, 0xe7, 0x5, 0x7c,
+ 0x5f, 0xfb, 0xc, 0x5f, 0x43, 0x1b, 0x53, 0x76,
+ 0x9f, 0xa4, 0x98, 0x8d, 0x99, 0x8e, 0x99, 0x1f,
+ 0xb2, 0xf7, 0x40, 0x5, 0xf7, 0x91, 0x89, 0xa,
+ 0xfb, 0x93, 0x6, 0xa9, 0xf7, 0x1a, 0x5, 0x23,
+ 0x6, 0x6f, 0xfb, 0x1a, 0x5, 0x44, 0x6, 0xe,
+ 0xfb, 0x22, 0xe4, 0xd5, 0xe4, 0xf7, 0xa6, 0xe5,
+ 0xca, 0xe4, 0x1, 0xd5, 0xe9, 0xf7, 0xfd, 0xed,
+ 0x3, 0x85, 0x56, 0x15, 0x77, 0x32, 0x5, 0xf7,
+ 0xd7, 0x6, 0x9e, 0xe4, 0x85, 0xa, 0xa9, 0xf7,
+ 0x18, 0x5, 0x7c, 0x9c, 0xb7, 0x60, 0xdb, 0x1b,
+ 0xf7, 0x2d, 0xf7, 0x1b, 0xf7, 0x13, 0xf7, 0x24,
+ 0xf7, 0xa, 0xfb, 0x1, 0xbf, 0x30, 0x55, 0x52,
+ 0x84, 0x6c, 0x5c, 0x1f, 0xb6, 0xf7, 0x5e, 0x5,
+ 0xfb, 0x45, 0x6, 0x78, 0x32, 0x5, 0xdd, 0x6,
+ 0xfb, 0x10, 0xfc, 0xe2, 0x5, 0xf7, 0x2e, 0xf7,
+ 0xa3, 0x15, 0xf7, 0x13, 0xf7, 0x10, 0xa6, 0xc3,
+ 0xce, 0xc1, 0x67, 0x49, 0x2f, 0x2e, 0x47, 0x36,
+ 0x64, 0x38, 0xa6, 0xdc, 0x8a, 0x1e, 0xe, 0x7c,
+ 0xe8, 0xf7, 0x2b, 0xe9, 0xf7, 0x5b, 0xe9, 0x12,
+ 0xf8, 0x3c, 0xef, 0x3f, 0xf0, 0x13, 0xf0, 0xbd,
+ 0xb3, 0x15, 0x79, 0xba, 0xd0, 0x66, 0xee, 0x1b,
+ 0xf7, 0x0, 0xf7, 0x2b, 0xc6, 0xf7, 0x31, 0xcb,
+ 0x6b, 0xa7, 0x66, 0xa9, 0x1f, 0x13, 0xe8, 0xb2,
+ 0x9f, 0xc2, 0xc8, 0xd4, 0x1a, 0xe0, 0x44, 0xc1,
+ 0x2b, 0x3f, 0x47, 0x68, 0x65, 0x47, 0x1e, 0xac,
+ 0x42, 0x5, 0xb2, 0xdb, 0xb1, 0x98, 0xb6, 0x1b,
+ 0xaf, 0xbb, 0x7c, 0x60, 0x29, 0xfb, 0xc, 0x5f,
+ 0x50, 0x8c, 0x1f, 0x78, 0x2d, 0x5, 0x13, 0xf0,
+ 0xdd, 0xe7, 0xaa, 0x50, 0x3f, 0x3b, 0x5c, 0x44,
+ 0x57, 0x6d, 0x95, 0xab, 0x34, 0x1f, 0xe, 0x5e,
+ 0xc4, 0x58, 0x76, 0xf7, 0x9, 0xca, 0xf7, 0x3d,
+ 0xce, 0xe6, 0xcb, 0x4b, 0xf7, 0x57, 0x49, 0x77,
+ 0xf4, 0x77, 0x12, 0x13, 0xbb, 0xf7, 0x98, 0xc4,
+ 0x15, 0xf7, 0x19, 0x6, 0x82, 0x5e, 0x5, 0x52,
+ 0x6, 0x80, 0x52, 0x5, 0xf7, 0x39, 0x6, 0x96,
+ 0xc4, 0x5, 0x62, 0x6, 0x93, 0xb8, 0x5, 0xb5,
+ 0x6, 0x97, 0xca, 0x5, 0x62, 0x6, 0xae, 0xf7,
+ 0x46, 0x5, 0x4a, 0x6, 0xfb, 0x41, 0x98, 0xa,
+ 0xdc, 0x9b, 0x15, 0xd0, 0xda, 0x7d, 0x3c, 0x5,
+ 0xfc, 0x56, 0xfb, 0x12, 0x15, 0x13, 0x7b, 0xc6,
+ 0x55, 0xf9, 0xb, 0xf9, 0x34, 0x4d, 0xbc, 0x5,
+ 0xfc, 0xfd, 0xfb, 0xe6, 0x15, 0x71, 0xbc, 0xaa,
+ 0x83, 0xad, 0x1b, 0xdf, 0xce, 0xc7, 0xd2, 0x1f,
+ 0x8c, 0xa4, 0x82, 0xa3, 0x79, 0x9c, 0x8, 0x9b,
+ 0x95, 0xa0, 0xaf, 0xa9, 0x1a, 0x13, 0xb4, 0xba,
+ 0x6b, 0xac, 0x51, 0x5f, 0x61, 0x77, 0x72, 0x64,
+ 0x1e, 0xa5, 0x51, 0x5, 0x13, 0xbb, 0x9b, 0xa7,
+ 0xad, 0xa0, 0xa9, 0x1b, 0x98, 0x9a, 0x86, 0x78,
+ 0x6e, 0x71, 0x7f, 0x73, 0x1f, 0x5c, 0x8c, 0x7e,
+ 0x4a, 0x5, 0xc3, 0x6, 0xac, 0x96, 0x7a, 0x78,
+ 0x6d, 0x70, 0x72, 0x67, 0x65, 0x70, 0x9a, 0x9a,
+ 0x6e, 0x1f, 0xe, 0xf7, 0x72, 0xd6, 0xf0, 0xd4,
+ 0xf7, 0x25, 0x77, 0x1, 0xf8, 0x5, 0xdd, 0x3,
+ 0xf7, 0x1a, 0xf7, 0x98, 0x15, 0x6f, 0xc5, 0xb0,
+ 0x81, 0xb4, 0x1b, 0xe8, 0xe3, 0xcc, 0xd8, 0x1f,
+ 0x8d, 0xa9, 0x81, 0xa7, 0x74, 0x9e, 0x8, 0x9f,
+ 0x97, 0xa5, 0xb3, 0xae, 0x1a, 0xbe, 0x62, 0xb0,
+ 0x46, 0x57, 0x5a, 0x74, 0x6f, 0x5a, 0x1e, 0xaa,
+ 0x4b, 0x5, 0x9d, 0xad, 0xb3, 0xa2, 0xb0, 0x1b,
+ 0x99, 0x9e, 0x84, 0x79, 0x8c, 0x1f, 0x69, 0x69,
+ 0x7f, 0x6b, 0x1e, 0x58, 0x6, 0x7c, 0x42, 0x5,
+ 0xcd, 0x6, 0xb2, 0x99, 0x79, 0x76, 0x68, 0x69,
+ 0x70, 0x62, 0x1f, 0x89, 0x6, 0x60, 0x69, 0x9c,
+ 0x9b, 0x69, 0x1f, 0xe, 0xf8, 0x84, 0xdb, 0x1,
+ 0xda, 0xf8, 0x4e, 0x3, 0xda, 0xf8, 0x99, 0x15,
+ 0xd8, 0x73, 0x5, 0xa1, 0x9d, 0x9e, 0xb5, 0xae,
+ 0x1b, 0xa0, 0x9f, 0x7d, 0x7b, 0xa0, 0x1f, 0x7c,
+ 0xa0, 0xa2, 0x7b, 0xa4, 0x1b, 0xec, 0xbb, 0xdf,
+ 0xad, 0x9c, 0x1f, 0x3e, 0xa1, 0x5, 0x63, 0x71,
+ 0x7f, 0x77, 0x6f, 0x1b, 0x78, 0x78, 0x96, 0x98,
+ 0x77, 0x1f, 0x9b, 0x72, 0x71, 0x9d, 0x6f, 0x1b,
+ 0x2e, 0x5f, 0x40, 0x61, 0x72, 0x1f, 0xe, 0xf8,
+ 0x95, 0xbc, 0x12, 0xad, 0xbf, 0xf7, 0x14, 0xbe,
+ 0xf7, 0x43, 0xcb, 0x6e, 0xbe, 0x13, 0xf0, 0xf7,
+ 0x6a, 0xf7, 0x7a, 0x15, 0xbe, 0x6, 0xc8, 0xf7,
+ 0xc0, 0x98, 0xfb, 0xc0, 0x5, 0xcd, 0x6, 0xf7,
+ 0x16, 0xf7, 0xbf, 0x5, 0x13, 0xe8, 0x4f, 0xfb,
+ 0xbf, 0x5, 0xbe, 0x6, 0xcf, 0xf7, 0xe0, 0x7a,
+ 0xa, 0xfb, 0x5, 0xfb, 0xa1, 0x82, 0xf7, 0xa1,
+ 0x5, 0x2e, 0x6, 0xfb, 0x8d, 0xfb, 0xe0, 0x15,
+ 0xbf, 0x6, 0xc4, 0xf7, 0xaf, 0x5, 0xe3, 0x6,
+ 0x96, 0xbc, 0x5, 0xfb, 0x77, 0x6, 0x81, 0x5a,
+ 0x5, 0xe2, 0x6, 0xe, 0xe9, 0x77, 0xf8, 0x55,
+ 0xe8, 0x1, 0xf7, 0x1e, 0xee, 0xf7, 0x7a, 0xee,
+ 0x3, 0xad, 0x16, 0xf8, 0x49, 0x6, 0xad, 0xf7,
+ 0x35, 0x5, 0x2d, 0x6, 0x7d, 0x48, 0x5, 0xfb,
+ 0x4e, 0x6, 0xf7, 0x2e, 0xf7, 0x5, 0x5, 0xf7,
+ 0x0, 0xda, 0xe8, 0xc9, 0xf7, 0xe, 0x1a, 0xdb,
+ 0x51, 0xcd, 0xfb, 0xd, 0x39, 0x45, 0x77, 0x36,
+ 0x3c, 0x1e, 0x79, 0x33, 0x5, 0xee, 0x6, 0xf1,
+ 0x9b, 0xf6, 0x89, 0x91, 0x1b, 0xc1, 0xba, 0x6f,
+ 0x57, 0x53, 0x6c, 0x6a, 0x45, 0x57, 0x1f, 0xfb,
+ 0xd1, 0xfb, 0x74, 0x5, 0xe, 0xf7, 0x70, 0xd6,
+ 0xf7, 0x88, 0xd8, 0x1, 0xf7, 0x50, 0xde, 0xf7,
+ 0xc, 0xde, 0x3, 0xf7, 0x11, 0xf7, 0x70, 0x15,
+ 0xf7, 0xb8, 0x6, 0x9b, 0xd6, 0x5, 0xfb, 0x38,
+ 0x6, 0xf7, 0x14, 0xea, 0x5, 0xae, 0xa3, 0xb5,
+ 0xba, 0xbe, 0x1a, 0xb4, 0x75, 0xca, 0x2b, 0x55,
+ 0x55, 0x72, 0x62, 0x5f, 0x1e, 0x7b, 0x3b, 0x5,
+ 0xde, 0x6, 0x8e, 0x96, 0x5, 0x9c, 0x8f, 0x94,
+ 0xb4, 0xc0, 0x1b, 0xa1, 0xa8, 0x85, 0x6f, 0x71,
+ 0x80, 0x78, 0x71, 0x79, 0x1f, 0xfb, 0x6c, 0xfb,
+ 0x27, 0x5, 0xe, 0x7c, 0xe8, 0x3a, 0xea, 0xf7,
+ 0x90, 0xea, 0x12, 0x13, 0xa0, 0xb2, 0xf7, 0xec,
+ 0x15, 0xdc, 0x6, 0x67, 0xfb, 0x4d, 0x5, 0x85,
+ 0x74, 0x89, 0x76, 0x79, 0x1a, 0x37, 0xd0, 0x6f,
+ 0xde, 0xbe, 0xc0, 0xa7, 0xa5, 0xb7, 0x1e, 0x13,
+ 0x60, 0x81, 0x61, 0x5, 0xf7, 0x43, 0x6, 0x9e,
+ 0xea, 0x5, 0x3b, 0x6, 0xd0, 0xf7, 0xef, 0x8f,
+ 0xa, 0x6, 0x78, 0x2c, 0x5, 0xda, 0x6, 0x65,
+ 0x98, 0xa, 0x13, 0xa0, 0x6b, 0x63, 0x5b, 0x63,
+ 0x4d, 0x1b, 0x54, 0x7a, 0xa4, 0xa2, 0x97, 0x8c,
+ 0x96, 0x8c, 0x93, 0x1f, 0xc3, 0xf7, 0xae, 0x43,
+ 0xa, 0x67, 0xa, 0xf7, 0x78, 0xf8, 0x75, 0x15,
+ 0xf7, 0xe9, 0xd9, 0x76, 0xf1, 0xfb, 0xde, 0xfb,
+ 0xb, 0x5, 0xfb, 0x47, 0xfb, 0x53, 0x15, 0xdc,
+ 0x6, 0x67, 0xfb, 0x5b, 0x5, 0x8a, 0x78, 0x84,
+ 0x26, 0xa, 0x57, 0xa, 0xf7, 0x6b, 0x77, 0x12,
+ 0x13, 0xb0, 0xf7, 0x52, 0xf8, 0x70, 0x15, 0xf7,
+ 0x44, 0xf7, 0x0, 0xf7, 0x14, 0xfb, 0x0, 0xcc,
+ 0xb0, 0xfb, 0x16, 0xf7, 0x24, 0x4e, 0xa, 0xfb,
+ 0x57, 0xfb, 0x23, 0x5, 0x2a, 0xfb, 0x37, 0x27,
+ 0xa, 0x57, 0xa, 0xc6, 0xf7, 0x10, 0x12, 0x13,
+ 0xb0, 0xf8, 0xe, 0xf8, 0x89, 0x92, 0xa, 0xa3,
+ 0xf7, 0x10, 0x86, 0xa, 0xfb, 0x62, 0xfb, 0x10,
+ 0x92, 0xa, 0xa4, 0xf7, 0x10, 0x4c, 0xa, 0xfb,
+ 0x4b, 0xfb, 0xa6, 0x27, 0xa, 0x67, 0xa, 0xf7,
+ 0x5d, 0xf8, 0xc6, 0x15, 0xf7, 0xbf, 0x3b, 0xae,
+ 0xc6, 0xfb, 0xa3, 0xf7, 0xc, 0x5, 0xfb, 0x75,
+ 0xfb, 0xca, 0x27, 0xa, 0xfb, 0x11, 0xbd, 0x1,
+ 0x90, 0x40, 0x15, 0x81, 0x59, 0x5, 0xf8, 0xed,
+ 0x6, 0x95, 0xbd, 0x5, 0xe, 0xa0, 0x76, 0xf7,
+ 0xed, 0xe9, 0x1, 0xf7, 0x4d, 0xdb, 0x3, 0xf7,
+ 0x4d, 0x16, 0xdb, 0x6, 0xf7, 0x87, 0xf7, 0xed,
+ 0x5, 0xe0, 0x3f, 0xa, 0xfb, 0x87, 0x87, 0xa,
+ 0xc7, 0x6, 0xfb, 0x34, 0xfb, 0x82, 0x44, 0xf7,
+ 0x82, 0x5, 0xce, 0x55, 0xa, 0xfb, 0x98, 0x44,
+ 0xa, 0xe1, 0x6, 0xe, 0xa0, 0x76, 0xf7, 0xed,
+ 0xe9, 0x1, 0xf7, 0x24, 0x16, 0xf7, 0x9, 0xf7,
+ 0x67, 0xb8, 0xfb, 0x67, 0x5, 0xd7, 0x6, 0xf7,
+ 0x47, 0xf7, 0xed, 0x5, 0xbc, 0x3f, 0xa, 0xfb,
+ 0x67, 0x44, 0xa, 0xd2, 0x6, 0x2b, 0xfb, 0x4d,
+ 0x5f, 0xf7, 0x65, 0x5, 0x48, 0x6, 0xfb, 0xc,
+ 0xfb, 0x65, 0x72, 0xf7, 0x4d, 0x5, 0xd1, 0x55,
+ 0xa, 0xfb, 0x6e, 0x44, 0xa, 0xbc, 0x6, 0xb8,
+ 0xfb, 0xed, 0x5, 0xe, 0x7f, 0xa, 0xd6, 0xf7,
+ 0x15, 0xf7, 0x39, 0xf7, 0x1a, 0x3, 0x6b, 0x16,
+ 0xf7, 0x8b, 0x55, 0xa, 0x6c, 0x6, 0xe7, 0xce,
+ 0xd4, 0x48, 0x5, 0x6f, 0x6f, 0xa, 0xf7, 0x8c,
+ 0x3f, 0xa, 0x36, 0x6, 0xfb, 0x17, 0xf7, 0x11,
+ 0xf7, 0x30, 0xf7, 0x12, 0x5, 0xe0, 0x3f, 0xa,
+ 0xfb, 0x79, 0x44, 0xa, 0x9d, 0x6, 0x3a, 0x48,
+ 0x5c, 0xce, 0x5, 0xa0, 0x3f, 0xa, 0xfb, 0x85,
+ 0x44, 0xa, 0xe2, 0x6, 0xef, 0xfb, 0x14, 0xfb,
+ 0x3a, 0xfb, 0xf, 0x5, 0x33, 0x6, 0xe, 0xfb,
+ 0x22, 0xe3, 0xf8, 0x29, 0xe3, 0x1, 0xe3, 0xf7,
+ 0x3, 0xf7, 0x8f, 0xf7, 0x1, 0x3, 0x67, 0x55,
+ 0x15, 0x76, 0x33, 0x5, 0xf7, 0xc0, 0x6, 0xa0,
+ 0xe3, 0x5, 0x45, 0x6, 0xf8, 0x1, 0xf8, 0x29,
+ 0x5c, 0xa, 0x9f, 0xe3, 0x5, 0xfb, 0x7f, 0x6,
+ 0x77, 0x33, 0x5, 0xbb, 0x6, 0xfb, 0x3c, 0xfb,
+ 0x4d, 0x38, 0xf7, 0x4d, 0x5, 0xbd, 0x6, 0x9f,
+ 0xe3, 0x5, 0xfb, 0x83, 0x6, 0x77, 0x33, 0x5c,
+ 0xa, 0xf7, 0xb, 0xfb, 0xa0, 0xfb, 0x11, 0xfb,
+ 0x1d, 0x5, 0xe, 0xfb, 0x22, 0xe2, 0xf8, 0x25,
+ 0xe3, 0x1, 0xe2, 0xf7, 0x4, 0xf7, 0x8e, 0xf7,
+ 0x2, 0x3, 0xf7, 0x8c, 0xf8, 0x7f, 0x15, 0xf7,
+ 0xec, 0xd4, 0x76, 0xec, 0xfb, 0xe2, 0xfb, 0x6,
+ 0x5, 0xfb, 0xa5, 0xfc, 0xee, 0x6b, 0xa, 0xf8,
+ 0x1, 0xf8, 0x25, 0x5, 0xd9, 0x84, 0xa, 0xfb,
+ 0x80, 0x6, 0x77, 0x34, 0x5, 0xbb, 0x6, 0xfb,
+ 0x40, 0xfb, 0x4a, 0x4d, 0xa, 0xfb, 0x9d, 0xfb,
+ 0xe, 0xfb, 0x1d, 0x5, 0xe, 0xfb, 0x22, 0xe2,
+ 0xf8, 0x26, 0xe2, 0xd4, 0xf7, 0xa, 0x1, 0xe2,
+ 0xf7, 0x4, 0xf7, 0x8f, 0xf7, 0x2, 0x3, 0xf8,
+ 0x24, 0xf8, 0x8f, 0x15, 0xf7, 0x9, 0x6, 0xa4,
+ 0xf7, 0xa, 0x5, 0xfb, 0x8, 0x6, 0xfb, 0x6b,
+ 0xfb, 0xa, 0x15, 0xf7, 0x8, 0x6, 0xa5, 0xf7,
+ 0xa, 0x5, 0xfb, 0x8, 0x6, 0xfb, 0xa5, 0xfd,
+ 0x3c, 0x6b, 0xa, 0xf8, 0x2, 0xf8, 0x26, 0x5,
+ 0xd8, 0x84, 0xa, 0xfb, 0x7f, 0x6, 0x77, 0x34,
+ 0x5, 0xbb, 0x6, 0xfb, 0x41, 0xfb, 0x4b, 0x4d,
+ 0xa, 0xfb, 0x9e, 0xfb, 0xe, 0xfb, 0x1c, 0x5,
+ 0xe, 0x8b, 0xe2, 0xbe, 0xbd, 0xc3, 0xbc, 0xf7,
+ 0x4a, 0xe2, 0x1, 0xa3, 0x16, 0xf7, 0xdb, 0x6,
+ 0x9e, 0xe2, 0x5, 0xfb, 0xa, 0x6, 0x97, 0xbe,
+ 0x70, 0xa, 0x95, 0xbd, 0x5, 0xfb, 0x29, 0x6,
+ 0x9a, 0xc3, 0x70, 0xa, 0x97, 0xbc, 0x5, 0xfb,
+ 0x22, 0x6, 0xf7, 0x5f, 0xf7, 0x4a, 0x5c, 0xa,
+ 0x9e, 0xe2, 0x5, 0xfb, 0x83, 0x6, 0x77, 0x34,
+ 0x5, 0xb8, 0x6, 0xfb, 0x11, 0xfb, 0x8, 0x41,
+ 0xf7, 0x8, 0x5, 0xb9, 0x6, 0x9e, 0xe2, 0x5,
+ 0xfb, 0x88, 0x6, 0x78, 0x34, 0x5, 0xdd, 0x6,
+ 0xf7, 0x10, 0xfb, 0x4a, 0x5, 0xfb, 0x26, 0x6,
+ 0x81, 0x5a, 0x70, 0xa, 0x7c, 0x53, 0x85, 0xa,
+ 0x82, 0x59, 0x70, 0xa, 0x7f, 0x58, 0x83, 0xa,
+ 0xe, 0x8b, 0xe9, 0xf7, 0x90, 0xe8, 0x1, 0xf2,
+ 0xed, 0xf7, 0x6c, 0xed, 0x3, 0xad, 0x16, 0xf8,
+ 0x4e, 0x6, 0xb2, 0xf7, 0x50, 0x5, 0x29, 0x44,
+ 0xa, 0xfb, 0x55, 0x6, 0xf7, 0xef, 0xf7, 0xa9,
+ 0x99, 0xcf, 0x5, 0xfc, 0x3f, 0x6, 0x67, 0xfb,
+ 0x46, 0x56, 0xa, 0x9c, 0xe0, 0x5, 0xf7, 0x43,
+ 0x6, 0xfb, 0xec, 0xfb, 0xa6, 0x5, 0xe, 0x8b,
+ 0xe6, 0xf7, 0x89, 0xe5, 0xc7, 0xd5, 0x1, 0xe8,
+ 0xea, 0xf7, 0x5d, 0xe9, 0x3, 0xf7, 0xb9, 0xf8,
+ 0x7a, 0x15, 0xec, 0x6, 0xf7, 0x4d, 0xf7, 0x24,
+ 0x58, 0xb0, 0xfb, 0x3f, 0x20, 0xfb, 0xf, 0xf6,
+ 0x46, 0x67, 0x5, 0xfb, 0x1d, 0xfd, 0xb, 0x15,
+ 0xf8, 0x3d, 0x6, 0xad, 0xf7, 0x3c, 0x5, 0x2d,
+ 0x6, 0x7a, 0x3e, 0x5, 0xfb, 0x49, 0x6, 0xf7,
+ 0xde, 0xf7, 0xa2, 0x98, 0xcc, 0x5, 0xfc, 0x2d,
+ 0x6, 0x6b, 0xfb, 0x2d, 0x5, 0xea, 0x6, 0x98,
+ 0xca, 0x5, 0xf7, 0x3a, 0x6, 0xfb, 0xdd, 0xfb,
+ 0x9e, 0x5, 0xe, 0x7c, 0xe9, 0xf8, 0x4f, 0xe9,
+ 0x1, 0xd3, 0xec, 0xf7, 0x9b, 0xeb, 0x3, 0xd3,
+ 0xf7, 0x50, 0x15, 0x2b, 0xa9, 0x20, 0xf7, 0x1b,
+ 0xf7, 0x91, 0xb1, 0xf7, 0xe3, 0xf7, 0xd, 0xe5,
+ 0x61, 0xe0, 0xfb, 0xc, 0xfb, 0x88, 0x59, 0xfb,
+ 0xd2, 0xfb, 0x2, 0x1e, 0xec, 0x9d, 0x15, 0xf7,
+ 0x10, 0xd1, 0xf7, 0x54, 0xf5, 0xee, 0x7f, 0x31,
+ 0x56, 0x3e, 0x58, 0xfb, 0x73, 0xfb, 0xe, 0x3b,
+ 0x81, 0xca, 0xcb, 0x1e, 0xe, 0x79, 0x9d, 0xf8,
+ 0x4b, 0x9f, 0xf6, 0x99, 0x9f, 0x9f, 0x6, 0xfb,
+ 0x26, 0x8f, 0x7, 0x1e, 0xa0, 0x39, 0x63, 0xff,
+ 0xc, 0x9, 0xe8, 0xa, 0xe8, 0xb, 0x8c, 0xc,
+ 0xe, 0xf8, 0xec, 0x14, 0xac, 0x13, 0x0, 0x79,
+ 0x2, 0x0, 0x1, 0x0, 0x3b, 0x0, 0x4d, 0x0,
+ 0x89, 0x0, 0x8d, 0x0, 0xcb, 0x1, 0x15, 0x1,
+ 0x51, 0x1, 0x5d, 0x1, 0x65, 0x1, 0x6c, 0x1,
+ 0x94, 0x1, 0xb0, 0x1, 0xc5, 0x1, 0xdd, 0x1,
+ 0xf8, 0x2, 0x16, 0x2, 0x2e, 0x2, 0x3b, 0x2,
+ 0x44, 0x2, 0x59, 0x2, 0x5e, 0x2, 0x72, 0x2,
+ 0x77, 0x2, 0x7c, 0x2, 0x93, 0x2, 0xba, 0x2,
+ 0xc1, 0x2, 0xcb, 0x2, 0xd0, 0x2, 0xf2, 0x2,
+ 0xf7, 0x2, 0xfc, 0x3, 0x4, 0x3, 0xd, 0x3,
+ 0x12, 0x3, 0x15, 0x3, 0x1a, 0x3, 0x22, 0x3,
+ 0x27, 0x3, 0x3c, 0x3, 0x49, 0x3, 0x55, 0x3,
+ 0x5c, 0x3, 0x61, 0x3, 0x66, 0x3, 0x77, 0x3,
+ 0x7b, 0x3, 0x8e, 0x3, 0x9b, 0x3, 0xae, 0x3,
+ 0xc1, 0x3, 0xcc, 0x3, 0xd7, 0x3, 0xdc, 0x3,
+ 0xe0, 0x3, 0xe8, 0x3, 0xf0, 0x3, 0xf8, 0x3,
+ 0xfd, 0x4, 0x2, 0x4, 0x6, 0x4, 0xe, 0x4,
+ 0x16, 0x4, 0x1e, 0x4, 0x27, 0x4, 0x2e, 0x4,
+ 0x34, 0x4, 0x3a, 0x4, 0x40, 0x4, 0x45, 0x4,
+ 0x49, 0x4, 0x52, 0x4, 0x5a, 0x4, 0x66, 0x4,
+ 0x74, 0x4, 0x7f, 0x4, 0x8a, 0x4, 0x8f, 0x4,
+ 0x94, 0x4, 0x99, 0x4, 0x9e, 0x4, 0xa2, 0x4,
+ 0xa9, 0x4, 0xb5, 0x4, 0xba, 0x4, 0xc0, 0x4,
+ 0xc6, 0x4, 0xcc, 0x4, 0xd2, 0x4, 0xd8, 0x4,
+ 0xdc, 0x4, 0xe0, 0x4, 0xe4, 0x4, 0xe8, 0x4,
+ 0xf3, 0x4, 0xfa, 0x5, 0x0, 0x5, 0x7, 0x5,
+ 0xc, 0x5, 0x11, 0x5, 0x16, 0x5, 0x1b, 0x5,
+ 0x20, 0x5, 0x25, 0x5, 0x2a, 0x5, 0x2f, 0x5,
+ 0x33, 0x5, 0x3d, 0x5, 0x47, 0x5, 0x50, 0x5,
+ 0x58, 0x5, 0x5c, 0x5, 0x65, 0x5, 0x6a, 0x5,
+ 0x6f, 0x5, 0x74, 0x5, 0x79, 0x5, 0x7e, 0x5,
+ 0x82, 0x5, 0x86, 0x5, 0x8a, 0xf7, 0x8d, 0x6,
+ 0x9f, 0xe5, 0x5, 0x30, 0x6, 0xb9, 0xd7, 0x5,
+ 0xf7, 0x84, 0x6, 0x9f, 0x3f, 0x5, 0x33, 0x3c,
+ 0xa, 0xf7, 0x88, 0x37, 0xa, 0x51, 0x6, 0xfb,
+ 0x1, 0xf8, 0x64, 0x5, 0xfb, 0x91, 0x3c, 0xa,
+ 0xf7, 0x15, 0x6, 0xfb, 0x8e, 0x7c, 0xa, 0x4e,
+ 0x6, 0xf7, 0x9d, 0xf7, 0x3a, 0x15, 0xf7, 0xa,
+ 0xf7, 0x3d, 0xb6, 0xfb, 0x3d, 0x5, 0xb, 0x22,
+ 0xa, 0x1f, 0x13, 0xbc, 0x3b, 0xa, 0x1e, 0x13,
+ 0x7c, 0xa1, 0xf7, 0x1, 0x15, 0x13, 0xbc, 0x2c,
+ 0xa, 0x15, 0xf7, 0x41, 0x42, 0xa, 0x3c, 0x6,
+ 0xac, 0xf7, 0x36, 0x5, 0x91, 0xa8, 0x90, 0xaa,
+ 0xa7, 0x1a, 0xcf, 0x46, 0xa9, 0x46, 0x2e, 0xfb,
+ 0x6, 0x6f, 0x74, 0x51, 0x1e, 0x9f, 0x3c, 0x5,
+ 0x9c, 0xa6, 0xef, 0xa1, 0xd6, 0x1b, 0xbc, 0xb0,
+ 0x7b, 0x69, 0x84, 0x8a, 0x83, 0x88, 0x83, 0x1f,
+ 0x8f, 0x68, 0x64, 0x8e, 0x67, 0x1b, 0xfb, 0x8a,
+ 0x6e, 0xfb, 0x20, 0x64, 0xb, 0x15, 0x20, 0xa,
+ 0xe, 0x15, 0xfb, 0x28, 0xf7, 0x1, 0x43, 0xf7,
+ 0x8, 0xf7, 0x44, 0xf7, 0x34, 0xf7, 0x9, 0xf7,
+ 0x89, 0xf7, 0x6, 0x48, 0xf4, 0xfb, 0x29, 0xfb,
+ 0x57, 0xfb, 0x2a, 0xfb, 0x2f, 0xfb, 0x62, 0x1e,
+ 0xef, 0x9e, 0x15, 0xf7, 0x4, 0x8a, 0xe4, 0xf7,
+ 0x1f, 0xf7, 0x1e, 0x1b, 0xf7, 0x5, 0xa6, 0x33,
+ 0x46, 0x8a, 0x1f, 0x2a, 0x3d, 0xfb, 0x27, 0xfb,
+ 0x23, 0x29, 0x5d, 0xd2, 0xda, 0x1e, 0xe, 0x15,
+ 0xdc, 0x6, 0x54, 0xfb, 0x9c, 0x5, 0x86, 0x73,
+ 0x89, 0x75, 0x77, 0x1a, 0x2d, 0xc8, 0x55, 0xf7,
+ 0xd, 0xf7, 0x15, 0xe9, 0xac, 0xf7, 0x48, 0xb0,
+ 0x1e, 0xc2, 0xf7, 0x9d, 0x5, 0xdb, 0x46, 0xa,
+ 0xfb, 0xa2, 0x6, 0x79, 0x31, 0x5, 0xeb, 0x6,
+ 0x57, 0xfb, 0x95, 0x5, 0x36, 0x79, 0x6b, 0x5e,
+ 0x24, 0x1b, 0x3b, 0x75, 0xab, 0xb0, 0x8a, 0x1f,
+ 0x9a, 0x8d, 0x9a, 0x8e, 0x9a, 0x1e, 0xc3, 0xf7,
+ 0xa5, 0x5, 0xea, 0x46, 0xa, 0xfb, 0xa2, 0x6,
+ 0xb, 0x7a, 0x7b, 0x1a, 0x43, 0xd0, 0x60, 0xdd,
+ 0xbf, 0xc0, 0xa6, 0xa5, 0xb7, 0x1e, 0x13, 0x70,
+ 0x81, 0x62, 0x5, 0xf7, 0x43, 0x37, 0xa, 0x3b,
+ 0x6, 0xd0, 0xf7, 0xf7, 0x8f, 0xa, 0x36, 0xa,
+ 0xda, 0x6, 0x65, 0xfb, 0x63, 0x5, 0x13, 0xb0,
+ 0x6c, 0x63, 0x5b, 0x64, 0x4d, 0x1b, 0x54, 0x7a,
+ 0xa2, 0xa1, 0x97, 0x8c, 0x96, 0x8c, 0x93, 0x1f,
+ 0xc3, 0xf7, 0xb8, 0x43, 0xa, 0x15, 0xdc, 0x6,
+ 0x67, 0xfb, 0x5b, 0x5, 0x85, 0x78, 0x89, 0x26,
+ 0xa, 0x15, 0x33, 0xa, 0x13, 0xd8, 0x2a, 0xa,
+ 0xe, 0x30, 0xa, 0x26, 0xfb, 0x44, 0x2d, 0xa,
+ 0x7b, 0x42, 0x56, 0xa, 0xbc, 0xf7, 0x80, 0x4e,
+ 0xa, 0x7c, 0x41, 0x4c, 0xa, 0xa7, 0xf7, 0x1e,
+ 0x88, 0xa, 0x72, 0xfb, 0x8, 0x56, 0xa, 0xb6,
+ 0xf7, 0x62, 0x5, 0xfc, 0xa1, 0x6, 0x79, 0x31,
+ 0x8a, 0xa, 0x3d, 0x7c, 0xa, 0x37, 0x6, 0xb,
+ 0xf8, 0x55, 0x37, 0xa, 0xfb, 0x40, 0x6, 0xdb,
+ 0xf8, 0xa, 0x5, 0xf7, 0x3e, 0x37, 0xa, 0xfc,
+ 0x51, 0x3c, 0xa, 0xf7, 0x41, 0x6, 0x3b, 0xfc,
+ 0xa, 0x3e, 0xa, 0xb, 0x61, 0x53, 0x49, 0x6a,
+ 0x48, 0x1b, 0x66, 0x65, 0x98, 0xa4, 0xc3, 0xe4,
+ 0x9d, 0xc3, 0xc5, 0xb1, 0x84, 0x89, 0xa8, 0x1f,
+ 0xe, 0x1e, 0xf1, 0xa2, 0x15, 0xef, 0xea, 0xca,
+ 0xf5, 0xf7, 0x3, 0xb0, 0x54, 0x56, 0x20, 0xfb,
+ 0x5, 0x55, 0x35, 0x53, 0x2d, 0xa3, 0xdd, 0x1e,
+ 0xe, 0x15, 0x9d, 0xe6, 0x5, 0xf7, 0x33, 0x6,
+ 0xdb, 0xf7, 0x94, 0x5, 0xfb, 0x35, 0x34, 0xa,
+ 0xf7, 0x98, 0x6, 0x25, 0xfb, 0xef, 0x5, 0xf7,
+ 0x4d, 0x4b, 0xa, 0xe, 0x5, 0x6d, 0x44, 0x3c,
+ 0x74, 0x3f, 0x1b, 0xfb, 0xf, 0x82, 0xb9, 0xaf,
+ 0x87, 0x1f, 0x9b, 0xe6, 0x15, 0xc4, 0xac, 0xd5,
+ 0xb0, 0xc8, 0x1b, 0xca, 0xd8, 0x6e, 0x4a, 0x8c,
+ 0x1f, 0xe, 0x15, 0xfb, 0x12, 0xf7, 0x18, 0x5b,
+ 0xf3, 0xf7, 0x1a, 0xf7, 0x49, 0xe6, 0xf7, 0x49,
+ 0xe9, 0x48, 0xe0, 0xfb, 0x32, 0xfb, 0x32, 0xfb,
+ 0x3c, 0xb, 0x3c, 0xf7, 0x2a, 0xea, 0xe0, 0xa1,
+ 0xb5, 0xdd, 0x1f, 0x7a, 0xdb, 0x2f, 0xa, 0x35,
+ 0xa, 0xfb, 0x4a, 0x93, 0xa, 0xd3, 0x31, 0xa,
+ 0xf8, 0xa4, 0x6, 0xb5, 0xf7, 0x5e, 0x7a, 0xa,
+ 0x73, 0xfb, 0x4, 0x95, 0xa, 0xab, 0xf7, 0x27,
+ 0x5, 0xf7, 0x4, 0x6, 0xb, 0x6, 0x9e, 0xe6,
+ 0x5, 0xb, 0x15, 0xf8, 0x21, 0x6, 0x94, 0xa3,
+ 0x97, 0xc0, 0xa9, 0x1a, 0xee, 0x89, 0x30, 0xd1,
+ 0xfb, 0x9, 0x1b, 0xfb, 0x17, 0xb, 0x6, 0x78,
+ 0x30, 0x5, 0xb, 0x6, 0x9e, 0xe5, 0x5, 0xb,
+ 0x49, 0xa, 0xbf, 0x3a, 0xfb, 0xa, 0x42, 0x3d,
+ 0x35, 0x1e, 0xd9, 0x95, 0x15, 0xb7, 0xaf, 0xb3,
+ 0xc8, 0xb5, 0xa5, 0x73, 0x53, 0xa, 0xb, 0x15,
+ 0x4d, 0xba, 0x57, 0xe3, 0xed, 0xef, 0xd2, 0xe9,
+ 0xc7, 0x58, 0xbe, 0x37, 0x27, 0x29, 0x3f, 0x35,
+ 0x1e, 0xdc, 0x91, 0x15, 0xba, 0xb2, 0xb2, 0xc7,
+ 0xba, 0xa4, 0x72, 0x6c, 0x56, 0x52, 0x70, 0x5e,
+ 0x62, 0x6f, 0xa3, 0xa5, 0x1e, 0xb, 0x8b, 0xe6,
+ 0xf8, 0x10, 0xe6, 0x1, 0xb, 0x52, 0xbf, 0x51,
+ 0xf0, 0xda, 0xb6, 0xa2, 0xae, 0xca, 0xb, 0x6,
+ 0x78, 0x31, 0x5, 0xb, 0x84, 0xa3, 0xa3, 0x83,
+ 0xa1, 0x1b, 0xd5, 0xc5, 0xbd, 0xa4, 0xa6, 0x1f,
+ 0x5f, 0xca, 0x5, 0x77, 0x6e, 0x69, 0x72, 0x67,
+ 0x1b, 0x7a, 0x76, 0x91, 0x92, 0x76, 0x1f, 0x92,
+ 0x75, 0x75, 0x92, 0x76, 0x1b, 0xb, 0x5, 0xfb,
+ 0x43, 0x6, 0xb, 0x6, 0x9e, 0xe9, 0x5, 0xb,
+ 0x8b, 0xe5, 0xd7, 0xe5, 0xf7, 0x64, 0xe5, 0xb,
+ 0x7c, 0xe7, 0x3b, 0xe6, 0xf0, 0xe5, 0xcd, 0xe6,
+ 0xb, 0x6, 0x9d, 0xe6, 0x5, 0xb, 0x3e, 0xa,
+ 0xe, 0x6, 0x78, 0x2d, 0x5, 0xb, 0x1, 0xa3,
+ 0xf1, 0xf7, 0xf1, 0xef, 0x3, 0xb, 0x6, 0x9d,
+ 0xe5, 0x5, 0xb, 0xbb, 0xd5, 0xbf, 0xb5, 0x73,
+ 0x5c, 0x99, 0x1e, 0xe6, 0xb0, 0x5, 0xb9, 0x78,
+ 0x69, 0xdc, 0xfb, 0x15, 0x1b, 0xfb, 0x22, 0xb,
+ 0x15, 0xee, 0x6, 0xf7, 0x53, 0xf7, 0x25, 0x57,
+ 0xaf, 0xfb, 0x45, 0x5e, 0xa, 0x15, 0x4f, 0xbb,
+ 0x58, 0xde, 0xf1, 0xe1, 0xd2, 0xe7, 0xc7, 0x5c,
+ 0xb, 0x64, 0xa, 0xf7, 0xf, 0x65, 0xa, 0xb,
+ 0x6, 0x79, 0x30, 0x5, 0xb, 0x5, 0xfb, 0x3,
+ 0x6, 0xb, 0x3d, 0xf7, 0x4b, 0x5, 0xbd, 0x84,
+ 0xa, 0xfb, 0x84, 0x6, 0x77, 0x34, 0x5c, 0xa,
+ 0xf7, 0x8, 0xb, 0x5, 0x29, 0x6, 0xb, 0x15,
+ 0x6b, 0xa2, 0x73, 0xad, 0xb7, 0xb5, 0xb5, 0xba,
+ 0xbb, 0x72, 0x99, 0x6a, 0x5a, 0x67, 0x5e, 0x59,
+ 0x1e, 0xb, 0x16, 0x60, 0xa, 0xa8, 0x7a, 0xa4,
+ 0x63, 0x54, 0x6e, 0x5f, 0x67, 0x1e, 0xb, 0x15,
+ 0xf7, 0x62, 0xfb, 0x55, 0xc0, 0xc5, 0xfb, 0x26,
+ 0xf7, 0x1b, 0xf7, 0x26, 0xf7, 0xf, 0x56, 0xc7,
+ 0x5, 0xb, 0xa7, 0xaf, 0x15, 0xb2, 0x4b, 0x5,
+ 0x93, 0x99, 0xcd, 0xb1, 0xbc, 0x1b, 0xa0, 0xa3,
+ 0x84, 0x83, 0xa4, 0x1f, 0xb, 0x6d, 0x55, 0x56,
+ 0x70, 0x5d, 0x61, 0x73, 0xa2, 0xa7, 0x1e, 0xb,
+ 0x8b, 0xe5, 0xd5, 0xf7, 0x36, 0x32, 0xe4, 0xf7,
+ 0x1e, 0xe5, 0xb, 0x6, 0x9f, 0xe9, 0x5, 0xb,
+ 0x5, 0xed, 0x6, 0xb, 0x7c, 0xe4, 0x3e, 0xe5,
+ 0xf7, 0x9c, 0xe6, 0xb, 0x1, 0x9e, 0xef, 0xf8,
+ 0x1, 0xeb, 0x3, 0xb, 0x1, 0xf3, 0xe9, 0xf7,
+ 0x8b, 0xe9, 0x3, 0xb, 0x15, 0xf7, 0x4, 0x6,
+ 0xb, 0x6, 0x9e, 0xe7, 0x5, 0xb, 0x5, 0xd9,
+ 0x6, 0xb, 0x63, 0xa, 0xf7, 0x75, 0x77, 0x45,
+ 0xa, 0xb, 0x22, 0xfb, 0x10, 0xf5, 0x45, 0x69,
+ 0x5, 0xe, 0x61, 0xa, 0xf7, 0x77, 0x77, 0x76,
+ 0xa, 0xb, 0x71, 0xa2, 0x72, 0xb1, 0xba, 0xac,
+ 0xb3, 0xb0, 0xb, 0x7c, 0xe6, 0xdd, 0xe6, 0xe9,
+ 0xe6, 0xb, 0x1, 0xf7, 0x67, 0xf1, 0x3, 0xb,
+ 0x7c, 0xe6, 0xf7, 0xa1, 0xe6, 0xb, 0x15, 0xf7,
+ 0x6, 0x6, 0xa5, 0xb, 0x5, 0xfb, 0x5, 0x6,
+ 0xb, 0x5, 0x2a, 0x6, 0xb, 0x57, 0xa, 0xf7,
+ 0x6f, 0x77, 0x12, 0x13, 0xb0, 0xb, 0x75, 0xa,
+ 0xf7, 0x7a, 0x77, 0x62, 0xa, 0xb, 0xf8, 0x8f,
+ 0x5a, 0xa, 0xaa, 0xf7, 0x2b, 0x5, 0xfb, 0x4,
+ 0x6, 0xb, 0xb1, 0x4c, 0xf7, 0x66, 0xf7, 0x2e,
+ 0xfb, 0x1b, 0xf7, 0x32, 0x4d, 0x57, 0xc5, 0xb,
+ 0x15, 0x76, 0x34, 0x5, 0xf7, 0xc0, 0x84, 0xa,
+ 0x46, 0x6, 0xb, 0x5, 0xda, 0x6, 0x9d, 0xe8,
+ 0x5, 0xfb, 0xa0, 0x82, 0xa, 0xb, 0x15, 0xf7,
+ 0x5, 0x6, 0xb, 0x6, 0x77, 0x30, 0x5, 0xb,
+ 0x6, 0x77, 0x2d, 0x5, 0xb, 0x5, 0xf7, 0x28,
+ 0x6, 0xb, 0xf7, 0xb1, 0x5, 0xb, 0x64, 0xa,
+ 0xf7, 0x10, 0x83, 0xa, 0xb, 0x15, 0xf8, 0x63,
+ 0x6, 0x9e, 0xf7, 0x2, 0x5, 0xfc, 0x63, 0x6,
+ 0xb, 0x6, 0x3c, 0x7d, 0xa, 0xb, 0x8b, 0xe5,
+ 0xf8, 0xa, 0xe5, 0xb, 0x1, 0xf8, 0x66, 0xe8,
+ 0x3, 0xb, 0x79, 0xe4, 0xf8, 0x25, 0xe6, 0xb,
+ 0x8b, 0xe6, 0xf7, 0x94, 0xe6, 0xb, 0x79, 0xe6,
+ 0xf8, 0x17, 0xe5, 0xb, 0x5, 0x2b, 0x6, 0xb,
+ 0x5, 0x28, 0x6, 0xb, 0xfc, 0xa, 0x5, 0xb,
+ 0xfc, 0x10, 0x5, 0xb, 0x5, 0xfb, 0x4c, 0x6,
+ 0x79, 0x2e, 0x5, 0xd8, 0x6, 0x3f, 0xb, 0x8b,
+ 0xe9, 0xf7, 0x8f, 0xe9, 0x1, 0xb, 0x6, 0xf7,
+ 0x55, 0x71, 0xa, 0xb, 0x8b, 0xe9, 0xf8, 0x4a,
+ 0xe9, 0x1, 0xb, 0x6, 0x78, 0x2e, 0x5, 0xb,
+ 0x5, 0xfb, 0x6, 0x6, 0xb, 0x6, 0x9f, 0xe2,
+ 0x5, 0xb, 0x5, 0xfb, 0x28, 0x6, 0xb, 0x5,
+ 0xfb, 0x2, 0x6, 0xb, 0x6, 0x79, 0x2d, 0x5,
+ 0xb, 0x5, 0xf7, 0x8f, 0x6, 0xb, 0x6, 0x9f,
+ 0xe8, 0x5, 0xb, 0x5, 0xdb, 0x6, 0xb, 0xf7,
+ 0x1b, 0xc5, 0x98, 0x1f, 0xe7, 0xf8, 0x2e, 0x5,
+ 0xb, 0xda, 0xf7, 0xb, 0xa4, 0x1f, 0xc5, 0xf7,
+ 0xb6, 0x5, 0xb, 0x5, 0xfb, 0x45, 0x6, 0x79,
+ 0x32, 0x8a, 0xa, 0xb, 0x65, 0xca, 0xfb, 0x66,
+ 0xfb, 0x2e, 0x5, 0xe, 0x5, 0xfb, 0x42, 0xb,
+ 0x55, 0x15, 0x77, 0x33, 0x5, 0xf7, 0xd7, 0x6,
+ 0xb, 0xf7, 0x73, 0x77, 0x1, 0xb, 0x15, 0xf7,
+ 0x3, 0x6, 0xb, 0x28, 0xfb, 0x42, 0x2a, 0xb,
+ 0x6, 0x9e, 0xe8, 0x5, 0xb, 0x5, 0xfb, 0x90,
+ 0x6, 0xb, 0x5, 0xec, 0x6, 0xb, 0xf7, 0x20,
+ 0x5, 0xb, 0xfb, 0x56, 0x5, 0xb
+ };
diff --git a/core/src/fxge/fontdata/chromefontdata/FoxitFixedItalic.c b/core/src/fxge/fontdata/chromefontdata/FoxitFixedItalic.c
new file mode 100644
index 0000000000..d8409bab29
--- /dev/null
+++ b/core/src/fxge/fontdata/chromefontdata/FoxitFixedItalic.c
@@ -0,0 +1,2352 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+const unsigned char g_FoxitFixedItalicFontData [18746] = {0x1,
+ 0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0x15,
+ 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x46, 0x69, 0x78,
+ 0x65, 0x64, 0x4f, 0x54, 0x46, 0x2d, 0x49, 0x74,
+ 0x61, 0x6c, 0x69, 0x63, 0x0, 0x1, 0x1, 0x1,
+ 0x23, 0xf8, 0x10, 0x0, 0xf8, 0x2a, 0x1, 0xf8,
+ 0x2b, 0x2, 0xf8, 0x2c, 0x3, 0xf8, 0x18, 0x4,
+ 0x5b, 0xfb, 0x8d, 0xf9, 0x2b, 0xf9, 0xb7, 0x5,
+ 0xf7, 0xa3, 0xf, 0xf9, 0xc, 0x11, 0xaa, 0x1c,
+ 0x42, 0x78, 0x12, 0x0, 0x12, 0x1, 0x1, 0x5,
+ 0x7, 0x9, 0x11, 0x19, 0x1f, 0x25, 0x29, 0x2d,
+ 0x39, 0x42, 0x49, 0x53, 0x5c, 0x65, 0x8f, 0xa5,
+ 0xb4, 0x49, 0x64, 0x6f, 0x74, 0x49, 0x4a, 0x69,
+ 0x6a, 0x53, 0x63, 0x65, 0x64, 0x69, 0x6c, 0x6c,
+ 0x61, 0x73, 0x63, 0x65, 0x64, 0x69, 0x6c, 0x6c,
+ 0x61, 0x47, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x67,
+ 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x6c, 0x69, 0x72,
+ 0x61, 0x45, 0x75, 0x72, 0x6f, 0x70, 0x72, 0x65,
+ 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f,
+ 0x6e, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x6c, 0x65,
+ 0x66, 0x74, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x75,
+ 0x70, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x72, 0x69,
+ 0x67, 0x68, 0x74, 0x61, 0x72, 0x72, 0x6f, 0x77,
+ 0x64, 0x6f, 0x77, 0x6e, 0x61, 0x72, 0x72, 0x6f,
+ 0x77, 0x62, 0x6f, 0x74, 0x68, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x43,
+ 0x68, 0x72, 0x6f, 0x6d, 0x20, 0x46, 0x69, 0x78,
+ 0x65, 0x64, 0x20, 0x4f, 0x54, 0x46, 0x20, 0x49,
+ 0x74, 0x61, 0x6c, 0x69, 0x63, 0x43, 0x68, 0x72,
+ 0x6F, 0x6D, 0x20, 0x46, 0x69, 0x78, 0x65, 0x64,
+ 0x20, 0x4f, 0x54, 0x46, 0x0, 0x0, 0x1, 0x0,
+ 0x1, 0x6, 0x0, 0x68, 0x0, 0x0, 0x9, 0x37,
+ 0x0, 0x7c, 0x0, 0x0, 0x42, 0x20, 0x0, 0x67,
+ 0x0, 0x0, 0x64, 0x0, 0x0, 0xa0, 0x0, 0x0,
+ 0x66, 0x0, 0x0, 0x83, 0x0, 0x0, 0xaa, 0x0,
+ 0x0, 0x8b, 0x0, 0x0, 0x6a, 0x0, 0x0, 0x97,
+ 0x0, 0x0, 0xa5, 0x0, 0x0, 0x80, 0x0, 0x0,
+ 0xa1, 0x0, 0x0, 0x9c, 0x0, 0x0, 0xa4, 0x0,
+ 0x0, 0xa9, 0x0, 0x0, 0x7d, 0x0, 0x0, 0x98,
+ 0x0, 0x0, 0x73, 0x0, 0x0, 0x72, 0x0, 0x0,
+ 0x85, 0x0, 0x0, 0x96, 0x0, 0x0, 0x8f, 0x0,
+ 0x0, 0x78, 0x0, 0x0, 0x9e, 0x0, 0x0, 0x9b,
+ 0x0, 0x0, 0xa3, 0x0, 0x0, 0x7b, 0x0, 0x0,
+ 0xae, 0x0, 0x0, 0xab, 0x1, 0x0, 0xb0, 0x0,
+ 0x0, 0xad, 0x0, 0x0, 0xaf, 0x0, 0x0, 0x8a,
+ 0x0, 0x0, 0xb1, 0x0, 0x0, 0xb5, 0x0, 0x0,
+ 0xb2, 0x2, 0x0, 0xb9, 0x0, 0x0, 0xb6, 0x2,
+ 0x0, 0x9a, 0x0, 0x0, 0xba, 0x0, 0x0, 0xbe,
+ 0x0, 0x0, 0xbb, 0x1, 0x0, 0xbf, 0x0, 0x0,
+ 0xbd, 0x0, 0x0, 0xa8, 0x0, 0x0, 0x8d, 0x0,
+ 0x0, 0xc4, 0x0, 0x0, 0xc1, 0x2, 0x0, 0xc5,
+ 0x0, 0x0, 0x9d, 0x0, 0x0, 0x95, 0x0, 0x0,
+ 0xcb, 0x0, 0x0, 0xc9, 0x0, 0x0, 0xc8, 0x0,
+ 0x0, 0xcd, 0x0, 0x0, 0xca, 0x0, 0x0, 0xcc,
+ 0x0, 0x0, 0x90, 0x0, 0x0, 0xce, 0x0, 0x0,
+ 0xd2, 0x0, 0x0, 0xcf, 0x2, 0x0, 0xd6, 0x0,
+ 0x0, 0xd3, 0x2, 0x0, 0xa7, 0x0, 0x0, 0xd7,
+ 0x0, 0x0, 0xdb, 0x0, 0x0, 0xd8, 0x1, 0x0,
+ 0xdc, 0x0, 0x0, 0xda, 0x0, 0x0, 0x9f, 0x0,
+ 0x0, 0x93, 0x0, 0x0, 0xe1, 0x0, 0x0, 0xde,
+ 0x2, 0x0, 0xe2, 0x0, 0x0, 0xa2, 0x0, 0x0,
+ 0xe3, 0x0, 0x1, 0x87, 0x0, 0x0, 0x91, 0x0,
+ 0x1, 0x88, 0x1, 0x0, 0x8c, 0x0, 0x0, 0x92,
+ 0x0, 0x0, 0x8e, 0x0, 0x0, 0x94, 0x0, 0x1,
+ 0x8a, 0x1, 0x0, 0xc0, 0x0, 0x0, 0xdd, 0x0,
+ 0x0, 0xc6, 0x1, 0x0, 0xe4, 0x0, 0x0, 0x65,
+ 0x0, 0x1, 0x8c, 0x1, 0x0, 0x7e, 0x0, 0x0,
+ 0x88, 0x0, 0x0, 0x81, 0x1, 0x0, 0x84, 0x0,
+ 0x0, 0x87, 0x0, 0x0, 0x7f, 0x0, 0x0, 0x86,
+ 0x0, 0x0, 0x6f, 0x0, 0x0, 0x89, 0x0, 0x0,
+ 0x41, 0x0, 0x0, 0x8, 0x0, 0x0, 0x75, 0x0,
+ 0x0, 0x69, 0x0, 0x0, 0x77, 0x0, 0x0, 0x76,
+ 0x0, 0x0, 0x70, 0x1, 0x0, 0x74, 0x0, 0x0,
+ 0x79, 0x1, 0x0, 0x6b, 0x1, 0x0, 0x63, 0x0,
+ 0x1, 0x8e, 0x2, 0x0, 0x99, 0x0, 0x1, 0x91,
+ 0x4, 0x0, 0xa6, 0x0, 0x0, 0x6d, 0x1, 0x0,
+ 0xf4, 0x2, 0x0, 0x1, 0x0, 0x2, 0x0, 0x3,
+ 0x0, 0x2f, 0x0, 0x62, 0x0, 0xd0, 0x1, 0x55,
+ 0x1, 0xb1, 0x2, 0x3c, 0x2, 0x50, 0x2, 0x87,
+ 0x2, 0xbe, 0x2, 0xf5, 0x3, 0x21, 0x3, 0x2f,
+ 0x3, 0x43, 0x3, 0x52, 0x3, 0x67, 0x3, 0xab,
+ 0x3, 0xd2, 0x4, 0x22, 0x4, 0x80, 0x4, 0xc1,
+ 0x5, 0x11, 0x5, 0x67, 0x5, 0x8f, 0x6, 0x0,
+ 0x6, 0x57, 0x6, 0x6f, 0x6, 0x8f, 0x6, 0xb2,
+ 0x6, 0xd4, 0x6, 0xf7, 0x7, 0x5b, 0x7, 0xf8,
+ 0x8, 0x32, 0x8, 0x9f, 0x8, 0xf3, 0x9, 0x2e,
+ 0x9, 0x77, 0x9, 0xc3, 0x9, 0xd7, 0xa, 0x28,
+ 0xa, 0x48, 0xa, 0x84, 0xa, 0xd7, 0xb, 0x1,
+ 0xb, 0x48, 0xb, 0x83, 0xb, 0xcd, 0xc, 0x1a,
+ 0xc, 0xb7, 0xd, 0x19, 0xd, 0x88, 0xd, 0xbc,
+ 0xe, 0x12, 0xe, 0x3d, 0xe, 0x7f, 0xe, 0xd2,
+ 0xf, 0x7, 0xf, 0x3e, 0xf, 0x5e, 0xf, 0x81,
+ 0xf, 0xa4, 0xf, 0xd4, 0xf, 0xe5, 0xf, 0xf5,
+ 0x10, 0x45, 0x10, 0xaa, 0x10, 0xfe, 0x11, 0x65,
+ 0x11, 0xb9, 0x12, 0xa, 0x12, 0x1f, 0x12, 0x6b,
+ 0x12, 0xa0, 0x12, 0xe2, 0x13, 0x30, 0x13, 0x53,
+ 0x13, 0xca, 0x14, 0x29, 0x14, 0x70, 0x14, 0xd7,
+ 0x15, 0x3f, 0x15, 0x84, 0x15, 0xed, 0x16, 0x39,
+ 0x16, 0x8f, 0x16, 0xbb, 0x16, 0xff, 0x17, 0x52,
+ 0x17, 0x92, 0x17, 0xc4, 0x18, 0x2b, 0x18, 0x45,
+ 0x18, 0xac, 0x18, 0xea, 0x19, 0x19, 0x19, 0x77,
+ 0x19, 0xe6, 0x1a, 0x67, 0x1a, 0xca, 0x1a, 0xe9,
+ 0x1b, 0x82, 0x1b, 0x9e, 0x1c, 0x23, 0x1c, 0x8a,
+ 0x1c, 0xbd, 0x1c, 0xd8, 0x1d, 0x60, 0x1d, 0x73,
+ 0x1d, 0xb0, 0x1d, 0xee, 0x1e, 0x31, 0x1e, 0x97,
+ 0x1e, 0xa9, 0x1e, 0xee, 0x1f, 0x27, 0x1f, 0x48,
+ 0x1f, 0x84, 0x1f, 0xa8, 0x1f, 0xe7, 0x20, 0x1c,
+ 0x20, 0x89, 0x20, 0xfc, 0x21, 0xaa, 0x22, 0x9,
+ 0x22, 0x27, 0x22, 0x4e, 0x22, 0x7b, 0x22, 0xc6,
+ 0x22, 0xe9, 0x23, 0x2f, 0x23, 0x9f, 0x24, 0x22,
+ 0x24, 0x40, 0x24, 0x63, 0x24, 0x89, 0x24, 0xb7,
+ 0x24, 0xd4, 0x25, 0x14, 0x25, 0x3e, 0x25, 0x6d,
+ 0x25, 0xc8, 0x26, 0x49, 0x26, 0x67, 0x26, 0x88,
+ 0x26, 0xae, 0x26, 0xff, 0x27, 0x31, 0x27, 0x60,
+ 0x27, 0xe8, 0x27, 0xfd, 0x28, 0x16, 0x28, 0x3f,
+ 0x28, 0x61, 0x28, 0x80, 0x28, 0xd1, 0x29, 0x5b,
+ 0x29, 0x71, 0x29, 0x97, 0x29, 0xad, 0x2a, 0x13,
+ 0x2a, 0x36, 0x2a, 0x7f, 0x2b, 0x2d, 0x2b, 0xaf,
+ 0x2b, 0xcd, 0x2b, 0xea, 0x2c, 0x19, 0x2c, 0x4a,
+ 0x2c, 0x65, 0x2c, 0x96, 0x2c, 0xba, 0x2c, 0xda,
+ 0x2d, 0x51, 0x2d, 0xf4, 0x2e, 0xc, 0x2e, 0x23,
+ 0x2e, 0x49, 0x2e, 0x92, 0x2e, 0xb9, 0x2e, 0xeb,
+ 0x2f, 0x6a, 0x2f, 0x89, 0x2f, 0xa8, 0x2f, 0xd0,
+ 0x2f, 0xf8, 0x30, 0x4b, 0x30, 0xb6, 0x31, 0x1b,
+ 0x31, 0x40, 0x31, 0x66, 0x31, 0xc3, 0x32, 0x29,
+ 0x32, 0x65, 0x32, 0x9f, 0x33, 0x0, 0x33, 0x8c,
+ 0x34, 0x39, 0x34, 0xe5, 0x35, 0x70, 0x36, 0x2,
+ 0x36, 0x2d, 0x36, 0x71, 0x36, 0xb3, 0x37, 0xa,
+ 0x37, 0x28, 0x37, 0x49, 0x37, 0x6b, 0x37, 0x8d,
+ 0x37, 0xb6, 0x37, 0xc6, 0x37, 0xfd, 0x38, 0x2e,
+ 0x38, 0x6f, 0x38, 0x8e, 0x38, 0x9e, 0x38, 0xae,
+ 0x38, 0xbf, 0x38, 0xd5, 0x38, 0xe4, 0x39, 0x7,
+ 0x39, 0x24, 0x39, 0x40, 0x39, 0x70, 0x39, 0xb6,
+ 0x39, 0xd4, 0x39, 0xf4, 0x3a, 0x2f, 0x3a, 0x4e,
+ 0x3a, 0x6e, 0x3a, 0x81, 0x3b, 0x1, 0x3b, 0x88,
+ 0x3c, 0x0, 0x3c, 0x53, 0x3c, 0x74, 0x3c, 0x9e,
+ 0x3c, 0xbe, 0x3c, 0xe3, 0x3d, 0x1d, 0x3d, 0x2c,
+ 0x3d, 0xa7, 0x3e, 0x14, 0xe, 0xe, 0x7c, 0xf7,
+ 0xc, 0x1, 0xf7, 0x9f, 0xb7, 0x3, 0xf7, 0x9f,
+ 0xf7, 0x49, 0x15, 0xb7, 0x6, 0xee, 0xf8, 0x1b,
+ 0x5, 0x3d, 0x6, 0xfb, 0x22, 0xfc, 0xab, 0x15,
+ 0x6e, 0x9d, 0x74, 0xb0, 0xb3, 0xb3, 0xa8, 0xb3,
+ 0xaa, 0x72, 0x9f, 0x68, 0x66, 0x65, 0x69, 0x69,
+ 0x1e, 0xe, 0xf7, 0xdc, 0xf7, 0x7e, 0x12, 0xf7,
+ 0x3e, 0xb6, 0x7d, 0xdb, 0xb5, 0xb5, 0x7e, 0xda,
+ 0x13, 0xd0, 0xf7, 0xd5, 0xf7, 0xdc, 0x15, 0x13,
+ 0xc8, 0xa8, 0x64, 0xa, 0xda, 0x6, 0x13, 0xd0,
+ 0x49, 0xfb, 0x7e, 0x5, 0xfb, 0x55, 0x16, 0x13,
+ 0xb0, 0xa8, 0x64, 0xa, 0xdb, 0x6, 0x13, 0xd0,
+ 0x49, 0xfb, 0x7e, 0x5, 0xe, 0xf7, 0x5e, 0xf7,
+ 0x34, 0xbf, 0xf7, 0x75, 0x1, 0xf7, 0x2a, 0xf7,
+ 0x1a, 0xbb, 0xf7, 0x39, 0x3, 0xf2, 0x4c, 0x15,
+ 0xba, 0x6, 0xc1, 0xf7, 0x69, 0x5, 0xf7, 0x16,
+ 0x6, 0x59, 0xfb, 0x69, 0x5, 0xbb, 0x6, 0xbf,
+ 0xf7, 0x69, 0x5, 0xf2, 0x6, 0x95, 0xbf, 0x5,
+ 0x27, 0x6, 0xb4, 0xf7, 0x34, 0x5, 0xe3, 0x6,
+ 0x95, 0xbf, 0x5, 0x33, 0x6, 0xc1, 0xf7, 0x75,
+ 0x5, 0x5b, 0x6, 0x54, 0xfb, 0x75, 0x83, 0xa,
+ 0xc1, 0xf7, 0x75, 0x5, 0x5b, 0x6, 0x51, 0xfb,
+ 0x75, 0x5, 0x25, 0x6, 0x81, 0x57, 0x5, 0xf1,
+ 0x6, 0x64, 0xfb, 0x34, 0x5, 0x2f, 0x6, 0x81,
+ 0x57, 0x5, 0xe5, 0x6, 0xca, 0xbf, 0x15, 0xb1,
+ 0xf7, 0x34, 0x5, 0xf7, 0x17, 0x6, 0x66, 0xfb,
+ 0x34, 0x5, 0xe, 0x22, 0x76, 0xf7, 0x2b, 0xc0,
+ 0xf8, 0x40, 0xbf, 0x1, 0xc3, 0xc0, 0xf7, 0xb,
+ 0xc3, 0xf7, 0x28, 0xc5, 0x3, 0xc3, 0x9c, 0x15,
+ 0xc0, 0x6, 0x96, 0xbe, 0xab, 0x77, 0xa9, 0x7d,
+ 0xb9, 0x81, 0x19, 0x6d, 0xfb, 0x2a, 0x51, 0xa,
+ 0xa9, 0xf7, 0x2b, 0x5, 0xf7, 0x0, 0xec, 0xbd,
+ 0xee, 0x8c, 0x1f, 0xd4, 0x45, 0xb1, 0x47, 0xa6,
+ 0x1e, 0x52, 0xa0, 0x2f, 0xa4, 0x89, 0xbc, 0x8,
+ 0xcd, 0xd9, 0xac, 0xcc, 0xba, 0xb6, 0x72, 0x75,
+ 0xad, 0x1e, 0x83, 0x66, 0x6a, 0xa, 0xa8, 0xf7,
+ 0x29, 0x5, 0x55, 0x6, 0x80, 0x54, 0x70, 0x9a,
+ 0x6e, 0x9d, 0x69, 0x8f, 0x19, 0x9f, 0xf7, 0x1,
+ 0x71, 0xa, 0x77, 0x23, 0x5, 0x57, 0x8a, 0xfb,
+ 0x21, 0x71, 0xfb, 0x1d, 0x1a, 0x45, 0xe6, 0x6c,
+ 0xd1, 0x72, 0x1e, 0xcb, 0x74, 0xce, 0x6c, 0x59,
+ 0x1a, 0x51, 0x3e, 0x6f, 0x29, 0x59, 0x5e, 0xa0,
+ 0xaa, 0x6d, 0x1e, 0x94, 0xb9, 0x52, 0xa, 0xe,
+ 0x7c, 0xc4, 0xf7, 0x28, 0xc2, 0xf7, 0x12, 0xc4,
+ 0xf7, 0x1f, 0xc2, 0x12, 0xf7, 0x13, 0xc4, 0xac,
+ 0xc4, 0xc3, 0xc5, 0xab, 0xc5, 0x17, 0xf7, 0x13,
+ 0xf8, 0x6b, 0x6d, 0xa, 0xba, 0x42, 0x35, 0x47,
+ 0x44, 0x3b, 0x1e, 0xc4, 0x94, 0x15, 0xbc, 0xae,
+ 0xb1, 0xc1, 0xad, 0xa2, 0x70, 0x72, 0xa, 0xfb,
+ 0x5, 0xfb, 0xb3, 0x15, 0xf8, 0x61, 0xf7, 0x43,
+ 0x5, 0x13, 0xc5, 0x86, 0xc1, 0xfc, 0x60, 0xfb,
+ 0x45, 0x5, 0xf7, 0x2a, 0xfb, 0x34, 0x6d, 0xa,
+ 0xc3, 0x42, 0x35, 0x47, 0x3b, 0x3b, 0x1e, 0xc4,
+ 0x94, 0x15, 0xbc, 0xae, 0xba, 0xc1, 0xad, 0xa2,
+ 0x67, 0x72, 0xa, 0xe, 0x7c, 0xbd, 0x67, 0xc3,
+ 0xf7, 0x38, 0xc3, 0xf7, 0x6d, 0xbe, 0x12, 0xc0,
+ 0xc0, 0xce, 0xc1, 0x13, 0x7c, 0xf7, 0xe1, 0xbd,
+ 0x15, 0xa6, 0x58, 0x5, 0xf7, 0x2b, 0x6, 0x95,
+ 0xc3, 0x5, 0xfb, 0x11, 0x6, 0x78, 0xae, 0xaf,
+ 0xaf, 0xa5, 0xbd, 0x9b, 0xb6, 0x19, 0xdc, 0x6,
+ 0x95, 0xc3, 0x5, 0xfb, 0xf, 0x6, 0x83, 0x60,
+ 0x72, 0x54, 0x67, 0x63, 0x21, 0xf7, 0x62, 0x18,
+ 0x88, 0x8f, 0x7a, 0xac, 0x8a, 0xab, 0x8, 0xc0,
+ 0xc1, 0xa6, 0xcf, 0xaf, 0xb2, 0x7d, 0x72, 0x9d,
+ 0x1e, 0xa7, 0xbb, 0x5, 0xab, 0x6d, 0x5d, 0x95,
+ 0x5d, 0x1b, 0x39, 0x2e, 0x60, 0x3d, 0x1f, 0x88,
+ 0x65, 0x9c, 0x67, 0x9b, 0x67, 0x8, 0xfb, 0x18,
+ 0x39, 0x79, 0x4b, 0x45, 0x1a, 0x13, 0xbc, 0x57,
+ 0xab, 0x50, 0xe2, 0xc2, 0xc7, 0xa3, 0xb4, 0xb9,
+ 0x1e, 0x76, 0xb9, 0x15, 0x75, 0x6e, 0x60, 0x64,
+ 0x54, 0x1b, 0x60, 0x68, 0xa2, 0xbe, 0x8a, 0x1f,
+ 0xd8, 0xd4, 0xc2, 0xbb, 0xa3, 0x1e, 0xe, 0xf7,
+ 0xee, 0x76, 0xf7, 0x81, 0x77, 0x1, 0xf7, 0x86,
+ 0xf7, 0xd9, 0x15, 0xb9, 0x6, 0xd0, 0xf7, 0x81,
+ 0x7b, 0xa, 0xe, 0x34, 0x76, 0xf9, 0x6e, 0x77,
+ 0x1, 0xf7, 0x3e, 0xbe, 0x3, 0xf7, 0x6e, 0xfb,
+ 0x0, 0x15, 0xbe, 0x6, 0x75, 0xc6, 0x71, 0xe2,
+ 0xeb, 0x1a, 0xf7, 0x4f, 0xee, 0xf7, 0x33, 0xf7,
+ 0x1, 0xf7, 0x22, 0x1e, 0x7a, 0x79, 0x8b, 0x7a,
+ 0x1b, 0xfb, 0x18, 0xfb, 0x37, 0x40, 0xfb, 0x29,
+ 0xfb, 0x46, 0x1a, 0x2c, 0xa1, 0x36, 0xa5, 0x4f,
+ 0x1e, 0xe, 0x34, 0x76, 0xf9, 0x6e, 0x77, 0x1,
+ 0xf8, 0xd, 0xbf, 0x3, 0xf7, 0x3e, 0xfb, 0x0,
+ 0x15, 0x9c, 0x9d, 0x8b, 0x9c, 0x1b, 0xf7, 0x18,
+ 0xf7, 0x37, 0xd6, 0xf7, 0x29, 0xf7, 0x46, 0x1a,
+ 0xea, 0x74, 0xe0, 0x71, 0xc7, 0x1e, 0x58, 0x6,
+ 0xa1, 0x50, 0xa5, 0x34, 0x2b, 0x1a, 0xfb, 0x4f,
+ 0x29, 0xfb, 0x33, 0xfb, 0x1, 0xfb, 0x22, 0x1e,
+ 0xe, 0xf7, 0x95, 0xf7, 0xf2, 0x1, 0xf7, 0x8,
+ 0xf8, 0x4, 0x3, 0xf7, 0x1d, 0xf7, 0xb5, 0x15,
+ 0xc0, 0x6b, 0xee, 0xf7, 0xe, 0xbb, 0xfb, 0xe,
+ 0xca, 0xab, 0x4a, 0xf7, 0x12, 0xf7, 0x29, 0xa7,
+ 0x82, 0xcd, 0xfb, 0x24, 0x5e, 0xae, 0xf7, 0x23,
+ 0x5, 0x46, 0x6, 0x74, 0xfb, 0x1d, 0xfb, 0x16,
+ 0xb2, 0x6f, 0x49, 0xf7, 0x17, 0x6e, 0x5, 0xe,
+ 0xf7, 0x79, 0xc1, 0x1, 0xf7, 0x79, 0xc3, 0x3,
+ 0xd5, 0xf7, 0x79, 0x15, 0xf7, 0x55, 0x6, 0x65,
+ 0xfb, 0x4d, 0x51, 0xa, 0xb1, 0xf7, 0x4d, 0x5,
+ 0xf7, 0x54, 0x4d, 0xa, 0xfb, 0x54, 0x6, 0xb1,
+ 0xf7, 0x4f, 0x71, 0xa, 0x65, 0xfb, 0x4f, 0x5,
+ 0xfb, 0x55, 0x6, 0xe, 0x30, 0x76, 0xf7, 0x7e,
+ 0x77, 0x1, 0xf7, 0x55, 0xfb, 0x4, 0x15, 0xcb,
+ 0x75, 0xa, 0xf7, 0x7b, 0xc1, 0x1, 0xec, 0xf8,
+ 0x2a, 0x3, 0xec, 0xf7, 0x7b, 0x15, 0xf8, 0x1e,
+ 0x47, 0xa, 0xfc, 0x1e, 0x6, 0xe, 0x7c, 0xf7,
+ 0x10, 0x1, 0xf7, 0x78, 0xf7, 0x24, 0x3, 0xf7,
+ 0x78, 0xae, 0x35, 0xa, 0xe, 0x3b, 0xf9, 0x59,
+ 0x1, 0xc1, 0xf8, 0x80, 0x3, 0xc1, 0x4f, 0x15,
+ 0xb6, 0x77, 0xf8, 0x55, 0xf9, 0x44, 0x63, 0xa0,
+ 0x5, 0xe, 0x7c, 0xc5, 0xf8, 0x77, 0xc1, 0x1,
+ 0xe5, 0xc0, 0xf7, 0xc8, 0xc6, 0x3, 0xe5, 0xf7,
+ 0x46, 0x15, 0x2f, 0xa8, 0x26, 0xf7, 0xe, 0xf7,
+ 0x78, 0xb4, 0xf7, 0xbe, 0xf7, 0xb, 0xe4, 0x67,
+ 0xe4, 0xfb, 0x3, 0xfb, 0x5a, 0x40, 0xfb, 0x8f,
+ 0xfb, 0x2b, 0x1e, 0xc0, 0x8e, 0x15, 0xf7, 0x13,
+ 0xd0, 0xf7, 0x6e, 0xf7, 0x1d, 0xdf, 0x9d, 0x41,
+ 0x4f, 0xfb, 0x46, 0x3b, 0xfb, 0x43, 0xfb, 0xd,
+ 0x39, 0x72, 0xd3, 0xd1, 0x1e, 0xe, 0x8b, 0xc2,
+ 0x54, 0xc6, 0xf8, 0x9f, 0x77, 0x1, 0xf7, 0xad,
+ 0xc2, 0x3, 0xe6, 0x16, 0xf8, 0x2a, 0x36, 0xa,
+ 0xfb, 0x40, 0x6, 0xf2, 0xf8, 0xa3, 0xfb, 0x7c,
+ 0x58, 0x80, 0x53, 0xf7, 0x42, 0xb0, 0x32, 0x7a,
+ 0xa, 0xfb, 0x47, 0x6, 0xe, 0x8b, 0xc2, 0x54,
+ 0xc6, 0xf8, 0x6b, 0xc0, 0x12, 0xf7, 0x34, 0xc3,
+ 0xf7, 0xaa, 0xc2, 0x13, 0xb8, 0xbe, 0x16, 0xf8,
+ 0x31, 0x6, 0xa3, 0xf7, 0x13, 0x52, 0xa, 0x7e,
+ 0x43, 0x5, 0xfb, 0xa9, 0x6, 0xf7, 0xff, 0xf7,
+ 0x7a, 0xb6, 0xb8, 0xf7, 0x9, 0x1a, 0xd3, 0x39,
+ 0xc8, 0x37, 0x3e, 0x4a, 0x7f, 0x43, 0x49, 0x1e,
+ 0x7c, 0x43, 0x51, 0xa, 0xe5, 0x99, 0xdb, 0x98,
+ 0xc4, 0x1b, 0xd3, 0xc2, 0x65, 0x53, 0x1f, 0x13,
+ 0x78, 0xfb, 0x7, 0xfb, 0x8b, 0xfb, 0xd, 0xfb,
+ 0x4d, 0xfb, 0x1e, 0x1e, 0xe, 0x7c, 0xc2, 0xf7,
+ 0x63, 0xc7, 0xf7, 0x96, 0xc4, 0x1, 0xf8, 0x31,
+ 0xc3, 0x3, 0xd3, 0xa2, 0x15, 0x71, 0xcc, 0xd0,
+ 0x7f, 0xce, 0x1b, 0xf7, 0x10, 0xf7, 0x0, 0xd0,
+ 0xf7, 0x17, 0xd5, 0x4d, 0xa3, 0x6d, 0x92, 0x1f,
+ 0xbd, 0xa4, 0xcc, 0xbb, 0xec, 0x1a, 0xda, 0x38,
+ 0xb3, 0x33, 0x8c, 0x1e, 0x4b, 0x49, 0x79, 0x6a,
+ 0x61, 0x1f, 0x9a, 0x58, 0x5, 0xa4, 0xa8, 0xcb,
+ 0xa3, 0xc9, 0x1b, 0xc6, 0xc2, 0x76, 0x53, 0x4a,
+ 0x39, 0x41, 0x20, 0x1f, 0x88, 0x6, 0x80, 0x4b,
+ 0x5, 0xc8, 0x8e, 0xf7, 0xb, 0x88, 0x43, 0x1a,
+ 0x32, 0x32, 0x59, 0x26, 0x50, 0x57, 0x97, 0xa3,
+ 0x5a, 0x1e, 0xe, 0x8b, 0xc7, 0xf3, 0xc6, 0xf7,
+ 0xa8, 0xcc, 0x1, 0xf7, 0xe8, 0xcd, 0x3, 0xde,
+ 0xf7, 0x38, 0x15, 0xf7, 0xa9, 0x6, 0x77, 0xfb,
+ 0x0, 0x5, 0x20, 0x60, 0xa, 0xf7, 0x91, 0x3c,
+ 0xa, 0x3b, 0x6, 0x9e, 0xf7, 0x0, 0x5, 0xdb,
+ 0x6, 0x96, 0xc6, 0x89, 0xa, 0xcf, 0xf7, 0xe9,
+ 0x5, 0x30, 0x6, 0xfb, 0xd4, 0xfb, 0xf0, 0x5,
+ 0xd8, 0x92, 0x15, 0xf7, 0x96, 0xf7, 0xa8, 0x51,
+ 0xfb, 0xa8, 0x5, 0xe, 0x7c, 0xc6, 0xf7, 0x9f,
+ 0xc6, 0xf7, 0x1e, 0xc3, 0x1, 0xf7, 0x1e, 0xcb,
+ 0xf7, 0x5d, 0xca, 0x3, 0xc2, 0xa5, 0x15, 0x6f,
+ 0xc4, 0xc7, 0x7e, 0xc3, 0x1b, 0xf7, 0x27, 0xf7,
+ 0x12, 0xd6, 0xf7, 0x22, 0xde, 0x45, 0xc8, 0x3a,
+ 0x5c, 0x54, 0x87, 0x72, 0x5d, 0x1f, 0xb2, 0xf7,
+ 0x53, 0x5, 0xf7, 0xb9, 0x3c, 0xa, 0xfb, 0xf1,
+ 0x6, 0x51, 0xfb, 0xc1, 0xb0, 0x81, 0x5, 0x9e,
+ 0xb5, 0xcb, 0x9d, 0xba, 0x1b, 0xd0, 0xb4, 0x63,
+ 0x54, 0x2d, 0x23, 0x50, 0x20, 0x55, 0x54, 0x96,
+ 0xa8, 0x62, 0x1f, 0xe, 0x7c, 0xc6, 0xf7, 0x99,
+ 0x76, 0xf7, 0x84, 0xc3, 0x1, 0xca, 0xc6, 0xf7,
+ 0x9f, 0xc9, 0x3, 0xf7, 0x16, 0xf7, 0x9c, 0x15,
+ 0xf7, 0x25, 0xa5, 0xf7, 0x4e, 0xf7, 0x7, 0xf7,
+ 0x4a, 0x1b, 0x98, 0xc3, 0x5, 0xfb, 0xa5, 0xfb,
+ 0x5d, 0xfb, 0x2f, 0xfb, 0x7c, 0xfb, 0x28, 0xd8,
+ 0x4f, 0xe8, 0xf7, 0x1d, 0xdc, 0xec, 0xf7, 0xc,
+ 0xe6, 0x34, 0xbb, 0x38, 0x4e, 0x50, 0x67, 0x62,
+ 0x6c, 0x1f, 0x83, 0x46, 0x15, 0xbc, 0xa0, 0xc9,
+ 0xb3, 0xca, 0x1b, 0xce, 0xc1, 0x6e, 0x44, 0x45,
+ 0x4e, 0x41, 0x2f, 0x36, 0x63, 0xd9, 0xd8, 0x96,
+ 0x1f, 0xe, 0xa0, 0x76, 0xf8, 0x91, 0xc2, 0x1,
+ 0xe0, 0xc0, 0xf7, 0xc8, 0xc5, 0x3, 0xf7, 0x32,
+ 0x16, 0xc6, 0x6, 0xf7, 0xb3, 0xf8, 0x8d, 0x96,
+ 0xc6, 0x5, 0xfc, 0x1d, 0x6, 0x66, 0xfb, 0x29,
+ 0x5, 0xc0, 0x6, 0xa6, 0xe9, 0x5, 0xf7, 0xad,
+ 0x6, 0xe, 0x7c, 0xc2, 0xf7, 0x6d, 0xc8, 0xf7,
+ 0x5f, 0xc6, 0x1, 0xd3, 0xcb, 0xf7, 0x9b, 0xc9,
+ 0x3, 0xf7, 0x60, 0xf7, 0xb9, 0x15, 0x64, 0x85,
+ 0x2e, 0x4a, 0x31, 0x1a, 0x2b, 0xcf, 0x58, 0xf6,
+ 0xf7, 0x25, 0xea, 0xd8, 0xf7, 0xb, 0xd0, 0x5a,
+ 0xa8, 0x6d, 0x99, 0x1e, 0xc0, 0x93, 0xce, 0xc9,
+ 0xea, 0x1a, 0xc3, 0x54, 0xcd, 0x23, 0xfb, 0x8,
+ 0xfb, 0x3, 0x44, 0xfb, 0xc, 0x1e, 0x8c, 0x5f,
+ 0xa4, 0x6b, 0xaf, 0x77, 0x8, 0x89, 0xec, 0x15,
+ 0xf7, 0x5, 0xf7, 0x6, 0xa1, 0xb0, 0xcf, 0xb9,
+ 0x63, 0x62, 0x41, 0x42, 0x57, 0x39, 0x6d, 0x3b,
+ 0x95, 0xc9, 0x1e, 0x49, 0xfb, 0xa1, 0x15, 0xf7,
+ 0x6, 0xf7, 0xa, 0xa5, 0xba, 0xcb, 0xc7, 0x61,
+ 0x5b, 0x2e, 0x28, 0x62, 0x47, 0x62, 0x3a, 0xa4,
+ 0xc6, 0x1e, 0xe, 0x7d, 0xc7, 0xf7, 0x41, 0xc4,
+ 0xf7, 0x8e, 0xc1, 0x1, 0xf7, 0x25, 0xc4, 0xf7,
+ 0xab, 0xc6, 0x3, 0xc6, 0x7d, 0x15, 0xf8, 0x9,
+ 0xf7, 0x0, 0xf7, 0x55, 0xf7, 0x78, 0xe9, 0x58,
+ 0xda, 0xfb, 0x5, 0xfb, 0x18, 0x28, 0x20, 0xfb,
+ 0x4, 0x1f, 0x42, 0x8c, 0xbf, 0x46, 0xf3, 0x1b,
+ 0xc6, 0xca, 0x93, 0xb6, 0xb4, 0x1f, 0x66, 0xfb,
+ 0xe, 0x26, 0xfb, 0x0, 0xfb, 0x94, 0x8d, 0x8,
+ 0xf8, 0x2e, 0xf7, 0xce, 0x15, 0x64, 0x71, 0x4c,
+ 0x62, 0x42, 0x1b, 0x43, 0x5e, 0xb4, 0xbf, 0xe2,
+ 0xd9, 0xd1, 0xe7, 0xe9, 0xa5, 0x30, 0x3c, 0x80,
+ 0x1f, 0xe, 0x7c, 0xf7, 0x10, 0xf7, 0x2c, 0xf7,
+ 0x10, 0x1, 0xf7, 0x5a, 0xf7, 0x24, 0x3, 0xf7,
+ 0x5a, 0xae, 0x35, 0xa, 0xc6, 0xf7, 0xa8, 0x35,
+ 0xa, 0xe, 0xf7, 0x99, 0xf7, 0x10, 0x1, 0xf7,
+ 0x32, 0xcb, 0xd7, 0xf7, 0x24, 0x3, 0xf7, 0x32,
+ 0xfb, 0x4, 0x15, 0xcb, 0x6, 0xf7, 0x2a, 0xf7,
+ 0x8f, 0x5, 0x2e, 0x6, 0x9e, 0xf7, 0x40, 0x35,
+ 0xa, 0xe, 0xca, 0x76, 0xf7, 0xfe, 0xcf, 0x1,
+ 0xd4, 0xd5, 0x3, 0xd4, 0xf7, 0x6c, 0x15, 0xf7,
+ 0xfa, 0xfb, 0x42, 0x9c, 0xc9, 0xfb, 0xc1, 0xf7,
+ 0x2d, 0xf8, 0x3, 0xf7, 0x27, 0x98, 0xcf, 0xfc,
+ 0x48, 0xfb, 0x42, 0x5, 0xe, 0xf7, 0x1e, 0xc8,
+ 0xf7, 0x7, 0xc9, 0x1, 0xe0, 0xf7, 0xce, 0x15,
+ 0xf8, 0x56, 0x6, 0x95, 0xc9, 0x5, 0xfc, 0x55,
+ 0x6, 0x61, 0xfb, 0x82, 0x15, 0xf8, 0x54, 0x6,
+ 0x97, 0xc8, 0x5, 0xfc, 0x55, 0x6, 0xe, 0xb5,
+ 0xcf, 0xf7, 0xc0, 0xc9, 0x1, 0xf8, 0x59, 0xd5,
+ 0x3, 0xd4, 0xb5, 0x15, 0xf8, 0x48, 0xf7, 0x42,
+ 0x9d, 0xdd, 0xfb, 0xfa, 0xf7, 0x42, 0x7a, 0x4d,
+ 0xf7, 0xc1, 0xfb, 0x2d, 0xfc, 0x3, 0xfb, 0x27,
+ 0x5, 0xe, 0x7c, 0xf7, 0xa, 0xf7, 0x44, 0xf7,
+ 0x23, 0xeb, 0xc1, 0x12, 0xf7, 0xb, 0xc1, 0x9c,
+ 0xc3, 0xf7, 0x48, 0xc1, 0x17, 0xf7, 0x52, 0xf7,
+ 0x44, 0x15, 0xc3, 0x6, 0x96, 0xc5, 0x5, 0xda,
+ 0x9b, 0xf7, 0x24, 0xc6, 0xf7, 0x17, 0x1a, 0xe0,
+ 0x43, 0xba, 0x2c, 0x50, 0x4b, 0x73, 0x7a, 0x59,
+ 0x1e, 0x13, 0xf4, 0x76, 0xfb, 0x1, 0x5, 0xc1,
+ 0x6, 0x97, 0xc9, 0x5, 0x9a, 0xb1, 0xb5, 0x9e,
+ 0xb3, 0x1b, 0xe7, 0xa8, 0x5e, 0x65, 0x2d, 0xfb,
+ 0x17, 0x5a, 0x36, 0x7e, 0x1f, 0x36, 0xfb, 0x8f,
+ 0x15, 0x70, 0x8c, 0x9f, 0x7b, 0xad, 0x1b, 0xae,
+ 0xb9, 0xa9, 0xb3, 0xa3, 0x75, 0xa3, 0x69, 0x62,
+ 0x63, 0x67, 0x64, 0x8c, 0x1f, 0xe, 0x7d, 0xb0,
+ 0xdf, 0xaf, 0xf7, 0x6e, 0xb0, 0xf7, 0x0, 0xb0,
+ 0x1, 0xb1, 0xb0, 0xeb, 0xb0, 0xf7, 0xe6, 0xb1,
+ 0x3, 0xf7, 0xe4, 0xf7, 0x3e, 0x15, 0x6e, 0x8a,
+ 0xa3, 0x69, 0xba, 0x1b, 0xf0, 0xd8, 0xf7, 0x18,
+ 0xf7, 0xb, 0xf7, 0xb, 0x2c, 0xcd, 0xfb, 0x6,
+ 0xfb, 0x58, 0xfb, 0x21, 0xfb, 0x34, 0xfb, 0x4d,
+ 0x21, 0xbd, 0x21, 0xf7, 0x32, 0xdf, 0xe7, 0xa9,
+ 0xb2, 0xd4, 0x1f, 0x83, 0xaf, 0x5, 0x58, 0x29,
+ 0x42, 0x7a, 0x49, 0x1b, 0x20, 0x47, 0xd1, 0xf5,
+ 0xf7, 0x1c, 0xe4, 0xf7, 0x3f, 0xf7, 0x5a, 0xf0,
+ 0xde, 0x5a, 0x20, 0x2d, 0x4b, 0xfb, 0x5, 0x49,
+ 0x71, 0x74, 0x9f, 0xae, 0x91, 0x1f, 0x90, 0xa2,
+ 0x99, 0xa3, 0x95, 0xa0, 0xc6, 0xf7, 0x12, 0x18,
+ 0x66, 0x6, 0x73, 0x59, 0x5, 0xc2, 0x85, 0x6b,
+ 0x8c, 0x7e, 0x1b, 0x2d, 0x37, 0x23, 0xfb, 0x11,
+ 0x6a, 0x9e, 0x6e, 0xb1, 0xb4, 0xb5, 0xa9, 0xac,
+ 0xa4, 0x1f, 0xad, 0xf7, 0x19, 0x15, 0x4a, 0x7e,
+ 0x50, 0x2c, 0x51, 0x1b, 0x71, 0x85, 0xa1, 0x9f,
+ 0xd8, 0xcd, 0xee, 0xca, 0xb0, 0x8a, 0x62, 0x7a,
+ 0x88, 0x1f, 0xe, 0x8b, 0xc1, 0xf6, 0xc1, 0xf7,
+ 0xb4, 0xc1, 0x1, 0x89, 0xf7, 0x65, 0xf7, 0x48,
+ 0xf7, 0x60, 0x3, 0x89, 0x16, 0xf7, 0x65, 0x2a,
+ 0xa, 0x32, 0x6, 0xca, 0xf7, 0x4, 0x5, 0xf7,
+ 0xab, 0x6, 0xa2, 0xfb, 0x4, 0x2c, 0xa, 0xf8,
+ 0x90, 0x32, 0xa, 0x58, 0xa, 0x4f, 0x6, 0xf7,
+ 0x6c, 0xf7, 0x3a, 0x15, 0xf7, 0x3f, 0xf7, 0xba,
+ 0xcb, 0xfb, 0xba, 0x5, 0xe, 0x8b, 0xc1, 0xf7,
+ 0x50, 0xc2, 0xf7, 0x67, 0xc1, 0x12, 0xf5, 0xc3,
+ 0xf7, 0xec, 0xc8, 0x62, 0xc7, 0x13, 0xe8, 0x13,
+ 0xe4, 0x98, 0x16, 0xf7, 0xc8, 0x6, 0xf7, 0x1a,
+ 0xf7, 0x5, 0xbd, 0xf7, 0x18, 0x8a, 0x1f, 0xbe,
+ 0x58, 0xae, 0x58, 0x95, 0x1e, 0x13, 0xe8, 0xd2,
+ 0x9e, 0xbd, 0xbb, 0xe9, 0x1a, 0xe8, 0x2c, 0xa9,
+ 0x2a, 0x1e, 0xfb, 0x9e, 0x45, 0xa, 0xdd, 0x6,
+ 0x2f, 0xfc, 0x5a, 0x6b, 0xa, 0xf7, 0x51, 0xf7,
+ 0x87, 0x15, 0xb5, 0xf7, 0x67, 0x5, 0xf7, 0x1d,
+ 0xf7, 0x1a, 0x89, 0x40, 0x2e, 0x24, 0x62, 0x37,
+ 0x1f, 0xfb, 0x45, 0xfb, 0x87, 0x15, 0xb3, 0xf7,
+ 0x50, 0x5, 0xf7, 0x1e, 0x6, 0x13, 0xf8, 0xc7,
+ 0xf5, 0x83, 0x4c, 0x30, 0xfb, 0x3, 0x71, 0x41,
+ 0x1f, 0xe, 0x79, 0xc2, 0xf8, 0x7d, 0xc1, 0x8a,
+ 0x77, 0x12, 0xbc, 0xc5, 0x13, 0xd0, 0xf8, 0x6e,
+ 0xf2, 0x15, 0x64, 0x4d, 0x42, 0x70, 0x46, 0x1b,
+ 0x22, 0x51, 0xc9, 0xf7, 0x2, 0xf7, 0x5a, 0xf7,
+ 0x12, 0xf7, 0xb, 0xf7, 0xe, 0xcc, 0xc1, 0x6b,
+ 0x5c, 0xaf, 0x1f, 0x78, 0x30, 0x6a, 0xa, 0x13,
+ 0xb0, 0xb8, 0xf7, 0x73, 0x52, 0xa, 0x7f, 0x4e,
+ 0x5, 0x13, 0xd0, 0xb9, 0x4a, 0x5d, 0x9b, 0x55,
+ 0x1b, 0xfb, 0x54, 0xfb, 0xa, 0xfb, 0x38, 0xfb,
+ 0x61, 0xfb, 0x15, 0xbd, 0x27, 0xf7, 0x2f, 0xdb,
+ 0xdf, 0xa8, 0xb8, 0xd2, 0x1f, 0xe, 0x3e, 0xa,
+ 0xf8, 0xab, 0xc3, 0x3, 0x80, 0x16, 0xf7, 0x87,
+ 0x6, 0xf7, 0x48, 0xf7, 0x47, 0xd7, 0xf7, 0xb6,
+ 0xf7, 0x37, 0xfb, 0x0, 0xac, 0xfb, 0x18, 0x1f,
+ 0xfb, 0x8b, 0x45, 0xa, 0xdb, 0x5e, 0xa, 0x3a,
+ 0x6, 0xf7, 0x1c, 0x16, 0xe6, 0x87, 0xa, 0xf7,
+ 0x5a, 0x85, 0xf7, 0x2, 0x9f, 0xfb, 0x3e, 0x1a,
+ 0xfb, 0x42, 0x23, 0xfb, 0x10, 0xfb, 0x4a, 0x1e,
+ 0xe, 0x8b, 0xc1, 0xf7, 0x5b, 0x61, 0xa, 0x1,
+ 0x88, 0x16, 0xf8, 0x87, 0x6, 0xb1, 0xf7, 0x4f,
+ 0x62, 0xa, 0x70, 0xfb, 0x19, 0x5, 0xfb, 0xc4,
+ 0x6, 0xb3, 0xf7, 0x5b, 0x5, 0xf7, 0x39, 0x6,
+ 0x7a, 0x3a, 0x51, 0xa, 0xba, 0xf7, 0x6d, 0x62,
+ 0xa, 0x79, 0x39, 0x5, 0xfb, 0x39, 0x6, 0xb4,
+ 0xf7, 0x5d, 0x81, 0xa, 0x70, 0xfb, 0x1a, 0x5,
+ 0xc4, 0x6, 0xb1, 0xf7, 0x50, 0x5, 0xfc, 0x82,
+ 0x45, 0xa, 0xdf, 0x6, 0x2f, 0xfc, 0x5a, 0x6b,
+ 0xa, 0xe, 0x8b, 0xc1, 0xf7, 0x5b, 0x61, 0xa,
+ 0x1, 0xe3, 0xc4, 0xf7, 0x54, 0xc3, 0xf7, 0x6,
+ 0xc4, 0x3, 0x88, 0x16, 0xf7, 0xa3, 0x6, 0x97,
+ 0xc1, 0x55, 0xa, 0xb3, 0xf7, 0x5b, 0x5, 0xf7,
+ 0x3a, 0x6, 0x7d, 0x43, 0x51, 0xa, 0xb4, 0xf7,
+ 0x5b, 0x62, 0xa, 0x7c, 0x42, 0x5, 0xfb, 0x3a,
+ 0x6, 0xb3, 0xf7, 0x5d, 0x5, 0xf7, 0xc0, 0x6,
+ 0x6e, 0xfb, 0x23, 0x5, 0xc4, 0x6, 0xb3, 0xf7,
+ 0x59, 0x5, 0xfc, 0x80, 0x45, 0xa, 0xdb, 0x6,
+ 0x2f, 0xfc, 0x5a, 0x89, 0xa, 0xe, 0x79, 0xc2,
+ 0xf7, 0x39, 0xc2, 0xf7, 0xa0, 0xc2, 0x1, 0x9e,
+ 0xc4, 0xf8, 0x2b, 0xc3, 0x3, 0x34, 0xa, 0x3d,
+ 0xa, 0xe, 0x8b, 0xc1, 0xf7, 0x60, 0xc1, 0xf7,
+ 0x58, 0xc1, 0x1, 0xcb, 0xc1, 0xf7, 0xa8, 0xc1,
+ 0x3, 0x70, 0x16, 0xf7, 0x6a, 0x2a, 0xa, 0x3b,
+ 0x6, 0xb4, 0xf7, 0x60, 0x5, 0xf7, 0xa7, 0x6,
+ 0x63, 0xfb, 0x60, 0x5, 0x3c, 0x2d, 0xa, 0xf7,
+ 0x68, 0x2a, 0xa, 0x3c, 0x6, 0xe5, 0x87, 0xa,
+ 0xda, 0x2a, 0xa, 0xfb, 0x68, 0x2d, 0xa, 0xda,
+ 0x6, 0x64, 0xfb, 0x58, 0x5, 0xfb, 0xa7, 0x6,
+ 0xb1, 0xf7, 0x58, 0x5, 0xdb, 0x2a, 0xa, 0xfb,
+ 0x6a, 0x2d, 0xa, 0xdb, 0x6, 0x31, 0xfc, 0x5a,
+ 0x89, 0xa, 0xe, 0x3e, 0xa, 0xaf, 0x16, 0xf8,
+ 0x2e, 0x47, 0xa, 0xfb, 0x44, 0x6, 0xec, 0x87,
+ 0xa, 0xf7, 0x40, 0x47, 0xa, 0xfc, 0x2a, 0x45,
+ 0xa, 0xf7, 0x43, 0x6, 0x2a, 0x58, 0xa, 0xfb,
+ 0x43, 0x6, 0xe, 0x79, 0xc1, 0xf8, 0x6b, 0xc2,
+ 0x1, 0xa2, 0xc3, 0xf7, 0xec, 0xc1, 0x3, 0x7b,
+ 0xb4, 0x15, 0x65, 0xe2, 0xca, 0x76, 0xce, 0x1b,
+ 0xf7, 0x22, 0xbb, 0x7c, 0xa, 0xf7, 0x15, 0x36,
+ 0xa, 0xfc, 0x12, 0x38, 0xa, 0xf7, 0x5b, 0x6,
+ 0x4b, 0xfb, 0xdc, 0x5, 0x3a, 0x7b, 0x5f, 0x4d,
+ 0x2d, 0x1b, 0x71, 0xfb, 0x1f, 0x91, 0xf7, 0xe,
+ 0xa3, 0x1f, 0x9a, 0xe6, 0x71, 0xa, 0xe, 0x3e,
+ 0xa, 0xd7, 0xc1, 0xf7, 0xec, 0xcf, 0x3, 0x7b,
+ 0x16, 0xf7, 0x6d, 0x2a, 0xa, 0x39, 0x6, 0xab,
+ 0xf7, 0x2d, 0xef, 0xdd, 0xa5, 0x5f, 0xb6, 0x41,
+ 0xae, 0x38, 0xa4, 0x33, 0x19, 0xf7, 0x2a, 0x2a,
+ 0xa, 0xfb, 0x9, 0x6, 0x76, 0xd2, 0x65, 0xdd,
+ 0x62, 0xcc, 0x8, 0x8b, 0x76, 0xad, 0x82, 0x9a,
+ 0x1e, 0xf7, 0x81, 0xf7, 0x4f, 0x5, 0xcb, 0x43,
+ 0xa, 0xd2, 0x6, 0xfb, 0xbf, 0xfb, 0x7f, 0xc3,
+ 0xf7, 0x7f, 0x5, 0xd0, 0x2a, 0xa, 0xfb, 0x6b,
+ 0x2d, 0xa, 0xe7, 0x6, 0x26, 0x58, 0xa, 0x3a,
+ 0x6, 0xe, 0x3e, 0xa, 0xf7, 0xb, 0xc3, 0x3,
+ 0x8b, 0x4, 0xf8, 0x96, 0x6, 0xb9, 0xf7, 0x87,
+ 0x71, 0xa, 0x68, 0xfb, 0x51, 0x5, 0xfb, 0xba,
+ 0x6, 0xe7, 0x87, 0xa, 0xf7, 0x14, 0x2a, 0xa,
+ 0xfb, 0xb9, 0x2d, 0xa, 0xf7, 0x0, 0x5e, 0xa,
+ 0xfb, 0x0, 0x6, 0xe, 0x3e, 0xa, 0x9f, 0xc3,
+ 0xf7, 0xfc, 0xc3, 0x3, 0x63, 0x16, 0xf7, 0x3c,
+ 0x47, 0xa, 0x4b, 0x6, 0xe6, 0x87, 0xa, 0x94,
+ 0x6, 0xd4, 0xfc, 0xf, 0x5, 0xb7, 0x6, 0xf7,
+ 0x73, 0xf8, 0xf, 0x5, 0x96, 0x5e, 0xa, 0x4f,
+ 0x5f, 0xa, 0xf7, 0x36, 0x2a, 0xa, 0x5c, 0x6,
+ 0xe6, 0x87, 0xa, 0xb9, 0x47, 0xa, 0xfb, 0x28,
+ 0x6, 0xfb, 0x5e, 0xfb, 0xec, 0x48, 0xf7, 0xec,
+ 0x5, 0xfb, 0x2b, 0x5f, 0xa, 0xbb, 0x5e, 0xa,
+ 0x5b, 0x6, 0xe, 0x8a, 0xc2, 0xf8, 0x59, 0xc2,
+ 0x1, 0x5e, 0x8a, 0x15, 0xf7, 0x80, 0x36, 0xa,
+ 0x28, 0x6, 0xe1, 0xf8, 0x41, 0xf7, 0x54, 0xfc,
+ 0x78, 0x5, 0xd6, 0x6, 0xf0, 0xf8, 0x90, 0x5,
+ 0xd8, 0x36, 0xa, 0xfb, 0x7b, 0x38, 0xa, 0xed,
+ 0x6, 0x35, 0xfc, 0x44, 0xfb, 0x53, 0xf8, 0x7b,
+ 0x5, 0xfb, 0x31, 0x56, 0xa, 0xdd, 0x6, 0x31,
+ 0xfc, 0x59, 0x5, 0x3a, 0x6, 0xe, 0x79, 0xc2,
+ 0xf8, 0x7c, 0xc2, 0x1, 0xad, 0xc2, 0xf8, 0x38,
+ 0xc3, 0x3, 0xad, 0xf7, 0x6c, 0x15, 0xfb, 0x19,
+ 0xd5, 0x26, 0xf7, 0x1c, 0xf7, 0x4b, 0xf7, 0x1e,
+ 0xf7, 0x4f, 0xf7, 0x50, 0xee, 0x5c, 0xf7, 0x10,
+ 0xfb, 0x33, 0xfb, 0x5a, 0xfb, 0x13, 0xfb, 0x5c,
+ 0xfb, 0x38, 0x1e, 0xc2, 0x89, 0x15, 0xf7, 0x3,
+ 0xdd, 0xf7, 0x5c, 0xf7, 0x43, 0xf7, 0x10, 0xb2,
+ 0x2e, 0x3c, 0xfb, 0x24, 0xfb, 0xb, 0xfb, 0x40,
+ 0xfb, 0x1b, 0x20, 0x50, 0xd9, 0xee, 0x1e, 0xe,
+ 0x8b, 0xc1, 0xf7, 0x31, 0xc1, 0xf7, 0x87, 0xc1,
+ 0x1, 0xf6, 0xc5, 0xf7, 0xfa, 0xc6, 0x3, 0x9c,
+ 0x16, 0xf7, 0xba, 0x2a, 0xa, 0xfb, 0x31, 0x6,
+ 0xab, 0xf7, 0x31, 0x5, 0xf7, 0x1a, 0x6, 0xf7,
+ 0x31, 0xe9, 0xcf, 0xf7, 0x27, 0xd2, 0x5c, 0xcc,
+ 0xfb, 0x15, 0x1f, 0xfb, 0xa7, 0x2d, 0xa, 0xdb,
+ 0x6, 0x2e, 0x58, 0xa, 0x3c, 0x6, 0xf7, 0x47,
+ 0xf7, 0x67, 0x15, 0xbc, 0xf7, 0x87, 0x5, 0xf7,
+ 0x1b, 0x6, 0xd0, 0xca, 0x6b, 0x52, 0xfb, 0x11,
+ 0x20, 0x6e, 0x4a, 0x1f, 0xe, 0xfb, 0x1e, 0xf7,
+ 0x41, 0xfb, 0x15, 0xf7, 0x15, 0x54, 0xc2, 0xf8,
+ 0x7e, 0xc2, 0x12, 0xae, 0xc7, 0xf8, 0x2f, 0xc6,
+ 0x13, 0x5c, 0xd9, 0x3f, 0x15, 0x91, 0x54, 0x5,
+ 0xaa, 0xb4, 0xb2, 0x91, 0xb2, 0x1b, 0xaa, 0xaa,
+ 0x7c, 0x80, 0xab, 0x1f, 0x13, 0x9c, 0x82, 0xa6,
+ 0xa6, 0x82, 0xa6, 0x1b, 0xae, 0xaf, 0x9b, 0x9f,
+ 0xa7, 0x1f, 0x7b, 0xba, 0x5, 0x7f, 0x73, 0x6f,
+ 0x7d, 0x70, 0x1b, 0x75, 0x75, 0x94, 0x94, 0x75,
+ 0x1f, 0x94, 0x74, 0x74, 0x98, 0x70, 0x1b, 0x7c,
+ 0x7a, 0x8c, 0x86, 0x7a, 0x1f, 0x13, 0x3c, 0xa9,
+ 0x9a, 0x8d, 0x8b, 0x95, 0x95, 0x8, 0xf7, 0x5f,
+ 0x8a, 0xf7, 0x12, 0xf7, 0x4a, 0xf7, 0x64, 0x1a,
+ 0xf7, 0x1, 0x5e, 0xf1, 0xfb, 0x33, 0xfb, 0x4f,
+ 0xfb, 0x1f, 0xfb, 0x5d, 0xfb, 0x4c, 0x23, 0xbd,
+ 0x3e, 0xeb, 0x6e, 0x1e, 0x6a, 0x70, 0x6a, 0x7a,
+ 0x66, 0x7a, 0x8, 0x9c, 0xf7, 0xa3, 0x15, 0xf7,
+ 0x2b, 0xf7, 0x1, 0xf7, 0x47, 0xf7, 0x25, 0xf1,
+ 0xc2, 0x4c, 0x36, 0xfb, 0x60, 0xfb, 0x26, 0xfb,
+ 0x1e, 0xfb, 0x0, 0x40, 0x39, 0xb0, 0xf7, 0xf,
+ 0x1e, 0xe, 0x8b, 0xc1, 0xf7, 0x45, 0xbf, 0xf7,
+ 0x75, 0xc1, 0x1, 0xf7, 0x4, 0xc2, 0xf7, 0xf9,
+ 0xc3, 0x3, 0x9f, 0x16, 0xf7, 0x6c, 0x2a, 0xa,
+ 0x3b, 0x6, 0xae, 0xf7, 0x43, 0x5, 0xf7, 0x7,
+ 0x6, 0xa8, 0x5c, 0xcc, 0xfb, 0x6, 0xa4, 0x47,
+ 0x8, 0xf7, 0x18, 0x2a, 0xa, 0x24, 0x6, 0x73,
+ 0xc1, 0x60, 0xd6, 0x6d, 0xbb, 0x8, 0xe5, 0x8e,
+ 0xf7, 0x3, 0xb6, 0xf7, 0x33, 0x1a, 0xcb, 0x59,
+ 0xc9, 0x29, 0x1e, 0xfb, 0xbf, 0x2d, 0xa, 0xdc,
+ 0x5e, 0xa, 0x3a, 0x6, 0xf7, 0x4a, 0xf7, 0x79,
+ 0x15, 0xb8, 0xf7, 0x75, 0x5, 0xf7, 0x24, 0x6,
+ 0xd6, 0xba, 0x6c, 0x60, 0xfb, 0x26, 0xfb, 0x1c,
+ 0x86, 0x42, 0x1f, 0xe, 0x77, 0xc5, 0xf8, 0x7b,
+ 0xc2, 0x1, 0xf7, 0xc, 0xc7, 0xf7, 0xbc, 0xc7,
+ 0x3, 0x98, 0x7f, 0x15, 0xc5, 0x6, 0x95, 0xbf,
+ 0x5, 0x65, 0xc1, 0xd6, 0x75, 0xd5, 0x1b, 0xf7,
+ 0x8, 0xf7, 0x1c, 0xbe, 0xf7, 0x5, 0xf7, 0x5,
+ 0x2d, 0x9f, 0x31, 0x95, 0x1f, 0x3d, 0x93, 0x2d,
+ 0xaa, 0xcf, 0x1a, 0xdf, 0xe3, 0xba, 0xf2, 0xc3,
+ 0xbc, 0x6f, 0x68, 0xab, 0x1e, 0x7a, 0x3b, 0x5,
+ 0xc5, 0x6, 0xb1, 0xf7, 0x4f, 0x62, 0xa, 0x82,
+ 0x63, 0x5, 0xa6, 0x68, 0x58, 0xa3, 0x54, 0x1b,
+ 0xfb, 0x3a, 0x2d, 0x3a, 0x20, 0xfb, 0x6, 0xf7,
+ 0xd, 0x6d, 0xe5, 0x7d, 0x1f, 0xc8, 0x80, 0xdf,
+ 0x82, 0x43, 0x1a, 0x47, 0x24, 0x67, 0x2f, 0x42,
+ 0x41, 0xa1, 0xb5, 0x63, 0x1e, 0x9a, 0xd0, 0x5,
+ 0x50, 0x6, 0xe, 0x3e, 0xa, 0xf7, 0x54, 0xc2,
+ 0x3, 0xc5, 0x16, 0xf7, 0xc2, 0x2a, 0xa, 0xfb,
+ 0x10, 0x6, 0xe5, 0x87, 0xa, 0xf7, 0x43, 0x6,
+ 0x6d, 0xfb, 0x2d, 0x6a, 0xa, 0xb4, 0xf7, 0x63,
+ 0x5, 0xfc, 0x98, 0x6, 0x62, 0xfb, 0x63, 0x6a,
+ 0xa, 0xa9, 0xf7, 0x2d, 0x5, 0xf7, 0x43, 0x6,
+ 0x32, 0x58, 0xa, 0xfb, 0xf, 0x6, 0xe, 0x79,
+ 0xbf, 0xf8, 0x6d, 0xc2, 0x1, 0xd2, 0xc0, 0x3,
+ 0xbf, 0xf8, 0x8f, 0x85, 0xa, 0x56, 0xfb, 0x8c,
+ 0x81, 0x46, 0x68, 0x1a, 0x22, 0xb3, 0x47, 0xf7,
+ 0x16, 0xf7, 0x11, 0xe2, 0xc4, 0xf7, 0x2d, 0xa8,
+ 0x1e, 0x9f, 0xf4, 0x9e, 0xf4, 0x9f, 0xf4, 0x8,
+ 0xd8, 0x36, 0xa, 0xfb, 0x7c, 0x67, 0xa, 0xad,
+ 0xae, 0x8b, 0xad, 0x1b, 0x77, 0x22, 0x78, 0x23,
+ 0x77, 0x22, 0x8, 0xfb, 0xe, 0x73, 0x3c, 0x66,
+ 0x3d, 0x1b, 0x32, 0x66, 0xb7, 0xdb, 0xbf, 0xb4,
+ 0xf7, 0x49, 0x9f, 0xf7, 0x8, 0x1f, 0xf5, 0x36,
+ 0xa, 0xfb, 0x83, 0x6, 0xe, 0x93, 0x76, 0xf8,
+ 0x9c, 0xc2, 0x1, 0xf7, 0x31, 0x7e, 0x85, 0xa,
+ 0xf7, 0xbb, 0xf8, 0x9c, 0x5, 0xcb, 0x36, 0xa,
+ 0xfb, 0x70, 0x38, 0xa, 0xe5, 0x6, 0xfb, 0x99,
+ 0xfc, 0x64, 0x3a, 0xf8, 0x64, 0x5, 0xe6, 0x46,
+ 0xa, 0xfb, 0x77, 0x38, 0xa, 0xd3, 0x6, 0xe,
+ 0x93, 0x76, 0xf8, 0x9c, 0xc2, 0x1, 0xb1, 0xc5,
+ 0x3, 0x9c, 0x7e, 0x15, 0xcb, 0x6, 0xf7, 0x4b,
+ 0xf8, 0x0, 0xbe, 0xfc, 0x0, 0x5, 0xc6, 0x6,
+ 0xf7, 0x32, 0xf8, 0x9c, 0x5, 0xb7, 0x46, 0xa,
+ 0xfb, 0x5d, 0x56, 0xa, 0xf2, 0x6, 0xfb, 0xe,
+ 0xfc, 0x36, 0x58, 0xf8, 0x0, 0x5, 0x63, 0x6,
+ 0xfb, 0x4f, 0xfc, 0x2, 0xaf, 0xf8, 0x38, 0x5,
+ 0xef, 0x36, 0xa, 0xfb, 0x5d, 0x56, 0xa, 0xba,
+ 0x6, 0xe, 0x3e, 0xa, 0x71, 0xf7, 0x76, 0xf7,
+ 0x9, 0xf7, 0x6a, 0x3, 0x71, 0x16, 0xf7, 0x76,
+ 0x2a, 0xa, 0x2b, 0x6, 0xf7, 0x53, 0xf7, 0x50,
+ 0xf7, 0x0, 0xfb, 0x50, 0x5, 0x35, 0x2d, 0xa,
+ 0xf7, 0x6a, 0x2a, 0xa, 0x4a, 0x6, 0xfb, 0x18,
+ 0xf7, 0x7b, 0xf7, 0x5f, 0xf7, 0x73, 0x5, 0xce,
+ 0x2a, 0xa, 0xfb, 0x55, 0x2d, 0xa, 0xca, 0x6,
+ 0xfb, 0x37, 0xfb, 0x49, 0x2c, 0xf7, 0x49, 0x5,
+ 0xd8, 0x2a, 0xa, 0xfb, 0x64, 0x45, 0xa, 0xcf,
+ 0x6, 0xf7, 0x9, 0xfb, 0x73, 0xfb, 0x79, 0xfb,
+ 0x7b, 0x5, 0x49, 0x6, 0xe, 0x3e, 0xa, 0xb4,
+ 0x16, 0xf7, 0xc8, 0x2a, 0xa, 0xfb, 0x11, 0x6,
+ 0xab, 0xf7, 0x42, 0xf7, 0x7f, 0xf7, 0xac, 0x5,
+ 0xcf, 0x2a, 0xa, 0xfb, 0x5b, 0x2d, 0xa, 0xd2,
+ 0x6, 0xfb, 0x54, 0xfb, 0x77, 0x27, 0xf7, 0x77,
+ 0x5, 0xd3, 0x43, 0xa, 0xd1, 0x6, 0xf7, 0xe,
+ 0xfb, 0xac, 0x6b, 0xfb, 0x42, 0x5, 0xfb, 0x12,
+ 0x6, 0xe, 0x3e, 0xa, 0xba, 0xd3, 0xf7, 0xda,
+ 0xc0, 0x3, 0xb1, 0x16, 0xf8, 0x38, 0x6, 0xb3,
+ 0xf7, 0x5f, 0x5, 0x56, 0x6, 0x6e, 0xfb, 0x29,
+ 0x5, 0xfb, 0xbd, 0x6, 0xf8, 0x46, 0xf8, 0x5d,
+ 0x94, 0xbe, 0x5, 0xfc, 0x19, 0x6, 0x66, 0xfb,
+ 0x50, 0x5, 0xbe, 0x6, 0xa5, 0xf7, 0x1a, 0x5,
+ 0xf7, 0xa0, 0x6, 0xfc, 0x46, 0xfc, 0x5b, 0x5,
+ 0xe, 0xfb, 0x0, 0xc1, 0xf9, 0x2, 0xc1, 0x1,
+ 0xf7, 0x1c, 0xfb, 0x0, 0x15, 0xf7, 0x4e, 0x2a,
+ 0xa, 0xfb, 0x19, 0x6, 0xf7, 0xc, 0xf9, 0x2,
+ 0x5, 0xf7, 0x19, 0x2a, 0xa, 0xfb, 0x4e, 0x6,
+ 0xe, 0x23, 0xf9, 0x60, 0xfd, 0x33, 0x76, 0xf9,
+ 0x59, 0x77, 0x12, 0x13, 0x60, 0xf8, 0xb, 0xfb,
+ 0xd, 0x15, 0x13, 0x80, 0xba, 0x9c, 0x5, 0x13,
+ 0x60, 0xfb, 0x5a, 0xf9, 0x71, 0x5, 0x13, 0x80,
+ 0x5c, 0x7a, 0x5, 0xe, 0xfb, 0x0, 0xc1, 0xf9,
+ 0x2, 0xc1, 0x1, 0xf7, 0x27, 0x55, 0x15, 0x80,
+ 0x55, 0x5, 0xf7, 0x4e, 0x6, 0xf7, 0x22, 0xf9,
+ 0x6e, 0x5, 0xfb, 0x4e, 0x2d, 0xa, 0xf7, 0x19,
+ 0x6, 0xfb, 0xc, 0xfd, 0x2, 0x5, 0xe, 0xf7,
+ 0xf7, 0xf7, 0x9f, 0x12, 0xf2, 0xf8, 0x27, 0x17,
+ 0xe9, 0xf7, 0xf6, 0x15, 0xdc, 0xa6, 0xe1, 0xc6,
+ 0xce, 0xc4, 0xb9, 0x4f, 0xc1, 0x53, 0xd0, 0x71,
+ 0x94, 0xba, 0x18, 0x3b, 0xd7, 0x7c, 0xb8, 0x78,
+ 0xee, 0x8, 0x58, 0x6, 0x13, 0x40, 0x58, 0x2d,
+ 0x3c, 0x54, 0xfb, 0x0, 0x43, 0x8, 0xe, 0xfb,
+ 0x11, 0xbd, 0x1, 0x90, 0x40, 0x15, 0x81, 0x59,
+ 0x5, 0xf8, 0xed, 0x6, 0x95, 0xbd, 0x5, 0xe,
+ 0x65, 0xa, 0xf7, 0x61, 0xf8, 0xeb, 0x15, 0xf7,
+ 0x46, 0x25, 0x97, 0xaa, 0xfb, 0x31, 0x79, 0xa,
+ 0xf8, 0x20, 0x87, 0x15, 0xf7, 0x1f, 0x36, 0xa,
+ 0x36, 0x6, 0xbf, 0xf7, 0x97, 0x8b, 0x9e, 0x9b,
+ 0x1a, 0xc7, 0x5a, 0xaf, 0x25, 0x46, 0x36, 0x77,
+ 0x73, 0x4b, 0x1e, 0x39, 0xa, 0xc8, 0xc1, 0x8c,
+ 0x54, 0x77, 0x87, 0x5c, 0x85, 0x73, 0x1f, 0x92,
+ 0x5f, 0x5a, 0x92, 0x5a, 0x1b, 0xfb, 0x45, 0x41,
+ 0x38, 0x3f, 0x52, 0xb9, 0x56, 0xe6, 0xd8, 0xda,
+ 0xaf, 0xc0, 0xcd, 0x1f, 0x98, 0xd2, 0x15, 0x50,
+ 0x4b, 0x3e, 0x5d, 0x38, 0x1b, 0x56, 0x66, 0xa8,
+ 0xab, 0xdb, 0xf7, 0x7, 0x9c, 0xdb, 0x40, 0xa,
+ 0x7c, 0xc2, 0x5f, 0xc3, 0xf7, 0xe8, 0xc3, 0xf7,
+ 0x12, 0xc2, 0x12, 0xf8, 0xb0, 0xc5, 0x13, 0x78,
+ 0x8d, 0x87, 0x15, 0xf7, 0x21, 0x6, 0x9a, 0xdb,
+ 0x5, 0x13, 0xb8, 0x7b, 0x96, 0xa8, 0x40, 0xf7,
+ 0x14, 0x1b, 0xf7, 0x33, 0xf7, 0x5, 0xf7, 0x18,
+ 0xf7, 0x2f, 0xf7, 0x7, 0x32, 0xc8, 0x30, 0xfb,
+ 0x1, 0x46, 0x56, 0x72, 0x75, 0x1f, 0xbe, 0xf7,
+ 0x97, 0x66, 0xa, 0xe0, 0x6, 0x13, 0x78, 0x24,
+ 0xfc, 0x9e, 0x5, 0x35, 0x6, 0xf7, 0x48, 0xf7,
+ 0x45, 0x15, 0xf5, 0xa0, 0xed, 0xc4, 0xe4, 0x1b,
+ 0xea, 0xb7, 0x4c, 0x48, 0x1f, 0x13, 0xb8, 0xfb,
+ 0xe, 0xfb, 0x1, 0x27, 0x26, 0x3a, 0x3a, 0xcb,
+ 0xf7, 0x11, 0xa4, 0x1e, 0xe, 0x7c, 0xc0, 0xf7,
+ 0xf0, 0xc2, 0x12, 0xbc, 0xc5, 0xf7, 0xf5, 0xc2,
+ 0x17, 0xf8, 0x71, 0xf7, 0x9, 0x15, 0x76, 0x6d,
+ 0x31, 0x51, 0x3a, 0x1b, 0xfb, 0xe, 0x5c, 0xcd,
+ 0xc8, 0x1f, 0x13, 0x50, 0xf7, 0x5, 0xe8, 0xf7,
+ 0x0, 0xf7, 0x17, 0xc4, 0xbe, 0x7c, 0x67, 0xaf,
+ 0x1e, 0x7c, 0x3c, 0x6a, 0xa, 0x13, 0xe0, 0xaf,
+ 0xf7, 0x4d, 0x52, 0xa, 0x82, 0x5c, 0x5, 0xa9,
+ 0x63, 0x5d, 0x9c, 0x51, 0x1b, 0xfb, 0x5b, 0x2c,
+ 0xfb, 0x29, 0xfb, 0x15, 0xfb, 0x5, 0xe5, 0x4a,
+ 0xf7, 0x2, 0xe8, 0xd8, 0xab, 0xb9, 0xd0, 0x1f,
+ 0xe, 0x7c, 0xc2, 0x61, 0xc2, 0xf7, 0xe7, 0xc2,
+ 0xf7, 0x13, 0xc2, 0x12, 0xa1, 0xc5, 0x13, 0x78,
+ 0xf8, 0x1f, 0x89, 0x15, 0xf7, 0x1f, 0x36, 0xa,
+ 0x39, 0x6, 0xf7, 0x6, 0xf8, 0xd4, 0x5, 0xfb,
+ 0x58, 0x38, 0xa, 0xf7, 0x20, 0x6, 0x65, 0xfb,
+ 0x57, 0x5, 0xc9, 0x64, 0x46, 0x91, 0x54, 0x1b,
+ 0xfb, 0x33, 0xfb, 0x14, 0xfb, 0x16, 0xfb, 0x2c,
+ 0x1f, 0x13, 0xb8, 0x2a, 0xca, 0x38, 0xf7, 0x14,
+ 0xd4, 0xd8, 0xac, 0xc9, 0xbb, 0x1e, 0x13, 0x78,
+ 0xfb, 0xdf, 0xf7, 0x0, 0x15, 0xf4, 0xf3, 0xee,
+ 0xf7, 0x3, 0xf7, 0x0, 0xb2, 0x53, 0x52, 0x1e,
+ 0x13, 0xb8, 0xfb, 0xd, 0xfb, 0x1, 0xfb, 0xa,
+ 0xfb, 0x0, 0x26, 0x5f, 0xd1, 0xd9, 0x1e, 0xe,
+ 0x7c, 0xc0, 0xf7, 0x31, 0xc2, 0xf7, 0x21, 0xbd,
+ 0x1, 0xe4, 0xf7, 0x57, 0x15, 0xf8, 0x3b, 0x6,
+ 0x90, 0xa4, 0x8d, 0xa4, 0x8a, 0xa3, 0x8, 0xea,
+ 0x88, 0x51, 0xd8, 0xfb, 0x17, 0x1b, 0xfb, 0x35,
+ 0xfb, 0x1e, 0xfb, 0x19, 0xfb, 0x3d, 0x35, 0xd3,
+ 0x47, 0xf7, 0x21, 0xde, 0xe5, 0xa5, 0xaf, 0xd4,
+ 0x1f, 0x84, 0xbf, 0x5, 0x60, 0x32, 0x38, 0x79,
+ 0x5c, 0x1b, 0xfb, 0x7, 0x30, 0xc0, 0xf3, 0xae,
+ 0x1f, 0x9c, 0xc3, 0x15, 0xc6, 0x9f, 0xda, 0xdc,
+ 0xf7, 0x7, 0x1b, 0xf7, 0x21, 0x92, 0xfb, 0x8,
+ 0x72, 0x86, 0x1f, 0xe, 0x8b, 0xc2, 0xf7, 0xd9,
+ 0xc3, 0xf7, 0x1e, 0xc2, 0x1, 0xf7, 0x26, 0xc5,
+ 0x3, 0xa5, 0x16, 0xf8, 0x18, 0x36, 0xa, 0xfb,
+ 0x71, 0x6, 0xcb, 0xf7, 0xd9, 0x5, 0xf7, 0x71,
+ 0x3c, 0xa, 0xfb, 0x71, 0x6, 0xf7, 0x11, 0xab,
+ 0x87, 0x98, 0xf7, 0x9, 0x1b, 0xb2, 0xc3, 0x85,
+ 0x85, 0xaf, 0x1f, 0x9e, 0xc1, 0x5, 0x90, 0x6a,
+ 0x49, 0x93, 0x61, 0x1b, 0x3d, 0x31, 0x82, 0x3f,
+ 0x79, 0x1f, 0x71, 0xfb, 0x0, 0x5, 0xfb, 0x1,
+ 0x6, 0x81, 0x53, 0x5, 0xf7, 0x1, 0x6, 0x4a,
+ 0xfb, 0xd9, 0x57, 0xa, 0xe, 0xfb, 0x31, 0xbd,
+ 0xf7, 0x38, 0xbe, 0xf7, 0xae, 0xbe, 0x1, 0xab,
+ 0xc3, 0xf7, 0xca, 0xbf, 0x3, 0x3f, 0xa, 0x30,
+ 0xa, 0xe, 0x8b, 0xc2, 0xf7, 0xca, 0xc2, 0xf7,
+ 0x2e, 0xc2, 0x1, 0x9f, 0x16, 0xf7, 0x72, 0x36,
+ 0xa, 0x38, 0x6, 0xbf, 0xf7, 0x99, 0x5, 0xb6,
+ 0xc3, 0xd2, 0xb7, 0xcc, 0x1b, 0xdf, 0x90, 0x59,
+ 0x54, 0x81, 0x1f, 0x5a, 0xfb, 0x87, 0x5, 0x37,
+ 0x38, 0xa, 0xf7, 0x6f, 0x36, 0xa, 0x3a, 0x6,
+ 0xc0, 0xf7, 0x9d, 0x5, 0xca, 0x97, 0x85, 0xd6,
+ 0xfb, 0xa, 0x1b, 0x45, 0x40, 0x66, 0x5e, 0x4f,
+ 0x1f, 0xba, 0xf7, 0x91, 0x66, 0xa, 0xe2, 0x6,
+ 0x25, 0xfc, 0x9b, 0x7b, 0xa, 0xe, 0x8b, 0xc2,
+ 0xf7, 0xda, 0xc2, 0xed, 0xf7, 0xf, 0x1, 0xf7,
+ 0xe6, 0xf8, 0xaa, 0x15, 0xd1, 0x6, 0xa4, 0xf7,
+ 0xf, 0x5, 0x44, 0x6, 0xfb, 0xb8, 0xfd, 0x25,
+ 0x15, 0xf8, 0x2d, 0x36, 0xa, 0xfb, 0x42, 0x6,
+ 0xd4, 0xf8, 0x11, 0x5, 0xfb, 0x5b, 0x38, 0xa,
+ 0xf7, 0x25, 0x6, 0x4b, 0xfb, 0xda, 0x5, 0xfb,
+ 0x47, 0x6, 0xe, 0xfb, 0x31, 0xc1, 0xf8, 0x84,
+ 0xbf, 0xe9, 0xf7, 0xa, 0x1, 0xf8, 0x50, 0xf8,
+ 0xaf, 0x54, 0xa, 0xfc, 0x23, 0xfd, 0x80, 0x15,
+ 0x76, 0x59, 0x5, 0x82, 0xbe, 0xbe, 0x84, 0xbb,
+ 0x1b, 0xf6, 0xe0, 0xb6, 0xf7, 0x12, 0xaf, 0x1f,
+ 0xea, 0xf8, 0x45, 0x5, 0xfb, 0xe2, 0x82, 0xa,
+ 0xf7, 0xa5, 0x6, 0x39, 0xfc, 0x3, 0x5, 0xfb,
+ 0x9, 0x61, 0x46, 0x7f, 0x5c, 0x1b, 0x51, 0x5c,
+ 0x91, 0x91, 0x68, 0x1f, 0xe, 0x8b, 0xc2, 0xf7,
+ 0xd9, 0xc2, 0xf7, 0x1f, 0xc2, 0x1, 0x97, 0x16,
+ 0xf7, 0x20, 0x6, 0xb1, 0xf7, 0x5a, 0xcd, 0xb5,
+ 0xad, 0x6a, 0xcd, 0x31, 0xb0, 0x4d, 0x19, 0x53,
+ 0x38, 0xa, 0xf7, 0x6a, 0x46, 0xa, 0x2b, 0x6,
+ 0x6d, 0xba, 0x6d, 0xc5, 0x67, 0xb3, 0x4f, 0xcf,
+ 0x18, 0xf7, 0x47, 0xf7, 0x4, 0x5, 0xed, 0x77,
+ 0xa, 0xfb, 0x70, 0x6, 0x82, 0x54, 0x5, 0xb9,
+ 0x6, 0xfb, 0x5f, 0xfb, 0x13, 0xd5, 0xf8, 0xc,
+ 0x66, 0xa, 0xe1, 0x6, 0x26, 0xfc, 0x9b, 0x5,
+ 0x36, 0x6, 0xe, 0x8b, 0xc2, 0xf8, 0x9b, 0xc2,
+ 0x1, 0xe5, 0x16, 0xf8, 0x2d, 0x36, 0xa, 0xfb,
+ 0x43, 0x6, 0xf7, 0x1, 0xf8, 0xd2, 0x5, 0xfb,
+ 0x6b, 0x38, 0xa, 0xf7, 0x34, 0x6, 0x29, 0xfc,
+ 0x9b, 0x5, 0xfb, 0x47, 0x6, 0xe, 0x8b, 0xc1,
+ 0xf7, 0xe0, 0xc2, 0x7e, 0x77, 0x12, 0x13, 0xc0,
+ 0x91, 0x16, 0xf7, 0x11, 0x47, 0xa, 0x49, 0x6,
+ 0xc5, 0xf7, 0xa2, 0x5, 0xa7, 0xa6, 0xac, 0xad,
+ 0xbb, 0x1b, 0xbc, 0x96, 0x6d, 0x72, 0x7d, 0x88,
+ 0x7f, 0x8a, 0x87, 0x1f, 0x4c, 0xfb, 0xc1, 0x5,
+ 0xf7, 0x12, 0x2a, 0xa, 0x49, 0x6, 0xc2, 0xf7,
+ 0x97, 0x5, 0x96, 0x8d, 0xca, 0xcb, 0xc0, 0x1b,
+ 0xb3, 0x97, 0x77, 0x72, 0x78, 0x86, 0x74, 0x87,
+ 0x78, 0x1f, 0x50, 0xfb, 0xae, 0x5, 0xf7, 0x7,
+ 0x2a, 0xa, 0x53, 0x6, 0xc5, 0xf7, 0xa5, 0x8d,
+ 0x9b, 0x99, 0x1a, 0xba, 0x6d, 0xb0, 0x4c, 0x55,
+ 0x5a, 0x69, 0x67, 0x66, 0x1e, 0xb0, 0x83, 0x6e,
+ 0xac, 0x55, 0x1b, 0x5b, 0x64, 0x69, 0x74, 0x68,
+ 0x1f, 0x13, 0xa0, 0x93, 0xb7, 0x5, 0xfb, 0x7,
+ 0x5f, 0xa, 0xc3, 0x6, 0xe, 0x8b, 0xc1, 0xf7,
+ 0xc8, 0xc2, 0x6d, 0xc1, 0x12, 0xf7, 0x7, 0xc1,
+ 0xf7, 0xa5, 0xc1, 0x13, 0xd8, 0x9f, 0x16, 0xf7,
+ 0x72, 0x2a, 0xa, 0x37, 0x6, 0xbb, 0xf7, 0x86,
+ 0x5, 0x13, 0xb8, 0xbf, 0xc9, 0xe1, 0xb2, 0xd6,
+ 0x1b, 0xb5, 0x97, 0x79, 0x6a, 0x82, 0x8a, 0x81,
+ 0x89, 0x80, 0x1f, 0x5a, 0xfb, 0x90, 0x5, 0x38,
+ 0x2d, 0xa, 0xf7, 0x70, 0x2a, 0xa, 0x38, 0x6,
+ 0xbd, 0xf7, 0x91, 0x5, 0x8f, 0x9e, 0x8c, 0x9c,
+ 0x9b, 0x1a, 0xbf, 0x62, 0xa9, 0x40, 0x45, 0x3f,
+ 0x63, 0x5e, 0x4f, 0x1e, 0x99, 0xd3, 0x5, 0xfb,
+ 0x1e, 0x38, 0xa, 0xde, 0x6, 0x4d, 0xfb, 0xd3,
+ 0x5, 0x37, 0x6, 0xe, 0x7c, 0xc1, 0xf7, 0xf0,
+ 0xc1, 0x1, 0xc4, 0xc2, 0xf8, 0xb, 0xc3, 0x3,
+ 0xc4, 0xf7, 0x3b, 0x15, 0xfb, 0x0, 0xd5, 0x41,
+ 0xf7, 0x17, 0xf7, 0x39, 0xf7, 0x8, 0xf7, 0x13,
+ 0xf7, 0x2c, 0xde, 0x5d, 0xe9, 0xfb, 0x2b, 0xfb,
+ 0x28, 0xfb, 0x21, 0xfb, 0x2, 0xfb, 0x38, 0x1e,
+ 0xc2, 0x92, 0x15, 0xf7, 0x1, 0xea, 0xf3, 0xf7,
+ 0x14, 0xf7, 0xd, 0xaa, 0x40, 0x51, 0xfb, 0x9,
+ 0x2b, 0x29, 0xfb, 0xc, 0xfb, 0x1, 0x59, 0xcd,
+ 0xd0, 0x1e, 0xe, 0xfb, 0x31, 0xbe, 0xf7, 0xa,
+ 0xbf, 0xf7, 0xc5, 0xbf, 0x6a, 0xc0, 0x12, 0xf8,
+ 0x90, 0xc4, 0x13, 0xd8, 0x6a, 0x21, 0x15, 0x80,
+ 0x58, 0x5, 0xf7, 0xbb, 0x78, 0xa, 0xfb, 0x30,
+ 0x6, 0xb2, 0xf7, 0x4d, 0x5, 0x65, 0xa3, 0xbd,
+ 0x6e, 0xe7, 0x1b, 0xf7, 0x20, 0xf7, 0x6, 0xf7,
+ 0xa, 0xf7, 0x27, 0xe7, 0x4d, 0xd3, 0x21, 0x33,
+ 0x50, 0x60, 0x5f, 0x5d, 0x1f, 0x13, 0xe8, 0x9a,
+ 0xce, 0x5, 0xfb, 0x1f, 0x6, 0x81, 0x57, 0x5,
+ 0xdf, 0x6, 0x25, 0xfc, 0x6f, 0x5, 0xf7, 0xb,
+ 0xf7, 0xb2, 0x15, 0x13, 0xd8, 0xed, 0xe5, 0xf7,
+ 0x2, 0xf7, 0xe, 0xf3, 0xa0, 0x4d, 0x55, 0xfb,
+ 0xe, 0x2b, 0x35, 0x2d, 0x37, 0x4c, 0xb2, 0xd8,
+ 0x1e, 0xe, 0xfb, 0x31, 0xbf, 0xf7, 0xb, 0xbe,
+ 0xf7, 0xcd, 0xbe, 0x63, 0xbf, 0x12, 0xb4, 0xc4,
+ 0x13, 0xe8, 0xf7, 0x6b, 0x22, 0x15, 0x80, 0x57,
+ 0x5, 0xf7, 0xbf, 0x6, 0x96, 0xbf, 0x5, 0x35,
+ 0x6, 0xf4, 0xf8, 0x77, 0x5, 0xe0, 0x6, 0x95,
+ 0xbe, 0x5, 0xfb, 0x20, 0x6, 0x78, 0x42, 0x5,
+ 0x13, 0xd8, 0xb2, 0x75, 0x53, 0xb9, 0x36, 0x1b,
+ 0xfb, 0x1b, 0xfb, 0x16, 0xfb, 0x6, 0xfb, 0x24,
+ 0x27, 0xcc, 0x46, 0xf7, 0x2, 0xcb, 0xd2, 0x98,
+ 0xc1, 0xc7, 0x1f, 0x65, 0xfb, 0x4e, 0x5, 0xfb,
+ 0xa7, 0xf7, 0xbf, 0x15, 0xd3, 0xbc, 0xf7, 0xf,
+ 0xf7, 0x2a, 0xef, 0xba, 0x49, 0x3f, 0xfb, 0xb,
+ 0xfb, 0x12, 0x4c, 0x32, 0x40, 0x53, 0xbb, 0xdc,
+ 0x1e, 0xe, 0x8b, 0xc1, 0xf7, 0xe2, 0xc1, 0x1,
+ 0xf7, 0x32, 0xc4, 0x3, 0x9f, 0x16, 0xf7, 0xfe,
+ 0x2a, 0xa, 0xfb, 0x46, 0x6, 0xb4, 0xf7, 0x64,
+ 0x5, 0xf2, 0xf7, 0x18, 0xbc, 0xa2, 0xc1, 0x1b,
+ 0xa4, 0xa0, 0x85, 0x69, 0x8c, 0x1f, 0xc4, 0x90,
+ 0x5, 0xbe, 0x8c, 0x79, 0xb0, 0x51, 0x1b, 0x2a,
+ 0x3e, 0x4c, 0x54, 0x3f, 0x1f, 0x9f, 0xf4, 0x5,
+ 0xfb, 0x4c, 0x5f, 0xa, 0xf7, 0x13, 0x6, 0x4a,
+ 0xfb, 0xd4, 0x5, 0xfb, 0x13, 0x6, 0xe, 0x7c,
+ 0xc1, 0xf7, 0xf0, 0xc1, 0x1, 0xf7, 0xa, 0xca,
+ 0xf7, 0xaa, 0xc5, 0x3, 0xba, 0x7c, 0x15, 0xc4,
+ 0x3c, 0xa, 0x72, 0xb2, 0xbe, 0x6c, 0xdd, 0x1b,
+ 0xf7, 0x10, 0xf5, 0xba, 0xf3, 0xcc, 0x52, 0xa5,
+ 0x53, 0x94, 0x1f, 0x54, 0x94, 0xfb, 0x3c, 0x9c,
+ 0xbf, 0x1a, 0xd8, 0xea, 0x87, 0xbf, 0xc4, 0xbf,
+ 0x71, 0x70, 0xb1, 0x1e, 0x81, 0x5a, 0x51, 0xa,
+ 0xab, 0xf7, 0x30, 0x71, 0xa, 0x80, 0x5b, 0x5,
+ 0xa5, 0x62, 0x58, 0xa1, 0x51, 0x1b, 0xfb, 0x19,
+ 0x36, 0x67, 0x2a, 0x42, 0xf7, 0x21, 0x60, 0xd6,
+ 0x85, 0x1f, 0xb9, 0x87, 0xda, 0x83, 0x5b, 0x1a,
+ 0x30, 0xfb, 0x19, 0x8f, 0x62, 0x4a, 0x50, 0xa8,
+ 0xb2, 0x6a, 0x1e, 0x95, 0xbb, 0x62, 0xa, 0xe,
+ 0x7c, 0xc2, 0xf7, 0xe4, 0xc2, 0xf7, 0x16, 0x77,
+ 0x1, 0xf7, 0x17, 0xc6, 0x3, 0xf7, 0x5, 0xf8,
+ 0xc, 0x15, 0xd4, 0x6, 0x54, 0xfb, 0xa7, 0x8b,
+ 0x7f, 0x7f, 0x1a, 0x3d, 0x8c, 0xe9, 0x7d, 0xb9,
+ 0x1b, 0xd8, 0xdd, 0xa8, 0xa6, 0xd2, 0x1f, 0x8f,
+ 0xc1, 0x5, 0x77, 0x51, 0x37, 0x68, 0x45, 0x1b,
+ 0x51, 0x5d, 0x92, 0xc7, 0x1f, 0xbf, 0xf7, 0xa1,
+ 0x5, 0xf7, 0x93, 0x77, 0xa, 0xfb, 0x93, 0x6,
+ 0xa5, 0xf7, 0x16, 0x71, 0xa, 0x71, 0xfb, 0x16,
+ 0x5, 0x42, 0x6, 0xe, 0x7c, 0xc0, 0x63, 0xc1,
+ 0xf7, 0xd4, 0xc1, 0x12, 0x13, 0xa0, 0xcb, 0xf8,
+ 0x8, 0x85, 0xa, 0x58, 0xfb, 0x96, 0x8a, 0x80,
+ 0x81, 0x1a, 0x45, 0xc2, 0x65, 0xd7, 0xb2, 0xc0,
+ 0x9c, 0xd2, 0xe3, 0x1e, 0x13, 0x60, 0x7c, 0x40,
+ 0x5, 0xf7, 0x1a, 0x2a, 0xa, 0x3a, 0x6, 0xd3,
+ 0xf8, 0xa, 0x55, 0xa, 0x82, 0x55, 0x5, 0xdc,
+ 0x6, 0x5e, 0xfb, 0x7a, 0x5, 0x13, 0xa0, 0x59,
+ 0x5b, 0x4d, 0x55, 0x4d, 0x1b, 0x56, 0x62, 0xa1,
+ 0xb2, 0x90, 0x8b, 0x90, 0x8c, 0x90, 0x1f, 0x9e,
+ 0xf3, 0x9d, 0xf3, 0x9e, 0xf3, 0x8, 0xfb, 0x1b,
+ 0x6, 0xe, 0x96, 0x76, 0xf8, 0x11, 0xc2, 0x1,
+ 0xf7, 0x52, 0x81, 0x15, 0xcc, 0x6, 0xf7, 0x8d,
+ 0xf8, 0x11, 0x5, 0xdc, 0x77, 0xa, 0xfb, 0x6a,
+ 0x67, 0xa, 0xd5, 0x6, 0xfb, 0x68, 0xfb, 0xd7,
+ 0x38, 0xf7, 0xd7, 0x5, 0xd7, 0x77, 0xa, 0xfb,
+ 0x72, 0x67, 0xa, 0xe2, 0x6, 0xe, 0x96, 0x76,
+ 0xf8, 0x11, 0xc2, 0x1, 0xcb, 0xc0, 0x3, 0xdc,
+ 0x81, 0x15, 0xcb, 0x6, 0xf7, 0x11, 0xf7, 0x9b,
+ 0xaa, 0xfb, 0x9b, 0x5, 0xc8, 0x6, 0xf7, 0x44,
+ 0xf8, 0x11, 0x5, 0xb0, 0x77, 0xa, 0xfb, 0x32,
+ 0x38, 0xa, 0xd3, 0x6, 0xfb, 0x23, 0xfb, 0xc5,
+ 0x6b, 0xf7, 0xb2, 0x5, 0x5b, 0x6, 0xfb, 0x1b,
+ 0xfb, 0xb0, 0x71, 0xf7, 0xc3, 0x5, 0xd4, 0x6,
+ 0x94, 0xc2, 0x5, 0xfb, 0x36, 0x67, 0xa, 0xac,
+ 0x6, 0xe, 0x8b, 0xc1, 0xf7, 0xd3, 0xc0, 0x1,
+ 0x7a, 0x16, 0xf7, 0x68, 0x47, 0xa, 0x48, 0x6,
+ 0xf7, 0x3b, 0xf7, 0x16, 0xf7, 0x2, 0xfb, 0x16,
+ 0x5, 0x4c, 0x2d, 0xa, 0xf7, 0x69, 0x47, 0xa,
+ 0x3b, 0x6, 0xfb, 0x21, 0xf7, 0x38, 0xf7, 0x48,
+ 0xf7, 0x2f, 0x5, 0xdc, 0x6, 0x95, 0xc0, 0x5,
+ 0xfb, 0x55, 0x68, 0xa, 0xb6, 0x6, 0xfb, 0x1f,
+ 0xfb, 0xc, 0x30, 0xf7, 0xc, 0x5, 0xbf, 0x6,
+ 0x95, 0xc0, 0x5, 0xfb, 0x5e, 0x68, 0xa, 0xdb,
+ 0x6, 0xf7, 0xd, 0xfb, 0x2e, 0xfb, 0x64, 0xfb,
+ 0x39, 0x5, 0x3e, 0x6, 0xe, 0xfb, 0x31, 0xbe,
+ 0xf8, 0x75, 0xbe, 0x1, 0x6c, 0x21, 0x15, 0x7f,
+ 0x58, 0x5, 0xf7, 0xa2, 0x78, 0xa, 0x32, 0x6,
+ 0xf8, 0x35, 0xf8, 0x75, 0x5, 0xce, 0x78, 0xa,
+ 0xfb, 0x53, 0x6, 0x80, 0x58, 0x5, 0xc7, 0x6,
+ 0xfb, 0x7c, 0xfb, 0xa1, 0x21, 0xf7, 0xa1, 0x5,
+ 0xce, 0x78, 0xa, 0xfb, 0x5f, 0x6, 0x80, 0x58,
+ 0x5, 0xd3, 0x6, 0xf7, 0x13, 0xfb, 0xd2, 0xfb,
+ 0x22, 0xfb, 0x37, 0x5, 0xe, 0x8b, 0xc1, 0xf7,
+ 0xd2, 0xc1, 0x1, 0xc0, 0x16, 0xf8, 0x2d, 0x6,
+ 0xaa, 0xf7, 0x1a, 0x52, 0xa, 0x76, 0x3b, 0x5,
+ 0xfb, 0xa7, 0x6, 0xf8, 0x1f, 0xf7, 0xd6, 0x95,
+ 0xbd, 0x5, 0xfc, 0x1f, 0x6, 0x6b, 0xfb, 0x18,
+ 0x5, 0xc1, 0x6, 0xa2, 0xd9, 0x5, 0xf7, 0x98,
+ 0x6, 0xfc, 0x1e, 0xfb, 0xd5, 0x5, 0xe, 0xfb,
+ 0x70, 0xc0, 0xf9, 0xf1, 0xc0, 0x1, 0xf7, 0x53,
+ 0xba, 0x3, 0xf7, 0xa, 0xf7, 0x81, 0x15, 0xbe,
+ 0x73, 0x9e, 0x78, 0x8a, 0x53, 0x8, 0x74, 0x86,
+ 0x6d, 0x82, 0x65, 0x1e, 0x7a, 0x3b, 0x84, 0x55,
+ 0x65, 0x1a, 0x4c, 0xb1, 0x7b, 0xe4, 0x7b, 0x1e,
+ 0x95, 0xc0, 0x5, 0x59, 0x93, 0x67, 0x96, 0xad,
+ 0x1a, 0xa9, 0x92, 0xbb, 0xa0, 0xde, 0x1e, 0x91,
+ 0xa4, 0x8f, 0xb9, 0xb5, 0x1a, 0xb5, 0x7e, 0xb4,
+ 0x6e, 0xa1, 0x1e, 0xe6, 0xc2, 0xa1, 0xf7, 0x0,
+ 0x92, 0xb9, 0x8, 0xf7, 0x5f, 0xb0, 0xab, 0x9c,
+ 0xdf, 0x1b, 0x97, 0xc0, 0x5, 0xfb, 0x23, 0x74,
+ 0x5d, 0xfb, 0x71, 0x59, 0x1f, 0x6f, 0xfb, 0x14,
+ 0x72, 0x6e, 0x38, 0x6a, 0x8, 0xe, 0xfb, 0x79,
+ 0x76, 0xfa, 0x7c, 0x77, 0x1, 0xf7, 0x3c, 0xbe,
+ 0x3, 0xf7, 0x3c, 0xfb, 0x8e, 0x15, 0xbe, 0x6,
+ 0xf7, 0x68, 0xfa, 0x7c, 0x5, 0x58, 0x6, 0xe,
+ 0xfb, 0x71, 0xc0, 0xf9, 0xf1, 0xc0, 0x1, 0xf7,
+ 0xaf, 0xbe, 0x3, 0xf8, 0x75, 0xf7, 0xb5, 0x15,
+ 0x58, 0xa3, 0x78, 0x9e, 0x8c, 0xc3, 0x8, 0xa2,
+ 0x8f, 0xa9, 0x94, 0xb1, 0x1e, 0x9c, 0xdb, 0x93,
+ 0xc1, 0xb1, 0x1a, 0xca, 0x65, 0x9b, 0x32, 0x9b,
+ 0x1e, 0x81, 0x56, 0x5, 0xbd, 0x83, 0xaf, 0x80,
+ 0x69, 0x1a, 0x6d, 0x81, 0x59, 0x7c, 0x3a, 0x1e,
+ 0x86, 0x72, 0x83, 0x5d, 0x61, 0x1a, 0x61, 0x98,
+ 0x62, 0xa8, 0x75, 0x1e, 0x30, 0x54, 0x75, 0xfb,
+ 0x0, 0x84, 0x5d, 0x8, 0xfb, 0x5f, 0x66, 0x6b,
+ 0x7a, 0x37, 0x1b, 0x7f, 0x56, 0x5, 0xf7, 0x23,
+ 0xa2, 0xb9, 0xf7, 0x71, 0xbd, 0x1f, 0xa7, 0xf7,
+ 0x14, 0xa4, 0xa8, 0xde, 0xac, 0x8, 0xe, 0xf7,
+ 0x59, 0xc8, 0x91, 0xc3, 0x12, 0xf0, 0xf7, 0x59,
+ 0x15, 0xaa, 0xa7, 0xaf, 0xaf, 0xb1, 0x1b, 0xb0,
+ 0xa6, 0x78, 0x7a, 0xa7, 0x1f, 0x7b, 0xa4, 0xa5,
+ 0x7c, 0xae, 0x1b, 0xcd, 0xbf, 0xaf, 0xb7, 0xb6,
+ 0x1f, 0x64, 0xb6, 0x5, 0x77, 0x78, 0x4f, 0x61,
+ 0x66, 0x1b, 0x6e, 0x77, 0x97, 0x99, 0x75, 0x1f,
+ 0x9c, 0x70, 0x6e, 0x9e, 0x53, 0x1b, 0x4b, 0x62,
+ 0x5e, 0x67, 0x62, 0x1f, 0xe, 0xfb, 0x1c, 0x76,
+ 0xf8, 0x67, 0xf7, 0xc, 0x1, 0xf7, 0x9f, 0xf7,
+ 0x23, 0x3, 0xf7, 0x9f, 0xf7, 0xf8, 0x15, 0x71,
+ 0xa7, 0x77, 0xa8, 0xba, 0xb2, 0xae, 0xaf, 0xa5,
+ 0x74, 0xa2, 0x66, 0x5b, 0x68, 0x69, 0x63, 0x1e,
+ 0x3e, 0xfc, 0x95, 0x85, 0xa, 0xc9, 0xf8, 0x1e,
+ 0x5, 0x5d, 0x6, 0xe, 0xe9, 0xc2, 0xf7, 0xa1,
+ 0xc2, 0x1, 0xdc, 0xc4, 0xf7, 0x4f, 0xc2, 0x3,
+ 0xf7, 0x56, 0x5a, 0x15, 0xc2, 0x6, 0xa6, 0xf7,
+ 0x23, 0xd3, 0x8f, 0xc7, 0xa7, 0xc7, 0xad, 0x19,
+ 0x85, 0xb9, 0x5, 0x6b, 0x50, 0x4b, 0x72, 0x49,
+ 0x1b, 0x29, 0x66, 0xc2, 0xbb, 0xe1, 0xdd, 0xdb,
+ 0xf3, 0xb8, 0xc1, 0x7b, 0x6c, 0x9d, 0x1f, 0x81,
+ 0x59, 0x6a, 0xa, 0xab, 0xf7, 0x36, 0x5, 0x55,
+ 0x6, 0x81, 0x58, 0x6c, 0xa3, 0x6a, 0x99, 0x66,
+ 0x8f, 0x19, 0xa6, 0xf7, 0x20, 0x52, 0xa, 0x70,
+ 0xfb, 0x21, 0x5, 0x34, 0x8a, 0xfb, 0x16, 0x2c,
+ 0xfb, 0x18, 0x1a, 0x2e, 0xcf, 0x58, 0xd3, 0x84,
+ 0x1e, 0xe, 0x76, 0xc5, 0xf7, 0x82, 0xc4, 0xf7,
+ 0x71, 0xc5, 0x12, 0xf7, 0x33, 0xc1, 0x61, 0xbf,
+ 0x13, 0xe8, 0xbe, 0xaa, 0x15, 0x9b, 0x57, 0x5,
+ 0xa1, 0xc0, 0xe0, 0x93, 0x9b, 0x1b, 0xa1, 0x9d,
+ 0x82, 0x83, 0xa0, 0x1f, 0x84, 0x9d, 0x9f, 0x85,
+ 0xa4, 0x53, 0xa, 0x74, 0x7b, 0x91, 0x92, 0x7b,
+ 0x1f, 0x94, 0x77, 0x79, 0x94, 0x70, 0x1b, 0x69,
+ 0x67, 0x81, 0x7c, 0x69, 0x1f, 0x8e, 0x6, 0xea,
+ 0xe0, 0x8c, 0xc8, 0x8c, 0xe1, 0x8, 0xf7, 0x6e,
+ 0x6, 0x96, 0xc4, 0x5, 0xfb, 0x7f, 0x6, 0x13,
+ 0xf0, 0x89, 0xa3, 0x88, 0xa5, 0x8c, 0xa5, 0x8,
+ 0x42, 0xa, 0x6c, 0x8f, 0x6d, 0x8d, 0x6e, 0x8,
+ 0x2c, 0x6, 0x80, 0x52, 0x5, 0x13, 0xe8, 0xf7,
+ 0x5, 0x6, 0x23, 0x64, 0x3f, 0x3a, 0x4b, 0x1e,
+ 0xe, 0xd7, 0xb9, 0x60, 0x76, 0xf8, 0x14, 0xb9,
+ 0x9d, 0x77, 0x12, 0xe1, 0xbb, 0xf7, 0xdf, 0xbc,
+ 0x13, 0x6c, 0xac, 0xeb, 0x15, 0xa9, 0x65, 0xda,
+ 0xc5, 0x5, 0x13, 0xac, 0x64, 0xb9, 0xb0, 0x8a,
+ 0xac, 0x1b, 0xbd, 0xbe, 0x9b, 0xa7, 0xb7, 0x1f,
+ 0x13, 0x5c, 0xbe, 0x4d, 0xae, 0xa8, 0x58, 0xcb,
+ 0x5, 0xbe, 0xb3, 0xa4, 0xd6, 0xc1, 0x1a, 0x8c,
+ 0xaf, 0x86, 0xa4, 0x7a, 0xa5, 0xd5, 0xc9, 0x18,
+ 0x6c, 0xb0, 0x42, 0x50, 0x5, 0x13, 0xac, 0xa9,
+ 0x6c, 0x62, 0x96, 0x5a, 0x1b, 0x59, 0x55, 0x7b,
+ 0x6e, 0x61, 0x1f, 0x13, 0x9c, 0x57, 0xca, 0x66,
+ 0x6c, 0xc0, 0x4c, 0x5, 0x57, 0x51, 0x75, 0x5d,
+ 0x4c, 0x1a, 0x8a, 0x68, 0x92, 0x6e, 0x9c, 0x71,
+ 0x8, 0xa4, 0xe4, 0x15, 0x13, 0xac, 0xea, 0xe2,
+ 0xf2, 0xf7, 0x3, 0xdb, 0xc0, 0x52, 0x48, 0xfb,
+ 0x4, 0x21, 0x37, 0x30, 0x3f, 0x51, 0xbe, 0xd2,
+ 0x1e, 0xe, 0x8b, 0xc1, 0xd9, 0xc1, 0xcf, 0xc2,
+ 0xf7, 0x5b, 0xc1, 0x1, 0xc3, 0x16, 0xf7, 0xa9,
+ 0x2a, 0xa, 0xfb, 0x2, 0x6, 0x9a, 0xd9, 0x5,
+ 0xf7, 0x18, 0x47, 0xa, 0xfb, 0x19, 0x6, 0x98,
+ 0xcf, 0x5, 0xf7, 0x19, 0x46, 0xa, 0xfb, 0x12,
+ 0x6, 0xf7, 0x5f, 0xf7, 0x5b, 0x5, 0xdb, 0x2a,
+ 0xa, 0xfb, 0x64, 0x2d, 0xa, 0xd0, 0x6, 0xfb,
+ 0x45, 0xfb, 0x40, 0x22, 0xf7, 0x40, 0x5, 0xcf,
+ 0x2a, 0xa, 0xfb, 0x65, 0x2d, 0xa, 0xdc, 0x6,
+ 0xf7, 0xe, 0xfb, 0x5b, 0x5, 0xfb, 0xb, 0x38,
+ 0xa, 0xf7, 0x17, 0x6, 0x7e, 0x47, 0x5, 0xfb,
+ 0x17, 0x45, 0xa, 0xf7, 0x18, 0x6, 0x7b, 0x3d,
+ 0x5, 0xfb, 0x2, 0x6, 0xe, 0xf7, 0x4c, 0xbc,
+ 0x3, 0xf7, 0xad, 0xf7, 0xaf, 0x15, 0xbd, 0x6,
+ 0xdf, 0xf8, 0x1c, 0x5, 0x59, 0x6, 0xfb, 0x49,
+ 0xfd, 0xe6, 0x15, 0xbc, 0x6, 0xe0, 0xf8, 0x1d,
+ 0x5, 0x59, 0x6, 0xe, 0x3d, 0xc2, 0xf7, 0xb,
+ 0xb4, 0xf8, 0x18, 0xc2, 0x1, 0xe3, 0xc4, 0xf7,
+ 0x71, 0xc4, 0x3, 0xc4, 0x3d, 0x15, 0xf7, 0x87,
+ 0x6, 0xcd, 0xc4, 0xac, 0xbc, 0xa6, 0x7e, 0xaa,
+ 0x68, 0xad, 0x1f, 0xe3, 0x8a, 0xa7, 0xde, 0xb0,
+ 0x1a, 0xa8, 0x7a, 0xa3, 0x75, 0x9d, 0x1e, 0xfb,
+ 0x65, 0xf7, 0x4c, 0x87, 0x93, 0x96, 0x1a, 0xaf,
+ 0x8c, 0xb7, 0x8b, 0xa0, 0x1b, 0xf7, 0x3f, 0x6,
+ 0x75, 0x26, 0x5, 0xc4, 0x6, 0xab, 0xf7, 0x30,
+ 0x5, 0xfb, 0x50, 0x6, 0x48, 0x24, 0x85, 0x35,
+ 0x70, 0x9a, 0x76, 0xab, 0x6a, 0x1f, 0x5a, 0x4a,
+ 0x56, 0x52, 0x73, 0x9d, 0x6a, 0xa0, 0x79, 0x1f,
+ 0xf7, 0x4e, 0xfb, 0x39, 0x5, 0x99, 0x7f, 0x94,
+ 0x77, 0x7b, 0x1a, 0x79, 0x7d, 0x7d, 0x6d, 0x1e,
+ 0xfb, 0x5a, 0x6, 0xa0, 0xf0, 0x62, 0xa, 0xf7,
+ 0x93, 0xc6, 0x15, 0xfb, 0x1d, 0xf7, 0xb, 0x5,
+ 0x7c, 0x99, 0x85, 0x9a, 0x9a, 0x1a, 0xaf, 0xb6,
+ 0xab, 0xb2, 0x8c, 0x1e, 0xf7, 0x22, 0xfb, 0x9,
+ 0x5, 0x9a, 0x7d, 0x96, 0x7f, 0x74, 0x1a, 0x7c,
+ 0x75, 0x58, 0x45, 0x1e, 0xe, 0xf8, 0x80, 0xf2,
+ 0x1, 0xf7, 0xd9, 0xf8, 0x80, 0x15, 0xef, 0x6,
+ 0xa8, 0xf2, 0x5, 0x27, 0x6, 0xfb, 0x64, 0x24,
+ 0x15, 0xf2, 0x6, 0xa8, 0xf2, 0x5, 0x24, 0x6,
+ 0xe, 0x79, 0xb9, 0xe6, 0xb8, 0xf7, 0x8f, 0xb8,
+ 0xd7, 0xb7, 0x1, 0x84, 0xb9, 0xf7, 0x0, 0xba,
+ 0xf8, 0x3, 0xb9, 0x3, 0x84, 0xf7, 0x66, 0x15,
+ 0xfb, 0x18, 0xf5, 0x2b, 0xf7, 0x23, 0xf7, 0x59,
+ 0xf7, 0x3c, 0xf7, 0x38, 0xf7, 0x5d, 0xf7, 0x1d,
+ 0x20, 0xeb, 0xfb, 0x1f, 0xfb, 0x41, 0xfb, 0x57,
+ 0xfb, 0x35, 0xfb, 0x65, 0x1e, 0xb9, 0x9c, 0x15,
+ 0xf7, 0x2f, 0xf7, 0x20, 0xf7, 0x2e, 0xf7, 0x43,
+ 0xf7, 0x11, 0xdd, 0x39, 0xfb, 0x8, 0xfb, 0x37,
+ 0xfb, 0x2e, 0xfb, 0x27, 0xfb, 0x31, 0xfb, 0xa,
+ 0x2e, 0xde, 0xf7, 0x8, 0x1e, 0xf7, 0xfc, 0x7d,
+ 0x15, 0x6b, 0x69, 0x63, 0x7a, 0x68, 0x1b, 0x51,
+ 0x65, 0xb5, 0xc0, 0xe3, 0xd7, 0xcf, 0xd3, 0xaa,
+ 0xb1, 0x7c, 0x77, 0x9f, 0x1f, 0xad, 0xae, 0x5,
+ 0xab, 0x66, 0x6e, 0x98, 0x5d, 0x1b, 0xfb, 0x7,
+ 0x30, 0x27, 0x20, 0x39, 0xca, 0x57, 0xd2, 0xbd,
+ 0xc5, 0xa3, 0xab, 0xb2, 0x1f, 0xe, 0xf7, 0x8d,
+ 0xc7, 0xda, 0xc5, 0xda, 0xc2, 0x1, 0xf7, 0xeb,
+ 0xf7, 0x95, 0x15, 0xee, 0x6, 0x94, 0xc6, 0x5,
+ 0x56, 0x6, 0xa0, 0xf7, 0x25, 0x5, 0x8d, 0x9a,
+ 0x8d, 0x99, 0x95, 0x1a, 0xc8, 0x5c, 0x9e, 0x58,
+ 0x5b, 0x54, 0x7a, 0x7c, 0x6d, 0x1e, 0x8e, 0x50,
+ 0x5, 0x9d, 0xa6, 0xc1, 0x9d, 0xb4, 0x1b, 0xac,
+ 0xa2, 0x84, 0x61, 0x80, 0x89, 0x7f, 0x87, 0x7b,
+ 0x1f, 0x90, 0x75, 0x71, 0x8f, 0x71, 0x1b, 0xfb,
+ 0x8, 0x6e, 0x43, 0x5d, 0x62, 0xa8, 0x65, 0xbd,
+ 0xb6, 0xb9, 0xa7, 0xac, 0xae, 0x1f, 0x93, 0xd1,
+ 0x15, 0x5f, 0x6a, 0x5e, 0x70, 0x62, 0x1b, 0x71,
+ 0x78, 0x94, 0x9f, 0xab, 0xa7, 0x9d, 0xc1, 0xb4,
+ 0xb4, 0x83, 0x8b, 0x1f, 0xe, 0xda, 0x76, 0xf8,
+ 0x18, 0x77, 0x1, 0xf7, 0x86, 0xf7, 0x93, 0x15,
+ 0xf7, 0x4b, 0xfb, 0x4d, 0xab, 0xba, 0xfb, 0x15,
+ 0xf7, 0x1e, 0xf7, 0x59, 0xf7, 0x24, 0x6e, 0xba,
+ 0x5, 0xfc, 0x39, 0xfb, 0x53, 0x15, 0xf7, 0x3e,
+ 0xfb, 0x4d, 0xb1, 0xbc, 0xfb, 0x14, 0xf7, 0x1c,
+ 0xf7, 0x52, 0xf7, 0x24, 0x6c, 0xba, 0x5, 0xe,
+ 0xf7, 0x15, 0x76, 0xf7, 0x5b, 0xc9, 0x1, 0xdd,
+ 0xf7, 0xc7, 0x15, 0xf8, 0x7, 0x6, 0x68, 0xfb,
+ 0x5b, 0x6a, 0xa, 0xb8, 0xf7, 0x99, 0x5, 0xfc,
+ 0x3e, 0x6, 0xe, 0x79, 0xb9, 0xf7, 0x7, 0xf7,
+ 0x37, 0xe8, 0xbb, 0xe4, 0xb7, 0x1, 0x84, 0xbb,
+ 0xf7, 0xde, 0xbd, 0xf7, 0x1f, 0xba, 0x3, 0x84,
+ 0xf7, 0x74, 0x15, 0xfb, 0x1e, 0xf1, 0x23, 0xf7,
+ 0x27, 0xf7, 0x48, 0xf7, 0x4d, 0xf7, 0x35, 0xf7,
+ 0x5d, 0xf7, 0x1e, 0x21, 0xed, 0xfb, 0x20, 0xfb,
+ 0x3a, 0xfb, 0x5e, 0xfb, 0x2a, 0xfb, 0x62, 0x1e,
+ 0xbb, 0x93, 0x15, 0xf7, 0x1d, 0xf7, 0x22, 0xf7,
+ 0x3b, 0xf7, 0x3f, 0xf7, 0xe, 0xdf, 0x33, 0xfb,
+ 0x4, 0xfb, 0x30, 0xfb, 0x33, 0xfb, 0x2c, 0xfb,
+ 0x2b, 0xfb, 0xc, 0x32, 0xe0, 0xf7, 0xb, 0x1e,
+ 0xf7, 0x17, 0x32, 0x15, 0xba, 0x6, 0xa1, 0xf5,
+ 0x5, 0xbf, 0x6, 0xa9, 0x21, 0x5, 0xc6, 0x6,
+ 0x6d, 0xf7, 0x9, 0x5, 0xbf, 0x9d, 0x9c, 0xba,
+ 0xbc, 0x1a, 0xb8, 0x63, 0xa7, 0x5e, 0x1e, 0x23,
+ 0x6, 0x9d, 0xfb, 0x21, 0x15, 0x9f, 0xe8, 0x6a,
+ 0xa, 0xa8, 0x9c, 0x79, 0x7b, 0x59, 0x71, 0x82,
+ 0x65, 0x1f, 0xe, 0xf8, 0xa1, 0xb3, 0x1, 0xf7,
+ 0x8, 0xf8, 0xa1, 0x15, 0xf7, 0xfc, 0x6, 0x93,
+ 0xb3, 0x5, 0xfb, 0xfc, 0x6, 0xe, 0xf7, 0x9e,
+ 0xc9, 0xf7, 0x7c, 0xc9, 0x1, 0xf7, 0xb, 0xca,
+ 0xf7, 0x80, 0xca, 0x3, 0xf7, 0xb, 0xf8, 0x28,
+ 0x15, 0x3f, 0xc6, 0x4d, 0xe2, 0xf7, 0x1, 0xf6,
+ 0xf2, 0xf7, 0x11, 0xca, 0x5f, 0xcc, 0x28, 0xfb,
+ 0xb, 0x27, 0x23, 0xfb, 0x6, 0x1e, 0xca, 0x9a,
+ 0x15, 0xbf, 0xc1, 0xe4, 0xe4, 0xd0, 0xa3, 0x5d,
+ 0x67, 0x4f, 0x46, 0x31, 0x43, 0x4f, 0x68, 0xb6,
+ 0xbb, 0x1e, 0xe, 0xb7, 0xc0, 0xf7, 0x79, 0xc0,
+ 0xf7, 0x47, 0x77, 0x1, 0xf7, 0x97, 0xc2, 0x3,
+ 0xf7, 0x97, 0xf7, 0x26, 0x15, 0xc2, 0x6, 0xb0,
+ 0xf7, 0x48, 0x5, 0xf7, 0x4f, 0x80, 0xa, 0xfb,
+ 0x4f, 0x6, 0xaf, 0xf7, 0x47, 0x52, 0xa, 0x67,
+ 0xfb, 0x47, 0x5, 0xfb, 0x4f, 0x6, 0x80, 0x56,
+ 0x5, 0xf7, 0x4f, 0x6, 0xfb, 0x89, 0xfb, 0xae,
+ 0x15, 0xf8, 0x41, 0x80, 0xa, 0xfc, 0x41, 0x6,
+ 0xe, 0xf7, 0x8d, 0xc3, 0xf7, 0x9b, 0xc1, 0x1,
+ 0xf8, 0x1f, 0xc4, 0x3, 0xf7, 0x27, 0xf7, 0x8d,
+ 0x15, 0xf7, 0x91, 0x3c, 0xa, 0xfb, 0x3d, 0x6,
+ 0xf7, 0x17, 0xdf, 0xda, 0xbb, 0xef, 0x1a, 0xb9,
+ 0x68, 0xb2, 0x48, 0x5f, 0x4a, 0x74, 0x58, 0x73,
+ 0x1e, 0x82, 0x52, 0x5, 0xc0, 0x6, 0xb2, 0x8a,
+ 0xba, 0xb1, 0xaa, 0x1b, 0xae, 0xa1, 0x75, 0x71,
+ 0x5c, 0x62, 0x63, 0x68, 0x74, 0x1f, 0xfb, 0x36,
+ 0xfb, 0x1, 0x5, 0xe, 0xf7, 0x84, 0xc3, 0xf5,
+ 0xc2, 0xf7, 0x2, 0xc2, 0x12, 0xf8, 0xa, 0xc5,
+ 0x5e, 0xc4, 0x13, 0xf0, 0xf7, 0x30, 0xf7, 0xa3,
+ 0x15, 0x7c, 0xa8, 0xbb, 0x7b, 0xb6, 0x1b, 0xd7,
+ 0xdb, 0xc0, 0xde, 0xae, 0x79, 0x9a, 0x75, 0x97,
+ 0x1f, 0x13, 0xe8, 0xae, 0xa1, 0x9c, 0xb2, 0xb4,
+ 0x1a, 0xbc, 0x65, 0xac, 0x54, 0x60, 0x5c, 0x77,
+ 0x75, 0x64, 0x1e, 0x96, 0x57, 0x5, 0x9d, 0xab,
+ 0xac, 0xa0, 0xad, 0x1b, 0xa6, 0xa7, 0x7d, 0x71,
+ 0x5e, 0x5a, 0x72, 0x4b, 0x1f, 0x87, 0x79, 0x87,
+ 0x78, 0x87, 0x79, 0x8, 0x99, 0x9f, 0x8b, 0x9f,
+ 0x1b, 0x13, 0xf0, 0xa9, 0xa7, 0x81, 0x6e, 0x6a,
+ 0x71, 0x69, 0x4b, 0x66, 0x67, 0x99, 0x9d, 0x6f,
+ 0x1f, 0xe, 0x65, 0xa, 0xf7, 0x42, 0xf8, 0x85,
+ 0x15, 0xf7, 0x96, 0xf0, 0x7b, 0xd5, 0xfb, 0x8c,
+ 0xfb, 0x24, 0x5, 0xe, 0xf7, 0x22, 0xac, 0x15,
+ 0x75, 0x9a, 0xa9, 0x78, 0xbb, 0x1b, 0xbe, 0xdf,
+ 0xab, 0xca, 0xbc, 0x1f, 0x7b, 0x39, 0x5, 0xf7,
+ 0x1c, 0x2a, 0xa, 0x39, 0x6, 0xd3, 0xf8, 0x3,
+ 0x5, 0xfb, 0x1c, 0x68, 0xa, 0xdd, 0x6, 0x70,
+ 0xfb, 0x18, 0x5, 0x35, 0x7b, 0x51, 0xfb, 0x2,
+ 0xfb, 0x11, 0x1b, 0x4b, 0x6a, 0xb9, 0xc6, 0x96,
+ 0x1f, 0xc2, 0xf7, 0xa8, 0x5, 0xfb, 0x1d, 0x68,
+ 0xa, 0xdd, 0x6, 0x23, 0xfc, 0xa6, 0x6a, 0xa,
+ 0xe, 0xf8, 0xa9, 0xa8, 0x1, 0xf7, 0x28, 0xba,
+ 0xda, 0xb6, 0x3, 0xf7, 0x28, 0x3d, 0x15, 0xba,
+ 0x6, 0xf7, 0x52, 0xf8, 0xf7, 0x5, 0xda, 0x6,
+ 0xfb, 0x52, 0xfc, 0xf7, 0x5, 0xb6, 0x6, 0xf7,
+ 0x52, 0xf8, 0xf7, 0x5, 0xbc, 0x6, 0x94, 0xa8,
+ 0x5, 0xfb, 0x6f, 0x6, 0xfb, 0x34, 0xfb, 0x2b,
+ 0x4c, 0xfb, 0x21, 0x53, 0xb9, 0x3e, 0xf7, 0x35,
+ 0x1f, 0xe, 0xf7, 0x51, 0xf7, 0x1e, 0x1, 0xf7,
+ 0x70, 0xf7, 0x33, 0x3, 0xf7, 0x70, 0xf7, 0x87,
+ 0x15, 0x6e, 0xa6, 0x72, 0xb4, 0xb7, 0xba, 0xaf,
+ 0xb9, 0xa9, 0x73, 0xa5, 0x63, 0x58, 0x5f, 0x65,
+ 0x5d, 0x1e, 0xe, 0xfb, 0x2, 0xb9, 0x1, 0xf7,
+ 0xbf, 0xba, 0x3, 0xf7, 0x76, 0xfb, 0x1a, 0x15,
+ 0x88, 0x90, 0xa3, 0x7d, 0xa4, 0x1b, 0xbc, 0xb7,
+ 0xb0, 0xba, 0xa4, 0x78, 0x9c, 0x7c, 0x8d, 0x1f,
+ 0x92, 0xac, 0x5, 0x5c, 0x6, 0x73, 0x41, 0x5,
+ 0x8c, 0x93, 0x91, 0x8b, 0x91, 0x1b, 0x9d, 0x93,
+ 0x83, 0x83, 0x8c, 0x1f, 0x78, 0x79, 0x7f, 0x7b,
+ 0x7d, 0x7c, 0x8e, 0x94, 0x81, 0x1e, 0xe, 0xf7,
+ 0x8d, 0xc3, 0x1, 0xf7, 0xab, 0xc0, 0x3, 0xf7,
+ 0x3e, 0xf7, 0x8d, 0x15, 0xf7, 0x8d, 0x3c, 0xa,
+ 0x29, 0x6, 0xc5, 0xf7, 0xd1, 0xfb, 0x26, 0x72,
+ 0x80, 0x53, 0xe6, 0x9a, 0x5e, 0xfb, 0x8f, 0x5,
+ 0x29, 0x6, 0xe, 0xf7, 0x8d, 0xc6, 0xf7, 0x69,
+ 0xc6, 0x1, 0xf7, 0x1d, 0xc1, 0xf7, 0x6d, 0xc1,
+ 0x3, 0xf7, 0x1d, 0xf8, 0xc, 0x15, 0x2c, 0xe5,
+ 0x6b, 0xb6, 0xd4, 0xf7, 0xb, 0xd2, 0xf7, 0x17,
+ 0xd4, 0x5a, 0xc3, 0x39, 0x36, 0xfb, 0x1, 0x40,
+ 0xfb, 0x15, 0x1e, 0xc1, 0x9a, 0x15, 0xd1, 0xbf,
+ 0xc7, 0xd9, 0xcf, 0x9d, 0x5d, 0x68, 0x8c, 0x1e,
+ 0x3c, 0x4a, 0x56, 0x4e, 0x5c, 0x5f, 0xa9, 0xc0,
+ 0x1e, 0xe, 0xe6, 0x76, 0xf8, 0xc, 0x77, 0x1,
+ 0x8c, 0xf8, 0xc4, 0x3, 0xf3, 0xd1, 0x15, 0xf7,
+ 0x92, 0xf7, 0x53, 0xfb, 0x4b, 0xf7, 0x4d, 0x6b,
+ 0x5c, 0xf7, 0x15, 0xfb, 0x1e, 0xfb, 0x59, 0xfb,
+ 0x24, 0x5, 0xf7, 0x48, 0x16, 0xaa, 0x5c, 0xf7,
+ 0x83, 0xf7, 0x53, 0xfb, 0x3e, 0xf7, 0x4d, 0x65,
+ 0x5a, 0xf7, 0x14, 0xfb, 0x1c, 0x5, 0xe, 0x60,
+ 0xc1, 0x5c, 0x76, 0xf3, 0xc2, 0xf7, 0x5d, 0xc0,
+ 0xf7, 0xc9, 0x77, 0x12, 0x13, 0xb8, 0xf7, 0x8d,
+ 0xba, 0x15, 0xf7, 0x14, 0x6, 0x82, 0x67, 0x5,
+ 0x5a, 0x5f, 0xa, 0xf7, 0x20, 0x76, 0xa, 0x61,
+ 0x6, 0x93, 0xaf, 0x5, 0xb6, 0x6, 0x94, 0xc2,
+ 0x5, 0x60, 0x6, 0xac, 0xf7, 0x65, 0x52, 0xa,
+ 0xfb, 0x30, 0xfb, 0x65, 0x5, 0xc9, 0x16, 0xe4,
+ 0xf7, 0x19, 0x76, 0xfb, 0x19, 0x5, 0xfc, 0x19,
+ 0xfb, 0x14, 0x15, 0x13, 0x78, 0xac, 0x6c, 0xf8,
+ 0xd4, 0xf9, 0x47, 0x69, 0xaa, 0x5, 0xfc, 0xd3,
+ 0xfb, 0xfe, 0x15, 0xf7, 0x6e, 0x6, 0x94, 0xc0,
+ 0x5, 0x36, 0x6, 0xbe, 0xf7, 0xc6, 0xfb, 0x14,
+ 0x73, 0x82, 0x55, 0xdb, 0x99, 0x62, 0xfb, 0x86,
+ 0x5, 0x35, 0x6, 0xe, 0x5f, 0xc1, 0x5d, 0x76,
+ 0xf7, 0xd5, 0xc0, 0x7c, 0xc1, 0xf7, 0xc9, 0x77,
+ 0x12, 0xf8, 0x65, 0xbb, 0x13, 0x5c, 0x89, 0x71,
+ 0x15, 0xad, 0x6c, 0xf8, 0xce, 0xf9, 0x47, 0x67,
+ 0xaa, 0x5, 0xfc, 0xb5, 0xfb, 0xff, 0x15, 0xf7,
+ 0x70, 0x76, 0xa, 0x34, 0x6, 0xbe, 0xf7, 0xc4,
+ 0xfb, 0x13, 0x74, 0x82, 0x55, 0xda, 0x99, 0x64,
+ 0xfb, 0x85, 0x5, 0x34, 0x6, 0x13, 0xac, 0xf7,
+ 0x73, 0xfc, 0x24, 0x15, 0xf7, 0x6b, 0x76, 0xa,
+ 0xfb, 0x23, 0x6, 0xf7, 0xb, 0xee, 0xc6, 0xa8,
+ 0xe1, 0x1a, 0xbc, 0x72, 0xb7, 0x4d, 0x65, 0x63,
+ 0x78, 0x69, 0x6c, 0x1e, 0x81, 0x4c, 0x5, 0xb9,
+ 0x6, 0xb0, 0x89, 0xae, 0xa5, 0xaa, 0x1b, 0xaa,
+ 0x9c, 0x73, 0x6e, 0x62, 0x68, 0x6a, 0x6d, 0x74,
+ 0x1f, 0xfb, 0x1e, 0xfb, 0x0, 0x5, 0xe, 0x61,
+ 0xc1, 0x5c, 0x76, 0xf7, 0xb, 0xc2, 0xf7, 0x42,
+ 0xc2, 0xf7, 0xb3, 0x76, 0xc0, 0x77, 0x12, 0xf7,
+ 0x67, 0xba, 0x65, 0xbb, 0x13, 0xbe, 0xf7, 0x90,
+ 0xca, 0x15, 0xf7, 0x11, 0x6, 0x83, 0x58, 0x5,
+ 0x59, 0x6, 0x82, 0x55, 0x5, 0xf7, 0x1c, 0x76,
+ 0xa, 0x62, 0x6, 0x92, 0xbe, 0x5, 0xb6, 0x6,
+ 0x94, 0xc2, 0x5, 0x61, 0x6, 0xab, 0xf7, 0x57,
+ 0x5, 0x56, 0x6, 0xfb, 0x2c, 0xfb, 0x66, 0x5,
+ 0xc7, 0x9a, 0x15, 0xe3, 0xf7, 0x8, 0x78, 0xfb,
+ 0x8, 0x5, 0xfc, 0x10, 0xfb, 0x25, 0x15, 0x13,
+ 0x7e, 0xab, 0x6e, 0xf8, 0xbe, 0xf9, 0x47, 0x6a,
+ 0xaa, 0x5, 0xfc, 0xa1, 0xfb, 0xe8, 0x15, 0x7d,
+ 0xa2, 0xb1, 0x77, 0xae, 0x1b, 0xc4, 0xd1, 0xc2,
+ 0xd5, 0x1f, 0x8e, 0xb3, 0x7a, 0x9a, 0x78, 0x97,
+ 0x8, 0x13, 0xbd, 0xa6, 0xa0, 0x9b, 0xb1, 0xb1,
+ 0x1a, 0xbc, 0x6c, 0xab, 0x5d, 0x69, 0x66, 0x79,
+ 0x75, 0x6b, 0x1e, 0x94, 0x58, 0x5, 0x9d, 0xa5,
+ 0xa5, 0x9f, 0xa7, 0x1b, 0xa0, 0x9f, 0x7d, 0x72,
+ 0x8d, 0x1f, 0x64, 0x69, 0x6f, 0x57, 0x1e, 0x85,
+ 0x6, 0x82, 0x56, 0x5, 0x13, 0xbe, 0xb2, 0xc0,
+ 0x87, 0x6a, 0x6d, 0x73, 0x63, 0x59, 0x6d, 0x6e,
+ 0x9c, 0x9c, 0x76, 0x1f, 0xe, 0xfb, 0x31, 0xc1,
+ 0xf8, 0x33, 0xf7, 0xa, 0x12, 0xf7, 0xc, 0xc2,
+ 0xf7, 0x45, 0xc2, 0x9e, 0xc1, 0x17, 0xf7, 0xe5,
+ 0xf7, 0xf7, 0x15, 0x73, 0xa1, 0x78, 0xac, 0xb8,
+ 0xad, 0xad, 0xb3, 0xa2, 0x75, 0xa0, 0x68, 0x68,
+ 0x61, 0x69, 0x62, 0x1e, 0x8e, 0xfb, 0x41, 0x15,
+ 0x38, 0x7a, 0xfb, 0x1d, 0x5e, 0xfb, 0x22, 0x1a,
+ 0x31, 0xd6, 0x5e, 0xe5, 0xc6, 0xc9, 0x9a, 0x9c,
+ 0xbe, 0x1e, 0x13, 0xb8, 0xa2, 0xf7, 0xb, 0x5,
+ 0x55, 0x6, 0x7d, 0x44, 0x5, 0x7b, 0x66, 0x61,
+ 0x81, 0x63, 0x1b, 0x2f, 0x71, 0xba, 0xb1, 0xf7,
+ 0x2, 0xf7, 0x1f, 0xac, 0xd3, 0x96, 0x1f, 0xa0,
+ 0xf3, 0x52, 0xa, 0xe, 0x8b, 0xc1, 0xf7, 0x10,
+ 0xc1, 0xf7, 0xb1, 0xc1, 0x1, 0x89, 0x4f, 0xa,
+ 0x89, 0x16, 0x20, 0xa, 0xfb, 0x43, 0xf8, 0x7d,
+ 0x15, 0xf7, 0x9a, 0x26, 0x9b, 0xa9, 0xfb, 0x7b,
+ 0x79, 0xa, 0x8b, 0xc1, 0xf7, 0xf, 0xc2, 0xf7,
+ 0xab, 0xc1, 0x84, 0xa, 0x72, 0xf7, 0x74, 0xf7,
+ 0x5a, 0xf7, 0x71, 0x3, 0xf7, 0xc2, 0xf8, 0xff,
+ 0x15, 0xf7, 0xd7, 0xf0, 0x77, 0xd4, 0xfb, 0xc9,
+ 0xfb, 0x24, 0x5, 0xfb, 0xd5, 0xfd, 0x1d, 0x23,
+ 0xa, 0x8b, 0xc0, 0xf7, 0xc, 0xc0, 0xf7, 0xb1,
+ 0xc1, 0xf7, 0x66, 0x77, 0x1, 0x89, 0x4f, 0xa,
+ 0xf7, 0x7a, 0xf9, 0x3, 0x15, 0xb0, 0x79, 0xf7,
+ 0x3b, 0xf7, 0x7, 0xf7, 0xd, 0xfb, 0x7, 0xb5,
+ 0x9d, 0xfb, 0x5, 0xf7, 0x2c, 0x5, 0x3c, 0x6,
+ 0xfc, 0x2b, 0xfd, 0x9b, 0x23, 0xa, 0x7e, 0xa,
+ 0xd3, 0xbc, 0x9c, 0xbc, 0x1, 0x71, 0x4f, 0xa,
+ 0xf7, 0x6c, 0xf9, 0x20, 0x15, 0xbc, 0x81, 0x5,
+ 0x9e, 0x97, 0xa6, 0xb5, 0xbc, 0x1b, 0xa4, 0x9b,
+ 0x7b, 0x7b, 0x9e, 0x1f, 0x7a, 0x9f, 0xa1, 0x7a,
+ 0xb1, 0x1b, 0xd0, 0xb9, 0xca, 0xb1, 0x9e, 0x1f,
+ 0x5b, 0x94, 0x5, 0x73, 0x7d, 0x69, 0x66, 0x66,
+ 0x1b, 0x76, 0x7e, 0x99, 0x9b, 0x7a, 0x1f, 0x9c,
+ 0x79, 0x75, 0x9e, 0x61, 0x1b, 0x52, 0x51, 0x5c,
+ 0x56, 0x6d, 0x1f, 0xfb, 0x86, 0xfd, 0x20, 0x23,
+ 0xa, 0x7e, 0xa, 0xdb, 0xf7, 0x8, 0x1, 0x89,
+ 0x4f, 0xa, 0xf8, 0x55, 0xf9, 0x19, 0x15, 0xdd,
+ 0x5c, 0xa, 0x38, 0x6, 0xfb, 0x3c, 0xfb, 0x8,
+ 0x15, 0xdd, 0x5c, 0xa, 0x39, 0x6, 0xfb, 0xe0,
+ 0xfd, 0x8d, 0x23, 0xa, 0x8b, 0xbf, 0xf7, 0x20,
+ 0xc1, 0xf7, 0xaa, 0xc1, 0xaa, 0xc4, 0xd2, 0xc3,
+ 0x1, 0x89, 0xf7, 0x63, 0xf7, 0x11, 0xc6, 0xd4,
+ 0xc7, 0x3, 0xf7, 0xde, 0xf9, 0x3d, 0x15, 0x5d,
+ 0xb1, 0x71, 0xb7, 0xc8, 0xbc, 0xbf, 0xc5, 0xab,
+ 0x7f, 0xb5, 0x4a, 0x4c, 0x57, 0x58, 0x4e, 0x1e,
+ 0xc6, 0x93, 0x15, 0xa3, 0x97, 0xa3, 0xac, 0xad,
+ 0x85, 0x6f, 0x86, 0x75, 0x77, 0x7b, 0x76, 0x85,
+ 0x71, 0x8b, 0xa2, 0x1e, 0xfc, 0x1b, 0xfd, 0x45,
+ 0x23, 0xa, 0x8b, 0xc1, 0xeb, 0xc1, 0xbc, 0x61,
+ 0xa, 0x1, 0x71, 0xf7, 0x56, 0xe2, 0xcd, 0xf6,
+ 0xc1, 0x93, 0xc2, 0x3, 0x71, 0x16, 0xf7, 0x56,
+ 0x2a, 0xa, 0x35, 0x6, 0xc8, 0xf7, 0x3, 0x5,
+ 0xf7, 0x19, 0x6, 0x6b, 0xfb, 0x39, 0x5, 0xf7,
+ 0x97, 0x6, 0xaa, 0xf7, 0x2d, 0x52, 0xa, 0x78,
+ 0x28, 0x5, 0xfb, 0x2a, 0x6, 0xb1, 0xf7, 0x5c,
+ 0x5, 0xdb, 0x6, 0x80, 0x52, 0x5, 0xc1, 0x6,
+ 0xab, 0xf7, 0x3b, 0x5, 0x57, 0x60, 0xa, 0x39,
+ 0x6, 0xb3, 0xf7, 0x5c, 0x5, 0xf7, 0x2b, 0x6,
+ 0x78, 0x26, 0x6a, 0xa, 0xa9, 0xf7, 0x2f, 0x5,
+ 0xfc, 0x2a, 0x2d, 0xa, 0xe4, 0x6, 0xfb, 0x99,
+ 0x58, 0xa, 0x57, 0x6, 0xf7, 0x5b, 0xf7, 0x39,
+ 0x15, 0xf7, 0x3e, 0xf7, 0xb4, 0x52, 0xfb, 0xb4,
+ 0x5, 0xe, 0xfb, 0x2b, 0xc2, 0xe7, 0xbe, 0xf8,
+ 0x76, 0xbe, 0x1, 0x9c, 0xc5, 0xf7, 0x3, 0xbb,
+ 0xf7, 0x8b, 0xc3, 0x3, 0xf7, 0x5, 0xfb, 0x13,
+ 0x15, 0x84, 0x90, 0xa3, 0x7a, 0xa7, 0x1b, 0xb3,
+ 0xc2, 0xa2, 0xcb, 0xab, 0x7c, 0xa2, 0x77, 0x93,
+ 0x1f, 0x8f, 0x88, 0x5, 0xe7, 0xdc, 0xbe, 0xb5,
+ 0xd3, 0x1f, 0x7b, 0xb7, 0x5, 0x66, 0x4d, 0x45,
+ 0x5a, 0x44, 0x1b, 0xfb, 0x5, 0x43, 0xe5, 0xf7,
+ 0x9, 0xf7, 0x43, 0xf7, 0x44, 0xef, 0xeb, 0xcc,
+ 0xc5, 0x6d, 0x60, 0xaa, 0x1f, 0x77, 0x36, 0x51,
+ 0xa, 0xb8, 0xf7, 0x65, 0x52, 0xa, 0x7e, 0x51,
+ 0x5, 0xb7, 0x49, 0x60, 0x99, 0x55, 0x1b, 0xfb,
+ 0x54, 0xfb, 0x22, 0xfb, 0x3d, 0xfb, 0x44, 0x22,
+ 0xd1, 0x30, 0xee, 0x7c, 0x1f, 0x78, 0x42, 0x5,
+ 0x8f, 0x92, 0x94, 0x8b, 0x92, 0x1b, 0x98, 0x96,
+ 0x83, 0x81, 0x80, 0x85, 0x75, 0x6e, 0x7d, 0x7e,
+ 0x93, 0x92, 0x81, 0x1f, 0xe, 0x5b, 0xa, 0x1,
+ 0xe4, 0xc2, 0xf7, 0x52, 0xc3, 0xc6, 0xb8, 0x3,
+ 0x88, 0x16, 0x28, 0xa, 0xf8, 0x9d, 0xf8, 0xc9,
+ 0x15, 0x9a, 0xa9, 0xfb, 0xc9, 0xf7, 0x24, 0x6f,
+ 0x42, 0x5, 0xe, 0x5b, 0xa, 0x84, 0xa, 0xe5,
+ 0xc3, 0xf7, 0x55, 0xc4, 0xc7, 0xb9, 0x3, 0xf7,
+ 0xa0, 0xf8, 0xff, 0x15, 0xf7, 0xd5, 0xf0, 0x78,
+ 0xd4, 0xfb, 0xc9, 0xfb, 0x24, 0x5, 0xfb, 0x9c,
+ 0xfd, 0x1d, 0x15, 0x28, 0xa, 0xe, 0x5b, 0xa,
+ 0x1, 0xe4, 0xc2, 0x3, 0xf7, 0x54, 0xf9, 0xd,
+ 0x15, 0xb2, 0x79, 0xf7, 0x45, 0xf7, 0x7, 0xf7,
+ 0x14, 0xfb, 0x7, 0xb9, 0x9d, 0xfb, 0xb, 0xf7,
+ 0x2c, 0x5, 0x36, 0x6, 0xfc, 0x11, 0xfd, 0xa5,
+ 0x15, 0x28, 0xa, 0xe, 0x8b, 0xbe, 0xf7, 0x75,
+ 0x76, 0xf7, 0xca, 0x77, 0xf7, 0x2, 0xf7, 0x8,
+ 0x1, 0xe4, 0xc2, 0x3, 0xf8, 0x3d, 0xf9, 0x23,
+ 0x15, 0xe2, 0x5c, 0xa, 0x34, 0x6, 0xfb, 0x46,
+ 0xfb, 0x8, 0x15, 0xe2, 0x6, 0xa5, 0x88, 0xa,
+ 0x34, 0x6, 0xfb, 0xc1, 0xfd, 0x97, 0x15, 0x28,
+ 0xa, 0xe, 0x8b, 0xc1, 0xf8, 0x5c, 0xc2, 0x84,
+ 0xa, 0xf7, 0x74, 0xc6, 0x3, 0xaf, 0x16, 0x2f,
+ 0xa, 0xf7, 0x50, 0xf9, 0x2e, 0x15, 0xf7, 0xb5,
+ 0x26, 0x9e, 0xa9, 0xfb, 0x94, 0x79, 0xa, 0x8b,
+ 0xc1, 0xf8, 0x5d, 0xc2, 0xf7, 0x77, 0x77, 0x1,
+ 0xf7, 0x6c, 0xc5, 0x3, 0xf7, 0x88, 0xf9, 0x0,
+ 0x15, 0xf7, 0xdb, 0xef, 0x78, 0xd4, 0xfb, 0xcf,
+ 0xfb, 0x23, 0x5, 0xfb, 0x64, 0xfd, 0x1e, 0x15,
+ 0xf8, 0x2d, 0x2a, 0xa, 0xfb, 0x43, 0x6, 0xeb,
+ 0xf8, 0x5d, 0x5, 0xf7, 0x40, 0x46, 0xa, 0xfc,
+ 0x29, 0x6, 0x7e, 0x54, 0x5, 0xf7, 0x42, 0x6,
+ 0x2d, 0x7a, 0xa, 0xfb, 0x44, 0x6, 0xe, 0x8b,
+ 0xc0, 0xf8, 0x5d, 0xc2, 0x1, 0xf7, 0x74, 0xc6,
+ 0x3, 0xf7, 0x3f, 0xf9, 0xb, 0x15, 0xb2, 0x7a,
+ 0xf7, 0x47, 0xf7, 0x8, 0xf7, 0x14, 0xfb, 0x8,
+ 0xb9, 0x9c, 0xfb, 0xd, 0xf7, 0x2e, 0x5, 0x36,
+ 0x6, 0xfb, 0xd5, 0xfd, 0xa5, 0x15, 0x2f, 0xa,
+ 0xe, 0x8b, 0xbe, 0xf8, 0x5f, 0xc2, 0xf7, 0x62,
+ 0x77, 0x1, 0xf7, 0x74, 0xc6, 0x3, 0xf8, 0x35,
+ 0xf9, 0x22, 0x15, 0xe7, 0x6, 0xa5, 0xf7, 0x9,
+ 0x5, 0x31, 0x6, 0xfb, 0x4e, 0xfb, 0x9, 0x15,
+ 0xe5, 0x6, 0xa6, 0xf7, 0x9, 0x5, 0x31, 0x6,
+ 0xfb, 0x8e, 0xfd, 0x97, 0x15, 0x2f, 0xa, 0xe,
+ 0x8b, 0xc1, 0xf7, 0x57, 0xbf, 0xf7, 0x63, 0xc1,
+ 0x1, 0xf8, 0xad, 0xcb, 0x3, 0x8a, 0x16, 0xf7,
+ 0x6f, 0x6, 0xf7, 0x56, 0xf7, 0x49, 0xe1, 0xf7,
+ 0xaf, 0xf7, 0x22, 0x28, 0xbe, 0xfb, 0x1a, 0x1f,
+ 0xfb, 0x8c, 0x2d, 0xa, 0xda, 0x6, 0x63, 0xfb,
+ 0x63, 0x5, 0x3f, 0x6, 0x7f, 0x57, 0x5, 0xd8,
+ 0x6, 0x64, 0xfb, 0x57, 0x89, 0xa, 0xf7, 0x1b,
+ 0x16, 0xb1, 0xf7, 0x57, 0x5, 0xf7, 0x55, 0x6,
+ 0x96, 0xbf, 0x5, 0xfb, 0x54, 0x6, 0xb4, 0xf7,
+ 0x63, 0x5, 0xf0, 0x6, 0xf7, 0x2a, 0xb5, 0x60,
+ 0xfb, 0x16, 0xfb, 0x1a, 0x21, 0xfb, 0x27, 0xfb,
+ 0x3a, 0x1f, 0xe, 0x7e, 0xbf, 0xf8, 0x4e, 0xbf,
+ 0xdf, 0xbc, 0x9b, 0xbd, 0x1, 0x61, 0x7e, 0x15,
+ 0xf7, 0x8f, 0x6, 0x96, 0xbf, 0x5, 0xfb, 0x3,
+ 0x6, 0xe2, 0xf8, 0x37, 0xf7, 0x5a, 0xfc, 0x6b,
+ 0x5, 0xd7, 0x6, 0xf1, 0xf8, 0x82, 0x5, 0xdb,
+ 0x6, 0x96, 0xbf, 0x5, 0xfb, 0x8b, 0x82, 0xa,
+ 0xf7, 0x2, 0x6, 0x34, 0xfc, 0x3b, 0xfb, 0x58,
+ 0xf8, 0x6f, 0x5, 0xfb, 0x34, 0x6, 0x7f, 0x57,
+ 0x5, 0xde, 0x6, 0x30, 0xfc, 0x4e, 0x7b, 0xa,
+ 0xf7, 0x6c, 0xf8, 0xe5, 0x15, 0xbe, 0x80, 0x5,
+ 0x9f, 0x97, 0xa8, 0xb4, 0xbe, 0x1b, 0xac, 0x9e,
+ 0x78, 0x7a, 0xa1, 0x1f, 0x7c, 0x9e, 0x9f, 0x7d,
+ 0xac, 0x1b, 0xd2, 0xbb, 0xcb, 0xb2, 0x9f, 0x1f,
+ 0x58, 0x94, 0x5, 0x73, 0x7d, 0x6d, 0x64, 0x64,
+ 0x1b, 0x70, 0x7c, 0x99, 0x9a, 0x7b, 0x1f, 0x9d,
+ 0x78, 0x76, 0x9e, 0x5e, 0x1b, 0x50, 0x4e, 0x5d,
+ 0x55, 0x6c, 0x1f, 0xe, 0x79, 0xc1, 0xf8, 0x7b,
+ 0xc1, 0xf7, 0x6c, 0x7d, 0xa, 0xf7, 0x82, 0xf9,
+ 0x64, 0x15, 0xf7, 0xa0, 0x27, 0x9b, 0xa9, 0xfb,
+ 0x7f, 0xf7, 0x23, 0x5, 0xfb, 0x91, 0xfc, 0xd9,
+ 0x25, 0xa, 0x79, 0xc1, 0xf8, 0x7a, 0xc1, 0x1,
+ 0xaa, 0xc2, 0xf8, 0x45, 0xc3, 0x3, 0xf7, 0x97,
+ 0xf8, 0xff, 0x15, 0xf7, 0xbb, 0xef, 0x78, 0xd5,
+ 0xfb, 0xb5, 0xfb, 0x25, 0x5, 0xfb, 0x68, 0xfc,
+ 0x48, 0x25, 0xa, 0x79, 0xc1, 0xf8, 0x7b, 0xc1,
+ 0xf7, 0x5a, 0x7d, 0xa, 0xf7, 0x4b, 0xf9, 0x2,
+ 0x15, 0xb1, 0x7a, 0xf7, 0x40, 0xf7, 0x7, 0xf7,
+ 0xf, 0xfb, 0x7, 0xb6, 0x9c, 0xfb, 0x8, 0xf7,
+ 0x2d, 0x89, 0xa, 0xfb, 0xdd, 0xfc, 0xc7, 0x25,
+ 0xa, 0x79, 0xbf, 0xf8, 0x7d, 0xc1, 0xd1, 0xbc,
+ 0x9c, 0xbc, 0x1, 0x9e, 0xc6, 0xf8, 0x36, 0xc1,
+ 0x3, 0xf7, 0x2e, 0xf9, 0x2a, 0x15, 0xbd, 0x80,
+ 0x5, 0x9f, 0x97, 0xa7, 0xb5, 0xbb, 0x1b, 0xae,
+ 0x9c, 0x7a, 0x7a, 0x9d, 0x1f, 0x7b, 0x9c, 0x9e,
+ 0x7b, 0xb0, 0x1b, 0xd1, 0xbb, 0xca, 0xb2, 0x9e,
+ 0x1f, 0x58, 0x94, 0x5, 0x73, 0x7e, 0x6b, 0x65,
+ 0x66, 0x1b, 0x73, 0x7e, 0x97, 0x99, 0x7d, 0x1f,
+ 0x9d, 0x79, 0x76, 0xa1, 0x5b, 0x1b, 0x52, 0x4f,
+ 0x5d, 0x55, 0x6d, 0x1f, 0xfb, 0xc, 0xfc, 0x56,
+ 0x25, 0xa, 0x79, 0xbe, 0xf8, 0x7e, 0xc1, 0xce,
+ 0xf7, 0x9, 0x1, 0xad, 0xc2, 0xf7, 0x40, 0xdf,
+ 0xc9, 0xde, 0x9e, 0xc3, 0x3, 0xf8, 0x2b, 0xf9,
+ 0x18, 0x15, 0xde, 0x6, 0xa5, 0xf7, 0x9, 0x5,
+ 0x37, 0x6, 0xfb, 0x3f, 0xfb, 0x9, 0x15, 0xdf,
+ 0x6, 0xa4, 0xf7, 0x9, 0x7b, 0xa, 0xfb, 0x91,
+ 0xfc, 0xb9, 0x25, 0xa, 0xcb, 0x76, 0xf8, 0x3f,
+ 0x77, 0x1, 0xbb, 0xe4, 0x15, 0xb9, 0x5d, 0xf7,
+ 0x5b, 0xf7, 0x3d, 0xf7, 0x1e, 0xfb, 0x3d, 0xbb,
+ 0xb2, 0xfb, 0x20, 0xf7, 0x3e, 0xf7, 0x69, 0xf7,
+ 0x41, 0x63, 0xb8, 0xfb, 0x67, 0xfb, 0x41, 0xfb,
+ 0x1f, 0xf7, 0x40, 0x5d, 0x64, 0xf7, 0x1e, 0xfb,
+ 0x3d, 0x5, 0xe, 0x82, 0xbf, 0x5d, 0x76, 0xf8,
+ 0xae, 0xc0, 0x12, 0x13, 0x60, 0xf8, 0xbd, 0xf7,
+ 0xab, 0x15, 0x95, 0xbe, 0x8d, 0xde, 0x67, 0xca,
+ 0xc3, 0xc6, 0x18, 0x68, 0xab, 0x59, 0x57, 0x5,
+ 0xaa, 0x6c, 0x5f, 0xa0, 0x4a, 0x1b, 0xfb, 0x3f,
+ 0xfb, 0x7, 0xfb, 0x2b, 0xfb, 0x1d, 0x71, 0x1f,
+ 0x7b, 0x3b, 0x96, 0x41, 0xae, 0x58, 0x4c, 0x48,
+ 0x18, 0xaf, 0x6c, 0xc6, 0xc9, 0x5, 0x13, 0xa0,
+ 0x6d, 0xad, 0xb9, 0x7a, 0xc4, 0x1b, 0xf7, 0x31,
+ 0xf7, 0xa, 0xf7, 0x16, 0xf7, 0x32, 0xaa, 0x1f,
+ 0x55, 0x89, 0x15, 0xfb, 0xe, 0x73, 0x30, 0xfb,
+ 0x4, 0xfb, 0x13, 0x1b, 0x5f, 0x67, 0x9a, 0xa3,
+ 0x71, 0x1f, 0xf7, 0xe3, 0xf7, 0xf2, 0xa2, 0x57,
+ 0x88, 0x4c, 0x84, 0x63, 0x19, 0x63, 0xf7, 0x57,
+ 0x15, 0xfb, 0xe6, 0xfb, 0xf6, 0x72, 0xb6, 0x84,
+ 0xc3, 0x96, 0xc7, 0x19, 0xe1, 0x9d, 0xdb, 0xf7,
+ 0x2b, 0xf7, 0x29, 0x1b, 0xbf, 0xaf, 0x7b, 0x71,
+ 0xa3, 0x1f, 0xe, 0x59, 0xa, 0x96, 0xf8, 0x91,
+ 0x26, 0xa, 0xf7, 0x3c, 0xf7, 0x2f, 0x15, 0xf7,
+ 0x99, 0x26, 0x9c, 0xa9, 0xfb, 0x7b, 0x79, 0xa,
+ 0x59, 0xa, 0xf7, 0x6c, 0xf8, 0xfa, 0x15, 0xf7,
+ 0xb3, 0xf7, 0x0, 0x7a, 0xd2, 0xfb, 0xb2, 0xfb,
+ 0x25, 0x5, 0xfb, 0x51, 0xfb, 0x1f, 0x26, 0xa,
+ 0xe, 0x70, 0xa, 0xf7, 0x4d, 0xc2, 0x50, 0xa,
+ 0xf7, 0x42, 0xf9, 0xe, 0x15, 0xf7, 0x3d, 0xf7,
+ 0x8, 0xf7, 0xa, 0xfb, 0x8, 0xb5, 0x9c, 0xfb,
+ 0x4, 0xf7, 0x2e, 0x5, 0x3c, 0x6, 0xfb, 0x43,
+ 0xfb, 0x2e, 0x5, 0xfb, 0x12, 0xfb, 0x22, 0x26,
+ 0xa, 0xe, 0x70, 0xa, 0x50, 0xa, 0xf7, 0xf8,
+ 0xf9, 0x21, 0x15, 0xdc, 0x6, 0xa4, 0xf7, 0xa,
+ 0x6b, 0xa, 0xfb, 0x3b, 0xfb, 0xa, 0x85, 0xa,
+ 0xa3, 0xf7, 0xa, 0x6b, 0xa, 0xfb, 0x76, 0xfb,
+ 0x9a, 0x26, 0xa, 0xe, 0x8b, 0xc1, 0xf8, 0x5d,
+ 0xc1, 0x84, 0xa, 0xf7, 0x47, 0xc3, 0x3, 0xb4,
+ 0x16, 0x31, 0xa, 0xf7, 0x34, 0xf8, 0xc7, 0x15,
+ 0xf7, 0xc3, 0xf1, 0x79, 0xd5, 0xfb, 0xc1, 0xfb,
+ 0x24, 0x5, 0xe, 0x8b, 0xc1, 0xd1, 0x61, 0xa,
+ 0xd6, 0xc1, 0x1, 0xf8, 0x92, 0xc0, 0x3, 0xaf,
+ 0x16, 0xf7, 0xba, 0x4d, 0xa, 0xfb, 0x21, 0x6,
+ 0x98, 0xd1, 0x5, 0xf7, 0x15, 0x6, 0xf7, 0x1,
+ 0xf7, 0x5, 0xb5, 0xf7, 0x32, 0xd3, 0x46, 0xb0,
+ 0x37, 0x1f, 0xfb, 0x24, 0x6, 0x99, 0xd6, 0x5,
+ 0xf3, 0x76, 0xa, 0xfb, 0x95, 0x5f, 0xa, 0xf4,
+ 0x6, 0x3a, 0x58, 0xa, 0x23, 0x6, 0xf7, 0x44,
+ 0xf7, 0x10, 0x15, 0xae, 0xf7, 0x5d, 0x5, 0xf7,
+ 0x1a, 0x6, 0xc0, 0xcd, 0x7d, 0x5a, 0x28, 0x41,
+ 0x64, 0x38, 0x1f, 0xe, 0x7c, 0xc2, 0x60, 0xc3,
+ 0xf7, 0xda, 0xc3, 0xf7, 0x1f, 0xc2, 0x12, 0xf7,
+ 0xc4, 0xc0, 0xf7, 0x34, 0xc1, 0x5f, 0xc4, 0x13,
+ 0x7c, 0x9a, 0x88, 0x15, 0xf7, 0x1c, 0x6, 0xe8,
+ 0xf8, 0x76, 0x5, 0xd1, 0x99, 0xa5, 0xa4, 0xf2,
+ 0x1b, 0xd8, 0xc0, 0x8a, 0x54, 0x1f, 0x28, 0xfb,
+ 0x69, 0xb9, 0xfb, 0x23, 0x1a, 0x41, 0xf7, 0x17,
+ 0x73, 0xad, 0x7c, 0x1e, 0x13, 0xba, 0xb8, 0x76,
+ 0x98, 0x74, 0x74, 0x1a, 0x43, 0xfb, 0x26, 0x6d,
+ 0x6d, 0x59, 0x5f, 0xa4, 0xab, 0x69, 0x1e, 0x6b,
+ 0x53, 0x5, 0x6d, 0xb4, 0xc0, 0x71, 0xc4, 0x1b,
+ 0xde, 0xf7, 0x33, 0xb3, 0xf7, 0x1a, 0xb9, 0x5c,
+ 0xac, 0x5c, 0x9f, 0x1f, 0x53, 0xa5, 0x3e, 0x95,
+ 0xae, 0x1a, 0x13, 0x7c, 0xe2, 0xf7, 0x6a, 0x5d,
+ 0xf7, 0x25, 0x1a, 0xe8, 0x48, 0xa0, 0xfb, 0x9,
+ 0x2b, 0x35, 0x6f, 0xfb, 0x1f, 0x79, 0x1e, 0x85,
+ 0x70, 0x7b, 0xa, 0x81, 0x53, 0x5, 0xde, 0x6,
+ 0x4c, 0xfb, 0xda, 0x6b, 0xa, 0xe, 0x4b, 0xa,
+ 0xf7, 0x80, 0xf8, 0xe7, 0x15, 0xf7, 0xa5, 0x24,
+ 0x9d, 0xaa, 0xfb, 0x85, 0xf7, 0x29, 0x5, 0xf4,
+ 0xfd, 0x37, 0x21, 0xa, 0x3b, 0xa, 0xf7, 0x61,
+ 0x77, 0x4a, 0xa, 0x13, 0x7e, 0xf7, 0x3c, 0xf8,
+ 0x85, 0x15, 0xb1, 0x79, 0xf7, 0x43, 0xf7, 0xb,
+ 0xf7, 0x10, 0xfb, 0xb, 0xba, 0x9d, 0xfb, 0xc,
+ 0xf7, 0x31, 0x5, 0x3a, 0x6, 0xb3, 0xfd, 0x25,
+ 0x21, 0xa, 0x4b, 0xa, 0xf8, 0xa0, 0xf8, 0xe7,
+ 0x15, 0x72, 0xd8, 0xfb, 0x9e, 0xfb, 0x29, 0x9d,
+ 0x6c, 0x5, 0xf7, 0x20, 0xfc, 0x83, 0x21, 0xa,
+ 0x3b, 0xa, 0xc6, 0xbd, 0x9e, 0xbc, 0x90, 0x76,
+ 0x4a, 0xa, 0x13, 0xbd, 0x80, 0xf7, 0x21, 0xf8,
+ 0x9e, 0x15, 0xbd, 0x81, 0x5, 0x9a, 0x92, 0xba,
+ 0xbd, 0xb0, 0x1b, 0xb1, 0x9e, 0x71, 0x77, 0xa5,
+ 0x1f, 0x7e, 0x9b, 0x9e, 0x81, 0xa7, 0x1b, 0x13,
+ 0xbb, 0x80, 0xcc, 0xbe, 0xba, 0xc2, 0xab, 0x1f,
+ 0x8a, 0x6, 0x5a, 0x94, 0x5, 0x73, 0x7c, 0x68,
+ 0x66, 0x65, 0x1b, 0x72, 0x7d, 0x94, 0x97, 0x7e,
+ 0x1f, 0x13, 0x7d, 0x80, 0x9f, 0x75, 0x7a, 0xa6,
+ 0x55, 0x1b, 0x56, 0x4c, 0x64, 0x4a, 0x67, 0x1f,
+ 0xf7, 0x8e, 0xfc, 0xa1, 0x22, 0xa, 0x13, 0xbd,
+ 0x80, 0x3a, 0xa, 0x13, 0x7d, 0x80, 0x98, 0xce,
+ 0x15, 0x13, 0xbd, 0x80, 0x2b, 0xa, 0x3b, 0xa,
+ 0xd1, 0xf7, 0x8, 0x4a, 0xa, 0x13, 0x7e, 0xf8,
+ 0x1f, 0xf8, 0x9b, 0x15, 0xdf, 0x5c, 0xa, 0x36,
+ 0x6, 0xfb, 0x42, 0xfb, 0x8, 0x15, 0xe0, 0x5c,
+ 0xa, 0x36, 0x6, 0xf7, 0xd, 0xfd, 0x12, 0x21,
+ 0xa, 0x3b, 0xa, 0xb1, 0xf7, 0x48, 0x6a, 0x76,
+ 0x4a, 0xa, 0x13, 0xbb, 0xf7, 0xb2, 0xf8, 0xc1,
+ 0x15, 0x63, 0xae, 0x6d, 0xba, 0xc6, 0xc7, 0xbc,
+ 0xc5, 0xb5, 0x6a, 0xaa, 0x5b, 0x4d, 0x51, 0x59,
+ 0x4f, 0x1e, 0xc9, 0x95, 0x15, 0x13, 0x77, 0xa4,
+ 0xa1, 0xa0, 0xa3, 0x9c, 0x9a, 0x81, 0x7d, 0x72,
+ 0x74, 0x75, 0x73, 0x7b, 0x7c, 0x97, 0x98, 0x1e,
+ 0xb6, 0xfc, 0xce, 0x22, 0xa, 0x13, 0xbb, 0x3a,
+ 0xa, 0x13, 0x7b, 0x98, 0xce, 0x15, 0x13, 0xbb,
+ 0x2b, 0xa, 0x7c, 0xc1, 0xf7, 0x39, 0xc2, 0xf7,
+ 0x13, 0xc2, 0x1, 0x93, 0xc6, 0x3, 0xf7, 0xa5,
+ 0xd7, 0x15, 0x58, 0x93, 0xb7, 0x63, 0xda, 0x1b,
+ 0xb8, 0xbb, 0x96, 0x96, 0xb3, 0x1f, 0x8a, 0xc1,
+ 0x5, 0x82, 0x6a, 0x62, 0x7e, 0x67, 0x1b, 0x3e,
+ 0x6c, 0xbc, 0xcc, 0x8d, 0x1f, 0x97, 0x8f, 0x98,
+ 0x8c, 0x98, 0x1e, 0x8c, 0x98, 0x5, 0xf7, 0x91,
+ 0x6, 0x93, 0xad, 0x90, 0xa4, 0xaf, 0x1a, 0xd4,
+ 0x6f, 0xd0, 0x33, 0x54, 0x65, 0x71, 0x62, 0x68,
+ 0x1e, 0x99, 0x88, 0x88, 0xc0, 0x2b, 0x1b, 0x55,
+ 0x5f, 0x7e, 0x7b, 0x5c, 0x1f, 0x56, 0x7, 0x98,
+ 0xb0, 0xb6, 0x99, 0xb4, 0x1b, 0xbf, 0x9c, 0x78,
+ 0x6a, 0x8c, 0x1f, 0x80, 0x8b, 0x73, 0x87, 0x7c,
+ 0x1e, 0x85, 0x72, 0x5, 0x8f, 0x76, 0x75, 0x83,
+ 0x76, 0x1b, 0x2c, 0x8a, 0xfb, 0x7, 0x59, 0xfb,
+ 0xe, 0x1a, 0x48, 0xbe, 0x6d, 0xc1, 0xa5, 0xe0,
+ 0x90, 0xe1, 0xbc, 0x1e, 0xce, 0xf7, 0x4b, 0x15,
+ 0xcb, 0x9b, 0xbe, 0xca, 0xc9, 0x1b, 0xd5, 0x87,
+ 0x3e, 0x59, 0x87, 0x1f, 0xfb, 0xad, 0xfb, 0x18,
+ 0x15, 0x75, 0x7b, 0x58, 0x49, 0x4b, 0x1b, 0x68,
+ 0x76, 0xa0, 0xaf, 0xd7, 0xd7, 0xa7, 0xc5, 0x8c,
+ 0x1f, 0xa7, 0xaa, 0x92, 0x87, 0x96, 0x1f, 0xe,
+ 0xfb, 0x1c, 0x76, 0xf7, 0x3a, 0xbe, 0xf7, 0xdc,
+ 0xc0, 0x8a, 0x77, 0x12, 0xb9, 0xc5, 0x13, 0xe8,
+ 0xf7, 0x26, 0xfb, 0x1e, 0x15, 0x7c, 0xa1, 0x9f,
+ 0x87, 0x9d, 0x1b, 0xbe, 0xb3, 0xaa, 0xbf, 0xa3,
+ 0x78, 0xa9, 0x7d, 0x90, 0x1f, 0x90, 0xa3, 0xe1,
+ 0x8f, 0xd3, 0xa9, 0xcb, 0xb3, 0x19, 0x80, 0xbf,
+ 0x5, 0x76, 0x6c, 0x31, 0x55, 0x38, 0x1b, 0xfb,
+ 0x1c, 0x67, 0xda, 0xc8, 0xe3, 0xf2, 0xef, 0xf7,
+ 0x10, 0xc5, 0xbe, 0x7f, 0x69, 0xb0, 0x1f, 0x7b,
+ 0x40, 0x51, 0xa, 0x13, 0xd8, 0xb0, 0xf7, 0x41,
+ 0x71, 0xa, 0x82, 0x60, 0x5, 0x13, 0xe8, 0xa8,
+ 0x62, 0x5d, 0x9a, 0x50, 0x1b, 0xfb, 0x58, 0x26,
+ 0xfb, 0x1b, 0xfb, 0x10, 0x26, 0xd7, 0x4d, 0xee,
+ 0x81, 0x1f, 0x77, 0x44, 0x5, 0x8d, 0x90, 0x92,
+ 0x8c, 0x93, 0x1b, 0x98, 0x98, 0x7e, 0x80, 0x77,
+ 0x79, 0x7d, 0x77, 0x7f, 0x77, 0x91, 0x96, 0x82,
+ 0x1f, 0xe, 0x7c, 0xc2, 0xf7, 0x34, 0xc4, 0x7f,
+ 0xa, 0xc5, 0x3, 0xf7, 0x7d, 0xf8, 0xe9, 0x15,
+ 0xf7, 0xa8, 0x25, 0x9d, 0xa9, 0xfb, 0x88, 0xf7,
+ 0x27, 0x5, 0xfb, 0x39, 0xfc, 0x6b, 0x27, 0xa,
+ 0x7c, 0xc2, 0xf7, 0x33, 0xc5, 0x7f, 0xa, 0xc7,
+ 0x3, 0xf7, 0x78, 0xf8, 0x82, 0x15, 0xf7, 0xd0,
+ 0xf2, 0x77, 0xd6, 0xfb, 0xc2, 0xfb, 0x26, 0x5,
+ 0x23, 0xfb, 0xd9, 0x27, 0xa, 0x7c, 0xc2, 0xf7,
+ 0x34, 0xc4, 0xf7, 0x2c, 0xc4, 0xf7, 0x18, 0xc3,
+ 0x1, 0xc1, 0xc5, 0xf8, 0xb, 0xc6, 0x3, 0xf7,
+ 0x3b, 0xf8, 0x86, 0x15, 0xb1, 0x79, 0xf7, 0x41,
+ 0xf7, 0xa, 0xf7, 0xf, 0xfb, 0xa, 0xb8, 0x9d,
+ 0xfb, 0x9, 0xf7, 0x30, 0x89, 0xa, 0xfb, 0x7b,
+ 0xfc, 0x59, 0x27, 0xa, 0x7c, 0xbd, 0xf7, 0x38,
+ 0xc5, 0xf7, 0x32, 0x76, 0xf7, 0x1c, 0xf7, 0x7,
+ 0x1, 0xc1, 0xc5, 0xf7, 0x16, 0xe3, 0xcc, 0xe2,
+ 0x90, 0xc6, 0x3, 0xf8, 0x1f, 0xf8, 0xa6, 0x15,
+ 0xe2, 0x6e, 0xa, 0x33, 0x6, 0xfb, 0x45, 0xfb,
+ 0x7, 0x15, 0xe3, 0x6e, 0xa, 0x33, 0x6, 0xfb,
+ 0x29, 0xfc, 0x50, 0x27, 0xa, 0x6f, 0xa, 0xf7,
+ 0x7f, 0x77, 0x1, 0xf7, 0x82, 0xf8, 0xe8, 0x15,
+ 0xf7, 0x93, 0x25, 0x9c, 0xab, 0xfb, 0x75, 0xf7,
+ 0x26, 0x5, 0xfb, 0x61, 0xfd, 0x34, 0x33, 0xa,
+ 0x6f, 0xa, 0xf7, 0x7f, 0x77, 0x1, 0xdb, 0x16,
+ 0xf8, 0x13, 0x46, 0xa, 0xfb, 0x3a, 0x6, 0xd2,
+ 0xf8, 0x12, 0x5, 0xfb, 0x4f, 0x67, 0xa, 0xf7,
+ 0x1b, 0x6, 0x4e, 0xfb, 0xdb, 0x5, 0xfb, 0x3b,
+ 0x6, 0xf7, 0x2f, 0xf8, 0x4b, 0x15, 0xf7, 0xa7,
+ 0xf1, 0x70, 0xd7, 0xfb, 0x9d, 0xfb, 0x26, 0x5,
+ 0xe, 0x6f, 0xa, 0xf7, 0x6d, 0x77, 0x1, 0xf7,
+ 0x36, 0xf8, 0x86, 0x15, 0xaf, 0x79, 0xf7, 0x3c,
+ 0xf7, 0xa, 0xf7, 0x9, 0xfb, 0xa, 0xb8, 0x9d,
+ 0xfb, 0x5, 0xf7, 0x30, 0x5, 0x3e, 0x6, 0xfb,
+ 0x96, 0xfd, 0x22, 0x33, 0xa, 0x6f, 0xa, 0xde,
+ 0xf7, 0x7, 0x1, 0xf8, 0x2c, 0xf8, 0x9c, 0x15,
+ 0xe4, 0x6e, 0xa, 0x32, 0x6, 0xfb, 0x4b, 0xfb,
+ 0x7, 0x15, 0xe6, 0x6e, 0xa, 0x31, 0x6, 0xfb,
+ 0x58, 0xfd, 0xf, 0x33, 0xa, 0x7c, 0xbe, 0xf7,
+ 0xc6, 0xbf, 0xf7, 0x7f, 0x77, 0x1, 0xaa, 0xc6,
+ 0xf8, 0x2f, 0xce, 0x3, 0xf7, 0x9b, 0xf8, 0x50,
+ 0x15, 0xf7, 0x13, 0xc6, 0xd2, 0x5d, 0xad, 0x28,
+ 0x8e, 0x7d, 0x19, 0xaa, 0x69, 0x4c, 0x9e, 0x53,
+ 0x1b, 0xfb, 0x66, 0x23, 0xfb, 0x11, 0xfb, 0x11,
+ 0x22, 0xe5, 0x55, 0xf7, 0x15, 0xf7, 0x6e, 0xef,
+ 0xf7, 0x26, 0xf7, 0x35, 0xd9, 0x6c, 0xef, 0x37,
+ 0xcb, 0x1f, 0xf2, 0xbd, 0x78, 0xb8, 0xfb, 0x18,
+ 0x4b, 0x66, 0x9d, 0x62, 0xa2, 0x5d, 0x90, 0x19,
+ 0x5e, 0x5d, 0xac, 0x88, 0xaf, 0x79, 0xa9, 0x7f,
+ 0x19, 0x31, 0x5f, 0x5, 0xfb, 0x2f, 0xfb, 0xe7,
+ 0x15, 0xf7, 0x7, 0xf7, 0x1, 0xd9, 0xf7, 0x11,
+ 0x1e, 0x92, 0x6, 0xf7, 0x18, 0xb1, 0x5c, 0x52,
+ 0x22, 0xfb, 0xa, 0x2a, 0xfb, 0xe, 0x27, 0x44,
+ 0xb6, 0xd1, 0x1f, 0xe, 0x8b, 0xbf, 0xf7, 0xc5,
+ 0xc0, 0xdb, 0xbb, 0x9b, 0xbf, 0x1, 0xea, 0xc3,
+ 0xf7, 0xa9, 0xc3, 0x3, 0xf7, 0x45, 0xf8, 0x96,
+ 0x15, 0xbb, 0x7d, 0x5, 0x9a, 0x92, 0xb9, 0xbc,
+ 0xaf, 0x1b, 0xaa, 0x9b, 0x79, 0x7a, 0x9d, 0x1f,
+ 0x7c, 0x9b, 0x9e, 0x7d, 0xae, 0x1b, 0xcb, 0xc6,
+ 0xb9, 0xc2, 0xa9, 0x1f, 0x59, 0x97, 0x5, 0x73,
+ 0x7d, 0x5e, 0x62, 0x65, 0x1b, 0x73, 0x7e, 0x9a,
+ 0x9a, 0x7c, 0x1f, 0x9d, 0x7a, 0x78, 0x9f, 0x62,
+ 0x1b, 0x56, 0x4e, 0x65, 0x4b, 0x68, 0x1f, 0xfb,
+ 0x46, 0xfc, 0x96, 0x15, 0xf7, 0x76, 0x6, 0x97,
+ 0xbf, 0x5, 0x35, 0x6, 0xbb, 0xf7, 0x7c, 0x5,
+ 0xb6, 0xc0, 0xda, 0xb7, 0xca, 0x1b, 0xb1, 0xbc,
+ 0x82, 0x5f, 0x84, 0x8b, 0x82, 0x89, 0x82, 0x1f,
+ 0x58, 0xfb, 0x85, 0x5, 0x37, 0x82, 0xa, 0xf7,
+ 0x73, 0x6, 0x97, 0xbf, 0x5, 0x37, 0x6, 0xbd,
+ 0xf7, 0x86, 0x5, 0x8e, 0x98, 0x8d, 0x97, 0x96,
+ 0x1a, 0xc5, 0x8c, 0x67, 0xae, 0x38, 0x1b, 0x44,
+ 0x3e, 0x65, 0x5f, 0x4d, 0x1f, 0x9a, 0xd0, 0x5,
+ 0xfb, 0x21, 0x6, 0x80, 0x56, 0x5, 0xe0, 0x6,
+ 0x4b, 0xfb, 0xc5, 0x5, 0x36, 0x6, 0xe, 0x5a,
+ 0xa, 0xf7, 0x7d, 0xf8, 0xe7, 0x15, 0xf7, 0x93,
+ 0x23, 0x9a, 0xaa, 0xfb, 0x73, 0xf7, 0x2a, 0x5,
+ 0xfb, 0x73, 0xfc, 0x90, 0x29, 0xa, 0xe, 0x5a,
+ 0xa, 0xc4, 0xf7, 0x38, 0x29, 0xa, 0xf7, 0x15,
+ 0xf7, 0xcc, 0x15, 0xf7, 0xba, 0xea, 0x7b, 0xe1,
+ 0xfb, 0xb9, 0xfb, 0x2a, 0x5, 0xe, 0x5d, 0xa,
+ 0xf7, 0x62, 0x77, 0x49, 0xa, 0xf7, 0x43, 0xf8,
+ 0x85, 0x15, 0xae, 0x79, 0xf7, 0x38, 0xf7, 0xb,
+ 0xf7, 0x8, 0xfb, 0xb, 0xb7, 0x9d, 0xfb, 0x4,
+ 0xf7, 0x31, 0x5, 0x3f, 0x6, 0xfb, 0xb5, 0xfc,
+ 0x7e, 0x29, 0xa, 0xe, 0x5d, 0xa, 0xc9, 0xbd,
+ 0x9c, 0xbc, 0x49, 0xa, 0xf7, 0x2c, 0xf8, 0xa1,
+ 0x15, 0xbb, 0x80, 0x5, 0x9a, 0x91, 0xb6, 0xbb,
+ 0xaf, 0x1b, 0xa3, 0x9c, 0x7c, 0x7b, 0x9d, 0x1f,
+ 0x7a, 0x9f, 0x9f, 0x78, 0xaa, 0x1b, 0xc8, 0xc5,
+ 0xbb, 0xc2, 0xa8, 0x1f, 0x5b, 0x94, 0x5, 0x73,
+ 0x7d, 0x63, 0x65, 0x67, 0x1b, 0x75, 0x7b, 0x99,
+ 0x98, 0x7c, 0x1f, 0x9e, 0x75, 0x76, 0x9f, 0x69,
+ 0x1b, 0x59, 0x50, 0x67, 0x4a, 0x69, 0x1f, 0x2c,
+ 0xfb, 0xfd, 0x29, 0xa, 0xe, 0x5d, 0xa, 0xd3,
+ 0xf7, 0x7, 0x49, 0xa, 0xf8, 0x11, 0xf8, 0x9c,
+ 0x15, 0xda, 0x6, 0xa3, 0xf7, 0x7, 0x89, 0xa,
+ 0xfb, 0x38, 0xfb, 0x7, 0x15, 0xdc, 0x6, 0xa2,
+ 0xf7, 0x7, 0x5, 0x3a, 0x6, 0xfb, 0x62, 0xfc,
+ 0x6b, 0x29, 0xa, 0xe, 0xc6, 0x76, 0xf7, 0x55,
+ 0xc6, 0xf7, 0x45, 0x77, 0x1, 0xf7, 0xad, 0xf8,
+ 0x2e, 0x6c, 0xa, 0x9f, 0x75, 0x71, 0x6f, 0x70,
+ 0x6d, 0x1e, 0xfb, 0x5c, 0xfb, 0x47, 0x15, 0xf8,
+ 0x3e, 0x6, 0x96, 0xc6, 0x5, 0xfc, 0x3e, 0x6,
+ 0xf7, 0x1b, 0xfb, 0x64, 0x6c, 0xa, 0x9d, 0x75,
+ 0x71, 0x6f, 0x72, 0x6d, 0x1e, 0xe, 0x7f, 0xc3,
+ 0x63, 0x76, 0xf8, 0x2e, 0xc2, 0x8e, 0x77, 0x12,
+ 0x13, 0x60, 0xa3, 0xa3, 0x15, 0xa7, 0x62, 0xcb,
+ 0xbe, 0x5, 0x13, 0x90, 0x69, 0xb1, 0xc0, 0x7f,
+ 0xbd, 0x1b, 0xf7, 0x14, 0xf7, 0xf, 0xdd, 0xf7,
+ 0x29, 0xa6, 0x1f, 0x95, 0xbf, 0x86, 0xbf, 0x72,
+ 0xb1, 0xc8, 0xbc, 0x18, 0x6f, 0xb4, 0x4c, 0x58,
+ 0x5, 0x13, 0xa0, 0xac, 0x65, 0x5a, 0x9a, 0x53,
+ 0x1b, 0xfb, 0x2d, 0x21, 0x22, 0xfb, 0x11, 0x73,
+ 0x1f, 0x82, 0x55, 0x91, 0x54, 0xa6, 0x65, 0x8,
+ 0xdb, 0x8d, 0x15, 0xf7, 0xc6, 0xf7, 0x8d, 0x9c,
+ 0x6e, 0x8f, 0x66, 0x83, 0x65, 0x19, 0x7e, 0x5d,
+ 0x5, 0x68, 0x7d, 0x52, 0x2e, 0xfb, 0x18, 0x1b,
+ 0x65, 0x66, 0x93, 0xa0, 0x6f, 0x1f, 0x69, 0xb0,
+ 0x15, 0x78, 0xa7, 0x86, 0xb3, 0x92, 0xb3, 0x8,
+ 0xf6, 0x9f, 0xea, 0xcf, 0xf3, 0x1b, 0xaa, 0xb6,
+ 0x84, 0x72, 0xab, 0x1f, 0xe, 0x4e, 0xa, 0xf7,
+ 0x80, 0x77, 0x12, 0xe8, 0xc6, 0x13, 0xb8, 0xf7,
+ 0x75, 0xf8, 0xea, 0x15, 0xf7, 0x9c, 0x21, 0x9b,
+ 0xad, 0xfb, 0x7c, 0xf7, 0x26, 0x5, 0xfb, 0x65,
+ 0xfb, 0xb8, 0x24, 0xa, 0x4e, 0xa, 0xf7, 0x80,
+ 0x77, 0x12, 0xdd, 0xc6, 0x13, 0xb8, 0xf7, 0x77,
+ 0xf8, 0x81, 0x15, 0xf7, 0xd4, 0xf3, 0x77, 0xd6,
+ 0xfb, 0xc7, 0xfb, 0x20, 0x5, 0xfb, 0x3b, 0xfb,
+ 0x2c, 0x24, 0xa, 0x4e, 0xa, 0xf7, 0x82, 0x77,
+ 0x12, 0xe8, 0xc6, 0x13, 0xb8, 0xf7, 0x39, 0xf8,
+ 0x98, 0x15, 0xaf, 0x7a, 0xf7, 0x3d, 0xf7, 0xb,
+ 0xf7, 0xc, 0xfb, 0xb, 0xb8, 0x9c, 0xfb, 0x7,
+ 0xf7, 0x32, 0x5, 0x3d, 0x6, 0xfb, 0xaa, 0xfb,
+ 0xba, 0x24, 0xa, 0x4e, 0xa, 0xe8, 0xf7, 0x8,
+ 0x12, 0xe8, 0xc6, 0x13, 0xb8, 0xf8, 0x10, 0xf8,
+ 0xa5, 0x15, 0xdc, 0x6, 0xa3, 0xf7, 0x8, 0x6b,
+ 0xa, 0xfb, 0x3d, 0xfb, 0x8, 0x15, 0xdf, 0x6,
+ 0xa2, 0xf7, 0x8, 0x7b, 0xa, 0xfb, 0x56, 0xfb,
+ 0x9d, 0x24, 0xa, 0xfb, 0x31, 0xc1, 0xf8, 0x72,
+ 0xc1, 0x1, 0xe0, 0xcb, 0xf7, 0xf6, 0xcb, 0x3,
+ 0xf7, 0x70, 0xf8, 0x89, 0x15, 0xf7, 0xdb, 0xef,
+ 0x76, 0xd2, 0xfb, 0xcc, 0xfb, 0x20, 0x5, 0xfb,
+ 0x89, 0xfd, 0xf, 0x15, 0x7f, 0x55, 0x5, 0xf7,
+ 0xa3, 0x2a, 0xa, 0x31, 0x6, 0xf8, 0x36, 0xf8,
+ 0x72, 0x5, 0xce, 0x4d, 0xa, 0xfb, 0x52, 0x5f,
+ 0xa, 0xc6, 0x6, 0xfb, 0x82, 0xfb, 0xa1, 0x26,
+ 0xf7, 0xa1, 0x5, 0xcf, 0x4d, 0xa, 0xfb, 0x5f,
+ 0x2d, 0xa, 0xd3, 0x6, 0xf7, 0xf, 0xfb, 0xd6,
+ 0xfb, 0x1e, 0xfb, 0x30, 0x5, 0xe, 0xfb, 0x31,
+ 0xc0, 0xf7, 0xc, 0xc1, 0xf7, 0xe1, 0xc1, 0xf7,
+ 0xb, 0xc0, 0x1, 0xdc, 0xc2, 0xf8, 0x3a, 0xc4,
+ 0x3, 0x88, 0x23, 0x15, 0x80, 0x56, 0x5, 0xf7,
+ 0xba, 0x80, 0xa, 0xfb, 0x2f, 0x6, 0xb6, 0xf7,
+ 0x64, 0x5, 0x65, 0xa3, 0xb9, 0x59, 0xe7, 0x1b,
+ 0xf7, 0x22, 0xf7, 0x18, 0xf7, 0x11, 0xf7, 0x2a,
+ 0xf3, 0x37, 0xc9, 0x2c, 0x34, 0x49, 0x71, 0x5e,
+ 0x5e, 0x1f, 0xbc, 0xf7, 0x87, 0x5, 0xfb, 0x1e,
+ 0x6, 0x7f, 0x56, 0x5, 0xdf, 0x6, 0xfb, 0x20,
+ 0xfd, 0x3c, 0x5, 0xf7, 0x17, 0xf7, 0xf3, 0x15,
+ 0xe2, 0x9d, 0xdb, 0xd0, 0xf7, 0x1, 0x1b, 0xf7,
+ 0x5, 0xa5, 0x3c, 0x52, 0xfb, 0xa, 0xfb, 0xf,
+ 0x3c, 0x34, 0x2d, 0x4c, 0xd8, 0xef, 0xa0, 0x1f,
+ 0xe, 0xfb, 0x31, 0xbd, 0xf8, 0x64, 0xbc, 0xd8,
+ 0xf7, 0x4, 0x1, 0xf8, 0x15, 0xf8, 0x81, 0x15,
+ 0xe3, 0x6, 0xa4, 0xf7, 0x4, 0x5, 0x33, 0x6,
+ 0xfb, 0x4b, 0xfb, 0x4, 0x15, 0xe6, 0x6, 0xa4,
+ 0xf7, 0x4, 0x5, 0x31, 0x6, 0xfb, 0xb0, 0xfd,
+ 0x5c, 0x15, 0x7f, 0x59, 0x5, 0xf7, 0xa2, 0x6,
+ 0x97, 0xbd, 0x5, 0x30, 0x6, 0xf8, 0x36, 0xf8,
+ 0x64, 0x5, 0xce, 0x6, 0x96, 0xbc, 0x5, 0xfb,
+ 0x51, 0x6, 0x7f, 0x5a, 0x5, 0xc6, 0x6, 0xfb,
+ 0x80, 0xfb, 0x97, 0x24, 0xf7, 0x97, 0x5, 0xd0,
+ 0x6, 0x95, 0xbc, 0x5, 0xfb, 0x5f, 0x6, 0x81,
+ 0x5a, 0x5, 0xd2, 0x6, 0xf7, 0xf, 0xfb, 0xc8,
+ 0xfb, 0x1e, 0xfb, 0x30, 0x5, 0xe, 0x8b, 0xc1,
+ 0xf8, 0x3e, 0xc2, 0xcf, 0xf7, 0x5, 0x1, 0xaf,
+ 0x16, 0x44, 0xa, 0xf8, 0x3e, 0x37, 0xa, 0xfc,
+ 0x3e, 0x5, 0xfb, 0x45, 0x6, 0xf7, 0xa8, 0xf8,
+ 0xb9, 0x15, 0xe6, 0x6, 0xa4, 0xf7, 0x5, 0x5,
+ 0x31, 0x6, 0xe, 0x8b, 0xc1, 0xf7, 0xd2, 0xc1,
+ 0x1, 0xf7, 0xab, 0xc3, 0x3, 0xe5, 0x16, 0xf8,
+ 0x2d, 0x2a, 0xa, 0xfb, 0x43, 0x6, 0xd4, 0xf8,
+ 0x8, 0x5, 0xfb, 0x5b, 0x5f, 0xa, 0xf7, 0x24,
+ 0x6, 0x4b, 0xfb, 0xd2, 0x5, 0xfb, 0x46, 0x6,
+ 0xe, 0x7a, 0xc1, 0x69, 0x76, 0xf8, 0xa2, 0xc1,
+ 0x12, 0xf7, 0x23, 0xc6, 0xf7, 0xd5, 0xc1, 0x13,
+ 0xb8, 0x68, 0x7a, 0x15, 0xf7, 0x56, 0x47, 0xa,
+ 0x49, 0x6, 0xec, 0xf8, 0x6b, 0x5, 0xc9, 0x47,
+ 0xa, 0xfb, 0x4e, 0x45, 0xa, 0xcc, 0x6, 0x2a,
+ 0xfc, 0x6b, 0x5, 0x46, 0x6, 0xf7, 0x92, 0xa0,
+ 0x15, 0x13, 0x78, 0x67, 0xa3, 0xa8, 0x63, 0xce,
+ 0x1b, 0xf7, 0x13, 0x98, 0x7c, 0xa, 0xba, 0x36,
+ 0xa, 0xfb, 0x66, 0x38, 0xa, 0xf7, 0x1, 0x6,
+ 0x4b, 0xfb, 0xdc, 0x5, 0x3a, 0x7b, 0x88, 0x4d,
+ 0x36, 0x1b, 0x71, 0x5b, 0x91, 0xf7, 0xe, 0xa2,
+ 0x1f, 0x9a, 0xe6, 0x71, 0xa, 0xe, 0xfb, 0x31,
+ 0xc1, 0xf8, 0x84, 0xc4, 0xe4, 0xf7, 0xa, 0x1,
+ 0xf8, 0x7f, 0xf8, 0xaf, 0x54, 0xa, 0xfb, 0xa2,
+ 0xfd, 0xb2, 0x15, 0x81, 0xa8, 0xa1, 0x85, 0xa8,
+ 0x1b, 0xf6, 0x92, 0xb6, 0xf7, 0x12, 0xad, 0x1f,
+ 0xea, 0xf8, 0x45, 0x5, 0xfb, 0x25, 0x82, 0xa,
+ 0xdf, 0x6, 0x39, 0xfc, 0x3, 0x74, 0x2e, 0x83,
+ 0x69, 0x5c, 0x89, 0x19, 0x6c, 0x8a, 0x7c, 0x91,
+ 0x73, 0x92, 0x8, 0xfb, 0x93, 0x81, 0x15, 0x80,
+ 0x55, 0x5, 0xf7, 0x3c, 0x6, 0x98, 0xc1, 0x5,
+ 0x4e, 0x6, 0xf7, 0x1, 0xf8, 0x84, 0x5, 0xc3,
+ 0x46, 0xa, 0xfb, 0x3e, 0x38, 0xa, 0xc1, 0x6,
+ 0xfb, 0x1, 0xfc, 0x84, 0x5, 0xf7, 0x17, 0xf9,
+ 0x14, 0x54, 0xa, 0xe, 0x3e, 0xa, 0x9f, 0x16,
+ 0xf8, 0x91, 0x6, 0xbe, 0xf7, 0x91, 0x71, 0xa,
+ 0x5f, 0xfb, 0x5b, 0x5, 0xfb, 0xb2, 0x6, 0xb0,
+ 0xf7, 0x4e, 0xf7, 0x53, 0xd1, 0x96, 0xc2, 0xfb,
+ 0x53, 0x44, 0xb6, 0xf7, 0x6a, 0x5, 0xf7, 0x13,
+ 0x2a, 0xa, 0xfb, 0xb6, 0x45, 0xa, 0xf7, 0x0,
+ 0x6, 0x5c, 0xfb, 0x80, 0x30, 0x69, 0x80, 0x55,
+ 0xe6, 0xad, 0x6b, 0xfb, 0x38, 0x57, 0xa, 0xe,
+ 0x8b, 0xc2, 0xf8, 0x9b, 0xc2, 0x1, 0xc3, 0x16,
+ 0xf8, 0x57, 0x6, 0x98, 0xc2, 0x5, 0xfb, 0x56,
+ 0x6, 0xbf, 0xf7, 0x89, 0xf7, 0x2e, 0xc0, 0x97,
+ 0xc2, 0xfb, 0x2d, 0x56, 0xc5, 0xf7, 0xa6, 0x5,
+ 0xfb, 0x90, 0x56, 0xa, 0xf7, 0x53, 0x6, 0x58,
+ 0xfb, 0x85, 0xfb, 0x33, 0x55, 0x80, 0x55, 0xf7,
+ 0x32, 0xc0, 0x59, 0xfb, 0x73, 0x5, 0xfb, 0x57,
+ 0x6, 0xe, 0x8b, 0xc1, 0xf7, 0x5b, 0xc2, 0xf7,
+ 0x5c, 0xc1, 0x1, 0x85, 0xc3, 0x3, 0xf7, 0xc2,
+ 0xc1, 0x15, 0xb2, 0xf7, 0x5b, 0x5, 0xda, 0x60,
+ 0xa, 0xc1, 0x6, 0xac, 0xf7, 0x3a, 0x5, 0x55,
+ 0x38, 0xa, 0x3c, 0x6, 0xb2, 0xf7, 0x5c, 0x5,
+ 0xf7, 0x2a, 0x6, 0x78, 0x27, 0x6a, 0xa, 0xa9,
+ 0xf7, 0x2e, 0x5, 0xfb, 0xa5, 0x6, 0xfb, 0x3f,
+ 0xfb, 0x3d, 0xfb, 0x21, 0xfb, 0x6a, 0xfb, 0x3,
+ 0xc3, 0x2b, 0xf7, 0x32, 0x1f, 0xf7, 0xb5, 0x6,
+ 0xaa, 0xf7, 0x2c, 0x52, 0xa, 0x77, 0x29, 0x5,
+ 0xfb, 0x62, 0x16, 0xfb, 0x25, 0x57, 0xc9, 0xf2,
+ 0xf7, 0x3e, 0xf7, 0x2c, 0xf7, 0xc, 0xf7, 0x1a,
+ 0x8a, 0x1f, 0xe, 0x7c, 0xc2, 0xf7, 0x38, 0xc1,
+ 0xf7, 0x14, 0xc2, 0x1, 0x9e, 0xc2, 0xf7, 0x65,
+ 0xba, 0xf7, 0x57, 0xc2, 0x3, 0xf7, 0xad, 0xd3,
+ 0x15, 0x57, 0x9b, 0xaa, 0x68, 0xd5, 0x1b, 0xb6,
+ 0xba, 0x97, 0x96, 0xb2, 0x1f, 0xc2, 0x7, 0x82,
+ 0x6d, 0x62, 0x7d, 0x68, 0x1b, 0x4c, 0x64, 0xad,
+ 0xd6, 0x99, 0x8e, 0xa5, 0x8f, 0x9a, 0x1f, 0xf7,
+ 0x80, 0x6, 0x94, 0xaa, 0x90, 0xa2, 0xae, 0x1a,
+ 0xd6, 0x78, 0xd4, 0x36, 0x46, 0x5f, 0x5a, 0x6d,
+ 0x76, 0x1e, 0xba, 0x80, 0x69, 0xab, 0x4b, 0x1b,
+ 0xfb, 0x2f, 0x50, 0xfb, 0x5c, 0xfb, 0x11, 0xfb,
+ 0xc, 0xe3, 0x80, 0xa8, 0xe3, 0xb7, 0xcb, 0xa2,
+ 0x98, 0x1f, 0xc7, 0xf7, 0x4e, 0x15, 0xcb, 0x9b,
+ 0xbe, 0xcb, 0xc7, 0x1b, 0xd1, 0x82, 0x3d, 0x59,
+ 0x87, 0x1f, 0xfc, 0x57, 0xfb, 0xf, 0x15, 0xe9,
+ 0xbe, 0xf7, 0x31, 0xec, 0xe2, 0x7e, 0x29, 0x4c,
+ 0x7e, 0x1e, 0x47, 0x7f, 0x75, 0xfb, 0x9, 0x23,
+ 0x1b, 0x4d, 0x82, 0xbc, 0xb9, 0x1f, 0xe, 0xfb,
+ 0x16, 0x76, 0xf7, 0x70, 0xc6, 0xf7, 0x36, 0xc4,
+ 0xf7, 0x3a, 0xc8, 0x91, 0x77, 0x12, 0xeb, 0xce,
+ 0xf7, 0xd0, 0xcf, 0x13, 0xf6, 0x98, 0xcf, 0x15,
+ 0xcc, 0x6, 0x97, 0xc7, 0xba, 0x75, 0xb8, 0x6c,
+ 0xd8, 0x85, 0x19, 0x78, 0x38, 0x5, 0x90, 0x94,
+ 0x95, 0x8c, 0x94, 0x1b, 0x9b, 0x98, 0x80, 0x7d,
+ 0x7d, 0x84, 0x6d, 0x68, 0x7a, 0x79, 0x8f, 0x94,
+ 0x7f, 0x1f, 0x6c, 0x50, 0x5, 0x82, 0x91, 0xa6,
+ 0x78, 0xad, 0x1b, 0xbb, 0xc9, 0xb5, 0xe1, 0xa6,
+ 0x7e, 0xaf, 0x73, 0x96, 0x1f, 0x8e, 0x9d, 0x5,
+ 0xf7, 0x20, 0x91, 0xe2, 0xba, 0xf6, 0x1a, 0xcf,
+ 0x3c, 0xb8, 0x34, 0x90, 0x1e, 0x3c, 0x8f, 0xfb,
+ 0x1f, 0x7f, 0xe5, 0x1a, 0xc7, 0xf7, 0xc, 0xa3,
+ 0xbc, 0xcc, 0xc8, 0x73, 0x6e, 0xb7, 0x1e, 0x7e,
+ 0x52, 0x5, 0xc9, 0x6, 0x13, 0xee, 0xaf, 0xf7,
+ 0x45, 0x5, 0x4d, 0x6, 0x82, 0x54, 0x5, 0x13,
+ 0xf6, 0xa8, 0x5b, 0x4e, 0x9f, 0x4a, 0x1b, 0xfb,
+ 0x16, 0xfb, 0x8, 0x50, 0x30, 0xfb, 0x16, 0xf7,
+ 0x1f, 0x8b, 0xf3, 0x87, 0x1f, 0xdf, 0x88, 0xc3,
+ 0x75, 0x5a, 0x1a, 0x35, 0xfb, 0x22, 0x89, 0x56,
+ 0x40, 0x53, 0xad, 0xb4, 0x5b, 0x1e, 0x96, 0xc0,
+ 0x5, 0x4b, 0x6, 0xe, 0xfb, 0x16, 0x76, 0xf7,
+ 0x47, 0xba, 0xf7, 0x17, 0xb9, 0xf7, 0x1b, 0xbd,
+ 0x8f, 0x77, 0x12, 0xf7, 0xa, 0xc8, 0xf7, 0xac,
+ 0xc7, 0x13, 0xf6, 0xba, 0xa6, 0x15, 0xc2, 0x6,
+ 0x96, 0xbb, 0xb5, 0x7a, 0xb5, 0x76, 0xcd, 0x82,
+ 0x19, 0x7b, 0x47, 0x5, 0x8e, 0x92, 0x92, 0x8d,
+ 0x92, 0x1b, 0x9a, 0x99, 0x82, 0x7f, 0x80, 0x85,
+ 0x73, 0x6c, 0x7c, 0x7b, 0x8e, 0x92, 0x80, 0x1f,
+ 0x70, 0x5c, 0x5, 0x83, 0x90, 0xa3, 0x7c, 0xa9,
+ 0x1b, 0xb5, 0xc2, 0xac, 0xd0, 0x1f, 0x8a, 0xa1,
+ 0x81, 0xaa, 0x76, 0x94, 0x8d, 0x9a, 0x18, 0xf7,
+ 0x11, 0x90, 0xd8, 0xb0, 0xe2, 0x1a, 0x8c, 0xc2,
+ 0x44, 0xaf, 0x3d, 0x8f, 0x8, 0x45, 0x8e, 0xfb,
+ 0xe, 0x82, 0xd4, 0x1a, 0xbc, 0xf5, 0x9e, 0xb6,
+ 0xc4, 0xc2, 0x78, 0x73, 0xb2, 0x1e, 0x80, 0x5d,
+ 0x5, 0xc1, 0x6, 0x13, 0xee, 0xaa, 0xf7, 0x23,
+ 0x5, 0x55, 0x6, 0x83, 0x5f, 0x5, 0x13, 0xf6,
+ 0xa2, 0x61, 0x54, 0x9c, 0x52, 0x1b, 0xfb, 0x7,
+ 0x23, 0x5b, 0x41, 0x21, 0xf7, 0x10, 0x8b, 0xe7,
+ 0x88, 0x1f, 0xd5, 0x89, 0xbe, 0x79, 0x63, 0x1a,
+ 0x46, 0xfb, 0x13, 0x89, 0x5c, 0x49, 0x59, 0xa7,
+ 0xac, 0x60, 0x1e, 0x95, 0xb6, 0x62, 0xa, 0xe,
+ 0x77, 0xc2, 0xf8, 0x7d, 0xc2, 0x8b, 0xb9, 0xf7,
+ 0x48, 0x77, 0x12, 0xf4, 0xc7, 0xf7, 0xa7, 0xc8,
+ 0x17, 0x8c, 0x81, 0x15, 0xc4, 0x78, 0xa, 0x5f,
+ 0xc1, 0xe9, 0x7a, 0xb9, 0x1b, 0xf7, 0x9, 0xf7,
+ 0xd, 0xae, 0xf7, 0x21, 0xe6, 0x38, 0xa8, 0x3a,
+ 0x9f, 0x1f, 0x45, 0x9c, 0x25, 0x98, 0xde, 0x1a,
+ 0xd7, 0xcd, 0xb2, 0xee, 0xc1, 0xcf, 0x71, 0x68,
+ 0xab, 0x1e, 0x7a, 0x3a, 0x5, 0xc6, 0x6, 0xad,
+ 0xf7, 0x50, 0x71, 0xa, 0x83, 0x63, 0x5, 0x13,
+ 0xfc, 0xa7, 0x69, 0x45, 0xa0, 0x56, 0x1b, 0xfb,
+ 0x33, 0x40, 0x4c, 0xfb, 0x3, 0xfb, 0xf, 0xf7,
+ 0x10, 0x74, 0xdc, 0x79, 0x1f, 0xce, 0x7d, 0xca,
+ 0x6c, 0x61, 0x1a, 0x49, 0x4e, 0x56, 0xfb, 0x6,
+ 0x4a, 0x3e, 0xa7, 0xb3, 0x60, 0x1e, 0x99, 0xd1,
+ 0x62, 0xa, 0xf7, 0xbb, 0xf8, 0x58, 0x15, 0xde,
+ 0x6, 0xf7, 0x4b, 0xf7, 0x36, 0x62, 0x9d, 0xfb,
+ 0x3c, 0xfb, 0xd, 0xfb, 0x1b, 0xf7, 0xd, 0x5d,
+ 0x78, 0x5, 0xe, 0x7c, 0xc2, 0x8b, 0xf7, 0x25,
+ 0x8b, 0xbf, 0x8b, 0xf7, 0x2a, 0x8b, 0xc2, 0x8b,
+ 0xbc, 0xf7, 0x46, 0x77, 0x1, 0xf3, 0xc4, 0xf7,
+ 0xa5, 0xc6, 0x3, 0xf7, 0xc5, 0xf8, 0x7f, 0x85,
+ 0xa, 0xf7, 0x49, 0xf7, 0x32, 0x64, 0x9f, 0xfb,
+ 0x3d, 0xfb, 0x4, 0xfb, 0x17, 0xf7, 0x3, 0x5e,
+ 0x77, 0x5, 0xfb, 0x2c, 0xfd, 0x2b, 0x15, 0xc3,
+ 0x36, 0xa, 0x74, 0xb8, 0xb5, 0x6b, 0xdd, 0x1b,
+ 0xf7, 0x1e, 0xe2, 0xb5, 0xf2, 0x1f, 0x8c, 0xc8,
+ 0x46, 0xb5, 0x40, 0x8f, 0x8, 0x47, 0x8f, 0xfb,
+ 0xd, 0x80, 0xdc, 0x1a, 0xc1, 0xf3, 0xa1, 0xb6,
+ 0xc3, 0xbf, 0x75, 0x70, 0xb1, 0x1e, 0x80, 0x58,
+ 0x5, 0xc1, 0x6, 0xab, 0xf7, 0x34, 0x5, 0x55,
+ 0x6, 0x82, 0x59, 0x5, 0xa6, 0x62, 0x57, 0x9d,
+ 0x52, 0x1b, 0xfb, 0x4, 0x27, 0x56, 0x38, 0xfb,
+ 0x9, 0xf7, 0xc, 0x8b, 0xe5, 0x87, 0x1f, 0xd4,
+ 0x88, 0xba, 0x78, 0x5f, 0x1a, 0x3e, 0xfb, 0xe,
+ 0x89, 0x5d, 0x4a, 0x5b, 0xa8, 0xb1, 0x62, 0x1e,
+ 0x94, 0xbc, 0x52, 0xa, 0xe, 0x8b, 0xc1, 0xf8,
+ 0x5d, 0xc1, 0xee, 0xf7, 0x9, 0x1, 0xf7, 0xfb,
+ 0xf9, 0x2c, 0x15, 0xe2, 0x6, 0xa4, 0xf7, 0x9,
+ 0x5, 0x35, 0x6, 0xfb, 0x44, 0xfb, 0x9, 0x15,
+ 0xe0, 0x6, 0xa6, 0xf7, 0x9, 0x5, 0x34, 0x6,
+ 0xfb, 0x55, 0xfd, 0xa1, 0x15, 0x31, 0xa, 0xe,
+ 0x8b, 0xc2, 0xf8, 0x63, 0xc2, 0x8b, 0xc1, 0x8b,
+ 0xc5, 0x1, 0xf7, 0x6, 0xc3, 0xf7, 0xa1, 0xc0,
+ 0x3, 0xa0, 0x16, 0xf8, 0x41, 0x6, 0xb5, 0xf7,
+ 0x63, 0x5, 0x56, 0x6, 0x6b, 0xfb, 0x2c, 0x5,
+ 0xfb, 0xc4, 0x6, 0xf8, 0x4f, 0xf8, 0x66, 0x95,
+ 0xbf, 0x5, 0xfc, 0x26, 0x6, 0x63, 0xfb, 0x55,
+ 0x51, 0xa, 0xa9, 0xf7, 0x1e, 0x5, 0xf7, 0xa5,
+ 0x6, 0xfc, 0x4e, 0xfc, 0x64, 0x5, 0xf7, 0xbd,
+ 0xf8, 0xd1, 0x48, 0xa, 0x8b, 0xc2, 0xf7, 0xd8,
+ 0xc2, 0x8b, 0xc3, 0xf7, 0x47, 0x77, 0x12, 0xf7,
+ 0xc4, 0xf8, 0x7e, 0x4c, 0xa, 0xfb, 0x28, 0xfd,
+ 0x1c, 0x15, 0xf8, 0x2b, 0x6, 0xaa, 0xf7, 0x31,
+ 0x52, 0xa, 0x77, 0x25, 0x5, 0xfb, 0xa7, 0x6,
+ 0xf8, 0x1d, 0xf7, 0xdc, 0x95, 0xbe, 0x5, 0x13,
+ 0x60, 0xfc, 0x1a, 0x6, 0x6d, 0xfb, 0x2e, 0x5,
+ 0xc1, 0x6, 0x9f, 0xee, 0x5, 0xf7, 0x95, 0x6,
+ 0xfc, 0x1c, 0xfb, 0xdb, 0x5, 0xe, 0xfb, 0x23,
+ 0xc6, 0xf8, 0x4f, 0xc5, 0xf7, 0x2d, 0xbf, 0x1,
+ 0x7f, 0x37, 0x15, 0x67, 0x50, 0x5, 0xf7, 0x75,
+ 0x9f, 0xb3, 0xf7, 0x19, 0xbd, 0x1f, 0xf7, 0x11,
+ 0xf7, 0xdd, 0x5, 0xf7, 0x2, 0x6, 0x9e, 0xc5,
+ 0x57, 0xa, 0xf7, 0x8, 0xba, 0x97, 0xb0, 0xf2,
+ 0x1b, 0x9e, 0x9f, 0x88, 0x8a, 0x9e, 0x1f, 0xaf,
+ 0xc3, 0x5, 0x61, 0x65, 0x8b, 0x6e, 0x1b, 0xfb,
+ 0x1f, 0x80, 0x4b, 0xfb, 0x21, 0x55, 0x1f, 0xfb,
+ 0x5, 0x6, 0x7a, 0x51, 0x5, 0xf7, 0x0, 0x6,
+ 0xfb, 0xf, 0xfb, 0xd7, 0x5, 0x20, 0x63, 0x55,
+ 0x7e, 0xfb, 0x1, 0x1b, 0xe, 0x79, 0xc2, 0x8b,
+ 0xf7, 0x39, 0x8b, 0xc2, 0xf7, 0xa0, 0xc2, 0x8b,
+ 0xba, 0xf7, 0x46, 0x77, 0x12, 0x9e, 0xc4, 0x17,
+ 0x34, 0xa, 0x13, 0xfe, 0x3d, 0xa, 0xa8, 0xf8,
+ 0x6, 0x48, 0xa, 0xfb, 0x31, 0xbd, 0x8b, 0xf7,
+ 0x38, 0x8b, 0xbe, 0xf7, 0xae, 0xbe, 0x8b, 0xbc,
+ 0xf7, 0x47, 0x77, 0x12, 0xab, 0xc3, 0x17, 0x3f,
+ 0xa, 0x13, 0xfe, 0x30, 0xa, 0xf7, 0x6f, 0xf7,
+ 0xa0, 0x4c, 0xa, 0xe, 0xf8, 0xe2, 0xcb, 0x1,
+ 0xf7, 0x10, 0xf7, 0xf4, 0x3, 0xf7, 0x10, 0xf8,
+ 0x83, 0x15, 0xad, 0x79, 0xf7, 0x36, 0xf7, 0x5,
+ 0xf7, 0x5, 0xfb, 0x5, 0xb6, 0x9d, 0xfb, 0x1,
+ 0xf7, 0x33, 0x5, 0x40, 0x6, 0xe, 0xf8, 0x80,
+ 0xc9, 0x1, 0xf7, 0x10, 0xf7, 0xf4, 0x3, 0xf7,
+ 0x7f, 0xf8, 0x80, 0x15, 0xd5, 0x6, 0xf7, 0x3b,
+ 0xf7, 0x31, 0x67, 0x9f, 0xfb, 0x32, 0xfb, 0x7,
+ 0xfb, 0x9, 0xf7, 0x6, 0x62, 0x77, 0x5, 0xe,
+ 0xf8, 0x89, 0xb2, 0x1, 0xf7, 0x2b, 0xf7, 0xbd,
+ 0x3, 0xf7, 0x2b, 0xf8, 0xf5, 0x15, 0x3c, 0xa1,
+ 0xbf, 0x6e, 0xc4, 0x1b, 0xd7, 0xc8, 0xbc, 0xc6,
+ 0xa8, 0x1f, 0x60, 0x6, 0x6d, 0x7b, 0x5c, 0x64,
+ 0x55, 0x1b, 0x60, 0x64, 0xa5, 0xb6, 0x80, 0x1f,
+ 0xe, 0xf8, 0x71, 0xf2, 0x1, 0xf7, 0x8b, 0xf8,
+ 0x71, 0x15, 0xde, 0x6, 0xa2, 0xf2, 0x7b, 0xa,
+ 0xe, 0xf8, 0x63, 0xbe, 0xca, 0xbd, 0x1, 0xf7,
+ 0x6c, 0xbe, 0xcd, 0xbe, 0x3, 0xf7, 0x6c, 0xf8,
+ 0xa3, 0x15, 0x67, 0xa6, 0x6f, 0xb4, 0xbf, 0xbb,
+ 0xb9, 0xbf, 0xb1, 0x6f, 0xa7, 0x62, 0x57, 0x5c,
+ 0x5c, 0x56, 0x1e, 0xbe, 0x96, 0x15, 0xa0, 0x9d,
+ 0x9d, 0x9f, 0x9b, 0x97, 0x81, 0x7d, 0x77, 0x79,
+ 0x78, 0x76, 0x7b, 0x80, 0x96, 0x98, 0x1e, 0xe,
+ 0xfb, 0x28, 0xbf, 0xeb, 0x77, 0x1, 0xf7, 0x79,
+ 0xcc, 0x3, 0xf7, 0xc4, 0x16, 0x64, 0x78, 0x67,
+ 0x65, 0x61, 0x1a, 0x6f, 0x9d, 0x76, 0xae, 0xa0,
+ 0xa1, 0x92, 0x99, 0x9f, 0x1e, 0x9b, 0xc2, 0x5,
+ 0x7d, 0x83, 0x73, 0x81, 0x7a, 0x1b, 0x81, 0x83,
+ 0x90, 0x96, 0xb2, 0xbd, 0xa5, 0xa5, 0x9a, 0x1f,
+ 0xe, 0xf8, 0x7d, 0xbd, 0x9d, 0xbc, 0x1, 0xe6,
+ 0xf8, 0x8c, 0x15, 0xbc, 0x80, 0x5, 0x9a, 0x92,
+ 0xae, 0xbc, 0xae, 0x1b, 0xa5, 0x9f, 0x78, 0x79,
+ 0xa2, 0x1f, 0x7b, 0x9f, 0xa1, 0x7c, 0xa9, 0x1b,
+ 0xc9, 0xc5, 0xbb, 0xc3, 0xa9, 0x1f, 0x5a, 0x95,
+ 0x5, 0x71, 0x7d, 0x5d, 0x65, 0x67, 0x1b, 0x75,
+ 0x7b, 0x99, 0x9b, 0x78, 0x1f, 0x9d, 0x76, 0x73,
+ 0x9e, 0x6a, 0x1b, 0x58, 0x58, 0x67, 0x49, 0x68,
+ 0x1f, 0xe, 0x65, 0xa, 0xf7, 0xa5, 0xf8, 0x99,
+ 0x15, 0xad, 0x77, 0xf7, 0x52, 0xf7, 0x22, 0x55,
+ 0xac, 0x5, 0xfb, 0xe8, 0xfb, 0x2f, 0x15, 0xad,
+ 0x77, 0xf7, 0x56, 0xf7, 0x22, 0x52, 0xac, 0x5,
+ 0xe, 0xf7, 0x7b, 0xc1, 0x1, 0xd0, 0xf7, 0x7b,
+ 0x15, 0xf8, 0x57, 0x2a, 0xa, 0xfc, 0x57, 0x6,
+ 0xe, 0xf7, 0x7b, 0xc1, 0x1, 0x85, 0xf7, 0x7b,
+ 0x15, 0xf8, 0xed, 0x2a, 0xa, 0xfc, 0xed, 0x6,
+ 0xe, 0xf7, 0xbb, 0xc9, 0x3, 0xf7, 0xbb, 0xf7,
+ 0xdc, 0x15, 0xc9, 0x6, 0x72, 0x64, 0xa, 0x32,
+ 0x6, 0xe, 0xf8, 0xc6, 0x77, 0x1, 0xf7, 0x56,
+ 0xc9, 0x3, 0xf7, 0x56, 0xf7, 0xdc, 0x15, 0xc9,
+ 0x6, 0xf7, 0x2a, 0x64, 0xa, 0x30, 0x6, 0xe,
+ 0xef, 0x77, 0x1, 0xf7, 0x56, 0xca, 0x3, 0xf7,
+ 0x56, 0xfb, 0x1a, 0x15, 0xca, 0x75, 0xa, 0xf8,
+ 0xc6, 0x77, 0x1, 0xf7, 0x68, 0xc9, 0xf4, 0xc7,
+ 0x3, 0xf8, 0xf, 0xf7, 0xdc, 0x15, 0xc7, 0x6,
+ 0x72, 0x64, 0xa, 0x32, 0x6, 0xfb, 0x5, 0xfb,
+ 0x7e, 0x15, 0xc9, 0x6, 0x73, 0x64, 0xa, 0x31,
+ 0x6, 0xe, 0xf8, 0xc6, 0x74, 0xa, 0xf7, 0xdc,
+ 0x15, 0xc7, 0x6, 0xf7, 0x21, 0x64, 0xa, 0x35,
+ 0x6, 0xfb, 0xa9, 0xfb, 0x7e, 0x15, 0xc6, 0x6,
+ 0xf7, 0x23, 0x64, 0xa, 0x35, 0x6, 0xe, 0xef,
+ 0x74, 0xa, 0xfb, 0x1a, 0x15, 0xc7, 0x6, 0xf7,
+ 0x21, 0x64, 0xa, 0x34, 0x6, 0xfb, 0xa8, 0xfb,
+ 0x7e, 0x15, 0xc6, 0x6, 0xf7, 0x22, 0x64, 0xa,
+ 0x34, 0x6, 0xe, 0xf7, 0xfb, 0xc6, 0xf7, 0x36,
+ 0x77, 0x1, 0xf7, 0x40, 0xc6, 0x3, 0xf7, 0x40,
+ 0x3d, 0x15, 0xc6, 0x6, 0xe5, 0xf8, 0x4f, 0x5,
+ 0xf7, 0x17, 0x6, 0x97, 0xc0, 0x83, 0xa, 0xae,
+ 0xf7, 0x36, 0x5, 0x50, 0x6, 0x69, 0xfb, 0x36,
+ 0x5, 0xfb, 0x14, 0x6, 0x80, 0x56, 0x5, 0xf7,
+ 0x14, 0x6, 0xe, 0xf2, 0xc6, 0xf7, 0x64, 0xc5,
+ 0xf7, 0x2c, 0x77, 0x1, 0xec, 0xf2, 0x15, 0xf7,
+ 0x18, 0x6, 0x64, 0xfb, 0x49, 0x5, 0xcb, 0x6,
+ 0xb2, 0xf7, 0x49, 0x5, 0xf7, 0x18, 0x6, 0x97,
+ 0xc6, 0x5, 0xfb, 0x17, 0x6, 0xb6, 0xf7, 0x64,
+ 0x5, 0xf7, 0x16, 0x6, 0x97, 0xc5, 0x5, 0xfb,
+ 0x16, 0x6, 0xab, 0xf7, 0x2c, 0x5, 0x4b, 0x6,
+ 0x6b, 0xfb, 0x2c, 0x83, 0xa, 0x81, 0x51, 0x5,
+ 0xf7, 0x17, 0x6, 0x5f, 0xfb, 0x64, 0x83, 0xa,
+ 0xe, 0xf7, 0x2b, 0x76, 0xf7, 0x91, 0x77, 0x1,
+ 0xf7, 0x3d, 0xf7, 0x7c, 0x15, 0x52, 0xb5, 0x5e,
+ 0xc9, 0xd7, 0xdc, 0xd2, 0xd9, 0xc6, 0x5f, 0xb8,
+ 0x4c, 0x3c, 0x40, 0x45, 0x3a, 0x1e, 0xe, 0x7c,
+ 0xf7, 0x12, 0x1, 0xae, 0xf7, 0x15, 0xd2, 0xf7,
+ 0x15, 0xd2, 0xf7, 0x15, 0x14, 0x70, 0xf7, 0x7f,
+ 0xb1, 0x15, 0x41, 0xa, 0xfb, 0x5c, 0x16, 0x41,
+ 0xa, 0xf8, 0x24, 0x16, 0x41, 0xa, 0xe, 0x7c,
+ 0xc2, 0xf7, 0x21, 0xc1, 0xf7, 0x1d, 0xc2, 0xf7,
+ 0x21, 0xc1, 0x12, 0xaa, 0xc4, 0xf7, 0x57, 0xc4,
+ 0x77, 0xc4, 0xf7, 0x2a, 0xc4, 0x13, 0xfd, 0xd7,
+ 0xf8, 0x6e, 0x2e, 0xa, 0xfb, 0x5, 0xfb, 0x94,
+ 0x15, 0xf8, 0x6c, 0xf7, 0x38, 0x87, 0xc0, 0xfc,
+ 0x6c, 0xfb, 0x3a, 0x5, 0x13, 0xfb, 0xf7, 0xc4,
+ 0xfb, 0x51, 0x2e, 0xa, 0xfb, 0xee, 0x84, 0x2e,
+ 0xa, 0xe, 0xf8, 0x52, 0x77, 0x1, 0xf7, 0x18,
+ 0xe8, 0x3, 0xf7, 0x18, 0xf7, 0x95, 0x15, 0xf7,
+ 0x84, 0xfb, 0x4f, 0xa9, 0xba, 0xfb, 0x45, 0xf7,
+ 0x1d, 0xf7, 0x87, 0xf7, 0x1c, 0x82, 0xc3, 0x5,
+ 0xe, 0xf8, 0x52, 0x77, 0x1, 0xf8, 0x6, 0xed,
+ 0x3, 0xf7, 0x21, 0xd1, 0x15, 0xf7, 0xdb, 0xf7,
+ 0x4f, 0xfb, 0x84, 0xf7, 0x51, 0x6c, 0x5c, 0xf7,
+ 0x41, 0xfb, 0x1a, 0xfb, 0x82, 0xfb, 0x20, 0x5,
+ 0xe, 0x67, 0x76, 0xf9, 0x66, 0x77, 0x1, 0x9e,
+ 0x6e, 0x15, 0xab, 0x6f, 0xf8, 0xa6, 0xf9, 0x4a,
+ 0x6b, 0xa7, 0x5, 0xe, 0x76, 0xc5, 0xf7, 0x28,
+ 0xc4, 0xdb, 0xc3, 0xf7, 0x43, 0xc5, 0x1, 0xf7,
+ 0x36, 0xc1, 0x3, 0xbb, 0xaa, 0x15, 0x9b, 0x57,
+ 0x5, 0xa1, 0xc0, 0xe6, 0x93, 0x9b, 0x1b, 0x9f,
+ 0x9d, 0x87, 0x84, 0x9e, 0x1f, 0x83, 0x9e, 0xa0,
+ 0x80, 0xa6, 0x53, 0xa, 0x71, 0x79, 0x97, 0x93,
+ 0x79, 0x1f, 0x93, 0x7a, 0x7a, 0x8e, 0x73, 0x1b,
+ 0x6e, 0x6d, 0x84, 0x80, 0x6e, 0x1f, 0xc8, 0xb0,
+ 0x9f, 0xc2, 0x8e, 0xb6, 0x8, 0xf7, 0x48, 0x6,
+ 0x99, 0xc4, 0x5, 0xfb, 0x5c, 0x6, 0x8a, 0x96,
+ 0x8a, 0xae, 0x8a, 0xad, 0x8, 0xf7, 0x66, 0x6,
+ 0x9b, 0xc3, 0x5, 0xfb, 0x77, 0xa9, 0x6, 0x42,
+ 0xa, 0x82, 0x8b, 0x7b, 0x8c, 0x78, 0x8, 0x4a,
+ 0x6, 0x7d, 0x53, 0x5, 0xdb, 0x6, 0x8c, 0x6a,
+ 0x8d, 0x69, 0x8c, 0x7e, 0x8, 0x29, 0x6, 0x7b,
+ 0x52, 0x5, 0xf7, 0x8, 0x6, 0x55, 0x63, 0x67,
+ 0x3a, 0x4b, 0x1e, 0xe, 0x8b, 0xbf, 0xf7, 0x22,
+ 0xbf, 0xc8, 0xbf, 0xf7, 0x2b, 0xbf, 0x1, 0xe0,
+ 0xc2, 0xf8, 0x8, 0xbe, 0x3, 0x89, 0xf7, 0x56,
+ 0x15, 0xd7, 0x6, 0xfb, 0x7, 0x90, 0xcf, 0x3c,
+ 0xf7, 0x1f, 0x1b, 0xd6, 0xda, 0xa7, 0xb5, 0xcd,
+ 0x1f, 0x7d, 0xb7, 0x5, 0x67, 0x52, 0x45, 0x71,
+ 0x4a, 0x1b, 0x2c, 0x49, 0xb9, 0xeb, 0x81, 0x1f,
+ 0xf7, 0x6b, 0x6, 0xa7, 0xbf, 0x5, 0xfb, 0x87,
+ 0x6, 0x8e, 0x9f, 0x8e, 0xa2, 0x90, 0x9d, 0x8,
+ 0xf7, 0x98, 0x6, 0xa9, 0xbf, 0x5, 0xfb, 0xa4,
+ 0x6, 0xe5, 0xb4, 0xdc, 0xc8, 0xe5, 0x1b, 0xcf,
+ 0xc8, 0x73, 0x66, 0xa8, 0x1f, 0x7b, 0x3d, 0x5,
+ 0xbe, 0x6, 0xb2, 0xf7, 0x53, 0x5, 0x58, 0x6,
+ 0x80, 0x59, 0x5, 0xac, 0x63, 0x5b, 0x9c, 0x47,
+ 0x1b, 0xfb, 0x12, 0xfb, 0x0, 0x32, 0xfb, 0x6,
+ 0x5c, 0x1f, 0x54, 0x6, 0x6d, 0x57, 0x5, 0xce,
+ 0x6, 0x86, 0x73, 0x89, 0x76, 0x89, 0x7b, 0x8,
+ 0x5a, 0x6, 0xe, 0x7c, 0xc2, 0xf7, 0x49, 0xc1,
+ 0xf7, 0x7c, 0xc2, 0x1, 0xf8, 0xac, 0xc6, 0x3,
+ 0x90, 0x7c, 0x15, 0xf7, 0x79, 0x36, 0xa, 0x37,
+ 0x6, 0xb1, 0xf7, 0x48, 0x5, 0xf7, 0xc, 0x6,
+ 0x9d, 0x6e, 0xaa, 0x57, 0xa7, 0x56, 0x40, 0x44,
+ 0x18, 0xba, 0x6d, 0xc1, 0xbd, 0x94, 0x79, 0x92,
+ 0x7a, 0x91, 0x7c, 0x19, 0xf7, 0x1f, 0x6, 0x96,
+ 0xc2, 0x57, 0xa, 0x78, 0xb1, 0xda, 0xd5, 0x5c,
+ 0xa9, 0x51, 0x54, 0x77, 0xae, 0x77, 0xac, 0x7a,
+ 0xa5, 0x19, 0xea, 0x8e, 0xf7, 0x8, 0xb8, 0xf7,
+ 0x37, 0x1a, 0xcd, 0x57, 0xcb, 0x23, 0x1e, 0xfb,
+ 0xce, 0x38, 0xa, 0xe1, 0x6, 0x2a, 0xfc, 0x67,
+ 0x5, 0x34, 0x6, 0xf7, 0x56, 0xf7, 0x7f, 0x15,
+ 0xba, 0xf7, 0x7c, 0x5, 0xf7, 0x2c, 0x6, 0xd9,
+ 0xbc, 0x6b, 0x5f, 0xfb, 0x2b, 0xfb, 0x23, 0x86,
+ 0x3f, 0x1f, 0xe, 0xf7, 0xb0, 0x76, 0xf7, 0x93,
+ 0xb7, 0x1, 0xb6, 0xbe, 0xf7, 0x10, 0xbb, 0xf7,
+ 0x60, 0xbd, 0x3, 0xf7, 0x6e, 0xf7, 0x9b, 0x15,
+ 0xbb, 0x6, 0xc7, 0xf7, 0xa2, 0x97, 0xfb, 0xa2,
+ 0x5, 0xcb, 0x6, 0xf7, 0x14, 0xf7, 0xa1, 0x4f,
+ 0xfb, 0xa1, 0x5, 0xbd, 0x6, 0xcd, 0xf7, 0xbf,
+ 0x5, 0x30, 0x6, 0xfb, 0x6, 0xfb, 0x87, 0x84,
+ 0xf7, 0x87, 0x5, 0x31, 0x6, 0xfb, 0x85, 0xfb,
+ 0xbf, 0x15, 0xbe, 0x6, 0xc2, 0xf7, 0x93, 0x5,
+ 0xe1, 0x6, 0x95, 0xb7, 0x5, 0xfb, 0x71, 0x6,
+ 0x81, 0x5f, 0x5, 0xe0, 0x6, 0xe, 0x73, 0xa,
+ 0xf7, 0x11, 0xf7, 0x7, 0x15, 0xa9, 0xba, 0x2f,
+ 0xf7, 0x3, 0x5, 0xf8, 0xbd, 0x6, 0x96, 0xbd,
+ 0x5, 0xfc, 0xae, 0x6, 0xf7, 0x18, 0xf3, 0x82,
+ 0xc3, 0xfb, 0x82, 0xfb, 0x4e, 0x5, 0xe, 0xa0,
+ 0x76, 0xf9, 0x3, 0x77, 0x1, 0xf7, 0x88, 0xbd,
+ 0x3, 0xf7, 0x38, 0x9c, 0x15, 0xf7, 0x18, 0xf8,
+ 0x80, 0xfb, 0x1a, 0x26, 0x58, 0xa2, 0xf7, 0x84,
+ 0xf7, 0x49, 0xf7, 0x1e, 0xfb, 0x54, 0x55, 0x7a,
+ 0x37, 0xf7, 0xa, 0xfb, 0x1b, 0xfc, 0x8e, 0x5,
+ 0xe, 0x73, 0xa, 0x70, 0xf7, 0xa7, 0x15, 0x96,
+ 0xbd, 0x5, 0xf8, 0xbf, 0x6, 0x2f, 0xf7, 0x3,
+ 0xa9, 0xba, 0xf7, 0x2a, 0xfb, 0x4a, 0xfb, 0x81,
+ 0xfb, 0x4e, 0x82, 0xc3, 0xf7, 0x18, 0xf3, 0x5,
+ 0xe, 0x9a, 0x76, 0xf8, 0xea, 0x77, 0x1, 0xf7,
+ 0x3, 0xf7, 0x4f, 0x15, 0xc0, 0x9c, 0xdd, 0xfb,
+ 0x9, 0xf7, 0x1c, 0xf8, 0x8d, 0xbe, 0x88, 0xfb,
+ 0x18, 0xfc, 0x7e, 0xf7, 0x1c, 0xef, 0xbf, 0x74,
+ 0xfb, 0x86, 0xfb, 0x4a, 0x5, 0xe, 0xf7, 0x1c,
+ 0x76, 0xf7, 0x32, 0xbf, 0xf7, 0x32, 0x77, 0x1,
+ 0xf7, 0x10, 0xf7, 0x7, 0x15, 0xfb, 0x2c, 0xf7,
+ 0x4a, 0xf7, 0x83, 0xf7, 0x4e, 0x94, 0x53, 0xfb,
+ 0x18, 0x25, 0x5, 0xf8, 0x58, 0x6, 0x31, 0xf7,
+ 0x3, 0xa9, 0xba, 0xf7, 0x28, 0xfb, 0x4a, 0xfb,
+ 0x7f, 0xfb, 0x4e, 0x82, 0xc3, 0xf7, 0x16, 0xf2,
+ 0xfc, 0x58, 0x8a, 0xe7, 0xfb, 0x3, 0x5, 0xe,
+ 0xf7, 0x7c, 0xbe, 0x1, 0xd5, 0xf7, 0x7c, 0x15,
+ 0xf8, 0x57, 0xbe, 0xfc, 0x57, 0x6, 0xe, 0x8b,
+ 0xc0, 0xf7, 0xc1, 0xc0, 0xf1, 0xf7, 0xc, 0x1,
+ 0xf7, 0x0, 0xc1, 0xf7, 0xa7, 0xc1, 0x3, 0xf8,
+ 0x96, 0xf8, 0x91, 0x15, 0xd2, 0x6, 0xa2, 0xf7,
+ 0xc, 0x5, 0x44, 0x6, 0xfb, 0x6d, 0xfd, 0x9,
+ 0x15, 0xf7, 0xa1, 0x80, 0xa, 0xfb, 0x1, 0x6,
+ 0xd3, 0xf7, 0xf6, 0x5, 0xfb, 0x1c, 0x68, 0xa,
+ 0xdd, 0x6, 0x4d, 0xfb, 0xc1, 0x5, 0x21, 0x6,
+ 0xfb, 0xe7, 0x56, 0x15, 0xf7, 0x9e, 0x6, 0x97,
+ 0xc0, 0x57, 0xa, 0xc9, 0xf7, 0xc1, 0x5, 0xf6,
+ 0x6, 0x96, 0xc0, 0x57, 0xa, 0xa6, 0xed, 0x5,
+ 0x9f, 0x90, 0x96, 0xa2, 0xd4, 0x1b, 0xa1, 0xa1,
+ 0x87, 0x87, 0x9e, 0x1f, 0xa0, 0xbf, 0x5, 0x8f,
+ 0x71, 0x5e, 0x90, 0x78, 0x1b, 0x5a, 0x43, 0x7e,
+ 0x38, 0x77, 0x1f, 0x73, 0x29, 0x5, 0x20, 0x68,
+ 0xa, 0xf6, 0x6, 0x4e, 0xfb, 0xc1, 0x5, 0x22,
+ 0x6, 0xe, 0x8b, 0xc2, 0xf7, 0xcf, 0xc2, 0xf7,
+ 0x29, 0xc2, 0x1, 0xf7, 0x2, 0xc1, 0xf7, 0xa8,
+ 0xc3, 0x3, 0xf7, 0xd5, 0x16, 0xf7, 0xa2, 0x36,
+ 0xa, 0x21, 0x6, 0xf7, 0x4, 0xf8, 0xd2, 0x5,
+ 0xfb, 0x27, 0x56, 0xa, 0xe8, 0x6, 0x25, 0xfc,
+ 0x9b, 0x57, 0xa, 0xfb, 0xe8, 0x54, 0x15, 0xf7,
+ 0xa0, 0x6, 0x97, 0xc2, 0x57, 0xa, 0xc9, 0xf7,
+ 0xcf, 0x5, 0xf6, 0x6, 0x96, 0xc2, 0x57, 0xa,
+ 0x9c, 0xe0, 0x5, 0xa1, 0x8f, 0x97, 0xb5, 0xde,
+ 0x1b, 0xa2, 0xa0, 0x86, 0x86, 0xa0, 0x1f, 0x9f,
+ 0xc1, 0x5, 0x90, 0x71, 0x6f, 0x91, 0x6f, 0x1b,
+ 0x30, 0x58, 0x5a, 0x45, 0x7e, 0x1f, 0x79, 0x36,
+ 0x5, 0xfb, 0x1, 0x67, 0xa, 0xf7, 0x1, 0x6,
+ 0x4d, 0xfb, 0xcf, 0x5, 0x20, 0x6, 0xe, 0x79,
+ 0x9d, 0xf8, 0x3e, 0x9a, 0xf7, 0xd, 0x9d, 0xa9,
+ 0x97, 0x6, 0xfb, 0x31, 0x8b, 0x7, 0x1e, 0xa0,
+ 0x39, 0x63, 0xff, 0xc, 0x9, 0xc2, 0xa, 0xc2,
+ 0xb, 0xf8, 0xec, 0x14, 0xaa, 0x13, 0x0, 0x6a,
+ 0x2, 0x0, 0x1, 0x0, 0x29, 0x0, 0x38, 0x0,
+ 0x69, 0x0, 0x6d, 0x0, 0xb9, 0x0, 0xf5, 0x1,
+ 0x3b, 0x1, 0x83, 0x1, 0xc3, 0x1, 0xf8, 0x1,
+ 0xfd, 0x2, 0xe, 0x2, 0x1a, 0x2, 0x1f, 0x2,
+ 0x46, 0x2, 0x53, 0x2, 0x93, 0x2, 0xc4, 0x2,
+ 0xce, 0x2, 0xe8, 0x3, 0x19, 0x3, 0x2c, 0x3,
+ 0x31, 0x3, 0x3f, 0x3, 0x44, 0x3, 0x4e, 0x3,
+ 0x59, 0x3, 0x64, 0x3, 0x69, 0x3, 0x8e, 0x3,
+ 0x95, 0x3, 0xb8, 0x3, 0xbf, 0x3, 0xd1, 0x3,
+ 0xed, 0x3, 0xf4, 0x3, 0xff, 0x4, 0x4, 0x4,
+ 0x9, 0x4, 0xe, 0x4, 0x23, 0x4, 0x2b, 0x4,
+ 0x32, 0x4, 0x3c, 0x4, 0x51, 0x4, 0x56, 0x4,
+ 0x5e, 0x4, 0x66, 0x4, 0x6e, 0x4, 0x72, 0x4,
+ 0x76, 0x4, 0x87, 0x4, 0x91, 0x4, 0x96, 0x4,
+ 0x9b, 0x4, 0x9f, 0x4, 0xa3, 0x4, 0xab, 0x4,
+ 0xb3, 0x4, 0xba, 0x4, 0xbf, 0x4, 0xc5, 0x4,
+ 0xca, 0x4, 0xcf, 0x4, 0xd4, 0x4, 0xd9, 0x4,
+ 0xdd, 0x4, 0xe1, 0x4, 0xe5, 0x4, 0xed, 0x4,
+ 0xf3, 0x4, 0xf8, 0x4, 0xfd, 0x5, 0x1, 0x5,
+ 0x5, 0x5, 0x9, 0x5, 0x15, 0x5, 0x21, 0x5,
+ 0x27, 0x5, 0x2d, 0x5, 0x33, 0x5, 0x37, 0x5,
+ 0x42, 0x5, 0x4d, 0x5, 0x58, 0x5, 0x60, 0x5,
+ 0x65, 0x5, 0x69, 0x5, 0x6e, 0x5, 0x72, 0x5,
+ 0x76, 0x5, 0x7a, 0x5, 0x83, 0x5, 0x8c, 0x5,
+ 0x95, 0x5, 0x9e, 0x5, 0xa3, 0x5, 0xa8, 0x5,
+ 0xad, 0x5, 0xb2, 0x5, 0xb7, 0x5, 0xbb, 0x5,
+ 0xbf, 0x5, 0xc3, 0x5, 0xc7, 0x5, 0xcb, 0xf7,
+ 0x63, 0x4d, 0xa, 0x33, 0x6, 0xcc, 0xf7, 0xf,
+ 0x5, 0xf7, 0xaa, 0x6, 0xa3, 0xfb, 0xf, 0x2c,
+ 0xa, 0xf8, 0x93, 0x32, 0xa, 0x7a, 0xa, 0x4f,
+ 0x6, 0xf7, 0x6b, 0xf7, 0x45, 0x15, 0xf7, 0x40,
+ 0xf7, 0xbb, 0xca, 0xfb, 0xbb, 0x5, 0xb, 0x22,
+ 0xa, 0x13, 0xbe, 0x3a, 0xa, 0x13, 0x7e, 0x98,
+ 0xce, 0x15, 0x13, 0xbe, 0x2b, 0xa, 0x15, 0xf7,
+ 0x1e, 0x3c, 0xa, 0x37, 0x6, 0xbe, 0xf7, 0x9a,
+ 0x8c, 0x9b, 0x9a, 0x1a, 0xcb, 0x8a, 0x5e, 0xb2,
+ 0x22, 0x1b, 0x46, 0x36, 0x77, 0x72, 0x4b, 0x1f,
+ 0x39, 0xa, 0xa8, 0xe1, 0x9c, 0x33, 0x1f, 0x81,
+ 0x49, 0x5, 0x92, 0x5f, 0x5a, 0x92, 0x5a, 0x1b,
+ 0xfb, 0x51, 0x4c, 0x2c, 0x3f, 0x1f, 0xb, 0x15,
+ 0x20, 0xa, 0xe, 0x15, 0xdb, 0x6, 0x5a, 0xfb,
+ 0x91, 0x5, 0x88, 0x7e, 0x8c, 0x7f, 0x80, 0x1a,
+ 0x45, 0xc3, 0x67, 0xd6, 0xb2, 0xc1, 0x9a, 0xd5,
+ 0xe3, 0x1e, 0x13, 0x78, 0x7c, 0x3d, 0x5, 0xf7,
+ 0x1a, 0x36, 0xa, 0x3a, 0x6, 0xd3, 0xf8, 0x15,
+ 0x55, 0xa, 0x82, 0x53, 0x5, 0xdc, 0x6, 0x5e,
+ 0xfb, 0x77, 0x5, 0x13, 0xb8, 0x59, 0x5b, 0x4d,
+ 0x4b, 0x4c, 0x1b, 0x4e, 0x6c, 0xa8, 0xbe, 0x8a,
+ 0x1f, 0x96, 0x8c, 0x96, 0x8d, 0x98, 0x1e, 0xc0,
+ 0xf7, 0xae, 0x5, 0xfb, 0x1a, 0x6, 0xe, 0x15,
+ 0xfb, 0x15, 0xd7, 0x26, 0xf7, 0x1a, 0xf7, 0x4d,
+ 0xf7, 0x1c, 0xf7, 0x4d, 0xf7, 0x4f, 0xed, 0x5f,
+ 0xf7, 0x11, 0xfb, 0x35, 0xfb, 0x60, 0xfb, 0xe,
+ 0xfb, 0x5c, 0xfb, 0x39, 0x1e, 0xc2, 0x93, 0x15,
+ 0xf7, 0x2, 0xea, 0xf7, 0x55, 0xf7, 0x3c, 0xf7,
+ 0x1a, 0xa4, 0x20, 0x3a, 0xfb, 0x13, 0xfb, 0xf,
+ 0xfb, 0x40, 0xfb, 0x19, 0xfb, 0x1, 0x52, 0xdf,
+ 0xef, 0x1e, 0xe, 0x15, 0xdc, 0x6, 0x55, 0xfb,
+ 0xb5, 0x5, 0x85, 0x6b, 0x88, 0x6d, 0x70, 0x1a,
+ 0x30, 0xbd, 0x51, 0xf7, 0xc, 0xf7, 0x12, 0xe2,
+ 0xc1, 0xf7, 0x30, 0xa7, 0x1e, 0xc7, 0xf7, 0xd1,
+ 0x5, 0xd8, 0x3c, 0xa, 0xfb, 0x7b, 0x60, 0xa,
+ 0xf1, 0x6, 0x50, 0xfb, 0xca, 0x63, 0xa, 0x76,
+ 0x53, 0x54, 0x23, 0x1b, 0x32, 0x65, 0xb4, 0xdc,
+ 0x9d, 0x8e, 0x9e, 0x8f, 0xa0, 0x1f, 0xc3, 0xf7,
+ 0xb9, 0x5, 0xf4, 0x3c, 0xa, 0xfb, 0x82, 0x6,
+ 0xb, 0x15, 0xf8, 0x38, 0x89, 0x5, 0x8f, 0xa1,
+ 0x8f, 0xaa, 0xa0, 0x1a, 0xe8, 0x51, 0xe0, 0xfb,
+ 0x1c, 0xfb, 0x34, 0xfb, 0x1e, 0xfb, 0x9, 0xfb,
+ 0x48, 0x2c, 0xc5, 0x41, 0xf7, 0x2c, 0xe0, 0xe5,
+ 0xa8, 0xb0, 0xd5, 0x1e, 0x84, 0xc1, 0x5, 0x5e,
+ 0x32, 0x37, 0x77, 0x5a, 0x1b, 0x44, 0x26, 0xa1,
+ 0xe3, 0x9b, 0x8b, 0x9c, 0x91, 0x9d, 0x1f, 0x9b,
+ 0xc3, 0x15, 0xc6, 0xa0, 0xd0, 0xd9, 0xf7, 0x9,
+ 0x1b, 0xf7, 0x22, 0x8f, 0xfb, 0x4, 0x72, 0x1f,
+ 0xe, 0xf8, 0x85, 0x6, 0xb1, 0xf7, 0x51, 0x71,
+ 0xa, 0x70, 0xfb, 0x1b, 0x5, 0xfb, 0xc5, 0x6,
+ 0xb4, 0xf7, 0x5d, 0x5, 0xf7, 0x39, 0x6, 0x7b,
+ 0x39, 0x51, 0xa, 0xb8, 0xf7, 0x6f, 0x62, 0xa,
+ 0x7a, 0x38, 0x5, 0xfb, 0x38, 0x6, 0xb3, 0xf7,
+ 0x5e, 0x81, 0xa, 0x71, 0xfb, 0x1b, 0x5, 0xc4,
+ 0x6, 0xb1, 0xf7, 0x51, 0x5, 0xfc, 0x83, 0x45,
+ 0xa, 0xdf, 0x6, 0x2f, 0xfc, 0x5d, 0x6b, 0xa,
+ 0xb, 0x15, 0x20, 0xd7, 0x43, 0xf7, 0x15, 0xf7,
+ 0x38, 0xf7, 0x9, 0xf7, 0x14, 0xf7, 0x2e, 0xdf,
+ 0x5b, 0xec, 0xfb, 0x2a, 0xfb, 0x2b, 0xfb, 0x1d,
+ 0xfb, 0x9, 0xfb, 0x3b, 0x1e, 0xc9, 0x9a, 0x15,
+ 0xf5, 0xe8, 0xf6, 0xf7, 0xe, 0xf7, 0x16, 0x9d,
+ 0x34, 0x4f, 0x28, 0x2c, 0x21, 0xfb, 0x9, 0xfb,
+ 0x7, 0x67, 0xcc, 0xd5, 0x1e, 0xb, 0x6, 0x96,
+ 0xc1, 0x5, 0xb, 0x4e, 0x4b, 0x3e, 0x5c, 0x38,
+ 0x1b, 0x57, 0x64, 0xa8, 0xab, 0xed, 0xf7, 0x1d,
+ 0x97, 0xc6, 0x40, 0xa, 0x5, 0x2b, 0x2d, 0xa,
+ 0xf7, 0x60, 0x2a, 0xa, 0x57, 0x6, 0x21, 0xb,
+ 0x6, 0x80, 0x55, 0x5, 0xb, 0x15, 0x52, 0xb2,
+ 0x5e, 0xcf, 0xdf, 0xd4, 0xd3, 0xdb, 0xc1, 0x6c,
+ 0xb7, 0x3d, 0x38, 0x43, 0x42, 0x40, 0x1e, 0xc4,
+ 0x92, 0x15, 0xbc, 0xb3, 0xb1, 0xbe, 0xb3, 0x9e,
+ 0x73, 0x6c, 0x61, 0x6a, 0x5f, 0x55, 0x66, 0x71,
+ 0x9f, 0xad, 0x1e, 0xb, 0x44, 0xa, 0xf8, 0x5c,
+ 0x37, 0xa, 0xfc, 0x5c, 0x5, 0xfb, 0x45, 0x6,
+ 0xb, 0xad, 0x71, 0x53, 0xb4, 0x3c, 0x1b, 0xfb,
+ 0x33, 0xfb, 0x9, 0xfb, 0x9, 0x22, 0x39, 0xc1,
+ 0x3b, 0xf7, 0x21, 0xcc, 0xd6, 0x98, 0xb8, 0xbd,
+ 0x1f, 0x78, 0x20, 0x5, 0x34, 0x79, 0x52, 0x6f,
+ 0xfb, 0xb, 0x1b, 0x48, 0x4b, 0x9c, 0x96, 0x59,
+ 0x1f, 0xcc, 0xf7, 0xc1, 0x15, 0xee, 0xf7, 0x1,
+ 0xd0, 0xf0, 0xf7, 0x6, 0xab, 0x4c, 0x4b, 0x2c,
+ 0x25, 0x4f, 0x23, 0x31, 0x4f, 0xbd, 0xcb, 0x1e,
+ 0xb, 0xf7, 0xc9, 0x2a, 0xa, 0xfb, 0x12, 0x6,
+ 0xad, 0xf7, 0x43, 0xf7, 0x7e, 0xf7, 0xae, 0x5,
+ 0xce, 0x2a, 0xa, 0xfb, 0x5a, 0x2d, 0xa, 0xd1,
+ 0x6, 0xfb, 0x52, 0xfb, 0x78, 0x26, 0xf7, 0x78,
+ 0x5, 0xd2, 0x43, 0xa, 0xd1, 0x6, 0xf7, 0x10,
+ 0xfb, 0xae, 0x69, 0xfb, 0x43, 0x5, 0xfb, 0x12,
+ 0x6, 0xb, 0x5, 0xfb, 0x82, 0x2d, 0xa, 0x86,
+ 0xa, 0xfb, 0x9d, 0xb, 0x15, 0x69, 0xa, 0xf7,
+ 0x3b, 0x6, 0xc8, 0xf7, 0xdb, 0x5, 0xfb, 0x1b,
+ 0x77, 0xa, 0xf7, 0x4f, 0x6, 0x44, 0xfc, 0x12,
+ 0x5, 0xf7, 0x3a, 0x56, 0xa, 0xe, 0xf7, 0xb5,
+ 0xf7, 0x5e, 0x15, 0xf7, 0x37, 0x6, 0x72, 0xfb,
+ 0x18, 0x5, 0x76, 0x46, 0x64, 0x7f, 0x54, 0x1b,
+ 0xfb, 0x18, 0x53, 0xd8, 0xeb, 0xf7, 0x74, 0xf7,
+ 0x2a, 0xe6, 0xf7, 0x7, 0xd0, 0xc0, 0x68, 0x5b,
+ 0xae, 0x1f, 0x7c, 0x3f, 0x51, 0xa, 0xb5, 0xf7,
+ 0x6a, 0x52, 0xa, 0x7e, 0x49, 0x5, 0xb, 0x15,
+ 0x71, 0xa3, 0x73, 0xb1, 0xb2, 0xb6, 0xa9, 0xb3,
+ 0xa8, 0x75, 0xa4, 0x67, 0x60, 0x60, 0x69, 0x63,
+ 0x1e, 0xb, 0x6, 0x96, 0xc2, 0x5, 0xb, 0x5,
+ 0xf7, 0x41, 0x46, 0xa, 0xfc, 0x2b, 0x38, 0xa,
+ 0xf7, 0x42, 0x6, 0x2c, 0xb, 0x6, 0x80, 0x54,
+ 0x5, 0xb, 0x8f, 0x55, 0x5, 0x9a, 0xae, 0xe4,
+ 0xa6, 0xd0, 0x1b, 0xb, 0x51, 0xb9, 0x54, 0xe7,
+ 0xd8, 0xda, 0xb6, 0xc1, 0xcd, 0x1e, 0xb, 0x7c,
+ 0xc3, 0x5f, 0xc3, 0xf7, 0x33, 0xc4, 0xf7, 0xf,
+ 0xc4, 0xb, 0x6, 0x96, 0xc3, 0x5, 0xb, 0xb4,
+ 0x62, 0x4d, 0xa4, 0x46, 0x1b, 0xfb, 0x3f, 0xfb,
+ 0x2b, 0xfb, 0x24, 0xfb, 0x7c, 0xfb, 0x8, 0xce,
+ 0x21, 0xf7, 0x3d, 0xd4, 0xd9, 0x9f, 0xa5, 0xcf,
+ 0x1f, 0xac, 0xf7, 0x42, 0x5, 0xbf, 0x36, 0xa,
+ 0xfb, 0xa2, 0x6, 0xb, 0x8b, 0xc1, 0xf8, 0x5a,
+ 0xc1, 0x1, 0xb, 0xa2, 0x3c, 0x15, 0x76, 0x59,
+ 0x5, 0x80, 0xbd, 0xdc, 0x7a, 0xdd, 0x1b, 0xf7,
+ 0x10, 0xe3, 0xbf, 0xf0, 0xa2, 0x1f, 0xd9, 0xf8,
+ 0x12, 0x5, 0xc7, 0x6, 0x95, 0xbe, 0x5, 0xfb,
+ 0x6, 0x6, 0x7c, 0x4c, 0x5, 0xb, 0xb8, 0xb5,
+ 0x85, 0x84, 0xb5, 0x1f, 0xe, 0x70, 0xa0, 0x71,
+ 0xae, 0xb0, 0xaf, 0xab, 0xb4, 0xaa, 0x73, 0xa1,
+ 0x6c, 0x65, 0x67, 0x68, 0x65, 0x1e, 0xb, 0xf3,
+ 0xef, 0xb4, 0xc8, 0xc0, 0xbd, 0x75, 0x59, 0x9b,
+ 0x1e, 0xc2, 0x9c, 0x5, 0xc3, 0x79, 0x6d, 0xc4,
+ 0xfb, 0x9, 0x1b, 0xfb, 0xc, 0x23, 0x32, 0x27,
+ 0x1f, 0x8a, 0xb, 0x2a, 0xa, 0xfb, 0x5f, 0x2d,
+ 0xa, 0xb, 0xf8, 0x2f, 0x6, 0x98, 0xc1, 0x5,
+ 0xfb, 0x45, 0x6, 0xea, 0xb, 0x6, 0x7f, 0x55,
+ 0x5, 0xb, 0x6, 0x97, 0xc2, 0x5, 0xb, 0x6,
+ 0x97, 0xc1, 0x5, 0xb, 0x15, 0xd9, 0x6, 0xf7,
+ 0x40, 0xf7, 0x33, 0x65, 0x9d, 0xfb, 0x33, 0xfb,
+ 0xb, 0xfb, 0x11, 0xf7, 0xc, 0x5f, 0x78, 0x5,
+ 0xe, 0x1, 0xc4, 0xc9, 0xf7, 0xff, 0xc8, 0x3,
+ 0xb, 0x12, 0xba, 0xc5, 0xf7, 0xee, 0xc4, 0xb,
+ 0x3b, 0xa, 0xf7, 0x73, 0x77, 0x4a, 0xa, 0x13,
+ 0x7e, 0xb, 0x15, 0xdb, 0x6, 0xf7, 0x46, 0xf7,
+ 0x33, 0x65, 0x9f, 0xfb, 0x3d, 0xfb, 0xf, 0xfb,
+ 0x12, 0xf7, 0xe, 0x5f, 0x77, 0x5, 0xb, 0x6,
+ 0x95, 0xc1, 0x5, 0xb, 0x7c, 0xc1, 0x60, 0xc2,
+ 0xf7, 0xdd, 0xc3, 0xb, 0xf7, 0x63, 0xf7, 0x4a,
+ 0xf7, 0x60, 0x3, 0xb, 0x1, 0xe7, 0xbf, 0xf7,
+ 0xc4, 0xbf, 0x3, 0xb, 0x5, 0xc3, 0x6, 0xb,
+ 0x5, 0x54, 0x6, 0xb, 0x1b, 0xb7, 0xb9, 0x9d,
+ 0xa7, 0xb1, 0x1f, 0x7d, 0xb8, 0x5, 0x7f, 0x77,
+ 0x53, 0x76, 0x67, 0x1b, 0xb, 0x15, 0xda, 0x6,
+ 0xa5, 0xf7, 0xa, 0x5, 0x3d, 0x6, 0xb, 0x5,
+ 0xfb, 0x1b, 0x6, 0xb, 0x6, 0x7f, 0x54, 0x5,
+ 0xb, 0x63, 0xa, 0x6, 0xb, 0xfc, 0x5a, 0x5,
+ 0xb, 0x70, 0xa, 0xf7, 0x78, 0x77, 0x50, 0xa,
+ 0xb, 0x5d, 0xa, 0xf7, 0x74, 0x77, 0x49, 0xa,
+ 0xb, 0x8b, 0x61, 0xa, 0xf7, 0x5e, 0xc1, 0xb,
+ 0x6, 0xa4, 0x88, 0xa, 0xb, 0x7c, 0xc2, 0xf7,
+ 0xf4, 0xc3, 0xb, 0x6, 0x30, 0x58, 0xa, 0xb,
+ 0x6, 0x81, 0x55, 0x5, 0xb, 0x6, 0x80, 0x53,
+ 0x5, 0xb, 0xc1, 0xf7, 0x5d, 0xc1, 0xb, 0x5,
+ 0x52, 0x6, 0xb, 0x5, 0xfb, 0x0, 0xb, 0xf7,
+ 0x7e, 0x5, 0xb, 0xf8, 0x9a, 0x76, 0xf7, 0x43,
+ 0x77, 0x1, 0xb, 0x5, 0xfb, 0x21, 0x38, 0xa,
+ 0xb, 0x6, 0x81, 0x54, 0x5, 0xb, 0x6, 0x81,
+ 0x56, 0x5, 0xb, 0x95, 0xc2, 0x5, 0xb, 0x5,
+ 0xc2, 0x6, 0xb, 0x5, 0x39, 0x6, 0xb, 0x15,
+ 0x74, 0x97, 0x76, 0xa4, 0xa6, 0xa5, 0xa8, 0xa9,
+ 0xa1, 0x7d, 0xb, 0x15, 0x57, 0xb4, 0x5b, 0xcd,
+ 0xdf, 0xd1, 0xd3, 0xdd, 0xbd, 0x69, 0xb, 0x6,
+ 0xa4, 0xf7, 0x7, 0x5, 0xb, 0x8b, 0xc2, 0xf7,
+ 0xdb, 0xc2, 0xb, 0x79, 0xc1, 0xf8, 0x6d, 0xc3,
+ 0xb, 0x5, 0x53, 0x6, 0xb, 0x71, 0x5f, 0x6c,
+ 0x61, 0x55, 0x68, 0x71, 0xa1, 0xa9, 0x1e, 0xb,
+ 0xf7, 0x1c, 0x76, 0xf7, 0x32, 0xbd, 0xf7, 0x34,
+ 0x77, 0x1, 0xb, 0x77, 0x1, 0xf7, 0xa, 0xc6,
+ 0xf2, 0xc7, 0x3, 0xf7, 0xac, 0xb, 0x6, 0xf7,
+ 0x29, 0x64, 0xa, 0x2f, 0x6, 0xe, 0x6, 0x94,
+ 0xc1, 0x5, 0xb, 0x6, 0x69, 0xa, 0xb, 0x6,
+ 0x96, 0xbe, 0x5, 0xb, 0xf7, 0x24, 0x5, 0xe,
+ 0xfc, 0x5d, 0x5, 0xb, 0x5, 0x38, 0x6, 0xb,
+ 0xe2, 0xdd, 0x9b, 0x1f, 0xd1, 0xf7, 0xf8, 0x5,
+ 0xb, 0x77, 0x1, 0xad, 0xc1, 0xf8, 0x3a, 0xc2,
+ 0x3, 0xb, 0x8b, 0xbe, 0xf7, 0x12, 0xc1, 0xf7,
+ 0xac, 0xc1, 0xb, 0xf7, 0x1d, 0xc4, 0xf7, 0x71,
+ 0x77, 0x1, 0xc1, 0xb, 0x6, 0x96, 0xc0, 0x5,
+ 0xb, 0x5, 0xf7, 0xbe, 0x6, 0xb, 0x6, 0x80,
+ 0x57, 0x5, 0xb, 0x5, 0xfb, 0x18, 0x6, 0xb,
+ 0xf7, 0x78, 0x77, 0x1, 0xb, 0x15, 0xdd, 0x6,
+ 0xb, 0xf7, 0x1f, 0x6, 0xb, 0xf8, 0x5a, 0x5,
+ 0xb, 0xf7, 0x8, 0x5, 0xb, 0x5, 0x3b, 0x6,
+ 0xb
+ };
diff --git a/core/src/fxge/fontdata/chromefontdata/FoxitSans.c b/core/src/fxge/fontdata/chromefontdata/FoxitSans.c
new file mode 100644
index 0000000000..cd87d2b5ba
--- /dev/null
+++ b/core/src/fxge/fontdata/chromefontdata/FoxitSans.c
@@ -0,0 +1,1886 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+const unsigned char g_FoxitSansFontData [15025] = {0x1,
+ 0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0xd,
+ 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x53, 0x61, 0x6e,
+ 0x73, 0x4f, 0x54, 0x46, 0x0, 0x1, 0x1, 0x1,
+ 0x24, 0xf8, 0x10, 0x0, 0xf8, 0x1c, 0x1, 0xf8,
+ 0x1d, 0x2, 0xf8, 0x1d, 0x3, 0xf8, 0x18, 0x4,
+ 0xfb, 0x3a, 0xfb, 0x75, 0xfa, 0x7c, 0xfa, 0x45,
+ 0x5, 0xf7, 0x16, 0xf, 0xf8, 0xe1, 0x11, 0xab,
+ 0x1c, 0x34, 0xa2, 0x12, 0x0, 0x3, 0x1, 0x1,
+ 0x5, 0x2f, 0x3d, 0x45, 0x75, 0x72, 0x6f, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x20, 0x53,
+ 0x61, 0x6e, 0x73, 0x20, 0x4f, 0x54, 0x46, 0x0,
+ 0x0, 0x0, 0x0, 0x22, 0x0, 0x8a, 0x0, 0xab,
+ 0x0, 0xac, 0x0, 0xad, 0x0, 0xae, 0x0, 0xaf,
+ 0x0, 0xb0, 0x0, 0x23, 0x0, 0x24, 0x0, 0xb1,
+ 0x0, 0x25, 0x0, 0x26, 0x0, 0xb2, 0x0, 0xb3,
+ 0x0, 0xb4, 0x0, 0xb5, 0x0, 0x9a, 0x1, 0x87,
+ 0x0, 0x27, 0x0, 0x28, 0x0, 0x29, 0x0, 0x2a,
+ 0x0, 0xb6, 0x0, 0xb7, 0x0, 0xb8, 0x0, 0xb9,
+ 0x0, 0x2b, 0x0, 0x2c, 0x0, 0x2d, 0x0, 0x8c,
+ 0x0, 0x2e, 0x0, 0x2f, 0x0, 0xba, 0x0, 0x30,
+ 0x0, 0x8e, 0x0, 0xbb, 0x0, 0xbc, 0x0, 0xbd,
+ 0x0, 0xbe, 0x0, 0x8d, 0x0, 0xbf, 0x0, 0x31,
+ 0x0, 0x32, 0x0, 0x33, 0x0, 0x34, 0x0, 0xc0,
+ 0x0, 0x35, 0x0, 0x9d, 0x0, 0x36, 0x0, 0xc1,
+ 0x0, 0xc2, 0x0, 0xc3, 0x0, 0xc4, 0x0, 0x37,
+ 0x0, 0x38, 0x0, 0x39, 0x0, 0x3a, 0x0, 0xc5,
+ 0x0, 0xc6, 0x0, 0x3b, 0x0, 0xc7, 0x0, 0x42,
+ 0x0, 0xc8, 0x0, 0xc9, 0x0, 0x7d, 0x0, 0xca,
+ 0x0, 0x90, 0x0, 0xcb, 0x0, 0x7, 0x0, 0xcc,
+ 0x0, 0x3f, 0x0, 0x5f, 0x0, 0xb, 0x0, 0x21,
+ 0x0, 0xcd, 0x0, 0x43, 0x0, 0x3d, 0x0, 0x5d,
+ 0x0, 0x5c, 0x0, 0x5e, 0x0, 0x3c, 0x0, 0x3e,
+ 0x0, 0x81, 0x0, 0xa0, 0x0, 0x74, 0x0, 0x44,
+ 0x0, 0x88, 0x0, 0xce, 0x0, 0x85, 0x0, 0x61,
+ 0x0, 0x7e, 0x0, 0x1b, 0x0, 0xd, 0x0, 0xaa,
+ 0x0, 0x67, 0x0, 0x45, 0x0, 0x70, 0x0, 0x71,
+ 0x0, 0xa1, 0x0, 0x83, 0x0, 0x9f, 0x0, 0x5,
+ 0x0, 0x82, 0x0, 0x91, 0x0, 0x46, 0x0, 0xcf,
+ 0x0, 0xd0, 0x0, 0xd1, 0x0, 0xd2, 0x0, 0x19,
+ 0x0, 0x79, 0x0, 0x89, 0x0, 0x6f, 0x0, 0x1e,
+ 0x0, 0xa7, 0x0, 0x2, 0x0, 0x60, 0x0, 0x47,
+ 0x0, 0x6d, 0x0, 0x16, 0x0, 0x6e, 0x0, 0x65,
+ 0x0, 0x15, 0x0, 0x63, 0x0, 0x48, 0x0, 0x95,
+ 0x0, 0x7c, 0x0, 0x1f, 0x0, 0x6a, 0x0, 0x78,
+ 0x0, 0x6b, 0x0, 0x6c, 0x0, 0x49, 0x0, 0x86,
+ 0x0, 0xe, 0x0, 0x4a, 0x0, 0xd3, 0x0, 0xd4,
+ 0x0, 0xd5, 0x0, 0xd6, 0x0, 0x4b, 0x0, 0x4c,
+ 0x0, 0x4d, 0x0, 0x1d, 0x0, 0x97, 0x0, 0x92,
+ 0x0, 0x4e, 0x0, 0x80, 0x0, 0xa6, 0x0, 0x98,
+ 0x0, 0xa8, 0x0, 0x4f, 0x0, 0x1a, 0x0, 0xd7,
+ 0x0, 0x4, 0x0, 0x50, 0x0, 0xd8, 0x0, 0xd9,
+ 0x0, 0xda, 0x0, 0x94, 0x0, 0x87, 0x0, 0xdb,
+ 0x0, 0x12, 0x0, 0x9b, 0x0, 0x9e, 0x0, 0x96,
+ 0x0, 0x8b, 0x0, 0x8f, 0x0, 0x93, 0x0, 0xdc,
+ 0x0, 0x51, 0x0, 0x73, 0x0, 0x9, 0x0, 0xa,
+ 0x0, 0x6, 0x0, 0xf, 0x0, 0x72, 0x0, 0x7a,
+ 0x0, 0xc, 0x0, 0x9c, 0x0, 0x52, 0x0, 0x20,
+ 0x0, 0x7b, 0x0, 0x3, 0x0, 0x76, 0x0, 0x69,
+ 0x0, 0x77, 0x0, 0x41, 0x0, 0x8, 0x0, 0x75,
+ 0x0, 0x68, 0x0, 0x53, 0x0, 0xa5, 0x0, 0x84,
+ 0x0, 0x54, 0x0, 0xdd, 0x0, 0x66, 0x0, 0x1c,
+ 0x0, 0x18, 0x0, 0x17, 0x0, 0x10, 0x0, 0x1,
+ 0x0, 0x62, 0x0, 0x55, 0x0, 0xa2, 0x0, 0x14,
+ 0x0, 0xa3, 0x0, 0xa9, 0x0, 0x7f, 0x0, 0x99,
+ 0x0, 0x13, 0x0, 0xa4, 0x0, 0x56, 0x0, 0xde,
+ 0x0, 0xdf, 0x0, 0xe0, 0x0, 0xe1, 0x0, 0x40,
+ 0x0, 0x57, 0x0, 0x58, 0x0, 0x59, 0x0, 0x5a,
+ 0x0, 0xe2, 0x0, 0xe3, 0x0, 0x64, 0x0, 0x5b,
+ 0x0, 0xe4, 0x0, 0x11, 0x0, 0xe6, 0x2, 0x0,
+ 0x1, 0x0, 0x4, 0x0, 0x36, 0x0, 0x75, 0x0,
+ 0x8a, 0x0, 0xa2, 0x0, 0xc2, 0x0, 0xd3, 0x1,
+ 0x4, 0x1, 0x32, 0x1, 0x92, 0x1, 0xe1, 0x2,
+ 0x5b, 0x2, 0x9d, 0x2, 0xc0, 0x2, 0xcd, 0x2,
+ 0xd9, 0x2, 0xeb, 0x2, 0xfc, 0x3, 0x47, 0x3,
+ 0xc2, 0x3, 0xe1, 0x4, 0x42, 0x4, 0x68, 0x4,
+ 0x77, 0x4, 0x87, 0x4, 0xa4, 0x4, 0xbf, 0x4,
+ 0xd0, 0x5, 0x1, 0x5, 0x2f, 0x5, 0x44, 0x5,
+ 0x71, 0x5, 0xa7, 0x5, 0xcc, 0x6, 0x16, 0x6,
+ 0x68, 0x6, 0xd7, 0x6, 0xe8, 0x6, 0xf9, 0x7,
+ 0x8, 0x7, 0x21, 0x7, 0xa4, 0x7, 0xdf, 0x8,
+ 0x1c, 0x8, 0x98, 0x8, 0xf0, 0x9, 0x58, 0x9,
+ 0xc6, 0x9, 0xe1, 0xa, 0x25, 0xa, 0x58, 0xa,
+ 0x60, 0xa, 0x67, 0xa, 0x74, 0xa, 0x7b, 0xa,
+ 0x96, 0xa, 0xcf, 0xb, 0x3, 0xb, 0x2a, 0xb,
+ 0x4e, 0xb, 0x76, 0xb, 0x90, 0xb, 0xb2, 0xc,
+ 0x31, 0xc, 0x40, 0xc, 0x4e, 0xc, 0x5c, 0xc,
+ 0x6a, 0xd, 0x12, 0xd, 0x37, 0xd, 0xcd, 0xe,
+ 0xa, 0xe, 0x2c, 0xe, 0x74, 0xe, 0xc8, 0xf,
+ 0x7c, 0xf, 0xb4, 0x10, 0xb, 0x10, 0x21, 0x10,
+ 0x37, 0x10, 0x85, 0x10, 0xd3, 0x10, 0xf1, 0x11,
+ 0xe, 0x11, 0x32, 0x11, 0x4f, 0x11, 0x70, 0x11,
+ 0xba, 0x11, 0xd1, 0x12, 0x42, 0x12, 0x76, 0x12,
+ 0xed, 0x13, 0x3, 0x13, 0x1c, 0x13, 0x40, 0x13,
+ 0xd1, 0x14, 0x41, 0x14, 0x90, 0x14, 0xb4, 0x14,
+ 0xe5, 0x15, 0x1d, 0x15, 0x39, 0x15, 0x62, 0x15,
+ 0xe9, 0x15, 0xfd, 0x16, 0xb, 0x16, 0x5c, 0x16,
+ 0x6f, 0x16, 0x81, 0x16, 0xcb, 0x16, 0xe6, 0x17,
+ 0x5a, 0x17, 0x81, 0x17, 0x91, 0x17, 0x9f, 0x17,
+ 0xbb, 0x18, 0x2e, 0x18, 0x56, 0x18, 0x7e, 0x18,
+ 0xae, 0x18, 0xc2, 0x19, 0x15, 0x19, 0x25, 0x19,
+ 0x87, 0x19, 0xb7, 0x19, 0xcf, 0x1a, 0x40, 0x1a,
+ 0xa3, 0x1a, 0xba, 0x1a, 0xd6, 0x1b, 0x8, 0x1b,
+ 0x3a, 0x1b, 0x54, 0x1b, 0x6e, 0x1b, 0xa4, 0x1b,
+ 0xb8, 0x1b, 0xc9, 0x1b, 0xe0, 0x1b, 0xf1, 0x1c,
+ 0xe, 0x1c, 0x29, 0x1c, 0x3a, 0x1c, 0x6b, 0x1c,
+ 0x92, 0x1c, 0x9a, 0x1c, 0xb7, 0x1c, 0xcb, 0x1c,
+ 0xe9, 0x1d, 0x3b, 0x1d, 0x4c, 0x1d, 0x58, 0x1d,
+ 0x9b, 0x1d, 0xd1, 0x1e, 0x1, 0x1e, 0x62, 0x1e,
+ 0xd1, 0x1f, 0x38, 0x1f, 0x7d, 0x1f, 0x8f, 0x1f,
+ 0xa1, 0x1f, 0xb5, 0x20, 0x40, 0x20, 0x73, 0x20,
+ 0x8c, 0x20, 0xb0, 0x21, 0x2d, 0x21, 0x85, 0x21,
+ 0xad, 0x22, 0x24, 0x22, 0x66, 0x22, 0xdf, 0x23,
+ 0x25, 0x23, 0x6e, 0x23, 0x9e, 0x23, 0xd2, 0x24,
+ 0x8, 0x24, 0x9d, 0x24, 0xac, 0x24, 0xc3, 0x25,
+ 0x37, 0x25, 0x59, 0x25, 0x89, 0x25, 0xd3, 0x26,
+ 0x29, 0x26, 0x7f, 0x26, 0x9a, 0x26, 0xb5, 0x26,
+ 0xd1, 0x26, 0xf2, 0x27, 0x16, 0x27, 0x38, 0x27,
+ 0x5a, 0x27, 0x77, 0x27, 0xa8, 0x28, 0x45, 0x28,
+ 0x7d, 0x28, 0xd4, 0x29, 0x32, 0x29, 0xcd, 0x29,
+ 0xf8, 0x2a, 0x24, 0x2a, 0x87, 0x2a, 0x9d, 0x2a,
+ 0xa0, 0x2b, 0x31, 0x2b, 0x6b, 0x2b, 0xc2, 0x2c,
+ 0x21, 0x2c, 0xba, 0x2d, 0x14, 0x2d, 0x50, 0x2d,
+ 0x9d, 0x2d, 0xeb, 0x2e, 0x36, 0x2e, 0x6b, 0x2e,
+ 0x7a, 0x2e, 0x88, 0x2e, 0xbc, 0x2e, 0xd8, 0x2e,
+ 0xe4, 0x2f, 0x0, 0x2f, 0x33, 0x2f, 0x62, 0x2f,
+ 0xa0, 0x2f, 0xb3, 0x2f, 0xcb, 0x30, 0x12, 0x30,
+ 0x23, 0x30, 0x3c, 0x30, 0x85, 0xfc, 0x31, 0xe,
+ 0x5f, 0xa, 0xf7, 0x70, 0xd6, 0xf8, 0x3b, 0x77,
+ 0x1, 0x99, 0x16, 0xea, 0x6, 0xd8, 0xf7, 0x70,
+ 0x5, 0xf7, 0xb2, 0x6, 0xdb, 0xfb, 0x70, 0x5,
+ 0xf1, 0x6, 0xfb, 0xaa, 0xf9, 0x62, 0x5, 0x28,
+ 0x6, 0x49, 0xfc, 0x3b, 0x15, 0xf7, 0x4, 0xf7,
+ 0xef, 0x5, 0x8d, 0x6, 0xf7, 0xb, 0xfb, 0xef,
+ 0x5, 0xe, 0xf7, 0xc9, 0x8b, 0xdf, 0xf7, 0xf,
+ 0xdf, 0xaf, 0xdf, 0xf7, 0x72, 0xe0, 0x1, 0xf8,
+ 0x78, 0xea, 0x3, 0x93, 0x16, 0xf2, 0x6, 0xec,
+ 0xf7, 0x63, 0x5, 0xf7, 0xa8, 0xfb, 0x63, 0xf8,
+ 0x67, 0xdf, 0xfc, 0x8, 0xf7, 0x87, 0xf7, 0xdf,
+ 0xdf, 0xfb, 0xdf, 0xf7, 0x72, 0xf8, 0x7, 0xe0,
+ 0xfc, 0xea, 0x6, 0x23, 0xfc, 0x3f, 0x15, 0xf7,
+ 0x39, 0xf7, 0xea, 0x5, 0xd2, 0xfb, 0xea, 0x6,
+ 0xe, 0x46, 0xa, 0xf8, 0x7f, 0xf7, 0x19, 0x1,
+ 0x27, 0xa, 0xfb, 0x44, 0xf8, 0x7f, 0x4c, 0xa,
+ 0xf7, 0x0, 0xf7, 0x19, 0x59, 0xa, 0x35, 0xa,
+ 0xfb, 0x9d, 0xf8, 0x7f, 0x15, 0xef, 0x6, 0xc3,
+ 0xda, 0xc0, 0x3c, 0x5, 0xef, 0x6, 0xfb, 0x2,
+ 0xf7, 0x19, 0x5, 0x2e, 0x6, 0xe, 0x46, 0xa,
+ 0xf8, 0x86, 0xed, 0x1, 0xf7, 0x5a, 0xe5, 0xe6,
+ 0xe5, 0x3, 0x27, 0xa, 0xfb, 0x8a, 0xf8, 0x86,
+ 0x15, 0xe5, 0xed, 0x31, 0x6, 0xf7, 0x49, 0x29,
+ 0x15, 0xe5, 0xed, 0x31, 0x6, 0xe, 0x35, 0xa,
+ 0xfb, 0x11, 0xf8, 0x7a, 0x15, 0xd0, 0x6, 0x4c,
+ 0xf7, 0x1e, 0x5, 0xfb, 0x1, 0x6, 0xe, 0x46,
+ 0xa, 0xf8, 0x65, 0xaf, 0xf2, 0xaf, 0x1, 0xf7,
+ 0x85, 0xaf, 0xf3, 0xaf, 0x3, 0x27, 0xa, 0xfb,
+ 0x5f, 0xf8, 0xbe, 0x64, 0xa, 0xaf, 0x5a, 0x5a,
+ 0x65, 0x67, 0x5a, 0x1e, 0xaf, 0x16, 0xa5, 0xa1,
+ 0xa3, 0xa9, 0xa9, 0xa1, 0x75, 0x6f, 0x6e, 0x74,
+ 0x73, 0x6e, 0x70, 0x72, 0xa0, 0xab, 0x1e, 0xe,
+ 0x46, 0xa, 0xf8, 0x87, 0x75, 0xa, 0x13, 0xe0,
+ 0x27, 0xa, 0xfb, 0xa6, 0xf8, 0x87, 0x6b, 0xa,
+ 0xa3, 0xa2, 0x80, 0x7f, 0xa1, 0x1f, 0x80, 0xa0,
+ 0x9f, 0x7f, 0x53, 0xa, 0x7e, 0x7b, 0x92, 0x93,
+ 0x79, 0x1f, 0x13, 0xd0, 0x97, 0x72, 0x70, 0x99,
+ 0x6d, 0x1b, 0x13, 0xe0, 0x73, 0xa, 0x73, 0x8b,
+ 0xe0, 0xf7, 0x8a, 0xe0, 0xf7, 0x6d, 0xe0, 0x1,
+ 0xd5, 0xea, 0xf7, 0xd2, 0xe8, 0x3, 0xd5, 0x16,
+ 0xf7, 0x82, 0x6, 0xf7, 0x18, 0xf7, 0x4b, 0xa5,
+ 0xf7, 0x4a, 0xc3, 0x67, 0xdf, 0xfb, 0x2, 0xac,
+ 0x1f, 0xe8, 0xba, 0x91, 0xce, 0xa5, 0x1a, 0xf7,
+ 0x32, 0xfb, 0x26, 0xb2, 0xfb, 0xe, 0x1e, 0xfb,
+ 0x82, 0x6, 0xea, 0xfd, 0xd, 0x15, 0xf7, 0x8a,
+ 0xf7, 0x23, 0x7, 0xc5, 0xf7, 0x33, 0x8b, 0xfb,
+ 0xf, 0xfb, 0x10, 0xfb, 0x3b, 0x8c, 0x59, 0x1f,
+ 0xfb, 0x23, 0xf7, 0xdf, 0x15, 0xf7, 0x6d, 0xf7,
+ 0x23, 0x7, 0xda, 0xeb, 0x89, 0xfb, 0x2, 0x21,
+ 0xfb, 0x4, 0x8c, 0x4c, 0x1f, 0xe, 0xaa, 0x78,
+ 0xde, 0xf8, 0xe2, 0xde, 0x1, 0xc3, 0xee, 0x3,
+ 0xf8, 0xde, 0xf7, 0x8d, 0x15, 0x32, 0x78, 0x53,
+ 0x2b, 0xfb, 0x1d, 0x1b, 0xfb, 0x40, 0x50, 0xf7,
+ 0x47, 0xf7, 0xc, 0xf7, 0xa, 0xab, 0xf7, 0x41,
+ 0xf7, 0x5b, 0xf7, 0x19, 0xbc, 0x2c, 0x50, 0x9e,
+ 0x1f, 0xe9, 0xa1, 0x5, 0xf7, 0x2b, 0x60, 0xfb,
+ 0xf, 0xcb, 0xfb, 0x15, 0x1b, 0xfb, 0x45, 0xfb,
+ 0x2d, 0xfb, 0x8, 0xfb, 0x96, 0xfb, 0x57, 0xe1,
+ 0xfb, 0x4f, 0xf7, 0x88, 0xd9, 0xf7, 0x41, 0xa2,
+ 0xf7, 0x70, 0xc3, 0x1f, 0xe, 0xaa, 0xfb, 0x60,
+ 0x76, 0xf7, 0x67, 0xda, 0xf8, 0xe1, 0xde, 0x1,
+ 0xb7, 0xee, 0xf7, 0x85, 0xe1, 0x3, 0xf7, 0xda,
+ 0x7d, 0x15, 0x72, 0x3f, 0x5, 0xbf, 0x8a, 0xaa,
+ 0x80, 0x70, 0x1a, 0x65, 0xfb, 0x7, 0x91, 0x78,
+ 0x8a, 0x1e, 0x87, 0x4c, 0x5, 0xf7, 0x2d, 0xd2,
+ 0x9e, 0xd8, 0xae, 0x75, 0xb0, 0x4e, 0x92, 0x1f,
+ 0x91, 0xac, 0x5, 0xf7, 0x1e, 0xf7, 0x0, 0xd8,
+ 0xf7, 0x3a, 0xb5, 0x1f, 0x2b, 0xa4, 0x5, 0x2f,
+ 0x75, 0x59, 0x2d, 0xfb, 0x1e, 0x1b, 0xfb, 0x42,
+ 0x51, 0xf7, 0x2d, 0xf7, 0x21, 0xf7, 0x1a, 0xbc,
+ 0xf7, 0x35, 0xf7, 0x52, 0xf7, 0x19, 0xb4, 0x2e,
+ 0x50, 0x9d, 0x1f, 0xe9, 0xa1, 0x5, 0xf7, 0x2c,
+ 0x60, 0xfb, 0x7, 0xc8, 0xfb, 0x13, 0x1b, 0xfb,
+ 0x31, 0xfb, 0x4a, 0x28, 0xfb, 0xab, 0xfb, 0x38,
+ 0xd0, 0xfb, 0x65, 0xf7, 0x69, 0x1f, 0xe, 0xaa,
+ 0x8b, 0xe0, 0xf8, 0xb8, 0xe0, 0x12, 0xdc, 0xea,
+ 0xf8, 0x24, 0xed, 0x17, 0xdc, 0x16, 0xf7, 0x8a,
+ 0x6, 0xf7, 0x6e, 0xf7, 0x15, 0xf7, 0x10, 0xf7,
+ 0x82, 0x1f, 0x13, 0xe0, 0xf7, 0x9a, 0xfb, 0x24,
+ 0xe9, 0xfb, 0x5f, 0x1e, 0xfb, 0x8a, 0x6, 0xea,
+ 0xfd, 0xd, 0x15, 0xf8, 0xb8, 0x7, 0x13, 0xd0,
+ 0xf7, 0x2b, 0x6, 0xf7, 0x2e, 0xea, 0x21, 0xfb,
+ 0x39, 0xfb, 0xac, 0xfb, 0x39, 0x8e, 0x37, 0x1f,
+ 0xe, 0x73, 0x8b, 0xe0, 0xf7, 0x86, 0xe0, 0xf7,
+ 0x71, 0xe0, 0x6e, 0xa, 0x3, 0xe1, 0x16, 0xf9,
+ 0x62, 0xf8, 0x85, 0x36, 0xfc, 0x26, 0xfb, 0x71,
+ 0xf8, 0x15, 0x36, 0xfc, 0x15, 0xfb, 0x86, 0xf8,
+ 0x26, 0x36, 0x7, 0xe, 0x43, 0xa, 0xc3, 0xf7,
+ 0x1d, 0x36, 0xa, 0xf7, 0x54, 0xc3, 0x2f, 0xa,
+ 0xe, 0x43, 0xa, 0xf7, 0x55, 0x77, 0x36, 0xa,
+ 0xf2, 0xc3, 0x2c, 0xa, 0xe, 0x43, 0xa, 0xcc,
+ 0xef, 0x6e, 0xa, 0xa6, 0xe5, 0xe6, 0xe5, 0x30,
+ 0xa, 0xf7, 0xe, 0xcc, 0x2e, 0xa, 0xe, 0x43,
+ 0xa, 0xc7, 0xf7, 0x19, 0x36, 0xa, 0xf7, 0x8f,
+ 0xc7, 0x4c, 0xa, 0x4a, 0xf7, 0x19, 0x59, 0xa,
+ 0xaa, 0x8b, 0xe0, 0xf7, 0x7b, 0xe0, 0xf7, 0x7c,
+ 0xe0, 0x1, 0xdb, 0xea, 0xf8, 0x25, 0xed, 0x3,
+ 0xdb, 0x16, 0xf7, 0x89, 0x6, 0xf7, 0x5a, 0xf7,
+ 0x2b, 0xf7, 0xc, 0xf7, 0x86, 0xf7, 0x9a, 0xfb,
+ 0x26, 0xe9, 0xfb, 0x5f, 0x1f, 0xfb, 0x89, 0xfb,
+ 0xd1, 0x3b, 0x36, 0xdb, 0x6, 0xea, 0xfb, 0x7b,
+ 0x15, 0xf7, 0x7b, 0xf7, 0x57, 0xe0, 0xfb, 0x57,
+ 0xf7, 0x7c, 0xf7, 0x2a, 0x7, 0xf7, 0x34, 0xe6,
+ 0x46, 0xfb, 0x5e, 0xfb, 0xab, 0xfb, 0x3b, 0x8d,
+ 0x37, 0x1f, 0xe, 0x73, 0x8b, 0xda, 0xf7, 0x43,
+ 0xcb, 0xdf, 0xcb, 0xf7, 0x41, 0xda, 0x1, 0x99,
+ 0xf7, 0x93, 0x15, 0xf4, 0x6, 0xfb, 0x40, 0xb7,
+ 0xe4, 0x38, 0xf7, 0x6b, 0x1b, 0xc1, 0xc9, 0x94,
+ 0x9d, 0xbb, 0x1f, 0xed, 0x7, 0x68, 0x5e, 0x50,
+ 0x80, 0x4f, 0x1b, 0xfb, 0x20, 0x31, 0xcb, 0xf7,
+ 0x4, 0x73, 0x1f, 0xf7, 0xe4, 0x6, 0x9a, 0xcb,
+ 0x5, 0xfb, 0xff, 0x6, 0x8a, 0x99, 0x8b, 0xae,
+ 0x8c, 0xac, 0x8, 0xf8, 0xf, 0x6, 0x9a, 0xcb,
+ 0x5, 0xfc, 0x15, 0x6, 0xf7, 0x6, 0xa2, 0xf7,
+ 0x2, 0xc7, 0xf7, 0x19, 0x1b, 0xc5, 0xbf, 0x7b,
+ 0x6c, 0xb8, 0x1f, 0xa2, 0xe2, 0x5, 0xa7, 0x56,
+ 0x4b, 0x96, 0x4e, 0x1b, 0xfb, 0x5b, 0xfb, 0x12,
+ 0x32, 0xfb, 0x38, 0x66, 0x1f, 0x37, 0x6, 0x7b,
+ 0x4b, 0x5, 0xe7, 0x6, 0x8a, 0x77, 0x8c, 0x61,
+ 0x8c, 0x77, 0x8, 0x3e, 0x6, 0xe, 0x3b, 0xa0,
+ 0x76, 0xf7, 0xd8, 0xe0, 0xf7, 0x74, 0xe0, 0x6e,
+ 0xa, 0x3, 0xe1, 0x16, 0xea, 0xf7, 0xd8, 0xf7,
+ 0xdb, 0xe0, 0xfb, 0xdb, 0xf7, 0x74, 0xf8, 0x26,
+ 0xe0, 0xfc, 0x85, 0x6, 0xe, 0xe2, 0x78, 0xe2,
+ 0xf7, 0x66, 0xe2, 0xf7, 0xb5, 0xde, 0x12, 0xbb,
+ 0xea, 0xf8, 0x6a, 0xe6, 0x17, 0xf8, 0x29, 0xf7,
+ 0xaa, 0x15, 0xf7, 0x64, 0xfb, 0x1c, 0x6, 0x7d,
+ 0x7a, 0x39, 0x4f, 0x20, 0x1b, 0x13, 0x30, 0xfb,
+ 0x3c, 0x2b, 0xf7, 0xc, 0xf7, 0x3b, 0xd2, 0xa2,
+ 0xf7, 0x78, 0xf7, 0x83, 0x1f, 0x13, 0xf8, 0xf7,
+ 0x35, 0xa9, 0xfb, 0x5, 0x5d, 0x98, 0x1f, 0xdf,
+ 0xa3, 0x5, 0xc0, 0x7e, 0x64, 0xf7, 0x39, 0xfb,
+ 0x80, 0x1b, 0xfb, 0xb4, 0x46, 0xfb, 0x82, 0xfb,
+ 0x24, 0xfb, 0x7b, 0xf7, 0x24, 0xfb, 0x23, 0xf7,
+ 0x6b, 0xf7, 0x2d, 0xf5, 0xdd, 0xaa, 0xb1, 0x1f,
+ 0xf7, 0xa3, 0xfb, 0xbf, 0x7, 0xe, 0xaa, 0xa0,
+ 0x76, 0xf7, 0xe5, 0xe0, 0xf7, 0xbc, 0x77, 0x1,
+ 0xd8, 0xea, 0xf8, 0xf, 0xea, 0x3, 0xd8, 0x16,
+ 0xea, 0xf7, 0xe5, 0xf8, 0xf, 0xfb, 0xe5, 0xea,
+ 0xf9, 0x62, 0x2c, 0xfb, 0xbc, 0xfc, 0xf, 0xf7,
+ 0xbc, 0x2c, 0x6, 0xe, 0xfc, 0x31, 0x39, 0xa,
+ 0xe6, 0xec, 0x3, 0xe6, 0x16, 0xec, 0xf9, 0x62,
+ 0x2a, 0x6, 0xe, 0x61, 0xa, 0xd2, 0xf9, 0xab,
+ 0x4c, 0xa, 0xf7, 0x15, 0xf7, 0x1e, 0x38, 0xa,
+ 0x48, 0x51, 0xa, 0x4b, 0xa, 0xf9, 0xac, 0xf7,
+ 0x1d, 0x1, 0xe5, 0xea, 0x3, 0x85, 0xf9, 0xac,
+ 0x15, 0xef, 0x6, 0xba, 0xde, 0xb8, 0x38, 0x5,
+ 0xee, 0x6, 0x26, 0x42, 0xa, 0x8a, 0x51, 0xa,
+ 0x4b, 0xa, 0xf9, 0xb5, 0xef, 0x12, 0x98, 0xe5,
+ 0x7e, 0xea, 0x82, 0xe5, 0x13, 0xd0, 0xe5, 0x16,
+ 0xea, 0xf9, 0x60, 0x2c, 0x6, 0x13, 0xe8, 0x3e,
+ 0xe0, 0x58, 0xa, 0x61, 0xa, 0xf7, 0x1e, 0xf9,
+ 0xaa, 0x15, 0xd1, 0x6, 0x35, 0xf7, 0x1f, 0x38,
+ 0xa, 0xde, 0x51, 0xa, 0xfb, 0x53, 0x78, 0xe0,
+ 0xf9, 0x20, 0x77, 0x1, 0x9c, 0xe1, 0xf7, 0x7a,
+ 0xea, 0x3, 0x9c, 0xf7, 0x5b, 0x15, 0xfb, 0x4c,
+ 0xf7, 0x19, 0x69, 0xd2, 0xf7, 0x49, 0xa5, 0xf7,
+ 0x13, 0xf7, 0x3, 0x1e, 0xf8, 0x87, 0x2c, 0xfc,
+ 0x87, 0x7, 0x50, 0x86, 0x2d, 0x20, 0x27, 0x7b,
+ 0xeb, 0xbc, 0x89, 0x1e, 0xe, 0x73, 0x39, 0xa,
+ 0xd7, 0xea, 0x3, 0xd7, 0x16, 0xea, 0xf7, 0x8c,
+ 0x6, 0xf7, 0xa, 0xf7, 0x6, 0xf7, 0x8d, 0xfb,
+ 0xfe, 0x5, 0xf7, 0x11, 0x6, 0xfb, 0xc8, 0xf8,
+ 0x3e, 0xf7, 0xbf, 0xf7, 0xb8, 0x5, 0xfb, 0x14,
+ 0x6, 0xfb, 0xf7, 0xfb, 0xf9, 0x5, 0xf7, 0xf9,
+ 0x2c, 0x7, 0xe, 0x8b, 0xe0, 0xf9, 0xd, 0x77,
+ 0x1, 0xd7, 0xea, 0x3, 0xd7, 0x16, 0xf8, 0x61,
+ 0xe0, 0xfc, 0x2, 0xf9, 0xd, 0x2c, 0x6, 0xe,
+ 0x8b, 0xe0, 0xf9, 0xd, 0x77, 0x1, 0xd6, 0xea,
+ 0x3, 0xd6, 0x16, 0xf8, 0x62, 0xe0, 0xfc, 0x3,
+ 0xf7, 0xa4, 0x6, 0xf7, 0x35, 0x5a, 0xa, 0xdd,
+ 0x7, 0xfb, 0x35, 0xfb, 0x1e, 0x5, 0xf7, 0xac,
+ 0x2c, 0xfb, 0xfc, 0x7, 0x2c, 0x38, 0x5, 0x3a,
+ 0x7, 0xea, 0xdd, 0x5, 0xe, 0xf7, 0x22, 0x39,
+ 0xa, 0xd4, 0xe5, 0xf8, 0x90, 0xe5, 0x3, 0xd4,
+ 0x16, 0xe5, 0xf8, 0xf7, 0x8e, 0x6, 0xf7, 0x64,
+ 0xfc, 0xf7, 0x5, 0xe0, 0x6, 0xf7, 0x66, 0xf8,
+ 0xed, 0x5, 0x8d, 0xfc, 0xed, 0xe5, 0xf9, 0x62,
+ 0xfb, 0x16, 0x6, 0xfb, 0x65, 0xfc, 0xfb, 0x5,
+ 0x89, 0x6, 0xfb, 0x5e, 0xf8, 0xfb, 0x5, 0xfb,
+ 0x25, 0x6, 0xe, 0xaa, 0x39, 0xa, 0xd7, 0xe5,
+ 0xf8, 0x1a, 0xe5, 0x3, 0xd7, 0x16, 0xe5, 0xf8,
+ 0xc8, 0x8d, 0x6, 0xf8, 0x11, 0xfc, 0xc8, 0x5,
+ 0xec, 0xf9, 0x62, 0x31, 0xfc, 0xc8, 0x89, 0x6,
+ 0xfc, 0x11, 0xf8, 0xc8, 0x5, 0x2a, 0x6, 0xe,
+ 0xaa, 0xa0, 0x76, 0xf8, 0xd7, 0xf7, 0x2e, 0xf7,
+ 0x22, 0xb5, 0x1, 0xd7, 0xe5, 0xf8, 0x1a, 0xe5,
+ 0x3, 0xd7, 0x16, 0xe5, 0xf8, 0xc6, 0x8d, 0x6,
+ 0xf8, 0x11, 0xfc, 0xc6, 0x5, 0xec, 0xf9, 0x60,
+ 0x31, 0xfc, 0xc6, 0x6, 0xfc, 0x13, 0xf8, 0xc6,
+ 0x5, 0x2a, 0x6, 0xf7, 0x18, 0xe3, 0x6b, 0xa,
+ 0xa1, 0xa1, 0x7f, 0x80, 0xa1, 0x1f, 0x7f, 0xa1,
+ 0xa1, 0x80, 0x53, 0xa, 0x87, 0x78, 0x94, 0x95,
+ 0x73, 0x1f, 0x96, 0x72, 0x6c, 0x96, 0x71, 0x1b,
+ 0x73, 0xa, 0xe2, 0x78, 0xde, 0xf8, 0xe2, 0xde,
+ 0x1, 0xc7, 0xef, 0xf8, 0x5f, 0xef, 0x3, 0xb2,
+ 0xf7, 0xf8, 0x15, 0xfb, 0x4f, 0xf7, 0xd, 0xfb,
+ 0x50, 0xf7, 0x78, 0xf7, 0x57, 0xf7, 0x30, 0xf7,
+ 0x1f, 0xf7, 0x80, 0xf7, 0x7f, 0xfb, 0x2c, 0xf7,
+ 0x26, 0xfb, 0x5b, 0xfb, 0x4c, 0xfb, 0x39, 0xfb,
+ 0xe, 0xfb, 0x97, 0x1e, 0xef, 0x16, 0xf7, 0x18,
+ 0xcf, 0xf7, 0x3a, 0xf7, 0x49, 0xf7, 0x10, 0xf7,
+ 0x13, 0x32, 0xfb, 0x65, 0xfb, 0x5c, 0xfb, 0xa,
+ 0x2f, 0xfb, 0x19, 0xfb, 0x28, 0x26, 0xf7, 0xd,
+ 0xf7, 0x3f, 0x1e, 0xe, 0xf7, 0xc9, 0x78, 0xd7,
+ 0x4c, 0xe0, 0xf7, 0x8d, 0xe0, 0xf7, 0x79, 0xe0,
+ 0x49, 0xd7, 0x12, 0xcd, 0xed, 0xf8, 0x2, 0xe3,
+ 0x13, 0x76, 0xf8, 0xa6, 0x85, 0x15, 0xf8, 0x47,
+ 0xe0, 0xfb, 0xef, 0xf7, 0x8d, 0xf7, 0xc7, 0xe0,
+ 0xfb, 0xc7, 0xf7, 0x79, 0xf7, 0xe0, 0xe0, 0xfc,
+ 0x39, 0x2a, 0x89, 0x6, 0x13, 0x8e, 0xe2, 0x59,
+ 0x39, 0x9f, 0x43, 0x1b, 0xfb, 0x66, 0x3e, 0xfb,
+ 0x48, 0xfb, 0x57, 0xfb, 0x3b, 0xca, 0xfb, 0x6a,
+ 0xf7, 0x74, 0xb5, 0xf1, 0x92, 0xf7, 0x1, 0xc8,
+ 0x1f, 0x8d, 0x6, 0xfc, 0x20, 0xf7, 0x9d, 0x15,
+ 0xf7, 0xf, 0xac, 0xf7, 0x44, 0xf7, 0x30, 0xf7,
+ 0x2f, 0xb9, 0xfb, 0x5d, 0x29, 0xfb, 0xe, 0x58,
+ 0xfb, 0x4b, 0xfb, 0x2a, 0x25, 0x34, 0xf2, 0xf7,
+ 0x5e, 0x1e, 0xe, 0x4f, 0xa, 0xbd, 0xf7, 0x1d,
+ 0x45, 0xa, 0xf7, 0xe2, 0xf9, 0xac, 0x2f, 0xa,
+ 0xfb, 0xf2, 0x26, 0xa, 0x4f, 0xa, 0xf7, 0x4f,
+ 0x77, 0x45, 0xa, 0xf7, 0x7f, 0xf9, 0xac, 0x2c,
+ 0xa, 0xfb, 0xb8, 0x26, 0xa, 0x4f, 0xa, 0x45,
+ 0xa, 0xbc, 0xf7, 0xf9, 0x21, 0xa, 0xf4, 0xf8,
+ 0x50, 0x2e, 0xa, 0xe, 0x4f, 0xa, 0xb9, 0xf7,
+ 0x21, 0x45, 0xa, 0xf8, 0x12, 0xf9, 0xa8, 0x15,
+ 0xd5, 0x6, 0x49, 0xf7, 0x21, 0x5, 0xfb, 0xa,
+ 0x6, 0xfb, 0x73, 0x26, 0xa, 0xe2, 0x87, 0xda,
+ 0x42, 0x76, 0xf9, 0x28, 0xda, 0x9c, 0x77, 0x12,
+ 0xb8, 0xed, 0xf8, 0x7c, 0xed, 0x13, 0x6c, 0xb2,
+ 0xa0, 0x15, 0xbc, 0x63, 0xdc, 0xe5, 0x5, 0x13,
+ 0x9c, 0x6c, 0xb6, 0xc4, 0x5f, 0xf7, 0xb, 0x1b,
+ 0xf7, 0x48, 0xf7, 0x35, 0xf7, 0x10, 0xf7, 0x80,
+ 0xf7, 0x17, 0x60, 0xcd, 0x6a, 0xbb, 0x1f, 0xe2,
+ 0xeb, 0x5a, 0xb3, 0x39, 0x30, 0x5, 0x13, 0xac,
+ 0xab, 0x60, 0x4e, 0xb5, 0xfb, 0x9, 0x1b, 0xfb,
+ 0x65, 0xfb, 0x1a, 0xfb, 0x25, 0xfb, 0x6d, 0xfb,
+ 0xf, 0xb2, 0x52, 0xb4, 0x4d, 0x1f, 0xc8, 0xce,
+ 0x15, 0x76, 0xb3, 0x75, 0xb3, 0xea, 0x1a, 0xf7,
+ 0x75, 0xf7, 0x21, 0xc5, 0xf3, 0xdd, 0xb3, 0x6f,
+ 0x6c, 0xb3, 0x1e, 0xfb, 0xd7, 0xfc, 0x53, 0x15,
+ 0xf8, 0x0, 0xf8, 0x21, 0x5, 0xa4, 0x5d, 0x9a,
+ 0x52, 0x42, 0x1a, 0xfb, 0x48, 0x24, 0x26, 0xfb,
+ 0x20, 0x34, 0x5c, 0xb2, 0xa0, 0x70, 0x1e, 0xe,
+ 0x4f, 0xa, 0x45, 0xa, 0xf7, 0x76, 0xf9, 0xb8,
+ 0x15, 0xcc, 0x6, 0xbb, 0xab, 0x8a, 0x90, 0x9e,
+ 0xa2, 0x82, 0x80, 0xa3, 0x1e, 0x7f, 0xa7, 0xa3,
+ 0x7d, 0x96, 0x1b, 0xa0, 0xd6, 0x86, 0xf7, 0x9,
+ 0x56, 0xa, 0x87, 0x78, 0x94, 0x96, 0x73, 0x1f,
+ 0x72, 0x96, 0x6d, 0x96, 0x70, 0x8a, 0x8, 0x5a,
+ 0x59, 0x67, 0x3f, 0x1f, 0xfb, 0x45, 0xfc, 0x53,
+ 0x21, 0xa, 0xe, 0x5f, 0xa, 0xf7, 0xb6, 0xe0,
+ 0xf7, 0x96, 0xe0, 0x6e, 0xa, 0xf7, 0xda, 0xed,
+ 0x3, 0xe1, 0x16, 0xea, 0xf7, 0xb6, 0xf7, 0x44,
+ 0x6, 0xf7, 0x18, 0xf7, 0x19, 0xbb, 0xf7, 0x3c,
+ 0xf7, 0x39, 0xfb, 0x15, 0xba, 0xfb, 0x1c, 0x1f,
+ 0xfb, 0xa3, 0x6, 0xea, 0xfb, 0xeb, 0x15, 0xf7,
+ 0x96, 0xf7, 0x44, 0x7, 0xeb, 0xd2, 0x71, 0x26,
+ 0xfb, 0x12, 0xfb, 0x7, 0x86, 0x57, 0x1f, 0xe,
+ 0xe2, 0x68, 0x76, 0xb7, 0xdd, 0xf8, 0xdd, 0xdd,
+ 0x1, 0xc3, 0xed, 0xf8, 0x6f, 0xed, 0x3, 0xf8,
+ 0xc2, 0xab, 0x15, 0x6c, 0x53, 0x50, 0x7e, 0x4e,
+ 0x1b, 0xfb, 0x5c, 0xfb, 0x23, 0xf7, 0x2e, 0xf7,
+ 0x70, 0xf7, 0x68, 0xf7, 0x13, 0xf7, 0x37, 0xf7,
+ 0x6c, 0xf7, 0x5a, 0xf7, 0x27, 0xfb, 0x27, 0xfb,
+ 0x78, 0x37, 0x77, 0xfb, 0x7, 0x33, 0x36, 0x1f,
+ 0xb0, 0x70, 0xb3, 0x74, 0xb6, 0x7a, 0x70, 0x48,
+ 0x18, 0x58, 0x9e, 0x58, 0xa8, 0x57, 0xb3, 0x8,
+ 0xfb, 0x29, 0xf7, 0x3c, 0x15, 0xd7, 0x76, 0xae,
+ 0x71, 0xa3, 0x74, 0x8, 0xd3, 0xcb, 0x98, 0xef,
+ 0xcf, 0x1a, 0xf7, 0x60, 0xfb, 0xe, 0xe4, 0xfb,
+ 0x11, 0x26, 0xfb, 0x24, 0x50, 0xfb, 0x7e, 0xfb,
+ 0x6b, 0xf7, 0x13, 0x3e, 0xf7, 0xa, 0xbe, 0xaf,
+ 0x99, 0x90, 0x96, 0x1e, 0x6c, 0x9e, 0x6f, 0x99,
+ 0x68, 0x93, 0x8, 0xe, 0xaa, 0xa0, 0x76, 0xf7,
+ 0xd0, 0xe0, 0xf7, 0x82, 0xda, 0x1, 0xe3, 0xea,
+ 0xf7, 0xec, 0xed, 0x3, 0xe3, 0x16, 0xea, 0xf7,
+ 0xd0, 0xcb, 0x6, 0xda, 0xb6, 0x84, 0xfb, 0x35,
+ 0xf1, 0x1f, 0xe9, 0xfb, 0x28, 0x5, 0xf7, 0xb,
+ 0x6, 0xfb, 0xd, 0xf7, 0x43, 0x53, 0xe2, 0x5c,
+ 0xb9, 0x67, 0x9c, 0x19, 0x8d, 0x7, 0xf7, 0xe,
+ 0x9b, 0xda, 0xcb, 0xf7, 0x7, 0x1a, 0xf7, 0x2c,
+ 0xfb, 0x25, 0xb7, 0xfb, 0x15, 0x1e, 0xfb, 0x9b,
+ 0x6, 0xea, 0xfb, 0xd1, 0x15, 0xf7, 0x82, 0xf7,
+ 0x3c, 0x7, 0xd5, 0xf1, 0x72, 0x2f, 0x24, 0x2a,
+ 0x79, 0x3c, 0x1f, 0xe, 0x73, 0x78, 0xe2, 0xf8,
+ 0xda, 0xe2, 0x1, 0xd7, 0xe6, 0xf7, 0xf5, 0xe6,
+ 0x3, 0xbc, 0xf7, 0x79, 0x15, 0xfb, 0x27, 0x9b,
+ 0xd2, 0x26, 0xf7, 0x6b, 0x1b, 0xf7, 0x37, 0xf5,
+ 0xe6, 0xf7, 0xd, 0xf7, 0x35, 0xfb, 0x2a, 0xb5,
+ 0xfb, 0x17, 0xa8, 0x1f, 0xfb, 0x18, 0xa9, 0x63,
+ 0x9c, 0xcb, 0x1a, 0xe6, 0xee, 0xa2, 0xc9, 0xf7,
+ 0x29, 0xa4, 0x35, 0x56, 0x90, 0x1e, 0xe7, 0x92,
+ 0x5, 0xf7, 0x24, 0x86, 0xfb, 0x3, 0xd6, 0xfb,
+ 0x2f, 0x1b, 0xfb, 0x33, 0x2e, 0x33, 0xfb, 0x5,
+ 0xfb, 0x26, 0xf7, 0x22, 0x69, 0xe8, 0x74, 0x1f,
+ 0xf7, 0x26, 0x68, 0xd3, 0x78, 0x35, 0x1a, 0x3a,
+ 0x3c, 0x5f, 0x28, 0x41, 0xfb, 0xe, 0xab, 0xf7,
+ 0x1d, 0x7b, 0x1e, 0xe, 0x73, 0x78, 0xe0, 0xf8,
+ 0xcc, 0xe0, 0x1, 0xd9, 0xe5, 0xf7, 0xef, 0xe6,
+ 0x3, 0xbc, 0xf7, 0x74, 0x15, 0xfb, 0x10, 0xa1,
+ 0xcd, 0xfb, 0xb, 0xf7, 0x6a, 0x1b, 0xf7, 0x37,
+ 0xf5, 0xe4, 0xf7, 0xb, 0xf7, 0x31, 0xfb, 0x2a,
+ 0xb4, 0xfb, 0x17, 0xa8, 0x1f, 0xfb, 0x17, 0xa8,
+ 0x63, 0x9c, 0xc9, 0x1a, 0xe4, 0xee, 0xa3, 0xc9,
+ 0xf7, 0x28, 0xa4, 0x36, 0x57, 0x90, 0x1e, 0xe6,
+ 0x92, 0x5, 0xf7, 0x21, 0x86, 0xfb, 0x2, 0xd5,
+ 0xfb, 0x2e, 0x1b, 0xfb, 0x33, 0x2f, 0x34, 0xfb,
+ 0x3, 0xfb, 0x23, 0xf7, 0x21, 0x6a, 0xe8, 0x75,
+ 0x1f, 0xf7, 0x25, 0x68, 0xd3, 0x79, 0x37, 0x1a,
+ 0x3b, 0x3c, 0x60, 0x28, 0x42, 0xfb, 0x6, 0xad,
+ 0xf7, 0x18, 0x72, 0x1e, 0xf7, 0x2a, 0xf8, 0xc4,
+ 0x37, 0xa, 0x3b, 0xa0, 0x76, 0xf9, 0xd, 0xe0,
+ 0x1, 0xf7, 0x95, 0xea, 0x3, 0xf7, 0x95, 0x16,
+ 0xea, 0xf9, 0xd, 0xf7, 0x89, 0xe0, 0xfc, 0xdb,
+ 0x36, 0xf7, 0x87, 0x6, 0xe, 0x5f, 0xa, 0xf7,
+ 0x25, 0xe0, 0xf7, 0x94, 0xe0, 0xf7, 0x27, 0x77,
+ 0x6e, 0xa, 0xf7, 0xeb, 0xed, 0x3, 0xe1, 0x16,
+ 0xea, 0xf7, 0x25, 0xf7, 0x39, 0x6, 0xf7, 0x18,
+ 0xf7, 0x24, 0xb9, 0xf7, 0x3d, 0xf7, 0x35, 0xfb,
+ 0x1b, 0xbd, 0xfb, 0x21, 0x1f, 0xfb, 0x39, 0xf7,
+ 0x27, 0x2c, 0x6, 0xea, 0xfc, 0x7c, 0x15, 0xf7,
+ 0x94, 0xf7, 0x39, 0x7, 0xe5, 0xe3, 0x79, 0xfb,
+ 0x0, 0xfb, 0x13, 0xfb, 0x15, 0x88, 0x5a, 0x1f,
+ 0xe, 0xaa, 0x78, 0xe0, 0xf9, 0x20, 0x77, 0x41,
+ 0xa, 0xf9, 0x62, 0x15, 0xfc, 0x3a, 0x7, 0xfb,
+ 0x13, 0x91, 0xfb, 0x50, 0xf7, 0xa3, 0xf7, 0xac,
+ 0x93, 0xf7, 0x70, 0xea, 0x1e, 0xf8, 0x3a, 0x2c,
+ 0xfc, 0x3a, 0x7, 0xfb, 0x15, 0x7a, 0x26, 0xfb,
+ 0x44, 0xfb, 0x48, 0x89, 0xf7, 0x23, 0xe2, 0x1e,
+ 0xf8, 0x3a, 0x7, 0xe, 0x2b, 0xa, 0xf7, 0x18,
+ 0xda, 0x2f, 0xa, 0xe, 0x2b, 0xa, 0xac, 0xda,
+ 0x2c, 0xa, 0xe, 0xaa, 0x78, 0xe0, 0xf9, 0x6e,
+ 0xef, 0x2a, 0xa, 0xbf, 0xe3, 0x2e, 0xa, 0xe,
+ 0x2b, 0xa, 0xf7, 0x3f, 0xda, 0x5e, 0xa, 0x73,
+ 0x39, 0xa, 0xf7, 0xb5, 0x16, 0xe8, 0x6, 0xf7,
+ 0x9d, 0xf9, 0x62, 0x5, 0x30, 0x6, 0xfb, 0x71,
+ 0xfd, 0x13, 0xfb, 0x6e, 0xf9, 0x13, 0x5, 0x2a,
+ 0x6, 0xe, 0xf7, 0x91, 0x39, 0xa, 0xf7, 0x62,
+ 0x16, 0xea, 0x6, 0xf7, 0x3c, 0xf9, 0xc, 0x5,
+ 0x8c, 0x6, 0xf7, 0x40, 0xfd, 0xc, 0x5, 0xe5,
+ 0x6, 0xf7, 0x58, 0xf9, 0x62, 0x5, 0x2d, 0x6,
+ 0xfb, 0x27, 0xfc, 0xfe, 0xfb, 0x32, 0xf8, 0xfe,
+ 0x5, 0xfb, 0x2, 0x6, 0xfb, 0x3a, 0xfc, 0xfe,
+ 0x5, 0x89, 0x6, 0xfb, 0x1f, 0xf8, 0xfe, 0x5,
+ 0x2b, 0x6, 0xe, 0x73, 0x39, 0xa, 0x9e, 0x16,
+ 0xf7, 0x1, 0x6, 0xf7, 0x61, 0xf7, 0xc4, 0x5,
+ 0x8c, 0x6, 0xf7, 0x5e, 0xfb, 0xc4, 0x5, 0xf7,
+ 0x4, 0x6, 0xfb, 0x98, 0xf8, 0x10, 0xf7, 0x85,
+ 0xf7, 0xe6, 0x5, 0x32, 0x6, 0xfb, 0x5f, 0xfb,
+ 0xa5, 0xfb, 0x47, 0xf7, 0xa5, 0x5, 0xfb, 0x0,
+ 0x6, 0xf7, 0x7f, 0xfb, 0xec, 0x5, 0xe, 0x73,
+ 0x39, 0xa, 0xf7, 0xaf, 0xe8, 0x3, 0xf7, 0xaf,
+ 0x16, 0xe8, 0xf7, 0xc3, 0x6, 0xf7, 0xa9, 0xf8,
+ 0x33, 0x5, 0x20, 0x6, 0xfb, 0x67, 0xfb, 0xe7,
+ 0xfb, 0x65, 0xf7, 0xe7, 0x5, 0xfb, 0x4, 0x6,
+ 0xf7, 0xa1, 0xfc, 0x33, 0x5, 0xe, 0x5f, 0xa,
+ 0xf9, 0xac, 0xf7, 0x1d, 0x1, 0xf7, 0xad, 0xea,
+ 0x3, 0x57, 0xa, 0xfb, 0x65, 0xfb, 0xe2, 0xfb,
+ 0x60, 0xf7, 0xe2, 0x5, 0xfb, 0x8, 0x6, 0xf7,
+ 0x9f, 0xfc, 0x2e, 0x5, 0x88, 0xf8, 0x7d, 0x2f,
+ 0xa, 0xe, 0x5f, 0xa, 0xf9, 0xb5, 0xef, 0x12,
+ 0xf7, 0x5a, 0xe5, 0x84, 0xea, 0x8e, 0xe5, 0x13,
+ 0xd8, 0x57, 0xa, 0xfb, 0x6a, 0xfb, 0xe2, 0xfb,
+ 0x5c, 0xf7, 0xe2, 0x38, 0xa, 0xf7, 0x9f, 0xfc,
+ 0x2e, 0x5, 0x13, 0xe8, 0x38, 0xf8, 0x86, 0x2e,
+ 0xa, 0xe, 0x3b, 0x8b, 0xe0, 0xf8, 0xb8, 0xe0,
+ 0x6a, 0xa, 0xf8, 0x4f, 0xf8, 0xb8, 0x5, 0xe0,
+ 0xfc, 0x93, 0x36, 0xf8, 0x22, 0x7, 0xfc, 0x4b,
+ 0xfc, 0xb4, 0x5, 0xe, 0x3b, 0x8b, 0xe0, 0xf8,
+ 0xb3, 0xe0, 0xf7, 0x6c, 0x77, 0x6a, 0xa, 0xf8,
+ 0x51, 0xf8, 0xb3, 0x5, 0xe0, 0xfc, 0x95, 0x36,
+ 0xf8, 0x24, 0x7, 0xfc, 0x4d, 0xfc, 0xaf, 0x5,
+ 0xf7, 0x82, 0xf9, 0x53, 0x37, 0xa, 0x7c, 0xd0,
+ 0xf8, 0x30, 0xd3, 0x1, 0xaf, 0xe9, 0xf7, 0xa0,
+ 0xe3, 0x3, 0xbe, 0xf8, 0xd, 0x15, 0xe1, 0x80,
+ 0x5, 0xb6, 0x96, 0x9b, 0xc4, 0xf7, 0x2, 0x1b,
+ 0xf7, 0x15, 0x88, 0x3a, 0x53, 0x89, 0x1f, 0x59,
+ 0x79, 0x2e, 0x81, 0x7e, 0x89, 0x8, 0x52, 0x84,
+ 0xfb, 0x29, 0x7a, 0xfb, 0x1e, 0x1a, 0x35, 0xcc,
+ 0x49, 0xf7, 0x6, 0xc3, 0xc6, 0x98, 0xca, 0xd5,
+ 0x1e, 0x8d, 0x7e, 0x9d, 0x73, 0x99, 0x70, 0x8,
+ 0xe7, 0x6, 0x6f, 0xbd, 0x7b, 0x92, 0xf7, 0x19,
+ 0x1a, 0xf7, 0x28, 0x7, 0xe5, 0x80, 0xf7, 0x5,
+ 0xfb, 0x5d, 0xfb, 0x5c, 0x7e, 0xfb, 0x7, 0x5d,
+ 0x81, 0x1e, 0xf7, 0xef, 0xfb, 0x9, 0x15, 0x40,
+ 0x87, 0x5f, 0x68, 0x65, 0x1e, 0x5f, 0x62, 0x3d,
+ 0x86, 0x72, 0x1b, 0x3c, 0x85, 0xbb, 0xb0, 0xd1,
+ 0xc5, 0x95, 0xc1, 0x93, 0x1f, 0xb9, 0x92, 0xd7,
+ 0x98, 0xad, 0x98, 0x8, 0xe, 0x40, 0xa, 0xce,
+ 0xf7, 0x1d, 0x49, 0xa, 0x3f, 0xa, 0xfb, 0x1f,
+ 0xfc, 0xb, 0x20, 0xa, 0x40, 0xa, 0xf7, 0x60,
+ 0x77, 0x49, 0xa, 0x3a, 0xa, 0x3a, 0xfc, 0xb,
+ 0x20, 0xa, 0x54, 0xa, 0xf7, 0xe, 0xf8, 0xe5,
+ 0x4c, 0xa, 0xf7, 0x11, 0xf7, 0x21, 0x59, 0xa,
+ 0x40, 0xa, 0xd7, 0xef, 0x49, 0xa, 0x3e, 0xa,
+ 0xfb, 0x43, 0xfb, 0xef, 0x20, 0xa, 0xf7, 0x5a,
+ 0x7c, 0xd4, 0xf7, 0x47, 0xd3, 0xf7, 0x31, 0xd3,
+ 0x1, 0xaf, 0xe9, 0xf7, 0x94, 0xe4, 0x3, 0xbc,
+ 0xf8, 0x4, 0x15, 0xe1, 0x81, 0x5, 0xba, 0x95,
+ 0xb0, 0xc8, 0xe6, 0x1b, 0xf6, 0x95, 0x50, 0x3b,
+ 0x87, 0x1f, 0x64, 0x7f, 0x58, 0x88, 0x50, 0x83,
+ 0x8, 0x25, 0x7d, 0x28, 0x3f, 0x3e, 0x1a, 0x63,
+ 0xa4, 0xfb, 0x4, 0xf7, 0x2d, 0xed, 0xcc, 0xbd,
+ 0xbd, 0xbd, 0x1e, 0x3d, 0xc7, 0xcc, 0x75, 0xce,
+ 0x1b, 0xf7, 0x1e, 0xcb, 0xe2, 0xe2, 0xa4, 0x1f,
+ 0x30, 0x97, 0x5, 0x65, 0x82, 0x69, 0x40, 0x2e,
+ 0x1b, 0x2b, 0x50, 0xdd, 0xec, 0x96, 0x1f, 0xf8,
+ 0x8, 0x6, 0xf7, 0x38, 0x51, 0xf7, 0x1d, 0xfb,
+ 0x3e, 0x25, 0x5f, 0x5a, 0x76, 0x77, 0x1e, 0xa1,
+ 0x7e, 0x6d, 0xbb, 0xfb, 0x1d, 0x1b, 0xfb, 0x4e,
+ 0x71, 0xfb, 0xc, 0x59, 0x7f, 0x1f, 0xf7, 0xe7,
+ 0xfb, 0x0, 0x15, 0xfb, 0x12, 0xa2, 0x3e, 0x3c,
+ 0xfb, 0xc, 0x1b, 0x33, 0x8f, 0xc8, 0xa3, 0xb6,
+ 0xd2, 0xb0, 0xaf, 0x91, 0x1f, 0xbf, 0x93, 0xc8,
+ 0x94, 0xb1, 0x9c, 0x8, 0xe2, 0xbc, 0x15, 0xd5,
+ 0x90, 0xb4, 0xde, 0xed, 0x1b, 0xf7, 0x14, 0x93,
+ 0xfb, 0x11, 0x6b, 0x8e, 0x1f, 0xe, 0x40, 0xa,
+ 0xcf, 0xf7, 0x1c, 0x12, 0xba, 0xe9, 0xf7, 0x8d,
+ 0xe3, 0x13, 0xbc, 0xf7, 0x9a, 0xf8, 0xea, 0x4c,
+ 0xa, 0x4a, 0xf7, 0x1c, 0x38, 0xa, 0x86, 0xfc,
+ 0xb, 0x24, 0xa, 0x13, 0x7c, 0x25, 0xa, 0x13,
+ 0xbc, 0x28, 0xa, 0x73, 0x7c, 0xda, 0xf8, 0xda,
+ 0xd3, 0x12, 0xb7, 0xe8, 0x87, 0xe5, 0xf7, 0x38,
+ 0xe5, 0x13, 0xe8, 0xf7, 0x69, 0xf8, 0x2b, 0x15,
+ 0xfb, 0x12, 0x4e, 0x60, 0x42, 0x3b, 0x1a, 0x2f,
+ 0xd4, 0xfb, 0x8, 0xf7, 0x2d, 0xde, 0xcd, 0xab,
+ 0xca, 0xc3, 0x1e, 0x99, 0x7c, 0xb7, 0x5f, 0xc0,
+ 0x68, 0xc6, 0xce, 0x18, 0x64, 0xa7, 0x62, 0xaf,
+ 0x6a, 0xb5, 0xa8, 0xb7, 0x9e, 0xbb, 0x9b, 0xca,
+ 0x30, 0x9e, 0x18, 0x88, 0x7f, 0x81, 0x5e, 0x76,
+ 0x60, 0xfb, 0x15, 0xf7, 0x38, 0x18, 0xea, 0xbd,
+ 0xb3, 0xbe, 0xcd, 0x1a, 0xdd, 0x44, 0xd3, 0x27,
+ 0x1e, 0x13, 0xd8, 0x22, 0x47, 0x45, 0x37, 0x5f,
+ 0x9d, 0x62, 0xc9, 0x43, 0x1f, 0xb9, 0x52, 0x15,
+ 0xf7, 0x35, 0xfb, 0x5c, 0x5, 0x5c, 0x6c, 0x4f,
+ 0x64, 0x51, 0x1b, 0x13, 0xe8, 0x2d, 0x63, 0xe1,
+ 0xba, 0xcf, 0xc7, 0xba, 0xc9, 0xb1, 0x1f, 0xb1,
+ 0xf2, 0x15, 0x13, 0xd8, 0x47, 0xdb, 0x85, 0x97,
+ 0x9e, 0x1a, 0xbe, 0xb7, 0xaa, 0xb2, 0xb2, 0xb5,
+ 0x70, 0x54, 0x4d, 0x5d, 0x74, 0x5f, 0x71, 0x1e,
+ 0xe, 0x40, 0xa, 0xbb, 0xaf, 0xf5, 0xaf, 0x12,
+ 0xba, 0xe9, 0xbd, 0xaf, 0xf3, 0xaf, 0xa2, 0xe3,
+ 0x13, 0x7f, 0x80, 0xf7, 0x53, 0xf9, 0x2f, 0x64,
+ 0xa, 0xb3, 0x5a, 0x5a, 0x65, 0x63, 0x5a, 0x1e,
+ 0xaf, 0x8c, 0x15, 0xa6, 0xa0, 0xa4, 0xaa, 0xaa,
+ 0xa0, 0x72, 0x6f, 0x6e, 0x74, 0x73, 0x6e, 0x70,
+ 0x72, 0xa1, 0xab, 0x1e, 0x3d, 0xfb, 0xc9, 0x22,
+ 0xa, 0x13, 0xbf, 0x80, 0x28, 0xa, 0xfb, 0x72,
+ 0xf7, 0xb1, 0x76, 0xf8, 0x3c, 0x77, 0x1, 0x7d,
+ 0xf7, 0x9c, 0x15, 0xe5, 0x6, 0xf7, 0x32, 0xf7,
+ 0xd9, 0xf7, 0x34, 0xfb, 0xd9, 0x5, 0xe4, 0x6,
+ 0xfb, 0x69, 0xf8, 0x3c, 0x5, 0x44, 0x6, 0xe,
+ 0x20, 0xf7, 0x49, 0xe1, 0x49, 0x76, 0xc6, 0xe1,
+ 0x8c, 0x77, 0x12, 0x13, 0x60, 0xc8, 0xf7, 0x48,
+ 0x15, 0xa6, 0xa8, 0xae, 0xab, 0xc1, 0x1b, 0xbc,
+ 0xaf, 0x7a, 0x7b, 0xb0, 0x1f, 0x13, 0x90, 0x7e,
+ 0xa9, 0xa9, 0x7f, 0xb1, 0x1b, 0xc9, 0xae, 0xa5,
+ 0xa3, 0xa6, 0x1f, 0xea, 0x7, 0x82, 0x83, 0x59,
+ 0x59, 0x51, 0x1b, 0x6e, 0x69, 0x96, 0x97, 0x69,
+ 0x1f, 0x13, 0x60, 0x9b, 0x5e, 0x5e, 0x9e, 0x69,
+ 0x1b, 0x64, 0x59, 0x7f, 0x63, 0x67, 0x1f, 0xe,
+ 0xfb, 0xc2, 0xf8, 0x58, 0x76, 0xf7, 0xb3, 0x77,
+ 0x1, 0xf7, 0x16, 0xf8, 0x43, 0x15, 0x9f, 0xa5,
+ 0x99, 0xa0, 0xa7, 0xbf, 0xa3, 0x63, 0x98, 0x74,
+ 0xa6, 0x67, 0xc4, 0xb3, 0x18, 0x86, 0x8f, 0x54,
+ 0xcb, 0x75, 0x9e, 0xaf, 0x8f, 0xbf, 0x97, 0xa9,
+ 0x94, 0x75, 0xcd, 0x18, 0x72, 0x83, 0x59, 0x79,
+ 0x67, 0x79, 0x8, 0x93, 0xbf, 0x8d, 0xb3, 0xa0,
+ 0x1a, 0x48, 0x6, 0x6c, 0x8d, 0x79, 0x93, 0x4a,
+ 0x1e, 0x83, 0x84, 0x3d, 0xb7, 0x75, 0x93, 0x75,
+ 0x49, 0x18, 0xb3, 0x81, 0xaf, 0x83, 0xb1, 0x84,
+ 0x3d, 0x34, 0x18, 0xe, 0xf7, 0xd8, 0x5c, 0xc8,
+ 0x4e, 0xf7, 0x4e, 0x82, 0xcc, 0xf7, 0xdb, 0xca,
+ 0xf7, 0x1, 0xc7, 0x12, 0xf7, 0x1c, 0xc6, 0xe8,
+ 0xd6, 0xf8, 0x5e, 0xc6, 0x13, 0xbf, 0xf8, 0xc3,
+ 0xf7, 0x5c, 0x15, 0x71, 0x8e, 0x90, 0x5f, 0xd1,
+ 0x1b, 0xf7, 0xc, 0xf7, 0xf, 0xf7, 0x1c, 0xf7,
+ 0x38, 0xf7, 0x33, 0xfb, 0xb, 0xf7, 0x39, 0xfb,
+ 0x7a, 0xfb, 0xc5, 0x31, 0xfb, 0x99, 0xfb, 0x3a,
+ 0xfb, 0x5a, 0xf7, 0x7, 0xfb, 0x44, 0xf7, 0xb8,
+ 0x1f, 0x13, 0x5f, 0xf7, 0x97, 0xe3, 0xf7, 0x39,
+ 0xa0, 0x95, 0x1f, 0x42, 0x6, 0x13, 0xbf, 0x62,
+ 0x6d, 0x3e, 0x37, 0xfb, 0x45, 0x1b, 0xfb, 0x3d,
+ 0xfb, 0x47, 0xd0, 0xf7, 0x88, 0xf7, 0x54, 0xf7,
+ 0x15, 0xf7, 0x43, 0xf7, 0x63, 0xf7, 0x35, 0xf7,
+ 0x15, 0x20, 0xfb, 0x31, 0xfb, 0x24, 0xfb, 0x4,
+ 0x34, 0x5f, 0x7f, 0x7a, 0x94, 0x9e, 0x1f, 0xd1,
+ 0xf7, 0xed, 0x5, 0x43, 0x6, 0x7d, 0x4a, 0x5,
+ 0xd3, 0x60, 0x53, 0x91, 0x74, 0x1b, 0xfb, 0x4,
+ 0x29, 0xfb, 0x28, 0xfb, 0x10, 0x22, 0xcb, 0x3e,
+ 0xde, 0xc7, 0xb6, 0xb8, 0xa3, 0xa0, 0x1f, 0xfb,
+ 0x58, 0xf7, 0x5, 0x15, 0xd4, 0xb3, 0xf7, 0x1c,
+ 0xea, 0xbc, 0xba, 0x64, 0x3b, 0xfb, 0x6, 0x32,
+ 0x2d, 0x45, 0x63, 0x6b, 0xad, 0xdf, 0x1e, 0xe,
+ 0x40, 0xa, 0xda, 0xf7, 0x5, 0x49, 0xa, 0xf7,
+ 0x48, 0xf8, 0xf5, 0x15, 0xbb, 0xab, 0x8a, 0x90,
+ 0xa7, 0xa0, 0x80, 0x80, 0x9e, 0x1e, 0x7f, 0x9f,
+ 0x9d, 0x7f, 0xa2, 0x1b, 0xa0, 0xd6, 0x92, 0xf4,
+ 0x56, 0xa, 0x8f, 0x79, 0x94, 0x96, 0x70, 0x1f,
+ 0x96, 0x6f, 0x66, 0x96, 0x74, 0x1b, 0x5a, 0x59,
+ 0x66, 0x3f, 0x1f, 0xad, 0xfb, 0x8e, 0x20, 0xa,
+ 0x7c, 0xd3, 0xf8, 0x25, 0xd3, 0xf7, 0x50, 0x77,
+ 0x12, 0xc5, 0xdc, 0x3a, 0xe3, 0xf7, 0xa5, 0xe5,
+ 0x13, 0xec, 0xc5, 0x16, 0xdd, 0xcc, 0x8d, 0x6,
+ 0x41, 0xbb, 0xd5, 0x85, 0xa1, 0x1b, 0xde, 0xf7,
+ 0x28, 0xc3, 0xf7, 0x6f, 0xf7, 0x29, 0x30, 0xf7,
+ 0xd, 0xfb, 0x20, 0x35, 0x63, 0x57, 0x79, 0x7f,
+ 0x1f, 0x89, 0xf7, 0x96, 0x33, 0x6, 0x13, 0xf4,
+ 0xdc, 0xfc, 0x5e, 0x15, 0xf4, 0xc3, 0xe8, 0xe6,
+ 0xe6, 0xbd, 0x37, 0xfb, 0x6, 0xfb, 0x22, 0x44,
+ 0x4e, 0x45, 0x5a, 0x5e, 0xaa, 0xb3, 0x70, 0x1e,
+ 0x7f, 0x9d, 0x7d, 0xa5, 0xe3, 0x1a, 0xe, 0xfc,
+ 0x31, 0x8d, 0x76, 0xf9, 0x88, 0x77, 0x1, 0xf7,
+ 0x74, 0x78, 0x15, 0xd2, 0x6, 0xfb, 0x85, 0xf9,
+ 0x88, 0x5, 0x44, 0x6, 0xe, 0xfc, 0x43, 0xfb,
+ 0x50, 0x76, 0xfa, 0x46, 0x77, 0x1, 0xe9, 0xd4,
+ 0x3, 0xe9, 0xfb, 0x65, 0x15, 0xd4, 0xfa, 0x46,
+ 0x42, 0x6, 0xe, 0xfb, 0xf9, 0xfb, 0x58, 0xd5,
+ 0xf7, 0xee, 0xda, 0xf7, 0xed, 0xd5, 0x1, 0xf7,
+ 0x18, 0xd3, 0x3, 0xb5, 0xf7, 0x74, 0x15, 0xe4,
+ 0x89, 0x8b, 0x33, 0x8c, 0x2d, 0x8, 0xfb, 0x4c,
+ 0x8a, 0x9e, 0x57, 0xf7, 0x22, 0x1b, 0xd5, 0x7,
+ 0x33, 0x8d, 0x93, 0xf7, 0x2e, 0xf7, 0x6, 0x7a,
+ 0xd5, 0x40, 0xae, 0x1f, 0xe5, 0xbb, 0x8d, 0x8b,
+ 0xf7, 0x44, 0x1a, 0xe2, 0x89, 0xd5, 0xe3, 0x1e,
+ 0xd5, 0x7, 0xfb, 0x22, 0x79, 0x31, 0xfb, 0x25,
+ 0x1f, 0x8a, 0x2c, 0x8b, 0x34, 0x32, 0x89, 0x8,
+ 0xe, 0xfb, 0xf9, 0xfb, 0x58, 0xd5, 0xf7, 0xed,
+ 0xda, 0xf7, 0xee, 0xd5, 0x1, 0xf7, 0x15, 0xd3,
+ 0x3, 0xb5, 0xfb, 0xe, 0x15, 0x41, 0x7, 0xde,
+ 0xd7, 0x99, 0xf7, 0x33, 0x1f, 0x8c, 0xeb, 0x8d,
+ 0xf7, 0x28, 0xe3, 0x8d, 0x8, 0xda, 0x7, 0x33,
+ 0x8d, 0x88, 0xdb, 0xea, 0x1a, 0xf7, 0x29, 0x86,
+ 0xe9, 0xfb, 0x2e, 0x1e, 0x41, 0x7, 0xe2, 0x8b,
+ 0x73, 0xfb, 0x25, 0xfb, 0x7, 0x9a, 0x49, 0xd6,
+ 0x68, 0x1f, 0x31, 0x5b, 0x8b, 0x4d, 0xfb, 0x44,
+ 0x1a, 0x34, 0x79, 0x7f, 0x46, 0x1e, 0xe, 0x69,
+ 0xa, 0xca, 0xe3, 0x33, 0xf7, 0x4f, 0x13, 0xe0,
+ 0xf7, 0x2b, 0xfb, 0xf, 0x15, 0xf9, 0x98, 0x7,
+ 0x13, 0xd0, 0xee, 0xd4, 0xfb, 0x4f, 0xfe, 0x2a,
+ 0xf7, 0x4f, 0xd4, 0x6, 0xe, 0x69, 0xa, 0xa7,
+ 0xf7, 0x4f, 0x33, 0xe3, 0x13, 0xe0, 0xa7, 0xfb,
+ 0xf, 0x15, 0x42, 0xf7, 0x4f, 0xfa, 0x2a, 0xfb,
+ 0x4f, 0x42, 0x7, 0x13, 0xd0, 0xee, 0xfd, 0x98,
+ 0x6, 0xe, 0xfb, 0xfa, 0xf8, 0xe7, 0xcc, 0xd2,
+ 0x77, 0x1, 0x98, 0xf9, 0x6f, 0x15, 0x2c, 0xe3,
+ 0x62, 0xcd, 0xce, 0xe2, 0xb6, 0xe8, 0x1e, 0x4b,
+ 0x6, 0x6a, 0x84, 0x7e, 0x65, 0x45, 0x1b, 0x43,
+ 0x7d, 0xbf, 0x9e, 0x87, 0x1f, 0xe, 0xfc, 0x43,
+ 0x8d, 0x76, 0xf9, 0x88, 0x77, 0x1, 0xe9, 0xd4,
+ 0x3, 0xe9, 0xf8, 0x3f, 0x15, 0xd4, 0xf7, 0xca,
+ 0x42, 0x6, 0xfd, 0x88, 0x4, 0xd4, 0xf7, 0xc9,
+ 0x42, 0x6, 0xe, 0xfb, 0xe9, 0xf7, 0x5e, 0xf7,
+ 0xcf, 0x1, 0x9d, 0xf7, 0xcf, 0x3, 0x9d, 0xf7,
+ 0xfb, 0x15, 0x33, 0xd2, 0x46, 0xe1, 0xe1, 0xd3,
+ 0xd0, 0xe3, 0xe4, 0x43, 0xd0, 0x35, 0x35, 0x44,
+ 0x46, 0x32, 0x1e, 0xe, 0xfb, 0x53, 0x7c, 0xd3,
+ 0xf8, 0x29, 0xd7, 0x1, 0xbb, 0xe5, 0xf7, 0x9b,
+ 0xe0, 0x3, 0xf8, 0x24, 0xf7, 0x52, 0x15, 0x71,
+ 0x88, 0x7a, 0x20, 0xfb, 0x4, 0x1b, 0xfb, 0xf,
+ 0x7c, 0xf7, 0x18, 0xd0, 0xc8, 0x93, 0xf7, 0x23,
+ 0xf7, 0x1d, 0xc1, 0xc1, 0x6f, 0x40, 0x9d, 0x1f,
+ 0xe0, 0x98, 0x5, 0xf4, 0xfb, 0x8, 0xc8, 0x2c,
+ 0x24, 0xfb, 0x18, 0x4b, 0xfb, 0x6c, 0xfb, 0x1e,
+ 0xc4, 0xfb, 0x1b, 0xf7, 0x3f, 0xb7, 0xf7, 0x27,
+ 0x9e, 0xf7, 0x43, 0xa7, 0x1e, 0xe, 0x54, 0xa,
+ 0xf7, 0xc, 0xf8, 0xe5, 0x15, 0xeb, 0x6, 0xeb,
+ 0xf7, 0x21, 0x5, 0x31, 0x6, 0x57, 0x34, 0x50,
+ 0xe2, 0x5, 0x31, 0x6, 0xe, 0xfb, 0x53, 0xfb,
+ 0x60, 0x76, 0xf7, 0x5b, 0xd6, 0xf8, 0x32, 0xd6,
+ 0x1, 0xa9, 0xe4, 0x3, 0xf7, 0x67, 0x76, 0x15,
+ 0x7b, 0x3d, 0x5, 0x9b, 0xc0, 0x86, 0x69, 0x8d,
+ 0x1f, 0x78, 0x8c, 0x48, 0x84, 0x60, 0x1b, 0x89,
+ 0x4e, 0x5, 0xf7, 0x13, 0xcb, 0xb2, 0xbb, 0xc2,
+ 0x5d, 0xa0, 0x6a, 0x1f, 0x91, 0xaf, 0xda, 0x91,
+ 0xf1, 0xb6, 0xa2, 0xf7, 0x2a, 0x19, 0x36, 0x96,
+ 0x5, 0x71, 0x87, 0x7a, 0xfb, 0x1, 0xfb, 0x2,
+ 0x1b, 0xfb, 0x23, 0x8c, 0xf7, 0x3d, 0xad, 0xd9,
+ 0x9c, 0xf7, 0x19, 0xf7, 0x13, 0xc2, 0xba, 0x6d,
+ 0x3c, 0x9c, 0x1f, 0xe0, 0x9a, 0x5, 0xf7, 0x7,
+ 0x7c, 0x3a, 0xc1, 0xfb, 0x0, 0x1b, 0xfb, 0x43,
+ 0x51, 0xfb, 0x21, 0xfb, 0x25, 0xfb, 0x2c, 0xd0,
+ 0x27, 0xf7, 0x4, 0x76, 0x1f, 0xe, 0xfb, 0xfa,
+ 0xfb, 0x60, 0x76, 0xf7, 0x75, 0x77, 0x1, 0xeb,
+ 0xf2, 0x3, 0xf7, 0x1a, 0x16, 0x6a, 0x2c, 0x5,
+ 0xa5, 0xbe, 0x85, 0x6b, 0x58, 0x2c, 0x9a, 0x6a,
+ 0x91, 0x1f, 0x86, 0x52, 0x5, 0x87, 0xa1, 0x92,
+ 0x8a, 0xa1, 0x1b, 0xf7, 0x5, 0xbd, 0xb8, 0xba,
+ 0xb6, 0x64, 0xa3, 0x5f, 0x90, 0x1f, 0xa2, 0xc8,
+ 0x5, 0xe, 0x2d, 0x76, 0xf1, 0xd2, 0xf8, 0x25,
+ 0xd3, 0xe7, 0x77, 0x1, 0xbe, 0xe5, 0x3, 0xf7,
+ 0x4a, 0x95, 0x15, 0x69, 0xfb, 0x1, 0xc2, 0x7b,
+ 0xae, 0xf7, 0x0, 0x5, 0x88, 0x98, 0x98, 0x88,
+ 0xa2, 0x1b, 0xcd, 0xf7, 0x18, 0xad, 0xf7, 0x33,
+ 0xa7, 0x1f, 0x37, 0x95, 0x5, 0x2f, 0x7e, 0x45,
+ 0x63, 0x50, 0x1b, 0x7d, 0x84, 0x8d, 0x8d, 0x82,
+ 0x1f, 0xf7, 0x1, 0xf8, 0xa, 0xad, 0x6f, 0x93,
+ 0x68, 0x8f, 0x77, 0x19, 0xe1, 0x98, 0x84, 0xac,
+ 0x7d, 0xd4, 0x32, 0xb2, 0x19, 0xa5, 0xeb, 0x56,
+ 0x9b, 0x6f, 0x2b, 0x5, 0x8f, 0x6c, 0x7f, 0x8b,
+ 0x85, 0x1b, 0x52, 0xfb, 0x44, 0x6f, 0xfb, 0x8b,
+ 0xfb, 0x12, 0xc3, 0x37, 0xd6, 0x67, 0x1f, 0xa2,
+ 0xd7, 0x15, 0x56, 0xac, 0x80, 0xea, 0xb5, 0x1a,
+ 0xd5, 0xa1, 0xf7, 0x22, 0xf7, 0x2b, 0x7e, 0x1e,
+ 0xe, 0x54, 0xa, 0xa0, 0xf8, 0xe5, 0x15, 0xe9,
+ 0x6, 0xc1, 0xe2, 0xbc, 0x34, 0x5, 0xe9, 0x6,
+ 0x24, 0xf7, 0x21, 0x5, 0x34, 0x6, 0xe, 0xfc,
+ 0x31, 0x8b, 0xee, 0xf7, 0xd2, 0xee, 0x1, 0xe2,
+ 0xf3, 0x3, 0xe2, 0x16, 0xf3, 0xee, 0x23, 0x6,
+ 0xf7, 0xd2, 0x4, 0xf3, 0xee, 0x23, 0x6, 0xe,
+ 0xfc, 0x31, 0xfb, 0x12, 0x76, 0xf7, 0x91, 0x77,
+ 0x1, 0xe3, 0xf1, 0x3, 0xe3, 0x8d, 0x15, 0xbe,
+ 0x6, 0x61, 0x85, 0x5a, 0x5d, 0x76, 0x1e, 0xa2,
+ 0x66, 0x5, 0xce, 0xa1, 0x98, 0xe8, 0xad, 0x1a,
+ 0xf3, 0x25, 0x7, 0xe, 0xb9, 0x78, 0xca, 0xed,
+ 0xc7, 0xf7, 0xce, 0xc3, 0xf1, 0xca, 0x1, 0x7d,
+ 0xcb, 0xf7, 0xa, 0xd1, 0xf8, 0x57, 0xca, 0x3,
+ 0xf8, 0x80, 0xf7, 0xbe, 0x15, 0x35, 0x75, 0x3e,
+ 0x81, 0x70, 0x1b, 0x46, 0x50, 0xbb, 0xf5, 0xd7,
+ 0xa9, 0xdf, 0xed, 0x9c, 0xd4, 0x8a, 0x40, 0xa9,
+ 0x1f, 0xc8, 0x99, 0x5, 0xdd, 0x72, 0x3e, 0xaf,
+ 0x3c, 0x1b, 0xfb, 0x14, 0x45, 0x37, 0xfb, 0x18,
+ 0xfb, 0x1c, 0xdc, 0x3d, 0xf7, 0x9, 0xdb, 0xe0,
+ 0xb6, 0xea, 0xa2, 0x1f, 0xfc, 0xcc, 0xd7, 0x15,
+ 0xfb, 0x65, 0xf7, 0x3c, 0xfb, 0x3a, 0xf7, 0x68,
+ 0xf7, 0x68, 0xf7, 0x42, 0xf7, 0x3b, 0xf7, 0x64,
+ 0xf7, 0x67, 0xfb, 0x44, 0xf7, 0x3e, 0xfb, 0x66,
+ 0xfb, 0x66, 0xfb, 0x3e, 0xfb, 0x3d, 0xfb, 0x68,
+ 0x1e, 0xcb, 0x16, 0xf7, 0x44, 0xf7, 0x1f, 0xf7,
+ 0x22, 0xf7, 0x45, 0xf7, 0x45, 0xf7, 0x26, 0xfb,
+ 0x22, 0xfb, 0x44, 0xfb, 0x42, 0xfb, 0x26, 0xfb,
+ 0x1e, 0xfb, 0x45, 0xfb, 0x45, 0xfb, 0x1f, 0xf7,
+ 0x1e, 0xf7, 0x42, 0x1e, 0xe, 0xf7, 0xc, 0x76,
+ 0xae, 0xdf, 0xf7, 0x9e, 0xdf, 0xae, 0x77, 0x1,
+ 0xe1, 0xee, 0x15, 0xd2, 0xd2, 0x5, 0x71, 0xb2,
+ 0xb6, 0x81, 0xb2, 0x1b, 0xb1, 0xb7, 0x95, 0xa5,
+ 0xb2, 0x1f, 0xd2, 0x44, 0xc5, 0xc8, 0x44, 0xd0,
+ 0x5, 0xaa, 0xbd, 0x91, 0xb9, 0xa5, 0x1a, 0xa6,
+ 0x85, 0xb8, 0x6c, 0xbc, 0x1e, 0xd2, 0xd1, 0x51,
+ 0xc8, 0x44, 0x44, 0x5, 0xa5, 0x64, 0x5f, 0x95,
+ 0x65, 0x1b, 0x64, 0x60, 0x81, 0x71, 0x64, 0x1f,
+ 0x44, 0xd2, 0x51, 0x4e, 0xd2, 0x45, 0x5, 0x6c,
+ 0x5a, 0x85, 0x5e, 0x70, 0x1a, 0x71, 0x91, 0x5d,
+ 0xaa, 0x59, 0x1e, 0x44, 0x46, 0x5, 0xf7, 0xa,
+ 0xf7, 0x53, 0x15, 0xd4, 0xc5, 0xc7, 0xd5, 0xce,
+ 0xcc, 0x52, 0x3f, 0x41, 0x50, 0x50, 0x42, 0x41,
+ 0x51, 0xc6, 0xd5, 0x1e, 0xe, 0x7c, 0xd3, 0xf8,
+ 0x23, 0xd5, 0xf7, 0x50, 0x77, 0x1, 0xae, 0xe5,
+ 0xf7, 0xa7, 0xe3, 0x3, 0xf8, 0x35, 0x16, 0xdd,
+ 0xf9, 0x62, 0x33, 0xfb, 0x97, 0x89, 0x6, 0xb4,
+ 0x70, 0x4d, 0xa9, 0x4a, 0x1b, 0xfb, 0x16, 0x31,
+ 0xfb, 0x2, 0xfb, 0x3d, 0xfb, 0x3a, 0xec, 0x27,
+ 0xf7, 0xf, 0x9e, 0xe9, 0x8e, 0xd9, 0xbc, 0x1f,
+ 0xfb, 0xb8, 0xf7, 0x4d, 0x15, 0xb1, 0x89, 0xf7,
+ 0x3b, 0xf7, 0x18, 0xf6, 0xc4, 0x23, 0x26, 0xfb,
+ 0x46, 0xfb, 0x1c, 0x7b, 0x6f, 0x58, 0x3c, 0xaa,
+ 0xf7, 0x37, 0x1e, 0xe, 0xfb, 0x1e, 0x76, 0xf8,
+ 0xe0, 0xd9, 0xf7, 0x67, 0x77, 0x1, 0xf7, 0x7e,
+ 0xe3, 0x3, 0xf7, 0x7e, 0xfb, 0x33, 0x15, 0xe3,
+ 0xf8, 0xe0, 0x78, 0xa, 0xf7, 0x67, 0x33, 0xfb,
+ 0x67, 0xfb, 0x53, 0x3d, 0xf7, 0x53, 0x6, 0xe,
+ 0xfb, 0x1e, 0x76, 0xf7, 0x4c, 0xd9, 0xf7, 0xf5,
+ 0xd9, 0xf7, 0x4c, 0x77, 0x1, 0xf7, 0x7e, 0xe3,
+ 0x3, 0xb6, 0xa4, 0x15, 0xf7, 0x53, 0xfb, 0x4c,
+ 0xe3, 0xf7, 0x4c, 0x78, 0xa, 0xf7, 0xf5, 0x78,
+ 0xa, 0xf7, 0x4c, 0x33, 0xfb, 0x4c, 0xfb, 0x53,
+ 0x3d, 0xf7, 0x53, 0xfb, 0xf5, 0xfb, 0x53, 0x6,
+ 0xe, 0xfb, 0xb7, 0xf8, 0x2f, 0xc4, 0xf7, 0x46,
+ 0xc4, 0x1, 0xc1, 0xc5, 0xf7, 0x44, 0xc5, 0x3,
+ 0xc1, 0xf8, 0xc2, 0x15, 0x39, 0xcc, 0x4a, 0xdb,
+ 0xdc, 0xcd, 0xcc, 0xdd, 0xda, 0x4a, 0xcd, 0x39,
+ 0x3a, 0x4b, 0x4a, 0x3b, 0x1e, 0xc5, 0x16, 0xbb,
+ 0xb1, 0xb3, 0xbc, 0xbd, 0xb2, 0x63, 0x5b, 0x59,
+ 0x63, 0x63, 0x5a, 0x5b, 0x64, 0xb3, 0xbd, 0x1e,
+ 0xe, 0xfb, 0xfa, 0xf8, 0xf0, 0xf1, 0x1, 0xb3,
+ 0xe5, 0xd4, 0xe5, 0x3, 0xb3, 0xf8, 0xf0, 0x15,
+ 0xe5, 0xf1, 0x31, 0x6, 0xf7, 0x37, 0x25, 0x15,
+ 0xe5, 0xf1, 0x31, 0x6, 0xe, 0x20, 0x78, 0xed,
+ 0xf7, 0x1e, 0xdd, 0xf7, 0x14, 0xec, 0x1, 0xf7,
+ 0x86, 0xef, 0x3, 0xb2, 0xf7, 0x6c, 0x15, 0xf8,
+ 0x8e, 0xdd, 0xfc, 0x8e, 0x6, 0xf7, 0x5f, 0xf7,
+ 0x15, 0x15, 0xef, 0xec, 0x27, 0x6, 0xfc, 0xb3,
+ 0x4, 0xef, 0xed, 0x27, 0x6, 0xe, 0x2d, 0x76,
+ 0xfa, 0xe, 0x77, 0x1, 0xbb, 0xe6, 0xf7, 0x5,
+ 0xc0, 0xf7, 0xf, 0xe7, 0x3, 0xab, 0xf7, 0x52,
+ 0x15, 0x98, 0xfb, 0x52, 0xf7, 0x2b, 0x7a, 0xc3,
+ 0x83, 0x8, 0x31, 0xc0, 0xe6, 0x7, 0xf7, 0x22,
+ 0x90, 0xd4, 0xee, 0xf5, 0x1a, 0xf7, 0x39, 0xfb,
+ 0x23, 0xb0, 0x43, 0x9b, 0x1e, 0xf7, 0x93, 0x7,
+ 0xa7, 0x85, 0xc6, 0x7e, 0x9b, 0x2a, 0xe9, 0x98,
+ 0x18, 0x78, 0xf7, 0x8, 0x3d, 0xc1, 0x27, 0x93,
+ 0x8, 0xb4, 0x56, 0x62, 0x7, 0x22, 0x86, 0x2d,
+ 0x4f, 0x86, 0xfb, 0x17, 0x88, 0x42, 0xda, 0xfb,
+ 0x13, 0xf7, 0x14, 0x83, 0x8, 0xfb, 0xad, 0x7,
+ 0x20, 0x96, 0x71, 0xf7, 0x9, 0x88, 0xa8, 0x8,
+ 0xf7, 0x1c, 0xf7, 0x65, 0x15, 0x26, 0xa8, 0x7f,
+ 0xc1, 0xb5, 0x1a, 0xbf, 0xac, 0xc2, 0xdb, 0x98,
+ 0x1e, 0xc0, 0xfc, 0xf7, 0x15, 0xf7, 0xa1, 0x7,
+ 0xcd, 0x76, 0xc4, 0x73, 0x36, 0x1a, 0x2d, 0x40,
+ 0x63, 0x5b, 0x86, 0x1e, 0xe, 0xfb, 0xfa, 0xf8,
+ 0xf0, 0xf1, 0x1, 0xf7, 0xd, 0xe6, 0x3, 0xf7,
+ 0xd, 0xf8, 0xf0, 0x15, 0xe6, 0xf1, 0x30, 0x6,
+ 0xe, 0xfc, 0x31, 0x68, 0xa, 0xea, 0xe3, 0x3,
+ 0xea, 0x16, 0xe3, 0xf8, 0x9f, 0x7a, 0xa, 0x7c,
+ 0xd3, 0xf7, 0x48, 0xd3, 0xf7, 0x2e, 0xd6, 0x1,
+ 0xc3, 0xe5, 0xf7, 0x91, 0xe5, 0x3, 0xf7, 0x16,
+ 0xf7, 0x81, 0x15, 0xf8, 0x16, 0x6, 0xf7, 0x9c,
+ 0xfb, 0x34, 0xb0, 0x41, 0xfb, 0x32, 0x37, 0xfb,
+ 0x11, 0xfb, 0x32, 0xfb, 0x34, 0xdc, 0xfb, 0x2,
+ 0xf7, 0x35, 0xf7, 0x14, 0xd8, 0xd4, 0xed, 0xa5,
+ 0x1e, 0x31, 0x96, 0x5, 0x6d, 0x80, 0x6c, 0x3b,
+ 0x28, 0x1b, 0x3d, 0x48, 0xc3, 0xf7, 0x10, 0x84,
+ 0x1f, 0x90, 0xd3, 0x15, 0xcf, 0x90, 0xb7, 0xe1,
+ 0xed, 0x1b, 0xe7, 0xbf, 0x3d, 0x3f, 0x1f, 0xe,
+ 0x4a, 0xa, 0xce, 0xf7, 0x1d, 0x1, 0xf8, 0x34,
+ 0xe5, 0x3, 0x3f, 0xa, 0xfb, 0x28, 0xfc, 0x85,
+ 0x29, 0xa, 0xe, 0x4a, 0xa, 0xf7, 0x60, 0x77,
+ 0x1, 0xf8, 0x34, 0xe5, 0x3, 0x3a, 0xa, 0x31,
+ 0xfc, 0x85, 0x29, 0xa, 0xe, 0x4a, 0xa, 0xd7,
+ 0xef, 0x1, 0xf7, 0xae, 0x8b, 0xf7, 0x1a, 0xe5,
+ 0x3, 0x3e, 0xa, 0xfb, 0x4c, 0xfc, 0x69, 0x15,
+ 0xf8, 0x2, 0x6, 0xf7, 0x1c, 0x65, 0xd8, 0x56,
+ 0xb0, 0x1e, 0xb0, 0x56, 0x52, 0x91, 0x74, 0x1b,
+ 0xfb, 0x38, 0x4c, 0xfb, 0xa, 0xfb, 0x31, 0x86,
+ 0x1f, 0x2d, 0xa, 0x7b, 0x7c, 0x3a, 0x23, 0x1b,
+ 0x37, 0x5e, 0xc2, 0xf7, 0x11, 0x7e, 0x1f, 0x90,
+ 0xd3, 0x15, 0xcf, 0x96, 0xa2, 0xdc, 0xf2, 0x1b,
+ 0xec, 0xab, 0x42, 0x3f, 0x90, 0x1f, 0xe, 0x4a,
+ 0xa, 0xcf, 0xf7, 0x1c, 0x1, 0xf8, 0x34, 0xe5,
+ 0x3, 0xf7, 0x20, 0xf7, 0x81, 0x29, 0xa, 0xfb,
+ 0x2e, 0xf7, 0xb5, 0x4c, 0xa, 0x4a, 0xf7, 0x1c,
+ 0x59, 0xa, 0x78, 0xd2, 0xf7, 0xb2, 0xaf, 0x67,
+ 0xd1, 0xf7, 0x74, 0xd2, 0x12, 0xc1, 0xe7, 0xf7,
+ 0x9d, 0xe7, 0x13, 0xdc, 0xf7, 0x45, 0xf8, 0xa,
+ 0x15, 0x31, 0x5a, 0xfb, 0x10, 0x56, 0xfb, 0xc,
+ 0xe6, 0x2b, 0xf7, 0x28, 0xf7, 0x27, 0xe8, 0xeb,
+ 0xf7, 0x9, 0xed, 0x52, 0xc5, 0x3b, 0xa3, 0x1f,
+ 0x8d, 0x7, 0xab, 0x96, 0xd6, 0xb0, 0xec, 0x1a,
+ 0xe9, 0x3f, 0xe3, 0xfb, 0x1c, 0xfb, 0x18, 0x40,
+ 0x39, 0x29, 0x21, 0xd9, 0x6c, 0xaa, 0x81, 0x1e,
+ 0x7a, 0xf7, 0x2a, 0x15, 0xc2, 0xb6, 0xbe, 0xd4,
+ 0xcf, 0xbe, 0x5c, 0x4b, 0x1e, 0x13, 0xbc, 0x4c,
+ 0x58, 0x59, 0x48, 0x51, 0x50, 0xb3, 0xd9, 0x1e,
+ 0x6d, 0xfb, 0xde, 0x15, 0xd3, 0xbe, 0xd1, 0xe9,
+ 0xdb, 0xd1, 0x53, 0x33, 0x33, 0x48, 0x55, 0x3a,
+ 0x31, 0x52, 0xcc, 0xda, 0x1e, 0xe, 0xf7, 0xc9,
+ 0x8b, 0xf5, 0x1, 0xf7, 0x7, 0xef, 0xf7, 0x7d,
+ 0xef, 0xf7, 0x81, 0xef, 0x3, 0xf7, 0x7, 0x16,
+ 0xef, 0xf5, 0x27, 0x6, 0xf7, 0xe1, 0x21, 0x15,
+ 0xef, 0xf5, 0x27, 0x6, 0xf7, 0xe5, 0x21, 0x15,
+ 0xef, 0xf5, 0x27, 0x6, 0xe, 0xf7, 0xc9, 0xf7,
+ 0x84, 0xd4, 0x1, 0xf7, 0x84, 0x4, 0xfa, 0x7c,
+ 0xd4, 0xfe, 0x7c, 0x6, 0xe, 0xf7, 0x84, 0xd4,
+ 0x1, 0xf7, 0x84, 0x4, 0xf8, 0xc0, 0xd4, 0xfc,
+ 0xc0, 0x6, 0xe, 0x20, 0xf7, 0x7, 0xdb, 0xf7,
+ 0x7, 0xdb, 0x1, 0xb2, 0xf7, 0xca, 0x15, 0xf8,
+ 0x8e, 0xdb, 0xfc, 0x8e, 0x6, 0xfb, 0xa7, 0x4,
+ 0xf8, 0x8e, 0xdb, 0xfc, 0x8e, 0x6, 0xe, 0x7c,
+ 0xd5, 0xf8, 0x1d, 0xda, 0xf7, 0x62, 0x77, 0x1,
+ 0xae, 0xe6, 0xf7, 0xc5, 0xe6, 0x3, 0xf7, 0x41,
+ 0xf8, 0xc0, 0x15, 0xf7, 0xc, 0xc4, 0xb0, 0x61,
+ 0x97, 0x76, 0xa1, 0x5f, 0x19, 0x98, 0x6f, 0x6b,
+ 0x97, 0x59, 0x1b, 0x30, 0xfb, 0x14, 0x50, 0xfb,
+ 0x6c, 0xfb, 0x71, 0xf7, 0x15, 0x59, 0xea, 0xf7,
+ 0x27, 0xf7, 0x8, 0xf4, 0xf7, 0x3a, 0xf7, 0x27,
+ 0x4e, 0xf7, 0x12, 0x29, 0xf7, 0x8, 0x1f, 0xe4,
+ 0xb6, 0x72, 0xbc, 0x21, 0x58, 0x75, 0xa0, 0x83,
+ 0x90, 0x6b, 0xa4, 0x19, 0xfb, 0x0, 0x6, 0xb6,
+ 0x6d, 0x9d, 0x7f, 0xb5, 0x62, 0x20, 0x5a, 0x18,
+ 0x76, 0xfb, 0xf1, 0x15, 0xf7, 0x21, 0xd3, 0xc2,
+ 0xc9, 0xea, 0xd7, 0x64, 0xfb, 0x31, 0xfb, 0x30,
+ 0x22, 0x62, 0x48, 0x6b, 0x26, 0x99, 0xf7, 0x4b,
+ 0x1e, 0xe, 0xfc, 0x31, 0x8b, 0xef, 0xf7, 0x88,
+ 0xef, 0xf7, 0xa6, 0x77, 0xb7, 0x77, 0x1, 0xe5,
+ 0xec, 0x35, 0xd7, 0x3, 0xe5, 0x16, 0xec, 0xef,
+ 0x2a, 0x6, 0xa2, 0xdb, 0x15, 0xc1, 0x6, 0x9f,
+ 0xf8, 0xf, 0x5, 0xf7, 0x33, 0x2a, 0xfb, 0x33,
+ 0x7, 0xe, 0xfb, 0xfa, 0xfb, 0x42, 0x76, 0xf8,
+ 0xfe, 0xef, 0x1, 0xf7, 0xa, 0xec, 0x33, 0xd8,
+ 0x3, 0xf7, 0xa, 0xf8, 0x3b, 0x15, 0xec, 0xef,
+ 0x2a, 0x6, 0xfc, 0xc6, 0x4, 0xfb, 0x30, 0xec,
+ 0xf7, 0x30, 0x7, 0x75, 0xf8, 0xf, 0x5, 0x53,
+ 0x6, 0xe, 0x4b, 0xa, 0xf8, 0x56, 0xcf, 0xf7,
+ 0x66, 0x77, 0x1, 0xd7, 0xe3, 0x3, 0xd7, 0x16,
+ 0xe3, 0xf8, 0x56, 0xed, 0xcf, 0x29, 0xbc, 0x6,
+ 0xc2, 0xa7, 0xb4, 0xc3, 0x76, 0x1e, 0x98, 0xd8,
+ 0x5, 0x8b, 0x72, 0x94, 0x7a, 0xfb, 0x23, 0x8b,
+ 0xfb, 0x3, 0x59, 0x1e, 0x5a, 0x4d, 0x47, 0xc9,
+ 0x7, 0xe, 0x5b, 0xa, 0xf7, 0x3d, 0x3b, 0xa,
+ 0xf7, 0x95, 0xfc, 0x56, 0x15, 0xe3, 0xf8, 0x9a,
+ 0x33, 0x6, 0xed, 0x4, 0x6d, 0xa, 0x78, 0xd2,
+ 0xf7, 0xe0, 0xd8, 0xf7, 0x3f, 0xdf, 0x12, 0xf8,
+ 0x2a, 0xeb, 0x17, 0xab, 0xf7, 0x46, 0x15, 0xfb,
+ 0x2e, 0x99, 0xf7, 0x16, 0x60, 0xe5, 0x1b, 0xf7,
+ 0x36, 0xe1, 0xf7, 0x9, 0xf7, 0x13, 0xf7, 0x2f,
+ 0xfb, 0x25, 0xdc, 0x23, 0x59, 0x61, 0x78, 0x72,
+ 0x74, 0x1f, 0xb3, 0xf7, 0x4f, 0x5, 0xf7, 0xb6,
+ 0xdf, 0xfb, 0xfd, 0x6, 0x43, 0xfb, 0xfe, 0xe0,
+ 0x81, 0x5, 0xb1, 0xa3, 0xba, 0xa9, 0xc8, 0x1b,
+ 0xdf, 0xd1, 0x56, 0x21, 0x30, 0x54, 0x39, 0x2a,
+ 0x1f, 0x6f, 0x2f, 0x92, 0xf7, 0x12, 0x77, 0x1f,
+ 0xe, 0x5b, 0xa, 0xf7, 0x3b, 0x3b, 0xa, 0xf7,
+ 0x93, 0xfc, 0x56, 0x15, 0xe3, 0xf9, 0x58, 0x7a,
+ 0xa, 0xfb, 0x4e, 0x76, 0xf9, 0x22, 0xcf, 0xf7,
+ 0x20, 0xdd, 0x1, 0x90, 0xfb, 0xb, 0x15, 0x7b,
+ 0x3f, 0x5, 0x7f, 0xca, 0xa0, 0x8b, 0x92, 0x1b,
+ 0xda, 0xbe, 0xb3, 0xe2, 0x9a, 0x1f, 0xe9, 0xf8,
+ 0xa3, 0x5, 0xef, 0x6, 0x97, 0xcf, 0x5, 0x27,
+ 0x6, 0x98, 0xc8, 0x5, 0xbf, 0x95, 0x94, 0xa6,
+ 0xba, 0x1b, 0xa0, 0x9c, 0x87, 0x83, 0xaf, 0x1f,
+ 0x9c, 0xd6, 0x5, 0x95, 0x68, 0x7a, 0x94, 0x64,
+ 0x1b, 0xfb, 0x4, 0x6c, 0x27, 0x4e, 0x7e, 0x1f,
+ 0x7f, 0x4e, 0x5, 0x28, 0x6, 0x80, 0x47, 0x5,
+ 0xed, 0x6, 0x33, 0xfc, 0x8a, 0x5, 0x5f, 0x84,
+ 0x73, 0x6c, 0x6c, 0x1b, 0x7b, 0x76, 0x8e, 0x93,
+ 0x65, 0x1f, 0xe, 0xa0, 0x76, 0xf7, 0x3d, 0xda,
+ 0xf8, 0x5b, 0x77, 0x1, 0xf7, 0xb3, 0xe3, 0x3,
+ 0xa4, 0xf7, 0x3d, 0x15, 0xf7, 0xcd, 0xfb, 0x3d,
+ 0xe3, 0xf7, 0x3d, 0xec, 0xda, 0x2a, 0xf8, 0x5b,
+ 0x43, 0x6, 0xfb, 0xdd, 0xfc, 0x5b, 0x5, 0xe2,
+ 0x16, 0xf7, 0x73, 0xf7, 0xd3, 0x5, 0x8e, 0xfb,
+ 0xd3, 0x6, 0xe, 0xfc, 0xa0, 0x8d, 0x76, 0xf9,
+ 0x66, 0x77, 0x1, 0x32, 0x78, 0x15, 0xf8, 0x3a,
+ 0xf9, 0x66, 0x5, 0x3f, 0x6, 0xfc, 0x3b, 0xfd,
+ 0x66, 0x5, 0xe, 0xfb, 0x70, 0xd4, 0xf7, 0x1c,
+ 0xd3, 0xf8, 0x29, 0xd3, 0x12, 0xcb, 0xe5, 0xf7,
+ 0x94, 0xe4, 0x39, 0xdd, 0x13, 0xf8, 0xc9, 0x55,
+ 0x15, 0xfb, 0x28, 0x87, 0xf7, 0x23, 0x79, 0xcc,
+ 0x1b, 0xf7, 0x47, 0xc1, 0xf7, 0x2, 0xf7, 0x3d,
+ 0x1f, 0xf8, 0x66, 0x3a, 0x4d, 0x89, 0x7, 0xd2,
+ 0x54, 0x49, 0x8f, 0x6e, 0x1b, 0xfb, 0x36, 0x4b,
+ 0xfb, 0x34, 0xfb, 0x12, 0xfb, 0x20, 0xdc, 0xfb,
+ 0xf, 0xf7, 0x25, 0x1f, 0x13, 0xb8, 0xb4, 0xc1,
+ 0x95, 0xc5, 0xbc, 0x1f, 0x24, 0x8e, 0x26, 0xfb,
+ 0x27, 0x24, 0x7f, 0xc0, 0xa6, 0x87, 0x1e, 0x7a,
+ 0xf7, 0xd3, 0x15, 0xf7, 0x11, 0xc5, 0xe4, 0xd9,
+ 0x1e, 0x13, 0xf4, 0xc8, 0xe5, 0x49, 0xfb, 0x28,
+ 0x2c, 0x67, 0x2b, 0xfb, 0x7, 0x26, 0x68, 0xf7,
+ 0x15, 0xc9, 0x1f, 0xe, 0x3b, 0x7c, 0xd3, 0xf8,
+ 0xeb, 0xd3, 0x12, 0xce, 0xe3, 0xf7, 0x22, 0xe5,
+ 0x80, 0xe0, 0x9f, 0xe5, 0x13, 0xec, 0xce, 0x16,
+ 0xe3, 0xf8, 0x7e, 0x6, 0xce, 0x93, 0xee, 0xf7,
+ 0x7, 0xc3, 0xb5, 0x6a, 0x5f, 0x1e, 0x13, 0xf4,
+ 0x57, 0x3c, 0x30, 0x4e, 0x44, 0xf7, 0x4c, 0x38,
+ 0x3c, 0x1a, 0x5d, 0x62, 0x64, 0x5a, 0x6e, 0x69,
+ 0x97, 0xd0, 0x66, 0x1e, 0x3f, 0x67, 0x5, 0x67,
+ 0x9c, 0xbf, 0x3a, 0xf7, 0x1, 0x1b, 0xf7, 0x0,
+ 0xd1, 0xd2, 0xe1, 0x1f, 0xf7, 0x14, 0xfb, 0x4c,
+ 0xc0, 0xbf, 0x1a, 0x13, 0xec, 0xc2, 0xd5, 0xe9,
+ 0xc2, 0x1a, 0xd2, 0x4b, 0xd9, 0xfb, 0x9, 0xfb,
+ 0x21, 0x43, 0x35, 0xfb, 0x2c, 0x1e, 0xe, 0xfb,
+ 0xfa, 0xf8, 0xf8, 0x76, 0xf7, 0x25, 0x77, 0x1,
+ 0xf7, 0x29, 0xf8, 0xe5, 0x15, 0xc9, 0x6, 0x2f,
+ 0xf7, 0x21, 0x5, 0x22, 0x6, 0xe, 0x71, 0xa,
+ 0x96, 0x15, 0xf8, 0x7c, 0xf7, 0x5c, 0x5, 0xdd,
+ 0x7, 0xfc, 0x7c, 0xf7, 0x5e, 0x5, 0x34, 0x7,
+ 0xf8, 0x1a, 0xfb, 0x30, 0xfc, 0x1a, 0xfb, 0x2e,
+ 0x5, 0xe, 0x3c, 0x52, 0xa, 0xf7, 0x93, 0xf7,
+ 0x16, 0x15, 0xd9, 0x6, 0xfb, 0xc, 0xf7, 0x5e,
+ 0xf7, 0xc, 0xf7, 0x5f, 0x5, 0x3d, 0x6, 0xfb,
+ 0x27, 0xfb, 0x5f, 0x5, 0xf7, 0xd1, 0xfb, 0x5e,
+ 0x15, 0xdb, 0x6, 0xfb, 0xe, 0xf7, 0x5e, 0xf7,
+ 0xe, 0xf7, 0x5f, 0x5, 0x3b, 0x6, 0xfb, 0x27,
+ 0xfb, 0x5f, 0x5, 0xe, 0x3c, 0x52, 0xa, 0xf7,
+ 0xa9, 0xf7, 0x16, 0x15, 0xdc, 0x6, 0xf7, 0x27,
+ 0xf7, 0x5e, 0xfb, 0x27, 0xf7, 0x5f, 0x5, 0x3a,
+ 0x6, 0xf7, 0xd, 0xfb, 0x5f, 0x5, 0xfb, 0xb7,
+ 0xfb, 0x5e, 0x15, 0xda, 0x6, 0xf7, 0x28, 0xf7,
+ 0x5e, 0xfb, 0x28, 0xf7, 0x5f, 0x5, 0x3c, 0x6,
+ 0xf7, 0xd, 0xfb, 0x5f, 0x5, 0xe, 0xfb, 0xfa,
+ 0x52, 0xa, 0xf7, 0x6b, 0xf7, 0x16, 0x15, 0xc1,
+ 0x6, 0x36, 0xf7, 0x5e, 0xe0, 0xf7, 0x5f, 0x5,
+ 0x55, 0x6, 0xfb, 0xa, 0xfb, 0x5f, 0x5, 0xe,
+ 0xfb, 0xd9, 0x52, 0xa, 0xec, 0xf7, 0x16, 0x15,
+ 0xc3, 0x6, 0xf7, 0x8, 0xf7, 0x60, 0xfb, 0x8,
+ 0xf7, 0x5d, 0x5, 0x53, 0x6, 0xe2, 0xfb, 0x5d,
+ 0x5, 0xe, 0xa0, 0x76, 0xf8, 0x5a, 0xd7, 0xf7,
+ 0x50, 0x77, 0x1, 0xcc, 0xe3, 0xf7, 0x8e, 0xe3,
+ 0x3, 0xcc, 0x16, 0xe3, 0xf7, 0xaf, 0x6, 0xdd,
+ 0xb2, 0xe4, 0xf4, 0xf7, 0x1, 0x88, 0x2a, 0x6d,
+ 0x1e, 0xfb, 0xdb, 0xe3, 0xf7, 0xdb, 0x7, 0xf7,
+ 0x8, 0x49, 0xe2, 0xfb, 0x14, 0x66, 0x59, 0x85,
+ 0x4a, 0x52, 0x1e, 0xf7, 0x97, 0x33, 0x7, 0xe,
+ 0xfb, 0xfa, 0xf8, 0xe5, 0xf7, 0x21, 0x1, 0xf7,
+ 0x58, 0xf8, 0xe5, 0x60, 0xa, 0xfb, 0x9b, 0xfb,
+ 0x21, 0x60, 0xa, 0xe, 0xfb, 0xfa, 0xf7, 0x7c,
+ 0xe5, 0x1, 0xb7, 0xf7, 0x7c, 0x15, 0xf7, 0x89,
+ 0xe5, 0xfb, 0x89, 0x6, 0xe, 0xfc, 0x69, 0xa0,
+ 0x76, 0xf9, 0x1, 0xec, 0x1, 0xf7, 0x24, 0xe3,
+ 0x3, 0xce, 0x16, 0xe3, 0xf8, 0x98, 0x33, 0x6,
+ 0xf4, 0x4, 0x6d, 0xa, 0x62, 0xa, 0xcc, 0xf8,
+ 0xe3, 0x15, 0xd2, 0x6, 0xf7, 0x12, 0xf7, 0x23,
+ 0x38, 0xa, 0x57, 0x50, 0xa, 0x4b, 0xa, 0xf8,
+ 0xe9, 0xf7, 0x1d, 0x1, 0xea, 0xe3, 0x3, 0x85,
+ 0xf8, 0xe9, 0x15, 0xee, 0x6, 0xbb, 0xde, 0xb6,
+ 0x38, 0x5, 0xf0, 0x6, 0x26, 0x42, 0xa, 0x8f,
+ 0x50, 0xa, 0x4b, 0xa, 0xf8, 0xf2, 0xef, 0x12,
+ 0x98, 0xe5, 0x83, 0xe3, 0x84, 0xe5, 0x13, 0xd0,
+ 0xea, 0x16, 0xe3, 0xf8, 0x99, 0x33, 0x6, 0x13,
+ 0xe8, 0x39, 0xe4, 0x58, 0xa, 0x62, 0xa, 0xf7,
+ 0x17, 0xf8, 0xea, 0x15, 0xd4, 0x6, 0x39, 0xf7,
+ 0x1c, 0x38, 0xa, 0xe3, 0x50, 0xa, 0xfc, 0x69,
+ 0xfb, 0x51, 0x76, 0xf9, 0xd3, 0xec, 0x1, 0xce,
+ 0xe3, 0x3, 0x8c, 0xfb, 0x12, 0x15, 0x7a, 0x40,
+ 0x5, 0x85, 0xa2, 0x9e, 0x88, 0x9c, 0x1b, 0xdc,
+ 0xaa, 0xc7, 0xf7, 0xe, 0x1f, 0xf8, 0xb5, 0x33,
+ 0xfc, 0xb5, 0x7, 0x2d, 0x72, 0x7d, 0x62, 0x95,
+ 0x1e, 0xcd, 0xf9, 0x7f, 0x15, 0x6d, 0xa, 0xfb,
+ 0x53, 0x44, 0xa, 0xf7, 0x62, 0x6, 0xca, 0xc6,
+ 0xf7, 0x43, 0xfb, 0x9d, 0x5, 0xf7, 0x0, 0x6,
+ 0xfb, 0x71, 0xf7, 0xda, 0xf7, 0x5a, 0xf7, 0x54,
+ 0x5, 0xfb, 0x6, 0x6, 0xfb, 0x65, 0xfb, 0x66,
+ 0x5, 0xf8, 0x2e, 0x33, 0x7, 0xe, 0xfc, 0x69,
+ 0x44, 0xa, 0xf9, 0x62, 0x7a, 0xa, 0x71, 0xa,
+ 0xf7, 0x69, 0x15, 0xf8, 0x7c, 0xfb, 0x5e, 0x5,
+ 0xe2, 0x7, 0xfc, 0x1a, 0xf7, 0x30, 0xf8, 0x1a,
+ 0xf7, 0x2e, 0x5, 0xe2, 0x7, 0xfc, 0x7c, 0xfb,
+ 0x5c, 0x5, 0xe, 0x20, 0xf7, 0x15, 0x76, 0x1,
+ 0xb2, 0xf7, 0xc8, 0x15, 0xf8, 0x27, 0xfb, 0x5c,
+ 0xde, 0xf7, 0xae, 0xfc, 0x7a, 0x6, 0xe, 0xfc,
+ 0x69, 0x44, 0xa, 0xf7, 0xf9, 0x6, 0xe2, 0xd6,
+ 0x5, 0xd8, 0x7, 0x34, 0x40, 0x5, 0xf7, 0xb0,
+ 0x33, 0xfb, 0xfb, 0x7, 0x34, 0x43, 0x5, 0x3e,
+ 0x7, 0xe2, 0xd3, 0x5, 0xe, 0xf7, 0x22, 0x6f,
+ 0xa, 0xf7, 0x70, 0xe3, 0xf7, 0x70, 0xe3, 0x17,
+ 0xcc, 0x16, 0xe3, 0xf7, 0xa1, 0x6, 0xcc, 0x9c,
+ 0xf7, 0x14, 0xf7, 0x2, 0xe1, 0x92, 0x3f, 0x5a,
+ 0x1e, 0xfb, 0xe5, 0xe3, 0xf7, 0xc1, 0x7, 0xdc,
+ 0xb2, 0xdb, 0xe3, 0xe8, 0x8b, 0x36, 0x59, 0x1e,
+ 0xfb, 0xdb, 0xe3, 0xf7, 0xf3, 0x7, 0xb0, 0x76,
+ 0xf7, 0x2a, 0xfb, 0x34, 0x2a, 0x72, 0x4c, 0x6f,
+ 0x79, 0x1e, 0xc7, 0x76, 0x42, 0xaa, 0x41, 0x1b,
+ 0x40, 0x6c, 0x5e, 0x5d, 0x6f, 0x1f, 0x13, 0xf8,
+ 0x89, 0x8a, 0x5, 0xd3, 0x3c, 0x7, 0xe, 0xfb,
+ 0xfa, 0xf9, 0x7, 0xc4, 0x1, 0x95, 0xf9, 0x7,
+ 0x15, 0xf7, 0xcd, 0xc4, 0xfb, 0xcd, 0x6, 0xe,
+ 0x20, 0xb2, 0xf7, 0x6c, 0x15, 0xf8, 0x8e, 0xd4,
+ 0xfc, 0x8e, 0x6, 0xe, 0xfb, 0x4e, 0x76, 0xf7,
+ 0x57, 0xda, 0x48, 0xce, 0xf8, 0x5c, 0x77, 0x4e,
+ 0xa, 0x13, 0xdc, 0xf7, 0x33, 0xbf, 0x15, 0x6f,
+ 0x9f, 0xa8, 0x67, 0xd4, 0x1b, 0xdd, 0xa9, 0xb9,
+ 0xa6, 0x9b, 0x1f, 0x8d, 0x6, 0x13, 0xbc, 0x4e,
+ 0xd9, 0xf8, 0x9f, 0x33, 0xfb, 0x75, 0x7, 0xfb,
+ 0x10, 0x8a, 0x20, 0xfb, 0xb, 0xfb, 0x11, 0x8b,
+ 0xf7, 0xf, 0xf7, 0x1, 0x1e, 0xf7, 0x74, 0x33,
+ 0xfd, 0x6e, 0xe4, 0xf7, 0x97, 0x7, 0xe, 0x20,
+ 0xa0, 0x76, 0xf8, 0x8e, 0x77, 0x1, 0xb3, 0xd1,
+ 0xf8, 0x1, 0xd0, 0x3, 0xb2, 0xd1, 0x15, 0xd1,
+ 0x45, 0xf7, 0x4c, 0xf7, 0x4b, 0xf7, 0x4a, 0xfb,
+ 0x4b, 0xd1, 0xd2, 0xfb, 0x49, 0xf7, 0x4a, 0xf7,
+ 0x48, 0xf7, 0x49, 0x46, 0xd2, 0xfb, 0x49, 0xfb,
+ 0x4c, 0xfb, 0x4c, 0xf7, 0x4d, 0x45, 0x43, 0xf7,
+ 0x4a, 0xfb, 0x4a, 0x5, 0xe, 0x6f, 0xa, 0xf7,
+ 0x8e, 0xe3, 0x17, 0xcc, 0x16, 0xe3, 0xf7, 0xaf,
+ 0x6, 0xe0, 0xac, 0xe9, 0xf7, 0x0, 0xf7, 0x0,
+ 0x8c, 0x25, 0x5e, 0x1e, 0xfb, 0xcf, 0xe3, 0xf7,
+ 0xcf, 0x7, 0xf7, 0xe, 0x4a, 0xf0, 0xfb, 0x18,
+ 0x68, 0x4d, 0x7c, 0x3d, 0x58, 0x1e, 0x13, 0xf0,
+ 0x89, 0xd4, 0x3c, 0x6, 0xe, 0x78, 0xd2, 0xf7,
+ 0x47, 0xd7, 0xf7, 0xdd, 0xd4, 0x1, 0xc6, 0xe5,
+ 0xf7, 0x9d, 0xec, 0x3, 0xc2, 0xf7, 0x30, 0x15,
+ 0xfb, 0x3b, 0xa0, 0xf7, 0x30, 0x83, 0xb2, 0x1b,
+ 0xf7, 0x86, 0x8c, 0xf7, 0xc0, 0xd9, 0xf7, 0x61,
+ 0x4e, 0xf7, 0x1f, 0xfb, 0x4a, 0xfb, 0x18, 0x2a,
+ 0x23, 0xfb, 0x20, 0xfb, 0x27, 0xf7, 0xb, 0x3a,
+ 0xf7, 0x2, 0xe0, 0xb8, 0xc0, 0xb3, 0xa3, 0x1f,
+ 0x8d, 0x6, 0x47, 0x8c, 0x88, 0xfb, 0x60, 0xfb,
+ 0x2e, 0x1b, 0x29, 0x6e, 0xdf, 0xa6, 0x86, 0x1f,
+ 0x84, 0xf7, 0xbc, 0x15, 0xe7, 0xc2, 0xda, 0xdf,
+ 0xde, 0xca, 0x39, 0x32, 0x38, 0x56, 0x46, 0x2e,
+ 0x3d, 0x4e, 0xc6, 0xe8, 0x1e, 0xe, 0xa0, 0x76,
+ 0xf8, 0x5a, 0xd7, 0xdc, 0x75, 0xa, 0xcc, 0xe3,
+ 0xf7, 0x8e, 0xe3, 0x13, 0xec, 0xcc, 0x16, 0xe3,
+ 0xf7, 0xc2, 0x6, 0xdf, 0xac, 0xcf, 0xf7, 0x0,
+ 0xf7, 0x0, 0x8c, 0x20, 0x5e, 0x1e, 0xfb, 0xc2,
+ 0xe3, 0xf7, 0xc2, 0x7, 0xf7, 0x19, 0x52, 0xea,
+ 0xfb, 0x20, 0x68, 0x4d, 0x83, 0x3e, 0x58, 0x1e,
+ 0x89, 0xd4, 0x3c, 0x6, 0xbd, 0xe8, 0x15, 0xcc,
+ 0x6, 0xbb, 0xab, 0x8a, 0x90, 0x9f, 0xa4, 0x7f,
+ 0x7f, 0xa3, 0x1e, 0x80, 0xa2, 0x9f, 0x80, 0x9c,
+ 0x1b, 0xa1, 0xd0, 0x90, 0xf6, 0x90, 0x1f, 0x4b,
+ 0x6, 0x13, 0xdc, 0x68, 0x87, 0x80, 0x84, 0x77,
+ 0x1b, 0x86, 0x78, 0x95, 0x96, 0x70, 0x1f, 0x13,
+ 0xec, 0x96, 0x72, 0x6d, 0x94, 0x74, 0x1b, 0x5a,
+ 0x59, 0x68, 0x3e, 0x1f, 0xe, 0xa0, 0x76, 0xf7,
+ 0x55, 0xcb, 0xf7, 0x3a, 0xce, 0xf7, 0x5a, 0x77,
+ 0x1, 0xa7, 0xf8, 0x89, 0x3, 0xcb, 0x16, 0xd0,
+ 0x6, 0xb3, 0xf7, 0x55, 0x5, 0xf7, 0x25, 0x6,
+ 0x62, 0xfb, 0x55, 0x5, 0xd1, 0x6, 0xb3, 0xf7,
+ 0x55, 0x5, 0xf7, 0x22, 0xcb, 0xfb, 0x14, 0x6,
+ 0xad, 0xf7, 0x3a, 0x5, 0xe9, 0xce, 0x3b, 0x6,
+ 0xb2, 0xf7, 0x5a, 0x5, 0x47, 0x6, 0x62, 0xfb,
+ 0x5a, 0x5, 0xfb, 0x24, 0x6, 0xb3, 0xf7, 0x5a,
+ 0x5, 0x46, 0x6, 0x62, 0xfb, 0x5a, 0x5, 0xfb,
+ 0x1d, 0x48, 0xf7, 0x10, 0x6, 0x68, 0xfb, 0x3a,
+ 0x5, 0x32, 0x4b, 0xd7, 0x6, 0xd9, 0xcb, 0x15,
+ 0xae, 0xf7, 0x3b, 0x5, 0xf7, 0x2e, 0x6, 0x67,
+ 0xfb, 0x3b, 0x5, 0xe, 0x7d, 0xd3, 0xf8, 0x2c,
+ 0xd3, 0x1, 0xbb, 0xe5, 0xf7, 0xa8, 0xe5, 0x3,
+ 0xae, 0xf7, 0xa0, 0x15, 0xfb, 0x2e, 0xd1, 0xfb,
+ 0x14, 0xf7, 0x41, 0xf7, 0x30, 0xe2, 0xf1, 0xf7,
+ 0x48, 0xf7, 0x5a, 0xfb, 0x1a, 0xd3, 0xfb, 0x1,
+ 0xfb, 0x3c, 0x40, 0xfb, 0x13, 0xfb, 0x23, 0x1e,
+ 0xe5, 0x16, 0xf7, 0x3c, 0xed, 0xa9, 0xc2, 0xda,
+ 0xd5, 0x4f, 0xfb, 0x1e, 0x39, 0x6f, 0xfb, 0x14,
+ 0xfb, 0x11, 0x57, 0x26, 0xb4, 0xf7, 0x3d, 0x1e,
+ 0xe, 0x76, 0xa, 0xc8, 0xf7, 0x1d, 0x1, 0x77,
+ 0xa, 0x3, 0x3f, 0xa, 0xfb, 0x87, 0xfc, 0x6a,
+ 0x23, 0xa, 0xe, 0x76, 0xa, 0xf7, 0x5a, 0x77,
+ 0x1, 0x77, 0xa, 0x3, 0x3a, 0xa, 0xfb, 0x4d,
+ 0xfc, 0x6a, 0x23, 0xa, 0xe, 0x7d, 0xd3, 0xf8,
+ 0x34, 0xd3, 0xc7, 0xef, 0x1, 0x77, 0xa, 0x3,
+ 0x3e, 0xa, 0xfb, 0xab, 0xfc, 0x4e, 0x23, 0xa,
+ 0xe, 0xf7, 0x91, 0x7c, 0xd4, 0xf7, 0x46, 0xd3,
+ 0xf7, 0x32, 0xd3, 0x1, 0xae, 0xe5, 0xf7, 0xc8,
+ 0xe7, 0xf7, 0xb1, 0xe7, 0x3, 0xf8, 0x6f, 0xde,
+ 0x15, 0x3d, 0xbf, 0xd4, 0x77, 0xca, 0x1b, 0xc8,
+ 0xf7, 0x18, 0x9f, 0xf7, 0x2b, 0xb3, 0x1f, 0x3c,
+ 0x98, 0x5, 0x77, 0x85, 0x5e, 0x30, 0x24, 0x1b,
+ 0x2e, 0x5c, 0xd8, 0xf0, 0x8a, 0x1f, 0xf8, 0x10,
+ 0x6, 0xf7, 0xaa, 0xfb, 0x41, 0xa3, 0x49, 0x3d,
+ 0x49, 0x68, 0x4b, 0x5f, 0x1e, 0xc8, 0x61, 0x5a,
+ 0xb1, 0x21, 0x1b, 0xfb, 0xd, 0xfb, 0xe, 0x2c,
+ 0xfb, 0x49, 0xfb, 0x47, 0xf7, 0x1, 0x29, 0xf7,
+ 0x1a, 0xa9, 0xea, 0x8e, 0xea, 0xd3, 0x1f, 0xfb,
+ 0xf2, 0xf7, 0x47, 0x15, 0xf6, 0xc7, 0xec, 0xe8,
+ 0xe0, 0xd1, 0x3c, 0xfb, 0x11, 0xfb, 0x1d, 0x3e,
+ 0x48, 0x3d, 0x63, 0xfb, 0x5, 0xa2, 0xf7, 0x49,
+ 0x1e, 0xf8, 0x24, 0xb9, 0x15, 0xf7, 0x4, 0x94,
+ 0xcf, 0xb5, 0xc8, 0x1b, 0xd7, 0xc8, 0x61, 0xfb,
+ 0x4, 0x95, 0x1f, 0xe, 0xfb, 0xfa, 0xfb, 0x75,
+ 0xc7, 0xf7, 0x39, 0x77, 0x1, 0xd4, 0xc9, 0xc9,
+ 0xe5, 0x3, 0xe8, 0x16, 0x7a, 0x4f, 0x88, 0x6e,
+ 0x76, 0x1a, 0x3d, 0xc1, 0x66, 0xc6, 0xae, 0xb0,
+ 0x97, 0x9d, 0xa8, 0x1e, 0xc2, 0x7, 0x78, 0x6d,
+ 0x6a, 0x85, 0x70, 0x1b, 0x67, 0x71, 0xa1, 0xba,
+ 0x91, 0x88, 0xb9, 0x9e, 0xb7, 0x1f, 0xe, 0x76,
+ 0xa, 0xca, 0xf7, 0x1b, 0x1, 0x77, 0xa, 0x3,
+ 0xb8, 0xf7, 0x9c, 0x23, 0xa, 0xf7, 0x13, 0xf7,
+ 0xe3, 0x4c, 0xa, 0x4a, 0xf7, 0x1b, 0x59, 0xa,
+ 0xa0, 0x76, 0xf8, 0xbe, 0xf7, 0x33, 0x1, 0xf7,
+ 0xa3, 0xe3, 0x3, 0xf7, 0xa3, 0x16, 0xe3, 0xf9,
+ 0x53, 0x48, 0x6, 0x67, 0x42, 0x44, 0x47, 0x37,
+ 0x64, 0x8, 0x36, 0x7, 0xab, 0x97, 0xdd, 0xb3,
+ 0xc3, 0xc1, 0x8, 0xe, 0xf7, 0x23, 0x81, 0xc3,
+ 0x5f, 0x76, 0xf7, 0xc6, 0xc3, 0xf7, 0xfb, 0x77,
+ 0xa0, 0x77, 0x12, 0xf7, 0x2a, 0xd1, 0xf8, 0x6f,
+ 0xd7, 0x13, 0x76, 0xf7, 0x2a, 0xf7, 0xf1, 0x15,
+ 0xd1, 0xf7, 0xf5, 0x57, 0x6, 0x68, 0x60, 0x53,
+ 0x69, 0x69, 0x80, 0x8, 0x51, 0x7, 0xb0, 0x94,
+ 0xb4, 0xa0, 0xa8, 0xa3, 0x8, 0x50, 0xfd, 0x9,
+ 0x15, 0xd7, 0x6, 0x13, 0x6e, 0xf8, 0xa3, 0xf9,
+ 0x66, 0x5, 0x40, 0x6, 0x13, 0xb6, 0xfb, 0x24,
+ 0xfd, 0x5d, 0x15, 0xf7, 0xbe, 0xc3, 0xfb, 0x4d,
+ 0x6, 0xd3, 0xc3, 0x5, 0xcf, 0xba, 0xb6, 0xa4,
+ 0xc8, 0x1a, 0xe9, 0xfb, 0xc, 0x99, 0x76, 0xfb,
+ 0xb, 0x79, 0x46, 0x6a, 0x83, 0x1e, 0xd3, 0x84,
+ 0x5, 0xa6, 0x94, 0x95, 0xa5, 0xc1, 0x1b, 0xb3,
+ 0xa4, 0x79, 0x69, 0x6b, 0x74, 0x7a, 0x41, 0x57,
+ 0x1f, 0x4c, 0x5e, 0x55, 0x5c, 0x85, 0x57, 0x8,
+ 0xe, 0xf7, 0x23, 0x8d, 0x76, 0xdc, 0xbe, 0xf8,
+ 0xe2, 0x77, 0x1, 0xf7, 0x43, 0xce, 0xf8, 0x24,
+ 0xcd, 0x3, 0xf8, 0x67, 0xc9, 0x15, 0xf7, 0x43,
+ 0x44, 0xcd, 0xd2, 0xbb, 0xbe, 0x5b, 0xf7, 0x78,
+ 0x53, 0x6, 0xfb, 0x4d, 0xfb, 0x71, 0x5, 0xd1,
+ 0x84, 0x15, 0xf4, 0xf7, 0xf, 0x5, 0xfb, 0xf,
+ 0x7, 0xfc, 0x67, 0xf7, 0x83, 0x15, 0xce, 0xf7,
+ 0xf3, 0x59, 0x6, 0x6a, 0x60, 0x56, 0x69, 0x6a,
+ 0x81, 0x8, 0x51, 0x7, 0xaf, 0x94, 0xb1, 0x9f,
+ 0xa7, 0xa3, 0x8, 0x5d, 0xfd, 0xa, 0x15, 0xd4,
+ 0x6, 0xf8, 0x8d, 0xf9, 0x63, 0x5, 0x44, 0x6,
+ 0xe, 0xfb, 0xfa, 0xf7, 0xe0, 0x76, 0xf8, 0x3a,
+ 0x77, 0x1, 0xf7, 0x2b, 0xd2, 0x3, 0xf7, 0x2b,
+ 0xf7, 0xcb, 0x15, 0xd2, 0xf8, 0x3a, 0x56, 0x6,
+ 0x68, 0x5e, 0x53, 0x68, 0x68, 0x80, 0x8, 0x4e,
+ 0x7, 0xb1, 0x95, 0xb3, 0xa0, 0xa9, 0xa4, 0x8,
+ 0xe, 0xfb, 0xd5, 0xf7, 0xc4, 0xd1, 0xf7, 0xbe,
+ 0xcc, 0x1, 0xa3, 0xd3, 0xf7, 0x38, 0xce, 0x3,
+ 0xf7, 0xa6, 0xf7, 0xcf, 0x4c, 0xa, 0x78, 0xa7,
+ 0x8b, 0xb3, 0xd6, 0x1a, 0xf7, 0x1e, 0x7, 0xf7,
+ 0x11, 0x3d, 0x9b, 0x48, 0xfb, 0x9, 0x74, 0x3b,
+ 0x62, 0x86, 0x1e, 0xcc, 0x77, 0x5, 0xc9, 0x93,
+ 0xb1, 0x99, 0xad, 0x1b, 0xd6, 0x8e, 0x56, 0x64,
+ 0x1f, 0x82, 0x85, 0x3b, 0x7f, 0x7b, 0x87, 0x8,
+ 0x5a, 0x84, 0x39, 0x7d, 0x22, 0x1a, 0x27, 0xd2,
+ 0x6f, 0xb8, 0xbe, 0xb7, 0xab, 0xa9, 0xa8, 0x1e,
+ 0x75, 0x8f, 0x7d, 0x91, 0x7c, 0x1e, 0x7c, 0xf7,
+ 0x5b, 0x15, 0x5b, 0x8a, 0x7d, 0x81, 0x77, 0x1e,
+ 0x65, 0x79, 0x64, 0x77, 0x68, 0x1b, 0x6a, 0x70,
+ 0x9f, 0xb1, 0xb9, 0xa6, 0x93, 0xcb, 0x97, 0x1f,
+ 0xb7, 0x94, 0x96, 0x8c, 0x9c, 0x91, 0x8, 0xe,
+ 0xfb, 0xda, 0xf7, 0xc4, 0xd0, 0xf7, 0xbb, 0xd0,
+ 0x1, 0xa4, 0xcb, 0xf7, 0x50, 0xcb, 0x3, 0xa4,
+ 0xf8, 0x9e, 0x15, 0xfb, 0x9, 0xc0, 0x26, 0xf4,
+ 0xf7, 0xe, 0xaf, 0xf7, 0x15, 0xe4, 0xe2, 0x68,
+ 0xf7, 0x14, 0xfb, 0xf, 0xfb, 0xd, 0x66, 0xfb,
+ 0xc, 0x2c, 0x1e, 0xcb, 0x16, 0xb2, 0x97, 0xf6,
+ 0xdd, 0xe1, 0x93, 0xfb, 0x12, 0x77, 0x68, 0x83,
+ 0xfb, 0x6, 0x35, 0x35, 0x83, 0xf7, 0x13, 0xa1,
+ 0x1e, 0xe, 0x3b, 0x8a, 0x76, 0xa6, 0xd0, 0xf8,
+ 0x10, 0xd0, 0xa1, 0x77, 0x1, 0xa7, 0xd3, 0xf7,
+ 0xf8, 0xdc, 0x3, 0xb0, 0x97, 0x15, 0xbb, 0x69,
+ 0xc1, 0xcc, 0x5, 0x7d, 0xa3, 0xaf, 0x73, 0xdc,
+ 0x1b, 0xf7, 0x39, 0xe7, 0xf7, 0x3, 0xf7, 0x27,
+ 0xf7, 0x1, 0x69, 0xb7, 0x71, 0xab, 0x1f, 0xc2,
+ 0xcb, 0x5a, 0xac, 0x58, 0x4f, 0x5, 0x9b, 0x6e,
+ 0x5c, 0xa1, 0x3f, 0x1b, 0xfb, 0x3a, 0x35, 0xfb,
+ 0x8, 0xfb, 0x24, 0x2e, 0xaa, 0x53, 0xad, 0x68,
+ 0x1f, 0xba, 0xc6, 0x15, 0x6e, 0xa6, 0x80, 0xb8,
+ 0xbe, 0x1a, 0xf7, 0x3a, 0xf7, 0x17, 0xa6, 0xbc,
+ 0xbe, 0xad, 0x78, 0x7e, 0x9e, 0x1e, 0xfb, 0x60,
+ 0xfb, 0xdc, 0x15, 0xf7, 0x86, 0xf7, 0xaf, 0x5,
+ 0xa1, 0x6f, 0x97, 0x72, 0x4e, 0x1a, 0xfb, 0x34,
+ 0xfb, 0x8, 0x6e, 0x4f, 0x59, 0x6c, 0x91, 0x99,
+ 0x78, 0x1e, 0xe, 0x7d, 0xd3, 0xf8, 0x34, 0xd3,
+ 0xca, 0x75, 0xa, 0x77, 0xa, 0x13, 0xec, 0xf7,
+ 0x7, 0xf8, 0xf5, 0x15, 0xcc, 0x6, 0xbb, 0xac,
+ 0x8a, 0x8f, 0xa2, 0xa4, 0x7f, 0x7f, 0xa2, 0x1e,
+ 0x80, 0xa2, 0x9f, 0x80, 0x9a, 0x1b, 0xa0, 0xd6,
+ 0x8d, 0xf7, 0x2, 0x56, 0xa, 0x87, 0x79, 0x92,
+ 0x96, 0x74, 0x1f, 0x13, 0xdc, 0x70, 0x96, 0x6b,
+ 0x98, 0x72, 0x8a, 0x8, 0x13, 0xec, 0x5a, 0x59,
+ 0x66, 0x40, 0x1f, 0x45, 0xfb, 0xed, 0x23, 0xa,
+ 0xe, 0x66, 0xa, 0xc7, 0xe3, 0xf7, 0x98, 0xe5,
+ 0x3, 0xf7, 0x28, 0xc8, 0x15, 0x68, 0xa5, 0xb3,
+ 0x6c, 0xc9, 0x1b, 0xf7, 0x6, 0xf7, 0x13, 0xe0,
+ 0xf7, 0x4c, 0xf7, 0x25, 0x2d, 0xf7, 0x15, 0xfb,
+ 0x27, 0x2d, 0x70, 0x54, 0x73, 0x7c, 0x1f, 0x89,
+ 0xce, 0x3b, 0xfd, 0x71, 0xe3, 0xf7, 0xa0, 0x6,
+ 0x82, 0xf7, 0x5e, 0x15, 0xf7, 0xd, 0xc2, 0xe0,
+ 0xdf, 0xcd, 0xe0, 0x50, 0xfb, 0x26, 0xfb, 0x3e,
+ 0x28, 0x70, 0x57, 0x4f, 0x3c, 0xb3, 0xf7, 0x30,
+ 0x1e, 0xe, 0xfb, 0x2e, 0xfb, 0x2c, 0x76, 0xf9,
+ 0xba, 0xe0, 0x1, 0x9d, 0xf7, 0xa2, 0xdd, 0xd0,
+ 0x3, 0xf7, 0x6c, 0xfb, 0x41, 0x15, 0xd3, 0xf9,
+ 0xba, 0xdd, 0xfd, 0xba, 0xd0, 0xf9, 0xba, 0xc5,
+ 0xe0, 0xfb, 0x8b, 0x6, 0xfb, 0xf, 0xfb, 0x1,
+ 0x48, 0xfb, 0x1d, 0x27, 0xca, 0x2d, 0xf7, 0x1b,
+ 0x1f, 0xe, 0x70, 0xa, 0x1, 0xcf, 0xe6, 0x3,
+ 0xf7, 0x88, 0xfb, 0x63, 0x15, 0xc2, 0x6, 0x21,
+ 0xf7, 0x3e, 0x69, 0xf7, 0x30, 0xf7, 0x23, 0x1a,
+ 0xf7, 0x6d, 0xd4, 0xf7, 0x1f, 0xce, 0xf7, 0x7,
+ 0x1e, 0x4a, 0x6, 0x21, 0xfb, 0x1f, 0x4f, 0xfb,
+ 0x37, 0xfb, 0x3d, 0x1a, 0xfb, 0x7f, 0xf7, 0x1d,
+ 0xfb, 0x4d, 0xb2, 0x5a, 0x1e, 0xe, 0x70, 0xa,
+ 0x12, 0xf7, 0x42, 0xe6, 0x17, 0xad, 0xfb, 0x61,
+ 0x15, 0xc6, 0x89, 0x5, 0xf5, 0xf7, 0x1f, 0xcd,
+ 0xf7, 0x35, 0xf7, 0x3d, 0x1a, 0xf7, 0x7f, 0xfb,
+ 0x16, 0xf7, 0x4f, 0x64, 0xbc, 0x1e, 0x4d, 0x6,
+ 0x13, 0x20, 0xf5, 0xfb, 0x3e, 0xad, 0xfb, 0x32,
+ 0xfb, 0x23, 0x1a, 0xfb, 0x6d, 0x3d, 0xfb, 0x26,
+ 0x4d, 0x23, 0x1e, 0xe, 0xf7, 0x5a, 0x79, 0xc5,
+ 0x65, 0x76, 0xf7, 0xc5, 0xc4, 0x89, 0xc5, 0xf7,
+ 0x8a, 0xc4, 0x8c, 0x77, 0x12, 0xb2, 0xde, 0xf7,
+ 0x3a, 0xdd, 0xf7, 0x29, 0xdd, 0xf7, 0x3b, 0xdd,
+ 0x13, 0x9b, 0xc0, 0xb2, 0xf8, 0x9d, 0x15, 0xfb,
+ 0x37, 0xf7, 0x2, 0x7a, 0xc0, 0xce, 0xf0, 0xb2,
+ 0xf7, 0x21, 0xf7, 0x27, 0x26, 0xad, 0x48, 0x1e,
+ 0xfb, 0xa, 0x5e, 0x29, 0x38, 0x1f, 0xde, 0x16,
+ 0xae, 0x89, 0xe4, 0xdd, 0xdf, 0x8d, 0x28, 0x72,
+ 0x68, 0x89, 0x34, 0x37, 0x1e, 0x13, 0xa6, 0xc0,
+ 0x39, 0x8d, 0xed, 0xa3, 0x1f, 0xf8, 0x21, 0xfb,
+ 0xfa, 0x15, 0xfb, 0x37, 0xf7, 0x2, 0x79, 0xc0,
+ 0xce, 0xf0, 0xb3, 0xf7, 0x21, 0x1e, 0x13, 0xab,
+ 0xc0, 0xf7, 0x26, 0x26, 0xad, 0x48, 0xfb, 0xb,
+ 0x5f, 0x2a, 0x38, 0x1e, 0xdd, 0x16, 0xae, 0x89,
+ 0xe3, 0xde, 0xdf, 0x8d, 0x29, 0x72, 0x68, 0x89,
+ 0x33, 0x37, 0x38, 0x8d, 0xee, 0xa3, 0x1e, 0x13,
+ 0x67, 0xc0, 0xfc, 0x2b, 0xfb, 0x4a, 0x15, 0xda,
+ 0x6, 0xf8, 0x3b, 0xf9, 0x66, 0x5, 0x3e, 0x6,
+ 0xe, 0xfc, 0x31, 0x8b, 0xf5, 0x1, 0xe2, 0xf3,
+ 0x3, 0xe2, 0x16, 0xf3, 0xf5, 0x23, 0x6, 0xe,
+ 0xfc, 0x31, 0xf7, 0x52, 0xf7, 0x11, 0x1, 0xd8,
+ 0xf7, 0x11, 0x3, 0xd8, 0xf7, 0x52, 0x15, 0xf7,
+ 0x11, 0xf7, 0x11, 0xfb, 0x11, 0x6, 0xe, 0xf7,
+ 0xc9, 0x78, 0xc5, 0xf7, 0x86, 0xc5, 0x88, 0xc6,
+ 0xf7, 0x85, 0xc4, 0x95, 0x77, 0x12, 0x92, 0xd5,
+ 0xf7, 0x1f, 0xd4, 0xd9, 0xd4, 0xf7, 0x1f, 0xd5,
+ 0xbe, 0xd4, 0xf7, 0x1f, 0xd5, 0x13, 0xb7, 0xe0,
+ 0x92, 0xf8, 0x98, 0x15, 0x52, 0x97, 0xfb, 0xf,
+ 0xf7, 0x16, 0xf7, 0x23, 0x8c, 0xf7, 0x1b, 0xb8,
+ 0xb2, 0x86, 0xf7, 0x1e, 0xfb, 0x1f, 0xfb, 0x1a,
+ 0x83, 0xfb, 0x16, 0x5c, 0x1e, 0xd5, 0x16, 0xb1,
+ 0x8a, 0xdd, 0xd0, 0xc4, 0x99, 0x53, 0x4b, 0x5d,
+ 0x83, 0x40, 0x4c, 0x48, 0x8a, 0xd7, 0xb8, 0x1e,
+ 0xf7, 0xb6, 0xfb, 0xf8, 0x15, 0x5d, 0xa, 0x1e,
+ 0x13, 0xcf, 0xe0, 0x3c, 0xa, 0xf7, 0x9c, 0x16,
+ 0x5d, 0xa, 0x3c, 0xa, 0xfd, 0xb, 0xfb, 0x45,
+ 0x15, 0xcd, 0x6, 0xf7, 0xbf, 0xf9, 0x64, 0x5,
+ 0x49, 0x6, 0xe, 0x20, 0xf7, 0x82, 0xe4, 0x1,
+ 0xf7, 0x8d, 0xe4, 0x3, 0xb2, 0xf7, 0x82, 0x15,
+ 0xf7, 0x66, 0xfb, 0x64, 0xe4, 0xf7, 0x64, 0xf7,
+ 0x63, 0xe4, 0xfb, 0x63, 0xf7, 0x64, 0x32, 0xfb,
+ 0x64, 0xfb, 0x66, 0x6, 0xe, 0x20, 0x8b, 0xd9,
+ 0xf7, 0x57, 0xd8, 0xf7, 0x30, 0x77, 0x1, 0xf7,
+ 0x8b, 0xe4, 0x3, 0xb2, 0xf7, 0xa5, 0x15, 0xf7,
+ 0x64, 0xfb, 0x2e, 0xe4, 0xf7, 0x2e, 0xf7, 0x65,
+ 0xd8, 0xfb, 0x65, 0xf7, 0x30, 0x32, 0xfb, 0x30,
+ 0xfb, 0x64, 0x6, 0xfb, 0xf2, 0x4, 0xf8, 0x8e,
+ 0xd9, 0xfc, 0x8e, 0x6, 0xe, 0x66, 0xa, 0xbe,
+ 0xe5, 0xf7, 0xa6, 0xda, 0x3, 0xf8, 0x28, 0xc8,
+ 0x15, 0x8d, 0xfb, 0xa0, 0xe3, 0xf9, 0x71, 0x3b,
+ 0x48, 0x89, 0x6, 0xa3, 0x7c, 0x5b, 0xc2, 0x2d,
+ 0x1b, 0xfb, 0x27, 0x42, 0xfb, 0x10, 0xfb, 0x25,
+ 0xfb, 0x4c, 0xf5, 0x31, 0xf7, 0x6, 0xc9, 0xc8,
+ 0xaa, 0xae, 0xa5, 0x1f, 0xfb, 0xab, 0xf7, 0x64,
+ 0x15, 0xf7, 0x26, 0xcb, 0xc1, 0xcd, 0xdf, 0xd7,
+ 0x3c, 0xfb, 0xd, 0xfb, 0x30, 0x27, 0x5d, 0x4f,
+ 0x57, 0x3d, 0xab, 0xf7, 0x3e, 0x1e, 0xe, 0x8b,
+ 0xef, 0xf8, 0xbf, 0xd3, 0x12, 0xf7, 0x71, 0xeb,
+ 0x31, 0xdc, 0xec, 0xe2, 0x13, 0xd8, 0xf7, 0x77,
+ 0xf7, 0x44, 0x15, 0xdc, 0x6, 0x8d, 0xed, 0x97,
+ 0x9a, 0xce, 0xc8, 0x8, 0xc6, 0xc2, 0xb7, 0xb4,
+ 0xdc, 0x1a, 0xf7, 0x4, 0x30, 0xe3, 0xfb, 0x16,
+ 0x26, 0xfb, 0x6, 0x33, 0xfb, 0xa, 0x1e, 0xd8,
+ 0x81, 0x5, 0xe0, 0x99, 0xb4, 0xc6, 0xdf, 0x1b,
+ 0xd8, 0xc3, 0x4d, 0x49, 0x59, 0x6f, 0x6e, 0x62,
+ 0x66, 0x1f, 0x38, 0x40, 0x6c, 0x67, 0x90, 0xfb,
+ 0x10, 0x8, 0x13, 0xe8, 0x85, 0xfb, 0x44, 0x15,
+ 0xeb, 0xef, 0x2b, 0x6, 0xe, 0x3b, 0xfb, 0x5d,
+ 0xd3, 0xf8, 0xbf, 0xee, 0x12, 0xe6, 0xe5, 0xe0,
+ 0xef, 0x31, 0xdf, 0xe0, 0xdd, 0x13, 0xec, 0xf7,
+ 0xa8, 0xf7, 0xea, 0x15, 0x89, 0x29, 0x85, 0x86,
+ 0x46, 0x4e, 0x8, 0x4d, 0x54, 0x5d, 0x5c, 0x3a,
+ 0x1a, 0xfb, 0x4, 0xea, 0x37, 0xf7, 0x1b, 0xcc,
+ 0xf7, 0x21, 0xb8, 0xf7, 0x37, 0x1e, 0x39, 0x95,
+ 0x5, 0x3f, 0x8c, 0x63, 0x45, 0x35, 0x1b, 0x3b,
+ 0x50, 0xc5, 0xcd, 0xbd, 0xa9, 0xae, 0xb5, 0xb0,
+ 0x1f, 0xe1, 0xd6, 0xa5, 0xa5, 0x86, 0xf7, 0x10,
+ 0x8, 0x13, 0xf4, 0x2d, 0xdf, 0x15, 0xef, 0xee,
+ 0x27, 0x6, 0xe, 0xfb, 0xe4, 0xf8, 0x78, 0x76,
+ 0xf7, 0x93, 0x77, 0x1, 0xd1, 0xd8, 0xc8, 0xd8,
+ 0x3, 0xf7, 0x74, 0xf8, 0x63, 0x5c, 0xa, 0xfb,
+ 0xe, 0xfb, 0x1e, 0x5c, 0xa, 0xe, 0xfb, 0xfa,
+ 0xfb, 0x14, 0x76, 0xf7, 0x22, 0xf7, 0x5, 0x1,
+ 0xdb, 0xbb, 0xf7, 0xb, 0xbb, 0x3, 0xad, 0x84,
+ 0x48, 0xa, 0xf7, 0x3b, 0xfb, 0x5, 0x48, 0xa,
+ 0xe, 0xfb, 0xfa, 0xf8, 0x6a, 0xf7, 0x6, 0xf7,
+ 0x21, 0x77, 0x1, 0xb1, 0xbb, 0xf7, 0xb, 0xbb,
+ 0x3, 0xf7, 0x61, 0xf8, 0x6a, 0x47, 0xa, 0xfb,
+ 0x3b, 0x2f, 0x47, 0xa, 0xe, 0xfb, 0xfa, 0xf8,
+ 0x78, 0x76, 0xf7, 0x21, 0xf7, 0x6, 0x12, 0xdb,
+ 0xbb, 0xf7, 0xb, 0xbb, 0x17, 0xbb, 0xf8, 0x63,
+ 0x15, 0x13, 0xf0, 0x4d, 0xa, 0xf7, 0x51, 0x69,
+ 0x15, 0x13, 0x50, 0x4d, 0xa, 0xe, 0xfc, 0x69,
+ 0xf8, 0x6a, 0xef, 0xf7, 0x2f, 0x77, 0x1, 0xcc,
+ 0xba, 0x3, 0xcc, 0xf8, 0x6a, 0x15, 0xe8, 0xef,
+ 0x5d, 0x6, 0x8c, 0xa7, 0x90, 0xd3, 0xbe, 0xa0,
+ 0x75, 0xad, 0x18, 0x3b, 0x67, 0x89, 0x2f, 0x5a,
+ 0x1a, 0xe, 0xfc, 0x69, 0xf8, 0x78, 0x76, 0x1,
+ 0xf7, 0x2, 0xba, 0x3, 0xd6, 0xf8, 0x63, 0x15,
+ 0xdb, 0xaf, 0x8d, 0xd6, 0xbc, 0x1a, 0xea, 0x2e,
+ 0xfb, 0x9, 0xb9, 0x7, 0x8a, 0x6f, 0x86, 0x54,
+ 0x58, 0x76, 0x8, 0xe, 0xfc, 0x69, 0x85, 0xf7,
+ 0x4, 0x1, 0xf7, 0x1, 0xbb, 0x3, 0xca, 0x85,
+ 0x15, 0xb9, 0x6, 0x8a, 0x6f, 0x87, 0x4f, 0x58,
+ 0x76, 0xa1, 0x69, 0x18, 0xdb, 0xaf, 0x8d, 0xdb,
+ 0xbc, 0x1a, 0xe5, 0x2d, 0x7, 0xe, 0xfc, 0x88,
+ 0xf8, 0x78, 0x76, 0xf7, 0x93, 0x77, 0x1, 0xc6,
+ 0xd4, 0x3, 0xdb, 0xf8, 0x63, 0x15, 0xa9, 0x6,
+ 0xa1, 0xf7, 0x1e, 0x5, 0xf7, 0x9, 0x42, 0xfb,
+ 0x9, 0x7, 0xe, 0xfb, 0xfa, 0xa0, 0x76, 0xf8,
+ 0x55, 0xe4, 0x12, 0x85, 0xe3, 0x17, 0xd8, 0x16,
+ 0xe3, 0xf7, 0xac, 0x6, 0xd7, 0x9b, 0xe8, 0xc3,
+ 0xa2, 0xa0, 0x8a, 0x78, 0xa0, 0x1e, 0xa9, 0xdd,
+ 0x5, 0x92, 0x82, 0x78, 0x9f, 0x5e, 0x1b, 0x4c,
+ 0x7a, 0x5f, 0x63, 0x77, 0x1f, 0x13, 0xe0, 0x89,
+ 0xd4, 0x3b, 0x6, 0xe, 0xb9, 0x78, 0xca, 0xf7,
+ 0xab, 0xc3, 0xf7, 0xe, 0xc2, 0xf7, 0xa, 0xca,
+ 0x1, 0x7d, 0xca, 0xf7, 0x2e, 0xcd, 0xf7, 0x49,
+ 0xd2, 0xf7, 0x3c, 0xca, 0x3, 0xf7, 0x5f, 0xf7,
+ 0x2a, 0x15, 0xcd, 0xf7, 0x41, 0xb3, 0x6, 0xc0,
+ 0x9e, 0x76, 0x33, 0xbd, 0x1f, 0xb0, 0x4b, 0x5,
+ 0xdc, 0x6, 0x59, 0xda, 0x58, 0xdc, 0x7a, 0x97,
+ 0x73, 0x95, 0x19, 0x9d, 0xeb, 0x94, 0xef, 0xec,
+ 0x2a, 0x9d, 0x3c, 0x1f, 0xfb, 0x22, 0x6, 0xcd,
+ 0xfb, 0x45, 0x15, 0xf7, 0xe, 0xd7, 0x7, 0xb4,
+ 0xcb, 0x8b, 0x4f, 0x4d, 0x41, 0x8b, 0x6c, 0x1f,
+ 0xfb, 0xfb, 0x78, 0x15, 0xfb, 0x66, 0xf7, 0x41,
+ 0xfb, 0x3d, 0xf7, 0x68, 0xf7, 0x68, 0xf7, 0x3d,
+ 0xf7, 0x3e, 0xf7, 0x65, 0xf7, 0x65, 0xfb, 0x3f,
+ 0xf7, 0x3c, 0xfb, 0x66, 0xfb, 0x66, 0xfb, 0x43,
+ 0xfb, 0x3b, 0xfb, 0x66, 0x1e, 0xca, 0x16, 0xf7,
+ 0x42, 0xf7, 0x25, 0xf7, 0x20, 0xf7, 0x44, 0xf7,
+ 0x44, 0xf7, 0x23, 0xfb, 0x20, 0xfb, 0x42, 0xfb,
+ 0x43, 0xfb, 0x23, 0xfb, 0x21, 0xfb, 0x44, 0xfb,
+ 0x44, 0xfb, 0x25, 0xf7, 0x21, 0xf7, 0x43, 0x1e,
+ 0xe, 0xfb, 0xfa, 0xf8, 0xd0, 0xb1, 0xf7, 0x0,
+ 0xb1, 0x1, 0xd6, 0xb1, 0xf7, 0x0, 0xb1, 0x3,
+ 0xd6, 0xf9, 0x2e, 0x15, 0x57, 0xb3, 0x61, 0xbe,
+ 0xbf, 0xb4, 0xb5, 0xbf, 0xbe, 0x62, 0xb2, 0x57,
+ 0x58, 0x63, 0x64, 0x58, 0x1e, 0xb1, 0x16, 0xa6,
+ 0xa1, 0xa4, 0xaa, 0xab, 0xa2, 0x74, 0x6e, 0x6c,
+ 0x73, 0x72, 0x6c, 0x6f, 0x72, 0xa1, 0xad, 0x1e,
+ 0xe, 0xfb, 0x53, 0x7c, 0xd3, 0xf8, 0x2d, 0xd3,
+ 0x1, 0xc8, 0xe0, 0xf7, 0x78, 0xe5, 0x3, 0xab,
+ 0xf7, 0x2f, 0x15, 0x57, 0x94, 0xa3, 0xfb, 0xa,
+ 0xf7, 0x50, 0x1b, 0xf7, 0x1b, 0xd7, 0xd3, 0xe1,
+ 0xf6, 0x3f, 0xa9, 0xfb, 0x1c, 0xae, 0x1f, 0x36,
+ 0xa1, 0x66, 0x91, 0xb7, 0x1a, 0xc6, 0xd2, 0x9f,
+ 0xae, 0xae, 0xd5, 0x83, 0x6c, 0xa, 0xf6, 0xfb,
+ 0x4a, 0x1b, 0xfb, 0x11, 0x49, 0x44, 0x3b, 0xfb,
+ 0x0, 0xf1, 0x73, 0xda, 0x78, 0x1f, 0xf7, 0x2,
+ 0x70, 0xb1, 0x73, 0x61, 0x1a, 0x68, 0x6c, 0x58,
+ 0x30, 0x38, 0x62, 0xb5, 0xd0, 0x82, 0x1e, 0xe,
+ 0xfb, 0x53, 0x7c, 0xd3, 0xf8, 0x22, 0xd3, 0xf7,
+ 0x63, 0x77, 0x1, 0xb9, 0xe0, 0xf7, 0x87, 0xe5,
+ 0x3, 0xab, 0xf7, 0x2c, 0x15, 0x57, 0x94, 0xa3,
+ 0xfb, 0x7, 0xf7, 0x50, 0x1b, 0xf7, 0x1b, 0xd7,
+ 0xd0, 0xe1, 0xf6, 0x40, 0x9c, 0xfb, 0x1c, 0xae,
+ 0x1f, 0x36, 0xa1, 0x66, 0xa2, 0xb7, 0x1a, 0xc6,
+ 0xd2, 0x93, 0xae, 0xae, 0xd5, 0x85, 0x6c, 0xa,
+ 0xf4, 0xfb, 0x4a, 0x1b, 0xfb, 0x11, 0x49, 0x46,
+ 0x3b, 0xfb, 0x0, 0xf1, 0x70, 0xda, 0x78, 0x1f,
+ 0xf7, 0x2, 0x70, 0xb0, 0x7c, 0x61, 0x1a, 0x68,
+ 0x6d, 0x5b, 0x30, 0x38, 0x61, 0xb2, 0xd0, 0x82,
+ 0x1e, 0xe2, 0xf8, 0x44, 0x37, 0xa, 0xfb, 0x53,
+ 0xd4, 0xf9, 0xa4, 0xd2, 0x1, 0xd4, 0x7a, 0x15,
+ 0xfb, 0x10, 0x9b, 0xe6, 0x59, 0xf4, 0x1b, 0xf7,
+ 0x9, 0xd7, 0xd0, 0xe4, 0xd8, 0x4f, 0xb8, 0x79,
+ 0x99, 0x1f, 0xb5, 0x9c, 0xd1, 0x98, 0xe7, 0x1a,
+ 0xe7, 0x3f, 0xc6, 0x27, 0xc6, 0x1e, 0x49, 0xb3,
+ 0x2d, 0xbf, 0xc4, 0x1a, 0xb2, 0xaa, 0xb6, 0xc8,
+ 0xe0, 0x9e, 0x46, 0x66, 0x92, 0x1e, 0xe6, 0x95,
+ 0x5, 0xf7, 0x8, 0xfb, 0x15, 0xbe, 0x47, 0xfb,
+ 0x14, 0x52, 0x32, 0x4b, 0x50, 0xb0, 0x68, 0xa7,
+ 0x73, 0x1e, 0x3f, 0x74, 0x69, 0x4f, 0x54, 0x1a,
+ 0x2a, 0xe2, 0x55, 0xda, 0x5c, 0x1e, 0xda, 0x5a,
+ 0xb0, 0x6f, 0xa2, 0x79, 0x8, 0xaf, 0x6f, 0x91,
+ 0x76, 0x77, 0x1a, 0x6d, 0x73, 0x55, 0x3a, 0x28,
+ 0x7b, 0xd5, 0xb2, 0x82, 0x1e, 0xf7, 0x57, 0xf7,
+ 0x20, 0x15, 0x78, 0x99, 0x6f, 0x9c, 0x4b, 0xb0,
+ 0x8, 0x3b, 0xba, 0x60, 0xa5, 0xbf, 0x1a, 0xbf,
+ 0xba, 0xb0, 0xa6, 0x9a, 0x1e, 0xa3, 0x77, 0xab,
+ 0x76, 0xb5, 0x71, 0x8, 0xd9, 0x5b, 0xc3, 0x62,
+ 0x58, 0x1a, 0x70, 0x79, 0x67, 0x55, 0x70, 0x1e,
+ 0xe, 0xfc, 0x31, 0xfb, 0x12, 0x76, 0xf8, 0xc8,
+ 0xee, 0x1, 0xe3, 0xf2, 0x3, 0xe3, 0x85, 0x15,
+ 0xc8, 0x6, 0x8a, 0x61, 0x7d, 0x62, 0x5c, 0x76,
+ 0xa3, 0x66, 0x18, 0xd2, 0xa4, 0x94, 0xdd, 0xad,
+ 0x1a, 0xee, 0x24, 0x7, 0xf7, 0xd8, 0x4, 0xf2,
+ 0xee, 0x24, 0x6, 0xe, 0xa0, 0x76, 0xf9, 0xa,
+ 0xdc, 0x1, 0xf7, 0x23, 0xe9, 0x3, 0xf7, 0x23,
+ 0x16, 0xe9, 0x6, 0xa2, 0xf7, 0xcc, 0xf7, 0x54,
+ 0xf7, 0x85, 0xd2, 0xd2, 0x8, 0xcb, 0xfc, 0x7a,
+ 0x3a, 0xf8, 0x3, 0x7, 0xfb, 0x3b, 0xfb, 0x46,
+ 0x2f, 0xfb, 0x9e, 0x89, 0xfb, 0x37, 0x8, 0xe,
+ 0x78, 0xd2, 0xf7, 0xd8, 0xd7, 0xf7, 0x48, 0xd2,
+ 0x1, 0xc4, 0xf3, 0xf7, 0x9d, 0xe7, 0x3, 0xf7,
+ 0x14, 0xf7, 0xfa, 0x15, 0xf7, 0x4, 0xb3, 0xf7,
+ 0x36, 0xf7, 0xd, 0xed, 0xa3, 0x36, 0x70, 0x91,
+ 0x1e, 0xe5, 0x93, 0x5, 0xf7, 0x1b, 0x78, 0xfb,
+ 0x6, 0xb3, 0x36, 0x1b, 0xfb, 0x88, 0x84, 0xfb,
+ 0xb4, 0x30, 0xfb, 0x43, 0xb6, 0xfb, 0x3c, 0xf7,
+ 0x64, 0xf7, 0x2d, 0xd7, 0xf7, 0xa, 0xf7, 0xa,
+ 0xf7, 0x20, 0xfb, 0x6, 0xea, 0xfb, 0x7, 0x40,
+ 0x5d, 0x69, 0x4f, 0x65, 0x1f, 0x97, 0xfb, 0x1c,
+ 0x15, 0xf1, 0xd8, 0xbf, 0xd1, 0xe3, 0xbc, 0x45,
+ 0x32, 0x38, 0x5b, 0x39, 0x32, 0x31, 0x52, 0xdc,
+ 0xe4, 0x1e, 0xe, 0xfc, 0x31, 0x8d, 0x76, 0x1,
+ 0x7a, 0xf7, 0xcc, 0x3, 0x7a, 0x78, 0x15, 0xd2,
+ 0x6, 0xf7, 0x85, 0xf9, 0x88, 0x5, 0x4c, 0x6,
+ 0xe, 0xfc, 0x31, 0xe, 0x7b, 0xda, 0x6a, 0xd3,
+ 0xf7, 0x6c, 0xd2, 0xf7, 0x96, 0xd2, 0x12, 0xe8,
+ 0xe3, 0x67, 0xe7, 0x13, 0x78, 0xac, 0xd0, 0x15,
+ 0xac, 0x37, 0x5, 0xa7, 0xb5, 0xc4, 0x9c, 0xbb,
+ 0x1b, 0x13, 0xb8, 0xca, 0xe3, 0x5d, 0xc7, 0x1b,
+ 0xb5, 0xab, 0x98, 0x9c, 0xb4, 0x1f, 0x6f, 0xdb,
+ 0x5, 0x83, 0x7a, 0x64, 0x74, 0x68, 0x1b, 0x13,
+ 0x74, 0x43, 0x54, 0xb2, 0x41, 0x1b, 0x6d, 0x73,
+ 0x85, 0x86, 0x7e, 0x1f, 0x89, 0x8d, 0x5, 0xbb,
+ 0xbc, 0xb2, 0xca, 0xd1, 0x1a, 0xa0, 0x86, 0x95,
+ 0x86, 0x97, 0x1e, 0xf7, 0x1b, 0xd2, 0xfb, 0x2a,
+ 0x6, 0x13, 0xb8, 0x7e, 0xb1, 0x79, 0xbf, 0xb0,
+ 0x1a, 0xc6, 0xbd, 0xd3, 0xd8, 0xc9, 0xc2, 0x60,
+ 0x39, 0x95, 0x1e, 0xe1, 0x98, 0x5, 0xf7, 0x4,
+ 0x84, 0x26, 0xd2, 0x22, 0x1b, 0x20, 0xfb, 0x0,
+ 0x4c, 0xfb, 0x1f, 0x67, 0x92, 0x6d, 0x9c, 0x4e,
+ 0x1f, 0x42, 0x44, 0xe8, 0x6, 0x13, 0xb4, 0x8f,
+ 0x7b, 0x8f, 0x7c, 0x6e, 0x1a, 0xfb, 0xc, 0x34,
+ 0x54, 0x72, 0x7d, 0x1e, 0xe, 0xfc, 0x31, 0x99,
+ 0x76, 0xf8, 0x52, 0xcf, 0xf7, 0x36, 0x77, 0x1,
+ 0xdc, 0xe3, 0x3, 0xf7, 0x95, 0x8c, 0x15, 0x7f,
+ 0xd9, 0x5, 0x54, 0x7e, 0x76, 0x93, 0xd4, 0x1a,
+ 0xf7, 0xb8, 0xe3, 0xcf, 0x33, 0xf7, 0x36, 0x7,
+ 0x33, 0x56, 0x5, 0xfb, 0x1, 0x48, 0x47, 0xce,
+ 0xfb, 0xb8, 0x7, 0x35, 0x90, 0x47, 0xf7, 0x6,
+ 0xa8, 0x98, 0x90, 0x8e, 0x9a, 0x1e, 0xe, 0xfb,
+ 0x4e, 0x76, 0xf7, 0x57, 0xd4, 0xf8, 0x20, 0xd4,
+ 0xf7, 0x50, 0x77, 0x12, 0xc5, 0xda, 0x3c, 0xe3,
+ 0xf7, 0xad, 0xe5, 0x13, 0xf6, 0xf7, 0x26, 0xc1,
+ 0x15, 0x6c, 0xa8, 0xaf, 0x68, 0xd6, 0x1b, 0xf7,
+ 0x2, 0xf7, 0xd, 0xdd, 0xf7, 0x4e, 0xf7, 0x25,
+ 0x37, 0xf7, 0x15, 0xfb, 0x27, 0x3c, 0x6d, 0x6a,
+ 0x6a, 0x6c, 0x1f, 0xf7, 0x92, 0x33, 0xfe, 0x31,
+ 0xe3, 0x7, 0x13, 0xfa, 0x82, 0xf8, 0x63, 0x15,
+ 0xf7, 0xd, 0xcc, 0xdb, 0xdf, 0xcd, 0xd6, 0x53,
+ 0xfb, 0x25, 0xfb, 0x3e, 0x32, 0x72, 0x57, 0x4f,
+ 0x32, 0xb2, 0xf7, 0x30, 0x1e, 0xe, 0x78, 0xd2,
+ 0xf8, 0xd8, 0xd2, 0x1, 0xf8, 0x29, 0xe9, 0x3,
+ 0xad, 0xf7, 0x47, 0x15, 0x28, 0x95, 0xd8, 0x28,
+ 0xf7, 0x2b, 0x1b, 0xf7, 0x13, 0xf7, 0xf, 0xdd,
+ 0xf7, 0x1e, 0xd2, 0x4f, 0xf0, 0x3b, 0x1f, 0x8d,
+ 0x7, 0xe4, 0xb0, 0x99, 0xd2, 0xb0, 0x1a, 0xf1,
+ 0x30, 0xdc, 0xfb, 0x12, 0x3d, 0xfb, 0xa, 0x6a,
+ 0xfb, 0x2a, 0x6e, 0x1e, 0xe7, 0x7b, 0x5, 0xd1,
+ 0x96, 0xb3, 0xc5, 0xdf, 0x1b, 0xc5, 0xca, 0x66,
+ 0x40, 0x24, 0xfb, 0x6, 0x77, 0x57, 0x90, 0x1f,
+ 0x80, 0x3f, 0x5, 0xf4, 0xad, 0xf4, 0x51, 0x24,
+ 0x1a, 0x38, 0x48, 0x4b, 0x36, 0xfb, 0x9, 0x75,
+ 0xf3, 0xae, 0x84, 0x1e, 0xe, 0xf7, 0x23, 0x8d,
+ 0x76, 0xdc, 0xbe, 0xf7, 0x77, 0xc2, 0xf7, 0x6,
+ 0xf7, 0x56, 0x56, 0xc0, 0x12, 0xf7, 0x8f, 0xd7,
+ 0x50, 0xd7, 0xf7, 0xec, 0xd1, 0x13, 0xf3, 0xf8,
+ 0x89, 0xc9, 0x15, 0xf7, 0x4f, 0x43, 0xd1, 0xd3,
+ 0xbf, 0xbe, 0x57, 0xf7, 0x78, 0x4f, 0x6, 0xfb,
+ 0x59, 0xfb, 0x71, 0x5, 0xd6, 0x84, 0x15, 0xf7,
+ 0x4, 0xf7, 0x10, 0x5, 0xfb, 0x10, 0x7, 0xfd,
+ 0x17, 0xf7, 0xdc, 0x15, 0x51, 0x97, 0xae, 0x60,
+ 0xee, 0x1b, 0xef, 0xc0, 0xc1, 0xc2, 0xbd, 0x68,
+ 0xa7, 0x5a, 0x96, 0x1f, 0x8d, 0x7, 0x13, 0xed,
+ 0xbb, 0x97, 0x9e, 0xa3, 0xab, 0x1a, 0xe3, 0xfb,
+ 0x8, 0x92, 0x78, 0x31, 0x70, 0x68, 0x54, 0x75,
+ 0x1e, 0xd1, 0x80, 0x5, 0xa7, 0x96, 0x99, 0x9f,
+ 0xb7, 0x1b, 0xb5, 0x9c, 0x77, 0x75, 0x63, 0x59,
+ 0x83, 0x70, 0x1f, 0x13, 0xf3, 0x81, 0x58, 0x5,
+ 0xc1, 0x8d, 0xbd, 0x7d, 0x5b, 0x1a, 0x65, 0x69,
+ 0x7b, 0x60, 0x53, 0x7e, 0xae, 0x9d, 0x85, 0x1e,
+ 0xa5, 0xfc, 0x67, 0x15, 0xd8, 0x6, 0xf8, 0xaf,
+ 0xf9, 0x66, 0x5, 0x3f, 0x6, 0xe, 0xfb, 0xfa,
+ 0xf7, 0xa2, 0xcd, 0xf7, 0xc4, 0xca, 0x1, 0xf7,
+ 0x76, 0xdc, 0x3, 0x90, 0xf8, 0x1c, 0x15, 0x46,
+ 0x98, 0xb1, 0x56, 0xf5, 0x1b, 0xf5, 0xc4, 0xcc,
+ 0xcd, 0xc7, 0x66, 0xac, 0x56, 0x98, 0x1f, 0x8d,
+ 0x7, 0xbf, 0x9a, 0x9f, 0xa8, 0xb0, 0x1a, 0xf4,
+ 0xfb, 0x11, 0x93, 0x77, 0x2b, 0x6f, 0x62, 0x49,
+ 0x74, 0x1e, 0xd5, 0x7f, 0x5, 0xab, 0x97, 0x99,
+ 0xa3, 0xba, 0x1b, 0xb8, 0x9e, 0x73, 0x71, 0x5b,
+ 0x55, 0x82, 0x6f, 0x1f, 0x80, 0x4e, 0x5, 0xc5,
+ 0x8c, 0xc0, 0x7c, 0x52, 0x1a, 0x5e, 0x67, 0x77,
+ 0x5d, 0x4f, 0x7c, 0xb6, 0xa0, 0x85, 0x1e, 0xe,
+ 0xfb, 0xfa, 0xf9, 0x37, 0xba, 0x1, 0x87, 0xf8,
+ 0xf2, 0x15, 0xce, 0x6, 0xbb, 0xad, 0x8b, 0x8f,
+ 0xa0, 0x9f, 0x81, 0x80, 0x9f, 0x1e, 0x7f, 0xa2,
+ 0xa2, 0x7d, 0xa2, 0x1b, 0xa1, 0xdf, 0x91, 0xf7,
+ 0x1, 0x1f, 0x49, 0x6, 0x68, 0x87, 0x7c, 0x7f,
+ 0x76, 0x1b, 0x78, 0x7b, 0x92, 0x94, 0x7c, 0x1f,
+ 0x98, 0x73, 0x74, 0x9c, 0x6a, 0x1b, 0x59, 0x54,
+ 0x66, 0x3d, 0x1f, 0xe, 0xf7, 0xc9, 0xf7, 0xdb,
+ 0x76, 0xf7, 0xf5, 0xc6, 0x1, 0xf7, 0x5b, 0xcd,
+ 0xf7, 0x8b, 0xc8, 0xf7, 0xa1, 0xc8, 0x3, 0xf7,
+ 0x5b, 0xf7, 0xc6, 0x15, 0xcd, 0xf7, 0xf5, 0xf7,
+ 0x2f, 0xc6, 0xfc, 0xa, 0x50, 0xf7, 0x2d, 0x6,
+ 0xf7, 0xcd, 0xfb, 0xf5, 0x15, 0xc8, 0xf7, 0xf5,
+ 0x8d, 0x6, 0xf4, 0xfb, 0xf5, 0x5, 0xc7, 0x6,
+ 0xef, 0xf7, 0xf0, 0x5, 0x8d, 0xfb, 0xf0, 0xc8,
+ 0xf8, 0x30, 0x2b, 0x6, 0x2b, 0xfb, 0xe0, 0x5,
+ 0x89, 0x6, 0x28, 0xf7, 0xe0, 0x5, 0x29, 0x6,
+ 0xe, 0x8b, 0xde, 0xf8, 0xbc, 0xd4, 0x1, 0xf8,
+ 0x32, 0xe6, 0x3, 0xa5, 0x16, 0xf8, 0x75, 0xde,
+ 0xfb, 0xfa, 0x6, 0x97, 0x9e, 0x97, 0xa3, 0xdb,
+ 0xc9, 0x8, 0xf7, 0x25, 0xf7, 0x4, 0xf6, 0xf5,
+ 0xf1, 0x1a, 0xe1, 0x4c, 0xf7, 0x1, 0xfb, 0x38,
+ 0xfb, 0xe, 0x2b, 0x49, 0xfb, 0x1c, 0x7d, 0x1e,
+ 0xe6, 0x81, 0x5, 0xf7, 0x20, 0x8c, 0xf7, 0x11,
+ 0x8a, 0x9a, 0x1b, 0xda, 0xc4, 0x5a, 0x44, 0x37,
+ 0xfb, 0x0, 0x2d, 0x3d, 0x4f, 0x1f, 0x38, 0x4a,
+ 0xfb, 0xb, 0x2d, 0xfb, 0x5, 0x1a, 0xe, 0xfb,
+ 0xfa, 0xf7, 0xa0, 0xcd, 0xf7, 0xc7, 0xc9, 0x1,
+ 0xf7, 0x84, 0xdb, 0x3, 0x8f, 0xf7, 0xad, 0x15,
+ 0xf7, 0xd3, 0xcd, 0xfb, 0x5d, 0x6, 0x95, 0x96,
+ 0x95, 0x95, 0xc5, 0xbb, 0x8, 0xd3, 0xc4, 0xbb,
+ 0xa8, 0xd3, 0x1a, 0xf7, 0x4, 0x2b, 0x9c, 0x54,
+ 0xfb, 0x11, 0x77, 0x38, 0x64, 0x81, 0x1e, 0xd5,
+ 0x83, 0x5, 0xab, 0x95, 0x95, 0xaf, 0xc4, 0x1b,
+ 0xb6, 0xab, 0x70, 0x63, 0x65, 0x72, 0x78, 0x3d,
+ 0x4b, 0x1f, 0x47, 0x55, 0x50, 0x53, 0x85, 0x4d,
+ 0x8, 0xe, 0x7c, 0xd7, 0x63, 0x76, 0xf8, 0x9f,
+ 0x77, 0x4e, 0xa, 0x13, 0x78, 0xf8, 0x2e, 0x16,
+ 0xda, 0xf8, 0x9f, 0x33, 0xfb, 0xb8, 0x6, 0x13,
+ 0xb8, 0x33, 0x5b, 0x39, 0x30, 0x36, 0x76, 0xd9,
+ 0xe3, 0x1e, 0xf7, 0xbc, 0x33, 0xfb, 0xda, 0x7,
+ 0xfb, 0x8, 0xca, 0x2b, 0xf7, 0x17, 0xa4, 0xcc,
+ 0x91, 0xe0, 0xc3, 0x1e, 0x8d, 0x6, 0xe, 0x79,
+ 0xa, 0xf8, 0xec, 0xf7, 0x1d, 0x34, 0xa, 0xfb,
+ 0x4f, 0xf8, 0xa0, 0x2f, 0xa, 0xe, 0x79, 0xa,
+ 0xf9, 0x75, 0x77, 0x34, 0xa, 0xfb, 0xb2, 0xf8,
+ 0xa0, 0x2c, 0xa, 0xe, 0x79, 0xa, 0xf8, 0xf5,
+ 0xef, 0x12, 0xcf, 0xe3, 0x7e, 0xe5, 0xe6, 0xe5,
+ 0x7e, 0xe3, 0x3c, 0xda, 0x13, 0x71, 0xf8, 0x2e,
+ 0x88, 0x15, 0xda, 0xf8, 0x9c, 0x6, 0x13, 0xb2,
+ 0x33, 0xfb, 0xa8, 0x6, 0x32, 0xa, 0x1e, 0x13,
+ 0x69, 0x65, 0xa, 0x1f, 0xfb, 0x9f, 0xf8, 0xa9,
+ 0x31, 0xa, 0x13, 0xb4, 0xf7, 0x49, 0x72, 0xa,
+ 0x79, 0xa, 0xf8, 0xec, 0xf7, 0x1d, 0x3d, 0xa,
+ 0x33, 0x6, 0x13, 0xb8, 0xfb, 0xa8, 0x7, 0x32,
+ 0xa, 0x65, 0xa, 0x1e, 0x13, 0xb4, 0xfb, 0x28,
+ 0xf8, 0xa0, 0x5e, 0xa, 0xfb, 0x11, 0xbd, 0x1,
+ 0x40, 0x4, 0x59, 0xf8, 0xc0, 0xbd, 0x7, 0xe,
+ 0xfb, 0x53, 0x68, 0xa, 0xf7, 0x64, 0x16, 0xdd,
+ 0x6, 0xf7, 0x5e, 0xf8, 0x9f, 0x5, 0x31, 0x6,
+ 0xfb, 0x2d, 0xfc, 0x38, 0xfb, 0x28, 0xf8, 0x38,
+ 0x5, 0x2e, 0x6, 0xe, 0xaa, 0x68, 0xa, 0xf7,
+ 0x41, 0x16, 0xe7, 0x6, 0xe9, 0xf8, 0x28, 0x5,
+ 0x8d, 0x6, 0xf1, 0xfc, 0x28, 0x5, 0xe6, 0x6,
+ 0xf7, 0x2f, 0xf8, 0x9f, 0x5, 0x35, 0x6, 0xfb,
+ 0x2, 0xfc, 0x28, 0x5, 0x89, 0x6, 0x25, 0xf8,
+ 0x28, 0x5, 0x31, 0x6, 0x26, 0xfc, 0x33, 0xfb,
+ 0x5, 0xf8, 0x33, 0x5, 0x30, 0x6, 0xe, 0xfb,
+ 0x53, 0x68, 0xa, 0x96, 0x16, 0xf4, 0x6, 0xf7,
+ 0x1b, 0xf7, 0x60, 0xf7, 0x18, 0xfb, 0x60, 0x5,
+ 0xf6, 0x6, 0xfb, 0x52, 0xf7, 0xa6, 0xf7, 0x44,
+ 0xf7, 0x8d, 0x5, 0x23, 0x6, 0xfb, 0x10, 0xfb,
+ 0x4d, 0xfb, 0x7, 0xf7, 0x4d, 0x5, 0x20, 0x6,
+ 0xf7, 0x3f, 0xfb, 0x92, 0x5, 0xe, 0xfb, 0x53,
+ 0xfb, 0x6a, 0xdd, 0xf9, 0x23, 0x77, 0x1, 0xba,
+ 0xfb, 0x10, 0x15, 0x94, 0x3b, 0x55, 0xa, 0xa4,
+ 0xf7, 0x0, 0xf2, 0xbe, 0x1f, 0xf7, 0x5d, 0xf8,
+ 0xa2, 0x5, 0x32, 0x6, 0xfb, 0x28, 0xfc, 0x37,
+ 0x5, 0x89, 0x6, 0xfb, 0x24, 0xf8, 0x37, 0x5,
+ 0x2c, 0x6, 0xf7, 0x58, 0xfc, 0x9a, 0x5, 0x43,
+ 0x71, 0x81, 0x4a, 0x41, 0x1b, 0x76, 0x7b, 0x8f,
+ 0x8f, 0x7e, 0x1f, 0xe, 0xfb, 0x53, 0xfb, 0x6a,
+ 0xda, 0xf9, 0x70, 0xf7, 0x1d, 0x1, 0x33, 0xa,
+ 0xf7, 0x27, 0xf9, 0x62, 0x2f, 0xa, 0xe, 0xfb,
+ 0x53, 0xfb, 0x6a, 0xda, 0xf9, 0x79, 0xef, 0x1,
+ 0x96, 0xea, 0x94, 0xe5, 0xe6, 0xe5, 0x3, 0x33,
+ 0xa, 0xce, 0xf9, 0x6b, 0x2e, 0xa, 0xe, 0xa0,
+ 0x76, 0xf7, 0x39, 0xcf, 0xe3, 0xcf, 0xf7, 0xbf,
+ 0x77, 0x1, 0xf7, 0x7f, 0xe3, 0x3, 0xab, 0xf7,
+ 0x39, 0x15, 0xf7, 0x5f, 0xfb, 0x39, 0xe3, 0xf7,
+ 0x39, 0xf7, 0x5d, 0xcf, 0xfb, 0x5d, 0xe3, 0xf7,
+ 0x5d, 0xcf, 0xfb, 0x2f, 0x6, 0xf7, 0x4c, 0xf7,
+ 0xbf, 0x5, 0x23, 0x6, 0xfb, 0x40, 0xfb, 0xbf,
+ 0xfb, 0x44, 0xf7, 0xbf, 0x5, 0x29, 0x6, 0xf7,
+ 0x4d, 0xfb, 0xbf, 0x5, 0xfb, 0x30, 0x47, 0xf7,
+ 0x5f, 0x33, 0xfb, 0x5f, 0x6, 0xe, 0xfb, 0x53,
+ 0x8b, 0xd7, 0xf8, 0xb, 0xd3, 0x63, 0xa, 0xf8,
+ 0x1a, 0x67, 0xa, 0xfc, 0x10, 0x5, 0xe, 0xfb,
+ 0x53, 0x8b, 0xd7, 0xf8, 0x6, 0xd3, 0xf7, 0x6c,
+ 0x77, 0x63, 0xa, 0xf8, 0x15, 0x67, 0xa, 0xfc,
+ 0xb, 0x5, 0xf7, 0x43, 0xf8, 0xa2, 0x37, 0xa,
+ 0x78, 0xd2, 0xf8, 0xd8, 0xd2, 0x1, 0xbe, 0xe8,
+ 0xf7, 0xa6, 0xe8, 0x3, 0xb1, 0xf7, 0xec, 0x15,
+ 0x37, 0x92, 0xfb, 0xab, 0xf7, 0x7e, 0xf7, 0x7d,
+ 0x91, 0xf7, 0xb3, 0xd7, 0xd9, 0x88, 0xf7, 0xad,
+ 0xfb, 0x81, 0xfb, 0x71, 0x78, 0xfb, 0xaf, 0x3f,
+ 0x1e, 0xe7, 0x16, 0xf7, 0x21, 0xa1, 0xf7, 0x27,
+ 0xf7, 0x12, 0xf7, 0x1c, 0x96, 0xfb, 0x38, 0xfb,
+ 0x10, 0xfb, 0xd, 0x7e, 0xfb, 0x3f, 0xfb, 0x19,
+ 0xfb, 0x1c, 0x7e, 0xf7, 0x42, 0xf7, 0xa, 0x1e,
+ 0xe, 0x76, 0xa0, 0xf8, 0x9f, 0x9a, 0xf7, 0x48,
+ 0x9e, 0x6, 0xfb, 0x70, 0x98, 0x7, 0x1e, 0xa0,
+ 0x39, 0x63, 0xff, 0xc, 0x9, 0xd2, 0xa, 0xe2,
+ 0xb, 0xf8, 0xc0, 0x14, 0xf9, 0x47, 0x15, 0xab,
+ 0x13, 0x0, 0x5b, 0x2, 0x0, 0x1, 0x0, 0x7,
+ 0x0, 0x68, 0x0, 0x6d, 0x0, 0xbc, 0x0, 0xf0,
+ 0x1, 0x1e, 0x1, 0x23, 0x1, 0x4c, 0x1, 0x72,
+ 0x1, 0xac, 0x1, 0xd9, 0x1, 0xdf, 0x1, 0xee,
+ 0x2, 0xb, 0x2, 0x13, 0x2, 0x1c, 0x2, 0x34,
+ 0x2, 0x3a, 0x2, 0x50, 0x2, 0x84, 0x2, 0x96,
+ 0x2, 0x9f, 0x2, 0xa4, 0x2, 0xb4, 0x2, 0xb9,
+ 0x2, 0xc0, 0x2, 0xc7, 0x2, 0xee, 0x3, 0xf,
+ 0x3, 0x1d, 0x3, 0x24, 0x3, 0x2b, 0x3, 0x33,
+ 0x3, 0x3c, 0x3, 0x41, 0x3, 0x4b, 0x3, 0x54,
+ 0x3, 0x5c, 0x3, 0x62, 0x3, 0x78, 0x3, 0x8e,
+ 0x3, 0x97, 0x3, 0xa0, 0x3, 0xa5, 0x3, 0xa9,
+ 0x3, 0xbd, 0x3, 0xc4, 0x3, 0xcb, 0x3, 0xd3,
+ 0x3, 0xdc, 0x3, 0xe4, 0x3, 0xf5, 0x3, 0xff,
+ 0x4, 0x9, 0x4, 0x13, 0x4, 0x23, 0x4, 0x29,
+ 0x4, 0x2c, 0x4, 0x30, 0x4, 0x3e, 0x4, 0x4c,
+ 0x4, 0x59, 0x4, 0x5e, 0x4, 0x62, 0x4, 0x6c,
+ 0x4, 0x76, 0x4, 0x80, 0x4, 0x8c, 0x4, 0x98,
+ 0x4, 0x9e, 0x4, 0xa9, 0x4, 0xb4, 0x4, 0xbb,
+ 0x4, 0xc5, 0x4, 0xcf, 0x4, 0xd9, 0x4, 0xe3,
+ 0x4, 0xe7, 0x4, 0xeb, 0x4, 0xf4, 0x4, 0xfd,
+ 0x5, 0x6, 0x5, 0xa, 0x5, 0x11, 0x5, 0x15,
+ 0x5, 0x1b, 0x5, 0x21, 0x5, 0x27, 0x5, 0x2d,
+ 0x5, 0x32, 0x5, 0x35, 0x22, 0xa, 0x13, 0xbc,
+ 0x28, 0xa, 0x15, 0x2b, 0xa9, 0x2e, 0xc6, 0x44,
+ 0x1e, 0x46, 0xc6, 0xd7, 0x5c, 0xf7, 0x7, 0x1b,
+ 0xf7, 0x4f, 0xf7, 0x2b, 0xf7, 0x1a, 0xf7, 0x86,
+ 0x8e, 0x1f, 0xf6, 0x64, 0xf1, 0x52, 0xcf, 0x1e,
+ 0xd0, 0x53, 0x32, 0xb2, 0x27, 0x1b, 0x2c, 0x32,
+ 0x6a, 0x4a, 0x52, 0x1f, 0x53, 0x4a, 0x61, 0x24,
+ 0xfb, 0xb, 0x1a, 0xef, 0x16, 0xc0, 0x9c, 0xdd,
+ 0xb3, 0xc7, 0x1e, 0xc8, 0xb3, 0xbe, 0xb7, 0xe6,
+ 0x1b, 0xca, 0xcb, 0x73, 0x58, 0xb3, 0x1f, 0xb4,
+ 0x58, 0xac, 0x3a, 0x2e, 0x1a, 0x85, 0xfb, 0x61,
+ 0x2b, 0x35, 0xfb, 0x1f, 0x8a, 0x8, 0x40, 0x58,
+ 0xa9, 0xbe, 0x5f, 0x1f, 0x5f, 0xbf, 0x72, 0xd3,
+ 0xe2, 0x1a, 0xb, 0x24, 0xa, 0x25, 0xa, 0xb,
+ 0x15, 0x47, 0x9c, 0x45, 0xb2, 0x57, 0x1e, 0x57,
+ 0xb2, 0xbb, 0x67, 0xde, 0x1b, 0xf7, 0x24, 0xeb,
+ 0xec, 0xf7, 0x49, 0xee, 0x68, 0xcd, 0x5a, 0xb3,
+ 0x1f, 0xb4, 0x5a, 0x57, 0x9c, 0x54, 0x1b, 0x3c,
+ 0x5b, 0x6d, 0x5b, 0x63, 0x1f, 0x64, 0x5b, 0x77,
+ 0x4a, 0x43, 0x1a, 0xe5, 0x16, 0xf7, 0x27, 0x90,
+ 0xd2, 0xb7, 0xc7, 0x1b, 0xd2, 0xd7, 0x56, 0xfb,
+ 0x1e, 0x8e, 0x1f, 0x62, 0x82, 0x57, 0x73, 0x62,
+ 0x1e, 0x62, 0x73, 0x6d, 0x6c, 0x4c, 0x1b, 0x51,
+ 0x43, 0xc2, 0xf7, 0x2b, 0x85, 0x1f, 0xb, 0x15,
+ 0x90, 0xa0, 0x91, 0xa4, 0x9e, 0x9e, 0x8, 0x9f,
+ 0x9e, 0xa0, 0x99, 0xc2, 0x1b, 0xcb, 0xa1, 0x78,
+ 0x72, 0x9b, 0x1f, 0x9b, 0x73, 0x8a, 0x6a, 0x8a,
+ 0x6f, 0x54, 0x77, 0x40, 0x85, 0x79, 0x87, 0x8,
+ 0x60, 0x85, 0xfb, 0x2d, 0x78, 0xfb, 0x1d, 0x1a,
+ 0x33, 0xd9, 0x4b, 0xe8, 0xc3, 0xbb, 0x9b, 0xca,
+ 0xd6, 0x1e, 0xb, 0x8e, 0x7e, 0x99, 0x73, 0x9a,
+ 0x70, 0x8, 0xe7, 0x6, 0x6e, 0xbd, 0x7e, 0xad,
+ 0xf7, 0x19, 0x1a, 0xf7, 0xa, 0x7, 0x90, 0xe5,
+ 0x6e, 0xf3, 0xfb, 0x48, 0x8c, 0x8, 0x2b, 0x60,
+ 0x6f, 0x68, 0x6a, 0x1f, 0x6e, 0x68, 0x87, 0x64,
+ 0x85, 0x74, 0x8, 0xf7, 0xdb, 0xfb, 0x22, 0x15,
+ 0xb, 0xfc, 0xd0, 0x21, 0xa, 0xe, 0x99, 0x16,
+ 0xeb, 0x6, 0xd7, 0xf7, 0x77, 0x5, 0xf7, 0xb2,
+ 0x6, 0xdb, 0xfb, 0x77, 0x5, 0xf1, 0x6, 0xfb,
+ 0xab, 0xf9, 0x7c, 0x5, 0x2a, 0x6, 0x49, 0xfc,
+ 0x4b, 0x15, 0xf7, 0x4, 0xf7, 0xfd, 0x5, 0x8c,
+ 0x6, 0xf7, 0xb, 0xfb, 0xfd, 0x5, 0xb, 0x27,
+ 0x85, 0x45, 0x4c, 0x2a, 0x1b, 0x78, 0x7a, 0x92,
+ 0x9a, 0x7a, 0x1f, 0x7b, 0x9b, 0x84, 0x9c, 0x9e,
+ 0x1a, 0xae, 0x99, 0x9f, 0xa0, 0x97, 0x1e, 0xa0,
+ 0x97, 0x9d, 0x90, 0xa6, 0x8f, 0xbd, 0x94, 0xc7,
+ 0x94, 0xb1, 0x9a, 0x8, 0xe, 0x15, 0xf8, 0x2,
+ 0x6, 0xf7, 0x1c, 0x66, 0xd8, 0x55, 0xb0, 0x1e,
+ 0xb1, 0x55, 0x53, 0x90, 0x74, 0x1b, 0xfb, 0x38,
+ 0x8a, 0x4c, 0xfb, 0x8, 0x86, 0xfb, 0x32, 0x8,
+ 0x2d, 0xa, 0x7a, 0x7e, 0x3a, 0x22, 0x1b, 0x38,
+ 0x5d, 0xc3, 0xf7, 0x10, 0x7e, 0x1f, 0x90, 0xd3,
+ 0x15, 0x96, 0xce, 0xa2, 0xde, 0xf2, 0x8a, 0xec,
+ 0x8c, 0xab, 0x40, 0x90, 0x40, 0x8, 0xb, 0x41,
+ 0xa, 0xf9, 0x5d, 0x15, 0xfc, 0x2f, 0x7, 0xfb,
+ 0x13, 0x8f, 0xfb, 0x56, 0xf7, 0xa3, 0xf7, 0xac,
+ 0x95, 0xf7, 0x76, 0xea, 0x1e, 0xf8, 0x2f, 0x2c,
+ 0xfc, 0x2f, 0x7, 0xfb, 0x15, 0x78, 0x20, 0xfb,
+ 0x44, 0xfb, 0x48, 0x8b, 0xf7, 0x29, 0xe2, 0x1e,
+ 0xf8, 0x2f, 0x7, 0xb, 0xaa, 0x78, 0xe0, 0x2a,
+ 0xa, 0xb, 0x15, 0xef, 0x6, 0xc3, 0xde, 0xc0,
+ 0x38, 0x5, 0xef, 0x6, 0xfb, 0x2, 0x42, 0xa,
+ 0xb, 0x3b, 0x9f, 0x48, 0xb3, 0x5b, 0x1e, 0x5b,
+ 0xb4, 0xbe, 0x70, 0xdb, 0x1b, 0xcb, 0xb5, 0x9d,
+ 0xaa, 0xb0, 0x1f, 0xb2, 0xaa, 0xa4, 0xb5, 0x98,
+ 0xbc, 0x36, 0x96, 0x18, 0x6e, 0xb, 0x31, 0xa,
+ 0xf7, 0x49, 0x27, 0x31, 0xa, 0xb, 0x4c, 0xa,
+ 0xf7, 0x0, 0xf7, 0x1d, 0x38, 0xa, 0xb, 0x3,
+ 0xe1, 0x16, 0xf8, 0xa6, 0xe0, 0xfc, 0x47, 0xf7,
+ 0x90, 0xf8, 0x13, 0xe0, 0xfc, 0x13, 0xf7, 0x79,
+ 0xf8, 0x38, 0xe0, 0xfc, 0x97, 0x6, 0xb, 0x15,
+ 0xe5, 0xef, 0x31, 0x6, 0xb, 0x33, 0x6d, 0x2f,
+ 0x20, 0x24, 0x86, 0xdd, 0xe3, 0x1e, 0xf7, 0xb2,
+ 0x33, 0xfb, 0xd4, 0x7, 0xfb, 0x8, 0xcc, 0x2b,
+ 0xf7, 0x17, 0xb, 0xbb, 0xfb, 0xd, 0x15, 0x94,
+ 0x38, 0x55, 0xa, 0xa5, 0xec, 0xf2, 0xbe, 0x1f,
+ 0xf7, 0x5b, 0xf8, 0xa2, 0x5, 0x32, 0x6, 0xfb,
+ 0x27, 0xfc, 0x37, 0x5, 0x89, 0x6, 0xfb, 0x25,
+ 0xf8, 0x37, 0x5, 0x2c, 0x6, 0xf7, 0x59, 0xfc,
+ 0x9a, 0x5, 0x43, 0x71, 0x80, 0x52, 0x41, 0x1b,
+ 0x76, 0x7c, 0x95, 0x8f, 0x7e, 0x1f, 0xb, 0x3d,
+ 0xa, 0x6, 0x13, 0xb8, 0x33, 0xfb, 0xa8, 0x6,
+ 0x32, 0xa, 0x1e, 0x13, 0x74, 0x65, 0xa, 0x1f,
+ 0xb, 0x46, 0xa, 0xf9, 0x4, 0x77, 0x1, 0x27,
+ 0xa, 0xb, 0x6e, 0xa, 0x30, 0xa, 0xb, 0x15,
+ 0xe8, 0x6, 0xf5, 0x5a, 0xa, 0x27, 0x6, 0x53,
+ 0x38, 0x56, 0xde, 0x5, 0x27, 0x6, 0xe, 0x5,
+ 0xfb, 0x7, 0x6, 0xb, 0xa0, 0x76, 0xf9, 0x62,
+ 0x77, 0x1, 0xb, 0xf7, 0x10, 0xf8, 0xe9, 0x2c,
+ 0xa, 0xb, 0xe3, 0x3, 0xe4, 0x16, 0xe3, 0xf8,
+ 0x56, 0xf0, 0xcf, 0x26, 0xc0, 0x6, 0xc7, 0xb4,
+ 0xa5, 0xe0, 0x7c, 0x1e, 0x99, 0xd5, 0x5, 0x94,
+ 0x6f, 0x74, 0x8d, 0x74, 0x1b, 0xfb, 0x3, 0x60,
+ 0x2a, 0x4e, 0x1f, 0x58, 0x40, 0x47, 0xd6, 0x7,
+ 0xb, 0xb2, 0x86, 0xf7, 0x20, 0xfb, 0x1f, 0xfb,
+ 0x1a, 0x83, 0xfb, 0x19, 0x5d, 0x1e, 0xd4, 0x16,
+ 0xb1, 0x8a, 0xde, 0xd1, 0xc4, 0x98, 0x52, 0x4b,
+ 0x5d, 0x84, 0x40, 0x4c, 0x47, 0x8a, 0xd7, 0xb8,
+ 0x1e, 0xb, 0x4e, 0xa, 0x3c, 0xda, 0x13, 0x74,
+ 0xf8, 0x2e, 0x88, 0x15, 0xda, 0xf8, 0x9c, 0xb,
+ 0xf7, 0x23, 0xf8, 0xf2, 0x2e, 0xa, 0xb, 0xf7,
+ 0x73, 0xf8, 0xe9, 0x2f, 0xa, 0xb, 0x7d, 0xda,
+ 0x5f, 0x76, 0xf8, 0x5e, 0xd3, 0xb, 0x1, 0xda,
+ 0xea, 0xf8, 0xb, 0xea, 0x3, 0xda, 0xb, 0x5a,
+ 0xa, 0x2e, 0x6, 0xb, 0x73, 0x8b, 0xe0, 0xf7,
+ 0x90, 0xe0, 0xf7, 0x79, 0xe0, 0xb, 0x39, 0xa,
+ 0xce, 0xe3, 0x3, 0xce, 0x16, 0xe3, 0xb, 0x1,
+ 0xbc, 0xef, 0xf8, 0x74, 0xef, 0x3, 0xb, 0x5f,
+ 0xa, 0xf7, 0x77, 0xd9, 0xb, 0x15, 0xe9, 0xf7,
+ 0x6, 0x5d, 0x6, 0x8c, 0xa7, 0x8d, 0xc5, 0xbe,
+ 0xa0, 0x75, 0xad, 0x18, 0x3b, 0x67, 0x8b, 0x3d,
+ 0x5a, 0x1a, 0xb, 0x15, 0xb9, 0x6, 0x8a, 0x6f,
+ 0x89, 0x50, 0x58, 0x76, 0xa1, 0x69, 0x18, 0xdb,
+ 0xaf, 0x8b, 0xda, 0xbc, 0x1a, 0xe6, 0x2d, 0x7,
+ 0xb, 0x12, 0xba, 0xe9, 0xf7, 0x8d, 0xe3, 0x13,
+ 0x7c, 0xb, 0x7c, 0xd3, 0xf7, 0x48, 0xd3, 0xf7,
+ 0x29, 0xd3, 0xb, 0xfc, 0x31, 0xa0, 0x76, 0xb,
+ 0x15, 0xd3, 0x6, 0xb, 0xdb, 0xaf, 0x8b, 0xd9,
+ 0xbc, 0x1a, 0xe7, 0x2d, 0xfb, 0x6, 0xb9, 0x7,
+ 0x8a, 0x6f, 0x89, 0x51, 0x58, 0x76, 0x8, 0xb,
+ 0x12, 0xcf, 0xe3, 0xf7, 0x89, 0xe3, 0xb, 0xe2,
+ 0x78, 0xdf, 0xf8, 0xe4, 0xe0, 0xb, 0xfd, 0x72,
+ 0x15, 0xe3, 0xf8, 0x99, 0x7a, 0xa, 0xfe, 0x35,
+ 0x15, 0xea, 0xf9, 0x60, 0x2c, 0x6, 0xe, 0xf7,
+ 0x2b, 0x76, 0xf8, 0x29, 0x77, 0x1, 0xb, 0x9e,
+ 0x1b, 0xa0, 0xd2, 0x91, 0xf5, 0x8f, 0x1f, 0x4b,
+ 0x6, 0x69, 0x87, 0x80, 0x83, 0x77, 0x1b, 0xb,
+ 0xfb, 0xfa, 0xf8, 0xfa, 0x76, 0xf7, 0x21, 0x77,
+ 0x1, 0xb, 0x5, 0x87, 0x99, 0x8d, 0x85, 0xa4,
+ 0x1b, 0xf7, 0x7, 0xb, 0x1f, 0x4b, 0x6, 0x68,
+ 0x87, 0x80, 0x84, 0x77, 0x1b, 0xb, 0xf7, 0xad,
+ 0x16, 0xea, 0xf7, 0xc3, 0x6, 0xf7, 0xa9, 0xf8,
+ 0x2e, 0x5, 0xfb, 0x2, 0x6, 0xb, 0x31, 0xa,
+ 0xf7, 0x37, 0x72, 0xa, 0x38, 0xa, 0xe, 0xf7,
+ 0x1d, 0x5, 0xb, 0xfb, 0x53, 0xa0, 0x76, 0xf8,
+ 0x56, 0xcf, 0xf7, 0x10, 0xd5, 0x1, 0xe4, 0xe3,
+ 0xb, 0x15, 0xb7, 0x6, 0x9c, 0xf7, 0x1e, 0x5,
+ 0xf7, 0x9, 0x3e, 0xfb, 0x9, 0x7, 0xb, 0x69,
+ 0x8a, 0xfb, 0x25, 0xf7, 0x23, 0xf7, 0x23, 0x8c,
+ 0xf7, 0x1a, 0xb8, 0xb, 0x4c, 0xa, 0x4a, 0x74,
+ 0xa, 0x73, 0xa0, 0x76, 0xb, 0x15, 0xc9, 0x6,
+ 0xf7, 0x2b, 0xf7, 0x21, 0x38, 0xa, 0xb, 0x4b,
+ 0xa, 0xfa, 0x35, 0x77, 0x1, 0xe5, 0xea, 0x3,
+ 0xb, 0x4b, 0xa, 0xf9, 0x72, 0x77, 0x1, 0xea,
+ 0xe3, 0x3, 0xb, 0x1, 0xaa, 0x16, 0xf8, 0x4a,
+ 0xd7, 0xfb, 0xde, 0x6, 0xf7, 0xce, 0xb, 0x15,
+ 0x5a, 0xb1, 0x63, 0xbc, 0xbc, 0xb3, 0xb3, 0xbc,
+ 0xbc, 0x63, 0xb, 0xa6, 0xc7, 0x8e, 0xe0, 0xc6,
+ 0xb, 0xfb, 0x4e, 0x76, 0xf7, 0x5e, 0xd3, 0xf8,
+ 0x26, 0xd0, 0x1, 0xb, 0x5, 0xc4, 0xfc, 0x28,
+ 0x43, 0xf7, 0xb7, 0x7, 0xfb, 0xc9, 0xb, 0xa0,
+ 0x76, 0xf8, 0x9f, 0x77, 0x1, 0xb, 0xfc, 0x31,
+ 0xfb, 0x58, 0xd4, 0xf9, 0x98, 0xd4, 0x12, 0xb,
+ 0x1, 0xa2, 0x16, 0xf8, 0xc9, 0xe0, 0xfc, 0x5c,
+ 0x6, 0xb, 0x15, 0xcc, 0x6, 0xba, 0x8a, 0xad,
+ 0x8b, 0x8f, 0x1b, 0xb, 0x3c, 0x96, 0x1e, 0xe1,
+ 0x97, 0x5, 0xb3, 0x84, 0x7a, 0xb, 0xe3, 0xec,
+ 0x7a, 0xa, 0x1, 0xe1, 0xea, 0xb, 0xa0, 0x76,
+ 0xf8, 0x62, 0xd7, 0x12, 0xcc, 0xe3, 0xb, 0xfb,
+ 0xfa, 0xfb, 0x4e, 0x76, 0xfa, 0x40, 0x77, 0xb,
+ 0x20, 0xab, 0x76, 0xf8, 0x78, 0x77, 0x1, 0xbb,
+ 0xb, 0x27, 0x31, 0xa, 0xe, 0x5a, 0x58, 0x68,
+ 0x3e, 0x8c, 0x1f, 0xe, 0xf7, 0x1d, 0x59, 0xa,
+ 0xf7, 0x5, 0x8a, 0x77, 0x12, 0xb, 0x7d, 0xd3,
+ 0xf8, 0x2a, 0xd3, 0xb, 0xb8, 0xe5, 0xf7, 0xb2,
+ 0xe5, 0xb, 0xf7, 0x54, 0xd9, 0xfb, 0x54, 0xb,
+ 0x7c, 0xd7, 0x60, 0x76, 0xb, 0x33, 0x6, 0xe
+ };
diff --git a/core/src/fxge/fontdata/chromefontdata/FoxitSansBold.c b/core/src/fxge/fontdata/chromefontdata/FoxitSansBold.c
new file mode 100644
index 0000000000..594b37fe93
--- /dev/null
+++ b/core/src/fxge/fontdata/chromefontdata/FoxitSansBold.c
@@ -0,0 +1,2051 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+const unsigned char g_FoxitSansBoldFontData [16344] = {0x1,
+ 0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0x12,
+ 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x53, 0x61, 0x6e,
+ 0x73, 0x4f, 0x54, 0x46, 0x2d, 0x42, 0x6f, 0x6c,
+ 0x64, 0x0, 0x1, 0x1, 0x1, 0x24, 0xf8, 0x10,
+ 0x0, 0xf8, 0x1c, 0x1, 0xf8, 0x1d, 0x2, 0xf8,
+ 0x1e, 0x3, 0xf8, 0x14, 0x4, 0xfb, 0x3e, 0xfb,
+ 0x78, 0xfa, 0x7e, 0xfa, 0x56, 0x5, 0xf7, 0x2f,
+ 0xf, 0xf8, 0x8f, 0x11, 0xb5, 0x1c, 0x39, 0x77,
+ 0x12, 0x0, 0x4, 0x1, 0x1, 0x5, 0x2f, 0x42,
+ 0x50, 0x45, 0x75, 0x72, 0x6f, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x43,
+ 0x68, 0x72, 0x6f, 0x6d, 0x20, 0x53, 0x61, 0x6e,
+ 0x73, 0x20, 0x4f, 0x54, 0x46, 0x20, 0x42, 0x6f,
+ 0x6c, 0x64, 0x43, 0x68, 0x72, 0x6F, 0x6D, 0x20,
+ 0x53, 0x61, 0x6e, 0x73, 0x20, 0x4f, 0x54, 0x46,
+ 0x0, 0x0, 0x1, 0x0, 0x1, 0x0, 0x0, 0x81,
+ 0x1, 0x0, 0x84, 0x0, 0x0, 0x86, 0x2, 0x0,
+ 0x91, 0x0, 0x0, 0x63, 0x0, 0x0, 0x6d, 0x1,
+ 0x0, 0x8c, 0x0, 0x0, 0x92, 0x0, 0x0, 0xc7,
+ 0x0, 0x0, 0xe4, 0x0, 0x0, 0x2, 0x5, 0x0,
+ 0x68, 0x0, 0x0, 0x9, 0x37, 0x0, 0x7c, 0x0,
+ 0x0, 0x42, 0x1d, 0x1, 0x87, 0x0, 0x0, 0x75,
+ 0x0, 0x0, 0x65, 0x0, 0x0, 0x76, 0x0, 0x0,
+ 0x79, 0x0, 0x0, 0x70, 0x1, 0x0, 0x7e, 0x0,
+ 0x0, 0x7a, 0x0, 0x0, 0xc0, 0x0, 0x0, 0x6b,
+ 0x0, 0x0, 0x8e, 0x0, 0x0, 0x41, 0x0, 0x0,
+ 0x8, 0x0, 0x0, 0x69, 0x0, 0x0, 0x77, 0x0,
+ 0x0, 0x74, 0x0, 0x0, 0x6f, 0x0, 0x0, 0x89,
+ 0x0, 0x0, 0x7f, 0x0, 0x0, 0x99, 0x0, 0x0,
+ 0xdd, 0x0, 0x0, 0x6c, 0x0, 0x0, 0x94, 0x0,
+ 0x0, 0xc6, 0x0, 0x0, 0x60, 0x2, 0x0, 0x67,
+ 0x0, 0x0, 0x64, 0x0, 0x0, 0xa0, 0x0, 0x0,
+ 0x66, 0x0, 0x0, 0x83, 0x0, 0x0, 0xaa, 0x0,
+ 0x0, 0x8b, 0x0, 0x0, 0x6a, 0x0, 0x0, 0x97,
+ 0x0, 0x0, 0xa6, 0x0, 0x0, 0xa5, 0x0, 0x0,
+ 0x80, 0x0, 0x0, 0xa1, 0x0, 0x0, 0x9c, 0x0,
+ 0x0, 0xa4, 0x0, 0x0, 0xa9, 0x0, 0x0, 0x7d,
+ 0x0, 0x0, 0x98, 0x0, 0x0, 0x73, 0x0, 0x0,
+ 0x72, 0x0, 0x0, 0x85, 0x0, 0x0, 0x96, 0x0,
+ 0x0, 0x8f, 0x0, 0x0, 0x78, 0x0, 0x0, 0x9e,
+ 0x0, 0x0, 0x9b, 0x0, 0x0, 0xa3, 0x0, 0x0,
+ 0x7b, 0x0, 0x0, 0xae, 0x0, 0x0, 0xab, 0x1,
+ 0x0, 0xb0, 0x0, 0x0, 0xad, 0x0, 0x0, 0xaf,
+ 0x0, 0x0, 0x8a, 0x0, 0x0, 0xb1, 0x0, 0x0,
+ 0xb5, 0x0, 0x0, 0xb2, 0x2, 0x0, 0xb9, 0x0,
+ 0x0, 0xb6, 0x2, 0x0, 0x9a, 0x0, 0x0, 0xba,
+ 0x0, 0x0, 0xbe, 0x0, 0x0, 0xbb, 0x1, 0x0,
+ 0xbf, 0x0, 0x0, 0xbd, 0x0, 0x0, 0xa8, 0x0,
+ 0x0, 0x8d, 0x0, 0x0, 0xc4, 0x0, 0x0, 0xc1,
+ 0x2, 0x0, 0xc5, 0x0, 0x0, 0x9d, 0x0, 0x0,
+ 0x95, 0x0, 0x0, 0xcb, 0x0, 0x0, 0xc8, 0x1,
+ 0x0, 0xcd, 0x0, 0x0, 0xca, 0x0, 0x0, 0xcc,
+ 0x0, 0x0, 0x90, 0x0, 0x0, 0xce, 0x0, 0x0,
+ 0xd2, 0x0, 0x0, 0xcf, 0x2, 0x0, 0xd6, 0x0,
+ 0x0, 0xd3, 0x2, 0x0, 0xa7, 0x0, 0x0, 0xd7,
+ 0x0, 0x0, 0xdb, 0x0, 0x0, 0xd8, 0x1, 0x0,
+ 0xdc, 0x0, 0x0, 0xda, 0x0, 0x0, 0x9f, 0x0,
+ 0x0, 0x93, 0x0, 0x0, 0xe1, 0x0, 0x0, 0xde,
+ 0x2, 0x0, 0xe2, 0x0, 0x0, 0xa2, 0x0, 0x0,
+ 0xe3, 0x0, 0x0, 0xe6, 0x2, 0x0, 0x1, 0x0,
+ 0x4, 0x0, 0x7, 0x0, 0x2c, 0x0, 0x41, 0x0,
+ 0x75, 0x0, 0x84, 0x0, 0xb3, 0x0, 0xce, 0x0,
+ 0xd9, 0x0, 0xf1, 0x1, 0x30, 0x1, 0x6b, 0x1,
+ 0x9a, 0x1, 0xc3, 0x1, 0xf1, 0x2, 0x32, 0x2,
+ 0x5e, 0x2, 0x8a, 0x2, 0xed, 0x3, 0x76, 0x4,
+ 0x7, 0x4, 0xa5, 0x4, 0xc4, 0x4, 0xfb, 0x5,
+ 0x33, 0x5, 0x66, 0x5, 0x8c, 0x5, 0xbb, 0x5,
+ 0xcc, 0x5, 0xdf, 0x5, 0xf5, 0x6, 0x3f, 0x6,
+ 0x69, 0x6, 0xbc, 0x7, 0x1e, 0x7, 0x55, 0x7,
+ 0xa7, 0x8, 0xa, 0x8, 0x3e, 0x8, 0xaf, 0x9,
+ 0x14, 0x9, 0x34, 0x9, 0x6d, 0x9, 0x8c, 0x9,
+ 0xab, 0x9, 0xc9, 0xa, 0x2e, 0xa, 0xda, 0xb,
+ 0xd, 0xb, 0x6c, 0xb, 0xbc, 0xb, 0xfb, 0xc,
+ 0x24, 0xc, 0x48, 0xc, 0xc3, 0xc, 0xef, 0xd,
+ 0x2, 0xd, 0x33, 0xd, 0x64, 0xd, 0x78, 0xd,
+ 0xb8, 0xd, 0xdb, 0xe, 0x52, 0xe, 0x88, 0xf,
+ 0x1a, 0xf, 0x73, 0xf, 0xdc, 0xf, 0xfb, 0x10,
+ 0x32, 0x10, 0x50, 0x10, 0x93, 0x10, 0xc5, 0x10,
+ 0xdf, 0x10, 0xf9, 0x11, 0x13, 0x11, 0x2a, 0x11,
+ 0x44, 0x11, 0x65, 0x11, 0x72, 0x11, 0x88, 0x11,
+ 0xed, 0x12, 0x48, 0x12, 0x92, 0x12, 0xed, 0x13,
+ 0x43, 0x13, 0x79, 0x13, 0xe7, 0x14, 0x23, 0x14,
+ 0x3c, 0x14, 0x80, 0x14, 0xaf, 0x14, 0xba, 0x15,
+ 0x19, 0x15, 0x58, 0x15, 0xa2, 0x15, 0xef, 0x16,
+ 0x43, 0x16, 0x82, 0x16, 0xe4, 0x17, 0x1e, 0x17,
+ 0x60, 0x17, 0x85, 0x17, 0xc1, 0x17, 0xf3, 0x18,
+ 0x22, 0x18, 0x48, 0x18, 0x8c, 0x18, 0xa4, 0x18,
+ 0xea, 0x19, 0x2c, 0x19, 0xa7, 0x19, 0xcf, 0x1a,
+ 0x33, 0x1a, 0x70, 0x1a, 0xa3, 0x1a, 0xcd, 0x1b,
+ 0x5, 0x1b, 0x19, 0x1b, 0xcf, 0x1c, 0x49, 0x1c,
+ 0x5f, 0x1c, 0xda, 0x1d, 0x5, 0x1d, 0x2e, 0x1d,
+ 0x7f, 0x1d, 0xb8, 0x1d, 0xdb, 0x1d, 0xea, 0x1d,
+ 0xfa, 0x1e, 0x3e, 0x1e, 0x8c, 0x1f, 0x4, 0x1f,
+ 0x19, 0x1f, 0xaf, 0x1f, 0xda, 0x20, 0xa, 0x20,
+ 0x88, 0x21, 0x14, 0x21, 0x8e, 0x21, 0xd3, 0x21,
+ 0xf2, 0x22, 0x9b, 0x22, 0xab, 0x23, 0x1b, 0x23,
+ 0x95, 0x23, 0xa3, 0x23, 0xbd, 0x23, 0xcf, 0x24,
+ 0x4d, 0x24, 0x60, 0x24, 0x99, 0x24, 0xc7, 0x25,
+ 0x9, 0x25, 0x61, 0x25, 0x74, 0x25, 0xba, 0x25,
+ 0xec, 0x26, 0x4, 0x26, 0x3b, 0x26, 0x61, 0x26,
+ 0xa4, 0x26, 0xb1, 0x27, 0x19, 0x27, 0x96, 0x28,
+ 0x2f, 0x28, 0x85, 0x28, 0x9d, 0x28, 0xb6, 0x28,
+ 0xd5, 0x29, 0x1b, 0x29, 0x3d, 0x29, 0x71, 0x29,
+ 0xb8, 0x2a, 0x49, 0x2a, 0x59, 0x2a, 0x6a, 0x2a,
+ 0x91, 0x2a, 0xb8, 0x2a, 0xcd, 0x2a, 0xe1, 0x2a,
+ 0xfc, 0x2b, 0x15, 0x2b, 0x63, 0x2b, 0xbb, 0x2b,
+ 0xe9, 0x2c, 0xd, 0x2c, 0x3a, 0x2c, 0x87, 0x2c,
+ 0xaf, 0x2c, 0xdf, 0x2d, 0x5f, 0x2d, 0x7c, 0x2d,
+ 0x98, 0x2d, 0xbf, 0x2d, 0xea, 0x2e, 0x1a, 0x2e,
+ 0x5d, 0x2e, 0xcc, 0x2e, 0xe3, 0x2e, 0xfa, 0x2f,
+ 0x1b, 0x2f, 0x77, 0x2f, 0x9f, 0x2f, 0xe5, 0x30,
+ 0x8f, 0x31, 0x1c, 0x31, 0x36, 0x31, 0x51, 0x31,
+ 0x73, 0x31, 0x97, 0x31, 0xae, 0x31, 0xc5, 0x31,
+ 0xe4, 0x32, 0x3, 0x32, 0x7c, 0x32, 0xf4, 0x33,
+ 0x11, 0x33, 0x24, 0x33, 0x42, 0x33, 0x80, 0x33,
+ 0xa8, 0x33, 0xd7, 0x34, 0x55, 0x34, 0x6b, 0x34,
+ 0x81, 0x34, 0xa8, 0x34, 0xd6, 0x35, 0x13, 0x35,
+ 0x67, 0x35, 0xac, 0xfc, 0x15, 0xe, 0xfc, 0x15,
+ 0xe, 0xf8, 0xf0, 0xcb, 0xdd, 0x77, 0x1, 0x89,
+ 0xf9, 0x82, 0x15, 0x22, 0x95, 0xd9, 0x62, 0xdb,
+ 0x1b, 0xda, 0xdb, 0xb3, 0xf5, 0x95, 0x1f, 0x4b,
+ 0x6, 0x78, 0x8a, 0x7b, 0x4c, 0x33, 0x1b, 0x4a,
+ 0x6a, 0xb2, 0xb6, 0x85, 0x1f, 0xe, 0xf8, 0xfa,
+ 0xf7, 0x7, 0x1, 0xf3, 0xf7, 0x12, 0x3, 0xf3,
+ 0xf8, 0xfa, 0x15, 0xf7, 0x12, 0xf7, 0x7, 0xfb,
+ 0x12, 0x6, 0xe, 0xf8, 0xcc, 0xc4, 0xe9, 0xc4,
+ 0x1, 0xc6, 0xc6, 0xed, 0xc6, 0x3, 0xc6, 0xf9,
+ 0x35, 0x15, 0x51, 0xbc, 0x5c, 0xc7, 0xc4, 0xbd,
+ 0xb8, 0xc7, 0xc6, 0x5a, 0xb7, 0x51, 0x4d, 0x5c,
+ 0x5e, 0x51, 0x1e, 0xc6, 0x16, 0xa5, 0xa0, 0x9f,
+ 0xa8, 0xa5, 0xa1, 0x78, 0x70, 0x70, 0x75, 0x76,
+ 0x71, 0x6f, 0x75, 0xa0, 0xa6, 0x1e, 0xe, 0xf8,
+ 0xf0, 0x84, 0xa, 0x94, 0xf8, 0xf0, 0x6b, 0xa,
+ 0xef, 0xfb, 0x26, 0x6b, 0xa, 0xe, 0xfb, 0x78,
+ 0xd8, 0xf7, 0x2b, 0x77, 0x1, 0xd2, 0xe2, 0x3,
+ 0xe5, 0x16, 0x80, 0x61, 0x83, 0x6a, 0x67, 0x1a,
+ 0x35, 0xdd, 0x6c, 0xcc, 0x9c, 0xa5, 0x8e, 0x9c,
+ 0xb6, 0x1e, 0xd0, 0x7, 0x87, 0x80, 0x61, 0x83,
+ 0x6a, 0x1b, 0x53, 0x87, 0xac, 0xb8, 0xa3, 0x8e,
+ 0xa7, 0x93, 0xa0, 0x1f, 0xe, 0xf8, 0xf0, 0xd1,
+ 0x1, 0xed, 0xf8, 0xf0, 0x15, 0xf7, 0x1b, 0x6,
+ 0xf7, 0x2, 0x83, 0xa, 0xfb, 0xa, 0x6, 0x52,
+ 0x3f, 0x4e, 0xd7, 0x5, 0xfb, 0x9, 0x6, 0xe,
+ 0xfc, 0x15, 0x73, 0xa, 0xd3, 0x63, 0xa, 0xf8,
+ 0xa8, 0x6d, 0xa, 0xfc, 0x84, 0x8d, 0x76, 0xf9,
+ 0x6d, 0x77, 0x1, 0x2f, 0x78, 0x15, 0xf8, 0x40,
+ 0xf9, 0x6d, 0x5, 0x3d, 0x6, 0xfc, 0x40, 0xfd,
+ 0x6d, 0x5, 0xe, 0x57, 0x76, 0xa, 0xd2, 0xf7,
+ 0x13, 0x1, 0xe2, 0xf7, 0x20, 0xf7, 0x43, 0x7d,
+ 0xa, 0xe2, 0x16, 0xf7, 0x20, 0xf8, 0x2c, 0xf4,
+ 0xf7, 0x1, 0x22, 0x6, 0xf4, 0xc5, 0x96, 0xca,
+ 0x78, 0x1e, 0x9f, 0xeb, 0x5, 0x98, 0x5f, 0x73,
+ 0x8f, 0x6f, 0x1b, 0xfb, 0x37, 0x6f, 0xa, 0xf7,
+ 0xcf, 0xfc, 0x2c, 0x15, 0xf7, 0x20, 0xf8, 0x99,
+ 0x68, 0xa, 0xd2, 0x4, 0xf7, 0x20, 0xf7, 0x13,
+ 0x6d, 0xa, 0x57, 0x76, 0xa, 0xf7, 0x66, 0x77,
+ 0x1, 0xe2, 0xf7, 0x20, 0xf7, 0x44, 0xf7, 0x1f,
+ 0x3, 0xf8, 0x27, 0x16, 0xf7, 0x1f, 0xf9, 0x5f,
+ 0xfb, 0x1f, 0x6, 0xfb, 0xd0, 0xfd, 0x5f, 0x15,
+ 0xf7, 0x20, 0xf8, 0x2c, 0xf3, 0xf7, 0x1, 0x23,
+ 0x6, 0xdf, 0xb1, 0xab, 0xde, 0x78, 0x1e, 0x9e,
+ 0xeb, 0x5, 0x98, 0x5f, 0x74, 0x8f, 0x6e, 0x1b,
+ 0xfb, 0x36, 0x6f, 0xa, 0xe, 0x86, 0xa, 0xa7,
+ 0xf7, 0x16, 0x3, 0xc6, 0x16, 0xf8, 0xa0, 0xf7,
+ 0xe, 0xfc, 0x1e, 0xf7, 0x7c, 0x6, 0xf7, 0x3b,
+ 0xf7, 0x1a, 0x5, 0xf7, 0xc, 0x7, 0xfb, 0x3b,
+ 0xfb, 0x1c, 0x5, 0xf7, 0x8a, 0xfb, 0x16, 0xfb,
+ 0xf9, 0x7, 0x3c, 0x4a, 0x5, 0xfb, 0x9, 0x7,
+ 0xda, 0xcb, 0x5, 0xe, 0xfc, 0x15, 0x3f, 0xa,
+ 0xd1, 0xf7, 0xa, 0x3, 0xd1, 0x16, 0xf7, 0xa,
+ 0xf7, 0xfa, 0x6, 0xf7, 0x0, 0xd8, 0x5, 0xe9,
+ 0x7, 0xfb, 0x0, 0x3d, 0x5, 0xf7, 0x9f, 0xfb,
+ 0xa, 0xfb, 0xf6, 0x7, 0x33, 0x48, 0x5, 0x2d,
+ 0x7, 0xe3, 0xcf, 0x5, 0xe, 0x57, 0x8b, 0xf7,
+ 0xd, 0xf8, 0x6e, 0x82, 0xa, 0xa4, 0x16, 0xf8,
+ 0xc5, 0xf7, 0xd, 0x87, 0xa, 0xf7, 0x5, 0xfc,
+ 0x8e, 0xfb, 0xd, 0x8c, 0xa, 0xf7, 0x6e, 0xf9,
+ 0x2d, 0x15, 0xf7, 0xf, 0x6, 0xee, 0xf7, 0x21,
+ 0x5, 0x20, 0x6, 0x58, 0x42, 0x54, 0xd4, 0x5,
+ 0x21, 0x6, 0xe, 0xfb, 0x37, 0x8b, 0xf7, 0xd,
+ 0xf7, 0xaf, 0xf7, 0x6, 0xe5, 0xf7, 0x22, 0x1,
+ 0x9f, 0x16, 0xf8, 0x60, 0xf7, 0xd, 0xfb, 0xad,
+ 0x6, 0xf7, 0x9d, 0xf7, 0xc0, 0x5, 0xec, 0xfc,
+ 0x3d, 0xfb, 0x6, 0x7, 0xf7, 0x88, 0x8c, 0xfb,
+ 0x9b, 0xfb, 0xbe, 0x5, 0xf7, 0x3b, 0xf8, 0x89,
+ 0x15, 0xf7, 0x12, 0x6, 0xf1, 0xf7, 0x22, 0x5,
+ 0xfb, 0x2, 0x6, 0x56, 0x42, 0x53, 0xd4, 0x5,
+ 0xfb, 0x1, 0x6, 0xe, 0x8b, 0xf7, 0x1d, 0xf8,
+ 0xd9, 0x77, 0x12, 0xe5, 0xf7, 0x28, 0xfb, 0x28,
+ 0xf7, 0x2e, 0x13, 0xe0, 0xe8, 0x16, 0xf7, 0x25,
+ 0xf7, 0x1d, 0xfb, 0x25, 0x6, 0xab, 0xbc, 0x15,
+ 0xdd, 0x6, 0x13, 0xd0, 0xb0, 0xf8, 0x0, 0x5,
+ 0xf7, 0x3c, 0xfb, 0x2e, 0xfb, 0x3c, 0x7, 0xe,
+ 0xfb, 0x51, 0xf8, 0x68, 0x76, 0xf7, 0xa3, 0x77,
+ 0x1, 0xf7, 0xb3, 0xf8, 0x53, 0x15, 0xd3, 0x6,
+ 0x9c, 0x67, 0xa, 0xf7, 0x14, 0xfb, 0x1, 0xfb,
+ 0x14, 0x7, 0xfb, 0x2a, 0xfb, 0x23, 0x15, 0xd4,
+ 0x6, 0x9b, 0x67, 0xa, 0xf7, 0x14, 0xfb, 0x0,
+ 0xfb, 0x14, 0x7, 0xe, 0x20, 0xa0, 0x76, 0xf7,
+ 0x47, 0xf2, 0xf7, 0x1c, 0xf2, 0xf7, 0x45, 0x77,
+ 0x1, 0xb8, 0x16, 0xf6, 0x6, 0xb0, 0xf7, 0x47,
+ 0x5, 0xf4, 0x6, 0x67, 0xfb, 0x47, 0x5, 0xf4,
+ 0x6, 0xb1, 0xf7, 0x47, 0x5, 0xf7, 0x1d, 0xf2,
+ 0xfb, 0x7, 0x6, 0xa7, 0xf7, 0x1c, 0x5, 0xe2,
+ 0xf2, 0x49, 0x6, 0xb1, 0xf7, 0x45, 0x5, 0xfb,
+ 0x2, 0x6, 0x66, 0xfb, 0x45, 0x5, 0x24, 0x6,
+ 0xaf, 0xf7, 0x45, 0x5, 0x22, 0x6, 0x65, 0xfb,
+ 0x45, 0x5, 0xfb, 0x1b, 0x24, 0xf7, 0x6, 0x6,
+ 0x6e, 0xfb, 0x1c, 0x5, 0x36, 0x24, 0xcb, 0x6,
+ 0xf7, 0x14, 0xf2, 0x15, 0xa7, 0xf7, 0x1c, 0x5,
+ 0xf4, 0x6, 0x6f, 0xfb, 0x1c, 0x5, 0xe, 0x20,
+ 0x2d, 0x76, 0xfa, 0xe, 0x77, 0x12, 0xf7, 0x85,
+ 0xd4, 0xdf, 0xf7, 0x11, 0x17, 0xa9, 0xf7, 0x54,
+ 0x15, 0x9b, 0x24, 0xc2, 0x2a, 0xf7, 0x20, 0x7b,
+ 0x8, 0x30, 0xd4, 0xe8, 0x7, 0xf7, 0x44, 0xa4,
+ 0xac, 0xf7, 0x7, 0xd0, 0x1a, 0xf7, 0x34, 0xfb,
+ 0x19, 0xc0, 0x3f, 0xa0, 0x1e, 0xf7, 0x56, 0x7,
+ 0xbb, 0x77, 0x94, 0x62, 0x8e, 0x79, 0xf7, 0x13,
+ 0x9b, 0x18, 0x71, 0xf7, 0x2e, 0xfb, 0x13, 0x9a,
+ 0x69, 0x8f, 0x8, 0x13, 0x70, 0xbd, 0x7, 0x42,
+ 0x59, 0x6, 0x24, 0x81, 0x34, 0x46, 0xfb, 0xe,
+ 0x1a, 0xfb, 0x32, 0xf7, 0x17, 0x5c, 0xc6, 0x7b,
+ 0x1e, 0xfb, 0x64, 0x7, 0x74, 0x96, 0x60, 0xab,
+ 0x7e, 0xcf, 0x8, 0xf7, 0x2c, 0xfb, 0xa, 0x15,
+ 0xf7, 0x56, 0x7, 0xa1, 0x85, 0xc9, 0x79, 0x44,
+ 0x1a, 0x60, 0x6f, 0x5d, 0x53, 0x81, 0x1e, 0x42,
+ 0xf7, 0xf9, 0x15, 0x4a, 0xa7, 0x8a, 0xb5, 0x94,
+ 0x1a, 0xad, 0xa1, 0xb7, 0xb7, 0x99, 0x1e, 0xe,
+ 0xf7, 0x76, 0x78, 0xd5, 0xf7, 0x69, 0xd5, 0x90,
+ 0xd5, 0xf7, 0x69, 0xd5, 0x8d, 0x77, 0x12, 0xa7,
+ 0xf7, 0x4, 0xf3, 0xf7, 0x4, 0xf7, 0x45, 0xf7,
+ 0x4, 0xf3, 0xf7, 0x4, 0x13, 0xf7, 0x80, 0xf7,
+ 0x20, 0xf8, 0xa4, 0x15, 0xd2, 0x98, 0xae, 0xb2,
+ 0xb3, 0x97, 0x67, 0x45, 0x42, 0x7f, 0x69, 0x63,
+ 0x63, 0x7f, 0xaf, 0xd2, 0x1e, 0xfb, 0x4, 0x16,
+ 0x2d, 0xaf, 0x34, 0xf7, 0x14, 0xf7, 0x29, 0x9a,
+ 0xf7, 0xd, 0xc7, 0xf6, 0x5e, 0xd4, 0xfb, 0xb,
+ 0xfb, 0x28, 0x7b, 0xfb, 0xd, 0x50, 0x1e, 0xf7,
+ 0x3b, 0xfc, 0xb7, 0x15, 0xf6, 0x6, 0x13, 0xef,
+ 0x80, 0xf8, 0x1f, 0xf9, 0x6d, 0x5, 0x24, 0x6,
+ 0x4e, 0xfc, 0xba, 0x15, 0x2d, 0xb0, 0x36, 0xf7,
+ 0x15, 0xf7, 0x27, 0x9a, 0xf7, 0xb, 0xc9, 0xf6,
+ 0x5e, 0xd4, 0xfb, 0xa, 0xfb, 0x2a, 0x7c, 0xfb,
+ 0xd, 0x4e, 0x1e, 0xf7, 0x4, 0x8e, 0x15, 0xd3,
+ 0x97, 0xac, 0xb3, 0xb3, 0x97, 0x68, 0x45, 0x43,
+ 0x7f, 0x67, 0x63, 0x63, 0x7f, 0xb0, 0xd2, 0x1e,
+ 0xe, 0xc6, 0x7e, 0xf7, 0x4, 0x2a, 0x76, 0xf9,
+ 0x15, 0xeb, 0x12, 0xc1, 0xf7, 0x1e, 0x59, 0xf7,
+ 0x17, 0x13, 0x68, 0xf8, 0x8e, 0xca, 0x15, 0xa5,
+ 0x72, 0xb5, 0x69, 0xb9, 0x74, 0xdc, 0xf5, 0x18,
+ 0x75, 0x94, 0x52, 0xb3, 0x6c, 0xa9, 0x9c, 0xa1,
+ 0x9c, 0xa7, 0xa5, 0xeb, 0xfb, 0xd, 0xa6, 0x18,
+ 0x87, 0x7a, 0x81, 0x69, 0x7c, 0x6d, 0x29, 0xf7,
+ 0x16, 0x18, 0xda, 0xbe, 0xbc, 0xb8, 0xd4, 0x1a,
+ 0xe5, 0x42, 0xd2, 0xfb, 0xd, 0xfb, 0xe, 0x42,
+ 0x40, 0x35, 0x57, 0xa7, 0x5e, 0xb7, 0x59, 0x1e,
+ 0x13, 0xb0, 0x68, 0x79, 0xfb, 0x11, 0x4c, 0xfb,
+ 0x1c, 0x1a, 0x54, 0xa6, 0xfb, 0x2b, 0xf7, 0x6b,
+ 0xf7, 0x4, 0xc7, 0xb4, 0xae, 0xb1, 0x1e, 0x36,
+ 0xe5, 0x15, 0x76, 0x71, 0x64, 0x6a, 0x4f, 0x1b,
+ 0x43, 0x6b, 0xb8, 0xbc, 0xb5, 0xa3, 0xc0, 0xcf,
+ 0xae, 0x1f, 0xbd, 0xf7, 0x29, 0x15, 0x6c, 0xaf,
+ 0x5, 0x13, 0xa8, 0x89, 0x8e, 0x6f, 0x8f, 0xb5,
+ 0x1a, 0xa5, 0x9e, 0xb2, 0xb8, 0xbf, 0xa3, 0x66,
+ 0x6f, 0x74, 0x7c, 0x7e, 0x7a, 0x7d, 0x1e, 0x7a,
+ 0x7c, 0x77, 0x7e, 0x81, 0x84, 0x8, 0xe, 0xfc,
+ 0x3d, 0xf8, 0x68, 0x76, 0xf7, 0xa3, 0x77, 0x1,
+ 0x7e, 0x85, 0xa, 0xc3, 0xf8, 0x53, 0x15, 0xf7,
+ 0x8, 0x6, 0x9b, 0xf7, 0x22, 0x5, 0xf7, 0x15,
+ 0xfb, 0x28, 0xfb, 0x15, 0x7, 0xe, 0xfb, 0x4f,
+ 0x76, 0xfa, 0x42, 0x77, 0x1, 0xae, 0x85, 0xa,
+ 0xf7, 0x63, 0xfb, 0x64, 0x15, 0xf5, 0x6, 0x61,
+ 0xdb, 0x33, 0xf7, 0x39, 0xf7, 0x73, 0x1a, 0xf7,
+ 0x52, 0xc0, 0xf7, 0x16, 0xd9, 0xf7, 0x2e, 0x1e,
+ 0x22, 0x6, 0x34, 0xfb, 0x4, 0x34, 0xfb, 0x39,
+ 0xfb, 0x59, 0x1a, 0xfb, 0x3b, 0xd0, 0xfb, 0x35,
+ 0xf2, 0xfb, 0x20, 0x1e, 0xe, 0xfb, 0x4f, 0x76,
+ 0xfa, 0x42, 0x77, 0x1, 0xf7, 0x29, 0xf7, 0x29,
+ 0x3, 0x9e, 0xfb, 0x64, 0x15, 0xf4, 0x6, 0xe2,
+ 0xf7, 0x4, 0xe2, 0xf7, 0x35, 0xf7, 0x59, 0x1a,
+ 0xf7, 0x3b, 0x46, 0xf7, 0x39, 0x24, 0xf7, 0x20,
+ 0x1e, 0x21, 0x6, 0xb5, 0x3b, 0xe2, 0xfb, 0x3d,
+ 0xfb, 0x73, 0x1a, 0xfb, 0x52, 0x57, 0xfb, 0x12,
+ 0x3d, 0xfb, 0x2e, 0x1e, 0xe, 0xfb, 0xa6, 0x4d,
+ 0xa, 0xf7, 0x30, 0xd2, 0x3, 0xf7, 0x13, 0xf8,
+ 0x17, 0x15, 0xcc, 0xf7, 0x1, 0xc9, 0x21, 0xd1,
+ 0xbb, 0x3a, 0xeb, 0xf7, 0xb, 0xa2, 0x72, 0xe1,
+ 0xfb, 0x8, 0x57, 0x97, 0xf7, 0x13, 0x5, 0x39,
+ 0x6, 0x96, 0xfb, 0x12, 0xfb, 0x1, 0xc2, 0x71,
+ 0x38, 0xf7, 0x9, 0x6d, 0x34, 0x2f, 0x5, 0xe,
+ 0x3c, 0xa0, 0x76, 0xf7, 0x52, 0xf7, 0x15, 0xf7,
+ 0x4f, 0x90, 0xa, 0xf7, 0x52, 0x15, 0xf7, 0x50,
+ 0xfb, 0x52, 0xf7, 0x13, 0xf7, 0x52, 0xf7, 0x51,
+ 0xf7, 0x15, 0xfb, 0x51, 0xf7, 0x4f, 0xfb, 0x13,
+ 0xfb, 0x4f, 0xfb, 0x50, 0x6, 0xe, 0xfc, 0x15,
+ 0xfb, 0x27, 0x76, 0xf7, 0x51, 0x76, 0xf7, 0x26,
+ 0x77, 0x12, 0xd7, 0xf7, 0x1e, 0x44, 0xd2, 0x13,
+ 0xf0, 0xd7, 0x16, 0x13, 0xe8, 0xce, 0x6, 0x89,
+ 0x38, 0x58, 0x7c, 0x71, 0x82, 0xa6, 0x4e, 0x18,
+ 0xf7, 0xf, 0xba, 0x8b, 0xec, 0xcd, 0x1a, 0xf3,
+ 0x7, 0x13, 0xf0, 0x81, 0xa, 0xf7, 0x6b, 0xf7,
+ 0x16, 0x1, 0xa6, 0xf7, 0x6b, 0x15, 0xf7, 0xab,
+ 0xf7, 0x16, 0xfb, 0xab, 0x6, 0xe, 0xfc, 0x15,
+ 0x8b, 0x84, 0xa, 0xcb, 0xf7, 0x2a, 0x3, 0xcb,
+ 0x16, 0xf7, 0x2a, 0xf7, 0x26, 0xfb, 0x2a, 0x6,
+ 0xe, 0xfc, 0x15, 0x86, 0x76, 0xf9, 0x8f, 0x77,
+ 0x1, 0x76, 0xf7, 0x11, 0x3, 0x6a, 0x78, 0x15,
+ 0xf7, 0x11, 0x6, 0xf7, 0x6f, 0x93, 0xa, 0x79,
+ 0xa, 0xf8, 0x89, 0xf7, 0x6, 0x1, 0xab, 0xf7,
+ 0x2c, 0xf7, 0x50, 0xf7, 0x2c, 0x3, 0xab, 0xf7,
+ 0xf5, 0x15, 0xfb, 0x21, 0xa2, 0xfb, 0x7b, 0xf7,
+ 0x74, 0xf7, 0x6d, 0xa7, 0xf7, 0x7d, 0xf7, 0x1d,
+ 0xf7, 0x20, 0x72, 0xf7, 0x6f, 0xfb, 0x72, 0xfb,
+ 0x70, 0x72, 0xfb, 0x6f, 0xfb, 0x1e, 0x1e, 0xf7,
+ 0x2c, 0x89, 0x15, 0xf7, 0x53, 0xa4, 0xc1, 0xcf,
+ 0xd1, 0xa4, 0x54, 0xfb, 0x52, 0xfb, 0x52, 0x72,
+ 0x49, 0x45, 0x47, 0x72, 0xcc, 0xf7, 0x53, 0x1e,
+ 0xe, 0x20, 0xa0, 0x76, 0xf9, 0x5a, 0x77, 0x1,
+ 0xf7, 0x87, 0xf7, 0x1b, 0x3, 0xf7, 0x87, 0x16,
+ 0xf7, 0x1b, 0xf9, 0x5a, 0xfb, 0x2, 0x6, 0x61,
+ 0xfb, 0xc, 0xfb, 0x23, 0x56, 0x7d, 0x86, 0x8,
+ 0xfb, 0xe, 0x7, 0xe1, 0xa7, 0xc5, 0xba, 0xa9,
+ 0xa7, 0x8, 0xe, 0x20, 0x8b, 0xf7, 0x12, 0xf8,
+ 0x6b, 0xf7, 0x5, 0x1, 0xb5, 0xf7, 0x1e, 0xf7,
+ 0x55, 0xf7, 0x1e, 0x3, 0xa5, 0x16, 0xf8, 0x79,
+ 0xf7, 0x12, 0xfb, 0xa7, 0x6, 0x9e, 0xab, 0xa2,
+ 0xa0, 0xd2, 0xcb, 0x8, 0xd1, 0xca, 0xe7, 0xd5,
+ 0xf7, 0x10, 0x1a, 0xe3, 0x4a, 0xf7, 0xa, 0xfb,
+ 0x3b, 0xfb, 0x17, 0x21, 0x2d, 0xfb, 0x7, 0x1e,
+ 0xf7, 0x1e, 0x7d, 0x5, 0xd3, 0x90, 0xa9, 0xb1,
+ 0xcb, 0x1b, 0xc8, 0xac, 0x63, 0x56, 0x43, 0x5b,
+ 0x64, 0x2b, 0x33, 0x1f, 0xfb, 0x1e, 0xfb, 0x12,
+ 0x55, 0x41, 0x80, 0x22, 0x8, 0xe, 0x79, 0xa,
+ 0xf8, 0x83, 0xf7, 0x6, 0x1, 0xf7, 0xe6, 0xf7,
+ 0x25, 0x3, 0xa6, 0xf7, 0x4a, 0x15, 0x25, 0x97,
+ 0xda, 0x28, 0xf7, 0x2a, 0x1b, 0xf7, 0x1d, 0xf7,
+ 0x3, 0xeb, 0xf7, 0x16, 0xe1, 0x56, 0xcd, 0x35,
+ 0x9c, 0x1f, 0x8d, 0x7, 0xa5, 0x97, 0xda, 0xae,
+ 0xe9, 0x1a, 0xdf, 0x3b, 0xf6, 0xfb, 0x22, 0xfb,
+ 0x4f, 0x72, 0xfb, 0x22, 0x5f, 0x80, 0x1e, 0xf7,
+ 0x17, 0x75, 0x5, 0xd4, 0x94, 0xb9, 0xa0, 0xb0,
+ 0x1b, 0xbd, 0xaa, 0x6c, 0x5d, 0x43, 0x4c, 0x75,
+ 0x55, 0x8c, 0x1f, 0x7c, 0xfb, 0x3, 0x5, 0xdd,
+ 0xad, 0xdb, 0x56, 0x32, 0x1a, 0x55, 0x6c, 0x51,
+ 0x43, 0x48, 0x6c, 0xc0, 0xbd, 0x85, 0x1e, 0xe,
+ 0x20, 0xa0, 0x76, 0xf7, 0x23, 0xf7, 0xc, 0xf8,
+ 0x53, 0x77, 0x1, 0xf7, 0xcc, 0xf7, 0x14, 0x3,
+ 0xa6, 0xf7, 0x23, 0x15, 0xf7, 0xb1, 0xfb, 0x23,
+ 0xf7, 0x14, 0xf7, 0x23, 0xe1, 0xf7, 0xc, 0x35,
+ 0xf8, 0x53, 0x7c, 0xa, 0xfb, 0xc1, 0xfc, 0x54,
+ 0x5, 0xf7, 0x11, 0x8c, 0x15, 0xf7, 0x32, 0xf7,
+ 0x86, 0x5, 0x8d, 0xfb, 0x86, 0x6, 0xe, 0x79,
+ 0xa, 0xf8, 0x7f, 0xf7, 0x11, 0x1, 0xf8, 0x3f,
+ 0xf7, 0x23, 0x3, 0xa6, 0xf7, 0x48, 0x15, 0xfb,
+ 0x11, 0x9b, 0xec, 0x41, 0xf7, 0x13, 0x1b, 0xf7,
+ 0x3e, 0xda, 0xf7, 0x1e, 0xf7, 0x7, 0x1f, 0x8a,
+ 0xf7, 0x5e, 0xfb, 0x38, 0xe8, 0xfb, 0x2c, 0x46,
+ 0xa1, 0xf7, 0x19, 0x18, 0xf7, 0x9b, 0xf7, 0x11,
+ 0xfc, 0x5, 0x6, 0x44, 0xfc, 0x11, 0xf7, 0x5,
+ 0x7b, 0xbb, 0xbf, 0xc1, 0x96, 0xb4, 0x7a, 0x19,
+ 0xb6, 0x7a, 0xa9, 0x53, 0x4f, 0x1a, 0x23, 0x54,
+ 0x68, 0x58, 0x5c, 0x60, 0xa6, 0xd3, 0x80, 0x1e,
+ 0xe, 0x79, 0xa, 0xf7, 0x99, 0xef, 0xf7, 0x20,
+ 0xf7, 0x6, 0x1, 0xaa, 0xf7, 0x31, 0x3, 0xf7,
+ 0x44, 0xf8, 0x23, 0x15, 0xd5, 0x90, 0x96, 0xf7,
+ 0xf, 0xee, 0x1b, 0xd2, 0x92, 0x4d, 0x7b, 0x8d,
+ 0x1f, 0xf7, 0x1b, 0x99, 0x5, 0xf6, 0x77, 0x3f,
+ 0xd2, 0xfb, 0xb, 0x1b, 0xfb, 0x8a, 0x7d, 0xfb,
+ 0xc4, 0x4a, 0xfb, 0x4d, 0xe6, 0xfb, 0x43, 0xf7,
+ 0x3d, 0xf7, 0x20, 0xe4, 0xee, 0xf7, 0x22, 0xf7,
+ 0x22, 0xfb, 0x6, 0xe7, 0xfb, 0x7, 0x52, 0x5e,
+ 0x6f, 0x6e, 0x7e, 0x1f, 0x97, 0xfb, 0x45, 0x15,
+ 0xf7, 0x7, 0xdf, 0x9e, 0x9e, 0xec, 0x85, 0xfb,
+ 0x9, 0x7a, 0x77, 0x8a, 0x20, 0x31, 0x48, 0x67,
+ 0xc4, 0xd1, 0x1e, 0xe, 0x20, 0xa0, 0x76, 0xf8,
+ 0xe1, 0xf7, 0x10, 0x12, 0xf7, 0x14, 0xf7, 0x22,
+ 0x17, 0xf7, 0x14, 0x16, 0xf7, 0x22, 0x6, 0x13,
+ 0xe0, 0xf7, 0x6e, 0xf7, 0x12, 0xf7, 0x9c, 0xf7,
+ 0x18, 0xf7, 0xd, 0x1e, 0xea, 0xfc, 0x8b, 0xfb,
+ 0x10, 0xf7, 0xe3, 0x7, 0xfb, 0xb, 0xfb, 0x1d,
+ 0xfb, 0x5, 0xfb, 0x6f, 0xfb, 0x6e, 0x1a, 0xe,
+ 0x20, 0x78, 0xf7, 0x2, 0xf8, 0x8d, 0xf7, 0x2,
+ 0x1, 0xab, 0xf7, 0x23, 0xf7, 0x62, 0xf7, 0x23,
+ 0x3, 0xf7, 0x31, 0xf8, 0xe, 0x15, 0x3b, 0x6a,
+ 0x5e, 0x57, 0x36, 0x1a, 0xfb, 0x21, 0xf7, 0x4,
+ 0x35, 0xf7, 0x18, 0xf7, 0x1e, 0xf7, 0x2, 0xe3,
+ 0xf7, 0x1f, 0xc7, 0x72, 0xd1, 0x25, 0xb3, 0x1e,
+ 0xd1, 0xa9, 0xab, 0xc0, 0xc9, 0x1a, 0xe6, 0x4a,
+ 0xeb, 0xfb, 0x32, 0xfb, 0x34, 0x4c, 0x2b, 0x30,
+ 0x36, 0xc0, 0x64, 0xbe, 0x76, 0x1e, 0xa8, 0xf7,
+ 0x25, 0x15, 0xb3, 0xa4, 0xb0, 0xcc, 0xbc, 0xb4,
+ 0x74, 0x55, 0x3c, 0x47, 0x7c, 0x75, 0x77, 0x45,
+ 0x99, 0xdb, 0x1e, 0x80, 0xfb, 0xcf, 0x15, 0xa9,
+ 0x9a, 0xdc, 0xe1, 0xd4, 0xab, 0x51, 0x56, 0x2c,
+ 0x48, 0x75, 0x65, 0x59, 0x58, 0xac, 0xdf, 0x1e,
+ 0xe, 0x79, 0xa, 0xf7, 0x20, 0xef, 0xf7, 0x99,
+ 0xf7, 0x6, 0x1, 0xa9, 0xf7, 0x1f, 0xf7, 0x41,
+ 0xf7, 0x33, 0x3, 0xb7, 0xf7, 0x33, 0x15, 0x25,
+ 0x8e, 0xdd, 0x3f, 0xf7, 0x10, 0x1b, 0xf7, 0xa1,
+ 0x8b, 0xf7, 0xc4, 0xcc, 0xf7, 0x4e, 0x46, 0xf7,
+ 0x42, 0xfb, 0x55, 0xfb, 0x21, 0x32, 0x28, 0xfb,
+ 0x22, 0xfb, 0x22, 0xf7, 0x2, 0x2f, 0xf7, 0x8,
+ 0xa6, 0xb8, 0x90, 0xc1, 0xb9, 0x1f, 0x8d, 0x89,
+ 0x5, 0x41, 0x86, 0x78, 0xfb, 0xf, 0x28, 0x1b,
+ 0x44, 0x8b, 0xc9, 0x9b, 0x89, 0x1f, 0x80, 0xf7,
+ 0xbc, 0x15, 0x9f, 0x8b, 0xf6, 0xe6, 0xce, 0xaf,
+ 0x47, 0x44, 0xfb, 0x7, 0x33, 0x84, 0x78, 0x2a,
+ 0x95, 0xf7, 0x9, 0x9c, 0x1e, 0xe, 0x8b, 0xf7,
+ 0x19, 0xf7, 0x89, 0xf7, 0x1a, 0x1, 0xe7, 0xf7,
+ 0x2a, 0x3, 0xe7, 0x16, 0xf7, 0x2a, 0xf7, 0x19,
+ 0xfb, 0x2a, 0x6, 0xf7, 0x89, 0x4, 0xf7, 0x2a,
+ 0xf7, 0x1a, 0xfb, 0x2a, 0x6, 0xe, 0xfb, 0x27,
+ 0x76, 0xf7, 0x4a, 0x76, 0xf8, 0x12, 0xf7, 0x1d,
+ 0x12, 0xf3, 0xf7, 0x1e, 0x44, 0xd2, 0x13, 0xf0,
+ 0xf3, 0x84, 0x15, 0x13, 0xe8, 0xce, 0x6, 0x2c,
+ 0x56, 0x8b, 0x71, 0x82, 0x1e, 0xa6, 0x52, 0x5,
+ 0xf7, 0xf, 0xb7, 0x8b, 0xe9, 0xc9, 0x1a, 0xed,
+ 0x7, 0x13, 0xf0, 0xfb, 0x1e, 0x6, 0xf7, 0x89,
+ 0x4, 0xf7, 0x1e, 0xf7, 0x1d, 0x81, 0xa, 0x91,
+ 0xa, 0xf7, 0x58, 0x15, 0xf8, 0x90, 0xfb, 0x60,
+ 0x5, 0xf7, 0x18, 0x7, 0xfb, 0xf6, 0xf7, 0x14,
+ 0xf7, 0xf6, 0xf7, 0x15, 0x5, 0xf7, 0x19, 0x7,
+ 0xfc, 0x90, 0xfb, 0x62, 0x5, 0xe, 0x3c, 0xe2,
+ 0xf7, 0xe, 0xe4, 0x82, 0xa, 0xb3, 0xf8, 0x8c,
+ 0x3, 0xb3, 0xe2, 0x15, 0xf8, 0x8c, 0xf7, 0xe,
+ 0xfc, 0x8c, 0x6, 0xe4, 0x4, 0xf8, 0x8c, 0xf7,
+ 0xd, 0xfc, 0x8c, 0x6, 0xe, 0x91, 0xa, 0x83,
+ 0x15, 0xf8, 0x90, 0xf7, 0x62, 0x5, 0xf7, 0x4,
+ 0x7, 0xfc, 0x90, 0xf7, 0x60, 0x5, 0xfb, 0x18,
+ 0x7, 0xf7, 0xf5, 0xfb, 0x14, 0xfb, 0xf5, 0xfb,
+ 0x15, 0x5, 0xe, 0x57, 0x8b, 0xf7, 0x1e, 0xf8,
+ 0x77, 0xf5, 0x12, 0xf7, 0x87, 0xf7, 0xc, 0xfb,
+ 0xc, 0xf7, 0x19, 0xbe, 0xf7, 0x15, 0x13, 0xe8,
+ 0xf7, 0x87, 0xf7, 0x4e, 0x15, 0xf7, 0xd, 0x6,
+ 0x8a, 0x92, 0x8b, 0x93, 0x8f, 0x1a, 0xbf, 0x91,
+ 0x9e, 0xc3, 0xba, 0x1e, 0xe8, 0xdb, 0xb1, 0xba,
+ 0xd2, 0x1a, 0xf7, 0x5, 0x25, 0xe8, 0xfb, 0x27,
+ 0xfb, 0x37, 0x3d, 0xfb, 0x4, 0x29, 0x85, 0x1e,
+ 0xf7, 0xe, 0x7b, 0x5, 0xd7, 0x9a, 0xb1, 0xb7,
+ 0xd3, 0x1b, 0xc4, 0xca, 0x6b, 0x4a, 0x60, 0x75,
+ 0x79, 0x49, 0x52, 0x1f, 0x2d, 0x3d, 0x87, 0x5e,
+ 0x8d, 0x2a, 0x8, 0xfb, 0x4e, 0x4, 0x13, 0xd8,
+ 0xf7, 0x19, 0xf7, 0x1e, 0xfb, 0x19, 0x6, 0xe,
+ 0xf8, 0x2d, 0x46, 0xda, 0xf7, 0x0, 0xda, 0xf7,
+ 0xca, 0xdb, 0xec, 0xda, 0x1, 0xf7, 0x16, 0xd8,
+ 0xdc, 0xf7, 0x1, 0xf8, 0x53, 0xd7, 0x3, 0xf8,
+ 0xc8, 0xf7, 0x3b, 0x15, 0x79, 0x90, 0x93, 0x6c,
+ 0xcb, 0x1b, 0xf7, 0x40, 0xf6, 0xf7, 0x37, 0xf7,
+ 0x28, 0xf7, 0x4c, 0xfb, 0x17, 0xf7, 0x2a, 0xfb,
+ 0x79, 0xfb, 0xc8, 0xfb, 0xe, 0xfb, 0x89, 0xfb,
+ 0x5b, 0xfb, 0x9e, 0xf7, 0x7d, 0xfb, 0xe, 0xf7,
+ 0x5c, 0xf7, 0x18, 0xf7, 0x41, 0xb4, 0xf7, 0x2e,
+ 0xd5, 0x1f, 0x32, 0x6, 0x66, 0x6f, 0x47, 0x3c,
+ 0xfb, 0x56, 0x1b, 0xfb, 0xa9, 0x3c, 0xf7, 0x41,
+ 0xf7, 0x1c, 0xf7, 0x11, 0xc7, 0xf7, 0x84, 0xf7,
+ 0xb9, 0xf7, 0x72, 0xc9, 0xfb, 0x30, 0x28, 0xfb,
+ 0x1d, 0x20, 0x35, 0x62, 0x75, 0x91, 0xa9, 0xa8,
+ 0x90, 0x1f, 0xca, 0xf7, 0xcb, 0x5, 0xfb, 0x2,
+ 0x6, 0x81, 0x5b, 0x5, 0xc0, 0x6a, 0x56, 0x91,
+ 0x72, 0x1b, 0xfb, 0x2b, 0x3d, 0xfb, 0x3a, 0xfb,
+ 0xd, 0x27, 0xc8, 0x39, 0xf0, 0xcd, 0xb0, 0xb1,
+ 0x96, 0x96, 0x1f, 0xfb, 0x3b, 0xf7, 0x19, 0x15,
+ 0xc8, 0xa0, 0xf7, 0x26, 0xee, 0xd0, 0x9d, 0x43,
+ 0x6f, 0x51, 0x6b, 0xfb, 0x2c, 0x28, 0x50, 0x7a,
+ 0xc0, 0xbd, 0x1e, 0xe, 0x69, 0xa, 0xf7, 0x37,
+ 0xf7, 0xe, 0xf8, 0x45, 0x77, 0x1, 0x9f, 0xf9,
+ 0x3e, 0x3, 0x9f, 0x16, 0xf7, 0x26, 0x6, 0xc3,
+ 0xf7, 0x37, 0x5, 0xf7, 0xa3, 0x6, 0xc6, 0xfb,
+ 0x37, 0x5, 0xf7, 0x2a, 0x6, 0xfb, 0xa4, 0xf9,
+ 0x62, 0x40, 0xa, 0x76, 0xfc, 0x45, 0x15, 0xe7,
+ 0xf7, 0x9e, 0xe9, 0xfb, 0x9e, 0x5, 0xe, 0xc6,
+ 0x8c, 0xf7, 0xd, 0xf7, 0x51, 0xf7, 0xe, 0xf7,
+ 0x38, 0x7b, 0xa, 0xf7, 0x22, 0xf7, 0xa9, 0xf7,
+ 0x1f, 0x3, 0xd7, 0x8d, 0x15, 0xf7, 0xa7, 0x6,
+ 0xf7, 0x30, 0xf7, 0x36, 0x89, 0xf7, 0x5f, 0xb4,
+ 0x7e, 0xf0, 0xfb, 0xd, 0xb1, 0x1f, 0xcd, 0xa8,
+ 0xac, 0xba, 0xca, 0x1a, 0xf7, 0x33, 0xfb, 0x22,
+ 0xb0, 0xfb, 0x21, 0x1e, 0xfb, 0xa7, 0x6, 0xf7,
+ 0x22, 0xfb, 0xb1, 0x15, 0xf7, 0x38, 0xf7, 0x19,
+ 0x7, 0xc8, 0xde, 0x8c, 0x3f, 0x3f, 0x2a, 0x7e,
+ 0x5c, 0x1f, 0xfb, 0x19, 0xfb, 0xcb, 0x15, 0xf7,
+ 0x51, 0xf7, 0x19, 0x7, 0xef, 0xd2, 0x82, 0x28,
+ 0x47, 0x3d, 0x7e, 0x2e, 0x1f, 0xe, 0xc6, 0x78,
+ 0xf7, 0x13, 0xf8, 0x8a, 0xf7, 0x13, 0x1, 0xb7,
+ 0xf7, 0x2d, 0x3, 0xf8, 0xb0, 0xf7, 0x9a, 0x15,
+ 0x3b, 0x79, 0x5d, 0x41, 0x29, 0x1b, 0xfb, 0x2b,
+ 0x6d, 0xf7, 0xc, 0xf7, 0x11, 0xba, 0x89, 0xf7,
+ 0x66, 0xf7, 0x4b, 0xd7, 0xca, 0x60, 0x3c, 0x9d,
+ 0x1f, 0xf7, 0x27, 0xad, 0x5, 0xf7, 0xa, 0x71,
+ 0xfb, 0x17, 0xec, 0xfb, 0x27, 0x1b, 0xfb, 0x83,
+ 0x2c, 0xfb, 0x49, 0xfb, 0x5f, 0xfb, 0x78, 0xf7,
+ 0x1b, 0xfb, 0x24, 0xf7, 0x5b, 0xf7, 0x84, 0xbe,
+ 0xf7, 0x47, 0xc4, 0x9a, 0x1f, 0xe, 0xc6, 0x8b,
+ 0xf7, 0xd, 0xf8, 0x70, 0x7b, 0xa, 0xf7, 0x26,
+ 0xf7, 0xcc, 0xf7, 0x2b, 0x3, 0xd7, 0x16, 0xf7,
+ 0x7c, 0x6, 0xf7, 0x9e, 0xf7, 0x3, 0xf7, 0x23,
+ 0xf7, 0x65, 0xf7, 0xb0, 0xfb, 0x36, 0xdd, 0xfb,
+ 0x6b, 0x1f, 0xfb, 0x7c, 0x6, 0xf7, 0x26, 0xfc,
+ 0xe9, 0x15, 0xf8, 0x70, 0xe1, 0x7, 0xf7, 0xe,
+ 0xf3, 0x85, 0xfb, 0x83, 0xfb, 0x7b, 0xfb, 0x5,
+ 0x8b, 0xfb, 0x5, 0x1f, 0xe, 0x8f, 0x8b, 0xf7,
+ 0xd, 0xf7, 0x57, 0xf7, 0xd, 0xf7, 0x34, 0x7b,
+ 0xa, 0xf7, 0x24, 0x3, 0xd7, 0x16, 0xf8, 0xb5,
+ 0xf7, 0xd, 0xfc, 0x25, 0xf7, 0x57, 0xf7, 0xf3,
+ 0xf7, 0xd, 0xfb, 0xf3, 0xf7, 0x34, 0xf8, 0x18,
+ 0xf7, 0xd, 0xfc, 0xa8, 0x6, 0xe, 0x57, 0xa0,
+ 0x76, 0xf7, 0xc5, 0xf7, 0xd, 0xf7, 0x3f, 0x7b,
+ 0xa, 0xf7, 0x2a, 0x3, 0xd7, 0x16, 0xf7, 0x2a,
+ 0xf7, 0xc5, 0xf7, 0xc2, 0xf7, 0xd, 0xfb, 0xc2,
+ 0xf7, 0x3f, 0xf7, 0xfd, 0xf7, 0xd, 0xfc, 0x93,
+ 0x6, 0xe, 0xf7, 0x7, 0x78, 0xf7, 0x13, 0xf7,
+ 0x2e, 0xf7, 0x10, 0xf7, 0x60, 0xf7, 0x13, 0x1,
+ 0xc5, 0xf7, 0x29, 0xf7, 0xfc, 0xf7, 0x26, 0x3,
+ 0xf8, 0x22, 0xf7, 0x9a, 0x15, 0xf7, 0x3d, 0x2f,
+ 0x6, 0x7d, 0x78, 0x49, 0x5b, 0x37, 0x1b, 0xfb,
+ 0x3c, 0x66, 0xf7, 0x25, 0xf7, 0x0, 0xa0, 0x8f,
+ 0xa4, 0x94, 0xa9, 0x1f, 0x94, 0xaa, 0x97, 0xa5,
+ 0x9c, 0xa1, 0x8, 0xb8, 0xae, 0xbe, 0xa8, 0xcf,
+ 0x1b, 0xb6, 0xe5, 0x7c, 0x27, 0xa8, 0x1f, 0xf7,
+ 0x24, 0xa6, 0x5, 0xf7, 0x48, 0x63, 0xfb, 0x29,
+ 0xae, 0xfb, 0x9, 0x1b, 0xfb, 0x15, 0x32, 0x5a,
+ 0x43, 0x53, 0x1f, 0x6f, 0x67, 0x77, 0x63, 0x7e,
+ 0x5e, 0x8, 0x7e, 0x5e, 0x85, 0x65, 0x6c, 0x1a,
+ 0xfb, 0x54, 0xea, 0xfb, 0x50, 0xf7, 0x97, 0xf7,
+ 0x26, 0xf7, 0x12, 0xd4, 0xb3, 0xb6, 0x1e, 0xf7,
+ 0xb8, 0xfb, 0xcf, 0x7, 0xe, 0x69, 0xa, 0xf7,
+ 0xcf, 0xf7, 0xe, 0xf7, 0xad, 0x77, 0x1, 0xd2,
+ 0xf7, 0x26, 0xf7, 0xb4, 0xf7, 0x26, 0x3, 0xd2,
+ 0x16, 0xf7, 0x26, 0xf7, 0xcf, 0xf7, 0xb4, 0xfb,
+ 0xcf, 0xf7, 0x26, 0xf9, 0x62, 0xfb, 0x26, 0xfb,
+ 0xad, 0xfb, 0xb4, 0xf7, 0xad, 0xfb, 0x26, 0x6,
+ 0xe, 0xfc, 0x15, 0x3f, 0xa, 0xf7, 0x10, 0xf7,
+ 0x2a, 0x3, 0xcb, 0x16, 0xf7, 0x2a, 0xf9, 0x62,
+ 0xfb, 0x2a, 0x6, 0xe, 0x20, 0x79, 0xf7, 0x12,
+ 0xf8, 0xf6, 0x77, 0x1, 0xf7, 0xe7, 0xf7, 0x25,
+ 0x3, 0xa1, 0xf7, 0x70, 0x15, 0xfb, 0x38, 0xdb,
+ 0x41, 0xf7, 0x23, 0xf7, 0x41, 0xcd, 0xf7, 0xb,
+ 0xf7, 0x2b, 0x1e, 0xf8, 0x66, 0xfb, 0x25, 0xfc,
+ 0x66, 0x7, 0x44, 0x86, 0x42, 0x32, 0x36, 0x8f,
+ 0xdf, 0xb9, 0x87, 0x1e, 0xe, 0xc6, 0x3f, 0xa,
+ 0xe2, 0xf7, 0x22, 0x3, 0xe2, 0x16, 0xf7, 0x22,
+ 0xf7, 0x6e, 0x6, 0xf7, 0x8, 0xf7, 0xc, 0xf7,
+ 0x55, 0xfb, 0xe6, 0x5, 0xf7, 0x4c, 0x6, 0xfb,
+ 0xab, 0xf8, 0x4c, 0xf7, 0x9c, 0xf7, 0xaa, 0x5,
+ 0xfb, 0x52, 0x6, 0xfb, 0xb4, 0xfb, 0xd1, 0x5,
+ 0xf7, 0xd1, 0xfb, 0x22, 0x7, 0xe, 0x86, 0xa,
+ 0xd7, 0xf7, 0x25, 0x3, 0xd7, 0x16, 0xf8, 0x8f,
+ 0xf7, 0xe, 0xfb, 0xfe, 0xf8, 0xe8, 0xfb, 0x25,
+ 0x6, 0xe, 0xf7, 0x3e, 0xa0, 0x76, 0xf8, 0xc9,
+ 0xf7, 0x2d, 0x1, 0xd0, 0xf7, 0x1b, 0xf8, 0x3e,
+ 0xf7, 0x1b, 0x3, 0xd0, 0x16, 0xf7, 0x1b, 0xf8,
+ 0xc9, 0x8d, 0x6, 0xf7, 0x22, 0xfc, 0xc9, 0x5,
+ 0xf7, 0x20, 0x6, 0xf7, 0x20, 0xf8, 0xc9, 0x5,
+ 0x8d, 0xfc, 0xc9, 0xf7, 0x1b, 0xf9, 0x62, 0xfb,
+ 0x6f, 0x6, 0xfb, 0x13, 0xfc, 0x7c, 0x5, 0x88,
+ 0x6, 0xfb, 0x15, 0xf8, 0x7c, 0x5, 0xfb, 0x6e,
+ 0x6, 0xe, 0xc6, 0xa0, 0x76, 0xf9, 0x62, 0x5c,
+ 0xa, 0xf8, 0x67, 0x8d, 0x6, 0xf7, 0xbb, 0xfc,
+ 0x67, 0x5, 0xf7, 0x2a, 0xf9, 0x62, 0xfb, 0x1e,
+ 0xfc, 0x72, 0x89, 0x6, 0xfb, 0xc1, 0xf8, 0x72,
+ 0x5, 0xfb, 0x24, 0x6, 0xe, 0xf7, 0x7, 0x78,
+ 0xf7, 0x13, 0xf8, 0x76, 0xf7, 0x13, 0x1, 0xd0,
+ 0xf7, 0x28, 0xf7, 0xf8, 0x85, 0xa, 0xb7, 0xf7,
+ 0xea, 0x15, 0x7c, 0x8d, 0x75, 0x90, 0x6d, 0x1e,
+ 0x94, 0x4f, 0xa0, 0x53, 0xae, 0x58, 0x8, 0x40,
+ 0xbe, 0xe5, 0x57, 0xf7, 0x18, 0x1b, 0xf7, 0x10,
+ 0xe2, 0xba, 0xd2, 0xc2, 0x1f, 0xa6, 0xaf, 0x9f,
+ 0xb4, 0x98, 0xb8, 0x8, 0x98, 0xb9, 0x91, 0xb3,
+ 0xae, 0x1a, 0xf7, 0x69, 0x3d, 0xa, 0xfb, 0x20,
+ 0xfb, 0x7f, 0x1e, 0xf7, 0x28, 0x16, 0xf7, 0x0,
+ 0xac, 0xf7, 0x20, 0xf7, 0x38, 0xf7, 0x44, 0xa0,
+ 0xfb, 0x39, 0x38, 0x76, 0x87, 0x72, 0x84, 0x6c,
+ 0x1e, 0x84, 0x6c, 0x80, 0x70, 0x7c, 0x74, 0x8,
+ 0x5c, 0x6c, 0x59, 0x6e, 0x43, 0x1b, 0x3f, 0x5a,
+ 0xa9, 0x89, 0xa, 0xaa, 0x8, 0x85, 0xaa, 0x88,
+ 0xa5, 0xa0, 0x1a, 0xe, 0x8f, 0xa0, 0x76, 0xf7,
+ 0xac, 0xf7, 0xd, 0xf7, 0x58, 0xf7, 0xd, 0x60,
+ 0xa, 0xf7, 0xac, 0xdb, 0x6, 0xf7, 0x31, 0xf7,
+ 0x3d, 0x7e, 0xf7, 0x7a, 0xf7, 0x6c, 0xfb, 0x26,
+ 0x90, 0xfb, 0x48, 0x1f, 0xfb, 0x75, 0x6, 0xf7,
+ 0x25, 0xfb, 0xd1, 0x15, 0xf7, 0x58, 0xdb, 0x7,
+ 0xf4, 0xd2, 0x89, 0x27, 0x24, 0x26, 0x94, 0x40,
+ 0x1f, 0xe, 0xf7, 0x7, 0x6c, 0x76, 0xc6, 0xf7,
+ 0xf, 0xf8, 0x6f, 0xf7, 0xe, 0x1, 0xd1, 0xf7,
+ 0x23, 0xf7, 0xe7, 0xf7, 0x23, 0x3, 0xf8, 0xa8,
+ 0xb0, 0x15, 0xc4, 0x64, 0xb5, 0x68, 0xc2, 0x7c,
+ 0xbe, 0xf0, 0x18, 0x4f, 0xa2, 0x68, 0xa5, 0x7b,
+ 0x96, 0x8, 0xa6, 0xa7, 0xc5, 0xe2, 0xf7, 0x20,
+ 0x1a, 0xf7, 0x67, 0xfb, 0x3, 0xf7, 0x2c, 0xfb,
+ 0x73, 0xfb, 0x6b, 0xfb, 0xa, 0xfb, 0x20, 0xfb,
+ 0x73, 0x38, 0xa0, 0x2c, 0xbf, 0x47, 0x1e, 0x48,
+ 0xc0, 0xde, 0x5f, 0xf7, 0x10, 0x1b, 0xd3, 0xc7,
+ 0x9e, 0x96, 0xa2, 0x1f, 0xfb, 0x50, 0xf7, 0x23,
+ 0x15, 0xab, 0x7f, 0xb2, 0x76, 0x9a, 0x80, 0x8,
+ 0x88, 0x80, 0x80, 0x88, 0x6c, 0x1b, 0x44, 0x5c,
+ 0xa8, 0x89, 0xa, 0xac, 0x8, 0x85, 0xac, 0x88,
+ 0xa4, 0x9e, 0x1a, 0xf7, 0x7, 0xac, 0xf7, 0x12,
+ 0xf7, 0x31, 0xf7, 0x32, 0xac, 0xfb, 0x21, 0x27,
+ 0x6a, 0x81, 0x50, 0x7f, 0x6e, 0x1e, 0x80, 0x6f,
+ 0x7e, 0x7a, 0x84, 0x82, 0x6a, 0xa4, 0x5d, 0xa8,
+ 0x56, 0x9e, 0x8, 0xe, 0x69, 0xa, 0xf7, 0xc0,
+ 0xf7, 0x6, 0xf7, 0x4b, 0x7b, 0xa, 0xf7, 0x1b,
+ 0xf7, 0xa5, 0xf7, 0x1f, 0x3, 0xd7, 0x16, 0xf7,
+ 0x1b, 0xf7, 0xc0, 0xa6, 0x6, 0xe5, 0xa1, 0x81,
+ 0xfb, 0x16, 0xdc, 0x1f, 0xdf, 0xfb, 0x34, 0x5,
+ 0xf7, 0x36, 0x6, 0x3a, 0xf7, 0x20, 0x47, 0xf7,
+ 0x8, 0x71, 0xa5, 0x53, 0xad, 0x19, 0x8d, 0x7,
+ 0xf0, 0x92, 0xd7, 0xdb, 0xf7, 0x3, 0x1a, 0xf7,
+ 0x52, 0xfb, 0x1b, 0x97, 0xfb, 0x45, 0x1e, 0xfb,
+ 0x7f, 0x6, 0xf7, 0x1b, 0xfb, 0xc4, 0x15, 0xf7,
+ 0x4b, 0xef, 0x7, 0xf5, 0xce, 0x94, 0x28, 0x2c,
+ 0x30, 0x8d, 0x39, 0x1f, 0xe, 0x8f, 0x78, 0xf7,
+ 0x10, 0xf7, 0x64, 0xf7, 0x1b, 0xf7, 0x3b, 0xf7,
+ 0xe, 0x1, 0xcc, 0xf7, 0x21, 0xf7, 0x96, 0xf7,
+ 0x26, 0x3, 0xb2, 0xf7, 0x7b, 0x15, 0xfb, 0x87,
+ 0x72, 0xa, 0xbe, 0xf7, 0x42, 0xf7, 0x48, 0xfb,
+ 0x2a, 0xae, 0xfb, 0x3, 0xa6, 0x1f, 0xfb, 0x9,
+ 0xa6, 0x5e, 0x96, 0xba, 0x1a, 0xc6, 0xda, 0xa2,
+ 0xb6, 0xf7, 0x8, 0x96, 0x47, 0x65, 0x91, 0x1e,
+ 0xf7, 0x28, 0x91, 0x5, 0xf7, 0x3a, 0x85, 0xfb,
+ 0x18, 0xc3, 0xfb, 0x23, 0x1b, 0xfb, 0x69, 0x59,
+ 0xfb, 0x11, 0x3c, 0xfb, 0x36, 0xf7, 0x35, 0x63,
+ 0xd3, 0x79, 0x1f, 0xf7, 0x1a, 0x6a, 0xbe, 0x7e,
+ 0x4e, 0x1a, 0x5c, 0x61, 0x55, 0x25, 0xfb, 0x18,
+ 0x78, 0xf1, 0xb1, 0x84, 0x1e, 0xe, 0x57, 0xa0,
+ 0x76, 0xf8, 0xe8, 0xf7, 0xe, 0x1, 0xf7, 0x7c,
+ 0x85, 0xa, 0xf7, 0x7c, 0x16, 0xf7, 0x28, 0xf8,
+ 0xe8, 0xf7, 0x6e, 0xf7, 0xe, 0xfc, 0xdc, 0xfb,
+ 0xe, 0xf7, 0x6e, 0x6, 0xe, 0xc6, 0x78, 0xf7,
+ 0x12, 0xf8, 0xf7, 0x77, 0x42, 0xa, 0xd3, 0xf9,
+ 0x62, 0x15, 0xfc, 0x22, 0x7, 0xfb, 0x3c, 0xb7,
+ 0xfb, 0x3f, 0xf7, 0x8d, 0xf7, 0x6d, 0xd0, 0xf7,
+ 0x1, 0xf7, 0x7a, 0x1e, 0xf8, 0x22, 0xfb, 0x26,
+ 0xfc, 0x22, 0x7, 0xfb, 0x11, 0x8b, 0x33, 0xfb,
+ 0x20, 0xfb, 0x16, 0x7a, 0xdc, 0xf7, 0x18, 0x1e,
+ 0xf8, 0x22, 0x7, 0xe, 0x8f, 0x3f, 0xa, 0xf7,
+ 0x98, 0x16, 0xf7, 0x26, 0x6, 0xf7, 0x86, 0xf9,
+ 0x62, 0x40, 0xa, 0xfb, 0x39, 0xfc, 0xa7, 0x6e,
+ 0xa, 0xfb, 0x3d, 0xf8, 0xa7, 0x5, 0xfb, 0x28,
+ 0x6, 0xe, 0xf7, 0xad, 0xa0, 0x76, 0xf8, 0xaf,
+ 0x77, 0xf7, 0x5b, 0x77, 0x1, 0xf7, 0x4a, 0x16,
+ 0xf7, 0x2d, 0x6, 0xf7, 0x1d, 0xf8, 0xaf, 0x5,
+ 0x8c, 0x6, 0xf7, 0x1d, 0xfc, 0xaf, 0x5, 0xf7,
+ 0x2a, 0x6, 0xf7, 0x3d, 0xf9, 0x62, 0x5, 0xfb,
+ 0x22, 0x6, 0x22, 0xfc, 0x88, 0x6e, 0xa, 0xfb,
+ 0xd, 0xf8, 0x88, 0x5, 0xfb, 0x3b, 0x6, 0xfb,
+ 0x12, 0xfc, 0x80, 0x6e, 0xa, 0x23, 0xf8, 0x80,
+ 0x5, 0xfb, 0x24, 0x6, 0xe, 0x8f, 0x3f, 0xa,
+ 0x99, 0x16, 0xf7, 0x3b, 0x6, 0xf7, 0x2c, 0xf7,
+ 0x8d, 0xf7, 0x2d, 0xfb, 0x8d, 0x5, 0xf7, 0x3b,
+ 0x6, 0xfb, 0x7f, 0xf8, 0x7, 0xf7, 0x6a, 0xf7,
+ 0xef, 0x5, 0xfb, 0x35, 0x6, 0xfb, 0x1b, 0xfb,
+ 0x7c, 0xfb, 0x1e, 0xf7, 0x7c, 0x5, 0xfb, 0x36,
+ 0x6, 0xf7, 0x69, 0xfb, 0xe9, 0x5, 0xe, 0x8f,
+ 0x3f, 0xa, 0xf7, 0x9d, 0xf7, 0x1d, 0x3, 0xf7,
+ 0x9d, 0x16, 0xf7, 0x1d, 0xf7, 0xc2, 0x6, 0xf7,
+ 0x8f, 0xf8, 0x34, 0x4f, 0xa, 0xfc, 0x33, 0x5,
+ 0xe, 0x57, 0x8b, 0xf7, 0xe, 0xf8, 0x6e, 0xf7,
+ 0xe, 0x1, 0xa4, 0x16, 0xf8, 0xc5, 0xf7, 0xe,
+ 0x87, 0xa, 0xf7, 0x6, 0xfc, 0x8e, 0xfb, 0xe,
+ 0x8c, 0xa, 0xe, 0x7f, 0xa, 0xca, 0xf7, 0x19,
+ 0x3, 0xf7, 0x58, 0x33, 0x15, 0xf9, 0x52, 0xf7,
+ 0x5, 0xf7, 0x0, 0xfb, 0x8a, 0xfe, 0x2a, 0xf7,
+ 0x8a, 0xf7, 0x0, 0x7, 0xe, 0xfc, 0x15, 0x8d,
+ 0x76, 0xf9, 0x88, 0x77, 0x1, 0x4e, 0xf7, 0xec,
+ 0x3, 0xf7, 0x4e, 0x78, 0x15, 0xf7, 0x11, 0x6,
+ 0xfb, 0x6d, 0x93, 0xa, 0x7f, 0xa, 0xf7, 0x1d,
+ 0xf7, 0x19, 0x3, 0xa3, 0x33, 0x15, 0xfb, 0x0,
+ 0xf7, 0x8a, 0xfa, 0x2a, 0xfb, 0x8a, 0xfb, 0x0,
+ 0xf7, 0x5, 0xfd, 0x52, 0x7, 0xe, 0x3c, 0xf7,
+ 0xec, 0x76, 0xf7, 0x79, 0x84, 0xa, 0xc9, 0xf7,
+ 0xd7, 0x15, 0xf7, 0x1c, 0x6, 0xe9, 0xf7, 0x79,
+ 0xea, 0xfb, 0x79, 0x5, 0xf7, 0x1b, 0x6, 0xfb,
+ 0x42, 0xf8, 0xb, 0x5, 0x20, 0x6, 0xe, 0x20,
+ 0xfb, 0x11, 0xbd, 0x1, 0x40, 0x4, 0x59, 0xf8,
+ 0xc0, 0xbd, 0x7, 0xe, 0xf8, 0xf0, 0x84, 0xa,
+ 0x74, 0xf7, 0x8c, 0x3, 0xf7, 0x13, 0xf8, 0xf0,
+ 0x15, 0xed, 0x6, 0x3f, 0x83, 0xa, 0xfb, 0x40,
+ 0x6, 0xe, 0x20, 0x7d, 0xef, 0x48, 0x76, 0xf8,
+ 0x4c, 0xf7, 0x0, 0x12, 0xa8, 0xf7, 0x1a, 0xf7,
+ 0x58, 0xf7, 0x1d, 0x13, 0x78, 0xf8, 0x6, 0xc4,
+ 0x30, 0xa, 0x77, 0xb8, 0x83, 0xa3, 0x38, 0xa,
+ 0xad, 0x1a, 0xeb, 0x8a, 0xf4, 0xfb, 0x73, 0xfb,
+ 0x32, 0x5b, 0x49, 0x35, 0x73, 0x1e, 0xf7, 0x13,
+ 0x73, 0x5, 0xa6, 0x2d, 0xa, 0x7f, 0x6e, 0x83,
+ 0x3c, 0x7d, 0x8, 0x41, 0x7c, 0xfb, 0xc, 0x73,
+ 0xfb, 0x17, 0x1a, 0x13, 0xb8, 0x2e, 0xd1, 0x4a,
+ 0x37, 0xa, 0xf7, 0x5b, 0x15, 0x6f, 0x7, 0x3c,
+ 0x97, 0x5d, 0x4c, 0x3d, 0x1b, 0x55, 0x6d, 0xa7,
+ 0xa9, 0xbd, 0xca, 0xa9, 0xa4, 0x90, 0x1f, 0xa9,
+ 0x92, 0xc8, 0x95, 0x9c, 0x95, 0x8, 0xe, 0x57,
+ 0x7d, 0xf7, 0x2, 0x3e, 0x76, 0xf8, 0x41, 0xf5,
+ 0xf7, 0x4d, 0x77, 0x12, 0xde, 0xf7, 0x20, 0xf7,
+ 0x5a, 0xf7, 0x24, 0x13, 0x7c, 0xc8, 0x89, 0x15,
+ 0xf7, 0x17, 0xd8, 0x8d, 0x6, 0x13, 0xbc, 0x3d,
+ 0xc1, 0xd8, 0x80, 0xaa, 0x1b, 0xf7, 0x7, 0xf6,
+ 0xe0, 0xf7, 0x50, 0xf7, 0x4c, 0x22, 0xe5, 0xfb,
+ 0xa, 0x35, 0x5b, 0x5a, 0x74, 0x77, 0x1f, 0xf7,
+ 0x95, 0xfb, 0x20, 0x7, 0x13, 0x7c, 0xf7, 0x1f,
+ 0xfc, 0x52, 0x15, 0xf5, 0xbf, 0xbc, 0xcc, 0xf3,
+ 0x98, 0xfb, 0x2, 0x51, 0x1e, 0x13, 0xbc, 0xfb,
+ 0x16, 0x4c, 0x6a, 0x5b, 0x31, 0x6a, 0xda, 0xec,
+ 0x1e, 0xe, 0x20, 0x7d, 0xf7, 0x8, 0xf7, 0xe1,
+ 0xf7, 0x3, 0x1, 0xb9, 0xf7, 0x21, 0x3, 0xf8,
+ 0x1a, 0xf7, 0x5e, 0x15, 0x6c, 0x85, 0x76, 0x46,
+ 0x3b, 0x1b, 0x3c, 0x6e, 0xc6, 0xf7, 0x5, 0xac,
+ 0x86, 0xf7, 0x14, 0xf7, 0x5, 0xce, 0xa4, 0x5c,
+ 0x66, 0x92, 0x1f, 0xf7, 0x1b, 0xa4, 0x5, 0xd2,
+ 0x77, 0x5a, 0xee, 0xfb, 0x39, 0x1b, 0xfb, 0x59,
+ 0x57, 0xfb, 0x28, 0xfb, 0x10, 0x31, 0xae, 0xfb,
+ 0x5a, 0xf7, 0x6a, 0xf7, 0x17, 0xdc, 0xc9, 0xf7,
+ 0x18, 0xa8, 0x1f, 0xe, 0x57, 0x7d, 0xf7, 0x2,
+ 0x3e, 0x76, 0xf8, 0x3f, 0xf5, 0xf7, 0x4f, 0x77,
+ 0x12, 0xad, 0xf7, 0x24, 0xf7, 0x6d, 0xf7, 0x20,
+ 0x13, 0x7c, 0xf8, 0x38, 0x89, 0x15, 0xf7, 0x17,
+ 0xf9, 0x64, 0xfb, 0x20, 0xfb, 0x97, 0x6, 0xa2,
+ 0x77, 0x5b, 0xbc, 0x35, 0x1b, 0xfb, 0xa, 0x22,
+ 0x36, 0xfb, 0x4c, 0x1f, 0x13, 0xbc, 0xfb, 0x50,
+ 0xf6, 0x33, 0xf7, 0x7, 0xe9, 0xae, 0xb7, 0xb7,
+ 0xae, 0x1e, 0x13, 0x7c, 0xfb, 0x86, 0xf7, 0x50,
+ 0x15, 0xc5, 0x98, 0xf4, 0xf3, 0xcc, 0xbf, 0x51,
+ 0x22, 0x1e, 0x13, 0xbc, 0x2a, 0x6a, 0x46, 0x31,
+ 0x5b, 0x4c, 0xb0, 0xf7, 0x15, 0x1e, 0xe, 0x20,
+ 0x7d, 0xf7, 0x0, 0xf7, 0x17, 0xe1, 0xf7, 0x2b,
+ 0xf7, 0x0, 0x1, 0xa9, 0xf7, 0x28, 0xf7, 0x64,
+ 0xf7, 0x22, 0x3, 0xf7, 0x3c, 0xf7, 0x76, 0x15,
+ 0xf7, 0xfc, 0x6, 0xf7, 0x33, 0x57, 0xf7, 0x35,
+ 0xfb, 0x5e, 0xfb, 0x3e, 0x3a, 0xfb, 0x1e, 0xfb,
+ 0x25, 0xfb, 0x3b, 0xf1, 0xfb, 0x2, 0xf7, 0x29,
+ 0xf7, 0x46, 0xc3, 0xf7, 0x12, 0xac, 0x97, 0x1e,
+ 0xfb, 0x22, 0xa3, 0x5, 0x72, 0x83, 0x6d, 0x59,
+ 0x49, 0x1b, 0x3a, 0x74, 0xcf, 0xcb, 0x89, 0x1f,
+ 0x8e, 0xe1, 0x15, 0xce, 0xaf, 0xc6, 0xce, 0xd3,
+ 0xb3, 0x4d, 0x4b, 0x1e, 0xe, 0x76, 0xa, 0xf4,
+ 0xf4, 0x1, 0xd8, 0xf7, 0x14, 0x3, 0xd8, 0x16,
+ 0xf7, 0x14, 0xf8, 0x2c, 0xde, 0xf7, 0x1, 0x38,
+ 0xb0, 0x6, 0xa9, 0x8b, 0xb1, 0xbd, 0x93, 0x9c,
+ 0x89, 0x85, 0xa1, 0x1e, 0x9b, 0xeb, 0x5, 0x98,
+ 0x65, 0x76, 0x8f, 0x73, 0x1b, 0xfb, 0x21, 0x7a,
+ 0xfb, 0x1, 0x4e, 0x1f, 0x63, 0x48, 0xfb, 0x1,
+ 0xce, 0x7, 0xe, 0x57, 0xfb, 0x6d, 0xf7, 0x0,
+ 0xf7, 0x1, 0xf7, 0x7, 0xf7, 0xd7, 0xf7, 0x0,
+ 0x1, 0xb3, 0xf7, 0x23, 0xf7, 0x7b, 0xf7, 0x1f,
+ 0x3, 0xc5, 0x67, 0x15, 0xfb, 0x40, 0xf7, 0x10,
+ 0x82, 0xf7, 0xe, 0xf7, 0x79, 0x9f, 0xf7, 0xf,
+ 0xf7, 0x28, 0x1e, 0xf8, 0x74, 0xfb, 0x16, 0x40,
+ 0x89, 0x7, 0xa3, 0x7c, 0x5c, 0xca, 0x2a, 0x1b,
+ 0x35, 0xfb, 0x1c, 0x55, 0xfb, 0x70, 0xfb, 0x2c,
+ 0xde, 0xfb, 0xc, 0xf7, 0x1a, 0xca, 0xc4, 0xae,
+ 0xbe, 0xae, 0x1f, 0x8d, 0x3d, 0x6, 0x4d, 0x8b,
+ 0x54, 0xfb, 0x7, 0x50, 0x7d, 0x9c, 0xb0, 0x82,
+ 0x1e, 0x69, 0xf7, 0xdb, 0x15, 0xb3, 0x94, 0xf7,
+ 0x12, 0xf5, 0xea, 0xa1, 0x29, 0x47, 0xfb, 0x1f,
+ 0x38, 0x79, 0x66, 0x32, 0x74, 0xdf, 0xd4, 0x1e,
+ 0xe, 0x57, 0xa0, 0x76, 0xf8, 0x3e, 0xf4, 0xf7,
+ 0x4f, 0x77, 0x1, 0xcc, 0xf7, 0x20, 0xf7, 0x5d,
+ 0x7d, 0xa, 0xcc, 0x16, 0xf7, 0x20, 0xf7, 0x99,
+ 0x6, 0xc4, 0x8b, 0xf7, 0x0, 0xf7, 0x6, 0xe2,
+ 0x8b, 0x3e, 0x33, 0x1e, 0xfb, 0x99, 0xf7, 0x20,
+ 0xf7, 0x99, 0x7, 0xf7, 0x44, 0x4f, 0xe9, 0xfb,
+ 0xc, 0x6e, 0x47, 0x88, 0x40, 0x4b, 0x1e, 0xf7,
+ 0x9d, 0xfb, 0x20, 0x7, 0xe, 0x4c, 0xa, 0xf8,
+ 0xa1, 0x77, 0xe9, 0xf7, 0x12, 0x1, 0xf7, 0x22,
+ 0x63, 0xa, 0xf8, 0xa1, 0x68, 0xa, 0xd5, 0x4,
+ 0xf7, 0x20, 0xf7, 0x12, 0x6d, 0xa, 0xfc, 0x15,
+ 0xfb, 0x6a, 0xf7, 0x16, 0xf8, 0xf5, 0x77, 0xe9,
+ 0xf7, 0x12, 0x1, 0xf7, 0x8, 0xf7, 0x1b, 0x3,
+ 0xa7, 0x3b, 0x15, 0x73, 0xfb, 0xb, 0x5, 0x88,
+ 0x97, 0xb4, 0x7f, 0xb3, 0x1b, 0xf7, 0x22, 0x97,
+ 0xf7, 0x9, 0xf7, 0x5, 0x1f, 0xf8, 0x91, 0xfb,
+ 0x1b, 0xfc, 0x89, 0x7, 0x42, 0x8c, 0x68, 0x52,
+ 0x7c, 0x7f, 0x8e, 0x8c, 0x86, 0x1e, 0xe3, 0xf9,
+ 0x3b, 0x15, 0xf7, 0x1b, 0xf7, 0x12, 0xfb, 0x1b,
+ 0x6, 0xe, 0x20, 0x3f, 0xa, 0xd0, 0xf7, 0x21,
+ 0x3, 0xd0, 0x16, 0xf7, 0x21, 0xf7, 0x3b, 0x6,
+ 0xcd, 0xcf, 0xf7, 0x1a, 0xfb, 0x7f, 0x5, 0xf7,
+ 0x2c, 0x6, 0xfb, 0x57, 0xf7, 0xdf, 0xf7, 0x4b,
+ 0xf7, 0x53, 0x5, 0xfb, 0x42, 0x6, 0xfb, 0x3a,
+ 0xfb, 0x4c, 0x5, 0xf8, 0x10, 0xfb, 0x21, 0x7,
+ 0xe, 0xfc, 0x15, 0x3f, 0xa, 0xd0, 0x63, 0xa,
+ 0xf9, 0x62, 0x6d, 0xa, 0xf7, 0x76, 0xa0, 0x76,
+ 0xf8, 0x4a, 0xf7, 0x0, 0x7f, 0x77, 0x12, 0xdc,
+ 0xf7, 0x1d, 0xf7, 0x33, 0xf7, 0x1c, 0xf7, 0x44,
+ 0xf7, 0x1d, 0x13, 0xdc, 0xcb, 0x16, 0xf7, 0x1d,
+ 0xf7, 0xb1, 0x6, 0xe6, 0x9f, 0xc9, 0xe0, 0xd3,
+ 0x8a, 0x4f, 0x30, 0x1e, 0xfb, 0xb3, 0xf7, 0x1c,
+ 0xf7, 0xb3, 0x7, 0xd8, 0xa3, 0xd5, 0xda, 0xd4,
+ 0x8b, 0x33, 0x4c, 0x1e, 0xfb, 0xb3, 0xf7, 0x1d,
+ 0xf7, 0xb7, 0x7, 0xc5, 0x8b, 0xf7, 0x59, 0xfb,
+ 0x3e, 0x36, 0x59, 0x53, 0x6f, 0x74, 0x1e, 0xa1,
+ 0x7e, 0x69, 0xc9, 0x28, 0x1b, 0x66, 0x4d, 0x85,
+ 0x3d, 0x4f, 0x1f, 0x13, 0xbc, 0x89, 0xd3, 0xfb,
+ 0x13, 0x6, 0xe, 0x57, 0xa0, 0x76, 0xf8, 0x4a,
+ 0xeb, 0x2b, 0xf7, 0x0, 0x12, 0x7a, 0xf7, 0x20,
+ 0xf7, 0xaf, 0xf7, 0x20, 0x13, 0xb8, 0xcc, 0x16,
+ 0xf7, 0x20, 0xf7, 0x8f, 0x6, 0xe3, 0x94, 0xee,
+ 0xf6, 0xe0, 0x8b, 0x28, 0x33, 0x1e, 0xfb, 0x8f,
+ 0xf7, 0x20, 0xf7, 0x8f, 0x7, 0xf7, 0x18, 0x72,
+ 0xf7, 0x37, 0xfb, 0x2b, 0x55, 0x48, 0x78, 0x43,
+ 0x57, 0x1e, 0x13, 0xd8, 0x89, 0xda, 0xfb, 0x16,
+ 0x6, 0xe, 0x57, 0x7d, 0xf7, 0x8, 0xf7, 0xdc,
+ 0xf7, 0x8, 0x1, 0xac, 0xf7, 0x23, 0xf7, 0x95,
+ 0xf7, 0x23, 0x3, 0xad, 0xf7, 0xa1, 0x15, 0xfb,
+ 0x8e, 0xf7, 0x50, 0x6a, 0xde, 0xf7, 0x3e, 0xf2,
+ 0xf7, 0x1a, 0xf7, 0x29, 0xf7, 0x1c, 0x32, 0xf7,
+ 0x21, 0xfb, 0x4c, 0xfb, 0x4f, 0x37, 0xfb, 0x2a,
+ 0xfb, 0x13, 0x1e, 0xf7, 0x23, 0x16, 0xf7, 0x5,
+ 0xc8, 0xbb, 0xce, 0xd3, 0xc5, 0x56, 0xfb, 0x0,
+ 0xfb, 0xc, 0x49, 0x5c, 0x4b, 0x49, 0x4d, 0xbf,
+ 0xf7, 0x7, 0x1e, 0xe, 0x5a, 0xa, 0xe5, 0xf7,
+ 0x17, 0xf7, 0x60, 0xf7, 0x24, 0x13, 0xec, 0xf7,
+ 0x5e, 0xc6, 0x15, 0x73, 0x9f, 0xbb, 0x59, 0xe1,
+ 0x1b, 0xf7, 0x9, 0xf4, 0xdf, 0xf7, 0x51, 0xf7,
+ 0x55, 0x20, 0xea, 0xfb, 0x6, 0x6b, 0x3f, 0x80,
+ 0x3b, 0x55, 0x1f, 0x89, 0x6, 0x13, 0xdc, 0xda,
+ 0xfb, 0x17, 0xfd, 0x79, 0xf7, 0x20, 0x7, 0x8a,
+ 0xf8, 0x65, 0x15, 0x13, 0xec, 0xee, 0xab, 0xd7,
+ 0xe5, 0xbb, 0xca, 0x61, 0xfb, 0x19, 0x4f, 0x7e,
+ 0x22, 0x24, 0x4a, 0x57, 0xc3, 0xf7, 0x1, 0x1e,
+ 0xe, 0x5a, 0xa, 0xad, 0xf7, 0x24, 0xf7, 0x7e,
+ 0xf7, 0x20, 0xfb, 0x17, 0xf7, 0x17, 0x13, 0xdc,
+ 0xf8, 0x30, 0xc6, 0x15, 0xfb, 0x9e, 0xf7, 0x20,
+ 0xf9, 0x79, 0x7, 0x13, 0xda, 0xfb, 0x17, 0x3c,
+ 0x89, 0x6, 0x13, 0xec, 0xdb, 0x55, 0x3e, 0x96,
+ 0x6b, 0x1b, 0xfb, 0x7, 0x20, 0x2c, 0xfb, 0x55,
+ 0xfb, 0x51, 0xf4, 0x37, 0xf7, 0xa, 0xe1, 0xbb,
+ 0xbd, 0xa3, 0xa0, 0x1f, 0xfb, 0x7e, 0xf7, 0x5b,
+ 0x15, 0xf7, 0x19, 0xcb, 0xb5, 0xbb, 0xe5, 0xac,
+ 0x3f, 0x28, 0xfb, 0x1, 0x57, 0x53, 0x49, 0x24,
+ 0x7d, 0xf4, 0xc7, 0x1e, 0xe, 0xfb, 0xa6, 0xa0,
+ 0x76, 0xf8, 0x37, 0xf7, 0x7, 0xfb, 0x7, 0xf7,
+ 0x13, 0x12, 0xb9, 0xf7, 0x12, 0xf7, 0x35, 0xb3,
+ 0x13, 0xb8, 0xcb, 0x16, 0xf7, 0x12, 0xf7, 0x39,
+ 0x6, 0xf7, 0x28, 0x96, 0xf5, 0xdd, 0xa3, 0x9b,
+ 0x7c, 0x84, 0x95, 0x1e, 0xb3, 0xf7, 0xc, 0x5,
+ 0x9a, 0x75, 0x62, 0x99, 0x70, 0x1b, 0x55, 0x64,
+ 0x66, 0x58, 0x84, 0x1f, 0x13, 0xd0, 0x89, 0xd7,
+ 0xfb, 0x9, 0x6, 0xe, 0x20, 0x7d, 0xf0, 0xf7,
+ 0xfa, 0xf0, 0x1, 0xcb, 0xf7, 0x14, 0xf7, 0x51,
+ 0xf7, 0x1e, 0x3, 0xa9, 0xf7, 0x2b, 0x15, 0xfb,
+ 0x2a, 0x9e, 0xf7, 0x32, 0x7c, 0xd4, 0x1b, 0xf7,
+ 0x40, 0xce, 0xd7, 0xdf, 0xf7, 0xa, 0x20, 0xba,
+ 0x2f, 0xa2, 0x1f, 0x66, 0x94, 0x21, 0x99, 0xb6,
+ 0x1a, 0xb7, 0xcf, 0x8c, 0xa2, 0xa4, 0xc6, 0x89,
+ 0x4c, 0x9c, 0x1e, 0xf7, 0x17, 0xa3, 0x5, 0xf6,
+ 0x6d, 0x3d, 0xae, 0xfb, 0x10, 0x1b, 0xfb, 0x1,
+ 0xfb, 0x2, 0x62, 0xfb, 0xf, 0xfb, 0x13, 0xf6,
+ 0x77, 0xf7, 0x32, 0x68, 0x1f, 0xab, 0x84, 0xae,
+ 0x7b, 0x6c, 0x1a, 0x51, 0x32, 0x8a, 0x7f, 0x5e,
+ 0x58, 0x9a, 0xd2, 0x7b, 0x1e, 0xe, 0x9a, 0x76,
+ 0xf8, 0x26, 0xf3, 0xf7, 0x44, 0x77, 0x1, 0xe4,
+ 0xf7, 0x1a, 0x3, 0xf7, 0xc9, 0x99, 0x15, 0x7f,
+ 0xf0, 0x5, 0x46, 0x71, 0x75, 0x8c, 0xe5, 0x1a,
+ 0xf7, 0x6c, 0xe6, 0xf3, 0x30, 0xf7, 0x44, 0x7,
+ 0xfb, 0x1a, 0x3e, 0x5, 0x28, 0x4d, 0x23, 0xc9,
+ 0xfb, 0x6c, 0x7, 0xfb, 0x7, 0x95, 0x44, 0xf7,
+ 0xd, 0x99, 0xbb, 0x8d, 0x9d, 0xb7, 0x1e, 0xe,
+ 0x57, 0x7d, 0xf7, 0x0, 0x2b, 0xeb, 0xf8, 0x4a,
+ 0x77, 0x12, 0xd5, 0xf7, 0x1f, 0xf7, 0x55, 0xf7,
+ 0x1f, 0x13, 0x78, 0xf8, 0x34, 0x89, 0x15, 0xf7,
+ 0x15, 0xf8, 0xaa, 0xfb, 0x1f, 0xfb, 0xbb, 0x6,
+ 0x5c, 0x8d, 0x2b, 0xfb, 0x7, 0x2f, 0x8f, 0xde,
+ 0xc7, 0x1e, 0xf7, 0xbb, 0xfb, 0x1f, 0xfb, 0xbb,
+ 0x7, 0x13, 0xb8, 0xfb, 0x37, 0xba, 0x33, 0xf7,
+ 0x14, 0xcf, 0xce, 0xad, 0xc6, 0xb1, 0x1e, 0x8d,
+ 0x6, 0xe, 0x20, 0x73, 0xa, 0x98, 0xf8, 0xa6,
+ 0x3, 0xf7, 0x6f, 0x16, 0xf7, 0xd, 0x6, 0xf7,
+ 0x5f, 0xf8, 0xa8, 0x5, 0xfb, 0x1f, 0x6, 0xfb,
+ 0x11, 0xfb, 0xfd, 0x5, 0x8a, 0x6, 0xfb, 0xf,
+ 0xf7, 0xfd, 0x5, 0xfb, 0x22, 0x6, 0xe, 0xf7,
+ 0x7, 0x73, 0xa, 0x95, 0xf9, 0x8b, 0x3, 0xf7,
+ 0x40, 0x16, 0xf7, 0x17, 0x6, 0xe0, 0xf7, 0xec,
+ 0x5, 0x8d, 0x6, 0xe1, 0xfb, 0xec, 0x5, 0xf7,
+ 0x16, 0x6, 0xf7, 0x37, 0xf8, 0xa8, 0x5, 0xfb,
+ 0x19, 0x6, 0x2b, 0xfb, 0xf0, 0x6e, 0xa, 0x38,
+ 0xf7, 0xf0, 0x5, 0xfb, 0x17, 0x6, 0x35, 0xfb,
+ 0xf0, 0x6e, 0xa, 0x2d, 0xf7, 0xf0, 0x5, 0xfb,
+ 0x18, 0x6, 0xe, 0x20, 0x73, 0xa, 0x9a, 0xf8,
+ 0xa2, 0x3, 0x9a, 0x16, 0xf7, 0x30, 0x6, 0xf3,
+ 0xf7, 0x3a, 0xf2, 0xfb, 0x3a, 0x5, 0xf7, 0x37,
+ 0x6, 0xfb, 0x4f, 0xf7, 0xad, 0xf7, 0x3f, 0xf7,
+ 0x8f, 0x5, 0xfb, 0x30, 0x6, 0x2d, 0xfb, 0x25,
+ 0x32, 0xf7, 0x25, 0x5, 0xfb, 0x37, 0x6, 0xf7,
+ 0x42, 0xfb, 0x95, 0x5, 0xe, 0x20, 0xfb, 0x55,
+ 0x76, 0xf9, 0x7e, 0x77, 0x1, 0xb6, 0x2b, 0x15,
+ 0x97, 0xfb, 0x2, 0x52, 0xa, 0xf7, 0x1, 0xf7,
+ 0x12, 0xc8, 0x1f, 0xf7, 0x4a, 0xf8, 0x93, 0x78,
+ 0xa, 0xfc, 0xd, 0x6e, 0xa, 0xfb, 0xe, 0xf8,
+ 0xd, 0x40, 0xa, 0xf7, 0x58, 0xfc, 0xa8, 0x5,
+ 0x29, 0x48, 0xa, 0xe, 0xfb, 0x37, 0x8b, 0xf7,
+ 0x10, 0xf7, 0xb7, 0xf7, 0x9, 0x1, 0x9f, 0x16,
+ 0xf8, 0x60, 0xf7, 0x10, 0xfb, 0xae, 0x6, 0xf7,
+ 0x9e, 0xf7, 0xc8, 0x5, 0xef, 0xfc, 0x3d, 0xfb,
+ 0x9, 0xf7, 0x88, 0x7, 0xfb, 0x9b, 0xfb, 0xc5,
+ 0x5, 0xe, 0x5b, 0xa, 0xf7, 0x2a, 0xf7, 0xc,
+ 0x14, 0xe0, 0xbb, 0xf7, 0x61, 0x15, 0xe8, 0x94,
+ 0x3f, 0xfb, 0x4, 0xfb, 0x2f, 0xbd, 0x51, 0xf7,
+ 0x20, 0x1f, 0xa4, 0xf7, 0x7, 0x6, 0x47, 0x70,
+ 0x8e, 0xcc, 0xf7, 0x4f, 0x78, 0xbc, 0x48, 0xb3,
+ 0x1f, 0xca, 0xb5, 0xa2, 0xab, 0xf7, 0x5d, 0x1a,
+ 0xcb, 0x9e, 0x90, 0xd7, 0x1e, 0xf7, 0x7, 0x72,
+ 0x7, 0xfb, 0x52, 0x8b, 0x32, 0xfb, 0x23, 0xfb,
+ 0x8, 0x7d, 0x56, 0x33, 0x1f, 0xe, 0xfc, 0x13,
+ 0xfb, 0x5a, 0x76, 0xfa, 0x50, 0x77, 0x1, 0xdf,
+ 0xf7, 0x4, 0x3, 0xdf, 0xfb, 0x6f, 0x15, 0xf7,
+ 0x4, 0xfa, 0x50, 0x7c, 0xa, 0xe, 0x5b, 0xa,
+ 0xf7, 0xb, 0xf7, 0xc, 0x14, 0xe0, 0xa3, 0x3a,
+ 0x15, 0xfb, 0x7, 0xa4, 0x7, 0xf7, 0x52, 0x8b,
+ 0xe4, 0xf7, 0x23, 0xf7, 0x8, 0x92, 0xc0, 0xea,
+ 0x1f, 0xf7, 0x8, 0x7, 0x29, 0x87, 0xd7, 0xf7,
+ 0x4, 0xf7, 0x2f, 0x59, 0xc5, 0xfb, 0x20, 0x1f,
+ 0x72, 0xfb, 0x7, 0x6, 0xcf, 0xa6, 0x88, 0x4a,
+ 0xfb, 0x4f, 0x9e, 0x5a, 0xce, 0x63, 0x1f, 0x4c,
+ 0x61, 0x74, 0x6b, 0xfb, 0x5d, 0x1a, 0x4b, 0x78,
+ 0x86, 0x3f, 0x1e, 0xe, 0x3c, 0xf7, 0x73, 0xf7,
+ 0xc, 0x1, 0xce, 0xf8, 0x62, 0x3, 0xc8, 0xf7,
+ 0x37, 0x15, 0xc2, 0xbf, 0xb3, 0x91, 0xa6, 0x1b,
+ 0xb4, 0xae, 0x7b, 0x7b, 0xae, 0x1f, 0x7d, 0xac,
+ 0xab, 0x7d, 0xb0, 0x1b, 0xd0, 0xbf, 0xbc, 0x95,
+ 0x94, 0x1f, 0xf7, 0xc, 0x7, 0x4d, 0x53, 0x56,
+ 0x89, 0x81, 0x1b, 0x72, 0x6b, 0x99, 0x98, 0x69,
+ 0x1f, 0x9b, 0x64, 0x61, 0x9c, 0x60, 0x1b, 0x76,
+ 0x56, 0x8b, 0x4e, 0x55, 0x1f, 0xe, 0xc6, 0x8b,
+ 0xf7, 0xb, 0xf7, 0xa4, 0xd5, 0xf7, 0x19, 0xf7,
+ 0xc, 0x1, 0x9f, 0xf7, 0x93, 0x15, 0xf7, 0x1,
+ 0x6, 0xfb, 0x2e, 0xae, 0xf7, 0x2b, 0x26, 0xf7,
+ 0x53, 0x1b, 0xcd, 0xc6, 0x95, 0xa0, 0xbc, 0x1f,
+ 0xf7, 0x25, 0x7, 0x66, 0x5f, 0x51, 0x77, 0x40,
+ 0x1b, 0x28, 0xfb, 0xa, 0xc2, 0xdc, 0x7a, 0x1f,
+ 0xf8, 0xf, 0x6, 0x9e, 0xd5, 0x5, 0xfc, 0x30,
+ 0x6, 0x9e, 0x89, 0xa5, 0x8d, 0x9c, 0x1e, 0xf8,
+ 0x3f, 0x6, 0x9f, 0xd5, 0x5, 0xfc, 0x46, 0x6,
+ 0xdb, 0x9f, 0xf7, 0xb, 0xc0, 0xef, 0x1b, 0xca,
+ 0xba, 0x7e, 0x70, 0xac, 0x1f, 0xae, 0xf7, 0x17,
+ 0x5, 0x9e, 0x5b, 0x4a, 0x95, 0x4a, 0x1b, 0xfb,
+ 0x58, 0xfb, 0x21, 0x29, 0xfb, 0x2f, 0x64, 0x1f,
+ 0x2e, 0x6, 0x79, 0x41, 0x5, 0xee, 0x6, 0x8a,
+ 0x7b, 0x8a, 0x6e, 0x8d, 0x7a, 0x8, 0x3a, 0x6,
+ 0xe, 0xfc, 0x15, 0xfb, 0x11, 0x76, 0x12, 0xdb,
+ 0xf7, 0x15, 0x48, 0xce, 0x13, 0xc0, 0xdb, 0x8a,
+ 0x15, 0x13, 0xa0, 0xc9, 0x6, 0x89, 0x43, 0x5c,
+ 0x7f, 0x73, 0x83, 0xa4, 0x56, 0x18, 0xf7, 0x7,
+ 0x45, 0xa, 0x7, 0x13, 0xc0, 0xfb, 0x15, 0x6,
+ 0xe, 0x20, 0xfb, 0x66, 0xf7, 0xa, 0xf8, 0x91,
+ 0xf4, 0xdc, 0xf7, 0x5, 0x1, 0x9b, 0x3b, 0x15,
+ 0x71, 0xfb, 0x3, 0x5, 0x7d, 0xb5, 0xa8, 0x86,
+ 0xa9, 0x1b, 0xf7, 0xb, 0xb6, 0xd4, 0xd9, 0x98,
+ 0x1f, 0xd9, 0xf8, 0x70, 0x5, 0xe7, 0x6, 0x9c,
+ 0xf4, 0x5, 0x2d, 0x6, 0x90, 0xa7, 0x5, 0xb1,
+ 0x92, 0x90, 0xa8, 0xb7, 0x1b, 0xa7, 0xa9, 0x81,
+ 0x87, 0x98, 0x1f, 0xa4, 0xf7, 0x5, 0x5, 0x9e,
+ 0x52, 0x6f, 0x8d, 0x80, 0x1b, 0xfb, 0x14, 0x67,
+ 0x48, 0xfb, 0x28, 0x73, 0x1f, 0x30, 0x6, 0x7a,
+ 0x22, 0x5, 0xe6, 0x6, 0x47, 0xfc, 0x3c, 0x5,
+ 0x4f, 0x82, 0x87, 0x72, 0x60, 0x1b, 0x77, 0x7b,
+ 0x8d, 0x95, 0x64, 0x1f, 0xe, 0xfb, 0x37, 0xfb,
+ 0x11, 0x76, 0xf7, 0x26, 0xf7, 0x13, 0x12, 0xd7,
+ 0xf7, 0x1a, 0x46, 0xd0, 0xe7, 0xf7, 0x1a, 0x45,
+ 0xd1, 0x13, 0xe8, 0xf7, 0xc2, 0x16, 0x13, 0xe4,
+ 0xcb, 0x6, 0x98, 0xa, 0x72, 0x83, 0xa5, 0x56,
+ 0x18, 0xf7, 0xc, 0x61, 0xa, 0xfb, 0x76, 0xfb,
+ 0x13, 0x15, 0x13, 0xd8, 0xcc, 0x6, 0x98, 0xa,
+ 0x71, 0x83, 0xa6, 0x56, 0x18, 0xf7, 0xb, 0x61,
+ 0xa, 0xe, 0xf7, 0xe5, 0x8b, 0x84, 0xa, 0xe7,
+ 0xf7, 0x1f, 0xf7, 0x5b, 0xf7, 0x20, 0xf7, 0x5b,
+ 0xf7, 0x1f, 0x14, 0x70, 0xf9, 0x95, 0x16, 0xf7,
+ 0x1f, 0xf7, 0x26, 0xfb, 0x1f, 0x6, 0xfd, 0x39,
+ 0xfb, 0x26, 0x15, 0xf7, 0x1f, 0xf7, 0x26, 0xfb,
+ 0x1f, 0x6, 0xf7, 0xe6, 0xfb, 0x26, 0x15, 0xf7,
+ 0x20, 0xf7, 0x26, 0x6d, 0xa, 0x20, 0xfb, 0x2a,
+ 0x76, 0xf8, 0xda, 0xf7, 0x7, 0xf7, 0x54, 0x77,
+ 0x1, 0xf7, 0x6b, 0xf7, 0x15, 0x3, 0xf7, 0x6b,
+ 0xfb, 0x3f, 0x15, 0xf7, 0x15, 0xf8, 0xda, 0x74,
+ 0xa, 0xf7, 0x54, 0xfb, 0x15, 0xfb, 0x54, 0xfb,
+ 0x47, 0xfb, 0x7, 0xf7, 0x47, 0x6, 0xe, 0x20,
+ 0xfb, 0x2a, 0x76, 0xf7, 0x3e, 0xf7, 0x7, 0xf7,
+ 0xd3, 0xf7, 0x7, 0xf7, 0x3e, 0x77, 0x1, 0xf7,
+ 0x6b, 0xf7, 0x15, 0x3, 0xaf, 0x8a, 0x15, 0xf7,
+ 0x47, 0xfb, 0x3e, 0xf7, 0x15, 0xf7, 0x3e, 0x74,
+ 0xa, 0xf7, 0xd3, 0x74, 0xa, 0xf7, 0x3e, 0xfb,
+ 0x15, 0xfb, 0x3e, 0xfb, 0x47, 0xfb, 0x7, 0xf7,
+ 0x47, 0xfb, 0xd3, 0xfb, 0x47, 0x6, 0xe, 0xf9,
+ 0x39, 0xd4, 0x1, 0x81, 0xf8, 0xf0, 0x95, 0xa,
+ 0xd4, 0xc8, 0x42, 0x77, 0xa, 0x83, 0xa, 0xfb,
+ 0x1b, 0x6, 0xe, 0xf7, 0xe5, 0x78, 0xd4, 0x5a,
+ 0x76, 0xf7, 0xab, 0xd4, 0x99, 0xd4, 0xf7, 0x64,
+ 0xd4, 0x91, 0x77, 0x12, 0x88, 0xeb, 0xe6, 0xeb,
+ 0xf7, 0x1, 0xeb, 0xe7, 0xea, 0xba, 0xeb, 0xe6,
+ 0xeb, 0x13, 0x7b, 0xf0, 0xe8, 0xf8, 0xa8, 0x15,
+ 0xcc, 0x93, 0xad, 0xb0, 0xaf, 0x96, 0x6b, 0x48,
+ 0x8a, 0x1e, 0x48, 0x8a, 0x82, 0x61, 0x67, 0x1b,
+ 0x66, 0x83, 0xb7, 0xcc, 0x1f, 0x2b, 0x16, 0x51,
+ 0x92, 0xfb, 0x10, 0xf7, 0x1a, 0xf7, 0x18, 0x95,
+ 0xf7, 0x10, 0xc5, 0xd1, 0x72, 0xf1, 0xfb, 0x9,
+ 0xfb, 0x10, 0x7a, 0xfb, 0x5, 0x50, 0x1e, 0xf7,
+ 0x1d, 0xfc, 0xb8, 0x15, 0xec, 0x6, 0x13, 0x77,
+ 0xf0, 0xf7, 0xc1, 0xf9, 0x6a, 0x5, 0x2a, 0x6,
+ 0x5d, 0xfc, 0xb2, 0x15, 0x13, 0xbb, 0xf0, 0x50,
+ 0x91, 0xfb, 0x14, 0xf7, 0x1b, 0xf7, 0x1c, 0x91,
+ 0xf7, 0x1f, 0xbb, 0xd0, 0x72, 0xee, 0xfb, 0x9,
+ 0x71, 0xa, 0x94, 0xa9, 0xaf, 0xb2, 0x93, 0x6d,
+ 0x4a, 0x48, 0x83, 0x5d, 0x64, 0x67, 0x82, 0xb9,
+ 0xce, 0x1e, 0xf7, 0x7e, 0x16, 0x50, 0x92, 0xfb,
+ 0x14, 0xf7, 0x1a, 0xf7, 0x1b, 0x92, 0xf7, 0x1f,
+ 0xbb, 0xd0, 0x73, 0xee, 0xfb, 0xa, 0x71, 0xa,
+ 0x93, 0xa9, 0xb0, 0xaf, 0x95, 0x6d, 0x4a, 0x4e,
+ 0x85, 0x56, 0x63, 0x5e, 0x8b, 0xc9, 0xbf, 0x1e,
+ 0xe, 0x8f, 0x78, 0xf7, 0xe, 0xf8, 0x8c, 0xf7,
+ 0xb, 0x1, 0xcc, 0xf7, 0x21, 0xf7, 0xa9, 0xf7,
+ 0x26, 0x3, 0xb2, 0xf7, 0x78, 0x15, 0xfb, 0x84,
+ 0x72, 0xa, 0xbd, 0xf7, 0x40, 0xf7, 0x45, 0xfb,
+ 0x2a, 0xae, 0xfb, 0x3, 0xa5, 0x1f, 0xfb, 0x9,
+ 0xa7, 0x5e, 0x95, 0xb9, 0x1a, 0xc5, 0xda, 0xa3,
+ 0xb6, 0xf7, 0x8, 0x96, 0x47, 0x66, 0x91, 0x1e,
+ 0xf7, 0x28, 0x91, 0x5, 0xf7, 0x37, 0x85, 0xfb,
+ 0x18, 0xc2, 0xfb, 0x23, 0x1b, 0xfb, 0x69, 0x59,
+ 0xfb, 0xe, 0x3c, 0xfb, 0x33, 0xf7, 0x35, 0x64,
+ 0xd3, 0x78, 0x1f, 0xf7, 0x1a, 0x6b, 0xbe, 0x7e,
+ 0x4f, 0x1a, 0x5c, 0x61, 0x56, 0x25, 0xfb, 0x18,
+ 0x78, 0xf0, 0xb0, 0x84, 0x1e, 0xe3, 0xf8, 0xbd,
+ 0x15, 0xf7, 0x14, 0x6, 0xf4, 0xf7, 0x22, 0x5,
+ 0xfb, 0x5, 0x6, 0x56, 0x41, 0x51, 0xd5, 0x5,
+ 0x7c, 0xa, 0xe, 0x5d, 0xa, 0xf7, 0x49, 0xd7,
+ 0x15, 0xd0, 0x6, 0x39, 0xf7, 0x64, 0xdd, 0xf7,
+ 0x5c, 0x5, 0x46, 0x6, 0x29, 0xfb, 0x5c, 0x5,
+ 0xe, 0xf7, 0xe5, 0x78, 0xf7, 0x13, 0xfb, 0x7,
+ 0xf7, 0x10, 0xf7, 0x59, 0xf7, 0x10, 0xf7, 0x37,
+ 0xf7, 0x10, 0xfb, 0x7, 0xf7, 0x13, 0x12, 0xb0,
+ 0xf7, 0x27, 0xf7, 0xcd, 0xf7, 0x19, 0x13, 0x76,
+ 0xf8, 0x8e, 0x84, 0x15, 0xf8, 0x5b, 0xf7, 0x10,
+ 0xfb, 0xdf, 0xf7, 0x59, 0xf7, 0xad, 0xf7, 0x10,
+ 0xfb, 0xad, 0xf7, 0x37, 0xf7, 0xd1, 0xf7, 0x10,
+ 0xfc, 0x4d, 0x3a, 0x89, 0x6, 0x13, 0xae, 0xc2,
+ 0x64, 0x5e, 0xb1, 0x37, 0x1b, 0xfb, 0x48, 0xfb,
+ 0xb, 0xfb, 0x26, 0xfb, 0x71, 0xfb, 0x7c, 0xeb,
+ 0xfb, 0x31, 0xf7, 0x55, 0xc0, 0xdb, 0x99, 0xdf,
+ 0xba, 0x1f, 0x13, 0x6e, 0xfb, 0xd6, 0xf7, 0xb7,
+ 0x15, 0xf7, 0x21, 0xaf, 0xee, 0xf7, 0x8, 0xf7,
+ 0x0, 0xc0, 0x3c, 0xfb, 0x35, 0x1e, 0x13, 0xb6,
+ 0xfb, 0x5b, 0x3d, 0x4c, 0x2e, 0x29, 0x5f, 0xcf,
+ 0xf7, 0x56, 0x1e, 0xe, 0xfc, 0x15, 0xf8, 0x6f,
+ 0x76, 0xf7, 0xa5, 0x77, 0x12, 0xd0, 0xf7, 0x15,
+ 0x17, 0xd0, 0xf8, 0x5a, 0x15, 0xf7, 0x15, 0xf7,
+ 0x10, 0x6, 0x13, 0xe0, 0x4d, 0x6, 0x8d, 0xd4,
+ 0xba, 0x9a, 0xa3, 0x93, 0x72, 0xc0, 0x18, 0xfb,
+ 0x7, 0x62, 0x8b, 0x35, 0x51, 0x1a, 0xe, 0xfc,
+ 0x15, 0xf8, 0x66, 0x76, 0xf7, 0xa5, 0x77, 0x12,
+ 0xdb, 0xf7, 0x15, 0x48, 0xce, 0x13, 0xe0, 0xe9,
+ 0xf8, 0x51, 0x15, 0xf7, 0x7, 0x45, 0xa, 0xfb,
+ 0x15, 0xfb, 0x13, 0x7, 0x13, 0xd0, 0xc9, 0x6,
+ 0x89, 0x42, 0x5c, 0x7f, 0x73, 0x83, 0x8, 0xe,
+ 0xfb, 0x37, 0xf8, 0x5a, 0xf7, 0x10, 0xf7, 0x29,
+ 0x77, 0x12, 0xcb, 0xd1, 0x45, 0xf7, 0x1a, 0xe7,
+ 0xd0, 0x46, 0xf7, 0x1a, 0x13, 0xd8, 0xcb, 0xf8,
+ 0x5a, 0x15, 0xf7, 0x1a, 0xf7, 0x10, 0x6, 0x13,
+ 0xd4, 0x4b, 0x6, 0x8d, 0xd4, 0xbc, 0x9a, 0xa4,
+ 0x93, 0x71, 0xc0, 0x18, 0xfb, 0xc, 0x62, 0x8b,
+ 0x34, 0x52, 0x1a, 0xf7, 0x76, 0x33, 0x15, 0xf7,
+ 0x1a, 0xf7, 0x10, 0x6, 0x13, 0xe4, 0x4a, 0x6,
+ 0x8d, 0xd4, 0xbc, 0x9a, 0xa5, 0x93, 0x70, 0xc0,
+ 0x18, 0xfb, 0xb, 0x62, 0x8b, 0x34, 0x52, 0x1a,
+ 0xe, 0xfb, 0x37, 0xf8, 0x66, 0x76, 0xf7, 0x26,
+ 0xf7, 0x13, 0x1, 0xd7, 0xf7, 0x1a, 0xe7, 0xf7,
+ 0x1a, 0x3, 0xf7, 0xd0, 0xf8, 0x51, 0x15, 0xf7,
+ 0xc, 0x45, 0xa, 0xfb, 0x1a, 0xfb, 0x13, 0xcb,
+ 0x7, 0x98, 0xa, 0x72, 0x83, 0x8, 0xfb, 0x5b,
+ 0x56, 0x15, 0xf7, 0xb, 0x45, 0xa, 0xfb, 0x1a,
+ 0xfb, 0x13, 0xcc, 0x7, 0x98, 0xa, 0x71, 0x83,
+ 0x8, 0xe, 0xfb, 0xcd, 0xf7, 0x6b, 0x76, 0xf7,
+ 0xde, 0x77, 0x1, 0x95, 0xf7, 0xde, 0x3, 0x95,
+ 0xf7, 0xfb, 0x15, 0x30, 0xd5, 0x41, 0xe5, 0xe6,
+ 0xd6, 0xd4, 0xe7, 0xe8, 0x40, 0xd3, 0x30, 0x30,
+ 0x42, 0x42, 0x2f, 0x1e, 0xe, 0x20, 0xf7, 0x77,
+ 0xf5, 0x1, 0xf7, 0x77, 0x4, 0xf8, 0xc0, 0xf5,
+ 0xfc, 0xc0, 0x6, 0xe, 0xf7, 0xe5, 0xf7, 0x77,
+ 0xf5, 0x1, 0xf7, 0x77, 0x4, 0xfa, 0x7c, 0xf5,
+ 0xfe, 0x7c, 0x6, 0xe, 0xf8, 0xf8, 0xf7, 0x11,
+ 0x21, 0x76, 0xb7, 0xde, 0x8a, 0x77, 0x12, 0x13,
+ 0x60, 0x7a, 0xf8, 0xf6, 0x15, 0xcf, 0x65, 0xa,
+ 0xab, 0xaf, 0x1b, 0xab, 0xa6, 0x81, 0x80, 0xa6,
+ 0x1f, 0x13, 0x80, 0x81, 0xa6, 0xa5, 0x80, 0xa8,
+ 0x1b, 0xe9, 0x8b, 0xee, 0xa5, 0x1f, 0x46, 0x7a,
+ 0xa, 0x6d, 0x66, 0x1b, 0x7f, 0x71, 0x95, 0x96,
+ 0x6d, 0x1f, 0x13, 0x50, 0x96, 0x6d, 0x69, 0x96,
+ 0x71, 0x1b, 0x44, 0x71, 0x59, 0x3f, 0x1f, 0xe,
+ 0xf7, 0xe5, 0xf7, 0xdb, 0x76, 0xf7, 0xe7, 0xd4,
+ 0x1, 0xf7, 0x5b, 0xe3, 0xf7, 0x54, 0xdf, 0xf7,
+ 0xca, 0xde, 0x3, 0xf7, 0x5b, 0xf7, 0xc6, 0x15,
+ 0xe3, 0xf7, 0xe7, 0xf7, 0x2b, 0xd4, 0xfc, 0x1e,
+ 0x42, 0xf7, 0x2f, 0x6, 0xf7, 0xac, 0xfb, 0xe7,
+ 0x15, 0xdf, 0xf7, 0xdc, 0x8d, 0x6, 0xf7, 0x5,
+ 0xfb, 0xdc, 0x5, 0xda, 0x6, 0xf7, 0x5, 0xf7,
+ 0xdc, 0x5, 0x8e, 0xfb, 0xdc, 0xde, 0xf8, 0x30,
+ 0xfb, 0x1e, 0x6, 0x28, 0xfb, 0xaf, 0x6e, 0xa,
+ 0x27, 0xf7, 0xaf, 0x5, 0x81, 0xa, 0x20, 0x7d,
+ 0xed, 0xf8, 0xa1, 0xf7, 0x21, 0x1, 0xbc, 0xf7,
+ 0x15, 0xf7, 0x5f, 0xf7, 0x1e, 0x3, 0xa9, 0xf7,
+ 0x26, 0x15, 0xfb, 0x1c, 0x9e, 0xf7, 0x33, 0x73,
+ 0xd4, 0x1b, 0xf7, 0x40, 0xcd, 0xe8, 0xdc, 0xf7,
+ 0x6, 0x22, 0xa6, 0x2e, 0xa1, 0x1f, 0x66, 0x94,
+ 0x21, 0x98, 0xb5, 0x1a, 0xb5, 0xd2, 0x8c, 0xa2,
+ 0xa4, 0xc3, 0x89, 0x4e, 0x9c, 0x1e, 0xf7, 0x18,
+ 0xa3, 0x5, 0xf2, 0x6d, 0x3d, 0xad, 0xfb, 0x11,
+ 0x1b, 0xfb, 0x2, 0xfb, 0x2, 0x63, 0xfb, 0xb,
+ 0xfb, 0xf, 0xf2, 0x75, 0xf7, 0x33, 0x69, 0x1f,
+ 0xab, 0x84, 0xb1, 0x7f, 0x6d, 0x1a, 0x53, 0x33,
+ 0x8a, 0x7f, 0x5e, 0x58, 0x99, 0xd0, 0x7a, 0x1e,
+ 0xb5, 0xf8, 0x4e, 0x15, 0xf7, 0x14, 0x6, 0xf3,
+ 0xf7, 0x21, 0x5, 0x7c, 0xa, 0x56, 0x42, 0x51,
+ 0xd4, 0x5, 0xfb, 0x3, 0x6, 0xe, 0x5d, 0xa,
+ 0xde, 0xd7, 0x15, 0xcf, 0x6, 0xee, 0xf7, 0x5f,
+ 0x28, 0xf7, 0x61, 0x5, 0x47, 0x6, 0xdc, 0xfb,
+ 0x61, 0x5, 0xe, 0xf7, 0xad, 0x7d, 0xf7, 0x0,
+ 0xfb, 0x0, 0xf7, 0x8, 0xf7, 0xf, 0xe4, 0xf7,
+ 0x8, 0xf7, 0x8, 0x24, 0xf2, 0x12, 0xad, 0xf7,
+ 0x24, 0xf7, 0x8b, 0xf7, 0x1f, 0x13, 0xb6, 0xf8,
+ 0x7c, 0xc7, 0x15, 0x41, 0xd4, 0xe3, 0x8b, 0x9c,
+ 0x1b, 0xe4, 0xf7, 0x3, 0xb1, 0xf7, 0x10, 0xb2,
+ 0x1f, 0xfb, 0x1c, 0xa2, 0x5, 0x6f, 0x81, 0x70,
+ 0x5a, 0x49, 0x1b, 0x4b, 0x6a, 0xbb, 0xde, 0x86,
+ 0x1f, 0xf7, 0xf0, 0x6, 0xf7, 0x82, 0x29, 0xde,
+ 0xfb, 0x28, 0xfb, 0x0, 0x57, 0x52, 0x7a, 0x7a,
+ 0x1e, 0xd0, 0x46, 0x35, 0x90, 0x6c, 0x1b, 0xfb,
+ 0x4c, 0x36, 0xfb, 0x18, 0xfb, 0x24, 0xfb, 0x20,
+ 0xe7, 0xfb, 0x24, 0xf7, 0x45, 0xef, 0xc5, 0xbc,
+ 0xa4, 0xa6, 0x1f, 0xfb, 0xca, 0xf7, 0x66, 0x15,
+ 0xf7, 0xc, 0xc0, 0xb3, 0xd3, 0xce, 0xc2, 0x53,
+ 0x23, 0x1e, 0x13, 0x6e, 0xfb, 0x2c, 0x2e, 0x7b,
+ 0x6e, 0x2c, 0x6d, 0xf7, 0x8, 0xbf, 0x1e, 0xf8,
+ 0x17, 0xb7, 0x15, 0xa6, 0x8d, 0x91, 0xf1, 0xe8,
+ 0x1b, 0xf0, 0x94, 0xfb, 0x0, 0x76, 0x8c, 0x1f,
+ 0xe, 0x8f, 0xa0, 0x76, 0xf9, 0xb2, 0xf7, 0x9,
+ 0x12, 0xf7, 0x45, 0xf7, 0x5, 0x72, 0xf7, 0x1d,
+ 0x73, 0xf7, 0x5, 0x13, 0xd0, 0x70, 0xa, 0xf8,
+ 0x33, 0x4f, 0xa, 0xfc, 0x32, 0x5, 0x13, 0xe8,
+ 0x33, 0xf8, 0x85, 0x8b, 0xa, 0xf7, 0x5d, 0xfb,
+ 0x9, 0x8b, 0xa, 0xe, 0xfb, 0x39, 0x76, 0xf8,
+ 0xd9, 0xf7, 0x1d, 0x12, 0xe5, 0xf7, 0x2e, 0xfb,
+ 0x28, 0xf7, 0x22, 0x13, 0xd0, 0xeb, 0xf8, 0x1f,
+ 0x15, 0xf7, 0x22, 0xf7, 0x1d, 0xfb, 0x22, 0x6,
+ 0x13, 0xe0, 0x85, 0xfc, 0xba, 0x15, 0xfb, 0x3c,
+ 0xf7, 0x2e, 0xf7, 0x3c, 0x7, 0x65, 0xf8, 0x0,
+ 0x5, 0x38, 0x6, 0xe, 0x20, 0x2a, 0x76, 0xf3,
+ 0xf7, 0x1, 0xf7, 0xcf, 0xf5, 0xf7, 0x4, 0x77,
+ 0x1, 0xad, 0xf7, 0x1a, 0x3, 0xf7, 0x42, 0x90,
+ 0x15, 0x6c, 0x21, 0xc6, 0x7a, 0xab, 0xf7, 0x0,
+ 0x5, 0x89, 0x94, 0x9b, 0x89, 0xa4, 0x1b, 0xf7,
+ 0x18, 0xdb, 0xc8, 0xf7, 0xe, 0xa7, 0x1f, 0xfb,
+ 0x1b, 0xa2, 0x5, 0x6e, 0x86, 0x77, 0x47, 0x3b,
+ 0x1b, 0x7f, 0x8a, 0x8c, 0x8c, 0x87, 0x1f, 0xe5,
+ 0xf7, 0xb4, 0x9d, 0x78, 0x90, 0x74, 0x8d, 0x7f,
+ 0x19, 0xf7, 0x1b, 0xa2, 0x70, 0xe8, 0x58, 0xad,
+ 0x5c, 0x9d, 0x19, 0xb2, 0xf7, 0x4, 0x4f, 0x9c,
+ 0x64, 0xfb, 0x7, 0x5, 0x8c, 0x81, 0x7d, 0x8d,
+ 0x75, 0x1b, 0xfb, 0x62, 0x5d, 0xfb, 0x35, 0x25,
+ 0x3a, 0xb7, 0xfb, 0x25, 0xeb, 0x75, 0x1f, 0xb1,
+ 0xf7, 0xc, 0x15, 0x67, 0xb4, 0x83, 0xce, 0x9f,
+ 0x1a, 0xab, 0x92, 0xf7, 0x1c, 0xf7, 0x11, 0x80,
+ 0x1e, 0xe, 0x20, 0x7b, 0xf7, 0xf, 0xf7, 0x50,
+ 0xf7, 0x1, 0xf7, 0x62, 0xf7, 0x0, 0x1, 0xdd,
+ 0xf7, 0x14, 0x3, 0xd9, 0x7b, 0x15, 0x9b, 0xa2,
+ 0xb0, 0xa5, 0xc3, 0x1b, 0xab, 0xb8, 0x82, 0x81,
+ 0xb4, 0x1f, 0x80, 0xb9, 0xb4, 0x7f, 0x97, 0x1b,
+ 0xbc, 0xbd, 0x9d, 0x9c, 0xaa, 0x1f, 0x58, 0xf7,
+ 0x7, 0x5, 0x81, 0x74, 0x67, 0x7a, 0x66, 0x1b,
+ 0x72, 0x79, 0x92, 0x92, 0x75, 0x1f, 0x91, 0x77,
+ 0x73, 0x91, 0x67, 0x1b, 0x83, 0x6c, 0x8b, 0x7d,
+ 0x73, 0x1f, 0x89, 0x8d, 0xb1, 0xb4, 0xb4, 0xbd,
+ 0x83, 0xde, 0x19, 0xf7, 0x11, 0xf7, 0x1, 0xfb,
+ 0x27, 0x6, 0x82, 0xa4, 0x7d, 0xc2, 0xae, 0x1a,
+ 0xb2, 0xa5, 0xbf, 0xc8, 0xd4, 0x98, 0x42, 0x73,
+ 0x90, 0x1e, 0xf7, 0x13, 0x9e, 0x5, 0xf7, 0x3f,
+ 0x73, 0xfb, 0x1b, 0x9a, 0x50, 0x1b, 0xfb, 0x1c,
+ 0x3c, 0x2e, 0x22, 0x7e, 0x8c, 0x5a, 0x9d, 0x55,
+ 0x1f, 0x42, 0xfb, 0x1, 0xec, 0x6, 0x98, 0x3d,
+ 0x5b, 0x45, 0x4d, 0x5d, 0x8, 0xe, 0x20, 0xec,
+ 0x76, 0xb5, 0xf7, 0x16, 0xf7, 0x6c, 0xf7, 0x16,
+ 0xb5, 0x77, 0x1, 0xb2, 0xf7, 0x17, 0xf7, 0x6e,
+ 0xf7, 0x16, 0x3, 0xe6, 0xd8, 0x15, 0xd2, 0xd2,
+ 0x5, 0x78, 0xae, 0xb3, 0x80, 0xb4, 0x1b, 0xb7,
+ 0xb5, 0x97, 0x9e, 0xaa, 0x1f, 0xd5, 0x42, 0xe5,
+ 0xe6, 0x43, 0xd3, 0x5, 0x9e, 0xae, 0x97, 0xb3,
+ 0xb5, 0x1a, 0xab, 0x83, 0xb5, 0x74, 0xb6, 0x1e,
+ 0xd3, 0xd3, 0x30, 0xe6, 0x42, 0x42, 0x5, 0x95,
+ 0x78, 0x66, 0xa0, 0x4e, 0x1b, 0x4e, 0x63, 0x76,
+ 0x81, 0x7a, 0x1f, 0x42, 0xd4, 0x31, 0x2b, 0xd2,
+ 0x46, 0x5, 0x78, 0x68, 0x81, 0x64, 0x62, 0x1a,
+ 0x71, 0x8f, 0x60, 0xa6, 0x5b, 0x1e, 0x44, 0x45,
+ 0x5, 0xf7, 0x3f, 0xf7, 0x4f, 0x15, 0xc7, 0xbb,
+ 0xbb, 0xc7, 0xc7, 0xbd, 0x5b, 0x4f, 0x4f, 0x59,
+ 0x5b, 0x4f, 0x4f, 0x5b, 0xbb, 0xc7, 0x1e, 0xe,
+ 0x20, 0xa0, 0x76, 0xf9, 0x4e, 0x77, 0x1, 0xf7,
+ 0x61, 0xf7, 0x23, 0x3, 0x9b, 0xf7, 0x2a, 0x15,
+ 0xf7, 0x51, 0xfb, 0x2a, 0xf7, 0x23, 0xf7, 0x2a,
+ 0xf7, 0x54, 0xf5, 0xfb, 0x54, 0xd0, 0xf7, 0x54,
+ 0xf5, 0xfb, 0xa, 0x6, 0xf7, 0x23, 0xf7, 0x9f,
+ 0x96, 0xa, 0xfb, 0x16, 0xfb, 0xa0, 0x6e, 0xa,
+ 0xfb, 0x14, 0xf7, 0xa0, 0x96, 0xa, 0xf7, 0x22,
+ 0xfb, 0x9f, 0x5, 0xfb, 0x9, 0x21, 0xf7, 0x51,
+ 0x46, 0xfb, 0x51, 0x6, 0xe, 0xfc, 0x13, 0x8d,
+ 0x76, 0xf9, 0x88, 0x77, 0x1, 0xdf, 0xf7, 0x4,
+ 0x3, 0xdf, 0x78, 0x15, 0xf7, 0x4, 0xf7, 0xcb,
+ 0x7c, 0xa, 0xf7, 0x1b, 0x4, 0xf7, 0x4, 0xf7,
+ 0xca, 0x7c, 0xa, 0xe, 0x20, 0xfb, 0x4c, 0xf1,
+ 0xf9, 0x57, 0xf1, 0x12, 0xad, 0xf7, 0x10, 0x38,
+ 0xf7, 0x1c, 0xf7, 0x27, 0xf7, 0x1a, 0x32, 0xf7,
+ 0xb, 0x13, 0xe8, 0xc8, 0x7f, 0x15, 0xfb, 0x7,
+ 0x9b, 0xe6, 0x52, 0xf7, 0x8, 0x1b, 0xf7, 0x2d,
+ 0xc2, 0xe3, 0xd7, 0xaf, 0x7e, 0xb7, 0x5e, 0xb5,
+ 0x1f, 0x13, 0xd4, 0xa9, 0x9e, 0xc5, 0xb7, 0xe0,
+ 0x1a, 0xd0, 0x67, 0xc0, 0x23, 0xcd, 0x1e, 0x57,
+ 0xab, 0xfb, 0xb, 0xcb, 0xba, 0x1a, 0x9f, 0x95,
+ 0xa3, 0xbb, 0xba, 0xaa, 0x71, 0x5d, 0x8d, 0x1e,
+ 0xf7, 0x19, 0x9a, 0x5, 0xc5, 0x83, 0x60, 0xf0,
+ 0xfb, 0x36, 0x1b, 0xfb, 0xe, 0x43, 0x49, 0x35,
+ 0x53, 0xad, 0x67, 0x99, 0x7c, 0x1f, 0x13, 0xe8,
+ 0x44, 0x61, 0x79, 0x48, 0x60, 0x1a, 0x24, 0xb6,
+ 0x6d, 0xf7, 0x1e, 0x36, 0x1e, 0xbd, 0x6c, 0xe8,
+ 0x5f, 0x59, 0x1a, 0x65, 0x63, 0x7a, 0x69, 0x4c,
+ 0x77, 0xb8, 0xb3, 0x83, 0x1e, 0xf7, 0x3c, 0xf7,
+ 0x30, 0x15, 0xfb, 0x1f, 0xe7, 0x5, 0x61, 0xa8,
+ 0x75, 0xa8, 0xac, 0x1a, 0xaf, 0xa9, 0xa3, 0x96,
+ 0x90, 0x1e, 0xf7, 0x18, 0x2d, 0x5, 0x13, 0xe4,
+ 0xb8, 0x6a, 0xa6, 0x78, 0x6b, 0x1a, 0x72, 0x7a,
+ 0x75, 0x72, 0x74, 0x1e, 0xe, 0xf8, 0xfa, 0xf7,
+ 0x7, 0x1, 0x91, 0xf7, 0x7, 0xe6, 0xf7, 0x7,
+ 0x3, 0x91, 0x44, 0xa, 0xe, 0xd5, 0x78, 0xd6,
+ 0xe7, 0xd2, 0xf7, 0xab, 0xd2, 0xe8, 0xd6, 0x1,
+ 0x80, 0xd6, 0xf7, 0xb, 0xe2, 0xf8, 0x28, 0xd6,
+ 0x3, 0xcb, 0xf7, 0xfb, 0x15, 0xf7, 0x3c, 0xf7,
+ 0x1d, 0xf7, 0x1b, 0xf7, 0x3d, 0x58, 0xa, 0xfb,
+ 0x3d, 0xfb, 0x1d, 0xf7, 0x1b, 0xf7, 0x3c, 0x1e,
+ 0xf8, 0x22, 0x53, 0x15, 0x76, 0x84, 0x78, 0x4c,
+ 0x45, 0x1b, 0x5e, 0x58, 0xad, 0xf5, 0xbd, 0x99,
+ 0xe4, 0xe4, 0xc9, 0x9e, 0x5b, 0x77, 0x92, 0x1f,
+ 0xdb, 0x9e, 0x5, 0xaf, 0x7e, 0x66, 0xdf, 0xfb,
+ 0xa, 0x1b, 0xfb, 0x10, 0x49, 0x36, 0xfb, 0x11,
+ 0xfb, 0x2f, 0xeb, 0x53, 0xe2, 0xcc, 0xdc, 0xa9,
+ 0xed, 0xa8, 0x1f, 0xfc, 0xbc, 0xde, 0x15, 0xfb,
+ 0x65, 0xf7, 0x3e, 0xfb, 0x3d, 0xf7, 0x67, 0x57,
+ 0xa, 0xfb, 0x67, 0x80, 0xa, 0xfb, 0xb9, 0xf7,
+ 0xa8, 0xe7, 0xf7, 0xa5, 0xeb, 0x1, 0xa1, 0xef,
+ 0xf7, 0x4, 0xed, 0x3, 0xf7, 0x93, 0xf7, 0xb3,
+ 0x15, 0xe7, 0x6, 0x7c, 0xaf, 0x8b, 0xa0, 0xd3,
+ 0x1a, 0xf7, 0x27, 0x7, 0xf0, 0x8b, 0xd4, 0xfb,
+ 0x29, 0x3a, 0x5a, 0x6b, 0x2f, 0x7a, 0x1e, 0xe6,
+ 0x73, 0x5, 0x8c, 0x8d, 0x8f, 0x8c, 0x8e, 0x1e,
+ 0xa5, 0x93, 0x93, 0x9d, 0xb1, 0x1b, 0xba, 0x8c,
+ 0x79, 0x5a, 0x8d, 0x1f, 0x78, 0x83, 0x73, 0x85,
+ 0x79, 0x86, 0x8, 0x35, 0x74, 0x4a, 0x7f, 0xfb,
+ 0x0, 0x1a, 0x41, 0xb5, 0x4d, 0xd6, 0xc1, 0xaf,
+ 0xae, 0x9e, 0x9a, 0x1e, 0x8d, 0x80, 0x8e, 0x7b,
+ 0x91, 0x7b, 0x8, 0x76, 0xf7, 0x62, 0x15, 0x72,
+ 0x7, 0x30, 0x5a, 0x82, 0x7c, 0x69, 0x7d, 0xa4,
+ 0x9e, 0xb3, 0xaa, 0x9a, 0xbd, 0x97, 0x1e, 0x9f,
+ 0x90, 0x8f, 0x8f, 0x92, 0x90, 0x8, 0xe, 0x20,
+ 0x5d, 0xa, 0xf8, 0x10, 0xd7, 0x53, 0xa, 0x61,
+ 0xfb, 0x64, 0x53, 0xa, 0xe, 0x3c, 0xf7, 0x15,
+ 0x76, 0x1, 0xf8, 0x20, 0xf7, 0x13, 0x3, 0xb3,
+ 0xf7, 0xc6, 0x15, 0xf7, 0xf9, 0xfb, 0x5a, 0xf7,
+ 0x13, 0xf7, 0xcb, 0xfc, 0x78, 0x6, 0xe, 0x3c,
+ 0xf7, 0x59, 0xf7, 0x4, 0x1, 0xb3, 0xf7, 0x59,
+ 0x15, 0xf8, 0x8c, 0xf7, 0x4, 0xfc, 0x8c, 0x6,
+ 0xe, 0xd5, 0x78, 0xd6, 0xf7, 0x9e, 0xca, 0xf7,
+ 0x1, 0xcb, 0xf3, 0xd6, 0x1, 0x80, 0xd6, 0xf7,
+ 0x19, 0xdc, 0xf7, 0x32, 0xe2, 0xf7, 0x2a, 0xd6,
+ 0x3, 0xf7, 0x59, 0xf7, 0x31, 0x15, 0xdc, 0xf7,
+ 0x39, 0xab, 0x6, 0xb4, 0x9e, 0x85, 0x2e, 0xbb,
+ 0x1f, 0xa7, 0x49, 0x5, 0xf0, 0x6, 0x5c, 0xdc,
+ 0x67, 0xc7, 0x7f, 0x9f, 0x66, 0x99, 0x19, 0x8d,
+ 0x7, 0xdd, 0x96, 0xa5, 0xc3, 0xb8, 0x1a, 0xf0,
+ 0x34, 0x96, 0xfb, 0x13, 0x1e, 0x7c, 0xa, 0xdc,
+ 0xfb, 0x41, 0x15, 0xf7, 0x1, 0xac, 0x7, 0xd2,
+ 0xc1, 0x8b, 0x56, 0x53, 0x57, 0x8b, 0x42, 0x1f,
+ 0xfb, 0x8b, 0x71, 0x15, 0xf7, 0x3c, 0xf7, 0x1d,
+ 0xf7, 0x1b, 0xf7, 0x3c, 0x58, 0xa, 0xfb, 0x3c,
+ 0xfb, 0x1d, 0xf7, 0x1b, 0xf7, 0x3c, 0x1e, 0x40,
+ 0x16, 0xfb, 0x65, 0xf7, 0x3e, 0xfb, 0x3d, 0xf7,
+ 0x66, 0x57, 0xa, 0xfb, 0x66, 0x80, 0xa, 0xf8,
+ 0xf0, 0xd5, 0x1, 0x85, 0xf7, 0xed, 0x3, 0x85,
+ 0xf8, 0xf0, 0x15, 0xf7, 0xed, 0xd5, 0xfb, 0xed,
+ 0x6, 0xe, 0xfb, 0x9b, 0xf8, 0x3e, 0xd6, 0xf7,
+ 0x1c, 0xd6, 0x1, 0xc4, 0xd5, 0xf7, 0x1e, 0xd5,
+ 0x3, 0xc4, 0xf8, 0xcf, 0x15, 0x3b, 0xca, 0x4a,
+ 0xda, 0xda, 0xcc, 0xcc, 0xdb, 0xdb, 0x4a, 0xc8,
+ 0x3c, 0x3c, 0x4c, 0x4e, 0x3b, 0x1e, 0xd5, 0x8a,
+ 0x15, 0xb1, 0xaa, 0xa8, 0xb1, 0xb1, 0xaa, 0x6f,
+ 0x64, 0x65, 0x6c, 0x6c, 0x65, 0x65, 0x6c, 0xaa,
+ 0xb1, 0x1e, 0xe, 0x3c, 0x8b, 0xe6, 0xf7, 0x42,
+ 0xf7, 0x6, 0xf7, 0x13, 0x90, 0xa, 0x16, 0xf8,
+ 0x8c, 0xe6, 0xfc, 0x8c, 0x6, 0xf7, 0x50, 0xb7,
+ 0x15, 0xf7, 0x13, 0xf7, 0x16, 0xf7, 0x51, 0xf7,
+ 0x6, 0xfb, 0x51, 0xf7, 0x13, 0xfb, 0x13, 0xfb,
+ 0x13, 0xfb, 0x50, 0xfb, 0x6, 0xf7, 0x50, 0x6,
+ 0xe, 0xf7, 0xaf, 0xdc, 0xf7, 0x9d, 0xdc, 0x1,
+ 0xf7, 0x76, 0xed, 0x3, 0x94, 0xf7, 0xaf, 0x15,
+ 0xf7, 0xcf, 0xdc, 0xfb, 0x46, 0x6, 0xf7, 0x9,
+ 0xe4, 0xc8, 0xbc, 0xdc, 0x1a, 0xbd, 0x64, 0xd8,
+ 0xfb, 0x4, 0xfb, 0x21, 0x83, 0x27, 0x67, 0x87,
+ 0x1e, 0xed, 0x82, 0x5, 0xa7, 0x8d, 0x90, 0xaf,
+ 0xbb, 0x1b, 0x92, 0xb9, 0x8b, 0x5d, 0x67, 0x73,
+ 0x78, 0x4b, 0x54, 0x1f, 0x28, 0x36, 0x6d, 0x69,
+ 0x44, 0x1a, 0xe, 0xf7, 0xa3, 0xdd, 0xf7, 0xa7,
+ 0xdd, 0x1, 0xf7, 0x61, 0xee, 0x3, 0x93, 0xf8,
+ 0x27, 0x15, 0xfb, 0xf, 0x9a, 0xf7, 0x2, 0x82,
+ 0xab, 0x1b, 0xe9, 0xce, 0xca, 0xd6, 0xbd, 0x70,
+ 0xae, 0x5e, 0x9d, 0x1f, 0xad, 0xa1, 0x9b, 0xa6,
+ 0xa9, 0x1a, 0xc8, 0x53, 0xc5, 0x34, 0xfb, 0xe,
+ 0x7b, 0x37, 0x63, 0x82, 0x1e, 0xea, 0x7d, 0x5,
+ 0xa0, 0x8d, 0x8f, 0xae, 0xb9, 0x1b, 0x9e, 0xa4,
+ 0x83, 0x6e, 0x5c, 0x50, 0x8c, 0x7d, 0x1f, 0x7f,
+ 0x38, 0x5, 0xb8, 0x9f, 0xc5, 0x79, 0x54, 0x1a,
+ 0x6f, 0x7a, 0x6f, 0x62, 0x57, 0x87, 0xb5, 0x9d,
+ 0x87, 0x1e, 0xe, 0xf8, 0xf0, 0x84, 0xa, 0xf7,
+ 0x0, 0xf8, 0xf0, 0x15, 0xed, 0x6, 0xf7, 0x2a,
+ 0x83, 0xa, 0xfb, 0x40, 0x6, 0xe, 0x57, 0xfb,
+ 0x4e, 0x76, 0xf7, 0x53, 0xf7, 0x5, 0x27, 0xef,
+ 0xf8, 0x47, 0x77, 0x49, 0xa, 0x13, 0xdc, 0xf7,
+ 0x61, 0xc9, 0x15, 0x8d, 0x6, 0x68, 0x9c, 0x9e,
+ 0x60, 0xcb, 0x1b, 0xbc, 0xb1, 0xaf, 0xb5, 0xa0,
+ 0x1f, 0x8d, 0x6, 0x13, 0xbc, 0x4a, 0xf7, 0x14,
+ 0xf8, 0xab, 0xfb, 0x1f, 0xfb, 0x87, 0x7, 0x3e,
+ 0x87, 0xfb, 0x7, 0x2c, 0x2c, 0x84, 0xf7, 0x8,
+ 0xd9, 0x1e, 0xf7, 0x85, 0xfb, 0x1f, 0xfd, 0x77,
+ 0xf7, 0x1f, 0x7, 0xe, 0x20, 0xfb, 0x3e, 0x76,
+ 0xf9, 0x92, 0xf7, 0x11, 0x1, 0xf8, 0x6, 0xf7,
+ 0x6, 0x3, 0xf7, 0x4a, 0xfb, 0x53, 0x15, 0xf7,
+ 0x7, 0xf9, 0x92, 0xd4, 0xfd, 0x92, 0xf7, 0x6,
+ 0xf9, 0x92, 0xc2, 0xf7, 0x11, 0xfb, 0xb4, 0x6,
+ 0xfb, 0x2e, 0x22, 0x5f, 0xfb, 0x2d, 0x5a, 0xa1,
+ 0xfb, 0x27, 0xf7, 0x3c, 0x1f, 0xe, 0xfc, 0x15,
+ 0xf7, 0x40, 0xf7, 0x36, 0x1, 0xf7, 0x8, 0xf7,
+ 0x36, 0x3, 0xc5, 0xf7, 0x40, 0x15, 0xf7, 0x36,
+ 0xf7, 0x36, 0xfb, 0x36, 0x6, 0xe, 0xfb, 0x78,
+ 0xd0, 0xee, 0xc7, 0x1, 0xc6, 0x7c, 0x15, 0x7f,
+ 0x54, 0x5, 0x90, 0x99, 0xa3, 0x90, 0x9f, 0x1b,
+ 0xba, 0x94, 0x6e, 0x79, 0x69, 0x6e, 0x79, 0x60,
+ 0x67, 0x71, 0x8e, 0x8f, 0x76, 0x1f, 0x48, 0x7,
+ 0x84, 0xa1, 0xb7, 0x89, 0x9e, 0x1b, 0xd5, 0xdb,
+ 0xac, 0xe5, 0xd2, 0x57, 0xad, 0x4f, 0x7a, 0x69,
+ 0x86, 0x81, 0x74, 0x1f, 0xe, 0xf7, 0xc4, 0x76,
+ 0xf8, 0x3f, 0x77, 0x1, 0xf7, 0x1e, 0xee, 0x3,
+ 0xf7, 0x1e, 0xf7, 0xaf, 0x15, 0xee, 0xf8, 0x3f,
+ 0x3b, 0x6, 0x6f, 0x42, 0x31, 0x6f, 0x7e, 0x88,
+ 0x8, 0x34, 0x7, 0xa5, 0x92, 0xa5, 0x90, 0xc7,
+ 0xb5, 0x8, 0xe, 0xfb, 0xbe, 0xf7, 0xa8, 0xf4,
+ 0xf7, 0x92, 0xf1, 0x1, 0x91, 0xf7, 0x0, 0xf7,
+ 0x1e, 0xf7, 0x0, 0x3, 0x91, 0xf8, 0x94, 0x15,
+ 0xfb, 0x1a, 0xc7, 0x25, 0xf7, 0x7, 0xf7, 0x8,
+ 0xca, 0xf0, 0xf7, 0x1b, 0xf7, 0x12, 0x51, 0xee,
+ 0xfb, 0xd, 0xfb, 0x6, 0x4e, 0x30, 0xfb, 0x1a,
+ 0x1e, 0xf7, 0x0, 0x16, 0xbb, 0x93, 0xd6, 0xc6,
+ 0xc6, 0x97, 0x4f, 0x4c, 0x54, 0x80, 0x3f, 0x4f,
+ 0x51, 0x82, 0xda, 0xbf, 0x1e, 0xe, 0x20, 0x5d,
+ 0xa, 0xe3, 0xd7, 0x50, 0xa, 0xcb, 0xfb, 0x5f,
+ 0x50, 0xa, 0xe, 0xf7, 0x3f, 0x8d, 0x76, 0xa7,
+ 0x76, 0xd0, 0xcf, 0xf8, 0xdc, 0x77, 0xa0, 0x77,
+ 0x12, 0xa5, 0xf7, 0x57, 0xf8, 0x2c, 0xe1, 0x13,
+ 0x6e, 0xf8, 0x5b, 0xc4, 0x15, 0xf7, 0x42, 0x46,
+ 0xe1, 0xd0, 0xbe, 0xcf, 0x58, 0xf7, 0x71, 0x3f,
+ 0x6, 0xfb, 0x4c, 0xfb, 0x72, 0x5, 0xe1, 0x8c,
+ 0x15, 0xe1, 0xf6, 0x5, 0x8d, 0x20, 0x6, 0x13,
+ 0xae, 0xfc, 0x77, 0xfb, 0x24, 0x15, 0xd7, 0x6,
+ 0xf8, 0x38, 0xf9, 0x6d, 0x5, 0x3f, 0x6, 0xfc,
+ 0x48, 0xfb, 0xfa, 0x15, 0xe6, 0x6, 0x13, 0x76,
+ 0xf7, 0xf9, 0x41, 0x7, 0x72, 0x4e, 0x37, 0x74,
+ 0x7f, 0x88, 0x8, 0x42, 0x7, 0x8f, 0x8c, 0x91,
+ 0x8c, 0x8d, 0x8c, 0x96, 0x8e, 0xae, 0x94, 0xb9,
+ 0xa9, 0x8, 0xe, 0xf7, 0x3f, 0x7d, 0xd6, 0x50,
+ 0x76, 0xf7, 0x8a, 0xf7, 0xb, 0xf8, 0x0, 0x77,
+ 0x12, 0xa5, 0xf7, 0x5b, 0xf8, 0x71, 0xe7, 0x13,
+ 0x7c, 0xf7, 0x29, 0x78, 0x15, 0xd8, 0x6, 0xf8,
+ 0x3f, 0xf9, 0x6d, 0x5, 0x3e, 0x6, 0xfc, 0x50,
+ 0xfb, 0xfb, 0x15, 0xe8, 0xf7, 0xf8, 0x40, 0x6,
+ 0x71, 0x4e, 0x35, 0x76, 0x7f, 0x88, 0x8, 0x42,
+ 0x7, 0xa3, 0x91, 0xa4, 0x90, 0xc4, 0xae, 0x8,
+ 0x13, 0xbc, 0xf8, 0x0, 0xfc, 0xf5, 0x15, 0xf7,
+ 0xbe, 0xd6, 0xfb, 0x2e, 0x6, 0x94, 0x94, 0x91,
+ 0x91, 0x94, 0x90, 0x8, 0xf5, 0xd4, 0xa3, 0xb0,
+ 0xba, 0x1a, 0xb5, 0x69, 0xcd, 0x21, 0xfb, 0x18,
+ 0x80, 0x37, 0x6c, 0x87, 0x1e, 0xe7, 0x84, 0x5,
+ 0xa3, 0x8d, 0x90, 0xa9, 0xb8, 0x1b, 0x92, 0xb7,
+ 0x8a, 0x64, 0x6d, 0x73, 0x7b, 0x4f, 0x5e, 0x1f,
+ 0x2f, 0x41, 0x75, 0x6c, 0x83, 0x53, 0x8, 0xe,
+ 0xf7, 0x3f, 0x8d, 0x76, 0xa5, 0x76, 0xd0, 0xcf,
+ 0xf7, 0x71, 0xcf, 0xf7, 0x79, 0xcf, 0x8c, 0x77,
+ 0x12, 0xf7, 0x5c, 0xe8, 0xf8, 0x2, 0xe2, 0x13,
+ 0x7b, 0xf8, 0x75, 0xc2, 0x15, 0xf7, 0x46, 0x46,
+ 0xe2, 0xd0, 0xc0, 0xcf, 0x56, 0xf7, 0x71, 0x3e,
+ 0x6, 0xfb, 0x50, 0xfb, 0x72, 0x5, 0xe3, 0x8c,
+ 0x15, 0xe3, 0xf6, 0x5, 0x8d, 0x20, 0x6, 0x13,
+ 0xb7, 0xfc, 0x77, 0xfb, 0x22, 0x15, 0xd9, 0x6,
+ 0xf8, 0x42, 0xf9, 0x6d, 0x5, 0x3d, 0x6, 0xfc,
+ 0xe2, 0xfb, 0x94, 0x15, 0x25, 0x99, 0xf2, 0x83,
+ 0xa8, 0x1b, 0xe3, 0xca, 0xbf, 0xca, 0xb4, 0x72,
+ 0xa8, 0x60, 0x9a, 0x1f, 0xac, 0x9d, 0x9a, 0xa4,
+ 0xa4, 0x1a, 0x13, 0x7b, 0xbd, 0x56, 0xba, 0x39,
+ 0xfb, 0x5, 0x7c, 0x45, 0x6a, 0x83, 0x1e, 0xe3,
+ 0x7f, 0x5, 0x9d, 0x8d, 0x8f, 0xa8, 0xb5, 0x1b,
+ 0x9e, 0xa2, 0x86, 0x73, 0x64, 0x54, 0x8a, 0x7e,
+ 0x1f, 0x80, 0x46, 0x5, 0x90, 0x9e, 0x96, 0x8d,
+ 0x9a, 0x1b, 0xac, 0x9d, 0x71, 0x72, 0x73, 0x7b,
+ 0x74, 0x64, 0x5b, 0x87, 0xae, 0x9a, 0x88, 0x1f,
+ 0xe, 0x57, 0xfb, 0x57, 0xf5, 0xf8, 0x48, 0x77,
+ 0x1, 0xc2, 0xf7, 0x15, 0xbe, 0xf7, 0x19, 0x3,
+ 0xf7, 0x8b, 0xf7, 0xef, 0x15, 0x8e, 0x4b, 0x8a,
+ 0x76, 0x4c, 0x57, 0x8, 0x2e, 0x3a, 0x65, 0x5c,
+ 0x44, 0x1a, 0xfb, 0x5, 0xec, 0x2e, 0xf7, 0x27,
+ 0xf7, 0x37, 0xde, 0xf7, 0x4, 0xed, 0x91, 0x1e,
+ 0xfb, 0xc, 0x9c, 0x5, 0x3e, 0x7c, 0x5f, 0x5f,
+ 0x42, 0x1b, 0x52, 0x51, 0xab, 0xcc, 0xb7, 0xa1,
+ 0x9d, 0xcd, 0xc3, 0x1f, 0xe9, 0xda, 0x8f, 0xb8,
+ 0x89, 0xec, 0x8, 0xfb, 0x19, 0xbb, 0x15, 0xf7,
+ 0x19, 0xf7, 0x1d, 0xfb, 0x19, 0x6, 0xe, 0x35,
+ 0xa, 0xd3, 0xf7, 0x28, 0x1, 0xf7, 0xf2, 0xf9,
+ 0xa8, 0x15, 0xde, 0x6, 0x4a, 0xf7, 0x28, 0x40,
+ 0xa, 0xfb, 0x5f, 0xfe, 0x3c, 0x28, 0xa, 0x35,
+ 0xa, 0xd3, 0xf7, 0x28, 0x1, 0xf7, 0xb7, 0xf9,
+ 0xa8, 0x15, 0xde, 0x6, 0xf7, 0x13, 0xf7, 0x28,
+ 0x40, 0xa, 0xfb, 0xe4, 0xfe, 0x3c, 0x28, 0xa,
+ 0x35, 0xa, 0xd5, 0x84, 0xa, 0xf7, 0x61, 0xf9,
+ 0xaa, 0x15, 0xf4, 0x6, 0xbe, 0xd4, 0xc1, 0x42,
+ 0x5, 0xf3, 0x6, 0x2b, 0x83, 0xa, 0xfb, 0xc,
+ 0x6, 0xfb, 0xaf, 0xfe, 0x3c, 0x28, 0xa, 0x35,
+ 0xa, 0xf7, 0xf, 0xdf, 0x8a, 0x77, 0x12, 0x13,
+ 0xf0, 0xf7, 0x5e, 0xf9, 0xaf, 0x15, 0xc6, 0x65,
+ 0xa, 0xab, 0xaa, 0x1b, 0xa6, 0xa1, 0x82, 0x82,
+ 0x9f, 0x1f, 0x80, 0xa6, 0xa3, 0x7e, 0xa6, 0x1b,
+ 0xdd, 0x8b, 0xef, 0xa5, 0x1f, 0x4f, 0x7a, 0xa,
+ 0x6d, 0x6b, 0x1b, 0x81, 0x78, 0x95, 0x95, 0x73,
+ 0x1f, 0x13, 0xe8, 0x97, 0x72, 0x6d, 0x96, 0x6e,
+ 0x1b, 0x4d, 0x71, 0x5a, 0x3d, 0x8e, 0x1f, 0xfb,
+ 0x4a, 0xfd, 0xaf, 0x28, 0xa, 0x35, 0xa, 0xda,
+ 0xf7, 0xc, 0x1, 0xf7, 0x62, 0xf9, 0xaf, 0x15,
+ 0xf7, 0x4, 0xf7, 0xc, 0x7c, 0xa, 0xf7, 0x5c,
+ 0xfb, 0xc, 0x15, 0xf7, 0x4, 0xf7, 0xc, 0x7c,
+ 0xa, 0xfc, 0x16, 0xfe, 0x27, 0x28, 0xa, 0x35,
+ 0xa, 0xc0, 0xf7, 0x55, 0x1, 0x9f, 0x16, 0x27,
+ 0xa, 0xfb, 0x47, 0xf8, 0xd3, 0x15, 0x56, 0xb4,
+ 0x5f, 0xbd, 0xbc, 0xb5, 0xb5, 0xc2, 0xc3, 0x62,
+ 0xb3, 0x59, 0x58, 0x63, 0x62, 0x54, 0x1e, 0xbd,
+ 0x16, 0xa4, 0x9d, 0x9d, 0xa2, 0xa1, 0x9e, 0x7a,
+ 0x71, 0x73, 0x78, 0x77, 0x75, 0x75, 0x78, 0x9f,
+ 0xa3, 0x1e, 0xe, 0xf7, 0xe5, 0x8b, 0xf7, 0xe,
+ 0xba, 0xf7, 0x12, 0xa0, 0xf7, 0xe, 0xf7, 0x35,
+ 0xf7, 0xb, 0x1, 0xf8, 0x66, 0xf7, 0x1d, 0x3,
+ 0x90, 0x16, 0xf7, 0x2d, 0x6, 0xd1, 0xf7, 0x3d,
+ 0x5, 0xf7, 0x81, 0xfb, 0x3d, 0xf8, 0x7d, 0xf7,
+ 0xe, 0xfb, 0xf3, 0xf7, 0x56, 0xf7, 0xc2, 0xf7,
+ 0xe, 0xfb, 0xc2, 0xf7, 0x35, 0xf7, 0xe7, 0xf7,
+ 0xb, 0xfc, 0xfe, 0x6, 0x5e, 0xfc, 0x3b, 0x15,
+ 0xf7, 0x1a, 0xf7, 0xd0, 0x5, 0xc0, 0xfb, 0xd0,
+ 0x6, 0xe, 0xc6, 0xfb, 0x78, 0xc9, 0xe4, 0xbe,
+ 0x8d, 0xf7, 0x13, 0xf8, 0x8e, 0xf7, 0x14, 0x1,
+ 0xb7, 0xf7, 0x2d, 0xf7, 0x68, 0xea, 0x3, 0xf7,
+ 0x7c, 0xfb, 0x35, 0x15, 0x4f, 0x7, 0x85, 0xa7,
+ 0xbd, 0x8a, 0x8f, 0x1b, 0xf6, 0xde, 0xb1, 0xd2,
+ 0xb0, 0x78, 0xba, 0x30, 0x94, 0x1f, 0x8d, 0x7,
+ 0xf7, 0x65, 0xca, 0xf7, 0x40, 0xcc, 0x9d, 0x1f,
+ 0xfb, 0x24, 0xb9, 0x5, 0x3a, 0x79, 0x5d, 0x40,
+ 0x29, 0x1b, 0xfb, 0x26, 0x68, 0xf7, 0x11, 0xf7,
+ 0xe, 0xbb, 0x8b, 0xf7, 0x67, 0xf7, 0x4b, 0xd7,
+ 0xc8, 0x60, 0x3b, 0x9d, 0x1f, 0xf7, 0x27, 0xae,
+ 0x5, 0xf7, 0x40, 0x4d, 0xfb, 0x1b, 0xb7, 0x22,
+ 0x1b, 0xfb, 0x83, 0x2a, 0xfb, 0x4a, 0xfb, 0x61,
+ 0xfb, 0x7a, 0xf7, 0x20, 0xfb, 0x24, 0xf7, 0x45,
+ 0x1f, 0x89, 0x7, 0x8c, 0x7, 0x75, 0x8a, 0x76,
+ 0x88, 0x72, 0x82, 0x7d, 0x5a, 0x18, 0x8f, 0x9b,
+ 0xa6, 0x91, 0xa2, 0x1b, 0xc0, 0x96, 0x6f, 0x7d,
+ 0x61, 0x54, 0x86, 0x63, 0x6d, 0x86, 0x8b, 0x90,
+ 0x5c, 0x1f, 0xe, 0x33, 0xa, 0xf7, 0x8a, 0xbb,
+ 0x15, 0xe3, 0x6, 0x46, 0xf7, 0x28, 0x5, 0xfb,
+ 0x2d, 0x6, 0xe, 0x33, 0xa, 0xf7, 0x4c, 0xbb,
+ 0x15, 0xe2, 0x6, 0xf7, 0x1b, 0xf7, 0x28, 0x5,
+ 0xfb, 0x2e, 0x6, 0xe, 0x3a, 0xa, 0xbd, 0x84,
+ 0xa, 0xd7, 0xf7, 0x24, 0x3, 0xf7, 0x3d, 0xf9,
+ 0xaa, 0x15, 0xf7, 0x3, 0x6, 0xc0, 0xd4, 0xc5,
+ 0x42, 0x5, 0xf7, 0x2, 0x6, 0x26, 0x83, 0xa,
+ 0xfb, 0x14, 0x6, 0xfb, 0x58, 0xfe, 0x3c, 0x15,
+ 0x2e, 0xa, 0xe, 0x3a, 0xa, 0xc3, 0xf7, 0xb,
+ 0x12, 0xd7, 0xf7, 0x24, 0x59, 0xf7, 0xa, 0xe9,
+ 0xf7, 0xa, 0x13, 0xf6, 0xf7, 0x3e, 0xf9, 0xb0,
+ 0x8e, 0xa, 0xf7, 0x68, 0xfb, 0xb, 0x8e, 0xa,
+ 0x13, 0xfa, 0xfb, 0xc6, 0xfe, 0x27, 0x15, 0x2e,
+ 0xa, 0xe, 0x4c, 0xa, 0xf9, 0xad, 0xf7, 0x23,
+ 0x94, 0xa, 0xe9, 0xf9, 0xad, 0x15, 0xe2, 0x6,
+ 0x3d, 0x75, 0xa, 0xf7, 0xb, 0x46, 0xa, 0x4c,
+ 0xa, 0xfa, 0x3c, 0x77, 0x94, 0xa, 0xcb, 0xf9,
+ 0xad, 0x15, 0xe2, 0x6, 0xf7, 0x46, 0x75, 0xa,
+ 0x20, 0x46, 0xa, 0x4c, 0xa, 0xf9, 0xaf, 0xf7,
+ 0x21, 0x94, 0xa, 0x66, 0xf9, 0xaf, 0x95, 0xa,
+ 0xd1, 0xc8, 0x45, 0x77, 0xa, 0xf7, 0x21, 0x5,
+ 0xfb, 0x1b, 0x6, 0x87, 0x46, 0xa, 0x4c, 0xa,
+ 0xf9, 0xb3, 0xf7, 0x8, 0x1, 0xd0, 0x63, 0xa,
+ 0xf9, 0x60, 0x68, 0xa, 0x31, 0xde, 0x92, 0xa,
+ 0xf7, 0x62, 0xfb, 0x8, 0x92, 0xa, 0xe, 0xc6,
+ 0x8b, 0xf7, 0xd, 0xf8, 0x70, 0x82, 0xa, 0xd2,
+ 0xf7, 0x27, 0xf7, 0xcc, 0xf7, 0x2f, 0x3, 0xf7,
+ 0x6e, 0xf7, 0xd, 0x15, 0xf7, 0x4f, 0xf7, 0x31,
+ 0xef, 0xfb, 0x31, 0xf7, 0x51, 0xf7, 0x0, 0x7,
+ 0xf7, 0x24, 0xc7, 0x8b, 0xfb, 0x86, 0xfb, 0x7a,
+ 0x2e, 0x87, 0xfb, 0x0, 0x1f, 0xfb, 0x96, 0xfb,
+ 0xd, 0x15, 0xf7, 0x96, 0x6, 0xf7, 0x8e, 0xf5,
+ 0xf7, 0x46, 0xf7, 0x42, 0xf7, 0x9d, 0xfb, 0x1,
+ 0xf0, 0xfb, 0x8e, 0x1f, 0xfb, 0x93, 0xfb, 0xca,
+ 0x3f, 0x27, 0xd7, 0x6, 0xe, 0x69, 0xa, 0xf9,
+ 0x74, 0x77, 0xf7, 0x62, 0x5c, 0xa, 0xf8, 0x74,
+ 0x8d, 0x6, 0xf7, 0xbb, 0xfc, 0x74, 0x5, 0xf7,
+ 0x2a, 0xf9, 0x74, 0xfb, 0x1e, 0xfc, 0x7f, 0x89,
+ 0x6, 0xfb, 0xc1, 0xf8, 0x7f, 0x5, 0xfb, 0x24,
+ 0x6, 0xf7, 0xb, 0xc6, 0x15, 0xcb, 0x65, 0xa,
+ 0xab, 0xad, 0x1b, 0xaa, 0xa2, 0x80, 0x81, 0xa3,
+ 0x1f, 0x81, 0xa4, 0xa4, 0x80, 0xab, 0x1b, 0xe3,
+ 0x8b, 0xef, 0xa5, 0x1f, 0x4a, 0x7a, 0xa, 0x6d,
+ 0x68, 0x1b, 0x80, 0x77, 0x95, 0x95, 0x71, 0x1f,
+ 0x97, 0x71, 0x69, 0x96, 0x6a, 0x1b, 0x48, 0x70,
+ 0x5a, 0x3d, 0x8e, 0x1f, 0xe, 0x59, 0xa, 0xd1,
+ 0xf7, 0x23, 0x1, 0xc6, 0xf7, 0x28, 0xf8, 0x0,
+ 0x85, 0xa, 0xb7, 0xf7, 0xf4, 0x29, 0xa, 0xfb,
+ 0x22, 0x51, 0x22, 0xfb, 0x1f, 0xfb, 0x2c, 0x5e,
+ 0xf7, 0x4, 0xf7, 0x1b, 0x1e, 0xf7, 0x4d, 0xf8,
+ 0x4d, 0x15, 0xe1, 0x6, 0x47, 0x67, 0xa, 0xfb,
+ 0x2c, 0x6, 0xe, 0x5f, 0xa, 0xf8, 0x82, 0xf7,
+ 0x10, 0xd1, 0xf7, 0x23, 0x7e, 0xa, 0xf7, 0xcf,
+ 0xf9, 0xad, 0x15, 0xe1, 0x6, 0xf7, 0x1a, 0x67,
+ 0xa, 0xfb, 0x2c, 0x6, 0xfb, 0xe7, 0x31, 0xa,
+ 0x54, 0xfb, 0xb, 0xfb, 0x22, 0x41, 0xa, 0x5f,
+ 0xa, 0xf8, 0x82, 0xf7, 0x10, 0xd3, 0xf7, 0x21,
+ 0x7e, 0xa, 0xf7, 0x74, 0xf9, 0xaf, 0x15, 0xf7,
+ 0x3, 0x6, 0xc0, 0xd1, 0xc3, 0x45, 0x5, 0xf7,
+ 0x2, 0x6, 0x26, 0xf7, 0x21, 0x5, 0xfb, 0x12,
+ 0x6, 0xfb, 0xaf, 0x31, 0xa, 0x4f, 0xfb, 0xb,
+ 0xfb, 0x1d, 0x41, 0xa, 0x59, 0xa, 0xd8, 0x64,
+ 0xa, 0xd1, 0xf7, 0x28, 0xf7, 0xf1, 0xf7, 0x28,
+ 0x13, 0xd6, 0xf7, 0x71, 0xf9, 0xb2, 0x15, 0xc9,
+ 0x6a, 0xa, 0x9f, 0x1f, 0x13, 0xe6, 0x80, 0xa3,
+ 0xa1, 0x80, 0xad, 0x1b, 0xe1, 0x8b, 0xed, 0xa4,
+ 0x1f, 0x4c, 0x7a, 0xa, 0x6e, 0x69, 0x1b, 0x81,
+ 0x79, 0x93, 0x94, 0x75, 0x1f, 0x13, 0xce, 0x97,
+ 0x70, 0x67, 0x98, 0x6c, 0x1b, 0x4a, 0x70, 0x5b,
+ 0x3f, 0x8e, 0x1f, 0xfb, 0x45, 0xfc, 0x52, 0x29,
+ 0xa, 0xfb, 0x2c, 0x4f, 0x2c, 0xfb, 0x1d, 0x41,
+ 0xa, 0x59, 0xa, 0xd6, 0xf7, 0x9, 0x1, 0xc6,
+ 0xf7, 0x28, 0xf8, 0x1, 0x85, 0xa, 0xf7, 0x75,
+ 0xf9, 0xb2, 0x8d, 0xa, 0xf7, 0x66, 0xfb, 0x9,
+ 0x8d, 0xa, 0xfc, 0x1b, 0xfc, 0xc7, 0x29, 0xa,
+ 0xfb, 0x11, 0x54, 0xfb, 0xe, 0xfb, 0x22, 0x41,
+ 0xa, 0x3c, 0xa1, 0x76, 0xf8, 0x8c, 0x77, 0x1,
+ 0xb4, 0xec, 0x15, 0xe9, 0x2c, 0xf7, 0x30, 0xf7,
+ 0x31, 0xf7, 0x32, 0xfb, 0x32, 0xeb, 0xec, 0xfb,
+ 0x32, 0xf7, 0x31, 0xf7, 0x30, 0xf7, 0x2f, 0x2e,
+ 0xea, 0xfb, 0x31, 0xfb, 0x31, 0xfb, 0x31, 0xf7,
+ 0x31, 0x2b, 0x2b, 0xf7, 0x32, 0xfb, 0x30, 0x5,
+ 0xe, 0xf7, 0x7, 0x85, 0x76, 0xa6, 0xf7, 0xe,
+ 0xf8, 0x74, 0xf7, 0xe, 0xa0, 0x77, 0x1, 0xbc,
+ 0xf7, 0x27, 0xf8, 0x7, 0xf7, 0x27, 0x3, 0xac,
+ 0xab, 0x15, 0xcf, 0x50, 0xd9, 0xe2, 0x5, 0x5a,
+ 0xce, 0xd5, 0x80, 0xcd, 0x1b, 0xf7, 0x8a, 0xed,
+ 0xf7, 0x56, 0xf7, 0x43, 0xab, 0x89, 0xf7, 0x2,
+ 0x4a, 0xe1, 0x1f, 0xdc, 0xe4, 0x48, 0xc6, 0x3f,
+ 0x36, 0x5, 0x9f, 0x71, 0x4c, 0xb7, 0xfb, 0x12,
+ 0x1b, 0xfb, 0x88, 0x2a, 0xfb, 0x40, 0xfb, 0x4b,
+ 0xfb, 0x18, 0xb1, 0x44, 0xab, 0x60, 0x1f, 0xee,
+ 0xf7, 0x2, 0x15, 0x7d, 0xad, 0x83, 0xbc, 0xc0,
+ 0x1a, 0xf7, 0x12, 0xc6, 0xf6, 0xf7, 0x1b, 0xb8,
+ 0xba, 0x80, 0x6e, 0xad, 0x1e, 0xfb, 0x87, 0xfc,
+ 0x25, 0x15, 0xf7, 0xbb, 0xf7, 0xda, 0x5, 0x95,
+ 0x72, 0x94, 0x64, 0x55, 0x1a, 0xfb, 0x47, 0x2a,
+ 0x47, 0x27, 0x6e, 0x63, 0x8e, 0xaf, 0x5b, 0x1e,
+ 0xe, 0x54, 0xa, 0xd3, 0xf9, 0x5e, 0x5e, 0xa,
+ 0xb5, 0xfb, 0x48, 0xf7, 0x8f, 0xf7, 0x7a, 0xc3,
+ 0x2b, 0xa, 0xf7, 0x18, 0xd9, 0x15, 0xe4, 0x6,
+ 0x45, 0xf7, 0x24, 0x97, 0xa, 0xe, 0x54, 0xa,
+ 0xf7, 0xb3, 0xf9, 0xac, 0x15, 0xe3, 0x6, 0xf7,
+ 0x1c, 0xf7, 0x24, 0x97, 0xa, 0xfb, 0xb0, 0xfb,
+ 0x72, 0x5e, 0xa, 0xa1, 0xfb, 0x48, 0xf7, 0xa3,
+ 0x2f, 0xa, 0xc6, 0x78, 0xf7, 0x11, 0xf9, 0x44,
+ 0xf7, 0x22, 0x42, 0xa, 0xf7, 0x57, 0xf9, 0xae,
+ 0x15, 0xf7, 0x4, 0x6, 0xc1, 0xd1, 0xc5, 0x45,
+ 0x5, 0xf7, 0x3, 0x6, 0x25, 0xf7, 0x22, 0x5,
+ 0xfb, 0x15, 0x6, 0xfb, 0x77, 0xfb, 0x72, 0x34,
+ 0xa, 0xc6, 0x78, 0xf7, 0x11, 0xf9, 0x48, 0xf7,
+ 0x9, 0x12, 0xd3, 0xf7, 0x26, 0x75, 0xf7, 0xb,
+ 0xea, 0xf7, 0xb, 0x73, 0xf7, 0x26, 0x13, 0xd8,
+ 0xf7, 0x58, 0xf9, 0xb2, 0x8f, 0xa, 0xf7, 0x6a,
+ 0xfb, 0x9, 0x8f, 0xa, 0x13, 0xe4, 0xfb, 0xe6,
+ 0xfb, 0x5d, 0x34, 0xa, 0x8f, 0xa0, 0x76, 0x1,
+ 0xf7, 0x9d, 0xf7, 0x1d, 0x3, 0x70, 0xa, 0xf8,
+ 0x34, 0x5, 0xfb, 0x32, 0x6, 0xfb, 0x33, 0xfb,
+ 0xaf, 0xfb, 0x34, 0xf7, 0xaf, 0x5, 0xfb, 0x35,
+ 0x6, 0xf7, 0x8e, 0xfc, 0x33, 0x5, 0x89, 0xf8,
+ 0x80, 0x15, 0xde, 0x6, 0xf7, 0x14, 0x67, 0xa,
+ 0xfb, 0x26, 0x6, 0xe, 0x8f, 0xa0, 0x76, 0xf7,
+ 0x1b, 0xf7, 0xe, 0xf7, 0x60, 0xf7, 0xe, 0xf7,
+ 0x1b, 0x77, 0x60, 0xa, 0xf7, 0x1b, 0xd1, 0x6,
+ 0xcc, 0xf1, 0x8c, 0xa3, 0xbe, 0x1f, 0xb9, 0xa1,
+ 0xd3, 0xbf, 0xf7, 0x12, 0x1a, 0xf7, 0x73, 0xfb,
+ 0x2f, 0x8b, 0xfb, 0x49, 0x1e, 0x45, 0xf7, 0x1b,
+ 0xfb, 0x25, 0x6, 0xf7, 0x25, 0xfc, 0x61, 0x15,
+ 0xf7, 0x60, 0xd1, 0x7, 0xf4, 0xdc, 0x88, 0x29,
+ 0x24, 0xfb, 0x3, 0x8b, 0x40, 0x1f, 0xe, 0x57,
+ 0x92, 0x76, 0xf9, 0x11, 0xf7, 0x0, 0x1, 0xd0,
+ 0xf7, 0x1e, 0xf7, 0x7e, 0xf7, 0x1e, 0x3, 0xd0,
+ 0x84, 0x15, 0xf7, 0x1e, 0xf8, 0x6b, 0x6, 0xe3,
+ 0x8b, 0xd2, 0xd6, 0xe6, 0x68, 0x36, 0x4c, 0x6d,
+ 0x1e, 0x75, 0x5e, 0x81, 0x6d, 0x72, 0x1a, 0x64,
+ 0xa6, 0x6e, 0xc3, 0x56, 0x1e, 0xcf, 0x49, 0x99,
+ 0x7d, 0x6d, 0x1a, 0x6a, 0x73, 0x79, 0x72, 0x76,
+ 0x76, 0x97, 0xa6, 0x83, 0x1e, 0x2b, 0x53, 0x5,
+ 0x4e, 0xa8, 0xcd, 0x6e, 0xcc, 0x1b, 0xe3, 0xe0,
+ 0xc3, 0xf7, 0x0, 0xc0, 0x76, 0xb5, 0x4a, 0xcd,
+ 0x1f, 0x57, 0xc0, 0x75, 0x9c, 0xa3, 0x1a, 0x9c,
+ 0x97, 0x9f, 0xa1, 0xb4, 0x1e, 0xf7, 0x2, 0xc6,
+ 0x7a, 0xf7, 0x1e, 0xfb, 0x67, 0x1b, 0xfb, 0x59,
+ 0x79, 0xfb, 0x3d, 0x29, 0x1f, 0xe, 0x39, 0xa,
+ 0xc4, 0xf7, 0x29, 0x51, 0xa, 0xf7, 0x9b, 0xf8,
+ 0xed, 0x15, 0xe4, 0x6, 0x45, 0xf7, 0x29, 0x96,
+ 0xa, 0xf7, 0x89, 0x22, 0xa, 0x39, 0xa, 0xc5,
+ 0xf7, 0x28, 0x51, 0xa, 0xf7, 0x5b, 0xf8, 0xee,
+ 0x15, 0xe4, 0x6, 0xf7, 0x1e, 0xf7, 0x28, 0x96,
+ 0xa, 0xf0, 0x22, 0xa, 0x39, 0xa, 0xc6, 0xf7,
+ 0x27, 0x51, 0xa, 0xf5, 0xf8, 0xef, 0x15, 0xf7,
+ 0x6, 0x6, 0xc1, 0xd4, 0xc5, 0x42, 0x5, 0xf7,
+ 0x5, 0x6, 0x24, 0xf7, 0x27, 0x5, 0xfb, 0x17,
+ 0x6, 0xf7, 0x33, 0x22, 0xa, 0x39, 0xa, 0xcd,
+ 0xf7, 0x13, 0x37, 0xdf, 0x8a, 0x77, 0x66, 0xa,
+ 0x49, 0xcd, 0xf7, 0x52, 0xf7, 0x1d, 0x13, 0xa9,
+ 0x80, 0xf2, 0xf8, 0xf4, 0x15, 0xca, 0x6, 0x98,
+ 0x8c, 0x8b, 0xab, 0xad, 0x1b, 0xb0, 0xa4, 0x7e,
+ 0x80, 0xa3, 0x1f, 0x13, 0xb2, 0x80, 0x82, 0xa1,
+ 0xa0, 0x81, 0xa9, 0x1b, 0xe3, 0x8b, 0xf0, 0xa5,
+ 0x1f, 0x4b, 0x6, 0x7d, 0x88, 0x87, 0x6d, 0x69,
+ 0x1b, 0x80, 0x78, 0x94, 0x95, 0x73, 0x1f, 0x13,
+ 0x65, 0x80, 0x97, 0x70, 0x68, 0x97, 0x6a, 0x1b,
+ 0x48, 0x70, 0x5a, 0x3c, 0x8e, 0x1f, 0xf7, 0x9f,
+ 0xfc, 0xbb, 0x21, 0xa, 0x13, 0xb2, 0x80, 0x32,
+ 0xa, 0x39, 0xa, 0xce, 0xf7, 0xa, 0x66, 0xa,
+ 0x4d, 0xf7, 0xd, 0xea, 0xf7, 0xd, 0x36, 0xf7,
+ 0x1d, 0x13, 0x76, 0xf6, 0xf8, 0xf7, 0x8a, 0xa,
+ 0xf7, 0x6c, 0xfb, 0xa, 0x8a, 0xa, 0xba, 0xfd,
+ 0x34, 0x30, 0xa, 0x13, 0xb9, 0x20, 0xa, 0x32,
+ 0xa, 0x39, 0xa, 0xb1, 0xf7, 0x56, 0x56, 0x77,
+ 0x66, 0xa, 0x9e, 0xf7, 0x58, 0x72, 0xf7, 0x1d,
+ 0x13, 0xb6, 0xf7, 0x50, 0xf9, 0x3b, 0x15, 0x56,
+ 0xb7, 0x5f, 0xc1, 0xbf, 0xb9, 0xb5, 0xc2, 0xc3,
+ 0x5e, 0xb4, 0x56, 0x54, 0x60, 0x61, 0x54, 0x1e,
+ 0xc0, 0x16, 0x13, 0x6d, 0xa4, 0x9f, 0x9e, 0xa4,
+ 0xa3, 0x9f, 0x79, 0x71, 0x73, 0x77, 0x77, 0x73,
+ 0x73, 0x76, 0x9f, 0xa3, 0x1e, 0xf7, 0x15, 0xfd,
+ 0x2, 0x24, 0xa, 0x13, 0xb5, 0x26, 0xa, 0xf7,
+ 0x76, 0x7d, 0xf7, 0x0, 0xf7, 0x17, 0xe4, 0xf7,
+ 0x10, 0xf7, 0x0, 0x1, 0xa8, 0xf7, 0x22, 0xf7,
+ 0x50, 0xf7, 0x21, 0xf7, 0x6c, 0xf7, 0x22, 0x3,
+ 0xf8, 0x39, 0xc7, 0x15, 0x52, 0xc8, 0xca, 0x7a,
+ 0xc8, 0x1b, 0xf7, 0x47, 0xbf, 0xf7, 0xc, 0xb2,
+ 0x99, 0x1f, 0xfb, 0x1f, 0xa3, 0x5, 0x7a, 0x84,
+ 0x72, 0x51, 0x41, 0x1b, 0x2b, 0x84, 0xf2, 0xa7,
+ 0x88, 0x1f, 0xf7, 0xfa, 0x6, 0xf4, 0x77, 0xf7,
+ 0x6c, 0xfb, 0x7c, 0x4c, 0x5a, 0x78, 0x6c, 0x63,
+ 0x1e, 0x9a, 0x7b, 0x4f, 0xae, 0x21, 0x1b, 0xfb,
+ 0x2d, 0x61, 0x59, 0x26, 0x6a, 0x1f, 0xf7, 0x15,
+ 0x73, 0x5, 0x9d, 0x90, 0x9a, 0xbc, 0xda, 0x1b,
+ 0xe3, 0x8b, 0x53, 0x75, 0x1f, 0x7e, 0x7, 0x7a,
+ 0x85, 0x78, 0x89, 0x59, 0x7d, 0x8, 0x24, 0x6e,
+ 0xfb, 0x22, 0x88, 0xfb, 0x29, 0x1a, 0x43, 0xbb,
+ 0x35, 0xf7, 0x1a, 0xf0, 0xd9, 0xb9, 0xa7, 0xaa,
+ 0x1e, 0x4d, 0xf7, 0x57, 0x15, 0x42, 0x8b, 0x63,
+ 0x6c, 0x71, 0x1e, 0x56, 0x5f, 0x23, 0x93, 0xd7,
+ 0x1a, 0xb9, 0xb5, 0x99, 0xb8, 0x97, 0x1e, 0xf7,
+ 0x88, 0xe1, 0x15, 0x9b, 0x8a, 0x92, 0xf7, 0x0,
+ 0xed, 0x1b, 0xf0, 0x92, 0x2f, 0x6b, 0x8d, 0x1f,
+ 0xe, 0x20, 0xfb, 0x78, 0xc2, 0xe4, 0xf7, 0x40,
+ 0xfb, 0xa, 0xf7, 0xa, 0xf7, 0xec, 0xf7, 0x6,
+ 0x12, 0xad, 0xf7, 0x21, 0xf7, 0x23, 0xdd, 0x13,
+ 0xdc, 0xf7, 0x5a, 0x2f, 0x15, 0x92, 0xaa, 0x9c,
+ 0x8c, 0x92, 0x1b, 0xc4, 0x93, 0x6d, 0x7e, 0x5d,
+ 0x45, 0x8b, 0x6c, 0x6a, 0x79, 0x8e, 0x8c, 0x83,
+ 0x1f, 0x56, 0x7, 0x85, 0xb2, 0x9d, 0x8b, 0x8d,
+ 0x1b, 0xf7, 0x11, 0xc5, 0xc7, 0xb9, 0xc1, 0x5b,
+ 0xaa, 0x5f, 0x90, 0x1f, 0x13, 0xbc, 0x8d, 0x7,
+ 0xf7, 0x3f, 0x91, 0xaf, 0xf7, 0x2b, 0x94, 0xb5,
+ 0xfb, 0x1b, 0xa3, 0x18, 0x69, 0x85, 0x7e, 0x44,
+ 0x3a, 0x1b, 0x36, 0x6e, 0xcd, 0xf3, 0xad, 0x89,
+ 0xf7, 0x20, 0xf7, 0x5, 0xda, 0x99, 0x47, 0x78,
+ 0x8e, 0x1f, 0xf7, 0x1b, 0xa4, 0x5, 0xd4, 0x77,
+ 0x5e, 0xf2, 0xfb, 0x3a, 0x1b, 0xfb, 0x5e, 0x59,
+ 0xfb, 0x3b, 0xfb, 0xd, 0x3a, 0xa5, 0xfb, 0x56,
+ 0xf7, 0x5f, 0x7e, 0x1f, 0x89, 0x7, 0x7c, 0x8a,
+ 0x7e, 0x8a, 0x75, 0x85, 0x8, 0xe, 0x3c, 0xa,
+ 0xc8, 0xf7, 0x28, 0x43, 0xa, 0xf7, 0x9d, 0xf8,
+ 0xee, 0x15, 0xe6, 0x6, 0x44, 0xf7, 0x28, 0x5,
+ 0xfb, 0x33, 0x6, 0xb6, 0xfc, 0xa2, 0x25, 0xa,
+ 0x3c, 0xa, 0xc7, 0xf7, 0x29, 0x43, 0xa, 0xf7,
+ 0x5c, 0xf8, 0xed, 0x15, 0xe6, 0x6, 0xf7, 0x20,
+ 0xf7, 0x29, 0x5, 0xfb, 0x34, 0x6, 0x25, 0xfc,
+ 0xa2, 0x25, 0xa, 0x3c, 0xa, 0xc9, 0xf7, 0x27,
+ 0x43, 0xa, 0xf4, 0xf8, 0xef, 0x15, 0xf7, 0x8,
+ 0x6, 0xc3, 0xd4, 0xc6, 0x42, 0x5, 0xf7, 0x7,
+ 0x6, 0x21, 0xf7, 0x27, 0x5, 0xfb, 0x18, 0x6,
+ 0x5f, 0xfc, 0xa2, 0x25, 0xa, 0x3c, 0xa, 0xd1,
+ 0xf7, 0xa, 0x43, 0xa, 0xf5, 0xf8, 0xf7, 0x15,
+ 0xf7, 0x10, 0xf7, 0xa, 0xfb, 0x10, 0x6, 0xf7,
+ 0x71, 0xfb, 0xa, 0x15, 0xf7, 0xf, 0xf7, 0xa,
+ 0xfb, 0xf, 0x6, 0xfb, 0x32, 0xfc, 0x8d, 0x25,
+ 0xa, 0x62, 0xa, 0xf7, 0x23, 0xf8, 0xf2, 0x15,
+ 0xe1, 0x6, 0x20, 0xf7, 0x24, 0x5, 0xfb, 0x2c,
+ 0x6, 0xf5, 0xfd, 0x82, 0x15, 0x55, 0xa, 0xe,
+ 0x62, 0xa, 0xbc, 0xf8, 0xf1, 0x15, 0xe2, 0x6,
+ 0xf7, 0x41, 0xf7, 0x25, 0x5, 0xfb, 0x2c, 0x6,
+ 0x3a, 0xfd, 0x82, 0x15, 0x55, 0xa, 0xe, 0x4c,
+ 0xa, 0xf8, 0xf3, 0xf7, 0x23, 0x1, 0xd7, 0xf7,
+ 0x13, 0x3, 0xd7, 0x16, 0x55, 0xa, 0xfb, 0x5,
+ 0xe1, 0x95, 0xa, 0xd3, 0xc8, 0x43, 0x77, 0xa,
+ 0x67, 0xa, 0xfb, 0x1b, 0x6, 0xe, 0x4c, 0xa,
+ 0xf8, 0xfa, 0xf7, 0x7, 0x12, 0x76, 0xf7, 0x7,
+ 0x79, 0xf7, 0x13, 0x79, 0xf7, 0x7, 0x13, 0xe8,
+ 0x76, 0x44, 0xa, 0x13, 0xd0, 0xfb, 0x1, 0xfd,
+ 0x6d, 0x15, 0x55, 0xa, 0xe, 0x57, 0x7d, 0xf7,
+ 0x8, 0xf7, 0xd4, 0xf7, 0x3, 0xf7, 0x60, 0x77,
+ 0x1, 0xad, 0xf7, 0x26, 0xf7, 0x90, 0xf7, 0x26,
+ 0x3, 0xf7, 0x65, 0xf8, 0xc7, 0x15, 0xeb, 0xb8,
+ 0xb0, 0x5b, 0x95, 0x7b, 0xa4, 0x60, 0x19, 0x89,
+ 0x89, 0x5, 0x9b, 0x70, 0x6b, 0x9d, 0x5a, 0x1b,
+ 0xfb, 0x1, 0xfb, 0x10, 0x22, 0xfb, 0x3b, 0xfb,
+ 0x26, 0xec, 0xfb, 0x15, 0xf7, 0x40, 0xf7, 0x31,
+ 0xf7, 0xa, 0xea, 0xf7, 0x48, 0xf7, 0x26, 0x3e,
+ 0xf7, 0x23, 0x26, 0xf2, 0x1f, 0xd2, 0xad, 0x75,
+ 0xbd, 0x30, 0x60, 0x75, 0x9d, 0x85, 0x8f, 0x72,
+ 0xa0, 0x19, 0xfb, 0x26, 0x6, 0xbe, 0x66, 0x9a,
+ 0x81, 0xb5, 0x63, 0x3a, 0x65, 0x18, 0x85, 0xfb,
+ 0xf3, 0x15, 0xf7, 0x4, 0xcc, 0xbc, 0xc5, 0xce,
+ 0xc9, 0x54, 0x21, 0x27, 0x52, 0x50, 0x44, 0x52,
+ 0x48, 0xb2, 0xf7, 0xc, 0x1e, 0xe, 0x57, 0xa0,
+ 0x76, 0xf8, 0xfa, 0x64, 0xa, 0xcc, 0xf7, 0x16,
+ 0x58, 0xc8, 0xf7, 0x5d, 0xf7, 0x20, 0x13, 0xca,
+ 0xcc, 0x16, 0x13, 0xc6, 0xf7, 0x20, 0xf7, 0x7f,
+ 0x6, 0xe2, 0x90, 0xf2, 0xf7, 0x3, 0xe0, 0x8b,
+ 0x22, 0x36, 0x1e, 0xfb, 0x7f, 0xf7, 0x20, 0xf7,
+ 0xd6, 0x7, 0xf7, 0x6, 0x3e, 0xe9, 0x28, 0x55,
+ 0x48, 0x79, 0x45, 0x57, 0x1e, 0x13, 0xca, 0x89,
+ 0xd7, 0xfb, 0x16, 0x6, 0x13, 0xa6, 0xda, 0xe9,
+ 0x15, 0xca, 0x65, 0xa, 0xaa, 0xad, 0x1b, 0xa9,
+ 0xa1, 0x82, 0x82, 0xa0, 0x1f, 0x13, 0xca, 0x80,
+ 0xa5, 0xa3, 0x7f, 0xae, 0x1b, 0xdf, 0x8f, 0xed,
+ 0xa4, 0x1f, 0x4b, 0x6, 0x7d, 0x88, 0x87, 0x6e,
+ 0x69, 0x1b, 0x13, 0x96, 0x80, 0x73, 0x96, 0x96,
+ 0x70, 0x1f, 0x95, 0x71, 0x6e, 0x95, 0x6c, 0x1b,
+ 0x49, 0x72, 0x6a, 0x30, 0x1f, 0xe, 0x3e, 0xa,
+ 0xd7, 0xf7, 0x25, 0x1, 0x56, 0xa, 0x3, 0xf7,
+ 0xb9, 0xf8, 0xf1, 0x15, 0xe4, 0x6, 0x46, 0xf7,
+ 0x25, 0x5, 0xfb, 0x30, 0x6, 0xfb, 0xf, 0xfc,
+ 0x7a, 0x23, 0xa, 0x47, 0xa, 0xf7, 0x77, 0xf8,
+ 0xf3, 0x15, 0xe2, 0x6, 0xf7, 0x1a, 0x75, 0xa,
+ 0xfb, 0x99, 0xfc, 0x7a, 0x23, 0xa, 0x47, 0xa,
+ 0xf7, 0x1e, 0xf8, 0xf3, 0x15, 0xf7, 0x5, 0x6,
+ 0xc0, 0xd2, 0xc5, 0x44, 0x5, 0xf7, 0x4, 0x6,
+ 0x25, 0x67, 0xa, 0xfb, 0x16, 0x6, 0xfb, 0x64,
+ 0xfc, 0x7a, 0x23, 0xa, 0x3e, 0xa, 0xe0, 0x64,
+ 0xa, 0x56, 0xa, 0x13, 0xd6, 0xf7, 0x1b, 0xf8,
+ 0xf8, 0x15, 0xca, 0x6a, 0xa, 0xa3, 0x1f, 0x13,
+ 0xe6, 0x80, 0xa4, 0xa3, 0x80, 0xaa, 0x1b, 0xe2,
+ 0x8b, 0xed, 0xa4, 0x1f, 0x4b, 0x7a, 0xa, 0x6e,
+ 0x69, 0x1b, 0x13, 0xce, 0x7f, 0x75, 0x96, 0x96,
+ 0x71, 0x1f, 0x95, 0x71, 0x6d, 0x95, 0x6b, 0x1b,
+ 0x49, 0x73, 0x5a, 0x40, 0x1f, 0x26, 0xfb, 0xf0,
+ 0x23, 0xa, 0x3e, 0xa, 0xe0, 0xf7, 0x7, 0x12,
+ 0xad, 0xf7, 0x23, 0x65, 0xf7, 0xc, 0xe9, 0xf7,
+ 0xc, 0x65, 0xf7, 0x23, 0x13, 0xec, 0xf7, 0x1f,
+ 0xf8, 0xfa, 0x4a, 0xa, 0xf7, 0x6a, 0xfb, 0x7,
+ 0x4a, 0xa, 0x13, 0xf2, 0xfb, 0xd3, 0xfc, 0x65,
+ 0x23, 0xa, 0x3c, 0x61, 0xf7, 0x1f, 0xe9, 0xf7,
+ 0x13, 0xe9, 0xf7, 0x1c, 0x1, 0xf7, 0x73, 0xf7,
+ 0x1e, 0x3, 0xb3, 0xf7, 0x53, 0x15, 0xf8, 0x8c,
+ 0xf7, 0x13, 0xfc, 0x8c, 0x6, 0xf7, 0x4b, 0xe9,
+ 0x15, 0xf7, 0x1e, 0xf7, 0x1c, 0xfb, 0x1e, 0x6,
+ 0xfc, 0xe2, 0x4, 0xf7, 0x1e, 0xf7, 0x1f, 0x81,
+ 0xa, 0x57, 0x83, 0x76, 0xa3, 0xf7, 0x6, 0xf7,
+ 0xd5, 0xf7, 0x6, 0x9b, 0x77, 0x12, 0xb2, 0xf7,
+ 0x26, 0xf7, 0x89, 0xf7, 0x24, 0x13, 0xdc, 0xab,
+ 0x9e, 0x15, 0xc4, 0x5b, 0xc4, 0xcb, 0x5, 0x71,
+ 0xbb, 0xc8, 0x7d, 0xbd, 0x1b, 0xf7, 0x41, 0xf7,
+ 0x3, 0xf7, 0x13, 0xf7, 0x28, 0xd4, 0x6d, 0xd0,
+ 0x68, 0xb4, 0x1f, 0xc5, 0xc9, 0x50, 0xb8, 0x54,
+ 0x4f, 0x5, 0x13, 0xec, 0x95, 0x7a, 0x55, 0xad,
+ 0x2f, 0x1b, 0xfb, 0x47, 0x23, 0xfb, 0x15, 0xfb,
+ 0x25, 0x41, 0x9e, 0x4e, 0xbc, 0x56, 0x1f, 0xeb,
+ 0xf7, 0x0, 0x15, 0x7b, 0xb1, 0x89, 0xac, 0x94,
+ 0x1a, 0xf7, 0x7, 0xd2, 0xb8, 0xcd, 0xb6, 0xa2,
+ 0x7c, 0x82, 0x96, 0x1e, 0xfb, 0x29, 0xfb, 0xa7,
+ 0x15, 0xf7, 0x56, 0xf7, 0x69, 0x5, 0x91, 0x7b,
+ 0x97, 0x6c, 0x70, 0x1a, 0x37, 0x5d, 0x3e, 0x2d,
+ 0x60, 0x7b, 0x99, 0x93, 0x7e, 0x1e, 0xe, 0x4e,
+ 0xa, 0xf8, 0x34, 0x89, 0x2a, 0xa, 0x13, 0x78,
+ 0xfb, 0xf, 0xf8, 0xa4, 0x15, 0xe3, 0x6, 0x46,
+ 0xf7, 0x25, 0x97, 0xa, 0xe, 0x4e, 0xa, 0xf7,
+ 0x7a, 0xf8, 0xf1, 0x15, 0xe3, 0x6, 0xf7, 0x1c,
+ 0xf7, 0x25, 0x97, 0xa, 0xf7, 0x9, 0xfd, 0x84,
+ 0x2a, 0xa, 0xe, 0x6c, 0xa, 0xf8, 0x97, 0xf7,
+ 0x23, 0x49, 0xa, 0x13, 0x78, 0xf7, 0x1d, 0xf8,
+ 0xf3, 0x15, 0xf7, 0x5, 0x6, 0xc1, 0xd2, 0xc5,
+ 0x44, 0x5, 0xf7, 0x4, 0x6, 0x24, 0x67, 0xa,
+ 0xfb, 0x15, 0x6, 0xf7, 0x42, 0xfd, 0x84, 0x2a,
+ 0xa, 0xe, 0x6c, 0xa, 0xf8, 0x9e, 0xf7, 0x7,
+ 0x12, 0xcd, 0xf7, 0x1f, 0x48, 0xf7, 0xc, 0xea,
+ 0xf7, 0xc, 0x48, 0xf7, 0x1f, 0x13, 0x6c, 0xf7,
+ 0x1e, 0xf8, 0xfa, 0x4a, 0xa, 0xf7, 0x6b, 0xfb,
+ 0x7, 0x4a, 0xa, 0xca, 0xfd, 0x6f, 0x15, 0x13,
+ 0x72, 0x2c, 0xa, 0x13, 0xac, 0x36, 0xa, 0xe,
+ 0x20, 0xfb, 0x55, 0x76, 0xf9, 0xc8, 0xf7, 0x24,
+ 0x1, 0xb6, 0x28, 0x15, 0x97, 0x20, 0x52, 0xa,
+ 0xf5, 0xf7, 0xf, 0xc8, 0x1f, 0xf7, 0x4a, 0xf8,
+ 0x89, 0x78, 0xa, 0xfc, 0x5, 0x6e, 0xa, 0xfb,
+ 0xe, 0xf8, 0x5, 0x40, 0xa, 0xf7, 0x58, 0xfc,
+ 0x9d, 0x5, 0x2b, 0x48, 0xa, 0xf7, 0x35, 0xf9,
+ 0x55, 0x15, 0xe1, 0x6, 0xf7, 0x19, 0xf7, 0x24,
+ 0x5, 0xfb, 0x2c, 0x6, 0xe, 0x57, 0xfb, 0x4f,
+ 0x76, 0xf7, 0x50, 0xf7, 0x3, 0xf7, 0xe2, 0xf6,
+ 0xf7, 0x4e, 0x77, 0x1, 0xc9, 0xf7, 0x20, 0xf7,
+ 0x7c, 0xf7, 0x24, 0x3, 0xf7, 0x5e, 0xc5, 0x15,
+ 0x6c, 0xa7, 0xb8, 0x5c, 0xdd, 0x1b, 0xf7, 0x10,
+ 0xec, 0xef, 0xf7, 0x43, 0xf7, 0x49, 0x21, 0xeb,
+ 0xfb, 0x7, 0x39, 0x64, 0x64, 0x69, 0x69, 0x1f,
+ 0xf7, 0x97, 0xfb, 0x20, 0xfe, 0x32, 0xf7, 0x20,
+ 0x7, 0x8a, 0xf8, 0x63, 0x15, 0xf6, 0xbf, 0xca,
+ 0xcc, 0xf2, 0x98, 0xfb, 0x3, 0x50, 0xfb, 0x16,
+ 0x4c, 0x69, 0x5b, 0x36, 0x66, 0xd1, 0xe9, 0x1e,
+ 0xe, 0x20, 0xfb, 0x55, 0x76, 0xf9, 0xcf, 0xf7,
+ 0x8, 0x1, 0xf7, 0x6, 0xf7, 0x9, 0xe8, 0xf7,
+ 0x9, 0x3, 0xf7, 0x6, 0xf8, 0xf9, 0x88, 0xa,
+ 0xf7, 0x66, 0xfb, 0x8, 0x88, 0xa, 0xfb, 0xad,
+ 0xfd, 0xcf, 0x15, 0x97, 0xfb, 0x0, 0x52, 0xa,
+ 0xf6, 0xf7, 0x10, 0xc8, 0x1f, 0xf7, 0x4a, 0xf8,
+ 0x8d, 0x78, 0xa, 0xfc, 0x8, 0x6e, 0xa, 0xfb,
+ 0xe, 0xf8, 0x8, 0x40, 0xa, 0xf7, 0x58, 0xfc,
+ 0xa1, 0x5, 0x2a, 0x48, 0xa, 0xe, 0x76, 0xa0,
+ 0xf8, 0x9f, 0x9a, 0xf7, 0x48, 0x9e, 0x6, 0xfb,
+ 0x70, 0x98, 0x7, 0x1e, 0xa0, 0x39, 0x63, 0xff,
+ 0xc, 0x9, 0xf7, 0x11, 0xa, 0xf7, 0x20, 0xb,
+ 0xf7, 0x0, 0x9c, 0xc, 0xc, 0x8c, 0xc, 0xe,
+ 0xf7, 0xe1, 0x14, 0xf9, 0x2b, 0x15, 0xb5, 0x13,
+ 0x0, 0x79, 0x2, 0x0, 0x1, 0x0, 0x23, 0x0,
+ 0x28, 0x0, 0x30, 0x0, 0x65, 0x0, 0x6a, 0x0,
+ 0xaa, 0x0, 0xca, 0x0, 0xed, 0x0, 0xf1, 0x1,
+ 0x19, 0x1, 0x21, 0x1, 0x3e, 0x1, 0x5b, 0x1,
+ 0x69, 0x1, 0x81, 0x1, 0x87, 0x1, 0x93, 0x1,
+ 0xc7, 0x1, 0xcb, 0x1, 0xda, 0x1, 0xe3, 0x1,
+ 0xed, 0x1, 0xfc, 0x2, 0x5, 0x2, 0xe, 0x2,
+ 0x18, 0x2, 0x25, 0x2, 0x2e, 0x2, 0x39, 0x2,
+ 0x44, 0x2, 0x4d, 0x2, 0x52, 0x2, 0x57, 0x2,
+ 0x60, 0x2, 0x6a, 0x2, 0x74, 0x2, 0x7f, 0x2,
+ 0x86, 0x2, 0x8f, 0x2, 0x99, 0x2, 0xa5, 0x2,
+ 0xae, 0x2, 0xb7, 0x2, 0xc0, 0x2, 0xc5, 0x2,
+ 0xca, 0x2, 0xd5, 0x2, 0xe8, 0x2, 0xfb, 0x3,
+ 0x4, 0x3, 0xf, 0x3, 0x21, 0x3, 0x2c, 0x3,
+ 0x34, 0x3, 0x3c, 0x3, 0x4d, 0x3, 0x5e, 0x3,
+ 0x65, 0x3, 0x75, 0x3, 0x85, 0x3, 0x94, 0x3,
+ 0x9b, 0x3, 0xa2, 0x3, 0xa8, 0x3, 0xb6, 0x3,
+ 0xbf, 0x3, 0xca, 0x3, 0xd1, 0x3, 0xd9, 0x3,
+ 0xde, 0x3, 0xe3, 0x3, 0xe7, 0x3, 0xeb, 0x3,
+ 0xef, 0x3, 0xf9, 0x4, 0x4, 0x4, 0xa, 0x4,
+ 0xd, 0x4, 0x11, 0x4, 0x1c, 0x4, 0x27, 0x4,
+ 0x32, 0x4, 0x3d, 0x4, 0x44, 0x4, 0x4b, 0x4,
+ 0x51, 0x4, 0x58, 0x4, 0x5f, 0x4, 0x66, 0x4,
+ 0x6b, 0x4, 0x70, 0x4, 0x74, 0x4, 0x78, 0x4,
+ 0x7c, 0x4, 0x85, 0x4, 0x8f, 0x4, 0x97, 0x4,
+ 0x9b, 0x4, 0x9f, 0x4, 0xa3, 0x4, 0xa7, 0x4,
+ 0xab, 0x4, 0xb4, 0x4, 0xbd, 0x4, 0xc6, 0x4,
+ 0xcf, 0x4, 0xd8, 0x4, 0xe1, 0x4, 0xea, 0x4,
+ 0xf3, 0x4, 0xfc, 0x5, 0x5, 0x5, 0xe, 0x5,
+ 0x17, 0x5, 0x20, 0x5, 0x27, 0x5, 0x2c, 0x5,
+ 0x32, 0x5, 0x37, 0x5, 0x3c, 0x5, 0x41, 0x77,
+ 0xb8, 0x83, 0xa2, 0x38, 0xa, 0xac, 0x1a, 0xeb,
+ 0x80, 0xf4, 0xfb, 0x73, 0xfb, 0x32, 0x65, 0x49,
+ 0x35, 0x73, 0x1e, 0xf7, 0x13, 0x74, 0x5, 0xa5,
+ 0x2d, 0xa, 0x80, 0x6e, 0x82, 0x3c, 0x7d, 0x8,
+ 0xb, 0x30, 0xa, 0x20, 0xa, 0xb, 0xfd, 0x49,
+ 0x24, 0xa, 0x13, 0xbc, 0x26, 0xa, 0x15, 0xfb,
+ 0x84, 0xf7, 0x50, 0x65, 0xde, 0xf7, 0x3e, 0xf2,
+ 0xf7, 0x1b, 0xf7, 0x23, 0xf7, 0x18, 0x32, 0xf7,
+ 0x19, 0xfb, 0x4c, 0xfb, 0x4f, 0x37, 0xfb, 0x21,
+ 0xfb, 0x10, 0x1e, 0xf7, 0x23, 0x16, 0xf7, 0x2,
+ 0xc8, 0xb6, 0xce, 0xd3, 0xc5, 0x5b, 0x22, 0xfb,
+ 0x7, 0x49, 0x58, 0x4b, 0x49, 0x4d, 0xc3, 0xf7,
+ 0x2, 0x1e, 0xe, 0x21, 0xa, 0x3b, 0xa, 0xb,
+ 0x15, 0xf7, 0xfb, 0x6, 0xf7, 0x34, 0x5a, 0xf7,
+ 0x31, 0xfb, 0x60, 0xfb, 0x3f, 0x3a, 0xfb, 0x1d,
+ 0xfb, 0x23, 0xfb, 0x42, 0xf7, 0x20, 0x26, 0xf7,
+ 0xe, 0xf7, 0x47, 0xb8, 0xf7, 0x11, 0xac, 0x97,
+ 0x1e, 0xfb, 0x23, 0xa2, 0x5, 0x73, 0x83, 0x79,
+ 0x5a, 0x48, 0x1b, 0x3a, 0x6a, 0xcd, 0xcb, 0x89,
+ 0x1f, 0x8e, 0xe1, 0x15, 0xd1, 0x8a, 0xb0, 0xc1,
+ 0xce, 0x1b, 0xda, 0xab, 0x55, 0x45, 0x1f, 0xe,
+ 0x2e, 0xd1, 0x45, 0x37, 0xa, 0xf7, 0x59, 0x15,
+ 0x70, 0x7, 0x3d, 0x72, 0x4c, 0x34, 0x55, 0x73,
+ 0xac, 0xa9, 0xbc, 0xc4, 0xa4, 0xa4, 0x90, 0x1e,
+ 0xa9, 0x92, 0xc8, 0x95, 0x9c, 0x94, 0x8, 0xe,
+ 0xf7, 0x26, 0x6, 0xc3, 0xf7, 0x3b, 0x5, 0xf7,
+ 0xa3, 0x6, 0xc6, 0xfb, 0x3b, 0x5, 0xf7, 0x2a,
+ 0x6, 0xfb, 0xa4, 0xf9, 0x74, 0x40, 0xa, 0x76,
+ 0xfc, 0x51, 0x15, 0xe7, 0xf7, 0xa5, 0xe9, 0xfb,
+ 0xa5, 0x5, 0xb, 0x15, 0x27, 0xa, 0xe, 0x15,
+ 0xfb, 0x3a, 0xd8, 0xfb, 0x61, 0xf7, 0xa0, 0xf7,
+ 0x8d, 0xeb, 0xf7, 0x4b, 0xf7, 0x50, 0xf7, 0x65,
+ 0x3d, 0xa, 0xfb, 0x22, 0xfb, 0x79, 0x1e, 0xf7,
+ 0x28, 0x16, 0xf4, 0xac, 0xf7, 0x21, 0xf7, 0x38,
+ 0xf7, 0x43, 0xa1, 0xfb, 0x39, 0x3a, 0xb, 0x15,
+ 0x2c, 0xa, 0x13, 0xb8, 0x36, 0xa, 0xb, 0xf7,
+ 0x3, 0xf7, 0x80, 0x1e, 0xf8, 0x16, 0xfb, 0x26,
+ 0xfc, 0x16, 0x7, 0xfb, 0xf, 0x8b, 0x28, 0xfb,
+ 0x20, 0xfb, 0x1a, 0x7e, 0xe4, 0xf7, 0x19, 0x1e,
+ 0xf8, 0x16, 0x7, 0xb, 0xf7, 0x15, 0xf8, 0x9e,
+ 0xfb, 0x1f, 0xfb, 0x67, 0x6, 0xfb, 0x15, 0x8d,
+ 0x33, 0xfb, 0x7, 0x2a, 0x94, 0xe1, 0xf7, 0x17,
+ 0x1e, 0xf7, 0x67, 0xfb, 0x1f, 0xfb, 0xdd, 0x7,
+ 0xb, 0x95, 0x99, 0xb4, 0xd0, 0x1b, 0xeb, 0x8b,
+ 0x5d, 0x68, 0x1f, 0x82, 0x7, 0x6f, 0xb, 0xf8,
+ 0xb5, 0xf7, 0x11, 0xfc, 0x25, 0xf7, 0x5c, 0xf7,
+ 0xfd, 0xf7, 0x11, 0xfb, 0xfd, 0xf7, 0x39, 0xf8,
+ 0x18, 0xf7, 0x11, 0xfc, 0xa8, 0x6, 0xb, 0xf7,
+ 0x79, 0xc4, 0x2b, 0xa, 0xe, 0x15, 0x98, 0x5f,
+ 0x8e, 0x84, 0x8e, 0x83, 0x8, 0xf7, 0x1e, 0x6,
+ 0xb, 0xfc, 0xdc, 0x15, 0xfb, 0x39, 0xd8, 0xfb,
+ 0x62, 0xf7, 0xa0, 0xf7, 0x8d, 0xeb, 0xf7, 0x4c,
+ 0xf7, 0x4f, 0xf7, 0x66, 0xfb, 0x5, 0xf7, 0x35,
+ 0xfb, 0x7c, 0xfb, 0x72, 0xfb, 0xf, 0xfb, 0x21,
+ 0xfb, 0x7a, 0x1e, 0xf7, 0x28, 0x16, 0xf4, 0xac,
+ 0xf7, 0x22, 0xf7, 0x38, 0xf7, 0x43, 0xa1, 0xfb,
+ 0x3a, 0x3a, 0xfb, 0x14, 0xb, 0x3b, 0xa, 0x26,
+ 0xa, 0x3a, 0xa, 0xbb, 0xf7, 0x28, 0x1, 0xd7,
+ 0xf7, 0x24, 0x3, 0xd7, 0x16, 0x2e, 0xa, 0xb,
+ 0x5e, 0xa, 0xa4, 0xfb, 0x48, 0xf7, 0xa0, 0x2f,
+ 0xa, 0x69, 0xa, 0xf7, 0x3b, 0xf7, 0x10, 0xf8,
+ 0x51, 0x77, 0xb, 0xfb, 0x8, 0xba, 0x32, 0xf7,
+ 0x14, 0xcf, 0xce, 0xac, 0xc5, 0xb1, 0x1e, 0x8d,
+ 0x6, 0xb, 0xf5, 0xe1, 0xbf, 0xb6, 0xa7, 0xa6,
+ 0x1e, 0x80, 0xb, 0x88, 0xd1, 0x8, 0x8a, 0xa9,
+ 0x8d, 0xf7, 0x24, 0xb, 0x20, 0x7d, 0xef, 0x48,
+ 0x76, 0xf8, 0x4a, 0xf7, 0x0, 0xb, 0x8f, 0x8b,
+ 0xf7, 0x11, 0xf7, 0x5c, 0xf7, 0x11, 0xf7, 0x39,
+ 0xf7, 0x11, 0xb, 0x41, 0x7d, 0xfb, 0xc, 0x78,
+ 0xfb, 0x16, 0x1a, 0xb, 0x20, 0x7d, 0xf7, 0x0,
+ 0xf7, 0x16, 0xe1, 0xf7, 0x10, 0xf6, 0xb, 0xfb,
+ 0x5, 0xf7, 0x36, 0xfb, 0x7c, 0xfb, 0x72, 0xfb,
+ 0xf, 0xb, 0x57, 0x7d, 0xf7, 0x4, 0xf7, 0xd3,
+ 0xf7, 0x4, 0xb, 0xa0, 0x76, 0x4d, 0xa, 0xb,
+ 0x5, 0xfb, 0x25, 0x6, 0xb, 0xfb, 0x2c, 0x5e,
+ 0xf7, 0x5, 0xf7, 0x1a, 0x1e, 0xe, 0x1, 0xd3,
+ 0xf7, 0x26, 0xf7, 0xb3, 0xf7, 0x26, 0x3, 0xb,
+ 0x1, 0xa2, 0xf7, 0x29, 0xf7, 0x6a, 0xf7, 0x22,
+ 0x3, 0xb, 0xf8, 0xfa, 0x4b, 0xa, 0xf7, 0x62,
+ 0xfb, 0x7, 0x4b, 0xa, 0xb, 0xb4, 0x8b, 0xde,
+ 0xc5, 0x1a, 0xe6, 0xb, 0xfe, 0x3c, 0x15, 0xf7,
+ 0x20, 0xf9, 0x60, 0x6d, 0xa, 0x3e, 0xa, 0xd9,
+ 0xf7, 0x23, 0x1, 0x56, 0xa, 0x3, 0xb, 0x70,
+ 0x5b, 0x87, 0x6c, 0x1b, 0x76, 0x7f, 0x8c, 0x90,
+ 0x73, 0x1f, 0xb, 0x12, 0xcd, 0xf7, 0x1f, 0xf7,
+ 0x5d, 0xf7, 0x1f, 0xb, 0x15, 0xf7, 0xc, 0xf7,
+ 0x7, 0xfb, 0xc, 0x6, 0xb, 0x15, 0xf7, 0x7,
+ 0xf7, 0x7, 0xfb, 0x7, 0x6, 0xb, 0xfc, 0x15,
+ 0xa0, 0x76, 0xb, 0xf9, 0x62, 0x77, 0x1, 0xb,
+ 0x6c, 0xa, 0xf8, 0x95, 0xf7, 0x25, 0x49, 0xa,
+ 0x13, 0x78, 0xb, 0x5, 0xfb, 0x32, 0x6, 0xfb,
+ 0x33, 0xfb, 0xae, 0xfb, 0x34, 0xf7, 0xae, 0x5,
+ 0xfb, 0x35, 0x6, 0xf7, 0x8e, 0xb, 0x15, 0xe3,
+ 0x6, 0xf7, 0x11, 0xf7, 0x5f, 0xfb, 0x11, 0xf7,
+ 0x61, 0x5, 0x33, 0x6, 0xf2, 0xfb, 0x61, 0x5,
+ 0xb, 0x66, 0xa, 0xf7, 0x52, 0xf7, 0x1d, 0x13,
+ 0x7c, 0xb, 0x5, 0x87, 0x9e, 0x82, 0x87, 0xae,
+ 0x1b, 0xf7, 0x41, 0xa2, 0xb, 0x15, 0xe3, 0x6,
+ 0x24, 0xf7, 0x64, 0xf2, 0xf7, 0x5c, 0x5, 0x33,
+ 0x6, 0xfb, 0x11, 0xfb, 0x5c, 0x5, 0xb, 0xc6,
+ 0x78, 0xf7, 0x11, 0xf9, 0x42, 0xf7, 0x24, 0x42,
+ 0xa, 0xb, 0xf7, 0x13, 0xf8, 0x9d, 0xfb, 0x13,
+ 0x6, 0xb, 0xad, 0xf7, 0x23, 0xf7, 0x96, 0xf7,
+ 0x23, 0xb, 0xf7, 0x66, 0xf7, 0x3d, 0xf7, 0x3d,
+ 0xf7, 0x65, 0xf7, 0x65, 0xfb, 0x3d, 0xf7, 0x3d,
+ 0xfb, 0x66, 0xb, 0xf7, 0x3c, 0xf7, 0x1c, 0xfb,
+ 0x1b, 0xfb, 0x3c, 0xfb, 0x3c, 0xfb, 0x1c, 0xfb,
+ 0x1b, 0xfb, 0x3c, 0xb, 0x5f, 0xa, 0xf8, 0x81,
+ 0xf7, 0x11, 0xb, 0x57, 0xfb, 0x4e, 0x76, 0xf7,
+ 0x54, 0xf7, 0x0, 0xf7, 0xe8, 0xf7, 0x5, 0x7f,
+ 0x77, 0x12, 0xb, 0xfb, 0xa6, 0xfb, 0x58, 0xf7,
+ 0x7, 0xf7, 0xb2, 0xf7, 0x8, 0xf7, 0xb2, 0xf7,
+ 0x7, 0x1, 0xb, 0x77, 0x1, 0xd0, 0xf7, 0x1e,
+ 0xf7, 0xc9, 0xf7, 0x1e, 0x3, 0xd0, 0x16, 0xf7,
+ 0x1e, 0xb, 0xec, 0x76, 0xf8, 0x2c, 0x77, 0x1,
+ 0xb, 0x15, 0xfc, 0x16, 0x7, 0xfb, 0x3b, 0xb,
+ 0xf7, 0x7, 0x78, 0xf7, 0x10, 0xb, 0x1, 0xd7,
+ 0xf7, 0x25, 0xf7, 0x94, 0xf7, 0x2a, 0x3, 0xd7,
+ 0x16, 0xf7, 0x25, 0xb, 0x45, 0xa, 0x7, 0x13,
+ 0xe8, 0xfb, 0x1a, 0x6, 0xb, 0x4c, 0xa, 0xf9,
+ 0x82, 0x77, 0x1, 0xd7, 0xf7, 0x13, 0x3, 0xb,
+ 0x7d, 0xa, 0xd0, 0x16, 0xf7, 0x20, 0xb, 0xf7,
+ 0xf, 0x39, 0xdd, 0x8a, 0x77, 0x12, 0xb, 0x6,
+ 0x97, 0x8c, 0x8b, 0xb, 0x12, 0xa8, 0xf7, 0x20,
+ 0xb, 0xf7, 0x23, 0x5, 0xb, 0xfb, 0x20, 0x6,
+ 0xb, 0xc6, 0xa0, 0x76, 0xb, 0x65, 0xa, 0xaa,
+ 0xac, 0x1b, 0xaa, 0xa2, 0x82, 0x81, 0xb, 0x15,
+ 0xe9, 0x6, 0xf7, 0x45, 0x83, 0xa, 0xfb, 0x39,
+ 0x6, 0xb, 0x57, 0x7d, 0xf5, 0x2d, 0xe9, 0xb,
+ 0x68, 0xa, 0xe, 0x5, 0x89, 0x6, 0xb, 0x75,
+ 0xfb, 0x1, 0x26, 0x1f, 0x3e, 0xfb, 0x1, 0xd8,
+ 0x6, 0xb, 0xf7, 0x9d, 0x16, 0xf7, 0x1d, 0xf7,
+ 0xc0, 0x6, 0xf7, 0x8f, 0xb, 0xfb, 0x10, 0x7a,
+ 0xfb, 0x3, 0x52, 0x1e, 0xeb, 0x16, 0xcc, 0xb,
+ 0xa7, 0xf7, 0x55, 0x84, 0xda, 0x1b, 0xf7, 0xd,
+ 0xf7, 0x3d, 0xb, 0xa0, 0x76, 0xf8, 0xa8, 0x77,
+ 0x1, 0xb, 0xf7, 0x44, 0xf7, 0x7, 0xfb, 0x44,
+ 0xb, 0x67, 0xa, 0xfb, 0x2d, 0x6, 0xb, 0xa0,
+ 0x76, 0xf8, 0x2c, 0xf7, 0x1, 0xb, 0x5, 0xf7,
+ 0x9, 0x6, 0xfb, 0x0, 0xb, 0x5, 0xfb, 0x21,
+ 0x6, 0xfb, 0xb, 0xb, 0x20, 0x78, 0xf7, 0x6,
+ 0xb, 0x6, 0x7d, 0x89, 0x87, 0xb, 0x82, 0xa,
+ 0xd7, 0xb, 0xfb, 0x4, 0x6, 0xb, 0xf7, 0x20,
+ 0x3, 0xb, 0x1, 0xcb, 0xf7, 0x28, 0xf7, 0xfc,
+ 0x85, 0xa, 0xb, 0xfb, 0x58, 0xf7, 0x0, 0xf9,
+ 0x52, 0xf7, 0x0, 0x1, 0xb, 0xfb, 0x3e, 0xfb,
+ 0x3d, 0xfb, 0x65, 0x1e, 0xe, 0xfb, 0x1e, 0x6,
+ 0xe, 0xf7, 0xd, 0x1, 0xb, 0xf7, 0x26, 0x5,
+ 0xb, 0xf7, 0x26, 0x1, 0xb, 0xf7, 0x28, 0x3,
+ 0xb, 0x57, 0x8b, 0xf7, 0xe, 0xf8, 0xe8, 0x77,
+ 0x1, 0xb, 0xfc, 0x1d, 0x6, 0xf8, 0xf, 0xf8,
+ 0x76, 0x5, 0xb, 0x15, 0xf7, 0x9, 0xf7, 0x8,
+ 0xfb, 0x9, 0x6, 0xb, 0xb8, 0x6c, 0x1f, 0x7c,
+ 0xa2, 0x81, 0xa6, 0x84, 0xb, 0x15, 0xf7, 0xd,
+ 0xf7, 0xa, 0xfb, 0xd, 0x6, 0xb, 0x15, 0xf7,
+ 0x5, 0xf7, 0x9, 0xfb, 0x5, 0x6, 0xb, 0xf7,
+ 0xd6, 0x7, 0xfb, 0xff, 0xfc, 0x65, 0x5, 0xb,
+ 0x15, 0xf7, 0xa, 0xf7, 0x9, 0xfb, 0xa, 0x6,
+ 0xb, 0x15, 0xf7, 0xa, 0xf7, 0xb, 0xfb, 0xa,
+ 0x6, 0xb, 0x15, 0xf7, 0xb, 0xf7, 0x9, 0xfb,
+ 0xb, 0x6, 0xb, 0x77, 0x1, 0xf7, 0x78, 0xf7,
+ 0x13, 0x3, 0xb3, 0xb, 0x3c, 0x98, 0x76, 0xf8,
+ 0x9e, 0x77, 0x1, 0xb1, 0xb, 0x15, 0xf7, 0x7,
+ 0xf7, 0x8, 0xfb, 0x7, 0x6, 0xb, 0xf9, 0x88,
+ 0x5, 0xfb, 0x13, 0x6, 0xe, 0x1, 0xd0, 0x7d,
+ 0xa, 0xb, 0x15, 0xf7, 0xa, 0x6, 0xc4, 0xb,
+ 0x5, 0xfb, 0x31, 0x6, 0xb, 0x5, 0xfb, 0x2f,
+ 0x6, 0xb, 0x89, 0x42, 0x5a, 0x7f, 0xb
+ };
diff --git a/core/src/fxge/fontdata/chromefontdata/FoxitSansBoldItalic.c b/core/src/fxge/fontdata/chromefontdata/FoxitSansBoldItalic.c
new file mode 100644
index 0000000000..0555165be3
--- /dev/null
+++ b/core/src/fxge/fontdata/chromefontdata/FoxitSansBoldItalic.c
@@ -0,0 +1,2061 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+const unsigned char g_FoxitSansBoldItalicFontData [16418] = {0x1,
+ 0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0x17,
+ 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x53, 0x61, 0x6e,
+ 0x73, 0x50, 0x53, 0x2d, 0x42, 0x6f, 0x6c, 0x64,
+ 0x49, 0x74, 0x61, 0x6c, 0x69, 0x63, 0x0, 0x1,
+ 0x1, 0x1, 0x27, 0xf8, 0x10, 0x0, 0xf8, 0x1c,
+ 0x1, 0xf8, 0x1d, 0x2, 0xf8, 0x1e, 0x3, 0xf8,
+ 0x14, 0x4, 0x7f, 0xc, 0x2, 0xfb, 0x42, 0xfb,
+ 0x78, 0xfa, 0xee, 0xfa, 0x56, 0x5, 0xf7, 0x3c,
+ 0xf, 0xf8, 0x9c, 0x11, 0xb1, 0x1c, 0x39, 0xfc,
+ 0x12, 0x0, 0x4, 0x1, 0x1, 0x5, 0x2f, 0x48,
+ 0x55, 0x45, 0x75, 0x72, 0x6f, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x43,
+ 0x68, 0x72, 0x6f, 0x6d, 0x20, 0x53, 0x61, 0x6e,
+ 0x73, 0x20, 0x50, 0x53, 0x20, 0x42, 0x6f, 0x6c,
+ 0x64, 0x20, 0x49, 0x74, 0x61, 0x6c, 0x69, 0x63,
+ 0x43, 0x68, 0x72, 0x6F, 0x6D, 0x20, 0x53, 0x61,
+ 0x6e, 0x73, 0x20, 0x50, 0x53, 0x0, 0x0, 0x1,
+ 0x0, 0x1, 0x0, 0x0, 0x81, 0x1, 0x0, 0x84,
+ 0x0, 0x0, 0x86, 0x2, 0x0, 0x91, 0x0, 0x0,
+ 0x63, 0x0, 0x0, 0x6d, 0x1, 0x0, 0x8c, 0x0,
+ 0x0, 0x92, 0x0, 0x0, 0xc7, 0x0, 0x0, 0xe4,
+ 0x0, 0x0, 0x2, 0x5, 0x0, 0x68, 0x0, 0x0,
+ 0x9, 0x37, 0x0, 0x7c, 0x0, 0x0, 0x42, 0x1d,
+ 0x1, 0x87, 0x0, 0x0, 0x75, 0x0, 0x0, 0x65,
+ 0x0, 0x0, 0x76, 0x0, 0x0, 0x79, 0x0, 0x0,
+ 0x70, 0x1, 0x0, 0x7e, 0x0, 0x0, 0x7a, 0x0,
+ 0x0, 0xc0, 0x0, 0x0, 0x6b, 0x0, 0x0, 0x8e,
+ 0x0, 0x0, 0x41, 0x0, 0x0, 0x8, 0x0, 0x0,
+ 0x69, 0x0, 0x0, 0x77, 0x0, 0x0, 0x74, 0x0,
+ 0x0, 0x6f, 0x0, 0x0, 0x89, 0x0, 0x0, 0x7f,
+ 0x0, 0x0, 0x99, 0x0, 0x0, 0xdd, 0x0, 0x0,
+ 0x6c, 0x0, 0x0, 0x94, 0x0, 0x0, 0xc6, 0x0,
+ 0x0, 0x60, 0x2, 0x0, 0x67, 0x0, 0x0, 0x64,
+ 0x0, 0x0, 0xa0, 0x0, 0x0, 0x66, 0x0, 0x0,
+ 0x83, 0x0, 0x0, 0xaa, 0x0, 0x0, 0x8b, 0x0,
+ 0x0, 0x6a, 0x0, 0x0, 0x97, 0x0, 0x0, 0xa6,
+ 0x0, 0x0, 0xa5, 0x0, 0x0, 0x80, 0x0, 0x0,
+ 0xa1, 0x0, 0x0, 0x9c, 0x0, 0x0, 0xa4, 0x0,
+ 0x0, 0xa9, 0x0, 0x0, 0x7d, 0x0, 0x0, 0x98,
+ 0x0, 0x0, 0x73, 0x0, 0x0, 0x72, 0x0, 0x0,
+ 0x85, 0x0, 0x0, 0x96, 0x0, 0x0, 0x8f, 0x0,
+ 0x0, 0x78, 0x0, 0x0, 0x9e, 0x0, 0x0, 0x9b,
+ 0x0, 0x0, 0xa3, 0x0, 0x0, 0x7b, 0x0, 0x0,
+ 0xae, 0x0, 0x0, 0xab, 0x1, 0x0, 0xb0, 0x0,
+ 0x0, 0xad, 0x0, 0x0, 0xaf, 0x0, 0x0, 0x8a,
+ 0x0, 0x0, 0xb1, 0x0, 0x0, 0xb5, 0x0, 0x0,
+ 0xb2, 0x2, 0x0, 0xb9, 0x0, 0x0, 0xb6, 0x2,
+ 0x0, 0x9a, 0x0, 0x0, 0xba, 0x0, 0x0, 0xbe,
+ 0x0, 0x0, 0xbb, 0x1, 0x0, 0xbf, 0x0, 0x0,
+ 0xbd, 0x0, 0x0, 0xa8, 0x0, 0x0, 0x8d, 0x0,
+ 0x0, 0xc4, 0x0, 0x0, 0xc1, 0x2, 0x0, 0xc5,
+ 0x0, 0x0, 0x9d, 0x0, 0x0, 0x95, 0x0, 0x0,
+ 0xcb, 0x0, 0x0, 0xc8, 0x1, 0x0, 0xcd, 0x0,
+ 0x0, 0xca, 0x0, 0x0, 0xcc, 0x0, 0x0, 0x90,
+ 0x0, 0x0, 0xce, 0x0, 0x0, 0xd2, 0x0, 0x0,
+ 0xcf, 0x2, 0x0, 0xd6, 0x0, 0x0, 0xd3, 0x2,
+ 0x0, 0xa7, 0x0, 0x0, 0xd7, 0x0, 0x0, 0xdb,
+ 0x0, 0x0, 0xd8, 0x1, 0x0, 0xdc, 0x0, 0x0,
+ 0xda, 0x0, 0x0, 0x9f, 0x0, 0x0, 0x93, 0x0,
+ 0x0, 0xe1, 0x0, 0x0, 0xde, 0x2, 0x0, 0xe2,
+ 0x0, 0x0, 0xa2, 0x0, 0x0, 0xe3, 0x0, 0x0,
+ 0xe6, 0x2, 0x0, 0x1, 0x0, 0x4, 0x0, 0x7,
+ 0x0, 0x37, 0x0, 0x4c, 0x0, 0x76, 0x0, 0x89,
+ 0x0, 0xb9, 0x0, 0xcf, 0x0, 0xde, 0x0, 0xf6,
+ 0x1, 0x48, 0x1, 0x94, 0x1, 0xbc, 0x1, 0xe0,
+ 0x2, 0x2b, 0x2, 0x70, 0x2, 0x99, 0x2, 0xd3,
+ 0x3, 0x39, 0x3, 0xc9, 0x4, 0x5a, 0x5, 0x4,
+ 0x5, 0x21, 0x5, 0x5f, 0x5, 0x97, 0x5, 0xcc,
+ 0x5, 0xf3, 0x6, 0x1a, 0x6, 0x2e, 0x6, 0x40,
+ 0x6, 0x55, 0x6, 0x9e, 0x6, 0xca, 0x7, 0x1f,
+ 0x7, 0x83, 0x7, 0xc5, 0x8, 0x25, 0x8, 0x90,
+ 0x8, 0xc1, 0x9, 0x35, 0x9, 0x9f, 0x9, 0xc2,
+ 0x9, 0xfa, 0xa, 0x1f, 0xa, 0x3f, 0xa, 0x62,
+ 0xa, 0xb7, 0xb, 0x65, 0xb, 0x96, 0xb, 0xef,
+ 0xc, 0x39, 0xc, 0x6b, 0xc, 0x97, 0xc, 0xba,
+ 0xd, 0x1a, 0xd, 0x48, 0xd, 0x58, 0xd, 0x89,
+ 0xd, 0xb7, 0xd, 0xc9, 0xe, 0x7, 0xe, 0x2d,
+ 0xe, 0x7c, 0xe, 0xb8, 0xf, 0x2d, 0xf, 0x8a,
+ 0xf, 0xe6, 0x10, 0xa, 0x10, 0x59, 0x10, 0x74,
+ 0x10, 0xb2, 0x10, 0xe1, 0x11, 0x3, 0x11, 0x31,
+ 0x11, 0x53, 0x11, 0x6c, 0x11, 0x8d, 0x11, 0xae,
+ 0x11, 0xbc, 0x11, 0xcb, 0x12, 0x1d, 0x12, 0x7d,
+ 0x12, 0xc7, 0x13, 0x21, 0x13, 0x73, 0x13, 0xb1,
+ 0x14, 0x1c, 0x14, 0x64, 0x14, 0x82, 0x14, 0xc6,
+ 0x14, 0xf2, 0x14, 0xfe, 0x15, 0x65, 0x15, 0xaf,
+ 0x15, 0xc9, 0x16, 0x24, 0x16, 0x80, 0x16, 0xbf,
+ 0x17, 0x16, 0x17, 0x5a, 0x17, 0xa8, 0x17, 0xc5,
+ 0x18, 0x1, 0x18, 0x2f, 0x18, 0x6b, 0x18, 0x98,
+ 0x18, 0xeb, 0x19, 0x4, 0x19, 0x5b, 0x19, 0xa1,
+ 0x1a, 0x1c, 0x1a, 0x3e, 0x1a, 0x9e, 0x1a, 0xbd,
+ 0x1a, 0xd7, 0x1b, 0xe, 0x1b, 0x58, 0x1b, 0x6c,
+ 0x1c, 0xa, 0x1c, 0x8f, 0x1c, 0xa7, 0x1d, 0x32,
+ 0x1d, 0x5a, 0x1d, 0x7d, 0x1d, 0xc5, 0x1d, 0xe8,
+ 0x1e, 0x7, 0x1e, 0x11, 0x1e, 0x1c, 0x1e, 0x68,
+ 0x1e, 0xb8, 0x1f, 0x2e, 0x1f, 0x44, 0x1f, 0xdc,
+ 0x20, 0x1b, 0x20, 0x48, 0x20, 0xbc, 0x21, 0x52,
+ 0x21, 0xd7, 0x22, 0x2d, 0x22, 0x4d, 0x22, 0xf6,
+ 0x23, 0x8, 0x23, 0x98, 0x24, 0x2, 0x24, 0x10,
+ 0x24, 0x25, 0x24, 0x37, 0x24, 0xd9, 0x24, 0xf1,
+ 0x25, 0x25, 0x25, 0x56, 0x25, 0x9c, 0x25, 0xf2,
+ 0x26, 0x2, 0x26, 0x4a, 0x26, 0x78, 0x26, 0x8a,
+ 0x26, 0xbd, 0x26, 0xe2, 0x27, 0x26, 0x27, 0x33,
+ 0x27, 0x93, 0x28, 0x10, 0x28, 0xaa, 0x29, 0x0,
+ 0x29, 0x18, 0x29, 0x33, 0x29, 0x53, 0x29, 0x9e,
+ 0x29, 0xc2, 0x29, 0xf9, 0x2a, 0x49, 0x2a, 0xd8,
+ 0x2a, 0xed, 0x2b, 0x4, 0x2b, 0x24, 0x2b, 0x49,
+ 0x2b, 0x6d, 0x2b, 0x84, 0x2b, 0xa5, 0x2b, 0xbf,
+ 0x2c, 0xc, 0x2c, 0x66, 0x2c, 0x72, 0x2c, 0x8e,
+ 0x2c, 0xa8, 0x2c, 0xed, 0x2d, 0x13, 0x2d, 0x46,
+ 0x2d, 0xbd, 0x2d, 0xca, 0x2d, 0xd0, 0x2d, 0xde,
+ 0x2d, 0xee, 0x2e, 0x1e, 0x2e, 0x6a, 0x2e, 0xe8,
+ 0x2f, 0x5, 0x2f, 0x2a, 0x2f, 0x4f, 0x2f, 0xa2,
+ 0x2f, 0xc2, 0x30, 0x5b, 0x31, 0x8, 0x31, 0x8e,
+ 0x31, 0xb1, 0x31, 0xd6, 0x31, 0xfb, 0x32, 0x29,
+ 0x32, 0x3f, 0x32, 0x5b, 0x32, 0x7d, 0x32, 0x9e,
+ 0x33, 0x1a, 0x33, 0xac, 0x33, 0xbf, 0x33, 0xe4,
+ 0x34, 0x1, 0x34, 0x52, 0x34, 0x77, 0x34, 0xa3,
+ 0x35, 0x1d, 0x35, 0x2b, 0x35, 0x37, 0x35, 0x45,
+ 0x35, 0x58, 0x35, 0x94, 0x35, 0xed, 0x36, 0x24,
+ 0xfb, 0xf9, 0xe, 0xfb, 0xf9, 0xe, 0xf8, 0xf0,
+ 0xd4, 0x42, 0xf7, 0x26, 0x12, 0x13, 0x40, 0xf7,
+ 0x30, 0xf9, 0x82, 0x15, 0x49, 0x94, 0xae, 0x3b,
+ 0xf7, 0x4, 0x1b, 0xf7, 0x11, 0xb9, 0xf7, 0x4,
+ 0xad, 0x96, 0x1f, 0x43, 0x6, 0x13, 0x80, 0x75,
+ 0x80, 0x6c, 0x58, 0x4b, 0x1b, 0x13, 0x40, 0x55,
+ 0x76, 0xad, 0xb2, 0x81, 0x1f, 0xe, 0xf8, 0xfa,
+ 0xf7, 0x7, 0x1, 0xf7, 0x7f, 0xf8, 0xfa, 0x15,
+ 0xf7, 0x10, 0x6, 0xa5, 0xf7, 0x7, 0x5, 0xfb,
+ 0x10, 0x6, 0xe, 0xf7, 0x5c, 0xf9, 0x36, 0x15,
+ 0x51, 0xbd, 0x5b, 0xc8, 0xc5, 0xbe, 0xb9, 0xc7,
+ 0xc7, 0x59, 0xb5, 0x50, 0x4c, 0x5b, 0x60, 0x50,
+ 0x1e, 0xc7, 0x16, 0xa5, 0xa1, 0x9d, 0xa8, 0xa5,
+ 0xa2, 0x7a, 0x70, 0x70, 0x74, 0x76, 0x71, 0x6f,
+ 0x74, 0xa0, 0xa6, 0x1e, 0xe, 0x72, 0xa, 0xf7,
+ 0x1d, 0xf8, 0xf0, 0x15, 0xf3, 0x52, 0xa, 0xf7,
+ 0x6, 0xfb, 0x26, 0x15, 0xf3, 0x52, 0xa, 0xe,
+ 0xfb, 0x78, 0xd9, 0xf7, 0x2a, 0x77, 0x1, 0xb4,
+ 0xdc, 0x3, 0xd6, 0x16, 0x83, 0x7a, 0x71, 0x4f,
+ 0x54, 0x1a, 0x46, 0xb1, 0x70, 0xc3, 0xaf, 0xbe,
+ 0x9b, 0x9b, 0xa6, 0x1e, 0x9a, 0xcd, 0x5, 0x89,
+ 0x86, 0x55, 0x79, 0x6a, 0x1b, 0x76, 0x6e, 0x95,
+ 0xb2, 0x9b, 0x8f, 0xaa, 0xa2, 0xc1, 0x1f, 0xe,
+ 0x72, 0xa, 0xf7, 0x68, 0xf8, 0xf0, 0x8e, 0xa,
+ 0xf7, 0x2c, 0xf7, 0x26, 0x7a, 0xa, 0x32, 0x34,
+ 0x63, 0xe2, 0x5, 0x25, 0x6, 0xe, 0x48, 0xa,
+ 0x1, 0xd0, 0x16, 0xf7, 0x23, 0x6, 0xf7, 0x2,
+ 0xf8, 0xa8, 0x47, 0xa, 0xe, 0xfc, 0x68, 0x8d,
+ 0x76, 0xf9, 0x6d, 0x77, 0x1, 0x29, 0x78, 0x15,
+ 0xf8, 0xdd, 0xf9, 0x6d, 0x5, 0x3f, 0x6, 0xfc,
+ 0xdd, 0xfd, 0x6d, 0x5, 0xe, 0x84, 0xa, 0xf9,
+ 0x6b, 0x77, 0x1, 0xe2, 0x16, 0xf7, 0x21, 0x6,
+ 0xe3, 0xf8, 0x33, 0x5, 0xef, 0x6, 0xa1, 0xf1,
+ 0x5, 0x27, 0x6, 0xda, 0x9a, 0x9d, 0xa4, 0xb2,
+ 0x1b, 0x99, 0x9d, 0x87, 0x7d, 0xb1, 0x1f, 0xa6,
+ 0xf0, 0x5, 0x9c, 0x55, 0x59, 0x91, 0x6b, 0x1b,
+ 0xfb, 0x17, 0x81, 0x28, 0xfb, 0x3, 0x6a, 0x1f,
+ 0x3b, 0x6, 0x76, 0x25, 0x5, 0xda, 0x6, 0xf7,
+ 0x79, 0xfc, 0x33, 0x15, 0x9b, 0xa, 0xf7, 0x1,
+ 0xf8, 0x99, 0x3d, 0xa, 0x9a, 0xd2, 0x15, 0xf7,
+ 0x21, 0x6, 0xa5, 0xf7, 0x13, 0x65, 0xa, 0x84,
+ 0xa, 0xf8, 0x33, 0xf1, 0xf7, 0x66, 0x77, 0x1,
+ 0xf8, 0x28, 0x16, 0xf7, 0x20, 0x6, 0xf7, 0x2b,
+ 0xf9, 0x5f, 0x3d, 0xa, 0xfc, 0x67, 0xfd, 0x5f,
+ 0x15, 0x9b, 0xa, 0xe2, 0xf8, 0x33, 0x5, 0xef,
+ 0x6, 0xa0, 0xf1, 0x5, 0x27, 0x6, 0xda, 0x9c,
+ 0x9a, 0xa4, 0xb2, 0x1b, 0x99, 0x9f, 0x86, 0x7e,
+ 0xb0, 0x1f, 0xa6, 0xf0, 0x5, 0x9c, 0x55, 0x5a,
+ 0x91, 0x6a, 0x1b, 0xfb, 0x15, 0x80, 0x28, 0xfb,
+ 0x3, 0x6a, 0x1f, 0x3c, 0x6, 0x75, 0x25, 0x5,
+ 0xda, 0x6, 0xe, 0x87, 0xa, 0xcf, 0x16, 0xf8,
+ 0x9a, 0x50, 0xa, 0xfc, 0x4, 0x6, 0xbe, 0xf7,
+ 0x84, 0xf7, 0x4c, 0xee, 0xa3, 0xf7, 0x7, 0xfb,
+ 0x4c, 0x28, 0xbd, 0xf7, 0x86, 0x94, 0xa, 0x44,
+ 0xfb, 0xe0, 0x30, 0x59, 0x73, 0xfb, 0x8, 0xe6,
+ 0xbd, 0x5, 0xe, 0xfb, 0xf9, 0x37, 0xa, 0xdc,
+ 0x16, 0xf7, 0x20, 0x6, 0xd6, 0xf8, 0x0, 0xe7,
+ 0xcc, 0x9e, 0xe9, 0x2e, 0x4a, 0xc2, 0xf7, 0x98,
+ 0x5, 0xfb, 0x20, 0x6, 0x44, 0xfb, 0xe8, 0x29,
+ 0x48, 0x77, 0x2d, 0xef, 0xcd, 0x5, 0xe, 0x73,
+ 0x8b, 0xf7, 0xd, 0xf8, 0x7f, 0xf7, 0x10, 0xbe,
+ 0x95, 0xa, 0xa4, 0x16, 0xf8, 0xcb, 0x40, 0xa,
+ 0x8c, 0x8a, 0x2c, 0x8b, 0x2b, 0x1b, 0x52, 0x4c,
+ 0x8b, 0x8a, 0x44, 0x1f, 0xf8, 0x3e, 0xf8, 0x88,
+ 0xa0, 0xf7, 0x8, 0x5, 0xfc, 0xa2, 0x6, 0x71,
+ 0xfb, 0x10, 0x5, 0xf7, 0xe8, 0x6, 0xfc, 0x37,
+ 0xfc, 0x84, 0x5, 0xf7, 0xc7, 0xf9, 0x33, 0x15,
+ 0xf7, 0x19, 0x6, 0xf7, 0x28, 0x67, 0xa, 0xfb,
+ 0xa, 0x6, 0x34, 0x31, 0x65, 0xe5, 0x5, 0x27,
+ 0x6, 0xe, 0xfb, 0x1b, 0x8b, 0xf7, 0x9, 0xf7,
+ 0xc0, 0xf7, 0x5, 0xd0, 0x95, 0xa, 0x9f, 0x16,
+ 0xf8, 0x69, 0x6, 0xa5, 0xf7, 0x9, 0x5, 0xfb,
+ 0xa8, 0x6, 0xf7, 0xd1, 0xf7, 0xdb, 0x9e, 0xe1,
+ 0x5, 0xfc, 0x56, 0x6, 0x72, 0xfb, 0x5, 0x5,
+ 0xf7, 0x94, 0x6, 0xfb, 0xce, 0xfb, 0xd3, 0x5,
+ 0xf7, 0x83, 0xf8, 0x89, 0x15, 0xf7, 0x25, 0x6,
+ 0xf7, 0x34, 0x67, 0xa, 0xfb, 0x14, 0x6, 0x2d,
+ 0x31, 0x61, 0xe5, 0x5, 0x20, 0x6, 0xe, 0x8b,
+ 0xf7, 0x1b, 0xf8, 0xdb, 0x77, 0x1, 0xe9, 0xf7,
+ 0xc3, 0x3, 0xe9, 0x16, 0x7c, 0xa, 0xa8, 0xf7,
+ 0x1b, 0x47, 0xa, 0xb1, 0xbb, 0x15, 0xdb, 0x6,
+ 0xf7, 0x8, 0xf7, 0xf5, 0xb2, 0xf7, 0x4a, 0x5,
+ 0xfb, 0x2d, 0x6, 0x67, 0xfb, 0x4a, 0x5, 0xe,
+ 0xfb, 0x35, 0xf8, 0x68, 0x76, 0xf7, 0xa3, 0x77,
+ 0x1, 0xf7, 0x55, 0xf7, 0x25, 0xb9, 0xf7, 0x25,
+ 0x3, 0xf8, 0x14, 0xf8, 0x53, 0x15, 0xdd, 0x6,
+ 0xb5, 0xf7, 0x22, 0xa0, 0xf7, 0x15, 0x7a, 0xa,
+ 0x78, 0xfb, 0x15, 0x5, 0xfb, 0x57, 0xfb, 0x22,
+ 0x15, 0xdd, 0x6, 0xb7, 0xf7, 0x22, 0x9e, 0xf7,
+ 0x15, 0x5, 0xfb, 0xd, 0x6, 0x77, 0xfb, 0x15,
+ 0x5, 0xe, 0x3c, 0xa0, 0x76, 0xf8, 0x35, 0xf2,
+ 0xf7, 0x46, 0x77, 0x1, 0xe6, 0x16, 0xf7, 0xb,
+ 0x6, 0xb5, 0xf7, 0x47, 0x5, 0xf7, 0xb, 0x6,
+ 0x61, 0xfb, 0x47, 0x5, 0xf7, 0xb, 0x6, 0xb5,
+ 0xf7, 0x47, 0x5, 0xf7, 0x2e, 0xf1, 0xfb, 0x16,
+ 0x6, 0xab, 0xf7, 0x1c, 0x5, 0xed, 0xf2, 0x41,
+ 0x6, 0xb5, 0xf7, 0x46, 0x5, 0xfb, 0xf, 0x6,
+ 0x62, 0xfb, 0x46, 0x5, 0xfb, 0x9, 0x6, 0xb5,
+ 0xf7, 0x46, 0x5, 0xfb, 0xb, 0x6, 0x60, 0xfb,
+ 0x46, 0x5, 0xfb, 0x2b, 0x24, 0xf7, 0x13, 0x6,
+ 0x6c, 0xfb, 0x1c, 0x5, 0x2b, 0x25, 0xd3, 0x6,
+ 0xf7, 0x24, 0xf1, 0x15, 0xaa, 0xf7, 0x1c, 0x5,
+ 0xf7, 0xa, 0x6, 0x6b, 0xfb, 0x1c, 0x5, 0xe,
+ 0x3c, 0x2d, 0x76, 0xe3, 0xf7, 0x3, 0xf9, 0x47,
+ 0x77, 0x1, 0xf7, 0x2e, 0xf7, 0xe, 0xf7, 0x46,
+ 0xf7, 0xc, 0x3, 0xce, 0xf7, 0x5b, 0x15, 0x93,
+ 0xfb, 0x7, 0xcf, 0x3c, 0xec, 0x73, 0x76, 0x2b,
+ 0x18, 0xd4, 0x6, 0x9e, 0xe3, 0x5, 0xf7, 0x41,
+ 0xe5, 0xf4, 0xf7, 0x5, 0xf7, 0x26, 0xfb, 0x12,
+ 0xc9, 0x5f, 0x9c, 0x1f, 0xb6, 0xf7, 0x5b, 0x97,
+ 0x85, 0xa7, 0x7b, 0x94, 0x53, 0x19, 0xf7, 0x12,
+ 0x93, 0x80, 0xf7, 0x6, 0x42, 0xba, 0x47, 0x9d,
+ 0x19, 0x95, 0xbe, 0x5, 0x44, 0x6, 0x81, 0x61,
+ 0x5, 0xfb, 0xb, 0xfb, 0x12, 0x4e, 0xfb, 0x1d,
+ 0x5b, 0x9f, 0xfb, 0x5, 0xf7, 0x1d, 0x50, 0x1f,
+ 0x5c, 0xfb, 0x71, 0x50, 0xa5, 0x84, 0xcd, 0x89,
+ 0xa0, 0x19, 0xf7, 0x22, 0xf7, 0x82, 0x15, 0x66,
+ 0xa0, 0x72, 0xa7, 0xb4, 0x1a, 0xba, 0xb2, 0xb9,
+ 0xc8, 0x89, 0x1e, 0x61, 0xfc, 0xb2, 0x15, 0xb5,
+ 0xf7, 0x5c, 0x5, 0xb4, 0x77, 0xb0, 0x76, 0x57,
+ 0x1a, 0x63, 0x70, 0x4f, 0x2e, 0x84, 0x1e, 0xe,
+ 0xf7, 0x92, 0x7a, 0xdb, 0x4e, 0x76, 0xf7, 0xaf,
+ 0xdc, 0x8f, 0xdb, 0xf7, 0x5d, 0xdb, 0x8a, 0x77,
+ 0x12, 0xf7, 0xfa, 0xf0, 0xf7, 0xe9, 0xf0, 0x13,
+ 0x7b, 0xf7, 0x81, 0xf8, 0x6e, 0x15, 0x90, 0x99,
+ 0xf7, 0x2b, 0xce, 0x9d, 0xa1, 0x82, 0x68, 0x76,
+ 0x7e, 0xfb, 0x1c, 0x47, 0x63, 0x8b, 0xaa, 0x99,
+ 0x1e, 0x47, 0xfc, 0x81, 0x15, 0xf7, 0x2, 0x6,
+ 0x13, 0x77, 0xf8, 0xe2, 0xf9, 0x6c, 0x5, 0xfb,
+ 0x3, 0x6, 0xfd, 0x2, 0xfb, 0x75, 0x15, 0x4b,
+ 0xb0, 0x44, 0xeb, 0xf7, 0x30, 0xad, 0xf7, 0x2f,
+ 0xcb, 0x1e, 0x13, 0xbb, 0xc4, 0x71, 0xe0, 0xfb,
+ 0x1, 0xfb, 0x1f, 0x5a, 0xfb, 0x1a, 0x2f, 0x1e,
+ 0xf8, 0x4e, 0xfc, 0x1, 0x15, 0x4a, 0xb0, 0x44,
+ 0xeb, 0xf7, 0x2f, 0xae, 0xf7, 0x30, 0xcb, 0xc4,
+ 0x70, 0xe0, 0x20, 0xfb, 0x20, 0x5a, 0xfb, 0x1b,
+ 0x30, 0x1e, 0xf0, 0x81, 0x15, 0x91, 0x98, 0xf7,
+ 0x29, 0xd0, 0x9b, 0xa2, 0x83, 0x68, 0x76, 0x7d,
+ 0xfb, 0x1d, 0x48, 0x63, 0x8b, 0xab, 0x99, 0x1e,
+ 0xe, 0xe2, 0x7d, 0xf7, 0x5, 0x2a, 0x76, 0xf9,
+ 0x19, 0xe5, 0x12, 0xe4, 0xf7, 0x23, 0x9a, 0xf7,
+ 0x19, 0x13, 0x98, 0xf7, 0xac, 0xf8, 0x3b, 0x15,
+ 0x4b, 0x6b, 0xfb, 0x13, 0x4e, 0xfb, 0x1f, 0x1a,
+ 0x32, 0xcd, 0xfb, 0x8, 0xf7, 0x49, 0xec, 0xd4,
+ 0xad, 0xa9, 0xb2, 0x1e, 0x13, 0x58, 0x9f, 0x77,
+ 0xb4, 0x69, 0xa6, 0x7c, 0xe7, 0xe6, 0x18, 0x8a,
+ 0x8c, 0x86, 0x8f, 0x8c, 0x1a, 0x6d, 0xa2, 0x7d,
+ 0x98, 0x72, 0xa2, 0xa7, 0xa5, 0xae, 0xbb, 0x9e,
+ 0xae, 0x23, 0xc6, 0x18, 0x68, 0x56, 0x7b, 0x7c,
+ 0x81, 0x81, 0x76, 0xa1, 0x58, 0xd1, 0x62, 0xcf,
+ 0x8, 0x13, 0x8, 0xf7, 0x2f, 0xd6, 0x9c, 0xe3,
+ 0xab, 0x1a, 0x13, 0x28, 0xc7, 0x56, 0xd7, 0xfb,
+ 0xc, 0x23, 0x25, 0x54, 0xfb, 0x9, 0x5e, 0x99,
+ 0x62, 0x9e, 0x66, 0x1e, 0xbf, 0x2a, 0x15, 0xac,
+ 0x52, 0xbf, 0x40, 0xbb, 0x53, 0x8, 0x13, 0x98,
+ 0x7c, 0x73, 0x63, 0x73, 0x4f, 0x1b, 0x3e, 0x6b,
+ 0xb7, 0xbb, 0xd9, 0xd5, 0xb7, 0xa5, 0x98, 0x1f,
+ 0xd1, 0xf7, 0x2f, 0x15, 0x84, 0x98, 0x7c, 0x9f,
+ 0xab, 0x1a, 0x13, 0x0, 0xb6, 0xaa, 0xb2, 0xb2,
+ 0xac, 0x9f, 0x77, 0x71, 0x5f, 0x50, 0x66, 0x61,
+ 0x77, 0x1e, 0xe, 0xfc, 0x21, 0xf8, 0x68, 0x76,
+ 0xf7, 0xa3, 0x77, 0x1, 0xf7, 0x39, 0xf8, 0x53,
+ 0x15, 0xe4, 0x6, 0xb7, 0xf7, 0x22, 0xa2, 0xf7,
+ 0x15, 0x66, 0xa, 0x77, 0xfb, 0x15, 0x5, 0xe,
+ 0xfb, 0x4f, 0x76, 0xfa, 0x42, 0x77, 0x1, 0xd7,
+ 0xf7, 0x19, 0x3, 0xf7, 0x33, 0xfb, 0x64, 0x15,
+ 0xf1, 0x6, 0x8c, 0x89, 0x92, 0x8a, 0x8d, 0x1e,
+ 0x6d, 0xed, 0x78, 0xf7, 0x2c, 0xf4, 0x1a, 0xf7,
+ 0x9a, 0xf7, 0x2a, 0xf7, 0x76, 0xf7, 0x3, 0xe4,
+ 0x1e, 0xfb, 0x5, 0x6, 0x32, 0x2d, 0xfb, 0x54,
+ 0xfb, 0x62, 0xfb, 0xa9, 0x1a, 0x50, 0x94, 0xfb,
+ 0x22, 0xd5, 0xfb, 0x38, 0x1e, 0xe, 0xfb, 0x4f,
+ 0x76, 0xfa, 0x42, 0x77, 0x1, 0xf7, 0x80, 0xf7,
+ 0x19, 0x3, 0x72, 0xfb, 0x64, 0x15, 0xf7, 0x5,
+ 0x6, 0xe4, 0xe9, 0xf7, 0x54, 0xf7, 0x62, 0xf7,
+ 0xa9, 0x1a, 0xc6, 0x82, 0xf7, 0x22, 0x41, 0xf7,
+ 0x38, 0x1e, 0x25, 0x6, 0xab, 0x26, 0x9f, 0xfb,
+ 0x2d, 0xfb, 0x1, 0x1a, 0xfb, 0xd1, 0xfb, 0x5e,
+ 0xfb, 0x6e, 0x50, 0x5f, 0x1e, 0xe, 0xfb, 0x8a,
+ 0xf8, 0x2c, 0x76, 0xf7, 0xdf, 0x77, 0x1, 0xf7,
+ 0x8c, 0xf8, 0x17, 0x15, 0xcc, 0xf7, 0x2, 0xca,
+ 0xfb, 0x2, 0xd0, 0xc1, 0x39, 0xe8, 0xf7, 0xa,
+ 0xa4, 0x71, 0xe0, 0xfb, 0x6, 0x57, 0x97, 0xf7,
+ 0x12, 0x5, 0x37, 0x6, 0x98, 0xfb, 0x12, 0xfb,
+ 0x0, 0xc2, 0x6f, 0x36, 0xf7, 0xa, 0x6f, 0x32,
+ 0x2d, 0x5, 0xe, 0x58, 0xf7, 0x52, 0xf7, 0x14,
+ 0x1, 0xf7, 0xab, 0xf7, 0x19, 0x3, 0xdd, 0xf7,
+ 0x52, 0x15, 0xf7, 0x59, 0xfb, 0x52, 0xf7, 0x19,
+ 0xf7, 0x52, 0xf7, 0x5a, 0xf7, 0x14, 0xfb, 0x5a,
+ 0xf7, 0x50, 0xfb, 0x19, 0xfb, 0x50, 0xfb, 0x59,
+ 0x6, 0xe, 0xfb, 0xf9, 0xfb, 0x27, 0x76, 0xf7,
+ 0xce, 0x77, 0x1, 0xc9, 0x8d, 0x15, 0xd0, 0x6,
+ 0x7d, 0x4a, 0x70, 0x74, 0x5b, 0x80, 0x7d, 0x44,
+ 0x18, 0xf7, 0x2d, 0x8e, 0xa4, 0xf7, 0x16, 0x98,
+ 0xca, 0xa5, 0xf7, 0xa, 0x18, 0xfb, 0x2d, 0x6,
+ 0xe, 0xf7, 0x6b, 0xf7, 0x16, 0x1, 0xd4, 0xf7,
+ 0x6b, 0x15, 0xf7, 0xa9, 0x6, 0xa8, 0xf7, 0x16,
+ 0x5, 0xfb, 0xa9, 0x6, 0xe, 0xfb, 0xf9, 0x8b,
+ 0xf7, 0x26, 0x1, 0xcb, 0x16, 0xf7, 0x2b, 0x6,
+ 0xa9, 0xf7, 0x26, 0x5, 0x97, 0xa, 0xe, 0xfb,
+ 0xf9, 0x78, 0xa, 0x76, 0xf8, 0x8d, 0x3, 0x66,
+ 0x78, 0x15, 0xef, 0x6, 0xf8, 0x29, 0xf9, 0x88,
+ 0x5, 0x25, 0x6, 0xe, 0x3c, 0x78, 0xf7, 0x4,
+ 0xf8, 0x8d, 0xf7, 0x4, 0x1, 0xe1, 0xf7, 0xf,
+ 0xf7, 0xb0, 0xf7, 0x10, 0x3, 0xe1, 0xf7, 0x63,
+ 0x15, 0xfb, 0x3b, 0xea, 0x50, 0xf7, 0x6, 0xf7,
+ 0x81, 0xe0, 0xf7, 0xe6, 0xf7, 0x30, 0xf7, 0x3e,
+ 0x2d, 0xcc, 0xfb, 0x5, 0xfb, 0x7a, 0x2d, 0xfb,
+ 0xe3, 0xfb, 0x3c, 0x1e, 0xf7, 0xf, 0x16, 0xb6,
+ 0xc6, 0xf7, 0xf0, 0xf7, 0x1b, 0xc5, 0xab, 0x3c,
+ 0x5f, 0x44, 0x52, 0xfb, 0xcb, 0xfb, 0x1b, 0x45,
+ 0x75, 0xe6, 0xa2, 0x1e, 0xe, 0x3c, 0xa0, 0x76,
+ 0xf9, 0x5a, 0x77, 0x1, 0xf7, 0x41, 0xf7, 0xf8,
+ 0x3, 0xf7, 0x9c, 0x16, 0xf7, 0x14, 0x6, 0xf7,
+ 0x1d, 0xf9, 0x5a, 0x5, 0x3e, 0x6, 0x39, 0x2c,
+ 0xfb, 0x1, 0x56, 0x4b, 0x6c, 0x73, 0xfb, 0x10,
+ 0x18, 0xb3, 0x95, 0xdb, 0xa7, 0xcd, 0xba, 0x8,
+ 0xe, 0x3c, 0x8b, 0xf7, 0x12, 0xf8, 0x6f, 0xf7,
+ 0x1, 0x1, 0xf8, 0x54, 0xf7, 0x20, 0x3, 0xa4,
+ 0x16, 0xf8, 0x74, 0x6, 0xa9, 0xf7, 0x12, 0x5,
+ 0xfb, 0xa6, 0x6, 0xb0, 0xb5, 0x9b, 0x99, 0xf7,
+ 0x10, 0xf2, 0x8, 0xf7, 0x0, 0xe4, 0xb5, 0xd1,
+ 0xd7, 0x1a, 0xdf, 0x4f, 0xf5, 0xfb, 0x45, 0xfb,
+ 0x15, 0x28, 0x45, 0xfb, 0x19, 0x73, 0x1e, 0xf7,
+ 0x21, 0x77, 0x5, 0xbf, 0x96, 0xae, 0xc9, 0xd1,
+ 0x1b, 0xc3, 0xaf, 0x61, 0x65, 0x38, 0xfb, 0x14,
+ 0x35, 0x40, 0x48, 0x1f, 0xfb, 0x2, 0x2f, 0x2d,
+ 0x3f, 0x7b, 0xfb, 0x9, 0x8, 0xe, 0x3c, 0x78,
+ 0xf7, 0x6, 0xf7, 0x63, 0xf7, 0x9, 0xf7, 0x46,
+ 0xf7, 0x5, 0x1, 0xf8, 0x60, 0xf7, 0x28, 0x3,
+ 0xcc, 0xf7, 0x47, 0x15, 0xfb, 0x2b, 0xa0, 0xf7,
+ 0x4, 0x5c, 0xf2, 0x1b, 0xf7, 0x3b, 0xf3, 0xf7,
+ 0xb, 0xf7, 0x1, 0xc9, 0x68, 0xc5, 0x50, 0xa8,
+ 0x1f, 0xcc, 0xa1, 0xcc, 0xc3, 0xe3, 0x1a, 0xe0,
+ 0x45, 0xf0, 0xfb, 0x2f, 0xfb, 0x4c, 0x65, 0xfb,
+ 0x25, 0x64, 0x7e, 0x1e, 0xf7, 0x1d, 0x71, 0x5,
+ 0xc1, 0x9a, 0xa7, 0xb6, 0xc2, 0x1b, 0xaa, 0xb9,
+ 0x7c, 0x51, 0x49, 0x4f, 0x64, 0x3d, 0x1f, 0x71,
+ 0xfb, 0x9, 0x5, 0xd0, 0xc2, 0x72, 0x47, 0x4e,
+ 0x5e, 0x56, 0x42, 0x4b, 0x77, 0xb5, 0xc5, 0x81,
+ 0x1f, 0xe, 0x3c, 0xa0, 0x76, 0xf7, 0x25, 0xf7,
+ 0xa, 0xf8, 0x38, 0x77, 0x1, 0xc7, 0xf8, 0xae,
+ 0x3, 0xc7, 0xf7, 0x25, 0x15, 0xf7, 0xb1, 0x6,
+ 0x6b, 0xfb, 0x25, 0x5, 0xf7, 0x1a, 0x6, 0xaa,
+ 0xf7, 0x25, 0x5, 0xe3, 0x6, 0xa4, 0xf7, 0xa,
+ 0x5, 0x33, 0x6, 0xea, 0xf8, 0x53, 0x7a, 0xa,
+ 0xfc, 0x1b, 0xfc, 0x55, 0x5, 0xf7, 0x22, 0x8d,
+ 0x15, 0xf7, 0x50, 0xf7, 0x72, 0x8d, 0x89, 0x5c,
+ 0xfb, 0x70, 0x5, 0xe, 0x20, 0x78, 0xf7, 0x7,
+ 0xf7, 0xab, 0xf2, 0xf7, 0x2, 0xf7, 0x14, 0x1,
+ 0xc8, 0xf7, 0x24, 0xf7, 0x73, 0xf7, 0x27, 0x3,
+ 0xc8, 0xf7, 0x5a, 0x15, 0xfb, 0x22, 0x8d, 0xf1,
+ 0x40, 0xf7, 0x9, 0x1b, 0xf7, 0x44, 0xf7, 0x9,
+ 0xf7, 0x27, 0xf7, 0x28, 0xf7, 0x9, 0x3d, 0xe0,
+ 0xfb, 0xd, 0x60, 0x73, 0x81, 0x83, 0x78, 0x1f,
+ 0xae, 0xf7, 0x2, 0x5, 0xf7, 0x8f, 0x6, 0xa7,
+ 0xf7, 0x14, 0x5, 0xfc, 0x11, 0x6, 0xfb, 0x6,
+ 0xfc, 0x1, 0xf7, 0xe, 0x82, 0x5, 0xbe, 0xbc,
+ 0xbd, 0x8b, 0x94, 0x1b, 0xb7, 0xb8, 0x73, 0x3f,
+ 0xfb, 0x9, 0x42, 0x4d, 0x49, 0x4a, 0x75, 0xbc,
+ 0xcc, 0x8e, 0x1f, 0xe, 0x3c, 0x78, 0xf7, 0x4,
+ 0xf7, 0xb0, 0xe7, 0xf7, 0x15, 0xf7, 0x4, 0x1,
+ 0xe0, 0xf7, 0x26, 0xf7, 0x5e, 0xf7, 0x27, 0x3,
+ 0xf7, 0xa3, 0xf8, 0x4c, 0x15, 0xb7, 0x98, 0xaf,
+ 0xf7, 0x6, 0xe3, 0x1b, 0xc9, 0x90, 0x59, 0x72,
+ 0x8d, 0x1f, 0xf7, 0x22, 0x94, 0x5, 0xf7, 0xd,
+ 0x7c, 0x45, 0xc4, 0xfb, 0x7, 0x1b, 0xfb, 0x6b,
+ 0xfb, 0xb, 0xfb, 0x8f, 0xfb, 0x81, 0xfb, 0x10,
+ 0xd7, 0xfb, 0x9, 0xf7, 0x2a, 0xf7, 0x43, 0xe9,
+ 0xf7, 0x2a, 0xf7, 0x14, 0xf7, 0x11, 0x3a, 0xe0,
+ 0xfb, 0x10, 0x64, 0x6a, 0x82, 0x77, 0x6b, 0x1f,
+ 0x63, 0xfb, 0x6e, 0x15, 0xe3, 0xb8, 0xce, 0xd7,
+ 0xb0, 0xb7, 0x6d, 0x33, 0xfb, 0x0, 0x54, 0x51,
+ 0x4c, 0x47, 0x7b, 0xde, 0xb9, 0x1e, 0xe, 0x3c,
+ 0xa0, 0x76, 0xf8, 0xdd, 0xf7, 0x11, 0x1, 0xf7,
+ 0x27, 0x16, 0xf7, 0x27, 0x6, 0xa7, 0xf7, 0x1c,
+ 0xf7, 0x2d, 0xf7, 0xe7, 0xf7, 0x47, 0xf7, 0x13,
+ 0xa1, 0xeb, 0x18, 0xfc, 0x9c, 0x6, 0x6c, 0xfb,
+ 0x11, 0x5, 0xf7, 0xe7, 0x6, 0xfb, 0x8e, 0xfb,
+ 0x9c, 0x4b, 0xfb, 0xb3, 0x88, 0x75, 0x8, 0xe,
+ 0x3c, 0x78, 0xf6, 0xf7, 0x80, 0xf6, 0xf7, 0x38,
+ 0xf6, 0x1, 0xd0, 0xf7, 0x2d, 0xf7, 0x65, 0xf7,
+ 0x29, 0x3, 0xf7, 0x7c, 0xf8, 0x16, 0x15, 0xfb,
+ 0x21, 0x5f, 0x75, 0xfb, 0xd, 0x5d, 0x1a, 0x22,
+ 0xdc, 0x32, 0xf7, 0x28, 0xf7, 0x48, 0xf1, 0xf7,
+ 0x13, 0xf7, 0x6, 0xee, 0x47, 0xb1, 0x6f, 0x9b,
+ 0x1e, 0xac, 0x98, 0xee, 0xa9, 0xf7, 0x0, 0x1a,
+ 0xf0, 0x37, 0xde, 0xfb, 0x1e, 0xfb, 0x3e, 0x41,
+ 0xfb, 0xd, 0x38, 0x3b, 0xc6, 0x71, 0xa2, 0x7d,
+ 0x1e, 0x81, 0xfb, 0x67, 0x15, 0xcf, 0xb3, 0xdc,
+ 0xdd, 0xbe, 0xaf, 0x55, 0x5b, 0x60, 0x72, 0x30,
+ 0x29, 0x62, 0x5e, 0xa4, 0xc9, 0x1e, 0xcf, 0xf7,
+ 0xdf, 0x15, 0xc4, 0xbd, 0xb3, 0xbf, 0xc1, 0xa7,
+ 0x65, 0x64, 0x59, 0x5b, 0x5e, 0x53, 0x5b, 0x6b,
+ 0xab, 0xb6, 0x1e, 0xe, 0x3c, 0x78, 0xf7, 0x4,
+ 0xfb, 0x4, 0xf7, 0x4a, 0xc6, 0xe7, 0xf7, 0xb0,
+ 0xf7, 0x4, 0x1, 0xf7, 0x9, 0xf7, 0x28, 0xf7,
+ 0x5e, 0xf7, 0x28, 0x3, 0xd9, 0xf7, 0x33, 0x15,
+ 0xfb, 0xd, 0x9a, 0xd2, 0x52, 0xf7, 0x7, 0x1b,
+ 0xf7, 0x6c, 0xf7, 0xc, 0xf7, 0x90, 0xf7, 0x81,
+ 0xf7, 0x10, 0x3f, 0xf7, 0x8, 0xfb, 0x2b, 0xfb,
+ 0x44, 0x2c, 0xfb, 0x2f, 0xfb, 0x14, 0xfb, 0x11,
+ 0xdd, 0x3b, 0xf7, 0x11, 0xb2, 0xab, 0x94, 0x9f,
+ 0xac, 0x1f, 0x5f, 0x7e, 0x67, 0xfb, 0x6, 0x32,
+ 0x1b, 0x4d, 0x86, 0xbd, 0xa4, 0x88, 0x1f, 0xb8,
+ 0xf7, 0x97, 0x15, 0xf7, 0x0, 0xc2, 0xca, 0xca,
+ 0xd0, 0x9a, 0x3a, 0x5d, 0x33, 0x5f, 0x46, 0x3e,
+ 0x67, 0x5e, 0xa4, 0xe3, 0x1e, 0xe, 0x8b, 0xf7,
+ 0x17, 0xf7, 0x8f, 0xf7, 0x16, 0x1, 0xf7, 0x44,
+ 0xf8, 0x12, 0x15, 0xf7, 0x26, 0x6, 0xa8, 0xf7,
+ 0x16, 0x93, 0xa, 0xfb, 0x5, 0xfc, 0x94, 0x15,
+ 0xf7, 0x26, 0x6, 0xa8, 0xf7, 0x17, 0x93, 0xa,
+ 0xe, 0xfb, 0x27, 0x76, 0xf7, 0x47, 0x76, 0xf8,
+ 0x19, 0xf7, 0x19, 0x1, 0xc3, 0xf7, 0xbb, 0x3,
+ 0xe5, 0x81, 0x15, 0xcf, 0x6, 0x7d, 0x4f, 0x70,
+ 0x75, 0x5c, 0x81, 0x7d, 0x49, 0x18, 0xf7, 0x2a,
+ 0x8e, 0xa5, 0xf7, 0xd, 0x97, 0xc5, 0xa5, 0xf7,
+ 0x2, 0x18, 0x97, 0xa, 0xc2, 0xf7, 0x93, 0x15,
+ 0xf7, 0x27, 0x6, 0xa9, 0xf7, 0x19, 0x7b, 0xa,
+ 0xe, 0x58, 0x98, 0x76, 0xf8, 0x9e, 0x77, 0x1,
+ 0xdd, 0xf7, 0x58, 0x15, 0xf8, 0x8b, 0xfb, 0x60,
+ 0x5, 0xf7, 0x17, 0x7, 0xfb, 0xdd, 0xf7, 0x17,
+ 0xf7, 0xdd, 0xf7, 0x13, 0x5, 0xf7, 0x19, 0x7,
+ 0xfc, 0x8b, 0xfb, 0x60, 0x5, 0xe, 0x58, 0xe2,
+ 0xf7, 0xb, 0xe9, 0xf7, 0xb, 0x1, 0xc5, 0xf8,
+ 0xd3, 0x3, 0xc5, 0xe2, 0x15, 0xf8, 0xd3, 0xf7,
+ 0xb, 0xfc, 0xd3, 0x6, 0xe9, 0x4, 0xf8, 0xd3,
+ 0xf7, 0xb, 0xfc, 0xd3, 0x6, 0xe, 0x58, 0x98,
+ 0x76, 0xf8, 0x9e, 0x77, 0x1, 0xf5, 0x83, 0x15,
+ 0xf8, 0x8b, 0xf7, 0x60, 0x5, 0xf7, 0x6, 0x7,
+ 0xfc, 0x8b, 0xf7, 0x60, 0x98, 0xa, 0x7, 0xf7,
+ 0xdc, 0xfb, 0x17, 0xfb, 0xdc, 0xfb, 0x13, 0x5,
+ 0xe, 0x73, 0x8b, 0xf7, 0x1b, 0xf8, 0x7d, 0xf2,
+ 0x1, 0xf7, 0x98, 0xf7, 0x47, 0x15, 0xf7, 0x15,
+ 0x6, 0x96, 0xca, 0x9f, 0x9b, 0xdd, 0xce, 0x8,
+ 0xf7, 0xa, 0xea, 0xbe, 0xbc, 0xda, 0x1a, 0xdf,
+ 0x45, 0xea, 0xfb, 0x35, 0xfb, 0x50, 0x46, 0xfb,
+ 0x1b, 0x45, 0x79, 0x1e, 0xf7, 0x17, 0x74, 0x5,
+ 0xf7, 0x9, 0xa6, 0xd3, 0x93, 0xb6, 0x1b, 0xd8,
+ 0xa1, 0x5f, 0x6b, 0x66, 0x75, 0x79, 0x35, 0x42,
+ 0x1f, 0xfb, 0x4, 0x2d, 0x61, 0x5b, 0x7c, 0x28,
+ 0x8, 0x5f, 0xfb, 0x47, 0x15, 0xf7, 0x21, 0x6,
+ 0xa9, 0xf7, 0x1b, 0x92, 0xa, 0xe, 0xf8, 0x49,
+ 0x4d, 0xda, 0xf7, 0x0, 0xda, 0xf7, 0xca, 0xda,
+ 0xed, 0xda, 0x1, 0xf7, 0x61, 0xdb, 0xe0, 0xf7,
+ 0x5, 0xf8, 0x64, 0xdb, 0x3, 0xf9, 0x25, 0xf7,
+ 0x42, 0x15, 0x79, 0x8f, 0x94, 0x6c, 0xce, 0x1b,
+ 0xf7, 0x46, 0xf7, 0x4, 0xf7, 0x37, 0xf7, 0x28,
+ 0xf7, 0x4c, 0xfb, 0x1b, 0xf7, 0x2a, 0xfb, 0x83,
+ 0xfb, 0xd4, 0xfb, 0x14, 0xfb, 0x87, 0xfb, 0x5b,
+ 0xfb, 0xa5, 0xf7, 0x7f, 0xfb, 0x9, 0xf7, 0x6c,
+ 0xf7, 0x1d, 0xf7, 0x47, 0xb4, 0xf7, 0x2e, 0xd8,
+ 0x1f, 0x2f, 0x6, 0x68, 0x6d, 0x46, 0x3a, 0xfb,
+ 0x5e, 0x1b, 0xfb, 0xb5, 0x39, 0xf7, 0x41, 0xf7,
+ 0x1e, 0xf7, 0xf, 0xca, 0xf7, 0x84, 0xf7, 0xc4,
+ 0xf7, 0x7a, 0xcc, 0xfb, 0x2b, 0x28, 0xfb, 0x1d,
+ 0xfb, 0x3, 0x30, 0x61, 0x73, 0x91, 0xa9, 0xa8,
+ 0x92, 0x1f, 0xcc, 0xf7, 0xcb, 0x5, 0xfb, 0x6,
+ 0x6, 0x80, 0x5b, 0x5, 0xc0, 0x67, 0x56, 0x90,
+ 0x6f, 0x1b, 0xfb, 0x30, 0x3b, 0xfb, 0x39, 0xfb,
+ 0xd, 0x28, 0xc8, 0x38, 0xf5, 0xd0, 0xb3, 0xb1,
+ 0x96, 0x96, 0x1f, 0xfb, 0x42, 0xf7, 0x19, 0x15,
+ 0xc8, 0xab, 0xf7, 0x26, 0xf0, 0xd2, 0x95, 0x42,
+ 0x70, 0x51, 0x6a, 0xfb, 0x2c, 0x24, 0x4f, 0x79,
+ 0xbf, 0xbe, 0x1e, 0xe, 0x68, 0xa, 0xf7, 0x33,
+ 0xf7, 0xc, 0xf8, 0x4b, 0x77, 0x1, 0x9f, 0x16,
+ 0x5e, 0xa, 0xe1, 0xf7, 0x33, 0x5, 0xf7, 0xaf,
+ 0x6, 0xa3, 0xfb, 0x33, 0x5, 0xf7, 0x1f, 0x6,
+ 0xfb, 0x8, 0xf9, 0x62, 0x43, 0xa, 0x27, 0xfc,
+ 0x4b, 0x15, 0xf7, 0x30, 0xf7, 0xb5, 0x5c, 0xa,
+ 0xb3, 0xfb, 0xb5, 0x5, 0xe, 0xe2, 0x8b, 0xf7,
+ 0xc, 0xf7, 0x50, 0xf7, 0xc, 0xf7, 0x3e, 0x8b,
+ 0xa, 0xf7, 0xef, 0x6, 0xf7, 0x27, 0xf7, 0x42,
+ 0xb5, 0xf7, 0x4c, 0xc0, 0x6c, 0xd1, 0x32, 0xa3,
+ 0x1f, 0x8d, 0x7, 0xa9, 0x93, 0xf7, 0x2, 0x9c,
+ 0xf7, 0x12, 0x1a, 0xf7, 0x23, 0x24, 0xbc, 0xfb,
+ 0x47, 0x1e, 0xfb, 0x90, 0x6, 0xa2, 0xfc, 0xea,
+ 0x15, 0xb3, 0xf7, 0x50, 0x5, 0xf7, 0x48, 0x6,
+ 0xa2, 0xe9, 0x8b, 0x39, 0x25, 0x24, 0x87, 0x32,
+ 0x1f, 0x3c, 0xf7, 0xc8, 0x15, 0xaf, 0xf7, 0x3e,
+ 0x5, 0xf7, 0x9, 0x6, 0xd5, 0xcf, 0x8b, 0x43,
+ 0x2d, 0x2b, 0x87, 0x37, 0x1f, 0xe, 0xe2, 0x78,
+ 0xf7, 0x12, 0xf8, 0x8c, 0xf7, 0x12, 0x1, 0xf6,
+ 0xf7, 0x2c, 0x3, 0xf8, 0xe6, 0xf7, 0x95, 0x15,
+ 0xfb, 0xb, 0x64, 0x34, 0x6c, 0x51, 0x1b, 0x27,
+ 0x58, 0xe3, 0xef, 0xf7, 0xa, 0x80, 0xa, 0x69,
+ 0x92, 0x1f, 0xf7, 0x28, 0x99, 0x5, 0xf7, 0x3d,
+ 0x77, 0xfb, 0x16, 0xcd, 0xfb, 0x1c, 0x1b, 0xfb,
+ 0x7f, 0xfb, 0x35, 0xfb, 0x54, 0xfb, 0x8e, 0xfb,
+ 0x31, 0xce, 0xfb, 0x31, 0xf7, 0x75, 0xf7, 0x62,
+ 0xf0, 0xf7, 0x1b, 0xf7, 0x9, 0xb6, 0x1f, 0xe,
+ 0x57, 0xa, 0xd7, 0x16, 0xf7, 0x98, 0x6, 0xf7,
+ 0x7c, 0xf7, 0x65, 0xf7, 0x24, 0xf7, 0xa7, 0xf7,
+ 0x71, 0xfb, 0x3, 0xd9, 0xfb, 0x81, 0x1f, 0xfb,
+ 0x58, 0x6, 0xa0, 0xfc, 0xec, 0x15, 0xf3, 0xf8,
+ 0x76, 0x5, 0xe1, 0x6, 0xd8, 0xf4, 0x86, 0xfb,
+ 0x44, 0xfb, 0x8a, 0xfb, 0x38, 0x54, 0xfb, 0x17,
+ 0x1f, 0xe, 0xab, 0x8b, 0xf7, 0xc, 0xf7, 0x56,
+ 0xf7, 0xc, 0xf7, 0x38, 0x8b, 0xa, 0xf8, 0xc4,
+ 0x6, 0xa5, 0x83, 0xa, 0xfc, 0x31, 0x6, 0xb3,
+ 0xf7, 0x56, 0x5, 0xf7, 0xfe, 0x40, 0xa, 0xfb,
+ 0xfe, 0x6, 0xad, 0xf7, 0x38, 0x5, 0xf8, 0x14,
+ 0x40, 0xa, 0xfc, 0xa7, 0x6, 0xe, 0x84, 0xa,
+ 0xf7, 0xc5, 0xf7, 0xc, 0xf7, 0x41, 0x8b, 0xa,
+ 0x5e, 0xa, 0xcc, 0xf7, 0xc5, 0x5, 0xf7, 0xeb,
+ 0x40, 0xa, 0xfb, 0xea, 0x6, 0xaf, 0xf7, 0x41,
+ 0x5, 0xf7, 0xfe, 0x40, 0xa, 0xfc, 0x93, 0x6,
+ 0xe, 0x8c, 0xa, 0xf7, 0x2e, 0xf7, 0xf, 0xf7,
+ 0x77, 0xf7, 0x12, 0x1, 0xf7, 0x0, 0xf7, 0x25,
+ 0x3, 0xf8, 0x4c, 0xf7, 0x99, 0x15, 0xf7, 0x4e,
+ 0x6, 0x74, 0xfb, 0x0, 0x5, 0x81, 0x78, 0x3d,
+ 0x67, 0x32, 0x1b, 0x4d, 0x25, 0x98, 0xf7, 0x3b,
+ 0xf7, 0x28, 0xd1, 0xf7, 0x44, 0xf7, 0x55, 0xd3,
+ 0xc9, 0x6d, 0x2f, 0xa7, 0x1f, 0xf7, 0x1f, 0x9a,
+ 0x5, 0xf7, 0x3a, 0x71, 0xfb, 0x15, 0xce, 0xfb,
+ 0x28, 0x1b, 0xfb, 0xb2, 0xfb, 0xc, 0xfb, 0x97,
+ 0xfb, 0x55, 0xfb, 0x49, 0xee, 0xfb, 0xf, 0xf7,
+ 0x63, 0xf7, 0x26, 0xf7, 0x9, 0xc4, 0xab, 0xbb,
+ 0x1f, 0xcd, 0xf7, 0xce, 0x5, 0xfb, 0xda, 0x6,
+ 0xe, 0x68, 0xa, 0xf7, 0xd4, 0xf7, 0xd, 0xf7,
+ 0xa9, 0x77, 0x1, 0xd2, 0x16, 0x5e, 0xa, 0xcf,
+ 0xf7, 0xd4, 0x5, 0xf7, 0xad, 0x6, 0x47, 0xfb,
+ 0xd4, 0x5, 0x5e, 0xa, 0xf7, 0x2c, 0xf9, 0x62,
+ 0x53, 0xa, 0x50, 0xfb, 0xa9, 0x5, 0xfb, 0xad,
+ 0x6, 0xc5, 0xf7, 0xa9, 0x5a, 0xa, 0xe, 0xfb,
+ 0xf9, 0x37, 0xa, 0xcb, 0x16, 0x5e, 0xa, 0xf7,
+ 0x2d, 0xf9, 0x62, 0x5, 0x97, 0xa, 0xe, 0x3c,
+ 0x79, 0xf7, 0x11, 0xf8, 0xf7, 0x77, 0x1, 0xc7,
+ 0xf7, 0x5b, 0x15, 0xfb, 0x20, 0xbb, 0x3e, 0xf7,
+ 0x32, 0xf7, 0x5b, 0xb7, 0xf7, 0xd, 0xf7, 0x45,
+ 0xb0, 0x1e, 0xe6, 0xf8, 0x4a, 0x7b, 0xa, 0x30,
+ 0xfc, 0x4a, 0x85, 0xa, 0x6f, 0x6a, 0x66, 0x4c,
+ 0x1b, 0x2f, 0x98, 0xcf, 0xb1, 0x8d, 0x1f, 0xe,
+ 0xe2, 0x37, 0xa, 0xe2, 0x16, 0x5e, 0xa, 0xb9,
+ 0xf7, 0x70, 0xf7, 0x20, 0xf7, 0xe, 0xf7, 0x48,
+ 0xfb, 0xea, 0x5, 0xf7, 0x3d, 0x6, 0xfb, 0x83,
+ 0xf8, 0x49, 0xf7, 0xd9, 0xf7, 0xad, 0x5, 0xfb,
+ 0x5c, 0x6, 0xfb, 0xe1, 0xfb, 0xc4, 0x89, 0x8d,
+ 0xcb, 0xf7, 0xc2, 0x53, 0xa, 0xe, 0x87, 0xa,
+ 0xd7, 0x16, 0xf8, 0x92, 0x50, 0xa, 0xfb, 0xff,
+ 0x6, 0xf7, 0x10, 0xf8, 0xe9, 0x7b, 0xa, 0xe,
+ 0xf7, 0x5a, 0x37, 0xa, 0xf7, 0xe1, 0xf7, 0x3,
+ 0x3, 0xd0, 0x16, 0x82, 0xa, 0xf7, 0x6, 0xf8,
+ 0xec, 0x5c, 0xa, 0xa6, 0xfc, 0xec, 0x5, 0xf7,
+ 0x20, 0x6, 0xf7, 0xb0, 0xf8, 0xe7, 0x8d, 0x89,
+ 0xfb, 0x23, 0xfc, 0xe5, 0x5, 0xf7, 0x1c, 0x6,
+ 0xf7, 0x2c, 0xf9, 0x62, 0x5, 0xfb, 0x6b, 0x6,
+ 0xfb, 0x8a, 0xfc, 0x8b, 0x51, 0xa, 0x76, 0xf8,
+ 0x8b, 0x5, 0xfb, 0x69, 0x6, 0xe, 0xe2, 0x37,
+ 0xa, 0xd0, 0xf9, 0x76, 0x3, 0x8a, 0xa, 0xf2,
+ 0xf8, 0x77, 0x5c, 0xa, 0xf7, 0x59, 0xfc, 0x77,
+ 0x5, 0x9b, 0xa, 0xf7, 0x2d, 0xf9, 0x62, 0x3d,
+ 0xa, 0x25, 0xfc, 0x74, 0x51, 0xa, 0xfb, 0x5a,
+ 0xf8, 0x74, 0x65, 0xa, 0x8c, 0xa, 0xf8, 0x8c,
+ 0xf7, 0x12, 0x1, 0xf7, 0x17, 0xf7, 0x2a, 0xf8,
+ 0xf, 0xf7, 0x2a, 0x3, 0xf6, 0xf7, 0xb1, 0x15,
+ 0xfb, 0x22, 0xe3, 0xfb, 0x36, 0xf7, 0x69, 0xf7,
+ 0xb1, 0xf7, 0x16, 0xf7, 0x93, 0xf7, 0x55, 0xf7,
+ 0x48, 0xfb, 0x6, 0xf7, 0x14, 0xfb, 0x53, 0xfb,
+ 0xc9, 0x25, 0xfb, 0xaf, 0xfb, 0x3d, 0x1e, 0xf7,
+ 0x2a, 0x16, 0xf7, 0x37, 0xf0, 0xf7, 0x37, 0xf7,
+ 0x29, 0xf7, 0x3, 0xc2, 0x33, 0x2b, 0xfb, 0x9,
+ 0x3b, 0xfb, 0x5f, 0xfb, 0x3c, 0x2a, 0x44, 0xd5,
+ 0xf3, 0x1e, 0xe, 0xab, 0xa0, 0x76, 0xf7, 0xa6,
+ 0xf7, 0xc, 0xf7, 0x60, 0x8b, 0xa, 0xf7, 0x27,
+ 0x6, 0xc4, 0xf7, 0xa6, 0x5, 0xea, 0x6, 0xf7,
+ 0x51, 0xf7, 0x42, 0xba, 0xf7, 0x60, 0xf7, 0x49,
+ 0xfb, 0x3c, 0x97, 0x57, 0x1f, 0xfb, 0xb9, 0x6,
+ 0xdb, 0xfb, 0xd8, 0x15, 0xb6, 0xf7, 0x60, 0x5,
+ 0xf6, 0x6, 0xd6, 0xc9, 0x8d, 0x40, 0xfb, 0xb,
+ 0xfb, 0x19, 0x7f, 0xfb, 0x1, 0x1f, 0xe, 0xf7,
+ 0x23, 0x6c, 0x76, 0xdb, 0xf7, 0xa, 0xf8, 0x6d,
+ 0xf7, 0xa, 0x36, 0xa, 0xf8, 0xc4, 0xc0, 0x15,
+ 0xa4, 0x6b, 0xb3, 0x5e, 0xca, 0x6f, 0xd3, 0xe3,
+ 0x18, 0x67, 0x9e, 0x67, 0xa5, 0x6d, 0xa6, 0x8,
+ 0xf7, 0x4, 0xe1, 0xc0, 0xf7, 0x1b, 0xf7, 0xb,
+ 0x1a, 0xf7, 0x3f, 0xfb, 0x7, 0xf7, 0xa, 0xfb,
+ 0x50, 0xfb, 0xd0, 0x2a, 0xfb, 0xa8, 0xfb, 0x29,
+ 0xfb, 0x1f, 0xe6, 0xfb, 0x25, 0xf7, 0x66, 0xc1,
+ 0xba, 0x92, 0x9d, 0xbe, 0x1e, 0xfb, 0x35, 0xf7,
+ 0x35, 0x15, 0xb8, 0x7b, 0xb0, 0x67, 0x85, 0x1a,
+ 0x81, 0x5a, 0x8b, 0x86, 0x32, 0x3a, 0xbd, 0xf7,
+ 0x8, 0xf7, 0x15, 0xe6, 0xf7, 0x46, 0xf7, 0x33,
+ 0xf7, 0x2, 0xc3, 0x3d, 0x2e, 0x5a, 0x75, 0xfb,
+ 0x9, 0x3c, 0x3f, 0x1e, 0x62, 0xb8, 0x65, 0xa3,
+ 0x65, 0x9d, 0x8, 0xe, 0x68, 0xa, 0xf7, 0xbb,
+ 0xf7, 0x4, 0xf7, 0x53, 0x96, 0xa, 0xf9, 0x25,
+ 0xf7, 0x27, 0x3, 0xd7, 0x16, 0xf7, 0x29, 0x6,
+ 0xca, 0xf7, 0xbb, 0x5, 0xc7, 0x6, 0xb7, 0xa8,
+ 0x8b, 0x5d, 0xab, 0x1f, 0xb5, 0x50, 0xce, 0xfb,
+ 0x50, 0x89, 0x1a, 0xf7, 0x34, 0x6, 0x60, 0xf7,
+ 0x1, 0x51, 0xf7, 0x1f, 0x4b, 0xc4, 0x8, 0xf7,
+ 0x0, 0x9a, 0xf7, 0x5, 0xbe, 0xf7, 0x32, 0x1a,
+ 0xf7, 0x51, 0xfb, 0x36, 0x8b, 0x47, 0x1e, 0xfb,
+ 0xd5, 0x6, 0xde, 0xfb, 0xcb, 0x15, 0xb3, 0xf7,
+ 0x53, 0x5, 0xf7, 0x38, 0x6, 0xbc, 0xcf, 0x8b,
+ 0x44, 0xfb, 0x4, 0xfb, 0x1c, 0x83, 0x21, 0x1f,
+ 0xe, 0xab, 0x78, 0xf7, 0x12, 0xf8, 0x92, 0x96,
+ 0xa, 0xdc, 0xf7, 0x7a, 0x15, 0xfb, 0x53, 0xf7,
+ 0x28, 0x51, 0xf7, 0x24, 0xf7, 0x67, 0xdf, 0xf7,
+ 0x0, 0xf7, 0x0, 0xf7, 0x10, 0x34, 0xc3, 0xfb,
+ 0x14, 0xc2, 0x1e, 0x35, 0xae, 0x59, 0x8e, 0xbf,
+ 0x1a, 0xd8, 0xe7, 0x9d, 0xa5, 0xd1, 0xcd, 0x70,
+ 0x3a, 0x1e, 0xf7, 0x27, 0x92, 0x5, 0xf7, 0x2d,
+ 0xfb, 0x1f, 0xcf, 0xfb, 0x23, 0xfb, 0x65, 0x53,
+ 0xfb, 0x13, 0x33, 0xfb, 0x12, 0xe5, 0x64, 0xf7,
+ 0x15, 0x54, 0x1e, 0xdc, 0x68, 0xb8, 0x79, 0x57,
+ 0x1a, 0x3e, 0x32, 0x7e, 0x57, 0xfb, 0x23, 0x88,
+ 0xce, 0xca, 0x89, 0x1e, 0xe, 0x84, 0xa, 0xf8,
+ 0xe9, 0xf7, 0xd, 0x1, 0xf7, 0x77, 0x16, 0xf7,
+ 0x2d, 0x6, 0xf7, 0x15, 0xf8, 0xe9, 0x5, 0xf7,
+ 0x6c, 0x6, 0xa5, 0xf7, 0xd, 0x5, 0xfc, 0xdd,
+ 0x6, 0x71, 0xfb, 0xd, 0x5, 0xf7, 0x6c, 0x6,
+ 0xe, 0xe2, 0x78, 0xf7, 0x11, 0xf8, 0xf8, 0x77,
+ 0x1, 0xf7, 0x8, 0xf7, 0x2b, 0x3, 0xf7, 0x66,
+ 0xf9, 0x62, 0x15, 0x39, 0xfc, 0x20, 0x5, 0x84,
+ 0x67, 0x86, 0x67, 0x65, 0x1a, 0xfb, 0xd, 0x8c,
+ 0xc1, 0xfb, 0x2, 0xf7, 0x5f, 0x1b, 0xf7, 0xa5,
+ 0xb6, 0xf7, 0x60, 0xf7, 0x1d, 0xa8, 0x1f, 0xe0,
+ 0xf8, 0x20, 0x5, 0xfb, 0x2c, 0x6, 0x36, 0xfc,
+ 0x20, 0x5, 0xfb, 0x11, 0x71, 0x49, 0x30, 0x2d,
+ 0x1b, 0x36, 0x6e, 0xba, 0xc8, 0xb0, 0x8f, 0xb1,
+ 0x92, 0xac, 0x1f, 0xdf, 0xf8, 0x20, 0x5, 0xe,
+ 0xab, 0x37, 0xa, 0xf7, 0xb6, 0x16, 0xf7, 0x26,
+ 0x6, 0xf8, 0x1, 0xf9, 0x62, 0x91, 0xa, 0xfb,
+ 0xa6, 0xfc, 0xb3, 0x51, 0xa, 0x39, 0xf8, 0xb3,
+ 0x5b, 0xa, 0xe, 0xf7, 0xc9, 0x37, 0xa, 0xf7,
+ 0x4a, 0xf7, 0x14, 0xf7, 0xb5, 0xf7, 0x3, 0x3,
+ 0xf7, 0x57, 0x16, 0xf7, 0x26, 0x6, 0xf7, 0x8d,
+ 0xf8, 0xa0, 0x5c, 0xa, 0x9a, 0xfc, 0xa0, 0x8d,
+ 0xa, 0xf7, 0xe0, 0xf9, 0x62, 0x5, 0xfb, 0x1d,
+ 0x6, 0xfb, 0x75, 0xfc, 0x85, 0x51, 0xa, 0x7c,
+ 0xf8, 0x85, 0x5, 0xfb, 0x2e, 0x6, 0xfb, 0x7e,
+ 0xfc, 0x8a, 0x51, 0xa, 0x85, 0xf8, 0x8a, 0x81,
+ 0xa, 0xab, 0x37, 0xa, 0x99, 0x16, 0xf7, 0x49,
+ 0x6, 0xf7, 0x50, 0xf7, 0x7b, 0xf3, 0xfb, 0x7b,
+ 0x5, 0xf7, 0x33, 0x6, 0xfb, 0x3b, 0xf7, 0xe8,
+ 0xf7, 0xcc, 0xf8, 0xe, 0x5, 0xfb, 0x45, 0x6,
+ 0xfb, 0x5f, 0xfb, 0x8b, 0xfb, 0xa, 0xf7, 0x8b,
+ 0x7b, 0xa, 0xf7, 0x3e, 0xfb, 0xf6, 0x5, 0xe,
+ 0xab, 0x37, 0xa, 0xf7, 0x3c, 0xf9, 0x12, 0x3,
+ 0x64, 0xa, 0xf7, 0x9e, 0xf7, 0xcc, 0xf8, 0x58,
+ 0x43, 0xa, 0xfb, 0x5d, 0xfb, 0xc7, 0xfb, 0x10,
+ 0xf7, 0xc7, 0x5a, 0xa, 0xf7, 0x51, 0xfc, 0x4a,
+ 0x5, 0xe, 0x84, 0xa, 0xf8, 0xe9, 0xf7, 0xd,
+ 0x1, 0xa4, 0x16, 0xf8, 0xfb, 0x6, 0xa6, 0xf7,
+ 0x9, 0x5, 0x8a, 0xfc, 0x33, 0x8c, 0x8b, 0x1e,
+ 0xf8, 0x62, 0xf8, 0x7d, 0xa2, 0xf7, 0x4, 0x5,
+ 0xfc, 0xcf, 0x6, 0x6f, 0xfb, 0xd, 0x5, 0xf8,
+ 0x5, 0x6, 0xfc, 0x5b, 0xfc, 0x78, 0x5, 0xe,
+ 0x7f, 0xa, 0xf7, 0x48, 0x35, 0x15, 0xf7, 0x29,
+ 0xf9, 0x4e, 0x5, 0xf7, 0x1, 0x6, 0xa3, 0xf7,
+ 0x2, 0x5, 0xfb, 0x89, 0x6, 0xfb, 0x58, 0xfe,
+ 0x2a, 0x5, 0xf7, 0x89, 0x6, 0xa3, 0xf7, 0x2,
+ 0x5, 0xe, 0xfb, 0xf9, 0x78, 0xa, 0xf7, 0x10,
+ 0xf7, 0x87, 0x3, 0xf7, 0x85, 0x78, 0x15, 0xf7,
+ 0x12, 0x6, 0xfb, 0x7, 0xf9, 0x88, 0x5, 0xfb,
+ 0x14, 0x6, 0xe, 0x7f, 0xa, 0x91, 0x35, 0x15,
+ 0x73, 0xfb, 0x2, 0x5, 0xf7, 0x89, 0x6, 0xf7,
+ 0x58, 0xfa, 0x2a, 0x5, 0xfb, 0x89, 0x6, 0x73,
+ 0xfb, 0x2, 0x5, 0xf7, 0x2, 0x6, 0xfb, 0x29,
+ 0xfd, 0x4e, 0x5, 0xe, 0x58, 0xf7, 0xec, 0x76,
+ 0xf8, 0xb, 0x77, 0x1, 0xf7, 0x17, 0xf7, 0xd7,
+ 0x15, 0xf7, 0x1c, 0x6, 0xe9, 0xf7, 0x79, 0xea,
+ 0xfb, 0x79, 0x5, 0x82, 0xa, 0xfb, 0x42, 0xf8,
+ 0xb, 0x5, 0x20, 0x6, 0xe, 0x3c, 0xfb, 0x11,
+ 0xbd, 0x1, 0x70, 0x40, 0x15, 0x59, 0xf8, 0xcb,
+ 0xbd, 0x7, 0xe, 0x72, 0xa, 0xf7, 0x8c, 0xf8,
+ 0xf0, 0x15, 0xf4, 0x6, 0x47, 0xf7, 0x26, 0x53,
+ 0xa, 0xe, 0x42, 0xa, 0xf7, 0xf1, 0xf2, 0x76,
+ 0xa, 0xf8, 0x1a, 0x89, 0x2f, 0xa, 0x13, 0xb0,
+ 0x99, 0xa, 0xaa, 0xb2, 0x1a, 0xab, 0x7c, 0xf7,
+ 0x3, 0x33, 0xa, 0x80, 0x5, 0xb8, 0x98, 0xb1,
+ 0x9b, 0xb8, 0x1b, 0xce, 0xa8, 0x5a, 0x55, 0x70,
+ 0x1f, 0x6c, 0x80, 0x54, 0x86, 0x50, 0x86, 0x8,
+ 0x42, 0x86, 0xfb, 0x2f, 0x81, 0xfb, 0x34, 0x1a,
+ 0x28, 0xd6, 0x50, 0xe1, 0x1e, 0x30, 0xa, 0x99,
+ 0xf7, 0x8a, 0x15, 0x60, 0x81, 0x77, 0x20, 0x20,
+ 0x1b, 0x5a, 0x77, 0xa1, 0xa7, 0xca, 0xdc, 0xa2,
+ 0xe7, 0x97, 0x1f, 0xe, 0x73, 0x7d, 0xf6, 0x41,
+ 0x76, 0xf8, 0x45, 0xf0, 0xf7, 0x4e, 0x77, 0x12,
+ 0xf7, 0x67, 0xf7, 0x18, 0xf7, 0x36, 0xf7, 0x20,
+ 0x13, 0x7c, 0xc8, 0x89, 0x15, 0xf7, 0x18, 0x6,
+ 0x9d, 0xe1, 0x5c, 0xa, 0x13, 0xb4, 0x73, 0x96,
+ 0xb4, 0x41, 0xf7, 0x7, 0x1b, 0xf7, 0x25, 0xf7,
+ 0xc, 0xf7, 0x23, 0xf7, 0x4f, 0xf7, 0x5, 0x57,
+ 0xf2, 0xfb, 0x1b, 0x42, 0x5f, 0x6c, 0x73, 0x6b,
+ 0x1f, 0xbe, 0xf7, 0x85, 0x44, 0xa, 0x13, 0x74,
+ 0xb3, 0xfc, 0x90, 0x15, 0xf7, 0x3, 0xc4, 0xf7,
+ 0x2, 0xe6, 0xc1, 0xba, 0x60, 0x3f, 0x1e, 0x13,
+ 0xb4, 0x38, 0x5e, 0xfb, 0x1c, 0x25, 0x4c, 0x64,
+ 0xc5, 0xc6, 0x1e, 0xe, 0x3c, 0x7d, 0xf7, 0x5,
+ 0xf7, 0xe8, 0xf6, 0x1, 0xda, 0xf7, 0x23, 0x3,
+ 0xf8, 0x38, 0xf7, 0x5b, 0x15, 0x36, 0x6d, 0x4f,
+ 0x7c, 0x70, 0x1b, 0x63, 0x62, 0xb2, 0xd0, 0xe0,
+ 0xb3, 0xf7, 0x27, 0xf7, 0x5, 0xd7, 0x93, 0x48,
+ 0x77, 0x8d, 0x1f, 0xf7, 0x1e, 0x9a, 0x5, 0xe3,
+ 0x83, 0x4d, 0xe6, 0xfb, 0x25, 0x1b, 0xfb, 0x4b,
+ 0xfb, 0xe, 0xfb, 0x2f, 0xfb, 0x4c, 0xfb, 0x4,
+ 0xc6, 0xfb, 0x1, 0xf7, 0x36, 0xf7, 0x16, 0xe3,
+ 0xd6, 0xf7, 0x8, 0xb6, 0x1f, 0xe, 0x73, 0x7d,
+ 0xf6, 0x2c, 0xea, 0xf7, 0xde, 0xf7, 0x1, 0xf7,
+ 0x4e, 0x77, 0x12, 0x13, 0x70, 0xf8, 0x38, 0x89,
+ 0x15, 0xf7, 0x17, 0x6, 0xf7, 0x2d, 0xf9, 0x64,
+ 0x47, 0xa, 0x52, 0xfb, 0xa1, 0x5, 0x9e, 0x7e,
+ 0x62, 0xcb, 0x20, 0x1b, 0xfb, 0x32, 0x24, 0xfb,
+ 0x34, 0xfb, 0x3c, 0x1f, 0x13, 0xb0, 0xfb, 0x20,
+ 0xd1, 0x3d, 0xf7, 0x6, 0xe1, 0xbe, 0xb3, 0xa7,
+ 0xa6, 0x1e, 0x8d, 0x89, 0x5, 0x13, 0x70, 0xfb,
+ 0x67, 0xf7, 0x2c, 0x15, 0xe7, 0xbe, 0xf7, 0x13,
+ 0xe7, 0xc8, 0xb4, 0x54, 0x49, 0x3f, 0x62, 0xfb,
+ 0x19, 0x22, 0x4b, 0x68, 0xba, 0xcb, 0x1e, 0xe,
+ 0x3c, 0xf7, 0x71, 0xe3, 0xf7, 0x1a, 0xf2, 0x7d,
+ 0xa, 0xf7, 0x68, 0xf7, 0x71, 0x15, 0xf8, 0x8,
+ 0x6, 0x93, 0xae, 0x8c, 0xb8, 0x99, 0x1a, 0xf0,
+ 0x5e, 0xf7, 0x16, 0xfb, 0x41, 0xfb, 0x6d, 0x33,
+ 0xfb, 0x53, 0xfb, 0x1a, 0xfb, 0x24, 0xeb, 0x30,
+ 0xf7, 0x2c, 0xd7, 0xf7, 0x0, 0xa6, 0xf7, 0x15,
+ 0xcc, 0x1e, 0xfb, 0x19, 0xa0, 0x5, 0x7b, 0x82,
+ 0x6b, 0x51, 0x41, 0x1b, 0x4e, 0x59, 0xbc, 0xde,
+ 0x8f, 0x1f, 0x9a, 0xe3, 0x15, 0xbd, 0x96, 0xaf,
+ 0xdf, 0xe0, 0x1b, 0xd8, 0xa5, 0x4c, 0x44, 0x88,
+ 0x1f, 0xe, 0xa0, 0x76, 0xf8, 0x33, 0xf1, 0xf7,
+ 0x66, 0x77, 0x1, 0xe2, 0x16, 0xf7, 0x15, 0x6,
+ 0xda, 0xf8, 0x33, 0x5, 0xe6, 0x6, 0x9f, 0xf1,
+ 0x5, 0x30, 0x6, 0xda, 0x99, 0x91, 0xa4, 0xae,
+ 0x1b, 0x98, 0xa6, 0x86, 0x7e, 0xad, 0x1f, 0xa4,
+ 0xf0, 0x5, 0x9c, 0x5a, 0x5e, 0x91, 0x6d, 0x1b,
+ 0xfb, 0xa, 0x80, 0x28, 0xfb, 0x3, 0x6d, 0x1f,
+ 0x44, 0x6, 0x76, 0x25, 0x5, 0xd4, 0x6, 0xe,
+ 0x73, 0xfb, 0x6d, 0xf2, 0xf7, 0x3, 0xf6, 0xf7,
+ 0xe7, 0xf2, 0x7e, 0x77, 0x12, 0x13, 0xd0, 0xb1,
+ 0x6e, 0x15, 0xfb, 0x46, 0xf7, 0x40, 0x81, 0xca,
+ 0xf7, 0x7b, 0xa3, 0xf6, 0xf7, 0x5a, 0xb5, 0x1e,
+ 0xeb, 0xf8, 0x51, 0x3d, 0xa, 0x78, 0x2d, 0x51,
+ 0xa, 0x13, 0xe0, 0xd3, 0x68, 0x48, 0xae, 0x46,
+ 0x1b, 0xfb, 0x1d, 0xfb, 0x14, 0x20, 0xfb, 0x65,
+ 0xfb, 0x3d, 0xf2, 0x4b, 0xdd, 0xde, 0xc2, 0xb7,
+ 0x9e, 0x9f, 0x1f, 0x8d, 0x89, 0x5, 0xfb, 0x8,
+ 0x74, 0x80, 0x53, 0x24, 0x1b, 0x44, 0x80, 0xae,
+ 0xa7, 0x8d, 0x1f, 0x9d, 0xf7, 0xac, 0x15, 0xc5,
+ 0xb3, 0xf7, 0x30, 0xf4, 0xcb, 0xb4, 0x4d, 0x4a,
+ 0x2b, 0x53, 0xfb, 0x8, 0x2c, 0x51, 0x62, 0xb9,
+ 0xda, 0x1e, 0xe, 0x84, 0xa, 0xf8, 0x44, 0xef,
+ 0xf7, 0x4e, 0x77, 0x1, 0xf8, 0x76, 0xf7, 0x27,
+ 0x3, 0xcc, 0x16, 0x7c, 0xa, 0xb7, 0xf7, 0x62,
+ 0x5, 0xf4, 0xa2, 0xb2, 0xf7, 0xd, 0xf6, 0x1b,
+ 0xba, 0x98, 0x6f, 0x69, 0x76, 0x87, 0x74, 0x86,
+ 0x75, 0x1f, 0x49, 0xfb, 0xc4, 0x5, 0x7c, 0xa,
+ 0xcc, 0xf7, 0xc4, 0x5, 0x91, 0xa7, 0x92, 0xaf,
+ 0xae, 0x1a, 0xcd, 0x6f, 0xca, 0xfb, 0x3, 0x30,
+ 0x51, 0x5d, 0x73, 0x6b, 0x1e, 0xc1, 0xf7, 0x94,
+ 0x44, 0xa, 0xe, 0x48, 0xa, 0xf8, 0xa1, 0x77,
+ 0xe7, 0xf7, 0x14, 0x1, 0xd0, 0x16, 0x9b, 0xa,
+ 0xf7, 0x1, 0xf8, 0xa1, 0x92, 0xa, 0x9b, 0xd3,
+ 0x15, 0x9b, 0xa, 0xa6, 0xf7, 0x14, 0x92, 0xa,
+ 0xe, 0xfb, 0xf9, 0xfb, 0x55, 0x76, 0x1, 0x75,
+ 0x3a, 0x15, 0x77, 0xfb, 0xa, 0x5, 0x7c, 0xb6,
+ 0xb8, 0x8b, 0x94, 0x1b, 0xf7, 0xe, 0xb1, 0xf7,
+ 0x31, 0xf7, 0x1d, 0xa5, 0x1f, 0xdf, 0xf8, 0x51,
+ 0x5, 0xfb, 0x16, 0x6, 0x3a, 0xfc, 0x51, 0x5,
+ 0xfb, 0x30, 0x6c, 0x7e, 0x7e, 0x63, 0x1b, 0x80,
+ 0x7a, 0x8c, 0x92, 0x73, 0x1f, 0xf7, 0x7b, 0xf9,
+ 0x3a, 0x15, 0xf7, 0x16, 0x6, 0xa3, 0xf7, 0x14,
+ 0x5, 0xfb, 0x16, 0x6, 0xe, 0x3c, 0x37, 0xa,
+ 0xd0, 0x16, 0xf7, 0x26, 0x6, 0xae, 0xf7, 0x31,
+ 0xed, 0xdf, 0xd6, 0xfb, 0x85, 0x5, 0xf7, 0x26,
+ 0x6, 0xfb, 0x8, 0xf7, 0xdf, 0xf7, 0x6d, 0xf7,
+ 0x51, 0x5, 0xfb, 0x52, 0x6, 0xfb, 0x50, 0xfb,
+ 0x44, 0x89, 0x8d, 0xdd, 0xf8, 0x8, 0x93, 0xa,
+ 0xe, 0xfb, 0xf9, 0x37, 0xa, 0x8a, 0xa, 0xf7,
+ 0x2c, 0xf9, 0x62, 0x65, 0xa, 0xf7, 0x92, 0xa0,
+ 0x76, 0xf8, 0x4f, 0xf2, 0x1, 0xcb, 0x16, 0xf7,
+ 0x23, 0x6, 0xbe, 0xf7, 0x89, 0x5, 0xdf, 0x9d,
+ 0xa1, 0xf7, 0x6, 0xf2, 0x1b, 0xb5, 0x96, 0x75,
+ 0x6e, 0x78, 0x87, 0x75, 0x87, 0x77, 0x1f, 0x45,
+ 0xfb, 0xdf, 0x5, 0x7c, 0xa, 0xbe, 0xf7, 0x86,
+ 0x5, 0xd2, 0x98, 0xaf, 0xf7, 0x16, 0xed, 0x1b,
+ 0xae, 0x94, 0x68, 0x68, 0x7a, 0x89, 0x7a, 0x88,
+ 0x7e, 0x1f, 0x47, 0xfb, 0xda, 0x8d, 0xa, 0xd0,
+ 0xf7, 0xda, 0x5, 0x8f, 0xa5, 0x8f, 0xa6, 0xa5,
+ 0x1a, 0xd5, 0x72, 0xce, 0x23, 0x3a, 0x44, 0x5e,
+ 0x59, 0x6a, 0x1e, 0xe1, 0x7b, 0x40, 0x94, 0x60,
+ 0x1b, 0x38, 0x61, 0x77, 0x54, 0x63, 0x1f, 0x99,
+ 0xc9, 0x91, 0xa, 0xe, 0x84, 0xa, 0xf8, 0x4f,
+ 0xe5, 0x31, 0xf2, 0x12, 0x13, 0xa0, 0xcc, 0x16,
+ 0x7c, 0xa, 0xba, 0xf7, 0x6f, 0x5, 0xf3, 0xa1,
+ 0xa7, 0xf7, 0xc, 0xf7, 0x9, 0x1b, 0xb7, 0x9b,
+ 0x6a, 0x76, 0x6d, 0x84, 0x6d, 0x86, 0x71, 0x1f,
+ 0x4b, 0xfb, 0xc3, 0x5, 0xf7, 0x25, 0x6, 0xcb,
+ 0xf7, 0xc2, 0x5, 0x92, 0xad, 0x91, 0xb3, 0xb0,
+ 0x1a, 0xd2, 0x6c, 0xc9, 0xfb, 0x0, 0x34, 0x4f,
+ 0x5f, 0x65, 0x61, 0x1e, 0x89, 0x8d, 0x5, 0x13,
+ 0xc0, 0x99, 0xce, 0x5b, 0xa, 0xe, 0x73, 0x7d,
+ 0xf7, 0x2, 0xf7, 0xe8, 0xf7, 0x2, 0x3f, 0xa,
+ 0xdd, 0xf7, 0x71, 0x15, 0xfb, 0x11, 0xde, 0xfb,
+ 0x2, 0x38, 0xa, 0xf7, 0x37, 0x26, 0xa, 0xe,
+ 0x73, 0xfb, 0x4e, 0x76, 0xf7, 0x54, 0xf7, 0x4,
+ 0xf7, 0xe8, 0xeb, 0x2b, 0xf7, 0x1, 0x12, 0xf8,
+ 0x8d, 0xf7, 0x20, 0x13, 0xd8, 0x9d, 0xfb, 0x63,
+ 0x15, 0x7c, 0xa, 0xc5, 0xf7, 0xaa, 0x5, 0x77,
+ 0x98, 0xb4, 0x49, 0xf6, 0x1b, 0xf7, 0x34, 0xf3,
+ 0xf7, 0x32, 0xf7, 0x41, 0xf7, 0x23, 0x44, 0xe2,
+ 0xfb, 0x6, 0x34, 0x58, 0x62, 0x6e, 0x6f, 0x1f,
+ 0x89, 0x8d, 0x5, 0x13, 0xe8, 0x96, 0xc2, 0x5,
+ 0xfb, 0x18, 0x6, 0xe2, 0xfb, 0xcb, 0x15, 0xd8,
+ 0xb4, 0xf7, 0x1e, 0xf5, 0xcc, 0xae, 0x54, 0x49,
+ 0x2d, 0x58, 0xfb, 0x11, 0x2e, 0x4d, 0x62, 0xc3,
+ 0xd0, 0x1e, 0xe, 0x73, 0xfb, 0x4e, 0x76, 0xf7,
+ 0x54, 0xf2, 0xf7, 0xf1, 0xf7, 0x1, 0x7e, 0x77,
+ 0x12, 0xdb, 0xf7, 0x21, 0x13, 0xd8, 0xf8, 0x2,
+ 0xfb, 0x63, 0x15, 0xf7, 0x25, 0x6, 0xf7, 0x2e,
+ 0xf9, 0x78, 0x66, 0xa, 0x79, 0x34, 0x51, 0xa,
+ 0x13, 0xe8, 0xa3, 0x7f, 0x62, 0xd7, 0xfb, 0x7,
+ 0x1b, 0xfb, 0x26, 0xfb, 0xc, 0xfb, 0x27, 0xfb,
+ 0x54, 0xfb, 0x9, 0xbf, 0x22, 0xf7, 0x1b, 0xd5,
+ 0xb7, 0xab, 0xa4, 0xac, 0x1f, 0xfb, 0x59, 0xf7,
+ 0x39, 0x15, 0xe0, 0xb7, 0xf7, 0x25, 0xf2, 0xca,
+ 0xb2, 0x4f, 0x4e, 0xfb, 0x6, 0x52, 0xfb, 0x6,
+ 0x30, 0x54, 0x5d, 0xb4, 0xd9, 0x1e, 0xe, 0xfb,
+ 0x8a, 0xa0, 0x76, 0xf8, 0x30, 0xf7, 0xd, 0xfb,
+ 0xd, 0xf7, 0x1a, 0x12, 0xd7, 0xf8, 0x3d, 0x13,
+ 0xb0, 0xcb, 0x16, 0x82, 0xa, 0xab, 0xf7, 0x3c,
+ 0xa6, 0xf7, 0x17, 0xa2, 0xf7, 0x13, 0xf7, 0x30,
+ 0x7d, 0x19, 0xbf, 0xf7, 0xb, 0x5, 0x91, 0x7e,
+ 0x76, 0x94, 0x6e, 0x1b, 0x49, 0x59, 0x51, 0x51,
+ 0x69, 0x1f, 0x89, 0x8d, 0x5, 0x13, 0xc0, 0x9f,
+ 0xf0, 0x5, 0xfb, 0x12, 0x6, 0xe, 0x3c, 0x7d,
+ 0xef, 0xf7, 0xfc, 0xef, 0x1, 0xca, 0xf7, 0x28,
+ 0x15, 0xfb, 0x7, 0xab, 0xe5, 0x5c, 0xf7, 0x17,
+ 0x1b, 0xf7, 0x48, 0xc0, 0xf7, 0x8, 0xd3, 0xf4,
+ 0x20, 0xab, 0x3f, 0xa3, 0x1f, 0x44, 0xa0, 0x71,
+ 0x93, 0xab, 0x1a, 0xa5, 0xa3, 0xa3, 0xc4, 0x9b,
+ 0xd0, 0x8b, 0x4b, 0xa0, 0x1e, 0xf7, 0x14, 0xa3,
+ 0x5, 0xf7, 0x11, 0x70, 0xfb, 0x6, 0x9a, 0x44,
+ 0x1b, 0xfb, 0x32, 0x42, 0x46, 0x38, 0x35, 0xd7,
+ 0x4f, 0xe2, 0x6c, 0x1f, 0xe9, 0x69, 0x95, 0x85,
+ 0x6e, 0x1a, 0x67, 0x5d, 0x71, 0x5a, 0x41, 0x71,
+ 0xb3, 0xb8, 0x7b, 0x1e, 0xe, 0x9a, 0x76, 0xf8,
+ 0x2c, 0xee, 0xf7, 0x43, 0x77, 0x1, 0xf7, 0xda,
+ 0x85, 0x15, 0xa2, 0xf1, 0x5, 0x87, 0x25, 0x76,
+ 0x9b, 0xc7, 0x1f, 0x70, 0x6f, 0x91, 0xa8, 0x91,
+ 0x1f, 0xc5, 0xf7, 0xa8, 0x5, 0xe3, 0x6, 0xa1,
+ 0xee, 0x5, 0x33, 0x6, 0xb1, 0xf7, 0x43, 0xfb,
+ 0x37, 0x2c, 0x7a, 0x3b, 0x5, 0x45, 0x6, 0x75,
+ 0x28, 0x5, 0xd0, 0x6, 0x8b, 0x4c, 0xfb, 0xb2,
+ 0x73, 0x1a, 0x2e, 0xf7, 0x1b, 0x86, 0xe0, 0x1e,
+ 0xe, 0x59, 0xa, 0xf8, 0x4f, 0x77, 0x12, 0xed,
+ 0xf7, 0x27, 0x13, 0x70, 0xf8, 0x31, 0x89, 0x15,
+ 0xf7, 0x1a, 0x6, 0xf7, 0x3, 0xf8, 0xaa, 0x44,
+ 0xa, 0x57, 0xfb, 0x91, 0x5, 0x46, 0x72, 0x82,
+ 0xfb, 0xd, 0xfb, 0xe, 0x1b, 0x5d, 0x7c, 0xb0,
+ 0xb4, 0x9c, 0x8f, 0x9c, 0x8f, 0x9a, 0x1f, 0xcd,
+ 0xf7, 0xd0, 0x47, 0xa, 0x4a, 0xfb, 0xd0, 0x5,
+ 0x85, 0x6f, 0x84, 0x67, 0x67, 0x1a, 0x13, 0xb0,
+ 0x47, 0xa5, 0x4d, 0xf7, 0x5, 0xcf, 0xce, 0xa9,
+ 0xc1, 0xc2, 0x1e, 0x8c, 0x89, 0x5, 0xe, 0x3c,
+ 0x79, 0xa, 0xf7, 0x78, 0x16, 0xf7, 0x9, 0x6,
+ 0xf7, 0xcb, 0xf8, 0xa8, 0x7b, 0xa, 0xfb, 0x57,
+ 0xfb, 0xf8, 0x51, 0xa, 0x57, 0xf7, 0xf8, 0x5,
+ 0xfb, 0x1a, 0x6, 0xe, 0xf7, 0x23, 0x79, 0xa,
+ 0xf8, 0x79, 0xe5, 0x3, 0xf7, 0x4f, 0x16, 0xf7,
+ 0x15, 0x6, 0xf7, 0x2f, 0xf7, 0xea, 0x5c, 0xa,
+ 0xa3, 0xfb, 0xea, 0x5, 0xf7, 0x16, 0x6, 0xf7,
+ 0x93, 0xf8, 0xa8, 0x54, 0xa, 0xfb, 0x32, 0xfb,
+ 0xf7, 0x51, 0xa, 0x7a, 0xf7, 0xf7, 0x5, 0xfb,
+ 0x12, 0x6, 0xfb, 0x33, 0xfb, 0xf7, 0x51, 0xa,
+ 0x69, 0xf7, 0xf7, 0x5, 0xfb, 0xf, 0x6, 0xe,
+ 0x3c, 0x79, 0xa, 0x9a, 0x16, 0xf7, 0x3f, 0x6,
+ 0xf7, 0x16, 0xf7, 0x2b, 0xd4, 0xfb, 0x2b, 0x5,
+ 0xf7, 0x29, 0x6, 0xfb, 0x17, 0xf7, 0x97, 0xf7,
+ 0x85, 0xf7, 0xa5, 0x5, 0xfb, 0x3e, 0x6, 0xfb,
+ 0x18, 0xfb, 0x28, 0x41, 0xf7, 0x28, 0x53, 0xa,
+ 0xf7, 0x18, 0xfb, 0x96, 0x5, 0xe, 0x3c, 0xfb,
+ 0x6a, 0xf7, 0x9, 0xf9, 0x9, 0x77, 0x1, 0xc2,
+ 0x34, 0x15, 0x7e, 0xfb, 0x0, 0x5, 0x7e, 0xad,
+ 0xaa, 0x85, 0xa6, 0x1b, 0xe2, 0xc5, 0xcd, 0xf0,
+ 0xc3, 0x1f, 0xf7, 0xd1, 0xf8, 0xd7, 0x77, 0xa,
+ 0xfc, 0x27, 0x51, 0xa, 0x59, 0xf8, 0x27, 0x54,
+ 0xa, 0xe5, 0xfc, 0xa3, 0x5, 0x4c, 0x6f, 0x6c,
+ 0x64, 0x5c, 0x1b, 0x7d, 0x7b, 0x8e, 0x92, 0x79,
+ 0x1f, 0xe, 0xfb, 0x1b, 0x8b, 0xf7, 0xa, 0xf7,
+ 0xc1, 0xf7, 0x5, 0x1, 0x9f, 0x16, 0xf8, 0x70,
+ 0x6, 0xa5, 0xf7, 0xa, 0x5, 0xfb, 0xac, 0x6,
+ 0xf7, 0xd6, 0xf7, 0xdc, 0x9e, 0xe1, 0x5, 0xfc,
+ 0x5c, 0x6, 0x71, 0xfb, 0x5, 0x5, 0xf7, 0x98,
+ 0x6, 0xfb, 0xd3, 0xfb, 0xd5, 0x5, 0xe, 0x73,
+ 0xa, 0xf7, 0xb2, 0xf7, 0x7, 0x1, 0x14, 0xe0,
+ 0xe9, 0xf7, 0x61, 0x15, 0xef, 0x79, 0x3f, 0xfb,
+ 0x4, 0x74, 0x1f, 0xfb, 0x2f, 0x69, 0xb1, 0x51,
+ 0xf7, 0x1e, 0x1b, 0xa3, 0x6, 0xa3, 0xf7, 0x7,
+ 0x5, 0x49, 0x72, 0x8e, 0xcc, 0x98, 0x1f, 0xb4,
+ 0xf7, 0x4e, 0x82, 0xbd, 0x52, 0xb3, 0xd3, 0xb5,
+ 0xa8, 0xac, 0xb7, 0xf7, 0x5c, 0x8, 0xcb, 0x98,
+ 0xa0, 0x90, 0xd6, 0x1b, 0xa3, 0xf7, 0x7, 0x5,
+ 0x73, 0x6, 0xfb, 0x50, 0x77, 0x32, 0xfb, 0x23,
+ 0x6c, 0x1f, 0xfb, 0x9, 0x72, 0x7f, 0x57, 0x27,
+ 0x1b, 0xe, 0xfb, 0xf7, 0xfb, 0x50, 0x76, 0xfa,
+ 0x46, 0x77, 0x1, 0xbd, 0xfb, 0x65, 0x15, 0xf7,
+ 0x3, 0x6, 0xf7, 0x5e, 0xfa, 0x46, 0x5, 0xfb,
+ 0x3, 0x6, 0xe, 0x73, 0xa, 0xf8, 0x25, 0x77,
+ 0x1, 0x93, 0x3a, 0x15, 0x71, 0xfb, 0x7, 0x5,
+ 0xf7, 0x66, 0x9f, 0xe4, 0xf7, 0x23, 0xac, 0x1f,
+ 0xf7, 0x9, 0xa5, 0xa8, 0xbf, 0xdd, 0x1b, 0xa4,
+ 0xf7, 0x8, 0x5, 0x29, 0x9c, 0xd7, 0xf7, 0x4,
+ 0xa4, 0x1f, 0x94, 0xae, 0x8e, 0xa9, 0xa5, 0x1a,
+ 0xe3, 0x59, 0xad, 0xfb, 0x10, 0x1e, 0x71, 0xfb,
+ 0x7, 0x5, 0xc0, 0xa6, 0x89, 0x67, 0x83, 0x8a,
+ 0x82, 0x88, 0x7e, 0x1f, 0x61, 0xfb, 0x4e, 0x94,
+ 0x59, 0xc4, 0x63, 0x41, 0x61, 0x6e, 0x6a, 0x5f,
+ 0xfb, 0x5c, 0x8, 0x4b, 0x7c, 0x77, 0x86, 0x42,
+ 0x1b, 0xe, 0x58, 0xf7, 0x4d, 0x76, 0xf7, 0x47,
+ 0x77, 0x1, 0xf7, 0x7, 0xf8, 0x62, 0x3, 0xf7,
+ 0x7, 0xf7, 0x37, 0x15, 0xc2, 0xbf, 0xb3, 0x91,
+ 0xa6, 0x1b, 0xbc, 0xab, 0x7d, 0x7c, 0xa9, 0x1f,
+ 0x7b, 0xaa, 0xa9, 0x7c, 0xb4, 0x1b, 0xd0, 0xbf,
+ 0xbc, 0x95, 0x94, 0x1f, 0xf7, 0xc, 0x7, 0x4d,
+ 0x53, 0x56, 0x89, 0x81, 0x1b, 0x69, 0x6d, 0x97,
+ 0x98, 0x6e, 0x1f, 0x9b, 0x64, 0x66, 0x9e, 0x5d,
+ 0x1b, 0x75, 0x57, 0x8b, 0x4e, 0x55, 0x1f, 0xe,
+ 0xe2, 0x8b, 0xf7, 0xc, 0xf8, 0x6f, 0xf7, 0xf,
+ 0x1, 0xf7, 0x8, 0xf7, 0x1f, 0x3, 0x9f, 0xf7,
+ 0x94, 0x15, 0xeb, 0x6, 0xfb, 0x32, 0x9a, 0xec,
+ 0x29, 0xf7, 0x4b, 0x1b, 0xbb, 0xba, 0x93, 0x9a,
+ 0xb9, 0x1f, 0xaf, 0xf7, 0x25, 0x5, 0x6b, 0x5c,
+ 0x53, 0x7b, 0x4c, 0x1b, 0x38, 0x3a, 0xca, 0xd4,
+ 0x88, 0x1f, 0xf7, 0xda, 0x6, 0x9b, 0xd4, 0x5,
+ 0xfb, 0xe7, 0x6, 0x8f, 0xaa, 0x90, 0xa1, 0x8d,
+ 0x94, 0x8, 0xf7, 0xe9, 0x6, 0x9b, 0xd4, 0x5,
+ 0xfb, 0xdf, 0x6, 0xe2, 0xb9, 0xdb, 0xb7, 0xeb,
+ 0x1b, 0xc4, 0xb5, 0x81, 0x6a, 0xa6, 0x1f, 0xc6,
+ 0x55, 0xa, 0xa8, 0x5a, 0x4e, 0x9a, 0x43, 0x1b,
+ 0xfb, 0x49, 0xfb, 0x20, 0x23, 0xfb, 0x2a, 0x54,
+ 0x1f, 0xfb, 0x0, 0x6, 0x7b, 0x42, 0x5, 0xf4,
+ 0x6, 0x87, 0x71, 0x89, 0x76, 0x8a, 0x7c, 0x8,
+ 0x39, 0x6, 0xe, 0xfb, 0xf9, 0xfb, 0x11, 0x76,
+ 0xf7, 0x3a, 0x76, 0xf7, 0x14, 0x77, 0x1, 0xd3,
+ 0x8a, 0x15, 0xc9, 0x6, 0x7e, 0x52, 0x73, 0x7a,
+ 0x60, 0x82, 0x7e, 0x4d, 0x18, 0xf7, 0x1d, 0x3e,
+ 0xa, 0xfb, 0x1d, 0x6, 0xe, 0x3c, 0xfb, 0x51,
+ 0x76, 0xf9, 0xcf, 0x96, 0xa, 0x88, 0x3b, 0x15,
+ 0x5c, 0xfb, 0x3, 0x5, 0x7d, 0xb6, 0xc5, 0x86,
+ 0xaa, 0x1b, 0xf7, 0x15, 0xbb, 0xf7, 0xf, 0xd9,
+ 0xa6, 0x1f, 0xf7, 0x27, 0xf8, 0x3e, 0x5, 0xef,
+ 0x6, 0xae, 0xf4, 0x5, 0x27, 0x6, 0xcd, 0xa2,
+ 0x96, 0xa8, 0xba, 0x1b, 0xa9, 0xa9, 0x81, 0x87,
+ 0x98, 0x1f, 0xba, 0xf7, 0x5, 0x5, 0x9e, 0x50,
+ 0x52, 0x8d, 0x80, 0x1b, 0xfb, 0x1e, 0x7b, 0x35,
+ 0xfb, 0x15, 0x51, 0x1f, 0x2a, 0x6, 0x67, 0x22,
+ 0x5, 0xed, 0x6, 0xfb, 0x26, 0xfc, 0x3c, 0x5,
+ 0x4f, 0x77, 0x75, 0x72, 0x6b, 0x1b, 0x77, 0x78,
+ 0x8d, 0x95, 0x64, 0x1f, 0xe, 0xfb, 0x1b, 0xfb,
+ 0x11, 0x76, 0xf7, 0x25, 0xf7, 0x14, 0x1, 0xf7,
+ 0xbd, 0x8a, 0x61, 0xa, 0xf7, 0x1f, 0x3e, 0xa,
+ 0xfb, 0x1e, 0x6, 0xfb, 0x96, 0xfb, 0x14, 0x61,
+ 0xa, 0x56, 0xa, 0xe, 0xf8, 0x1, 0x8b, 0xf7,
+ 0x26, 0x1, 0xf9, 0x92, 0x16, 0x4b, 0xa, 0xfd,
+ 0x53, 0xfb, 0x26, 0x15, 0x4b, 0xa, 0xf7, 0xc8,
+ 0xfb, 0x26, 0x15, 0x4b, 0xa, 0xe, 0x3c, 0xfb,
+ 0x2a, 0x76, 0xf8, 0xdb, 0xf7, 0x3, 0xf7, 0x57,
+ 0x77, 0x1, 0xf7, 0x45, 0xfb, 0x3f, 0x15, 0xf7,
+ 0x18, 0x6, 0xf7, 0xc, 0xf8, 0xdb, 0x5, 0xf7,
+ 0x42, 0x6, 0xa2, 0xf7, 0x3, 0x5, 0xfb, 0x43,
+ 0x6, 0xb4, 0xf7, 0x57, 0x66, 0xa, 0x62, 0xfb,
+ 0x57, 0x5, 0xfb, 0x48, 0x6, 0x75, 0xfb, 0x3,
+ 0x5, 0xf7, 0x48, 0x6, 0xe, 0x3c, 0xfb, 0x2a,
+ 0x76, 0xf7, 0x42, 0xf7, 0x3, 0xf7, 0xd7, 0xf7,
+ 0x3, 0xf7, 0x3e, 0x77, 0x1, 0xb9, 0x8e, 0x15,
+ 0xf7, 0x43, 0x6, 0x69, 0xfb, 0x42, 0x5, 0xf7,
+ 0x14, 0x6, 0xad, 0xf7, 0x42, 0x5, 0xf7, 0x3d,
+ 0x89, 0xa, 0xcc, 0xf7, 0xd7, 0x5, 0xf7, 0x3e,
+ 0x89, 0xa, 0xac, 0xf7, 0x3e, 0x5, 0xfb, 0x13,
+ 0x6, 0x69, 0xfb, 0x3e, 0x5, 0xfb, 0x44, 0x6,
+ 0x75, 0xfb, 0x3, 0x5, 0xf7, 0x43, 0x6, 0x4b,
+ 0xfb, 0xd7, 0x5, 0xfb, 0x44, 0x6, 0xe, 0x72,
+ 0xa, 0xf7, 0xa, 0xf8, 0xf0, 0x8f, 0xa, 0xe4,
+ 0xe1, 0xb3, 0x35, 0x5, 0xf1, 0x6, 0x4c, 0xf7,
+ 0x26, 0x81, 0xa, 0xf8, 0x1, 0x7a, 0xdb, 0x4e,
+ 0x76, 0xf9, 0x1d, 0xdb, 0x12, 0x13, 0x60, 0xf7,
+ 0x3e, 0xf8, 0x6f, 0x15, 0x9b, 0xa1, 0xf7, 0x1f,
+ 0xc3, 0x9b, 0x9e, 0x76, 0x6e, 0x75, 0x77, 0xfb,
+ 0x17, 0x4f, 0x6a, 0x8b, 0xaa, 0x9c, 0x1e, 0x47,
+ 0xfc, 0x82, 0x15, 0xed, 0x6, 0xf8, 0x6a, 0xf9,
+ 0x6d, 0x5, 0x26, 0x6, 0xfc, 0x81, 0xfb, 0x7f,
+ 0x15, 0xfb, 0x1, 0xd3, 0x79, 0xba, 0xf7, 0x1c,
+ 0xb8, 0xf7, 0x36, 0xd1, 0xb5, 0x79, 0xe3, 0x21,
+ 0xfb, 0x2f, 0x76, 0xfb, 0x6b, 0x77, 0x1e, 0xf7,
+ 0xd7, 0xfc, 0x1, 0x15, 0x13, 0xa0, 0xfb, 0x1,
+ 0xd1, 0x79, 0xbb, 0xf7, 0x1c, 0xb8, 0xf7, 0x3e,
+ 0xd0, 0xb5, 0x79, 0xdc, 0x21, 0x74, 0xa, 0xa1,
+ 0xf7, 0x1f, 0xc3, 0x9a, 0x9e, 0x7e, 0x6d, 0x76,
+ 0x77, 0xfb, 0x1e, 0x51, 0x69, 0x8b, 0xaa, 0x9b,
+ 0x1e, 0xf7, 0x8b, 0x16, 0xfb, 0x1, 0xd1, 0x79,
+ 0xba, 0xf7, 0x1e, 0xb7, 0xf7, 0x3d, 0xcf, 0xb2,
+ 0x7b, 0xe1, 0xfb, 0x0, 0x74, 0xa, 0xa0, 0xf7,
+ 0x1f, 0xc4, 0x9a, 0x9e, 0x7c, 0x6d, 0x76, 0x77,
+ 0xfb, 0x1c, 0x50, 0x6a, 0x8b, 0xaa, 0x9b, 0x1e,
+ 0xe, 0xab, 0x78, 0xf7, 0x14, 0x12, 0xdc, 0xf7,
+ 0x26, 0x53, 0xf7, 0x26, 0xf7, 0x5b, 0xf7, 0x2c,
+ 0x2a, 0xf7, 0x27, 0x13, 0xd0, 0xdc, 0xf7, 0x7e,
+ 0x15, 0xfb, 0x46, 0xf7, 0x28, 0x40, 0xf7, 0x24,
+ 0xf7, 0x67, 0xdf, 0xf7, 0x2, 0xf7, 0x1, 0xf7,
+ 0x12, 0x34, 0xc4, 0xfb, 0x14, 0xc2, 0x1e, 0x13,
+ 0xa8, 0x35, 0xb0, 0x59, 0x8e, 0xc0, 0x1a, 0xd8,
+ 0xe7, 0x9e, 0xa5, 0xd1, 0xc5, 0x73, 0x35, 0x93,
+ 0x1e, 0xf7, 0x27, 0x92, 0x5, 0xf7, 0x37, 0x80,
+ 0xfb, 0x14, 0xc8, 0xfb, 0x23, 0x1b, 0xfb, 0x65,
+ 0x53, 0xfb, 0x14, 0x32, 0xfb, 0x15, 0xe5, 0x6e,
+ 0xf7, 0x15, 0x53, 0x1f, 0x13, 0xd0, 0xdc, 0x68,
+ 0xb8, 0x6e, 0x56, 0x1a, 0x3d, 0x32, 0x7e, 0x57,
+ 0xfb, 0x23, 0x88, 0xcf, 0xcb, 0x89, 0x1e, 0xf7,
+ 0x3e, 0xf8, 0xb3, 0x15, 0xf7, 0x1d, 0x6, 0xf7,
+ 0x2b, 0x5d, 0xa, 0xfb, 0xd, 0x6, 0x32, 0x31,
+ 0x64, 0xe5, 0x5, 0x26, 0x6, 0xe, 0x58, 0xa,
+ 0xf7, 0x62, 0xd7, 0x15, 0xd0, 0x6, 0x5e, 0xf7,
+ 0x65, 0xf7, 0xf, 0xf7, 0x5b, 0x5, 0x39, 0x6,
+ 0xfb, 0x21, 0xfb, 0x5b, 0x5, 0xe, 0xf8, 0x1,
+ 0x78, 0xf7, 0xd, 0xfb, 0x1, 0xf7, 0x1, 0xfb,
+ 0x1, 0xf7, 0xf, 0xf7, 0x5c, 0xf7, 0xf, 0xf7,
+ 0x37, 0xf7, 0xf, 0xfb, 0x1, 0xf7, 0xd, 0x12,
+ 0xee, 0xf7, 0x19, 0x13, 0x3a, 0xf8, 0x84, 0x84,
+ 0x15, 0xf8, 0x88, 0x71, 0xa, 0xfb, 0xfc, 0x6,
+ 0xb4, 0xf7, 0x5c, 0x5, 0xf7, 0xc7, 0x71, 0xa,
+ 0xfb, 0xc8, 0x6, 0xac, 0xf7, 0x37, 0x5, 0xf7,
+ 0xdc, 0x6, 0xa4, 0xf7, 0xf, 0x5, 0xfc, 0x68,
+ 0x6, 0x7a, 0x39, 0x5, 0x13, 0x96, 0xd6, 0x62,
+ 0x3c, 0x9e, 0x57, 0x1b, 0xfb, 0x52, 0xfb, 0x3c,
+ 0xfb, 0x57, 0xfb, 0xab, 0xfb, 0x61, 0xf7, 0x12,
+ 0x3e, 0xf7, 0x12, 0xe3, 0xb4, 0xb1, 0xad, 0xa5,
+ 0x1f, 0x8d, 0x88, 0x5, 0x13, 0x56, 0xfb, 0xa8,
+ 0xf7, 0x69, 0x15, 0xf7, 0x12, 0xc5, 0xf7, 0x77,
+ 0xf7, 0x38, 0xe1, 0xb7, 0x4a, 0x3e, 0x4e, 0x76,
+ 0xfb, 0x9, 0x6f, 0x42, 0x1e, 0x6f, 0x80, 0x63,
+ 0x2e, 0x20, 0x1b, 0x38, 0x4d, 0xc5, 0xf2, 0x1f,
+ 0xe, 0xfb, 0xf9, 0xf8, 0x6f, 0x76, 0xf7, 0xa5,
+ 0x77, 0x1, 0xf7, 0x39, 0xf8, 0x5a, 0x8e, 0xa,
+ 0xa6, 0xf7, 0x15, 0x5, 0x4d, 0x6, 0x97, 0xc4,
+ 0xa4, 0x9a, 0xb6, 0x95, 0x98, 0xc9, 0x18, 0xfb,
+ 0x1e, 0x88, 0x74, 0xfb, 0x1, 0x7f, 0x54, 0x8,
+ 0xe, 0xfb, 0xf9, 0xf8, 0x66, 0x76, 0xf7, 0xa5,
+ 0x77, 0x1, 0xf7, 0x3b, 0xf8, 0x51, 0x15, 0xf7,
+ 0x1d, 0x3e, 0xa, 0xfb, 0x1d, 0x6, 0x70, 0xfb,
+ 0x15, 0x5, 0xc9, 0x6, 0x7e, 0x53, 0x73, 0x7b,
+ 0x60, 0x81, 0x8, 0xe, 0xfb, 0x1b, 0xf8, 0x5a,
+ 0xf7, 0x14, 0xf7, 0x25, 0x77, 0x1, 0xf7, 0x34,
+ 0xf8, 0x5a, 0x15, 0xf7, 0x1f, 0x6, 0xa6, 0xf7,
+ 0x14, 0x5, 0x4d, 0x6, 0x97, 0xc3, 0xa4, 0x9d,
+ 0xb7, 0x94, 0x97, 0xc9, 0x18, 0xfb, 0x1e, 0x88,
+ 0x73, 0xfb, 0x3, 0x7f, 0x55, 0x8, 0xf7, 0x64,
+ 0x22, 0x8e, 0xa, 0xa7, 0xf7, 0x14, 0x5, 0x4c,
+ 0x6, 0x98, 0xc3, 0xa3, 0x9d, 0xb7, 0x94, 0x98,
+ 0xc9, 0x18, 0xfb, 0x1f, 0x88, 0x74, 0xfb, 0x3,
+ 0x7f, 0x55, 0x8, 0xe, 0xfb, 0x1b, 0xf8, 0x66,
+ 0x76, 0xf7, 0x24, 0xf7, 0x15, 0x1, 0xf8, 0x1c,
+ 0xf8, 0x51, 0x15, 0xf7, 0x1f, 0x3e, 0xa, 0xfb,
+ 0x1e, 0x6, 0x6f, 0x62, 0xa, 0xfb, 0x87, 0x4d,
+ 0x15, 0x56, 0xa, 0x70, 0x62, 0xa, 0xe, 0xfb,
+ 0xb1, 0xf7, 0x6b, 0x76, 0xf7, 0xde, 0x77, 0x1,
+ 0xde, 0xf7, 0xfd, 0x15, 0x2f, 0xd7, 0x40, 0xe7,
+ 0xe7, 0xd8, 0xd5, 0xe8, 0xe9, 0x3e, 0xd0, 0x2f,
+ 0x2e, 0x40, 0x44, 0x2f, 0x1e, 0xe, 0x3c, 0x88,
+ 0xa, 0xf8, 0xd7, 0xf5, 0xfc, 0xd7, 0x6, 0xe,
+ 0xf8, 0x1, 0x88, 0xa, 0xfa, 0x93, 0xf5, 0xfe,
+ 0x93, 0x6, 0xe, 0xf8, 0xf6, 0xf7, 0x13, 0x38,
+ 0xde, 0x89, 0x77, 0x12, 0x13, 0x80, 0xf7, 0x5,
+ 0xf8, 0xf6, 0x15, 0xd4, 0x6, 0x13, 0x40, 0x8f,
+ 0x9a, 0x96, 0xa7, 0xae, 0x8c, 0x8, 0xaa, 0xa2,
+ 0x81, 0x81, 0xa3, 0x1f, 0x81, 0xa2, 0xa2, 0x80,
+ 0xaa, 0x1b, 0xc1, 0xbb, 0xb5, 0xdd, 0x99, 0x1f,
+ 0x41, 0x6, 0x72, 0x83, 0x83, 0x7a, 0x74, 0x1b,
+ 0x75, 0x75, 0x93, 0x93, 0x72, 0x1f, 0x13, 0x20,
+ 0x96, 0x6c, 0x6a, 0x98, 0x69, 0x1b, 0x13, 0x80,
+ 0x3d, 0x72, 0x42, 0x57, 0x80, 0x1f, 0xe, 0xf8,
+ 0x1, 0xf7, 0xdb, 0x76, 0xf7, 0xe7, 0xd4, 0x1,
+ 0xf7, 0x68, 0xe5, 0xf7, 0x58, 0xe0, 0xf7, 0xd0,
+ 0xe0, 0x3, 0xf7, 0x68, 0xf7, 0xc6, 0x15, 0xe5,
+ 0xf7, 0xe7, 0xf7, 0x2e, 0xd4, 0xfc, 0x26, 0x42,
+ 0xf7, 0x32, 0x6, 0xf7, 0xb2, 0xfb, 0xe7, 0x15,
+ 0xe0, 0xf7, 0xdc, 0x8d, 0x6, 0xf7, 0x8, 0xfb,
+ 0xdc, 0x5, 0xdb, 0x6, 0xf7, 0x7, 0xf7, 0xdc,
+ 0x5, 0x8e, 0xfb, 0xdc, 0xe0, 0xf8, 0x30, 0xfb,
+ 0x21, 0x6, 0x26, 0xfb, 0xaf, 0x51, 0xa, 0x25,
+ 0xf7, 0xaf, 0x5, 0xfb, 0x20, 0x6, 0xe, 0x3c,
+ 0x7d, 0xef, 0xf8, 0x94, 0xf7, 0x2c, 0x1, 0xf7,
+ 0x24, 0xf7, 0x1c, 0xf7, 0x26, 0xf7, 0x28, 0x3,
+ 0xca, 0xf7, 0x28, 0x15, 0xfb, 0x7, 0xad, 0xe9,
+ 0x5c, 0xf7, 0x1e, 0x1b, 0xf7, 0x51, 0xc3, 0xe5,
+ 0xd3, 0xf4, 0xfb, 0x4, 0xc5, 0x3a, 0xa3, 0x1f,
+ 0x41, 0xa1, 0x70, 0x8b, 0xab, 0x1a, 0xa4, 0xa4,
+ 0xab, 0xc7, 0x9b, 0xd4, 0x8b, 0x4b, 0xa2, 0x1e,
+ 0xf7, 0x1a, 0xa3, 0x5, 0xf7, 0x11, 0x6f, 0xfb,
+ 0xc, 0x9b, 0x40, 0x1b, 0xfb, 0x3a, 0x3d, 0x46,
+ 0x32, 0x27, 0xdc, 0x69, 0xe6, 0x6c, 0x1f, 0xef,
+ 0x69, 0x95, 0x7e, 0x6e, 0x1a, 0x67, 0x5a, 0x71,
+ 0x58, 0x3d, 0x70, 0xb3, 0xb8, 0x7a, 0x1e, 0xf7,
+ 0x11, 0xf8, 0x3f, 0x15, 0x82, 0xa, 0xf7, 0x2a,
+ 0x5d, 0xa, 0xfb, 0xc, 0x6, 0x33, 0x31, 0x64,
+ 0xe5, 0x5, 0x27, 0x6, 0xe, 0x58, 0xa, 0xee,
+ 0xd7, 0x15, 0xdd, 0x6, 0xf7, 0x21, 0xf7, 0x55,
+ 0x3f, 0xf7, 0x6b, 0x5, 0x46, 0x6, 0xb8, 0xfb,
+ 0x6b, 0x5, 0xe, 0xf7, 0xc9, 0x7d, 0xf1, 0x25,
+ 0xf7, 0x2, 0xf7, 0x10, 0xe3, 0xf7, 0x15, 0xf7,
+ 0x1, 0x24, 0xf2, 0x12, 0xdd, 0xf7, 0x21, 0xf7,
+ 0x98, 0xf7, 0x15, 0x13, 0xb6, 0xf8, 0xa5, 0xcc,
+ 0x15, 0x56, 0xb8, 0xd0, 0x71, 0xd0, 0x1b, 0xf7,
+ 0x2a, 0xca, 0xf7, 0x1, 0xb9, 0xa5, 0x1f, 0xfb,
+ 0x13, 0xa2, 0x5, 0x69, 0x7b, 0x6a, 0x61, 0x4d,
+ 0x1b, 0x68, 0x47, 0xa4, 0xf6, 0x8d, 0x1f, 0xf7,
+ 0xf6, 0x6, 0x94, 0xae, 0x8d, 0xb0, 0xaf, 0x1a,
+ 0xec, 0x4c, 0xf7, 0xd, 0xfb, 0x2b, 0x74, 0x33,
+ 0x89, 0x42, 0x39, 0x1e, 0xca, 0x51, 0x45, 0x97,
+ 0x53, 0x1b, 0xfb, 0xaa, 0x71, 0xfb, 0xa5, 0x4a,
+ 0xfb, 0xa, 0xcf, 0x23, 0xf7, 0x45, 0xd6, 0xd5,
+ 0xa5, 0xc0, 0xc0, 0x1f, 0xec, 0xf7, 0x87, 0x15,
+ 0x13, 0xae, 0xa8, 0x92, 0xa4, 0xf5, 0xe9, 0x1b,
+ 0xf0, 0x86, 0xfb, 0x4, 0x74, 0x8a, 0x1f, 0xfd,
+ 0x4, 0x27, 0x15, 0x13, 0x76, 0xf7, 0x5, 0xc0,
+ 0xf7, 0x8, 0xf0, 0xb7, 0xc9, 0x6f, 0x29, 0x43,
+ 0x65, 0xfb, 0x23, 0xfb, 0x9, 0x47, 0x66, 0xc1,
+ 0xc5, 0x1e, 0xe, 0xab, 0xa0, 0x76, 0xf9, 0x6d,
+ 0x77, 0xdf, 0xf7, 0xe, 0x1, 0x64, 0xa, 0xf7,
+ 0xa2, 0xf7, 0xcc, 0xf8, 0x5f, 0x43, 0xa, 0xfb,
+ 0x5d, 0xfb, 0xcc, 0xfb, 0x10, 0xf7, 0xcc, 0x5a,
+ 0xa, 0xf7, 0x51, 0xfc, 0x50, 0x5, 0x8a, 0xf8,
+ 0x90, 0x15, 0xf7, 0x6, 0x6, 0xa3, 0x55, 0xa,
+ 0xfb, 0x7, 0x6, 0xf7, 0x40, 0xfb, 0xe, 0x15,
+ 0xf7, 0x6, 0x6, 0xa3, 0x55, 0xa, 0xfb, 0x6,
+ 0x6, 0xe, 0xfb, 0x39, 0x76, 0xf8, 0xab, 0x77,
+ 0xcf, 0xf7, 0x1b, 0x1, 0xf7, 0x46, 0xf8, 0x21,
+ 0x15, 0xf7, 0x25, 0x6, 0xa9, 0xf7, 0x1b, 0x93,
+ 0xa, 0xfb, 0xb, 0xfc, 0xb9, 0x15, 0x65, 0xfb,
+ 0x3d, 0x5, 0xf7, 0x2b, 0x6, 0xb0, 0xf7, 0x3d,
+ 0xb9, 0xf8, 0x2, 0x5, 0x3a, 0x6, 0xe, 0x3c,
+ 0x2a, 0x76, 0xf6, 0xf5, 0xf7, 0xed, 0xe9, 0xe9,
+ 0x77, 0x1, 0xda, 0xf7, 0x1b, 0x3, 0xf7, 0x24,
+ 0x2c, 0x15, 0xc9, 0x74, 0xbe, 0xf7, 0x3, 0x5,
+ 0x89, 0x95, 0x9b, 0x89, 0xa1, 0x1b, 0xf7, 0x2f,
+ 0xd5, 0xf7, 0x3, 0xd8, 0xa6, 0x1f, 0xfb, 0x19,
+ 0x9f, 0x73, 0x50, 0x64, 0x5c, 0x4b, 0x8f, 0x19,
+ 0xf7, 0x1c, 0xf7, 0xd8, 0xa0, 0x79, 0x96, 0x72,
+ 0x8d, 0x6d, 0x19, 0xf7, 0x14, 0x99, 0x85, 0xe3,
+ 0x4f, 0xbb, 0x54, 0xa0, 0x19, 0xb0, 0xe2, 0x4f,
+ 0xa3, 0x61, 0x2b, 0x5, 0x8c, 0x85, 0x81, 0x8c,
+ 0x7b, 0x1b, 0xfb, 0x39, 0xfb, 0x1d, 0xfb, 0x20,
+ 0xfb, 0x57, 0x2a, 0xb6, 0x4f, 0xd3, 0x6b, 0x1f,
+ 0xb9, 0xf7, 0x2, 0x15, 0x82, 0x93, 0x7a, 0x9e,
+ 0xbf, 0x1a, 0xd2, 0xab, 0xf7, 0x35, 0xf7, 0x14,
+ 0x94, 0x1e, 0xe, 0x3c, 0x90, 0x76, 0xa6, 0x76,
+ 0xf7, 0xc8, 0xf7, 0x0, 0xf7, 0x61, 0xf6, 0x12,
+ 0xf7, 0x4b, 0xf7, 0x14, 0x13, 0xb8, 0xcb, 0x7b,
+ 0x15, 0x9c, 0xaa, 0xc2, 0xa3, 0xc4, 0x1b, 0xbb,
+ 0xa9, 0x82, 0x82, 0xaa, 0x1f, 0x13, 0x78, 0x82,
+ 0xa9, 0xab, 0x83, 0xbc, 0x1b, 0xc5, 0xaf, 0x9a,
+ 0x98, 0xaf, 0x1f, 0x61, 0xf7, 0xb, 0x5, 0x71,
+ 0x53, 0x68, 0x8b, 0x78, 0x1b, 0x7e, 0x41, 0x97,
+ 0x84, 0xad, 0x1f, 0x86, 0xa4, 0x3e, 0x97, 0x74,
+ 0x1b, 0x75, 0x78, 0x87, 0x81, 0x7e, 0x1f, 0x89,
+ 0x8d, 0xca, 0xc2, 0xad, 0xbd, 0x90, 0xdd, 0x19,
+ 0xe9, 0x6, 0xa2, 0xf7, 0x0, 0x7a, 0xa, 0x87,
+ 0xa1, 0x88, 0xa1, 0xa3, 0x1a, 0xe9, 0xc2, 0xb6,
+ 0xc0, 0xd7, 0x96, 0x44, 0x72, 0x8f, 0x1e, 0xf7,
+ 0x11, 0x98, 0x5, 0xea, 0x84, 0x4f, 0xea, 0xfb,
+ 0x23, 0x1b, 0xfb, 0x28, 0x2d, 0xfb, 0x8, 0xfb,
+ 0x14, 0x85, 0x8b, 0x75, 0x93, 0x63, 0x1f, 0x3d,
+ 0x6, 0x75, 0xfb, 0x0, 0x5, 0xf7, 0x3, 0x6,
+ 0x7e, 0xfb, 0x9, 0x23, 0x52, 0x68, 0x7c, 0x8,
+ 0xe, 0x3c, 0xec, 0x76, 0xb5, 0xf7, 0x16, 0xf7,
+ 0x69, 0xf7, 0x16, 0xb8, 0x77, 0x1, 0xdc, 0xd8,
+ 0x15, 0xe6, 0xd2, 0x5, 0x78, 0xa6, 0xad, 0x80,
+ 0xb1, 0x1b, 0xb5, 0xb7, 0x97, 0x9e, 0xae, 0x1f,
+ 0xb8, 0x42, 0xf7, 0x7, 0xe6, 0x5f, 0xd3, 0xaa,
+ 0xae, 0xa4, 0xb4, 0x99, 0xb5, 0x19, 0x92, 0xa0,
+ 0x91, 0xa6, 0xa7, 0x1a, 0x98, 0x8b, 0x98, 0x88,
+ 0x99, 0x1e, 0xe7, 0xd3, 0x55, 0xe6, 0x2e, 0x42,
+ 0x5, 0x95, 0x7d, 0x6e, 0x9d, 0x52, 0x1b, 0x51,
+ 0x60, 0x79, 0x81, 0x77, 0x1f, 0x5e, 0xd4, 0xfb,
+ 0x8, 0x2b, 0xb5, 0x46, 0x6e, 0x69, 0x74, 0x62,
+ 0x7e, 0x62, 0x19, 0x82, 0x71, 0x80, 0x60, 0x93,
+ 0x5c, 0x32, 0x44, 0x18, 0xf7, 0x74, 0xf7, 0x51,
+ 0x15, 0xc6, 0x9e, 0xc9, 0xb8, 0xc3, 0x1b, 0xb7,
+ 0xa8, 0x6f, 0x62, 0x80, 0x89, 0x7f, 0x87, 0x7f,
+ 0x1f, 0x4f, 0x77, 0x4b, 0x5a, 0x53, 0x1b, 0x53,
+ 0x6e, 0xbc, 0xc7, 0xa0, 0x1f, 0xe, 0x3c, 0xa0,
+ 0x76, 0xf7, 0x21, 0xe6, 0xf8, 0x66, 0x77, 0x1,
+ 0xc7, 0xf7, 0x21, 0x15, 0xf7, 0x4d, 0x6, 0x6d,
+ 0xfb, 0x21, 0x5, 0xf7, 0x20, 0x6, 0xab, 0xf7,
+ 0x21, 0x5, 0xf7, 0x4b, 0x6, 0x9f, 0xe6, 0x5,
+ 0xfb, 0x4c, 0x6, 0x9c, 0xd7, 0x5, 0xf7, 0x4b,
+ 0x6, 0x9f, 0xe7, 0x5, 0xfb, 0x13, 0x6, 0xf7,
+ 0x6a, 0xf7, 0xbe, 0x43, 0xa, 0xfb, 0x4b, 0xfb,
+ 0xbe, 0x51, 0xa, 0x40, 0xf7, 0xbe, 0x44, 0xa,
+ 0xe8, 0xfb, 0xbe, 0x5, 0xfb, 0xf, 0x6, 0x78,
+ 0x2f, 0x5, 0xf7, 0x4d, 0x6, 0x7b, 0x3f, 0x5,
+ 0xfb, 0x4e, 0x6, 0xe, 0xfb, 0xf7, 0x78, 0xa,
+ 0xdb, 0x78, 0x15, 0xf7, 0x0, 0x6, 0xce, 0xf7,
+ 0xc9, 0x5, 0xfb, 0x0, 0x6, 0xaa, 0xf7, 0x1d,
+ 0x15, 0xf7, 0x0, 0x6, 0xce, 0xf7, 0xca, 0x5,
+ 0xfb, 0x0, 0x6, 0xe, 0x3c, 0xfb, 0x4c, 0xe9,
+ 0xf9, 0x1e, 0xf7, 0x3b, 0x12, 0xf6, 0xf7, 0xd,
+ 0x78, 0xf7, 0x11, 0xa1, 0xf7, 0x16, 0x6b, 0xf7,
+ 0xa, 0x13, 0xe8, 0xc8, 0x77, 0x15, 0x35, 0x9c,
+ 0xd6, 0x3d, 0xf7, 0x1a, 0x1b, 0xf7, 0x1b, 0xcb,
+ 0xd6, 0xd5, 0xbd, 0x6f, 0xb7, 0x7d, 0x9e, 0x1f,
+ 0x13, 0xd4, 0xd5, 0xae, 0xc1, 0xc6, 0xd3, 0x1a,
+ 0xc6, 0x6e, 0xbe, 0x2f, 0xdb, 0x1e, 0x27, 0xe3,
+ 0x7a, 0x92, 0xb1, 0x1a, 0xa5, 0x9c, 0xb3, 0xba,
+ 0xcf, 0x8f, 0x4f, 0x78, 0x8d, 0x1e, 0xf7, 0x12,
+ 0x97, 0x5, 0xc4, 0x84, 0x72, 0xf3, 0xfb, 0x36,
+ 0x1b, 0xfb, 0x28, 0x5c, 0x30, 0x46, 0x75, 0x90,
+ 0x6d, 0xa3, 0x65, 0x1f, 0x13, 0xe8, 0x67, 0x79,
+ 0x2c, 0x63, 0x22, 0x1a, 0x76, 0x89, 0x4a, 0xe1,
+ 0x3e, 0x1e, 0xc8, 0x55, 0xf3, 0x48, 0x4a, 0x1a,
+ 0x83, 0x87, 0x5c, 0x4d, 0x60, 0x64, 0x9f, 0xd9,
+ 0x77, 0x1e, 0xf7, 0x57, 0xf7, 0x1c, 0x15, 0xfb,
+ 0x9, 0xf7, 0x2, 0x5, 0x65, 0xaf, 0x8b, 0x98,
+ 0x96, 0x1a, 0xb9, 0xad, 0xaa, 0xab, 0x9d, 0x1e,
+ 0x86, 0xe2, 0x40, 0x82, 0x8f, 0x1f, 0x13, 0xe4,
+ 0xb6, 0x64, 0xaa, 0x6e, 0x66, 0x1a, 0x5d, 0x51,
+ 0x71, 0x7e, 0x87, 0x1e, 0xe, 0xf8, 0xfa, 0xf7,
+ 0x7, 0x1, 0xf7, 0x1d, 0xf8, 0xfa, 0x69, 0xa,
+ 0xf7, 0x45, 0xfb, 0x7, 0x69, 0xa, 0xe, 0xf1,
+ 0x78, 0xd6, 0xe7, 0xd2, 0xf7, 0xab, 0xd2, 0xe8,
+ 0xd6, 0x1, 0xc3, 0xd8, 0xf9, 0x5, 0xd8, 0x3,
+ 0xf7, 0x19, 0xf7, 0xf8, 0x15, 0xf7, 0x3c, 0xf7,
+ 0x1d, 0xf7, 0x1e, 0xf7, 0x41, 0xf7, 0x41, 0xf7,
+ 0x22, 0xfb, 0x1e, 0xfb, 0x3c, 0xfb, 0x3c, 0xfb,
+ 0x22, 0xfb, 0x18, 0xfb, 0x41, 0xfb, 0x41, 0xfb,
+ 0x1d, 0xf7, 0x18, 0xf7, 0x3c, 0x1e, 0xf8, 0x2c,
+ 0x56, 0x15, 0x76, 0x83, 0x79, 0x4c, 0x43, 0x1b,
+ 0x5c, 0x57, 0xaa, 0xf5, 0xbc, 0x93, 0xe8, 0xe6,
+ 0xcb, 0xa4, 0x5b, 0x77, 0x93, 0x1f, 0xdd, 0x9e,
+ 0x5, 0xaf, 0x7d, 0x60, 0xdf, 0xfb, 0xe, 0x1b,
+ 0xfb, 0x13, 0x4e, 0x33, 0xfb, 0x11, 0xfb, 0x2f,
+ 0xed, 0x56, 0xe5, 0xcd, 0xde, 0xa9, 0xed, 0xa9,
+ 0x1f, 0xfc, 0xca, 0xdb, 0x15, 0xfb, 0x65, 0xf7,
+ 0x40, 0xfb, 0x3a, 0xf7, 0x6b, 0xf7, 0x6b, 0xf7,
+ 0x45, 0xf7, 0x3a, 0xf7, 0x65, 0xf7, 0x65, 0xfb,
+ 0x45, 0xf7, 0x40, 0xfb, 0x6b, 0xfb, 0x6b, 0xfb,
+ 0x40, 0xfb, 0x40, 0xfb, 0x65, 0x1e, 0xe, 0xfb,
+ 0x9d, 0xf7, 0xa8, 0xe3, 0xf8, 0x9, 0x77, 0x1,
+ 0xf7, 0xd9, 0xf7, 0xb2, 0x15, 0xf5, 0x6, 0x81,
+ 0xa6, 0x89, 0xa1, 0x9b, 0xe9, 0xb9, 0xe0, 0xdf,
+ 0x1a, 0xf7, 0xf, 0xfb, 0x15, 0x8b, 0x76, 0x6b,
+ 0x21, 0x8a, 0xfb, 0x16, 0x5b, 0x1e, 0xf4, 0x7b,
+ 0x5, 0xbe, 0xa4, 0xb3, 0x8b, 0x95, 0x1b, 0xaf,
+ 0xab, 0x6d, 0x53, 0x70, 0x1f, 0xfb, 0x3, 0x7e,
+ 0x78, 0x89, 0x65, 0x80, 0x8, 0x54, 0x7a, 0x68,
+ 0x4a, 0x4f, 0x1a, 0x51, 0xad, 0x56, 0xe0, 0xaf,
+ 0xb2, 0x98, 0xa4, 0xac, 0x1e, 0x8c, 0x7d, 0x8c,
+ 0x87, 0x8f, 0x81, 0x8, 0x8c, 0xf7, 0x4a, 0x15,
+ 0x61, 0x82, 0x7e, 0x4d, 0x4e, 0x1b, 0x73, 0x6d,
+ 0x9c, 0xa4, 0xb5, 0xbf, 0x94, 0xe0, 0x96, 0x1f,
+ 0xe, 0x3c, 0x58, 0xa, 0xf8, 0x23, 0xd7, 0x4a,
+ 0xa, 0x35, 0xfb, 0x6d, 0x4a, 0xa, 0xe, 0x58,
+ 0xf7, 0x15, 0x76, 0x1, 0xf4, 0xf7, 0xc6, 0x15,
+ 0xf8, 0x1, 0xfb, 0x5a, 0xf7, 0x19, 0xf7, 0xcb,
+ 0xfc, 0x86, 0x6, 0xe, 0x58, 0xf7, 0x59, 0xf7,
+ 0x4, 0x1, 0xdd, 0xf7, 0x59, 0x15, 0xf7, 0x4,
+ 0xf8, 0xa4, 0xfb, 0x4, 0x7, 0xe, 0xf1, 0x78,
+ 0xd6, 0xf7, 0xa0, 0xca, 0xf7, 0xa7, 0xd6, 0x1,
+ 0xc2, 0xd8, 0xf8, 0x32, 0xe4, 0xf7, 0xe, 0xd8,
+ 0x3, 0xf7, 0x94, 0xf7, 0x33, 0x15, 0xde, 0x6,
+ 0xa4, 0xf7, 0x39, 0x5, 0xa1, 0x6, 0xb5, 0xa4,
+ 0x85, 0x2e, 0xae, 0x1f, 0xa3, 0x49, 0x5, 0xf3,
+ 0x6, 0x66, 0xdc, 0x71, 0xc7, 0x81, 0x9f, 0x67,
+ 0x99, 0x19, 0x8d, 0x7, 0xe1, 0x96, 0xb5, 0xbd,
+ 0xb9, 0x1a, 0xf7, 0x15, 0xfb, 0x6, 0x7f, 0xfb,
+ 0xc, 0x1e, 0x38, 0x6, 0xc3, 0xfb, 0x41, 0x15,
+ 0x9c, 0xf7, 0x1, 0x5, 0xae, 0x6, 0xd4, 0xba,
+ 0x8f, 0x52, 0x52, 0x4d, 0x8c, 0x40, 0x1f, 0xfb,
+ 0xa9, 0x6f, 0x15, 0xf7, 0x3c, 0xf7, 0x20, 0xf7,
+ 0x1b, 0xf7, 0x41, 0xf7, 0x41, 0xf7, 0x1f, 0xfb,
+ 0x1b, 0xfb, 0x3c, 0xfb, 0x3c, 0xfb, 0x1f, 0xfb,
+ 0x1b, 0xfb, 0x41, 0xfb, 0x41, 0xfb, 0x20, 0xf7,
+ 0x1b, 0xf7, 0x3c, 0x1e, 0x3e, 0x16, 0xfb, 0x65,
+ 0xf7, 0x43, 0xfb, 0x3d, 0xf7, 0x6b, 0xf7, 0x6b,
+ 0xf7, 0x42, 0xf7, 0x3d, 0xf7, 0x65, 0xf7, 0x65,
+ 0xfb, 0x42, 0xf7, 0x3d, 0xfb, 0x6b, 0xfb, 0x6b,
+ 0xfb, 0x43, 0xfb, 0x3d, 0xfb, 0x65, 0x1e, 0xe,
+ 0xf8, 0xf0, 0xd5, 0x1, 0xf7, 0xe, 0xf7, 0xfd,
+ 0x3, 0xf7, 0xe, 0xf8, 0xf0, 0x15, 0xf7, 0xe7,
+ 0x6, 0xa1, 0xd5, 0x5, 0xfb, 0xe8, 0x6, 0xe,
+ 0xfb, 0x7f, 0xf7, 0x43, 0xd7, 0xf7, 0x20, 0xd7,
+ 0x3, 0xf7, 0x43, 0xf8, 0xcf, 0x15, 0x3b, 0xcc,
+ 0x4a, 0xdb, 0xdc, 0xcd, 0xcc, 0xdb, 0xdb, 0x49,
+ 0xc8, 0x3a, 0x3b, 0x4a, 0x4e, 0x3b, 0x1e, 0xd7,
+ 0x8a, 0x15, 0xb2, 0xab, 0xa7, 0xb1, 0xb1, 0xab,
+ 0x70, 0x63, 0x65, 0x6b, 0x6c, 0x65, 0x65, 0x6b,
+ 0xaa, 0xb1, 0x1e, 0xe, 0x58, 0x8b, 0xe7, 0xf7,
+ 0x4c, 0xe9, 0xf7, 0x1c, 0x77, 0x1, 0xf7, 0xaa,
+ 0xf7, 0x0, 0x3, 0xb3, 0x16, 0xf8, 0xdd, 0xe7,
+ 0xfc, 0xdd, 0x6, 0xf7, 0x4c, 0x4, 0xf7, 0x82,
+ 0xfb, 0x1f, 0xf7, 0x0, 0xf7, 0x1f, 0xf7, 0x83,
+ 0xe9, 0xfb, 0x83, 0xf7, 0x1c, 0xfb, 0x0, 0xfb,
+ 0x1c, 0xfb, 0x82, 0x6, 0xe, 0xf7, 0xaf, 0xe4,
+ 0xf7, 0x95, 0xdc, 0x1, 0xd0, 0xf7, 0xaf, 0x15,
+ 0xf7, 0xd8, 0x6, 0xa2, 0xe4, 0x5, 0xfb, 0x3c,
+ 0x6, 0xa0, 0x9c, 0xc4, 0xb1, 0x97, 0x96, 0x8,
+ 0xdc, 0xd3, 0xa9, 0xb3, 0xb5, 0x1a, 0xc5, 0x5d,
+ 0xc7, 0xfb, 0x7, 0xfb, 0x25, 0x75, 0x22, 0x6f,
+ 0x86, 0x1e, 0xf7, 0x4, 0x7d, 0x5, 0xa7, 0x92,
+ 0x94, 0xb1, 0xb9, 0x1b, 0xef, 0x30, 0xfb, 0x1,
+ 0x52, 0x30, 0x1f, 0x2a, 0x4e, 0x6c, 0x5d, 0x80,
+ 0x42, 0x8, 0xe, 0xf7, 0xa3, 0xdd, 0x39, 0xf7,
+ 0x1c, 0xf7, 0xc3, 0x77, 0x1, 0xe6, 0xf8, 0x26,
+ 0x15, 0x71, 0x8e, 0x9b, 0x22, 0xf7, 0x1b, 0x1b,
+ 0xf7, 0x2, 0xca, 0xda, 0xc8, 0x1f, 0xb9, 0x61,
+ 0x9e, 0x9f, 0x9c, 0xcc, 0xa6, 0xc0, 0x1a, 0xb8,
+ 0x6a, 0xd3, 0x21, 0xfb, 0xa, 0x6c, 0x33, 0x6a,
+ 0x7f, 0x1e, 0xed, 0x79, 0x5, 0xb0, 0x95, 0x9c,
+ 0x9f, 0xa8, 0x1b, 0x92, 0xad, 0x8a, 0x69, 0x4f,
+ 0x46, 0x92, 0x7d, 0x8d, 0x1f, 0x77, 0x34, 0x5,
+ 0xab, 0x95, 0xba, 0x83, 0x5d, 0x1a, 0x6d, 0x72,
+ 0x6f, 0x61, 0x60, 0x86, 0xaa, 0xa7, 0x86, 0x1e,
+ 0xe, 0xf9, 0x5, 0x76, 0xf7, 0x26, 0x77, 0x1,
+ 0xf7, 0x80, 0xf8, 0xf0, 0x15, 0xf2, 0x52, 0xa,
+ 0xe, 0x73, 0xfb, 0x4e, 0x76, 0xf7, 0x62, 0xeb,
+ 0x33, 0x76, 0xf8, 0xb6, 0x77, 0x12, 0x13, 0xb0,
+ 0xf7, 0x70, 0xc3, 0x15, 0x70, 0x9a, 0xa4, 0x60,
+ 0xc8, 0x1b, 0xb7, 0xa3, 0xa0, 0xb4, 0xb1, 0x1f,
+ 0x13, 0xd0, 0x82, 0x5a, 0x5, 0xf7, 0x14, 0x6,
+ 0xf7, 0x4, 0xf8, 0xa9, 0x3d, 0xa, 0x4f, 0xfb,
+ 0xa9, 0x5, 0x54, 0x80, 0x74, 0x22, 0x33, 0x1b,
+ 0x68, 0x5c, 0xa6, 0xcb, 0x1f, 0xce, 0xf7, 0xee,
+ 0x92, 0xa, 0xfb, 0x30, 0xfd, 0x77, 0x8d, 0xa,
+ 0xe, 0x3c, 0xfb, 0x3e, 0x76, 0xf9, 0x92, 0xf7,
+ 0x11, 0x1, 0xf7, 0xc3, 0xfb, 0x53, 0x15, 0xf7,
+ 0x10, 0xf9, 0x92, 0xd9, 0xfd, 0x92, 0xf7, 0xc,
+ 0xf9, 0x92, 0xca, 0xf7, 0x11, 0xfb, 0xcb, 0x6,
+ 0xfb, 0x29, 0xfb, 0x16, 0x5f, 0xfb, 0x2d, 0x5a,
+ 0xa4, 0xfb, 0x26, 0xf7, 0x48, 0x1f, 0xe, 0xfb,
+ 0xf9, 0xf7, 0x40, 0xf7, 0x36, 0x1, 0xf7, 0x2,
+ 0xf7, 0x40, 0x8e, 0xa, 0xa7, 0xf7, 0x36, 0x81,
+ 0xa, 0xfb, 0x78, 0xce, 0xf7, 0x35, 0x77, 0x1,
+ 0xf7, 0x18, 0xe3, 0x3, 0xbc, 0x80, 0x15, 0x7b,
+ 0x53, 0x5, 0x8e, 0x9d, 0x9b, 0x8e, 0x95, 0x1b,
+ 0x99, 0xb4, 0x87, 0x66, 0x5c, 0x48, 0x7f, 0x3c,
+ 0x1f, 0x74, 0x48, 0x5, 0xf7, 0x2f, 0xf1, 0xae,
+ 0xe6, 0xbc, 0x69, 0xc0, 0x41, 0x70, 0x76, 0x86,
+ 0x85, 0x7c, 0x1f, 0xe, 0xf7, 0xc4, 0x76, 0xf8,
+ 0x3f, 0x77, 0x1, 0xf7, 0x62, 0xf7, 0xaf, 0x15,
+ 0xe7, 0x6, 0xe5, 0xf8, 0x3f, 0x5, 0x51, 0x6,
+ 0x71, 0x6f, 0x55, 0x5f, 0x3f, 0x6b, 0x71, 0x31,
+ 0x18, 0xaf, 0x93, 0xb2, 0x98, 0xb4, 0xa2, 0x8,
+ 0xe, 0xfb, 0xa2, 0xf7, 0xa8, 0xf2, 0xf7, 0x93,
+ 0xf2, 0x1, 0xe7, 0xf7, 0x6, 0xf7, 0x39, 0xf7,
+ 0x6, 0x3, 0xe7, 0xf8, 0x57, 0x15, 0x30, 0xbe,
+ 0x37, 0xf7, 0xf, 0xf7, 0x3f, 0xbb, 0xf7, 0x60,
+ 0xd8, 0xe9, 0x50, 0xe1, 0xfb, 0xa, 0xfb, 0x2b,
+ 0x4a, 0xfb, 0x43, 0xfb, 0x3, 0x1e, 0xf7, 0x6,
+ 0x16, 0xc2, 0xa6, 0xf7, 0x14, 0xd8, 0xa8, 0xab,
+ 0x74, 0x55, 0x5a, 0x6f, 0xfb, 0x15, 0x3f, 0x62,
+ 0x77, 0xad, 0xb1, 0x1e, 0xe, 0x3c, 0x58, 0xa,
+ 0xf3, 0xd7, 0x4d, 0xa, 0xaa, 0xfb, 0x59, 0x4d,
+ 0xa, 0xe, 0xf7, 0x5b, 0x92, 0x76, 0xf9, 0x68,
+ 0x77, 0x1, 0xf8, 0x69, 0xc3, 0x15, 0xf7, 0x31,
+ 0x6, 0x7b, 0x45, 0x5, 0xd7, 0x6, 0x9c, 0xd1,
+ 0x5, 0xba, 0x6, 0x9b, 0xcd, 0x5, 0x5d, 0x6,
+ 0xbd, 0xf7, 0x70, 0x5, 0x41, 0x6, 0xfb, 0x67,
+ 0xfb, 0x70, 0x5, 0xdf, 0x16, 0xee, 0xf6, 0x8d,
+ 0x89, 0x70, 0x22, 0x5, 0xfc, 0x93, 0xfb, 0x21,
+ 0x15, 0xd8, 0x6, 0xf8, 0xe9, 0xf9, 0x6d, 0x5,
+ 0x3e, 0x6, 0xfc, 0xa5, 0xfb, 0xfd, 0x15, 0xe2,
+ 0x6, 0xdf, 0xf7, 0xfb, 0x5, 0x55, 0x6, 0x72,
+ 0x74, 0x58, 0x66, 0x44, 0x70, 0x84, 0x89, 0x18,
+ 0x7a, 0x41, 0xac, 0x92, 0xb0, 0x96, 0xb2, 0x9e,
+ 0x19, 0xe, 0xf7, 0x5b, 0x7d, 0xd5, 0x51, 0x76,
+ 0xf7, 0xbe, 0xcd, 0xf8, 0x1, 0x77, 0x12, 0x13,
+ 0x70, 0xf7, 0x18, 0x78, 0x15, 0xdd, 0x6, 0xf9,
+ 0xe, 0xf9, 0x6d, 0x5, 0x39, 0x6, 0xfc, 0xb8,
+ 0xfb, 0xfd, 0x15, 0xe7, 0x6, 0xe5, 0xf7, 0xfb,
+ 0x5, 0x51, 0x6, 0x71, 0x74, 0x55, 0x66, 0x3f,
+ 0x70, 0x83, 0x89, 0x18, 0x79, 0x41, 0xaf, 0x92,
+ 0xb2, 0x96, 0xb4, 0x9e, 0x19, 0x13, 0xb0, 0xf7,
+ 0xaa, 0xfc, 0xe8, 0x15, 0xf7, 0x97, 0x6, 0x9e,
+ 0xd5, 0x91, 0xa, 0x9c, 0x9a, 0x94, 0x95, 0x96,
+ 0x92, 0x8, 0xf7, 0x1, 0xd9, 0x9a, 0xb3, 0xaf,
+ 0x1a, 0xbb, 0x66, 0xbe, 0x2f, 0xfb, 0x8, 0x7a,
+ 0x32, 0x74, 0x87, 0x1e, 0xe4, 0x7f, 0x5, 0xa3,
+ 0x91, 0x92, 0xad, 0xb0, 0x1b, 0xa5, 0x97, 0x79,
+ 0x7c, 0x70, 0x70, 0x76, 0x3e, 0x4e, 0x1f, 0x43,
+ 0x51, 0x6d, 0x6b, 0x82, 0x4e, 0x8, 0xe, 0xf7,
+ 0x5b, 0x92, 0x76, 0xf7, 0xfa, 0xce, 0xf7, 0xbf,
+ 0x77, 0x12, 0xf7, 0xb4, 0xe6, 0x45, 0xe5, 0x13,
+ 0xf0, 0xf8, 0x6f, 0xc3, 0x15, 0xf7, 0x38, 0x6,
+ 0x7a, 0x45, 0x5, 0xdb, 0x6, 0x9e, 0xd1, 0x5,
+ 0xbb, 0x6, 0x9c, 0xcd, 0x5, 0x5b, 0x6, 0xbf,
+ 0xf7, 0x70, 0x5, 0x3e, 0x6, 0xfb, 0x72, 0xfb,
+ 0x70, 0x5, 0xe3, 0x16, 0xf3, 0xf6, 0x8d, 0x89,
+ 0x70, 0x22, 0x5, 0xfc, 0xa2, 0xfb, 0x21, 0x15,
+ 0xdd, 0x6, 0xf9, 0x5, 0xf9, 0x6d, 0x5, 0x3b,
+ 0x6, 0xfd, 0x28, 0xfb, 0x96, 0x15, 0x76, 0x8e,
+ 0x98, 0x34, 0xf7, 0x8, 0x1b, 0xe9, 0xc1, 0xcc,
+ 0xbe, 0x1f, 0xb3, 0x67, 0x99, 0x9c, 0x1a, 0x13,
+ 0xe8, 0x98, 0xc3, 0x93, 0xc8, 0x1a, 0xb0, 0x6e,
+ 0xc5, 0x30, 0x26, 0x71, 0x42, 0x6f, 0x81, 0x1e,
+ 0xdf, 0x7d, 0x5, 0xaa, 0x94, 0x99, 0x9b, 0xa4,
+ 0x1b, 0x90, 0xa9, 0x8a, 0x6f, 0x59, 0x50, 0x91,
+ 0x7e, 0x8c, 0x1f, 0x7a, 0x44, 0x5, 0x13, 0xf0,
+ 0xa7, 0x92, 0xb3, 0x85, 0x65, 0x1a, 0x72, 0x76,
+ 0x73, 0x67, 0x66, 0x87, 0xa6, 0xa2, 0x87, 0x1e,
+ 0xe, 0x73, 0xfb, 0x57, 0xf2, 0xf8, 0x54, 0x77,
+ 0xcb, 0xf7, 0x18, 0x1, 0xc0, 0xf7, 0x1a, 0x3,
+ 0xf8, 0x40, 0xad, 0x15, 0xfb, 0xa, 0x70, 0x43,
+ 0x83, 0x60, 0x1b, 0x3e, 0x75, 0xb3, 0xab, 0xb0,
+ 0xa1, 0xa2, 0xe1, 0xd4, 0x1f, 0xf7, 0x4, 0xeb,
+ 0xb5, 0xbb, 0x9a, 0xee, 0x8, 0xfb, 0x15, 0x6,
+ 0x80, 0x4c, 0x77, 0x7b, 0x39, 0x48, 0x8, 0xfb,
+ 0xa, 0x2a, 0x58, 0x55, 0x3c, 0x1a, 0x36, 0xd1,
+ 0x31, 0xf7, 0x35, 0xf7, 0x50, 0xd0, 0xf7, 0x1c,
+ 0xd1, 0x9d, 0x1e, 0xfb, 0x72, 0xf8, 0x19, 0x15,
+ 0x9b, 0xa, 0xa8, 0xf7, 0x18, 0x65, 0xa, 0x34,
+ 0xa, 0xd7, 0xf7, 0x27, 0x1, 0xf8, 0x7d, 0xf9,
+ 0xa9, 0x15, 0xea, 0x6, 0x4d, 0xf7, 0x27, 0x91,
+ 0xa, 0xfc, 0x3, 0xfe, 0x3c, 0x27, 0xa, 0x34,
+ 0xa, 0xf7, 0x73, 0x77, 0x1, 0xf8, 0x51, 0xf9,
+ 0xa8, 0x15, 0xee, 0x6, 0xf7, 0x3d, 0xf7, 0x28,
+ 0x5, 0xfb, 0x33, 0x6, 0xfc, 0xaa, 0xfe, 0x3c,
+ 0x27, 0xa, 0x34, 0xa, 0xd6, 0xf7, 0x28, 0x1,
+ 0xf7, 0xd5, 0xf9, 0xa8, 0x15, 0xf7, 0x9, 0x6,
+ 0xe0, 0xe1, 0xb1, 0x35, 0x5, 0xec, 0x6, 0x4f,
+ 0xf7, 0x28, 0x66, 0xa, 0xfc, 0x53, 0xfe, 0x3c,
+ 0x27, 0xa, 0x34, 0xa, 0xe3, 0xf7, 0xe, 0x39,
+ 0xdd, 0x12, 0x13, 0xe8, 0xf7, 0xed, 0xf9, 0xb2,
+ 0x15, 0xcc, 0x6, 0x98, 0x90, 0x94, 0xa9, 0xab,
+ 0x1b, 0xaa, 0xa0, 0x82, 0x80, 0x9e, 0x1f, 0x13,
+ 0xf0, 0x80, 0xa0, 0x9e, 0x82, 0xa7, 0x1b, 0xbb,
+ 0xb6, 0xb4, 0xdc, 0x98, 0x1f, 0x49, 0x6, 0x72,
+ 0x83, 0x84, 0x7b, 0x77, 0x1b, 0x74, 0x78, 0x94,
+ 0x94, 0x74, 0x1f, 0x96, 0x73, 0x71, 0x95, 0x67,
+ 0x1b, 0x46, 0x75, 0x43, 0x58, 0x80, 0x1f, 0xfb,
+ 0xd9, 0xfd, 0xb2, 0x27, 0xa, 0x34, 0xa, 0xde,
+ 0xf7, 0xb, 0x1, 0xf7, 0xed, 0xf9, 0xb0, 0x8f,
+ 0xa, 0xa4, 0xf7, 0xb, 0x5, 0xfb, 0xd, 0x6,
+ 0xf7, 0x4a, 0xfb, 0xb, 0x8f, 0xa, 0xa5, 0xf7,
+ 0xb, 0x7a, 0xa, 0xfc, 0xc3, 0xfe, 0x27, 0x27,
+ 0xa, 0x34, 0xa, 0xf7, 0x58, 0xc0, 0x1, 0x9f,
+ 0xf9, 0x3e, 0x3, 0x9f, 0x16, 0x25, 0xa, 0x29,
+ 0xf8, 0xdb, 0x15, 0x56, 0xb6, 0x5f, 0xc0, 0xbe,
+ 0xb6, 0xb5, 0xc2, 0xc3, 0x61, 0xb1, 0x57, 0x54,
+ 0x62, 0x64, 0x54, 0x1e, 0xbf, 0x16, 0xa3, 0x9e,
+ 0x9c, 0xa4, 0xa2, 0x9f, 0x7b, 0x72, 0x72, 0x77,
+ 0x78, 0x74, 0x73, 0x77, 0x9e, 0xa4, 0x1e, 0xe,
+ 0xf8, 0x1, 0x8b, 0xf7, 0xd, 0xc6, 0xf7, 0xc,
+ 0x98, 0xf7, 0xd, 0xf7, 0x39, 0xf7, 0xb, 0x1,
+ 0x90, 0x16, 0xf7, 0x2c, 0x6, 0xf1, 0xf7, 0x48,
+ 0x5, 0xf7, 0x83, 0x6, 0x66, 0xfb, 0x48, 0x5,
+ 0xf8, 0x99, 0x50, 0xa, 0xfc, 0x10, 0x6, 0xb3,
+ 0xf7, 0x54, 0x5, 0xf7, 0xdd, 0x50, 0xa, 0xfb,
+ 0xdd, 0x6, 0xaf, 0xf7, 0x39, 0x5, 0xf7, 0xf3,
+ 0x6, 0xa4, 0xf7, 0xb, 0x5, 0xfd, 0x39, 0x6,
+ 0x2c, 0xfc, 0x36, 0x15, 0xf7, 0x3e, 0xf7, 0xbf,
+ 0x5, 0xe2, 0x6, 0x4d, 0xfb, 0xbf, 0x5, 0xe,
+ 0xe2, 0xfb, 0x63, 0x76, 0xf7, 0x27, 0xf7, 0x4b,
+ 0xfb, 0x11, 0xf7, 0x11, 0xf8, 0x90, 0xf7, 0x13,
+ 0x12, 0xf6, 0xf7, 0x2c, 0xf7, 0x38, 0xed, 0x13,
+ 0xbc, 0xf7, 0x88, 0xfb, 0x36, 0x15, 0x70, 0x51,
+ 0x5, 0x83, 0xbe, 0xc7, 0x8b, 0x93, 0x1b, 0xf1,
+ 0xde, 0xaa, 0xd9, 0xc6, 0x5b, 0xa7, 0x51, 0x91,
+ 0x1f, 0x8d, 0x7, 0xf7, 0x61, 0x92, 0xe6, 0xf7,
+ 0x23, 0xb1, 0xf3, 0xfb, 0x2f, 0xa2, 0x18, 0xfb,
+ 0x9, 0x64, 0x37, 0x69, 0x4e, 0x1b, 0x27, 0x58,
+ 0xe6, 0xef, 0xf7, 0xb, 0x80, 0xa, 0x68, 0x92,
+ 0x1f, 0xf7, 0x28, 0x99, 0x5, 0xf7, 0x3e, 0x76,
+ 0xfb, 0x15, 0xce, 0xfb, 0x1c, 0x1b, 0xfb, 0x84,
+ 0xfb, 0x30, 0xfb, 0x5e, 0xfb, 0x86, 0xfb, 0x31,
+ 0xcd, 0xfb, 0x33, 0xf7, 0x67, 0x1f, 0x8c, 0x87,
+ 0x89, 0x87, 0x1b, 0x5b, 0x82, 0x73, 0x56, 0x5,
+ 0x13, 0xdc, 0x8e, 0x99, 0x9d, 0x8e, 0xa0, 0x1b,
+ 0xbd, 0x9a, 0x77, 0x79, 0x5c, 0x2e, 0x8b, 0x7c,
+ 0x7e, 0x5c, 0x8e, 0x8c, 0x80, 0x1f, 0xe, 0x41,
+ 0xa, 0xbb, 0x95, 0xa, 0xd7, 0x16, 0x2c, 0xa,
+ 0xf7, 0xa2, 0xbb, 0x15, 0xea, 0x6, 0x4d, 0xf7,
+ 0x2b, 0x5b, 0xa, 0xe, 0x41, 0xa, 0xf7, 0x5b,
+ 0x77, 0x1, 0xd7, 0x16, 0x2c, 0xa, 0xf7, 0x4f,
+ 0xbb, 0x15, 0xe9, 0x6, 0xf7, 0x32, 0xf7, 0x2b,
+ 0x53, 0xa, 0xe, 0x41, 0xa, 0xbb, 0x95, 0xa,
+ 0xd7, 0xf9, 0x3d, 0x3, 0xd7, 0x16, 0x2c, 0xa,
+ 0xe4, 0xbb, 0x15, 0xf7, 0x9, 0x6, 0xe0, 0xe4,
+ 0xb1, 0x32, 0x5, 0xec, 0x6, 0x4f, 0xf7, 0x2b,
+ 0x66, 0xa, 0xe, 0xab, 0x8b, 0xf7, 0xe, 0xf7,
+ 0x5c, 0xf7, 0x10, 0xf7, 0x3c, 0xf7, 0xf, 0x1,
+ 0xf7, 0xec, 0xf9, 0xad, 0x15, 0xf7, 0xd, 0x5f,
+ 0xa, 0xf7, 0xc, 0x4f, 0xa, 0xfb, 0xc, 0x6,
+ 0xfc, 0x87, 0xfe, 0x27, 0x15, 0x2c, 0xa, 0xe,
+ 0x4e, 0xa, 0xd0, 0x95, 0xa, 0xf7, 0xbd, 0xf9,
+ 0xa5, 0x15, 0xe5, 0x6, 0x50, 0x67, 0xa, 0xfb,
+ 0x14, 0x6, 0xfb, 0x1c, 0xfe, 0x3c, 0x15, 0xf7,
+ 0x3f, 0xf9, 0x74, 0x5, 0x5e, 0xa, 0xfb, 0x40,
+ 0xfd, 0x74, 0x5, 0xe, 0x4e, 0xa, 0xf7, 0x70,
+ 0x77, 0x1, 0xcb, 0x16, 0x46, 0xa, 0x90, 0xbc,
+ 0x15, 0xf6, 0x6, 0xf7, 0x49, 0x67, 0xa, 0xfb,
+ 0x3f, 0x6, 0xe, 0x4e, 0xa, 0xd0, 0x95, 0xa,
+ 0xf7, 0xf, 0xf9, 0xa5, 0x15, 0xf7, 0x11, 0x6,
+ 0xe6, 0xe4, 0xb4, 0x32, 0x5, 0xf3, 0x6, 0x4b,
+ 0xf7, 0x2b, 0x3d, 0xa, 0xfb, 0x6b, 0xfe, 0x3c,
+ 0x15, 0x46, 0xa, 0xe, 0x4e, 0xa, 0xd8, 0xf7,
+ 0xe, 0x1, 0xf7, 0x1f, 0xf9, 0xad, 0x6a, 0xa,
+ 0xf7, 0x4b, 0xfb, 0xe, 0x6a, 0xa, 0xfb, 0xc8,
+ 0xfe, 0x27, 0x15, 0x46, 0xa, 0xe, 0x57, 0xa,
+ 0xd3, 0x16, 0xf7, 0x99, 0x6, 0xf7, 0x7e, 0xf7,
+ 0x66, 0xf7, 0x22, 0xf7, 0xa7, 0xf7, 0x71, 0xfb,
+ 0x1a, 0xdb, 0xfb, 0x6c, 0x1f, 0xfb, 0x59, 0x6,
+ 0x49, 0xfb, 0xc3, 0x5, 0x3d, 0x6, 0x73, 0xfb,
+ 0x4, 0x5, 0xd8, 0x6, 0xf7, 0x5, 0xfb, 0x4d,
+ 0x15, 0xb2, 0xf7, 0x4d, 0x5, 0xf7, 0x32, 0x6,
+ 0xa3, 0xf7, 0x4, 0x5, 0xfb, 0x31, 0x6, 0xb3,
+ 0xf7, 0x4d, 0x5, 0xe1, 0x6, 0xd9, 0xf5, 0x84,
+ 0xfb, 0x44, 0xfb, 0x8a, 0xfb, 0x15, 0x56, 0xfb,
+ 0x3d, 0x1f, 0xe, 0x68, 0xa, 0xf9, 0x73, 0x77,
+ 0x1, 0x8a, 0xa, 0xf2, 0xf8, 0x82, 0x5c, 0xa,
+ 0xf7, 0x59, 0xfc, 0x82, 0x5, 0x9b, 0xa, 0xf7,
+ 0x2d, 0xf9, 0x73, 0x3d, 0xa, 0x25, 0xfc, 0x80,
+ 0x51, 0xa, 0xfb, 0x5a, 0xf8, 0x80, 0x3d, 0xa,
+ 0xf7, 0x12, 0xca, 0x15, 0xca, 0x6, 0x8f, 0x99,
+ 0x95, 0xaa, 0xaa, 0x89, 0xab, 0x89, 0x9e, 0x81,
+ 0x9c, 0x81, 0x9e, 0x81, 0x9b, 0x81, 0xab, 0x8d,
+ 0xba, 0x8d, 0xb6, 0xb2, 0x97, 0xdc, 0x8, 0x4a,
+ 0x63, 0xa, 0x77, 0x78, 0x93, 0x94, 0x76, 0x1f,
+ 0x96, 0x73, 0x70, 0x96, 0x67, 0x1b, 0x47, 0x75,
+ 0x43, 0x58, 0x82, 0x1f, 0xe, 0x49, 0xa, 0xf8,
+ 0x9e, 0xf9, 0xa4, 0x75, 0xa, 0xfb, 0xca, 0x2b,
+ 0xa, 0xf7, 0x23, 0x78, 0xf7, 0x14, 0xf9, 0xcf,
+ 0x77, 0x36, 0xa, 0xf8, 0x54, 0xf9, 0xa4, 0x15,
+ 0xea, 0x6, 0xf7, 0x37, 0x5d, 0xa, 0xfb, 0x2e,
+ 0x6, 0xfc, 0x51, 0x2b, 0xa, 0x49, 0xa, 0xf7,
+ 0xef, 0xf9, 0xa4, 0x15, 0xf7, 0xb, 0x6, 0xe2,
+ 0xe5, 0xb3, 0x31, 0x5, 0xee, 0x6, 0x4e, 0xf7,
+ 0x2c, 0x91, 0xa, 0xfc, 0x19, 0x2b, 0xa, 0xf7,
+ 0x23, 0x78, 0xf7, 0x13, 0xf9, 0x70, 0xde, 0x36,
+ 0xa, 0xf8, 0xa, 0xf9, 0xb1, 0x15, 0xcb, 0x6,
+ 0x99, 0x8f, 0x95, 0xa8, 0xa9, 0x1b, 0xac, 0xa0,
+ 0x82, 0x81, 0x9f, 0x1f, 0x80, 0x9e, 0x9d, 0x81,
+ 0xa4, 0x1b, 0xbb, 0xb5, 0xb4, 0xdd, 0x97, 0x1f,
+ 0x4a, 0x63, 0xa, 0x76, 0x79, 0x94, 0x94, 0x76,
+ 0x1f, 0x96, 0x74, 0x70, 0x95, 0x66, 0x1b, 0x47,
+ 0x75, 0x43, 0x57, 0x81, 0x1f, 0xfb, 0x9f, 0xfc,
+ 0x97, 0x21, 0xa, 0xe, 0x8c, 0xa, 0xf8, 0x8f,
+ 0xf7, 0x12, 0x36, 0xa, 0xf6, 0xf7, 0xae, 0x21,
+ 0xa, 0xf7, 0xc, 0xf8, 0x92, 0x15, 0xf7, 0xf,
+ 0x71, 0xa, 0xfb, 0x10, 0x6, 0xf7, 0x4d, 0xfb,
+ 0xf, 0x15, 0xf7, 0x10, 0x71, 0xa, 0xfb, 0x10,
+ 0x6, 0xe, 0x58, 0xa1, 0x76, 0xf8, 0x8c, 0x77,
+ 0x1, 0xc5, 0xec, 0x15, 0xf7, 0x0, 0x2c, 0xf7,
+ 0x46, 0xf7, 0x31, 0xf7, 0x49, 0xfb, 0x32, 0xf7,
+ 0x2, 0xec, 0xfb, 0x49, 0xf7, 0x31, 0xf7, 0x47,
+ 0xf7, 0x2f, 0x20, 0xea, 0xfb, 0x47, 0xfb, 0x31,
+ 0xfb, 0x48, 0xf7, 0x31, 0xfb, 0x2, 0x2b, 0xf7,
+ 0x49, 0xfb, 0x30, 0x5, 0xe, 0xf7, 0x23, 0x85,
+ 0x76, 0xf9, 0x98, 0x77, 0x1, 0xe0, 0xf7, 0xb,
+ 0xf8, 0x21, 0xf7, 0x3, 0x3, 0xf8, 0xea, 0xf8,
+ 0x9c, 0x15, 0x98, 0x76, 0x94, 0x55, 0x65, 0x1a,
+ 0xfb, 0xf, 0x23, 0xfb, 0x2b, 0xfb, 0x32, 0x5a,
+ 0x65, 0x8b, 0x94, 0x7b, 0x1e, 0x4f, 0xca, 0x15,
+ 0x80, 0x97, 0x82, 0xb2, 0xb6, 0x1a, 0xf7, 0x14,
+ 0xf3, 0xf7, 0x3b, 0xf7, 0x31, 0xc3, 0xb4, 0x89,
+ 0x84, 0x93, 0x1e, 0xfc, 0x93, 0xfc, 0xc4, 0x15,
+ 0xd1, 0x57, 0xd7, 0xde, 0x5, 0x6c, 0xc0, 0xc5,
+ 0x84, 0xc0, 0x1b, 0xf7, 0xac, 0xf7, 0x3, 0xf7,
+ 0x62, 0xf7, 0x4b, 0xc4, 0x87, 0xe7, 0x64, 0xc7,
+ 0x1f, 0xd3, 0xd8, 0x46, 0xbf, 0x44, 0x3e, 0x5,
+ 0xa8, 0x58, 0x4e, 0x97, 0x4e, 0x1b, 0xfb, 0xc1,
+ 0x31, 0xfb, 0x8c, 0xfb, 0x36, 0x59, 0x95, 0x3b,
+ 0xb4, 0x4f, 0x1f, 0xe, 0x2d, 0xa, 0xf7, 0x30,
+ 0xbc, 0x15, 0xed, 0x6, 0x4a, 0xf7, 0x2c, 0x81,
+ 0xa, 0x2d, 0xa, 0xb6, 0xc1, 0x60, 0xa, 0xe2,
+ 0x78, 0xf7, 0x14, 0xf9, 0x3c, 0xf7, 0x27, 0x24,
+ 0xa, 0x68, 0xc1, 0x45, 0xa, 0xe2, 0x78, 0xf7,
+ 0x14, 0xf9, 0x6, 0x77, 0xdb, 0xf7, 0xc, 0x24,
+ 0xa, 0x85, 0xc7, 0x3a, 0xa, 0xab, 0xa0, 0x76,
+ 0xf9, 0x74, 0x77, 0xf7, 0x70, 0x77, 0x1, 0x64,
+ 0xa, 0xf7, 0xa5, 0xf7, 0xcc, 0xf8, 0x63, 0x43,
+ 0xa, 0xfb, 0x5d, 0xfb, 0xcf, 0xfb, 0x10, 0xf7,
+ 0xcf, 0x5a, 0xa, 0xf7, 0x51, 0xfc, 0x55, 0x5,
+ 0xcb, 0xf8, 0x86, 0x15, 0xe4, 0x6, 0xf7, 0x2a,
+ 0xf7, 0x2b, 0x92, 0xa, 0xe, 0xab, 0xa0, 0x76,
+ 0xf7, 0x1d, 0xf7, 0xc, 0xf7, 0x60, 0xf7, 0xc,
+ 0xf7, 0x1d, 0x77, 0x1, 0xf8, 0xcc, 0xf7, 0x28,
+ 0x3, 0xd7, 0x16, 0xf7, 0x29, 0x6, 0xa8, 0xf7,
+ 0x1d, 0x5, 0xeb, 0x6, 0xf7, 0x52, 0xf7, 0x44,
+ 0xba, 0xf7, 0x61, 0xf7, 0x48, 0xfb, 0x3e, 0x97,
+ 0x57, 0x1f, 0xfb, 0x27, 0x6, 0xa8, 0xf7, 0x1d,
+ 0x53, 0xa, 0xbf, 0xfc, 0x61, 0x15, 0xb7, 0xf7,
+ 0x60, 0x5, 0xf6, 0x6, 0xd7, 0xc9, 0x8d, 0x41,
+ 0xfb, 0xc, 0xfb, 0x1a, 0x7f, 0xfb, 0x1, 0x1f,
+ 0xe, 0x73, 0x7d, 0xf7, 0x8, 0x38, 0x76, 0xf9,
+ 0x7, 0xf5, 0x12, 0xf8, 0x94, 0xf7, 0x25, 0x13,
+ 0x70, 0xd0, 0x89, 0x15, 0xf7, 0x2e, 0x6, 0xf2,
+ 0xf8, 0x56, 0x5, 0xe1, 0x9e, 0xa0, 0xe6, 0xe2,
+ 0x1b, 0xb4, 0x97, 0x7b, 0x74, 0x73, 0x77, 0x6d,
+ 0x79, 0x77, 0x1f, 0x61, 0x5b, 0x79, 0x61, 0x63,
+ 0x1a, 0x5e, 0xa4, 0x5e, 0xb2, 0x55, 0x1e, 0x9c,
+ 0x72, 0xa2, 0x65, 0x6e, 0x1a, 0x13, 0xb0, 0x72,
+ 0x7c, 0x78, 0x5c, 0x65, 0x7c, 0x9f, 0x9b, 0x7e,
+ 0x1e, 0xfb, 0x1, 0x53, 0x5, 0x66, 0xa7, 0xcf,
+ 0x50, 0xef, 0x1b, 0xf7, 0x1c, 0xbd, 0xd1, 0xdc,
+ 0xc1, 0x73, 0xc7, 0x68, 0xb6, 0x1f, 0x6a, 0xb2,
+ 0x7b, 0xa0, 0xa3, 0x1a, 0xa2, 0x98, 0x9b, 0xa0,
+ 0xaa, 0x1e, 0xac, 0xbb, 0xaf, 0xcf, 0xc4, 0x1a,
+ 0xc4, 0x5c, 0xc0, 0xfb, 0x1a, 0xfb, 0x63, 0x5a,
+ 0xfb, 0x0, 0xfb, 0x43, 0x61, 0x1e, 0xe, 0x42,
+ 0xa, 0xf8, 0x8c, 0xf7, 0x2c, 0x76, 0xa, 0xf8,
+ 0x1a, 0x89, 0x20, 0xa, 0x13, 0xb0, 0x2a, 0xa,
+ 0x70, 0xf7, 0xf2, 0x15, 0xf2, 0x6, 0x48, 0xf7,
+ 0x2c, 0x93, 0xa, 0xe, 0x42, 0xa, 0xf7, 0xf1,
+ 0xf3, 0xf7, 0x5f, 0x77, 0x12, 0xc2, 0xf7, 0x2b,
+ 0x13, 0x78, 0xf7, 0xe8, 0xf8, 0xea, 0x15, 0xf5,
+ 0x6, 0xf7, 0x49, 0x5d, 0xa, 0xfb, 0x3e, 0x6,
+ 0x48, 0xfd, 0x84, 0x20, 0xa, 0x13, 0xb8, 0x2e,
+ 0xa, 0x42, 0xa, 0xf8, 0x8c, 0xf7, 0x2c, 0x76,
+ 0xa, 0xf7, 0x62, 0xf8, 0xea, 0x15, 0xf7, 0x11,
+ 0x6, 0xe7, 0xe5, 0xb4, 0x31, 0x5, 0xf3, 0x6,
+ 0x4b, 0xf7, 0x2c, 0x92, 0xa, 0xa7, 0xfd, 0x84,
+ 0x20, 0xa, 0x13, 0xb0, 0x2e, 0xa, 0x42, 0xa,
+ 0xf8, 0xc5, 0xdd, 0x89, 0x77, 0x12, 0xc2, 0xf7,
+ 0x2b, 0x13, 0xa8, 0xf7, 0x7f, 0xf8, 0xf7, 0x15,
+ 0xd2, 0x6, 0x90, 0x9a, 0x95, 0xa7, 0xad, 0x8c,
+ 0xaa, 0x8c, 0xa6, 0x7f, 0xa6, 0x80, 0x8, 0x82,
+ 0xa2, 0xa0, 0x82, 0xa1, 0x1b, 0xbf, 0xba, 0xb4,
+ 0xdc, 0x99, 0x1f, 0x43, 0x6, 0x72, 0x83, 0x83,
+ 0x7b, 0x75, 0x1b, 0x77, 0x79, 0x91, 0x93, 0x76,
+ 0x1f, 0x13, 0x58, 0x97, 0x70, 0x6b, 0x98, 0x5e,
+ 0x1b, 0x40, 0x72, 0x43, 0x57, 0x80, 0x1f, 0xf7,
+ 0x2f, 0xfc, 0xf9, 0x20, 0xa, 0x13, 0xa8, 0x2e,
+ 0xa, 0x3c, 0x7d, 0xf6, 0x2c, 0xea, 0x12, 0xc2,
+ 0xf7, 0x22, 0x13, 0x60, 0xf7, 0x6d, 0xf8, 0xf3,
+ 0x6d, 0xa, 0xf7, 0x56, 0xfb, 0xe, 0x6d, 0xa,
+ 0x40, 0xfd, 0x6f, 0x20, 0xa, 0x13, 0xa0, 0x2e,
+ 0xa, 0x42, 0xa, 0xf7, 0xba, 0xf7, 0x33, 0x23,
+ 0xf3, 0xad, 0xf7, 0x57, 0x56, 0x77, 0x12, 0xc2,
+ 0xf7, 0x23, 0x13, 0xaa, 0xf7, 0xb3, 0xf9, 0x3a,
+ 0x15, 0x56, 0xba, 0x5f, 0xc4, 0xc3, 0xb9, 0xb5,
+ 0xc2, 0xc2, 0x5d, 0xb6, 0x53, 0x4f, 0x5f, 0x60,
+ 0x54, 0x1e, 0xc3, 0x16, 0x13, 0x56, 0xa4, 0xa0,
+ 0x9f, 0xa6, 0xa4, 0xa0, 0x79, 0x70, 0x73, 0x76,
+ 0x77, 0x72, 0x70, 0x76, 0x9f, 0xa3, 0x1e, 0xba,
+ 0xfd, 0x3c, 0x32, 0xa, 0x99, 0xca, 0x9a, 0xc0,
+ 0x1e, 0x99, 0xa, 0xab, 0xb1, 0x1a, 0xab, 0x7b,
+ 0xf7, 0x4, 0xfb, 0x59, 0x27, 0xfb, 0x4, 0x6b,
+ 0xfb, 0xd, 0x60, 0x1e, 0xf7, 0x28, 0x7f, 0x5,
+ 0xba, 0x98, 0xb1, 0x99, 0xb8, 0x1b, 0xcf, 0xa6,
+ 0x5b, 0x54, 0x71, 0x1f, 0x6c, 0x80, 0x55, 0x88,
+ 0x4f, 0x84, 0x8, 0x42, 0x87, 0xfb, 0x2f, 0x7d,
+ 0xfb, 0x33, 0x1a, 0x28, 0xd6, 0x52, 0xe1, 0x1e,
+ 0x13, 0xaa, 0xba, 0xcb, 0x9d, 0xc2, 0xbf, 0x1f,
+ 0x8e, 0x70, 0x8b, 0x82, 0x93, 0x72, 0x8, 0x99,
+ 0xf7, 0x7b, 0x15, 0x31, 0xa, 0x91, 0xe6, 0x98,
+ 0x1f, 0xe, 0xf7, 0x92, 0x7d, 0xf7, 0x1, 0xf7,
+ 0x11, 0xe3, 0xf7, 0x1b, 0xf2, 0x1, 0xc3, 0xf7,
+ 0x17, 0xf8, 0xef, 0xf7, 0x19, 0x3, 0xf7, 0x7,
+ 0xf8, 0x1e, 0x15, 0xf7, 0x1f, 0x7d, 0x5, 0xa4,
+ 0x94, 0x99, 0xb1, 0xd0, 0x1b, 0xce, 0xa2, 0x60,
+ 0x50, 0x7f, 0x1f, 0x7b, 0x86, 0x7c, 0x84, 0xfb,
+ 0x0, 0x82, 0x8, 0x35, 0x83, 0xfb, 0x23, 0x86,
+ 0xfb, 0x31, 0x1a, 0x28, 0xd3, 0x4a, 0xec, 0xf7,
+ 0x15, 0xd0, 0xe7, 0xac, 0xa3, 0x1e, 0x6e, 0x99,
+ 0xb8, 0x2b, 0xf7, 0x22, 0x1b, 0xf7, 0x36, 0xcf,
+ 0xf7, 0x11, 0xab, 0x9e, 0x1f, 0xfb, 0x17, 0x9f,
+ 0x5, 0x46, 0x64, 0x50, 0x8b, 0x7d, 0x1b, 0x4f,
+ 0x5a, 0xbb, 0xd9, 0x88, 0x1f, 0xf8, 0x7, 0x6,
+ 0x94, 0xb4, 0x8c, 0xb0, 0x9a, 0x1a, 0xf7, 0x1f,
+ 0x37, 0xe9, 0xfb, 0x1b, 0x64, 0x3f, 0x85, 0x4e,
+ 0x4b, 0x1e, 0x9f, 0x7f, 0x6d, 0xba, 0xfb, 0x12,
+ 0x1b, 0xfb, 0x1b, 0x39, 0x4d, 0x31, 0x72, 0x1f,
+ 0xf8, 0x4a, 0x35, 0x15, 0xf7, 0x5, 0xa4, 0xd7,
+ 0xa1, 0xb1, 0x1b, 0xcb, 0xb3, 0x5b, 0x34, 0x85,
+ 0x1f, 0xfc, 0x15, 0x52, 0x15, 0x43, 0x7c, 0x56,
+ 0x37, 0x3a, 0x1b, 0x55, 0x7c, 0xab, 0xa2, 0xbb,
+ 0xbf, 0xad, 0xf7, 0x3a, 0x9e, 0x1f, 0xe, 0x3c,
+ 0xfb, 0x63, 0x76, 0xf9, 0x2c, 0xf7, 0x2, 0x1,
+ 0xda, 0xf7, 0x23, 0xe4, 0xe2, 0x3, 0xf7, 0x8a,
+ 0x67, 0x15, 0x72, 0x55, 0x5, 0xa0, 0x8e, 0xd0,
+ 0x9b, 0x5d, 0x1a, 0x56, 0x2c, 0x8d, 0x61, 0x8c,
+ 0x1e, 0x71, 0x52, 0x5, 0x88, 0x9e, 0xa4, 0x8a,
+ 0x9e, 0x1b, 0xa6, 0xf7, 0x34, 0x8b, 0xf7, 0x3,
+ 0x97, 0x89, 0xc7, 0x3c, 0x98, 0x1f, 0x8d, 0x7,
+ 0xa7, 0x8c, 0xbc, 0x90, 0xbd, 0xad, 0xa3, 0x9a,
+ 0xc5, 0xb6, 0xae, 0xed, 0xfb, 0x20, 0xa3, 0x18,
+ 0x33, 0x6c, 0x50, 0x7c, 0x6f, 0x1b, 0x64, 0x61,
+ 0xb1, 0xd2, 0xe3, 0xb4, 0xf7, 0x2c, 0xf7, 0x4,
+ 0xd7, 0x93, 0x46, 0x77, 0x8e, 0x1f, 0xf7, 0x1d,
+ 0x9a, 0x5, 0xe3, 0x84, 0x4f, 0xeb, 0xfb, 0x28,
+ 0x1b, 0xfb, 0x3f, 0xfb, 0x1a, 0xfb, 0x1e, 0xfb,
+ 0x68, 0x22, 0xc9, 0x2d, 0xdd, 0x7a, 0x1f, 0x89,
+ 0x96, 0xb2, 0x83, 0x88, 0x1b, 0x89, 0x8a, 0x7f,
+ 0x89, 0x81, 0x88, 0x8, 0xe, 0x3c, 0xf7, 0x71,
+ 0xe3, 0xf7, 0xb5, 0xf7, 0x2c, 0x1, 0xd1, 0xf7,
+ 0x21, 0xf7, 0x8c, 0xf7, 0x1a, 0x3, 0xf7, 0x67,
+ 0xf7, 0x71, 0x23, 0xa, 0x35, 0xf7, 0xb5, 0x15,
+ 0xef, 0x6, 0x4a, 0xf7, 0x2c, 0x47, 0xa, 0xe,
+ 0x3c, 0xf7, 0x71, 0xe3, 0xf8, 0x4d, 0x77, 0x1,
+ 0xce, 0xf7, 0x2c, 0xf7, 0x7e, 0xf7, 0x23, 0x3,
+ 0xf7, 0xd8, 0xf8, 0xea, 0x15, 0xf3, 0x6, 0xf7,
+ 0x46, 0x5d, 0xa, 0xfb, 0x3c, 0x6, 0xfb, 0x77,
+ 0xfc, 0xa5, 0x23, 0xa, 0xe, 0x3c, 0x7d, 0xf2,
+ 0xf7, 0x18, 0xe3, 0xf7, 0xb5, 0xf7, 0x2c, 0x7d,
+ 0xa, 0xf7, 0x4c, 0xf8, 0xea, 0x8f, 0xa, 0xe5,
+ 0xe5, 0xb3, 0x31, 0x5, 0xf1, 0x6, 0x4c, 0xf7,
+ 0x2c, 0x54, 0xa, 0xfb, 0x12, 0xfc, 0xa5, 0x23,
+ 0xa, 0xe, 0x3c, 0x7d, 0xf1, 0xf7, 0x17, 0xe1,
+ 0x1, 0xd1, 0xf7, 0x23, 0xf7, 0x8b, 0xf7, 0x1a,
+ 0x3, 0xf7, 0x6b, 0xf8, 0xf3, 0x15, 0xf7, 0x13,
+ 0x6e, 0xa, 0xfb, 0x13, 0x6, 0xf7, 0x52, 0xfb,
+ 0xe, 0x15, 0xf7, 0x13, 0x6e, 0xa, 0xfb, 0x12,
+ 0x6, 0xfb, 0x8b, 0xfc, 0x90, 0x23, 0xa, 0xe,
+ 0x48, 0xa, 0xf8, 0xeb, 0x95, 0xa, 0xd0, 0x16,
+ 0x3c, 0xa, 0xc7, 0xd0, 0x15, 0xe7, 0x6, 0x4f,
+ 0x67, 0xa, 0xfb, 0x18, 0x6, 0xe, 0x48, 0xa,
+ 0xf9, 0x82, 0x77, 0x1, 0xf7, 0x4a, 0xf8, 0xeb,
+ 0x15, 0xf5, 0x6, 0xf7, 0x48, 0x67, 0xa, 0xfb,
+ 0x3e, 0x6, 0xfb, 0x79, 0xfd, 0x82, 0x15, 0x3c,
+ 0xa, 0xe, 0x48, 0xa, 0xf8, 0xeb, 0x95, 0xa,
+ 0xc9, 0xf8, 0xeb, 0x15, 0xf7, 0x15, 0x6, 0xe9,
+ 0xe4, 0xb5, 0x32, 0x5, 0xf6, 0x6, 0x49, 0x67,
+ 0xa, 0xfb, 0x25, 0x6, 0xfb, 0x2e, 0xfd, 0x82,
+ 0x15, 0x3c, 0xa, 0xe, 0x48, 0xa, 0xf8, 0xf3,
+ 0xf7, 0xe, 0x1, 0xe6, 0xf8, 0xf3, 0x15, 0xf7,
+ 0xe, 0x5f, 0xa, 0xf7, 0xe, 0x6, 0xa4, 0xf7,
+ 0xe, 0x5, 0xfb, 0xd, 0x6, 0xfb, 0x93, 0xfd,
+ 0x6d, 0x15, 0x3c, 0xa, 0xe, 0x73, 0x7d, 0xf7,
+ 0x3, 0xf7, 0xd8, 0xf7, 0x4, 0xf7, 0x60, 0x77,
+ 0x1, 0xdd, 0xf7, 0x28, 0xf7, 0xae, 0xf7, 0x2f,
+ 0x3, 0xf7, 0xe7, 0xf8, 0xcf, 0x15, 0xf7, 0x13,
+ 0xb6, 0xac, 0x52, 0x98, 0x5a, 0x93, 0x68, 0x19,
+ 0x88, 0x89, 0x5, 0xa4, 0x76, 0x67, 0xb0, 0x32,
+ 0x1b, 0xfb, 0x42, 0xfb, 0x7, 0xfb, 0x26, 0xfb,
+ 0x36, 0x26, 0xc2, 0xfb, 0x1e, 0xf7, 0x68, 0xf7,
+ 0x87, 0xd6, 0xf7, 0x4e, 0xf7, 0x18, 0xf7, 0x1e,
+ 0x68, 0xf7, 0x6, 0x53, 0xed, 0x1f, 0xe9, 0xad,
+ 0x7a, 0xbc, 0x20, 0x65, 0x81, 0x9b, 0x87, 0x91,
+ 0x7f, 0x9b, 0x19, 0x9a, 0xa, 0xae, 0x64, 0x93,
+ 0x82, 0x9c, 0x6f, 0xfb, 0x9, 0x63, 0x18, 0x30,
+ 0xfc, 0x20, 0x15, 0xdd, 0xc2, 0xf7, 0x6, 0xf7,
+ 0x6, 0xbe, 0xc9, 0x6c, 0x35, 0x57, 0x5f, 0xfb,
+ 0x2f, 0xfb, 0x10, 0x3c, 0x68, 0xd1, 0xc5, 0x1e,
+ 0xe, 0x84, 0xa, 0xf8, 0xf8, 0xf7, 0x11, 0x39,
+ 0xdd, 0x89, 0x77, 0x12, 0xf8, 0x84, 0xf7, 0x2a,
+ 0x13, 0xc8, 0xcc, 0x16, 0xf7, 0x29, 0x6, 0xbb,
+ 0xf7, 0x6f, 0x9d, 0xdc, 0x91, 0xad, 0xa7, 0xb0,
+ 0x19, 0xad, 0xa7, 0xb9, 0xb0, 0xb9, 0x1b, 0xba,
+ 0x9a, 0x71, 0x6a, 0x70, 0x85, 0x6c, 0x85, 0x75,
+ 0x1f, 0x49, 0xfb, 0xc3, 0x5, 0xf7, 0x29, 0x6,
+ 0xcd, 0xf7, 0xc2, 0x5, 0x94, 0xb2, 0x8f, 0xb8,
+ 0xb4, 0x1a, 0xc1, 0x65, 0xcb, 0x22, 0x32, 0x4d,
+ 0x5f, 0x65, 0x60, 0x1e, 0x89, 0x8d, 0x99, 0xce,
+ 0x5, 0xfb, 0x20, 0x6, 0xe3, 0xdb, 0x15, 0xcd,
+ 0x6, 0x13, 0xa8, 0x90, 0x99, 0x94, 0xa7, 0xab,
+ 0x8c, 0xa6, 0x8c, 0xa0, 0x80, 0xa1, 0x7f, 0xa1,
+ 0x81, 0xa0, 0x82, 0xa6, 0x8c, 0xbc, 0x8e, 0xb7,
+ 0xb1, 0x98, 0xdc, 0x8, 0x48, 0x6, 0x72, 0x83,
+ 0x84, 0x7b, 0x77, 0x1b, 0x78, 0x78, 0x91, 0x93,
+ 0x78, 0x1f, 0x13, 0x98, 0x97, 0x70, 0x6d, 0x98,
+ 0x65, 0x1b, 0x13, 0xc8, 0x44, 0x74, 0x43, 0x58,
+ 0x81, 0x1f, 0xe, 0x4c, 0xa, 0xdd, 0xf7, 0x70,
+ 0x22, 0xa, 0xf7, 0x4c, 0xf8, 0xe, 0x15, 0xee,
+ 0x6, 0x4b, 0xf7, 0x2c, 0x65, 0xa, 0x73, 0x7d,
+ 0xf7, 0x1, 0xf9, 0x23, 0x77, 0x1, 0xdd, 0xf7,
+ 0x28, 0xf7, 0x9d, 0xf7, 0x28, 0x3, 0xf7, 0xfe,
+ 0xf8, 0xea, 0x15, 0xee, 0x6, 0xf7, 0x3d, 0x5d,
+ 0xa, 0xfb, 0x33, 0x6, 0xfc, 0x19, 0xfc, 0xa6,
+ 0x22, 0xa, 0xe, 0x4c, 0xa, 0xf7, 0x73, 0xf8,
+ 0xea, 0x15, 0xf7, 0xd, 0x6, 0xe4, 0xe5, 0xb3,
+ 0x31, 0x5, 0xf0, 0x6, 0x4c, 0xf7, 0x2c, 0x5b,
+ 0xa, 0xfb, 0xb9, 0xfc, 0xa6, 0x22, 0xa, 0xe,
+ 0x73, 0x7d, 0xf7, 0x1, 0xf8, 0xc4, 0xdd, 0x89,
+ 0x77, 0x12, 0xdd, 0xf7, 0x26, 0xf7, 0xa4, 0xf7,
+ 0x26, 0x13, 0xd8, 0xf7, 0x9b, 0xf8, 0xf7, 0x15,
+ 0xcc, 0x6, 0x8f, 0x9a, 0x94, 0xa7, 0xab, 0x8c,
+ 0xa4, 0x8c, 0xa5, 0x7c, 0xa7, 0x80, 0x9f, 0x82,
+ 0xa0, 0x84, 0x9e, 0x8c, 0xbb, 0x8e, 0xb6, 0xb1,
+ 0x98, 0xdc, 0x8, 0x48, 0x63, 0xa, 0x77, 0x78,
+ 0x92, 0x93, 0x76, 0x1f, 0x13, 0xb8, 0x97, 0x70,
+ 0x6d, 0x97, 0x6a, 0x1b, 0x45, 0x74, 0x43, 0x57,
+ 0x82, 0x1f, 0xfb, 0x49, 0xfc, 0x1b, 0x22, 0xa,
+ 0xe, 0x73, 0x7d, 0xf7, 0x0, 0x3f, 0xa, 0xf7,
+ 0x91, 0xf8, 0xf3, 0x15, 0xf7, 0x12, 0x6e, 0xa,
+ 0xfb, 0x12, 0x6, 0xf7, 0x50, 0xfb, 0xe, 0x15,
+ 0xf7, 0x12, 0x6e, 0xa, 0xfb, 0x11, 0x6, 0xfc,
+ 0x30, 0xfc, 0x91, 0x22, 0xa, 0xe, 0x58, 0xf7,
+ 0x4d, 0xf7, 0x1d, 0x1, 0xf7, 0xa6, 0xf7, 0x24,
+ 0x3, 0xdd, 0xf7, 0x4d, 0x15, 0xf8, 0xa4, 0xf7,
+ 0x1d, 0xfc, 0xa4, 0x6, 0xf7, 0x54, 0xda, 0x15,
+ 0xf7, 0x24, 0xf7, 0x27, 0xfb, 0x24, 0x6, 0xfc,
+ 0xe2, 0x4, 0xf7, 0x24, 0xf7, 0x25, 0xfb, 0x24,
+ 0x6, 0xe, 0xfb, 0x8, 0x83, 0x76, 0xb1, 0xeb,
+ 0xf7, 0xd5, 0xeb, 0xb1, 0x77, 0x1, 0xd3, 0xf7,
+ 0xb, 0xf7, 0x68, 0xf7, 0xc, 0x3, 0x9e, 0x9a,
+ 0x15, 0xc2, 0x5f, 0xcb, 0xce, 0x5, 0x70, 0xc3,
+ 0xc0, 0x89, 0xac, 0x1b, 0xf7, 0x59, 0xeb, 0xf7,
+ 0x24, 0xf7, 0x28, 0xbf, 0x7b, 0xd0, 0x73, 0xa8,
+ 0x1f, 0xca, 0xcd, 0x52, 0xb6, 0x4b, 0x49, 0x5,
+ 0xa6, 0x56, 0x4d, 0x8c, 0x72, 0x1b, 0xfb, 0x97,
+ 0x69, 0xfb, 0x6c, 0x32, 0x48, 0x9b, 0x59, 0xa2,
+ 0x78, 0x1f, 0xe3, 0xe7, 0x15, 0x88, 0x93, 0x86,
+ 0x98, 0xa2, 0x1a, 0xd7, 0xc2, 0xf7, 0x19, 0xf7,
+ 0x7, 0xb0, 0x9e, 0x80, 0x87, 0x94, 0x1e, 0xfb,
+ 0x47, 0xfb, 0xb8, 0x15, 0xf7, 0x76, 0xf7, 0x82,
+ 0x5, 0x8e, 0x80, 0x92, 0x73, 0x76, 0x1a, 0x49,
+ 0x5d, 0xfb, 0x16, 0xfb, 0x13, 0x67, 0x7b, 0x94,
+ 0x90, 0x80, 0x1e, 0xe, 0x59, 0xa, 0xf8, 0x91,
+ 0xf7, 0x2c, 0x29, 0xa, 0x79, 0xf8, 0xa5, 0x75,
+ 0xa, 0xe, 0x59, 0xa, 0xf9, 0x29, 0x77, 0x29,
+ 0xa, 0x21, 0xf8, 0xaa, 0x60, 0xa, 0x59, 0xa,
+ 0xf8, 0x96, 0xf7, 0x27, 0x29, 0xa, 0xfb, 0x74,
+ 0xf8, 0xaa, 0x45, 0xa, 0x59, 0xa, 0x12, 0x13,
+ 0x40, 0x28, 0xa, 0x13, 0x80, 0x35, 0xa, 0x13,
+ 0x40, 0xfb, 0x2f, 0xf8, 0xb0, 0x3a, 0xa, 0x3c,
+ 0xfb, 0x55, 0x76, 0xfa, 0x58, 0x77, 0x1, 0xcb,
+ 0xf8, 0xf6, 0x3, 0xc2, 0x30, 0x15, 0x7e, 0xfb,
+ 0x0, 0x7e, 0xa, 0xcb, 0xee, 0xc2, 0x1f, 0xf7,
+ 0xd1, 0xf8, 0xd9, 0x77, 0xa, 0xfc, 0x28, 0x51,
+ 0xa, 0x59, 0xf8, 0x28, 0x54, 0xa, 0xe5, 0xfc,
+ 0xa4, 0x5, 0x4e, 0x6c, 0xa, 0xf7, 0xa5, 0xf9,
+ 0x46, 0x15, 0xe7, 0x6, 0xf7, 0x31, 0xf7, 0x2b,
+ 0x94, 0xa, 0xe, 0x73, 0xfb, 0x4f, 0x76, 0xf7,
+ 0x51, 0xf6, 0xf7, 0xea, 0xf0, 0xf7, 0x4f, 0x77,
+ 0x1, 0x9d, 0xf7, 0x23, 0xf7, 0xec, 0xf7, 0x20,
+ 0x3, 0xf7, 0x70, 0xcc, 0x15, 0x3d, 0xbd, 0xd8,
+ 0x85, 0xac, 0x1b, 0xf7, 0x2d, 0xf7, 0x4, 0xf7,
+ 0x2d, 0xf7, 0x3e, 0xe9, 0x69, 0xf7, 0x19, 0xfb,
+ 0x2b, 0x40, 0x58, 0x66, 0x79, 0x73, 0x1f, 0xbd,
+ 0xf7, 0x86, 0x47, 0xa, 0xfb, 0x5b, 0xfe, 0x32,
+ 0x8d, 0xa, 0xed, 0xf8, 0x3d, 0x15, 0xc0, 0xab,
+ 0xf7, 0x34, 0xf7, 0x5, 0xc1, 0xba, 0x60, 0x38,
+ 0x4a, 0x67, 0xfb, 0x2b, 0xfb, 0x1, 0x6a, 0x47,
+ 0xa2, 0xf5, 0x1e, 0xe, 0x3c, 0xfb, 0x55, 0x76,
+ 0xf9, 0xca, 0xf7, 0xd, 0x1, 0xc2, 0x2f, 0x15,
+ 0x7e, 0x20, 0x7e, 0xa, 0xca, 0xee, 0xc2, 0x1f,
+ 0xf7, 0xd1, 0xf8, 0xd8, 0x77, 0xa, 0xfc, 0x29,
+ 0x51, 0xa, 0x59, 0xf8, 0x29, 0x54, 0xa, 0xe5,
+ 0xfc, 0xa4, 0x5, 0x4f, 0x6c, 0xa, 0xf7, 0x42,
+ 0xf9, 0x50, 0x6b, 0xa, 0xf7, 0x47, 0xfb, 0xd,
+ 0x6b, 0xa, 0xe, 0x78, 0x9e, 0xf8, 0xa8, 0x99,
+ 0xf7, 0x40, 0x9e, 0x6, 0xfb, 0x6d, 0x95, 0x7,
+ 0x1e, 0xa0, 0x39, 0x63, 0xff, 0xc, 0x9, 0xf2,
+ 0xa, 0xf7, 0x2a, 0xb, 0xf2, 0x9c, 0x93, 0xc,
+ 0xc, 0xf7, 0xe1, 0x14, 0xf9, 0xf, 0x15, 0xb1,
+ 0x13, 0x0, 0x7c, 0x2, 0x0, 0x1, 0x0, 0x31,
+ 0x0, 0x6d, 0x0, 0x7a, 0x0, 0xc0, 0x1, 0x5,
+ 0x1, 0x2a, 0x1, 0x51, 0x1, 0x55, 0x1, 0x87,
+ 0x1, 0x93, 0x1, 0xa3, 0x1, 0xa8, 0x1, 0xc7,
+ 0x1, 0xd1, 0x1, 0xd4, 0x1, 0xdc, 0x1, 0xea,
+ 0x1, 0xf8, 0x2, 0x4, 0x2, 0x11, 0x2, 0x1b,
+ 0x2, 0x2a, 0x2, 0x34, 0x2, 0x3b, 0x2, 0x44,
+ 0x2, 0x4d, 0x2, 0x56, 0x2, 0x5e, 0x2, 0x67,
+ 0x2, 0x6c, 0x2, 0x71, 0x2, 0x7b, 0x2, 0x80,
+ 0x2, 0x8d, 0x2, 0x94, 0x2, 0x99, 0x2, 0x9e,
+ 0x2, 0xaf, 0x2, 0xb9, 0x2, 0xbe, 0x2, 0xc3,
+ 0x2, 0xcf, 0x2, 0xe2, 0x2, 0xea, 0x2, 0xf5,
+ 0x3, 0x7, 0x3, 0xd, 0x3, 0x12, 0x3, 0x18,
+ 0x3, 0x1c, 0x3, 0x26, 0x3, 0x2b, 0x3, 0x30,
+ 0x3, 0x34, 0x3, 0x3e, 0x3, 0x4d, 0x3, 0x54,
+ 0x3, 0x5a, 0x3, 0x5f, 0x3, 0x63, 0x3, 0x67,
+ 0x3, 0x6b, 0x3, 0x6f, 0x3, 0x7a, 0x3, 0x84,
+ 0x3, 0x91, 0x3, 0x9e, 0x3, 0xa6, 0x3, 0xae,
+ 0x3, 0xb1, 0x3, 0xb5, 0x3, 0xb9, 0x3, 0xbd,
+ 0x3, 0xc9, 0x3, 0xcf, 0x3, 0xd8, 0x3, 0xe4,
+ 0x3, 0xef, 0x3, 0xf4, 0x3, 0xfa, 0x4, 0x0,
+ 0x4, 0x6, 0x4, 0xc, 0x4, 0x17, 0x4, 0x22,
+ 0x4, 0x2c, 0x4, 0x33, 0x4, 0x38, 0x4, 0x3f,
+ 0x4, 0x46, 0x4, 0x4b, 0x4, 0x50, 0x4, 0x54,
+ 0x4, 0x5e, 0x4, 0x68, 0x4, 0x72, 0x4, 0x7c,
+ 0x4, 0x7f, 0x4, 0x83, 0x4, 0x87, 0x4, 0x8b,
+ 0x4, 0x8f, 0x4, 0x95, 0x4, 0x9e, 0x4, 0xa7,
+ 0x4, 0xb0, 0x4, 0xb6, 0x4, 0xbb, 0x4, 0xc1,
+ 0x4, 0xc6, 0x4, 0xcb, 0x4, 0xd0, 0x4, 0xd5,
+ 0x4, 0xda, 0x4, 0xde, 0x4, 0xe3, 0x4, 0xe8,
+ 0x4, 0xec, 0x4, 0xf0, 0x4, 0xf4, 0x4, 0xf8,
+ 0x4, 0xfc, 0x5, 0x0, 0x5, 0x4, 0x2f, 0xa,
+ 0x99, 0xa, 0xab, 0xb1, 0x1a, 0xab, 0x7c, 0xf7,
+ 0x4, 0x33, 0xa, 0x7f, 0x5, 0xb9, 0x98, 0xb1,
+ 0x9a, 0xb8, 0x1b, 0xce, 0xa8, 0x5b, 0x54, 0x70,
+ 0x1f, 0x6c, 0x81, 0x54, 0x86, 0x50, 0x85, 0x8,
+ 0x42, 0x86, 0xfb, 0x2f, 0x7f, 0xfb, 0x34, 0x1a,
+ 0x28, 0xd6, 0x52, 0xe1, 0x1e, 0xb, 0x15, 0xfb,
+ 0x23, 0xe3, 0xfb, 0x32, 0xf7, 0x69, 0xf7, 0xb1,
+ 0xf7, 0x16, 0xf7, 0x95, 0xf7, 0x56, 0xf7, 0x49,
+ 0xfb, 0x6, 0xf7, 0x13, 0xfb, 0x53, 0xfb, 0xc9,
+ 0x25, 0xfb, 0xb4, 0xfb, 0x3e, 0x1e, 0xf7, 0x2a,
+ 0x16, 0xf7, 0x37, 0xf0, 0xf7, 0x3d, 0xf7, 0x29,
+ 0xf7, 0x3, 0xc2, 0x34, 0x2a, 0xfb, 0xa, 0x3b,
+ 0xfb, 0x61, 0xfb, 0x3c, 0x2a, 0x44, 0xd1, 0xf4,
+ 0x1e, 0xb, 0x15, 0xfb, 0x11, 0xde, 0xfb, 0x1,
+ 0x38, 0xa, 0xf7, 0x36, 0x26, 0xa, 0xb, 0x15,
+ 0xf8, 0x8, 0x6, 0x94, 0xae, 0x8c, 0xb3, 0x99,
+ 0x1a, 0xf0, 0x5d, 0xf7, 0x1c, 0xfb, 0x41, 0xfb,
+ 0x6e, 0x35, 0xfb, 0x33, 0xfb, 0x1b, 0xfb, 0x24,
+ 0xe9, 0xfb, 0xf, 0xf7, 0x2d, 0xd7, 0xf7, 0x1,
+ 0xa6, 0xf7, 0x15, 0xcc, 0x1e, 0xfb, 0x1a, 0xa1,
+ 0x5, 0x7a, 0x83, 0x6a, 0x51, 0x41, 0x1b, 0x4d,
+ 0x5a, 0xbc, 0xde, 0x8f, 0x1f, 0x9a, 0xe3, 0x15,
+ 0xbe, 0x95, 0xaf, 0xde, 0xe1, 0x1b, 0xd8, 0xa6,
+ 0x4c, 0x44, 0x88, 0x1f, 0xb, 0x1, 0xf7, 0x8,
+ 0xf7, 0x28, 0x3, 0xf7, 0x6b, 0xf9, 0x73, 0x15,
+ 0x3a, 0xfc, 0x2a, 0x5, 0x81, 0x5f, 0x83, 0x59,
+ 0x5b, 0x1a, 0xfb, 0x1, 0xc2, 0x2a, 0xf7, 0x62,
+ 0xf7, 0xa3, 0xb6, 0xf7, 0x64, 0xf7, 0x20, 0xa8,
+ 0x1e, 0xdf, 0xf8, 0x2a, 0x5, 0x97, 0xa, 0x37,
+ 0xfc, 0x2a, 0x5, 0xfb, 0x13, 0x71, 0x78, 0x2e,
+ 0xfb, 0x20, 0x1b, 0x2b, 0x73, 0xb4, 0xc5, 0xaf,
+ 0x94, 0xb5, 0x94, 0xb6, 0x1f, 0xdf, 0xf8, 0x2a,
+ 0x5, 0xb, 0x5e, 0xa, 0xe1, 0xf7, 0x36, 0x5,
+ 0xf7, 0xaf, 0x6, 0xa3, 0xfb, 0x36, 0x5, 0xf7,
+ 0x1f, 0x6, 0xfb, 0x8, 0xf9, 0x71, 0x43, 0xa,
+ 0x27, 0xfc, 0x54, 0x15, 0xf7, 0x30, 0xf7, 0xba,
+ 0x5c, 0xa, 0xb3, 0xfb, 0xba, 0x5, 0xb, 0xf7,
+ 0xe, 0x48, 0xf7, 0xa, 0xfb, 0x4f, 0xfb, 0x7d,
+ 0x41, 0xfb, 0x4c, 0xfb, 0x21, 0x1e, 0xf7, 0x25,
+ 0x16, 0xcb, 0xb0, 0xf7, 0x2b, 0xf7, 0x11, 0xdb,
+ 0xa8, 0x3d, 0x57, 0x29, 0x56, 0xfb, 0x4, 0x21,
+ 0x3f, 0x67, 0xcb, 0xc8, 0x1e, 0xb, 0x15, 0x25,
+ 0xa, 0xe, 0xf8, 0x31, 0x89, 0x15, 0x82, 0xa,
+ 0xf7, 0x2, 0xf8, 0xa7, 0x47, 0xa, 0x57, 0xfb,
+ 0x8e, 0x5, 0x46, 0x71, 0x7f, 0xfb, 0xd, 0xfb,
+ 0xe, 0x1b, 0x5e, 0x7d, 0xa4, 0xad, 0xa1, 0x90,
+ 0xa4, 0x91, 0xa0, 0x1f, 0xcc, 0xf7, 0xcd, 0x44,
+ 0xa, 0x4d, 0xfb, 0xba, 0x5, 0x85, 0x6a, 0x81,
+ 0x60, 0x62, 0x1a, 0xb, 0x12, 0x13, 0x60, 0x28,
+ 0xa, 0x13, 0xa0, 0x35, 0xa, 0x13, 0x60, 0xb,
+ 0x30, 0xa, 0x9c, 0xf7, 0x8e, 0x15, 0x88, 0x78,
+ 0x5, 0x31, 0xa, 0x90, 0xe6, 0x99, 0x1f, 0xb,
+ 0xfd, 0x22, 0x21, 0xa, 0xe, 0xf8, 0xc4, 0x6,
+ 0xa5, 0xf7, 0x10, 0x5, 0xfc, 0x31, 0x6, 0xb3,
+ 0xf7, 0x5a, 0x70, 0xa, 0xf7, 0x10, 0x5, 0xfb,
+ 0xfe, 0x6, 0xad, 0xf7, 0x3c, 0x6f, 0xa, 0xf7,
+ 0xf, 0x90, 0xa, 0xb, 0xe2, 0x78, 0xf7, 0x14,
+ 0xf9, 0x6, 0x77, 0x24, 0xa, 0xb, 0x2a, 0xa,
+ 0xe, 0x32, 0xa, 0x9a, 0xca, 0x99, 0xc0, 0x1e,
+ 0xb, 0xba, 0xcb, 0x9d, 0xc2, 0xbf, 0x1f, 0x8d,
+ 0x70, 0x8c, 0x82, 0x93, 0x72, 0x8, 0xb, 0x5f,
+ 0x81, 0x77, 0x30, 0x20, 0x1b, 0x5a, 0x77, 0xab,
+ 0xa7, 0xd6, 0xf7, 0xa, 0xb, 0x15, 0xf7, 0x27,
+ 0x6, 0x83, 0xa6, 0x87, 0x9e, 0xaa, 0x1a, 0xbc,
+ 0xb, 0xfb, 0x5a, 0x27, 0xfb, 0x3, 0x6b, 0xfb,
+ 0xd, 0x5f, 0x1e, 0xf7, 0x28, 0xb, 0x68, 0xa,
+ 0xf7, 0x36, 0xf7, 0xf, 0xf8, 0x54, 0x77, 0xb,
+ 0x46, 0xa6, 0x4c, 0xf7, 0x6, 0xcd, 0xce, 0xa9,
+ 0xc2, 0xc2, 0x1e, 0x8d, 0x89, 0x5, 0xb, 0x1,
+ 0xf6, 0xf7, 0x2a, 0xf8, 0x34, 0xf7, 0x2a, 0x3,
+ 0xb, 0xa0, 0x76, 0xf9, 0x62, 0x77, 0x1, 0xb,
+ 0xf7, 0x3d, 0xf7, 0x59, 0xf7, 0x4, 0xf7, 0x31,
+ 0xb, 0x15, 0xf7, 0xc, 0x40, 0xa, 0xfb, 0xc,
+ 0x6, 0xb, 0x39, 0xa, 0xf7, 0x48, 0xfb, 0xc,
+ 0x39, 0xa, 0xe, 0xf7, 0x2, 0x97, 0xc1, 0xa2,
+ 0xf5, 0x18, 0xb, 0xf7, 0x1c, 0x6, 0xf4, 0xf8,
+ 0xa6, 0x5b, 0xa, 0xb, 0x5, 0xfb, 0x21, 0x6,
+ 0xb, 0x8e, 0xa2, 0x3b, 0xa, 0xb, 0x1, 0xdd,
+ 0xf7, 0x25, 0xf7, 0xa3, 0xf7, 0x25, 0x3, 0xb,
+ 0x6, 0xa4, 0x83, 0xa, 0xb, 0xab, 0x8b, 0xf7,
+ 0x10, 0xf7, 0x5a, 0xf7, 0x10, 0xf7, 0x3c, 0xf7,
+ 0xf, 0xb, 0x3c, 0x7d, 0xf7, 0x0, 0x2b, 0xeb,
+ 0xb, 0x5, 0xfb, 0x37, 0x6, 0xb, 0x5, 0xfb,
+ 0x24, 0x6, 0xb, 0x15, 0xf7, 0x8, 0x6, 0xe0,
+ 0xe2, 0xb1, 0x34, 0x5, 0xec, 0x6, 0x4f, 0xf7,
+ 0x27, 0x66, 0xa, 0xe, 0xf7, 0x29, 0x6, 0xf7,
+ 0x40, 0xf9, 0x74, 0x5a, 0xa, 0xb, 0x5, 0xfb,
+ 0x23, 0x6, 0xb, 0xfb, 0xf9, 0xa0, 0x76, 0xb,
+ 0xf7, 0x23, 0x78, 0xf7, 0x14, 0xf9, 0x37, 0xf7,
+ 0x2c, 0x36, 0xa, 0xb, 0x15, 0xdb, 0x6, 0x57,
+ 0xf7, 0x65, 0xf7, 0x24, 0xf7, 0x5b, 0x5, 0x2b,
+ 0x6, 0xfb, 0x39, 0xfb, 0x53, 0x5, 0xb, 0x7c,
+ 0xa, 0xa8, 0xf7, 0x26, 0x44, 0xa, 0xb, 0x73,
+ 0x7d, 0xf7, 0x1, 0xf8, 0x8b, 0xf7, 0x2c, 0x3f,
+ 0xa, 0xb, 0x15, 0xeb, 0x6, 0xf7, 0x39, 0xf7,
+ 0x59, 0x32, 0xf7, 0x67, 0x5, 0x3b, 0x6, 0xbf,
+ 0xfb, 0x67, 0x5, 0xb, 0x48, 0xa, 0xf9, 0x74,
+ 0x77, 0xb, 0x6, 0xa4, 0x55, 0xa, 0xb, 0x6,
+ 0xa4, 0xf7, 0xd, 0x5, 0xb, 0x5, 0x89, 0x6,
+ 0xb, 0x6, 0xf7, 0x44, 0xf7, 0x26, 0x5, 0xfb,
+ 0x3a, 0x6, 0xb, 0x5, 0xfb, 0x29, 0x6, 0xb,
+ 0x5, 0xfb, 0x1e, 0x6, 0xb, 0xf7, 0xe, 0x5,
+ 0xb, 0xf7, 0x1e, 0x8e, 0xa3, 0x3b, 0xa, 0xfb,
+ 0x1f, 0x6, 0xb, 0xe2, 0x8b, 0xf7, 0xa, 0xf8,
+ 0x76, 0xf7, 0xa, 0x1, 0xf9, 0x6, 0xf7, 0x2b,
+ 0x3, 0xb, 0xec, 0x76, 0xf8, 0x2c, 0x77, 0x1,
+ 0xb, 0x73, 0x7d, 0xf2, 0x30, 0xe6, 0xb, 0x5,
+ 0xfb, 0x2a, 0x6, 0xb, 0x85, 0xa, 0x6, 0xb,
+ 0x5, 0x8d, 0x6, 0xb, 0xf7, 0x2c, 0x5, 0xb,
+ 0xf7, 0x2a, 0x6, 0xb, 0x4f, 0xa, 0xfb, 0xd,
+ 0x6, 0xf7, 0x49, 0xfb, 0xe, 0x15, 0xb, 0x15,
+ 0xe8, 0x6, 0xf7, 0x32, 0xf7, 0x27, 0x53, 0xa,
+ 0xe, 0x15, 0xca, 0x6, 0x7e, 0x52, 0x73, 0x7a,
+ 0x5f, 0x82, 0x7e, 0x4d, 0x18, 0xb, 0xfb, 0x15,
+ 0x5, 0xca, 0x6, 0x7e, 0x53, 0x73, 0x7b, 0x5f,
+ 0x81, 0x8, 0xb, 0x6, 0x72, 0x84, 0x84, 0x7b,
+ 0x77, 0x1b, 0xb, 0xf7, 0xc0, 0x16, 0xf7, 0x20,
+ 0x6, 0xc1, 0xb, 0x3d, 0xa, 0xe, 0x98, 0xa,
+ 0x6, 0xb, 0xf7, 0x2b, 0x5, 0xb, 0xe2, 0xa0,
+ 0x76, 0xb, 0x15, 0xf7, 0xa, 0x6, 0xa4, 0xf7,
+ 0x7, 0x5, 0xfb, 0xa, 0x6, 0xb, 0x86, 0xa,
+ 0xfb, 0xe, 0x6, 0xb, 0x15, 0xf7, 0xb, 0x50,
+ 0xa, 0xfb, 0xb, 0x6, 0xb, 0x72, 0x69, 0x63,
+ 0x5c, 0x1b, 0x86, 0x79, 0x8b, 0x93, 0x72, 0x1f,
+ 0xb, 0x15, 0xf7, 0x15, 0x6, 0xa6, 0x55, 0xa,
+ 0xfb, 0x15, 0x6, 0xb, 0x6, 0xa5, 0x55, 0xa,
+ 0xb, 0x5, 0xf8, 0x14, 0x6, 0xa4, 0xb, 0x5,
+ 0xf7, 0xfe, 0x6, 0xa4, 0xb, 0x6, 0xa5, 0xf7,
+ 0xf, 0x5, 0xb, 0xf8, 0xf0, 0xf7, 0x26, 0x1,
+ 0xb, 0xfb, 0x8a, 0xfb, 0x58, 0xf7, 0x7, 0xf7,
+ 0xb2, 0xf7, 0x8, 0xb, 0xfb, 0x11, 0x59, 0xfb,
+ 0x2f, 0x3b, 0x1e, 0xe8, 0x16, 0x9b, 0xb, 0x15,
+ 0xec, 0x6, 0x4c, 0x5d, 0xa, 0xfb, 0x1f, 0x6,
+ 0xb, 0x12, 0xc2, 0xf7, 0x23, 0x13, 0x70, 0xb,
+ 0x94, 0xa, 0xfb, 0x57, 0xb, 0x8d, 0x76, 0xf9,
+ 0x88, 0x77, 0x1, 0xb, 0xa0, 0x76, 0xf8, 0xa8,
+ 0x77, 0x1, 0xb, 0x5, 0xfb, 0xe, 0x6, 0xb,
+ 0x5, 0xfb, 0x27, 0x6, 0xb, 0xf7, 0x24, 0x6,
+ 0xb, 0x1, 0xd1, 0xf7, 0x22, 0xf7, 0x8b, 0xf7,
+ 0x1a, 0x3, 0xb, 0x5, 0x87, 0x9b, 0xb8, 0x80,
+ 0xb2, 0x1b, 0xf2, 0xae, 0xb, 0xfb, 0x58, 0xf7,
+ 0x2, 0xf9, 0x4e, 0xf7, 0x2, 0x1, 0xb, 0xcc,
+ 0xf7, 0x5a, 0xf7, 0x44, 0xf7, 0x9, 0x9c, 0x32,
+ 0xb, 0x54, 0xa, 0xe, 0xf7, 0x1b, 0x6, 0xb,
+ 0xf7, 0xc, 0x5, 0xb, 0x73, 0xa0, 0x76, 0xb,
+ 0x5, 0xfb, 0x1c, 0xb, 0x15, 0xf7, 0xe, 0x4f,
+ 0xa, 0xb, 0x73, 0x8b, 0xf7, 0xd, 0xf8, 0xe9,
+ 0x77, 0x1, 0xb, 0xf7, 0x77, 0xf5, 0x1, 0xbb,
+ 0xf7, 0x77, 0x15, 0xb, 0x6, 0xa1, 0xf7, 0x3,
+ 0x5, 0xfb, 0x3d, 0x6, 0xb, 0xd0, 0x16, 0xf7,
+ 0x21, 0x6, 0xb, 0x96, 0xa, 0xd7, 0x16, 0xb,
+ 0xf7, 0x23, 0x78, 0xf7, 0x12, 0xb, 0x5, 0xf7,
+ 0x23, 0x6, 0xb, 0x15, 0xf7, 0x1e, 0x6, 0xb,
+ 0x15, 0xf7, 0xe, 0x6, 0xb, 0x5, 0xfc, 0xa7,
+ 0x6, 0xb, 0x5, 0xfb, 0x1b, 0x6, 0xb, 0x5,
+ 0x9a, 0xa, 0xb, 0x5, 0xfb, 0x26, 0x6, 0xb,
+ 0x5, 0xfb, 0x28, 0x6, 0xb, 0xf7, 0x2b, 0x1,
+ 0xb, 0xf7, 0xc, 0x1, 0xb, 0xfb, 0x2b, 0x6,
+ 0xb, 0x5, 0xfb, 0x17, 0xb, 0xa0, 0xe8, 0x93,
+ 0xb, 0xfb, 0x22, 0x6, 0xb, 0xf7, 0x22, 0x6,
+ 0xb
+ };
diff --git a/core/src/fxge/fontdata/chromefontdata/FoxitSansItalic.c b/core/src/fxge/fontdata/chromefontdata/FoxitSansItalic.c
new file mode 100644
index 0000000000..9ac2edec66
--- /dev/null
+++ b/core/src/fxge/fontdata/chromefontdata/FoxitSansItalic.c
@@ -0,0 +1,2051 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+const unsigned char g_FoxitSansItalicFontData [16339] = {0x1,
+ 0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0x14,
+ 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x53, 0x61, 0x6e,
+ 0x73, 0x4f, 0x54, 0x46, 0x2d, 0x49, 0x74, 0x61,
+ 0x6c, 0x69, 0x63, 0x0, 0x1, 0x1, 0x1, 0x27,
+ 0xf8, 0x10, 0x0, 0xf8, 0x1c, 0x1, 0xf8, 0x1d,
+ 0x2, 0xf8, 0x1e, 0x3, 0xf8, 0x18, 0x4, 0x7f,
+ 0xc, 0x2, 0xfb, 0x3e, 0xfb, 0x75, 0xfa, 0xf0,
+ 0xfa, 0x4b, 0x5, 0xf7, 0x36, 0xf, 0xf9, 0x1,
+ 0x11, 0xc3, 0x1c, 0x3a, 0xfc, 0x12, 0x0, 0x4,
+ 0x1, 0x1, 0x5, 0x2f, 0x44, 0x52, 0x45, 0x75,
+ 0x72, 0x6f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x43, 0x68, 0x72, 0x6f,
+ 0x6d, 0x20, 0x53, 0x61, 0x6e, 0x73, 0x20, 0x4f,
+ 0x54, 0x46, 0x20, 0x49, 0x74, 0x61, 0x6c, 0x69,
+ 0x63, 0x43, 0x68, 0x72, 0x6F, 0x6D, 0x20, 0x53,
+ 0x61, 0x6e, 0x73, 0x20, 0x4f, 0x54, 0x46, 0x0,
+ 0x0, 0x0, 0x0, 0x22, 0x0, 0x8a, 0x0, 0xab,
+ 0x0, 0xac, 0x0, 0xad, 0x0, 0xae, 0x0, 0xaf,
+ 0x0, 0xb0, 0x0, 0x23, 0x0, 0x24, 0x0, 0xb1,
+ 0x0, 0x25, 0x0, 0x26, 0x0, 0xb2, 0x0, 0xb3,
+ 0x0, 0xb4, 0x0, 0xb5, 0x0, 0x9a, 0x1, 0x87,
+ 0x0, 0x27, 0x0, 0x28, 0x0, 0x29, 0x0, 0x2a,
+ 0x0, 0xb6, 0x0, 0xb7, 0x0, 0xb8, 0x0, 0xb9,
+ 0x0, 0x2b, 0x0, 0x2c, 0x0, 0x2d, 0x0, 0x8c,
+ 0x0, 0x2e, 0x0, 0x2f, 0x0, 0xba, 0x0, 0x30,
+ 0x0, 0x8e, 0x0, 0xbb, 0x0, 0xbc, 0x0, 0xbd,
+ 0x0, 0xbe, 0x0, 0x8d, 0x0, 0xbf, 0x0, 0x31,
+ 0x0, 0x32, 0x0, 0x33, 0x0, 0x34, 0x0, 0xc0,
+ 0x0, 0x35, 0x0, 0x9d, 0x0, 0x36, 0x0, 0xc1,
+ 0x0, 0xc2, 0x0, 0xc3, 0x0, 0xc4, 0x0, 0x37,
+ 0x0, 0x38, 0x0, 0x39, 0x0, 0x3a, 0x0, 0xc5,
+ 0x0, 0xc6, 0x0, 0x3b, 0x0, 0xc7, 0x0, 0x42,
+ 0x0, 0xc8, 0x0, 0xc9, 0x0, 0x7d, 0x0, 0xca,
+ 0x0, 0x90, 0x0, 0xcb, 0x0, 0x7, 0x0, 0xcc,
+ 0x0, 0x3f, 0x0, 0x5f, 0x0, 0xb, 0x0, 0x21,
+ 0x0, 0xcd, 0x0, 0x43, 0x0, 0x3d, 0x0, 0x5d,
+ 0x0, 0x5c, 0x0, 0x5e, 0x0, 0x3c, 0x0, 0x3e,
+ 0x0, 0x81, 0x0, 0xa0, 0x0, 0x74, 0x0, 0x44,
+ 0x0, 0x88, 0x0, 0xce, 0x0, 0x85, 0x0, 0x61,
+ 0x0, 0x7e, 0x0, 0x1b, 0x0, 0xd, 0x0, 0xaa,
+ 0x0, 0x67, 0x0, 0x45, 0x0, 0x70, 0x0, 0x71,
+ 0x0, 0xa1, 0x0, 0x83, 0x0, 0x9f, 0x0, 0x5,
+ 0x0, 0x82, 0x0, 0x91, 0x0, 0x46, 0x0, 0xcf,
+ 0x0, 0xd0, 0x0, 0xd1, 0x0, 0xd2, 0x0, 0x19,
+ 0x0, 0x79, 0x0, 0x89, 0x0, 0x6f, 0x0, 0x1e,
+ 0x0, 0xa7, 0x0, 0x2, 0x0, 0x60, 0x0, 0x47,
+ 0x0, 0x6d, 0x0, 0x16, 0x0, 0x6e, 0x0, 0x65,
+ 0x0, 0x15, 0x0, 0x63, 0x0, 0x48, 0x0, 0x95,
+ 0x0, 0x7c, 0x0, 0x1f, 0x0, 0x6a, 0x0, 0x78,
+ 0x0, 0x6b, 0x0, 0x6c, 0x0, 0x49, 0x0, 0x86,
+ 0x0, 0xe, 0x0, 0x4a, 0x0, 0xd3, 0x0, 0xd4,
+ 0x0, 0xd5, 0x0, 0xd6, 0x0, 0x4b, 0x0, 0x4c,
+ 0x0, 0x4d, 0x0, 0x1d, 0x0, 0x97, 0x0, 0x92,
+ 0x0, 0x4e, 0x0, 0x80, 0x0, 0xa6, 0x0, 0x98,
+ 0x0, 0xa8, 0x0, 0x4f, 0x0, 0x1a, 0x0, 0xd7,
+ 0x0, 0x4, 0x0, 0x50, 0x0, 0xd8, 0x0, 0xd9,
+ 0x0, 0xda, 0x0, 0x94, 0x0, 0x87, 0x0, 0xdb,
+ 0x0, 0x12, 0x0, 0x9b, 0x0, 0x9e, 0x0, 0x96,
+ 0x0, 0x8b, 0x0, 0x8f, 0x0, 0x93, 0x0, 0xdc,
+ 0x0, 0x51, 0x0, 0x73, 0x0, 0x9, 0x0, 0xa,
+ 0x0, 0x6, 0x0, 0xf, 0x0, 0x72, 0x0, 0x7a,
+ 0x0, 0xc, 0x0, 0x9c, 0x0, 0x52, 0x0, 0x20,
+ 0x0, 0x7b, 0x0, 0x3, 0x0, 0x76, 0x0, 0x69,
+ 0x0, 0x77, 0x0, 0x41, 0x0, 0x8, 0x0, 0x75,
+ 0x0, 0x68, 0x0, 0x53, 0x0, 0xa5, 0x0, 0x84,
+ 0x0, 0x54, 0x0, 0xdd, 0x0, 0x66, 0x0, 0x1c,
+ 0x0, 0x18, 0x0, 0x17, 0x0, 0x10, 0x0, 0x1,
+ 0x0, 0x62, 0x0, 0x55, 0x0, 0xa2, 0x0, 0x14,
+ 0x0, 0xa3, 0x0, 0xa9, 0x0, 0x7f, 0x0, 0x99,
+ 0x0, 0x13, 0x0, 0xa4, 0x0, 0x56, 0x0, 0xde,
+ 0x0, 0xdf, 0x0, 0xe0, 0x0, 0xe1, 0x0, 0x40,
+ 0x0, 0x57, 0x0, 0x58, 0x0, 0x59, 0x0, 0x5a,
+ 0x0, 0xe2, 0x0, 0xe3, 0x0, 0x64, 0x0, 0x5b,
+ 0x0, 0xe4, 0x0, 0x11, 0x0, 0xe6, 0x2, 0x0,
+ 0x1, 0x0, 0x3, 0x0, 0x36, 0x0, 0x82, 0x0,
+ 0x94, 0x0, 0xa7, 0x0, 0xb9, 0x0, 0xd1, 0x1,
+ 0x10, 0x1, 0x54, 0x1, 0xb3, 0x2, 0x5, 0x2,
+ 0x89, 0x2, 0xc9, 0x2, 0xf6, 0x3, 0x3, 0x3,
+ 0x10, 0x3, 0x1c, 0x3, 0x2f, 0x3, 0x87, 0x4,
+ 0x6, 0x4, 0x2e, 0x4, 0x8d, 0x4, 0xbc, 0x4,
+ 0xca, 0x4, 0xe6, 0x5, 0x6, 0x5, 0x29, 0x5,
+ 0x3e, 0x5, 0x72, 0x5, 0xa5, 0x5, 0xbb, 0x5,
+ 0xe6, 0x6, 0x17, 0x6, 0x3f, 0x6, 0xa1, 0x6,
+ 0xf1, 0x7, 0x77, 0x7, 0x9a, 0x7, 0xc3, 0x7,
+ 0xe8, 0x8, 0x5, 0x8, 0x84, 0x8, 0xd2, 0x9,
+ 0x12, 0x9, 0x91, 0x9, 0xec, 0xa, 0x59, 0xa,
+ 0xdf, 0xa, 0xff, 0xb, 0x47, 0xb, 0x84, 0xb,
+ 0xd6, 0xb, 0xf7, 0xc, 0x1f, 0xc, 0x71, 0xc,
+ 0x8c, 0xc, 0xc9, 0xc, 0xfa, 0xd, 0x22, 0xd,
+ 0x51, 0xd, 0x89, 0xd, 0xb1, 0xd, 0xee, 0xe,
+ 0x7c, 0xe, 0x9e, 0xe, 0xc3, 0xe, 0xda, 0xf,
+ 0x9, 0xf, 0xbb, 0xf, 0xda, 0x10, 0x79, 0x10,
+ 0xc2, 0x10, 0xe4, 0x11, 0x2e, 0x11, 0x63, 0x12,
+ 0x19, 0x12, 0x70, 0x12, 0xca, 0x12, 0xe2, 0x12,
+ 0xfc, 0x13, 0x4f, 0x13, 0xa6, 0x13, 0xca, 0x13,
+ 0xec, 0x14, 0x16, 0x14, 0x38, 0x14, 0x56, 0x14,
+ 0xa0, 0x14, 0xb7, 0x15, 0x2a, 0x15, 0x63, 0x15,
+ 0xce, 0x15, 0xee, 0x16, 0x6, 0x16, 0x26, 0x16,
+ 0xbd, 0x17, 0x35, 0x17, 0x90, 0x17, 0xc8, 0x18,
+ 0x16, 0x18, 0x50, 0x18, 0x61, 0x18, 0x92, 0x19,
+ 0x1f, 0x19, 0x31, 0x19, 0x42, 0x19, 0x99, 0x19,
+ 0xbc, 0x19, 0xe6, 0x1a, 0x4, 0x1a, 0x25, 0x1a,
+ 0x96, 0x1a, 0xad, 0x1a, 0xb8, 0x1a, 0xc1, 0x1a,
+ 0xe2, 0x1b, 0x51, 0x1b, 0x75, 0x1b, 0xa3, 0x1b,
+ 0xde, 0x1c, 0x22, 0x1c, 0x7a, 0x1c, 0xb7, 0x1d,
+ 0x16, 0x1d, 0x53, 0x1d, 0x70, 0x1d, 0xdd, 0x1e,
+ 0x52, 0x1e, 0x60, 0x1e, 0x89, 0x1e, 0xb7, 0x1e,
+ 0xe3, 0x1e, 0xfd, 0x1f, 0x1b, 0x1f, 0x5d, 0x1f,
+ 0x6b, 0x1f, 0x82, 0x1f, 0x9f, 0x1f, 0xbb, 0x1f,
+ 0xdd, 0x1f, 0xfd, 0x20, 0x13, 0x20, 0x51, 0x20,
+ 0x7c, 0x20, 0x8b, 0x20, 0xaf, 0x20, 0xcd, 0x20,
+ 0xee, 0x21, 0x52, 0x21, 0x66, 0x21, 0x7a, 0x21,
+ 0xcc, 0x21, 0xfd, 0x22, 0x3c, 0x22, 0xa1, 0x23,
+ 0x1b, 0x23, 0x72, 0x23, 0xb9, 0x23, 0xd7, 0x23,
+ 0xfb, 0x24, 0x23, 0x24, 0xba, 0x24, 0xeb, 0x25,
+ 0x3, 0x25, 0x2f, 0x25, 0xb0, 0x26, 0x16, 0x26,
+ 0x3c, 0x26, 0xc6, 0x27, 0x6, 0x27, 0x7c, 0x27,
+ 0xd3, 0x28, 0x29, 0x28, 0x52, 0x28, 0x88, 0x28,
+ 0xbd, 0x29, 0x5d, 0x29, 0x6b, 0x29, 0x7f, 0x2a,
+ 0x39, 0x2a, 0x5c, 0x2a, 0x9d, 0x2a, 0xf8, 0x2b,
+ 0x4b, 0x2b, 0xa1, 0x2b, 0xd2, 0x2b, 0xfa, 0x2c,
+ 0x12, 0x2c, 0x3e, 0x2c, 0x54, 0x2c, 0x6b, 0x2c,
+ 0x86, 0x2c, 0x9f, 0x2c, 0xd7, 0x2d, 0x7d, 0x2d,
+ 0xb7, 0x2e, 0x17, 0x2e, 0x8e, 0x2f, 0x26, 0x2f,
+ 0x55, 0x2f, 0x84, 0x2f, 0xe7, 0x2f, 0xfc, 0x2f,
+ 0xfe, 0x30, 0x8c, 0x30, 0xde, 0x31, 0x35, 0x31,
+ 0x95, 0x32, 0x30, 0x32, 0x8e, 0x32, 0xe2, 0x33,
+ 0x3e, 0x33, 0x8c, 0x33, 0xdc, 0x34, 0x27, 0x34,
+ 0x34, 0x34, 0x42, 0x34, 0x4e, 0x34, 0x62, 0x34,
+ 0x6f, 0x34, 0x8b, 0x34, 0xc1, 0x34, 0xf0, 0x35,
+ 0x27, 0x35, 0x75, 0x35, 0xc2, 0x36, 0x1b, 0x36,
+ 0x41, 0x36, 0x7a, 0x36, 0xbf, 0x77, 0xe, 0x35,
+ 0xa, 0xf7, 0x62, 0xd5, 0xf8, 0x4a, 0x77, 0x1,
+ 0x99, 0x16, 0xf4, 0x6, 0xf7, 0x7, 0xf7, 0x62,
+ 0x5, 0xf7, 0xb8, 0x6, 0xae, 0xfb, 0x62, 0x5,
+ 0xe8, 0x6, 0xfb, 0xa, 0xf9, 0x62, 0x5, 0xfb,
+ 0x5, 0x6, 0xfb, 0x28, 0xfc, 0x4a, 0x15, 0xf7,
+ 0x53, 0xf7, 0xfc, 0x48, 0xa, 0xb9, 0xfb, 0xfc,
+ 0x5, 0xe, 0xf9, 0x52, 0x8b, 0xdc, 0xf7, 0x10,
+ 0xdc, 0xb9, 0xdc, 0xf7, 0x74, 0xdc, 0x1, 0x93,
+ 0x16, 0xf7, 0x0, 0x6, 0xf7, 0x10, 0xf7, 0x61,
+ 0x5, 0xf7, 0xaa, 0x6, 0x60, 0xfb, 0x61, 0x5,
+ 0xf8, 0x98, 0x55, 0xa, 0xfc, 0x33, 0x6, 0xbf,
+ 0xf7, 0x8f, 0x5, 0xf8, 0x3, 0x55, 0xa, 0xfc,
+ 0x3, 0x6, 0xba, 0xf7, 0x74, 0x5, 0xf8, 0x7,
+ 0x55, 0xa, 0xfd, 0x1a, 0x6, 0xfb, 0x35, 0xfc,
+ 0x44, 0x15, 0xf7, 0x6b, 0xf7, 0xf3, 0x5, 0xf2,
+ 0x6, 0x42, 0xfb, 0xf3, 0x5, 0xe, 0x31, 0xa,
+ 0xf9, 0x13, 0x77, 0x1, 0xf8, 0x74, 0xf9, 0xae,
+ 0x36, 0xa, 0xfc, 0xc1, 0xfe, 0x35, 0x26, 0xa,
+ 0x31, 0xa, 0xf8, 0x8c, 0xf7, 0x1b, 0x1, 0xf7,
+ 0xc7, 0xf9, 0xae, 0x30, 0xa, 0xfc, 0x3b, 0xfe,
+ 0x35, 0x26, 0xa, 0x31, 0xa, 0xf8, 0x93, 0xef,
+ 0x1, 0xf8, 0xb1, 0xf9, 0xb5, 0x2e, 0xa, 0xfc,
+ 0x4, 0xfe, 0x19, 0x26, 0xa, 0x31, 0xa, 0xf8,
+ 0x87, 0xf7, 0x20, 0x1, 0xf8, 0x78, 0xf9, 0xa9,
+ 0x56, 0xa, 0xf7, 0x20, 0x5, 0x20, 0x6, 0xfc,
+ 0xb, 0xfe, 0x35, 0x26, 0xa, 0x31, 0xa, 0xf8,
+ 0x77, 0xb0, 0xf7, 0x36, 0x76, 0x1, 0xf8, 0x28,
+ 0xb0, 0xf3, 0xb0, 0x3, 0xf8, 0x28, 0xf9, 0xf2,
+ 0x15, 0x59, 0xb4, 0x64, 0xbb, 0xbb, 0xb4, 0xb2,
+ 0xbd, 0xbd, 0x63, 0xb2, 0x5a, 0x5a, 0x63, 0x64,
+ 0x59, 0x1e, 0xb0, 0x8a, 0x15, 0xa8, 0xa2, 0xa3,
+ 0xa8, 0xa8, 0xa2, 0x74, 0x6d, 0x6e, 0x74, 0x75,
+ 0x6e, 0x6f, 0x73, 0xa1, 0xa8, 0x1e, 0xfc, 0x3f,
+ 0xfd, 0xf1, 0x26, 0xa, 0x31, 0xa, 0xf8, 0x9a,
+ 0xf5, 0x8e, 0x77, 0x12, 0x13, 0xe0, 0xf8, 0x5,
+ 0xf9, 0xbc, 0x15, 0xc8, 0x66, 0xa, 0xa3, 0x1b,
+ 0xa7, 0xa1, 0x82, 0x82, 0x9e, 0x1f, 0x80, 0xa2,
+ 0x9f, 0x7e, 0xa0, 0x1b, 0xc5, 0xac, 0xc1, 0xc0,
+ 0x90, 0x1f, 0x50, 0x6, 0x7d, 0x87, 0x85, 0x73,
+ 0x5e, 0xa, 0x13, 0xd0, 0x95, 0x73, 0x70, 0x96,
+ 0x6e, 0x1b, 0x13, 0xe0, 0x48, 0x7a, 0x58, 0x51,
+ 0x7c, 0x1f, 0xfb, 0xf7, 0xfd, 0xbc, 0x26, 0xa,
+ 0xf8, 0x5, 0x8b, 0xdc, 0xf7, 0x8d, 0xdd, 0xf7,
+ 0x75, 0xdc, 0x1, 0xf8, 0xd4, 0xf1, 0x3, 0xd5,
+ 0x16, 0xf7, 0xfd, 0x6, 0xf7, 0x37, 0xec, 0xf7,
+ 0xd, 0xf5, 0xe5, 0x4b, 0xb3, 0x52, 0x9e, 0x1f,
+ 0xb6, 0x99, 0xea, 0xac, 0xf7, 0xa, 0x1a, 0xf7,
+ 0x22, 0xfb, 0x18, 0xae, 0xfb, 0xb, 0x1e, 0xfb,
+ 0x7b, 0x6, 0x64, 0xfd, 0x11, 0x15, 0xc1, 0xf7,
+ 0x8d, 0x5, 0xf7, 0x52, 0x6, 0xc9, 0xeb, 0x8a,
+ 0x25, 0xfb, 0x11, 0xfb, 0x13, 0x76, 0x22, 0x1f,
+ 0x29, 0xf7, 0xdf, 0x15, 0xbc, 0xf7, 0x75, 0x5,
+ 0xf7, 0x29, 0x6, 0xc7, 0xec, 0x8a, 0x2c, 0xfb,
+ 0x3, 0xfb, 0x6, 0x79, 0x31, 0x1f, 0xe, 0xf8,
+ 0x3c, 0x78, 0xdc, 0xf8, 0xe6, 0xdc, 0x1, 0xf7,
+ 0x14, 0xef, 0x3, 0xf9, 0x1b, 0xf7, 0x8f, 0x15,
+ 0x51, 0x79, 0x4a, 0xfb, 0x17, 0xfb, 0x2b, 0x1b,
+ 0x3c, 0xfb, 0x12, 0xb4, 0xf7, 0x53, 0xf7, 0x47,
+ 0xf2, 0xf7, 0x4b, 0xf7, 0x52, 0xf7, 0x28, 0xaa,
+ 0xfb, 0x8, 0x62, 0x92, 0x1f, 0xea, 0x93, 0x5,
+ 0xf7, 0x52, 0x75, 0xfb, 0x3a, 0xb3, 0x2e, 0x1b,
+ 0xfb, 0x7e, 0xfb, 0x33, 0xfb, 0x5d, 0xfb, 0x86,
+ 0xfb, 0x74, 0xf7, 0x1c, 0x32, 0xf7, 0x36, 0xf7,
+ 0x3b, 0xf7, 0x8, 0xf2, 0xf7, 0x2d, 0xc5, 0x1f,
+ 0xe, 0xf8, 0x3c, 0xfb, 0x75, 0xc6, 0xf7, 0x24,
+ 0xdc, 0xf8, 0xe9, 0xdc, 0x1, 0xf7, 0x0, 0xf0,
+ 0x3, 0xf7, 0x79, 0xfb, 0x37, 0x15, 0x72, 0x52,
+ 0x5, 0x87, 0xa6, 0xad, 0x8a, 0xa6, 0x1b, 0xf7,
+ 0x46, 0x9e, 0xd5, 0xa8, 0xc6, 0x53, 0x93, 0x77,
+ 0x8e, 0x1f, 0x99, 0xa9, 0xc8, 0x8e, 0xf7, 0x43,
+ 0xa6, 0xe0, 0xf7, 0x78, 0x19, 0x27, 0x98, 0x5,
+ 0x50, 0x78, 0x4c, 0xfb, 0x17, 0xfb, 0x2c, 0x1b,
+ 0x38, 0xfb, 0xe, 0xbe, 0xf7, 0x54, 0xf7, 0x48,
+ 0xf0, 0xf7, 0x42, 0xf7, 0x54, 0xf7, 0x28, 0xa8,
+ 0xfb, 0x9, 0x62, 0x93, 0x1f, 0xea, 0x93, 0x5,
+ 0xf7, 0x54, 0x76, 0xfb, 0x3b, 0xb2, 0x2f, 0x1b,
+ 0xfb, 0x7f, 0xfb, 0x33, 0xfb, 0x53, 0xfb, 0x88,
+ 0xfb, 0x35, 0xd0, 0xfb, 0x1c, 0xf7, 0x48, 0x73,
+ 0x1f, 0x6a, 0x47, 0x5, 0xc4, 0x8a, 0x9d, 0x7b,
+ 0x78, 0x1a, 0x5f, 0x43, 0x8c, 0x57, 0x82, 0x87,
+ 0x8d, 0x8c, 0x6a, 0x1e, 0xe, 0xf8, 0x3c, 0x8b,
+ 0xdc, 0xf8, 0xc0, 0xdc, 0x1, 0xf9, 0x2c, 0xef,
+ 0x3, 0xdc, 0x16, 0xf7, 0x9b, 0x6, 0xf7, 0x6a,
+ 0xf7, 0x62, 0xf7, 0x12, 0xf7, 0xc0, 0xf7, 0x42,
+ 0xfb, 0xb, 0xf7, 0xa, 0xfb, 0x52, 0x1f, 0xfb,
+ 0x72, 0x6, 0x66, 0xfd, 0x11, 0x15, 0xf7, 0xa,
+ 0xf8, 0xc0, 0x5, 0xf7, 0x17, 0x6, 0xe0, 0xf7,
+ 0x1a, 0x87, 0xfb, 0x63, 0xfb, 0x9b, 0xfb, 0x30,
+ 0x39, 0xfb, 0x58, 0x1f, 0xe, 0xf8, 0x5, 0x8b,
+ 0xdc, 0xf7, 0x8e, 0xdd, 0xf7, 0x74, 0xdc, 0x1,
+ 0xe1, 0x16, 0xf8, 0xbe, 0x6b, 0xa, 0xfc, 0x5d,
+ 0x6, 0xc2, 0xf7, 0x8e, 0x5, 0xf8, 0x2a, 0x6,
+ 0x9c, 0xdd, 0x5, 0xfc, 0x29, 0x6, 0xb7, 0xf7,
+ 0x74, 0x5, 0xf8, 0x3e, 0x6b, 0xa, 0xfc, 0xa0,
+ 0x6, 0xe, 0x32, 0xa, 0xf7, 0x53, 0x77, 0x2a,
+ 0xa, 0xf7, 0x1e, 0xc3, 0x36, 0xa, 0xe, 0x32,
+ 0xa, 0xc3, 0xf7, 0x1b, 0x2a, 0xa, 0xf7, 0x1,
+ 0xc3, 0x30, 0xa, 0xe, 0x32, 0xa, 0xca, 0xef,
+ 0x2a, 0xa, 0xf7, 0xa7, 0xca, 0x2e, 0xa, 0xe,
+ 0x32, 0xa, 0xbe, 0xf7, 0x20, 0x2a, 0xa, 0xf7,
+ 0x95, 0xbe, 0x56, 0xa, 0xf7, 0x20, 0x5, 0xfb,
+ 0x0, 0x6, 0xe, 0xf8, 0x3c, 0x8b, 0xdc, 0xf7,
+ 0x8e, 0xdc, 0xf7, 0x75, 0xdc, 0x1, 0xf9, 0x2c,
+ 0xef, 0x3, 0xd8, 0x16, 0xf7, 0x9c, 0x6, 0xf7,
+ 0x6a, 0xf7, 0x65, 0xf7, 0x12, 0xf7, 0xbf, 0xf7,
+ 0x44, 0xfb, 0xb, 0xf7, 0x9, 0xfb, 0x55, 0x1f,
+ 0xfb, 0x6f, 0x6, 0x49, 0xfb, 0xc6, 0x5, 0x3a,
+ 0x6, 0x7a, 0x3a, 0x5, 0xdb, 0x6, 0xb6, 0xfb,
+ 0x8e, 0x15, 0xc2, 0xf7, 0x8e, 0x5, 0xf7, 0x64,
+ 0x6b, 0xa, 0xfb, 0x65, 0x6, 0xbd, 0xf7, 0x75,
+ 0x5, 0xf7, 0x14, 0x6, 0xe1, 0xf7, 0x1c, 0x86,
+ 0xfb, 0x63, 0xfb, 0x9b, 0xfb, 0x33, 0x3a, 0xfb,
+ 0x58, 0x1f, 0xe, 0xf8, 0x5, 0x8b, 0xd8, 0xf7,
+ 0x50, 0xcb, 0xc9, 0xcb, 0xf7, 0x4e, 0xd8, 0x1,
+ 0xd0, 0xf0, 0x3, 0x99, 0xf7, 0x9d, 0x15, 0xc2,
+ 0x6, 0xfb, 0x38, 0x97, 0xf2, 0x26, 0xf7, 0x4b,
+ 0x1b, 0xb8, 0xb6, 0x92, 0x9a, 0xb2, 0x1f, 0xa3,
+ 0xf0, 0x5, 0x6c, 0x62, 0x5b, 0x7c, 0x55, 0x1b,
+ 0xfb, 0x12, 0x44, 0xda, 0xf7, 0x1, 0x83, 0x1f,
+ 0xf7, 0xcb, 0x6, 0x9a, 0xcb, 0x5, 0xfb, 0xda,
+ 0x6, 0x8e, 0x9f, 0x8c, 0xa1, 0x90, 0x9f, 0x8,
+ 0xf7, 0xdf, 0x6, 0x9a, 0xcb, 0x5, 0xfb, 0xd9,
+ 0x6, 0xf6, 0xb8, 0xdf, 0xda, 0xf7, 0x17, 0x1b,
+ 0xc6, 0xc4, 0x7b, 0x5f, 0xae, 0x1f, 0xb6, 0xdc,
+ 0x5, 0xb3, 0x54, 0x45, 0x9b, 0x46, 0x1b, 0xfb,
+ 0x46, 0xfb, 0x1c, 0xfb, 0x3, 0xfb, 0x2c, 0x56,
+ 0x1f, 0x4a, 0x6, 0x7d, 0x4b, 0x5, 0xc9, 0x6,
+ 0x87, 0x77, 0x89, 0x75, 0x8a, 0x77, 0x8, 0x62,
+ 0x6, 0xe, 0xf7, 0xcd, 0xa0, 0x76, 0xf7, 0xd9,
+ 0xdd, 0xf7, 0x7a, 0xdc, 0x1, 0xe1, 0x16, 0xf0,
+ 0x6, 0xd3, 0xf7, 0xd9, 0x5, 0xf8, 0x19, 0x6,
+ 0x9d, 0xdd, 0x5, 0xfc, 0x19, 0x6, 0xbd, 0xf7,
+ 0x7a, 0x5, 0xf8, 0x1b, 0x6b, 0xa, 0xfc, 0x81,
+ 0x6, 0xe, 0x6c, 0xa, 0xf7, 0x70, 0xdd, 0xf7,
+ 0xb8, 0xdc, 0x1, 0xf7, 0x3, 0xef, 0x3, 0xf8,
+ 0x43, 0xf7, 0xae, 0x15, 0xf7, 0x75, 0x6, 0x6a,
+ 0xfb, 0x31, 0x5, 0x78, 0x67, 0x37, 0x5f, 0x33,
+ 0x1b, 0xfb, 0x15, 0x40, 0xf7, 0x1, 0xf7, 0x6,
+ 0xf7, 0x69, 0xf7, 0xc, 0xf7, 0x32, 0xf7, 0x49,
+ 0xe5, 0xd8, 0x5f, 0xfb, 0x4, 0xa2, 0x1f, 0xec,
+ 0x95, 0x5, 0xf7, 0x26, 0x81, 0xfb, 0x20, 0xdc,
+ 0xfb, 0x1a, 0x1b, 0xfb, 0xa6, 0xfb, 0x16, 0xfb,
+ 0x87, 0xfb, 0x65, 0x26, 0xb0, 0xfb, 0x5f, 0xf7,
+ 0xa0, 0xf7, 0xe, 0xf7, 0x2, 0xbc, 0xb2, 0xc9,
+ 0x1f, 0xc9, 0xf7, 0xbb, 0x5, 0xfb, 0xd8, 0x6,
+ 0xe, 0xf8, 0x3c, 0xa0, 0x76, 0xf7, 0xe5, 0xdc,
+ 0xf7, 0xc0, 0x77, 0x1, 0xd8, 0x16, 0xed, 0x6,
+ 0xd1, 0xf7, 0xe5, 0x5, 0xf8, 0xb, 0x6, 0x45,
+ 0xfb, 0xe5, 0x5, 0xeb, 0x6, 0xf7, 0x2d, 0xf9,
+ 0x62, 0x57, 0xa, 0x4b, 0xfb, 0xc0, 0x5, 0xfc,
+ 0xc, 0x6, 0xcb, 0xf7, 0xc0, 0x4d, 0xa, 0xe,
+ 0x77, 0x2d, 0xa, 0xe6, 0x16, 0xeb, 0x6, 0xf7,
+ 0x2e, 0xf9, 0x62, 0x4d, 0xa, 0xe, 0x54, 0xa,
+ 0xf7, 0x6a, 0x77, 0x1, 0xf7, 0x85, 0xf9, 0xa8,
+ 0x15, 0xd6, 0x6, 0xf7, 0x23, 0x6d, 0xa, 0xfb,
+ 0x8, 0x6, 0xfb, 0x90, 0xfe, 0x35, 0x15, 0x34,
+ 0xa, 0xe, 0x54, 0xa, 0xd6, 0xf7, 0x1f, 0x1,
+ 0xf7, 0x2f, 0xf9, 0xaa, 0x6e, 0xa, 0xda, 0xe4,
+ 0xb2, 0x32, 0x5, 0xd9, 0x6, 0x4e, 0x6f, 0xa,
+ 0x2a, 0x6, 0xfb, 0x55, 0xfe, 0x35, 0x15, 0x34,
+ 0xa, 0xe, 0x5c, 0xa, 0xf9, 0x6d, 0x77, 0x1,
+ 0xf7, 0xed, 0xf9, 0xb4, 0x15, 0xe7, 0x6, 0xa0,
+ 0xf0, 0x3d, 0xa, 0xfb, 0x5e, 0x26, 0x15, 0xe7,
+ 0x6, 0xa1, 0xf0, 0x5, 0x2e, 0x6, 0x2d, 0xfe,
+ 0x19, 0x15, 0x34, 0xa, 0xe, 0x54, 0xa, 0xf7,
+ 0x6a, 0x77, 0x1, 0xe6, 0x16, 0x34, 0xa, 0xb9,
+ 0xc0, 0x15, 0xce, 0x6, 0x54, 0x6d, 0xa, 0x23,
+ 0x6, 0xe, 0xf7, 0x5e, 0x78, 0xdb, 0xf9, 0x25,
+ 0x77, 0x1, 0xba, 0xea, 0x3, 0xba, 0xf7, 0x60,
+ 0x15, 0xfb, 0x2c, 0xc3, 0x44, 0xf7, 0x15, 0xf7,
+ 0x31, 0xbe, 0xf5, 0xf1, 0xa2, 0x1e, 0xf7, 0xa,
+ 0xf8, 0xa5, 0x5, 0x24, 0x6, 0xfb, 0x8, 0xfc,
+ 0xa5, 0x5, 0x49, 0x7d, 0x61, 0x4d, 0x42, 0x1b,
+ 0x5b, 0x60, 0xbe, 0xee, 0x1f, 0xe, 0xf8, 0x5,
+ 0x2d, 0xa, 0xf9, 0x1f, 0xf7, 0x21, 0x3, 0xd7,
+ 0x16, 0xf0, 0x6, 0xbe, 0xf7, 0x7e, 0xf7, 0x31,
+ 0xf7, 0x17, 0xf7, 0x6d, 0xfc, 0x1, 0x5, 0xf7,
+ 0x4, 0x6, 0xfb, 0x93, 0xf8, 0x3f, 0xf7, 0xf1,
+ 0xf7, 0xb7, 0x5, 0xfb, 0x21, 0x6, 0xfc, 0x30,
+ 0xfb, 0xf1, 0xdb, 0xf7, 0xf1, 0x5, 0x26, 0x6,
+ 0xe, 0x8b, 0xdc, 0xf9, 0x11, 0x77, 0x1, 0xd7,
+ 0x16, 0xf8, 0x62, 0x55, 0xa, 0xfc, 0x2, 0x6,
+ 0xf7, 0x19, 0xf9, 0x11, 0x50, 0xa, 0xe, 0x8b,
+ 0xdc, 0xf9, 0x11, 0x77, 0x1, 0xd1, 0x16, 0xf8,
+ 0x68, 0x55, 0xa, 0xfc, 0x7, 0x6, 0xc4, 0xf7,
+ 0xa7, 0xf7, 0x54, 0xf7, 0x0, 0x9c, 0xdc, 0xfb,
+ 0x54, 0x21, 0xc6, 0xf7, 0xab, 0x50, 0xa, 0x43,
+ 0xfb, 0xe8, 0x30, 0x59, 0x7a, 0x37, 0xe6, 0xbf,
+ 0x5, 0xe, 0xf8, 0xab, 0x2d, 0xa, 0xd4, 0x16,
+ 0xe9, 0x6, 0xf7, 0xd, 0xf8, 0xf4, 0xe2, 0xfc,
+ 0xf4, 0x5, 0xe8, 0x6, 0xf7, 0xf0, 0xf8, 0xf9,
+ 0xfb, 0x28, 0xfc, 0xf9, 0x5, 0xea, 0x6, 0xf7,
+ 0x2b, 0xf9, 0x62, 0x5, 0xfb, 0xc, 0x6, 0xfb,
+ 0xfc, 0xfd, 0x15, 0x30, 0xf9, 0x15, 0x5, 0xfb,
+ 0xa, 0x6, 0xe, 0xf8, 0x3c, 0x2d, 0xa, 0xcb,
+ 0xf9, 0x67, 0x3, 0xd7, 0x16, 0xea, 0x6, 0xf7,
+ 0xb, 0xf8, 0xf4, 0xf7, 0x99, 0xfc, 0xf4, 0x5,
+ 0xeb, 0x6, 0xf7, 0x2c, 0xf9, 0x62, 0x4d, 0xa,
+ 0xfb, 0xf, 0xfc, 0xf5, 0xfb, 0x97, 0xf8, 0xf5,
+ 0x4d, 0xa, 0xe, 0xf8, 0x3c, 0xa0, 0x76, 0xf9,
+ 0x6d, 0x77, 0xf7, 0xa, 0x76, 0xf7, 0x3, 0x77,
+ 0x12, 0xd7, 0x16, 0xea, 0x6, 0xf7, 0xd, 0xf8,
+ 0xfc, 0x48, 0xa, 0xf7, 0x95, 0xfc, 0xfc, 0x5,
+ 0xeb, 0x6, 0xf7, 0x2c, 0xf9, 0x6d, 0x4d, 0xa,
+ 0xfb, 0xf, 0xfc, 0xfe, 0x4e, 0xa, 0xfb, 0x94,
+ 0xf8, 0xfe, 0x4d, 0xa, 0xf7, 0x19, 0xd8, 0x15,
+ 0xca, 0x66, 0xa, 0xa4, 0x1b, 0x13, 0x10, 0xa5,
+ 0xa0, 0x83, 0x82, 0x9e, 0x1f, 0x7f, 0xa3, 0xa0,
+ 0x7e, 0xa4, 0x1b, 0xc6, 0xad, 0xc2, 0xc1, 0x90,
+ 0x1f, 0x4e, 0x69, 0xa, 0x5e, 0xa, 0x13, 0x30,
+ 0x96, 0x72, 0x6f, 0x96, 0x6d, 0x1b, 0x46, 0x7a,
+ 0x57, 0x50, 0x7b, 0x1f, 0xe, 0x6c, 0xa, 0xf8,
+ 0xe6, 0xdc, 0x1, 0xf7, 0x18, 0xef, 0xf8, 0x59,
+ 0xef, 0x3, 0xf7, 0x21, 0xf7, 0xbb, 0x15, 0xfb,
+ 0x40, 0xf5, 0xfb, 0x22, 0xf7, 0x47, 0xf7, 0x60,
+ 0xf7, 0x34, 0xf7, 0x54, 0xf7, 0x80, 0xf7, 0x52,
+ 0xfb, 0x1, 0xf7, 0x1e, 0xfb, 0x47, 0xfb, 0x55,
+ 0xfb, 0x3c, 0xfb, 0x3f, 0xfb, 0xa3, 0x1e, 0xe5,
+ 0x16, 0xf7, 0x89, 0xf7, 0x28, 0xf7, 0x8, 0xf7,
+ 0xf, 0xf0, 0xec, 0x30, 0xfb, 0x30, 0xfb, 0x46,
+ 0xfb, 0x2, 0xfb, 0x3d, 0xfb, 0x31, 0x27, 0x25,
+ 0xdc, 0xf7, 0x2c, 0x1e, 0xe, 0xf9, 0x52, 0x78,
+ 0xdc, 0x46, 0xd0, 0x46, 0xde, 0xf7, 0x8f, 0xde,
+ 0xf7, 0x7b, 0xdf, 0x46, 0xdc, 0x12, 0xed, 0xe8,
+ 0x13, 0x3a, 0xf8, 0xa6, 0x84, 0x15, 0xf8, 0x67,
+ 0x6, 0x9d, 0xde, 0x5, 0xfc, 0x3, 0x6, 0xc2,
+ 0xf7, 0x8f, 0x5, 0xf7, 0xd4, 0x6, 0x9d, 0xde,
+ 0x5, 0xfb, 0xd4, 0x6, 0xbd, 0xf7, 0x7b, 0x5,
+ 0xf7, 0xdb, 0x6, 0x9d, 0xdf, 0x5, 0xfc, 0x41,
+ 0x6, 0x78, 0x34, 0x5, 0x13, 0x96, 0xdb, 0x51,
+ 0x3c, 0x9e, 0x52, 0x1b, 0xfb, 0x66, 0xfb, 0x3a,
+ 0xfb, 0x4b, 0xfb, 0x93, 0xfb, 0x69, 0xf7, 0xe,
+ 0x22, 0xf7, 0x26, 0xf2, 0xba, 0xb6, 0xa0, 0xa5,
+ 0x1f, 0x13, 0x56, 0xfb, 0xf3, 0xf7, 0x92, 0x15,
+ 0xf7, 0x2c, 0xf7, 0x3, 0xf7, 0x61, 0xf7, 0x39,
+ 0xde, 0xdc, 0x4f, 0x25, 0x59, 0x6c, 0xfb, 0x32,
+ 0x74, 0x50, 0x1e, 0x6d, 0x80, 0x59, 0xfb, 0x1b,
+ 0xfb, 0x21, 0x1b, 0xfb, 0x23, 0x62, 0xef, 0xf7,
+ 0x1d, 0x1f, 0xe, 0xf8, 0x74, 0x78, 0xdd, 0xf9,
+ 0x7e, 0x76, 0xf7, 0x21, 0x77, 0x1, 0xf4, 0xf0,
+ 0xf8, 0x9b, 0xf0, 0x3, 0xf8, 0x51, 0xf9, 0xa8,
+ 0x15, 0xda, 0x6, 0xf7, 0x1d, 0x6d, 0xa, 0xfb,
+ 0xa, 0x6, 0xfc, 0x4a, 0x28, 0xa, 0xf8, 0x74,
+ 0x78, 0xdd, 0xf9, 0xc4, 0xbd, 0x1, 0xf4, 0xf0,
+ 0xf7, 0xc4, 0xf2, 0xf7, 0x4, 0xf0, 0x3, 0xf8,
+ 0x8, 0xf9, 0xa9, 0x15, 0xec, 0x6, 0xe0, 0xe5,
+ 0xb4, 0x31, 0x5, 0xdd, 0x6, 0x4b, 0xf7, 0x20,
+ 0x5, 0x24, 0x6, 0xfc, 0x29, 0x28, 0xa, 0x6c,
+ 0xa, 0xf9, 0x74, 0xf2, 0x1, 0x68, 0xa, 0x3,
+ 0xf4, 0xf7, 0xc1, 0x21, 0xa, 0xf8, 0x1, 0xf8,
+ 0x8a, 0x15, 0xec, 0x6, 0xa2, 0xf2, 0x57, 0xa,
+ 0xfb, 0x68, 0x24, 0x15, 0xec, 0x6, 0xa1, 0xf2,
+ 0x5, 0x2a, 0x6, 0xe, 0xf8, 0x74, 0x78, 0xdd,
+ 0xf8, 0xef, 0xdd, 0x1, 0x68, 0xa, 0x3, 0xf8,
+ 0x94, 0xf9, 0xa9, 0x15, 0xd4, 0x6, 0x4f, 0xf7,
+ 0x20, 0x5, 0xfb, 0x5, 0x6, 0xfb, 0xc7, 0x28,
+ 0xa, 0xf8, 0x74, 0x8d, 0x76, 0xae, 0xdf, 0xf8,
+ 0x9b, 0xdf, 0xad, 0x77, 0x1, 0xbb, 0xe0, 0xf8,
+ 0x97, 0xe5, 0x3, 0xa6, 0x9b, 0x15, 0xba, 0x68,
+ 0xdd, 0xe3, 0x5, 0x67, 0xc3, 0xcd, 0x7a, 0xcf,
+ 0x1b, 0xf7, 0x77, 0xf7, 0x39, 0xf7, 0x43, 0xf7,
+ 0x65, 0xce, 0x81, 0xdd, 0x4e, 0xcb, 0x1f, 0xdf,
+ 0xe3, 0x5c, 0xaf, 0x3a, 0x34, 0x5, 0xbe, 0x3b,
+ 0x33, 0x8d, 0x6f, 0x1b, 0xfb, 0x84, 0xfb, 0x1f,
+ 0xfb, 0x54, 0xfb, 0x5c, 0x4e, 0x92, 0x3e, 0xc3,
+ 0x49, 0x1f, 0xc8, 0xc8, 0x15, 0x6c, 0xb2, 0x83,
+ 0xc6, 0xba, 0x1a, 0xf7, 0x3b, 0xf7, 0x1a, 0xf7,
+ 0x1f, 0xf7, 0x35, 0xc0, 0xc3, 0x81, 0x74, 0xa6,
+ 0x1e, 0xfb, 0xf3, 0xfc, 0x5c, 0x15, 0xf8, 0x1b,
+ 0xf8, 0x35, 0x5, 0x9e, 0x6e, 0xa4, 0x55, 0x49,
+ 0x1a, 0xfb, 0x2c, 0xfb, 0x13, 0xfb, 0x26, 0xfb,
+ 0x39, 0x5a, 0x52, 0x8e, 0xa6, 0x66, 0x1e, 0xe,
+ 0x6c, 0xa, 0xf9, 0x7b, 0xf7, 0x1, 0x8e, 0x77,
+ 0x12, 0x68, 0xa, 0x13, 0xd8, 0xf7, 0xf9, 0xf9,
+ 0xb9, 0x15, 0xcb, 0x6, 0xa4, 0x90, 0x97, 0x9c,
+ 0xa4, 0x1b, 0xa7, 0xa0, 0x83, 0x82, 0x9e, 0x1f,
+ 0x7f, 0xa4, 0xa0, 0x7d, 0xa6, 0x1b, 0xc8, 0xae,
+ 0xc2, 0xc2, 0x90, 0x1f, 0x4d, 0x69, 0xa, 0x70,
+ 0x1b, 0x13, 0xb8, 0x7b, 0x75, 0x96, 0x96, 0x71,
+ 0x1f, 0x95, 0x73, 0x6f, 0x95, 0x6e, 0x1b, 0x13,
+ 0xd8, 0x44, 0x79, 0x57, 0x4f, 0x7c, 0x1f, 0xfb,
+ 0x90, 0xfc, 0x8c, 0x21, 0xa, 0xe, 0x35, 0xa,
+ 0xf7, 0xb6, 0xdc, 0xf7, 0xa0, 0xda, 0x1, 0xf9,
+ 0x16, 0xea, 0x3, 0xe1, 0x16, 0xeb, 0x6, 0xc7,
+ 0xf7, 0xb6, 0x5, 0xf7, 0x47, 0x6, 0xf7, 0x32,
+ 0xf7, 0x32, 0xd7, 0xf7, 0x40, 0xf7, 0x1b, 0x33,
+ 0xb8, 0xfb, 0x7, 0x1f, 0xfb, 0xbf, 0x6, 0xa3,
+ 0xfb, 0xef, 0x15, 0xc2, 0xf7, 0xa0, 0x5, 0xf7,
+ 0x4c, 0x6, 0xd1, 0xd5, 0x8a, 0x27, 0xfb, 0x1c,
+ 0xfb, 0x18, 0x6c, 0x2d, 0x1f, 0xe, 0xf8, 0x74,
+ 0x68, 0x76, 0xcf, 0xd8, 0xf8, 0xcf, 0xd8, 0x1,
+ 0xf7, 0x1c, 0xf0, 0xf8, 0x7c, 0xf0, 0x3, 0xf8,
+ 0xcd, 0xb7, 0x15, 0xb0, 0x5f, 0xb0, 0x6c, 0xb1,
+ 0x72, 0xb3, 0xc3, 0x18, 0x7d, 0x95, 0x5e, 0xa6,
+ 0x69, 0xb5, 0x8, 0xef, 0xd8, 0xc9, 0xf7, 0xf,
+ 0xf7, 0x23, 0x1a, 0xf7, 0x4a, 0xfb, 0x1, 0xf7,
+ 0x19, 0xfb, 0x49, 0xfb, 0x75, 0xfb, 0x1a, 0xfb,
+ 0x67, 0xfb, 0x60, 0xfb, 0xb9, 0xf7, 0x7b, 0x7a,
+ 0xcb, 0xb6, 0xb9, 0x95, 0xa1, 0xb7, 0x1e, 0xfb,
+ 0x24, 0xf7, 0x10, 0x15, 0xac, 0x7a, 0x9f, 0x7c,
+ 0xad, 0x6c, 0x8, 0x80, 0x6d, 0x6c, 0x86, 0x6c,
+ 0x1b, 0x53, 0xfb, 0x18, 0xbb, 0xf7, 0x4d, 0xf7,
+ 0x52, 0xf7, 0xa, 0xf7, 0x28, 0xf7, 0x2d, 0xe5,
+ 0xf5, 0x3d, 0xfb, 0x34, 0x26, 0x60, 0xfb, 0x7,
+ 0x37, 0x49, 0x1f, 0x83, 0x94, 0x76, 0x9f, 0x6c,
+ 0xad, 0x55, 0xa3, 0x19, 0xe, 0xf8, 0x3c, 0xa0,
+ 0x76, 0xf7, 0xd2, 0xd8, 0xf7, 0x88, 0xda, 0x1,
+ 0xf9, 0x3d, 0xe7, 0x3, 0xe3, 0x16, 0xeb, 0x6,
+ 0xcd, 0xf7, 0xd2, 0x5, 0xf7, 0x2, 0x6, 0xf7,
+ 0x10, 0xaf, 0x2f, 0x2e, 0xaf, 0x1f, 0xbf, 0xfb,
+ 0x19, 0x5, 0xf6, 0x6, 0x54, 0xf7, 0x19, 0x6d,
+ 0xd3, 0x64, 0xd2, 0x4d, 0xb9, 0x19, 0xbe, 0x92,
+ 0xf7, 0x55, 0xa4, 0xf7, 0x4f, 0x1a, 0xf7, 0x43,
+ 0xfb, 0x25, 0x8d, 0x30, 0x1e, 0xfb, 0xbf, 0x6,
+ 0xa8, 0xfb, 0xd7, 0x15, 0xbd, 0xf7, 0x88, 0x5,
+ 0xf7, 0x70, 0x6, 0xbe, 0xe8, 0x87, 0x2d, 0xfb,
+ 0x27, 0xfb, 0x2a, 0x8c, 0xfb, 0x19, 0x1f, 0xe,
+ 0xf8, 0x5, 0x78, 0xdb, 0xf8, 0xe8, 0xdb, 0x12,
+ 0xe5, 0xeb, 0x86, 0xea, 0xf7, 0xaf, 0xee, 0x62,
+ 0xeb, 0x13, 0xe8, 0xe5, 0xf7, 0x7a, 0x15, 0xfb,
+ 0x48, 0xf7, 0x1c, 0x46, 0xf7, 0x28, 0xf7, 0x43,
+ 0xf7, 0x1, 0xe6, 0xf7, 0x9, 0xf7, 0xb, 0x36,
+ 0xb7, 0xfb, 0x21, 0xc8, 0x1e, 0x13, 0xd4, 0xfb,
+ 0x0, 0xba, 0x5b, 0x9d, 0xca, 0x1a, 0xe8, 0xf7,
+ 0x4, 0xa2, 0xba, 0xe1, 0xeb, 0x53, 0x2f, 0x1e,
+ 0xeb, 0x92, 0x5, 0xe0, 0x49, 0xf7, 0x1c, 0xfb,
+ 0x64, 0xfb, 0x2a, 0xfb, 0x0, 0x41, 0xfb, 0xe,
+ 0xfb, 0xe, 0xf7, 0x0, 0x5e, 0xf7, 0x0, 0x5c,
+ 0x1e, 0x13, 0xe8, 0xf5, 0x5d, 0xc3, 0x70, 0x4a,
+ 0x1a, 0x4a, 0x4e, 0x4c, 0xfb, 0xd, 0xfb, 0x40,
+ 0x78, 0xe6, 0xe1, 0x1e, 0xe, 0xf8, 0x5, 0x78,
+ 0xdd, 0xf8, 0xf1, 0xdd, 0xb2, 0xf7, 0x20, 0x12,
+ 0xe5, 0xec, 0x86, 0xeb, 0xf7, 0xb1, 0xef, 0x13,
+ 0xf4, 0xe5, 0xf7, 0x7f, 0x15, 0xfb, 0x4c, 0xf7,
+ 0x1d, 0x45, 0xf7, 0x29, 0xf7, 0x45, 0xf7, 0x2,
+ 0xe6, 0xf7, 0xc, 0xf7, 0xf, 0x35, 0xb6, 0xfb,
+ 0x22, 0xcb, 0x1e, 0x13, 0xec, 0xfb, 0x1, 0xbb,
+ 0x5b, 0x9c, 0xcc, 0x1a, 0xea, 0xf7, 0x3, 0xa0,
+ 0xbc, 0xe1, 0xe7, 0x62, 0xfb, 0x0, 0x1e, 0xec,
+ 0x93, 0x5, 0xeb, 0x4e, 0xf7, 0x13, 0xfb, 0x66,
+ 0xfb, 0x2b, 0xfb, 0x1, 0x41, 0xfb, 0x10, 0xfb,
+ 0x11, 0xf7, 0x1, 0x5d, 0xf7, 0x0, 0x5b, 0x1e,
+ 0xf6, 0x5e, 0xc4, 0x6e, 0x48, 0x1a, 0x4a, 0x4e,
+ 0x4b, 0xfb, 0xf, 0x1e, 0x13, 0xf4, 0xfb, 0x20,
+ 0x5a, 0xe0, 0xea, 0x88, 0x1f, 0xf7, 0x70, 0xf8,
+ 0xb6, 0x15, 0xef, 0x6, 0xf7, 0x1b, 0xf7, 0x20,
+ 0x5, 0x2d, 0x6, 0x38, 0x31, 0x63, 0xe5, 0x5,
+ 0x39, 0x6, 0xe, 0xf7, 0xcd, 0xa0, 0x76, 0xf9,
+ 0x11, 0xdc, 0x1, 0xf7, 0x94, 0x16, 0xee, 0x6,
+ 0xf7, 0x1c, 0xf9, 0x11, 0x5, 0xf7, 0x85, 0x6b,
+ 0xa, 0xfc, 0xdc, 0x6, 0x79, 0x3a, 0x5, 0xf7,
+ 0x89, 0x6, 0xe, 0x35, 0xa, 0xf7, 0x26, 0xdc,
+ 0xf7, 0xa0, 0xda, 0xf7, 0x24, 0x77, 0x1, 0xf8,
+ 0xfd, 0xea, 0x3, 0xe1, 0x16, 0xeb, 0x6, 0xaa,
+ 0xf7, 0x26, 0x5, 0xf7, 0x47, 0x6, 0xf7, 0x33,
+ 0xf7, 0x35, 0xcd, 0xf7, 0x41, 0xf7, 0x1c, 0x30,
+ 0xc0, 0xfb, 0x7, 0x1f, 0xfb, 0x61, 0x6, 0xaa,
+ 0xf7, 0x24, 0x50, 0xa, 0x85, 0xfc, 0x7f, 0x15,
+ 0xc2, 0xf7, 0xa0, 0x5, 0xf7, 0x4d, 0x6, 0xd1,
+ 0xd8, 0x82, 0x26, 0xfb, 0x1d, 0xfb, 0x1b, 0x76,
+ 0x2c, 0x1f, 0xe, 0xf8, 0x3c, 0x78, 0xdd, 0xf9,
+ 0x23, 0x42, 0xa, 0xf7, 0x77, 0xf9, 0x62, 0x15,
+ 0x8f, 0xfb, 0x0, 0xfc, 0x7b, 0x65, 0xfb, 0x22,
+ 0xf7, 0x9, 0x45, 0xf7, 0x27, 0xf7, 0x91, 0xbb,
+ 0xf7, 0x7a, 0xde, 0x9d, 0x1f, 0xe6, 0xf8, 0x3c,
+ 0x57, 0xa, 0x30, 0xfc, 0x3c, 0x5, 0xfb, 0x10,
+ 0x72, 0x5c, 0x20, 0xfb, 0x2e, 0x1b, 0x39, 0x3b,
+ 0xb7, 0xe1, 0x1f, 0xf4, 0xf8, 0xa1, 0x5, 0xe,
+ 0xf8, 0x3c, 0x78, 0xdf, 0xf9, 0x31, 0x77, 0xe9,
+ 0x76, 0xf7, 0x22, 0x42, 0xa, 0xf8, 0x49, 0xf9,
+ 0xa7, 0x15, 0xd5, 0x6, 0xf7, 0x19, 0xf7, 0x22,
+ 0x5, 0xfb, 0x7, 0x6, 0xfb, 0xc1, 0xfb, 0x57,
+ 0x15, 0x8b, 0x22, 0xfc, 0x85, 0x64, 0x1a, 0xfb,
+ 0x25, 0xf7, 0xa, 0x43, 0xf7, 0x28, 0xf7, 0x90,
+ 0xbb, 0xf7, 0x7f, 0xe1, 0x9c, 0x1e, 0xe6, 0xf8,
+ 0x44, 0x57, 0xa, 0x32, 0xfc, 0x44, 0x5, 0xfb,
+ 0xb, 0x75, 0x48, 0xfb, 0xa, 0xfb, 0x1e, 0x1b,
+ 0x3a, 0x39, 0xb8, 0xe3, 0x1f, 0xf4, 0xf8, 0xac,
+ 0x5, 0xe, 0xf8, 0x3c, 0x78, 0xdf, 0xf9, 0x32,
+ 0x42, 0xa, 0xf8, 0x2, 0xf9, 0xa8, 0x15, 0xe8,
+ 0x6, 0xdd, 0xe5, 0xb3, 0x31, 0x5, 0xdb, 0x6,
+ 0x4d, 0xf7, 0x21, 0x47, 0xa, 0xfb, 0xa3, 0xfb,
+ 0x56, 0x2c, 0xa, 0xf8, 0x3c, 0x78, 0xde, 0xf9,
+ 0x2b, 0x77, 0xf7, 0x56, 0x42, 0xa, 0xf8, 0xcb,
+ 0xf9, 0xb2, 0x15, 0xe9, 0x6, 0xa0, 0xf2, 0x5,
+ 0x2d, 0x6, 0xfb, 0x62, 0x24, 0x15, 0xe9, 0x6,
+ 0xa1, 0xf2, 0x5, 0x2d, 0x6, 0xfb, 0x44, 0xfb,
+ 0x3a, 0x2c, 0xa, 0xf8, 0x3c, 0x78, 0xdf, 0xf9,
+ 0x33, 0x77, 0xd4, 0xf7, 0x20, 0x1, 0xf7, 0xf,
+ 0xeb, 0x3, 0xf7, 0x77, 0xf9, 0x74, 0x15, 0x8b,
+ 0x23, 0xfc, 0x87, 0x64, 0x1a, 0xfb, 0x25, 0xf7,
+ 0x9, 0x43, 0xf7, 0x27, 0xf7, 0x92, 0xbb, 0xf7,
+ 0x80, 0xe0, 0x9d, 0x1e, 0xe5, 0xf8, 0x46, 0x57,
+ 0xa, 0x33, 0xfc, 0x46, 0x5, 0xfb, 0xb, 0x74,
+ 0x48, 0xfb, 0xa, 0xfb, 0x1f, 0x1b, 0x39, 0x3a,
+ 0xb8, 0xe3, 0x1f, 0xf4, 0xf8, 0xae, 0x5, 0xf7,
+ 0x4e, 0xc0, 0x15, 0xd2, 0x6, 0x50, 0xf7, 0x20,
+ 0x5, 0xfb, 0x2, 0x6, 0xe, 0xf8, 0x5, 0x2d,
+ 0xa, 0xf7, 0xcc, 0x16, 0xf1, 0x6, 0xf8, 0x16,
+ 0xf9, 0x62, 0x5, 0x28, 0x6, 0xfb, 0xd5, 0xfc,
+ 0xfd, 0xfb, 0x7, 0xf8, 0xfd, 0x3d, 0xa, 0xe,
+ 0xf9, 0x1a, 0x2d, 0xa, 0xf7, 0x52, 0xdf, 0xf7,
+ 0xe6, 0xd9, 0xf7, 0xbc, 0xea, 0x3, 0xf7, 0x68,
+ 0x16, 0xec, 0x6, 0xf7, 0xb3, 0xf8, 0xd0, 0x48,
+ 0xa, 0xa7, 0xfc, 0xd0, 0x5, 0xf0, 0x6, 0xf7,
+ 0xf6, 0xf9, 0x62, 0x4d, 0xa, 0xfb, 0xac, 0xfc,
+ 0xe5, 0x4e, 0xa, 0x70, 0xf8, 0xe5, 0x5, 0x2a,
+ 0x6, 0xfb, 0xb9, 0xfc, 0xde, 0x89, 0x8d, 0x76,
+ 0xf8, 0xdc, 0x4d, 0xa, 0xe, 0xf8, 0x5, 0x2d,
+ 0xa, 0x9e, 0x16, 0xf7, 0xe, 0x6, 0xf7, 0x92,
+ 0xf7, 0xb4, 0xf7, 0x2b, 0xfb, 0xb4, 0x5, 0xef,
+ 0x6, 0xfb, 0x51, 0xf7, 0xee, 0xf7, 0xe1, 0xf8,
+ 0x8, 0x5, 0xfb, 0xc, 0x6, 0xfb, 0x98, 0xfb,
+ 0xbc, 0xfb, 0x30, 0xf7, 0xbc, 0x5, 0x26, 0x6,
+ 0xf7, 0x57, 0xfb, 0xf8, 0x5, 0xe, 0xf8, 0x5,
+ 0x2d, 0xa, 0xf7, 0x3b, 0xef, 0xf8, 0x40, 0xf7,
+ 0x3, 0x3, 0xf7, 0xda, 0x16, 0xe8, 0x6, 0xc2,
+ 0xf7, 0xa1, 0xf7, 0xe0, 0xf8, 0x55, 0x51, 0xa,
+ 0xfb, 0xf9, 0xfb, 0x3d, 0xf7, 0xf9, 0x47, 0xa,
+ 0xf7, 0x6b, 0xfc, 0x4d, 0x5, 0xe, 0x35, 0xa,
+ 0xfa, 0x35, 0x77, 0x1, 0xf7, 0xda, 0x16, 0xe7,
+ 0x6, 0xc3, 0xf7, 0xaa, 0xf7, 0xe0, 0xf8, 0x5f,
+ 0x51, 0xa, 0xfc, 0x0, 0xfb, 0x3d, 0xf8, 0x0,
+ 0x47, 0xa, 0xf7, 0x6a, 0xfc, 0x57, 0x5, 0xb1,
+ 0xf8, 0x8c, 0x15, 0xd2, 0x6, 0xf7, 0x13, 0x6f,
+ 0xa, 0xfb, 0x1, 0x6, 0xe, 0x35, 0xa, 0xf9,
+ 0x6d, 0x77, 0xe5, 0xf1, 0x1, 0xf7, 0xda, 0x16,
+ 0xe7, 0x6, 0xc3, 0xf7, 0xa6, 0xf7, 0xe0, 0xf8,
+ 0x5b, 0x51, 0xa, 0xfb, 0xfd, 0xfb, 0x3d, 0xf7,
+ 0xfd, 0x47, 0xa, 0xf7, 0x6a, 0xfc, 0x5b, 0x5,
+ 0xf7, 0x36, 0xf8, 0xa1, 0x15, 0xe5, 0x6, 0x9f,
+ 0xf1, 0x3f, 0xa, 0xfb, 0x57, 0x25, 0x15, 0xe4,
+ 0x6, 0xa0, 0xf1, 0x3e, 0xa, 0xf7, 0xcd, 0x8b,
+ 0xdc, 0xf8, 0xc0, 0xdc, 0x1, 0x84, 0x16, 0xf9,
+ 0x2, 0x6, 0x9f, 0xdc, 0x5, 0xfc, 0x7f, 0x6,
+ 0xf8, 0xe0, 0xf8, 0xc6, 0x94, 0xd6, 0x5, 0xfc,
+ 0xd8, 0x6, 0x77, 0x3a, 0xf8, 0x5d, 0x8c, 0xfc,
+ 0xe6, 0xfc, 0xca, 0x5, 0xe, 0xf7, 0xcd, 0x8b,
+ 0xdf, 0xf9, 0x56, 0xf7, 0x1f, 0x1, 0x84, 0x16,
+ 0xf8, 0xf8, 0x6, 0x9f, 0xdf, 0x5, 0xfc, 0x75,
+ 0x6, 0xf8, 0xe0, 0xf8, 0xd6, 0x94, 0xd8, 0x5,
+ 0xfc, 0xd8, 0x6, 0x77, 0x37, 0xf8, 0x57, 0x8a,
+ 0xfc, 0xe0, 0xfc, 0xd8, 0x5, 0xf8, 0x24, 0xf9,
+ 0x60, 0x15, 0xf7, 0x6, 0x6, 0xf7, 0x2d, 0x6f,
+ 0xa, 0x20, 0x6, 0x2d, 0x31, 0x5d, 0xe5, 0x45,
+ 0xa, 0xe, 0x7c, 0xd1, 0x66, 0x76, 0xf7, 0x8b,
+ 0xcd, 0xf7, 0x2e, 0xd5, 0x12, 0xc8, 0xe7, 0x13,
+ 0x78, 0xf8, 0x3c, 0x88, 0x15, 0xe8, 0x6, 0x85,
+ 0xa7, 0x87, 0x9f, 0xa3, 0x1a, 0xae, 0x91, 0xad,
+ 0x92, 0xad, 0x1e, 0xaa, 0xf7, 0x17, 0x5, 0x91,
+ 0xa4, 0x8d, 0xa4, 0xa2, 0x1a, 0xe7, 0x51, 0xd1,
+ 0xfb, 0x25, 0x40, 0xfb, 0x25, 0x60, 0xfb, 0xb,
+ 0x73, 0x1e, 0xe9, 0x83, 0x5, 0xd8, 0xa7, 0xc6,
+ 0x9e, 0xc6, 0x1b, 0x13, 0xb8, 0xc1, 0xe3, 0x7b,
+ 0xfb, 0xb, 0x6a, 0x1f, 0x65, 0x7d, 0x64, 0x89,
+ 0x3d, 0x88, 0x8, 0x4d, 0x89, 0xfb, 0x4b, 0x83,
+ 0xfb, 0x36, 0x1a, 0x29, 0xd6, 0x54, 0xe6, 0x1e,
+ 0xe8, 0xca, 0xc0, 0xa5, 0xa9, 0x1f, 0x8c, 0x7f,
+ 0x8d, 0x6e, 0x93, 0x71, 0x8, 0xa2, 0xf7, 0xa1,
+ 0x15, 0x82, 0x56, 0x80, 0x5f, 0x71, 0x66, 0x8,
+ 0x5a, 0x69, 0x53, 0x6f, 0x53, 0x1b, 0x3c, 0x74,
+ 0xb7, 0xb2, 0xe0, 0xe8, 0x9a, 0xc7, 0x91, 0x1f,
+ 0xdd, 0x92, 0xa4, 0x8d, 0xad, 0x98, 0x8, 0xe,
+ 0x4a, 0xa, 0xf8, 0x39, 0x77, 0x12, 0xc8, 0xea,
+ 0xf7, 0xe1, 0xed, 0x13, 0x7c, 0xf7, 0xcf, 0xf8,
+ 0xe9, 0x15, 0xda, 0x6, 0xf7, 0x21, 0xf7, 0x1d,
+ 0x5, 0xfb, 0xd, 0x6, 0x90, 0xfd, 0x75, 0x22,
+ 0xa, 0xe, 0x4a, 0xa, 0xf7, 0xb0, 0xf7, 0x1d,
+ 0x12, 0x13, 0x70, 0xf7, 0x7b, 0xf8, 0xe9, 0x15,
+ 0xe8, 0x6, 0xdd, 0xe2, 0xb3, 0x34, 0x5, 0xdb,
+ 0x6, 0x4d, 0xf7, 0x1d, 0x47, 0xa, 0xc2, 0xfd,
+ 0x75, 0x20, 0xa, 0x13, 0xb0, 0x2b, 0xa, 0xae,
+ 0xf8, 0xfa, 0x76, 0xf7, 0x21, 0x77, 0x1, 0xf7,
+ 0x8c, 0xf8, 0xe5, 0x15, 0xdd, 0x6, 0xf7, 0x25,
+ 0x6d, 0xa, 0xfb, 0x11, 0x6, 0xe, 0x7c, 0xd0,
+ 0x67, 0x76, 0xf7, 0x8a, 0xcd, 0xf7, 0xbe, 0xee,
+ 0x12, 0xc8, 0xe5, 0xf7, 0xcf, 0xe8, 0x13, 0x7c,
+ 0xf8, 0x44, 0xf8, 0xf3, 0x15, 0xe9, 0x6, 0xa1,
+ 0xee, 0x4d, 0xa, 0xfb, 0x62, 0x28, 0x15, 0xea,
+ 0x6, 0xa0, 0xee, 0x5, 0x2d, 0x6, 0xf7, 0x2a,
+ 0xfd, 0x59, 0x22, 0xa, 0xe, 0xf8, 0xe3, 0x7c,
+ 0xd1, 0xf7, 0x4c, 0xcf, 0xf7, 0x35, 0xd0, 0x8c,
+ 0x77, 0x12, 0xc8, 0xe6, 0x13, 0xe8, 0xf8, 0x47,
+ 0xf1, 0x15, 0x44, 0xa8, 0xe3, 0x5d, 0xd6, 0x1b,
+ 0xf7, 0x39, 0xcc, 0xf7, 0x1b, 0xbb, 0xa2, 0x1f,
+ 0x2f, 0x93, 0x5, 0x33, 0x5f, 0x4c, 0x6e, 0x57,
+ 0x1b, 0x44, 0x50, 0xcd, 0xf7, 0x6, 0x99, 0x1f,
+ 0xf8, 0x19, 0x6, 0x8d, 0x9a, 0x90, 0xad, 0xa9,
+ 0x1a, 0xf7, 0x7, 0x46, 0xf3, 0xfb, 0x20, 0x49,
+ 0x4b, 0x72, 0x5c, 0x5d, 0x1e, 0x13, 0xd8, 0x9f,
+ 0x7c, 0x5f, 0xc0, 0xfb, 0x0, 0x1b, 0xfb, 0x2,
+ 0x2c, 0x5c, 0xfb, 0x7, 0x65, 0x1f, 0xe4, 0x84,
+ 0x5, 0x13, 0xe8, 0xa6, 0x97, 0xa7, 0xd3, 0xf7,
+ 0x4, 0x1b, 0xd7, 0xb9, 0x51, 0x38, 0x65, 0x1f,
+ 0x30, 0x76, 0xfb, 0xe, 0x89, 0x58, 0x7c, 0x8,
+ 0x2f, 0x6f, 0x75, 0x45, 0x57, 0x1a, 0x48, 0xb2,
+ 0x34, 0xf7, 0x16, 0xf6, 0xc0, 0xc4, 0xc7, 0xb8,
+ 0x1e, 0x81, 0xf7, 0x30, 0x15, 0x54, 0x82, 0x67,
+ 0xfb, 0x28, 0xfb, 0x14, 0x1b, 0x42, 0x70, 0xb6,
+ 0xb4, 0xde, 0xdc, 0x96, 0xc9, 0x91, 0x1f, 0xd8,
+ 0x92, 0xa3, 0x91, 0xa8, 0x91, 0x8, 0xf4, 0xbc,
+ 0x15, 0xec, 0xa6, 0xc8, 0xcb, 0xe1, 0x1b, 0xc8,
+ 0xd8, 0x60, 0xfb, 0xa, 0x78, 0x1f, 0xe, 0x4a,
+ 0xa, 0xf7, 0xb0, 0xf7, 0x1d, 0x12, 0xc8, 0xe5,
+ 0xf7, 0xcf, 0xe8, 0x13, 0x7c, 0xf8, 0x37, 0x88,
+ 0x22, 0xa, 0x4a, 0xf7, 0xdc, 0x56, 0xa, 0xf7,
+ 0x1d, 0x5, 0xfb, 0x2, 0x6, 0xe, 0xf8, 0x5,
+ 0x7e, 0xd9, 0x50, 0x76, 0xf9, 0x2b, 0xd1, 0x12,
+ 0xd8, 0xe2, 0xcb, 0xe3, 0xf7, 0x30, 0xe4, 0x13,
+ 0xbc, 0xf7, 0x9e, 0xf8, 0x34, 0x15, 0x47, 0x6e,
+ 0xfb, 0xd, 0x52, 0xfb, 0x26, 0x1a, 0xfb, 0x7,
+ 0xe3, 0x39, 0xf7, 0x14, 0xea, 0xbf, 0xb4, 0xb6,
+ 0xbf, 0x1e, 0x13, 0x7c, 0xa9, 0x63, 0xaf, 0x6b,
+ 0x9c, 0x7d, 0xcd, 0xbf, 0x18, 0x74, 0xa5, 0x6c,
+ 0xac, 0x6f, 0xb0, 0xa6, 0xaa, 0xaf, 0xbb, 0xa4,
+ 0xbf, 0x40, 0xae, 0x18, 0x6a, 0x51, 0x76, 0x76,
+ 0x7b, 0x79, 0x57, 0xcc, 0x56, 0xea, 0x7c, 0xa6,
+ 0x8, 0xdc, 0xb5, 0xed, 0xc3, 0xeb, 0x1a, 0xca,
+ 0x58, 0xd3, 0x23, 0xfb, 0x6, 0x4b, 0x2d, 0x3e,
+ 0x58, 0x9b, 0x6d, 0x9b, 0x67, 0x1e, 0xf7, 0x4a,
+ 0xfb, 0xb9, 0x15, 0x13, 0xbc, 0x55, 0x57, 0x59,
+ 0x79, 0x60, 0x1b, 0x46, 0x4b, 0xb6, 0xd7, 0xe7,
+ 0xe1, 0xbb, 0xbe, 0xa3, 0x1f, 0xb1, 0x44, 0xcc,
+ 0x31, 0xb1, 0x59, 0x8, 0x2e, 0xf7, 0xd2, 0x15,
+ 0x6d, 0xc4, 0x88, 0xa6, 0x93, 0x1a, 0xb9, 0xb2,
+ 0xc2, 0xbd, 0xb1, 0xa8, 0x6d, 0x66, 0x4a, 0x2d,
+ 0x5c, 0x6e, 0x7d, 0x1e, 0xe, 0x7c, 0xd0, 0x67,
+ 0x76, 0xf7, 0x88, 0xcc, 0xf7, 0xa3, 0xb1, 0xf3,
+ 0xb0, 0x12, 0xc8, 0xe5, 0xf7, 0x22, 0xb0, 0xf6,
+ 0xb1, 0x13, 0x7f, 0xf7, 0xb9, 0xf9, 0x2f, 0x15,
+ 0x59, 0xb5, 0x63, 0xbc, 0xbc, 0xb5, 0xb3, 0xbd,
+ 0xbe, 0x62, 0xb1, 0x59, 0x59, 0x62, 0x65, 0x58,
+ 0x1e, 0xb0, 0x8a, 0x15, 0xa8, 0xa3, 0xa3, 0xa9,
+ 0xa8, 0xa3, 0x74, 0x6d, 0x6e, 0x73, 0x75, 0x6e,
+ 0x6e, 0x72, 0xa1, 0xa8, 0x1e, 0xe4, 0xfd, 0x31,
+ 0x20, 0xa, 0x13, 0xbf, 0x2b, 0xa, 0xf7, 0x3f,
+ 0xf7, 0xb1, 0x76, 0xf8, 0x3c, 0x77, 0x1, 0xb5,
+ 0xf7, 0x9c, 0x15, 0xec, 0x6, 0xf7, 0x2a, 0xf7,
+ 0xda, 0xf7, 0x2e, 0xfb, 0xda, 0x5, 0xeb, 0x6,
+ 0xfb, 0x63, 0xf8, 0x3c, 0x5, 0x37, 0x6, 0xe,
+ 0xf7, 0xb2, 0xf7, 0x49, 0xdf, 0x4b, 0x76, 0xc7,
+ 0xe0, 0x8c, 0x77, 0x12, 0x13, 0x60, 0xf7, 0x3,
+ 0xf7, 0x48, 0x15, 0xa6, 0xa8, 0xaf, 0xac, 0xc2,
+ 0x1b, 0xb6, 0xac, 0x80, 0x7f, 0xa9, 0x1f, 0x13,
+ 0x90, 0x7a, 0xb3, 0xae, 0x78, 0xb4, 0x1b, 0xca,
+ 0xb0, 0xa5, 0xa4, 0xa6, 0x1f, 0xe9, 0x7, 0x82,
+ 0x82, 0x59, 0x57, 0x4f, 0x1b, 0x60, 0x65, 0x9d,
+ 0x9c, 0x63, 0x1f, 0x13, 0x60, 0x98, 0x6b, 0x6a,
+ 0x97, 0x66, 0x1b, 0x64, 0x58, 0x7e, 0x62, 0x66,
+ 0x1f, 0xe, 0xe6, 0xf8, 0x58, 0x76, 0xf7, 0xb3,
+ 0x77, 0x1, 0xf7, 0xb6, 0xc5, 0x3, 0xf7, 0x96,
+ 0xf8, 0x43, 0x15, 0xc8, 0xee, 0xcb, 0x28, 0xc3,
+ 0xb3, 0x3a, 0xe2, 0xf7, 0x9, 0xa4, 0x75, 0xcd,
+ 0xfb, 0x2, 0x5f, 0x95, 0xf7, 0x5, 0x47, 0x8a,
+ 0x95, 0xfb, 0x5, 0xfb, 0x1, 0xb7, 0x76, 0x49,
+ 0xf7, 0x7, 0x73, 0x3d, 0x33, 0x5, 0xe, 0xf9,
+ 0xc6, 0x61, 0xcb, 0x4b, 0xf7, 0x56, 0x81, 0xcc,
+ 0xf7, 0xe9, 0xca, 0xeb, 0xcb, 0x12, 0xf7, 0x81,
+ 0xca, 0xf2, 0xdb, 0xf8, 0x7f, 0xcb, 0x13, 0xbf,
+ 0xf9, 0x49, 0xf7, 0x6a, 0x15, 0x70, 0x8e, 0x90,
+ 0x5e, 0xd8, 0x1b, 0xf7, 0x12, 0xf7, 0x1a, 0xf7,
+ 0x23, 0xf7, 0x3a, 0xf7, 0x3c, 0xfb, 0x12, 0xf7,
+ 0x3f, 0xfb, 0x87, 0xfb, 0xdf, 0x26, 0xfb, 0xa6,
+ 0xfb, 0x3e, 0xfb, 0x66, 0xf7, 0x19, 0xfb, 0x46,
+ 0xf7, 0xc6, 0x1f, 0x13, 0x5f, 0xf7, 0xaa, 0xea,
+ 0xf7, 0x3d, 0xa4, 0x97, 0x1f, 0x3d, 0x6, 0x13,
+ 0xbf, 0x5f, 0x6d, 0x30, 0x35, 0xfb, 0x4c, 0x1b,
+ 0xfb, 0x5e, 0xfb, 0x44, 0xe0, 0xf7, 0x83, 0xf7,
+ 0x63, 0xf7, 0x27, 0xf7, 0x41, 0xf7, 0x6d, 0xf7,
+ 0x3e, 0xf7, 0x20, 0xfb, 0x4, 0xfb, 0x37, 0xfb,
+ 0x2a, 0xfb, 0xd, 0x33, 0x5d, 0x1f, 0x67, 0x83,
+ 0x94, 0xca, 0x94, 0xb4, 0xc9, 0xf7, 0xb6, 0x18,
+ 0x3e, 0x6, 0x7c, 0x48, 0x5, 0xd5, 0x5e, 0x4c,
+ 0x90, 0x73, 0x1b, 0xfb, 0xc, 0x23, 0xfb, 0x26,
+ 0xfb, 0x1a, 0x26, 0xca, 0x33, 0xe9, 0xc8, 0xbe,
+ 0xbb, 0xa3, 0xa0, 0x1f, 0xfb, 0x66, 0xf7, 0x9,
+ 0x15, 0xd9, 0xbf, 0xf7, 0x1f, 0xec, 0xbb, 0xc1,
+ 0x6b, 0x2d, 0xfb, 0x6, 0x39, 0x26, 0x40, 0x5d,
+ 0x5b, 0xb3, 0xdf, 0x1e, 0xe, 0x7c, 0xd0, 0x67,
+ 0x76, 0xf7, 0x89, 0xcd, 0xf0, 0xd5, 0xf7, 0x83,
+ 0x77, 0x12, 0xc8, 0xea, 0xf7, 0xe1, 0xee, 0x13,
+ 0x7e, 0xf7, 0x7e, 0xf8, 0xf7, 0x15, 0xcd, 0x6,
+ 0xa4, 0x91, 0x97, 0x9c, 0xa5, 0x1b, 0xa5, 0xa4,
+ 0x82, 0x81, 0xa2, 0x1f, 0x7f, 0xa6, 0xa3, 0x7f,
+ 0x9e, 0x1b, 0xca, 0xaf, 0xc2, 0xc1, 0x90, 0x1f,
+ 0x4b, 0x6, 0x7d, 0x87, 0x84, 0x72, 0x70, 0x1b,
+ 0x7c, 0x77, 0x95, 0x95, 0x74, 0x1f, 0x96, 0x72,
+ 0x6e, 0x96, 0x67, 0x1b, 0x42, 0x79, 0x57, 0x50,
+ 0x7a, 0x1f, 0xf7, 0x4d, 0xfc, 0xfa, 0x20, 0xa,
+ 0x13, 0xae, 0x2b, 0xa, 0x7c, 0xd3, 0x64, 0x76,
+ 0xf8, 0x61, 0xd4, 0xf7, 0x4f, 0x77, 0x12, 0xf8,
+ 0x80, 0xe7, 0x13, 0x78, 0xc5, 0x88, 0x15, 0xdd,
+ 0x6, 0x9f, 0xee, 0x48, 0xa, 0x13, 0xb8, 0x4a,
+ 0x9e, 0xce, 0x5d, 0xd3, 0x1b, 0xf7, 0x13, 0xf7,
+ 0x1d, 0xf7, 0x19, 0xf7, 0x5a, 0xf7, 0x5a, 0xfb,
+ 0x20, 0x9c, 0x66, 0x4c, 0x5d, 0x6e, 0x63, 0x5d,
+ 0x1f, 0xc2, 0xf7, 0x94, 0x3d, 0xa, 0x13, 0x78,
+ 0x77, 0xfc, 0x8e, 0x15, 0xdd, 0xcd, 0xf7, 0x38,
+ 0xf7, 0xa, 0xea, 0x9d, 0x29, 0x5f, 0x1e, 0x13,
+ 0xb8, 0x42, 0x60, 0xfb, 0x4e, 0xfb, 0x1d, 0x6a,
+ 0x37, 0x98, 0xf7, 0x22, 0x1e, 0xe, 0x77, 0x8d,
+ 0x76, 0xf9, 0x88, 0x77, 0x1, 0xf7, 0x20, 0xf7,
+ 0x5e, 0x3, 0xf7, 0x90, 0x78, 0x15, 0xe5, 0x6,
+ 0xfb, 0x4, 0xf9, 0x88, 0x3e, 0xa, 0x65, 0xfb,
+ 0x64, 0x76, 0xfa, 0x5a, 0x77, 0x1, 0xd5, 0xf7,
+ 0x74, 0x3, 0xd5, 0xfb, 0x79, 0x15, 0xd7, 0x6,
+ 0xf7, 0x28, 0xfa, 0x5a, 0x5, 0x3f, 0x6, 0xe,
+ 0xaf, 0xfb, 0x58, 0xd5, 0xf7, 0xee, 0xd9, 0xf7,
+ 0xed, 0xd5, 0x1, 0xe7, 0xf7, 0xf5, 0x3, 0xe7,
+ 0xf7, 0x74, 0x15, 0xeb, 0x82, 0x31, 0x2c, 0x7e,
+ 0x1f, 0xfb, 0x26, 0x76, 0x89, 0x32, 0xf7, 0x3c,
+ 0x1b, 0x96, 0xd5, 0x5, 0x29, 0x8b, 0x94, 0xf7,
+ 0x2c, 0xa3, 0x1f, 0x9b, 0xf7, 0x6, 0x85, 0xd7,
+ 0x3c, 0xad, 0xf6, 0xbb, 0x90, 0x9f, 0xa3, 0xf7,
+ 0x44, 0x8, 0xe3, 0x98, 0xa3, 0xbf, 0xdd, 0x1b,
+ 0x96, 0xd5, 0x5, 0xfb, 0x36, 0x72, 0x45, 0xfb,
+ 0x24, 0x73, 0x1f, 0x2b, 0x7b, 0x79, 0xfb, 0x1,
+ 0x2a, 0x1b, 0xe, 0xaf, 0xfb, 0x58, 0xd5, 0xf7,
+ 0xee, 0xd9, 0xf8, 0x7, 0xd5, 0x1, 0x8b, 0xf7,
+ 0xf6, 0x3, 0x96, 0xfb, 0xe, 0x15, 0x80, 0x41,
+ 0x5, 0xf7, 0x24, 0xb9, 0xd7, 0xf7, 0x13, 0x9f,
+ 0x1f, 0xea, 0x9a, 0xa2, 0xf7, 0xe, 0xe9, 0x1b,
+ 0x97, 0xd9, 0x5, 0x2d, 0x91, 0xdd, 0xea, 0x99,
+ 0x1f, 0xf7, 0x28, 0xa1, 0x89, 0xea, 0xfb, 0x38,
+ 0x1b, 0x80, 0x41, 0x5, 0xee, 0x89, 0x7c, 0xfb,
+ 0x2e, 0x74, 0x1f, 0x7a, 0xfb, 0x6, 0x92, 0x48,
+ 0xd9, 0x68, 0xfb, 0x0, 0x5b, 0x86, 0x6b, 0x71,
+ 0xfb, 0x44, 0x8, 0x33, 0x7e, 0x71, 0x62, 0x3d,
+ 0x1b, 0xe, 0x5f, 0xa, 0xa0, 0xf8, 0x12, 0x3,
+ 0xf7, 0xf, 0xfb, 0x14, 0x15, 0xf7, 0x33, 0xf9,
+ 0xa2, 0x5, 0xf6, 0x6, 0x99, 0xcf, 0x5, 0xfb,
+ 0x59, 0x6, 0xfb, 0x4d, 0xfe, 0x2a, 0x5, 0xf7,
+ 0x57, 0x6, 0x9a, 0xcf, 0x5, 0xe, 0x5f, 0xa,
+ 0x7d, 0xf8, 0x12, 0x3, 0xfb, 0x14, 0x4, 0x7d,
+ 0x47, 0x5, 0xf7, 0x56, 0x6, 0xf7, 0x50, 0xfa,
+ 0x2a, 0x5, 0xfb, 0x54, 0x6, 0x7c, 0x47, 0x5,
+ 0xf5, 0x6, 0xfb, 0x36, 0xfd, 0xa2, 0x5, 0xe,
+ 0xae, 0xf8, 0xe7, 0xca, 0x1, 0xf7, 0x3b, 0xc8,
+ 0x3, 0xf7, 0x3b, 0xf9, 0x6f, 0x15, 0x42, 0x8e,
+ 0xb9, 0x4c, 0xe5, 0x1b, 0xf7, 0x2, 0xb9, 0xe2,
+ 0xbc, 0x99, 0x1f, 0x4e, 0x6, 0x73, 0x81, 0x6f,
+ 0x5a, 0x47, 0x1b, 0x53, 0x78, 0xa9, 0xb6, 0x85,
+ 0x1f, 0xe, 0x65, 0x8d, 0x76, 0xf9, 0x88, 0x77,
+ 0x1, 0xf7, 0x4b, 0xf8, 0x3f, 0x15, 0xd8, 0x6,
+ 0xcb, 0xf7, 0xca, 0x5, 0x3e, 0x6, 0xfb, 0x31,
+ 0xfd, 0x88, 0x15, 0xd8, 0x6, 0xcb, 0xf7, 0xc9,
+ 0x5, 0x3e, 0x6, 0xe, 0xbf, 0xf7, 0x73, 0x76,
+ 0xf7, 0xcf, 0x77, 0x1, 0xe6, 0xf7, 0xfd, 0x15,
+ 0x34, 0xd3, 0x43, 0xe4, 0xe3, 0xd4, 0xd3, 0xe2,
+ 0xe1, 0x42, 0xd1, 0x33, 0x32, 0x43, 0x45, 0x35,
+ 0x1e, 0xe, 0xf7, 0x5e, 0x7c, 0xd1, 0xf7, 0xc5,
+ 0xf7, 0x46, 0x41, 0xd5, 0x1, 0xd5, 0xea, 0xf7,
+ 0xb8, 0xe7, 0x3, 0xf8, 0x3e, 0xf7, 0x52, 0x15,
+ 0x54, 0x78, 0x5c, 0x3b, 0x36, 0x1b, 0x72, 0x3a,
+ 0x98, 0xf7, 0x12, 0xbf, 0xa0, 0xf7, 0x6e, 0xf7,
+ 0x36, 0xa6, 0xdd, 0x84, 0x28, 0x1f, 0xe7, 0x90,
+ 0x5, 0xf7, 0x1d, 0xfb, 0x4, 0xb1, 0x3b, 0xfb,
+ 0x6d, 0x45, 0xfb, 0x66, 0xfb, 0x1a, 0xfb, 0x26,
+ 0xe7, 0x4c, 0xf7, 0x0, 0xf3, 0xe8, 0xc6, 0xf7,
+ 0x1d, 0xbb, 0x1e, 0xe, 0x53, 0xa, 0xf7, 0x83,
+ 0xf8, 0xe5, 0x15, 0xed, 0x6, 0xf7, 0x17, 0xf7,
+ 0x21, 0x3d, 0xa, 0x3a, 0x31, 0x64, 0xe5, 0x5,
+ 0x3c, 0x6, 0xe, 0xf7, 0x5e, 0xfb, 0x60, 0x76,
+ 0xf7, 0x58, 0xd1, 0xf7, 0xce, 0xf7, 0x4b, 0x40,
+ 0xd6, 0x1, 0xd5, 0xea, 0xf7, 0x3, 0xdd, 0xee,
+ 0xe6, 0x3, 0xf7, 0x63, 0x2d, 0x15, 0xa7, 0xb8,
+ 0x8e, 0x68, 0x5c, 0x3c, 0x91, 0x5b, 0x1f, 0x78,
+ 0x53, 0x5, 0x8a, 0x9e, 0xa1, 0x8a, 0x9e, 0x1b,
+ 0xb2, 0xf7, 0x15, 0x98, 0xe3, 0x9d, 0x83, 0xbb,
+ 0x41, 0x1f, 0x97, 0xa8, 0x5, 0xf7, 0x1, 0xd9,
+ 0xe1, 0xf7, 0x6, 0xb3, 0x1f, 0x2f, 0x95, 0x5,
+ 0x53, 0x78, 0x5b, 0x37, 0x36, 0x1b, 0x63, 0x49,
+ 0xb3, 0xf5, 0xdc, 0xa8, 0xf7, 0x57, 0xf7, 0x2f,
+ 0xa6, 0xdc, 0x74, 0x33, 0x1f, 0xe6, 0x91, 0x5,
+ 0xf7, 0x20, 0xfb, 0x3, 0xb3, 0x3b, 0xfb, 0x68,
+ 0x40, 0xfb, 0x61, 0xfb, 0x26, 0xfb, 0x44, 0xf7,
+ 0x11, 0x62, 0xae, 0x8e, 0x1e, 0xe, 0xae, 0xfb,
+ 0x60, 0x76, 0xf7, 0x75, 0x77, 0x12, 0xf7, 0x2e,
+ 0xd9, 0x17, 0xee, 0x16, 0x78, 0x38, 0x5, 0xb8,
+ 0xa8, 0x79, 0x6f, 0x67, 0x4b, 0x8d, 0x7d, 0x66,
+ 0x7f, 0x8d, 0x8c, 0x7b, 0x1f, 0x13, 0xe0, 0x82,
+ 0x4f, 0x5, 0x87, 0xa2, 0xa9, 0x8a, 0xa2, 0x1b,
+ 0xa7, 0xf7, 0x12, 0x90, 0xe6, 0x96, 0x88, 0xc6,
+ 0x3d, 0x98, 0x1f, 0x95, 0xb9, 0x5, 0xe, 0xad,
+ 0xc1, 0xf7, 0xd8, 0xc5, 0x1, 0xf6, 0x2a, 0x15,
+ 0xc4, 0x79, 0xe0, 0xf7, 0x2d, 0x5, 0x89, 0x94,
+ 0x9b, 0x89, 0xa4, 0x1b, 0xf2, 0xed, 0xb7, 0xf7,
+ 0x1, 0xbd, 0x1f, 0x40, 0x92, 0x5, 0x61, 0x78,
+ 0x46, 0x4b, 0x34, 0x1b, 0x82, 0x83, 0x8d, 0x8c,
+ 0x87, 0x1f, 0xf7, 0x40, 0xf7, 0xca, 0xb4, 0x75,
+ 0x9e, 0x68, 0x8c, 0x78, 0x19, 0xd3, 0x8f, 0x5,
+ 0x9f, 0x7d, 0xd7, 0x32, 0xa7, 0x1e, 0xdf, 0xf7,
+ 0x2c, 0x53, 0x9d, 0x34, 0xfb, 0x33, 0x5, 0x8c,
+ 0x83, 0x82, 0x8c, 0x7a, 0x1b, 0xfb, 0x71, 0x43,
+ 0xfb, 0x3a, 0x23, 0x5d, 0x9a, 0x4e, 0xdd, 0x68,
+ 0x1f, 0xac, 0xc7, 0x15, 0x79, 0x95, 0x66, 0x9d,
+ 0xc1, 0x1a, 0xb7, 0xa9, 0xf7, 0x3c, 0xf7, 0x51,
+ 0x1e, 0xe, 0xae, 0xf8, 0xe5, 0xe5, 0x31, 0xf7,
+ 0x21, 0x12, 0x13, 0x80, 0xf7, 0x27, 0xf8, 0xe5,
+ 0x15, 0xe7, 0x6, 0xdc, 0xe5, 0xb2, 0x31, 0x5,
+ 0xda, 0x6, 0x13, 0x40, 0x4d, 0xf7, 0x21, 0x57,
+ 0xa, 0xe, 0x77, 0x8b, 0xeb, 0xf7, 0xd8, 0xeb,
+ 0x1, 0xe2, 0xf7, 0x6a, 0x3, 0xf7, 0x43, 0xf8,
+ 0x38, 0x40, 0xa, 0xfb, 0x2, 0xfc, 0x98, 0x40,
+ 0xa, 0xe, 0x77, 0xfb, 0x12, 0x76, 0xf7, 0x91,
+ 0x77, 0x1, 0xe2, 0x8e, 0x15, 0xc4, 0x6, 0x78,
+ 0x2d, 0x5f, 0x81, 0x7a, 0x87, 0x83, 0x61, 0x18,
+ 0x67, 0xa, 0x92, 0xaf, 0x9e, 0xe5, 0x18, 0x22,
+ 0x6, 0xe, 0xf8, 0x4b, 0x78, 0xc9, 0xee, 0xc6,
+ 0xf7, 0xce, 0xc2, 0xf4, 0xc9, 0x1, 0xc1, 0xcc,
+ 0xf9, 0x21, 0xcc, 0x3, 0xf8, 0xcb, 0xf7, 0xbe,
+ 0x15, 0x34, 0x6b, 0x41, 0x81, 0x6f, 0x1b, 0x44,
+ 0x4f, 0xbb, 0xf6, 0x98, 0x1f, 0xd6, 0x94, 0xb9,
+ 0xdf, 0xef, 0x1b, 0x9d, 0xd0, 0x8a, 0x3f, 0xa1,
+ 0x1f, 0xcb, 0x99, 0x5, 0xdd, 0x7b, 0x46, 0xaf,
+ 0x3a, 0x1b, 0xfb, 0x17, 0x35, 0x37, 0xfb, 0x16,
+ 0x7b, 0x1f, 0xfb, 0x1c, 0x7b, 0xd9, 0x3d, 0xf7,
+ 0xc, 0x1b, 0xdd, 0xe2, 0xb6, 0xe9, 0xad, 0x1f,
+ 0xfc, 0xd3, 0xd8, 0x15, 0xfb, 0x65, 0xf7, 0x45,
+ 0xfb, 0x3a, 0xf7, 0x6d, 0xf7, 0x6d, 0xf7, 0x40,
+ 0xf7, 0x3b, 0xf7, 0x64, 0xf7, 0x65, 0xfb, 0x42,
+ 0xf7, 0x40, 0xfb, 0x6b, 0xfb, 0x6a, 0xfb, 0x48,
+ 0xfb, 0x3f, 0xfb, 0x66, 0x1e, 0xcc, 0x16, 0xf7,
+ 0x42, 0xf7, 0x29, 0xf7, 0x25, 0xf7, 0x48, 0xf7,
+ 0x49, 0xf7, 0x23, 0xfb, 0x25, 0xfb, 0x42, 0xfb,
+ 0x42, 0xfb, 0x23, 0xfb, 0x1f, 0xfb, 0x49, 0xfb,
+ 0x48, 0xfb, 0x29, 0xf7, 0x1f, 0xf7, 0x42, 0x1e,
+ 0xe, 0xf7, 0xc, 0x76, 0xae, 0xdf, 0xf7, 0x9e,
+ 0xdf, 0xae, 0x77, 0x1, 0xee, 0xee, 0x15, 0xe3,
+ 0xd3, 0x5, 0x70, 0xa9, 0xb0, 0x81, 0xb0, 0x1b,
+ 0xb0, 0xbb, 0x95, 0xa6, 0xb7, 0x1f, 0xbb, 0x43,
+ 0xd4, 0xc8, 0x5a, 0xd0, 0xb6, 0xbd, 0x9c, 0xb8,
+ 0x92, 0xa5, 0x19, 0x92, 0xa7, 0x94, 0xb8, 0x7a,
+ 0xbb, 0xe3, 0xd2, 0x18, 0x63, 0xc8, 0x33, 0x43,
+ 0x5, 0xa6, 0x6e, 0x63, 0x95, 0x66, 0x1b, 0x66,
+ 0x5e, 0x81, 0x70, 0x5e, 0x1f, 0x5b, 0xd3, 0x43,
+ 0x4e, 0xbb, 0x44, 0x60, 0x5b, 0x79, 0x5e, 0x84,
+ 0x6f, 0x19, 0x84, 0x71, 0x83, 0x5e, 0x9c, 0x59,
+ 0x34, 0x46, 0x18, 0xf7, 0x39, 0xf7, 0x52, 0x15,
+ 0xd6, 0xa0, 0xd3, 0xc6, 0xd1, 0x1b, 0xd1, 0xb5,
+ 0x4f, 0x41, 0x76, 0x1f, 0x42, 0x77, 0x42, 0x50,
+ 0x44, 0x1b, 0x46, 0x62, 0xc6, 0xd4, 0x9f, 0x1f,
+ 0xe, 0x7c, 0xd3, 0x4f, 0xc7, 0xf8, 0x25, 0xd4,
+ 0xf7, 0x4f, 0x77, 0x12, 0xdf, 0xe7, 0x13, 0x78,
+ 0xf8, 0x30, 0x88, 0x15, 0xe0, 0x6, 0xf7, 0x2f,
+ 0xf9, 0x65, 0x3d, 0xa, 0x50, 0xfb, 0xad, 0x4e,
+ 0xa, 0xd5, 0x64, 0x51, 0x9f, 0x55, 0x1b, 0xfb,
+ 0x20, 0xfb, 0x10, 0xfb, 0x1c, 0xfb, 0x4a, 0x1f,
+ 0x13, 0xb8, 0xfb, 0x3c, 0xf3, 0x4f, 0xd6, 0xd0,
+ 0xc0, 0xb2, 0xba, 0xb6, 0x1e, 0x13, 0x78, 0xfb,
+ 0x90, 0xf7, 0x22, 0x15, 0xc4, 0xb5, 0xf7, 0x50,
+ 0xf7, 0x16, 0xc2, 0xcf, 0x67, 0x2a, 0xfb, 0x1e,
+ 0x3a, 0xfb, 0x16, 0x27, 0xfb, 0x6, 0x8b, 0xf7,
+ 0x11, 0xaa, 0x1e, 0xe, 0xfb, 0x1e, 0x76, 0xf8,
+ 0xe6, 0xd5, 0xf7, 0x65, 0x77, 0x1, 0xf7, 0x1b,
+ 0xf8, 0x7b, 0x3, 0xf7, 0x61, 0xfb, 0x33, 0x15,
+ 0xe2, 0x6, 0xf7, 0xf, 0xf8, 0xe6, 0x5, 0xf7,
+ 0x54, 0x6, 0x9a, 0xd5, 0x5, 0xfb, 0x53, 0x6,
+ 0xb6, 0xf7, 0x65, 0x5, 0x33, 0x6, 0x60, 0xfb,
+ 0x65, 0x5, 0xfb, 0x55, 0x6, 0x7c, 0x41, 0x5,
+ 0xf7, 0x55, 0x6, 0xe, 0xfb, 0x1e, 0x76, 0xf7,
+ 0x50, 0xd5, 0xf7, 0xf6, 0xd8, 0xf7, 0x4c, 0x77,
+ 0x1, 0xbf, 0xa8, 0x15, 0xf7, 0x53, 0x6, 0x66,
+ 0xfb, 0x50, 0x5, 0xe1, 0x6, 0xb0, 0xf7, 0x50,
+ 0x5, 0xf7, 0x50, 0x6, 0x9b, 0xd5, 0x5, 0xfb,
+ 0x51, 0x6, 0xd5, 0xf7, 0xf6, 0x5, 0xf7, 0x4f,
+ 0x6, 0x9d, 0xd8, 0x5, 0xfb, 0x52, 0x6, 0xb0,
+ 0xf7, 0x4c, 0x5, 0x35, 0x6, 0x65, 0xfb, 0x4c,
+ 0x5, 0xfb, 0x52, 0x6, 0x7b, 0x3e, 0x5, 0xf7,
+ 0x53, 0x6, 0x42, 0xfb, 0xf6, 0x5, 0xfb, 0x52,
+ 0x6, 0xe, 0xf1, 0xf8, 0x2f, 0xc2, 0xf7, 0x4c,
+ 0xc0, 0x1, 0xf7, 0x3d, 0xc1, 0xf7, 0x51, 0xc3,
+ 0x3, 0xf7, 0x3d, 0xf8, 0xc3, 0x15, 0x38, 0xcf,
+ 0x4a, 0xdc, 0xdd, 0xcf, 0xcc, 0xde, 0xdc, 0x49,
+ 0xca, 0x37, 0x38, 0x49, 0x4d, 0x39, 0x1e, 0xc1,
+ 0x8c, 0x15, 0xbe, 0xb5, 0xb2, 0xbf, 0xc0, 0xb5,
+ 0x64, 0x58, 0x57, 0x60, 0x61, 0x57, 0x58, 0x60,
+ 0xb5, 0xbf, 0x1e, 0xe, 0xae, 0xf8, 0xf0, 0xf1,
+ 0x1, 0xf7, 0xf9, 0xf9, 0x56, 0x5d, 0xa, 0xfb,
+ 0x27, 0xf1, 0x5d, 0xa, 0xe, 0xf7, 0xb2, 0x78,
+ 0xec, 0xf7, 0x18, 0xdd, 0xf7, 0x1a, 0xed, 0x1,
+ 0xe0, 0xf7, 0x66, 0x15, 0xf8, 0x76, 0x6, 0xb2,
+ 0xdd, 0x5, 0xfc, 0x76, 0x6, 0xf7, 0x7c, 0xf7,
+ 0x1a, 0x15, 0xf0, 0x6, 0xb9, 0xed, 0x5, 0x25,
+ 0x6, 0xfb, 0x61, 0xfc, 0xb3, 0x15, 0xf1, 0x6,
+ 0xb8, 0xec, 0x5, 0x26, 0x6, 0xe, 0x2d, 0x76,
+ 0xf7, 0x12, 0x76, 0xf9, 0x35, 0xd4, 0xb2, 0x77,
+ 0x1, 0xf7, 0x1a, 0xe6, 0xf7, 0xc3, 0xde, 0x3,
+ 0xf7, 0x8c, 0x81, 0x15, 0x74, 0x22, 0x5, 0xbf,
+ 0x6, 0xa0, 0xee, 0x5, 0xf7, 0x5e, 0xd0, 0xf7,
+ 0xb, 0xe5, 0xf7, 0x12, 0xfb, 0xe, 0xc9, 0x50,
+ 0xa3, 0x1f, 0xc1, 0xf7, 0x8e, 0x5, 0xc6, 0xa8,
+ 0x38, 0x6f, 0x8f, 0x1f, 0xde, 0x91, 0x5, 0xb2,
+ 0x4e, 0xf7, 0x1f, 0x29, 0x1e, 0x95, 0xba, 0x5,
+ 0x59, 0x6, 0x81, 0x64, 0x5, 0xfb, 0x55, 0x52,
+ 0xfb, 0x8, 0x3a, 0xfb, 0x13, 0xf7, 0x5, 0x58,
+ 0xbf, 0x76, 0x1f, 0x50, 0xfb, 0xa9, 0x5, 0x65,
+ 0x53, 0xb6, 0xf4, 0x83, 0x1f, 0x2e, 0x86, 0x5,
+ 0x25, 0x91, 0xca, 0xfb, 0x6, 0xf7, 0x2, 0x1b,
+ 0xe9, 0xf8, 0x46, 0x15, 0x62, 0x9e, 0x57, 0xa1,
+ 0xd5, 0x1a, 0xda, 0xd9, 0xb8, 0xcd, 0x1e, 0x3c,
+ 0xfc, 0xf5, 0x15, 0xc2, 0xf7, 0x9d, 0x5, 0xba,
+ 0x77, 0xc8, 0x6e, 0x3e, 0x1a, 0x44, 0x4a, 0x47,
+ 0x29, 0x1e, 0xe, 0xae, 0xf8, 0xf0, 0xf1, 0x1,
+ 0xf7, 0x8d, 0xf8, 0xf0, 0x15, 0xe7, 0x6, 0xa0,
+ 0xf1, 0x5, 0x2e, 0x6, 0xe, 0x77, 0x43, 0xa,
+ 0xea, 0xf7, 0x5b, 0x3, 0xea, 0x16, 0xe4, 0x6,
+ 0xf7, 0x2, 0xf8, 0x9f, 0x3e, 0xa, 0x7c, 0xd5,
+ 0xf7, 0x49, 0xd0, 0xf7, 0x33, 0xd1, 0x1, 0xdf,
+ 0xe7, 0xf7, 0xcf, 0xe2, 0x3, 0xf7, 0x44, 0xf7,
+ 0x84, 0x15, 0xf8, 0x1f, 0x6, 0x8e, 0x9f, 0x8f,
+ 0x9f, 0xb3, 0x1a, 0xe6, 0x5c, 0xf7, 0x13, 0xfb,
+ 0x38, 0xfb, 0x5a, 0x36, 0xfb, 0x55, 0xfb, 0x1b,
+ 0xfb, 0x27, 0xe8, 0x3d, 0xf7, 0x8, 0xf7, 0x1f,
+ 0xe6, 0xf7, 0x2, 0xd4, 0xa1, 0x1e, 0x32, 0x94,
+ 0x5, 0x2a, 0x61, 0x39, 0x76, 0x64, 0x1b, 0x43,
+ 0x4f, 0xd5, 0xf6, 0x9a, 0x1f, 0x99, 0xd0, 0x15,
+ 0xce, 0xa0, 0xc0, 0xe7, 0xf4, 0x1b, 0xd3, 0xc6,
+ 0x4c, 0x2b, 0x82, 0x1f, 0xe, 0x7c, 0xd5, 0x41,
+ 0xf7, 0x50, 0xcf, 0xd1, 0xf8, 0x3b, 0x77, 0x1,
+ 0xdf, 0xe7, 0x3, 0xf7, 0xd7, 0xf8, 0xe7, 0x15,
+ 0xd8, 0x6, 0xf7, 0x1d, 0x6f, 0xa, 0xfb, 0xa,
+ 0x6, 0xfb, 0x86, 0xfc, 0x81, 0x25, 0xa, 0xe,
+ 0x7c, 0xd5, 0xf7, 0x4a, 0xd1, 0xf7, 0xb0, 0xf7,
+ 0x1f, 0x1, 0xdf, 0xe6, 0xf7, 0xd0, 0xe2, 0x3,
+ 0xf7, 0x8c, 0xf8, 0xe7, 0x15, 0xe9, 0x6, 0xdd,
+ 0xe5, 0xb4, 0x31, 0x5, 0xdb, 0x6, 0x4c, 0xf7,
+ 0x1f, 0x47, 0xa, 0xfb, 0x61, 0xfc, 0x81, 0x25,
+ 0xa, 0xe, 0x7c, 0xd4, 0xf7, 0x48, 0xcf, 0xf7,
+ 0xbf, 0xf0, 0x1, 0xdf, 0xe6, 0x3, 0xf8, 0x56,
+ 0xf8, 0xf1, 0x63, 0xa, 0xfb, 0x64, 0x26, 0x63,
+ 0xa, 0xfb, 0x1, 0xfc, 0x65, 0x25, 0xa, 0xe,
+ 0x7c, 0xd5, 0xf7, 0x4a, 0xd1, 0xf7, 0xb1, 0xf7,
+ 0x1e, 0x1, 0xdf, 0xe6, 0x3, 0xf7, 0x45, 0xf7,
+ 0x85, 0x25, 0xa, 0x29, 0xf7, 0xb1, 0x15, 0xd3,
+ 0x6, 0x50, 0xf7, 0x1e, 0x5, 0xfb, 0x3, 0x6,
+ 0xe, 0x78, 0xd0, 0xf7, 0xbb, 0xcb, 0xf7, 0x75,
+ 0xd0, 0x1, 0xd5, 0xeb, 0xf7, 0xee, 0xe6, 0x3,
+ 0xf7, 0x83, 0xf8, 0x15, 0x15, 0xfb, 0x31, 0x63,
+ 0x83, 0xfb, 0x2a, 0x6c, 0x1a, 0x23, 0xe0, 0x3c,
+ 0xf7, 0x1f, 0xf7, 0x3e, 0xf2, 0xf7, 0xb, 0xf7,
+ 0xe, 0xe9, 0x4d, 0xb4, 0x6b, 0x9d, 0x1e, 0xd0,
+ 0x9c, 0xc8, 0xcc, 0xd3, 0x1a, 0xca, 0x5c, 0xf7,
+ 0x3, 0xfb, 0x3f, 0xfb, 0x39, 0x44, 0xfb, 0xb,
+ 0x40, 0x78, 0x8d, 0x4c, 0xdf, 0x61, 0x1e, 0x46,
+ 0xfb, 0x71, 0x15, 0xe7, 0xcf, 0xe4, 0xf6, 0xd3,
+ 0xc5, 0x55, 0x46, 0x40, 0x4f, 0x2a, 0x20, 0x39,
+ 0x53, 0xbc, 0xcc, 0x1e, 0xd8, 0xf7, 0xed, 0x15,
+ 0xc2, 0xb2, 0xd1, 0xf2, 0xd4, 0xc1, 0x5d, 0x50,
+ 0x54, 0x5f, 0x4a, 0x23, 0x43, 0x5a, 0xb0, 0xca,
+ 0x1e, 0xe, 0xf9, 0x52, 0x8b, 0xf5, 0x1, 0xf8,
+ 0x57, 0x16, 0x4b, 0xa, 0xf7, 0xcf, 0x21, 0x15,
+ 0x4b, 0xa, 0xfd, 0x49, 0x21, 0x15, 0x4b, 0xa,
+ 0xe, 0xf9, 0x52, 0x64, 0xa, 0xfa, 0x8c, 0xd4,
+ 0xfe, 0x8c, 0x6, 0xe, 0x64, 0xa, 0xf8, 0xd0,
+ 0xd4, 0xfc, 0xd0, 0x6, 0xe, 0xf7, 0xb2, 0xf7,
+ 0x7, 0xdc, 0xf7, 0x8, 0xd9, 0x1, 0xb5, 0xf8,
+ 0xc9, 0x3, 0xca, 0xf7, 0xce, 0x15, 0xf8, 0xc9,
+ 0xd7, 0xfc, 0xc9, 0x6, 0xfb, 0xa7, 0x4, 0xf8,
+ 0xc9, 0xda, 0xfc, 0xc9, 0x6, 0xe, 0x81, 0xd5,
+ 0x1, 0xf8, 0x8e, 0xf0, 0x3, 0xf7, 0xf0, 0xf8,
+ 0xd1, 0x15, 0xf7, 0x0, 0xb9, 0xa5, 0x5e, 0xa0,
+ 0x5b, 0x94, 0x59, 0x19, 0x89, 0x89, 0x5, 0xa2,
+ 0x72, 0x61, 0xae, 0x36, 0x1b, 0xfb, 0x2a, 0xfb,
+ 0x13, 0xfb, 0x29, 0xfb, 0x47, 0xfb, 0x7, 0xd2,
+ 0x23, 0xf7, 0x32, 0xf7, 0x8c, 0xc6, 0xf7, 0x90,
+ 0xf7, 0x8, 0xf7, 0x38, 0x53, 0xe4, 0x6d, 0xb9,
+ 0x1f, 0xdd, 0xae, 0x73, 0xbd, 0x2e, 0x65, 0x88,
+ 0x90, 0x78, 0x9e, 0x7a, 0x99, 0x19, 0x28, 0x6,
+ 0xa5, 0x73, 0x90, 0x85, 0xad, 0x62, 0x28, 0x60,
+ 0x18, 0xfb, 0x26, 0xfc, 0x37, 0x15, 0xea, 0xc3,
+ 0xf7, 0x33, 0xf7, 0x26, 0xcb, 0xd3, 0x68, 0x21,
+ 0x34, 0x4f, 0xfb, 0x3f, 0xfb, 0x24, 0xfb, 0x3,
+ 0x74, 0xdf, 0xc8, 0x1e, 0xe, 0x77, 0x8b, 0xef,
+ 0xe0, 0x77, 0xf8, 0xbd, 0x77, 0x1, 0xe5, 0x16,
+ 0xef, 0x6, 0xa0, 0xef, 0x47, 0xa, 0xb0, 0xe0,
+ 0x15, 0xc2, 0x6, 0xf3, 0xf8, 0x4, 0xac, 0xf7,
+ 0x39, 0x5, 0x20, 0x6, 0x6c, 0xfb, 0x39, 0x5,
+ 0xe, 0xae, 0xfb, 0x42, 0x76, 0xf8, 0xaf, 0x77,
+ 0xf0, 0xed, 0x1, 0xd8, 0xf7, 0x8d, 0x3, 0xf7,
+ 0x61, 0xf8, 0x3d, 0x15, 0xef, 0x6, 0xa0, 0xed,
+ 0x47, 0xa, 0xfb, 0x8, 0xfc, 0xc0, 0x15, 0x6a,
+ 0xfb, 0x36, 0x5, 0xf6, 0x6, 0xab, 0xf7, 0x36,
+ 0xc1, 0xf8, 0xd, 0x5, 0x54, 0x6, 0xe, 0x77,
+ 0x3a, 0xa, 0xf5, 0xf7, 0xde, 0x3, 0xe1, 0x16,
+ 0xdb, 0x6, 0xe0, 0xf8, 0x56, 0x5, 0xe5, 0x6,
+ 0x98, 0xcf, 0x3f, 0xa, 0xf0, 0x9f, 0x91, 0xa9,
+ 0xb5, 0x1b, 0xa7, 0xa8, 0x82, 0x88, 0x98, 0x1f,
+ 0x99, 0xd8, 0x5, 0x8f, 0x79, 0x62, 0x95, 0x6c,
+ 0x1b, 0x25, 0x80, 0x36, 0x46, 0x7a, 0x1f, 0x7f,
+ 0x53, 0x5, 0x43, 0x6, 0x7f, 0x47, 0x5, 0xd2,
+ 0x6, 0xe, 0xf7, 0x5e, 0x3a, 0xa, 0xe1, 0x16,
+ 0xe5, 0x46, 0xa, 0xa1, 0x8f, 0xa9, 0xba, 0x1b,
+ 0xaa, 0xae, 0x82, 0x88, 0x99, 0x1f, 0x9b, 0xd8,
+ 0x5, 0x8f, 0x77, 0x62, 0x95, 0x68, 0x1b, 0xfb,
+ 0x6, 0x7a, 0x36, 0x46, 0x78, 0x1f, 0x7e, 0x53,
+ 0x5, 0x3b, 0x6, 0x7c, 0x47, 0x5, 0xdc, 0x6,
+ 0xf7, 0x36, 0xfc, 0x56, 0x15, 0xe5, 0x6, 0xf7,
+ 0x3, 0xf8, 0x9a, 0x3f, 0xa, 0x9f, 0xe9, 0x15,
+ 0xe5, 0x6, 0xa1, 0xf3, 0x3e, 0xa, 0x78, 0xd0,
+ 0xf7, 0xef, 0xd9, 0xf7, 0x2d, 0xdb, 0x1, 0xcf,
+ 0xee, 0xf7, 0xb7, 0xeb, 0x3, 0xce, 0xf7, 0x57,
+ 0x15, 0x23, 0xd4, 0xfb, 0x2, 0xf7, 0x2e, 0xf7,
+ 0x41, 0xf7, 0x10, 0xf7, 0xd, 0xf7, 0x37, 0xf7,
+ 0x2c, 0xfb, 0xa, 0xc5, 0x34, 0x41, 0x61, 0x6e,
+ 0x7e, 0x73, 0x1e, 0xc6, 0xf7, 0x47, 0x5, 0xf7,
+ 0xbd, 0x6, 0x9e, 0xdb, 0x5, 0xfc, 0x12, 0x6,
+ 0xfb, 0x9, 0xfb, 0xfe, 0xdf, 0x84, 0x5, 0x9e,
+ 0x9b, 0xbc, 0xc2, 0xdf, 0x1b, 0xe7, 0xbb, 0x4c,
+ 0x46, 0x23, 0x34, 0xfb, 0x3, 0x20, 0x50, 0x38,
+ 0xb8, 0xf7, 0x1, 0x93, 0x1f, 0xe, 0xf7, 0x5e,
+ 0x3a, 0xa, 0xe1, 0x16, 0xe4, 0x46, 0xa, 0xa2,
+ 0x8f, 0xa9, 0xba, 0x1b, 0xaa, 0xac, 0x82, 0x88,
+ 0x9a, 0x1f, 0x9b, 0xd8, 0x5, 0x8f, 0x77, 0x63,
+ 0x95, 0x68, 0x1b, 0xfb, 0x5, 0x78, 0x37, 0x46,
+ 0x79, 0x1f, 0x7e, 0x52, 0x5, 0x3a, 0x6, 0x7d,
+ 0x47, 0x5, 0xdc, 0x6, 0xf7, 0x35, 0xfc, 0x56,
+ 0x15, 0xe5, 0x6, 0xf7, 0x2c, 0xf9, 0x60, 0x5,
+ 0x32, 0x6, 0xe, 0xfb, 0x63, 0xd9, 0xf8, 0xda,
+ 0xd1, 0xf7, 0x17, 0xde, 0x1, 0x77, 0xfb, 0xa,
+ 0x15, 0x6b, 0x3e, 0x5, 0x7f, 0xc7, 0xb2, 0x8b,
+ 0x92, 0x1b, 0xdb, 0xca, 0xdc, 0xe4, 0xae, 0x1f,
+ 0xf7, 0x4d, 0xf8, 0x7e, 0x5, 0xf0, 0x6, 0xa7,
+ 0xd1, 0x5, 0x25, 0x6, 0xf3, 0xb6, 0x98, 0xa6,
+ 0xbb, 0x1b, 0xa0, 0x9c, 0x87, 0x82, 0xae, 0x1f,
+ 0xac, 0xd8, 0x5, 0x95, 0x6a, 0x6d, 0x94, 0x64,
+ 0x1b, 0xfb, 0x6, 0x67, 0x27, 0xfb, 0x6, 0x5b,
+ 0x1f, 0x27, 0x6, 0x71, 0x45, 0x5, 0xee, 0x6,
+ 0xfb, 0x48, 0xfc, 0x7d, 0x5, 0x64, 0x7b, 0x68,
+ 0x55, 0x60, 0x1b, 0x7b, 0x76, 0x8e, 0x93, 0x67,
+ 0x1f, 0xe, 0xa0, 0x76, 0xf7, 0x48, 0xd9, 0xf7,
+ 0xc0, 0xf7, 0x2e, 0x1, 0xcb, 0xf7, 0x48, 0x15,
+ 0xf7, 0xd0, 0x6, 0x62, 0xfb, 0x48, 0x5, 0xeb,
+ 0x6, 0xb5, 0xf7, 0x48, 0x5, 0xf7, 0x1, 0x6,
+ 0x9e, 0xd9, 0x5, 0xfb, 0x2, 0x6, 0xf1, 0xf8,
+ 0x51, 0x5, 0x3d, 0x6, 0xfc, 0x46, 0xfc, 0x49,
+ 0x5, 0xe8, 0x83, 0x15, 0xf7, 0xb2, 0xf7, 0xb9,
+ 0x8d, 0x89, 0x48, 0xfb, 0xb7, 0x5, 0xe, 0xfb,
+ 0x17, 0x8d, 0x76, 0xf9, 0x66, 0x77, 0x1, 0xfb,
+ 0x3b, 0xf9, 0x20, 0x3, 0x23, 0x78, 0x15, 0xf8,
+ 0xde, 0xf9, 0x66, 0x5, 0x43, 0x6, 0xfc, 0xd8,
+ 0xfd, 0x66, 0x5, 0xe, 0xfb, 0x70, 0xd5, 0xf7,
+ 0x1f, 0xd5, 0xf8, 0x21, 0xd5, 0x7f, 0x77, 0x12,
+ 0x13, 0xd0, 0xb5, 0x54, 0x15, 0xfb, 0x30, 0xf7,
+ 0x36, 0x82, 0xc0, 0xf7, 0x57, 0xac, 0xf7, 0x2f,
+ 0xd6, 0x9b, 0x1e, 0xf7, 0x1, 0xf8, 0x98, 0x5,
+ 0x37, 0x6, 0x7b, 0x33, 0x4e, 0xa, 0x13, 0xe0,
+ 0xe0, 0x5c, 0x47, 0x9a, 0x5c, 0x1b, 0xfb, 0x28,
+ 0xfb, 0xe, 0xfb, 0x26, 0xfb, 0x33, 0xfb, 0x2b,
+ 0xe2, 0x32, 0xf4, 0xb5, 0xbf, 0x98, 0xc4, 0xc5,
+ 0x1f, 0x82, 0x56, 0x5, 0x2e, 0x7a, 0x61, 0x4c,
+ 0x22, 0x1b, 0x25, 0x81, 0xb9, 0xaf, 0x1f, 0xae,
+ 0xf7, 0xbd, 0x15, 0xd2, 0xc2, 0xf7, 0x34, 0xf7,
+ 0xf, 0xd9, 0xbd, 0x4b, 0x3d, 0x27, 0x4b, 0xfb,
+ 0x2f, 0xfb, 0x12, 0x31, 0x71, 0xe6, 0xd6, 0x1e,
+ 0xe, 0xf7, 0xcd, 0x7c, 0xd3, 0x64, 0x76, 0xf9,
+ 0x2b, 0xcf, 0x12, 0xf8, 0xb8, 0xef, 0x13, 0x70,
+ 0xce, 0x88, 0x15, 0xee, 0x6, 0xf7, 0x6, 0xf8,
+ 0x84, 0x5, 0xe5, 0xa0, 0xbb, 0xd8, 0xf6, 0x1b,
+ 0xe0, 0x81, 0x2a, 0x5a, 0x61, 0x1f, 0x53, 0x4b,
+ 0x6b, 0x62, 0x65, 0x1a, 0x66, 0xa7, 0x68, 0xc6,
+ 0x59, 0x1e, 0xc0, 0x5c, 0x9c, 0x79, 0x6f, 0x1a,
+ 0x13, 0xb0, 0x5d, 0x56, 0x56, 0x4b, 0x4e, 0x6b,
+ 0xc4, 0xa6, 0x7c, 0x1e, 0x38, 0x62, 0x5, 0x23,
+ 0xd0, 0xd7, 0x80, 0xba, 0x1b, 0xf7, 0x8, 0xef,
+ 0xda, 0xe7, 0xc1, 0x6e, 0xa5, 0x4a, 0xc8, 0x1f,
+ 0x5f, 0xb4, 0x79, 0xa2, 0xa2, 0x1a, 0xa2, 0xa2,
+ 0xa5, 0xb3, 0xb9, 0x1e, 0xec, 0xdf, 0x7f, 0xf7,
+ 0x2c, 0xfb, 0x46, 0x1b, 0xfb, 0x3d, 0x3b, 0xfb,
+ 0x1, 0xfb, 0x12, 0x6d, 0x1f, 0xe, 0x53, 0xa,
+ 0xf7, 0x9f, 0xf8, 0xe5, 0x56, 0xa, 0x6d, 0xa,
+ 0xfb, 0x1, 0x6, 0xe, 0xf7, 0xb2, 0xbc, 0x76,
+ 0xf8, 0x60, 0x77, 0x1, 0xf7, 0x16, 0xf8, 0x71,
+ 0x3, 0xf7, 0xc, 0x96, 0x15, 0xf8, 0x71, 0xf7,
+ 0x5c, 0x5, 0xde, 0x7, 0xfc, 0x71, 0xf7, 0x5d,
+ 0x5, 0x34, 0x7, 0xf8, 0x0, 0xfb, 0x2f, 0xfc,
+ 0x0, 0xfb, 0x2f, 0x5, 0xe, 0x49, 0xa, 0xf8,
+ 0x2c, 0xf7, 0x17, 0x15, 0xc6, 0x6, 0x45, 0xf7,
+ 0x64, 0xf7, 0x31, 0xf7, 0x5d, 0x5, 0x4a, 0x6,
+ 0xfb, 0x3f, 0xfb, 0x5d, 0x5, 0x39, 0xfb, 0x64,
+ 0x15, 0xc7, 0x6, 0x45, 0xf7, 0x64, 0xf7, 0x30,
+ 0xf7, 0x5d, 0x5, 0x4b, 0x6, 0xfb, 0x40, 0xfb,
+ 0x5d, 0x5, 0xe, 0x49, 0xa, 0xf7, 0xc, 0xf7,
+ 0x17, 0x15, 0xcc, 0x6, 0xf7, 0x3f, 0xf7, 0x5d,
+ 0x31, 0xf7, 0x64, 0x5, 0x51, 0x6, 0xd0, 0xfb,
+ 0x64, 0x5, 0x9a, 0xfb, 0x5d, 0x15, 0xcb, 0x6,
+ 0xf7, 0x40, 0xf7, 0x5d, 0x31, 0xf7, 0x64, 0x5,
+ 0x50, 0x6, 0xd0, 0xfb, 0x64, 0x5, 0xe, 0xbf,
+ 0x49, 0xa, 0xf7, 0x75, 0xf7, 0x17, 0x15, 0xc0,
+ 0x6, 0x4c, 0xf7, 0x60, 0xf7, 0x22, 0xf7, 0x61,
+ 0x5, 0x51, 0x6, 0xfb, 0x2f, 0xfb, 0x61, 0x5,
+ 0xe, 0xae, 0xf7, 0x2b, 0x76, 0xf8, 0x29, 0x77,
+ 0x1, 0xf7, 0x9, 0xf7, 0x16, 0x15, 0xc5, 0x6,
+ 0xf7, 0x2f, 0xf7, 0x55, 0x39, 0xf7, 0x68, 0x5,
+ 0x57, 0x6, 0xc8, 0xfb, 0x68, 0x5, 0xe, 0xa0,
+ 0x76, 0xf8, 0x5f, 0xd3, 0xf7, 0x4f, 0x77, 0x1,
+ 0xcc, 0x16, 0xe7, 0x6, 0xba, 0xf7, 0x73, 0x94,
+ 0xb5, 0x9c, 0xd6, 0xad, 0xb8, 0x19, 0xb4, 0xac,
+ 0xc0, 0xac, 0xcc, 0x1b, 0xeb, 0x71, 0x2f, 0x4f,
+ 0x7d, 0x1f, 0x47, 0xfb, 0xc7, 0x5, 0xe7, 0x6,
+ 0xcd, 0xf7, 0xc7, 0x5, 0x91, 0xac, 0x91, 0xaf,
+ 0xad, 0x1a, 0xcc, 0x6c, 0xc3, 0x22, 0x34, 0x4f,
+ 0x56, 0x69, 0x65, 0x1e, 0xc5, 0xf7, 0xa6, 0x3e,
+ 0xa, 0x53, 0xa, 0xf7, 0x31, 0xf8, 0xe5, 0x4f,
+ 0xa, 0xdd, 0xfb, 0x21, 0x4f, 0xa, 0xe, 0xae,
+ 0xf7, 0x7c, 0xe5, 0x1, 0xe8, 0xf7, 0x9c, 0x3,
+ 0xe8, 0xf7, 0x7c, 0x15, 0xf7, 0x8b, 0x6, 0x9c,
+ 0xe5, 0x5, 0xfb, 0x8b, 0x6, 0xe, 0x3f, 0xa0,
+ 0x76, 0xf8, 0x99, 0x77, 0xf7, 0xe, 0xee, 0x1,
+ 0xce, 0x16, 0xe4, 0x6, 0xf7, 0x2, 0xf8, 0x99,
+ 0x3f, 0xa, 0xa0, 0xf1, 0x15, 0xe5, 0x6, 0xa0,
+ 0xee, 0x3e, 0xa, 0x52, 0xa, 0xf7, 0x77, 0x77,
+ 0x1, 0xf7, 0x45, 0xf8, 0xe8, 0x6e, 0xa, 0xf7,
+ 0x34, 0xf7, 0x1e, 0x5, 0xfb, 0x1e, 0x6, 0xfb,
+ 0x57, 0xfd, 0x72, 0x15, 0x38, 0xa, 0xe, 0x52,
+ 0xa, 0xe4, 0xf7, 0x1e, 0x1, 0xf7, 0x2, 0xf8,
+ 0xe8, 0x15, 0xea, 0x6, 0xdf, 0xe4, 0xb3, 0x32,
+ 0x5, 0xdd, 0x6, 0x4b, 0xf7, 0x1e, 0x5, 0x26,
+ 0x6, 0xfb, 0x2b, 0xfd, 0x72, 0x15, 0x38, 0xa,
+ 0xe, 0x5c, 0xa, 0xf8, 0xf1, 0xf0, 0x1, 0xf7,
+ 0xc4, 0xf8, 0xf1, 0x6e, 0xa, 0xa0, 0xf0, 0x45,
+ 0xa, 0xfb, 0x5c, 0x26, 0x6e, 0xa, 0xa0, 0xf0,
+ 0x45, 0xa, 0x58, 0xfd, 0x56, 0x15, 0x38, 0xa,
+ 0xe, 0x52, 0xa, 0xf7, 0x77, 0x77, 0x1, 0xea,
+ 0x16, 0x38, 0xa, 0xb8, 0xd0, 0x15, 0xcd, 0x6,
+ 0x54, 0xf7, 0x1e, 0x5, 0x25, 0x6, 0xe, 0x3f,
+ 0xfb, 0x51, 0x76, 0xf9, 0x6b, 0x77, 0xf7, 0xe,
+ 0xee, 0x1, 0x5d, 0xfb, 0xd, 0x15, 0x7d, 0x3f,
+ 0x5, 0x7e, 0xba, 0xa5, 0x8b, 0x92, 0x1b, 0xe7,
+ 0xab, 0xf7, 0x10, 0xdf, 0x9c, 0x1f, 0xf7, 0x0,
+ 0xf8, 0x9b, 0x5, 0x36, 0x6, 0x24, 0xfc, 0x9b,
+ 0x72, 0xfb, 0x11, 0x78, 0x7a, 0x38, 0xa2, 0x19,
+ 0xf7, 0x8d, 0xf9, 0x78, 0x15, 0xe0, 0x6, 0x9f,
+ 0xee, 0x5, 0x36, 0x6, 0xe, 0xf7, 0x5e, 0x2d,
+ 0xa, 0xce, 0x16, 0xe5, 0x6, 0xb1, 0xf7, 0x42,
+ 0xf7, 0x2, 0xe9, 0xf4, 0xfb, 0xa0, 0x5, 0xef,
+ 0x6, 0xfb, 0x1e, 0xf7, 0xdb, 0xf7, 0x78, 0xf7,
+ 0x57, 0x5, 0xfb, 0xc, 0x6, 0xfb, 0x9a, 0xfb,
+ 0x8c, 0x89, 0x8d, 0xea, 0xf8, 0x4e, 0x3e, 0xa,
+ 0x3f, 0x2d, 0xa, 0xce, 0x16, 0xe5, 0x6, 0xf7,
+ 0x2b, 0xf9, 0x62, 0x5, 0x32, 0x6, 0xe, 0xf7,
+ 0xb2, 0xab, 0x76, 0xf8, 0x78, 0x77, 0x1, 0xe9,
+ 0xf7, 0x68, 0x15, 0xf8, 0x71, 0xfb, 0x5d, 0x5,
+ 0xe2, 0x7, 0xfc, 0x0, 0xf7, 0x2f, 0xf8, 0x0,
+ 0xf7, 0x2f, 0x5, 0xe2, 0x7, 0xfc, 0x71, 0xfb,
+ 0x5d, 0x5, 0xe, 0xf7, 0xb2, 0xf7, 0x15, 0x76,
+ 0xf7, 0x60, 0xd9, 0x1, 0xf5, 0xf7, 0xcc, 0x15,
+ 0xf8, 0x3b, 0x6, 0x5b, 0xfb, 0x60, 0x5, 0xdd,
+ 0x6, 0xcc, 0xf7, 0xae, 0x5, 0xfc, 0x8d, 0x6,
+ 0xe, 0x3f, 0x2d, 0xa, 0xc0, 0x16, 0xf1, 0x6,
+ 0xe0, 0xf7, 0xfb, 0xe4, 0xb4, 0x9d, 0xd8, 0x32,
+ 0x61, 0xcf, 0xf7, 0xaf, 0x5, 0x26, 0x6, 0x3b,
+ 0xfb, 0xe4, 0x34, 0x64, 0x7a, 0x3e, 0xe0, 0xb3,
+ 0x5, 0xe, 0xf8, 0xab, 0x60, 0xa, 0x13, 0xc0,
+ 0xcc, 0x16, 0xe5, 0x6, 0xbf, 0xf7, 0x8d, 0x5,
+ 0xe1, 0x9e, 0xbc, 0xf7, 0x16, 0xf7, 0xe, 0x1b,
+ 0xd2, 0x83, 0x42, 0x56, 0x7f, 0x1f, 0x41, 0xfb,
+ 0xe7, 0x5, 0xe4, 0x6, 0xc1, 0xf7, 0x94, 0x5,
+ 0xc9, 0x98, 0xb6, 0xf7, 0x27, 0xf7, 0x16, 0x1b,
+ 0xca, 0x91, 0x52, 0x46, 0x7d, 0x1f, 0x41, 0xfb,
+ 0xe7, 0x5, 0xe4, 0x6, 0xd3, 0xf7, 0xe7, 0x5,
+ 0x90, 0xa3, 0x8d, 0xa0, 0x9f, 0x1a, 0x13, 0xa0,
+ 0xdb, 0x5d, 0xc1, 0x38, 0x6c, 0x42, 0x83, 0x31,
+ 0x42, 0x1e, 0xdf, 0x78, 0x49, 0x99, 0x62, 0x1b,
+ 0x37, 0x59, 0x55, 0x61, 0x63, 0x1f, 0x13, 0xc0,
+ 0x9d, 0xdf, 0x5, 0x32, 0x6, 0xe, 0xae, 0xf9,
+ 0x7, 0xc4, 0x1, 0xf7, 0x23, 0xf9, 0x7, 0x15,
+ 0xf7, 0xca, 0x6, 0x9a, 0xc4, 0x5, 0xfb, 0xcb,
+ 0x6, 0xe, 0xf7, 0xb2, 0xf7, 0x6c, 0xd4, 0x1,
+ 0xe0, 0xf7, 0x6c, 0x15, 0xf8, 0x6e, 0x6, 0xba,
+ 0xd4, 0x5, 0xfc, 0x6e, 0x6, 0xe, 0xfb, 0x4e,
+ 0x76, 0xf7, 0x5f, 0xcb, 0x54, 0x76, 0xf8, 0xaf,
+ 0x77, 0x12, 0x13, 0xb0, 0xf7, 0x39, 0xb9, 0x15,
+ 0x76, 0x9d, 0xac, 0x62, 0xce, 0x1b, 0xcc, 0xb5,
+ 0xac, 0xa0, 0xa2, 0x1f, 0x8d, 0x89, 0x5, 0x13,
+ 0xd0, 0x83, 0x63, 0x5, 0xde, 0x6, 0xf7, 0x2,
+ 0xf8, 0xa3, 0x5, 0x32, 0x6, 0x4f, 0xfb, 0xae,
+ 0x5, 0x37, 0x78, 0x68, 0x2a, 0x23, 0x1b, 0xfb,
+ 0x0, 0x8d, 0xe3, 0xe8, 0xa0, 0x1f, 0x8c, 0x91,
+ 0x90, 0xa4, 0xc0, 0xf7, 0x8f, 0x8, 0x31, 0x6,
+ 0xfb, 0x2d, 0xfd, 0x6e, 0x5, 0xe2, 0x6, 0xe,
+ 0xf7, 0xb2, 0xa0, 0x76, 0xf8, 0x8e, 0x77, 0x1,
+ 0xbd, 0xd2, 0x15, 0xc2, 0x44, 0xf7, 0x81, 0xf7,
+ 0x52, 0xf7, 0x22, 0xfb, 0x52, 0xd8, 0xce, 0xfb,
+ 0x22, 0xf7, 0x51, 0xf7, 0x73, 0xf7, 0x47, 0x55,
+ 0xd1, 0xfb, 0x74, 0xfb, 0x46, 0xfb, 0x23, 0xf7,
+ 0x47, 0x3e, 0x4e, 0xf7, 0x23, 0xfb, 0x48, 0x5,
+ 0xe, 0x60, 0xa, 0x13, 0xa0, 0xcc, 0x16, 0xe7,
+ 0x6, 0xbf, 0xf7, 0x89, 0x5, 0xd5, 0x9a, 0xc6,
+ 0xf7, 0x26, 0xf7, 0x18, 0x1b, 0xd9, 0x8b, 0x3d,
+ 0x47, 0x7b, 0x1f, 0x43, 0xfb, 0xd3, 0x5, 0xe7,
+ 0x6, 0xcf, 0xf7, 0xd3, 0x5, 0x90, 0xa1, 0x8e,
+ 0xa0, 0x9e, 0x1a, 0xe4, 0x5e, 0xcf, 0x31, 0x2e,
+ 0x44, 0x44, 0x6a, 0x6c, 0x1e, 0x89, 0x8d, 0x5,
+ 0x13, 0xc0, 0x9f, 0xe5, 0x5, 0x38, 0x6, 0xe,
+ 0x78, 0xd4, 0x42, 0xf7, 0x47, 0xf8, 0x6e, 0xd0,
+ 0x1, 0xf7, 0x9, 0xe6, 0xf7, 0xa9, 0xec, 0x3,
+ 0xdd, 0xf7, 0x30, 0x15, 0x35, 0x93, 0xbc, 0x32,
+ 0xf7, 0x17, 0x1b, 0xf7, 0x97, 0xdb, 0xf7, 0xf3,
+ 0xf7, 0x24, 0xf7, 0x4e, 0xfb, 0x12, 0xb4, 0x26,
+ 0xfb, 0x30, 0xfb, 0x1, 0xfb, 0x1a, 0xfb, 0x25,
+ 0xfb, 0x1b, 0xeb, 0x48, 0xf7, 0x0, 0xd9, 0xc2,
+ 0xb3, 0x9f, 0xa3, 0x1f, 0x8d, 0x89, 0x5, 0x69,
+ 0x82, 0x4c, 0xfb, 0x54, 0xfb, 0x18, 0x1b, 0x46,
+ 0x70, 0xbc, 0xc8, 0x82, 0x1f, 0xb0, 0xf7, 0x98,
+ 0x15, 0xee, 0xdf, 0xf7, 0x3, 0xe3, 0xf4, 0xa6,
+ 0x34, 0x45, 0xfb, 0xe, 0x33, 0x4b, 0x37, 0x3d,
+ 0x55, 0xc0, 0xdb, 0x1e, 0xe, 0xa0, 0x76, 0xf9,
+ 0x21, 0xcd, 0x8e, 0x77, 0x12, 0xcc, 0xf8, 0xa3,
+ 0x13, 0xd0, 0xcc, 0x16, 0xe8, 0x6, 0xbf, 0xf7,
+ 0x88, 0x5, 0xf7, 0xf, 0xa7, 0xe3, 0xeb, 0xe8,
+ 0x1b, 0xd3, 0x90, 0x3d, 0x48, 0x7c, 0x1f, 0x42,
+ 0xfb, 0xd2, 0x5, 0xe9, 0x6, 0xcf, 0xf7, 0xd2,
+ 0x5, 0x91, 0xa5, 0x8d, 0xa4, 0xa2, 0x1a, 0xe0,
+ 0x5a, 0xc6, 0x34, 0x2d, 0x44, 0x44, 0x6b, 0x6b,
+ 0x1e, 0x89, 0x8d, 0x9f, 0xe4, 0x5, 0x37, 0x6,
+ 0xce, 0xe3, 0x15, 0xcb, 0x66, 0xa, 0xa5, 0x1b,
+ 0xa8, 0xa2, 0x80, 0x80, 0xa1, 0x1f, 0x81, 0xa0,
+ 0x9f, 0x81, 0xa3, 0x1b, 0xc8, 0xae, 0xc1, 0xc1,
+ 0x90, 0x1f, 0x4d, 0x6, 0x7d, 0x86, 0x85, 0x73,
+ 0x71, 0x1b, 0x7d, 0x75, 0x94, 0x95, 0x73, 0x1f,
+ 0x13, 0xa0, 0x96, 0x70, 0x6e, 0x96, 0x70, 0x1b,
+ 0x45, 0x79, 0x57, 0x51, 0x7b, 0x1f, 0xe, 0x8c,
+ 0x76, 0xf7, 0x69, 0xd5, 0xf7, 0x55, 0xd4, 0xf7,
+ 0x60, 0x77, 0x1, 0xf7, 0x7, 0x66, 0x15, 0xd8,
+ 0x6, 0xb7, 0xf7, 0x69, 0x5, 0xf7, 0x34, 0x6,
+ 0x5f, 0xfb, 0x69, 0x5, 0xd8, 0x6, 0xb7, 0xf7,
+ 0x69, 0x5, 0xf7, 0x32, 0xd5, 0xfb, 0x23, 0x6,
+ 0xb1, 0xf7, 0x55, 0x5, 0xf4, 0xd4, 0x31, 0x6,
+ 0xb7, 0x58, 0xa, 0xfb, 0x33, 0x6, 0xb6, 0x58,
+ 0xa, 0xfb, 0x2e, 0x42, 0xf7, 0x20, 0x6, 0x64,
+ 0xfb, 0x55, 0x5, 0x26, 0x41, 0xe2, 0x6, 0xe6,
+ 0xd5, 0x15, 0xb1, 0xf7, 0x55, 0x5, 0xf7, 0x35,
+ 0x6, 0x64, 0xfb, 0x55, 0x5, 0xe, 0x7d, 0xd1,
+ 0xf8, 0x30, 0xd1, 0x1, 0xed, 0xe5, 0xf7, 0xb6,
+ 0xe5, 0x3, 0xde, 0xf7, 0x67, 0x15, 0xfb, 0x24,
+ 0xf1, 0x3a, 0xf7, 0x6, 0xf7, 0x30, 0xf7, 0x16,
+ 0xf7, 0x1b, 0xf7, 0x5a, 0xf7, 0x1f, 0x33, 0xdb,
+ 0xfb, 0x12, 0xfb, 0x4c, 0x23, 0xfb, 0x26, 0xfb,
+ 0x49, 0x1e, 0xe5, 0x16, 0xf7, 0x5, 0xcb, 0xf7,
+ 0x24, 0xf7, 0x17, 0xe1, 0xb4, 0x48, 0x3a, 0xfb,
+ 0x5, 0x43, 0xfb, 0x2b, 0xfb, 0xf, 0x6e, 0x29,
+ 0x98, 0xf7, 0x22, 0x1e, 0xe, 0x7d, 0xd1, 0xf9,
+ 0x3a, 0x77, 0x1, 0xe8, 0xe5, 0xf7, 0xc2, 0xe5,
+ 0x3, 0xf7, 0xd3, 0xf8, 0xe7, 0x15, 0xd6, 0x6,
+ 0xf7, 0x19, 0x6f, 0xa, 0xfb, 0x7, 0x6, 0xfb,
+ 0xdd, 0x29, 0xa, 0x7d, 0xd1, 0xf8, 0xaf, 0xf7,
+ 0x1f, 0x1, 0xe8, 0xe5, 0xf7, 0xbd, 0xe5, 0x3,
+ 0xf7, 0x8c, 0xf8, 0xe7, 0x15, 0xe8, 0x6, 0xdc,
+ 0xe5, 0xb3, 0x31, 0x5, 0xdb, 0x6, 0x4d, 0x6f,
+ 0xa, 0x28, 0x6, 0xfb, 0xbe, 0x29, 0xa, 0x7d,
+ 0xd0, 0xf8, 0xba, 0xf0, 0x1, 0xe8, 0xe5, 0xf7,
+ 0xb8, 0xe5, 0x3, 0xde, 0xf7, 0x64, 0x24, 0xa,
+ 0xf7, 0xa7, 0xf8, 0x21, 0x15, 0xe9, 0x6, 0xa1,
+ 0xf0, 0x4d, 0xa, 0xfb, 0x61, 0x26, 0x15, 0xe9,
+ 0x6, 0xa0, 0xf0, 0x5, 0x2d, 0x6, 0xe, 0xf9,
+ 0x1a, 0x7c, 0xd4, 0x42, 0xf7, 0x4f, 0xcd, 0xd0,
+ 0xf7, 0x36, 0xd0, 0x1, 0xde, 0xe4, 0xf9, 0x53,
+ 0xe4, 0x3, 0xf8, 0x8b, 0xe3, 0x15, 0x40, 0xb3,
+ 0xd0, 0x6f, 0xd3, 0x1b, 0xf7, 0x11, 0xe1, 0xed,
+ 0xe0, 0xb0, 0x1f, 0x2d, 0x94, 0x5, 0x61, 0x79,
+ 0x54, 0x3e, 0x3b, 0x1b, 0xfb, 0x2, 0x7d, 0xf7,
+ 0xe, 0xc5, 0x93, 0x1f, 0xf8, 0x16, 0x6, 0x8f,
+ 0x9e, 0x90, 0xb1, 0xa4, 0x1a, 0xf7, 0x13, 0x3a,
+ 0xe6, 0xfb, 0x14, 0xfb, 0x0, 0x53, 0x52, 0x61,
+ 0x63, 0x1e, 0xee, 0x53, 0xfb, 0x0, 0x8b, 0x75,
+ 0x1b, 0xfb, 0x52, 0x2f, 0xfb, 0x43, 0xfb, 0x32,
+ 0xfb, 0x32, 0xf1, 0x4d, 0xf7, 0x0, 0xf7, 0xc,
+ 0xc8, 0xd1, 0xac, 0xa8, 0x1f, 0xfb, 0xdf, 0xf7,
+ 0x9, 0x15, 0xdd, 0xbb, 0xf7, 0x4a, 0xf7, 0x26,
+ 0xea, 0xa7, 0x32, 0x56, 0xfb, 0x1, 0x4b, 0xfb,
+ 0x38, 0xfb, 0x17, 0xfb, 0xe, 0x8b, 0xf7, 0xf,
+ 0xa7, 0x1e, 0xf8, 0x2f, 0xf1, 0x15, 0xf7, 0x17,
+ 0xb7, 0xdb, 0xaa, 0xbc, 0x1b, 0xa0, 0xf7, 0x4,
+ 0x87, 0xfb, 0x32, 0x7d, 0x1f, 0xe, 0xae, 0xfb,
+ 0x60, 0x76, 0xf7, 0x75, 0x77, 0x1, 0xb6, 0xc9,
+ 0x3, 0xda, 0x16, 0x75, 0x5d, 0x7d, 0x5a, 0x64,
+ 0x1a, 0x6e, 0x93, 0x4d, 0xdb, 0xbb, 0xb2, 0x9c,
+ 0x96, 0x9e, 0x1e, 0x97, 0xc7, 0x5, 0x7c, 0x66,
+ 0x70, 0x83, 0x74, 0x1b, 0x81, 0x5c, 0x91, 0xc1,
+ 0xae, 0xa1, 0xbd, 0x91, 0x9a, 0x1f, 0xe, 0x7d,
+ 0xd1, 0x1, 0xf2, 0xe5, 0xf7, 0xb8, 0xe5, 0x3,
+ 0xf8, 0x1c, 0xf8, 0xe7, 0x56, 0xa, 0x6f, 0xa,
+ 0xfb, 0x1, 0x6, 0xfb, 0x68, 0x29, 0xa, 0xa0,
+ 0x76, 0xf8, 0xa4, 0xf7, 0x43, 0x1, 0xf7, 0x63,
+ 0xf7, 0xc1, 0x3, 0xf7, 0xb7, 0x16, 0xdb, 0x6,
+ 0xf7, 0x1d, 0xf9, 0x53, 0x5, 0x5c, 0x6, 0x5a,
+ 0x35, 0xfb, 0x18, 0x40, 0x51, 0x72, 0x7c, 0x3d,
+ 0x18, 0xbd, 0x99, 0xdd, 0xa9, 0xbf, 0xba, 0x8d,
+ 0x89, 0x18, 0xe, 0xf8, 0xac, 0x80, 0xc4, 0x5f,
+ 0x76, 0xf7, 0xc5, 0xc3, 0xf7, 0xfc, 0x77, 0xa0,
+ 0x77, 0x12, 0xf9, 0x92, 0xd1, 0x13, 0x6c, 0xf7,
+ 0x6, 0x78, 0x15, 0xd5, 0x6, 0xf9, 0x1f, 0xf9,
+ 0x66, 0x5, 0x3a, 0x6, 0x13, 0xb4, 0xfb, 0x7d,
+ 0xfd, 0x5e, 0x15, 0xf7, 0xa7, 0x6, 0x96, 0xc4,
+ 0x5, 0xfb, 0x43, 0x6, 0x9d, 0xa2, 0xa0, 0x97,
+ 0xca, 0xb2, 0x8, 0xc1, 0xac, 0xb7, 0xa9, 0xc5,
+ 0x1a, 0xba, 0x6b, 0xc1, 0x2a, 0x3c, 0x5a, 0x6a,
+ 0x44, 0x78, 0x1e, 0xd1, 0x85, 0x5, 0xb3, 0x98,
+ 0xa4, 0x99, 0xb4, 0x1b, 0xb3, 0x9c, 0x74, 0x75,
+ 0x6b, 0x72, 0x7d, 0x5a, 0x6e, 0x1f, 0xfb, 0xf,
+ 0x44, 0x6f, 0x55, 0x7b, 0x57, 0x8, 0xfb, 0xaa,
+ 0xf7, 0xfd, 0x15, 0xd1, 0x6, 0xd4, 0xf7, 0xf4,
+ 0x5, 0x57, 0x6, 0x5d, 0x53, 0x3c, 0x6f, 0x79,
+ 0x85, 0x7e, 0x50, 0x18, 0xa8, 0x90, 0xb7, 0x96,
+ 0xb7, 0xab, 0x8, 0xe, 0x65, 0xa, 0xf8, 0xe0,
+ 0x77, 0xa0, 0x77, 0x12, 0x13, 0x68, 0xf8, 0x6a,
+ 0xc7, 0x15, 0xf7, 0x36, 0x6, 0x7e, 0x44, 0x5,
+ 0xc6, 0x6, 0x99, 0xd2, 0x5, 0xb4, 0x6, 0x13,
+ 0xa8, 0x96, 0xc1, 0x5, 0x61, 0x6, 0xb5, 0xf7,
+ 0x77, 0x5, 0x59, 0x6, 0xfb, 0x6a, 0xfb, 0x74,
+ 0x5, 0xd0, 0x88, 0x15, 0xf7, 0xb, 0xf7, 0xf,
+ 0x70, 0xfb, 0xf, 0x5, 0xfc, 0x7f, 0xfb, 0x19,
+ 0x15, 0xce, 0x6, 0xf8, 0xdd, 0xf9, 0x66, 0x5,
+ 0x42, 0x6, 0xfc, 0x74, 0xfb, 0xf5, 0x15, 0xcb,
+ 0x6, 0x13, 0x70, 0xcc, 0xf7, 0xf4, 0x5, 0x5c,
+ 0x6, 0x64, 0x55, 0x41, 0x6c, 0x7b, 0x86, 0x80,
+ 0x4f, 0x18, 0xa5, 0x91, 0xb2, 0x95, 0xb3, 0xab,
+ 0x8, 0xe, 0xae, 0xf7, 0xc2, 0x76, 0xf8, 0x3a,
+ 0x77, 0x1, 0xf7, 0x7a, 0xf7, 0xad, 0x15, 0xd1,
+ 0x6, 0xd2, 0xf8, 0x3a, 0x5, 0x58, 0x6, 0x5d,
+ 0x48, 0x3d, 0x6b, 0x79, 0x84, 0x7f, 0x43, 0x18,
+ 0xa7, 0x92, 0xb6, 0x98, 0xb8, 0xb1, 0x8, 0xe,
+ 0xd3, 0xf7, 0xd1, 0x77, 0xa7, 0x76, 0xf7, 0x4d,
+ 0xd0, 0xf7, 0x47, 0x77, 0x12, 0xef, 0xd6, 0x13,
+ 0xb8, 0xf7, 0xee, 0xf7, 0xd1, 0x15, 0xd3, 0x6,
+ 0x84, 0x97, 0x88, 0x95, 0xac, 0x1a, 0x99, 0x89,
+ 0x9d, 0xa0, 0xda, 0x1e, 0x96, 0xb4, 0x95, 0xb5,
+ 0xb2, 0x1a, 0xd6, 0x6d, 0xc4, 0xfb, 0x4, 0xfb,
+ 0xa, 0x63, 0x30, 0x69, 0x7e, 0x1e, 0xd6, 0x7d,
+ 0x5, 0xd0, 0xa6, 0xc4, 0x8c, 0x96, 0x1b, 0xad,
+ 0xb1, 0x76, 0x63, 0x81, 0x89, 0x7f, 0x86, 0x7c,
+ 0x1f, 0x6b, 0x84, 0x7b, 0x87, 0x5f, 0x8a, 0x8,
+ 0x53, 0x88, 0xfb, 0xe, 0x82, 0xfb, 0x11, 0x1a,
+ 0x13, 0x78, 0x63, 0xa4, 0x3e, 0xe7, 0xc2, 0xbc,
+ 0xab, 0x9d, 0x9d, 0x1e, 0x13, 0xb8, 0x8f, 0x74,
+ 0x8b, 0x88, 0x8e, 0x80, 0x8, 0x95, 0xf7, 0x50,
+ 0x15, 0xfb, 0x16, 0x71, 0x3a, 0x89, 0x7a, 0x1b,
+ 0x79, 0x64, 0x97, 0xb6, 0xb9, 0xbb, 0x95, 0xab,
+ 0x90, 0x1f, 0xc9, 0x90, 0x94, 0x8e, 0xa9, 0x93,
+ 0x8, 0xe, 0xce, 0xf7, 0xc4, 0xd7, 0xf7, 0xad,
+ 0xd7, 0x1, 0xef, 0xd8, 0xf7, 0x6a, 0xd8, 0x3,
+ 0xef, 0xf8, 0x84, 0x15, 0x27, 0xa9, 0x2f, 0xf7,
+ 0x18, 0xf7, 0x10, 0xdd, 0xf7, 0x22, 0xf7, 0x6,
+ 0xe7, 0x53, 0xe0, 0xfb, 0x1, 0xfb, 0x23, 0x4f,
+ 0xfb, 0x2f, 0x35, 0x1e, 0xd8, 0x8d, 0x15, 0xbe,
+ 0xb4, 0xf7, 0x4, 0xe0, 0xbe, 0xb0, 0x61, 0x50,
+ 0x3c, 0x5b, 0x26, 0x3a, 0x4e, 0x73, 0xbe, 0xce,
+ 0x1e, 0xe, 0xf7, 0xcd, 0x9b, 0xca, 0xf8, 0x2,
+ 0xca, 0x1, 0xbc, 0xd6, 0xf7, 0xf0, 0xd8, 0x3,
+ 0xb8, 0x94, 0x15, 0xb8, 0x6c, 0xc4, 0xcb, 0x5,
+ 0x80, 0x9f, 0xb5, 0x79, 0xca, 0x1b, 0xf7, 0x37,
+ 0xf7, 0xb, 0xf7, 0x13, 0xf7, 0x3d, 0xc4, 0x80,
+ 0xb9, 0x6e, 0xae, 0x1f, 0xc6, 0xcd, 0x5e, 0xab,
+ 0x51, 0x4b, 0x5, 0x93, 0x7e, 0x63, 0xa2, 0x43,
+ 0x1b, 0xfb, 0x63, 0x41, 0xfb, 0x3d, 0xfb, 0x18,
+ 0x40, 0xa2, 0x67, 0x9b, 0x71, 0x1f, 0xc5, 0xca,
+ 0x15, 0x7e, 0xa2, 0x82, 0xa2, 0xa8, 0x1a, 0xec,
+ 0xcc, 0xf7, 0x20, 0xf7, 0x1d, 0xba, 0xa2, 0x7a,
+ 0x84, 0x93, 0x1e, 0xfb, 0x72, 0xfb, 0xdc, 0x15,
+ 0xf7, 0x97, 0xf7, 0xb1, 0x5, 0x90, 0x7c, 0x9b,
+ 0x78, 0x64, 0x1a, 0x24, 0x3b, 0xfb, 0x16, 0xfb,
+ 0x11, 0x6e, 0x72, 0x93, 0x98, 0x76, 0x1e, 0xe,
+ 0x7d, 0xd0, 0xf8, 0x15, 0xcf, 0xf2, 0xf7, 0x0,
+ 0x49, 0xcd, 0x8e, 0x77, 0x12, 0xe5, 0xe8, 0xf7,
+ 0xb8, 0xe8, 0x13, 0xe6, 0xf7, 0x8b, 0xf8, 0xf7,
+ 0x15, 0xcb, 0x6, 0x13, 0xd6, 0xa4, 0x91, 0x96,
+ 0x9c, 0xa5, 0x1b, 0xad, 0xa1, 0x7d, 0x7f, 0xa3,
+ 0x1f, 0x82, 0x9d, 0x9e, 0x83, 0xa2, 0x1b, 0xc8,
+ 0xae, 0xc2, 0xc1, 0x91, 0x1f, 0x4c, 0x69, 0xa,
+ 0x70, 0x1b, 0x7c, 0x78, 0x96, 0x95, 0x73, 0x1f,
+ 0x13, 0xce, 0x96, 0x73, 0x6e, 0x95, 0x69, 0x1b,
+ 0x13, 0xe6, 0x45, 0x79, 0x57, 0x50, 0x7b, 0x1f,
+ 0xfb, 0x38, 0xfc, 0x27, 0x24, 0xa, 0xe, 0xfb,
+ 0x4e, 0x76, 0xf7, 0x53, 0xd5, 0xf8, 0x2a, 0xc9,
+ 0x4d, 0xd5, 0x12, 0xf8, 0x80, 0xe7, 0x13, 0xd8,
+ 0xf7, 0x3b, 0xdd, 0x15, 0x4b, 0xad, 0xbb, 0x69,
+ 0xd0, 0x1b, 0xf7, 0x1c, 0xf7, 0x16, 0xf7, 0x25,
+ 0xf7, 0x53, 0xf7, 0x21, 0x3c, 0xd8, 0x26, 0x45,
+ 0x5c, 0x65, 0x5d, 0x5c, 0x1f, 0x13, 0xe8, 0x9b,
+ 0xd3, 0x5, 0x35, 0x6, 0xfb, 0x30, 0xfd, 0x71,
+ 0x5, 0xe7, 0x6, 0xe5, 0xf8, 0x38, 0x15, 0xe0,
+ 0xcb, 0xf7, 0x3a, 0xf7, 0x9, 0xda, 0xaf, 0x43,
+ 0x43, 0x3e, 0x5c, 0xfb, 0x4d, 0xfb, 0x17, 0x31,
+ 0x6f, 0xda, 0xd7, 0x1e, 0xe, 0xf7, 0x83, 0xfb,
+ 0x2c, 0x76, 0xf9, 0xc0, 0xda, 0x1, 0xf7, 0xd2,
+ 0xfb, 0x41, 0x15, 0xd9, 0xf9, 0xc0, 0xf6, 0xfd,
+ 0xc0, 0xda, 0xf9, 0xc0, 0xcf, 0xda, 0xfb, 0xc0,
+ 0x6, 0xfb, 0xb, 0x22, 0x47, 0xfb, 0x19, 0x29,
+ 0xd5, 0x2d, 0xf7, 0xa, 0x1f, 0xe, 0x61, 0xa,
+ 0xf7, 0x0, 0xe2, 0x3, 0xf7, 0x4d, 0xfb, 0x63,
+ 0x15, 0xcd, 0x6, 0x68, 0xf7, 0x0, 0x76, 0xf7,
+ 0x6, 0xf7, 0x5, 0x1a, 0xf7, 0xda, 0xf7, 0x74,
+ 0xf7, 0x85, 0xae, 0xb1, 0x1e, 0x46, 0x6, 0xfb,
+ 0x0, 0xfb, 0x12, 0xfb, 0x3d, 0xfb, 0x4b, 0xfb,
+ 0xbc, 0x1a, 0xfb, 0x5, 0xa6, 0xfb, 0x5, 0xbd,
+ 0xfb, 0x1, 0x1e, 0xe, 0x61, 0xa, 0xf7, 0x8e,
+ 0xe2, 0x3, 0x82, 0xfb, 0x63, 0x15, 0xd0, 0x6,
+ 0xf7, 0x0, 0xf7, 0x12, 0xf7, 0x3d, 0xf7, 0x42,
+ 0xf7, 0xbc, 0x1a, 0xf7, 0x5, 0x70, 0xf7, 0xe,
+ 0x59, 0xf7, 0x1, 0x1e, 0x49, 0x6, 0xae, 0xfb,
+ 0x0, 0xa0, 0xfb, 0xf, 0xfb, 0x5, 0x1a, 0xfb,
+ 0xda, 0xfb, 0x74, 0xfb, 0x7c, 0x68, 0x65, 0x1e,
+ 0xe, 0xf8, 0xe3, 0x78, 0xc3, 0xf7, 0x89, 0xc7,
+ 0x86, 0xc4, 0xf7, 0x8a, 0xc4, 0x91, 0x77, 0x12,
+ 0xf7, 0x27, 0xd8, 0xf7, 0x3d, 0xd7, 0xee, 0xd7,
+ 0xf7, 0x3c, 0xd8, 0x13, 0xd7, 0x80, 0xf8, 0xcc,
+ 0xf7, 0x2, 0x15, 0x68, 0x8b, 0x2d, 0xf7, 0x18,
+ 0xf7, 0x4f, 0x8d, 0xf7, 0x74, 0x91, 0xf7, 0x1,
+ 0x3f, 0xa1, 0x4b, 0x1e, 0xfb, 0x18, 0x5a, 0xfb,
+ 0x3c, 0x4b, 0x1f, 0xd7, 0x16, 0xae, 0x9f, 0xf7,
+ 0x1d, 0xe3, 0x96, 0xbc, 0x84, 0x4b, 0x7c, 0x80,
+ 0xfb, 0x33, 0x28, 0x1e, 0x13, 0x37, 0x0, 0x53,
+ 0x89, 0xbe, 0xa1, 0x1f, 0xfc, 0x85, 0xf7, 0xfd,
+ 0x15, 0x13, 0xb7, 0x80, 0x68, 0x8b, 0x28, 0xf7,
+ 0x18, 0xf7, 0x4f, 0x8e, 0xf7, 0x72, 0x92, 0xf7,
+ 0x1, 0x3f, 0xa1, 0x49, 0x1e, 0x13, 0x36, 0x0,
+ 0xfb, 0x16, 0x59, 0xfb, 0x36, 0x4b, 0x1f, 0xd8,
+ 0x16, 0xad, 0x9f, 0xf7, 0x1b, 0xe2, 0x9f, 0xb5,
+ 0x7a, 0x52, 0x7d, 0x80, 0xfb, 0x32, 0x26, 0x1e,
+ 0x13, 0x8c, 0x0, 0x54, 0x89, 0xc3, 0xa0, 0x1f,
+ 0x5f, 0xfc, 0x7e, 0x15, 0xde, 0x6, 0x13, 0xcf,
+ 0x80, 0xf8, 0xe7, 0xf9, 0x66, 0x5, 0x3a, 0x6,
+ 0xe, 0x77, 0x8b, 0xf5, 0x1, 0xe2, 0x16, 0xf4,
+ 0x6, 0xa1, 0xf5, 0x5, 0x22, 0x6, 0xe, 0x77,
+ 0xf7, 0x52, 0xf7, 0x11, 0x1, 0xf7, 0x15, 0xf7,
+ 0x52, 0x15, 0xf5, 0x6, 0xa1, 0xf7, 0x11, 0x5,
+ 0x21, 0x6, 0xe, 0xf9, 0x52, 0x78, 0xc3, 0xf7,
+ 0x8c, 0xc4, 0x8b, 0xc3, 0xf7, 0x8b, 0xc3, 0x8d,
+ 0x77, 0x12, 0xe3, 0xd3, 0xf7, 0x31, 0xd3, 0x8e,
+ 0xd3, 0x13, 0xf7, 0xf7, 0x34, 0xf8, 0x6b, 0x15,
+ 0x95, 0x9a, 0xf7, 0x38, 0xe4, 0xc0, 0x8b, 0x52,
+ 0x82, 0x67, 0x75, 0xfb, 0x25, 0x39, 0x56, 0x8b,
+ 0xbd, 0xa2, 0x1e, 0x64, 0xfc, 0x7e, 0x15, 0xd4,
+ 0x6, 0x13, 0xe8, 0xf8, 0x67, 0xf9, 0x66, 0x5,
+ 0x41, 0x6, 0xfc, 0x87, 0xfb, 0x7c, 0x5b, 0xa,
+ 0xf7, 0x53, 0xb9, 0x1e, 0x13, 0xf0, 0xd5, 0x5e,
+ 0xbb, 0x3d, 0xfb, 0x1a, 0x5f, 0xfb, 0x26, 0x37,
+ 0x1e, 0xf7, 0xc4, 0xfb, 0xfd, 0x5b, 0xa, 0xf7,
+ 0x51, 0xb9, 0xd6, 0x5e, 0xbb, 0x3d, 0xfb, 0x1a,
+ 0x5f, 0xfb, 0x25, 0x37, 0x1e, 0xd3, 0x16, 0x96,
+ 0x9a, 0xf7, 0x35, 0xe4, 0xc0, 0x8b, 0x53, 0x81,
+ 0x68, 0x75, 0xfb, 0x24, 0x39, 0x1e, 0x13, 0x81,
+ 0x56, 0x8b, 0xbd, 0xa2, 0x1f, 0xf7, 0x9d, 0x16,
+ 0x74, 0x8b, 0x21, 0xf7, 0x10, 0x1e, 0x13, 0x0,
+ 0xf7, 0x2e, 0xa1, 0xf7, 0x53, 0xb7, 0xd7, 0x5d,
+ 0xba, 0x3f, 0x1f, 0x13, 0x80, 0xfb, 0xe, 0x53,
+ 0xfb, 0x2b, 0x3d, 0x1f, 0xd3, 0x16, 0x96, 0x9a,
+ 0xf7, 0x35, 0xe4, 0xbf, 0x8b, 0x53, 0x81, 0x68,
+ 0x75, 0xfb, 0x24, 0x3a, 0x1e, 0x13, 0x0, 0x56,
+ 0x8b, 0xbd, 0xa2, 0x1f, 0xe, 0xf7, 0xb2, 0xf7,
+ 0x64, 0xe2, 0x1, 0xf7, 0xc0, 0xe6, 0x3, 0xe0,
+ 0xf7, 0x64, 0x15, 0xf7, 0x6b, 0xfb, 0x64, 0xe6,
+ 0xf7, 0x64, 0xf7, 0x6b, 0xe2, 0xfb, 0x6b, 0xf7,
+ 0x66, 0x30, 0xfb, 0x66, 0xfb, 0x6b, 0x6, 0xe,
+ 0xf7, 0xb2, 0x8b, 0xcf, 0xf7, 0x64, 0xcf, 0xf7,
+ 0x36, 0x77, 0x1, 0xf7, 0xa0, 0xf7, 0x6, 0x15,
+ 0xdd, 0x6, 0xbf, 0xf7, 0x36, 0x5, 0xf7, 0x55,
+ 0x6, 0xa2, 0xcf, 0x5, 0xfb, 0x55, 0x6, 0xbf,
+ 0xf7, 0x36, 0x5, 0x3a, 0x6, 0x57, 0xfb, 0x36,
+ 0x5, 0xfb, 0x56, 0x6, 0x75, 0x47, 0x5, 0xf7,
+ 0x55, 0x6, 0xfb, 0xae, 0xfb, 0xa8, 0x15, 0xf8,
+ 0x67, 0x6, 0xa1, 0xcf, 0x5, 0xfc, 0x66, 0x6,
+ 0xe, 0xfb, 0x4e, 0x76, 0xf7, 0x53, 0xd4, 0xf8,
+ 0x2c, 0xd4, 0x7f, 0x77, 0x12, 0xdf, 0xe7, 0x13,
+ 0xd8, 0xf8, 0x31, 0xc1, 0x15, 0x52, 0xfb, 0x99,
+ 0x5, 0xe8, 0x6, 0xf7, 0x30, 0xf9, 0x71, 0x5,
+ 0x3b, 0x6, 0x77, 0x2a, 0x5, 0x13, 0xe8, 0xf5,
+ 0x5b, 0x37, 0x8e, 0x74, 0x1b, 0xfb, 0x26, 0xfb,
+ 0xc, 0xfb, 0x1d, 0xfb, 0x52, 0xfb, 0x3c, 0xf4,
+ 0x50, 0xd4, 0xb3, 0xba, 0x99, 0xc3, 0xcb, 0x1f,
+ 0xfb, 0x81, 0xf7, 0x31, 0x15, 0xd1, 0xb7, 0xf7,
+ 0x4c, 0xf7, 0x16, 0xd2, 0xbd, 0x4f, 0x3c, 0xfb,
+ 0x4, 0x44, 0xfb, 0x31, 0xfb, 0x3, 0x43, 0x62,
+ 0xc1, 0xef, 0x1e, 0xe, 0x8b, 0xef, 0xf8, 0xbf,
+ 0xd3, 0x1, 0xf7, 0x86, 0xf3, 0x3, 0xf7, 0x89,
+ 0xf7, 0x47, 0x15, 0xe1, 0x6, 0x96, 0xc7, 0x95,
+ 0xa4, 0xea, 0xd4, 0x8, 0xe7, 0xd3, 0xd2, 0xc1,
+ 0xe5, 0x1a, 0xeb, 0x35, 0xd9, 0xfb, 0x14, 0xfb,
+ 0x28, 0x34, 0xfb, 0x9, 0x31, 0x1e, 0xe8, 0x7c,
+ 0x5, 0xb0, 0x90, 0x9a, 0xf7, 0x5, 0xf7, 0x10,
+ 0x1b, 0xd1, 0xbe, 0x5a, 0x56, 0x4c, 0x49, 0x5c,
+ 0x56, 0x61, 0x1f, 0x39, 0x4b, 0x4f, 0x5b, 0x7e,
+ 0xfb, 0x2, 0x8, 0x5d, 0xfb, 0x47, 0x15, 0xf3,
+ 0x6, 0xa1, 0xef, 0x5, 0x23, 0x6, 0xe, 0xf7,
+ 0xcd, 0xfb, 0x5d, 0xd3, 0xf8, 0x73, 0x77, 0xee,
+ 0xeb, 0x1, 0xe0, 0xe8, 0x3, 0xf8, 0x56, 0xa2,
+ 0x15, 0x86, 0x66, 0x61, 0xfb, 0x6, 0x24, 0x8a,
+ 0x8, 0x44, 0x8a, 0x58, 0xb8, 0xc0, 0x1a, 0xcb,
+ 0xcd, 0xc0, 0xc0, 0xb5, 0x1e, 0xde, 0xcb, 0xc8,
+ 0xbb, 0x98, 0xf7, 0x3, 0x8, 0x34, 0x6, 0x80,
+ 0x4e, 0x81, 0x72, 0x2b, 0x42, 0x8, 0x2e, 0x43,
+ 0x43, 0x4f, 0x30, 0x1a, 0x2b, 0xe2, 0x42, 0xf7,
+ 0x16, 0xf7, 0xd, 0xf7, 0x3, 0xf5, 0xf2, 0x1e,
+ 0xfb, 0x35, 0xf8, 0x39, 0x15, 0xf4, 0x6, 0xa1,
+ 0xeb, 0x5, 0x22, 0x6, 0xe, 0xc4, 0xf8, 0x78,
+ 0x44, 0xa, 0xf7, 0x3c, 0xf7, 0xa2, 0x3, 0xf7,
+ 0xd5, 0xf8, 0x63, 0x15, 0xbc, 0x6, 0xb8, 0xf7,
+ 0x1f, 0xa2, 0xf7, 0x8, 0x3f, 0xa, 0x74, 0xfb,
+ 0x8, 0x5, 0xfb, 0x31, 0xfb, 0x1f, 0x15, 0xbc,
+ 0x6, 0xb9, 0xf7, 0x1f, 0xa1, 0xf7, 0x8, 0x3f,
+ 0xa, 0x75, 0xfb, 0x8, 0x5, 0xe, 0xae, 0xfb,
+ 0x14, 0x76, 0xf7, 0x2a, 0xf4, 0x1, 0xa4, 0x8c,
+ 0x15, 0x37, 0xa, 0x83, 0x62, 0x18, 0x67, 0xa,
+ 0x93, 0xb0, 0x9d, 0xe6, 0x18, 0x22, 0x6, 0xf7,
+ 0x24, 0x22, 0x15, 0x62, 0xa, 0x83, 0x62, 0x18,
+ 0xf6, 0x3c, 0xa, 0x22, 0x6, 0xe, 0xae, 0xf8,
+ 0x6a, 0xf4, 0xf7, 0x2a, 0x77, 0x1, 0xf7, 0x1e,
+ 0xf4, 0x3, 0xf7, 0xc3, 0xf8, 0x6a, 0x33, 0xa,
+ 0xfb, 0x4c, 0x30, 0x33, 0xa, 0xe, 0xae, 0xf8,
+ 0x78, 0x76, 0xf7, 0x2a, 0xf4, 0x1, 0xf7, 0x10,
+ 0xf8, 0x63, 0x15, 0x67, 0xa, 0x93, 0xb0, 0x9d,
+ 0xe6, 0x18, 0x22, 0x6, 0x75, 0x22, 0x5, 0x37,
+ 0xa, 0x8, 0xf7, 0x32, 0x62, 0x15, 0xf6, 0x3c,
+ 0xa, 0x22, 0x6, 0x75, 0x22, 0x5, 0x62, 0xa,
+ 0x8, 0xe, 0x3f, 0xf8, 0x7f, 0x44, 0xa, 0xf7,
+ 0x39, 0xf8, 0x6a, 0x3b, 0xa, 0xea, 0xb7, 0x95,
+ 0x41, 0xa, 0xfb, 0x4, 0x84, 0x66, 0x8, 0xe,
+ 0x3f, 0xf8, 0x78, 0x44, 0xa, 0xf7, 0x2b, 0xf8,
+ 0x63, 0x15, 0xf7, 0x0, 0x3c, 0xa, 0x21, 0x6,
+ 0x75, 0x22, 0x5, 0x37, 0xa, 0x8, 0xe, 0x3f,
+ 0xfb, 0x14, 0x44, 0xa, 0xbf, 0x8c, 0x15, 0x37,
+ 0xa, 0x83, 0x62, 0x18, 0xf7, 0x0, 0x99, 0xa3,
+ 0xf7, 0x5, 0x93, 0xb0, 0x9e, 0xe6, 0x18, 0x21,
+ 0x6, 0xe, 0x20, 0xf8, 0x78, 0x44, 0xa, 0xf7,
+ 0x31, 0xf8, 0x63, 0x15, 0xc1, 0x6, 0xbc, 0xf7,
+ 0x1f, 0xa4, 0xf7, 0x8, 0x57, 0xa, 0x72, 0xfb,
+ 0x8, 0x5, 0xe, 0xae, 0xa0, 0x76, 0xf8, 0x59,
+ 0xd4, 0x42, 0xe0, 0x12, 0x13, 0xa0, 0xd8, 0x16,
+ 0xdb, 0x6, 0xb5, 0xf7, 0x67, 0x5, 0xf7, 0x3,
+ 0xa1, 0xc0, 0xf7, 0x17, 0xe4, 0x1b, 0x9c, 0x9b,
+ 0x86, 0x7e, 0x9a, 0x1f, 0xae, 0xdf, 0x5, 0x96,
+ 0x76, 0x78, 0x93, 0x74, 0x1b, 0x41, 0x56, 0x37,
+ 0x68, 0x77, 0x1f, 0x13, 0xc0, 0x9e, 0xf6, 0x5,
+ 0x41, 0x6, 0xe, 0xf8, 0x4b, 0x78, 0xca, 0xf7,
+ 0xab, 0xc3, 0xf7, 0xe, 0xc2, 0xf7, 0xa, 0xca,
+ 0x1, 0xc1, 0xcc, 0xf9, 0x21, 0xcc, 0x3, 0xf7,
+ 0x93, 0xf7, 0x2a, 0x15, 0xd0, 0x6, 0xad, 0xf7,
+ 0x41, 0x5, 0xb3, 0x6, 0xc1, 0x9c, 0x76, 0x33,
+ 0xad, 0x1f, 0xa3, 0x4b, 0x5, 0xde, 0x6, 0x68,
+ 0xda, 0x65, 0xdc, 0x7a, 0x98, 0x73, 0x93, 0x19,
+ 0x8c, 0x8d, 0xe3, 0x90, 0xb8, 0xc4, 0x94, 0xb9,
+ 0x19, 0xec, 0x9d, 0x2d, 0x9d, 0x3a, 0x1b, 0xfb,
+ 0x27, 0x6, 0xad, 0xfb, 0x45, 0x15, 0xa4, 0xf7,
+ 0xe, 0x5, 0xd9, 0x6, 0xb4, 0xcd, 0x8b, 0x4f,
+ 0x7f, 0x1f, 0x4d, 0x7e, 0x45, 0x8b, 0x6b, 0x1b,
+ 0xfc, 0x22, 0x78, 0x15, 0xfb, 0x66, 0xf7, 0x44,
+ 0xfb, 0x3d, 0xf7, 0x6c, 0xf7, 0x6d, 0xf7, 0x42,
+ 0xf7, 0x3e, 0xf7, 0x65, 0xf7, 0x65, 0xfb, 0x45,
+ 0xf7, 0x3c, 0xfb, 0x6a, 0xfb, 0x6a, 0xfb, 0x46,
+ 0xfb, 0x3b, 0xfb, 0x66, 0x1e, 0xcc, 0x16, 0xf7,
+ 0x42, 0xf7, 0x25, 0xf7, 0x20, 0xf7, 0x48, 0xf7,
+ 0x4a, 0xf7, 0x26, 0xfb, 0x20, 0xfb, 0x42, 0xfb,
+ 0x43, 0xfb, 0x26, 0xfb, 0x21, 0xfb, 0x4a, 0xfb,
+ 0x48, 0xfb, 0x25, 0xf7, 0x21, 0xf7, 0x43, 0x1e,
+ 0xe, 0xae, 0xf8, 0xd0, 0xb1, 0xf7, 0x0, 0xb1,
+ 0x1, 0xf7, 0x6a, 0xb2, 0xf7, 0x2, 0xb2, 0x3,
+ 0xf7, 0x6a, 0xf9, 0x2d, 0x15, 0x57, 0xb6, 0x62,
+ 0xbe, 0xbe, 0xb6, 0xb4, 0xbf, 0xbe, 0x61, 0xb3,
+ 0x57, 0x57, 0x61, 0x63, 0x58, 0x1e, 0xb2, 0x89,
+ 0x15, 0xaa, 0xa3, 0xa3, 0xaa, 0xaa, 0xa3, 0x74,
+ 0x6b, 0x6d, 0x73, 0x74, 0x6c, 0x6d, 0x72, 0xa2,
+ 0xa9, 0x1e, 0xe, 0xf7, 0x5e, 0x7c, 0xd0, 0xf8,
+ 0x33, 0xd0, 0x12, 0xf7, 0x1d, 0xde, 0xf7, 0x49,
+ 0xe6, 0x57, 0xe4, 0x13, 0xf0, 0xca, 0xf7, 0x46,
+ 0x15, 0xfb, 0x49, 0xf7, 0x39, 0x7f, 0xbd, 0xf7,
+ 0x27, 0xce, 0xd4, 0xd8, 0xeb, 0x3f, 0xb7, 0x2a,
+ 0xb5, 0x1e, 0x49, 0xa7, 0x6a, 0x94, 0xb5, 0x1a,
+ 0xaa, 0xac, 0xb5, 0xcc, 0x1e, 0x13, 0xe8, 0x9b,
+ 0xf5, 0x81, 0x2e, 0x1f, 0xe4, 0x90, 0x5, 0xf7,
+ 0x1c, 0xfb, 0x14, 0xaa, 0x3e, 0xfb, 0x1f, 0x5b,
+ 0x3c, 0x4c, 0x34, 0xcd, 0x66, 0xe5, 0x63, 0x1e,
+ 0x13, 0xf0, 0xca, 0x6f, 0xb8, 0x75, 0x5c, 0x1a,
+ 0x58, 0x56, 0x6d, 0x4a, 0xfb, 0x14, 0x89, 0xf0,
+ 0xa8, 0x1e, 0xe, 0xf7, 0x5e, 0x7c, 0xd1, 0xf8,
+ 0x36, 0xd1, 0x12, 0xf7, 0x20, 0xe2, 0x9f, 0xde,
+ 0xe2, 0xe9, 0x55, 0xe8, 0x13, 0xf8, 0xca, 0xf7,
+ 0x47, 0x15, 0xfb, 0x4b, 0xf7, 0x40, 0x80, 0xbf,
+ 0xf7, 0x2e, 0xd1, 0xd6, 0xd7, 0xec, 0x3b, 0xb6,
+ 0x27, 0xb6, 0x1e, 0x46, 0xa8, 0x68, 0x8a, 0xb5,
+ 0x1a, 0xaa, 0xae, 0xc0, 0xcf, 0x1e, 0x13, 0xf4,
+ 0x9b, 0xf7, 0x3, 0x8f, 0xfb, 0x0, 0x1f, 0xe8,
+ 0x90, 0x5, 0xf7, 0x1e, 0xfb, 0x19, 0xaa, 0x3a,
+ 0xfb, 0x27, 0x5a, 0x31, 0x4b, 0x34, 0xd0, 0x6f,
+ 0xe9, 0x63, 0x1e, 0x13, 0xf8, 0xce, 0x6e, 0xba,
+ 0x77, 0x5a, 0x1a, 0x58, 0x52, 0x6d, 0x48, 0xfb,
+ 0x19, 0x88, 0xf1, 0xa8, 0x1e, 0xf7, 0x2f, 0xf8,
+ 0x2d, 0x15, 0xf1, 0x6, 0xf7, 0x1e, 0xf7, 0x1f,
+ 0x50, 0xa, 0x36, 0x31, 0x62, 0xe5, 0x5, 0x38,
+ 0x6, 0xe, 0xfb, 0x53, 0xce, 0xf9, 0xaa, 0xd2,
+ 0x1, 0xd7, 0x71, 0x15, 0xfb, 0xb, 0xa4, 0xe7,
+ 0x5d, 0xe8, 0x1b, 0xf7, 0xb, 0xd0, 0xdc, 0xd9,
+ 0xae, 0x7d, 0xae, 0x6a, 0xb1, 0x1f, 0xed, 0xbb,
+ 0xad, 0xbe, 0xc2, 0x1a, 0xc9, 0x68, 0xba, 0x29,
+ 0xdb, 0x1e, 0x3b, 0xcd, 0x5a, 0xb4, 0xc2, 0x1a,
+ 0xb9, 0xb3, 0xb2, 0xc5, 0x9d, 0xe0, 0x88, 0x27,
+ 0x1e, 0xe1, 0x96, 0x5, 0xbd, 0x83, 0x7a, 0xf7,
+ 0x5, 0xfb, 0x34, 0x1b, 0xfb, 0xd, 0x4e, 0x40,
+ 0x38, 0x66, 0x99, 0x69, 0xa2, 0x70, 0x1f, 0x53,
+ 0x6f, 0x3c, 0x5f, 0x29, 0x1a, 0x41, 0xbc, 0x63,
+ 0xc8, 0x57, 0x1e, 0xf7, 0x1f, 0xfb, 0x7, 0xa3,
+ 0x7a, 0x5e, 0x1a, 0x5d, 0x5f, 0x5d, 0x4d, 0x73,
+ 0x39, 0x90, 0xf7, 0x5, 0x73, 0x1e, 0xf7, 0x78,
+ 0xf7, 0x14, 0x15, 0x75, 0xa0, 0x5f, 0xae, 0x64,
+ 0xaa, 0x8, 0x55, 0xb7, 0x6e, 0x9d, 0xb3, 0x1a,
+ 0xcb, 0xcd, 0xbb, 0xa5, 0x9a, 0x1e, 0xac, 0x67,
+ 0xbd, 0x5f, 0xbf, 0x60, 0x8, 0xb6, 0x66, 0x98,
+ 0x79, 0x6d, 0x1a, 0x73, 0x7c, 0x5d, 0x3b, 0x65,
+ 0x1e, 0xe, 0x77, 0xfb, 0x12, 0x76, 0xf7, 0x3b,
+ 0x76, 0xf8, 0x39, 0xeb, 0x1, 0xc3, 0xf7, 0x89,
+ 0x3, 0xe2, 0x8a, 0x15, 0xc5, 0x6, 0x77, 0x30,
+ 0x5f, 0x7f, 0x7b, 0x87, 0x82, 0x64, 0x18, 0xf6,
+ 0x98, 0xa4, 0xf7, 0x3, 0x92, 0xae, 0x9d, 0xe2,
+ 0x18, 0x23, 0x6, 0xcd, 0xf7, 0xd5, 0x40, 0xa,
+ 0xe, 0xa0, 0x76, 0xf9, 0x9, 0xda, 0x1, 0xf7,
+ 0x3a, 0x16, 0xf1, 0x6, 0xb9, 0xf7, 0x52, 0xf7,
+ 0x1b, 0xf7, 0x94, 0xf7, 0x5d, 0xf7, 0x3b, 0x9e,
+ 0xda, 0x18, 0xfc, 0x95, 0x6, 0x78, 0x3c, 0x5,
+ 0xf8, 0x24, 0x6, 0xfb, 0x63, 0xfb, 0x51, 0xfb,
+ 0x1d, 0xfb, 0xa1, 0x70, 0xfb, 0x2f, 0x8, 0xe,
+ 0x78, 0xd0, 0xf7, 0xec, 0xd0, 0xf7, 0x44, 0xd4,
+ 0x1, 0xe6, 0xe9, 0xf7, 0xb8, 0xe5, 0x3, 0xf7,
+ 0x6f, 0xf8, 0x29, 0x15, 0xac, 0x93, 0xcb, 0xf7,
+ 0x54, 0xf7, 0x17, 0x1b, 0xd0, 0xa7, 0x58, 0x50,
+ 0x93, 0x1f, 0xe3, 0x93, 0x5, 0xe0, 0x83, 0x5a,
+ 0xe5, 0xfb, 0x16, 0x1b, 0xfb, 0x95, 0x3b, 0xfb,
+ 0xf2, 0xfb, 0x24, 0xfb, 0x4d, 0xf7, 0x11, 0x60,
+ 0xef, 0xf7, 0x30, 0xf7, 0x0, 0xf7, 0x13, 0xf7,
+ 0x25, 0xf7, 0x19, 0x2c, 0xd8, 0x20, 0x3d, 0x52,
+ 0x64, 0x78, 0x73, 0x1f, 0x69, 0xfb, 0x58, 0x15,
+ 0xf7, 0xd, 0xe5, 0xcb, 0xde, 0xd9, 0xc1, 0x4d,
+ 0x3c, 0x28, 0x37, 0x23, 0x33, 0x3e, 0x53, 0xe4,
+ 0xd1, 0x1e, 0xe, 0x77, 0x8d, 0x76, 0x1, 0x88,
+ 0xf8, 0x6d, 0x3, 0x76, 0x78, 0x15, 0xd2, 0x6,
+ 0xf8, 0x26, 0xf9, 0x88, 0x5, 0x44, 0x6, 0xe,
+ 0x77, 0xe, 0x90, 0x76, 0xf7, 0xdc, 0xd3, 0xf7,
+ 0x9c, 0xd1, 0x1, 0xf7, 0x4c, 0xe6, 0x3, 0xc6,
+ 0x7b, 0x15, 0xaf, 0xae, 0xb5, 0x95, 0xb8, 0x8a,
+ 0xb6, 0x8a, 0xb8, 0x7f, 0xb6, 0x80, 0x8, 0x81,
+ 0xb3, 0xb0, 0x81, 0xab, 0x1b, 0x95, 0xb9, 0x8b,
+ 0xaf, 0xd7, 0x1f, 0x6f, 0xd9, 0x5, 0x6d, 0x57,
+ 0x5d, 0x8b, 0x81, 0x1b, 0x6b, 0x69, 0x96, 0x94,
+ 0x65, 0x1f, 0x65, 0x94, 0x61, 0x93, 0x5c, 0x84,
+ 0x88, 0x8c, 0x18, 0xc0, 0xb1, 0xc2, 0xc4, 0x88,
+ 0xf7, 0xa, 0x8, 0xf7, 0x11, 0x6, 0x9a, 0xd3,
+ 0x5, 0xfb, 0x23, 0x6, 0x81, 0xbe, 0x8a, 0xb0,
+ 0x98, 0x1a, 0xf7, 0x18, 0xea, 0xaa, 0xc0, 0x9e,
+ 0xeb, 0x88, 0xfb, 0x10, 0x9a, 0x1e, 0xdc, 0x93,
+ 0x5, 0xf7, 0x30, 0x7a, 0xfb, 0xd, 0xac, 0x43,
+ 0x1b, 0xfb, 0x14, 0xfb, 0x4, 0x28, 0xfb, 0x1a,
+ 0x5f, 0x8d, 0x7e, 0x92, 0x5f, 0x1f, 0x35, 0x6,
+ 0x7c, 0x43, 0x5, 0xf7, 0x1, 0x6, 0x9f, 0xfb,
+ 0xa, 0xfb, 0x11, 0x29, 0x5c, 0x70, 0x8, 0xe,
+ 0x77, 0x84, 0xd2, 0xf7, 0xfd, 0xcb, 0xf7, 0x48,
+ 0x77, 0x1, 0xf7, 0x3, 0xf7, 0x9d, 0x3, 0xf7,
+ 0xa2, 0x8d, 0x15, 0x9a, 0xcf, 0x5, 0x87, 0x79,
+ 0x79, 0x89, 0x79, 0x1b, 0x65, 0x8b, 0xb2, 0xbd,
+ 0x96, 0x1f, 0xc7, 0xf7, 0xa4, 0x5, 0xe4, 0x6,
+ 0x9a, 0xcb, 0x5, 0x32, 0x6, 0xb4, 0xf7, 0x48,
+ 0x23, 0x51, 0x70, 0xfb, 0xe, 0x5, 0x43, 0x6,
+ 0x7d, 0x4b, 0x5, 0xd2, 0x6, 0x4b, 0xfb, 0xa4,
+ 0x5, 0x86, 0x72, 0x88, 0x75, 0x77, 0x1a, 0x51,
+ 0xa8, 0x68, 0xd6, 0x93, 0xa7, 0x8c, 0x93, 0xa7,
+ 0x1e, 0xe, 0xfb, 0x4e, 0x76, 0xf7, 0x51, 0xd4,
+ 0xf8, 0x26, 0xd4, 0xf7, 0x50, 0x77, 0x1, 0xb1,
+ 0xe7, 0xf7, 0xfe, 0xe7, 0x3, 0xf7, 0x3c, 0xd9,
+ 0x15, 0x4d, 0xad, 0xb9, 0x69, 0xd1, 0x1b, 0xf7,
+ 0x1c, 0xf7, 0x16, 0xf7, 0x23, 0xf7, 0x52, 0xf7,
+ 0x1e, 0x3d, 0xd8, 0x25, 0x57, 0x5d, 0x77, 0x56,
+ 0x52, 0x1f, 0xc5, 0xf7, 0x99, 0x5, 0x2e, 0x6,
+ 0xfb, 0x5c, 0xfe, 0x31, 0x5, 0xe7, 0x6, 0xe5,
+ 0xf8, 0x32, 0x15, 0xdf, 0xca, 0xf7, 0x3a, 0xf7,
+ 0xa, 0xd9, 0xb0, 0x45, 0x43, 0x3e, 0x5b, 0xfb,
+ 0x4b, 0xfb, 0x16, 0x31, 0x6f, 0xd9, 0xd5, 0x1e,
+ 0xe, 0x78, 0xd0, 0xf7, 0xa3, 0xd4, 0xf7, 0x84,
+ 0xd0, 0x1, 0xf8, 0x71, 0xeb, 0x3, 0xd6, 0xf7,
+ 0x45, 0x15, 0xfb, 0x20, 0x96, 0xf7, 0x8, 0x53,
+ 0xf7, 0x3, 0x1b, 0xf7, 0x20, 0xf7, 0xc, 0xe6,
+ 0xf7, 0x15, 0xe5, 0x48, 0xbf, 0x75, 0x97, 0x1f,
+ 0xe6, 0xb2, 0xae, 0xc3, 0xcf, 0x1a, 0xeb, 0x38,
+ 0xe4, 0xfb, 0x19, 0x6f, 0xfb, 0x34, 0x87, 0xfb,
+ 0x46, 0x5b, 0x1e, 0xe8, 0x79, 0x5, 0xe8, 0x9d,
+ 0xce, 0xb1, 0xc5, 0x1b, 0xd0, 0xc0, 0x58, 0x4a,
+ 0x52, 0x46, 0x48, 0xfb, 0x10, 0x1f, 0x7b, 0x42,
+ 0x5, 0xe8, 0xd8, 0x61, 0x3d, 0x43, 0x44, 0x3c,
+ 0x27, 0xfb, 0xc, 0x7d, 0xf0, 0xb0, 0x86, 0x1f,
+ 0xe, 0x65, 0xa, 0xf7, 0x77, 0xc4, 0xf7, 0x92,
+ 0xbe, 0x12, 0xf7, 0xe7, 0xd3, 0x55, 0xd1, 0x13,
+ 0x7c, 0xf8, 0x79, 0xc7, 0x15, 0xf7, 0x45, 0x6,
+ 0x7d, 0x44, 0x5, 0xcb, 0x6, 0x9a, 0xd2, 0x5,
+ 0xb8, 0x6, 0x97, 0xc1, 0x5, 0x5e, 0x6, 0xb8,
+ 0xf7, 0x77, 0x5, 0x55, 0x6, 0xfb, 0x7e, 0xfb,
+ 0x74, 0x5, 0xd6, 0x88, 0x15, 0xf7, 0x14, 0xf7,
+ 0x11, 0x8d, 0x89, 0x6e, 0xfb, 0xf, 0x5, 0xfc,
+ 0xb2, 0xf7, 0xdc, 0x15, 0x50, 0x9b, 0xbe, 0x61,
+ 0xd6, 0x1b, 0xde, 0xc3, 0xbd, 0xc4, 0xc1, 0x66,
+ 0x9a, 0x74, 0x95, 0x1f, 0x8d, 0x7, 0x13, 0x7a,
+ 0xb7, 0x94, 0xab, 0xa1, 0xbb, 0x1a, 0xc7, 0x51,
+ 0xae, 0x47, 0x48, 0x57, 0x6c, 0x50, 0x7b, 0x1e,
+ 0xce, 0x82, 0x5, 0x9e, 0x92, 0x97, 0xa8, 0xbc,
+ 0x1b, 0xa8, 0xa6, 0x7d, 0x6d, 0x5d, 0x5c, 0x85,
+ 0x60, 0x8a, 0x1f, 0x81, 0x58, 0x5, 0x13, 0xbc,
+ 0xae, 0xba, 0x82, 0x5c, 0x79, 0x80, 0x6b, 0x51,
+ 0x55, 0x7c, 0xb0, 0x9a, 0x85, 0x1f, 0x5d, 0xfc,
+ 0x69, 0x15, 0xd4, 0x6, 0xf9, 0x13, 0xf9, 0x66,
+ 0x5, 0x3c, 0x6, 0xe, 0xae, 0xf7, 0xa2, 0xcf,
+ 0xf7, 0xc4, 0xc8, 0x12, 0xf7, 0xe2, 0xdf, 0x4b,
+ 0xdd, 0x13, 0xe0, 0xe5, 0xf8, 0x1b, 0x15, 0x45,
+ 0x9d, 0xc5, 0x58, 0xe2, 0x1b, 0xec, 0xcf, 0xc7,
+ 0xcf, 0xcb, 0x5f, 0x9d, 0x70, 0x98, 0x1f, 0x8d,
+ 0x7, 0x13, 0xd0, 0xbe, 0x97, 0xb1, 0xa7, 0xc5,
+ 0x1a, 0xd3, 0x48, 0xb1, 0x3b, 0x3d, 0x4f, 0x66,
+ 0x44, 0x77, 0x1e, 0xda, 0x81, 0x5, 0xa2, 0x93,
+ 0x98, 0xad, 0xc5, 0x1b, 0xad, 0xaa, 0x7a, 0x67,
+ 0x55, 0x55, 0x83, 0x59, 0x8a, 0x1f, 0x7f, 0x4d,
+ 0x5, 0x13, 0xe0, 0xb3, 0xc3, 0x8b, 0x53, 0x75,
+ 0x7e, 0x5b, 0x47, 0x4c, 0x7a, 0xb8, 0x9c, 0x84,
+ 0x1f, 0xe, 0xae, 0xf8, 0xf3, 0xf7, 0x4, 0x2f,
+ 0x76, 0xb7, 0xd0, 0x8e, 0x77, 0x12, 0xf7, 0x11,
+ 0xce, 0xf7, 0x7d, 0xcc, 0x13, 0x8c, 0xf7, 0x11,
+ 0xf8, 0xf3, 0x15, 0xce, 0x6, 0x13, 0x6c, 0xa4,
+ 0x91, 0x97, 0x9d, 0xa6, 0x1b, 0xae, 0xa6, 0x7e,
+ 0x7f, 0xa3, 0x1f, 0x81, 0x9f, 0x9e, 0x82, 0xa1,
+ 0x1b, 0xcb, 0xaf, 0xc4, 0xc3, 0x91, 0x1f, 0x4a,
+ 0x6, 0x7c, 0x86, 0x85, 0x72, 0x6f, 0x1b, 0x7a,
+ 0x78, 0x91, 0x92, 0x78, 0x1f, 0x13, 0x5c, 0x98,
+ 0x6a, 0x69, 0x9c, 0x6d, 0x1b, 0x13, 0x8c, 0x41,
+ 0x79, 0x55, 0x4e, 0x7a, 0x1f, 0xe, 0xf9, 0x52,
+ 0xf7, 0xdb, 0x76, 0xf7, 0xf3, 0xc8, 0x1, 0xf9,
+ 0x33, 0xc8, 0x3, 0xf7, 0x5c, 0xf7, 0xc6, 0x15,
+ 0xd2, 0x6, 0xf7, 0x13, 0xf7, 0xf3, 0x5, 0xf7,
+ 0x21, 0x6, 0xa0, 0xc8, 0x5, 0xfb, 0xf4, 0x6,
+ 0x75, 0x4e, 0x5, 0xf7, 0x21, 0x6, 0xf7, 0x31,
+ 0xfb, 0xf3, 0x15, 0xcd, 0x6, 0xf7, 0x12, 0xf7,
+ 0xf3, 0x48, 0xa, 0x7e, 0xfb, 0xf3, 0x5, 0xcd,
+ 0x6, 0xf7, 0x7d, 0xf7, 0xed, 0x48, 0xa, 0xfb,
+ 0x10, 0xfb, 0xed, 0x5, 0xcd, 0x6, 0xf7, 0x28,
+ 0xf8, 0x30, 0x5, 0x23, 0x6, 0xfb, 0x73, 0xfb,
+ 0xdd, 0x4e, 0xa, 0x96, 0xf7, 0xdd, 0x5, 0x21,
+ 0x6, 0xe, 0x8b, 0xda, 0xf8, 0xbd, 0xd7, 0x1,
+ 0xf8, 0x63, 0xe9, 0x3, 0xa2, 0x16, 0xf8, 0x58,
+ 0x6, 0x9d, 0xda, 0x5, 0xfb, 0xe8, 0x6, 0xe1,
+ 0xf7, 0xa, 0xf7, 0x11, 0xc2, 0xcf, 0xc7, 0x8,
+ 0xa9, 0xa3, 0xea, 0xe1, 0xe8, 0x1a, 0xee, 0x3d,
+ 0xe4, 0xfb, 0x26, 0xfb, 0x31, 0x49, 0x23, 0x29,
+ 0x7b, 0x1e, 0xe6, 0x80, 0x5, 0xce, 0x98, 0xb6,
+ 0xd1, 0xe7, 0x1b, 0xd3, 0xc5, 0x5e, 0x48, 0x38,
+ 0x37, 0x53, 0x36, 0x4b, 0x1f, 0xfb, 0x4a, 0xfb,
+ 0x1b, 0x4d, 0x5f, 0x70, 0xfb, 0x19, 0x8, 0xe,
+ 0xae, 0xf7, 0xad, 0xcf, 0xf7, 0x76, 0xf7, 0x14,
+ 0x47, 0xcf, 0x1, 0xf7, 0xfe, 0xe2, 0x3, 0xcb,
+ 0xf7, 0xad, 0x15, 0xf7, 0xe8, 0x6, 0x99, 0xcf,
+ 0x5, 0xfb, 0x6d, 0x6, 0xa2, 0xa6, 0xa4, 0x9a,
+ 0xda, 0xb9, 0x8, 0xce, 0xb2, 0xc1, 0xb1, 0xd0,
+ 0x1a, 0xc2, 0x63, 0xcc, 0xfb, 0xc, 0x2a, 0x4e,
+ 0x63, 0x37, 0x73, 0x1e, 0xe2, 0x83, 0x5, 0xbb,
+ 0x9c, 0xa7, 0x9b, 0xbd, 0x1b, 0xbd, 0xa2, 0x71,
+ 0x71, 0x64, 0x6d, 0x78, 0x4e, 0x6a, 0x1f, 0xfb,
+ 0x2c, 0x36, 0x67, 0x4b, 0x78, 0x4d, 0x8, 0xe,
+ 0x7c, 0xd5, 0x62, 0x76, 0xf8, 0xa2, 0x77, 0x12,
+ 0x13, 0x60, 0xf8, 0x2e, 0x88, 0x15, 0xdd, 0x6,
+ 0xf7, 0x0, 0xf8, 0xa2, 0x5, 0x33, 0x6, 0x5c,
+ 0xfb, 0x75, 0x7d, 0x44, 0x7d, 0x4c, 0x55, 0x57,
+ 0x19, 0x13, 0xa0, 0x62, 0x60, 0x62, 0x7f, 0x69,
+ 0x1b, 0x4e, 0x5d, 0x97, 0xf7, 0xa, 0xa9, 0x1f,
+ 0xcc, 0xf7, 0xe2, 0x5, 0x38, 0x6, 0x49, 0xfb,
+ 0xe2, 0x5, 0x85, 0x6b, 0x87, 0x6b, 0x70, 0x1a,
+ 0x4c, 0xb5, 0x59, 0xf2, 0xd9, 0xca, 0xbd, 0xc3,
+ 0xbd, 0x1e, 0xe, 0x39, 0xa, 0xf7, 0x78, 0x77,
+ 0x27, 0xa, 0x31, 0xf8, 0x8f, 0x36, 0xa, 0xe,
+ 0x39, 0xa, 0xe8, 0xf7, 0x1b, 0x27, 0xa, 0xfb,
+ 0x40, 0xf8, 0x8f, 0x30, 0xa, 0xe, 0x39, 0xa,
+ 0xef, 0xef, 0x27, 0xa, 0x8d, 0xf8, 0x96, 0x2e,
+ 0xa, 0xe, 0x39, 0xa, 0xe4, 0xf7, 0x1f, 0x27,
+ 0xa, 0x65, 0xf8, 0x8b, 0x15, 0xd3, 0x6, 0x50,
+ 0x6f, 0xa, 0xfb, 0x3, 0x6, 0xe, 0xfb, 0x11,
+ 0xbd, 0x1, 0x70, 0x40, 0x15, 0x59, 0xf8, 0xcb,
+ 0xbd, 0x7, 0xe, 0xf7, 0x5e, 0x43, 0xa, 0xf7,
+ 0x61, 0x16, 0xee, 0x6, 0xf7, 0xbf, 0xf8, 0x9f,
+ 0x4d, 0xa, 0xfb, 0x83, 0xfc, 0x4e, 0x4e, 0xa,
+ 0x4e, 0xf8, 0x4e, 0x5, 0x34, 0x6, 0xe, 0xf8,
+ 0x3c, 0x43, 0xa, 0xf8, 0x65, 0xcd, 0x3, 0xf7,
+ 0x47, 0x16, 0xe7, 0x6, 0xf7, 0x4a, 0xf8, 0x36,
+ 0xa3, 0xfc, 0x36, 0x5, 0xe6, 0x6, 0xf7, 0x90,
+ 0xf8, 0x9f, 0x5, 0x34, 0x6, 0xfb, 0x51, 0xfc,
+ 0x38, 0x4e, 0xa, 0x76, 0xf8, 0x38, 0x50, 0xa,
+ 0xfb, 0x48, 0xfc, 0x3d, 0x4e, 0xa, 0x6a, 0xf8,
+ 0x3d, 0x5, 0x36, 0x6, 0xe, 0xf7, 0x5e, 0x43,
+ 0xa, 0x96, 0x16, 0xf7, 0xc, 0x6, 0xf7, 0x3a,
+ 0xf7, 0x54, 0xec, 0xfb, 0x54, 0x5, 0xf4, 0x6,
+ 0xfb, 0x20, 0xf7, 0x98, 0xf7, 0x7f, 0xf7, 0x9b,
+ 0x5, 0xfb, 0x9, 0x6, 0xfb, 0x36, 0xfb, 0x52,
+ 0x2c, 0xf7, 0x52, 0x5, 0x22, 0x6, 0xf7, 0x20,
+ 0xfb, 0x93, 0x5, 0xe, 0xf7, 0x5e, 0xfb, 0x55,
+ 0x76, 0xf9, 0x75, 0x77, 0x1, 0x9f, 0xfb, 0xe,
+ 0x15, 0x86, 0x36, 0x5, 0x86, 0x9f, 0x9d, 0x89,
+ 0x9c, 0x1b, 0xe8, 0xc0, 0xd1, 0xd3, 0xb3, 0x1f,
+ 0xf7, 0xec, 0xf8, 0xe7, 0x50, 0xa, 0xfb, 0x86,
+ 0xfc, 0x3a, 0x4e, 0xf8, 0x3a, 0x3f, 0xa, 0xe4,
+ 0xfc, 0xa3, 0x41, 0xfb, 0x15, 0x74, 0x7e, 0x38,
+ 0xa3, 0x19, 0xe, 0xf7, 0x5e, 0xfb, 0x55, 0x76,
+ 0xf9, 0x7d, 0x77, 0xf7, 0x73, 0x77, 0x1, 0xf8,
+ 0x74, 0xeb, 0x3, 0x9f, 0xfb, 0xb, 0x15, 0x86,
+ 0x36, 0x59, 0xa, 0xd8, 0xce, 0xb2, 0x1f, 0xf7,
+ 0xec, 0xf8, 0xed, 0x50, 0xa, 0xfb, 0x85, 0xfc,
+ 0x3f, 0x4e, 0xa, 0x4f, 0xf8, 0x3f, 0x45, 0xa,
+ 0xe5, 0xfc, 0xa8, 0x5, 0xfb, 0x15, 0x53, 0x59,
+ 0x8e, 0x78, 0x1b, 0x71, 0x7b, 0x8f, 0x8f, 0x7e,
+ 0x1f, 0xf7, 0x97, 0xf9, 0x5f, 0x15, 0xd7, 0x6,
+ 0xf7, 0x1c, 0xf7, 0x1e, 0x5, 0xfb, 0x9, 0x6,
+ 0xe, 0xf7, 0x5e, 0xfb, 0x6a, 0xe1, 0xf9, 0x71,
+ 0xf0, 0x1, 0x9f, 0xfb, 0xc, 0x15, 0x86, 0x37,
+ 0x59, 0xa, 0xd7, 0xce, 0xb2, 0x1f, 0xf7, 0xec,
+ 0xf8, 0xe6, 0x50, 0xa, 0xfb, 0x85, 0xfc, 0x3a,
+ 0x4e, 0xa, 0x4f, 0xf8, 0x3a, 0x45, 0xa, 0xe5,
+ 0xfc, 0xa2, 0x5, 0xfb, 0x16, 0x3f, 0x7f, 0x90,
+ 0x66, 0x1b, 0x71, 0x7b, 0x8f, 0x8f, 0x7e, 0x1f,
+ 0xf8, 0x1b, 0xf9, 0x69, 0x15, 0xeb, 0x6, 0xa1,
+ 0xf0, 0x50, 0xa, 0xfb, 0x65, 0x26, 0x15, 0xea,
+ 0x6, 0xa1, 0xf0, 0x50, 0xa, 0xe, 0xa0, 0x76,
+ 0xf7, 0xbf, 0xcb, 0xf7, 0xd9, 0x77, 0x1, 0xdc,
+ 0xf7, 0x2e, 0x15, 0xf7, 0x58, 0x6, 0x6b, 0xfb,
+ 0x2e, 0x5, 0xe1, 0x6, 0xac, 0xf7, 0x2e, 0x5,
+ 0xf7, 0x56, 0x6, 0x99, 0xcc, 0x5, 0xfb, 0x56,
+ 0x6, 0x9b, 0xdb, 0x5, 0xf7, 0x54, 0x6, 0x99,
+ 0xcb, 0x5, 0xfb, 0x2c, 0x6, 0xf7, 0x8f, 0xf7,
+ 0xd9, 0x5, 0xfb, 0x0, 0x6, 0xfb, 0x77, 0xfb,
+ 0xd9, 0x4e, 0xa, 0xfb, 0x9, 0xf7, 0xd9, 0x5,
+ 0x33, 0x6, 0xf7, 0x13, 0xfb, 0xd9, 0x5, 0xfb,
+ 0x35, 0x6, 0x7e, 0x4b, 0x5, 0xf7, 0x59, 0x6,
+ 0x7b, 0x3b, 0x5, 0xfb, 0x58, 0x6, 0xe, 0xf7,
+ 0x5e, 0x8b, 0xda, 0xf8, 0x6, 0xd5, 0x1, 0xaa,
+ 0xf8, 0xb0, 0x3, 0xaa, 0x16, 0xf8, 0x5e, 0x6,
+ 0x9c, 0xda, 0x5, 0xfb, 0xe3, 0x6, 0xf8, 0x18,
+ 0xf8, 0x18, 0x5a, 0xa, 0xf7, 0xca, 0x6, 0xfc,
+ 0xe, 0xfc, 0x10, 0x5, 0xe, 0xf7, 0x5e, 0x8b,
+ 0xdb, 0xf8, 0x98, 0xf7, 0x1e, 0x1, 0xaa, 0x16,
+ 0xf8, 0x5e, 0x6, 0x9c, 0xdb, 0x5, 0xfb, 0xe3,
+ 0x6, 0xf8, 0x18, 0xf8, 0x1c, 0x5a, 0xa, 0xf7,
+ 0xc8, 0x6, 0x8d, 0x89, 0xfc, 0xe, 0xfc, 0x12,
+ 0x5, 0xf7, 0x9b, 0xf8, 0xa2, 0x15, 0xf5, 0x6,
+ 0xf7, 0x23, 0xf7, 0x1e, 0x47, 0xa, 0x33, 0x32,
+ 0x60, 0xe4, 0x5, 0x36, 0x6, 0xe, 0x78, 0xd0,
+ 0xf8, 0xdc, 0xd0, 0x1, 0xf7, 0x2, 0xe3, 0xf7,
+ 0xd0, 0xe3, 0x3, 0xe8, 0xf7, 0x63, 0x15, 0xfb,
+ 0x44, 0xf0, 0x59, 0xec, 0xf7, 0x73, 0xe9, 0xf7,
+ 0xbc, 0xf7, 0x50, 0xf7, 0x4f, 0xfb, 0xd, 0xbe,
+ 0x3b, 0xfb, 0x6c, 0x29, 0xfb, 0xd7, 0xfb, 0x41,
+ 0x1e, 0xe3, 0x16, 0xa2, 0xac, 0xf8, 0x28, 0xf7,
+ 0x56, 0xf7, 0x3, 0x8c, 0xfb, 0x1d, 0x6b, 0x38,
+ 0x5a, 0xfb, 0xe0, 0xfb, 0x43, 0x49, 0x5a, 0xbd,
+ 0xf6, 0x1e, 0xe, 0x78, 0x9e, 0xf8, 0x9f, 0x9a,
+ 0xf7, 0x48, 0x9e, 0x6, 0xfb, 0x70, 0x98, 0xf8,
+ 0xc0, 0x94, 0x7, 0x78, 0x9e, 0xf8, 0x9f, 0x9a,
+ 0xf7, 0x48, 0x9e, 0x8, 0xfb, 0x70, 0x98, 0x9,
+ 0x1e, 0xa0, 0x39, 0x63, 0xff, 0xc, 0x9, 0xdc,
+ 0xa, 0xe5, 0xb, 0xd5, 0x92, 0xc, 0xc, 0xe5,
+ 0x95, 0xc, 0xd, 0xf8, 0xc0, 0x14, 0xf7, 0xbe,
+ 0x15, 0xc3, 0x13, 0x0, 0x50, 0x2, 0x0, 0x1,
+ 0x0, 0x4e, 0x0, 0x92, 0x0, 0x99, 0x0, 0xc9,
+ 0x1, 0x1, 0x1, 0x49, 0x1, 0x72, 0x1, 0xb1,
+ 0x1, 0xb6, 0x1, 0xbb, 0x1, 0xde, 0x1, 0xe1,
+ 0x2, 0x13, 0x2, 0x1a, 0x2, 0x22, 0x2, 0x2a,
+ 0x2, 0x3a, 0x2, 0x40, 0x2, 0x4b, 0x2, 0x58,
+ 0x2, 0x61, 0x2, 0x66, 0x2, 0x72, 0x2, 0x7b,
+ 0x2, 0x84, 0x2, 0x8c, 0x2, 0x96, 0x2, 0xa0,
+ 0x2, 0xa8, 0x2, 0xac, 0x2, 0xaf, 0x2, 0xb3,
+ 0x2, 0xbc, 0x2, 0xc5, 0x2, 0xcc, 0x2, 0xd3,
+ 0x2, 0xd9, 0x2, 0xdd, 0x2, 0xeb, 0x2, 0xef,
+ 0x2, 0xf3, 0x2, 0xfb, 0x3, 0x3, 0x3, 0xa,
+ 0x3, 0xf, 0x3, 0x13, 0x3, 0x17, 0x3, 0x22,
+ 0x3, 0x26, 0x3, 0x2d, 0x3, 0x33, 0x3, 0x3a,
+ 0x3, 0x40, 0x3, 0x45, 0x3, 0x4a, 0x3, 0x4e,
+ 0x3, 0x58, 0x3, 0x62, 0x3, 0x6c, 0x3, 0x76,
+ 0x3, 0x7a, 0x3, 0x83, 0x3, 0x8c, 0x3, 0x95,
+ 0x3, 0x9e, 0x3, 0xa7, 0x3, 0xb0, 0x3, 0xb8,
+ 0x3, 0xc1, 0x3, 0xca, 0x3, 0xd0, 0x3, 0xd4,
+ 0x3, 0xda, 0x3, 0xe0, 0x3, 0xe5, 0x3, 0xea,
+ 0x3, 0xef, 0x3, 0xf3, 0x3, 0xf7, 0x3, 0xfb,
+ 0x6e, 0xa, 0x85, 0xa7, 0x87, 0x9f, 0xa4, 0x1a,
+ 0xae, 0x91, 0xae, 0x92, 0xad, 0x1e, 0xa9, 0xf7,
+ 0x18, 0x5, 0x97, 0xc4, 0x8f, 0xa5, 0x91, 0x1a,
+ 0xe3, 0x2d, 0xc8, 0xfb, 0x2, 0x30, 0xfb, 0x11,
+ 0x5f, 0xfb, 0xc, 0x73, 0x1e, 0xe1, 0x83, 0x5,
+ 0xd8, 0xa6, 0xcc, 0xa0, 0xc5, 0x1b, 0xa4, 0xe5,
+ 0x87, 0x44, 0x80, 0x87, 0x6f, 0x83, 0x74, 0x1f,
+ 0x67, 0x7c, 0x65, 0x89, 0x3d, 0x88, 0x8, 0x4e,
+ 0x89, 0xfb, 0x48, 0x83, 0xfb, 0x37, 0x1a, 0x28,
+ 0xd6, 0x53, 0xe4, 0x1e, 0xb, 0x15, 0xfb, 0x41,
+ 0xf7, 0xb, 0xfb, 0x27, 0xf7, 0x5b, 0xf7, 0x76,
+ 0xf7, 0x45, 0xf7, 0x54, 0xf7, 0x82, 0xf7, 0x54,
+ 0xfb, 0xb, 0xf7, 0x1c, 0xfb, 0x5c, 0xfb, 0x6a,
+ 0xfb, 0x50, 0xfb, 0x38, 0xfb, 0xa6, 0x1e, 0xef,
+ 0x86, 0x15, 0xf7, 0x8b, 0xf7, 0x39, 0xf7, 0x7,
+ 0xf7, 0x1d, 0xf7, 0x4, 0xf6, 0x32, 0xfb, 0x32,
+ 0xfb, 0x47, 0xfb, 0xd, 0xfb, 0x3e, 0xfb, 0x42,
+ 0xfb, 0x4, 0xfb, 0x6, 0xdd, 0xf7, 0x2c, 0x1e,
+ 0xb, 0x20, 0xa, 0x13, 0xbc, 0x23, 0xa, 0xb,
+ 0xe7, 0xc9, 0xc1, 0xa4, 0xa7, 0x1f, 0x8c, 0x80,
+ 0x8d, 0x6d, 0x94, 0x71, 0x8, 0xa1, 0xf7, 0xa4,
+ 0x15, 0x82, 0x55, 0x81, 0x5f, 0x71, 0x66, 0x8,
+ 0x59, 0x69, 0x54, 0x6e, 0x54, 0x1b, 0x3e, 0x73,
+ 0xbd, 0xb2, 0xe1, 0xe7, 0x96, 0xc6, 0x90, 0x1f,
+ 0xdd, 0x92, 0xa2, 0x8d, 0xad, 0x99, 0x8, 0xb,
+ 0x15, 0xfb, 0x22, 0xf1, 0x3b, 0xf7, 0x7, 0xf7,
+ 0x30, 0xf7, 0x15, 0xf7, 0x1a, 0xf7, 0x57, 0xf7,
+ 0x1d, 0x34, 0xde, 0xfb, 0x13, 0xfb, 0x4c, 0x23,
+ 0xfb, 0x28, 0xfb, 0x47, 0x1e, 0xe5, 0x16, 0xf7,
+ 0x3, 0xcb, 0xf7, 0x27, 0xf7, 0x17, 0xe2, 0xb3,
+ 0x43, 0x3c, 0xfb, 0x4, 0x43, 0xfb, 0x28, 0xfb,
+ 0xe, 0x6d, 0x29, 0x98, 0xf7, 0x20, 0x1e, 0xb,
+ 0x15, 0xf8, 0x1e, 0x6, 0x8e, 0x9f, 0x8f, 0xa0,
+ 0xb3, 0x1a, 0xe7, 0x5d, 0xf7, 0x15, 0xfb, 0x38,
+ 0xfb, 0x5a, 0x35, 0xfb, 0x58, 0xfb, 0x1c, 0xfb,
+ 0x29, 0xe9, 0x3e, 0xf7, 0x7, 0xf7, 0x20, 0xe5,
+ 0xf7, 0x2, 0xd5, 0xa1, 0x1e, 0x32, 0x94, 0x5,
+ 0x29, 0x61, 0x3a, 0x76, 0x63, 0x1b, 0x4c, 0x54,
+ 0xbe, 0xf2, 0x96, 0x8c, 0x92, 0x8c, 0x95, 0x1f,
+ 0x99, 0xd1, 0x15, 0xcf, 0xa0, 0xbf, 0xe9, 0xf5,
+ 0x1b, 0xd2, 0xcd, 0x4b, 0x29, 0x7b, 0x1f, 0xb,
+ 0x15, 0xf4, 0x6, 0xf7, 0x8, 0xf7, 0x69, 0x5,
+ 0xf7, 0xb6, 0x6, 0xaf, 0xfb, 0x69, 0x5, 0xe8,
+ 0x6, 0xfb, 0xb, 0xf9, 0x76, 0x5, 0xfb, 0x5,
+ 0x6, 0xfb, 0x26, 0xfc, 0x54, 0x15, 0xf7, 0x51,
+ 0xf8, 0x4, 0x48, 0xa, 0xb9, 0xfc, 0x4, 0x5,
+ 0xe, 0x12, 0x13, 0x70, 0xf8, 0x27, 0x88, 0x15,
+ 0xe0, 0x6, 0xf7, 0x4, 0xf8, 0xa5, 0x45, 0xa,
+ 0x5a, 0xfb, 0x76, 0x5, 0x21, 0x75, 0x50, 0xfb,
+ 0x1b, 0xfb, 0x12, 0x1b, 0x4b, 0x7a, 0xc5, 0xd4,
+ 0x9a, 0x1f, 0xd4, 0xf7, 0xe4, 0x45, 0xa, 0x46,
+ 0xfb, 0xe2, 0x5, 0x87, 0x74, 0x89, 0x76, 0x76,
+ 0x1a, 0x13, 0xb0, 0x3a, 0xae, 0x4e, 0xec, 0xdc,
+ 0xcc, 0xbd, 0xc4, 0xbf, 0x1e, 0x13, 0x70, 0xb,
+ 0xfd, 0x8, 0x21, 0xa, 0xe, 0xfc, 0xa2, 0x24,
+ 0xa, 0xe, 0x1, 0xe1, 0x16, 0xf8, 0xbe, 0x6a,
+ 0xa, 0xfc, 0x5c, 0x6, 0xbf, 0xf7, 0x94, 0x5,
+ 0xf8, 0x29, 0x6, 0x9d, 0xde, 0x5, 0xfc, 0x29,
+ 0x6, 0xb9, 0xf7, 0x7b, 0x5, 0xf8, 0x40, 0x6a,
+ 0xa, 0xfc, 0xa0, 0x6, 0xb, 0x23, 0xa, 0xe,
+ 0x15, 0x8b, 0x22, 0xfc, 0x86, 0x64, 0x1a, 0xfb,
+ 0x25, 0xf7, 0xb, 0x43, 0xf7, 0x27, 0xf7, 0x91,
+ 0xbb, 0xf7, 0x80, 0xe0, 0x9c, 0x1e, 0xe5, 0xf8,
+ 0x45, 0x57, 0xa, 0x33, 0xfc, 0x45, 0x5, 0xfb,
+ 0xb, 0x74, 0x49, 0xfb, 0xa, 0xfb, 0x1e, 0x1b,
+ 0x39, 0x39, 0xb8, 0xe3, 0x1f, 0xf4, 0xf8, 0xad,
+ 0x5, 0xe, 0xa0, 0x76, 0xf9, 0x62, 0x77, 0x1,
+ 0xb, 0x2f, 0xa, 0xfb, 0x5d, 0x27, 0x2f, 0xa,
+ 0xb, 0x15, 0xe7, 0x6, 0xa0, 0xef, 0x3d, 0xa,
+ 0xb, 0x6e, 0xa, 0xdb, 0xe2, 0xb2, 0x34, 0x5,
+ 0xd9, 0x6, 0x4e, 0xf7, 0x1b, 0x5, 0x2a, 0x6,
+ 0xb, 0x35, 0xa, 0xf7, 0x69, 0xd8, 0xb, 0xf8,
+ 0x5, 0x8b, 0xdf, 0xf7, 0x94, 0xde, 0xf7, 0x7b,
+ 0xdf, 0xb, 0x3b, 0xa, 0xe9, 0xb7, 0x96, 0x41,
+ 0xa, 0xfb, 0x5, 0x84, 0x66, 0x8, 0xb, 0xe9,
+ 0x6, 0xf7, 0x25, 0xf9, 0x73, 0x3d, 0xa, 0xb,
+ 0xf8, 0x5, 0xa0, 0x76, 0xb, 0x15, 0xd4, 0x6,
+ 0xf7, 0x16, 0xf7, 0x1b, 0x5, 0xfb, 0x4, 0x6,
+ 0xb, 0xc5, 0x6, 0x77, 0x2d, 0x5f, 0x80, 0x7a,
+ 0x87, 0xb, 0xdf, 0x6, 0xf4, 0xf8, 0xa3, 0x5,
+ 0x36, 0x6, 0xb, 0x7c, 0xd5, 0x4d, 0xc9, 0xf8,
+ 0x67, 0x77, 0xb, 0xa0, 0x76, 0xf8, 0x56, 0xcf,
+ 0xf7, 0x17, 0xda, 0x1, 0xb, 0x15, 0xf4, 0x6,
+ 0xa1, 0xf4, 0x5, 0x52, 0x6, 0x9e, 0xb, 0x4c,
+ 0xa, 0x92, 0xb0, 0x9e, 0xe6, 0x18, 0xb, 0x5,
+ 0x2f, 0x6, 0xb, 0x3f, 0xa, 0xe, 0x5, 0x31,
+ 0x6, 0xb, 0x15, 0xf3, 0x6, 0xa1, 0xeb, 0x5,
+ 0x23, 0x6, 0xb, 0x9c, 0x8f, 0x93, 0xb4, 0x18,
+ 0x20, 0x7d, 0x72, 0xb, 0x77, 0x1, 0xf7, 0xf,
+ 0xec, 0x3, 0xb, 0xa0, 0x76, 0xf8, 0x9f, 0x77,
+ 0x1, 0xb, 0x76, 0xf7, 0x93, 0x77, 0x1, 0xb,
+ 0x5, 0x30, 0x6, 0xb, 0x6, 0xeb, 0xf8, 0x56,
+ 0x5, 0xf0, 0x6, 0x99, 0xcf, 0x5, 0x26, 0x6,
+ 0xf0, 0xb, 0x5, 0x27, 0x6, 0xb, 0x5, 0x8d,
+ 0x6, 0xb, 0xf7, 0x2c, 0x76, 0xf8, 0x2d, 0x77,
+ 0x1, 0xb, 0x7c, 0xd1, 0x66, 0x76, 0xf7, 0x8d,
+ 0xce, 0xb, 0xef, 0x6, 0xa0, 0xf5, 0x47, 0xa,
+ 0xb, 0x99, 0xa4, 0xf7, 0x5, 0xb, 0x5, 0x2c,
+ 0x6, 0xb, 0x5, 0x89, 0x6, 0xb, 0x15, 0xdc,
+ 0x6, 0xf7, 0x24, 0x6d, 0xa, 0xfb, 0x10, 0x6,
+ 0xb, 0x5, 0x2b, 0x6, 0xb, 0x5, 0xfb, 0x3,
+ 0x6, 0xfb, 0x97, 0xb, 0x5c, 0xa, 0xf8, 0xa3,
+ 0x77, 0xb, 0xae, 0xf8, 0xe5, 0xf7, 0x21, 0x1,
+ 0xb, 0x5c, 0xa, 0xf9, 0x73, 0x77, 0xb, 0x6,
+ 0x9c, 0xdc, 0x5, 0xb, 0x15, 0xd1, 0x6, 0x51,
+ 0xb, 0x5, 0x29, 0x6, 0xb, 0xf7, 0x60, 0x5,
+ 0x3f, 0x6, 0x5e, 0xfb, 0x60, 0x5, 0xb, 0x5,
+ 0x82, 0xa5, 0xa1, 0x8a, 0x9a, 0x1b, 0xe9, 0xb8,
+ 0xb, 0x97, 0xc3, 0x5, 0xfc, 0x4c, 0x6, 0x7a,
+ 0x41, 0x5, 0xb, 0x15, 0x74, 0x8b, 0x21, 0xf7,
+ 0x10, 0xf7, 0x2d, 0xa3, 0xb, 0x77, 0xa0, 0x76,
+ 0xb, 0x15, 0xe1, 0x6, 0x76, 0x25, 0x5, 0x35,
+ 0x6, 0xb, 0x72, 0x1b, 0x7c, 0x78, 0x95, 0x95,
+ 0x74, 0x1f, 0xb, 0x77, 0xfb, 0x58, 0xcf, 0xf9,
+ 0xa2, 0xcf, 0x1, 0xb, 0xa0, 0x76, 0xf8, 0x65,
+ 0xc8, 0x4e, 0xd4, 0x12, 0xb, 0xae, 0xfb, 0x4e,
+ 0x76, 0xfa, 0x40, 0x77, 0x1, 0xb, 0xc4, 0x6,
+ 0x77, 0x2d, 0x60, 0x80, 0x7a, 0x87, 0xb, 0x15,
+ 0xea, 0x6, 0xa1, 0xf0, 0x4d, 0xa, 0xb, 0xf7,
+ 0x84, 0xd4, 0x1, 0xbe, 0xf7, 0x84, 0x15, 0xb,
+ 0xf8, 0xac, 0x8d, 0x76, 0xa8, 0x76, 0xd2, 0xc1,
+ 0xb, 0x6, 0xa3, 0x90, 0x96, 0x9c, 0xb, 0xf6,
+ 0x4c, 0xa, 0xb, 0xf4, 0xef, 0xf8, 0x9d, 0xef,
+ 0xb, 0x6, 0x7d, 0x87, 0x85, 0x72, 0xb, 0x6,
+ 0x9c, 0xdf, 0x5, 0xb, 0x6, 0x9d, 0xdc, 0x5,
+ 0xb, 0xf8, 0x74, 0x78, 0xdc, 0xb, 0xf7, 0x21,
+ 0x5, 0xb, 0x15, 0xe6, 0x6, 0xb, 0xf7, 0x1f,
+ 0x5, 0xb
+ };
diff --git a/core/src/fxge/fontdata/chromefontdata/FoxitSansMM.c b/core/src/fxge/fontdata/chromefontdata/FoxitSansMM.c
new file mode 100644
index 0000000000..05b0a16372
--- /dev/null
+++ b/core/src/fxge/fontdata/chromefontdata/FoxitSansMM.c
@@ -0,0 +1,4191 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+const unsigned char g_FoxitSansMMFontData [66919] = {
+ 0x80, 0x01, 0xD2, 0x29, 0x00, 0x00, 0x25, 0x21, 0x50, 0x53, 0x2D, 0x41, 0x64, 0x6F, 0x62, 0x65,
+ 0x46, 0x6F, 0x6E, 0x74, 0x2D, 0x31, 0x2E, 0x30, 0x3A, 0x20, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x53,
+ 0x61, 0x6E, 0x73, 0x4D, 0x4D, 0x20, 0x30, 0x30, 0x31, 0x2E, 0x30, 0x30, 0x30, 0x0D, 0x25, 0x25,
+ 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x44, 0x61, 0x74, 0x65, 0x3A, 0x20, 0x46, 0x72,
+ 0x69, 0x20, 0x53, 0x65, 0x70, 0x20, 0x32, 0x39, 0x20, 0x31, 0x36, 0x3A, 0x30, 0x32, 0x3A, 0x35,
+ 0x33, 0x20, 0x32, 0x30, 0x30, 0x36, 0x0D, 0x25, 0x25, 0x56, 0x4D, 0x75, 0x73, 0x61, 0x67, 0x65,
+ 0x3A, 0x20, 0x31, 0x32, 0x30, 0x30, 0x30, 0x30, 0x20, 0x31, 0x35, 0x30, 0x30, 0x30, 0x30, 0x0D,
+ 0x31, 0x37, 0x20, 0x64, 0x69, 0x63, 0x74, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6E, 0x0D, 0x2F, 0x46,
+ 0x6F, 0x6E, 0x74, 0x49, 0x6E, 0x66, 0x6F, 0x20, 0x31, 0x34, 0x20, 0x64, 0x69, 0x63, 0x74, 0x20,
+ 0x64, 0x75, 0x70, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6E, 0x0D, 0x2F, 0x76, 0x65, 0x72, 0x73, 0x69,
+ 0x6F, 0x6E, 0x20, 0x28, 0x30, 0x30, 0x31, 0x2E, 0x30, 0x30, 0x30, 0x29, 0x20, 0x72, 0x65, 0x61,
+ 0x64, 0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x4E, 0x6F, 0x74, 0x69, 0x63,
+ 0x65, 0x20, 0x28, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x29, 0x20, 0x72, 0x65, 0x61, 0x64, 0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65,
+ 0x66, 0x0D, 0x2F, 0x46, 0x75, 0x6C, 0x6C, 0x4E, 0x61, 0x6D, 0x65, 0x20, 0x28, 0x43, 0x68, 0x72,
+ 0x6f, 0x6d, 0x65, 0x20, 0x53, 0x61, 0x6E, 0x73, 0x20, 0x4D, 0x4D, 0x29, 0x20, 0x72, 0x65, 0x61, 0x64,
+ 0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x46, 0x61, 0x6D, 0x69, 0x6C, 0x79,
+ 0x4E, 0x61, 0x6D, 0x65, 0x20, 0x28, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x20, 0x53, 0x61, 0x6E, 0x73,
+ 0x20, 0x4D, 0x4D, 0x29, 0x20, 0x72, 0x65, 0x61, 0x64, 0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65,
+ 0x66, 0x0D, 0x2F, 0x49, 0x74, 0x61, 0x6C, 0x69, 0x63, 0x41, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x30,
+ 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x69, 0x73, 0x46, 0x69, 0x78, 0x65, 0x64, 0x50, 0x69, 0x74,
+ 0x63, 0x68, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x55, 0x6E,
+ 0x64, 0x65, 0x72, 0x6C, 0x69, 0x6E, 0x65, 0x50, 0x6F, 0x73, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x20,
+ 0x2D, 0x31, 0x30, 0x30, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x55, 0x6E, 0x64, 0x65, 0x72, 0x6C,
+ 0x69, 0x6E, 0x65, 0x54, 0x68, 0x69, 0x63, 0x6B, 0x6E, 0x65, 0x73, 0x73, 0x20, 0x35, 0x30, 0x20,
+ 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, 0x41, 0x6C, 0x6C,
+ 0x29, 0x20, 0x72, 0x65, 0x61, 0x64, 0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F,
+ 0x42, 0x6C, 0x65, 0x6E, 0x64, 0x44, 0x65, 0x73, 0x69, 0x67, 0x6E, 0x50, 0x6F, 0x73, 0x69, 0x74,
+ 0x69, 0x6F, 0x6E, 0x73, 0x20, 0x5B, 0x5B, 0x30, 0x20, 0x30, 0x20, 0x5D, 0x5B, 0x31, 0x20, 0x30,
+ 0x20, 0x5D, 0x5B, 0x30, 0x20, 0x31, 0x20, 0x5D, 0x5B, 0x31, 0x20, 0x31, 0x20, 0x5D, 0x5D, 0x20,
+ 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x42, 0x6C, 0x65, 0x6E, 0x64, 0x44, 0x65, 0x73, 0x69, 0x67, 0x6E,
+ 0x4D, 0x61, 0x70, 0x20, 0x5B, 0x5B, 0x5B, 0x35, 0x30, 0x20, 0x30, 0x20, 0x5D, 0x5B, 0x31, 0x34,
+ 0x35, 0x30, 0x20, 0x31, 0x20, 0x5D, 0x5D, 0x5B, 0x5B, 0x35, 0x30, 0x20, 0x30, 0x20, 0x5D, 0x5B,
+ 0x31, 0x34, 0x35, 0x30, 0x20, 0x31, 0x20, 0x5D, 0x5D, 0x5D, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F,
+ 0x42, 0x6C, 0x65, 0x6E, 0x64, 0x41, 0x78, 0x69, 0x73, 0x54, 0x79, 0x70, 0x65, 0x73, 0x20, 0x5B,
+ 0x2F, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x2F, 0x57, 0x69, 0x64, 0x74, 0x68, 0x20, 0x5D,
+ 0x20, 0x64, 0x65, 0x66, 0x0D, 0x65, 0x6E, 0x64, 0x20, 0x72, 0x65, 0x61, 0x64, 0x6F, 0x6E, 0x6C,
+ 0x79, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x56, 0x65, 0x63,
+ 0x74, 0x6F, 0x72, 0x20, 0x5B, 0x30, 0x2E, 0x33, 0x31, 0x35, 0x38, 0x20, 0x30, 0x2E, 0x31, 0x33,
+ 0x34, 0x39, 0x20, 0x30, 0x2E, 0x33, 0x38, 0x34, 0x39, 0x20, 0x30, 0x2E, 0x31, 0x36, 0x34, 0x34,
+ 0x20, 0x5D, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x4E, 0x61, 0x6D, 0x65,
+ 0x20, 0x2F, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x53, 0x61, 0x6E, 0x73, 0x4D, 0x4D, 0x20, 0x64, 0x65,
+ 0x66, 0x0D, 0x2F, 0x45, 0x6E, 0x63, 0x6F, 0x64, 0x69, 0x6E, 0x67, 0x20, 0x32, 0x35, 0x36, 0x20,
+ 0x61, 0x72, 0x72, 0x61, 0x79, 0x0D, 0x30, 0x20, 0x31, 0x20, 0x32, 0x35, 0x35, 0x20, 0x7B, 0x31,
+ 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x2F, 0x2E, 0x6E, 0x6F,
+ 0x74, 0x64, 0x65, 0x66, 0x20, 0x70, 0x75, 0x74, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x0D, 0x64,
+ 0x75, 0x70, 0x20, 0x33, 0x32, 0x20, 0x2F, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x70, 0x75, 0x74,
+ 0x0D, 0x64, 0x75, 0x70, 0x20, 0x33, 0x33, 0x20, 0x2F, 0x65, 0x78, 0x63, 0x6C, 0x61, 0x6D, 0x20,
+ 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x33, 0x34, 0x20, 0x2F, 0x71, 0x75, 0x6F, 0x74,
+ 0x65, 0x64, 0x62, 0x6C, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x33, 0x35, 0x20,
+ 0x2F, 0x6E, 0x75, 0x6D, 0x62, 0x65, 0x72, 0x73, 0x69, 0x67, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D,
+ 0x64, 0x75, 0x70, 0x20, 0x33, 0x36, 0x20, 0x2F, 0x64, 0x6F, 0x6C, 0x6C, 0x61, 0x72, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x33, 0x37, 0x20, 0x2F, 0x70, 0x65, 0x72, 0x63, 0x65,
+ 0x6E, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x33, 0x38, 0x20, 0x2F, 0x61,
+ 0x6D, 0x70, 0x65, 0x72, 0x73, 0x61, 0x6E, 0x64, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+ 0x20, 0x33, 0x39, 0x20, 0x2F, 0x71, 0x75, 0x6F, 0x74, 0x65, 0x73, 0x69, 0x6E, 0x67, 0x6C, 0x65,
+ 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x30, 0x20, 0x2F, 0x70, 0x61, 0x72,
+ 0x65, 0x6E, 0x6C, 0x65, 0x66, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34,
+ 0x31, 0x20, 0x2F, 0x70, 0x61, 0x72, 0x65, 0x6E, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75,
+ 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x32, 0x20, 0x2F, 0x61, 0x73, 0x74, 0x65, 0x72, 0x69,
+ 0x73, 0x6B, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x33, 0x20, 0x2F, 0x70,
+ 0x6C, 0x75, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x34, 0x20, 0x2F,
+ 0x63, 0x6F, 0x6D, 0x6D, 0x61, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x35,
+ 0x20, 0x2F, 0x68, 0x79, 0x70, 0x68, 0x65, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+ 0x20, 0x34, 0x36, 0x20, 0x2F, 0x70, 0x65, 0x72, 0x69, 0x6F, 0x64, 0x20, 0x70, 0x75, 0x74, 0x0D,
+ 0x64, 0x75, 0x70, 0x20, 0x34, 0x37, 0x20, 0x2F, 0x73, 0x6C, 0x61, 0x73, 0x68, 0x20, 0x70, 0x75,
+ 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x38, 0x20, 0x2F, 0x7A, 0x65, 0x72, 0x6F, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x39, 0x20, 0x2F, 0x6F, 0x6E, 0x65, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35, 0x30, 0x20, 0x2F, 0x74, 0x77, 0x6F, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35, 0x31, 0x20, 0x2F, 0x74, 0x68, 0x72, 0x65, 0x65,
+ 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35, 0x32, 0x20, 0x2F, 0x66, 0x6F, 0x75,
+ 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35, 0x33, 0x20, 0x2F, 0x66, 0x69,
+ 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35, 0x34, 0x20, 0x2F, 0x73,
+ 0x69, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35, 0x35, 0x20, 0x2F, 0x73,
+ 0x65, 0x76, 0x65, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35, 0x36, 0x20,
+ 0x2F, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35,
+ 0x37, 0x20, 0x2F, 0x6E, 0x69, 0x6E, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+ 0x35, 0x38, 0x20, 0x2F, 0x63, 0x6F, 0x6C, 0x6F, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+ 0x70, 0x20, 0x35, 0x39, 0x20, 0x2F, 0x73, 0x65, 0x6D, 0x69, 0x63, 0x6F, 0x6C, 0x6F, 0x6E, 0x20,
+ 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x36, 0x30, 0x20, 0x2F, 0x6C, 0x65, 0x73, 0x73,
+ 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x36, 0x31, 0x20, 0x2F, 0x65, 0x71, 0x75,
+ 0x61, 0x6C, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x36, 0x32, 0x20, 0x2F, 0x67,
+ 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x36,
+ 0x33, 0x20, 0x2F, 0x71, 0x75, 0x65, 0x73, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D,
+ 0x64, 0x75, 0x70, 0x20, 0x36, 0x34, 0x20, 0x2F, 0x61, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+ 0x75, 0x70, 0x20, 0x36, 0x35, 0x20, 0x2F, 0x41, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+ 0x20, 0x36, 0x36, 0x20, 0x2F, 0x42, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x36,
+ 0x37, 0x20, 0x2F, 0x43, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x36, 0x38, 0x20,
+ 0x2F, 0x44, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x36, 0x39, 0x20, 0x2F, 0x45,
+ 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, 0x30, 0x20, 0x2F, 0x46, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, 0x31, 0x20, 0x2F, 0x47, 0x20, 0x70, 0x75, 0x74,
+ 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, 0x32, 0x20, 0x2F, 0x48, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+ 0x75, 0x70, 0x20, 0x37, 0x33, 0x20, 0x2F, 0x49, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+ 0x20, 0x37, 0x34, 0x20, 0x2F, 0x4A, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37,
+ 0x35, 0x20, 0x2F, 0x4B, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, 0x36, 0x20,
+ 0x2F, 0x4C, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, 0x37, 0x20, 0x2F, 0x4D,
+ 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, 0x38, 0x20, 0x2F, 0x4E, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, 0x39, 0x20, 0x2F, 0x4F, 0x20, 0x70, 0x75, 0x74,
+ 0x0D, 0x64, 0x75, 0x70, 0x20, 0x38, 0x30, 0x20, 0x2F, 0x50, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+ 0x75, 0x70, 0x20, 0x38, 0x31, 0x20, 0x2F, 0x51, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+ 0x20, 0x38, 0x32, 0x20, 0x2F, 0x52, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x38,
+ 0x33, 0x20, 0x2F, 0x53, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x38, 0x34, 0x20,
+ 0x2F, 0x54, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x38, 0x35, 0x20, 0x2F, 0x55,
+ 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x38, 0x36, 0x20, 0x2F, 0x56, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x38, 0x37, 0x20, 0x2F, 0x57, 0x20, 0x70, 0x75, 0x74,
+ 0x0D, 0x64, 0x75, 0x70, 0x20, 0x38, 0x38, 0x20, 0x2F, 0x58, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+ 0x75, 0x70, 0x20, 0x38, 0x39, 0x20, 0x2F, 0x59, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+ 0x20, 0x39, 0x30, 0x20, 0x2F, 0x5A, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x39,
+ 0x31, 0x20, 0x2F, 0x62, 0x72, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x6C, 0x65, 0x66, 0x74, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x39, 0x32, 0x20, 0x2F, 0x62, 0x61, 0x63, 0x6B, 0x73,
+ 0x6C, 0x61, 0x73, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x39, 0x33, 0x20,
+ 0x2F, 0x62, 0x72, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75,
+ 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x39, 0x34, 0x20, 0x2F, 0x61, 0x73, 0x63, 0x69, 0x69, 0x63,
+ 0x69, 0x72, 0x63, 0x75, 0x6D, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x39, 0x35,
+ 0x20, 0x2F, 0x75, 0x6E, 0x64, 0x65, 0x72, 0x73, 0x63, 0x6F, 0x72, 0x65, 0x20, 0x70, 0x75, 0x74,
+ 0x0D, 0x64, 0x75, 0x70, 0x20, 0x39, 0x36, 0x20, 0x2F, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x39, 0x37, 0x20, 0x2F, 0x61, 0x20, 0x70, 0x75, 0x74,
+ 0x0D, 0x64, 0x75, 0x70, 0x20, 0x39, 0x38, 0x20, 0x2F, 0x62, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+ 0x75, 0x70, 0x20, 0x39, 0x39, 0x20, 0x2F, 0x63, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+ 0x20, 0x31, 0x30, 0x30, 0x20, 0x2F, 0x64, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+ 0x31, 0x30, 0x31, 0x20, 0x2F, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31,
+ 0x30, 0x32, 0x20, 0x2F, 0x66, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x30,
+ 0x33, 0x20, 0x2F, 0x67, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x34,
+ 0x20, 0x2F, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x35, 0x20,
+ 0x2F, 0x69, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x36, 0x20, 0x2F,
+ 0x6A, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x37, 0x20, 0x2F, 0x6B,
+ 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x38, 0x20, 0x2F, 0x6C, 0x20,
+ 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x39, 0x20, 0x2F, 0x6D, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x31, 0x30, 0x20, 0x2F, 0x6E, 0x20, 0x70, 0x75,
+ 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x31, 0x31, 0x20, 0x2F, 0x6F, 0x20, 0x70, 0x75, 0x74,
+ 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x31, 0x32, 0x20, 0x2F, 0x70, 0x20, 0x70, 0x75, 0x74, 0x0D,
+ 0x64, 0x75, 0x70, 0x20, 0x31, 0x31, 0x33, 0x20, 0x2F, 0x71, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+ 0x75, 0x70, 0x20, 0x31, 0x31, 0x34, 0x20, 0x2F, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+ 0x70, 0x20, 0x31, 0x31, 0x35, 0x20, 0x2F, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+ 0x20, 0x31, 0x31, 0x36, 0x20, 0x2F, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+ 0x31, 0x31, 0x37, 0x20, 0x2F, 0x75, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31,
+ 0x31, 0x38, 0x20, 0x2F, 0x76, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x31,
+ 0x39, 0x20, 0x2F, 0x77, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x32, 0x30,
+ 0x20, 0x2F, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x32, 0x31, 0x20,
+ 0x2F, 0x79, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x32, 0x32, 0x20, 0x2F,
+ 0x7A, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x32, 0x33, 0x20, 0x2F, 0x62,
+ 0x72, 0x61, 0x63, 0x65, 0x6C, 0x65, 0x66, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+ 0x20, 0x31, 0x32, 0x34, 0x20, 0x2F, 0x62, 0x61, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+ 0x70, 0x20, 0x31, 0x32, 0x35, 0x20, 0x2F, 0x62, 0x72, 0x61, 0x63, 0x65, 0x72, 0x69, 0x67, 0x68,
+ 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x32, 0x36, 0x20, 0x2F, 0x61,
+ 0x73, 0x63, 0x69, 0x69, 0x74, 0x69, 0x6C, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+ 0x70, 0x20, 0x31, 0x32, 0x38, 0x20, 0x2F, 0x45, 0x75, 0x72, 0x6F, 0x20, 0x70, 0x75, 0x74, 0x0D,
+ 0x64, 0x75, 0x70, 0x20, 0x31, 0x33, 0x30, 0x20, 0x2F, 0x71, 0x75, 0x6F, 0x74, 0x65, 0x73, 0x69,
+ 0x6E, 0x67, 0x6C, 0x62, 0x61, 0x73, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+ 0x31, 0x33, 0x31, 0x20, 0x2F, 0x66, 0x6C, 0x6F, 0x72, 0x69, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D,
+ 0x64, 0x75, 0x70, 0x20, 0x31, 0x33, 0x32, 0x20, 0x2F, 0x71, 0x75, 0x6F, 0x74, 0x65, 0x64, 0x62,
+ 0x6C, 0x62, 0x61, 0x73, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x33,
+ 0x33, 0x20, 0x2F, 0x65, 0x6C, 0x6C, 0x69, 0x70, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D,
+ 0x64, 0x75, 0x70, 0x20, 0x31, 0x33, 0x34, 0x20, 0x2F, 0x64, 0x61, 0x67, 0x67, 0x65, 0x72, 0x20,
+ 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x33, 0x35, 0x20, 0x2F, 0x64, 0x61, 0x67,
+ 0x67, 0x65, 0x72, 0x64, 0x62, 0x6C, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31,
+ 0x33, 0x36, 0x20, 0x2F, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x33, 0x37, 0x20, 0x2F, 0x70, 0x65, 0x72, 0x74,
+ 0x68, 0x6F, 0x75, 0x73, 0x61, 0x6E, 0x64, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+ 0x31, 0x33, 0x38, 0x20, 0x2F, 0x53, 0x63, 0x61, 0x72, 0x6F, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D,
+ 0x64, 0x75, 0x70, 0x20, 0x31, 0x33, 0x39, 0x20, 0x2F, 0x67, 0x75, 0x69, 0x6C, 0x73, 0x69, 0x6E,
+ 0x67, 0x6C, 0x6C, 0x65, 0x66, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31,
+ 0x34, 0x30, 0x20, 0x2F, 0x4F, 0x45, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31,
+ 0x34, 0x35, 0x20, 0x2F, 0x71, 0x75, 0x6F, 0x74, 0x65, 0x6C, 0x65, 0x66, 0x74, 0x20, 0x70, 0x75,
+ 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x34, 0x36, 0x20, 0x2F, 0x71, 0x75, 0x6F, 0x74, 0x65,
+ 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x34,
+ 0x37, 0x20, 0x2F, 0x71, 0x75, 0x6F, 0x74, 0x65, 0x64, 0x62, 0x6C, 0x6C, 0x65, 0x66, 0x74, 0x20,
+ 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x34, 0x38, 0x20, 0x2F, 0x71, 0x75, 0x6F,
+ 0x74, 0x65, 0x64, 0x62, 0x6C, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+ 0x75, 0x70, 0x20, 0x31, 0x34, 0x39, 0x20, 0x2F, 0x62, 0x75, 0x6C, 0x6C, 0x65, 0x74, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x35, 0x30, 0x20, 0x2F, 0x65, 0x6E, 0x64, 0x61,
+ 0x73, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x35, 0x31, 0x20, 0x2F,
+ 0x65, 0x6D, 0x64, 0x61, 0x73, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31,
+ 0x35, 0x32, 0x20, 0x2F, 0x74, 0x69, 0x6C, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+ 0x70, 0x20, 0x31, 0x35, 0x33, 0x20, 0x2F, 0x74, 0x72, 0x61, 0x64, 0x65, 0x6D, 0x61, 0x72, 0x6B,
+ 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x35, 0x34, 0x20, 0x2F, 0x73, 0x63,
+ 0x61, 0x72, 0x6F, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x35, 0x35,
+ 0x20, 0x2F, 0x67, 0x75, 0x69, 0x6C, 0x73, 0x69, 0x6E, 0x67, 0x6C, 0x72, 0x69, 0x67, 0x68, 0x74,
+ 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x35, 0x36, 0x20, 0x2F, 0x6F, 0x65,
+ 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x35, 0x39, 0x20, 0x2F, 0x59, 0x64,
+ 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+ 0x31, 0x36, 0x31, 0x20, 0x2F, 0x65, 0x78, 0x63, 0x6C, 0x61, 0x6D, 0x64, 0x6F, 0x77, 0x6E, 0x20,
+ 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36, 0x32, 0x20, 0x2F, 0x63, 0x65, 0x6E,
+ 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36, 0x33, 0x20, 0x2F, 0x73,
+ 0x74, 0x65, 0x72, 0x6C, 0x69, 0x6E, 0x67, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+ 0x31, 0x36, 0x34, 0x20, 0x2F, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x63, 0x79, 0x20, 0x70, 0x75,
+ 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36, 0x35, 0x20, 0x2F, 0x79, 0x65, 0x6E, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36, 0x36, 0x20, 0x2F, 0x62, 0x72, 0x6F, 0x6B,
+ 0x65, 0x6E, 0x62, 0x61, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36,
+ 0x37, 0x20, 0x2F, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+ 0x75, 0x70, 0x20, 0x31, 0x36, 0x38, 0x20, 0x2F, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73,
+ 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36, 0x39, 0x20, 0x2F, 0x63, 0x6F,
+ 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+ 0x31, 0x37, 0x30, 0x20, 0x2F, 0x6F, 0x72, 0x64, 0x66, 0x65, 0x6D, 0x69, 0x6E, 0x69, 0x6E, 0x65,
+ 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x37, 0x31, 0x20, 0x2F, 0x67, 0x75,
+ 0x69, 0x6C, 0x6C, 0x65, 0x6D, 0x6F, 0x74, 0x6C, 0x65, 0x66, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D,
+ 0x64, 0x75, 0x70, 0x20, 0x31, 0x37, 0x32, 0x20, 0x2F, 0x6C, 0x6F, 0x67, 0x69, 0x63, 0x61, 0x6C,
+ 0x6E, 0x6F, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x37, 0x34, 0x20,
+ 0x2F, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x70, 0x75, 0x74, 0x0D,
+ 0x64, 0x75, 0x70, 0x20, 0x31, 0x37, 0x35, 0x20, 0x2F, 0x6D, 0x61, 0x63, 0x72, 0x6F, 0x6E, 0x20,
+ 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x37, 0x36, 0x20, 0x2F, 0x64, 0x65, 0x67,
+ 0x72, 0x65, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x37, 0x37, 0x20,
+ 0x2F, 0x70, 0x6C, 0x75, 0x73, 0x6D, 0x69, 0x6E, 0x75, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+ 0x75, 0x70, 0x20, 0x31, 0x37, 0x38, 0x20, 0x2F, 0x74, 0x77, 0x6F, 0x73, 0x75, 0x70, 0x65, 0x72,
+ 0x69, 0x6F, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x37, 0x39, 0x20,
+ 0x2F, 0x74, 0x68, 0x72, 0x65, 0x65, 0x73, 0x75, 0x70, 0x65, 0x72, 0x69, 0x6F, 0x72, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x30, 0x20, 0x2F, 0x61, 0x63, 0x75, 0x74,
+ 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x31, 0x20, 0x2F, 0x6D,
+ 0x75, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x32, 0x20, 0x2F, 0x70,
+ 0x61, 0x72, 0x61, 0x67, 0x72, 0x61, 0x70, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+ 0x20, 0x31, 0x38, 0x33, 0x20, 0x2F, 0x70, 0x65, 0x72, 0x69, 0x6F, 0x64, 0x63, 0x65, 0x6E, 0x74,
+ 0x65, 0x72, 0x65, 0x64, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x34,
+ 0x20, 0x2F, 0x63, 0x65, 0x64, 0x69, 0x6C, 0x6C, 0x61, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+ 0x70, 0x20, 0x31, 0x38, 0x35, 0x20, 0x2F, 0x6F, 0x6E, 0x65, 0x73, 0x75, 0x70, 0x65, 0x72, 0x69,
+ 0x6F, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x36, 0x20, 0x2F,
+ 0x6F, 0x72, 0x64, 0x6D, 0x61, 0x73, 0x63, 0x75, 0x6C, 0x69, 0x6E, 0x65, 0x20, 0x70, 0x75, 0x74,
+ 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x37, 0x20, 0x2F, 0x67, 0x75, 0x69, 0x6C, 0x6C, 0x65,
+ 0x6D, 0x6F, 0x74, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+ 0x20, 0x31, 0x38, 0x38, 0x20, 0x2F, 0x6F, 0x6E, 0x65, 0x71, 0x75, 0x61, 0x72, 0x74, 0x65, 0x72,
+ 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x39, 0x20, 0x2F, 0x6F, 0x6E,
+ 0x65, 0x68, 0x61, 0x6C, 0x66, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39,
+ 0x30, 0x20, 0x2F, 0x74, 0x68, 0x72, 0x65, 0x65, 0x71, 0x75, 0x61, 0x72, 0x74, 0x65, 0x72, 0x73,
+ 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39, 0x31, 0x20, 0x2F, 0x71, 0x75,
+ 0x65, 0x73, 0x74, 0x69, 0x6F, 0x6E, 0x64, 0x6F, 0x77, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+ 0x75, 0x70, 0x20, 0x31, 0x39, 0x32, 0x20, 0x2F, 0x41, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39, 0x33, 0x20, 0x2F, 0x41, 0x61, 0x63, 0x75,
+ 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39, 0x34, 0x20, 0x2F,
+ 0x41, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D,
+ 0x64, 0x75, 0x70, 0x20, 0x31, 0x39, 0x35, 0x20, 0x2F, 0x41, 0x74, 0x69, 0x6C, 0x64, 0x65, 0x20,
+ 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39, 0x36, 0x20, 0x2F, 0x41, 0x64, 0x69,
+ 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31,
+ 0x39, 0x37, 0x20, 0x2F, 0x41, 0x72, 0x69, 0x6E, 0x67, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+ 0x70, 0x20, 0x31, 0x39, 0x38, 0x20, 0x2F, 0x41, 0x45, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+ 0x70, 0x20, 0x31, 0x39, 0x39, 0x20, 0x2F, 0x43, 0x63, 0x65, 0x64, 0x69, 0x6C, 0x6C, 0x61, 0x20,
+ 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x30, 0x20, 0x2F, 0x45, 0x67, 0x72,
+ 0x61, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x31, 0x20,
+ 0x2F, 0x45, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+ 0x32, 0x30, 0x32, 0x20, 0x2F, 0x45, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78,
+ 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x33, 0x20, 0x2F, 0x45, 0x64,
+ 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+ 0x32, 0x30, 0x34, 0x20, 0x2F, 0x49, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D,
+ 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x35, 0x20, 0x2F, 0x49, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20,
+ 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x36, 0x20, 0x2F, 0x49, 0x63, 0x69,
+ 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+ 0x20, 0x32, 0x30, 0x37, 0x20, 0x2F, 0x49, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20,
+ 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x38, 0x20, 0x2F, 0x45, 0x74, 0x68,
+ 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x39, 0x20, 0x2F, 0x4E, 0x74,
+ 0x69, 0x6C, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31, 0x30,
+ 0x20, 0x2F, 0x4F, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+ 0x20, 0x32, 0x31, 0x31, 0x20, 0x2F, 0x4F, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74,
+ 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31, 0x32, 0x20, 0x2F, 0x4F, 0x63, 0x69, 0x72, 0x63, 0x75,
+ 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31,
+ 0x33, 0x20, 0x2F, 0x4F, 0x74, 0x69, 0x6C, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+ 0x70, 0x20, 0x32, 0x31, 0x34, 0x20, 0x2F, 0x4F, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73,
+ 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31, 0x35, 0x20, 0x2F, 0x6D, 0x75,
+ 0x6C, 0x74, 0x69, 0x70, 0x6C, 0x79, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32,
+ 0x31, 0x36, 0x20, 0x2F, 0x4F, 0x73, 0x6C, 0x61, 0x73, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+ 0x75, 0x70, 0x20, 0x32, 0x31, 0x37, 0x20, 0x2F, 0x55, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31, 0x38, 0x20, 0x2F, 0x55, 0x61, 0x63, 0x75,
+ 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31, 0x39, 0x20, 0x2F,
+ 0x55, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D,
+ 0x64, 0x75, 0x70, 0x20, 0x32, 0x32, 0x30, 0x20, 0x2F, 0x55, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73,
+ 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32, 0x31, 0x20, 0x2F,
+ 0x59, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32,
+ 0x32, 0x32, 0x20, 0x2F, 0x54, 0x68, 0x6F, 0x72, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+ 0x70, 0x20, 0x32, 0x32, 0x33, 0x20, 0x2F, 0x67, 0x65, 0x72, 0x6D, 0x61, 0x6E, 0x64, 0x62, 0x6C,
+ 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32, 0x34, 0x20, 0x2F, 0x61,
+ 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32,
+ 0x35, 0x20, 0x2F, 0x61, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+ 0x70, 0x20, 0x32, 0x32, 0x36, 0x20, 0x2F, 0x61, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C,
+ 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32, 0x37, 0x20, 0x2F,
+ 0x61, 0x74, 0x69, 0x6C, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32,
+ 0x32, 0x38, 0x20, 0x2F, 0x61, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75,
+ 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32, 0x39, 0x20, 0x2F, 0x61, 0x72, 0x69, 0x6E, 0x67,
+ 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33, 0x30, 0x20, 0x2F, 0x61, 0x65,
+ 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33, 0x31, 0x20, 0x2F, 0x63, 0x63,
+ 0x65, 0x64, 0x69, 0x6C, 0x6C, 0x61, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32,
+ 0x33, 0x32, 0x20, 0x2F, 0x65, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+ 0x75, 0x70, 0x20, 0x32, 0x33, 0x33, 0x20, 0x2F, 0x65, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33, 0x34, 0x20, 0x2F, 0x65, 0x63, 0x69, 0x72,
+ 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+ 0x32, 0x33, 0x35, 0x20, 0x2F, 0x65, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33, 0x36, 0x20, 0x2F, 0x69, 0x67, 0x72, 0x61,
+ 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33, 0x37, 0x20, 0x2F,
+ 0x69, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32,
+ 0x33, 0x38, 0x20, 0x2F, 0x69, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20,
+ 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33, 0x39, 0x20, 0x2F, 0x69, 0x64, 0x69,
+ 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32,
+ 0x34, 0x30, 0x20, 0x2F, 0x65, 0x74, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+ 0x32, 0x34, 0x31, 0x20, 0x2F, 0x6E, 0x74, 0x69, 0x6C, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D,
+ 0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x32, 0x20, 0x2F, 0x6F, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20,
+ 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x33, 0x20, 0x2F, 0x6F, 0x61, 0x63,
+ 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x34, 0x20,
+ 0x2F, 0x6F, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74,
+ 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x35, 0x20, 0x2F, 0x6F, 0x74, 0x69, 0x6C, 0x64, 0x65,
+ 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x36, 0x20, 0x2F, 0x6F, 0x64,
+ 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+ 0x32, 0x34, 0x37, 0x20, 0x2F, 0x64, 0x69, 0x76, 0x69, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D,
+ 0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x38, 0x20, 0x2F, 0x6F, 0x73, 0x6C, 0x61, 0x73, 0x68, 0x20,
+ 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x39, 0x20, 0x2F, 0x75, 0x67, 0x72,
+ 0x61, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x35, 0x30, 0x20,
+ 0x2F, 0x75, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+ 0x32, 0x35, 0x31, 0x20, 0x2F, 0x75, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78,
+ 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x35, 0x32, 0x20, 0x2F, 0x75, 0x64,
+ 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+ 0x32, 0x35, 0x33, 0x20, 0x2F, 0x79, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D,
+ 0x64, 0x75, 0x70, 0x20, 0x32, 0x35, 0x34, 0x20, 0x2F, 0x74, 0x68, 0x6F, 0x72, 0x6E, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x35, 0x35, 0x20, 0x2F, 0x79, 0x64, 0x69, 0x65,
+ 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x72, 0x65, 0x61, 0x64, 0x6F, 0x6E,
+ 0x6C, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x50, 0x61, 0x69, 0x6E, 0x74, 0x54, 0x79, 0x70,
+ 0x65, 0x20, 0x30, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x54, 0x79, 0x70,
+ 0x65, 0x20, 0x31, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x24, 0x42, 0x6C, 0x65, 0x6E, 0x64, 0x20,
+ 0x7B, 0x20, 0x30, 0x2E, 0x31, 0x33, 0x34, 0x39, 0x20, 0x6D, 0x75, 0x6C, 0x20, 0x65, 0x78, 0x63,
+ 0x68, 0x20, 0x30, 0x2E, 0x33, 0x38, 0x34, 0x39, 0x20, 0x6D, 0x75, 0x6C, 0x20, 0x61, 0x64, 0x64,
+ 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x30, 0x2E, 0x31, 0x36, 0x34, 0x34, 0x20, 0x6D, 0x75, 0x6C,
+ 0x20, 0x61, 0x64, 0x64, 0x20, 0x61, 0x64, 0x64, 0x20, 0x7D, 0x20, 0x62, 0x69, 0x6E, 0x64, 0x20,
+ 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x4D, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20,
+ 0x5B, 0x20, 0x30, 0x2E, 0x30, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x20, 0x30, 0x20, 0x30, 0x20,
+ 0x30, 0x2E, 0x30, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x20, 0x30, 0x20, 0x30, 0x20, 0x5D, 0x20,
+ 0x72, 0x65, 0x61, 0x64, 0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x46, 0x6F,
+ 0x6E, 0x74, 0x42, 0x42, 0x6F, 0x78, 0x20, 0x7B, 0x2D, 0x31, 0x31, 0x39, 0x20, 0x2D, 0x32, 0x35,
+ 0x37, 0x20, 0x31, 0x31, 0x35, 0x30, 0x20, 0x38, 0x37, 0x32, 0x7D, 0x20, 0x72, 0x65, 0x61, 0x64,
+ 0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x42, 0x6C, 0x65, 0x6E, 0x64, 0x20,
+ 0x33, 0x20, 0x64, 0x69, 0x63, 0x74, 0x20, 0x64, 0x75, 0x70, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6E,
+ 0x0D, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x42, 0x42, 0x6F, 0x78, 0x20, 0x7B, 0x7B, 0x20, 0x2D, 0x35,
+ 0x35, 0x20, 0x2D, 0x31, 0x31, 0x32, 0x20, 0x2D, 0x31, 0x36, 0x32, 0x20, 0x2D, 0x31, 0x34, 0x35,
+ 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x2D, 0x32, 0x35, 0x37, 0x20, 0x2D, 0x32, 0x35, 0x37, 0x20, 0x2D,
+ 0x32, 0x35, 0x37, 0x20, 0x2D, 0x32, 0x35, 0x37, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x34, 0x32, 0x34,
+ 0x20, 0x31, 0x31, 0x35, 0x36, 0x20, 0x31, 0x33, 0x38, 0x39, 0x20, 0x31, 0x39, 0x38, 0x31, 0x20,
+ 0x7D, 0x20, 0x7B, 0x20, 0x38, 0x37, 0x32, 0x20, 0x38, 0x37, 0x32, 0x20, 0x38, 0x37, 0x32, 0x20,
+ 0x38, 0x37, 0x32, 0x20, 0x7D, 0x7D, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x50, 0x72, 0x69, 0x76,
+ 0x61, 0x74, 0x65, 0x20, 0x31, 0x34, 0x20, 0x64, 0x69, 0x63, 0x74, 0x20, 0x64, 0x65, 0x66, 0x0D,
+ 0x65, 0x6E, 0x64, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x25, 0x20, 0x43, 0x6F, 0x70, 0x79, 0x72, 0x69,
+ 0x67, 0x68, 0x74, 0x20, 0x28, 0x63, 0x29, 0x20, 0x31, 0x39, 0x39, 0x30, 0x2D, 0x31, 0x39, 0x39,
+ 0x34, 0x20, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x73, 0x20,
+ 0x49, 0x6E, 0x63, 0x6F, 0x72, 0x70, 0x6F, 0x72, 0x61, 0x74, 0x65, 0x64, 0x0D, 0x25, 0x20, 0x41,
+ 0x6C, 0x6C, 0x20, 0x52, 0x69, 0x67, 0x68, 0x74, 0x73, 0x20, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76,
+ 0x65, 0x64, 0x2E, 0x0D, 0x2F, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x64, 0x69, 0x63, 0x74, 0x20,
+ 0x77, 0x68, 0x65, 0x72, 0x65, 0x0D, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x63, 0x75, 0x72, 0x72,
+ 0x65, 0x6E, 0x74, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x7B, 0x20, 0x73, 0x65, 0x74, 0x73,
+ 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x7D, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x73, 0x65, 0x74,
+ 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x64, 0x69, 0x63,
+ 0x74, 0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x7B, 0x20, 0x7D, 0x20, 0x75, 0x73, 0x65, 0x72, 0x64, 0x69,
+ 0x63, 0x74, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x64, 0x75, 0x70, 0x0D,
+ 0x2F, 0x6D, 0x61, 0x6B, 0x65, 0x62, 0x6C, 0x65, 0x6E, 0x64, 0x65, 0x64, 0x66, 0x6F, 0x6E, 0x74,
+ 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x7B, 0x20, 0x2F, 0x6D, 0x61, 0x6B, 0x65, 0x62, 0x6C,
+ 0x65, 0x6E, 0x64, 0x65, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x67, 0x65, 0x74, 0x20, 0x64, 0x75,
+ 0x70, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x2F, 0x6F, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6F, 0x72,
+ 0x74, 0x79, 0x70, 0x65, 0x20, 0x65, 0x71, 0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x66, 0x61,
+ 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x30, 0x20, 0x67, 0x65, 0x74, 0x20, 0x64, 0x75,
+ 0x70, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x2F, 0x69, 0x6E, 0x74, 0x65, 0x67, 0x65, 0x72, 0x74,
+ 0x79, 0x70, 0x65, 0x20, 0x6E, 0x65, 0x0D, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x66, 0x61, 0x6C,
+ 0x73, 0x65, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x31, 0x31, 0x20, 0x6C, 0x74, 0x20, 0x7D, 0x20, 0x69,
+ 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D,
+ 0x20, 0x7B, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65,
+ 0x0D, 0x7B, 0x20, 0x2F, 0x6D, 0x61, 0x6B, 0x65, 0x62, 0x6C, 0x65, 0x6E, 0x64, 0x65, 0x64, 0x66,
+ 0x6F, 0x6E, 0x74, 0x20, 0x7B, 0x0D, 0x31, 0x31, 0x20, 0x70, 0x6F, 0x70, 0x0D, 0x32, 0x20, 0x63,
+ 0x6F, 0x70, 0x79, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20,
+ 0x2F, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x56, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x20, 0x67, 0x65,
+ 0x74, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x65, 0x71, 0x0D, 0x7B, 0x20, 0x64, 0x75,
+ 0x70, 0x20, 0x30, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x7B, 0x20, 0x61, 0x64, 0x64, 0x20, 0x7D,
+ 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x20, 0x31, 0x20, 0x73, 0x75, 0x62, 0x20, 0x61, 0x62,
+ 0x73, 0x20, 0x2E, 0x30, 0x30, 0x31, 0x20, 0x67, 0x74, 0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x74, 0x72,
+ 0x75, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7B, 0x20, 0x2F, 0x6D,
+ 0x61, 0x6B, 0x65, 0x62, 0x6C, 0x65, 0x6E, 0x64, 0x65, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x63,
+ 0x76, 0x78, 0x20, 0x65, 0x72, 0x72, 0x6F, 0x72, 0x64, 0x69, 0x63, 0x74, 0x20, 0x2F, 0x72, 0x61,
+ 0x6E, 0x67, 0x65, 0x63, 0x68, 0x65, 0x63, 0x6B, 0x20, 0x67, 0x65, 0x74, 0x20, 0x65, 0x78, 0x65,
+ 0x63, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x0D, 0x65, 0x78, 0x63, 0x68, 0x20, 0x64, 0x75, 0x70, 0x20,
+ 0x64, 0x75, 0x70, 0x20, 0x6D, 0x61, 0x78, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x64, 0x69,
+ 0x63, 0x74, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6E, 0x20, 0x7B, 0x0D, 0x66, 0x61, 0x6C, 0x73, 0x65,
+ 0x20, 0x7B, 0x20, 0x2F, 0x46, 0x49, 0x44, 0x20, 0x2F, 0x55, 0x6E, 0x69, 0x71, 0x75, 0x65, 0x49,
+ 0x44, 0x20, 0x2F, 0x58, 0x55, 0x49, 0x44, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x33, 0x20, 0x69, 0x6E,
+ 0x64, 0x65, 0x78, 0x20, 0x65, 0x71, 0x20, 0x6F, 0x72, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61,
+ 0x6C, 0x6C, 0x0D, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x7B,
+ 0x20, 0x64, 0x65, 0x66, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20,
+ 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x0D, 0x2F, 0x58, 0x55, 0x49, 0x44, 0x20, 0x32, 0x20, 0x63,
+ 0x6F, 0x70, 0x79, 0x20, 0x6B, 0x6E, 0x6F, 0x77, 0x6E, 0x20, 0x7B, 0x0D, 0x67, 0x65, 0x74, 0x20,
+ 0x64, 0x75, 0x70, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64,
+ 0x65, 0x78, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x73, 0x75, 0x62, 0x20, 0x64, 0x75,
+ 0x70, 0x20, 0x30, 0x20, 0x67, 0x74, 0x20, 0x7B, 0x0D, 0x65, 0x78, 0x63, 0x68, 0x20, 0x64, 0x75,
+ 0x70, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x63,
+ 0x6F, 0x70, 0x79, 0x0D, 0x65, 0x78, 0x63, 0x68, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78,
+ 0x20, 0x7B, 0x20, 0x36, 0x35, 0x35, 0x33, 0x36, 0x20, 0x6D, 0x75, 0x6C, 0x20, 0x63, 0x76, 0x69,
+ 0x20, 0x33, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x70, 0x75, 0x74, 0x20, 0x70, 0x6F, 0x70, 0x20,
+ 0x31, 0x20, 0x61, 0x64, 0x64, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x20, 0x70,
+ 0x6F, 0x70, 0x20, 0x2F, 0x58, 0x55, 0x49, 0x44, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x64, 0x65,
+ 0x66, 0x0D, 0x7D, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20,
+ 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70,
+ 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7B, 0x20, 0x2F, 0x50,
+ 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x49, 0x6E, 0x66, 0x6F,
+ 0x20, 0x7D, 0x20, 0x7B, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x6C, 0x6F, 0x61, 0x64, 0x20, 0x64, 0x75,
+ 0x70, 0x20, 0x6D, 0x61, 0x78, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x64, 0x69, 0x63, 0x74,
+ 0x20, 0x62, 0x65, 0x67, 0x69, 0x6E, 0x20, 0x7B, 0x0D, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x7B,
+ 0x20, 0x2F, 0x55, 0x6E, 0x69, 0x71, 0x75, 0x65, 0x49, 0x44, 0x20, 0x2F, 0x58, 0x55, 0x49, 0x44,
+ 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x71, 0x20,
+ 0x6F, 0x72, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x0D, 0x7B, 0x20, 0x70, 0x6F,
+ 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x64, 0x65, 0x66, 0x20, 0x7D, 0x20,
+ 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x20,
+ 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x64, 0x69, 0x63, 0x74, 0x20, 0x65, 0x6E, 0x64, 0x20,
+ 0x64, 0x65, 0x66, 0x0D, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x0D, 0x64, 0x75, 0x70,
+ 0x20, 0x2F, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x56, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x20, 0x65,
+ 0x78, 0x63, 0x68, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x2F, 0x24, 0x42, 0x6C,
+ 0x65, 0x6E, 0x64, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x5B, 0x0D, 0x65, 0x78, 0x63, 0x68, 0x20,
+ 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x65, 0x78, 0x63, 0x68, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x6C,
+ 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x31, 0x20, 0x73, 0x75, 0x62, 0x20, 0x2D, 0x31, 0x20, 0x31,
+ 0x20, 0x7B, 0x0D, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x64, 0x75, 0x70, 0x20, 0x6C,
+ 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x33, 0x20, 0x2D, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x20,
+ 0x73, 0x75, 0x62, 0x20, 0x67, 0x65, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x30, 0x20, 0x65, 0x71,
+ 0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x7B,
+ 0x20, 0x2F, 0x65, 0x78, 0x63, 0x68, 0x20, 0x6C, 0x6F, 0x61, 0x64, 0x20, 0x33, 0x20, 0x31, 0x20,
+ 0x72, 0x6F, 0x6C, 0x6C, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x0D, 0x2F, 0x70, 0x6F, 0x70, 0x20, 0x6C,
+ 0x6F, 0x61, 0x64, 0x20, 0x33, 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x0D, 0x7D, 0x20, 0x7B,
+ 0x20, 0x64, 0x75, 0x70, 0x20, 0x31, 0x20, 0x65, 0x71, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20,
+ 0x7D, 0x0D, 0x7B, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x7B, 0x20, 0x2F, 0x65,
+ 0x78, 0x63, 0x68, 0x20, 0x6C, 0x6F, 0x61, 0x64, 0x20, 0x34, 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C,
+ 0x6C, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x0D, 0x33, 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x20,
+ 0x2F, 0x6D, 0x75, 0x6C, 0x20, 0x6C, 0x6F, 0x61, 0x64, 0x20, 0x33, 0x20, 0x31, 0x20, 0x72, 0x6F,
+ 0x6C, 0x6C, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x31, 0x20, 0x69, 0x6E,
+ 0x64, 0x65, 0x78, 0x20, 0x7B, 0x20, 0x2F, 0x61, 0x64, 0x64, 0x20, 0x6C, 0x6F, 0x61, 0x64, 0x20,
+ 0x33, 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x0D, 0x65, 0x78,
+ 0x63, 0x68, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x65, 0x78, 0x63, 0x68,
+ 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x0D,
+ 0x70, 0x6F, 0x70, 0x20, 0x7B, 0x20, 0x2F, 0x61, 0x64, 0x64, 0x20, 0x6C, 0x6F, 0x61, 0x64, 0x20,
+ 0x7D, 0x20, 0x69, 0x66, 0x0D, 0x5D, 0x20, 0x63, 0x76, 0x78, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x7B,
+ 0x20, 0x32, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x65,
+ 0x78, 0x63, 0x68, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x6E, 0x65, 0x20, 0x7B, 0x20,
+ 0x2F, 0x6D, 0x61, 0x6B, 0x65, 0x62, 0x6C, 0x65, 0x6E, 0x64, 0x65, 0x64, 0x66, 0x6F, 0x6E, 0x74,
+ 0x20, 0x63, 0x76, 0x78, 0x20, 0x65, 0x72, 0x72, 0x6F, 0x72, 0x64, 0x69, 0x63, 0x74, 0x20, 0x2F,
+ 0x74, 0x79, 0x70, 0x65, 0x63, 0x68, 0x65, 0x63, 0x6B, 0x20, 0x67, 0x65, 0x74, 0x20, 0x65, 0x78,
+ 0x65, 0x63, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x0D, 0x30, 0x20, 0x30, 0x20, 0x31, 0x20, 0x33, 0x20,
+ 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x31, 0x20, 0x73,
+ 0x75, 0x62, 0x20, 0x7B, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78,
+ 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x33,
+ 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20,
+ 0x6D, 0x75, 0x6C, 0x20, 0x61, 0x64, 0x64, 0x0D, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x0D, 0x65, 0x78,
+ 0x63, 0x68, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x70, 0x6F, 0x70, 0x20,
+ 0x7D, 0x0D, 0x7B, 0x20, 0x7B, 0x20, 0x64, 0x75, 0x70, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x64,
+ 0x75, 0x70, 0x20, 0x64, 0x75, 0x70, 0x20, 0x2F, 0x61, 0x72, 0x72, 0x61, 0x79, 0x74, 0x79, 0x70,
+ 0x65, 0x20, 0x65, 0x71, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x2F, 0x70, 0x61, 0x63, 0x6B, 0x65,
+ 0x64, 0x61, 0x72, 0x72, 0x61, 0x79, 0x74, 0x79, 0x70, 0x65, 0x20, 0x65, 0x71, 0x20, 0x6F, 0x72,
+ 0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x2F,
+ 0x46, 0x6F, 0x72, 0x63, 0x65, 0x42, 0x6F, 0x6C, 0x64, 0x20, 0x65, 0x71, 0x20, 0x7B, 0x0D, 0x35,
+ 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x30, 0x20, 0x30, 0x20, 0x31, 0x20, 0x33, 0x20, 0x69,
+ 0x6E, 0x64, 0x65, 0x78, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x31, 0x20, 0x73, 0x75,
+ 0x62, 0x20, 0x7B, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20,
+ 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20, 0x7B, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64,
+ 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20, 0x61, 0x64, 0x64, 0x20,
+ 0x7D, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65,
+ 0x0D, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x70, 0x6F, 0x70, 0x20,
+ 0x65, 0x78, 0x63, 0x68, 0x20, 0x70, 0x6F, 0x70, 0x0D, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78,
+ 0x20, 0x2F, 0x46, 0x6F, 0x72, 0x63, 0x65, 0x42, 0x6F, 0x6C, 0x64, 0x54, 0x68, 0x72, 0x65, 0x73,
+ 0x68, 0x6F, 0x6C, 0x64, 0x20, 0x67, 0x65, 0x74, 0x20, 0x67, 0x74, 0x20, 0x33, 0x20, 0x63, 0x6F,
+ 0x70, 0x79, 0x20, 0x7D, 0x20, 0x7B, 0x0D, 0x7B, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20,
+ 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x6E,
+ 0x65, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20,
+ 0x7B, 0x0D, 0x74, 0x72, 0x75, 0x65, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x7B, 0x20, 0x74, 0x79,
+ 0x70, 0x65, 0x20, 0x64, 0x75, 0x70, 0x20, 0x2F, 0x69, 0x6E, 0x74, 0x65, 0x67, 0x65, 0x72, 0x74,
+ 0x79, 0x70, 0x65, 0x20, 0x65, 0x71, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x2F, 0x72, 0x65, 0x61,
+ 0x6C, 0x74, 0x79, 0x70, 0x65, 0x20, 0x65, 0x71, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x6F, 0x72,
+ 0x20, 0x61, 0x6E, 0x64, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x0D, 0x7D, 0x20,
+ 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x0D, 0x32, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20,
+ 0x38, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x65, 0x78, 0x65,
+ 0x63, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x35, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20,
+ 0x35, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x7D, 0x0D, 0x7B,
+ 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x64, 0x75, 0x70, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68,
+ 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x78,
+ 0x63, 0x68, 0x65, 0x63, 0x6B, 0x20, 0x7B, 0x20, 0x63, 0x76, 0x78, 0x20, 0x7D, 0x20, 0x69, 0x66,
+ 0x0D, 0x64, 0x75, 0x70, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x31, 0x20, 0x73, 0x75,
+ 0x62, 0x20, 0x30, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x31, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20,
+ 0x7B, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78,
+ 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20, 0x64, 0x75, 0x70, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20,
+ 0x64, 0x75, 0x70, 0x20, 0x2F, 0x61, 0x72, 0x72, 0x61, 0x79, 0x74, 0x79, 0x70, 0x65, 0x20, 0x65,
+ 0x71, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x2F, 0x70, 0x61, 0x63, 0x6B, 0x65, 0x64, 0x61, 0x72,
+ 0x72, 0x61, 0x79, 0x74, 0x79, 0x70, 0x65, 0x20, 0x65, 0x71, 0x20, 0x6F, 0x72, 0x20, 0x7B, 0x0D,
+ 0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x36, 0x20, 0x69,
+ 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x7B, 0x0D, 0x39, 0x20, 0x69, 0x6E,
+ 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x39, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78,
+ 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x20,
+ 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x33, 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C,
+ 0x20, 0x70, 0x75, 0x74, 0x0D, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20,
+ 0x70, 0x6F, 0x70, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x70, 0x6F, 0x70, 0x0D, 0x7D, 0x20, 0x69,
+ 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x33, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x0D, 0x31, 0x20, 0x69,
+ 0x6E, 0x64, 0x65, 0x78, 0x20, 0x64, 0x75, 0x70, 0x20, 0x2F, 0x53, 0x74, 0x65, 0x6D, 0x53, 0x6E,
+ 0x61, 0x70, 0x48, 0x20, 0x65, 0x71, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x2F, 0x53, 0x74, 0x65,
+ 0x6D, 0x53, 0x6E, 0x61, 0x70, 0x56, 0x20, 0x65, 0x71, 0x20, 0x6F, 0x72, 0x20, 0x7B, 0x0D, 0x64,
+ 0x75, 0x70, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x31, 0x20, 0x73, 0x75, 0x62, 0x20,
+ 0x7B, 0x20, 0x64, 0x75, 0x70, 0x20, 0x30, 0x20, 0x6C, 0x65, 0x20, 0x7B, 0x20, 0x65, 0x78, 0x69,
+ 0x74, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x64, 0x75, 0x70, 0x20, 0x31,
+ 0x20, 0x73, 0x75, 0x62, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63,
+ 0x68, 0x20, 0x67, 0x65, 0x74, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64,
+ 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20, 0x32, 0x20, 0x63, 0x6F,
+ 0x70, 0x79, 0x20, 0x65, 0x71, 0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x32, 0x20, 0x69, 0x6E,
+ 0x64, 0x65, 0x78, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x30, 0x20, 0x70, 0x75,
+ 0x74, 0x20, 0x30, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x20, 0x6C, 0x65, 0x20, 0x7B, 0x20, 0x31, 0x20,
+ 0x73, 0x75, 0x62, 0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x64, 0x75, 0x70, 0x20, 0x64, 0x75, 0x70, 0x20,
+ 0x31, 0x20, 0x73, 0x75, 0x62, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78,
+ 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x33, 0x20, 0x69, 0x6E,
+ 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x0D, 0x33, 0x20, 0x69,
+ 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65,
+ 0x78, 0x20, 0x31, 0x20, 0x73, 0x75, 0x62, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x70, 0x75, 0x74,
+ 0x0D, 0x33, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x70, 0x75, 0x74, 0x20, 0x70, 0x6F, 0x70, 0x0D,
+ 0x32, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x6C, 0x65, 0x6E, 0x67,
+ 0x74, 0x68, 0x20, 0x31, 0x20, 0x73, 0x75, 0x62, 0x20, 0x6C, 0x74, 0x20, 0x7B, 0x20, 0x31, 0x20,
+ 0x61, 0x64, 0x64, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73,
+ 0x65, 0x20, 0x7D, 0x20, 0x6C, 0x6F, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x0D, 0x64, 0x75, 0x70,
+ 0x20, 0x30, 0x20, 0x67, 0x65, 0x74, 0x20, 0x30, 0x20, 0x6C, 0x65, 0x20, 0x7B, 0x0D, 0x64, 0x75,
+ 0x70, 0x20, 0x30, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x7B, 0x20, 0x30, 0x20, 0x67, 0x74, 0x20,
+ 0x7B, 0x20, 0x65, 0x78, 0x69, 0x74, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x20, 0x31, 0x20, 0x61, 0x64,
+ 0x64, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32,
+ 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x65, 0x78,
+ 0x63, 0x68, 0x20, 0x73, 0x75, 0x62, 0x20, 0x67, 0x65, 0x74, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x76,
+ 0x61, 0x6C, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x20, 0x7D, 0x20, 0x69,
+ 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x70, 0x75, 0x74, 0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x2F, 0x64,
+ 0x69, 0x63, 0x74, 0x74, 0x79, 0x70, 0x65, 0x20, 0x65, 0x71, 0x20, 0x7B, 0x20, 0x36, 0x20, 0x63,
+ 0x6F, 0x70, 0x79, 0x20, 0x33, 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x20, 0x67, 0x65, 0x74,
+ 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78,
+ 0x65, 0x63, 0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x2F, 0x6D, 0x61, 0x6B, 0x65, 0x62, 0x6C, 0x65, 0x6E,
+ 0x64, 0x65, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x63, 0x76, 0x78, 0x20, 0x65, 0x72, 0x72, 0x6F,
+ 0x72, 0x64, 0x69, 0x63, 0x74, 0x20, 0x2F, 0x74, 0x79, 0x70, 0x65, 0x63, 0x68, 0x65, 0x63, 0x6B,
+ 0x20, 0x67, 0x65, 0x74, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C,
+ 0x73, 0x65, 0x0D, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x70, 0x6F, 0x70, 0x20,
+ 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x20, 0x70, 0x6F, 0x70,
+ 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x0D, 0x63,
+ 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x64, 0x69, 0x63, 0x74, 0x20, 0x42, 0x6C, 0x65, 0x6E, 0x64,
+ 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x65, 0x63, 0x0D, 0x63, 0x75,
+ 0x72, 0x72, 0x65, 0x6E, 0x74, 0x64, 0x69, 0x63, 0x74, 0x20, 0x65, 0x6E, 0x64, 0x0D, 0x7D, 0x20,
+ 0x62, 0x69, 0x6E, 0x64, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x2F, 0x24, 0x66, 0x62, 0x66, 0x20, 0x7B,
+ 0x20, 0x46, 0x6F, 0x6E, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x79, 0x20, 0x63,
+ 0x6F, 0x75, 0x6E, 0x74, 0x74, 0x6F, 0x6D, 0x61, 0x72, 0x6B, 0x20, 0x33, 0x20, 0x61, 0x64, 0x64,
+ 0x20, 0x2D, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x20, 0x6B, 0x6E, 0x6F, 0x77, 0x6E, 0x20, 0x7B,
+ 0x0D, 0x63, 0x6C, 0x65, 0x61, 0x72, 0x74, 0x6F, 0x6D, 0x61, 0x72, 0x6B, 0x20, 0x70, 0x6F, 0x70,
+ 0x20, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x7D, 0x20, 0x7B, 0x0D, 0x5D, 0x20,
+ 0x65, 0x78, 0x63, 0x68, 0x20, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x65, 0x78,
+ 0x63, 0x68, 0x20, 0x6D, 0x61, 0x6B, 0x65, 0x62, 0x6C, 0x65, 0x6E, 0x64, 0x65, 0x64, 0x66, 0x6F,
+ 0x6E, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x2F, 0x45, 0x6E, 0x63, 0x6F, 0x64, 0x69, 0x6E, 0x67,
+ 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x2F, 0x45, 0x6E,
+ 0x63, 0x6F, 0x64, 0x69, 0x6E, 0x67, 0x20, 0x67, 0x65, 0x74, 0x20, 0x70, 0x75, 0x74, 0x20, 0x64,
+ 0x65, 0x66, 0x69, 0x6E, 0x65, 0x66, 0x6F, 0x6E, 0x74, 0x0D, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C,
+ 0x73, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x2F,
+ 0x53, 0x63, 0x61, 0x6C, 0x65, 0x4D, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x67, 0x65, 0x74, 0x20,
+ 0x6D, 0x61, 0x6B, 0x65, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x73, 0x65, 0x74, 0x66, 0x6F, 0x6E, 0x74,
+ 0x0D, 0x7D, 0x20, 0x62, 0x69, 0x6E, 0x64, 0x20, 0x70, 0x75, 0x74, 0x20, 0x7D, 0x20, 0x7B, 0x20,
+ 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65,
+ 0x20, 0x65, 0x78, 0x65, 0x63, 0x0D, 0x2F, 0x4E, 0x6F, 0x72, 0x6D, 0x61, 0x6C, 0x69, 0x7A, 0x65,
+ 0x44, 0x65, 0x73, 0x69, 0x67, 0x6E, 0x56, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x20, 0x7B, 0x0D, 0x65,
+ 0x78, 0x63, 0x68, 0x20, 0x35, 0x30, 0x20, 0x73, 0x75, 0x62, 0x20, 0x31, 0x34, 0x30, 0x30, 0x20,
+ 0x64, 0x69, 0x76, 0x0D, 0x65, 0x78, 0x63, 0x68, 0x20, 0x35, 0x30, 0x20, 0x73, 0x75, 0x62, 0x20,
+ 0x31, 0x34, 0x30, 0x30, 0x20, 0x64, 0x69, 0x76, 0x0D, 0x7D, 0x20, 0x62, 0x69, 0x6E, 0x64, 0x20,
+ 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x43, 0x6F, 0x6E, 0x76, 0x65, 0x72, 0x74, 0x44, 0x65, 0x73, 0x69,
+ 0x67, 0x6E, 0x56, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x20, 0x7B, 0x0D, 0x31, 0x20, 0x32, 0x20, 0x69,
+ 0x6E, 0x64, 0x65, 0x78, 0x20, 0x73, 0x75, 0x62, 0x20, 0x31, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64,
+ 0x65, 0x78, 0x20, 0x73, 0x75, 0x62, 0x20, 0x6D, 0x75, 0x6C, 0x20, 0x33, 0x20, 0x31, 0x20, 0x72,
+ 0x6F, 0x6C, 0x6C, 0x0D, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x31, 0x20, 0x32, 0x20,
+ 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x73, 0x75, 0x62, 0x20, 0x6D, 0x75, 0x6C, 0x20, 0x33, 0x20,
+ 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x0D, 0x31, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78,
+ 0x20, 0x73, 0x75, 0x62, 0x20, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x6D, 0x75, 0x6C,
+ 0x20, 0x33, 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x0D, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65,
+ 0x78, 0x20, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x6D, 0x75, 0x6C, 0x20, 0x33, 0x20,
+ 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D,
+ 0x20, 0x62, 0x69, 0x6E, 0x64, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x24, 0x6D, 0x6D, 0x66, 0x66,
+ 0x5F, 0x6F, 0x72, 0x69, 0x67, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x77, 0x68,
+ 0x65, 0x72, 0x65, 0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x73, 0x61, 0x76, 0x65, 0x20, 0x7B,
+ 0x20, 0x72, 0x65, 0x73, 0x74, 0x6F, 0x72, 0x65, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70,
+ 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x0D, 0x7D, 0x20, 0x7B, 0x20, 0x7B, 0x20, 0x7D, 0x20, 0x7B,
+ 0x20, 0x64, 0x65, 0x66, 0x20, 0x7D, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D,
+ 0x2F, 0x73, 0x65, 0x74, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65,
+ 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x7D, 0x20, 0x7B, 0x20,
+ 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x2F,
+ 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x70,
+ 0x6F, 0x70, 0x20, 0x64, 0x75, 0x70, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x64, 0x69, 0x63,
+ 0x74, 0x20, 0x65, 0x71, 0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x7B, 0x20, 0x63, 0x75, 0x72,
+ 0x72, 0x65, 0x6E, 0x74, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x7B, 0x20, 0x7B, 0x20, 0x7D,
+ 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x73, 0x65, 0x74, 0x73, 0x68, 0x61,
+ 0x72, 0x65, 0x64, 0x20, 0x7B, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x73, 0x65, 0x74, 0x73,
+ 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x7D, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65,
+ 0x20, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x64, 0x69, 0x63, 0x74, 0x0D, 0x7D, 0x20, 0x7B, 0x20,
+ 0x7B, 0x20, 0x7D, 0x20, 0x75, 0x73, 0x65, 0x72, 0x64, 0x69, 0x63, 0x74, 0x20, 0x7D, 0x20, 0x69,
+ 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6E, 0x0D, 0x7D, 0x20, 0x7B, 0x20,
+ 0x62, 0x65, 0x67, 0x69, 0x6E, 0x20, 0x7B, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x64,
+ 0x69, 0x63, 0x74, 0x20, 0x73, 0x63, 0x68, 0x65, 0x63, 0x6B, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x66,
+ 0x61, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7B, 0x0D,
+ 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x7B, 0x20,
+ 0x7B, 0x20, 0x7D, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x73, 0x65, 0x74,
+ 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x7B, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x73,
+ 0x65, 0x74, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x7D, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65,
+ 0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20, 0x7B, 0x20, 0x7B, 0x20, 0x7D, 0x20, 0x7D, 0x20, 0x69, 0x66,
+ 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x2F, 0x24,
+ 0x6D, 0x6D, 0x66, 0x66, 0x5F, 0x6F, 0x72, 0x69, 0x67, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E,
+ 0x74, 0x20, 0x2F, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x6C, 0x6F, 0x61, 0x64,
+ 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x65, 0x63, 0x0D, 0x2F, 0x66,
+ 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x7B, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x46, 0x6F,
+ 0x6E, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x79, 0x20, 0x65, 0x78, 0x63, 0x68,
+ 0x20, 0x6B, 0x6E, 0x6F, 0x77, 0x6E, 0x0D, 0x7B, 0x20, 0x64, 0x75, 0x70, 0x20, 0x46, 0x6F, 0x6E,
+ 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x79, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20,
+ 0x67, 0x65, 0x74, 0x20, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x54, 0x79, 0x70, 0x65, 0x20, 0x67, 0x65,
+ 0x74, 0x20, 0x33, 0x20, 0x6E, 0x65, 0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x64, 0x75, 0x70, 0x20, 0x53,
+ 0x68, 0x61, 0x72, 0x65, 0x64, 0x46, 0x6F, 0x6E, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F,
+ 0x72, 0x79, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x6B, 0x6E, 0x6F, 0x77, 0x6E, 0x0D, 0x7B, 0x20,
+ 0x64, 0x75, 0x70, 0x20, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, 0x46, 0x6F, 0x6E, 0x74, 0x44, 0x69,
+ 0x72, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x79, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74,
+ 0x20, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x54, 0x79, 0x70, 0x65, 0x20, 0x67, 0x65, 0x74, 0x20, 0x33,
+ 0x20, 0x6E, 0x65, 0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20,
+ 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D,
+ 0x7B, 0x20, 0x24, 0x6D, 0x6D, 0x66, 0x66, 0x5F, 0x6F, 0x72, 0x69, 0x67, 0x66, 0x69, 0x6E, 0x64,
+ 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x64, 0x75, 0x70, 0x20, 0x64, 0x75, 0x70,
+ 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x20, 0x63,
+ 0x76, 0x73, 0x20, 0x28, 0x5F, 0x29, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x7B, 0x0D,
+ 0x63, 0x76, 0x6E, 0x20, 0x64, 0x75, 0x70, 0x20, 0x64, 0x75, 0x70, 0x20, 0x46, 0x6F, 0x6E, 0x74,
+ 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x79, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x6B,
+ 0x6E, 0x6F, 0x77, 0x6E, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64,
+ 0x46, 0x6F, 0x6E, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x79, 0x20, 0x65, 0x78,
+ 0x63, 0x68, 0x20, 0x6B, 0x6E, 0x6F, 0x77, 0x6E, 0x20, 0x6F, 0x72, 0x20, 0x7B, 0x0D, 0x74, 0x72,
+ 0x75, 0x65, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x64, 0x75, 0x70, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74,
+ 0x68, 0x20, 0x37, 0x20, 0x61, 0x64, 0x64, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x20, 0x64,
+ 0x75, 0x70, 0x20, 0x30, 0x20, 0x28, 0x25, 0x66, 0x6F, 0x6E, 0x74, 0x25, 0x29, 0x20, 0x70, 0x75,
+ 0x74, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6C, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x20,
+ 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x36, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x64, 0x75, 0x70,
+ 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x20, 0x63,
+ 0x76, 0x73, 0x20, 0x70, 0x75, 0x74, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6C, 0x0D, 0x7B,
+ 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x7D, 0x20, 0x73, 0x74, 0x6F, 0x70, 0x70, 0x65,
+ 0x64, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20,
+ 0x69, 0x66, 0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70,
+ 0x20, 0x70, 0x6F, 0x70, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x66, 0x61,
+ 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69,
+ 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7B, 0x0D, 0x24, 0x6D, 0x6D, 0x66, 0x66, 0x5F, 0x6F, 0x72,
+ 0x69, 0x67, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6E,
+ 0x20, 0x70, 0x6F, 0x70, 0x0D, 0x5B, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x7B, 0x20, 0x28, 0x5F,
+ 0x29, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x7B, 0x20, 0x7B, 0x20, 0x63, 0x76, 0x72,
+ 0x20, 0x7D, 0x20, 0x73, 0x74, 0x6F, 0x70, 0x70, 0x65, 0x64, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70,
+ 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x7B, 0x0D, 0x65, 0x78, 0x63, 0x68, 0x20, 0x70, 0x6F,
+ 0x70, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D,
+ 0x7D, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x65, 0x78, 0x69, 0x74, 0x20, 0x7D, 0x20, 0x69,
+ 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x6C, 0x6F, 0x6F, 0x70, 0x20, 0x66, 0x61, 0x6C,
+ 0x73, 0x65, 0x20, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x49, 0x6E, 0x66, 0x6F, 0x20, 0x77, 0x68, 0x65,
+ 0x72, 0x65, 0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x46, 0x6F, 0x6E, 0x74, 0x49, 0x6E, 0x66,
+ 0x6F, 0x20, 0x2F, 0x42, 0x6C, 0x65, 0x6E, 0x64, 0x41, 0x78, 0x69, 0x73, 0x54, 0x79, 0x70, 0x65,
+ 0x73, 0x20, 0x32, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x6B, 0x6E, 0x6F, 0x77, 0x6E, 0x20, 0x7B,
+ 0x0D, 0x67, 0x65, 0x74, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x63, 0x6F, 0x75, 0x6E,
+ 0x74, 0x74, 0x6F, 0x6D, 0x61, 0x72, 0x6B, 0x20, 0x32, 0x20, 0x73, 0x75, 0x62, 0x20, 0x65, 0x71,
+ 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x70, 0x6F, 0x70, 0x0D, 0x7D, 0x20, 0x7B, 0x20, 0x70, 0x6F,
+ 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D,
+ 0x20, 0x69, 0x66, 0x20, 0x7B, 0x0D, 0x4E, 0x6F, 0x72, 0x6D, 0x61, 0x6C, 0x69, 0x7A, 0x65, 0x44,
+ 0x65, 0x73, 0x69, 0x67, 0x6E, 0x56, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x0D, 0x43, 0x6F, 0x6E, 0x76,
+ 0x65, 0x72, 0x74, 0x44, 0x65, 0x73, 0x69, 0x67, 0x6E, 0x56, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x0D,
+ 0x5D, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x64, 0x69, 0x63, 0x74, 0x20, 0x65, 0x78,
+ 0x63, 0x68, 0x20, 0x6D, 0x61, 0x6B, 0x65, 0x62, 0x6C, 0x65, 0x6E, 0x64, 0x65, 0x64, 0x66, 0x6F,
+ 0x6E, 0x74, 0x0D, 0x32, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x2F,
+ 0x46, 0x6F, 0x6E, 0x74, 0x4E, 0x61, 0x6D, 0x65, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x70, 0x75,
+ 0x74, 0x0D, 0x64, 0x65, 0x66, 0x69, 0x6E, 0x65, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x7D, 0x20, 0x7B,
+ 0x20, 0x63, 0x6C, 0x65, 0x61, 0x72, 0x74, 0x6F, 0x6D, 0x61, 0x72, 0x6B, 0x20, 0x24, 0x6D, 0x6D,
+ 0x66, 0x66, 0x5F, 0x6F, 0x72, 0x69, 0x67, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20,
+ 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x65, 0x6E, 0x64, 0x0D, 0x7D, 0x20, 0x7B,
+ 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x24, 0x6D, 0x6D,
+ 0x66, 0x66, 0x5F, 0x6F, 0x72, 0x69, 0x67, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20,
+ 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70,
+ 0x20, 0x24, 0x6D, 0x6D, 0x66, 0x66, 0x5F, 0x6F, 0x72, 0x69, 0x67, 0x66, 0x69, 0x6E, 0x64, 0x66,
+ 0x6F, 0x6E, 0x74, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69,
+ 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20, 0x62, 0x69, 0x6E, 0x64, 0x20, 0x33, 0x20, 0x69,
+ 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x65, 0x63, 0x0D, 0x2F, 0x53, 0x68, 0x61, 0x72, 0x65,
+ 0x64, 0x46, 0x6F, 0x6E, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x79, 0x20, 0x64,
+ 0x75, 0x70, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70,
+ 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x30, 0x20, 0x64, 0x69, 0x63, 0x74, 0x20, 0x33, 0x20,
+ 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65,
+ 0x6C, 0x73, 0x65, 0x0D, 0x65, 0x6E, 0x64, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x70, 0x6F, 0x70,
+ 0x20, 0x65, 0x78, 0x65, 0x63, 0x0D, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x64, 0x69, 0x63,
+ 0x74, 0x20, 0x65, 0x6E, 0x64, 0x0D, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x66, 0x69, 0x6C,
+ 0x65, 0x20, 0x65, 0x65, 0x78, 0x65, 0x63, 0x0D, 0x80, 0x02, 0x6D, 0xD9, 0x00, 0x00, 0xE8, 0xDC,
+ 0x61, 0x72, 0x80, 0x71, 0xAB, 0xD4, 0xD5, 0xBC, 0xD2, 0x30, 0xC4, 0xE1, 0x86, 0xDC, 0xE0, 0x96,
+ 0x54, 0x1C, 0x9C, 0x1F, 0x2E, 0x58, 0x69, 0x40, 0x4E, 0x33, 0xF9, 0xCE, 0xFF, 0x7D, 0x2F, 0xBF,
+ 0xEF, 0x5F, 0x26, 0xC7, 0xE1, 0x84, 0x89, 0x54, 0xC7, 0x07, 0x55, 0x24, 0x4E, 0x73, 0x41, 0xB8,
+ 0x26, 0x97, 0xE2, 0xE8, 0xEA, 0x9C, 0xE9, 0x13, 0x1D, 0x00, 0x55, 0x78, 0xAB, 0x3D, 0xE1, 0x9F,
+ 0xA9, 0xF2, 0xFA, 0xFF, 0x3B, 0xEB, 0x53, 0x17, 0x4A, 0x8E, 0x2F, 0x33, 0xE9, 0xDB, 0xE0, 0x38,
+ 0x63, 0x42, 0xF4, 0x0E, 0x5D, 0xF2, 0x5B, 0x7A, 0x88, 0x22, 0xEE, 0x2B, 0x6C, 0xDC, 0xAC, 0x58,
+ 0xA9, 0x8F, 0x9B, 0x04, 0x71, 0x44, 0xE3, 0xF6, 0xE7, 0x4A, 0xB6, 0x0C, 0x00, 0xE4, 0x42, 0xE8,
+ 0x30, 0xB1, 0x30, 0x30, 0x8A, 0x3F, 0x0E, 0xDF, 0x2C, 0xE6, 0x62, 0x35, 0xF9, 0x21, 0x6D, 0x42,
+ 0x0F, 0x23, 0xAC, 0xED, 0xEC, 0x60, 0xA8, 0x8A, 0x73, 0x77, 0x14, 0x62, 0xE1, 0xB2, 0x04, 0x04,
+ 0x29, 0x5D, 0x49, 0xBA, 0x8A, 0x8B, 0xCB, 0xF2, 0x04, 0x2A, 0x8D, 0xEB, 0x9A, 0x65, 0xBA, 0xF1,
+ 0xC8, 0x24, 0x2F, 0x7E, 0x90, 0xD9, 0x49, 0x63, 0x23, 0x73, 0xF8, 0x43, 0x8F, 0xC1, 0xE7, 0x37,
+ 0x37, 0x0B, 0x91, 0x15, 0x08, 0x9D, 0xA7, 0x90, 0xA8, 0x28, 0x50, 0xB6, 0x91, 0xE6, 0xE9, 0xE2,
+ 0x79, 0x11, 0x12, 0x36, 0xFF, 0xD7, 0xC7, 0x69, 0xE2, 0x5A, 0x86, 0xDA, 0xFA, 0x47, 0x58, 0x69,
+ 0x73, 0xB5, 0x49, 0xF3, 0xB4, 0x9B, 0x15, 0x16, 0x9C, 0x35, 0xF5, 0xDD, 0x2F, 0xD1, 0x4A, 0x95,
+ 0x2A, 0x95, 0x04, 0x43, 0x8B, 0xF2, 0x75, 0x99, 0xA4, 0x90, 0xA6, 0xA1, 0x0A, 0x87, 0x35, 0x71,
+ 0xEB, 0x17, 0x1A, 0x46, 0x59, 0x3E, 0xC6, 0xF8, 0x99, 0xF7, 0x60, 0x2C, 0x66, 0x27, 0x4A, 0x48,
+ 0x63, 0x35, 0xAD, 0xC1, 0xDF, 0x19, 0x26, 0x81, 0x68, 0x9C, 0x17, 0xD4, 0x71, 0x79, 0xEF, 0x5B,
+ 0xE3, 0xB5, 0xBE, 0xA9, 0xE5, 0xD2, 0x6C, 0xA2, 0x64, 0x0A, 0x14, 0x44, 0xFE, 0x73, 0x6B, 0x69,
+ 0xEF, 0x3D, 0xF3, 0x0A, 0x79, 0x68, 0x5B, 0x61, 0x86, 0xAE, 0x9B, 0x42, 0x80, 0x6E, 0xBF, 0x24,
+ 0x85, 0xA9, 0x87, 0x98, 0x59, 0xBB, 0x30, 0x36, 0x38, 0x81, 0x2A, 0x82, 0xB6, 0x05, 0x19, 0x94,
+ 0x0A, 0x88, 0x24, 0x8A, 0x57, 0x0C, 0x51, 0x58, 0xE4, 0xAE, 0x1B, 0xE4, 0xDF, 0xD3, 0x2F, 0x92,
+ 0xBE, 0xB5, 0xDB, 0x51, 0x5E, 0xA2, 0xC4, 0x58, 0xF0, 0x64, 0xF7, 0x57, 0xFB, 0x61, 0x3E, 0xAA,
+ 0x46, 0xE6, 0x33, 0x46, 0x6E, 0x45, 0x4D, 0x33, 0x17, 0x66, 0xE7, 0xD7, 0xCE, 0x92, 0xF0, 0xF6,
+ 0xB2, 0xFB, 0x62, 0x7B, 0xAD, 0x7C, 0x68, 0x0A, 0x8E, 0x14, 0x8F, 0xB7, 0x48, 0x3D, 0x84, 0xEF,
+ 0x49, 0xDC, 0x52, 0xE3, 0xAA, 0x04, 0xC9, 0xF3, 0x0B, 0x21, 0x41, 0x96, 0x4D, 0x36, 0xC3, 0x3D,
+ 0x54, 0xE8, 0x82, 0x69, 0xFF, 0xB1, 0xA8, 0xE3, 0x8A, 0x39, 0xDC, 0xC8, 0x14, 0x0A, 0x49, 0xAC,
+ 0x96, 0x33, 0x1E, 0x09, 0xE8, 0x62, 0x64, 0x57, 0x82, 0x68, 0x46, 0xAB, 0xE0, 0xBB, 0xCF, 0xCF,
+ 0x8F, 0xCF, 0x9E, 0x08, 0xB0, 0xAD, 0x98, 0x71, 0x33, 0x08, 0xE4, 0x5C, 0xCC, 0x7F, 0x17, 0x09,
+ 0x98, 0x65, 0xEE, 0xED, 0x93, 0x84, 0xC9, 0xFD, 0x46, 0x57, 0xB4, 0xF1, 0x98, 0x3A, 0xB5, 0xC2,
+ 0x7F, 0xF8, 0xFB, 0x60, 0x78, 0xD7, 0x47, 0xD7, 0x63, 0x58, 0x51, 0xE9, 0xDC, 0xF1, 0x0E, 0xB8,
+ 0x59, 0x3B, 0x72, 0x81, 0x31, 0xAF, 0xC8, 0x5B, 0x35, 0x47, 0xF1, 0xBC, 0xCD, 0xED, 0x45, 0xF1,
+ 0xFC, 0x6D, 0xFF, 0x2E, 0xAA, 0x6C, 0xC2, 0x65, 0x5F, 0x8F, 0x8F, 0x95, 0x20, 0xBA, 0xCA, 0xF9,
+ 0x68, 0xA5, 0x47, 0x7F, 0xCC, 0xD0, 0xA6, 0x3B, 0xAE, 0xA2, 0xE5, 0x11, 0x0D, 0x4E, 0x20, 0x44,
+ 0x6B, 0x64, 0xDB, 0x75, 0x68, 0x9D, 0xA4, 0xEC, 0xB2, 0x1D, 0xDF, 0x66, 0xC5, 0x89, 0x4F, 0x94,
+ 0x0B, 0x06, 0xD9, 0x11, 0x9C, 0x83, 0x3F, 0x55, 0x21, 0xA0, 0x65, 0x2E, 0x6D, 0x39, 0x6F, 0xCA,
+ 0x08, 0xDE, 0x60, 0x7F, 0x47, 0xE8, 0x9D, 0xC2, 0x9E, 0x5F, 0x81, 0x9C, 0xAA, 0xB7, 0x46, 0x0A,
+ 0xAC, 0xA0, 0xFD, 0x22, 0x59, 0xE6, 0xCB, 0x78, 0xF6, 0x37, 0x7A, 0xD8, 0x6C, 0x8D, 0x61, 0xF1,
+ 0x10, 0xE9, 0x60, 0x74, 0x4C, 0x43, 0xB0, 0x4B, 0x3C, 0x0A, 0x77, 0x6A, 0xF3, 0xF5, 0xAE, 0x16,
+ 0x1C, 0xBB, 0x75, 0xDB, 0x81, 0x97, 0xA2, 0xDA, 0x6A, 0x8C, 0xE4, 0xBA, 0xB4, 0xBE, 0x6C, 0xAD,
+ 0x24, 0x18, 0x37, 0x3F, 0x05, 0x8A, 0x96, 0x9C, 0x75, 0xD0, 0x97, 0xC5, 0x3B, 0xDB, 0x23, 0xBF,
+ 0x62, 0x76, 0xC8, 0xD3, 0xFD, 0x09, 0x57, 0xD7, 0x8B, 0x85, 0x1B, 0x9F, 0x65, 0x79, 0x83, 0x16,
+ 0x10, 0x92, 0xE4, 0x10, 0xB3, 0x65, 0xED, 0x7B, 0x42, 0x3B, 0xC6, 0x05, 0x03, 0xF7, 0xFE, 0xEE,
+ 0x4B, 0x1E, 0x87, 0x05, 0x65, 0x4E, 0x00, 0xE2, 0x30, 0x67, 0x0A, 0xDB, 0xAB, 0x57, 0x04, 0xB6,
+ 0x19, 0x39, 0x24, 0xFA, 0x7F, 0xB8, 0xD9, 0x08, 0x64, 0x38, 0xFA, 0x16, 0xE1, 0xF2, 0x19, 0xB2,
+ 0x12, 0xBB, 0x5F, 0xDB, 0xEE, 0x81, 0xDA, 0x96, 0x41, 0x88, 0xE0, 0x9B, 0x41, 0x27, 0x2C, 0x9B,
+ 0xB8, 0x27, 0x41, 0x72, 0xC1, 0xE5, 0xD9, 0xE7, 0x8D, 0x1F, 0x94, 0xF9, 0xCD, 0x0F, 0x68, 0x0D,
+ 0xD3, 0x24, 0x6B, 0xBB, 0xD5, 0x65, 0x71, 0x8B, 0xE9, 0x10, 0x4F, 0xED, 0x59, 0xCD, 0xEF, 0x1D,
+ 0x0E, 0xA7, 0x70, 0xB5, 0x1C, 0x62, 0xE5, 0x05, 0x88, 0x0C, 0xF3, 0x26, 0x5D, 0xD8, 0x78, 0xA1,
+ 0xF9, 0x79, 0x06, 0x9C, 0x7A, 0x5A, 0xEA, 0x30, 0xCA, 0x16, 0x0F, 0x4E, 0xBE, 0x5F, 0x97, 0x58,
+ 0xAA, 0x3F, 0x9B, 0xB0, 0x32, 0xBE, 0xC8, 0x2C, 0x32, 0x70, 0xA1, 0xC3, 0xD9, 0x4A, 0xEB, 0x00,
+ 0xAF, 0xB2, 0x4E, 0x57, 0x7A, 0x2E, 0xE9, 0x68, 0xBD, 0x27, 0x09, 0x91, 0xD6, 0xDC, 0xB5, 0x01,
+ 0x5C, 0x6D, 0x1F, 0x98, 0x7C, 0x2E, 0x73, 0x41, 0x8A, 0x09, 0x1D, 0x00, 0xE6, 0x5A, 0x9C, 0x4A,
+ 0x6C, 0xEF, 0x59, 0x75, 0x30, 0x70, 0x4C, 0xCF, 0xF1, 0x7F, 0x7B, 0x3F, 0xFA, 0x01, 0x0F, 0xED,
+ 0x29, 0x31, 0x5A, 0x5E, 0x62, 0x0D, 0x37, 0x52, 0xAB, 0x92, 0x04, 0x28, 0xA6, 0xA8, 0x88, 0x63,
+ 0x24, 0x0A, 0x38, 0x7F, 0x32, 0xCF, 0xC5, 0xC6, 0xC0, 0x7C, 0x00, 0x77, 0x6C, 0x4F, 0x36, 0x82,
+ 0xEF, 0x69, 0xF0, 0xEB, 0xCC, 0x8C, 0x6D, 0x08, 0xFF, 0xCB, 0x03, 0x29, 0x8B, 0xEF, 0x0F, 0x45,
+ 0x81, 0xA3, 0xDF, 0x22, 0xEE, 0xB4, 0x72, 0x53, 0x20, 0xDC, 0x19, 0x6F, 0x21, 0xEA, 0xF1, 0xF1,
+ 0x51, 0x98, 0x3C, 0xA8, 0x48, 0x2E, 0x4C, 0xF9, 0xEB, 0x10, 0x71, 0xFA, 0xF8, 0x87, 0x64, 0xE1,
+ 0xBB, 0xAD, 0xD8, 0x12, 0xE2, 0x8A, 0x1E, 0xFE, 0x48, 0x1C, 0x0C, 0xA6, 0x3D, 0xBD, 0x33, 0x54,
+ 0x8E, 0xD9, 0x88, 0x53, 0x55, 0x0D, 0x55, 0x62, 0x4F, 0x2D, 0x36, 0xE6, 0xDF, 0x7C, 0x0F, 0xAE,
+ 0x0E, 0x78, 0x11, 0xA3, 0x70, 0x65, 0x41, 0xE8, 0x91, 0x36, 0xEE, 0xB6, 0xDD, 0xAB, 0xBA, 0x1F,
+ 0x0D, 0x06, 0x48, 0x1F, 0xE0, 0x4C, 0x12, 0xF6, 0xD2, 0x37, 0xC0, 0xBD, 0x5D, 0x34, 0x25, 0xE2,
+ 0xAB, 0x93, 0x4B, 0xD6, 0x17, 0x7B, 0x95, 0xD9, 0x2B, 0xFE, 0x60, 0xB0, 0x32, 0xCD, 0x5F, 0x0F,
+ 0x0B, 0x81, 0x58, 0xBC, 0x95, 0x9C, 0x4B, 0x81, 0xBF, 0xD2, 0xA0, 0x64, 0xDB, 0xE8, 0xE0, 0x6A,
+ 0x49, 0xFB, 0xC4, 0x99, 0x59, 0x2F, 0x2B, 0xED, 0x21, 0x8D, 0xD7, 0xA7, 0x56, 0x04, 0x67, 0xC6,
+ 0x0C, 0x89, 0x58, 0x12, 0x5A, 0x5C, 0x27, 0x62, 0x79, 0x0C, 0x5E, 0xC3, 0xCC, 0x99, 0x5A, 0xCF,
+ 0x71, 0x99, 0x75, 0x2E, 0xBA, 0x1C, 0x28, 0xAA, 0x64, 0x62, 0x17, 0xF9, 0xCD, 0x38, 0x1A, 0x0B,
+ 0xE3, 0xF7, 0xF7, 0x98, 0x4F, 0x0D, 0xB5, 0xF0, 0x03, 0x37, 0x68, 0x5F, 0x3D, 0xE8, 0x13, 0x01,
+ 0xE2, 0x36, 0xF9, 0xB6, 0x25, 0x41, 0xDE, 0x4C, 0x53, 0xD2, 0xD5, 0xB1, 0xA1, 0x77, 0x1B, 0x9D,
+ 0x3A, 0x67, 0x93, 0xCB, 0x00, 0xB9, 0xA0, 0x50, 0x56, 0x00, 0xFF, 0xA6, 0xCC, 0x17, 0x5A, 0x4A,
+ 0x5C, 0x98, 0xFA, 0x98, 0x1E, 0x12, 0x60, 0x50, 0x4B, 0xA9, 0x91, 0x7E, 0x25, 0x9C, 0x30, 0x91,
+ 0xA9, 0x39, 0x22, 0xC3, 0xF8, 0x6D, 0xDC, 0xC7, 0xE7, 0x09, 0x4A, 0x56, 0xCA, 0xD8, 0x3B, 0x4F,
+ 0x4D, 0x2F, 0xC2, 0x2B, 0x93, 0x32, 0xE5, 0x47, 0xEC, 0x14, 0x03, 0xC8, 0xB7, 0xE2, 0xA0, 0x84,
+ 0xF7, 0x99, 0x51, 0x86, 0x68, 0x08, 0x98, 0x02, 0x41, 0x29, 0x07, 0x56, 0x55, 0xE6, 0x6C, 0x74,
+ 0xC5, 0x61, 0x7B, 0xDB, 0x33, 0x01, 0xF8, 0xF0, 0xA9, 0x18, 0xFE, 0xC5, 0x35, 0x8C, 0xB2, 0x80,
+ 0xDA, 0xD0, 0x84, 0x8A, 0xFC, 0x4C, 0x3C, 0x3A, 0x1F, 0x71, 0xF4, 0x46, 0x63, 0x60, 0x13, 0xF4,
+ 0x1D, 0x82, 0xD7, 0xB0, 0x48, 0x4F, 0x2E, 0x79, 0xF7, 0xEC, 0x06, 0x12, 0x7A, 0xD2, 0x94, 0x74,
+ 0x91, 0xC9, 0x68, 0x8A, 0xF0, 0x63, 0xD9, 0x18, 0x3C, 0x8B, 0x54, 0x94, 0x12, 0x4F, 0xFE, 0x9F,
+ 0x9D, 0x12, 0xFA, 0xAD, 0xEE, 0xD1, 0xFD, 0x56, 0x31, 0x17, 0x5A, 0xC3, 0x09, 0xC1, 0x35, 0x53,
+ 0x41, 0xEF, 0xF9, 0x9B, 0x7E, 0xBE, 0xFC, 0xA8, 0x96, 0x6E, 0x8D, 0xFD, 0xB8, 0x42, 0xC3, 0xA7,
+ 0x78, 0xCB, 0xF9, 0x9B, 0xFB, 0x01, 0xCB, 0x9F, 0xA4, 0xA2, 0x0C, 0x80, 0xB7, 0x4D, 0x01, 0x50,
+ 0x2F, 0xD3, 0xC1, 0xD5, 0x4B, 0x01, 0xEE, 0xDF, 0x08, 0x6A, 0xB2, 0xC6, 0x08, 0x49, 0x71, 0x89,
+ 0xB3, 0xF0, 0xC1, 0x50, 0x74, 0xAC, 0xFE, 0x7E, 0x82, 0xE7, 0xA6, 0x10, 0xF2, 0x0C, 0x5A, 0xEC,
+ 0xC2, 0xE8, 0x55, 0x40, 0xB0, 0x1E, 0x7F, 0x95, 0xF7, 0x39, 0x1C, 0xA7, 0xEC, 0xEB, 0x81, 0xF4,
+ 0xCB, 0x82, 0x1D, 0x94, 0x8C, 0xBF, 0xDA, 0xB7, 0x65, 0x51, 0x05, 0x22, 0x92, 0x3C, 0x7A, 0x38,
+ 0xB1, 0xBB, 0x14, 0xAF, 0xB1, 0xFF, 0x8A, 0x98, 0x24, 0x1B, 0xE0, 0x51, 0x0B, 0x72, 0xD1, 0x2E,
+ 0x97, 0xE0, 0x4D, 0xA2, 0xFF, 0x0F, 0x30, 0xAC, 0x7A, 0xD2, 0x88, 0x6C, 0xB4, 0xCE, 0x67, 0xC2,
+ 0xF7, 0x18, 0x91, 0x1E, 0x1C, 0xF4, 0xFA, 0x0D, 0xDC, 0x42, 0x3B, 0xA4, 0xB8, 0x48, 0xF3, 0x98,
+ 0x94, 0x5C, 0x57, 0x98, 0xA9, 0x71, 0x14, 0x5B, 0x79, 0xCF, 0x33, 0xAA, 0xE1, 0x19, 0x49, 0xFC,
+ 0x2E, 0x66, 0x2C, 0x6C, 0xEB, 0xB8, 0x71, 0x3B, 0x9C, 0x19, 0x14, 0x5C, 0x95, 0xDB, 0x7D, 0x47,
+ 0xB8, 0x54, 0x14, 0xC9, 0xA8, 0x38, 0xA3, 0x3A, 0xF8, 0x40, 0xD6, 0x4F, 0x3E, 0x52, 0x48, 0x66,
+ 0xED, 0xE9, 0xB8, 0xB7, 0x03, 0x0E, 0x4B, 0x8F, 0x84, 0xDF, 0xA3, 0xE4, 0x7A, 0x97, 0xA6, 0xB8,
+ 0x9C, 0x97, 0xBF, 0x70, 0xDA, 0xAC, 0x71, 0x01, 0xAA, 0xDE, 0x0E, 0xFB, 0xFA, 0xF1, 0xCF, 0x0D,
+ 0x9C, 0x93, 0xEB, 0xE4, 0xF4, 0xAF, 0xB6, 0x1D, 0x10, 0xB0, 0x0C, 0xDB, 0x80, 0xF2, 0x9A, 0x8C,
+ 0xB5, 0x5F, 0x2C, 0xB1, 0x67, 0xE9, 0x3A, 0xD7, 0xE4, 0xCF, 0x20, 0xE7, 0x06, 0x86, 0xFA, 0x23,
+ 0x8E, 0xBF, 0x85, 0x45, 0x2A, 0x4B, 0x53, 0x45, 0xF1, 0xA2, 0x6C, 0x2A, 0x4F, 0x4D, 0x67, 0xED,
+ 0x78, 0x15, 0x06, 0x43, 0x94, 0x44, 0xFB, 0x1C, 0xD5, 0xDB, 0x88, 0x95, 0xD5, 0x53, 0x90, 0xBD,
+ 0xF8, 0x7A, 0xD8, 0xED, 0xE0, 0x3E, 0x86, 0xC9, 0x9D, 0xFC, 0xA7, 0x29, 0x94, 0x82, 0xC3, 0x71,
+ 0xB4, 0xE7, 0x77, 0x35, 0x48, 0x7A, 0xA0, 0x79, 0x8A, 0x68, 0x7F, 0xA2, 0xDF, 0xDA, 0x34, 0x4D,
+ 0x72, 0xD2, 0xB3, 0x51, 0xA6, 0x64, 0x84, 0xF5, 0x01, 0x74, 0x87, 0x57, 0xA3, 0x3F, 0x25, 0x28,
+ 0xAA, 0x88, 0x75, 0xFC, 0xE6, 0x79, 0x62, 0xBF, 0xF8, 0xD7, 0xBE, 0x22, 0x13, 0xD2, 0xAD, 0x08,
+ 0x7D, 0x15, 0xF3, 0x9D, 0x74, 0xB6, 0x49, 0x53, 0xE7, 0x4C, 0xE9, 0x57, 0x80, 0x5A, 0x8F, 0x5D,
+ 0x75, 0xDE, 0x04, 0x59, 0x0B, 0x8C, 0xC6, 0x1B, 0x7A, 0xFC, 0xF0, 0x42, 0xC2, 0x6A, 0x17, 0x3A,
+ 0x19, 0x92, 0x66, 0xE3, 0x04, 0x28, 0x85, 0x02, 0xA3, 0x2F, 0xA8, 0x3D, 0x92, 0x9F, 0xD4, 0xDF,
+ 0x24, 0x57, 0xF9, 0x61, 0x10, 0xD6, 0x6B, 0x32, 0x5F, 0x7F, 0xC6, 0xDD, 0x58, 0x4D, 0x83, 0xF9,
+ 0x27, 0x0E, 0xF9, 0x6D, 0x4F, 0x30, 0x32, 0x12, 0x5A, 0xC5, 0xEA, 0x83, 0x35, 0x14, 0x23, 0x58,
+ 0x66, 0x79, 0x5B, 0x44, 0x44, 0x9E, 0xBE, 0xBF, 0x2D, 0x02, 0x76, 0x4A, 0x59, 0x2A, 0x1F, 0xC8,
+ 0xF6, 0x84, 0xD1, 0x87, 0x55, 0xE5, 0x3D, 0xF2, 0xCC, 0x63, 0xE0, 0x47, 0x1F, 0x14, 0x00, 0x56,
+ 0xF1, 0xF1, 0x7B, 0x45, 0xD2, 0xE6, 0xC9, 0x38, 0x1C, 0xE1, 0x29, 0x3D, 0xF4, 0x1D, 0x2B, 0x3E,
+ 0x67, 0x9C, 0x67, 0xE4, 0x82, 0x40, 0x29, 0x55, 0xC4, 0x46, 0xBE, 0x6B, 0xA5, 0x2A, 0xDD, 0xFF,
+ 0xCA, 0xD0, 0xC9, 0x05, 0x03, 0xA0, 0x4F, 0x0D, 0xA0, 0xA5, 0x04, 0x26, 0x02, 0x92, 0x16, 0x5C,
+ 0x2D, 0x68, 0xDF, 0x06, 0x87, 0x79, 0x71, 0xA3, 0x40, 0xB5, 0xCC, 0x1E, 0x71, 0x3C, 0x7F, 0x16,
+ 0xFA, 0xA0, 0xA5, 0x58, 0xD9, 0x53, 0x93, 0x31, 0x03, 0x28, 0x0A, 0x94, 0x41, 0xC1, 0xEE, 0x61,
+ 0x47, 0xE0, 0x02, 0x8E, 0x39, 0xEF, 0x6D, 0xA9, 0xD3, 0x00, 0xA0, 0x30, 0x95, 0xF5, 0xFC, 0xBF,
+ 0xC7, 0x6B, 0x8A, 0x32, 0x16, 0x9E, 0x50, 0xB0, 0xEF, 0x0C, 0xF3, 0x55, 0x61, 0xD0, 0x21, 0xF7,
+ 0x6B, 0xA0, 0xB9, 0xC9, 0x69, 0xE7, 0x85, 0xF8, 0xE7, 0x69, 0xC4, 0xB5, 0x27, 0x01, 0x1B, 0xB1,
+ 0xAD, 0x09, 0x5A, 0xD0, 0x40, 0xC0, 0x1C, 0x34, 0x51, 0x23, 0x3F, 0xD2, 0xD4, 0x94, 0xBA, 0x42,
+ 0xA8, 0xC9, 0x4B, 0x84, 0x2B, 0x82, 0xDD, 0xDA, 0x22, 0x14, 0xE0, 0x24, 0x53, 0x12, 0xD0, 0x67,
+ 0x62, 0xC2, 0x4E, 0xF6, 0x7A, 0xBA, 0xCB, 0xF1, 0xF0, 0xE4, 0x51, 0x2A, 0xA5, 0x48, 0x4C, 0xC6,
+ 0xC2, 0x30, 0x00, 0xEC, 0xEE, 0xEB, 0xBC, 0xE9, 0x76, 0x4E, 0x23, 0xB1, 0xCE, 0x05, 0x40, 0x1F,
+ 0x2D, 0x0E, 0xEB, 0x84, 0x96, 0x38, 0x16, 0x5B, 0xCF, 0x4D, 0xFB, 0x1A, 0xB4, 0x74, 0x61, 0x7C,
+ 0x4D, 0x67, 0x95, 0x79, 0xB5, 0x81, 0x88, 0x32, 0xDA, 0x84, 0x9D, 0xC1, 0x53, 0x21, 0xDD, 0x0A,
+ 0xDE, 0x3C, 0xB3, 0xB5, 0xB8, 0x1A, 0xFC, 0x72, 0x7A, 0xB8, 0xEB, 0xC8, 0xF6, 0x7A, 0x00, 0xDD,
+ 0x2E, 0x7E, 0x52, 0x06, 0x66, 0x0C, 0xFF, 0x3F, 0x8B, 0x16, 0x4B, 0x1A, 0x9B, 0x3C, 0x17, 0x5B,
+ 0xD8, 0xCB, 0xA0, 0xCA, 0xF9, 0x41, 0x36, 0xD6, 0xA6, 0x08, 0x6D, 0xFC, 0xD3, 0x77, 0x14, 0x58,
+ 0xF1, 0xB5, 0x3E, 0x54, 0xDB, 0xAC, 0x03, 0xAC, 0x11, 0x5C, 0x4D, 0xC6, 0xB5, 0x03, 0x5A, 0xFF,
+ 0x52, 0xA8, 0xDF, 0xDC, 0x39, 0xF3, 0x6A, 0xC8, 0xB4, 0x23, 0x0B, 0x0B, 0x67, 0x1B, 0x02, 0xBA,
+ 0x79, 0x03, 0x16, 0xB2, 0xA9, 0xC3, 0xA1, 0x62, 0x6B, 0x96, 0x23, 0x14, 0x6D, 0x8F, 0x94, 0xF1,
+ 0xD2, 0xEA, 0x5B, 0x3A, 0x48, 0x79, 0x1E, 0x02, 0xCE, 0xE8, 0xF5, 0x2C, 0x6A, 0xB2, 0x08, 0x62,
+ 0xC6, 0x85, 0x09, 0x9E, 0x5A, 0xD0, 0xE5, 0x34, 0x75, 0x81, 0xF5, 0xA7, 0x55, 0x6A, 0x31, 0x6E,
+ 0x30, 0x08, 0x1B, 0xF9, 0xF1, 0x5A, 0x33, 0x36, 0x3C, 0x7D, 0xA9, 0xB5, 0x91, 0x80, 0x06, 0x34,
+ 0x57, 0xD7, 0xC5, 0xA8, 0x74, 0x0F, 0x01, 0x27, 0x4C, 0x82, 0x98, 0xC6, 0x6B, 0x4F, 0xC5, 0x7F,
+ 0xFF, 0xAC, 0x13, 0x4A, 0xDA, 0x73, 0x97, 0xBF, 0xEA, 0xA3, 0xF2, 0xBB, 0xE9, 0x51, 0x7D, 0x7E,
+ 0xE6, 0xE9, 0x15, 0x85, 0x1D, 0x72, 0x4A, 0xB8, 0xB7, 0x99, 0x3E, 0x9F, 0x71, 0x8F, 0x18, 0x56,
+ 0x9C, 0xBF, 0x45, 0x54, 0xB8, 0x14, 0x5C, 0x39, 0x7B, 0x93, 0xD8, 0x41, 0xA7, 0x00, 0x1B, 0x74,
+ 0x47, 0x29, 0x29, 0xB4, 0x42, 0xCF, 0x17, 0x69, 0x43, 0xB2, 0x2E, 0x38, 0x1E, 0x11, 0xA7, 0x97,
+ 0x6A, 0xB4, 0xB5, 0xDF, 0x40, 0xE6, 0x75, 0x5B, 0xC0, 0xF0, 0x80, 0xC6, 0xFF, 0x73, 0xD5, 0x45,
+ 0x03, 0x04, 0x83, 0x17, 0xF4, 0x62, 0xBE, 0xF6, 0x4D, 0x25, 0x84, 0xD6, 0xB2, 0xE3, 0x34, 0x49,
+ 0xDE, 0x3D, 0x67, 0xF8, 0x7A, 0x7F, 0xFB, 0xF9, 0xE5, 0x5E, 0xD1, 0x39, 0x8B, 0x9D, 0xFE, 0x7F,
+ 0xE3, 0x0B, 0x8B, 0x48, 0xA0, 0x9E, 0x15, 0x82, 0x57, 0xAF, 0xBA, 0xFE, 0x65, 0xFE, 0x07, 0x7A,
+ 0x3B, 0x46, 0xDE, 0x94, 0x7B, 0x69, 0x9C, 0xB0, 0x48, 0x68, 0x14, 0x45, 0xF6, 0x85, 0xBB, 0x95,
+ 0x94, 0x5E, 0x2D, 0x6C, 0x38, 0x2C, 0xF8, 0x65, 0x13, 0x88, 0xA7, 0xEA, 0x05, 0xE7, 0x25, 0xAF,
+ 0x13, 0xC8, 0x0F, 0xA3, 0xDB, 0x1E, 0x58, 0x28, 0x95, 0xBD, 0x34, 0x50, 0x06, 0xEF, 0xBB, 0xC9,
+ 0x93, 0xA3, 0xD4, 0x2D, 0x4F, 0x07, 0x4F, 0x1D, 0xB8, 0xAF, 0x42, 0x59, 0x34, 0x8A, 0x33, 0xB0,
+ 0xD5, 0x4E, 0x55, 0x79, 0x0E, 0x53, 0xCD, 0xA4, 0xE0, 0x96, 0x23, 0x8B, 0x1A, 0x04, 0xB0, 0x48,
+ 0x82, 0xE8, 0xEC, 0xA8, 0xB8, 0x52, 0xAF, 0xD0, 0xFB, 0xD1, 0xF1, 0xD0, 0x50, 0xFC, 0x7B, 0x27,
+ 0x38, 0xFC, 0x7A, 0xDE, 0x83, 0x50, 0x7E, 0xD3, 0xE6, 0xF5, 0x45, 0x76, 0xC5, 0x2D, 0x50, 0xB4,
+ 0x69, 0xF5, 0x10, 0x91, 0xBD, 0x18, 0xB1, 0x49, 0xE4, 0x6A, 0x17, 0x45, 0xB1, 0xF1, 0x20, 0xC7,
+ 0xE0, 0xC2, 0x02, 0x2D, 0x3C, 0x91, 0x16, 0x26, 0x25, 0xDE, 0x49, 0x88, 0xB3, 0xD7, 0x91, 0x7D,
+ 0x21, 0xC1, 0x08, 0xDC, 0xEF, 0x52, 0x15, 0xD8, 0xE5, 0x3B, 0x58, 0xC6, 0xD9, 0x97, 0x0E, 0x7E,
+ 0xD8, 0x94, 0x4F, 0xCE, 0xCA, 0xD7, 0xC7, 0x3C, 0xEF, 0xD1, 0x34, 0x3D, 0x78, 0xB6, 0x67, 0xA7,
+ 0x6A, 0x13, 0x9D, 0x1E, 0x0A, 0x50, 0x67, 0xA0, 0xBF, 0x88, 0xAA, 0x34, 0xB4, 0xAA, 0x47, 0x71,
+ 0x48, 0x78, 0x34, 0x42, 0xC8, 0x13, 0x1A, 0x96, 0x3E, 0x29, 0xF9, 0x9B, 0xD3, 0x87, 0xC0, 0x64,
+ 0xD6, 0x5C, 0x76, 0xBF, 0xD4, 0xF2, 0x85, 0xE7, 0xB6, 0x64, 0x68, 0x47, 0x54, 0xE8, 0x1C, 0x3A,
+ 0x06, 0x06, 0x83, 0xE6, 0xF2, 0x43, 0x53, 0x2A, 0x8F, 0xFE, 0x8C, 0x04, 0xB0, 0xAB, 0x70, 0xE0,
+ 0xC7, 0xE3, 0x72, 0x4E, 0xB8, 0x2E, 0xA5, 0x8F, 0x1E, 0xDB, 0x80, 0xE6, 0x46, 0xDD, 0xE5, 0x55,
+ 0xAB, 0xBB, 0x1C, 0xB4, 0x98, 0xD3, 0x79, 0xAF, 0xBE, 0x10, 0x9E, 0xB1, 0x33, 0x47, 0xDE, 0xF3,
+ 0x46, 0x10, 0xAB, 0xBB, 0xF1, 0xDD, 0x24, 0x4E, 0x91, 0xBF, 0x6E, 0xDD, 0xE5, 0x88, 0x46, 0xDB,
+ 0x44, 0x07, 0x69, 0x38, 0x2A, 0x8D, 0x48, 0xEE, 0xF3, 0xF0, 0xBE, 0xEE, 0xA4, 0x67, 0x07, 0x25,
+ 0x4D, 0x39, 0x76, 0x74, 0x17, 0xBB, 0x59, 0xA7, 0x99, 0x49, 0xE7, 0x22, 0x73, 0xCD, 0x83, 0x4E,
+ 0xA5, 0xDD, 0x65, 0xB7, 0x36, 0x3D, 0xDF, 0x77, 0xF9, 0xB2, 0x5C, 0xD8, 0xC7, 0x0C, 0xCF, 0x7C,
+ 0x33, 0x7E, 0x28, 0x32, 0xDD, 0xAB, 0x5C, 0x27, 0x80, 0x54, 0x4C, 0xCF, 0xF4, 0x92, 0xD5, 0xFC,
+ 0x28, 0x15, 0x91, 0x7B, 0x77, 0x28, 0x0E, 0x85, 0x63, 0xE2, 0x38, 0x6C, 0x10, 0xAE, 0x55, 0xB1,
+ 0x76, 0x69, 0xCA, 0x0E, 0x1E, 0x86, 0x76, 0x6B, 0x40, 0xC3, 0xA9, 0xD5, 0xDC, 0xB3, 0x2E, 0xBE,
+ 0x1F, 0xE9, 0x3A, 0x2C, 0xB8, 0x0B, 0xEC, 0xB4, 0xCA, 0x9E, 0x47, 0xCD, 0x0D, 0x49, 0xC3, 0xB9,
+ 0x28, 0xD9, 0xBF, 0xCD, 0xB9, 0xFA, 0x66, 0xC5, 0x89, 0xD3, 0xDF, 0x04, 0xC1, 0x06, 0x31, 0xAF,
+ 0xA4, 0xBC, 0xEE, 0xEB, 0x33, 0xF6, 0x2B, 0x8B, 0xCB, 0xC4, 0x51, 0x84, 0x8D, 0x94, 0xFD, 0xDC,
+ 0xA8, 0xBC, 0x23, 0xDE, 0x48, 0xF1, 0xE6, 0x20, 0x20, 0x6E, 0x88, 0x6C, 0x69, 0xA0, 0x3D, 0x3B,
+ 0x7F, 0xE1, 0x35, 0x16, 0x79, 0x23, 0x8E, 0x23, 0xED, 0x54, 0x7A, 0x1C, 0x90, 0x6C, 0x35, 0xD9,
+ 0x31, 0xD6, 0x9B, 0xE6, 0x18, 0x41, 0x07, 0x4C, 0x0A, 0xDC, 0x57, 0x8F, 0xEB, 0x04, 0xA2, 0xB9,
+ 0xDD, 0xC1, 0xBD, 0xEF, 0xD2, 0x51, 0x3D, 0x9D, 0x8B, 0x3F, 0xEC, 0x34, 0xF3, 0x0D, 0xB3, 0xAD,
+ 0xBC, 0xAD, 0x62, 0xAA, 0x02, 0xF8, 0x7C, 0x21, 0xD9, 0x8F, 0x65, 0x08, 0xA1, 0x0E, 0x5F, 0x5D,
+ 0xA5, 0x24, 0x5E, 0xF4, 0x9C, 0x8A, 0x24, 0xA8, 0xF7, 0xF6, 0x0A, 0xAD, 0x28, 0xAE, 0x21, 0x50,
+ 0xA2, 0x2B, 0x1B, 0x6C, 0xAF, 0xDC, 0x63, 0xC4, 0x88, 0x54, 0xB6, 0x77, 0xE0, 0xC5, 0x27, 0xD6,
+ 0xF3, 0x92, 0xE1, 0x81, 0x19, 0x99, 0x0E, 0x83, 0x3A, 0x17, 0x10, 0xF2, 0xB5, 0x74, 0x95, 0xB2,
+ 0x87, 0x98, 0xBC, 0x75, 0xFA, 0x54, 0x2C, 0x8B, 0x26, 0xAD, 0xE9, 0xA7, 0xCA, 0x28, 0x89, 0xB9,
+ 0x77, 0x5B, 0xF7, 0xC2, 0x75, 0x42, 0x73, 0x76, 0x83, 0xCA, 0x26, 0xF5, 0xB9, 0x70, 0x23, 0x6F,
+ 0x5F, 0x35, 0x91, 0xCE, 0x6A, 0x5D, 0x57, 0xB8, 0xE0, 0x3C, 0x91, 0x6F, 0xC4, 0xB7, 0x30, 0x6F,
+ 0xDD, 0xBD, 0xD7, 0x5F, 0x1A, 0xD2, 0xE4, 0xE7, 0x0D, 0x2B, 0x02, 0x2F, 0x61, 0x9E, 0x22, 0x4C,
+ 0xFE, 0xBD, 0x1A, 0xDD, 0xE5, 0x67, 0xA2, 0x6F, 0x90, 0x4C, 0x31, 0x5E, 0x6A, 0x9F, 0x8E, 0xE8,
+ 0xC1, 0xB2, 0x4E, 0xE4, 0xCA, 0x2B, 0xB8, 0x4A, 0xE8, 0xFF, 0x06, 0x91, 0x76, 0x2E, 0x51, 0x3F,
+ 0x1B, 0xA5, 0x2A, 0x1C, 0xEB, 0xD4, 0x07, 0x00, 0x03, 0x40, 0x33, 0x6A, 0xD8, 0xB7, 0x5A, 0xF0,
+ 0xF8, 0xF7, 0xCD, 0xCB, 0x3D, 0xB8, 0x98, 0xB4, 0x56, 0xE9, 0x20, 0xCC, 0x45, 0x0F, 0xA3, 0x76,
+ 0xB1, 0x2D, 0x41, 0x9A, 0x89, 0x24, 0x7C, 0xAC, 0x62, 0xCC, 0xCF, 0xE5, 0xA1, 0xEB, 0x7E, 0x41,
+ 0x64, 0x7D, 0x6D, 0xF1, 0x05, 0xC2, 0x65, 0xE9, 0xF8, 0xE8, 0xDB, 0xA0, 0xB8, 0x1A, 0x87, 0x32,
+ 0x9C, 0xF7, 0x48, 0xA4, 0x83, 0x66, 0x12, 0xAC, 0x9D, 0x9D, 0xE4, 0x7B, 0xF4, 0x7A, 0x2B, 0x28,
+ 0xB7, 0x12, 0x3B, 0xAC, 0x7D, 0xF4, 0xB6, 0x72, 0x87, 0x4C, 0xFC, 0x5F, 0x75, 0x4C, 0xE5, 0xE1,
+ 0x6D, 0x10, 0xF8, 0xD5, 0xA2, 0x3F, 0x04, 0xB2, 0x33, 0x6A, 0x0A, 0x3C, 0x45, 0x95, 0x77, 0x5F,
+ 0x20, 0x9E, 0x78, 0x91, 0xEB, 0x72, 0x6B, 0x90, 0x78, 0x9C, 0x5D, 0x47, 0xE4, 0x9A, 0xC5, 0x10,
+ 0xB8, 0xE1, 0x1D, 0x5A, 0x7D, 0xF3, 0x55, 0x8F, 0x66, 0x54, 0x1D, 0x97, 0x05, 0x3F, 0xFC, 0xDA,
+ 0x29, 0x04, 0x57, 0x3F, 0xD0, 0x52, 0x12, 0x3C, 0xBA, 0xF5, 0x52, 0x02, 0xE6, 0x37, 0x3A, 0xF9,
+ 0xAD, 0xB7, 0x2F, 0x81, 0x8D, 0x14, 0xCC, 0x1C, 0x8C, 0x3A, 0x9D, 0x54, 0x5D, 0x75, 0xEC, 0x15,
+ 0x29, 0xB4, 0xCE, 0x44, 0xDA, 0x71, 0x8B, 0xD1, 0xB6, 0x77, 0x08, 0x2E, 0x80, 0x43, 0x57, 0xF5,
+ 0x94, 0x37, 0xFC, 0x11, 0x1C, 0x75, 0x62, 0xA1, 0x17, 0xB2, 0x5E, 0x54, 0xA6, 0xBD, 0xAF, 0x0B,
+ 0xB4, 0x38, 0x77, 0xE8, 0x08, 0xC7, 0x93, 0xDD, 0x96, 0x83, 0x91, 0x1D, 0x4B, 0x5F, 0xE5, 0xB3,
+ 0xC8, 0x28, 0xA9, 0x51, 0x5D, 0xCB, 0xCE, 0x6F, 0x7E, 0xCF, 0xBE, 0x4D, 0x5D, 0x46, 0xB0, 0x02,
+ 0xFA, 0xAF, 0x6E, 0x0A, 0x5B, 0xA4, 0x6D, 0x35, 0xEB, 0x78, 0x31, 0xB3, 0x36, 0x05, 0xD2, 0x84,
+ 0xBD, 0xB7, 0x38, 0x47, 0xCA, 0x47, 0x07, 0xA5, 0x9B, 0x67, 0x45, 0x3E, 0x10, 0x82, 0x05, 0xE7,
+ 0x7B, 0x80, 0xA9, 0x55, 0x34, 0x44, 0x6A, 0xC7, 0x84, 0x24, 0x4F, 0xAA, 0xD5, 0x7D, 0x78, 0xF7,
+ 0x16, 0x43, 0xC1, 0xD5, 0x20, 0x83, 0xD7, 0xB0, 0x51, 0x14, 0xC6, 0xF4, 0xD5, 0xCB, 0x62, 0xDE,
+ 0xE4, 0xAD, 0x47, 0xB5, 0xE5, 0x57, 0xCA, 0x9D, 0x76, 0x10, 0x35, 0xDE, 0x8F, 0xDA, 0x2B, 0x0A,
+ 0xF8, 0x65, 0x90, 0xDB, 0xF5, 0x3D, 0x2E, 0xDE, 0x1F, 0xF5, 0x6C, 0xF4, 0x2B, 0x2E, 0x18, 0x1C,
+ 0xD5, 0x97, 0xC2, 0xDE, 0xC2, 0xD8, 0xE1, 0x79, 0x43, 0xC8, 0xFC, 0x9A, 0x2A, 0xF3, 0x14, 0x28,
+ 0x0E, 0xB6, 0x08, 0xE1, 0xE8, 0xF1, 0x76, 0xB9, 0xA5, 0x57, 0x5C, 0x81, 0x19, 0x27, 0xA5, 0x80,
+ 0x16, 0x0A, 0x5E, 0xDC, 0xCC, 0xE1, 0xBD, 0x8B, 0xC5, 0xEC, 0x07, 0xFF, 0x53, 0x3B, 0xB1, 0x1D,
+ 0xAD, 0x02, 0xAB, 0xB6, 0x04, 0x7B, 0xA1, 0x2E, 0x3F, 0x07, 0x19, 0xD5, 0x82, 0xDA, 0x77, 0x22,
+ 0x80, 0x31, 0x20, 0xDA, 0x83, 0xDB, 0x56, 0x22, 0x88, 0x89, 0x44, 0x53, 0x87, 0x67, 0xAE, 0x30,
+ 0x50, 0x4C, 0xD0, 0x90, 0x8B, 0x45, 0x23, 0xCE, 0x41, 0x39, 0x03, 0xDE, 0xE6, 0xD3, 0xFC, 0x28,
+ 0x19, 0x3E, 0x0B, 0xD2, 0x2E, 0x96, 0xAC, 0x8D, 0xD0, 0x8E, 0x29, 0x48, 0x58, 0xA2, 0xD4, 0x17,
+ 0x65, 0x4B, 0x75, 0x4C, 0x48, 0x43, 0x34, 0x43, 0x3A, 0xDD, 0xCE, 0xC5, 0xF0, 0xF4, 0x6C, 0xB8,
+ 0xDD, 0xF3, 0x3E, 0x34, 0x50, 0x2A, 0x8C, 0x6C, 0x90, 0x96, 0x1E, 0x21, 0x61, 0x13, 0x42, 0xA5,
+ 0x12, 0x0F, 0x73, 0x02, 0xBA, 0x9E, 0xFF, 0x47, 0x83, 0xDB, 0xE4, 0x16, 0x90, 0xD9, 0x0A, 0x40,
+ 0x84, 0xCA, 0xD2, 0x03, 0x05, 0xD8, 0x64, 0xB2, 0x3D, 0x8A, 0x42, 0x02, 0x8C, 0x88, 0xDF, 0xEE,
+ 0x5A, 0x47, 0xF1, 0xF4, 0x82, 0x6E, 0x61, 0xD5, 0xF5, 0xA3, 0x58, 0x21, 0x6B, 0xEE, 0x8F, 0xE2,
+ 0xEB, 0x07, 0x39, 0xA9, 0x71, 0xFC, 0x55, 0x39, 0x37, 0x4D, 0xD2, 0x41, 0xC5, 0x33, 0xF7, 0xF5,
+ 0xED, 0x67, 0xA7, 0x42, 0xAD, 0x61, 0xEC, 0xE2, 0x9D, 0xB9, 0x13, 0x4B, 0xF5, 0x14, 0xB0, 0xE1,
+ 0x47, 0x06, 0x2B, 0x65, 0xCD, 0x09, 0x31, 0x46, 0x47, 0xFE, 0x1B, 0xB5, 0xD8, 0x53, 0x04, 0x28,
+ 0x5C, 0x3F, 0x46, 0x28, 0xCD, 0xB9, 0x87, 0x9A, 0xB0, 0xE2, 0x49, 0xA6, 0xCF, 0x56, 0x8D, 0x52,
+ 0xD5, 0x05, 0xCD, 0x0C, 0x3D, 0x45, 0x11, 0x18, 0x84, 0x38, 0x98, 0xD4, 0xD3, 0x2D, 0xD0, 0x2A,
+ 0xAD, 0xF4, 0x7A, 0xAB, 0xBF, 0xF4, 0xA8, 0x9F, 0x7A, 0xB7, 0x73, 0xC0, 0xEC, 0xF5, 0x3E, 0x87,
+ 0x9F, 0x12, 0xEF, 0xB8, 0xAC, 0x19, 0x34, 0xB9, 0x72, 0xB9, 0x6B, 0xF3, 0xBB, 0x08, 0x8E, 0x7F,
+ 0xEC, 0x24, 0x1A, 0xF4, 0x00, 0xC0, 0xD4, 0x27, 0xB1, 0x3B, 0x05, 0x68, 0xD4, 0x30, 0xD2, 0x21,
+ 0x63, 0xD8, 0x33, 0x6C, 0xDC, 0xA9, 0x3E, 0x7C, 0xA4, 0xE0, 0x43, 0xC9, 0x80, 0xA3, 0xCA, 0x35,
+ 0x72, 0x10, 0xF1, 0xEA, 0xCD, 0xA2, 0xDB, 0x02, 0x5A, 0xEE, 0x52, 0x5E, 0x31, 0x33, 0x2C, 0x68,
+ 0x3A, 0xBE, 0x34, 0x5E, 0xCE, 0xF2, 0x23, 0xE7, 0x4D, 0xCF, 0x71, 0xD4, 0x3E, 0x8C, 0x4E, 0x08,
+ 0x82, 0xF5, 0x01, 0xE9, 0xF8, 0x35, 0xFC, 0x88, 0xFE, 0xC1, 0x1E, 0x67, 0x95, 0x44, 0x45, 0xF8,
+ 0x67, 0xB8, 0x91, 0xF0, 0x8E, 0x6C, 0xE4, 0x57, 0xA6, 0xDB, 0x56, 0xE3, 0x6C, 0x18, 0x37, 0x0C,
+ 0x48, 0x49, 0xB5, 0x7E, 0x51, 0x7A, 0x46, 0x0E, 0xD4, 0x8E, 0x2B, 0x93, 0x63, 0x6B, 0xEC, 0xE5,
+ 0x5B, 0x72, 0x49, 0xB2, 0x3D, 0x24, 0xAA, 0x59, 0xAF, 0x1B, 0x0A, 0x82, 0xE8, 0x56, 0xC1, 0x56,
+ 0x46, 0x9F, 0xB2, 0x5B, 0x8D, 0x4E, 0x45, 0x34, 0x49, 0xE6, 0xDA, 0xEF, 0x43, 0x53, 0x11, 0x41,
+ 0x12, 0x82, 0xB9, 0xA8, 0xCC, 0x95, 0x8E, 0x5F, 0xD3, 0xB9, 0xA0, 0x53, 0xC5, 0x6E, 0x75, 0xC0,
+ 0x50, 0xF8, 0xC8, 0xA8, 0x19, 0xEE, 0x17, 0x6F, 0xD0, 0xB1, 0xA6, 0xD3, 0xC5, 0x39, 0x5E, 0x68,
+ 0xCA, 0x7D, 0x17, 0x17, 0x46, 0x83, 0xF3, 0x84, 0x05, 0x36, 0xB8, 0xE2, 0xD4, 0x20, 0xC0, 0x86,
+ 0xCE, 0xB3, 0xC2, 0x4D, 0xE8, 0xE8, 0x1A, 0x7E, 0x06, 0x1C, 0xE1, 0xA9, 0x55, 0xCB, 0x2A, 0x88,
+ 0xC5, 0x5A, 0xE1, 0x15, 0x74, 0x1E, 0x31, 0x0E, 0xCE, 0xA9, 0x7D, 0xA4, 0xCB, 0xF1, 0x7B, 0xCD,
+ 0x56, 0x54, 0xF2, 0xDC, 0xD7, 0xE8, 0x59, 0x5C, 0xC1, 0x47, 0x6D, 0xB5, 0x3A, 0xB7, 0x4F, 0x30,
+ 0x90, 0x10, 0x7F, 0xD7, 0x16, 0xC2, 0xD5, 0xA2, 0x36, 0x10, 0x1A, 0x71, 0x19, 0x4A, 0x6F, 0xFF,
+ 0x5E, 0x4E, 0xC1, 0x2B, 0xC1, 0x96, 0xE4, 0x2A, 0x2A, 0xEB, 0x60, 0x9C, 0x4B, 0x11, 0x97, 0xED,
+ 0xEA, 0x6E, 0x83, 0xA3, 0x8B, 0x17, 0xEB, 0x42, 0xC8, 0x18, 0x40, 0x61, 0xB0, 0x26, 0x72, 0xAC,
+ 0xA2, 0x49, 0xA4, 0x9C, 0xD1, 0x32, 0x8E, 0xCF, 0x80, 0x71, 0xF1, 0x20, 0x47, 0xA5, 0x28, 0xD4,
+ 0xC8, 0x1E, 0xF1, 0xB0, 0xD2, 0x15, 0x21, 0xBF, 0x9C, 0x57, 0x88, 0xED, 0x30, 0x6F, 0x69, 0x3A,
+ 0xB4, 0x14, 0x16, 0x98, 0x17, 0xC1, 0xC2, 0x36, 0x16, 0x54, 0x02, 0xB7, 0x42, 0x0C, 0x88, 0x45,
+ 0x5E, 0x90, 0x89, 0xD6, 0xE3, 0xDB, 0x0F, 0xF6, 0x07, 0xC8, 0x5B, 0x89, 0x8E, 0x24, 0xA0, 0x9D,
+ 0xB7, 0xC6, 0xEC, 0x7E, 0xDB, 0xC1, 0xAC, 0x38, 0xB3, 0x26, 0xD9, 0xFE, 0x8A, 0xC2, 0x76, 0xDD,
+ 0x01, 0x41, 0x30, 0x2D, 0x75, 0xDC, 0xE8, 0x60, 0x0B, 0xEF, 0xCC, 0xBA, 0x41, 0x85, 0xFC, 0x34,
+ 0x59, 0x4C, 0xA4, 0x13, 0x10, 0x7D, 0xF6, 0xE0, 0x00, 0x14, 0x86, 0x95, 0xF0, 0x00, 0x41, 0xDF,
+ 0xBD, 0xB5, 0x00, 0xDB, 0xDC, 0x8F, 0x5B, 0x75, 0xDE, 0x5F, 0x75, 0xFC, 0x11, 0x7A, 0xC0, 0x0D,
+ 0xA2, 0xDB, 0xB8, 0x53, 0x59, 0x0B, 0xFE, 0xAF, 0x45, 0xDD, 0xB7, 0x72, 0x87, 0x2C, 0x4B, 0x04,
+ 0xCE, 0xC3, 0x37, 0x54, 0x9D, 0x62, 0xC3, 0x6A, 0x4D, 0x71, 0xAB, 0xF4, 0x85, 0xA5, 0x89, 0xD1,
+ 0xC9, 0xFB, 0x8C, 0x23, 0x70, 0x36, 0x75, 0x74, 0x5A, 0x6C, 0xD4, 0x50, 0x5C, 0xD0, 0x49, 0xCC,
+ 0x9B, 0x27, 0x8C, 0x99, 0xC9, 0x55, 0x9C, 0x48, 0xD1, 0x40, 0x91, 0xD9, 0x1F, 0xA2, 0x4F, 0xBB,
+ 0x87, 0x42, 0xA5, 0xDA, 0xC5, 0xCB, 0x13, 0xA4, 0x9C, 0xFB, 0xD1, 0xD7, 0xB9, 0x90, 0xEF, 0xF5,
+ 0x03, 0x92, 0xCD, 0x7B, 0xF9, 0x76, 0xF4, 0xF8, 0x76, 0x2E, 0x99, 0x13, 0x33, 0x61, 0xE1, 0x72,
+ 0x92, 0x4A, 0x9E, 0x8F, 0x20, 0xCE, 0x37, 0xC7, 0x17, 0x0F, 0xFF, 0x25, 0xDF, 0x16, 0xD4, 0xAF,
+ 0xD2, 0x47, 0x65, 0x4E, 0x2B, 0x0E, 0xBE, 0x45, 0x58, 0x8D, 0xFA, 0x7D, 0x59, 0x9D, 0xAE, 0x4E,
+ 0x7D, 0x9F, 0x8B, 0x40, 0x5E, 0x1D, 0x0C, 0x23, 0xAE, 0xC9, 0xFD, 0x9E, 0x61, 0x38, 0xF8, 0x81,
+ 0xC5, 0x71, 0xD4, 0x6B, 0x24, 0xB6, 0x96, 0xDC, 0xC9, 0x1B, 0xD1, 0x7C, 0x84, 0xFD, 0x79, 0xEE,
+ 0x7B, 0x34, 0x82, 0xA9, 0x01, 0xB1, 0x76, 0x61, 0x65, 0xDA, 0x74, 0x94, 0x93, 0x38, 0x1D, 0x23,
+ 0x3E, 0x69, 0x24, 0x4C, 0xA4, 0x9F, 0x4D, 0x04, 0xDA, 0x99, 0x32, 0x56, 0x81, 0x8D, 0x75, 0xDE,
+ 0x53, 0x09, 0x51, 0x6E, 0x31, 0x81, 0x0B, 0x1B, 0x18, 0xA3, 0xFF, 0xDF, 0x76, 0x7D, 0x57, 0x97,
+ 0x62, 0x8C, 0x48, 0x3B, 0x99, 0x1C, 0xA2, 0x8A, 0x16, 0xDA, 0x2D, 0x07, 0xEB, 0xE8, 0x2F, 0xAE,
+ 0x4E, 0xCF, 0xB4, 0xA1, 0xAD, 0xB2, 0xC5, 0xEB, 0x2C, 0x69, 0x8B, 0x3F, 0x02, 0xD8, 0x8E, 0x17,
+ 0x5E, 0xED, 0x51, 0xD9, 0x2A, 0x95, 0xAA, 0x3C, 0x61, 0x18, 0x67, 0x69, 0x8B, 0x1B, 0x5D, 0x60,
+ 0x88, 0xCF, 0x6C, 0x61, 0x96, 0xD5, 0x2C, 0xCD, 0xF2, 0x8A, 0xA5, 0x8E, 0x66, 0xC2, 0x18, 0x27,
+ 0x51, 0xA6, 0x4E, 0xDE, 0x95, 0x18, 0xBD, 0xC7, 0xDC, 0x52, 0x9F, 0xC0, 0x74, 0xBA, 0xD8, 0xF2,
+ 0x1C, 0x2B, 0x5C, 0x01, 0x29, 0xE4, 0x9D, 0xEE, 0xD5, 0xF6, 0xFF, 0x0E, 0x7C, 0x0D, 0x9E, 0x07,
+ 0x29, 0xF5, 0xED, 0xD7, 0x37, 0xA0, 0x57, 0x1A, 0x54, 0x3E, 0x15, 0xB6, 0xEC, 0x97, 0x27, 0x32,
+ 0xEA, 0x32, 0xC6, 0xB6, 0xBB, 0xF6, 0x2F, 0x0C, 0x12, 0x74, 0x0E, 0xFA, 0x75, 0x94, 0xD0, 0x11,
+ 0x79, 0xEE, 0xE4, 0xBD, 0x9C, 0x0E, 0x34, 0xFA, 0xA9, 0x66, 0x14, 0x89, 0xDA, 0x0E, 0x20, 0x65,
+ 0x4A, 0x68, 0x5B, 0xE8, 0xAE, 0x51, 0x4F, 0x9E, 0x18, 0x5D, 0x6F, 0x7C, 0x16, 0xD3, 0x76, 0x6C,
+ 0xBE, 0x5E, 0x2D, 0x95, 0x95, 0x0B, 0x08, 0x07, 0x35, 0xD3, 0x09, 0xCB, 0x68, 0x31, 0x13, 0x0C,
+ 0x5B, 0xED, 0x4A, 0xE2, 0x0F, 0x8B, 0x5B, 0x68, 0xDC, 0x33, 0xA6, 0x83, 0x98, 0x6B, 0x85, 0x06,
+ 0x16, 0xF3, 0xFE, 0xED, 0x60, 0x4E, 0x52, 0x6D, 0x71, 0x91, 0x88, 0x43, 0xBE, 0xEF, 0xC4, 0xAD,
+ 0x13, 0x42, 0x18, 0x50, 0x71, 0x34, 0x1A, 0x18, 0xE0, 0x83, 0x5F, 0xD0, 0xE3, 0x68, 0xAD, 0x85,
+ 0xFB, 0x81, 0x9A, 0xCE, 0x38, 0x25, 0xFE, 0xDF, 0xE8, 0xE9, 0xE4, 0x89, 0xE9, 0x38, 0x6D, 0x99,
+ 0xA4, 0x7C, 0x05, 0xB6, 0xB6, 0x5C, 0x96, 0x70, 0xDE, 0x62, 0xE5, 0x6F, 0x91, 0x19, 0xFF, 0x84,
+ 0x14, 0x5E, 0xD4, 0xCC, 0xE9, 0x99, 0x89, 0xF5, 0x72, 0x72, 0x83, 0x9D, 0xEF, 0x8B, 0xA3, 0x63,
+ 0xEA, 0x76, 0x7A, 0xF2, 0xD5, 0x1D, 0x50, 0xC9, 0x1B, 0xBC, 0x4D, 0x77, 0xB3, 0xDA, 0x1E, 0x8B,
+ 0x1B, 0x39, 0x04, 0xB5, 0x1A, 0x42, 0xDD, 0x18, 0xE5, 0xE3, 0x5F, 0xFD, 0x05, 0x9B, 0xBE, 0x01,
+ 0xA5, 0xAD, 0x0A, 0x9A, 0x62, 0xBB, 0xE2, 0x43, 0xAB, 0x14, 0x96, 0xD2, 0xCC, 0xBE, 0xA9, 0x0C,
+ 0xE8, 0xBF, 0x40, 0x04, 0x01, 0xD5, 0x34, 0x5F, 0x25, 0x25, 0x2B, 0xD2, 0x76, 0xA4, 0x60, 0x6F,
+ 0xF2, 0xE6, 0x5C, 0x35, 0x44, 0x06, 0x36, 0x8D, 0xBA, 0xD5, 0xD7, 0x9F, 0x13, 0xC8, 0xF1, 0x0B,
+ 0x0A, 0x40, 0xED, 0xD2, 0x40, 0x93, 0xCE, 0x4E, 0x15, 0x78, 0xF1, 0x92, 0x59, 0xDB, 0xE9, 0x1B,
+ 0x1E, 0x91, 0xF3, 0xCA, 0x22, 0x00, 0x28, 0xE6, 0xCE, 0xF1, 0x4E, 0x77, 0x2B, 0xF5, 0xFC, 0x2E,
+ 0x90, 0xAA, 0xFA, 0x47, 0x00, 0xEC, 0x42, 0x45, 0x8B, 0xD0, 0xD8, 0xAA, 0x06, 0x0A, 0x79, 0xD3,
+ 0xBB, 0xAE, 0xDA, 0xE6, 0xF2, 0x7E, 0x15, 0x34, 0xA7, 0x10, 0xB9, 0xAD, 0xC7, 0x24, 0x25, 0xFF,
+ 0xF1, 0xDD, 0x12, 0x68, 0xFA, 0x93, 0xAF, 0x55, 0xEB, 0xEC, 0xA0, 0xAB, 0x48, 0x66, 0xBB, 0x2C,
+ 0x15, 0x9A, 0x36, 0xD9, 0xC4, 0x6C, 0x6B, 0x9E, 0x8B, 0x55, 0x67, 0x03, 0xE4, 0xAE, 0x23, 0xB0,
+ 0x89, 0x92, 0xDD, 0x04, 0x3A, 0xEB, 0xFA, 0x43, 0x00, 0xA5, 0x03, 0x32, 0x25, 0x86, 0x02, 0x37,
+ 0xCD, 0xCA, 0xF2, 0x88, 0x22, 0x41, 0x93, 0x31, 0x75, 0x6C, 0xA1, 0x66, 0xD5, 0xC8, 0x26, 0x2C,
+ 0x30, 0x4F, 0xED, 0xF2, 0x07, 0xA6, 0x4F, 0x85, 0x0C, 0xBC, 0xEC, 0xA6, 0xE5, 0x8A, 0xBA, 0x1C,
+ 0xCA, 0xF6, 0x22, 0x65, 0xDD, 0x7A, 0x65, 0x85, 0x2C, 0x5A, 0xF3, 0xDC, 0xAD, 0xB6, 0xC3, 0xF8,
+ 0x03, 0x2A, 0x0B, 0x01, 0xB2, 0x38, 0x96, 0xF7, 0x2F, 0xFA, 0xD6, 0x6B, 0xD9, 0x5C, 0x0C, 0xCD,
+ 0x3F, 0xE4, 0xB9, 0x8B, 0xA7, 0x51, 0x23, 0x8A, 0xCE, 0x08, 0xD5, 0xDB, 0x19, 0xF6, 0xF4, 0x92,
+ 0xF8, 0xE2, 0x6B, 0xB0, 0xC6, 0x3D, 0x2E, 0xE7, 0xF1, 0x84, 0xA1, 0x12, 0x07, 0x14, 0x50, 0xBB,
+ 0x86, 0x8D, 0x59, 0xBD, 0x6C, 0xE3, 0x3B, 0xA6, 0xEF, 0xF9, 0xD4, 0x3B, 0x1F, 0x1D, 0x39, 0xBF,
+ 0xB6, 0xFD, 0xF2, 0x22, 0x00, 0xBC, 0xF5, 0xA8, 0x48, 0xFF, 0x65, 0xF4, 0xD0, 0xD5, 0x5E, 0x47,
+ 0x47, 0x82, 0xF6, 0xC5, 0x88, 0x95, 0xE7, 0x65, 0xA7, 0x89, 0x2D, 0x6C, 0x1C, 0xCA, 0x2D, 0x30,
+ 0xE7, 0xD5, 0x77, 0xBA, 0xA4, 0x08, 0x03, 0x8B, 0x2D, 0x2D, 0x5A, 0xA3, 0xA5, 0x1D, 0x00, 0x62,
+ 0x61, 0xC8, 0x6D, 0x9B, 0xF9, 0x61, 0xF1, 0x0A, 0x8C, 0x2B, 0x48, 0x10, 0x66, 0x9D, 0x41, 0xC8,
+ 0x5A, 0xE3, 0x7C, 0xC1, 0x24, 0x09, 0x93, 0xE3, 0x71, 0x53, 0x2D, 0x44, 0xA5, 0x9A, 0xE1, 0xCF,
+ 0xBE, 0x89, 0x35, 0x1E, 0x7A, 0x22, 0x71, 0xD4, 0x68, 0x4D, 0x7F, 0xBD, 0x4D, 0x67, 0x76, 0x03,
+ 0xA8, 0x56, 0x12, 0xC7, 0x6B, 0x84, 0x81, 0xBB, 0x0B, 0x3A, 0x6A, 0xE2, 0x0F, 0x9D, 0xA0, 0xD6,
+ 0x2E, 0x88, 0xA9, 0x64, 0xE7, 0xF0, 0x28, 0x78, 0xCD, 0x26, 0xBB, 0x4B, 0xE5, 0xFB, 0xB8, 0xD1,
+ 0x63, 0xA2, 0x99, 0x76, 0x50, 0xCE, 0xF6, 0xC1, 0x96, 0xE0, 0x1A, 0x4E, 0x1B, 0xC6, 0x09, 0x58,
+ 0x3B, 0xE6, 0xFF, 0x75, 0x96, 0x80, 0x8D, 0x85, 0x2B, 0x90, 0x01, 0x06, 0x8D, 0xB0, 0x42, 0x7E,
+ 0xF5, 0x25, 0xAD, 0x24, 0xB1, 0x88, 0x9C, 0x1A, 0x24, 0x8A, 0x68, 0x5A, 0xD5, 0x24, 0x94, 0x78,
+ 0xB2, 0x1A, 0xB9, 0xC3, 0xA2, 0x19, 0x92, 0x91, 0x1A, 0x77, 0x66, 0xD6, 0x6B, 0xF5, 0x5A, 0x49,
+ 0xC7, 0xAA, 0x44, 0x41, 0x43, 0xF3, 0xE9, 0xC3, 0x5F, 0x16, 0x43, 0x7D, 0x15, 0xF5, 0x0A, 0xC2,
+ 0x8A, 0x50, 0x64, 0x01, 0x7B, 0x8C, 0x09, 0x85, 0xDD, 0x22, 0xE3, 0x9E, 0xA9, 0x46, 0x1E, 0x02,
+ 0xE4, 0x01, 0xB0, 0x5D, 0xB8, 0xE8, 0x14, 0xEB, 0x4E, 0x29, 0x23, 0xDE, 0xAE, 0x62, 0x45, 0x01,
+ 0xC8, 0x25, 0x87, 0x18, 0xB3, 0xF9, 0xAD, 0x03, 0x3E, 0x59, 0x49, 0x71, 0xA9, 0xC7, 0x27, 0xD7,
+ 0xBA, 0x65, 0xCD, 0x27, 0x1E, 0x50, 0xE0, 0xD8, 0x8F, 0x84, 0x6B, 0x0F, 0x6C, 0x12, 0x36, 0x04,
+ 0x6B, 0x5D, 0xE3, 0x7D, 0xD5, 0x53, 0xAF, 0xBC, 0xB0, 0x82, 0x21, 0x58, 0xC9, 0xFF, 0xDF, 0x87,
+ 0x18, 0x09, 0x4B, 0x79, 0x50, 0xB4, 0x5F, 0x9B, 0xF7, 0x94, 0xAA, 0x7F, 0xB5, 0x03, 0x29, 0x58,
+ 0x60, 0xD4, 0xC9, 0x39, 0xC1, 0x58, 0x21, 0xE8, 0xF5, 0x2D, 0x49, 0x58, 0xB1, 0x25, 0xE9, 0x82,
+ 0x15, 0xB7, 0xDD, 0x8E, 0x3D, 0x28, 0x1F, 0x97, 0xE5, 0xDA, 0x2B, 0x33, 0xB9, 0x2F, 0x08, 0x29,
+ 0x80, 0x87, 0xA2, 0xB7, 0x80, 0x33, 0x2A, 0xE5, 0xD5, 0x49, 0x7B, 0x84, 0x13, 0x66, 0x7D, 0xE3,
+ 0x1B, 0x92, 0x9F, 0x90, 0xCE, 0x74, 0x67, 0x4C, 0xC3, 0x74, 0xC0, 0x75, 0x86, 0x63, 0x4C, 0x5E,
+ 0xA1, 0x42, 0xAC, 0xC7, 0x9B, 0x65, 0x17, 0x23, 0x6D, 0x50, 0x19, 0xF9, 0x99, 0x15, 0xA8, 0x73,
+ 0x0E, 0x28, 0xBA, 0x2C, 0x9A, 0xC0, 0x35, 0x13, 0x16, 0xBC, 0x12, 0x09, 0x0F, 0xF3, 0x0C, 0xE3,
+ 0xE1, 0x27, 0x63, 0x75, 0x60, 0xD3, 0xA8, 0xB9, 0xAD, 0x10, 0x18, 0xC3, 0x52, 0x36, 0xED, 0xF4,
+ 0xA4, 0x22, 0x4C, 0xC0, 0x24, 0x36, 0xD5, 0xBC, 0xDF, 0xD5, 0x5A, 0xC2, 0xA1, 0x23, 0x6F, 0x2F,
+ 0x1A, 0xA2, 0x31, 0x97, 0x24, 0xB8, 0x67, 0xD7, 0x4B, 0x53, 0x50, 0x19, 0x6A, 0xDF, 0x40, 0x21,
+ 0xCB, 0x2F, 0x43, 0xD1, 0xD2, 0x68, 0x6B, 0x76, 0x07, 0x8B, 0xA4, 0xC8, 0xD0, 0x5E, 0xAF, 0x22,
+ 0x51, 0x13, 0x34, 0x1F, 0x26, 0xAC, 0x7D, 0xC2, 0x6E, 0x6D, 0x21, 0x98, 0xFC, 0x3B, 0xC2, 0x95,
+ 0xAD, 0x74, 0xCB, 0xF0, 0xC0, 0xB7, 0xD0, 0xAE, 0x86, 0x46, 0x5D, 0x84, 0xED, 0xEB, 0xB8, 0x64,
+ 0x66, 0x2A, 0xA7, 0xA1, 0xE3, 0xCB, 0x48, 0x7D, 0xD8, 0x2E, 0xCE, 0x7B, 0x37, 0xD2, 0x24, 0xB5,
+ 0x80, 0x31, 0x0C, 0x77, 0x24, 0x4E, 0x96, 0x59, 0x99, 0x05, 0x80, 0xCF, 0x13, 0x15, 0x4A, 0x97,
+ 0x43, 0x6F, 0x45, 0xB9, 0xE8, 0x45, 0x46, 0x90, 0x98, 0x49, 0xC1, 0x83, 0x85, 0x4B, 0x67, 0x7E,
+ 0x58, 0x78, 0x9E, 0x69, 0x9C, 0xDF, 0x1F, 0xEC, 0xC5, 0x01, 0xB3, 0x5D, 0x51, 0xF9, 0xCE, 0x84,
+ 0x19, 0x5C, 0x67, 0xC1, 0xCE, 0x26, 0x4A, 0xAD, 0xBF, 0x23, 0x00, 0x43, 0x78, 0x3C, 0x2A, 0x0C,
+ 0xAE, 0xFC, 0x0A, 0x9A, 0x46, 0x2D, 0x37, 0x80, 0xCB, 0xB2, 0xBE, 0x8B, 0x5D, 0xAE, 0x21, 0x11,
+ 0xAC, 0xDE, 0x6F, 0xC1, 0x8D, 0xFB, 0xA1, 0xCF, 0xBA, 0x72, 0xCF, 0x81, 0xD7, 0x74, 0x1A, 0x10,
+ 0x82, 0x2A, 0x5F, 0xFB, 0xE0, 0x22, 0xD5, 0x7B, 0x5A, 0x62, 0xB3, 0x4B, 0x5D, 0x94, 0x9C, 0xFE,
+ 0xFE, 0x7E, 0xFE, 0xC9, 0x1F, 0xA7, 0x9B, 0xBB, 0x8F, 0x42, 0x26, 0x8E, 0x96, 0x70, 0x2C, 0xD0,
+ 0x20, 0xE3, 0xC7, 0xC0, 0x29, 0x4C, 0xCE, 0x37, 0x67, 0x77, 0x51, 0x22, 0x43, 0x83, 0xEA, 0x36,
+ 0x85, 0xEA, 0xCD, 0x08, 0x28, 0xC7, 0x36, 0x8E, 0xF6, 0x5F, 0x34, 0x65, 0x02, 0x61, 0xAC, 0xB5,
+ 0x42, 0xE3, 0xD6, 0x8D, 0x9B, 0xFC, 0x2F, 0x5A, 0xBA, 0xC4, 0x84, 0x10, 0x42, 0xCE, 0xBB, 0x8C,
+ 0x48, 0xF6, 0xD1, 0x0A, 0xDA, 0x45, 0x8D, 0x47, 0x6C, 0x18, 0xBB, 0x87, 0xB6, 0x35, 0xDB, 0xDE,
+ 0x01, 0x79, 0x5E, 0x0C, 0x94, 0xFC, 0xF0, 0x9B, 0x61, 0x77, 0xEF, 0x6C, 0x36, 0xE9, 0x85, 0x54,
+ 0xC8, 0x37, 0x1F, 0x35, 0x85, 0x8B, 0x22, 0x53, 0x02, 0xF4, 0xBA, 0x09, 0x5E, 0xD9, 0x4A, 0x74,
+ 0xE5, 0x62, 0x7C, 0xE0, 0x41, 0xC9, 0x02, 0xA2, 0xAB, 0x9E, 0x0B, 0x53, 0xB7, 0x04, 0xAF, 0xBF,
+ 0x4A, 0xC3, 0x88, 0x53, 0x13, 0xE5, 0xED, 0xC7, 0x2D, 0x35, 0x4E, 0x7F, 0xA5, 0x34, 0xA7, 0xB3,
+ 0x3B, 0xEB, 0x7B, 0x60, 0xB1, 0x0B, 0xB3, 0xA0, 0x32, 0x02, 0xBB, 0x31, 0x34, 0x7B, 0xE5, 0x91,
+ 0x1F, 0x48, 0xE0, 0x7F, 0x94, 0x95, 0x3C, 0xA4, 0x36, 0x86, 0x31, 0x3A, 0x77, 0xA0, 0xDA, 0x50,
+ 0x15, 0xB9, 0x13, 0xA0, 0x35, 0x27, 0x70, 0xCC, 0x19, 0xF3, 0x89, 0x22, 0x7C, 0x35, 0xF1, 0xF0,
+ 0xCE, 0xCF, 0x3B, 0x15, 0x39, 0xB7, 0xE1, 0x11, 0xB4, 0xFC, 0x4E, 0x02, 0x60, 0x05, 0xBB, 0x7E,
+ 0x08, 0x01, 0x8B, 0xB5, 0x77, 0x87, 0x70, 0x60, 0xDB, 0x38, 0x52, 0x31, 0x6B, 0x11, 0x41, 0xBF,
+ 0x1B, 0xCB, 0x67, 0x84, 0xC9, 0x7B, 0xA1, 0xBA, 0xA3, 0x2F, 0x21, 0xEC, 0x0D, 0x89, 0x5A, 0x75,
+ 0x36, 0x20, 0x82, 0xC6, 0xC1, 0x93, 0x12, 0xD6, 0x11, 0x22, 0xBF, 0x9F, 0x0E, 0x59, 0xFC, 0xFB,
+ 0xA0, 0x20, 0x47, 0xC7, 0x9A, 0x98, 0xB8, 0x1F, 0x95, 0x1D, 0x4C, 0x5B, 0x97, 0xEF, 0x92, 0x40,
+ 0xAB, 0xB7, 0x21, 0x60, 0xE4, 0x65, 0xCF, 0xAC, 0xD8, 0x34, 0x91, 0x83, 0xD2, 0x71, 0xAA, 0xFC,
+ 0xAB, 0xA8, 0xF5, 0x6A, 0x05, 0x86, 0x01, 0x56, 0x72, 0x8F, 0x5B, 0xAA, 0x51, 0x6B, 0x3F, 0xA3,
+ 0x32, 0xA3, 0xE4, 0x99, 0xED, 0x38, 0x43, 0x46, 0x8D, 0x61, 0x80, 0x88, 0xC3, 0xEF, 0xAA, 0xF6,
+ 0xAA, 0x6F, 0x34, 0xA1, 0xD7, 0x81, 0x4C, 0x9C, 0xD7, 0xEC, 0xE0, 0x9E, 0x26, 0x6B, 0x2C, 0xF8,
+ 0xC0, 0xD5, 0x0B, 0xA1, 0x73, 0xA7, 0xBD, 0x4B, 0x68, 0xD0, 0xFB, 0x75, 0xF3, 0x1C, 0x9C, 0x26,
+ 0xC3, 0x60, 0xB2, 0x11, 0x81, 0xFE, 0x12, 0x13, 0xC4, 0x6B, 0xE5, 0x52, 0x72, 0x00, 0x26, 0x4E,
+ 0x7A, 0xFF, 0x2C, 0x20, 0xCB, 0x32, 0xAA, 0xE4, 0xEE, 0x6B, 0x89, 0x52, 0xC5, 0x2B, 0xDC, 0xFA,
+ 0x1B, 0x52, 0x4D, 0x8E, 0x02, 0xDB, 0x84, 0x4E, 0x7C, 0x37, 0xBA, 0xFF, 0xDC, 0x8D, 0x3F, 0xC6,
+ 0xBE, 0x5C, 0x1D, 0x85, 0xF3, 0xE3, 0x4A, 0x83, 0x28, 0x61, 0xB3, 0xC0, 0xF6, 0x05, 0x8B, 0x8A,
+ 0xE8, 0xED, 0x3E, 0x92, 0x70, 0x9A, 0xFB, 0xF3, 0x5B, 0x39, 0x3A, 0x3B, 0x3E, 0x33, 0x25, 0x01,
+ 0x15, 0x86, 0x5B, 0x17, 0x14, 0x42, 0xBD, 0x83, 0xD5, 0x8B, 0x7E, 0xA8, 0xFC, 0xF9, 0x26, 0x1D,
+ 0xEC, 0xD9, 0xE4, 0x25, 0xCC, 0x3A, 0x3A, 0xD7, 0x07, 0x7C, 0x59, 0x87, 0xC2, 0x4F, 0x7C, 0x7E,
+ 0xDD, 0x4F, 0x02, 0x4B, 0x46, 0xBA, 0xFD, 0x1A, 0x26, 0x46, 0x01, 0x3C, 0x26, 0xDF, 0x38, 0x03,
+ 0xA5, 0x0E, 0xF0, 0x8B, 0xC8, 0xDD, 0xE1, 0x37, 0xD5, 0xDB, 0x51, 0x1B, 0x9C, 0x7B, 0x81, 0x12,
+ 0x15, 0xCA, 0x6D, 0x85, 0xDB, 0x02, 0x2A, 0xA3, 0x2B, 0x52, 0xAA, 0x05, 0xE9, 0xCA, 0x42, 0xCA,
+ 0x01, 0x4B, 0xBF, 0x2C, 0x82, 0x5F, 0x4E, 0x9E, 0xE2, 0xCB, 0x2D, 0xAD, 0x64, 0xC4, 0xA6, 0xC1,
+ 0xFB, 0xA8, 0xA7, 0x7F, 0x46, 0xC3, 0xA9, 0xF5, 0xC1, 0x68, 0x5F, 0x54, 0x18, 0x2F, 0xD4, 0x5A,
+ 0xD1, 0x94, 0x71, 0x52, 0x90, 0x33, 0xD0, 0xD9, 0xF2, 0x05, 0x83, 0x08, 0x42, 0x77, 0xE5, 0x57,
+ 0x6D, 0x78, 0xB9, 0x20, 0x92, 0x1C, 0xB0, 0x64, 0x39, 0xE1, 0xC8, 0x27, 0x33, 0xB6, 0x24, 0x3D,
+ 0x8E, 0xE3, 0x6D, 0x41, 0x9A, 0x4C, 0x36, 0x11, 0xB2, 0x7D, 0x5C, 0xD3, 0x4B, 0x56, 0x42, 0x1E,
+ 0xB3, 0xD4, 0x1E, 0x55, 0xFE, 0x0C, 0x1B, 0x91, 0x30, 0x74, 0x3C, 0x2C, 0x98, 0x58, 0xD7, 0x0D,
+ 0xA3, 0xCD, 0x17, 0x07, 0xBD, 0xDC, 0x31, 0x7C, 0xCE, 0x89, 0x9E, 0xDB, 0xDF, 0x39, 0x52, 0x9B,
+ 0x8B, 0x02, 0x78, 0xAD, 0xD8, 0xA7, 0xB3, 0xE4, 0x81, 0xE4, 0xFB, 0x41, 0xE6, 0x64, 0x56, 0x8F,
+ 0x86, 0x80, 0xF4, 0x67, 0x20, 0x40, 0x72, 0xFD, 0xCC, 0x36, 0x15, 0xDA, 0xB7, 0x2E, 0xD8, 0x4F,
+ 0x25, 0x54, 0x50, 0xA9, 0xD0, 0x5B, 0x1A, 0x7D, 0xB0, 0xA6, 0xDF, 0x5D, 0xB4, 0x1B, 0x13, 0x3A,
+ 0xA2, 0x46, 0xEF, 0xE7, 0x53, 0x60, 0xF4, 0x20, 0xF1, 0x51, 0x31, 0x5A, 0x36, 0xB1, 0xA6, 0xA7,
+ 0xDA, 0x9E, 0x26, 0x73, 0xEC, 0x8B, 0x65, 0xD8, 0x64, 0x85, 0x27, 0x51, 0x27, 0xB1, 0xEB, 0x4B,
+ 0xBB, 0x78, 0x0C, 0xD0, 0xF5, 0xE4, 0xEC, 0x52, 0xEB, 0x0E, 0xEB, 0x13, 0x3C, 0x1E, 0xD7, 0x35,
+ 0x88, 0x5D, 0x98, 0x11, 0x9D, 0x0B, 0x75, 0xEC, 0xEC, 0x67, 0x42, 0xB5, 0x4C, 0xF6, 0xF0, 0x4C,
+ 0xA2, 0xE1, 0x38, 0xF4, 0x55, 0x95, 0xCB, 0x54, 0x0F, 0xD3, 0xE8, 0x3C, 0xF2, 0x39, 0x9E, 0xD6,
+ 0x34, 0x46, 0x21, 0x85, 0xD5, 0x63, 0xE8, 0x4B, 0x34, 0xAA, 0x31, 0x6E, 0xA7, 0xD0, 0xA9, 0xC7,
+ 0x54, 0x54, 0x62, 0x00, 0x9B, 0xB5, 0x89, 0x94, 0x8F, 0x6C, 0x0C, 0xD5, 0x6C, 0x23, 0x13, 0xCD,
+ 0x58, 0x6E, 0xCA, 0x9A, 0xF1, 0x08, 0x24, 0x94, 0xA3, 0x80, 0xD9, 0x2F, 0xA9, 0x32, 0x1D, 0x3A,
+ 0x3F, 0x67, 0xCB, 0xD5, 0x7D, 0x4D, 0x89, 0x56, 0x5C, 0xE5, 0xDC, 0x37, 0x99, 0x27, 0x3E, 0x66,
+ 0x82, 0x59, 0x3F, 0xF2, 0x68, 0xE2, 0xC4, 0xA9, 0xE9, 0xD8, 0xFB, 0x5E, 0x8E, 0x22, 0x0E, 0x77,
+ 0x5F, 0x65, 0x9B, 0x91, 0xDC, 0x59, 0xC4, 0x91, 0x30, 0x44, 0x24, 0x7A, 0x74, 0x49, 0xA3, 0xA1,
+ 0x4C, 0x2A, 0xBF, 0xC3, 0xD7, 0x21, 0x21, 0x2A, 0xA9, 0x8C, 0x5F, 0x45, 0xDA, 0x78, 0x5E, 0x55,
+ 0x7F, 0x7C, 0x41, 0xD3, 0x6D, 0x0B, 0xBE, 0x83, 0xA8, 0x5E, 0x08, 0xF5, 0xEC, 0xCC, 0xFD, 0x21,
+ 0xB3, 0x1D, 0x6A, 0xCC, 0xF9, 0x52, 0xF3, 0x89, 0x96, 0x2A, 0x70, 0xAB, 0x63, 0x62, 0xA3, 0xB4,
+ 0xE7, 0x70, 0xE9, 0xDF, 0x4C, 0xED, 0x52, 0xA0, 0x24, 0x38, 0x58, 0xF1, 0xC6, 0x5B, 0x28, 0xA0,
+ 0x8F, 0x84, 0x36, 0x60, 0xFB, 0x17, 0xAA, 0x27, 0xB1, 0xA5, 0x71, 0xE8, 0x1E, 0xDF, 0xB9, 0x0A,
+ 0x0D, 0x15, 0x83, 0xF6, 0xE1, 0xF2, 0x51, 0x8F, 0x92, 0x67, 0x63, 0xAB, 0xD1, 0x2A, 0x29, 0x77,
+ 0x2D, 0xF0, 0x1E, 0x0E, 0x19, 0xCC, 0x4E, 0x9D, 0x8F, 0xAA, 0xDE, 0xC1, 0x15, 0x1A, 0xBD, 0x19,
+ 0x79, 0xD0, 0x61, 0x51, 0x2D, 0x23, 0x82, 0x8E, 0x2C, 0xA3, 0x00, 0x9E, 0x91, 0x83, 0xD4, 0x61,
+ 0x6E, 0x53, 0x1B, 0x81, 0xBD, 0x07, 0x69, 0x24, 0xE7, 0xF7, 0xD4, 0x5B, 0x65, 0x72, 0xE2, 0x0F,
+ 0x05, 0x41, 0xD5, 0xD6, 0x5E, 0x9D, 0xF3, 0xF0, 0xA0, 0xF5, 0x7C, 0xC9, 0x2F, 0x0C, 0x87, 0xEC,
+ 0x13, 0xDB, 0x79, 0x70, 0x89, 0x0C, 0x67, 0x40, 0xC9, 0xCA, 0xF3, 0xE0, 0xEA, 0x12, 0xF1, 0x92,
+ 0xD4, 0x02, 0x71, 0x79, 0xE6, 0xF7, 0xC6, 0xC5, 0x27, 0x4A, 0x9D, 0xAC, 0x32, 0x6A, 0x44, 0xD9,
+ 0x01, 0x8D, 0x01, 0x1F, 0x2A, 0xD7, 0xE5, 0x7F, 0x32, 0x51, 0x9F, 0xB6, 0x36, 0x8A, 0x98, 0x4E,
+ 0xA1, 0x0D, 0xA3, 0xCD, 0x3C, 0xF7, 0xDF, 0x30, 0x0A, 0xD9, 0x2A, 0x6A, 0xD6, 0x97, 0x14, 0x34,
+ 0x0C, 0xA1, 0xC5, 0x87, 0x1B, 0x63, 0x4D, 0xBA, 0x23, 0x9E, 0x3D, 0x6E, 0x4F, 0x80, 0x3D, 0x32,
+ 0x28, 0x1D, 0x51, 0x8F, 0x63, 0xCA, 0xA6, 0x5A, 0x77, 0xB8, 0xB9, 0xA2, 0xE5, 0x05, 0x8C, 0xE9,
+ 0xE3, 0xC7, 0xC8, 0xF0, 0x43, 0x14, 0x29, 0x7E, 0x70, 0x23, 0x77, 0x18, 0x2D, 0x3A, 0x20, 0x14,
+ 0x1F, 0x26, 0x0F, 0x46, 0x33, 0x0A, 0x6A, 0x6B, 0xCA, 0x62, 0xB0, 0xF0, 0xCB, 0xB4, 0x48, 0xFA,
+ 0xB2, 0x84, 0x55, 0x0B, 0x45, 0x35, 0xC2, 0x47, 0x65, 0x72, 0x4B, 0x78, 0x54, 0x29, 0xD3, 0xD6,
+ 0x44, 0xF9, 0xA5, 0x83, 0xA7, 0xA7, 0x04, 0x31, 0x34, 0xA8, 0x3B, 0x8B, 0xCD, 0x13, 0xA2, 0x00,
+ 0xCB, 0x61, 0x9D, 0x9E, 0x40, 0xE1, 0xDB, 0x75, 0x47, 0x12, 0xE8, 0x89, 0x4C, 0x31, 0xA5, 0x4D,
+ 0xDC, 0xA5, 0x6D, 0x79, 0x47, 0x3E, 0x58, 0xB5, 0x91, 0x9B, 0x02, 0xEC, 0x82, 0x28, 0xCF, 0x11,
+ 0x5C, 0x12, 0xFA, 0x88, 0xDE, 0x9C, 0x15, 0x4D, 0xCF, 0xD4, 0x24, 0xAD, 0x5F, 0x16, 0xF0, 0xD0,
+ 0x88, 0xC0, 0xF9, 0x77, 0x97, 0xE0, 0xC5, 0x69, 0x20, 0x18, 0x4E, 0x9C, 0x2A, 0x19, 0x66, 0x42,
+ 0xD5, 0x5C, 0xD3, 0x87, 0x6B, 0xB2, 0xB0, 0xDE, 0x78, 0xB3, 0x8C, 0x5D, 0x90, 0xC3, 0x25, 0x3D,
+ 0xA3, 0xCC, 0xB0, 0x4C, 0x97, 0x0F, 0x6D, 0x29, 0x11, 0x42, 0xB3, 0x86, 0x99, 0x87, 0x37, 0x5A,
+ 0x45, 0x93, 0xE0, 0x88, 0xC9, 0x35, 0x05, 0x48, 0xCA, 0x84, 0xAB, 0x13, 0xF8, 0x06, 0xA4, 0x0B,
+ 0x72, 0x2A, 0x8D, 0xEB, 0xA0, 0x89, 0x3D, 0x0B, 0x00, 0x1A, 0x17, 0x87, 0xCD, 0x95, 0x30, 0x2E,
+ 0xC5, 0xF3, 0xA6, 0x42, 0x5C, 0x63, 0x7A, 0xF6, 0xD0, 0xE3, 0x6D, 0x9C, 0xC8, 0xF7, 0x83, 0xC3,
+ 0xED, 0x9F, 0xFA, 0xF0, 0xC6, 0xE0, 0xFE, 0xCD, 0xFB, 0xC8, 0x18, 0x83, 0x77, 0xAA, 0xDA, 0x58,
+ 0x17, 0xD2, 0x7B, 0x73, 0x62, 0x2D, 0xC0, 0xE1, 0xF8, 0xA9, 0x3E, 0x06, 0x97, 0x3F, 0x9B, 0xF4,
+ 0xBB, 0x16, 0x25, 0x31, 0x69, 0x7C, 0xD6, 0xD6, 0xB3, 0x01, 0x35, 0x41, 0x77, 0x25, 0x71, 0xDE,
+ 0x2D, 0x2C, 0xEF, 0x9E, 0x9A, 0xD6, 0x4C, 0xD9, 0x8C, 0x0C, 0xD1, 0xD8, 0xA2, 0x48, 0x59, 0x6D,
+ 0x41, 0x15, 0xED, 0xAC, 0x98, 0xA8, 0x47, 0x3D, 0x4B, 0x7D, 0xE7, 0x14, 0xB7, 0xAB, 0x7F, 0xA9,
+ 0xCD, 0xAA, 0x49, 0x65, 0x48, 0x34, 0x8C, 0x65, 0xD6, 0x38, 0x5D, 0xE1, 0x14, 0xFC, 0x4F, 0xE6,
+ 0xE4, 0x87, 0x21, 0xE2, 0x54, 0x08, 0x91, 0x22, 0xED, 0x3E, 0x87, 0xEE, 0x31, 0x9A, 0xC4, 0x40,
+ 0x78, 0x46, 0x2E, 0xF9, 0xDB, 0xED, 0x64, 0xD7, 0x10, 0xA4, 0x99, 0x3E, 0x43, 0x43, 0xB2, 0x54,
+ 0x20, 0x20, 0x7D, 0x93, 0x34, 0x0D, 0x0C, 0x86, 0x52, 0x1A, 0x9D, 0x19, 0x12, 0x88, 0xDD, 0x14,
+ 0xAE, 0x57, 0x72, 0x75, 0x26, 0xDF, 0xC4, 0xA1, 0x90, 0x49, 0xC7, 0x0C, 0xE1, 0xA6, 0x11, 0x2C,
+ 0x00, 0xBF, 0xB6, 0xF5, 0xF2, 0x21, 0x4B, 0x14, 0xB4, 0x07, 0xBE, 0x04, 0x72, 0xCB, 0xBE, 0xB6,
+ 0x24, 0x27, 0xCF, 0x7D, 0x75, 0x2B, 0x31, 0xD6, 0xA6, 0x84, 0x55, 0x11, 0xD7, 0x91, 0x5A, 0x15,
+ 0x9C, 0xB0, 0x9D, 0x7E, 0xB1, 0xC6, 0xB7, 0xA5, 0xE0, 0xB2, 0x88, 0x98, 0x9C, 0x2F, 0x67, 0x29,
+ 0xDA, 0x88, 0xC9, 0xA5, 0x27, 0x53, 0x4D, 0x8F, 0x0B, 0xF8, 0x08, 0x2C, 0xE7, 0x88, 0x26, 0x9C,
+ 0xD9, 0x10, 0xD9, 0xE4, 0xDB, 0xA4, 0xF7, 0xAD, 0x9F, 0x4E, 0x65, 0x3E, 0xF4, 0xA4, 0x57, 0x18,
+ 0x2C, 0xDD, 0x0E, 0x6D, 0x26, 0xA3, 0xC2, 0x66, 0x0D, 0x71, 0x79, 0x22, 0x8E, 0xD5, 0x6A, 0xFC,
+ 0xF4, 0x71, 0x83, 0x27, 0xEF, 0x24, 0x50, 0xBA, 0x54, 0x1A, 0xE4, 0x98, 0x84, 0x3F, 0x27, 0xE3,
+ 0x29, 0x3E, 0x45, 0xC1, 0xB1, 0x00, 0x88, 0x54, 0x4D, 0xF0, 0x87, 0x7B, 0x30, 0x7B, 0xA1, 0xC7,
+ 0x6C, 0xD7, 0x48, 0xA0, 0xFF, 0xCB, 0x89, 0x92, 0x6D, 0x0E, 0x05, 0x3A, 0xCE, 0x95, 0x30, 0x23,
+ 0xD7, 0x42, 0x77, 0xA9, 0x5E, 0xF5, 0xD9, 0xEB, 0x5A, 0xB7, 0x83, 0xB9, 0x91, 0x14, 0x51, 0x13,
+ 0x96, 0x1E, 0x13, 0x5B, 0x28, 0x56, 0xFB, 0x4C, 0x6C, 0x7B, 0x87, 0x4A, 0xF5, 0x44, 0xD3, 0xC6,
+ 0xC0, 0x17, 0x77, 0x45, 0x61, 0x60, 0x5E, 0x1D, 0xA6, 0x0C, 0x19, 0x70, 0x95, 0x46, 0x7D, 0xD2,
+ 0x3B, 0x94, 0xD5, 0x9E, 0xD9, 0xB9, 0x1C, 0x02, 0x2D, 0xF5, 0x52, 0xEF, 0x77, 0x84, 0x1A, 0xA0,
+ 0x65, 0x7A, 0x61, 0xFF, 0x5A, 0xDD, 0x1E, 0xB6, 0xD5, 0xE7, 0xEC, 0xF6, 0x33, 0x54, 0xB7, 0xE7,
+ 0x33, 0x30, 0xB0, 0xB4, 0x61, 0x0F, 0xAA, 0xFE, 0xAC, 0xDB, 0x9D, 0x3A, 0x2B, 0x78, 0x82, 0x93,
+ 0x8B, 0x74, 0x86, 0x6A, 0x07, 0xDF, 0x82, 0x1F, 0x35, 0xFA, 0xFD, 0x65, 0x39, 0x52, 0x87, 0xD9,
+ 0x20, 0x05, 0xF5, 0x56, 0x85, 0x70, 0xFA, 0x46, 0x54, 0x59, 0xE5, 0xA0, 0xF3, 0x14, 0x09, 0x95,
+ 0x5F, 0x9B, 0x56, 0x45, 0xA5, 0x32, 0x64, 0x88, 0x98, 0x4A, 0x1D, 0x91, 0xDF, 0x32, 0x22, 0xAF,
+ 0xCD, 0x3D, 0x8B, 0x5E, 0x77, 0x59, 0x41, 0x25, 0xA0, 0xCC, 0x7F, 0xC6, 0x6B, 0x61, 0x60, 0x0F,
+ 0xCD, 0x0A, 0xC9, 0x55, 0x6E, 0x0E, 0xB7, 0x6B, 0x85, 0xC8, 0xD9, 0xD6, 0x26, 0x93, 0x0C, 0x3D,
+ 0x1C, 0xEE, 0xEB, 0x19, 0x8F, 0x98, 0xF0, 0x90, 0x88, 0x06, 0x05, 0xF0, 0x0D, 0xE7, 0xC9, 0x5B,
+ 0x86, 0xE2, 0x7E, 0x2C, 0x4A, 0xD3, 0x80, 0xB6, 0x74, 0x54, 0x7F, 0x03, 0x12, 0x38, 0xB3, 0xA2,
+ 0xBB, 0x43, 0x24, 0xDA, 0x41, 0x6D, 0xEE, 0x99, 0x4D, 0xD1, 0xEC, 0x69, 0x37, 0xE7, 0x41, 0xF3,
+ 0x9D, 0xAA, 0xD8, 0xC1, 0xA5, 0xE0, 0x11, 0x3F, 0x47, 0xB4, 0x2E, 0xAD, 0x09, 0x84, 0x56, 0x0F,
+ 0x4E, 0x0C, 0xB1, 0x78, 0xE6, 0xE0, 0x33, 0xA0, 0x32, 0xDA, 0xF6, 0x67, 0x80, 0xF0, 0xB3, 0xE9,
+ 0x2F, 0x41, 0x23, 0xF2, 0x79, 0xE3, 0xD2, 0x59, 0x7A, 0x0D, 0x4A, 0x58, 0x29, 0x90, 0x92, 0xCA,
+ 0x6C, 0x70, 0x15, 0x41, 0xCB, 0x72, 0xF4, 0x09, 0x47, 0xB9, 0xE2, 0x98, 0xAB, 0x15, 0xCE, 0x3D,
+ 0xA9, 0x9D, 0x0E, 0x44, 0xDD, 0xA9, 0x23, 0x8E, 0x0E, 0x1D, 0x78, 0xBC, 0xEC, 0x5F, 0x48, 0x92,
+ 0x22, 0xEC, 0x2A, 0xED, 0x9A, 0x41, 0x8D, 0x14, 0xC8, 0x77, 0x44, 0x36, 0xCE, 0xE6, 0xF5, 0x70,
+ 0xF4, 0xC1, 0x50, 0x41, 0xAB, 0x7B, 0x28, 0xFD, 0xB9, 0x00, 0x39, 0x63, 0x8D, 0x20, 0x73, 0x8E,
+ 0x42, 0x7E, 0xB8, 0x40, 0x7A, 0xAD, 0x8D, 0x8D, 0x6E, 0xFA, 0x93, 0x24, 0xA5, 0xF6, 0xF7, 0x61,
+ 0x72, 0x75, 0xFC, 0xBB, 0xF5, 0xD1, 0xBE, 0xA0, 0x36, 0x91, 0x61, 0x87, 0x7F, 0x7F, 0xFD, 0x2A,
+ 0x9B, 0xC8, 0x12, 0xE9, 0xB2, 0xE9, 0xFC, 0xBB, 0x05, 0xA3, 0xA8, 0x21, 0x97, 0x9B, 0x96, 0x3C,
+ 0x40, 0x64, 0x7F, 0xA3, 0x51, 0x27, 0x3D, 0x6A, 0xB7, 0x67, 0x15, 0x57, 0x68, 0x4E, 0x87, 0x7D,
+ 0xB5, 0x2F, 0x45, 0x8F, 0x77, 0x3E, 0x92, 0x98, 0x10, 0xB7, 0x77, 0xA3, 0x27, 0x20, 0x3C, 0x82,
+ 0x42, 0x37, 0xF2, 0xD7, 0xD6, 0xE7, 0xBF, 0x8D, 0xD6, 0xEF, 0x4B, 0x53, 0xEC, 0x0F, 0xCC, 0xA7,
+ 0xB0, 0x91, 0x03, 0x27, 0xAC, 0xE1, 0x9A, 0xA6, 0x38, 0x6E, 0x64, 0xF6, 0x4E, 0xE9, 0xD1, 0x78,
+ 0x7C, 0x7A, 0xD6, 0xF9, 0x0E, 0xEB, 0x24, 0x2C, 0x01, 0xF3, 0xB1, 0x38, 0x22, 0x22, 0xBF, 0x91,
+ 0x19, 0x44, 0xCB, 0xEC, 0x8B, 0xEF, 0x59, 0xF0, 0xA8, 0x3D, 0x5D, 0x66, 0x43, 0xEF, 0x56, 0x6C,
+ 0x1A, 0x88, 0x0A, 0xA7, 0x74, 0x48, 0x0B, 0x1A, 0x9E, 0x2D, 0xD5, 0x0B, 0xCC, 0x43, 0xA3, 0x09,
+ 0xB9, 0xCD, 0xD7, 0x82, 0x0C, 0x73, 0x29, 0x4F, 0xE7, 0x0B, 0x69, 0x68, 0x82, 0x00, 0x65, 0x4D,
+ 0x5F, 0xF8, 0xE6, 0xD7, 0x02, 0x2A, 0x8F, 0x22, 0x99, 0x5E, 0xAA, 0x08, 0x4D, 0xBD, 0x9A, 0xC4,
+ 0xEC, 0x32, 0x0E, 0x15, 0x3F, 0xB4, 0x94, 0xBF, 0x01, 0x3A, 0xB1, 0x0C, 0x78, 0x77, 0xDF, 0x72,
+ 0x5B, 0x77, 0x0D, 0x33, 0x7A, 0x0B, 0xC1, 0x1E, 0xED, 0x9A, 0xE8, 0x72, 0x68, 0x8D, 0x24, 0xEE,
+ 0x97, 0x24, 0xF6, 0xCA, 0x6D, 0xE8, 0x3B, 0x9D, 0xDA, 0x93, 0x40, 0x85, 0xA1, 0x9D, 0x1F, 0xB8,
+ 0xC9, 0xE5, 0xEA, 0x59, 0xA0, 0xD4, 0x6D, 0xCB, 0x71, 0x52, 0x75, 0x9D, 0xA2, 0xAF, 0x91, 0x6A,
+ 0x4E, 0x0A, 0x6B, 0xB5, 0x67, 0x7B, 0x6C, 0xAC, 0x5E, 0x9B, 0x02, 0x27, 0x4B, 0x3E, 0xCF, 0x19,
+ 0x57, 0xCC, 0x74, 0x4B, 0x33, 0xA4, 0x6B, 0x1E, 0x56, 0x6D, 0x0B, 0xA4, 0x84, 0xA3, 0x81, 0xC9,
+ 0x89, 0xF7, 0x9E, 0x3F, 0xFE, 0x57, 0x60, 0x4F, 0x79, 0x84, 0x53, 0xEB, 0x80, 0x8F, 0xB9, 0x63,
+ 0x29, 0x4F, 0xBD, 0xA0, 0x0C, 0xF0, 0x7F, 0x35, 0xEC, 0x18, 0xC1, 0x22, 0xA3, 0x6D, 0x7F, 0x2E,
+ 0xCC, 0x4D, 0x51, 0xFD, 0x76, 0x74, 0x18, 0x19, 0x67, 0x6B, 0x81, 0x07, 0x07, 0x5B, 0x5D, 0xB3,
+ 0x98, 0x4D, 0x23, 0xB8, 0x77, 0xD1, 0xEC, 0x3C, 0x0E, 0x10, 0xD0, 0x65, 0x99, 0x29, 0xF1, 0x42,
+ 0x83, 0x51, 0x26, 0x18, 0x8C, 0x8E, 0x4F, 0x8D, 0x2A, 0x14, 0x34, 0x6A, 0xC5, 0x71, 0x2F, 0x4C,
+ 0xFF, 0xBA, 0x11, 0xD7, 0x76, 0x16, 0x00, 0xEE, 0xBA, 0x26, 0xD9, 0xC2, 0x51, 0xBD, 0xC6, 0x67,
+ 0x85, 0x56, 0x98, 0x36, 0x12, 0xC3, 0xF1, 0xCC, 0xFA, 0xFB, 0xF6, 0x5A, 0xD2, 0x7A, 0xFF, 0x1B,
+ 0x33, 0xD3, 0x72, 0x05, 0x01, 0x67, 0xA2, 0x42, 0x45, 0x0C, 0x5E, 0x46, 0xAD, 0x26, 0xA7, 0xCE,
+ 0x38, 0x30, 0xFB, 0x9B, 0x39, 0x8D, 0x40, 0x61, 0xDF, 0xE5, 0xC5, 0x8A, 0x26, 0xA6, 0x31, 0xFC,
+ 0x8B, 0x0B, 0x2E, 0xAD, 0xD8, 0xA5, 0x12, 0x92, 0xD2, 0xCA, 0x86, 0x73, 0x52, 0xA6, 0x19, 0xE7,
+ 0x70, 0xD2, 0x31, 0x14, 0x1C, 0xDA, 0x27, 0xC9, 0xB7, 0x6C, 0x98, 0xE9, 0xD9, 0x59, 0x8B, 0x5F,
+ 0x27, 0xA6, 0xB3, 0xAC, 0x89, 0xFC, 0x99, 0xF5, 0x6A, 0x56, 0xC1, 0x99, 0xFE, 0x05, 0x3A, 0x0A,
+ 0x27, 0x1E, 0xE4, 0xD2, 0x75, 0x98, 0x7C, 0x00, 0x23, 0xD0, 0x19, 0x0B, 0x49, 0xC6, 0x52, 0x48,
+ 0x03, 0xB5, 0x24, 0x40, 0x03, 0xA2, 0x18, 0xA2, 0x0A, 0x5D, 0x84, 0xF2, 0xDA, 0xF2, 0x01, 0xF5,
+ 0xE7, 0xDD, 0x54, 0x1F, 0x6C, 0x04, 0xBA, 0x74, 0x46, 0x29, 0xA3, 0x08, 0x18, 0xA1, 0xA9, 0x80,
+ 0xA3, 0x85, 0x42, 0x49, 0x33, 0x30, 0x79, 0x08, 0x7B, 0x72, 0x32, 0xB7, 0x59, 0x85, 0xA1, 0xB5,
+ 0x29, 0xDF, 0x69, 0xDF, 0x2C, 0xC3, 0x5F, 0xD7, 0xA7, 0xE9, 0x97, 0x6A, 0xA4, 0x38, 0x8B, 0x8C,
+ 0xDE, 0xB2, 0xA8, 0x27, 0xFE, 0x6E, 0xD5, 0xFF, 0xF6, 0x00, 0x64, 0xB7, 0xBD, 0x14, 0x3C, 0xEC,
+ 0x0E, 0x86, 0x83, 0x7A, 0x16, 0xEF, 0x50, 0xBB, 0x3D, 0xBA, 0xA2, 0x43, 0x14, 0x61, 0x06, 0x8B,
+ 0x85, 0xCF, 0x86, 0xE6, 0xC9, 0x77, 0xC6, 0x9F, 0x84, 0xF2, 0x1E, 0xD8, 0x51, 0x9F, 0xB6, 0xC8,
+ 0x11, 0x56, 0x9A, 0x4B, 0x8B, 0xEA, 0x58, 0x68, 0x18, 0x78, 0x44, 0x8C, 0x36, 0x0B, 0xA0, 0x4C,
+ 0x74, 0x2E, 0x14, 0xBD, 0xE8, 0x57, 0xA9, 0x1D, 0x4A, 0x9F, 0xD5, 0x44, 0xB3, 0x15, 0xD6, 0xED,
+ 0xAE, 0x7A, 0x4E, 0x7D, 0xA7, 0x3C, 0x30, 0xFF, 0x6F, 0x0C, 0x23, 0xCC, 0x1B, 0x92, 0xC1, 0x48,
+ 0xF9, 0x8C, 0x97, 0x47, 0x3E, 0x5E, 0x66, 0x83, 0xE8, 0xB9, 0xF0, 0xD0, 0x1B, 0x79, 0x68, 0x1D,
+ 0xA2, 0x35, 0xC7, 0x34, 0x07, 0x8A, 0xCE, 0x68, 0xBD, 0x9B, 0x7C, 0x76, 0x38, 0x7A, 0x23, 0x9B,
+ 0x39, 0xD7, 0x04, 0x4A, 0x82, 0xB9, 0x4B, 0xCF, 0xB1, 0x9A, 0xBA, 0x75, 0x6B, 0x04, 0xF5, 0x23,
+ 0x8D, 0x36, 0x4F, 0x9A, 0x3E, 0x60, 0xD3, 0xAA, 0xF9, 0x0F, 0x05, 0x5C, 0xA7, 0x28, 0x7E, 0xB4,
+ 0xCA, 0x77, 0x92, 0x9B, 0x21, 0x0C, 0x99, 0x84, 0xB0, 0xB1, 0xD2, 0x1C, 0xF7, 0x9A, 0x24, 0x0A,
+ 0xD7, 0x8A, 0xE3, 0x08, 0x3F, 0xE1, 0x5A, 0xC6, 0x32, 0xCF, 0xD8, 0xBB, 0x6F, 0x86, 0x62, 0x28,
+ 0xDC, 0xC6, 0xF5, 0x00, 0x8C, 0xBE, 0x15, 0x25, 0x53, 0x87, 0x81, 0xAF, 0xDE, 0xAC, 0x6D, 0x59,
+ 0x0D, 0x51, 0x1F, 0xF9, 0x76, 0xEA, 0x44, 0x95, 0xFB, 0x1C, 0xC5, 0xB0, 0x0A, 0x29, 0xF2, 0xAE,
+ 0x8F, 0x03, 0xE7, 0x41, 0xD1, 0x54, 0x9D, 0xD3, 0xD2, 0xB4, 0x7D, 0x9A, 0xC1, 0x09, 0xDA, 0xC5,
+ 0xD8, 0x26, 0x59, 0xC4, 0x35, 0x66, 0xD7, 0xD1, 0xE5, 0xA6, 0xED, 0xBB, 0x82, 0xAD, 0x50, 0x4C,
+ 0xE0, 0x01, 0xC9, 0x57, 0x78, 0x66, 0x8E, 0x0E, 0x69, 0xFD, 0x8C, 0xE9, 0x63, 0xA3, 0x21, 0xDA,
+ 0xC8, 0x58, 0x1D, 0x6B, 0x76, 0x6F, 0xA4, 0x8F, 0x46, 0xC8, 0x00, 0xB2, 0x1E, 0xEF, 0x93, 0x54,
+ 0x89, 0xAB, 0xD9, 0x18, 0x23, 0x95, 0xE6, 0x2A, 0xF8, 0xCC, 0xF2, 0x74, 0xE5, 0x71, 0x60, 0x8C,
+ 0xA1, 0x0E, 0x67, 0x14, 0xBA, 0xEF, 0x69, 0xC4, 0x01, 0xFE, 0x93, 0x54, 0x26, 0x0A, 0xE1, 0xC2,
+ 0xC1, 0x47, 0xC9, 0x6A, 0xF6, 0x6A, 0xD8, 0xB6, 0xDD, 0xEE, 0x67, 0xB5, 0xA0, 0xD8, 0x5F, 0x58,
+ 0x7B, 0x42, 0xFE, 0xD3, 0xD0, 0xCB, 0xFD, 0x5E, 0x22, 0x4F, 0x31, 0xF7, 0xBA, 0x12, 0x6C, 0xEF,
+ 0x4A, 0x78, 0x23, 0x85, 0xA3, 0xB1, 0x35, 0x59, 0x13, 0x5D, 0x35, 0xA2, 0x32, 0xF4, 0x6C, 0x07,
+ 0x33, 0x56, 0x53, 0xD9, 0xB5, 0x4B, 0x6F, 0xC7, 0x73, 0x01, 0x69, 0x54, 0x7F, 0x95, 0x8C, 0x10,
+ 0xD7, 0x11, 0xF1, 0xF5, 0x0C, 0x21, 0x17, 0xE5, 0x23, 0x34, 0xDB, 0x4D, 0xC5, 0xA9, 0x18, 0x54,
+ 0xD0, 0x76, 0xB2, 0x74, 0x68, 0x61, 0x00, 0x8D, 0xCA, 0x3A, 0x70, 0xE4, 0x36, 0xDE, 0x2D, 0x9B,
+ 0x5F, 0xB0, 0x4E, 0x66, 0x15, 0x7B, 0x92, 0x04, 0x38, 0xBD, 0xC1, 0x61, 0xF2, 0x19, 0xB9, 0xD9,
+ 0x71, 0xCF, 0xFB, 0x4D, 0x19, 0x99, 0xE5, 0x2A, 0x50, 0x27, 0x20, 0xC2, 0x18, 0x7B, 0xE9, 0xFA,
+ 0x02, 0x13, 0x66, 0x89, 0xE7, 0x72, 0x2A, 0xDC, 0x27, 0x72, 0x91, 0xE7, 0xCF, 0x3A, 0x76, 0x6B,
+ 0xFD, 0xAF, 0x6C, 0x68, 0x57, 0x38, 0xEE, 0x97, 0x55, 0x0C, 0xBF, 0xA6, 0xBA, 0xDD, 0xC3, 0x2F,
+ 0xDE, 0xD5, 0x39, 0x91, 0x8E, 0xFA, 0xE8, 0xFC, 0x52, 0x87, 0x94, 0x85, 0x24, 0x3A, 0xDE, 0x03,
+ 0xBE, 0x02, 0x1B, 0x81, 0xE8, 0x1F, 0xE6, 0x96, 0xAA, 0x38, 0x42, 0x42, 0x2F, 0xDF, 0x4F, 0x13,
+ 0x50, 0xD3, 0x77, 0xE4, 0x2C, 0x8E, 0x96, 0x3C, 0x4A, 0x6E, 0x37, 0xAF, 0xE5, 0x03, 0x27, 0x5F,
+ 0x71, 0xE1, 0x79, 0xEA, 0xF7, 0xC5, 0x71, 0x4F, 0xAC, 0xFE, 0x36, 0x45, 0x0A, 0x96, 0x60, 0x59,
+ 0xD9, 0x52, 0x9F, 0x31, 0xDF, 0x20, 0x6F, 0x33, 0x03, 0x3D, 0x51, 0x57, 0x18, 0xC1, 0xD0, 0xA4,
+ 0x7C, 0x33, 0x2E, 0x59, 0x04, 0xF8, 0x3C, 0xF3, 0x58, 0xBB, 0x2F, 0x12, 0xB1, 0x35, 0xC4, 0xF6,
+ 0xC4, 0x95, 0x3D, 0xDF, 0x13, 0x09, 0xFC, 0xFB, 0x30, 0xA2, 0xF6, 0x9B, 0xAE, 0xC4, 0xA3, 0xB3,
+ 0x2E, 0xFE, 0x29, 0x8D, 0x56, 0x24, 0x37, 0xA4, 0xA4, 0x1E, 0xC3, 0x13, 0x6F, 0x99, 0x3D, 0x35,
+ 0xF8, 0xA0, 0x08, 0x7E, 0x4C, 0x7C, 0x59, 0x81, 0xC0, 0xD8, 0x8F, 0xF7, 0x33, 0x8E, 0x67, 0x2F,
+ 0xD2, 0x04, 0xE7, 0x4D, 0xB4, 0x90, 0x07, 0xD3, 0xF7, 0x73, 0x18, 0x1D, 0x69, 0x89, 0x49, 0x13,
+ 0x08, 0x65, 0x6F, 0xCA, 0xDC, 0x8A, 0x32, 0xBC, 0xCF, 0x5C, 0x6E, 0xDE, 0x23, 0x83, 0x22, 0x94,
+ 0xEE, 0x02, 0xC6, 0x44, 0xE8, 0xDE, 0xBD, 0xB4, 0x79, 0xD2, 0xF0, 0x9E, 0x46, 0xCB, 0xF6, 0x5B,
+ 0x2B, 0xA3, 0x97, 0x98, 0x05, 0x60, 0x83, 0xE3, 0x74, 0xFA, 0xA5, 0x0A, 0x04, 0xE0, 0x76, 0xB5,
+ 0x2B, 0x16, 0xA2, 0x00, 0xE1, 0x0D, 0xAF, 0x5C, 0x8E, 0xB3, 0x5E, 0x24, 0xC4, 0xA3, 0xB5, 0x8B,
+ 0xAC, 0x56, 0x13, 0x09, 0x8D, 0xDE, 0xE5, 0xA1, 0x85, 0x49, 0x65, 0xB2, 0xFF, 0xE4, 0xF2, 0x61,
+ 0x12, 0xE2, 0x45, 0x48, 0x8D, 0x8A, 0x02, 0x60, 0xBB, 0x2F, 0xF3, 0xFF, 0x10, 0xCD, 0xE3, 0xA7,
+ 0xE8, 0xF0, 0xC1, 0x14, 0xB5, 0x0D, 0x65, 0xDE, 0x37, 0x33, 0xFC, 0x2F, 0x22, 0xB9, 0xBF, 0xE0,
+ 0x56, 0x0C, 0x44, 0x18, 0xFC, 0xAA, 0xBA, 0xBE, 0x24, 0x0E, 0xA1, 0x31, 0x17, 0x7D, 0x2C, 0x2A,
+ 0xA2, 0xAA, 0xF4, 0x65, 0x81, 0x12, 0xB4, 0x7E, 0x0D, 0x13, 0xE3, 0x9B, 0x3F, 0xAD, 0xA1, 0x20,
+ 0x19, 0x91, 0x34, 0x92, 0xAD, 0x15, 0x5A, 0x93, 0x65, 0xC1, 0xDD, 0x10, 0xCD, 0x6D, 0xAD, 0x94,
+ 0x15, 0xA4, 0x88, 0x30, 0x4A, 0x8B, 0x8C, 0xB0, 0xEB, 0xA9, 0x04, 0x8E, 0xEA, 0x4A, 0xBA, 0x28,
+ 0x1F, 0x28, 0xD4, 0x65, 0x85, 0x49, 0xF4, 0x7C, 0x69, 0x13, 0xB4, 0x3E, 0x84, 0x36, 0x77, 0x9E,
+ 0x70, 0x36, 0x12, 0x53, 0x1B, 0xD4, 0xD0, 0x2A, 0x17, 0xDC, 0x84, 0x93, 0xC1, 0xDF, 0xB9, 0x44,
+ 0x68, 0x0B, 0xF5, 0xEE, 0x3B, 0xB2, 0xA2, 0x8C, 0xCB, 0xB6, 0xA6, 0xD8, 0x97, 0xA8, 0x2C, 0x61,
+ 0x7C, 0xB7, 0x21, 0x58, 0x07, 0xC9, 0xD4, 0x5D, 0x54, 0x3A, 0x70, 0xC9, 0xF4, 0x51, 0x00, 0xC6,
+ 0x25, 0xFF, 0x1E, 0x1D, 0x94, 0xBA, 0x48, 0xDE, 0x5E, 0x69, 0xB4, 0x87, 0x4F, 0x87, 0x83, 0x64,
+ 0x9A, 0xDF, 0x83, 0x93, 0x59, 0x2A, 0x43, 0xD7, 0xCE, 0x35, 0xE7, 0xD5, 0x77, 0x72, 0x23, 0xB5,
+ 0xFF, 0x52, 0xA6, 0x11, 0x2A, 0x29, 0x0A, 0xCA, 0x3B, 0xB8, 0xBC, 0xF3, 0xFE, 0x3A, 0x6B, 0x1B,
+ 0x13, 0xC9, 0x5D, 0xD1, 0xF5, 0xEE, 0x6A, 0xC4, 0x05, 0x03, 0xAE, 0x04, 0xC5, 0x36, 0x03, 0x56,
+ 0x3C, 0x5D, 0xE1, 0x3E, 0x32, 0x45, 0x18, 0x3C, 0x90, 0x46, 0xF3, 0xB0, 0xDA, 0xD4, 0xCC, 0xE0,
+ 0xE1, 0xCD, 0x40, 0xAD, 0xC3, 0xFA, 0x6B, 0x2B, 0x74, 0xC5, 0x20, 0xCA, 0xF6, 0xA2, 0xA7, 0xC6,
+ 0xD3, 0xA2, 0x38, 0x1E, 0x5C, 0x03, 0xE5, 0xCC, 0x3F, 0x21, 0xED, 0x8E, 0xAE, 0x6B, 0xDE, 0x75,
+ 0xF9, 0x67, 0x63, 0xEA, 0x8B, 0x18, 0x06, 0x7A, 0xBD, 0x67, 0x32, 0xA3, 0x89, 0x6D, 0x71, 0x0A,
+ 0x43, 0x00, 0x74, 0x6B, 0x19, 0x42, 0x8D, 0x0C, 0x93, 0xAC, 0x4F, 0x69, 0x3B, 0x5C, 0xB0, 0x35,
+ 0xAE, 0x7F, 0x54, 0x48, 0x1A, 0x48, 0x36, 0x4A, 0xD4, 0x60, 0x32, 0x16, 0x21, 0x75, 0xF6, 0xAA,
+ 0x3A, 0x34, 0x14, 0xC3, 0xC7, 0x0D, 0xB6, 0x3E, 0xF8, 0x7D, 0xDE, 0x17, 0x46, 0xBD, 0xA7, 0x87,
+ 0x08, 0xF5, 0x1B, 0x6B, 0x13, 0x0B, 0xCD, 0xA9, 0x4D, 0x9A, 0xD2, 0x39, 0x83, 0xCA, 0xE9, 0x47,
+ 0xE1, 0xCF, 0xD6, 0x73, 0xF1, 0x15, 0xCC, 0x50, 0x87, 0xE2, 0xB2, 0x56, 0x04, 0xCC, 0x20, 0x06,
+ 0x87, 0x3F, 0x19, 0x8D, 0xE6, 0x45, 0x70, 0xF1, 0x13, 0xB1, 0x32, 0x1C, 0xC2, 0xFF, 0xB9, 0x2F,
+ 0xC9, 0x76, 0x2C, 0x0E, 0x81, 0x18, 0xEF, 0x34, 0xA7, 0xD0, 0x85, 0xD1, 0x37, 0xC3, 0x83, 0x44,
+ 0xFB, 0x35, 0x2B, 0xB8, 0x38, 0x4A, 0xB8, 0x44, 0x61, 0xE0, 0x65, 0x97, 0x90, 0x2A, 0xFB, 0x09,
+ 0x68, 0x1A, 0x8A, 0xF0, 0x56, 0xF7, 0xF7, 0xE4, 0xF5, 0x01, 0x35, 0xD2, 0x92, 0xB5, 0xE0, 0x82,
+ 0x2D, 0x39, 0x03, 0x1B, 0x0C, 0xDC, 0x30, 0x8D, 0x7E, 0x55, 0xB4, 0x38, 0x29, 0x93, 0xA0, 0x99,
+ 0x85, 0x6E, 0x8B, 0x6B, 0x82, 0x6F, 0x5A, 0x57, 0xC0, 0x04, 0x68, 0xE3, 0x41, 0xB6, 0xF9, 0x5B,
+ 0xC7, 0xE9, 0xCF, 0x96, 0x06, 0x86, 0x63, 0x93, 0x12, 0xC1, 0xEC, 0xF3, 0xBB, 0x25, 0x39, 0x8F,
+ 0x1F, 0x06, 0x70, 0x08, 0xC6, 0x60, 0x4C, 0xD1, 0x67, 0x89, 0x8A, 0x13, 0x97, 0x67, 0x13, 0x6E,
+ 0x08, 0x2B, 0xE5, 0x59, 0x5C, 0xAA, 0xFF, 0x4B, 0xE7, 0x49, 0x81, 0x6E, 0x46, 0x5E, 0x9E, 0x13,
+ 0x5C, 0x69, 0xEB, 0x95, 0x36, 0x2A, 0x77, 0xBF, 0xD2, 0xB5, 0xDC, 0x49, 0x33, 0x5F, 0x17, 0x5D,
+ 0x1F, 0x1C, 0x78, 0x8B, 0x38, 0x4D, 0x5D, 0xC4, 0x03, 0xF2, 0x58, 0xF4, 0x0A, 0xFD, 0xE4, 0xEF,
+ 0x18, 0xF0, 0x8F, 0x31, 0x29, 0x5D, 0x69, 0xEE, 0xA1, 0x31, 0x37, 0xE2, 0x31, 0x5F, 0xF6, 0x92,
+ 0x33, 0xDC, 0x70, 0x28, 0xD2, 0x6D, 0xC7, 0x88, 0xC5, 0x86, 0x61, 0x0D, 0xA9, 0x7B, 0x15, 0xA4,
+ 0xE5, 0x35, 0x7C, 0xF3, 0xBD, 0xE1, 0x80, 0xDE, 0x9D, 0x7A, 0x7D, 0x98, 0x06, 0xFF, 0x20, 0x6A,
+ 0xF4, 0xCD, 0xC8, 0x99, 0x25, 0x64, 0x81, 0xEA, 0xC8, 0x7E, 0x3C, 0x5B, 0x28, 0x06, 0xBD, 0xA5,
+ 0xA8, 0xF8, 0x9C, 0xF3, 0x3D, 0x4F, 0xB1, 0xB5, 0x15, 0x1D, 0x50, 0x0C, 0x45, 0x55, 0x48, 0xEA,
+ 0x4C, 0x62, 0x5C, 0x11, 0xF3, 0xAE, 0x7E, 0x13, 0xA0, 0x9E, 0x6A, 0xB4, 0x99, 0x88, 0x03, 0x8F,
+ 0xC7, 0xAE, 0x20, 0x67, 0x2D, 0x4D, 0x88, 0x11, 0xB5, 0x41, 0x0D, 0x37, 0xA3, 0xAB, 0xD8, 0xE4,
+ 0x7C, 0x59, 0xC5, 0x71, 0x74, 0x5E, 0x95, 0xB8, 0x38, 0x95, 0x40, 0xAC, 0x15, 0xD3, 0x7D, 0x21,
+ 0xD0, 0xB3, 0x82, 0x40, 0x55, 0x92, 0x43, 0x90, 0xDE, 0x83, 0x62, 0xE7, 0xD4, 0x56, 0x32, 0x72,
+ 0x52, 0x0B, 0x2E, 0x09, 0x30, 0x64, 0x4A, 0xAC, 0x5A, 0x67, 0x01, 0x0A, 0xBD, 0x22, 0xF4, 0x58,
+ 0xB0, 0xE5, 0x6B, 0x92, 0x69, 0x89, 0x72, 0xE2, 0x91, 0x50, 0x3E, 0x47, 0xBB, 0xE0, 0x23, 0x57,
+ 0xBC, 0xA5, 0x5D, 0xEF, 0xA7, 0x39, 0x96, 0x00, 0x99, 0xE4, 0x30, 0x89, 0xCF, 0x0C, 0xA5, 0x22,
+ 0x8F, 0x78, 0x5F, 0xAA, 0x69, 0x50, 0xF6, 0xB9, 0x61, 0xA1, 0x3E, 0x1C, 0x65, 0x15, 0xD1, 0x50,
+ 0x4B, 0xDF, 0xD0, 0xA0, 0x87, 0xC2, 0xF8, 0xB2, 0xAA, 0x00, 0xB6, 0xFD, 0x7A, 0x4E, 0xA6, 0xEA,
+ 0xD8, 0xCE, 0x22, 0x3C, 0x41, 0xFA, 0x6A, 0x05, 0xCA, 0x5F, 0xEC, 0x98, 0x4E, 0xFC, 0xF1, 0x06,
+ 0x5E, 0x07, 0xF3, 0x98, 0x73, 0xCF, 0xBD, 0x17, 0xF5, 0xB5, 0x5B, 0x52, 0x29, 0xEF, 0xCC, 0xAE,
+ 0x8C, 0x8F, 0x6C, 0xB0, 0x82, 0x9D, 0x1C, 0x15, 0x62, 0x4C, 0xFC, 0x99, 0xFD, 0x3D, 0xD1, 0x7F,
+ 0x13, 0xFD, 0x8A, 0xD1, 0x96, 0x50, 0x98, 0x2D, 0x30, 0xE8, 0x57, 0x07, 0xFC, 0xD0, 0x06, 0x24,
+ 0xB5, 0x7A, 0xC6, 0xBE, 0xAA, 0x1E, 0xBF, 0xFF, 0xC6, 0x6C, 0x24, 0x70, 0xB7, 0x59, 0xC3, 0xDB,
+ 0xC1, 0x3A, 0x79, 0x6F, 0x83, 0xCB, 0x55, 0x84, 0x7E, 0x04, 0xF8, 0xDB, 0x7D, 0x41, 0xAF, 0x5D,
+ 0xDB, 0x5A, 0xE6, 0xCE, 0x9B, 0x66, 0x6F, 0x38, 0xF4, 0xEA, 0x20, 0x09, 0x75, 0x75, 0xCD, 0xF8,
+ 0x62, 0x74, 0x7E, 0x4A, 0x3E, 0x2E, 0xAE, 0xCC, 0x8D, 0x49, 0xBC, 0xCC, 0x34, 0xE9, 0x9B, 0xC7,
+ 0x05, 0x81, 0x9C, 0xBA, 0x00, 0xF2, 0x83, 0xC5, 0xE4, 0x78, 0x85, 0xD0, 0xC5, 0xF3, 0x0F, 0xB0,
+ 0x18, 0x30, 0x9B, 0xA3, 0x62, 0x92, 0x72, 0xD5, 0xEA, 0xE1, 0xC0, 0x5B, 0xDA, 0x0C, 0xBC, 0x19,
+ 0x46, 0x7F, 0x03, 0xC8, 0x7B, 0x31, 0x13, 0x1B, 0xA0, 0x91, 0xB4, 0x99, 0xC1, 0x9D, 0xB8, 0xE5,
+ 0x33, 0xD9, 0x41, 0x53, 0x19, 0x97, 0x99, 0x27, 0x8C, 0x8E, 0x5B, 0xAA, 0x17, 0x85, 0x42, 0xA9,
+ 0x47, 0x1C, 0x19, 0x33, 0xCB, 0x88, 0xBE, 0xF4, 0x48, 0x43, 0x66, 0xEB, 0x9F, 0xF6, 0x94, 0x2C,
+ 0xC2, 0x74, 0xF8, 0xD7, 0x9B, 0xEB, 0x2F, 0x2F, 0xF3, 0x52, 0x1F, 0x45, 0x9D, 0x9E, 0xB4, 0x86,
+ 0x76, 0xAB, 0x43, 0xB9, 0x52, 0x0C, 0x0A, 0x06, 0xD7, 0xF2, 0xA5, 0xFE, 0x9C, 0x0D, 0x8A, 0xE0,
+ 0xA4, 0xEA, 0x65, 0x3F, 0x2B, 0x7C, 0x03, 0x31, 0x3A, 0x40, 0x97, 0xA8, 0x56, 0xA2, 0xAD, 0x63,
+ 0x7A, 0xE5, 0xDC, 0xFD, 0x8D, 0xA9, 0xF3, 0x55, 0xB5, 0x14, 0xB7, 0x51, 0xBA, 0x00, 0x32, 0x43,
+ 0x25, 0xEB, 0x61, 0x78, 0xA6, 0x2A, 0xEA, 0x9D, 0x15, 0x72, 0x5D, 0xD0, 0x0E, 0x0C, 0xB4, 0xC1,
+ 0x4B, 0x10, 0x9A, 0xFB, 0x1B, 0x54, 0x33, 0x8D, 0x3A, 0x0B, 0x43, 0x51, 0x6C, 0x22, 0xB8, 0x29,
+ 0xC5, 0x11, 0x1F, 0x28, 0xF5, 0x82, 0x5F, 0xCF, 0x0A, 0xB0, 0xBF, 0xDA, 0x90, 0x13, 0xCE, 0x69,
+ 0xFF, 0x05, 0x85, 0x9D, 0x80, 0xF3, 0x3D, 0x4B, 0x21, 0xAB, 0xED, 0x73, 0xB9, 0xC4, 0xAD, 0x70,
+ 0xEA, 0x17, 0x20, 0x78, 0xCA, 0xCC, 0x4E, 0x47, 0xCA, 0x30, 0xA8, 0xDB, 0x1C, 0x7B, 0x46, 0x3C,
+ 0xC0, 0xE2, 0x96, 0xF8, 0x60, 0xDD, 0x43, 0xFE, 0x41, 0x7C, 0xD2, 0x7B, 0xB9, 0x90, 0x97, 0xF6,
+ 0x86, 0x62, 0xD5, 0xF3, 0x49, 0x78, 0x81, 0xCF, 0x0C, 0xF1, 0x30, 0xC7, 0x37, 0x16, 0xDE, 0xB4,
+ 0x93, 0x6A, 0xE0, 0x9F, 0x5B, 0x17, 0x43, 0x69, 0x7E, 0x54, 0xBB, 0x83, 0x4F, 0x1B, 0xA9, 0x70,
+ 0x41, 0x97, 0x5A, 0x5D, 0x6E, 0x51, 0x1F, 0xEA, 0xDF, 0x44, 0xFB, 0x2D, 0x1E, 0xB9, 0xF9, 0xA4,
+ 0xCE, 0x11, 0xD5, 0x6C, 0x43, 0xF5, 0xD1, 0x23, 0x7B, 0x7E, 0x30, 0x4B, 0x82, 0xF4, 0x3F, 0x9C,
+ 0x53, 0xF5, 0xC8, 0xF6, 0xA1, 0xAB, 0x39, 0xD2, 0x01, 0xD5, 0xEA, 0x01, 0xFF, 0x75, 0xFD, 0x23,
+ 0x63, 0xBE, 0x4C, 0x70, 0xC0, 0xF6, 0x78, 0xED, 0x83, 0x79, 0x19, 0x33, 0x58, 0xEA, 0x73, 0xC4,
+ 0xE9, 0x0E, 0xF6, 0x89, 0x3C, 0xD4, 0x0C, 0xF6, 0xBE, 0xAC, 0x81, 0x32, 0x70, 0x24, 0x7D, 0xEA,
+ 0x70, 0xBF, 0xC4, 0x45, 0x56, 0x8C, 0x49, 0x91, 0xA4, 0x04, 0x76, 0x84, 0x5B, 0x43, 0x11, 0x72,
+ 0x74, 0x1C, 0xF5, 0xEB, 0x93, 0x42, 0x87, 0x1D, 0x6B, 0x16, 0x9F, 0xAD, 0xCA, 0x9B, 0xD3, 0x1F,
+ 0x78, 0x1A, 0x0A, 0xC5, 0x7D, 0x44, 0xD2, 0xDE, 0x91, 0x0C, 0x3E, 0x12, 0x74, 0xDF, 0x92, 0xF7,
+ 0x96, 0xD3, 0x6E, 0x76, 0xD6, 0x98, 0x48, 0x78, 0x77, 0x92, 0xC9, 0x45, 0xD8, 0x75, 0xB3, 0x84,
+ 0xDC, 0x1A, 0x2A, 0x0E, 0xAF, 0xD8, 0xB2, 0x6D, 0x88, 0x60, 0xEE, 0x77, 0x4A, 0xFE, 0x4B, 0xC1,
+ 0x2E, 0x27, 0x4C, 0x4F, 0x31, 0x51, 0x5B, 0x92, 0x75, 0xC2, 0x41, 0x7F, 0xB0, 0x43, 0x09, 0xC7,
+ 0xBA, 0xB0, 0xB3, 0x9B, 0x27, 0x3D, 0xD4, 0x10, 0x59, 0xD3, 0x4F, 0xB8, 0x7C, 0xFF, 0xC8, 0x4C,
+ 0x06, 0xCA, 0xB4, 0x5C, 0x37, 0xA4, 0xCD, 0x12, 0x60, 0x5C, 0x15, 0xB2, 0xA2, 0xAA, 0x81, 0x1A,
+ 0x17, 0x7D, 0xD9, 0xF6, 0x31, 0xD6, 0xEB, 0xE7, 0xE7, 0x16, 0x85, 0x36, 0x3C, 0xE3, 0x57, 0x76,
+ 0xAC, 0x35, 0xE3, 0xEC, 0x0F, 0xB7, 0x9B, 0xD5, 0xD1, 0x8E, 0x63, 0x7F, 0x1A, 0xB8, 0x23, 0x02,
+ 0x50, 0x62, 0x06, 0xBF, 0xE5, 0x14, 0x2D, 0xED, 0xF0, 0x68, 0xEF, 0x8B, 0x82, 0x35, 0x29, 0x8A,
+ 0xE1, 0x64, 0x14, 0xFB, 0xAA, 0x4B, 0xE3, 0x2B, 0x91, 0x6A, 0x1D, 0x8E, 0xB2, 0x60, 0xC1, 0xC4,
+ 0x5A, 0x0B, 0xA5, 0xD6, 0xA1, 0xE8, 0x91, 0x97, 0xA1, 0x51, 0xBD, 0x81, 0xD0, 0xB5, 0x7F, 0x69,
+ 0x4A, 0xA8, 0x5D, 0xB5, 0x36, 0x55, 0x22, 0xE2, 0x7E, 0x1C, 0x53, 0xE2, 0x5B, 0x57, 0x17, 0x62,
+ 0x96, 0xC8, 0x7E, 0x31, 0xCB, 0xE0, 0xC6, 0x71, 0x5E, 0xC1, 0xB9, 0xD6, 0x54, 0x22, 0x49, 0xEF,
+ 0xDD, 0x50, 0xB0, 0x88, 0xC0, 0x0F, 0x16, 0xE7, 0xD6, 0xBA, 0x9A, 0x08, 0xAC, 0xD6, 0x78, 0xDA,
+ 0x80, 0xDF, 0x7D, 0x69, 0x97, 0xD4, 0xA7, 0x97, 0xFA, 0xDF, 0x76, 0x54, 0xE4, 0x3B, 0x1D, 0xF1,
+ 0x98, 0xC4, 0x68, 0xA6, 0xE8, 0x0B, 0x27, 0xE1, 0x0C, 0x2C, 0xC2, 0x8F, 0x88, 0xB3, 0x31, 0xFF,
+ 0x3A, 0xDB, 0x90, 0x1C, 0x59, 0x2A, 0x88, 0x54, 0x26, 0x7E, 0xCB, 0xFF, 0x73, 0x99, 0xE5, 0xCF,
+ 0x31, 0x8B, 0x69, 0xDB, 0x8F, 0x28, 0x4D, 0x3B, 0x2F, 0x63, 0xC8, 0xEB, 0x61, 0x3E, 0x95, 0xBC,
+ 0x8B, 0x5C, 0x1C, 0xCA, 0xED, 0x43, 0xDF, 0x1A, 0x94, 0xF4, 0xF1, 0xF2, 0x7D, 0x37, 0x71, 0xC2,
+ 0x28, 0xE7, 0xFE, 0x69, 0x69, 0x3B, 0x6D, 0x31, 0x3A, 0xE7, 0x0F, 0x26, 0xCE, 0xCD, 0x19, 0xA5,
+ 0xE0, 0x66, 0x29, 0x54, 0x65, 0x43, 0x43, 0xB9, 0x22, 0x86, 0x0E, 0x2E, 0xD5, 0x63, 0x55, 0xA8,
+ 0x78, 0x05, 0x54, 0xE3, 0x1E, 0xEC, 0x01, 0x67, 0xB4, 0x22, 0xFC, 0x18, 0xDB, 0x53, 0x6F, 0x97,
+ 0xC0, 0xEB, 0x58, 0x57, 0x49, 0xDC, 0xBD, 0x76, 0xCA, 0x00, 0x46, 0xE3, 0x7F, 0x4D, 0x53, 0xAC,
+ 0xDC, 0x77, 0xF3, 0xAF, 0x4F, 0x5A, 0x85, 0xC8, 0x37, 0x2B, 0x41, 0x63, 0x6F, 0xD7, 0x25, 0x61,
+ 0x6D, 0x09, 0x9C, 0xEB, 0x43, 0xE2, 0xE8, 0x49, 0x72, 0xCD, 0x8E, 0x1C, 0xD0, 0x8E, 0xD3, 0x96,
+ 0x1F, 0x98, 0xAA, 0x2B, 0xF6, 0x47, 0x4D, 0x92, 0x2A, 0xAA, 0x41, 0xA5, 0xA9, 0x71, 0xFE, 0x6C,
+ 0x43, 0x7E, 0xB8, 0x21, 0x4A, 0x58, 0xA4, 0xF7, 0x5D, 0xF8, 0x44, 0xC4, 0xE8, 0x9A, 0xA7, 0xB9,
+ 0xAC, 0x97, 0xD4, 0x8D, 0xA6, 0xC4, 0x04, 0x43, 0x30, 0x21, 0x54, 0x16, 0x92, 0x49, 0x77, 0x7D,
+ 0xEA, 0xD1, 0x1F, 0xB4, 0x75, 0xF4, 0x1F, 0x73, 0xD0, 0xEA, 0x0F, 0xA6, 0x60, 0x4B, 0xE9, 0xDE,
+ 0x79, 0x4C, 0xFF, 0xD9, 0xAB, 0x9D, 0xA6, 0x92, 0xE8, 0x64, 0x25, 0x2F, 0x75, 0x97, 0x5C, 0x7A,
+ 0x7E, 0xF1, 0x5A, 0xE1, 0x6D, 0xD7, 0x16, 0x5A, 0x42, 0x83, 0x43, 0xDD, 0x8D, 0x22, 0xEB, 0xEE,
+ 0x63, 0xB0, 0x73, 0x67, 0x83, 0x1E, 0xF8, 0x7C, 0xB6, 0x5B, 0xA5, 0xF9, 0xD1, 0xFF, 0x8A, 0xAD,
+ 0x9A, 0x75, 0x4A, 0x3D, 0x37, 0x67, 0x40, 0x78, 0xD5, 0x2A, 0xB3, 0xBE, 0xF3, 0x66, 0x3F, 0x51,
+ 0x94, 0x79, 0x2D, 0x98, 0xB7, 0x29, 0x81, 0x9B, 0xC3, 0xC4, 0x28, 0x38, 0xB3, 0x99, 0x84, 0xBA,
+ 0x50, 0x15, 0x66, 0x68, 0x40, 0x3D, 0xCD, 0xAF, 0x3B, 0xF3, 0x1F, 0xD1, 0xE4, 0x17, 0x80, 0x74,
+ 0xE3, 0x14, 0xBF, 0xB3, 0x3D, 0xC3, 0xC2, 0x07, 0x1E, 0x74, 0x57, 0x96, 0xDF, 0xE4, 0x62, 0xBA,
+ 0x4C, 0x57, 0x47, 0x0A, 0x09, 0xC2, 0x46, 0x81, 0xF5, 0xBB, 0x77, 0x34, 0x49, 0x3B, 0xBB, 0x02,
+ 0xDC, 0xF1, 0x15, 0x99, 0x15, 0xB8, 0xF0, 0xD2, 0x28, 0xD5, 0xC8, 0x79, 0xAB, 0xAF, 0xF8, 0x83,
+ 0xE3, 0x57, 0x9A, 0x5E, 0xC0, 0x0C, 0x72, 0x2E, 0xD8, 0xB7, 0xDE, 0xAB, 0x27, 0x49, 0xEC, 0x4E,
+ 0x8E, 0xB0, 0x49, 0x65, 0xDD, 0x2F, 0x56, 0xA4, 0xBE, 0x04, 0x90, 0x9C, 0xCA, 0x76, 0x5F, 0x59,
+ 0x94, 0x99, 0x5F, 0x97, 0xFD, 0xA7, 0x38, 0xD2, 0x7F, 0x53, 0xBC, 0x7B, 0x0F, 0x6F, 0xC9, 0xE5,
+ 0x3A, 0x0F, 0x94, 0x2C, 0xBA, 0x85, 0x6D, 0xAE, 0xF7, 0x21, 0x6A, 0x64, 0xFD, 0xAA, 0x65, 0xD8,
+ 0x30, 0xB3, 0x0A, 0x6C, 0x91, 0xC6, 0xB6, 0x29, 0x8D, 0x68, 0xC7, 0x1A, 0x06, 0x9C, 0x58, 0x30,
+ 0x3C, 0xF2, 0xC6, 0x15, 0xD3, 0x8A, 0xC9, 0xA0, 0x4D, 0x56, 0x88, 0xC7, 0xC2, 0x4E, 0x47, 0x87,
+ 0x9F, 0x20, 0x13, 0x6C, 0xEF, 0xC4, 0x6D, 0x31, 0x47, 0xB3, 0xEB, 0xBC, 0x61, 0x11, 0xE1, 0xA1,
+ 0xD8, 0x6E, 0x2B, 0x5C, 0xC1, 0xFD, 0xC3, 0x75, 0xBF, 0x70, 0xBC, 0x77, 0x4E, 0x47, 0x65, 0xE5,
+ 0xEC, 0xDD, 0x70, 0x24, 0x63, 0xA9, 0xD6, 0x9C, 0xA9, 0x0C, 0x86, 0xDB, 0xC0, 0x3D, 0x96, 0x65,
+ 0xA4, 0x9D, 0x89, 0xF1, 0xB1, 0x65, 0x16, 0x29, 0x3E, 0x8C, 0x97, 0xC0, 0x73, 0xED, 0xD1, 0x96,
+ 0x84, 0x17, 0x8D, 0x66, 0x8E, 0x7F, 0x47, 0xD1, 0x64, 0x7F, 0x83, 0x54, 0xE6, 0xD3, 0xA0, 0x6E,
+ 0xB7, 0xB0, 0xA5, 0x7E, 0x8E, 0xFE, 0xBD, 0xA9, 0xDE, 0x0B, 0x7E, 0xE9, 0x68, 0x82, 0x2B, 0x59,
+ 0xF2, 0xA2, 0x45, 0x86, 0x84, 0xEF, 0x04, 0x18, 0x6E, 0x5F, 0x5D, 0x21, 0xED, 0x8B, 0xAE, 0x65,
+ 0x0A, 0xC4, 0xD0, 0xD8, 0x2A, 0x9E, 0x81, 0x85, 0x78, 0x2B, 0x4E, 0x11, 0x47, 0xC6, 0x60, 0x31,
+ 0x63, 0xB1, 0x9A, 0xEB, 0x55, 0x34, 0x98, 0x27, 0x9E, 0xCC, 0x7D, 0x28, 0x1B, 0xF9, 0xFF, 0x4D,
+ 0x14, 0xF1, 0x48, 0x88, 0x8C, 0x26, 0xDE, 0x1F, 0xF3, 0xE0, 0xCB, 0xD1, 0x4A, 0x06, 0x0C, 0xE0,
+ 0x79, 0x07, 0x6F, 0x01, 0xF6, 0x0F, 0x7B, 0x6E, 0x9E, 0x21, 0x0A, 0x7C, 0x8D, 0xDC, 0xAB, 0xE9,
+ 0xDB, 0xCB, 0xC8, 0x68, 0x4F, 0x20, 0xBB, 0xDB, 0xF6, 0x3A, 0xEC, 0xD4, 0x52, 0x6F, 0xDF, 0xFF,
+ 0x39, 0xAB, 0x30, 0xF9, 0xBF, 0xCB, 0xC6, 0xC6, 0x63, 0x6B, 0xFE, 0x38, 0xF8, 0x50, 0x56, 0x00,
+ 0x23, 0xF9, 0xB7, 0x33, 0xE2, 0x93, 0x0A, 0x4A, 0xA1, 0x20, 0x85, 0xEC, 0x88, 0x0E, 0x83, 0x57,
+ 0x25, 0x38, 0x91, 0x48, 0x99, 0x0D, 0xAA, 0x28, 0xEA, 0xBF, 0x66, 0x01, 0xC5, 0x08, 0xFF, 0xC6,
+ 0x78, 0x37, 0x36, 0x51, 0x0B, 0xF0, 0x63, 0x74, 0xC5, 0x3E, 0x14, 0x9C, 0xE4, 0x4B, 0x3A, 0x71,
+ 0x02, 0x96, 0x3F, 0x56, 0xF0, 0x9C, 0xCA, 0x9C, 0xAB, 0xA7, 0x86, 0x7E, 0xB0, 0x9E, 0xFB, 0x58,
+ 0xDE, 0xE5, 0x6E, 0x47, 0xEE, 0x80, 0x39, 0x52, 0xD9, 0xCA, 0xE6, 0xC9, 0xA7, 0x9C, 0x89, 0xB0,
+ 0x52, 0x68, 0xAB, 0x4B, 0x3F, 0x86, 0xD3, 0x11, 0xE6, 0xFC, 0x2C, 0x77, 0x8C, 0x5C, 0x6E, 0x19,
+ 0xD8, 0x53, 0x95, 0xA4, 0x46, 0x08, 0xAC, 0x7D, 0x5D, 0xFB, 0xDE, 0x6C, 0x4D, 0x45, 0xA3, 0x41,
+ 0x9D, 0xCE, 0xC5, 0xB1, 0x49, 0xBD, 0x06, 0xF6, 0x74, 0x2F, 0x82, 0xF6, 0x91, 0x4D, 0xDE, 0x8A,
+ 0x2D, 0xD8, 0xAF, 0x17, 0xFB, 0xC8, 0x85, 0xE2, 0x19, 0x39, 0xDD, 0x1B, 0x58, 0x2B, 0x4F, 0xB6,
+ 0xED, 0x32, 0x35, 0xF6, 0xEB, 0x12, 0xCE, 0x7F, 0xD1, 0x3C, 0xF1, 0x6E, 0xC4, 0xE5, 0xBA, 0x6E,
+ 0x92, 0xF7, 0x36, 0xF0, 0x84, 0xB3, 0x36, 0xFE, 0x89, 0x4C, 0xFE, 0xA7, 0x9D, 0x73, 0x98, 0x28,
+ 0xBB, 0x01, 0x5A, 0x9B, 0x76, 0x6C, 0x82, 0x81, 0x55, 0x3B, 0xA9, 0x42, 0xD7, 0x7A, 0x37, 0x0C,
+ 0x3E, 0x1D, 0x6D, 0xB6, 0xF8, 0xD7, 0xA5, 0xAC, 0x5A, 0xBF, 0x83, 0x16, 0x10, 0x2B, 0x2F, 0x25,
+ 0x2D, 0x28, 0x7F, 0xD3, 0xB4, 0xC3, 0x54, 0x1D, 0x7E, 0x36, 0xF1, 0x00, 0x80, 0xD5, 0x50, 0xA0,
+ 0xB7, 0x81, 0xAB, 0x6E, 0xA9, 0xEF, 0x7F, 0xB2, 0x1E, 0xA5, 0xE4, 0x62, 0x06, 0x49, 0xB3, 0xA8,
+ 0x61, 0xD2, 0x6C, 0xED, 0x4B, 0xF7, 0xAD, 0xD3, 0x4C, 0x1F, 0x23, 0xB1, 0x5B, 0x54, 0x1B, 0xA5,
+ 0xAA, 0x5F, 0x92, 0x6D, 0x6D, 0x23, 0xB2, 0x5F, 0x73, 0xC5, 0x1A, 0x1E, 0xD9, 0x17, 0xE5, 0x19,
+ 0xAF, 0x30, 0x9B, 0x77, 0x0D, 0xF5, 0xC4, 0xAF, 0xDF, 0x57, 0x72, 0x25, 0xAE, 0xA6, 0x63, 0xFD,
+ 0xB3, 0xAF, 0x73, 0x1B, 0x37, 0x12, 0x1F, 0x4C, 0x62, 0x93, 0xC3, 0x3B, 0x07, 0x59, 0xEA, 0x82,
+ 0xB5, 0x4D, 0xCF, 0x90, 0xC7, 0x36, 0x08, 0xA4, 0xE7, 0x69, 0xE5, 0xF9, 0x6E, 0x84, 0x68, 0x6D,
+ 0x2A, 0x00, 0x27, 0x3B, 0x7E, 0xD4, 0x34, 0x6B, 0x1B, 0xFB, 0x0C, 0x8F, 0xF4, 0x03, 0x31, 0x39,
+ 0x79, 0x07, 0x53, 0x04, 0x54, 0xFA, 0x6E, 0x23, 0x0D, 0x95, 0x6D, 0xF9, 0x7D, 0xCA, 0x1B, 0x08,
+ 0xDE, 0xD9, 0xC0, 0xFE, 0x99, 0x76, 0x8A, 0xE4, 0x41, 0x33, 0x6F, 0x83, 0xC1, 0x55, 0xDA, 0xE7,
+ 0x23, 0xA4, 0x56, 0x0A, 0xC5, 0x06, 0x1E, 0x0D, 0xB1, 0x7F, 0x5B, 0xDB, 0x9A, 0xE5, 0x39, 0x28,
+ 0x3B, 0x41, 0xC6, 0x22, 0xAC, 0x23, 0x09, 0x43, 0x3B, 0x16, 0xFF, 0x02, 0xC9, 0x3D, 0xC3, 0x53,
+ 0x0E, 0xF9, 0xDB, 0x8A, 0x3B, 0xA0, 0xF5, 0xCC, 0x89, 0x2D, 0x59, 0xFF, 0xB1, 0x39, 0xB1, 0xB4,
+ 0x0E, 0x9C, 0x98, 0x8F, 0x27, 0xF7, 0x6F, 0x91, 0x8B, 0x53, 0x67, 0x8B, 0xA2, 0x5E, 0xC0, 0x17,
+ 0x84, 0x3C, 0x76, 0xD2, 0xB8, 0x9A, 0x10, 0x8D, 0x0B, 0xAE, 0x3E, 0xA9, 0x51, 0x50, 0xC1, 0x94,
+ 0x05, 0xB2, 0x8B, 0x88, 0x67, 0xFE, 0x76, 0x0F, 0xAF, 0xD6, 0x88, 0xFD, 0x38, 0x9F, 0xF8, 0xA9,
+ 0x27, 0xB8, 0xB3, 0x99, 0x97, 0x1A, 0xD6, 0x82, 0x8E, 0x92, 0x8E, 0x85, 0x7B, 0x85, 0xD4, 0x94,
+ 0xF8, 0x4F, 0x9A, 0xF1, 0xC8, 0xE6, 0x9A, 0x1F, 0xC8, 0xA3, 0xD7, 0x87, 0xAD, 0x0C, 0xF8, 0x34,
+ 0x00, 0x7E, 0x30, 0xCC, 0xBE, 0x8E, 0xD9, 0x44, 0xF3, 0xBF, 0x98, 0xCF, 0xBF, 0x0F, 0x78, 0xBA,
+ 0x39, 0xD7, 0x20, 0x94, 0x46, 0x4A, 0xE2, 0x8A, 0xB0, 0x22, 0x5C, 0x8E, 0x43, 0xF8, 0xC3, 0x1D,
+ 0x4F, 0x6B, 0x4A, 0x14, 0x26, 0x9A, 0xD3, 0x10, 0xD4, 0xD3, 0x99, 0xB6, 0xD4, 0xC8, 0x6A, 0x8E,
+ 0x5D, 0x45, 0x09, 0x14, 0x30, 0x28, 0xE6, 0x75, 0xCB, 0x4C, 0x28, 0xB7, 0x27, 0x36, 0x6D, 0x4F,
+ 0xFE, 0x25, 0xCB, 0xD5, 0xAF, 0x0B, 0xA1, 0x61, 0x77, 0x7C, 0x64, 0x28, 0xDB, 0x74, 0x65, 0x2C,
+ 0xA7, 0x88, 0x3F, 0xF8, 0xA0, 0xFC, 0xD3, 0xCF, 0x99, 0x4B, 0xE8, 0xDE, 0xB7, 0x16, 0xA2, 0x80,
+ 0x16, 0x8F, 0xBB, 0x53, 0x27, 0x72, 0x6B, 0x53, 0xAB, 0x80, 0xAB, 0x37, 0xE8, 0x7C, 0x16, 0x31,
+ 0xA9, 0x81, 0xDF, 0x36, 0xD3, 0x69, 0xD9, 0xA1, 0xA9, 0x4B, 0x8F, 0x1F, 0x85, 0x64, 0x6E, 0x4D,
+ 0x39, 0x79, 0x47, 0x87, 0xF3, 0x0B, 0xB9, 0xF9, 0xE1, 0xF7, 0x6E, 0x5F, 0x29, 0x0B, 0x32, 0xEE,
+ 0xBA, 0x79, 0x01, 0x34, 0x1F, 0x1C, 0xF0, 0x03, 0xEE, 0x96, 0x2F, 0x76, 0x4E, 0x2E, 0x0F, 0xD1,
+ 0x8B, 0x94, 0x61, 0x9B, 0x33, 0x16, 0xFD, 0xA7, 0x37, 0x6F, 0x6D, 0x6C, 0x5B, 0xCA, 0xA4, 0x9F,
+ 0x19, 0x69, 0x4E, 0x17, 0xEC, 0x02, 0xE6, 0x49, 0xAA, 0x7E, 0x8E, 0xC0, 0xE9, 0x15, 0x54, 0x2F,
+ 0xA6, 0x01, 0xE9, 0x27, 0x9F, 0x2E, 0x9D, 0x85, 0x4D, 0xFF, 0x3E, 0x78, 0x0B, 0x14, 0xAC, 0x19,
+ 0x78, 0x30, 0xCF, 0xA0, 0x24, 0x01, 0x7B, 0x1D, 0x82, 0x43, 0x02, 0xAC, 0xF7, 0x6C, 0x0C, 0xA9,
+ 0xC7, 0x74, 0xE3, 0x8E, 0x15, 0xC1, 0xF2, 0xAD, 0x9D, 0x58, 0xDA, 0x50, 0x93, 0x69, 0x4F, 0x74,
+ 0x5A, 0xD2, 0xB5, 0xA0, 0x06, 0x08, 0x9D, 0xC0, 0x0F, 0x27, 0x2B, 0x19, 0x82, 0x41, 0x27, 0x32,
+ 0x66, 0xBC, 0xAA, 0x4E, 0x90, 0x44, 0x88, 0x33, 0x6E, 0x60, 0xBC, 0x7C, 0xDA, 0x29, 0x04, 0x94,
+ 0x19, 0xF7, 0xD8, 0x5E, 0x99, 0x7F, 0xEF, 0xA8, 0xBD, 0x3A, 0xE0, 0x6A, 0xB6, 0xA8, 0x00, 0x15,
+ 0x29, 0x04, 0xF1, 0x41, 0x3F, 0x2B, 0xF7, 0x59, 0x3E, 0x8E, 0xAB, 0x8D, 0x84, 0x26, 0x2D, 0xC2,
+ 0xAD, 0xA7, 0x33, 0x6C, 0x08, 0xCA, 0xB4, 0x8A, 0xF8, 0x5E, 0xD7, 0x6A, 0x5B, 0x92, 0xCE, 0x70,
+ 0x23, 0x01, 0x54, 0x88, 0xDB, 0xD7, 0xF5, 0x24, 0xED, 0xA8, 0x49, 0xDB, 0x5C, 0x4C, 0x25, 0xE1,
+ 0xBB, 0xC7, 0x5E, 0x0D, 0x05, 0x0B, 0xD0, 0x26, 0x4F, 0x1D, 0xE4, 0xD6, 0xEB, 0x38, 0x30, 0xC5,
+ 0x3F, 0x50, 0xB1, 0x46, 0x91, 0x01, 0x7A, 0xE3, 0x01, 0xD1, 0x17, 0x29, 0x4B, 0x56, 0x34, 0xAC,
+ 0x72, 0xA0, 0xA5, 0x0C, 0xBB, 0x69, 0x93, 0x3D, 0x39, 0xE4, 0x8A, 0x94, 0x2C, 0xD9, 0xD0, 0x24,
+ 0x24, 0x1C, 0x60, 0xA9, 0x79, 0xD6, 0xF2, 0x33, 0xBD, 0xB3, 0x7A, 0x61, 0x55, 0x7F, 0x66, 0xEF,
+ 0xC5, 0xC8, 0xE7, 0x60, 0xFC, 0xA5, 0xAF, 0x44, 0x34, 0x7E, 0x30, 0x17, 0xC5, 0xB1, 0xC4, 0x35,
+ 0xC7, 0x62, 0xBF, 0xA4, 0x6C, 0xD9, 0xD2, 0x86, 0xD7, 0xD7, 0x48, 0x5C, 0x8A, 0x67, 0x76, 0xFF,
+ 0xBE, 0x34, 0x5B, 0x4E, 0x20, 0xD9, 0x9F, 0xB9, 0xD4, 0x94, 0x30, 0x22, 0x6B, 0xA9, 0x01, 0xBC,
+ 0x7B, 0xEF, 0x35, 0xBD, 0x7D, 0x18, 0x68, 0x5B, 0x1D, 0x4A, 0xF5, 0x11, 0x57, 0x1D, 0xE3, 0x66,
+ 0x8C, 0xA8, 0x40, 0xD9, 0xFA, 0x55, 0xB8, 0x83, 0xE9, 0x2C, 0xDE, 0x0E, 0xBA, 0xE2, 0x16, 0xEF,
+ 0xA6, 0xE3, 0x5E, 0xA6, 0xD9, 0x1F, 0x17, 0x97, 0xCE, 0x78, 0xAC, 0x8A, 0xA0, 0x5C, 0x51, 0x2D,
+ 0xF4, 0xDE, 0xCE, 0x14, 0x57, 0xA0, 0x3A, 0x36, 0x0C, 0xAB, 0xF9, 0xEB, 0xC0, 0x91, 0x57, 0xED,
+ 0x21, 0x3D, 0x39, 0x87, 0x61, 0x93, 0x8E, 0x3E, 0x55, 0x3A, 0x7A, 0x2F, 0x1B, 0xA1, 0x00, 0x89,
+ 0xB5, 0xF7, 0x1C, 0xE0, 0x08, 0x74, 0x00, 0xD8, 0x9B, 0x4A, 0x74, 0x37, 0xE6, 0x24, 0xDB, 0x7B,
+ 0xAE, 0xA9, 0xF8, 0x92, 0x35, 0x44, 0x3A, 0x0B, 0xDB, 0xB7, 0xED, 0x65, 0xAA, 0x5F, 0x7F, 0xE3,
+ 0x35, 0xD5, 0x2D, 0x24, 0x74, 0x53, 0xA6, 0x1D, 0x55, 0x60, 0x1F, 0xB6, 0x22, 0x9C, 0x14, 0xBA,
+ 0x63, 0x52, 0x7F, 0x88, 0xF9, 0x90, 0xBC, 0xE9, 0xDB, 0x80, 0xB5, 0x00, 0x2B, 0x12, 0x50, 0xE4,
+ 0x10, 0xC9, 0xBB, 0x18, 0x76, 0x06, 0x8A, 0x93, 0xD3, 0x0B, 0xE4, 0xCB, 0x2E, 0x5C, 0xA3, 0x42,
+ 0xC5, 0xFF, 0xCF, 0x9D, 0x53, 0xD1, 0x6B, 0xE7, 0x10, 0x7D, 0x9F, 0x3C, 0xC3, 0xF9, 0xB1, 0x5B,
+ 0x8A, 0x15, 0x56, 0x63, 0xD5, 0x27, 0x40, 0x1E, 0x01, 0x1A, 0xDC, 0x0C, 0x6B, 0x7D, 0x42, 0x91,
+ 0xDD, 0x63, 0x9D, 0x1A, 0xA9, 0xA8, 0xB0, 0xC5, 0xE4, 0x4A, 0x79, 0x4B, 0x04, 0x29, 0xDF, 0x22,
+ 0x59, 0xC1, 0xF3, 0xAB, 0x09, 0x00, 0x51, 0xEE, 0x3A, 0x96, 0xE1, 0x7B, 0xDB, 0xC2, 0x36, 0x41,
+ 0x60, 0xB1, 0x84, 0x74, 0x76, 0xB4, 0xA0, 0xD2, 0x2F, 0x95, 0x5A, 0x89, 0x42, 0xB7, 0x57, 0xCD,
+ 0xFB, 0x3E, 0x5B, 0x33, 0xDC, 0x0A, 0x62, 0x18, 0x0F, 0x98, 0x71, 0x9B, 0xE6, 0x74, 0x19, 0x39,
+ 0xF6, 0xFF, 0x69, 0x4B, 0x5C, 0x24, 0x18, 0xF9, 0x3A, 0xD5, 0x70, 0x1F, 0x7B, 0x5D, 0xAC, 0x01,
+ 0xE9, 0xFE, 0xC2, 0x9E, 0xB5, 0x28, 0xB2, 0xFF, 0x5A, 0xCB, 0xA2, 0x1A, 0xF2, 0xEA, 0x7D, 0xA0,
+ 0x7A, 0xCC, 0x89, 0xEB, 0x0A, 0x1C, 0x81, 0x2B, 0x8F, 0xF3, 0x2D, 0xF5, 0x67, 0x58, 0xF9, 0x10,
+ 0x3A, 0x8F, 0x9E, 0x0A, 0x04, 0xAD, 0x7F, 0xB2, 0x2D, 0xCB, 0xCC, 0x3D, 0x84, 0x38, 0x46, 0x1B,
+ 0x9A, 0xE1, 0xAA, 0xB2, 0x7E, 0xA7, 0xF3, 0x5E, 0x43, 0x7B, 0x67, 0x7F, 0xC8, 0x0F, 0x45, 0xC0,
+ 0xB8, 0xEE, 0xE6, 0x68, 0x16, 0x1E, 0xBF, 0x14, 0xA5, 0xD1, 0xDA, 0x12, 0x7F, 0x42, 0x3B, 0x18,
+ 0xD3, 0x85, 0x8A, 0xEB, 0x2A, 0x47, 0xCF, 0xEB, 0x85, 0xFB, 0xA5, 0x10, 0x98, 0x4C, 0x56, 0x4B,
+ 0x63, 0x8A, 0x86, 0xD9, 0x98, 0x36, 0xB5, 0x2B, 0x4A, 0xA1, 0xC9, 0x2B, 0x7F, 0xF9, 0xC9, 0x29,
+ 0x9C, 0x90, 0xFE, 0x58, 0x2B, 0x85, 0xD8, 0x01, 0x93, 0x0E, 0x2A, 0x5B, 0x0E, 0xCA, 0xD6, 0xB6,
+ 0x8F, 0xE1, 0x49, 0x9C, 0x49, 0xEE, 0x83, 0xAD, 0x28, 0x33, 0x94, 0xFB, 0xA9, 0x2B, 0x47, 0x35,
+ 0xCF, 0xBD, 0x1F, 0x06, 0xFB, 0x9E, 0x70, 0xA4, 0xEC, 0x26, 0x79, 0x36, 0x3F, 0x67, 0xCF, 0x71,
+ 0x61, 0x00, 0x35, 0xD8, 0xB2, 0x3B, 0x03, 0x02, 0xD7, 0x80, 0x69, 0xE3, 0x22, 0x5F, 0x57, 0xD6,
+ 0x0A, 0x12, 0x77, 0xBB, 0x51, 0x93, 0xAC, 0xBF, 0x8A, 0xDC, 0x88, 0x48, 0x77, 0x5F, 0xD9, 0x40,
+ 0x01, 0x93, 0x83, 0xAD, 0x71, 0x32, 0xFA, 0xF8, 0xF7, 0x1D, 0x81, 0xE2, 0x6B, 0xB9, 0x39, 0xE3,
+ 0xB7, 0x4C, 0x22, 0xEA, 0x38, 0x1B, 0xF5, 0x03, 0x9D, 0xBC, 0x5A, 0x81, 0xA5, 0x87, 0xB8, 0x8D,
+ 0x91, 0x59, 0xA8, 0xBE, 0xB0, 0x47, 0x68, 0x14, 0x70, 0xC2, 0xE0, 0x65, 0xBA, 0x4B, 0xF4, 0x18,
+ 0x7E, 0xDD, 0xDD, 0x6B, 0xE2, 0xE1, 0x95, 0x14, 0xA0, 0x3E, 0x26, 0xA5, 0x43, 0x54, 0x51, 0xFE,
+ 0x26, 0x24, 0x90, 0xA3, 0x32, 0xB3, 0xE6, 0xB4, 0x8D, 0xF0, 0x7A, 0x77, 0x76, 0x2E, 0xE1, 0x0B,
+ 0x32, 0x44, 0x7B, 0x5F, 0x6B, 0x3F, 0x3C, 0x1E, 0x03, 0x0C, 0x49, 0x6E, 0x22, 0x5B, 0x18, 0x5F,
+ 0x49, 0x72, 0xDA, 0x3E, 0xB4, 0xB8, 0xA4, 0xE4, 0xB9, 0xED, 0xAA, 0xC6, 0xAB, 0xB1, 0x69, 0x80,
+ 0x55, 0xCD, 0x9C, 0xDF, 0x03, 0xC1, 0x24, 0xEC, 0xA7, 0xA1, 0x8C, 0x15, 0x6C, 0x1B, 0x3B, 0xBA,
+ 0xA5, 0xCF, 0xDF, 0x7B, 0x38, 0x81, 0xDF, 0x40, 0xF1, 0xA4, 0x03, 0x7B, 0x57, 0xAD, 0x75, 0x96,
+ 0xE9, 0xC2, 0xEE, 0x76, 0x90, 0x81, 0x3E, 0xE8, 0xD3, 0x23, 0x9B, 0x96, 0x3E, 0xF6, 0xF8, 0xFE,
+ 0xC5, 0x52, 0xA3, 0xBB, 0x68, 0x98, 0xFF, 0x92, 0xE7, 0xED, 0xC1, 0xDD, 0xF8, 0x6C, 0xC5, 0xBC,
+ 0xC4, 0x6A, 0x50, 0x53, 0x95, 0x28, 0x1D, 0x8D, 0x84, 0x90, 0xEE, 0xB0, 0x27, 0x4C, 0xE9, 0x7C,
+ 0x2E, 0x46, 0x94, 0xF5, 0xE3, 0xBB, 0xEB, 0x9F, 0x6E, 0xD1, 0x6B, 0x6F, 0x83, 0xCB, 0x2A, 0x5A,
+ 0x22, 0xAC, 0x67, 0xE4, 0x5C, 0xF9, 0x57, 0x20, 0x42, 0xA7, 0xA6, 0x89, 0x22, 0x08, 0x68, 0x92,
+ 0x64, 0x1B, 0x4B, 0x82, 0xD3, 0x62, 0xE6, 0x80, 0xAC, 0x84, 0x36, 0x19, 0x24, 0x55, 0x02, 0x4C,
+ 0x79, 0x32, 0xAD, 0x22, 0xF4, 0xE0, 0x46, 0x7B, 0x8B, 0x96, 0x9A, 0xEC, 0xC7, 0x67, 0xA1, 0x21,
+ 0x8F, 0x5C, 0x48, 0xFC, 0x52, 0xC7, 0x33, 0xA8, 0x22, 0xA0, 0x3D, 0x72, 0x44, 0x7E, 0xEB, 0x8F,
+ 0x19, 0xBE, 0x54, 0x98, 0x96, 0x91, 0xA2, 0xCA, 0x72, 0xA6, 0xAE, 0x5E, 0xA8, 0xA6, 0xC9, 0x14,
+ 0xB3, 0x09, 0xA4, 0x2B, 0x3B, 0xF8, 0x13, 0x13, 0x1D, 0x51, 0xDC, 0x93, 0x37, 0x1B, 0xFC, 0x18,
+ 0xF9, 0xA4, 0xFA, 0x57, 0x3E, 0x8D, 0xF7, 0xF0, 0xD8, 0xBF, 0x8D, 0x83, 0x3F, 0x9B, 0x5A, 0x73,
+ 0x63, 0x82, 0x56, 0x94, 0x2E, 0x02, 0x62, 0x61, 0x01, 0x3C, 0x20, 0x86, 0x44, 0xCA, 0xF8, 0xB7,
+ 0x2D, 0xDA, 0x99, 0x25, 0xD7, 0x16, 0xE1, 0xEB, 0x71, 0xEB, 0x16, 0xBC, 0xEB, 0x2F, 0x93, 0x6D,
+ 0x9F, 0xD2, 0xD0, 0xE8, 0xD4, 0xDD, 0x70, 0x8A, 0x2E, 0x82, 0xF6, 0x23, 0xF3, 0x11, 0x53, 0xC5,
+ 0xE3, 0x87, 0x06, 0xF9, 0xE6, 0x0A, 0xEE, 0xBA, 0x7B, 0x2C, 0x03, 0xBB, 0x59, 0x60, 0x1E, 0xD2,
+ 0x55, 0x43, 0xE6, 0xC1, 0x0C, 0x9E, 0x8A, 0x3A, 0x69, 0xEB, 0x0F, 0x9E, 0x34, 0x3D, 0x48, 0x5D,
+ 0xB4, 0xC1, 0xC0, 0xEF, 0x50, 0x0E, 0xC6, 0x4A, 0xFB, 0xAC, 0x5F, 0x05, 0x03, 0x39, 0xDE, 0x3C,
+ 0x09, 0xF4, 0x29, 0xC9, 0x62, 0x90, 0xFB, 0x0F, 0x78, 0x66, 0x31, 0x06, 0x2D, 0xE4, 0x1D, 0x4A,
+ 0x80, 0xF0, 0x9E, 0x33, 0xBE, 0x89, 0x35, 0x8F, 0x5D, 0xC0, 0x86, 0x0B, 0xCF, 0x4B, 0xE0, 0xF8,
+ 0xEF, 0x43, 0x69, 0x3D, 0x0D, 0xF7, 0x74, 0xC0, 0x42, 0x3A, 0x87, 0x44, 0x1D, 0xE4, 0x15, 0x82,
+ 0x54, 0x13, 0xCB, 0x05, 0xFD, 0x1D, 0xE1, 0x34, 0x97, 0x91, 0xFB, 0x4B, 0x9F, 0xB8, 0x42, 0xAC,
+ 0x9C, 0x97, 0x01, 0x26, 0x38, 0x76, 0xC5, 0x94, 0xCF, 0xA0, 0xA3, 0x18, 0x1D, 0x4C, 0x10, 0x63,
+ 0xEE, 0x20, 0x6A, 0xAD, 0xFD, 0x85, 0xCF, 0x00, 0x9E, 0x3D, 0x63, 0xE9, 0x7F, 0x73, 0x30, 0x65,
+ 0x39, 0xF4, 0x5C, 0x25, 0xE5, 0x64, 0x80, 0xE3, 0x42, 0x04, 0xCE, 0x25, 0xCB, 0x4B, 0x7C, 0x47,
+ 0x09, 0x76, 0x1B, 0x92, 0xFA, 0x1E, 0x50, 0x66, 0x87, 0x24, 0x9B, 0x12, 0x77, 0x9B, 0xC0, 0x6E,
+ 0x26, 0xC8, 0x29, 0x11, 0x29, 0x6E, 0xEC, 0x13, 0x83, 0x7B, 0xD4, 0x73, 0xDE, 0x86, 0x00, 0x08,
+ 0xD0, 0xD5, 0xA1, 0xD0, 0xCB, 0xBF, 0x05, 0x1C, 0xBC, 0xBD, 0x6F, 0x65, 0x69, 0x45, 0x22, 0xFF,
+ 0xBD, 0x0F, 0x02, 0xC0, 0xFC, 0x9B, 0x68, 0x4A, 0xC0, 0x60, 0xA4, 0x9E, 0x40, 0x50, 0xC5, 0xD2,
+ 0x76, 0x08, 0x7E, 0x58, 0xB7, 0xE2, 0x4F, 0xA2, 0xCB, 0x0B, 0xA2, 0x56, 0x10, 0xAF, 0x40, 0xA9,
+ 0xF1, 0x89, 0x77, 0xD6, 0xE8, 0xD5, 0x07, 0x9A, 0x77, 0x4D, 0x44, 0xFE, 0x18, 0x71, 0xCC, 0x4D,
+ 0x1A, 0x20, 0x5C, 0x1B, 0x44, 0x7B, 0x1E, 0xB4, 0x25, 0x2C, 0xDF, 0xE5, 0x47, 0xD4, 0xA0, 0xC7,
+ 0xB1, 0x2E, 0xDA, 0xFA, 0xB1, 0x76, 0xBB, 0xFD, 0xA0, 0x02, 0xEB, 0x4D, 0x04, 0x00, 0xCA, 0xAF,
+ 0x45, 0x83, 0x58, 0xC6, 0x52, 0x71, 0x5A, 0x3D, 0x3C, 0xF7, 0xF2, 0x29, 0xA6, 0xA2, 0xA4, 0xF3,
+ 0xC0, 0x30, 0xE0, 0x61, 0xB2, 0x55, 0x78, 0x2C, 0x57, 0x84, 0xB4, 0x33, 0xB3, 0xF8, 0xD9, 0x57,
+ 0x81, 0x37, 0xA7, 0xC1, 0x14, 0x3F, 0x1C, 0x9B, 0x0B, 0x44, 0x99, 0xDB, 0x7C, 0x0E, 0x87, 0xF2,
+ 0xAC, 0xA6, 0x71, 0xFD, 0xC9, 0x29, 0x2E, 0x3C, 0x67, 0x2C, 0x7F, 0xB2, 0xF7, 0xCB, 0x07, 0x82,
+ 0x54, 0xC8, 0x92, 0x1A, 0x94, 0xEB, 0x46, 0x96, 0x7D, 0xBB, 0x08, 0x70, 0x8C, 0x8E, 0x5F, 0x7F,
+ 0x2F, 0xAF, 0xAA, 0xF3, 0x6A, 0x2B, 0xA9, 0xF8, 0xDC, 0x92, 0x20, 0x9F, 0xC5, 0xFC, 0x18, 0xED,
+ 0x03, 0x85, 0xB1, 0x86, 0xF2, 0x74, 0x93, 0x81, 0x5D, 0x07, 0x48, 0xE4, 0xED, 0xDC, 0x67, 0x4F,
+ 0x12, 0xA0, 0x3B, 0x2A, 0x85, 0x4C, 0x04, 0xC7, 0xFA, 0x87, 0xC1, 0x25, 0x20, 0x96, 0x17, 0x5D,
+ 0x89, 0xC4, 0x0E, 0x36, 0x9B, 0xA6, 0x92, 0x70, 0xFC, 0xF5, 0x1A, 0x5C, 0xAD, 0xED, 0xD8, 0xFD,
+ 0xDD, 0x67, 0xC6, 0x3A, 0xF0, 0x5B, 0x16, 0xDF, 0x4E, 0x3F, 0xBF, 0xF9, 0x47, 0x9F, 0x01, 0x47,
+ 0x73, 0xE1, 0x5A, 0x38, 0x7E, 0xC0, 0xA9, 0x18, 0x70, 0x00, 0x88, 0xFF, 0x21, 0x2B, 0x12, 0xF4,
+ 0xC5, 0x4E, 0xC6, 0x80, 0x7D, 0xC4, 0x11, 0xB9, 0xC3, 0xF9, 0x5C, 0x69, 0x2A, 0x60, 0x6F, 0xE0,
+ 0xC6, 0x79, 0x3D, 0x15, 0xC2, 0xE7, 0x23, 0xDA, 0xFB, 0x9B, 0xAB, 0x13, 0x1D, 0x6D, 0xBD, 0xC2,
+ 0x6F, 0x3D, 0xF7, 0x44, 0xBD, 0x51, 0xF8, 0xA6, 0xD1, 0x47, 0x7D, 0x8C, 0xA8, 0x52, 0x56, 0xF7,
+ 0x01, 0x04, 0xD5, 0x22, 0xE8, 0x16, 0x21, 0x61, 0x27, 0xC8, 0xE2, 0xF9, 0xA1, 0x55, 0x44, 0x5F,
+ 0x8F, 0xC3, 0x22, 0x22, 0x3A, 0xCA, 0x2B, 0x05, 0x31, 0xCF, 0x88, 0x8E, 0x3B, 0xB0, 0x99, 0x1C,
+ 0xAA, 0x96, 0xF9, 0xDB, 0x41, 0x91, 0x64, 0x0E, 0xE1, 0xF1, 0xE0, 0xB0, 0x50, 0x62, 0x5D, 0x6B,
+ 0x36, 0xA7, 0x59, 0xD9, 0x2B, 0x77, 0x36, 0xA2, 0x18, 0xF4, 0x67, 0x74, 0xB8, 0x09, 0x88, 0x91,
+ 0x38, 0x9A, 0x01, 0x7D, 0xDE, 0xDF, 0xC3, 0xBB, 0x08, 0x59, 0xE9, 0xAD, 0xA0, 0xEE, 0xC0, 0x4B,
+ 0xC2, 0xBC, 0xB0, 0xAB, 0x4C, 0x32, 0xCB, 0x92, 0xC9, 0x97, 0x0D, 0xCF, 0x43, 0x83, 0x9D, 0xED,
+ 0x40, 0x98, 0x8E, 0x1B, 0x2D, 0x67, 0x68, 0x7C, 0x68, 0x8A, 0x38, 0x71, 0xC8, 0xCB, 0x81, 0x32,
+ 0x95, 0x86, 0x9E, 0x77, 0x5F, 0x9E, 0x85, 0xEE, 0x63, 0xC6, 0x41, 0x49, 0xD2, 0x98, 0xB0, 0x52,
+ 0x41, 0xDE, 0x59, 0x54, 0x41, 0x64, 0x6F, 0xE5, 0x1E, 0x73, 0x15, 0xA6, 0x21, 0x51, 0x4A, 0x66,
+ 0xAC, 0xB3, 0x0B, 0x69, 0x4C, 0xA3, 0xE5, 0xFA, 0xE5, 0xE3, 0xA9, 0xF5, 0x9A, 0x3A, 0x54, 0x04,
+ 0x82, 0x89, 0xF0, 0x33, 0x8F, 0x5C, 0x0E, 0x1E, 0x80, 0x17, 0x8A, 0x0E, 0x2F, 0xF8, 0x2D, 0xF3,
+ 0x84, 0xDE, 0xA7, 0x76, 0x1F, 0x4A, 0x39, 0xCA, 0x6C, 0x8E, 0xA6, 0x27, 0x4B, 0x8C, 0xC8, 0xE3,
+ 0xFF, 0x60, 0xD9, 0xE0, 0xC2, 0x90, 0xD7, 0x8E, 0x28, 0xA4, 0xD4, 0xC9, 0xA9, 0x05, 0x27, 0xD1,
+ 0x7D, 0x0C, 0xEA, 0x9F, 0x4B, 0x45, 0xC5, 0x34, 0xDA, 0xE4, 0xAC, 0x51, 0x23, 0xCC, 0xB0, 0x76,
+ 0x41, 0x91, 0x92, 0x6B, 0x7E, 0x19, 0xDD, 0x7C, 0x8D, 0x3D, 0xB9, 0xA1, 0xB3, 0x77, 0xEB, 0xD5,
+ 0x62, 0xAF, 0x45, 0x9C, 0xBD, 0x3B, 0xD4, 0x84, 0xAE, 0xA7, 0x8D, 0x3E, 0x47, 0xE1, 0xFB, 0x6C,
+ 0xD5, 0x27, 0xC6, 0x39, 0x1F, 0x74, 0x5C, 0x4D, 0x95, 0xE4, 0x7A, 0x79, 0xA9, 0x9D, 0x29, 0x02,
+ 0xC0, 0xC8, 0xA1, 0x33, 0xB8, 0xDF, 0x2A, 0x2E, 0xDC, 0x6F, 0x99, 0x9C, 0x49, 0xA3, 0x4C, 0x2A,
+ 0x2A, 0xFA, 0x4B, 0x56, 0xE8, 0x84, 0x21, 0xBE, 0x6A, 0xDA, 0x6B, 0x71, 0x98, 0x20, 0x52, 0x32,
+ 0xF3, 0xA9, 0xFA, 0x36, 0xC1, 0x42, 0x58, 0x3B, 0xDD, 0x5F, 0x05, 0x73, 0x5F, 0x3A, 0xEB, 0xC9,
+ 0x7A, 0x8A, 0x84, 0xC1, 0xDE, 0x50, 0x67, 0x1C, 0x7B, 0x98, 0xCE, 0xD9, 0x9C, 0x12, 0x81, 0x99,
+ 0xA5, 0x6B, 0x27, 0x8E, 0x32, 0x43, 0x12, 0xC9, 0xE1, 0x7A, 0x9A, 0x4D, 0xF6, 0x36, 0xAE, 0xF8,
+ 0x99, 0x4A, 0xC2, 0x90, 0x77, 0x79, 0xEF, 0x10, 0x1A, 0x4D, 0xD6, 0x71, 0x6F, 0xFB, 0xB8, 0x83,
+ 0x4E, 0x3F, 0xF3, 0xF9, 0xE5, 0xEB, 0xEB, 0xF9, 0x6E, 0x1C, 0x89, 0x47, 0x52, 0xED, 0x3F, 0x4D,
+ 0xEF, 0x26, 0xA7, 0x3C, 0x4B, 0x46, 0x9A, 0x32, 0x1E, 0x80, 0x70, 0xBC, 0x5C, 0xF2, 0x80, 0x6E,
+ 0x62, 0x7C, 0xAE, 0x80, 0xBB, 0x81, 0x82, 0x27, 0xCD, 0xA0, 0x86, 0x34, 0xD0, 0x80, 0x1E, 0x42,
+ 0xFE, 0x1B, 0xA4, 0x42, 0xC0, 0x67, 0x4D, 0xBB, 0xFC, 0x08, 0x20, 0x03, 0x6D, 0x62, 0x2F, 0xF2,
+ 0x0C, 0x57, 0x77, 0x6A, 0xC1, 0x51, 0x66, 0x74, 0x8D, 0x94, 0xE1, 0xF9, 0xF6, 0xC5, 0x78, 0xCD,
+ 0xCC, 0x68, 0xC6, 0x59, 0x2E, 0x3C, 0x94, 0x49, 0x76, 0x74, 0xD8, 0x67, 0x41, 0xF6, 0x30, 0xF2,
+ 0x83, 0xF1, 0xA8, 0x31, 0x7B, 0x86, 0x65, 0xED, 0x5F, 0xD3, 0xF3, 0x9A, 0xF3, 0x7C, 0x57, 0x13,
+ 0x57, 0x2C, 0x00, 0x49, 0xB6, 0x96, 0xB5, 0x0B, 0x13, 0xE6, 0x2B, 0x17, 0xFA, 0x66, 0xFF, 0x40,
+ 0xF9, 0x55, 0xF3, 0x61, 0xB2, 0x85, 0xA6, 0xA7, 0xC3, 0x95, 0xFC, 0x69, 0x48, 0x16, 0x8E, 0x61,
+ 0x84, 0x61, 0xCB, 0xF5, 0x5C, 0x51, 0x8E, 0x22, 0xC1, 0x26, 0x3F, 0x65, 0x59, 0xD2, 0x05, 0x23,
+ 0xAB, 0xFB, 0x18, 0x09, 0xFF, 0x91, 0x15, 0x21, 0x3E, 0xFD, 0xA3, 0x74, 0x33, 0xB4, 0x32, 0x49,
+ 0xA9, 0x3D, 0x73, 0x46, 0xA6, 0xF2, 0x20, 0x4F, 0x93, 0xD8, 0x83, 0xC0, 0xA1, 0x90, 0x28, 0xBD,
+ 0x58, 0x94, 0x53, 0x5A, 0xF1, 0x1F, 0xC7, 0x74, 0x9E, 0x6A, 0x6A, 0xD3, 0x11, 0x7A, 0x02, 0x06,
+ 0x1F, 0x9C, 0x84, 0x43, 0xAE, 0xE0, 0x92, 0x36, 0xD1, 0x93, 0x81, 0x26, 0xDC, 0x31, 0x6C, 0x0A,
+ 0xD7, 0x5B, 0x39, 0xF2, 0x8B, 0xD3, 0xAF, 0xD9, 0x9D, 0xB2, 0xBB, 0x2B, 0xFC, 0x0D, 0x0B, 0x7A,
+ 0x71, 0xEA, 0x5E, 0xC9, 0xC5, 0x78, 0xDF, 0xB4, 0x66, 0xAA, 0xB8, 0x49, 0x3E, 0x3C, 0x9D, 0x69,
+ 0xA1, 0xC2, 0xED, 0x24, 0xCE, 0xCB, 0x1D, 0x66, 0x05, 0x6B, 0xAF, 0x38, 0x0E, 0xE2, 0x52, 0x26,
+ 0x36, 0x9A, 0x78, 0xCC, 0xB1, 0xF5, 0x67, 0xC9, 0xA0, 0x4C, 0x47, 0x82, 0xC0, 0x94, 0xD5, 0x57,
+ 0x63, 0xD5, 0xA6, 0x7E, 0x7A, 0x68, 0xCA, 0x62, 0xA1, 0x5D, 0xD5, 0x21, 0x7D, 0x84, 0x1E, 0xA1,
+ 0xB5, 0x3A, 0xE3, 0xD4, 0x06, 0x9B, 0xEC, 0xED, 0x19, 0xE3, 0xD3, 0xCA, 0x90, 0x8C, 0xB7, 0x6E,
+ 0xDC, 0x1B, 0x58, 0xED, 0x3B, 0x1B, 0x55, 0xE9, 0xAA, 0xED, 0xB9, 0x36, 0x74, 0x46, 0x24, 0xA8,
+ 0x30, 0x32, 0xE9, 0x1C, 0x56, 0xFE, 0x80, 0xF6, 0x62, 0x44, 0x99, 0x22, 0x8C, 0xEB, 0x33, 0x8D,
+ 0x6F, 0xB2, 0xF9, 0xAA, 0x4D, 0x85, 0x64, 0x9F, 0xCE, 0x9A, 0x02, 0x98, 0x30, 0x94, 0x5F, 0x95,
+ 0xD4, 0xD9, 0xDE, 0xC1, 0x3B, 0xC2, 0x74, 0x84, 0xE4, 0x0C, 0x3F, 0xB6, 0xFC, 0x5E, 0xCA, 0x22,
+ 0xFE, 0xED, 0xAC, 0x59, 0x08, 0xCD, 0x90, 0x5A, 0xCB, 0x12, 0x8E, 0xE4, 0xD6, 0x87, 0x3B, 0x75,
+ 0xB8, 0xB8, 0x8F, 0xFC, 0x20, 0x5F, 0x1B, 0x90, 0xCF, 0x60, 0xF3, 0xF2, 0xBE, 0x86, 0xF4, 0x47,
+ 0x50, 0x13, 0xCE, 0xF7, 0xBD, 0x1B, 0x51, 0xE5, 0x75, 0x2A, 0xDB, 0x27, 0xA4, 0x30, 0xF4, 0xE5,
+ 0x75, 0xC2, 0x2F, 0x65, 0xC8, 0xAF, 0x65, 0xFE, 0x83, 0x82, 0x1D, 0x3B, 0xA6, 0xA3, 0x62, 0xE7,
+ 0x76, 0xD1, 0x03, 0x82, 0x60, 0xB6, 0x50, 0xE5, 0xE0, 0xF1, 0xB6, 0x1F, 0x1C, 0xFE, 0x03, 0x5F,
+ 0x33, 0x13, 0xFA, 0x01, 0xF4, 0x56, 0x45, 0xB1, 0xD9, 0x58, 0x8D, 0xC4, 0xE4, 0xAE, 0x68, 0xD1,
+ 0x5D, 0xA0, 0x47, 0x4B, 0x3B, 0xCF, 0x60, 0x94, 0xBE, 0x8B, 0xFC, 0xC8, 0x8E, 0x2A, 0x1C, 0xDF,
+ 0x09, 0x10, 0x26, 0x92, 0x30, 0x9D, 0x15, 0x67, 0x35, 0xD1, 0xD9, 0xAD, 0x09, 0x50, 0x02, 0xA9,
+ 0xC7, 0xD5, 0xCA, 0x8E, 0x88, 0xD7, 0x17, 0x50, 0x0B, 0x76, 0xA4, 0x21, 0xCD, 0xE2, 0x6C, 0xBA,
+ 0x36, 0x39, 0x6D, 0xB4, 0xD0, 0xFA, 0x8A, 0x67, 0x68, 0x3D, 0xF1, 0x8D, 0x3A, 0xB7, 0x61, 0x06,
+ 0x2A, 0x9D, 0x3B, 0xB0, 0x9B, 0xD1, 0xA1, 0x0A, 0x5A, 0xBD, 0x45, 0xD9, 0x06, 0x17, 0xFD, 0x24,
+ 0x63, 0x7E, 0x21, 0x76, 0x85, 0x9B, 0x56, 0x4E, 0x5A, 0xDA, 0x98, 0x2C, 0x63, 0x4C, 0x01, 0xC3,
+ 0x1E, 0xE9, 0xA7, 0xEB, 0xB8, 0x8E, 0xE2, 0x2B, 0xB4, 0xFF, 0x6B, 0x09, 0x61, 0xFB, 0xE9, 0xCC,
+ 0xDA, 0xE9, 0xEC, 0xA5, 0xFF, 0x43, 0x68, 0x7E, 0xFE, 0x4D, 0x69, 0x49, 0xF7, 0xF2, 0x99, 0xBD,
+ 0x56, 0x18, 0xB6, 0x79, 0x98, 0x40, 0x6D, 0xC1, 0x60, 0xF8, 0x09, 0x14, 0x4C, 0xBD, 0xD3, 0xB8,
+ 0xF3, 0x0A, 0x7C, 0xF2, 0x98, 0x58, 0x61, 0xA6, 0x30, 0x95, 0xEA, 0xB8, 0x91, 0xF2, 0xD0, 0x30,
+ 0x68, 0x62, 0x25, 0xEF, 0xFC, 0x4F, 0xC3, 0x5A, 0x40, 0x3C, 0xC9, 0xCE, 0xD9, 0x31, 0xA4, 0xBB,
+ 0x27, 0x59, 0xAA, 0x30, 0xD8, 0x71, 0xD2, 0x95, 0xDC, 0x76, 0x57, 0xCE, 0x35, 0x1B, 0x51, 0x04,
+ 0x7F, 0x42, 0x3C, 0xF5, 0x3A, 0xC8, 0xE7, 0x15, 0x36, 0x8E, 0x69, 0x1F, 0x5E, 0x08, 0x40, 0x0E,
+ 0x63, 0x12, 0x92, 0x1E, 0x78, 0xF4, 0x49, 0xD0, 0x0A, 0x90, 0xBE, 0x41, 0x3B, 0xBC, 0x8B, 0x50,
+ 0x89, 0xFC, 0x88, 0x6C, 0x3C, 0x00, 0xFC, 0xC0, 0x3A, 0x52, 0x59, 0x42, 0xA9, 0xC4, 0x35, 0x71,
+ 0x7E, 0x5D, 0x73, 0x53, 0x28, 0xD7, 0xA4, 0x58, 0x09, 0x52, 0x0F, 0xF1, 0xD5, 0xCB, 0xD6, 0x3C,
+ 0x6C, 0x5E, 0xF6, 0xF3, 0x0F, 0xE6, 0x07, 0xF0, 0x25, 0xB0, 0x76, 0x5A, 0xF0, 0x53, 0x70, 0xFB,
+ 0xF3, 0x3A, 0xDE, 0x52, 0x97, 0x4C, 0x1F, 0x34, 0x7B, 0xEE, 0xD9, 0x4C, 0xFF, 0xAD, 0x53, 0xC6,
+ 0xBA, 0x74, 0x82, 0x21, 0x81, 0x2E, 0x00, 0x19, 0x32, 0xAA, 0x3E, 0x52, 0x0E, 0x53, 0x40, 0x1A,
+ 0x63, 0xC4, 0x74, 0xF5, 0xA2, 0x33, 0x2D, 0xAB, 0x3F, 0xE4, 0x56, 0xFE, 0x1D, 0x91, 0xF3, 0x8F,
+ 0x46, 0x21, 0x10, 0x1D, 0x38, 0x3D, 0x71, 0x85, 0x6C, 0xD3, 0x44, 0xDA, 0x3D, 0x7C, 0x69, 0xEB,
+ 0x92, 0xDF, 0xE1, 0x6C, 0x82, 0x88, 0xF5, 0x15, 0x2D, 0xB2, 0x0F, 0x2D, 0xBF, 0x56, 0x6E, 0x8A,
+ 0xC8, 0x87, 0x20, 0xA2, 0xA7, 0xBC, 0xFF, 0x2A, 0x4A, 0x1F, 0x2C, 0x5B, 0x0A, 0x84, 0x41, 0x82,
+ 0xDE, 0xE2, 0x64, 0x0B, 0x42, 0xA6, 0x76, 0x44, 0x93, 0xDC, 0xD6, 0xDF, 0x26, 0x95, 0x89, 0xEF,
+ 0x76, 0x74, 0x34, 0x93, 0x45, 0x49, 0xB1, 0xB4, 0x0B, 0x2F, 0xF6, 0x6F, 0xE0, 0xC9, 0x99, 0x47,
+ 0xB1, 0x76, 0x1A, 0xBD, 0x7E, 0xCD, 0x04, 0x7E, 0xBA, 0x50, 0xA6, 0xB7, 0xC8, 0x31, 0x2C, 0x16,
+ 0x0E, 0xB9, 0x8A, 0x96, 0xC4, 0x45, 0xB4, 0x06, 0xCE, 0xFF, 0x73, 0x80, 0xED, 0x24, 0xD0, 0x9E,
+ 0xA9, 0x24, 0x1B, 0x79, 0x25, 0xA9, 0x3D, 0x86, 0x19, 0x68, 0xBF, 0x31, 0x83, 0x3C, 0x12, 0xB0,
+ 0x5B, 0x23, 0x3B, 0x07, 0x23, 0x81, 0xAF, 0xDD, 0x62, 0xE8, 0x55, 0x2D, 0x36, 0xA5, 0x16, 0xB1,
+ 0xA4, 0xFB, 0x20, 0x1A, 0x10, 0x3A, 0x0E, 0x7E, 0x97, 0xFC, 0x29, 0x06, 0x78, 0xC1, 0x63, 0xB3,
+ 0x6F, 0x64, 0xBE, 0x70, 0x8B, 0x43, 0x70, 0xEB, 0xEB, 0xE9, 0xEF, 0x7C, 0xC3, 0x59, 0x1B, 0xCC,
+ 0xAB, 0x5B, 0xE0, 0xBF, 0xF4, 0xC6, 0xD4, 0xE5, 0x07, 0xCF, 0xAB, 0x5E, 0xE8, 0x2F, 0x68, 0xD9,
+ 0xF6, 0x3A, 0x36, 0x08, 0xE3, 0xF6, 0xAE, 0x7B, 0xC5, 0x7A, 0xF1, 0x16, 0xC8, 0x46, 0x59, 0xEA,
+ 0xD9, 0xAD, 0x65, 0x74, 0xE7, 0x63, 0xA8, 0xF4, 0x5E, 0x01, 0x91, 0xE7, 0xEB, 0xA2, 0x0B, 0x92,
+ 0x3C, 0x28, 0x50, 0x9A, 0x54, 0x76, 0x4A, 0xEC, 0x38, 0x0E, 0x52, 0x02, 0xF4, 0xC8, 0x82, 0xC5,
+ 0x7D, 0x2D, 0x39, 0x6B, 0x30, 0xB3, 0x68, 0x87, 0x7B, 0x0A, 0x5C, 0x14, 0xDF, 0x5D, 0xF9, 0xF8,
+ 0x7E, 0x81, 0x6D, 0x76, 0x27, 0x78, 0x33, 0xBC, 0x9B, 0x9E, 0xEE, 0xDD, 0xFB, 0x24, 0x1B, 0xBD,
+ 0x49, 0x4B, 0x5E, 0xEA, 0xC9, 0xDD, 0x2A, 0x04, 0x2D, 0xEB, 0xB3, 0xBD, 0x22, 0xDC, 0x61, 0xC3,
+ 0x95, 0xB7, 0x95, 0x92, 0xDC, 0x32, 0x39, 0xC0, 0x18, 0xC1, 0x43, 0x3B, 0x20, 0x20, 0x32, 0x0A,
+ 0xB0, 0x51, 0x70, 0x21, 0x59, 0x64, 0x8E, 0x35, 0xFA, 0xD6, 0xF8, 0x75, 0x56, 0x59, 0x96, 0xA8,
+ 0xEE, 0x3F, 0xF1, 0x49, 0x64, 0xF1, 0x8F, 0x7C, 0x2B, 0xB9, 0x74, 0xC0, 0x03, 0x55, 0xBF, 0x95,
+ 0x9C, 0x31, 0x80, 0xDA, 0x37, 0x61, 0x99, 0x28, 0x8A, 0x45, 0x38, 0xF4, 0x23, 0xC7, 0x55, 0x13,
+ 0x79, 0x01, 0xE2, 0x1D, 0xFC, 0x76, 0x64, 0x20, 0x4B, 0x63, 0x74, 0x0B, 0x40, 0x8C, 0x11, 0x52,
+ 0xBF, 0xD1, 0x1C, 0xAF, 0x32, 0xAD, 0x92, 0x11, 0x50, 0x61, 0x57, 0x1A, 0xDD, 0x7A, 0x4B, 0x54,
+ 0xC3, 0x57, 0x2A, 0xC3, 0xF6, 0x4C, 0xDF, 0x82, 0x6B, 0x5E, 0xD9, 0x7F, 0x06, 0x52, 0x1D, 0xE3,
+ 0x78, 0x4E, 0x6C, 0xC3, 0x14, 0x73, 0xF1, 0x10, 0x7D, 0xDC, 0xBE, 0xE0, 0x30, 0x75, 0xCF, 0x24,
+ 0x18, 0x44, 0xA2, 0x61, 0xC5, 0x36, 0xD8, 0x44, 0x5E, 0x57, 0x3A, 0x2C, 0xFA, 0xDF, 0x6F, 0x0B,
+ 0x75, 0x69, 0xB7, 0x82, 0x53, 0x78, 0x23, 0x8A, 0x46, 0x65, 0xFF, 0x04, 0xC8, 0xBF, 0x7D, 0xF0,
+ 0x79, 0xDE, 0x36, 0x78, 0x2B, 0xDF, 0x30, 0x16, 0x25, 0x71, 0xDC, 0xE3, 0x02, 0xD7, 0x49, 0xF7,
+ 0x08, 0xB4, 0x9B, 0xC1, 0xEE, 0x73, 0xA5, 0x35, 0x43, 0x9E, 0xB0, 0xEA, 0x11, 0x82, 0xC4, 0xC0,
+ 0x14, 0x1D, 0x00, 0xDC, 0xB4, 0x43, 0x41, 0xC2, 0x22, 0xA3, 0xBD, 0x1B, 0x41, 0xEF, 0x9E, 0x3F,
+ 0x3A, 0x50, 0x8E, 0x0E, 0xEB, 0x08, 0x5C, 0xAC, 0x66, 0x05, 0x19, 0xF0, 0xCD, 0x3D, 0x84, 0xB8,
+ 0x04, 0x0A, 0x22, 0x69, 0xD2, 0xE1, 0x41, 0x9A, 0x9B, 0xFA, 0xAD, 0xB9, 0x84, 0x08, 0xFF, 0xEC,
+ 0x50, 0x9B, 0xD2, 0x55, 0xF6, 0x21, 0xA8, 0x4A, 0xF7, 0x19, 0xC4, 0xE9, 0x1B, 0xE7, 0xD6, 0x97,
+ 0x0F, 0xCB, 0xA3, 0xE1, 0xF5, 0xEB, 0x48, 0x38, 0x8D, 0xCD, 0x6C, 0x14, 0xC8, 0x30, 0xDD, 0xC6,
+ 0x3D, 0xA0, 0xDB, 0x46, 0xB1, 0x07, 0x89, 0x38, 0xF7, 0x2E, 0x30, 0x7F, 0xD8, 0x93, 0x92, 0x32,
+ 0x0B, 0xD8, 0x8B, 0xC8, 0x5A, 0x1A, 0x60, 0xAC, 0xD1, 0x41, 0xEC, 0xB5, 0xB5, 0xE3, 0x7B, 0xDE,
+ 0x3A, 0x33, 0x24, 0x5E, 0x06, 0x85, 0x2B, 0x65, 0x74, 0xBA, 0x40, 0x7D, 0x60, 0x87, 0xD3, 0xBE,
+ 0xD9, 0x88, 0xF8, 0x36, 0xA5, 0x83, 0xB8, 0x83, 0x62, 0x44, 0x20, 0x2F, 0xCB, 0xC7, 0xA1, 0x57,
+ 0xA8, 0x32, 0x60, 0xAB, 0x97, 0x6F, 0x70, 0x07, 0x2B, 0x41, 0x71, 0xF8, 0xCE, 0xCD, 0x73, 0x4C,
+ 0xB9, 0x04, 0x14, 0x9E, 0xC2, 0x5A, 0x6F, 0x14, 0xD0, 0x83, 0x10, 0xAE, 0x2F, 0x67, 0x10, 0x46,
+ 0x5F, 0x6D, 0x40, 0xF5, 0x2F, 0x77, 0x50, 0x82, 0x65, 0x16, 0xAB, 0x82, 0x3F, 0xBA, 0xF1, 0xBC,
+ 0x53, 0x2D, 0x86, 0xAA, 0x96, 0x40, 0x14, 0x6D, 0x38, 0x4D, 0x37, 0xD0, 0x0E, 0xFF, 0x2D, 0xBE,
+ 0x31, 0x04, 0xC3, 0x78, 0x56, 0x28, 0x7A, 0x92, 0xB6, 0xFD, 0x9D, 0x2D, 0x65, 0x1E, 0x90, 0xFE,
+ 0x30, 0x0E, 0xC6, 0x7B, 0x08, 0x27, 0x2E, 0xDC, 0x3A, 0xED, 0x07, 0x74, 0xF0, 0xF2, 0x09, 0xE9,
+ 0x1D, 0x96, 0x5B, 0xB2, 0x4D, 0x37, 0x41, 0xA9, 0xB4, 0xA3, 0x71, 0x2A, 0xAB, 0x15, 0x4F, 0x31,
+ 0x85, 0xC2, 0xD9, 0x10, 0x22, 0x10, 0xFF, 0xAF, 0xD1, 0x08, 0x36, 0x0F, 0x05, 0x2A, 0xA9, 0xE2,
+ 0xBA, 0x0E, 0x07, 0xAB, 0xAC, 0x01, 0xCF, 0xC6, 0xB8, 0xE9, 0x61, 0x45, 0xFB, 0x3F, 0x94, 0x5A,
+ 0x0C, 0x6D, 0x7B, 0x0E, 0x57, 0x5D, 0x9D, 0xEB, 0x96, 0x0C, 0x1D, 0xC1, 0x13, 0x24, 0x49, 0xB8,
+ 0xA7, 0xE9, 0x5C, 0x9E, 0xED, 0xAD, 0xF3, 0x56, 0xED, 0x91, 0xA0, 0xA1, 0x72, 0x51, 0xDE, 0xCD,
+ 0xCC, 0x05, 0x89, 0xD4, 0x01, 0xA4, 0x80, 0x0D, 0x4E, 0x5A, 0xA9, 0x5F, 0xEA, 0x71, 0x27, 0x84,
+ 0xE6, 0x70, 0x1D, 0xA2, 0xC9, 0x4C, 0x4C, 0x08, 0xAB, 0xD1, 0x73, 0x9B, 0x5D, 0xE0, 0xB7, 0x5D,
+ 0xDE, 0x1F, 0x49, 0x75, 0xD1, 0x92, 0x5B, 0x52, 0x58, 0x3A, 0xCE, 0xA0, 0x25, 0x1F, 0xA7, 0xB1,
+ 0xF7, 0xDD, 0x68, 0xD5, 0xA7, 0xB6, 0xAA, 0xEC, 0x57, 0x93, 0x61, 0xF5, 0x67, 0x9E, 0x5B, 0x9C,
+ 0xB8, 0xE0, 0x0A, 0xC5, 0x34, 0x35, 0x25, 0xDC, 0x4B, 0xC5, 0xCF, 0x20, 0x47, 0x84, 0x53, 0xDD,
+ 0x0B, 0x83, 0x70, 0xD6, 0xF7, 0x2C, 0xF3, 0x55, 0x3A, 0x52, 0xBC, 0x48, 0x0F, 0xCA, 0xFD, 0x4F,
+ 0x91, 0x79, 0x57, 0xDD, 0x46, 0xB5, 0xF2, 0xA8, 0x16, 0xC0, 0x06, 0x9B, 0xAF, 0x02, 0x12, 0x15,
+ 0xB6, 0xB0, 0x48, 0x1E, 0x95, 0xA4, 0x36, 0xBB, 0xD6, 0xF8, 0xBA, 0x1D, 0x70, 0x50, 0x23, 0xA8,
+ 0xF6, 0xBB, 0x61, 0x46, 0x91, 0x24, 0x16, 0x4E, 0x02, 0xD8, 0x73, 0x01, 0x78, 0xDD, 0x42, 0x7A,
+ 0xA6, 0x4F, 0xFE, 0x94, 0xF6, 0xEA, 0x1E, 0x62, 0xB0, 0xAC, 0xE4, 0x94, 0x09, 0x0D, 0x43, 0xF4,
+ 0xA0, 0xA8, 0x7A, 0xAA, 0x1C, 0x28, 0x49, 0xD7, 0xCC, 0x8B, 0x55, 0xF3, 0xD3, 0x99, 0x9B, 0xEC,
+ 0x41, 0x6B, 0x86, 0x85, 0x65, 0x1B, 0xC2, 0x2E, 0xD2, 0xF6, 0x46, 0x9F, 0x46, 0xFF, 0x9A, 0x5F,
+ 0xAF, 0x6F, 0x22, 0x29, 0x59, 0x40, 0xE4, 0x2D, 0xBE, 0x4A, 0x8E, 0xF0, 0x2B, 0x48, 0x5F, 0xC1,
+ 0x76, 0xA5, 0x2F, 0xEE, 0x03, 0xEB, 0xCF, 0xA7, 0x2E, 0xB0, 0x27, 0xD7, 0x49, 0xB1, 0xB4, 0x01,
+ 0x46, 0x00, 0x72, 0xCC, 0x98, 0xD7, 0xA3, 0xBC, 0x4E, 0xF1, 0x32, 0x3D, 0xF1, 0x29, 0x98, 0xA4,
+ 0x39, 0xD0, 0xD9, 0xD9, 0x2A, 0x99, 0x14, 0x69, 0xE1, 0x99, 0x70, 0xC8, 0xEE, 0x5D, 0xC9, 0xC3,
+ 0x92, 0xF3, 0xB6, 0xE7, 0xA7, 0x14, 0xC3, 0xC4, 0xBB, 0x05, 0x44, 0xDD, 0xDC, 0x77, 0xDB, 0x00,
+ 0x73, 0xC9, 0x0B, 0x17, 0x38, 0xAF, 0xCB, 0x7E, 0x5F, 0x4D, 0x3F, 0x79, 0x16, 0x10, 0x75, 0x79,
+ 0x69, 0x16, 0xAC, 0x7E, 0xAA, 0x73, 0xC7, 0x71, 0xF6, 0x01, 0x45, 0xC2, 0xA9, 0xB8, 0xC2, 0x77,
+ 0x88, 0x45, 0x3A, 0xCC, 0x9E, 0x02, 0xF5, 0xCC, 0x58, 0x4B, 0x98, 0x9B, 0xA4, 0x7F, 0x9F, 0xB2,
+ 0xE9, 0x8F, 0x0F, 0x21, 0xA2, 0xA3, 0x30, 0x24, 0x96, 0x8E, 0x45, 0xCA, 0x7E, 0x88, 0x92, 0x8A,
+ 0x81, 0xC5, 0xB5, 0x84, 0x99, 0x98, 0x2D, 0x97, 0xAF, 0x75, 0x7D, 0x0E, 0xCB, 0x28, 0x96, 0xD5,
+ 0x4D, 0xFE, 0xDD, 0x30, 0xE1, 0xC3, 0x19, 0x3D, 0x04, 0x5A, 0xEA, 0x09, 0x82, 0x66, 0x51, 0xE2,
+ 0xE9, 0x03, 0xA3, 0xC2, 0xF7, 0x72, 0x7F, 0xE0, 0x13, 0xF6, 0x29, 0x15, 0xE9, 0x51, 0xF3, 0x12,
+ 0xE1, 0xB1, 0xC8, 0xC9, 0x4F, 0xE0, 0x44, 0xA7, 0xE8, 0x80, 0x42, 0x82, 0x98, 0x1D, 0xA9, 0x0F,
+ 0x17, 0x29, 0xEF, 0xD6, 0xAB, 0x6D, 0x5F, 0x9D, 0xD3, 0x63, 0x61, 0xF3, 0x63, 0x02, 0xC0, 0xF5,
+ 0xB5, 0x75, 0x52, 0x9F, 0x0B, 0xED, 0x8E, 0x37, 0x1C, 0xC4, 0x33, 0x02, 0xD8, 0xF5, 0xE4, 0x57,
+ 0x0F, 0xD4, 0x7F, 0x07, 0xFB, 0x7B, 0x98, 0x92, 0x71, 0x17, 0x45, 0xB0, 0x03, 0xD3, 0x62, 0xFF,
+ 0x65, 0xDC, 0x5B, 0xA4, 0xA1, 0x8A, 0x3F, 0xF8, 0x0F, 0x34, 0xF8, 0xDF, 0x59, 0x60, 0xE4, 0xC1,
+ 0x16, 0xC7, 0xAE, 0x46, 0x88, 0x33, 0x9E, 0xE0, 0xD0, 0xB6, 0x21, 0xB6, 0x4B, 0x77, 0xB0, 0x12,
+ 0x3A, 0x15, 0x15, 0x21, 0x5E, 0xC7, 0xC5, 0xE3, 0x90, 0x4E, 0x79, 0x96, 0x1C, 0xCA, 0xEA, 0xC3,
+ 0x2D, 0x0B, 0x8C, 0xCE, 0x3E, 0x54, 0x7A, 0x44, 0xBA, 0xE4, 0xCC, 0x23, 0x14, 0xEA, 0x73, 0x96,
+ 0x88, 0x54, 0x99, 0xD8, 0x7B, 0x10, 0xB8, 0xB9, 0xD2, 0xA4, 0x57, 0x63, 0x35, 0xDB, 0x8A, 0xFB,
+ 0xBE, 0x57, 0xA3, 0x9B, 0x0B, 0x39, 0x35, 0x08, 0x03, 0x9A, 0x22, 0x55, 0x04, 0xE2, 0x14, 0xBF,
+ 0xA1, 0xCA, 0x15, 0xAC, 0xA6, 0x6E, 0xF7, 0xEC, 0x7B, 0xE4, 0xE7, 0x9C, 0x22, 0x4C, 0x25, 0x77,
+ 0x77, 0x23, 0xEF, 0xF8, 0xB3, 0x52, 0x88, 0xB2, 0x85, 0x65, 0xFC, 0xAE, 0xCA, 0xAB, 0x44, 0x77,
+ 0x5B, 0x09, 0xC0, 0xC3, 0xB1, 0x46, 0xAF, 0xEB, 0xEF, 0x50, 0xC4, 0x47, 0x0E, 0xAC, 0xEF, 0x22,
+ 0xAF, 0x24, 0x53, 0x51, 0x52, 0xB9, 0x55, 0xD7, 0xA8, 0x1A, 0x1A, 0xC5, 0xDC, 0x64, 0xD4, 0x0C,
+ 0x15, 0x37, 0x23, 0xC5, 0xD9, 0x2C, 0x02, 0xC5, 0x53, 0x9D, 0xB4, 0x0C, 0x27, 0xB8, 0x00, 0xA3,
+ 0x2E, 0x38, 0xAD, 0xE8, 0xD0, 0x52, 0xB0, 0x37, 0x9A, 0xC8, 0x81, 0x33, 0x87, 0x37, 0x0C, 0xB8,
+ 0x17, 0x45, 0x8A, 0xAC, 0xB1, 0xEF, 0xA4, 0xA1, 0x10, 0x4E, 0x88, 0x13, 0x10, 0x28, 0xF0, 0x22,
+ 0x55, 0x18, 0x96, 0xB1, 0xDC, 0x54, 0x7B, 0xC3, 0x7A, 0xA1, 0x8C, 0x58, 0x14, 0x9D, 0xB4, 0xC5,
+ 0x98, 0xA9, 0xBF, 0xB6, 0x27, 0x4F, 0x7A, 0x1C, 0xF4, 0x03, 0x6B, 0x60, 0x91, 0xB0, 0x1E, 0x9A,
+ 0x3B, 0x2B, 0x40, 0x30, 0x22, 0x3F, 0x61, 0x16, 0x8E, 0x4D, 0xC0, 0x8F, 0xED, 0xA5, 0x4F, 0x73,
+ 0x10, 0x4A, 0xD2, 0x73, 0xC5, 0xF8, 0x95, 0x25, 0xB0, 0xBC, 0x01, 0x14, 0x37, 0x0D, 0x74, 0x45,
+ 0xAA, 0xD6, 0x21, 0x4B, 0x7D, 0x55, 0x93, 0x16, 0x02, 0xBB, 0xBD, 0x77, 0x4F, 0xEE, 0xEA, 0x29,
+ 0x3C, 0xDF, 0x45, 0x9A, 0x9B, 0x73, 0xBC, 0x01, 0xF7, 0x18, 0x53, 0x1A, 0x73, 0x2B, 0x3F, 0x78,
+ 0x69, 0xB8, 0x45, 0x16, 0x9F, 0x76, 0x09, 0x91, 0x04, 0x21, 0x6B, 0x82, 0xCF, 0xFB, 0x0C, 0xF2,
+ 0x15, 0x6A, 0xDD, 0x67, 0x2C, 0x21, 0x39, 0x06, 0x13, 0x6C, 0xD7, 0x58, 0x54, 0xBA, 0xAC, 0x8D,
+ 0x1A, 0x13, 0x8F, 0x4F, 0xC3, 0xE8, 0x0A, 0xCC, 0xA0, 0x25, 0xC5, 0xBD, 0x49, 0x95, 0x6D, 0x95,
+ 0xA8, 0x6F, 0xCA, 0x85, 0x4F, 0xA1, 0x94, 0x45, 0x86, 0xE2, 0xBA, 0xD6, 0xE3, 0xFA, 0x91, 0xF5,
+ 0x03, 0xA2, 0x2C, 0xCD, 0x54, 0x37, 0x61, 0xA6, 0x34, 0xE0, 0x8D, 0x1C, 0xD4, 0xC9, 0x31, 0x4B,
+ 0x13, 0x04, 0xA6, 0x52, 0xFC, 0x8F, 0x4F, 0x81, 0x0A, 0x15, 0xB0, 0xB0, 0x33, 0x2F, 0x2A, 0xFC,
+ 0xFF, 0x95, 0x87, 0x66, 0xFD, 0x19, 0xDE, 0x77, 0x4C, 0xF9, 0x3A, 0x5D, 0x34, 0x5D, 0x47, 0x0B,
+ 0x33, 0x55, 0x9B, 0x90, 0x13, 0x2C, 0xE3, 0xD8, 0xA9, 0xDB, 0xAA, 0xA0, 0x4F, 0x7F, 0x20, 0xF6,
+ 0x8C, 0x5A, 0x48, 0x8F, 0x88, 0x95, 0x51, 0x11, 0x95, 0x88, 0x13, 0x31, 0x4D, 0x6F, 0xA2, 0x5A,
+ 0x1B, 0xE5, 0x16, 0x6E, 0x9C, 0x24, 0xA2, 0x82, 0x69, 0xAC, 0x0A, 0x54, 0x8B, 0x12, 0x64, 0x4D,
+ 0xC4, 0x51, 0x7F, 0xEA, 0x4C, 0x44, 0x58, 0xF2, 0xA1, 0x1E, 0xBF, 0x02, 0x15, 0x75, 0x4C, 0x4A,
+ 0xEB, 0x4F, 0x77, 0xE5, 0xB1, 0x3C, 0x26, 0x4F, 0x21, 0xB9, 0xAD, 0x70, 0x36, 0x4C, 0x02, 0x10,
+ 0x55, 0x29, 0x7C, 0xA1, 0x01, 0x9F, 0xD9, 0x67, 0xAB, 0xEE, 0x93, 0xD5, 0x91, 0xDF, 0xC5, 0x18,
+ 0x48, 0x9B, 0x9D, 0x3C, 0xCB, 0xCF, 0x06, 0x21, 0xA7, 0x5B, 0xE5, 0x83, 0x3B, 0x54, 0xCC, 0x04,
+ 0x43, 0x63, 0x60, 0x66, 0x60, 0x0F, 0xA2, 0x23, 0xAE, 0xE1, 0x55, 0x78, 0x09, 0x62, 0x51, 0x0F,
+ 0xAE, 0xF1, 0xE5, 0xBE, 0xCB, 0x4E, 0x83, 0xB1, 0xB8, 0x45, 0x0E, 0x85, 0x54, 0x69, 0xCC, 0xFD,
+ 0x7C, 0x5C, 0x95, 0xBB, 0x46, 0xF5, 0x21, 0xB9, 0x86, 0x8C, 0x71, 0x10, 0xF3, 0x6C, 0x1E, 0xE5,
+ 0xBB, 0x5B, 0xCA, 0x38, 0xAE, 0xF1, 0xB8, 0x73, 0xDB, 0x16, 0x30, 0x28, 0xB6, 0x18, 0xB4, 0xF4,
+ 0x01, 0x0A, 0x99, 0xCC, 0x01, 0x14, 0x80, 0xC1, 0xC1, 0xED, 0xC4, 0xE3, 0xE6, 0x92, 0x61, 0x7E,
+ 0x18, 0x44, 0xB2, 0x41, 0xE6, 0x41, 0xC5, 0xFB, 0x07, 0x75, 0xD3, 0xFB, 0xA7, 0xA9, 0xE7, 0x3B,
+ 0xAA, 0xFE, 0xB8, 0x16, 0x34, 0x9B, 0xA9, 0xEB, 0x75, 0xBA, 0xE6, 0x19, 0x21, 0x4B, 0x3E, 0xF9,
+ 0xFF, 0xC7, 0x03, 0x22, 0x42, 0xC4, 0x03, 0x38, 0x83, 0xA9, 0xB0, 0xCE, 0xB7, 0x32, 0x8E, 0x99,
+ 0x18, 0x8A, 0x3E, 0xC9, 0x38, 0x23, 0x7E, 0x21, 0x0A, 0xBD, 0x2A, 0x07, 0x3C, 0x05, 0xA6, 0x1E,
+ 0x5A, 0x56, 0xD8, 0xC8, 0xE7, 0x5F, 0x5D, 0x6D, 0x4F, 0xA6, 0x6F, 0xB6, 0xE1, 0xEE, 0x65, 0x6A,
+ 0x9F, 0xA1, 0xD8, 0x69, 0xC0, 0x9E, 0x6D, 0x4F, 0x64, 0x78, 0x34, 0x21, 0x56, 0x46, 0x98, 0xC4,
+ 0x23, 0xE7, 0x4D, 0x25, 0x24, 0x50, 0x86, 0xFC, 0xED, 0xB9, 0x32, 0x1D, 0x81, 0x0E, 0xE1, 0xFD,
+ 0x01, 0x67, 0x07, 0xD8, 0xF0, 0x15, 0xFC, 0x67, 0x62, 0x24, 0xD7, 0xB3, 0xAE, 0x48, 0x26, 0xE2,
+ 0xBD, 0x98, 0x51, 0xE2, 0x28, 0xC7, 0x54, 0x30, 0xC0, 0x7C, 0xFF, 0xA7, 0x8A, 0x43, 0x19, 0xE0,
+ 0xEF, 0x17, 0x1D, 0xF2, 0x15, 0xD5, 0x8E, 0x55, 0xAA, 0x8B, 0x98, 0x13, 0xF8, 0xAA, 0xCB, 0xB8,
+ 0x44, 0x74, 0x8E, 0x54, 0x38, 0xA9, 0xB7, 0x2E, 0xCE, 0x69, 0xEE, 0x12, 0x13, 0xEB, 0xA4, 0x73,
+ 0xE0, 0x22, 0x0D, 0x1D, 0x38, 0xA5, 0x51, 0x68, 0xFC, 0x8D, 0x1F, 0xF8, 0x97, 0xE9, 0xD9, 0xF6,
+ 0xC4, 0x0E, 0x19, 0x8C, 0xB8, 0xB4, 0xE0, 0xB7, 0x9C, 0x88, 0x97, 0x45, 0xA5, 0x09, 0xEC, 0x28,
+ 0x6C, 0x84, 0xE6, 0xA2, 0x79, 0xD2, 0x82, 0x08, 0x3E, 0xA4, 0xD5, 0x27, 0x6E, 0x2C, 0x00, 0x3B,
+ 0x2C, 0x69, 0x5C, 0x9F, 0x23, 0x98, 0x14, 0x44, 0x73, 0x1C, 0x2B, 0x42, 0x69, 0xAE, 0x77, 0xF3,
+ 0xA8, 0x8D, 0xC5, 0xA0, 0x75, 0xD6, 0xDF, 0xDA, 0xC1, 0x72, 0x77, 0x5F, 0x25, 0x7A, 0x76, 0x80,
+ 0x8C, 0x78, 0x5D, 0xD4, 0x13, 0xA7, 0x4C, 0x72, 0xB8, 0x8C, 0x0F, 0xE1, 0x10, 0xE2, 0x00, 0xBA,
+ 0xE9, 0x7A, 0x50, 0x81, 0xDB, 0x60, 0x98, 0x39, 0x90, 0x58, 0x5B, 0x8E, 0xA7, 0x96, 0x56, 0xB5,
+ 0x0A, 0xC7, 0x72, 0x5A, 0x26, 0x53, 0x23, 0x99, 0x52, 0xCB, 0xD5, 0xFE, 0xC9, 0xF8, 0xE3, 0x78,
+ 0x16, 0x80, 0xFE, 0xCC, 0x6A, 0x4F, 0x4B, 0x0C, 0xCA, 0x72, 0xCC, 0xF7, 0x23, 0xCA, 0x0E, 0x0E,
+ 0x5C, 0xD7, 0xA2, 0xA5, 0xA9, 0x8D, 0xC1, 0xE9, 0x73, 0x7B, 0x84, 0xD6, 0x86, 0x49, 0x45, 0xD2,
+ 0xD4, 0x05, 0xEB, 0xA8, 0xD2, 0x5A, 0x69, 0x0F, 0xCB, 0x99, 0x39, 0x26, 0xDD, 0x4F, 0xDC, 0x42,
+ 0xFD, 0x8F, 0xC8, 0x0B, 0x29, 0xB8, 0x83, 0x3D, 0xB8, 0x96, 0x6C, 0x8A, 0x5E, 0xC5, 0x28, 0x60,
+ 0xE3, 0xC8, 0x9F, 0xFA, 0x0C, 0xC7, 0xAB, 0x67, 0x8D, 0x23, 0x0F, 0x35, 0xAB, 0xCF, 0xBF, 0x7D,
+ 0xC2, 0xF6, 0x33, 0xC8, 0xED, 0x53, 0x86, 0x77, 0x28, 0x0B, 0xD5, 0x47, 0x3E, 0x17, 0x54, 0x9F,
+ 0x49, 0xD7, 0x29, 0x69, 0x57, 0xC0, 0x70, 0xC9, 0x0E, 0xC1, 0x3A, 0x77, 0x4A, 0x91, 0x2E, 0x23,
+ 0xF1, 0x13, 0xD0, 0x61, 0x8F, 0xA3, 0x6A, 0xDE, 0x01, 0x6A, 0xC2, 0x4B, 0x8F, 0xCD, 0x5D, 0x98,
+ 0x70, 0x6D, 0xAC, 0xE3, 0xFD, 0x17, 0x77, 0x37, 0x81, 0x4C, 0x31, 0xC0, 0x93, 0x74, 0x27, 0x79,
+ 0xA3, 0x65, 0x7F, 0x35, 0x31, 0x9F, 0x4E, 0x21, 0x13, 0xCE, 0x7E, 0xAB, 0x01, 0x85, 0x1D, 0x66,
+ 0x95, 0xF5, 0x0C, 0x19, 0x8B, 0x06, 0x3D, 0xB3, 0x14, 0xD9, 0x64, 0x2B, 0x46, 0xB5, 0x8A, 0x47,
+ 0x0A, 0x98, 0x6D, 0x4E, 0x7C, 0xE6, 0x26, 0xC8, 0xFA, 0xAB, 0x90, 0xFB, 0x4F, 0x04, 0xCC, 0xB2,
+ 0x0C, 0x9D, 0x62, 0x45, 0x55, 0x89, 0x4A, 0x55, 0x9B, 0x76, 0x71, 0x1D, 0x90, 0xE4, 0xCF, 0x46,
+ 0xFC, 0x2F, 0x92, 0x88, 0x9B, 0xFA, 0xF0, 0xCE, 0xB1, 0x56, 0xB5, 0xD7, 0x65, 0xBF, 0x8A, 0x63,
+ 0x5E, 0x0E, 0x05, 0xDA, 0xD9, 0xFF, 0x26, 0xFD, 0x2A, 0xA0, 0x98, 0x70, 0x32, 0xBC, 0xBC, 0x93,
+ 0x22, 0x8C, 0x6E, 0xB1, 0x36, 0xE8, 0x9D, 0x7F, 0xBC, 0xDE, 0xDD, 0x0A, 0x3F, 0x6D, 0xEA, 0xA2,
+ 0xDA, 0xAC, 0x7B, 0x77, 0x4E, 0x6D, 0x7A, 0x71, 0xEF, 0x49, 0x6E, 0x31, 0xD1, 0xD6, 0xC9, 0x15,
+ 0xBA, 0x1E, 0x18, 0x98, 0x92, 0xF1, 0x21, 0x23, 0xC0, 0xB5, 0x9C, 0x37, 0x15, 0x97, 0xA6, 0x48,
+ 0x09, 0x6D, 0x46, 0x6C, 0x45, 0x06, 0xC5, 0x27, 0x64, 0x54, 0x78, 0xF5, 0xFF, 0xD3, 0xD3, 0xAE,
+ 0xC8, 0x6E, 0xFC, 0x59, 0xB1, 0xD9, 0x26, 0xE8, 0xEE, 0x3C, 0x1D, 0xC7, 0xCF, 0xC0, 0xE0, 0xAB,
+ 0xDC, 0x10, 0x74, 0x48, 0xBA, 0xC2, 0xCA, 0xA1, 0x9C, 0xFB, 0x87, 0x99, 0x7A, 0x6B, 0x37, 0x5C,
+ 0x6F, 0x9F, 0x97, 0xCB, 0x90, 0x4F, 0xBC, 0x26, 0x15, 0xAC, 0x0D, 0xC6, 0x72, 0xF6, 0x29, 0xF8,
+ 0xDD, 0x57, 0x68, 0x46, 0x35, 0x60, 0xD8, 0x16, 0xE7, 0x3F, 0xC7, 0xEC, 0xDE, 0x6B, 0x8C, 0xF0,
+ 0x3D, 0x4A, 0x17, 0x58, 0x55, 0xD5, 0xE8, 0xA8, 0x4A, 0x62, 0x48, 0x8B, 0x52, 0xBD, 0x13, 0x00,
+ 0xF7, 0x44, 0xD1, 0x78, 0x3C, 0x1D, 0xAC, 0x34, 0xEE, 0xA5, 0x9B, 0xCC, 0x6D, 0xAD, 0x30, 0x31,
+ 0xFC, 0x81, 0x91, 0x50, 0x26, 0x2A, 0x48, 0x30, 0x20, 0xB7, 0xAA, 0x87, 0x02, 0x99, 0xB2, 0xE4,
+ 0xAC, 0x83, 0x71, 0x59, 0xDC, 0xD9, 0x5D, 0x6C, 0xB1, 0x03, 0x32, 0x97, 0x97, 0xEE, 0xFD, 0xCC,
+ 0xC4, 0xF3, 0xDD, 0x94, 0xC6, 0x43, 0xB9, 0xB7, 0x1D, 0x2F, 0x9C, 0x9D, 0x7F, 0x91, 0x51, 0x1A,
+ 0x35, 0xAF, 0xD8, 0x50, 0xFB, 0xBF, 0xD0, 0xA0, 0x28, 0x39, 0x6F, 0x47, 0x96, 0x57, 0x7D, 0x52,
+ 0x5C, 0xCD, 0xC9, 0x7F, 0xBB, 0x2C, 0x15, 0xFE, 0x2A, 0x3A, 0xFD, 0x23, 0xB2, 0x91, 0x6F, 0xC7,
+ 0x3C, 0xB2, 0x91, 0xB9, 0x59, 0xAA, 0x2E, 0x96, 0x45, 0xC5, 0x30, 0xAC, 0x03, 0x42, 0x78, 0xFD,
+ 0x46, 0xD2, 0x2F, 0x7A, 0x46, 0x55, 0x26, 0x49, 0x38, 0x4C, 0xA1, 0xD2, 0x78, 0x17, 0xD6, 0x3D,
+ 0x00, 0xCB, 0xF7, 0xB2, 0x68, 0x7D, 0x4A, 0xDA, 0x2E, 0x54, 0xF6, 0x6C, 0xCF, 0xDE, 0x8F, 0xF7,
+ 0xFA, 0xF8, 0x87, 0x38, 0xCA, 0xEA, 0xD2, 0x1F, 0xED, 0x04, 0xD0, 0xE9, 0x12, 0xCF, 0x11, 0x18,
+ 0xAF, 0xF3, 0x4E, 0x13, 0x3D, 0xBC, 0x30, 0xB4, 0x15, 0x71, 0x8B, 0x2D, 0x63, 0xCA, 0x53, 0x8C,
+ 0x20, 0x6D, 0x0C, 0x4E, 0xF8, 0x10, 0xD2, 0x1A, 0xC1, 0x0C, 0xE8, 0xCF, 0xE1, 0xA8, 0x93, 0x7E,
+ 0x8B, 0x32, 0x9D, 0x47, 0x03, 0x2B, 0x92, 0x27, 0x73, 0xE9, 0x39, 0xBD, 0x9F, 0x7B, 0x76, 0x8B,
+ 0x3C, 0x66, 0xA1, 0x3E, 0x4B, 0x69, 0x36, 0x71, 0x93, 0x02, 0x47, 0x5E, 0x3D, 0x8F, 0x28, 0x72,
+ 0x15, 0x85, 0x64, 0x1C, 0x8F, 0x2F, 0x58, 0x8F, 0xDD, 0x25, 0x84, 0x70, 0x0A, 0xD4, 0x8A, 0x3A,
+ 0x02, 0x08, 0xC6, 0x91, 0xBD, 0xE9, 0xA9, 0x66, 0xD0, 0x9F, 0xE5, 0x2F, 0xCF, 0xA2, 0x94, 0x7E,
+ 0xB8, 0x91, 0x31, 0x90, 0xC8, 0x06, 0x9B, 0x91, 0xCD, 0xE7, 0xDD, 0x1D, 0x6F, 0x57, 0x40, 0x59,
+ 0x64, 0x95, 0x49, 0xAA, 0xA6, 0x48, 0x2F, 0x09, 0x78, 0xE8, 0xA5, 0xCF, 0x41, 0x8C, 0x23, 0x38,
+ 0xEB, 0xA6, 0x93, 0x7F, 0x33, 0xE1, 0x38, 0x02, 0x64, 0x8C, 0x6A, 0x40, 0x93, 0xD0, 0x4D, 0xA9,
+ 0x9A, 0x4C, 0xE4, 0x2F, 0x8C, 0xC4, 0xFE, 0x00, 0xB6, 0x6C, 0xD2, 0x55, 0xA8, 0xB6, 0xF1, 0x44,
+ 0x43, 0x07, 0x53, 0x38, 0x12, 0xD3, 0xA3, 0x25, 0x76, 0x13, 0x7E, 0x81, 0x39, 0xAB, 0x87, 0x90,
+ 0x15, 0xEC, 0x81, 0xC4, 0x37, 0x08, 0x18, 0xDC, 0xED, 0xE5, 0xF0, 0xA5, 0x68, 0x41, 0x52, 0x92,
+ 0xFA, 0x53, 0x70, 0xF6, 0xA0, 0xDC, 0xEF, 0xCF, 0x6C, 0x3F, 0xDE, 0x72, 0x33, 0x3F, 0x43, 0x84,
+ 0xB0, 0xA0, 0xC5, 0xEF, 0x1B, 0x45, 0x63, 0x00, 0x6B, 0xDA, 0x3E, 0xCD, 0x84, 0x19, 0xD4, 0xD9,
+ 0x0D, 0x8C, 0x27, 0xF0, 0x6E, 0xA2, 0x03, 0xD5, 0xFD, 0xD7, 0x8F, 0x43, 0x46, 0x5E, 0x38, 0x91,
+ 0x7B, 0x2E, 0xB8, 0x65, 0xCD, 0x16, 0xC2, 0xB9, 0x50, 0x97, 0x1C, 0xAF, 0x3A, 0xE0, 0xA9, 0x44,
+ 0xE7, 0xF6, 0x5E, 0x40, 0x41, 0x55, 0xDD, 0x05, 0xD9, 0xFC, 0x50, 0xB1, 0x1D, 0x51, 0xEE, 0xB0,
+ 0x8A, 0x52, 0x38, 0x77, 0x59, 0x36, 0xDE, 0xB2, 0xB9, 0x28, 0x07, 0xE0, 0xC8, 0x44, 0x80, 0x6D,
+ 0x91, 0x72, 0x65, 0xD8, 0xC6, 0xA2, 0xFF, 0xF6, 0x61, 0x37, 0x22, 0x1B, 0x98, 0x65, 0xF9, 0x96,
+ 0xDB, 0xF9, 0x33, 0xE7, 0xAE, 0x25, 0x07, 0xC2, 0x01, 0x54, 0xF3, 0xA3, 0xFD, 0xC8, 0x25, 0x8E,
+ 0x7B, 0x7F, 0x49, 0xD1, 0x55, 0xA3, 0x17, 0x58, 0x53, 0xF0, 0x0F, 0xCA, 0x1F, 0x6D, 0xEF, 0x28,
+ 0x46, 0x0B, 0x35, 0x21, 0x66, 0x6C, 0x4F, 0x01, 0x79, 0x92, 0xD2, 0x16, 0x3C, 0x2C, 0xBE, 0x88,
+ 0x2E, 0x09, 0xC3, 0x8E, 0x8E, 0x62, 0x0F, 0x5E, 0x4D, 0x3C, 0x0C, 0xFE, 0x02, 0x1A, 0x02, 0xB1,
+ 0xF4, 0x86, 0xCA, 0x17, 0x0E, 0x57, 0x00, 0x35, 0x6C, 0xA6, 0xBF, 0x29, 0x35, 0x24, 0x78, 0x30,
+ 0x90, 0xF3, 0xBE, 0x0B, 0x9D, 0x88, 0x79, 0x14, 0x92, 0x32, 0x8F, 0xA0, 0xC1, 0xF7, 0x98, 0xFA,
+ 0x9B, 0x62, 0x70, 0x84, 0xA6, 0x5A, 0xA6, 0x03, 0xD0, 0x9F, 0xE9, 0x6A, 0x9F, 0x3A, 0xD4, 0xB7,
+ 0xE2, 0x83, 0x6A, 0x5B, 0x94, 0x44, 0x01, 0x99, 0x2F, 0x7F, 0x59, 0xA9, 0xF2, 0xAD, 0x74, 0x15,
+ 0xC7, 0x31, 0x22, 0x13, 0x76, 0xF4, 0x3D, 0x4A, 0x07, 0xA7, 0xC0, 0x89, 0xFC, 0x7A, 0x83, 0x6D,
+ 0xB1, 0xF8, 0xA3, 0x1F, 0xB9, 0x3B, 0xCC, 0x81, 0x32, 0x37, 0x65, 0x46, 0x2D, 0xAF, 0x9A, 0x4E,
+ 0x96, 0x14, 0x3D, 0x57, 0x9C, 0xF1, 0x92, 0xB3, 0x0E, 0x54, 0x4F, 0xF0, 0xA0, 0x70, 0x66, 0x65,
+ 0x36, 0x8D, 0x11, 0xD0, 0xBD, 0xD6, 0xEB, 0x49, 0x76, 0x79, 0xB4, 0xB7, 0x91, 0xAA, 0x21, 0x2D,
+ 0xBA, 0x19, 0x1C, 0xDC, 0x90, 0x16, 0xEC, 0xB7, 0x09, 0xFF, 0x1F, 0xC8, 0xE5, 0x75, 0xDB, 0x42,
+ 0x35, 0x53, 0x07, 0x77, 0x1F, 0x0C, 0xA3, 0x77, 0xD0, 0xCA, 0xDE, 0xC5, 0xB8, 0x15, 0xA6, 0xAB,
+ 0x5E, 0x2B, 0xC9, 0x3A, 0x1B, 0xDC, 0xDB, 0x4F, 0x1C, 0xA7, 0xF7, 0xD7, 0xBF, 0x27, 0x07, 0x0C,
+ 0xF7, 0xFD, 0x64, 0xF1, 0xA1, 0x89, 0x50, 0xE8, 0xA5, 0x94, 0x12, 0xBC, 0x0B, 0x82, 0x3A, 0xDB,
+ 0xE4, 0xCC, 0x8C, 0x61, 0x5D, 0xB6, 0xD0, 0x38, 0xC6, 0xF2, 0xE3, 0xE8, 0x6E, 0xDE, 0xA8, 0x5E,
+ 0x13, 0x05, 0x08, 0x17, 0x1F, 0xE5, 0x04, 0x51, 0x7E, 0xB8, 0x67, 0x55, 0xEA, 0x3F, 0x09, 0x53,
+ 0xE0, 0x02, 0xD4, 0xD7, 0xE5, 0x4B, 0x71, 0x0C, 0x28, 0xF0, 0x84, 0x9A, 0x3C, 0x5E, 0x3D, 0xA2,
+ 0x79, 0xDE, 0x75, 0x8B, 0xCF, 0xA6, 0x69, 0xDC, 0xAB, 0x13, 0x92, 0xFE, 0xDA, 0xEC, 0x89, 0x7C,
+ 0x88, 0x66, 0x94, 0x14, 0xD2, 0xDB, 0xCC, 0x5E, 0x5D, 0x5D, 0xD6, 0x64, 0x85, 0x17, 0x9A, 0x48,
+ 0xD3, 0xCC, 0xD7, 0x4C, 0x43, 0x40, 0x13, 0x56, 0x3C, 0x27, 0x28, 0xDB, 0xDF, 0xF9, 0x7D, 0x10,
+ 0xE5, 0xB4, 0xAB, 0x62, 0x79, 0x08, 0xFA, 0x9E, 0xCE, 0xB2, 0x92, 0x27, 0x05, 0x8F, 0x6C, 0x7B,
+ 0xCD, 0xC6, 0xAD, 0x7A, 0xBD, 0x89, 0x04, 0x21, 0x32, 0x52, 0xF8, 0x5B, 0xB1, 0x53, 0x5C, 0x0B,
+ 0x43, 0x0E, 0xD2, 0x2D, 0x13, 0xC9, 0xFD, 0x33, 0xB7, 0x5D, 0x91, 0xC5, 0xC8, 0x33, 0xB8, 0xDD,
+ 0x29, 0x9D, 0x5D, 0xC4, 0x5A, 0xF9, 0x4A, 0x1A, 0xAF, 0x3F, 0x40, 0x0D, 0x53, 0x64, 0x85, 0x51,
+ 0xC4, 0xCD, 0xA3, 0x2E, 0x68, 0x57, 0xFD, 0x4E, 0xF6, 0x43, 0x8F, 0x7D, 0x2E, 0x3D, 0x44, 0x14,
+ 0xB0, 0xF1, 0xB3, 0x65, 0x95, 0x3E, 0x20, 0xE1, 0x19, 0xCC, 0xFB, 0x54, 0xA7, 0x89, 0x7F, 0xF4,
+ 0xD7, 0x4D, 0x61, 0x00, 0xA0, 0x9C, 0x97, 0x03, 0xA0, 0x0E, 0x95, 0xCD, 0xF4, 0xF5, 0xF9, 0xCA,
+ 0x2E, 0x3F, 0x23, 0x86, 0xFE, 0xCF, 0xAA, 0x70, 0x26, 0x8E, 0x80, 0x7F, 0xBC, 0x71, 0x16, 0x40,
+ 0x92, 0x4D, 0xB3, 0xF7, 0x82, 0x55, 0x60, 0x20, 0xA2, 0x79, 0x88, 0x55, 0x52, 0xD2, 0xD8, 0x62,
+ 0x1B, 0x4B, 0xBD, 0x3D, 0x95, 0x35, 0x3B, 0x90, 0x98, 0xE5, 0x90, 0x83, 0xB9, 0x68, 0xF0, 0xD3,
+ 0xFF, 0x20, 0xB9, 0x19, 0xCB, 0xE1, 0xD6, 0x30, 0x69, 0xDF, 0xEB, 0x59, 0xDF, 0x89, 0x77, 0xD1,
+ 0x49, 0x8C, 0x5A, 0x4E, 0x8D, 0xD9, 0x63, 0xAF, 0xAA, 0x2E, 0xF1, 0x93, 0x9C, 0xAA, 0xB2, 0x7D,
+ 0x6C, 0x2C, 0x69, 0x1E, 0xDA, 0x9C, 0x24, 0xAA, 0x56, 0x66, 0x19, 0x03, 0xBE, 0x21, 0x9D, 0xF4,
+ 0x36, 0x65, 0x5A, 0x02, 0x6B, 0x91, 0x41, 0xF7, 0x07, 0x68, 0x26, 0xEA, 0x33, 0x1A, 0x79, 0x9D,
+ 0xEF, 0x7A, 0xAF, 0x9B, 0x66, 0x8B, 0xA2, 0xA7, 0x8C, 0x17, 0x33, 0xA0, 0x64, 0x2D, 0x3E, 0x84,
+ 0xBC, 0x13, 0x74, 0x52, 0xF9, 0x25, 0x22, 0x67, 0x9A, 0xC3, 0x8C, 0x04, 0x56, 0x66, 0xD6, 0x55,
+ 0xB7, 0xF5, 0x50, 0xDC, 0x22, 0xB6, 0x0D, 0x80, 0x49, 0xD9, 0xC8, 0x48, 0x3C, 0xEB, 0x37, 0x42,
+ 0x9E, 0x2F, 0xE4, 0xD5, 0xA3, 0xD5, 0xBF, 0xD9, 0xBC, 0x3D, 0x99, 0x03, 0xBE, 0x0C, 0x53, 0x18,
+ 0x93, 0x0D, 0xCE, 0x59, 0xB4, 0x08, 0xFA, 0x93, 0x93, 0xAD, 0xEC, 0x24, 0xC1, 0x76, 0x07, 0x06,
+ 0xFB, 0x78, 0x93, 0x40, 0xB0, 0x40, 0x7C, 0xBA, 0x4E, 0xBE, 0x93, 0x04, 0xD5, 0xF6, 0x6D, 0x72,
+ 0x84, 0x09, 0x2D, 0x8A, 0x5C, 0x86, 0xF3, 0xC0, 0x6B, 0x53, 0xE6, 0xDD, 0xA0, 0x34, 0x41, 0x2B,
+ 0x46, 0x7C, 0xE3, 0x76, 0x32, 0xD3, 0x3A, 0x8C, 0x46, 0x9C, 0x98, 0xFF, 0x3D, 0x5F, 0xD5, 0xB0,
+ 0xA1, 0xF2, 0x0A, 0xAE, 0x52, 0x3D, 0xD1, 0x71, 0xBA, 0x5B, 0x09, 0xB4, 0x52, 0x65, 0xE8, 0x15,
+ 0x80, 0xD5, 0x59, 0x68, 0x68, 0xEC, 0x2B, 0x80, 0x72, 0xDA, 0xCB, 0xEB, 0x68, 0xBC, 0x68, 0xD0,
+ 0x19, 0xBC, 0x5E, 0xED, 0x1F, 0x80, 0x8F, 0xD1, 0x76, 0x44, 0x46, 0x6E, 0xD9, 0x78, 0x91, 0xED,
+ 0x71, 0x9B, 0x4A, 0xCF, 0x1B, 0x1D, 0xDE, 0xC2, 0x4A, 0xEC, 0xF1, 0x2E, 0xC0, 0xC3, 0xEA, 0x7E,
+ 0x76, 0x1F, 0x74, 0xCE, 0x9D, 0xF1, 0x6B, 0x94, 0x21, 0x06, 0x00, 0x58, 0x1E, 0x37, 0x6B, 0xFB,
+ 0xB6, 0x45, 0xB4, 0x71, 0x35, 0x74, 0x20, 0x83, 0xA1, 0xD8, 0x3A, 0x1F, 0xA4, 0x17, 0x71, 0xEB,
+ 0x10, 0x93, 0xD0, 0xD7, 0x6C, 0xD2, 0x43, 0xF2, 0xF3, 0x66, 0xC1, 0x55, 0x07, 0x00, 0x54, 0xA1,
+ 0x4A, 0x4E, 0x55, 0xD9, 0x9D, 0x1D, 0xB0, 0x3F, 0x2E, 0x60, 0xF1, 0x5F, 0x30, 0x1E, 0x66, 0xD8,
+ 0xE9, 0xCD, 0x99, 0x0B, 0x72, 0x35, 0x99, 0x55, 0x1E, 0x4A, 0xD7, 0xA3, 0x02, 0x87, 0x27, 0x76,
+ 0x5A, 0x8D, 0xBC, 0x3D, 0xAA, 0xD6, 0xDA, 0xFA, 0x43, 0xE7, 0xD4, 0xCD, 0x92, 0xF0, 0xAB, 0xEB,
+ 0x9F, 0xD2, 0xC8, 0xA4, 0x3A, 0xF6, 0x1F, 0xAE, 0xBC, 0x79, 0xDD, 0xDD, 0x98, 0xE6, 0xA5, 0x11,
+ 0x53, 0x35, 0x24, 0xEE, 0x55, 0xC6, 0x86, 0x17, 0x55, 0x57, 0x8A, 0xCB, 0xAC, 0x9B, 0xA3, 0xBA,
+ 0x25, 0x24, 0xB6, 0x14, 0xC2, 0x42, 0xB2, 0xDE, 0x42, 0x0A, 0x23, 0x58, 0xCE, 0xBF, 0x21, 0x2A,
+ 0xDB, 0xF1, 0xBD, 0x78, 0xD4, 0x18, 0xCC, 0xFE, 0x49, 0xAE, 0x04, 0xD7, 0x94, 0x58, 0x71, 0x6E,
+ 0x8F, 0x3B, 0xE1, 0xBF, 0x6A, 0x9C, 0x73, 0x88, 0x9D, 0xD7, 0xAB, 0x7C, 0xE6, 0xAC, 0x31, 0xFB,
+ 0xB0, 0x80, 0xD7, 0x47, 0x8E, 0x32, 0x81, 0x61, 0xCF, 0xCF, 0x41, 0x2B, 0xA8, 0x84, 0x2D, 0x4F,
+ 0x64, 0x89, 0xC3, 0xC8, 0xEE, 0xFA, 0xF5, 0x6E, 0xB9, 0x62, 0x38, 0xBC, 0xBA, 0xFF, 0x26, 0x75,
+ 0xB4, 0xF3, 0x34, 0xB4, 0x94, 0xD1, 0x31, 0x57, 0x87, 0xDF, 0x93, 0xBC, 0x27, 0xE5, 0x34, 0xEF,
+ 0xF5, 0x50, 0xD1, 0x52, 0x53, 0x36, 0xAD, 0x7F, 0xF1, 0x7A, 0x0C, 0xAB, 0x29, 0x17, 0x0A, 0xD4,
+ 0xD1, 0x18, 0xA0, 0xC5, 0xD9, 0xC9, 0xFB, 0xC6, 0x08, 0x47, 0xD8, 0x2D, 0x8B, 0xA6, 0x06, 0xA0,
+ 0xC1, 0xF3, 0xF4, 0x50, 0x65, 0x0F, 0xF2, 0x1B, 0x04, 0x48, 0x3E, 0x9B, 0xC4, 0x70, 0x6A, 0xCC,
+ 0xE6, 0x7C, 0x6D, 0x1F, 0x3F, 0x3B, 0x5B, 0xBE, 0x87, 0x60, 0x31, 0x09, 0x3F, 0xF6, 0x37, 0xF3,
+ 0xD9, 0xB8, 0x13, 0x20, 0x38, 0x41, 0xF1, 0xF5, 0xE1, 0x2A, 0xDB, 0x33, 0xE4, 0xFA, 0xCE, 0x15,
+ 0xA0, 0x9D, 0x59, 0x2C, 0x05, 0x92, 0xC0, 0x87, 0xBE, 0x3C, 0x21, 0x53, 0xEF, 0xF8, 0x63, 0xB5,
+ 0x7F, 0x67, 0x7A, 0xA3, 0x5E, 0x76, 0x75, 0x79, 0x90, 0x15, 0xA8, 0x8B, 0x06, 0xB4, 0x91, 0x6B,
+ 0xDE, 0x37, 0x0D, 0x31, 0x40, 0xE1, 0x7E, 0xC4, 0x1F, 0x00, 0xDD, 0xBA, 0x62, 0x00, 0xEA, 0x90,
+ 0xE5, 0xF2, 0xEE, 0x71, 0x2E, 0x1C, 0xA3, 0xFA, 0xBA, 0x9C, 0x64, 0xFF, 0x11, 0x07, 0xD2, 0xE7,
+ 0x00, 0xF1, 0x08, 0xAA, 0x8E, 0x1A, 0x55, 0x29, 0xFB, 0xFB, 0x17, 0x11, 0xC7, 0xA3, 0xA0, 0x7D,
+ 0x10, 0x4E, 0x02, 0xFA, 0xBB, 0x12, 0x3D, 0x74, 0xA2, 0x84, 0xE7, 0xBD, 0x78, 0x77, 0x1E, 0x97,
+ 0xC9, 0x33, 0x2B, 0x19, 0x5B, 0x5D, 0xDD, 0xF2, 0xE1, 0xD6, 0xB3, 0x08, 0x0D, 0xE0, 0x56, 0x71,
+ 0x9D, 0xE2, 0x0C, 0xB9, 0x60, 0xC4, 0x0C, 0x90, 0x54, 0x07, 0xDC, 0x03, 0x92, 0xC6, 0x20, 0x38,
+ 0x3D, 0x3D, 0xC5, 0xC9, 0xF6, 0x02, 0x84, 0x7D, 0x84, 0x5C, 0x6A, 0x60, 0xE5, 0xEF, 0xBC, 0x54,
+ 0x71, 0x0C, 0xD3, 0xF7, 0xED, 0x3D, 0x76, 0x0F, 0x19, 0x15, 0x50, 0x53, 0xB4, 0x81, 0x8D, 0x0E,
+ 0xCF, 0xA1, 0x59, 0x8D, 0xEF, 0xF2, 0x29, 0x21, 0xF2, 0x64, 0xCE, 0x9C, 0xE2, 0x96, 0x4A, 0x0C,
+ 0x1B, 0x71, 0x7A, 0x72, 0x45, 0x24, 0x68, 0xC7, 0xD0, 0x6B, 0xD2, 0x3B, 0x5B, 0x16, 0xEC, 0xFE,
+ 0x40, 0x84, 0x72, 0xD7, 0x35, 0x7C, 0xA8, 0x80, 0x8C, 0xBA, 0xDA, 0x56, 0xA3, 0xA9, 0xC1, 0xCC,
+ 0x98, 0x6C, 0x20, 0x42, 0xBB, 0xB7, 0x1B, 0x0C, 0xCF, 0x98, 0x77, 0x71, 0x07, 0x1D, 0xDA, 0x66,
+ 0xA3, 0xD7, 0xE1, 0x2F, 0xB0, 0x70, 0x7B, 0x53, 0xA9, 0x80, 0x76, 0x16, 0x4E, 0xB3, 0x82, 0x0A,
+ 0x33, 0xD0, 0x30, 0x2F, 0x76, 0x89, 0x80, 0x76, 0x25, 0x85, 0xA1, 0x29, 0x97, 0xFA, 0xE3, 0xAE,
+ 0x6E, 0x44, 0xBD, 0xA2, 0x6A, 0xA5, 0xCA, 0x9C, 0x13, 0x7A, 0xAE, 0x51, 0x8D, 0x7C, 0xC8, 0xE1,
+ 0xE6, 0xA8, 0x36, 0x01, 0x34, 0x1D, 0xA6, 0x40, 0x93, 0xF2, 0x2F, 0x7F, 0xCD, 0x29, 0xB5, 0x5B,
+ 0x15, 0xEE, 0x59, 0x63, 0xE6, 0xD7, 0x77, 0xBB, 0x77, 0x0A, 0x25, 0x4D, 0xF3, 0x9D, 0x23, 0x0C,
+ 0xD4, 0x6D, 0xBB, 0x11, 0x96, 0x4E, 0x96, 0x15, 0xDE, 0xFE, 0xE6, 0x1A, 0xD2, 0x10, 0xE2, 0xA4,
+ 0x6B, 0x2F, 0x99, 0xB5, 0xFA, 0xAC, 0xC5, 0xB6, 0x90, 0xFA, 0x6C, 0x90, 0x16, 0x45, 0xB6, 0x93,
+ 0x71, 0x6B, 0x80, 0xE1, 0x9C, 0x65, 0x0D, 0x05, 0x84, 0xB0, 0x1B, 0xAC, 0x4E, 0xAE, 0x6A, 0x42,
+ 0x80, 0xF5, 0xD7, 0xAA, 0x43, 0x93, 0xE1, 0x3E, 0x51, 0x71, 0x5B, 0x6E, 0xA7, 0x9F, 0x56, 0x9A,
+ 0xFC, 0xFD, 0x3B, 0xA5, 0x07, 0x7C, 0xF6, 0x65, 0x22, 0xEA, 0x8E, 0x52, 0xAA, 0x51, 0x5A, 0x41,
+ 0x4A, 0x19, 0x7F, 0x92, 0x18, 0x0C, 0x04, 0x6A, 0xFB, 0x23, 0x30, 0xEC, 0xF5, 0x5B, 0x4E, 0xEA,
+ 0xE8, 0x4D, 0x3D, 0x87, 0xAE, 0xE7, 0x7C, 0x9A, 0x9F, 0xC0, 0xAC, 0xB8, 0x28, 0xC2, 0xC8, 0x9D,
+ 0xB9, 0x45, 0x9E, 0x4C, 0xC6, 0x7F, 0x34, 0x15, 0x2F, 0x58, 0xE5, 0x10, 0x75, 0x5A, 0x44, 0xB2,
+ 0xB6, 0x2B, 0xF5, 0x1D, 0x8F, 0xF7, 0xD8, 0xF5, 0xB2, 0xF5, 0xAA, 0x88, 0x16, 0xD0, 0x26, 0xF4,
+ 0x32, 0xFC, 0x8E, 0x60, 0xE7, 0x41, 0x6F, 0x9A, 0xCA, 0x51, 0x8E, 0x45, 0xF6, 0x39, 0xFF, 0x8C,
+ 0x48, 0x61, 0x40, 0xE1, 0xC9, 0x45, 0x82, 0x04, 0xEF, 0xB2, 0x59, 0x30, 0xA4, 0x2C, 0x62, 0xD9,
+ 0x2D, 0xDD, 0xAB, 0xAD, 0x18, 0x81, 0x19, 0x81, 0xCA, 0xCA, 0x75, 0xB3, 0xD0, 0x37, 0x0F, 0xE9,
+ 0x5D, 0x54, 0x8E, 0x0B, 0xB2, 0x55, 0x2A, 0x98, 0xC0, 0x75, 0x5A, 0xEB, 0x9D, 0x11, 0x3F, 0x20,
+ 0xE2, 0x3E, 0xB0, 0xB7, 0xCA, 0xB1, 0xD8, 0x30, 0x66, 0x4C, 0xBC, 0xEA, 0x8F, 0x76, 0x30, 0xC4,
+ 0x9D, 0x03, 0x21, 0x93, 0xEF, 0x54, 0x06, 0xEC, 0x93, 0xFA, 0x89, 0x48, 0xC7, 0x9C, 0x06, 0x22,
+ 0x77, 0xBD, 0xD1, 0x5E, 0xCF, 0x60, 0xD6, 0xA5, 0x17, 0x9A, 0x75, 0x50, 0xF3, 0x97, 0xD4, 0x8E,
+ 0xE3, 0x17, 0x41, 0xFD, 0xC0, 0x3B, 0xBB, 0x8A, 0xA7, 0x2B, 0x98, 0xF6, 0xBD, 0xE7, 0x14, 0x2D,
+ 0xE9, 0xEF, 0xC9, 0x0B, 0x6E, 0xCC, 0xE3, 0x17, 0xF3, 0xB8, 0xDF, 0x06, 0x3A, 0xE1, 0xB3, 0x58,
+ 0x22, 0x3D, 0xEF, 0xEA, 0xBA, 0xF1, 0x9D, 0x4F, 0xDB, 0xCC, 0x0C, 0xED, 0x57, 0x39, 0x80, 0x3A,
+ 0x3B, 0xBC, 0xEE, 0x29, 0x04, 0x34, 0xA5, 0x08, 0xE9, 0xDF, 0x96, 0xD3, 0x53, 0xC5, 0x4E, 0xF6,
+ 0x38, 0xAD, 0xCA, 0x53, 0x77, 0x59, 0xF1, 0x80, 0x9F, 0xA8, 0xB6, 0xDA, 0x5A, 0x56, 0xAA, 0x84,
+ 0x6C, 0x0E, 0xA8, 0xB2, 0x10, 0x37, 0xC8, 0x6A, 0xD8, 0x4D, 0x78, 0xAE, 0x36, 0xD0, 0xDC, 0xE7,
+ 0x1D, 0x8E, 0x57, 0xAC, 0xDD, 0x15, 0xAB, 0xB5, 0x30, 0x3C, 0xE7, 0xE6, 0x51, 0xD3, 0x26, 0xF6,
+ 0x13, 0x1D, 0xC8, 0xFC, 0x28, 0x83, 0x5E, 0x64, 0xA6, 0xCA, 0xA7, 0x67, 0xE6, 0x34, 0x19, 0x66,
+ 0xC8, 0x07, 0xB6, 0x74, 0xB2, 0x59, 0xAE, 0xDA, 0x36, 0x3F, 0x1F, 0xF6, 0x81, 0xEB, 0xC7, 0xB3,
+ 0x6D, 0x1F, 0x87, 0xA8, 0x90, 0x37, 0xD5, 0x85, 0xC3, 0x17, 0xC5, 0xE5, 0xE8, 0xCE, 0x83, 0xB5,
+ 0x73, 0x49, 0xA7, 0x2B, 0x91, 0x28, 0x2D, 0x2A, 0xC2, 0x22, 0xA7, 0x31, 0x18, 0xA6, 0xA4, 0x8C,
+ 0x45, 0x68, 0xA5, 0x95, 0xA4, 0x91, 0xA3, 0xEE, 0x4E, 0x2D, 0xE7, 0xEB, 0x20, 0x8E, 0xE5, 0xF6,
+ 0x9E, 0x53, 0x15, 0xCE, 0xA9, 0x21, 0x18, 0xE3, 0x9B, 0x75, 0x32, 0x02, 0x3D, 0xFC, 0x2C, 0x9D,
+ 0x85, 0x6A, 0xB2, 0xB9, 0x5D, 0x3A, 0xD1, 0x85, 0xFB, 0xD8, 0xB8, 0x8B, 0x48, 0x09, 0xD3, 0xFD,
+ 0xED, 0x11, 0xAA, 0x90, 0xB5, 0x25, 0xC8, 0xB9, 0xA5, 0x49, 0xE9, 0x1E, 0xD0, 0x43, 0xBA, 0x7A,
+ 0x49, 0xB7, 0xE3, 0x87, 0xBE, 0xE0, 0xF4, 0x83, 0xDA, 0x82, 0x4F, 0x9E, 0xC1, 0x55, 0x57, 0xF2,
+ 0x58, 0x20, 0x63, 0xCF, 0x2C, 0x34, 0x61, 0x6C, 0x15, 0xEF, 0x11, 0xB3, 0x7E, 0xA6, 0x13, 0xD9,
+ 0x2F, 0xD1, 0xAD, 0x61, 0xDE, 0x69, 0xB9, 0x9D, 0x1A, 0x24, 0x72, 0x5D, 0x4E, 0xA0, 0xB4, 0x7E,
+ 0xE9, 0x14, 0x77, 0x4C, 0xD6, 0xAE, 0xF6, 0x35, 0x69, 0x2D, 0x28, 0x98, 0x29, 0x73, 0xDE, 0x1D,
+ 0x3D, 0x10, 0x50, 0x8C, 0x55, 0x3D, 0x27, 0x89, 0x57, 0x1F, 0x7B, 0x62, 0xD9, 0x12, 0xF7, 0x8D,
+ 0xD3, 0x0F, 0x6B, 0x98, 0x6A, 0x64, 0xF7, 0x62, 0xFB, 0x69, 0x6D, 0x14, 0xF1, 0xF5, 0x6D, 0x5E,
+ 0xC1, 0x79, 0x3C, 0x1D, 0xDE, 0x45, 0x95, 0xE4, 0x10, 0x70, 0x68, 0x78, 0x0F, 0x70, 0xBE, 0xAC,
+ 0xFE, 0xD3, 0x6E, 0x5B, 0x9F, 0x7E, 0x2C, 0xD3, 0x0E, 0xC2, 0x6A, 0x96, 0x4D, 0x11, 0xEA, 0x62,
+ 0x6F, 0xAC, 0xAB, 0xE7, 0x8E, 0x0F, 0xC4, 0xFB, 0x23, 0x06, 0x7E, 0x0A, 0x87, 0x8E, 0x8D, 0xA8,
+ 0xE9, 0x90, 0x2D, 0xA2, 0xBF, 0x0B, 0x4C, 0x4C, 0x91, 0xE1, 0x7F, 0x55, 0x7C, 0x01, 0x94, 0xE3,
+ 0xA1, 0x08, 0xA0, 0x52, 0x8A, 0x2B, 0x0F, 0x5D, 0xD5, 0x70, 0x5F, 0x65, 0x1C, 0xB9, 0x9B, 0x0C,
+ 0x2B, 0xD6, 0x8E, 0x95, 0x29, 0x6C, 0x69, 0x63, 0xEA, 0x50, 0xB1, 0x2F, 0xAE, 0x06, 0x14, 0xDD,
+ 0x44, 0x38, 0x59, 0xF4, 0x35, 0xC6, 0x5B, 0xE9, 0xA8, 0x42, 0x10, 0xB1, 0x3C, 0x56, 0x76, 0x33,
+ 0x81, 0x88, 0x9D, 0x5B, 0x71, 0xEB, 0xA8, 0x78, 0xA2, 0xC6, 0x37, 0x3E, 0x75, 0xDB, 0x4F, 0xB5,
+ 0xE6, 0x9E, 0x53, 0x6C, 0x66, 0x65, 0x4C, 0x9F, 0xF7, 0x52, 0x7A, 0x24, 0x5B, 0x1C, 0xD1, 0x6B,
+ 0xFE, 0xD4, 0x05, 0x22, 0x5D, 0x4A, 0x85, 0x88, 0x82, 0xF6, 0xF7, 0x25, 0xF5, 0xED, 0xF0, 0xCC,
+ 0x47, 0xDE, 0x79, 0x9A, 0x88, 0xBE, 0xA1, 0x94, 0xF1, 0x4E, 0x2C, 0xFA, 0x8C, 0xE5, 0xE0, 0x8C,
+ 0xA1, 0x86, 0xFF, 0x2B, 0x0A, 0x84, 0x1C, 0xBB, 0x38, 0x49, 0x94, 0x33, 0xBD, 0xBA, 0xAB, 0x8B,
+ 0x66, 0x6D, 0x2C, 0x08, 0x78, 0x21, 0xB7, 0xDF, 0xAD, 0x17, 0x23, 0xCF, 0x42, 0x4E, 0xBD, 0x4F,
+ 0x1B, 0x50, 0x9A, 0x55, 0x60, 0x1D, 0x1D, 0x52, 0xAC, 0x3A, 0x70, 0x8E, 0x20, 0x4C, 0x74, 0x7F,
+ 0xBE, 0xC1, 0xFB, 0xF7, 0x0E, 0x03, 0x90, 0x36, 0x25, 0x08, 0x10, 0xAD, 0x02, 0xAB, 0x0E, 0xD0,
+ 0x3E, 0xA3, 0xF8, 0x8D, 0x06, 0x73, 0x09, 0x07, 0x81, 0x1B, 0x07, 0x15, 0x56, 0x13, 0xB4, 0x5A,
+ 0xBD, 0x88, 0xB5, 0xA8, 0x64, 0xC2, 0x8C, 0x20, 0xDD, 0xA5, 0xD1, 0x3F, 0x43, 0xEA, 0xD1, 0x64,
+ 0x70, 0x78, 0x66, 0x0F, 0x14, 0xC8, 0x13, 0x30, 0x74, 0xEE, 0x2D, 0x8C, 0xD3, 0x39, 0x3B, 0xDA,
+ 0x21, 0x64, 0x66, 0x0E, 0xC0, 0xC2, 0xCF, 0xF9, 0x27, 0xDD, 0x95, 0xDC, 0xA7, 0x2A, 0x72, 0xE2,
+ 0x2C, 0x60, 0x6F, 0x93, 0x45, 0x36, 0x58, 0x7B, 0xD2, 0x47, 0x88, 0xDF, 0xCD, 0xD7, 0x76, 0xEC,
+ 0xA6, 0x2C, 0xE4, 0x5E, 0xD9, 0x74, 0xBD, 0x06, 0xC7, 0xBD, 0xBB, 0x09, 0x87, 0x97, 0x2E, 0x2B,
+ 0x55, 0x48, 0xC1, 0xCD, 0x58, 0xB0, 0x33, 0x31, 0xD8, 0x19, 0x56, 0x4A, 0x57, 0x33, 0xEA, 0x86,
+ 0xA7, 0x68, 0x2A, 0xBB, 0x15, 0xC9, 0xB5, 0x9C, 0xCE, 0x77, 0x82, 0xD5, 0x56, 0xE2, 0x8C, 0xA0,
+ 0xC3, 0x86, 0x0A, 0x61, 0xE4, 0xF8, 0xF6, 0x1F, 0xA6, 0xE1, 0xD7, 0x96, 0xC9, 0xD7, 0xD7, 0x12,
+ 0xB8, 0x2E, 0xFB, 0x31, 0x8D, 0xFA, 0x13, 0x4C, 0xE7, 0x82, 0x90, 0xBC, 0x41, 0xA5, 0x9B, 0x55,
+ 0x24, 0xF5, 0xCE, 0xA6, 0x3D, 0x24, 0xCF, 0xB1, 0x66, 0xF9, 0x51, 0x2C, 0x86, 0xCD, 0x67, 0x82,
+ 0x3F, 0xA9, 0x29, 0x6B, 0x33, 0x00, 0xD2, 0xBB, 0x75, 0x12, 0xEC, 0x8F, 0x0E, 0x45, 0x2A, 0x5C,
+ 0x2D, 0x79, 0xC8, 0xFD, 0x84, 0xE8, 0x29, 0x61, 0x73, 0xFF, 0x9F, 0xB3, 0x23, 0x9C, 0xD5, 0x56,
+ 0x47, 0x72, 0x71, 0xF3, 0x69, 0xC5, 0xD5, 0x48, 0x6B, 0x12, 0xBF, 0x93, 0xB0, 0x2F, 0x6F, 0x31,
+ 0xF6, 0xCD, 0x53, 0xAB, 0x9F, 0xA3, 0x61, 0x60, 0x09, 0x44, 0x27, 0x18, 0x75, 0x90, 0xFA, 0x72,
+ 0x77, 0xC9, 0xC7, 0xFC, 0x2F, 0x37, 0x9A, 0xC2, 0x94, 0xE9, 0xE0, 0x55, 0x44, 0x15, 0x8A, 0xFC,
+ 0xE2, 0x68, 0x93, 0x69, 0x68, 0x79, 0xC3, 0x49, 0xF7, 0x6B, 0xCA, 0xE3, 0xF4, 0x51, 0xDB, 0x05,
+ 0x66, 0xBF, 0x95, 0x80, 0x9B, 0xEA, 0xED, 0xE7, 0x9A, 0xB6, 0xFF, 0xA1, 0xBB, 0x2D, 0x4B, 0xF9,
+ 0xD1, 0xAC, 0x8C, 0x1B, 0x8A, 0xF5, 0xEE, 0x37, 0xDF, 0xC8, 0xEA, 0x73, 0x23, 0x74, 0xAE, 0xCE,
+ 0x5F, 0x9B, 0x08, 0x3D, 0xD9, 0x40, 0xF2, 0x0B, 0x0D, 0x0D, 0x8D, 0x6D, 0x5C, 0xAB, 0x7B, 0xB3,
+ 0x12, 0x7E, 0xA1, 0xD5, 0xEA, 0xD5, 0xA8, 0x13, 0xF9, 0x71, 0xE2, 0x3A, 0x5B, 0x35, 0x8C, 0x7A,
+ 0x6F, 0x52, 0xB0, 0xB8, 0x0F, 0x78, 0x30, 0xF3, 0xD5, 0x8A, 0x93, 0xF6, 0x24, 0x75, 0xBE, 0x18,
+ 0xB1, 0x81, 0x6A, 0xC3, 0xCC, 0x5B, 0x23, 0x55, 0x9D, 0xEB, 0x5F, 0x25, 0x76, 0x5C, 0xCD, 0x9E,
+ 0x58, 0x12, 0xFD, 0x49, 0xC5, 0x46, 0xD3, 0x5D, 0x45, 0xAD, 0xCD, 0xC1, 0x4A, 0xA2, 0x7B, 0xF7,
+ 0x5D, 0x13, 0x97, 0xCF, 0xB4, 0x94, 0xAA, 0xCD, 0xC9, 0xDC, 0x9C, 0xE4, 0xB1, 0x67, 0xE1, 0x7D,
+ 0x11, 0x64, 0x2E, 0x13, 0x59, 0x70, 0xB9, 0x27, 0x33, 0x77, 0xB7, 0xC1, 0xA6, 0x54, 0xAA, 0x43,
+ 0x94, 0xA1, 0x06, 0xA4, 0xDE, 0x8F, 0x0A, 0x9B, 0xD5, 0x40, 0xBF, 0x7E, 0x69, 0xAA, 0x5C, 0x0A,
+ 0xDC, 0x93, 0xFD, 0x05, 0x04, 0x6F, 0x9D, 0x1F, 0x42, 0x7D, 0x2A, 0x60, 0x77, 0x87, 0xF4, 0x52,
+ 0xAB, 0xC3, 0xD5, 0x88, 0xF5, 0x89, 0xA0, 0xC7, 0x6A, 0x48, 0xB9, 0x75, 0xE5, 0x39, 0x7A, 0x39,
+ 0xC1, 0x25, 0xC6, 0xF8, 0xF6, 0x96, 0x7B, 0x0F, 0x4B, 0xBC, 0x37, 0x46, 0x9D, 0xA7, 0xA5, 0xDD,
+ 0x71, 0x99, 0xDA, 0x12, 0x88, 0x18, 0x80, 0x04, 0xF9, 0x5B, 0xDE, 0x01, 0x2C, 0xA2, 0x97, 0xDF,
+ 0xC9, 0xC3, 0xC8, 0xAB, 0x18, 0x80, 0x3D, 0xDA, 0xD0, 0xD6, 0x9C, 0xDC, 0xE6, 0xA1, 0x08, 0xD8,
+ 0x63, 0xC0, 0x28, 0x6E, 0x61, 0x33, 0x3F, 0x44, 0xD0, 0x8B, 0xB9, 0x4D, 0xB5, 0x99, 0x53, 0xE9,
+ 0x20, 0x02, 0x2F, 0x40, 0xD6, 0x16, 0x32, 0x1E, 0xE7, 0x6D, 0x20, 0xCA, 0x73, 0xC7, 0xCA, 0x3A,
+ 0x3C, 0x0C, 0xFE, 0xBB, 0xE8, 0xB4, 0x5F, 0x85, 0xA6, 0x33, 0x9C, 0x3D, 0x4B, 0xD9, 0x94, 0xAA,
+ 0x5D, 0x23, 0xDE, 0xC7, 0x8F, 0xDE, 0xF3, 0x94, 0x54, 0x56, 0x36, 0x9A, 0x52, 0x18, 0x6A, 0x91,
+ 0x0E, 0x00, 0xD4, 0x2F, 0xBB, 0x2A, 0x2E, 0xEB, 0x11, 0x05, 0xA5, 0xB3, 0xA9, 0x9A, 0xB1, 0x96,
+ 0xAB, 0xBB, 0x5F, 0x55, 0x9F, 0x9E, 0xDB, 0x44, 0x44, 0xE7, 0x19, 0x2F, 0x42, 0xAA, 0x66, 0xA1,
+ 0x8E, 0xFC, 0x4F, 0xD5, 0xBC, 0x6C, 0x70, 0x65, 0x05, 0x4F, 0x0A, 0xD4, 0xD1, 0x11, 0xA8, 0x24,
+ 0x4A, 0xDD, 0x6C, 0x70, 0xA4, 0x62, 0xC6, 0x17, 0xB1, 0x55, 0xF1, 0x2D, 0x7B, 0x3D, 0x8F, 0xF9,
+ 0xB6, 0x86, 0xEF, 0xD7, 0xF2, 0x70, 0x2C, 0xF0, 0x82, 0x3F, 0x2E, 0x05, 0xC6, 0xFE, 0xD6, 0x14,
+ 0xFA, 0x43, 0xCE, 0x3A, 0xD9, 0xC3, 0x18, 0x42, 0xF8, 0xE3, 0x92, 0x59, 0x90, 0x5C, 0xE1, 0xBE,
+ 0x30, 0x36, 0xEF, 0x15, 0x9E, 0xFB, 0x1F, 0xD0, 0x82, 0xCF, 0x34, 0xB8, 0x44, 0xF3, 0x6C, 0x98,
+ 0x13, 0x9A, 0x25, 0xEC, 0xD7, 0x8C, 0x1B, 0x7D, 0x92, 0x91, 0xBB, 0x39, 0xD9, 0x5C, 0x76, 0xBA,
+ 0x5D, 0x8B, 0xA3, 0xF3, 0x48, 0x72, 0x7D, 0xAE, 0x6E, 0x2B, 0x41, 0x6D, 0xCA, 0xDC, 0xBA, 0xD4,
+ 0x01, 0x47, 0x5E, 0x92, 0xDA, 0x8F, 0x06, 0xAF, 0xB5, 0x76, 0xDE, 0xA2, 0xC0, 0x64, 0x1A, 0xB3,
+ 0x5F, 0xA1, 0x16, 0xCF, 0x77, 0x48, 0x1E, 0x5C, 0x7F, 0xCD, 0x03, 0xA1, 0x2F, 0x83, 0x8C, 0x1B,
+ 0x6B, 0xFD, 0x9B, 0x67, 0x32, 0x7E, 0xBE, 0x9E, 0xE0, 0x82, 0x75, 0x7E, 0xAC, 0xD7, 0x3F, 0x26,
+ 0x53, 0xB8, 0x83, 0x15, 0x16, 0x49, 0x70, 0x01, 0x6F, 0x22, 0x3D, 0x9B, 0x56, 0x61, 0x96, 0x59,
+ 0x05, 0x98, 0x0F, 0xA5, 0x76, 0x26, 0x5D, 0xFE, 0x92, 0x0E, 0xF4, 0xAC, 0x73, 0x40, 0xEF, 0xEB,
+ 0x56, 0x14, 0xCD, 0x8D, 0x94, 0x8E, 0x34, 0xBF, 0x5B, 0xA0, 0xD0, 0xE3, 0xBA, 0xF3, 0x1F, 0x0D,
+ 0x40, 0xD0, 0xE4, 0x53, 0x00, 0xCB, 0x30, 0x4A, 0x8C, 0xA2, 0x95, 0xCC, 0xB0, 0x36, 0xE3, 0x51,
+ 0x19, 0x00, 0xBE, 0x86, 0x91, 0x7F, 0x15, 0x1B, 0xF1, 0x9D, 0x37, 0x9C, 0x24, 0xCB, 0x7F, 0xFB,
+ 0x96, 0x22, 0x49, 0xC0, 0x5F, 0x12, 0xE8, 0x97, 0x00, 0xCB, 0x09, 0x2B, 0x10, 0x82, 0x88, 0xEA,
+ 0x83, 0x79, 0x50, 0xA5, 0x78, 0x40, 0x61, 0xD3, 0xB7, 0x28, 0x55, 0xC9, 0x16, 0xFA, 0x31, 0xA0,
+ 0x38, 0xCE, 0x89, 0x36, 0xA3, 0x75, 0xC0, 0x13, 0xF0, 0xB1, 0xD9, 0x0B, 0x83, 0x92, 0x84, 0xEC,
+ 0xF8, 0x42, 0x26, 0xF8, 0xA1, 0xDE, 0x4F, 0xC1, 0xE9, 0x22, 0x74, 0xA1, 0x11, 0x93, 0x3F, 0x98,
+ 0x5C, 0x7D, 0x84, 0xC1, 0x66, 0xD0, 0xDC, 0x7E, 0x5A, 0x9B, 0xF1, 0xBD, 0x46, 0xBA, 0x2B, 0xD9,
+ 0xCA, 0x80, 0xDA, 0x3D, 0x04, 0xE1, 0xBE, 0x74, 0x1F, 0x83, 0x6C, 0xD1, 0x1C, 0xC5, 0x6F, 0x1D,
+ 0x1E, 0xF3, 0x29, 0x93, 0x12, 0xFB, 0x19, 0xCF, 0xB7, 0xA0, 0xF6, 0x21, 0x24, 0x5E, 0x1D, 0xD9,
+ 0x1C, 0x66, 0x21, 0xE9, 0xC8, 0x54, 0xDB, 0x5B, 0x81, 0x4B, 0xDB, 0xE0, 0x36, 0x88, 0xC5, 0x5F,
+ 0x0B, 0xA2, 0xBD, 0x8D, 0x6B, 0x14, 0x46, 0xA0, 0xE0, 0x37, 0x1D, 0x11, 0xB0, 0x15, 0x53, 0xF5,
+ 0xBF, 0xF8, 0x0F, 0x6E, 0xCB, 0x42, 0xE2, 0xFC, 0xE5, 0xBB, 0xFB, 0x8F, 0x98, 0x23, 0x21, 0xC2,
+ 0x69, 0x6D, 0x13, 0x2A, 0x55, 0xEF, 0x32, 0xBF, 0x9E, 0xC3, 0x74, 0x55, 0x0D, 0xA3, 0xF8, 0x56,
+ 0xC0, 0xE1, 0x25, 0x91, 0x78, 0x79, 0x6D, 0xEA, 0xEB, 0xCF, 0x48, 0x82, 0xB0, 0xEB, 0x44, 0x0C,
+ 0xB6, 0xF6, 0x21, 0x9D, 0xD2, 0xF4, 0x67, 0xC1, 0x93, 0x55, 0x48, 0x35, 0xB3, 0xE0, 0x62, 0x86,
+ 0x9C, 0x5C, 0xF1, 0x4C, 0xB5, 0x2A, 0xAF, 0x3D, 0x42, 0xFD, 0x6F, 0x95, 0x4F, 0x00, 0xE9, 0x42,
+ 0x20, 0x6E, 0x8B, 0x51, 0xFF, 0xD4, 0xD8, 0xCE, 0x76, 0xE4, 0xE8, 0x9F, 0x2B, 0x0E, 0x47, 0x12,
+ 0xC4, 0xEF, 0xAB, 0x91, 0xCF, 0x37, 0x4F, 0x52, 0x29, 0x75, 0xC3, 0xC0, 0xB8, 0xF4, 0x04, 0x9E,
+ 0xA9, 0x86, 0x6B, 0x93, 0x21, 0x7A, 0x11, 0x26, 0x33, 0xC0, 0x0A, 0x7B, 0xED, 0x0F, 0x2B, 0x9F,
+ 0x91, 0xE3, 0x19, 0x47, 0xD8, 0xD8, 0x0D, 0xCB, 0x6D, 0xC0, 0xAC, 0xEB, 0xEB, 0x59, 0xA6, 0x44,
+ 0x56, 0xE3, 0x95, 0xB6, 0x2A, 0xBA, 0xBC, 0x65, 0x5B, 0x0C, 0x9E, 0x04, 0xDE, 0x65, 0x8E, 0x29,
+ 0x73, 0x18, 0x0B, 0xC7, 0xA3, 0x76, 0x43, 0xD4, 0x07, 0xF0, 0x3B, 0x09, 0xCC, 0xF7, 0x10, 0x57,
+ 0x9C, 0x05, 0x2A, 0xC5, 0x8C, 0x53, 0xE3, 0xA9, 0xA6, 0x20, 0x0B, 0x71, 0xAF, 0x4B, 0x95, 0x8F,
+ 0xB1, 0xA6, 0x96, 0xDC, 0xFC, 0x85, 0xC5, 0x94, 0xBF, 0x86, 0xA6, 0x88, 0xC9, 0xEB, 0x04, 0x2A,
+ 0x3B, 0xF8, 0x17, 0x07, 0x7D, 0x0F, 0x89, 0x44, 0x3D, 0x97, 0xA1, 0x8A, 0x4E, 0x2E, 0x8F, 0x9C,
+ 0xB8, 0x6C, 0xA0, 0x50, 0x5D, 0xC4, 0x22, 0xDF, 0xF0, 0x5A, 0xD2, 0xF4, 0x3F, 0x20, 0xFD, 0xAA,
+ 0x6E, 0x04, 0xF3, 0xFA, 0x2E, 0x5D, 0x6F, 0x6B, 0x2A, 0xE9, 0x77, 0x16, 0x65, 0xB7, 0x1B, 0xDC,
+ 0x8F, 0x58, 0x2F, 0x32, 0x9D, 0x57, 0xB7, 0x64, 0xD0, 0x77, 0x6E, 0xE7, 0x03, 0x39, 0xB0, 0xDF,
+ 0x19, 0x97, 0x29, 0xCA, 0xFE, 0xFC, 0xB6, 0x21, 0xD0, 0x2C, 0x07, 0x36, 0x1D, 0x72, 0x07, 0x9B,
+ 0xEB, 0xED, 0x1B, 0xB9, 0xD3, 0x87, 0xF8, 0x33, 0x94, 0x42, 0xAF, 0x91, 0x7C, 0x43, 0x91, 0xAF,
+ 0x33, 0x22, 0x5E, 0x48, 0xE6, 0x73, 0xF6, 0xB6, 0x00, 0xAC, 0x29, 0x88, 0xCB, 0x45, 0x31, 0x3D,
+ 0xF8, 0x24, 0x98, 0x3F, 0xD9, 0x21, 0xAA, 0x6D, 0xCA, 0x49, 0x53, 0xC5, 0x20, 0x48, 0xA7, 0xCE,
+ 0x5B, 0x9C, 0x23, 0x54, 0x51, 0xFC, 0xB6, 0x7A, 0x61, 0x4E, 0xDE, 0xE2, 0x82, 0xE8, 0xE0, 0xEC,
+ 0xE3, 0x65, 0xA6, 0xB5, 0x5E, 0x0F, 0x5A, 0xDC, 0xB2, 0x9D, 0x4B, 0x5D, 0x35, 0x71, 0xDB, 0x9F,
+ 0x9D, 0x5F, 0xB6, 0x56, 0x17, 0x02, 0x69, 0x65, 0x1C, 0x5E, 0xC2, 0x81, 0x0D, 0x5D, 0x4A, 0x0F,
+ 0x25, 0x89, 0x60, 0x06, 0xEB, 0xEB, 0x1C, 0x8D, 0x8C, 0x2F, 0xBD, 0xD2, 0x68, 0xB6, 0xE5, 0x86,
+ 0xCA, 0xEC, 0x85, 0x3F, 0x69, 0x90, 0x45, 0xC3, 0x70, 0x57, 0x72, 0x3E, 0xCD, 0xAA, 0xAE, 0xA2,
+ 0x46, 0xEE, 0x70, 0xBE, 0x30, 0xEC, 0x6F, 0xA5, 0xC2, 0xCD, 0x5B, 0x1C, 0x9A, 0x4D, 0xAA, 0x23,
+ 0xE4, 0xC7, 0x4F, 0x9B, 0xF2, 0x19, 0x67, 0x14, 0x32, 0x66, 0xD8, 0xF2, 0x0D, 0xD6, 0x62, 0xEC,
+ 0x95, 0xF5, 0x50, 0xF3, 0x98, 0x75, 0xFA, 0xE2, 0xCA, 0x5D, 0x3F, 0x28, 0x7D, 0xD0, 0xE2, 0x34,
+ 0x40, 0x7B, 0xB5, 0x07, 0x1F, 0x52, 0xEF, 0x2C, 0x3D, 0xAB, 0x3A, 0x72, 0x45, 0xC5, 0x47, 0x83,
+ 0xFA, 0x5C, 0xE3, 0x66, 0x77, 0x4F, 0x89, 0x7C, 0xFE, 0x9C, 0xDB, 0x4E, 0xA4, 0xB9, 0xE6, 0xE8,
+ 0x78, 0x50, 0x43, 0x20, 0x8B, 0x8C, 0x78, 0x27, 0x88, 0x9A, 0x40, 0x89, 0x36, 0x4B, 0x08, 0x2E,
+ 0xC2, 0x60, 0x51, 0x9C, 0xE8, 0x96, 0x93, 0x8B, 0x69, 0xF7, 0x2A, 0x7E, 0x9E, 0xF7, 0x4C, 0xFC,
+ 0xD2, 0xF5, 0x97, 0xC2, 0x49, 0x9D, 0x1B, 0xB0, 0xAA, 0x61, 0x50, 0xD9, 0x06, 0xE7, 0x9E, 0x61,
+ 0x06, 0xB7, 0xD6, 0xDE, 0x64, 0x2A, 0x9D, 0x1E, 0xF3, 0xFB, 0xD4, 0xC1, 0x49, 0x13, 0x4C, 0xC8,
+ 0x1C, 0x84, 0x0C, 0xD9, 0xF8, 0x70, 0x7A, 0x57, 0x7B, 0xE5, 0xAA, 0xD7, 0x0C, 0xD8, 0x90, 0xBB,
+ 0x10, 0x7D, 0x68, 0x76, 0xD9, 0x70, 0xBE, 0x89, 0x75, 0xF9, 0xE6, 0x67, 0x06, 0x1E, 0x43, 0xAF,
+ 0x44, 0xB0, 0x0C, 0xC8, 0x69, 0x9B, 0x07, 0x42, 0xAF, 0xB2, 0x87, 0xCE, 0x39, 0xC6, 0xFE, 0xCF,
+ 0xF9, 0x3F, 0xD0, 0xB6, 0xC5, 0x3C, 0xC4, 0xC9, 0x15, 0x04, 0xA7, 0x4B, 0xB2, 0xC2, 0x1F, 0x52,
+ 0x08, 0x5E, 0xBB, 0x1C, 0x87, 0x0C, 0xF3, 0xF2, 0x3D, 0xE2, 0xC3, 0xEC, 0xFD, 0xA6, 0x99, 0x6B,
+ 0x6D, 0x2F, 0xC6, 0xE0, 0x24, 0xE5, 0xCD, 0xF5, 0x0C, 0x43, 0xDD, 0xDA, 0x85, 0xEF, 0xDD, 0x47,
+ 0xDD, 0xB0, 0xE5, 0x56, 0x8E, 0xC7, 0x3E, 0x20, 0x29, 0x0F, 0x36, 0x6C, 0x5C, 0x39, 0x9C, 0x60,
+ 0x9B, 0x42, 0xDE, 0x40, 0x6E, 0xC0, 0x27, 0x76, 0x68, 0x5C, 0x35, 0xE5, 0x57, 0x1E, 0x27, 0x38,
+ 0x3C, 0x59, 0x17, 0x3E, 0xC1, 0x77, 0x06, 0x45, 0xBD, 0x5E, 0xFD, 0x13, 0x72, 0x2E, 0xCD, 0x62,
+ 0x28, 0x63, 0xAF, 0x61, 0x26, 0x67, 0x07, 0x0F, 0xC3, 0xFE, 0xBB, 0x99, 0x17, 0x6F, 0xBB, 0x82,
+ 0xCC, 0x6E, 0x99, 0xF1, 0x70, 0xAD, 0x4B, 0x78, 0x1C, 0x44, 0x78, 0x36, 0x05, 0x01, 0x38, 0x1E,
+ 0x8E, 0xB1, 0xCE, 0x2F, 0xD2, 0x9F, 0x09, 0x4F, 0x01, 0xB1, 0x12, 0xDD, 0x8E, 0x94, 0x51, 0x43,
+ 0xCD, 0x48, 0xE4, 0x62, 0x71, 0xA5, 0x64, 0xDD, 0xB5, 0x25, 0x2B, 0x67, 0x97, 0x17, 0xC8, 0xE5,
+ 0xD1, 0x52, 0x0E, 0x2E, 0xD1, 0x7D, 0xA1, 0x0C, 0x2E, 0x16, 0x91, 0xC2, 0x5D, 0xE0, 0x16, 0x41,
+ 0x91, 0xA9, 0x27, 0x84, 0x36, 0x1C, 0xC2, 0xAC, 0x10, 0x69, 0x1E, 0x5E, 0x83, 0xE4, 0xA2, 0x9B,
+ 0xEE, 0x4F, 0xAE, 0xE5, 0xAF, 0x83, 0x6C, 0xD7, 0xF8, 0x24, 0x41, 0x33, 0x2B, 0x02, 0xD8, 0xBE,
+ 0x77, 0x8D, 0xC4, 0x86, 0xBA, 0x2F, 0xE6, 0x0F, 0x46, 0xE8, 0x83, 0x38, 0x8E, 0x17, 0x02, 0x98,
+ 0xF7, 0x3B, 0xA0, 0x0C, 0xDD, 0x34, 0x25, 0x0C, 0x19, 0x94, 0x18, 0xF9, 0xA7, 0xCD, 0x33, 0xED,
+ 0xD1, 0xA9, 0x8B, 0xB7, 0xEF, 0x6B, 0xF0, 0x1D, 0x71, 0x22, 0x6D, 0xC5, 0x5B, 0xF0, 0xCA, 0x08,
+ 0xE0, 0xBE, 0x75, 0x76, 0x5E, 0x50, 0x68, 0xA3, 0xC1, 0x39, 0x08, 0x18, 0x85, 0xA8, 0xC6, 0xDE,
+ 0x50, 0x0E, 0xF0, 0x38, 0x8B, 0xA9, 0x16, 0xFB, 0x2D, 0x69, 0x16, 0xA2, 0x55, 0x3D, 0x48, 0x82,
+ 0xD3, 0x14, 0xCA, 0x76, 0x26, 0xA3, 0x61, 0x56, 0xC1, 0x0E, 0xF7, 0xAE, 0x61, 0xC4, 0xEC, 0xB8,
+ 0x1D, 0x7C, 0x8E, 0x4A, 0x9F, 0xC4, 0x62, 0xB8, 0x5A, 0x42, 0x5E, 0xA9, 0x5E, 0x20, 0x06, 0x66,
+ 0xBD, 0x53, 0x49, 0x84, 0x8C, 0xE7, 0xA4, 0xB3, 0xF8, 0x25, 0xA3, 0xF8, 0x49, 0x8B, 0x8F, 0x66,
+ 0xEF, 0xC9, 0xBF, 0x88, 0x5A, 0xE9, 0x22, 0xDD, 0x38, 0xEE, 0xED, 0x7B, 0xB7, 0x0C, 0x0A, 0xEC,
+ 0x26, 0x72, 0x5A, 0xE8, 0xAF, 0x62, 0xAE, 0x01, 0xFA, 0xA0, 0x91, 0x52, 0x55, 0x49, 0x09, 0x5A,
+ 0x4E, 0xC4, 0xB4, 0x78, 0x8C, 0xAE, 0x4F, 0xED, 0x32, 0x88, 0x55, 0xE1, 0x40, 0xDA, 0x77, 0x1A,
+ 0x17, 0x00, 0x9C, 0x14, 0xB9, 0x52, 0x94, 0xB3, 0x02, 0x91, 0x03, 0x90, 0xF4, 0xF1, 0x4C, 0x52,
+ 0x6C, 0x52, 0x39, 0xC5, 0x92, 0xCE, 0x91, 0x42, 0x27, 0xAE, 0x16, 0x44, 0xCF, 0xE4, 0xB8, 0x51,
+ 0x39, 0x03, 0xC0, 0xEE, 0xCE, 0xAB, 0x9F, 0x76, 0x75, 0x53, 0xCD, 0x5E, 0x88, 0x54, 0x9F, 0x61,
+ 0x70, 0xFA, 0xDD, 0x36, 0xFA, 0x37, 0x35, 0x6D, 0xF4, 0x0F, 0x29, 0xC2, 0x22, 0x40, 0x7B, 0x86,
+ 0x7E, 0xCE, 0x9A, 0xED, 0x1A, 0xDC, 0x49, 0xDE, 0x7A, 0xCD, 0xCB, 0x0F, 0xAB, 0xFC, 0x97, 0xC8,
+ 0x8B, 0x3A, 0x0A, 0xAB, 0x23, 0x6D, 0xFC, 0xE9, 0xC4, 0x30, 0x46, 0x30, 0x82, 0x14, 0xFB, 0xBA,
+ 0x77, 0x6F, 0x16, 0x32, 0xD7, 0xE8, 0xAA, 0x79, 0x3D, 0x0B, 0x91, 0x11, 0x45, 0x57, 0x05, 0x79,
+ 0x99, 0x12, 0x55, 0x36, 0x5B, 0x06, 0xCA, 0xAA, 0x82, 0x51, 0x84, 0x8B, 0x20, 0xE9, 0x6A, 0x3A,
+ 0x17, 0x30, 0x30, 0xFD, 0x99, 0xEC, 0xBD, 0x54, 0xCC, 0x3A, 0xC0, 0xFF, 0x5C, 0x49, 0xE0, 0x6C,
+ 0x99, 0x0F, 0x48, 0xCD, 0x70, 0x62, 0x7B, 0x69, 0x92, 0x34, 0x2D, 0x44, 0x63, 0x23, 0x9E, 0x1F,
+ 0x17, 0x7B, 0x2A, 0xF5, 0x06, 0x02, 0x24, 0x21, 0x51, 0x2E, 0x02, 0x2D, 0x23, 0x51, 0x7C, 0x8E,
+ 0xD3, 0x32, 0xE2, 0x28, 0x3B, 0x6B, 0x0E, 0x5B, 0x4B, 0xD5, 0x2B, 0x38, 0x1E, 0x5C, 0xC9, 0x31,
+ 0x88, 0x85, 0xB9, 0xD3, 0x6F, 0x37, 0xAF, 0x93, 0x80, 0xD6, 0x19, 0x31, 0x9A, 0x98, 0x45, 0xF9,
+ 0x74, 0x30, 0x99, 0x56, 0x29, 0xF3, 0xFA, 0x33, 0x6A, 0xBB, 0x70, 0x58, 0x53, 0x0E, 0x17, 0x27,
+ 0xDD, 0x3D, 0xE8, 0x07, 0x85, 0x2A, 0xCB, 0x33, 0x60, 0x23, 0xB0, 0xE9, 0x60, 0x7C, 0xF1, 0x47,
+ 0x69, 0xE1, 0x69, 0x57, 0x3E, 0x8C, 0x49, 0x30, 0xA3, 0x7A, 0xD6, 0x79, 0x1F, 0xF9, 0xCF, 0x1C,
+ 0xE1, 0x56, 0xF1, 0x92, 0xC0, 0x66, 0xC7, 0x67, 0xF0, 0xC6, 0x78, 0x6A, 0x48, 0x26, 0xD4, 0xE9,
+ 0xFA, 0x50, 0x8B, 0xC4, 0xB1, 0x19, 0x96, 0x1F, 0x0C, 0x67, 0x0A, 0xB0, 0x4B, 0x75, 0x1C, 0xBA,
+ 0x86, 0x42, 0xE3, 0x2E, 0x0C, 0xF8, 0xFC, 0x19, 0x66, 0x7B, 0x51, 0xDB, 0x3E, 0xBB, 0xA2, 0xC0,
+ 0xBF, 0x31, 0x9A, 0x8A, 0x3E, 0x4F, 0x24, 0xA0, 0xD3, 0xDA, 0x15, 0x35, 0x91, 0x10, 0x3F, 0x1B,
+ 0x40, 0x9A, 0x79, 0xB7, 0xE4, 0x8B, 0x9E, 0xBB, 0xD8, 0x98, 0x31, 0x8C, 0x69, 0xDE, 0x25, 0xFD,
+ 0x0E, 0x87, 0xC3, 0xD9, 0x8C, 0xAD, 0xC0, 0x95, 0x19, 0x15, 0x18, 0xE1, 0xBD, 0xB1, 0x4F, 0xD4,
+ 0x94, 0x09, 0x3B, 0xD5, 0x07, 0xC1, 0x72, 0xEE, 0x33, 0xA2, 0x9E, 0xAA, 0x05, 0x4E, 0xD3, 0xD3,
+ 0x43, 0x43, 0xB9, 0xE6, 0xBE, 0xCF, 0xE8, 0xE4, 0x00, 0x11, 0x5D, 0xA2, 0x97, 0xAE, 0x1F, 0x3C,
+ 0x3C, 0x0F, 0xA5, 0x06, 0xE5, 0xF8, 0xDE, 0x94, 0x00, 0xA0, 0x99, 0xD2, 0x4C, 0x13, 0x05, 0x09,
+ 0xB8, 0x08, 0x61, 0x3A, 0x67, 0xBB, 0x77, 0xA8, 0x69, 0xA3, 0x8F, 0xF4, 0xF2, 0x2A, 0x6A, 0x88,
+ 0x9E, 0xFD, 0x81, 0xF1, 0x7B, 0xA7, 0xFA, 0x15, 0xCF, 0x32, 0x04, 0x22, 0xD3, 0x62, 0x4C, 0xF4,
+ 0x65, 0x76, 0x5C, 0x85, 0x5E, 0x98, 0x18, 0x6A, 0xF8, 0x95, 0xC1, 0x2A, 0x8E, 0xFF, 0xCD, 0x48,
+ 0x8E, 0x58, 0xE6, 0xCA, 0x8A, 0x8E, 0xA2, 0x0D, 0x33, 0x35, 0xA0, 0xD3, 0xC6, 0x28, 0x72, 0x63,
+ 0xB4, 0xCB, 0x0A, 0xB1, 0x47, 0xF8, 0xFC, 0xF1, 0xC3, 0x7A, 0xAD, 0x56, 0x51, 0x4D, 0xE5, 0x53,
+ 0xB1, 0x3F, 0xC4, 0x2C, 0x7E, 0x93, 0xEB, 0x71, 0x91, 0x06, 0x7C, 0xC7, 0x4E, 0x1F, 0xC0, 0x3C,
+ 0x70, 0x7C, 0x54, 0x7A, 0xA7, 0x46, 0x92, 0x33, 0x3C, 0x99, 0x32, 0x07, 0xAE, 0x7F, 0xD9, 0xF0,
+ 0xEE, 0x4E, 0x26, 0xEE, 0xD7, 0x67, 0xCD, 0xE6, 0x47, 0xD1, 0x1C, 0x17, 0x71, 0x68, 0xAA, 0x07,
+ 0xA4, 0xF4, 0xD0, 0x87, 0xA3, 0x65, 0x2D, 0xA8, 0x3A, 0x06, 0x7B, 0x23, 0x6C, 0xA7, 0xD3, 0x4B,
+ 0xE3, 0x46, 0x6C, 0x31, 0x5B, 0x4F, 0x8F, 0xBF, 0xEB, 0x17, 0x68, 0x05, 0xF3, 0x3D, 0xD9, 0xA1,
+ 0x7B, 0x05, 0x7E, 0x05, 0x14, 0xEF, 0x00, 0xE2, 0xF6, 0xD3, 0xF1, 0x4C, 0x60, 0xC9, 0x71, 0xBD,
+ 0x8B, 0x47, 0x84, 0x24, 0x99, 0x94, 0x99, 0x03, 0xB7, 0xE7, 0x1E, 0x8A, 0x56, 0xE0, 0xCB, 0xD8,
+ 0x12, 0x73, 0x08, 0x3D, 0x31, 0xCF, 0xE2, 0x46, 0xBF, 0x16, 0x62, 0x13, 0xA3, 0x3B, 0x62, 0x2A,
+ 0x6C, 0xF4, 0x77, 0x90, 0x04, 0x7A, 0x95, 0x2C, 0x61, 0xD0, 0xA4, 0x84, 0x3F, 0x32, 0x48, 0xBA,
+ 0xE5, 0xCD, 0x39, 0xF5, 0x5D, 0x5A, 0x3E, 0x0A, 0x4C, 0xBF, 0x0A, 0xEC, 0xCF, 0x0B, 0xF2, 0xEA,
+ 0x38, 0x17, 0x36, 0xDB, 0xD6, 0x2D, 0x48, 0x78, 0xBB, 0x20, 0x5F, 0x5F, 0xDF, 0x63, 0x6D, 0xF5,
+ 0x3D, 0x74, 0xA8, 0xE1, 0xE4, 0x4C, 0x87, 0x65, 0x78, 0x1B, 0x5B, 0xC6, 0xEE, 0x37, 0x69, 0x39,
+ 0x8C, 0xD6, 0x3C, 0x24, 0x6B, 0xFE, 0x4A, 0xC9, 0x13, 0xF8, 0x33, 0x2C, 0xDB, 0xA3, 0x7A, 0xE3,
+ 0x6C, 0x76, 0x18, 0x01, 0x62, 0x95, 0x67, 0x4A, 0xB5, 0xE7, 0xF4, 0xD7, 0x63, 0x74, 0x2F, 0xE0,
+ 0x57, 0x3B, 0x3C, 0x33, 0xC6, 0x06, 0x03, 0xD7, 0x93, 0x0F, 0x8D, 0xDD, 0x57, 0xC3, 0x0C, 0x50,
+ 0xBC, 0x08, 0xF6, 0x98, 0xA1, 0x04, 0x1D, 0xC8, 0x46, 0x02, 0x2E, 0x2D, 0x3D, 0xF1, 0xCD, 0x4B,
+ 0x9B, 0x3F, 0x0C, 0xBC, 0xD3, 0x2F, 0x87, 0xE7, 0x50, 0xA1, 0x7B, 0x94, 0xC5, 0xCD, 0xEC, 0xE9,
+ 0x29, 0xE7, 0x6C, 0xD4, 0xC1, 0x18, 0xA4, 0xCA, 0x4F, 0x00, 0x4E, 0xF9, 0x36, 0x89, 0xFD, 0x07,
+ 0x47, 0xE6, 0xD5, 0xB7, 0xAA, 0x34, 0x7C, 0x16, 0x7B, 0xCB, 0x49, 0x92, 0xF2, 0x03, 0x66, 0x8E,
+ 0xEF, 0x11, 0xFC, 0x8F, 0x26, 0xA5, 0x78, 0x9A, 0x4B, 0x29, 0xC7, 0x98, 0x15, 0xA1, 0x35, 0x58,
+ 0x0C, 0xD5, 0xF8, 0x6F, 0x50, 0x1C, 0xDC, 0x41, 0x20, 0xCC, 0x2A, 0x42, 0xE1, 0xEF, 0x28, 0x22,
+ 0x67, 0x89, 0x71, 0x5B, 0x9B, 0xBA, 0x92, 0xED, 0x1C, 0xB6, 0x9C, 0x89, 0xD4, 0x00, 0x21, 0xD3,
+ 0xF1, 0xD9, 0x3E, 0x9B, 0x55, 0x71, 0xF7, 0x75, 0x26, 0x5A, 0x13, 0x65, 0xBF, 0x6E, 0x46, 0x90,
+ 0x85, 0x7B, 0xD7, 0xD4, 0xDC, 0x90, 0x23, 0x4C, 0x83, 0x12, 0x87, 0x7D, 0x8D, 0xF2, 0x39, 0x4E,
+ 0x9A, 0xA0, 0x4A, 0xDE, 0xAB, 0xCA, 0xA7, 0xCB, 0xBD, 0x1A, 0xA5, 0x3F, 0x54, 0x12, 0x92, 0x6F,
+ 0xEF, 0x37, 0x88, 0xDD, 0x52, 0xDB, 0xD0, 0x8F, 0xEA, 0xCD, 0x88, 0x69, 0x8C, 0x44, 0x6A, 0xF3,
+ 0xD0, 0x61, 0x8B, 0x20, 0x91, 0x17, 0x32, 0x32, 0xBE, 0x39, 0x42, 0xE7, 0x1C, 0x3E, 0x8A, 0x02,
+ 0x58, 0x95, 0x76, 0x45, 0x3A, 0x06, 0x28, 0xE0, 0x7A, 0x47, 0x23, 0x87, 0xB1, 0x5F, 0xF0, 0xE1,
+ 0x2D, 0x18, 0xA4, 0x9B, 0xE7, 0x90, 0xB3, 0xFC, 0x96, 0x2D, 0xAA, 0x04, 0x72, 0x39, 0xCA, 0xF6,
+ 0x8B, 0xFE, 0x5D, 0xF8, 0xAA, 0xFF, 0xBE, 0x94, 0xE3, 0xEF, 0xF2, 0x74, 0x22, 0xD4, 0x8C, 0x82,
+ 0x2C, 0x73, 0x8B, 0xB8, 0x39, 0x35, 0xCF, 0xCB, 0x48, 0xE8, 0xAC, 0x05, 0x49, 0xEE, 0x08, 0x30,
+ 0xFF, 0x99, 0x48, 0xE1, 0x66, 0xDD, 0x01, 0xD9, 0x39, 0x22, 0xDE, 0x2C, 0x1C, 0x47, 0x08, 0xA3,
+ 0x97, 0xFE, 0x02, 0x8C, 0x6B, 0x9E, 0xBF, 0xC4, 0x46, 0xAB, 0x94, 0x6D, 0x86, 0xC2, 0x45, 0x95,
+ 0xB9, 0x1D, 0x15, 0x89, 0xA9, 0x76, 0x7A, 0xDD, 0x11, 0xDC, 0x54, 0x4E, 0x37, 0x96, 0x1E, 0x37,
+ 0xE2, 0xB4, 0xE0, 0xD8, 0xB6, 0xBC, 0xF8, 0xA4, 0x47, 0xC5, 0x6E, 0x33, 0x8F, 0xC2, 0x5C, 0x3B,
+ 0x8E, 0x51, 0x01, 0x10, 0xF1, 0x08, 0x10, 0xD8, 0x47, 0x38, 0xF4, 0x28, 0x22, 0x0E, 0x21, 0x96,
+ 0x8B, 0x89, 0xA6, 0x43, 0x6B, 0xDA, 0xBC, 0xD5, 0xDC, 0x74, 0x74, 0xC6, 0x64, 0xCA, 0x6A, 0x42,
+ 0x7C, 0x24, 0x80, 0x40, 0x1F, 0x82, 0x19, 0x25, 0xB7, 0x97, 0x40, 0x78, 0x16, 0x18, 0x71, 0x5C,
+ 0x44, 0xCD, 0x1B, 0x9F, 0xC9, 0xE0, 0xA6, 0x3F, 0xF4, 0xAA, 0x2B, 0x4E, 0xC2, 0x12, 0x24, 0x3F,
+ 0x98, 0xAD, 0x54, 0x84, 0xAF, 0x72, 0xA9, 0xBF, 0x61, 0x85, 0xA1, 0x95, 0xD8, 0xC1, 0x72, 0x4B,
+ 0x02, 0x21, 0x38, 0x7E, 0x29, 0xA8, 0x90, 0xBA, 0x9A, 0xF9, 0x4D, 0xB4, 0xFC, 0xAC, 0xB8, 0x27,
+ 0x77, 0xA0, 0xBE, 0x1E, 0x45, 0xFE, 0x2B, 0x49, 0x8E, 0x48, 0x66, 0xD5, 0x97, 0x1B, 0x21, 0x65,
+ 0x4F, 0xA5, 0x7E, 0xF8, 0x7E, 0x89, 0xB6, 0x1B, 0x4F, 0xB1, 0x2E, 0xC2, 0x84, 0x50, 0xB6, 0xC7,
+ 0xD5, 0xBC, 0xEE, 0x86, 0xBE, 0xB7, 0x27, 0xDB, 0xE8, 0xF3, 0x49, 0x02, 0xBF, 0xB1, 0x33, 0x71,
+ 0x5D, 0xA3, 0x3D, 0x28, 0x7E, 0x24, 0x76, 0x0E, 0x29, 0xAA, 0x65, 0xC8, 0x0B, 0xD2, 0xE1, 0xF1,
+ 0x36, 0x03, 0x2C, 0x28, 0x92, 0x3A, 0x42, 0x5A, 0xF8, 0x20, 0xEE, 0x43, 0xB6, 0x56, 0x12, 0xA9,
+ 0x2B, 0x8A, 0xC5, 0x5D, 0x7B, 0x77, 0x76, 0xC3, 0x9B, 0x80, 0xD9, 0x30, 0x7F, 0xE5, 0x0F, 0x2B,
+ 0x6A, 0x87, 0x29, 0xEF, 0x51, 0xED, 0x8C, 0x27, 0x2D, 0xD3, 0x9E, 0xEC, 0x4D, 0x3A, 0xDA, 0x65,
+ 0xB6, 0x17, 0xD1, 0x73, 0xEE, 0xE7, 0x94, 0x07, 0x12, 0x79, 0x9F, 0xF4, 0xA0, 0x0C, 0x7F, 0x95,
+ 0xBB, 0x28, 0xF9, 0xE3, 0x5F, 0x46, 0xB5, 0xC6, 0x0C, 0x4A, 0x18, 0xCB, 0x79, 0xA6, 0x90, 0x36,
+ 0xC5, 0xF7, 0x08, 0x36, 0xD2, 0xE7, 0x73, 0x21, 0x59, 0x8F, 0xF5, 0xC8, 0x89, 0xB1, 0x09, 0x11,
+ 0x03, 0xCD, 0xA4, 0xB7, 0x64, 0x04, 0x4A, 0xF4, 0x69, 0x06, 0x89, 0x66, 0x9E, 0xB1, 0x96, 0x1C,
+ 0x55, 0x22, 0x3F, 0x70, 0xBE, 0x72, 0x3D, 0x7C, 0xBC, 0x18, 0x8F, 0xEF, 0x69, 0x91, 0x76, 0x75,
+ 0x21, 0x20, 0x01, 0xAB, 0x44, 0x60, 0x13, 0x6A, 0xBC, 0xB5, 0x0B, 0x95, 0x3E, 0xE4, 0xA3, 0x4E,
+ 0x18, 0xD6, 0xBC, 0x51, 0x3C, 0xE2, 0x3D, 0x71, 0x70, 0xFB, 0xBF, 0xAD, 0x5F, 0x57, 0xB6, 0x6E,
+ 0x9F, 0xBE, 0x70, 0x69, 0x53, 0xEE, 0x34, 0x53, 0x9D, 0xE5, 0xBD, 0x51, 0x9D, 0x1D, 0xEA, 0xBC,
+ 0xD8, 0x89, 0x98, 0xC1, 0x26, 0xCF, 0x0F, 0x65, 0x71, 0xFE, 0x3B, 0x89, 0x9B, 0x5E, 0xAF, 0x6C,
+ 0xFD, 0xB2, 0x53, 0x88, 0x42, 0x7C, 0xFB, 0x87, 0x49, 0x69, 0x4D, 0x7D, 0xC9, 0x76, 0xA7, 0x84,
+ 0x10, 0xFF, 0xF8, 0x63, 0x64, 0xB1, 0xF2, 0x7D, 0x72, 0x79, 0xD8, 0xF1, 0x8B, 0xB6, 0xA3, 0x80,
+ 0xEF, 0x15, 0x92, 0x40, 0xBE, 0x01, 0x05, 0xCB, 0xA8, 0x07, 0x0C, 0xE0, 0xEE, 0x8F, 0xEA, 0xF6,
+ 0x62, 0x9B, 0x4C, 0x89, 0xC4, 0x0D, 0xBC, 0x55, 0x32, 0x91, 0xCC, 0x68, 0xD7, 0x40, 0x54, 0x13,
+ 0x1D, 0xD9, 0x96, 0x49, 0xB6, 0x63, 0xCB, 0xF3, 0x3E, 0x4C, 0xA1, 0xE3, 0xDA, 0xD1, 0x7C, 0x88,
+ 0x2D, 0xB5, 0xED, 0x6F, 0x9D, 0x85, 0x91, 0x3A, 0x5B, 0x80, 0xBB, 0xB8, 0x3B, 0x7E, 0xD2, 0x4B,
+ 0xE1, 0xDF, 0x2A, 0x32, 0x5B, 0x2C, 0xED, 0xB4, 0x39, 0xD2, 0x46, 0xB9, 0x3F, 0x4F, 0x98, 0xB5,
+ 0xB7, 0xB7, 0x16, 0xE9, 0xB1, 0x2A, 0xD5, 0x3A, 0x1B, 0xC1, 0xC4, 0xA4, 0xEB, 0x15, 0x86, 0x86,
+ 0x2E, 0x51, 0xA6, 0xCE, 0x9D, 0xEB, 0x47, 0x15, 0x7F, 0x37, 0x1B, 0x3E, 0x26, 0xED, 0x17, 0xE4,
+ 0x23, 0xE2, 0x7E, 0xDA, 0x03, 0xC8, 0x94, 0xE0, 0x50, 0x6C, 0x8C, 0x68, 0xCE, 0x04, 0x24, 0x7F,
+ 0x67, 0x0D, 0x2F, 0x77, 0xF7, 0x07, 0x75, 0x33, 0xFE, 0x4C, 0x1B, 0x2C, 0x53, 0x19, 0x47, 0xFA,
+ 0x4E, 0x1F, 0x5D, 0x2E, 0x80, 0x2E, 0x9E, 0xE5, 0xA6, 0x4E, 0x41, 0x45, 0x8C, 0x63, 0xA4, 0x4C,
+ 0x5E, 0x19, 0x04, 0x51, 0x6A, 0xAF, 0x6E, 0x4F, 0xBB, 0xA8, 0xAB, 0x87, 0xD4, 0xD7, 0x99, 0x59,
+ 0x77, 0x54, 0x0E, 0x10, 0xE8, 0x7B, 0xC5, 0x7B, 0x6D, 0x13, 0xA8, 0x58, 0xB7, 0x67, 0xD6, 0x23,
+ 0xF1, 0x97, 0xC6, 0xB1, 0xFE, 0x83, 0xE8, 0xBB, 0xC1, 0xD2, 0x26, 0x83, 0xDD, 0x8E, 0x86, 0x4F,
+ 0x69, 0xE5, 0xC4, 0x72, 0x56, 0x98, 0x0A, 0xB1, 0x58, 0x03, 0x4E, 0x14, 0xCD, 0x25, 0x65, 0xEF,
+ 0x31, 0xD0, 0x68, 0x45, 0x9C, 0x42, 0x84, 0xB8, 0xC9, 0x8F, 0xB0, 0xF8, 0xF1, 0xD2, 0x45, 0x75,
+ 0xD3, 0x4F, 0x13, 0x52, 0xD3, 0x8F, 0xF3, 0x8A, 0x3F, 0x73, 0xF0, 0x56, 0x24, 0x1B, 0x77, 0xFC,
+ 0xE4, 0xCC, 0x42, 0x57, 0x8F, 0xF8, 0xE8, 0x4C, 0x53, 0x5F, 0x22, 0x35, 0xDD, 0x6E, 0x33, 0x11,
+ 0xC8, 0xB2, 0xEB, 0xFF, 0x9B, 0x0F, 0xC7, 0x20, 0xED, 0x6F, 0x70, 0xC8, 0x8D, 0x1E, 0xDE, 0x2F,
+ 0x0E, 0x19, 0x50, 0xA2, 0xF1, 0x4F, 0x90, 0x56, 0x07, 0x63, 0x0A, 0x8D, 0xE2, 0x6E, 0xAE, 0x95,
+ 0x68, 0xCA, 0xEA, 0x78, 0x0C, 0xB1, 0xA4, 0x30, 0x14, 0x77, 0x48, 0x0C, 0x51, 0xD9, 0xE5, 0x30,
+ 0x7C, 0xCE, 0x77, 0xBA, 0xC7, 0x34, 0x9D, 0x25, 0x4D, 0xCF, 0x21, 0xE2, 0xCF, 0x50, 0xBA, 0x2A,
+ 0x32, 0xC7, 0x66, 0x07, 0xBA, 0x46, 0xE6, 0x69, 0xDE, 0x46, 0xDF, 0x03, 0x28, 0x51, 0xFE, 0x11,
+ 0x1C, 0x33, 0xBC, 0x4F, 0xD4, 0x2E, 0xC3, 0x7A, 0xED, 0x2A, 0xCE, 0xCA, 0x34, 0xE8, 0x4F, 0x65,
+ 0x8E, 0xF3, 0x77, 0x05, 0x67, 0xFB, 0xD5, 0x1D, 0x5C, 0x94, 0xB5, 0x27, 0xA9, 0x61, 0xF7, 0x99,
+ 0x15, 0x77, 0x2B, 0xA0, 0xB1, 0xB4, 0x3B, 0x72, 0x33, 0x67, 0xA7, 0x70, 0xFB, 0x60, 0x72, 0x04,
+ 0xC4, 0x88, 0x4C, 0xA5, 0x1C, 0xEF, 0x17, 0x66, 0x74, 0xAE, 0xBC, 0x01, 0xC3, 0x2F, 0x0D, 0xD6,
+ 0x12, 0xDF, 0x4F, 0x2C, 0x63, 0xC1, 0x79, 0xF8, 0x50, 0xC9, 0x52, 0x34, 0xA0, 0x6E, 0x73, 0xBA,
+ 0x5A, 0x31, 0x22, 0xF3, 0xC5, 0x98, 0xB0, 0x18, 0xD8, 0x7B, 0x2B, 0x06, 0x47, 0x9D, 0x50, 0xE6,
+ 0x16, 0xBF, 0x59, 0xC9, 0x34, 0xF0, 0x51, 0x58, 0x60, 0xD8, 0xEE, 0x83, 0xC8, 0x8B, 0x1E, 0x92,
+ 0x8F, 0xF0, 0xDF, 0x12, 0x61, 0xCC, 0x69, 0x21, 0x68, 0xE8, 0x78, 0xB8, 0xF2, 0xF0, 0xDE, 0xE7,
+ 0xAB, 0x8A, 0xA4, 0x38, 0x32, 0x06, 0xAE, 0xCD, 0x53, 0x92, 0xE4, 0x9B, 0x2C, 0xC1, 0x63, 0x30,
+ 0x29, 0xB5, 0x12, 0x21, 0x99, 0xCA, 0x99, 0x94, 0x92, 0x71, 0xFB, 0x0A, 0x31, 0xEF, 0xBF, 0xE2,
+ 0x52, 0x2B, 0xA5, 0xCE, 0x16, 0x5D, 0x15, 0x4A, 0x25, 0xCF, 0x74, 0x96, 0x9A, 0x95, 0x21, 0x2C,
+ 0xEA, 0xB7, 0xA1, 0xAE, 0xD4, 0x15, 0x29, 0x38, 0xF9, 0x7B, 0x6C, 0xD7, 0x3A, 0x52, 0xFD, 0x60,
+ 0xA2, 0xD0, 0xEE, 0xA5, 0xDF, 0x4C, 0xC6, 0xBF, 0x30, 0x82, 0x20, 0xB6, 0x73, 0x58, 0xC8, 0x7B,
+ 0xA8, 0xEA, 0x01, 0x9B, 0xEA, 0x02, 0x89, 0xD0, 0x83, 0x71, 0x14, 0x98, 0xB0, 0x6E, 0x5B, 0x80,
+ 0xB4, 0xBA, 0x4D, 0xC5, 0x95, 0x77, 0x5A, 0x44, 0x56, 0x74, 0x12, 0x48, 0xBC, 0xAE, 0x92, 0xCF,
+ 0x5A, 0xF9, 0x62, 0xE8, 0x72, 0xA5, 0x72, 0x5B, 0x58, 0xC6, 0x14, 0x29, 0xF1, 0xC4, 0xD6, 0xC6,
+ 0x75, 0x71, 0x9C, 0xC4, 0x7D, 0xC5, 0x93, 0x26, 0xA2, 0x9B, 0x1C, 0x30, 0xE8, 0x41, 0xC7, 0x03,
+ 0x66, 0x98, 0x2C, 0x10, 0x34, 0x6A, 0x0E, 0xC2, 0x35, 0x53, 0xAA, 0x17, 0x3E, 0xF4, 0xCB, 0x9C,
+ 0xC4, 0x1E, 0xB4, 0x79, 0x0B, 0xA0, 0x41, 0x4B, 0xC6, 0xB4, 0xAC, 0x5F, 0xDA, 0x48, 0x01, 0x0D,
+ 0xBF, 0xDF, 0x6A, 0x0E, 0x42, 0x16, 0xFC, 0x97, 0x58, 0x98, 0x04, 0xDA, 0x46, 0x1E, 0x37, 0x55,
+ 0x77, 0x2A, 0xB8, 0x58, 0x6B, 0x9E, 0x55, 0x2E, 0xF6, 0x52, 0x17, 0x38, 0xE1, 0xA7, 0xD9, 0xA0,
+ 0x08, 0xF3, 0x3E, 0x0B, 0xE4, 0x10, 0x37, 0x2A, 0x16, 0x54, 0x63, 0x1E, 0x5A, 0x43, 0xC7, 0xDE,
+ 0xA3, 0xE9, 0x3B, 0x85, 0x3A, 0xFB, 0x03, 0xE9, 0xDE, 0xD9, 0x1C, 0xDD, 0x9B, 0x56, 0x4F, 0x70,
+ 0x77, 0xDD, 0xF3, 0xBA, 0x0F, 0xA4, 0x0F, 0x12, 0x5A, 0x1C, 0xF4, 0x32, 0xE8, 0x58, 0x6C, 0x23,
+ 0xC5, 0x46, 0x2E, 0x1C, 0xCA, 0xE0, 0x99, 0x27, 0x77, 0xC8, 0x14, 0xD3, 0x34, 0xA4, 0xEA, 0xDD,
+ 0x76, 0x3C, 0x91, 0x39, 0x96, 0x2A, 0xEE, 0x63, 0x05, 0x6A, 0x2D, 0x65, 0x48, 0x88, 0xE6, 0x9D,
+ 0x26, 0xE3, 0x95, 0xD6, 0xFC, 0x86, 0xC8, 0x41, 0xB5, 0x14, 0x99, 0x2C, 0x35, 0x8C, 0xBD, 0xA8,
+ 0x28, 0x1D, 0xF7, 0x74, 0x00, 0x36, 0xCA, 0xE8, 0xBB, 0x28, 0x35, 0x03, 0x10, 0x23, 0xEC, 0x82,
+ 0x4C, 0x32, 0x59, 0xAB, 0x6B, 0x01, 0x2B, 0x42, 0xEB, 0x67, 0x4D, 0x49, 0x80, 0x47, 0x7C, 0xD0,
+ 0xFE, 0x48, 0xB5, 0xC8, 0xB3, 0xF3, 0x06, 0x37, 0x13, 0x65, 0xF1, 0x53, 0x9C, 0x24, 0x00, 0x29,
+ 0x41, 0x8E, 0x97, 0xE7, 0x47, 0x21, 0xF8, 0xB6, 0xEF, 0xC1, 0x08, 0xAC, 0x8B, 0xF3, 0xDF, 0xD1,
+ 0x9B, 0xED, 0x16, 0xEA, 0x5C, 0x3C, 0x39, 0xF6, 0xB9, 0x0F, 0x0D, 0xC1, 0x0C, 0x79, 0xB4, 0xFA,
+ 0xEC, 0x7F, 0xD2, 0xE0, 0x80, 0xEC, 0xF1, 0x88, 0xBE, 0x68, 0xA8, 0xD1, 0x38, 0xB5, 0xFE, 0xB5,
+ 0xED, 0x1A, 0xB1, 0x8D, 0xBC, 0x50, 0x9B, 0xA5, 0x40, 0x45, 0xB4, 0x94, 0x25, 0xF8, 0xA5, 0xEB,
+ 0x88, 0x00, 0xC8, 0xCA, 0xBA, 0x86, 0xF6, 0xB6, 0xDA, 0xC0, 0xF3, 0x42, 0xDA, 0xE4, 0x16, 0xB1,
+ 0x3A, 0xC1, 0xAB, 0x29, 0xF8, 0xD2, 0xCF, 0xB6, 0x24, 0xBD, 0xE9, 0xA7, 0x18, 0xA7, 0xED, 0x80,
+ 0x0B, 0x0A, 0x91, 0xD7, 0x8C, 0xC9, 0x60, 0x5F, 0x73, 0xBE, 0x7C, 0x12, 0x26, 0xED, 0xC5, 0xA4,
+ 0x55, 0x83, 0x55, 0x93, 0x74, 0xF7, 0x1B, 0x05, 0x8B, 0xBA, 0x88, 0x1D, 0x42, 0x9A, 0x15, 0x78,
+ 0x9F, 0xE9, 0x62, 0x95, 0x65, 0xD5, 0x16, 0x02, 0x1F, 0xCA, 0x13, 0xA8, 0x52, 0x84, 0xBF, 0xAD,
+ 0xE5, 0xDD, 0xDB, 0x18, 0xB5, 0x37, 0x8D, 0x70, 0x5E, 0xF9, 0xE3, 0xC2, 0x33, 0x1F, 0xCC, 0x97,
+ 0x52, 0x35, 0x13, 0xD9, 0xD0, 0x29, 0x44, 0x0B, 0xD8, 0xBD, 0xB2, 0x93, 0x6C, 0x2C, 0xAC, 0x7B,
+ 0x14, 0x94, 0x67, 0xCC, 0x65, 0x5E, 0x78, 0x53, 0x82, 0x72, 0xFE, 0xFB, 0xD9, 0x04, 0x5F, 0x90,
+ 0x6C, 0xB0, 0xFB, 0x80, 0x6C, 0x7D, 0x0B, 0x62, 0x8B, 0x7B, 0x73, 0x7D, 0x1F, 0x6B, 0x93, 0x7D,
+ 0x07, 0x66, 0x98, 0xBB, 0xB2, 0x49, 0xB3, 0x34, 0x10, 0xBB, 0x23, 0x2B, 0x14, 0xA0, 0xB4, 0x4A,
+ 0xC1, 0x56, 0x7B, 0x47, 0xD4, 0x49, 0x97, 0x4D, 0x69, 0x9C, 0xFC, 0x7C, 0xF2, 0x87, 0xF4, 0x8B,
+ 0xA4, 0xD6, 0xF8, 0xAE, 0x3B, 0x8F, 0x9A, 0x5B, 0x90, 0x29, 0x9C, 0xD9, 0xE2, 0xA9, 0xA2, 0x60,
+ 0x52, 0x4A, 0x1F, 0xE5, 0x6E, 0x7C, 0x49, 0xEC, 0x83, 0xA8, 0x0E, 0x79, 0x5B, 0x0A, 0x1F, 0x53,
+ 0xDB, 0x6C, 0xEF, 0x78, 0x2D, 0x52, 0xBA, 0x00, 0x3A, 0x49, 0xB2, 0xB1, 0x56, 0x1C, 0x3B, 0x7E,
+ 0x99, 0x9C, 0x20, 0xB7, 0xC7, 0x9E, 0x8B, 0x8C, 0x88, 0xF2, 0x15, 0xFF, 0x4F, 0x06, 0xF4, 0x1B,
+ 0x6F, 0x02, 0x1E, 0x3A, 0x29, 0xA0, 0x7B, 0xFA, 0x2C, 0x26, 0x58, 0xE3, 0x75, 0x5F, 0xB8, 0x94,
+ 0x27, 0x70, 0xF6, 0xA5, 0x79, 0x51, 0x0F, 0x72, 0x52, 0x81, 0xDC, 0xDC, 0x74, 0x93, 0xAF, 0xB4,
+ 0xB5, 0x9F, 0xF2, 0x03, 0x4F, 0x79, 0x0A, 0xC5, 0xB9, 0xC7, 0x3E, 0x12, 0x53, 0x3A, 0x63, 0x6A,
+ 0x8A, 0x27, 0xB6, 0x9D, 0x4C, 0x84, 0x87, 0x92, 0xBF, 0x7D, 0x49, 0x52, 0xAF, 0x10, 0xCD, 0x6C,
+ 0x58, 0xC5, 0xF0, 0xFE, 0x59, 0x5C, 0xA8, 0x5A, 0xDE, 0x0E, 0x19, 0x23, 0x3F, 0x01, 0x87, 0xFD,
+ 0x95, 0xA8, 0x61, 0x90, 0x06, 0x49, 0x77, 0xD8, 0xAD, 0xC4, 0x5D, 0x72, 0x65, 0x5D, 0x2A, 0x48,
+ 0x70, 0xE1, 0x37, 0x2C, 0x20, 0x50, 0x24, 0xC4, 0xE7, 0x74, 0x91, 0x30, 0x91, 0x0E, 0xA3, 0x8B,
+ 0x73, 0x6C, 0x31, 0xE1, 0xAF, 0xC7, 0x8C, 0x37, 0xF8, 0x22, 0x71, 0x36, 0xCA, 0xE0, 0xE1, 0x41,
+ 0xF6, 0x74, 0x26, 0x17, 0x08, 0xC2, 0xD9, 0xB5, 0xCE, 0x4A, 0x67, 0x17, 0xC2, 0x54, 0xA0, 0x1F,
+ 0x22, 0xFF, 0x8D, 0xB6, 0x60, 0x26, 0x7B, 0x7B, 0x05, 0x0D, 0x69, 0xAE, 0x6F, 0x09, 0x78, 0x9D,
+ 0xD0, 0x2C, 0x59, 0xB1, 0xE7, 0xAB, 0x9F, 0x5F, 0x0C, 0xB7, 0xB4, 0x98, 0x47, 0x85, 0x28, 0x24,
+ 0x74, 0x05, 0x79, 0xC8, 0x37, 0xDB, 0x2D, 0x71, 0xBA, 0x70, 0x24, 0x1D, 0xC6, 0x4C, 0x23, 0xF6,
+ 0xFE, 0xE5, 0x47, 0x33, 0xA2, 0xAE, 0x44, 0xB1, 0x64, 0x5D, 0xAB, 0xA3, 0xD5, 0xF1, 0x91, 0x12,
+ 0xA1, 0x12, 0x42, 0xFC, 0xF5, 0xE7, 0x15, 0x57, 0x1F, 0x3F, 0x08, 0x7F, 0xD4, 0x5D, 0x0B, 0x97,
+ 0x43, 0x0B, 0xF3, 0x36, 0x54, 0xF6, 0x0A, 0x54, 0xE4, 0x77, 0xBE, 0xDF, 0x8A, 0xCA, 0xC2, 0x43,
+ 0x5F, 0x4A, 0x32, 0xBC, 0x9A, 0x20, 0x27, 0xB3, 0xB9, 0x2F, 0xA7, 0x92, 0x8E, 0xDD, 0x12, 0x15,
+ 0x27, 0x5A, 0x0D, 0xD6, 0x5E, 0xC7, 0xDE, 0xFB, 0x78, 0xE6, 0x63, 0x5E, 0x07, 0x35, 0xC7, 0xAE,
+ 0x04, 0xC0, 0x14, 0xDB, 0x26, 0x45, 0x4D, 0x57, 0x91, 0x4A, 0xB5, 0xDE, 0xF8, 0x40, 0xE1, 0xE4,
+ 0x6C, 0x32, 0xCC, 0x37, 0x44, 0x34, 0x05, 0xC8, 0xC3, 0x49, 0x28, 0xFA, 0xED, 0x93, 0x08, 0x10,
+ 0xA8, 0x8B, 0x00, 0x8C, 0x4D, 0xF5, 0x23, 0xB1, 0x47, 0x2E, 0x2E, 0x6B, 0xC8, 0x18, 0x89, 0x86,
+ 0x59, 0xBA, 0xC7, 0x3F, 0x1C, 0xD5, 0x24, 0x35, 0xBC, 0x37, 0x46, 0x7F, 0xB3, 0x7E, 0xEF, 0x35,
+ 0xA9, 0x1C, 0x2D, 0x8F, 0x10, 0x11, 0x07, 0x8B, 0x5C, 0x1C, 0x4C, 0x42, 0xC6, 0xE6, 0x17, 0x32,
+ 0xF1, 0xBF, 0x61, 0x7A, 0x75, 0x3E, 0x02, 0x58, 0xE1, 0x6B, 0x59, 0x1E, 0xFF, 0x16, 0xC8, 0x65,
+ 0xAF, 0xF1, 0xB1, 0x14, 0x86, 0x84, 0xC1, 0x03, 0x7A, 0x75, 0x7B, 0x9E, 0x6B, 0xD2, 0x4C, 0x39,
+ 0xD0, 0x01, 0x71, 0xB7, 0xFA, 0x36, 0x78, 0x59, 0xB5, 0xF0, 0x63, 0xF1, 0x24, 0xD1, 0x10, 0x37,
+ 0x92, 0xF6, 0x0F, 0x58, 0x7A, 0xC7, 0xCE, 0xB5, 0xC9, 0x79, 0x1C, 0x38, 0x36, 0x07, 0x34, 0x99,
+ 0xCE, 0xC4, 0x97, 0x98, 0x7C, 0xA0, 0xA7, 0xD0, 0x04, 0x2B, 0x5F, 0x10, 0xC9, 0xE8, 0x7A, 0xF6,
+ 0x5C, 0xFC, 0xAC, 0xF4, 0x6F, 0x2E, 0x6B, 0xB7, 0xE8, 0xC5, 0x26, 0xC5, 0xB1, 0x38, 0x8E, 0x5B,
+ 0x81, 0x90, 0x1C, 0x38, 0xB8, 0x8F, 0xD0, 0x82, 0x1B, 0xF0, 0x4A, 0x0C, 0x46, 0x8B, 0xED, 0x49,
+ 0x21, 0xD9, 0x6D, 0x17, 0x29, 0xA1, 0xBB, 0x59, 0xDE, 0x98, 0x24, 0xDF, 0xAE, 0x07, 0xC5, 0x92,
+ 0xD2, 0xC9, 0x92, 0x00, 0x8F, 0xB0, 0xB0, 0x36, 0x58, 0xFA, 0xB8, 0xB0, 0x43, 0x17, 0xB0, 0xA3,
+ 0x3B, 0xAF, 0x39, 0xB8, 0x31, 0x8A, 0x38, 0xBF, 0xD2, 0xEE, 0x06, 0x0B, 0xB6, 0x99, 0x00, 0x41,
+ 0xF5, 0x72, 0x9A, 0x9C, 0x1F, 0xBA, 0xFB, 0x22, 0xB3, 0xA5, 0x8A, 0x11, 0x7B, 0xF2, 0x53, 0xEB,
+ 0x90, 0x60, 0x72, 0x3C, 0xC3, 0x56, 0xAC, 0xBD, 0xE2, 0xFA, 0xBF, 0x37, 0xB8, 0x9F, 0xDD, 0x4E,
+ 0xF1, 0x05, 0x9E, 0x65, 0x3B, 0x45, 0x89, 0xA5, 0xD3, 0xA3, 0xBA, 0xD4, 0x1C, 0xCA, 0x0C, 0xCE,
+ 0xDC, 0x5C, 0x66, 0xFE, 0x4B, 0x44, 0x1A, 0xC9, 0xB0, 0x52, 0x02, 0xCD, 0x47, 0x89, 0x90, 0x2E,
+ 0xA4, 0x3F, 0xEC, 0x90, 0xCD, 0x84, 0xF3, 0x58, 0x6B, 0x24, 0xBA, 0x03, 0xBC, 0x57, 0x1B, 0xA2,
+ 0xAC, 0xF2, 0x80, 0x0F, 0x26, 0x04, 0x59, 0xA2, 0x74, 0x07, 0x03, 0xFD, 0xC4, 0x57, 0x29, 0xCF,
+ 0x90, 0xF7, 0xD3, 0x58, 0x4A, 0x71, 0x69, 0x7C, 0x7F, 0x52, 0x77, 0x1B, 0x0D, 0xFF, 0x0A, 0x59,
+ 0x80, 0x4E, 0x3F, 0xE8, 0x82, 0xB6, 0xA5, 0x68, 0x9C, 0x62, 0x3A, 0x6C, 0x71, 0x3A, 0xCA, 0x23,
+ 0x6E, 0x03, 0xB1, 0x50, 0x32, 0x13, 0x27, 0x81, 0xCB, 0x68, 0x42, 0x7D, 0x32, 0x23, 0x4F, 0x85,
+ 0x39, 0x76, 0x8C, 0x8F, 0xB0, 0x73, 0xD3, 0xED, 0x56, 0xF0, 0xC6, 0x66, 0x01, 0x13, 0xB4, 0x13,
+ 0x95, 0x8E, 0x49, 0x22, 0x4F, 0x5D, 0xFF, 0xDB, 0xAE, 0x50, 0x71, 0x6E, 0xC2, 0xA2, 0xA7, 0x70,
+ 0xEE, 0xDB, 0xB5, 0x18, 0x1E, 0x4C, 0x0F, 0x57, 0xC7, 0x4E, 0x46, 0xDD, 0x78, 0x5F, 0x1A, 0xEE,
+ 0x02, 0xAC, 0x80, 0xE4, 0xA8, 0x38, 0x67, 0xAD, 0x5C, 0xF7, 0x00, 0xC5, 0xCA, 0x0B, 0x52, 0x49,
+ 0x94, 0x43, 0x97, 0x90, 0x46, 0xF5, 0x1A, 0xA5, 0x21, 0x7E, 0x05, 0xAC, 0xF1, 0x97, 0x66, 0x42,
+ 0xFB, 0x5D, 0x4F, 0x71, 0x4B, 0x8E, 0x3E, 0xC3, 0x9E, 0x14, 0xF7, 0xAD, 0xDE, 0x34, 0xEB, 0x9C,
+ 0x06, 0xB1, 0x8A, 0xE2, 0x9D, 0xA6, 0x25, 0xFD, 0x1B, 0x69, 0xDF, 0x41, 0x60, 0xBF, 0xA4, 0x04,
+ 0x5C, 0xF7, 0x76, 0xFD, 0x22, 0x30, 0x0C, 0x63, 0xDB, 0xAD, 0x42, 0xA8, 0x0A, 0x97, 0xE7, 0xF0,
+ 0x57, 0x9D, 0x17, 0x6B, 0x37, 0x5D, 0x35, 0xC9, 0x5F, 0xAC, 0xF6, 0xB8, 0x89, 0x41, 0xB0, 0x6F,
+ 0x49, 0xA8, 0x47, 0x61, 0xB1, 0x63, 0x65, 0x40, 0x07, 0xD8, 0xC5, 0x5A, 0x5D, 0x1D, 0x82, 0x7F,
+ 0xCC, 0x6A, 0xF2, 0xA1, 0x36, 0x3C, 0xC0, 0x51, 0x6E, 0xD3, 0x4B, 0x36, 0xE0, 0x07, 0xCE, 0xA3,
+ 0x9B, 0xB1, 0x13, 0x04, 0x32, 0x87, 0x75, 0x4A, 0x16, 0x34, 0xB4, 0x75, 0x0F, 0x75, 0x33, 0x7C,
+ 0xEC, 0x02, 0x35, 0xA9, 0x49, 0x39, 0xF6, 0x24, 0x03, 0x73, 0xCE, 0x54, 0x45, 0x02, 0x6C, 0x0A,
+ 0x53, 0x2B, 0x73, 0x38, 0x3C, 0x81, 0x56, 0xA7, 0xBB, 0xF2, 0x73, 0x0F, 0xC7, 0xB7, 0x0E, 0xAA,
+ 0x45, 0x62, 0xA6, 0x29, 0x8C, 0xC9, 0x0D, 0x45, 0x0E, 0xBD, 0xDB, 0xD8, 0x71, 0x5C, 0xD7, 0x18,
+ 0xFC, 0xB0, 0x61, 0x89, 0xA2, 0x22, 0xF4, 0xF5, 0x48, 0x38, 0xE8, 0x7F, 0x17, 0x5C, 0x82, 0xF6,
+ 0x2D, 0x1F, 0x28, 0x85, 0xD9, 0xB7, 0x16, 0xA4, 0x52, 0x6F, 0x3A, 0xF1, 0xEE, 0xA7, 0x2D, 0x99,
+ 0x71, 0xAD, 0xAA, 0x15, 0x24, 0xD8, 0x86, 0x1D, 0x78, 0x90, 0x0B, 0x4C, 0x4E, 0x78, 0xC1, 0xC2,
+ 0xD7, 0xED, 0xE6, 0xB4, 0xF0, 0xAC, 0x2A, 0xFD, 0xE6, 0x75, 0xBA, 0xCA, 0x0C, 0xAD, 0xD6, 0x3D,
+ 0x38, 0x4D, 0x1F, 0xE9, 0x7D, 0x87, 0xA8, 0xCA, 0x13, 0x1A, 0xFA, 0x72, 0x53, 0x8E, 0xB2, 0x2F,
+ 0xE3, 0xAD, 0xAA, 0x8E, 0x7A, 0xBA, 0x6A, 0xBC, 0x2C, 0x8E, 0xBA, 0xD5, 0x0B, 0x3E, 0x2F, 0x4D,
+ 0xB3, 0xC4, 0xF6, 0x6F, 0x01, 0xEF, 0x90, 0x60, 0xC9, 0x3D, 0xD2, 0x93, 0x45, 0x03, 0xCB, 0x65,
+ 0x11, 0xE1, 0xAD, 0x7A, 0x90, 0xCE, 0xFA, 0x41, 0x05, 0x45, 0x55, 0x10, 0xE9, 0x44, 0xBF, 0x59,
+ 0x58, 0xC2, 0x71, 0xDB, 0x00, 0xBA, 0x0C, 0x32, 0x08, 0xF9, 0xB1, 0x58, 0xFA, 0xE6, 0x45, 0xFD,
+ 0x0B, 0xBC, 0x23, 0xB7, 0x82, 0xE1, 0x89, 0x3A, 0x1F, 0xA1, 0xDA, 0xD2, 0x27, 0x7A, 0x0C, 0x18,
+ 0xA1, 0x1D, 0x02, 0xD0, 0x59, 0xEE, 0xA8, 0x42, 0xF4, 0x67, 0x02, 0x0A, 0xC1, 0xB0, 0xC2, 0x3E,
+ 0x8E, 0x86, 0xAD, 0xB5, 0x3B, 0x78, 0x05, 0xBE, 0x51, 0x12, 0xBF, 0x50, 0x58, 0xBD, 0xF3, 0x94,
+ 0xFB, 0x02, 0x04, 0x38, 0x5F, 0xFD, 0xDC, 0x7D, 0xCB, 0xDA, 0x26, 0x36, 0x79, 0x5C, 0x89, 0x52,
+ 0xB8, 0xF8, 0x96, 0x4B, 0xA9, 0x49, 0x43, 0xB5, 0x32, 0x22, 0x40, 0x27, 0x67, 0xFE, 0x46, 0xB9,
+ 0x0B, 0x17, 0x75, 0x4B, 0xEB, 0x08, 0xA1, 0xDE, 0xC6, 0x7E, 0xD5, 0xAF, 0x4A, 0x69, 0xAA, 0x8C,
+ 0xA1, 0x74, 0x33, 0x54, 0x33, 0x47, 0x62, 0x00, 0xE8, 0x63, 0x76, 0x4C, 0xE7, 0x76, 0xEE, 0x78,
+ 0x5A, 0xB8, 0x44, 0x4A, 0x8F, 0x0D, 0xD7, 0x32, 0xC4, 0xB9, 0xB0, 0x1A, 0xF9, 0x58, 0x8F, 0x9E,
+ 0x06, 0x9F, 0x87, 0x9D, 0x29, 0x1E, 0xBF, 0xA5, 0xFD, 0xA6, 0xCD, 0xF9, 0xD8, 0x6D, 0x01, 0xCC,
+ 0x0F, 0xF6, 0x52, 0xCB, 0xFA, 0xE0, 0xA5, 0x2D, 0xCC, 0xB9, 0xA0, 0xB1, 0x9D, 0xD3, 0x09, 0x24,
+ 0x34, 0xD7, 0x01, 0x15, 0x3D, 0xEB, 0x0F, 0x07, 0xAC, 0x3A, 0x94, 0xCC, 0xAA, 0x52, 0x1E, 0xBD,
+ 0x4C, 0x49, 0xCD, 0x22, 0x85, 0x89, 0x47, 0x27, 0x21, 0x4E, 0x96, 0x41, 0x94, 0x6F, 0xFF, 0x2E,
+ 0x69, 0x3A, 0x6B, 0xA7, 0x74, 0xBA, 0x9B, 0xEB, 0x25, 0x5E, 0xA9, 0x5A, 0xE0, 0x66, 0x59, 0xF6,
+ 0x18, 0x5B, 0x77, 0xDF, 0x8E, 0x56, 0x67, 0x52, 0x2C, 0xDA, 0x0C, 0xB0, 0xF2, 0xF8, 0xB9, 0xE2,
+ 0x80, 0xB4, 0x2A, 0x6E, 0xFF, 0x81, 0xC2, 0x72, 0x7C, 0xEE, 0x71, 0xC7, 0x06, 0xF5, 0x61, 0xAC,
+ 0xFC, 0x77, 0x84, 0xD4, 0xEB, 0x41, 0x95, 0x7F, 0xEE, 0xD0, 0xDD, 0x91, 0x20, 0xAE, 0xF9, 0xBE,
+ 0xF8, 0x30, 0xF3, 0x25, 0x57, 0xA4, 0x1D, 0xDB, 0x0F, 0xD3, 0x5A, 0xA7, 0x93, 0x1B, 0x83, 0x4B,
+ 0x62, 0xD4, 0x4C, 0xA1, 0xD6, 0x34, 0x0D, 0xBC, 0x36, 0x00, 0x35, 0x65, 0x61, 0x14, 0x48, 0x03,
+ 0x4B, 0xB5, 0xBB, 0xFA, 0x5D, 0xB0, 0x2D, 0xCA, 0x8E, 0x54, 0x2A, 0xBA, 0x77, 0xA4, 0xE4, 0x94,
+ 0x31, 0x21, 0x0B, 0xDB, 0x04, 0xA2, 0x6B, 0xEB, 0x80, 0xF2, 0x71, 0xD9, 0x2E, 0xDA, 0x8C, 0x61,
+ 0xA5, 0x79, 0x48, 0x7F, 0x70, 0xFB, 0x04, 0xF5, 0xB8, 0xA0, 0xCD, 0x1D, 0xB0, 0xBF, 0x62, 0x29,
+ 0xC1, 0xAB, 0xB1, 0xA1, 0xD8, 0x6E, 0x48, 0xC7, 0x0B, 0x20, 0x1A, 0xF6, 0xD6, 0xB2, 0x37, 0xD2,
+ 0xA3, 0xCC, 0x84, 0x33, 0xBD, 0x90, 0xFE, 0x23, 0x10, 0x9A, 0x41, 0x0A, 0xBA, 0xB3, 0xE6, 0x75,
+ 0x62, 0x7D, 0x91, 0x82, 0x1C, 0x45, 0xBB, 0x24, 0xD3, 0x67, 0xDA, 0xB2, 0xA5, 0xE5, 0x0F, 0xDF,
+ 0x0B, 0x58, 0xDA, 0x25, 0xEB, 0x02, 0x66, 0xE1, 0x5C, 0xEA, 0x3E, 0x6B, 0x32, 0xFF, 0xFA, 0x8A,
+ 0x6F, 0x91, 0x23, 0x3E, 0x52, 0xD5, 0x84, 0x30, 0xA4, 0x15, 0xB5, 0x04, 0xCC, 0xCE, 0x10, 0x9F,
+ 0x04, 0xD2, 0x53, 0x94, 0xB9, 0x01, 0x71, 0x0D, 0xA2, 0xA0, 0xCB, 0x8F, 0x9C, 0xA3, 0x49, 0x6C,
+ 0x2A, 0x3E, 0x88, 0xC3, 0x39, 0x05, 0x99, 0x57, 0xAE, 0xEA, 0x38, 0x78, 0xF9, 0x4C, 0x49, 0x1D,
+ 0xCE, 0x32, 0x10, 0x4A, 0x10, 0x24, 0x5D, 0x16, 0xBE, 0x82, 0x40, 0x28, 0xC5, 0xC4, 0xC9, 0x4E,
+ 0xE0, 0xF9, 0x68, 0xB8, 0x83, 0x68, 0xAC, 0x2F, 0x74, 0xB1, 0x9B, 0x52, 0xFC, 0x0D, 0x31, 0xBB,
+ 0xF2, 0xB0, 0x24, 0x94, 0x78, 0x8C, 0x39, 0xEC, 0xA7, 0xDE, 0x3F, 0xF4, 0xC7, 0xC8, 0x4A, 0x3B,
+ 0x37, 0x42, 0x41, 0x46, 0x4B, 0x5D, 0x53, 0x6C, 0x45, 0xB2, 0x2A, 0x6E, 0x6A, 0x4A, 0x8F, 0xDD,
+ 0x56, 0x1E, 0xAA, 0xB2, 0x41, 0x60, 0xDC, 0xE7, 0x45, 0x86, 0xFD, 0xE2, 0xCE, 0xD9, 0x9B, 0x98,
+ 0x39, 0x4E, 0xBE, 0x2B, 0x89, 0x2E, 0xEF, 0xCB, 0xE4, 0x4D, 0xCD, 0x00, 0x0A, 0x8E, 0x69, 0xAD,
+ 0x36, 0x0A, 0xBB, 0xCC, 0x5E, 0x8F, 0x5D, 0x12, 0x30, 0x6E, 0xEF, 0xAE, 0x4E, 0xAD, 0xFE, 0xF8,
+ 0x3D, 0x71, 0x61, 0x75, 0x37, 0x5B, 0x61, 0xC7, 0x1B, 0x38, 0xFB, 0x16, 0x19, 0xD7, 0x82, 0x5F,
+ 0x98, 0x4E, 0xDF, 0x7E, 0xAD, 0x24, 0x38, 0x6E, 0xCF, 0xA6, 0xD0, 0x93, 0xBE, 0x70, 0x16, 0x1C,
+ 0x01, 0x29, 0xA9, 0x67, 0xD9, 0x08, 0x22, 0x48, 0xDD, 0x1E, 0x82, 0x13, 0xB7, 0xA7, 0xFD, 0x74,
+ 0xAE, 0xA2, 0xE4, 0xEA, 0x60, 0xB8, 0xD1, 0x43, 0xDA, 0x35, 0xFF, 0x76, 0xF8, 0xF5, 0x91, 0x5F,
+ 0xB7, 0xEF, 0x21, 0x81, 0xA1, 0x8B, 0x88, 0xE7, 0x4E, 0xA4, 0x12, 0xDC, 0x3C, 0x35, 0xA8, 0x9D,
+ 0x27, 0x78, 0x1F, 0x48, 0xE7, 0x54, 0x4C, 0x98, 0x7B, 0x13, 0x1F, 0x42, 0xD4, 0x36, 0x55, 0xDB,
+ 0x96, 0x74, 0xE4, 0xDA, 0xF2, 0xE3, 0xCC, 0xC1, 0xC8, 0x23, 0x4D, 0x90, 0x51, 0x77, 0x0B, 0xA3,
+ 0x4D, 0x0C, 0xDD, 0x19, 0x87, 0x13, 0x15, 0xDB, 0x4F, 0x39, 0x8B, 0x48, 0x25, 0x85, 0x3B, 0x02,
+ 0x1E, 0x73, 0x83, 0xEF, 0xBD, 0x5A, 0x13, 0x06, 0xAD, 0xAB, 0x90, 0xD9, 0x9F, 0xBC, 0x59, 0xE7,
+ 0x0A, 0xA8, 0xB6, 0xEF, 0xAD, 0xB5, 0x37, 0x7B, 0x9D, 0xAA, 0xAC, 0x9C, 0xC7, 0x0F, 0x7B, 0x34,
+ 0x78, 0x83, 0x51, 0xCB, 0x5B, 0xD3, 0xFE, 0x14, 0x0E, 0xB1, 0x31, 0xAB, 0x78, 0x9F, 0xDE, 0x3F,
+ 0xDF, 0x05, 0x96, 0xA4, 0xA3, 0x44, 0x3B, 0x5F, 0x20, 0x80, 0x5C, 0xE5, 0x02, 0xFF, 0xD2, 0xD3,
+ 0xB9, 0x0A, 0xFD, 0x39, 0x97, 0x39, 0x68, 0x43, 0x2E, 0x73, 0x18, 0x29, 0xFC, 0x9B, 0x2D, 0x03,
+ 0x4B, 0x93, 0xD0, 0x57, 0x82, 0x82, 0x14, 0x4C, 0xD3, 0x87, 0x21, 0x39, 0x9E, 0x2B, 0x15, 0x6C,
+ 0xCE, 0xB6, 0xB4, 0x69, 0x17, 0xE9, 0xD5, 0xA0, 0x67, 0xED, 0x47, 0xAF, 0xAE, 0xFD, 0xBC, 0xA6,
+ 0xAA, 0xC3, 0xEA, 0x86, 0xF5, 0x5E, 0x2A, 0xA9, 0x41, 0xF9, 0x4D, 0x70, 0x77, 0x43, 0xBF, 0x31,
+ 0xCC, 0x02, 0x06, 0x31, 0xCB, 0x9C, 0x47, 0xD6, 0xAF, 0x79, 0x5B, 0xE3, 0x0B, 0xA9, 0xCB, 0xBF,
+ 0x42, 0xC4, 0x3E, 0xC2, 0x13, 0x3D, 0x5B, 0x5C, 0x23, 0x82, 0xF3, 0x57, 0x08, 0xA7, 0x0A, 0x06,
+ 0x73, 0xC3, 0x13, 0x86, 0xE0, 0x24, 0xAC, 0x45, 0xA6, 0x93, 0x2D, 0x69, 0xA4, 0x13, 0x28, 0x18,
+ 0x7D, 0x92, 0xFB, 0x51, 0x3F, 0x9B, 0x62, 0xFD, 0x51, 0xA9, 0xDA, 0xFC, 0x4A, 0xA0, 0x9D, 0xFC,
+ 0x15, 0xE1, 0xFA, 0x19, 0x08, 0xD3, 0xB7, 0xE3, 0x1F, 0xA5, 0x53, 0xA1, 0xFE, 0xFF, 0xA5, 0xF3,
+ 0x28, 0x9D, 0x26, 0x12, 0xED, 0xD2, 0x3C, 0xFA, 0x7E, 0x7C, 0x20, 0x8D, 0x9D, 0x4E, 0xD8, 0x6A,
+ 0xBD, 0xEE, 0xF8, 0x31, 0x29, 0xDF, 0x36, 0xC7, 0x2B, 0x5F, 0x45, 0xB7, 0x9B, 0xAE, 0x33, 0x95,
+ 0xE3, 0xE3, 0x9F, 0x0C, 0x9C, 0xEB, 0xCE, 0xD3, 0xF2, 0x05, 0x3D, 0xDC, 0x0A, 0xD5, 0x7C, 0xF8,
+ 0x4A, 0xDA, 0xEB, 0xA9, 0x47, 0x90, 0xA1, 0x2B, 0x3E, 0xE3, 0x46, 0xFE, 0x44, 0xE4, 0x90, 0x55,
+ 0xD7, 0x3C, 0x36, 0xAF, 0xCE, 0x42, 0x1C, 0xC8, 0xD7, 0xF2, 0xAB, 0x02, 0x4E, 0x6F, 0x3F, 0xA5,
+ 0x71, 0x9B, 0xB4, 0x67, 0x65, 0x17, 0x06, 0x4C, 0x7A, 0x0E, 0xF5, 0x22, 0x46, 0x11, 0x55, 0x21,
+ 0xD8, 0x27, 0x16, 0x1D, 0xB4, 0xF1, 0xA8, 0x5B, 0x9D, 0xA4, 0x4B, 0xD6, 0xEC, 0xC7, 0x20, 0x37,
+ 0x93, 0x20, 0x40, 0x12, 0x88, 0x9A, 0xE9, 0xDA, 0x63, 0x1A, 0xA4, 0xA6, 0xE1, 0x3E, 0x04, 0xE2,
+ 0x9C, 0x74, 0xDF, 0x7C, 0x4C, 0x34, 0xED, 0x58, 0xAC, 0x6B, 0x55, 0x85, 0x9A, 0xC6, 0x9E, 0x3F,
+ 0x00, 0x2F, 0x2E, 0x03, 0xED, 0x48, 0xDD, 0xC2, 0x49, 0xF5, 0x2B, 0x64, 0x76, 0xD7, 0xF5, 0x2F,
+ 0xC3, 0xE0, 0xE8, 0x56, 0x4D, 0xD4, 0x64, 0x1B, 0xBB, 0xD3, 0x1B, 0x21, 0x1F, 0x01, 0x4C, 0x32,
+ 0xD2, 0xCC, 0xFD, 0xF5, 0x38, 0x99, 0xBC, 0x40, 0x05, 0xE2, 0x02, 0xCB, 0x28, 0x92, 0xE5, 0x5D,
+ 0xFF, 0x2A, 0xBC, 0xFF, 0x98, 0x01, 0x7C, 0xEF, 0x04, 0x36, 0x50, 0xFC, 0x61, 0x35, 0xC6, 0xC1,
+ 0xB2, 0x1B, 0xCD, 0x8C, 0x38, 0x42, 0xBD, 0x8F, 0x84, 0x06, 0xBE, 0x4C, 0x3F, 0xBE, 0xF0, 0xA2,
+ 0x0A, 0x92, 0x4E, 0xD4, 0x87, 0x7E, 0x8A, 0x11, 0x0B, 0x75, 0xF6, 0x5A, 0xBD, 0x3B, 0xB5, 0x9B,
+ 0xFF, 0x39, 0x5E, 0x7E, 0x3C, 0xA1, 0xBD, 0x76, 0xAF, 0xCB, 0x1B, 0xA5, 0x48, 0x35, 0x83, 0x89,
+ 0xCF, 0xB4, 0x18, 0x37, 0xFB, 0x95, 0x34, 0x4F, 0x39, 0x29, 0x17, 0x9C, 0xBB, 0xDC, 0xF7, 0x68,
+ 0x1B, 0xFB, 0x95, 0x42, 0xED, 0xA6, 0xFE, 0xE2, 0xBE, 0x06, 0xDB, 0xE1, 0x6B, 0xC9, 0x54, 0x2F,
+ 0xA3, 0x75, 0x91, 0xBE, 0xE0, 0x55, 0x6B, 0xA5, 0xD8, 0x0E, 0xD0, 0xD0, 0x08, 0x64, 0xEE, 0xFC,
+ 0xEE, 0x7E, 0x39, 0xAC, 0x94, 0x9C, 0x3F, 0x77, 0xF2, 0xDA, 0xF5, 0xBE, 0x9F, 0x91, 0x63, 0x68,
+ 0xB6, 0xE2, 0x06, 0xAD, 0x8B, 0x1B, 0xDB, 0xE9, 0x0D, 0x87, 0x6F, 0x78, 0x6B, 0x51, 0x86, 0xE1,
+ 0x44, 0x91, 0xD7, 0x62, 0x1D, 0x7F, 0x88, 0xE8, 0x2A, 0xAD, 0x19, 0x01, 0x02, 0x76, 0x05, 0x43,
+ 0xBE, 0x1A, 0xB8, 0x36, 0xC2, 0x0D, 0x24, 0x90, 0x2E, 0x13, 0xCF, 0xFC, 0x0C, 0x3E, 0x18, 0x9D,
+ 0xBF, 0x16, 0x1E, 0xAB, 0x22, 0x5B, 0xF8, 0x72, 0xE0, 0xDF, 0xF9, 0x51, 0x73, 0xB2, 0x54, 0x99,
+ 0x32, 0x00, 0x4E, 0x06, 0x3F, 0xAA, 0x1F, 0xE5, 0x6C, 0xF0, 0x1D, 0xF5, 0xA0, 0x10, 0x2B, 0x63,
+ 0x1C, 0x65, 0xAA, 0xC6, 0x8C, 0x8D, 0x7D, 0xE5, 0xA8, 0x98, 0xBD, 0x0E, 0xE4, 0xCF, 0x06, 0x28,
+ 0x8A, 0xC3, 0xFB, 0x16, 0x2A, 0x29, 0xE7, 0xCA, 0xDC, 0xCC, 0xAB, 0xB3, 0xF1, 0x7B, 0x87, 0x76,
+ 0xBA, 0xB3, 0xA2, 0x70, 0x47, 0x08, 0x52, 0x2F, 0x3A, 0xA6, 0x30, 0x0F, 0xA8, 0x66, 0x32, 0xC3,
+ 0x0B, 0x7F, 0x19, 0x24, 0x0A, 0xE3, 0x69, 0x09, 0xD4, 0x90, 0x14, 0xE8, 0xF5, 0xD3, 0xAB, 0x7C,
+ 0xB4, 0xB4, 0x2B, 0x4C, 0xB8, 0x44, 0x90, 0xCF, 0xE4, 0xB1, 0x5C, 0xEE, 0x0E, 0xC1, 0x19, 0xFF,
+ 0x10, 0xC6, 0x9A, 0xD5, 0x32, 0x90, 0x69, 0x9D, 0xCF, 0xD4, 0x7B, 0x65, 0x39, 0x59, 0x19, 0x97,
+ 0x30, 0xB8, 0x00, 0xD1, 0xE2, 0x82, 0x61, 0xBF, 0x9C, 0x6E, 0x05, 0x6A, 0xB4, 0x36, 0x42, 0xC2,
+ 0x7A, 0xB9, 0x96, 0x6E, 0x62, 0x9C, 0x68, 0x11, 0x71, 0x87, 0x64, 0x87, 0x96, 0x80, 0x56, 0x67,
+ 0xFC, 0xDB, 0x71, 0x51, 0x87, 0x4C, 0x5C, 0xFD, 0xA2, 0x90, 0xD2, 0x0E, 0x9C, 0x52, 0xD2, 0xE7,
+ 0x49, 0x07, 0x56, 0x12, 0xA6, 0xD8, 0x8A, 0x1C, 0xAD, 0xAF, 0xA7, 0x20, 0x56, 0x1F, 0xD0, 0xCD,
+ 0x93, 0xBE, 0x4F, 0xFB, 0x60, 0xA3, 0x10, 0xB5, 0x79, 0xB5, 0x7E, 0x79, 0xF5, 0x2F, 0x57, 0xC2,
+ 0xDD, 0x23, 0x23, 0x4E, 0x91, 0xC2, 0xBD, 0x81, 0xDA, 0x48, 0x88, 0xA3, 0xDC, 0x2A, 0xF0, 0xBE,
+ 0x08, 0x00, 0xE7, 0xC6, 0xA4, 0x66, 0x16, 0x30, 0x40, 0xA5, 0xF1, 0x40, 0x1C, 0x57, 0x5F, 0x1D,
+ 0x96, 0x76, 0xF2, 0xE3, 0x71, 0xD4, 0x2E, 0x76, 0x90, 0x32, 0x4F, 0x2F, 0xF5, 0xED, 0x59, 0x2F,
+ 0x20, 0x97, 0x7A, 0x1F, 0xE1, 0xE0, 0xE4, 0x1E, 0x93, 0xF3, 0x79, 0x8B, 0xCD, 0x0B, 0x84, 0x91,
+ 0xDF, 0x35, 0x7C, 0x7F, 0xEE, 0xC9, 0x61, 0xF1, 0xFD, 0xBF, 0xFB, 0xA0, 0x09, 0x7A, 0xA1, 0xFF,
+ 0xD6, 0x13, 0x14, 0xD7, 0xEB, 0x37, 0x26, 0x31, 0x98, 0x16, 0xD8, 0xA7, 0xCE, 0x6C, 0x64, 0x71,
+ 0xE0, 0xE3, 0x5C, 0x33, 0x97, 0x9E, 0x1A, 0x25, 0x13, 0xBF, 0x05, 0x04, 0x0D, 0x11, 0xF3, 0x19,
+ 0x20, 0x43, 0x7B, 0x7D, 0x8A, 0x5F, 0x89, 0x05, 0xAC, 0x59, 0xBC, 0xDA, 0x45, 0x57, 0x30, 0xA3,
+ 0x68, 0x9F, 0x18, 0x0B, 0x9A, 0x41, 0x7E, 0x7B, 0x85, 0x8E, 0x37, 0xAE, 0x2D, 0xDE, 0x7C, 0xE8,
+ 0xB5, 0x37, 0xA7, 0xB9, 0xF0, 0xA9, 0xA4, 0x55, 0x83, 0x3F, 0x8F, 0x1E, 0x01, 0x0C, 0xF9, 0x9E,
+ 0x43, 0x5C, 0x60, 0x3F, 0x26, 0xE4, 0xBB, 0x8B, 0xAC, 0x61, 0xFF, 0x2F, 0x43, 0x1E, 0x6B, 0x0B,
+ 0xFB, 0xC9, 0x6A, 0x8C, 0x22, 0x36, 0xC1, 0x21, 0x77, 0x44, 0xFF, 0x2C, 0xF8, 0xCF, 0x29, 0x9F,
+ 0x6F, 0x3E, 0x43, 0x2B, 0xE2, 0x3F, 0x8E, 0x0F, 0xC1, 0x38, 0x2E, 0x7D, 0x25, 0x76, 0x1A, 0x10,
+ 0x19, 0xEE, 0x37, 0x05, 0xEB, 0x7A, 0x4F, 0x07, 0xD8, 0x1D, 0x0F, 0xF3, 0x50, 0x43, 0x4E, 0x67,
+ 0x85, 0x26, 0x16, 0xE5, 0x38, 0x3D, 0x3F, 0xEB, 0x4C, 0x87, 0x5E, 0xDE, 0x9E, 0xD2, 0x82, 0x04,
+ 0x5B, 0x69, 0x12, 0xEA, 0xB4, 0x8D, 0x73, 0xE0, 0xA9, 0x1A, 0xEB, 0x19, 0x89, 0xEA, 0xBF, 0x6E,
+ 0xBA, 0x6D, 0x9D, 0x2B, 0x0B, 0x6A, 0x64, 0x50, 0x9B, 0x79, 0x30, 0xB3, 0x12, 0x30, 0x89, 0x92,
+ 0x0B, 0xF8, 0x88, 0x31, 0x7E, 0xB7, 0xD0, 0x2D, 0x84, 0xFD, 0x7D, 0xE0, 0x08, 0x39, 0x84, 0x45,
+ 0xD2, 0x5E, 0x1F, 0x42, 0xEE, 0x2C, 0xF3, 0xE5, 0xBA, 0xB5, 0xA5, 0x50, 0xAB, 0xD2, 0xEB, 0xEB,
+ 0x72, 0x9A, 0xE7, 0x18, 0x7A, 0x41, 0xFE, 0x8A, 0xBB, 0x4F, 0x0B, 0x2B, 0xB7, 0xF0, 0x12, 0x12,
+ 0x58, 0xCC, 0xC1, 0x88, 0x9E, 0x20, 0xF2, 0xFA, 0x0F, 0xE5, 0x36, 0xAD, 0x64, 0x05, 0xB4, 0x1C,
+ 0xA4, 0xD8, 0x60, 0x36, 0x7C, 0xD8, 0x1F, 0xED, 0xAA, 0x51, 0x60, 0x2F, 0x1F, 0x76, 0x80, 0xB9,
+ 0x02, 0xAA, 0x2C, 0x14, 0x17, 0xE6, 0xD2, 0xFE, 0x26, 0xBA, 0xD2, 0xE5, 0xCB, 0x0B, 0x7D, 0xBE,
+ 0xCC, 0x09, 0xD9, 0xEE, 0x8D, 0x23, 0x52, 0xFB, 0x54, 0xF4, 0x9E, 0x3B, 0x2A, 0xEA, 0x91, 0x40,
+ 0x6E, 0x3B, 0x03, 0xC0, 0x82, 0x3D, 0x35, 0x72, 0xAD, 0xC5, 0xB9, 0x53, 0xA1, 0x82, 0x4E, 0xE9,
+ 0xB6, 0x99, 0x16, 0xF7, 0xE4, 0x98, 0x93, 0x70, 0xAB, 0xEB, 0x91, 0xC6, 0x7E, 0x70, 0x5D, 0x47,
+ 0xCF, 0x71, 0x5C, 0xCB, 0x61, 0x90, 0xDA, 0xD8, 0xF1, 0x41, 0xA5, 0x85, 0xA2, 0x4A, 0x9A, 0x15,
+ 0xA3, 0x9D, 0x4A, 0xC9, 0x42, 0x9A, 0x41, 0x67, 0x68, 0x02, 0xC1, 0x8D, 0x5F, 0xD5, 0x7F, 0xDF,
+ 0x8F, 0x08, 0xE9, 0x96, 0xF9, 0x8A, 0x43, 0x30, 0xA6, 0x2F, 0x46, 0x31, 0xCC, 0x73, 0x16, 0x31,
+ 0xF5, 0x56, 0x19, 0x7B, 0x99, 0xC1, 0xF0, 0xA3, 0x54, 0x90, 0xFF, 0x1E, 0x81, 0xCB, 0x88, 0x50,
+ 0x64, 0x9F, 0x23, 0xFC, 0xB5, 0x12, 0x24, 0xDC, 0xD2, 0x6B, 0x22, 0x5C, 0xED, 0xA3, 0xF2, 0x8B,
+ 0x0E, 0xE9, 0xD4, 0x8B, 0xAF, 0x94, 0x0B, 0xA4, 0x7B, 0x25, 0x88, 0xD8, 0x4A, 0x5E, 0x33, 0x85,
+ 0x5B, 0xD0, 0xD4, 0x50, 0xA4, 0xB2, 0xE5, 0x18, 0x7B, 0x7B, 0xEE, 0xCB, 0xF0, 0xDA, 0xF5, 0x18,
+ 0xD8, 0x5C, 0x22, 0x0B, 0x11, 0xDE, 0x02, 0x1F, 0xF8, 0xC6, 0x0D, 0x75, 0x36, 0xCA, 0x82, 0xCE,
+ 0x46, 0x31, 0x8C, 0x5E, 0x6A, 0x28, 0x3E, 0xD5, 0x3F, 0xB7, 0x16, 0x31, 0x13, 0x6A, 0x14, 0x59,
+ 0x88, 0x6A, 0x55, 0x65, 0x8A, 0x21, 0xD5, 0x48, 0xD3, 0x4A, 0xD1, 0x70, 0xF4, 0x3B, 0x72, 0xC2,
+ 0x8D, 0x1E, 0x28, 0xAF, 0x41, 0x7B, 0xC2, 0x0C, 0x82, 0x6C, 0x3D, 0xD9, 0x25, 0x48, 0x6C, 0xD9,
+ 0x49, 0x0F, 0x8A, 0xDF, 0x27, 0x6E, 0x1E, 0x21, 0xB7, 0x65, 0x5A, 0x8F, 0x89, 0x4E, 0x3F, 0x82,
+ 0x47, 0xBF, 0x7C, 0x21, 0x91, 0x75, 0x10, 0x55, 0x54, 0x21, 0x95, 0xE3, 0xDC, 0x4F, 0x12, 0x0C,
+ 0x1B, 0x55, 0xC2, 0xBE, 0x85, 0x60, 0x57, 0xB3, 0x70, 0x31, 0x54, 0xD3, 0x53, 0x84, 0xB6, 0x93,
+ 0xB5, 0x68, 0xC2, 0x14, 0x80, 0xC9, 0x91, 0x32, 0x87, 0x96, 0xFA, 0x20, 0x03, 0xC2, 0xBE, 0xC2,
+ 0x42, 0xDC, 0x4D, 0x28, 0xC4, 0xC1, 0x95, 0x5D, 0xCF, 0x4D, 0xFE, 0xFA, 0x09, 0x43, 0x4F, 0xC2,
+ 0x30, 0x65, 0xC4, 0x55, 0xDE, 0x05, 0x6C, 0x29, 0xFA, 0xDD, 0x9C, 0x17, 0x9F, 0x05, 0x89, 0xD9,
+ 0xA8, 0x97, 0x46, 0x8C, 0x85, 0x81, 0xFC, 0x99, 0x72, 0x4F, 0x0A, 0xA0, 0x8F, 0xF3, 0x25, 0x89,
+ 0xBA, 0xDD, 0x63, 0x53, 0x6B, 0xA7, 0x15, 0x20, 0x14, 0x92, 0x88, 0x51, 0x23, 0x82, 0xA3, 0x9D,
+ 0x0D, 0xC2, 0x79, 0xB7, 0xA3, 0x18, 0x88, 0xC9, 0xE0, 0xB0, 0x56, 0x8F, 0x16, 0x16, 0x36, 0xAA,
+ 0x40, 0xC9, 0x61, 0x41, 0x30, 0x82, 0x65, 0x2F, 0x81, 0x57, 0xD3, 0x86, 0x90, 0x05, 0xC4, 0x44,
+ 0x04, 0x12, 0xC8, 0x1B, 0xB8, 0x4D, 0x6A, 0x06, 0x1B, 0x9F, 0xEF, 0xC0, 0xA3, 0xE9, 0x9B, 0xEA,
+ 0x70, 0xC0, 0xCE, 0x73, 0x89, 0x5F, 0x6D, 0x0C, 0x9B, 0x4C, 0x3B, 0x96, 0xB2, 0x8B, 0x6B, 0xF5,
+ 0x07, 0x00, 0xE4, 0x30, 0xED, 0xE0, 0xB6, 0xF0, 0xB5, 0xF8, 0x1D, 0xFB, 0xCC, 0xC9, 0x10, 0x66,
+ 0x5B, 0xE0, 0x15, 0xFB, 0x1D, 0xB7, 0x5C, 0x67, 0x7F, 0x52, 0xD5, 0xA0, 0xF0, 0x9A, 0x6D, 0x37,
+ 0xA7, 0x1B, 0xBD, 0x1F, 0x7B, 0xF9, 0x82, 0x11, 0x98, 0x7D, 0x27, 0x0B, 0xF5, 0x31, 0x5F, 0x20,
+ 0x8D, 0x47, 0xA0, 0xB4, 0xD3, 0x59, 0x4B, 0x17, 0xF9, 0xA2, 0x38, 0x66, 0x31, 0x3F, 0x02, 0xCD,
+ 0x5D, 0xBE, 0x5B, 0x06, 0x17, 0xD7, 0xEC, 0xC4, 0xD1, 0x67, 0x97, 0x49, 0xBA, 0x1D, 0xE5, 0xCD,
+ 0x8E, 0xCF, 0x0D, 0xCD, 0x6B, 0xAB, 0x9A, 0xDA, 0x2F, 0x3F, 0x62, 0xDF, 0xFA, 0xE5, 0xEC, 0x50,
+ 0x6D, 0x62, 0xCB, 0x0F, 0x53, 0xC7, 0x8A, 0x33, 0xF5, 0xB2, 0x8D, 0xFD, 0x85, 0x31, 0x06, 0xE3,
+ 0xCE, 0x77, 0xB6, 0x8B, 0x2A, 0xC7, 0xC2, 0x72, 0xD5, 0xA9, 0x06, 0xBF, 0xAF, 0x76, 0x6F, 0xC2,
+ 0x62, 0x31, 0x9A, 0x89, 0x87, 0xE7, 0x54, 0xD4, 0x8F, 0x32, 0x31, 0x40, 0xE8, 0xAF, 0x82, 0x6C,
+ 0x69, 0x18, 0x19, 0x25, 0x74, 0xF0, 0xD1, 0xEB, 0x43, 0x71, 0x50, 0x20, 0xCD, 0x84, 0xE9, 0x94,
+ 0x86, 0x17, 0xA0, 0xF9, 0xB8, 0x65, 0xFE, 0x48, 0x81, 0x57, 0xCE, 0x0F, 0xA7, 0xF3, 0x28, 0x3F,
+ 0x02, 0x0D, 0xD9, 0x78, 0x7A, 0x2F, 0x9F, 0x36, 0xAD, 0x8D, 0x47, 0x76, 0x51, 0xA7, 0x95, 0xF2,
+ 0xE3, 0x20, 0xDB, 0x57, 0x7F, 0xA9, 0x26, 0x29, 0xF1, 0x0F, 0xF7, 0xAB, 0x2F, 0x7B, 0x2F, 0xEB,
+ 0x96, 0x6C, 0xFD, 0xAA, 0x25, 0x21, 0x35, 0x38, 0x89, 0xFF, 0xAE, 0xCD, 0x5F, 0xA0, 0xFE, 0x0F,
+ 0x57, 0x70, 0xC0, 0x65, 0x49, 0xA6, 0x5E, 0x3F, 0xB5, 0x24, 0x8A, 0x46, 0x32, 0xA1, 0x12, 0xC0,
+ 0x79, 0x0B, 0xD6, 0xE4, 0x26, 0x21, 0x90, 0x25, 0xB6, 0x81, 0xE5, 0x84, 0xB9, 0x4E, 0x78, 0xFF,
+ 0x44, 0xB7, 0xDB, 0xD5, 0xE2, 0x9B, 0x46, 0xBF, 0xB9, 0x5F, 0xC5, 0x70, 0xCC, 0xD3, 0xA2, 0x77,
+ 0xAE, 0xAC, 0xCE, 0x52, 0x08, 0x52, 0x34, 0x6C, 0x41, 0xDA, 0xD6, 0x03, 0x87, 0x71, 0xFB, 0xD6,
+ 0x2B, 0xFC, 0x64, 0x89, 0x9F, 0x5D, 0x1C, 0x4E, 0xEE, 0x2F, 0xE5, 0xAC, 0x01, 0x31, 0x46, 0x63,
+ 0x12, 0x45, 0x79, 0x41, 0x93, 0x0C, 0x1A, 0x6B, 0x3E, 0x73, 0x25, 0xCE, 0xD9, 0x35, 0x87, 0xBD,
+ 0x9F, 0x30, 0xBC, 0x82, 0xA8, 0x47, 0xCE, 0x8F, 0x48, 0x77, 0x26, 0x71, 0xCB, 0x9B, 0xD3, 0x1A,
+ 0x79, 0x2A, 0x29, 0x78, 0x7C, 0x6D, 0x5A, 0x72, 0x01, 0x0B, 0xE1, 0x46, 0x32, 0x65, 0x9D, 0x2B,
+ 0xD4, 0xD6, 0x28, 0x1F, 0xB2, 0x23, 0xA9, 0xF6, 0x62, 0x2F, 0xCD, 0x99, 0x6C, 0x5D, 0x03, 0x5D,
+ 0xA0, 0x7A, 0xC4, 0x05, 0x82, 0x71, 0xB3, 0xC3, 0x2B, 0x9B, 0xC5, 0x47, 0x22, 0x84, 0x29, 0x23,
+ 0xB7, 0x7D, 0xAF, 0xFA, 0xB7, 0x00, 0x10, 0xC9, 0xAB, 0xCF, 0xD6, 0xEA, 0x24, 0xE3, 0x4A, 0x29,
+ 0xDE, 0xD4, 0x93, 0x95, 0x44, 0xC5, 0xD7, 0xEC, 0xA9, 0x2C, 0x31, 0x82, 0x12, 0x7E, 0x21, 0x47,
+ 0x1C, 0x5A, 0xD5, 0xA1, 0x19, 0x9A, 0x57, 0x42, 0x46, 0x70, 0x94, 0x6A, 0xC0, 0xC6, 0x66, 0xA9,
+ 0x88, 0xB6, 0x52, 0x5E, 0xB8, 0xB3, 0x09, 0x84, 0xF5, 0x0B, 0xF1, 0x2E, 0x89, 0x0B, 0x01, 0xD0,
+ 0x40, 0xFC, 0x97, 0xC4, 0xE4, 0xF0, 0x99, 0x1E, 0x48, 0xA5, 0x20, 0x0B, 0x4F, 0xF4, 0xA7, 0x6E,
+ 0xB5, 0x78, 0xB8, 0x80, 0xFB, 0x5C, 0x51, 0x6B, 0xE3, 0x4E, 0x94, 0xF3, 0x94, 0xAC, 0xCC, 0xBB,
+ 0xA4, 0x39, 0x78, 0x67, 0xF9, 0x43, 0x73, 0x63, 0x6E, 0xC0, 0x51, 0xFB, 0xEA, 0xEE, 0x85, 0x57,
+ 0xD4, 0x16, 0xEB, 0xB0, 0x36, 0x1E, 0x2A, 0x80, 0x8A, 0x63, 0x7B, 0x91, 0xB0, 0x6A, 0xA7, 0xC5,
+ 0x59, 0x93, 0x04, 0x1E, 0x44, 0x52, 0x02, 0xB2, 0xBB, 0xEF, 0x23, 0x07, 0x2F, 0x41, 0x93, 0x80,
+ 0x4A, 0x3E, 0x2B, 0x4A, 0x83, 0x79, 0x65, 0x1E, 0x02, 0x58, 0xD5, 0x3E, 0x51, 0xFF, 0x5F, 0x8A,
+ 0x3E, 0x09, 0x90, 0x02, 0xAF, 0x57, 0xCF, 0x0F, 0x30, 0x78, 0x2F, 0x0D, 0x50, 0x51, 0xA9, 0x24,
+ 0xD2, 0x10, 0xB5, 0xE2, 0x3E, 0xD5, 0x53, 0xA2, 0xD9, 0xC6, 0x9C, 0xBC, 0xEB, 0x26, 0xAB, 0xEE,
+ 0x3B, 0x0E, 0x26, 0x03, 0x54, 0x73, 0x0E, 0x58, 0xDA, 0x92, 0x00, 0xA7, 0x2A, 0xDC, 0xA7, 0xD2,
+ 0x4B, 0x78, 0x20, 0x88, 0x5D, 0x11, 0x43, 0x15, 0x67, 0xB5, 0xC2, 0x31, 0x78, 0xD7, 0xCB, 0x5A,
+ 0x1A, 0x04, 0x38, 0xAF, 0x1A, 0xDB, 0x24, 0x90, 0x5F, 0xF0, 0xB3, 0x11, 0xB9, 0x68, 0x9A, 0x8B,
+ 0x1B, 0x28, 0xCA, 0x51, 0x63, 0x8C, 0xD2, 0x70, 0xA9, 0x8B, 0x42, 0x69, 0x86, 0x2E, 0x46, 0x5F,
+ 0x85, 0xA7, 0x80, 0x4D, 0x70, 0x1E, 0xAE, 0x08, 0xD2, 0xFC, 0xCF, 0x5E, 0xDB, 0x41, 0x9F, 0x21,
+ 0xEF, 0xA6, 0x64, 0x38, 0xE7, 0x73, 0xEF, 0xEA, 0xF9, 0x31, 0x61, 0x67, 0xEF, 0xD5, 0x21, 0x44,
+ 0xD9, 0x28, 0xB0, 0x6D, 0xD6, 0x11, 0xF9, 0x28, 0x02, 0x99, 0x84, 0x11, 0x8A, 0xFB, 0x56, 0xF8,
+ 0x37, 0x98, 0xDC, 0x90, 0x22, 0x13, 0xE3, 0x37, 0xBF, 0x9A, 0xD4, 0x05, 0xBF, 0x69, 0x76, 0xE1,
+ 0x70, 0x90, 0x81, 0x72, 0xA5, 0x7A, 0x19, 0x6B, 0x68, 0x13, 0xF1, 0x05, 0xA4, 0xFB, 0xBA, 0x6F,
+ 0x13, 0xCB, 0x15, 0xA4, 0x5D, 0x09, 0x47, 0x4A, 0xD0, 0x50, 0x34, 0x00, 0x45, 0xB8, 0xDF, 0x5E,
+ 0x89, 0x02, 0x50, 0x42, 0x65, 0xDF, 0xB7, 0x46, 0x59, 0x35, 0x81, 0xD9, 0x7D, 0xB6, 0x1E, 0x84,
+ 0x41, 0x08, 0xBA, 0xFA, 0x2B, 0xBB, 0x85, 0x92, 0x0A, 0x9C, 0x9F, 0x9E, 0x8F, 0xE2, 0x7A, 0xF7,
+ 0x6F, 0x5D, 0x8D, 0x0B, 0xA8, 0xE1, 0x02, 0x94, 0x54, 0x76, 0xFB, 0xD0, 0x80, 0xEA, 0x66, 0x17,
+ 0xE5, 0x76, 0x96, 0xF9, 0xC1, 0xB1, 0xA6, 0x7B, 0x3C, 0x7C, 0xA8, 0x0B, 0x4E, 0x28, 0x8B, 0x46,
+ 0xFE, 0x0B, 0xCC, 0x57, 0x41, 0x54, 0x37, 0x49, 0x28, 0x19, 0xD8, 0x43, 0xBF, 0x59, 0x76, 0x59,
+ 0x37, 0x71, 0xD5, 0x19, 0x99, 0xD2, 0xA3, 0xD8, 0x0A, 0x09, 0x58, 0xF4, 0xEE, 0xC6, 0xF4, 0x47,
+ 0xD7, 0xB3, 0xB4, 0x42, 0x74, 0x71, 0x23, 0xF8, 0xE0, 0x76, 0xA1, 0x91, 0x28, 0xE8, 0xE6, 0xFD,
+ 0x38, 0x13, 0x02, 0xD0, 0x07, 0x4C, 0x06, 0x1B, 0xB8, 0x18, 0xA5, 0xB3, 0x0F, 0xBF, 0x06, 0xBB,
+ 0x40, 0xD7, 0xE2, 0xE1, 0x54, 0xAC, 0x3F, 0x40, 0x5E, 0x68, 0x08, 0xA6, 0xF2, 0x7B, 0xA7, 0x97,
+ 0xFE, 0x05, 0x75, 0x41, 0x99, 0xBB, 0xCB, 0x2D, 0xC9, 0xE9, 0x41, 0x69, 0xA5, 0x69, 0x51, 0xC0,
+ 0x85, 0xD9, 0x3D, 0x82, 0x09, 0xF8, 0x91, 0xCB, 0xE1, 0x89, 0xA6, 0xD1, 0x30, 0xBF, 0xF7, 0xFC,
+ 0x5E, 0x23, 0xBB, 0x66, 0x65, 0x17, 0x2B, 0x96, 0xF2, 0xA0, 0xF3, 0xA0, 0xDA, 0xF2, 0x5B, 0x2A,
+ 0xDA, 0x20, 0x25, 0x1C, 0x7B, 0x3E, 0x42, 0xEC, 0xFC, 0xA0, 0x75, 0x1C, 0xDA, 0x96, 0x37, 0x40,
+ 0xF9, 0xD7, 0x6C, 0xA5, 0x2D, 0xE1, 0x9C, 0x69, 0x7D, 0xB3, 0x07, 0x8E, 0xC7, 0xE8, 0x8A, 0x24,
+ 0xDF, 0x77, 0x18, 0x4C, 0xCC, 0xAE, 0x1A, 0x5F, 0xF9, 0xC4, 0x21, 0x77, 0xFA, 0x2B, 0xA7, 0x2C,
+ 0xC3, 0xB4, 0x85, 0x3B, 0x2D, 0x34, 0xF7, 0x2D, 0xFA, 0xE8, 0x42, 0xDA, 0x7D, 0x4B, 0x18, 0x40,
+ 0xC6, 0xC6, 0x4B, 0xE4, 0xCE, 0x64, 0x97, 0x46, 0xC1, 0xA0, 0x32, 0x1C, 0xA4, 0xBB, 0xA0, 0x6C,
+ 0x49, 0xE9, 0x80, 0x46, 0x08, 0xA8, 0x1B, 0x30, 0x5E, 0x79, 0x54, 0x74, 0xE2, 0x0C, 0xC3, 0xD5,
+ 0x5C, 0x27, 0xD0, 0x0C, 0x30, 0xDC, 0x24, 0x47, 0x51, 0x78, 0xF5, 0x42, 0x37, 0xE2, 0x13, 0x4D,
+ 0x6B, 0x1C, 0x3B, 0x92, 0xF6, 0x70, 0xEE, 0x29, 0x04, 0xDF, 0x61, 0x68, 0x7E, 0xC9, 0xF2, 0xA8,
+ 0x9B, 0x0A, 0xD3, 0xC8, 0x2E, 0x34, 0x9B, 0x35, 0xE1, 0xD4, 0x7F, 0x15, 0x1B, 0x77, 0xDE, 0xF6,
+ 0x17, 0x44, 0xE8, 0xDA, 0xDF, 0x5D, 0xE1, 0xEE, 0xA2, 0x4B, 0xBE, 0x7E, 0x69, 0xFA, 0x01, 0x27,
+ 0x3F, 0x2C, 0xA6, 0x59, 0x4C, 0x63, 0x68, 0x48, 0x66, 0xC9, 0x43, 0xAB, 0x2A, 0x44, 0x20, 0xC7,
+ 0x04, 0x29, 0x0A, 0xA5, 0x83, 0x8C, 0xD7, 0x84, 0xE0, 0x87, 0xBB, 0x16, 0xBF, 0xC3, 0xBD, 0xC9,
+ 0x84, 0x41, 0x15, 0x9A, 0xDC, 0x67, 0xD8, 0x08, 0xB1, 0x89, 0xE1, 0xDC, 0x4C, 0x66, 0xFA, 0x64,
+ 0x1E, 0x21, 0xC8, 0x89, 0x1F, 0xC3, 0x74, 0x82, 0xB9, 0x88, 0x2B, 0x05, 0xA4, 0x95, 0xB2, 0x50,
+ 0xE6, 0xC2, 0x85, 0xC6, 0x4B, 0xE1, 0x7E, 0xB0, 0x63, 0x29, 0x9C, 0x2E, 0x51, 0x52, 0xB8, 0xB9,
+ 0xC6, 0x00, 0xE1, 0x7C, 0xA8, 0xFD, 0x41, 0x6D, 0xF0, 0x6E, 0x20, 0x53, 0xB6, 0x2E, 0x2A, 0x42,
+ 0xD7, 0xDF, 0x0F, 0xA5, 0x4E, 0x77, 0xC9, 0xEF, 0xBA, 0x71, 0xA7, 0x51, 0x39, 0xB1, 0xDB, 0xF6,
+ 0x81, 0x67, 0x0E, 0x87, 0x87, 0xE6, 0x47, 0x89, 0xC7, 0xF3, 0xDD, 0xB4, 0x6C, 0xA5, 0x53, 0x83,
+ 0xBF, 0xD7, 0xEC, 0xBE, 0xED, 0x8A, 0xAD, 0xE2, 0x31, 0x43, 0x9E, 0x2C, 0xBE, 0xAD, 0x0F, 0x60,
+ 0xA9, 0xEA, 0xB2, 0x95, 0x0B, 0xBE, 0x13, 0x3C, 0x98, 0x9C, 0xED, 0x0A, 0x04, 0x36, 0xBD, 0x7A,
+ 0x9F, 0x21, 0x41, 0x17, 0xA4, 0x89, 0x01, 0x62, 0xD5, 0x3C, 0xCF, 0xF9, 0xD7, 0x68, 0x4B, 0x3A,
+ 0xF4, 0x89, 0x10, 0x08, 0x10, 0x0C, 0xC5, 0x7C, 0xAD, 0x97, 0x24, 0x7C, 0xF5, 0x52, 0xB6, 0x65,
+ 0xEE, 0x3F, 0x76, 0x81, 0x41, 0xDF, 0x19, 0x8C, 0x75, 0x1D, 0x8E, 0x09, 0xCA, 0x60, 0xBD, 0x29,
+ 0x91, 0x68, 0x2C, 0x4C, 0x23, 0x90, 0x75, 0x27, 0x7F, 0xA5, 0x40, 0xB8, 0xAC, 0xE8, 0xFC, 0xDB,
+ 0xCB, 0xDD, 0x2A, 0xFA, 0x8A, 0x76, 0x3D, 0x9D, 0xF7, 0x74, 0x16, 0x7C, 0x31, 0x6A, 0x88, 0x93,
+ 0x95, 0xD6, 0x5F, 0xE8, 0xBE, 0x1B, 0x0C, 0x4D, 0x65, 0xC1, 0xF6, 0x0D, 0x8E, 0xC9, 0x71, 0x13,
+ 0x61, 0x26, 0xBD, 0xB5, 0xFD, 0x16, 0xDF, 0xE1, 0x2E, 0x36, 0x8C, 0xA8, 0x51, 0xB7, 0x9B, 0xB1,
+ 0x69, 0x35, 0xD1, 0xF6, 0x09, 0x3D, 0x09, 0xB7, 0xDD, 0xAC, 0x39, 0xBD, 0x3F, 0x1D, 0xA6, 0xB8,
+ 0xA2, 0xE8, 0x70, 0x17, 0x9F, 0x49, 0xF9, 0x29, 0x48, 0xDF, 0xA3, 0xBF, 0x95, 0x8C, 0xD2, 0x8E,
+ 0x32, 0xD1, 0xDD, 0x98, 0x49, 0xC8, 0xBC, 0xA2, 0xAD, 0x99, 0x5A, 0xB4, 0x33, 0x51, 0x3D, 0xB8,
+ 0x6E, 0xA3, 0x72, 0xDD, 0xEF, 0x45, 0x51, 0xEC, 0x06, 0x8D, 0xFE, 0x15, 0xA9, 0x76, 0x69, 0xA1,
+ 0xAF, 0x75, 0x1B, 0xE7, 0x8E, 0xDE, 0x4B, 0xF7, 0x49, 0xDC, 0x66, 0xAA, 0xBE, 0xDA, 0x01, 0x18,
+ 0xA7, 0x2A, 0x11, 0xA3, 0x16, 0xF7, 0x29, 0x2C, 0x97, 0xCC, 0x2B, 0x54, 0xBC, 0xEF, 0x9F, 0x94,
+ 0xC8, 0xA4, 0xB8, 0x87, 0x01, 0x3F, 0x0C, 0x69, 0xD5, 0xE9, 0xB9, 0x71, 0x30, 0x9B, 0xAC, 0x1B,
+ 0x1F, 0xB2, 0xC0, 0x67, 0x52, 0x78, 0x91, 0xBA, 0x3F, 0x2F, 0xC3, 0x5C, 0x80, 0x39, 0x70, 0x1C,
+ 0x7E, 0x07, 0x71, 0x70, 0x9D, 0x95, 0x6D, 0xE2, 0x0A, 0x5D, 0x1E, 0x19, 0x06, 0x9A, 0x85, 0xE1,
+ 0x2E, 0xD5, 0xFA, 0x02, 0x2E, 0x32, 0x53, 0xAD, 0x05, 0x2F, 0xEC, 0x08, 0x7E, 0xDD, 0x71, 0x9D,
+ 0x34, 0xFC, 0x9D, 0x0D, 0x44, 0x4E, 0x3E, 0x20, 0x00, 0xA8, 0x76, 0x02, 0xF8, 0xBF, 0x6B, 0x9F,
+ 0x4A, 0x60, 0x99, 0xA1, 0x74, 0x4B, 0xB9, 0x91, 0x16, 0x4D, 0x41, 0xC5, 0xA1, 0x33, 0xD3, 0x90,
+ 0x8A, 0x2F, 0x83, 0x92, 0x8B, 0x53, 0x1D, 0x29, 0x8F, 0x97, 0xD8, 0xA0, 0x48, 0x63, 0xB4, 0x43,
+ 0x20, 0x82, 0xC7, 0xC2, 0x0A, 0x7F, 0xFB, 0x07, 0x74, 0x31, 0x54, 0x2A, 0xCB, 0xCA, 0x7E, 0xD6,
+ 0x91, 0x6B, 0x82, 0x73, 0x51, 0x66, 0x7B, 0xDF, 0x63, 0x53, 0x08, 0xFC, 0x17, 0x20, 0xA9, 0x87,
+ 0x1D, 0x24, 0xD0, 0x44, 0x45, 0xBC, 0x80, 0x80, 0x4B, 0x52, 0x90, 0x4E, 0xA5, 0xDF, 0xD1, 0x3F,
+ 0xA9, 0xCC, 0xD7, 0xD9, 0xAD, 0x1F, 0x65, 0x63, 0xA6, 0x57, 0x85, 0x39, 0x98, 0x33, 0xE8, 0xBC,
+ 0xF5, 0xE2, 0xD2, 0x4B, 0xF7, 0xEA, 0x61, 0xE3, 0xFA, 0xF3, 0x73, 0x6C, 0xA2, 0x0A, 0x26, 0xCB,
+ 0x09, 0x2E, 0xC4, 0x03, 0x38, 0x97, 0x7A, 0x3A, 0xC7, 0xB0, 0x0C, 0x35, 0x6D, 0x73, 0x14, 0x70,
+ 0x01, 0xF6, 0x8F, 0x67, 0xBA, 0xD9, 0x4E, 0xAF, 0xEA, 0x96, 0x3D, 0xC6, 0x7E, 0xE7, 0x2B, 0x29,
+ 0x27, 0xAB, 0xFA, 0xA8, 0x08, 0xB1, 0x01, 0x20, 0xF3, 0xD1, 0x45, 0x35, 0x33, 0x56, 0x26, 0x81,
+ 0x00, 0xB2, 0x41, 0x01, 0x1A, 0x71, 0x28, 0x35, 0xF4, 0x43, 0x2F, 0x48, 0x59, 0x69, 0x22, 0x5A,
+ 0x89, 0x8D, 0xC7, 0x38, 0x5F, 0x12, 0x40, 0x65, 0x7B, 0x89, 0x06, 0x76, 0x74, 0x08, 0xE5, 0xFC,
+ 0x83, 0x61, 0x2B, 0xAF, 0xB4, 0xE0, 0xE4, 0x51, 0x4D, 0xF7, 0x31, 0x09, 0x0A, 0xC0, 0xB9, 0x47,
+ 0x23, 0xCB, 0xF7, 0x90, 0x86, 0x65, 0x27, 0xF3, 0x65, 0xBF, 0x52, 0xAF, 0x4A, 0x3E, 0xBF, 0x0C,
+ 0x9E, 0xC9, 0x6D, 0x4D, 0xD6, 0x64, 0x77, 0x59, 0x2B, 0x88, 0x6B, 0xD7, 0x7E, 0xBF, 0x8F, 0x53,
+ 0x48, 0xD8, 0x9E, 0x6E, 0x7E, 0x16, 0x60, 0x4C, 0xE9, 0x33, 0x83, 0x01, 0x74, 0xCD, 0x1F, 0x8B,
+ 0x4F, 0x3A, 0xEA, 0xCC, 0x45, 0xEE, 0x8F, 0xEA, 0x0C, 0x40, 0x76, 0xA7, 0xDF, 0x69, 0xFE, 0xD4,
+ 0xD3, 0x23, 0x93, 0x07, 0x77, 0x8D, 0xCD, 0x20, 0xE9, 0x71, 0xB7, 0xFA, 0xFB, 0x27, 0x6D, 0x0A,
+ 0xBC, 0x1E, 0xFE, 0x49, 0x2B, 0x15, 0x68, 0x9B, 0x58, 0x3A, 0xA7, 0xC5, 0xB8, 0x17, 0xA3, 0xAA,
+ 0xCF, 0xF7, 0x91, 0x2E, 0xF2, 0xFC, 0xA4, 0xDC, 0x50, 0xB3, 0x19, 0x5C, 0x85, 0xA2, 0x89, 0x8C,
+ 0xBB, 0x9A, 0x12, 0x45, 0xC9, 0x06, 0x36, 0xA3, 0x10, 0x3F, 0x4A, 0x0E, 0x08, 0x7F, 0xF9, 0x45,
+ 0x09, 0xBC, 0xD5, 0xAC, 0x56, 0x6F, 0xB4, 0xC1, 0x15, 0x4E, 0xD4, 0x55, 0xD1, 0xF4, 0x97, 0x19,
+ 0x7E, 0x88, 0x4E, 0xA7, 0x95, 0x5B, 0x89, 0xF9, 0x4A, 0x7A, 0xDD, 0x69, 0xB9, 0xEF, 0xB6, 0x1D,
+ 0x68, 0x98, 0xAB, 0xBE, 0xF9, 0x10, 0x12, 0x79, 0xC0, 0x2E, 0x08, 0x8B, 0xD4, 0xFE, 0xFB, 0x33,
+ 0xF5, 0x17, 0x6F, 0x71, 0x71, 0xD9, 0x95, 0x08, 0xBC, 0x05, 0x71, 0x6A, 0x54, 0x99, 0x80, 0x94,
+ 0x8A, 0x92, 0x2B, 0x1A, 0x52, 0x60, 0x53, 0xAC, 0xB0, 0x58, 0xE1, 0x97, 0xC6, 0xAB, 0x1A, 0x81,
+ 0x89, 0xBE, 0x60, 0xB1, 0x16, 0x79, 0xED, 0x3D, 0xE5, 0x31, 0xA2, 0x35, 0x74, 0x26, 0xAE, 0xFF,
+ 0xEB, 0x7D, 0x62, 0xD0, 0x08, 0x00, 0x44, 0x9C, 0xBA, 0x22, 0x1F, 0x4D, 0x12, 0x1C, 0xF6, 0xEF,
+ 0x43, 0x31, 0xBA, 0x80, 0xB7, 0x21, 0x2C, 0xAA, 0x0C, 0x47, 0xAA, 0x50, 0xC9, 0xE5, 0x9B, 0x6F,
+ 0xAF, 0x69, 0x92, 0xD6, 0x72, 0x73, 0xAE, 0x2D, 0x7B, 0x60, 0x91, 0x0B, 0xC5, 0x48, 0x4D, 0xE4,
+ 0x1B, 0x92, 0xC5, 0x60, 0x81, 0xF5, 0x96, 0xD5, 0x19, 0x72, 0x39, 0xF6, 0xC7, 0x47, 0x81, 0x3C,
+ 0x2E, 0x5D, 0xDA, 0xBE, 0xAE, 0xF0, 0x04, 0x40, 0x2C, 0x0F, 0x98, 0x91, 0x2A, 0xB3, 0x2B, 0x90,
+ 0xCD, 0x31, 0x92, 0x75, 0x9A, 0x93, 0x51, 0x83, 0x74, 0xCD, 0xFE, 0x53, 0x00, 0x99, 0xAE, 0x49,
+ 0x47, 0x4B, 0x4F, 0x04, 0x70, 0xEE, 0x58, 0x4D, 0x84, 0x97, 0x7C, 0x75, 0x46, 0xBC, 0x64, 0xC7,
+ 0x85, 0xA9, 0x0A, 0x7D, 0x5C, 0x6C, 0x9A, 0x21, 0x0B, 0x2A, 0x16, 0xF6, 0x96, 0xE6, 0x35, 0x6B,
+ 0x59, 0xB1, 0xBB, 0xF7, 0xC2, 0x24, 0x33, 0x52, 0x79, 0x55, 0x33, 0x8D, 0xE6, 0xD0, 0xD8, 0xA7,
+ 0xE5, 0x18, 0x5F, 0xF3, 0xE1, 0xE4, 0x23, 0xFF, 0xBF, 0x16, 0xDC, 0xFE, 0x5F, 0x32, 0x99, 0x2B,
+ 0x22, 0x1A, 0x77, 0x2A, 0xAD, 0x04, 0x07, 0x3C, 0x15, 0xBF, 0x99, 0x53, 0x9C, 0x29, 0x2B, 0x67,
+ 0xAF, 0xDD, 0x51, 0x89, 0x03, 0x85, 0xFF, 0x64, 0x2E, 0x1D, 0x0B, 0x03, 0x32, 0xB9, 0x51, 0xB8,
+ 0xE4, 0x9F, 0x54, 0x49, 0xC4, 0x32, 0x0F, 0x99, 0x34, 0xB3, 0x51, 0xE9, 0x2D, 0x75, 0xF3, 0xF8,
+ 0x04, 0x86, 0x6B, 0x84, 0xB0, 0x97, 0x95, 0xF4, 0x38, 0x4C, 0x8C, 0x88, 0x49, 0x48, 0x9E, 0x59,
+ 0x0E, 0x8B, 0xB1, 0xE1, 0x41, 0x66, 0x10, 0x94, 0x59, 0xF9, 0x6E, 0x78, 0xCC, 0x11, 0x80, 0x92,
+ 0x33, 0x7E, 0x6A, 0xB8, 0xC9, 0x33, 0xE8, 0xDD, 0x1B, 0x3F, 0x74, 0x79, 0x42, 0x5C, 0x93, 0x00,
+ 0x4B, 0x68, 0xDA, 0x70, 0x8A, 0xB5, 0x24, 0xFD, 0x6B, 0x14, 0xF8, 0x1A, 0x26, 0x6A, 0x21, 0x36,
+ 0x7C, 0xF6, 0x49, 0x44, 0xB4, 0xA6, 0x59, 0xF3, 0x00, 0x76, 0xC5, 0x8A, 0x30, 0xF4, 0x9C, 0x13,
+ 0xC9, 0xB2, 0xCE, 0xF1, 0x3F, 0xAB, 0x75, 0xD6, 0x4F, 0x36, 0xEA, 0x86, 0x12, 0x7A, 0x9A, 0x54,
+ 0x68, 0xEA, 0x13, 0xF4, 0x39, 0xC1, 0xC5, 0x70, 0x22, 0x79, 0x21, 0x0D, 0x7B, 0x47, 0x02, 0x97,
+ 0x14, 0xFF, 0xD2, 0xBE, 0x99, 0x84, 0x0F, 0x3E, 0xDF, 0xA5, 0x64, 0x98, 0xDF, 0xF8, 0xAA, 0xA2,
+ 0xD2, 0xED, 0xE8, 0x6E, 0x41, 0xF4, 0x04, 0x3C, 0xE8, 0x39, 0x80, 0x07, 0xBA, 0x7A, 0xCF, 0x69,
+ 0x32, 0xDB, 0x7B, 0x72, 0x56, 0xE4, 0x1A, 0xA9, 0x87, 0xB2, 0x32, 0x3F, 0xD9, 0xF4, 0x3F, 0x4B,
+ 0x04, 0xF2, 0xE1, 0x55, 0xD0, 0xED, 0x5D, 0xD9, 0x57, 0x7A, 0x04, 0x08, 0x05, 0x68, 0x15, 0x7B,
+ 0x41, 0x61, 0x73, 0x52, 0x7C, 0xC9, 0x23, 0x30, 0x7A, 0x2F, 0xA4, 0xDF, 0x53, 0xEB, 0x99, 0xAF,
+ 0x28, 0x89, 0x47, 0x10, 0xC5, 0xFD, 0xE0, 0x72, 0xA3, 0x5D, 0xE1, 0x02, 0x22, 0x49, 0x25, 0xDF,
+ 0x00, 0x71, 0x26, 0xE7, 0xC5, 0x16, 0x6C, 0x5F, 0x24, 0x7F, 0xBF, 0x12, 0x2E, 0x71, 0xF1, 0x54,
+ 0x15, 0xE3, 0x76, 0xDA, 0x27, 0x41, 0x8E, 0xF8, 0xA0, 0xC0, 0xF9, 0x5F, 0x6D, 0x4F, 0xC5, 0x4B,
+ 0x58, 0xB5, 0xAB, 0xC4, 0x40, 0xA4, 0x89, 0x32, 0x08, 0x63, 0x5F, 0x68, 0x93, 0x56, 0x1C, 0x1F,
+ 0x6F, 0xDE, 0xF1, 0x63, 0x28, 0x2E, 0x88, 0x52, 0x10, 0x3C, 0xFC, 0xEF, 0x03, 0x87, 0x91, 0xA5,
+ 0x22, 0x06, 0x58, 0x88, 0x4F, 0x2C, 0x0B, 0x11, 0xFC, 0x21, 0x23, 0xB8, 0x6A, 0xBD, 0x21, 0x5B,
+ 0x0C, 0x59, 0x2D, 0x6C, 0x83, 0x6F, 0x7C, 0xF8, 0x4D, 0x7F, 0x62, 0xBC, 0xD1, 0x7D, 0x39, 0x6E,
+ 0x78, 0xCB, 0x88, 0xF2, 0x98, 0xDC, 0xBE, 0xCE, 0x38, 0x45, 0xF5, 0xE9, 0x3F, 0x58, 0x54, 0x62,
+ 0xB4, 0x15, 0xE6, 0xF7, 0xE3, 0xCA, 0x91, 0x05, 0x35, 0x8C, 0x6A, 0xE6, 0x08, 0xFC, 0x05, 0x6D,
+ 0x64, 0x31, 0x4B, 0xA4, 0x61, 0x21, 0x99, 0x4D, 0x51, 0xF5, 0x98, 0x07, 0x65, 0x3F, 0xD0, 0x6A,
+ 0x8F, 0xDB, 0x8B, 0xB2, 0x0E, 0x43, 0x75, 0x49, 0x5D, 0x57, 0xAF, 0x98, 0x51, 0xA8, 0x28, 0x62,
+ 0x8B, 0xBA, 0x47, 0x60, 0x90, 0xCC, 0xC8, 0xC2, 0x8D, 0xA7, 0xC0, 0xD5, 0x80, 0x6D, 0x54, 0x7F,
+ 0xCD, 0xC6, 0xE6, 0x08, 0x23, 0x84, 0x69, 0x79, 0x29, 0x8F, 0x47, 0xB7, 0x85, 0x78, 0x8F, 0x29,
+ 0xE1, 0x53, 0x50, 0xE4, 0x1B, 0x77, 0x66, 0x10, 0x63, 0xBF, 0xA4, 0xC2, 0xDF, 0xB3, 0x2C, 0x87,
+ 0x21, 0x34, 0xE4, 0xE6, 0xE4, 0x6F, 0x2F, 0x5D, 0x5E, 0x45, 0xCF, 0x31, 0x7C, 0x4A, 0x5E, 0x99,
+ 0xB9, 0x81, 0xAF, 0x9C, 0xCD, 0x24, 0x6B, 0x33, 0xE6, 0x8D, 0xB8, 0xB8, 0xA0, 0xDE, 0x15, 0x41,
+ 0xFA, 0xBA, 0x21, 0xFC, 0x5D, 0xD0, 0x85, 0x3E, 0xD2, 0x06, 0x43, 0x3E, 0x93, 0xD6, 0x83, 0x58,
+ 0x74, 0x57, 0xE0, 0xBD, 0x11, 0x4E, 0xF4, 0x17, 0xEA, 0x1C, 0x8B, 0x22, 0xB7, 0x6E, 0x89, 0x92,
+ 0xC8, 0x48, 0xF9, 0x88, 0xEA, 0x46, 0x83, 0x54, 0x76, 0x94, 0xFD, 0x58, 0xD3, 0xA7, 0xD3, 0x24,
+ 0xAF, 0xC9, 0x05, 0x64, 0x76, 0xC9, 0xC5, 0xA6, 0x41, 0x2E, 0xD7, 0xAA, 0x37, 0x72, 0x7A, 0x7C,
+ 0x1B, 0x69, 0xBD, 0xA4, 0xD2, 0x43, 0x9D, 0xC6, 0xE4, 0x20, 0x8F, 0x08, 0x31, 0xE7, 0x6E, 0xD4,
+ 0xFB, 0x2D, 0x85, 0x3D, 0x5A, 0x21, 0xEC, 0x03, 0xB5, 0x66, 0xFE, 0xF0, 0x24, 0x2A, 0xBF, 0x32,
+ 0x6D, 0x5C, 0x4D, 0x9C, 0x4B, 0x22, 0x49, 0xEC, 0x72, 0x9B, 0x9A, 0x36, 0x03, 0x91, 0x8C, 0x7C,
+ 0xB9, 0xE9, 0x8D, 0x72, 0xE0, 0xB0, 0x52, 0x63, 0x2E, 0xDB, 0x9C, 0x0D, 0x55, 0x33, 0xA5, 0x17,
+ 0x7A, 0x2D, 0xAF, 0x75, 0x69, 0x50, 0x7D, 0xDC, 0xEE, 0x26, 0xC6, 0xE3, 0x26, 0xF9, 0x59, 0xF9,
+ 0x10, 0x42, 0x1E, 0xC7, 0x3E, 0x11, 0xCB, 0xFA, 0x4E, 0xE6, 0xAB, 0x6E, 0xA9, 0x1C, 0xD1, 0x76,
+ 0x20, 0xB6, 0xD6, 0xBD, 0xD3, 0xCA, 0x9C, 0x82, 0x33, 0xB8, 0x5E, 0xED, 0xCA, 0x2C, 0x50, 0xC3,
+ 0x58, 0x13, 0x7A, 0xA7, 0xF0, 0x92, 0x89, 0x04, 0xF8, 0x27, 0x98, 0xE2, 0x1C, 0xF2, 0xDA, 0xF6,
+ 0x4D, 0xC0, 0x6A, 0x1C, 0xC5, 0xA5, 0x79, 0x6B, 0x84, 0x37, 0x05, 0x90, 0x6A, 0x0E, 0x2B, 0xAF,
+ 0x96, 0x9E, 0x45, 0xDB, 0x79, 0xDA, 0x2F, 0x46, 0x5F, 0xE2, 0xE8, 0xA6, 0xC6, 0x00, 0xF2, 0x8F,
+ 0xC2, 0xA0, 0xF9, 0x32, 0x53, 0x63, 0xF9, 0xED, 0x9C, 0x0F, 0x29, 0x8F, 0x5D, 0x6C, 0x56, 0xE9,
+ 0xBF, 0x52, 0xB1, 0xB5, 0xD3, 0x8A, 0xE4, 0xE6, 0x1D, 0xB2, 0xC9, 0x0E, 0x8F, 0x28, 0xB0, 0xBF,
+ 0x68, 0x91, 0x87, 0x8E, 0x30, 0x6A, 0xF6, 0x5E, 0x44, 0x81, 0x3E, 0xAA, 0xC2, 0x93, 0x9D, 0x41,
+ 0xAE, 0x54, 0xF1, 0x96, 0x40, 0x30, 0x5F, 0xAD, 0x44, 0xCF, 0xB4, 0x34, 0x86, 0xE2, 0xF4, 0x97,
+ 0x14, 0x21, 0x1D, 0xA5, 0x58, 0xAF, 0x7B, 0x32, 0x5D, 0x63, 0x9A, 0x9D, 0x2A, 0x7C, 0xDA, 0xAD,
+ 0xD5, 0xB2, 0xA8, 0x0D, 0x8F, 0xDA, 0x44, 0xCE, 0xB6, 0xA0, 0xC3, 0x3C, 0x73, 0xC5, 0x8C, 0x9B,
+ 0x62, 0x0C, 0xF2, 0x79, 0x3C, 0x78, 0xF8, 0xC3, 0xC4, 0x4B, 0xAE, 0x29, 0x5A, 0x30, 0xC9, 0xB9,
+ 0x6A, 0xE4, 0x52, 0x09, 0xE1, 0x09, 0x60, 0x8B, 0x56, 0x90, 0x84, 0xE2, 0x5A, 0x07, 0x88, 0x25,
+ 0x03, 0xB7, 0x5B, 0x86, 0x1E, 0x68, 0x2C, 0x25, 0x5D, 0xFE, 0xB9, 0x5A, 0xF0, 0xDC, 0x81, 0x1F,
+ 0xEE, 0xF7, 0x11, 0x94, 0x67, 0x85, 0x13, 0xEC, 0x65, 0xEC, 0x83, 0x53, 0x81, 0x57, 0xEB, 0x95,
+ 0xF5, 0xCE, 0xFF, 0x26, 0xDE, 0x85, 0xDD, 0x7D, 0xA3, 0xFB, 0xA2, 0xB9, 0xD9, 0x33, 0x82, 0x0D,
+ 0x43, 0xC9, 0x1B, 0x72, 0x14, 0x39, 0x24, 0x57, 0x2A, 0x8E, 0x36, 0xA6, 0x86, 0xCC, 0xE8, 0x1F,
+ 0x6B, 0xAD, 0x7B, 0x0E, 0x89, 0xF9, 0x1C, 0xBB, 0x6E, 0x43, 0x99, 0xD5, 0xAA, 0x59, 0xDF, 0x63,
+ 0x12, 0x29, 0x56, 0xCD, 0x55, 0x56, 0xFC, 0x3E, 0xC2, 0x38, 0xD4, 0x65, 0x59, 0xE8, 0x6E, 0x31,
+ 0xFE, 0xA8, 0x18, 0xAA, 0xB4, 0x4C, 0x72, 0x3C, 0xB2, 0xBD, 0xA7, 0x54, 0x8B, 0x53, 0xF8, 0xF7,
+ 0xB8, 0x80, 0xCE, 0x06, 0x89, 0x5E, 0x9D, 0x19, 0x29, 0xDE, 0x73, 0x01, 0xCF, 0x0C, 0xD2, 0xF8,
+ 0xE3, 0x2B, 0x3D, 0x7C, 0x84, 0xFF, 0x4D, 0xE3, 0x2E, 0x33, 0x6F, 0x47, 0x1E, 0x97, 0xB3, 0x55,
+ 0x0B, 0x5C, 0xE3, 0xAB, 0x9C, 0xCB, 0x40, 0x82, 0xD6, 0xA3, 0x47, 0x8B, 0xFF, 0xB1, 0x26, 0x44,
+ 0xE3, 0x7E, 0x39, 0xDB, 0xDD, 0x1B, 0x35, 0xE6, 0x6E, 0xF2, 0x48, 0x57, 0x09, 0x02, 0xB6, 0xA4,
+ 0xD4, 0xB9, 0x7E, 0x20, 0x93, 0x8F, 0x59, 0xE7, 0x2D, 0x0D, 0xB8, 0x82, 0x9A, 0xA4, 0xC7, 0xB2,
+ 0x2A, 0x31, 0x88, 0x52, 0x98, 0xDF, 0x4C, 0xF6, 0xD4, 0xB4, 0xD2, 0x71, 0x41, 0xAA, 0x37, 0x52,
+ 0x34, 0x70, 0x51, 0x9B, 0x33, 0x2D, 0xA3, 0x71, 0x3E, 0xB4, 0xC2, 0x5B, 0xEC, 0xC4, 0xD4, 0x51,
+ 0xF5, 0x8A, 0xD8, 0xB2, 0x87, 0xAE, 0x41, 0xC2, 0xBA, 0x0B, 0x43, 0xEA, 0x83, 0xD8, 0x32, 0x97,
+ 0x5C, 0xCA, 0xF6, 0xBD, 0x65, 0x89, 0xF7, 0x92, 0x8E, 0xF9, 0x97, 0x7F, 0xF7, 0x17, 0x28, 0x47,
+ 0x45, 0xB3, 0xEB, 0x71, 0x86, 0x16, 0x40, 0x86, 0x28, 0x43, 0x33, 0x92, 0x11, 0x06, 0xED, 0x26,
+ 0x5D, 0x8F, 0x35, 0xAB, 0xA7, 0xF6, 0x6C, 0xCE, 0x29, 0x62, 0xD6, 0xBE, 0x16, 0xA3, 0x6B, 0x34,
+ 0xAE, 0x40, 0xED, 0x25, 0x2A, 0xA7, 0x84, 0x1A, 0x7F, 0xB0, 0xBE, 0x2E, 0x09, 0x8A, 0x06, 0x90,
+ 0x11, 0x2D, 0x54, 0x88, 0x2C, 0x23, 0x78, 0x4A, 0x79, 0x13, 0x39, 0xEA, 0xC5, 0x4F, 0x05, 0x30,
+ 0x46, 0xBB, 0x38, 0xF1, 0x47, 0x36, 0xBF, 0xAF, 0xD1, 0x7E, 0x3A, 0x7B, 0x31, 0x54, 0x22, 0x2F,
+ 0x3D, 0xA6, 0xAB, 0x10, 0x1A, 0x3B, 0x76, 0x9A, 0xED, 0xCC, 0xD2, 0xD3, 0x29, 0xA5, 0x90, 0xEB,
+ 0x57, 0x15, 0x1D, 0xC8, 0xB6, 0xCD, 0xD0, 0x11, 0x44, 0x2C, 0x7B, 0xCF, 0x42, 0xA0, 0x76, 0xE2,
+ 0x14, 0x43, 0xC0, 0xBD, 0x53, 0x22, 0x37, 0x4E, 0x83, 0xD2, 0x91, 0x47, 0xDD, 0xCB, 0x8E, 0x5A,
+ 0xB0, 0xA6, 0xB0, 0x13, 0x84, 0x81, 0x6A, 0x59, 0xC4, 0xC9, 0x58, 0x1A, 0x3B, 0x41, 0x09, 0x2B,
+ 0xC1, 0xCB, 0x39, 0x98, 0xE8, 0xDD, 0x1B, 0x45, 0x5F, 0xB6, 0x86, 0x6B, 0x41, 0x7C, 0x32, 0xDC,
+ 0x0E, 0x03, 0xE7, 0xF3, 0xB9, 0x65, 0x8E, 0x3A, 0x69, 0x67, 0x8E, 0xE2, 0x6D, 0x6F, 0xB7, 0xA7,
+ 0x2A, 0x93, 0x9D, 0xEA, 0xA7, 0x2E, 0x82, 0x88, 0x67, 0xC6, 0x91, 0x36, 0xDC, 0x93, 0x47, 0x9A,
+ 0xCD, 0xF9, 0xF6, 0xFA, 0x2A, 0x3A, 0x85, 0xD1, 0x66, 0x48, 0xFC, 0x1A, 0x9E, 0x64, 0x6C, 0x20,
+ 0xD4, 0x19, 0x07, 0xDA, 0xE3, 0xC3, 0x54, 0xD2, 0x45, 0xB5, 0x47, 0x10, 0x2A, 0xB4, 0x00, 0xDF,
+ 0x06, 0xF6, 0xE4, 0xBF, 0x47, 0x6C, 0x61, 0xDD, 0xD7, 0x3C, 0xE2, 0x27, 0x3A, 0x4E, 0xEE, 0xCA,
+ 0x07, 0x03, 0x7E, 0xFC, 0x41, 0x94, 0x3B, 0xA8, 0xD5, 0x28, 0x65, 0xBE, 0x55, 0x28, 0x69, 0x10,
+ 0xF3, 0x91, 0xCE, 0xF8, 0x84, 0x65, 0x45, 0xDC, 0xB0, 0x54, 0x79, 0x1A, 0x17, 0x60, 0x61, 0xBD,
+ 0xB6, 0x2C, 0x93, 0x21, 0x8E, 0x19, 0x35, 0x27, 0x9B, 0x5E, 0xFE, 0x8D, 0xB4, 0x1A, 0xD6, 0xD1,
+ 0xB2, 0xCE, 0xC6, 0x20, 0x6B, 0x92, 0xEC, 0x78, 0xF8, 0x7D, 0x93, 0x22, 0xF0, 0xD5, 0xD4, 0x5B,
+ 0x41, 0xF3, 0xC2, 0x32, 0xB7, 0x58, 0x5E, 0x40, 0x9E, 0x0F, 0x93, 0x2A, 0xBC, 0xBC, 0xD5, 0x33,
+ 0x27, 0x13, 0x0E, 0x4B, 0x9B, 0x8F, 0x3D, 0x77, 0x02, 0x24, 0xA4, 0x72, 0xAE, 0x77, 0xE4, 0x1A,
+ 0xE8, 0xA3, 0x88, 0x7C, 0xDC, 0x15, 0x23, 0x62, 0xD1, 0x53, 0xF8, 0x2F, 0x42, 0xAB, 0xC1, 0xF9,
+ 0x43, 0x4F, 0x5E, 0xAD, 0x44, 0xD3, 0x8B, 0x36, 0x39, 0x5C, 0xAB, 0x52, 0x3D, 0xEB, 0x86, 0x00,
+ 0x49, 0x18, 0x3C, 0x3C, 0x5A, 0x2B, 0xD0, 0xD4, 0xEF, 0xD9, 0xEA, 0xC5, 0x51, 0x53, 0xBD, 0xBD,
+ 0xBE, 0x42, 0x37, 0x37, 0x74, 0x89, 0xBB, 0x1D, 0x6E, 0x2D, 0x42, 0xD3, 0x73, 0x28, 0x47, 0x2F,
+ 0xFD, 0x2C, 0xC0, 0xE0, 0xBE, 0xFD, 0x7D, 0x4E, 0x8A, 0xD8, 0xC6, 0xE0, 0xFE, 0xF5, 0xE0, 0x33,
+ 0x2D, 0xB2, 0x38, 0xAC, 0x83, 0xDF, 0x6D, 0x7F, 0x29, 0xAA, 0x0C, 0x12, 0x74, 0xC0, 0x5B, 0xB6,
+ 0x7E, 0x7F, 0x07, 0x83, 0xC9, 0x70, 0x2E, 0x89, 0x86, 0x13, 0xE6, 0xBA, 0x83, 0xE6, 0x41, 0xA2,
+ 0xC2, 0xFF, 0xE4, 0x33, 0x77, 0xD8, 0x42, 0x80, 0x46, 0xDB, 0x0C, 0x02, 0xF1, 0x4D, 0xAD, 0x82,
+ 0x0E, 0x6F, 0xE2, 0x76, 0x3F, 0x5E, 0x16, 0x23, 0xF8, 0xC9, 0x8D, 0x55, 0x91, 0xBA, 0x52, 0xEF,
+ 0x8A, 0x49, 0x0E, 0x33, 0x7A, 0xF6, 0xB5, 0x62, 0xD3, 0x79, 0xC4, 0x99, 0x49, 0xE9, 0x81, 0xC1,
+ 0xF9, 0x3F, 0x75, 0x9E, 0x24, 0x14, 0x9A, 0x9D, 0x70, 0x62, 0x04, 0x6A, 0xB4, 0x3C, 0xA9, 0xDB,
+ 0x46, 0x5C, 0x3C, 0xDE, 0xA3, 0xF4, 0xCE, 0x9D, 0x4C, 0x84, 0x69, 0xDA, 0x0E, 0x29, 0x86, 0x8F,
+ 0xF0, 0xD1, 0x3A, 0x33, 0xE4, 0xEE, 0xFC, 0x8D, 0xA9, 0x51, 0x3C, 0x60, 0x27, 0x61, 0x3F, 0x90,
+ 0xE4, 0xC9, 0x71, 0xE1, 0xEB, 0xF9, 0x04, 0xEB, 0xA3, 0xB8, 0xAD, 0x04, 0x82, 0x2B, 0x40, 0x13,
+ 0x46, 0xC0, 0x47, 0x72, 0xC7, 0x37, 0xD5, 0xCF, 0x0E, 0x93, 0x58, 0x2C, 0xED, 0x03, 0x68, 0xE2,
+ 0x78, 0xFD, 0x70, 0xE8, 0x53, 0x27, 0x06, 0x70, 0x7A, 0x7F, 0x85, 0xEF, 0x2B, 0x98, 0x7F, 0xFD,
+ 0x34, 0x2B, 0xAC, 0xA0, 0x46, 0x35, 0x56, 0x75, 0x96, 0x0B, 0xF9, 0xEC, 0xE4, 0x9B, 0xBD, 0x1E,
+ 0xE0, 0x94, 0x67, 0x86, 0xD3, 0xBB, 0xE4, 0x53, 0x82, 0x28, 0x29, 0xC2, 0x1B, 0x3F, 0x79, 0x86,
+ 0x44, 0x6A, 0x50, 0x1E, 0xCE, 0x1B, 0xCC, 0x8C, 0x13, 0x49, 0x32, 0xE3, 0xE6, 0xD1, 0x5B, 0xDD,
+ 0x59, 0x33, 0x75, 0x95, 0xF2, 0xC1, 0xC5, 0x77, 0x08, 0x81, 0x47, 0x39, 0xCD, 0xBA, 0x78, 0xA1,
+ 0x47, 0xD4, 0x2C, 0xDE, 0x9F, 0xB0, 0x20, 0x55, 0xA1, 0x4B, 0xD9, 0x0A, 0xA8, 0x9C, 0xFE, 0x8C,
+ 0x5F, 0x80, 0x2B, 0x90, 0x5D, 0x86, 0xB5, 0x91, 0x31, 0x5C, 0x34, 0x4A, 0xC8, 0x27, 0xFF, 0x2D,
+ 0xDA, 0xA8, 0xA3, 0xBE, 0x9A, 0xB3, 0x24, 0x8A, 0xB4, 0x1C, 0xCC, 0xC1, 0x80, 0x75, 0xEB, 0x88,
+ 0x79, 0xA2, 0x20, 0xD9, 0x7E, 0x13, 0xCC, 0x6E, 0xE9, 0x2E, 0xA0, 0x3A, 0x46, 0x2F, 0xA1, 0x99,
+ 0xDE, 0x57, 0xE4, 0x33, 0x10, 0xB2, 0xC8, 0xE5, 0xCF, 0xC0, 0x75, 0x9E, 0xF7, 0xB9, 0x74, 0xA8,
+ 0xD0, 0x56, 0xFF, 0x86, 0x95, 0x73, 0xE1, 0x36, 0xF5, 0xED, 0x89, 0x0C, 0x35, 0x25, 0xDF, 0x05,
+ 0xDB, 0xAA, 0x09, 0x54, 0x29, 0xF4, 0x96, 0xD1, 0x82, 0x50, 0xC2, 0x60, 0x2C, 0xE4, 0xCB, 0x86,
+ 0xBE, 0xAB, 0xB1, 0x05, 0x1D, 0x85, 0xA6, 0x76, 0xA3, 0xE2, 0x4E, 0x74, 0x71, 0xEB, 0x65, 0xA1,
+ 0x53, 0xF6, 0x32, 0x67, 0x3A, 0x56, 0x2A, 0xE3, 0xE1, 0x8E, 0x75, 0xCF, 0xE0, 0xB2, 0xBB, 0x40,
+ 0x0A, 0xD1, 0x93, 0x83, 0xA0, 0x21, 0x29, 0x77, 0xC1, 0x8D, 0x67, 0x67, 0x27, 0xF0, 0xB1, 0x9B,
+ 0x1C, 0xD2, 0x3F, 0x93, 0x63, 0x86, 0x38, 0x12, 0xB6, 0x33, 0x6D, 0xAB, 0x5B, 0x16, 0xF2, 0xB5,
+ 0xAD, 0x30, 0xD6, 0xDD, 0xA7, 0xA1, 0x9F, 0xDD, 0x52, 0xEE, 0xEA, 0x50, 0xD4, 0x36, 0x1E, 0x9C,
+ 0x2B, 0xD0, 0x45, 0xEF, 0x7E, 0x43, 0xC7, 0x72, 0xBB, 0x55, 0xF7, 0xF6, 0x32, 0xE8, 0xC4, 0xAE,
+ 0x48, 0x1A, 0x6A, 0x8D, 0xE1, 0xA0, 0xBC, 0x83, 0x0F, 0x4A, 0xAC, 0x9C, 0x6F, 0x98, 0x56, 0x8A,
+ 0x66, 0x73, 0x15, 0x07, 0xA6, 0x46, 0xD1, 0x6B, 0x07, 0x1C, 0x36, 0x1E, 0xC9, 0x48, 0x8A, 0x05,
+ 0xC2, 0x1D, 0x9D, 0x54, 0x37, 0x34, 0x8F, 0x4B, 0xD7, 0x63, 0x1F, 0xC3, 0x02, 0xC2, 0x11, 0x70,
+ 0x40, 0x61, 0x4F, 0xE1, 0x17, 0x63, 0xDF, 0x21, 0x50, 0x7D, 0x08, 0x02, 0xB6, 0x97, 0x11, 0x2E,
+ 0xF5, 0xE6, 0x0C, 0x94, 0x10, 0x31, 0x5A, 0x51, 0x5D, 0x00, 0x84, 0xC2, 0x86, 0x90, 0xD4, 0xAE,
+ 0x34, 0xB7, 0x1E, 0x97, 0x80, 0x3F, 0x85, 0x52, 0x2D, 0x7A, 0xBD, 0x32, 0x03, 0x2B, 0x9F, 0xF5,
+ 0xCA, 0x85, 0x6D, 0x9A, 0xF3, 0x65, 0xAF, 0xE2, 0x60, 0xDF, 0x8C, 0x4F, 0x18, 0xD1, 0x85, 0xD3,
+ 0x01, 0x6B, 0x07, 0xA0, 0x54, 0xB6, 0xCB, 0x25, 0xB3, 0x92, 0x96, 0xC5, 0x0B, 0xE8, 0xB4, 0xA4,
+ 0x60, 0x23, 0x81, 0x47, 0xBA, 0xAD, 0x31, 0x05, 0x58, 0x3D, 0xC4, 0xA9, 0xF7, 0xAB, 0x9E, 0x9F,
+ 0xAF, 0x7E, 0xAA, 0x20, 0xB5, 0xA4, 0xA5, 0x9A, 0x46, 0xF7, 0xCC, 0xE8, 0xFE, 0x6B, 0x93, 0x07,
+ 0x7B, 0x43, 0x9F, 0x79, 0x55, 0x4E, 0xAB, 0xCD, 0xEF, 0x3A, 0xA1, 0x8E, 0xC4, 0xDE, 0x62, 0x5F,
+ 0x0A, 0xFF, 0xC7, 0x1B, 0x4E, 0x53, 0x50, 0x36, 0x93, 0x1C, 0x47, 0xF2, 0x6A, 0x58, 0xD0, 0xBF,
+ 0x70, 0x8B, 0x45, 0x34, 0x34, 0x33, 0x9E, 0x44, 0xB9, 0x64, 0xED, 0x9B, 0x6D, 0x07, 0x5F, 0x8C,
+ 0x12, 0xEF, 0xDC, 0x26, 0xFF, 0x4C, 0xCE, 0xCE, 0x8D, 0xB9, 0x91, 0xC7, 0x82, 0xBF, 0x08, 0x23,
+ 0xA8, 0x9A, 0x8E, 0x21, 0x8C, 0xDE, 0x1C, 0x92, 0x5B, 0xB0, 0x70, 0x69, 0x42, 0xD6, 0xB9, 0x94,
+ 0x1A, 0xA2, 0x12, 0x91, 0xF1, 0x54, 0x80, 0x02, 0x0C, 0xD2, 0x54, 0x17, 0x4C, 0x29, 0xEA, 0x31,
+ 0xC1, 0x60, 0x94, 0x9F, 0x44, 0xDF, 0x7B, 0x38, 0xFE, 0xD4, 0x32, 0x36, 0x6C, 0xD4, 0x6A, 0xD1,
+ 0x3D, 0x6C, 0x73, 0x77, 0x81, 0xDC, 0xE2, 0x9D, 0x48, 0x5A, 0xB2, 0x95, 0x28, 0x40, 0x5F, 0xF5,
+ 0x6C, 0x9A, 0x63, 0x4B, 0x24, 0xD5, 0xE3, 0x25, 0x75, 0xD4, 0xAC, 0x87, 0xA4, 0x55, 0x97, 0xA7,
+ 0xB0, 0xD7, 0x06, 0x10, 0xD5, 0x0F, 0xC9, 0x8F, 0xC7, 0x6C, 0x63, 0x49, 0x81, 0x14, 0x24, 0xB0,
+ 0x2C, 0xAA, 0xDE, 0x01, 0xB0, 0x4E, 0x2C, 0xD8, 0xB7, 0xDF, 0x24, 0x21, 0xF8, 0x07, 0xF6, 0x36,
+ 0x93, 0x09, 0x66, 0x1D, 0xBF, 0x6D, 0x76, 0xA7, 0xDC, 0xA2, 0x67, 0xAA, 0x9E, 0x04, 0xB4, 0x9C,
+ 0xE9, 0xBC, 0x78, 0xDC, 0xEC, 0x1D, 0x4D, 0xED, 0x5F, 0x9F, 0xAA, 0xFF, 0x75, 0x24, 0x3A, 0x95,
+ 0xF8, 0xA2, 0xC0, 0x38, 0x73, 0xEF, 0xFF, 0x11, 0x71, 0xDE, 0xBB, 0x76, 0x19, 0xBA, 0xB9, 0xB0,
+ 0xA6, 0x1B, 0x0F, 0x33, 0xFA, 0x3B, 0xB5, 0x4D, 0x32, 0x9F, 0x15, 0x09, 0xC3, 0x22, 0xCE, 0x73,
+ 0x31, 0xDD, 0x23, 0xBF, 0x1E, 0x99, 0x57, 0x6D, 0x0B, 0xDF, 0xF8, 0xFD, 0xAC, 0x41, 0xA7, 0x91,
+ 0x8B, 0x70, 0x5C, 0x41, 0x02, 0x77, 0x52, 0x1D, 0xAC, 0xBF, 0xBD, 0x03, 0xA3, 0x5A, 0xC4, 0x61,
+ 0xA8, 0xE1, 0x00, 0xE1, 0x77, 0x14, 0x7E, 0x5F, 0xDF, 0x11, 0x80, 0x40, 0xBA, 0xA1, 0x07, 0x9F,
+ 0xC7, 0xED, 0xC6, 0x77, 0xF4, 0x14, 0x55, 0x99, 0x56, 0x15, 0x6C, 0xF9, 0x34, 0x02, 0x28, 0x69,
+ 0x81, 0xDD, 0x0D, 0x9E, 0x5B, 0x35, 0xEA, 0x1D, 0x9C, 0xA9, 0xBB, 0x82, 0x79, 0x1B, 0xE7, 0xF5,
+ 0xF8, 0xFD, 0x14, 0xC8, 0xDC, 0xE8, 0x7A, 0x6D, 0x7B, 0xA1, 0x35, 0x7C, 0x0B, 0x13, 0x1B, 0x08,
+ 0x2E, 0x8B, 0x04, 0x27, 0x16, 0x04, 0xFC, 0x6C, 0xE4, 0x1E, 0x29, 0x06, 0xF1, 0x05, 0xCD, 0x6C,
+ 0x10, 0xB1, 0xBA, 0xB9, 0x7F, 0x97, 0xDD, 0x8C, 0xA5, 0x51, 0xB8, 0xD5, 0xE8, 0xE9, 0xEA, 0x23,
+ 0x5D, 0x2C, 0x6A, 0xC2, 0x74, 0x7F, 0x81, 0xB6, 0x47, 0xF9, 0xA5, 0x94, 0x57, 0x31, 0x3B, 0xCE,
+ 0xCB, 0x13, 0xA7, 0xED, 0x9A, 0x29, 0x33, 0x4F, 0xE2, 0xB5, 0xAA, 0x41, 0x37, 0x6F, 0xF4, 0x82,
+ 0x65, 0x5F, 0x5D, 0xAE, 0x4D, 0x92, 0xD9, 0x03, 0xCC, 0x71, 0xA7, 0x6D, 0x68, 0x46, 0x87, 0xA0,
+ 0x79, 0x28, 0x9C, 0x4A, 0x39, 0x7F, 0x5E, 0xA2, 0xD5, 0xB4, 0x8B, 0x35, 0x07, 0x49, 0x66, 0x47,
+ 0x08, 0xFB, 0xFF, 0xE4, 0x44, 0x06, 0x3B, 0x7D, 0x99, 0xED, 0xE6, 0x9D, 0xDD, 0x9B, 0x86, 0x27,
+ 0x4D, 0x3A, 0x46, 0x42, 0xDA, 0xEC, 0xCD, 0xEA, 0x1E, 0x4F, 0xDA, 0x5F, 0x5F, 0x0E, 0x0C, 0xCF,
+ 0x65, 0x64, 0x34, 0x29, 0x4E, 0x14, 0x4B, 0x8A, 0x9A, 0x2C, 0xF6, 0x80, 0xBC, 0x4B, 0xAD, 0xB9,
+ 0x24, 0xC3, 0x56, 0x2E, 0x5E, 0x3D, 0xBD, 0xE0, 0x48, 0x96, 0x30, 0x01, 0xD7, 0x4A, 0xEA, 0x0B,
+ 0xCD, 0xF2, 0xFA, 0x99, 0x67, 0xA3, 0x98, 0x01, 0xD5, 0x19, 0x0D, 0xD5, 0x6E, 0xB3, 0x18, 0x05,
+ 0x62, 0x5C, 0x75, 0xB3, 0xC2, 0x60, 0xCF, 0xF5, 0x22, 0x42, 0x32, 0x73, 0x99, 0x1D, 0x31, 0x94,
+ 0xE6, 0x37, 0xC8, 0x74, 0x41, 0xF1, 0xBD, 0x46, 0xBA, 0x0B, 0x2A, 0xA7, 0x4A, 0x28, 0xB8, 0x25,
+ 0x48, 0x99, 0xEF, 0xE1, 0xE7, 0x4D, 0xEB, 0x53, 0xBA, 0x76, 0xA2, 0x15, 0x1B, 0xFE, 0x80, 0x6F,
+ 0x66, 0x81, 0x15, 0x99, 0x6B, 0x1C, 0x12, 0xB6, 0x61, 0x52, 0xCD, 0xBA, 0x47, 0x79, 0x0D, 0x9A,
+ 0xEE, 0xA9, 0x3E, 0xFB, 0xBD, 0x56, 0xA7, 0xBC, 0x41, 0xF1, 0x17, 0x00, 0xC5, 0x0E, 0x58, 0xA7,
+ 0x71, 0x42, 0x7D, 0x4A, 0xAF, 0x3C, 0x8E, 0xA6, 0x77, 0x6F, 0x35, 0xEC, 0x92, 0x8A, 0xC9, 0xCC,
+ 0xB0, 0x58, 0x74, 0xCE, 0xD3, 0xBB, 0xA0, 0xC1, 0xCD, 0x12, 0xF2, 0x81, 0x1C, 0xA4, 0x26, 0x7C,
+ 0x92, 0x8A, 0x27, 0x19, 0x3C, 0x44, 0x2A, 0x7D, 0x0E, 0xD3, 0xEA, 0x15, 0x3A, 0xF9, 0x4B, 0xBF,
+ 0x99, 0x8A, 0x7F, 0xAB, 0x13, 0x24, 0x65, 0x46, 0x94, 0x29, 0xBD, 0xB7, 0x2A, 0xEE, 0x65, 0xEF,
+ 0x02, 0x34, 0x20, 0xF4, 0xD2, 0xAF, 0xC4, 0x10, 0x93, 0x05, 0xD5, 0x82, 0x71, 0x7C, 0xF8, 0x9D,
+ 0x43, 0x72, 0x09, 0xBB, 0x8C, 0xC3, 0x60, 0x21, 0x40, 0xCB, 0x97, 0xA3, 0x47, 0xE1, 0xDF, 0x18,
+ 0x5E, 0x22, 0x2F, 0x95, 0x49, 0x3F, 0x89, 0x50, 0xFD, 0x08, 0x3D, 0xC2, 0xE2, 0x5D, 0x5A, 0xA3,
+ 0xF2, 0x09, 0x4F, 0x0C, 0x55, 0x38, 0x69, 0xF8, 0x39, 0xC3, 0x94, 0xF7, 0x55, 0x71, 0xA9, 0xC7,
+ 0x0F, 0x2C, 0x8E, 0x3C, 0x70, 0x86, 0x57, 0x6F, 0xCF, 0x5D, 0xE9, 0x4B, 0x4F, 0x80, 0x7E, 0x15,
+ 0x42, 0x43, 0x7B, 0xEC, 0xCD, 0x4E, 0x92, 0x8D, 0x5C, 0x89, 0xD2, 0x08, 0x5A, 0x32, 0x0F, 0x6E,
+ 0x0D, 0x09, 0x29, 0x02, 0x6F, 0xA0, 0x2E, 0x8E, 0x5C, 0x10, 0x16, 0x1E, 0x82, 0xDF, 0xD3, 0xCD,
+ 0xB5, 0x93, 0xD6, 0x21, 0x7B, 0x96, 0xC5, 0xFC, 0x79, 0x21, 0x88, 0x99, 0xC9, 0x3C, 0x75, 0x98,
+ 0x13, 0x67, 0x62, 0xFD, 0x70, 0xB0, 0x58, 0xDA, 0xCF, 0xDC, 0x9E, 0x92, 0x5F, 0x84, 0x3B, 0x0E,
+ 0xD8, 0xE0, 0xCF, 0xF3, 0x90, 0x9E, 0xFC, 0x40, 0xC7, 0x58, 0x2F, 0x11, 0x55, 0x9D, 0x7A, 0xE9,
+ 0x9D, 0x5C, 0xD7, 0xDF, 0xEF, 0xC5, 0x87, 0x7E, 0xC5, 0x14, 0xA7, 0xCE, 0xE6, 0xDB, 0x83, 0xD4,
+ 0x3A, 0xF7, 0x86, 0xD0, 0xE6, 0x2B, 0xFF, 0x8B, 0x80, 0xF8, 0xD6, 0xFE, 0x55, 0x82, 0xD7, 0x5B,
+ 0xEB, 0x29, 0x9C, 0x1D, 0xCD, 0x69, 0x1D, 0xF2, 0xB5, 0x44, 0x09, 0xAD, 0x1D, 0x40, 0xDD, 0xC1,
+ 0xFB, 0xDF, 0x79, 0xCA, 0xA4, 0x61, 0xAC, 0x39, 0x80, 0x66, 0xB8, 0x37, 0x91, 0xF6, 0x23, 0xEB,
+ 0x82, 0x49, 0x05, 0x41, 0x72, 0x98, 0xA6, 0x1C, 0x21, 0xB1, 0x64, 0x90, 0xDC, 0x68, 0x00, 0x2E,
+ 0x61, 0x2A, 0x80, 0x91, 0xEB, 0xCA, 0x04, 0x3D, 0x8E, 0x70, 0x21, 0x60, 0x1E, 0x11, 0x69, 0x4A,
+ 0x3B, 0x09, 0x84, 0x90, 0x98, 0x78, 0xF0, 0x9D, 0x5A, 0x92, 0x71, 0xC3, 0xB7, 0x4B, 0x42, 0x98,
+ 0x8E, 0xB6, 0x2B, 0x39, 0x59, 0x5F, 0xC1, 0x04, 0xC6, 0x8F, 0x6B, 0x33, 0xF7, 0x9E, 0x0B, 0x32,
+ 0x35, 0x60, 0x57, 0x23, 0xA1, 0xCB, 0x73, 0x82, 0xEA, 0x05, 0x3D, 0xDC, 0xF5, 0x36, 0x1B, 0x5E,
+ 0x18, 0x1F, 0x37, 0x14, 0xD7, 0x06, 0xAE, 0xDD, 0x46, 0x15, 0x82, 0xA2, 0x9C, 0xAA, 0x41, 0xFE,
+ 0x28, 0xB8, 0x3E, 0x2A, 0x7D, 0x78, 0xB8, 0x27, 0xE7, 0x65, 0x52, 0x7D, 0x93, 0x9F, 0x13, 0x9A,
+ 0x22, 0xF1, 0xF5, 0xB3, 0x2A, 0x37, 0xB6, 0x81, 0xF7, 0x5D, 0x4C, 0xA3, 0x65, 0x28, 0x13, 0x9E,
+ 0x41, 0xD8, 0xC4, 0xA8, 0x10, 0xD5, 0x5D, 0xB0, 0xBA, 0xE5, 0xDF, 0xF3, 0xFF, 0x49, 0xD1, 0xED,
+ 0x9D, 0x9E, 0xFA, 0x19, 0xF7, 0x41, 0xDB, 0xC1, 0xBE, 0x8E, 0x72, 0xAD, 0xB2, 0xD5, 0x7A, 0x93,
+ 0x6F, 0xF7, 0x25, 0xB9, 0x62, 0xB5, 0xA9, 0x3B, 0x79, 0xF6, 0xA8, 0x56, 0x4A, 0x8F, 0x98, 0x9E,
+ 0xC7, 0x4F, 0x42, 0x49, 0xB3, 0x75, 0xFA, 0x73, 0xDD, 0x37, 0xCA, 0xCE, 0xEA, 0x5E, 0xF0, 0x84,
+ 0x88, 0x6F, 0x54, 0x54, 0xA5, 0xA0, 0x1D, 0xF9, 0xE7, 0x4E, 0xCB, 0xD6, 0x0A, 0xB4, 0x84, 0xBF,
+ 0xD0, 0x2E, 0x2C, 0xF9, 0x12, 0x33, 0x28, 0x91, 0x40, 0x3E, 0xC9, 0x18, 0x9E, 0x84, 0x76, 0xDB,
+ 0xEB, 0x21, 0x62, 0x35, 0xAE, 0x98, 0x20, 0x97, 0x2B, 0x8D, 0x6B, 0x86, 0x73, 0x91, 0x00, 0x0C,
+ 0xA0, 0xF1, 0xAB, 0xB7, 0x65, 0x94, 0x7A, 0x80, 0x09, 0x28, 0x90, 0x0B, 0xAF, 0x1C, 0x72, 0xCD,
+ 0x93, 0x7C, 0xDA, 0xC7, 0xE0, 0x85, 0x72, 0x3F, 0x0A, 0xAA, 0x1E, 0xE7, 0xBF, 0xEA, 0x84, 0xE1,
+ 0xF9, 0xB8, 0x2B, 0x41, 0x4E, 0x30, 0x23, 0x99, 0x47, 0xE4, 0x6C, 0x45, 0x86, 0x51, 0xB2, 0xB1,
+ 0x2A, 0x11, 0x1B, 0x3E, 0xD1, 0x5A, 0xC4, 0x6C, 0xEF, 0x37, 0xBC, 0xAE, 0x10, 0x0C, 0x28, 0xB0,
+ 0x14, 0x6B, 0xB7, 0x34, 0x12, 0x21, 0x12, 0x5D, 0xFC, 0x19, 0x80, 0x72, 0x0B, 0xF3, 0x27, 0x8B,
+ 0x3F, 0x14, 0x7B, 0xD5, 0x66, 0xF2, 0x0F, 0xEF, 0x2E, 0xC6, 0x87, 0x49, 0x61, 0xD1, 0xE6, 0xA5,
+ 0x00, 0xF9, 0x1A, 0x11, 0xB2, 0x3B, 0xAC, 0x77, 0xBF, 0xFB, 0x6B, 0xB1, 0x9C, 0x25, 0x0D, 0x68,
+ 0x2C, 0x2C, 0xA8, 0xE8, 0x67, 0xE7, 0xAF, 0x32, 0x03, 0x6C, 0xAB, 0xF2, 0x27, 0x55, 0xD6, 0xCA,
+ 0x36, 0xC4, 0x2A, 0xD7, 0x74, 0x7F, 0xD5, 0xE5, 0x4E, 0x2F, 0x97, 0xA8, 0x21, 0x71, 0xE0, 0xD7,
+ 0x96, 0xD3, 0x14, 0xA2, 0x3D, 0x6C, 0xC0, 0x86, 0x17, 0x80, 0xA0, 0x9B, 0x96, 0x3F, 0x42, 0x45,
+ 0xCF, 0x34, 0x24, 0x9C, 0xEF, 0x8A, 0xA2, 0x33, 0xB7, 0xEB, 0xF7, 0xB1, 0xE1, 0xE9, 0x9F, 0xDB,
+ 0xA9, 0x80, 0xD0, 0xA8, 0xBC, 0x6A, 0x49, 0x86, 0x69, 0xAF, 0x21, 0x82, 0x9B, 0xF1, 0x90, 0x12,
+ 0x92, 0x7C, 0xCE, 0x56, 0xB7, 0x31, 0xFF, 0x68, 0xE1, 0x5D, 0x54, 0x17, 0xBC, 0x06, 0x46, 0x56,
+ 0xE3, 0x4A, 0x36, 0xAB, 0x7D, 0xBC, 0xE8, 0x34, 0x32, 0x79, 0xEB, 0x96, 0xFC, 0xA5, 0x17, 0x72,
+ 0x50, 0x63, 0xCB, 0x6C, 0x4D, 0x0D, 0xBD, 0xEC, 0x78, 0xC7, 0x73, 0x97, 0x7F, 0xA6, 0xF5, 0xCE,
+ 0xFC, 0xC7, 0x28, 0x59, 0x62, 0xAF, 0xCC, 0x9F, 0xFB, 0x4F, 0x8D, 0xBE, 0xC6, 0xEF, 0xCF, 0x92,
+ 0xDE, 0x56, 0x06, 0xF0, 0xB6, 0xEE, 0x7F, 0xFE, 0x90, 0x59, 0xFF, 0xF1, 0xB2, 0x7A, 0x67, 0xA9,
+ 0x16, 0x0B, 0xB9, 0xDB, 0xF8, 0x5B, 0xAB, 0x6C, 0xD0, 0x4F, 0x6A, 0xB1, 0x42, 0x39, 0x2D, 0x71,
+ 0x31, 0x30, 0x83, 0xC4, 0x3D, 0x5D, 0xB7, 0x6A, 0xE5, 0xE0, 0x1A, 0x07, 0xC8, 0xA1, 0xCC, 0x5C,
+ 0x8B, 0x0E, 0xDA, 0xBA, 0xC5, 0x0E, 0x1D, 0x6D, 0x8C, 0x25, 0x56, 0xAA, 0xA2, 0xC3, 0x1C, 0xB1,
+ 0xDE, 0x5E, 0xAA, 0xCA, 0x53, 0xF8, 0x78, 0x69, 0x51, 0x69, 0x03, 0xA4, 0x0F, 0xB7, 0xA7, 0xAA,
+ 0xB6, 0x44, 0x59, 0x9F, 0xB8, 0x45, 0x48, 0x19, 0x5F, 0x29, 0x64, 0x66, 0xA7, 0x7B, 0x7F, 0x79,
+ 0xF8, 0x9D, 0x15, 0x48, 0x34, 0x57, 0xA1, 0x25, 0x27, 0xCE, 0xBF, 0xD1, 0xC8, 0x5E, 0x96, 0xBF,
+ 0xC9, 0xD2, 0xC7, 0x08, 0x75, 0xDB, 0x8D, 0x55, 0x26, 0x92, 0x2C, 0xB2, 0x87, 0xB1, 0x15, 0x37,
+ 0x22, 0x9B, 0x61, 0xBC, 0xA8, 0xC7, 0x7E, 0xC3, 0x98, 0x89, 0xBC, 0x44, 0x6B, 0x13, 0x93, 0x30,
+ 0xCD, 0x5B, 0x35, 0xB4, 0x9F, 0x5C, 0xB5, 0x2E, 0xB1, 0x23, 0x20, 0xA8, 0xF3, 0xA3, 0x5A, 0x01,
+ 0x29, 0x24, 0x54, 0x20, 0xEF, 0x27, 0xCD, 0xF3, 0x56, 0xE0, 0x6B, 0x02, 0x23, 0x0A, 0xD9, 0x6A,
+ 0xA6, 0x23, 0xE1, 0xC3, 0x96, 0xEE, 0x06, 0x11, 0x53, 0x9E, 0xD6, 0x80, 0xC1, 0x68, 0x15, 0xA4,
+ 0x24, 0x8F, 0xBF, 0xB2, 0x49, 0xC1, 0x2E, 0xE2, 0x6B, 0xD2, 0x48, 0x45, 0x3C, 0xA6, 0xF8, 0x6C,
+ 0xC0, 0x55, 0x51, 0xC4, 0xAC, 0x52, 0x8D, 0x44, 0xEF, 0xBC, 0x04, 0x05, 0x69, 0x5C, 0x87, 0x99,
+ 0x0C, 0x27, 0xFB, 0x02, 0x6E, 0xD1, 0xF7, 0x5E, 0x07, 0x11, 0x26, 0x5A, 0x59, 0x5A, 0xF8, 0x54,
+ 0x12, 0x88, 0x20, 0xBB, 0x38, 0x92, 0x49, 0xF0, 0xE5, 0x82, 0xA3, 0xF6, 0xEE, 0xBD, 0xD7, 0xCC,
+ 0x58, 0xDC, 0x3B, 0x8A, 0x13, 0xE8, 0x5F, 0x58, 0x0C, 0x12, 0x64, 0x3C, 0xAF, 0x92, 0xC0, 0xC9,
+ 0x11, 0xE9, 0xC1, 0xB8, 0xE7, 0xFA, 0x09, 0xAE, 0x61, 0xA3, 0x70, 0x4C, 0x07, 0x45, 0x7C, 0x61,
+ 0x82, 0x1B, 0x64, 0x4C, 0x0F, 0x7D, 0xC2, 0xC5, 0xD9, 0x92, 0x00, 0x35, 0xCC, 0x34, 0x07, 0xBA,
+ 0xDD, 0x52, 0xE3, 0x67, 0x76, 0xC6, 0x8B, 0xD5, 0x51, 0xE7, 0xB3, 0x57, 0x7D, 0xF6, 0xA3, 0x82,
+ 0xEA, 0x7D, 0x88, 0x09, 0x67, 0x49, 0x2B, 0x37, 0x04, 0x1E, 0xBF, 0x83, 0x76, 0xBA, 0x7F, 0xB4,
+ 0xC1, 0x8F, 0xCD, 0xD3, 0x04, 0xD2, 0x89, 0x5F, 0x0E, 0xA7, 0x43, 0x4F, 0x8A, 0x4A, 0x98, 0x48,
+ 0x74, 0x83, 0x0B, 0x2E, 0x6E, 0xC4, 0xAF, 0x29, 0x38, 0xBA, 0xD1, 0x67, 0xEA, 0x96, 0x10, 0x35,
+ 0x69, 0xFF, 0xD2, 0x43, 0x00, 0x2E, 0x9D, 0x60, 0x08, 0x04, 0xDF, 0xFB, 0xCD, 0x6C, 0x98, 0xCE,
+ 0x73, 0x9A, 0xF4, 0x46, 0x23, 0x22, 0x58, 0x0C, 0x1F, 0xE1, 0x5A, 0x43, 0x76, 0x18, 0x81, 0xE3,
+ 0xF4, 0xBE, 0x95, 0xBF, 0x61, 0x88, 0x16, 0xF4, 0x7B, 0x01, 0xEB, 0xD4, 0x85, 0xB9, 0xC2, 0x0C,
+ 0x22, 0x02, 0x27, 0x8D, 0xB5, 0x7F, 0xC8, 0xA9, 0xAA, 0x8A, 0xF7, 0x91, 0x7A, 0x4A, 0x20, 0x37,
+ 0xB7, 0xBE, 0x15, 0x6E, 0x48, 0x2C, 0x50, 0xE3, 0xAE, 0x2B, 0xAE, 0x1E, 0x5C, 0x59, 0x9A, 0x36,
+ 0x46, 0x85, 0x04, 0xE8, 0x51, 0xED, 0x1F, 0xB0, 0x38, 0xE3, 0xC7, 0x5D, 0x9A, 0xD1, 0x07, 0x85,
+ 0xED, 0xDC, 0x3C, 0x99, 0x35, 0x03, 0x57, 0x85, 0xE2, 0x83, 0xFB, 0x06, 0x81, 0x08, 0xDA, 0xF2,
+ 0xFA, 0xF4, 0x9E, 0x5F, 0x2F, 0x82, 0xC2, 0xBA, 0xE3, 0x04, 0x42, 0x59, 0x4B, 0xBD, 0xEB, 0xFD,
+ 0x8F, 0x5D, 0x34, 0x37, 0x86, 0x06, 0x6B, 0xCC, 0x8C, 0x48, 0x7C, 0x14, 0xE9, 0x48, 0xF5, 0x28,
+ 0x51, 0xF3, 0x7E, 0xC9, 0xC8, 0x73, 0x88, 0x8B, 0x03, 0xAD, 0xEA, 0x37, 0x3F, 0x02, 0x95, 0xB8,
+ 0x6A, 0x28, 0xFC, 0x42, 0xD9, 0xAD, 0xFC, 0x4C, 0xE8, 0xEA, 0xDC, 0x4B, 0xD3, 0x9C, 0x74, 0x09,
+ 0x44, 0x74, 0x81, 0xB6, 0x36, 0x96, 0x07, 0xFB, 0x48, 0xF5, 0xBA, 0x21, 0xA5, 0xD4, 0xCA, 0x48,
+ 0x1E, 0x63, 0xF4, 0x8C, 0x16, 0x4C, 0xDF, 0xC2, 0xAA, 0x11, 0x02, 0xCF, 0xE8, 0x28, 0xEF, 0xB9,
+ 0x57, 0x70, 0x6C, 0x2C, 0x43, 0x18, 0x6D, 0xBD, 0x2D, 0xF4, 0x20, 0x54, 0x2A, 0xF3, 0xAE, 0x57,
+ 0x46, 0xA4, 0x0E, 0xC8, 0x18, 0xB3, 0x37, 0x6E, 0xFF, 0x99, 0x6A, 0x26, 0xF8, 0x7E, 0xCF, 0x8B,
+ 0xDB, 0x43, 0xF3, 0x10, 0x30, 0xA7, 0x27, 0x96, 0x07, 0x8F, 0x50, 0xE0, 0x45, 0x41, 0x16, 0xA6,
+ 0xC1, 0x1B, 0xCB, 0x97, 0x00, 0x81, 0x9D, 0x3A, 0x1A, 0x1E, 0xA0, 0x11, 0xFA, 0xBC, 0x89, 0xF5,
+ 0x07, 0x66, 0x93, 0x4E, 0xC4, 0x90, 0xF7, 0xA1, 0x65, 0x00, 0xDE, 0x39, 0x9A, 0xED, 0xCC, 0xEA,
+ 0x70, 0x57, 0x83, 0x62, 0x68, 0xE0, 0x9C, 0x0A, 0xC5, 0x2F, 0x6E, 0x75, 0xB9, 0x93, 0x15, 0x62,
+ 0xAC, 0x7C, 0x8B, 0x23, 0x32, 0xF4, 0xC9, 0x97, 0xBA, 0x7D, 0x7D, 0x9D, 0x19, 0x13, 0x4B, 0x6E,
+ 0xEF, 0xDE, 0x2B, 0x9B, 0x30, 0x9B, 0x30, 0xA8, 0x22, 0xBC, 0x7B, 0x63, 0xC8, 0x08, 0x84, 0xA6,
+ 0x66, 0xE0, 0x87, 0x0C, 0x4A, 0x1B, 0xC3, 0xE2, 0xE4, 0x3B, 0x45, 0x21, 0x45, 0x36, 0x05, 0x98,
+ 0x41, 0xE1, 0x03, 0x82, 0x95, 0x69, 0x0C, 0x6D, 0x4A, 0x13, 0x94, 0x15, 0x66, 0x9C, 0x2F, 0xA5,
+ 0x93, 0x3F, 0x59, 0xE0, 0x86, 0xED, 0x13, 0xD5, 0x9A, 0x0A, 0xEB, 0x0C, 0x58, 0xD1, 0xBB, 0x9C,
+ 0xD9, 0x16, 0x3C, 0xC7, 0x47, 0x7A, 0x2B, 0x62, 0xC5, 0x29, 0x08, 0x03, 0xC6, 0xCE, 0x7B, 0xAB,
+ 0x9B, 0x96, 0x69, 0x42, 0x9A, 0x27, 0x23, 0x0E, 0xAC, 0x69, 0xDA, 0x84, 0xD3, 0xCC, 0xFF, 0x55,
+ 0x58, 0x30, 0x45, 0xFD, 0xBE, 0xA2, 0x25, 0xE1, 0x66, 0xF9, 0x70, 0xAE, 0x1E, 0xC3, 0x3E, 0xC6,
+ 0xF8, 0xF2, 0x0D, 0xA6, 0x49, 0x1F, 0x73, 0x82, 0xBE, 0x74, 0x8C, 0x3B, 0xD7, 0xF1, 0xDA, 0x94,
+ 0x41, 0x20, 0xD4, 0x45, 0xD8, 0xB4, 0x44, 0x97, 0x85, 0x12, 0xE9, 0xB4, 0x4A, 0xDF, 0xD4, 0xED,
+ 0xA5, 0x7D, 0xCD, 0x15, 0x08, 0xD2, 0x7C, 0x46, 0xF4, 0x34, 0x0C, 0x0C, 0x56, 0x4A, 0xFA, 0xDB,
+ 0x8B, 0xC2, 0xB3, 0x0F, 0xB4, 0xEB, 0x26, 0xB6, 0xA7, 0x0A, 0x0C, 0xB7, 0x19, 0x0A, 0x2C, 0x27,
+ 0xC9, 0x1B, 0x83, 0x4B, 0x32, 0xAE, 0xBE, 0x11, 0xA3, 0xBC, 0x3D, 0x94, 0x2B, 0xC8, 0xCB, 0x5D,
+ 0x1F, 0xA6, 0x7C, 0xB6, 0x4C, 0x5E, 0xCF, 0xA4, 0x51, 0x90, 0xDB, 0xE2, 0xBA, 0x4D, 0x14, 0x9D,
+ 0x22, 0x1E, 0x82, 0x2E, 0x28, 0xB9, 0x94, 0x83, 0x46, 0x63, 0xD6, 0xEA, 0x14, 0x03, 0xDE, 0x74,
+ 0x09, 0xD4, 0x21, 0x07, 0xFA, 0xEB, 0x36, 0xB5, 0x76, 0x7D, 0x98, 0xBC, 0x3A, 0x9E, 0xD4, 0xB3,
+ 0x24, 0x35, 0x87, 0x0C, 0x70, 0x09, 0x7C, 0xE4, 0x70, 0x46, 0x6C, 0x8C, 0x19, 0xD0, 0x42, 0xE9,
+ 0x24, 0x2F, 0xCA, 0x16, 0xAD, 0x21, 0xD1, 0x16, 0xDF, 0x01, 0xEC, 0x23, 0xCA, 0xE3, 0x81, 0xD2,
+ 0x53, 0x20, 0x7E, 0xA1, 0x99, 0x8E, 0x88, 0x5D, 0x73, 0xF8, 0xD9, 0x0E, 0x37, 0xB4, 0xF3, 0xE9,
+ 0x66, 0x7B, 0x2D, 0xA0, 0x5B, 0x4B, 0x28, 0xE5, 0xE3, 0x6C, 0xA2, 0x82, 0x6C, 0xA9, 0xE7, 0x1C,
+ 0xD3, 0x33, 0x2C, 0xB4, 0x7D, 0x95, 0xEA, 0x9F, 0x20, 0xEF, 0x02, 0x38, 0x26, 0x3C, 0x5F, 0x39,
+ 0xBB, 0xFA, 0x75, 0x10, 0xBE, 0x00, 0x1A, 0x4B, 0xE8, 0xBC, 0x1B, 0xCE, 0x02, 0x59, 0x97, 0x36,
+ 0xD9, 0xE9, 0x03, 0x2B, 0x1A, 0x54, 0x35, 0x31, 0x9E, 0x59, 0xDE, 0x46, 0x56, 0x5D, 0xF6, 0xB5,
+ 0x91, 0xBC, 0x52, 0xB6, 0xB5, 0x9A, 0xF6, 0x8B, 0x5B, 0xE4, 0x7D, 0x4F, 0xD6, 0x74, 0x2A, 0x7D,
+ 0xC3, 0x85, 0x50, 0xF4, 0xCD, 0x3A, 0x81, 0x3C, 0x2C, 0xA5, 0xF5, 0xAF, 0xE2, 0xA9, 0x9F, 0x97,
+ 0xE5, 0x7B, 0x67, 0x64, 0x46, 0xD4, 0x7C, 0x1A, 0x41, 0xD4, 0x2D, 0x7C, 0xE3, 0xD9, 0xFA, 0x2A,
+ 0xDE, 0x83, 0x17, 0xEC, 0x78, 0x02, 0x7D, 0xAF, 0x4A, 0x06, 0x53, 0xE3, 0x44, 0x0B, 0x06, 0xEC,
+ 0xD4, 0xA7, 0xA5, 0x87, 0x09, 0x23, 0x44, 0x76, 0x3D, 0xD4, 0xA5, 0xEF, 0x5C, 0x75, 0x3A, 0xF7,
+ 0x99, 0xC8, 0x21, 0x6A, 0xFB, 0xBF, 0x0D, 0x08, 0xF0, 0xEE, 0xD6, 0x7E, 0xF8, 0x67, 0x02, 0x87,
+ 0xCA, 0x94, 0x27, 0x4D, 0x0C, 0x5F, 0xA1, 0x94, 0xC9, 0x1F, 0xE1, 0x4B, 0x93, 0x2D, 0x40, 0xE0,
+ 0x25, 0x5A, 0xDB, 0x28, 0xBE, 0x7F, 0xFD, 0x0D, 0x6D, 0x22, 0xF4, 0x31, 0xE5, 0x1C, 0x84, 0x71,
+ 0x09, 0x5F, 0x1D, 0x78, 0xE9, 0x64, 0xD9, 0xB9, 0x82, 0x7D, 0xF5, 0x9B, 0x73, 0x4F, 0x74, 0x8B,
+ 0xA1, 0xB3, 0xC2, 0x01, 0x30, 0x1E, 0x20, 0x72, 0xB9, 0xB8, 0x92, 0x1A, 0xFE, 0x34, 0xF8, 0x5F,
+ 0x69, 0xEC, 0x09, 0x41, 0x50, 0x77, 0x44, 0xF9, 0x68, 0xE4, 0xEC, 0xC7, 0xB5, 0xA3, 0x45, 0x6B,
+ 0x03, 0xC4, 0xE8, 0xA0, 0x53, 0xF2, 0x94, 0xB9, 0x49, 0xA0, 0x6D, 0x11, 0xBA, 0x1C, 0x89, 0x87,
+ 0x08, 0x72, 0xC0, 0xE3, 0x7B, 0x0C, 0x8D, 0x18, 0xDD, 0xB0, 0x3B, 0x0E, 0xC2, 0x0E, 0xBB, 0x4B,
+ 0x61, 0x22, 0x48, 0x64, 0x69, 0x54, 0xE8, 0x29, 0x94, 0x84, 0xE5, 0xD7, 0x1A, 0x5F, 0x4B, 0xBC,
+ 0xAD, 0x35, 0x82, 0xF1, 0xFD, 0x40, 0x14, 0xAE, 0xD0, 0x28, 0x0E, 0xE9, 0xEE, 0x2E, 0x88, 0xFF,
+ 0xD1, 0xC9, 0xC5, 0x36, 0x39, 0xFB, 0x9F, 0xC9, 0x85, 0x97, 0x2A, 0x58, 0x07, 0xD9, 0x6E, 0x6E,
+ 0x83, 0x09, 0x6D, 0xC6, 0x92, 0x1C, 0xBF, 0x50, 0xE3, 0xCB, 0xAD, 0x50, 0x3C, 0xDB, 0xF9, 0xE3,
+ 0x32, 0x51, 0x58, 0x20, 0xE6, 0xD8, 0xCA, 0x50, 0xF7, 0x50, 0x05, 0xAF, 0xB6, 0xF7, 0xAB, 0x3E,
+ 0x48, 0xB7, 0xA4, 0xB1, 0x52, 0x32, 0x2A, 0xD6, 0xC2, 0x78, 0x62, 0x05, 0x34, 0x96, 0x61, 0xF1,
+ 0x21, 0x14, 0x69, 0x6F, 0x10, 0x96, 0xDD, 0xE2, 0x1D, 0xEB, 0xE5, 0x4F, 0xA0, 0x67, 0xA8, 0x46,
+ 0x52, 0xBD, 0x2F, 0xA5, 0x59, 0xF8, 0xCB, 0xB2, 0x51, 0x09, 0xD3, 0x13, 0x9C, 0x37, 0xD3, 0x9B,
+ 0xD4, 0x5C, 0x8E, 0xF9, 0xF2, 0xE4, 0xBF, 0x69, 0xA2, 0xB2, 0x06, 0xC1, 0xF5, 0x65, 0xB9, 0x0A,
+ 0xC6, 0x73, 0x77, 0xEF, 0x4E, 0x50, 0x2D, 0x2C, 0xEE, 0xFF, 0xE9, 0x61, 0x8A, 0x07, 0xC9, 0x64,
+ 0x48, 0x27, 0x4B, 0xCE, 0xE1, 0x80, 0xCC, 0x14, 0x8F, 0x42, 0x92, 0x4D, 0x6F, 0x87, 0x48, 0x90,
+ 0x29, 0xF4, 0x4E, 0x72, 0x2C, 0xCC, 0x1A, 0xDD, 0x96, 0xDA, 0xFE, 0xD7, 0xCB, 0xEE, 0x6F, 0xA4,
+ 0xA0, 0xCB, 0xEE, 0x7F, 0xB3, 0x21, 0x54, 0xBA, 0x6F, 0xC9, 0x53, 0x66, 0x7B, 0x38, 0xEC, 0xF4,
+ 0x5F, 0xA0, 0x99, 0x23, 0x5F, 0x79, 0xD7, 0x08, 0xCC, 0x74, 0xDA, 0x02, 0xA1, 0xFC, 0x01, 0xF0,
+ 0xF6, 0xA9, 0x9C, 0xA5, 0x85, 0xC6, 0x7E, 0xF6, 0x0F, 0x53, 0x11, 0x91, 0x92, 0x6D, 0x60, 0xC7,
+ 0x63, 0xD5, 0x1C, 0x84, 0x7E, 0x91, 0xDA, 0x97, 0x5B, 0xD8, 0x3D, 0xBF, 0x83, 0xC3, 0x42, 0xC1,
+ 0xDB, 0xB6, 0xE3, 0xFB, 0x9F, 0x40, 0x36, 0x6E, 0xB9, 0x8F, 0x44, 0xB8, 0x73, 0x2C, 0x14, 0xBD,
+ 0x6C, 0x5E, 0x71, 0x76, 0xD2, 0xB9, 0xA2, 0x0B, 0xEC, 0xD4, 0x97, 0x9A, 0x1F, 0xCF, 0x0C, 0x3D,
+ 0x5F, 0x49, 0x24, 0x08, 0x3C, 0xEC, 0xCE, 0xA3, 0x16, 0xFC, 0x7B, 0xD9, 0x98, 0x73, 0xEF, 0x74,
+ 0x76, 0x0E, 0x51, 0x94, 0xBC, 0x18, 0x71, 0xAB, 0x43, 0xA8, 0x27, 0xA1, 0x5D, 0x69, 0x23, 0xB5,
+ 0x5C, 0xFB, 0xFB, 0xD1, 0xBE, 0x59, 0x9C, 0x35, 0x1B, 0x5D, 0x49, 0x58, 0xEB, 0x06, 0xFB, 0x0E,
+ 0xFC, 0x3B, 0x4B, 0x47, 0xF9, 0x80, 0xD2, 0x50, 0x97, 0xA1, 0xFB, 0x2F, 0x0D, 0x65, 0x7A, 0x30,
+ 0xA3, 0x33, 0x04, 0x44, 0x0B, 0x4A, 0x88, 0xEB, 0x59, 0x1A, 0xA5, 0x96, 0x8C, 0x09, 0x1E, 0x26,
+ 0x6A, 0x89, 0x74, 0x0C, 0x97, 0xDE, 0x51, 0x1C, 0x49, 0x16, 0x99, 0xDE, 0x80, 0x95, 0xDA, 0x0B,
+ 0xD6, 0x0B, 0x85, 0x83, 0x13, 0x70, 0xCC, 0x60, 0xE3, 0x24, 0xDA, 0xB1, 0xE9, 0x8E, 0x29, 0x04,
+ 0x68, 0xE7, 0x85, 0x0F, 0x78, 0x9D, 0x69, 0x9A, 0x3A, 0xFC, 0x1B, 0x34, 0x65, 0x9D, 0x0D, 0x84,
+ 0xF5, 0x21, 0x30, 0xF6, 0xDF, 0x4E, 0xC5, 0xEB, 0x8C, 0x9A, 0x5F, 0x00, 0xDE, 0x19, 0x2B, 0x1F,
+ 0x7C, 0x86, 0x7D, 0x43, 0xA2, 0x43, 0xC5, 0xA9, 0xDD, 0x84, 0x18, 0x90, 0xAB, 0x4C, 0xD3, 0x0B,
+ 0x01, 0xA6, 0xCC, 0x04, 0x24, 0xF0, 0x0C, 0x3A, 0x8B, 0x20, 0x36, 0x1C, 0xBF, 0x40, 0x5E, 0x1F,
+ 0x70, 0x7D, 0x69, 0xAA, 0xF6, 0xA8, 0x7B, 0x0F, 0x55, 0x4C, 0x63, 0xB8, 0x28, 0x8B, 0x9F, 0xB1,
+ 0xF9, 0x84, 0x20, 0x7C, 0xFD, 0x41, 0x94, 0xAA, 0x92, 0xE0, 0x4E, 0x66, 0x7B, 0x4D, 0xBF, 0x96,
+ 0xA3, 0xE9, 0x9B, 0xEC, 0xD5, 0x75, 0x8B, 0x08, 0x8A, 0x1A, 0xFF, 0x0C, 0xF3, 0x9D, 0xFC, 0x92,
+ 0x61, 0x19, 0x41, 0x5A, 0x52, 0x5E, 0xC2, 0x91, 0xFE, 0xD8, 0x8F, 0xF2, 0xD6, 0x0B, 0x73, 0x4B,
+ 0x1F, 0x63, 0x30, 0xC5, 0x8E, 0x85, 0x8C, 0xE2, 0xEA, 0xE1, 0xDC, 0xBC, 0xDA, 0xF7, 0xA1, 0xBA,
+ 0x3F, 0xCC, 0xD7, 0xAC, 0xF8, 0xAD, 0xB8, 0x53, 0x82, 0x3B, 0xD3, 0x69, 0xC1, 0xDD, 0xB7, 0xD5,
+ 0x89, 0x89, 0x50, 0xF7, 0x73, 0x56, 0xA7, 0xC5, 0x05, 0xB5, 0xEE, 0xE6, 0x4A, 0x22, 0xF8, 0x33,
+ 0xEB, 0xED, 0xF2, 0xDE, 0x73, 0x02, 0x95, 0x3C, 0x0E, 0x4E, 0x5B, 0x0B, 0xE7, 0x6C, 0xF7, 0xE1,
+ 0xF8, 0x67, 0x8A, 0xDF, 0x41, 0x3F, 0xCC, 0x5E, 0x0C, 0xD6, 0x6E, 0x96, 0xBF, 0x95, 0x71, 0x4C,
+ 0x79, 0x7C, 0x3B, 0x88, 0x46, 0x73, 0x96, 0xA2, 0xDA, 0x6C, 0x71, 0xEC, 0x54, 0x14, 0x79, 0x1E,
+ 0x47, 0xF8, 0x94, 0x63, 0x28, 0x4A, 0xFB, 0xBB, 0x82, 0x66, 0x91, 0x99, 0x0E, 0xBE, 0xBB, 0x33,
+ 0x4D, 0x55, 0xE2, 0x08, 0xCA, 0xE7, 0x52, 0x4A, 0xED, 0x64, 0xFF, 0xDD, 0xF7, 0xF9, 0xEA, 0x7D,
+ 0xD0, 0xBD, 0xB9, 0xAC, 0x62, 0x3B, 0xBC, 0xC6, 0x47, 0xEF, 0xEC, 0xA0, 0x6D, 0x7D, 0x0F, 0xD8,
+ 0xC6, 0x10, 0x90, 0x29, 0xCB, 0xF3, 0xA1, 0xC2, 0x2B, 0x1D, 0xDD, 0x43, 0x6A, 0x49, 0xCB, 0x1F,
+ 0x8C, 0x29, 0xC4, 0x4A, 0xAB, 0xCB, 0xD3, 0x89, 0xF6, 0x24, 0x73, 0xA3, 0xA0, 0x5C, 0x9E, 0xE2,
+ 0x93, 0x2C, 0x18, 0x6A, 0xA1, 0x07, 0x5A, 0x77, 0xAA, 0x26, 0x38, 0x2C, 0xF0, 0xA9, 0xFC, 0x6C,
+ 0x94, 0xBE, 0xAF, 0x20, 0xCA, 0x8B, 0xB1, 0x7B, 0x9A, 0x3A, 0xBD, 0x0B, 0xF5, 0x03, 0x73, 0x6D,
+ 0x6F, 0x15, 0xB1, 0x8F, 0x85, 0xDE, 0x24, 0x47, 0x94, 0x1B, 0x94, 0x25, 0xA5, 0x85, 0x31, 0x33,
+ 0x75, 0xA9, 0x0E, 0x16, 0x90, 0x12, 0x91, 0x72, 0x0F, 0x1E, 0x47, 0x7B, 0x42, 0xB4, 0x99, 0x9E,
+ 0xDA, 0xD8, 0xD9, 0xB4, 0x2C, 0xA4, 0x06, 0x05, 0x2F, 0x83, 0xF6, 0xE7, 0x6D, 0x7A, 0x9E, 0x40,
+ 0xCE, 0x91, 0x37, 0x6C, 0x2A, 0x90, 0x87, 0x5D, 0x3E, 0xAA, 0xDB, 0x45, 0x55, 0xEC, 0x79, 0x03,
+ 0x03, 0x22, 0x3B, 0x61, 0x73, 0xBD, 0x53, 0xF3, 0x5A, 0x9B, 0xD4, 0xB4, 0x0E, 0x2C, 0x68, 0x5F,
+ 0x5D, 0x1B, 0xCC, 0xD6, 0x11, 0x7B, 0xA0, 0x4A, 0xB6, 0xD0, 0x56, 0xD0, 0x26, 0xC1, 0xFE, 0x3B,
+ 0x05, 0x20, 0x05, 0xC0, 0xBA, 0xF4, 0xB7, 0x2B, 0x55, 0xE7, 0x69, 0x67, 0xB2, 0x7A, 0xB5, 0x59,
+ 0x78, 0xB4, 0x3E, 0x80, 0x08, 0x20, 0xD8, 0x75, 0x28, 0xF1, 0x21, 0xFE, 0xA3, 0x86, 0xD1, 0x21,
+ 0x76, 0x1F, 0xA6, 0x95, 0x60, 0xA7, 0x5E, 0xB5, 0x68, 0x25, 0xB7, 0x02, 0x56, 0xDA, 0xF8, 0x6D,
+ 0xE3, 0x79, 0x31, 0x63, 0x76, 0xC4, 0x9B, 0x16, 0x08, 0xCA, 0xA8, 0xBA, 0xA0, 0x5A, 0x9A, 0x76,
+ 0x3D, 0x09, 0x80, 0x54, 0x89, 0x50, 0xFC, 0x4F, 0x04, 0x52, 0x2C, 0xAB, 0x01, 0x3B, 0x52, 0xA7,
+ 0x7E, 0x4F, 0x0C, 0x08, 0xE2, 0x18, 0x6F, 0xC6, 0xDF, 0x77, 0x09, 0xE4, 0x21, 0x5E, 0xD7, 0xE2,
+ 0x4A, 0x15, 0x1C, 0xB5, 0xFD, 0x6F, 0x4D, 0xC6, 0xC8, 0x97, 0x26, 0x9F, 0x7C, 0x97, 0xE8, 0x05,
+ 0x4C, 0x89, 0xC3, 0xA6, 0x89, 0x38, 0x11, 0xAB, 0xEC, 0x7E, 0xF4, 0x4C, 0xE1, 0x3A, 0x37, 0x24,
+ 0x57, 0xD9, 0x93, 0xCE, 0x9E, 0xC8, 0x22, 0x78, 0xBB, 0xDB, 0x35, 0x99, 0xFB, 0x82, 0xF4, 0x56,
+ 0x3B, 0x4B, 0x72, 0xE3, 0xF1, 0x48, 0xF3, 0xFE, 0x4B, 0x08, 0xAB, 0x33, 0xF7, 0x30, 0x57, 0xB1,
+ 0x9E, 0xF0, 0xE1, 0xCD, 0x11, 0x7D, 0xD2, 0x1B, 0x33, 0xE8, 0x22, 0xF2, 0xA4, 0x90, 0xB7, 0xD1,
+ 0xFA, 0xA9, 0xB3, 0x23, 0x0F, 0x0F, 0xF4, 0x56, 0x9C, 0x15, 0x31, 0x59, 0x2C, 0x6F, 0xE4, 0xD6,
+ 0x3A, 0xB4, 0x06, 0xCF, 0x80, 0xDD, 0xAE, 0x6F, 0x9B, 0x54, 0x74, 0x31, 0x66, 0xF5, 0x1F, 0x41,
+ 0x0B, 0x4B, 0x19, 0x11, 0xA7, 0x7B, 0x58, 0x29, 0x96, 0x83, 0x44, 0x54, 0x63, 0xAF, 0x09, 0x6B,
+ 0xA4, 0xFE, 0x03, 0xCC, 0xA8, 0xCA, 0x4A, 0xDC, 0xD9, 0x95, 0x56, 0xEB, 0x2E, 0x79, 0x7C, 0xCE,
+ 0xDC, 0x14, 0x26, 0xF5, 0x94, 0x9D, 0x9D, 0xD1, 0x95, 0x09, 0x8B, 0x2E, 0x21, 0xA0, 0x96, 0xC5,
+ 0x4E, 0x09, 0xA0, 0x35, 0x92, 0xAA, 0x95, 0x3C, 0x30, 0xE7, 0xC7, 0x6A, 0x7B, 0xB1, 0x62, 0x01,
+ 0x7D, 0x62, 0x78, 0x77, 0x62, 0xE6, 0x08, 0x63, 0x77, 0x5E, 0xE1, 0x0A, 0xFD, 0xB5, 0x08, 0xE1,
+ 0xED, 0x79, 0x27, 0xD9, 0xB8, 0x1D, 0xB6, 0xBA, 0x3D, 0x6C, 0xA0, 0xB5, 0xA6, 0xE1, 0x92, 0x18,
+ 0x15, 0xC9, 0x25, 0x25, 0xF6, 0x21, 0x7A, 0x4E, 0x2E, 0x18, 0x08, 0x8D, 0x54, 0x79, 0x35, 0xED,
+ 0x76, 0x2F, 0x39, 0xB1, 0x38, 0x38, 0x9F, 0xB6, 0xF4, 0x2D, 0xBF, 0x55, 0x64, 0x3F, 0xEB, 0x49,
+ 0x17, 0x5D, 0xEC, 0x07, 0xC1, 0x08, 0x4E, 0x75, 0xE7, 0xE8, 0xF7, 0xA3, 0xB5, 0x63, 0x01, 0x27,
+ 0xCF, 0xF5, 0x39, 0xDD, 0x65, 0x38, 0x4C, 0xD4, 0xE3, 0xAA, 0xAD, 0x55, 0xD3, 0x3C, 0x6E, 0xC4,
+ 0x99, 0x09, 0x3E, 0xD1, 0xA5, 0x0B, 0xEF, 0xF2, 0x08, 0xA1, 0xBE, 0xD8, 0xE0, 0x7C, 0x58, 0xB9,
+ 0x9E, 0x2E, 0x95, 0x4A, 0xAA, 0x1D, 0xEE, 0xE3, 0x2F, 0x6A, 0xE2, 0x94, 0x70, 0xC4, 0x1C, 0x07,
+ 0xCC, 0x76, 0xE0, 0x40, 0xEA, 0x6D, 0xB4, 0x83, 0xA0, 0x6A, 0x97, 0x76, 0x84, 0x11, 0x40, 0x9F,
+ 0xCA, 0x18, 0x00, 0x6F, 0x7D, 0x07, 0xBE, 0xC9, 0xFC, 0x2D, 0xD7, 0xAF, 0x60, 0x76, 0xC9, 0xD8,
+ 0x28, 0xC2, 0xC8, 0xA8, 0xD7, 0x60, 0x90, 0x64, 0x6C, 0xED, 0xEE, 0xFD, 0x2C, 0xD1, 0x3F, 0x35,
+ 0xD4, 0xCB, 0xA0, 0x34, 0xAA, 0xB0, 0x3A, 0x91, 0x07, 0x1B, 0xD4, 0xB5, 0x33, 0xD2, 0xD3, 0x9D,
+ 0x08, 0xCD, 0x45, 0x01, 0x83, 0x04, 0xB1, 0xE7, 0x0C, 0x1A, 0x57, 0x9F, 0xBB, 0xED, 0x37, 0x46,
+ 0xB1, 0x16, 0x87, 0x3C, 0x20, 0xDE, 0x63, 0x10, 0xAF, 0x2D, 0x77, 0x71, 0x56, 0xEF, 0x7C, 0x14,
+ 0xD0, 0xE3, 0x1E, 0xFB, 0x1F, 0x77, 0x18, 0x1E, 0xA8, 0xD3, 0x40, 0xA7, 0xD7, 0x1F, 0x36, 0x7D,
+ 0x87, 0x1C, 0x42, 0xF6, 0x2F, 0x51, 0xAF, 0x69, 0x2C, 0xCF, 0x79, 0x11, 0xD1, 0x17, 0x47, 0xD3,
+ 0x44, 0x86, 0x9D, 0x2B, 0x44, 0xA3, 0x74, 0x1C, 0x83, 0x75, 0xAB, 0xD1, 0xA5, 0xFE, 0x14, 0x0A,
+ 0x41, 0x76, 0x89, 0x1B, 0x08, 0x4F, 0x29, 0x30, 0x82, 0xD1, 0xFE, 0xD6, 0x0B, 0x71, 0xCD, 0x2C,
+ 0x8E, 0x31, 0x69, 0xAF, 0xD8, 0x67, 0xA6, 0x1A, 0x8E, 0x2A, 0xD4, 0xF1, 0x83, 0xC3, 0xEC, 0x08,
+ 0x76, 0x27, 0xA3, 0xB5, 0xF6, 0x7B, 0xC2, 0x6F, 0xEA, 0xD0, 0x52, 0x6C, 0x6E, 0x2F, 0x18, 0xBB,
+ 0x23, 0x10, 0x3E, 0x7F, 0x37, 0x90, 0x89, 0x7E, 0xF4, 0xBA, 0x47, 0x09, 0xCE, 0x80, 0x34, 0x5D,
+ 0x20, 0x87, 0x1F, 0x76, 0x30, 0xBF, 0xC3, 0xFC, 0x3C, 0xB3, 0x88, 0x89, 0xC9, 0x3D, 0xA4, 0xF4,
+ 0xCE, 0x7E, 0x93, 0xA6, 0x88, 0xFA, 0xAC, 0x32, 0x64, 0x19, 0x76, 0xE7, 0xE0, 0xAE, 0x4B, 0x4F,
+ 0xC3, 0xAC, 0x82, 0xD9, 0xDB, 0x3D, 0xBE, 0x3E, 0x58, 0x4B, 0xBF, 0xD0, 0x17, 0x43, 0xEC, 0x17,
+ 0xEA, 0xFA, 0xA9, 0x6F, 0x9A, 0x33, 0xC2, 0xB9, 0xDC, 0xFF, 0x80, 0x14, 0x9D, 0xD6, 0xA1, 0x41,
+ 0x7F, 0xFE, 0x08, 0x57, 0x21, 0xD6, 0xEB, 0xED, 0xEF, 0xA2, 0xAD, 0x5D, 0x9E, 0xC5, 0x31, 0xC6,
+ 0xBE, 0x73, 0xB9, 0x7D, 0x58, 0x12, 0x28, 0x35, 0x0A, 0xB7, 0x56, 0x9A, 0x23, 0x61, 0x0B, 0x3B,
+ 0x8D, 0x20, 0x35, 0xC7, 0xBF, 0xB1, 0xCE, 0x33, 0x28, 0xEC, 0x2F, 0x71, 0x49, 0xE1, 0x90, 0x36,
+ 0x53, 0x9D, 0x19, 0xB1, 0xBB, 0xFF, 0xF4, 0x50, 0x89, 0xE8, 0x69, 0x88, 0xAF, 0xB6, 0x58, 0x46,
+ 0xDF, 0x73, 0xEC, 0x5B, 0x82, 0xA6, 0xDC, 0x18, 0x71, 0x81, 0xE3, 0x03, 0x25, 0x71, 0x0E, 0x0B,
+ 0xB5, 0x63, 0x67, 0x1A, 0xD1, 0x13, 0x0A, 0xE5, 0xFF, 0x4B, 0x97, 0xEA, 0xBB, 0x75, 0xD7, 0x31,
+ 0xCD, 0x4B, 0x06, 0xBD, 0x6E, 0xB1, 0xA1, 0xD9, 0x30, 0x52, 0x8F, 0xF4, 0x4C, 0x51, 0x16, 0x72,
+ 0x73, 0x81, 0x48, 0x88, 0x3F, 0x9B, 0x80, 0x40, 0xDD, 0xE7, 0xA4, 0x98, 0xC3, 0xB6, 0x7A, 0xF9,
+ 0x91, 0xA1, 0xB1, 0xBB, 0x1D, 0x16, 0x3D, 0x13, 0xF9, 0x7D, 0xD9, 0x31, 0xE6, 0x19, 0x83, 0xCF,
+ 0xA6, 0x59, 0xC9, 0x8F, 0xF7, 0x1E, 0xA3, 0x9C, 0x2B, 0x65, 0x9D, 0x21, 0x5B, 0x7C, 0xA4, 0x4D,
+ 0x07, 0x24, 0x99, 0xA2, 0x51, 0xDF, 0x4D, 0x5F, 0xB6, 0xB0, 0x17, 0xAA, 0xEF, 0x16, 0xAB, 0x45,
+ 0xAA, 0xD2, 0xA0, 0xBC, 0x09, 0x1B, 0x9A, 0x3C, 0x27, 0x86, 0xE0, 0xAD, 0x9E, 0xE4, 0x4D, 0x73,
+ 0x09, 0x88, 0xCC, 0x55, 0x2A, 0x8A, 0x33, 0x29, 0x84, 0xD1, 0x8D, 0xF6, 0xE6, 0xDF, 0x27, 0x70,
+ 0xA0, 0xD6, 0x5B, 0x31, 0xEE, 0x7E, 0x7A, 0x31, 0x87, 0xF2, 0xCC, 0x4C, 0xBE, 0x63, 0xC1, 0x41,
+ 0xC6, 0x39, 0xFA, 0x3B, 0x9A, 0x60, 0x05, 0x29, 0xDF, 0x91, 0x9E, 0x3B, 0x7B, 0xDB, 0x8F, 0x6E,
+ 0xFB, 0x0F, 0xF1, 0x20, 0xC7, 0x08, 0x47, 0x2A, 0x14, 0xB4, 0x7C, 0x93, 0xEB, 0x63, 0xE3, 0x03,
+ 0xC7, 0x4D, 0x9F, 0x7D, 0x29, 0x7F, 0xC3, 0x03, 0x44, 0x89, 0x22, 0x8D, 0x2D, 0xF1, 0x86, 0xCB,
+ 0x28, 0xBE, 0x39, 0xAC, 0x16, 0xBB, 0x73, 0xB2, 0x44, 0xC6, 0xA5, 0x63, 0x06, 0xE2, 0xED, 0x76,
+ 0x95, 0x73, 0x02, 0xCE, 0x6A, 0x7E, 0x55, 0x2D, 0x2A, 0x1D, 0x78, 0x30, 0x3B, 0x0A, 0xAB, 0x3A,
+ 0xDB, 0x21, 0xD8, 0x6D, 0xA4, 0xBE, 0xAD, 0x07, 0xD1, 0x08, 0xAC, 0x26, 0xBC, 0x4F, 0x50, 0x31,
+ 0xA2, 0xDA, 0x18, 0x75, 0xA2, 0xE9, 0x1D, 0x93, 0xB6, 0x34, 0x01, 0xA5, 0xE9, 0xBE, 0x94, 0x7B,
+ 0x33, 0x61, 0x7C, 0x71, 0xE3, 0x72, 0x78, 0x45, 0x3D, 0x2A, 0x7A, 0x87, 0x5B, 0x8D, 0x4E, 0xF8,
+ 0x79, 0x01, 0xF6, 0x49, 0x5B, 0x9B, 0xBD, 0xB8, 0xC8, 0xAE, 0xBD, 0xC2, 0x5D, 0x14, 0x8B, 0x51,
+ 0x4F, 0x86, 0x56, 0xB2, 0xD8, 0xF5, 0x5C, 0x0F, 0x38, 0xDC, 0x30, 0x15, 0x2B, 0x6A, 0x15, 0x98,
+ 0x08, 0x23, 0x5A, 0xEA, 0x1E, 0xCA, 0xC7, 0xAC, 0x74, 0x26, 0xD0, 0x7C, 0xC6, 0x75, 0x1A, 0x67,
+ 0x1E, 0xD3, 0xD3, 0x26, 0x9F, 0x82, 0x2E, 0x90, 0x5D, 0x50, 0xD1, 0x4F, 0x2B, 0x79, 0x5C, 0xCE,
+ 0x4A, 0x8F, 0x9F, 0xBB, 0x60, 0xD4, 0x21, 0x92, 0x63, 0x3E, 0xBC, 0x77, 0x57, 0x0E, 0xC0, 0x56,
+ 0x62, 0x6F, 0x47, 0x75, 0x88, 0xF0, 0x87, 0xA3, 0xCC, 0x1F, 0x12, 0xCC, 0xA2, 0x0B, 0x74, 0x19,
+ 0xEE, 0xD6, 0x2F, 0x5C, 0x34, 0x06, 0x50, 0x7D, 0xBB, 0xB6, 0x21, 0xDB, 0xB4, 0xB1, 0x8C, 0x88,
+ 0x42, 0x8E, 0x3B, 0xBF, 0x89, 0x5F, 0x89, 0x77, 0x5A, 0x46, 0xE4, 0x02, 0xE4, 0x48, 0xBB, 0xA9,
+ 0x3F, 0x09, 0xAA, 0x1F, 0x62, 0x98, 0xF8, 0xE6, 0xCD, 0x62, 0xCB, 0xF7, 0xD0, 0x1D, 0xA4, 0x7A,
+ 0x18, 0x0A, 0x0D, 0x44, 0x6C, 0x14, 0xDB, 0x97, 0x94, 0xCA, 0x98, 0x7F, 0x60, 0x36, 0x1E, 0x13,
+ 0x52, 0xE8, 0x7F, 0x18, 0xEE, 0x99, 0xFA, 0xCB, 0x23, 0x5D, 0xB1, 0x2B, 0xA1, 0xFE, 0xD6, 0xB0,
+ 0x77, 0x13, 0xE4, 0x55, 0xCC, 0x56, 0xFA, 0x8E, 0x29, 0x25, 0xA9, 0xDF, 0x81, 0x58, 0xEE, 0xB6,
+ 0x3B, 0xC2, 0x29, 0xB4, 0x1E, 0x72, 0xCA, 0x55, 0xD3, 0x7B, 0xA6, 0xDD, 0x48, 0x96, 0x3B, 0x76,
+ 0x3A, 0x41, 0xF3, 0x2A, 0x94, 0x13, 0xF3, 0x51, 0xC3, 0x00, 0x09, 0x4F, 0x88, 0xBA, 0x24, 0xD1,
+ 0x14, 0x12, 0x14, 0x2D, 0xC1, 0xAB, 0x3B, 0x21, 0x54, 0x8B, 0x4C, 0xDC, 0x17, 0x08, 0x1E, 0xE8,
+ 0x83, 0x4A, 0x3E, 0x25, 0x0E, 0x7B, 0xBC, 0xD5, 0xC7, 0xCA, 0x13, 0x31, 0x1B, 0xD8, 0x8F, 0xE2,
+ 0x4A, 0x23, 0x24, 0xA9, 0x69, 0xF4, 0x8E, 0x65, 0xB2, 0xEF, 0xA1, 0x83, 0xFF, 0xBF, 0x01, 0xE7,
+ 0x8B, 0xFC, 0xD1, 0x92, 0x91, 0xCF, 0x3D, 0xB7, 0x49, 0x3B, 0xF5, 0x81, 0x54, 0xB1, 0xFF, 0xB6,
+ 0xD9, 0x2C, 0x31, 0xA1, 0xC0, 0x8F, 0x56, 0x54, 0x52, 0x5B, 0x7D, 0x80, 0x61, 0x44, 0x44, 0x8C,
+ 0xC4, 0xFA, 0x8E, 0x59, 0xDE, 0xA1, 0xC5, 0xFB, 0xF7, 0x40, 0xE7, 0xD6, 0x06, 0x55, 0xC3, 0x19,
+ 0x73, 0x21, 0xFD, 0x86, 0x8C, 0x68, 0x1B, 0x37, 0x7A, 0xC9, 0xC4, 0x70, 0x07, 0x38, 0x15, 0x03,
+ 0xA7, 0x2A, 0xBD, 0x37, 0x8A, 0xD0, 0x63, 0x13, 0x66, 0xEA, 0x9D, 0x65, 0x67, 0x87, 0x78, 0xE8,
+ 0xD2, 0x7E, 0xDB, 0x90, 0xA2, 0xAC, 0x9F, 0xAC, 0x7A, 0x81, 0xF1, 0x5F, 0x4C, 0x6C, 0x53, 0x0C,
+ 0xD5, 0x9E, 0x64, 0x1D, 0xD1, 0x85, 0x5D, 0x65, 0x54, 0x9C, 0xE5, 0x20, 0xF7, 0xE5, 0x9C, 0x03,
+ 0x29, 0x71, 0x9A, 0xE4, 0xC7, 0xD1, 0x91, 0x07, 0x66, 0x60, 0x89, 0x37, 0xF9, 0x3F, 0x58, 0x7D,
+ 0x07, 0x06, 0xCC, 0xEE, 0x05, 0x49, 0xEA, 0x50, 0xD7, 0x4A, 0x76, 0x63, 0x16, 0x66, 0xE3, 0x1D,
+ 0xDC, 0xCA, 0x3B, 0x0B, 0x89, 0x4C, 0xF8, 0x04, 0xD2, 0x50, 0x62, 0x2C, 0x1B, 0x7E, 0x62, 0x8B,
+ 0x7B, 0x55, 0x68, 0x3F, 0xAC, 0xD0, 0x5E, 0xB4, 0xF8, 0x25, 0xE5, 0xEA, 0x40, 0xA4, 0x06, 0x7B,
+ 0xA3, 0xC6, 0x8B, 0xE1, 0x4A, 0x83, 0x4B, 0xCC, 0x9C, 0xDA, 0x7C, 0x9F, 0xF6, 0xE7, 0x7A, 0xC2,
+ 0xDD, 0x9E, 0x2F, 0xB4, 0x3A, 0x07, 0xBA, 0x47, 0x83, 0x43, 0x79, 0xBE, 0x69, 0x19, 0x02, 0x48,
+ 0x03, 0x22, 0x10, 0xAE, 0x99, 0x80, 0xEE, 0xB0, 0xDE, 0xBA, 0xC1, 0x51, 0x4B, 0xF4, 0x2E, 0x61,
+ 0xB0, 0xF9, 0x1B, 0x88, 0x6D, 0x92, 0x8B, 0x36, 0x30, 0x92, 0x32, 0x0A, 0xE8, 0xA5, 0x79, 0xAC,
+ 0x27, 0x18, 0xE9, 0x67, 0x4B, 0xBC, 0x12, 0xE5, 0xB3, 0x66, 0x19, 0xD8, 0xFC, 0x62, 0x55, 0xF0,
+ 0x59, 0xFB, 0x58, 0x57, 0x15, 0xB9, 0x15, 0x89, 0x32, 0xAA, 0xA1, 0x0F, 0xC7, 0xD8, 0xFB, 0xD5,
+ 0x6E, 0x94, 0xB8, 0xE3, 0xC7, 0x7B, 0x76, 0x25, 0x0D, 0xB1, 0xD7, 0x2D, 0x26, 0x5E, 0xCA, 0x88,
+ 0xA3, 0x96, 0xD8, 0x1C, 0xBC, 0x31, 0x34, 0x6A, 0xBA, 0x99, 0x64, 0x51, 0xEF, 0x4C, 0xB4, 0x6A,
+ 0x06, 0xEB, 0x4F, 0x98, 0x95, 0x56, 0x75, 0x6F, 0x74, 0x86, 0x22, 0x53, 0x9C, 0x0A, 0x1E, 0x4D,
+ 0xF0, 0xB0, 0xD5, 0x1B, 0x85, 0x8F, 0xD6, 0x37, 0xE1, 0x25, 0x66, 0x5E, 0xE9, 0x89, 0x8F, 0x51,
+ 0x51, 0x8D, 0x76, 0x99, 0xD7, 0xBC, 0x17, 0xEE, 0xF6, 0x6B, 0x3F, 0xCF, 0x56, 0x31, 0x50, 0x77,
+ 0x84, 0x1E, 0xFB, 0x4D, 0x5A, 0x35, 0xBE, 0xE3, 0xAF, 0x88, 0xC3, 0xAC, 0x22, 0xDF, 0x56, 0x58,
+ 0x34, 0x52, 0x8A, 0xCA, 0xE7, 0x9D, 0x76, 0xD4, 0xB8, 0x86, 0xFB, 0xD9, 0xBD, 0x59, 0xEC, 0x84,
+ 0x29, 0x06, 0x0E, 0x65, 0x65, 0x18, 0x50, 0x57, 0xE5, 0xCC, 0xA2, 0xBB, 0x1A, 0x85, 0xF6, 0xFD,
+ 0xBA, 0x40, 0xA8, 0x1E, 0x52, 0xAD, 0x36, 0x12, 0xC7, 0xF1, 0x9B, 0xEA, 0x50, 0xA0, 0xFA, 0x99,
+ 0x54, 0xF5, 0xD0, 0xFA, 0xDA, 0xEC, 0x70, 0xC8, 0x21, 0xA0, 0xEA, 0xEF, 0xC0, 0x51, 0x26, 0x3A,
+ 0x13, 0xD6, 0x4C, 0x95, 0xC5, 0x07, 0xA1, 0xA8, 0x3B, 0x63, 0x8A, 0x4E, 0xAE, 0xE8, 0xA4, 0x68,
+ 0x8E, 0xA3, 0x13, 0xD9, 0x13, 0xDF, 0xA2, 0xB3, 0xEF, 0x9F, 0x4E, 0x0D, 0x00, 0xB2, 0xC2, 0x40,
+ 0xBE, 0x0D, 0xD1, 0x59, 0x20, 0x1F, 0x27, 0x2D, 0x99, 0xEE, 0x1D, 0x05, 0xD7, 0x7D, 0x2A, 0xA3,
+ 0x86, 0x44, 0x54, 0x28, 0x8A, 0x31, 0x1C, 0x66, 0xFB, 0x9F, 0x68, 0xE8, 0xCA, 0xEB, 0x74, 0x9A,
+ 0xAC, 0x77, 0x2F, 0xF4, 0xCF, 0x9D, 0x48, 0xA9, 0x8F, 0xB2, 0x9F, 0x74, 0x9F, 0x75, 0xE3, 0x88,
+ 0x42, 0xB1, 0x5F, 0x7C, 0xEE, 0xED, 0x7E, 0x5A, 0xB0, 0x62, 0xCD, 0x2F, 0x95, 0x68, 0x2F, 0xF2,
+ 0x58, 0x29, 0x8A, 0x22, 0x31, 0xC8, 0x82, 0x75, 0x51, 0x9B, 0xF7, 0xE3, 0x59, 0x52, 0xD9, 0x5B,
+ 0xDE, 0x49, 0x54, 0x22, 0xD1, 0xF2, 0xF6, 0xB0, 0x0B, 0xB8, 0x4E, 0x08, 0x43, 0xF9, 0xEA, 0x98,
+ 0xB4, 0xE3, 0x10, 0xB7, 0x8B, 0x79, 0x2C, 0x86, 0xAC, 0x75, 0x80, 0x6A, 0xC2, 0x18, 0x43, 0x06,
+ 0x5E, 0xB9, 0x80, 0xA9, 0x87, 0x02, 0x9A, 0xF5, 0x57, 0x73, 0xA2, 0x68, 0x49, 0x4E, 0xEF, 0x2D,
+ 0x48, 0x7F, 0x0B, 0x0C, 0x91, 0x35, 0x8A, 0x20, 0x7F, 0xB2, 0xD8, 0x7A, 0x88, 0x70, 0xC3, 0xA7,
+ 0x37, 0xC4, 0x68, 0x21, 0x3E, 0x55, 0x91, 0x88, 0x07, 0x2C, 0x0F, 0xC6, 0xB3, 0x49, 0x7F, 0x85,
+ 0xFB, 0xFF, 0x2D, 0x7E, 0x78, 0x13, 0xB7, 0xD5, 0x69, 0x21, 0xB7, 0x7C, 0xAF, 0x20, 0x14, 0xFD,
+ 0xD9, 0x9C, 0xA8, 0xB2, 0x2F, 0xFE, 0x28, 0x8B, 0xF3, 0x66, 0xF0, 0xA5, 0xED, 0x8E, 0x1B, 0x1C,
+ 0xF8, 0x24, 0x67, 0xB7, 0xE6, 0x06, 0x33, 0xC6, 0x60, 0x28, 0x6A, 0xE6, 0xB8, 0xA1, 0xCF, 0x9B,
+ 0x15, 0x41, 0xA4, 0x7A, 0x7F, 0xAD, 0xF4, 0x8A, 0x1F, 0xE1, 0x77, 0x07, 0x51, 0x66, 0x8C, 0x6B,
+ 0x35, 0x81, 0x60, 0x66, 0x8D, 0x58, 0xA1, 0xDF, 0xAA, 0x0C, 0x3B, 0x9A, 0x70, 0x0F, 0x1F, 0x06,
+ 0x67, 0xC2, 0x0C, 0x6E, 0xD1, 0xFC, 0x93, 0x5C, 0xC7, 0x1F, 0x19, 0x59, 0x70, 0x6C, 0x5C, 0xC8,
+ 0xFA, 0x9C, 0xFB, 0xB2, 0x46, 0x98, 0x5F, 0x1F, 0x80, 0x7B, 0x8D, 0x16, 0x2D, 0x2A, 0x03, 0xF6,
+ 0x27, 0xCB, 0x11, 0xAE, 0x9D, 0xE5, 0x36, 0xDD, 0x20, 0x52, 0x53, 0xD7, 0x66, 0x22, 0x4F, 0x51,
+ 0xE1, 0x2B, 0x7E, 0xF1, 0x9A, 0xAC, 0xBC, 0x8A, 0x6D, 0x78, 0x60, 0x62, 0x20, 0xB3, 0xA2, 0x1E,
+ 0xA5, 0x68, 0x1A, 0x29, 0x45, 0x25, 0x7E, 0xF8, 0x50, 0x62, 0xED, 0x4E, 0x06, 0x44, 0x2A, 0x79,
+ 0xF4, 0x52, 0xD0, 0x4F, 0x2C, 0x2F, 0xC6, 0xFF, 0x74, 0xE2, 0x5B, 0x13, 0x4C, 0x99, 0xB5, 0x7D,
+ 0x0D, 0x01, 0x66, 0x77, 0x3C, 0x74, 0x38, 0x11, 0xFE, 0x1F, 0x31, 0xAA, 0xF4, 0xAF, 0x42, 0x7D,
+ 0xC7, 0x62, 0xA1, 0xA2, 0xBB, 0xFE, 0xE9, 0x89, 0x8F, 0x3D, 0x0B, 0xE4, 0xA0, 0x5B, 0xA1, 0x18,
+ 0x87, 0x36, 0xA0, 0x75, 0x06, 0xA8, 0x83, 0x00, 0xF3, 0x5B, 0x83, 0x3E, 0x42, 0xFA, 0x09, 0x4C,
+ 0x35, 0x27, 0xA7, 0xB0, 0x00, 0xDA, 0x8C, 0x8E, 0x1A, 0x51, 0x9B, 0x5A, 0x8F, 0x05, 0x9A, 0xBD,
+ 0xCB, 0x10, 0x12, 0x4D, 0x17, 0xE5, 0x78, 0xDF, 0xE7, 0x49, 0x5D, 0xB0, 0x78, 0x5F, 0x44, 0xE1,
+ 0xDB, 0xE9, 0x84, 0xD9, 0x90, 0xAD, 0xBE, 0x86, 0x95, 0x81, 0xC1, 0xCD, 0x1B, 0xD4, 0xCE, 0x6D,
+ 0x5E, 0xB3, 0x52, 0xB1, 0x67, 0x5E, 0xF2, 0xE4, 0xC5, 0xCB, 0x5C, 0xC6, 0x57, 0xBE, 0x1C, 0x0E,
+ 0xDE, 0x7B, 0xD3, 0xB3, 0x01, 0xDC, 0x1F, 0x11, 0x12, 0xFC, 0x62, 0x9B, 0xFD, 0xF8, 0x8C, 0xDC,
+ 0xE4, 0x35, 0x22, 0x61, 0x0E, 0xA0, 0x80, 0xF9, 0x48, 0xFC, 0x1C, 0x36, 0x2A, 0x02, 0x4A, 0xDC,
+ 0x55, 0xE2, 0x35, 0xC8, 0xB4, 0x2E, 0xED, 0x43, 0x11, 0x31, 0x6C, 0xFB, 0x77, 0x68, 0x5E, 0xC6,
+ 0x72, 0x37, 0x08, 0x5A, 0xC4, 0x98, 0x23, 0x9E, 0x0A, 0xE3, 0x82, 0x1B, 0xCA, 0xDE, 0x3F, 0xBE,
+ 0xF0, 0x74, 0x6C, 0x9E, 0x16, 0x9B, 0x41, 0xC9, 0x79, 0xB9, 0x82, 0x9D, 0x66, 0x60, 0x09, 0xBD,
+ 0x46, 0x2F, 0xDC, 0xF8, 0xC9, 0xB8, 0x0B, 0xB6, 0xEB, 0x30, 0xD1, 0xAD, 0x93, 0xB4, 0xE3, 0xD1,
+ 0xE6, 0x35, 0xE1, 0x6B, 0xC7, 0x49, 0x47, 0xAE, 0xF1, 0x7A, 0x7A, 0x2E, 0xAE, 0xF8, 0xEC, 0x5D,
+ 0x62, 0x67, 0xFD, 0x9D, 0x18, 0x74, 0xBA, 0xA6, 0xA8, 0xA8, 0x6E, 0xD8, 0xBF, 0x24, 0xCA, 0x74,
+ 0x51, 0xE1, 0x6A, 0x8B, 0xAC, 0x96, 0x43, 0xC5, 0x75, 0x60, 0xAE, 0xA9, 0xCC, 0x89, 0x06, 0xA9,
+ 0x6C, 0xEA, 0x47, 0x53, 0x60, 0x21, 0x7A, 0x38, 0xD4, 0xE4, 0x8A, 0xE6, 0x86, 0xAB, 0x36, 0x39,
+ 0x2F, 0xEA, 0x08, 0xC1, 0x32, 0xDA, 0xA2, 0xC4, 0xD5, 0xB2, 0xC0, 0x12, 0x37, 0x9E, 0xDC, 0xBA,
+ 0xC4, 0xF6, 0x8D, 0xDF, 0xA1, 0x9A, 0x3B, 0x70, 0xE9, 0x9F, 0x4E, 0xD1, 0xE1, 0x27, 0x52, 0x27,
+ 0x69, 0x57, 0xFF, 0x63, 0xF6, 0x68, 0xF5, 0xF1, 0x42, 0x31, 0xE5, 0x05, 0xD2, 0xB7, 0xB5, 0x21,
+ 0xB9, 0xCE, 0x5D, 0xD4, 0xBB, 0xFE, 0xC5, 0x09, 0x8E, 0x98, 0xAA, 0xE7, 0x9D, 0xE4, 0x92, 0x42,
+ 0x7C, 0x2F, 0xC2, 0xC8, 0x05, 0xE0, 0xF7, 0xC5, 0xD5, 0xFA, 0xC7, 0x9E, 0x75, 0x32, 0x7A, 0x7C,
+ 0x18, 0x08, 0xB8, 0x90, 0xDE, 0x09, 0xF1, 0x15, 0xA5, 0x6F, 0xFC, 0xE2, 0xAD, 0x97, 0x9A, 0x63,
+ 0x55, 0xDB, 0x2E, 0x0A, 0xFC, 0x2C, 0x3B, 0xD0, 0x47, 0xC4, 0xF1, 0x06, 0x32, 0xF0, 0x5D, 0xC9,
+ 0xC9, 0x87, 0x13, 0xC0, 0x67, 0xC4, 0x8B, 0x76, 0x80, 0x62, 0x60, 0xC9, 0x3B, 0x0C, 0x81, 0x51,
+ 0x00, 0xFD, 0xF6, 0x9B, 0xE4, 0xF9, 0xC1, 0x03, 0xBB, 0x0F, 0x5D, 0xE3, 0xAC, 0xE6, 0x1F, 0x49,
+ 0xB5, 0x3C, 0x3E, 0x60, 0xC7, 0xC5, 0xD3, 0xB8, 0xAF, 0x07, 0xDF, 0x60, 0x4B, 0x19, 0xB5, 0x90,
+ 0x33, 0x41, 0x61, 0x75, 0xDB, 0x50, 0xD4, 0xB6, 0x63, 0xFA, 0xF9, 0x83, 0x06, 0xBC, 0x4E, 0xF2,
+ 0x53, 0xF0, 0xDC, 0xB8, 0xD5, 0x9B, 0x63, 0xEE, 0xF3, 0x92, 0x68, 0xBB, 0xCB, 0xC3, 0x08, 0x7E,
+ 0x12, 0x4A, 0x8A, 0x48, 0xF9, 0xED, 0xA7, 0x6A, 0xCE, 0xDE, 0x0D, 0x7A, 0xED, 0x2E, 0xA4, 0x75,
+ 0x6C, 0x94, 0xB3, 0x0A, 0xF1, 0x3E, 0xA4, 0xE6, 0x8F, 0x34, 0x13, 0x0E, 0xC7, 0xCE, 0x6B, 0x82,
+ 0x5D, 0xD3, 0xD2, 0x79, 0x7B, 0x6F, 0xB5, 0x00, 0x8B, 0xD6, 0x47, 0x95, 0x98, 0xDD, 0x56, 0xBC,
+ 0x8C, 0x40, 0x3B, 0x5A, 0x65, 0x88, 0x9F, 0xF5, 0x6F, 0x96, 0x32, 0x40, 0x31, 0xAC, 0x3F, 0x18,
+ 0x22, 0xE2, 0xDB, 0xD1, 0xF7, 0xAD, 0x48, 0x20, 0x31, 0x8D, 0x3F, 0xD0, 0xC9, 0x88, 0x7F, 0x94,
+ 0x34, 0x69, 0xBC, 0xEE, 0xB2, 0x5B, 0x42, 0x82, 0x31, 0xBC, 0x83, 0xBD, 0x2C, 0x5A, 0x57, 0x74,
+ 0x94, 0x29, 0xC4, 0xD0, 0x18, 0x8B, 0x2C, 0xAA, 0x09, 0x14, 0x99, 0x33, 0xD0, 0xDA, 0xD8, 0xCD,
+ 0xED, 0x75, 0xBD, 0x69, 0xAA, 0x34, 0xD8, 0x4B, 0x3D, 0xC2, 0xC0, 0x69, 0x7F, 0x2F, 0x0B, 0xDE,
+ 0x23, 0xEE, 0xB1, 0x7C, 0xD8, 0x5A, 0x7C, 0x0C, 0x45, 0x89, 0x08, 0x21, 0xE4, 0x23, 0x99, 0x75,
+ 0xFC, 0x0C, 0xF1, 0x59, 0x19, 0x07, 0xA9, 0xA9, 0x5E, 0x48, 0xEB, 0xCD, 0x10, 0x61, 0xC2, 0xEB,
+ 0x60, 0x74, 0x34, 0x80, 0xC2, 0xAA, 0xEF, 0x35, 0x55, 0x19, 0x8A, 0x95, 0xE4, 0x4A, 0x88, 0x9E,
+ 0x70, 0x73, 0x17, 0xA5, 0x75, 0xB6, 0xBC, 0x5E, 0x5E, 0xAC, 0x88, 0xA8, 0x4E, 0x54, 0x71, 0x4F,
+ 0xB8, 0x84, 0xC2, 0xA3, 0xB5, 0x9D, 0x6C, 0xA2, 0x9B, 0x6C, 0x6F, 0xA6, 0xD8, 0xE6, 0x83, 0x5D,
+ 0xC3, 0x01, 0x2F, 0xB5, 0xE0, 0xFF, 0x62, 0x52, 0xD4, 0x71, 0x8D, 0x2D, 0x72, 0x57, 0xF9, 0x90,
+ 0xA7, 0x76, 0x3D, 0x47, 0x76, 0xDE, 0x7E, 0x1B, 0xFB, 0xA4, 0x44, 0x7A, 0xE1, 0xBC, 0xB9, 0x72,
+ 0x3C, 0x42, 0xC6, 0x26, 0x0F, 0x70, 0xF1, 0xA6, 0x58, 0x91, 0xB1, 0xE7, 0xA1, 0x70, 0x13, 0x75,
+ 0xFE, 0x2C, 0xC2, 0x11, 0x48, 0x19, 0x72, 0xDF, 0xD2, 0x1E, 0x5A, 0x35, 0xC9, 0x2B, 0xE6, 0x8E,
+ 0xC6, 0x10, 0x9E, 0x6F, 0x67, 0xCF, 0x40, 0xB8, 0x7D, 0x60, 0x8A, 0xD9, 0x09, 0x59, 0xFD, 0x04,
+ 0x51, 0xEB, 0xE7, 0x18, 0x8A, 0x77, 0x2C, 0x94, 0xA3, 0xA2, 0x82, 0xF2, 0x50, 0xA6, 0xD9, 0x9C,
+ 0x55, 0x65, 0x94, 0xE9, 0x67, 0xC4, 0xE1, 0x34, 0x04, 0x22, 0x3F, 0x50, 0xAB, 0x1F, 0x0B, 0x94,
+ 0xCC, 0x51, 0x35, 0x28, 0xF9, 0x88, 0xA0, 0xA0, 0xA3, 0xF1, 0x97, 0x00, 0xC2, 0x9C, 0x35, 0x01,
+ 0xC1, 0x1B, 0x01, 0x49, 0x44, 0x4C, 0x06, 0xC9, 0x35, 0xA2, 0xEA, 0x93, 0x26, 0xF0, 0xCA, 0x07,
+ 0x7E, 0x1E, 0xBB, 0xCB, 0x03, 0x27, 0x35, 0x2D, 0xF1, 0xE0, 0x15, 0x1D, 0xBE, 0xCE, 0x89, 0x3A,
+ 0x65, 0xDA, 0x5B, 0xB8, 0x3C, 0xF7, 0xF1, 0x3C, 0xDC, 0xFA, 0xAA, 0xD0, 0x43, 0x72, 0x73, 0x94,
+ 0x72, 0xD2, 0x10, 0x82, 0x32, 0x10, 0xB6, 0x05, 0x25, 0x16, 0x25, 0xD2, 0x10, 0x73, 0xFD, 0x97,
+ 0x7B, 0x7D, 0x31, 0x25, 0x89, 0x26, 0x83, 0xF8, 0x78, 0x1B, 0x32, 0xFF, 0x35, 0x19, 0x91, 0x68,
+ 0x3F, 0x1F, 0x78, 0x38, 0x83, 0xA0, 0x49, 0x63, 0x4F, 0x70, 0x04, 0xAD, 0x57, 0xBC, 0x9D, 0x6F,
+ 0xBE, 0xDA, 0x56, 0xD1, 0xFF, 0xC2, 0x25, 0xA1, 0xF5, 0x39, 0xB3, 0xA8, 0x69, 0x0A, 0xD2, 0xB1,
+ 0xA0, 0x4F, 0x16, 0xB3, 0x15, 0xF4, 0xDD, 0x59, 0x8C, 0xD3, 0x56, 0xDF, 0x11, 0x50, 0x33, 0x6D,
+ 0x15, 0xB9, 0xCC, 0x89, 0xC9, 0x81, 0xC2, 0x7A, 0xCD, 0x1F, 0x04, 0x17, 0xDB, 0x2B, 0x80, 0xFA,
+ 0xC8, 0x00, 0x94, 0xB1, 0x41, 0x42, 0xA8, 0x0F, 0x6D, 0x72, 0xCB, 0xA9, 0xBA, 0xBC, 0x19, 0x5E,
+ 0x42, 0x70, 0x94, 0x1B, 0xA4, 0x16, 0x86, 0x04, 0xF7, 0x06, 0x6E, 0xC2, 0x4A, 0xBE, 0xD5, 0x27,
+ 0x2A, 0x61, 0x1F, 0x56, 0x34, 0x31, 0x8D, 0x59, 0x57, 0x2B, 0x86, 0x01, 0xC3, 0x94, 0x62, 0x8A,
+ 0x9C, 0x18, 0xB5, 0xDD, 0x52, 0xBC, 0x85, 0xB5, 0x09, 0x25, 0xBC, 0x36, 0x05, 0x3F, 0xE4, 0xA8,
+ 0xC9, 0x4A, 0xA1, 0x7C, 0xEB, 0xC1, 0x12, 0x64, 0x05, 0xD4, 0x6A, 0x2D, 0x41, 0xBC, 0xC3, 0xF5,
+ 0x57, 0x00, 0x4A, 0xB0, 0xFF, 0xD3, 0xD2, 0x51, 0x76, 0x71, 0x0E, 0xC4, 0x78, 0x01, 0xD8, 0xC1,
+ 0xCA, 0xA4, 0x1B, 0xBB, 0xB5, 0x99, 0x50, 0xC7, 0xB9, 0xCD, 0x74, 0xAB, 0x09, 0x89, 0x07, 0x54,
+ 0x3A, 0xEA, 0x76, 0xA5, 0xA7, 0xE9, 0x96, 0x3D, 0x8A, 0xFE, 0x24, 0x46, 0x7A, 0x4F, 0x57, 0x8B,
+ 0x6D, 0x5B, 0xB2, 0x12, 0xCA, 0x09, 0x7B, 0x45, 0x4D, 0xC1, 0x03, 0x7A, 0x27, 0xFB, 0x2C, 0xE2,
+ 0x95, 0xC6, 0x17, 0x46, 0x7B, 0x48, 0xFB, 0x8F, 0x78, 0x5B, 0xC8, 0x3E, 0x54, 0x51, 0x99, 0x71,
+ 0xE3, 0xC7, 0x92, 0xED, 0x99, 0xB4, 0x8A, 0x98, 0x86, 0xA8, 0x91, 0x1D, 0x36, 0xB6, 0xB2, 0xC7,
+ 0x9C, 0xD6, 0x68, 0x4D, 0x45, 0x9B, 0x4D, 0x37, 0xB5, 0xA0, 0xCE, 0x30, 0x00, 0x13, 0x5A, 0x49,
+ 0xE4, 0x52, 0x45, 0x7D, 0x30, 0xEA, 0x74, 0xBE, 0xEE, 0x41, 0x43, 0xBC, 0xB5, 0xC9, 0x0C, 0x40,
+ 0x7F, 0x75, 0xC6, 0x57, 0x56, 0x9A, 0x90, 0xF6, 0x56, 0x35, 0x83, 0x99, 0x80, 0x08, 0x69, 0x08,
+ 0xB2, 0x59, 0x9F, 0x79, 0x51, 0x5D, 0x9A, 0xE1, 0xCA, 0x16, 0x17, 0x28, 0xFE, 0x2B, 0xD1, 0x9F,
+ 0x1B, 0x25, 0x62, 0xC0, 0x5A, 0xF6, 0x26, 0x11, 0x6E, 0xD7, 0xE1, 0xBA, 0x5C, 0xB8, 0x04, 0x7A,
+ 0x55, 0xD3, 0x16, 0x59, 0x5C, 0x37, 0x26, 0xD0, 0xB6, 0x09, 0xED, 0x57, 0x88, 0x56, 0x21, 0x5C,
+ 0x91, 0xB6, 0xEB, 0xE4, 0xC2, 0x70, 0x8D, 0x2F, 0x5A, 0x9F, 0x07, 0x5B, 0x57, 0x38, 0x9E, 0x3A,
+ 0x49, 0xDF, 0x67, 0x18, 0xA5, 0x50, 0x90, 0xDC, 0xBD, 0xA1, 0xA6, 0xE5, 0x33, 0x25, 0xD7, 0xA0,
+ 0x25, 0x71, 0x63, 0xD3, 0x8B, 0x89, 0xE2, 0xC0, 0xC5, 0xC8, 0x51, 0xF1, 0x9B, 0x23, 0xD7, 0x35,
+ 0xAC, 0x04, 0xD6, 0x8B, 0x5A, 0xDF, 0x9A, 0x9D, 0x98, 0x5E, 0x5B, 0xD0, 0x2B, 0x28, 0xDF, 0x89,
+ 0x1B, 0x85, 0xC5, 0xB2, 0xDD, 0x43, 0xEF, 0x14, 0x99, 0x74, 0x8B, 0xAB, 0x49, 0x45, 0xA7, 0x57,
+ 0xBF, 0xCD, 0x7E, 0x80, 0xDF, 0x0C, 0x1B, 0x05, 0xB2, 0x1E, 0xD0, 0xFD, 0x72, 0x3E, 0x25, 0xD2,
+ 0xE1, 0x0B, 0x1C, 0x17, 0x6C, 0x5B, 0x61, 0xC0, 0x84, 0xCD, 0xFA, 0xB6, 0x07, 0x0A, 0xBE, 0x2B,
+ 0xF7, 0x3E, 0xEA, 0x2B, 0x0B, 0x52, 0x33, 0x0A, 0x37, 0xC3, 0x48, 0x0A, 0x93, 0x9C, 0xF7, 0x52,
+ 0x45, 0x9B, 0xE5, 0x04, 0xED, 0x3B, 0x5A, 0xFF, 0x8E, 0x4A, 0xFE, 0xD5, 0x76, 0x04, 0xED, 0xA2,
+ 0xAE, 0x36, 0x6A, 0xCC, 0x62, 0x7F, 0xB2, 0xBE, 0x3A, 0x30, 0x02, 0x59, 0xF3, 0x2F, 0xDF, 0x94,
+ 0x0D, 0x03, 0x22, 0xB6, 0x65, 0xDF, 0x26, 0x8A, 0xCE, 0x9F, 0x32, 0x4B, 0x8D, 0x4E, 0x3B, 0x37,
+ 0x24, 0x00, 0x0F, 0xB7, 0xF4, 0x4B, 0x2F, 0x0B, 0xF9, 0x94, 0x14, 0x41, 0x94, 0xD0, 0x66, 0x80,
+ 0x66, 0x9F, 0x04, 0x74, 0xB8, 0x90, 0x35, 0xEE, 0xCC, 0x4B, 0xA7, 0xD4, 0x42, 0x7D, 0xD6, 0x23,
+ 0x3C, 0x2A, 0x8A, 0xB6, 0xAC, 0x19, 0x92, 0x37, 0xD9, 0x46, 0xDF, 0xE1, 0x75, 0x2D, 0x05, 0x02,
+ 0xB1, 0xCA, 0x34, 0x34, 0x1B, 0xB4, 0x67, 0x1F, 0x56, 0xBD, 0x55, 0xCD, 0xEC, 0x9E, 0x3D, 0x4E,
+ 0x83, 0x90, 0x5D, 0x66, 0xBA, 0xA6, 0x76, 0x7E, 0x2E, 0xAA, 0x92, 0xD2, 0x80, 0xC5, 0x25, 0x0D,
+ 0x91, 0xF5, 0x9B, 0x54, 0x6F, 0x05, 0xCE, 0xE3, 0x4A, 0x55, 0xCB, 0xA6, 0xDD, 0x4C, 0x91, 0x92,
+ 0xA0, 0x1C, 0x83, 0xBD, 0x28, 0x05, 0xB9, 0xFC, 0x75, 0x42, 0xEF, 0xB1, 0x7D, 0x2A, 0x17, 0x3E,
+ 0x7A, 0xB3, 0xB5, 0xCB, 0xD9, 0x43, 0x0F, 0xAD, 0x4D, 0x36, 0x70, 0x4E, 0x39, 0x3C, 0x91, 0xF6,
+ 0x05, 0xDB, 0x0A, 0x43, 0xDC, 0x5B, 0xAF, 0x4C, 0x34, 0x72, 0x9B, 0xF1, 0x2D, 0x89, 0x0F, 0x85,
+ 0x1C, 0x90, 0x8B, 0x90, 0x84, 0xCC, 0x1D, 0xD0, 0xAE, 0xF6, 0x58, 0x20, 0x38, 0xE9, 0x44, 0x16,
+ 0xB6, 0xCB, 0x90, 0x5C, 0x76, 0x91, 0xB7, 0x1B, 0x15, 0xB6, 0xEF, 0xB1, 0x31, 0xAE, 0xD0, 0x9E,
+ 0x78, 0x37, 0xBC, 0x69, 0x3B, 0x2C, 0x22, 0x89, 0x10, 0xE5, 0xBF, 0xA5, 0xAA, 0x32, 0x0F, 0x5F,
+ 0xED, 0x7A, 0x85, 0xC2, 0x25, 0x0E, 0x8C, 0x8D, 0xEB, 0x8D, 0xE7, 0x33, 0x84, 0x9B, 0x47, 0xC5,
+ 0xD6, 0x49, 0xAB, 0x1D, 0xA1, 0x0A, 0x84, 0x14, 0x1A, 0x90, 0xD8, 0x11, 0x78, 0x4A, 0x1A, 0x01,
+ 0xE2, 0x27, 0xC9, 0x49, 0x61, 0x82, 0x62, 0xA2, 0xE0, 0xE4, 0xDF, 0x99, 0xC5, 0x5A, 0x7B, 0x54,
+ 0x7B, 0x77, 0xC9, 0xF8, 0xA4, 0xB5, 0xA2, 0xA0, 0x09, 0x42, 0x9F, 0x47, 0x82, 0x6C, 0x79, 0xED,
+ 0x5F, 0x79, 0xBD, 0x0C, 0x73, 0x84, 0x88, 0x05, 0x16, 0x17, 0x08, 0x9D, 0x3C, 0xCA, 0xCB, 0x55,
+ 0xD4, 0x14, 0x16, 0xD3, 0x83, 0xAE, 0x39, 0x1D, 0x3D, 0x19, 0x51, 0x1A, 0x45, 0x32, 0x19, 0xA0,
+ 0xF0, 0xC0, 0xB0, 0x27, 0x4D, 0xC6, 0x6F, 0x75, 0x52, 0x59, 0x14, 0x50, 0xF7, 0xDF, 0x6A, 0x51,
+ 0xE5, 0xB0, 0xDC, 0xE8, 0x27, 0x2E, 0x49, 0x7A, 0x53, 0x96, 0x2C, 0x28, 0x9A, 0x65, 0x75, 0x65,
+ 0xBE, 0x35, 0x1B, 0x6D, 0x1C, 0x90, 0xCA, 0x80, 0x42, 0xBF, 0xA4, 0x45, 0xA2, 0x5C, 0x93, 0xFC,
+ 0xB5, 0x63, 0x30, 0xB2, 0xA7, 0x7B, 0x20, 0x3F, 0x0F, 0x5E, 0xE1, 0x41, 0x61, 0x79, 0xBC, 0xB1,
+ 0x07, 0x69, 0x2F, 0xA9, 0x48, 0x99, 0xEE, 0xD3, 0x46, 0xFF, 0x51, 0x54, 0x31, 0xB5, 0xC1, 0xCE,
+ 0x87, 0x20, 0xB9, 0x0F, 0x47, 0x77, 0x46, 0xB3, 0x57, 0xAD, 0x3C, 0x1E, 0x03, 0xD0, 0xA5, 0x3D,
+ 0x66, 0xB3, 0xC5, 0x28, 0x2E, 0x06, 0xF6, 0x02, 0x49, 0x9D, 0xF9, 0xF5, 0x29, 0x69, 0xF8, 0x16,
+ 0x0A, 0x2F, 0xB7, 0xCD, 0xE8, 0xDB, 0x5F, 0xA2, 0x12, 0xAB, 0x7C, 0x09, 0x24, 0x81, 0x9C, 0x04,
+ 0x27, 0x51, 0x66, 0x4D, 0xDC, 0xE5, 0x24, 0xE9, 0xE4, 0x53, 0xA9, 0x8B, 0x41, 0x25, 0x47, 0x2B,
+ 0x2B, 0xC6, 0xA0, 0x41, 0x81, 0xEB, 0xD1, 0xC6, 0xB3, 0x77, 0x97, 0x90, 0x25, 0x15, 0xFA, 0xB2,
+ 0x37, 0x9F, 0xE4, 0xE3, 0xB2, 0x11, 0xEB, 0xF2, 0x72, 0x62, 0xC6, 0x8A, 0x00, 0xF3, 0x99, 0x83,
+ 0x11, 0x26, 0x64, 0x82, 0xA6, 0xA2, 0x8B, 0xF2, 0xB0, 0xCE, 0xAE, 0x49, 0xE1, 0x16, 0xC1, 0x6F,
+ 0x81, 0x89, 0x61, 0x6F, 0x9E, 0x0A, 0x07, 0xB3, 0xDB, 0x62, 0x45, 0xEF, 0x54, 0x6C, 0x9F, 0x95,
+ 0xC5, 0x50, 0xEF, 0xD7, 0x81, 0x0B, 0x8F, 0x67, 0x15, 0xE4, 0xDF, 0xC6, 0xFB, 0xD5, 0x17, 0x8F,
+ 0x90, 0x27, 0xE5, 0x3B, 0x86, 0xF4, 0xBC, 0xF1, 0x9D, 0x1D, 0x07, 0xB1, 0x3D, 0x45, 0xE4, 0x62,
+ 0x76, 0x6B, 0xFC, 0x2C, 0xE5, 0x31, 0x7E, 0x1D, 0x66, 0x0B, 0x85, 0x27, 0x80, 0xF8, 0xCB, 0xB8,
+ 0x2A, 0xA4, 0x23, 0x4B, 0x3D, 0xB7, 0xE3, 0x10, 0x4D, 0xB8, 0xD1, 0xA9, 0x10, 0x33, 0x84, 0xF1,
+ 0x07, 0x28, 0xE0, 0x89, 0x4D, 0x9C, 0x4F, 0xA3, 0x84, 0xFA, 0x30, 0xBC, 0x38, 0x72, 0x91, 0x59,
+ 0xD5, 0x66, 0x49, 0x2E, 0x62, 0x69, 0x7A, 0x6E, 0xCB, 0x3F, 0x18, 0x9A, 0x24, 0x8A, 0x8A, 0x72,
+ 0x1E, 0x2F, 0xF5, 0xD5, 0x23, 0x5D, 0x85, 0x58, 0x22, 0x1D, 0x23, 0x44, 0x82, 0x94, 0x85, 0x66,
+ 0x07, 0x4C, 0x1C, 0x85, 0xF8, 0x1C, 0x28, 0x0A, 0x09, 0x39, 0x79, 0xFF, 0xCC, 0xF0, 0x20, 0x84,
+ 0xCA, 0x88, 0x77, 0x8F, 0xC3, 0x58, 0x56, 0xDD, 0xB9, 0x06, 0x1C, 0x0D, 0xFB, 0x9B, 0x10, 0xE1,
+ 0xDB, 0x23, 0x84, 0xF0, 0xB0, 0x76, 0xC0, 0x0C, 0xF8, 0x28, 0x13, 0xE7, 0x4E, 0xDD, 0xC3, 0x1A,
+ 0xBD, 0x9F, 0x5B, 0x47, 0xEC, 0x22, 0x01, 0x0A, 0x8E, 0xFC, 0x4A, 0x36, 0xF7, 0xC6, 0xFC, 0x33,
+ 0x1E, 0x29, 0xBB, 0x34, 0xD0, 0xA9, 0x9A, 0x57, 0x17, 0x8E, 0x02, 0x1C, 0x44, 0xB8, 0x33, 0x24,
+ 0xD6, 0x8D, 0xB6, 0x3F, 0xDB, 0x1B, 0xAD, 0xC5, 0x5A, 0x98, 0x88, 0xE6, 0x7D, 0x9C, 0x2F, 0xE7,
+ 0x0E, 0x14, 0xD3, 0xA1, 0x9A, 0x98, 0xB8, 0x54, 0xE2, 0x90, 0x97, 0x5E, 0x48, 0xDE, 0xCF, 0x3B,
+ 0x4F, 0x57, 0x92, 0x66, 0x2D, 0xB4, 0xA7, 0x71, 0x4D, 0x08, 0xB7, 0xA3, 0xF1, 0x5A, 0xAA, 0x7E,
+ 0xAD, 0xAD, 0xAC, 0xD2, 0xBD, 0x27, 0x41, 0x51, 0xC1, 0xEA, 0x4F, 0xE0, 0x0D, 0xC7, 0x3B, 0x20,
+ 0x84, 0x18, 0x7B, 0xBB, 0x78, 0xB7, 0xCB, 0x6E, 0x5B, 0x83, 0xBF, 0x59, 0x72, 0x2F, 0x74, 0x32,
+ 0xA6, 0x55, 0x81, 0x6B, 0xFA, 0xE0, 0xA7, 0x68, 0x0D, 0xB5, 0xCF, 0x02, 0xCB, 0xDD, 0xF0, 0x69,
+ 0xB1, 0x74, 0x4A, 0x53, 0x77, 0xF7, 0xD1, 0xC2, 0xCE, 0x2A, 0x59, 0xFD, 0x01, 0xBD, 0xD9, 0x50,
+ 0x3E, 0xC4, 0xE6, 0xE0, 0x0C, 0x62, 0x44, 0x64, 0xEE, 0x70, 0x9F, 0x69, 0x81, 0x0D, 0xCE, 0x42,
+ 0x87, 0x3A, 0xF2, 0x3A, 0x6B, 0x78, 0xDA, 0x42, 0x99, 0x33, 0xC9, 0xEB, 0x3B, 0x9C, 0xED, 0x3B,
+ 0xC7, 0xF2, 0x65, 0xD1, 0x32, 0xB2, 0x3F, 0x9D, 0x80, 0xEC, 0xAC, 0x7D, 0x04, 0xF1, 0xE9, 0xBA,
+ 0x52, 0x4A, 0x74, 0x70, 0x8C, 0xCF, 0xB1, 0xB9, 0x91, 0x8C, 0x4F, 0x12, 0x0D, 0xC2, 0x7A, 0x2F,
+ 0xB8, 0x86, 0xF2, 0x9B, 0x4D, 0x58, 0xE0, 0xA0, 0x2E, 0xEA, 0x82, 0x17, 0xC1, 0x7E, 0x48, 0xBE,
+ 0x56, 0xA5, 0xC7, 0xB9, 0x88, 0xF5, 0x26, 0xA6, 0xC1, 0x60, 0x83, 0xBC, 0x40, 0x7C, 0x36, 0x2B,
+ 0x32, 0x57, 0x25, 0xBE, 0x88, 0x38, 0x2B, 0x8D, 0xBE, 0xA0, 0xE0, 0x64, 0x0D, 0x06, 0x2C, 0xD5,
+ 0x88, 0x31, 0xCC, 0x79, 0x49, 0x81, 0x19, 0xE5, 0x36, 0x43, 0x3D, 0x74, 0xA3, 0x20, 0x59, 0x3C,
+ 0xFD, 0x5B, 0x5C, 0x35, 0x4D, 0xF1, 0x90, 0x26, 0x8A, 0x06, 0xB5, 0x76, 0x87, 0x1D, 0xC6, 0x7D,
+ 0x93, 0x8A, 0x35, 0x62, 0x12, 0x23, 0x7E, 0xD7, 0x33, 0x4C, 0x73, 0xEB, 0x01, 0x6D, 0xCB, 0xAF,
+ 0xE5, 0xF2, 0x5D, 0x6C, 0x48, 0x73, 0x8E, 0x78, 0xA6, 0xA1, 0x11, 0xAC, 0x91, 0xA1, 0x6D, 0x13,
+ 0xAE, 0x2B, 0xA7, 0x7B, 0x03, 0xDA, 0x16, 0x7A, 0xE3, 0x6A, 0x53, 0xF1, 0x82, 0x1F, 0xD0, 0x29,
+ 0xA6, 0x99, 0xB0, 0xC1, 0x1A, 0x28, 0xBC, 0x08, 0xC7, 0x6C, 0x3E, 0xD8, 0x3B, 0x7D, 0x31, 0x4F,
+ 0xB9, 0xCC, 0x1F, 0x8F, 0x06, 0x85, 0xDE, 0x97, 0xBD, 0x7A, 0x02, 0xA4, 0x16, 0x0E, 0x8F, 0xF2,
+ 0x61, 0xAE, 0x02, 0xA2, 0x43, 0x84, 0xE0, 0x9E, 0x1E, 0xA9, 0xDB, 0xF0, 0x7A, 0xC3, 0xA0, 0xDD,
+ 0x93, 0xE9, 0x84, 0x8D, 0xC3, 0x79, 0x9C, 0xE5, 0x68, 0xBC, 0x63, 0xB8, 0x82, 0xA0, 0x94, 0x7D,
+ 0x7F, 0x5B, 0x73, 0x13, 0x0B, 0x7A, 0x46, 0xBE, 0xEF, 0x70, 0x64, 0xB9, 0x26, 0xB0, 0x86, 0xBB,
+ 0x33, 0x8A, 0xCC, 0x81, 0x04, 0x8E, 0x62, 0x7A, 0x34, 0xFA, 0x25, 0x14, 0x0F, 0x0A, 0xD4, 0x0B,
+ 0xCF, 0xD6, 0x92, 0x05, 0x88, 0x2C, 0x2D, 0x26, 0xDF, 0x08, 0xD6, 0x19, 0x6A, 0xAB, 0x74, 0x2C,
+ 0xB0, 0x08, 0x6B, 0xAB, 0x87, 0xEA, 0x6A, 0x48, 0xB8, 0x73, 0xB6, 0x16, 0x30, 0x33, 0xE7, 0x4B,
+ 0x81, 0xBD, 0xEE, 0x67, 0x31, 0x83, 0x4B, 0xCF, 0x83, 0x22, 0x05, 0x8A, 0x81, 0xEB, 0xFA, 0x75,
+ 0xBB, 0x54, 0x8E, 0x78, 0x5B, 0x76, 0x70, 0x3F, 0x7D, 0x3F, 0xAA, 0x6C, 0x69, 0x7F, 0x19, 0x68,
+ 0xB3, 0x68, 0x51, 0xD1, 0x61, 0xD5, 0x3C, 0x2C, 0x6B, 0xC5, 0x96, 0xE0, 0xDA, 0x26, 0x63, 0xC5,
+ 0x0E, 0xA1, 0xF5, 0x59, 0xD5, 0x78, 0x87, 0x81, 0xEF, 0x87, 0x01, 0x88, 0xD4, 0xE1, 0xBD, 0xB8,
+ 0x96, 0x1D, 0x5D, 0x85, 0x1C, 0x6F, 0x53, 0xED, 0x6A, 0x6A, 0xC0, 0x2A, 0xB2, 0xF1, 0x6C, 0x7A,
+ 0x92, 0xF5, 0x70, 0x6D, 0x94, 0xD5, 0x87, 0x57, 0xE3, 0x26, 0xCD, 0xDA, 0x52, 0x5C, 0x22, 0x03,
+ 0xBD, 0xF6, 0x60, 0xA6, 0xC9, 0x64, 0xF0, 0xC6, 0x11, 0xA4, 0x96, 0xB1, 0x27, 0x8B, 0x8E, 0x99,
+ 0x3E, 0xC2, 0xC1, 0x43, 0xD4, 0x10, 0x7D, 0xCC, 0x9F, 0xE4, 0x7C, 0xA6, 0x10, 0x1E, 0xE5, 0x59,
+ 0x37, 0x58, 0xF0, 0xB3, 0xF6, 0x4F, 0x8B, 0x41, 0xDB, 0x65, 0x01, 0xDD, 0xE3, 0xAB, 0xBD, 0x4C,
+ 0x4C, 0x69, 0x2B, 0x82, 0xBA, 0x80, 0xDE, 0x9E, 0x4D, 0xAC, 0x86, 0xDF, 0x34, 0xDB, 0xDF, 0x1C,
+ 0xBA, 0x25, 0x03, 0xD0, 0x5E, 0x29, 0x29, 0x4E, 0xFC, 0xF6, 0xC0, 0x10, 0x03, 0xCA, 0xB0, 0xA3,
+ 0x22, 0xB0, 0x46, 0xAA, 0xC3, 0xBB, 0xF1, 0xC6, 0x7C, 0xB1, 0xC2, 0x70, 0xCD, 0xAC, 0xE0, 0x6B,
+ 0xDD, 0x14, 0xEC, 0xAD, 0x80, 0x09, 0xF9, 0xBD, 0x1F, 0x4A, 0xD7, 0x20, 0xFA, 0x15, 0xCF, 0xDD,
+ 0xE5, 0x65, 0x2A, 0x06, 0xBD, 0x88, 0xC0, 0x12, 0x74, 0xC4, 0x8B, 0x3C, 0x50, 0x8D, 0x73, 0xC3,
+ 0xF0, 0x36, 0x40, 0x64, 0x39, 0x4C, 0x78, 0x92, 0xD8, 0xDC, 0x93, 0x2A, 0xC0, 0x91, 0x16, 0xB0,
+ 0x96, 0x88, 0x70, 0x85, 0x86, 0xEF, 0x38, 0xF5, 0x8E, 0x70, 0x63, 0x3C, 0xE8, 0xDB, 0x26, 0xDF,
+ 0x3F, 0xEE, 0x01, 0xB1, 0xF6, 0xF6, 0x8E, 0x1A, 0xEE, 0x6F, 0x42, 0x9B, 0x76, 0x08, 0xF2, 0xE4,
+ 0xB5, 0xD8, 0x45, 0x55, 0xCE, 0xF3, 0x89, 0xEC, 0x2D, 0x00, 0xF7, 0xC1, 0xED, 0x4D, 0xD0, 0x04,
+ 0xC1, 0xB2, 0x92, 0xE1, 0xE5, 0xEE, 0x44, 0xFD, 0x79, 0xC1, 0x45, 0xAD, 0x1F, 0x99, 0x49, 0xB9,
+ 0xC3, 0x79, 0xAF, 0xFC, 0x09, 0x31, 0x3F, 0xBE, 0x15, 0x37, 0xB7, 0x9B, 0xA2, 0xD5, 0xD7, 0xDD,
+ 0x1B, 0xBC, 0x69, 0xA3, 0x27, 0x8A, 0x7C, 0xAA, 0xC6, 0x31, 0x2A, 0xA9, 0x6F, 0xA1, 0x3D, 0xFE,
+ 0xB6, 0x40, 0xD0, 0x96, 0xBF, 0xEC, 0x37, 0xB1, 0x5C, 0x8E, 0xA8, 0xF7, 0x4B, 0x9D, 0x62, 0x5C,
+ 0x33, 0x4E, 0x54, 0xDA, 0x66, 0xF2, 0xFF, 0xEE, 0xE2, 0x19, 0xF3, 0x47, 0x74, 0xD2, 0xC8, 0x8D,
+ 0xDB, 0x67, 0xEC, 0x77, 0xD7, 0xC0, 0x1F, 0xC7, 0x4D, 0x7D, 0x03, 0xD1, 0xEB, 0xDD, 0x43, 0xD1,
+ 0x25, 0xD8, 0x29, 0x18, 0xCA, 0xE5, 0xF3, 0x89, 0x86, 0xA0, 0x09, 0xD1, 0x4E, 0x0C, 0x69, 0x47,
+ 0x1B, 0x89, 0x9B, 0xB2, 0xE9, 0xE3, 0x7E, 0x9C, 0xE4, 0xCD, 0xE8, 0x0A, 0x70, 0xF0, 0x95, 0x81,
+ 0x70, 0xF5, 0xAD, 0x6E, 0xD9, 0x41, 0x2D, 0xCD, 0xEC, 0xA3, 0x10, 0x18, 0xF1, 0x34, 0xD3, 0xC1,
+ 0x85, 0x5D, 0x07, 0xE5, 0x8C, 0x6A, 0xEF, 0xCC, 0xB0, 0xA7, 0x00, 0xE8, 0x53, 0x5D, 0xD5, 0xE5,
+ 0x47, 0x60, 0x94, 0xAB, 0x43, 0x26, 0xCD, 0x0E, 0x02, 0xD3, 0x8C, 0xF1, 0x8F, 0xAC, 0x23, 0x0F,
+ 0xDF, 0xB1, 0x3A, 0x8F, 0x99, 0xAF, 0x89, 0xAC, 0x5B, 0xAE, 0x6C, 0x40, 0x6D, 0xC1, 0x20, 0x2A,
+ 0x01, 0xFB, 0xC6, 0x02, 0x19, 0xC1, 0x89, 0x98, 0x41, 0x24, 0x9F, 0xCF, 0xA2, 0x43, 0x15, 0x3F,
+ 0xA7, 0x8F, 0x6F, 0xC6, 0x47, 0x91, 0x0A, 0xBA, 0x7B, 0xD3, 0x5E, 0xD2, 0xB3, 0x70, 0x00, 0x86,
+ 0xAD, 0xD6, 0xF4, 0xC4, 0x1D, 0x76, 0x90, 0x26, 0x47, 0xE3, 0x69, 0xA5, 0x8E, 0x2E, 0xBF, 0xA8,
+ 0x9D, 0x72, 0x84, 0x41, 0xC3, 0x8E, 0x4A, 0x6B, 0xE5, 0xA5, 0xB3, 0x05, 0x67, 0xDC, 0x5F, 0xAF,
+ 0xF0, 0x06, 0x08, 0x9C, 0x8E, 0x10, 0xDC, 0x73, 0x98, 0x73, 0x9A, 0x9B, 0xA6, 0x3D, 0xCF, 0xC2,
+ 0x2E, 0x7F, 0x37, 0xF8, 0xC2, 0xC6, 0x45, 0x6D, 0xD3, 0x01, 0x48, 0x55, 0x4E, 0x62, 0xEF, 0x67,
+ 0xD6, 0xAC, 0x7F, 0x6E, 0x9C, 0x0A, 0x1F, 0x5D, 0x9F, 0xB4, 0x55, 0x4F, 0xEB, 0x9D, 0xFC, 0xDD,
+ 0x92, 0x45, 0x1D, 0xAE, 0xBD, 0xCA, 0xCB, 0x04, 0xB9, 0x18, 0x3A, 0xBB, 0x2B, 0x8C, 0x8A, 0x80,
+ 0x4D, 0x1A, 0x24, 0x39, 0xDA, 0x10, 0x94, 0xDA, 0xC9, 0x4B, 0x2F, 0x0F, 0x86, 0x24, 0x0B, 0x51,
+ 0xF5, 0x57, 0xBA, 0x57, 0x23, 0x4D, 0x03, 0xAA, 0xA4, 0xC0, 0x23, 0x7D, 0xF9, 0x13, 0x02, 0x30,
+ 0x42, 0x4D, 0xDA, 0xE0, 0x5E, 0x11, 0x8E, 0xA7, 0x21, 0x20, 0xEA, 0x1F, 0x26, 0xF1, 0x5C, 0xCD,
+ 0x9C, 0x6F, 0x1E, 0xCC, 0xE8, 0x23, 0xA4, 0xDD, 0x40, 0x36, 0xFC, 0x8A, 0x95, 0x80, 0xFD, 0x91,
+ 0xD3, 0x8F, 0x61, 0x75, 0x6B, 0x09, 0xF8, 0x0A, 0xBE, 0x94, 0x25, 0x9C, 0x02, 0xFD, 0x65, 0x50,
+ 0x6F, 0x90, 0xA5, 0x9E, 0xDE, 0xD8, 0x98, 0x90, 0xBA, 0x06, 0xEF, 0xF6, 0xDC, 0x37, 0x4F, 0x46,
+ 0x3F, 0xF4, 0xD1, 0x91, 0xB2, 0x0D, 0xA7, 0x56, 0x78, 0x76, 0x35, 0xE7, 0x2D, 0x66, 0x2A, 0xF8,
+ 0x5B, 0xC5, 0x1F, 0x41, 0xB1, 0x89, 0xB6, 0x7C, 0x43, 0x68, 0x8E, 0x19, 0x44, 0x03, 0x8C, 0xD0,
+ 0xCA, 0xEF, 0x64, 0x34, 0x87, 0xC4, 0xEB, 0xD4, 0xCD, 0x33, 0x07, 0x71, 0x57, 0xA7, 0xDC, 0xE5,
+ 0x65, 0x2E, 0xD9, 0xE1, 0x7F, 0xAA, 0xCA, 0x11, 0xEC, 0xDF, 0x83, 0xAB, 0xBD, 0x9C, 0x27, 0xAB,
+ 0x5C, 0x34, 0x6A, 0x49, 0xDF, 0xAD, 0x68, 0xFA, 0x61, 0x39, 0xDC, 0x49, 0x7D, 0xF5, 0x76, 0xC2,
+ 0x3F, 0xD4, 0x48, 0xA2, 0x9C, 0x2D, 0x50, 0x94, 0x3E, 0xF7, 0xB3, 0xBA, 0x71, 0x23, 0x9F, 0x63,
+ 0x5F, 0x6D, 0x4D, 0x89, 0xA5, 0x37, 0x03, 0xDB, 0x79, 0x87, 0x27, 0x9E, 0x15, 0x65, 0x1C, 0x9F,
+ 0x61, 0x2B, 0x37, 0xFF, 0x87, 0xF4, 0x18, 0xF8, 0xBE, 0xAA, 0x1D, 0x4E, 0xBC, 0x02, 0x26, 0x1A,
+ 0xA5, 0x3E, 0x52, 0x97, 0x21, 0xE1, 0xD2, 0xDA, 0xC0, 0x2D, 0x8D, 0x4B, 0x57, 0xFC, 0x08, 0xAA,
+ 0x7C, 0x59, 0xF9, 0xBF, 0x3A, 0xF1, 0x96, 0x83, 0xA2, 0x59, 0x70, 0xA4, 0x06, 0x13, 0x6B, 0x15,
+ 0xA8, 0xCB, 0xC8, 0x0B, 0x85, 0x31, 0x42, 0x3E, 0x3E, 0x83, 0x0C, 0xAF, 0x40, 0xAC, 0xBE, 0x6C,
+ 0x6E, 0x17, 0x9A, 0xC6, 0x45, 0xCE, 0x1B, 0x1B, 0xBC, 0x94, 0xBF, 0xA2, 0x53, 0x5B, 0xDF, 0x95,
+ 0xEF, 0x6A, 0x41, 0x93, 0xC4, 0x58, 0xE9, 0x20, 0x68, 0x28, 0xB1, 0xA3, 0x80, 0x80, 0x48, 0xEF,
+ 0x7A, 0x7C, 0x11, 0x33, 0x62, 0x18, 0xB7, 0x41, 0x52, 0x36, 0xD5, 0xB6, 0xC0, 0x95, 0xD7, 0x71,
+ 0x00, 0x0B, 0x0A, 0x86, 0xE7, 0x13, 0x8D, 0xE6, 0x73, 0x33, 0xB5, 0x8B, 0xEE, 0xC3, 0xCA, 0x24,
+ 0x12, 0x96, 0x89, 0x91, 0x90, 0x95, 0xCA, 0x24, 0x30, 0xDB, 0x25, 0x9B, 0x1B, 0xF2, 0x13, 0xCA,
+ 0xC3, 0x3A, 0x8A, 0x7E, 0xEA, 0xF9, 0x7D, 0xB1, 0xF0, 0x69, 0xF8, 0xD9, 0xA0, 0xEE, 0x3C, 0xF8,
+ 0x02, 0x37, 0x93, 0xB5, 0xE3, 0xD9, 0x7B, 0x54, 0xF1, 0x3A, 0x9D, 0x20, 0xB0, 0xD2, 0xC6, 0xAE,
+ 0x61, 0x26, 0x90, 0x4C, 0xA5, 0x9D, 0x20, 0xE1, 0xEF, 0x4A, 0x07, 0xF6, 0xAF, 0xE9, 0x28, 0xF5,
+ 0x9B, 0x47, 0xDE, 0xD1, 0x65, 0x76, 0x0C, 0x70, 0x40, 0xBC, 0xA6, 0xA4, 0xE1, 0xF2, 0xEE, 0x0B,
+ 0xAA, 0xF3, 0x3A, 0x8E, 0x4F, 0x7D, 0x9F, 0x97, 0xB6, 0x65, 0x54, 0x16, 0x88, 0xAF, 0x5C, 0xCD,
+ 0xE3, 0x66, 0xEB, 0xB2, 0xA2, 0xA2, 0x5B, 0xE9, 0x0A, 0x54, 0x9B, 0x0E, 0x50, 0x4F, 0x89, 0xAD,
+ 0x67, 0x11, 0x48, 0x33, 0x08, 0x47, 0xA6, 0xE1, 0xB4, 0x03, 0xF5, 0x65, 0x2B, 0xD1, 0xF7, 0xC7,
+ 0x48, 0x3D, 0x1A, 0x33, 0xA6, 0x1E, 0x71, 0x1C, 0x02, 0x0A, 0x47, 0x9C, 0xE1, 0x97, 0xB3, 0x14,
+ 0xD4, 0xEA, 0xFA, 0xF9, 0xFF, 0x35, 0x67, 0xAA, 0xC3, 0x2E, 0x78, 0x33, 0x3D, 0x03, 0x17, 0x78,
+ 0x0B, 0xC7, 0x68, 0xC1, 0x19, 0x4D, 0x21, 0xFE, 0xD7, 0x84, 0xB8, 0xA0, 0x50, 0x36, 0xE6, 0x98,
+ 0xE7, 0x5C, 0xF2, 0x0C, 0xAC, 0x8D, 0x9E, 0xB4, 0xC4, 0xFB, 0x29, 0x50, 0x9F, 0xF7, 0x27, 0xEB,
+ 0x22, 0xDB, 0xD1, 0x19, 0x8E, 0x1C, 0xC4, 0x8C, 0x84, 0xF8, 0x0D, 0xB4, 0x1F, 0x80, 0x91, 0x70,
+ 0xE1, 0xFC, 0x64, 0xE2, 0x5B, 0xD8, 0x07, 0x67, 0x87, 0xA2, 0x7E, 0x37, 0xE4, 0x7A, 0xBF, 0x87,
+ 0xE4, 0x1F, 0x05, 0xAE, 0x25, 0xA5, 0x8C, 0xCE, 0xB5, 0x5F, 0x87, 0x77, 0xCF, 0x8E, 0x18, 0xA7,
+ 0xAB, 0x4E, 0x16, 0xB1, 0xFC, 0x70, 0x9C, 0x00, 0x4D, 0xC6, 0x9F, 0x92, 0x3F, 0x42, 0xAF, 0xB4,
+ 0xD0, 0x36, 0x13, 0xF0, 0xA3, 0xFE, 0x0E, 0x4B, 0xA3, 0xB9, 0xD6, 0xF0, 0x5F, 0xD3, 0x29, 0xDD,
+ 0xB0, 0x27, 0x49, 0x13, 0x9F, 0x2B, 0xF8, 0xCB, 0x62, 0xC2, 0xBF, 0x80, 0x1D, 0x62, 0x23, 0x5B,
+ 0xCE, 0x19, 0x6F, 0xE1, 0xAA, 0xD9, 0x99, 0x0F, 0x48, 0x72, 0xFE, 0xEF, 0x52, 0x58, 0x39, 0xF6,
+ 0x4A, 0x98, 0x4A, 0xEF, 0xCF, 0xA3, 0x71, 0x92, 0xC6, 0xC6, 0x8F, 0x39, 0xED, 0x7D, 0x0B, 0x6C,
+ 0x62, 0xE1, 0xA8, 0x0E, 0x62, 0xF7, 0x59, 0xD6, 0xB0, 0x67, 0x82, 0x12, 0x5C, 0xA9, 0xBC, 0x52,
+ 0x7F, 0xCF, 0xD3, 0x33, 0x7A, 0x98, 0xFE, 0x8E, 0x70, 0x31, 0xB9, 0x82, 0x37, 0xD2, 0x37, 0xC9,
+ 0xEE, 0x1C, 0xBC, 0x76, 0x0B, 0xBD, 0x95, 0xD4, 0xD0, 0x9C, 0xEE, 0x9F, 0x8A, 0x9C, 0xA0, 0x34,
+ 0xFE, 0x8D, 0x64, 0xF0, 0xDA, 0x02, 0x17, 0xA3, 0x26, 0x68, 0x4B, 0xE8, 0x54, 0xF7, 0xE1, 0x94,
+ 0x6D, 0xA9, 0x5E, 0x8B, 0x86, 0x13, 0xDB, 0x5C, 0x0C, 0xF0, 0x3C, 0x40, 0x4F, 0x0D, 0x15, 0xD7,
+ 0xE7, 0x48, 0x3F, 0xC6, 0x33, 0x24, 0x30, 0x83, 0x50, 0x30, 0xBC, 0xD7, 0xE5, 0x25, 0x32, 0x11,
+ 0xD0, 0xA7, 0xE3, 0x7C, 0x4D, 0xE4, 0x46, 0xE3, 0xCB, 0xF7, 0x04, 0x49, 0xFF, 0x5F, 0x0C, 0xFE,
+ 0x36, 0xEE, 0x39, 0x46, 0x5B, 0x41, 0x7D, 0x1B, 0xF0, 0xCF, 0x90, 0xEF, 0x72, 0x6E, 0x61, 0xE5,
+ 0x26, 0xC7, 0xC5, 0x6A, 0xCA, 0x40, 0x7A, 0x30, 0x8E, 0x0A, 0x2F, 0xDD, 0x64, 0x95, 0xF7, 0x19,
+ 0x6D, 0x0F, 0xDB, 0x80, 0xFB, 0x9E, 0x6B, 0x36, 0xD6, 0x1E, 0x0A, 0x34, 0x7A, 0x8B, 0x1B, 0xB9,
+ 0xA8, 0xBB, 0x49, 0x67, 0xCA, 0x7E, 0xD6, 0x27, 0x6F, 0xAC, 0xED, 0x25, 0x89, 0xFD, 0xB4, 0x11,
+ 0x2F, 0x43, 0x74, 0x40, 0x2D, 0x73, 0x20, 0xA1, 0x94, 0x9E, 0x79, 0x5D, 0x20, 0x88, 0xD5, 0x1F,
+ 0x13, 0x10, 0x35, 0x7A, 0x4C, 0xF0, 0x5B, 0x09, 0x96, 0x75, 0x6F, 0x5F, 0xED, 0x9D, 0x68, 0xBD,
+ 0x0D, 0x77, 0x5C, 0x85, 0x13, 0x3A, 0x11, 0x0D, 0x0A, 0x90, 0x98, 0x8F, 0xCE, 0x4C, 0xE5, 0x46,
+ 0x40, 0x86, 0x75, 0xA5, 0x49, 0x5C, 0x12, 0x57, 0xF8, 0x48, 0x86, 0xD4, 0x81, 0xA4, 0x47, 0x39,
+ 0x19, 0x42, 0x23, 0x44, 0x7F, 0x57, 0x9C, 0x95, 0xA1, 0xFD, 0x3E, 0xA6, 0x29, 0x84, 0xF6, 0x8F,
+ 0x87, 0x79, 0x8B, 0xF6, 0x45, 0x5A, 0x9B, 0x7E, 0xBB, 0xC1, 0xD3, 0xB7, 0xE4, 0x18, 0xB0, 0x61,
+ 0x77, 0xB4, 0x12, 0x25, 0xEE, 0x6C, 0x3D, 0x6C, 0xA9, 0xFE, 0x67, 0xDE, 0xCC, 0x8F, 0x11, 0xC1,
+ 0x8A, 0xD6, 0x72, 0xAC, 0x45, 0x77, 0xEF, 0xD3, 0x96, 0x41, 0xA7, 0xC1, 0x92, 0x15, 0x93, 0x44,
+ 0x18, 0x08, 0x14, 0x7C, 0xAB, 0xCE, 0xBF, 0xFA, 0x89, 0xEF, 0xAD, 0x09, 0x9A, 0xB9, 0x8A, 0x7D,
+ 0xD5, 0xA2, 0x82, 0x90, 0x10, 0x4E, 0xD6, 0xCC, 0x04, 0x43, 0x21, 0x6B, 0xDF, 0xE4, 0x56, 0xE9,
+ 0x7D, 0x17, 0xCD, 0xC1, 0x3A, 0xC0, 0xA1, 0x83, 0xCE, 0xC8, 0x90, 0x2E, 0xA6, 0x73, 0x44, 0x72,
+ 0x10, 0x7B, 0x03, 0xDB, 0x2F, 0xCA, 0x9C, 0x71, 0x44, 0x06, 0xAC, 0xCB, 0x4A, 0x09, 0xF0, 0x08,
+ 0x1C, 0x99, 0x49, 0x13, 0x19, 0x6E, 0xEE, 0x4C, 0xA2, 0xE4, 0xB8, 0xA0, 0x36, 0xE2, 0x9C, 0x13,
+ 0x7E, 0x6C, 0x9B, 0x3C, 0x74, 0x5A, 0x50, 0x90, 0x8C, 0xE1, 0x24, 0x76, 0x14, 0xF7, 0x2E, 0x77,
+ 0x24, 0x64, 0xFA, 0x37, 0x0C, 0xE1, 0x90, 0xDB, 0xB4, 0x4C, 0x9E, 0xC5, 0x26, 0xA8, 0xED, 0x02,
+ 0x72, 0x4D, 0xF4, 0x91, 0x94, 0xDF, 0x77, 0x3B, 0x96, 0xB9, 0x42, 0x34, 0xD2, 0xB7, 0x1E, 0x49,
+ 0xBD, 0x29, 0xBB, 0x3C, 0xC6, 0x5B, 0x3F, 0x15, 0xE5, 0x8F, 0x0E, 0x23, 0xA5, 0xD5, 0x73, 0x06,
+ 0x6F, 0xEF, 0x73, 0x51, 0xB2, 0xC8, 0xD4, 0x44, 0xFC, 0x25, 0x95, 0xA9, 0x44, 0x57, 0xB7, 0x80,
+ 0x07, 0xB0, 0xCE, 0x58, 0x12, 0xFF, 0xD3, 0xD9, 0x13, 0xDD, 0x11, 0x26, 0x5B, 0xC3, 0x5B, 0xEE,
+ 0xA9, 0x53, 0x19, 0xE9, 0x31, 0x9C, 0x1B, 0x3A, 0x2A, 0x9F, 0xD9, 0x7C, 0x7A, 0x55, 0x52, 0x40,
+ 0xE0, 0xEC, 0x11, 0x39, 0x7E, 0x09, 0xD7, 0xE7, 0xCF, 0xC7, 0x67, 0xDB, 0xDE, 0x02, 0x92, 0xEF,
+ 0x47, 0x2C, 0x54, 0xFD, 0xE4, 0x37, 0xC6, 0x9F, 0x51, 0x66, 0x96, 0x84, 0x19, 0x94, 0x90, 0xE6,
+ 0x4E, 0x43, 0x2A, 0xB9, 0x13, 0x40, 0x9C, 0xE9, 0x89, 0xA2, 0x2B, 0x8E, 0x8C, 0x39, 0x42, 0x42,
+ 0xF8, 0xD9, 0x5A, 0x86, 0x0E, 0xA6, 0x3A, 0x9E, 0xA8, 0xA5, 0x23, 0x19, 0x58, 0xDB, 0x4C, 0x46,
+ 0xCA, 0x26, 0x50, 0x0B, 0xD2, 0x6A, 0x9B, 0xBE, 0x63, 0x55, 0xF4, 0x42, 0xD8, 0x20, 0xCD, 0x55,
+ 0x01, 0xA0, 0x3D, 0xE3, 0x97, 0x23, 0x14, 0xF1, 0x6A, 0x2A, 0x5A, 0xA9, 0xBD, 0x01, 0x5E, 0x56,
+ 0x8F, 0xC7, 0x31, 0x6F, 0xBB, 0x78, 0x88, 0x01, 0xF0, 0x00, 0xD2, 0x1B, 0x40, 0x6D, 0x50, 0xD0,
+ 0xCB, 0x44, 0x35, 0x3A, 0xBC, 0xBB, 0x6F, 0x6C, 0xF4, 0xDB, 0x6F, 0x54, 0x27, 0x8C, 0x0A, 0x5A,
+ 0xE8, 0x56, 0xC9, 0x28, 0x44, 0xBC, 0xF7, 0x70, 0xF0, 0x95, 0x17, 0xA1, 0x0B, 0x91, 0xDF, 0x80,
+ 0xF8, 0xF3, 0xF9, 0xB9, 0x1C, 0xEB, 0x81, 0x31, 0x18, 0xE2, 0xB6, 0xF8, 0x80, 0x64, 0x61, 0x1F,
+ 0xD9, 0x14, 0x6C, 0x64, 0xE8, 0xDB, 0x45, 0x5E, 0x16, 0xD4, 0xDB, 0xC9, 0x13, 0x70, 0x4B, 0x0E,
+ 0x40, 0x80, 0xB9, 0xCA, 0x9E, 0xB7, 0x85, 0x88, 0xDA, 0xF8, 0x13, 0xFE, 0x51, 0x28, 0xB9, 0x6E,
+ 0x65, 0x92, 0xAA, 0x45, 0x68, 0xC6, 0x82, 0xCC, 0xBA, 0x28, 0x6E, 0xCF, 0x54, 0x7A, 0xB4, 0x8A,
+ 0x8A, 0x92, 0x3C, 0x2F, 0x55, 0x6A, 0xE3, 0x23, 0x27, 0x4B, 0xFA, 0x13, 0x58, 0xB5, 0xAE, 0x9D,
+ 0xA3, 0x77, 0x25, 0xFA, 0x70, 0x59, 0x5A, 0x34, 0x4C, 0xF1, 0xA9, 0x9A, 0x37, 0x2B, 0xEF, 0xA0,
+ 0x85, 0xB7, 0x97, 0x74, 0x04, 0xD0, 0x08, 0xFE, 0x01, 0x7B, 0x33, 0x44, 0xB8, 0x44, 0x12, 0xE6,
+ 0x1D, 0xCF, 0xE0, 0x8D, 0xDE, 0x92, 0x93, 0x49, 0xB8, 0x2B, 0x65, 0x0D, 0x38, 0x55, 0x3B, 0x90,
+ 0x89, 0x01, 0x40, 0xEB, 0xF1, 0x33, 0x5C, 0x36, 0xAA, 0xF7, 0x84, 0x75, 0x8A, 0xB1, 0xE4, 0x68,
+ 0x6F, 0x3C, 0x7C, 0x84, 0x71, 0x06, 0x57, 0xC4, 0x83, 0x9F, 0x6A, 0x96, 0x8F, 0xEB, 0xA6, 0x59,
+ 0xBB, 0x2D, 0x68, 0x35, 0x8F, 0xBF, 0x8D, 0xFE, 0xC8, 0xBC, 0xA7, 0x41, 0x97, 0x17, 0x49, 0x82,
+ 0x6E, 0x4D, 0xB0, 0xE8, 0xC9, 0x10, 0x57, 0x7B, 0x9C, 0x03, 0xDD, 0x90, 0xE3, 0x15, 0x30, 0x9A,
+ 0x66, 0xAB, 0xF8, 0x9A, 0x69, 0xBE, 0x6E, 0x74, 0x3C, 0xF4, 0xDD, 0x0D, 0x77, 0x77, 0x30, 0x2C,
+ 0x3C, 0x2B, 0x7E, 0x01, 0x90, 0xFD, 0xD7, 0xF1, 0x87, 0x03, 0x61, 0x87, 0x8B, 0x46, 0x5C, 0x02,
+ 0x20, 0x5C, 0xB0, 0x8C, 0x56, 0x51, 0xA3, 0xFE, 0x15, 0x28, 0x24, 0xC7, 0x43, 0xE9, 0x15, 0x43,
+ 0xA7, 0xD7, 0x21, 0x12, 0x88, 0xD5, 0x32, 0xAE, 0x04, 0xC8, 0x3E, 0x28, 0x7E, 0x08, 0xD4, 0x97,
+ 0x5E, 0xCF, 0x60, 0xF1, 0x42, 0x96, 0x2B, 0xED, 0xAE, 0x71, 0x43, 0xD0, 0x04, 0x48, 0x65, 0x03,
+ 0x9A, 0xFA, 0x77, 0x45, 0x5A, 0xFC, 0x48, 0x12, 0x16, 0xCF, 0xAF, 0x13, 0xE4, 0x03, 0xCC, 0x8F,
+ 0xF4, 0xB5, 0x68, 0xB3, 0xF5, 0x53, 0x13, 0x42, 0x26, 0x8F, 0xB5, 0x71, 0x8E, 0x9B, 0xB3, 0x2E,
+ 0xF6, 0x9F, 0x1E, 0x4A, 0xBC, 0xB9, 0xD8, 0xA5, 0x77, 0xCE, 0x95, 0x94, 0xE3, 0x9F, 0xD8, 0xAD,
+ 0x53, 0x79, 0x03, 0xA6, 0x57, 0xF7, 0x13, 0xD5, 0x66, 0x25, 0x66, 0x88, 0x78, 0xF7, 0xF6, 0x35,
+ 0xF9, 0xCC, 0x7F, 0xC6, 0x36, 0xAD, 0xC2, 0x70, 0x34, 0x94, 0xAA, 0xED, 0xCA, 0x4A, 0x14, 0x16,
+ 0xF6, 0x6E, 0x46, 0xE8, 0x32, 0x63, 0xDF, 0x88, 0x66, 0x65, 0x6E, 0xA3, 0xCF, 0xDB, 0x1E, 0x5B,
+ 0xFD, 0xCB, 0xB1, 0x99, 0x4A, 0x65, 0xD3, 0x24, 0xD8, 0xC9, 0xA1, 0xAA, 0x06, 0xA9, 0x4C, 0xF5,
+ 0x7C, 0x9E, 0x98, 0x77, 0x12, 0xC2, 0xA9, 0xF9, 0x8D, 0x5F, 0x43, 0x1B, 0x9D, 0xEB, 0xD2, 0x28,
+ 0x2C, 0x54, 0x60, 0x97, 0x5A, 0x70, 0x28, 0x78, 0xCA, 0x43, 0xD1, 0xBA, 0xA3, 0x5F, 0x49, 0x6A,
+ 0x0C, 0x2A, 0x53, 0x09, 0xF8, 0x5E, 0x89, 0x5C, 0x6A, 0x5D, 0x2A, 0x8B, 0x58, 0x7D, 0x19, 0x1A,
+ 0xF1, 0x1B, 0x5A, 0x12, 0xE7, 0x09, 0x9C, 0x88, 0xD5, 0xD7, 0x15, 0xFB, 0xDF, 0x62, 0xA9, 0x54,
+ 0xD7, 0xD5, 0x7A, 0x2B, 0xBF, 0xCA, 0x0B, 0xB9, 0x07, 0xB4, 0xC9, 0x17, 0x81, 0x33, 0x07, 0x25,
+ 0xE2, 0x0A, 0x6C, 0xF4, 0xD1, 0xF7, 0xF7, 0x65, 0xDE, 0x71, 0x00, 0x72, 0x9C, 0x2A, 0xBC, 0x31,
+ 0xC0, 0x94, 0x85, 0x93, 0x9C, 0x65, 0xA6, 0xF1, 0x2F, 0x01, 0x8B, 0xD8, 0x66, 0x3E, 0x96, 0xB6,
+ 0x96, 0xA0, 0x78, 0xA3, 0x85, 0x35, 0x6C, 0x3A, 0x37, 0x09, 0x76, 0x12, 0xB1, 0xA8, 0xC5, 0xE3,
+ 0x53, 0xFB, 0x17, 0xB4, 0x10, 0xD1, 0x0F, 0xFA, 0xE7, 0x42, 0x58, 0x20, 0x72, 0x79, 0xC2, 0x94,
+ 0xAF, 0xF7, 0x7D, 0x35, 0xD3, 0x48, 0x23, 0x67, 0x0F, 0xD7, 0x65, 0xE0, 0x48, 0x05, 0x7E, 0x09,
+ 0xE6, 0x0A, 0x4B, 0xD2, 0xB0, 0xB9, 0x84, 0x12, 0xAF, 0x4B, 0x92, 0xDD, 0x30, 0x4B, 0x9F, 0xDC,
+ 0xD5, 0x5D, 0xD4, 0x5A, 0x13, 0xE6, 0xB7, 0x18, 0x18, 0xC0, 0x52, 0x18, 0xBF, 0xC2, 0xB8, 0x7D,
+ 0x2B, 0x2A, 0x36, 0x7A, 0x63, 0x6E, 0xF7, 0x59, 0x61, 0xC3, 0x97, 0x31, 0xDD, 0x61, 0x15, 0x1B,
+ 0x30, 0xC3, 0xDD, 0xF5, 0x51, 0x2F, 0x77, 0xB4, 0x54, 0x6E, 0x4D, 0x98, 0x13, 0xDB, 0x3E, 0x4C,
+ 0xA9, 0xCF, 0x77, 0xC8, 0x2D, 0x8E, 0x49, 0xDA, 0x67, 0xBA, 0x6C, 0x37, 0x54, 0xAB, 0x55, 0x80,
+ 0x15, 0x94, 0x5F, 0xB6, 0x4D, 0x6B, 0xB3, 0xA3, 0x13, 0xBD, 0x7C, 0x47, 0xE3, 0xA5, 0x70, 0x9B,
+ 0xEC, 0x5C, 0x94, 0x60, 0xC9, 0xEA, 0xD6, 0x64, 0xEE, 0x3B, 0x8F, 0x4E, 0xE2, 0x07, 0x61, 0xC6,
+ 0xA4, 0x64, 0x8A, 0xA1, 0xF9, 0x57, 0xC2, 0xEA, 0x89, 0x95, 0x12, 0x67, 0xE0, 0xC6, 0xCF, 0x44,
+ 0x40, 0x98, 0x8E, 0xB7, 0xDF, 0xFF, 0xCB, 0xAA, 0xEF, 0xC5, 0x72, 0x8D, 0xD4, 0xC7, 0x58, 0x60,
+ 0x9D, 0xE1, 0xD6, 0x1D, 0x3A, 0x12, 0xBA, 0x5E, 0xA9, 0xAB, 0x21, 0xB9, 0x2E, 0xE0, 0x04, 0x47,
+ 0x1B, 0xB2, 0x37, 0x28, 0xED, 0x7F, 0x7D, 0x24, 0x63, 0x2D, 0x98, 0x04, 0x4D, 0x1E, 0x6B, 0xE7,
+ 0x11, 0x1C, 0xED, 0xB1, 0x02, 0x64, 0x63, 0x51, 0x71, 0x6E, 0xB1, 0x3D, 0xAD, 0xE1, 0xEB, 0x3B,
+ 0x23, 0x51, 0xE3, 0x45, 0xA4, 0x83, 0xB2, 0x83, 0xD9, 0x43, 0x5C, 0xF6, 0x99, 0xDE, 0xC8, 0xD2,
+ 0xB7, 0x11, 0x26, 0xF3, 0xEA, 0x69, 0xFE, 0x54, 0x22, 0x33, 0xCD, 0xDE, 0xE4, 0x2F, 0x65, 0x19,
+ 0xA0, 0x3E, 0xDB, 0x4E, 0xB0, 0x4A, 0xFA, 0x57, 0x47, 0x13, 0x84, 0x7B, 0x73, 0x3B, 0x8E, 0xB1,
+ 0x8A, 0x1C, 0x80, 0x0C, 0x9D, 0x67, 0xF3, 0xD5, 0x00, 0xD7, 0xDA, 0x92, 0xA5, 0xF7, 0xE4, 0x8D,
+ 0x60, 0x48, 0xD2, 0x5C, 0xF6, 0x9A, 0x0D, 0x94, 0xE4, 0x19, 0x75, 0xCF, 0xE2, 0xCD, 0x22, 0xD5,
+ 0x87, 0x9C, 0x36, 0x65, 0xC7, 0x36, 0x0D, 0x5B, 0x5C, 0x7A, 0x08, 0xC7, 0x98, 0xF5, 0xAE, 0x04,
+ 0x45, 0xCE, 0x32, 0x1A, 0x25, 0xC9, 0x1F, 0x2E, 0x96, 0x95, 0x62, 0x97, 0x4C, 0x27, 0x82, 0xB9,
+ 0x0A, 0xFA, 0x0D, 0xE3, 0xF1, 0xEA, 0xD6, 0x59, 0x3A, 0x6C, 0x9B, 0x28, 0xCA, 0x8A, 0x19, 0x79,
+ 0x5C, 0xE9, 0xFF, 0xFD, 0x93, 0x54, 0x26, 0xF4, 0x09, 0x58, 0xB9, 0x41, 0x90, 0x2C, 0x74, 0x98,
+ 0x45, 0x9A, 0x71, 0x12, 0x06, 0x52, 0xAA, 0x31, 0xAD, 0xEA, 0x97, 0x81, 0x33, 0xD6, 0xA3, 0x54,
+ 0xCA, 0x9D, 0x5E, 0xF1, 0x87, 0xDD, 0xAB, 0x1E, 0xF1, 0x1B, 0xA4, 0xFD, 0x74, 0x60, 0x93, 0xD6,
+ 0x01, 0x9F, 0x5C, 0x2D, 0x7D, 0xE7, 0xB8, 0x76, 0x36, 0x80, 0xD0, 0x63, 0x27, 0xC8, 0x94, 0x15,
+ 0x4B, 0x1C, 0xC2, 0x6B, 0x67, 0x23, 0xEC, 0xAC, 0xD2, 0xEB, 0xC5, 0x5D, 0x78, 0x81, 0xD6, 0x30,
+ 0xDD, 0xA6, 0x2C, 0xEE, 0x16, 0xDA, 0x8B, 0xA0, 0x9D, 0x20, 0xF8, 0x62, 0x87, 0x6D, 0xC2, 0x9C,
+ 0x80, 0x53, 0x3C, 0x20, 0x06, 0x78, 0x71, 0xD7, 0xA6, 0x0D, 0xEA, 0xA8, 0x58, 0xA6, 0x21, 0x77,
+ 0xCB, 0xD0, 0x6F, 0x05, 0x7A, 0x47, 0x1C, 0xFB, 0xA0, 0x4D, 0xD8, 0x22, 0xD1, 0xE3, 0x9B, 0x14,
+ 0x98, 0xF4, 0xAE, 0x20, 0xEC, 0x64, 0xD9, 0xC6, 0xBF, 0xB1, 0x40, 0x1A, 0x4C, 0x66, 0xC3, 0x2B,
+ 0xC0, 0xE7, 0xD3, 0x61, 0x4C, 0x6D, 0xF8, 0x5D, 0xC9, 0x33, 0x92, 0xC4, 0x1D, 0xA3, 0xF5, 0x69,
+ 0x10, 0xF3, 0x4B, 0x31, 0x1C, 0x1D, 0x11, 0x8E, 0xB0, 0xF8, 0xD9, 0x3A, 0xBF, 0x06, 0xC1, 0xB0,
+ 0x27, 0x8B, 0xB6, 0x9E, 0x7C, 0x6E, 0x27, 0x15, 0xF1, 0xE0, 0xE7, 0x31, 0x87, 0x10, 0x94, 0x2C,
+ 0x0D, 0xC6, 0x75, 0x54, 0xD2, 0x5A, 0xE4, 0x25, 0xA7, 0xB9, 0x16, 0x4A, 0x93, 0x8E, 0x1D, 0x84,
+ 0x06, 0xDC, 0x84, 0xDE, 0x57, 0x9D, 0xF7, 0xC1, 0x68, 0x08, 0x67, 0xFD, 0x5C, 0x38, 0x2A, 0xC9,
+ 0x99, 0x28, 0xEC, 0x5D, 0xB4, 0x2A, 0xCA, 0xB3, 0xBC, 0x92, 0x0C, 0xFC, 0xC9, 0xED, 0x22, 0x52,
+ 0x79, 0xC4, 0x04, 0x3F, 0xD0, 0x7D, 0x4B, 0xE0, 0x0C, 0x0F, 0x82, 0x00, 0xB8, 0x38, 0x70, 0x06,
+ 0xC5, 0x34, 0x1E, 0x0D, 0x96, 0x7E, 0xDC, 0x94, 0x7E, 0x64, 0x47, 0xA9, 0x62, 0xAE, 0xA3, 0x8B,
+ 0x6E, 0x0B, 0x1D, 0xB9, 0x8F, 0xE8, 0xAA, 0x57, 0xD7, 0xE3, 0x65, 0x15, 0x28, 0x88, 0xF5, 0x21,
+ 0xF3, 0x38, 0xA4, 0xFC, 0xDB, 0x09, 0xC1, 0x7A, 0x7B, 0xA7, 0xFF, 0x0B, 0xA3, 0x18, 0xA2, 0x42,
+ 0x28, 0x22, 0xB2, 0x95, 0x25, 0x56, 0x08, 0xFF, 0x3D, 0xB5, 0xF1, 0x41, 0x44, 0x34, 0x64, 0x67,
+ 0x2C, 0xD5, 0xF0, 0x40, 0x9B, 0x82, 0x18, 0xAE, 0x8E, 0x74, 0xFE, 0x6D, 0xCC, 0x3E, 0x02, 0x13,
+ 0x41, 0xC3, 0x32, 0x33, 0x76, 0x3A, 0x4A, 0x5B, 0xED, 0xFC, 0x64, 0xFB, 0x17, 0x2A, 0xB1, 0x9B,
+ 0xF6, 0xB9, 0x45, 0x83, 0xBC, 0x42, 0x12, 0xAB, 0x91, 0xFD, 0x2A, 0x34, 0xE7, 0x56, 0xBA, 0xB8,
+ 0x69, 0x81, 0xBA, 0x30, 0x6C, 0x8C, 0x4B, 0xAB, 0x1D, 0x47, 0x57, 0xAA, 0xE7, 0x3F, 0x25, 0x25,
+ 0x7E, 0x6A, 0x2D, 0x35, 0x61, 0xB0, 0xC1, 0xAC, 0x81, 0xFE, 0xB5, 0x28, 0x7E, 0xFF, 0x6B, 0x6B,
+ 0x71, 0xBA, 0x60, 0x0C, 0x56, 0xCC, 0x6D, 0xA2, 0x23, 0xB2, 0x2B, 0xFB, 0xCB, 0x16, 0x25, 0xFE,
+ 0x6C, 0xAC, 0x81, 0x2E, 0xAC, 0x11, 0xB2, 0x79, 0xC8, 0x7A, 0x44, 0x0B, 0x82, 0xF8, 0xC6, 0xE0,
+ 0x2D, 0x92, 0x58, 0x73, 0xAF, 0x8A, 0xD7, 0x3D, 0x2C, 0x05, 0x09, 0x54, 0x2F, 0xDE, 0x12, 0x17,
+ 0xC5, 0xB1, 0x32, 0xFA, 0x58, 0xE4, 0x0F, 0x74, 0x1E, 0xAA, 0xAC, 0x3B, 0x35, 0xDF, 0x92, 0x9C,
+ 0xB2, 0xC2, 0xA6, 0x90, 0x6D, 0xD4, 0xEB, 0x13, 0xA8, 0xEA, 0xC2, 0x61, 0xED, 0x67, 0x65, 0x44,
+ 0xAD, 0x46, 0x28, 0x11, 0x0F, 0x46, 0x04, 0x49, 0xE6, 0x2E, 0x1A, 0xD6, 0x67, 0x72, 0x7C, 0x0D,
+ 0x6A, 0x8A, 0xFA, 0xDB, 0x94, 0x66, 0x84, 0xF1, 0x31, 0x3F, 0x38, 0x1C, 0x04, 0xCF, 0x09, 0x52,
+ 0x2F, 0xDB, 0xF6, 0x6F, 0xEB, 0x69, 0x03, 0x10, 0x92, 0xA0, 0x95, 0x0A, 0xE5, 0x52, 0x4A, 0x9B,
+ 0xD7, 0x76, 0x05, 0x80, 0x07, 0x09, 0x4A, 0x3A, 0x37, 0xCD, 0xB3, 0x73, 0x64, 0x1F, 0xAB, 0x14,
+ 0x57, 0xA0, 0xFF, 0x9B, 0x0D, 0x34, 0x56, 0x0A, 0x79, 0x79, 0x20, 0x7C, 0x4A, 0x52, 0xD8, 0xB4,
+ 0x22, 0x45, 0x88, 0x90, 0xA0, 0x35, 0x36, 0x71, 0x9B, 0xD8, 0x2E, 0xC5, 0x89, 0x20, 0x54, 0x36,
+ 0x7A, 0x47, 0x03, 0x45, 0xF8, 0xB2, 0x20, 0xD0, 0xBC, 0x84, 0x05, 0x40, 0xDB, 0xD4, 0xD0, 0x1C,
+ 0x9E, 0xF0, 0x37, 0x02, 0x31, 0xD9, 0xDE, 0xBC, 0xBD, 0x87, 0x3E, 0xA7, 0x2A, 0xD9, 0x7E, 0x8B,
+ 0xBD, 0xEF, 0x67, 0xC4, 0x06, 0x00, 0x43, 0xA7, 0x89, 0xE6, 0xA8, 0x7B, 0xBD, 0x03, 0xCB, 0xC8,
+ 0x2F, 0x46, 0xEF, 0xA5, 0xEF, 0x16, 0x7D, 0xE3, 0xE9, 0x63, 0xCC, 0x89, 0xFC, 0xE5, 0x14, 0x40,
+ 0x3A, 0x5A, 0xC8, 0xBC, 0xF6, 0xD9, 0x3D, 0xAC, 0x82, 0xB5, 0x7F, 0xB7, 0xE4, 0x8F, 0x5C, 0x0A,
+ 0x5F, 0x6E, 0x0C, 0xF1, 0x7E, 0xAD, 0x12, 0xFA, 0x4E, 0x01, 0xC5, 0x62, 0xBF, 0x10, 0x27, 0xE7,
+ 0x72, 0xC0, 0xC3, 0xA6, 0x8B, 0xF7, 0xD8, 0xA5, 0x52, 0x20, 0xA3, 0xEE, 0x70, 0xB0, 0xF6, 0xE2,
+ 0x6A, 0x8D, 0x29, 0x73, 0x17, 0xBD, 0x68, 0x45, 0x25, 0x53, 0x68, 0xC5, 0x1B, 0xD5, 0xC1, 0xFF,
+ 0x38, 0x17, 0x25, 0x47, 0x0C, 0x2E, 0xD4, 0x3E, 0xF7, 0x91, 0x36, 0x35, 0xAD, 0x72, 0xBE, 0x5A,
+ 0x19, 0x04, 0x97, 0x77, 0x51, 0x5D, 0x2E, 0x51, 0xA7, 0xC3, 0x22, 0xEE, 0xE6, 0xC9, 0x9A, 0x3B,
+ 0x9D, 0xA2, 0x84, 0xDE, 0x2B, 0x76, 0x62, 0x00, 0x2C, 0x4F, 0xA5, 0x12, 0xC5, 0x43, 0x8B, 0xD0,
+ 0x13, 0x9E, 0x88, 0x3D, 0x33, 0xC3, 0xF4, 0x41, 0x6D, 0x00, 0x3B, 0xC3, 0xE1, 0xA1, 0x0A, 0x6A,
+ 0x63, 0xE8, 0x42, 0x89, 0x05, 0xAF, 0xAA, 0x2B, 0x07, 0x25, 0x5B, 0xE1, 0xAA, 0xC6, 0xA7, 0xBD,
+ 0x72, 0xC5, 0x17, 0x75, 0x53, 0x61, 0x20, 0x76, 0x14, 0xCC, 0x7A, 0x06, 0xF5, 0x21, 0xD2, 0x8F,
+ 0x8F, 0x18, 0x5C, 0x50, 0xAA, 0x98, 0xA4, 0xB9, 0x7E, 0xBF, 0xD6, 0xBA, 0xEA, 0x9D, 0x64, 0xF3,
+ 0x31, 0x4D, 0x48, 0x18, 0x58, 0xF0, 0x07, 0x23, 0xD6, 0x3E, 0xCA, 0xB4, 0x54, 0xE6, 0x04, 0x19,
+ 0x18, 0xD5, 0xC7, 0x54, 0x85, 0x75, 0xA6, 0x58, 0x0E, 0xEB, 0x74, 0xD6, 0xF6, 0xAF, 0xB4, 0x9D,
+ 0x70, 0xF0, 0x7B, 0x88, 0x8B, 0x8B, 0x64, 0x2C, 0x20, 0x40, 0x98, 0x5E, 0x2C, 0x64, 0xC6, 0x98,
+ 0x26, 0x1D, 0x94, 0x90, 0x01, 0x03, 0x66, 0x5D, 0x6D, 0xC0, 0xBB, 0x5A, 0xC4, 0xF0, 0x0B, 0x78,
+ 0x4E, 0x2E, 0x89, 0xA2, 0x86, 0x41, 0x90, 0x7B, 0x1D, 0x2C, 0x76, 0x17, 0xE5, 0x39, 0xE9, 0xF7,
+ 0x00, 0xC0, 0x6B, 0x1F, 0x7E, 0xC1, 0xC2, 0x15, 0xA8, 0xA3, 0xF6, 0x7C, 0xF6, 0x19, 0x3F, 0xE0,
+ 0xCE, 0xEF, 0x5C, 0x7B, 0x63, 0x63, 0xBE, 0x64, 0x33, 0x0E, 0x03, 0xFE, 0xF9, 0x03, 0xD9, 0xF7,
+ 0xDF, 0x99, 0x37, 0x70, 0xAE, 0x6B, 0x90, 0x2A, 0x99, 0x14, 0x1D, 0x0C, 0x83, 0x6A, 0xC9, 0xEA,
+ 0x34, 0x8C, 0xAC, 0x51, 0x30, 0x04, 0x4A, 0x71, 0xA8, 0x8E, 0xC6, 0xD8, 0x19, 0x70, 0xB0, 0xE4,
+ 0x80, 0x55, 0x52, 0x09, 0x5E, 0x58, 0x22, 0xFF, 0x80, 0xC1, 0xAE, 0x0A, 0x87, 0xC7, 0xBE, 0xC7,
+ 0x95, 0xEA, 0x98, 0x5A, 0xC0, 0x67, 0xA3, 0xDA, 0x68, 0xEF, 0xBA, 0x48, 0xF1, 0xA0, 0x2C, 0x33,
+ 0x56, 0x1A, 0x45, 0xB8, 0xA3, 0x70, 0xA8, 0xD3, 0xB2, 0xCF, 0x1C, 0xC0, 0x02, 0x1E, 0xDA, 0x14,
+ 0x0B, 0x2C, 0x03, 0xEA, 0xEC, 0x2E, 0x2B, 0x21, 0x1C, 0xE1, 0x99, 0xDF, 0x46, 0xD1, 0xC1, 0xE9,
+ 0x00, 0x90, 0xB6, 0x7D, 0x79, 0xA2, 0x42, 0xF7, 0x0E, 0x67, 0xE3, 0x8B, 0xE1, 0x42, 0x26, 0x7A,
+ 0x69, 0x82, 0x9D, 0x5C, 0x26, 0xFE, 0xE2, 0x6D, 0x51, 0x48, 0x74, 0x4A, 0xE1, 0xA7, 0x77, 0x07,
+ 0x09, 0xA3, 0x30, 0x0B, 0x48, 0x4F, 0x64, 0xB1, 0x84, 0x91, 0xFF, 0x81, 0xFF, 0x5C, 0x94, 0x08,
+ 0x44, 0xA8, 0xD6, 0x80, 0x5B, 0x26, 0xF7, 0x5A, 0xDC, 0xF0, 0xC1, 0x6D, 0xED, 0xAF, 0xC3, 0x8D,
+ 0xFA, 0x54, 0xE4, 0xB1, 0x8F, 0x03, 0x45, 0x01, 0x63, 0x72, 0x17, 0x81, 0x21, 0x1D, 0x1E, 0xF3,
+ 0x19, 0x2A, 0xD2, 0x43, 0x4C, 0x6E, 0xC8, 0x83, 0x13, 0x13, 0x4A, 0x00, 0x7E, 0xEF, 0x2D, 0x06,
+ 0x07, 0x40, 0x81, 0x0A, 0xC3, 0xE8, 0x13, 0xF6, 0xDC, 0xD7, 0x2C, 0xEB, 0xEC, 0x7C, 0xF9, 0x7B,
+ 0xC9, 0xD1, 0x79, 0x3A, 0x18, 0x74, 0xFF, 0xE8, 0xB3, 0xAC, 0x06, 0xDC, 0x68, 0x07, 0x35, 0x0A,
+ 0x45, 0x67, 0x5B, 0xC8, 0x1C, 0x3D, 0x4F, 0x77, 0xCD, 0x1D, 0xEF, 0x2E, 0xBD, 0xA7, 0x2E, 0xD4,
+ 0xD7, 0x2E, 0x32, 0xEC, 0x89, 0x42, 0x46, 0x4B, 0x68, 0x60, 0x86, 0x72, 0xA9, 0x9B, 0xC3, 0x36,
+ 0xDE, 0x00, 0xBF, 0xCF, 0x4A, 0xFD, 0x2C, 0x98, 0xEE, 0x98, 0x6F, 0xD7, 0xA7, 0x7B, 0xE4, 0xDA,
+ 0xF6, 0xE2, 0x6E, 0x33, 0x29, 0x7F, 0x7E, 0xA0, 0xE9, 0x6A, 0x07, 0x69, 0xA8, 0xF3, 0x65, 0xC6,
+ 0x8F, 0x9D, 0x43, 0x88, 0xDB, 0xF9, 0x7A, 0x81, 0x7C, 0x8F, 0xF0, 0x99, 0xC7, 0x4A, 0x30, 0xC0,
+ 0x5C, 0x15, 0x21, 0x00, 0xC7, 0x19, 0x23, 0x48, 0xD7, 0x4E, 0x64, 0x8C, 0xA4, 0x26, 0x94, 0x80,
+ 0x24, 0xC1, 0xC1, 0x87, 0xC9, 0x55, 0x51, 0x90, 0x7F, 0x9A, 0xDB, 0x2A, 0x7E, 0x56, 0xCA, 0xE1,
+ 0xDF, 0x81, 0xD9, 0x8B, 0x78, 0xAB, 0x7C, 0x65, 0x04, 0x69, 0x49, 0x6C, 0x42, 0x8D, 0x48, 0x24,
+ 0x1C, 0xB7, 0x8A, 0x58, 0xAA, 0x18, 0x8E, 0xF3, 0xD1, 0x73, 0xB2, 0x20, 0xD9, 0x46, 0x0C, 0x5A,
+ 0xBE, 0x76, 0x2E, 0x86, 0x9F, 0xD5, 0x15, 0xA9, 0x7C, 0x24, 0x09, 0x05, 0x0F, 0xF0, 0x3E, 0xB9,
+ 0x9A, 0x12, 0x1A, 0xDC, 0x41, 0x5A, 0x9F, 0x50, 0x3C, 0x76, 0xE5, 0x21, 0x98, 0x33, 0x1A, 0xA1,
+ 0x90, 0x2C, 0xF0, 0x22, 0x1A, 0x3D, 0x20, 0x24, 0xC4, 0x96, 0xC9, 0x13, 0xD5, 0x8D, 0x81, 0x89,
+ 0xA1, 0x61, 0x88, 0xAA, 0xEC, 0x8C, 0xDC, 0x31, 0x7E, 0x3A, 0xFD, 0x6A, 0xBF, 0x8F, 0x97, 0x03,
+ 0x67, 0x58, 0x31, 0xD3, 0x2D, 0x63, 0xFC, 0x67, 0x8D, 0x14, 0xC3, 0xEB, 0xB7, 0xF8, 0x3E, 0x85,
+ 0xD3, 0x8F, 0x9E, 0xD7, 0xB4, 0x86, 0x3C, 0xDB, 0xD2, 0x5F, 0x0D, 0xD2, 0xB2, 0xD1, 0xFC, 0xA5,
+ 0x95, 0x4E, 0x80, 0x9E, 0x4E, 0x8D, 0x93, 0xAD, 0xB3, 0xCA, 0x8A, 0xE0, 0xBC, 0x54, 0x7F, 0xD6,
+ 0xB1, 0x74, 0xC0, 0xE8, 0x4A, 0xF5, 0xC7, 0x72, 0xA7, 0xB7, 0x42, 0x4D, 0xD9, 0x60, 0x15, 0xEB,
+ 0xB6, 0x29, 0x02, 0x1F, 0x83, 0x78, 0x58, 0x09, 0x9E, 0x50, 0xA3, 0x39, 0xC6, 0x22, 0x1E, 0xD1,
+ 0xE6, 0xB9, 0x5A, 0xA3, 0x6F, 0x80, 0x43, 0xA9, 0x58, 0x0B, 0x8C, 0x60, 0xF4, 0xC2, 0xD2, 0x0F,
+ 0x9C, 0x78, 0xFE, 0xB1, 0x33, 0x01, 0x67, 0xFF, 0xEC, 0x93, 0xC1, 0x6C, 0x77, 0x04, 0x1E, 0xD7,
+ 0xD2, 0x65, 0xDD, 0xF5, 0xAF, 0x6D, 0xC2, 0x04, 0x33, 0xF9, 0x38, 0x8F, 0xF3, 0xCF, 0x80, 0x7D,
+ 0x46, 0xFA, 0x53, 0x58, 0x30, 0xA6, 0x0B, 0x47, 0xAE, 0xF0, 0xCB, 0x31, 0xA2, 0xC2, 0xB4, 0xB9,
+ 0xA3, 0x8C, 0xA3, 0xAA, 0x48, 0xF5, 0x0E, 0x8E, 0x45, 0x92, 0x12, 0xFB, 0x17, 0x8F, 0xC3, 0x2C,
+ 0x8D, 0xA7, 0x93, 0x2A, 0xB3, 0x76, 0x7B, 0x8D, 0xE6, 0x66, 0xBF, 0x9A, 0x88, 0x64, 0x91, 0x2C,
+ 0xD5, 0x9D, 0xE6, 0x28, 0xD6, 0x91, 0x48, 0xAC, 0x5D, 0xCB, 0xE1, 0x9B, 0x1E, 0x9C, 0x73, 0xF4,
+ 0xCB, 0x54, 0x3D, 0x72, 0xED, 0xA0, 0xFA, 0x97, 0x00, 0xCB, 0x32, 0x69, 0xCC, 0xB7, 0x00, 0x61,
+ 0xE8, 0x97, 0x78, 0x79, 0xBA, 0x3D, 0x7B, 0x98, 0xA8, 0xBF, 0xA0, 0xF2, 0x3B, 0x23, 0x22, 0x02,
+ 0x10, 0x16, 0xB2, 0x93, 0xE1, 0x74, 0x95, 0x65, 0xE5, 0x5F, 0x53, 0xEC, 0x70, 0x9F, 0x9F, 0xB6,
+ 0xDD, 0x0B, 0xFF, 0xB4, 0x48, 0x34, 0x1F, 0xA1, 0xF6, 0xBF, 0x61, 0x36, 0x4B, 0xF2, 0xCD, 0xE4,
+ 0xD6, 0x88, 0x08, 0x4A, 0x17, 0xE9, 0x33, 0xC6, 0xCA, 0x44, 0xD6, 0x00, 0xA1, 0x6D, 0x2C, 0xFD,
+ 0x09, 0x80, 0x51, 0xB8, 0xDC, 0xA1, 0xF9, 0x7D, 0x55, 0x87, 0xE1, 0x52, 0x66, 0xF3, 0xA5, 0xF7,
+ 0x0E, 0x61, 0xFC, 0x7B, 0xA5, 0xC0, 0x26, 0x82, 0x37, 0x7A, 0x2D, 0xBF, 0xEA, 0x0E, 0xBD, 0xF3,
+ 0xCD, 0x50, 0x4C, 0x7E, 0x0F, 0xD2, 0xCC, 0x90, 0x81, 0x25, 0x28, 0xAF, 0xD5, 0x7E, 0x89, 0xA5,
+ 0xA8, 0x18, 0x2C, 0x6B, 0x53, 0x07, 0x51, 0xE5, 0x09, 0x07, 0x3E, 0xCF, 0x58, 0xB8, 0x49, 0xCA,
+ 0xE7, 0xA3, 0x36, 0x88, 0xAD, 0x46, 0xF4, 0x8F, 0xA9, 0x55, 0x53, 0x02, 0xED, 0x8D, 0xFE, 0x50,
+ 0x20, 0xD6, 0x5E, 0xD4, 0xEB, 0x2B, 0x34, 0x3D, 0x04, 0x84, 0x39, 0x20, 0x16, 0xCD, 0xDF, 0x40,
+ 0x06, 0x2E, 0xE1, 0xB7, 0x81, 0x13, 0xE3, 0xC2, 0x94, 0x5A, 0xFF, 0xE4, 0x4D, 0xBC, 0x1A, 0x80,
+ 0x9A, 0x17, 0xBD, 0x1C, 0xD3, 0x2B, 0x3C, 0xDE, 0xE4, 0x77, 0xA6, 0x59, 0x48, 0x5A, 0x1C, 0xE1,
+ 0x81, 0x89, 0xAF, 0x34, 0xBC, 0x2F, 0xC2, 0x69, 0x39, 0x9E, 0xE9, 0xEF, 0x9B, 0x72, 0x56, 0x19,
+ 0x90, 0x5E, 0x54, 0x09, 0xF7, 0x5D, 0xBF, 0x04, 0x4F, 0x4D, 0x9A, 0x0B, 0x93, 0x55, 0x09, 0xDB,
+ 0x63, 0xB1, 0xF3, 0x7C, 0xD8, 0xB0, 0x8A, 0x69, 0x43, 0x1E, 0x11, 0x3B, 0x57, 0x6C, 0x0B, 0x04,
+ 0xC8, 0x38, 0xFF, 0x1F, 0x11, 0x07, 0xF7, 0x05, 0x9E, 0x15, 0x3E, 0xF9, 0x37, 0x34, 0x66, 0x33,
+ 0x0B, 0x33, 0x01, 0xBE, 0x7B, 0xD6, 0xDA, 0x54, 0x38, 0xA9, 0x5B, 0x82, 0x83, 0xCC, 0x91, 0xD4,
+ 0x89, 0xA2, 0x3F, 0x88, 0x46, 0x4A, 0x38, 0xE7, 0x23, 0x03, 0xCB, 0x80, 0x3B, 0xFA, 0xFE, 0xB9,
+ 0x1E, 0xE9, 0x2D, 0x3C, 0x64, 0x60, 0x2D, 0xB6, 0xAC, 0xBA, 0xAB, 0xD6, 0x51, 0x15, 0xB2, 0x1A,
+ 0xB6, 0x98, 0xBB, 0x67, 0x2D, 0x04, 0xBB, 0x78, 0x6D, 0xE5, 0xFB, 0x95, 0x8B, 0xE5, 0xCC, 0xAD,
+ 0xE4, 0x15, 0xBB, 0x5F, 0xF0, 0x56, 0x41, 0x06, 0x4D, 0x21, 0x10, 0x61, 0x3C, 0x63, 0xAC, 0x59,
+ 0x83, 0x2D, 0x4F, 0x0E, 0x52, 0xDB, 0x0A, 0x9D, 0x3B, 0xCB, 0x61, 0xAA, 0x4D, 0x84, 0xB2, 0xC2,
+ 0xFC, 0x7E, 0x67, 0xD3, 0x86, 0x3E, 0x83, 0xF2, 0x6B, 0x1C, 0x8D, 0xD2, 0x6C, 0x55, 0x80, 0x14,
+ 0x54, 0xC9, 0x14, 0x7E, 0x14, 0xD9, 0x2A, 0xEE, 0x53, 0xAE, 0xB8, 0x27, 0xB3, 0x34, 0x02, 0xD2,
+ 0xFE, 0xA3, 0xC8, 0x75, 0x81, 0x6E, 0xC7, 0xCE, 0x83, 0xD5, 0xCB, 0xDF, 0x5C, 0xED, 0xD2, 0x5A,
+ 0xCC, 0xA9, 0x4E, 0xD1, 0x0A, 0x50, 0x0C, 0x9D, 0x84, 0x79, 0x84, 0x6D, 0xA4, 0x41, 0x53, 0x69,
+ 0x0E, 0x6C, 0x7D, 0x19, 0x66, 0x1D, 0x05, 0xCE, 0xF8, 0xBE, 0xCC, 0xF8, 0xC5, 0x22, 0x0B, 0x8A,
+ 0x12, 0xC1, 0xB6, 0xF1, 0x96, 0xC7, 0xEA, 0xDC, 0xAE, 0x8D, 0xE9, 0x4A, 0x88, 0x8B, 0xC0, 0xA9,
+ 0xBD, 0xE7, 0xA4, 0x61, 0x3C, 0xE7, 0x8A, 0xB5, 0x60, 0x5C, 0xA3, 0x02, 0x63, 0x6A, 0x3D, 0xE3,
+ 0xBB, 0x25, 0x62, 0xA6, 0xC1, 0xFA, 0x37, 0x10, 0x51, 0x24, 0x85, 0x7A, 0x2F, 0x03, 0x07, 0x35,
+ 0x0E, 0xDF, 0xFE, 0xA1, 0x81, 0x06, 0xCC, 0xC4, 0xBA, 0xFA, 0xE7, 0x92, 0x1E, 0xCA, 0xB2, 0x2C,
+ 0x69, 0x92, 0xAD, 0x10, 0xDF, 0x14, 0xBA, 0xC0, 0xD1, 0xE0, 0x80, 0x56, 0x63, 0xF7, 0x02, 0x63,
+ 0x9B, 0x2C, 0xEA, 0xE6, 0x07, 0x14, 0x77, 0x30, 0xD9, 0x9A, 0xA5, 0xEF, 0xE8, 0xF1, 0x69, 0xA9,
+ 0x8B, 0x74, 0xD6, 0xCB, 0x4A, 0xAB, 0x3E, 0xD0, 0x05, 0xCF, 0xC7, 0xCB, 0x5F, 0x77, 0x61, 0x0B,
+ 0xF3, 0xEF, 0x84, 0x42, 0x63, 0x1A, 0x08, 0x90, 0x38, 0xCC, 0xCC, 0x77, 0x73, 0xF4, 0x10, 0x16,
+ 0x3B, 0x88, 0x6A, 0x36, 0x7F, 0x3D, 0x1B, 0x47, 0xA8, 0x43, 0x13, 0xDE, 0x0F, 0x3E, 0xF8, 0x32,
+ 0xEB, 0xE0, 0x13, 0x3F, 0xE9, 0x45, 0x64, 0x17, 0xAD, 0x1D, 0x94, 0x00, 0x89, 0x5B, 0xDD, 0x1B,
+ 0xD8, 0xCC, 0x3C, 0x2A, 0x48, 0xB3, 0xF8, 0xB8, 0xF1, 0xC1, 0x3D, 0x36, 0x45, 0xB6, 0xDC, 0x29,
+ 0x47, 0x8F, 0x1D, 0x5B, 0x3C, 0x11, 0xF1, 0xEC, 0xA0, 0xB6, 0x74, 0xBF, 0xF0, 0x55, 0xC6, 0x52,
+ 0x65, 0x24, 0x6E, 0x75, 0xE5, 0xC0, 0x3D, 0xE1, 0x34, 0x50, 0xB2, 0xB1, 0xD2, 0xC4, 0x69, 0xAB,
+ 0x31, 0xB5, 0xFD, 0x10, 0xAD, 0x10, 0x00, 0x18, 0x87, 0x0B, 0x63, 0xEC, 0x74, 0x72, 0x07, 0xCC,
+ 0x6B, 0xD8, 0x46, 0x69, 0x4A, 0x3A, 0xD1, 0x2B, 0x25, 0x6C, 0xF7, 0x45, 0x84, 0x1D, 0x97, 0x63,
+ 0x70, 0x68, 0xF4, 0x8B, 0x33, 0x4A, 0xE5, 0x16, 0x81, 0xD2, 0x50, 0x2B, 0xD8, 0x51, 0xEC, 0x33,
+ 0xDB, 0xC8, 0xC0, 0x50, 0xE3, 0xF0, 0x1B, 0x57, 0xFC, 0xC9, 0x7D, 0x7A, 0xC4, 0xA4, 0xF3, 0x39,
+ 0x73, 0xAB, 0xAE, 0x42, 0x71, 0x4B, 0xF0, 0xD1, 0xAD, 0xF4, 0x67, 0x3A, 0x9E, 0xFD, 0xA9, 0xA7,
+ 0x22, 0xF9, 0x06, 0x93, 0xEE, 0xBA, 0x96, 0xB4, 0x31, 0x69, 0x41, 0x8A, 0x6D, 0x8D, 0x7C, 0xBA,
+ 0x03, 0xBB, 0x56, 0x91, 0xAA, 0x63, 0x58, 0xC0, 0x99, 0x61, 0xF8, 0x83, 0x65, 0x9D, 0x0B, 0x95,
+ 0x64, 0x6D, 0xD6, 0x24, 0x9D, 0x52, 0x6F, 0x4A, 0x46, 0xDD, 0x77, 0x09, 0x10, 0x4B, 0x4F, 0x94,
+ 0x82, 0x3E, 0xA6, 0xB4, 0x48, 0xE9, 0x9D, 0x5E, 0x8D, 0x79, 0x36, 0xDD, 0x4A, 0xF4, 0x23, 0x79,
+ 0x10, 0x38, 0xF4, 0x4D, 0x53, 0xA4, 0xB9, 0xD1, 0xC3, 0xF3, 0x79, 0x31, 0xC3, 0x63, 0xBD, 0x71,
+ 0x0B, 0x6A, 0x0C, 0x5F, 0x08, 0x6E, 0xB5, 0x36, 0x89, 0x03, 0x16, 0x5D, 0x26, 0xCE, 0x9C, 0xBF,
+ 0x8F, 0x7E, 0x8D, 0x9A, 0x0B, 0x01, 0x77, 0xD1, 0x94, 0xA9, 0x39, 0x04, 0x20, 0x02, 0xF0, 0x90,
+ 0x4A, 0x89, 0xF0, 0x6F, 0x22, 0xD9, 0xC5, 0x05, 0xDD, 0x2A, 0xB7, 0xDA, 0x78, 0x9A, 0x2C, 0xEB,
+ 0xA0, 0x43, 0xE8, 0xAB, 0x82, 0xA4, 0xF2, 0x5F, 0xA2, 0xFA, 0xC3, 0x30, 0x3E, 0x75, 0xCE, 0x2A,
+ 0xFC, 0x5B, 0x46, 0x87, 0x94, 0xC8, 0x6E, 0x3A, 0x97, 0x07, 0x31, 0x1D, 0x80, 0xE0, 0xD8, 0xC7,
+ 0x80, 0x43, 0x47, 0xC5, 0xA3, 0xBD, 0xFA, 0x47, 0x6B, 0x09, 0x21, 0xF8, 0x2D, 0xA0, 0xFE, 0x41,
+ 0x78, 0xC1, 0x44, 0x54, 0xE5, 0xAD, 0x1E, 0xCF, 0x9B, 0x67, 0xED, 0x27, 0x5C, 0x76, 0x1A, 0x16,
+ 0x08, 0x8A, 0x70, 0x7D, 0x74, 0x93, 0x0B, 0x01, 0x7A, 0x3E, 0x5E, 0x15, 0xBD, 0x4B, 0xFC, 0x29,
+ 0x34, 0x11, 0x43, 0x95, 0x0F, 0xE7, 0x50, 0xCC, 0xAD, 0xE3, 0xD4, 0x1F, 0x53, 0x5B, 0x85, 0x52,
+ 0x72, 0x3C, 0x65, 0x2F, 0xFA, 0x34, 0xD7, 0x1C, 0xAF, 0x81, 0x74, 0x7F, 0xCD, 0x2C, 0x14, 0x08,
+ 0xD6, 0x72, 0xA6, 0xBF, 0x7F, 0x5B, 0x23, 0x74, 0x55, 0xFD, 0xBF, 0x58, 0x4C, 0x1F, 0x26, 0x4C,
+ 0x77, 0xDA, 0x0B, 0x11, 0xDD, 0x11, 0x99, 0x10, 0xB6, 0x9A, 0xE5, 0x77, 0xA5, 0x63, 0x81, 0xF7,
+ 0x2B, 0x9D, 0x8E, 0xD1, 0xFE, 0xF8, 0x8D, 0x8E, 0x24, 0x12, 0x5B, 0x7D, 0x3A, 0xDD, 0x49, 0xAD,
+ 0x06, 0xEE, 0x1F, 0x8C, 0x95, 0x9A, 0x8F, 0x2C, 0xEF, 0xF5, 0x85, 0x61, 0xAF, 0x09, 0xB0, 0x27,
+ 0x16, 0x48, 0xC6, 0x37, 0x2D, 0x0A, 0x17, 0xC4, 0xDA, 0x53, 0x51, 0xEB, 0x42, 0x95, 0xCA, 0x14,
+ 0x32, 0x93, 0x5B, 0x40, 0x92, 0x08, 0x6A, 0xE9, 0xB3, 0x66, 0x9D, 0xE0, 0x81, 0x57, 0x9A, 0x38,
+ 0x4A, 0x23, 0xFE, 0x8F, 0x02, 0x65, 0x33, 0x35, 0x55, 0xB8, 0xB2, 0x34, 0x9D, 0xD2, 0xDC, 0xD7,
+ 0xF4, 0x19, 0x1D, 0x83, 0x2A, 0x91, 0xF0, 0x84, 0xD6, 0x7F, 0x45, 0x63, 0x6E, 0x4F, 0x0E, 0x7E,
+ 0x59, 0xBC, 0x22, 0x92, 0xD4, 0xC5, 0xCF, 0xE8, 0xED, 0x15, 0x8C, 0xB5, 0xAA, 0x43, 0x17, 0xE0,
+ 0x46, 0x04, 0x7A, 0x80, 0x15, 0x0A, 0x40, 0xE8, 0x6E, 0x4E, 0x53, 0x10, 0x7E, 0xB1, 0x71, 0x43,
+ 0x20, 0x14, 0xA3, 0xF5, 0xD2, 0x04, 0x37, 0x90, 0xA8, 0xBF, 0x4C, 0x4E, 0x1E, 0xB7, 0xCE, 0x0F,
+ 0x0C, 0xD1, 0x82, 0x64, 0x4B, 0x79, 0x47, 0x12, 0xE6, 0x7A, 0x4E, 0xC1, 0xAD, 0xFD, 0xFE, 0x31,
+ 0x09, 0x36, 0x41, 0x24, 0x0A, 0xCF, 0x20, 0x0C, 0xC3, 0x04, 0x57, 0x39, 0xDD, 0x9C, 0x3E, 0x2E,
+ 0xED, 0xAD, 0x96, 0x20, 0xBD, 0xC6, 0xB7, 0x18, 0xEC, 0x03, 0x2E, 0xFC, 0x45, 0x93, 0xD2, 0x09,
+ 0x13, 0xAE, 0xB8, 0x22, 0xFB, 0x4B, 0xB4, 0x7D, 0x0F, 0x5E, 0x9F, 0xE1, 0xFB, 0x94, 0xA4, 0xC7,
+ 0x07, 0x9E, 0x72, 0x48, 0x7F, 0xEC, 0xC5, 0x0A, 0x19, 0xD5, 0x54, 0x2B, 0x77, 0x16, 0x0A, 0xDC,
+ 0x22, 0xC7, 0x03, 0x12, 0x9E, 0x11, 0xAC, 0x70, 0x44, 0x1D, 0xA4, 0xC5, 0xE2, 0x19, 0x9B, 0xE3,
+ 0xDC, 0x05, 0x36, 0x30, 0x92, 0xCC, 0xC3, 0xF7, 0xCF, 0xD5, 0x67, 0x3C, 0xF7, 0x99, 0x37, 0x16,
+ 0xB3, 0x38, 0x38, 0xEE, 0x66, 0x7C, 0x80, 0xFD, 0x02, 0x94, 0xFA, 0x1F, 0x10, 0xD9, 0xA8, 0x45,
+ 0x58, 0x91, 0x85, 0xDA, 0x1F, 0xF2, 0x6B, 0xE3, 0x8F, 0x09, 0xB8, 0xA1, 0x17, 0xA2, 0xF0, 0x75,
+ 0x5B, 0x5D, 0xEC, 0x39, 0x86, 0x0C, 0x88, 0xAE, 0xF6, 0x99, 0x7F, 0x55, 0x70, 0x52, 0xF0, 0x63,
+ 0x66, 0x75, 0x80, 0xF4, 0x87, 0x13, 0x01, 0x26, 0x82, 0x39, 0xE3, 0x2F, 0xE2, 0x5F, 0xCF, 0xFC,
+ 0x22, 0x28, 0xE9, 0x75, 0x8F, 0xCD, 0x7A, 0x03, 0x77, 0xB0, 0x4E, 0x19, 0x03, 0x73, 0x2B, 0xFB,
+ 0x87, 0xF4, 0x94, 0x18, 0xF8, 0xF7, 0xCB, 0x94, 0x7C, 0xB9, 0x54, 0xD5, 0xED, 0xC5, 0x47, 0x3B,
+ 0x12, 0xA1, 0x65, 0x05, 0x39, 0x45, 0x5A, 0x51, 0x75, 0x3B, 0xC8, 0x84, 0x6F, 0x1F, 0x5D, 0x6C,
+ 0x7E, 0xBE, 0xE2, 0x42, 0x1A, 0xD8, 0x74, 0x0D, 0x17, 0x62, 0x9B, 0xBE, 0xDF, 0x55, 0x15, 0x50,
+ 0xC4, 0xDF, 0x95, 0x92, 0x9D, 0xCD, 0xA2, 0x3F, 0x38, 0x5C, 0x09, 0x51, 0xBB, 0xF4, 0xD8, 0xE9,
+ 0xEF, 0xB0, 0x88, 0x0C, 0x92, 0x7F, 0xCB, 0x01, 0x91, 0x13, 0x7A, 0x44, 0xA1, 0x98, 0x2E, 0x0E,
+ 0x12, 0x63, 0xA7, 0xBC, 0xD3, 0x0C, 0x07, 0xE0, 0xD4, 0x72, 0xF5, 0x45, 0xCE, 0x44, 0x4D, 0xF8,
+ 0x76, 0xF9, 0x1A, 0x1C, 0xF5, 0x80, 0xB2, 0x93, 0x23, 0x93, 0x9B, 0xEE, 0x99, 0x35, 0xE4, 0xBB,
+ 0xE9, 0x4D, 0x72, 0xFC, 0xA0, 0xE6, 0x7B, 0x27, 0x67, 0x11, 0x88, 0x9B, 0xAA, 0x38, 0x8D, 0x6C,
+ 0x33, 0x52, 0x5D, 0xD6, 0x22, 0xF4, 0xBC, 0xD1, 0xCD, 0x9C, 0x74, 0x3A, 0xEA, 0x2B, 0xB0, 0x20,
+ 0x2E, 0xAA, 0x75, 0xF2, 0xD6, 0xDA, 0xFB, 0x93, 0xDB, 0x71, 0xB6, 0x07, 0xD9, 0x85, 0xCA, 0xBB,
+ 0x45, 0x97, 0x00, 0x42, 0xA8, 0xD1, 0xA3, 0x44, 0x13, 0x66, 0xAF, 0x0A, 0xA0, 0xEB, 0x2F, 0xA3,
+ 0x27, 0x64, 0x78, 0x46, 0x9C, 0xE4, 0x99, 0xA5, 0x47, 0x96, 0xC1, 0xD1, 0x99, 0x5C, 0x9A, 0x6A,
+ 0xBA, 0x5E, 0xC6, 0xBA, 0xEB, 0x63, 0x19, 0x6F, 0xC9, 0xDB, 0x36, 0xD8, 0xAD, 0x58, 0x44, 0x30,
+ 0x8F, 0x59, 0x19, 0x42, 0xAF, 0x6A, 0x1B, 0x8A, 0xC9, 0xA2, 0xAE, 0x00, 0x5D, 0x5A, 0x09, 0x33,
+ 0xAC, 0x02, 0xDA, 0x64, 0xAF, 0xDD, 0xDF, 0x15, 0x2A, 0xA2, 0xD2, 0xA1, 0xA6, 0x93, 0x5C, 0xE1,
+ 0x10, 0xC3, 0x6A, 0x10, 0xA5, 0x97, 0x2D, 0x6D, 0xD9, 0xA9, 0xB5, 0x36, 0x71, 0x54, 0xC4, 0xEF,
+ 0xC8, 0xC6, 0x17, 0x30, 0xDD, 0xCF, 0x96, 0x86, 0xC8, 0x63, 0x60, 0x21, 0xAB, 0x3D, 0xBA, 0x40,
+ 0x8F, 0x30, 0x16, 0xBE, 0xD9, 0xDF, 0x7E, 0x13, 0xCB, 0xBF, 0xF7, 0x0E, 0x33, 0x31, 0x18, 0xED,
+ 0x1E, 0x47, 0xD8, 0xF2, 0xCF, 0x42, 0xC8, 0xF3, 0x2C, 0x20, 0x00, 0xB1, 0x8F, 0xB9, 0x1F, 0xEA,
+ 0x82, 0x11, 0x03, 0x8D, 0xB5, 0x25, 0xB4, 0x84, 0x79, 0x97, 0xDC, 0x56, 0x3C, 0x8B, 0x41, 0x9A,
+ 0x01, 0x63, 0x7A, 0xF7, 0x66, 0x0F, 0x05, 0xF7, 0x4A, 0xDC, 0x05, 0x03, 0x29, 0x5C, 0xF1, 0x89,
+ 0x8D, 0x38, 0x19, 0x48, 0x38, 0xBE, 0x82, 0xCD, 0x04, 0x16, 0xEC, 0xD6, 0x68, 0xB8, 0x00, 0x3D,
+ 0xC6, 0x6E, 0xDA, 0x10, 0x0F, 0x12, 0x19, 0x18, 0xAE, 0x24, 0x29, 0x2E, 0xD1, 0x5D, 0xD3, 0xA2,
+ 0x7A, 0x8A, 0x10, 0x20, 0xB5, 0x8A, 0xD4, 0x41, 0x66, 0x8E, 0x00, 0x9E, 0x29, 0x11, 0x3A, 0xBD,
+ 0xEA, 0x66, 0xA6, 0x18, 0x87, 0xD3, 0xEE, 0x0F, 0x17, 0xE5, 0x5B, 0xB9, 0x16, 0x56, 0x22, 0xDD,
+ 0x9C, 0xB6, 0x02, 0xBD, 0x6C, 0x19, 0xBA, 0x85, 0x1F, 0x44, 0xB7, 0x88, 0x43, 0x45, 0xBE, 0x29,
+ 0x65, 0xA2, 0xBE, 0xC1, 0x4E, 0xCF, 0x25, 0x53, 0xD6, 0xC2, 0x53, 0x59, 0xF9, 0xA3, 0xC3, 0x52,
+ 0x9C, 0xEE, 0xE0, 0x92, 0x39, 0x20, 0x97, 0xA0, 0xF7, 0x8C, 0x58, 0x8B, 0x7A, 0xEA, 0x05, 0x7B,
+ 0x6B, 0x92, 0x65, 0xAC, 0x63, 0x9C, 0x11, 0x06, 0xB5, 0x2F, 0xC2, 0x5D, 0x97, 0x55, 0x88, 0x25,
+ 0x3C, 0x37, 0xE8, 0x8D, 0xBE, 0xB2, 0x3C, 0xFB, 0xC5, 0x0D, 0xD9, 0x6B, 0xA6, 0x7F, 0xD4, 0xD7,
+ 0xB9, 0xB8, 0x56, 0xC3, 0x9B, 0xA0, 0x75, 0x7B, 0x3D, 0x5D, 0xF4, 0x53, 0xED, 0xF7, 0xBF, 0xA7,
+ 0xD9, 0xD8, 0x0C, 0x14, 0x4F, 0xD6, 0xA4, 0xAC, 0xB3, 0x33, 0x44, 0x62, 0x04, 0x52, 0xB4, 0xA2,
+ 0xE3, 0x1E, 0x46, 0x73, 0x78, 0x92, 0x66, 0x24, 0xEB, 0x43, 0x46, 0xEC, 0x6C, 0x1D, 0x7B, 0xA1,
+ 0x0B, 0x55, 0xCB, 0xA1, 0xF7, 0x7F, 0xCA, 0x78, 0x46, 0x22, 0x8F, 0xD7, 0xB2, 0x42, 0x86, 0x4A,
+ 0xE9, 0xCC, 0xFC, 0x77, 0x88, 0x84, 0x95, 0x0A, 0x24, 0x8B, 0xB5, 0xC2, 0x66, 0x6B, 0xA3, 0x91,
+ 0x47, 0xFD, 0x5B, 0x87, 0x9B, 0xE0, 0xBF, 0xB0, 0x49, 0x38, 0xD9, 0x6D, 0x05, 0x7A, 0x53, 0xFF,
+ 0xDC, 0xE8, 0x9C, 0xB9, 0xAF, 0x59, 0xFD, 0xE5, 0xD4, 0xE3, 0x3A, 0x58, 0xCD, 0xA7, 0x9C, 0x6F,
+ 0xE0, 0x19, 0x17, 0xB4, 0x14, 0xFD, 0x16, 0xD5, 0x39, 0x77, 0x8F, 0xCE, 0x7F, 0xC0, 0xF1, 0x5F,
+ 0xE1, 0x69, 0x26, 0x89, 0x4C, 0x43, 0xCA, 0xD7, 0x37, 0x51, 0x12, 0x6B, 0x45, 0x3D, 0x8B, 0xD9,
+ 0xD7, 0x8B, 0xDB, 0x22, 0x33, 0x79, 0x34, 0x56, 0xE7, 0xDC, 0x00, 0xBD, 0xD1, 0x98, 0x52, 0xAC,
+ 0x1D, 0x47, 0x69, 0xFF, 0x88, 0xBF, 0x15, 0x3F, 0x7D, 0xDF, 0x12, 0x26, 0xF7, 0x1F, 0xBD, 0xD4,
+ 0x13, 0x52, 0x86, 0xB5, 0x2F, 0x4F, 0x0F, 0xD2, 0x44, 0x6A, 0xB7, 0x71, 0x67, 0x69, 0x2E, 0x76,
+ 0x56, 0x82, 0xFA, 0x88, 0x8B, 0xE2, 0x80, 0x45, 0x31, 0x4E, 0xE8, 0xEF, 0xFC, 0x48, 0xEA, 0x2E,
+ 0x10, 0x9C, 0x73, 0x12, 0x89, 0xA6, 0x17, 0x3A, 0xFE, 0x2E, 0x4C, 0x33, 0x97, 0x54, 0x3C, 0x8D,
+ 0x0F, 0xAC, 0xA5, 0xD0, 0x71, 0x62, 0x73, 0x97, 0xF8, 0xED, 0xD5, 0xCF, 0xC5, 0x18, 0x67, 0x1A,
+ 0x1C, 0xE2, 0xA6, 0x2E, 0xD1, 0x51, 0x74, 0x57, 0xD3, 0xE8, 0x6E, 0x60, 0x00, 0x96, 0x2D, 0x3E,
+ 0x7F, 0xD3, 0x05, 0xB0, 0x22, 0xC2, 0x0F, 0xF4, 0x69, 0x73, 0xAF, 0xC2, 0x02, 0x22, 0x40, 0xF9,
+ 0x6F, 0x35, 0x13, 0x04, 0xA4, 0x48, 0xD3, 0xE7, 0xEE, 0x88, 0xC4, 0x03, 0xD5, 0x0D, 0x90, 0x48,
+ 0x97, 0x8A, 0x9D, 0x12, 0x02, 0xE9, 0x04, 0xD4, 0x2A, 0xA6, 0x13, 0xF6, 0x04, 0x3C, 0x76, 0x0D,
+ 0x37, 0xBB, 0xF5, 0x8A, 0x12, 0x04, 0x3A, 0xFE, 0xAC, 0xA7, 0x8D, 0xB8, 0x6E, 0xC4, 0xA5, 0x26,
+ 0x84, 0xFF, 0xEA, 0x81, 0x8D, 0x33, 0x2D, 0xF0, 0x9D, 0x0B, 0xFB, 0x04, 0x7B, 0x46, 0x71, 0x57,
+ 0xA0, 0x24, 0xD9, 0xF6, 0x8A, 0x44, 0x16, 0xE1, 0x7F, 0x28, 0xD2, 0xC5, 0xC2, 0xEF, 0x8D, 0xA9,
+ 0x63, 0x8B, 0x6B, 0x98, 0x50, 0x1A, 0xB4, 0x66, 0xFB, 0xCD, 0x3D, 0x1E, 0x79, 0x86, 0x22, 0xA3,
+ 0xB3, 0x78, 0xBF, 0x0D, 0x2E, 0x66, 0x45, 0x0A, 0xA0, 0x58, 0xE9, 0x4D, 0x52, 0x5E, 0x9E, 0x07,
+ 0xAD, 0x05, 0x3D, 0x35, 0x17, 0xA2, 0x65, 0x0C, 0xFE, 0x80, 0x56, 0x81, 0x8C, 0x5D, 0x08, 0x0B,
+ 0x15, 0x75, 0x0E, 0x88, 0x19, 0x34, 0x2D, 0xB7, 0x88, 0x92, 0x6C, 0xC9, 0xF3, 0xDF, 0x19, 0xB6,
+ 0x6D, 0xAB, 0x58, 0x13, 0x6E, 0xCE, 0xC9, 0x9A, 0x07, 0xF9, 0x34, 0x9C, 0x5C, 0x9E, 0x33, 0x8F,
+ 0x11, 0xCA, 0xA5, 0x1D, 0xD4, 0xDA, 0xC7, 0x8C, 0x3B, 0x61, 0xBF, 0x8D, 0xCB, 0x69, 0xFF, 0x36,
+ 0x8E, 0x0C, 0xAD, 0xF4, 0x32, 0xC3, 0x20, 0x57, 0xCE, 0x19, 0xAD, 0x61, 0xB0, 0x2C, 0xB0, 0xCD,
+ 0xA4, 0xBD, 0xE0, 0xFC, 0x73, 0x3F, 0xA6, 0xE9, 0x72, 0x6E, 0xB8, 0x84, 0x2F, 0x6A, 0xE8, 0xAF,
+ 0x58, 0xC6, 0x64, 0xD7, 0xA0, 0x3F, 0x36, 0x63, 0x95, 0x72, 0x06, 0x8B, 0xA7, 0xE5, 0xB4, 0x25,
+ 0xC7, 0xB7, 0xB7, 0xBD, 0xFA, 0xF2, 0xCD, 0x28, 0xDD, 0xC2, 0x80, 0x7B, 0x45, 0xFA, 0x8D, 0xCF,
+ 0xD2, 0x5E, 0xB8, 0x0C, 0xA1, 0x40, 0xC7, 0x40, 0xCB, 0x0D, 0xF4, 0x61, 0xAC, 0x20, 0x45, 0x58,
+ 0xB7, 0x56, 0x2A, 0xE6, 0x2E, 0x64, 0xFF, 0xC3, 0xC7, 0xE1, 0xF6, 0xB3, 0xE8, 0x42, 0x3F, 0xB5,
+ 0x26, 0x4F, 0x49, 0x02, 0x39, 0x91, 0x2C, 0x49, 0x70, 0xDA, 0x87, 0x86, 0xA4, 0x29, 0x36, 0x62,
+ 0xF8, 0x2F, 0xBD, 0xD0, 0xF1, 0x0B, 0xD3, 0xEB, 0x8A, 0x68, 0x13, 0xD6, 0x9C, 0xC8, 0x78, 0x28,
+ 0xBD, 0xAA, 0xDF, 0xEA, 0x72, 0xCD, 0x03, 0x83, 0xE9, 0xBB, 0x3C, 0x6F, 0x75, 0x1F, 0xAF, 0x67,
+ 0x47, 0x5E, 0x01, 0xC1, 0x88, 0xE9, 0x9B, 0xB0, 0xF9, 0x65, 0xF6, 0x8D, 0x79, 0x2A, 0xA9, 0xC9,
+ 0x3C, 0xF3, 0x24, 0x19, 0x22, 0x81, 0x32, 0x9E, 0xBE, 0xFA, 0xB4, 0x53, 0x17, 0x64, 0x02, 0x8C,
+ 0x7C, 0x18, 0x21, 0x01, 0xF2, 0x14, 0xE8, 0x6E, 0xAE, 0x3E, 0xAE, 0x60, 0xB1, 0x4C, 0x51, 0x9B,
+ 0xBA, 0x28, 0x24, 0xA0, 0xB9, 0xFC, 0xEA, 0xE5, 0x9C, 0xA7, 0x18, 0xE2, 0x35, 0x05, 0x07, 0x19,
+ 0xAD, 0xE8, 0x02, 0x71, 0x17, 0x53, 0x20, 0x4A, 0xCD, 0x33, 0xC6, 0xB3, 0x70, 0x9F, 0x46, 0x24,
+ 0xEB, 0xA8, 0x18, 0x24, 0x99, 0xD4, 0x87, 0x16, 0x00, 0xBE, 0xF4, 0x41, 0x6C, 0xBF, 0x45, 0xE3,
+ 0xF7, 0x6F, 0xD1, 0x0A, 0x4A, 0x6A, 0x23, 0x5D, 0x0B, 0xFA, 0xB5, 0x71, 0x97, 0xE2, 0x6B, 0xD3,
+ 0x81, 0xB9, 0x49, 0xBC, 0xC4, 0x3C, 0xB2, 0x0C, 0x15, 0x77, 0x8E, 0x5A, 0xC0, 0x89, 0x5F, 0x9A,
+ 0x93, 0x9A, 0x75, 0xB2, 0xA4, 0xE2, 0x7E, 0x5A, 0x9C, 0x0A, 0x7E, 0x8C, 0xDD, 0x9F, 0x31, 0x10,
+ 0x95, 0x8D, 0x57, 0x0E, 0xB7, 0xDD, 0x8B, 0xE7, 0x39, 0xAC, 0x79, 0x11, 0x51, 0x3C, 0xBB, 0x21,
+ 0x58, 0xD7, 0x23, 0xFA, 0x63, 0xFD, 0x21, 0x85, 0x3F, 0x5F, 0x85, 0xF0, 0x3C, 0xF8, 0xE9, 0x40,
+ 0x72, 0x92, 0x79, 0xCF, 0x21, 0x14, 0xED, 0xAB, 0xB9, 0xC3, 0xCF, 0x10, 0x85, 0x28, 0x3B, 0x81,
+ 0xB6, 0x6E, 0x99, 0x18, 0x7C, 0xD9, 0x36, 0x11, 0x22, 0x6C, 0xF8, 0x83, 0xB2, 0x51, 0xD3, 0xF7,
+ 0x42, 0x37, 0xD4, 0xBA, 0x85, 0xB7, 0x9E, 0x6C, 0x61, 0xB3, 0xDB, 0x6F, 0x79, 0xF2, 0x34, 0xA7,
+ 0x29, 0x3C, 0xE9, 0x2B, 0x2B, 0x0B, 0xF4, 0x5F, 0x47, 0x96, 0x14, 0x36, 0xA4, 0x2F, 0x67, 0x54,
+ 0x77, 0x48, 0x2B, 0x5F, 0x4A, 0x1F, 0xB2, 0xE5, 0xFF, 0x38, 0xE4, 0xE2, 0xAE, 0x76, 0xB1, 0x66,
+ 0x7F, 0x01, 0xE8, 0x31, 0xA4, 0x24, 0xBA, 0x95, 0xAB, 0x0A, 0x9B, 0x1F, 0xC4, 0x04, 0x59, 0x9C,
+ 0x0D, 0xD0, 0x3D, 0x2E, 0x7F, 0xCE, 0xBE, 0xD2, 0x93, 0x2A, 0xB0, 0x95, 0x22, 0xA5, 0xE9, 0xE4,
+ 0xCA, 0xE2, 0x49, 0x15, 0xDF, 0x64, 0x65, 0xE4, 0xE5, 0xC8, 0x65, 0xA3, 0x18, 0x53, 0x36, 0xD4,
+ 0x8B, 0xC7, 0x97, 0xE1, 0x4E, 0xD9, 0x92, 0xE7, 0x4A, 0x01, 0x2F, 0x93, 0xB0, 0x09, 0x40, 0x4E,
+ 0x5A, 0x58, 0x7F, 0x2D, 0xDB, 0x7E, 0xA5, 0xAB, 0x8A, 0xA1, 0xFD, 0x4C, 0x9C, 0x55, 0x0F, 0x47,
+ 0x64, 0x02, 0x80, 0xCB, 0x57, 0x50, 0xEC, 0xFE, 0xB7, 0xDC, 0xD2, 0x21, 0xD7, 0x0B, 0xF5, 0x0F,
+ 0xD3, 0xB2, 0x10, 0xDF, 0x8D, 0x8B, 0x91, 0xE0, 0x9C, 0x44, 0x59, 0x0E, 0x08, 0xF2, 0xAB, 0x94,
+ 0x75, 0xF3, 0x56, 0x96, 0xF0, 0x3E, 0x65, 0xA0, 0xBA, 0x4C, 0x10, 0x20, 0xB7, 0xF4, 0x2E, 0xEC,
+ 0xE2, 0xC4, 0x03, 0x7D, 0xFB, 0xD9, 0x79, 0xCC, 0x88, 0x1F, 0x77, 0xE8, 0x9D, 0x1B, 0x89, 0xCD,
+ 0xBB, 0x3D, 0x63, 0x3D, 0xCC, 0x95, 0x8C, 0xFA, 0x5C, 0x79, 0xC2, 0xE1, 0x83, 0x64, 0xE0, 0xB3,
+ 0x52, 0x38, 0x90, 0x49, 0x2A, 0x02, 0x1A, 0x9F, 0x85, 0xC4, 0x45, 0x59, 0xE2, 0xE1, 0xF6, 0x7B,
+ 0x61, 0xAF, 0x0A, 0xBA, 0xA3, 0x8F, 0xA0, 0x2D, 0xEE, 0x7C, 0xBE, 0x54, 0x40, 0x15, 0xB5, 0x87,
+ 0xA1, 0xEF, 0x7E, 0x09, 0x38, 0x51, 0xED, 0x2D, 0xDE, 0xDB, 0x41, 0xC6, 0xEE, 0x88, 0xAD, 0x1F,
+ 0x9C, 0x1C, 0xEC, 0x70, 0x39, 0x38, 0x45, 0xB8, 0x01, 0xB6, 0x58, 0x85, 0x61, 0x48, 0x3A, 0xCB,
+ 0xE9, 0x97, 0xB3, 0x96, 0x8C, 0x0B, 0xD7, 0x33, 0x73, 0x73, 0x7F, 0x1D, 0x85, 0xFF, 0xE9, 0x9E,
+ 0xCE, 0xD1, 0x1E, 0xFD, 0x1B, 0x7A, 0x63, 0x33, 0x10, 0x47, 0x96, 0xBA, 0x0A, 0x8E, 0xF6, 0x4C,
+ 0x70, 0xC1, 0xE1, 0xFD, 0x19, 0x5A, 0xE0, 0x19, 0xE8, 0xD9, 0x0C, 0x31, 0x8E, 0xA7, 0x42, 0x9D,
+ 0x50, 0xB2, 0xC9, 0x20, 0xE8, 0x62, 0xD2, 0x27, 0x67, 0x8E, 0xB6, 0x33, 0x8C, 0xD9, 0x38, 0x85,
+ 0xDC, 0x4D, 0xCF, 0x72, 0xF3, 0xCF, 0xAF, 0xB6, 0x00, 0xF0, 0x54, 0xAE, 0x27, 0xEC, 0x80, 0x28,
+ 0x4B, 0x4B, 0xA8, 0x57, 0x5C, 0xC3, 0xEE, 0x3A, 0x1F, 0x77, 0xAC, 0x9E, 0xA9, 0x11, 0x71, 0x23,
+ 0x5B, 0xFB, 0xF6, 0x80, 0x0E, 0x80, 0xCB, 0xC7, 0xE8, 0x1F, 0x8B, 0x09, 0x45, 0xA0, 0xF6, 0x70,
+ 0xD1, 0x3D, 0x9D, 0x46, 0x00, 0x80, 0x3E, 0x79, 0x1F, 0x4C, 0xF2, 0x4F, 0xCC, 0x8B, 0x9F, 0x63,
+ 0xCC, 0x01, 0x62, 0xD3, 0x30, 0x7D, 0xB1, 0x74, 0xB8, 0xF5, 0xB1, 0x0F, 0x13, 0x57, 0xF7, 0x70,
+ 0x7F, 0x16, 0x6C, 0x27, 0x17, 0x16, 0x49, 0xE6, 0x5F, 0x87, 0xA2, 0x52, 0x0E, 0x9C, 0xF9, 0xA9,
+ 0xEE, 0x91, 0xF0, 0xB1, 0x9C, 0x32, 0x13, 0x67, 0x08, 0xFA, 0x0C, 0x62, 0xBF, 0x11, 0xB2, 0x81,
+ 0x9F, 0xFF, 0xC1, 0x0C, 0xF9, 0x84, 0xBA, 0x85, 0x2E, 0xC2, 0xBC, 0xC0, 0x59, 0x1E, 0x56, 0x62,
+ 0x58, 0x39, 0x38, 0x6B, 0xFC, 0xC5, 0xC4, 0x9A, 0x97, 0xBC, 0x15, 0xA3, 0x2E, 0x90, 0xD2, 0x8E,
+ 0x18, 0xDF, 0x51, 0x39, 0x61, 0x99, 0xE4, 0x2D, 0xA9, 0x50, 0x70, 0x0B, 0x0F, 0x41, 0x20, 0x89,
+ 0x37, 0xFC, 0xE5, 0xD7, 0x3B, 0x57, 0xF5, 0x94, 0x69, 0x4C, 0xEC, 0x56, 0x1B, 0x9B, 0xA3, 0x73,
+ 0xC2, 0x6F, 0xA8, 0xFF, 0xF2, 0xEC, 0xD0, 0xD9, 0x79, 0x9F, 0x39, 0x0B, 0x7C, 0xF2, 0xE2, 0x5E,
+ 0x52, 0x7A, 0xE0, 0x81, 0xE3, 0x54, 0xC6, 0x2D, 0x86, 0x27, 0x8D, 0x04, 0xC3, 0x63, 0x2E, 0x25,
+ 0x6E, 0x05, 0x8F, 0xFB, 0xCA, 0x89, 0x18, 0x4D, 0x9B, 0xB9, 0x20, 0xA1, 0x15, 0xA2, 0x33, 0x56,
+ 0xAB, 0x3F, 0x2D, 0x14, 0x5A, 0x04, 0x5D, 0xBB, 0x7E, 0xE8, 0xF7, 0x4B, 0xD6, 0x49, 0xE8, 0xAF,
+ 0xE5, 0x10, 0x1F, 0x91, 0x68, 0x7C, 0xA0, 0x55, 0x24, 0x75, 0x46, 0xAF, 0xE1, 0xCD, 0x75, 0x0D,
+ 0x36, 0xC7, 0xAB, 0x21, 0xAC, 0xA8, 0x1C, 0xF0, 0x69, 0x6F, 0x38, 0x5E, 0x67, 0x7D, 0x99, 0x72,
+ 0xB9, 0x39, 0xE9, 0xFB, 0xCF, 0xCC, 0x24, 0x8C, 0x63, 0x6B, 0x6D, 0xBD, 0x0C, 0xFF, 0x5A, 0x2D,
+ 0xD0, 0x3F, 0x62, 0xE9, 0xFE, 0xC3, 0x50, 0x18, 0xC1, 0xE9, 0x07, 0xE8, 0xE5, 0x2E, 0xA5, 0x98,
+ 0x53, 0x27, 0x4A, 0x3D, 0xC9, 0xAF, 0x1B, 0x5E, 0x41, 0x4F, 0x67, 0xFE, 0x84, 0xBB, 0x74, 0x0C,
+ 0x6C, 0x88, 0x02, 0xFA, 0x37, 0x6A, 0xAD, 0xBC, 0x08, 0xDB, 0xE8, 0xF2, 0xCD, 0xA4, 0xF0, 0xFC,
+ 0xCC, 0xAD, 0xB5, 0xE7, 0x95, 0x61, 0x93, 0x99, 0xF1, 0xA3, 0x06, 0xCC, 0x01, 0x8D, 0x45, 0x9E,
+ 0xE1, 0xA6, 0x15, 0xDC, 0x4A, 0x99, 0x0F, 0x15, 0x34, 0x1E, 0x7E, 0x4F, 0xE5, 0x42, 0xEC, 0xE9,
+ 0xD3, 0xA3, 0xAD, 0xAB, 0x96, 0x5B, 0x89, 0x94, 0x12, 0xD3, 0xB1, 0x64, 0x69, 0x5B, 0x55, 0xC6,
+ 0x8C, 0x77, 0xD0, 0x9D, 0x0D, 0xF3, 0x36, 0x79, 0x49, 0x50, 0xE9, 0xBC, 0x61, 0x62, 0xFA, 0x67,
+ 0xDE, 0x00, 0x87, 0xC5, 0x95, 0x02, 0xBD, 0xAC, 0x7F, 0x3C, 0x92, 0x49, 0x15, 0xFE, 0xB4, 0x9D,
+ 0x44, 0xD9, 0x19, 0x10, 0x88, 0xDE, 0xBB, 0xC9, 0xE1, 0xEF, 0xC0, 0xD6, 0x60, 0xC7, 0x1D, 0x8B,
+ 0xE8, 0xE3, 0xD1, 0xE8, 0x28, 0x5D, 0xEC, 0x49, 0xEA, 0x79, 0xE4, 0x61, 0x61, 0x7C, 0x81, 0xBF,
+ 0x6D, 0xA1, 0x89, 0x80, 0x63, 0x83, 0x65, 0xF2, 0x5C, 0xF6, 0xBB, 0xAD, 0xD4, 0x3B, 0x2F, 0xFE,
+ 0x6F, 0x0A, 0xD6, 0x6E, 0x2D, 0x6E, 0x34, 0xB9, 0x0B, 0xE2, 0x12, 0x8B, 0x40, 0xFE, 0x0E, 0x24,
+ 0x6C, 0x67, 0xDE, 0x25, 0xCD, 0x48, 0x34, 0x8A, 0x5B, 0x0D, 0x9B, 0xC4, 0xD3, 0x1C, 0xE6, 0x9D,
+ 0x8C, 0x77, 0xB0, 0x2B, 0x0C, 0x77, 0x2C, 0x0D, 0xBE, 0xAD, 0xE1, 0x9D, 0x9F, 0x10, 0x84, 0x34,
+ 0x39, 0x52, 0xB0, 0xB8, 0x1C, 0x02, 0x24, 0x3C, 0xD8, 0x80, 0xD4, 0x40, 0x63, 0x59, 0xE6, 0x6C,
+ 0x0F, 0xFA, 0xEB, 0xAE, 0xDC, 0x67, 0x47, 0x03, 0x25, 0x80, 0xCD, 0x4B, 0x21, 0x77, 0x17, 0xBB,
+ 0x19, 0x8C, 0xC1, 0x09, 0x7E, 0x0F, 0x7D, 0xD7, 0x50, 0xF9, 0xC3, 0xAA, 0x05, 0x10, 0xDD, 0x6B,
+ 0xD2, 0x96, 0x46, 0x14, 0xC2, 0xA5, 0xD7, 0xF8, 0xED, 0xDA, 0x58, 0x53, 0xC3, 0x8F, 0xAB, 0x47,
+ 0x91, 0x95, 0x48, 0x0C, 0xDE, 0xED, 0x99, 0x04, 0x3A, 0xC7, 0xCC, 0xB5, 0x1C, 0xAC, 0x29, 0xAE,
+ 0xFA, 0xA6, 0xA5, 0x57, 0x65, 0x12, 0x86, 0xBE, 0x72, 0xFB, 0x06, 0x93, 0x49, 0xD0, 0x53, 0x43,
+ 0xD0, 0xD4, 0xC7, 0x2F, 0x8A, 0x13, 0xEC, 0x95, 0x3B, 0x18, 0xD3, 0x67, 0x2B, 0xA6, 0xCF, 0x0B,
+ 0xE6, 0x47, 0xF9, 0x3A, 0x32, 0x41, 0x27, 0xC8, 0xDB, 0xD7, 0xC7, 0xED, 0xB7, 0xCF, 0x75, 0xF1,
+ 0x29, 0xC7, 0x28, 0x97, 0x07, 0xBA, 0x74, 0x2C, 0x5A, 0xAE, 0x6E, 0x39, 0x51, 0xF3, 0xD2, 0x07,
+ 0xE2, 0x82, 0xFA, 0xE0, 0xD0, 0x22, 0x6B, 0xC7, 0xDA, 0x90, 0x0D, 0x1B, 0xB5, 0x17, 0x8A, 0xFA,
+ 0x9E, 0xB5, 0x1A, 0xBD, 0x6F, 0x64, 0x02, 0xF5, 0x14, 0xB4, 0x63, 0x64, 0xFB, 0x42, 0x99, 0x42,
+ 0xDE, 0x6A, 0x6C, 0xAB, 0x5B, 0xE5, 0xC4, 0x62, 0x25, 0x66, 0x83, 0xC3, 0x6A, 0x64, 0x4A, 0xD0,
+ 0xA7, 0x4F, 0x66, 0x21, 0xF9, 0x7C, 0xCC, 0x15, 0x5F, 0x69, 0xB3, 0x2E, 0x83, 0x26, 0x12, 0xC7,
+ 0xE0, 0xE4, 0xAE, 0x92, 0x44, 0xA4, 0x1F, 0xEE, 0xBC, 0x06, 0xAF, 0xC4, 0x5A, 0x14, 0x89, 0xCF,
+ 0x46, 0xC2, 0xA8, 0x80, 0x98, 0xF6, 0xCC, 0xA8, 0x7E, 0xDE, 0x94, 0x31, 0x36, 0xBF, 0x80, 0xA9,
+ 0x49, 0x62, 0xF9, 0x4B, 0x09, 0xFF, 0x29, 0xCC, 0xB6, 0x5A, 0x84, 0xBC, 0xCB, 0xF4, 0xBB, 0x19,
+ 0xC1, 0xA7, 0x09, 0x60, 0xF9, 0xD4, 0x0F, 0x84, 0xE0, 0xDF, 0x9A, 0x0D, 0xCC, 0xCA, 0x14, 0x68,
+ 0x39, 0x74, 0x10, 0x63, 0x13, 0xC0, 0xAE, 0xD2, 0x2B, 0x3C, 0x6E, 0xC2, 0x29, 0x51, 0xC9, 0xAF,
+ 0x0E, 0x09, 0x87, 0xAD, 0x82, 0x8A, 0xA6, 0x0F, 0x02, 0x4B, 0xAD, 0x1F, 0x63, 0xEE, 0xAE, 0x57,
+ 0xE0, 0xE5, 0x51, 0xCC, 0x8C, 0x9A, 0x9E, 0x4F, 0x67, 0xFB, 0xD4, 0x9F, 0xA5, 0x18, 0x13, 0x9F,
+ 0x24, 0xF4, 0x9E, 0x2B, 0x52, 0xC0, 0x08, 0xE8, 0x77, 0xEA, 0xBB, 0x01, 0x5A, 0x77, 0x46, 0xEF,
+ 0x10, 0xAC, 0xA4, 0x70, 0x56, 0x98, 0x5A, 0xBF, 0x4A, 0x82, 0x72, 0x96, 0xB9, 0xB1, 0x61, 0x78,
+ 0x6D, 0x6E, 0xAD, 0x66, 0x6C, 0x67, 0xB3, 0x45, 0x8F, 0xF8, 0xFD, 0x1E, 0xAA, 0x7A, 0x13, 0x0C,
+ 0x35, 0x1A, 0x9F, 0x69, 0x5E, 0x13, 0x8A, 0xB5, 0xE7, 0x17, 0x58, 0x7A, 0xF5, 0xB3, 0x06, 0x48,
+ 0x16, 0x55, 0xDC, 0xD8, 0xB7, 0x70, 0x3D, 0xB1, 0x04, 0x13, 0xA1, 0x21, 0x60, 0xF2, 0x15, 0xA8,
+ 0x09, 0x2A, 0xD2, 0xBC, 0x67, 0xAD, 0x23, 0x01, 0x8E, 0x91, 0xE2, 0x4C, 0x73, 0x41, 0xA4, 0x29,
+ 0x9A, 0x09, 0xFD, 0xC6, 0x8C, 0xC2, 0x0D, 0x62, 0xFE, 0x70, 0x53, 0x8B, 0x72, 0x07, 0x26, 0x73,
+ 0xC1, 0xED, 0x07, 0xE0, 0xD3, 0x02, 0x9C, 0x10, 0x30, 0x83, 0x83, 0x50, 0xDA, 0x11, 0x36, 0x8B,
+ 0x22, 0xE6, 0xF3, 0x90, 0xDE, 0x90, 0x87, 0x6F, 0x10, 0x41, 0x3B, 0x6E, 0x41, 0x87, 0x0A, 0x56,
+ 0x27, 0x95, 0xCA, 0xFE, 0xC8, 0xE0, 0x15, 0xD2, 0xEE, 0xB8, 0xBF, 0x35, 0x4F, 0x8B, 0xF3, 0xBA,
+ 0x37, 0x6F, 0x16, 0x61, 0x80, 0x7E, 0x95, 0x50, 0x27, 0x7A, 0x46, 0x0F, 0xBF, 0xDC, 0x74, 0xB1,
+ 0x73, 0xE0, 0x50, 0x86, 0x6F, 0x92, 0xB6, 0x41, 0x5B, 0x2E, 0xE1, 0xCA, 0x8E, 0xDB, 0x8E, 0xEC,
+ 0xD1, 0x8C, 0xF4, 0x74, 0x7C, 0x9C, 0x1E, 0x24, 0x60, 0xF4, 0xD3, 0x5B, 0xA0, 0x3B, 0xE2, 0x5B,
+ 0x17, 0xBB, 0x7D, 0x97, 0x57, 0x2A, 0x09, 0x9A, 0x1D, 0x5C, 0x02, 0x63, 0x4A, 0xC0, 0x0E, 0xA1,
+ 0xA0, 0x96, 0xE5, 0x4D, 0x6D, 0x91, 0x3C, 0x69, 0x59, 0x80, 0x41, 0x7D, 0xF7, 0x53, 0x93, 0x52,
+ 0x58, 0xF9, 0x11, 0x33, 0xFF, 0xDB, 0x7F, 0x26, 0x5E, 0x90, 0x5B, 0xB5, 0x42, 0x16, 0xE0, 0x05,
+ 0x4E, 0x5B, 0x23, 0xAE, 0x35, 0x7D, 0x95, 0x79, 0x4C, 0xD1, 0x77, 0x47, 0x77, 0x9B, 0x63, 0xED,
+ 0x86, 0x6E, 0x6F, 0x76, 0x54, 0x7C, 0x4A, 0x9D, 0x0F, 0xAE, 0xE7, 0x41, 0xBD, 0x20, 0x1F, 0x04,
+ 0xF4, 0xA8, 0x90, 0x48, 0xF7, 0x59, 0xF7, 0x14, 0xCF, 0x1D, 0x18, 0xE5, 0x54, 0x25, 0x4D, 0x87,
+ 0xE4, 0x61, 0x84, 0x7B, 0xB5, 0xCB, 0xF5, 0x70, 0x78, 0x80, 0xF1, 0x52, 0x89, 0x2D, 0xEA, 0x72,
+ 0xB3, 0xE7, 0x7D, 0x24, 0x59, 0xB7, 0x22, 0x49, 0x9F, 0xDA, 0x7D, 0x81, 0x86, 0xAB, 0xD3, 0x80,
+ 0x18, 0x55, 0xF5, 0x21, 0xC6, 0xE4, 0x9E, 0xE5, 0xBB, 0x12, 0x8D, 0x3E, 0xD1, 0xEE, 0x33, 0x56,
+ 0xCF, 0x24, 0x37, 0x65, 0x73, 0x41, 0x63, 0xDD, 0x21, 0x4C, 0x85, 0xA3, 0xB1, 0x74, 0x67, 0xFC,
+ 0x60, 0xC9, 0x14, 0x0D, 0x4F, 0x31, 0x15, 0x87, 0x70, 0xEA, 0x18, 0x9C, 0xE9, 0x13, 0x09, 0x6A,
+ 0xC5, 0xE2, 0x01, 0x08, 0xF3, 0x2A, 0xE0, 0x28, 0x42, 0x1B, 0x80, 0x30, 0xC3, 0x87, 0xF8, 0x31,
+ 0xBC, 0x0C, 0xC7, 0xBA, 0x61, 0x77, 0x85, 0xC7, 0x9B, 0x56, 0x29, 0x48, 0xCF, 0x65, 0x18, 0x05,
+ 0x2F, 0x8E, 0x23, 0x3D, 0xA3, 0x34, 0xB2, 0x17, 0xAB, 0x42, 0xE6, 0x88, 0x8C, 0x96, 0xB5, 0x5F,
+ 0x44, 0x20, 0x47, 0xAB, 0x1F, 0x02, 0xE3, 0xDF, 0xF2, 0xEF, 0xBE, 0x5A, 0xA8, 0x87, 0x98, 0x57,
+ 0xCE, 0x73, 0x75, 0xAE, 0xA1, 0x51, 0x16, 0xEC, 0x5A, 0x0F, 0xFA, 0xF0, 0xC6, 0x80, 0xFE, 0x7F,
+ 0xE4, 0x3B, 0x02, 0x27, 0x9D, 0x75, 0xE3, 0x41, 0x8C, 0x5C, 0x5B, 0x20, 0x40, 0x22, 0xBF, 0x09,
+ 0x79, 0x63, 0xB4, 0xDC, 0x06, 0x44, 0xE4, 0x5B, 0x09, 0x58, 0xC9, 0x51, 0x38, 0x9D, 0x07, 0x10,
+ 0x98, 0x75, 0x6A, 0x3B, 0x87, 0x00, 0x76, 0x9D, 0x6C, 0xE9, 0xB0, 0x94, 0x1E, 0x50, 0x48, 0x26,
+ 0x5E, 0xFB, 0x2D, 0x10, 0x54, 0x8E, 0xA2, 0x50, 0x03, 0xC6, 0x78, 0x55, 0x86, 0x4E, 0xD4, 0x4B,
+ 0xFC, 0x15, 0x61, 0x4C, 0x72, 0xFB, 0xCE, 0x21, 0xC5, 0x89, 0x23, 0x00, 0x16, 0x63, 0x73, 0xAD,
+ 0xB0, 0xE1, 0x94, 0x36, 0x43, 0xFE, 0xA4, 0x37, 0x34, 0x3F, 0xE2, 0xB9, 0x75, 0x2D, 0x95, 0x72,
+ 0x2C, 0xC8, 0x8A, 0xC5, 0x4B, 0x03, 0x8C, 0xA4, 0xE8, 0x79, 0x15, 0x38, 0x24, 0x8D, 0x92, 0x0B,
+ 0x91, 0xA4, 0xF3, 0x94, 0x58, 0x35, 0xD6, 0x6D, 0x14, 0x3E, 0x78, 0x4E, 0x17, 0x21, 0x80, 0x5D,
+ 0x95, 0xF0, 0x73, 0x7E, 0xA2, 0xDA, 0x3D, 0xD4, 0x33, 0xF4, 0x0A, 0x80, 0x4A, 0x5C, 0x83, 0x91,
+ 0x6E, 0xE7, 0x13, 0x73, 0x26, 0x94, 0x17, 0xD4, 0x13, 0xBD, 0x8B, 0x74, 0x25, 0x06, 0x34, 0xA8,
+ 0x98, 0x99, 0x94, 0x1F, 0xC7, 0xDC, 0x3F, 0x36, 0xF8, 0x24, 0x57, 0x1E, 0xB7, 0x9D, 0x29, 0xA4,
+ 0xB6, 0x27, 0x1B, 0x31, 0xF3, 0x21, 0x80, 0x60, 0x51, 0xF1, 0x66, 0x10, 0xBD, 0x15, 0xF5, 0xBB,
+ 0x47, 0x50, 0xCD, 0xC7, 0xEC, 0x05, 0x48, 0xCB, 0x84, 0x70, 0xB0, 0x58, 0x5F, 0x53, 0x2A, 0x2B,
+ 0x02, 0x42, 0x5C, 0x78, 0x1C, 0x7C, 0x56, 0xA2, 0xF2, 0x4B, 0xA0, 0x94, 0x8A, 0x84, 0xB0, 0x2D,
+ 0x9B, 0xF5, 0xA8, 0xC2, 0xE2, 0xE3, 0x20, 0xC5, 0xAE, 0xD6, 0x4F, 0x17, 0xDF, 0x52, 0x47, 0x8E,
+ 0x6F, 0x6D, 0x41, 0xDB, 0x59, 0xF0, 0xC5, 0x9D, 0x6D, 0xBD, 0xA0, 0xC9, 0x9D, 0x72, 0x2D, 0x2E,
+ 0x51, 0x10, 0xAC, 0x37, 0x01, 0xA7, 0xD7, 0x4E, 0xF3, 0x96, 0xD6, 0x79, 0xFD, 0xA0, 0xC4, 0x3F,
+ 0x38, 0x68, 0xA4, 0x19, 0x01, 0xE6, 0x0B, 0x96, 0x32, 0xA3, 0x48, 0x8B, 0x4F, 0x77, 0x56, 0x98,
+ 0xB6, 0x85, 0x73, 0xA9, 0x2B, 0x04, 0xED, 0x2F, 0x13, 0x6A, 0x32, 0x0C, 0xAB, 0x51, 0x54, 0xBE,
+ 0x0B, 0x7F, 0xBD, 0x93, 0x4E, 0xB1, 0xBB, 0xA9, 0xA8, 0xD4, 0x53, 0x64, 0x83, 0x49, 0x63, 0x64,
+ 0x5B, 0xD7, 0xB5, 0x02, 0xDD, 0x13, 0x3F, 0xFD, 0x64, 0xF5, 0xC3, 0x18, 0x97, 0xC7, 0xCF, 0x96,
+ 0x11, 0x63, 0xB3, 0x20, 0x15, 0x81, 0x3D, 0x9A, 0x52, 0x99, 0xF2, 0xBE, 0x76, 0xD1, 0x1F, 0xF6,
+ 0x0E, 0xD3, 0x7C, 0x55, 0x42, 0x55, 0x94, 0x5E, 0x10, 0x96, 0x37, 0x4C, 0x2E, 0xAC, 0x9E, 0x30,
+ 0x40, 0xB9, 0xD0, 0xFC, 0x81, 0xA2, 0x87, 0x34, 0x74, 0x82, 0xA2, 0x88, 0xDD, 0x30, 0x4D, 0x50,
+ 0xA6, 0x0E, 0x0C, 0x50, 0x0C, 0xB7, 0xB6, 0xC2, 0x33, 0x7D, 0x73, 0x8C, 0x66, 0x90, 0xC2, 0x42,
+ 0x87, 0x35, 0xD5, 0x4D, 0xB7, 0xEE, 0x1D, 0x0D, 0xB4, 0xFC, 0xD4, 0x3B, 0xD9, 0xA7, 0xF1, 0x2D,
+ 0x02, 0x16, 0x89, 0x1B, 0x32, 0xB2, 0x4D, 0x38, 0x61, 0x6C, 0xD3, 0x3B, 0x53, 0xBF, 0x1E, 0x46,
+ 0xA8, 0x6B, 0x1A, 0x83, 0xB8, 0x3A, 0x2C, 0xCD, 0x6E, 0xBF, 0xBB, 0xDD, 0x42, 0x71, 0xB9, 0x71,
+ 0x93, 0x4C, 0x3B, 0x24, 0x3B, 0xBD, 0x6A, 0x78, 0x93, 0x42, 0x6B, 0x5A, 0x24, 0xCF, 0x41, 0x10,
+ 0xAD, 0x05, 0x3B, 0x7E, 0x90, 0x2C, 0xA7, 0x9C, 0x6B, 0xB5, 0xE0, 0x5E, 0xB5, 0xA0, 0x3C, 0xCB,
+ 0xD0, 0xCB, 0x48, 0x75, 0xE3, 0x17, 0x86, 0x42, 0x5A, 0xF7, 0x2E, 0x4C, 0x6C, 0xF2, 0x21, 0x37,
+ 0xEE, 0xB4, 0xE5, 0x30, 0x6B, 0xA1, 0x4B, 0x31, 0xDB, 0x8C, 0x86, 0xF9, 0x5C, 0xDA, 0xDA, 0x44,
+ 0x95, 0xEA, 0x26, 0x96, 0xD6, 0x26, 0xAE, 0x23, 0x11, 0xEB, 0x21, 0x34, 0xFF, 0xB2, 0x8C, 0x9E,
+ 0x9B, 0xBD, 0x27, 0xFB, 0x09, 0x0F, 0xE3, 0x50, 0x73, 0x8E, 0xAC, 0xE0, 0x05, 0x22, 0x20, 0xD5,
+ 0xF7, 0x4E, 0x72, 0xD0, 0x4E, 0xF7, 0xC5, 0xC9, 0xE7, 0x25, 0x7F, 0xF9, 0x91, 0x19, 0x68, 0x03,
+ 0x17, 0x04, 0xD2, 0xBA, 0x4D, 0x94, 0xAF, 0x95, 0xBC, 0x81, 0x57, 0xB6, 0xD9, 0x56, 0x8F, 0x67,
+ 0x40, 0x24, 0x6D, 0xEC, 0xD5, 0xD1, 0x1E, 0x2E, 0xFC, 0xE8, 0xBA, 0xAB, 0x80, 0x63, 0x35, 0xC3,
+ 0x38, 0x18, 0x98, 0x71, 0x55, 0xA7, 0xC8, 0x09, 0xAE, 0xA3, 0xA3, 0x37, 0xA3, 0x96, 0xCE, 0x8F,
+ 0x0F, 0x12, 0x53, 0xF5, 0x8E, 0x02, 0xB1, 0xBC, 0x56, 0x1E, 0x67, 0x71, 0xFE, 0xAB, 0xF0, 0x04,
+ 0x5B, 0x87, 0x93, 0x92, 0xB2, 0xAC, 0x47, 0xB6, 0xEF, 0xBD, 0x55, 0x1D, 0x30, 0xCB, 0xA6, 0x60,
+ 0x13, 0x13, 0xFE, 0x82, 0x4E, 0x06, 0xA8, 0xAB, 0x2B, 0x40, 0x2E, 0x7C, 0x66, 0x8F, 0xCC, 0x40,
+ 0x36, 0x20, 0xE9, 0xAF, 0xC6, 0x3A, 0xE2, 0xE2, 0xFE, 0x01, 0x97, 0x7E, 0xCA, 0x82, 0x20, 0x58,
+ 0x5E, 0xB5, 0x10, 0xE1, 0x99, 0xE3, 0x4F, 0x82, 0xE3, 0x4D, 0x35, 0xB6, 0x7B, 0x28, 0x37, 0x02,
+ 0x26, 0x00, 0xA1, 0x6C, 0x7B, 0xA1, 0x48, 0x4F, 0xCB, 0x55, 0x25, 0xB8, 0x6B, 0xDD, 0xB1, 0xAE,
+ 0xA0, 0xD3, 0xA1, 0x8B, 0x84, 0x9E, 0xF2, 0xB8, 0x53, 0xDC, 0xE0, 0xE4, 0x6C, 0x5C, 0x63, 0xA8,
+ 0xD7, 0x4F, 0x1C, 0xB6, 0x73, 0xF9, 0x50, 0xA7, 0x99, 0x30, 0x42, 0x3E, 0x60, 0x49, 0x6A, 0x7F,
+ 0x6F, 0x0A, 0x83, 0xAD, 0x99, 0x90, 0x00, 0xC3, 0x5A, 0xFD, 0x83, 0xDA, 0xDE, 0x0A, 0x37, 0xC0,
+ 0x7F, 0xC6, 0x96, 0x61, 0x9A, 0xF8, 0xBF, 0xBF, 0x45, 0x33, 0x3C, 0x17, 0x48, 0x7B, 0x54, 0xB8,
+ 0x38, 0xAD, 0x88, 0xD7, 0x7C, 0x1B, 0x08, 0x04, 0xA9, 0x88, 0xDD, 0x1A, 0x7B, 0x53, 0xEF, 0x8F,
+ 0x49, 0xBC, 0xBC, 0x64, 0x98, 0x17, 0xA0, 0xB2, 0xAE, 0x63, 0x5B, 0x33, 0xE3, 0xED, 0x93, 0x88,
+ 0x5D, 0xB9, 0x3F, 0xF2, 0x8A, 0xD3, 0x38, 0xD9, 0xD6, 0xC9, 0xFE, 0x13, 0x92, 0x3B, 0xF0, 0xA5,
+ 0xE4, 0x1A, 0x09, 0x28, 0x70, 0x27, 0x1A, 0xB5, 0x99, 0xBA, 0x39, 0x2A, 0xBA, 0x8E, 0xAE, 0x79,
+ 0x6A, 0x21, 0xF7, 0xB7, 0x7D, 0x16, 0x34, 0xA4, 0x5D, 0x0E, 0x97, 0xF5, 0xFC, 0x1A, 0x88, 0xEE,
+ 0x4A, 0x9E, 0xB9, 0x64, 0x2B, 0xFF, 0x89, 0xC2, 0x45, 0x34, 0xE7, 0xC4, 0xE0, 0xFC, 0x9E, 0xF8,
+ 0xF6, 0x89, 0x5E, 0x68, 0x53, 0xEC, 0xF0, 0x98, 0x63, 0x5E, 0x53, 0xA0, 0xBE, 0x42, 0x8E, 0xD9,
+ 0x70, 0x5D, 0x3C, 0xC5, 0x11, 0x11, 0x20, 0xC1, 0x9B, 0xF4, 0x6E, 0x61, 0x63, 0x4A, 0xB3, 0xE7,
+ 0x5F, 0x91, 0xC9, 0x2C, 0xFF, 0x1E, 0xCE, 0x25, 0xFE, 0x26, 0x6A, 0xA4, 0x06, 0xE3, 0x30, 0xCF,
+ 0xFC, 0x9D, 0xE8, 0x0D, 0xFD, 0x41, 0xC6, 0x9F, 0x20, 0x2E, 0xB0, 0x24, 0x9B, 0xA1, 0xB2, 0x30,
+ 0x75, 0x3F, 0xFC, 0x33, 0x68, 0x8E, 0x97, 0x33, 0xE5, 0xFE, 0xF8, 0xEC, 0x28, 0xAC, 0xD4, 0x52,
+ 0xA5, 0x97, 0x23, 0x9B, 0x89, 0xDF, 0x42, 0x38, 0xA2, 0xD9, 0x38, 0x7C, 0x59, 0x58, 0x78, 0x2D,
+ 0x64, 0x3E, 0xAC, 0xA4, 0x2F, 0x30, 0x55, 0xD2, 0xE3, 0x4C, 0x4E, 0xA5, 0xEC, 0x4E, 0x5A, 0xF9,
+ 0xAA, 0xB6, 0xB9, 0xBA, 0xFA, 0x23, 0x41, 0x9D, 0xCA, 0x54, 0xDA, 0x90, 0xDD, 0xC4, 0x68, 0x16,
+ 0x2E, 0x4F, 0xB5, 0xDC, 0x9A, 0x25, 0xBF, 0x8B, 0xC0, 0x79, 0x0D, 0xCF, 0xB7, 0xBE, 0xDE, 0x95,
+ 0x59, 0xF0, 0x28, 0x8A, 0x14, 0xD9, 0x90, 0x66, 0xAA, 0xEB, 0x5F, 0x64, 0x61, 0xD1, 0x7E, 0x4C,
+ 0x45, 0x8E, 0x98, 0x11, 0x7A, 0x84, 0x81, 0x0A, 0xD2, 0xBA, 0x5D, 0x72, 0x09, 0xA0, 0x05, 0x1E,
+ 0x16, 0xD4, 0x4A, 0x91, 0xEE, 0xD8, 0x4A, 0x06, 0x4B, 0x5C, 0xEC, 0x79, 0x28, 0xA3, 0xB3, 0x81,
+ 0x4C, 0x90, 0xF1, 0xB2, 0x29, 0x02, 0x2B, 0xF2, 0x44, 0x9F, 0xD9, 0x6D, 0x66, 0x33, 0x78, 0x73,
+ 0x23, 0x5D, 0x26, 0x2C, 0x86, 0x43, 0x9E, 0x69, 0x0A, 0x97, 0x01, 0x8F, 0x64, 0xDA, 0xF9, 0xCC,
+ 0xC7, 0xA0, 0x59, 0xF0, 0x60, 0xD9, 0x46, 0xAA, 0x77, 0x9F, 0xFC, 0xF3, 0xBA, 0x66, 0xD4, 0xBE,
+ 0x69, 0x9B, 0xAE, 0x3C, 0xB6, 0x57, 0x8A, 0x30, 0x53, 0xEC, 0xC6, 0xF8, 0x14, 0x76, 0x84, 0x76,
+ 0x7F, 0x53, 0xA8, 0x14, 0x8A, 0x55, 0xAE, 0x89, 0xE8, 0x4D, 0x8C, 0x69, 0xC2, 0x56, 0xB7, 0x64,
+ 0x2A, 0x57, 0x9A, 0x76, 0xC5, 0x77, 0x8A, 0xC8, 0x01, 0x29, 0xB6, 0xB2, 0xA9, 0x50, 0x43, 0xCD,
+ 0x22, 0xD0, 0xE8, 0xDE, 0x6B, 0xB9, 0x87, 0x18, 0x70, 0xEF, 0xCB, 0x72, 0xAA, 0x18, 0xB6, 0x42,
+ 0xCE, 0xBD, 0xC4, 0x34, 0x7C, 0x6E, 0xA7, 0x6F, 0x63, 0x29, 0x16, 0x97, 0x3A, 0x19, 0x11, 0xEF,
+ 0xB6, 0x47, 0xF0, 0x01, 0xAA, 0x25, 0x4A, 0x50, 0x67, 0xCC, 0x60, 0xF2, 0x36, 0x06, 0x85, 0x7A,
+ 0x99, 0x50, 0x11, 0x24, 0xDD, 0xA5, 0xC1, 0x1A, 0xA6, 0x76, 0x62, 0xBB, 0xB6, 0x34, 0xB8, 0x90,
+ 0x37, 0x35, 0xAA, 0x96, 0xF3, 0xC5, 0xA2, 0x5E, 0x5D, 0x4F, 0x9C, 0x9F, 0x95, 0x99, 0xEF, 0xDE,
+ 0xCC, 0x89, 0xC5, 0x2E, 0x73, 0xC7, 0xF7, 0xAC, 0xFB, 0x87, 0x95, 0xFE, 0x20, 0x99, 0x2B, 0x62,
+ 0x5D, 0xDC, 0x61, 0x3B, 0x10, 0x7A, 0x5C, 0xF5, 0x09, 0xCB, 0xE0, 0xB1, 0x41, 0xB0, 0x7A, 0x90,
+ 0x49, 0x65, 0x2D, 0x3F, 0x7D, 0x10, 0x6C, 0xDD, 0x5F, 0x04, 0x21, 0x70, 0xCA, 0x13, 0x42, 0x2B,
+ 0x71, 0x30, 0xE9, 0x40, 0x80, 0xB4, 0xDD, 0xBF, 0xDF, 0x0D, 0x11, 0x21, 0xC1, 0xE4, 0x51, 0xC8,
+ 0x48, 0xAC, 0x37, 0xD3, 0xDE, 0x32, 0xBE, 0xCF, 0x61, 0xF6, 0x8A, 0xEB, 0x8C, 0xE1, 0xF7, 0x1D,
+ 0xCD, 0xAA, 0x24, 0x68, 0x4C, 0xA1, 0x33, 0x8A, 0x0B, 0xA5, 0xA4, 0xC6, 0x94, 0xCD, 0x1E, 0x07,
+ 0x62, 0xB9, 0x3B, 0x3E, 0xD6, 0x13, 0x6F, 0x54, 0xD9, 0x93, 0x02, 0xD9, 0x1E, 0x72, 0x9C, 0x6C,
+ 0xC9, 0x97, 0xEF, 0xB6, 0x96, 0xDA, 0x93, 0x7E, 0x8D, 0x4F, 0x88, 0x0B, 0xA4, 0x7E, 0xF9, 0x0A,
+ 0x7E, 0xD3, 0x2D, 0x8D, 0x15, 0xCA, 0xC4, 0x14, 0xDC, 0x0E, 0x1B, 0x93, 0x02, 0xC5, 0x7E, 0x31,
+ 0xC8, 0xCC, 0x59, 0x92, 0x9F, 0x66, 0x43, 0xA5, 0x51, 0xFA, 0x76, 0x92, 0xDE, 0x20, 0xCF, 0x5D,
+ 0x28, 0xAA, 0x4E, 0x80, 0x61, 0x6D, 0xE2, 0x3C, 0xD3, 0xAE, 0x55, 0xEC, 0xD1, 0xC2, 0x30, 0xEA,
+ 0xE3, 0xD7, 0x9D, 0xCE, 0x01, 0x64, 0xD4, 0x85, 0x95, 0xC0, 0x91, 0xBD, 0xB7, 0xAF, 0x78, 0xDB,
+ 0xAC, 0x3C, 0xCF, 0x18, 0xE3, 0x07, 0x6C, 0xD4, 0x85, 0xD9, 0x04, 0xF5, 0xFA, 0x43, 0x1C, 0x27,
+ 0x85, 0x1A, 0xF1, 0x86, 0xE5, 0xEE, 0x36, 0x83, 0x18, 0xE4, 0x40, 0x88, 0x67, 0xA4, 0xF9, 0x0E,
+ 0x2C, 0x6F, 0xA9, 0xB2, 0xD8, 0x58, 0x89, 0xC1, 0xF5, 0x5C, 0xC0, 0x79, 0xDB, 0xF0, 0xA3, 0x92,
+ 0xED, 0xBB, 0x7F, 0x76, 0xEE, 0x7D, 0x60, 0x5D, 0x05, 0xB5, 0xBA, 0x4C, 0x6A, 0x58, 0x8A, 0xBD,
+ 0xF3, 0x69, 0x68, 0x4F, 0xDE, 0xE3, 0x7F, 0xF2, 0x05, 0x42, 0xC6, 0xDC, 0x7D, 0x04, 0x48, 0x3B,
+ 0x1F, 0x99, 0x7E, 0x6C, 0x1E, 0x91, 0x86, 0xC8, 0xDF, 0x10, 0x92, 0x3F, 0xBD, 0xC3, 0x43, 0x39,
+ 0xE3, 0xC1, 0x30, 0x7B, 0xBD, 0x02, 0x1F, 0x16, 0xEF, 0x72, 0x07, 0x99, 0xB1, 0x3B, 0x6A, 0x2C,
+ 0xBE, 0x41, 0x38, 0xC6, 0xBF, 0xA0, 0xA4, 0xF4, 0xFF, 0x65, 0x4D, 0xF0, 0x76, 0xF2, 0x2F, 0x02,
+ 0x87, 0x02, 0x13, 0xFD, 0x19, 0xC6, 0x4F, 0x6B, 0x57, 0x45, 0xCE, 0xDE, 0xEC, 0x24, 0x9E, 0x29,
+ 0x0D, 0x9C, 0xF4, 0x16, 0x7A, 0x13, 0x33, 0xB9, 0x1C, 0x9E, 0xC1, 0x6B, 0xE3, 0xAD, 0xFD, 0x06,
+ 0x52, 0xDF, 0x8B, 0xAE, 0x35, 0xA6, 0x1B, 0xE7, 0x93, 0x24, 0xB5, 0x5F, 0xD1, 0x77, 0xD5, 0x3E,
+ 0xC4, 0x9F, 0x2F, 0x8A, 0x5C, 0x1C, 0x35, 0xAE, 0x08, 0xBE, 0x22, 0x10, 0x54, 0xDD, 0x6C, 0xC4,
+ 0x1A, 0xDD, 0xD1, 0x04, 0x16, 0x04, 0x3D, 0x7B, 0x65, 0x92, 0xAC, 0x4B, 0x51, 0x51, 0x12, 0x96,
+ 0xAB, 0x10, 0x05, 0x78, 0xD8, 0x77, 0x6D, 0x46, 0x3A, 0x50, 0x3B, 0xB8, 0xB9, 0xF5, 0x64, 0x13,
+ 0xDA, 0xAD, 0x17, 0x2A, 0xD5, 0xAA, 0x40, 0x56, 0x7F, 0xC5, 0xF4, 0x73, 0xE5, 0xFC, 0x77, 0x96,
+ 0xFD, 0xC5, 0x96, 0xCE, 0x68, 0x2C, 0x95, 0xDB, 0x0B, 0x98, 0xAC, 0x99, 0x3F, 0xF9, 0x22, 0x3D,
+ 0xA2, 0xDC, 0x59, 0x30, 0xBF, 0x40, 0x1F, 0x73, 0xB9, 0xBA, 0xE3, 0x09, 0xF2, 0xDD, 0x51, 0x97,
+ 0x46, 0x2E, 0xB5, 0x1E, 0xA3, 0x4D, 0x62, 0x9F, 0x20, 0xCA, 0xF5, 0xC3, 0xF5, 0x14, 0xC4, 0xD5,
+ 0x5C, 0x06, 0x9A, 0xD7, 0x9B, 0x93, 0xD3, 0x0B, 0xA4, 0xDE, 0xCD, 0xAA, 0xBC, 0xFA, 0x91, 0xD8,
+ 0xF5, 0xA2, 0xC1, 0x31, 0xCD, 0x16, 0xE3, 0x5C, 0xFB, 0x33, 0x4C, 0x33, 0x02, 0xD1, 0x17, 0x69,
+ 0x29, 0xE1, 0x94, 0x97, 0xC9, 0x6C, 0x0F, 0x73, 0x5D, 0xCE, 0xBC, 0xF1, 0x76, 0xCE, 0x22, 0xBC,
+ 0xB5, 0x11, 0xAF, 0x5D, 0x0F, 0x78, 0x54, 0x2E, 0x45, 0xDB, 0x02, 0x58, 0x7C, 0xE3, 0x39, 0x99,
+ 0x74, 0x9D, 0x11, 0xFD, 0xF6, 0x87, 0x10, 0x47, 0xA9, 0xF3, 0x3B, 0x08, 0x6E, 0xBC, 0x0C, 0x8E,
+ 0x54, 0x5E, 0x04, 0x58, 0xF6, 0xD9, 0x66, 0xEC, 0xD9, 0x11, 0x6D, 0x35, 0xAB, 0xB4, 0xE5, 0xDC,
+ 0xF0, 0xB6, 0x1E, 0x71, 0xAC, 0x5D, 0x92, 0xC1, 0x5C, 0xB1, 0xC7, 0xD0, 0x0B, 0x10, 0x6E, 0xE2,
+ 0x32, 0xA6, 0x89, 0x42, 0xAD, 0xA6, 0x5C, 0xBA, 0xAD, 0xB2, 0x0F, 0x47, 0x8C, 0xEF, 0xDD, 0x88,
+ 0xEA, 0x04, 0x70, 0xB5, 0xFA, 0xD7, 0x22, 0x78, 0xD8, 0xCB, 0x20, 0xDD, 0xE4, 0xFE, 0x84, 0x68,
+ 0xFD, 0x86, 0x1E, 0xE3, 0x87, 0x7B, 0x74, 0x61, 0xB2, 0x03, 0xC5, 0xA5, 0x06, 0xED, 0x4E, 0x87,
+ 0x4E, 0x31, 0x0C, 0x0A, 0x2B, 0x49, 0x25, 0xD1, 0x33, 0xFF, 0xFE, 0xAC, 0x5E, 0x1F, 0xB2, 0x8D,
+ 0xC0, 0x0D, 0x67, 0xAD, 0x92, 0x64, 0x12, 0xCD, 0x4C, 0x80, 0x68, 0x8B, 0x91, 0xA3, 0xBD, 0x88,
+ 0xA6, 0x0F, 0xEC, 0x4D, 0x26, 0x1F, 0xD6, 0xB1, 0x8C, 0x5D, 0x6B, 0x25, 0x7A, 0x98, 0xA7, 0x30,
+ 0x57, 0x7D, 0x9D, 0x31, 0x8B, 0xE0, 0x61, 0xBC, 0xA1, 0xB5, 0xB6, 0xD3, 0x21, 0xAF, 0x26, 0x7C,
+ 0x53, 0xC2, 0xFB, 0x3E, 0x82, 0xEC, 0xB3, 0x17, 0x02, 0x82, 0xD7, 0x00, 0x82, 0x0A, 0x28, 0x4B,
+ 0xDE, 0x55, 0x8E, 0x9E, 0x42, 0xB5, 0x93, 0xA6, 0x0C, 0x54, 0x09, 0x59, 0xD0, 0x02, 0x68, 0xBE,
+ 0x00, 0x0C, 0x8F, 0x50, 0x73, 0xE9, 0x19, 0x03, 0xBB, 0x47, 0x65, 0xDE, 0x85, 0x23, 0x8C, 0xDC,
+ 0xBB, 0x5A, 0xB5, 0x59, 0xC7, 0xA3, 0x1A, 0xDF, 0x10, 0x1E, 0x2C, 0x10, 0xD7, 0x36, 0xAE, 0x1E,
+ 0x27, 0x78, 0x4D, 0xEE, 0xE6, 0xC0, 0x30, 0xC3, 0x57, 0x0B, 0x5F, 0xFF, 0x5A, 0xB1, 0x05, 0x73,
+ 0xF6, 0x4D, 0x1C, 0x3E, 0x18, 0x3F, 0x01, 0x43, 0x47, 0x23, 0xE2, 0x0F, 0xA9, 0x1C, 0xDE, 0xC5,
+ 0xAA, 0x2B, 0x24, 0xAB, 0x8F, 0xE0, 0xEC, 0x3A, 0x57, 0xBD, 0xBD, 0x47, 0xF4, 0x86, 0x53, 0x7A,
+ 0xC3, 0x32, 0x20, 0x78, 0x3E, 0x0A, 0xDB, 0xBD, 0x33, 0xA4, 0x62, 0x57, 0x55, 0x5B, 0xB3, 0x33,
+ 0x48, 0x2E, 0x24, 0xCD, 0x54, 0xB9, 0xD6, 0x7B, 0x73, 0x51, 0xDB, 0x45, 0xC5, 0x91, 0xDF, 0x49,
+ 0xC0, 0x83, 0x22, 0x2C, 0x08, 0x9A, 0xE7, 0x24, 0x31, 0xEF, 0xDA, 0x7E, 0x54, 0xE1, 0xAF, 0x43,
+ 0xB3, 0xBB, 0x57, 0x79, 0x4A, 0x07, 0xCC, 0x50, 0x6D, 0x2F, 0x32, 0x46, 0x00, 0xE0, 0xCA, 0x4A,
+ 0xE6, 0x2C, 0xE6, 0xCD, 0x41, 0x23, 0xE3, 0xB9, 0x2F, 0x6A, 0x9B, 0xB7, 0xDE, 0x17, 0x50, 0xEA,
+ 0x38, 0x58, 0x97, 0x40, 0x34, 0x4A, 0x9A, 0x57, 0x5E, 0x68, 0x1A, 0xA3, 0xF9, 0x53, 0xB3, 0xC3,
+ 0x5F, 0xC5, 0x20, 0x37, 0xC9, 0x59, 0xFC, 0xE4, 0xFC, 0x3F, 0xD4, 0x5B, 0xBA, 0xF8, 0xB4, 0xAD,
+ 0x50, 0x65, 0xAE, 0xDC, 0x5D, 0xE6, 0xF9, 0x95, 0xF2, 0xAC, 0x41, 0xC2, 0x96, 0x0F, 0x3F, 0x1F,
+ 0xE3, 0x33, 0x7A, 0x0B, 0x13, 0x2D, 0x68, 0x34, 0xAA, 0x23, 0x5B, 0xC9, 0x81, 0x9D, 0xD1, 0x97,
+ 0x4A, 0x5A, 0x55, 0xD6, 0xF9, 0xCE, 0x7F, 0xA2, 0x05, 0x00, 0x63, 0xF8, 0xF8, 0xE2, 0xD4, 0x43,
+ 0x2B, 0x92, 0x63, 0x49, 0x3B, 0xE0, 0x05, 0x60, 0xBA, 0x29, 0x1F, 0x20, 0x09, 0x3E, 0xB9, 0x56,
+ 0xF8, 0x8D, 0xBC, 0x23, 0xAA, 0xC8, 0xDB, 0xAE, 0xF7, 0xED, 0x15, 0x6E, 0xFE, 0xA8, 0xBA, 0xFC,
+ 0xD5, 0x5B, 0x85, 0xCC, 0x78, 0xC6, 0x50, 0xA1, 0x96, 0xE8, 0x0D, 0x56, 0xBD, 0x45, 0x35, 0xFB,
+ 0xF3, 0xF0, 0x1F, 0x87, 0x90, 0xD8, 0x1B, 0x49, 0x3B, 0x8B, 0xB6, 0x44, 0xF5, 0x08, 0xA7, 0xCB,
+ 0xE6, 0x29, 0x72, 0x01, 0xC5, 0x73, 0x07, 0xD3, 0x6F, 0x8A, 0x08, 0xBC, 0x35, 0x07, 0x7B, 0xE8,
+ 0x3F, 0x85, 0xE4, 0x63, 0x23, 0xF2, 0x99, 0x99, 0x52, 0x6D, 0x4F, 0xEC, 0xAE, 0x92, 0x8A, 0xB1,
+ 0x5D, 0x62, 0x20, 0xFE, 0xC6, 0x8B, 0x5B, 0xA1, 0xD9, 0x21, 0x1E, 0xB5, 0x26, 0x6C, 0x53, 0x92,
+ 0x9C, 0x82, 0x66, 0xCD, 0xA0, 0x2E, 0xD2, 0x72, 0xE2, 0xEB, 0xB1, 0x21, 0xCD, 0xC6, 0xC2, 0xB0,
+ 0xB8, 0x13, 0x96, 0x1B, 0xF3, 0x5E, 0xF8, 0x46, 0xA2, 0xA7, 0x73, 0xFB, 0x67, 0xCB, 0x5E, 0x24,
+ 0x1E, 0x1A, 0x40, 0xA2, 0x96, 0x9E, 0x72, 0x44, 0x3F, 0xFA, 0x4C, 0x03, 0x9B, 0x2B, 0x0E, 0x44,
+ 0xDB, 0x0F, 0x2F, 0x55, 0x82, 0xAF, 0x08, 0x27, 0x85, 0xFB, 0xFE, 0x55, 0x08, 0x28, 0x85, 0x04,
+ 0x92, 0x0D, 0xC7, 0x25, 0x48, 0x2C, 0x2A, 0x49, 0x31, 0x52, 0x65, 0xB4, 0xB4, 0xF2, 0xC0, 0xD2,
+ 0x64, 0x0C, 0xB0, 0xEB, 0xC3, 0x6F, 0x11, 0xF6, 0xB3, 0x8B, 0xB1, 0xA8, 0x1F, 0xB2, 0x69, 0x46,
+ 0x7E, 0x15, 0xFE, 0xCC, 0xE2, 0x1A, 0xF9, 0x1F, 0x7B, 0x65, 0xDD, 0xA6, 0xD9, 0x10, 0x03, 0xD5,
+ 0x37, 0x8C, 0x25, 0x41, 0x0B, 0xFF, 0xFF, 0xF8, 0x46, 0xCE, 0x8A, 0x7A, 0x9F, 0x74, 0x61, 0xD8,
+ 0xD4, 0x64, 0xE6, 0xF1, 0x46, 0xC6, 0x04, 0xC0, 0xEA, 0xDB, 0x10, 0x40, 0x6B, 0x9B, 0xD0, 0xC1,
+ 0x45, 0x83, 0x1C, 0x74, 0xA8, 0x3B, 0x5F, 0xC9, 0x45, 0x69, 0x70, 0x90, 0xBD, 0x93, 0x79, 0x82,
+ 0x71, 0x96, 0x75, 0x23, 0x01, 0x9A, 0x3B, 0x0E, 0xCA, 0x7D, 0xDE, 0x66, 0x49, 0x57, 0x11, 0xB2,
+ 0xBF, 0xB4, 0x7E, 0x33, 0xEB, 0xA4, 0x4E, 0xE0, 0x33, 0xCC, 0x44, 0x6F, 0x89, 0xEC, 0xD0, 0x7D,
+ 0x75, 0x79, 0x41, 0x96, 0x37, 0x9D, 0x5A, 0x82, 0x7A, 0xAA, 0xE8, 0x1A, 0x43, 0xA3, 0xE8, 0x1A,
+ 0x24, 0x14, 0x29, 0x84, 0xE0, 0x2E, 0xD0, 0x7F, 0xAC, 0x35, 0x52, 0xF2, 0xE5, 0xD5, 0xA9, 0x7B,
+ 0x9F, 0x55, 0xF3, 0xF1, 0xCB, 0x31, 0x3C, 0xDF, 0x22, 0x4A, 0x1A, 0x47, 0xB7, 0x5E, 0x3A, 0x8C,
+ 0x1A, 0xF2, 0xE7, 0x0C, 0x9A, 0xC8, 0xE4, 0xF9, 0xF9, 0x30, 0xC7, 0x00, 0x9F, 0x57, 0xEF, 0x67,
+ 0xB4, 0x36, 0x0A, 0xF9, 0xB4, 0x3F, 0xE6, 0x20, 0x66, 0x36, 0x88, 0x60, 0x19, 0x74, 0x8B, 0x29,
+ 0x55, 0x64, 0xF2, 0x6C, 0x9D, 0x3B, 0xF4, 0xE9, 0xC8, 0x74, 0x48, 0x48, 0xCA, 0x56, 0xFF, 0x74,
+ 0xE7, 0x39, 0x98, 0xD9, 0x1D, 0xCE, 0x22, 0x98, 0x35, 0xB6, 0xF5, 0xA8, 0x70, 0x51, 0xA8, 0x53,
+ 0x6C, 0xEB, 0xB7, 0x99, 0xDF, 0x97, 0x34, 0x3C, 0x51, 0x74, 0x4E, 0x1E, 0xB9, 0xF4, 0x11, 0xB6,
+ 0x3B, 0xAC, 0x5F, 0x32, 0xA3, 0xB8, 0x3E, 0xB3, 0x78, 0x45, 0xEB, 0x08, 0xB2, 0xAB, 0xA8, 0xD9,
+ 0xBD, 0x32, 0x95, 0xD2, 0x5C, 0xAE, 0xF2, 0x86, 0x82, 0x1A, 0x53, 0xBB, 0x97, 0xA4, 0x8E, 0x4E,
+ 0xD4, 0x1B, 0x3D, 0x5B, 0x70, 0x4A, 0xCE, 0x7A, 0x1A, 0xBD, 0xAE, 0xF0, 0xE4, 0xF2, 0xC0, 0x9D,
+ 0x00, 0xBA, 0xD7, 0xAF, 0xF6, 0x63, 0x7D, 0x7C, 0xA0, 0x58, 0x29, 0x45, 0xBF, 0x96, 0x8F, 0x5D,
+ 0xE1, 0x79, 0x75, 0x52, 0x98, 0xBF, 0x8E, 0x2C, 0x9B, 0xAE, 0xA5, 0x1B, 0x2A, 0xB0, 0x8A, 0x89,
+ 0x25, 0xFE, 0x4D, 0xDA, 0x12, 0xFE, 0xA5, 0x11, 0xC3, 0x72, 0xEB, 0xE5, 0x91, 0xE0, 0xD8, 0x7E,
+ 0x9B, 0xD1, 0x2D, 0xA5, 0x25, 0x3D, 0x18, 0x53, 0x68, 0x5C, 0x22, 0x7D, 0x18, 0x0A, 0x12, 0x3D,
+ 0x40, 0x08, 0x40, 0x59, 0xA6, 0x12, 0x5F, 0x1C, 0x3A, 0xC5, 0xF5, 0xDB, 0xF6, 0x8D, 0x04, 0x90,
+ 0xF9, 0xB7, 0x43, 0x6D, 0x88, 0x42, 0x0F, 0x5F, 0x97, 0xD0, 0x6E, 0x1B, 0xA3, 0xED, 0x0E, 0xEA,
+ 0x68, 0xDE, 0x9C, 0x42, 0x91, 0xE3, 0xC2, 0xFC, 0xB3, 0x06, 0x7F, 0x55, 0x43, 0x07, 0x1B, 0x76,
+ 0xC2, 0x8F, 0xFE, 0x55, 0xA9, 0x08, 0x83, 0x7F, 0xC5, 0xD9, 0x69, 0xAB, 0x91, 0xCC, 0x68, 0x6C,
+ 0x7C, 0xCA, 0x45, 0x99, 0x72, 0x15, 0xF1, 0x50, 0x47, 0xC6, 0x10, 0xAD, 0xB2, 0x91, 0x93, 0xEA,
+ 0x02, 0x57, 0x73, 0x96, 0x91, 0xB3, 0xD1, 0x06, 0x33, 0x2F, 0x73, 0xB0, 0x9F, 0xB1, 0xC3, 0x44,
+ 0x48, 0x3F, 0xB0, 0x99, 0xD4, 0xE5, 0x89, 0x03, 0xC6, 0x10, 0x31, 0xBA, 0xD4, 0xD0, 0x93, 0x91,
+ 0xBC, 0x21, 0xFA, 0xEA, 0x4B, 0xB1, 0x1A, 0x01, 0x88, 0x0C, 0x30, 0x03, 0x78, 0x8D, 0xF6, 0xF5,
+ 0x99, 0x57, 0x1B, 0x00, 0xBB, 0x08, 0x31, 0x23, 0xA4, 0xAD, 0x68, 0x59, 0x80, 0xE5, 0x52, 0x59,
+ 0x32, 0xE0, 0xC2, 0x93, 0x3B, 0x99, 0xC2, 0x0E, 0x03, 0x46, 0x4A, 0x5E, 0x12, 0x24, 0x7F, 0xE8,
+ 0x35, 0xA5, 0xA3, 0x1A, 0xB6, 0xF6, 0xA5, 0xBE, 0xEA, 0x93, 0x04, 0xFA, 0x06, 0x0A, 0x9B, 0xEB,
+ 0x0D, 0x9C, 0x52, 0x57, 0xC7, 0x88, 0x59, 0xAF, 0x2A, 0x72, 0x59, 0x7C, 0xB3, 0xFC, 0x92, 0x1B,
+ 0x6E, 0xE4, 0x76, 0x1F, 0xD5, 0xFC, 0x4A, 0xF1, 0x2B, 0xEF, 0x64, 0xF8, 0x48, 0x17, 0x43, 0x7E,
+ 0x1A, 0xC0, 0xAE, 0x3B, 0xC1, 0xC2, 0x37, 0x2E, 0xDC, 0x16, 0xAB, 0x8F, 0xE7, 0x54, 0x9D, 0x7C,
+ 0xFD, 0x38, 0xC0, 0xE7, 0x7F, 0xF9, 0x5E, 0x54, 0x56, 0x51, 0xE9, 0x37, 0x95, 0x8A, 0x9E, 0xF0,
+ 0x8F, 0x86, 0x57, 0xE8, 0x49, 0x1C, 0xCE, 0x26, 0x29, 0x94, 0x8C, 0x31, 0x35, 0xB3, 0xD5, 0x7A,
+ 0x22, 0x36, 0xFB, 0x8A, 0x65, 0x21, 0xED, 0x02, 0x0D, 0x97, 0x92, 0xD5, 0x37, 0x6E, 0x25, 0xAC,
+ 0x23, 0xC2, 0x92, 0xCF, 0xF4, 0x11, 0x9B, 0x04, 0x58, 0x31, 0x9C, 0xB6, 0xFA, 0xF8, 0x60, 0xDF,
+ 0xA1, 0xE0, 0x53, 0x5F, 0x78, 0x5D, 0x27, 0x02, 0xD7, 0x60, 0xD3, 0x78, 0xF6, 0xF8, 0x0D, 0xA7,
+ 0x9F, 0x07, 0x91, 0xAB, 0xDC, 0xB6, 0xB4, 0x8E, 0xD3, 0xCE, 0x44, 0x30, 0xEE, 0xEC, 0x94, 0x32,
+ 0xB0, 0x0C, 0x49, 0x07, 0x88, 0x76, 0x67, 0xC0, 0xD7, 0x46, 0x84, 0x1F, 0x07, 0xBA, 0x1A, 0xD6,
+ 0xB9, 0x3B, 0xBF, 0xD1, 0x81, 0xF0, 0xE0, 0xB8, 0xB4, 0xE8, 0x00, 0x20, 0x74, 0xA2, 0x2D, 0x25,
+ 0x40, 0xE6, 0x97, 0x0C, 0xCA, 0xCF, 0xE6, 0xCD, 0x47, 0x9A, 0xAC, 0xD8, 0x68, 0x96, 0x80, 0x3F,
+ 0x1C, 0x2E, 0x22, 0x8F, 0x34, 0x37, 0xCC, 0x7A, 0xC5, 0x30, 0x24, 0xB7, 0x98, 0x25, 0x62, 0x41,
+ 0x6C, 0x9B, 0x38, 0x51, 0x91, 0x99, 0x98, 0x61, 0x54, 0xE7, 0x56, 0xD0, 0x76, 0x4D, 0xFB, 0xEB,
+ 0xE3, 0x7A, 0x85, 0xCF, 0x18, 0x31, 0x6D, 0xD8, 0x58, 0x17, 0x40, 0x18, 0x9F, 0xED, 0x01, 0xBF,
+ 0x68, 0x6D, 0x5E, 0x3D, 0xE7, 0x02, 0x37, 0xF8, 0x11, 0x71, 0x2D, 0x1A, 0xD4, 0x7E, 0xC6, 0xBD,
+ 0x48, 0xB9, 0xE5, 0xF1, 0xF5, 0x9C, 0x6B, 0x34, 0xC4, 0xB8, 0xB2, 0x24, 0x04, 0x9E, 0xFC, 0x02,
+ 0x99, 0x5E, 0xF6, 0x3B, 0x37, 0xAA, 0xA6, 0x54, 0xAB, 0x34, 0x46, 0x26, 0xF5, 0xC7, 0x5E, 0x06,
+ 0xFA, 0x6E, 0x6E, 0xB1, 0x6E, 0xBC, 0xF1, 0x64, 0xDB, 0x86, 0x07, 0x69, 0x35, 0x51, 0x72, 0xCE,
+ 0x8B, 0x3C, 0xE5, 0x1D, 0xB0, 0x54, 0xCD, 0xDE, 0x29, 0x52, 0x72, 0x7F, 0xDF, 0xA0, 0xE7, 0x75,
+ 0xDA, 0xED, 0x05, 0xE9, 0x5E, 0xFE, 0x7F, 0xE5, 0xEF, 0x3B, 0x21, 0x0E, 0xD0, 0x08, 0xE7, 0x7F,
+ 0x77, 0x69, 0xF3, 0x5D, 0x00, 0xB1, 0x51, 0xC4, 0x0C, 0xBA, 0x8D, 0xC2, 0x5E, 0x36, 0xE9, 0xF7,
+ 0xCC, 0x50, 0xEE, 0xD8, 0xF9, 0x5E, 0x53, 0x26, 0x49, 0x7B, 0xAD, 0xE2, 0x80, 0xDF, 0xBE, 0x0D,
+ 0xD1, 0x6A, 0x86, 0x35, 0x34, 0x6D, 0x35, 0x6D, 0x2F, 0xA9, 0xAC, 0x14, 0xE7, 0x06, 0xB5, 0x75,
+ 0xED, 0x5A, 0xF5, 0x5B, 0xE1, 0xA5, 0x64, 0x55, 0x0F, 0x72, 0x1A, 0x43, 0x70, 0x48, 0x6B, 0x13,
+ 0xC1, 0x18, 0x2C, 0x50, 0xC7, 0xCF, 0x7D, 0x69, 0x2C, 0x20, 0xD3, 0xEE, 0xE0, 0xB7, 0x29, 0x97,
+ 0xB2, 0x89, 0xF8, 0xAF, 0x4B, 0x4D, 0xBB, 0x44, 0xFB, 0xC6, 0x28, 0x1D, 0xD3, 0x05, 0xD2, 0xF5,
+ 0x59, 0x2D, 0x92, 0x7D, 0xEC, 0xB0, 0x81, 0x76, 0x76, 0x7A, 0xF8, 0x09, 0x8E, 0x67, 0x5A, 0xAC,
+ 0x77, 0x4C, 0x64, 0x4D, 0x6B, 0x61, 0xE9, 0x27, 0x85, 0x91, 0x57, 0xF9, 0x45, 0xF0, 0xFC, 0xCC,
+ 0x11, 0x0E, 0x6D, 0x84, 0x8F, 0x21, 0xE4, 0xB2, 0xA7, 0x7B, 0x9B, 0x31, 0xF9, 0xEF, 0x45, 0xE1,
+ 0x3F, 0x74, 0x10, 0xEA, 0xF5, 0xBF, 0x65, 0x7E, 0xC8, 0xCF, 0x01, 0xBD, 0x40, 0x41, 0x32, 0x9D,
+ 0x3E, 0xC0, 0x00, 0xC1, 0x9E, 0x6A, 0xE2, 0x54, 0xA1, 0x0D, 0xB3, 0x84, 0x3A, 0xD4, 0x08, 0xC7,
+ 0x4D, 0x6A, 0x01, 0xC5, 0xD3, 0xB9, 0x80, 0xB9, 0x3C, 0xD1, 0x81, 0xB7, 0x5D, 0x8D, 0x37, 0xD4,
+ 0x3C, 0x5A, 0xDC, 0xC9, 0xDD, 0x84, 0x4F, 0x56, 0xBC, 0xCC, 0xA5, 0x0D, 0x9A, 0x53, 0x9D, 0xCC,
+ 0x7A, 0x52, 0xA7, 0xAE, 0x3A, 0x7F, 0x4E, 0xE1, 0x63, 0xAE, 0xFF, 0x0E, 0xA7, 0x7A, 0x3B, 0x05,
+ 0x0A, 0x53, 0xC5, 0xAC, 0xD3, 0x58, 0xB5, 0xB6, 0xE1, 0xC1, 0x8B, 0x1C, 0xEF, 0x77, 0xEB, 0x2A,
+ 0xAF, 0x41, 0xDA, 0x4D, 0xBC, 0xC5, 0x37, 0x27, 0xCD, 0x20, 0xBD, 0xA9, 0x83, 0x64, 0xA6, 0x28,
+ 0xDE, 0x1C, 0xD7, 0x7A, 0x98, 0xEA, 0x55, 0x3D, 0xE2, 0x59, 0x2F, 0x4E, 0x96, 0xEE, 0xB2, 0xAF,
+ 0xAA, 0xD3, 0xC7, 0x03, 0xEB, 0x47, 0x37, 0xF5, 0x3C, 0x6A, 0x07, 0x88, 0x20, 0x9D, 0x2A, 0xD8,
+ 0xED, 0x0F, 0x38, 0xB7, 0x55, 0x3E, 0x99, 0x67, 0x8A, 0x80, 0x0F, 0x20, 0x38, 0xC2, 0x3E, 0x21,
+ 0x65, 0x07, 0x62, 0x7D, 0x56, 0xE2, 0x61, 0x3E, 0x1F, 0x29, 0x20, 0x06, 0x2E, 0xB4, 0xEA, 0x23,
+ 0x72, 0x91, 0xB6, 0x2B, 0x78, 0xB1, 0x01, 0xF0, 0x25, 0x0E, 0x6F, 0xD0, 0x3A, 0x98, 0x14, 0x4B,
+ 0xF7, 0x18, 0x27, 0x70, 0xBF, 0x89, 0x29, 0xF2, 0x0C, 0xFA, 0xAC, 0x26, 0x73, 0xBC, 0xAA, 0x21,
+ 0x5C, 0x0A, 0xC4, 0xF6, 0x95, 0x10, 0xA3, 0x90, 0x46, 0x49, 0x5C, 0x53, 0x25, 0x95, 0x93, 0x80,
+ 0x0F, 0xF3, 0xB5, 0xA1, 0x7F, 0x27, 0xD5, 0xF2, 0x9D, 0x41, 0xA0, 0x34, 0xAB, 0xDC, 0xD2, 0x8F,
+ 0xA4, 0xBC, 0xE8, 0x54, 0x06, 0x60, 0x13, 0x6D, 0x9B, 0x74, 0x57, 0x82, 0x1C, 0x0D, 0x1F, 0xDB,
+ 0x54, 0xC3, 0x4F, 0x0C, 0xC3, 0x99, 0x0F, 0xF6, 0x6B, 0x6A, 0x72, 0x4F, 0x2C, 0x01, 0x0C, 0x91,
+ 0xDC, 0x06, 0x05, 0xA7, 0xCC, 0xD4, 0x6C, 0xB3, 0x35, 0xAF, 0x10, 0xDE, 0xEE, 0xE6, 0x42, 0x93,
+ 0x11, 0x41, 0x66, 0x86, 0x2F, 0xD6, 0xCF, 0xC3, 0xA7, 0x61, 0x24, 0xD0, 0xC8, 0x9D, 0x8B, 0x01,
+ 0x68, 0xF7, 0x54, 0x10, 0x5C, 0xE7, 0x01, 0x49, 0xA3, 0x4D, 0x5D, 0x97, 0xEA, 0x79, 0xA8, 0xFA,
+ 0x09, 0x0F, 0xAD, 0x93, 0x16, 0xCD, 0x75, 0x6B, 0x70, 0x79, 0xDB, 0xC3, 0xC8, 0x04, 0xE1, 0xD6,
+ 0xDA, 0x11, 0x8E, 0x4B, 0xB6, 0x6E, 0x60, 0x5D, 0x21, 0xAA, 0xB0, 0xC0, 0xA0, 0xCD, 0xC7, 0x81,
+ 0x92, 0x0F, 0xF3, 0xBC, 0xA3, 0x80, 0x5C, 0x54, 0xCA, 0x05, 0x9C, 0x75, 0x5B, 0x80, 0x3E, 0x66,
+ 0x76, 0x65, 0xAA, 0x96, 0xE3, 0x6E, 0x9A, 0x6C, 0x09, 0xEC, 0x74, 0xF3, 0x95, 0x7A, 0xA8, 0x0F,
+ 0x4D, 0x08, 0x1B, 0x39, 0x7F, 0xA3, 0x27, 0xA3, 0x50, 0x4F, 0xCA, 0x1A, 0xDA, 0x40, 0xFE, 0x6F,
+ 0x63, 0xFB, 0xB6, 0xBC, 0x03, 0x8F, 0xBD, 0x4A, 0x95, 0xE2, 0xA1, 0xCE, 0x1E, 0xFA, 0xE6, 0xF0,
+ 0x6D, 0x65, 0x7E, 0x03, 0x6C, 0xEF, 0x10, 0x88, 0x2F, 0xC3, 0x35, 0xFC, 0x67, 0xDB, 0xEF, 0xF3,
+ 0xA1, 0xBC, 0x5B, 0x12, 0x9C, 0x4C, 0xFF, 0xD9, 0x5E, 0x53, 0x4E, 0xEC, 0x9C, 0x67, 0x9F, 0xED,
+ 0x24, 0x75, 0x9D, 0xC5, 0xE0, 0xCB, 0x74, 0x89, 0x0D, 0x0B, 0x3B, 0x85, 0x24, 0x12, 0xAA, 0xF8,
+ 0x22, 0x32, 0xAC, 0xDD, 0x3B, 0xC6, 0x90, 0x6F, 0xEF, 0xBB, 0x72, 0xEF, 0xCA, 0x0D, 0xB1, 0x49,
+ 0x30, 0x9B, 0xE3, 0xBC, 0x50, 0x8D, 0x8D, 0xE0, 0x21, 0x79, 0x64, 0x89, 0x01, 0x59, 0xEF, 0xD6,
+ 0x0C, 0x83, 0xED, 0xA4, 0x23, 0xCB, 0x41, 0xC5, 0x4D, 0x10, 0xC4, 0xCF, 0xC2, 0x2F, 0xC7, 0xA3,
+ 0xD9, 0x03, 0xF5, 0x11, 0xD4, 0x2C, 0xC5, 0x31, 0x62, 0xF6, 0xAF, 0x90, 0x39, 0x3D, 0xC8, 0xCB,
+ 0x9F, 0x98, 0xCD, 0x00, 0xBD, 0x0E, 0x80, 0xE4, 0xDF, 0xE7, 0x66, 0x00, 0x19, 0xA4, 0x8D, 0x40,
+ 0x1A, 0x1E, 0xED, 0x2B, 0xD2, 0xAB, 0xDC, 0x6E, 0x0F, 0x0A, 0xD4, 0xD7, 0x44, 0xC7, 0x74, 0x85,
+ 0xC2, 0xF2, 0x63, 0x96, 0x62, 0x90, 0x56, 0x0D, 0x3B, 0x27, 0x1A, 0xB1, 0xBF, 0x9F, 0x58, 0x07,
+ 0xF1, 0xF5, 0x3E, 0xAF, 0x07, 0x00, 0x76, 0xA9, 0xB7, 0x38, 0x7A, 0xBC, 0xF8, 0xD7, 0x83, 0xF7,
+ 0x17, 0x9F, 0xD5, 0xD5, 0x0A, 0x34, 0xBE, 0x07, 0x28, 0xFB, 0xA9, 0x00, 0xC3, 0x2A, 0xD0, 0x32,
+ 0xC6, 0xAD, 0x4A, 0x58, 0x5E, 0xD9, 0xAD, 0x4D, 0x86, 0x14, 0x1D, 0x3E, 0xEB, 0xE9, 0xE5, 0x7D,
+ 0xD0, 0x95, 0x33, 0x54, 0xEC, 0xC1, 0x72, 0x8B, 0xD1, 0x5A, 0x23, 0xBF, 0xB8, 0xD0, 0x85, 0x6E,
+ 0x38, 0x93, 0xD7, 0xD4, 0xE9, 0x7C, 0x03, 0xC7, 0x21, 0x3F, 0x38, 0x36, 0xFB, 0xF5, 0xAD, 0xF4,
+ 0xCA, 0x1A, 0x03, 0x82, 0x9B, 0x3B, 0xEB, 0xB0, 0x0F, 0xE1, 0xEF, 0x98, 0x6D, 0x76, 0x8C, 0x1E,
+ 0xDC, 0xBA, 0x45, 0xE0, 0xE9, 0xAE, 0xC7, 0xC9, 0xAC, 0x91, 0xE7, 0xB5, 0xD1, 0x18, 0xFA, 0x56,
+ 0x5A, 0xA1, 0x92, 0xF9, 0x2C, 0x9C, 0x06, 0x4F, 0x34, 0xDD, 0x80, 0xB5, 0xF4, 0x5F, 0x7E, 0xE0,
+ 0xAF, 0xAB, 0xDE, 0x95, 0x72, 0x7F, 0xCD, 0x5D, 0x29, 0x54, 0x6A, 0xA8, 0x13, 0x5B, 0xDB, 0xCB,
+ 0x30, 0xEE, 0x56, 0xD3, 0x45, 0x8E, 0xCB, 0x59, 0xDA, 0x07, 0xED, 0xEC, 0x43, 0x5E, 0x17, 0x44,
+ 0xAF, 0xBC, 0x81, 0x5C, 0x4B, 0xDB, 0xAE, 0xA0, 0x46, 0x19, 0xA8, 0x61, 0x35, 0x9F, 0x17, 0xB3,
+ 0xAF, 0xCC, 0x22, 0xC6, 0x0B, 0x78, 0x58, 0xE9, 0x87, 0xE2, 0x2D, 0x96, 0xF0, 0xA9, 0x62, 0x12,
+ 0x35, 0xD0, 0x46, 0x6C, 0x61, 0xAE, 0xB9, 0x5D, 0x5A, 0xDE, 0x8B, 0x7F, 0xAC, 0x9E, 0x29, 0xA1,
+ 0xEA, 0xC7, 0x1B, 0x24, 0x9E, 0x08, 0x48, 0xBD, 0x23, 0xF6, 0xAB, 0x4E, 0xE9, 0xDE, 0xAF, 0x4C,
+ 0x79, 0xCC, 0x52, 0xB2, 0xAC, 0xF4, 0x01, 0xA9, 0xA8, 0x02, 0x9B, 0x14, 0x86, 0x4B, 0xEE, 0x94,
+ 0xA8, 0x34, 0x6C, 0x00, 0x4F, 0x4C, 0xE1, 0x6D, 0xF9, 0x19, 0x8F, 0x36, 0x5E, 0x22, 0x5D, 0xB7,
+ 0x03, 0x62, 0x7C, 0x4D, 0xC4, 0xF0, 0x4C, 0x3C, 0x5F, 0xBD, 0x0E, 0xB0, 0x74, 0x14, 0x08, 0xEE,
+ 0x0E, 0x06, 0x65, 0xAB, 0x69, 0x7A, 0x70, 0x67, 0xC2, 0x12, 0x04, 0x45, 0xF2, 0xC8, 0xD7, 0x80,
+ 0x7F, 0xDB, 0xB5, 0xD0, 0xF7, 0xAB, 0x62, 0x7A, 0xFA, 0xD6, 0x1A, 0x9E, 0x14, 0x4C, 0x4A, 0x6C,
+ 0x75, 0x81, 0x37, 0xEF, 0x68, 0x4A, 0x5D, 0x23, 0xDD, 0x7E, 0xF5, 0xDD, 0x9E, 0xEF, 0xB3, 0xC8,
+ 0x3F, 0x18, 0x65, 0x42, 0x14, 0x68, 0x77, 0x56, 0x24, 0x8C, 0xAD, 0x7A, 0xC3, 0x1D, 0xB3, 0xAA,
+ 0x3C, 0x90, 0x38, 0x65, 0xA2, 0x6A, 0x42, 0xD9, 0x4D, 0xA1, 0xAA, 0x04, 0xA5, 0xE6, 0x36, 0xF4,
+ 0xA3, 0x18, 0xA3, 0x9B, 0x8C, 0x9A, 0x5E, 0xAF, 0x6D, 0xDC, 0x6A, 0xD3, 0x61, 0xB7, 0x59, 0x2C,
+ 0xF4, 0xE1, 0x16, 0xFF, 0xFC, 0x3D, 0xBC, 0x2F, 0xD6, 0xC1, 0xEE, 0xBD, 0x9B, 0x48, 0x11, 0x90,
+ 0x7B, 0xED, 0x58, 0x9B, 0x84, 0x57, 0x85, 0xB3, 0xB3, 0x65, 0x14, 0x08, 0x14, 0x8F, 0x71, 0xF2,
+ 0x50, 0x38, 0x7C, 0xCE, 0xEE, 0x47, 0xBD, 0xFD, 0x27, 0x6B, 0x07, 0xB7, 0xB2, 0xBB, 0x05, 0xB0,
+ 0x4F, 0xB5, 0x94, 0xA0, 0x30, 0x89, 0x97, 0xD2, 0x2E, 0xE1, 0xCC, 0xAC, 0xDA, 0x95, 0x2F, 0x2E,
+ 0xDD, 0xA9, 0xA9, 0xD0, 0xC6, 0xC3, 0x77, 0xB8, 0xBA, 0x19, 0xD2, 0x66, 0x91, 0xB6, 0xA8, 0x4D,
+ 0x34, 0xC5, 0xE3, 0xC9, 0x4B, 0x8C, 0x49, 0x68, 0xD2, 0x47, 0xC5, 0x8C, 0x10, 0xE4, 0xBB, 0x40,
+ 0x04, 0x7B, 0x26, 0x34, 0x75, 0x53, 0xC5, 0xA5, 0x57, 0x91, 0x11, 0x81, 0x49, 0x79, 0x0F, 0xE9,
+ 0x95, 0x33, 0x6C, 0xF2, 0x2F, 0x2A, 0x07, 0x43, 0x71, 0xAD, 0x7B, 0x2C, 0x99, 0xFD, 0x4E, 0xC0,
+ 0x8C, 0xC8, 0x69, 0x12, 0xF9, 0x1F, 0x11, 0xFA, 0x28, 0x80, 0xC7, 0xEE, 0x50, 0x63, 0x6D, 0x08,
+ 0x88, 0x9D, 0x6C, 0x2E, 0x05, 0x54, 0xC2, 0x0B, 0x26, 0x69, 0xAB, 0xA5, 0xAD, 0xC1, 0xFD, 0xD9,
+ 0x1D, 0xE6, 0x85, 0xD5, 0x71, 0xB6, 0xA9, 0xE9, 0x10, 0xB7, 0x2F, 0x1E, 0x12, 0x9C, 0x41, 0x14,
+ 0xAF, 0xE0, 0x07, 0x8C, 0xF2, 0xA3, 0x7F, 0xA4, 0x94, 0x91, 0xF9, 0x41, 0x62, 0x8B, 0xE9, 0xA4,
+ 0x11, 0x78, 0x9D, 0x75, 0x33, 0x01, 0xBD, 0x7F, 0x1E, 0x4F, 0x2F, 0x80, 0x7A, 0xF9, 0x70, 0x84,
+ 0xE6, 0x45, 0xDE, 0x76, 0xD8, 0x36, 0x5C, 0xC1, 0xB9, 0x42, 0x59, 0x85, 0x9C, 0x60, 0x5F, 0x29,
+ 0x03, 0x34, 0xE8, 0x65, 0xEB, 0x99, 0x7B, 0xCD, 0x3A, 0x9C, 0xB6, 0x9E, 0xA9, 0xBA, 0x7D, 0x6D,
+ 0x9D, 0x27, 0xDD, 0xBE, 0xD4, 0xF9, 0xB5, 0xF8, 0x66, 0xD5, 0xAC, 0x27, 0x9D, 0x8F, 0x72, 0x04,
+ 0x1D, 0xA3, 0x91, 0x9E, 0x3C, 0xBA, 0x4B, 0xF7, 0x58, 0x06, 0xBD, 0xE6, 0x8F, 0xB5, 0xA5, 0x8F,
+ 0x7F, 0x1C, 0xF9, 0xD9, 0x2E, 0xD6, 0xB0, 0x52, 0x2D, 0x23, 0x8B, 0x8E, 0xD7, 0xE8, 0xFF, 0x5E,
+ 0x04, 0x4A, 0xC4, 0xDA, 0x95, 0xA4, 0x91, 0xFF, 0xCB, 0x36, 0x38, 0xEE, 0x47, 0xB7, 0x51, 0xCD,
+ 0x80, 0x37, 0x0D, 0x06, 0xB6, 0x56, 0x19, 0xFB, 0xAF, 0x4E, 0x94, 0x57, 0x12, 0xCC, 0x46, 0xD4,
+ 0x16, 0x59, 0xF4, 0x83, 0xEF, 0x3C, 0x7C, 0xE3, 0x50, 0x61, 0x69, 0xB3, 0xC7, 0xB5, 0x96, 0xDB,
+ 0x89, 0x6C, 0x27, 0xA6, 0x48, 0x67, 0x9F, 0xE8, 0x31, 0x01, 0x6D, 0x16, 0xD4, 0x8A, 0xFF, 0x93,
+ 0x47, 0x9D, 0xC6, 0x2C, 0x53, 0x18, 0x01, 0x09, 0x09, 0x35, 0xFD, 0xAA, 0x43, 0x1B, 0xC0, 0xD7,
+ 0x9D, 0x84, 0x01, 0x4D, 0x08, 0x51, 0x76, 0xF0, 0x21, 0x21, 0x74, 0x1D, 0xB6, 0x97, 0x0C, 0xEE,
+ 0xC8, 0xCA, 0x00, 0x87, 0x52, 0xD9, 0x50, 0xD3, 0x84, 0xC9, 0xF6, 0xB3, 0x3E, 0x69, 0xB8, 0x7A,
+ 0xDF, 0x10, 0x02, 0xE9, 0xB1, 0x4E, 0xF7, 0x81, 0x6D, 0x3A, 0x6E, 0x5B, 0x14, 0x78, 0xBF, 0x0E,
+ 0x50, 0xB8, 0x63, 0x8B, 0x1F, 0x5F, 0xEB, 0xEA, 0x5C, 0xBB, 0xE8, 0x87, 0x07, 0x60, 0x50, 0x13,
+ 0xE1, 0x36, 0xD9, 0x54, 0xEA, 0xDD, 0x9B, 0x9B, 0x53, 0xEF, 0xFD, 0xD6, 0x92, 0x88, 0x90, 0x50,
+ 0x18, 0xD2, 0xAA, 0x67, 0xFF, 0xF4, 0x95, 0x06, 0xC4, 0x36, 0xB1, 0x38, 0x74, 0xAA, 0xFD, 0x05,
+ 0xC8, 0x0E, 0x59, 0xB3, 0xBA, 0xD3, 0x83, 0x84, 0x3B, 0x96, 0x9E, 0x8D, 0xF4, 0xE2, 0xCA, 0x2A,
+ 0x77, 0x0B, 0xD6, 0xE1, 0x2E, 0x37, 0x88, 0x0E, 0xD9, 0x13, 0xC8, 0xF8, 0x6D, 0xFC, 0x70, 0x95,
+ 0xF5, 0x83, 0x02, 0xA2, 0x0F, 0x75, 0xD4, 0xE0, 0xEC, 0xFD, 0x4A, 0x82, 0xDD, 0x87, 0x1D, 0xC4,
+ 0x57, 0x96, 0x54, 0xDB, 0x36, 0x07, 0x11, 0x0C, 0x0B, 0x94, 0xD0, 0xF4, 0x97, 0x75, 0xF9, 0x1D,
+ 0xC4, 0x5D, 0x34, 0x19, 0x38, 0xE1, 0x2A, 0x23, 0xBD, 0x3B, 0xE6, 0x8F, 0xC2, 0x0A, 0x2B, 0x1D,
+ 0xFD, 0x2E, 0x68, 0xBC, 0x11, 0xA4, 0xA1, 0x87, 0x98, 0x4E, 0x71, 0x1C, 0xBE, 0x19, 0x3F, 0xFC,
+ 0x17, 0x24, 0x52, 0xA5, 0xA3, 0x16, 0xD1, 0xAD, 0x0F, 0xF8, 0x57, 0x9F, 0x7B, 0x8E, 0xD0, 0xC2,
+ 0x3F, 0x78, 0x43, 0xDC, 0x58, 0xEA, 0xE2, 0x5B, 0x71, 0x66, 0x46, 0x20, 0x28, 0x01, 0xFC, 0x41,
+ 0xAF, 0x19, 0x55, 0xA8, 0x8F, 0xB0, 0x08, 0x91, 0x9C, 0xA5, 0x4C, 0x10, 0xA1, 0xD5, 0x6C, 0x9E,
+ 0x85, 0x68, 0x55, 0x5E, 0x07, 0x7B, 0xF6, 0xA3, 0x91, 0xEC, 0x11, 0xA7, 0xE7, 0x2C, 0x6D, 0xF8,
+ 0x73, 0x26, 0x53, 0xB5, 0x44, 0x2C, 0x7E, 0x9B, 0xDD, 0x78, 0x24, 0xBA, 0xB9, 0xE5, 0xB2, 0xD1,
+ 0x0E, 0xE6, 0xC8, 0x4D, 0x1F, 0x14, 0x32, 0x76, 0x1C, 0xBC, 0xE5, 0x1F, 0xC6, 0x81, 0x0E, 0x38,
+ 0xD9, 0xB0, 0xC3, 0x89, 0xE7, 0x51, 0xE2, 0x6D, 0xB5, 0x4C, 0x10, 0x3B, 0xAE, 0x9F, 0x07, 0x6C,
+ 0x88, 0x52, 0x09, 0x06, 0xA5, 0x5C, 0x1A, 0x2D, 0x2F, 0x3F, 0x90, 0x2D, 0xB9, 0xB7, 0x85, 0x2F,
+ 0xC0, 0xE0, 0x60, 0x4A, 0x7D, 0x24, 0xC3, 0xCD, 0x9C, 0x15, 0x37, 0x5A, 0xF0, 0x56, 0x58, 0x9B,
+ 0xA6, 0xB6, 0x0A, 0xED, 0x9E, 0x21, 0xF3, 0xA8, 0x53, 0x78, 0x8C, 0xB4, 0x84, 0x41, 0x02, 0xC4,
+ 0xB7, 0xF5, 0x4B, 0xB2, 0x98, 0x9D, 0x89, 0xB8, 0xAD, 0xE3, 0x5E, 0x84, 0xB9, 0xDB, 0xC7, 0xA8,
+ 0xC9, 0x20, 0x91, 0x05, 0x8E, 0x4B, 0x6F, 0x74, 0x1D, 0xC9, 0x6D, 0x2A, 0x4A, 0xF1, 0x5E, 0xD1,
+ 0x6B, 0xFA, 0xF2, 0x4B, 0xC6, 0x72, 0xB5, 0x99, 0x05, 0xEF, 0xFF, 0xE3, 0x00, 0x97, 0xE1, 0xB6,
+ 0x07, 0x1F, 0xBC, 0x95, 0xCD, 0x1F, 0xDC, 0xD5, 0x93, 0x62, 0x7C, 0xA0, 0xEC, 0xCE, 0x9A, 0xC4,
+ 0x55, 0x9C, 0x79, 0x23, 0x2A, 0x61, 0x17, 0x46, 0x86, 0x9E, 0x81, 0xC5, 0x40, 0x0D, 0x63, 0xBC,
+ 0xAC, 0x52, 0xE8, 0x69, 0xBE, 0x7C, 0x76, 0xE8, 0x12, 0xB3, 0x66, 0x3F, 0xE7, 0xB9, 0x97, 0xF0,
+ 0x32, 0xD9, 0xC6, 0xBF, 0xF3, 0x12, 0xC9, 0x9E, 0x93, 0xD8, 0xF4, 0x2E, 0x17, 0x54, 0xA7, 0x32,
+ 0xE2, 0xF6, 0x6C, 0xBE, 0xCA, 0xBA, 0x8D, 0x76, 0x11, 0xA2, 0x48, 0xB7, 0x4E, 0x84, 0x42, 0xE5,
+ 0xF4, 0xAF, 0x12, 0x4F, 0x56, 0x98, 0x7B, 0xF3, 0xE0, 0x22, 0x94, 0x1A, 0x64, 0xA3, 0xDD, 0x26,
+ 0x13, 0x73, 0x96, 0x84, 0x46, 0xB5, 0x98, 0xE4, 0x91, 0xEC, 0xF3, 0x06, 0x37, 0x21, 0x79, 0x77,
+ 0x91, 0x02, 0x2E, 0x18, 0xE0, 0x60, 0x75, 0xB8, 0xC5, 0xAD, 0x9D, 0xB3, 0x56, 0x8B, 0x92, 0x0E,
+ 0x01, 0xAB, 0x91, 0xF2, 0xDC, 0x41, 0xBC, 0x25, 0xCE, 0x16, 0x31, 0x1B, 0x24, 0x52, 0xD9, 0x02,
+ 0x25, 0x4E, 0x64, 0x8A, 0x11, 0x15, 0xB9, 0x20, 0x33, 0x01, 0xD0, 0x4F, 0x6B, 0x04, 0x67, 0x32,
+ 0xB9, 0xEC, 0xD0, 0x77, 0xFC, 0x51, 0x0F, 0x9E, 0x5C, 0xF5, 0x3C, 0x18, 0x0A, 0xF2, 0xD3, 0x4E,
+ 0x2C, 0x3B, 0xA7, 0xC0, 0x43, 0x33, 0xE8, 0x59, 0x40, 0xB7, 0xAF, 0x75, 0x38, 0xDC, 0x1D, 0xF3,
+ 0x77, 0xAD, 0xD9, 0xF7, 0x3A, 0x5D, 0xF4, 0xD4, 0xB5, 0x54, 0x15, 0x73, 0x7B, 0xE7, 0xA3, 0x2B,
+ 0x22, 0xE9, 0x09, 0x2C, 0xDE, 0x60, 0x2A, 0x5B, 0xBB, 0xD9, 0xA1, 0xF6, 0x1E, 0x69, 0x38, 0xC2,
+ 0x4B, 0xCD, 0xEC, 0xA2, 0xA3, 0x1D, 0xBA, 0xBE, 0x0C, 0xA4, 0x42, 0x01, 0xE9, 0x1C, 0x4A, 0xC6,
+ 0xCF, 0xF8, 0x9A, 0x1B, 0x2B, 0x2B, 0x44, 0x81, 0x50, 0x69, 0x85, 0x08, 0xDD, 0xE7, 0xBE, 0xF9,
+ 0xBF, 0x65, 0x59, 0xB3, 0x80, 0x5C, 0x85, 0x5D, 0x68, 0x05, 0xBA, 0xA1, 0xDC, 0x32, 0x9C, 0xA9,
+ 0x98, 0x7D, 0x3B, 0x4E, 0x03, 0xA4, 0x28, 0x0A, 0x3F, 0xB3, 0x09, 0xA8, 0x0C, 0x5A, 0x92, 0xA3,
+ 0xDF, 0xAE, 0x69, 0xBE, 0x5D, 0xFA, 0x75, 0x49, 0xA4, 0x5C, 0xE5, 0xBB, 0xCD, 0x7C, 0xD8, 0x5A,
+ 0xAA, 0x77, 0x7C, 0x81, 0xE3, 0xCA, 0xB9, 0x7C, 0xC8, 0xF9, 0x83, 0x8B, 0x84, 0xB7, 0xE6, 0xEF,
+ 0x52, 0xF0, 0xC5, 0xB8, 0xAF, 0x7F, 0xA6, 0xA0, 0x4E, 0xE0, 0x1A, 0x41, 0x93, 0x01, 0xF7, 0xBE,
+ 0x0E, 0x58, 0x73, 0xFA, 0x43, 0xE7, 0xC0, 0x72, 0x2B, 0x4F, 0x4A, 0x80, 0xBA, 0xC7, 0x2E, 0x19,
+ 0x4C, 0xB5, 0xF1, 0xFD, 0x97, 0x11, 0x8A, 0xD3, 0xB7, 0xC9, 0x73, 0x6D, 0x04, 0x9E, 0xAA, 0xC2,
+ 0xD3, 0xEE, 0xB9, 0xC0, 0x98, 0x06, 0x9D, 0xA5, 0x6B, 0x19, 0x5B, 0x95, 0x13, 0x6C, 0x27, 0x9E,
+ 0x77, 0xFB, 0x66, 0x7B, 0x7F, 0x1E, 0x9D, 0x5D, 0x38, 0x30, 0xB6, 0x7E, 0xA9, 0x0D, 0xF6, 0x8B,
+ 0xAE, 0x58, 0x94, 0xA3, 0x3B, 0x67, 0x95, 0xAD, 0xCD, 0xEE, 0x37, 0xB6, 0x4A, 0xC1, 0x68, 0x2B,
+ 0x69, 0x5F, 0x46, 0x9F, 0x7D, 0x29, 0x52, 0xEF, 0x7A, 0xCF, 0xB2, 0x28, 0x8C, 0xCE, 0x3D, 0x71,
+ 0xBC, 0x0F, 0x46, 0x7F, 0xC2, 0xB9, 0x86, 0x84, 0x9B, 0x45, 0x21, 0x96, 0x01, 0x1D, 0xD7, 0x03,
+ 0x48, 0xC5, 0xBB, 0x55, 0x30, 0x18, 0x8A, 0xDA, 0xE8, 0xFA, 0x72, 0x94, 0xE0, 0xD8, 0x13, 0xF1,
+ 0x8B, 0x4C, 0xC3, 0xD5, 0x6D, 0x74, 0x92, 0xD0, 0x21, 0xDE, 0xAF, 0x38, 0x99, 0xB3, 0x7D, 0xCB,
+ 0xB3, 0xF4, 0x3C, 0xC8, 0xC3, 0xFA, 0xB6, 0x3F, 0xF8, 0x3E, 0x30, 0x82, 0x55, 0x7F, 0x64, 0x71,
+ 0xEE, 0x62, 0x6B, 0xFA, 0x1D, 0x97, 0x7E, 0xBC, 0x89, 0xCD, 0x3C, 0x72, 0x6A, 0xEA, 0xE0, 0xDE,
+ 0xB7, 0x10, 0x62, 0x16, 0x00, 0x2A, 0xD9, 0x02, 0x47, 0x51, 0xAA, 0x56, 0x8D, 0x1F, 0xC9, 0x04,
+ 0x33, 0x87, 0xE3, 0x1F, 0x0F, 0x19, 0xBC, 0x54, 0x17, 0x9A, 0x3A, 0x88, 0x48, 0x81, 0xC0, 0x68,
+ 0xC7, 0x96, 0xBB, 0xB7, 0x24, 0x7B, 0xF2, 0xA0, 0x45, 0x65, 0x30, 0x4A, 0xDA, 0x70, 0x78, 0x77,
+ 0xC8, 0x0E, 0x98, 0x7B, 0x4E, 0xC3, 0x04, 0x41, 0xDD, 0x9B, 0xA3, 0xED, 0x1A, 0x88, 0x1E, 0x2A,
+ 0xCF, 0x8A, 0xB7, 0xD7, 0x86, 0x2F, 0xC1, 0xBF, 0x67, 0xC2, 0x65, 0x70, 0xDC, 0x77, 0x7B, 0xC5,
+ 0xFA, 0x03, 0x57, 0x42, 0xAD, 0x92, 0xCF, 0xCB, 0xD0, 0x11, 0x11, 0x9E, 0x93, 0x5B, 0xCB, 0x78,
+ 0xC2, 0x55, 0xD6, 0xAD, 0x95, 0x3A, 0x45, 0x32, 0x42, 0x8F, 0xB1, 0x18, 0x17, 0xAF, 0xF2, 0x94,
+ 0x21, 0x08, 0x58, 0x13, 0x19, 0x8F, 0x12, 0x51, 0xB7, 0x95, 0x26, 0x8E, 0xD6, 0x9A, 0x82, 0x78,
+ 0x4D, 0x58, 0xEF, 0xC0, 0x89, 0x0D, 0xF7, 0xB6, 0xCF, 0x46, 0x28, 0x3C, 0x97, 0x68, 0x32, 0xC5,
+ 0x09, 0x25, 0x18, 0xE5, 0x9E, 0x74, 0x0E, 0x73, 0xD8, 0x98, 0xC6, 0x2D, 0xCA, 0xE4, 0xDF, 0x2B,
+ 0x8A, 0xE1, 0x15, 0x8D, 0x9F, 0x70, 0xC0, 0x81, 0xCC, 0x9B, 0x4B, 0x0A, 0xA5, 0x0A, 0x82, 0x5F,
+ 0xC0, 0x55, 0x73, 0x47, 0x0D, 0xEE, 0x59, 0xFD, 0xE5, 0xDD, 0x52, 0x74, 0xA2, 0x0F, 0xF1, 0xFC,
+ 0xE9, 0x14, 0x9C, 0xF7, 0x03, 0x3F, 0xC3, 0xF5, 0xFD, 0x7D, 0x1C, 0xB4, 0x62, 0x8E, 0xDD, 0x01,
+ 0x77, 0x96, 0x4D, 0x23, 0x5D, 0x37, 0x88, 0x83, 0x33, 0xB0, 0x75, 0x1E, 0x9D, 0x15, 0xB5, 0x9F,
+ 0x78, 0x04, 0x92, 0x9E, 0x54, 0x40, 0x10, 0x4E, 0xFF, 0x5B, 0xF3, 0xF8, 0xFC, 0x67, 0xEF, 0x85,
+ 0x1D, 0xFF, 0x0B, 0x2F, 0x5D, 0x54, 0xE1, 0xEA, 0x8C, 0xB8, 0x41, 0x71, 0x91, 0x2D, 0xEB, 0x14,
+ 0x78, 0x78, 0x25, 0x95, 0x73, 0x70, 0xED, 0x24, 0x2F, 0x97, 0x51, 0xE0, 0x8E, 0x6E, 0x43, 0x12,
+ 0x2B, 0xCF, 0x88, 0xDE, 0xA1, 0xB0, 0xDB, 0x7F, 0x1C, 0xA1, 0x75, 0xD9, 0x54, 0x1D, 0x9E, 0xE1,
+ 0x95, 0x68, 0x7E, 0xD4, 0x47, 0xD1, 0x42, 0x61, 0x60, 0xD9, 0xDE, 0x25, 0xC0, 0xD1, 0x5A, 0xB6,
+ 0x72, 0xF5, 0x37, 0xF8, 0x73, 0xC2, 0x05, 0xE3, 0xE1, 0x3B, 0x55, 0x29, 0xCB, 0xB0, 0x2D, 0xBD,
+ 0x6A, 0xF8, 0x67, 0xF6, 0xCD, 0x8B, 0xE3, 0x80, 0x49, 0x24, 0x38, 0x22, 0x2E, 0xA6, 0x68, 0x25,
+ 0x41, 0xCA, 0xEF, 0x0F, 0x33, 0x53, 0xC0, 0xBB, 0x74, 0xEA, 0xC6, 0xC5, 0xA5, 0x5F, 0x07, 0xE6,
+ 0x3B, 0xB4, 0xA0, 0x43, 0xFC, 0xA9, 0x28, 0x9B, 0xD2, 0x11, 0x57, 0x61, 0xD9, 0x79, 0x63, 0x5E,
+ 0x7A, 0x7E, 0x9A, 0xDF, 0x77, 0x70, 0x0E, 0x0C, 0xDA, 0xD6, 0xCE, 0x6B, 0x92, 0x71, 0x94, 0x9B,
+ 0x2B, 0xEE, 0x3B, 0x99, 0xCB, 0x82, 0x19, 0x55, 0x0E, 0x3E, 0xA3, 0xAF, 0x1D, 0xF4, 0x05, 0x1E,
+ 0x50, 0x8F, 0x0E, 0x72, 0x6E, 0x16, 0x28, 0xE3, 0xD1, 0xB2, 0x57, 0xBE, 0x54, 0x9F, 0xE8, 0x7F,
+ 0xBE, 0xC2, 0x07, 0x22, 0xD0, 0x3E, 0xE4, 0x1A, 0x50, 0xB5, 0x78, 0x48, 0x93, 0xC3, 0x7E, 0xA8,
+ 0x62, 0xD1, 0x92, 0x29, 0x52, 0x70, 0xC5, 0x62, 0x5F, 0x44, 0xE8, 0xD5, 0x27, 0x5A, 0x07, 0xBE,
+ 0xE2, 0x01, 0xCB, 0x9F, 0xFF, 0xD4, 0x02, 0x15, 0xD8, 0x9E, 0xB6, 0x19, 0x5A, 0x94, 0x2C, 0x74,
+ 0xC9, 0xEE, 0x0B, 0x0D, 0x57, 0x32, 0x0E, 0x3C, 0x75, 0xC3, 0xEE, 0xC4, 0x48, 0x13, 0xB3, 0xD1,
+ 0x5F, 0xB4, 0xAA, 0xE4, 0x6F, 0xE9, 0x98, 0xD8, 0x02, 0xF4, 0x00, 0xF5, 0xA5, 0x52, 0xED, 0x27,
+ 0x3E, 0x40, 0xB1, 0x84, 0x81, 0x3E, 0x79, 0xF0, 0xF4, 0x09, 0x34, 0x36, 0x01, 0xF3, 0xD5, 0x5D,
+ 0x68, 0xE8, 0xE0, 0xEF, 0x36, 0xA6, 0x67, 0xBA, 0xD7, 0xE2, 0xC7, 0x06, 0x6A, 0x43, 0xCD, 0xC5,
+ 0xD2, 0x78, 0x45, 0x8A, 0xE8, 0x8D, 0x5F, 0x41, 0x10, 0xCA, 0x38, 0x8B, 0x6D, 0x91, 0xF1, 0x05,
+ 0x06, 0xDE, 0x51, 0xE8, 0xF9, 0xC3, 0x68, 0xEE, 0x2D, 0x48, 0x09, 0x58, 0x2E, 0x08, 0x18, 0x0B,
+ 0xD3, 0x64, 0x6B, 0xD3, 0xB3, 0xC4, 0x66, 0xB7, 0x29, 0x4B, 0xDB, 0x47, 0x40, 0xB2, 0xC7, 0xBD,
+ 0x48, 0x21, 0xA0, 0xCF, 0xBC, 0x23, 0xA1, 0x31, 0x42, 0x48, 0x3E, 0xB2, 0xAF, 0x6F, 0x25, 0x95,
+ 0x89, 0xCC, 0x8F, 0xC0, 0x4F, 0xA6, 0x37, 0xCE, 0x0A, 0xF7, 0xF5, 0x93, 0xBE, 0x98, 0x5E, 0x5C,
+ 0x37, 0x2B, 0xBD, 0x14, 0xD3, 0xF7, 0x1F, 0x38, 0x27, 0xA8, 0xD1, 0x55, 0x18, 0xDD, 0x16, 0xF1,
+ 0x3B, 0xC1, 0x20, 0x75, 0x21, 0x30, 0x0B, 0xC3, 0xC1, 0xD9, 0x78, 0x9E, 0x7A, 0xDD, 0xD0, 0x36,
+ 0xEF, 0x97, 0xFC, 0x61, 0x45, 0x9B, 0x49, 0x8D, 0x73, 0x70, 0xC5, 0xEC, 0xB0, 0x45, 0x78, 0x09,
+ 0x85, 0x42, 0x68, 0x9F, 0x7F, 0x50, 0x35, 0xE4, 0x2A, 0x5F, 0xEB, 0x30, 0xB5, 0x01, 0x0F, 0x5B,
+ 0x2B, 0x48, 0xAE, 0xD4, 0x41, 0x00, 0x69, 0x58, 0x7D, 0xCA, 0x23, 0x0B, 0xC0, 0x32, 0xDC, 0x54,
+ 0xBA, 0x26, 0x22, 0xB5, 0xB1, 0xDB, 0xF9, 0x5E, 0x81, 0x6E, 0x48, 0xB8, 0x70, 0x66, 0xAA, 0x7E,
+ 0x6B, 0x42, 0xB4, 0x51, 0x25, 0xB5, 0x0D, 0x1B, 0x45, 0x4B, 0x6C, 0x31, 0x45, 0xA3, 0x91, 0x56,
+ 0x18, 0x2E, 0x34, 0x1A, 0x67, 0x87, 0xA8, 0xC9, 0x6B, 0x72, 0xD8, 0xE5, 0x91, 0x2D, 0x71, 0xD8,
+ 0xC8, 0xA4, 0x95, 0xB1, 0xFD, 0xF8, 0x0F, 0xEA, 0x08, 0x4F, 0x11, 0x2A, 0x39, 0xE7, 0xF6, 0x50,
+ 0xCC, 0xF7, 0x64, 0xA1, 0x66, 0xE7, 0xA9, 0xDD, 0x49, 0xAB, 0xBF, 0x5B, 0x99, 0x14, 0xE2, 0xD6,
+ 0x91, 0x3A, 0x70, 0x08, 0x67, 0x87, 0x7C, 0xB7, 0x76, 0x21, 0xE5, 0x23, 0x32, 0x9F, 0x6F, 0x88,
+ 0xBB, 0x10, 0xB6, 0xBE, 0xA2, 0xB1, 0x3E, 0xDA, 0x64, 0x5C, 0x25, 0x0B, 0x0F, 0x94, 0x39, 0x0E,
+ 0x21, 0x91, 0x01, 0x60, 0x8C, 0x9B, 0x3D, 0x9E, 0xEB, 0x3C, 0x05, 0x28, 0x66, 0x58, 0x9A, 0x7D,
+ 0xA3, 0x2C, 0x42, 0x13, 0xD7, 0x52, 0x09, 0x0A, 0x12, 0x14, 0xB1, 0x05, 0x4D, 0x7C, 0xE4, 0x04,
+ 0x2C, 0xC8, 0x93, 0x98, 0xBB, 0x90, 0x7C, 0xDE, 0x31, 0xD1, 0x21, 0x5C, 0x21, 0x75, 0x94, 0x64,
+ 0x62, 0x33, 0xB9, 0xCF, 0xD1, 0x5C, 0x77, 0xC0, 0xAB, 0x0A, 0xF8, 0x03, 0x00, 0x35, 0xA1, 0xE9,
+ 0x8D, 0xB5, 0x43, 0x6F, 0x94, 0x82, 0xAA, 0xCE, 0xB3, 0x5E, 0x6C, 0x13, 0x45, 0x6F, 0xD5, 0xE8,
+ 0x12, 0xFA, 0x4C, 0x68, 0x3D, 0x04, 0x57, 0x77, 0x87, 0x1D, 0xFC, 0xA6, 0x19, 0xC2, 0x09, 0x5B,
+ 0x65, 0xD7, 0x86, 0xE2, 0x8E, 0x14, 0x52, 0x92, 0xA5, 0xC9, 0xCA, 0xFD, 0x42, 0x54, 0x12, 0xF3,
+ 0xB9, 0x87, 0x11, 0x71, 0x70, 0x8D, 0x98, 0x85, 0xBB, 0x92, 0x36, 0x42, 0x42, 0x4F, 0x2D, 0xDB,
+ 0x8A, 0x77, 0x2A, 0x93, 0x8D, 0xF6, 0x87, 0x5D, 0x8F, 0x52, 0x91, 0x5A, 0x50, 0xC2, 0x9D, 0xE3,
+ 0x8C, 0xA6, 0xD2, 0x4C, 0xDF, 0xE6, 0xEC, 0xF7, 0x6E, 0x4C, 0xAF, 0x80, 0x28, 0xF1, 0x1A, 0x80,
+ 0x25, 0x15, 0x27, 0xFF, 0xB2, 0x6C, 0x3A, 0x49, 0xC1, 0xF4, 0x8F, 0xCD, 0x82, 0x8A, 0xC7, 0x9F,
+ 0x3D, 0x32, 0x6D, 0xDD, 0x36, 0xDB, 0x2F, 0x26, 0x60, 0x2F, 0x21, 0x91, 0xBC, 0x8C, 0x53, 0x7C,
+ 0x76, 0xEF, 0x8F, 0xE7, 0xE6, 0x1D, 0xA9, 0x32, 0x2C, 0x23, 0x81, 0xF9, 0x07, 0x88, 0xB3, 0xD7,
+ 0xBE, 0x83, 0x1A, 0xE4, 0x02, 0x5A, 0x29, 0x72, 0x73, 0x2A, 0x6A, 0xBE, 0x57, 0x3A, 0x05, 0x89,
+ 0xD1, 0xD8, 0x26, 0x9B, 0xCF, 0x01, 0x9F, 0xA4, 0xAB, 0xC1, 0x53, 0x62, 0x83, 0xE9, 0x3D, 0xE5,
+ 0x7C, 0xA4, 0x2A, 0x98, 0x95, 0x57, 0x19, 0x45, 0xE3, 0x54, 0x43, 0xD4, 0x39, 0x51, 0x3B, 0x27,
+ 0x8E, 0xB9, 0x33, 0x90, 0xEF, 0x0E, 0xAD, 0xD2, 0xE6, 0x7A, 0x2A, 0x00, 0xEB, 0x84, 0x3C, 0xE8,
+ 0x97, 0x1F, 0x0A, 0xAB, 0x56, 0x0F, 0x9D, 0xB7, 0xD1, 0x67, 0x64, 0x24, 0xF9, 0x89, 0xE1, 0xB6,
+ 0x1B, 0xEE, 0xB7, 0xA8, 0xDD, 0x03, 0x40, 0xB0, 0xEB, 0x2D, 0x29, 0x53, 0x81, 0x8B, 0x0C, 0x67,
+ 0x53, 0x5E, 0xD3, 0xD5, 0xC5, 0xE6, 0x7C, 0x12, 0xE6, 0xBB, 0x34, 0x24, 0xF1, 0x5B, 0x05, 0xBA,
+ 0x6E, 0x16, 0xA7, 0xA9, 0x31, 0xFB, 0x47, 0xE1, 0xFE, 0x67, 0x07, 0xF9, 0x96, 0x34, 0x5A, 0x3E,
+ 0x95, 0xAD, 0x64, 0x16, 0xE9, 0xD8, 0x72, 0x58, 0x90, 0x67, 0x52, 0xFE, 0x08, 0x83, 0x35, 0xEB,
+ 0x8A, 0x8C, 0xF2, 0xD0, 0xAA, 0x79, 0x42, 0x33, 0x13, 0x8D, 0x34, 0x76, 0xFD, 0x39, 0x2C, 0xEC,
+ 0xCA, 0x74, 0x07, 0xC1, 0xE2, 0x47, 0xF4, 0x5C, 0x65, 0x99, 0xE4, 0xBA, 0xC9, 0x41, 0xA4, 0x48,
+ 0x51, 0xEF, 0x99, 0x5E, 0x99, 0x4F, 0x74, 0x56, 0x4C, 0xA6, 0xFA, 0xC7, 0x4C, 0xC2, 0xAD, 0xA4,
+ 0x3C, 0xF6, 0xD4, 0x8C, 0xB6, 0x91, 0x6B, 0xB4, 0xCE, 0xFB, 0x34, 0xF7, 0xE3, 0xF6, 0x11, 0xE2,
+ 0x56, 0x3E, 0xA2, 0x60, 0xA3, 0x47, 0x59, 0x3E, 0xDF, 0x6A, 0x13, 0xB8, 0xED, 0x03, 0x8B, 0x54,
+ 0x12, 0xD1, 0x29, 0xFD, 0x06, 0x26, 0x03, 0xF5, 0x25, 0x69, 0x05, 0x6D, 0x73, 0xE6, 0x1D, 0x28,
+ 0xC0, 0x6F, 0x75, 0x67, 0xCE, 0xC4, 0xF7, 0x31, 0xBB, 0x21, 0x61, 0xB1, 0xC4, 0x5D, 0x36, 0x50,
+ 0xEC, 0xBE, 0x23, 0xEE, 0x47, 0x62, 0x82, 0x6B, 0xE9, 0x79, 0xCE, 0xAF, 0x76, 0x6A, 0xD1, 0xFC,
+ 0x79, 0x5E, 0xE8, 0x1E, 0xD8, 0x8F, 0xF9, 0x63, 0x5F, 0x09, 0x1A, 0x21, 0x93, 0x09, 0x90, 0x15,
+ 0x62, 0xDE, 0x69, 0x65, 0x8D, 0xA3, 0xAC, 0x79, 0x71, 0xA1, 0xBB, 0xA9, 0xCF, 0x45, 0x89, 0x15,
+ 0x1B, 0x7D, 0x49, 0x37, 0x56, 0x2D, 0x52, 0xF1, 0x66, 0x8F, 0x03, 0xA1, 0xE3, 0x93, 0x8C, 0xAC,
+ 0xB3, 0x77, 0x89, 0x69, 0x41, 0x23, 0xE4, 0x17, 0xEE, 0x8E, 0x73, 0x06, 0xE4, 0xDC, 0x95, 0x49,
+ 0xA6, 0x30, 0xCD, 0x1B, 0x30, 0x42, 0xD9, 0x06, 0xF9, 0x5C, 0x8A, 0x50, 0xBB, 0xA0, 0xA8, 0xEF,
+ 0xD3, 0xA1, 0x83, 0xF1, 0xC1, 0x77, 0x4C, 0x4B, 0x7B, 0xCC, 0xEF, 0xE4, 0xB4, 0x4D, 0x50, 0x01,
+ 0x1B, 0x44, 0x33, 0xFD, 0xEF, 0xB5, 0x10, 0x72, 0x92, 0x3E, 0x96, 0x61, 0xAB, 0x20, 0x7C, 0x38,
+ 0xCB, 0xD7, 0x79, 0xA3, 0x7A, 0x35, 0x87, 0xFA, 0xC6, 0x5E, 0xB8, 0x9E, 0x2C, 0xE5, 0x96, 0xBA,
+ 0x6E, 0xF1, 0xC3, 0x63, 0x92, 0x65, 0xEE, 0x05, 0x5B, 0x13, 0xFA, 0xE8, 0x8B, 0xE7, 0xCB, 0x73,
+ 0xB9, 0xC9, 0x0F, 0x60, 0xC6, 0x36, 0x1D, 0x8F, 0x9C, 0xC0, 0x83, 0x1A, 0xB4, 0x34, 0xDE, 0xF6,
+ 0x13, 0x4E, 0x58, 0x15, 0x3D, 0xD6, 0x21, 0x5F, 0xE6, 0x21, 0x25, 0x15, 0x07, 0xEF, 0xD7, 0x06,
+ 0x5D, 0x9A, 0x59, 0xC2, 0x9F, 0x2D, 0x5A, 0xE4, 0x21, 0x19, 0x02, 0xF2, 0x01, 0x5E, 0xC2, 0x80,
+ 0xAB, 0x8D, 0x96, 0x38, 0x0F, 0x43, 0x71, 0x61, 0x17, 0x72, 0x1E, 0x16, 0x3E, 0x4B, 0xE1, 0xA0,
+ 0xB5, 0x22, 0xFB, 0x74, 0xED, 0x4F, 0xEF, 0x4E, 0x56, 0x8A, 0x52, 0x5D, 0x76, 0x60, 0x9D, 0xE2,
+ 0x8B, 0xC0, 0xEC, 0xF3, 0x05, 0x2F, 0x59, 0xE5, 0xC0, 0x68, 0x02, 0xE9, 0x77, 0x17, 0x86, 0x7D,
+ 0xC6, 0x71, 0xA7, 0xF1, 0x44, 0x50, 0xB3, 0xFB, 0xB6, 0x27, 0x23, 0x57, 0x5E, 0xCA, 0x18, 0xAA,
+ 0xA7, 0x7C, 0xCD, 0xE7, 0xEA, 0xB9, 0xA9, 0xB8, 0xA0, 0x99, 0xF0, 0xED, 0xF1, 0xF8, 0x4D, 0x11,
+ 0xFA, 0x04, 0x75, 0xA7, 0x41, 0xC5, 0xB3, 0xFB, 0x37, 0x46, 0x14, 0xBF, 0x89, 0xAB, 0x33, 0x55,
+ 0x86, 0x92, 0x36, 0x2F, 0xF6, 0xF1, 0x7B, 0x60, 0x8D, 0xA9, 0x85, 0x48, 0xF5, 0x49, 0x46, 0xD9,
+ 0xB3, 0x18, 0xB9, 0x1E, 0x3F, 0x09, 0x87, 0x33, 0x23, 0x72, 0xE8, 0x4F, 0x48, 0xC9, 0xD7, 0x30,
+ 0x1C, 0xF0, 0x7B, 0x88, 0xF9, 0xAE, 0x5C, 0x23, 0x42, 0xC8, 0x3D, 0xD4, 0xA4, 0xA9, 0x8F, 0xBA,
+ 0x9E, 0xFD, 0x6F, 0xC7, 0x10, 0x4F, 0xFD, 0xA5, 0xAC, 0xA4, 0xBF, 0xDB, 0x1D, 0xFB, 0x67, 0xAA,
+ 0x47, 0xE1, 0x8E, 0x47, 0xCC, 0x51, 0xE3, 0xAD, 0x80, 0x63, 0x2A, 0x5A, 0xEF, 0x3B, 0x6B, 0x7E,
+ 0x5B, 0xC6, 0x6F, 0x84, 0x3E, 0xD9, 0xAE, 0x3A, 0x7B, 0x2F, 0xED, 0x23, 0x57, 0x56, 0x59, 0x5A,
+ 0x35, 0x11, 0x0D, 0xFD, 0x43, 0x06, 0x6C, 0xB3, 0x26, 0xDA, 0xB4, 0xEA, 0x84, 0x94, 0xB8, 0x4F,
+ 0x60, 0xAC, 0x3F, 0x2E, 0x9D, 0xF0, 0x1B, 0xD5, 0xCA, 0xF6, 0x97, 0x82, 0x7A, 0x45, 0x76, 0xCC,
+ 0xF2, 0x63, 0x3E, 0xED, 0x80, 0x63, 0xB2, 0x1E, 0x18, 0x21, 0x85, 0x84, 0x89, 0xF8, 0xB0, 0x31,
+ 0x4F, 0x12, 0x76, 0x8E, 0x3B, 0x32, 0x54, 0x57, 0x95, 0x26, 0x0E, 0xB0, 0x28, 0x65, 0xC3, 0x31,
+ 0x18, 0x5B, 0xD1, 0x8E, 0x32, 0x53, 0x40, 0x57, 0xD5, 0x90, 0x16, 0xE6, 0x23, 0xAE, 0xAF, 0x59,
+ 0xD1, 0x8B, 0xDC, 0x3D, 0x34, 0xA5, 0x56, 0xCA, 0x61, 0xF2, 0xEE, 0xF4, 0xD2, 0x67, 0x82, 0x54,
+ 0x5F, 0x5A, 0x05, 0x94, 0x24, 0xDF, 0xD9, 0xE3, 0x72, 0x20, 0x30, 0x6C, 0x58, 0x25, 0x66, 0x12,
+ 0x81, 0x75, 0x46, 0x51, 0xAB, 0xCB, 0x0F, 0xEC, 0x77, 0x84, 0x3D, 0xB1, 0xA7, 0x4A, 0xF5, 0x35,
+ 0xAF, 0xF2, 0x01, 0x6C, 0x7F, 0x42, 0xA9, 0x28, 0x76, 0xE4, 0x6E, 0xF2, 0x4B, 0x7E, 0xD0, 0x7D,
+ 0x57, 0x2E, 0x25, 0x4F, 0x90, 0x8A, 0x74, 0xB2, 0x87, 0x4C, 0x9C, 0x75, 0x5A, 0xBE, 0xEF, 0x46,
+ 0xA1, 0x0D, 0x20, 0xF5, 0x94, 0x7A, 0xA7, 0x72, 0x0A, 0x6E, 0xBC, 0x80, 0x01, 0x14, 0x02, 0x00,
+ 0x00, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x0D, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x0D, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x0D, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x0D, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x0D, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0D, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0D, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0D, 0x63, 0x6C, 0x65, 0x61, 0x72, 0x74, 0x6F,
+ 0x6D, 0x61, 0x72, 0x6B, 0x0D, 0x80, 0x03,
+};
diff --git a/core/src/fxge/fontdata/chromefontdata/FoxitSerif.c b/core/src/fxge/fontdata/chromefontdata/FoxitSerif.c
new file mode 100644
index 0000000000..ccb12ed346
--- /dev/null
+++ b/core/src/fxge/fontdata/chromefontdata/FoxitSerif.c
@@ -0,0 +1,2442 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+const unsigned char g_FoxitSerifFontData [19469] = {0x1,
+ 0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0xe,
+ 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x72,
+ 0x69, 0x66, 0x4f, 0x54, 0x46, 0x0, 0x1, 0x1,
+ 0x1, 0x26, 0xf8, 0x10, 0x0, 0xf8, 0x1c, 0x1,
+ 0xf8, 0x1d, 0x2, 0xf8, 0x1d, 0x3, 0xf8, 0x18,
+ 0x4, 0xfb, 0x3c, 0xfb, 0x8e, 0xfa, 0x7c, 0xfa,
+ 0x2, 0x5, 0x1c, 0x7, 0x9f, 0xf, 0x1c, 0x8,
+ 0xf6, 0x11, 0xb6, 0x1c, 0x44, 0xa3, 0x12, 0x0,
+ 0x3, 0x1, 0x1, 0x5, 0x2f, 0x3e, 0x45, 0x75,
+ 0x72, 0x6f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x43, 0x68, 0x72, 0x6f,
+ 0x6d, 0x20, 0x53, 0x65, 0x72, 0x69, 0x66, 0x20,
+ 0x4f, 0x54, 0x46, 0x0, 0x7b, 0x2, 0x0, 0x1,
+ 0x0, 0x9, 0x0, 0x11, 0x0, 0x24, 0x0, 0x2c,
+ 0x0, 0x4a, 0x0, 0x54, 0x0, 0x60, 0x0, 0x68,
+ 0x0, 0x71, 0x0, 0x86, 0x0, 0x91, 0x0, 0x9e,
+ 0x0, 0xb9, 0x0, 0xc1, 0x0, 0xe2, 0x0, 0xff,
+ 0x1, 0xb, 0x1, 0x1d, 0x1, 0x25, 0x1, 0x33,
+ 0x1, 0x4e, 0x1, 0x55, 0x1, 0x68, 0x1, 0x7a,
+ 0x1, 0x7f, 0x1, 0x90, 0x1, 0x94, 0x1, 0x9d,
+ 0x1, 0xa9, 0x1, 0xb9, 0x1, 0xc6, 0x1, 0xfb,
+ 0x2, 0x14, 0x2, 0x1a, 0x2, 0x34, 0x2, 0x3c,
+ 0x2, 0x48, 0x2, 0x59, 0x2, 0x63, 0x2, 0x71,
+ 0x2, 0x84, 0x2, 0x89, 0x2, 0x92, 0x2, 0xac,
+ 0x2, 0xb6, 0x2, 0xc2, 0x2, 0xe6, 0x2, 0xf0,
+ 0x2, 0xfe, 0x3, 0x11, 0x3, 0x19, 0x3, 0x20,
+ 0x3, 0x23, 0x3, 0x2a, 0x3, 0x49, 0x3, 0x53,
+ 0x3, 0x71, 0x3, 0x8e, 0x3, 0x9c, 0x3, 0xa2,
+ 0x3, 0xa8, 0x3, 0xc0, 0x3, 0xd8, 0x3, 0xef,
+ 0x3, 0xf7, 0x3, 0xfe, 0x4, 0x2, 0x4, 0x17,
+ 0x4, 0x2a, 0x4, 0x30, 0x4, 0x44, 0x4, 0x57,
+ 0x4, 0x62, 0x4, 0x69, 0x4, 0x7b, 0x4, 0x87,
+ 0x4, 0x98, 0x4, 0xa3, 0x4, 0xb3, 0x4, 0xb9,
+ 0x4, 0xbf, 0x4, 0xc5, 0x4, 0xcb, 0x4, 0xd8,
+ 0x4, 0xe7, 0x4, 0xf1, 0x4, 0xfb, 0x5, 0xa,
+ 0x5, 0x19, 0x5, 0x22, 0x5, 0x28, 0x5, 0x2d,
+ 0x5, 0x3b, 0x5, 0x3f, 0x5, 0x4c, 0x5, 0x59,
+ 0x5, 0x5e, 0x5, 0x62, 0x5, 0x6e, 0x5, 0x74,
+ 0x5, 0x77, 0x5, 0x82, 0x5, 0x8d, 0x5, 0x94,
+ 0x5, 0x99, 0x5, 0x9e, 0x5, 0xa3, 0x5, 0xad,
+ 0x5, 0xb7, 0x5, 0xc1, 0x5, 0xcb, 0x5, 0xd3,
+ 0x5, 0xdc, 0x5, 0xe5, 0x5, 0xee, 0x5, 0xf7,
+ 0x6, 0x0, 0x6, 0x5, 0x6, 0xc, 0x6, 0x12,
+ 0x6, 0x18, 0x6, 0x1d, 0x6, 0x21, 0x21, 0xa,
+ 0x78, 0x5f, 0x6c, 0x2a, 0x1d, 0xb, 0x15, 0xb3,
+ 0x6, 0xf7, 0x2e, 0x22, 0x1d, 0xb, 0xec, 0x5,
+ 0x95, 0x91, 0x9f, 0x98, 0xa2, 0x1a, 0x8f, 0x8a,
+ 0xa7, 0x6b, 0x7d, 0x84, 0x8b, 0x74, 0x74, 0x1e,
+ 0xb, 0x36, 0x1d, 0x26, 0xa, 0x3e, 0x7a, 0xa,
+ 0xb, 0x70, 0x1d, 0x88, 0x7f, 0x6c, 0x7c, 0x1e,
+ 0x86, 0x82, 0x6c, 0x74, 0x75, 0x1b, 0x66, 0x6e,
+ 0xaa, 0xba, 0x1f, 0x8d, 0x7, 0xad, 0x96, 0xc3,
+ 0xf7, 0x2b, 0xbd, 0x1e, 0x2a, 0xa, 0xb, 0x2b,
+ 0x1d, 0xfb, 0x11, 0xf7, 0x3b, 0x5, 0x4d, 0x6,
+ 0xb, 0x37, 0x1d, 0x4e, 0xfb, 0x4d, 0xfb, 0x22,
+ 0xd7, 0x39, 0x2b, 0xa, 0xb, 0x2d, 0xa, 0x8a,
+ 0x81, 0x1d, 0x9c, 0x57, 0xa, 0x24, 0x1d, 0x40,
+ 0xa, 0xef, 0xfb, 0x29, 0x1e, 0xb, 0x70, 0xa,
+ 0xfb, 0x1f, 0x69, 0x1d, 0xf7, 0xf, 0x61, 0x1d,
+ 0xf7, 0x10, 0x34, 0xa, 0x32, 0x71, 0x1d, 0x3a,
+ 0x5e, 0xa, 0xb, 0x4c, 0x74, 0x72, 0x19, 0x79,
+ 0x78, 0x7a, 0x7f, 0x2e, 0xa, 0xb, 0x15, 0xad,
+ 0x6, 0xf7, 0xd, 0xf2, 0xf7, 0xe, 0x24, 0x5,
+ 0xad, 0x6, 0xb, 0x6d, 0x1b, 0x49, 0x82, 0xc9,
+ 0x99, 0x1f, 0xf7, 0xda, 0xfb, 0x26, 0x7d, 0x7,
+ 0xa9, 0x89, 0xab, 0x7f, 0x4f, 0x1a, 0xfb, 0x86,
+ 0x7, 0x21, 0xd9, 0x73, 0xb4, 0xb, 0x2e, 0x1d,
+ 0x9e, 0xfb, 0x7c, 0x50, 0x1d, 0xb, 0x15, 0xd7,
+ 0x86, 0x99, 0x76, 0x41, 0x1a, 0xfb, 0xc2, 0x7,
+ 0x4f, 0x8b, 0xfb, 0x57, 0xf7, 0x8c, 0xf7, 0x97,
+ 0x8b, 0xf7, 0x50, 0xdb, 0x1e, 0xf7, 0x8f, 0x7,
+ 0xf4, 0x9c, 0xa4, 0xd8, 0x93, 0x1e, 0xb, 0xa8,
+ 0xf7, 0x78, 0x15, 0xfb, 0x1b, 0xe5, 0x24, 0x65,
+ 0x1d, 0xf7, 0x1f, 0xee, 0xf7, 0x25, 0x2d, 0xe2,
+ 0xfb, 0x17, 0xfb, 0x1a, 0x39, 0xfb, 0x1, 0xfb,
+ 0xf, 0x1e, 0xe5, 0xb, 0x5b, 0xa, 0xf7, 0x6a,
+ 0x77, 0x85, 0xa, 0xf7, 0xe6, 0x29, 0x1d, 0xb,
+ 0x9b, 0x16, 0xf7, 0x81, 0x9a, 0x6, 0x46, 0x8f,
+ 0x86, 0xa6, 0xcd, 0x1a, 0xf7, 0xed, 0x7, 0x87,
+ 0x8e, 0xb, 0x2d, 0x1d, 0x4f, 0x3f, 0xfb, 0x13,
+ 0x49, 0x1d, 0xa0, 0x1e, 0xf7, 0x1b, 0x4e, 0xa,
+ 0x6, 0x88, 0xf7, 0x23, 0x5, 0xfc, 0xa7, 0xb,
+ 0x8c, 0xa, 0x86, 0x83, 0x70, 0x75, 0x1e, 0x7f,
+ 0x7c, 0x70, 0x7e, 0x75, 0x1b, 0x66, 0x6e, 0xaa,
+ 0xba, 0xaf, 0x96, 0xc3, 0xf7, 0x2b, 0xbd, 0x1f,
+ 0x4d, 0xa, 0xb, 0x7d, 0x1d, 0xa1, 0xa1, 0x3d,
+ 0xa, 0xb, 0x39, 0x1d, 0x8b, 0xdc, 0x1f, 0xf7,
+ 0x65, 0x7, 0xf7, 0x24, 0x89, 0xde, 0x8a, 0xa4,
+ 0x7d, 0x97, 0x3b, 0x19, 0xb, 0xe9, 0xf7, 0x9f,
+ 0x15, 0xf7, 0xcb, 0x6, 0xf7, 0x17, 0x80, 0x44,
+ 0xc9, 0x2d, 0x1b, 0x3b, 0xfb, 0x10, 0xb, 0x8d,
+ 0x1b, 0x39, 0xa, 0xb, 0xb8, 0xf7, 0x3d, 0x5,
+ 0x6f, 0x6, 0x26, 0x5f, 0x59, 0x6d, 0xfb, 0x11,
+ 0x1b, 0xfb, 0x29, 0x8b, 0xb, 0x3b, 0x1d, 0xa2,
+ 0xb, 0x15, 0xb3, 0x6, 0xfb, 0x27, 0xf7, 0x28,
+ 0x5, 0xb, 0xaa, 0xb1, 0x37, 0xa, 0xbf, 0x89,
+ 0xa, 0xbd, 0xac, 0xb0, 0x1e, 0xb, 0x8e, 0xab,
+ 0x15, 0xe3, 0x9b, 0xb2, 0xb0, 0xc2, 0x1b, 0xda,
+ 0x95, 0x3e, 0x5b, 0x92, 0x1f, 0xb, 0xfb, 0x8,
+ 0x5c, 0x44, 0x57, 0x1d, 0x1f, 0x94, 0x86, 0x9a,
+ 0x9a, 0x1a, 0xb, 0x3, 0x94, 0x16, 0xf8, 0xc8,
+ 0x6, 0xa3, 0xf7, 0x44, 0x5, 0x74, 0x6, 0x42,
+ 0x75, 0x6e, 0x4a, 0xfb, 0x17, 0x1b, 0xfb, 0x8b,
+ 0x6, 0xf8, 0x44, 0xf8, 0xf5, 0x5, 0x9a, 0xfc,
+ 0xa2, 0x7, 0x77, 0xfb, 0x3f, 0x5, 0xa5, 0x6,
+ 0xce, 0x98, 0xa1, 0xcd, 0xf7, 0x23, 0x1b, 0xf7,
+ 0x67, 0x6, 0xfc, 0x49, 0xfc, 0xf5, 0x5, 0xb,
+ 0xf7, 0xb3, 0xf7, 0x9, 0x15, 0x3b, 0xa, 0xf7,
+ 0x6, 0xfb, 0x80, 0x18, 0x99, 0x6c, 0xbb, 0x2f,
+ 0x7c, 0x1a, 0x7b, 0x63, 0xfb, 0x1e, 0x57, 0x1e,
+ 0xb, 0xa7, 0xa7, 0x76, 0x55, 0x1d, 0xb, 0x15,
+ 0x6d, 0xb9, 0xf7, 0x2c, 0xfb, 0x38, 0x98, 0x1b,
+ 0x91, 0x90, 0x8f, 0x92, 0x98, 0x6f, 0xb3, 0x79,
+ 0xa3, 0x1f, 0x75, 0xa9, 0x64, 0xb7, 0x75, 0xa9,
+ 0xb, 0x65, 0xad, 0x4d, 0x1d, 0x72, 0x99, 0xa,
+ 0xb, 0xfb, 0x7a, 0x1e, 0xf7, 0x6, 0x8c, 0x15,
+ 0xf7, 0x78, 0xf7, 0x3, 0xb, 0x7a, 0xae, 0x1f,
+ 0x7d, 0xa8, 0xa0, 0x7c, 0x52, 0x1d, 0x63, 0x7a,
+ 0x7d, 0x81, 0x70, 0x1b, 0x7c, 0xb, 0x3c, 0xa,
+ 0xae, 0x7e, 0xa5, 0x92, 0x91, 0x88, 0x1d, 0xb,
+ 0xfc, 0x2a, 0x35, 0xa, 0xfb, 0x87, 0x7, 0x6e,
+ 0x73, 0x7c, 0x6e, 0x89, 0x1e, 0xb, 0x51, 0xa,
+ 0x6a, 0x98, 0x71, 0x84, 0x83, 0x87, 0x8a, 0x88,
+ 0x1e, 0x8a, 0x87, 0x88, 0x8a, 0x89, 0x64, 0xa,
+ 0xb, 0x47, 0xa, 0x88, 0xa, 0xe, 0x15, 0x43,
+ 0xa, 0xf7, 0x5c, 0x16, 0x43, 0xa, 0xe, 0x9e,
+ 0xfb, 0x6f, 0x78, 0x7, 0xaa, 0xb1, 0x89, 0x75,
+ 0x1d, 0xfb, 0x76, 0xfb, 0x28, 0xf7, 0x72, 0x75,
+ 0xa, 0x8c, 0xb9, 0x8d, 0x1e, 0x9e, 0xfb, 0xac,
+ 0xb, 0x1, 0xa8, 0xe5, 0xf7, 0x99, 0xe5, 0x3,
+ 0x2f, 0x1d, 0xb, 0x7b, 0xa0, 0xa0, 0xae, 0x9c,
+ 0xb0, 0xaa, 0x71, 0xa5, 0x6d, 0x6d, 0xb, 0xb1,
+ 0xa5, 0xa1, 0xa5, 0xab, 0x1a, 0xa8, 0x6f, 0xbf,
+ 0x37, 0x5f, 0x55, 0x75, 0x42, 0x69, 0x1e, 0xa4,
+ 0x79, 0x5, 0xa4, 0x9d, 0x9f, 0xab, 0xbb, 0x1b,
+ 0xb5, 0x9a, 0x73, 0x71, 0x65, 0x5c, 0x72, 0x50,
+ 0x79, 0x1f, 0xe, 0xe2, 0x81, 0xc5, 0xf7, 0x95,
+ 0xf7, 0x2f, 0x73, 0xa3, 0xb, 0x78, 0x7, 0xd1,
+ 0x87, 0xa3, 0x70, 0x20, 0x1a, 0xfb, 0x98, 0x7,
+ 0xfb, 0x1f, 0xb, 0x7e, 0x1b, 0x85, 0x86, 0x87,
+ 0x84, 0x7e, 0xa7, 0x63, 0x9d, 0x73, 0x1f, 0xa1,
+ 0x6d, 0xb2, 0x5f, 0xa1, 0x6d, 0xb, 0xaa, 0x1b,
+ 0xd9, 0x9d, 0xd3, 0x65, 0xa, 0xb, 0x8d, 0x99,
+ 0x1b, 0x9b, 0x9e, 0x8a, 0xb, 0x33, 0xa, 0xe,
+ 0xa1, 0x6f, 0x6f, 0x76, 0x62, 0x1d, 0xb, 0x6,
+ 0xf7, 0xa1, 0xf8, 0x29, 0x5, 0x9a, 0xfb, 0xef,
+ 0x7, 0x88, 0xfb, 0xa, 0x5, 0x9d, 0x6, 0xc1,
+ 0x92, 0x99, 0xad, 0xd4, 0x1b, 0xf7, 0x14, 0x6,
+ 0xfb, 0x9e, 0xfc, 0x29, 0x5, 0xb, 0x63, 0x7b,
+ 0x97, 0x6f, 0xaa, 0xa5, 0x9e, 0xa1, 0xa0, 0xb,
+ 0xf7, 0x1, 0x3, 0x9b, 0x16, 0xf7, 0xb0, 0x6,
+ 0xf7, 0xc6, 0xda, 0xf7, 0x58, 0xf7, 0x19, 0xf7,
+ 0x74, 0xfb, 0x33, 0xf7, 0x1, 0xfb, 0x84, 0x1f,
+ 0xfb, 0xa2, 0x78, 0x6, 0xd8, 0xb, 0x5, 0x76,
+ 0x6, 0x6a, 0x83, 0x60, 0x8b, 0x86, 0x75, 0x54,
+ 0xac, 0x32, 0x1b, 0xfb, 0x40, 0xfb, 0x3c, 0xfb,
+ 0xd, 0xfb, 0x74, 0xfb, 0x8d, 0xf7, 0x41, 0x2b,
+ 0xf7, 0x35, 0xb, 0x7b, 0xa, 0xf7, 0x17, 0x77,
+ 0xdd, 0x77, 0xf7, 0x8, 0xb4, 0xf7, 0x94, 0xb1,
+ 0xb, 0x80, 0x1d, 0xf7, 0x6c, 0xb4, 0xb, 0x5b,
+ 0x1d, 0xf8, 0x35, 0x77, 0xb, 0xf1, 0x3, 0x97,
+ 0x16, 0xf8, 0xae, 0x6, 0xbb, 0xf7, 0x42, 0x5,
+ 0x72, 0x6, 0xfb, 0x17, 0x52, 0x4b, 0x87, 0xfb,
+ 0x2a, 0x1b, 0x38, 0x79, 0xb, 0x78, 0x7, 0xb8,
+ 0x87, 0x9a, 0x88, 0xf1, 0xfb, 0x2a, 0xf7, 0x17,
+ 0xfb, 0x54, 0x18, 0xfb, 0x38, 0x7, 0x3f, 0x88,
+ 0x6a, 0x29, 0x89, 0x1e, 0xb, 0x6b, 0xac, 0xa7,
+ 0x80, 0xb3, 0x1b, 0xf7, 0x1f, 0xd2, 0xf7, 0x20,
+ 0xf7, 0x7, 0xf7, 0x19, 0x3f, 0xdd, 0x32, 0x3e,
+ 0x5d, 0x5a, 0x6f, 0xb, 0x9f, 0xd9, 0x1a, 0xf8,
+ 0x3c, 0x7, 0xdb, 0xb, 0xf7, 0x69, 0xf7, 0x7a,
+ 0xfb, 0x37, 0xb, 0x75, 0x6f, 0x1e, 0xb, 0x7d,
+ 0x94, 0x5, 0x58, 0x69, 0x66, 0x60, 0x43, 0x1b,
+ 0x37, 0x46, 0xd7, 0xf7, 0x7, 0xf7, 0x27, 0xe7,
+ 0xaa, 0xb0, 0xc0, 0xb, 0x15, 0x6f, 0xa2, 0x74,
+ 0xa7, 0xa7, 0xa2, 0xa2, 0xa7, 0xa7, 0x74, 0xa2,
+ 0x6f, 0x6f, 0x74, 0x74, 0x6f, 0x1e, 0xe, 0xf7,
+ 0x15, 0xf7, 0x2c, 0xd1, 0xb, 0x7, 0x89, 0xa3,
+ 0x9e, 0x8a, 0xa3, 0x1b, 0xf4, 0xcb, 0x9d, 0xb4,
+ 0xb6, 0x1f, 0x9c, 0x9b, 0xb7, 0xb4, 0xd9, 0x1a,
+ 0xb, 0x7, 0xd2, 0x97, 0xa2, 0xd7, 0x91, 0x1e,
+ 0x9e, 0xfb, 0xaa, 0x78, 0x7, 0xd5, 0x85, 0x99,
+ 0x77, 0x41, 0x1a, 0xb, 0x15, 0xbc, 0x6, 0xf8,
+ 0x56, 0xf9, 0x46, 0x5, 0x5d, 0x6, 0xb, 0xf7,
+ 0x49, 0xf7, 0x49, 0xf7, 0x26, 0xb, 0x70, 0xa1,
+ 0x75, 0xa6, 0xa6, 0xa2, 0xa1, 0xa6, 0xa6, 0x74,
+ 0xa2, 0x70, 0x70, 0x75, 0x74, 0x70, 0x1e, 0xb,
+ 0x5b, 0x7a, 0x5a, 0x7d, 0x5b, 0x6f, 0x1d, 0x91,
+ 0x95, 0x82, 0xa, 0xb, 0x6f, 0xa1, 0x7d, 0x1d,
+ 0xa2, 0xa1, 0xa7, 0xa7, 0x74, 0xa2, 0x6f, 0x6f,
+ 0x75, 0x74, 0x6f, 0x1e, 0xb, 0x6f, 0xa0, 0x76,
+ 0x9a, 0x1d, 0x95, 0x1d, 0x74, 0x6f, 0x1e, 0xb,
+ 0x6f, 0xa1, 0x7d, 0x1d, 0x9f, 0xa1, 0xa7, 0xa7,
+ 0x77, 0xa1, 0x6f, 0x6f, 0x75, 0x62, 0x1d, 0xb,
+ 0x7e, 0x19, 0x7b, 0x7, 0x8c, 0xb, 0x15, 0xfb,
+ 0x1b, 0x7, 0x6d, 0xb, 0xfb, 0x78, 0xfb, 0x70,
+ 0x25, 0xb, 0xfb, 0x3, 0xfb, 0x3, 0x25, 0xb,
+ 0xa4, 0x9c, 0xcf, 0x8f, 0x1e, 0x9e, 0xfb, 0xae,
+ 0x78, 0x7, 0x60, 0xa, 0xb, 0xfb, 0x23, 0xfb,
+ 0x2c, 0xfb, 0x1a, 0x8b, 0x66, 0x76, 0x77, 0x8c,
+ 0x8d, 0x78, 0x1e, 0xe, 0x6c, 0x7d, 0x84, 0x7f,
+ 0x84, 0x80, 0x1f, 0xfb, 0x23, 0xb, 0x81, 0xc7,
+ 0xf8, 0x24, 0x77, 0xf7, 0x8c, 0x90, 0xa, 0xb,
+ 0x6d, 0x6c, 0x43, 0x44, 0xfb, 0xf, 0x1b, 0xfb,
+ 0x12, 0xfb, 0xb, 0xe2, 0xf7, 0x68, 0xb, 0xbc,
+ 0xac, 0x69, 0xb7, 0x1b, 0xa6, 0x9e, 0x9c, 0xa5,
+ 0xa5, 0x78, 0x9c, 0x70, 0x1f, 0xb, 0xc2, 0xb8,
+ 0xb7, 0xc2, 0xc2, 0x5e, 0xb8, 0x54, 0xb, 0x76,
+ 0xf9, 0x46, 0x77, 0x1, 0xb, 0x1, 0xad, 0xf7,
+ 0x6, 0xb, 0x8f, 0x78, 0x1b, 0x2a, 0x60, 0x49,
+ 0x53, 0x41, 0xc2, 0x66, 0xc9, 0x68, 0x1f, 0xb,
+ 0x75, 0xa7, 0xa7, 0xb, 0x7, 0xf7, 0x28, 0xf7,
+ 0x76, 0xd0, 0xf5, 0xac, 0x8f, 0xaf, 0x8f, 0x19,
+ 0xb, 0xb6, 0x1b, 0xbd, 0xa1, 0x5c, 0x6d, 0x6d,
+ 0x6c, 0x59, 0x59, 0x53, 0x1f, 0xb, 0xf8, 0x1,
+ 0xa0, 0x76, 0xb, 0x6e, 0x89, 0x76, 0xb, 0x66,
+ 0x88, 0x1e, 0x7c, 0xf7, 0x64, 0x9a, 0x7, 0x5a,
+ 0x8f, 0x7f, 0xb, 0x15, 0xa8, 0x6, 0x9c, 0x91,
+ 0xb, 0x87, 0x1e, 0xe, 0xbb, 0xf7, 0xca, 0xc3,
+ 0x12, 0xf7, 0x51, 0xd7, 0x54, 0xdc, 0xb, 0xf7,
+ 0x69, 0x5, 0x76, 0x6, 0x80, 0x89, 0x7c, 0x74,
+ 0x6f, 0xb, 0xe2, 0x81, 0xd0, 0xf7, 0x64, 0xab,
+ 0xb, 0x8f, 0x8c, 0x8e, 0x1e, 0xb, 0x1a, 0xfc,
+ 0x3c, 0x7, 0xb, 0x76, 0xf9, 0x2a, 0x77, 0xb,
+ 0x2e, 0x6f, 0x1e, 0xa4, 0x7d, 0x5, 0xb2, 0x9b,
+ 0xa7, 0xb, 0xf7, 0x63, 0x98, 0x76, 0xf8, 0x9e,
+ 0x77, 0x1, 0xa7, 0xb, 0xb6, 0x28, 0xee, 0xef,
+ 0xb6, 0xee, 0xd9, 0xda, 0x60, 0xb, 0xfb, 0x58,
+ 0x76, 0xf7, 0x63, 0xab, 0xf8, 0xe, 0xc7, 0xb,
+ 0x85, 0x1a, 0x84, 0x8e, 0x87, 0x93, 0x1e, 0xe,
+ 0x73, 0xfb, 0x30, 0x76, 0xf9, 0xe9, 0x77, 0x1,
+ 0xb, 0x73, 0xf8, 0x5a, 0x76, 0xf7, 0x87, 0x77,
+ 0x1, 0xb, 0x73, 0xf8, 0xa4, 0x76, 0xf7, 0x3f,
+ 0x77, 0x1, 0xb, 0x73, 0xfb, 0x30, 0xa4, 0xf9,
+ 0x94, 0xa4, 0x1, 0xb, 0xa8, 0x73, 0xa3, 0x6e,
+ 0x6e, 0x74, 0x73, 0x6e, 0xb, 0xa1, 0x3d, 0xa,
+ 0x77, 0xb, 0x1a, 0x92, 0x88, 0x8f, 0x83, 0x1e,
+ 0xe, 0xf7, 0x1f, 0xe8, 0xf7, 0x1f, 0xb, 0xfb,
+ 0x13, 0xfb, 0x42, 0x8b, 0xb, 0xf7, 0x5b, 0xa0,
+ 0x76, 0xb, 0xa7, 0xa7, 0xa0, 0xb, 0x1, 0x0,
+ 0x1, 0x6, 0x0, 0x68, 0x0, 0x0, 0x9, 0x37,
+ 0x0, 0x7c, 0x0, 0x0, 0x42, 0x20, 0x0, 0x67,
+ 0x0, 0x0, 0x64, 0x0, 0x0, 0xa0, 0x0, 0x0,
+ 0x66, 0x0, 0x0, 0x83, 0x0, 0x0, 0xaa, 0x0,
+ 0x0, 0x8b, 0x0, 0x0, 0x6a, 0x0, 0x0, 0x97,
+ 0x0, 0x0, 0xa5, 0x0, 0x0, 0x80, 0x0, 0x0,
+ 0xa1, 0x0, 0x0, 0x9c, 0x0, 0x0, 0xa4, 0x0,
+ 0x0, 0xa9, 0x0, 0x0, 0x7d, 0x0, 0x0, 0x98,
+ 0x0, 0x0, 0x73, 0x0, 0x0, 0x72, 0x0, 0x0,
+ 0x85, 0x0, 0x0, 0x96, 0x0, 0x0, 0x8f, 0x0,
+ 0x0, 0x78, 0x0, 0x0, 0x9e, 0x0, 0x0, 0x9b,
+ 0x0, 0x0, 0xa3, 0x0, 0x0, 0x7b, 0x0, 0x0,
+ 0xae, 0x0, 0x0, 0xab, 0x1, 0x0, 0xb0, 0x0,
+ 0x0, 0xad, 0x0, 0x0, 0xaf, 0x0, 0x0, 0x8a,
+ 0x0, 0x0, 0xb1, 0x0, 0x0, 0xb5, 0x0, 0x0,
+ 0xb2, 0x2, 0x0, 0xb9, 0x0, 0x0, 0xb6, 0x2,
+ 0x0, 0x9a, 0x0, 0x0, 0xba, 0x0, 0x0, 0xbe,
+ 0x0, 0x0, 0xbb, 0x1, 0x0, 0xbf, 0x0, 0x0,
+ 0xbd, 0x0, 0x0, 0xa8, 0x0, 0x0, 0x8d, 0x0,
+ 0x0, 0xc4, 0x0, 0x0, 0xc1, 0x2, 0x0, 0xc5,
+ 0x0, 0x0, 0x9d, 0x0, 0x0, 0x95, 0x0, 0x0,
+ 0xcb, 0x0, 0x0, 0xc8, 0x1, 0x0, 0xcd, 0x0,
+ 0x0, 0xca, 0x0, 0x0, 0xcc, 0x0, 0x0, 0x90,
+ 0x0, 0x0, 0xce, 0x0, 0x0, 0xd2, 0x0, 0x0,
+ 0xcf, 0x2, 0x0, 0xd6, 0x0, 0x0, 0xd3, 0x2,
+ 0x0, 0xa7, 0x0, 0x0, 0xd7, 0x0, 0x0, 0xdb,
+ 0x0, 0x0, 0xd8, 0x1, 0x0, 0xdc, 0x0, 0x0,
+ 0xda, 0x0, 0x0, 0x9f, 0x0, 0x0, 0x93, 0x0,
+ 0x0, 0xe1, 0x0, 0x0, 0xde, 0x2, 0x0, 0xe2,
+ 0x0, 0x0, 0xa2, 0x0, 0x0, 0xe3, 0x0, 0x0,
+ 0x91, 0x0, 0x0, 0x8c, 0x0, 0x0, 0x92, 0x0,
+ 0x0, 0x8e, 0x0, 0x0, 0x94, 0x0, 0x0, 0xc0,
+ 0x0, 0x0, 0xdd, 0x0, 0x0, 0xc6, 0x1, 0x0,
+ 0xe4, 0x0, 0x0, 0x65, 0x0, 0x0, 0x7e, 0x0,
+ 0x0, 0x88, 0x0, 0x0, 0x81, 0x1, 0x0, 0x84,
+ 0x0, 0x0, 0x87, 0x0, 0x0, 0x7f, 0x0, 0x0,
+ 0x86, 0x0, 0x0, 0x6f, 0x0, 0x0, 0x89, 0x0,
+ 0x0, 0x41, 0x0, 0x0, 0x8, 0x0, 0x0, 0x75,
+ 0x0, 0x0, 0x69, 0x0, 0x0, 0x77, 0x0, 0x0,
+ 0x76, 0x0, 0x0, 0x70, 0x1, 0x0, 0x74, 0x0,
+ 0x0, 0x79, 0x1, 0x0, 0x6b, 0x1, 0x0, 0x63,
+ 0x0, 0x1, 0x87, 0x0, 0x0, 0x99, 0x0, 0x0,
+ 0xa6, 0x0, 0x0, 0x6d, 0x1, 0x0, 0xe6, 0x2,
+ 0x0, 0x1, 0x0, 0x3, 0x0, 0x5, 0x0, 0x47,
+ 0x0, 0x61, 0x0, 0xcc, 0x1, 0x51, 0x1, 0xe0,
+ 0x2, 0x97, 0x2, 0xaa, 0x2, 0xdd, 0x3, 0x14,
+ 0x3, 0xb8, 0x3, 0xdd, 0x4, 0x0, 0x4, 0x10,
+ 0x4, 0x1f, 0x4, 0x34, 0x4, 0x7e, 0x4, 0xb4,
+ 0x5, 0x3, 0x5, 0x71, 0x5, 0xa1, 0x6, 0x12,
+ 0x6, 0x72, 0x6, 0x9b, 0x7, 0x10, 0x7, 0x7d,
+ 0x7, 0x98, 0x7, 0xf6, 0x8, 0x1a, 0x8, 0x3e,
+ 0x8, 0x5d, 0x8, 0xc5, 0x9, 0x7e, 0x9, 0xc2,
+ 0xa, 0x4a, 0xa, 0x7e, 0xa, 0xb5, 0xa, 0xfc,
+ 0xb, 0x54, 0xb, 0xc1, 0xc, 0x9, 0xc, 0x11,
+ 0xc, 0x5f, 0xc, 0xd3, 0xc, 0xf4, 0xd, 0x4c,
+ 0xd, 0x67, 0xd, 0x8f, 0xd, 0xc6, 0xe, 0x30,
+ 0xe, 0xa4, 0xe, 0xfe, 0xf, 0x44, 0xf, 0x58,
+ 0xf, 0xa3, 0x10, 0x30, 0x10, 0xb0, 0x10, 0xfa,
+ 0x11, 0x6, 0x11, 0x27, 0x11, 0x3e, 0x11, 0x60,
+ 0x11, 0x7f, 0x11, 0x8f, 0x11, 0xab, 0x12, 0x4,
+ 0x12, 0x54, 0x12, 0x94, 0x13, 0x3, 0x13, 0x1c,
+ 0x13, 0x6b, 0x14, 0x1a, 0x14, 0x87, 0x14, 0xbb,
+ 0x15, 0xd, 0x15, 0x90, 0x15, 0xb2, 0x16, 0x4c,
+ 0x16, 0x6a, 0x16, 0xa7, 0x16, 0xeb, 0x17, 0x55,
+ 0x17, 0xb0, 0x18, 0x17, 0x18, 0x5f, 0x18, 0x85,
+ 0x18, 0xdb, 0x19, 0x6e, 0x19, 0xf4, 0x1a, 0x17,
+ 0x1a, 0x28, 0x1a, 0x79, 0x1a, 0x91, 0x1a, 0xdc,
+ 0x1b, 0x1c, 0x1b, 0x5e, 0x1b, 0xe1, 0x1c, 0x8e,
+ 0x1d, 0x10, 0x1d, 0x94, 0x1d, 0xae, 0x1e, 0x5f,
+ 0x1e, 0x75, 0x1e, 0xce, 0x1f, 0x44, 0x1f, 0x5e,
+ 0x1f, 0x81, 0x1f, 0xf9, 0x20, 0x9, 0x20, 0x40,
+ 0x20, 0x7b, 0x20, 0x99, 0x20, 0xb6, 0x20, 0xbd,
+ 0x21, 0x2f, 0x21, 0x5e, 0x21, 0x71, 0x21, 0xb4,
+ 0x21, 0xcf, 0x22, 0x8, 0x22, 0x34, 0x22, 0x59,
+ 0x22, 0x8c, 0x22, 0xba, 0x23, 0x20, 0x23, 0x3d,
+ 0x23, 0x58, 0x23, 0x6b, 0x23, 0xb7, 0x23, 0xd5,
+ 0x23, 0xff, 0x24, 0xb1, 0x25, 0xe, 0x25, 0x27,
+ 0x25, 0x3c, 0x25, 0x4f, 0x25, 0x83, 0x25, 0x96,
+ 0x25, 0xc1, 0x25, 0xf5, 0x26, 0x26, 0x26, 0x66,
+ 0x26, 0x99, 0x26, 0xa1, 0x26, 0xa9, 0x26, 0xbb,
+ 0x26, 0xf3, 0x27, 0x23, 0x27, 0x5b, 0x27, 0xd6,
+ 0x28, 0x32, 0x28, 0x44, 0x28, 0x5a, 0x28, 0x93,
+ 0x28, 0xac, 0x28, 0xf0, 0x29, 0x72, 0x29, 0xab,
+ 0x29, 0xf5, 0x2a, 0x6, 0x2a, 0x31, 0x2a, 0x5c,
+ 0x2a, 0xc0, 0x2b, 0x65, 0x2b, 0xc1, 0x2b, 0xdf,
+ 0x2b, 0xf6, 0x2c, 0xe, 0x2c, 0x2d, 0x2c, 0x39,
+ 0x2c, 0x44, 0x2c, 0x50, 0x2c, 0x6a, 0x2c, 0xda,
+ 0x2d, 0x29, 0x2d, 0x5a, 0x2d, 0x9b, 0x2d, 0xbd,
+ 0x2d, 0xfa, 0x2e, 0x2e, 0x2e, 0x60, 0x2e, 0xd8,
+ 0x2e, 0xec, 0x2e, 0xfa, 0x2f, 0xf, 0x2f, 0x36,
+ 0x2f, 0x51, 0x2f, 0x90, 0x2f, 0xae, 0x2f, 0xb5,
+ 0x2f, 0xe8, 0x30, 0x22, 0x30, 0xda, 0x31, 0x68,
+ 0x31, 0xbd, 0x32, 0x2c, 0x32, 0x68, 0x32, 0x80,
+ 0x32, 0x99, 0x33, 0xc, 0x33, 0x1b, 0x33, 0x23,
+ 0x33, 0x4a, 0x33, 0x5b, 0x33, 0x91, 0x33, 0xc3,
+ 0x33, 0xe9, 0x34, 0x4, 0x34, 0xd, 0x34, 0x18,
+ 0x34, 0x37, 0x34, 0x4e, 0x34, 0x6f, 0x34, 0x89,
+ 0x34, 0xa1, 0x34, 0xdc, 0x35, 0x75, 0x36, 0x33,
+ 0x36, 0x51, 0x36, 0x85, 0x37, 0x3a, 0x37, 0x50,
+ 0x37, 0x70, 0x37, 0x8b, 0x38, 0x1a, 0x38, 0xbf,
+ 0x38, 0xd2, 0x39, 0x5c, 0x39, 0xdd, 0x20, 0xe,
+ 0x20, 0xe, 0x73, 0x82, 0xf5, 0xf8, 0xd7, 0x77,
+ 0x1, 0xf7, 0x16, 0xf7, 0x0, 0x14, 0x20, 0xf7,
+ 0x44, 0xf7, 0x44, 0x15, 0x9c, 0x6, 0xa1, 0xf7,
+ 0x50, 0xa2, 0xf7, 0xe, 0xd8, 0x1a, 0xca, 0x82,
+ 0xbd, 0x5d, 0x5f, 0x82, 0x58, 0x4e, 0x3d, 0xa3,
+ 0xfb, 0x10, 0xa1, 0xfb, 0x4e, 0x1e, 0x5d, 0xfb,
+ 0x18, 0x15, 0x6e, 0xa3, 0x73, 0xa8, 0xa8, 0xa5,
+ 0xa2, 0xa8, 0xa8, 0x71, 0xa4, 0x6e, 0x6e, 0x73,
+ 0x73, 0x6e, 0x1e, 0xe, 0xbe, 0xf8, 0x58, 0x76,
+ 0xf7, 0x89, 0x77, 0x1, 0xd8, 0xe0, 0xdf, 0xe0,
+ 0x3, 0xf7, 0xaa, 0xf8, 0x43, 0x15, 0x44, 0xa,
+ 0xfb, 0x3d, 0x16, 0x44, 0xa, 0xe, 0xa0, 0x76,
+ 0xf7, 0x6d, 0xbd, 0xf7, 0x21, 0xbc, 0xf7, 0x61,
+ 0x77, 0x12, 0x8d, 0xf8, 0x85, 0x17, 0xde, 0x16,
+ 0xbf, 0x6, 0xaf, 0xf7, 0x6d, 0x5, 0xf7, 0x1b,
+ 0x6, 0x6b, 0xfb, 0x6d, 0x5, 0xc1, 0x6, 0xab,
+ 0xf7, 0x6d, 0x5, 0xf7, 0x1, 0xbd, 0x26, 0x6,
+ 0x9f, 0xf7, 0x21, 0x5, 0xf7, 0x3, 0xbc, 0x25,
+ 0x6, 0xab, 0xf7, 0x61, 0x5, 0x55, 0x6, 0x6c,
+ 0xfb, 0x61, 0x5, 0xfb, 0x1c, 0x6, 0xaa, 0xf7,
+ 0x61, 0x5, 0x54, 0x6, 0x6b, 0xfb, 0x61, 0x5,
+ 0xfb, 0xc, 0x5a, 0xf7, 0x7, 0x6, 0x75, 0xfb,
+ 0x21, 0x5, 0xfb, 0xf, 0x59, 0xf7, 0x7, 0x6,
+ 0x13, 0x60, 0xc8, 0xbd, 0x15, 0x9f, 0xf7, 0x21,
+ 0x5, 0xf7, 0x1c, 0x6, 0x78, 0xfb, 0x21, 0x5,
+ 0xe, 0x49, 0x76, 0xe3, 0xa7, 0xf8, 0xf4, 0xa6,
+ 0xca, 0x77, 0x12, 0xb7, 0x9a, 0xf7, 0x3f, 0xad,
+ 0xf7, 0x26, 0x9a, 0x17, 0xb7, 0xbe, 0x15, 0x7a,
+ 0xa6, 0xc7, 0x69, 0xee, 0x1b, 0x34, 0xad, 0xe2,
+ 0x7, 0xf4, 0x99, 0xe3, 0xb8, 0xf7, 0x7, 0x1a,
+ 0xf7, 0x0, 0x4b, 0xae, 0xfb, 0x15, 0xd5, 0x1e,
+ 0xf7, 0x8a, 0x7, 0xbe, 0xd5, 0x70, 0xfb, 0x2,
+ 0xa0, 0x1f, 0x9a, 0xf7, 0x3, 0x6, 0xb2, 0x5f,
+ 0x45, 0x99, 0x5c, 0x1b, 0xca, 0x69, 0x4c, 0x7,
+ 0xfb, 0x13, 0x58, 0x39, 0x44, 0x29, 0xe2, 0x57,
+ 0xe6, 0x58, 0x1f, 0xfb, 0xae, 0x7, 0x2d, 0x54,
+ 0xbf, 0xf0, 0x75, 0x1f, 0x7c, 0x6, 0xf7, 0x4d,
+ 0xf7, 0x76, 0x15, 0x13, 0x64, 0x4f, 0xb3, 0x60,
+ 0xab, 0xc0, 0x1a, 0xa1, 0x91, 0xde, 0xec, 0x1e,
+ 0xae, 0xfc, 0xf5, 0x15, 0xf7, 0x9d, 0x7, 0x13,
+ 0x44, 0xca, 0x64, 0xbe, 0x6b, 0x44, 0x1a, 0x25,
+ 0x3a, 0x7c, 0x6a, 0x85, 0x1e, 0xe, 0xf8, 0x70,
+ 0x7f, 0xa9, 0x6e, 0x76, 0xf7, 0xc4, 0xa9, 0x9f,
+ 0xa9, 0xf7, 0x91, 0xa9, 0x9c, 0x77, 0x12, 0xbc,
+ 0xd4, 0xf7, 0x24, 0xd3, 0xde, 0xd4, 0xf7, 0x23,
+ 0xd4, 0x13, 0x77, 0xc0, 0xf7, 0x34, 0x82, 0x15,
+ 0xa9, 0x74, 0xf8, 0x28, 0xf9, 0x29, 0x6a, 0xa2,
+ 0x5, 0x13, 0xbb, 0xc0, 0xfc, 0x94, 0xfb, 0x5b,
+ 0x15, 0x3c, 0xb6, 0x25, 0xf1, 0xf1, 0xb5, 0xf1,
+ 0xdb, 0xdb, 0x60, 0xf0, 0x27, 0x1e, 0x8a, 0x6,
+ 0x25, 0x60, 0x26, 0x3a, 0x1f, 0xd4, 0x8c, 0x15,
+ 0xbe, 0x96, 0xef, 0xc8, 0x1e, 0x8c, 0x6, 0xc9,
+ 0x94, 0x26, 0x58, 0x5b, 0x82, 0x24, 0x4d, 0x4d,
+ 0x80, 0xf0, 0xbe, 0x1f, 0xf7, 0xbf, 0xfb, 0xb1,
+ 0x15, 0x3c, 0xb6, 0x25, 0xf1, 0xf0, 0xb6, 0xf1,
+ 0xdb, 0xdb, 0x60, 0xf1, 0x27, 0x1e, 0x8a, 0x6,
+ 0x25, 0x60, 0x25, 0x3a, 0x1f, 0xd4, 0x8c, 0x15,
+ 0xc0, 0x96, 0xee, 0xc7, 0x1e, 0x8c, 0x6, 0xc9,
+ 0x94, 0x26, 0x58, 0x5a, 0x82, 0x24, 0x4e, 0x4d,
+ 0x80, 0xf1, 0xbd, 0x1f, 0xe, 0xf8, 0x39, 0x7e,
+ 0xbf, 0x57, 0xd2, 0xf8, 0x4, 0x77, 0xf7, 0x82,
+ 0xab, 0x12, 0xb5, 0xe7, 0xcf, 0xda, 0x8b, 0xf7,
+ 0x31, 0x8b, 0xc0, 0x13, 0x7f, 0xf7, 0xd5, 0xf8,
+ 0x34, 0x15, 0x77, 0xb4, 0x77, 0xbf, 0xbb, 0x1a,
+ 0xc9, 0xb0, 0xa4, 0xb4, 0xb6, 0xaf, 0x69, 0x59,
+ 0x38, 0x31, 0x5c, 0x70, 0x7d, 0x1e, 0xf7, 0x0,
+ 0xfb, 0xe6, 0x15, 0x6d, 0xa8, 0xc7, 0x4e, 0xdc,
+ 0x1b, 0xf5, 0xb7, 0xf7, 0x1, 0x8f, 0x8c, 0x1f,
+ 0x7c, 0x96, 0x5, 0x6d, 0x73, 0x77, 0x74, 0x57,
+ 0x1b, 0x41, 0x47, 0xdc, 0x99, 0x82, 0x1f, 0xef,
+ 0xf7, 0x2d, 0xaf, 0xc3, 0xbe, 0xb1, 0xaf, 0x90,
+ 0x19, 0xa0, 0xfb, 0x6c, 0x76, 0x7, 0xb0, 0x88,
+ 0xa6, 0x7c, 0x65, 0x1a, 0x55, 0x4d, 0x3c, 0x6e,
+ 0x65, 0x1e, 0x58, 0xc9, 0x5e, 0xd3, 0x67, 0xd3,
+ 0x8, 0xcb, 0xa9, 0xe6, 0xb7, 0xed, 0x1a, 0xd7,
+ 0x4c, 0xb7, 0x42, 0x26, 0x57, 0x36, 0x43, 0x5b,
+ 0x98, 0x6a, 0xa1, 0x4e, 0x1e, 0x23, 0x4f, 0x30,
+ 0x46, 0x23, 0x1a, 0xfb, 0x17, 0xf3, 0x71, 0xc8,
+ 0xf7, 0xb, 0xca, 0xc3, 0xae, 0xb3, 0x1e, 0x72,
+ 0xa5, 0x15, 0x13, 0xbf, 0x51, 0x46, 0x5a, 0x84,
+ 0x74, 0x1b, 0x44, 0x51, 0xcb, 0xd8, 0xe3, 0xd4,
+ 0xb9, 0xb8, 0xa8, 0x1f, 0xb5, 0x3b, 0xbf, 0x32,
+ 0xc5, 0x45, 0x8, 0xe, 0xfb, 0x45, 0xf8, 0x58,
+ 0x76, 0xf7, 0x89, 0x77, 0x1, 0xbb, 0xe0, 0x3,
+ 0xe5, 0xf8, 0x43, 0x15, 0x44, 0xa, 0xe, 0x90,
+ 0x1d, 0xbb, 0xdc, 0x3, 0xf7, 0xbb, 0xfb, 0x45,
+ 0x15, 0x97, 0x9b, 0x5, 0xfb, 0x24, 0xf7, 0x3,
+ 0x69, 0xf7, 0x66, 0xf1, 0x1a, 0xf7, 0x92, 0xf0,
+ 0xe0, 0xd5, 0xc6, 0x1e, 0x82, 0x9b, 0x5, 0xfb,
+ 0x2f, 0x2f, 0x2f, 0xfb, 0x2a, 0xfb, 0x40, 0x1a,
+ 0xfb, 0x73, 0xea, 0x27, 0xf7, 0x2c, 0xfb, 0x8,
+ 0x1e, 0xe, 0x90, 0x1d, 0xf7, 0x5e, 0xde, 0x3,
+ 0xa8, 0xfb, 0x35, 0x15, 0x94, 0x7b, 0x5, 0xf7,
+ 0x2f, 0xf7, 0x1, 0xe7, 0xf7, 0x19, 0xf7, 0x40,
+ 0x1a, 0xf7, 0x73, 0x2f, 0xf7, 0x0, 0xfb, 0x2c,
+ 0xf7, 0x0, 0x1e, 0x7f, 0x7b, 0x5, 0xf7, 0x3e,
+ 0xfb, 0xd, 0x8e, 0xfb, 0x5e, 0x25, 0x1a, 0xfb,
+ 0x71, 0xfb, 0x27, 0xfb, 0x31, 0x71, 0x79, 0x1e,
+ 0xe, 0xf8, 0x65, 0x90, 0x8b, 0xf7, 0xf, 0xfb,
+ 0x8, 0x76, 0xa9, 0x77, 0xb7, 0xf7, 0x13, 0x12,
+ 0xf7, 0x73, 0xa9, 0x13, 0x2c, 0xf7, 0x84, 0xf8,
+ 0x5c, 0x15, 0x8c, 0x84, 0x5, 0x94, 0x4f, 0x67,
+ 0x55, 0x6c, 0x1a, 0x72, 0x9d, 0x7d, 0x9c, 0xa4,
+ 0x99, 0xa2, 0x9e, 0x1e, 0xa9, 0x6f, 0x98, 0xee,
+ 0x1a, 0x92, 0x7, 0x92, 0x88, 0x5, 0x71, 0xc9,
+ 0xa2, 0x3e, 0xb7, 0x1b, 0x9e, 0x9c, 0x97, 0xa3,
+ 0x1f, 0x13, 0xc4, 0xc6, 0x40, 0x6c, 0x3a, 0xbe,
+ 0x1e, 0x83, 0x90, 0x5, 0xf2, 0xcc, 0xc7, 0x61,
+ 0xcb, 0x1a, 0xa7, 0x73, 0x93, 0x7f, 0x66, 0x71,
+ 0x47, 0x66, 0x4a, 0x1e, 0x84, 0x87, 0x5, 0x13,
+ 0x1c, 0xa5, 0x7, 0xbf, 0xa6, 0xbb, 0xa6, 0x1a,
+ 0x98, 0x83, 0xa5, 0x71, 0x84, 0x6d, 0x8b, 0x64,
+ 0x1e, 0x5f, 0xa4, 0x7e, 0x3a, 0x1a, 0x7e, 0x7,
+ 0xbe, 0x2c, 0x8c, 0xc1, 0x5e, 0x1b, 0x70, 0x85,
+ 0x70, 0x84, 0x51, 0xe1, 0xa1, 0xcf, 0x60, 0x1f,
+ 0x96, 0x84, 0x5, 0x37, 0x51, 0x3a, 0xac, 0x4c,
+ 0x1a, 0x80, 0x93, 0x76, 0xa5, 0xa2, 0x90, 0x91,
+ 0xb0, 0xac, 0x1e, 0x13, 0x2c, 0xa4, 0xa7, 0x8b,
+ 0x8b, 0xbe, 0xad, 0x8, 0xe, 0xf7, 0x63, 0xa0,
+ 0x76, 0xf7, 0x89, 0xb3, 0x1, 0xf7, 0x9a, 0xb5,
+ 0x3, 0xa9, 0xf7, 0x7c, 0x15, 0xf7, 0x7c, 0xfb,
+ 0x7c, 0xb5, 0xf7, 0x7c, 0xf7, 0x7a, 0xb3, 0xfb,
+ 0x7a, 0xf7, 0x7e, 0x61, 0xfb, 0x7e, 0xfb, 0x7c,
+ 0x6, 0xe, 0x20, 0x7f, 0xf7, 0x6, 0x38, 0x76,
+ 0x12, 0x13, 0x80, 0xd5, 0xfb, 0xe, 0x15, 0x94,
+ 0x78, 0x5, 0x3f, 0xa, 0x79, 0x60, 0x5f, 0xb3,
+ 0x78, 0xaa, 0x95, 0x1e, 0x13, 0x40, 0x8c, 0x8f,
+ 0x94, 0x94, 0x38, 0x1d, 0xe, 0x73, 0xf7, 0x56,
+ 0xca, 0x1, 0xb2, 0xf7, 0x56, 0x15, 0xf7, 0x8a,
+ 0xca, 0xfb, 0x8a, 0x6, 0xe, 0x20, 0x80, 0xf7,
+ 0x3, 0x1, 0xd1, 0xf7, 0x3, 0x3, 0xd1, 0xb6,
+ 0x15, 0x43, 0x1d, 0xe, 0x3c, 0x92, 0x7a, 0x1d,
+ 0x83, 0xf7, 0xbb, 0x3, 0x83, 0x7d, 0x15, 0xb3,
+ 0x6, 0xf7, 0x93, 0xf9, 0x46, 0x5, 0x66, 0x6,
+ 0xe, 0x7d, 0xa5, 0xf9, 0x12, 0xa5, 0x1, 0xa3,
+ 0xeb, 0xf7, 0x98, 0xeb, 0x3, 0xf7, 0xc, 0xf7,
+ 0xdf, 0x15, 0xcf, 0x8d, 0xf7, 0x8f, 0xf7, 0x14,
+ 0xf7, 0x14, 0x8d, 0xfb, 0x8f, 0x47, 0x3c, 0x89,
+ 0xfb, 0x84, 0xfb, 0x14, 0xfb, 0x14, 0x89, 0xf7,
+ 0x82, 0xdc, 0x1e, 0x2b, 0x16, 0xfb, 0xd, 0xb5,
+ 0xfb, 0x74, 0xf7, 0x4c, 0xf7, 0x4c, 0xb5, 0xf7,
+ 0x74, 0xf7, 0xd, 0xf7, 0xa, 0x61, 0xf7, 0x77,
+ 0xfb, 0x4c, 0xfb, 0x4c, 0x61, 0xfb, 0x77, 0xfb,
+ 0xa, 0x1e, 0xe, 0xa0, 0x76, 0xf9, 0x38, 0x77,
+ 0x1, 0xf7, 0x69, 0xe1, 0x3, 0xf7, 0x3, 0x16,
+ 0xf7, 0xaf, 0x9a, 0x6, 0x40, 0x77, 0x99, 0xd6,
+ 0x1f, 0xf8, 0xce, 0x7, 0x83, 0x8d, 0xfb, 0x48,
+ 0x30, 0x5, 0x7d, 0x7, 0xa1, 0xc3, 0x8b, 0x8b,
+ 0x97, 0x1b, 0xad, 0x8b, 0x71, 0x76, 0x1f, 0xfc,
+ 0x4f, 0x7, 0x41, 0x5f, 0x7f, 0x51, 0x89, 0x1e,
+ 0xe, 0x8b, 0xd7, 0xf8, 0xa2, 0xd5, 0x1, 0xf7,
+ 0xe6, 0xe1, 0x3, 0xa9, 0x16, 0xf8, 0x1a, 0x6,
+ 0xc2, 0xf7, 0x1d, 0x7e, 0x90, 0x5, 0x4c, 0x64,
+ 0x6c, 0x88, 0x66, 0x1b, 0xfb, 0x77, 0x6, 0xf7,
+ 0x3c, 0xf7, 0x44, 0x5, 0xb7, 0xba, 0xdf, 0xe6,
+ 0xf5, 0x1a, 0xf7, 0x4, 0x31, 0xcf, 0x30, 0x33,
+ 0x2c, 0x5b, 0xfb, 0x2b, 0x6d, 0x1e, 0xa1, 0x86,
+ 0x5, 0xc1, 0xa1, 0xa9, 0xd7, 0xe6, 0x1b, 0xf7,
+ 0xa, 0xa4, 0x2f, 0x58, 0x40, 0x60, 0x31, 0x34,
+ 0x2e, 0x1f, 0xfb, 0x46, 0xfb, 0x51, 0x5, 0xe,
+ 0x7d, 0xaf, 0xf8, 0xe6, 0xc7, 0x12, 0xf7, 0xfb,
+ 0xc5, 0x51, 0xd3, 0x13, 0xd0, 0xf7, 0x2d, 0xf7,
+ 0xdc, 0x15, 0xd0, 0x8d, 0xa4, 0x88, 0xaf, 0x78,
+ 0x8, 0xcb, 0x6a, 0x97, 0x2b, 0x72, 0x1a, 0x40,
+ 0x62, 0x52, 0x2e, 0x6e, 0x73, 0x98, 0x99, 0x75,
+ 0x1e, 0x99, 0x74, 0x75, 0x9a, 0x74, 0x1b, 0x7b,
+ 0x74, 0x84, 0x6f, 0x57, 0xe2, 0x86, 0xa3, 0xf7,
+ 0x31, 0xf7, 0xc, 0xcd, 0xf7, 0x22, 0xf7, 0x18,
+ 0x36, 0xc4, 0x61, 0x9d, 0x1f, 0x13, 0x60, 0xcd,
+ 0xb6, 0xba, 0xb6, 0xc1, 0x1a, 0xb4, 0x70, 0xe9,
+ 0xfb, 0x15, 0x48, 0xfb, 0x3, 0x6c, 0xfb, 0x17,
+ 0x63, 0x1e, 0x9c, 0x87, 0x5, 0xa7, 0x9a, 0xcb,
+ 0xd9, 0xe6, 0x1b, 0xd5, 0xad, 0x56, 0x58, 0x2f,
+ 0x2c, 0x63, 0x30, 0x6e, 0x1f, 0xe, 0xa0, 0x76,
+ 0xf7, 0x31, 0xcb, 0xf8, 0x5b, 0x77, 0x1, 0xf7,
+ 0xb8, 0xd9, 0x3, 0x97, 0xf7, 0x31, 0x15, 0xf7,
+ 0xad, 0xfb, 0x31, 0xd8, 0xf7, 0x31, 0xf1, 0xcb,
+ 0x25, 0xf8, 0x5b, 0x5f, 0x6, 0xfb, 0xce, 0xfc,
+ 0x5b, 0x5, 0xb3, 0x16, 0xf7, 0x82, 0xf7, 0xf2,
+ 0x5, 0x8d, 0xfb, 0xf2, 0x6, 0xe, 0x7d, 0xb0,
+ 0xf8, 0xcd, 0xda, 0x12, 0xf7, 0xf8, 0xd1, 0x17,
+ 0xf7, 0x1f, 0xf8, 0x79, 0x15, 0xb5, 0xe3, 0x5,
+ 0xf7, 0x4e, 0x6, 0x96, 0x9e, 0x8b, 0x94, 0x8e,
+ 0x1f, 0xb1, 0xda, 0x82, 0x9c, 0x5, 0x7c, 0x80,
+ 0x78, 0x80, 0x71, 0x1b, 0xfb, 0x61, 0x6, 0x24,
+ 0xfb, 0x84, 0x5, 0x84, 0x88, 0x8e, 0x85, 0x91,
+ 0x1b, 0xf7, 0x0, 0x87, 0xf7, 0x45, 0x69, 0xfb,
+ 0x34, 0x1a, 0xfb, 0xe, 0x41, 0x53, 0x4a, 0x70,
+ 0x76, 0x9b, 0x9b, 0x75, 0x1e, 0x13, 0xc0, 0x9a,
+ 0x76, 0x74, 0x9a, 0x6c, 0x1b, 0x63, 0x8b, 0x6e,
+ 0x81, 0x67, 0xba, 0x73, 0xda, 0x1f, 0x13, 0x60,
+ 0xf7, 0x32, 0xf7, 0x2, 0xf5, 0xf7, 0x19, 0xe4,
+ 0x80, 0x9e, 0x60, 0xbf, 0x1f, 0x13, 0x40, 0x50,
+ 0xd3, 0x2d, 0x99, 0x3b, 0x99, 0x8, 0xe, 0x7d,
+ 0xa7, 0xf7, 0xe6, 0xb8, 0xf7, 0xb2, 0x77, 0x1,
+ 0xbe, 0xe8, 0xf7, 0x77, 0xe5, 0x3, 0xf7, 0x2e,
+ 0xf8, 0xd, 0x15, 0x9e, 0xf7, 0xe, 0xf6, 0xe6,
+ 0xf7, 0x46, 0xa7, 0x89, 0xaf, 0x18, 0xfb, 0x86,
+ 0x83, 0xfb, 0x3e, 0xfb, 0x40, 0xfb, 0x5f, 0x1a,
+ 0xfb, 0x66, 0xf1, 0x40, 0xf7, 0xa, 0xf7, 0x46,
+ 0xa8, 0xf7, 0x33, 0xd4, 0xf7, 0x1a, 0x44, 0xcd,
+ 0x21, 0x53, 0x64, 0x86, 0x67, 0x5e, 0x1e, 0x75,
+ 0xfb, 0x21, 0x15, 0xc7, 0x90, 0x9e, 0x97, 0x9c,
+ 0x1e, 0xa7, 0x9f, 0xbc, 0x97, 0xad, 0x1b, 0xf5,
+ 0xa2, 0x31, 0x24, 0xfb, 0x5, 0x64, 0x57, 0x4c,
+ 0x40, 0x43, 0xc1, 0xf7, 0x3c, 0x1f, 0xe, 0x98,
+ 0x76, 0xf8, 0xe8, 0xd5, 0x1, 0x9f, 0xf8, 0x41,
+ 0x3, 0xf7, 0x40, 0x83, 0x15, 0xcc, 0x6, 0xf7,
+ 0x68, 0xf9, 0x22, 0x5, 0x9b, 0xfc, 0x6, 0x7,
+ 0x50, 0xfb, 0x27, 0x9c, 0x83, 0x5, 0xbf, 0xac,
+ 0xa7, 0xa8, 0xcc, 0x1b, 0xf7, 0x63, 0x6, 0xe,
+ 0x7d, 0xa7, 0xf9, 0xe, 0xa7, 0x12, 0xd6, 0xd7,
+ 0x45, 0xd1, 0xf7, 0x60, 0xd0, 0x4c, 0xd7, 0x13,
+ 0xe4, 0xf7, 0x6c, 0xf7, 0xcc, 0x15, 0xf7, 0x7,
+ 0x39, 0xbb, 0x6d, 0x41, 0x1a, 0x45, 0x52, 0x61,
+ 0x4c, 0x3a, 0x5d, 0xcc, 0xd8, 0xe6, 0xbf, 0xb2,
+ 0xab, 0xa5, 0x1e, 0x71, 0x9f, 0x15, 0x32, 0x47,
+ 0x5e, 0x6c, 0x34, 0x1a, 0x3d, 0xcd, 0x39, 0xf7,
+ 0x10, 0xf7, 0x3a, 0xb6, 0xf7, 0x4, 0xbf, 0xce,
+ 0x7a, 0xc5, 0xfb, 0x1a, 0xeb, 0x1e, 0x13, 0xd8,
+ 0xc1, 0xa8, 0xd7, 0xb5, 0xe7, 0x1a, 0xd7, 0x43,
+ 0xcd, 0xfb, 0x5, 0x35, 0x26, 0x55, 0x26, 0x3a,
+ 0xb7, 0x69, 0xdf, 0x41, 0x1e, 0xd6, 0xc4, 0x15,
+ 0x67, 0xa2, 0x2e, 0xc4, 0xd9, 0x1a, 0xbb, 0xab,
+ 0xc0, 0xd6, 0xd8, 0xb8, 0x55, 0x54, 0x33, 0x4d,
+ 0x66, 0x65, 0x72, 0x1e, 0xe, 0x8b, 0x76, 0xf7,
+ 0x74, 0xb6, 0xf8, 0x19, 0xa7, 0x1, 0xa9, 0xe7,
+ 0xf7, 0x88, 0xe8, 0x3, 0xc6, 0x75, 0x15, 0xf7,
+ 0x91, 0x9b, 0xf7, 0x27, 0xf7, 0x51, 0xf7, 0x69,
+ 0x1a, 0xdf, 0x73, 0xc7, 0x63, 0xbb, 0x1e, 0xbc,
+ 0x64, 0x54, 0xa8, 0x4e, 0x1b, 0xfb, 0x17, 0x89,
+ 0x3c, 0x23, 0xfb, 0x11, 0x1a, 0x38, 0xba, 0x23,
+ 0xf7, 0x19, 0xbe, 0xbf, 0x92, 0xb0, 0xb7, 0x1e,
+ 0x8c, 0x8a, 0x83, 0x73, 0x58, 0xfb, 0x78, 0xfb,
+ 0x87, 0x62, 0x19, 0xf7, 0xc7, 0xf7, 0xf9, 0x15,
+ 0x54, 0x4a, 0x82, 0x5b, 0x20, 0x76, 0xee, 0xd7,
+ 0xa7, 0x93, 0xbb, 0x9c, 0xae, 0x1e, 0xaf, 0x9e,
+ 0xa6, 0xa4, 0xb6, 0x1b, 0xcd, 0xad, 0x5b, 0x52,
+ 0x9b, 0x1f, 0x9a, 0x56, 0x8c, 0x59, 0x89, 0x68,
+ 0x8, 0xe, 0x3c, 0x80, 0xf7, 0x3, 0xf7, 0x8c,
+ 0xf7, 0x3, 0x8b, 0x77, 0x1, 0xdc, 0xf7, 0x3,
+ 0x3, 0xdc, 0xf8, 0x26, 0x15, 0x43, 0x1d, 0xfb,
+ 0xfb, 0x4, 0x43, 0x1d, 0xe, 0x3c, 0xfb, 0xc,
+ 0x76, 0xf7, 0x28, 0x76, 0xf7, 0x8, 0x77, 0xf7,
+ 0x9d, 0xf7, 0x4, 0x12, 0xdb, 0xf7, 0x4, 0xfb,
+ 0x4, 0xf7, 0x1f, 0x13, 0x94, 0xed, 0xfb, 0xe,
+ 0x15, 0x94, 0x78, 0x5, 0x13, 0x74, 0xac, 0x97,
+ 0xda, 0xcc, 0xd1, 0x1a, 0xdf, 0x50, 0x97, 0x76,
+ 0x80, 0x5b, 0x85, 0x54, 0x66, 0xa3, 0x79, 0xab,
+ 0x92, 0x96, 0x94, 0x8c, 0x8e, 0x1e, 0x8c, 0x8f,
+ 0x8e, 0x8c, 0x8d, 0x1b, 0x13, 0x18, 0x39, 0xa,
+ 0x79, 0xf8, 0xa1, 0x15, 0x13, 0x10, 0x6c, 0xa4,
+ 0x72, 0xaa, 0x1e, 0x13, 0x98, 0xaa, 0xa4, 0xa4,
+ 0xaa, 0xaa, 0x72, 0xa4, 0x6c, 0x6c, 0x72, 0x72,
+ 0x6c, 0x1f, 0xe, 0x8c, 0x1d, 0xf8, 0x90, 0xfc,
+ 0x7e, 0xca, 0x3, 0xa7, 0xf7, 0x81, 0x15, 0xf8,
+ 0x90, 0xfb, 0x89, 0x5, 0xb8, 0x7, 0xfc, 0x51,
+ 0xf7, 0x6c, 0xf8, 0x51, 0xf7, 0x6b, 0x5, 0xb9,
+ 0x7, 0xfc, 0x90, 0xfb, 0x8c, 0x5, 0xe, 0xf7,
+ 0x63, 0xf7, 0xc, 0xcd, 0xf7, 0x1a, 0xcd, 0x63,
+ 0xb3, 0x12, 0x13, 0xa0, 0xa9, 0xf7, 0xee, 0x15,
+ 0xf8, 0x8c, 0xb3, 0xfc, 0x8c, 0x6, 0xfb, 0x9e,
+ 0x4, 0xf8, 0x8c, 0x6, 0x13, 0xc0, 0xb6, 0xfc,
+ 0x8c, 0x7, 0xe, 0x8c, 0x1d, 0x8b, 0x3, 0xa7,
+ 0x83, 0x15, 0xf8, 0x90, 0xf7, 0x89, 0x5, 0xa8,
+ 0x7, 0xfc, 0x90, 0xf7, 0x8c, 0x5, 0x5d, 0x7,
+ 0xf8, 0x51, 0xfb, 0x6b, 0xfc, 0x51, 0xfb, 0x6c,
+ 0x5, 0xe, 0xe2, 0x83, 0xf4, 0xf7, 0xfe, 0x77,
+ 0xf7, 0x63, 0xa9, 0x12, 0xcf, 0xbe, 0xf7, 0x5f,
+ 0xe7, 0x17, 0xf7, 0x77, 0xf7, 0x38, 0x15, 0x9c,
+ 0x6, 0x99, 0xe1, 0xa5, 0xb3, 0xc2, 0xcb, 0x8,
+ 0xa9, 0xae, 0xb8, 0xd1, 0xbe, 0x1a, 0xf1, 0x44,
+ 0xcb, 0xfb, 0x4, 0x46, 0x2d, 0x56, 0x26, 0x69,
+ 0x95, 0x6e, 0xb3, 0xa7, 0x96, 0xa3, 0x9c, 0x9c,
+ 0x83, 0x97, 0x82, 0x95, 0x1e, 0x81, 0x97, 0x80,
+ 0x95, 0x99, 0x1a, 0xac, 0xbe, 0xb1, 0xb5, 0xd8,
+ 0xac, 0x48, 0x4f, 0x63, 0x78, 0x46, 0x79, 0x63,
+ 0x1e, 0x69, 0x3d, 0x73, 0x46, 0x50, 0x1a, 0x61,
+ 0xfb, 0xc, 0x15, 0x6e, 0xa2, 0x74, 0xa8, 0xa8,
+ 0xa3, 0xa2, 0xa8, 0x1e, 0x13, 0x80, 0x94, 0x1d,
+ 0x1e, 0xe, 0xf8, 0xc8, 0x7d, 0xb2, 0xf7, 0xa,
+ 0xac, 0x7f, 0xb7, 0xf7, 0x7a, 0xb7, 0xf7, 0x37,
+ 0xaa, 0x12, 0xf7, 0x8, 0xdf, 0xf7, 0xd, 0xd2,
+ 0xf8, 0xd, 0xb3, 0x13, 0xbf, 0xf8, 0x1c, 0xf7,
+ 0xa3, 0x15, 0xf7, 0xd, 0xe4, 0xd3, 0xbb, 0xa9,
+ 0x94, 0x74, 0x61, 0x5a, 0x7d, 0x63, 0x7e, 0x6b,
+ 0x1e, 0x4e, 0x72, 0x6a, 0x6d, 0x6f, 0x1b, 0x68,
+ 0x6f, 0xa3, 0xc7, 0x1f, 0xf7, 0x22, 0x52, 0x15,
+ 0x7e, 0x8a, 0xa3, 0x51, 0xcd, 0x1b, 0xf7, 0xb,
+ 0xce, 0xf7, 0x1c, 0xf1, 0xf7, 0x3d, 0xfb, 0x24,
+ 0xf7, 0x12, 0xfb, 0x4c, 0xfb, 0x5a, 0xfb, 0x3b,
+ 0xfb, 0x25, 0xfb, 0x6c, 0xfb, 0x1a, 0xf7, 0x6,
+ 0xfb, 0x57, 0xf7, 0x99, 0xd9, 0xd9, 0xab, 0xa8,
+ 0xca, 0x1f, 0x7f, 0xa9, 0x5, 0x71, 0x52, 0x4d,
+ 0x71, 0x32, 0x1b, 0xfb, 0x42, 0xfb, 0x8, 0xf7,
+ 0x1d, 0xf7, 0x23, 0xf7, 0x72, 0xf7, 0x14, 0xf7,
+ 0xa, 0xf7, 0x2d, 0xf7, 0x4b, 0xf4, 0xfb, 0x2b,
+ 0xfb, 0x6, 0x1f, 0x13, 0xdf, 0x35, 0x5a, 0xfb,
+ 0xa, 0x3a, 0x5e, 0x91, 0xbc, 0x9a, 0x8e, 0x1e,
+ 0xcd, 0xf7, 0x9c, 0x5, 0x46, 0x6, 0x80, 0x5b,
+ 0x5, 0x13, 0x32, 0xa3, 0x7e, 0x7f, 0xa7, 0x5d,
+ 0x1b, 0xfb, 0x1b, 0x4d, 0xfb, 0x3e, 0x45, 0xfb,
+ 0x5, 0xcf, 0x80, 0xa7, 0xc5, 0xb9, 0xbf, 0x9d,
+ 0x96, 0x1f, 0xe, 0x5c, 0x1d, 0x1, 0x9a, 0x16,
+ 0xf7, 0x5a, 0x9e, 0x6, 0x76, 0x51, 0xa4, 0xb2,
+ 0x9a, 0x1f, 0xbd, 0xf7, 0x19, 0x5, 0xf7, 0x9a,
+ 0x6, 0xba, 0x27, 0x93, 0x7d, 0x8f, 0x7b, 0x8,
+ 0x5f, 0x96, 0x60, 0x74, 0x66, 0x1b, 0x78, 0xf7,
+ 0x93, 0x9e, 0x7, 0x73, 0x68, 0xa1, 0xb8, 0x77,
+ 0x1f, 0xfb, 0x98, 0xf8, 0xe0, 0x5, 0x77, 0x6,
+ 0xfb, 0x77, 0xfc, 0xab, 0x78, 0x71, 0x7c, 0x6d,
+ 0x73, 0x5c, 0x6c, 0x7b, 0x2e, 0xa, 0xe, 0xf7,
+ 0xca, 0x8b, 0xb0, 0xf7, 0xb5, 0xb2, 0xf7, 0x98,
+ 0xb0, 0x12, 0xf7, 0x5, 0xf1, 0xf7, 0x86, 0xf1,
+ 0x3a, 0xf7, 0x7, 0x13, 0xf4, 0x9c, 0x16, 0xf7,
+ 0xe2, 0x6, 0xf7, 0x72, 0x9f, 0xf7, 0x1e, 0xb1,
+ 0xf4, 0x3b, 0xbb, 0x34, 0x9d, 0x1f, 0x8d, 0x7,
+ 0x13, 0xf8, 0xb8, 0x96, 0xe3, 0xa1, 0xf7, 0x3,
+ 0x1a, 0xf7, 0x2f, 0xfb, 0x43, 0x99, 0x34, 0x1e,
+ 0xfb, 0xac, 0x78, 0x6, 0xda, 0x9c, 0x66, 0x77,
+ 0x1f, 0xfc, 0x86, 0x7, 0x6c, 0x7f, 0x67, 0x37,
+ 0x89, 0x1e, 0xf7, 0x5a, 0xf7, 0xc7, 0x15, 0xeb,
+ 0xab, 0x86, 0x81, 0xad, 0x1f, 0x13, 0xf4, 0xbf,
+ 0x7b, 0xbc, 0x6a, 0x39, 0x1a, 0xfb, 0x1a, 0xfb,
+ 0xd, 0x82, 0x49, 0x51, 0x79, 0x99, 0xb0, 0x1e,
+ 0xf7, 0xa9, 0x4, 0xf7, 0x70, 0x7, 0x9a, 0x8d,
+ 0xa3, 0x9f, 0x1e, 0x95, 0x99, 0x8c, 0xa0, 0x1b,
+ 0x13, 0xf8, 0xd2, 0xf3, 0x78, 0xfb, 0xb, 0xfb,
+ 0xb, 0xfb, 0xb, 0x89, 0x6f, 0x1f, 0xe, 0xf7,
+ 0xca, 0x7d, 0xb7, 0xf8, 0x39, 0x77, 0xf7, 0x61,
+ 0xb3, 0x1, 0xa7, 0xf7, 0x8, 0x3, 0xf8, 0xfb,
+ 0xf7, 0x17, 0x15, 0x77, 0x1d, 0xf7, 0x57, 0xdb,
+ 0xf7, 0x4, 0xf7, 0x2d, 0xf7, 0xf, 0xd3, 0x3b,
+ 0x22, 0xa4, 0x1f, 0xa2, 0x6, 0x82, 0xf7, 0x75,
+ 0x59, 0x1d, 0xf7, 0x4c, 0xe1, 0xf7, 0x11, 0x8d,
+ 0x8c, 0x1f, 0xe, 0xf8, 0x1, 0x8b, 0xb0, 0xf8,
+ 0xe0, 0xb0, 0x1, 0xf3, 0xf1, 0xf7, 0xf3, 0x58,
+ 0x1d, 0x85, 0x96, 0x72, 0x67, 0x1a, 0xfc, 0x7c,
+ 0x7, 0x6c, 0x7f, 0x69, 0x3f, 0x87, 0x1e, 0xf7,
+ 0x52, 0xd0, 0x15, 0xf8, 0x7c, 0x7, 0x9f, 0x8b,
+ 0xa8, 0x8b, 0xa, 0xfb, 0xa8, 0xfb, 0x8a, 0x7b,
+ 0x4b, 0x8c, 0x1e, 0x5b, 0x8c, 0x7f, 0x9b, 0xad,
+ 0x1a, 0xe, 0x7b, 0xa, 0xf7, 0xb5, 0xb4, 0xf7,
+ 0x9a, 0xb1, 0x12, 0xee, 0xf1, 0xf7, 0x9c, 0xa2,
+ 0x17, 0x62, 0xa, 0x96, 0xb4, 0x1f, 0xf7, 0x82,
+ 0x7, 0xf7, 0x2e, 0x89, 0xde, 0x8a, 0x9a, 0x7d,
+ 0x97, 0x3b, 0x19, 0x6f, 0xa, 0x44, 0x80, 0x81,
+ 0x73, 0x32, 0x1b, 0xfb, 0x2e, 0xf7, 0x68, 0x6,
+ 0xad, 0x97, 0x95, 0x33, 0x1d, 0x6, 0x13, 0x10,
+ 0x78, 0x7, 0xca, 0x86, 0xa3, 0x71, 0x6b, 0x1a,
+ 0xfc, 0x7d, 0x7, 0x64, 0x74, 0x6e, 0x4b, 0x84,
+ 0x1d, 0x99, 0x1d, 0xf7, 0x7b, 0x77, 0xf7, 0x8,
+ 0xb4, 0xf7, 0x9a, 0xb1, 0x1, 0xee, 0xf1, 0xf7,
+ 0x8a, 0xa2, 0xb4, 0xa4, 0x3, 0x97, 0x16, 0xf7,
+ 0xac, 0x9e, 0x6, 0x44, 0x8e, 0x77, 0xa1, 0xd6,
+ 0x1a, 0xf7, 0x65, 0x7, 0xf7, 0x25, 0x89, 0xd6,
+ 0x8a, 0xa3, 0x81, 0x96, 0x37, 0x19, 0x6f, 0xa,
+ 0x40, 0x81, 0x79, 0x77, 0x39, 0x1b, 0xfb, 0x25,
+ 0xf7, 0x68, 0x6, 0xa9, 0x92, 0x99, 0xa4, 0x1e,
+ 0xf7, 0x1c, 0x4e, 0xa, 0xf7, 0x23, 0xfc, 0xaa,
+ 0x78, 0x6, 0xca, 0x86, 0xa3, 0x71, 0x6b, 0x1a,
+ 0xfc, 0x61, 0x7, 0x45, 0x7f, 0x71, 0x40, 0x84,
+ 0x1d, 0xf8, 0x1, 0x7d, 0xb3, 0xf7, 0xca, 0x9d,
+ 0xf7, 0xae, 0xb3, 0x1, 0xab, 0xf7, 0x6, 0xf8,
+ 0x17, 0xec, 0x3, 0xf8, 0x5a, 0xf7, 0xe4, 0x15,
+ 0xcf, 0x86, 0x9f, 0x7b, 0x49, 0x98, 0xa, 0x67,
+ 0x46, 0x74, 0x47, 0xfb, 0x2f, 0x23, 0xf7, 0x5,
+ 0xf7, 0x49, 0xf7, 0x91, 0xf7, 0x27, 0xca, 0xea,
+ 0xf7, 0x20, 0xbf, 0x28, 0x43, 0xa6, 0x1e, 0xa2,
+ 0x6, 0x83, 0xf7, 0x67, 0x5, 0x75, 0x6, 0x6f,
+ 0x85, 0x6a, 0x86, 0x83, 0x6b, 0x5d, 0xac, 0x26,
+ 0x1b, 0xfb, 0x68, 0xfb, 0x16, 0xfb, 0x3b, 0xfb,
+ 0x3c, 0xfb, 0x80, 0xf7, 0x2a, 0xfb, 0xb, 0xf7,
+ 0x6a, 0xf7, 0x2, 0xf7, 0x19, 0xc5, 0x99, 0x1f,
+ 0xf7, 0x53, 0x7, 0xd2, 0xa5, 0x97, 0xb7, 0x8f,
+ 0x1e, 0x9d, 0xfb, 0x93, 0x7, 0xe, 0x80, 0x1d,
+ 0xf7, 0xcf, 0xb7, 0xf7, 0xc3, 0x77, 0x1, 0xf6,
+ 0xf1, 0xf7, 0xc3, 0xf1, 0x3, 0x9e, 0x16, 0xf7,
+ 0xaa, 0x9e, 0x6, 0x3d, 0x90, 0x81, 0xb3, 0xcd,
+ 0x1a, 0xf7, 0x4d, 0xf7, 0xc3, 0xfb, 0x4d, 0x7,
+ 0x40, 0x87, 0x6b, 0x37, 0x87, 0x1e, 0x78, 0xf7,
+ 0xaa, 0x9e, 0x7, 0x3d, 0x90, 0x81, 0xae, 0xcd,
+ 0x1a, 0xf8, 0x36, 0x67, 0x1d, 0xfb, 0x4c, 0xfb,
+ 0xc3, 0xf7, 0x4c, 0x67, 0x1d, 0xfc, 0x31, 0x7,
+ 0x40, 0x87, 0x6b, 0x37, 0x84, 0x1d, 0x73, 0xa0,
+ 0x76, 0xf9, 0x2a, 0x42, 0xa, 0xe, 0xab, 0x6a,
+ 0xf7, 0xe, 0xf8, 0xd4, 0x77, 0x1, 0xf7, 0x44,
+ 0xf1, 0x3, 0xde, 0xf9, 0x17, 0x15, 0xdc, 0x86,
+ 0x97, 0x73, 0x44, 0x1a, 0xfc, 0x53, 0x7, 0x57,
+ 0x7c, 0x7d, 0x73, 0x75, 0x8a, 0xa8, 0xa3, 0x81,
+ 0x1e, 0x9c, 0x84, 0x7e, 0x99, 0x6f, 0x1b, 0x6e,
+ 0x7a, 0x6d, 0x78, 0x7d, 0x91, 0x7b, 0x9b, 0x79,
+ 0x1f, 0x7f, 0x96, 0xa4, 0x7e, 0xb5, 0x1b, 0xa6,
+ 0xf7, 0x21, 0x8e, 0xf7, 0x56, 0x1f, 0xf7, 0xf6,
+ 0x7, 0xd5, 0x99, 0xa0, 0xd9, 0x90, 0x1e, 0x9e,
+ 0xfb, 0xb3, 0x7, 0xe, 0xf8, 0x1, 0x83, 0xa,
+ 0x1, 0xf7, 0x10, 0xf1, 0x3, 0xad, 0x16, 0xf7,
+ 0xae, 0x9e, 0x6, 0x3d, 0x8f, 0x7f, 0xa5, 0xd1,
+ 0x1a, 0xf7, 0x45, 0x7, 0xa5, 0xa0, 0xf5, 0x22,
+ 0x5, 0xad, 0x69, 0xeb, 0x24, 0x6c, 0x1a, 0x75,
+ 0x7a, 0x8a, 0x56, 0x89, 0x1e, 0x78, 0xf7, 0xc5,
+ 0x9e, 0x7, 0x52, 0x89, 0x67, 0xbe, 0x4b, 0xc6,
+ 0xfb, 0x7d, 0xf7, 0x8e, 0x18, 0xf7, 0x52, 0xf7,
+ 0x50, 0xd2, 0xd1, 0xa0, 0x8e, 0xc7, 0x90, 0x19,
+ 0x9e, 0xfb, 0x9a, 0x78, 0x7, 0xbc, 0x89, 0x9e,
+ 0x89, 0x70, 0x1a, 0x69, 0x6e, 0x70, 0xfb, 0x76,
+ 0xfb, 0x5f, 0x1e, 0xf7, 0x57, 0x7, 0xd5, 0x99,
+ 0xa0, 0xd9, 0x90, 0x1e, 0x9e, 0xfb, 0xb0, 0x78,
+ 0x7, 0xcf, 0x86, 0xa1, 0x7a, 0x3d, 0x1a, 0xfc,
+ 0x3a, 0x7, 0x43, 0x7f, 0x71, 0x3d, 0x84, 0x1d,
+ 0xf7, 0x92, 0x8b, 0xb2, 0xf7, 0x1b, 0x77, 0xf8,
+ 0x90, 0x77, 0x1, 0xf7, 0x13, 0x5d, 0x1d, 0x96,
+ 0xb3, 0x1f, 0xf8, 0x59, 0x7, 0xda, 0x73, 0x1d,
+ 0xfc, 0x59, 0x7, 0x68, 0x74, 0x6b, 0x4b, 0x84,
+ 0x1d, 0xf8, 0xa8, 0x83, 0xa, 0x1, 0xf7, 0x1,
+ 0xb7, 0xf8, 0x9d, 0xf1, 0x3, 0x5f, 0xa, 0xf8,
+ 0x19, 0x8d, 0x7, 0xf7, 0x8d, 0xfc, 0xb6, 0x5,
+ 0x99, 0x6, 0xf7, 0x92, 0xf8, 0xcd, 0x5, 0x8d,
+ 0xfc, 0x57, 0x6, 0x4e, 0x7e, 0x69, 0x3d, 0x87,
+ 0x1e, 0x78, 0xf7, 0xac, 0x9e, 0x7, 0x4b, 0x8f,
+ 0x74, 0x9e, 0xd8, 0x1a, 0xf8, 0x46, 0x7, 0xda,
+ 0xa3, 0x91, 0xca, 0x90, 0x1e, 0x9e, 0xfb, 0x5b,
+ 0x7, 0xfb, 0x71, 0xfc, 0x8d, 0xfb, 0x7b, 0xf8,
+ 0x8d, 0x5, 0xfb, 0x5c, 0x78, 0x6, 0xd5, 0x87,
+ 0xa2, 0x83, 0x3d, 0x1a, 0xfc, 0x20, 0x78, 0xa,
+ 0xe, 0xf8, 0x1, 0x95, 0x76, 0xab, 0x8a, 0x1d,
+ 0x12, 0xf7, 0x1, 0xb7, 0xf8, 0x33, 0xb7, 0x13,
+ 0x78, 0x5f, 0xa, 0xf8, 0x10, 0x8d, 0x7, 0x13,
+ 0xb8, 0x3a, 0xa, 0xe, 0x5b, 0xa, 0x85, 0xa,
+ 0xf7, 0xe4, 0x70, 0xa, 0xfb, 0x1d, 0x69, 0x1d,
+ 0xf7, 0xf, 0x61, 0x1d, 0xf7, 0x10, 0x61, 0xa,
+ 0xfb, 0x2, 0x44, 0x1d, 0xd6, 0xf1, 0xf1, 0xf7,
+ 0x3, 0x32, 0x71, 0x1d, 0x3a, 0x72, 0x1d, 0xea,
+ 0xf7, 0x70, 0x1e, 0xe, 0x99, 0x1d, 0xf7, 0xb4,
+ 0xb3, 0xf7, 0xbd, 0xb0, 0x6d, 0xa, 0xa5, 0xdc,
+ 0x1a, 0xf7, 0x37, 0x66, 0x1d, 0xf7, 0x13, 0xfb,
+ 0x10, 0xc0, 0xfb, 0x1e, 0x1e, 0xfb, 0x9c, 0x78,
+ 0x6, 0xd4, 0x84, 0x96, 0x6d, 0x74, 0x1a, 0xfc,
+ 0x59, 0x8d, 0xa, 0xf7, 0xcc, 0x15, 0xf7, 0x8e,
+ 0x7, 0xac, 0x96, 0x96, 0xa9, 0xb7, 0xf7, 0x26,
+ 0x89, 0x74, 0x1d, 0xf8, 0x1, 0xfb, 0x46, 0x9e,
+ 0xf7, 0x32, 0xa2, 0x8b, 0xf8, 0xfe, 0x8b, 0xaf,
+ 0x1, 0xc4, 0xf7, 0x6, 0xf8, 0x16, 0x9a, 0xa,
+ 0xf7, 0x93, 0x8a, 0x15, 0xfb, 0x33, 0xf7, 0x21,
+ 0xf7, 0x27, 0x79, 0xf7, 0x32, 0x1b, 0x9e, 0x7,
+ 0xfb, 0x22, 0x99, 0x53, 0xb9, 0x3e, 0xe7, 0x8,
+ 0xf7, 0x0, 0x98, 0xf7, 0x24, 0xf3, 0xf7, 0x70,
+ 0x1a, 0xf7, 0x7a, 0xfb, 0x2d, 0xf7, 0x8, 0xfb,
+ 0x38, 0xfb, 0x38, 0xfb, 0x2d, 0xfb, 0x9, 0xfb,
+ 0x79, 0xfb, 0x69, 0xf7, 0xa, 0x2e, 0xe8, 0x72,
+ 0x1e, 0x2a, 0xf7, 0xdf, 0x15, 0xf7, 0x79, 0xf0,
+ 0xdc, 0xf1, 0xf1, 0xf0, 0x3a, 0xfb, 0x79, 0xfb,
+ 0x6f, 0x2f, 0x32, 0xfb, 0x3, 0xfb, 0x3, 0x2f,
+ 0xe4, 0xf7, 0x6f, 0x1e, 0xe, 0xf7, 0xca, 0x8b,
+ 0x9e, 0xf7, 0xb3, 0xb0, 0xf7, 0xae, 0xb0, 0x1,
+ 0xf1, 0xf1, 0xf7, 0x7e, 0xf7, 0x1, 0x3, 0x9c,
+ 0x16, 0xf7, 0xa9, 0x9e, 0x6, 0x3b, 0x8f, 0x81,
+ 0xa8, 0xce, 0x1a, 0xf7, 0x4f, 0x7, 0xc3, 0x8d,
+ 0xf7, 0x82, 0xfb, 0xc8, 0x5, 0xf7, 0x35, 0x9e,
+ 0x6, 0x62, 0x8d, 0x73, 0x9d, 0x75, 0xa6, 0xfb,
+ 0x62, 0xf7, 0x91, 0x18, 0xbe, 0x95, 0xf7, 0x16,
+ 0xa3, 0xf7, 0x1a, 0x1a, 0xf7, 0x2e, 0xfb, 0x39,
+ 0xa0, 0x32, 0x1e, 0xfb, 0xa8, 0x78, 0x6, 0xd1,
+ 0x84, 0x9a, 0x6f, 0x6f, 0x1a, 0xfc, 0x63, 0x7,
+ 0x4f, 0x87, 0x6a, 0x3a, 0x86, 0x1e, 0xf7, 0x4f,
+ 0xf7, 0xd8, 0x15, 0xf7, 0x80, 0x7, 0xa8, 0x94,
+ 0x9c, 0xc0, 0xb4, 0xf7, 0x17, 0x88, 0xfb, 0x19,
+ 0xfb, 0x23, 0xfb, 0x2a, 0x89, 0x37, 0x8a, 0x1e,
+ 0xe, 0xf7, 0x5b, 0x7d, 0xaf, 0xf8, 0xf4, 0xb4,
+ 0x12, 0xb5, 0xa1, 0x96, 0xe1, 0xf7, 0x79, 0xf0,
+ 0x17, 0xb5, 0x7d, 0x15, 0xa1, 0x6, 0x9b, 0xbd,
+ 0x9d, 0xa0, 0x9c, 0x9f, 0x80, 0x81, 0xa8, 0x1e,
+ 0x13, 0xf8, 0x84, 0xa0, 0xa5, 0x85, 0xab, 0x1b,
+ 0xf7, 0x23, 0xcf, 0xeb, 0xe0, 0xf1, 0x38, 0xc4,
+ 0x38, 0xbc, 0x1f, 0x37, 0xbd, 0x37, 0xb5, 0xd6,
+ 0x1a, 0xc9, 0xbe, 0xaa, 0xbd, 0xf4, 0xb8, 0x31,
+ 0x39, 0x9c, 0x1e, 0xa4, 0x6, 0x88, 0x86, 0x1d,
+ 0x1b, 0x7d, 0x77, 0x96, 0x94, 0x71, 0x1f, 0x92,
+ 0x77, 0x74, 0x92, 0x71, 0x55, 0xa, 0x13, 0x70,
+ 0x74, 0x6, 0xe, 0xf7, 0x92, 0xa0, 0x76, 0xf9,
+ 0x0, 0xb5, 0x1, 0xf7, 0x92, 0xf1, 0x3, 0xf7,
+ 0x34, 0x16, 0xf7, 0xb8, 0x9e, 0x6, 0x37, 0x8e,
+ 0x7f, 0xa8, 0xcf, 0x1a, 0xf8, 0x89, 0xc1, 0x7,
+ 0xf7, 0x2, 0xa7, 0x79, 0xfb, 0x2, 0xa0, 0x1f,
+ 0xa3, 0x6, 0x85, 0xf7, 0x3e, 0x5, 0xfc, 0xc8,
+ 0x6, 0x85, 0xfb, 0x3e, 0x5, 0xa3, 0x6, 0xf7,
+ 0x1, 0xa1, 0xa6, 0x9e, 0xf7, 0x2, 0x1b, 0xc1,
+ 0xfc, 0x8b, 0x6, 0x4d, 0x88, 0x6b, 0x30, 0x84,
+ 0x1d, 0x6e, 0xa, 0x1, 0xf3, 0xf1, 0xf7, 0xfd,
+ 0xb7, 0x3, 0x99, 0xf9, 0x17, 0x2d, 0x1d, 0x63,
+ 0x3f, 0xfb, 0x27, 0x49, 0x1d, 0xf8, 0x1, 0x95,
+ 0x76, 0xf9, 0x35, 0x77, 0x12, 0x9b, 0xf9, 0x3d,
+ 0x17, 0xf8, 0x4, 0x80, 0x15, 0x9a, 0x6, 0xf7,
+ 0x86, 0xf8, 0xe9, 0x5, 0x13, 0x60, 0x97, 0xa9,
+ 0x97, 0xa3, 0xbb, 0x8e, 0x8, 0x9e, 0xfb, 0x61,
+ 0x78, 0x7, 0xb1, 0x89, 0xae, 0x7e, 0x62, 0x1a,
+ 0xfb, 0x3a, 0xfc, 0x3e, 0x5, 0xfb, 0x42, 0xf8,
+ 0xf, 0x79, 0xb4, 0x9a, 0x1a, 0xab, 0x9e, 0x97,
+ 0xc3, 0x8e, 0x1e, 0x9e, 0xfb, 0x9e, 0x78, 0x7,
+ 0xba, 0x89, 0x9f, 0x77, 0x98, 0x6f, 0x8, 0xe,
+ 0xf8, 0xdf, 0x95, 0x76, 0xf9, 0x35, 0x77, 0x9f,
+ 0x8b, 0x12, 0x90, 0xfa, 0x33, 0x17, 0xf7, 0xc1,
+ 0x80, 0x15, 0x13, 0xf0, 0x9a, 0x6, 0xf7, 0x2e,
+ 0xf8, 0x3b, 0xb6, 0xfb, 0x1, 0xdd, 0xfb, 0x66,
+ 0xae, 0x23, 0x19, 0x9a, 0x6, 0xc6, 0xf7, 0x55,
+ 0xd9, 0xf7, 0x60, 0xd0, 0xf7, 0x4e, 0x99, 0xb2,
+ 0x9d, 0xa3, 0xbc, 0x93, 0x8, 0x9e, 0xfb, 0x5a,
+ 0x78, 0x7, 0xad, 0x88, 0xac, 0x7d, 0x64, 0x1a,
+ 0x76, 0x83, 0x6d, 0x83, 0x76, 0x1e, 0xfb, 0xf,
+ 0xfb, 0xdd, 0x5, 0xfb, 0x27, 0xf8, 0x10, 0x7d,
+ 0x97, 0x9c, 0x1a, 0xaf, 0xbb, 0x97, 0xaa, 0x1e,
+ 0x9e, 0xfb, 0x9f, 0x78, 0x7, 0xc0, 0x8a, 0x98,
+ 0x7b, 0xac, 0x38, 0xae, 0x43, 0x18, 0x20, 0xfb,
+ 0xae, 0x5, 0xfb, 0x29, 0xf8, 0x19, 0x83, 0x92,
+ 0x99, 0x1a, 0xa5, 0xa1, 0x9b, 0xb8, 0x8d, 0x1e,
+ 0x9e, 0xfb, 0x89, 0x78, 0x7, 0xc4, 0x86, 0x97,
+ 0x64, 0xab, 0x38, 0xb1, 0x27, 0xf5, 0xfb, 0xa6,
+ 0xbe, 0xfb, 0x2d, 0x8, 0xe, 0xf8, 0x1, 0x8b,
+ 0x9e, 0xf9, 0x4, 0x9e, 0x1, 0x95, 0x16, 0xf7,
+ 0x7d, 0x9e, 0x6, 0x64, 0x66, 0x9a, 0xab, 0x9e,
+ 0xaa, 0xb2, 0xa0, 0xa5, 0x1f, 0xf7, 0xb, 0xf7,
+ 0x1e, 0xea, 0xfb, 0x16, 0x5, 0x9b, 0x74, 0xae,
+ 0x55, 0x79, 0x1a, 0x6c, 0x70, 0x7e, 0x59, 0x1e,
+ 0x78, 0xf7, 0xbd, 0x9e, 0x7, 0x57, 0x77, 0xa8,
+ 0xc2, 0x64, 0x1f, 0xfb, 0x54, 0xf7, 0x9c, 0xf7,
+ 0x26, 0xf7, 0x40, 0x5, 0xe2, 0xd1, 0xa5, 0x9c,
+ 0xc0, 0x1b, 0x9e, 0xfb, 0x82, 0x78, 0x7, 0xad,
+ 0xaf, 0x7f, 0x6c, 0x78, 0x7a, 0x77, 0x74, 0x6e,
+ 0x1f, 0xfb, 0x5, 0xfb, 0x14, 0x5, 0xfb, 0x1,
+ 0xf7, 0x24, 0x79, 0xac, 0x9f, 0x1a, 0xa9, 0xa3,
+ 0x97, 0xbf, 0x1e, 0x9e, 0xfb, 0xc2, 0x78, 0x7,
+ 0xc5, 0xa0, 0x7a, 0xfb, 0x2a, 0xf1, 0x1f, 0xf7,
+ 0x1, 0xfb, 0x2a, 0x5, 0xfb, 0xac, 0xfb, 0x80,
+ 0x80, 0x70, 0x54, 0x1b, 0xe, 0xf8, 0x1, 0xa0,
+ 0x76, 0xf9, 0x2a, 0x72, 0xa, 0xa6, 0xd3, 0x1a,
+ 0xf7, 0x4c, 0x7, 0xf7, 0x28, 0xf7, 0x6c, 0xd0,
+ 0xf5, 0xac, 0x99, 0xaf, 0x8f, 0x19, 0x9e, 0xfb,
+ 0x6f, 0x78, 0x7, 0xaa, 0xb1, 0x7f, 0x75, 0x1d,
+ 0xfb, 0x6c, 0xfb, 0x28, 0xf7, 0x68, 0x75, 0xa,
+ 0x96, 0xb9, 0x8d, 0x1e, 0x9e, 0xfb, 0xac, 0x78,
+ 0x7, 0xb8, 0x87, 0x9a, 0x7e, 0xf1, 0xfb, 0x2a,
+ 0xf7, 0x17, 0xfb, 0x4a, 0x18, 0xfb, 0x44, 0x7,
+ 0x46, 0x88, 0x6f, 0x29, 0x89, 0x1e, 0xe, 0x7b,
+ 0xa, 0xf8, 0xde, 0xb1, 0x1, 0x94, 0xf8, 0xe0,
+ 0x3f, 0x1d, 0xe, 0x93, 0x1d, 0xe3, 0xd7, 0x3,
+ 0xe3, 0xfb, 0x30, 0x15, 0xf7, 0x67, 0xa4, 0x3f,
+ 0x6, 0x5a, 0x81, 0xb3, 0x97, 0x1f, 0xf9, 0x34,
+ 0x7, 0x99, 0x95, 0xa9, 0xb8, 0x1e, 0xdb, 0xa4,
+ 0xfb, 0x67, 0x6, 0xe, 0x3c, 0xfb, 0x23, 0x76,
+ 0xf7, 0x3f, 0x7a, 0x1d, 0xf7, 0x7e, 0xfb, 0x38,
+ 0x15, 0xb6, 0x6, 0xfb, 0x7c, 0xf9, 0xdc, 0x5,
+ 0x60, 0x6, 0xe, 0x93, 0x1d, 0xf7, 0x3d, 0xd7,
+ 0x3, 0xad, 0xfb, 0x17, 0x15, 0x72, 0xf7, 0x67,
+ 0xf9, 0xc6, 0xfb, 0x67, 0x72, 0xd7, 0x7, 0xbc,
+ 0x95, 0x63, 0x7f, 0x1f, 0xfd, 0x34, 0x7, 0x7d,
+ 0x81, 0x6d, 0x5e, 0x1e, 0xe, 0xf7, 0x4, 0xf9,
+ 0x2a, 0x77, 0x1, 0xa3, 0xf7, 0xbd, 0x15, 0xcf,
+ 0x6, 0xf7, 0x23, 0xf7, 0xb5, 0xf7, 0x23, 0xfb,
+ 0xb5, 0x5, 0xcf, 0x6, 0xfb, 0x48, 0xf8, 0x1,
+ 0x5, 0x4d, 0x6, 0xe, 0xfb, 0x11, 0xbd, 0x1,
+ 0x8b, 0xf8, 0x88, 0x3, 0x40, 0x4, 0x59, 0xf8,
+ 0x88, 0xbd, 0x7, 0xe, 0x92, 0x1d, 0x9e, 0xf7,
+ 0x73, 0x3, 0xf7, 0x5e, 0xf8, 0x8f, 0x15, 0xb3,
+ 0x6, 0xfb, 0x1d, 0xf7, 0x24, 0x5, 0xa2, 0x72,
+ 0x7e, 0x94, 0xa, 0xa6, 0x79, 0x97, 0x7d, 0xa,
+ 0x4f, 0x1d, 0x12, 0xb0, 0xe3, 0x4a, 0xe3, 0xf7,
+ 0x1f, 0xdc, 0x13, 0xd4, 0xf7, 0xb3, 0xf7, 0xaa,
+ 0x15, 0xfb, 0x2f, 0x7, 0x5d, 0x61, 0x6e, 0x55,
+ 0x66, 0x6e, 0xaa, 0xba, 0x1e, 0x8d, 0x7, 0xad,
+ 0x96, 0xcd, 0xf7, 0x2b, 0xbd, 0x1e, 0x8c, 0xfb,
+ 0x6b, 0x15, 0x43, 0x90, 0xb5, 0x8a, 0x2f, 0xa,
+ 0x40, 0xa, 0xef, 0xfb, 0x29, 0x1e, 0x13, 0xcc,
+ 0x3e, 0x1d, 0x13, 0xb4, 0xaa, 0xb1, 0x9d, 0xac,
+ 0xa9, 0xba, 0x80, 0x43, 0x1e, 0x58, 0x7, 0xfb,
+ 0x37, 0x4b, 0x34, 0x5f, 0x27, 0x1a, 0x48, 0xbf,
+ 0x66, 0xc1, 0xc2, 0xc0, 0xb3, 0xac, 0xb0, 0x1e,
+ 0xe, 0x81, 0xab, 0xf8, 0xb, 0xca, 0xf7, 0x73,
+ 0x77, 0x1, 0xd0, 0xdf, 0xf7, 0x77, 0xe3, 0x3,
+ 0xf7, 0x2d, 0xd1, 0x15, 0xf7, 0x90, 0x7, 0xc4,
+ 0xcf, 0x9d, 0xab, 0xe6, 0xaf, 0x24, 0x2e, 0x49,
+ 0x7b, 0xfb, 0x5, 0xfb, 0x7, 0x72, 0x44, 0x98,
+ 0xae, 0x1e, 0xf7, 0xc9, 0x4, 0xf7, 0xc2, 0x7,
+ 0x86, 0x8d, 0x6b, 0x1d, 0x6c, 0x6d, 0x1f, 0xfc,
+ 0x91, 0x7, 0x66, 0xf4, 0x70, 0xbd, 0xf7, 0x4d,
+ 0xc6, 0xf7, 0x32, 0xe5, 0xf6, 0x52, 0xf7, 0x7,
+ 0xfb, 0xd, 0x3f, 0x56, 0x51, 0x74, 0x85, 0x1e,
+ 0xe, 0xe2, 0x81, 0xd3, 0xf8, 0x5, 0xa8, 0x1,
+ 0xa4, 0xd8, 0x3, 0xf8, 0x30, 0xf7, 0x27, 0x15,
+ 0x63, 0x1d, 0x93, 0x79, 0x6d, 0x93, 0x1f, 0x5f,
+ 0x97, 0x99, 0x73, 0xa5, 0x1b, 0xa9, 0x9b, 0xa0,
+ 0xa2, 0x9d, 0x81, 0xaa, 0x6d, 0xa0, 0x1f, 0x9b,
+ 0x72, 0x5b, 0x9a, 0x67, 0x1b, 0xfb, 0x0, 0xfb,
+ 0x8, 0x38, 0xfb, 0x38, 0xfb, 0x32, 0xf6, 0x4a,
+ 0xdb, 0xdc, 0xcc, 0xb6, 0xf7, 0x6, 0xc1, 0x1f,
+ 0xe, 0x81, 0xbf, 0xf8, 0x1a, 0xa7, 0xf7, 0x78,
+ 0x77, 0x1, 0xa6, 0xe1, 0xf7, 0x77, 0xdf, 0x3,
+ 0xf7, 0xe8, 0xf1, 0x15, 0x67, 0x83, 0x64, 0x73,
+ 0x61, 0x1b, 0x49, 0x43, 0xc3, 0xf7, 0x29, 0xf7,
+ 0x1c, 0xcf, 0xbc, 0xc3, 0xba, 0xbc, 0x6b, 0x47,
+ 0x92, 0x1f, 0xfb, 0xe7, 0x4, 0x8f, 0x88, 0xc0,
+ 0x9e, 0xb9, 0x9b, 0xbb, 0x9c, 0x19, 0x9b, 0x7,
+ 0x48, 0x86, 0x8b, 0xa9, 0xb4, 0x1a, 0xf8, 0xc1,
+ 0x7, 0x86, 0x8d, 0x5b, 0x7a, 0x5a, 0x7d, 0x59,
+ 0x6f, 0x1d, 0x93, 0x95, 0x82, 0xa, 0x6c, 0x6d,
+ 0x1f, 0xfb, 0x26, 0x7, 0xa8, 0x6a, 0x6d, 0x99,
+ 0x60, 0x1b, 0xfb, 0x4, 0x2c, 0xfb, 0x7, 0xfb,
+ 0x17, 0xfb, 0x60, 0xf7, 0x23, 0x77, 0xb2, 0xd5,
+ 0xb0, 0xb0, 0xa6, 0x9d, 0x1f, 0x8d, 0x6, 0xe,
+ 0x87, 0x1d, 0xf6, 0xaf, 0x1, 0xae, 0xd0, 0xf7,
+ 0x5b, 0xf1, 0x3, 0x37, 0x1d, 0x58, 0xfb, 0x4d,
+ 0xfb, 0x22, 0xd7, 0x2f, 0x2b, 0xa, 0x3d, 0x1d,
+ 0xe, 0x73, 0xa0, 0x76, 0xf8, 0x36, 0xab, 0xf7,
+ 0x61, 0xa7, 0x1, 0xf2, 0xdf, 0x3, 0x9f, 0x16,
+ 0xf7, 0x98, 0x9a, 0x6, 0x2f, 0x8d, 0x8a, 0xaf,
+ 0xc8, 0x1a, 0xf7, 0xc4, 0xf7, 0xe, 0xab, 0xfb,
+ 0xf, 0xf7, 0x8, 0x7, 0xb0, 0x90, 0xbf, 0xc2,
+ 0xa1, 0x98, 0x7a, 0x79, 0x97, 0x1e, 0x77, 0x98,
+ 0x97, 0x77, 0xa1, 0x1b, 0x9f, 0xa2, 0x98, 0xa8,
+ 0xad, 0x5f, 0xa6, 0x53, 0xfb, 0x48, 0x8b, 0xfb,
+ 0x45, 0x53, 0x1f, 0x38, 0x6b, 0xde, 0xfb, 0xc4,
+ 0x6, 0x3e, 0x7a, 0x78, 0x49, 0x88, 0x1e, 0xe,
+ 0xfb, 0x6e, 0xc4, 0xf7, 0x26, 0xd4, 0xe6, 0xa4,
+ 0xf7, 0x8c, 0xb2, 0x6e, 0xa7, 0x1, 0xa7, 0xd1,
+ 0x6e, 0xde, 0xf7, 0x45, 0xd8, 0xa6, 0xa7, 0x3,
+ 0xf7, 0x27, 0x89, 0x15, 0x6c, 0x66, 0x79, 0x77,
+ 0x6c, 0x1a, 0x6b, 0xa1, 0x64, 0xeb, 0xf7, 0x9,
+ 0xef, 0xb8, 0xbf, 0xb8, 0x5a, 0x8c, 0x41, 0x8e,
+ 0x1e, 0x2d, 0x8e, 0x76, 0x8a, 0x5b, 0x96, 0x8,
+ 0x90, 0xf7, 0xec, 0x15, 0x3b, 0xa6, 0x33, 0xd8,
+ 0xcf, 0x90, 0xcf, 0xbe, 0xbe, 0x7a, 0xe3, 0x36,
+ 0x67, 0x64, 0x75, 0x47, 0x1e, 0x71, 0xfb, 0xe9,
+ 0x15, 0x70, 0x98, 0x71, 0x97, 0xa7, 0x1a, 0x9d,
+ 0x8b, 0x96, 0xe4, 0xdb, 0x1e, 0x4f, 0xa6, 0x6a,
+ 0xb7, 0xc6, 0x1a, 0xf7, 0xf, 0xe3, 0xb7, 0xe0,
+ 0xae, 0xad, 0x83, 0x7c, 0xa6, 0x1e, 0x80, 0x9f,
+ 0x9e, 0x8c, 0x9b, 0x1b, 0xd8, 0x64, 0x38, 0x6,
+ 0x94, 0x74, 0x95, 0x77, 0x5a, 0x1a, 0xfb, 0x0,
+ 0x24, 0x64, 0x53, 0x1e, 0x7e, 0x68, 0x90, 0x85,
+ 0x1b, 0x77, 0x88, 0x63, 0x62, 0x78, 0x1a, 0x74,
+ 0xbc, 0x87, 0xa8, 0x1e, 0xf7, 0x15, 0x85, 0x5,
+ 0xf6, 0x86, 0x99, 0x41, 0x6f, 0x1a, 0xfb, 0x5,
+ 0xfb, 0x3a, 0x53, 0x31, 0x26, 0x3f, 0xb7, 0xc0,
+ 0xb9, 0xba, 0xb1, 0xbe, 0xb1, 0x1e, 0xe, 0xa0,
+ 0x76, 0xf8, 0x2a, 0xc1, 0xf7, 0x73, 0x77, 0x1,
+ 0xd4, 0xdf, 0xf7, 0x4e, 0xdf, 0x3, 0x94, 0x16,
+ 0xf7, 0x6c, 0x9a, 0x6, 0x5a, 0x90, 0x78, 0x9a,
+ 0xd8, 0x1a, 0xf7, 0x7b, 0x7, 0xbb, 0xb4, 0xb2,
+ 0x9a, 0xa8, 0x1b, 0xc2, 0xa1, 0x64, 0x48, 0x1f,
+ 0xfb, 0x50, 0x7, 0x3e, 0x78, 0x7c, 0x5a, 0x86,
+ 0x1e, 0x7c, 0xf7, 0x68, 0x9a, 0x7, 0x59, 0x94,
+ 0x81, 0x9a, 0xd4, 0x1a, 0xf7, 0x51, 0x7, 0xb3,
+ 0x8a, 0xf7, 0xb, 0xfb, 0xf, 0x4f, 0x5a, 0x6b,
+ 0x59, 0x68, 0x1e, 0x89, 0xf7, 0xc2, 0x6, 0x86,
+ 0x8e, 0x5b, 0x7a, 0x59, 0x7d, 0x5e, 0x7e, 0x19,
+ 0x71, 0x7, 0x8c, 0x8e, 0x96, 0x82, 0xa, 0x76,
+ 0x6d, 0x1f, 0xfc, 0x57, 0x7, 0x42, 0x81, 0x7a,
+ 0x55, 0x84, 0x1e, 0xe, 0x8f, 0xa, 0xf8, 0xd9,
+ 0xf1, 0x12, 0xd9, 0xf0, 0x37, 0xdf, 0x13, 0xe0,
+ 0x31, 0x1d, 0x57, 0x78, 0x54, 0x78, 0x57, 0x7a,
+ 0x19, 0x7c, 0x7, 0x8d, 0x98, 0x9c, 0x8d, 0x99,
+ 0x1b, 0x13, 0xd0, 0x9b, 0x9e, 0x80, 0x50, 0x1f,
+ 0xfb, 0x68, 0x7, 0x3d, 0x7a, 0x7b, 0x4d, 0x88,
+ 0x1e, 0x13, 0xe0, 0xc9, 0xf8, 0xfd, 0x64, 0x1d,
+ 0x3c, 0xfb, 0x6e, 0xad, 0xf9, 0x91, 0xf1, 0x12,
+ 0xf3, 0xf0, 0x2b, 0xdf, 0x13, 0xd0, 0xab, 0xf8,
+ 0x1a, 0x15, 0x8d, 0x9a, 0x98, 0x8d, 0x99, 0x1b,
+ 0x9b, 0x9e, 0x80, 0x50, 0x1f, 0xfc, 0x5, 0x7,
+ 0x39, 0x8b, 0x52, 0x59, 0x78, 0x80, 0x9b, 0x9b,
+ 0x7e, 0x1e, 0x99, 0x7f, 0x7e, 0x99, 0x76, 0x1b,
+ 0x78, 0x76, 0x7c, 0x74, 0x66, 0xb9, 0x78, 0xba,
+ 0xf7, 0x15, 0xb4, 0xf0, 0xf7, 0x9, 0x1f, 0x8c,
+ 0xf8, 0x5d, 0x85, 0x8e, 0x57, 0x77, 0x57, 0x79,
+ 0x57, 0x7b, 0x19, 0x13, 0xe0, 0xc7, 0xf7, 0x76,
+ 0x64, 0x1d, 0xa0, 0x76, 0xf8, 0x56, 0x77, 0xf7,
+ 0x91, 0x77, 0x1, 0xdd, 0xdf, 0x3, 0x92, 0x16,
+ 0xf7, 0x7e, 0x9a, 0x6, 0x77, 0x8c, 0x5, 0x6a,
+ 0x8d, 0x75, 0x9d, 0xb4, 0x1a, 0xf7, 0x3f, 0x8d,
+ 0x7, 0xf7, 0x1e, 0xfb, 0x4c, 0x5, 0x97, 0x7a,
+ 0x94, 0x82, 0x84, 0x1a, 0x7e, 0x7e, 0x88, 0x83,
+ 0x1e, 0x78, 0x7c, 0xf7, 0x6e, 0x9a, 0x6, 0x70,
+ 0x8d, 0x64, 0x92, 0x58, 0xcb, 0xfb, 0x2d, 0xf7,
+ 0x56, 0x18, 0xa8, 0xa6, 0x5, 0xf7, 0x12, 0xf7,
+ 0x1b, 0xa7, 0x8b, 0xc0, 0x1b, 0x9a, 0xfb, 0x60,
+ 0x7d, 0x7, 0xb5, 0x93, 0x83, 0x80, 0x82, 0x83,
+ 0x80, 0x7c, 0x7d, 0x1f, 0x63, 0x69, 0x50, 0x54,
+ 0x67, 0x6c, 0x89, 0x8d, 0x18, 0xf8, 0x34, 0x7,
+ 0x87, 0x8d, 0x56, 0x7a, 0x56, 0x7d, 0x5a, 0x6f,
+ 0x1d, 0x93, 0x94, 0x8c, 0x98, 0x1b, 0xb2, 0x91,
+ 0x71, 0x5e, 0x1f, 0xfc, 0x70, 0x7, 0x69, 0x83,
+ 0x79, 0x48, 0x80, 0x1e, 0xe, 0x8f, 0xa, 0xf9,
+ 0x3f, 0x77, 0x1, 0xed, 0xdf, 0x3, 0x9e, 0x16,
+ 0xf7, 0x82, 0x9a, 0x6, 0x51, 0x8e, 0x7a, 0x9d,
+ 0xc5, 0x1a, 0xf8, 0xdf, 0x5d, 0xa, 0xfc, 0x67,
+ 0x7, 0x54, 0x77, 0x74, 0x50, 0x84, 0x1d, 0xf8,
+ 0x39, 0xa0, 0x76, 0xf8, 0x2c, 0xbf, 0x1, 0xe1,
+ 0xdf, 0xf7, 0x4c, 0xdf, 0xf7, 0x4c, 0xdf, 0x14,
+ 0x38, 0x9b, 0x16, 0xf7, 0x72, 0x9a, 0x6, 0x68,
+ 0x8c, 0x6a, 0x98, 0xcb, 0x1a, 0xf7, 0x94, 0x7,
+ 0x90, 0xb9, 0xc1, 0xd0, 0xbf, 0x9c, 0x64, 0x49,
+ 0x1e, 0xfb, 0x63, 0x7, 0x4a, 0x74, 0x7e, 0x5e,
+ 0x88, 0x1e, 0x7c, 0xf7, 0x74, 0x9a, 0x7, 0x62,
+ 0x8c, 0x6c, 0x9c, 0xca, 0x1a, 0xf7, 0x8f, 0x7,
+ 0xad, 0xa1, 0xad, 0xa6, 0xc2, 0x1b, 0xd3, 0x8c,
+ 0x50, 0x58, 0x1f, 0xfb, 0x5d, 0x7, 0x4b, 0x7b,
+ 0x7f, 0x59, 0x85, 0x1e, 0x7c, 0xf7, 0x6f, 0x9a,
+ 0x7, 0x71, 0x8d, 0x5, 0x5f, 0x92, 0x8c, 0xac,
+ 0xb3, 0x1a, 0xf7, 0x4d, 0x7, 0xd5, 0x7d, 0xf3,
+ 0x23, 0x3c, 0x4e, 0x4f, 0x73, 0x76, 0x1e, 0xb5,
+ 0x80, 0x6c, 0xb5, 0x4a, 0x1b, 0x55, 0x62, 0x6b,
+ 0x5e, 0x50, 0x1f, 0xd6, 0x7, 0x84, 0x8d, 0x5d,
+ 0x7a, 0x59, 0x7c, 0x5c, 0x7e, 0x19, 0x7a, 0x7,
+ 0x8d, 0x93, 0x98, 0x53, 0x1d, 0x4c, 0x1f, 0xfb,
+ 0x87, 0x7, 0x48, 0x6d, 0x7f, 0x63, 0x8a, 0x1e,
+ 0xe, 0xa0, 0x76, 0xf8, 0x2a, 0xc2, 0x73, 0xa,
+ 0xa5, 0xbe, 0x1a, 0xf7, 0x91, 0x7e, 0xa, 0xfb,
+ 0x6e, 0x7, 0x50, 0x71, 0x7e, 0x82, 0x1d, 0xa4,
+ 0xba, 0x1a, 0xf7, 0x6f, 0x46, 0xa, 0xe, 0x7f,
+ 0xa7, 0xf8, 0x35, 0xa7, 0x1, 0xb8, 0xe5, 0xf7,
+ 0x82, 0xe5, 0x3, 0xa8, 0xf7, 0x7a, 0x15, 0xfb,
+ 0x1b, 0xe5, 0x22, 0x65, 0x1d, 0xf7, 0x1d, 0xee,
+ 0xf7, 0x25, 0x2d, 0xe4, 0xfb, 0x17, 0xfb, 0x1a,
+ 0x39, 0x20, 0xfb, 0xf, 0x1e, 0xe5, 0xa0, 0x15,
+ 0xf3, 0xca, 0xd8, 0xca, 0xe7, 0xb6, 0x37, 0x80,
+ 0xa, 0x39, 0x4c, 0x58, 0xfb, 0xc, 0x83, 0xf7,
+ 0x33, 0xd5, 0x1e, 0xe, 0x8e, 0x1d, 0x1, 0xd6,
+ 0xdf, 0xf7, 0x75, 0xe1, 0x3, 0xf7, 0x33, 0xac,
+ 0x15, 0x5f, 0x1d, 0x76, 0x1f, 0x89, 0x8d, 0x5,
+ 0xd4, 0x7, 0x85, 0x8d, 0x5b, 0x78, 0x5b, 0x7a,
+ 0x5b, 0x7c, 0x19, 0x7b, 0x7, 0x8c, 0x94, 0x95,
+ 0x8b, 0x94, 0x1b, 0xae, 0x8e, 0x7a, 0x63, 0x1f,
+ 0xfc, 0x5e, 0x7, 0x60, 0x87, 0x6c, 0x49, 0x86,
+ 0x1e, 0x7a, 0xf7, 0x86, 0x9d, 0x7, 0x43, 0x7b,
+ 0xa1, 0xc5, 0x1f, 0xf7, 0x63, 0x4, 0x5a, 0xa,
+ 0xfb, 0x58, 0x76, 0xf7, 0x63, 0xc8, 0xf8, 0x11,
+ 0xa7, 0x1, 0xa3, 0xe1, 0xf7, 0x7b, 0xdf, 0x3,
+ 0xf7, 0x90, 0xfb, 0x5c, 0x15, 0x7a, 0xf7, 0x80,
+ 0x99, 0x7, 0x5e, 0x95, 0x79, 0x9b, 0xc7, 0x1a,
+ 0xf8, 0xd1, 0x7, 0x84, 0x8f, 0x51, 0x68, 0x5,
+ 0xa1, 0x64, 0x74, 0x98, 0x58, 0x1b, 0xfb, 0x11,
+ 0x29, 0xfb, 0x2, 0xfb, 0x1e, 0xfb, 0x2b, 0xd6,
+ 0x44, 0xe4, 0xc8, 0xd1, 0xb5, 0xa9, 0x9c, 0x1f,
+ 0x90, 0xfb, 0x44, 0x6, 0x59, 0x7d, 0x6a, 0x40,
+ 0x88, 0x1e, 0xe4, 0xf7, 0xdb, 0x15, 0x8a, 0x6b,
+ 0x8b, 0x7b, 0x57, 0x78, 0x8, 0x84, 0x79, 0x7a,
+ 0x89, 0x7c, 0x1b, 0x32, 0x64, 0xea, 0xe7, 0xf7,
+ 0xd, 0xc1, 0xd4, 0xdc, 0xea, 0x8c, 0x44, 0x6f,
+ 0x1f, 0xe, 0x73, 0xa0, 0x76, 0xf8, 0x21, 0xca,
+ 0x55, 0xc1, 0x12, 0xd7, 0xdf, 0x13, 0xd0, 0x90,
+ 0x16, 0xf7, 0x84, 0x9a, 0x6, 0x58, 0x8d, 0x69,
+ 0x99, 0xd0, 0x1a, 0xf7, 0x6b, 0x7, 0xab, 0xb7,
+ 0xbd, 0xa3, 0x98, 0x94, 0x81, 0x82, 0x95, 0x1e,
+ 0x83, 0x95, 0x95, 0x83, 0x9c, 0x1b, 0x13, 0xb0,
+ 0xa3, 0x99, 0x9e, 0xa4, 0xac, 0x77, 0xa0, 0x69,
+ 0x65, 0x69, 0x77, 0x44, 0x5c, 0x1f, 0x89, 0xe4,
+ 0x6, 0x86, 0x8d, 0x5a, 0x77, 0x59, 0x79, 0x5a,
+ 0x7b, 0x19, 0x7b, 0x7, 0x8d, 0x94, 0x96, 0x53,
+ 0x1d, 0x50, 0x1f, 0xfb, 0x7e, 0x7, 0x4b, 0x7b,
+ 0x80, 0x54, 0x81, 0x1e, 0xe, 0xab, 0x7d, 0xa1,
+ 0xf8, 0x3c, 0xa2, 0x87, 0x77, 0x12, 0xc9, 0xc9,
+ 0xf7, 0x2e, 0xd1, 0x57, 0x9a, 0x13, 0xd8, 0xbe,
+ 0x81, 0x15, 0x99, 0x91, 0x5, 0x94, 0x91, 0x99,
+ 0x8e, 0x97, 0x1b, 0x9c, 0x8c, 0x9d, 0x84, 0xa1,
+ 0x86, 0x8, 0x87, 0x9a, 0x9b, 0x88, 0x9d, 0x1b,
+ 0xcb, 0xdc, 0xb5, 0xe2, 0xc7, 0x68, 0x66, 0xa,
+ 0x1e, 0x13, 0xd4, 0xb7, 0xb4, 0x76, 0x25, 0xa1,
+ 0x1f, 0x9a, 0x6, 0x13, 0xb4, 0xf7, 0x1d, 0x80,
+ 0x7, 0x87, 0x88, 0x7c, 0x84, 0x82, 0x1b, 0x81,
+ 0x80, 0x91, 0x91, 0x7b, 0x1f, 0x8f, 0x7f, 0x7d,
+ 0x7c, 0x1d, 0xc5, 0x6a, 0x5, 0x13, 0xd8, 0xab,
+ 0x79, 0x9f, 0x73, 0x6b, 0x1a, 0x52, 0x5c, 0x95,
+ 0xa, 0x7a, 0x6, 0xe, 0x3c, 0x81, 0xbf, 0xf8,
+ 0x2, 0xab, 0x1, 0xd1, 0xdf, 0x3, 0xf7, 0x9e,
+ 0xd8, 0x15, 0x7e, 0x80, 0x79, 0x75, 0x6b, 0x1b,
+ 0x58, 0x8b, 0xc6, 0xaa, 0x1f, 0xf7, 0xa8, 0xf0,
+ 0xab, 0x26, 0xf7, 0x12, 0x7, 0x93, 0x8b, 0x90,
+ 0x84, 0x1e, 0x66, 0x56, 0x7c, 0x6b, 0x65, 0x64,
+ 0x8, 0x75, 0x75, 0x75, 0x85, 0x7f, 0x1a, 0x88,
+ 0x8d, 0x88, 0x8d, 0x8a, 0x1e, 0xc0, 0xfb, 0xb7,
+ 0x6, 0x27, 0xb4, 0x70, 0xbe, 0xb9, 0xba, 0xac,
+ 0xb6, 0xa3, 0x1e, 0xe, 0x81, 0xc7, 0xf8, 0x24,
+ 0x90, 0xa, 0xf7, 0xe6, 0x84, 0x15, 0x8d, 0x89,
+ 0xba, 0x9c, 0xb1, 0x99, 0xc1, 0x99, 0x19, 0x32,
+ 0xa, 0xfb, 0x75, 0x52, 0xa, 0x7d, 0x2c, 0x1d,
+ 0x9d, 0xbb, 0x8f, 0xb2, 0xb2, 0x1e, 0xb6, 0xb6,
+ 0x5, 0xe, 0x92, 0x76, 0xf8, 0x64, 0x77, 0x1,
+ 0x9e, 0xf8, 0x47, 0x15, 0x9f, 0x8a, 0x9f, 0x7b,
+ 0x9a, 0x6d, 0xaf, 0x44, 0xeb, 0xfb, 0x72, 0xa3,
+ 0x4d, 0x8, 0x60, 0x9b, 0x8d, 0x87, 0x94, 0x1b,
+ 0x92, 0x94, 0xa2, 0xa6, 0x96, 0x1f, 0xf7, 0x14,
+ 0xf7, 0xcb, 0xa3, 0xc6, 0x92, 0xa5, 0xad, 0x8e,
+ 0x19, 0x9a, 0xfb, 0x1f, 0x7c, 0x7, 0xa4, 0x8a,
+ 0xa1, 0x78, 0x74, 0x1a, 0x67, 0x44, 0xfb, 0x26,
+ 0x69, 0x2b, 0x1e, 0x25, 0xf7, 0x8a, 0x5, 0x88,
+ 0x93, 0x85, 0x9a, 0x97, 0x1a, 0xa4, 0xa1, 0x98,
+ 0xa3, 0x8d, 0x1e, 0x9a, 0xfb, 0x58, 0x7, 0xe,
+ 0xf8, 0x1, 0x92, 0x76, 0xf8, 0x64, 0x77, 0x12,
+ 0xa0, 0xf7, 0x48, 0xf8, 0x6, 0xf7, 0xf, 0x17,
+ 0xa0, 0xf8, 0x47, 0x15, 0xa4, 0x89, 0x93, 0x74,
+ 0x9f, 0x5b, 0xf7, 0x1b, 0xfb, 0xe0, 0x18, 0x69,
+ 0x99, 0x90, 0x81, 0x92, 0x1b, 0x91, 0x90, 0x96,
+ 0xa7, 0x99, 0x1f, 0xf7, 0x4, 0xf7, 0x84, 0xe6,
+ 0xfb, 0x80, 0x5, 0x67, 0x99, 0x8d, 0x84, 0x93,
+ 0x1b, 0x93, 0x8f, 0x95, 0xb2, 0x9b, 0x1f, 0xf7,
+ 0x1e, 0xf7, 0xe4, 0x9a, 0xb0, 0x90, 0x9f, 0xa0,
+ 0x92, 0x19, 0x13, 0x70, 0x9a, 0xfb, 0xf, 0x7c,
+ 0x7, 0xa3, 0x86, 0x9f, 0x7d, 0x73, 0x1a, 0x7f,
+ 0x85, 0x70, 0x80, 0x72, 0x1e, 0x31, 0xfb, 0x68,
+ 0x3b, 0xf7, 0x6a, 0x5, 0x7c, 0xb2, 0x85, 0x8c,
+ 0x9d, 0x1a, 0xa8, 0xa4, 0x98, 0xac, 0x90, 0x1e,
+ 0x9a, 0xfb, 0x5f, 0x7c, 0x7, 0xb4, 0x86, 0x96,
+ 0x84, 0xb0, 0xfb, 0x5, 0x30, 0xfb, 0x5b, 0x18,
+ 0x5d, 0xf7, 0x14, 0x50, 0xf7, 0x9, 0xae, 0x1a,
+ 0xa7, 0xa2, 0x99, 0xa2, 0x8d, 0x1e, 0x9a, 0xfb,
+ 0x48, 0x7, 0xe, 0xa0, 0x76, 0xf8, 0x59, 0x77,
+ 0x12, 0x9c, 0xf7, 0x25, 0xf7, 0x8, 0xf7, 0x5d,
+ 0x17, 0x9c, 0x16, 0xf7, 0x25, 0x9a, 0x6, 0x7a,
+ 0x76, 0x95, 0x9d, 0x89, 0x1f, 0x96, 0x99, 0xa0,
+ 0x91, 0x94, 0x1e, 0x13, 0xf0, 0xda, 0xf7, 0x5,
+ 0xdc, 0xfb, 0x6, 0x5, 0x8f, 0x86, 0x97, 0x7f,
+ 0x7c, 0x1a, 0x76, 0x82, 0x7d, 0x6c, 0x8a, 0x1e,
+ 0x7c, 0xf7, 0x5d, 0x9a, 0x7, 0x7a, 0x8c, 0x70,
+ 0x96, 0x65, 0xc5, 0xfb, 0x14, 0xf7, 0x4e, 0x18,
+ 0xde, 0xf7, 0x2, 0x93, 0x98, 0xa9, 0xb3, 0xb6,
+ 0x8c, 0x19, 0x9a, 0xfb, 0x32, 0x7c, 0x7, 0x9c,
+ 0x8a, 0xa2, 0x80, 0x76, 0x1a, 0x80, 0x85, 0x82,
+ 0x4e, 0x33, 0x1e, 0x78, 0xa8, 0x62, 0xc8, 0x9d,
+ 0x1a, 0xa0, 0xa4, 0x97, 0x9d, 0x1e, 0x9a, 0xfb,
+ 0x63, 0x7c, 0x7, 0xac, 0x8c, 0x97, 0x81, 0xb4,
+ 0x4e, 0xe9, 0xfb, 0x1a, 0x18, 0xfb, 0x6, 0xfb,
+ 0x2f, 0x6b, 0x5d, 0x7d, 0x7f, 0x70, 0x88, 0x19,
+ 0xe, 0x96, 0xa, 0xf8, 0xca, 0x77, 0x12, 0x13,
+ 0xa0, 0xf7, 0x86, 0xa1, 0x15, 0x68, 0x85, 0x68,
+ 0xfb, 0xd, 0x57, 0x1b, 0x13, 0x60, 0x45, 0xa,
+ 0x9b, 0xb4, 0x9e, 0x4a, 0xa, 0x3d, 0xfb, 0x68,
+ 0x3b, 0xa, 0x8, 0xe, 0xe2, 0x61, 0xa9, 0xf8,
+ 0x46, 0xa9, 0x6a, 0xa, 0x7b, 0x6c, 0x21, 0x1b,
+ 0xfb, 0x14, 0x56, 0x1d, 0xe, 0x92, 0xa, 0x12,
+ 0xf7, 0x47, 0xd5, 0x47, 0xd5, 0x13, 0xe0, 0xef,
+ 0xf7, 0x8e, 0x15, 0x13, 0xd0, 0xd0, 0x78, 0x9b,
+ 0x5f, 0x4b, 0x98, 0xa, 0xfb, 0xc, 0xc9, 0x77,
+ 0xf2, 0x1e, 0x96, 0x7, 0x44, 0x9b, 0x77, 0xb5,
+ 0xd0, 0x1a, 0xf7, 0x38, 0x7, 0xd2, 0x7e, 0xb2,
+ 0x3d, 0x9c, 0x1e, 0x8d, 0x7, 0xd9, 0x9d, 0x98,
+ 0xb2, 0xd2, 0x1a, 0xf7, 0x38, 0x7, 0xd0, 0x9f,
+ 0xb5, 0xd2, 0x9b, 0x1e, 0x96, 0x7, 0x24, 0x4d,
+ 0x77, 0xfb, 0xb, 0x1f, 0xfb, 0x3b, 0x7, 0x4b,
+ 0x7b, 0x61, 0x46, 0x79, 0x1e, 0xe, 0xfb, 0x31,
+ 0xfb, 0x2a, 0x76, 0xf7, 0x46, 0x7a, 0x1d, 0xce,
+ 0xcd, 0x55, 0xb4, 0x3, 0xda, 0xfb, 0x3f, 0x15,
+ 0xb4, 0xf9, 0xe3, 0x62, 0x6, 0xe, 0x92, 0xa,
+ 0x1, 0xf7, 0x70, 0xd5, 0x3, 0xf7, 0x16, 0xfb,
+ 0x3e, 0x15, 0x80, 0x7, 0xf2, 0xc8, 0x9f, 0xf7,
+ 0xc, 0x1f, 0xf7, 0x38, 0x7, 0xcb, 0x9c, 0xb7,
+ 0xd0, 0x9e, 0x1e, 0x46, 0x9d, 0x7a, 0xb5, 0xcb,
+ 0x1a, 0xf7, 0x3b, 0x7, 0xf7, 0xb, 0x4e, 0x9f,
+ 0x24, 0x1e, 0x80, 0x7, 0xd2, 0x7b, 0x9e, 0x61,
+ 0x46, 0x98, 0xa, 0x44, 0x98, 0x64, 0xd9, 0x79,
+ 0x1e, 0x89, 0x7, 0x3d, 0x7a, 0x7e, 0x64, 0x44,
+ 0x98, 0xa, 0x46, 0x78, 0x61, 0x44, 0x7b, 0x1e,
+ 0xe, 0xf7, 0x4c, 0xf7, 0x4b, 0xcb, 0x97, 0xcb,
+ 0x1, 0xd7, 0xf7, 0x4b, 0x15, 0xae, 0x9b, 0xa3,
+ 0xb4, 0xb7, 0x1b, 0xba, 0xa7, 0x79, 0x79, 0xa6,
+ 0x1f, 0x77, 0xa8, 0xa9, 0x77, 0xc3, 0x1b, 0xc9,
+ 0xac, 0xbb, 0xb5, 0xa9, 0x1f, 0x67, 0xbd, 0x5,
+ 0x68, 0x74, 0x72, 0x62, 0x63, 0x1b, 0x6d, 0x6e,
+ 0x9e, 0x9e, 0x69, 0x1f, 0x9e, 0x69, 0x64, 0x9e,
+ 0x5c, 0x1b, 0x48, 0x67, 0x5b, 0x61, 0x75, 0x1f,
+ 0xe, 0x73, 0xfb, 0x59, 0x76, 0xf8, 0xd5, 0xf7,
+ 0x0, 0x1, 0xec, 0xf7, 0x0, 0x3, 0xf7, 0x23,
+ 0xf7, 0xac, 0x15, 0x98, 0x6, 0xa5, 0xfb, 0x5d,
+ 0xa2, 0xfb, 0x48, 0x73, 0x1a, 0x5a, 0x7f, 0x5f,
+ 0x5f, 0x61, 0x81, 0xb2, 0xbf, 0xa4, 0xa0, 0xf7,
+ 0x49, 0xa4, 0xf7, 0x5d, 0x1e, 0x5d, 0xf7, 0x19,
+ 0x15, 0x6d, 0xa3, 0x73, 0xa9, 0xa9, 0xa3, 0xa3,
+ 0xa9, 0xa9, 0x73, 0xa3, 0x6d, 0x6d, 0x73, 0x73,
+ 0x6d, 0x1e, 0xe, 0x87, 0xd4, 0x52, 0xbf, 0xf7,
+ 0xfc, 0xa9, 0x73, 0xa9, 0x12, 0xca, 0xd8, 0x13,
+ 0xa8, 0xf7, 0xa, 0xfb, 0x1e, 0x15, 0xad, 0x6,
+ 0xbc, 0xf7, 0x1e, 0x5, 0x86, 0x9d, 0x99, 0x87,
+ 0xa1, 0x1b, 0xe2, 0xc6, 0xc8, 0xf3, 0xba, 0x1f,
+ 0x7e, 0x93, 0x5, 0x13, 0x68, 0x45, 0x5d, 0x62,
+ 0x6d, 0x4d, 0x1b, 0x74, 0x7c, 0x90, 0x92, 0x78,
+ 0x1f, 0xf0, 0xf7, 0xb7, 0x5, 0x67, 0x9b, 0x9a,
+ 0x7b, 0xa8, 0x1b, 0xa2, 0x9d, 0x9e, 0xa5, 0xad,
+ 0x6b, 0xaf, 0x60, 0x99, 0x1f, 0xba, 0xf7, 0x1b,
+ 0x5, 0x68, 0x6, 0x5f, 0xfb, 0x10, 0x5, 0x13,
+ 0x98, 0x8e, 0x78, 0x7b, 0x8d, 0x7b, 0x1b, 0xfb,
+ 0x19, 0x34, 0xfb, 0x7, 0xfb, 0xe, 0x1f, 0x13,
+ 0x68, 0x3f, 0xac, 0x3c, 0xde, 0x53, 0x1e, 0xa8,
+ 0xe1, 0x15, 0x5c, 0xb1, 0x76, 0xbf, 0xce, 0x1a,
+ 0x13, 0x98, 0xf7, 0x19, 0xde, 0xb5, 0xbf, 0xa1,
+ 0x98, 0x87, 0x86, 0x98, 0x1e, 0xe, 0x83, 0xa7,
+ 0x6f, 0xdf, 0x37, 0xf7, 0x1e, 0xf7, 0x5a, 0xb8,
+ 0xf7, 0x31, 0xf7, 0x26, 0x70, 0xa6, 0x12, 0xf7,
+ 0xf, 0xe0, 0xf7, 0x2b, 0xe4, 0x13, 0x57, 0xf7,
+ 0x46, 0xc1, 0x15, 0x6c, 0xb7, 0xba, 0x6c, 0xbe,
+ 0x1b, 0xd7, 0xe9, 0xda, 0xcc, 0x90, 0x88, 0x8b,
+ 0x88, 0x1f, 0x76, 0x75, 0x4a, 0x2f, 0x1b, 0x6b,
+ 0x53, 0x92, 0xa7, 0x4d, 0x1f, 0xa2, 0xed, 0x8e,
+ 0xac, 0x89, 0xc6, 0x8a, 0xa6, 0x18, 0xf7, 0x18,
+ 0xb8, 0xfb, 0x1b, 0x6, 0x84, 0xc4, 0x87, 0xab,
+ 0xbe, 0x1a, 0xae, 0x93, 0xf0, 0xe2, 0x97, 0xb7,
+ 0x8b, 0x57, 0x1e, 0x13, 0x3b, 0x6a, 0x8b, 0x69,
+ 0xb3, 0xa4, 0xa3, 0x9e, 0xad, 0xb9, 0x5d, 0xba,
+ 0x37, 0x22, 0x31, 0x42, 0xfb, 0x37, 0x6b, 0x8e,
+ 0x7d, 0x8f, 0x76, 0x1e, 0x20, 0x5e, 0xf7, 0x0,
+ 0x6, 0x90, 0x60, 0x90, 0x69, 0x8f, 0x6e, 0x90,
+ 0x64, 0x8f, 0x6d, 0x86, 0x6f, 0x8, 0x8f, 0x7d,
+ 0x7d, 0x8c, 0x7d, 0x1b, 0x59, 0x5e, 0x72, 0x57,
+ 0x60, 0xae, 0x79, 0xab, 0xb9, 0xa5, 0xa9, 0xab,
+ 0xa6, 0x1f, 0xfb, 0x20, 0x8d, 0x15, 0xa8, 0xab,
+ 0x94, 0xa7, 0xa2, 0xa0, 0x83, 0x82, 0x1e, 0x13,
+ 0x9b, 0x81, 0x7b, 0x5c, 0x5b, 0x75, 0x79, 0x9a,
+ 0xa0, 0x1e, 0xe, 0xf7, 0x1d, 0xc4, 0xf7, 0xa4,
+ 0xc4, 0x12, 0xaf, 0xce, 0x5d, 0xc8, 0xf7, 0x9c,
+ 0xc8, 0x5d, 0xce, 0x13, 0xd4, 0xf7, 0xa, 0xf7,
+ 0xdf, 0x15, 0xd3, 0xc4, 0xca, 0xd7, 0x1e, 0x13,
+ 0xe8, 0xd6, 0xc3, 0x4c, 0x43, 0x41, 0x53, 0x4c,
+ 0x40, 0x1f, 0x13, 0xd4, 0x3f, 0x52, 0xca, 0xd5,
+ 0x1f, 0x47, 0xfb, 0x8a, 0x15, 0xe2, 0xe3, 0x5,
+ 0x74, 0xa5, 0xb6, 0x7e, 0xb6, 0x1b, 0xb7, 0xb7,
+ 0x97, 0xa3, 0xa5, 0x1f, 0xe4, 0x33, 0xb6, 0xb8,
+ 0x34, 0xe2, 0x5, 0x13, 0xe8, 0xa4, 0xa7, 0x95,
+ 0xbb, 0xb9, 0x1a, 0xb3, 0x7e, 0xb2, 0x75, 0xa4,
+ 0x1e, 0xe2, 0xe4, 0x60, 0xb6, 0x32, 0x34, 0x5,
+ 0xa3, 0x71, 0x5f, 0x96, 0x60, 0x1b, 0x60, 0x5f,
+ 0x7f, 0x74, 0x71, 0x1f, 0x34, 0xe2, 0x5e, 0x60,
+ 0xe3, 0x32, 0x5, 0x13, 0xd4, 0x74, 0x72, 0x7e,
+ 0x62, 0x60, 0x1a, 0x5e, 0x96, 0x5e, 0xa4, 0x70,
+ 0x1e, 0x33, 0x34, 0x5, 0xe, 0xa0, 0x76, 0xf7,
+ 0x4a, 0xb3, 0xe5, 0xb3, 0xf7, 0xca, 0x77, 0x1,
+ 0xf7, 0x52, 0xe0, 0x3, 0xf7, 0x3, 0x16, 0xf7,
+ 0x88, 0x9e, 0x6, 0x52, 0x8c, 0x74, 0xa3, 0xd6,
+ 0x1a, 0xca, 0xf7, 0x41, 0xb3, 0xfb, 0x41, 0xd7,
+ 0x7, 0x92, 0x99, 0x5, 0xf7, 0x3a, 0xb3, 0xfb,
+ 0x26, 0x6, 0xe7, 0xf7, 0x42, 0xad, 0xce, 0xaf,
+ 0xb4, 0xbb, 0x94, 0x19, 0x9e, 0xfb, 0x57, 0x78,
+ 0x7, 0xae, 0x8e, 0xa9, 0x77, 0x73, 0x1a, 0x7b,
+ 0x85, 0x7e, 0x83, 0x7c, 0x1e, 0xfb, 0x4, 0xfb,
+ 0x66, 0xfb, 0xa, 0xf7, 0x67, 0x5, 0x83, 0x9a,
+ 0x86, 0x9c, 0x97, 0x1a, 0xa0, 0x9d, 0x9f, 0xba,
+ 0x8a, 0x1e, 0x9e, 0xfb, 0x87, 0x78, 0x7, 0xbe,
+ 0x8a, 0xa0, 0x5f, 0xb9, 0x38, 0xea, 0xfb, 0x37,
+ 0x18, 0xfb, 0x24, 0x63, 0xf7, 0x3b, 0x6, 0x92,
+ 0x7d, 0x5, 0x3f, 0xfb, 0x42, 0x63, 0xf7, 0x42,
+ 0x4e, 0x7, 0x53, 0x83, 0x5f, 0x44, 0x89, 0x1e,
+ 0xe, 0xfb, 0x31, 0x92, 0x7a, 0x1d, 0xd9, 0xb7,
+ 0x3, 0xd9, 0xf8, 0x1d, 0x15, 0xb7, 0xf7, 0xaf,
+ 0x5f, 0x6, 0xfd, 0x46, 0x4, 0xb7, 0xf7, 0xa9,
+ 0x5f, 0x6, 0xe, 0xfb, 0x29, 0xa0, 0xf7, 0x74,
+ 0xa0, 0xf8, 0xd0, 0x77, 0x12, 0xcb, 0xc0, 0xf7,
+ 0x67, 0xed, 0x2b, 0xc3, 0x13, 0xf8, 0xf7, 0xbc,
+ 0xf7, 0x11, 0x15, 0xe1, 0x83, 0xb7, 0xca, 0xce,
+ 0x1a, 0xc6, 0x62, 0xc1, 0x5b, 0xb3, 0x1e, 0xfb,
+ 0x1d, 0xf7, 0x5, 0x5, 0x72, 0xa0, 0x82, 0xaa,
+ 0x9f, 0x1a, 0xa2, 0x9e, 0xba, 0xc7, 0xb9, 0xa1,
+ 0x72, 0x79, 0x87, 0x7f, 0x84, 0x81, 0x7f, 0x1e,
+ 0x85, 0x83, 0x85, 0x81, 0x7e, 0x1a, 0x7d, 0x94,
+ 0x6e, 0xb1, 0xae, 0x9b, 0xa3, 0xa9, 0x1e, 0x13,
+ 0xf4, 0xc5, 0x4e, 0xbc, 0x4b, 0x42, 0x46, 0x65,
+ 0x37, 0x48, 0xb5, 0x68, 0xc2, 0x5d, 0x1e, 0x89,
+ 0x89, 0x5, 0x38, 0x95, 0x57, 0x51, 0x41, 0x1a,
+ 0x5a, 0xa8, 0x51, 0xd0, 0x56, 0x1e, 0xf7, 0x26,
+ 0xfb, 0x4, 0x9b, 0x7b, 0x61, 0x1a, 0x59, 0x68,
+ 0x6e, 0x5a, 0x54, 0x78, 0xad, 0x96, 0x1e, 0x98,
+ 0xad, 0x95, 0xad, 0x1a, 0x9c, 0x7c, 0xa3, 0x6a,
+ 0x71, 0x6f, 0x79, 0x67, 0x52, 0xc8, 0x56, 0xda,
+ 0xec, 0xb8, 0xca, 0xca, 0xc3, 0x71, 0xac, 0x49,
+ 0xc3, 0x1e, 0xfb, 0x3f, 0xf7, 0x56, 0x15, 0xbb,
+ 0xb2, 0x9d, 0xa9, 0xc2, 0xf7, 0x13, 0xfb, 0x0,
+ 0x50, 0x5f, 0x69, 0x71, 0x66, 0x4c, 0xfb, 0x9,
+ 0xed, 0xd4, 0x1e, 0xe, 0x73, 0xf8, 0x9f, 0xef,
+ 0x1, 0x9d, 0xed, 0xf0, 0xed, 0x3, 0x9d, 0xf8,
+ 0xd1, 0x15, 0x6e, 0x1d, 0xf7, 0x5b, 0x16, 0x6e,
+ 0x1d, 0xe, 0xf8, 0x27, 0x7d, 0xb5, 0xf7, 0x2e,
+ 0x9f, 0xf7, 0x9f, 0x9f, 0xf7, 0x25, 0xb5, 0x1,
+ 0xb1, 0xc2, 0xf1, 0xd8, 0xf7, 0x97, 0x9b, 0xf7,
+ 0xc, 0xc2, 0x3, 0xb1, 0xf7, 0xde, 0x3e, 0xa,
+ 0x69, 0xa, 0xf8, 0x4a, 0x38, 0x15, 0x5d, 0x77,
+ 0x68, 0x63, 0x49, 0x1b, 0x25, 0x61, 0xd8, 0xf4,
+ 0x8c, 0x1f, 0xec, 0x8c, 0xb6, 0xd3, 0xe8, 0x1b,
+ 0xd9, 0xa7, 0x52, 0x61, 0x8f, 0x1f, 0x9c, 0xdb,
+ 0x6, 0xa9, 0x36, 0x94, 0x64, 0xfb, 0x2c, 0x4a,
+ 0xfb, 0x2, 0x38, 0xfb, 0x21, 0xea, 0x52, 0xf7,
+ 0x7, 0xcc, 0xb0, 0x95, 0xa5, 0xa8, 0x1e, 0x9b,
+ 0xd1, 0x5, 0xe, 0x3a, 0xf8, 0x33, 0x76, 0xf7,
+ 0x92, 0xa7, 0x12, 0x9b, 0xca, 0xd9, 0xd3, 0x17,
+ 0xf7, 0x32, 0xf8, 0xbb, 0x15, 0x48, 0x7, 0x8a,
+ 0x85, 0x8b, 0x84, 0x81, 0x82, 0x8, 0x88, 0x85,
+ 0x77, 0x79, 0x7d, 0x1b, 0x73, 0x7b, 0x9d, 0xa8,
+ 0x9e, 0xa2, 0xa1, 0xcf, 0xa1, 0x1f, 0x93, 0x24,
+ 0x15, 0x5f, 0x92, 0xa6, 0x81, 0x97, 0x1b, 0x96,
+ 0x9f, 0x8c, 0xa8, 0xa6, 0x1f, 0x9d, 0x7, 0x85,
+ 0x84, 0x82, 0x85, 0x7f, 0x1b, 0x7e, 0x8b, 0x97,
+ 0xa2, 0x1f, 0xf7, 0x7, 0x7, 0xac, 0x84, 0xca,
+ 0x2a, 0x40, 0x69, 0x68, 0x6b, 0x7d, 0x96, 0x7a,
+ 0x9f, 0x9f, 0x97, 0x98, 0x98, 0xa5, 0x89, 0x9d,
+ 0xb8, 0xa2, 0x97, 0x7a, 0x54, 0x1e, 0x2d, 0x69,
+ 0x50, 0x76, 0x4f, 0x1a, 0x13, 0x80, 0x5e, 0xb0,
+ 0x75, 0xae, 0xae, 0xae, 0x9f, 0xad, 0x9f, 0x1e,
+ 0xe, 0x79, 0xa, 0xb5, 0xf7, 0x77, 0x50, 0xa,
+ 0xa4, 0xaf, 0x92, 0x1a, 0x92, 0x89, 0x8f, 0x83,
+ 0x1e, 0x78, 0xfb, 0x51, 0x50, 0xa, 0xa5, 0xaf,
+ 0x92, 0x96, 0x1d, 0xf7, 0x63, 0xf7, 0x15, 0x76,
+ 0xf7, 0x68, 0xcd, 0x63, 0xb3, 0x12, 0xf8, 0x68,
+ 0xcd, 0x5e, 0xb8, 0x13, 0xd0, 0x13, 0xa8, 0xa9,
+ 0xf7, 0xee, 0x15, 0xf8, 0x5f, 0xfb, 0x82, 0xb8,
+ 0xf7, 0xaa, 0xfc, 0x8c, 0x6, 0xe, 0xf8, 0x27,
+ 0x7d, 0xb5, 0x7d, 0xf7, 0x49, 0xf7, 0xcd, 0xf7,
+ 0x43, 0x12, 0xb1, 0xc2, 0xf7, 0x43, 0xcb, 0xf7,
+ 0x4, 0xce, 0xf7, 0x30, 0xc2, 0x13, 0x7e, 0xf7,
+ 0x6f, 0xf7, 0x2c, 0x15, 0xf7, 0x36, 0x9a, 0x6,
+ 0x59, 0x90, 0x8c, 0x95, 0xb6, 0x1a, 0xda, 0xbb,
+ 0x7, 0x2d, 0xcb, 0xa4, 0x51, 0xab, 0x1b, 0xcb,
+ 0x93, 0x6, 0x78, 0x9a, 0x6c, 0xad, 0x71, 0xaf,
+ 0x52, 0xd0, 0x18, 0xb8, 0x9a, 0xad, 0xb1, 0xbf,
+ 0x1a, 0xca, 0x53, 0xb1, 0x50, 0x1e, 0xfb, 0x45,
+ 0x7c, 0x6, 0xa1, 0x87, 0xa6, 0x8b, 0x70, 0x1a,
+ 0xfb, 0x8d, 0x7, 0x60, 0x8c, 0x81, 0x59, 0x86,
+ 0x1e, 0xf7, 0x5, 0xf7, 0x30, 0x15, 0xf7, 0x46,
+ 0xb4, 0x7, 0xb2, 0xab, 0x6d, 0x52, 0x56, 0x77,
+ 0x65, 0x5a, 0x1f, 0xfb, 0xe5, 0x92, 0x3e, 0xa,
+ 0x1e, 0x13, 0xbe, 0x69, 0xa, 0xe, 0x73, 0xf8,
+ 0xb7, 0xc1, 0x1, 0x96, 0xf8, 0xb7, 0x15, 0xf7,
+ 0xcb, 0xc1, 0xfb, 0xcb, 0x6, 0xe, 0xb6, 0xf8,
+ 0x1a, 0xad, 0xf7, 0x6e, 0xad, 0x1, 0xc4, 0xb2,
+ 0xf7, 0x64, 0xb2, 0x3, 0xeb, 0xf8, 0xa9, 0x15,
+ 0xc5, 0xb9, 0xbe, 0xc5, 0xc5, 0xb9, 0x58, 0x51,
+ 0x51, 0x5d, 0x58, 0x51, 0x51, 0x5d, 0xbe, 0xc5,
+ 0x1e, 0x64, 0x16, 0x3b, 0xca, 0x4c, 0xdb, 0xdb,
+ 0xca, 0xca, 0xdb, 0xdb, 0x4c, 0xca, 0x3b, 0x3b,
+ 0x4c, 0x4c, 0x3b, 0x1e, 0xe, 0xf7, 0x63, 0x8b,
+ 0xcd, 0xc3, 0x77, 0xf7, 0x48, 0xcd, 0x54, 0xb6,
+ 0xf7, 0x3e, 0x77, 0x12, 0xf7, 0x8d, 0xcd, 0x55,
+ 0xb3, 0x13, 0xec, 0xa9, 0x16, 0xf8, 0x8c, 0xb5,
+ 0xfc, 0x8c, 0x6, 0x13, 0xea, 0xf7, 0x7b, 0xdb,
+ 0x15, 0xb3, 0x6, 0x13, 0xda, 0xf7, 0x3f, 0xf7,
+ 0x7d, 0xb6, 0xfb, 0x7d, 0xf7, 0x3e, 0x63, 0xfb,
+ 0x3e, 0xfb, 0x7b, 0x60, 0xf7, 0x7b, 0x7, 0xe,
+ 0x52, 0xf7, 0xa2, 0xcc, 0xf7, 0xaa, 0xca, 0x1,
+ 0xf7, 0x4d, 0xe7, 0x3, 0x90, 0xf7, 0xa2, 0x15,
+ 0xf7, 0x92, 0x56, 0xa, 0x67, 0x8b, 0x1d, 0xb4,
+ 0x7f, 0x1d, 0x28, 0x20, 0x5, 0xe, 0x52, 0xf7,
+ 0x9a, 0x85, 0x1d, 0x13, 0xd0, 0xdf, 0xf8, 0x60,
+ 0x77, 0xa, 0x79, 0x7c, 0x96, 0x95, 0x7d, 0x1e,
+ 0x94, 0x7e, 0x7e, 0x94, 0x7d, 0x63, 0xa, 0x13,
+ 0xe0, 0x4e, 0x1d, 0x92, 0x1d, 0xe8, 0xf8, 0x8f,
+ 0x24, 0xa, 0xfb, 0x59, 0x76, 0xf7, 0x64, 0xc9,
+ 0xf8, 0x22, 0x77, 0x12, 0xaf, 0xe7, 0x47, 0xab,
+ 0x6b, 0xe3, 0xf7, 0x56, 0xe3, 0x13, 0xea, 0xe7,
+ 0xc5, 0x15, 0x8d, 0x8d, 0x5, 0x4f, 0xab, 0xc1,
+ 0x81, 0xaa, 0x1b, 0xbe, 0xbf, 0xb9, 0xbe, 0xa8,
+ 0x1f, 0x8d, 0x6, 0x62, 0x9c, 0x53, 0xbf, 0xaf,
+ 0xa7, 0x95, 0xba, 0xad, 0x1e, 0x93, 0x7, 0x77,
+ 0x76, 0x7d, 0x83, 0x7c, 0x1b, 0x6b, 0x8b, 0xb5,
+ 0xa2, 0x1f, 0xf7, 0xfa, 0x33, 0xfb, 0xd9, 0x7,
+ 0x72, 0x7f, 0x60, 0x5b, 0x58, 0x1b, 0x13, 0xe6,
+ 0x4f, 0x6f, 0xb1, 0xc1, 0x1f, 0xf7, 0xc6, 0x33,
+ 0xfc, 0x20, 0x7, 0x13, 0xf2, 0x4d, 0x73, 0x3c,
+ 0x4f, 0x1a, 0x5c, 0x95, 0x73, 0xaf, 0xaf, 0x95,
+ 0xa3, 0xba, 0x1e, 0x13, 0xea, 0xc7, 0x6d, 0xda,
+ 0x85, 0xcd, 0x1e, 0xe, 0xeb, 0xfb, 0x57, 0x76,
+ 0xf9, 0xe7, 0xa6, 0x1, 0xf7, 0x7a, 0xaf, 0xe6,
+ 0xaf, 0x3, 0xf7, 0x7a, 0xfb, 0x6c, 0x15, 0xaf,
+ 0xf9, 0xe7, 0xe6, 0xfd, 0xe7, 0xaf, 0xf9, 0xe7,
+ 0xcb, 0xa6, 0xfb, 0x87, 0x6, 0xfb, 0x20, 0x3d,
+ 0x4f, 0xfb, 0x11, 0xfb, 0x11, 0xd9, 0x50, 0xf7,
+ 0x30, 0x1f, 0xe, 0x20, 0xf7, 0x70, 0x76, 0xf7,
+ 0x3, 0x77, 0x1, 0xd1, 0xf7, 0x3, 0x3, 0xd1,
+ 0xf7, 0x91, 0x15, 0x43, 0x1d, 0xe, 0x73, 0xfb,
+ 0x6b, 0xf7, 0x2d, 0xc9, 0x77, 0x1, 0xf7, 0x4e,
+ 0xd6, 0x3, 0xeb, 0x23, 0x15, 0x92, 0x86, 0x5,
+ 0x8f, 0x98, 0x9c, 0x8d, 0x9a, 0x1b, 0xa0, 0x9c,
+ 0x81, 0x75, 0x68, 0x70, 0x81, 0x6c, 0x76, 0x74,
+ 0x91, 0x91, 0x79, 0x1f, 0x7d, 0x6c, 0x5, 0x83,
+ 0xac, 0x9e, 0x83, 0xb5, 0x1b, 0xba, 0xcf, 0xb7,
+ 0xb2, 0xb8, 0x68, 0xa4, 0x60, 0x80, 0x7f, 0x8a,
+ 0x89, 0x80, 0x1f, 0xa4, 0xcc, 0x5, 0x68, 0x6,
+ 0xe, 0x52, 0xf7, 0xa2, 0xa3, 0xf8, 0x12, 0x77,
+ 0x1, 0xf7, 0x2, 0xdc, 0x3, 0xc4, 0xf7, 0xa2,
+ 0x35, 0xa, 0xfb, 0x86, 0x7, 0x69, 0x73, 0x80,
+ 0x6e, 0x89, 0x1e, 0xe, 0x5c, 0xf8, 0x1e, 0xac,
+ 0xf7, 0x6c, 0xac, 0x1, 0x91, 0xd4, 0xf7, 0x2c,
+ 0xd4, 0x3, 0x91, 0xf8, 0xa8, 0x15, 0x3f, 0xc6,
+ 0x4d, 0xdf, 0xf7, 0x1, 0xb9, 0xde, 0xcc, 0xdd,
+ 0x4d, 0xbf, 0x36, 0x2a, 0x55, 0x4a, 0x3c, 0x1e,
+ 0xd4, 0xa4, 0x15, 0xb7, 0xab, 0xb5, 0xb4, 0xbd,
+ 0xa8, 0x67, 0x3f, 0x4c, 0x62, 0x62, 0x6a, 0x47,
+ 0x81, 0xe3, 0xb5, 0x1e, 0xe, 0x79, 0xa, 0xf7,
+ 0x8b, 0xac, 0x15, 0x58, 0xa, 0x7d, 0x79, 0x5c,
+ 0x4d, 0x6a, 0x5d, 0x8, 0x78, 0x70, 0x7c, 0x75,
+ 0x86, 0x1a, 0x84, 0x8d, 0x87, 0x93, 0x1e, 0xfb,
+ 0x54, 0x16, 0x58, 0xa, 0x7e, 0x79, 0x5e, 0x52,
+ 0x6a, 0x5e, 0x8, 0x75, 0x6d, 0x7b, 0x73, 0x8f,
+ 0x1d, 0xf8, 0x1d, 0x92, 0x76, 0xae, 0x76, 0xe5,
+ 0xc4, 0xf7, 0xf, 0xa3, 0xf8, 0x12, 0x77, 0x12,
+ 0xe5, 0xdc, 0xf8, 0x3a, 0xd1, 0x13, 0x7e, 0x53,
+ 0xa, 0x13, 0xbe, 0xfc, 0x5b, 0xfb, 0x35, 0x68,
+ 0x1d, 0xfc, 0xbe, 0x47, 0x1d, 0xe, 0xf8, 0x1d,
+ 0x8b, 0xcc, 0x51, 0x76, 0xf7, 0xb0, 0xa3, 0xbc,
+ 0xca, 0xf7, 0xa2, 0x77, 0x12, 0xdf, 0xdc, 0xf8,
+ 0x6a, 0xe7, 0x13, 0x7e, 0xf0, 0x7d, 0x68, 0x1d,
+ 0xfc, 0x9f, 0x47, 0x1d, 0x13, 0xbe, 0xf8, 0x3d,
+ 0xfb, 0xba, 0x15, 0xf7, 0x91, 0x56, 0xa, 0x71,
+ 0x8b, 0x1d, 0xaa, 0x7f, 0x1d, 0x29, 0x20, 0x5,
+ 0xe, 0xf8, 0x1d, 0x92, 0x76, 0xf3, 0xc4, 0xf7,
+ 0x7, 0x85, 0x1d, 0xf7, 0xc2, 0xd1, 0x13, 0xf6,
+ 0x53, 0xa, 0xfc, 0x5b, 0xfb, 0x35, 0x68, 0x1d,
+ 0xfc, 0x8f, 0xfb, 0x6c, 0x77, 0xa, 0x7a, 0x7c,
+ 0x95, 0x95, 0x7d, 0x1e, 0x94, 0x7e, 0x7e, 0x95,
+ 0x7c, 0x63, 0xa, 0x13, 0xfa, 0x4e, 0x1d, 0xe2,
+ 0xfb, 0x6e, 0xa9, 0xf8, 0xb9, 0xf4, 0x12, 0xa9,
+ 0xe7, 0xac, 0xf4, 0x17, 0xf7, 0x5c, 0xf7, 0xba,
+ 0x15, 0x4e, 0x64, 0x5a, 0x63, 0x59, 0x1e, 0x5f,
+ 0x54, 0x5c, 0x53, 0x40, 0x1a, 0x25, 0xd2, 0x4b,
+ 0xf7, 0x4, 0xd0, 0xe9, 0xb6, 0xf0, 0xad, 0x81,
+ 0xa8, 0x63, 0x6f, 0x76, 0x73, 0x7a, 0x79, 0x94,
+ 0x7f, 0x95, 0x80, 0x1e, 0x94, 0x80, 0x95, 0x81,
+ 0x7e, 0x1a, 0x6a, 0x62, 0x6f, 0x61, 0x3e, 0x6a,
+ 0xce, 0xc7, 0x1e, 0x13, 0x50, 0xb3, 0x9e, 0xd0,
+ 0x9d, 0xb3, 0x1e, 0xa7, 0xcb, 0x5, 0x91, 0x99,
+ 0xa3, 0xd0, 0xc6, 0x1a, 0x4d, 0xf7, 0xb, 0x15,
+ 0x6e, 0xa2, 0x74, 0xa8, 0x1e, 0xa8, 0xa3, 0xa2,
+ 0xa8, 0x94, 0x1d, 0x1f, 0xe, 0xf8, 0x1, 0x99,
+ 0x76, 0xf7, 0x73, 0xb4, 0xf8, 0x35, 0x77, 0xf7,
+ 0x80, 0x77, 0x1, 0x54, 0xf9, 0x47, 0xfd, 0x2,
+ 0xf7, 0x5a, 0x3, 0x20, 0x1d, 0x59, 0xf8, 0x62,
+ 0x27, 0x1d, 0x5c, 0x1d, 0xf7, 0x80, 0x77, 0x1,
+ 0x4c, 0xf9, 0x47, 0xfb, 0x93, 0xf7, 0x93, 0x3,
+ 0x21, 0xa, 0x79, 0x5f, 0x6b, 0x2a, 0x1d, 0xfb,
+ 0x33, 0xf8, 0x62, 0x24, 0xa, 0x5c, 0x1d, 0xf7,
+ 0x7c, 0x77, 0x1, 0x54, 0xf9, 0x47, 0x3, 0x20,
+ 0x1d, 0xfb, 0x85, 0xf8, 0x62, 0x25, 0x1d, 0xe,
+ 0x5b, 0x1d, 0xf8, 0x7f, 0xf1, 0x5a, 0xbc, 0x12,
+ 0x90, 0xf9, 0x47, 0x13, 0xd0, 0x20, 0xa, 0x13,
+ 0x58, 0x77, 0x6, 0xfb, 0x64, 0xfc, 0x7f, 0x78,
+ 0x5f, 0x6c, 0x2a, 0x1d, 0xfb, 0x8f, 0xf8, 0x7b,
+ 0x83, 0x1d, 0x9b, 0xb3, 0xb0, 0x1b, 0xa4, 0xa1,
+ 0x80, 0x80, 0x9f, 0x1f, 0x13, 0xe0, 0x7c, 0xa5,
+ 0xa1, 0x7b, 0xa1, 0x1b, 0xd9, 0x9d, 0xcf, 0x65,
+ 0xa, 0x63, 0x7a, 0x6f, 0x81, 0x72, 0x1b, 0x7c,
+ 0x75, 0x98, 0x98, 0x73, 0x1f, 0x97, 0x75, 0x74,
+ 0x97, 0x77, 0x54, 0xa, 0x5c, 0x1d, 0xdd, 0xee,
+ 0x12, 0x8b, 0xf7, 0x5a, 0x99, 0xee, 0xef, 0xee,
+ 0x13, 0xfa, 0x20, 0x1d, 0x67, 0xf8, 0xa4, 0x15,
+ 0x6a, 0x1d, 0x13, 0xf6, 0xfb, 0x5b, 0x16, 0x6a,
+ 0x1d, 0xe, 0x5b, 0x1d, 0xf8, 0x6f, 0xf7, 0x3a,
+ 0x12, 0xf7, 0xb1, 0xf7, 0x18, 0xfb, 0x15, 0xf7,
+ 0x3a, 0x13, 0xe8, 0x20, 0x1d, 0xfb, 0x57, 0xf8,
+ 0xb1, 0x67, 0xa, 0xac, 0x16, 0xaf, 0xa9, 0x93,
+ 0xa, 0x6d, 0x67, 0x1e, 0x13, 0xf0, 0x67, 0x6d,
+ 0xa9, 0xaf, 0x1f, 0xe, 0xf8, 0xa8, 0x8b, 0xb1,
+ 0xf7, 0x72, 0xb2, 0xa9, 0xb0, 0xf7, 0x98, 0xaf,
+ 0x77, 0x9f, 0x12, 0x8b, 0xf7, 0x5b, 0xf7, 0x5b,
+ 0xee, 0xf7, 0x87, 0xa0, 0xab, 0xa2, 0x13, 0xf3,
+ 0x0, 0x13, 0xeb, 0x0, 0x8b, 0x4, 0xf7, 0x5b,
+ 0x9e, 0x6, 0x7e, 0x8d, 0x49, 0x89, 0xa0, 0xd8,
+ 0x93, 0xaa, 0xa5, 0xb7, 0xba, 0xe4, 0x8, 0xf7,
+ 0x44, 0xfb, 0x22, 0x6, 0x44, 0x7b, 0x78, 0x53,
+ 0x84, 0x1e, 0x7a, 0x89, 0x5, 0x78, 0xf8, 0x92,
+ 0x7, 0xb7, 0xf7, 0x3c, 0x5, 0x73, 0x6, 0xfb,
+ 0x2, 0x52, 0x68, 0x77, 0x22, 0x1b, 0x3f, 0x6,
+ 0x49, 0x88, 0x96, 0xcc, 0x1f, 0xf7, 0x6b, 0xf7,
+ 0x25, 0x7, 0xe2, 0x90, 0x5c, 0x56, 0x91, 0x1f,
+ 0xa0, 0xf7, 0x7e, 0x76, 0x6, 0x44, 0x85, 0x7c,
+ 0x71, 0xfb, 0x3, 0x1b, 0xfb, 0x3, 0xf7, 0x7a,
+ 0x6, 0xa8, 0x9b, 0x8c, 0x96, 0x1e, 0xe2, 0x6,
+ 0xf7, 0x16, 0xb4, 0x84, 0x29, 0x96, 0x1f, 0xa2,
+ 0xf7, 0x21, 0xfc, 0xc8, 0x6, 0x13, 0xf7, 0x80,
+ 0x77, 0x7, 0xc8, 0xa8, 0x80, 0x73, 0x83, 0x86,
+ 0x81, 0x87, 0x83, 0x1f, 0xfb, 0x89, 0xfc, 0x6e,
+ 0x68, 0x46, 0x79, 0x7e, 0x68, 0x85, 0x19, 0xf7,
+ 0x83, 0xf7, 0xac, 0x15, 0xf7, 0x30, 0xf7, 0xcd,
+ 0x5, 0x8e, 0xfb, 0xcd, 0x6, 0xe, 0xf7, 0xca,
+ 0xfb, 0x56, 0x76, 0xf7, 0x5d, 0xb7, 0xf8, 0xf2,
+ 0xb3, 0x1, 0xa7, 0xf7, 0x8, 0xf7, 0xa4, 0xd6,
+ 0xf5, 0xa2, 0x3, 0xf7, 0xae, 0x8e, 0xa, 0xcc,
+ 0x8c, 0xce, 0xa9, 0xbf, 0x1a, 0xc3, 0x54, 0xa2,
+ 0x52, 0x7f, 0x1e, 0xa0, 0xc1, 0xf7, 0x32, 0x9a,
+ 0xd5, 0xf6, 0x8c, 0x8d, 0x19, 0x79, 0x9d, 0x5,
+ 0x77, 0x1d, 0xf7, 0x24, 0xb7, 0xcb, 0xb2, 0xb1,
+ 0x1f, 0xb4, 0xb5, 0xc5, 0x9f, 0xbd, 0x1b, 0xf7,
+ 0xf, 0xd3, 0x31, 0x22, 0xa4, 0x1f, 0xa2, 0x6,
+ 0x82, 0xf7, 0x7f, 0x59, 0x1d, 0x1f, 0x8c, 0x6,
+ 0x66, 0x33, 0x92, 0x86, 0x5, 0xab, 0x94, 0xbe,
+ 0x8c, 0x86, 0xa, 0x5a, 0x1d, 0xf7, 0x78, 0x77,
+ 0x12, 0x7f, 0xa, 0x17, 0x97, 0x16, 0xf8, 0xb0,
+ 0x6, 0x13, 0xff, 0x80, 0x23, 0x1d, 0xf7, 0xdd,
+ 0xf9, 0x50, 0x27, 0x1d, 0x5a, 0x1d, 0xf7, 0x78,
+ 0x77, 0x1, 0x7f, 0xa, 0x3, 0xf7, 0x7c, 0xf9,
+ 0x63, 0x21, 0x1d, 0xfc, 0x3, 0xfd, 0xf7, 0x2c,
+ 0xa, 0x5a, 0x1d, 0xf7, 0x74, 0x77, 0x1, 0x7f,
+ 0xa, 0x3, 0xf7, 0x2a, 0x38, 0xa, 0xfb, 0x9a,
+ 0xfe, 0xa, 0x2c, 0xa, 0x7b, 0xa, 0xf7, 0xb5,
+ 0xb4, 0xf7, 0x94, 0xb1, 0xd3, 0xf0, 0x12, 0xee,
+ 0xf1, 0x5d, 0xf0, 0xee, 0xf0, 0x94, 0xa2, 0x13,
+ 0xfa, 0x97, 0x16, 0xf8, 0xb0, 0x6, 0x36, 0x1d,
+ 0x13, 0x7b, 0x26, 0xa, 0x13, 0x16, 0x3e, 0x7a,
+ 0xa, 0x13, 0xf6, 0xf7, 0x23, 0xf9, 0x91, 0x15,
+ 0x6c, 0x1d, 0xf7, 0x5c, 0x16, 0x6c, 0x1d, 0xe,
+ 0x73, 0x83, 0xa, 0xf7, 0x8c, 0x42, 0xa, 0xf7,
+ 0x4c, 0xf9, 0x50, 0x2d, 0xa, 0x89, 0x81, 0x1d,
+ 0x9d, 0x57, 0xa, 0x73, 0x83, 0xa, 0xf7, 0x8c,
+ 0x77, 0x1, 0xf7, 0x7, 0xf1, 0x3, 0xe8, 0xf9,
+ 0x63, 0x21, 0x1d, 0xfb, 0x72, 0xfd, 0xf7, 0x15,
+ 0xf7, 0xbf, 0x9e, 0x6, 0x41, 0x8d, 0x71, 0x60,
+ 0x1d, 0xa6, 0x9c, 0xd4, 0x8e, 0x1e, 0x9e, 0xfb,
+ 0xbf, 0x78, 0x7, 0x49, 0xa, 0xe, 0x73, 0x83,
+ 0xa, 0xf7, 0x88, 0x77, 0x1, 0xf7, 0x7, 0xf1,
+ 0x3, 0x96, 0x38, 0xa, 0xfb, 0x10, 0xfe, 0xa,
+ 0x15, 0xf7, 0xcb, 0x9e, 0x6, 0x41, 0x8d, 0x6c,
+ 0x60, 0x1d, 0xab, 0x9c, 0xd4, 0x8e, 0x1e, 0x9e,
+ 0xfb, 0xcb, 0x78, 0x7, 0xde, 0x87, 0xa0, 0x75,
+ 0x41, 0x89, 0x1d, 0x44, 0x78, 0x70, 0x36, 0x89,
+ 0x1e, 0xe, 0x73, 0xa0, 0x76, 0xf9, 0x17, 0x97,
+ 0xa, 0x12, 0xad, 0xed, 0x7a, 0xf1, 0x13, 0xd0,
+ 0x9d, 0x16, 0xf7, 0xbd, 0x9e, 0x6, 0x13, 0xc8,
+ 0x59, 0xa, 0x13, 0xb0, 0x9e, 0xfb, 0xbd, 0x7,
+ 0x13, 0xd0, 0x78, 0x7, 0x13, 0xc8, 0x49, 0xa,
+ 0xf9, 0x91, 0x4, 0x6d, 0x1d, 0xf7, 0x5b, 0x16,
+ 0x6d, 0x1d, 0xe, 0xf8, 0x1, 0x8b, 0xb0, 0xf7,
+ 0xaa, 0xb7, 0xf7, 0x9e, 0xb0, 0x1, 0xf3, 0xf1,
+ 0xf8, 0x6, 0x58, 0x1d, 0x96, 0x71, 0x41, 0x1f,
+ 0xfb, 0x4c, 0x34, 0x5f, 0xe2, 0xfb, 0x58, 0x7,
+ 0x45, 0x7f, 0x6d, 0x3f, 0x1e, 0xf7, 0x52, 0xf7,
+ 0xbc, 0x15, 0xf7, 0x26, 0xb7, 0xfb, 0x26, 0xf7,
+ 0x4b, 0x6, 0xbe, 0x8b, 0xab, 0x8b, 0xa, 0xfb,
+ 0xb7, 0xfb, 0x8a, 0x8b, 0x4b, 0x5b, 0x7f, 0x9f,
+ 0xc5, 0x1e, 0xe, 0xf8, 0x1, 0x95, 0x76, 0xab,
+ 0x76, 0xf7, 0x49, 0x77, 0xf8, 0x89, 0x77, 0xf1,
+ 0xf5, 0x12, 0xf7, 0x1, 0xb7, 0xf8, 0x33, 0xb7,
+ 0x13, 0x7e, 0x5f, 0xa, 0xf8, 0x10, 0x8d, 0x7,
+ 0x13, 0xbe, 0x3a, 0xa, 0x13, 0x7e, 0xf7, 0x4c,
+ 0xf9, 0x69, 0x4c, 0xa, 0x9d, 0x67, 0x1f, 0x97,
+ 0x74, 0x75, 0x91, 0x76, 0x54, 0xa, 0x30, 0x1d,
+ 0xf7, 0x8d, 0xf8, 0x10, 0x27, 0x1d, 0x30, 0x1d,
+ 0xf7, 0x20, 0xf8, 0x10, 0x24, 0xa, 0x5b, 0xa,
+ 0xf7, 0x66, 0x77, 0x74, 0xa, 0xf7, 0x62, 0x38,
+ 0xa, 0xfb, 0xbc, 0xfc, 0xb8, 0x29, 0x1d, 0xe,
+ 0x5b, 0xa, 0xcf, 0xf5, 0x85, 0xa, 0xf7, 0xde,
+ 0x70, 0xa, 0xfb, 0x17, 0x69, 0x1d, 0xf7, 0x17,
+ 0x61, 0x1d, 0xf7, 0x8, 0x61, 0xa, 0xfb, 0x8,
+ 0x44, 0x1d, 0xdc, 0xf1, 0xf1, 0xf7, 0x3, 0x3a,
+ 0x71, 0x1d, 0x32, 0x72, 0x1d, 0xe4, 0xf7, 0x70,
+ 0x1e, 0xbb, 0xf8, 0x31, 0x4c, 0xa, 0x91, 0x7f,
+ 0x1f, 0xa3, 0x5c, 0x75, 0x91, 0x76, 0x54, 0xa,
+ 0x5b, 0xa, 0xc6, 0xef, 0x7b, 0x1d, 0xca, 0xef,
+ 0xef, 0xef, 0xca, 0x9a, 0xa, 0xad, 0xf7, 0xe6,
+ 0x70, 0xa, 0xfb, 0x1f, 0x69, 0x1d, 0xf7, 0x10,
+ 0x61, 0x1d, 0xf7, 0xf, 0x34, 0xa, 0x33, 0x71,
+ 0x1d, 0x39, 0x5e, 0xa, 0xca, 0xf8, 0x52, 0x15,
+ 0x30, 0xa, 0xf7, 0x5c, 0x16, 0x30, 0xa, 0xe,
+ 0xf7, 0x63, 0xa8, 0x76, 0xac, 0x76, 0xf8, 0x71,
+ 0x77, 0x12, 0x13, 0xa0, 0xc5, 0xc3, 0x15, 0xa6,
+ 0x6f, 0xf7, 0x59, 0xf7, 0x59, 0x5, 0x13, 0x60,
+ 0xf7, 0x61, 0xfb, 0x61, 0xa7, 0xa6, 0xfb, 0x61,
+ 0xf7, 0x62, 0xf7, 0x59, 0xf7, 0x58, 0x6f, 0xa7,
+ 0xfb, 0x59, 0xfb, 0x59, 0xfb, 0x58, 0xf7, 0x59,
+ 0x70, 0x6e, 0xf7, 0x57, 0xfb, 0x57, 0x5, 0xe,
+ 0xf8, 0x1, 0x50, 0x76, 0xcd, 0xaf, 0xf8, 0xfe,
+ 0xaf, 0xc5, 0x77, 0x74, 0xa, 0xf7, 0x6f, 0xe3,
+ 0x15, 0xf7, 0xc8, 0xf8, 0x58, 0x5, 0xa8, 0x5a,
+ 0x9d, 0x41, 0x2e, 0x1a, 0xfb, 0x70, 0x25, 0x39,
+ 0xfb, 0x3, 0x57, 0x57, 0x9f, 0xb9, 0x65, 0x1e,
+ 0x72, 0xae, 0x15, 0x6e, 0xbc, 0x7a, 0xd9, 0xe6,
+ 0x1a, 0xf7, 0x78, 0xf7, 0x3, 0xd2, 0xf1, 0xbc,
+ 0xbf, 0x78, 0x5d, 0xb3, 0x1e, 0xfc, 0x52, 0xfd,
+ 0x23, 0x15, 0xbc, 0x6, 0xda, 0xf7, 0x8, 0x5,
+ 0x6a, 0xbe, 0xc8, 0x7a, 0xcc, 0x1b, 0xf7, 0x49,
+ 0xf7, 0x26, 0xf7, 0x10, 0xf7, 0x69, 0xf7, 0x11,
+ 0x5b, 0xed, 0x45, 0xc5, 0x1f, 0xe3, 0xf7, 0x16,
+ 0x5, 0x5a, 0x6, 0x43, 0x20, 0x5, 0xac, 0x56,
+ 0x4e, 0x9b, 0x4d, 0x1b, 0xfb, 0x38, 0xfb, 0x37,
+ 0x21, 0xfb, 0x7a, 0xfb, 0xb, 0xb8, 0x24, 0xd3,
+ 0x50, 0x1f, 0xe, 0x7c, 0xa, 0xf7, 0xfd, 0xb7,
+ 0x3, 0x99, 0xf9, 0x17, 0x15, 0xd7, 0x99, 0x71,
+ 0x41, 0x1f, 0xfb, 0xc6, 0x7, 0x4a, 0x8b, 0xfb,
+ 0x4e, 0xf7, 0x8c, 0xf7, 0x97, 0x8b, 0xf7, 0x47,
+ 0xe4, 0x1e, 0xf7, 0x8f, 0x7, 0xf4, 0x9c, 0xab,
+ 0xd8, 0x8c, 0x1e, 0x9e, 0xfb, 0x7c, 0x78, 0x7,
+ 0xd1, 0x8a, 0xa3, 0x6d, 0x20, 0x1a, 0xfb, 0x98,
+ 0x7, 0xfb, 0x11, 0x4f, 0x31, 0x98, 0x1d, 0xf7,
+ 0x22, 0xc8, 0x1e, 0xf7, 0xca, 0x7, 0xd2, 0x97,
+ 0xa7, 0xda, 0x8c, 0x1e, 0x88, 0xa, 0xf8, 0x13,
+ 0xc4, 0x3a, 0x1d, 0x73, 0x87, 0x8b, 0x7b, 0x1b,
+ 0x6c, 0x8a, 0x81, 0x1d, 0x9c, 0x57, 0xa, 0x7c,
+ 0xa, 0xf7, 0xf6, 0xb7, 0x3, 0xf8, 0x4, 0xf9,
+ 0x63, 0x21, 0x1d, 0xfc, 0x89, 0xfb, 0x74, 0x32,
+ 0x1d, 0x6e, 0xa, 0xf7, 0x88, 0x77, 0x1, 0xf3,
+ 0xf1, 0xf7, 0xf6, 0xb7, 0x3, 0xf7, 0x62, 0x38,
+ 0xa, 0xfb, 0xd0, 0xfb, 0x87, 0x32, 0x1d, 0xf8,
+ 0x1, 0x7d, 0xb7, 0xf8, 0xf9, 0x97, 0xa, 0xe9,
+ 0xee, 0x12, 0xf7, 0x13, 0xf1, 0x7a, 0xee, 0xf0,
+ 0xee, 0xb4, 0xb7, 0x13, 0xcb, 0x99, 0xf9, 0x17,
+ 0x2e, 0x1d, 0x13, 0xbb, 0x9e, 0xfb, 0x7c, 0x7,
+ 0x13, 0xcb, 0x50, 0x1d, 0x4f, 0x3f, 0xfb, 0x13,
+ 0x47, 0xa, 0x13, 0xbb, 0x88, 0xa, 0x13, 0xcb,
+ 0x13, 0xb7, 0xf7, 0x5a, 0xf7, 0xf, 0x4a, 0x1d,
+ 0xf8, 0x1, 0x83, 0xa, 0xf7, 0x8c, 0x72, 0xa,
+ 0xa8, 0xde, 0x1a, 0xf7, 0x3f, 0x7e, 0x1d, 0x4b,
+ 0x1d, 0x5e, 0x1d, 0xf7, 0x6, 0xf9, 0x50, 0x24,
+ 0xa, 0xf7, 0x5b, 0x93, 0x9e, 0xf7, 0x25, 0xb3,
+ 0xf7, 0x95, 0xb1, 0xf7, 0x34, 0x77, 0x6d, 0xa,
+ 0x98, 0xe9, 0x1a, 0xac, 0x66, 0x1d, 0xf7, 0x6,
+ 0x21, 0xcd, 0xfb, 0x2e, 0x1e, 0x3b, 0x6, 0x88,
+ 0xe7, 0x9a, 0x97, 0xda, 0x92, 0x8, 0x9e, 0xfb,
+ 0xa9, 0x78, 0x7, 0xd4, 0x84, 0x96, 0x7f, 0x44,
+ 0x1a, 0xfc, 0x3b, 0x8d, 0xa, 0xf7, 0x4a, 0x15,
+ 0xf7, 0x98, 0x7, 0xac, 0x96, 0x8b, 0xa9, 0xb7,
+ 0xf7, 0x26, 0x8a, 0x74, 0x1d, 0x82, 0xa8, 0x77,
+ 0x9f, 0xf9, 0x10, 0xa6, 0x12, 0xd4, 0xdf, 0xf7,
+ 0x45, 0xe2, 0x5c, 0xe9, 0x13, 0x78, 0x97, 0x16,
+ 0xf7, 0x25, 0xf8, 0xb9, 0x6, 0x9b, 0x8d, 0xe6,
+ 0xe2, 0xbb, 0xb3, 0x5f, 0x2d, 0x1e, 0xfb, 0x38,
+ 0xfb, 0x10, 0xc1, 0x69, 0x1a, 0x6e, 0xc4, 0xa5,
+ 0xbb, 0x65, 0x1e, 0x13, 0xb4, 0x9c, 0x7d, 0xb5,
+ 0x60, 0x23, 0x1a, 0x38, 0x82, 0x46, 0x54, 0x7a,
+ 0x85, 0x92, 0x99, 0x87, 0x1e, 0x89, 0x93, 0x8a,
+ 0x96, 0x8a, 0x97, 0x8, 0x9f, 0x89, 0x7c, 0x9f,
+ 0x72, 0x1b, 0x71, 0x78, 0x77, 0x6e, 0x75, 0x9c,
+ 0x59, 0xdd, 0xf7, 0x1, 0xcf, 0xef, 0xe6, 0xf7,
+ 0x21, 0xfb, 0x4, 0xbe, 0x46, 0x8d, 0x1f, 0x8d,
+ 0x7, 0x13, 0x78, 0xf7, 0x3, 0xbb, 0xa2, 0xb4,
+ 0xd0, 0x1a, 0xf6, 0x2c, 0xb3, 0x43, 0xfb, 0x48,
+ 0x8a, 0xfb, 0x3a, 0x4c, 0x1e, 0xfb, 0xfc, 0x7,
+ 0x4a, 0x73, 0x80, 0x66, 0x88, 0x1e, 0xe, 0x4f,
+ 0x1d, 0xf7, 0x6e, 0x77, 0x12, 0xb0, 0xe3, 0x39,
+ 0xe3, 0xf7, 0x30, 0xdc, 0x13, 0xda, 0x34, 0x1d,
+ 0x1e, 0x13, 0xd6, 0xfb, 0x8, 0x67, 0x44, 0x63,
+ 0x7b, 0x8c, 0x6f, 0xaa, 0xa5, 0xa4, 0x97, 0xa0,
+ 0x1f, 0x94, 0x80, 0xa4, 0x9a, 0x1a, 0x13, 0xba,
+ 0xaa, 0xb1, 0x37, 0xa, 0xcb, 0x89, 0xa, 0xbe,
+ 0xab, 0xa4, 0x1e, 0x6d, 0xf8, 0x46, 0x27, 0x1d,
+ 0x4f, 0x1d, 0xf7, 0x6e, 0x77, 0x1, 0xaa, 0xe3,
+ 0xf7, 0x3c, 0xdc, 0x3, 0x34, 0x1d, 0xfb, 0x8,
+ 0x4f, 0x44, 0x63, 0x7b, 0xa4, 0x6f, 0xaa, 0xa5,
+ 0x91, 0xa1, 0xa0, 0x1e, 0xb2, 0x7, 0xaa, 0xb9,
+ 0x37, 0xa, 0xb3, 0x66, 0xc1, 0xe9, 0xb1, 0xbe,
+ 0xab, 0xa4, 0x1e, 0xfb, 0x1f, 0xf8, 0x46, 0x15,
+ 0xf7, 0x27, 0xf7, 0x28, 0x5, 0xa2, 0xa2, 0x91,
+ 0x8b, 0x9a, 0x1b, 0xab, 0x8c, 0x6f, 0x87, 0x74,
+ 0x78, 0x7f, 0x80, 0x84, 0x1f, 0xfb, 0x2e, 0x2a,
+ 0x5, 0xe, 0x4f, 0x1d, 0xf7, 0x6a, 0x77, 0x84,
+ 0xa, 0xce, 0xf8, 0x8f, 0x25, 0x1d, 0xeb, 0xfc,
+ 0x2a, 0x29, 0xa, 0x4f, 0x1d, 0xd3, 0xf5, 0x84,
+ 0xa, 0xc4, 0xf8, 0xa8, 0x83, 0x1d, 0x96, 0xaf,
+ 0xb1, 0x1b, 0x97, 0x98, 0x84, 0x45, 0x1d, 0x74,
+ 0x94, 0x91, 0x7f, 0x1f, 0xa3, 0x5c, 0x77, 0x96,
+ 0x76, 0x1b, 0x48, 0x6d, 0x4d, 0x5f, 0x83, 0x1f,
+ 0xf7, 0x7a, 0xfb, 0x9c, 0x29, 0xa, 0x4f, 0x1d,
+ 0xcb, 0xee, 0x12, 0xb0, 0xe3, 0x46, 0xe3, 0x44,
+ 0xee, 0xf0, 0xea, 0x3a, 0xdc, 0x13, 0xd8, 0x80,
+ 0xf7, 0xb3, 0xf7, 0xa0, 0x28, 0x1d, 0x13, 0xd5,
+ 0x0, 0x3e, 0x1d, 0x13, 0xb8, 0x80, 0x3c, 0x1d,
+ 0x13, 0xd3, 0x0, 0xfb, 0x6b, 0xf8, 0x88, 0x4a,
+ 0x1d, 0xe2, 0x81, 0xc5, 0xf7, 0x95, 0xf7, 0x2b,
+ 0x77, 0xa3, 0xcd, 0xad, 0xf7, 0x17, 0xad, 0x12,
+ 0xc3, 0xe3, 0x64, 0xe3, 0x3d, 0xad, 0xf7, 0x7,
+ 0xdc, 0x98, 0xae, 0x13, 0xda, 0x40, 0xf7, 0xb3,
+ 0xf7, 0xa0, 0x24, 0x1d, 0x13, 0xdc, 0x80, 0x40,
+ 0xa, 0xeb, 0xfb, 0x29, 0xfb, 0x8, 0x5c, 0x48,
+ 0x57, 0x1d, 0x1e, 0x94, 0x86, 0x9a, 0x9a, 0x1a,
+ 0x13, 0xba, 0x40, 0xaa, 0xb1, 0x99, 0xac, 0xa9,
+ 0xba, 0x57, 0x43, 0x1e, 0x7b, 0x4f, 0xa, 0xbf,
+ 0x89, 0xa, 0xbd, 0xac, 0xb0, 0x1e, 0x13, 0xd9,
+ 0x40, 0xfb, 0x39, 0xf8, 0xae, 0x67, 0xa, 0xad,
+ 0x16, 0xaf, 0xa8, 0x93, 0xa, 0x6e, 0x67, 0x67,
+ 0x6e, 0xa8, 0xaf, 0x1e, 0xe, 0xf7, 0xca, 0x81,
+ 0xbb, 0x5b, 0xce, 0xf7, 0x70, 0xa9, 0x88, 0xf7,
+ 0x30, 0x73, 0xa3, 0x12, 0xb1, 0xe2, 0x4a, 0xe4,
+ 0xf7, 0x10, 0xdc, 0x13, 0x6d, 0xf7, 0xc6, 0xd4,
+ 0x15, 0x71, 0x9c, 0xa9, 0x52, 0xe1, 0x1b, 0xb1,
+ 0xe9, 0x98, 0xf7, 0x26, 0xc8, 0x1f, 0x7f, 0x90,
+ 0x5, 0x56, 0x6a, 0x59, 0x5f, 0x54, 0x1b, 0xfb,
+ 0x14, 0x8b, 0xf7, 0xd, 0xee, 0x1f, 0xf7, 0x9a,
+ 0x6, 0x13, 0x93, 0xbd, 0x7c, 0xf7, 0x19, 0xfb,
+ 0x22, 0x58, 0x6d, 0x7f, 0x6a, 0x62, 0x1e, 0xa0,
+ 0x73, 0x6e, 0xa3, 0x49, 0x1b, 0x35, 0x43, 0x5e,
+ 0x4d, 0x65, 0xa4, 0x80, 0x9c, 0xba, 0x8b, 0xb5,
+ 0xaf, 0x1f, 0x13, 0xad, 0xa8, 0x9e, 0xa4, 0xb8,
+ 0xcd, 0x89, 0x57, 0x24, 0x87, 0x1e, 0xfb, 0x35,
+ 0x4a, 0x41, 0x6d, 0x31, 0x1a, 0x61, 0xab, 0x4b,
+ 0xde, 0xee, 0x92, 0xb7, 0xb2, 0xba, 0x1e, 0x7e,
+ 0xa4, 0x15, 0x7d, 0x52, 0x5d, 0x64, 0x54, 0x7a,
+ 0xc2, 0xa5, 0xca, 0xa4, 0xa7, 0xf7, 0xf, 0xb6,
+ 0x1e, 0x8c, 0x57, 0x5, 0x8c, 0x44, 0x9d, 0x72,
+ 0x84, 0x1a, 0xc9, 0xf7, 0x65, 0x15, 0xb5, 0x8d,
+ 0x8f, 0xdd, 0xde, 0x1b, 0xd3, 0x90, 0x37, 0x63,
+ 0x1f, 0xe, 0xe2, 0xfb, 0x56, 0x76, 0xf7, 0x61,
+ 0xd3, 0xf7, 0x91, 0xf7, 0x25, 0x6e, 0xa8, 0x12,
+ 0xa4, 0xd8, 0xf7, 0x31, 0xd6, 0x13, 0xdc, 0xf7,
+ 0x11, 0x8e, 0xa, 0xcb, 0xcf, 0xaa, 0xbf, 0xc3,
+ 0x54, 0xa2, 0x52, 0x7f, 0x1f, 0xa1, 0xc5, 0xcd,
+ 0x95, 0xc2, 0xb8, 0xba, 0xee, 0x19, 0x63, 0x1d,
+ 0x90, 0x79, 0x6d, 0x93, 0x1f, 0x13, 0xec, 0x5f,
+ 0x97, 0x9c, 0x73, 0xa5, 0x1b, 0xa9, 0x9b, 0xa0,
+ 0xa2, 0xca, 0x33, 0xb1, 0x4e, 0xfb, 0x0, 0xfb,
+ 0x8, 0x38, 0xfb, 0x38, 0xfb, 0x30, 0xf3, 0x4a,
+ 0xda, 0x89, 0x1f, 0x65, 0x2e, 0x92, 0x86, 0x5,
+ 0xab, 0x94, 0xbd, 0x8d, 0x86, 0xa, 0xe2, 0x81,
+ 0xd0, 0xf7, 0x4f, 0xab, 0xf7, 0xd, 0xaf, 0xf7,
+ 0x87, 0x77, 0x12, 0xa3, 0xd0, 0xf7, 0x68, 0xf1,
+ 0x17, 0x26, 0x1d, 0x13, 0x7c, 0x3d, 0x1d, 0x5e,
+ 0xf7, 0x64, 0x27, 0x1d, 0x87, 0x1d, 0xf7, 0x11,
+ 0xaf, 0xf7, 0x6e, 0x77, 0x1, 0xac, 0xd0, 0xf7,
+ 0x46, 0xf1, 0x3, 0x28, 0xa, 0xfb, 0x6, 0xf7,
+ 0x64, 0x24, 0xa, 0x87, 0x1d, 0xf7, 0x11, 0xaf,
+ 0xf7, 0x6a, 0x77, 0x1, 0xa4, 0xd0, 0xf7, 0x65,
+ 0xf1, 0x3, 0x28, 0xa, 0xfb, 0x80, 0xf7, 0x64,
+ 0x25, 0x1d, 0xe, 0xe2, 0x81, 0xd0, 0xf7, 0x58,
+ 0xab, 0xf7, 0x1d, 0xaf, 0xca, 0xef, 0x12, 0xa4,
+ 0xd0, 0x77, 0xed, 0xf0, 0xed, 0x13, 0xfa, 0x28,
+ 0xa, 0x13, 0xf6, 0xfb, 0x79, 0xf7, 0xa6, 0x15,
+ 0x4b, 0xa, 0x8f, 0xa, 0xf9, 0x3a, 0x27, 0xa,
+ 0xf7, 0x33, 0xf8, 0x80, 0x27, 0x1d, 0x8f, 0xa,
+ 0xf9, 0x3a, 0x27, 0xa, 0xbd, 0xf8, 0x80, 0x24,
+ 0xa, 0x8f, 0xa, 0xf9, 0x36, 0x27, 0xa, 0x6b,
+ 0xf8, 0x80, 0x25, 0x1d, 0xe, 0x8f, 0xa, 0xf8,
+ 0xa0, 0xee, 0x1, 0x82, 0xed, 0x91, 0xdf, 0x96,
+ 0xed, 0x23, 0xa, 0x72, 0xf8, 0xc2, 0x15, 0x6b,
+ 0xa, 0xf7, 0x5b, 0x16, 0x6b, 0xa, 0xe, 0x71,
+ 0xa, 0xf7, 0x76, 0x77, 0x1, 0xa8, 0xe5, 0xf7,
+ 0x9a, 0xe5, 0x3, 0xf7, 0xb, 0xf7, 0xaa, 0x15,
+ 0xf1, 0xc3, 0xbf, 0xca, 0xd4, 0xd1, 0x3d, 0xfb,
+ 0x2f, 0xfb, 0x23, 0x48, 0x65, 0x58, 0xfb, 0xc,
+ 0x73, 0xf7, 0x4c, 0xd7, 0x1e, 0xf7, 0x89, 0xf7,
+ 0x11, 0x15, 0xb4, 0x60, 0x69, 0x9b, 0x61, 0x1b,
+ 0xfb, 0x19, 0x38, 0xfb, 0x1, 0xfb, 0x17, 0xfb,
+ 0x13, 0xe6, 0x24, 0x65, 0x1d, 0xf7, 0x32, 0xf7,
+ 0x1c, 0xf7, 0xb, 0x5e, 0xf7, 0xd, 0x2e, 0xd9,
+ 0x1f, 0xe6, 0xbb, 0x6a, 0xa9, 0x2c, 0x59, 0x62,
+ 0xa5, 0x57, 0xa5, 0x50, 0x8f, 0x19, 0x61, 0x75,
+ 0xbb, 0x84, 0xb8, 0x6d, 0xb3, 0x6e, 0x19, 0xfb,
+ 0xd, 0x4b, 0xac, 0x6d, 0xf7, 0xf, 0xcc, 0xbe,
+ 0x5a, 0xae, 0x54, 0x95, 0x4f, 0x19, 0xe, 0xa0,
+ 0x76, 0xf8, 0x29, 0xc2, 0xd6, 0xf2, 0x73, 0xa,
+ 0xb2, 0xb6, 0x1a, 0xf7, 0x8c, 0x7e, 0xa, 0xfb,
+ 0x5b, 0x7, 0x3f, 0x71, 0x7c, 0x82, 0x1d, 0xa7,
+ 0xce, 0x1a, 0xf7, 0x58, 0x46, 0xa, 0xd0, 0xf8,
+ 0x99, 0x15, 0xa8, 0x6, 0xb0, 0x8e, 0xac, 0x9e,
+ 0xa3, 0x1b, 0xa6, 0x9f, 0x79, 0x82, 0xa0, 0x1f,
+ 0x7e, 0xaa, 0xa2, 0x7e, 0x9e, 0x1b, 0xd9, 0x98,
+ 0xd0, 0x65, 0xa, 0x5e, 0x83, 0x7a, 0x80, 0x75,
+ 0x1b, 0x77, 0x72, 0x98, 0x95, 0x74, 0x1f, 0x9b,
+ 0x66, 0x76, 0x9c, 0x74, 0x54, 0xa, 0x71, 0xa,
+ 0xf7, 0x6e, 0x77, 0x1, 0xb9, 0xe5, 0xf7, 0x8a,
+ 0xe5, 0x3, 0x2f, 0x1d, 0xa6, 0x15, 0xf3, 0xc2,
+ 0xd4, 0xca, 0xe7, 0xbe, 0x34, 0x80, 0xa, 0x46,
+ 0x4f, 0x58, 0xfb, 0xc, 0x76, 0xf7, 0x37, 0xd5,
+ 0x1e, 0xf7, 0x3b, 0xf7, 0x90, 0x3b, 0x1d, 0x9e,
+ 0x74, 0x86, 0x94, 0xa, 0x9c, 0x57, 0xa, 0x71,
+ 0xa, 0xf7, 0x6e, 0x77, 0x1, 0xa8, 0xe5, 0xf7,
+ 0x99, 0xe5, 0x3, 0xa8, 0xf7, 0x7b, 0x15, 0xfb,
+ 0x1b, 0xe5, 0x21, 0x65, 0x1d, 0xf7, 0x1c, 0xee,
+ 0xf7, 0x25, 0x2d, 0xe5, 0xfb, 0x17, 0xfb, 0x1a,
+ 0x39, 0x21, 0xfb, 0xf, 0x1e, 0xe5, 0xad, 0x15,
+ 0xf3, 0xc9, 0xca, 0xca, 0xe7, 0xb7, 0x30, 0x80,
+ 0xa, 0x3b, 0x53, 0x58, 0xfb, 0xc, 0x81, 0xf7,
+ 0x41, 0xd5, 0x1e, 0xc5, 0xf7, 0x86, 0x24, 0xa,
+ 0x71, 0xa, 0xf7, 0x6a, 0x77, 0x4c, 0x1d, 0xa9,
+ 0x15, 0xf3, 0xc2, 0xd1, 0xca, 0xe7, 0xbe, 0x3a,
+ 0x80, 0xa, 0x44, 0x49, 0x58, 0xfb, 0xc, 0x78,
+ 0xf7, 0x3a, 0xd5, 0x1e, 0x73, 0xf7, 0x8d, 0x25,
+ 0x1d, 0xe, 0x71, 0xa, 0xd3, 0xf5, 0x4c, 0x1d,
+ 0xbb, 0x15, 0xf3, 0xc2, 0xbf, 0xca, 0xe7, 0xbe,
+ 0xfb, 0x1, 0x80, 0xa, 0x48, 0x65, 0x58, 0xfb,
+ 0xc, 0x74, 0xf7, 0x4c, 0xd5, 0x1e, 0x69, 0xf7,
+ 0x94, 0x15, 0xa8, 0x6, 0x91, 0x9c, 0x9b, 0xbb,
+ 0xaf, 0x7e, 0x8, 0x71, 0xd1, 0xb0, 0x71, 0x52,
+ 0x1d, 0x7a, 0x63, 0x7c, 0x7a, 0x71, 0x92, 0x8,
+ 0x9b, 0x51, 0x50, 0xad, 0x76, 0x54, 0xa, 0x71,
+ 0xa, 0xca, 0xef, 0x12, 0xa8, 0xe5, 0x79, 0xef,
+ 0xee, 0xef, 0x77, 0xe5, 0x13, 0xf2, 0x2f, 0x1d,
+ 0xa4, 0x15, 0xf3, 0xc2, 0xd6, 0xca, 0xe7, 0xbe,
+ 0x3d, 0x80, 0xa, 0x48, 0x46, 0x58, 0xfb, 0xc,
+ 0x74, 0xf7, 0x35, 0xd5, 0x1e, 0x13, 0xec, 0x79,
+ 0xf7, 0xd4, 0x15, 0x30, 0xa, 0xf7, 0x5b, 0x16,
+ 0x30, 0xa, 0xe, 0xf7, 0x63, 0x96, 0x76, 0xe1,
+ 0x77, 0xb9, 0xf7, 0xa, 0x8b, 0xcd, 0x55, 0xb6,
+ 0xf7, 0x85, 0x77, 0x12, 0xf7, 0x76, 0xf7, 0x5,
+ 0x27, 0xe1, 0x13, 0xee, 0xa9, 0xf7, 0x7c, 0x15,
+ 0xf8, 0x8c, 0xb6, 0xfc, 0x8c, 0x6, 0xf7, 0x90,
+ 0xfb, 0xb1, 0x15, 0x13, 0xf5, 0x6c, 0xa, 0xf8,
+ 0x4c, 0x4, 0x6c, 0xa, 0xe, 0x30, 0x76, 0xf1,
+ 0xa7, 0xf8, 0x32, 0xa7, 0xe6, 0x77, 0x1, 0xa8,
+ 0xe5, 0xf7, 0x99, 0xe5, 0x3, 0xf7, 0x47, 0xc7,
+ 0x15, 0xf7, 0x35, 0xf7, 0xc6, 0x5, 0xa5, 0x60,
+ 0x99, 0x4f, 0x4b, 0x1a, 0xfb, 0x23, 0x48, 0x65,
+ 0x58, 0x67, 0x70, 0x9b, 0xa5, 0x77, 0x1e, 0xfb,
+ 0x13, 0xfb, 0x40, 0x15, 0xb0, 0x6, 0xcc, 0xf7,
+ 0xf, 0x5, 0x7d, 0xa8, 0xaa, 0x84, 0xad, 0x1b,
+ 0xf7, 0x2c, 0xd1, 0xf7, 0x1f, 0xee, 0xe7, 0x66,
+ 0xcf, 0x4e, 0xb1, 0x1f, 0xcc, 0xf7, 0x11, 0x5,
+ 0x64, 0x6, 0x52, 0xfb, 0x1, 0x5, 0x97, 0x6e,
+ 0x6b, 0x91, 0x68, 0x1b, 0xfb, 0x1a, 0x39, 0xfb,
+ 0x1, 0xfb, 0xf, 0x36, 0xaf, 0x42, 0xc7, 0x61,
+ 0x1f, 0xac, 0xcb, 0x15, 0x6c, 0xc6, 0x83, 0xdd,
+ 0xb6, 0x1a, 0xf3, 0xc2, 0xbf, 0xca, 0xab, 0xa5,
+ 0x7e, 0x74, 0xa1, 0x1e, 0xe, 0x76, 0x1d, 0xf7,
+ 0xe6, 0xe1, 0x15, 0x2e, 0x7, 0x8d, 0x88, 0x87,
+ 0xa, 0x19, 0x22, 0xa, 0x57, 0xf8, 0x39, 0x27,
+ 0x1d, 0x76, 0x1d, 0xf7, 0x45, 0xf8, 0x8f, 0x21,
+ 0x1d, 0x9b, 0xfd, 0x2d, 0x25, 0xa, 0xe, 0x81,
+ 0xc7, 0xf8, 0x24, 0x77, 0xf7, 0x88, 0x90, 0xa,
+ 0xea, 0xf8, 0x8f, 0x25, 0x1d, 0xf7, 0xd, 0xfd,
+ 0x40, 0x25, 0xa, 0xe, 0x81, 0xc7, 0xf8, 0x13,
+ 0xf7, 0x52, 0x27, 0xef, 0x12, 0xd2, 0xdf, 0x55,
+ 0xef, 0xed, 0xef, 0x49, 0xdf, 0x13, 0xd2, 0xf7,
+ 0xe8, 0x81, 0x25, 0xa, 0x13, 0xac, 0xfb, 0x81,
+ 0xf8, 0xd8, 0x15, 0x30, 0xa, 0xf7, 0x5a, 0x16,
+ 0x30, 0xa, 0xe, 0x96, 0xa, 0xf8, 0xc2, 0x9a,
+ 0xf7, 0x71, 0x77, 0x12, 0xf7, 0xe8, 0xf7, 0x1b,
+ 0x13, 0x90, 0x40, 0x1d, 0x13, 0x78, 0x41, 0xa,
+ 0xfb, 0x28, 0xf7, 0x46, 0x24, 0xa, 0x8e, 0x1d,
+ 0xf7, 0x73, 0x77, 0x1, 0xd6, 0xdf, 0xf7, 0x75,
+ 0xe1, 0x3, 0x90, 0xfb, 0x5b, 0x15, 0x79, 0xf7,
+ 0x86, 0x9d, 0x7, 0x43, 0x7b, 0xa0, 0xcb, 0x1f,
+ 0xf7, 0x27, 0x7, 0x5f, 0x1d, 0x75, 0x1f, 0x89,
+ 0x8d, 0x5, 0x8c, 0xf7, 0xbb, 0x6, 0x86, 0x8e,
+ 0x6b, 0x1d, 0x76, 0x6d, 0x1f, 0xfd, 0x4a, 0x7,
+ 0x60, 0x87, 0x6c, 0x49, 0x87, 0x1e, 0xf7, 0x2e,
+ 0xf7, 0xb3, 0x15, 0x5a, 0xa, 0x96, 0xa, 0xf8,
+ 0xbb, 0xf7, 0x50, 0x27, 0xef, 0x12, 0xf1, 0xed,
+ 0xf0, 0xed, 0x13, 0xac, 0x40, 0x1d, 0x13, 0x6c,
+ 0x41, 0xa, 0xfb, 0x9b, 0xf7, 0x88, 0x15, 0x13,
+ 0x9c, 0x4b, 0xa, 0x8f, 0xa, 0xf8, 0x60, 0x27,
+ 0xa, 0xe, 0xf7, 0x92, 0x8b, 0x9e, 0xf9, 0x4,
+ 0x9e, 0x1, 0xee, 0x5d, 0x1d, 0x9b, 0xd4, 0x1f,
+ 0xf7, 0x40, 0x7, 0xf7, 0x2f, 0xe9, 0x5, 0xbc,
+ 0x7, 0xfb, 0x2f, 0x2c, 0x5, 0xf7, 0x50, 0x7,
+ 0xe1, 0x73, 0x1d, 0xfb, 0x88, 0x7, 0x34, 0x55,
+ 0x5, 0x5a, 0x7, 0xe2, 0xc0, 0x5, 0xfb, 0xb,
+ 0x7, 0x33, 0x7a, 0xa, 0xe, 0x8f, 0xa, 0xf9,
+ 0x3, 0x9b, 0xb7, 0x77, 0x1, 0xe1, 0xdf, 0x3,
+ 0x9e, 0x16, 0xf7, 0x84, 0x9a, 0x6, 0x51, 0x8e,
+ 0x78, 0x9d, 0xc5, 0x1a, 0xf7, 0xcd, 0x7, 0xd8,
+ 0xbf, 0x5, 0xb7, 0x7, 0x3e, 0x56, 0x5, 0xf7,
+ 0x7b, 0x5d, 0xa, 0xfb, 0x40, 0x7, 0x3c, 0x56,
+ 0x5, 0x5f, 0x7, 0xda, 0xbf, 0x5, 0xfb, 0x91,
+ 0x7, 0x57, 0x77, 0x74, 0x50, 0x84, 0x1d, 0xf8,
+ 0xa8, 0x85, 0xb0, 0x6c, 0xb2, 0xf7, 0xb6, 0xb0,
+ 0xf7, 0x9e, 0xa9, 0x6d, 0xaf, 0x6b, 0xaf, 0x12,
+ 0xa9, 0xf7, 0x4, 0xf7, 0xb5, 0xef, 0xf7, 0x7b,
+ 0xa1, 0x13, 0xa7, 0x0, 0xf8, 0xa7, 0xf7, 0xdd,
+ 0x15, 0xf7, 0x2c, 0x88, 0x8a, 0x81, 0xa4, 0x1f,
+ 0xab, 0x81, 0x9f, 0x6d, 0x90, 0x5a, 0x8, 0x13,
+ 0xa7, 0x80, 0xa1, 0xf7, 0x7e, 0x75, 0x6, 0x2a,
+ 0x7d, 0x85, 0x8b, 0xfb, 0x67, 0x1b, 0xf7, 0x80,
+ 0x7, 0x9e, 0x8f, 0x90, 0xf7, 0x4, 0xf7, 0x4,
+ 0xb8, 0x84, 0x29, 0x96, 0x1e, 0xa2, 0xf7, 0x21,
+ 0xfb, 0xda, 0x6, 0x64, 0x66, 0x8d, 0x8c, 0x6e,
+ 0x1f, 0x13, 0xab, 0x0, 0x8d, 0x6e, 0x77, 0x8c,
+ 0x84, 0x1b, 0xfb, 0x4a, 0xfb, 0x1f, 0x24, 0xfb,
+ 0x8f, 0xfb, 0x64, 0xf7, 0x18, 0xfb, 0x4, 0xf7,
+ 0x29, 0xa9, 0xa8, 0x8d, 0x8c, 0xa9, 0x1f, 0x13,
+ 0x67, 0x0, 0x8d, 0xa9, 0xaa, 0x8c, 0xa9, 0x1b,
+ 0xf7, 0xf2, 0x6, 0xb7, 0xf7, 0x3c, 0x5, 0x73,
+ 0x6, 0x52, 0xfb, 0x2, 0x5e, 0x7b, 0x5b, 0x89,
+ 0xfb, 0x10, 0x89, 0x18, 0x67, 0x77, 0x8d, 0xb7,
+ 0x1f, 0x27, 0xba, 0x15, 0x13, 0xb3, 0x0, 0x56,
+ 0x7d, 0x5c, 0x37, 0xfb, 0x23, 0x5b, 0xf7, 0x16,
+ 0xf7, 0x3d, 0xf7, 0x34, 0xbf, 0xf7, 0x22, 0xf7,
+ 0x1e, 0xe3, 0x96, 0x54, 0x59, 0x1e, 0xe, 0xf8,
+ 0x1, 0x81, 0xa5, 0x71, 0xce, 0xf7, 0x66, 0xa9,
+ 0xf7, 0x1a, 0xa8, 0x12, 0xa9, 0xe5, 0xf7, 0x73,
+ 0xd8, 0xf7, 0x33, 0xea, 0x13, 0x7e, 0xf8, 0x13,
+ 0xe0, 0x15, 0x4c, 0xa4, 0xb3, 0x6b, 0xcc, 0x1b,
+ 0xec, 0xbc, 0xdd, 0xce, 0xaa, 0x1f, 0x80, 0x91,
+ 0x5, 0x6e, 0x76, 0x60, 0x50, 0x4b, 0x1b, 0xfb,
+ 0xf, 0x85, 0xf7, 0x32, 0xbf, 0x89, 0x1f, 0xf7,
+ 0x92, 0x6, 0xf7, 0x36, 0xfb, 0xa, 0xaa, 0x62,
+ 0x40, 0x6a, 0x5e, 0x6c, 0x74, 0x1e, 0xd0, 0x54,
+ 0x4a, 0x92, 0x6e, 0x1b, 0xfb, 0x43, 0x6d, 0xfb,
+ 0x48, 0x50, 0xfb, 0x3e, 0xf7, 0x8, 0x4e, 0xe9,
+ 0xa3, 0xd5, 0x8f, 0xe6, 0xb8, 0x1f, 0xfb, 0x9b,
+ 0xf7, 0x58, 0x15, 0xf7, 0xc, 0xcc, 0xa9, 0xb5,
+ 0xf7, 0x1, 0x92, 0xfb, 0x3c, 0x52, 0x1e, 0x13,
+ 0xbe, 0xfb, 0x6, 0x71, 0x3f, 0x3d, 0xfb, 0x7,
+ 0x87, 0xf7, 0x4c, 0xdc, 0x1e, 0xf7, 0xbf, 0x9b,
+ 0x15, 0xa8, 0x8d, 0xf4, 0xdc, 0xbc, 0xa7, 0x50,
+ 0x5b, 0x1e, 0x70, 0x7, 0xe, 0xf7, 0x5b, 0x7d,
+ 0xaf, 0x7d, 0x76, 0xf9, 0x1c, 0xb4, 0xf7, 0x66,
+ 0x77, 0x12, 0xd2, 0xe1, 0xf7, 0x7d, 0xf0, 0x13,
+ 0x7c, 0xd3, 0x7e, 0x15, 0xa1, 0x6, 0x9b, 0x9f,
+ 0x9c, 0xa0, 0x1e, 0x13, 0xbc, 0xa9, 0xb2, 0x69,
+ 0xd7, 0x1b, 0xf7, 0x23, 0xcf, 0xeb, 0xe0, 0xf5,
+ 0x32, 0xc4, 0x35, 0xbd, 0x1f, 0x3a, 0xba, 0x3d,
+ 0xb5, 0xd4, 0x1a, 0xc9, 0xbe, 0xaa, 0xbd, 0xf4,
+ 0xcb, 0x31, 0x39, 0x9c, 0x1e, 0xa4, 0x6, 0x75,
+ 0x86, 0x1d, 0x72, 0x5f, 0xad, 0x4f, 0x55, 0xa,
+ 0x74, 0x6, 0x13, 0x7c, 0xf7, 0x61, 0xf8, 0x9c,
+ 0x31, 0xa, 0xab, 0x81, 0xa1, 0x90, 0x76, 0xf7,
+ 0x30, 0x77, 0xf7, 0xb0, 0xa2, 0x97, 0x77, 0xf7,
+ 0x87, 0x77, 0x12, 0xf7, 0xac, 0xd1, 0x13, 0x76,
+ 0xbf, 0x87, 0x15, 0x98, 0x6, 0x94, 0x91, 0x99,
+ 0x8e, 0x97, 0x1b, 0x9b, 0x8c, 0x9e, 0x84, 0xa0,
+ 0x86, 0x8, 0x13, 0xb6, 0x87, 0x9a, 0x9b, 0x88,
+ 0x9e, 0x1b, 0xcb, 0xde, 0xb5, 0xe2, 0xc7, 0x66,
+ 0x66, 0xa, 0xb7, 0xb8, 0x76, 0x25, 0xa1, 0x1e,
+ 0x9a, 0x6, 0x13, 0xae, 0x87, 0xf7, 0x1d, 0x5,
+ 0x80, 0x6, 0x87, 0x88, 0x7c, 0x84, 0x82, 0x1b,
+ 0x82, 0x80, 0x91, 0x91, 0x7c, 0x1f, 0x13, 0xb6,
+ 0x8f, 0x7f, 0x7b, 0x7c, 0x1d, 0xe5, 0x58, 0xa1,
+ 0x73, 0x6b, 0x1a, 0x52, 0x5a, 0x95, 0xa, 0x7b,
+ 0x6, 0x13, 0x76, 0xf7, 0x3, 0xf7, 0xf7, 0x31,
+ 0xa, 0x80, 0x1d, 0xf9, 0x17, 0x97, 0xa, 0xe8,
+ 0xef, 0x12, 0xf7, 0x69, 0xed, 0x8f, 0xf1, 0x82,
+ 0xed, 0x13, 0xcc, 0x68, 0xa, 0xa3, 0xdd, 0x1a,
+ 0xf7, 0x45, 0x7e, 0x1d, 0x13, 0x3c, 0x4b, 0x1d,
+ 0x7, 0x13, 0x4c, 0x5e, 0x1d, 0x8a, 0xf9, 0x92,
+ 0x15, 0x13, 0x9a, 0x6f, 0x9f, 0x35, 0x1d, 0x77,
+ 0x62, 0x1d, 0xf7, 0x5b, 0x16, 0x6f, 0x9f, 0x35,
+ 0x1d, 0x77, 0x62, 0x1d, 0xe, 0x7b, 0xa, 0x8b,
+ 0x77, 0xf8, 0xf2, 0xb1, 0xf7, 0x74, 0x77, 0x1,
+ 0xaa, 0xa5, 0xf8, 0x99, 0xa2, 0x3f, 0x1d, 0xf7,
+ 0x9d, 0xf9, 0x54, 0x31, 0xa, 0xe2, 0x8b, 0xa9,
+ 0xf8, 0x1a, 0xa9, 0xf7, 0x74, 0x77, 0x6a, 0xa,
+ 0x7a, 0x6c, 0x21, 0x1b, 0xfb, 0x13, 0x56, 0x1d,
+ 0xf7, 0x38, 0xf8, 0x80, 0x31, 0xa, 0xfb, 0x51,
+ 0xa3, 0xf8, 0xb1, 0xaa, 0xf7, 0x84, 0xa8, 0x1,
+ 0xeb, 0xf8, 0xc, 0x15, 0xf7, 0xd, 0x6, 0x63,
+ 0xfc, 0x3, 0x5, 0x38, 0x84, 0x79, 0x30, 0x50,
+ 0x1b, 0x80, 0x83, 0x91, 0x92, 0x1f, 0x95, 0x9a,
+ 0x96, 0x9e, 0x1a, 0xa2, 0x7d, 0x99, 0x75, 0x7e,
+ 0x6a, 0x83, 0x67, 0x65, 0xa8, 0x6b, 0xbd, 0xeb,
+ 0xba, 0xf1, 0xf7, 0x43, 0xac, 0x1e, 0x9a, 0xda,
+ 0x93, 0xe4, 0x9c, 0xf7, 0xc, 0x8, 0xf7, 0xc,
+ 0x6, 0x95, 0xaa, 0x5, 0xfb, 0x12, 0x6, 0xf7,
+ 0x18, 0x97, 0x99, 0xf7, 0x0, 0xcc, 0x1b, 0x96,
+ 0x96, 0x89, 0x80, 0x1f, 0x82, 0x7e, 0x7f, 0x7b,
+ 0x1a, 0x7f, 0x97, 0x75, 0xa4, 0xa3, 0xa2, 0x9c,
+ 0xa9, 0xa8, 0x6c, 0xb0, 0x57, 0xfb, 0x26, 0x6c,
+ 0xfb, 0x6f, 0x59, 0x84, 0x1e, 0xfb, 0x9, 0x6,
+ 0xe, 0x91, 0xa, 0x96, 0xf8, 0x8f, 0x2b, 0x1d,
+ 0xfb, 0xf, 0xf7, 0x3b, 0x5, 0x49, 0x6, 0xe,
+ 0x91, 0xa, 0xf7, 0x1b, 0xf8, 0x8f, 0x31, 0xa,
+ 0x73, 0xf8, 0x8f, 0xc0, 0xf3, 0x77, 0x1, 0xa5,
+ 0xf9, 0x2c, 0x15, 0x6e, 0x9b, 0xfb, 0x14, 0xf7,
+ 0xe, 0xf7, 0x14, 0x9a, 0xf7, 0x12, 0xaa, 0x1e,
+ 0x6e, 0x6, 0x4e, 0x82, 0x5c, 0x60, 0x53, 0x1b,
+ 0x4b, 0x66, 0xb6, 0xc8, 0x81, 0x1f, 0xe, 0x73,
+ 0xf8, 0x9f, 0xef, 0x1, 0xf7, 0xa, 0xed, 0x3,
+ 0xf7, 0xa, 0xf8, 0xd1, 0x15, 0x36, 0xa, 0xe,
+ 0x73, 0xf8, 0x94, 0xad, 0xf7, 0x17, 0xad, 0x12,
+ 0xce, 0xf7, 0x5b, 0x69, 0xad, 0x13, 0xe0, 0xce,
+ 0xf8, 0xf7, 0x15, 0x55, 0xb5, 0x5e, 0xc4, 0x79,
+ 0x1d, 0x53, 0x60, 0x5d, 0x55, 0x1e, 0xad, 0x8c,
+ 0x15, 0xa3, 0x9f, 0xb4, 0xb8, 0x1e, 0x13, 0xd0,
+ 0xb0, 0xa8, 0x6d, 0x67, 0x67, 0x6e, 0x6e, 0x65,
+ 0x5e, 0x78, 0xb4, 0xa4, 0x1f, 0xe, 0x73, 0xfb,
+ 0x24, 0x76, 0xf7, 0x39, 0x77, 0x1, 0xcb, 0xc0,
+ 0x3, 0xf7, 0xc, 0x16, 0x72, 0x7b, 0x6c, 0x61,
+ 0x64, 0x1a, 0x6d, 0xa0, 0x65, 0xc5, 0xb4, 0xbd,
+ 0xa9, 0xc2, 0x9a, 0x1e, 0x7b, 0x92, 0x5, 0x6c,
+ 0x81, 0x68, 0x7b, 0x6e, 0x1b, 0x73, 0x79, 0x99,
+ 0xa8, 0xab, 0xa8, 0xaa, 0x9d, 0x99, 0x1f, 0xe,
+ 0x73, 0xf8, 0xa8, 0xf5, 0x1, 0x8c, 0xf8, 0xa8,
+ 0x15, 0xa8, 0x6, 0x91, 0x9c, 0x98, 0xb9, 0xaf,
+ 0x7f, 0x8, 0x6c, 0xe5, 0x9f, 0x77, 0x52, 0x1d,
+ 0x7a, 0x63, 0x7c, 0x79, 0x71, 0x93, 0x8, 0xa2,
+ 0x43, 0x5e, 0xa6, 0x76, 0x54, 0xa, 0x73, 0xf8,
+ 0x8f, 0xf7, 0x3f, 0x1, 0x88, 0xf8, 0x8f, 0x15,
+ 0xb5, 0x6, 0xf7, 0x2c, 0x22, 0x1d, 0x94, 0xfb,
+ 0x28, 0x15, 0xb5, 0x6, 0xf7, 0x2c, 0x22, 0x1d,
+ 0xe, 0x8a, 0xa, 0xf8, 0x88, 0xb4, 0xfc, 0x88,
+ 0x6, 0xe, 0xf9, 0x17, 0x8a, 0xa, 0xfa, 0x7c,
+ 0xb4, 0xfe, 0x7c, 0x6, 0xe, 0x91, 0x1d, 0xf7,
+ 0x7, 0xf7, 0x1f, 0x3, 0xf7, 0x80, 0xf9, 0x25,
+ 0x15, 0x51, 0xa, 0x6b, 0x99, 0x71, 0x84, 0x87,
+ 0x88, 0x89, 0x86, 0x1e, 0x89, 0x87, 0x87, 0x8a,
+ 0x87, 0x64, 0xa, 0xe, 0x91, 0x1d, 0xda, 0xf7,
+ 0x1f, 0x3, 0xf5, 0xf8, 0x45, 0x15, 0x3c, 0xa,
+ 0xad, 0x7c, 0xa5, 0x92, 0x92, 0x91, 0x8c, 0x8e,
+ 0x1e, 0x54, 0x1d, 0x73, 0xfb, 0xc, 0x76, 0xf7,
+ 0x2d, 0x76, 0xa7, 0x76, 0xf3, 0x77, 0x12, 0xda,
+ 0xf7, 0x1f, 0x13, 0xd8, 0xec, 0xfb, 0xe, 0x15,
+ 0x94, 0x78, 0x5, 0x3c, 0xa, 0xad, 0x7e, 0xa5,
+ 0x92, 0x92, 0x5c, 0xa, 0xe2, 0xf8, 0x45, 0xf7,
+ 0x3, 0xf7, 0x18, 0x77, 0x1, 0xb6, 0x97, 0x1d,
+ 0x3, 0xf7, 0x38, 0xf9, 0x25, 0x15, 0x48, 0x1d,
+ 0xf7, 0x7c, 0x16, 0x48, 0x1d, 0xe, 0xe2, 0xf8,
+ 0x5a, 0x76, 0xf7, 0x18, 0xf7, 0x3, 0x1, 0xa9,
+ 0x97, 0x1d, 0x3, 0xc4, 0xf8, 0x45, 0x48, 0xa,
+ 0xf7, 0x85, 0x78, 0x48, 0xa, 0xe, 0xe2, 0xfb,
+ 0xc, 0x76, 0xf7, 0x18, 0xf7, 0x3, 0x38, 0x76,
+ 0x12, 0xb8, 0x97, 0x1d, 0x13, 0xd8, 0xca, 0xfb,
+ 0xe, 0x15, 0x94, 0x78, 0x5, 0x46, 0x1d, 0x13,
+ 0xb8, 0x33, 0xa, 0xf7, 0x7c, 0x16, 0x94, 0x78,
+ 0x5, 0xa9, 0x95, 0xdd, 0xcd, 0xd2, 0x1a, 0x13,
+ 0xd8, 0xde, 0x51, 0x98, 0x74, 0x72, 0x6a, 0x7c,
+ 0x60, 0x63, 0xae, 0x7e, 0xa5, 0x92, 0x91, 0x5c,
+ 0xa, 0xfb, 0x14, 0x76, 0xf8, 0xbd, 0xe2, 0xf7,
+ 0x4d, 0x77, 0x1, 0xf7, 0x84, 0xa2, 0x3, 0xf7,
+ 0x85, 0xfb, 0x29, 0x15, 0xa0, 0x6, 0x8c, 0xf7,
+ 0x23, 0x5, 0xf7, 0xf, 0xa0, 0xec, 0x9e, 0xb2,
+ 0x1e, 0x61, 0xb6, 0x8b, 0xeb, 0xb9, 0x1a, 0xb2,
+ 0x88, 0xa2, 0x84, 0x9c, 0x84, 0x8, 0x82, 0xa0,
+ 0x98, 0x83, 0xa4, 0x1b, 0x9d, 0xa4, 0x94, 0xae,
+ 0xaa, 0x74, 0x97, 0x79, 0x72, 0x7d, 0x81, 0x82,
+ 0x76, 0x1f, 0x79, 0x83, 0x75, 0x84, 0x63, 0x8a,
+ 0x8, 0xc2, 0x92, 0xaa, 0x93, 0xa1, 0x1e, 0x95,
+ 0xa5, 0x96, 0x98, 0xa5, 0x1a, 0xa4, 0x75, 0xa1,
+ 0x73, 0x71, 0x76, 0x75, 0x72, 0x71, 0x96, 0x7e,
+ 0x95, 0x71, 0x1e, 0x93, 0x75, 0x92, 0x6c, 0x54,
+ 0x1a, 0x5f, 0x8c, 0x73, 0x94, 0x78, 0x94, 0x8,
+ 0x93, 0x79, 0x7e, 0x93, 0x75, 0x1b, 0x79, 0x74,
+ 0x7f, 0x6c, 0x68, 0xa2, 0x82, 0x9d, 0xa1, 0x98,
+ 0x91, 0x92, 0x9c, 0x1f, 0x9e, 0x93, 0xa2, 0x95,
+ 0xb9, 0x8e, 0x8, 0x5d, 0x8b, 0x2b, 0x61, 0x60,
+ 0x1e, 0x9c, 0x64, 0xa2, 0x2a, 0x8d, 0xfb, 0xf,
+ 0x8, 0xe, 0xfb, 0x57, 0x76, 0xf7, 0x38, 0xe1,
+ 0x7e, 0x76, 0xf8, 0x50, 0xe1, 0xf7, 0x38, 0x77,
+ 0x12, 0xcf, 0xf7, 0x54, 0x4f, 0xef, 0x4f, 0x9f,
+ 0x77, 0xf7, 0x54, 0x13, 0xd9, 0x0, 0xf7, 0x84,
+ 0x16, 0x13, 0xda, 0x0, 0x76, 0xa, 0x13, 0xd9,
+ 0x0, 0xb7, 0xac, 0xad, 0xbc, 0x1b, 0x8c, 0x5d,
+ 0x62, 0x52, 0x63, 0x1a, 0x13, 0xdc, 0x0, 0x6d,
+ 0xa0, 0x72, 0xa8, 0xa8, 0xa0, 0xa4, 0xa9, 0x1e,
+ 0x13, 0xb9, 0x0, 0xb3, 0x62, 0xc4, 0x8c, 0xb9,
+ 0x1e, 0x78, 0x1d, 0x5f, 0x6a, 0x69, 0x5a, 0x1b,
+ 0x13, 0xdc, 0x0, 0x8f, 0xb3, 0x98, 0xa1, 0xa9,
+ 0xa0, 0x8, 0x67, 0xb6, 0x80, 0xc6, 0xc1, 0x1a,
+ 0xc1, 0x96, 0xc6, 0xaf, 0xb6, 0x1e, 0x13, 0xd9,
+ 0x0, 0x6d, 0xa0, 0x7e, 0xa1, 0x87, 0xb3, 0x8,
+ 0x13, 0xda, 0x0, 0x78, 0x1d, 0x13, 0xdc, 0x0,
+ 0x5f, 0x6a, 0x69, 0x5a, 0x1b, 0x8a, 0xb9, 0xb4,
+ 0xc4, 0xb3, 0x1a, 0x13, 0xd8, 0x80, 0xa9, 0x76,
+ 0xa4, 0x6e, 0x6e, 0x76, 0x72, 0x6d, 0x1e, 0x13,
+ 0xbc, 0x0, 0x63, 0xb4, 0x52, 0x8a, 0x5d, 0x1e,
+ 0x76, 0xa, 0xb7, 0xac, 0xad, 0xbc, 0x1b, 0x87,
+ 0x63, 0x7e, 0x75, 0x6d, 0x76, 0x8, 0x13, 0xd8,
+ 0x80, 0xaf, 0x60, 0x96, 0x50, 0x55, 0x1a, 0x55,
+ 0x80, 0x50, 0x67, 0x60, 0x1e, 0x13, 0xd9, 0x0,
+ 0xa9, 0x76, 0x98, 0x75, 0x8f, 0x63, 0x8, 0xe,
+ 0x84, 0xf7, 0x6d, 0x76, 0xf7, 0xa2, 0x77, 0x1,
+ 0xb3, 0xf7, 0xdf, 0x15, 0x40, 0xc7, 0x4f, 0xd6,
+ 0xd6, 0xc7, 0xc8, 0xd5, 0xd6, 0x4f, 0xc7, 0x40,
+ 0x3f, 0x50, 0x4f, 0x40, 0x1e, 0xe, 0xf9, 0x17,
+ 0x80, 0xf7, 0x3, 0x1, 0xf7, 0x3, 0xf7, 0x4,
+ 0xf7, 0x70, 0xf7, 0x5, 0xf7, 0x70, 0xf7, 0x4,
+ 0x14, 0x70, 0xf7, 0x3, 0xb6, 0x15, 0x65, 0xad,
+ 0x81, 0xa, 0x72, 0x99, 0xa, 0xf7, 0xe0, 0x16,
+ 0x65, 0xae, 0x81, 0xa, 0x71, 0x99, 0xa, 0xf7,
+ 0xe1, 0x16, 0x65, 0xae, 0x4d, 0x1d, 0x71, 0x99,
+ 0xa, 0xe, 0xf9, 0x17, 0x7f, 0xa8, 0x6f, 0x76,
+ 0xf7, 0xcd, 0xa7, 0x90, 0xa8, 0xf7, 0x9b, 0xa8,
+ 0x9c, 0x77, 0x12, 0xb2, 0xd4, 0xf7, 0x1f, 0xd4,
+ 0xb7, 0xd4, 0xf7, 0x1f, 0xd4, 0xa9, 0xd3, 0xf7,
+ 0x20, 0xd4, 0x13, 0x77, 0xf0, 0xf7, 0xe, 0x82,
+ 0x15, 0xaa, 0x74, 0xf8, 0x27, 0xf9, 0x29, 0x6b,
+ 0xa2, 0x5, 0x13, 0xbb, 0xf0, 0xfc, 0x79, 0xfb,
+ 0x57, 0x15, 0x3e, 0x8d, 0x1d, 0xed, 0x28, 0x1e,
+ 0x8a, 0x6, 0x28, 0x60, 0x29, 0x3b, 0x1f, 0xd4,
+ 0x8c, 0x15, 0xbe, 0x95, 0xec, 0xc7, 0x1e, 0x8c,
+ 0x6, 0xc8, 0x92, 0x28, 0x59, 0x5d, 0x84, 0x25,
+ 0x4e, 0x50, 0x7f, 0xf0, 0xbb, 0x1f, 0xf7, 0x94,
+ 0xfb, 0xb9, 0x15, 0x3d, 0xb6, 0x28, 0xef, 0xee,
+ 0xb6, 0xee, 0xd9, 0xda, 0x60, 0xee, 0x29, 0x1e,
+ 0x8a, 0x6, 0x27, 0x60, 0x28, 0x3c, 0x1f, 0xf7,
+ 0xcf, 0x16, 0x3d, 0x8d, 0x1d, 0xee, 0x28, 0x1e,
+ 0x8a, 0x6, 0x28, 0x60, 0x28, 0x3c, 0x1f, 0xfb,
+ 0x86, 0x8c, 0x15, 0xbd, 0x94, 0xed, 0xc8, 0x1e,
+ 0x8c, 0x6, 0xc8, 0x92, 0x27, 0x5a, 0x5d, 0x83,
+ 0x25, 0x4f, 0x4d, 0x82, 0xf0, 0xbb, 0x1f, 0xf7,
+ 0xce, 0x16, 0xbd, 0x96, 0xed, 0xc6, 0x1e, 0x8c,
+ 0x6, 0xc9, 0x92, 0x27, 0x5a, 0x5d, 0x83, 0x25,
+ 0x4e, 0x4e, 0x81, 0xef, 0xbc, 0x1f, 0xe, 0x73,
+ 0x79, 0xa, 0xca, 0xf7, 0x77, 0x42, 0x1d, 0x97,
+ 0x9b, 0xb1, 0xbc, 0xab, 0xb6, 0x8, 0xa5, 0xae,
+ 0xa0, 0xaa, 0x91, 0x96, 0x1d, 0x73, 0x79, 0xa,
+ 0xc6, 0xac, 0x15, 0xf7, 0x67, 0xf7, 0x51, 0x5,
+ 0xaa, 0x5e, 0xfb, 0x2d, 0xf7, 0x37, 0x51, 0x1d,
+ 0x7e, 0x7a, 0x61, 0x55, 0x6a, 0x5e, 0x8, 0x74,
+ 0x6b, 0x79, 0x71, 0x8f, 0x1d, 0xfb, 0x52, 0x92,
+ 0x7a, 0x1d, 0xfb, 0x3c, 0xf8, 0x87, 0x3, 0xfb,
+ 0xb, 0x7d, 0x15, 0xf8, 0x56, 0xf9, 0x46, 0x5,
+ 0x5d, 0x6, 0xfc, 0x59, 0xfd, 0x46, 0x5, 0xe,
+ 0xf8, 0x1, 0x8b, 0xc3, 0xf7, 0x57, 0xb3, 0xe4,
+ 0xb3, 0xf7, 0x6c, 0xb1, 0x1, 0xf7, 0x26, 0xf7,
+ 0x4, 0x2f, 0xf7, 0x4, 0xf8, 0x14, 0xa5, 0x3,
+ 0xf7, 0x3a, 0xf7, 0x8f, 0x15, 0xfb, 0x2a, 0x9a,
+ 0xf7, 0x1e, 0x26, 0xf7, 0x15, 0x1b, 0xf7, 0xb,
+ 0xdc, 0xc9, 0xd9, 0xc5, 0x1f, 0x77, 0x95, 0x5,
+ 0x5f, 0x56, 0x59, 0x59, 0x51, 0x1b, 0xfb, 0x6,
+ 0xfb, 0x18, 0xc8, 0xf7, 0x1a, 0x8a, 0x1f, 0xf7,
+ 0xc3, 0x6, 0x99, 0xb3, 0x5, 0xfb, 0xd2, 0x6,
+ 0x89, 0xab, 0x89, 0xa5, 0x8f, 0xaa, 0x8, 0xf7,
+ 0xe4, 0x6, 0x9a, 0xb3, 0x5, 0xfb, 0xee, 0x6,
+ 0xf7, 0x16, 0xf1, 0xe0, 0xf5, 0x8c, 0x1e, 0xf7,
+ 0x11, 0xba, 0x51, 0x2c, 0x1f, 0xa5, 0xf7, 0x26,
+ 0x6, 0xa4, 0x49, 0x64, 0x9f, 0x23, 0x1b, 0xfb,
+ 0x18, 0xfb, 0x7, 0x68, 0xfb, 0x6f, 0x4d, 0x1f,
+ 0xfb, 0xc, 0x6, 0x7c, 0x63, 0x5, 0xf7, 0x16,
+ 0x6, 0x88, 0x6d, 0x8a, 0x6e, 0x8d, 0x6d, 0x8,
+ 0xfb, 0x5, 0x6, 0x7c, 0x63, 0x5, 0xe, 0xf9,
+ 0x3, 0xf7, 0x96, 0x9f, 0x8a, 0x76, 0xf8, 0x16,
+ 0x9f, 0x12, 0xf7, 0x3b, 0xd2, 0xf7, 0x8e, 0xa5,
+ 0xf7, 0xd0, 0xd2, 0x13, 0xbc, 0xf7, 0x9, 0xf7,
+ 0x96, 0x15, 0xf7, 0x3f, 0x9f, 0x6, 0x57, 0x91,
+ 0x8d, 0x95, 0xbb, 0x1a, 0xf7, 0xc0, 0xbd, 0x7,
+ 0xb4, 0x9c, 0x6c, 0x66, 0x94, 0x1f, 0x9f, 0xe3,
+ 0xfb, 0xed, 0x33, 0x9f, 0x6, 0xb0, 0x94, 0x9c,
+ 0xaa, 0xb5, 0x1b, 0xbc, 0xfb, 0xc0, 0x6, 0x5b,
+ 0x8d, 0x81, 0x57, 0x85, 0x1e, 0xf7, 0xd3, 0x77,
+ 0x15, 0xf7, 0x17, 0x9f, 0x6, 0x5e, 0x8f, 0x83,
+ 0xa6, 0xb7, 0x1a, 0xf7, 0x65, 0x8d, 0x7, 0x13,
+ 0x7c, 0xf7, 0x29, 0xfb, 0xc6, 0x5, 0x96, 0x6,
+ 0xf7, 0x2c, 0xf7, 0xc8, 0x5, 0x8d, 0xfb, 0x72,
+ 0x6, 0x13, 0xbc, 0x5b, 0x8e, 0x81, 0x57, 0x85,
+ 0x1e, 0x77, 0xf7, 0x3e, 0x9f, 0x7, 0x57, 0x91,
+ 0x8d, 0x95, 0xbb, 0x1a, 0xf7, 0x89, 0x7, 0xae,
+ 0x97, 0x9d, 0xb7, 0x8d, 0x1e, 0x9f, 0x24, 0x7,
+ 0xfb, 0x34, 0xfb, 0xc9, 0xfb, 0x2e, 0xf7, 0xc9,
+ 0x5, 0xfb, 0xd, 0x77, 0x6, 0xa8, 0xa7, 0x77,
+ 0x6d, 0x97, 0x1f, 0xfb, 0x83, 0x7, 0x5f, 0x83,
+ 0x70, 0x5f, 0x84, 0x1d, 0xf7, 0x63, 0xf7, 0x70,
+ 0xcd, 0x12, 0x13, 0x80, 0xa9, 0xf7, 0x70, 0x15,
+ 0xf8, 0x8c, 0xba, 0xfc, 0x8c, 0x6, 0xe, 0x99,
+ 0x1d, 0xf8, 0x36, 0xab, 0xf7, 0x64, 0xa4, 0x1,
+ 0xee, 0xdf, 0xf7, 0x4f, 0xdf, 0x3, 0xaa, 0x16,
+ 0xf7, 0x71, 0x9a, 0x6, 0x48, 0x8e, 0x89, 0xb3,
+ 0xb3, 0x1a, 0xf7, 0xd4, 0x7, 0xa0, 0xf7, 0x9,
+ 0x89, 0x8a, 0x98, 0x1f, 0xac, 0x86, 0x8e, 0x80,
+ 0x65, 0x1a, 0xfb, 0x92, 0x7, 0x4f, 0x89, 0x6f,
+ 0x48, 0x87, 0x1e, 0x7c, 0xf7, 0x70, 0x9a, 0x7,
+ 0x58, 0x8f, 0x7b, 0x9f, 0xcf, 0x1a, 0xf7, 0x90,
+ 0x7, 0xa4, 0x8c, 0xb4, 0x8c, 0xab, 0x1e, 0x87,
+ 0x8e, 0x5, 0x85, 0x6a, 0x60, 0x87, 0x66, 0x1b,
+ 0xfb, 0x31, 0x6, 0x8a, 0xce, 0x8b, 0xba, 0x97,
+ 0xa9, 0x8, 0xa8, 0x97, 0xad, 0xae, 0xba, 0x1b,
+ 0xac, 0x9d, 0x7a, 0x78, 0x99, 0x1f, 0x74, 0x9c,
+ 0x97, 0x72, 0xa8, 0x1b, 0x9e, 0x9b, 0x9c, 0x9f,
+ 0xbf, 0x4e, 0x9f, 0x4a, 0xfb, 0x20, 0x42, 0x36,
+ 0xfb, 0x28, 0x86, 0x1f, 0x46, 0x6b, 0xcf, 0xfb,
+ 0xd5, 0x6, 0x51, 0x78, 0x74, 0x5a, 0x8a, 0x1e,
+ 0xe, 0x99, 0x1d, 0xf8, 0x36, 0xab, 0xf7, 0x62,
+ 0xa6, 0x1, 0xf0, 0xdf, 0xf7, 0x50, 0xdf, 0x3,
+ 0xab, 0x16, 0xf7, 0x74, 0x9a, 0x6, 0x61, 0x8f,
+ 0x6e, 0x9a, 0xc2, 0x1a, 0xf7, 0xdd, 0xf7, 0x50,
+ 0xfb, 0xd8, 0x7, 0x4d, 0x6a, 0x7d, 0x69, 0x88,
+ 0x1e, 0x7c, 0xf7, 0x6b, 0x9a, 0x7, 0x51, 0x8e,
+ 0x85, 0xa6, 0xb9, 0x1a, 0xf8, 0xe2, 0x7, 0x86,
+ 0x8d, 0x5, 0x8a, 0x7f, 0x5d, 0x73, 0x7d, 0x1b,
+ 0x7c, 0x7e, 0x94, 0x92, 0x76, 0x1f, 0x90, 0x7c,
+ 0x78, 0x8f, 0x71, 0x1b, 0x61, 0xfb, 0x11, 0x78,
+ 0xfb, 0x6a, 0x8a, 0x1f, 0x44, 0x6b, 0xd0, 0xfb,
+ 0xdd, 0x6, 0x69, 0x78, 0x67, 0x59, 0x87, 0x1e,
+ 0xf7, 0x2d, 0xf8, 0x47, 0x15, 0xe5, 0x89, 0x89,
+ 0xf7, 0x8, 0xd1, 0x1b, 0xa9, 0x96, 0x78, 0x79,
+ 0x97, 0x1f, 0x79, 0x97, 0x97, 0x7a, 0xa9, 0x1b,
+ 0x94, 0x8e, 0x8f, 0x8e, 0x8e, 0x1f, 0xfb, 0x21,
+ 0x7, 0xe, 0x7d, 0x99, 0xf8, 0x56, 0x95, 0xf7,
+ 0x5e, 0x99, 0x6, 0xfb, 0x6e, 0x8c, 0x7, 0x1e,
+ 0xa0, 0x39, 0x63, 0xff, 0xc, 0x9, 0xa7, 0xa,
+ 0xdf, 0xb, 0xa7, 0x93, 0x8d, 0x8e, 0xc, 0xc,
+ 0xdf, 0x91, 0x97, 0xc, 0xd, 0xf8, 0x88, 0x14,
+ 0xf7, 0xf9, 0x15, 0xb6, 0x13, 0x0, 0x7b, 0x2,
+ 0x0, 0x1, 0x0, 0x36, 0x0, 0x3f, 0x0, 0x4f,
+ 0x0, 0x69, 0x0, 0x6c, 0x0, 0x75, 0x0, 0x8f,
+ 0x0, 0x96, 0x0, 0x9b, 0x0, 0xa6, 0x0, 0xb1,
+ 0x0, 0xcc, 0x0, 0xd3, 0x0, 0xdc, 0x0, 0xee,
+ 0x0, 0xff, 0x1, 0x7, 0x1, 0x1b, 0x1, 0x30,
+ 0x1, 0x37, 0x1, 0x43, 0x1, 0x65, 0x1, 0x6e,
+ 0x1, 0x79, 0x1, 0x7e, 0x1, 0x89, 0x1, 0xbd,
+ 0x1, 0xda, 0x1, 0xe0, 0x1, 0xe7, 0x2, 0x1c,
+ 0x2, 0x29, 0x2, 0x34, 0x2, 0x3c, 0x2, 0x52,
+ 0x2, 0x5f, 0x2, 0x78, 0x2, 0x91, 0x2, 0xbb,
+ 0x2, 0xcc, 0x2, 0xd2, 0x2, 0xe0, 0x2, 0xf6,
+ 0x2, 0xfe, 0x3, 0xc, 0x3, 0x14, 0x3, 0x1e,
+ 0x3, 0x28, 0x3, 0x34, 0x3, 0x47, 0x3, 0x52,
+ 0x3, 0x74, 0x3, 0x7b, 0x3, 0x9b, 0x3, 0xba,
+ 0x3, 0xbe, 0x3, 0xcc, 0x3, 0xd7, 0x3, 0xf1,
+ 0x3, 0xf9, 0x3, 0xff, 0x4, 0x14, 0x4, 0x1b,
+ 0x4, 0x28, 0x4, 0x2f, 0x4, 0x36, 0x4, 0x3e,
+ 0x4, 0x53, 0x4, 0x5f, 0x4, 0x65, 0x4, 0x78,
+ 0x4, 0x85, 0x4, 0x90, 0x4, 0xa2, 0x4, 0xb4,
+ 0x4, 0xbd, 0x4, 0xcf, 0x4, 0xe1, 0x4, 0xe9,
+ 0x4, 0xef, 0x4, 0xf5, 0x4, 0xfb, 0x5, 0x4,
+ 0x5, 0x15, 0x5, 0x1c, 0x5, 0x26, 0x5, 0x35,
+ 0x5, 0x44, 0x5, 0x4d, 0x5, 0x54, 0x5, 0x5a,
+ 0x5, 0x5f, 0x5, 0x68, 0x5, 0x6b, 0x5, 0x78,
+ 0x5, 0x80, 0x5, 0x85, 0x5, 0x91, 0x5, 0x97,
+ 0x5, 0x9b, 0x5, 0xa6, 0x5, 0xaa, 0x5, 0xb3,
+ 0x5, 0xba, 0x5, 0xbf, 0x5, 0xc4, 0x5, 0xce,
+ 0x5, 0xd8, 0x5, 0xdf, 0x5, 0xe9, 0x5, 0xf3,
+ 0x5, 0xf7, 0x6, 0x0, 0x6, 0x9, 0x6, 0x12,
+ 0x6, 0x1b, 0x6, 0x23, 0x6, 0x2c, 0x6, 0x32,
+ 0x6, 0x38, 0x6, 0x3d, 0x6, 0x41, 0x6, 0x45,
+ 0x9a, 0x16, 0xf7, 0x5a, 0x9e, 0x6, 0x76, 0x5c,
+ 0x95, 0xb5, 0x96, 0x8e, 0x99, 0x90, 0x98, 0x1f,
+ 0xb9, 0xf6, 0x5, 0xf7, 0x9a, 0x6, 0xb4, 0x35,
+ 0x5, 0x91, 0x7d, 0x98, 0x6a, 0x7b, 0x1a, 0x66,
+ 0x6a, 0x80, 0x66, 0x1e, 0x78, 0xf7, 0x93, 0x9e,
+ 0x7, 0x5f, 0x8e, 0x7d, 0xa0, 0x6b, 0xd4, 0xfb,
+ 0x8d, 0xf8, 0xc2, 0x18, 0xb, 0x20, 0xa, 0x77,
+ 0x6, 0xfb, 0x64, 0xfc, 0x7f, 0xb, 0x32, 0xa,
+ 0xfb, 0x6b, 0x52, 0xa, 0x73, 0x2c, 0x1d, 0xbc,
+ 0xc7, 0xb9, 0xbd, 0xb2, 0x1e, 0xb, 0x3, 0x31,
+ 0x1d, 0xfb, 0x2f, 0x54, 0x5, 0x7c, 0x7, 0x8d,
+ 0x98, 0x98, 0x53, 0x1d, 0x50, 0x1f, 0xfb, 0x72,
+ 0x7, 0x3d, 0x7a, 0x7b, 0x4d, 0x88, 0x1e, 0xb,
+ 0x21, 0x1d, 0xe, 0x15, 0x87, 0xa, 0x8, 0x22,
+ 0xa, 0x2e, 0x7, 0xb, 0x6f, 0xa, 0x44, 0x80,
+ 0x77, 0x73, 0x32, 0x1b, 0xfb, 0x24, 0xf7, 0x46,
+ 0x6, 0xc2, 0x97, 0xa2, 0x33, 0x1d, 0x78, 0x6,
+ 0x60, 0xa, 0xfc, 0x3c, 0x7, 0xb, 0x77, 0x1,
+ 0xea, 0xdf, 0x23, 0xa, 0xb, 0x26, 0x1d, 0x3d,
+ 0x1d, 0xb, 0x28, 0x1d, 0x13, 0xd6, 0x3e, 0x1d,
+ 0x13, 0xba, 0x3c, 0x1d, 0xe, 0x8c, 0xfb, 0x57,
+ 0x15, 0x43, 0x90, 0xb5, 0x80, 0x2f, 0xa, 0xb,
+ 0xf7, 0x3, 0xf7, 0x24, 0xc5, 0xf7, 0x1c, 0xaa,
+ 0x95, 0x1f, 0x7b, 0x92, 0x5, 0x66, 0x74, 0x60,
+ 0x47, 0x32, 0x1b, 0x49, 0x3a, 0xaa, 0xf7, 0x45,
+ 0x7f, 0x1f, 0xb, 0x15, 0xf8, 0xb0, 0x6, 0x23,
+ 0x1d, 0xe, 0x3a, 0x1d, 0x72, 0x88, 0x8b, 0x7b,
+ 0x1b, 0x6c, 0xb, 0x7b, 0x8a, 0x8, 0xf7, 0x5d,
+ 0xf7, 0x82, 0x15, 0xf7, 0x7, 0xf7, 0xa7, 0xf7,
+ 0x8, 0xfb, 0xa7, 0x5, 0xb, 0x9d, 0x1b, 0x9b,
+ 0xaa, 0x8c, 0xbc, 0xb5, 0x1f, 0xa5, 0x7, 0x82,
+ 0x80, 0x7e, 0x81, 0x76, 0x1b, 0xb, 0x6f, 0xa1,
+ 0x35, 0x1d, 0x75, 0x62, 0x1d, 0xb, 0x15, 0xc9,
+ 0x6, 0xf7, 0x11, 0xf7, 0x3b, 0x5, 0x69, 0x6,
+ 0xfb, 0xe, 0x24, 0xfb, 0xd, 0xf2, 0x5, 0x69,
+ 0x6, 0xe, 0x99, 0x7, 0x4f, 0x89, 0x89, 0xa2,
+ 0xaf, 0x1a, 0xf7, 0xeb, 0xfb, 0x32, 0x7a, 0x7,
+ 0xd1, 0x89, 0x8f, 0x6c, 0x63, 0x1a, 0xb, 0x8c,
+ 0x8f, 0x8e, 0x8c, 0x38, 0x1d, 0xb, 0x61, 0xa,
+ 0xfb, 0x0, 0x44, 0x1d, 0xd4, 0xf1, 0xf1, 0xf7,
+ 0x3, 0xb, 0x15, 0xf7, 0x53, 0xa3, 0x6, 0x65,
+ 0x8d, 0x78, 0x9a, 0xa8, 0x1a, 0xf7, 0xe1, 0x7,
+ 0x7d, 0x8e, 0xfb, 0xa, 0x54, 0x5, 0x74, 0x7,
+ 0x98, 0xaf, 0x8b, 0x8b, 0x93, 0x1b, 0x92, 0x8b,
+ 0x7c, 0x7e, 0x1f, 0xb, 0x6f, 0xa0, 0x75, 0x9a,
+ 0x1d, 0xa1, 0x41, 0x1d, 0xb, 0x9d, 0xac, 0xa9,
+ 0xba, 0x80, 0x43, 0x1e, 0x4e, 0x4f, 0xa, 0xb,
+ 0xf9, 0x63, 0x25, 0x1d, 0xb, 0x92, 0x92, 0x86,
+ 0x82, 0x78, 0x7b, 0x5e, 0x49, 0x61, 0x1f, 0xb,
+ 0xf8, 0x4c, 0xfc, 0xb8, 0x5, 0x9c, 0xf8, 0x98,
+ 0x6, 0xf7, 0x9, 0xab, 0x99, 0xca, 0x92, 0x1e,
+ 0x9e, 0xfb, 0x7f, 0x78, 0x7, 0xcf, 0x86, 0xa7,
+ 0x79, 0xfb, 0x7, 0x1a, 0xfb, 0xd8, 0x89, 0x7,
+ 0xfc, 0x13, 0xf8, 0x75, 0x5, 0xfb, 0x3f, 0x78,
+ 0x6, 0xb3, 0x9b, 0x86, 0x59, 0xb4, 0x1f, 0xfc,
+ 0x43, 0x78, 0xa, 0xb, 0xfb, 0x7, 0xf7, 0x87,
+ 0x5, 0x88, 0x92, 0x84, 0x9b, 0x98, 0x1a, 0xa6,
+ 0xae, 0x96, 0xa2, 0x8c, 0x1e, 0x9a, 0xfb, 0x62,
+ 0x7d, 0x7, 0x98, 0x89, 0xa5, 0x7c, 0x97, 0x72,
+ 0xb, 0x3f, 0xa, 0x7c, 0x60, 0x63, 0xb, 0xa7,
+ 0xa7, 0x75, 0xa1, 0x6f, 0x6f, 0xb, 0x15, 0xfb,
+ 0x53, 0xf7, 0x2a, 0xfb, 0x2d, 0xf7, 0x56, 0xf7,
+ 0x53, 0xf7, 0x29, 0xf7, 0x2d, 0xf7, 0x53, 0xf7,
+ 0x53, 0xfb, 0x29, 0xf7, 0x2f, 0xfb, 0x53, 0xfb,
+ 0x56, 0xfb, 0x2a, 0xfb, 0x2f, 0xfb, 0x53, 0x1e,
+ 0xc2, 0x16, 0xf7, 0x35, 0xf7, 0x12, 0xf7, 0x23,
+ 0xf7, 0x37, 0xf7, 0x34, 0xf7, 0x11, 0xfb, 0x22,
+ 0xfb, 0x36, 0xb, 0xa9, 0x95, 0xdd, 0xcd, 0xd2,
+ 0x1a, 0xde, 0x51, 0x98, 0x74, 0x72, 0x6a, 0xb,
+ 0x6e, 0x8b, 0xa8, 0xa8, 0x1f, 0xf7, 0x57, 0x7,
+ 0xc7, 0x8b, 0xb, 0x45, 0xa, 0x9a, 0xb4, 0x9f,
+ 0x4a, 0xa, 0xb, 0x77, 0x1, 0xf7, 0x7, 0xf1,
+ 0x3, 0x9d, 0x16, 0xf7, 0xbd, 0x9e, 0x6, 0x59,
+ 0xa, 0x9e, 0xfb, 0xbd, 0x78, 0x7, 0x49, 0xa,
+ 0xb, 0x6f, 0xa0, 0x76, 0xa7, 0xa7, 0xa1, 0xa0,
+ 0xa7, 0xa7, 0x75, 0x55, 0x1d, 0xb, 0xa0, 0x6,
+ 0x95, 0xc2, 0xa1, 0xf7, 0x3, 0xa7, 0x1a, 0xa6,
+ 0x74, 0xa3, 0x78, 0x77, 0x74, 0x73, 0x70, 0x6f,
+ 0xa1, 0xfb, 0x3, 0x95, 0x54, 0x1e, 0xb, 0x7e,
+ 0x6c, 0x9d, 0x70, 0x1b, 0x5d, 0x89, 0x65, 0x85,
+ 0x71, 0xa2, 0x6b, 0xbd, 0xd6, 0xb7, 0xcd, 0xf7,
+ 0x1a, 0xbe, 0x1f, 0xf7, 0x2e, 0xf8, 0x22, 0xb,
+ 0x7, 0xf7, 0xf, 0x44, 0xa6, 0x5d, 0x50, 0x65,
+ 0x68, 0x5d, 0x5a, 0x1e, 0xda, 0x7, 0x84, 0x8d,
+ 0x5d, 0x7a, 0x5c, 0x7c, 0x5e, 0x7e, 0x19, 0x7a,
+ 0x7, 0x8d, 0x8f, 0x96, 0x53, 0x1d, 0x4c, 0x1f,
+ 0xfb, 0x82, 0x7, 0x50, 0x7a, 0x74, 0x5c, 0x88,
+ 0x1e, 0xb, 0xfb, 0x42, 0x8b, 0xf7, 0x1f, 0xcb,
+ 0x1e, 0xf7, 0xca, 0x7, 0xd2, 0x97, 0xa2, 0xda,
+ 0x91, 0x1e, 0xb, 0x15, 0x46, 0x1d, 0x33, 0xa,
+ 0xb, 0xde, 0x87, 0x99, 0x75, 0x41, 0x89, 0x1d,
+ 0x44, 0x7f, 0x70, 0x36, 0x89, 0x1e, 0xb, 0x97,
+ 0x98, 0x8d, 0x19, 0x9a, 0xfb, 0x1b, 0x7c, 0x7,
+ 0xab, 0x8c, 0x9b, 0x77, 0x78, 0x1a, 0x82, 0x7e,
+ 0x6b, 0x81, 0x70, 0x1e, 0xb, 0x36, 0xa, 0xf7,
+ 0x5b, 0x16, 0x36, 0xa, 0xe, 0x83, 0x1d, 0x96,
+ 0xad, 0xb1, 0x1b, 0x97, 0x98, 0x86, 0x45, 0x1d,
+ 0x76, 0x99, 0xb, 0x2a, 0xa, 0x40, 0xa, 0xef,
+ 0xfb, 0x29, 0xb, 0x6, 0xf7, 0x3, 0xa5, 0x7b,
+ 0x32, 0x9a, 0x1f, 0xa4, 0xb, 0x7, 0xfb, 0x37,
+ 0x4b, 0x34, 0x69, 0x27, 0x1a, 0x48, 0xb, 0x42,
+ 0x1d, 0x96, 0x9a, 0xac, 0xb6, 0xa9, 0xb3, 0x8,
+ 0xa8, 0xb2, 0xb, 0x82, 0x9e, 0x5, 0x6d, 0x81,
+ 0x39, 0x49, 0x44, 0x1a, 0x38, 0xc5, 0x7e, 0xa2,
+ 0xa4, 0xac, 0x9a, 0xb6, 0xb3, 0xb, 0x7, 0x6a,
+ 0x84, 0x81, 0x82, 0x83, 0x1e, 0x75, 0x70, 0x6d,
+ 0xb, 0xf8, 0x31, 0xe5, 0x15, 0xf7, 0x48, 0x31,
+ 0xd1, 0xe5, 0xc2, 0xc4, 0x54, 0xf7, 0x96, 0x5c,
+ 0x6, 0xfb, 0x5f, 0xfb, 0x9e, 0x5, 0xb8, 0x93,
+ 0x15, 0xf7, 0x19, 0xf7, 0x44, 0x5, 0x8d, 0xfb,
+ 0x44, 0x6, 0xb, 0x1b, 0x48, 0x6d, 0x4d, 0x5f,
+ 0x7d, 0xa, 0x1b, 0x31, 0x30, 0x53, 0xfb, 0x6,
+ 0x28, 0xcb, 0x5f, 0xe7, 0x56, 0x1f, 0xf7, 0x27,
+ 0x35, 0x9b, 0x69, 0x52, 0x1a, 0x55, 0x63, 0x52,
+ 0x3b, 0xfb, 0x1b, 0x58, 0xf7, 0x16, 0xba, 0x78,
+ 0x1e, 0xb, 0x6, 0xb0, 0xe0, 0x7a, 0x92, 0x7c,
+ 0x73, 0x7f, 0x89, 0x73, 0x8a, 0x19, 0xfb, 0xd,
+ 0x6, 0xe1, 0xe0, 0x5, 0xa8, 0xa7, 0xc2, 0xc1,
+ 0xcd, 0x1a, 0xce, 0x52, 0xb4, 0x48, 0x40, 0x5a,
+ 0xb, 0x7d, 0x97, 0x7d, 0xa, 0xf7, 0x67, 0xf7,
+ 0x51, 0x5, 0xa9, 0x5d, 0xfb, 0x2c, 0xf7, 0x38,
+ 0x51, 0x1d, 0xb, 0x41, 0x8d, 0x73, 0x60, 0x1d,
+ 0xa4, 0x9c, 0xd4, 0x8e, 0x1e, 0xb, 0xf7, 0x8a,
+ 0x7, 0xb1, 0x91, 0xc3, 0xa7, 0xaf, 0x1b, 0xf7,
+ 0xe, 0x90, 0xfb, 0x36, 0x74, 0xfb, 0x42, 0x31,
+ 0x78, 0x6a, 0x54, 0x5c, 0xb6, 0xa2, 0x1f, 0xe,
+ 0xf8, 0x1, 0x7d, 0xaf, 0xf8, 0xfe, 0xaf, 0xb,
+ 0x88, 0x1d, 0x13, 0xb8, 0x54, 0x1d, 0x7, 0x87,
+ 0x8d, 0x56, 0x7a, 0x56, 0x7d, 0x56, 0x6f, 0x1d,
+ 0x97, 0x94, 0x8c, 0x98, 0x1b, 0xb2, 0x91, 0x7b,
+ 0x5e, 0x1f, 0xb, 0x72, 0x1d, 0xec, 0xf7, 0x70,
+ 0x1e, 0xb, 0x97, 0x16, 0xf7, 0x7f, 0x9e, 0x6,
+ 0x42, 0x8e, 0x76, 0xab, 0xf2, 0x1a, 0xb, 0xca,
+ 0x86, 0xa3, 0x7b, 0x3c, 0x1a, 0xb, 0xfb, 0x38,
+ 0xfb, 0x38, 0xfb, 0x37, 0xb, 0x97, 0x16, 0xf8,
+ 0xb0, 0x6, 0x39, 0x1d, 0xb, 0x1b, 0x75, 0x7e,
+ 0x78, 0x7a, 0x5b, 0xc8, 0x88, 0x9a, 0xf7, 0x29,
+ 0xbe, 0xdd, 0xbc, 0xd7, 0x56, 0xa9, 0x6a, 0x97,
+ 0x1f, 0xb, 0x1b, 0x84, 0x84, 0x90, 0x94, 0x9e,
+ 0x9b, 0xb8, 0xcd, 0xb5, 0x1f, 0xb, 0xad, 0x94,
+ 0x1f, 0x6e, 0x6, 0xb, 0xa7, 0x5a, 0xa9, 0x1f,
+ 0xfb, 0x0, 0xcb, 0x5, 0x66, 0xa1, 0x85, 0xa8,
+ 0x9f, 0x1a, 0xa5, 0xa0, 0xb2, 0xc2, 0xb, 0x15,
+ 0x54, 0xb7, 0x5f, 0xc2, 0x79, 0x1d, 0x54, 0x5f,
+ 0x5e, 0x54, 0x1e, 0xb, 0xf7, 0x6a, 0x16, 0xf7,
+ 0xc6, 0x9e, 0x6, 0x31, 0x8c, 0x7e, 0xb, 0xfb,
+ 0x34, 0xfb, 0x13, 0xfb, 0x22, 0xfb, 0x32, 0xfb,
+ 0x36, 0xfb, 0x13, 0xf7, 0x22, 0xf7, 0x34, 0x1e,
+ 0xb, 0x1, 0xc0, 0x9d, 0x3, 0xa6, 0x16, 0xf8,
+ 0xd, 0x6, 0x99, 0xf7, 0x1b, 0x79, 0x8f, 0x5,
+ 0x3d, 0x7b, 0xb, 0x6f, 0xa0, 0x76, 0x9a, 0x1d,
+ 0xa0, 0x41, 0x1d, 0xb, 0xa3, 0x9e, 0x9e, 0xa3,
+ 0xa3, 0x78, 0x9e, 0x73, 0x73, 0x78, 0x78, 0x73,
+ 0x73, 0x9e, 0x78, 0xa3, 0x1f, 0xb, 0x1, 0xef,
+ 0xf1, 0xf7, 0x7b, 0xf7, 0x1, 0x3, 0x9b, 0x16,
+ 0xf7, 0xac, 0x9e, 0x6, 0x3e, 0x8d, 0x7a, 0xb,
+ 0xf8, 0x1, 0x7d, 0xb7, 0xf9, 0xc, 0x77, 0xb,
+ 0xa2, 0xf7, 0x7c, 0x74, 0x6, 0xb, 0x15, 0xfb,
+ 0x69, 0xf7, 0x26, 0xb, 0x81, 0xa7, 0xf8, 0x32,
+ 0xa7, 0xb, 0x77, 0x1, 0xf7, 0xcf, 0xf1, 0x3,
+ 0x68, 0xa, 0xb, 0x1, 0xdb, 0xdf, 0xf7, 0x44,
+ 0xdf, 0x3, 0x9b, 0x16, 0xf7, 0x6a, 0x9a, 0x6,
+ 0x57, 0x8e, 0x7d, 0xb, 0x7b, 0x1d, 0xf8, 0x3e,
+ 0x9a, 0xa, 0xb, 0x5, 0x82, 0x98, 0x83, 0x9e,
+ 0x96, 0x1a, 0xa7, 0xa4, 0xb, 0x5a, 0x6a, 0xad,
+ 0x5f, 0x1b, 0x70, 0x78, 0x7a, 0x71, 0x71, 0x9e,
+ 0x7a, 0xa6, 0x1f, 0xb, 0x15, 0xa2, 0x8e, 0x5,
+ 0xc6, 0x88, 0xb7, 0x6a, 0x58, 0x1a, 0x72, 0x7e,
+ 0x62, 0x4f, 0xb, 0x7, 0xfb, 0x0, 0x76, 0x72,
+ 0x3f, 0x86, 0x1e, 0xb, 0xc1, 0x76, 0xf8, 0x13,
+ 0x77, 0x1, 0xb, 0x74, 0x78, 0x4b, 0x87, 0x1e,
+ 0xb, 0xf7, 0x92, 0x8b, 0xb1, 0xb, 0x6e, 0xa,
+ 0xf7, 0x8c, 0x77, 0x1, 0xf3, 0xf1, 0xb, 0x83,
+ 0x1f, 0xe, 0x7, 0xb0, 0xb1, 0xaa, 0x9f, 0xa9,
+ 0x1b, 0xc6, 0x9d, 0x67, 0x4e, 0x1f, 0xb, 0xee,
+ 0xf1, 0xf7, 0x9c, 0xa2, 0xac, 0xa4, 0xb, 0xfb,
+ 0x10, 0xfb, 0x23, 0xb, 0x7b, 0xa0, 0xa0, 0xaf,
+ 0x9c, 0xb0, 0xaa, 0x70, 0xa5, 0x6d, 0x6d, 0xb,
+ 0x8b, 0x91, 0x1b, 0xb7, 0x8b, 0xb, 0xa0, 0x8a,
+ 0x1d, 0xb, 0x12, 0xb0, 0xe3, 0x46, 0xe3, 0xf7,
+ 0x23, 0xdc, 0x13, 0xda, 0xb, 0x74, 0xa, 0xad,
+ 0xb, 0x65, 0x1a, 0x4f, 0x3e, 0x97, 0x60, 0x9a,
+ 0x1e, 0xe, 0xba, 0x9c, 0xb1, 0x9a, 0xc1, 0x99,
+ 0xb, 0x9e, 0xfb, 0xaf, 0x7, 0xb, 0x66, 0xc1,
+ 0xe9, 0x99, 0xb, 0xf7, 0x5d, 0xbc, 0x12, 0x13,
+ 0x80, 0xf7, 0x5d, 0x4, 0xb, 0xba, 0xf7, 0x66,
+ 0xf7, 0x5, 0xfb, 0x2, 0xfb, 0x4f, 0xb, 0xf7,
+ 0xb3, 0xf7, 0xa0, 0x70, 0x1d, 0xb, 0x7, 0x43,
+ 0x8b, 0x6a, 0x37, 0x85, 0x1e, 0xf7, 0x4e, 0xb,
+ 0xfb, 0x5b, 0x15, 0x80, 0xa0, 0xa7, 0x86, 0xa7,
+ 0x1b, 0xb, 0x3c, 0xa0, 0x76, 0xb, 0x77, 0x1,
+ 0xd2, 0xdf, 0xf7, 0x46, 0xdf, 0x3, 0xb, 0x73,
+ 0xf8, 0xa4, 0x76, 0xf7, 0x3b, 0x77, 0x1, 0xb,
+ 0xf7, 0xf, 0xfb, 0x34, 0x76, 0xf9, 0xf1, 0x77,
+ 0xb, 0xa9, 0xaf, 0xaf, 0xa9, 0x6d, 0x67, 0x67,
+ 0x6d, 0xb, 0x8f, 0x7b, 0x1b, 0x6c, 0x8a, 0x81,
+ 0x1d, 0xb, 0x7b, 0x69, 0x29, 0x78, 0xe2, 0xc0,
+ 0x7f, 0x1e, 0xb, 0xfb, 0x6e, 0xdf, 0x37, 0xf1,
+ 0xb, 0xf7, 0x54, 0xfb, 0x41, 0x77, 0xb, 0x1a,
+ 0xfb, 0x38, 0x7, 0xb, 0x72, 0x6b, 0x1e, 0xb,
+ 0xf7, 0x6, 0x3, 0xb
+ };
diff --git a/core/src/fxge/fontdata/chromefontdata/FoxitSerifBold.c b/core/src/fxge/fontdata/chromefontdata/FoxitSerifBold.c
new file mode 100644
index 0000000000..ba879bdfea
--- /dev/null
+++ b/core/src/fxge/fontdata/chromefontdata/FoxitSerifBold.c
@@ -0,0 +1,2433 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+const unsigned char g_FoxitSerifBoldFontData [19395] = {0x1,
+ 0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0x13,
+ 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x72,
+ 0x69, 0x66, 0x4f, 0x54, 0x46, 0x2d, 0x42, 0x6f,
+ 0x6c, 0x64, 0x0, 0x1, 0x1, 0x1, 0x26, 0xf8,
+ 0x10, 0x0, 0xf8, 0x1c, 0x1, 0xf8, 0x1d, 0x2,
+ 0xf8, 0x1e, 0x3, 0xf8, 0x14, 0x4, 0xfb, 0x3c,
+ 0xfb, 0x8e, 0xfa, 0x7c, 0xfa, 0xd, 0x5, 0x1c,
+ 0x7, 0x67, 0xf, 0x1c, 0x8, 0xbe, 0x11, 0xaf,
+ 0x1c, 0x44, 0x8e, 0x12, 0x0, 0x4, 0x1, 0x1,
+ 0x5, 0x2f, 0x43, 0x52, 0x45, 0x75, 0x72, 0x6f,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x20,
+ 0x53, 0x65, 0x72, 0x69, 0x66, 0x20, 0x4f, 0x54,
+ 0x46, 0x20, 0x42, 0x6f, 0x6c, 0x64, 0x43, 0x68,
+ 0x72, 0x6F, 0x6D, 0x20, 0x53, 0x65, 0x72, 0x69,
+ 0x66, 0x20, 0x4f, 0x54, 0x46, 0x0, 0x7b, 0x2,
+ 0x0, 0x1, 0x0, 0xf, 0x0, 0x4f, 0x0, 0x54,
+ 0x0, 0x62, 0x0, 0x6d, 0x0, 0x78, 0x0, 0x96,
+ 0x0, 0xbb, 0x0, 0xbe, 0x0, 0xc7, 0x0, 0xd6,
+ 0x0, 0xdc, 0x0, 0xef, 0x0, 0xf8, 0x1, 0x5,
+ 0x1, 0x12, 0x1, 0x38, 0x1, 0x45, 0x1, 0x53,
+ 0x1, 0x5a, 0x1, 0x6b, 0x1, 0x73, 0x1, 0x7e,
+ 0x1, 0x87, 0x1, 0x8b, 0x1, 0x9b, 0x1, 0xa6,
+ 0x1, 0xab, 0x1, 0xb6, 0x1, 0xce, 0x1, 0xe8,
+ 0x1, 0xf3, 0x1, 0xfa, 0x2, 0x21, 0x2, 0x33,
+ 0x2, 0x38, 0x2, 0x41, 0x2, 0x4b, 0x2, 0x70,
+ 0x2, 0x94, 0x2, 0xa2, 0x2, 0xad, 0x2, 0xcf,
+ 0x2, 0xd5, 0x2, 0xe0, 0x2, 0xec, 0x2, 0xf2,
+ 0x3, 0x8, 0x3, 0x10, 0x3, 0x17, 0x3, 0x20,
+ 0x3, 0x29, 0x3, 0x30, 0x3, 0x37, 0x3, 0x3b,
+ 0x3, 0x48, 0x3, 0x53, 0x3, 0x61, 0x3, 0x79,
+ 0x3, 0x7f, 0x3, 0x87, 0x3, 0x8f, 0x3, 0x96,
+ 0x3, 0x9d, 0x3, 0xb2, 0x3, 0xb6, 0x3, 0xc0,
+ 0x3, 0xc6, 0x3, 0xcf, 0x3, 0xd5, 0x3, 0xdb,
+ 0x3, 0xef, 0x3, 0xfe, 0x4, 0x9, 0x4, 0x14,
+ 0x4, 0x1b, 0x4, 0x2d, 0x4, 0x35, 0x4, 0x41,
+ 0x4, 0x47, 0x4, 0x4d, 0x4, 0x5e, 0x4, 0x6f,
+ 0x4, 0x79, 0x4, 0x89, 0x4, 0x98, 0x4, 0xa5,
+ 0x4, 0xae, 0x4, 0xb3, 0x4, 0xb8, 0x4, 0xc6,
+ 0x4, 0xd4, 0x4, 0xe1, 0x4, 0xee, 0x4, 0xf1,
+ 0x4, 0xf5, 0x5, 0x1, 0x5, 0xb, 0x5, 0x11,
+ 0x5, 0x17, 0x5, 0x20, 0x5, 0x2b, 0x5, 0x36,
+ 0x5, 0x41, 0x5, 0x48, 0x5, 0x4d, 0x5, 0x51,
+ 0x5, 0x54, 0x5, 0x5e, 0x5, 0x68, 0x5, 0x72,
+ 0x5, 0x7c, 0x5, 0x86, 0x5, 0x90, 0x5, 0x9a,
+ 0x5, 0x9e, 0x5, 0xa7, 0x5, 0xb0, 0x5, 0xb9,
+ 0x5, 0xc0, 0x5, 0xc6, 0x5, 0xcb, 0x5, 0xcf,
+ 0x15, 0x3a, 0xa, 0x20, 0xa, 0x7f, 0x6d, 0x88,
+ 0x86, 0x55, 0x83, 0x19, 0x31, 0x1d, 0x3c, 0xa,
+ 0x71, 0x29, 0x1b, 0x4a, 0x78, 0x97, 0xb7, 0x1f,
+ 0xf7, 0x86, 0x7, 0xee, 0xb4, 0x6d, 0xfb, 0x11,
+ 0x97, 0x1f, 0xaf, 0xf7, 0xe6, 0x67, 0x6, 0xfb,
+ 0x10, 0x7c, 0x62, 0x72, 0x2b, 0x1b, 0xf7, 0x6d,
+ 0x7, 0xb6, 0x9d, 0x9e, 0xc2, 0xf7, 0x1b, 0xc8,
+ 0x72, 0xfb, 0x22, 0xa2, 0x1e, 0xae, 0xf7, 0x5d,
+ 0xfc, 0xd5, 0x53, 0x1d, 0xfc, 0x81, 0x7, 0x4d,
+ 0x6c, 0x9b, 0x52, 0x85, 0x1e, 0xb, 0x15, 0xc3,
+ 0x22, 0xa, 0xb, 0x32, 0x1d, 0x31, 0xa, 0x2d,
+ 0xb6, 0xfb, 0x3, 0xfb, 0x10, 0x51, 0x3a, 0x1d,
+ 0xb, 0x29, 0xa, 0x80, 0x7f, 0xa, 0x9a, 0x7c,
+ 0xa4, 0x7c, 0x1f, 0xb, 0x27, 0x1d, 0x69, 0x7,
+ 0xb4, 0x84, 0x93, 0x7f, 0x38, 0xa, 0xb, 0x3f,
+ 0xc9, 0x6c, 0xbb, 0xa3, 0xd1, 0x90, 0xcc, 0xcc,
+ 0x1e, 0x8a, 0xb7, 0x15, 0x7b, 0x7d, 0x74, 0x70,
+ 0x69, 0x1b, 0x67, 0x7c, 0xaf, 0xaa, 0xe2, 0xee,
+ 0xa8, 0xa2, 0x90, 0x1f, 0xb, 0x5e, 0x8c, 0x80,
+ 0x9d, 0xb2, 0x1a, 0xf7, 0xfc, 0xfb, 0x5d, 0x69,
+ 0x7, 0xad, 0x88, 0xa7, 0x8a, 0x54, 0x1a, 0xfb,
+ 0xa5, 0x7, 0x78, 0x78, 0x72, 0x72, 0x65, 0x1b,
+ 0x54, 0x8a, 0xb6, 0xa7, 0x1f, 0xf7, 0xe7, 0xfb,
+ 0x50, 0xb, 0x22, 0x1d, 0xe, 0x4e, 0xa, 0xed,
+ 0xf7, 0x4, 0x29, 0x2e, 0xa, 0xb, 0x67, 0xa8,
+ 0x74, 0xa, 0xa8, 0xa8, 0xaf, 0xaf, 0x6e, 0x61,
+ 0xa, 0x6e, 0x61, 0x1d, 0xb, 0x34, 0xa, 0x1f,
+ 0x39, 0x1d, 0xb, 0x64, 0x8f, 0x83, 0xa1, 0xaa,
+ 0x1a, 0xf8, 0x6, 0xfb, 0x54, 0x69, 0x7, 0xb1,
+ 0x84, 0x9a, 0x84, 0x5e, 0x1a, 0xb, 0x15, 0x2e,
+ 0x1d, 0xf7, 0x66, 0x16, 0x2e, 0x1d, 0xe, 0x67,
+ 0xa7, 0x6f, 0xaf, 0xaf, 0xa8, 0xa7, 0xaf, 0xaf,
+ 0x6e, 0x6f, 0x1d, 0xb, 0xf7, 0xeb, 0xbf, 0x15,
+ 0x4a, 0x7, 0xc4, 0x9e, 0x99, 0x8c, 0x28, 0xa,
+ 0xb, 0x33, 0xbc, 0x31, 0xef, 0xef, 0xbc, 0xe5,
+ 0xe3, 0xe3, 0x5a, 0xe5, 0x27, 0x27, 0x5a, 0x31,
+ 0x33, 0x1e, 0xf7, 0x6, 0x16, 0xd0, 0x8b, 0xe0,
+ 0xae, 0xae, 0x8b, 0x36, 0x46, 0x46, 0x8b, 0x36,
+ 0x68, 0x68, 0x8b, 0xe0, 0xd0, 0x1e, 0xb, 0xf7,
+ 0x48, 0xf7, 0x5d, 0x15, 0xe9, 0xf7, 0x87, 0xf0,
+ 0xfb, 0x87, 0x5, 0xe, 0x15, 0x6f, 0x91, 0x93,
+ 0x61, 0xd1, 0x1b, 0xb8, 0xb0, 0xa3, 0xac, 0xa7,
+ 0x1f, 0xb, 0xc0, 0xa9, 0xf7, 0x5, 0x3d, 0xa,
+ 0xb, 0x54, 0x8f, 0x63, 0x8e, 0xcb, 0x1a, 0xf8,
+ 0x64, 0x7, 0xcf, 0xbb, 0x8c, 0xba, 0x8d, 0x1e,
+ 0xae, 0xb, 0x5c, 0xa, 0xf7, 0x8b, 0x77, 0x27,
+ 0xa, 0xb, 0x94, 0x1a, 0x13, 0xbc, 0x3b, 0xa,
+ 0x13, 0x8c, 0x24, 0xa, 0xe, 0x2a, 0xa, 0x85,
+ 0x93, 0x85, 0x92, 0x94, 0x1a, 0xb, 0x16, 0x2a,
+ 0x1d, 0xe, 0x73, 0x99, 0x5, 0x74, 0x78, 0x68,
+ 0x5f, 0x50, 0x1b, 0x2c, 0x75, 0xf1, 0xe0, 0x88,
+ 0x1f, 0xb, 0x4e, 0x4c, 0x47, 0xc1, 0x8b, 0x97,
+ 0xbf, 0x9a, 0xb1, 0x9d, 0xb, 0x3b, 0xa, 0x24,
+ 0xa, 0xb, 0x65, 0x1d, 0xf7, 0x7f, 0x45, 0xa,
+ 0xfb, 0x25, 0x5f, 0x1d, 0xb, 0x9a, 0x1a, 0xa7,
+ 0x97, 0x91, 0xd0, 0x1e, 0xae, 0xfb, 0xe3, 0x68,
+ 0x7, 0xbe, 0x88, 0xa3, 0x60, 0x90, 0x82, 0xf7,
+ 0x4b, 0xfb, 0xd6, 0x18, 0xb, 0xfc, 0x31, 0x15,
+ 0xf7, 0x89, 0xa9, 0x6, 0x4b, 0x85, 0x9b, 0xb3,
+ 0x1f, 0xf7, 0xdb, 0x46, 0xa, 0xfb, 0x67, 0x7,
+ 0x65, 0x87, 0x74, 0x40, 0x8c, 0x1e, 0xb, 0x9f,
+ 0xa1, 0x92, 0x70, 0x53, 0x3a, 0x52, 0x6f, 0x78,
+ 0x1f, 0xb, 0x15, 0x2a, 0x1d, 0xf7, 0x66, 0x38,
+ 0x1d, 0x15, 0x2e, 0xca, 0x36, 0xf0, 0xf0, 0xca,
+ 0xe0, 0xe8, 0xe8, 0x4c, 0xe0, 0x26, 0x26, 0x4c,
+ 0x36, 0x2e, 0x1e, 0xf7, 0xe, 0x16, 0xbd, 0x8b,
+ 0xef, 0xb5, 0xb5, 0x8b, 0x27, 0x59, 0x59, 0x8b,
+ 0x27, 0x61, 0x61, 0x8b, 0xef, 0xbd, 0x1e, 0xb,
+ 0xfb, 0x14, 0xf7, 0x8c, 0x7b, 0x9a, 0x3d, 0x1d,
+ 0xfb, 0x1d, 0x7, 0x38, 0x73, 0x89, 0x46, 0x84,
+ 0x1e, 0xb, 0x33, 0x1d, 0x5d, 0x67, 0xb, 0xfb,
+ 0x22, 0x60, 0xfb, 0x13, 0x63, 0x23, 0x1a, 0xb,
+ 0x15, 0xb5, 0x6, 0x9d, 0x8c, 0x9b, 0xa8, 0xab,
+ 0x1b, 0xb, 0x1b, 0xfb, 0x52, 0x71, 0xfb, 0x1c,
+ 0x4e, 0x5d, 0x8b, 0x35, 0xf7, 0x3f, 0x39, 0x1f,
+ 0xf7, 0x18, 0x4c, 0xba, 0x73, 0x48, 0x1a, 0x7e,
+ 0x82, 0x28, 0xfb, 0xc, 0xfb, 0x13, 0x5f, 0xf7,
+ 0x5, 0xf0, 0x77, 0x1e, 0x64, 0x6, 0xb, 0xf7,
+ 0x4c, 0xcb, 0xf7, 0xd, 0xe3, 0xf7, 0x1, 0x3f,
+ 0xc5, 0x69, 0x9c, 0x1f, 0xfb, 0x7b, 0xf7, 0x7,
+ 0x78, 0xa1, 0xc1, 0x1a, 0xcc, 0xc2, 0xa9, 0xbf,
+ 0xf7, 0xa, 0xbd, 0xfb, 0x7, 0x45, 0x9d, 0x1e,
+ 0xb1, 0x6, 0xb, 0x1e, 0xad, 0xfb, 0x8e, 0x69,
+ 0x7, 0xa4, 0x87, 0x90, 0x8b, 0x97, 0x74, 0x8,
+ 0xb, 0xfb, 0x5f, 0x7d, 0xd3, 0xf7, 0x4f, 0xb0,
+ 0xf7, 0x34, 0xaa, 0xb, 0xa5, 0x9b, 0xb9, 0x1a,
+ 0xc3, 0x5c, 0xa3, 0x4d, 0x3e, 0x59, 0x56, 0x65,
+ 0x78, 0x1e, 0x9f, 0x84, 0x5, 0x9a, 0x95, 0xa2,
+ 0xae, 0xb1, 0x1b, 0xbb, 0xa0, 0x71, 0x68, 0x54,
+ 0x56, 0x7c, 0x6c, 0x82, 0x1f, 0xb, 0x54, 0xa,
+ 0xf8, 0x5a, 0x77, 0xb, 0x49, 0x1d, 0xf7, 0x84,
+ 0x77, 0x98, 0xa, 0x17, 0x4d, 0xa, 0xb, 0xad,
+ 0xfb, 0x2b, 0x69, 0x7, 0xa4, 0x8a, 0xa9, 0x8b,
+ 0x6b, 0x1a, 0xb, 0x8b, 0xae, 0xf8, 0xf2, 0xae,
+ 0xb, 0x96, 0x83, 0x5, 0xa7, 0x94, 0xb9, 0x87,
+ 0x66, 0x1a, 0x73, 0x1d, 0x1e, 0x7b, 0x66, 0x5,
+ 0x7b, 0xb4, 0xa1, 0x89, 0x97, 0x1b, 0xb, 0x1b,
+ 0x2f, 0x78, 0x31, 0x68, 0x84, 0x1f, 0xb, 0xf7,
+ 0x17, 0x78, 0xac, 0x93, 0x1d, 0xb, 0x12, 0xa4,
+ 0xf7, 0x26, 0xf7, 0xe, 0xf7, 0x1e, 0xb, 0x68,
+ 0x6, 0xb9, 0x88, 0xb5, 0x93, 0x49, 0x1a, 0xb,
+ 0x7a, 0x85, 0x81, 0x6b, 0x66, 0x1b, 0xb, 0x51,
+ 0xa, 0xf7, 0x8b, 0x72, 0xa, 0xb, 0x15, 0xc3,
+ 0x6, 0xb, 0x5a, 0xa, 0xf7, 0x68, 0xf7, 0xe9,
+ 0x79, 0x1d, 0xf7, 0x3f, 0x66, 0x1d, 0xb, 0x65,
+ 0x1d, 0xf7, 0x84, 0x45, 0xa, 0xfb, 0x2a, 0x5f,
+ 0x1d, 0xb, 0x5d, 0x90, 0x88, 0xa8, 0xa2, 0x1a,
+ 0xf7, 0x95, 0x7, 0x94, 0xb6, 0xbc, 0xb3, 0xb,
+ 0x1a, 0xe6, 0x3b, 0xa0, 0x63, 0x2f, 0x65, 0x33,
+ 0x69, 0x7e, 0x1e, 0xa3, 0x6, 0xbd, 0xa3, 0xae,
+ 0x8f, 0x9a, 0x1b, 0xcd, 0x96, 0x4f, 0x7a, 0xb,
+ 0xae, 0xfb, 0x70, 0x68, 0x7, 0xb, 0xae, 0xf7,
+ 0x45, 0xf7, 0xf6, 0xf7, 0x45, 0xb, 0xa4, 0xf7,
+ 0x27, 0xf7, 0x31, 0xf7, 0x27, 0xb, 0xfb, 0x55,
+ 0xfb, 0x55, 0xfb, 0x35, 0xb, 0xf7, 0x61, 0xf7,
+ 0x61, 0xf7, 0x29, 0xb, 0xae, 0x1, 0xf4, 0x7f,
+ 0x1d, 0x9e, 0x16, 0xf8, 0xd6, 0x6, 0xb4, 0xf7,
+ 0x77, 0x5, 0x6e, 0x6, 0xfb, 0x5, 0x5d, 0x53,
+ 0xb, 0x6e, 0x67, 0x1e, 0xb, 0x63, 0x1d, 0xb2,
+ 0x5c, 0x5b, 0x67, 0x63, 0x5e, 0x1e, 0xe, 0x15,
+ 0x5c, 0xaf, 0x64, 0x1d, 0xb, 0x66, 0xbb, 0xba,
+ 0xb1, 0xaf, 0xbb, 0xb9, 0x65, 0xb, 0xfb, 0x3f,
+ 0xfb, 0x3f, 0x85, 0xb, 0xf7, 0x20, 0xf7, 0x20,
+ 0xb0, 0xb, 0xb9, 0xb4, 0x63, 0xba, 0x1b, 0xa4,
+ 0xa5, 0xa2, 0xa6, 0xa6, 0x71, 0xa2, 0x72, 0x1f,
+ 0x5c, 0x62, 0x63, 0x5d, 0x1b, 0xb, 0x76, 0xf7,
+ 0x42, 0xf7, 0x35, 0x12, 0x99, 0x77, 0xa, 0xe1,
+ 0x77, 0xa, 0x13, 0xe8, 0xb, 0xf7, 0x4d, 0x16,
+ 0xf7, 0xef, 0xae, 0x6, 0x45, 0x92, 0x75, 0xb,
+ 0xf7, 0x7e, 0x66, 0x7, 0x72, 0x81, 0x82, 0x76,
+ 0x70, 0x1b, 0xb, 0xf7, 0xf, 0x98, 0x8, 0xa2,
+ 0x7, 0xb, 0x67, 0xa7, 0x6d, 0xaf, 0xaf, 0xa6,
+ 0xa9, 0xaf, 0xaf, 0x70, 0xa7, 0x67, 0x67, 0x6f,
+ 0x6f, 0x67, 0x1e, 0xb, 0x67, 0xa6, 0x81, 0x1d,
+ 0x70, 0x61, 0x1d, 0xb, 0x67, 0xa7, 0x74, 0xa,
+ 0xa6, 0xa8, 0xaf, 0xaf, 0x70, 0x6f, 0x1d, 0xb,
+ 0x61, 0xa, 0x6f, 0x61, 0x1d, 0xb, 0xfb, 0x17,
+ 0xfb, 0x1f, 0x34, 0xb, 0xa5, 0xf7, 0xe3, 0x15,
+ 0xfb, 0x5a, 0xf7, 0x2a, 0xfb, 0x30, 0xf7, 0x5a,
+ 0xf7, 0x5a, 0xf7, 0x29, 0xb, 0x9b, 0x16, 0xf7,
+ 0x77, 0xae, 0x6, 0x41, 0x93, 0x76, 0x8b, 0xd3,
+ 0x1a, 0xf8, 0x2d, 0x8d, 0x7, 0xb, 0x62, 0x5d,
+ 0x8b, 0x7f, 0x73, 0x7b, 0x92, 0x92, 0x78, 0xb,
+ 0x15, 0xf7, 0x35, 0x34, 0xe9, 0xe2, 0xb4, 0xcd,
+ 0x62, 0xf7, 0x98, 0x57, 0x6, 0x4f, 0x43, 0xb,
+ 0x99, 0x16, 0xf7, 0x87, 0xad, 0x6, 0x5d, 0x90,
+ 0x8a, 0xa8, 0xa2, 0x1a, 0xf7, 0xda, 0xb, 0xfc,
+ 0x95, 0x15, 0xcd, 0x6, 0xf8, 0x60, 0xf9, 0x48,
+ 0x5, 0x49, 0x6, 0xe, 0xa9, 0x30, 0xf1, 0x70,
+ 0xb4, 0x1f, 0xa9, 0xb1, 0xb, 0x15, 0xf7, 0x6,
+ 0x90, 0xb, 0x15, 0xf7, 0x26, 0xb0, 0xb, 0xfb,
+ 0x57, 0xfb, 0xa6, 0x15, 0x69, 0xf7, 0xa5, 0xaa,
+ 0x7, 0x5c, 0x8d, 0x6c, 0xb, 0x8f, 0x85, 0x80,
+ 0x79, 0x7e, 0x82, 0x80, 0x1e, 0xfb, 0x5f, 0xfb,
+ 0x38, 0x5, 0xb, 0xae, 0x78, 0x15, 0xb2, 0x6,
+ 0x9b, 0x8f, 0x90, 0x9d, 0xa0, 0x1b, 0x98, 0xb,
+ 0xc5, 0xbb, 0xba, 0xc6, 0xc5, 0x5b, 0xbc, 0x51,
+ 0x51, 0x5a, 0x5b, 0x50, 0xb, 0x2e, 0xa, 0xe,
+ 0xf7, 0x36, 0x3, 0xb, 0xfb, 0x30, 0xfb, 0x31,
+ 0xfb, 0xc, 0xf7, 0x1e, 0xf7, 0x38, 0x1e, 0xb,
+ 0x74, 0xa, 0xa7, 0xa8, 0xaf, 0xaf, 0x6f, 0x61,
+ 0xa, 0xb, 0x8b, 0xad, 0xf8, 0x8, 0xce, 0xb,
+ 0x76, 0xf7, 0x44, 0x77, 0x1, 0xb, 0xf7, 0x1f,
+ 0x13, 0xe0, 0x9b, 0x16, 0x99, 0xa, 0xb, 0xf7,
+ 0x1f, 0xf7, 0xe, 0xf7, 0x1f, 0xfb, 0xf, 0xf7,
+ 0x1f, 0xb, 0xf7, 0x8b, 0xf7, 0x41, 0x6c, 0xaa,
+ 0x12, 0xa4, 0xf7, 0x21, 0xb, 0xfb, 0x5f, 0xa0,
+ 0x76, 0xf7, 0xe8, 0x76, 0xf7, 0x2, 0xab, 0xb,
+ 0x89, 0xd3, 0xfb, 0x53, 0x69, 0x6, 0xb, 0xf7,
+ 0xeb, 0xbf, 0x15, 0xb, 0xd6, 0x8b, 0xae, 0xb,
+ 0x85, 0x1e, 0xe, 0xa1, 0x8a, 0x8a, 0xaf, 0xcb,
+ 0x1b, 0xf7, 0x40, 0xa2, 0xb, 0xfb, 0x91, 0xfb,
+ 0x2e, 0x76, 0xf9, 0xfd, 0x77, 0x1, 0xb, 0x6,
+ 0x84, 0x6c, 0x6f, 0x49, 0x54, 0x76, 0x69, 0x80,
+ 0xb, 0x55, 0x8b, 0x5a, 0xc3, 0x93, 0xc7, 0x8b,
+ 0xcb, 0xd3, 0xb, 0xd4, 0x90, 0x28, 0x37, 0x53,
+ 0x88, 0xfb, 0x1b, 0x39, 0xb, 0xfb, 0xce, 0xfb,
+ 0x29, 0xb6, 0xf9, 0x79, 0xb6, 0x1, 0xb, 0xfb,
+ 0xce, 0xfb, 0x27, 0x76, 0xf9, 0xf2, 0x77, 0x1,
+ 0xb, 0xf9, 0x18, 0xac, 0xb, 0x86, 0x84, 0x9d,
+ 0x1f, 0x81, 0xa5, 0xae, 0x7f, 0xb, 0xfb, 0xac,
+ 0x1f, 0xfb, 0xc5, 0x68, 0x6, 0xb2, 0xb, 0xfb,
+ 0x2b, 0x1b, 0x48, 0x75, 0x93, 0xbb, 0x1f, 0xb,
+ 0x7, 0x73, 0x80, 0x67, 0x63, 0x1e, 0xe, 0x76,
+ 0xf7, 0x4d, 0x77, 0x1, 0xb, 0xf7, 0x8b, 0x77,
+ 0x1, 0xb, 0xf7, 0x16, 0x12, 0xb, 0x1, 0x0,
+ 0x1, 0x6, 0x0, 0x68, 0x0, 0x0, 0x9, 0x37,
+ 0x0, 0x7c, 0x0, 0x0, 0x42, 0x20, 0x0, 0x67,
+ 0x0, 0x0, 0x64, 0x0, 0x0, 0xa0, 0x0, 0x0,
+ 0x66, 0x0, 0x0, 0x83, 0x0, 0x0, 0xaa, 0x0,
+ 0x0, 0x8b, 0x0, 0x0, 0x6a, 0x0, 0x0, 0x97,
+ 0x0, 0x0, 0xa5, 0x0, 0x0, 0x80, 0x0, 0x0,
+ 0xa1, 0x0, 0x0, 0x9c, 0x0, 0x0, 0xa4, 0x0,
+ 0x0, 0xa9, 0x0, 0x0, 0x7d, 0x0, 0x0, 0x98,
+ 0x0, 0x0, 0x73, 0x0, 0x0, 0x72, 0x0, 0x0,
+ 0x85, 0x0, 0x0, 0x96, 0x0, 0x0, 0x8f, 0x0,
+ 0x0, 0x78, 0x0, 0x0, 0x9e, 0x0, 0x0, 0x9b,
+ 0x0, 0x0, 0xa3, 0x0, 0x0, 0x7b, 0x0, 0x0,
+ 0xae, 0x0, 0x0, 0xab, 0x1, 0x0, 0xb0, 0x0,
+ 0x0, 0xad, 0x0, 0x0, 0xaf, 0x0, 0x0, 0x8a,
+ 0x0, 0x0, 0xb1, 0x0, 0x0, 0xb5, 0x0, 0x0,
+ 0xb2, 0x2, 0x0, 0xb9, 0x0, 0x0, 0xb6, 0x2,
+ 0x0, 0x9a, 0x0, 0x0, 0xba, 0x0, 0x0, 0xbe,
+ 0x0, 0x0, 0xbb, 0x1, 0x0, 0xbf, 0x0, 0x0,
+ 0xbd, 0x0, 0x0, 0xa8, 0x0, 0x0, 0x8d, 0x0,
+ 0x0, 0xc4, 0x0, 0x0, 0xc1, 0x2, 0x0, 0xc5,
+ 0x0, 0x0, 0x9d, 0x0, 0x0, 0x95, 0x0, 0x0,
+ 0xcb, 0x0, 0x0, 0xc8, 0x1, 0x0, 0xcd, 0x0,
+ 0x0, 0xca, 0x0, 0x0, 0xcc, 0x0, 0x0, 0x90,
+ 0x0, 0x0, 0xce, 0x0, 0x0, 0xd2, 0x0, 0x0,
+ 0xcf, 0x2, 0x0, 0xd6, 0x0, 0x0, 0xd3, 0x2,
+ 0x0, 0xa7, 0x0, 0x0, 0xd7, 0x0, 0x0, 0xdb,
+ 0x0, 0x0, 0xd8, 0x1, 0x0, 0xdc, 0x0, 0x0,
+ 0xda, 0x0, 0x0, 0x9f, 0x0, 0x0, 0x93, 0x0,
+ 0x0, 0xe1, 0x0, 0x0, 0xde, 0x2, 0x0, 0xe2,
+ 0x0, 0x0, 0xa2, 0x0, 0x0, 0xe3, 0x0, 0x0,
+ 0x91, 0x0, 0x0, 0x8c, 0x0, 0x0, 0x92, 0x0,
+ 0x0, 0x8e, 0x0, 0x0, 0x94, 0x0, 0x0, 0xc0,
+ 0x0, 0x0, 0xdd, 0x0, 0x0, 0xc6, 0x1, 0x0,
+ 0xe4, 0x0, 0x0, 0x65, 0x0, 0x0, 0x7e, 0x0,
+ 0x0, 0x88, 0x0, 0x0, 0x81, 0x1, 0x0, 0x84,
+ 0x0, 0x0, 0x87, 0x0, 0x0, 0x7f, 0x0, 0x0,
+ 0x86, 0x0, 0x0, 0x6f, 0x0, 0x0, 0x89, 0x0,
+ 0x0, 0x41, 0x0, 0x0, 0x8, 0x0, 0x0, 0x75,
+ 0x0, 0x0, 0x69, 0x0, 0x0, 0x77, 0x0, 0x0,
+ 0x76, 0x0, 0x0, 0x70, 0x1, 0x0, 0x74, 0x0,
+ 0x0, 0x79, 0x1, 0x0, 0x6b, 0x1, 0x0, 0x63,
+ 0x0, 0x1, 0x87, 0x0, 0x0, 0x99, 0x0, 0x0,
+ 0xa6, 0x0, 0x0, 0x6d, 0x1, 0x0, 0xe6, 0x2,
+ 0x0, 0x1, 0x0, 0x4, 0x0, 0x7, 0x0, 0x4b,
+ 0x0, 0x78, 0x0, 0xec, 0x1, 0x74, 0x1, 0xa0,
+ 0x2, 0x61, 0x2, 0x8c, 0x2, 0xba, 0x2, 0xea,
+ 0x3, 0xe4, 0x4, 0x10, 0x4, 0x3e, 0x4, 0x51,
+ 0x4, 0x59, 0x4, 0x74, 0x4, 0xc5, 0x4, 0xfb,
+ 0x5, 0x4c, 0x5, 0xb5, 0x5, 0xf3, 0x6, 0x51,
+ 0x6, 0xb4, 0x6, 0xda, 0x7, 0x5c, 0x7, 0xbb,
+ 0x7, 0xe1, 0x8, 0x28, 0x8, 0x45, 0x8, 0x67,
+ 0x8, 0x83, 0x8, 0xf4, 0x9, 0xad, 0x9, 0xcd,
+ 0xa, 0x4a, 0xa, 0xa9, 0xa, 0xee, 0xb, 0x4c,
+ 0xb, 0xab, 0xc, 0x23, 0xc, 0x8c, 0xc, 0x91,
+ 0xc, 0xe4, 0xd, 0x50, 0xd, 0x75, 0xd, 0xe6,
+ 0xe, 0x0, 0xe, 0x20, 0xe, 0x7d, 0xe, 0xd7,
+ 0xf, 0x50, 0xf, 0x78, 0xf, 0xbb, 0x10, 0x3,
+ 0x10, 0x46, 0x10, 0xc0, 0x11, 0x3d, 0x11, 0x5f,
+ 0x11, 0x65, 0x11, 0x86, 0x11, 0xa1, 0x11, 0xc2,
+ 0x11, 0xe3, 0x11, 0xef, 0x11, 0xf7, 0x12, 0x36,
+ 0x12, 0x9e, 0x12, 0xe2, 0x13, 0x49, 0x13, 0x76,
+ 0x13, 0xcc, 0x14, 0x91, 0x14, 0xc3, 0x14, 0xed,
+ 0x15, 0x50, 0x15, 0xb9, 0x15, 0xd7, 0x16, 0x64,
+ 0x16, 0xac, 0x16, 0xeb, 0x17, 0x23, 0x17, 0x85,
+ 0x17, 0xe0, 0x18, 0x63, 0x18, 0xac, 0x18, 0xbf,
+ 0x18, 0xef, 0x19, 0x6c, 0x19, 0xe6, 0x19, 0xfa,
+ 0x1a, 0x25, 0x1a, 0x74, 0x1a, 0x8f, 0x1a, 0xde,
+ 0x1b, 0x21, 0x1b, 0x70, 0x1b, 0xf8, 0x1c, 0xad,
+ 0x1d, 0x20, 0x1d, 0x9f, 0x1d, 0xc1, 0x1e, 0x93,
+ 0x1e, 0x9e, 0x1f, 0x19, 0x1f, 0x90, 0x1f, 0xc5,
+ 0x1f, 0xe5, 0x20, 0x79, 0x20, 0x8a, 0x20, 0xc2,
+ 0x20, 0xff, 0x21, 0x30, 0x21, 0x51, 0x21, 0x6d,
+ 0x21, 0xec, 0x22, 0x28, 0x22, 0x32, 0x22, 0x57,
+ 0x22, 0x80, 0x22, 0xb8, 0x22, 0xe4, 0x23, 0x18,
+ 0x23, 0x60, 0x23, 0x98, 0x24, 0xb, 0x24, 0x1d,
+ 0x24, 0x2f, 0x24, 0x41, 0x24, 0x7c, 0x24, 0x9f,
+ 0x24, 0xd9, 0x25, 0x78, 0x26, 0x6, 0x26, 0x12,
+ 0x26, 0x22, 0x26, 0x36, 0x26, 0x60, 0x26, 0x68,
+ 0x26, 0x6f, 0x26, 0x7c, 0x26, 0xae, 0x26, 0xfc,
+ 0x27, 0x35, 0x27, 0x57, 0x27, 0x6a, 0x27, 0x8a,
+ 0x27, 0xe6, 0x28, 0x5, 0x28, 0x35, 0x28, 0xa9,
+ 0x28, 0xba, 0x28, 0xce, 0x28, 0xe2, 0x29, 0x6,
+ 0x29, 0x3a, 0x29, 0xdd, 0x2a, 0x81, 0x2a, 0x9c,
+ 0x2a, 0xb8, 0x2a, 0xd8, 0x2b, 0x28, 0x2b, 0x46,
+ 0x2b, 0x8e, 0x2c, 0x43, 0x2c, 0x9f, 0x2c, 0xb4,
+ 0x2c, 0xca, 0x2c, 0xea, 0x2d, 0xf, 0x2d, 0x29,
+ 0x2d, 0x48, 0x2d, 0x6d, 0x2d, 0x90, 0x2e, 0x5,
+ 0x2e, 0x51, 0x2e, 0xa3, 0x2e, 0xb1, 0x2e, 0xbe,
+ 0x2e, 0xe9, 0x2f, 0x6, 0x2f, 0x38, 0x2f, 0xc3,
+ 0x2f, 0xde, 0x2f, 0xfe, 0x30, 0x15, 0x30, 0x3b,
+ 0x30, 0x78, 0x30, 0xa9, 0x30, 0xcd, 0x30, 0xd6,
+ 0x31, 0x14, 0x31, 0x46, 0x31, 0xe0, 0x32, 0x71,
+ 0x32, 0xa1, 0x33, 0x19, 0x33, 0x4f, 0x33, 0x61,
+ 0x33, 0x93, 0x34, 0x16, 0x34, 0x21, 0x34, 0x39,
+ 0x34, 0x64, 0x34, 0x85, 0x34, 0xcc, 0x35, 0x0,
+ 0x35, 0x39, 0x35, 0x52, 0x35, 0x60, 0x35, 0x70,
+ 0x35, 0x95, 0x35, 0xa1, 0x35, 0xb0, 0x35, 0xd9,
+ 0x35, 0xf3, 0x36, 0xc, 0x36, 0xb0, 0x37, 0x19,
+ 0x37, 0x38, 0x37, 0x5b, 0x37, 0x96, 0x37, 0xba,
+ 0x37, 0xdf, 0x37, 0xf8, 0x38, 0x86, 0x39, 0x2f,
+ 0x39, 0x3f, 0x39, 0xa5, 0x3a, 0x0, 0xfc, 0x21,
+ 0xe, 0xfc, 0x21, 0xe, 0xfb, 0xce, 0x7e, 0xf7,
+ 0x3d, 0xf8, 0xab, 0x77, 0x1, 0xdc, 0xf7, 0x3e,
+ 0x3, 0xdc, 0xd2, 0x15, 0x5c, 0xb0, 0x64, 0x1d,
+ 0xb2, 0x5c, 0x5b, 0x66, 0x63, 0x5e, 0x1e, 0xd1,
+ 0xf7, 0x37, 0x15, 0xa8, 0x6, 0x94, 0xe5, 0x96,
+ 0xc7, 0x96, 0xb7, 0x8, 0x9f, 0xdd, 0x9f, 0xa5,
+ 0xc2, 0x1a, 0xcb, 0x69, 0xaf, 0x58, 0x57, 0x6a,
+ 0x67, 0x4b, 0x54, 0x9f, 0x70, 0x9f, 0x38, 0x1e,
+ 0x96, 0x5f, 0x95, 0x4f, 0x94, 0x33, 0x8, 0xe,
+ 0x2f, 0xf8, 0x3d, 0x76, 0xf7, 0xb3, 0x77, 0x1,
+ 0xde, 0xf7, 0x15, 0xf7, 0x17, 0xf7, 0x15, 0x3,
+ 0xf7, 0x13, 0xf8, 0x28, 0x15, 0x6e, 0xa, 0x74,
+ 0xa6, 0xfb, 0xc, 0x9c, 0x43, 0x1e, 0xf7, 0x98,
+ 0x16, 0x6e, 0xa, 0x1e, 0x8a, 0x74, 0xa7, 0xfb,
+ 0xc, 0x9c, 0x43, 0x8, 0xe, 0xa0, 0x76, 0xf7,
+ 0x66, 0xcc, 0x4a, 0xd4, 0xf7, 0x20, 0xd4, 0x45,
+ 0xcb, 0xf7, 0x66, 0x77, 0x12, 0x13, 0xb4, 0xb5,
+ 0x16, 0xce, 0x6, 0xbb, 0xf7, 0x66, 0x5, 0xf7,
+ 0x21, 0x6, 0x5d, 0xfb, 0x66, 0x5, 0xce, 0x6,
+ 0xb9, 0xf7, 0x66, 0x5, 0xf0, 0x6, 0x13, 0xcc,
+ 0x8c, 0xcc, 0x5, 0x35, 0x6, 0xad, 0xf7, 0x2b,
+ 0x5, 0xdb, 0x6, 0x8c, 0xcb, 0x5, 0x47, 0x6,
+ 0xba, 0xf7, 0x66, 0x5, 0x49, 0x6, 0x5b, 0xfb,
+ 0x66, 0x5, 0xfb, 0x22, 0x6, 0xb9, 0xf7, 0x66,
+ 0x5, 0x49, 0x6, 0x5c, 0xfb, 0x66, 0x5, 0xfb,
+ 0xa, 0x6, 0x8a, 0x4b, 0x5, 0xf2, 0x6, 0x6b,
+ 0xfb, 0x2b, 0x5, 0x28, 0x6, 0x8a, 0x4a, 0x5,
+ 0xe1, 0x6, 0xdc, 0xcc, 0x15, 0xab, 0xf7, 0x2b,
+ 0x5, 0xf7, 0x25, 0x6, 0x69, 0xfb, 0x2b, 0x5,
+ 0xe, 0x3d, 0x76, 0xf9, 0xe5, 0x77, 0x12, 0xdc,
+ 0xea, 0xbc, 0xc3, 0xe9, 0xf7, 0x2, 0x17, 0xf7,
+ 0xa1, 0xa9, 0x15, 0xf7, 0x70, 0x7, 0xc5, 0x6a,
+ 0xae, 0x78, 0x51, 0x1a, 0x2e, 0x49, 0x7f, 0x70,
+ 0x86, 0x1e, 0xfb, 0x73, 0x98, 0x15, 0xd3, 0x6e,
+ 0xa7, 0x80, 0xcf, 0x88, 0x8, 0x28, 0xc2, 0xee,
+ 0x7, 0x13, 0x78, 0xf0, 0x9c, 0xf1, 0xaf, 0xf7,
+ 0x26, 0x1a, 0xf7, 0xe, 0x2c, 0xbd, 0xfb, 0x0,
+ 0xc2, 0x1e, 0xf7, 0x6b, 0x7, 0xeb, 0x7b, 0xa0,
+ 0x22, 0x96, 0x64, 0x8, 0xaa, 0xf7, 0x21, 0x6,
+ 0x6f, 0x9c, 0x68, 0xa0, 0x2b, 0x99, 0x8, 0xd7,
+ 0x54, 0x3d, 0x7, 0x37, 0x87, 0x26, 0x54, 0xfb,
+ 0x9, 0x1a, 0xfb, 0xd, 0xf7, 0x5, 0x50, 0xd2,
+ 0x68, 0x1e, 0xfb, 0x8f, 0x7, 0x54, 0x95, 0x5e,
+ 0xa8, 0x67, 0xf7, 0x14, 0x6c, 0x8d, 0x18, 0xf7,
+ 0x3b, 0xf7, 0x93, 0x15, 0x80, 0x8f, 0x3d, 0xa3,
+ 0xd2, 0x1a, 0xc9, 0xbb, 0x9f, 0xb4, 0x94, 0x1e,
+ 0xe, 0xf7, 0xf5, 0x7d, 0xb9, 0xf7, 0x9a, 0xb9,
+ 0x78, 0xbe, 0xf7, 0x97, 0xba, 0x99, 0x77, 0x1,
+ 0xf7, 0x10, 0xf7, 0x6, 0xf7, 0x56, 0xac, 0xd1,
+ 0xf7, 0x9, 0xf7, 0x54, 0xac, 0x3, 0xf8, 0xee,
+ 0xf7, 0x38, 0x41, 0x1d, 0xfd, 0x22, 0xf7, 0xe2,
+ 0x41, 0x1d, 0xb9, 0x76, 0x1d, 0xf7, 0x4e, 0x7b,
+ 0xd8, 0x3e, 0xf0, 0xf8, 0xd1, 0xac, 0x12, 0xc9,
+ 0xf7, 0x1f, 0xf7, 0xe, 0xf7, 0x24, 0x8b, 0xf0,
+ 0xd6, 0xf7, 0x24, 0x13, 0x7c, 0xf8, 0x6f, 0xd3,
+ 0x15, 0x5c, 0xb1, 0xc6, 0x62, 0xc9, 0x1b, 0xb0,
+ 0xad, 0x9d, 0xb1, 0xb1, 0x1f, 0x13, 0x7e, 0x9c,
+ 0x9c, 0xa5, 0xc0, 0x8c, 0x8c, 0x77, 0x97, 0x18,
+ 0x75, 0x7f, 0x77, 0x7b, 0x72, 0x1b, 0x5c, 0x6c,
+ 0xb0, 0xc1, 0x61, 0x1f, 0xc1, 0xd0, 0x96, 0x96,
+ 0xc2, 0xe4, 0x9c, 0xa6, 0x9a, 0x94, 0xb8, 0x8f,
+ 0x8, 0xad, 0xfb, 0x66, 0x69, 0x7, 0xbf, 0x85,
+ 0x99, 0x89, 0x66, 0x1a, 0x5b, 0x5f, 0x5f, 0x6b,
+ 0x64, 0x1e, 0xfb, 0x2b, 0xf7, 0x6a, 0x5, 0xcc,
+ 0xa1, 0xe2, 0xb6, 0xdd, 0x1a, 0xc1, 0x61, 0xce,
+ 0xfb, 0x12, 0xfb, 0x34, 0x25, 0xfb, 0x2c, 0xfb,
+ 0x2b, 0xf7, 0xc, 0x1e, 0x49, 0x6b, 0xfb, 0x16,
+ 0x4c, 0xfb, 0x17, 0x1a, 0xfb, 0xb, 0xea, 0x50,
+ 0xeb, 0xf1, 0xdc, 0xc5, 0xa9, 0xb2, 0x1e, 0x74,
+ 0xa7, 0x15, 0x13, 0xbc, 0x77, 0x70, 0x6b, 0x78,
+ 0x6c, 0x1b, 0x2d, 0x48, 0xf7, 0x17, 0xcf, 0xb7,
+ 0xa0, 0xa3, 0xc0, 0xa9, 0x1f, 0xe3, 0xfb, 0x18,
+ 0xbe, 0x3f, 0xb1, 0x59, 0x8, 0x54, 0xf7, 0xf4,
+ 0x15, 0x73, 0xa8, 0x59, 0xce, 0xbe, 0x1a, 0xbb,
+ 0xa7, 0x96, 0xa4, 0xc4, 0xad, 0x41, 0x59, 0x52,
+ 0x60, 0x7b, 0x70, 0x82, 0x1e, 0xe, 0xfc, 0x5,
+ 0xf8, 0x3d, 0x76, 0xf7, 0xb3, 0x77, 0x1, 0x5c,
+ 0xf7, 0x15, 0x3, 0xf7, 0xb, 0xf8, 0x28, 0x15,
+ 0xb4, 0x6, 0x9c, 0xd3, 0xa6, 0xf7, 0x4, 0xa2,
+ 0x1a, 0xb6, 0x72, 0xb0, 0x63, 0x63, 0x73, 0x66,
+ 0x60, 0x74, 0xa6, 0xfb, 0x4, 0x9c, 0x43, 0x1e,
+ 0xe, 0x92, 0x1d, 0xbf, 0xf7, 0x5, 0x3, 0xf7,
+ 0xc6, 0xfb, 0x20, 0x15, 0x2a, 0xc6, 0x59, 0xd3,
+ 0xf7, 0xa4, 0x1a, 0xf7, 0xc5, 0xcb, 0xb6, 0xde,
+ 0xc3, 0x1e, 0xa6, 0x7, 0x54, 0x72, 0xfb, 0x61,
+ 0xfb, 0x6, 0xfb, 0xb8, 0x1a, 0x39, 0xa7, 0xfb,
+ 0x74, 0xf7, 0x7c, 0xfb, 0x11, 0x1e, 0xe, 0x92,
+ 0x1d, 0xf7, 0x42, 0xf7, 0x5, 0x3, 0xa6, 0xfb,
+ 0x21, 0x15, 0x70, 0x7, 0xc2, 0xa4, 0xf7, 0x61,
+ 0xf7, 0x11, 0xf7, 0xb8, 0x1a, 0xdd, 0x6f, 0xf7,
+ 0x69, 0xfb, 0x7c, 0xf7, 0x11, 0x1e, 0x6f, 0x7,
+ 0xec, 0x50, 0xbd, 0x4e, 0xfb, 0xa4, 0x1a, 0xfb,
+ 0xc5, 0x4b, 0x55, 0x38, 0x53, 0x1e, 0xe, 0xf7,
+ 0xa8, 0x76, 0xf4, 0x76, 0xa3, 0x76, 0xf7, 0xf,
+ 0x76, 0xf7, 0x8b, 0x77, 0x12, 0xf7, 0x5d, 0xee,
+ 0x13, 0xbc, 0xf7, 0x85, 0xf8, 0x55, 0x15, 0x6f,
+ 0x88, 0x78, 0x86, 0x7d, 0x1e, 0x80, 0x6a, 0x76,
+ 0x85, 0x64, 0x1a, 0x69, 0xa2, 0x76, 0xa4, 0xa3,
+ 0xa6, 0xa0, 0xaa, 0x1e, 0x8a, 0xa8, 0x7b, 0x98,
+ 0x7e, 0xb3, 0x86, 0x9a, 0x87, 0x9f, 0x89, 0xa4,
+ 0x92, 0x90, 0x18, 0xa1, 0x80, 0x94, 0x85, 0x99,
+ 0x7a, 0x93, 0x81, 0x94, 0x7d, 0x9a, 0x76, 0x8,
+ 0x76, 0x99, 0xa1, 0x7f, 0x9e, 0x1b, 0xa5, 0xa2,
+ 0x9a, 0xac, 0xc6, 0x56, 0x7f, 0x4e, 0x97, 0x1f,
+ 0x79, 0x8f, 0x78, 0x90, 0x79, 0x95, 0x8, 0x93,
+ 0x7, 0xa2, 0x9b, 0x9e, 0x91, 0x9b, 0x8e, 0xa5,
+ 0x8f, 0xa0, 0x85, 0xa2, 0x94, 0x8, 0xa7, 0x95,
+ 0x98, 0xa1, 0xa0, 0x1a, 0xa4, 0x79, 0xa2, 0x6a,
+ 0x63, 0x86, 0x6d, 0x64, 0x6b, 0x1e, 0x7f, 0x7d,
+ 0x7a, 0x7b, 0x75, 0x7b, 0x83, 0x8e, 0x18, 0x88,
+ 0xb1, 0x94, 0xa0, 0x94, 0x9c, 0x8, 0x96, 0xa0,
+ 0x99, 0x99, 0xa8, 0x1a, 0xad, 0x71, 0x9f, 0x71,
+ 0x73, 0x73, 0x78, 0x6d, 0x6c, 0x9a, 0x7c, 0x97,
+ 0x73, 0x1e, 0x94, 0x7a, 0x90, 0x75, 0x67, 0x1a,
+ 0x84, 0x88, 0x6f, 0x98, 0x7d, 0x9c, 0x7f, 0x9b,
+ 0x19, 0xac, 0x73, 0x86, 0xac, 0x58, 0x1b, 0x7e,
+ 0x6c, 0x80, 0x66, 0x68, 0x9a, 0x81, 0xa5, 0x86,
+ 0x1f, 0x9d, 0x88, 0xa1, 0x8a, 0xa4, 0x87, 0x9f,
+ 0x87, 0xa0, 0x85, 0xa2, 0x80, 0x8a, 0x84, 0x18,
+ 0x73, 0x79, 0x78, 0x85, 0x7a, 0x89, 0x8, 0x89,
+ 0x7e, 0x7b, 0x8b, 0x7b, 0x1b, 0x6e, 0x6a, 0x7a,
+ 0x67, 0x89, 0x1f, 0x13, 0xdc, 0x71, 0x8a, 0xa1,
+ 0x71, 0xa6, 0x1b, 0xb6, 0x8f, 0xab, 0xb2, 0xac,
+ 0x1f, 0x97, 0x99, 0x9a, 0x9a, 0xa2, 0x9a, 0x8,
+ 0xe, 0x3e, 0xa0, 0x76, 0xf7, 0x74, 0xc6, 0xf7,
+ 0x73, 0x77, 0x12, 0xf7, 0x81, 0xe5, 0x3f, 0xcb,
+ 0x13, 0xf0, 0xac, 0xf7, 0x76, 0x15, 0x13, 0xe8,
+ 0xf7, 0x6e, 0xfb, 0x76, 0xcb, 0xf7, 0x76, 0xf7,
+ 0x72, 0xc6, 0xfb, 0x72, 0xf7, 0x71, 0x4b, 0xfb,
+ 0x71, 0xfb, 0x6e, 0x6, 0xe, 0xfc, 0x21, 0xfb,
+ 0x33, 0x83, 0xa, 0xb2, 0x77, 0xa, 0x13, 0xe0,
+ 0xb6, 0xfb, 0x34, 0x15, 0x97, 0x77, 0x5, 0xc0,
+ 0xa9, 0xf7, 0x7, 0x3d, 0xa, 0x5d, 0x67, 0x6d,
+ 0x57, 0x4c, 0xb9, 0x7b, 0xa7, 0x1e, 0x13, 0xd0,
+ 0x9f, 0xa1, 0x92, 0x70, 0x53, 0x37, 0x50, 0x6f,
+ 0x78, 0x1f, 0xe, 0xfb, 0xce, 0xf7, 0x3f, 0xf7,
+ 0x8, 0x1, 0xb7, 0xf7, 0x3f, 0x15, 0xf7, 0x87,
+ 0xf7, 0x8, 0xfb, 0x87, 0x6, 0xe, 0xfc, 0x21,
+ 0x7e, 0x93, 0xa, 0xd2, 0x62, 0x1d, 0xfc, 0x5,
+ 0x8d, 0x76, 0xf9, 0x4b, 0x77, 0xae, 0x77, 0x12,
+ 0x13, 0xc0, 0x84, 0x78, 0x15, 0xd3, 0x6, 0x13,
+ 0xa0, 0xf7, 0x78, 0xf9, 0x5a, 0x5, 0x3b, 0x6,
+ 0xe, 0x7e, 0xa7, 0xf9, 0x19, 0xa7, 0x1, 0xa3,
+ 0xf7, 0x32, 0xf7, 0x1c, 0xf7, 0x32, 0x3, 0xf7,
+ 0x4a, 0xf7, 0x72, 0x15, 0xf7, 0x79, 0x7, 0xde,
+ 0x8b, 0xf7, 0x12, 0xce, 0xbb, 0xa0, 0x51, 0xfb,
+ 0x2b, 0x1e, 0xfb, 0x79, 0x7, 0x3c, 0x8f, 0xfb,
+ 0x14, 0x43, 0x57, 0x7b, 0xcb, 0xf7, 0x23, 0x1e,
+ 0xfb, 0x32, 0xf7, 0x2, 0x15, 0xfb, 0x5d, 0xed,
+ 0xfb, 0x24, 0xf7, 0x14, 0xf7, 0x20, 0xe1, 0xf7,
+ 0x39, 0xf7, 0x48, 0xf7, 0x84, 0xfb, 0xe, 0xf7,
+ 0x8, 0x22, 0x26, 0xfb, 0x10, 0x23, 0xfb, 0x90,
+ 0x1e, 0xe, 0x8b, 0xad, 0xf9, 0x22, 0x77, 0x1,
+ 0xf7, 0x4e, 0xf7, 0x28, 0x3, 0xcc, 0x16, 0xf8,
+ 0xd, 0xad, 0x6, 0x28, 0x82, 0xa6, 0xce, 0x1f,
+ 0xf8, 0xc4, 0x7a, 0x7, 0xfb, 0x90, 0xfb, 0x1,
+ 0x5, 0x71, 0x7, 0x98, 0xad, 0xad, 0x97, 0x99,
+ 0x1b, 0xb2, 0x8b, 0x5f, 0x72, 0x1f, 0xfc, 0xb,
+ 0x7, 0x4d, 0x86, 0x65, 0xfb, 0x8, 0x1e, 0xe,
+ 0x8b, 0xf7, 0x19, 0xf8, 0x8, 0x76, 0xe5, 0xf7,
+ 0x6, 0x1, 0xf7, 0xc0, 0xf7, 0x1c, 0x3, 0x9c,
+ 0x16, 0xf8, 0x34, 0x6, 0xb8, 0xf7, 0x67, 0x5,
+ 0x69, 0x6, 0x47, 0x6f, 0x82, 0x81, 0x21, 0x1b,
+ 0xfb, 0x21, 0x6, 0xf7, 0xa8, 0xf7, 0x9b, 0x8b,
+ 0xd7, 0xa8, 0x1a, 0xf7, 0x2c, 0xfb, 0xf, 0xae,
+ 0x4d, 0xfb, 0x21, 0x50, 0xfb, 0x27, 0x52, 0x77,
+ 0x1e, 0xa7, 0x6, 0xdf, 0xb0, 0xc9, 0x91, 0xa2,
+ 0x1b, 0xf2, 0x9b, 0x27, 0x6f, 0xfb, 0xa, 0xfb,
+ 0xd, 0xfb, 0x18, 0xfb, 0x36, 0xfb, 0x41, 0x1f,
+ 0xe, 0x7d, 0xbd, 0x59, 0xf7, 0x28, 0xf8, 0x6d,
+ 0xdc, 0x12, 0xf7, 0xf6, 0xf7, 0x6, 0x13, 0xb0,
+ 0xf7, 0x2d, 0xf7, 0xf8, 0x15, 0xd7, 0x71, 0xf7,
+ 0x11, 0x61, 0xfb, 0x19, 0x1a, 0x31, 0x57, 0x6e,
+ 0x5b, 0x6d, 0x74, 0xa2, 0xa3, 0x72, 0x1e, 0x13,
+ 0x70, 0xa4, 0x71, 0x6e, 0xa5, 0x60, 0x1b, 0x6b,
+ 0x6d, 0x74, 0x6a, 0x4c, 0xd2, 0x6e, 0xdb, 0xf7,
+ 0x48, 0xf7, 0xd, 0xf7, 0xe, 0xf7, 0x20, 0xd6,
+ 0x60, 0xd3, 0x3c, 0xa8, 0x1f, 0xb7, 0xa6, 0xb2,
+ 0xa4, 0xd8, 0x1a, 0xe8, 0x43, 0xb5, 0x2b, 0xfb,
+ 0xa, 0x3e, 0x31, 0x4c, 0x6e, 0x1e, 0xa0, 0x7f,
+ 0x5, 0xa3, 0x9a, 0xae, 0xc7, 0xd0, 0x1b, 0xd4,
+ 0xac, 0x5f, 0x50, 0x30, 0x39, 0x72, 0x5b, 0x7c,
+ 0x1f, 0xe, 0xa0, 0x76, 0xf7, 0x24, 0xf7, 0x3,
+ 0xf7, 0xcf, 0x76, 0xf7, 0x1f, 0x77, 0x1, 0xf7,
+ 0xa1, 0xf7, 0x23, 0x3, 0x9e, 0xf7, 0x24, 0x15,
+ 0xf7, 0x8c, 0xfb, 0x24, 0xf7, 0x25, 0xf7, 0x24,
+ 0xca, 0xf7, 0x3, 0x4c, 0xf8, 0x45, 0x31, 0x6,
+ 0x31, 0xfb, 0xe, 0xfb, 0x10, 0xfb, 0x3b, 0x32,
+ 0xfb, 0x22, 0x8, 0xb4, 0x89, 0x15, 0xf7, 0x63,
+ 0xf7, 0xba, 0x5, 0x8d, 0xfb, 0xba, 0x6, 0xe,
+ 0x83, 0xc8, 0x4e, 0xf7, 0x28, 0xf7, 0x53, 0xf7,
+ 0x1d, 0xdc, 0xf7, 0x13, 0x12, 0xf8, 0x9, 0xd9,
+ 0x13, 0xb8, 0xbe, 0xf7, 0xdf, 0x15, 0xd3, 0x86,
+ 0xd7, 0x86, 0xce, 0x6d, 0x8, 0xc0, 0x74, 0xc1,
+ 0x59, 0x4e, 0x1a, 0x39, 0x49, 0x75, 0x69, 0x6c,
+ 0x6d, 0xa0, 0xa0, 0x6d, 0x1e, 0x13, 0x78, 0xa1,
+ 0x6c, 0x6b, 0xa2, 0x68, 0x1b, 0x60, 0x78, 0x6b,
+ 0x6f, 0x52, 0xcd, 0x6c, 0xd8, 0xf7, 0x4a, 0xf3,
+ 0xf7, 0x2, 0xf7, 0x17, 0xed, 0x50, 0xca, 0x5e,
+ 0xa4, 0x1f, 0x48, 0xb1, 0x4d, 0x91, 0x30, 0x90,
+ 0xa1, 0xe6, 0x18, 0xf7, 0xaa, 0x6, 0xb6, 0xf7,
+ 0x13, 0x5, 0xfb, 0xd6, 0x6, 0xe, 0x7e, 0xa6,
+ 0xf7, 0xfe, 0xb8, 0xf7, 0x9f, 0x77, 0x1, 0xa7,
+ 0xf7, 0x31, 0xf7, 0x1e, 0xf7, 0x2c, 0x3, 0xf8,
+ 0x6a, 0xf9, 0x2a, 0x15, 0xa5, 0x7, 0xfb, 0xc0,
+ 0x6d, 0xfb, 0x22, 0xfb, 0x54, 0xfb, 0x4a, 0x1a,
+ 0xfb, 0x84, 0xf7, 0x1f, 0x52, 0xe5, 0xf7, 0x48,
+ 0xb1, 0xf7, 0x3e, 0xc1, 0xf7, 0x40, 0xfb, 0x4,
+ 0xb1, 0x46, 0x5b, 0x79, 0x84, 0x81, 0x73, 0x1e,
+ 0xb7, 0xf7, 0x4c, 0xf7, 0xe, 0xc1, 0xef, 0x9f,
+ 0x8, 0xfb, 0xa8, 0xfb, 0xbf, 0x15, 0x97, 0x96,
+ 0x9c, 0x8c, 0x9b, 0x1b, 0xd0, 0x9b, 0x3f, 0xfb,
+ 0x24, 0x3c, 0x8b, 0x4c, 0x4e, 0x4d, 0x7c, 0xc9,
+ 0xf7, 0x59, 0xac, 0x93, 0xc3, 0x8c, 0x8c, 0x1f,
+ 0xe, 0xa0, 0x76, 0xf8, 0x6f, 0x76, 0xe0, 0xf7,
+ 0x1d, 0x1, 0xf7, 0x27, 0x16, 0xea, 0x6, 0xf7,
+ 0x7f, 0xf9, 0x38, 0x5, 0xfc, 0x34, 0x6, 0x5f,
+ 0xfb, 0x72, 0x5, 0xae, 0x6, 0xe0, 0xa1, 0xbd,
+ 0x8b, 0xa5, 0x1b, 0xf7, 0x4f, 0x6, 0xe, 0x7e,
+ 0xab, 0xf9, 0x14, 0xa8, 0x12, 0xa7, 0xf7, 0xd,
+ 0xfb, 0x2, 0xf7, 0x15, 0xf7, 0x39, 0xf7, 0x1f,
+ 0xfb, 0x19, 0xf7, 0xb, 0x13, 0xd4, 0xf7, 0xbe,
+ 0xf8, 0x3a, 0x15, 0x81, 0x90, 0xfb, 0xc, 0xc5,
+ 0xe8, 0x1a, 0xb4, 0xb0, 0xb3, 0xbc, 0xd5, 0x96,
+ 0x44, 0x58, 0x4f, 0x79, 0x73, 0x74, 0x6c, 0x1e,
+ 0xfb, 0xc, 0x29, 0x15, 0x13, 0xe8, 0x48, 0x76,
+ 0x38, 0x64, 0xfb, 0x1, 0x1a, 0xfb, 0x2, 0xf0,
+ 0x51, 0xf7, 0x0, 0xf7, 0x23, 0xe7, 0xd9, 0xf7,
+ 0x11, 0xe8, 0x4b, 0xd1, 0x35, 0xbe, 0x1e, 0x13,
+ 0xd4, 0xc2, 0x9d, 0xdc, 0xa9, 0xe0, 0x1a, 0xc4,
+ 0x57, 0xe9, 0xfb, 0x2c, 0xfb, 0x34, 0x54, 0x36,
+ 0x2e, 0x38, 0xcb, 0x4e, 0xd6, 0x61, 0x1e, 0xa1,
+ 0x79, 0x15, 0x13, 0xe8, 0xcf, 0x5e, 0xcc, 0x60,
+ 0x39, 0x1a, 0x71, 0x84, 0x30, 0x32, 0x4a, 0x74,
+ 0xcd, 0xd3, 0xd4, 0xa0, 0xaa, 0xa9, 0xb8, 0x1e,
+ 0xe, 0x93, 0x76, 0xf7, 0x9f, 0xb8, 0xf7, 0xfe,
+ 0xa6, 0x1, 0xa5, 0xf7, 0x2c, 0xf7, 0x1e, 0xf7,
+ 0x31, 0x3, 0xaa, 0x7e, 0x15, 0xf7, 0xc0, 0xa9,
+ 0xf7, 0x22, 0xf7, 0x54, 0xf7, 0x4a, 0x1a, 0xf7,
+ 0x84, 0xfb, 0x1f, 0xc4, 0x31, 0xfb, 0x48, 0x65,
+ 0xfb, 0x3e, 0x55, 0xfb, 0x40, 0xf7, 0x4, 0x65,
+ 0xd0, 0xae, 0xa5, 0x8e, 0x9b, 0xaa, 0x1e, 0x58,
+ 0xfb, 0x51, 0xfb, 0x9, 0x58, 0x27, 0x77, 0x8,
+ 0xf7, 0xa8, 0xf7, 0xbf, 0x15, 0x83, 0x8a, 0x70,
+ 0x86, 0x7b, 0x1b, 0x46, 0x7b, 0xd7, 0xf7, 0x24,
+ 0xda, 0x90, 0xca, 0xc8, 0xc9, 0x95, 0x42, 0xfb,
+ 0x59, 0x74, 0x85, 0x63, 0x88, 0x7b, 0x1f, 0xe,
+ 0xfb, 0xce, 0x7e, 0xf7, 0x3a, 0xf7, 0x2f, 0xf7,
+ 0x38, 0x1, 0xdd, 0xf7, 0x3d, 0x3, 0xdd, 0xd2,
+ 0x63, 0x1d, 0xaf, 0x5c, 0x5b, 0x67, 0x66, 0x5e,
+ 0x1e, 0xf7, 0xd6, 0x4, 0x86, 0xa, 0xac, 0x5c,
+ 0x5b, 0x67, 0x69, 0x5e, 0x1e, 0xe, 0xfb, 0xce,
+ 0xfb, 0x33, 0x76, 0xf7, 0xe3, 0xf7, 0x2c, 0x8b,
+ 0xf7, 0x39, 0x12, 0xdd, 0xf7, 0x3d, 0x56, 0xcf,
+ 0x13, 0xe8, 0xe4, 0xfb, 0x32, 0x15, 0x96, 0x75,
+ 0x5, 0x33, 0x1d, 0x1e, 0x13, 0xf0, 0x5d, 0x67,
+ 0x6d, 0x57, 0x3c, 0xd2, 0x8b, 0x8e, 0x1f, 0x13,
+ 0xe8, 0xaf, 0x8d, 0x91, 0x80, 0x80, 0x1a, 0x53,
+ 0x3a, 0x52, 0x6f, 0x78, 0x1e, 0x13, 0xf0, 0x84,
+ 0xf8, 0xba, 0x15, 0x86, 0xa, 0xad, 0x5c, 0x5b,
+ 0x67, 0x68, 0x5e, 0x1e, 0xe, 0x95, 0xa, 0xf7,
+ 0x6b, 0x15, 0xf8, 0x90, 0xfb, 0x73, 0x5, 0xd4,
+ 0x7, 0xfc, 0x38, 0xf7, 0x53, 0xf8, 0x38, 0xf7,
+ 0x4d, 0x5, 0xd4, 0x7, 0xfc, 0x90, 0xfb, 0x73,
+ 0x5, 0xe, 0x3e, 0xf6, 0xdf, 0xf7, 0xe, 0xe1,
+ 0x47, 0xcf, 0x12, 0x13, 0xa0, 0xac, 0xf7, 0xdf,
+ 0x15, 0xf8, 0x8c, 0xcf, 0xfc, 0x8c, 0x6, 0xfb,
+ 0xb8, 0x4, 0xf8, 0x8c, 0x6, 0x13, 0xc0, 0xcc,
+ 0xfc, 0x8c, 0x7, 0xe, 0x95, 0xa, 0x83, 0x15,
+ 0xf8, 0x90, 0xf7, 0x73, 0x5, 0xd7, 0x7, 0xfc,
+ 0x90, 0xf7, 0x73, 0x5, 0x3f, 0x7, 0xf8, 0x37,
+ 0xfb, 0x4b, 0xfc, 0x37, 0xfb, 0x50, 0x5, 0xe,
+ 0x7e, 0xf7, 0x3d, 0xf8, 0x85, 0xaf, 0x12, 0xc4,
+ 0xf7, 0x17, 0x69, 0xf7, 0x3d, 0x70, 0xf7, 0x29,
+ 0x13, 0xe8, 0xf7, 0x73, 0xf7, 0x7b, 0x15, 0xa9,
+ 0x6, 0xe2, 0x9a, 0x90, 0xde, 0xbe, 0x1e, 0xc0,
+ 0xac, 0xb4, 0xbb, 0xcb, 0x1a, 0xf7, 0x33, 0xfb,
+ 0x37, 0x96, 0x6c, 0xfb, 0x38, 0x6d, 0x25, 0x62,
+ 0x68, 0x9e, 0x61, 0xbe, 0x9f, 0xb4, 0x97, 0xbf,
+ 0xa7, 0x7f, 0x97, 0x81, 0x96, 0x1e, 0x83, 0x93,
+ 0x84, 0x93, 0x98, 0x1a, 0xb0, 0xbd, 0x8e, 0x94,
+ 0xd9, 0x93, 0x2f, 0x61, 0x51, 0x7b, 0x65, 0x7a,
+ 0x6a, 0x1e, 0x71, 0x59, 0x6d, 0x65, 0x9b, 0x44,
+ 0x8, 0x13, 0xd0, 0x46, 0xfb, 0x34, 0x15, 0x5c,
+ 0xb0, 0x66, 0xbb, 0xb9, 0xb1, 0xaf, 0xbb, 0xb9,
+ 0x65, 0xb2, 0x5d, 0x5b, 0x66, 0x63, 0x5e, 0x1e,
+ 0xe, 0xf7, 0xaf, 0x6d, 0xb9, 0xf7, 0x13, 0xb0,
+ 0x66, 0xbb, 0xf7, 0xa2, 0xbb, 0xf7, 0x23, 0xb2,
+ 0x12, 0xeb, 0xe7, 0xf7, 0x25, 0xd8, 0xf8, 0x1,
+ 0xba, 0x13, 0xbf, 0xf8, 0x20, 0xf7, 0xac, 0x15,
+ 0xf7, 0xd, 0xe3, 0xd1, 0xbc, 0xa9, 0x99, 0x75,
+ 0x60, 0x1e, 0x13, 0xaf, 0xfb, 0x25, 0x7d, 0x4e,
+ 0x45, 0x5f, 0x1b, 0x69, 0x6f, 0xa8, 0xc7, 0x1f,
+ 0xf7, 0x23, 0x4b, 0x15, 0x7e, 0x8a, 0xa3, 0x4f,
+ 0xd0, 0x1b, 0xf7, 0xf, 0xcf, 0xf7, 0x1f, 0xf4,
+ 0xf7, 0x42, 0xfb, 0x28, 0xf7, 0x16, 0xfb, 0x52,
+ 0xfb, 0x5f, 0xfb, 0x41, 0xfb, 0x29, 0xfb, 0x72,
+ 0xfb, 0x1e, 0xf7, 0xa, 0xfb, 0x5d, 0xf7, 0xa1,
+ 0xdb, 0xd1, 0xa7, 0xab, 0xcd, 0x1f, 0x7e, 0xae,
+ 0x5, 0x70, 0x50, 0x55, 0x75, 0x30, 0x1b, 0xfb,
+ 0x41, 0xfb, 0xd, 0xf7, 0x25, 0xf7, 0x28, 0xf7,
+ 0x78, 0xf7, 0x1a, 0xf3, 0xf7, 0x2a, 0xf7, 0x4c,
+ 0xf6, 0xfb, 0x28, 0xfb, 0x9, 0x1f, 0x13, 0xdf,
+ 0x33, 0x59, 0xfb, 0xb, 0x3d, 0x60, 0x8f, 0xbc,
+ 0x9c, 0x8e, 0x1e, 0xcd, 0xf7, 0x98, 0x5, 0x44,
+ 0x6, 0x80, 0x63, 0x5, 0xa5, 0x7d, 0x80, 0xa6,
+ 0x5b, 0x1b, 0xfb, 0x1e, 0x4a, 0xfb, 0x36, 0x3e,
+ 0x1f, 0x13, 0x0, 0xfb, 0x4, 0xd1, 0x72, 0xa8,
+ 0x8c, 0x1e, 0xc8, 0x90, 0xba, 0xbd, 0x96, 0x9c,
+ 0x8, 0xe, 0x4b, 0x1d, 0x12, 0x94, 0xf7, 0x5f,
+ 0x65, 0x9a, 0x13, 0xf0, 0x94, 0x16, 0x3a, 0xa,
+ 0x13, 0xe8, 0x20, 0xa, 0x5, 0x13, 0xf0, 0x7f,
+ 0x6d, 0x88, 0x86, 0x55, 0x83, 0x8, 0x13, 0xe8,
+ 0x31, 0x1d, 0x9f, 0x8b, 0xb5, 0xf7, 0xc1, 0xa9,
+ 0xf7, 0x9b, 0xb3, 0x12, 0xf3, 0xf7, 0x34, 0xf7,
+ 0x30, 0xf7, 0x39, 0xfb, 0x1e, 0xf7, 0x40, 0x13,
+ 0xf4, 0xf7, 0x9c, 0xf7, 0xeb, 0x15, 0xa9, 0x6,
+ 0xcc, 0x88, 0xe3, 0x7c, 0xfb, 0x23, 0x1a, 0x4e,
+ 0x7e, 0x3c, 0xfb, 0x2, 0x61, 0x79, 0x9b, 0xb8,
+ 0x1e, 0xf7, 0xa2, 0x4, 0xf7, 0x63, 0x7, 0xa2,
+ 0x8c, 0x8c, 0xac, 0xbe, 0x1b, 0x13, 0xf8, 0xdc,
+ 0xa1, 0x59, 0x45, 0x25, 0x75, 0x62, 0xfb, 0x1a,
+ 0x1f, 0xfb, 0x8c, 0xfc, 0x9, 0x15, 0xf7, 0xd6,
+ 0x6, 0x13, 0xf4, 0xf7, 0x67, 0xd1, 0xed, 0xdf,
+ 0xf7, 0x6, 0x22, 0xc1, 0x37, 0x99, 0x1f, 0x8d,
+ 0x7, 0x13, 0xf8, 0xb5, 0x98, 0xf7, 0x5, 0xa5,
+ 0xf7, 0x3, 0x1a, 0xf7, 0x30, 0xfb, 0x60, 0x8f,
+ 0x53, 0x1e, 0xfb, 0xc9, 0x53, 0x1d, 0xfc, 0x71,
+ 0x7, 0x4e, 0x6b, 0x8a, 0x53, 0x8b, 0x1d, 0xd6,
+ 0x78, 0xbb, 0x7d, 0xa, 0xfb, 0x44, 0xf7, 0x45,
+ 0xf8, 0x2b, 0xae, 0x13, 0xe6, 0xf9, 0x25, 0xf7,
+ 0x2c, 0x15, 0x2e, 0x38, 0x38, 0x6d, 0x3d, 0x1b,
+ 0x13, 0xea, 0xfb, 0x28, 0x64, 0xf7, 0x46, 0xf7,
+ 0x11, 0xf7, 0x3d, 0xb4, 0xf7, 0x31, 0xf7, 0x26,
+ 0xf7, 0x6, 0xd3, 0xfb, 0x9, 0x34, 0xae, 0x1f,
+ 0xae, 0x6, 0x13, 0xd6, 0x6a, 0x1d, 0x83, 0x80,
+ 0x90, 0x92, 0x7c, 0x1f, 0x13, 0xe6, 0x99, 0x6c,
+ 0x5c, 0xa2, 0x4e, 0x1b, 0x13, 0xea, 0xfb, 0x66,
+ 0xfb, 0x2e, 0xfb, 0x30, 0xfb, 0x5f, 0xfb, 0x4f,
+ 0xf7, 0x17, 0xfb, 0x38, 0xf7, 0x7d, 0xf7, 0x14,
+ 0xd4, 0xca, 0xde, 0xd4, 0x1f, 0xe, 0x8a, 0x1d,
+ 0x68, 0xb8, 0xf8, 0xdf, 0xb7, 0x12, 0xec, 0xf7,
+ 0x36, 0xf7, 0x95, 0xf7, 0x42, 0x13, 0xb8, 0x99,
+ 0x16, 0xf7, 0xd0, 0x6, 0xf7, 0x90, 0xf7, 0x0,
+ 0xf7, 0x38, 0xf7, 0x4c, 0xf7, 0x2e, 0x30, 0xf7,
+ 0x42, 0x95, 0x1d, 0x87, 0xb7, 0x89, 0x4e, 0x1a,
+ 0xfc, 0x6d, 0x7, 0x66, 0x77, 0x6e, 0x4c, 0x1e,
+ 0xf7, 0x89, 0xcd, 0x15, 0xf8, 0x6d, 0x7, 0x8c,
+ 0x1d, 0xfb, 0x55, 0x30, 0x1f, 0x13, 0x78, 0x84,
+ 0xa, 0x1e, 0xe, 0x9f, 0x8b, 0xb4, 0xf7, 0xb4,
+ 0xad, 0xf7, 0xa1, 0xb7, 0x12, 0xf3, 0xf7, 0x36,
+ 0xf7, 0x36, 0xa5, 0xf7, 0x6, 0xa4, 0x17, 0x9b,
+ 0x16, 0x3c, 0xa, 0x7b, 0x29, 0x1b, 0x4a, 0x78,
+ 0x97, 0xb7, 0x1f, 0xf7, 0x7c, 0x7, 0xee, 0xbe,
+ 0x6d, 0xfb, 0x11, 0x97, 0x1f, 0xa5, 0xf7, 0xe6,
+ 0x71, 0x6, 0xfb, 0x10, 0x7c, 0x58, 0x72, 0x2b,
+ 0x1b, 0xf7, 0x63, 0x7, 0xb6, 0x9d, 0x9e, 0xc2,
+ 0xf7, 0x1b, 0xd2, 0x7c, 0xfb, 0x22, 0xa2, 0x1e,
+ 0xa4, 0xf7, 0x5d, 0xfc, 0xd5, 0x6, 0x13, 0x10,
+ 0x68, 0x7, 0xb9, 0x88, 0xb5, 0x89, 0x49, 0x1a,
+ 0xfc, 0x6d, 0x7, 0x4d, 0x6c, 0x91, 0x52, 0x8b,
+ 0x1d, 0x67, 0x8b, 0xae, 0xf7, 0xba, 0xad, 0xf7,
+ 0x19, 0x76, 0xc5, 0x76, 0xf7, 0xc, 0xb7, 0x1,
+ 0xf3, 0xf7, 0x36, 0xf7, 0x2d, 0xa4, 0xf7, 0x7,
+ 0xa3, 0x3, 0x9b, 0x16, 0xf7, 0xfc, 0xae, 0x6,
+ 0x45, 0x8e, 0x63, 0x83, 0xcd, 0x1a, 0xf7, 0x7d,
+ 0x7, 0xf7, 0x12, 0x9b, 0x42, 0x39, 0x96, 0x1f,
+ 0xa4, 0xf7, 0xe6, 0x72, 0x6, 0x3b, 0x7d, 0x7c,
+ 0x46, 0xfb, 0x10, 0x1b, 0xf7, 0x6d, 0x7, 0xb6,
+ 0x9d, 0x94, 0xc1, 0xf7, 0x40, 0xa6, 0x56, 0x23,
+ 0xa1, 0x1e, 0xa3, 0xf7, 0x5d, 0xfc, 0xcb, 0x68,
+ 0x6, 0xba, 0x88, 0xb4, 0x93, 0x49, 0x1a, 0xfc,
+ 0x78, 0x7, 0x4d, 0x6c, 0x92, 0x52, 0x8b, 0x1d,
+ 0xf7, 0x17, 0x78, 0xac, 0xf7, 0x82, 0xae, 0xf7,
+ 0x50, 0x76, 0xf7, 0x60, 0xac, 0x88, 0x77, 0x12,
+ 0xb0, 0xf7, 0x45, 0xf7, 0xbf, 0xf7, 0x30, 0x13,
+ 0xf6, 0xf8, 0x30, 0xf7, 0x90, 0x15, 0xd0, 0x87,
+ 0xab, 0x7d, 0x4b, 0x1a, 0x38, 0x7, 0x60, 0x7b,
+ 0x6d, 0x33, 0xfb, 0x51, 0x85, 0xf7, 0x8b, 0xd2,
+ 0xf7, 0x40, 0xb5, 0xf7, 0x2e, 0xf7, 0x25, 0xf7,
+ 0x6, 0xd3, 0xfb, 0x9, 0x34, 0xae, 0x1e, 0xae,
+ 0x6, 0x13, 0xee, 0x6a, 0x1d, 0x84, 0x81, 0x8f,
+ 0x90, 0x7f, 0x1f, 0x13, 0xf6, 0x99, 0x6c, 0x5b,
+ 0xa5, 0x4a, 0x1b, 0xfb, 0x6c, 0xfb, 0x28, 0xfb,
+ 0x36, 0xfb, 0x59, 0xfb, 0x42, 0xf7, 0xe, 0xfb,
+ 0x45, 0xf7, 0x8e, 0xe2, 0xf7, 0x11, 0xa7, 0xad,
+ 0xbb, 0x1f, 0xf7, 0x13, 0x7, 0xdd, 0xa3, 0x84,
+ 0xc9, 0x92, 0x1e, 0xae, 0xfb, 0xeb, 0x7, 0xe,
+ 0xf7, 0x17, 0xa0, 0x76, 0xf7, 0xda, 0xba, 0xf7,
+ 0xa0, 0xae, 0x1, 0xf5, 0xf7, 0x36, 0xf7, 0x85,
+ 0x7f, 0x1d, 0xa0, 0x16, 0xf7, 0xe5, 0xae, 0x6,
+ 0x56, 0x91, 0x66, 0x8f, 0xc8, 0x1a, 0xf7, 0x70,
+ 0xf7, 0x85, 0xfb, 0x70, 0x7, 0x4e, 0x66, 0x87,
+ 0x56, 0x85, 0x1e, 0x68, 0xf7, 0xe8, 0xae, 0x7,
+ 0x56, 0x92, 0x68, 0x8f, 0xc7, 0x1a, 0xf8, 0x64,
+ 0x7, 0xcc, 0xb8, 0x8e, 0xb6, 0x8e, 0x1e, 0xae,
+ 0xfb, 0xe8, 0x68, 0x7, 0xb7, 0x88, 0xb9, 0x89,
+ 0x49, 0x1a, 0xfb, 0x59, 0xfb, 0x85, 0xf7, 0x59,
+ 0x7, 0xcd, 0xb9, 0x8d, 0xb7, 0x8e, 0x1e, 0xae,
+ 0xfb, 0xe5, 0x68, 0x7, 0xb5, 0x87, 0xb6, 0x89,
+ 0x4a, 0x7e, 0xa, 0x50, 0x6b, 0x86, 0x56, 0x8b,
+ 0xa, 0x5c, 0xa, 0x27, 0xa, 0xe, 0x2b, 0xac,
+ 0xb7, 0xac, 0xf9, 0x7, 0xae, 0x1, 0x63, 0xf7,
+ 0x23, 0xf7, 0x11, 0x7f, 0x1d, 0xf7, 0x13, 0xf9,
+ 0x15, 0x15, 0xc4, 0x89, 0xb7, 0x7f, 0x47, 0x1a,
+ 0xfc, 0x5e, 0x7, 0x6c, 0x8b, 0x53, 0x4a, 0x6f,
+ 0x7b, 0x99, 0x9c, 0x9b, 0x94, 0x92, 0x93, 0x95,
+ 0x1e, 0x90, 0x92, 0x90, 0x94, 0x9b, 0x1a, 0xc2,
+ 0x59, 0x9f, 0x75, 0x6e, 0x61, 0x75, 0x54, 0x7a,
+ 0x95, 0xfb, 0x2, 0xf7, 0x2a, 0xf2, 0xf7, 0x10,
+ 0x9a, 0xf4, 0x1e, 0xf8, 0x5e, 0x7, 0xd0, 0xab,
+ 0x94, 0xc4, 0x8f, 0x1e, 0xae, 0xfb, 0xf4, 0x7,
+ 0xe, 0xf7, 0x17, 0x4e, 0x1d, 0x1, 0xf7, 0x9,
+ 0x7f, 0x1d, 0xa9, 0x16, 0xf7, 0xe5, 0xae, 0x6,
+ 0x56, 0x92, 0x68, 0x8f, 0xc7, 0x1a, 0xf7, 0x4e,
+ 0x7, 0xa6, 0xa4, 0xf7, 0x4a, 0xfb, 0x6d, 0xb5,
+ 0x59, 0x84, 0x7b, 0x31, 0x8c, 0x19, 0x68, 0xf7,
+ 0xe4, 0xae, 0x7, 0x77, 0x8c, 0x7d, 0x8d, 0x7c,
+ 0x9d, 0xfb, 0xc5, 0xf8, 0x4, 0x18, 0xf7, 0x3c,
+ 0xf7, 0x40, 0xbb, 0xb2, 0xf4, 0x91, 0x8, 0xae,
+ 0xfb, 0xb5, 0x68, 0x7, 0xf7, 0x0, 0x8a, 0x86,
+ 0x6a, 0x55, 0x55, 0xfb, 0x6d, 0xfb, 0x64, 0x18,
+ 0xf7, 0x6a, 0x7, 0xe1, 0xad, 0x83, 0xc2, 0x8f,
+ 0x1e, 0xae, 0xfb, 0xe6, 0x68, 0x7, 0xb9, 0x88,
+ 0xb4, 0x7e, 0x49, 0x1a, 0xfc, 0x59, 0x7, 0x4e,
+ 0x6b, 0x87, 0x54, 0x8b, 0x1d, 0x9f, 0x8b, 0xb4,
+ 0xf8, 0xec, 0x60, 0x1d, 0x42, 0x96, 0x1d, 0xf8,
+ 0x62, 0x7, 0xcf, 0xaa, 0x99, 0xd1, 0x1e, 0xae,
+ 0xfb, 0xf1, 0x68, 0x7, 0xb8, 0xb4, 0x7b, 0x49,
+ 0x1f, 0xfc, 0x62, 0x7, 0x4e, 0x61, 0x91, 0x5f,
+ 0x8b, 0xa, 0xf7, 0xbd, 0x8b, 0xae, 0xf8, 0xf3,
+ 0xae, 0x12, 0xb2, 0xf7, 0x17, 0x4a, 0xb5, 0xf8,
+ 0x8c, 0xf7, 0x2f, 0x13, 0xd8, 0x99, 0x16, 0xf7,
+ 0x7e, 0xae, 0x6, 0x38, 0x90, 0x79, 0x90, 0xd1,
+ 0x1a, 0xf8, 0x64, 0x8d, 0x7, 0x13, 0xe8, 0xf7,
+ 0x8e, 0xfc, 0xd7, 0x5, 0xa6, 0x6, 0xf7, 0x8e,
+ 0xf8, 0xe6, 0x5, 0x8d, 0xfc, 0x78, 0x6, 0x49,
+ 0x6e, 0x88, 0x4f, 0x85, 0x1e, 0x68, 0xf7, 0xe0,
+ 0xae, 0x7, 0x49, 0x94, 0x75, 0x7d, 0xdb, 0x1a,
+ 0xf8, 0x4b, 0x7, 0xe1, 0xab, 0x8d, 0xc3, 0x8f,
+ 0x1e, 0xae, 0xfb, 0x90, 0x7, 0x13, 0xd0, 0xfb,
+ 0x5c, 0xfc, 0x6c, 0xfb, 0x5c, 0xf8, 0x6c, 0x5,
+ 0xfb, 0x91, 0x68, 0x6, 0xd2, 0x86, 0x9d, 0x7d,
+ 0x57, 0x1a, 0xfc, 0x5b, 0x7, 0x51, 0x7e, 0x7c,
+ 0x3d, 0x8b, 0xa, 0xd6, 0x8e, 0x76, 0xb2, 0x76,
+ 0xf8, 0xb5, 0x76, 0xf7, 0x9, 0xae, 0x12, 0xf3,
+ 0xb7, 0xf8, 0x43, 0xb7, 0x13, 0x7c, 0x72, 0x1d,
+ 0x13, 0xbc, 0x37, 0xa, 0xe, 0x51, 0x1d, 0x1,
+ 0xae, 0xf7, 0x45, 0xf7, 0xf6, 0x48, 0xa, 0xfb,
+ 0x48, 0x78, 0xa, 0xfb, 0x7b, 0x3c, 0x1d, 0xf7,
+ 0x21, 0x5e, 0xa, 0xf7, 0x21, 0x5e, 0x1d, 0xfb,
+ 0x1d, 0xfb, 0x6e, 0x1e, 0xe, 0x67, 0xa0, 0x76,
+ 0xf7, 0xc3, 0xae, 0xf7, 0xb9, 0xb8, 0x1, 0xef,
+ 0xf7, 0x36, 0xf7, 0x3a, 0xf7, 0x40, 0x3, 0x9b,
+ 0x16, 0xf7, 0xe2, 0xae, 0x6, 0x46, 0x94, 0x78,
+ 0x83, 0xdc, 0x1a, 0xf7, 0x4e, 0x7, 0xf7, 0x3a,
+ 0xf7, 0x40, 0xb6, 0xf7, 0x23, 0xf7, 0x3d, 0xfb,
+ 0x4a, 0x9d, 0x3b, 0x1f, 0xfb, 0xd6, 0x68, 0x6,
+ 0xc0, 0x86, 0xaa, 0x86, 0x62, 0x1a, 0xfc, 0x6d,
+ 0x7, 0x31, 0x64, 0x93, 0x5e, 0x1e, 0xf7, 0x8a,
+ 0xf7, 0xc3, 0x15, 0xf7, 0x96, 0x7, 0xa1, 0x8c,
+ 0x98, 0x98, 0xad, 0x1b, 0xdd, 0xaf, 0x6f, 0xfb,
+ 0x6, 0xfb, 0x10, 0x5e, 0x6e, 0xfb, 0xd, 0x8d,
+ 0x1f, 0xe, 0xf7, 0x17, 0xfb, 0x44, 0xf7, 0x52,
+ 0x93, 0x1d, 0x5a, 0xa, 0xf7, 0xa5, 0x89, 0x15,
+ 0xfb, 0x1f, 0xf7, 0x5, 0xf5, 0x68, 0xe1, 0x1b,
+ 0xcd, 0xc1, 0x9f, 0x9a, 0xb1, 0x1f, 0x85, 0xa3,
+ 0x2d, 0x6d, 0x2f, 0xa4, 0x55, 0xf7, 0x8, 0x19,
+ 0xf7, 0x2b, 0xb2, 0xf1, 0xf7, 0x12, 0xf7, 0x42,
+ 0x1a, 0xf7, 0x6e, 0xfb, 0x35, 0xf7, 0x20, 0x5e,
+ 0x1d, 0xfb, 0x13, 0xfb, 0x7b, 0xfb, 0x14, 0xd8,
+ 0xfb, 0x33, 0xf7, 0x35, 0x5b, 0x1e, 0x4e, 0xf7,
+ 0xe3, 0x79, 0x1d, 0xf7, 0x47, 0x66, 0x1d, 0xfb,
+ 0x47, 0x78, 0xa, 0xfb, 0x7c, 0x65, 0x1d, 0xf7,
+ 0x7c, 0xe2, 0x1e, 0xe, 0xd6, 0xa0, 0x76, 0xf9,
+ 0xc, 0xb7, 0x68, 0xae, 0x12, 0xf7, 0x6, 0xf7,
+ 0x36, 0xf7, 0x4b, 0xf7, 0x3f, 0x13, 0xd8, 0xf7,
+ 0xa8, 0xf7, 0xed, 0x15, 0xf7, 0x89, 0x7, 0xaa,
+ 0x90, 0x8d, 0x96, 0xc2, 0x1b, 0xdb, 0xb4, 0x6a,
+ 0x26, 0xfb, 0x16, 0x57, 0x75, 0xfb, 0x17, 0x8a,
+ 0x1f, 0xfb, 0x8e, 0xfb, 0xed, 0x15, 0xf7, 0xe6,
+ 0xae, 0x6, 0x49, 0x94, 0x75, 0x8e, 0xdb, 0x1a,
+ 0xf7, 0x4e, 0xa6, 0x7, 0xf7, 0x63, 0xfb, 0xcd,
+ 0x5, 0xf7, 0x61, 0xae, 0x6, 0x7f, 0x77, 0x8c,
+ 0x9d, 0x7d, 0x1f, 0xfb, 0x58, 0xf7, 0xa7, 0x5,
+ 0xc1, 0x9c, 0xf2, 0xa8, 0xf7, 0xf, 0x1a, 0xf7,
+ 0x3c, 0xfb, 0x68, 0x95, 0x45, 0x1e, 0xfb, 0xd6,
+ 0x6, 0x13, 0xb8, 0x68, 0x7, 0xc4, 0x87, 0xaa,
+ 0x86, 0x60, 0x1a, 0xfc, 0x62, 0x7, 0x3a, 0x77,
+ 0x88, 0x47, 0x83, 0x1e, 0xe, 0x30, 0x78, 0xac,
+ 0xf9, 0x1a, 0xaa, 0x8c, 0x8e, 0xa, 0x13, 0xd8,
+ 0x7c, 0x1d, 0x97, 0x94, 0x1d, 0xc4, 0x1b, 0x47,
+ 0x1d, 0x13, 0xb8, 0x85, 0xa, 0x77, 0x75, 0x92,
+ 0x93, 0x73, 0x1f, 0x13, 0xd8, 0x94, 0x70, 0x6e,
+ 0x94, 0x6e, 0x46, 0x1d, 0xe, 0x9f, 0x8b, 0xae,
+ 0xf8, 0x61, 0x76, 0xf7, 0x3d, 0xab, 0x1, 0xf7,
+ 0x91, 0x7f, 0x1d, 0xf7, 0x30, 0x16, 0xf7, 0xf9,
+ 0xae, 0x6, 0x41, 0x90, 0x73, 0x8d, 0xe0, 0x1a,
+ 0xf8, 0x99, 0x7, 0xd0, 0x87, 0xf2, 0x86, 0x9f,
+ 0xfb, 0x34, 0x8, 0xa8, 0x6, 0x89, 0xf7, 0x5d,
+ 0x5, 0xfc, 0xef, 0xfb, 0x5d, 0xa8, 0x6, 0x9f,
+ 0xf7, 0x34, 0xf2, 0x90, 0xd1, 0x8f, 0x8, 0xfc,
+ 0x99, 0x7, 0x37, 0x73, 0x89, 0x42, 0x8b, 0x1d,
+ 0x6b, 0xa, 0x63, 0xa, 0x9b, 0xf9, 0x15, 0x15,
+ 0xc3, 0x85, 0xa5, 0x8c, 0x37, 0x1a, 0xfb, 0xdb,
+ 0x7, 0xfb, 0x4d, 0xf7, 0x1c, 0x50, 0xf7, 0x1c,
+ 0xf7, 0x26, 0xf6, 0xe6, 0xf7, 0x2d, 0x1e, 0xf7,
+ 0xdb, 0x7, 0xcd, 0xa2, 0x9a, 0x43, 0xa, 0x73,
+ 0x4e, 0x1a, 0xfb, 0xdb, 0x7, 0x4b, 0x89, 0xfb,
+ 0x17, 0xfb, 0x44, 0xfb, 0x24, 0x8b, 0xf7, 0x1e,
+ 0xc4, 0x1e, 0xf7, 0xdb, 0x7, 0xe3, 0xaa, 0x89,
+ 0xcd, 0x8e, 0x1e, 0xae, 0xfb, 0xe6, 0x7, 0xe,
+ 0xd6, 0x8e, 0x76, 0xf9, 0x27, 0xae, 0x1, 0xf7,
+ 0xf8, 0x79, 0x15, 0xa6, 0x6, 0xf7, 0x78, 0xf8,
+ 0xd5, 0xa1, 0xc3, 0x98, 0x9e, 0xc2, 0x92, 0x19,
+ 0xae, 0xfb, 0x69, 0x68, 0x7, 0xc4, 0x88, 0xa8,
+ 0x87, 0x64, 0x1a, 0xfb, 0x27, 0xfc, 0x18, 0x5,
+ 0xfb, 0x21, 0xf7, 0xe9, 0x77, 0xab, 0x9e, 0x1a,
+ 0xb1, 0xa2, 0x8b, 0xca, 0x8f, 0x1e, 0xae, 0xfb,
+ 0xe4, 0x68, 0x7, 0xb6, 0x84, 0x9a, 0x88, 0xa5,
+ 0x4f, 0x8, 0xe, 0xf7, 0xf5, 0x91, 0x76, 0xf8,
+ 0x7d, 0x76, 0xf7, 0x50, 0xae, 0x1, 0xf7, 0xc0,
+ 0x7c, 0x15, 0xa7, 0x6, 0xf7, 0x4a, 0xf8, 0x68,
+ 0x5, 0x92, 0x6, 0xf7, 0x3c, 0xfc, 0x68, 0x5,
+ 0xa6, 0x6, 0xf7, 0x5c, 0xf8, 0xe4, 0x97, 0xb0,
+ 0xa1, 0xa3, 0xae, 0x8e, 0x19, 0xae, 0xfb, 0x4a,
+ 0x68, 0x7, 0xad, 0x89, 0xae, 0x8a, 0x62, 0x1a,
+ 0xfb, 0xa, 0xfc, 0x8, 0x5, 0x89, 0x6, 0xfb,
+ 0x5, 0xf7, 0xf4, 0x83, 0x99, 0x97, 0x1a, 0xad,
+ 0xa8, 0x8c, 0xb6, 0x8e, 0x1e, 0xae, 0xfb, 0xcc,
+ 0x68, 0x7, 0xbb, 0x89, 0x96, 0x80, 0x98, 0x75,
+ 0xae, 0x35, 0x18, 0xfb, 0x9, 0xfb, 0xc5, 0x5,
+ 0x89, 0x6, 0xfb, 0xf, 0xf8, 0x8, 0x88, 0x8c,
+ 0x96, 0x1a, 0xb0, 0xa7, 0x8d, 0xaf, 0x8e, 0x1e,
+ 0xae, 0xfb, 0xba, 0x68, 0x7, 0xb5, 0x85, 0x95,
+ 0x81, 0x9c, 0x5b, 0x8, 0xe, 0xd6, 0x4e, 0x1d,
+ 0x1, 0x9b, 0xf9, 0x3f, 0x3, 0x9b, 0x16, 0xf7,
+ 0x8e, 0xae, 0x6, 0x68, 0x8e, 0x55, 0x8f, 0xae,
+ 0x1a, 0xf7, 0x20, 0xf7, 0x56, 0x5, 0xf7, 0x3,
+ 0xfb, 0x46, 0x96, 0x7b, 0x81, 0x1a, 0x70, 0x6f,
+ 0x89, 0x57, 0x88, 0x1e, 0x68, 0xf7, 0xe8, 0xae,
+ 0x7, 0x6f, 0x8d, 0x7b, 0x8d, 0x56, 0xdd, 0xfb,
+ 0x4a, 0xf7, 0xa5, 0x18, 0xf7, 0x32, 0xf7, 0x72,
+ 0x9e, 0x9c, 0xe6, 0x93, 0x8, 0xae, 0xfb, 0x8e,
+ 0x68, 0x7, 0xb7, 0x88, 0xa7, 0x8a, 0x6c, 0x1a,
+ 0x70, 0x8b, 0x95, 0xfb, 0x6, 0xfb, 0x32, 0x1e,
+ 0xfb, 0x1, 0xf7, 0x3c, 0x88, 0x87, 0x98, 0x1a,
+ 0xa8, 0x9f, 0x8b, 0xc6, 0x8f, 0x1e, 0xae, 0xfb,
+ 0xee, 0x68, 0x7, 0xb5, 0x89, 0x9c, 0x72, 0xa0,
+ 0x6c, 0xf7, 0x5a, 0xfb, 0xad, 0x18, 0xfb, 0x39,
+ 0xfb, 0x67, 0x62, 0x55, 0x5b, 0x8b, 0x72, 0x89,
+ 0x19, 0xe, 0xd6, 0x4e, 0x1d, 0x1, 0xf7, 0xaa,
+ 0xf7, 0x36, 0xf7, 0x1d, 0xf7, 0xe, 0x3, 0x69,
+ 0x1d, 0x8d, 0xde, 0x1a, 0xf7, 0x42, 0x66, 0xa,
+ 0xcf, 0x7f, 0x7a, 0x6e, 0xfb, 0x38, 0xfb, 0xa0,
+ 0x18, 0x42, 0x1d, 0xe, 0x8c, 0xa, 0x1, 0x39,
+ 0xa, 0xe, 0x91, 0x1d, 0xce, 0xf3, 0x3, 0xce,
+ 0xfb, 0x29, 0x15, 0xf7, 0x7e, 0xb6, 0x3b, 0x6,
+ 0x5a, 0x8a, 0xa0, 0xab, 0x1f, 0xf8, 0xfe, 0x7,
+ 0xc6, 0x96, 0x96, 0xc3, 0x1e, 0xca, 0xb6, 0xfb,
+ 0x7e, 0x6, 0xe, 0xfc, 0x5, 0xfb, 0xa, 0x76,
+ 0xf7, 0x21, 0x76, 0xf9, 0x5a, 0x77, 0x1, 0xf7,
+ 0x56, 0xfb, 0x1f, 0x15, 0xcf, 0x6, 0xfb, 0x4e,
+ 0xf9, 0xd2, 0x5, 0x44, 0x6, 0xe, 0x91, 0x1d,
+ 0xf7, 0x36, 0xf3, 0x3, 0xab, 0x21, 0x15, 0x60,
+ 0xf7, 0x7e, 0xf9, 0xcf, 0xfb, 0x7e, 0x60, 0xca,
+ 0x7, 0xc3, 0x96, 0x80, 0x50, 0x1f, 0xfc, 0xfe,
+ 0x7, 0x6a, 0x8b, 0x77, 0x59, 0x1e, 0xe, 0x49,
+ 0xf7, 0xe0, 0x76, 0xf8, 0x1, 0x77, 0x1, 0xd4,
+ 0xf7, 0xcb, 0x15, 0xe4, 0x6, 0xf7, 0x15, 0xf7,
+ 0xa0, 0xf7, 0x15, 0xfb, 0xa0, 0x5, 0xe4, 0x6,
+ 0xfb, 0x46, 0xf8, 0x1, 0x5, 0x3b, 0x6, 0xe,
+ 0xfb, 0x11, 0xbd, 0x1, 0x40, 0x4, 0x59, 0xf8,
+ 0x88, 0xbd, 0x7, 0xe, 0x90, 0xa, 0xf7, 0x52,
+ 0xf8, 0xa4, 0x26, 0xa, 0x7d, 0xd1, 0x5a, 0x50,
+ 0xa, 0x12, 0xa4, 0xf7, 0x26, 0xfb, 0x13, 0xf7,
+ 0x19, 0xf7, 0x8, 0xf7, 0x1e, 0x13, 0x66, 0xf7,
+ 0xba, 0xc3, 0x32, 0x1d, 0x13, 0x26, 0x31, 0xa,
+ 0x23, 0xb6, 0xfb, 0x3, 0xfb, 0x10, 0x5b, 0x3a,
+ 0x1d, 0x1e, 0xb2, 0x6d, 0x93, 0xa0, 0x1a, 0x13,
+ 0x5a, 0x9b, 0xac, 0x9f, 0xaf, 0xd5, 0x8f, 0x55,
+ 0x58, 0x1e, 0x53, 0x7, 0x44, 0x1d, 0x13, 0x8a,
+ 0x26, 0x1d, 0xe, 0x30, 0x7d, 0xab, 0x81, 0x76,
+ 0xf8, 0x44, 0xc1, 0xf7, 0x5f, 0x77, 0x12, 0xd3,
+ 0xf7, 0x1f, 0xf7, 0x37, 0xf7, 0x27, 0x13, 0x7c,
+ 0xd3, 0x7e, 0x15, 0x97, 0x6, 0xda, 0xc3, 0x5,
+ 0x13, 0xbc, 0x5e, 0xb9, 0xb2, 0x7f, 0xaa, 0x1b,
+ 0xf7, 0x39, 0xd8, 0xf7, 0x5, 0xf7, 0x13, 0xf7,
+ 0x17, 0x46, 0xf7, 0x8, 0xfb, 0xb, 0x46, 0x67,
+ 0x65, 0x79, 0x7a, 0x1f, 0xf7, 0x97, 0xfb, 0x56,
+ 0x69, 0x7, 0xaf, 0x84, 0x9e, 0x87, 0x5c, 0x1a,
+ 0x13, 0x7c, 0xf7, 0x1f, 0xfc, 0x7b, 0x15, 0xf7,
+ 0x9b, 0x7, 0xa1, 0x94, 0x9a, 0xb0, 0xb9, 0x1b,
+ 0xe2, 0x91, 0xfb, 0x1a, 0x50, 0x1f, 0x13, 0xbc,
+ 0xfb, 0x31, 0x68, 0x58, 0x4f, 0x54, 0x7e, 0xbe,
+ 0xa7, 0x1e, 0xe, 0xfb, 0x5f, 0x7d, 0xce, 0x86,
+ 0x1d, 0xf7, 0x12, 0xf7, 0x10, 0x13, 0xb8, 0xf8,
+ 0x30, 0xf7, 0x1, 0x15, 0x70, 0x73, 0x71, 0x6e,
+ 0x52, 0x1b, 0x3d, 0x4d, 0xb5, 0xf7, 0x20, 0x8c,
+ 0x1f, 0xf5, 0x8c, 0x91, 0xf0, 0xd9, 0x1b, 0x9a,
+ 0xa5, 0x82, 0x6d, 0x1f, 0x13, 0xd8, 0x8f, 0x1d,
+ 0x37, 0xb0, 0x44, 0x2d, 0xfb, 0x22, 0x62, 0xfb,
+ 0x59, 0xfb, 0x1f, 0xe1, 0xfb, 0x2, 0xf7, 0x14,
+ 0xda, 0xcd, 0xb3, 0xcc, 0xb9, 0x1e, 0xe, 0x30,
+ 0x7d, 0xc3, 0xf8, 0xb, 0xc3, 0xf7, 0x3d, 0xad,
+ 0x12, 0xa4, 0xf7, 0x28, 0xf7, 0x37, 0xf7, 0x1f,
+ 0x17, 0xf7, 0xe7, 0xbf, 0x15, 0x4a, 0x7, 0xc9,
+ 0x9c, 0x94, 0x8c, 0xf7, 0x10, 0x9a, 0x8, 0x13,
+ 0xf8, 0xac, 0x7, 0x52, 0x8d, 0x89, 0xa8, 0xa6,
+ 0x1a, 0xf8, 0xc9, 0xfb, 0x6b, 0x69, 0x7, 0xc2,
+ 0x87, 0xa0, 0x8a, 0x56, 0x1a, 0xfb, 0x41, 0x7,
+ 0xa5, 0x73, 0x69, 0xaf, 0x4f, 0x1b, 0x2d, 0x28,
+ 0x42, 0xfb, 0x42, 0xfb, 0x26, 0xe7, 0x2d, 0xde,
+ 0xd6, 0xa7, 0xa7, 0xb1, 0xaf, 0x1f, 0x13, 0xd8,
+ 0x88, 0xc7, 0x15, 0x80, 0x66, 0x50, 0x5d, 0x3b,
+ 0x8b, 0xf7, 0x12, 0xc5, 0xec, 0x99, 0xe9, 0xd2,
+ 0xc3, 0xa1, 0x4e, 0x8a, 0x1e, 0xe, 0x49, 0x1d,
+ 0x98, 0xa, 0x17, 0xf7, 0x38, 0xf7, 0xae, 0x15,
+ 0x13, 0xe0, 0xf7, 0x1e, 0xa9, 0xa1, 0xb0, 0xdb,
+ 0x7d, 0xfb, 0x6, 0x5d, 0x8c, 0x1e, 0xfb, 0x15,
+ 0x66, 0x15, 0xf7, 0x90, 0x6, 0x13, 0xf0, 0xc1,
+ 0x7b, 0xf7, 0x42, 0xfb, 0x42, 0x1e, 0x13, 0xd0,
+ 0x2b, 0x1d, 0xe, 0xfb, 0xce, 0x8b, 0xad, 0xf8,
+ 0x13, 0xb7, 0xcf, 0xf7, 0x36, 0x6c, 0xaa, 0x12,
+ 0xd2, 0xf7, 0x1f, 0x13, 0xd8, 0x99, 0x16, 0xf7,
+ 0xaa, 0xad, 0x6, 0x4a, 0x8d, 0x7a, 0x9a, 0xb6,
+ 0x1a, 0xf7, 0xd7, 0xe2, 0xb7, 0x34, 0xf7, 0xe,
+ 0x7, 0xa6, 0x86, 0xbd, 0xbb, 0x97, 0xa3, 0x88,
+ 0x7b, 0x1e, 0x7c, 0x75, 0x7b, 0x70, 0x1a, 0x13,
+ 0xe8, 0x77, 0x9c, 0x69, 0xb5, 0xb3, 0xa2, 0xa6,
+ 0xae, 0xd0, 0x40, 0xaa, 0x4e, 0xfb, 0x49, 0x8a,
+ 0xfb, 0x19, 0x2a, 0x1e, 0x52, 0x5f, 0xc4, 0xfb,
+ 0xd7, 0x6, 0x56, 0x74, 0x88, 0x69, 0x87, 0x1e,
+ 0xe, 0xfb, 0x62, 0xf7, 0x3a, 0xfb, 0x2d, 0xab,
+ 0xf7, 0x1, 0xf7, 0xb, 0xe2, 0xa7, 0xf7, 0x6c,
+ 0xc0, 0x82, 0xaa, 0x12, 0xa7, 0xe3, 0x3c, 0xf7,
+ 0x9, 0xfb, 0x9, 0xf7, 0x1d, 0xf7, 0x15, 0xf7,
+ 0x1b, 0x69, 0xda, 0x13, 0x7a, 0x20, 0xf7, 0xc,
+ 0x63, 0x15, 0x53, 0x86, 0x67, 0x71, 0x63, 0x1a,
+ 0x13, 0x79, 0x20, 0x53, 0xd5, 0x64, 0xf7, 0x10,
+ 0xf7, 0x11, 0xf7, 0x18, 0xa6, 0xf7, 0x10, 0xf7,
+ 0x3, 0xfb, 0x7, 0x95, 0x5a, 0x8c, 0x1e, 0x13,
+ 0x79, 0x40, 0xfb, 0x1f, 0x8d, 0x71, 0x8c, 0xad,
+ 0x1a, 0xa9, 0xb0, 0x9f, 0x9e, 0xec, 0x8b, 0x8b,
+ 0x94, 0xa8, 0x1e, 0xd3, 0xa2, 0xac, 0xc9, 0xc8,
+ 0x1a, 0xc7, 0x6d, 0x9e, 0x81, 0x95, 0x1e, 0x13,
+ 0x7a, 0x20, 0xdd, 0xc0, 0xfb, 0x17, 0x6, 0x13,
+ 0x94, 0xc0, 0x9b, 0x63, 0x67, 0x91, 0x67, 0x1b,
+ 0xfb, 0x1d, 0x49, 0x37, 0x3b, 0x43, 0xbb, 0x5a,
+ 0xd5, 0x70, 0x1f, 0x89, 0x7, 0x60, 0x7f, 0x41,
+ 0x64, 0x4c, 0x1a, 0x57, 0xac, 0x7c, 0xb8, 0x7b,
+ 0x1e, 0x13, 0x7a, 0x20, 0xaa, 0x7d, 0x15, 0xf7,
+ 0x41, 0x6, 0xbf, 0xa7, 0x7c, 0x67, 0x44, 0xfb,
+ 0x1e, 0x8b, 0x63, 0x7a, 0x2e, 0x8a, 0xcb, 0xa1,
+ 0x94, 0x9b, 0xa5, 0xa0, 0x1f, 0x13, 0x74, 0xc0,
+ 0xa2, 0xf7, 0xfd, 0x15, 0xca, 0x90, 0xd1, 0xc8,
+ 0xcd, 0x8b, 0x33, 0x5e, 0x52, 0x88, 0x45, 0x4c,
+ 0x50, 0x84, 0xc5, 0xd0, 0x1e, 0xe, 0x30, 0x82,
+ 0x1d, 0xf7, 0x5f, 0x77, 0x1, 0xbb, 0xf7, 0x1f,
+ 0xf7, 0x2c, 0x8a, 0xa, 0x9b, 0x41, 0xa, 0x8b,
+ 0xb3, 0x9c, 0x1f, 0x76, 0xa, 0x57, 0x60, 0x75,
+ 0x53, 0x5b, 0x1e, 0xf7, 0xad, 0xfb, 0x54, 0x69,
+ 0x7, 0xb2, 0x83, 0x99, 0x88, 0x5c, 0x1a, 0xfc,
+ 0x81, 0x7, 0x5a, 0x7a, 0x8a, 0x67, 0x8b, 0xa,
+ 0x5d, 0xa, 0x12, 0xb5, 0xf7, 0x2f, 0xfb, 0x1d,
+ 0xf7, 0x2f, 0xfb, 0x26, 0x84, 0x1d, 0x13, 0xc8,
+ 0x2d, 0xa, 0x13, 0xd0, 0xb7, 0xf8, 0xd7, 0x15,
+ 0x60, 0xab, 0x69, 0xb9, 0xb6, 0xad, 0xac, 0xb7,
+ 0xb6, 0x69, 0xae, 0x60, 0x5e, 0x6a, 0x67, 0x61,
+ 0x1e, 0xe, 0xfb, 0xce, 0xfb, 0x5f, 0xf7, 0x35,
+ 0xf8, 0xd6, 0xf7, 0x2f, 0x12, 0xea, 0xf7, 0x2c,
+ 0xfb, 0x27, 0xf7, 0x1f, 0x13, 0xd0, 0xc5, 0xf8,
+ 0x3f, 0x15, 0xae, 0x88, 0xa7, 0x8a, 0x54, 0x7e,
+ 0xa, 0x61, 0x83, 0x69, 0x63, 0x88, 0x6e, 0x8c,
+ 0x9b, 0x93, 0x92, 0x95, 0x91, 0x96, 0x1e, 0x90,
+ 0x94, 0x90, 0x95, 0x96, 0x1a, 0xa0, 0x79, 0xac,
+ 0x62, 0x61, 0x77, 0x6c, 0x6f, 0x41, 0xd6, 0x6f,
+ 0xc2, 0xf7, 0x4b, 0x8f, 0xf7, 0x28, 0xc4, 0x1e,
+ 0xf8, 0x5f, 0xfb, 0x5e, 0x7, 0x13, 0xe0, 0xbd,
+ 0xf7, 0x2c, 0x15, 0x60, 0xaa, 0x69, 0xb9, 0xb6,
+ 0xae, 0xac, 0xb7, 0xb6, 0x68, 0xae, 0x60, 0x5e,
+ 0x6b, 0x67, 0x61, 0x1e, 0xe, 0x30, 0x8b, 0xad,
+ 0xf8, 0x3f, 0x77, 0xf7, 0x7f, 0x77, 0x1, 0xd1,
+ 0x8a, 0xa, 0xa1, 0x16, 0x99, 0xa, 0x5b, 0x92,
+ 0x87, 0x94, 0xb7, 0x1a, 0xf3, 0x7, 0xa2, 0xa3,
+ 0x5, 0xf5, 0xfb, 0x1e, 0x98, 0x77, 0x80, 0x1a,
+ 0x7b, 0x6f, 0x88, 0x7d, 0x1e, 0x69, 0xf7, 0x7e,
+ 0xad, 0x7, 0x83, 0x84, 0x8c, 0x99, 0x81, 0x1f,
+ 0xfb, 0x56, 0xf7, 0x96, 0xa5, 0xaa, 0xc1, 0xb1,
+ 0xa1, 0x9d, 0x19, 0xa7, 0xa2, 0x9e, 0x8f, 0xb3,
+ 0x92, 0x8, 0xac, 0xfb, 0x6a, 0x6a, 0x7, 0xbb,
+ 0x84, 0x96, 0x89, 0x77, 0x1a, 0xfb, 0x29, 0xfb,
+ 0x2e, 0x5, 0xf8, 0x43, 0xfb, 0x4f, 0x69, 0x7,
+ 0xbb, 0x8b, 0x5c, 0x80, 0x1f, 0xfc, 0x7e, 0x7,
+ 0x73, 0x83, 0x67, 0x63, 0x1e, 0xe, 0xfc, 0x5,
+ 0x8b, 0xad, 0xf9, 0x16, 0x77, 0x12, 0xc1, 0xf7,
+ 0x1f, 0xfb, 0x12, 0x84, 0x1d, 0x13, 0xd0, 0x64,
+ 0x81, 0xaa, 0xa8, 0x1f, 0xf8, 0xda, 0x8d, 0xa,
+ 0xfc, 0x7e, 0x97, 0x1d, 0xf7, 0x4e, 0x82, 0x1d,
+ 0x4c, 0x76, 0xd3, 0x77, 0x12, 0xd2, 0xf7, 0x1f,
+ 0xf7, 0x1e, 0x53, 0xa, 0x14, 0xe, 0x13, 0xce,
+ 0x9b, 0x16, 0xf7, 0x84, 0xad, 0x6, 0x64, 0x8f,
+ 0x84, 0xa1, 0xaa, 0x1a, 0xf7, 0x95, 0x7, 0x93,
+ 0xb3, 0xbd, 0xb6, 0xc2, 0x8b, 0x58, 0x6b, 0x1e,
+ 0xfb, 0x7c, 0x7, 0x74, 0x8b, 0x6c, 0x5b, 0x88,
+ 0x1e, 0x69, 0xf7, 0x7e, 0xad, 0x7, 0x65, 0x8e,
+ 0x82, 0xa1, 0xab, 0x1a, 0xf7, 0x95, 0x7, 0x93,
+ 0xb5, 0xbd, 0xb5, 0xc1, 0x8b, 0x57, 0x6c, 0x1e,
+ 0xfb, 0x7c, 0x7, 0x73, 0x8b, 0x6c, 0x5a, 0x89,
+ 0x1e, 0x69, 0xf7, 0x82, 0xad, 0x7, 0x59, 0x8c,
+ 0x8b, 0xaa, 0xa4, 0x1a, 0xf7, 0x85, 0x7, 0xf7,
+ 0x2, 0x3c, 0xaa, 0x54, 0x51, 0x5e, 0x6f, 0x50,
+ 0x5e, 0x1e, 0xab, 0x7c, 0x72, 0xc2, 0x30, 0x1b,
+ 0x13, 0xbe, 0x37, 0x5f, 0x4f, 0x73, 0x7d, 0x1f,
+ 0x88, 0x1d, 0xa8, 0x87, 0xa5, 0x88, 0x57, 0x1a,
+ 0xfb, 0xa6, 0x7, 0x5a, 0x75, 0x86, 0x6a, 0x8b,
+ 0x1d, 0x30, 0x82, 0x1d, 0x4c, 0x76, 0xd3, 0x77,
+ 0x12, 0xcd, 0xf7, 0x1f, 0xfb, 0x17, 0x85, 0x1d,
+ 0x13, 0xca, 0xa0, 0x16, 0xf7, 0x85, 0xad, 0x6,
+ 0x13, 0xc6, 0x59, 0x1d, 0x1e, 0x13, 0xc9, 0xc1,
+ 0x8c, 0x54, 0x6f, 0x1f, 0x4f, 0xa, 0x8d, 0x8b,
+ 0xaa, 0xa3, 0x1a, 0x76, 0xa, 0x1e, 0x13, 0xba,
+ 0x36, 0x60, 0x4f, 0x73, 0x7d, 0x1f, 0x88, 0x1d,
+ 0x13, 0xc6, 0xb3, 0x85, 0x98, 0x83, 0x5e, 0x1a,
+ 0xfb, 0xa6, 0x7, 0x5a, 0x7a, 0x87, 0x67, 0x8b,
+ 0xa, 0x65, 0xa, 0x12, 0xa4, 0xf7, 0x27, 0xf7,
+ 0x25, 0xf7, 0x27, 0xfb, 0x1b, 0xf7, 0x27, 0x13,
+ 0xf0, 0xf7, 0x40, 0xf7, 0x7c, 0x78, 0x1d, 0xeb,
+ 0xd5, 0x1e, 0x13, 0xe8, 0xc8, 0x9c, 0x4d, 0x64,
+ 0xa, 0x39, 0x46, 0x3b, 0x8b, 0xf6, 0xf7, 0x0,
+ 0x1f, 0xfb, 0x27, 0x16, 0xfb, 0x16, 0xe2, 0xfb,
+ 0x8, 0x70, 0xa, 0xf6, 0x6f, 0xa, 0xf7, 0x0,
+ 0x70, 0x1d, 0xfb, 0x4, 0xfb, 0x15, 0x1e, 0xe,
+ 0x7c, 0xa, 0x7f, 0x77, 0x12, 0xd6, 0xf7, 0x1f,
+ 0xf7, 0xc, 0xf7, 0x28, 0x21, 0xf7, 0x28, 0x13,
+ 0xf6, 0x81, 0xa, 0x1e, 0x13, 0xf5, 0x90, 0x1d,
+ 0x54, 0x75, 0xc8, 0x8b, 0x1f, 0x7a, 0x1d, 0x89,
+ 0xc8, 0x58, 0xa, 0x7a, 0x1f, 0x89, 0x6, 0x13,
+ 0xee, 0xcd, 0xfb, 0x55, 0x69, 0x7, 0xb9, 0x85,
+ 0x95, 0x7c, 0x65, 0x1a, 0xfc, 0x75, 0x92, 0xa,
+ 0x30, 0xfb, 0x4c, 0x76, 0xf7, 0x53, 0xc1, 0xf8,
+ 0x25, 0xab, 0x1, 0xad, 0xf7, 0x26, 0xf7, 0x36,
+ 0x8a, 0xa, 0xf7, 0xea, 0xed, 0x15, 0x8d, 0x7a,
+ 0x51, 0x56, 0x1b, 0x49, 0x6f, 0xc7, 0xf7, 0x16,
+ 0xde, 0x91, 0xf7, 0x14, 0xde, 0xb9, 0xa6, 0x63,
+ 0x63, 0x1f, 0x42, 0xfc, 0xa7, 0x15, 0x68, 0xf7,
+ 0x9f, 0xad, 0x7, 0x67, 0x92, 0x78, 0x8e, 0xbb,
+ 0x1a, 0xf8, 0xde, 0x7c, 0x7, 0x3d, 0x52, 0x5,
+ 0xab, 0x67, 0x6c, 0xa4, 0x57, 0x1b, 0xfb, 0x2a,
+ 0x36, 0xfb, 0x11, 0xfb, 0xa, 0xfb, 0x3f, 0xe4,
+ 0x42, 0xef, 0xa8, 0xbc, 0x96, 0xb8, 0xb4, 0x1f,
+ 0xfb, 0x2f, 0x7, 0x5e, 0x79, 0x89, 0x54, 0x81,
+ 0x1e, 0xe, 0xfb, 0x5f, 0x8b, 0xad, 0xf7, 0xba,
+ 0xf7, 0x25, 0x45, 0x76, 0xa5, 0x76, 0xd5, 0x77,
+ 0x12, 0xde, 0xf7, 0x1f, 0x13, 0x9c, 0xa8, 0x16,
+ 0xf7, 0x9e, 0xad, 0x6, 0x4e, 0x8e, 0x7f, 0x92,
+ 0xbd, 0x1a, 0xf7, 0x5a, 0x7, 0xd4, 0xb7, 0xa1,
+ 0x9a, 0x9c, 0x93, 0x79, 0x7b, 0x98, 0x1e, 0x13,
+ 0xc4, 0x7e, 0x96, 0x99, 0x7f, 0xa5, 0x1b, 0xbd,
+ 0x99, 0xb4, 0xa5, 0xa3, 0x7c, 0xc1, 0x47, 0x1f,
+ 0x13, 0xac, 0x4a, 0x5e, 0x4f, 0x6c, 0x76, 0x1f,
+ 0x89, 0xda, 0xfb, 0x51, 0x73, 0x6, 0xa9, 0x87,
+ 0xa3, 0x86, 0x59, 0x1a, 0xfb, 0xb0, 0x7, 0x59,
+ 0x75, 0x87, 0x6b, 0x8b, 0x1d, 0xfb, 0x96, 0x7d,
+ 0xad, 0x7f, 0x76, 0xf7, 0xfc, 0x76, 0xf7, 0x6,
+ 0xac, 0x89, 0x77, 0x12, 0xa4, 0xef, 0xf7, 0x20,
+ 0xeb, 0x13, 0x76, 0xa4, 0x7e, 0x15, 0xae, 0x6,
+ 0x9f, 0x95, 0x91, 0x93, 0x96, 0x1b, 0x8d, 0x90,
+ 0x89, 0x88, 0x91, 0x1f, 0x13, 0xb6, 0x83, 0x9e,
+ 0xae, 0x7b, 0xb0, 0x1b, 0xe8, 0xd8, 0xc6, 0xea,
+ 0xdb, 0x52, 0xaf, 0x52, 0xa6, 0x1f, 0x4f, 0xa8,
+ 0x4d, 0x9e, 0xbf, 0x1a, 0xaa, 0xa4, 0xa5, 0xaf,
+ 0xc4, 0xb4, 0x60, 0x44, 0xa0, 0x1e, 0xae, 0x6,
+ 0x13, 0xae, 0xf7, 0x25, 0x6b, 0x7, 0x83, 0x88,
+ 0x87, 0x7f, 0x79, 0x1b, 0x83, 0x80, 0x8f, 0x90,
+ 0x7e, 0x1f, 0x13, 0xb6, 0x91, 0x7a, 0x75, 0x92,
+ 0x71, 0x1b, 0x2f, 0x46, 0x50, 0x33, 0x41, 0xc3,
+ 0x66, 0xc5, 0x6e, 0x1f, 0xc9, 0x6c, 0xcb, 0x76,
+ 0x5b, 0x1a, 0x6d, 0x73, 0x67, 0x59, 0xfb, 0x3,
+ 0x80, 0xf4, 0xa6, 0x85, 0x1e, 0x65, 0x6, 0xe,
+ 0xfb, 0xce, 0x7f, 0xd2, 0xf7, 0xfa, 0xb7, 0xf7,
+ 0x3d, 0x77, 0x12, 0xc0, 0xf7, 0x1f, 0xfb, 0xc,
+ 0xf7, 0x1f, 0x13, 0xf0, 0xf7, 0xc7, 0xf7, 0x3,
+ 0x15, 0x76, 0x80, 0x7a, 0x6c, 0x6e, 0x1b, 0x13,
+ 0xe8, 0x63, 0x8c, 0xa7, 0x9b, 0x1f, 0xf7, 0xce,
+ 0xe9, 0xb7, 0x2d, 0xf7, 0x3d, 0x72, 0x7, 0x47,
+ 0x2a, 0x5e, 0x5f, 0x56, 0x5e, 0x8, 0x70, 0xbf,
+ 0xfb, 0xce, 0x7, 0x76, 0x8c, 0x8f, 0x2d, 0xf7,
+ 0x0, 0x1b, 0xe5, 0xaf, 0xd0, 0xb6, 0xa0, 0x1f,
+ 0xe, 0x30, 0x7d, 0xcc, 0xf8, 0x2e, 0x77, 0x12,
+ 0xcc, 0x85, 0x1d, 0x13, 0xf0, 0x71, 0xa, 0x13,
+ 0xe8, 0x25, 0x1d, 0xe, 0x92, 0x76, 0xf8, 0x4d,
+ 0xad, 0x1, 0xa0, 0xf8, 0x64, 0x3, 0xf7, 0x85,
+ 0x7d, 0x15, 0xa5, 0x6, 0xf7, 0x34, 0xf8, 0x16,
+ 0x9f, 0xbd, 0x99, 0x8d, 0xa3, 0x8e, 0x19, 0x4d,
+ 0x1d, 0x38, 0xfb, 0x6d, 0x5, 0x33, 0xf7, 0x6c,
+ 0x8b, 0x8e, 0x8f, 0x1a, 0xa2, 0x9f, 0x8c, 0xac,
+ 0x8e, 0x48, 0x1d, 0xe, 0xd6, 0x92, 0x76, 0xf7,
+ 0xd8, 0x76, 0xf7, 0x40, 0x77, 0x1, 0xf8, 0xd0,
+ 0xf7, 0x1b, 0x3, 0xf7, 0x78, 0x7d, 0x15, 0xa3,
+ 0x6, 0xf7, 0xe, 0xf7, 0xc3, 0x5, 0x90, 0x6,
+ 0xef, 0xfb, 0xc3, 0x5, 0xa2, 0x6, 0xf7, 0x2f,
+ 0xf8, 0x1b, 0x9c, 0xb7, 0x99, 0x8d, 0x9e, 0x8f,
+ 0x19, 0xad, 0xfb, 0x1b, 0x69, 0x7, 0xa7, 0x88,
+ 0x9f, 0x89, 0x6b, 0x1a, 0x75, 0x58, 0xfb, 0x1,
+ 0x70, 0x3f, 0x1e, 0x89, 0x6, 0x79, 0xd9, 0x61,
+ 0xf7, 0xc, 0xa0, 0x1a, 0xa0, 0xa1, 0x8d, 0xa5,
+ 0x8d, 0x1e, 0xad, 0xfb, 0x7e, 0x69, 0x7, 0xa3,
+ 0x88, 0x96, 0x8b, 0x94, 0x76, 0x90, 0x7f, 0x91,
+ 0x81, 0x95, 0x69, 0x47, 0xfb, 0x3f, 0x18, 0x59,
+ 0xf7, 0x1a, 0x69, 0xcd, 0xa0, 0x1a, 0xa5, 0xa3,
+ 0x8d, 0x99, 0x8d, 0x1e, 0xad, 0xfb, 0x72, 0x69,
+ 0x7, 0xa5, 0x86, 0x90, 0x8e, 0xa5, 0x4a, 0x8,
+ 0xe, 0xa0, 0x76, 0xf8, 0x3f, 0xad, 0x1, 0x99,
+ 0xf8, 0x6a, 0x3, 0x99, 0x16, 0xf7, 0x3d, 0xad,
+ 0x6, 0x7a, 0x8c, 0x5b, 0x90, 0x9a, 0x9f, 0x8,
+ 0x9a, 0xa0, 0xcc, 0xe5, 0x8b, 0x1a, 0x8b, 0xc1,
+ 0x36, 0xa0, 0x6c, 0x1e, 0x94, 0x7e, 0x6b, 0x84,
+ 0x75, 0x8a, 0x8, 0x69, 0xf7, 0x85, 0xad, 0x7,
+ 0x7e, 0x8f, 0x83, 0x8e, 0x82, 0x98, 0xfb, 0x28,
+ 0xf7, 0x6e, 0x18, 0xf0, 0xf7, 0x8, 0x9d, 0xa2,
+ 0xa3, 0x97, 0xa7, 0x8f, 0x19, 0xad, 0xfb, 0x3c,
+ 0x69, 0x7, 0xb2, 0x88, 0x97, 0x8a, 0x76, 0x1a,
+ 0x7d, 0x8b, 0x95, 0x41, 0x2c, 0x1e, 0x7c, 0x9e,
+ 0x53, 0xcf, 0x9c, 0x1a, 0x9b, 0xa2, 0x8f, 0xa3,
+ 0x1e, 0xad, 0xfb, 0x8e, 0x69, 0x7, 0xa6, 0x87,
+ 0x93, 0x82, 0x9c, 0x71, 0xf7, 0x14, 0xfb, 0x4f,
+ 0x18, 0xfb, 0x17, 0xfb, 0x3f, 0x88, 0x94, 0x5f,
+ 0x86, 0x8, 0xe, 0xfb, 0x61, 0xf7, 0x23, 0xf8,
+ 0x9f, 0x77, 0x1, 0xf7, 0x80, 0x7e, 0x15, 0x79,
+ 0x56, 0x5, 0x75, 0x84, 0x2b, 0xa, 0xe, 0x87,
+ 0x1d, 0x1, 0xb1, 0xaf, 0x87, 0xa, 0x65, 0x8e,
+ 0x1d, 0x6b, 0x8b, 0x62, 0x8c, 0xf7, 0x7f, 0xf8,
+ 0x27, 0x18, 0xa5, 0xfc, 0xb, 0x7, 0x84, 0xfb,
+ 0x22, 0x5, 0xaf, 0x6, 0xa5, 0xf7, 0x1, 0xb0,
+ 0x8b, 0xf7, 0xa, 0x8c, 0xfb, 0x7e, 0xfc, 0x28,
+ 0x18, 0xe, 0x8d, 0x1d, 0xf7, 0x15, 0xf4, 0x3,
+ 0xa1, 0xf7, 0x99, 0x15, 0xe2, 0x78, 0x9f, 0x5e,
+ 0x49, 0x1a, 0xfb, 0x3f, 0x7, 0xfb, 0xd, 0xd9,
+ 0x7d, 0xf7, 0x19, 0x1e, 0x97, 0x7, 0x3a, 0x99,
+ 0x72, 0xb3, 0xd0, 0x1a, 0xf7, 0x3f, 0x7, 0xd2,
+ 0x7a, 0xb3, 0x2a, 0x9d, 0x1e, 0x8d, 0x7, 0xec,
+ 0x9d, 0x9c, 0xa5, 0xd2, 0x1a, 0xf7, 0x47, 0x7,
+ 0xd1, 0xa4, 0xb8, 0xdc, 0x9a, 0x1e, 0x97, 0x7,
+ 0xfb, 0x19, 0x3d, 0x77, 0xfb, 0xe, 0x1f, 0xfb,
+ 0x47, 0x7, 0x49, 0x77, 0x6c, 0x34, 0x78, 0x1e,
+ 0xe, 0xfc, 0x3f, 0xfb, 0x29, 0x76, 0xf7, 0x40,
+ 0x76, 0xf9, 0x5a, 0x77, 0x1, 0xcd, 0xe3, 0x3e,
+ 0xd0, 0x3, 0xd8, 0xfb, 0x3e, 0x15, 0xd0, 0xf9,
+ 0xf1, 0x46, 0x6, 0xe, 0x8d, 0x1d, 0xf7, 0x34,
+ 0xf4, 0x3, 0xc1, 0xfb, 0x37, 0x15, 0x7f, 0x7,
+ 0xf7, 0x19, 0xd9, 0x99, 0xf7, 0xe, 0x1f, 0xf7,
+ 0x3f, 0x7, 0xcd, 0x9f, 0xb8, 0xe2, 0x9e, 0x1e,
+ 0x34, 0x9e, 0x77, 0xaa, 0xcd, 0x1a, 0xf7, 0x47,
+ 0x7, 0xf7, 0xd, 0x3d, 0x9f, 0xfb, 0x19, 0x1e,
+ 0x7f, 0x7, 0xdc, 0x7d, 0xa4, 0x5d, 0x46, 0x1a,
+ 0xfb, 0x47, 0x7, 0x44, 0x9c, 0x71, 0xec, 0x79,
+ 0x1e, 0x89, 0x7, 0x2a, 0x79, 0x7a, 0x63, 0x44,
+ 0x1a, 0xfb, 0x3f, 0x7, 0x45, 0x72, 0x64, 0x3a,
+ 0x7c, 0x1e, 0xe, 0xfb, 0x13, 0xf7, 0x41, 0xf7,
+ 0x34, 0x1, 0xa8, 0xf8, 0x62, 0x3, 0xcc, 0xf7,
+ 0x41, 0x15, 0xae, 0x9b, 0xa3, 0xb0, 0xb7, 0x1b,
+ 0xb1, 0xaa, 0x7e, 0x7c, 0xa8, 0x1f, 0x78, 0xb1,
+ 0xae, 0x76, 0xb9, 0x1b, 0xc9, 0xac, 0xb7, 0xb5,
+ 0xa9, 0x1f, 0x67, 0xd1, 0x5, 0x68, 0x74, 0x72,
+ 0x66, 0x63, 0x1b, 0x6e, 0x68, 0x9b, 0x9b, 0x66,
+ 0x1f, 0x9d, 0x64, 0x63, 0x9d, 0x6a, 0x1b, 0x48,
+ 0x67, 0x5f, 0x61, 0x75, 0x1f, 0xe, 0xfb, 0xce,
+ 0xfb, 0x4a, 0x76, 0xf8, 0xab, 0xf7, 0x3d, 0x12,
+ 0xdd, 0xf7, 0x3d, 0x29, 0xa8, 0x13, 0xe0, 0xdd,
+ 0xf8, 0x35, 0x15, 0x5d, 0xb1, 0x64, 0xba, 0xbb,
+ 0xaf, 0xb3, 0xb8, 0xba, 0x67, 0xb0, 0x5b, 0x5c,
+ 0x65, 0x67, 0x5b, 0x1e, 0x13, 0xd0, 0xd2, 0xfb,
+ 0x37, 0x15, 0x84, 0x44, 0x83, 0x57, 0x82, 0x62,
+ 0x8, 0x75, 0x20, 0x73, 0x71, 0x4e, 0x1a, 0x4b,
+ 0xac, 0x68, 0xbe, 0xbf, 0xac, 0xae, 0xcb, 0xc8,
+ 0x73, 0xa4, 0x75, 0xf5, 0x1e, 0x82, 0xb4, 0x83,
+ 0xc0, 0x84, 0xd3, 0x8, 0xe, 0xfb, 0xb, 0x76,
+ 0xf7, 0x27, 0x76, 0xf7, 0xe3, 0x76, 0xf7, 0x22,
+ 0xaa, 0xf7, 0x7, 0x77, 0x1, 0xc0, 0xf7, 0x21,
+ 0xf7, 0x13, 0xf7, 0xf, 0x3, 0xf7, 0x75, 0xf7,
+ 0x14, 0x15, 0x77, 0xb1, 0x80, 0xbe, 0xc4, 0x1a,
+ 0xab, 0x90, 0xf7, 0x1c, 0xdb, 0x9c, 0xa4, 0x7f,
+ 0x6d, 0x1e, 0x88, 0x7, 0xfb, 0x53, 0xfc, 0xad,
+ 0x15, 0xb3, 0x6, 0xba, 0xf7, 0x19, 0x5, 0x86,
+ 0x9b, 0x9c, 0x89, 0x9d, 0x1b, 0xac, 0xe2, 0x8b,
+ 0xee, 0xd1, 0x1f, 0x79, 0x9d, 0x5, 0x74, 0x78,
+ 0x6f, 0x70, 0x4f, 0x1b, 0x6b, 0x70, 0x98, 0xa3,
+ 0x75, 0x1f, 0xdd, 0xf7, 0x7a, 0x5, 0x7d, 0x96,
+ 0x9c, 0x85, 0x9b, 0x1b, 0x8f, 0xc9, 0x8b, 0xcb,
+ 0xb4, 0x70, 0xa8, 0x67, 0x9d, 0x1f, 0xbb, 0xf7,
+ 0x1c, 0x5, 0x63, 0x6, 0x5f, 0xfb, 0xf, 0x5,
+ 0x90, 0x78, 0x77, 0x8e, 0x78, 0x1b, 0xfb, 0x2,
+ 0xfb, 0x10, 0x39, 0xfb, 0x3b, 0xfb, 0x7, 0xc3,
+ 0x42, 0xd3, 0x6c, 0x1f, 0xe, 0x7d, 0xaa, 0x6c,
+ 0xf7, 0x12, 0x23, 0x76, 0xf7, 0x17, 0xb9, 0xf7,
+ 0x24, 0xcc, 0xf7, 0x12, 0xf7, 0x4d, 0x6d, 0xa9,
+ 0x12, 0xa0, 0xab, 0xbf, 0xf7, 0x12, 0x13, 0x5b,
+ 0x80, 0xf7, 0x71, 0xbc, 0x15, 0x54, 0xc6, 0xad,
+ 0x83, 0xaa, 0x1b, 0xf7, 0x7, 0x96, 0xf7, 0xf,
+ 0xd5, 0x91, 0x1f, 0x74, 0x6, 0x60, 0x80, 0x7b,
+ 0x6f, 0x3f, 0x1b, 0x7f, 0x6c, 0x8d, 0x9f, 0x58,
+ 0x1f, 0xa2, 0xc6, 0x8a, 0xc5, 0x87, 0xc4, 0x8,
+ 0xf7, 0x1, 0xcc, 0xfb, 0x6, 0x6, 0x87, 0x9a,
+ 0x68, 0xf7, 0x3f, 0xa3, 0x1a, 0xac, 0x96, 0xb1,
+ 0xb8, 0xb7, 0x8b, 0x69, 0x7f, 0x1e, 0x13, 0x3d,
+ 0x80, 0x37, 0x89, 0xa4, 0x72, 0xad, 0x1b, 0xbf,
+ 0x9e, 0xad, 0xb1, 0x97, 0x8b, 0xf0, 0xfb, 0x2e,
+ 0xfb, 0x2d, 0x5c, 0xfb, 0xa, 0x3c, 0x65, 0x92,
+ 0x65, 0x92, 0x65, 0x1f, 0x3b, 0x4a, 0x6, 0x13,
+ 0x39, 0x0, 0xed, 0x6, 0x9b, 0x5d, 0xa3, 0x51,
+ 0x8c, 0x5c, 0x8, 0x8f, 0x7c, 0x80, 0x8e, 0x71,
+ 0x1b, 0x26, 0x87, 0x46, 0x70, 0x43, 0xcc, 0x82,
+ 0x9d, 0xd2, 0xa9, 0xb4, 0xa0, 0x9b, 0x1f, 0x63,
+ 0xb0, 0x15, 0x13, 0x9d, 0x80, 0x71, 0x84, 0x7e,
+ 0x60, 0x55, 0x1b, 0x7a, 0x66, 0x94, 0xb3, 0x99,
+ 0x93, 0xb1, 0xb8, 0xb2, 0x9e, 0x7a, 0x7c, 0x9c,
+ 0x1f, 0xe, 0xf7, 0x38, 0xd4, 0xf7, 0x5b, 0xd6,
+ 0x1, 0xd8, 0xe3, 0xf7, 0x31, 0xe3, 0x3, 0xf7,
+ 0x1c, 0xf7, 0xe6, 0x15, 0xca, 0xbb, 0xbf, 0xcc,
+ 0xce, 0xbb, 0x57, 0x4c, 0x4a, 0x5b, 0x52, 0x48,
+ 0x4a, 0x5b, 0xc4, 0xcc, 0x1e, 0x39, 0xfb, 0x8d,
+ 0x15, 0xe1, 0xe3, 0x5, 0x78, 0xa7, 0xb3, 0x7c,
+ 0xb4, 0x1b, 0xb6, 0xb3, 0x9a, 0x9e, 0xa7, 0x1f,
+ 0xe1, 0x33, 0xbf, 0xbf, 0x33, 0xe3, 0x5, 0xa0,
+ 0xa5, 0x97, 0xb3, 0xb6, 0x1a, 0xb6, 0x7d, 0xb1,
+ 0x78, 0xa7, 0x1e, 0xe3, 0xe3, 0x57, 0xbd, 0x35,
+ 0x35, 0x5, 0x9e, 0x6f, 0x65, 0x95, 0x5e, 0x1b,
+ 0x62, 0x63, 0x81, 0x78, 0x6f, 0x1f, 0x35, 0xe1,
+ 0x57, 0x59, 0xe3, 0x33, 0x5, 0x78, 0x71, 0x7c,
+ 0x63, 0x60, 0x1a, 0x60, 0x98, 0x65, 0xa0, 0x6f,
+ 0x1e, 0x33, 0x33, 0x5, 0xe, 0x8b, 0xae, 0xf7,
+ 0xb, 0xbd, 0xe8, 0xbd, 0xf7, 0xb9, 0xaf, 0x1,
+ 0xf7, 0x4d, 0xf7, 0x16, 0xe0, 0xf7, 0x13, 0x3,
+ 0xde, 0x16, 0xf7, 0xdf, 0xae, 0x6, 0x4b, 0x91,
+ 0x68, 0x8d, 0xdd, 0x1a, 0xb2, 0xf7, 0x1b, 0xbd,
+ 0xfb, 0x1b, 0xce, 0x7, 0x8f, 0x96, 0x5, 0xf7,
+ 0x17, 0xbd, 0xfb, 0x3, 0x6, 0xf7, 0x10, 0xf7,
+ 0x99, 0x9c, 0xac, 0xaa, 0x8d, 0x9b, 0x8d, 0x19,
+ 0xaf, 0xfb, 0x61, 0x67, 0x7, 0xb5, 0x89, 0xaf,
+ 0x8a, 0x64, 0x1a, 0x21, 0xfb, 0x92, 0x5, 0x89,
+ 0x6, 0x55, 0xf7, 0x2, 0x51, 0xf7, 0x14, 0xa5,
+ 0x1a, 0xa3, 0x9d, 0x93, 0xc6, 0x1e, 0xaf, 0xfb,
+ 0xc1, 0x67, 0x7, 0xb8, 0x89, 0xa3, 0x74, 0x99,
+ 0x6f, 0xf7, 0x2, 0xfb, 0x89, 0x18, 0x28, 0x59,
+ 0xf7, 0x10, 0x6, 0x96, 0x76, 0x5, 0x52, 0xfb,
+ 0x1b, 0x59, 0xf7, 0x1b, 0x64, 0x7, 0x39, 0x66,
+ 0x89, 0x4a, 0x8b, 0x1d, 0xfc, 0x3f, 0x8d, 0x76,
+ 0xf8, 0x5d, 0x76, 0xf7, 0xa6, 0x77, 0x1, 0xcd,
+ 0xe3, 0x3e, 0xce, 0x3, 0xd8, 0xf8, 0x35, 0x15,
+ 0xcd, 0xf7, 0xa6, 0x49, 0x6, 0xfd, 0x5a, 0x4,
+ 0xce, 0xf7, 0xae, 0x48, 0x6, 0xe, 0xfb, 0xf,
+ 0xa2, 0xf7, 0x93, 0xa4, 0xf7, 0x2d, 0x77, 0xea,
+ 0xa2, 0xf7, 0x6a, 0x77, 0x12, 0xb3, 0xd6, 0x56,
+ 0xd6, 0x5c, 0xf7, 0x14, 0xf7, 0x0, 0xe0, 0x13,
+ 0x8c, 0x80, 0xf7, 0xc5, 0xf7, 0x24, 0x15, 0xb8,
+ 0x8c, 0xe8, 0x8e, 0xf7, 0x6, 0xf7, 0x38, 0xfb,
+ 0xa2, 0xdc, 0xe4, 0x1a, 0xb9, 0xa7, 0xa5, 0xb4,
+ 0xb9, 0xa1, 0x7d, 0x84, 0x84, 0x80, 0x82, 0x80,
+ 0x81, 0x1e, 0x81, 0x82, 0x81, 0x7f, 0x7c, 0x1a,
+ 0x71, 0xa8, 0x6c, 0xac, 0x9a, 0xbb, 0x9a, 0xbf,
+ 0xa6, 0x67, 0xd0, 0xfb, 0x7, 0x1e, 0x13, 0xfc,
+ 0x80, 0x3f, 0x48, 0x59, 0x38, 0x51, 0xbb, 0x64,
+ 0xbd, 0x5f, 0x1f, 0x89, 0x89, 0x5, 0x13, 0xea,
+ 0x80, 0x62, 0x8e, 0x2a, 0x87, 0xfb, 0xf, 0x1a,
+ 0x3d, 0xb9, 0x6b, 0xf7, 0xe, 0x24, 0x1e, 0xd8,
+ 0x4d, 0x9c, 0x7c, 0x62, 0x1a, 0x65, 0x71, 0x6c,
+ 0x53, 0x51, 0x84, 0xa2, 0x91, 0x91, 0x94, 0x90,
+ 0x94, 0x91, 0x1e, 0x98, 0x93, 0x9a, 0x95, 0xa2,
+ 0x1a, 0x13, 0xf9, 0x80, 0xa1, 0x75, 0xac, 0x5f,
+ 0x5c, 0x7c, 0x5e, 0x79, 0x46, 0xe0, 0x6a, 0xc9,
+ 0x1e, 0x13, 0xfa, 0x80, 0xf6, 0xc7, 0xc6, 0xd0,
+ 0xc8, 0x61, 0xba, 0x52, 0xb1, 0x1f, 0xfb, 0x41,
+ 0xf7, 0x57, 0x15, 0xb8, 0xb1, 0x95, 0x9d, 0x1e,
+ 0x13, 0x8c, 0x80, 0xba, 0xe2, 0x33, 0x89, 0x8d,
+ 0x1f, 0xb1, 0x64, 0x90, 0x80, 0x70, 0x1a, 0x72,
+ 0x7d, 0x6a, 0x62, 0x6b, 0x6c, 0xa4, 0xa3, 0x6f,
+ 0x1e, 0x48, 0xc3, 0x75, 0x9f, 0xb8, 0x1a, 0xe,
+ 0xfb, 0xce, 0xf8, 0xad, 0xf7, 0x16, 0x1, 0x89,
+ 0x3f, 0xa, 0xe, 0xef, 0x78, 0xbf, 0xf7, 0x5,
+ 0xa2, 0xf7, 0xb0, 0x76, 0xe0, 0xa2, 0xf6, 0xbf,
+ 0x1, 0xae, 0xd2, 0xf7, 0x7, 0xf1, 0xf7, 0x4a,
+ 0x9e, 0xf7, 0x12, 0xd2, 0x3, 0x71, 0x1d, 0xf7,
+ 0x30, 0xf7, 0x5a, 0xf7, 0x5b, 0xfb, 0x29, 0xf7,
+ 0x31, 0x55, 0xa, 0xfb, 0x1f, 0xfb, 0x39, 0xfb,
+ 0x38, 0xfb, 0xc, 0xfb, 0x1e, 0x80, 0x1d, 0xf8,
+ 0x40, 0x3c, 0x15, 0x58, 0x74, 0x64, 0x63, 0x4f,
+ 0x1b, 0x2e, 0x6a, 0xd7, 0xf4, 0x8c, 0x1f, 0xef,
+ 0x8c, 0xb2, 0xd6, 0xdd, 0x1b, 0xd2, 0xa6, 0x5c,
+ 0x61, 0x95, 0x1f, 0x9e, 0xd3, 0x6, 0x94, 0x85,
+ 0x92, 0x7b, 0x90, 0x1e, 0x94, 0x70, 0x71, 0x95,
+ 0x57, 0x1b, 0xfb, 0x3b, 0x52, 0xfb, 0x5, 0x36,
+ 0xfb, 0x1e, 0xef, 0x49, 0xf7, 0x13, 0xba, 0xaa,
+ 0x99, 0x8f, 0x9e, 0x1f, 0x9c, 0x92, 0x95, 0x8e,
+ 0x8c, 0x97, 0x9b, 0xd5, 0x18, 0xe, 0xfb, 0xef,
+ 0xf8, 0x36, 0x76, 0xf7, 0xa0, 0xa2, 0x12, 0x8a,
+ 0xed, 0x36, 0xe0, 0xd6, 0xeb, 0x13, 0xd8, 0xf7,
+ 0x43, 0xf8, 0x4a, 0x15, 0x7b, 0x8f, 0x90, 0x72,
+ 0xb9, 0x1b, 0xa8, 0xa3, 0x99, 0x9f, 0x9d, 0x1f,
+ 0x81, 0x97, 0x5, 0x7a, 0x7a, 0x85, 0x9f, 0x8f,
+ 0x1a, 0xf7, 0x30, 0x7, 0xc4, 0x51, 0xa4, 0x43,
+ 0x36, 0x62, 0x67, 0x65, 0x62, 0xaf, 0x8b, 0x92,
+ 0xb0, 0x95, 0xa2, 0x96, 0x1e, 0x9e, 0x77, 0x90,
+ 0x98, 0x1a, 0x94, 0x9a, 0x97, 0xa3, 0xb8, 0x92,
+ 0x6b, 0x6d, 0x1e, 0x6d, 0x7, 0x13, 0xe8, 0x31,
+ 0x74, 0x37, 0x73, 0x4d, 0x1a, 0x13, 0xa8, 0x5a,
+ 0xb4, 0x79, 0xab, 0x9a, 0xb9, 0x8d, 0xb2, 0xb5,
+ 0x1e, 0x88, 0xa6, 0x15, 0x81, 0x84, 0x7c, 0x7b,
+ 0x75, 0x1b, 0x76, 0x81, 0xa1, 0x9d, 0xbf, 0xcb,
+ 0x9d, 0x96, 0x8e, 0x1f, 0xe, 0x82, 0xa, 0x1,
+ 0xf7, 0x6f, 0xf7, 0x92, 0x3, 0xa2, 0xf7, 0x75,
+ 0x88, 0xa, 0x82, 0x95, 0x9b, 0x7d, 0x96, 0x1b,
+ 0x91, 0x90, 0x8f, 0x99, 0x77, 0x1d, 0xe1, 0xf6,
+ 0xa8, 0x1a, 0x95, 0x88, 0x7b, 0x1d, 0xf7, 0x58,
+ 0x87, 0x88, 0xa, 0x82, 0x95, 0x9c, 0x7d, 0x96,
+ 0x1b, 0x91, 0x8f, 0x75, 0xa, 0x95, 0x86, 0x7b,
+ 0x1d, 0xe, 0x3e, 0xf7, 0x15, 0x76, 0xf7, 0x73,
+ 0xcf, 0x12, 0xf8, 0x54, 0xe6, 0x44, 0xd0, 0x13,
+ 0xe0, 0xac, 0xf7, 0xdf, 0x15, 0x13, 0xd0, 0xf8,
+ 0x47, 0xfb, 0x73, 0xd0, 0xf7, 0xb7, 0xfc, 0x8c,
+ 0x6, 0xe, 0xef, 0x78, 0xbf, 0x57, 0xf7, 0x52,
+ 0x7e, 0xf7, 0x51, 0x85, 0x76, 0xf7, 0xef, 0xbf,
+ 0x12, 0xa5, 0xd2, 0xf7, 0x3e, 0xdb, 0xe4, 0xe0,
+ 0xf7, 0x15, 0xd2, 0x13, 0xaf, 0x80, 0x71, 0x1d,
+ 0xf7, 0x34, 0xf7, 0x5a, 0xf7, 0x5b, 0xfb, 0x29,
+ 0xf7, 0x2d, 0x55, 0xa, 0xfb, 0x1b, 0xfb, 0x39,
+ 0xfb, 0x38, 0xfb, 0xc, 0xfb, 0x22, 0x80, 0x1d,
+ 0xf7, 0x2, 0xfb, 0x4a, 0x15, 0xf7, 0x40, 0x6,
+ 0x13, 0x5f, 0x80, 0x9d, 0x7, 0x5c, 0x8e, 0x8c,
+ 0x8f, 0xb0, 0x1a, 0xf4, 0xb0, 0x7, 0x13, 0xaf,
+ 0x80, 0x3a, 0xc0, 0xc9, 0x35, 0x88, 0x1b, 0xdc,
+ 0x96, 0x6, 0xfb, 0x14, 0xf7, 0x3b, 0x5, 0xbb,
+ 0x9b, 0xab, 0xb0, 0xba, 0x1a, 0xcf, 0x56, 0xac,
+ 0x4d, 0x1e, 0xfb, 0x55, 0x79, 0x6, 0xba, 0x89,
+ 0x8a, 0x87, 0x65, 0x1a, 0xfb, 0x93, 0x7, 0x13,
+ 0x5f, 0x80, 0x66, 0x8c, 0x87, 0x5c, 0x88, 0x1e,
+ 0x13, 0xaf, 0x80, 0xf7, 0x12, 0xf7, 0x3f, 0x15,
+ 0xf7, 0x3c, 0xaf, 0x7, 0xaf, 0xa4, 0x77, 0x50,
+ 0x5d, 0x7c, 0x60, 0x5c, 0x1f, 0xe, 0xfb, 0xce,
+ 0xf8, 0xc9, 0xd3, 0x1, 0x8c, 0xf8, 0xc9, 0x15,
+ 0xf7, 0xde, 0xd3, 0xfb, 0xde, 0x6, 0xe, 0xfb,
+ 0x8b, 0xf8, 0x26, 0xaf, 0xf7, 0x6a, 0xaf, 0x1,
+ 0xbb, 0xb4, 0xf7, 0x69, 0xb4, 0x3, 0xed, 0xf8,
+ 0xb5, 0x15, 0xc4, 0xb8, 0xbd, 0xc4, 0xc4, 0xb8,
+ 0x59, 0x52, 0x52, 0x5e, 0x59, 0x52, 0x52, 0x5e,
+ 0xbd, 0xc4, 0x1e, 0x62, 0x16, 0x3b, 0xca, 0x4c,
+ 0xdb, 0xdb, 0xca, 0xca, 0xdb, 0xdb, 0x4c, 0xca,
+ 0x3b, 0x3b, 0x4c, 0x4c, 0x3b, 0x1e, 0xe, 0x3e,
+ 0x8b, 0xe1, 0xf7, 0x51, 0xe3, 0x3b, 0xcd, 0xf7,
+ 0x31, 0x77, 0x12, 0xf7, 0x85, 0xe3, 0x3e, 0xcd,
+ 0x13, 0xd4, 0xf7, 0x90, 0xf7, 0x12, 0x15, 0xcd,
+ 0x6, 0x13, 0xb4, 0xf7, 0x31, 0xf7, 0x6f, 0xcd,
+ 0xfb, 0x6f, 0xf7, 0x31, 0x49, 0xfb, 0x31, 0xfb,
+ 0x6f, 0x49, 0xf7, 0x6f, 0x7, 0xfb, 0x6f, 0xfb,
+ 0xaf, 0x15, 0xf8, 0x8c, 0x6, 0x13, 0xd8, 0xcd,
+ 0xfc, 0x8c, 0x7, 0xe, 0xfb, 0xef, 0xf7, 0xa7,
+ 0xdb, 0xf7, 0x9d, 0xcf, 0x12, 0xf7, 0x4c, 0xe3,
+ 0x17, 0xf7, 0xa7, 0x4, 0xf7, 0xa2, 0x6, 0xa9,
+ 0xf7, 0x13, 0x5, 0x7b, 0x6, 0x62, 0x79, 0x85,
+ 0x85, 0x46, 0x1b, 0x2f, 0x6, 0xf7, 0x25, 0xed,
+ 0xa7, 0xe7, 0xaa, 0x5a, 0x1d, 0x1f, 0x44, 0x3c,
+ 0x3c, 0x22, 0x23, 0x1e, 0xe, 0xfb, 0xef, 0xf7,
+ 0xb5, 0x76, 0xf8, 0x8, 0xbb, 0x12, 0xf7, 0x44,
+ 0xea, 0x5a, 0xd6, 0x13, 0xd0, 0xe7, 0xf8, 0x7e,
+ 0x40, 0xa, 0x70, 0xb6, 0x56, 0x9d, 0x1e, 0x13,
+ 0x60, 0xa7, 0x9a, 0x4a, 0x1d, 0xe, 0x90, 0xa,
+ 0xe1, 0xf8, 0xa4, 0x56, 0x1d, 0xf7, 0x1e, 0xe1,
+ 0x5, 0xa3, 0x9a, 0x9f, 0x97, 0xa7, 0x1a, 0xaf,
+ 0x71, 0x93, 0x79, 0x81, 0x73, 0x89, 0x71, 0x74,
+ 0x1e, 0xe, 0x30, 0xfb, 0x4d, 0x76, 0xf9, 0x2f,
+ 0x77, 0x12, 0xac, 0xf7, 0x14, 0x2c, 0xf7, 0x1f,
+ 0xf7, 0x17, 0xf7, 0x1f, 0x13, 0xd8, 0xf7, 0x15,
+ 0x9d, 0x15, 0x8d, 0x8d, 0x5, 0x77, 0xa3, 0xab,
+ 0x7e, 0xb9, 0x1b, 0xb2, 0xaa, 0x9d, 0xad, 0xa5,
+ 0x1f, 0x64, 0xa0, 0xb1, 0x7e, 0xb6, 0x1b, 0xbd,
+ 0xa2, 0x9f, 0xa8, 0xab, 0x1f, 0xa3, 0x7, 0x82,
+ 0x86, 0x83, 0x89, 0x83, 0x8c, 0x8, 0x7c, 0x8d,
+ 0x76, 0x99, 0xaa, 0x1a, 0xf7, 0xfc, 0xfb, 0x1f,
+ 0xfb, 0xfb, 0x7, 0x7d, 0x77, 0x6a, 0x7e, 0x78,
+ 0x1b, 0x6f, 0x6c, 0x9f, 0xc1, 0x1f, 0xf7, 0xcc,
+ 0xfb, 0x1f, 0xfc, 0x9, 0x7, 0x56, 0x85, 0x62,
+ 0x83, 0x6a, 0x1e, 0x13, 0xe8, 0x82, 0x64, 0x81,
+ 0x70, 0x74, 0x1a, 0x5d, 0x9e, 0x6b, 0xbc, 0xb4,
+ 0x9e, 0xab, 0xb9, 0xa8, 0x7f, 0xa7, 0x82, 0xab,
+ 0x1e, 0x86, 0x9d, 0x87, 0x9e, 0x89, 0x9f, 0x8,
+ 0xe, 0x20, 0xfb, 0x54, 0x76, 0xf9, 0xd9, 0xb1,
+ 0x75, 0xa1, 0x12, 0xf7, 0x9a, 0xbc, 0xe3, 0xbc,
+ 0x13, 0xd8, 0xf7, 0x98, 0xfb, 0x69, 0x15, 0xbc,
+ 0xf9, 0xd9, 0xed, 0xfd, 0xd9, 0x6, 0x13, 0xb8,
+ 0xbc, 0xf9, 0x7a, 0x6, 0xe1, 0x97, 0xa4, 0xd3,
+ 0x1e, 0xa1, 0xfb, 0xb2, 0x7, 0xfb, 0x6, 0xfb,
+ 0x20, 0x67, 0xfb, 0x4e, 0xfb, 0x33, 0xf7, 0x6,
+ 0x44, 0xf7, 0x26, 0x1f, 0xe, 0xfc, 0x21, 0xf7,
+ 0x8c, 0x93, 0xa, 0xf7, 0xe0, 0x62, 0x1d, 0xfb,
+ 0xce, 0xfb, 0x59, 0x76, 0xf7, 0x6e, 0x77, 0x12,
+ 0xf7, 0x5d, 0xe8, 0x17, 0xf7, 0x33, 0x16, 0x60,
+ 0x2b, 0x4f, 0x1d, 0x13, 0x60, 0xb1, 0xf7, 0x5,
+ 0x8c, 0xdc, 0xc8, 0x4b, 0xa7, 0x52, 0x7a, 0x1f,
+ 0xa7, 0xcb, 0x5, 0xe, 0xfb, 0xef, 0xf7, 0xa7,
+ 0xa9, 0xbd, 0xa9, 0xf7, 0xc3, 0x77, 0x1, 0xf6,
+ 0xeb, 0x3, 0xa9, 0xf7, 0xf7, 0x15, 0xf7, 0x87,
+ 0xa9, 0x6, 0x4b, 0x85, 0x9b, 0xb3, 0x1f, 0xf7,
+ 0x8b, 0x46, 0xa, 0xfb, 0x17, 0x7, 0x65, 0x89,
+ 0x74, 0x40, 0x8c, 0x1e, 0xe, 0xfb, 0xd1, 0xf8,
+ 0x21, 0x9f, 0xf7, 0x8e, 0xa0, 0x1, 0x9d, 0xec,
+ 0xee, 0xed, 0x3, 0xf7, 0x7, 0xf8, 0xb2, 0x15,
+ 0xe7, 0x97, 0xac, 0xb1, 0xb1, 0x96, 0x6a, 0x2f,
+ 0x3e, 0x86, 0x5b, 0x5f, 0x5f, 0x85, 0xbb, 0xd8,
+ 0x1e, 0x2a, 0x16, 0x3b, 0xc5, 0x4a, 0xe4, 0xe4,
+ 0xc5, 0xcc, 0xdb, 0xde, 0x4e, 0xca, 0x35, 0x35,
+ 0x4e, 0x4c, 0x38, 0x1e, 0xe, 0x82, 0xa, 0x12,
+ 0xf7, 0x25, 0xf7, 0x1c, 0x17, 0xf7, 0x25, 0x91,
+ 0xa, 0x81, 0x91, 0x87, 0x91, 0x97, 0x9f, 0x9b,
+ 0x91, 0x92, 0x4c, 0xa, 0xf7, 0x58, 0x16, 0x6d,
+ 0x65, 0x35, 0x20, 0x6e, 0x1a, 0x80, 0x8f, 0x88,
+ 0x91, 0x96, 0x9d, 0x99, 0x93, 0x95, 0x4c, 0xa,
+ 0xe, 0xf2, 0x94, 0x76, 0xac, 0x76, 0xe2, 0xcd,
+ 0xf7, 0xe, 0xa9, 0xb4, 0x76, 0xf7, 0x1, 0x76,
+ 0xf7, 0xa7, 0x77, 0x12, 0xf6, 0xeb, 0xf8, 0x2a,
+ 0xe8, 0x13, 0x7f, 0x80, 0xf8, 0x53, 0xe2, 0x74,
+ 0x1d, 0x37, 0x23, 0x50, 0x38, 0x73, 0xa, 0x13,
+ 0xbf, 0x80, 0xfb, 0xc0, 0xfb, 0x39, 0x69, 0xa,
+ 0xfc, 0xdf, 0x3e, 0x1d, 0xe, 0xf2, 0x8b, 0xdb,
+ 0x44, 0x76, 0xf7, 0xb3, 0xa9, 0xb3, 0xcf, 0xf7,
+ 0xa7, 0x77, 0x12, 0xd3, 0xeb, 0xf8, 0x7f, 0xe3,
+ 0x13, 0x7e, 0xf7, 0x18, 0x7f, 0x69, 0xa, 0xfc,
+ 0xd8, 0x3e, 0x1d, 0x13, 0xbe, 0xf8, 0x76, 0xfb,
+ 0xc5, 0x15, 0xf7, 0xa2, 0x6, 0xa9, 0xf7, 0x13,
+ 0x5, 0x71, 0x6, 0x62, 0x79, 0x85, 0x85, 0x46,
+ 0x1b, 0x3f, 0x90, 0x6, 0xe8, 0xe2, 0x5, 0xd5,
+ 0xcd, 0x8b, 0xb8, 0x9d, 0x5a, 0x1d, 0x44, 0x3c,
+ 0x3c, 0x22, 0x23, 0x1f, 0xe, 0xf2, 0x94, 0x76,
+ 0xee, 0xcd, 0xf8, 0x7b, 0xbb, 0x12, 0xf7, 0x58,
+ 0xea, 0x5a, 0xd6, 0xf7, 0xae, 0xe8, 0x13, 0xec,
+ 0xf7, 0x40, 0x7f, 0x69, 0xa, 0xfc, 0x89, 0xfb,
+ 0x5a, 0x40, 0xa, 0x6f, 0xb6, 0x5b, 0x9b, 0x1e,
+ 0x8f, 0x7, 0x13, 0xf4, 0xa3, 0x98, 0x4a, 0x1d,
+ 0xf7, 0xd9, 0xfc, 0x31, 0x74, 0x1d, 0x35, 0x26,
+ 0x52, 0x35, 0x73, 0xa, 0xe, 0xfb, 0x5d, 0xaf,
+ 0xf8, 0x88, 0xf7, 0x3a, 0x12, 0xc2, 0xf7, 0x29,
+ 0x70, 0xf7, 0x3d, 0x69, 0xf7, 0x17, 0x13, 0xe8,
+ 0x13, 0xd0, 0xf7, 0x8b, 0xf7, 0x95, 0x15, 0x99,
+ 0x3e, 0x59, 0x6a, 0x56, 0x68, 0x8, 0x58, 0x6a,
+ 0x57, 0x68, 0x40, 0x1a, 0xfb, 0x33, 0xf7, 0x37,
+ 0x80, 0xaa, 0xf7, 0x38, 0xa9, 0xf1, 0xb4, 0xae,
+ 0x78, 0xb5, 0x58, 0x77, 0x62, 0x7f, 0x57, 0x70,
+ 0x96, 0x7f, 0x95, 0x80, 0x1e, 0x93, 0x82, 0x93,
+ 0x83, 0x7e, 0x1a, 0x66, 0x59, 0x88, 0x82, 0x3d,
+ 0x83, 0xe4, 0xb5, 0xcf, 0xa1, 0xb5, 0x9f, 0xb1,
+ 0x1e, 0xa2, 0xb6, 0xa4, 0xae, 0x7a, 0xcc, 0x8,
+ 0x13, 0xe8, 0x27, 0xf7, 0x37, 0x15, 0x5d, 0xb1,
+ 0x64, 0xb9, 0xbb, 0xb0, 0xb3, 0xb8, 0xba, 0x66,
+ 0xad, 0x5b, 0x5d, 0x65, 0x6a, 0x5b, 0x1e, 0xe,
+ 0x4b, 0x1d, 0xf7, 0x91, 0x77, 0x1, 0xf8, 0xe,
+ 0xf9, 0x76, 0x24, 0x1d, 0xfb, 0x77, 0xfd, 0xce,
+ 0x20, 0x1d, 0x4b, 0x1d, 0xf7, 0x91, 0x77, 0x1,
+ 0xf7, 0xa6, 0xf9, 0x76, 0x22, 0x1d, 0xfc, 0x26,
+ 0xfe, 0x13, 0x20, 0x1d, 0x4b, 0x1d, 0xf7, 0x88,
+ 0x77, 0x1, 0xf7, 0x4e, 0xf9, 0x76, 0x29, 0x1d,
+ 0xfb, 0xbf, 0xfe, 0x26, 0x20, 0x1d, 0x54, 0xa,
+ 0xf8, 0x9d, 0xd9, 0x80, 0xd9, 0x12, 0x13, 0xd0,
+ 0xf7, 0x40, 0xf9, 0x8b, 0x45, 0x1d, 0xa1, 0xa5,
+ 0x81, 0x80, 0xa3, 0x1f, 0x13, 0xe0, 0x7e, 0xa9,
+ 0xa8, 0x7c, 0xa1, 0x1b, 0x13, 0xd0, 0x44, 0xa,
+ 0x13, 0xe0, 0x54, 0x1d, 0x6b, 0x77, 0x96, 0x96,
+ 0x77, 0x1f, 0x13, 0xd0, 0x98, 0x74, 0x75, 0x99,
+ 0x69, 0x50, 0x1d, 0xfb, 0x37, 0xfd, 0x8b, 0x20,
+ 0x1d, 0x4b, 0x1d, 0xd8, 0xf7, 0x16, 0x1, 0xf7,
+ 0x4e, 0xf7, 0x13, 0x8b, 0xde, 0x8b, 0xf7, 0x13,
+ 0x14, 0xe, 0xf7, 0x4e, 0xf9, 0xc0, 0x15, 0x6e,
+ 0x1d, 0xf7, 0x66, 0x16, 0x6e, 0x1d, 0xfc, 0x17,
+ 0xfd, 0xc0, 0x20, 0x1d, 0x54, 0xa, 0xf8, 0x5f,
+ 0x77, 0xba, 0xbb, 0xf7, 0x15, 0xbb, 0x1, 0xf7,
+ 0x84, 0xbb, 0x8b, 0xf7, 0x9, 0x8b, 0xbb, 0x14,
+ 0x7, 0xf7, 0x84, 0xf9, 0xd0, 0x15, 0x4f, 0xbc,
+ 0x5d, 0xc5, 0x7d, 0x1d, 0x1e, 0xbb, 0x16, 0xac,
+ 0xa4, 0xa5, 0xac, 0xac, 0xa5, 0x71, 0x6a, 0x6a,
+ 0x71, 0x72, 0x6a, 0x6a, 0x72, 0xa4, 0xac, 0x1e,
+ 0xfb, 0xab, 0xfd, 0xd0, 0x20, 0x1d, 0xf7, 0xf5,
+ 0x8b, 0xae, 0x68, 0xb7, 0xf7, 0x97, 0xb3, 0x7f,
+ 0xab, 0xf7, 0xa0, 0xb8, 0x12, 0xf8, 0x44, 0xf7,
+ 0x34, 0x13, 0xac, 0x8f, 0x16, 0xf7, 0x62, 0xae,
+ 0x6, 0x59, 0x91, 0x66, 0x8f, 0xac, 0x1a, 0xf7,
+ 0xb, 0xf7, 0x75, 0x5, 0xf7, 0x52, 0xfb, 0x60,
+ 0x6, 0x64, 0x7d, 0x75, 0x41, 0x88, 0x1e, 0x68,
+ 0xf8, 0xca, 0x7, 0xb4, 0xf7, 0x67, 0x5, 0x74,
+ 0x6, 0x7e, 0x60, 0x44, 0x6b, 0x6c, 0x1e, 0x13,
+ 0x5c, 0x61, 0x5e, 0x62, 0x81, 0x21, 0x1b, 0x4f,
+ 0x82, 0x9e, 0xae, 0x1f, 0xf7, 0x7d, 0x7, 0xf7,
+ 0x16, 0x86, 0x8a, 0x56, 0x9b, 0x28, 0x8, 0xac,
+ 0xf7, 0xe6, 0x6a, 0x6, 0x6f, 0xfb, 0x14, 0x8b,
+ 0x81, 0xfb, 0x9, 0x80, 0x8, 0xf7, 0x82, 0x7,
+ 0x9e, 0x8b, 0x96, 0xdd, 0xf7, 0x44, 0x90, 0x49,
+ 0x31, 0x9e, 0x1e, 0xae, 0xf7, 0x5d, 0xfd, 0xe,
+ 0x6b, 0x6, 0xbf, 0x89, 0xae, 0x85, 0x6c, 0x1a,
+ 0xfb, 0xbc, 0xfc, 0xac, 0x5, 0x13, 0xac, 0x78,
+ 0x68, 0x84, 0x93, 0x67, 0x84, 0x8, 0xf7, 0x98,
+ 0xf7, 0xc8, 0x15, 0xf7, 0x35, 0xf7, 0xac, 0x5,
+ 0x92, 0xfb, 0xac, 0x6, 0xe, 0xd6, 0xfb, 0x59,
+ 0x76, 0xf7, 0x33, 0xb5, 0x8b, 0xb9, 0x7d, 0xa,
+ 0xf7, 0x57, 0xe8, 0x13, 0xfb, 0xf7, 0xc4, 0xfb,
+ 0x37, 0x15, 0x7b, 0x66, 0x5, 0x7b, 0xb4, 0xb1,
+ 0x89, 0x97, 0x1b, 0xb1, 0xec, 0x93, 0xdc, 0xbc,
+ 0x64, 0xa0, 0x58, 0x7e, 0x83, 0x89, 0x88, 0x81,
+ 0x1f, 0x9f, 0xb8, 0xf7, 0x11, 0x8c, 0xd8, 0xca,
+ 0xd3, 0xdd, 0x19, 0x6d, 0xa4, 0x5, 0x2e, 0x38,
+ 0x40, 0x6d, 0x3d, 0x1b, 0xfb, 0x2a, 0x5e, 0xf7,
+ 0x45, 0xf7, 0x12, 0xf7, 0x3d, 0xaa, 0xf7, 0x31,
+ 0xf7, 0x26, 0xf7, 0x6, 0xdd, 0xfb, 0x9, 0x34,
+ 0xae, 0x1f, 0xae, 0x6, 0x13, 0xf7, 0x6a, 0x1d,
+ 0x7b, 0x6c, 0x9d, 0x99, 0x61, 0x1f, 0x13, 0xfb,
+ 0x94, 0x70, 0x6b, 0x93, 0x68, 0x1b, 0xfb, 0x66,
+ 0xfb, 0x24, 0xfb, 0x30, 0xfb, 0x5f, 0xfb, 0x44,
+ 0xf7, 0x4, 0xfb, 0x30, 0xf7, 0x66, 0x7a, 0x1f,
+ 0x68, 0x3c, 0x96, 0x83, 0x5, 0x8d, 0x93, 0x92,
+ 0x8d, 0x98, 0x1b, 0xa5, 0x9f, 0x80, 0x72, 0x73,
+ 0x1d, 0x1f, 0xe, 0x55, 0x1d, 0x9b, 0x16, 0x21,
+ 0x1d, 0xf7, 0xf0, 0xf9, 0x53, 0x26, 0xa, 0x55,
+ 0x1d, 0xf7, 0x98, 0xf9, 0x76, 0x22, 0x1d, 0xfc,
+ 0x11, 0xfe, 0x13, 0x15, 0x21, 0x1d, 0xe, 0x51,
+ 0xa, 0xf7, 0x82, 0x72, 0xa, 0xf7, 0x40, 0xf9,
+ 0x76, 0x29, 0x1d, 0xfb, 0xaa, 0xfe, 0x26, 0x15,
+ 0x21, 0x1d, 0xe, 0x9f, 0x8b, 0xaa, 0xf7, 0xbe,
+ 0xad, 0xf7, 0xab, 0xad, 0xd2, 0x9a, 0x1d, 0xf3,
+ 0xf7, 0x36, 0x2c, 0xf7, 0x16, 0xda, 0xf7, 0x16,
+ 0x2f, 0xaf, 0x13, 0xf9, 0x9b, 0x16, 0x21, 0x1d,
+ 0x13, 0xf6, 0xf7, 0x2f, 0xf9, 0x9d, 0x15, 0x2a,
+ 0x1d, 0xf7, 0x65, 0x38, 0x1d, 0x35, 0x1d, 0xf7,
+ 0x5a, 0xf9, 0x53, 0x26, 0xa, 0x35, 0x1d, 0xe9,
+ 0xf9, 0x53, 0x28, 0x1d, 0x5c, 0xa, 0xf7, 0x82,
+ 0x77, 0x27, 0xa, 0x91, 0xf9, 0x53, 0x29, 0x1d,
+ 0xe, 0x5c, 0xa, 0xd2, 0x9a, 0x1d, 0x9f, 0xf7,
+ 0x1a, 0x62, 0xf7, 0x36, 0x62, 0xf7, 0x16, 0x13,
+ 0xf4, 0x9f, 0x16, 0xf7, 0xf2, 0xae, 0x6, 0x13,
+ 0xe8, 0x34, 0x1d, 0x7, 0x13, 0xf4, 0xfb, 0xf2,
+ 0x68, 0x6, 0x13, 0xe8, 0x4b, 0xa, 0x13, 0xf4,
+ 0x4d, 0x64, 0x87, 0x55, 0x86, 0x1e, 0x8f, 0xf9,
+ 0x9d, 0x40, 0x1d, 0x8a, 0x1d, 0xf7, 0xb7, 0xba,
+ 0xf7, 0xa1, 0xad, 0x1, 0xec, 0xf7, 0x36, 0xf7,
+ 0x95, 0xf7, 0x42, 0x3, 0xf7, 0x97, 0xf7, 0xda,
+ 0x15, 0xf7, 0x6, 0xba, 0xfb, 0x6, 0xf7, 0x67,
+ 0x6, 0x8c, 0x1d, 0xfb, 0x69, 0x30, 0x84, 0xa,
+ 0x1f, 0xfb, 0x89, 0x30, 0x15, 0xf7, 0xd0, 0x6,
+ 0xf7, 0x90, 0xf7, 0x0, 0xf7, 0x2e, 0xf7, 0x4c,
+ 0xf7, 0x2e, 0x30, 0xf7, 0x4c, 0x95, 0x1d, 0xb7,
+ 0x8f, 0x4e, 0x1f, 0xfb, 0x67, 0x30, 0x5c, 0xe6,
+ 0xfb, 0x7f, 0x7, 0x66, 0x77, 0x78, 0x4c, 0x1e,
+ 0xe, 0xd6, 0x8e, 0x76, 0xf9, 0x27, 0xae, 0xdc,
+ 0xd9, 0x12, 0xf2, 0xb7, 0xf8, 0x44, 0xb7, 0x17,
+ 0x72, 0x1d, 0x37, 0xa, 0xf7, 0x37, 0xf9, 0x68,
+ 0x45, 0x1d, 0x13, 0x30, 0xa8, 0xa2, 0x81, 0x80,
+ 0xa0, 0x1f, 0x7e, 0xa4, 0xa3, 0x7c, 0xaa, 0x1b,
+ 0x42, 0xa, 0x13, 0x10, 0x74, 0x76, 0x98, 0x98,
+ 0x72, 0x1f, 0x97, 0x74, 0x71, 0x96, 0x6a, 0x50,
+ 0x1d, 0xe, 0x51, 0x1d, 0xf7, 0x7c, 0x77, 0x57,
+ 0x1d, 0xfb, 0x48, 0x78, 0xa, 0xfb, 0x7b, 0x58,
+ 0x1d, 0xf7, 0x21, 0x5e, 0xa, 0xf7, 0x21, 0x5e,
+ 0x1d, 0xfb, 0x18, 0xfb, 0x6e, 0x1e, 0xf8, 0xe,
+ 0xf8, 0x21, 0x26, 0xa, 0x51, 0x1d, 0xf7, 0x7c,
+ 0x77, 0x1, 0xae, 0xf7, 0x45, 0xf7, 0xf6, 0x30,
+ 0xa, 0xf7, 0xa6, 0xf8, 0x26, 0x28, 0x1d, 0x51,
+ 0x1d, 0x57, 0x1d, 0xfb, 0x49, 0x78, 0xa, 0xfb,
+ 0x7a, 0x58, 0x1d, 0xf7, 0x20, 0x5e, 0xa, 0xf7,
+ 0x22, 0x5e, 0x1d, 0xfb, 0x18, 0xfb, 0x6e, 0x1e,
+ 0xf7, 0x4e, 0xf8, 0x21, 0x29, 0x1d, 0xe, 0x51,
+ 0x1d, 0xcd, 0xd9, 0x6e, 0xd9, 0x12, 0x5c, 0x1d,
+ 0x13, 0xdc, 0xf7, 0x68, 0xf7, 0xea, 0x79, 0x1d,
+ 0xf7, 0x3e, 0x66, 0x1d, 0xfb, 0x49, 0x78, 0xa,
+ 0xfb, 0x7a, 0x65, 0x1d, 0xf7, 0x85, 0x45, 0xa,
+ 0xfb, 0x2b, 0x5f, 0x1d, 0xf7, 0x20, 0x5e, 0xa,
+ 0xf7, 0x22, 0xfb, 0x55, 0x96, 0xa, 0x1e, 0xf7,
+ 0x3a, 0xf8, 0x35, 0x45, 0x1d, 0xa9, 0xa1, 0x80,
+ 0x80, 0xa1, 0x1f, 0x13, 0xec, 0x7e, 0xa4, 0xa2,
+ 0x7d, 0xaa, 0x1b, 0x13, 0xdc, 0x44, 0xa, 0x13,
+ 0xec, 0x54, 0x1d, 0x75, 0x76, 0x98, 0x97, 0x73,
+ 0x1f, 0x13, 0xdc, 0x97, 0x74, 0x70, 0x97, 0x69,
+ 0x50, 0x1d, 0xe, 0x51, 0x1d, 0xc3, 0xf7, 0x16,
+ 0x1, 0xae, 0xf7, 0x45, 0x94, 0xf7, 0x14, 0xdc,
+ 0xf7, 0x14, 0x93, 0x30, 0xa, 0xf7, 0x4e, 0xf8,
+ 0x70, 0x15, 0x6d, 0xa, 0xf7, 0x65, 0x16, 0x6d,
+ 0xa, 0xe, 0x3e, 0xb0, 0x76, 0xf8, 0x6e, 0x77,
+ 0x1, 0xbb, 0xca, 0x15, 0xb8, 0x5c, 0xf7, 0x54,
+ 0xf7, 0x56, 0xf7, 0x54, 0xfb, 0x56, 0xb8, 0xbb,
+ 0xfb, 0x54, 0xf7, 0x51, 0xf7, 0x54, 0xf7, 0x55,
+ 0x5b, 0xb7, 0xfb, 0x51, 0xfb, 0x52, 0xfb, 0x51,
+ 0xf7, 0x52, 0x5b, 0x5e, 0xf7, 0x53, 0xfb, 0x54,
+ 0x5, 0xe, 0xf7, 0x17, 0x56, 0x76, 0xc2, 0xac,
+ 0x93, 0x1d, 0xb9, 0x77, 0x5a, 0xa, 0xdc, 0x41,
+ 0x15, 0xbd, 0x6, 0xd2, 0xf3, 0x5, 0x6b, 0xc0,
+ 0xca, 0x7a, 0xd2, 0x1b, 0xf7, 0x61, 0xf7, 0x29,
+ 0xf7, 0x1f, 0xf7, 0x66, 0xf7, 0x12, 0x55, 0xf4,
+ 0x39, 0xc8, 0x1f, 0xd9, 0xf7, 0x7, 0x5, 0x59,
+ 0x6, 0x4c, 0x2e, 0x5, 0xaa, 0x56, 0x4c, 0x9b,
+ 0x48, 0x1b, 0x96, 0xa, 0xfb, 0xd, 0xbd, 0x21,
+ 0xdd, 0x4c, 0x1f, 0xce, 0xee, 0x15, 0x76, 0xcf,
+ 0x8a, 0xdc, 0xb5, 0x1a, 0xf7, 0x26, 0xb0, 0xf7,
+ 0x3e, 0xf7, 0x20, 0xca, 0xb4, 0x68, 0x55, 0xa6,
+ 0x1e, 0xfb, 0x9f, 0xfc, 0x65, 0x15, 0xf7, 0xb3,
+ 0xf8, 0x38, 0x5, 0x9e, 0x53, 0x92, 0x40, 0x4c,
+ 0x1a, 0x34, 0x85, 0xfb, 0x79, 0xfb, 0x3f, 0x46,
+ 0x61, 0xb1, 0xbf, 0x72, 0x1e, 0xe, 0x6b, 0xa,
+ 0xf7, 0x8b, 0x77, 0x63, 0xa, 0x9b, 0xf9, 0x15,
+ 0x21, 0xa, 0xf8, 0x20, 0xc9, 0x26, 0xa, 0x6b,
+ 0xa, 0xf7, 0x8b, 0x77, 0x63, 0xa, 0xf7, 0xc8,
+ 0xf9, 0x76, 0x22, 0x1d, 0xfc, 0x41, 0xfb, 0x92,
+ 0x21, 0xa, 0xe, 0x6b, 0xa, 0xf7, 0x82, 0x77,
+ 0x63, 0xa, 0xf7, 0x70, 0xf9, 0x76, 0x29, 0x1d,
+ 0xfb, 0xda, 0xfb, 0xa5, 0x21, 0xa, 0xe, 0x6b,
+ 0xa, 0xd2, 0x9a, 0x1d, 0xed, 0xf7, 0x33, 0x64,
+ 0xf7, 0x16, 0xc8, 0xf7, 0x16, 0x9c, 0xb7, 0x13,
+ 0xf6, 0x9b, 0xf9, 0x15, 0x21, 0xa, 0x13, 0xee,
+ 0xf7, 0x5e, 0xf7, 0x1c, 0x15, 0x2a, 0x1d, 0xf7,
+ 0x67, 0x38, 0x1d, 0xd6, 0x4e, 0x1d, 0xf7, 0x90,
+ 0x77, 0x1, 0xf7, 0xaa, 0x7f, 0x1d, 0x69, 0x1d,
+ 0x83, 0xde, 0x1a, 0xf7, 0x4c, 0x66, 0xa, 0xb8,
+ 0x89, 0x64, 0x1a, 0xfb, 0x32, 0xfb, 0xa0, 0x5,
+ 0xfb, 0x14, 0xf7, 0x82, 0x7b, 0xa4, 0x3d, 0x1d,
+ 0xfb, 0x27, 0x7, 0x38, 0x73, 0x93, 0x46, 0x84,
+ 0x1e, 0xf7, 0x3, 0xf9, 0x58, 0x28, 0x1d, 0x67,
+ 0x8f, 0x76, 0xb1, 0x76, 0xf7, 0x41, 0xae, 0x7d,
+ 0xae, 0xf7, 0xa6, 0xae, 0x68, 0xf7, 0x41, 0xfb,
+ 0x3d, 0xf7, 0x39, 0x8f, 0x77, 0x12, 0xef, 0xf7,
+ 0x36, 0xfb, 0x26, 0xf7, 0x36, 0xf7, 0x29, 0xf7,
+ 0x40, 0xfb, 0x3f, 0xf7, 0x40, 0x13, 0xa2, 0xa0,
+ 0xf7, 0x9a, 0xf7, 0x64, 0x15, 0xf7, 0x98, 0x7,
+ 0x13, 0x99, 0x60, 0xa1, 0x8c, 0x98, 0x98, 0xad,
+ 0x1b, 0x13, 0x92, 0x50, 0xdd, 0xaf, 0x6d, 0xfb,
+ 0x6, 0x1f, 0x13, 0xa2, 0xa0, 0xfb, 0x10, 0x5e,
+ 0x70, 0xfb, 0xd, 0x1e, 0x13, 0x52, 0x60, 0xfb,
+ 0x8a, 0xfb, 0x64, 0x15, 0xf7, 0xe2, 0xae, 0x6,
+ 0x13, 0x92, 0xa0, 0x46, 0x94, 0x78, 0x83, 0xdc,
+ 0x1a, 0x13, 0xa2, 0xa0, 0xc3, 0x7, 0x13, 0x92,
+ 0x50, 0xf7, 0x3c, 0x8a, 0xf7, 0x3e, 0xb8, 0xf7,
+ 0x25, 0x1a, 0x13, 0x99, 0x60, 0xdf, 0x60, 0xe7,
+ 0xfb, 0x79, 0x1e, 0x13, 0x99, 0xa0, 0x49, 0x97,
+ 0x6, 0xdc, 0x9e, 0x8b, 0xd0, 0x95, 0x1e, 0x13,
+ 0x94, 0x60, 0xae, 0xfb, 0xe2, 0x68, 0x7, 0x13,
+ 0x92, 0xa0, 0xc0, 0x86, 0xaa, 0x8a, 0x37, 0x1a,
+ 0xfc, 0x46, 0x7, 0x31, 0x70, 0x9e, 0x52, 0x80,
+ 0x1e, 0xe, 0x30, 0x7f, 0xae, 0x6e, 0xf7, 0x12,
+ 0x28, 0x76, 0xf8, 0x9, 0xad, 0xf7, 0x94, 0xa7,
+ 0x12, 0xd1, 0xf7, 0x1f, 0xf7, 0x16, 0xf7, 0x1d,
+ 0x22, 0xf7, 0x26, 0x13, 0x9e, 0x9e, 0x16, 0xad,
+ 0x7, 0x13, 0x5d, 0xb0, 0x91, 0x99, 0x91, 0xbe,
+ 0x1a, 0xf8, 0x2e, 0x7, 0xf4, 0xdd, 0xda, 0xf7,
+ 0x8, 0xf7, 0x31, 0xbe, 0x2a, 0x55, 0x3b, 0x4b,
+ 0x5a, 0x32, 0x7a, 0x1e, 0x89, 0x7, 0xf7, 0x1a,
+ 0x68, 0xc7, 0x53, 0xfb, 0x3, 0x1a, 0x36, 0x5b,
+ 0x51, 0x57, 0x68, 0x1e, 0x13, 0x9e, 0x7f, 0x83,
+ 0x7d, 0x84, 0x7d, 0x8a, 0x6e, 0x89, 0x18, 0x6e,
+ 0x6e, 0x94, 0x9e, 0x79, 0x1f, 0x13, 0x3e, 0x7f,
+ 0x98, 0x83, 0x9b, 0xa0, 0x1a, 0xa8, 0x9f, 0x9e,
+ 0xa7, 0xad, 0x97, 0x72, 0x75, 0x1e, 0x7f, 0x88,
+ 0x85, 0x81, 0x1a, 0x7d, 0x96, 0x88, 0x97, 0x1e,
+ 0xa4, 0x90, 0x88, 0xa4, 0x7e, 0xbb, 0x8, 0x85,
+ 0xa3, 0x8d, 0xa7, 0xab, 0x1a, 0xf7, 0x2e, 0x67,
+ 0xa5, 0x49, 0x8e, 0x1e, 0xad, 0x7, 0x13, 0x9d,
+ 0xd6, 0x91, 0x86, 0xb6, 0xdf, 0x1a, 0xed, 0x6d,
+ 0xa4, 0x62, 0x55, 0x87, 0x57, 0x72, 0x8a, 0x1e,
+ 0x13, 0x5e, 0xfc, 0xde, 0x7, 0xe, 0x92, 0x50,
+ 0xa, 0x52, 0x1d, 0x13, 0xd8, 0xf7, 0xba, 0xc3,
+ 0x2a, 0xa, 0x84, 0x93, 0x86, 0x92, 0x94, 0x1a,
+ 0x13, 0xb8, 0x3b, 0x1d, 0x71, 0xf7, 0xaf, 0x26,
+ 0xa, 0x92, 0x50, 0xa, 0xd7, 0x76, 0xf7, 0x4d,
+ 0x77, 0x52, 0x1d, 0x13, 0xde, 0xf7, 0x37, 0xf8,
+ 0xa4, 0x22, 0x1d, 0x85, 0xfd, 0x9, 0x37, 0x1d,
+ 0x13, 0xbe, 0x3b, 0x1d, 0xe, 0x92, 0x50, 0xa,
+ 0xf7, 0x7b, 0x77, 0x52, 0x1d, 0x13, 0xdc, 0xd6,
+ 0xf8, 0xa4, 0x29, 0x1d, 0xec, 0xfd, 0x1c, 0x23,
+ 0x1d, 0xa2, 0x81, 0x97, 0x82, 0x96, 0x1e, 0x85,
+ 0x92, 0x86, 0x91, 0x36, 0x1d, 0x92, 0x50, 0xa,
+ 0xd5, 0xd9, 0x6e, 0xd9, 0x52, 0x1d, 0x13, 0xce,
+ 0xc8, 0xf8, 0xb9, 0x45, 0x1d, 0xa7, 0xa2, 0x82,
+ 0x80, 0xa1, 0x1f, 0x13, 0xd6, 0x7d, 0xa7, 0xa5,
+ 0x7c, 0xa5, 0x1b, 0x13, 0xce, 0x44, 0xa, 0x13,
+ 0xd6, 0x54, 0x1d, 0x71, 0x73, 0x96, 0x97, 0x73,
+ 0x1f, 0x13, 0xce, 0x98, 0x71, 0x72, 0x98, 0x71,
+ 0x50, 0x1d, 0xf7, 0x7d, 0xfc, 0x81, 0x23, 0x1d,
+ 0xa2, 0x81, 0x98, 0x82, 0x95, 0x1e, 0x85, 0x92,
+ 0x86, 0x91, 0x94, 0x1a, 0x13, 0xb6, 0x3b, 0xa,
+ 0x13, 0x86, 0x24, 0xa, 0xe, 0x92, 0x50, 0xa,
+ 0xcb, 0xf7, 0x16, 0x52, 0x1d, 0x13, 0xdc, 0xd6,
+ 0x3f, 0xa, 0x94, 0xfc, 0xb6, 0x23, 0x1d, 0xa2,
+ 0x80, 0x97, 0x83, 0x95, 0x1e, 0x85, 0x92, 0x86,
+ 0x92, 0x36, 0x1d, 0x92, 0x76, 0xf7, 0xbb, 0xf7,
+ 0x54, 0xc1, 0xbb, 0x5b, 0xf7, 0x38, 0xfb, 0x8,
+ 0xf7, 0x8, 0x8b, 0xbc, 0x12, 0xa4, 0xf7, 0x26,
+ 0x69, 0xf7, 0x38, 0xfb, 0x8, 0xf7, 0x39, 0x13,
+ 0xd5, 0x0, 0xf7, 0x1d, 0x94, 0xa, 0x13, 0xee,
+ 0x80, 0x7d, 0x1d, 0x1f, 0xf7, 0x31, 0xfc, 0xd5,
+ 0x37, 0x1d, 0x3b, 0x1d, 0xfb, 0x0, 0xf8, 0x18,
+ 0x15, 0xab, 0xa5, 0xa5, 0xab, 0xab, 0xa5, 0x71,
+ 0x6b, 0x6b, 0x71, 0x71, 0x6b, 0x6b, 0x71, 0xa5,
+ 0xab, 0x1e, 0xe, 0xd6, 0x7d, 0xca, 0x4c, 0xd1,
+ 0xf7, 0x54, 0xb0, 0x8a, 0xf7, 0x51, 0x6b, 0xab,
+ 0x12, 0xac, 0xf7, 0x29, 0xfb, 0x18, 0xf7, 0x18,
+ 0xf7, 0x6, 0xf7, 0x1e, 0xf7, 0x1d, 0xf7, 0xd,
+ 0x13, 0x6d, 0x80, 0xf7, 0xe5, 0xd6, 0x15, 0x37,
+ 0xba, 0xcf, 0x86, 0xb0, 0x1b, 0xde, 0xce, 0xb1,
+ 0xe4, 0xc1, 0x1f, 0x76, 0x9a, 0x5, 0x72, 0x77,
+ 0x69, 0x5c, 0x42, 0x1b, 0xfb, 0x3, 0x8b, 0xf7,
+ 0xf, 0xb9, 0x1f, 0xa2, 0xf7, 0x96, 0x7, 0x13,
+ 0x93, 0x80, 0xf7, 0x41, 0x8c, 0xfb, 0x1, 0xbf,
+ 0x39, 0x1b, 0x4b, 0x65, 0x73, 0x70, 0x71, 0x1f,
+ 0xa0, 0x76, 0x66, 0xa9, 0x29, 0x1b, 0x27, 0x47,
+ 0x52, 0x47, 0x5f, 0xae, 0x77, 0xa8, 0xb8, 0xa2,
+ 0x9d, 0xb3, 0xa1, 0x83, 0x95, 0x84, 0x93, 0x1f,
+ 0x84, 0x92, 0x84, 0x91, 0x97, 0x1a, 0x13, 0xad,
+ 0x80, 0xa1, 0xaf, 0x97, 0xa8, 0xdb, 0x89, 0x57,
+ 0x6e, 0x1e, 0x3b, 0x7, 0xfb, 0x45, 0x52, 0x35,
+ 0x6f, 0x23, 0x1a, 0x46, 0xb6, 0x67, 0xd7, 0xe1,
+ 0xc6, 0xbc, 0xad, 0xad, 0x1e, 0x68, 0x97, 0x15,
+ 0x6c, 0x6e, 0x79, 0x8a, 0x78, 0x1b, 0x5e, 0x83,
+ 0xb7, 0xa7, 0xdb, 0xcb, 0xa7, 0xc2, 0x9e, 0x1f,
+ 0xf7, 0x1e, 0xb0, 0x15, 0xcb, 0x8b, 0xe9, 0xcf,
+ 0xbf, 0x9c, 0x67, 0x32, 0x1e, 0x6a, 0x7, 0xe,
+ 0xfb, 0x5f, 0xfb, 0x59, 0x76, 0xf7, 0x63, 0xcb,
+ 0x86, 0x1d, 0xea, 0xe8, 0x4e, 0xf7, 0x10, 0x13,
+ 0xdc, 0xf7, 0x44, 0x2b, 0x15, 0x4f, 0x1d, 0xb1,
+ 0xf7, 0x5, 0x8e, 0xda, 0xc7, 0x49, 0xa6, 0x54,
+ 0x7c, 0x1f, 0xa1, 0xbe, 0xd3, 0x8f, 0xc7, 0xb2,
+ 0xb6, 0xc8, 0x19, 0x79, 0x9d, 0x5, 0x70, 0x73,
+ 0x71, 0x6e, 0x52, 0x1b, 0x3d, 0x4e, 0xdc, 0xf7,
+ 0x20, 0xb8, 0x98, 0xf7, 0xf, 0xd9, 0x1f, 0x13,
+ 0xea, 0x9a, 0x9f, 0x82, 0x6d, 0x8f, 0x1d, 0x33,
+ 0xb0, 0x44, 0x1f, 0x13, 0x4a, 0x2d, 0xfb, 0x1e,
+ 0x4e, 0xfb, 0x59, 0xfb, 0x7, 0xd6, 0x27, 0xf7,
+ 0x6, 0x80, 0x1f, 0xe, 0x4c, 0x1d, 0x78, 0xfb,
+ 0x4, 0x5b, 0x94, 0x1e, 0xfb, 0x1c, 0x79, 0xa,
+ 0x13, 0xd8, 0x2b, 0x1d, 0xde, 0xf7, 0xaf, 0x26,
+ 0xa, 0x4c, 0x1d, 0x86, 0xfb, 0x9, 0x60, 0x8d,
+ 0x1e, 0xfb, 0x23, 0x80, 0xa, 0x1e, 0x13, 0xd8,
+ 0x2b, 0x1d, 0x76, 0xf7, 0xaf, 0x28, 0x1d, 0x49,
+ 0x1d, 0xd7, 0x83, 0x1d, 0xa4, 0x8a, 0xa, 0x4d,
+ 0xa, 0x82, 0xfb, 0x4, 0x5b, 0x92, 0x1e, 0xfb,
+ 0x24, 0x80, 0xa, 0x34, 0xa, 0x1e, 0x39, 0x1d,
+ 0xfb, 0x1, 0xf7, 0xaf, 0x29, 0x1d, 0xe, 0x49,
+ 0x1d, 0xcb, 0xf7, 0x16, 0x98, 0xa, 0x21, 0xf7,
+ 0x16, 0xdb, 0xf7, 0x16, 0x13, 0xfa, 0x4d, 0xa,
+ 0x7d, 0xfb, 0x4, 0x5b, 0x92, 0x1e, 0xfb, 0x1f,
+ 0x79, 0xa, 0x2b, 0x1d, 0x13, 0xf6, 0xfb, 0x3,
+ 0xf7, 0xf9, 0x40, 0x1d, 0x3e, 0xa, 0xfb, 0xa6,
+ 0x7, 0x5b, 0x7a, 0x88, 0x67, 0x82, 0x1e, 0xf7,
+ 0x1f, 0xf8, 0x82, 0x29, 0xa, 0x81, 0x7f, 0xa,
+ 0x99, 0x7c, 0xa4, 0x7c, 0x1f, 0xe, 0x3e, 0xa,
+ 0xfb, 0xa9, 0x7, 0x5b, 0x7a, 0x8b, 0x67, 0x82,
+ 0x1e, 0xae, 0xf8, 0x82, 0x56, 0x1d, 0xf7, 0x22,
+ 0xe3, 0x5, 0xa3, 0x9a, 0x9c, 0x95, 0xa7, 0x1a,
+ 0xaf, 0x6b, 0x2c, 0xa, 0xe, 0x5d, 0xa, 0xf7,
+ 0x0, 0x83, 0x1d, 0xd0, 0x8a, 0xa, 0x67, 0xf8,
+ 0xa4, 0x56, 0x1d, 0xf7, 0x3, 0xed, 0xf7, 0x5,
+ 0x29, 0x5, 0xc4, 0x6, 0xfb, 0x10, 0xf7, 0x44,
+ 0x5, 0x2f, 0x6, 0x46, 0xfd, 0x54, 0x15, 0x33,
+ 0xa, 0xe, 0xfc, 0x5, 0xa0, 0x76, 0xf8, 0xad,
+ 0x9a, 0x1d, 0x67, 0xf7, 0x13, 0x75, 0xf7, 0x1f,
+ 0x69, 0xf7, 0x13, 0x13, 0xd0, 0x49, 0xa, 0x13,
+ 0xe8, 0x57, 0xf8, 0xcd, 0x15, 0x6c, 0x1d, 0xf7,
+ 0x66, 0x16, 0x6c, 0x1d, 0xe, 0x65, 0xa, 0xf7,
+ 0x6e, 0x77, 0x12, 0x5d, 0x1d, 0xfb, 0x1c, 0xf7,
+ 0x27, 0x13, 0xf8, 0xf7, 0x40, 0xf7, 0x83, 0x78,
+ 0x1d, 0xe4, 0xd5, 0xc8, 0x9c, 0x5a, 0x64, 0xa,
+ 0x2c, 0x46, 0x3b, 0x8b, 0xf7, 0x6, 0xf7, 0x0,
+ 0x1e, 0x13, 0xf4, 0xf7, 0x3c, 0xf7, 0x55, 0x15,
+ 0xab, 0x73, 0x6b, 0x94, 0x6a, 0x1b, 0xfb, 0x1f,
+ 0x34, 0x22, 0xfb, 0x15, 0xfb, 0x16, 0xe2, 0xfb,
+ 0xf, 0xf7, 0x1f, 0x1f, 0x13, 0xf8, 0xf7, 0x1c,
+ 0xe4, 0xf6, 0xf7, 0x26, 0xf7, 0x36, 0x4e, 0xf7,
+ 0x2e, 0x3b, 0xc6, 0x1f, 0xe7, 0xba, 0x5a, 0xa9,
+ 0x31, 0x5d, 0x55, 0xa8, 0x51, 0x98, 0x5b, 0x8f,
+ 0x19, 0x5d, 0x72, 0xb8, 0x83, 0xb9, 0x78, 0xb5,
+ 0x6c, 0x19, 0xfb, 0x9, 0x50, 0xbb, 0x6c, 0xf7,
+ 0x2, 0xc3, 0xb1, 0x66, 0xa9, 0x5c, 0x9d, 0x54,
+ 0x19, 0xe, 0x30, 0x82, 0x1d, 0xd5, 0xd9, 0x6e,
+ 0xd9, 0x12, 0xd5, 0x53, 0xa, 0x13, 0xdc, 0xa0,
+ 0x41, 0xa, 0x8d, 0x8b, 0xaa, 0xa3, 0x1a, 0x76,
+ 0xa, 0x36, 0x60, 0x4f, 0x73, 0x7d, 0x1e, 0x88,
+ 0x1d, 0xb3, 0x85, 0x98, 0x83, 0x5e, 0x1a, 0xfb,
+ 0xa9, 0x7, 0x5a, 0x7a, 0x8a, 0x67, 0x84, 0x1e,
+ 0xd6, 0xf8, 0x97, 0x45, 0x1d, 0xa6, 0xa3, 0x80,
+ 0x80, 0xa3, 0x1f, 0x13, 0xec, 0x7e, 0xa6, 0xa5,
+ 0x7d, 0xa4, 0x1b, 0x13, 0x10, 0x42, 0xa, 0x6d,
+ 0x8f, 0xa, 0x6d, 0x50, 0x1d, 0xe, 0x65, 0xa,
+ 0xd7, 0x98, 0x1d, 0x5d, 0x1d, 0x3, 0xf7, 0x40,
+ 0xf7, 0x90, 0x78, 0x1d, 0xd7, 0xd5, 0xc8, 0x9c,
+ 0x5f, 0x64, 0xa, 0x27, 0x46, 0x3b, 0x8b, 0xf7,
+ 0x13, 0xf7, 0x0, 0x1e, 0xfb, 0x27, 0x75, 0x15,
+ 0xfb, 0x16, 0xe2, 0xfb, 0x6, 0x70, 0xa, 0xf7,
+ 0x4, 0x6f, 0xa, 0xf2, 0x70, 0x1d, 0xfb, 0x6,
+ 0xfb, 0x15, 0x1e, 0xf7, 0x8d, 0xf7, 0xbe, 0x56,
+ 0x1d, 0x49, 0xd7, 0x64, 0xbd, 0x70, 0xa6, 0x8,
+ 0xaa, 0x6c, 0x7c, 0x8c, 0x80, 0x1b, 0x65, 0x80,
+ 0x7f, 0xa, 0xa5, 0x75, 0xa4, 0x7b, 0x1f, 0xe,
+ 0x65, 0xa, 0xd7, 0x76, 0xf7, 0x4d, 0x32, 0xa,
+ 0xf7, 0x27, 0xf7, 0xbf, 0x28, 0x1d, 0x65, 0xa,
+ 0xd7, 0x76, 0xf7, 0x44, 0x32, 0xa, 0xc4, 0xf7,
+ 0xbf, 0x60, 0xa, 0x65, 0xa, 0xd5, 0xd9, 0x6e,
+ 0xd9, 0x12, 0x5d, 0x1d, 0x13, 0xdc, 0x25, 0xa,
+ 0xc0, 0xf7, 0xd4, 0x45, 0x1d, 0xa7, 0xa6, 0x7f,
+ 0x7f, 0xa4, 0x1f, 0x13, 0xec, 0x7f, 0xa4, 0xa3,
+ 0x7e, 0xa3, 0x1b, 0x13, 0x10, 0x42, 0xa, 0x6c,
+ 0x8f, 0xa, 0x6e, 0x50, 0x1d, 0xe, 0x65, 0xa,
+ 0xcc, 0xf7, 0x15, 0x12, 0xa4, 0xf7, 0x27, 0x30,
+ 0xf7, 0x15, 0xdc, 0xf7, 0x15, 0x30, 0xf7, 0x27,
+ 0x13, 0xf2, 0x25, 0xa, 0x13, 0xec, 0xc3, 0xf8,
+ 0x9, 0x2d, 0x1d, 0x3e, 0x6c, 0xef, 0x27, 0xf7,
+ 0x2a, 0xe5, 0xe2, 0x40, 0xcb, 0xef, 0xf7, 0x2c,
+ 0x27, 0xef, 0x12, 0xf7, 0x65, 0xf7, 0x2d, 0xfb,
+ 0x13, 0xef, 0x13, 0x5a, 0xad, 0xf7, 0x71, 0x15,
+ 0xf8, 0x8b, 0xcb, 0xfc, 0x8b, 0x6, 0x13, 0xa5,
+ 0xf7, 0x5d, 0xfb, 0x9e, 0x15, 0x6c, 0xa, 0xf8,
+ 0x68, 0x4, 0x6c, 0xa, 0xe, 0x44, 0x76, 0xd9,
+ 0xaa, 0xf7, 0xd9, 0x76, 0xf7, 0xd, 0xaa, 0xd7,
+ 0x77, 0x12, 0xa2, 0xf7, 0x27, 0xfb, 0x25, 0xf7,
+ 0x27, 0xf7, 0x31, 0xf7, 0x27, 0x13, 0xfd, 0xf7,
+ 0x41, 0xf7, 0x23, 0x15, 0x13, 0xfb, 0x8a, 0xa5,
+ 0x8b, 0xa4, 0xa9, 0x1a, 0xf7, 0x6, 0x90, 0xf3,
+ 0xd5, 0xad, 0x9f, 0x78, 0x62, 0x96, 0x1e, 0xfb,
+ 0x21, 0xfb, 0x83, 0x5, 0xfb, 0x21, 0xfb, 0x7f,
+ 0x15, 0xba, 0x6, 0xca, 0xf4, 0x5, 0x7a, 0xa9,
+ 0xb0, 0x81, 0xb3, 0x1b, 0xf7, 0x1c, 0xe4, 0xf4,
+ 0xf7, 0x19, 0xde, 0x69, 0xd7, 0x55, 0xb6, 0x1f,
+ 0xd4, 0xf7, 0xf, 0x5, 0x5d, 0x6, 0x4f, 0x26,
+ 0x5, 0x9b, 0x6e, 0x67, 0x94, 0x64, 0x1b, 0xfb,
+ 0x1f, 0x34, 0xfb, 0xc, 0xfb, 0x15, 0x3e, 0xaa,
+ 0x49, 0xc1, 0x5e, 0x1f, 0xd4, 0xb7, 0x15, 0xf7,
+ 0x22, 0xf7, 0x85, 0x5, 0x8d, 0x6, 0x8c, 0x72,
+ 0x8c, 0x67, 0x67, 0x1a, 0xfb, 0x13, 0x83, 0x3b,
+ 0x46, 0x64, 0x77, 0xa3, 0xb2, 0x81, 0x1e, 0xe,
+ 0x30, 0x7d, 0xcc, 0xf8, 0x2e, 0x77, 0xf7, 0x0,
+ 0x98, 0x1d, 0xcc, 0x53, 0xa, 0x3, 0x89, 0x1d,
+ 0x49, 0x89, 0xa, 0x8d, 0x28, 0xa, 0x5b, 0xf8,
+ 0x70, 0x26, 0xa, 0x30, 0x7d, 0xcc, 0xf8, 0x2e,
+ 0x77, 0xf7, 0x0, 0x98, 0x1d, 0xcc, 0x53, 0xa,
+ 0x3, 0x71, 0xa, 0x27, 0x1d, 0x6c, 0x7, 0xb4,
+ 0x84, 0x93, 0x7c, 0x38, 0xa, 0xfb, 0x2c, 0xf8,
+ 0x70, 0x28, 0x1d, 0x30, 0x7d, 0xcc, 0xf8, 0x2e,
+ 0x77, 0xf7, 0x0, 0x83, 0x1d, 0xcc, 0x53, 0xa,
+ 0x3, 0x2f, 0x1d, 0xfb, 0x84, 0xf8, 0x70, 0x29,
+ 0x1d, 0xe, 0x30, 0x7d, 0xcc, 0xf8, 0x7a, 0x9a,
+ 0x1d, 0xcc, 0xf7, 0x1f, 0x26, 0xf7, 0x13, 0xde,
+ 0xf7, 0x13, 0x29, 0xf7, 0x1f, 0x13, 0xe4, 0x2f,
+ 0x1d, 0x13, 0xd8, 0xfb, 0x84, 0xf8, 0xba, 0x15,
+ 0x6d, 0x1d, 0xf7, 0x66, 0x16, 0x6d, 0x1d, 0xe,
+ 0xfb, 0x61, 0xf7, 0x23, 0xf8, 0x9f, 0x77, 0xf7,
+ 0x0, 0x76, 0xf7, 0x4d, 0x77, 0x12, 0x9b, 0xf7,
+ 0xe, 0xfb, 0xe, 0xf8, 0x64, 0xfb, 0x2b, 0xf7,
+ 0x2b, 0x13, 0x8a, 0x13, 0x4, 0xf7, 0x80, 0x7e,
+ 0x15, 0x40, 0x72, 0x2f, 0xa, 0x5, 0x13, 0x72,
+ 0x9e, 0xbd, 0x9c, 0x8d, 0xa1, 0x8e, 0x8, 0x13,
+ 0x74, 0x4d, 0x1d, 0x13, 0xfa, 0x36, 0xa, 0xf7,
+ 0x4, 0xf7, 0x14, 0x28, 0x1d, 0x7c, 0xa, 0xf7,
+ 0x5f, 0x77, 0x1, 0xd6, 0xf7, 0x1f, 0xf7, 0x36,
+ 0xf7, 0x28, 0x3, 0x81, 0xa, 0x90, 0x1d, 0x6f,
+ 0x6a, 0xa0, 0xb3, 0x7b, 0x1e, 0x7a, 0x1d, 0x93,
+ 0xbe, 0x58, 0xa, 0x7c, 0x1f, 0x89, 0xf7, 0xad,
+ 0xfb, 0x56, 0x69, 0x6, 0xaf, 0x84, 0x9e, 0x87,
+ 0x5c, 0x1a, 0xfd, 0x4d, 0x92, 0xa, 0xfb, 0x61,
+ 0xf7, 0x23, 0xf8, 0xec, 0xf7, 0x15, 0x12, 0x9b,
+ 0xf7, 0x56, 0xfb, 0x15, 0xf7, 0x15, 0xdc, 0xf7,
+ 0x15, 0x13, 0xe8, 0xf7, 0x80, 0x7e, 0x15, 0x40,
+ 0x72, 0x2b, 0xa, 0x13, 0xd8, 0xa2, 0xf7, 0x5e,
+ 0x2d, 0x1d, 0x5d, 0xa, 0x1, 0xd0, 0x8a, 0xa,
+ 0x49, 0xa, 0xe, 0x9f, 0x8b, 0xaa, 0xf8, 0xf6,
+ 0x60, 0x1d, 0x38, 0x96, 0x1d, 0xf7, 0x59, 0x7,
+ 0xf7, 0xf, 0xd7, 0x5, 0xc8, 0x7, 0xfb, 0xf,
+ 0x3f, 0x5, 0xf7, 0x6a, 0x7, 0xc7, 0xaa, 0x9e,
+ 0xd1, 0x8e, 0x1e, 0xae, 0xfb, 0xf1, 0x68, 0x7,
+ 0xb8, 0x88, 0xb4, 0x7e, 0x49, 0x1a, 0xfb, 0xc9,
+ 0x7, 0x3a, 0x5a, 0x5, 0x4e, 0x7, 0xdc, 0xbc,
+ 0x5, 0x25, 0x7, 0x62, 0x6d, 0x87, 0x53, 0x8b,
+ 0xa, 0xfc, 0x5, 0x8b, 0xad, 0xf9, 0x16, 0x77,
+ 0x1, 0xce, 0x8a, 0xa, 0x9b, 0x16, 0x99, 0xa,
+ 0x64, 0x81, 0xaa, 0xa8, 0x1f, 0xf7, 0xd1, 0x7,
+ 0xec, 0xdb, 0x5, 0xbd, 0x7, 0x2a, 0x3b, 0x5,
+ 0xf7, 0x6b, 0x8d, 0xa, 0xfb, 0x68, 0x7, 0x32,
+ 0x43, 0x5, 0x59, 0x7, 0xe4, 0xd3, 0x5, 0xfb,
+ 0x78, 0x97, 0x1d, 0xf7, 0xf5, 0x8b, 0xa6, 0x70,
+ 0xae, 0x78, 0x76, 0xf7, 0xe6, 0xac, 0xf7, 0xa7,
+ 0xae, 0x73, 0xab, 0x12, 0xa1, 0xf7, 0x3e, 0xf7,
+ 0xac, 0xf7, 0x2f, 0x13, 0x97, 0xf8, 0x6c, 0xf7,
+ 0x68, 0x15, 0xfb, 0x14, 0x8b, 0x52, 0x21, 0x34,
+ 0x34, 0xa7, 0xf7, 0xa1, 0xf7, 0x9, 0x9f, 0xf7,
+ 0x67, 0xf7, 0x35, 0xee, 0x8b, 0x51, 0x30, 0x1e,
+ 0xf7, 0x2f, 0xfb, 0x3e, 0x15, 0xf7, 0xc, 0x93,
+ 0x46, 0x33, 0x98, 0x1f, 0xac, 0xf7, 0xe6, 0x6a,
+ 0x6, 0xfb, 0x2, 0x73, 0x8d, 0x65, 0xfb, 0xb,
+ 0x1b, 0xf7, 0x8d, 0x7, 0x13, 0x9b, 0xa3, 0x9b,
+ 0x8d, 0xc4, 0xf7, 0x43, 0x99, 0x42, 0x2e, 0x9a,
+ 0x1e, 0xaf, 0xf7, 0x5d, 0xfc, 0x30, 0x6, 0x13,
+ 0x37, 0x79, 0xfb, 0x4, 0x93, 0x79, 0x1b, 0xfb,
+ 0xc6, 0x57, 0xfb, 0x86, 0x2c, 0xfb, 0x79, 0xf7,
+ 0x19, 0xfb, 0xf, 0xf7, 0x5e, 0x1f, 0x13, 0x9b,
+ 0xc3, 0xa7, 0x90, 0xcf, 0x1b, 0xf8, 0x42, 0x6,
+ 0xb5, 0xf7, 0x67, 0x5, 0x70, 0x6, 0x13, 0x5b,
+ 0xfb, 0x33, 0x47, 0x2c, 0x7a, 0x2b, 0x1b, 0x47,
+ 0x8b, 0xa2, 0xa4, 0x1f, 0xe, 0xd6, 0x7d, 0xa9,
+ 0x6d, 0xd3, 0xf7, 0x4f, 0xb0, 0xf7, 0x36, 0xa8,
+ 0x12, 0xa1, 0xf7, 0x25, 0xf7, 0x1c, 0xf7, 0x1c,
+ 0xf7, 0x18, 0xf7, 0x11, 0x13, 0x7e, 0xf8, 0x50,
+ 0xf7, 0xae, 0x15, 0xe0, 0x8c, 0x8b, 0xd8, 0xc9,
+ 0x1b, 0xc4, 0x8f, 0x4e, 0x26, 0x8e, 0x1f, 0xfb,
+ 0x50, 0xfb, 0x8c, 0x15, 0x7a, 0x9a, 0xa5, 0x6c,
+ 0xda, 0x1b, 0xf6, 0xbe, 0xd4, 0xbd, 0xae, 0x1f,
+ 0x77, 0x9b, 0x5, 0x6a, 0x6e, 0x6e, 0x69, 0x4c,
+ 0x1b, 0xfb, 0x1, 0x87, 0xf7, 0xe, 0xcc, 0x8d,
+ 0x1f, 0xf7, 0x90, 0x6, 0xf7, 0xe, 0x89, 0x64,
+ 0xf5, 0xfb, 0x28, 0x1b, 0x4e, 0x5d, 0x6f, 0x76,
+ 0x70, 0x1f, 0x9b, 0x7b, 0x6a, 0xac, 0x38, 0x1b,
+ 0xfb, 0x19, 0x35, 0xfb, 0x2, 0xfb, 0x1c, 0xfb,
+ 0xd, 0xd9, 0xfb, 0xc, 0xf7, 0x21, 0xe2, 0xae,
+ 0xaa, 0x9c, 0x9f, 0x1f, 0x40, 0xf7, 0x7, 0x15,
+ 0x13, 0xbe, 0x4b, 0x7c, 0x46, 0x57, 0x5e, 0x6e,
+ 0x8b, 0xf7, 0x67, 0xf7, 0x3e, 0xa5, 0xba, 0xbb,
+ 0xc0, 0x99, 0x66, 0x2b, 0x1e, 0xe, 0x30, 0x78,
+ 0xac, 0xf8, 0x76, 0x76, 0xf7, 0x4d, 0xaa, 0xf7,
+ 0x73, 0x8e, 0xa, 0x17, 0x7c, 0x1d, 0x98, 0x94,
+ 0x1d, 0xc3, 0x1b, 0x13, 0xfc, 0x47, 0x1d, 0x13,
+ 0xbc, 0x85, 0xa, 0x80, 0x7d, 0x90, 0x91, 0x7b,
+ 0x1f, 0x95, 0x71, 0x68, 0x97, 0x5a, 0x46, 0x1d,
+ 0xf7, 0x59, 0xf8, 0x92, 0x35, 0xa, 0xfb, 0x96,
+ 0x7d, 0xad, 0x7f, 0x76, 0xf8, 0x59, 0xac, 0x12,
+ 0xa6, 0xef, 0xf7, 0x1e, 0xeb, 0x13, 0x78, 0xa4,
+ 0x7e, 0x15, 0xa4, 0x6, 0x9f, 0x95, 0x91, 0x93,
+ 0x96, 0x1b, 0x90, 0x9f, 0x82, 0x83, 0xa4, 0x1f,
+ 0x13, 0xb8, 0x85, 0x9f, 0xa4, 0x85, 0xa1, 0x1b,
+ 0xe8, 0xd5, 0xc6, 0xea, 0x1f, 0xf7, 0x38, 0xfb,
+ 0x7e, 0x74, 0xf1, 0x1a, 0xaa, 0xa2, 0xa5, 0xaf,
+ 0xc4, 0xbe, 0x60, 0x44, 0xa0, 0x1e, 0xa4, 0xf7,
+ 0x25, 0x75, 0x6, 0x83, 0x88, 0x87, 0x7f, 0x79,
+ 0x1b, 0x81, 0x7b, 0x91, 0x91, 0x77, 0x1f, 0x90,
+ 0x79, 0x76, 0x90, 0x75, 0x1b, 0x2f, 0x48, 0x50,
+ 0x33, 0x1f, 0xfb, 0x2e, 0xf7, 0x82, 0x91, 0x2f,
+ 0x1a, 0x6d, 0x76, 0x67, 0x59, 0xfb, 0x3, 0x73,
+ 0xf4, 0xa6, 0x85, 0x1e, 0x6f, 0x6, 0x13, 0x78,
+ 0xf7, 0xf, 0xf8, 0xc, 0x35, 0xa, 0xd6, 0x4e,
+ 0x1d, 0xd3, 0xf7, 0x15, 0x12, 0xf7, 0x68, 0xf7,
+ 0x15, 0x4c, 0xf7, 0x36, 0x79, 0xf7, 0x15, 0x13,
+ 0xe8, 0x69, 0x1d, 0x8d, 0xde, 0x1a, 0xf7, 0x42,
+ 0x7, 0xf7, 0x4b, 0xf7, 0xc1, 0x9f, 0xab, 0xb0,
+ 0x62, 0xa, 0xb0, 0x89, 0x64, 0x1a, 0xfb, 0x2a,
+ 0xfb, 0xa0, 0x5, 0x42, 0x1d, 0x13, 0xf4, 0xa6,
+ 0xf9, 0x9d, 0x2d, 0x1d, 0x8c, 0xa, 0xf7, 0x82,
+ 0x77, 0x1, 0xa7, 0xf8, 0xf2, 0x3, 0x39, 0xa,
+ 0xf7, 0x97, 0xf9, 0x66, 0x35, 0xa, 0x87, 0x1d,
+ 0xe3, 0x83, 0x1d, 0xb1, 0xa5, 0x87, 0xa, 0x6f,
+ 0x8e, 0x1d, 0x61, 0x8b, 0x62, 0x8c, 0xf7, 0x7b,
+ 0xf8, 0x27, 0x18, 0xa5, 0xfc, 0x7, 0x7, 0x84,
+ 0xfb, 0x22, 0x5, 0xa5, 0x6, 0xa5, 0xf7, 0x1,
+ 0xba, 0x8b, 0xf7, 0xa, 0x8c, 0xfb, 0x7e, 0xfc,
+ 0x25, 0x18, 0xf7, 0x2f, 0xf8, 0x88, 0x35, 0xa,
+ 0xfb, 0x1a, 0x76, 0xf8, 0xb9, 0xb9, 0xf7, 0x13,
+ 0xf7, 0x1f, 0x6d, 0xa9, 0x12, 0x8b, 0xf7, 0x0,
+ 0xd6, 0xf7, 0x1f, 0x13, 0xdc, 0xd5, 0xf8, 0x1e,
+ 0x15, 0xf7, 0x8, 0x6, 0x7e, 0xfc, 0x2a, 0x5,
+ 0x31, 0x88, 0x65, 0x74, 0x73, 0x1b, 0x7f, 0x81,
+ 0x93, 0x92, 0x1f, 0x98, 0x9d, 0x8d, 0xa5, 0x1a,
+ 0xad, 0x70, 0x9a, 0x70, 0x76, 0x6a, 0x7e, 0x5e,
+ 0x6a, 0xa0, 0x5f, 0xd3, 0x1e, 0x13, 0x54, 0xf7,
+ 0x1c, 0xc4, 0xf7, 0x23, 0xf7, 0x25, 0x9d, 0x1f,
+ 0x96, 0xe2, 0x8a, 0xc6, 0x93, 0xf7, 0x7, 0x8,
+ 0xf7, 0xe, 0xb9, 0xfb, 0xe, 0xe5, 0x6, 0xae,
+ 0x8b, 0xf7, 0x3, 0xcc, 0x9e, 0x8e, 0x7e, 0x89,
+ 0x1e, 0x85, 0x79, 0x77, 0x76, 0x1a, 0x13, 0xec,
+ 0x6f, 0xa5, 0x78, 0xa8, 0xa8, 0xa2, 0xa7, 0xab,
+ 0x1e, 0x13, 0x60, 0x9a, 0x7d, 0xcb, 0x2a, 0xfb,
+ 0x31, 0x73, 0xfb, 0x54, 0x41, 0x7f, 0x1e, 0xfb,
+ 0xc, 0x6, 0xe, 0xfb, 0xce, 0xf8, 0xb9, 0x83,
+ 0x1d, 0x89, 0xf8, 0xa4, 0x60, 0xa, 0xfb, 0xce,
+ 0xf8, 0xb9, 0x83, 0x1d, 0xf7, 0xc, 0xf8, 0xa4,
+ 0x52, 0xa, 0x51, 0x6, 0xfb, 0x3, 0x28, 0xfb,
+ 0x3, 0xee, 0x5, 0x52, 0x6, 0xe, 0xfb, 0xce,
+ 0xf8, 0xa4, 0xd7, 0x3f, 0xf7, 0x37, 0x12, 0x13,
+ 0x40, 0x9a, 0xf9, 0x47, 0x15, 0x21, 0xc5, 0x52,
+ 0xe8, 0xec, 0xc2, 0xca, 0xef, 0x1e, 0x5f, 0x6,
+ 0x13, 0x80, 0x6c, 0x83, 0x7c, 0x53, 0x37, 0x1b,
+ 0x13, 0x40, 0x30, 0x7f, 0xc6, 0xa7, 0x86, 0x1f,
+ 0xe, 0xfb, 0xce, 0xf8, 0xad, 0xf7, 0x16, 0x1,
+ 0xf2, 0xf7, 0x13, 0x3, 0xf2, 0xf8, 0xef, 0x15,
+ 0x66, 0xa6, 0x6e, 0xb0, 0xae, 0xa7, 0xa8, 0xb0,
+ 0xb0, 0x6f, 0xa6, 0x68, 0x67, 0x6f, 0x6f, 0x67,
+ 0x1e, 0xe, 0xfb, 0xce, 0xf8, 0xa3, 0xf7, 0x39,
+ 0xfb, 0x9, 0xf7, 0x9, 0xfb, 0x9, 0xf7, 0x39,
+ 0x12, 0xc7, 0xf7, 0x3a, 0xfb, 0x9, 0xf7, 0x9,
+ 0xfb, 0x9, 0xf7, 0x38, 0x13, 0x90, 0xc7, 0x94,
+ 0xa, 0x13, 0x24, 0xc5, 0xbb, 0xba, 0xc6, 0xc5,
+ 0x5c, 0xbc, 0x51, 0x1f, 0x13, 0x90, 0x51, 0x59,
+ 0x5b, 0x50, 0x1f, 0x13, 0x48, 0xbc, 0x16, 0x6b,
+ 0xa6, 0x71, 0xab, 0xab, 0xa5, 0xa5, 0xab, 0xab,
+ 0x71, 0xa6, 0x6b, 0x6b, 0x70, 0x70, 0x6b, 0x1e,
+ 0xe, 0xfb, 0xce, 0xfb, 0x41, 0xd0, 0xf7, 0x28,
+ 0x77, 0x1, 0xe5, 0xdf, 0x3, 0xf7, 0x31, 0xb7,
+ 0x15, 0x5b, 0x5f, 0x78, 0x5e, 0x5e, 0x1a, 0x46,
+ 0xd2, 0x7d, 0xb3, 0xad, 0xc9, 0xa6, 0xbb, 0xa1,
+ 0x1e, 0x75, 0xa1, 0x5, 0x7d, 0x75, 0x7e, 0x7d,
+ 0x74, 0x1b, 0x63, 0x72, 0x9d, 0xba, 0xa4, 0x98,
+ 0xb2, 0x8f, 0x9e, 0x1f, 0xe, 0xfb, 0xce, 0xf8,
+ 0xb7, 0xd9, 0x6e, 0xd9, 0x12, 0x13, 0x80, 0x7b,
+ 0xf8, 0xb7, 0x15, 0xb5, 0x6, 0x13, 0x40, 0x9d,
+ 0x8c, 0x9b, 0xaa, 0xab, 0x1b, 0xb5, 0xa4, 0x7b,
+ 0x7e, 0xa3, 0x1f, 0x80, 0x9e, 0x9d, 0x82, 0xa4,
+ 0x1b, 0x42, 0xa, 0x74, 0x74, 0x92, 0x94, 0x75,
+ 0x1f, 0x99, 0x68, 0x6c, 0x9e, 0x7a, 0x1b, 0x2f,
+ 0x78, 0x2f, 0x68, 0x84, 0x1f, 0xe, 0xfb, 0xce,
+ 0xf8, 0xa4, 0xf7, 0x4d, 0x1, 0x7e, 0xf8, 0xa4,
+ 0x15, 0xc0, 0x6, 0xf7, 0x25, 0x23, 0xa, 0xcc,
+ 0xfb, 0x31, 0x15, 0xc1, 0x22, 0xa, 0xe, 0xf7,
+ 0x49, 0xe5, 0x1, 0xf7, 0x49, 0x4, 0xf8, 0x88,
+ 0xca, 0xfc, 0x88, 0x6, 0xe, 0xf7, 0xf5, 0xf7,
+ 0x49, 0xe5, 0x1, 0xf7, 0x49, 0x4, 0xfa, 0x7c,
+ 0xc9, 0xfe, 0x7c, 0x6, 0xe, 0xfb, 0xce, 0xf8,
+ 0xd, 0x83, 0xa, 0xd1, 0xcf, 0x47, 0xf7, 0x4c,
+ 0x13, 0xd0, 0xf7, 0x8b, 0xf9, 0x31, 0x15, 0x5b,
+ 0xa, 0xa5, 0x4d, 0xd4, 0xb9, 0xb2, 0xa9, 0xbf,
+ 0xca, 0x5d, 0x9b, 0x6f, 0x1e, 0x13, 0xe0, 0x68,
+ 0xa, 0xe, 0xfb, 0xce, 0xf8, 0xd, 0x7b, 0xa,
+ 0xec, 0xf7, 0xf8, 0x15, 0x47, 0xa, 0xfb, 0xce,
+ 0xfb, 0x33, 0x7b, 0xa, 0xe1, 0xfb, 0x32, 0x15,
+ 0x96, 0x75, 0x5, 0x47, 0xa, 0xf7, 0xf8, 0xf7,
+ 0x35, 0xf7, 0x42, 0x77, 0x12, 0xab, 0xcf, 0x47,
+ 0xf7, 0x4c, 0xe1, 0xcf, 0x47, 0xf7, 0x4c, 0x13,
+ 0xd8, 0xf7, 0x65, 0xf9, 0x31, 0x15, 0x57, 0xa,
+ 0x13, 0xe4, 0x68, 0xa, 0xf7, 0xa2, 0x16, 0x57,
+ 0xa, 0x13, 0xe8, 0x68, 0xa, 0xe, 0xf8, 0xd,
+ 0x68, 0x1d, 0xf7, 0xc2, 0xf7, 0xf8, 0x15, 0x5f,
+ 0xa, 0x13, 0xe4, 0x3f, 0x1d, 0xfb, 0x97, 0x75,
+ 0x15, 0x5f, 0xa, 0x13, 0xd8, 0x3f, 0x1d, 0xe,
+ 0xfb, 0x33, 0x68, 0x1d, 0xf7, 0xb7, 0xfb, 0x32,
+ 0x15, 0x56, 0xa, 0x13, 0xe4, 0x3f, 0x1d, 0xfb,
+ 0xa2, 0x16, 0x56, 0xa, 0x13, 0xd8, 0x3f, 0x1d,
+ 0xe, 0xfb, 0x5, 0x76, 0xf8, 0xae, 0xf5, 0xf7,
+ 0x49, 0x77, 0x12, 0xf7, 0x56, 0xf7, 0x5, 0x46,
+ 0xa7, 0x13, 0xe8, 0xf7, 0x84, 0xfb, 0x1a, 0x15,
+ 0xa0, 0x6, 0x90, 0xf7, 0x2e, 0x90, 0xf7, 0x14,
+ 0xb4, 0xf6, 0x91, 0x98, 0x19, 0x8e, 0x91, 0x4d,
+ 0xa6, 0x8d, 0xf7, 0x25, 0x8, 0xa8, 0xa0, 0x83,
+ 0x83, 0x9d, 0x1f, 0x7f, 0xa4, 0x9f, 0x7d, 0xa7,
+ 0x1b, 0xaa, 0x9f, 0xa8, 0xa7, 0xa4, 0x7c, 0xa3,
+ 0x66, 0x71, 0x79, 0x7d, 0x7f, 0x6f, 0x1f, 0x7a,
+ 0x84, 0x76, 0x84, 0x6d, 0x87, 0x8a, 0xb3, 0x91,
+ 0xa4, 0x93, 0x9f, 0x8, 0x13, 0xf0, 0x99, 0xad,
+ 0x9e, 0x9b, 0xb1, 0x1a, 0xbb, 0x5f, 0x8f, 0x7e,
+ 0x61, 0x7d, 0x6a, 0x71, 0x67, 0xa0, 0x84, 0x98,
+ 0x62, 0x1e, 0x13, 0xe8, 0x91, 0x78, 0x8f, 0x72,
+ 0x65, 0x1a, 0x6d, 0x8d, 0x78, 0x92, 0x7b, 0x92,
+ 0x8, 0x98, 0x70, 0x7c, 0x9a, 0x6b, 0x1b, 0x66,
+ 0x7c, 0x72, 0x72, 0x6f, 0x9f, 0x6e, 0xaa, 0xae,
+ 0x96, 0x9a, 0x98, 0xa8, 0x1f, 0x9a, 0x92, 0x9f,
+ 0x91, 0xa9, 0x8d, 0x8, 0xfb, 0x26, 0x53, 0x72,
+ 0x8d, 0x85, 0x1e, 0x8e, 0x83, 0xb7, 0xfb, 0x5,
+ 0x8f, 0xfb, 0x14, 0x8, 0xe, 0xf7, 0x83, 0x8a,
+ 0x15, 0x87, 0x60, 0x63, 0x55, 0x63, 0x1a, 0x6b,
+ 0xa1, 0x6f, 0xac, 0xac, 0xa1, 0xa7, 0xab, 0xb3,
+ 0x63, 0xc1, 0x87, 0xb6, 0x1e, 0x67, 0x1d, 0x8e,
+ 0xad, 0xa0, 0xa9, 0xa7, 0x9e, 0x8, 0x5c, 0xaf,
+ 0x87, 0xb9, 0xbb, 0x1a, 0xbb, 0x8f, 0xb9, 0xba,
+ 0xaf, 0x1e, 0x6f, 0x9e, 0x76, 0xa9, 0x88, 0xad,
+ 0x8, 0x67, 0x1d, 0x8f, 0xb6, 0xb3, 0xc1, 0xb3,
+ 0x1a, 0xab, 0x75, 0xa7, 0x6a, 0x6a, 0x75, 0x6f,
+ 0x6b, 0x63, 0xb3, 0x55, 0x8f, 0x60, 0x1e, 0x67,
+ 0xa, 0x88, 0x69, 0x76, 0x6d, 0x6f, 0x78, 0x8,
+ 0xba, 0x67, 0x8f, 0x5d, 0x5b, 0x1a, 0x5b, 0x87,
+ 0x5d, 0x5c, 0x67, 0x1e, 0xa7, 0x78, 0xa0, 0x6d,
+ 0x8e, 0x69, 0x8, 0x67, 0xa, 0xe, 0xfb, 0xbd,
+ 0xf7, 0x6f, 0x76, 0xf7, 0xac, 0x77, 0x1, 0xae,
+ 0xf7, 0xe6, 0x15, 0x3c, 0xcb, 0x4e, 0xd7, 0xda,
+ 0xc8, 0xc8, 0xda, 0xd8, 0x4e, 0xca, 0x3c, 0x3f,
+ 0x4b, 0x4c, 0x3e, 0x1e, 0xe, 0xf7, 0xf5, 0x7e,
+ 0xf7, 0x3d, 0x1, 0xdd, 0xf7, 0x3d, 0xf7, 0x38,
+ 0xf7, 0x3d, 0xf7, 0x38, 0xf7, 0x3d, 0x14, 0x70,
+ 0xdd, 0xd4, 0x15, 0x4a, 0xa, 0xf7, 0xe1, 0x16,
+ 0x4a, 0xa, 0xf7, 0xe1, 0x16, 0x4a, 0xa, 0xe,
+ 0xf7, 0xf5, 0x7d, 0xa3, 0x87, 0x76, 0xf7, 0xe1,
+ 0xa3, 0x8a, 0x76, 0xb8, 0x76, 0xf7, 0xc8, 0xa3,
+ 0x8c, 0x77, 0x12, 0xa3, 0x97, 0xa, 0xa1, 0x97,
+ 0xa, 0xaf, 0x97, 0xa, 0x13, 0xad, 0xf8, 0xf7,
+ 0xec, 0xf7, 0x38, 0x15, 0x30, 0x1d, 0xf7, 0x70,
+ 0x16, 0x30, 0x1d, 0x13, 0x9d, 0xf8, 0xfd, 0x94,
+ 0xf7, 0xe2, 0x15, 0x30, 0x1d, 0x13, 0x6b, 0xf8,
+ 0x47, 0x76, 0x1d, 0xfb, 0xce, 0x82, 0xa, 0x1,
+ 0xbe, 0xf7, 0x75, 0x88, 0xa, 0x81, 0x95, 0x9b,
+ 0x7e, 0x96, 0x1b, 0x91, 0x90, 0x75, 0xa, 0x96,
+ 0x85, 0x8e, 0x85, 0x80, 0x79, 0x7e, 0x82, 0x81,
+ 0x1e, 0xfb, 0x5f, 0xfb, 0x38, 0x5, 0xe, 0xfb,
+ 0xce, 0x82, 0xa, 0x1, 0xf7, 0x26, 0x91, 0xa,
+ 0x80, 0x91, 0x88, 0x91, 0x96, 0x9d, 0x99, 0x93,
+ 0x95, 0x59, 0xa, 0x95, 0x81, 0x7b, 0x98, 0x80,
+ 0x1b, 0x84, 0x87, 0x86, 0x7e, 0x6d, 0xe6, 0x25,
+ 0xa6, 0x62, 0x1f, 0xe, 0xfc, 0x74, 0x94, 0x76,
+ 0xf9, 0x50, 0x77, 0x1, 0xfb, 0x2, 0x7f, 0x15,
+ 0xf8, 0x4b, 0xf9, 0x50, 0x5, 0x53, 0x6, 0xfc,
+ 0x4d, 0xfd, 0x50, 0x5, 0xe, 0xd6, 0x8b, 0xe7,
+ 0xf7, 0x3e, 0xb3, 0xe4, 0xb3, 0xe3, 0x76, 0xf7,
+ 0x34, 0xab, 0x1, 0xf6, 0xf7, 0x3b, 0x3, 0x94,
+ 0xf7, 0x9a, 0x15, 0xed, 0x6, 0xfb, 0x2a, 0x9a,
+ 0xf7, 0x31, 0xfb, 0x4, 0xf7, 0x15, 0x1b, 0xf7,
+ 0xb, 0xf3, 0xc0, 0xe2, 0xc5, 0x1f, 0x77, 0x95,
+ 0x5, 0x64, 0x51, 0x4c, 0x78, 0x51, 0x1b, 0xfb,
+ 0x6, 0x2c, 0xca, 0xf6, 0x84, 0x1f, 0xf7, 0xb8,
+ 0x6, 0x99, 0xb3, 0x5, 0xfb, 0xc7, 0x6, 0x8a,
+ 0x9c, 0x8a, 0x9a, 0x9a, 0x1a, 0x99, 0x8b, 0x98,
+ 0x8d, 0x9a, 0x1e, 0xf7, 0xd9, 0x6, 0x9a, 0xb3,
+ 0x5, 0xfb, 0xe3, 0x6, 0xf7, 0x20, 0x98, 0xc0,
+ 0xe2, 0xf5, 0x1b, 0xf7, 0x11, 0xc8, 0x4a, 0x2c,
+ 0x96, 0x1f, 0xa5, 0xf7, 0x26, 0x6, 0xa4, 0x49,
+ 0x4b, 0xa0, 0x23, 0x1b, 0xfb, 0x18, 0xfb, 0x1a,
+ 0x75, 0xfb, 0x81, 0x4d, 0x1f, 0x34, 0x6, 0x7c,
+ 0x63, 0x5, 0xeb, 0x6, 0x8a, 0x7d, 0x8a, 0x7c,
+ 0x7d, 0x1a, 0x7c, 0x8b, 0x7c, 0x8c, 0x7b, 0x1e,
+ 0x3b, 0x6, 0xe, 0xf7, 0xf5, 0xf7, 0xa4, 0xac,
+ 0x7e, 0x76, 0xf8, 0x8, 0xac, 0x73, 0xa3, 0x12,
+ 0xf7, 0x32, 0xe8, 0xf7, 0x8a, 0xa8, 0xf7, 0xc4,
+ 0xe8, 0x13, 0x9e, 0xf7, 0x0, 0xf7, 0xa4, 0x15,
+ 0xf7, 0x56, 0xac, 0x6, 0x57, 0x8f, 0x8c, 0x8f,
+ 0xb3, 0x1a, 0xf7, 0xbf, 0xb9, 0x7, 0xb3, 0x9d,
+ 0x6e, 0x68, 0x93, 0x1f, 0xa2, 0xe3, 0xfb, 0xfe,
+ 0x33, 0xa2, 0x6, 0xae, 0x93, 0x9c, 0xa8, 0xb3,
+ 0x1b, 0xb9, 0xfb, 0xbf, 0x6, 0x63, 0x8c, 0x87,
+ 0x58, 0x87, 0x1e, 0xf7, 0xe5, 0x6a, 0x15, 0xf7,
+ 0x19, 0xac, 0x6, 0x5c, 0x8e, 0x86, 0x91, 0xbd,
+ 0x1a, 0xf7, 0x5b, 0x8d, 0x7, 0x13, 0x6e, 0xf7,
+ 0x20, 0xfb, 0xb8, 0x5, 0x98, 0x6, 0xf7, 0x27,
+ 0xf7, 0xba, 0x5, 0x8d, 0xfb, 0x68, 0x6, 0x13,
+ 0xae, 0x63, 0x8d, 0x87, 0x57, 0x87, 0x1e, 0x6a,
+ 0xf7, 0x56, 0xac, 0x7, 0x57, 0x8f, 0x8c, 0x8f,
+ 0xb3, 0x1a, 0xf7, 0x86, 0x7, 0xab, 0x92, 0x99,
+ 0xba, 0x8d, 0x1e, 0xac, 0xfb, 0xa, 0x7, 0xfb,
+ 0x2b, 0xfb, 0xb5, 0xfb, 0x22, 0xf7, 0xb5, 0x5,
+ 0xfb, 0x1f, 0x6a, 0x6, 0xa8, 0xa6, 0x81, 0x6b,
+ 0x99, 0x1f, 0xfb, 0x81, 0x7, 0x59, 0x86, 0x85,
+ 0x5c, 0x88, 0x1e, 0xe, 0x3e, 0xf7, 0x65, 0xcb,
+ 0x1, 0xac, 0xf7, 0x65, 0x15, 0xf8, 0x8c, 0xcb,
+ 0xfc, 0x8c, 0x6, 0xe, 0x30, 0x8b, 0xad, 0xf8,
+ 0x13, 0xb7, 0xf7, 0x5c, 0xa9, 0x12, 0xd2, 0xf7,
+ 0x1f, 0xf7, 0x1e, 0xf7, 0x10, 0xfb, 0x10, 0xf7,
+ 0x1f, 0x13, 0xf8, 0x75, 0x1d, 0xf3, 0x7, 0xa9,
+ 0x8f, 0x7e, 0x76, 0x1f, 0xfb, 0xb8, 0x7, 0x73,
+ 0x8a, 0x6e, 0x5d, 0x87, 0x6a, 0xa, 0x13, 0xf4,
+ 0x65, 0x8c, 0x80, 0x9f, 0xaf, 0x1a, 0xf8, 0x12,
+ 0x7, 0x86, 0x56, 0x49, 0x84, 0x57, 0x1b, 0x21,
+ 0x6, 0xf7, 0x15, 0x88, 0xd2, 0xe0, 0xb7, 0x9b,
+ 0x78, 0x82, 0x1e, 0x87, 0x82, 0x7f, 0x73, 0x1a,
+ 0x5c, 0xbc, 0x84, 0x99, 0x1e, 0x13, 0xf8, 0x90,
+ 0xc8, 0x8c, 0xc7, 0xdf, 0xfb, 0x3a, 0x92, 0x7d,
+ 0xfb, 0x6c, 0x87, 0xfb, 0x38, 0x49, 0x8a, 0x7a,
+ 0xa, 0xe, 0x30, 0xa0, 0x76, 0xf8, 0x35, 0xb7,
+ 0xf7, 0x59, 0xac, 0x8a, 0x77, 0x12, 0xd2, 0x53,
+ 0xa, 0x13, 0xdc, 0x75, 0x1d, 0xf7, 0x1e, 0xfb,
+ 0xda, 0x7, 0x78, 0x8a, 0x6b, 0x5d, 0x85, 0x6a,
+ 0xa, 0x59, 0x8f, 0x8c, 0xb6, 0x95, 0x1a, 0xf8,
+ 0xeb, 0x78, 0x7, 0x5c, 0x6d, 0x5, 0x13, 0xec,
+ 0xaa, 0x47, 0x4e, 0x8b, 0x87, 0x1b, 0xfb, 0x52,
+ 0x72, 0xfb, 0x1a, 0x2b, 0x89, 0x7a, 0xa, 0xf7,
+ 0x58, 0xf8, 0x3f, 0x15, 0xc9, 0x7, 0xc6, 0x87,
+ 0xd7, 0xdd, 0xae, 0x9c, 0x84, 0x7b, 0x1e, 0x83,
+ 0x7e, 0x79, 0x7d, 0x1a, 0x78, 0x97, 0x7c, 0x94,
+ 0x89, 0x1e, 0x29, 0x7, 0xe, 0x78, 0x9e, 0xf8,
+ 0x61, 0x97, 0xf7, 0x5f, 0x9a, 0x6, 0xf7, 0xa0,
+ 0x92, 0x7, 0x1e, 0xa0, 0x39, 0x63, 0xff, 0xc,
+ 0x9, 0xb5, 0xa, 0xf7, 0x1d, 0xb, 0x8c, 0xc,
+ 0xe, 0xf8, 0x88, 0x14, 0xf9, 0x1b, 0x15, 0xaf,
+ 0x13, 0x0, 0x7a, 0x2, 0x0, 0x1, 0x0, 0x2d,
+ 0x0, 0x6e, 0x0, 0x74, 0x0, 0x81, 0x0, 0x86,
+ 0x0, 0xb2, 0x0, 0xb5, 0x0, 0xcf, 0x0, 0xd4,
+ 0x0, 0xe3, 0x0, 0xec, 0x0, 0xfa, 0x1, 0x3,
+ 0x1, 0xf, 0x1, 0x1a, 0x1, 0x40, 0x1, 0x58,
+ 0x1, 0x66, 0x1, 0x6e, 0x1, 0x73, 0x1, 0x84,
+ 0x1, 0x92, 0x1, 0xa5, 0x1, 0xdc, 0x1, 0xec,
+ 0x2, 0x21, 0x2, 0x2c, 0x2, 0x38, 0x2, 0x46,
+ 0x2, 0x4f, 0x2, 0x5f, 0x2, 0x88, 0x2, 0xb0,
+ 0x2, 0xbf, 0x2, 0xc4, 0x2, 0xcd, 0x2, 0xd6,
+ 0x2, 0xe0, 0x2, 0xf4, 0x2, 0xfb, 0x3, 0x9,
+ 0x3, 0xe, 0x3, 0x20, 0x3, 0x28, 0x3, 0x3b,
+ 0x3, 0x47, 0x3, 0x4c, 0x3, 0x58, 0x3, 0x60,
+ 0x3, 0x6f, 0x3, 0x78, 0x3, 0x7f, 0x3, 0x85,
+ 0x3, 0x9f, 0x3, 0xac, 0x3, 0xbb, 0x3, 0xd4,
+ 0x3, 0xe2, 0x3, 0xe7, 0x3, 0xf4, 0x3, 0xf9,
+ 0x4, 0x1, 0x4, 0x8, 0x4, 0x12, 0x4, 0x1a,
+ 0x4, 0x1e, 0x4, 0x27, 0x4, 0x30, 0x4, 0x36,
+ 0x4, 0x3c, 0x4, 0x47, 0x4, 0x5b, 0x4, 0x66,
+ 0x4, 0x71, 0x4, 0x78, 0x4, 0x7f, 0x4, 0x91,
+ 0x4, 0x9a, 0x4, 0xac, 0x4, 0xb2, 0x4, 0xb8,
+ 0x4, 0xc1, 0x4, 0xcb, 0x4, 0xdb, 0x4, 0xdf,
+ 0x4, 0xe8, 0x4, 0xf1, 0x4, 0xf6, 0x4, 0xfb,
+ 0x5, 0x9, 0x5, 0x17, 0x5, 0x1f, 0x5, 0x2c,
+ 0x5, 0x39, 0x5, 0x3e, 0x5, 0x42, 0x5, 0x4e,
+ 0x5, 0x5a, 0x5, 0x60, 0x5, 0x66, 0x5, 0x71,
+ 0x5, 0x7c, 0x5, 0x87, 0x5, 0x92, 0x5, 0x99,
+ 0x5, 0x9e, 0x5, 0xa2, 0x5, 0xa5, 0x5, 0xaf,
+ 0x5, 0xb9, 0x5, 0xc3, 0x5, 0xcd, 0x5, 0xd4,
+ 0x5, 0xde, 0x5, 0xe5, 0x5, 0xee, 0x5, 0xf7,
+ 0x6, 0x0, 0x6, 0x9, 0x6, 0xf, 0x6, 0x14,
+ 0x6, 0x19, 0x9b, 0x9b, 0xaa, 0xa7, 0xd3, 0x1e,
+ 0xf7, 0x75, 0x6, 0x99, 0x6b, 0xab, 0x4b, 0x70,
+ 0x1a, 0x6a, 0x79, 0x8a, 0x4d, 0x86, 0x1e, 0x68,
+ 0xf7, 0xd8, 0xae, 0x7, 0x5b, 0x89, 0x87, 0x95,
+ 0x7e, 0xaa, 0xfb, 0x9f, 0xf8, 0xfc, 0x18, 0x6f,
+ 0x6, 0xfb, 0x8f, 0xfc, 0xf8, 0xb, 0x15, 0xc3,
+ 0x85, 0xa5, 0x96, 0x37, 0x1a, 0xfb, 0xe5, 0x7,
+ 0xfb, 0x4d, 0xf7, 0x30, 0x50, 0xf7, 0x1c, 0xf7,
+ 0x36, 0xd2, 0xdd, 0xf7, 0x36, 0x1e, 0xf7, 0xe5,
+ 0x7, 0xcd, 0xa2, 0x90, 0x43, 0xa, 0x7d, 0x4e,
+ 0x1a, 0xfb, 0xe5, 0x7, 0x4b, 0x7e, 0xfb, 0x17,
+ 0xfb, 0x44, 0xfb, 0x24, 0x96, 0xf7, 0x1e, 0xc4,
+ 0x1e, 0xf7, 0xe5, 0x7, 0xe3, 0xaa, 0x7f, 0xcd,
+ 0x8e, 0x1e, 0xae, 0xfb, 0xe6, 0x7, 0xb, 0x6,
+ 0xf7, 0x22, 0x23, 0xa, 0xb, 0xe3, 0x5, 0xa3,
+ 0x9a, 0x9b, 0x95, 0xa7, 0x1a, 0xaf, 0x6c, 0x2c,
+ 0xa, 0xb, 0x44, 0x1d, 0x26, 0x1d, 0xb, 0xf7,
+ 0x40, 0xf7, 0x79, 0x78, 0x1d, 0xee, 0xd5, 0xc8,
+ 0x9c, 0x50, 0x64, 0xa, 0x36, 0x46, 0x3b, 0x8b,
+ 0xf3, 0xf7, 0x0, 0x1e, 0xfb, 0x27, 0x16, 0xfb,
+ 0x16, 0xe2, 0xfb, 0x5, 0x70, 0xa, 0xf7, 0x2,
+ 0x6f, 0xa, 0xf4, 0x70, 0x1d, 0xfb, 0x7, 0xfb,
+ 0x15, 0x1e, 0xb, 0x24, 0x1d, 0xe, 0x1, 0xf7,
+ 0x5, 0x7f, 0x1d, 0x9f, 0x16, 0xf7, 0xf2, 0xae,
+ 0x6, 0x34, 0x1d, 0xfb, 0xf2, 0x68, 0x7, 0x4b,
+ 0xa, 0x4d, 0x64, 0x87, 0x55, 0x86, 0x1e, 0xb,
+ 0x6b, 0x1d, 0x25, 0x1d, 0xb, 0x56, 0x1d, 0xfb,
+ 0x1d, 0xf7, 0x31, 0x5, 0x98, 0x80, 0x77, 0x9a,
+ 0x76, 0x1b, 0x65, 0xb, 0x23, 0x1d, 0xa1, 0x81,
+ 0x97, 0x83, 0x95, 0x1e, 0xb, 0x2f, 0xa, 0x9e,
+ 0xbd, 0x9c, 0x8d, 0xa1, 0x8e, 0x19, 0x4d, 0x1d,
+ 0x36, 0xa, 0xb, 0x93, 0x79, 0x81, 0x78, 0x89,
+ 0x71, 0x74, 0x1e, 0xb, 0x2c, 0x1d, 0xfb, 0xa9,
+ 0x7, 0x5b, 0x7a, 0x8b, 0x67, 0x82, 0x1e, 0xb,
+ 0x5, 0xc4, 0x6, 0xfb, 0xf, 0xf7, 0x44, 0x5,
+ 0x2f, 0x6, 0xb, 0x72, 0x4f, 0x69, 0x1b, 0x7f,
+ 0x86, 0x97, 0x90, 0x1f, 0x8f, 0x8e, 0x90, 0x94,
+ 0x1a, 0x9d, 0x80, 0xac, 0x5e, 0x4f, 0x85, 0x58,
+ 0x7d, 0x6b, 0xa6, 0x5d, 0xcc, 0xe9, 0xa0, 0xc4,
+ 0xf7, 0x19, 0xbd, 0x1e, 0xf7, 0x29, 0xf8, 0x17,
+ 0xb, 0x48, 0xa, 0xfb, 0x44, 0x78, 0xa, 0xfb,
+ 0x7f, 0x3c, 0x1d, 0xf7, 0x25, 0x5e, 0xa, 0xf7,
+ 0x1d, 0x5e, 0x1d, 0xfb, 0x1d, 0xfb, 0x6e, 0x1e,
+ 0xb, 0x7c, 0xa0, 0x5, 0x6c, 0x6c, 0x80, 0xb1,
+ 0x8f, 0x1a, 0xf7, 0x99, 0x7, 0xe9, 0xb, 0x77,
+ 0x1, 0x5d, 0x1d, 0x3, 0x25, 0xa, 0xb, 0x99,
+ 0xa, 0x2d, 0xa, 0xb, 0xfb, 0x7, 0x30, 0x2d,
+ 0xfb, 0x28, 0xfb, 0x3f, 0xf1, 0x41, 0xf0, 0xdb,
+ 0xc4, 0xab, 0xe8, 0xc8, 0xb, 0x52, 0xa, 0x52,
+ 0x6, 0xfb, 0x4, 0x28, 0xfb, 0x4, 0xee, 0x5,
+ 0x53, 0x6, 0xe, 0x3c, 0xfb, 0x77, 0x5, 0x3a,
+ 0xf7, 0x63, 0x80, 0x9b, 0x95, 0x1a, 0xa3, 0xa6,
+ 0x8c, 0xa5, 0x8d, 0x48, 0x1d, 0xb, 0xf8, 0x51,
+ 0xfc, 0xb2, 0x5, 0xa7, 0xf8, 0xce, 0x6, 0xbb,
+ 0x91, 0xab, 0xd3, 0x94, 0x1e, 0xae, 0xfb, 0x6b,
+ 0x68, 0x7, 0xdc, 0x85, 0x97, 0x74, 0x4f, 0x1a,
+ 0xfb, 0xc3, 0x89, 0x7, 0xfb, 0xef, 0xf8, 0x3f,
+ 0x5, 0xfb, 0x67, 0x72, 0x6, 0x98, 0x9b, 0x88,
+ 0x46, 0xc3, 0x1f, 0xfc, 0x64, 0x7, 0x49, 0x6f,
+ 0x84, 0x4f, 0x84, 0x1e, 0xb, 0x63, 0x1a, 0xfb,
+ 0x8a, 0x7, 0x44, 0xad, 0x4a, 0xf1, 0xce, 0xb9,
+ 0xb4, 0xa4, 0xa8, 0x1e, 0xb, 0xa7, 0x16, 0xf8,
+ 0xd8, 0x6, 0xa5, 0xf7, 0x85, 0x5, 0x67, 0x6,
+ 0x57, 0xfb, 0x66, 0x29, 0x8c, 0xfb, 0x73, 0x8e,
+ 0xf8, 0xf, 0xf9, 0x5, 0x18, 0x9b, 0xfc, 0xa0,
+ 0x7, 0x76, 0xfb, 0x62, 0x5, 0xb1, 0x6, 0x9d,
+ 0xbe, 0x9d, 0xdd, 0xd6, 0xa2, 0xac, 0x95, 0x8b,
+ 0x8b, 0xf7, 0x3d, 0x90, 0xfc, 0x12, 0xfd, 0x5,
+ 0x18, 0xb, 0xf7, 0x5f, 0xae, 0x6, 0x69, 0x8d,
+ 0x5b, 0x8e, 0xb1, 0x1a, 0xb, 0x9b, 0xb6, 0x9f,
+ 0xaf, 0xd5, 0x85, 0x55, 0x58, 0x1e, 0x53, 0x7,
+ 0xb, 0xf8, 0xdd, 0x6, 0xb3, 0xf7, 0x64, 0x5,
+ 0x6f, 0x6, 0xfb, 0x2b, 0x4c, 0x25, 0xb, 0xcc,
+ 0xf7, 0x12, 0x1a, 0xbf, 0x6e, 0xc9, 0x42, 0xb,
+ 0x5d, 0xa, 0xf7, 0x0, 0x98, 0x1d, 0xd0, 0x8a,
+ 0xa, 0x9b, 0x16, 0x99, 0xa, 0x2c, 0x1d, 0xb,
+ 0xf8, 0xee, 0x15, 0x72, 0x9f, 0x63, 0xb6, 0xb0,
+ 0xa6, 0xa8, 0xae, 0xaf, 0x6e, 0xa9, 0x68, 0x61,
+ 0x76, 0x63, 0x72, 0x1e, 0xf7, 0x66, 0x16, 0x72,
+ 0x9e, 0x63, 0xb6, 0xb0, 0xa7, 0xa8, 0xae, 0xaf,
+ 0x6d, 0xa9, 0x68, 0x61, 0x77, 0x63, 0x72, 0x1e,
+ 0xb, 0x15, 0xbc, 0x7b, 0xdc, 0x72, 0x3b, 0x1a,
+ 0x5b, 0x6a, 0x7a, 0x6b, 0x76, 0x7c, 0x9b, 0x9a,
+ 0x7a, 0x1e, 0x99, 0x7b, 0x78, 0x99, 0x71, 0x1b,
+ 0x76, 0x85, 0x78, 0x7d, 0x77, 0x1a, 0x55, 0xe4,
+ 0x8a, 0x94, 0xf7, 0x9, 0xda, 0xd4, 0xdf, 0xb8,
+ 0xb, 0x16, 0xf7, 0x85, 0xad, 0x6, 0x59, 0x1d,
+ 0xc1, 0x8c, 0x54, 0x6f, 0x1e, 0x4f, 0xa, 0xb,
+ 0x44, 0xa, 0x54, 0x1d, 0xb, 0xc2, 0x93, 0x1e,
+ 0x5b, 0x1d, 0xe1, 0x87, 0x97, 0xb, 0xe4, 0xa2,
+ 0xe7, 0xae, 0x94, 0x1f, 0x60, 0x6, 0xb, 0xe2,
+ 0x1e, 0xfb, 0x45, 0x16, 0xfb, 0x66, 0xf7, 0x29,
+ 0xb, 0x80, 0x7, 0xfb, 0x38, 0x4a, 0x5, 0x76,
+ 0x7, 0x93, 0xa1, 0xa1, 0x92, 0x95, 0x1b, 0xa4,
+ 0x8b, 0x71, 0x7c, 0x1f, 0xb, 0x5f, 0xa, 0x13,
+ 0xd0, 0x3f, 0x1d, 0xe, 0xf7, 0x45, 0x3, 0xf7,
+ 0x68, 0xf7, 0xe4, 0x79, 0x1d, 0xf7, 0x44, 0x66,
+ 0x1d, 0xb, 0x9b, 0x16, 0x33, 0xa, 0xb, 0x5c,
+ 0xaf, 0x64, 0xbb, 0xba, 0xb1, 0xb1, 0xbb, 0xb9,
+ 0x65, 0xb0, 0x5c, 0x5b, 0x67, 0x65, 0x5e, 0x1e,
+ 0xb, 0xb9, 0x88, 0xba, 0x89, 0x49, 0x7e, 0xa,
+ 0xb, 0x59, 0xa, 0x94, 0x81, 0x7b, 0x99, 0x80,
+ 0x1b, 0x85, 0x86, 0x87, 0x7d, 0x6d, 0xe6, 0x25,
+ 0xa6, 0x62, 0x1f, 0xb, 0xf7, 0x38, 0xf7, 0xae,
+ 0x15, 0xf7, 0x1e, 0xad, 0xa1, 0xb0, 0xdb, 0xb,
+ 0x56, 0x1d, 0xf7, 0x4, 0xb, 0xfb, 0x7c, 0x7,
+ 0x66, 0x7d, 0x7a, 0x6a, 0x88, 0x6a, 0xa, 0x5a,
+ 0xb, 0x76, 0xf7, 0xbb, 0xf7, 0x54, 0x6b, 0xab,
+ 0xb, 0x9f, 0x8b, 0xaa, 0xf7, 0xbe, 0xad, 0xf7,
+ 0x19, 0x76, 0xc5, 0x76, 0xf7, 0x16, 0xad, 0xb,
+ 0x15, 0xe7, 0x6, 0xf7, 0xf, 0xf7, 0x44, 0x5,
+ 0xb, 0xf7, 0x1f, 0xf7, 0x1e, 0xf7, 0x1f, 0xb,
+ 0x8a, 0x1d, 0xf7, 0x36, 0xb2, 0xb, 0xfb, 0x5a,
+ 0xfb, 0x5a, 0xfb, 0x2a, 0xfb, 0x31, 0xfb, 0x5b,
+ 0x1e, 0xd2, 0x16, 0xf7, 0x39, 0xf7, 0xc, 0xf7,
+ 0x1f, 0xf7, 0x31, 0xf7, 0x31, 0xf7, 0xb, 0xb,
+ 0x96, 0x75, 0x5, 0x43, 0x1d, 0x6e, 0x57, 0x4c,
+ 0xb9, 0x7a, 0xa7, 0x1e, 0xb, 0x5b, 0xa, 0xa8,
+ 0x4d, 0xd4, 0xb9, 0xaf, 0xa9, 0xbf, 0xca, 0x5d,
+ 0x9b, 0x6f, 0x1e, 0xb, 0x1a, 0xf7, 0x34, 0x7,
+ 0x6a, 0xad, 0xa7, 0x70, 0xc3, 0x1b, 0xf1, 0xe5,
+ 0xdc, 0xf7, 0x39, 0xf7, 0x36, 0x28, 0xd9, 0x37,
+ 0x3b, 0x6d, 0x5e, 0x6a, 0xb, 0x1e, 0xf7, 0x5f,
+ 0xf7, 0x38, 0x5, 0x8f, 0x7, 0xfb, 0x62, 0xf7,
+ 0x3a, 0x5, 0xb, 0x1, 0x5c, 0x1d, 0x3, 0xb,
+ 0x80, 0xa1, 0x5, 0x56, 0x6d, 0xfb, 0x5, 0x4a,
+ 0xfb, 0x12, 0x1a, 0x57, 0xb, 0xfb, 0x96, 0x4e,
+ 0x1d, 0xb, 0xfc, 0x5, 0xa0, 0x76, 0xf8, 0x61,
+ 0x77, 0xb, 0xf7, 0x66, 0xf7, 0x6e, 0xfb, 0x35,
+ 0xb, 0x43, 0x1d, 0x6d, 0x57, 0x4c, 0xb9, 0x7b,
+ 0xa7, 0x1e, 0xb, 0x4e, 0xa, 0xf1, 0xf7, 0x4,
+ 0x25, 0x7e, 0x1d, 0xa8, 0x67, 0x67, 0xb, 0x8f,
+ 0x9e, 0x8e, 0x19, 0x5b, 0x1d, 0xba, 0x88, 0xb,
+ 0x1, 0xed, 0xf7, 0x33, 0xf7, 0xd6, 0xb7, 0x3,
+ 0xb, 0xfb, 0x2e, 0xfb, 0x13, 0x83, 0xb, 0x7d,
+ 0xaa, 0xf8, 0x3d, 0xaa, 0xb, 0x7, 0xf7, 0x53,
+ 0xf7, 0xc1, 0x9f, 0xab, 0xa8, 0x62, 0xa, 0xb,
+ 0x5d, 0x62, 0xb3, 0x5c, 0x1b, 0x72, 0x71, 0x74,
+ 0x70, 0x70, 0xa5, 0x74, 0xa4, 0x1f, 0xba, 0xb4,
+ 0xb3, 0xb9, 0x1b, 0xb, 0x77, 0x75, 0x84, 0xa6,
+ 0xc3, 0xdc, 0xc4, 0xa7, 0x9e, 0x1f, 0xb, 0x15,
+ 0xc5, 0x6, 0xf8, 0x4b, 0xf9, 0x50, 0x5, 0x53,
+ 0x6, 0xb, 0x1e, 0x69, 0xf7, 0x7f, 0xad, 0x7,
+ 0xb, 0xd6, 0x78, 0xbc, 0xf8, 0xf7, 0xae, 0xb,
+ 0x6f, 0xa1, 0x75, 0xa7, 0xa7, 0xa1, 0xa1, 0xa7,
+ 0xa7, 0x75, 0xa1, 0x6f, 0x6f, 0x75, 0x75, 0x6f,
+ 0x1e, 0xb, 0x67, 0xa7, 0x81, 0x1d, 0x6f, 0x6e,
+ 0x67, 0x1e, 0xb, 0xb4, 0x6, 0x9c, 0xd3, 0xa6,
+ 0xf7, 0xc, 0xa2, 0x1a, 0xb6, 0x72, 0xa8, 0x63,
+ 0x63, 0x73, 0x6e, 0x60, 0xb, 0xf7, 0x19, 0xf7,
+ 0x1f, 0x2d, 0xb, 0xf7, 0x1f, 0xf7, 0x1c, 0xe4,
+ 0xb, 0x89, 0x1d, 0x4a, 0x89, 0xa, 0x8c, 0x6b,
+ 0x1d, 0xb, 0x77, 0x1, 0xf3, 0xf7, 0x36, 0xf7,
+ 0x2c, 0xaf, 0x3, 0xb, 0x8, 0xa6, 0x8c, 0x15,
+ 0xf7, 0x19, 0xf7, 0x3e, 0x5, 0x8d, 0xfb, 0x40,
+ 0xfb, 0x1b, 0x6, 0xb, 0x6e, 0xaf, 0xaf, 0xb,
+ 0x90, 0x98, 0x77, 0x1d, 0xe3, 0xf6, 0xa8, 0x1a,
+ 0xb, 0xf7, 0x7c, 0x7, 0xf7, 0x2, 0x3c, 0xb3,
+ 0x54, 0xb, 0xf7, 0x4c, 0x47, 0xcf, 0xb, 0xfb,
+ 0x26, 0x34, 0x85, 0xb, 0x66, 0x15, 0xf7, 0x90,
+ 0x6, 0xc1, 0x88, 0x7e, 0xf7, 0x42, 0xfb, 0x42,
+ 0x1b, 0xb, 0x1f, 0x52, 0x5f, 0xc4, 0xfb, 0xd7,
+ 0x6, 0x57, 0x76, 0x88, 0x67, 0x86, 0x1e, 0xb,
+ 0x83, 0xa, 0xda, 0x77, 0xa, 0x13, 0xe0, 0xb,
+ 0x30, 0xfb, 0x4c, 0x76, 0xf7, 0x54, 0xc2, 0xf8,
+ 0xa, 0x76, 0xa0, 0xc4, 0xb, 0xf8, 0x52, 0x76,
+ 0xf7, 0x60, 0xac, 0x88, 0x77, 0x12, 0xbc, 0xf7,
+ 0x45, 0xb, 0x1a, 0xfc, 0x64, 0x7, 0xb, 0x6d,
+ 0x7d, 0x74, 0xb, 0x66, 0x15, 0xf7, 0x95, 0x6,
+ 0xc1, 0x76, 0xf7, 0x42, 0xfb, 0x42, 0xb, 0xf7,
+ 0x6a, 0xf2, 0x15, 0xf7, 0x87, 0x7, 0x99, 0xb2,
+ 0xc3, 0xb8, 0xb, 0xc4, 0x76, 0xf8, 0xf, 0x77,
+ 0xb, 0x76, 0xf7, 0xe3, 0x77, 0x12, 0xb, 0xfb,
+ 0x83, 0x33, 0x4b, 0xfb, 0x4, 0x5b, 0x82, 0x9b,
+ 0xb3, 0xb, 0xf7, 0x6d, 0x63, 0x7, 0x78, 0x86,
+ 0x86, 0x7c, 0x74, 0x1b, 0xb, 0x5c, 0xaf, 0x65,
+ 0xbb, 0xba, 0xb1, 0xb0, 0xbb, 0xb9, 0x65, 0xb,
+ 0x3, 0xa0, 0x16, 0xf8, 0x13, 0x6, 0x9b, 0xf7,
+ 0x34, 0x5, 0xb, 0x15, 0xf7, 0x62, 0xfb, 0x3a,
+ 0x5, 0xb, 0x7, 0xc4, 0x9e, 0x99, 0xb, 0xf7,
+ 0x1f, 0x3, 0xb, 0x84, 0x1e, 0xe, 0x9f, 0x8b,
+ 0xae, 0xf8, 0x47, 0x77, 0xf7, 0x53, 0xae, 0xb,
+ 0xfb, 0x52, 0x69, 0x7, 0xbc, 0x8d, 0x5c, 0x80,
+ 0x1f, 0xb, 0x77, 0x12, 0xb7, 0xf7, 0x1, 0xf7,
+ 0x85, 0xf7, 0xb, 0xb, 0x74, 0x93, 0x95, 0x78,
+ 0x1f, 0x99, 0x6f, 0x76, 0x9c, 0xb, 0xfb, 0xce,
+ 0xf8, 0xb9, 0x98, 0x1d, 0xb, 0xf7, 0x74, 0x15,
+ 0x6d, 0x65, 0x33, 0x20, 0x6e, 0x1a, 0xb, 0x7,
+ 0x62, 0x81, 0x81, 0x5d, 0x8b, 0xa, 0xf7, 0x3d,
+ 0x1, 0xb4, 0xf7, 0x3d, 0x3, 0xb4, 0xb, 0xf9,
+ 0xd, 0x15, 0x4f, 0xbc, 0x5d, 0xc5, 0x1e, 0xb,
+ 0x3e, 0x98, 0x76, 0xf8, 0x9e, 0x77, 0x1, 0xaa,
+ 0xb, 0xfb, 0x55, 0xfb, 0x35, 0xfb, 0x17, 0xfb,
+ 0x6e, 0xb, 0xf7, 0x6, 0xd1, 0xf7, 0x6, 0xb,
+ 0x12, 0xa4, 0xf7, 0x1f, 0xb, 0xf7, 0x83, 0xad,
+ 0x6, 0xb
+ };
diff --git a/core/src/fxge/fontdata/chromefontdata/FoxitSerifBoldItalic.c b/core/src/fxge/fontdata/chromefontdata/FoxitSerifBoldItalic.c
new file mode 100644
index 0000000000..63f86960eb
--- /dev/null
+++ b/core/src/fxge/fontdata/chromefontdata/FoxitSerifBoldItalic.c
@@ -0,0 +1,2600 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+const unsigned char g_FoxitSerifBoldItalicFontData [20733] = {0x1,
+ 0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0x19,
+ 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x72,
+ 0x69, 0x66, 0x4f, 0x54, 0x46, 0x2d, 0x42, 0x6f,
+ 0x6c, 0x64, 0x49, 0x74, 0x61, 0x6c, 0x69, 0x63,
+ 0x0, 0x1, 0x1, 0x1, 0x29, 0xf8, 0x10, 0x0,
+ 0xf8, 0x1c, 0x1, 0xf8, 0x1d, 0x2, 0xf8, 0x1e,
+ 0x3, 0xf8, 0x14, 0x4, 0x7d, 0xc, 0x2, 0xfb,
+ 0x5c, 0xfb, 0x8e, 0xfa, 0x6e, 0xf9, 0xf9, 0x5,
+ 0x1c, 0x6, 0xf6, 0xf, 0x1c, 0x8, 0x4d, 0x11,
+ 0xb7, 0x1c, 0x4a, 0x64, 0x12, 0x0, 0x4, 0x1,
+ 0x1, 0x5, 0x2f, 0x4a, 0x59, 0x45, 0x75, 0x72,
+ 0x6f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x43, 0x68, 0x72, 0x6f, 0x6d,
+ 0x20, 0x53, 0x65, 0x72, 0x69, 0x66, 0x20, 0x4f,
+ 0x54, 0x46, 0x20, 0x42, 0x6f, 0x6c, 0x64, 0x20,
+ 0x49, 0x74, 0x61, 0x6c, 0x69, 0x63, 0x43, 0x68,
+ 0x72, 0x6F, 0x6D, 0x20, 0x53, 0x65, 0x72, 0x69,
+ 0x66, 0x20, 0x4f, 0x54, 0x46, 0x0, 0x71, 0x2,
+ 0x0, 0x1, 0x0, 0xf, 0x0, 0x18, 0x0, 0x1d,
+ 0x0, 0x30, 0x0, 0x43, 0x0, 0x50, 0x0, 0x5a,
+ 0x0, 0x61, 0x0, 0x6d, 0x0, 0x84, 0x0, 0x87,
+ 0x0, 0xc2, 0x0, 0xe0, 0x0, 0xe3, 0x0, 0xf7,
+ 0x1, 0xa, 0x1, 0x17, 0x1, 0x1f, 0x1, 0x32,
+ 0x1, 0x39, 0x1, 0x4a, 0x1, 0x6f, 0x1, 0x76,
+ 0x1, 0x89, 0x1, 0xab, 0x1, 0xb8, 0x1, 0xed,
+ 0x1, 0xf4, 0x1, 0xfe, 0x2, 0xe, 0x2, 0x1e,
+ 0x2, 0x26, 0x2, 0x35, 0x2, 0x47, 0x2, 0x59,
+ 0x2, 0x5f, 0x2, 0x6c, 0x2, 0x75, 0x2, 0x7e,
+ 0x2, 0x8d, 0x2, 0x96, 0x2, 0xa4, 0x2, 0xb2,
+ 0x2, 0xbd, 0x2, 0xca, 0x2, 0xd3, 0x2, 0xdb,
+ 0x2, 0xfb, 0x3, 0x5, 0x3, 0xb, 0x3, 0x12,
+ 0x3, 0x2e, 0x3, 0x36, 0x3, 0x3e, 0x3, 0x44,
+ 0x3, 0x4b, 0x3, 0x52, 0x3, 0x6c, 0x3, 0x7a,
+ 0x3, 0x80, 0x3, 0x84, 0x3, 0x8b, 0x3, 0xa1,
+ 0x3, 0xa4, 0x3, 0xad, 0x3, 0xb9, 0x3, 0xbf,
+ 0x3, 0xd3, 0x3, 0xe7, 0x3, 0xee, 0x3, 0xf3,
+ 0x4, 0x5, 0x4, 0xd, 0x4, 0x12, 0x4, 0x23,
+ 0x4, 0x30, 0x4, 0x34, 0x4, 0x39, 0x4, 0x49,
+ 0x4, 0x59, 0x4, 0x68, 0x4, 0x71, 0x4, 0x78,
+ 0x4, 0x7e, 0x4, 0x83, 0x4, 0x88, 0x4, 0x96,
+ 0x4, 0xa3, 0x4, 0xaa, 0x4, 0xb7, 0x4, 0xbf,
+ 0x4, 0xc4, 0x4, 0xd0, 0x4, 0xd6, 0x4, 0xd9,
+ 0x4, 0xdf, 0x4, 0xea, 0x4, 0xf5, 0x4, 0xfd,
+ 0x5, 0x2, 0x5, 0xc, 0x5, 0x16, 0x5, 0x20,
+ 0x5, 0x2a, 0x5, 0x2e, 0x5, 0x37, 0x5, 0x40,
+ 0x5, 0x49, 0x5, 0x4d, 0x5, 0x53, 0x5, 0x57,
+ 0x5, 0x5d, 0x5, 0x62, 0x66, 0xa9, 0x6d, 0xb0,
+ 0xb0, 0xa9, 0xa9, 0x36, 0x1d, 0x6d, 0x6d, 0x66,
+ 0x1e, 0xb, 0xe2, 0x5, 0xa2, 0x98, 0x9b, 0x96,
+ 0x25, 0x1d, 0xb, 0x15, 0xbc, 0x21, 0xa, 0xb,
+ 0x5c, 0x79, 0x9c, 0xa2, 0x90, 0x8d, 0x91, 0x8e,
+ 0x90, 0x3f, 0xa, 0x5c, 0x69, 0x85, 0x5e, 0x88,
+ 0x2c, 0xa, 0xb, 0x15, 0xf7, 0x58, 0xae, 0x6,
+ 0x23, 0x1d, 0xf7, 0x78, 0xf7, 0x69, 0x15, 0xf7,
+ 0x28, 0xf7, 0x87, 0x74, 0x1d, 0xe, 0xa2, 0x1a,
+ 0xab, 0x6f, 0x9a, 0x76, 0x75, 0x76, 0x74, 0x70,
+ 0x71, 0x1e, 0xb, 0xf7, 0x27, 0x5, 0x98, 0x80,
+ 0x79, 0xa0, 0x30, 0x1d, 0xb, 0x7b, 0xa, 0xfb,
+ 0x3, 0x26, 0x1d, 0xb, 0x44, 0xa, 0xfb, 0x3,
+ 0x8e, 0x7a, 0x4a, 0x6f, 0xa, 0x27, 0xa, 0xb,
+ 0x15, 0xc9, 0x8b, 0x60, 0x6b, 0x1f, 0x5d, 0x2e,
+ 0xfb, 0xa5, 0x38, 0xa, 0xcd, 0xf7, 0x78, 0xb3,
+ 0xf7, 0x1f, 0x97, 0x84, 0x55, 0xa, 0xb, 0x27,
+ 0x1d, 0xe, 0x15, 0x43, 0xb2, 0x51, 0xd7, 0xf7,
+ 0x6, 0xd9, 0xf7, 0xf, 0xf3, 0xd6, 0x63, 0xc3,
+ 0x3d, 0xfb, 0x0, 0x3a, 0xfb, 0xe, 0x21, 0x1e,
+ 0xf7, 0x9, 0xe3, 0x15, 0xac, 0x95, 0xa0, 0xdc,
+ 0xb6, 0x1b, 0xa4, 0x92, 0x74, 0x76, 0x6b, 0x6f,
+ 0x32, 0x81, 0x69, 0x1f, 0x6c, 0x82, 0x79, 0x3f,
+ 0x61, 0x1b, 0x75, 0x81, 0x9e, 0x9e, 0xac, 0xa2,
+ 0xe2, 0x95, 0xad, 0x1f, 0xb, 0xf7, 0xb2, 0xf7,
+ 0x2f, 0x15, 0x8d, 0x8a, 0x5, 0x81, 0x6d, 0x7f,
+ 0x69, 0x60, 0x1a, 0x53, 0xbf, 0x8b, 0x9a, 0xdf,
+ 0xc3, 0xea, 0xad, 0x9e, 0x1e, 0x76, 0x98, 0x5,
+ 0x7f, 0x8d, 0xb, 0x2b, 0xa, 0xe, 0x83, 0x6e,
+ 0x86, 0x79, 0x7b, 0x1a, 0x57, 0xbb, 0x7d, 0x9e,
+ 0xc8, 0xc4, 0xd5, 0xbf, 0xac, 0x1e, 0x76, 0x9a,
+ 0x5, 0xb, 0xfb, 0x5a, 0xfb, 0x27, 0x6a, 0x95,
+ 0x2a, 0xee, 0xde, 0xbe, 0xde, 0xb7, 0xa5, 0x1f,
+ 0xfb, 0x26, 0x8c, 0x15, 0xb, 0x70, 0x1b, 0x70,
+ 0x79, 0x73, 0x76, 0x76, 0xa0, 0x7a, 0x98, 0x82,
+ 0x1f, 0xb, 0x40, 0x1d, 0x83, 0x96, 0x89, 0x43,
+ 0xa, 0xb, 0xab, 0xc8, 0xf7, 0x67, 0xb2, 0xf7,
+ 0x23, 0x1f, 0x47, 0x7b, 0x2d, 0x82, 0x63, 0x88,
+ 0x8, 0x70, 0x7, 0xa8, 0xb, 0x65, 0x1d, 0xf7,
+ 0x71, 0x25, 0xa, 0xb, 0x74, 0x3d, 0xfb, 0x8e,
+ 0x5f, 0x1a, 0x73, 0x96, 0x60, 0xc5, 0xd5, 0xb5,
+ 0xc5, 0xd9, 0xbe, 0x1e, 0xb, 0xf7, 0x85, 0xf7,
+ 0x5, 0x15, 0x70, 0xf7, 0x2f, 0x6b, 0xf7, 0x27,
+ 0x78, 0xba, 0x66, 0x81, 0x55, 0x82, 0x51, 0x86,
+ 0x8, 0x70, 0x7, 0xb2, 0x95, 0x8b, 0xfb, 0x2c,
+ 0xad, 0x1f, 0x93, 0x67, 0xb0, 0xfb, 0x48, 0x5a,
+ 0x1a, 0xb, 0xb0, 0xb0, 0x6d, 0xa9, 0x66, 0x66,
+ 0xb, 0xf8, 0xbe, 0x6, 0xc6, 0xf7, 0x56, 0x72,
+ 0x90, 0x5, 0xfb, 0x12, 0x46, 0xfb, 0x4, 0x62,
+ 0xfb, 0xc, 0x1b, 0xb, 0x1b, 0x63, 0x7e, 0x66,
+ 0x79, 0x70, 0xa1, 0x6a, 0xb0, 0xee, 0xe3, 0xeb,
+ 0xf7, 0x3d, 0xf1, 0x1f, 0x94, 0x9a, 0xf7, 0x15,
+ 0xf7, 0x64, 0xf7, 0x9, 0x1a, 0xac, 0x6d, 0xa8,
+ 0x6a, 0x6b, 0x73, 0x6c, 0x72, 0xb, 0x83, 0xba,
+ 0x2b, 0xf8, 0xe4, 0x18, 0x72, 0x6, 0xfc, 0x8,
+ 0xfc, 0xe4, 0xb, 0xf7, 0x3f, 0xf7, 0x2d, 0x15,
+ 0xe7, 0xe2, 0xf8, 0x28, 0xf7, 0x4c, 0xf3, 0x8c,
+ 0x20, 0x76, 0xfb, 0x8, 0x2d, 0xfc, 0x19, 0xfb,
+ 0x46, 0x50, 0x5e, 0xb0, 0x55, 0x1d, 0xd2, 0xfb,
+ 0x17, 0xf7, 0x3b, 0xf7, 0x8d, 0xf7, 0x45, 0xf7,
+ 0x9b, 0xf7, 0x56, 0xf7, 0x42, 0xfb, 0x19, 0xd1,
+ 0x5d, 0x1d, 0xfb, 0x78, 0xfb, 0x89, 0x1e, 0xb,
+ 0x5, 0xbe, 0x6, 0x35, 0x4e, 0xa, 0xb, 0x6c,
+ 0x1d, 0x53, 0x55, 0x73, 0x1b, 0x85, 0x32, 0xa,
+ 0xb, 0x1b, 0xe2, 0xa1, 0xdf, 0xae, 0x94, 0x1f,
+ 0x62, 0x6, 0x78, 0x82, 0x81, 0x74, 0x69, 0x1b,
+ 0xb, 0x1f, 0xdd, 0xf7, 0xb6, 0x9c, 0xcb, 0xa5,
+ 0x90, 0xbe, 0x8e, 0x19, 0xae, 0xfb, 0xcb, 0x7,
+ 0xb, 0x1b, 0x85, 0x88, 0x90, 0x94, 0x28, 0x1d,
+ 0xb, 0x3c, 0x41, 0x1f, 0xa6, 0x86, 0xb6, 0xf7,
+ 0x52, 0x5, 0xfc, 0xb0, 0x68, 0x6, 0xc9, 0xb,
+ 0x71, 0x9e, 0x61, 0xba, 0xb2, 0xa9, 0xa9, 0xaf,
+ 0xb0, 0x6c, 0xaa, 0x65, 0x5e, 0x76, 0x61, 0x73,
+ 0x1e, 0xb, 0x65, 0xa8, 0x6e, 0xb1, 0xb1, 0xa9,
+ 0xa8, 0xb1, 0xb1, 0x6d, 0xa9, 0x65, 0x65, 0x6e,
+ 0x6d, 0x65, 0x1e, 0xb, 0x15, 0x62, 0xa9, 0x45,
+ 0x1d, 0xb, 0xe9, 0xf7, 0xc8, 0x7d, 0x8a, 0x21,
+ 0x74, 0x32, 0x87, 0x6d, 0xa, 0xad, 0xb, 0x6a,
+ 0xb7, 0xb4, 0xac, 0xab, 0xb5, 0xb4, 0x6a, 0xb,
+ 0x15, 0x42, 0x1d, 0xf7, 0x68, 0x16, 0x42, 0x1d,
+ 0xe, 0x89, 0x7f, 0x1f, 0xfb, 0x14, 0xfc, 0x5e,
+ 0x7b, 0x52, 0x76, 0x82, 0x60, 0x85, 0x19, 0xb,
+ 0x1f, 0xd0, 0xf7, 0x9, 0x5, 0xf7, 0x6b, 0x6,
+ 0xb, 0xf7, 0x77, 0x70, 0xa, 0x8e, 0x88, 0x90,
+ 0x9d, 0xb6, 0xb4, 0x9b, 0x4a, 0xa, 0xb, 0x1f,
+ 0x51, 0xfb, 0x65, 0x5, 0x21, 0x6e, 0x64, 0xfb,
+ 0x1e, 0xfb, 0x23, 0x1b, 0xb, 0x65, 0xfb, 0x32,
+ 0xfb, 0x15, 0xfb, 0x3c, 0xfb, 0x2e, 0x1e, 0xb,
+ 0x15, 0xdd, 0x6, 0xf7, 0x36, 0xf7, 0x42, 0x5,
+ 0x53, 0x6, 0xfb, 0x1b, 0xb, 0x1, 0xf7, 0x6c,
+ 0xf7, 0x21, 0x15, 0x72, 0x88, 0xb, 0x88, 0xf7,
+ 0xb, 0xf7, 0x62, 0xf7, 0xb, 0xb, 0x2a, 0x7d,
+ 0x71, 0x92, 0xab, 0x1f, 0x7f, 0x57, 0x15, 0x7b,
+ 0xaa, 0x98, 0x85, 0xa4, 0x1b, 0xf7, 0x22, 0xf7,
+ 0x1a, 0xf7, 0x56, 0xf7, 0x2f, 0xe7, 0x58, 0xad,
+ 0x4f, 0x60, 0x54, 0x70, 0x3c, 0xb, 0xf7, 0x21,
+ 0xf7, 0x4a, 0x15, 0xf7, 0x55, 0xa9, 0xcb, 0xb,
+ 0x56, 0xa, 0xf8, 0x47, 0x77, 0xb, 0x1, 0x4e,
+ 0x1d, 0x3, 0xf7, 0x8, 0xb, 0x58, 0x8b, 0xab,
+ 0xf8, 0xee, 0xae, 0x1, 0x75, 0x16, 0xf8, 0xbd,
+ 0x6, 0xc6, 0xf7, 0x56, 0x73, 0x90, 0x5, 0xfb,
+ 0x11, 0x46, 0xfb, 0x4, 0x61, 0xfb, 0xc, 0x1b,
+ 0xb, 0x1b, 0x29, 0x78, 0xfb, 0x8, 0x89, 0x1f,
+ 0xe, 0xef, 0x1e, 0xfb, 0x24, 0xc4, 0x15, 0x2a,
+ 0xb, 0xb1, 0x90, 0x19, 0x61, 0xa, 0xb, 0x19,
+ 0xae, 0xfb, 0x64, 0x68, 0x7, 0xb, 0x7e, 0xd2,
+ 0x58, 0x76, 0xf8, 0x46, 0xb, 0x1, 0xf7, 0xd5,
+ 0xf7, 0x11, 0x3, 0xf7, 0x5, 0xc8, 0x15, 0xa4,
+ 0xbd, 0xf7, 0x42, 0xa2, 0xbb, 0x1e, 0xb1, 0x9d,
+ 0xb1, 0xb8, 0xb2, 0x1b, 0xa1, 0x9d, 0xb, 0x77,
+ 0x1, 0xf7, 0x77, 0xf9, 0x67, 0x5b, 0xa, 0xea,
+ 0xe3, 0x2c, 0x3b, 0x1d, 0xb, 0x58, 0x1d, 0xb0,
+ 0x90, 0x77, 0xb, 0x77, 0x52, 0x1d, 0xb, 0xfb,
+ 0x1, 0xfb, 0x6f, 0xfb, 0x5f, 0xb, 0x15, 0xf7,
+ 0x82, 0x6, 0xbe, 0xf7, 0x6, 0x5, 0x7b, 0x6,
+ 0x69, 0x75, 0x7b, 0x80, 0x57, 0x1b, 0x34, 0x8d,
+ 0x6, 0xf7, 0xf, 0xb, 0x26, 0x1d, 0xe, 0x4c,
+ 0x1d, 0x26, 0x30, 0xf0, 0x5, 0x59, 0x6, 0xe,
+ 0x15, 0xc5, 0x6, 0xf8, 0x47, 0xf9, 0x48, 0x5,
+ 0x8d, 0x51, 0x7, 0xb, 0xf7, 0x19, 0x1a, 0xdb,
+ 0x50, 0xb, 0xce, 0xaa, 0x97, 0xad, 0xa4, 0x1a,
+ 0xc3, 0x54, 0xa5, 0x61, 0x47, 0x62, 0x62, 0x64,
+ 0x71, 0x1e, 0x99, 0x7e, 0x5, 0xb, 0x1f, 0x3b,
+ 0xfb, 0xb3, 0xfb, 0x6b, 0xf8, 0x65, 0x5, 0xfb,
+ 0x57, 0x68, 0x6, 0xc0, 0x86, 0x96, 0x8f, 0x9e,
+ 0x5f, 0xb, 0xc7, 0x79, 0xad, 0xf9, 0xd, 0xad,
+ 0xb, 0xfc, 0x14, 0x97, 0x76, 0xb, 0x1f, 0xb1,
+ 0x70, 0x7e, 0x94, 0x79, 0x1b, 0x73, 0x7e, 0x79,
+ 0x70, 0x84, 0x90, 0x64, 0xdd, 0xf0, 0xe4, 0xb,
+ 0xfb, 0x6e, 0x7e, 0xcb, 0xf8, 0xe, 0xac, 0xb,
+ 0xf8, 0x1a, 0x62, 0xa, 0xb, 0x1e, 0xae, 0xfb,
+ 0xaf, 0x68, 0x7, 0xbb, 0x84, 0x92, 0x8a, 0x9d,
+ 0x54, 0xe3, 0xfb, 0x96, 0x18, 0xb, 0x19, 0xf7,
+ 0x78, 0xf7, 0x69, 0x15, 0xf7, 0x28, 0xf7, 0x87,
+ 0x74, 0x1d, 0xe, 0x77, 0x4d, 0x1d, 0xb, 0xf7,
+ 0x30, 0x35, 0xe1, 0xb, 0xef, 0xf7, 0xde, 0x5e,
+ 0x82, 0x66, 0x83, 0x2c, 0x7d, 0x19, 0x89, 0x76,
+ 0x5, 0xa8, 0xb3, 0xb, 0x15, 0xcb, 0xf7, 0x83,
+ 0x5, 0xa0, 0x8f, 0x91, 0xa2, 0xb2, 0x1b, 0xe0,
+ 0x8b, 0x23, 0x76, 0xb, 0xa7, 0x88, 0x5, 0xa3,
+ 0x94, 0x98, 0xb0, 0xb4, 0x1b, 0xf7, 0x25, 0x6,
+ 0xfb, 0xb8, 0xb, 0x15, 0xc1, 0x54, 0xc4, 0x51,
+ 0xbc, 0x56, 0x8, 0xb, 0xc0, 0x76, 0xf8, 0x13,
+ 0x77, 0x1, 0xb, 0x9b, 0xb5, 0x1b, 0xf7, 0x51,
+ 0xb, 0xb0, 0xfb, 0x87, 0x5, 0xb, 0xf7, 0xbc,
+ 0xae, 0x6, 0xb, 0x4a, 0xc1, 0x8b, 0x9b, 0xd9,
+ 0xba, 0xd8, 0xc1, 0xab, 0x1e, 0x75, 0x98, 0x5,
+ 0xb, 0x7d, 0x4e, 0x83, 0x41, 0x83, 0x6d, 0xa,
+ 0xad, 0x8c, 0xa8, 0x8b, 0x69, 0xb, 0x28, 0x30,
+ 0xee, 0x5, 0x59, 0x6, 0xe, 0xfb, 0x6e, 0xfb,
+ 0x61, 0xf7, 0x7, 0xf7, 0x5f, 0x77, 0xf8, 0x5,
+ 0x77, 0xb, 0x1a, 0xc3, 0xee, 0xbe, 0x9e, 0x95,
+ 0x1e, 0xb, 0xf7, 0x0, 0xa5, 0xa1, 0xb, 0x1a,
+ 0x86, 0x8b, 0x85, 0x89, 0x85, 0x1e, 0xfb, 0x19,
+ 0xfc, 0x65, 0xb, 0x45, 0x1d, 0xac, 0x62, 0x60,
+ 0xb, 0x3b, 0x1d, 0xe, 0xfb, 0xdd, 0xf8, 0xad,
+ 0x76, 0xb, 0x5, 0xb4, 0x96, 0xab, 0x88, 0x9a,
+ 0x1b, 0xf7, 0x35, 0x8c, 0xb, 0x1f, 0xab, 0x85,
+ 0xbe, 0xf7, 0x7e, 0x5, 0x6d, 0x6, 0x7b, 0xb,
+ 0x6d, 0xa, 0xac, 0xa9, 0x8d, 0x68, 0x1f, 0xe,
+ 0xf7, 0xb, 0x40, 0xd6, 0xb, 0x69, 0xa9, 0x79,
+ 0xa6, 0xb1, 0xa4, 0xa6, 0xb8, 0xb7, 0xb, 0x77,
+ 0x12, 0xf1, 0xf7, 0xd, 0xf7, 0x10, 0xf7, 0xd,
+ 0xb, 0xe3, 0x8b, 0xf7, 0x29, 0xfb, 0x22, 0x76,
+ 0xf1, 0xc8, 0xb, 0xfb, 0x61, 0xb0, 0xf7, 0x2f,
+ 0xae, 0xf8, 0x5, 0xd2, 0xb, 0x1b, 0x85, 0x87,
+ 0xb, 0x21, 0x97, 0x76, 0xa9, 0x76, 0xf8, 0x1a,
+ 0xd3, 0xb, 0x83, 0x93, 0x1b, 0x90, 0x8f, 0x8f,
+ 0x97, 0x1f, 0xb, 0xc7, 0x8b, 0xae, 0x6e, 0x76,
+ 0xf9, 0x1d, 0xae, 0xb, 0x83, 0x1d, 0x12, 0xb,
+ 0x76, 0xf9, 0x53, 0x77, 0x1, 0xb, 0x15, 0x75,
+ 0x1d, 0xb, 0x7e, 0xa8, 0xf8, 0x33, 0xa8, 0xb,
+ 0xa5, 0xaf, 0xa1, 0xa4, 0xb, 0x1, 0x0, 0x1,
+ 0x6, 0x0, 0x68, 0x0, 0x0, 0x9, 0x37, 0x0,
+ 0x7c, 0x0, 0x0, 0x42, 0x20, 0x0, 0x67, 0x0,
+ 0x0, 0x64, 0x0, 0x0, 0xa0, 0x0, 0x0, 0x66,
+ 0x0, 0x0, 0x83, 0x0, 0x0, 0xaa, 0x0, 0x0,
+ 0x8b, 0x0, 0x0, 0x6a, 0x0, 0x0, 0x97, 0x0,
+ 0x0, 0xa5, 0x0, 0x0, 0x80, 0x0, 0x0, 0xa1,
+ 0x0, 0x0, 0x9c, 0x0, 0x0, 0xa4, 0x0, 0x0,
+ 0xa9, 0x0, 0x0, 0x7d, 0x0, 0x0, 0x98, 0x0,
+ 0x0, 0x73, 0x0, 0x0, 0x72, 0x0, 0x0, 0x85,
+ 0x0, 0x0, 0x96, 0x0, 0x0, 0x8f, 0x0, 0x0,
+ 0x78, 0x0, 0x0, 0x9e, 0x0, 0x0, 0x9b, 0x0,
+ 0x0, 0xa3, 0x0, 0x0, 0x7b, 0x0, 0x0, 0xae,
+ 0x0, 0x0, 0xab, 0x1, 0x0, 0xb0, 0x0, 0x0,
+ 0xad, 0x0, 0x0, 0xaf, 0x0, 0x0, 0x8a, 0x0,
+ 0x0, 0xb1, 0x0, 0x0, 0xb5, 0x0, 0x0, 0xb2,
+ 0x2, 0x0, 0xb9, 0x0, 0x0, 0xb6, 0x2, 0x0,
+ 0x9a, 0x0, 0x0, 0xba, 0x0, 0x0, 0xbe, 0x0,
+ 0x0, 0xbb, 0x1, 0x0, 0xbf, 0x0, 0x0, 0xbd,
+ 0x0, 0x0, 0xa8, 0x0, 0x0, 0x8d, 0x0, 0x0,
+ 0xc4, 0x0, 0x0, 0xc1, 0x2, 0x0, 0xc5, 0x0,
+ 0x0, 0x9d, 0x0, 0x0, 0x95, 0x0, 0x0, 0xcb,
+ 0x0, 0x0, 0xc8, 0x1, 0x0, 0xcd, 0x0, 0x0,
+ 0xca, 0x0, 0x0, 0xcc, 0x0, 0x0, 0x90, 0x0,
+ 0x0, 0xce, 0x0, 0x0, 0xd2, 0x0, 0x0, 0xcf,
+ 0x2, 0x0, 0xd6, 0x0, 0x0, 0xd3, 0x2, 0x0,
+ 0xa7, 0x0, 0x0, 0xd7, 0x0, 0x0, 0xdb, 0x0,
+ 0x0, 0xd8, 0x1, 0x0, 0xdc, 0x0, 0x0, 0xda,
+ 0x0, 0x0, 0x9f, 0x0, 0x0, 0x93, 0x0, 0x0,
+ 0xe1, 0x0, 0x0, 0xde, 0x2, 0x0, 0xe2, 0x0,
+ 0x0, 0xa2, 0x0, 0x0, 0xe3, 0x0, 0x0, 0x91,
+ 0x0, 0x0, 0x8c, 0x0, 0x0, 0x92, 0x0, 0x0,
+ 0x8e, 0x0, 0x0, 0x94, 0x0, 0x0, 0xc0, 0x0,
+ 0x0, 0xdd, 0x0, 0x0, 0xc6, 0x1, 0x0, 0xe4,
+ 0x0, 0x0, 0x65, 0x0, 0x0, 0x7e, 0x0, 0x0,
+ 0x88, 0x0, 0x0, 0x81, 0x1, 0x0, 0x84, 0x0,
+ 0x0, 0x87, 0x0, 0x0, 0x7f, 0x0, 0x0, 0x86,
+ 0x0, 0x0, 0x6f, 0x0, 0x0, 0x89, 0x0, 0x0,
+ 0x41, 0x0, 0x0, 0x8, 0x0, 0x0, 0x75, 0x0,
+ 0x0, 0x69, 0x0, 0x0, 0x77, 0x0, 0x0, 0x76,
+ 0x0, 0x0, 0x70, 0x1, 0x0, 0x74, 0x0, 0x0,
+ 0x79, 0x1, 0x0, 0x6b, 0x1, 0x0, 0x63, 0x0,
+ 0x1, 0x87, 0x0, 0x0, 0x99, 0x0, 0x0, 0xa6,
+ 0x0, 0x0, 0x6d, 0x1, 0x0, 0xe6, 0x2, 0x0,
+ 0x1, 0x0, 0x4, 0x0, 0x7, 0x0, 0x5e, 0x0,
+ 0x9d, 0x1, 0x14, 0x1, 0xa9, 0x1, 0xe3, 0x2,
+ 0xb8, 0x2, 0xe4, 0x3, 0x17, 0x3, 0x49, 0x4,
+ 0x25, 0x4, 0x51, 0x4, 0x80, 0x4, 0x96, 0x4,
+ 0xa4, 0x4, 0xb9, 0x5, 0x3, 0x5, 0x44, 0x5,
+ 0x9a, 0x6, 0x2, 0x6, 0x47, 0x6, 0x98, 0x7,
+ 0x2, 0x7, 0x2e, 0x7, 0xae, 0x8, 0xe, 0x8,
+ 0x3a, 0x8, 0x8b, 0x8, 0xaf, 0x8, 0xd1, 0x8,
+ 0xf2, 0x9, 0x57, 0xa, 0x11, 0xa, 0x3b, 0xa,
+ 0xc1, 0xb, 0x17, 0xb, 0x57, 0xb, 0x76, 0xb,
+ 0xd9, 0xc, 0x5a, 0xc, 0xda, 0xd, 0x15, 0xd,
+ 0x74, 0xd, 0xed, 0xe, 0x14, 0xe, 0x94, 0xe,
+ 0xd1, 0xf, 0x14, 0xf, 0x6c, 0x10, 0x7, 0x10,
+ 0x7e, 0x10, 0xff, 0x11, 0x41, 0x11, 0x8c, 0x11,
+ 0xdb, 0x12, 0x59, 0x12, 0xd5, 0x13, 0x19, 0x13,
+ 0x1f, 0x13, 0x4d, 0x13, 0x64, 0x13, 0x95, 0x13,
+ 0xb6, 0x13, 0xc2, 0x13, 0xe4, 0x14, 0x1c, 0x14,
+ 0x6d, 0x14, 0xbc, 0x15, 0x38, 0x15, 0x70, 0x15,
+ 0xee, 0x16, 0x9b, 0x16, 0xff, 0x17, 0x1e, 0x17,
+ 0x72, 0x17, 0xd0, 0x18, 0x0, 0x18, 0xa0, 0x18,
+ 0xd3, 0x19, 0x10, 0x19, 0x45, 0x19, 0xb2, 0x19,
+ 0xfd, 0x1a, 0x64, 0x1a, 0xab, 0x1a, 0xd9, 0x1b,
+ 0x2d, 0x1b, 0xa5, 0x1c, 0x31, 0x1c, 0x53, 0x1c,
+ 0x97, 0x1c, 0xf5, 0x1d, 0x10, 0x1d, 0x6a, 0x1d,
+ 0xb5, 0x1e, 0x3, 0x1e, 0x79, 0x1f, 0x31, 0x1f,
+ 0xa7, 0x20, 0x30, 0x20, 0x5f, 0x21, 0x28, 0x21,
+ 0x42, 0x21, 0xdf, 0x22, 0x4d, 0x22, 0x81, 0x22,
+ 0xa0, 0x23, 0x55, 0x23, 0x69, 0x23, 0x9c, 0x23,
+ 0xdb, 0x23, 0xff, 0x24, 0x32, 0x24, 0x44, 0x24,
+ 0xc7, 0x25, 0x10, 0x25, 0x20, 0x25, 0x57, 0x25,
+ 0x90, 0x25, 0xca, 0x25, 0xf4, 0x26, 0x2e, 0x26,
+ 0x79, 0x26, 0xd3, 0x27, 0x34, 0x27, 0x51, 0x27,
+ 0x63, 0x27, 0x6f, 0x27, 0xcc, 0x27, 0xf5, 0x28,
+ 0x20, 0x28, 0xc6, 0x29, 0x5d, 0x29, 0x9b, 0x29,
+ 0xdf, 0x2a, 0x7, 0x2a, 0x36, 0x2a, 0x58, 0x2a,
+ 0x87, 0x2a, 0xab, 0x2a, 0xd1, 0x2b, 0x29, 0x2b,
+ 0x84, 0x2b, 0x8c, 0x2b, 0x94, 0x2b, 0xa5, 0x2b,
+ 0xd2, 0x2b, 0xf5, 0x2c, 0x25, 0x2c, 0xa4, 0x2c,
+ 0xcc, 0x2c, 0xf7, 0x2d, 0x24, 0x2d, 0x59, 0x2d,
+ 0x9f, 0x2e, 0x13, 0x2e, 0xb5, 0x2e, 0xde, 0x2e,
+ 0xf5, 0x2f, 0xb, 0x2f, 0x45, 0x2f, 0x67, 0x2f,
+ 0xd1, 0x30, 0x8a, 0x31, 0xe, 0x31, 0x1b, 0x31,
+ 0x24, 0x31, 0x3c, 0x31, 0x5f, 0x31, 0x6e, 0x31,
+ 0x82, 0x31, 0xa2, 0x31, 0xcb, 0x32, 0x31, 0x32,
+ 0x85, 0x32, 0x94, 0x32, 0xba, 0x32, 0xc7, 0x32,
+ 0xf4, 0x33, 0x15, 0x33, 0x47, 0x33, 0xbe, 0x33,
+ 0xdc, 0x33, 0xf0, 0x34, 0x6, 0x34, 0x22, 0x34,
+ 0x4d, 0x34, 0x7f, 0x34, 0xbb, 0x34, 0xc2, 0x35,
+ 0x4, 0x35, 0x50, 0x36, 0x3, 0x36, 0x9a, 0x37,
+ 0x2f, 0x37, 0x9c, 0x38, 0xb, 0x38, 0x19, 0x38,
+ 0x65, 0x38, 0xee, 0x38, 0xfe, 0x39, 0xa, 0x39,
+ 0x35, 0x39, 0x49, 0x39, 0x70, 0x39, 0xa3, 0x39,
+ 0xf1, 0x3a, 0x9, 0x3a, 0x1a, 0x3a, 0x2c, 0x3a,
+ 0x59, 0x3a, 0x7f, 0x3a, 0xa9, 0x3a, 0xe2, 0x3b,
+ 0x1b, 0x3b, 0x5b, 0x3b, 0xfb, 0x3c, 0xdb, 0x3c,
+ 0xfc, 0x3d, 0x34, 0x3d, 0x67, 0x3d, 0x7c, 0x3d,
+ 0x90, 0x3d, 0xaa, 0x3e, 0x30, 0x3e, 0xd6, 0x3e,
+ 0xe8, 0x3f, 0x9b, 0x40, 0x47, 0xfc, 0x30, 0xe,
+ 0xfc, 0x30, 0xe, 0xfb, 0xa5, 0x72, 0xf7, 0x24,
+ 0xfb, 0x18, 0xf7, 0x24, 0xf8, 0xb0, 0x77, 0xac,
+ 0x77, 0x12, 0xce, 0xf7, 0x28, 0x13, 0xa8, 0xf7,
+ 0x3b, 0xf7, 0x68, 0x15, 0xa8, 0x83, 0xd2, 0xf7,
+ 0x39, 0xd8, 0xf7, 0x2f, 0x97, 0xa9, 0x19, 0x93,
+ 0xa0, 0x91, 0xa0, 0x9d, 0x1a, 0x13, 0x98, 0xb4,
+ 0x71, 0xa8, 0x6b, 0x50, 0x6b, 0x38, 0x61, 0x85,
+ 0x1e, 0x7a, 0xfb, 0x7, 0x80, 0xfb, 0x15, 0x77,
+ 0x24, 0x8, 0x27, 0xfb, 0x2f, 0x15, 0x13, 0x68,
+ 0x64, 0xa8, 0x6c, 0xb7, 0xb8, 0xa9, 0xad, 0xaf,
+ 0xb1, 0x6a, 0xaf, 0x60, 0x6a, 0x64, 0x70, 0x5c,
+ 0x1e, 0xe, 0x20, 0xf8, 0x37, 0x76, 0xf7, 0xb3,
+ 0x77, 0x1, 0xf7, 0x1c, 0xf8, 0x22, 0x15, 0xb3,
+ 0x6, 0xde, 0xf7, 0x4e, 0x5, 0x91, 0x99, 0x90,
+ 0x9f, 0x9e, 0x1a, 0xa4, 0x7e, 0xa2, 0x66, 0x65,
+ 0x70, 0x68, 0x65, 0x88, 0x1e, 0xf7, 0x90, 0xfb,
+ 0x6a, 0x15, 0xb1, 0x6, 0xe0, 0xf7, 0x4e, 0x5,
+ 0x91, 0x98, 0x8e, 0x9d, 0x9c, 0x1a, 0xa6, 0x7b,
+ 0xa5, 0x6b, 0x65, 0x70, 0x68, 0x65, 0x88, 0x1e,
+ 0xe, 0xa0, 0x76, 0xf7, 0x66, 0xca, 0x4c, 0xd4,
+ 0xf7, 0x1a, 0xd4, 0x4c, 0xca, 0xf7, 0x66, 0x77,
+ 0x12, 0x13, 0xb4, 0x75, 0x16, 0xe0, 0xf7, 0x66,
+ 0x5, 0x2b, 0x6, 0x9f, 0xca, 0x5, 0xf1, 0x6,
+ 0xcb, 0xf7, 0x2e, 0x5, 0x25, 0x6, 0x9f, 0xca,
+ 0x5, 0xf7, 0x3, 0x6, 0xdc, 0xf7, 0x66, 0x5,
+ 0xd0, 0x6, 0x3b, 0xfb, 0x66, 0x5, 0xf7, 0x14,
+ 0x6, 0xdc, 0xf7, 0x66, 0x5, 0xd1, 0x6, 0x3b,
+ 0xfb, 0x66, 0x5, 0xdd, 0x6, 0x77, 0x4c, 0x5,
+ 0x30, 0x6, 0x13, 0xcc, 0x4b, 0xfb, 0x2e, 0x5,
+ 0xe6, 0x6, 0x77, 0x4c, 0x5, 0x2a, 0x6, 0x36,
+ 0xfb, 0x66, 0x5, 0x44, 0x6, 0xe0, 0xf7, 0x66,
+ 0x5, 0xfb, 0x14, 0x6, 0x36, 0xfb, 0x66, 0x5,
+ 0xf7, 0x3, 0xf7, 0xa5, 0x15, 0xf7, 0x14, 0x6,
+ 0xcb, 0xf7, 0x2e, 0x5, 0xfb, 0x14, 0x6, 0xe,
+ 0x3c, 0x76, 0xf0, 0xaa, 0xf8, 0xf1, 0xac, 0xca,
+ 0x77, 0x1, 0xda, 0xee, 0xf7, 0x25, 0xf7, 0x1,
+ 0x3, 0xf7, 0x13, 0x92, 0x15, 0x62, 0x96, 0x62,
+ 0x93, 0x4a, 0xc7, 0xb5, 0xf7, 0x22, 0x18, 0xa1,
+ 0x85, 0x8e, 0x2e, 0x98, 0x57, 0xd8, 0x68, 0x19,
+ 0xd5, 0xf7, 0x99, 0x5, 0x20, 0xd8, 0x72, 0xdd,
+ 0xc7, 0x1a, 0xe7, 0xcf, 0xc3, 0xf7, 0x19, 0x96,
+ 0x94, 0x8a, 0x8a, 0x98, 0x1e, 0x9d, 0xcc, 0x5,
+ 0xbd, 0x6, 0x77, 0x43, 0xb5, 0x86, 0xcc, 0x69,
+ 0xa8, 0x73, 0x19, 0x61, 0xfb, 0x19, 0x76, 0x90,
+ 0x8e, 0xb8, 0x8d, 0xe1, 0x33, 0xa3, 0x19, 0x50,
+ 0xfb, 0x79, 0x5, 0xdb, 0x46, 0xc7, 0x46, 0x32,
+ 0x1a, 0xfb, 0x1, 0x22, 0x50, 0xfb, 0x29, 0x1e,
+ 0x6f, 0x26, 0x5, 0x57, 0x6, 0xf7, 0x2a, 0xf8,
+ 0x9e, 0x15, 0xc2, 0xf7, 0x69, 0x5, 0x8e, 0x84,
+ 0x8d, 0x8a, 0x7c, 0x1b, 0x45, 0x68, 0x48, 0x5b,
+ 0x68, 0x9a, 0x71, 0xc2, 0x64, 0x1f, 0x4d, 0xfc,
+ 0x1a, 0x15, 0xe2, 0xbd, 0xc5, 0xda, 0xc6, 0x68,
+ 0x9c, 0x68, 0xa8, 0x1f, 0xe, 0xf7, 0x3f, 0x7d,
+ 0xa5, 0x85, 0x76, 0xf7, 0xe3, 0xa1, 0xf7, 0xc8,
+ 0xa5, 0x8c, 0x77, 0x12, 0xf7, 0x0, 0xdf, 0xf7,
+ 0x20, 0xdf, 0xc9, 0xdf, 0xf7, 0x20, 0xdf, 0x13,
+ 0xb7, 0x80, 0xf8, 0xe4, 0x7d, 0x3b, 0xa, 0xfc,
+ 0x9, 0xf7, 0xc8, 0x3b, 0xa, 0x13, 0x6f, 0x80,
+ 0xf8, 0xba, 0xf7, 0xdf, 0x15, 0x4f, 0x6, 0xfc,
+ 0xe9, 0xfd, 0x48, 0x5, 0xc7, 0x6, 0xe, 0xf7,
+ 0x8, 0x79, 0xd1, 0x45, 0xdc, 0x4e, 0x76, 0xca,
+ 0xaf, 0xc0, 0xaf, 0xf8, 0x74, 0xac, 0x12, 0xa5,
+ 0xf7, 0x19, 0xd6, 0xf7, 0xd, 0xf7, 0xe, 0xdb,
+ 0x75, 0xa1, 0x13, 0x3f, 0x80, 0xf8, 0x1a, 0xb7,
+ 0x15, 0x13, 0x4f, 0x80, 0x73, 0xa3, 0xb6, 0x65,
+ 0xd4, 0x1b, 0x13, 0x3f, 0x80, 0xe3, 0xb9, 0xc4,
+ 0xb4, 0xae, 0x1f, 0x71, 0xa0, 0x5, 0x13, 0x4f,
+ 0x40, 0x70, 0x7f, 0x75, 0x80, 0x72, 0x1b, 0x5c,
+ 0x52, 0xac, 0xb0, 0x73, 0x1f, 0xe3, 0xf7, 0xa,
+ 0x8a, 0x81, 0xa3, 0xa6, 0xb4, 0xba, 0x9b, 0x8e,
+ 0xb0, 0x93, 0x8, 0xae, 0xfb, 0x68, 0x68, 0x7,
+ 0xa6, 0x86, 0xa8, 0x89, 0x6a, 0x1a, 0x68, 0x61,
+ 0x61, 0x6b, 0x63, 0x1e, 0x6e, 0xb5, 0x5c, 0xf3,
+ 0x81, 0xdc, 0x8, 0xb8, 0x9e, 0xf7, 0x1d, 0xc0,
+ 0xf0, 0x1a, 0xc2, 0x5d, 0xc5, 0x2e, 0xfb, 0xb,
+ 0x4a, 0x2b, 0xfb, 0x2, 0x6a, 0x91, 0x6b, 0x90,
+ 0x70, 0x1e, 0xfb, 0x5, 0x4d, 0xfb, 0x13, 0x75,
+ 0xfb, 0x24, 0x1a, 0x13, 0x3f, 0x80, 0xfb, 0x30,
+ 0xf7, 0x23, 0x78, 0xb7, 0xb8, 0xd9, 0x92, 0xc3,
+ 0xd6, 0x1e, 0x6f, 0xaf, 0x15, 0x13, 0x8f, 0x80,
+ 0x80, 0x74, 0x6c, 0x7a, 0x60, 0x1b, 0x30, 0x67,
+ 0xdd, 0xc0, 0xe8, 0xc3, 0xac, 0xc6, 0xa9, 0x1f,
+ 0x13, 0x3f, 0x80, 0xab, 0xfb, 0x21, 0xb8, 0x43,
+ 0xab, 0x59, 0x8, 0x8f, 0xf7, 0xf6, 0x15, 0x84,
+ 0xb6, 0x87, 0xa5, 0xa3, 0x1a, 0xc8, 0x92, 0xc8,
+ 0xc3, 0xb4, 0x9d, 0x5b, 0x6b, 0x66, 0x78, 0x59,
+ 0x2f, 0x5b, 0x1e, 0xe, 0xfc, 0x14, 0xf8, 0x37,
+ 0x76, 0xf7, 0xb3, 0x77, 0x1, 0xf7, 0x21, 0xf7,
+ 0xb, 0x3, 0xf7, 0x3b, 0xf8, 0x22, 0x15, 0xe4,
+ 0xf7, 0x4e, 0x5, 0x92, 0x98, 0x90, 0x9c, 0x9e,
+ 0x1a, 0xa6, 0x7f, 0xa4, 0x64, 0x64, 0x71, 0x69,
+ 0x64, 0x88, 0x1e, 0x76, 0xfb, 0x6a, 0x5, 0xe,
+ 0x84, 0xa, 0xa7, 0xe9, 0x3, 0xf7, 0x3e, 0xfb,
+ 0x47, 0x15, 0xa2, 0x9a, 0x5, 0x70, 0xbb, 0x5f,
+ 0xf7, 0x26, 0xf7, 0x15, 0x1a, 0xf7, 0xd0, 0xf7,
+ 0x26, 0xf7, 0xe, 0xd7, 0xcf, 0x1e, 0x79, 0x9f,
+ 0x5, 0xfb, 0x9f, 0xfb, 0x4c, 0x6c, 0xfb, 0x6a,
+ 0xfb, 0x14, 0x1a, 0xfb, 0x51, 0xf0, 0x2f, 0xb4,
+ 0x52, 0x1e, 0xe, 0x84, 0xa, 0xf7, 0x45, 0xe9,
+ 0x3, 0x5f, 0xfb, 0x33, 0x15, 0xf7, 0x1f, 0xf7,
+ 0x1c, 0xdd, 0xf7, 0x2, 0xf7, 0x65, 0x1a, 0xdf,
+ 0x82, 0xf7, 0x57, 0x4c, 0xea, 0x1e, 0xa2, 0x9a,
+ 0x5, 0xdf, 0x22, 0xc6, 0xfb, 0x19, 0xfb, 0x2b,
+ 0x1a, 0xfb, 0x5e, 0xfb, 0xb, 0xfb, 0x30, 0xfb,
+ 0x47, 0xfb, 0x9, 0x1e, 0xe, 0xf7, 0xa2, 0x76,
+ 0xdf, 0xf7, 0x0, 0xc1, 0xf5, 0xdf, 0x77, 0x1,
+ 0xf7, 0x69, 0xee, 0xe9, 0xbd, 0x3, 0xf7, 0x87,
+ 0xf8, 0x54, 0x15, 0x6e, 0x78, 0x7c, 0x77, 0x7c,
+ 0x7a, 0x8, 0x76, 0x7b, 0x77, 0x65, 0x6b, 0x1b,
+ 0x72, 0x72, 0x9b, 0xaa, 0xbc, 0xaa, 0x92, 0xc7,
+ 0x8e, 0x1f, 0xab, 0x8e, 0xaa, 0x8e, 0x9a, 0x9e,
+ 0x8, 0x94, 0x7, 0x7b, 0x96, 0x63, 0x94, 0x72,
+ 0x8e, 0x8, 0x57, 0x93, 0x66, 0x87, 0xbd, 0x1a,
+ 0xa7, 0x97, 0xa2, 0xb6, 0xa7, 0x98, 0x6f, 0x71,
+ 0xa0, 0x1e, 0xa4, 0x6c, 0xa4, 0x70, 0x98, 0x8a,
+ 0x92, 0x90, 0x18, 0xb4, 0x81, 0xa0, 0x80, 0x9e,
+ 0x1e, 0x80, 0x9e, 0x82, 0x9a, 0xa3, 0x1a, 0xa3,
+ 0x97, 0xa8, 0xb0, 0xa7, 0xa0, 0x75, 0x6c, 0x74,
+ 0x82, 0x7d, 0x80, 0x78, 0x1e, 0x80, 0x78, 0x82,
+ 0x75, 0x60, 0x1a, 0x97, 0x86, 0xaa, 0xa0, 0x99,
+ 0x9f, 0x9b, 0xa2, 0x19, 0xa8, 0x9f, 0x96, 0xa0,
+ 0xac, 0x1b, 0xae, 0x9a, 0x6c, 0x7b, 0x5b, 0x5c,
+ 0x83, 0x5e, 0x88, 0x1f, 0x70, 0x8a, 0x6e, 0x85,
+ 0x76, 0x7b, 0x8, 0x81, 0x7, 0x9c, 0x7f, 0xa1,
+ 0x84, 0xaf, 0x88, 0x8, 0xb7, 0x88, 0xbd, 0x7d,
+ 0x63, 0x1a, 0x5f, 0x5e, 0x86, 0x86, 0x6c, 0x7f,
+ 0xa0, 0xb0, 0x70, 0x1e, 0x78, 0xa4, 0x7f, 0x9d,
+ 0x70, 0x98, 0x83, 0x85, 0x18, 0x68, 0x93, 0x76,
+ 0x93, 0x78, 0x1e, 0x97, 0x70, 0x95, 0x7e, 0x73,
+ 0x1a, 0x6f, 0x7b, 0x71, 0x6c, 0x72, 0x72, 0x99,
+ 0xb4, 0x8a, 0x1e, 0x8a, 0xa2, 0x99, 0x9a, 0x96,
+ 0xa2, 0x8, 0x94, 0x9e, 0x95, 0xa3, 0xaf, 0x1a,
+ 0xe, 0x2f, 0xa0, 0x76, 0xf7, 0x70, 0xcc, 0xf7,
+ 0x71, 0x77, 0x12, 0xf7, 0x83, 0xe5, 0x3b, 0xcb,
+ 0x13, 0xf0, 0xac, 0xf7, 0x70, 0x15, 0x13, 0xe8,
+ 0xf7, 0x6c, 0xfb, 0x70, 0xcb, 0xf7, 0x70, 0xf7,
+ 0x74, 0xcc, 0xfb, 0x74, 0xf7, 0x71, 0x4b, 0xfb,
+ 0x71, 0xfb, 0x6c, 0x6, 0xe, 0xfc, 0x30, 0xfb,
+ 0x35, 0x62, 0xa, 0x7f, 0x6d, 0x1d, 0x13, 0xd0,
+ 0x4f, 0x81, 0xa, 0xdf, 0x62, 0x1d, 0x9a, 0x70,
+ 0x1e, 0x13, 0xe0, 0x62, 0x6e, 0x6c, 0x61, 0x6d,
+ 0x9a, 0x7d, 0x9b, 0x7f, 0x1f, 0x13, 0xd0, 0x9e,
+ 0x7e, 0x9f, 0x81, 0x75, 0x1a, 0x53, 0x28, 0x57,
+ 0x78, 0x81, 0x1e, 0xe, 0xfb, 0xdd, 0xf7, 0x3a,
+ 0xf7, 0x8, 0x1, 0x8d, 0xf7, 0x3a, 0x15, 0xf7,
+ 0x88, 0x6, 0xa4, 0xf7, 0x8, 0x5, 0xfb, 0x87,
+ 0x6, 0xe, 0xfc, 0x30, 0x7e, 0xf7, 0x28, 0x1,
+ 0x82, 0xf7, 0x28, 0x3, 0x82, 0xc8, 0x3c, 0xa,
+ 0xfc, 0x14, 0x8e, 0x8d, 0x1d, 0x8d, 0x79, 0x15,
+ 0xf7, 0xe8, 0xf9, 0x53, 0x5, 0x45, 0x6, 0xfb,
+ 0xe4, 0xfd, 0x53, 0x5, 0xe, 0x7d, 0xa8, 0xf9,
+ 0x13, 0xa8, 0x1, 0xf8, 0xa, 0xf2, 0x3, 0x9c,
+ 0xf7, 0x63, 0x15, 0x30, 0xa4, 0xfb, 0x16, 0xf7,
+ 0x13, 0xf7, 0x38, 0xf7, 0x24, 0xf7, 0x82, 0xf7,
+ 0x7e, 0xf7, 0x15, 0x4b, 0xeb, 0x32, 0xfb, 0x47,
+ 0xfb, 0x14, 0xfb, 0xa2, 0xfb, 0x62, 0x1e, 0xf7,
+ 0x4c, 0xf7, 0x81, 0x15, 0xd5, 0xa2, 0xb6, 0xf7,
+ 0x1c, 0xc4, 0x1b, 0xb0, 0x98, 0x6b, 0x5a, 0x47,
+ 0x32, 0xfc, 0x7e, 0xfb, 0x8, 0xfb, 0xb, 0xf7,
+ 0x25, 0xf8, 0x2d, 0x9f, 0x91, 0x1f, 0xe, 0x8b,
+ 0xac, 0xf9, 0x1e, 0x77, 0x1, 0x90, 0x16, 0xf7,
+ 0xed, 0xac, 0x6, 0x53, 0x60, 0x8e, 0xa9, 0x8f,
+ 0x8c, 0x8f, 0x8c, 0x90, 0x1f, 0xf7, 0x3a, 0xf8,
+ 0xf0, 0x49, 0x7b, 0x52, 0x7d, 0xfb, 0x27, 0x75,
+ 0x19, 0x89, 0x74, 0x5, 0x8e, 0x9f, 0xa6, 0x8d,
+ 0x9f, 0x1b, 0x93, 0xae, 0x8a, 0x74, 0x88, 0x8b,
+ 0x87, 0x8a, 0x87, 0x1f, 0xfb, 0x18, 0xfc, 0x87,
+ 0x80, 0x61, 0x4c, 0x88, 0x5e, 0x8a, 0x19, 0xe,
+ 0x8b, 0xf7, 0x3, 0xdb, 0x77, 0xf8, 0x3a, 0xe5,
+ 0x1, 0xf7, 0xcc, 0xf7, 0x1a, 0x3, 0x70, 0x16,
+ 0xf8, 0x3, 0x6, 0xda, 0xf7, 0x53, 0x5, 0x72,
+ 0x6, 0x4d, 0x69, 0x73, 0x79, 0x3a, 0x1b, 0xfb,
+ 0x29, 0x6, 0xf7, 0x58, 0xf7, 0x3b, 0x5, 0xcf,
+ 0xc5, 0xd7, 0xd5, 0xda, 0x1a, 0xf7, 0x11, 0x51,
+ 0xd0, 0x22, 0xfb, 0x11, 0x49, 0x22, 0x50, 0x6f,
+ 0x1e, 0xa1, 0x7f, 0x5, 0xa0, 0x99, 0xb6, 0xcc,
+ 0xd7, 0x1b, 0xe8, 0x8b, 0x36, 0x78, 0x3e, 0x59,
+ 0x3f, 0x52, 0x45, 0x1f, 0x5a, 0x50, 0x8b, 0x8b,
+ 0xfb, 0x4b, 0xfb, 0x4b, 0x8, 0xe, 0x7e, 0xb3,
+ 0xeb, 0x77, 0xf8, 0x91, 0xd2, 0x12, 0xf7, 0xb1,
+ 0xf7, 0xf, 0x34, 0xf7, 0x15, 0x13, 0xf0, 0xf7,
+ 0x14, 0xf7, 0xef, 0x15, 0xef, 0xc4, 0x66, 0x27,
+ 0x2e, 0x58, 0x31, 0x51, 0x68, 0x76, 0xa4, 0xa4,
+ 0x77, 0x1f, 0xa2, 0x78, 0x7b, 0xa2, 0x74, 0x1b,
+ 0x7a, 0x63, 0x84, 0x56, 0x80, 0x92, 0x4a, 0xf7,
+ 0x14, 0xf7, 0x30, 0xf7, 0x18, 0xec, 0xf7, 0x12,
+ 0xf0, 0x6a, 0xc1, 0x5f, 0xab, 0x1f, 0x13, 0xe8,
+ 0xf1, 0xbe, 0x9c, 0xb7, 0xb5, 0x1a, 0xe7, 0x3a,
+ 0xc4, 0x4a, 0x23, 0x4c, 0x46, 0x4b, 0x63, 0x1e,
+ 0xa0, 0x7e, 0x5, 0xae, 0xa6, 0xa6, 0xb3, 0xcb,
+ 0x1b, 0xc9, 0xa2, 0x65, 0x63, 0xfb, 0x9, 0xfb,
+ 0x25, 0x63, 0x5f, 0x83, 0x1f, 0xe, 0xa0, 0x76,
+ 0xf7, 0x2a, 0xed, 0xf8, 0x47, 0x77, 0x1, 0xf7,
+ 0x50, 0xf7, 0x14, 0xf7, 0xd, 0xcd, 0x3, 0xf7,
+ 0x79, 0xf7, 0x2a, 0x15, 0x62, 0xfb, 0x2a, 0x5,
+ 0xf7, 0x14, 0x6, 0xb5, 0xf7, 0x2a, 0x5, 0xcf,
+ 0x6, 0xa6, 0xed, 0x5, 0x46, 0x6, 0xf7, 0xb,
+ 0xf8, 0x47, 0x5, 0x49, 0x6, 0xfc, 0x3c, 0xfc,
+ 0x40, 0x6f, 0x22, 0x5, 0xf7, 0xef, 0xf8, 0xb,
+ 0x15, 0x8d, 0x89, 0x3d, 0xfb, 0xa7, 0x5, 0xfb,
+ 0x5f, 0x6, 0xe, 0x7e, 0xb3, 0x63, 0xf7, 0x1c,
+ 0xf7, 0x8d, 0xf7, 0x4, 0xd7, 0xf7, 0x1, 0x12,
+ 0xf7, 0xc7, 0xf4, 0x13, 0xb8, 0xd4, 0xf8, 0x8,
+ 0x15, 0xf7, 0x2a, 0xdf, 0x38, 0x25, 0x40, 0x52,
+ 0x36, 0x3d, 0x6d, 0x7f, 0xa6, 0xa4, 0x7b, 0x1f,
+ 0x13, 0x78, 0xa2, 0x7d, 0x7a, 0xa0, 0x68, 0x1b,
+ 0x6f, 0x6c, 0x7b, 0x5f, 0x6d, 0xac, 0x5d, 0xeb,
+ 0xf7, 0x29, 0xf7, 0x25, 0xed, 0xf7, 0x3c, 0xe6,
+ 0x22, 0xf7, 0x20, 0xfb, 0x24, 0x1f, 0xad, 0xd7,
+ 0x5, 0xf7, 0x92, 0x6, 0xaf, 0xf7, 0x1, 0x5,
+ 0xfb, 0xaf, 0x6, 0xe, 0x7c, 0xab, 0xf8, 0x1,
+ 0xb2, 0xf7, 0x96, 0x77, 0x1, 0xa2, 0xf7, 0x4,
+ 0xf7, 0x34, 0xf7, 0x10, 0x3, 0xf7, 0x7b, 0xf8,
+ 0x2d, 0x15, 0xbb, 0xee, 0xdd, 0xe8, 0xf7, 0x28,
+ 0xc1, 0x85, 0xa3, 0x18, 0xfb, 0xdd, 0x5b, 0xfb,
+ 0x2b, 0xfb, 0x8c, 0xfb, 0x4a, 0x1a, 0x3f, 0x9f,
+ 0xfb, 0x20, 0xf7, 0x32, 0xf7, 0xf, 0xf7, 0xb,
+ 0xf7, 0x1, 0xf7, 0x30, 0xf7, 0x10, 0x4b, 0xba,
+ 0x4a, 0x6e, 0x6d, 0x88, 0x82, 0x73, 0x1e, 0x2b,
+ 0xfb, 0xce, 0x15, 0xc7, 0xa1, 0xd8, 0xa0, 0xc6,
+ 0x1e, 0xde, 0xab, 0x8d, 0x93, 0xb7, 0x1b, 0xca,
+ 0x8b, 0x58, 0x77, 0x3f, 0x59, 0xfb, 0x1c, 0x88,
+ 0x80, 0x1f, 0x5c, 0x79, 0x72, 0x73, 0x6c, 0x1b,
+ 0x53, 0x8a, 0xc0, 0xa4, 0x1f, 0xe, 0xa0, 0x76,
+ 0xf8, 0xc0, 0xf7, 0x5, 0x1, 0xde, 0xf8, 0x68,
+ 0x3, 0xf7, 0x24, 0x16, 0xf8, 0x11, 0xf9, 0x31,
+ 0x5, 0xfc, 0x11, 0x6, 0x34, 0xfb, 0x52, 0x5,
+ 0xa5, 0x6, 0xc8, 0xae, 0xa3, 0x9b, 0xf7, 0x1,
+ 0x1b, 0xf7, 0xf, 0x6, 0xfb, 0xd6, 0xfc, 0xc0,
+ 0x5, 0xe, 0x7e, 0xa9, 0xf9, 0xd, 0xac, 0x12,
+ 0x8e, 0xec, 0x94, 0xf7, 0x3, 0xe1, 0xf7, 0x5,
+ 0x67, 0xe8, 0x13, 0xf8, 0xf7, 0x4b, 0xf7, 0xe8,
+ 0x15, 0x59, 0x7a, 0xfb, 0x16, 0x5e, 0xfb, 0x14,
+ 0x1a, 0x6b, 0x9b, 0xfb, 0x17, 0xf7, 0x49, 0xf7,
+ 0x9, 0xf1, 0xdd, 0xf7, 0x11, 0xe5, 0x50, 0xca,
+ 0x70, 0xa8, 0x1e, 0x90, 0x7, 0x13, 0xf4, 0xd8,
+ 0xaa, 0xcd, 0xb6, 0xe2, 0x1a, 0xf7, 0x1, 0xfb,
+ 0xc, 0xab, 0x55, 0xfb, 0x2, 0x38, 0x39, 0x43,
+ 0x3e, 0xb4, 0x43, 0xac, 0x68, 0x1e, 0xa5, 0x73,
+ 0x15, 0x13, 0xf8, 0xd7, 0x31, 0xa0, 0x71, 0x4f,
+ 0x1a, 0x4c, 0x65, 0x4a, 0x47, 0x39, 0x79, 0xd7,
+ 0xb7, 0xea, 0xbe, 0xbd, 0xc5, 0xb2, 0x1e, 0xf0,
+ 0xdd, 0x15, 0x5b, 0xb8, 0x61, 0xb7, 0xc8, 0x1a,
+ 0xb5, 0xa2, 0xc2, 0xc6, 0x1e, 0x13, 0xf4, 0xba,
+ 0xad, 0x65, 0x45, 0x4b, 0x65, 0x65, 0x68, 0x66,
+ 0x1f, 0xe, 0x96, 0x76, 0xf7, 0x93, 0x77, 0xf8,
+ 0x3e, 0xab, 0x1, 0xf7, 0x45, 0xf7, 0xf8, 0x15,
+ 0xa0, 0x9e, 0xf7, 0x1c, 0xaf, 0xd1, 0x1e, 0xb2,
+ 0x9f, 0xa6, 0xa8, 0xad, 0x1b, 0xbe, 0x8a, 0x5c,
+ 0x6e, 0x88, 0x88, 0x2e, 0x63, 0x25, 0x1f, 0x37,
+ 0x6b, 0x7c, 0x86, 0x6c, 0x1b, 0x7c, 0x59, 0x8c,
+ 0xce, 0x1f, 0xfb, 0x4b, 0xfc, 0x2, 0x15, 0xf7,
+ 0xfc, 0xbe, 0xf7, 0xd, 0xf7, 0xa7, 0xf7, 0x2a,
+ 0x1a, 0xf7, 0x18, 0x57, 0xe0, 0xfb, 0x2, 0xfb,
+ 0x41, 0x34, 0xfb, 0x2f, 0xfb, 0x8, 0x28, 0xc7,
+ 0x47, 0xe6, 0xa6, 0x9b, 0x91, 0x93, 0x9d, 0x1e,
+ 0x55, 0xfb, 0x9, 0x21, 0x2c, 0xfb, 0x9, 0x6b,
+ 0x8, 0xe, 0xfb, 0xdd, 0x7e, 0xf7, 0x26, 0xf7,
+ 0x47, 0xf7, 0x27, 0x12, 0xa2, 0xf7, 0x28, 0x54,
+ 0xf7, 0x28, 0x13, 0xe0, 0xa2, 0xc8, 0x43, 0x1d,
+ 0xaa, 0x62, 0x60, 0x6c, 0x6b, 0x63, 0x1e, 0x13,
+ 0xd0, 0xe8, 0xf7, 0xd9, 0x43, 0x1d, 0xab, 0x62,
+ 0x60, 0x6c, 0x6a, 0x63, 0x1e, 0xe, 0xfb, 0xdd,
+ 0xfb, 0x36, 0x76, 0xf7, 0xd0, 0x77, 0xf7, 0x5b,
+ 0xf7, 0x27, 0x1, 0xa2, 0x6d, 0x1d, 0x4c, 0xf7,
+ 0x28, 0x3, 0x72, 0xfb, 0x33, 0x15, 0x9e, 0x96,
+ 0xee, 0xbc, 0xc4, 0x1a, 0xa2, 0x79, 0x93, 0x78,
+ 0x98, 0x1e, 0x7a, 0x97, 0x7b, 0x99, 0xaa, 0x1a,
+ 0xb6, 0xa8, 0xaa, 0xb4, 0xa7, 0xc5, 0x7a, 0x3c,
+ 0xfb, 0x18, 0xfb, 0x44, 0x37, 0x7c, 0x87, 0x1e,
+ 0xf7, 0x14, 0xf8, 0xcd, 0x15, 0xb3, 0xaa, 0xac,
+ 0xb6, 0xb4, 0xac, 0x6b, 0x62, 0x60, 0x6a, 0x6c,
+ 0x62, 0x5f, 0x6d, 0xac, 0xb4, 0x1e, 0xe, 0x2f,
+ 0x98, 0x76, 0xf8, 0x9e, 0x77, 0x1, 0xaa, 0xf8,
+ 0x90, 0x3, 0xf8, 0x7d, 0x83, 0x15, 0xcf, 0x7,
+ 0xfc, 0x6, 0xf7, 0x55, 0xf8, 0x38, 0xf7, 0x55,
+ 0x5, 0xcf, 0x7, 0xfc, 0x90, 0xfb, 0x7d, 0x5,
+ 0x53, 0x7, 0xe, 0x2f, 0xf1, 0xe5, 0xdd, 0xe4,
+ 0x67, 0xcf, 0x12, 0x13, 0xa0, 0xde, 0xf7, 0xdf,
+ 0x15, 0xf8, 0x5a, 0xcf, 0xfc, 0x5a, 0x6, 0x59,
+ 0xfb, 0xb8, 0x15, 0xf8, 0x5a, 0x6, 0x13, 0xc0,
+ 0xcc, 0xfc, 0x5a, 0x7, 0xe, 0x2f, 0x98, 0x76,
+ 0xf8, 0x9e, 0x77, 0x1, 0xf8, 0xaf, 0xf7, 0x75,
+ 0x15, 0xc3, 0x7, 0xfc, 0x5e, 0xf7, 0x7d, 0x5,
+ 0x47, 0x7, 0xf8, 0x6, 0xfb, 0x55, 0xfc, 0x38,
+ 0xfb, 0x55, 0x5, 0x47, 0x7, 0xe, 0x7e, 0xf7,
+ 0x28, 0xf7, 0xf5, 0xf7, 0x58, 0x6c, 0xaa, 0x12,
+ 0xda, 0xf7, 0x28, 0xfb, 0x0, 0xf7, 0xe, 0xf1,
+ 0xf7, 0x13, 0x13, 0xcc, 0xf7, 0x3b, 0xf7, 0x6b,
+ 0x15, 0xa8, 0x84, 0xa3, 0xc6, 0x9a, 0xaa, 0xb6,
+ 0xa7, 0x19, 0xf7, 0x19, 0xe2, 0xc6, 0xbc, 0xd9,
+ 0x1a, 0xba, 0x65, 0xec, 0xfb, 0x29, 0xfb, 0x1,
+ 0x54, 0x4d, 0x47, 0x67, 0xa5, 0x6d, 0xae, 0xab,
+ 0xa8, 0xa4, 0xad, 0x9f, 0x83, 0x98, 0x83, 0x95,
+ 0x1e, 0x84, 0x94, 0x85, 0x92, 0x94, 0x1a, 0x13,
+ 0xb4, 0xa0, 0xb6, 0x9c, 0xa7, 0xaa, 0xa8, 0x7b,
+ 0x49, 0x55, 0x71, 0x59, 0x3c, 0x2e, 0x1e, 0x4e,
+ 0x3f, 0x84, 0x59, 0x88, 0x6a, 0x8, 0x33, 0xfb,
+ 0x2e, 0x3c, 0xa, 0xf7, 0x3e, 0x79, 0xb9, 0xf7,
+ 0x6, 0xb0, 0x66, 0xbb, 0x5c, 0x77, 0xe7, 0x77,
+ 0xf7, 0xa4, 0xbb, 0xf7, 0x17, 0xb2, 0x12, 0xca,
+ 0xe6, 0xf7, 0xa, 0xd7, 0xf8, 0xc, 0xb9, 0x13,
+ 0xaf, 0xc0, 0xf7, 0xf0, 0xf7, 0xaa, 0x15, 0xf7,
+ 0xc, 0xe3, 0xd0, 0xbb, 0xa8, 0x9a, 0x75, 0x60,
+ 0xfb, 0x22, 0x40, 0x45, 0x5f, 0x6a, 0x6f, 0xa7,
+ 0xc7, 0x1e, 0xf7, 0x22, 0x4c, 0x15, 0x7e, 0xa2,
+ 0x4f, 0xcf, 0xf7, 0xd, 0xcf, 0xf7, 0x1e, 0xf3,
+ 0xf7, 0x40, 0xfb, 0x27, 0xf7, 0x15, 0xfb, 0x50,
+ 0xfb, 0x5c, 0xfb, 0x40, 0xfb, 0x28, 0xfb, 0x70,
+ 0xfb, 0x1d, 0xf7, 0x8, 0xfb, 0x5a, 0xf7, 0x9e,
+ 0xdb, 0xd1, 0xa7, 0xaa, 0xcc, 0x1e, 0x7e, 0xae,
+ 0x5, 0x70, 0x50, 0x57, 0x76, 0x30, 0x1b, 0xfb,
+ 0x3f, 0xfb, 0xc, 0xf7, 0x25, 0xf7, 0x24, 0xf7,
+ 0x77, 0xf7, 0x19, 0xf1, 0xf7, 0x28, 0xf7, 0x4b,
+ 0xf5, 0xfb, 0x26, 0xfb, 0x8, 0x1f, 0x13, 0xcf,
+ 0xc0, 0x34, 0x59, 0xfb, 0xa, 0x3e, 0x6c, 0x85,
+ 0xa4, 0x9f, 0x92, 0x8c, 0x91, 0x8c, 0x92, 0x1e,
+ 0xcc, 0xf7, 0x95, 0x5, 0x44, 0x6, 0x80, 0x65,
+ 0x5, 0xa4, 0x7d, 0x81, 0xa6, 0x5b, 0x1b, 0xfb,
+ 0x1d, 0x4b, 0xfb, 0x35, 0x3f, 0x1f, 0x13, 0x9f,
+ 0xc0, 0xfb, 0x3, 0xd0, 0x73, 0xa8, 0xc7, 0xba,
+ 0xc3, 0x9b, 0x96, 0x1e, 0xe, 0x51, 0x1d, 0x1,
+ 0x40, 0xf9, 0x28, 0x3, 0xf7, 0x15, 0x16, 0xae,
+ 0x7, 0x5f, 0x76, 0x9e, 0x9f, 0x90, 0x8d, 0x90,
+ 0x8e, 0x92, 0x3f, 0xa, 0x5b, 0x69, 0x83, 0x5e,
+ 0x2c, 0xa, 0x68, 0x7, 0xf8, 0xc, 0xf8, 0x7f,
+ 0x15, 0x74, 0x1d, 0xfb, 0x4d, 0x6, 0xe, 0x90,
+ 0x8b, 0xab, 0xf7, 0xc6, 0xa9, 0xf7, 0xa1, 0xae,
+ 0x12, 0xf8, 0x3e, 0xf7, 0x2d, 0x25, 0xea, 0x2c,
+ 0xf7, 0x27, 0x13, 0xf0, 0x73, 0x16, 0xf7, 0xaf,
+ 0x6, 0xf7, 0x27, 0xf7, 0x3a, 0xbe, 0xf7, 0x31,
+ 0xf1, 0x38, 0xa7, 0x58, 0x9b, 0x1f, 0x8d, 0x7,
+ 0x13, 0xe4, 0xcd, 0x9b, 0xf7, 0xc, 0xaf, 0xf7,
+ 0xd, 0x1a, 0xf7, 0x1f, 0xfb, 0x45, 0x8c, 0x50,
+ 0x1e, 0xfb, 0xa4, 0x68, 0x6, 0xb5, 0xaa, 0x86,
+ 0x63, 0x1f, 0xfb, 0x19, 0xfc, 0x76, 0x7a, 0x4d,
+ 0x6f, 0x86, 0x68, 0x86, 0x19, 0xf7, 0xb9, 0xf7,
+ 0xc3, 0x15, 0x13, 0xf0, 0xd3, 0xd9, 0x76, 0xfb,
+ 0x1, 0x5f, 0x72, 0xfb, 0x18, 0xfb, 0x1b, 0x65,
+ 0x74, 0x95, 0xa4, 0x93, 0x8c, 0x93, 0x8f, 0x96,
+ 0x1f, 0xd5, 0xf7, 0xa6, 0x15, 0xc8, 0xf7, 0x75,
+ 0x5, 0x9f, 0x90, 0x91, 0xa3, 0xb1, 0x1b, 0x13,
+ 0xe8, 0xd1, 0x9f, 0x55, 0x55, 0xfb, 0x38, 0xfb,
+ 0xc, 0x8e, 0x3b, 0x1f, 0xe, 0x90, 0x79, 0xc0,
+ 0xf8, 0xfb, 0xae, 0x1, 0xab, 0xf7, 0x2e, 0x3,
+ 0xf8, 0xb6, 0xf7, 0x2d, 0x15, 0x2f, 0x42, 0x4b,
+ 0x71, 0x3c, 0x1b, 0x7d, 0xfb, 0x16, 0x9f, 0xf7,
+ 0x47, 0xf7, 0x45, 0xf3, 0xf7, 0x83, 0xf7, 0x35,
+ 0xe3, 0xc5, 0x49, 0x32, 0x7f, 0x8a, 0x7e, 0x89,
+ 0x7e, 0x81, 0x1d, 0x81, 0x83, 0x7e, 0x75, 0x1b,
+ 0x82, 0x7f, 0x8f, 0x90, 0x7c, 0x1f, 0x94, 0x70,
+ 0x65, 0x96, 0x54, 0x1b, 0xfb, 0x87, 0xfb, 0x44,
+ 0xfb, 0x79, 0xfb, 0x72, 0xfb, 0x49, 0xf7, 0x22,
+ 0x44, 0xf7, 0x16, 0xf7, 0x16, 0xe6, 0xd3, 0xd8,
+ 0xbe, 0x1f, 0xe, 0xc7, 0x8b, 0xad, 0xf8, 0xf0,
+ 0xaa, 0x1, 0xf8, 0xae, 0xf7, 0x27, 0x3, 0xf7,
+ 0x52, 0xf7, 0x12, 0x15, 0xf7, 0x14, 0xf8, 0x6e,
+ 0x80, 0x1d, 0xfb, 0x2c, 0x2c, 0x25, 0x60, 0xfb,
+ 0x93, 0xfb, 0x97, 0x61, 0x7d, 0x99, 0xa3, 0x9a,
+ 0x8f, 0x9d, 0x77, 0xa, 0x8c, 0xf7, 0x13, 0xf7,
+ 0x73, 0x5d, 0xa, 0x77, 0x83, 0x72, 0xfb, 0xa,
+ 0xfc, 0x37, 0x1e, 0x75, 0x3d, 0x6b, 0x83, 0x6a,
+ 0x86, 0x8, 0xe, 0x51, 0xa, 0x1, 0x70, 0x16,
+ 0x37, 0x1d, 0x55, 0x7d, 0x95, 0x9c, 0x98, 0x93,
+ 0x9b, 0x90, 0x9e, 0x7e, 0xa, 0xf7, 0x4, 0xab,
+ 0x6f, 0x4c, 0x7e, 0x89, 0x7d, 0x89, 0x7b, 0x2a,
+ 0xa, 0xe, 0x90, 0xa0, 0x76, 0xf7, 0xe6, 0xab,
+ 0xf7, 0x9f, 0xab, 0x1, 0x7e, 0x16, 0xf7, 0xbb,
+ 0x6, 0x90, 0xae, 0x5, 0x5d, 0x71, 0x96, 0xa2,
+ 0x8e, 0x8b, 0x8f, 0x8c, 0x8f, 0x1f, 0xcb, 0xf7,
+ 0x96, 0x5, 0xf7, 0x2, 0xa6, 0x6c, 0x4e, 0x7e,
+ 0x89, 0x7d, 0x89, 0x7c, 0x4c, 0xa, 0x5, 0x37,
+ 0x5f, 0x7f, 0x75, 0xfb, 0x22, 0x1b, 0xc8, 0xf7,
+ 0x73, 0x5, 0xab, 0x94, 0x96, 0x97, 0xb2, 0x1b,
+ 0xf7, 0x49, 0x8b, 0x36, 0x47, 0x1f, 0xa6, 0x86,
+ 0xb6, 0xf7, 0x52, 0x5, 0xfc, 0xa9, 0x68, 0x6,
+ 0xbd, 0x85, 0xa4, 0x87, 0x7a, 0x8b, 0xa, 0x85,
+ 0x1e, 0xfb, 0x14, 0xfc, 0x94, 0x82, 0x67, 0x6c,
+ 0x89, 0x63, 0x84, 0x19, 0xe, 0xc7, 0x79, 0xb1,
+ 0xf7, 0xa6, 0xaf, 0xf7, 0xd3, 0xaf, 0x1, 0xa0,
+ 0xf7, 0x30, 0x3, 0xf8, 0x37, 0xf7, 0xba, 0x15,
+ 0xb9, 0x87, 0xaa, 0x88, 0x65, 0x1a, 0x84, 0x8a,
+ 0x81, 0x89, 0x81, 0x1e, 0x84, 0x68, 0x60, 0xfb,
+ 0x10, 0x87, 0x84, 0x8, 0x74, 0x7d, 0x60, 0x7e,
+ 0x5f, 0x1b, 0x6a, 0xfb, 0x14, 0xbd, 0xf7, 0x3f,
+ 0xf7, 0x67, 0xf4, 0xf7, 0x59, 0xf7, 0x34, 0xf7,
+ 0x3, 0xbb, 0x3b, 0x26, 0x1f, 0xa8, 0x87, 0xbe,
+ 0xf7, 0x71, 0x5, 0x6c, 0x6, 0x81, 0x86, 0x82,
+ 0x77, 0x6f, 0x1b, 0x7e, 0x80, 0x90, 0x90, 0x7c,
+ 0x1f, 0x94, 0x73, 0x68, 0x96, 0x47, 0x1b, 0xfb,
+ 0x99, 0xfb, 0x34, 0xfb, 0x88, 0xfb, 0x5c, 0xfb,
+ 0x45, 0xf7, 0x1c, 0x39, 0xf7, 0x39, 0xd7, 0xf7,
+ 0x7, 0xa4, 0xa4, 0xc1, 0x1f, 0x97, 0x94, 0xbb,
+ 0xf7, 0x49, 0x9d, 0xd0, 0x93, 0x8a, 0xc0, 0x8f,
+ 0x19, 0xaf, 0xfb, 0xb3, 0x7, 0xe, 0xf7, 0x8,
+ 0x8b, 0xae, 0xf7, 0xba, 0xb7, 0xf7, 0x99, 0xae,
+ 0x1, 0x73, 0x16, 0x75, 0x1d, 0x5e, 0x8e, 0x6e,
+ 0x95, 0xa5, 0x1a, 0x8f, 0x8c, 0x8f, 0x8c, 0x90,
+ 0x1e, 0xcd, 0xf7, 0x86, 0x5, 0xf7, 0x83, 0x6,
+ 0x4c, 0xfb, 0x86, 0x83, 0x6b, 0x79, 0x7a, 0x3f,
+ 0x88, 0x19, 0x68, 0xf7, 0xd1, 0xae, 0x7, 0x69,
+ 0x8c, 0x64, 0x97, 0xa7, 0x1a, 0x8e, 0x8b, 0x8f,
+ 0x8c, 0x8f, 0x1e, 0xf7, 0x19, 0xf8, 0x79, 0x9b,
+ 0xc9, 0xa4, 0x85, 0xb3, 0x91, 0x19, 0x61, 0xa,
+ 0xc0, 0x83, 0xa1, 0x7b, 0x74, 0x1a, 0x86, 0x8a,
+ 0x86, 0x8a, 0x86, 0x1e, 0x52, 0xfb, 0x5b, 0x5,
+ 0xfb, 0x83, 0x6, 0xc1, 0xf7, 0x5b, 0x9b, 0xc7,
+ 0xa8, 0x8b, 0xc3, 0x8d, 0x82, 0xa, 0xbe, 0x84,
+ 0xa3, 0x7b, 0x74, 0x1a, 0x86, 0x8a, 0x86, 0x8a,
+ 0x85, 0x1e, 0xfb, 0x18, 0xfc, 0x79, 0x80, 0x62,
+ 0x6a, 0x86, 0x66, 0x85, 0x19, 0xe, 0xfb, 0xa5,
+ 0xa0, 0x76, 0xf9, 0xe, 0xae, 0x1, 0x6b, 0x16,
+ 0x75, 0x1d, 0x60, 0x8d, 0x6e, 0x9b, 0xa4, 0x1a,
+ 0x90, 0x8b, 0x90, 0x8c, 0x90, 0x1e, 0xf7, 0x21,
+ 0xf8, 0x77, 0x9a, 0xbe, 0x9e, 0x8d, 0x56, 0x1d,
+ 0xc5, 0x86, 0xa0, 0x75, 0x88, 0x7a, 0x8a, 0x86,
+ 0x8a, 0x86, 0x8a, 0x87, 0xfb, 0x18, 0xfc, 0x77,
+ 0x18, 0x80, 0x61, 0x70, 0x81, 0x60, 0x85, 0x8,
+ 0xe, 0x45, 0xf7, 0x3f, 0xf8, 0xcc, 0x77, 0x12,
+ 0x5d, 0xf7, 0x13, 0xfb, 0x13, 0xf8, 0xce, 0x13,
+ 0xe0, 0xf7, 0x77, 0xf9, 0xe, 0x15, 0xbd, 0x84,
+ 0xa4, 0x7c, 0x73, 0x8b, 0xa, 0x84, 0x1e, 0x22,
+ 0xfc, 0x2d, 0x5, 0xfb, 0xb, 0x6b, 0x5d, 0x61,
+ 0x73, 0x1b, 0x81, 0x86, 0x92, 0x99, 0x98, 0x8f,
+ 0x8f, 0x92, 0x92, 0x1f, 0x92, 0x92, 0x90, 0x92,
+ 0x9e, 0x1a, 0xaf, 0x6e, 0xa5, 0x68, 0x68, 0x6f,
+ 0x6f, 0x60, 0x4e, 0xd1, 0x64, 0xdc, 0xf7, 0x18,
+ 0xbe, 0xe5, 0xf1, 0xa6, 0x1e, 0xf7, 0x0, 0xf8,
+ 0x2d, 0x5, 0x13, 0xd0, 0x9e, 0xc4, 0x9a, 0x88,
+ 0xba, 0x93, 0x8, 0xae, 0xfb, 0xbd, 0x7, 0xe,
+ 0x90, 0xa0, 0x76, 0xf9, 0x31, 0x77, 0x1, 0x76,
+ 0x16, 0xf7, 0xb5, 0xae, 0x6, 0x64, 0x70, 0x98,
+ 0xad, 0x90, 0x8c, 0x90, 0x8c, 0x91, 0x1f, 0xcb,
+ 0xf7, 0x79, 0x93, 0x89, 0x5, 0xf7, 0x1, 0xfb,
+ 0x7d, 0x97, 0x74, 0x88, 0x1a, 0x74, 0x84, 0x8a,
+ 0x51, 0x84, 0x1e, 0x68, 0xf7, 0xac, 0xae, 0x7,
+ 0x71, 0x8e, 0x74, 0x8d, 0x7d, 0xa9, 0xfb, 0x31,
+ 0xf7, 0xdc, 0x18, 0xf7, 0x6c, 0xf7, 0x50, 0xb8,
+ 0xb5, 0x98, 0x8c, 0xaf, 0x90, 0x19, 0xae, 0xfb,
+ 0x67, 0x68, 0x7, 0xb2, 0x87, 0x9c, 0x89, 0x75,
+ 0x1a, 0x72, 0xfb, 0x78, 0xfb, 0x44, 0x64, 0x54,
+ 0x1e, 0x86, 0x8c, 0xc7, 0xf7, 0x71, 0x9b, 0xc5,
+ 0xa7, 0x8b, 0xbd, 0x8f, 0x19, 0xae, 0xfb, 0xca,
+ 0x68, 0x7, 0xbd, 0x84, 0xa4, 0x7c, 0x74, 0x7c,
+ 0x1d, 0x79, 0x4b, 0x70, 0x88, 0x68, 0x86, 0x19,
+ 0xe, 0x53, 0x1d, 0x55, 0x7e, 0x96, 0x9d, 0x94,
+ 0x8f, 0x96, 0x8e, 0x98, 0x1f, 0xf7, 0x15, 0xf8,
+ 0x72, 0x9b, 0xc7, 0xa8, 0x8a, 0xc3, 0x8e, 0x82,
+ 0xa, 0xbf, 0x84, 0xa2, 0x7b, 0x75, 0x7c, 0x1d,
+ 0x7b, 0x52, 0x76, 0x82, 0x60, 0x85, 0x19, 0xe,
+ 0xf7, 0x77, 0x8b, 0xae, 0x71, 0x76, 0xf7, 0x60,
+ 0x77, 0xf8, 0x85, 0x77, 0x12, 0x13, 0xb0, 0x6e,
+ 0x16, 0xf7, 0x63, 0xae, 0x6, 0x50, 0x79, 0xa3,
+ 0xac, 0xa5, 0x93, 0xab, 0x93, 0xa7, 0x1f, 0xef,
+ 0xf8, 0x0, 0x5, 0x8d, 0x6, 0x13, 0x70, 0xcd,
+ 0xfc, 0xbe, 0x5, 0xa7, 0x6, 0xf8, 0x7, 0xf8,
+ 0xca, 0x8d, 0x89, 0xfb, 0xf, 0xfc, 0x47, 0x5,
+ 0x13, 0xb0, 0x7b, 0x50, 0x6f, 0x78, 0x53, 0x87,
+ 0x8, 0x68, 0xf7, 0xcc, 0xae, 0x7, 0x55, 0x7a,
+ 0x96, 0xa0, 0x98, 0x8f, 0x9c, 0x90, 0x9f, 0x1f,
+ 0xf7, 0xf, 0xf8, 0x51, 0x9b, 0xc9, 0xa4, 0x8f,
+ 0xb3, 0x91, 0x19, 0xae, 0xfb, 0x68, 0x7, 0xfb,
+ 0xc8, 0xfc, 0x71, 0x6f, 0xa, 0x55, 0xf8, 0x71,
+ 0x5, 0xfb, 0x71, 0x68, 0x6, 0xc0, 0x89, 0x9e,
+ 0x89, 0x6c, 0x1a, 0xfb, 0xc, 0xfc, 0x39, 0x63,
+ 0xfb, 0x1e, 0x7f, 0x92, 0x5a, 0x7f, 0x19, 0xe,
+ 0x8b, 0x1d, 0x12, 0x13, 0xa0, 0x70, 0x16, 0xf7,
+ 0x64, 0xae, 0x6, 0x51, 0x79, 0x9d, 0xb0, 0x9a,
+ 0x8e, 0x9b, 0x90, 0x9c, 0x1f, 0xf4, 0xf8, 0x20,
+ 0x5, 0x13, 0x60, 0x59, 0xa, 0x8d, 0x96, 0x94,
+ 0x8a, 0x93, 0x1b, 0xaf, 0x97, 0x72, 0x6b, 0x6f,
+ 0x85, 0x6a, 0x83, 0x71, 0x64, 0x1d, 0xfb, 0x12,
+ 0xfc, 0x57, 0x18, 0x13, 0xa0, 0x6d, 0x21, 0x80,
+ 0x9b, 0x55, 0x7e, 0x8, 0xe, 0xc7, 0x79, 0xad,
+ 0xf9, 0xf, 0xad, 0x1, 0x4d, 0xa, 0x3, 0xf7,
+ 0x3f, 0xf7, 0x2a, 0x15, 0xe7, 0xe0, 0xf8, 0x2d,
+ 0xf7, 0x4c, 0xf3, 0x8e, 0x21, 0x76, 0xfb, 0x8,
+ 0x2f, 0xfc, 0x1c, 0xfb, 0x46, 0x50, 0x5c, 0xad,
+ 0x55, 0x1d, 0xd4, 0xfb, 0x14, 0xf7, 0x3b, 0xf7,
+ 0x8d, 0xf7, 0x43, 0xf7, 0x9e, 0xf7, 0x56, 0xf7,
+ 0x42, 0xfb, 0x1b, 0xd0, 0xfb, 0x1, 0xfb, 0x6f,
+ 0xfb, 0x5d, 0xfb, 0x7d, 0xfb, 0x89, 0x1e, 0xe,
+ 0x58, 0xa0, 0x76, 0xf7, 0xd6, 0xab, 0xf7, 0xaf,
+ 0xab, 0x1, 0xf8, 0x67, 0xf7, 0x26, 0x3, 0xf7,
+ 0xa1, 0xf7, 0xf6, 0x6f, 0x1d, 0x23, 0x54, 0x55,
+ 0xfb, 0x23, 0x1f, 0xfb, 0xbc, 0xfb, 0xf6, 0x15,
+ 0xf7, 0xba, 0xae, 0x6, 0x5a, 0x78, 0xa3, 0xb2,
+ 0x97, 0x8e, 0x98, 0x8e, 0x99, 0x1f, 0xc1, 0xf7,
+ 0x4d, 0x5, 0xf7, 0x27, 0xf7, 0x63, 0xa4, 0xf7,
+ 0x39, 0xf7, 0x12, 0x20, 0xaa, 0x21, 0x1f, 0xfb,
+ 0xb3, 0x68, 0x6, 0xbe, 0x84, 0xa3, 0x88, 0x79,
+ 0x8b, 0xa, 0x86, 0x1e, 0xfb, 0xf, 0xfc, 0x5b,
+ 0x7a, 0x4d, 0x6a, 0x6a, 0x63, 0x84, 0x19, 0xe,
+ 0xc7, 0xfb, 0x64, 0xe8, 0x5d, 0xf7, 0x46, 0x69,
+ 0xad, 0xf9, 0xe, 0xad, 0x12, 0x4d, 0xa, 0x13,
+ 0x5c, 0xf7, 0x3f, 0xf7, 0x2a, 0x15, 0xe7, 0xe2,
+ 0xf8, 0x2d, 0xf7, 0x4c, 0xf3, 0x8c, 0x23, 0x76,
+ 0xfb, 0x8, 0x2d, 0xfc, 0x1d, 0xfb, 0x46, 0x50,
+ 0x5e, 0xac, 0xef, 0x1e, 0xfb, 0x23, 0xfb, 0xcf,
+ 0x15, 0x99, 0x73, 0x5, 0xa2, 0xc4, 0xad, 0x90,
+ 0xa0, 0x1b, 0xbe, 0xae, 0x7b, 0x7e, 0xb6, 0x1f,
+ 0x13, 0xbc, 0x81, 0xab, 0xaf, 0x83, 0xbc, 0x1b,
+ 0xf7, 0x20, 0xd2, 0xe3, 0xc8, 0xb7, 0x1f, 0x76,
+ 0x9e, 0x5, 0x58, 0x6b, 0x51, 0x73, 0x4e, 0x1b,
+ 0x6e, 0x6c, 0x8e, 0x94, 0x70, 0x1f, 0x57, 0x9b,
+ 0x5e, 0x93, 0x69, 0x8f, 0x8, 0x66, 0x90, 0x75,
+ 0x8c, 0x8f, 0x1a, 0x90, 0xaa, 0xa8, 0x9a, 0x99,
+ 0x1e, 0xf7, 0x86, 0xf7, 0x59, 0xf7, 0x91, 0xf7,
+ 0x64, 0xf7, 0x42, 0xfb, 0x19, 0xce, 0x5d, 0x1d,
+ 0xfb, 0x7d, 0xfb, 0x89, 0x38, 0xbc, 0x27, 0xf7,
+ 0x5, 0x6c, 0x1f, 0x95, 0x87, 0x8b, 0x8b, 0x8f,
+ 0x86, 0x88, 0x85, 0x8b, 0x8b, 0xfb, 0x40, 0xfb,
+ 0x23, 0x8, 0xe, 0x90, 0xa0, 0x76, 0xf9, 0x11,
+ 0xab, 0x1, 0xf8, 0x6c, 0xf7, 0x2b, 0x3, 0xf7,
+ 0xa5, 0xf7, 0xff, 0x15, 0xc7, 0xf7, 0x7a, 0x5,
+ 0xa2, 0x90, 0x92, 0xa0, 0xac, 0x1b, 0xcb, 0xa9,
+ 0x56, 0x4f, 0x25, 0x3b, 0x50, 0xfb, 0xb, 0x1f,
+ 0xfb, 0xc2, 0xfb, 0xff, 0x8e, 0x1d, 0x66, 0x71,
+ 0x8e, 0xb0, 0x94, 0x8d, 0x95, 0x8e, 0x98, 0x1f,
+ 0xc2, 0xf7, 0x74, 0x5, 0xa8, 0x6, 0xf6, 0xfb,
+ 0xdf, 0x5, 0xf7, 0x5e, 0xae, 0x6, 0x5b, 0x90,
+ 0x79, 0x8d, 0x75, 0xcc, 0x38, 0xf7, 0x80, 0x18,
+ 0xf7, 0x17, 0xa0, 0xc8, 0xdf, 0xd7, 0x1a, 0xf7,
+ 0x25, 0xfb, 0x44, 0x8b, 0x4f, 0x1e, 0xfb, 0xa8,
+ 0x68, 0x6, 0xbf, 0x84, 0xa2, 0x82, 0x77, 0x1a,
+ 0x87, 0x8a, 0x87, 0x8a, 0x84, 0x1e, 0xfb, 0x19,
+ 0xfc, 0x70, 0x7b, 0x52, 0x77, 0x81, 0x5f, 0x86,
+ 0x19, 0xe, 0x21, 0x79, 0xad, 0xf9, 0xe, 0xae,
+ 0x87, 0x85, 0x1d, 0x13, 0xd8, 0x8d, 0x79, 0x15,
+ 0xa9, 0x6, 0xa2, 0x96, 0x8f, 0x97, 0xa4, 0x1b,
+ 0x98, 0x9a, 0x84, 0x83, 0xa2, 0x1f, 0x82, 0xa6,
+ 0xaa, 0x80, 0xb4, 0x1b, 0xf7, 0x30, 0xe5, 0xf7,
+ 0x0, 0xf7, 0x18, 0xd3, 0x54, 0xc2, 0x51, 0xb8,
+ 0x1f, 0x4b, 0xbe, 0x47, 0xb6, 0xc2, 0x1a, 0x97,
+ 0x84, 0xea, 0xf1, 0xf7, 0x6, 0xa6, 0xfb, 0x2,
+ 0x53, 0x1e, 0xa6, 0x87, 0x5, 0x13, 0xb8, 0xb3,
+ 0xf7, 0x5d, 0x5, 0x6d, 0x6, 0x72, 0x7e, 0x70,
+ 0x8a, 0x87, 0x1b, 0x7c, 0x7a, 0x92, 0x92, 0x74,
+ 0x1f, 0x13, 0xd8, 0x93, 0x74, 0x70, 0x93, 0x6e,
+ 0x1b, 0xfb, 0x19, 0x38, 0x2b, 0x26, 0x3b, 0xc8,
+ 0x5e, 0xc8, 0x63, 0x1f, 0xc8, 0x63, 0xc9, 0x66,
+ 0x4b, 0x1a, 0x77, 0x7e, 0xfb, 0x26, 0xfb, 0x4,
+ 0x61, 0xfb, 0x5, 0x9b, 0xf7, 0x40, 0x1e, 0x6e,
+ 0x8d, 0x5, 0xe, 0x58, 0x58, 0xa, 0x1, 0xbd,
+ 0x16, 0xf7, 0xdf, 0x6, 0x8d, 0xae, 0x5, 0x51,
+ 0x76, 0x91, 0xa9, 0x94, 0x8e, 0x97, 0x8f, 0x9a,
+ 0x1f, 0xf7, 0x1e, 0xf8, 0xa3, 0x5, 0xc0, 0xe0,
+ 0x85, 0xfb, 0x29, 0x1f, 0xa6, 0x89, 0xaf, 0xf7,
+ 0x54, 0x5, 0xfc, 0xbb, 0x6, 0x65, 0xfb, 0x3f,
+ 0xa4, 0x84, 0x5, 0xf1, 0xbe, 0xd2, 0xb4, 0xea,
+ 0x1b, 0xfb, 0x26, 0xfc, 0xa3, 0x78, 0x46, 0x62,
+ 0x86, 0x5e, 0x8d, 0x19, 0xe, 0xc7, 0x79, 0xc3,
+ 0xf8, 0xe9, 0xad, 0x1, 0xce, 0xf7, 0x1e, 0x3,
+ 0xed, 0xf9, 0xe, 0x15, 0xc9, 0x83, 0x96, 0x6b,
+ 0x6b, 0x5d, 0x23, 0xfb, 0xa8, 0x38, 0xa, 0xe1,
+ 0xf7, 0xbb, 0x99, 0xbc, 0x9d, 0x9b, 0x55, 0xa,
+ 0x8c, 0x93, 0x93, 0x8b, 0x92, 0x1b, 0xba, 0x98,
+ 0x68, 0x72, 0x85, 0x8a, 0x85, 0x8a, 0x86, 0x1f,
+ 0x3b, 0xfb, 0xbb, 0x5, 0x21, 0x6f, 0x65, 0xfb,
+ 0xb, 0xfb, 0x23, 0x1b, 0x28, 0x73, 0xb7, 0xc5,
+ 0xb3, 0x9b, 0xbb, 0x97, 0xb7, 0x3e, 0x1d, 0xe,
+ 0x90, 0x87, 0x76, 0xf7, 0x53, 0x77, 0xb2, 0x77,
+ 0xf8, 0x5c, 0xae, 0x12, 0xd3, 0xf9, 0x1e, 0x13,
+ 0xd8, 0x13, 0xb8, 0xf7, 0x7b, 0x79, 0x15, 0xab,
+ 0x6, 0xf8, 0x1d, 0xf8, 0xf8, 0x91, 0x94, 0x9b,
+ 0x9f, 0xb0, 0x96, 0x19, 0xae, 0xfb, 0x54, 0x68,
+ 0x7, 0xba, 0x87, 0x9d, 0x8a, 0x6c, 0x1a, 0xfb,
+ 0x8b, 0xfc, 0x31, 0x6f, 0xa, 0x58, 0xf8, 0x18,
+ 0x5, 0x8a, 0x96, 0x8b, 0x94, 0x92, 0x1a, 0xa7,
+ 0xa7, 0x8d, 0xbb, 0x8f, 0x1e, 0x61, 0xa, 0xc7,
+ 0x89, 0x93, 0x82, 0x94, 0x51, 0x8, 0xe, 0xf7,
+ 0x77, 0x8e, 0x76, 0xf7, 0x8b, 0x77, 0xf8, 0x3d,
+ 0xae, 0x1, 0xf7, 0x70, 0x79, 0x15, 0xa8, 0x6,
+ 0xf7, 0x7b, 0xf8, 0x7a, 0x5, 0x8d, 0x6, 0xc6,
+ 0xfc, 0x7a, 0x5, 0xa8, 0x6, 0xf7, 0xa8, 0xf8,
+ 0xcf, 0xab, 0xcb, 0xaa, 0x98, 0xaa, 0x90, 0x19,
+ 0xad, 0xfb, 0x4f, 0x68, 0x7, 0xb8, 0x8e, 0x9d,
+ 0x81, 0x74, 0x1a, 0x7d, 0x86, 0x7a, 0x81, 0x77,
+ 0x1e, 0xfb, 0x2e, 0xfb, 0xd8, 0x6f, 0xa, 0x6a,
+ 0xf7, 0xb8, 0x5, 0x88, 0xa4, 0x89, 0xa0, 0x9e,
+ 0x1a, 0xaa, 0x99, 0x9b, 0xbb, 0x8c, 0x1e, 0xae,
+ 0xfb, 0xa1, 0x69, 0x7, 0xbe, 0x83, 0x9f, 0x92,
+ 0x2a, 0x1a, 0xfb, 0x28, 0xfb, 0xc8, 0x6f, 0xa,
+ 0x64, 0xf7, 0xe0, 0x5, 0x8a, 0x94, 0x8b, 0x93,
+ 0x92, 0x1a, 0xb0, 0xa8, 0x94, 0xab, 0x8e, 0x1e,
+ 0xae, 0xfb, 0xa9, 0x69, 0x7, 0xcb, 0x80, 0x8d,
+ 0x94, 0x96, 0x43, 0x8, 0xe, 0x90, 0x58, 0xa,
+ 0x1, 0x73, 0x16, 0xf7, 0x6a, 0xae, 0x6, 0x74,
+ 0x8d, 0x57, 0x90, 0xae, 0x1a, 0xf7, 0x42, 0xf7,
+ 0x4f, 0x5, 0x95, 0x63, 0xba, 0x20, 0x60, 0x1a,
+ 0x69, 0x6b, 0x89, 0x67, 0x88, 0x1e, 0x68, 0xf7,
+ 0xc8, 0xae, 0x7, 0x3f, 0x92, 0x7e, 0xa2, 0x70,
+ 0xe1, 0x41, 0xf7, 0x77, 0x18, 0xf7, 0x5b, 0xf7,
+ 0x57, 0xbf, 0xc1, 0xa3, 0x8e, 0xa2, 0x8f, 0x19,
+ 0xae, 0xfb, 0x5f, 0x68, 0x7, 0xac, 0x88, 0xa6,
+ 0x7b, 0x7b, 0x1a, 0x87, 0x8a, 0x87, 0x87, 0x87,
+ 0x1e, 0xfb, 0x38, 0xfb, 0x3a, 0x5, 0x7c, 0xbf,
+ 0x67, 0xda, 0x9e, 0x1a, 0xad, 0x9a, 0xa2, 0xc6,
+ 0x91, 0x1e, 0xae, 0xfb, 0xc5, 0x68, 0x7, 0xbf,
+ 0x86, 0xa3, 0x83, 0x9a, 0x59, 0xdf, 0xfb, 0x9a,
+ 0x18, 0x4f, 0x4c, 0xfb, 0x3, 0xfb, 0xc, 0x47,
+ 0x50, 0x75, 0x78, 0x84, 0x87, 0x6c, 0x82, 0x8,
+ 0xe, 0x58, 0x58, 0xa, 0x1, 0xd4, 0x16, 0xf7,
+ 0xd6, 0xae, 0x6, 0x5d, 0x8d, 0x6c, 0x8c, 0xb4,
+ 0x1a, 0xc7, 0xf7, 0x79, 0x6a, 0xa, 0xc4, 0x88,
+ 0xa3, 0x80, 0x78, 0x1a, 0x81, 0x87, 0x7f, 0x81,
+ 0x7e, 0x1e, 0xfb, 0x2f, 0xfb, 0x6a, 0x48, 0xf7,
+ 0x5c, 0x8d, 0x83, 0x81, 0xa5, 0x19, 0x87, 0x95,
+ 0x88, 0x96, 0x92, 0x1a, 0xa6, 0xa8, 0x94, 0xb9,
+ 0x6a, 0x1d, 0x4f, 0xfb, 0x62, 0x79, 0x4b, 0x72,
+ 0x88, 0x51, 0x86, 0x19, 0xe, 0x58, 0x58, 0xa,
+ 0x3e, 0xa, 0xe, 0xfb, 0xdd, 0xfb, 0x33, 0xb8,
+ 0xf9, 0x7b, 0xb8, 0x1, 0x66, 0xfb, 0x33, 0x15,
+ 0xf7, 0x6f, 0x6, 0x92, 0xb8, 0x5, 0x3b, 0x6,
+ 0x7f, 0x76, 0x8b, 0xa3, 0x1f, 0xf7, 0x32, 0xf9,
+ 0x24, 0x5, 0xc6, 0x99, 0x8a, 0x8f, 0xb0, 0x1b,
+ 0xd2, 0x6, 0x92, 0xb8, 0x5, 0xfb, 0x5c, 0x6,
+ 0xe, 0xfc, 0x14, 0xfb, 0x1c, 0x76, 0xf7, 0x34,
+ 0x8d, 0x1d, 0xf7, 0x1e, 0xfb, 0x31, 0x15, 0xc6,
+ 0x6, 0x32, 0xf9, 0xde, 0x5, 0x50, 0x6, 0xe,
+ 0xfb, 0xdd, 0xfb, 0x31, 0xb8, 0xf9, 0x79, 0xb8,
+ 0x1, 0x64, 0xfb, 0x4, 0x15, 0x84, 0x5e, 0x5,
+ 0xf7, 0x5b, 0x6, 0xf7, 0x5c, 0xf9, 0xd3, 0x5,
+ 0xfb, 0x70, 0x6, 0x84, 0x5e, 0x5, 0xd9, 0x6,
+ 0x96, 0xa3, 0x88, 0x75, 0x1f, 0xfb, 0x31, 0xfd,
+ 0x21, 0x5, 0x51, 0x7d, 0x89, 0x86, 0x66, 0x1b,
+ 0xe, 0x2f, 0xf7, 0xd9, 0x76, 0xf8, 0x1, 0x77,
+ 0x1, 0xce, 0xf7, 0xc4, 0x15, 0xe4, 0x6, 0xf7,
+ 0x15, 0xf7, 0xa1, 0xf7, 0x15, 0xfb, 0xa1, 0x5,
+ 0xe4, 0x6, 0xfb, 0x46, 0xf8, 0x1, 0x5, 0x3b,
+ 0x6, 0xe, 0xfb, 0x11, 0xbd, 0x1, 0x40, 0x4,
+ 0x59, 0xf8, 0x88, 0xbd, 0x7, 0xe, 0x7f, 0x1d,
+ 0xf7, 0x49, 0x77, 0x1, 0xf7, 0x90, 0xf8, 0x98,
+ 0x7b, 0xa, 0xfb, 0x3, 0xf7, 0x27, 0x5, 0x98,
+ 0x80, 0x7a, 0xa0, 0x70, 0x1b, 0x70, 0x78, 0x75,
+ 0x76, 0x76, 0xa0, 0x78, 0x98, 0x82, 0x1f, 0xe,
+ 0x58, 0x1d, 0xb5, 0x85, 0x77, 0x74, 0xa, 0x13,
+ 0x68, 0xf7, 0x8e, 0xf7, 0x7, 0x15, 0x2e, 0x1d,
+ 0x13, 0x98, 0x71, 0xa, 0x90, 0x94, 0x44, 0xa,
+ 0x5, 0xfb, 0x3, 0x6, 0x7a, 0x4d, 0x6f, 0xa,
+ 0x13, 0xa8, 0xa4, 0x87, 0x8a, 0xb6, 0x4f, 0x1b,
+ 0xfb, 0xe, 0xfb, 0x33, 0x2f, 0x1d, 0xcc, 0xd5,
+ 0xf7, 0x84, 0xdf, 0x94, 0xad, 0x39, 0xa, 0xe,
+ 0x7e, 0xac, 0xf8, 0xa, 0xcf, 0xf7, 0x81, 0x77,
+ 0x1, 0xf7, 0xd3, 0xf7, 0x11, 0x3, 0xf7, 0x5a,
+ 0xf8, 0xc, 0x15, 0x89, 0x8d, 0xe3, 0xf7, 0xd5,
+ 0x42, 0x77, 0x1d, 0x65, 0xfb, 0x2d, 0xfc, 0x83,
+ 0x6e, 0x1a, 0x77, 0xc1, 0x63, 0xe0, 0xf7, 0x3b,
+ 0xf7, 0x2c, 0xf7, 0x3e, 0xf7, 0x3d, 0xd9, 0x5b,
+ 0xc5, 0x4d, 0x4c, 0x64, 0x63, 0x5d, 0x69, 0x1e,
+ 0x32, 0xfb, 0xd9, 0x15, 0x8c, 0xc7, 0xf7, 0xea,
+ 0xf3, 0xb9, 0x8b, 0x58, 0x7a, 0x36, 0x4a, 0xfb,
+ 0x71, 0xfb, 0x5, 0x86, 0x70, 0x8b, 0xaa, 0x1e,
+ 0xe, 0xfb, 0x6e, 0x7e, 0xcb, 0xf7, 0x8f, 0xf7,
+ 0x34, 0x6a, 0xac, 0x12, 0x86, 0xf7, 0x14, 0x13,
+ 0xb0, 0xf7, 0xd2, 0xf7, 0x21, 0x15, 0x51, 0x63,
+ 0x66, 0x6b, 0x5e, 0x1b, 0x6e, 0x5f, 0x95, 0xdb,
+ 0xd2, 0xc7, 0xf7, 0x6d, 0xe2, 0x94, 0x99, 0x87,
+ 0x7e, 0x83, 0x85, 0x83, 0x85, 0x81, 0x1f, 0x86,
+ 0x82, 0x87, 0x81, 0x7e, 0x1a, 0x13, 0xd0, 0x84,
+ 0x1d, 0x67, 0xb7, 0x3c, 0xfb, 0x1e, 0xfb, 0x24,
+ 0xfb, 0x3c, 0xfb, 0x2d, 0xfb, 0x3, 0xde, 0x60,
+ 0xcd, 0xf5, 0xbe, 0xd3, 0xcb, 0xb8, 0x1e, 0xe,
+ 0x7e, 0xd3, 0x5a, 0x76, 0xf8, 0x43, 0xb5, 0xf7,
+ 0x81, 0x77, 0x12, 0x76, 0xf7, 0x10, 0x13, 0x78,
+ 0xf7, 0x8e, 0xf7, 0x7, 0x15, 0x84, 0x6c, 0x88,
+ 0x79, 0x7b, 0x1a, 0x4e, 0xc0, 0x8b, 0x92, 0xd1,
+ 0xc2, 0xe2, 0xb2, 0xa3, 0x1e, 0x75, 0x9b, 0x5,
+ 0x84, 0x90, 0x55, 0x4b, 0x76, 0x1b, 0x86, 0x88,
+ 0x8f, 0x94, 0x1f, 0xf7, 0x3c, 0xf9, 0x6, 0x68,
+ 0x83, 0x5d, 0x80, 0xfb, 0x14, 0x81, 0x6d, 0xa,
+ 0xb6, 0x9e, 0x85, 0x73, 0x7c, 0x72, 0x35, 0x75,
+ 0x38, 0x1f, 0x99, 0x7d, 0x83, 0x9e, 0x60, 0x1b,
+ 0xfb, 0x8, 0xfb, 0x37, 0xfb, 0x55, 0xfb, 0x2f,
+ 0x1f, 0x13, 0xb8, 0x5f, 0xa2, 0x38, 0xde, 0xe1,
+ 0xbb, 0xd9, 0xbc, 0xa8, 0x1e, 0xfb, 0x25, 0x16,
+ 0xd1, 0xcf, 0xf7, 0x80, 0xe2, 0xb0, 0x98, 0x5d,
+ 0x85, 0x6e, 0x47, 0xfb, 0xac, 0x2c, 0x63, 0x89,
+ 0xbd, 0x90, 0x1e, 0xe, 0xfb, 0x6e, 0x7e, 0xcb,
+ 0xf8, 0x21, 0xac, 0x1, 0x90, 0xf7, 0x16, 0xf7,
+ 0x3f, 0xe7, 0x3, 0x50, 0x1d, 0xf7, 0x7, 0xc2,
+ 0x1a, 0xd3, 0x47, 0x93, 0x68, 0xfb, 0x37, 0xfb,
+ 0x13, 0xfb, 0x55, 0xfb, 0x1c, 0xfb, 0x4, 0xdf,
+ 0x69, 0x35, 0xa, 0x8e, 0xda, 0x9e, 0x8d, 0x97,
+ 0x3d, 0xa, 0x65, 0x82, 0x57, 0x70, 0x3a, 0xfb,
+ 0x17, 0x68, 0x1f, 0xe, 0xfb, 0xdd, 0xfb, 0x61,
+ 0xaa, 0xf8, 0xd9, 0xb5, 0xf7, 0x70, 0xa8, 0x1,
+ 0xb2, 0xf8, 0x2b, 0x15, 0xd4, 0x6, 0x76, 0x3b,
+ 0x63, 0xfb, 0x57, 0x70, 0xfb, 0x9, 0x8, 0xfb,
+ 0x1c, 0x6e, 0x7c, 0x56, 0x5b, 0x1b, 0x80, 0x86,
+ 0x90, 0x92, 0x8e, 0x8f, 0x90, 0x8f, 0x92, 0x1f,
+ 0x8f, 0x92, 0x8f, 0x93, 0x96, 0x1a, 0xaf, 0x66,
+ 0x98, 0x7e, 0x74, 0x6f, 0x79, 0x6c, 0x4f, 0xb8,
+ 0x73, 0xbf, 0xf7, 0x43, 0xb3, 0xf7, 0x67, 0xf8,
+ 0x25, 0xe1, 0x1e, 0xe5, 0x6, 0x94, 0xb5, 0x5,
+ 0x2f, 0x6, 0xf7, 0x3, 0xa6, 0xaa, 0xf7, 0x1,
+ 0xbe, 0x1b, 0x93, 0x94, 0x88, 0x80, 0x88, 0x87,
+ 0x87, 0x87, 0x84, 0x1f, 0x87, 0x84, 0x87, 0x83,
+ 0x80, 0x1a, 0x6e, 0xa0, 0x76, 0xa6, 0xa3, 0xa7,
+ 0x99, 0xb2, 0x9f, 0x81, 0xc7, 0x33, 0xfb, 0x12,
+ 0x49, 0xfb, 0x5, 0xfb, 0x1c, 0x68, 0x1e, 0x42,
+ 0x6, 0xe, 0xfb, 0x5f, 0xad, 0xf7, 0x4c, 0x76,
+ 0xf7, 0x33, 0xaa, 0x74, 0x77, 0xf7, 0xb6, 0xaa,
+ 0x12, 0x57, 0xe2, 0xf7, 0x7b, 0xf7, 0x1, 0x40,
+ 0xf7, 0x9, 0x13, 0xde, 0xd9, 0x93, 0x15, 0x89,
+ 0x7, 0x4c, 0x7b, 0x48, 0x7a, 0x42, 0x1a, 0x3f,
+ 0xf3, 0x70, 0xdb, 0xf7, 0x3f, 0xd3, 0xda, 0xd0,
+ 0xda, 0x44, 0xa6, 0x3d, 0xa0, 0x1e, 0x30, 0xa6,
+ 0x7e, 0x97, 0x9b, 0x1a, 0x96, 0x99, 0xa2, 0x98,
+ 0x1e, 0x13, 0xed, 0x92, 0x92, 0x8a, 0x88, 0x92,
+ 0x1f, 0x88, 0x93, 0x93, 0x8a, 0x96, 0x1b, 0xf7,
+ 0x1, 0xf7, 0x3, 0xcc, 0xf7, 0x4, 0x9f, 0x89,
+ 0x93, 0x87, 0x9a, 0x1f, 0xce, 0xc3, 0xfb, 0x3,
+ 0x6, 0x9e, 0x73, 0x67, 0x99, 0x5b, 0x1b, 0xfb,
+ 0x28, 0x3f, 0x25, 0x3e, 0x54, 0xa8, 0x64, 0xbe,
+ 0x78, 0x1f, 0x4b, 0x68, 0x6b, 0x79, 0x5e, 0x1a,
+ 0x60, 0xb7, 0x7b, 0x9a, 0x86, 0x1e, 0x13, 0xee,
+ 0xae, 0x7d, 0x15, 0xa7, 0xf7, 0x11, 0x63, 0x56,
+ 0x4f, 0x32, 0x81, 0x5e, 0x40, 0x75, 0xab, 0xb0,
+ 0xbe, 0xd4, 0xb6, 0x90, 0x1f, 0xb1, 0xf7, 0x92,
+ 0x15, 0x13, 0xed, 0xac, 0xa7, 0xf7, 0x2a, 0xd6,
+ 0xaf, 0x95, 0x68, 0x70, 0x5b, 0x68, 0xfb, 0x1d,
+ 0x45, 0x5f, 0x8b, 0xb9, 0x9d, 0x1e, 0xe, 0x89,
+ 0x1d, 0xf7, 0x81, 0x77, 0x12, 0x13, 0x70, 0x7e,
+ 0x83, 0xa, 0xa4, 0xe3, 0xae, 0xf7, 0xa, 0xb4,
+ 0xc9, 0x8, 0xb6, 0xa7, 0xbe, 0xda, 0xb5, 0x1b,
+ 0x9e, 0x8f, 0x7c, 0x83, 0x7d, 0x70, 0x44, 0x73,
+ 0x41, 0x1f, 0x78, 0x4f, 0x79, 0x4e, 0x68, 0x1a,
+ 0x13, 0xb0, 0x6a, 0xa1, 0x6f, 0xb6, 0xdd, 0xb8,
+ 0xd3, 0xcb, 0xb4, 0x1e, 0x75, 0x9a, 0x5, 0x77,
+ 0x88, 0x53, 0x4d, 0x8f, 0xa, 0x90, 0x96, 0x90,
+ 0xa0, 0xc5, 0xa1, 0xcb, 0x1f, 0xa3, 0xd0, 0xa3,
+ 0xd6, 0x9f, 0x1a, 0xda, 0x53, 0x9b, 0x75, 0x59,
+ 0x50, 0x6f, 0xfb, 0x26, 0x29, 0x1e, 0x89, 0x8c,
+ 0xf5, 0xf8, 0x2e, 0x40, 0x7c, 0x53, 0x83, 0x3e,
+ 0x84, 0x82, 0x1d, 0x66, 0x1d, 0xf8, 0xc3, 0xf7,
+ 0x1a, 0x4d, 0x1d, 0x53, 0x55, 0x73, 0x88, 0x1d,
+ 0x8f, 0x95, 0x32, 0x1d, 0xa9, 0x8b, 0x6b, 0x1f,
+ 0x34, 0x1d, 0xfb, 0x2, 0xf8, 0x7f, 0x15, 0x41,
+ 0x1d, 0xe, 0xfc, 0x14, 0xfb, 0x4e, 0x76, 0xf9,
+ 0x89, 0xf7, 0x1a, 0x1, 0xaa, 0xf8, 0x2b, 0x15,
+ 0xbb, 0x99, 0x85, 0x72, 0x1f, 0x23, 0xfc, 0x39,
+ 0x5, 0x36, 0x75, 0x7c, 0x5d, 0x67, 0x1b, 0x81,
+ 0x7f, 0x92, 0x90, 0x8f, 0x8e, 0x90, 0x8f, 0x90,
+ 0x1f, 0x8f, 0x91, 0x8f, 0x91, 0x97, 0x1a, 0xb3,
+ 0x65, 0x94, 0x80, 0x73, 0x72, 0x76, 0x6b, 0x6f,
+ 0xa0, 0x5a, 0xe0, 0xe4, 0xd6, 0xc9, 0xf7, 0x3d,
+ 0xb7, 0x1e, 0xf7, 0x6, 0xf8, 0x4a, 0x45, 0x7c,
+ 0x7b, 0x89, 0xfb, 0xe, 0x80, 0x19, 0xf7, 0x5,
+ 0xf7, 0x4c, 0x15, 0x41, 0x1d, 0xe, 0x83, 0xd2,
+ 0x61, 0x76, 0xf8, 0x55, 0x77, 0xf7, 0xa2, 0x77,
+ 0x12, 0x13, 0x70, 0x74, 0x16, 0xf7, 0xe, 0x6,
+ 0xbd, 0xf7, 0x50, 0xb2, 0xa6, 0x5, 0x13, 0xb0,
+ 0xfb, 0xe, 0xa1, 0xa3, 0x26, 0xd9, 0x1b, 0xd0,
+ 0xb5, 0xdb, 0xb7, 0xa3, 0x1f, 0x75, 0x96, 0x5,
+ 0x76, 0x7f, 0x74, 0x60, 0x71, 0x1b, 0x69, 0x7d,
+ 0xd3, 0xf7, 0x32, 0x6c, 0x1f, 0xca, 0xc2, 0xd7,
+ 0xce, 0xa2, 0x85, 0xaf, 0x90, 0x19, 0xae, 0xfb,
+ 0x63, 0x68, 0x7, 0xa5, 0xa4, 0x89, 0x74, 0x68,
+ 0xfb, 0xf, 0x39, 0x65, 0x6d, 0x1f, 0x89, 0x8d,
+ 0xf7, 0xe, 0xf8, 0x5b, 0x4c, 0x7f, 0x38, 0x7f,
+ 0x4d, 0x85, 0x82, 0x1d, 0x66, 0x1d, 0xf9, 0x58,
+ 0x6c, 0x1d, 0x54, 0x55, 0x73, 0x1b, 0x84, 0x87,
+ 0x8f, 0x95, 0x9f, 0x9b, 0xc5, 0x91, 0xa1, 0x1f,
+ 0xf7, 0x25, 0xf8, 0x9f, 0x7f, 0xa, 0xac, 0x8d,
+ 0x6c, 0x1f, 0x5c, 0xfb, 0x22, 0xfc, 0x54, 0x4f,
+ 0x1a, 0x7d, 0x8b, 0x56, 0xcf, 0xdb, 0xb7, 0xd0,
+ 0xce, 0xb7, 0x1e, 0xe, 0xf7, 0x8, 0x97, 0x76,
+ 0xa9, 0x76, 0xf8, 0x19, 0xd4, 0x12, 0x13, 0x60,
+ 0x7d, 0x83, 0xa, 0xf8, 0x0, 0xe8, 0xf7, 0x3,
+ 0xa4, 0x92, 0x1b, 0xb8, 0x4d, 0xfb, 0x2e, 0xfb,
+ 0x7f, 0x41, 0x1f, 0xf7, 0xc, 0x6, 0xbd, 0xf7,
+ 0x38, 0x99, 0xb8, 0xb0, 0xcb, 0x8e, 0x91, 0xde,
+ 0xf7, 0x5, 0xad, 0x8c, 0x8, 0x94, 0x91, 0x83,
+ 0x78, 0x7d, 0x6b, 0x38, 0x72, 0x3c, 0x1f, 0x7a,
+ 0x56, 0x7d, 0x57, 0x6e, 0x1a, 0x13, 0xa0, 0x4a,
+ 0xc0, 0x8b, 0x9c, 0xdb, 0xb9, 0xd9, 0xc0, 0xaa,
+ 0x1e, 0x75, 0x98, 0x5, 0x73, 0x88, 0x57, 0x58,
+ 0x76, 0x1b, 0x86, 0x87, 0x90, 0x94, 0x9d, 0x9f,
+ 0xc3, 0xa0, 0xc7, 0x1f, 0xa2, 0xce, 0xa4, 0xd4,
+ 0xae, 0x1a, 0xb7, 0x73, 0xae, 0x54, 0x39, 0x50,
+ 0x37, 0x3a, 0x58, 0x1e, 0x8a, 0x8d, 0x5, 0x94,
+ 0xa2, 0x99, 0xad, 0xb2, 0x1a, 0xce, 0x4e, 0x8b,
+ 0x86, 0x32, 0x4a, 0x27, 0x32, 0x51, 0x1e, 0x88,
+ 0x8d, 0xc7, 0xf7, 0x4e, 0x46, 0x7b, 0x72, 0x89,
+ 0x21, 0x82, 0x6d, 0xa, 0x9a, 0xb2, 0x8e, 0x6e,
+ 0x1f, 0x13, 0x60, 0x6a, 0x5e, 0xfb, 0x1f, 0x52,
+ 0xfb, 0x65, 0x1e, 0xe, 0x89, 0x1d, 0x12, 0x13,
+ 0x60, 0x78, 0xa, 0xaf, 0x6d, 0x2e, 0x30, 0x6d,
+ 0x1f, 0x77, 0x4f, 0x78, 0x50, 0x6c, 0x1a, 0x13,
+ 0xa0, 0x76, 0x1d, 0x6a, 0x81, 0x62, 0x61, 0x76,
+ 0x1b, 0x84, 0x86, 0x90, 0x97, 0x99, 0x9f, 0xc4,
+ 0xa0, 0xc9, 0x1f, 0xa1, 0xcd, 0xa3, 0xd4, 0xad,
+ 0x4f, 0xa, 0x13, 0x60, 0x88, 0xa, 0xe, 0x7e,
+ 0xa8, 0xf8, 0x35, 0xa8, 0x52, 0x1d, 0xe1, 0x15,
+ 0xcb, 0xbf, 0xf7, 0xaf, 0xf7, 0x0, 0xa5, 0x9f,
+ 0x7d, 0x59, 0x40, 0x4f, 0xfb, 0xaa, 0x2b, 0x57,
+ 0x8d, 0xbd, 0x9f, 0x1e, 0xfb, 0xb, 0xbd, 0x15,
+ 0x2b, 0xd7, 0x56, 0xdd, 0xf7, 0x34, 0xf7, 0x12,
+ 0xf7, 0x40, 0xf7, 0x29, 0xf7, 0x1a, 0xfb, 0x9,
+ 0x9f, 0x65, 0xfb, 0x32, 0xfb, 0x17, 0xfb, 0x40,
+ 0xfb, 0x2e, 0x1e, 0xe, 0x87, 0x1d, 0x59, 0x1d,
+ 0x78, 0x6b, 0x43, 0x44, 0xfb, 0x8a, 0x4f, 0x1d,
+ 0x57, 0x1f, 0x88, 0x8e, 0xad, 0xf2, 0x44, 0x7d,
+ 0x64, 0x87, 0x38, 0x81, 0x6d, 0xa, 0xaf, 0x9d,
+ 0x89, 0x72, 0x75, 0x4a, 0xfb, 0x85, 0x4f, 0xfb,
+ 0x8f, 0x1f, 0x69, 0x83, 0x6d, 0x87, 0xa, 0x6d,
+ 0x8d, 0xab, 0xa1, 0xa8, 0xe3, 0x93, 0xac, 0x1f,
+ 0xe, 0xfb, 0x61, 0xb0, 0xf7, 0x2f, 0xd3, 0xf7,
+ 0xfc, 0xb6, 0x7e, 0x77, 0x12, 0x8c, 0xf7, 0x11,
+ 0x13, 0xd8, 0xf3, 0xfb, 0x3c, 0x15, 0x66, 0xf7,
+ 0x9f, 0xb0, 0x7, 0x68, 0x6d, 0x8b, 0xa9, 0xa0,
+ 0xf7, 0x13, 0xf8, 0x37, 0xb1, 0xf7, 0x27, 0x1f,
+ 0xfb, 0x1, 0x6, 0x7d, 0x54, 0x6f, 0xa, 0x13,
+ 0xe8, 0xab, 0x86, 0x84, 0xaf, 0x4b, 0x1b, 0xfb,
+ 0x13, 0xfb, 0x22, 0xfb, 0x60, 0xfb, 0x11, 0x6a,
+ 0x8b, 0xfb, 0x5, 0xf4, 0xd4, 0xb8, 0xc5, 0xb9,
+ 0xa7, 0x1f, 0x8d, 0x89, 0x4f, 0xfb, 0x77, 0x83,
+ 0x6d, 0x6d, 0x8e, 0x57, 0x88, 0x19, 0xa1, 0xf7,
+ 0xc1, 0x15, 0xd6, 0xdc, 0xf7, 0x67, 0xdd, 0xa7,
+ 0x93, 0x70, 0x74, 0x54, 0x4a, 0xfb, 0x93, 0x2e,
+ 0x62, 0x8b, 0xbc, 0xa4, 0x1e, 0xe, 0xfb, 0xa5,
+ 0xa0, 0x76, 0xf8, 0x62, 0x77, 0x1, 0x76, 0x83,
+ 0xa, 0xab, 0xe8, 0x95, 0xbb, 0xa5, 0xce, 0x8,
+ 0xc0, 0xa1, 0xbf, 0xef, 0xa7, 0x1b, 0x91, 0x91,
+ 0x83, 0x83, 0x92, 0x1f, 0x81, 0x94, 0x98, 0x7f,
+ 0x9e, 0x1b, 0xaa, 0xa7, 0xa6, 0xb9, 0xcd, 0x55,
+ 0x8b, 0x87, 0x49, 0x50, 0xfb, 0xc, 0x51, 0x68,
+ 0x1f, 0xc3, 0xf7, 0x46, 0x48, 0x7a, 0x6c, 0x89,
+ 0x25, 0x82, 0x6d, 0xa, 0xaf, 0x9d, 0x89, 0x72,
+ 0x6b, 0x5a, 0xfb, 0x3c, 0x56, 0xfb, 0x48, 0x1f,
+ 0xe, 0xfb, 0xa5, 0x93, 0x76, 0xf8, 0x51, 0xac,
+ 0x87, 0x77, 0x12, 0x8e, 0xa6, 0xf7, 0x2d, 0xeb,
+ 0xa4, 0xa8, 0x13, 0xdc, 0x85, 0xa, 0x96, 0x95,
+ 0x87, 0x86, 0x97, 0x1f, 0x86, 0x9a, 0x9c, 0x85,
+ 0xa3, 0x1b, 0xcb, 0xe4, 0xb0, 0xec, 0xba, 0x6f,
+ 0xb6, 0x6c, 0xb3, 0x1f, 0x66, 0xbb, 0x62, 0xb5,
+ 0xad, 0x1a, 0x90, 0x87, 0xbc, 0xc0, 0xc6, 0xa4,
+ 0x46, 0x59, 0x93, 0x1e, 0xa6, 0x89, 0x5, 0x13,
+ 0xbc, 0x79, 0xa, 0x7b, 0x82, 0x91, 0x90, 0x80,
+ 0x1f, 0x91, 0x80, 0x7e, 0x90, 0x72, 0x1b, 0x4a,
+ 0x3c, 0x67, 0x32, 0x62, 0xaa, 0x5f, 0xab, 0x60,
+ 0x1f, 0xae, 0x5c, 0xb1, 0x5c, 0x60, 0x1a, 0x72,
+ 0x78, 0x6d, 0x65, 0x82, 0x43, 0x7c, 0xa, 0xe,
+ 0x66, 0x1d, 0xf8, 0x34, 0xb5, 0xf7, 0x25, 0x77,
+ 0x1, 0xf7, 0x5f, 0xf7, 0x21, 0x15, 0x79, 0x89,
+ 0x55, 0x4e, 0x72, 0x1b, 0x84, 0x87, 0x8f, 0x95,
+ 0xad, 0xc1, 0xf7, 0x43, 0xac, 0xf7, 0xe, 0x1f,
+ 0xde, 0xb5, 0x43, 0x6, 0xb2, 0xf7, 0x25, 0x5,
+ 0x68, 0x6, 0x47, 0x21, 0x3f, 0x6c, 0x64, 0x7c,
+ 0x8, 0x68, 0xbe, 0x7, 0x5f, 0xfb, 0x32, 0x5b,
+ 0xfb, 0x2a, 0x62, 0x1a, 0x84, 0x8b, 0x4f, 0xd3,
+ 0xd9, 0xbc, 0xd9, 0xc5, 0xb0, 0x1e, 0xe, 0x64,
+ 0xa, 0xac, 0x77, 0x12, 0x13, 0xc0, 0x2c, 0x1d,
+ 0x56, 0x4d, 0x73, 0x1b, 0x84, 0x87, 0x91, 0x98,
+ 0x31, 0xa, 0x63, 0xa0, 0xc2, 0xaf, 0x96, 0x1f,
+ 0x13, 0xa0, 0x44, 0x1d, 0xa1, 0x88, 0x71, 0x6e,
+ 0x78, 0x50, 0x79, 0x4f, 0x1f, 0x78, 0x4d, 0x78,
+ 0x4b, 0x68, 0x47, 0xa, 0xe, 0xfb, 0x6e, 0x93,
+ 0x76, 0xf8, 0x6f, 0x77, 0x1, 0xda, 0xf7, 0xf,
+ 0xdd, 0xf7, 0x9, 0x3, 0xe0, 0x7e, 0x15, 0xa5,
+ 0x6, 0xf7, 0x3e, 0xf7, 0x32, 0xf7, 0xc, 0xf7,
+ 0x29, 0xef, 0x1a, 0xb6, 0x68, 0xa4, 0x6f, 0x73,
+ 0x6d, 0x73, 0x6a, 0x76, 0x95, 0x7d, 0x95, 0x7f,
+ 0x1e, 0x97, 0x7d, 0x97, 0x80, 0x79, 0x1a, 0x6f,
+ 0x75, 0x60, 0x23, 0xfb, 0x8, 0x1e, 0xf7, 0x4e,
+ 0x82, 0xcf, 0x75, 0xdb, 0x1e, 0x4f, 0x7c, 0x63,
+ 0x86, 0x54, 0x83, 0x8, 0x70, 0x7, 0xaa, 0xa5,
+ 0x87, 0x6a, 0x1f, 0x86, 0x8c, 0x85, 0x84, 0x1a,
+ 0xe, 0x90, 0x93, 0x76, 0xf7, 0x5f, 0x77, 0xf7,
+ 0xb8, 0x77, 0x1, 0xe0, 0xf7, 0xb, 0xf7, 0xe2,
+ 0xd7, 0x3, 0xea, 0x7e, 0x15, 0xa6, 0x6, 0xda,
+ 0xf7, 0xd, 0xdb, 0xf7, 0x22, 0x94, 0x9e, 0x8,
+ 0x8d, 0x6, 0x8f, 0x5d, 0x9c, 0xfb, 0x67, 0x8d,
+ 0x72, 0x8, 0xa6, 0x6, 0xb5, 0xb7, 0xf7, 0x7a,
+ 0xf7, 0x85, 0xf7, 0x11, 0x1a, 0xb9, 0x66, 0x9e,
+ 0x73, 0x6a, 0x74, 0x6b, 0x70, 0x77, 0x95, 0x7d,
+ 0x95, 0x7d, 0x1e, 0x95, 0x7d, 0x96, 0x7d, 0x79,
+ 0x1a, 0x62, 0x37, 0x2a, 0x68, 0x62, 0x1e, 0x6b,
+ 0xf7, 0xe0, 0x5, 0x70, 0x6, 0x52, 0x30, 0x5d,
+ 0x31, 0x58, 0x30, 0x8, 0x89, 0x6, 0xf7, 0x12,
+ 0x7e, 0xd3, 0x77, 0xd5, 0x1e, 0x5e, 0x82, 0x5d,
+ 0x81, 0x4b, 0x82, 0x8, 0x70, 0x7, 0xab, 0xa5,
+ 0x8b, 0x69, 0x1f, 0x85, 0x8c, 0x84, 0x83, 0x1a,
+ 0xe, 0x93, 0x76, 0xe9, 0x77, 0xb4, 0x77, 0xf8,
+ 0x10, 0x77, 0x1, 0xf7, 0x41, 0xf7, 0x22, 0x15,
+ 0xfb, 0xa, 0x9f, 0xab, 0x66, 0xba, 0x1b, 0xcd,
+ 0xc4, 0xdf, 0xb1, 0xa5, 0x1f, 0x76, 0x99, 0x5,
+ 0x68, 0x76, 0x75, 0x75, 0x78, 0x1b, 0x78, 0x7c,
+ 0x99, 0xb0, 0x83, 0x1f, 0x6b, 0xf7, 0x30, 0x5,
+ 0x9f, 0x99, 0xb6, 0xd6, 0xae, 0x1b, 0x97, 0x92,
+ 0x86, 0x86, 0x93, 0x1f, 0x86, 0x92, 0x93, 0x86,
+ 0x99, 0x1b, 0xac, 0xa3, 0xa5, 0xa5, 0xa3, 0x74,
+ 0xb1, 0x6a, 0x57, 0x69, 0x6a, 0x22, 0x41, 0x1f,
+ 0x7b, 0xd9, 0x82, 0xab, 0x77, 0xa7, 0xfb, 0x3b,
+ 0x73, 0x18, 0x70, 0x7, 0x8c, 0x95, 0x98, 0x8c,
+ 0x96, 0x1b, 0x9e, 0xa4, 0x8b, 0x48, 0x98, 0x1f,
+ 0xa9, 0xfb, 0x2e, 0x5, 0x34, 0x55, 0x7c, 0x73,
+ 0x75, 0x1b, 0x7f, 0x85, 0x91, 0x91, 0x81, 0x1f,
+ 0x8f, 0x83, 0x81, 0x90, 0x7b, 0x1b, 0x68, 0x77,
+ 0x6c, 0x73, 0x7b, 0x94, 0x5f, 0xc0, 0xc2, 0xcb,
+ 0xd4, 0xdd, 0xb1, 0x1f, 0xe, 0x79, 0x1d, 0x1,
+ 0xf7, 0xdc, 0xcb, 0x3, 0x45, 0xa, 0x95, 0x94,
+ 0x7c, 0x1e, 0x93, 0x7e, 0x7d, 0x93, 0x79, 0x38,
+ 0x1d, 0x6a, 0x99, 0x80, 0x99, 0x81, 0x1e, 0x98,
+ 0x82, 0x99, 0x83, 0x75, 0x7a, 0xa, 0xe, 0xfb,
+ 0xa5, 0x52, 0x76, 0xf8, 0x46, 0xe8, 0x1, 0x79,
+ 0x74, 0x15, 0xa7, 0xb1, 0x8b, 0x8b, 0x9a, 0x1b,
+ 0xa4, 0xa4, 0x79, 0x78, 0xa8, 0x1f, 0x75, 0xac,
+ 0xb2, 0x73, 0xc0, 0x76, 0xa, 0x7f, 0x8e, 0x83,
+ 0x8f, 0x85, 0x1f, 0x91, 0x82, 0x92, 0x86, 0x82,
+ 0x1a, 0x84, 0x83, 0x83, 0x7e, 0x6f, 0x81, 0xa6,
+ 0xac, 0x7a, 0x1e, 0x7a, 0xab, 0x72, 0xb1, 0x51,
+ 0xa2, 0x80, 0xa, 0xfb, 0x2b, 0x70, 0x1d, 0xfb,
+ 0xf9, 0x5, 0xe, 0x8a, 0xa, 0x12, 0xa7, 0xf3,
+ 0x60, 0xf1, 0x13, 0xe0, 0xf7, 0x69, 0xfb, 0x43,
+ 0x15, 0x47, 0x95, 0x7e, 0xad, 0xaf, 0x1a, 0x13,
+ 0xd0, 0xc5, 0xc6, 0xf7, 0x2f, 0xc0, 0x1a, 0xb7,
+ 0x77, 0x9b, 0x47, 0x9c, 0x1e, 0x8d, 0x7, 0xf1,
+ 0x9d, 0xa6, 0xa5, 0x9d, 0xd2, 0xb8, 0xf7, 0x47,
+ 0x18, 0x9d, 0xd1, 0xae, 0xb8, 0xe0, 0x9a, 0x8e,
+ 0x97, 0x18, 0xfb, 0x19, 0x37, 0x77, 0xfb, 0xe,
+ 0x6c, 0x1f, 0x5d, 0xfb, 0x47, 0x7a, 0x49, 0x6f,
+ 0x6c, 0x2f, 0x78, 0x19, 0xc4, 0x7d, 0xa6, 0x79,
+ 0x60, 0x1a, 0x13, 0xe0, 0x64, 0x4e, 0xfb, 0x41,
+ 0x52, 0x1a, 0x4b, 0xb2, 0x6f, 0xf7, 0x23, 0x1e,
+ 0xe, 0xfc, 0x4e, 0xfb, 0x3b, 0x76, 0xf7, 0x53,
+ 0x8d, 0x1d, 0xb0, 0xe3, 0x3, 0xf7, 0x5d, 0xf9,
+ 0x41, 0x15, 0xcf, 0x6, 0xfb, 0x79, 0xfd, 0xfd,
+ 0x5, 0x47, 0x6, 0xe, 0x8a, 0xa, 0x1, 0xf7,
+ 0x8, 0xf1, 0x6d, 0xf3, 0x3, 0xfb, 0x12, 0xfb,
+ 0x43, 0x15, 0xe0, 0x9b, 0xad, 0xb1, 0x9e, 0xd1,
+ 0xb8, 0xf7, 0x3f, 0x18, 0x9e, 0xd3, 0xa6, 0xb1,
+ 0xf0, 0x9e, 0x8, 0x8d, 0x7, 0x47, 0x9b, 0x77,
+ 0x9a, 0xb6, 0xc0, 0xc6, 0xf7, 0x2f, 0xc6, 0x1a,
+ 0xb0, 0x7e, 0xad, 0x47, 0x96, 0x1e, 0x8e, 0x97,
+ 0x5, 0xf7, 0x23, 0xb2, 0x6d, 0x4b, 0x1f, 0x52,
+ 0x4e, 0xfb, 0x3e, 0x63, 0x1a, 0x60, 0xa6, 0x7a,
+ 0xc4, 0x7c, 0x1e, 0x2e, 0x78, 0x71, 0x5e, 0x79,
+ 0x49, 0x5d, 0xfb, 0x3f, 0x18, 0xfb, 0xd, 0x6b,
+ 0x38, 0x7c, 0xfb, 0x19, 0x1b, 0xe, 0x2f, 0xf7,
+ 0x45, 0xdf, 0x48, 0x76, 0xa2, 0x76, 0xd1, 0xdf,
+ 0x8f, 0x77, 0x12, 0x13, 0x50, 0xef, 0xf7, 0x41,
+ 0x15, 0xae, 0x9b, 0xa3, 0xb0, 0xb7, 0x1b, 0xb4,
+ 0xac, 0x7c, 0x7b, 0xaa, 0x1f, 0x13, 0x88, 0x79,
+ 0xae, 0xad, 0x78, 0xb6, 0x1b, 0xc9, 0xac, 0xb7,
+ 0xb5, 0xa9, 0x1f, 0x67, 0xd1, 0x5, 0x68, 0x74,
+ 0x72, 0x66, 0x63, 0x1b, 0x6e, 0x68, 0x9b, 0x9b,
+ 0x67, 0x1f, 0x13, 0x30, 0x9d, 0x64, 0x63, 0x9d,
+ 0x69, 0x1b, 0x48, 0x67, 0x5f, 0x61, 0x75, 0x1f,
+ 0xe, 0xfb, 0xa5, 0xfb, 0x4c, 0x76, 0xf8, 0xbd,
+ 0xf7, 0x24, 0x1, 0x9e, 0xf7, 0x29, 0x95, 0xf7,
+ 0x24, 0x3, 0xf7, 0x55, 0xf7, 0xa7, 0x15, 0x4c,
+ 0xfb, 0x39, 0x3a, 0xfb, 0x2f, 0x7b, 0x6d, 0x8,
+ 0x82, 0x7a, 0x86, 0x7a, 0x7c, 0x1a, 0x5d, 0xac,
+ 0x68, 0xae, 0xc6, 0x9e, 0xc1, 0xb5, 0x8e, 0x1e,
+ 0x94, 0xf7, 0x7, 0xa4, 0xf7, 0x32, 0x9f, 0xf2,
+ 0x8, 0x5f, 0xf7, 0x2d, 0x15, 0x63, 0xab, 0x6b,
+ 0xb3, 0xb3, 0xab, 0xab, 0xb3, 0xb3, 0x6b, 0xab,
+ 0x63, 0x63, 0x6b, 0x6b, 0x63, 0x1e, 0xe, 0xfb,
+ 0xe, 0x76, 0xf7, 0x2b, 0x76, 0xf8, 0x4f, 0xac,
+ 0xf7, 0x5, 0x77, 0x1, 0x97, 0xf7, 0x13, 0x3,
+ 0xf7, 0x6a, 0xc4, 0x15, 0x63, 0x9c, 0x86, 0xbe,
+ 0xa5, 0x1a, 0xce, 0xca, 0xf7, 0x68, 0xde, 0xa0,
+ 0x8e, 0x82, 0x84, 0x1e, 0xfb, 0x29, 0xfc, 0x3f,
+ 0x15, 0x5d, 0xfb, 0x16, 0x5, 0xad, 0x6, 0xba,
+ 0xf7, 0x19, 0xdd, 0x98, 0xb6, 0xc8, 0xb5, 0xc6,
+ 0x19, 0x70, 0x9d, 0x6b, 0x5b, 0x64, 0x63, 0x5c,
+ 0x8a, 0x19, 0xe7, 0xf7, 0x9a, 0x5, 0x85, 0x92,
+ 0x97, 0x86, 0x9d, 0x1b, 0xaa, 0xab, 0xa5, 0xb5,
+ 0xab, 0x79, 0xa9, 0x68, 0x9c, 0x1f, 0xb8, 0xf7,
+ 0x12, 0x5, 0x68, 0x6, 0x62, 0xfb, 0x8, 0x5,
+ 0x8d, 0x81, 0x81, 0x8c, 0x7f, 0x1b, 0xfb, 0x1b,
+ 0xfb, 0x26, 0xfb, 0x2e, 0xfb, 0x32, 0xfb, 0xe,
+ 0xe9, 0x61, 0xc1, 0x1f, 0xe, 0x7f, 0xaa, 0x6c,
+ 0xf3, 0x23, 0xf7, 0x42, 0xfb, 0x2c, 0x76, 0xf7,
+ 0x17, 0x77, 0xc2, 0x77, 0xf7, 0x43, 0xc7, 0xf7,
+ 0xab, 0xad, 0x12, 0x6b, 0xa9, 0x13, 0x4f, 0x80,
+ 0xf7, 0x30, 0xbc, 0x15, 0x6e, 0xab, 0xb8, 0x6b,
+ 0xb8, 0x1b, 0xe7, 0xb9, 0xd0, 0xed, 0x9d, 0x1f,
+ 0x72, 0x6, 0x67, 0x7b, 0x7f, 0x70, 0x46, 0x1b,
+ 0x65, 0x4a, 0xa5, 0x91, 0x7c, 0x1f, 0xad, 0xc0,
+ 0xaa, 0xde, 0x95, 0xbd, 0x8, 0xf7, 0x7, 0x6,
+ 0x95, 0xc7, 0x5, 0xfb, 0x6, 0x6, 0xb2, 0xf7,
+ 0x5e, 0x5, 0xbc, 0x94, 0xa0, 0xa7, 0xaa, 0x1b,
+ 0xa7, 0x87, 0x73, 0x73, 0x86, 0x1f, 0x89, 0x82,
+ 0x8a, 0x82, 0x83, 0x1a, 0x67, 0xab, 0x7c, 0xa0,
+ 0xa7, 0xac, 0xa2, 0xb7, 0xcc, 0x4f, 0xa6, 0x58,
+ 0x67, 0xfb, 0x37, 0x7d, 0xfb, 0xbf, 0x59, 0x1e,
+ 0x22, 0x6, 0x81, 0x4f, 0x5, 0xf7, 0x1, 0x6,
+ 0x83, 0x56, 0x86, 0x4d, 0x85, 0x5c, 0x8, 0x13,
+ 0x23, 0x80, 0x93, 0x78, 0x7d, 0x91, 0x6b, 0x1b,
+ 0x5d, 0x5d, 0x6d, 0x50, 0x1f, 0x13, 0x1f, 0x80,
+ 0x5e, 0xaf, 0x64, 0xbe, 0xca, 0xa2, 0xaf, 0xa3,
+ 0x9a, 0x1e, 0x60, 0xb4, 0x15, 0x13, 0x8f, 0x80,
+ 0x6a, 0x85, 0x7b, 0x65, 0x66, 0x1b, 0x75, 0x69,
+ 0x99, 0xad, 0xb7, 0xaa, 0x94, 0x9f, 0xa9, 0xa0,
+ 0x79, 0x7f, 0x98, 0x1f, 0xe, 0xd2, 0x76, 0xdc,
+ 0xd5, 0xf7, 0x65, 0xd5, 0xd4, 0x77, 0x1, 0xd3,
+ 0xdb, 0xf7, 0x5d, 0xda, 0x3, 0xf7, 0x1c, 0xf7,
+ 0xcc, 0x15, 0xca, 0xbe, 0xbf, 0xcb, 0xcd, 0xba,
+ 0x55, 0x4c, 0x4a, 0x5b, 0x54, 0x48, 0x4a, 0x5b,
+ 0xc4, 0xcc, 0x1e, 0x39, 0xfb, 0x8e, 0x15, 0xe1,
+ 0xe3, 0x5, 0x78, 0xa7, 0xb3, 0x7c, 0xb6, 0x1b,
+ 0xb6, 0xb1, 0x9a, 0x9e, 0xa7, 0x1f, 0xe1, 0x33,
+ 0xbf, 0xbf, 0x34, 0xe3, 0x5, 0xa0, 0xa6, 0x96,
+ 0xb2, 0xb6, 0x1a, 0xb6, 0x7d, 0xb1, 0x78, 0xa7,
+ 0x1e, 0xe3, 0xe3, 0x57, 0xbd, 0x34, 0x35, 0x5,
+ 0x9e, 0x6e, 0x67, 0x95, 0x5f, 0x1b, 0x62, 0x62,
+ 0x81, 0x78, 0x6f, 0x1f, 0x35, 0xe1, 0x57, 0x59,
+ 0xe3, 0x33, 0x5, 0x78, 0x70, 0x7c, 0x64, 0x60,
+ 0x1a, 0x60, 0x98, 0x65, 0xa0, 0x6f, 0x1e, 0x33,
+ 0x33, 0x5, 0xe, 0x8b, 0xa4, 0xf7, 0x1f, 0xbd,
+ 0xd9, 0xbd, 0xf7, 0xc2, 0xa4, 0x1, 0xb9, 0x16,
+ 0xf7, 0xd6, 0xa4, 0x6, 0x59, 0x8d, 0x6c, 0x8c,
+ 0xb4, 0x1a, 0xa8, 0x98, 0xb6, 0x91, 0xa2, 0x1e,
+ 0xf7, 0x2c, 0x6, 0x99, 0xbd, 0x5, 0xfb, 0x2c,
+ 0x6, 0xa0, 0xd9, 0x5, 0xf7, 0x2a, 0x6, 0x98,
+ 0xbd, 0x5, 0xfb, 0x1b, 0x6, 0xf7, 0x30, 0xf7,
+ 0x7d, 0x90, 0x1d, 0xb8, 0x93, 0x19, 0xa4, 0xfb,
+ 0x5c, 0x72, 0x7, 0xc7, 0xa1, 0x7c, 0x79, 0x82,
+ 0x86, 0x80, 0x84, 0x80, 0x1f, 0xfb, 0x2b, 0xfb,
+ 0x80, 0x5, 0x74, 0xc1, 0x56, 0xf7, 0x54, 0x9d,
+ 0x1a, 0xa2, 0x97, 0x98, 0xca, 0x1e, 0xa4, 0xfb,
+ 0xac, 0x72, 0x7, 0xc0, 0x84, 0x8a, 0x92, 0xa1,
+ 0x64, 0xd8, 0xfb, 0x9b, 0x18, 0xfb, 0x11, 0x6,
+ 0x7d, 0x59, 0x5, 0xf7, 0x22, 0x6, 0x75, 0x3d,
+ 0x5, 0xfb, 0x21, 0x6, 0x7d, 0x59, 0x5, 0xf7,
+ 0x21, 0x6, 0x70, 0x2c, 0x7f, 0x62, 0x71, 0x8d,
+ 0x4c, 0x86, 0x19, 0xe, 0xfc, 0x4e, 0x3e, 0x76,
+ 0xf0, 0x76, 0xf7, 0x96, 0x77, 0xad, 0x77, 0xf8,
+ 0x57, 0x77, 0x12, 0xcd, 0xe3, 0x13, 0xdc, 0xf5,
+ 0xf7, 0xf5, 0x15, 0xcf, 0x6, 0xef, 0xf7, 0xe0,
+ 0x5, 0x43, 0x6, 0xfb, 0x78, 0xfd, 0xa3, 0x15,
+ 0xd4, 0x6, 0x13, 0xec, 0xeb, 0xf7, 0xe6, 0x5,
+ 0x47, 0x6, 0xe, 0xfb, 0xe, 0x76, 0xa2, 0x77,
+ 0xf7, 0x99, 0xa6, 0xf7, 0x90, 0xa4, 0xf7, 0x78,
+ 0xa1, 0x12, 0xaf, 0xf7, 0x6, 0x9d, 0xd1, 0xa9,
+ 0xd8, 0x9e, 0xd2, 0x13, 0x7f, 0x80, 0xf7, 0xb2,
+ 0xf7, 0xd, 0x15, 0x8d, 0x8f, 0x5, 0x88, 0x93,
+ 0x95, 0x8a, 0x97, 0x1b, 0xc6, 0xc5, 0xbc, 0xd6,
+ 0xca, 0x62, 0xc1, 0x78, 0xa3, 0x1f, 0x26, 0xf7,
+ 0xc, 0x67, 0xb5, 0xb4, 0x1a, 0xb0, 0xa3, 0xb0,
+ 0xc3, 0xaf, 0xa7, 0x7c, 0x7f, 0x82, 0x83, 0x87,
+ 0x83, 0x84, 0x1e, 0x80, 0x84, 0x82, 0x81, 0x77,
+ 0x1a, 0x70, 0xa3, 0x71, 0xaa, 0xa0, 0xb0, 0x99,
+ 0xbb, 0xb7, 0x62, 0xc0, 0x27, 0x37, 0x49, 0x55,
+ 0x3a, 0x4b, 0xb7, 0x56, 0x96, 0x80, 0x1e, 0x89,
+ 0x88, 0x5, 0x8f, 0x7e, 0x6d, 0x8d, 0x86, 0x1b,
+ 0xfb, 0x0, 0x6e, 0xfb, 0x2b, 0x28, 0xde, 0x1f,
+ 0xf7, 0x16, 0xfb, 0x34, 0x9e, 0x77, 0x63, 0x1a,
+ 0x4e, 0x4f, 0x7d, 0x70, 0x75, 0x5f, 0x95, 0x9d,
+ 0x96, 0x93, 0x8f, 0x94, 0x93, 0x1e, 0x94, 0x93,
+ 0x94, 0x94, 0xa2, 0x1a, 0xb4, 0x66, 0x95, 0x77,
+ 0x6f, 0x6e, 0x76, 0x64, 0x1e, 0x13, 0xbf, 0x80,
+ 0x52, 0xc4, 0x5b, 0xe3, 0xe2, 0xd8, 0xc4, 0xd8,
+ 0xc6, 0x64, 0xb9, 0x77, 0xa4, 0x1e, 0x3b, 0xec,
+ 0x15, 0x88, 0x8e, 0x4b, 0xcf, 0xbe, 0x1a, 0xb2,
+ 0xa5, 0xa0, 0xab, 0xc2, 0xf7, 0x4, 0xfb, 0x17,
+ 0x50, 0x60, 0x69, 0x78, 0x72, 0x6e, 0x7a, 0x97,
+ 0xc5, 0x56, 0x1e, 0xe, 0xfb, 0xdd, 0xf8, 0xa1,
+ 0xf7, 0x16, 0x1, 0xb8, 0xf7, 0x16, 0xdf, 0xf7,
+ 0x16, 0x3, 0xb8, 0xf8, 0xe2, 0x15, 0x4b, 0xa,
+ 0xf7, 0x68, 0x16, 0x4b, 0xa, 0xe, 0xe0, 0x79,
+ 0xb9, 0xf7, 0x4, 0xa2, 0xe2, 0x77, 0xf7, 0xb4,
+ 0x9f, 0xf0, 0xb9, 0x1, 0x9f, 0xc8, 0x58, 0xc8,
+ 0xe4, 0xe0, 0xf8, 0x1c, 0xc8, 0x3, 0xa9, 0xf7,
+ 0xe1, 0x15, 0xf7, 0x57, 0xf7, 0x2b, 0xf7, 0x31,
+ 0xf7, 0x55, 0xf7, 0x55, 0xf7, 0x2b, 0xfb, 0x31,
+ 0xfb, 0x58, 0xfb, 0x58, 0xfb, 0x2b, 0xfb, 0x2e,
+ 0xfb, 0x55, 0xfb, 0x55, 0xfb, 0x2b, 0xf7, 0x2f,
+ 0xf7, 0x58, 0x1e, 0xc8, 0x16, 0xfb, 0x38, 0xf7,
+ 0x12, 0xfb, 0x21, 0xf7, 0x31, 0xf7, 0x31, 0xf7,
+ 0x12, 0xf7, 0x20, 0xf7, 0x38, 0xf7, 0x38, 0xfb,
+ 0x12, 0xf7, 0x23, 0xfb, 0x31, 0xfb, 0x32, 0xfb,
+ 0x11, 0xfb, 0x23, 0xfb, 0x37, 0x1e, 0xf8, 0x59,
+ 0x38, 0x15, 0x7a, 0x43, 0x5, 0x70, 0x6e, 0x66,
+ 0x80, 0x48, 0x1b, 0xfb, 0xc, 0x2d, 0xc8, 0xf7,
+ 0x21, 0xe0, 0xc8, 0xf7, 0x3, 0xf7, 0x32, 0xc0,
+ 0xa5, 0x82, 0x82, 0xa6, 0x1f, 0x9a, 0x86, 0x92,
+ 0x84, 0x82, 0x1a, 0x44, 0x7a, 0x7, 0xb6, 0x83,
+ 0x70, 0xba, 0x3f, 0x1b, 0x2f, 0x61, 0x3e, 0x28,
+ 0x20, 0xa8, 0x43, 0xef, 0xcc, 0xba, 0xb2, 0xbb,
+ 0x9f, 0x1f, 0xe, 0xfc, 0x20, 0xf8, 0x24, 0xb8,
+ 0x72, 0x76, 0xf7, 0x97, 0xa6, 0x12, 0x9b, 0xd9,
+ 0x13, 0x70, 0xf7, 0x54, 0xf8, 0x6f, 0x15, 0x87,
+ 0x7b, 0x88, 0x81, 0x81, 0x1a, 0x6c, 0xaa, 0x82,
+ 0x97, 0xb3, 0xb0, 0xb8, 0xaa, 0xa0, 0x1e, 0x7e,
+ 0x94, 0x5, 0x7f, 0x85, 0x6f, 0x6e, 0x7f, 0x1b,
+ 0x88, 0x89, 0x8d, 0x91, 0xa1, 0x98, 0xb2, 0x94,
+ 0xa7, 0x1f, 0xb9, 0xf7, 0x20, 0x3f, 0x88, 0x81,
+ 0x6a, 0x6f, 0xa, 0x9a, 0x88, 0x84, 0xa5, 0x64,
+ 0x1b, 0x39, 0x2c, 0xfb, 0xb, 0x33, 0x1f, 0x13,
+ 0xb0, 0x77, 0x92, 0x51, 0xcc, 0xc1, 0xac, 0xbd,
+ 0xa6, 0x9a, 0x1e, 0x2b, 0x16, 0xb8, 0xc5, 0xf7,
+ 0x1c, 0xba, 0x94, 0x95, 0x7f, 0x7a, 0x63, 0x5e,
+ 0xfb, 0x24, 0x52, 0x88, 0x78, 0x8f, 0xa7, 0x1e,
+ 0xe, 0x72, 0x1d, 0x97, 0xf7, 0x6d, 0x71, 0x1d,
+ 0x81, 0x94, 0x96, 0x82, 0x93, 0x1b, 0x91, 0x8f,
+ 0x8e, 0x98, 0x1f, 0x41, 0x8d, 0xa, 0xe3, 0x5f,
+ 0xa, 0xf7, 0x4d, 0x82, 0x71, 0x1d, 0x80, 0x94,
+ 0x97, 0x8a, 0x1d, 0x41, 0x8d, 0xa, 0xe3, 0xdc,
+ 0xaf, 0x1a, 0x94, 0x88, 0x8e, 0x86, 0x79, 0x60,
+ 0x62, 0x7b, 0x6c, 0xa, 0xe, 0x53, 0xf7, 0x15,
+ 0x76, 0xf7, 0x5d, 0xce, 0x48, 0xe5, 0x1, 0xf8,
+ 0x65, 0xe5, 0x43, 0xd3, 0x3, 0xbe, 0xf7, 0xc9,
+ 0x15, 0xf8, 0x44, 0xfb, 0x5d, 0xd3, 0xf7, 0xa0,
+ 0xfc, 0x8c, 0x6, 0xe, 0xe0, 0x79, 0xb9, 0xf7,
+ 0xf, 0xf7, 0x4e, 0xf7, 0x3d, 0xa0, 0xf7, 0x4,
+ 0xb9, 0x1, 0xa9, 0xc8, 0xf7, 0x3a, 0xd2, 0xf7,
+ 0x1, 0xd4, 0xf7, 0x27, 0xc8, 0x3, 0xa9, 0xf7,
+ 0xe3, 0x15, 0xfb, 0x58, 0xf7, 0x2b, 0xfb, 0x31,
+ 0xf7, 0x55, 0xf7, 0x55, 0xf7, 0x2b, 0xf7, 0x2d,
+ 0xf7, 0x58, 0xf7, 0x58, 0xfb, 0x2b, 0xf7, 0x32,
+ 0xfb, 0x55, 0xfb, 0x55, 0xfb, 0x2b, 0xfb, 0x2f,
+ 0xfb, 0x57, 0x1e, 0xc8, 0x16, 0xf7, 0x38, 0xf7,
+ 0x11, 0xf7, 0x20, 0xf7, 0x32, 0xf7, 0x32, 0xf7,
+ 0x11, 0xfb, 0x24, 0xfb, 0x38, 0xfb, 0x38, 0xfb,
+ 0x11, 0xfb, 0x1f, 0xfb, 0x32, 0xfb, 0x31, 0xfb,
+ 0x12, 0xf7, 0x23, 0xf7, 0x38, 0x1e, 0xf7, 0xb,
+ 0xfb, 0x4c, 0x15, 0xf7, 0x3a, 0x9b, 0x6, 0x5a,
+ 0x90, 0x8c, 0x8c, 0xb5, 0x1a, 0xf1, 0xb7, 0x7,
+ 0x30, 0xc8, 0xc8, 0x40, 0x89, 0x1b, 0xd1, 0x6,
+ 0x77, 0xa5, 0x6e, 0xad, 0x37, 0xf7, 0x9, 0x8,
+ 0xbb, 0x9a, 0xac, 0xb3, 0xbd, 0x1a, 0xcc, 0x54,
+ 0xa8, 0x4d, 0x1e, 0xfb, 0x4b, 0x7b, 0x6, 0xbc,
+ 0x86, 0x89, 0x8a, 0x62, 0x1a, 0xfb, 0x8d, 0x7,
+ 0x61, 0x8d, 0x8a, 0x5a, 0x86, 0x1e, 0xf7, 0xa,
+ 0xf7, 0x3e, 0x15, 0xf7, 0x3d, 0xb3, 0x7, 0xb2,
+ 0xa9, 0x78, 0x51, 0x56, 0x77, 0x64, 0x5b, 0x1f,
+ 0xe, 0xfb, 0xdd, 0xf8, 0xbd, 0xd1, 0x1, 0xbe,
+ 0xf8, 0xbd, 0x15, 0xf7, 0xd8, 0x6, 0x9d, 0xd1,
+ 0x5, 0xfb, 0xd7, 0x6, 0xe, 0xfb, 0x9a, 0xf8,
+ 0x36, 0x76, 0xf7, 0xb2, 0x77, 0x1, 0xde, 0xf8,
+ 0xb2, 0x15, 0x3c, 0xcb, 0x49, 0xda, 0xda, 0xcb,
+ 0xc9, 0xda, 0xda, 0x4b, 0xcd, 0x3c, 0x3c, 0x4b,
+ 0x4d, 0x3c, 0x1e, 0xb1, 0x8a, 0x15, 0x51, 0xb9,
+ 0x5b, 0xc5, 0xc5, 0xba, 0xb7, 0xc5, 0xc5, 0x5c,
+ 0xbc, 0x51, 0x51, 0x5d, 0x5e, 0x51, 0x1e, 0xe,
+ 0x2f, 0x8b, 0xe4, 0xb2, 0x77, 0xf7, 0x36, 0xe4,
+ 0x3c, 0xc9, 0xf7, 0x38, 0x77, 0x12, 0xf7, 0x85,
+ 0xe3, 0x3e, 0xcc, 0x13, 0xea, 0xf7, 0x90, 0xf7,
+ 0x14, 0x15, 0xcc, 0x6, 0x13, 0xda, 0xf7, 0x2c,
+ 0xf7, 0x70, 0xc9, 0xfb, 0x70, 0xf7, 0x38, 0x4a,
+ 0xfb, 0x38, 0xfb, 0x6f, 0x4d, 0xf7, 0x6f, 0x7,
+ 0xfb, 0x6f, 0xfb, 0xac, 0x15, 0xf8, 0x8c, 0x6,
+ 0x13, 0xec, 0xcf, 0xfc, 0x8c, 0x7, 0xe, 0xfb,
+ 0xfe, 0xf7, 0xa6, 0xd0, 0xf7, 0xab, 0xc8, 0x1,
+ 0x8d, 0xf7, 0xa6, 0x5e, 0x1d, 0xef, 0x5, 0xb6,
+ 0xaa, 0xbc, 0xbd, 0x52, 0xa, 0x6d, 0x66, 0x61,
+ 0x1f, 0x6b, 0x68, 0x8b, 0x84, 0xfb, 0x8, 0xfb,
+ 0x2, 0x8, 0xe, 0xfb, 0xfe, 0xf7, 0xb2, 0x76,
+ 0xf8, 0x3, 0xbe, 0x12, 0xf7, 0x66, 0xdf, 0x4e,
+ 0xe3, 0x13, 0xe0, 0xf7, 0x2, 0xf8, 0x75, 0x15,
+ 0xcc, 0xae, 0x69, 0x4f, 0x69, 0x66, 0x4f, 0x69,
+ 0x81, 0x82, 0x8f, 0x97, 0x83, 0x67, 0x1d, 0xcf,
+ 0xe1, 0xbc, 0x74, 0xa3, 0x6e, 0x9e, 0x1f, 0x13,
+ 0xd0, 0x63, 0x1d, 0x69, 0xa, 0xe, 0x7f, 0x1d,
+ 0xf7, 0x49, 0x77, 0x1, 0xf7, 0x1f, 0xf8, 0x98,
+ 0x15, 0xbd, 0x6, 0xf7, 0x2b, 0x21, 0x1d, 0xe,
+ 0x35, 0xfb, 0x4e, 0x76, 0xf7, 0x63, 0xd1, 0x4d,
+ 0x76, 0xf7, 0x11, 0x77, 0xf7, 0xf9, 0x77, 0x12,
+ 0x4f, 0xf7, 0xb, 0x13, 0xdc, 0xf7, 0xaf, 0xf7,
+ 0x4, 0x15, 0x83, 0x6c, 0x89, 0x7c, 0x7a, 0x1a,
+ 0x6d, 0xa1, 0x6b, 0xb3, 0xda, 0xba, 0xd6, 0xc3,
+ 0xb5, 0x1e, 0x76, 0x9b, 0x5, 0x13, 0xbc, 0x71,
+ 0x80, 0x6b, 0x67, 0x79, 0x1b, 0x80, 0x85, 0x94,
+ 0xab, 0x93, 0x1f, 0xf3, 0xf7, 0xe4, 0x5, 0xfb,
+ 0x1b, 0x6, 0x58, 0xfb, 0x38, 0x5, 0xfb, 0xe,
+ 0x62, 0x42, 0x2e, 0x53, 0x1b, 0x6e, 0x95, 0xb7,
+ 0xa2, 0x91, 0x1f, 0xe8, 0xf7, 0xcc, 0x5, 0x13,
+ 0xdc, 0xfb, 0x1b, 0x6, 0xfb, 0x3, 0xfc, 0xb,
+ 0x5, 0x5f, 0xfb, 0x12, 0x81, 0x54, 0x64, 0x1a,
+ 0x60, 0xa0, 0x79, 0xa9, 0xb3, 0xa7, 0xae, 0xbd,
+ 0xb6, 0x87, 0xc0, 0x9c, 0xbd, 0x1e, 0x7a, 0xa2,
+ 0x94, 0x84, 0xae, 0x1b, 0xc0, 0xcd, 0xd2, 0xb4,
+ 0xa2, 0x1f, 0xe, 0xfb, 0x57, 0x76, 0xf9, 0xdc,
+ 0xb1, 0x12, 0xb2, 0xf7, 0x64, 0x42, 0xe4, 0xf7,
+ 0x2c, 0xe4, 0x13, 0xd8, 0xf7, 0x11, 0xfb, 0x6c,
+ 0x15, 0xbc, 0x6, 0xf7, 0x85, 0xf9, 0xdc, 0x5,
+ 0xe4, 0x6, 0xfb, 0x85, 0xfd, 0xdc, 0x5, 0xbc,
+ 0x6, 0xf7, 0x69, 0xf9, 0x7e, 0x5, 0xed, 0xa7,
+ 0x92, 0x9b, 0xe5, 0x1b, 0x90, 0x9d, 0x5, 0xfb,
+ 0xbd, 0x6, 0x13, 0xe8, 0xfb, 0x64, 0xfb, 0x3,
+ 0xfb, 0x30, 0xfb, 0x1c, 0xfb, 0x13, 0xf0, 0x6c,
+ 0xf6, 0x89, 0x1f, 0xe, 0xfc, 0x30, 0xf7, 0x95,
+ 0xf7, 0x28, 0x1, 0xbe, 0xf7, 0x28, 0x3, 0xbe,
+ 0xf7, 0xdf, 0x3c, 0xa, 0xfb, 0xdd, 0xfb, 0x6e,
+ 0xb4, 0x80, 0xd8, 0x49, 0xd8, 0xf4, 0x77, 0x12,
+ 0x13, 0x50, 0xb4, 0x90, 0x15, 0x49, 0x2a, 0x98,
+ 0x7f, 0x5, 0x13, 0xb0, 0x7d, 0xa, 0x72, 0x7c,
+ 0x6c, 0x6e, 0x7b, 0x86, 0xa, 0x9f, 0x79, 0xbf,
+ 0x1b, 0xc0, 0xe9, 0xa3, 0xca, 0xbf, 0x5e, 0x9e,
+ 0x67, 0x7d, 0x7e, 0x8b, 0x89, 0x83, 0x1f, 0xb8,
+ 0xce, 0x5, 0xe, 0xfb, 0xfe, 0xf7, 0xbb, 0x76,
+ 0xf7, 0x17, 0x76, 0xf7, 0xbf, 0x77, 0x1, 0xa9,
+ 0xf8, 0x14, 0x8c, 0xa, 0x62, 0x71, 0x91, 0xa0,
+ 0x93, 0x1f, 0x9d, 0xb9, 0xc7, 0xf7, 0x21, 0xa7,
+ 0xcd, 0x5e, 0x82, 0x66, 0x83, 0x2c, 0x7d, 0x89,
+ 0x76, 0x18, 0xa8, 0xb3, 0x93, 0x71, 0x7c, 0x45,
+ 0xfb, 0x1f, 0x7b, 0x6e, 0x1f, 0x70, 0x7d, 0x66,
+ 0x8b, 0x73, 0x1b, 0xe, 0xfb, 0xfe, 0xf8, 0x24,
+ 0x9f, 0xf7, 0x89, 0x9f, 0x1, 0xf7, 0x9e, 0xdc,
+ 0x3, 0xf7, 0x1d, 0xf8, 0x5f, 0x15, 0xb2, 0xae,
+ 0xf7, 0x3b, 0xd2, 0x95, 0x98, 0x85, 0x6d, 0x5e,
+ 0x64, 0xfb, 0x38, 0x4d, 0x6f, 0x8b, 0xa6, 0x97,
+ 0x1e, 0x3a, 0xa9, 0x15, 0x52, 0xbe, 0x6b, 0xc0,
+ 0xf3, 0xde, 0xf2, 0xe5, 0xdb, 0x3f, 0x97, 0x72,
+ 0x24, 0x34, 0x24, 0x2e, 0x1e, 0xe, 0x72, 0x1d,
+ 0xf7, 0xeb, 0x49, 0x1d, 0x95, 0x82, 0x80, 0x94,
+ 0x83, 0x88, 0x1d, 0x88, 0x7e, 0x1f, 0xfb, 0x4,
+ 0xfb, 0x40, 0x70, 0xa, 0x8f, 0x88, 0x90, 0x9d,
+ 0xb5, 0xb5, 0x9a, 0x4a, 0xa, 0x95, 0x82, 0x80,
+ 0x94, 0x83, 0x88, 0x1d, 0x88, 0x7e, 0x1f, 0xe,
+ 0x86, 0x1d, 0xf8, 0xa7, 0x77, 0xa2, 0x77, 0x12,
+ 0x13, 0x70, 0xf8, 0x11, 0xe3, 0x15, 0xf7, 0x33,
+ 0x6, 0x13, 0x90, 0x70, 0x33, 0x5, 0xe1, 0x6,
+ 0x13, 0x70, 0x48, 0xa, 0xfc, 0x39, 0xfb, 0x37,
+ 0x61, 0x1d, 0xfc, 0xc8, 0xfc, 0x2a, 0x8c, 0xa,
+ 0x5d, 0x7e, 0x92, 0xa2, 0x93, 0x8e, 0x95, 0x8e,
+ 0x97, 0x1f, 0x13, 0x88, 0x6e, 0x1d, 0x94, 0x70,
+ 0x6b, 0xa, 0xe3, 0x8b, 0xd0, 0x4d, 0x76, 0xf7,
+ 0x14, 0x77, 0xf7, 0x92, 0xc8, 0xf7, 0xa3, 0x77,
+ 0xa2, 0x77, 0x12, 0x13, 0x78, 0xf7, 0xd, 0x7d,
+ 0x61, 0x1d, 0x13, 0xb4, 0xfb, 0x24, 0xfd, 0x3c,
+ 0x5e, 0x1d, 0xee, 0x5, 0xb6, 0xaa, 0xbc, 0xbe,
+ 0x52, 0xa, 0x63, 0x66, 0x61, 0x1f, 0x6b, 0x68,
+ 0x8b, 0x8b, 0xfb, 0x8, 0xfb, 0x2, 0x8, 0xfc,
+ 0x39, 0xf7, 0x96, 0x8c, 0xa, 0x5f, 0x7c, 0x90,
+ 0xa0, 0x94, 0x8d, 0x96, 0x8f, 0x99, 0x1f, 0x6e,
+ 0x1d, 0x93, 0x71, 0x6b, 0xa, 0x86, 0x1d, 0xf7,
+ 0x8, 0x77, 0xf7, 0x80, 0xf7, 0x5b, 0x5b, 0xbb,
+ 0x8e, 0x77, 0x12, 0xf7, 0x5c, 0xdf, 0x4e, 0xe3,
+ 0x13, 0x79, 0x0, 0xf7, 0x21, 0x7d, 0x61, 0x1d,
+ 0xfc, 0x70, 0xfb, 0x5b, 0x15, 0xcc, 0xae, 0x69,
+ 0x4f, 0x5c, 0x6c, 0x61, 0x65, 0x7e, 0x80, 0x8f,
+ 0x92, 0x86, 0x67, 0x1d, 0xd1, 0xe1, 0xbc, 0x74,
+ 0xa1, 0x6e, 0x9e, 0x1f, 0x13, 0x92, 0x80, 0x63,
+ 0x1d, 0x13, 0x94, 0x80, 0x69, 0xa, 0x13, 0x79,
+ 0x0, 0xf7, 0xb0, 0xfc, 0x2b, 0x15, 0xf7, 0x33,
+ 0x6, 0x13, 0x99, 0x0, 0x70, 0x33, 0x5, 0xe1,
+ 0x6, 0x13, 0x79, 0x0, 0x48, 0xa, 0xe, 0xfb,
+ 0x61, 0xaa, 0x6c, 0xf7, 0x58, 0xf7, 0xf5, 0xf7,
+ 0x28, 0x12, 0xa9, 0xf7, 0x13, 0xf7, 0x8, 0xf7,
+ 0x28, 0x13, 0x78, 0xf7, 0xc4, 0xf7, 0xa3, 0x15,
+ 0x73, 0x50, 0x7c, 0x6c, 0x60, 0x6f, 0x8, 0xfb,
+ 0x19, 0x34, 0x50, 0x5a, 0x3d, 0x1a, 0x5c, 0xa8,
+ 0x2a, 0xf7, 0x29, 0xf7, 0x1, 0xcb, 0xc9, 0xcf,
+ 0xaf, 0x71, 0xa9, 0x68, 0x6b, 0x6e, 0x72, 0x69,
+ 0x78, 0x93, 0x7f, 0x92, 0x81, 0x1e, 0x92, 0x81,
+ 0x92, 0x83, 0x82, 0x1a, 0x13, 0xb8, 0x76, 0x6a,
+ 0x7a, 0x6f, 0x6c, 0x64, 0x9b, 0xcd, 0xc1, 0xa9,
+ 0xbd, 0xd6, 0xe8, 0x1e, 0xc8, 0xd7, 0x92, 0xbd,
+ 0x8e, 0xac, 0x8, 0x4f, 0xf7, 0x2e, 0x3c, 0xa,
+ 0x51, 0x1d, 0xf7, 0x85, 0x77, 0x1, 0xf8, 0x3c,
+ 0xf9, 0x67, 0x7b, 0xa, 0xfb, 0x2, 0xf7, 0x26,
+ 0x5, 0x98, 0x80, 0x78, 0xa1, 0x30, 0x1d, 0xfb,
+ 0xfa, 0xfd, 0xc0, 0x33, 0xa, 0x51, 0x1d, 0xf7,
+ 0x85, 0x77, 0x1, 0xf7, 0xcb, 0xf9, 0x67, 0x22,
+ 0x1d, 0xfc, 0x88, 0xfd, 0xea, 0x33, 0xa, 0x51,
+ 0x1d, 0xf7, 0x7e, 0x5a, 0x1d, 0xfc, 0x5a, 0xfe,
+ 0x15, 0x24, 0x1d, 0x56, 0xa, 0xf8, 0x4d, 0x77,
+ 0xd5, 0x83, 0x1d, 0x5e, 0xd6, 0x12, 0x13, 0xe4,
+ 0xf7, 0x93, 0xf9, 0x7c, 0x15, 0x13, 0xe8, 0x9e,
+ 0x93, 0x94, 0xa3, 0xac, 0x1b, 0xac, 0xa2, 0x84,
+ 0x80, 0xa0, 0x1f, 0x13, 0xf0, 0x7f, 0xa6, 0x9f,
+ 0x7d, 0xa6, 0x1b, 0xe1, 0xa3, 0xde, 0xaf, 0x93,
+ 0x1f, 0x62, 0x6, 0x78, 0x82, 0x82, 0x74, 0x68,
+ 0x1b, 0x7c, 0x73, 0x96, 0x96, 0x70, 0x1f, 0x96,
+ 0x70, 0x6f, 0x94, 0x70, 0x1b, 0x28, 0x79, 0xfb,
+ 0x7, 0x88, 0x1f, 0x35, 0xfd, 0x7c, 0x15, 0xae,
+ 0x7, 0x23, 0x1d, 0x68, 0x7, 0xf8, 0xc, 0xf8,
+ 0x7f, 0x15, 0x74, 0x1d, 0xfb, 0x4d, 0x6, 0xe,
+ 0x56, 0xa, 0xf8, 0x59, 0x77, 0xba, 0xf7, 0x1a,
+ 0xfb, 0xd, 0xf7, 0x1a, 0x12, 0xf7, 0x80, 0xf7,
+ 0x1a, 0xbd, 0xf7, 0x1a, 0x13, 0xee, 0xf7, 0x73,
+ 0xf9, 0xaf, 0x15, 0x13, 0xf6, 0x20, 0x1d, 0xf7,
+ 0x68, 0x2b, 0xa, 0xfc, 0x8a, 0xfd, 0xaf, 0x24,
+ 0x1d, 0x51, 0x1d, 0xb8, 0xbb, 0xf7, 0x1, 0xbc,
+ 0x1, 0xf7, 0xb0, 0xbb, 0xf7, 0x8, 0xbc, 0x3,
+ 0xf7, 0xb0, 0xf9, 0xc2, 0x15, 0x4f, 0xb9, 0x5d,
+ 0xc7, 0xc6, 0xbb, 0xba, 0xc6, 0xc6, 0x5b, 0xbb,
+ 0x50, 0x50, 0x5c, 0x5b, 0x5e, 0xa, 0xfc, 0x23,
+ 0xfd, 0xc2, 0x24, 0x1d, 0xf7, 0xae, 0x8b, 0xab,
+ 0xf7, 0x73, 0xb2, 0xb7, 0xab, 0xf7, 0x9f, 0xab,
+ 0x1, 0x4b, 0xab, 0x15, 0xac, 0x90, 0x8a, 0x8b,
+ 0xc3, 0xd3, 0xf8, 0x2, 0xf8, 0x5b, 0x18, 0x98,
+ 0x9b, 0x92, 0x99, 0x98, 0x1a, 0xa0, 0x6d, 0x93,
+ 0x58, 0x1e, 0xac, 0xf8, 0xe1, 0x7, 0x5e, 0xfb,
+ 0x52, 0x73, 0x90, 0x5, 0xf7, 0x14, 0x39, 0xa4,
+ 0x3c, 0x56, 0x87, 0x80, 0x76, 0x86, 0x1e, 0x4a,
+ 0xfb, 0x7f, 0xf0, 0x88, 0xc0, 0x98, 0xb3, 0xeb,
+ 0x19, 0xa5, 0x87, 0x42, 0xfb, 0xa5, 0x72, 0x90,
+ 0x98, 0xe9, 0x77, 0xb6, 0xfb, 0xf, 0x88, 0x19,
+ 0x4c, 0xfb, 0x85, 0x5, 0x89, 0x82, 0x8a, 0x83,
+ 0x85, 0x1a, 0x6f, 0x9d, 0x7d, 0xa7, 0xf7, 0x2b,
+ 0xcf, 0xba, 0xf7, 0xc, 0xd3, 0x1e, 0xa5, 0x88,
+ 0x50, 0xfb, 0x58, 0x5, 0xfc, 0xa3, 0xab, 0x6,
+ 0xba, 0x93, 0x9a, 0x90, 0x9b, 0xc5, 0xb9, 0xf7,
+ 0x2c, 0x18, 0xfb, 0x54, 0x6, 0xfb, 0x6, 0xfb,
+ 0x2a, 0x5, 0x82, 0x7e, 0x86, 0x80, 0x81, 0x1a,
+ 0x71, 0xa0, 0x7e, 0xb5, 0x1e, 0x6b, 0xfb, 0x57,
+ 0x7, 0xf8, 0x62, 0xf7, 0xba, 0x15, 0xe7, 0xf7,
+ 0xd7, 0x5, 0x7f, 0x6, 0xfb, 0x91, 0xfb, 0xd7,
+ 0x5, 0xe, 0x90, 0xfb, 0x6e, 0xb4, 0xf7, 0x6f,
+ 0x76, 0xae, 0xbf, 0xf8, 0xaf, 0xae, 0x1, 0xab,
+ 0xf7, 0x2e, 0xef, 0xb8, 0xf7, 0xa1, 0xab, 0x98,
+ 0xa9, 0x3, 0xf7, 0x7f, 0x2f, 0x15, 0x98, 0x7f,
+ 0x5, 0x8f, 0x94, 0x94, 0x8c, 0x93, 0x1b, 0xa8,
+ 0xa1, 0x72, 0x7f, 0x70, 0x74, 0x7d, 0x6c, 0x6e,
+ 0x7a, 0x91, 0x96, 0x74, 0x1f, 0x75, 0x6a, 0x5,
+ 0x83, 0x9b, 0xa3, 0x7a, 0xbe, 0x1b, 0xc0, 0xe7,
+ 0x9e, 0xca, 0xc3, 0x58, 0xa0, 0x65, 0x80, 0x82,
+ 0x8a, 0x89, 0x84, 0x1f, 0xaa, 0xb9, 0x5, 0xf7,
+ 0x9, 0xdb, 0xd6, 0xd3, 0xbb, 0x1f, 0x6d, 0xa1,
+ 0x5, 0x2e, 0x43, 0x49, 0x72, 0x3d, 0x1b, 0x7d,
+ 0xfb, 0x16, 0x8b, 0xf7, 0x47, 0xf7, 0x45, 0xf3,
+ 0xf7, 0x97, 0xf7, 0x35, 0xe3, 0xc5, 0x4d, 0x2a,
+ 0x7f, 0x8a, 0x80, 0x89, 0x80, 0x81, 0x1d, 0x80,
+ 0x85, 0x7e, 0x74, 0x1b, 0x7e, 0x77, 0x93, 0x93,
+ 0x6f, 0x1f, 0x92, 0x73, 0x6c, 0x91, 0x63, 0x1b,
+ 0xfb, 0x87, 0xfb, 0x44, 0xfb, 0x74, 0xfb, 0x71,
+ 0xfb, 0x40, 0xf7, 0x15, 0x36, 0xf7, 0x11, 0x1f,
+ 0xe, 0x51, 0xa, 0x73, 0xa, 0xf8, 0x3c, 0xf9,
+ 0x67, 0x27, 0x1d, 0xfb, 0xd2, 0xfd, 0xc0, 0x15,
+ 0x37, 0x1d, 0x57, 0x7b, 0x94, 0x9b, 0x98, 0x93,
+ 0x9c, 0x90, 0x9f, 0x7e, 0xa, 0xf7, 0x1, 0xae,
+ 0x71, 0x4f, 0x7d, 0x8a, 0x7b, 0x88, 0x79, 0x4c,
+ 0xa, 0x5, 0x3a, 0x60, 0x7c, 0x72, 0xfb, 0x27,
+ 0x1b, 0x65, 0xa, 0x93, 0x73, 0x1d, 0x8b, 0x40,
+ 0x1d, 0x85, 0x96, 0x87, 0x43, 0xa, 0xe, 0x51,
+ 0xa, 0x73, 0xa, 0xf7, 0xcb, 0xf9, 0x67, 0x15,
+ 0xbc, 0x6, 0xf7, 0x2b, 0xe1, 0x5, 0xa2, 0x98,
+ 0x9c, 0x97, 0x25, 0x1d, 0xfc, 0x60, 0xfd, 0xea,
+ 0x15, 0x37, 0x1d, 0x55, 0x7d, 0x95, 0x9c, 0x98,
+ 0x93, 0x9b, 0x90, 0x9e, 0x7e, 0xa, 0xf7, 0x3,
+ 0xac, 0x70, 0x4d, 0x7e, 0x89, 0x7c, 0x89, 0x7a,
+ 0x4c, 0xa, 0x60, 0x3a, 0x7c, 0x71, 0xfb, 0x27,
+ 0x8c, 0x19, 0x65, 0xa, 0x95, 0x73, 0x1d, 0x89,
+ 0x31, 0x1d, 0xe, 0x51, 0xa, 0xf7, 0x78, 0x5a,
+ 0x1d, 0xfc, 0x32, 0xfe, 0x15, 0x15, 0x37, 0x1d,
+ 0x56, 0x7c, 0x95, 0x9c, 0x98, 0x91, 0x9b, 0x90,
+ 0x9e, 0x1f, 0xca, 0xf7, 0x7b, 0x5, 0xf7, 0x6,
+ 0xa9, 0x6e, 0x49, 0x7f, 0x89, 0x7e, 0x89, 0x7d,
+ 0x2a, 0xa, 0xe, 0x51, 0xa, 0xc5, 0xf7, 0x1b,
+ 0x1, 0xf7, 0x86, 0xf7, 0x1b, 0xd8, 0xf7, 0x1b,
+ 0x3, 0x70, 0x16, 0x37, 0x1d, 0x56, 0x7c, 0x95,
+ 0x9b, 0x98, 0x93, 0x9b, 0x90, 0x9f, 0x7e, 0xa,
+ 0xf7, 0x3, 0xac, 0x70, 0x4d, 0x7e, 0x89, 0x7c,
+ 0x89, 0x7a, 0x2a, 0xa, 0xf7, 0xa1, 0xf9, 0x8b,
+ 0x46, 0x1d, 0x68, 0xa, 0x73, 0xa, 0x6b, 0x16,
+ 0x75, 0x1d, 0x4a, 0x7f, 0x9a, 0xa1, 0x97, 0x91,
+ 0x98, 0x8e, 0x95, 0x41, 0xa, 0xc6, 0x9b, 0x7e,
+ 0x7a, 0x7f, 0x86, 0x7c, 0x47, 0x1d, 0xf7, 0xe5,
+ 0xf9, 0x44, 0x2a, 0x1d, 0x68, 0xa, 0x73, 0xa,
+ 0xf7, 0x54, 0xf9, 0x67, 0x7b, 0xa, 0xf7, 0x1a,
+ 0xdc, 0x5, 0xa1, 0x98, 0x9e, 0x9c, 0x25, 0x1d,
+ 0xfb, 0xda, 0xfd, 0xea, 0x8e, 0x1d, 0x4e, 0x7b,
+ 0x98, 0x9f, 0x98, 0x91, 0x9a, 0x8e, 0x96, 0x41,
+ 0xa, 0xc6, 0x9b, 0x7f, 0x79, 0x7f, 0x86, 0x7c,
+ 0x47, 0x1d, 0xe, 0x68, 0xa, 0xf7, 0x78, 0x77,
+ 0x1, 0xf7, 0xb, 0xf9, 0x67, 0x15, 0xc4, 0x6,
+ 0xf4, 0xea, 0xe3, 0x2c, 0x3b, 0x1d, 0xfb, 0xb1,
+ 0xfe, 0x15, 0x8e, 0x1d, 0x4e, 0x7b, 0x98, 0x9f,
+ 0x98, 0x91, 0x9a, 0x8e, 0x96, 0x46, 0xa, 0x68,
+ 0xa, 0xc6, 0xf7, 0x1a, 0x1, 0xf2, 0xf7, 0x1b,
+ 0x3, 0xf2, 0xf9, 0xb0, 0x15, 0x41, 0x1d, 0xf7,
+ 0x63, 0x16, 0x41, 0x1d, 0xfb, 0xea, 0xfd, 0xb0,
+ 0x8e, 0x1d, 0x4a, 0x7f, 0x9a, 0xa1, 0x97, 0x91,
+ 0x98, 0x8e, 0x95, 0x46, 0xa, 0xc7, 0x8b, 0xad,
+ 0xf7, 0xbb, 0xb7, 0xf7, 0x9d, 0xaa, 0x1, 0xf8,
+ 0xbd, 0xf7, 0x27, 0x3, 0xf7, 0x98, 0xf7, 0xdd,
+ 0x15, 0xf7, 0xe, 0x6, 0x97, 0xb7, 0x5, 0xfb,
+ 0xe, 0x6, 0xc8, 0xf7, 0x77, 0x80, 0x1d, 0xfb,
+ 0x1d, 0x5b, 0x25, 0x60, 0xfb, 0xd1, 0xfb, 0x97,
+ 0x61, 0x7d, 0x9a, 0xa3, 0x9a, 0x8f, 0x9c, 0x77,
+ 0xa, 0x91, 0xf7, 0x13, 0xf7, 0x6e, 0x5d, 0xa,
+ 0x7e, 0x82, 0x75, 0x5a, 0xfb, 0x4a, 0x1e, 0x25,
+ 0x6, 0x7f, 0x5f, 0x5, 0xf1, 0x6, 0x86, 0x78,
+ 0x80, 0x5c, 0x67, 0xfb, 0xf, 0x6f, 0x2d, 0x6d,
+ 0x85, 0x6a, 0x86, 0x8, 0xe, 0x8b, 0x1d, 0xd5,
+ 0x8c, 0x1d, 0x13, 0xb0, 0x70, 0x16, 0xf7, 0x64,
+ 0xae, 0x6, 0x52, 0x77, 0x9e, 0xaf, 0xa7, 0x92,
+ 0xac, 0x93, 0xa6, 0x1f, 0xee, 0xf7, 0xf8, 0x5,
+ 0x13, 0x70, 0x59, 0xa, 0xc2, 0xa0, 0x78, 0x6a,
+ 0x6f, 0x85, 0x68, 0x83, 0x6f, 0x64, 0x1d, 0xfb,
+ 0xc, 0xfc, 0x2f, 0x18, 0x13, 0xa8, 0x63, 0xfb,
+ 0x1f, 0x80, 0x93, 0x59, 0x7f, 0x8, 0xf7, 0xb1,
+ 0xf9, 0x59, 0x50, 0xa, 0xa8, 0xa2, 0x7f, 0x80,
+ 0xa2, 0x1f, 0x13, 0xb0, 0x80, 0xa1, 0xa2, 0x81,
+ 0xaa, 0x3d, 0x1d, 0x7c, 0x73, 0x96, 0x96, 0x70,
+ 0x1f, 0x95, 0x71, 0x6e, 0x95, 0x70, 0x54, 0x1d,
+ 0x33, 0x1d, 0xf8, 0x3d, 0xf8, 0x96, 0x2a, 0x1d,
+ 0x33, 0x1d, 0xf7, 0xef, 0xf8, 0x96, 0x26, 0xa,
+ 0x65, 0x1d, 0xf7, 0x6a, 0x25, 0xa, 0xf7, 0x87,
+ 0xf8, 0x96, 0x5b, 0xa, 0xec, 0xe3, 0x2a, 0x7e,
+ 0x1d, 0x65, 0x1d, 0xc7, 0x8c, 0x1d, 0x4d, 0xa,
+ 0x13, 0xdc, 0x3a, 0x1d, 0xf7, 0x80, 0xf8, 0xaa,
+ 0x50, 0xa, 0xa4, 0xa2, 0x7f, 0x80, 0xa4, 0x1f,
+ 0x13, 0xec, 0x80, 0xa3, 0xa4, 0x81, 0xa8, 0x3d,
+ 0x1d, 0x7c, 0x72, 0x96, 0x96, 0x70, 0x1f, 0x95,
+ 0x71, 0x6f, 0x95, 0x70, 0x54, 0x1d, 0x65, 0x1d,
+ 0xb8, 0xf7, 0x1a, 0x12, 0xa6, 0xf7, 0x24, 0xf7,
+ 0xc, 0xf7, 0x1a, 0xd8, 0xf7, 0x1a, 0x32, 0xf7,
+ 0x24, 0x13, 0xfa, 0x3a, 0x1d, 0xf7, 0x9c, 0xf8,
+ 0xdd, 0x2e, 0xa, 0x13, 0xfc, 0xf7, 0x67, 0x2d,
+ 0x1d, 0x2f, 0xb0, 0x76, 0xf8, 0x6e, 0x77, 0x1,
+ 0xbb, 0xc7, 0x15, 0xb7, 0x5f, 0xf7, 0x54, 0xf7,
+ 0x54, 0xf7, 0x53, 0xfb, 0x54, 0xba, 0xba, 0xfb,
+ 0x55, 0xf7, 0x52, 0xf7, 0x55, 0xf7, 0x56, 0x59,
+ 0xb6, 0xfb, 0x50, 0xfb, 0x52, 0xfb, 0x52, 0xf7,
+ 0x52, 0x5d, 0x5c, 0xf7, 0x51, 0xfb, 0x51, 0x5,
+ 0xe, 0xc7, 0x23, 0x76, 0xf6, 0xad, 0xf9, 0xf,
+ 0xad, 0xda, 0x77, 0x1, 0x4d, 0xa, 0x3, 0xf7,
+ 0x4a, 0xd8, 0x15, 0x83, 0x9f, 0x88, 0xa2, 0xa9,
+ 0x1a, 0xeb, 0xe4, 0xf8, 0x29, 0xf7, 0x49, 0xa8,
+ 0xa0, 0x83, 0x7e, 0x9a, 0x1e, 0xfb, 0xbe, 0xfc,
+ 0xe4, 0x15, 0xf7, 0xd9, 0xf8, 0xbf, 0x5, 0x96,
+ 0x74, 0x8e, 0x6f, 0x79, 0x1a, 0xfb, 0x2, 0x2e,
+ 0xfc, 0x22, 0xfb, 0x47, 0x72, 0x74, 0x91, 0x9b,
+ 0x78, 0x1e, 0xfb, 0x23, 0xfb, 0x37, 0x15, 0xbb,
+ 0x6, 0xd1, 0xf7, 0xc, 0x5, 0x83, 0xa3, 0xa6,
+ 0x86, 0xaa, 0x1b, 0xf7, 0x8d, 0xf7, 0x45, 0xf7,
+ 0xa0, 0xf7, 0x56, 0xf7, 0x2, 0x56, 0xce, 0x47,
+ 0xae, 0x1f, 0xca, 0xf7, 0x0, 0x5, 0x5a, 0x6,
+ 0x56, 0x2f, 0x5, 0x94, 0x70, 0x67, 0x8f, 0x70,
+ 0x1b, 0xfb, 0x6f, 0xfb, 0x57, 0xfb, 0x7d, 0xfb,
+ 0x89, 0x46, 0xaf, 0x36, 0xdc, 0x61, 0x1f, 0xe,
+ 0x72, 0xa, 0x73, 0xa, 0xb0, 0xf7, 0x1e, 0x3,
+ 0xed, 0xf9, 0xe, 0x29, 0x1d, 0xc3, 0x9e, 0x7a,
+ 0x68, 0x6e, 0x84, 0x68, 0x84, 0x70, 0x4a, 0x1d,
+ 0x2c, 0x6f, 0xb4, 0xc1, 0xb5, 0x9a, 0xbd, 0x98,
+ 0xba, 0x3e, 0x1d, 0xf7, 0xf6, 0xc1, 0x2a, 0x1d,
+ 0x72, 0xa, 0x73, 0xa, 0xce, 0xf7, 0x1e, 0x3,
+ 0xf8, 0x32, 0xf9, 0x67, 0x22, 0x1d, 0xfc, 0x4a,
+ 0xfb, 0x70, 0x29, 0x1d, 0xc3, 0x9e, 0x79, 0x68,
+ 0x6f, 0x84, 0x68, 0x84, 0x70, 0x4a, 0x1d, 0x2f,
+ 0x6c, 0xb1, 0xbf, 0xb6, 0x99, 0xbf, 0x99, 0xbc,
+ 0x3e, 0x1d, 0xe, 0x72, 0xa, 0xf7, 0x78, 0x77,
+ 0x1, 0xce, 0xf7, 0x1e, 0x3, 0xf7, 0xa2, 0xf9,
+ 0x67, 0x42, 0xa, 0xfb, 0xe0, 0xfb, 0x9b, 0x29,
+ 0x1d, 0xc0, 0xa1, 0x7b, 0x6b, 0x6e, 0x85, 0x66,
+ 0x83, 0x6e, 0x4a, 0x1d, 0x30, 0x6b, 0xb1, 0xbe,
+ 0xb6, 0x99, 0xc0, 0x99, 0xbc, 0x3e, 0x1d, 0xe,
+ 0x72, 0xa, 0xc6, 0xf7, 0x1a, 0x1, 0xf3, 0xf7,
+ 0x1e, 0xca, 0xf7, 0x1a, 0xba, 0xf7, 0x1a, 0x3,
+ 0xed, 0xf9, 0xe, 0x29, 0x1d, 0xc4, 0x9d, 0x78,
+ 0x67, 0x6f, 0x84, 0x6a, 0x84, 0x70, 0x4a, 0x1d,
+ 0x2d, 0x6e, 0xb3, 0xc1, 0xb5, 0x9a, 0xbe, 0x98,
+ 0xba, 0x3e, 0x1d, 0xf7, 0x63, 0xf7, 0x12, 0x2e,
+ 0xa, 0xf7, 0x69, 0x2d, 0x1d, 0x58, 0x58, 0xa,
+ 0x73, 0xa, 0xd4, 0x16, 0xf7, 0xd6, 0xae, 0x6,
+ 0x58, 0x70, 0x98, 0xab, 0x99, 0x8d, 0x9b, 0x92,
+ 0x9c, 0x1f, 0xbf, 0xf7, 0x49, 0x6a, 0xa, 0xc2,
+ 0xa6, 0x7e, 0x79, 0x81, 0x87, 0x7e, 0x80, 0x7c,
+ 0x1f, 0xfb, 0x2f, 0xfb, 0x69, 0x5, 0x4b, 0xf7,
+ 0x5c, 0x81, 0x82, 0xa7, 0x1a, 0xa2, 0x94, 0xb3,
+ 0xc5, 0x6a, 0x1d, 0x55, 0xfb, 0x4e, 0x79, 0x4b,
+ 0x6c, 0x74, 0x51, 0x86, 0x19, 0xf7, 0xb1, 0xf9,
+ 0x44, 0x26, 0xa, 0x58, 0x8b, 0xae, 0xf7, 0x27,
+ 0xab, 0xf7, 0xb4, 0xab, 0x6b, 0xf7, 0x3b, 0x12,
+ 0xf8, 0x3f, 0xf7, 0x26, 0x13, 0xe8, 0xf7, 0x79,
+ 0xf7, 0x6f, 0x6f, 0x1d, 0x33, 0x62, 0x40, 0x26,
+ 0x7a, 0x78, 0x8c, 0x8f, 0x77, 0x1f, 0xfb, 0x94,
+ 0xfb, 0x6f, 0x15, 0xf7, 0xba, 0xae, 0x6, 0x4c,
+ 0x7f, 0x9e, 0xa2, 0x94, 0x8d, 0x94, 0x8d, 0x93,
+ 0x1f, 0xa2, 0xdf, 0x5, 0x87, 0xb0, 0x9a, 0x8a,
+ 0xb4, 0x1b, 0xf7, 0x1a, 0xf7, 0x13, 0xce, 0xf7,
+ 0x14, 0xf7, 0x12, 0x20, 0xaa, 0x21, 0x1f, 0x5b,
+ 0x6, 0xa9, 0xe5, 0xa3, 0x8f, 0xb3, 0x91, 0x8,
+ 0x13, 0xd8, 0x8c, 0xae, 0x5, 0xfb, 0xba, 0x68,
+ 0x6, 0xbf, 0x9f, 0x7f, 0x77, 0x7c, 0x88, 0x78,
+ 0x85, 0x75, 0x1f, 0xfb, 0xf, 0xfc, 0x4b, 0x7a,
+ 0x4d, 0x74, 0x88, 0x63, 0x84, 0x19, 0xe, 0xfb,
+ 0x5c, 0xf7, 0x16, 0xca, 0xad, 0xf9, 0x1c, 0xa9,
+ 0x12, 0xf7, 0xcf, 0xf7, 0xc, 0x42, 0xf7, 0x3,
+ 0x13, 0xf0, 0xf7, 0x22, 0x9a, 0x15, 0x82, 0x98,
+ 0x96, 0x7e, 0xb6, 0x1b, 0xf7, 0xb, 0xf6, 0xf7,
+ 0x1a, 0xf7, 0x12, 0xe9, 0x4c, 0xb1, 0x3d, 0x98,
+ 0x1f, 0x8d, 0x7, 0x13, 0xe8, 0xca, 0xa2, 0xf7,
+ 0x8, 0xbf, 0xf7, 0x2, 0x1a, 0xd4, 0x4f, 0xba,
+ 0x36, 0xfb, 0x2e, 0x43, 0xfb, 0x33, 0xfb, 0x23,
+ 0x71, 0x1e, 0x49, 0xfb, 0xff, 0x6d, 0xfb, 0x1c,
+ 0x66, 0x5c, 0x8, 0x80, 0x82, 0x71, 0x7a, 0x7c,
+ 0x1b, 0x84, 0x87, 0x8f, 0x94, 0x96, 0x93, 0x8c,
+ 0x90, 0x95, 0x1f, 0x8d, 0x90, 0x8d, 0x91, 0x96,
+ 0x1a, 0xb0, 0x6b, 0x92, 0x7e, 0x55, 0x8b, 0x5c,
+ 0x83, 0x67, 0xaa, 0x64, 0xcc, 0xf7, 0xa, 0xcf,
+ 0xf7, 0xd, 0xf7, 0x49, 0xb4, 0x1e, 0xe6, 0xf8,
+ 0x2b, 0x5, 0xf7, 0x3, 0xa4, 0xa8, 0xc2, 0xb9,
+ 0x1b, 0xba, 0x8c, 0x47, 0x75, 0x4d, 0x79, 0x21,
+ 0x2b, 0x1f, 0x84, 0x6a, 0x5, 0x13, 0xf0, 0xb6,
+ 0x85, 0xaa, 0x5f, 0x3a, 0x1a, 0x5b, 0x6d, 0xfb,
+ 0x46, 0x3f, 0x7a, 0x78, 0x93, 0x9a, 0x80, 0x1e,
+ 0xe, 0x58, 0x1d, 0xb5, 0x85, 0x77, 0xf7, 0x99,
+ 0x34, 0xa, 0x6f, 0x81, 0x62, 0x62, 0x76, 0x1b,
+ 0x84, 0x86, 0x8f, 0x95, 0x44, 0xa, 0x5, 0xfb,
+ 0x1, 0x6, 0x78, 0x4d, 0x6f, 0xa, 0x13, 0xac,
+ 0x27, 0xa, 0x30, 0xa, 0xf7, 0x74, 0xf8, 0x25,
+ 0x2a, 0x1d, 0x5b, 0x1d, 0xf7, 0x93, 0x34, 0xa,
+ 0x6e, 0x80, 0x5f, 0x63, 0x77, 0x3f, 0x1d, 0x13,
+ 0xac, 0x30, 0xa, 0xf7, 0xd, 0xf8, 0x25, 0x26,
+ 0xa, 0x5b, 0x1d, 0xf7, 0x8c, 0x34, 0xa, 0x71,
+ 0xa, 0x8f, 0x95, 0x28, 0x1d, 0x13, 0xac, 0x30,
+ 0xa, 0xa1, 0xf8, 0x25, 0x42, 0xa, 0xe, 0x5b,
+ 0x1d, 0xe9, 0x8c, 0x1d, 0x76, 0xf7, 0xf, 0x13,
+ 0x6a, 0x28, 0xa, 0x13, 0x9a, 0x6e, 0x80, 0x5e,
+ 0x63, 0x78, 0x3f, 0x1d, 0x13, 0xa6, 0x30, 0xa,
+ 0xa9, 0xf8, 0x3a, 0x50, 0xa, 0xa5, 0xa2, 0x82,
+ 0x81, 0xa1, 0x1f, 0x13, 0xaa, 0x7f, 0xa6, 0xa6,
+ 0x7e, 0xa5, 0x3d, 0x1d, 0x7b, 0x71, 0x98, 0x96,
+ 0x6e, 0x1f, 0x95, 0x72, 0x70, 0x93, 0x72, 0x54,
+ 0x1d, 0x5b, 0x1d, 0xda, 0xf7, 0x1a, 0x74, 0xa,
+ 0xa6, 0x8e, 0xa, 0x13, 0x6f, 0x28, 0xa, 0x13,
+ 0x9f, 0x6e, 0x80, 0x5f, 0x63, 0x77, 0x3f, 0x1d,
+ 0x13, 0xaf, 0x30, 0xa, 0xa6, 0xf8, 0x6d, 0x2e,
+ 0xa, 0x3a, 0xa, 0x58, 0x1d, 0xb0, 0x66, 0xb5,
+ 0xc1, 0xbc, 0x5a, 0xf7, 0x39, 0xfb, 0x8, 0xf7,
+ 0x8, 0xfb, 0x8, 0xf7, 0x38, 0x5b, 0xbb, 0x74,
+ 0xa, 0xf7, 0x3, 0xf7, 0x37, 0xfb, 0x8, 0xf7,
+ 0x8, 0xfb, 0x8, 0xf7, 0x3a, 0x59, 0xbd, 0x13,
+ 0x64, 0xe4, 0x28, 0xa, 0x13, 0x99, 0x64, 0x71,
+ 0xa, 0x8f, 0x95, 0x28, 0x1d, 0x30, 0xa, 0xf7,
+ 0x3, 0xf8, 0x8f, 0x15, 0xc6, 0xba, 0xbb, 0xc6,
+ 0x1e, 0x13, 0xaa, 0xc8, 0xc6, 0xbb, 0x5b, 0x50,
+ 0x50, 0x5b, 0x5c, 0x50, 0x1f, 0x13, 0xa4, 0xe4,
+ 0x50, 0x5c, 0xba, 0xc6, 0x1f, 0x13, 0xaa, 0xd4,
+ 0xba, 0x8c, 0x15, 0x6b, 0xa5, 0x71, 0xab, 0xab,
+ 0xa5, 0xa5, 0xab, 0xab, 0x71, 0xa5, 0x6b, 0x6b,
+ 0x71, 0x71, 0x6b, 0x1e, 0xe, 0xc7, 0x7e, 0xca,
+ 0x4c, 0xd2, 0x5a, 0x76, 0xf7, 0xa, 0x77, 0xf7,
+ 0x14, 0x77, 0xf7, 0x75, 0xb3, 0x6d, 0xa9, 0x8e,
+ 0x77, 0x12, 0x86, 0xf7, 0x12, 0xf8, 0x62, 0xe5,
+ 0x13, 0x9c, 0xc0, 0xf7, 0xac, 0xf7, 0x8, 0x15,
+ 0x8d, 0x6, 0x5b, 0x94, 0x9a, 0x3a, 0xf7, 0x10,
+ 0x1b, 0xf7, 0x17, 0xc4, 0xf7, 0x19, 0x8d, 0x8c,
+ 0x1f, 0x6f, 0x9c, 0x5, 0x7a, 0x82, 0x60, 0x43,
+ 0x44, 0x1b, 0x51, 0x82, 0xc5, 0xa4, 0x9b, 0x8d,
+ 0x9c, 0x8e, 0x9a, 0x1f, 0xb2, 0x94, 0x5, 0xf7,
+ 0x35, 0xb0, 0xce, 0xd4, 0xd2, 0x1a, 0xc8, 0x60,
+ 0xa6, 0x53, 0x68, 0x63, 0x83, 0x56, 0x61, 0x1e,
+ 0x89, 0x8d, 0x9d, 0xc6, 0x5, 0x13, 0x39, 0xc0,
+ 0x28, 0x8e, 0x76, 0x4d, 0x5, 0x88, 0x6, 0xa5,
+ 0x82, 0x7f, 0xaf, 0x4d, 0x1b, 0xfb, 0x10, 0xfb,
+ 0x28, 0xfb, 0x5e, 0xfb, 0x21, 0x26, 0xc9, 0x6d,
+ 0xbe, 0xea, 0xbe, 0xdf, 0xb7, 0xa5, 0x1f, 0xfb,
+ 0x33, 0x8d, 0x15, 0x13, 0x5c, 0xc0, 0xe9, 0xe0,
+ 0xf7, 0x63, 0xd7, 0xb0, 0x99, 0x71, 0x66, 0x5a,
+ 0x49, 0xfb, 0x8d, 0x2b, 0x67, 0x7d, 0xa8, 0xaa,
+ 0x1e, 0xf7, 0xb8, 0xeb, 0x15, 0x90, 0x9c, 0x5,
+ 0x13, 0x9a, 0xc0, 0xc1, 0x9b, 0xb5, 0xf7, 0x24,
+ 0xd5, 0x1b, 0xac, 0x8b, 0x6f, 0x7d, 0xfb, 0xd,
+ 0xfb, 0x22, 0x57, 0x6f, 0x1f, 0xe, 0xfb, 0x6e,
+ 0xfb, 0x6e, 0xb4, 0xd8, 0xf7, 0x2b, 0xfb, 0x2,
+ 0x77, 0xe3, 0x76, 0xf7, 0xce, 0xf7, 0x34, 0x6a,
+ 0xac, 0x12, 0x73, 0xf7, 0x14, 0x13, 0xba, 0xf7,
+ 0x3, 0x7f, 0x15, 0x54, 0x3b, 0x98, 0x7f, 0x5,
+ 0x13, 0xca, 0x7d, 0xa, 0x74, 0x7c, 0x6c, 0x6e,
+ 0x79, 0x86, 0xa, 0xa1, 0x79, 0xbf, 0x1b, 0xc0,
+ 0xe7, 0x9e, 0xca, 0x1f, 0x13, 0xba, 0xc7, 0x49,
+ 0x9c, 0x73, 0x82, 0x83, 0x8a, 0x89, 0x82, 0x1e,
+ 0xae, 0xbf, 0xe0, 0x96, 0xcb, 0xcb, 0xb4, 0xc5,
+ 0x19, 0x6f, 0x9d, 0x5, 0x13, 0xc6, 0x51, 0x63,
+ 0x53, 0x6b, 0x5e, 0x1b, 0x6e, 0x5f, 0xaa, 0xdb,
+ 0xd2, 0xda, 0xf7, 0x58, 0xe2, 0x94, 0x99, 0x87,
+ 0x7e, 0x86, 0x88, 0x85, 0x87, 0x84, 0x1f, 0x85,
+ 0x81, 0x83, 0x7e, 0x7a, 0x1a, 0x13, 0xba, 0x84,
+ 0x1d, 0x60, 0xb7, 0x3c, 0xfb, 0x1e, 0xfb, 0x30,
+ 0xfb, 0x2e, 0xfb, 0x2d, 0x23, 0xd3, 0x4c, 0xca,
+ 0x1e, 0xe, 0x2f, 0xa, 0xf7, 0x2a, 0xf7, 0xc2,
+ 0x15, 0xb6, 0x6, 0xfb, 0x1, 0x5f, 0x1d, 0x2f,
+ 0xa, 0xbe, 0xf7, 0xc2, 0x15, 0xb8, 0x5a, 0xa,
+ 0x68, 0x1d, 0xf7, 0x78, 0x22, 0xa, 0x5b, 0xf7,
+ 0xc2, 0x15, 0xc0, 0x6, 0xf7, 0x17, 0xe8, 0xe4,
+ 0x2e, 0x5, 0xbd, 0x6, 0x35, 0x4e, 0xa, 0xe,
+ 0x68, 0x1d, 0xc7, 0xf7, 0x19, 0x12, 0x90, 0xf7,
+ 0x16, 0x69, 0xf7, 0x19, 0xd3, 0xe7, 0x2f, 0xf7,
+ 0x1d, 0x13, 0xf4, 0x20, 0xa, 0x13, 0xea, 0x5c,
+ 0xf8, 0xa, 0x15, 0x67, 0xa, 0xf7, 0x65, 0x16,
+ 0x67, 0xa, 0xe, 0x66, 0x1d, 0xf9, 0x56, 0x3c,
+ 0x1d, 0x74, 0xf8, 0x19, 0x7b, 0xa, 0xfb, 0x4,
+ 0x5f, 0x1d, 0x66, 0x1d, 0xf9, 0x56, 0x6c, 0x1d,
+ 0x52, 0x55, 0x8f, 0xa, 0x90, 0x94, 0x24, 0xa,
+ 0xfb, 0x12, 0xf8, 0x19, 0x26, 0xa, 0x66, 0x1d,
+ 0xf9, 0x4f, 0x6c, 0x1d, 0x54, 0x55, 0x73, 0x1b,
+ 0x84, 0x32, 0xa, 0xfb, 0x84, 0xf8, 0x19, 0x15,
+ 0xc4, 0x6, 0xf7, 0x16, 0xe8, 0xe4, 0x2e, 0x5,
+ 0xbe, 0x6, 0x34, 0x4e, 0xa, 0xe, 0x66, 0x1d,
+ 0xf8, 0xa6, 0xf7, 0x1a, 0x1, 0x9c, 0xf7, 0x1a,
+ 0xd6, 0xf7, 0x1a, 0x3, 0xf7, 0x6c, 0xf7, 0x21,
+ 0x15, 0x71, 0x88, 0x51, 0x56, 0x74, 0x1b, 0x85,
+ 0x88, 0x90, 0x94, 0x24, 0xa, 0xfb, 0x71, 0xf8,
+ 0x61, 0x2e, 0xa, 0xf7, 0x65, 0x2d, 0x1d, 0x7e,
+ 0xa8, 0xf8, 0x35, 0x6e, 0xa, 0xf7, 0x2e, 0x90,
+ 0xa, 0xf7, 0x6b, 0x7b, 0x1d, 0x7d, 0x59, 0x40,
+ 0x51, 0xfb, 0xaa, 0x2b, 0x57, 0x8b, 0xf7, 0xa,
+ 0x9f, 0x1e, 0xf7, 0x77, 0xf7, 0x9e, 0x15, 0xa9,
+ 0x7a, 0x6f, 0x97, 0x73, 0x1b, 0xfb, 0x28, 0xfb,
+ 0x15, 0xfb, 0x2e, 0xfb, 0x2e, 0x2b, 0xd9, 0x44,
+ 0xdd, 0xf7, 0x2f, 0xf7, 0x15, 0xf7, 0x45, 0xf7,
+ 0x6c, 0xe0, 0x66, 0xdd, 0x52, 0xc8, 0x1f, 0xf6,
+ 0xc3, 0x69, 0xab, 0x20, 0x52, 0x64, 0xab, 0x5d,
+ 0xa1, 0x5c, 0x91, 0x19, 0x5f, 0x70, 0xb1, 0x85,
+ 0xb5, 0x73, 0xaf, 0x68, 0x19, 0xfb, 0xe, 0x4b,
+ 0xac, 0x6c, 0xf7, 0xb, 0xc9, 0x5, 0xae, 0x5f,
+ 0xa6, 0x56, 0x56, 0x1a, 0xe, 0x21, 0x97, 0x76,
+ 0xa9, 0x76, 0xf8, 0x62, 0x77, 0xf7, 0x1e, 0xd6,
+ 0x12, 0x13, 0x70, 0x78, 0xa, 0x98, 0x97, 0x81,
+ 0x7f, 0x1f, 0x75, 0x33, 0xfb, 0x6f, 0x44, 0x1a,
+ 0x13, 0xb0, 0x76, 0x1d, 0x68, 0x80, 0x60, 0x63,
+ 0x77, 0x88, 0x1d, 0x91, 0x96, 0x1f, 0xa8, 0xe2,
+ 0xf7, 0x68, 0xcc, 0x4f, 0xa, 0x13, 0x70, 0x88,
+ 0xa, 0xf7, 0x2b, 0xf8, 0xad, 0x50, 0xa, 0xa9,
+ 0xa1, 0x81, 0x81, 0xa1, 0x1f, 0x7f, 0xa4, 0xa3,
+ 0x7f, 0xa7, 0x3d, 0x1d, 0x7c, 0x74, 0x95, 0x96,
+ 0x70, 0x1f, 0x95, 0x71, 0x6d, 0x96, 0x70, 0x54,
+ 0x1d, 0x7e, 0xa8, 0xf8, 0x33, 0xa8, 0xf7, 0x81,
+ 0x37, 0xa, 0xf7, 0xdd, 0xf8, 0xe, 0x2a, 0x1d,
+ 0x7e, 0xa8, 0xf8, 0x33, 0x6e, 0xa, 0xe3, 0x90,
+ 0xa, 0xf7, 0xab, 0x7b, 0x1d, 0x7f, 0x59, 0x40,
+ 0x51, 0xfb, 0xaa, 0x36, 0xa, 0xf7, 0x40, 0xf7,
+ 0x29, 0xf7, 0x1a, 0xfb, 0xb, 0x9d, 0x4b, 0x1d,
+ 0xf7, 0x76, 0xf8, 0xe, 0x26, 0xa, 0x8f, 0x1d,
+ 0xf7, 0x7a, 0x37, 0xa, 0xf7, 0x13, 0xf8, 0xe,
+ 0x42, 0xa, 0xe, 0x8f, 0x1d, 0xd7, 0x8c, 0x1d,
+ 0x4e, 0x1d, 0x13, 0xdc, 0x23, 0xa, 0xf7, 0x1b,
+ 0xf8, 0x23, 0x50, 0xa, 0xa9, 0xa0, 0x81, 0x80,
+ 0xa0, 0x1f, 0x13, 0xec, 0x80, 0xa2, 0xa2, 0x7f,
+ 0xac, 0x3d, 0x1d, 0x7c, 0x74, 0x95, 0x96, 0x71,
+ 0x1f, 0x95, 0x70, 0x6d, 0x96, 0x70, 0x54, 0x1d,
+ 0x8f, 0x1d, 0xc8, 0xf7, 0x1a, 0x12, 0x88, 0xf7,
+ 0xb, 0x93, 0xf7, 0x1a, 0xcb, 0xf7, 0xb, 0xfb,
+ 0x1, 0xf7, 0x1a, 0x13, 0xfc, 0x23, 0xa, 0xf7,
+ 0x13, 0xf8, 0x56, 0x2e, 0xa, 0x13, 0xfa, 0x3a,
+ 0xa, 0x2f, 0x6e, 0xef, 0x27, 0xf7, 0x28, 0xe7,
+ 0xe1, 0x36, 0xd0, 0xf5, 0xf7, 0x28, 0x27, 0xef,
+ 0x12, 0xf7, 0x67, 0xf7, 0x28, 0xfb, 0xc, 0xef,
+ 0x13, 0x5a, 0xac, 0xf7, 0x68, 0x15, 0xf8, 0x8c,
+ 0xd0, 0xfc, 0x8c, 0x6, 0x13, 0xa5, 0xf7, 0x62,
+ 0xfb, 0x98, 0x15, 0x66, 0xa, 0xf8, 0x64, 0x4,
+ 0x66, 0xa, 0xe, 0x29, 0x76, 0xf5, 0xa8, 0xcd,
+ 0x77, 0xf8, 0x8, 0xa8, 0xec, 0x5c, 0x1d, 0xe1,
+ 0x90, 0xa, 0xf7, 0xb0, 0xf7, 0x0, 0x98, 0x96,
+ 0x86, 0x81, 0x94, 0x1e, 0xfb, 0x51, 0xfb, 0xe5,
+ 0x6f, 0xa, 0x61, 0x40, 0x15, 0x43, 0xfb, 0x12,
+ 0x5, 0xb3, 0x6, 0xcb, 0xf7, 0x6, 0x5, 0x86,
+ 0x9b, 0x9d, 0x88, 0x9c, 0x1b, 0xf7, 0x34, 0xf7,
+ 0x10, 0xf7, 0x40, 0xf7, 0x29, 0xda, 0x62, 0xb2,
+ 0x62, 0x9d, 0x1f, 0xcc, 0xf7, 0x8, 0x5, 0x66,
+ 0x6, 0x50, 0x23, 0x5, 0x90, 0x79, 0x71, 0x8d,
+ 0x81, 0x1b, 0xfb, 0x32, 0xfb, 0xb, 0xfb, 0x41,
+ 0xfb, 0x2e, 0x4d, 0xab, 0x5f, 0xb8, 0x74, 0x1f,
+ 0xc1, 0xa6, 0x15, 0xf7, 0x55, 0xf7, 0xeb, 0x5,
+ 0x8c, 0x8a, 0x8b, 0x87, 0x88, 0x1a, 0x40, 0x51,
+ 0xfb, 0xaa, 0x2b, 0x77, 0x7f, 0x92, 0x96, 0x83,
+ 0x1e, 0xe, 0x64, 0xa, 0xf7, 0xa0, 0x77, 0x1,
+ 0x2c, 0x1d, 0x54, 0x4e, 0x8f, 0xa, 0x91, 0x97,
+ 0x31, 0xa, 0x79, 0x86, 0x97, 0x9a, 0x9e, 0x94,
+ 0xa4, 0x2d, 0xa, 0xcf, 0xf7, 0xfd, 0x2a, 0x1d,
+ 0x64, 0xa, 0xf7, 0xa0, 0x77, 0x1, 0x29, 0xa,
+ 0x96, 0x9b, 0x9e, 0x94, 0xa4, 0x2d, 0xa, 0x68,
+ 0xf7, 0xfd, 0x26, 0xa, 0x64, 0xa, 0xf7, 0x99,
+ 0x77, 0x1, 0x29, 0xa, 0x95, 0x9a, 0x9e, 0x94,
+ 0xa6, 0x2d, 0xa, 0xfb, 0x1a, 0xf7, 0xfd, 0x42,
+ 0xa, 0xe, 0x64, 0xa, 0xe7, 0xf7, 0x1a, 0x1,
+ 0xf7, 0x2c, 0x8e, 0xa, 0x3, 0x29, 0xa, 0x96,
+ 0x9a, 0x9e, 0x94, 0xa5, 0x2d, 0xa, 0xfb, 0x1a,
+ 0xf8, 0x45, 0x2e, 0xa, 0x3a, 0xa, 0x79, 0x1d,
+ 0xf7, 0x93, 0x77, 0x1, 0x35, 0x1d, 0x55, 0x4b,
+ 0x4a, 0x70, 0x7b, 0x7e, 0x93, 0x93, 0x7e, 0x1e,
+ 0x94, 0x7c, 0x7c, 0x95, 0x77, 0x38, 0x1d, 0x6f,
+ 0x96, 0x7e, 0x97, 0x82, 0x1e, 0x9a, 0x7f, 0x9c,
+ 0x85, 0x72, 0x7a, 0xa, 0x5b, 0xf8, 0x27, 0x26,
+ 0xa, 0x87, 0x1d, 0xf7, 0x81, 0x77, 0x59, 0x1d,
+ 0x74, 0x6b, 0x43, 0x44, 0xfb, 0x86, 0x4f, 0x1d,
+ 0x5a, 0x1f, 0x88, 0x8e, 0xea, 0xf7, 0xe8, 0x44,
+ 0x77, 0x1d, 0x1a, 0x7e, 0xfb, 0xe, 0xfc, 0x5e,
+ 0x4c, 0xfb, 0x88, 0x1e, 0x4d, 0x7b, 0x75, 0x87,
+ 0xa, 0x77, 0xa9, 0xab, 0xa1, 0x9e, 0xc7, 0x93,
+ 0xac, 0x1f, 0xe, 0xfb, 0x6e, 0xfb, 0x61, 0xf7,
+ 0x7, 0xf7, 0x65, 0x77, 0xf7, 0xff, 0x77, 0xda,
+ 0xf7, 0x1a, 0x12, 0xeb, 0x8e, 0xa, 0xfb, 0x2,
+ 0xcb, 0x13, 0xfa, 0x45, 0xa, 0x94, 0x94, 0x7d,
+ 0x1e, 0x94, 0x7d, 0x7e, 0x93, 0x78, 0x38, 0x1d,
+ 0x6c, 0x98, 0x7e, 0x98, 0x82, 0x1e, 0x99, 0x81,
+ 0x9a, 0x84, 0x74, 0x7a, 0xa, 0xfb, 0x27, 0xf8,
+ 0x6f, 0x2e, 0xa, 0x13, 0xfc, 0x3a, 0xa, 0x66,
+ 0x1d, 0xf8, 0x6b, 0x3c, 0x1d, 0xe, 0x53, 0x1d,
+ 0x56, 0x7d, 0x96, 0x9c, 0x94, 0x8e, 0x97, 0x8f,
+ 0x98, 0x1f, 0xbd, 0xf7, 0x4d, 0xf7, 0x28, 0xde,
+ 0xa0, 0xd1, 0xfb, 0x2a, 0x3a, 0xc7, 0xf7, 0x67,
+ 0x9c, 0xc7, 0xa7, 0x94, 0xc3, 0x8e, 0x82, 0xa,
+ 0xba, 0x84, 0xa3, 0x79, 0x74, 0x1a, 0x83, 0x8b,
+ 0x83, 0x89, 0x83, 0x1e, 0x3e, 0xfb, 0xa8, 0x27,
+ 0x56, 0x75, 0x45, 0xf3, 0xc3, 0x69, 0xfb, 0xe,
+ 0x7b, 0x52, 0x76, 0x8c, 0x60, 0x85, 0x19, 0xe,
+ 0x66, 0x1d, 0xf9, 0x58, 0x77, 0x1, 0xf7, 0x66,
+ 0xf7, 0x21, 0x15, 0x71, 0x88, 0x52, 0x56, 0x8f,
+ 0xa, 0x90, 0x94, 0x9f, 0x9b, 0xc5, 0x91, 0xa1,
+ 0x1f, 0xc4, 0xf7, 0x61, 0xe1, 0xba, 0x9e, 0xcf,
+ 0x35, 0x5c, 0xd0, 0xf7, 0x8e, 0x7f, 0xa, 0x8d,
+ 0xac, 0x8b, 0x6c, 0x1a, 0x76, 0x6f, 0x28, 0x71,
+ 0x2f, 0x1e, 0x3d, 0x60, 0x78, 0x45, 0xd8, 0xb6,
+ 0x5, 0x65, 0xfb, 0x1d, 0x6d, 0xfb, 0x1, 0x70,
+ 0x1a, 0x7d, 0x85, 0x56, 0xcf, 0xdb, 0xbd, 0xd0,
+ 0xce, 0xb7, 0x1e, 0xe, 0xf7, 0xae, 0x83, 0xab,
+ 0x73, 0xab, 0xf7, 0xc4, 0xad, 0xf7, 0x9f, 0xab,
+ 0x73, 0xab, 0x12, 0xa2, 0xf7, 0x21, 0x13, 0xb4,
+ 0xf8, 0xe1, 0xf7, 0xe4, 0x15, 0xde, 0x8a, 0xba,
+ 0x80, 0x48, 0x1a, 0x83, 0x88, 0x6b, 0x8a, 0x7d,
+ 0x1e, 0xa6, 0x86, 0xd3, 0xf7, 0xa4, 0x70, 0x8e,
+ 0x72, 0x54, 0x71, 0x5a, 0xfb, 0x1e, 0x8c, 0x19,
+ 0xc8, 0xf7, 0x70, 0x5, 0xac, 0x94, 0x8f, 0x99,
+ 0xb0, 0x1b, 0xf7, 0x44, 0x81, 0x30, 0x4d, 0x1f,
+ 0xa4, 0x85, 0xb9, 0xf7, 0x53, 0x5, 0xfb, 0xe3,
+ 0x6, 0x78, 0x6d, 0x8d, 0x8d, 0x71, 0x1f, 0x13,
+ 0xac, 0x8d, 0x70, 0x73, 0x8d, 0x82, 0x1b, 0xfb,
+ 0x24, 0xfb, 0xc9, 0xfb, 0x6, 0xfb, 0xe0, 0xfb,
+ 0xc, 0xeb, 0xfb, 0xb, 0xf7, 0x3c, 0x1f, 0xf7,
+ 0x35, 0x92, 0x5, 0x13, 0x74, 0xd5, 0x8c, 0x5,
+ 0xf7, 0xbc, 0x6, 0xc7, 0xf7, 0x56, 0x70, 0x90,
+ 0x5, 0x46, 0x67, 0x40, 0x29, 0xfb, 0x14, 0x1b,
+ 0x4c, 0x70, 0x8e, 0xa9, 0x92, 0x8c, 0x94, 0x8d,
+ 0x95, 0x1f, 0xfb, 0x19, 0xab, 0x15, 0x13, 0xac,
+ 0x4e, 0x7a, 0x73, 0x65, 0x4b, 0x1b, 0xfb, 0x4,
+ 0x80, 0xf2, 0xab, 0xf7, 0xe, 0xdf, 0xf7, 0xff,
+ 0xf7, 0x50, 0x8c, 0x1f, 0x9e, 0xc4, 0x8b, 0x4b,
+ 0x74, 0x81, 0x67, 0x89, 0x83, 0x1f, 0xe, 0xc7,
+ 0x7e, 0xa8, 0x6e, 0xca, 0xf8, 0x13, 0xa8, 0x12,
+ 0x91, 0xf7, 0x9, 0x13, 0x70, 0xf8, 0x39, 0xf7,
+ 0x6e, 0x15, 0xf7, 0x6a, 0xd2, 0xaf, 0x8b, 0xa3,
+ 0x1b, 0x9e, 0x9a, 0x7c, 0x70, 0x89, 0x8b, 0xfb,
+ 0x17, 0xfb, 0x39, 0x64, 0x1f, 0x20, 0xfb, 0x42,
+ 0x15, 0x5c, 0xb3, 0xb8, 0x81, 0xa7, 0x1b, 0xe6,
+ 0xc5, 0xbd, 0xe2, 0xb6, 0x1f, 0x6f, 0x9a, 0x5,
+ 0x58, 0x6a, 0x70, 0x65, 0x4f, 0x1b, 0x60, 0x75,
+ 0xb8, 0xbc, 0x98, 0x8e, 0x99, 0x90, 0x98, 0x1f,
+ 0xf1, 0xa2, 0xf7, 0x32, 0xb3, 0xf7, 0xd, 0x1a,
+ 0xd5, 0x50, 0x9f, 0x54, 0x49, 0x60, 0x69, 0x6f,
+ 0x68, 0x1e, 0xa4, 0x7a, 0x70, 0xb0, 0x42, 0x1b,
+ 0xfb, 0x49, 0xfb, 0x4, 0xfb, 0x5c, 0x22, 0xfb,
+ 0x39, 0xf7, 0x19, 0x86, 0xa5, 0xaf, 0xd0, 0x96,
+ 0xb9, 0xb7, 0x1f, 0xfb, 0x53, 0xc7, 0x15, 0xea,
+ 0xca, 0xf7, 0x1e, 0x8a, 0x87, 0x1e, 0xb9, 0x9f,
+ 0xa6, 0xc1, 0xbb, 0x1b, 0xc3, 0x8c, 0x56, 0x76,
+ 0x1f, 0x13, 0xb0, 0x56, 0x51, 0xfb, 0xb6, 0x28,
+ 0x5d, 0x80, 0xb1, 0xbd, 0x1e, 0xe, 0x21, 0x79,
+ 0xad, 0xf9, 0xe, 0xae, 0x87, 0x77, 0xf7, 0x80,
+ 0x85, 0x1d, 0x13, 0xdc, 0x8d, 0x79, 0x15, 0xa9,
+ 0x6, 0xa2, 0x95, 0x90, 0x97, 0xa4, 0x1b, 0x9c,
+ 0xa3, 0x7e, 0x81, 0xad, 0x1f, 0x84, 0xa1, 0xa6,
+ 0x86, 0xa9, 0x1b, 0xf7, 0x2f, 0xe2, 0xdb, 0xf7,
+ 0x18, 0xd9, 0x4d, 0xc8, 0x4d, 0xc2, 0x1f, 0x4e,
+ 0xc2, 0x4f, 0xbb, 0xbf, 0x1a, 0x96, 0x83, 0xeb,
+ 0xf1, 0xf7, 0x6, 0xa1, 0xfb, 0x2, 0x53, 0x91,
+ 0x1e, 0xa6, 0x87, 0x5, 0x13, 0xbc, 0xb3, 0xf7,
+ 0x5d, 0x5, 0x6d, 0x6, 0x71, 0x7f, 0x6f, 0x8b,
+ 0x87, 0x1b, 0x7b, 0x76, 0x93, 0x93, 0x73, 0x1f,
+ 0x13, 0xdc, 0x92, 0x75, 0x72, 0x92, 0x70, 0x1b,
+ 0xfb, 0x1a, 0x3a, 0x2b, 0x26, 0x3e, 0xc2, 0x57,
+ 0xc5, 0x5b, 0x1f, 0xcb, 0x56, 0xcf, 0x5b, 0x47,
+ 0x1a, 0x77, 0x82, 0x21, 0xfb, 0x4, 0x61, 0xfb,
+ 0x8, 0x9b, 0xf7, 0x40, 0x8a, 0x1e, 0x6e, 0x8d,
+ 0x5, 0xf7, 0x94, 0xf8, 0x99, 0x15, 0xdd, 0x6,
+ 0xf7, 0x2a, 0xf7, 0x42, 0x5, 0x53, 0x6, 0xfb,
+ 0xf, 0x78, 0x1d, 0xfb, 0xa5, 0x93, 0x76, 0xf8,
+ 0x4e, 0xac, 0x8a, 0x77, 0xf7, 0x8d, 0x77, 0x12,
+ 0xf7, 0x40, 0xf6, 0x13, 0xd8, 0x85, 0xa, 0x98,
+ 0x96, 0x85, 0x85, 0x9a, 0x1f, 0x87, 0x97, 0x99,
+ 0x87, 0x9e, 0x1b, 0xcb, 0xe9, 0xb0, 0xec, 0xba,
+ 0x6e, 0xb7, 0x6c, 0xb3, 0x1f, 0x66, 0xba, 0x63,
+ 0xb5, 0xad, 0x1a, 0x90, 0x85, 0xbc, 0xc0, 0xc6,
+ 0xa6, 0x46, 0x59, 0x93, 0x1e, 0xa6, 0x89, 0x5,
+ 0x13, 0xb8, 0x79, 0xa, 0x7a, 0x82, 0x90, 0x91,
+ 0x7f, 0x1f, 0x13, 0xd8, 0x90, 0x80, 0x7d, 0x91,
+ 0x73, 0x1b, 0x4a, 0x3e, 0x67, 0x32, 0x4e, 0xaa,
+ 0x65, 0xbc, 0x4c, 0x1f, 0xa4, 0x6b, 0x9f, 0x5e,
+ 0x69, 0x1a, 0x70, 0x7d, 0x77, 0x66, 0x82, 0x48,
+ 0x7c, 0xa, 0xf7, 0x6a, 0xf8, 0xa5, 0x60, 0x1d,
+ 0x58, 0x8b, 0xa4, 0xf8, 0xff, 0xa4, 0xc5, 0xf7,
+ 0x1b, 0x1, 0xf7, 0x74, 0xf7, 0x1b, 0xd8, 0xf7,
+ 0x1b, 0x3, 0xd4, 0x16, 0xf7, 0xd6, 0xa4, 0x6,
+ 0x64, 0x67, 0x95, 0xac, 0x93, 0x8d, 0x95, 0x8f,
+ 0x96, 0x1f, 0xbf, 0xf7, 0x67, 0xf7, 0x52, 0xf7,
+ 0x9f, 0x90, 0x1d, 0xb6, 0x93, 0x19, 0xa4, 0xfb,
+ 0x64, 0x72, 0x7, 0xbc, 0x89, 0x9f, 0x7c, 0x74,
+ 0x1a, 0x79, 0x80, 0x74, 0x7a, 0x72, 0x1e, 0xfb,
+ 0x15, 0xfb, 0x4e, 0x5, 0x4b, 0xf7, 0x5c, 0x7e,
+ 0x96, 0xa7, 0x1a, 0xa2, 0x97, 0xa9, 0xc5, 0x1e,
+ 0xa4, 0xfb, 0xaf, 0x72, 0x7, 0xbb, 0x84, 0x92,
+ 0x94, 0x9d, 0x54, 0xe3, 0xfb, 0xaa, 0x18, 0x4f,
+ 0xfb, 0x6c, 0x79, 0x4b, 0x72, 0x88, 0x51, 0x86,
+ 0x19, 0xf7, 0x2b, 0xf9, 0x95, 0x46, 0x1d, 0x58,
+ 0x58, 0xa, 0xf7, 0x78, 0x77, 0x3e, 0xa, 0xf7,
+ 0xd1, 0xf9, 0x40, 0x60, 0xa, 0xfb, 0xa5, 0x52,
+ 0x76, 0xf8, 0x43, 0xeb, 0xf7, 0x85, 0x77, 0x1,
+ 0x72, 0x75, 0x15, 0xa7, 0xb1, 0x92, 0x8a, 0x9a,
+ 0x1b, 0xa5, 0xa4, 0x78, 0x78, 0xa8, 0x1f, 0x75,
+ 0xac, 0xb2, 0x74, 0xbf, 0x76, 0xa, 0x7e, 0x8f,
+ 0x82, 0x8f, 0x85, 0x1f, 0x90, 0x83, 0x92, 0x86,
+ 0x83, 0x1a, 0x84, 0x83, 0x83, 0x7e, 0x71, 0x81,
+ 0xa2, 0xa8, 0x7c, 0x1e, 0x7a, 0xad, 0x73, 0xb5,
+ 0x4c, 0xa4, 0x80, 0xa, 0xfb, 0x2e, 0x70, 0x1d,
+ 0xfb, 0xf6, 0x5, 0xf7, 0x73, 0xf8, 0x99, 0x60,
+ 0xa, 0xfb, 0x30, 0xf7, 0x27, 0xf8, 0x29, 0xb7,
+ 0xf7, 0xb, 0xf7, 0x28, 0x6d, 0xa9, 0x12, 0xf8,
+ 0x3c, 0xf7, 0x5, 0x13, 0xd8, 0xd9, 0xf8, 0x20,
+ 0x15, 0xf4, 0x6, 0x3f, 0xfc, 0x22, 0x8f, 0x3d,
+ 0x55, 0x69, 0x8, 0x85, 0x82, 0x77, 0x85, 0x7c,
+ 0x1b, 0x81, 0x83, 0x8f, 0x94, 0x91, 0x94, 0x93,
+ 0x93, 0x96, 0x1f, 0x91, 0x93, 0x90, 0x95, 0x96,
+ 0x1a, 0x9c, 0x7e, 0xac, 0x64, 0x5c, 0x80, 0x62,
+ 0x7d, 0x48, 0xc0, 0x72, 0xc3, 0xf7, 0x7, 0xef,
+ 0xe5, 0xf7, 0xc8, 0xc1, 0x1e, 0xa6, 0xf7, 0x2e,
+ 0x5, 0xf7, 0x8, 0x6, 0x94, 0xb7, 0x5, 0xfb,
+ 0xa, 0x6, 0xf7, 0x1f, 0xa2, 0x9b, 0xed, 0xcc,
+ 0x1b, 0x97, 0x97, 0x86, 0x81, 0x86, 0x86, 0x86,
+ 0x85, 0x86, 0x1f, 0x83, 0x83, 0x81, 0x81, 0x77,
+ 0x1a, 0x13, 0xe8, 0x66, 0xaa, 0x7e, 0x9d, 0xcb,
+ 0x8b, 0xc0, 0x95, 0xba, 0x5c, 0xb1, 0x4f, 0xfb,
+ 0x41, 0x64, 0xfb, 0x54, 0x40, 0x72, 0x1e, 0x20,
+ 0x6, 0xe, 0x7f, 0x1d, 0xf7, 0x42, 0x77, 0x1,
+ 0xb3, 0xf8, 0x98, 0x5b, 0xa, 0xe6, 0xe3, 0x30,
+ 0x7e, 0x1d, 0x7f, 0x1d, 0xf7, 0x42, 0x77, 0x1,
+ 0xf7, 0x3b, 0xf8, 0x98, 0x60, 0x1d, 0xfb, 0xdd,
+ 0xf8, 0x98, 0xd3, 0x43, 0xf7, 0x36, 0x1, 0xd3,
+ 0xf9, 0x3a, 0x15, 0xb6, 0x6, 0x57, 0x90, 0xaa,
+ 0x65, 0xd3, 0x1b, 0xe5, 0x9e, 0xc3, 0xad, 0x9b,
+ 0x1f, 0xb2, 0x6, 0x85, 0x80, 0xfb, 0x30, 0xfb,
+ 0x37, 0xfb, 0x1f, 0x89, 0xf7, 0xa, 0xb7, 0x1e,
+ 0xe, 0xfb, 0xdd, 0xf8, 0xa1, 0xf7, 0x16, 0x1,
+ 0xf7, 0x57, 0xf7, 0x16, 0x3, 0xf7, 0x37, 0xf8,
+ 0xe2, 0x15, 0x4b, 0xa, 0xe, 0xfb, 0xdd, 0xf8,
+ 0x9d, 0xbc, 0xf7, 0xb, 0xbb, 0x1, 0xf7, 0x6,
+ 0xbb, 0xf7, 0x15, 0xbc, 0x3, 0xf7, 0x13, 0xf9,
+ 0x3, 0x15, 0x4f, 0xbb, 0x5c, 0xc6, 0xc5, 0xbb,
+ 0xbb, 0xc6, 0xc5, 0x5b, 0xbb, 0x51, 0x50, 0x5b,
+ 0x5c, 0x5e, 0xa, 0xe, 0xfb, 0xdd, 0xfb, 0x41,
+ 0xd0, 0xf7, 0x28, 0x77, 0x1, 0x63, 0xdf, 0x3,
+ 0xa7, 0xb7, 0x15, 0x63, 0x5f, 0x6f, 0x5e, 0x5e,
+ 0x1a, 0x46, 0xd2, 0x7d, 0xb3, 0xad, 0xc9, 0xa6,
+ 0xbb, 0xa1, 0x1e, 0x71, 0x99, 0x5, 0x81, 0x79,
+ 0x7e, 0x81, 0x74, 0x1b, 0x63, 0x72, 0x9d, 0xba,
+ 0xa4, 0x98, 0xb2, 0x8f, 0x9e, 0x1f, 0xe, 0xfb,
+ 0xdd, 0xf8, 0xb2, 0xf6, 0x30, 0x76, 0xa6, 0x76,
+ 0xb0, 0xd6, 0x41, 0xcf, 0x12, 0x13, 0x30, 0x87,
+ 0xf8, 0xb3, 0x15, 0xaf, 0x6, 0x13, 0x48, 0x9c,
+ 0x92, 0x93, 0xa0, 0xa9, 0x1b, 0xa5, 0xa1, 0x82,
+ 0x81, 0x9f, 0x1f, 0x13, 0x80, 0x81, 0xa0, 0xa0,
+ 0x81, 0xa5, 0x1b, 0xd9, 0x9f, 0xd6, 0xab, 0x93,
+ 0x1f, 0x66, 0x6, 0x7a, 0x83, 0x82, 0x76, 0x6c,
+ 0x1b, 0x7e, 0x74, 0x95, 0x95, 0x72, 0x1f, 0x94,
+ 0x74, 0x72, 0x94, 0x73, 0x1b, 0x13, 0x30, 0x33,
+ 0x7a, 0x23, 0x89, 0x1f, 0xe, 0xfb, 0xdd, 0xf8,
+ 0x98, 0xf7, 0x49, 0x1, 0xd0, 0xf8, 0x98, 0x15,
+ 0xbb, 0x6, 0xf7, 0x2d, 0x21, 0x1d, 0xd0, 0xfb,
+ 0x17, 0x15, 0xba, 0x5a, 0xa, 0xf7, 0x46, 0xc7,
+ 0x4f, 0xe6, 0x1, 0x80, 0xf7, 0x46, 0x15, 0xf8,
+ 0x55, 0xc7, 0xfc, 0x55, 0x6, 0xe, 0xf7, 0xe6,
+ 0xf7, 0x46, 0xc8, 0x4e, 0xe6, 0x1, 0xf7, 0x46,
+ 0x4, 0xfa, 0x53, 0xc8, 0xfe, 0x53, 0x6, 0xe,
+ 0xfb, 0xdd, 0x69, 0x1d, 0xf7, 0x14, 0xe1, 0x35,
+ 0xf7, 0x30, 0x13, 0xe0, 0xf7, 0xe0, 0xf9, 0x29,
+ 0x15, 0x5c, 0xa, 0xc6, 0x7b, 0xa6, 0x1e, 0x13,
+ 0xd0, 0xb4, 0xa8, 0xab, 0xb5, 0xa9, 0x7c, 0x9a,
+ 0x7a, 0x97, 0x1f, 0x13, 0xe0, 0x79, 0x98, 0x77,
+ 0x94, 0xa1, 0x7a, 0x1d, 0xe, 0xfb, 0xdd, 0x69,
+ 0x1d, 0xf7, 0x26, 0x6d, 0x1d, 0x13, 0xd0, 0xf7,
+ 0x3, 0xf8, 0x5, 0x15, 0x49, 0xa, 0x13, 0xe0,
+ 0x62, 0x6e, 0x6b, 0x61, 0x6b, 0x9c, 0x7d, 0x9c,
+ 0x7f, 0x1f, 0x13, 0xd0, 0x9d, 0x7f, 0x9d, 0x81,
+ 0x89, 0xa, 0xe, 0xfb, 0xdd, 0xfb, 0x35, 0x62,
+ 0xa, 0xb6, 0x6d, 0x1d, 0x13, 0xd0, 0x86, 0xfb,
+ 0x32, 0x15, 0x98, 0x73, 0x5, 0x49, 0xa, 0x13,
+ 0xe0, 0x62, 0x6e, 0x6b, 0x61, 0x6f, 0x98, 0x7c,
+ 0x9a, 0x80, 0x1f, 0x13, 0xd0, 0x9e, 0x7c, 0xa2,
+ 0x83, 0x73, 0x54, 0xa, 0xe, 0x69, 0x1d, 0xc0,
+ 0xe1, 0x35, 0xf7, 0x30, 0xef, 0xe1, 0x35, 0xf7,
+ 0x30, 0x13, 0xd8, 0xf7, 0x95, 0xf9, 0x29, 0x15,
+ 0x63, 0xa, 0xab, 0x79, 0x9a, 0x7a, 0x97, 0x1e,
+ 0x13, 0xe4, 0x79, 0x97, 0x7a, 0x94, 0xa0, 0x7a,
+ 0x1d, 0xf7, 0x94, 0x16, 0x63, 0xa, 0xa8, 0x7c,
+ 0x9a, 0x7b, 0x97, 0x1e, 0x13, 0xe8, 0x78, 0x99,
+ 0x77, 0x93, 0xa2, 0x7a, 0x1d, 0xe, 0x69, 0x1d,
+ 0xf0, 0x6d, 0x1d, 0xef, 0x6d, 0x1d, 0x13, 0xe4,
+ 0xf7, 0xd6, 0xf8, 0x5, 0x15, 0x40, 0xa, 0x6d,
+ 0x61, 0x6c, 0x9c, 0x7b, 0x9c, 0x7f, 0x1f, 0x13,
+ 0xd4, 0x9d, 0x7e, 0x9d, 0x81, 0x89, 0xa, 0xfb,
+ 0x87, 0x73, 0x15, 0x40, 0xa, 0x6d, 0x61, 0x6d,
+ 0x9a, 0x7c, 0x9b, 0x7f, 0x1f, 0x13, 0xd8, 0x9e,
+ 0x7d, 0x9f, 0x81, 0x75, 0x54, 0xa, 0xe, 0xfb,
+ 0x35, 0x62, 0xa, 0x82, 0x6d, 0x1d, 0xef, 0x6d,
+ 0x1d, 0x13, 0xe4, 0xf7, 0x5b, 0xfb, 0x32, 0x15,
+ 0x98, 0x73, 0x5, 0x40, 0xa, 0x6c, 0x61, 0x6a,
+ 0x9d, 0x7c, 0x9d, 0x7f, 0x1f, 0x13, 0xd4, 0x9c,
+ 0x7f, 0x9c, 0x82, 0x89, 0xa, 0xfb, 0x94, 0x16,
+ 0x98, 0x73, 0x5, 0x40, 0xa, 0x6c, 0x61, 0x6c,
+ 0x9b, 0x7c, 0x9c, 0x7f, 0x1f, 0x13, 0xd8, 0x9d,
+ 0x7e, 0x9e, 0x82, 0x75, 0x54, 0xa, 0xe, 0xfb,
+ 0x10, 0x76, 0xf8, 0xb7, 0xf3, 0x4c, 0xa3, 0xf7,
+ 0x6e, 0x77, 0x12, 0x13, 0xb0, 0xf7, 0x30, 0xfb,
+ 0x25, 0x15, 0xa2, 0x6, 0xb1, 0xf7, 0x1e, 0xb0,
+ 0xf7, 0x4d, 0xd0, 0xe6, 0x8, 0x81, 0x99, 0x7b,
+ 0xce, 0xbe, 0x1a, 0x9b, 0x8d, 0x9a, 0x8f, 0x96,
+ 0x1e, 0xa9, 0x8d, 0xa1, 0x84, 0x9d, 0x82, 0x8,
+ 0x13, 0xd0, 0x7f, 0xa2, 0x9d, 0x7c, 0xa2, 0x1b,
+ 0x95, 0xba, 0x90, 0xba, 0x90, 0x8b, 0xba, 0x54,
+ 0x73, 0x7a, 0x7e, 0x80, 0x73, 0x1f, 0x13, 0xb0,
+ 0x83, 0x7a, 0x77, 0x84, 0x6e, 0x1b, 0x8f, 0x9d,
+ 0x91, 0xac, 0x9e, 0xa2, 0x8, 0xa6, 0xad, 0x9f,
+ 0xa5, 0xa9, 0x1a, 0x9d, 0x80, 0xaf, 0x5d, 0x69,
+ 0x76, 0x73, 0x68, 0x6c, 0x96, 0x6f, 0x91, 0x71,
+ 0x1e, 0x90, 0x72, 0x8a, 0x73, 0x80, 0x72, 0x6a,
+ 0x8a, 0x75, 0x94, 0x78, 0x94, 0x8, 0x13, 0xd0,
+ 0x96, 0x76, 0x79, 0x96, 0x70, 0x1b, 0x81, 0x62,
+ 0x89, 0x57, 0x72, 0x9e, 0x74, 0xaa, 0xab, 0x9c,
+ 0x97, 0x96, 0x9f, 0x1f, 0x13, 0xb0, 0x9c, 0x94,
+ 0x9f, 0x93, 0xaa, 0x8a, 0x88, 0x67, 0x6c, 0x38,
+ 0x56, 0x5f, 0x95, 0xfb, 0xa, 0x18, 0xe, 0xfb,
+ 0x57, 0x76, 0xf7, 0x57, 0xf4, 0xf7, 0xb9, 0xf4,
+ 0xf7, 0x57, 0x77, 0x1, 0xd9, 0xf7, 0x12, 0xaf,
+ 0x9f, 0xaf, 0xf7, 0x12, 0x14, 0xe, 0xf7, 0x4a,
+ 0xa1, 0x15, 0x73, 0x40, 0x3b, 0x59, 0x51, 0x1a,
+ 0x6c, 0xa1, 0x73, 0xaa, 0xb9, 0xa6, 0xb8, 0xb5,
+ 0x1e, 0xad, 0x80, 0xac, 0xad, 0x1a, 0x9c, 0x8f,
+ 0x9c, 0x8e, 0x9b, 0x1e, 0x8a, 0xc1, 0xb8, 0x61,
+ 0xc0, 0x1b, 0xa9, 0xa1, 0xa2, 0xa8, 0xaa, 0x71,
+ 0xa1, 0x6e, 0x1f, 0x8c, 0x6c, 0x50, 0x5e, 0x58,
+ 0x1b, 0x9c, 0xbe, 0xab, 0xa3, 0xbb, 0xa0, 0x8,
+ 0x70, 0x9e, 0x79, 0xa1, 0xae, 0x1a, 0xc2, 0xb7,
+ 0xa7, 0xb6, 0x9e, 0x1e, 0x74, 0xa0, 0x7b, 0x9c,
+ 0xad, 0x1a, 0x97, 0x8d, 0x96, 0x8e, 0x97, 0x1e,
+ 0xb4, 0xcd, 0x58, 0x92, 0xad, 0x1f, 0xac, 0xa0,
+ 0x9e, 0xad, 0xac, 0x70, 0x9e, 0x6b, 0x5d, 0x67,
+ 0x5f, 0x8c, 0x5a, 0x1f, 0xa3, 0xd6, 0xdb, 0xbd,
+ 0xc5, 0x1a, 0xaa, 0x75, 0xa3, 0x6c, 0x5d, 0x70,
+ 0x5e, 0x61, 0x1e, 0x69, 0x96, 0x6a, 0x69, 0x1a,
+ 0x7a, 0x87, 0x7a, 0x88, 0x7b, 0x1e, 0x8c, 0x55,
+ 0x5e, 0xb5, 0x56, 0x1b, 0x6d, 0x75, 0x74, 0x6e,
+ 0x6c, 0xa5, 0x75, 0xa8, 0x1f, 0x8a, 0xaa, 0xc6,
+ 0xb8, 0xbe, 0x1b, 0x7a, 0x58, 0x6b, 0x73, 0x5b,
+ 0x76, 0x8, 0xa6, 0x78, 0x9d, 0x75, 0x68, 0x1a,
+ 0x54, 0x5f, 0x6f, 0x60, 0x78, 0x1e, 0xa2, 0x76,
+ 0x9b, 0x7a, 0x69, 0x1a, 0x7f, 0x89, 0x80, 0x88,
+ 0x7f, 0x1e, 0x62, 0x49, 0xbe, 0x84, 0x69, 0x1f,
+ 0x6a, 0x76, 0x78, 0x69, 0x6a, 0xa6, 0x78, 0xab,
+ 0xb9, 0xaf, 0xb7, 0x8a, 0xbc, 0x1f, 0xe, 0xfb,
+ 0xcc, 0xf7, 0x58, 0x76, 0xf7, 0xc4, 0x77, 0xcd,
+ 0x77, 0x1, 0xac, 0xf7, 0xe6, 0x15, 0x3c, 0xcb,
+ 0x4c, 0xd9, 0xd9, 0xca, 0xc9, 0xd9, 0xd9, 0x4a,
+ 0xcc, 0x3d, 0x3c, 0x4e, 0x4c, 0x3d, 0x1e, 0xe,
+ 0xf7, 0xe6, 0x7e, 0xf7, 0x28, 0x1, 0xb3, 0xf7,
+ 0x2a, 0xf7, 0x49, 0xf7, 0x2a, 0xf7, 0x49, 0xf7,
+ 0x2a, 0x14, 0x70, 0xb3, 0xc8, 0x15, 0x62, 0xab,
+ 0x7d, 0x1d, 0x6a, 0x69, 0x63, 0x1e, 0xf7, 0xdf,
+ 0x16, 0x62, 0xab, 0x7d, 0x1d, 0x6a, 0x69, 0x63,
+ 0x1e, 0xf7, 0xdf, 0x16, 0x62, 0xa9, 0x6a, 0xb7,
+ 0xb4, 0xae, 0xab, 0xb5, 0xb4, 0x68, 0x53, 0xa,
+ 0xf7, 0xe6, 0x7d, 0xa5, 0x85, 0x76, 0xf7, 0xe1,
+ 0xa5, 0xf7, 0xc6, 0xa5, 0x8c, 0x77, 0x12, 0x13,
+ 0xb0, 0xf7, 0xe6, 0xf7, 0x8, 0x2b, 0x1d, 0xf7,
+ 0x74, 0x33, 0x2b, 0x1d, 0xfd, 0x69, 0xf7, 0x88,
+ 0x2b, 0x1d, 0x13, 0x68, 0xfb, 0x30, 0xfc, 0xbb,
+ 0x15, 0xc7, 0x6, 0xf8, 0xe9, 0xf9, 0x48, 0x5,
+ 0x4f, 0x6, 0xe, 0xfb, 0xdd, 0x72, 0x1d, 0xab,
+ 0xf7, 0x6d, 0x71, 0x1d, 0x80, 0x95, 0x96, 0x8a,
+ 0x1d, 0x42, 0x8d, 0xa, 0xe2, 0x5f, 0xa, 0xe,
+ 0xfb, 0xdd, 0x72, 0x1d, 0xf7, 0x30, 0x49, 0x1d,
+ 0x96, 0x82, 0x7f, 0x93, 0x83, 0x1b, 0x86, 0x87,
+ 0x87, 0x7f, 0x1f, 0xe, 0xfc, 0x83, 0x92, 0x76,
+ 0xf9, 0x4d, 0x77, 0x1, 0xfb, 0x1, 0x7d, 0x15,
+ 0xf8, 0x45, 0xf9, 0x4b, 0x5, 0x8d, 0x4f, 0x7,
+ 0xfc, 0x45, 0xfd, 0x4d, 0x5, 0xe, 0x90, 0x8b,
+ 0xba, 0xf7, 0x60, 0xb4, 0xef, 0xb4, 0xf7, 0x69,
+ 0xb0, 0x1, 0xf7, 0x4, 0xf7, 0x26, 0xf7, 0xa7,
+ 0xae, 0x3, 0xb3, 0xf7, 0x8f, 0x15, 0xfb, 0x41,
+ 0xf7, 0x1a, 0x3d, 0xf7, 0x4, 0xf7, 0xb, 0xf7,
+ 0x16, 0xbb, 0xde, 0xc5, 0x1e, 0x6d, 0xa1, 0x5,
+ 0x53, 0x63, 0xfb, 0x2, 0x59, 0x57, 0x1b, 0xfb,
+ 0xe, 0x55, 0xc3, 0xf7, 0x28, 0x8c, 0x1f, 0xf7,
+ 0xbd, 0x6, 0x97, 0xb4, 0x5, 0xfb, 0xc5, 0x6,
+ 0xa5, 0x96, 0xb9, 0x94, 0xa7, 0x1e, 0xf7, 0xc1,
+ 0x6, 0x99, 0xb4, 0x5, 0xfb, 0xc2, 0x6, 0xd5,
+ 0x97, 0xe3, 0xf7, 0x1f, 0xf1, 0x1b, 0xf7, 0x6,
+ 0x91, 0x51, 0x2e, 0x1f, 0xae, 0xf7, 0x22, 0x6,
+ 0x9e, 0x63, 0x79, 0xa6, 0x2c, 0x1b, 0x52, 0xfb,
+ 0x77, 0x55, 0xfb, 0x58, 0x49, 0x1f, 0xfb, 0x17,
+ 0x6, 0x7e, 0x62, 0x5, 0xf7, 0x14, 0x6, 0x83,
+ 0x6e, 0x83, 0x61, 0x89, 0x6e, 0x8, 0x2a, 0x6,
+ 0x7e, 0x62, 0x5, 0xe, 0xf7, 0xe6, 0xf7, 0x9d,
+ 0xa0, 0x89, 0x76, 0xf8, 0x14, 0xa1, 0x12, 0xf7,
+ 0x3c, 0xd9, 0xf7, 0x8d, 0xa6, 0xf7, 0xcc, 0xd9,
+ 0x13, 0xbc, 0xf7, 0xa, 0xf7, 0x9d, 0x15, 0xf7,
+ 0x46, 0xa0, 0x6, 0x58, 0x90, 0x8c, 0x8c, 0xb9,
+ 0x1a, 0xf7, 0xc9, 0xbc, 0x7, 0xb3, 0x9d, 0x6d,
+ 0x67, 0x93, 0x1f, 0xa0, 0xe3, 0xfb, 0xf2, 0x33,
+ 0xa0, 0x6, 0xaf, 0x93, 0x9d, 0xa9, 0xb3, 0x1b,
+ 0xbc, 0xfb, 0xc9, 0x6, 0x5d, 0x8c, 0x8a, 0x58,
+ 0x86, 0x1e, 0xf7, 0xd9, 0x76, 0x15, 0xf7, 0x17,
+ 0xa0, 0x6, 0x5e, 0x8f, 0x84, 0x8c, 0xba, 0x1a,
+ 0xf7, 0x77, 0x8d, 0x7, 0x13, 0x7c, 0xf7, 0x26,
+ 0xfb, 0xc2, 0x5, 0x96, 0x6, 0xf7, 0x2b, 0xf7,
+ 0xc4, 0x5, 0x8d, 0xfb, 0x79, 0x6, 0x13, 0xbc,
+ 0x5d, 0x8d, 0x8a, 0x57, 0x86, 0x1e, 0x76, 0xf7,
+ 0x46, 0xa0, 0x7, 0x58, 0x90, 0x8c, 0x8c, 0xb9,
+ 0x1a, 0xf7, 0x95, 0x7, 0xad, 0x96, 0x9f, 0xb8,
+ 0x1e, 0x9f, 0xfb, 0x1, 0x7, 0xfb, 0x31, 0xfb,
+ 0xc2, 0xfb, 0x2a, 0xf7, 0xc2, 0x5, 0xfb, 0x13,
+ 0x77, 0x6, 0xa8, 0xa7, 0x76, 0x6c, 0x98, 0x1f,
+ 0xfb, 0x97, 0x7, 0x5c, 0x84, 0x8a, 0x5e, 0x87,
+ 0x1e, 0xe, 0x53, 0xf7, 0x65, 0xc9, 0x4d, 0xe3,
+ 0x1, 0xbe, 0xf7, 0x65, 0x15, 0xf8, 0x8c, 0xc9,
+ 0xfc, 0x8c, 0x6, 0xe, 0x21, 0xfb, 0x61, 0xad,
+ 0xf7, 0x4b, 0x76, 0xf8, 0x34, 0xb5, 0xf1, 0xf7,
+ 0x2c, 0x6d, 0xa9, 0x12, 0x13, 0xe8, 0x9c, 0xf8,
+ 0x2b, 0x15, 0xd6, 0x6, 0x2f, 0xfc, 0x2f, 0x5,
+ 0xfb, 0x19, 0x6d, 0x7e, 0x69, 0x5d, 0x1b, 0x79,
+ 0x8b, 0x91, 0x8e, 0x93, 0x92, 0x8e, 0x90, 0x92,
+ 0x1f, 0x8f, 0x90, 0x8e, 0x91, 0x96, 0x1a, 0xa9,
+ 0x73, 0x9e, 0x6e, 0x80, 0x67, 0x84, 0x59, 0x60,
+ 0xb6, 0x6b, 0xc2, 0xed, 0xdf, 0xf7, 0x13, 0xd5,
+ 0x9c, 0x1e, 0xf1, 0xf8, 0x2f, 0x5, 0xf7, 0x2a,
+ 0x6, 0x46, 0xfb, 0xa1, 0x5, 0x85, 0x74, 0x86,
+ 0x6f, 0x71, 0x1a, 0x65, 0x9b, 0x6b, 0xbc, 0xcc,
+ 0xb5, 0xb3, 0xeb, 0xc8, 0x1e, 0x75, 0x98, 0x5,
+ 0x7f, 0x83, 0x5f, 0x48, 0x74, 0x1b, 0x80, 0x87,
+ 0x94, 0x99, 0xa8, 0x9b, 0xbc, 0x8e, 0x99, 0x1f,
+ 0xd4, 0xf7, 0xaf, 0x5, 0x8a, 0x76, 0xfb, 0x1,
+ 0x82, 0x72, 0x1b, 0xfb, 0xa, 0x6, 0xf7, 0x23,
+ 0xb1, 0xaa, 0xdc, 0xee, 0x1b, 0xa4, 0x8b, 0x7f,
+ 0x86, 0x84, 0x82, 0x85, 0x85, 0x80, 0x1f, 0x87,
+ 0x84, 0x88, 0x83, 0x7f, 0x1a, 0x13, 0xf0, 0x71,
+ 0xa0, 0x6f, 0xb0, 0xa8, 0xa7, 0x9f, 0xb0, 0xc8,
+ 0x48, 0xad, 0x47, 0xfb, 0x4a, 0x5c, 0xfb, 0x1d,
+ 0xfb, 0x9, 0x63, 0x1e, 0x3f, 0x6, 0xe, 0x21,
+ 0xfb, 0x61, 0xae, 0xf7, 0x4a, 0x76, 0xf8, 0x34,
+ 0xb5, 0xf7, 0x76, 0xa8, 0x1, 0x9f, 0xf8, 0x2b,
+ 0x15, 0xd5, 0x6, 0x2f, 0xfc, 0x26, 0x5, 0xfb,
+ 0x3, 0x72, 0x7c, 0x4b, 0x61, 0x1b, 0x7a, 0x85,
+ 0x91, 0x91, 0x91, 0x90, 0x90, 0x8f, 0x92, 0x1f,
+ 0x8f, 0x91, 0x8e, 0x91, 0x96, 0x1a, 0xa5, 0x79,
+ 0x9f, 0x6f, 0x85, 0x5c, 0x8b, 0x57, 0x41, 0xd7,
+ 0x83, 0x9d, 0xf3, 0xd1, 0xba, 0xf7, 0x37, 0xab,
+ 0x1e, 0xee, 0xf8, 0x26, 0x5, 0xf7, 0x27, 0x6,
+ 0x3c, 0xfb, 0xd5, 0x5, 0x89, 0x81, 0x89, 0x80,
+ 0x81, 0x1a, 0x68, 0x9c, 0x6e, 0xc1, 0xd7, 0xb5,
+ 0xcc, 0xd1, 0xb8, 0x1e, 0x77, 0x96, 0x5, 0x7a,
+ 0x80, 0x64, 0x51, 0x72, 0x1b, 0x7d, 0x87, 0x93,
+ 0x95, 0x91, 0x8d, 0x92, 0x8d, 0x91, 0x1f, 0xf7,
+ 0x2b, 0xf8, 0xee, 0x28, 0x7f, 0x5, 0x87, 0x50,
+ 0x9a, 0x6c, 0x1b, 0xfb, 0x45, 0x61, 0xfb, 0x1d,
+ 0xfb, 0xa, 0x66, 0x1f, 0x41, 0x6, 0xf7, 0x53,
+ 0x16, 0xe3, 0xa0, 0xab, 0xf7, 0x1e, 0xe9, 0x1b,
+ 0xa2, 0x96, 0x7e, 0x85, 0x87, 0x84, 0x84, 0x85,
+ 0x81, 0x1f, 0x87, 0x84, 0x87, 0x82, 0x81, 0x1a,
+ 0x73, 0x98, 0x80, 0x93, 0x85, 0x1e, 0x6d, 0xfb,
+ 0xb, 0x5, 0xe, 0x79, 0x9d, 0xf8, 0x54, 0x99,
+ 0xf7, 0x63, 0x9b, 0x98, 0x91, 0x6, 0xfb, 0x62,
+ 0x8d, 0xf7, 0x60, 0x8b, 0xf7, 0x9c, 0x94, 0x7,
+ 0x1e, 0xa0, 0x39, 0x63, 0xff, 0xc, 0x9, 0xb4,
+ 0xa, 0xf7, 0xc, 0xb, 0x8c, 0xc, 0xe, 0xf8,
+ 0x88, 0x14, 0xf9, 0x2a, 0x15, 0xb7, 0x13, 0x0,
+ 0x71, 0x2, 0x0, 0x1, 0x0, 0x29, 0x0, 0x2f,
+ 0x0, 0x3b, 0x0, 0x58, 0x0, 0x61, 0x0, 0x9b,
+ 0x0, 0x9e, 0x0, 0xab, 0x0, 0xb6, 0x0, 0xc3,
+ 0x0, 0xd6, 0x0, 0xda, 0x0, 0xea, 0x0, 0xfb,
+ 0x0, 0xff, 0x1, 0x6, 0x1, 0x10, 0x1, 0x28,
+ 0x1, 0x2e, 0x1, 0x58, 0x1, 0x62, 0x1, 0x76,
+ 0x1, 0x89, 0x1, 0x96, 0x1, 0xa8, 0x1, 0xb5,
+ 0x1, 0xb9, 0x1, 0xf3, 0x1, 0xfd, 0x2, 0xd,
+ 0x2, 0x41, 0x2, 0x4a, 0x2, 0x51, 0x2, 0x5d,
+ 0x2, 0x65, 0x2, 0x73, 0x2, 0x7d, 0x2, 0x86,
+ 0x2, 0x92, 0x2, 0x9e, 0x2, 0xc4, 0x2, 0xcd,
+ 0x2, 0xe0, 0x2, 0xf2, 0x2, 0xfb, 0x3, 0x3,
+ 0x3, 0x9, 0x3, 0x28, 0x3, 0x32, 0x3, 0x3c,
+ 0x3, 0x58, 0x3, 0x60, 0x3, 0x68, 0x3, 0x6d,
+ 0x3, 0x74, 0x3, 0x7b, 0x3, 0x81, 0x3, 0x9a,
+ 0x3, 0x9d, 0x3, 0xa3, 0x3, 0xb0, 0x3, 0xc6,
+ 0x3, 0xdc, 0x3, 0xea, 0x3, 0xee, 0x3, 0xf4,
+ 0x3, 0xfa, 0x4, 0x4, 0x4, 0xb, 0x4, 0x12,
+ 0x4, 0x24, 0x4, 0x32, 0x4, 0x37, 0x4, 0x48,
+ 0x4, 0x53, 0x4, 0x62, 0x4, 0x6c, 0x4, 0x70,
+ 0x4, 0x76, 0x4, 0x7a, 0x4, 0x83, 0x4, 0x8b,
+ 0x4, 0x92, 0x4, 0x97, 0x4, 0x9c, 0x4, 0xa1,
+ 0x4, 0xaf, 0x4, 0xbd, 0x4, 0xc8, 0x4, 0xd5,
+ 0x4, 0xdd, 0x4, 0xe1, 0x4, 0xed, 0x4, 0xf9,
+ 0x4, 0xff, 0x5, 0x9, 0x5, 0x14, 0x5, 0x1d,
+ 0x5, 0x24, 0x5, 0x29, 0x5, 0x33, 0x5, 0x3d,
+ 0x5, 0x47, 0x5, 0x51, 0x5, 0x5a, 0x5, 0x5e,
+ 0x5, 0x67, 0x5, 0x6d, 0x5, 0x73, 0x5, 0x79,
+ 0x5, 0x7f, 0x5, 0x83, 0x5, 0x87, 0x50, 0x1d,
+ 0xf4, 0xc2, 0x1a, 0xd3, 0x47, 0x9d, 0x68, 0xfb,
+ 0x37, 0xfb, 0x13, 0xfb, 0x4b, 0xfb, 0x1c, 0xfb,
+ 0x4, 0xdf, 0x5f, 0x35, 0xa, 0x98, 0xda, 0x9e,
+ 0x8d, 0x8d, 0x3d, 0xa, 0x72, 0x82, 0x57, 0x70,
+ 0x2d, 0xfb, 0x17, 0x68, 0x1f, 0xb, 0x6, 0xf7,
+ 0x2c, 0x21, 0x1d, 0xb, 0x77, 0x1, 0x90, 0xf7,
+ 0x16, 0xf7, 0x3f, 0xe7, 0x3, 0x20, 0xa, 0xb,
+ 0xf7, 0x8, 0xe3, 0x90, 0xa, 0xf7, 0xab, 0x7b,
+ 0x1d, 0x7b, 0x59, 0x40, 0x51, 0xfb, 0xa6, 0x36,
+ 0xa, 0xf7, 0x3c, 0xf7, 0x29, 0xf7, 0x1a, 0xfb,
+ 0xb, 0xa1, 0x4b, 0x1d, 0xb, 0x32, 0x1d, 0x8c,
+ 0xa9, 0x8a, 0x6b, 0x34, 0x1d, 0xb, 0x77, 0x1,
+ 0x4d, 0xa, 0x3, 0xf7, 0x3f, 0xf7, 0x2c, 0x15,
+ 0xe7, 0xe2, 0xf8, 0x29, 0xf7, 0x4c, 0xf3, 0x8c,
+ 0x21, 0x76, 0xfb, 0x8, 0x2d, 0xfc, 0x1a, 0xfb,
+ 0x46, 0x50, 0x5e, 0xaf, 0x55, 0x1d, 0xd2, 0xfb,
+ 0x16, 0xf7, 0x3b, 0xf7, 0x8d, 0xf7, 0x45, 0xf7,
+ 0x9c, 0xf7, 0x56, 0xf7, 0x42, 0xfb, 0x19, 0xd0,
+ 0x5d, 0x1d, 0xfb, 0x79, 0xfb, 0x89, 0x1e, 0xb,
+ 0x22, 0x1d, 0xe, 0xa4, 0x87, 0x80, 0xb6, 0x4f,
+ 0x1b, 0xfb, 0xe, 0xfb, 0x29, 0x2f, 0x1d, 0xb,
+ 0xf7, 0x8c, 0xf7, 0x6, 0x15, 0x8d, 0x8c, 0x5,
+ 0x2e, 0x1d, 0xb, 0x2c, 0x1d, 0x54, 0x4d, 0x8f,
+ 0xa, 0x91, 0x98, 0x31, 0xa, 0x79, 0x86, 0xb,
+ 0x4c, 0xa, 0x60, 0x3a, 0x7c, 0x71, 0xfb, 0x27,
+ 0x8c, 0x19, 0x65, 0xa, 0x93, 0x73, 0x1d, 0x8b,
+ 0x31, 0x1d, 0xb, 0x16, 0x20, 0x1d, 0xb, 0x57,
+ 0xa, 0x4e, 0x90, 0x7c, 0x8f, 0x39, 0x1d, 0x65,
+ 0x50, 0x7b, 0x97, 0x6e, 0x82, 0x19, 0xb, 0x91,
+ 0x9f, 0x1f, 0x44, 0x1d, 0x89, 0xa1, 0x8a, 0x71,
+ 0x51, 0x40, 0xfb, 0x4a, 0x46, 0x47, 0xa, 0xb,
+ 0x15, 0x20, 0x1d, 0xb, 0x68, 0x1d, 0xf7, 0x7f,
+ 0x22, 0xa, 0xb, 0xcc, 0xdb, 0xf7, 0x84, 0xdf,
+ 0x94, 0xa7, 0x39, 0xa, 0xb, 0xab, 0xde, 0xf7,
+ 0xa1, 0x9f, 0xd1, 0x1f, 0xfb, 0xa, 0x6, 0x6c,
+ 0x20, 0x74, 0x3c, 0x5e, 0x3a, 0x8, 0x73, 0x7e,
+ 0x4e, 0x2c, 0x63, 0x1b, 0xb, 0x87, 0x8f, 0x95,
+ 0x24, 0xa, 0xb, 0x15, 0xf7, 0x58, 0xae, 0x6,
+ 0x60, 0x75, 0x98, 0xa1, 0x92, 0x8c, 0x93, 0x8f,
+ 0x91, 0x48, 0x1d, 0x9a, 0x20, 0x8b, 0x95, 0x77,
+ 0x1a, 0x5a, 0x69, 0x84, 0x5e, 0x57, 0xa, 0x4d,
+ 0x91, 0x7d, 0x8e, 0x39, 0x1d, 0x67, 0x50, 0x78,
+ 0x95, 0x6f, 0x84, 0x6b, 0x1d, 0x77, 0x74, 0xa,
+ 0x13, 0x6c, 0x28, 0xa, 0x13, 0x9c, 0xb, 0xcd,
+ 0xf7, 0x0, 0xbf, 0xe2, 0xbe, 0xaa, 0x1e, 0x6e,
+ 0x9c, 0x5, 0x66, 0x72, 0x67, 0x55, 0x55, 0x1b,
+ 0x77, 0x5c, 0xb, 0x2b, 0x57, 0x8b, 0xbf, 0x9f,
+ 0x1e, 0xfb, 0xb, 0xbd, 0x15, 0x2b, 0xd9, 0x54,
+ 0xdd, 0xf7, 0x34, 0xf7, 0x10, 0xb, 0x77, 0x1,
+ 0x88, 0xf7, 0xb, 0xf7, 0x62, 0xf7, 0xb, 0x3,
+ 0x23, 0xa, 0xb, 0x35, 0x1a, 0xfb, 0xc, 0xf7,
+ 0x4, 0x57, 0xf6, 0xf7, 0x65, 0xb4, 0xf7, 0x22,
+ 0xf7, 0x1f, 0xb3, 0x1e, 0xb, 0x84, 0x61, 0x41,
+ 0x45, 0xfb, 0x83, 0x34, 0x7d, 0x6d, 0x96, 0xb9,
+ 0x1e, 0xb, 0xf7, 0x64, 0x2d, 0x1d, 0x15, 0xf7,
+ 0xa, 0xd7, 0xf7, 0x12, 0xf6, 0xd1, 0x5f, 0xc0,
+ 0x42, 0xfb, 0x8, 0x40, 0xfb, 0xc, 0x20, 0x44,
+ 0xb0, 0x51, 0xd8, 0x1f, 0x8e, 0xa5, 0x15, 0x72,
+ 0x83, 0x9c, 0xa1, 0xab, 0xa5, 0xe4, 0x95, 0xae,
+ 0x1f, 0xad, 0x95, 0x9b, 0xd6, 0xb8, 0x1b, 0xa0,
+ 0x97, 0x7b, 0x76, 0x65, 0x70, 0x36, 0x7f, 0x63,
+ 0x1f, 0x68, 0x81, 0x7f, 0x46, 0x5d, 0x1b, 0xb,
+ 0x15, 0x62, 0xa9, 0x7d, 0x1d, 0x6c, 0x69, 0x63,
+ 0x1e, 0xe, 0x8f, 0x9d, 0x1f, 0x92, 0xab, 0x15,
+ 0xd4, 0x9b, 0xbe, 0xf7, 0x22, 0xc9, 0x1b, 0xa8,
+ 0x8b, 0xb, 0x1, 0x80, 0x16, 0xf8, 0x8e, 0x6,
+ 0xc6, 0xf7, 0x56, 0x70, 0x90, 0x5, 0xfb, 0x18,
+ 0x4d, 0xfb, 0x1c, 0x6b, 0x24, 0x1b, 0x45, 0x6,
+ 0xf8, 0x46, 0xf8, 0xe7, 0x5, 0xb2, 0xfc, 0x68,
+ 0x7, 0x52, 0xfb, 0x46, 0xa7, 0x87, 0x5, 0xcd,
+ 0xba, 0xc8, 0xdc, 0xf7, 0x24, 0x1b, 0xd9, 0x6,
+ 0xfc, 0x46, 0xfc, 0xe7, 0x5, 0xb, 0x48, 0x1d,
+ 0x9b, 0x21, 0x8a, 0x94, 0x77, 0x1a, 0xb, 0x49,
+ 0xa, 0x13, 0xe8, 0x62, 0x6e, 0xb, 0x1f, 0xf7,
+ 0x14, 0xf8, 0x5b, 0x9c, 0xca, 0xa6, 0x8f, 0x56,
+ 0x1d, 0xb, 0x5b, 0xa, 0xe8, 0xe3, 0x2e, 0x3b,
+ 0x1d, 0xb, 0x6b, 0x1a, 0xfb, 0x19, 0xfc, 0x79,
+ 0x7a, 0x4d, 0x74, 0x88, 0x63, 0x84, 0x19, 0xb,
+ 0xaf, 0x9f, 0xcc, 0x99, 0xba, 0x1f, 0xd2, 0xf7,
+ 0x80, 0xb, 0x35, 0x1d, 0x53, 0x4b, 0x4c, 0x70,
+ 0x79, 0x7d, 0xb, 0x41, 0xa, 0xc7, 0x9a, 0x7e,
+ 0x79, 0x7f, 0x86, 0x7d, 0x47, 0x1d, 0xe, 0x1a,
+ 0x74, 0x8b, 0x54, 0xd8, 0xd7, 0xb5, 0xc5, 0xf5,
+ 0xd7, 0x1e, 0xb, 0xa7, 0xe3, 0x5, 0xb7, 0x6,
+ 0x9c, 0xc8, 0x5, 0x5e, 0x6, 0xd9, 0xf7, 0x99,
+ 0x5, 0x5d, 0x6, 0xfb, 0xaa, 0xfb, 0x93, 0x5,
+ 0xa7, 0x85, 0x15, 0xf7, 0x48, 0xf7, 0x3a, 0x8d,
+ 0x89, 0x5, 0x8c, 0x6, 0x58, 0xfb, 0x38, 0x5,
+ 0xb, 0x75, 0xa, 0xde, 0x62, 0x1d, 0x9b, 0x70,
+ 0x1e, 0xb, 0xa0, 0x1e, 0xbd, 0xaf, 0xdc, 0xc7,
+ 0xbd, 0xaf, 0x8, 0x94, 0x7, 0x55, 0xc2, 0x52,
+ 0xc5, 0x5a, 0xc0, 0x8, 0xb, 0x67, 0xa8, 0x6e,
+ 0xaf, 0xaf, 0xa8, 0xa8, 0xaf, 0xaf, 0x6e, 0xa8,
+ 0x67, 0x67, 0x6e, 0x6e, 0x67, 0x1e, 0xb, 0x1f,
+ 0xa7, 0x86, 0xd5, 0xf7, 0xa5, 0x6f, 0x8f, 0xb,
+ 0xa6, 0xf7, 0x24, 0xf8, 0xc, 0xf7, 0x24, 0xb,
+ 0xf7, 0x42, 0x5, 0x3a, 0x6, 0xb, 0x1a, 0xd8,
+ 0x57, 0x8d, 0x73, 0x34, 0x55, 0x38, 0x21, 0x43,
+ 0x1e, 0x88, 0x8d, 0xc7, 0xf7, 0x4e, 0x5, 0x79,
+ 0x3c, 0x28, 0x82, 0x75, 0x1b, 0x70, 0x7, 0xa6,
+ 0xa6, 0x8b, 0x71, 0x1f, 0xb, 0x15, 0xb3, 0x6,
+ 0x9e, 0x93, 0x94, 0xa3, 0xac, 0x1b, 0xb, 0x90,
+ 0x8b, 0xab, 0xf7, 0xc6, 0xab, 0xf7, 0x9f, 0xab,
+ 0xb, 0xc4, 0x1a, 0xba, 0x65, 0xc0, 0x47, 0x36,
+ 0x60, 0x4d, 0x67, 0x79, 0x1e, 0x9d, 0x80, 0x5,
+ 0x94, 0x94, 0xa5, 0xb2, 0xba, 0x1b, 0xc6, 0x8b,
+ 0x52, 0x7f, 0x67, 0x6a, 0xb, 0xac, 0x62, 0x60,
+ 0x6c, 0x69, 0x63, 0x1e, 0xe, 0x1a, 0x53, 0x28,
+ 0x58, 0x78, 0x81, 0x1e, 0xb, 0xbd, 0x96, 0x57,
+ 0x1d, 0xb, 0x90, 0x8b, 0xae, 0xf7, 0x41, 0xb3,
+ 0xb, 0x1e, 0x68, 0xf7, 0xc4, 0xae, 0x7, 0xb,
+ 0x8b, 0xae, 0xf8, 0xeb, 0xae, 0xb, 0xf7, 0x95,
+ 0xfc, 0xb9, 0x5, 0xa7, 0x6, 0xf7, 0x23, 0xf8,
+ 0x8e, 0xb2, 0xf7, 0x1e, 0x95, 0x83, 0xc0, 0x98,
+ 0x19, 0xae, 0xfb, 0x65, 0x68, 0x7, 0xb, 0x21,
+ 0xa, 0xe, 0x15, 0xc4, 0x6, 0xf7, 0x17, 0xb,
+ 0x7e, 0xa3, 0x5, 0x7c, 0x87, 0xfb, 0x44, 0x38,
+ 0xfb, 0x19, 0x1a, 0x3b, 0xb, 0xf7, 0x3b, 0x1a,
+ 0xf7, 0x48, 0xfb, 0x6, 0xed, 0xfb, 0x4f, 0x1e,
+ 0xfb, 0xb6, 0x68, 0x6, 0xc9, 0x82, 0x96, 0x89,
+ 0x6a, 0x1a, 0xb, 0x50, 0x1e, 0xbb, 0x16, 0xab,
+ 0xa5, 0xa5, 0xab, 0xab, 0xa5, 0x71, 0x6b, 0x6b,
+ 0x71, 0x71, 0x6b, 0x6b, 0x71, 0xa5, 0xab, 0x1e,
+ 0xb, 0xdc, 0xaf, 0x1a, 0x94, 0x87, 0x8e, 0x86,
+ 0x79, 0x61, 0x61, 0x7c, 0x6c, 0xa, 0xb, 0x4c,
+ 0x1d, 0x78, 0x1d, 0xae, 0xfb, 0xbe, 0x68, 0x7,
+ 0xb, 0x76, 0xf7, 0xd0, 0x77, 0x12, 0xb, 0x5c,
+ 0xa, 0xc3, 0x7b, 0xa6, 0xb4, 0xab, 0xab, 0xb5,
+ 0xb, 0x21, 0x82, 0xd3, 0xf8, 0x16, 0x77, 0xb,
+ 0xc8, 0xf7, 0x73, 0x5, 0xa7, 0x93, 0xb, 0x6f,
+ 0xa1, 0x75, 0xa7, 0xa7, 0xa1, 0xa1, 0xa7, 0xa7,
+ 0x75, 0xa1, 0x6f, 0x6f, 0x75, 0x75, 0x6f, 0x1e,
+ 0xb, 0x66, 0xa8, 0x6e, 0xb0, 0xb0, 0xa9, 0xa8,
+ 0x36, 0x1d, 0x6e, 0x6d, 0x66, 0x1e, 0xb, 0xfb,
+ 0xa5, 0x58, 0xa, 0xb, 0x9e, 0x9c, 0x9e, 0xa2,
+ 0xb4, 0x1b, 0xb3, 0x98, 0x6e, 0x74, 0x4c, 0x2f,
+ 0x7a, 0x6e, 0x86, 0x1f, 0xb, 0xf7, 0x52, 0xf7,
+ 0x95, 0x90, 0x1d, 0xb6, 0x93, 0x57, 0x1d, 0xb,
+ 0x7c, 0x59, 0xfb, 0x2c, 0x67, 0xfb, 0x6, 0x1f,
+ 0x65, 0x7b, 0x68, 0x8a, 0x73, 0x1b, 0xe, 0x76,
+ 0x1e, 0x59, 0x67, 0x3a, 0x4f, 0x59, 0x67, 0x8,
+ 0xb, 0x19, 0x70, 0x7, 0xb, 0xa8, 0xf7, 0x81,
+ 0x5c, 0x1d, 0xb, 0x5, 0x89, 0x6, 0xb, 0x15,
+ 0x50, 0x49, 0x34, 0x3a, 0x67, 0x1a, 0x82, 0xb,
+ 0x6f, 0x80, 0x60, 0x62, 0x77, 0x88, 0x1d, 0xb,
+ 0xc7, 0x79, 0xc3, 0xf8, 0xe8, 0xae, 0xb, 0xf7,
+ 0x7f, 0x77, 0x1, 0xb, 0x12, 0x76, 0xf7, 0xf,
+ 0xb, 0x9a, 0x8f, 0xf7, 0x44, 0xb, 0x1b, 0xd7,
+ 0xaa, 0xc3, 0xac, 0xb4, 0x67, 0x98, 0x79, 0x6f,
+ 0x76, 0x70, 0x74, 0xb, 0x91, 0xa0, 0x1f, 0xfb,
+ 0x80, 0xfb, 0x12, 0x15, 0xf7, 0xb2, 0x6, 0xf7,
+ 0xd2, 0xb, 0x85, 0x83, 0xa, 0xf7, 0xe8, 0xe3,
+ 0xf0, 0xbd, 0xa4, 0x1b, 0xb, 0xa2, 0xf7, 0x2d,
+ 0x5, 0x6e, 0x6, 0x7a, 0x81, 0x88, 0x87, 0x7c,
+ 0x1b, 0xb, 0x1a, 0x67, 0x62, 0x3c, 0x5f, 0x36,
+ 0x1e, 0xb, 0x15, 0xb8, 0x6, 0xb, 0x8b, 0xf7,
+ 0x19, 0x7c, 0x1e, 0x70, 0x8e, 0x75, 0xfb, 0x3a,
+ 0x5, 0xb, 0x8d, 0x93, 0x94, 0x8d, 0x99, 0x1b,
+ 0xb9, 0x8b, 0x6b, 0x87, 0x71, 0xb, 0x1f, 0xc8,
+ 0xf7, 0x7b, 0x5, 0xb, 0x3c, 0x7c, 0x59, 0x83,
+ 0x3b, 0x84, 0x6d, 0xa, 0xa9, 0xb, 0xf7, 0xad,
+ 0xf7, 0xe3, 0x18, 0x95, 0xfb, 0xcc, 0x7, 0x60,
+ 0xb, 0xfb, 0x32, 0x15, 0x98, 0x73, 0x5, 0x75,
+ 0xa, 0xb, 0x19, 0xae, 0xfb, 0xd1, 0x68, 0x7,
+ 0xb, 0x16, 0xf7, 0xd, 0x6, 0xb, 0xfb, 0xdd,
+ 0xfb, 0x32, 0x76, 0xf9, 0xf4, 0x77, 0x1, 0xb,
+ 0x93, 0x7e, 0x15, 0x9c, 0x90, 0x9f, 0x8e, 0x8f,
+ 0x1b, 0xb, 0x92, 0x95, 0x75, 0x1f, 0x75, 0x6a,
+ 0x5, 0x84, 0x9c, 0xb, 0x8b, 0x69, 0x1b, 0x66,
+ 0xf7, 0x8d, 0xb0, 0x7, 0x68, 0xb, 0x72, 0x58,
+ 0xfb, 0x39, 0x58, 0xfb, 0x53, 0x1e, 0xb, 0x76,
+ 0x54, 0xa, 0xb, 0xfb, 0xce, 0xfb, 0x3a, 0x76,
+ 0xf9, 0xfd, 0x77, 0xb, 0x1a, 0x87, 0x8a, 0x86,
+ 0x8a, 0xb, 0x15, 0xf7, 0x74, 0x9e, 0x6, 0xb,
+ 0xf7, 0x40, 0x5, 0xc6, 0xcd, 0xb, 0xf7, 0x1a,
+ 0xd5, 0xf7, 0x1a, 0xb, 0x74, 0x88, 0x1d, 0xb,
+ 0x15, 0xcb, 0xbd, 0xb
+ };
diff --git a/core/src/fxge/fontdata/chromefontdata/FoxitSerifItalic.c b/core/src/fxge/fontdata/chromefontdata/FoxitSerifItalic.c
new file mode 100644
index 0000000000..26f7784c60
--- /dev/null
+++ b/core/src/fxge/fontdata/chromefontdata/FoxitSerifItalic.c
@@ -0,0 +1,2662 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+const unsigned char g_FoxitSerifItalicFontData [21227] = {0x1,
+ 0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0x15,
+ 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x72,
+ 0x69, 0x66, 0x4f, 0x54, 0x46, 0x2d, 0x49, 0x74,
+ 0x61, 0x6c, 0x69, 0x63, 0x0, 0x1, 0x1, 0x1,
+ 0x2a, 0xf8, 0x10, 0x0, 0xf8, 0x1c, 0x1, 0xf8,
+ 0x1d, 0x2, 0xf8, 0x1e, 0x3, 0xf8, 0x18, 0x4,
+ 0x1e, 0xe1, 0x5a, 0x4f, 0xc, 0x2, 0xfb, 0x3c,
+ 0xfb, 0x8e, 0xfa, 0x71, 0xf9, 0xf8, 0x5, 0xf7,
+ 0x3c, 0xf, 0xf8, 0x93, 0x11, 0xb0, 0x1c, 0x46,
+ 0xd6, 0x12, 0x0, 0x4, 0x1, 0x1, 0x5, 0x2f,
+ 0x45, 0x54, 0x45, 0x75, 0x72, 0x6f, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x20, 0x53, 0x65,
+ 0x72, 0x69, 0x66, 0x20, 0x4f, 0x54, 0x46, 0x20,
+ 0x49, 0x74, 0x61, 0x6c, 0x69, 0x63, 0x43, 0x68,
+ 0x72, 0x6F, 0x6D, 0x20, 0x53, 0x65, 0x72, 0x69,
+ 0x66, 0x20, 0x4f, 0x54, 0x46, 0x0, 0x0, 0x1,
+ 0x0, 0x1, 0x6, 0x0, 0x68, 0x0, 0x0, 0x9,
+ 0x37, 0x0, 0x7c, 0x0, 0x0, 0x42, 0x20, 0x0,
+ 0x67, 0x0, 0x0, 0x64, 0x0, 0x0, 0xa0, 0x0,
+ 0x0, 0x66, 0x0, 0x0, 0x83, 0x0, 0x0, 0xaa,
+ 0x0, 0x0, 0x8b, 0x0, 0x0, 0x6a, 0x0, 0x0,
+ 0x97, 0x0, 0x0, 0xa5, 0x0, 0x0, 0x80, 0x0,
+ 0x0, 0xa1, 0x0, 0x0, 0x9c, 0x0, 0x0, 0xa4,
+ 0x0, 0x0, 0xa9, 0x0, 0x0, 0x7d, 0x0, 0x0,
+ 0x98, 0x0, 0x0, 0x73, 0x0, 0x0, 0x72, 0x0,
+ 0x0, 0x85, 0x0, 0x0, 0x96, 0x0, 0x0, 0x8f,
+ 0x0, 0x0, 0x78, 0x0, 0x0, 0x9e, 0x0, 0x0,
+ 0x9b, 0x0, 0x0, 0xa3, 0x0, 0x0, 0x7b, 0x0,
+ 0x0, 0xae, 0x0, 0x0, 0xab, 0x1, 0x0, 0xb0,
+ 0x0, 0x0, 0xad, 0x0, 0x0, 0xaf, 0x0, 0x0,
+ 0x8a, 0x0, 0x0, 0xb1, 0x0, 0x0, 0xb5, 0x0,
+ 0x0, 0xb2, 0x2, 0x0, 0xb9, 0x0, 0x0, 0xb6,
+ 0x2, 0x0, 0x9a, 0x0, 0x0, 0xba, 0x0, 0x0,
+ 0xbe, 0x0, 0x0, 0xbb, 0x1, 0x0, 0xbf, 0x0,
+ 0x0, 0xbd, 0x0, 0x0, 0xa8, 0x0, 0x0, 0x8d,
+ 0x0, 0x0, 0xc4, 0x0, 0x0, 0xc1, 0x2, 0x0,
+ 0xc5, 0x0, 0x0, 0x9d, 0x0, 0x0, 0x95, 0x0,
+ 0x0, 0xcb, 0x0, 0x0, 0xc8, 0x1, 0x0, 0xcd,
+ 0x0, 0x0, 0xca, 0x0, 0x0, 0xcc, 0x0, 0x0,
+ 0x90, 0x0, 0x0, 0xce, 0x0, 0x0, 0xd2, 0x0,
+ 0x0, 0xcf, 0x2, 0x0, 0xd6, 0x0, 0x0, 0xd3,
+ 0x2, 0x0, 0xa7, 0x0, 0x0, 0xd7, 0x0, 0x0,
+ 0xdb, 0x0, 0x0, 0xd8, 0x1, 0x0, 0xdc, 0x0,
+ 0x0, 0xda, 0x0, 0x0, 0x9f, 0x0, 0x0, 0x93,
+ 0x0, 0x0, 0xe1, 0x0, 0x0, 0xde, 0x2, 0x0,
+ 0xe2, 0x0, 0x0, 0xa2, 0x0, 0x0, 0xe3, 0x0,
+ 0x0, 0x91, 0x0, 0x0, 0x8c, 0x0, 0x0, 0x92,
+ 0x0, 0x0, 0x8e, 0x0, 0x0, 0x94, 0x0, 0x0,
+ 0xc0, 0x0, 0x0, 0xdd, 0x0, 0x0, 0xc6, 0x1,
+ 0x0, 0xe4, 0x0, 0x0, 0x65, 0x0, 0x0, 0x7e,
+ 0x0, 0x0, 0x88, 0x0, 0x0, 0x81, 0x1, 0x0,
+ 0x84, 0x0, 0x0, 0x87, 0x0, 0x0, 0x7f, 0x0,
+ 0x0, 0x86, 0x0, 0x0, 0x6f, 0x0, 0x0, 0x89,
+ 0x0, 0x0, 0x41, 0x0, 0x0, 0x8, 0x0, 0x0,
+ 0x75, 0x0, 0x0, 0x69, 0x0, 0x0, 0x77, 0x0,
+ 0x0, 0x76, 0x0, 0x0, 0x70, 0x1, 0x0, 0x74,
+ 0x0, 0x0, 0x79, 0x1, 0x0, 0x6b, 0x1, 0x0,
+ 0x63, 0x0, 0x1, 0x87, 0x0, 0x0, 0x99, 0x0,
+ 0x0, 0xa6, 0x0, 0x0, 0x6d, 0x1, 0x0, 0xe6,
+ 0x2, 0x0, 0x1, 0x0, 0x3, 0x0, 0x5, 0x0,
+ 0x4a, 0x0, 0x82, 0x0, 0xf8, 0x1, 0x8c, 0x1,
+ 0xb7, 0x2, 0x73, 0x2, 0xa0, 0x2, 0xd9, 0x3,
+ 0x17, 0x3, 0xed, 0x4, 0x1a, 0x4, 0x49, 0x4,
+ 0x60, 0x4, 0x6d, 0x4, 0x88, 0x4, 0xcf, 0x5,
+ 0x1d, 0x5, 0x70, 0x5, 0xe3, 0x6, 0x2a, 0x6,
+ 0x7a, 0x6, 0xd3, 0x6, 0xff, 0x7, 0x7d, 0x7,
+ 0xe1, 0x7, 0xfe, 0x8, 0x46, 0x8, 0x71, 0x8,
+ 0x95, 0x8, 0xb5, 0x9, 0x2c, 0x9, 0xe6, 0xa,
+ 0x2e, 0xa, 0xb6, 0xa, 0xe4, 0xb, 0x2e, 0xb,
+ 0x8c, 0xb, 0xf5, 0xc, 0x6e, 0xc, 0xf7, 0xd,
+ 0x30, 0xd, 0x87, 0xe, 0xb, 0xe, 0x3a, 0xe,
+ 0xb5, 0xf, 0x1f, 0xf, 0x62, 0xf, 0xc8, 0x10,
+ 0x4c, 0x10, 0xc6, 0x11, 0x2, 0x11, 0x4d, 0x11,
+ 0xa6, 0x11, 0xf6, 0x12, 0x75, 0x12, 0xf6, 0x13,
+ 0x4f, 0x13, 0x59, 0x13, 0x85, 0x13, 0xa3, 0x13,
+ 0xd2, 0x13, 0xf9, 0x14, 0xa, 0x14, 0x26, 0x14,
+ 0x63, 0x14, 0xd3, 0x15, 0x11, 0x15, 0x9e, 0x15,
+ 0xea, 0x16, 0x6e, 0x17, 0x1a, 0x17, 0x8e, 0x17,
+ 0xc6, 0x18, 0x33, 0x18, 0xa9, 0x18, 0xe1, 0x19,
+ 0x85, 0x19, 0xab, 0x19, 0xea, 0x1a, 0x2a, 0x1a,
+ 0x95, 0x1a, 0xf1, 0x1b, 0x53, 0x1b, 0xb1, 0x1b,
+ 0xef, 0x1c, 0x56, 0x1c, 0xf1, 0x1d, 0x95, 0x1d,
+ 0xd7, 0x1e, 0x19, 0x1e, 0x75, 0x1e, 0x8b, 0x1e,
+ 0xe9, 0x1f, 0x36, 0x1f, 0x81, 0x1f, 0xf7, 0x20,
+ 0x99, 0x21, 0xc, 0x21, 0xa1, 0x21, 0xc0, 0x22,
+ 0x97, 0x22, 0xa5, 0x23, 0x4c, 0x23, 0xc3, 0x24,
+ 0x4, 0x24, 0x25, 0x25, 0x13, 0x25, 0x2a, 0x25,
+ 0x62, 0x25, 0x9a, 0x25, 0xb6, 0x25, 0xfd, 0x26,
+ 0x1c, 0x26, 0x98, 0x26, 0xd0, 0x26, 0xdf, 0x27,
+ 0x21, 0x27, 0x73, 0x27, 0xb1, 0x27, 0xc4, 0x28,
+ 0x1c, 0x28, 0x88, 0x28, 0xd1, 0x29, 0x31, 0x29,
+ 0x65, 0x29, 0x8c, 0x29, 0xc3, 0x29, 0xfd, 0x2a,
+ 0x29, 0x2a, 0x89, 0x2b, 0x2f, 0x2b, 0x91, 0x2b,
+ 0xd0, 0x2b, 0xf3, 0x2c, 0x12, 0x2c, 0x33, 0x2c,
+ 0x40, 0x2c, 0x5e, 0x2c, 0x74, 0x2c, 0x89, 0x2c,
+ 0xec, 0x2d, 0x85, 0x2d, 0x96, 0x2d, 0xa9, 0x2d,
+ 0xc2, 0x2d, 0xfd, 0x2e, 0x1f, 0x2e, 0x61, 0x2e,
+ 0xdd, 0x2f, 0x5, 0x2f, 0x1c, 0x2f, 0x2f, 0x2f,
+ 0x5c, 0x2f, 0xc8, 0x30, 0x43, 0x30, 0xfb, 0x31,
+ 0x9, 0x31, 0x1b, 0x31, 0x35, 0x31, 0x5d, 0x31,
+ 0x74, 0x31, 0xbd, 0x32, 0x62, 0x32, 0xd5, 0x32,
+ 0xf4, 0x33, 0x2c, 0x33, 0x50, 0x33, 0x73, 0x33,
+ 0x92, 0x33, 0xaf, 0x33, 0xbe, 0x33, 0xdb, 0x34,
+ 0x4f, 0x34, 0x8b, 0x34, 0xa6, 0x34, 0xc0, 0x34,
+ 0xda, 0x35, 0x13, 0x35, 0x33, 0x35, 0x64, 0x35,
+ 0xd5, 0x35, 0xf0, 0x35, 0xfe, 0x36, 0x24, 0x36,
+ 0x49, 0x36, 0x95, 0x36, 0xe0, 0x37, 0x3e, 0x37,
+ 0x54, 0x37, 0x93, 0x37, 0xdd, 0x38, 0x99, 0x39,
+ 0x38, 0x39, 0x7d, 0x39, 0xe5, 0x3a, 0x66, 0x3a,
+ 0x78, 0x3a, 0xc8, 0x3b, 0x4c, 0x3b, 0x67, 0x3b,
+ 0x83, 0x3b, 0xad, 0x3b, 0xbd, 0x3c, 0xf, 0x3c,
+ 0x41, 0x3c, 0x5e, 0x3c, 0x7e, 0x3c, 0x92, 0x3c,
+ 0xa8, 0x3c, 0xcd, 0x3c, 0xfd, 0x3d, 0x1e, 0x3d,
+ 0x60, 0x3d, 0x99, 0x3d, 0xd2, 0x3e, 0x75, 0x3f,
+ 0x4e, 0x3f, 0x7a, 0x3f, 0xb5, 0x3f, 0xed, 0x40,
+ 0xb, 0x40, 0x27, 0x40, 0x3c, 0x40, 0xba, 0x41,
+ 0x60, 0x41, 0x6d, 0x42, 0x36, 0x43, 0x7, 0x20,
+ 0xe, 0x20, 0xe, 0x73, 0x8e, 0xf4, 0xf8, 0xc3,
+ 0x77, 0x12, 0xb2, 0xf4, 0x17, 0xf7, 0xc, 0xf7,
+ 0x49, 0x15, 0x9c, 0x87, 0xc5, 0xf7, 0x32, 0xbe,
+ 0xf7, 0x8, 0xb7, 0xf7, 0x10, 0x19, 0x92, 0x9f,
+ 0x90, 0x9b, 0x9a, 0x1a, 0xa6, 0x6e, 0x99, 0x7c,
+ 0x1e, 0x13, 0xa0, 0x71, 0x77, 0x6d, 0x64, 0x82,
+ 0x1f, 0x6f, 0xfb, 0x10, 0x76, 0xfb, 0x18, 0x69,
+ 0xfb, 0x35, 0x8, 0x3a, 0xfb, 0x20, 0x15, 0x6e,
+ 0xa2, 0x85, 0xa, 0x74, 0x73, 0x6e, 0x1e, 0xe,
+ 0xca, 0xf8, 0x4e, 0x76, 0xf7, 0x89, 0x77, 0x1,
+ 0xf7, 0x24, 0xa0, 0xf7, 0x32, 0xa0, 0x3, 0xf7,
+ 0xd7, 0xf8, 0x39, 0x15, 0xa0, 0x6, 0xa8, 0xd0,
+ 0xc6, 0xf6, 0xac, 0x1a, 0x9c, 0x7f, 0x9e, 0x76,
+ 0x77, 0x71, 0xbc, 0xa, 0xfb, 0x47, 0x16, 0xa0,
+ 0x6, 0xa7, 0xcc, 0xc1, 0xee, 0xbb, 0x1a, 0x9a,
+ 0x81, 0x9d, 0x7a, 0x72, 0x76, 0xbc, 0xa, 0xe,
+ 0xa0, 0x76, 0xf7, 0x5f, 0xb2, 0x64, 0xc1, 0xf7,
+ 0x2d, 0xc1, 0x63, 0xb3, 0xf7, 0x68, 0x77, 0x12,
+ 0xe9, 0xf8, 0x64, 0x13, 0xb6, 0x9c, 0x16, 0xb3,
+ 0x6, 0xd6, 0xf7, 0x5f, 0x5, 0xf7, 0x42, 0x6,
+ 0x40, 0xfb, 0x5f, 0x5, 0xb2, 0x6, 0xd7, 0xf7,
+ 0x5f, 0x5, 0xf4, 0x6, 0x13, 0xce, 0x96, 0xb2,
+ 0x5, 0x26, 0x6, 0xce, 0xf7, 0x4a, 0x5, 0xf0,
+ 0x6, 0x96, 0xb3, 0x5, 0x2b, 0x6, 0xdb, 0xf7,
+ 0x68, 0x5, 0x62, 0x6, 0x3b, 0xfb, 0x68, 0x5,
+ 0xfb, 0x41, 0x6, 0xda, 0xf7, 0x68, 0x5, 0x66,
+ 0x6, 0x3b, 0xfb, 0x68, 0x5, 0x22, 0x6, 0x80,
+ 0x63, 0x5, 0xee, 0x6, 0x49, 0xfb, 0x4a, 0x5,
+ 0x2b, 0x6, 0x80, 0x64, 0x5, 0xe7, 0x6, 0xc1,
+ 0xb2, 0x15, 0xce, 0xf7, 0x4a, 0x5, 0xf7, 0x42,
+ 0x6, 0x47, 0xfb, 0x4a, 0x5, 0xe, 0x47, 0x76,
+ 0xf5, 0x76, 0xa4, 0x76, 0xf9, 0x15, 0xa6, 0xb9,
+ 0x77, 0x12, 0xa2, 0xd9, 0xf7, 0xab, 0xd6, 0x13,
+ 0xde, 0xf7, 0xae, 0xf8, 0x38, 0x15, 0x61, 0xa9,
+ 0x64, 0xab, 0xc1, 0x1a, 0xd5, 0xc5, 0xaa, 0xd8,
+ 0x1e, 0xfb, 0x7, 0xfc, 0xfc, 0x15, 0xcf, 0xf7,
+ 0xad, 0x5, 0xc2, 0x5d, 0xaf, 0x6d, 0x48, 0x1a,
+ 0xfb, 0x14, 0xfb, 0x14, 0x81, 0x6c, 0x1e, 0xfb,
+ 0x52, 0xb5, 0x15, 0x97, 0x80, 0xbf, 0x65, 0xe1,
+ 0x7b, 0x75, 0x30, 0x18, 0xae, 0x6, 0x13, 0xbe,
+ 0xa0, 0xe4, 0x5, 0x13, 0x5e, 0xf7, 0x56, 0xb9,
+ 0xf6, 0xe4, 0xdb, 0x5e, 0xb9, 0x2a, 0xd5, 0x1f,
+ 0xc3, 0xf7, 0x81, 0x5, 0xad, 0x7d, 0xbe, 0x76,
+ 0x29, 0x1a, 0x9a, 0x89, 0xa7, 0xf7, 0x6, 0x60,
+ 0xaa, 0x50, 0x9b, 0x78, 0x8f, 0x19, 0x9b, 0xcf,
+ 0x5, 0x69, 0x6, 0x7a, 0x4c, 0x5, 0x13, 0x44,
+ 0xfb, 0xe, 0x2b, 0x58, 0xfb, 0x0, 0x44, 0xcc,
+ 0x4d, 0xd1, 0x5c, 0x1f, 0x46, 0xfb, 0xbd, 0x2a,
+ 0xa1, 0x82, 0xcc, 0x82, 0xd5, 0x19, 0x7b, 0x88,
+ 0x5, 0xe, 0xf8, 0x70, 0xb0, 0xa, 0xd5, 0xd0,
+ 0xa, 0xf7, 0x1e, 0xd0, 0xa, 0x13, 0xb7, 0x80,
+ 0xf8, 0x97, 0xf7, 0x9, 0x30, 0xa, 0xfc, 0x8b,
+ 0xf8, 0x11, 0x30, 0xa, 0x13, 0x6f, 0x80, 0x54,
+ 0xfc, 0x33, 0x15, 0xba, 0x6, 0xf9, 0x48, 0xf9,
+ 0x48, 0x5, 0x5c, 0x6, 0xe, 0xf8, 0x39, 0x79,
+ 0xbc, 0x5b, 0xbc, 0xf8, 0x1, 0xaa, 0xf7, 0x62,
+ 0xab, 0x12, 0xd7, 0xe9, 0xf7, 0x2e, 0xdc, 0xf7,
+ 0x4, 0xd0, 0x13, 0x7e, 0xf8, 0x5d, 0xc8, 0x15,
+ 0x13, 0xbe, 0x6d, 0xa3, 0xb3, 0x5a, 0xd5, 0x1b,
+ 0xbe, 0xb6, 0xa5, 0xb5, 0xad, 0x1f, 0x80, 0x96,
+ 0x5, 0x7f, 0x7b, 0x76, 0x79, 0x69, 0x1b, 0x62,
+ 0x60, 0xa6, 0xce, 0x66, 0x1f, 0xc2, 0xd2, 0xa8,
+ 0xbe, 0x9a, 0x9f, 0x8, 0xb0, 0xa6, 0x9f, 0xa8,
+ 0xbc, 0x1b, 0x9c, 0xfb, 0x4d, 0x78, 0x7, 0xaa,
+ 0x95, 0x7b, 0x70, 0x61, 0x71, 0x6a, 0x5f, 0x56,
+ 0x1f, 0x60, 0xcd, 0x6b, 0xf7, 0xb, 0x7f, 0xbf,
+ 0x8, 0xc7, 0xa9, 0xf7, 0x4, 0xc3, 0xe6, 0x1a,
+ 0xbb, 0x61, 0xb7, 0x50, 0x30, 0x45, 0x3b, 0xfb,
+ 0x11, 0x7e, 0x8c, 0x82, 0x91, 0x4e, 0x1e, 0xfb,
+ 0x17, 0x52, 0xfb, 0x10, 0x55, 0xfb, 0x15, 0x1a,
+ 0xfb, 0x1a, 0xf7, 0x14, 0x75, 0xbd, 0xdb, 0xb3,
+ 0xa5, 0xc0, 0xde, 0x1e, 0x78, 0xa8, 0x15, 0x61,
+ 0x5d, 0x52, 0x7d, 0x68, 0x1b, 0x48, 0x4c, 0xba,
+ 0xe1, 0xf7, 0x9, 0xf7, 0x36, 0xc8, 0x8c, 0x1f,
+ 0x9f, 0x45, 0xb2, 0xfb, 0x13, 0xb9, 0x51, 0x8,
+ 0x6f, 0xf7, 0xe6, 0x15, 0x88, 0xa5, 0x89, 0x9c,
+ 0xaf, 0x1a, 0xc2, 0x94, 0xd3, 0xc4, 0x9b, 0xa9,
+ 0x8b, 0x53, 0x38, 0x5c, 0x6e, 0x4f, 0x65, 0x1e,
+ 0xe, 0xfb, 0x23, 0xf8, 0x4e, 0x76, 0xf7, 0x89,
+ 0x77, 0x1, 0xf7, 0x18, 0xa0, 0x3, 0xf7, 0x18,
+ 0xf8, 0x39, 0x15, 0xa0, 0x6, 0xb4, 0xe3, 0xba,
+ 0xe5, 0xa8, 0x1a, 0x9c, 0x80, 0xa0, 0x75, 0x77,
+ 0x71, 0x7e, 0x72, 0x84, 0x1e, 0x82, 0x6b, 0x82,
+ 0xfb, 0xc, 0x86, 0x54, 0x8, 0xe, 0x73, 0xfb,
+ 0x34, 0x76, 0xf9, 0xe6, 0x77, 0x1, 0xb5, 0xd2,
+ 0x3, 0xf7, 0x21, 0xfb, 0x49, 0x15, 0x9d, 0x91,
+ 0x5, 0x4c, 0xf7, 0x9, 0x9c, 0xf7, 0x53, 0xc4,
+ 0x1a, 0xf7, 0x21, 0xeb, 0xf7, 0x7c, 0xf5, 0xe6,
+ 0x1e, 0x7e, 0x9a, 0x5, 0xfb, 0x4a, 0xfb, 0x2f,
+ 0x3d, 0xfb, 0x30, 0xfb, 0x39, 0x1a, 0x4b, 0x90,
+ 0xfb, 0x2a, 0xe9, 0xfb, 0x34, 0x1e, 0xe, 0x73,
+ 0xfb, 0x36, 0x76, 0xf9, 0xe8, 0x77, 0x12, 0xf7,
+ 0x6d, 0xd3, 0x17, 0x9b, 0xfb, 0x39, 0x15, 0x98,
+ 0x7c, 0x5, 0x13, 0x60, 0xf7, 0x28, 0xf7, 0xb,
+ 0xf7, 0x4, 0xf7, 0x3a, 0xf7, 0x51, 0x1a, 0xf7,
+ 0x16, 0x70, 0xf7, 0x14, 0x43, 0xf7, 0x9, 0x1e,
+ 0x78, 0x86, 0xbd, 0x2b, 0x98, 0xfb, 0x1b, 0x7a,
+ 0xfb, 0x1f, 0x19, 0x75, 0xfb, 0x47, 0x43, 0xfb,
+ 0x4a, 0x20, 0x29, 0x8, 0xe, 0xf7, 0x37, 0xf7,
+ 0x9, 0x66, 0x76, 0xf8, 0x10, 0x76, 0xe0, 0x77,
+ 0xa6, 0x77, 0x12, 0xf7, 0xc1, 0x9d, 0x13, 0xac,
+ 0xf7, 0xc0, 0xf8, 0x52, 0x15, 0x8c, 0x73, 0x8c,
+ 0x71, 0x84, 0x73, 0x8, 0x82, 0x6c, 0x7e, 0x6f,
+ 0x7c, 0x1a, 0x13, 0x6c, 0x72, 0x9d, 0x79, 0x9d,
+ 0x9d, 0x9e, 0x9c, 0xa6, 0x8c, 0x1e, 0x8c, 0xa1,
+ 0x7e, 0x99, 0x82, 0xb0, 0x8, 0x87, 0x9d, 0x88,
+ 0xa2, 0xac, 0x1a, 0xa2, 0x7e, 0x9c, 0x7e, 0x99,
+ 0x7f, 0x8, 0x65, 0xb6, 0x92, 0x6c, 0xab, 0x1b,
+ 0x9d, 0x9e, 0x9a, 0xa3, 0xb1, 0x62, 0x87, 0x4c,
+ 0x9e, 0x1f, 0x79, 0x90, 0x76, 0x97, 0x76, 0x96,
+ 0xa3, 0x9d, 0xa3, 0x94, 0xa0, 0x91, 0x8, 0xc3,
+ 0x9c, 0xb2, 0x82, 0xbb, 0x1a, 0x9e, 0x7a, 0x9a,
+ 0x78, 0x6f, 0x7b, 0x6f, 0x6f, 0x70, 0x1e, 0x70,
+ 0x70, 0x66, 0x71, 0x89, 0x1b, 0xb0, 0x8e, 0xa9,
+ 0x90, 0x98, 0x1e, 0x95, 0xa7, 0x94, 0xa1, 0xa0,
+ 0x1a, 0x13, 0xb4, 0xa7, 0x7a, 0x99, 0x7a, 0x79,
+ 0x78, 0x7b, 0x70, 0x76, 0x95, 0x7a, 0x93, 0x6a,
+ 0x1e, 0x8f, 0x78, 0x8f, 0x73, 0x6a, 0x1a, 0x6f,
+ 0x9b, 0x78, 0x9a, 0x7c, 0x99, 0x8, 0xae, 0x66,
+ 0x83, 0xa4, 0x6b, 0x1b, 0x74, 0x80, 0x77, 0x7d,
+ 0x5e, 0xb3, 0x90, 0xc2, 0x7c, 0x1f, 0x9d, 0x86,
+ 0x9f, 0x84, 0xac, 0x78, 0x70, 0x79, 0x71, 0x81,
+ 0x74, 0x85, 0x8, 0x56, 0x7d, 0x66, 0x8f, 0x5f,
+ 0x1a, 0x81, 0x96, 0x74, 0xa3, 0xa8, 0x9c, 0xa7,
+ 0xa8, 0xa5, 0x1e, 0xa4, 0xa6, 0xa7, 0x97, 0x97,
+ 0x95, 0x8, 0xe, 0xf7, 0xd2, 0xa0, 0x76, 0xf7,
+ 0x86, 0xb4, 0xf7, 0x73, 0x77, 0x12, 0xf7, 0xc5,
+ 0xcd, 0x53, 0xb5, 0x13, 0xf0, 0xe1, 0xf7, 0x86,
+ 0x15, 0x13, 0xe8, 0xf7, 0x79, 0xfb, 0x86, 0xb5,
+ 0xf7, 0x86, 0xf7, 0x7d, 0xb4, 0xfb, 0x7d, 0xf7,
+ 0x73, 0x61, 0xfb, 0x73, 0xfb, 0x79, 0x6, 0xe,
+ 0x20, 0xfb, 0x0, 0x76, 0xf7, 0x7a, 0x77, 0x12,
+ 0xa2, 0xc0, 0xa, 0x13, 0xe0, 0x87, 0xfb, 0x4,
+ 0x15, 0x94, 0x7a, 0x5, 0xc8, 0xa, 0x83, 0x5e,
+ 0x7f, 0x61, 0x75, 0x97, 0x81, 0x97, 0x83, 0x1e,
+ 0x13, 0xd0, 0x97, 0x83, 0x97, 0x84, 0x7a, 0x1a,
+ 0x66, 0x54, 0x66, 0x77, 0x7e, 0x1e, 0xe, 0x73,
+ 0xf7, 0x54, 0xca, 0x1, 0xbc, 0xf7, 0x7d, 0x3,
+ 0xbc, 0xf7, 0x54, 0x15, 0xf7, 0x6e, 0x6, 0x9a,
+ 0xca, 0x5, 0xfb, 0x6d, 0x6, 0xe, 0x20, 0x80,
+ 0xf7, 0x3, 0x1, 0xa6, 0xf7, 0x3, 0x3, 0xa6,
+ 0xb7, 0x84, 0xa, 0x3c, 0x8e, 0x76, 0xf9, 0x40,
+ 0x77, 0x1, 0x77, 0xf8, 0xb, 0x3, 0x77, 0x79,
+ 0x15, 0xf8, 0x2a, 0xf9, 0x40, 0x5, 0x5f, 0x6,
+ 0xfc, 0x2b, 0xfd, 0x40, 0x5, 0xe, 0x84, 0xa7,
+ 0xf9, 0x7, 0xa7, 0x1, 0xab, 0xda, 0xf7, 0xc7,
+ 0xda, 0x3, 0xf7, 0x3, 0xf7, 0x30, 0x15, 0xec,
+ 0xd3, 0xf8, 0x1f, 0xf7, 0x29, 0xe1, 0x8b, 0x25,
+ 0x6d, 0xfb, 0x43, 0x35, 0xfb, 0xd4, 0xfb, 0x1a,
+ 0x6b, 0x54, 0x9e, 0xf7, 0x8, 0x1e, 0x3c, 0xbb,
+ 0x15, 0x23, 0xc4, 0x20, 0xf3, 0xf7, 0x3c, 0xf7,
+ 0x1c, 0xf7, 0x7c, 0xf7, 0x5a, 0xed, 0x70, 0xf7,
+ 0x2f, 0xfb, 0x19, 0xfb, 0x1f, 0xfb, 0x3a, 0xfb,
+ 0x5e, 0xfb, 0xa2, 0x1e, 0xe, 0xa0, 0x76, 0xf9,
+ 0x38, 0x77, 0x1, 0xbc, 0xf7, 0xf8, 0x3, 0xbc,
+ 0x16, 0xf7, 0xab, 0x9a, 0x6, 0x5e, 0x6c, 0x96,
+ 0xaf, 0x8f, 0x8b, 0x8f, 0x8c, 0x90, 0x1f, 0xf7,
+ 0x2a, 0xf8, 0xc9, 0x5, 0x8e, 0x95, 0x8e, 0x98,
+ 0x92, 0x1a, 0x8f, 0x8a, 0x8d, 0x88, 0x83, 0xfb,
+ 0x1f, 0x6d, 0x83, 0x5c, 0x1e, 0x7c, 0x7, 0x8c,
+ 0xa1, 0x9e, 0x8c, 0x99, 0x1b, 0xa7, 0x97, 0x80,
+ 0x76, 0x83, 0x87, 0x7d, 0x88, 0x80, 0x1f, 0xfb,
+ 0x1a, 0xfc, 0x76, 0x5, 0x5e, 0x7e, 0x52, 0x79,
+ 0x5d, 0x1b, 0xe, 0x8b, 0xd7, 0xf8, 0xa3, 0xd4,
+ 0x1, 0xf8, 0x2, 0xe1, 0x3, 0x97, 0x16, 0xf7,
+ 0xf7, 0x6, 0xbd, 0xf7, 0x18, 0x7a, 0x92, 0x5,
+ 0x67, 0x7a, 0x71, 0x70, 0x49, 0x1b, 0xfb, 0x48,
+ 0x90, 0x6, 0xf7, 0x54, 0xf7, 0x54, 0x5, 0xf7,
+ 0x10, 0xf7, 0x10, 0xa4, 0xb8, 0xce, 0x1a, 0xd6,
+ 0x53, 0xe7, 0x21, 0x72, 0xfb, 0x17, 0x87, 0xfb,
+ 0x30, 0x55, 0x1e, 0xa0, 0x84, 0x5, 0xa4, 0x99,
+ 0xb1, 0xd0, 0xe5, 0x1b, 0xd8, 0xb9, 0x4f, 0x4d,
+ 0x6a, 0x87, 0x51, 0xfb, 0x20, 0xfb, 0x29, 0x1f,
+ 0xfb, 0x66, 0xfb, 0x6d, 0x5, 0xe, 0x84, 0xb1,
+ 0x65, 0xf7, 0x0, 0xf7, 0x98, 0x9b, 0xf7, 0x95,
+ 0xb5, 0x12, 0xf7, 0xee, 0xdb, 0x5b, 0xe2, 0x13,
+ 0x98, 0xf7, 0x20, 0xf7, 0xfd, 0x15, 0xec, 0x92,
+ 0xe3, 0x66, 0xfb, 0x20, 0x1a, 0xfb, 0x12, 0x2d,
+ 0x69, 0x69, 0x6f, 0x76, 0x9c, 0x9c, 0x76, 0x1e,
+ 0x13, 0x74, 0x9d, 0x76, 0x76, 0x9d, 0x74, 0x1b,
+ 0x66, 0x81, 0x6f, 0x76, 0x5e, 0xc2, 0x7d, 0xc6,
+ 0x1f, 0x13, 0x34, 0xf7, 0x4d, 0xe6, 0xf7, 0x22,
+ 0xf7, 0x3, 0xf7, 0x2, 0x46, 0xa9, 0x71, 0x97,
+ 0x1f, 0x8e, 0x7, 0xf4, 0xb2, 0xbd, 0xae, 0xd7,
+ 0x1a, 0xde, 0x43, 0xb5, 0x41, 0x52, 0x40, 0x5f,
+ 0x4f, 0x72, 0x1e, 0x9b, 0x86, 0x5, 0x9f, 0x9a,
+ 0xae, 0xba, 0xca, 0x1b, 0xb1, 0xbc, 0x73, 0x48,
+ 0xfb, 0x0, 0xfb, 0x1f, 0x5f, 0x27, 0x7d, 0x1f,
+ 0xe, 0xa0, 0x76, 0xf7, 0x3c, 0xca, 0xf8, 0x51,
+ 0x77, 0x12, 0x8c, 0xf8, 0x72, 0x17, 0xcc, 0xf7,
+ 0x7b, 0x15, 0x8f, 0x7, 0xf7, 0xc4, 0xf7, 0xdc,
+ 0x5, 0x8f, 0x6, 0x13, 0xf0, 0x28, 0xfb, 0xe0,
+ 0x5, 0xfb, 0xa5, 0x4c, 0x15, 0xf7, 0x97, 0x6,
+ 0x5d, 0xfb, 0x3c, 0x5, 0xda, 0x6, 0xb6, 0xf7,
+ 0x3a, 0x5, 0xef, 0x6, 0x99, 0xcc, 0x5, 0x2c,
+ 0x6, 0x13, 0x30, 0xf7, 0x10, 0xf8, 0x51, 0x5,
+ 0x62, 0x6, 0xfc, 0x35, 0xfc, 0x4d, 0x5, 0xe,
+ 0x84, 0xb5, 0xf8, 0xc4, 0xd2, 0x1, 0xf7, 0xf2,
+ 0xd0, 0x3, 0xf7, 0x17, 0xf8, 0x3b, 0x15, 0xf7,
+ 0x8, 0x72, 0xf2, 0x7f, 0xfb, 0x2d, 0x1a, 0x34,
+ 0x42, 0xfb, 0x3, 0x29, 0x6f, 0x77, 0x9a, 0x99,
+ 0x78, 0x1e, 0x98, 0x79, 0x7a, 0x98, 0x75, 0x1b,
+ 0x78, 0x76, 0x7f, 0x6e, 0x6f, 0xa9, 0x6f, 0xd3,
+ 0xf7, 0x57, 0xf6, 0xf7, 0x2e, 0xf7, 0x14, 0xf7,
+ 0x1a, 0x31, 0xc9, 0xfb, 0x16, 0xa5, 0x1f, 0xb2,
+ 0xed, 0x5, 0xf7, 0x7a, 0x6, 0xa2, 0xd2, 0x5,
+ 0xfb, 0x94, 0x6, 0x23, 0xfb, 0x78, 0x5, 0xe,
+ 0x84, 0xa5, 0xf8, 0x11, 0xaf, 0xf7, 0x8e, 0x77,
+ 0x1, 0xac, 0xd7, 0xf7, 0x9b, 0xe4, 0x3, 0xf7,
+ 0x5b, 0xf8, 0x4a, 0x15, 0xbd, 0xa3, 0xf7, 0xe,
+ 0xf7, 0x4a, 0xf7, 0x44, 0x1b, 0x8a, 0x9b, 0x5,
+ 0xfb, 0xc5, 0xfb, 0x4d, 0xfb, 0xa2, 0xfb, 0x62,
+ 0xfb, 0x38, 0xee, 0x56, 0xdc, 0xf7, 0x3e, 0xdc,
+ 0xf7, 0x3d, 0xf0, 0xf7, 0x22, 0x26, 0xbf, 0x47,
+ 0x6c, 0x6d, 0x83, 0x7e, 0x6f, 0x1f, 0x2a, 0xfb,
+ 0xab, 0x15, 0x9b, 0x95, 0xf7, 0x8c, 0xf7, 0x1e,
+ 0xd7, 0xb5, 0x51, 0x39, 0x31, 0x55, 0xfb, 0x40,
+ 0xfb, 0x6, 0x29, 0x8b, 0xf7, 0x4, 0xa5, 0x1e,
+ 0xe, 0x98, 0x76, 0xf8, 0xed, 0xd4, 0x1, 0xd6,
+ 0xf8, 0x5c, 0x3, 0xda, 0x83, 0x15, 0xd1, 0x6,
+ 0xf8, 0x18, 0xf9, 0x2c, 0x85, 0x95, 0x5, 0xfc,
+ 0xb, 0x6, 0x3a, 0xfb, 0x1c, 0x99, 0x82, 0x5,
+ 0xb3, 0xad, 0xb0, 0xab, 0xd3, 0x1b, 0xf7, 0x68,
+ 0x6, 0x8d, 0x88, 0x5, 0xe, 0x84, 0xa1, 0xf9,
+ 0x12, 0xa2, 0x12, 0xa9, 0xcf, 0xb3, 0xd9, 0xf7,
+ 0x2d, 0xd6, 0x78, 0xcf, 0x13, 0xf8, 0xf7, 0x75,
+ 0xf7, 0xfc, 0x15, 0x73, 0x84, 0xfb, 0x3f, 0x58,
+ 0xfb, 0x25, 0x1a, 0x6d, 0xa0, 0xfb, 0x1a, 0xf7,
+ 0x47, 0xf7, 0x1a, 0xdb, 0xe1, 0xe1, 0xd9, 0x63,
+ 0xcb, 0x40, 0xd6, 0x1e, 0x13, 0xf4, 0xc2, 0x9d,
+ 0xf7, 0x1, 0xb1, 0xec, 0x1a, 0xf7, 0x2, 0xfb,
+ 0x0, 0xaa, 0x49, 0x2d, 0x34, 0x5a, 0x24, 0x57,
+ 0xa5, 0x5c, 0xc8, 0x4a, 0x1e, 0xa1, 0x7b, 0x15,
+ 0x13, 0xf8, 0xec, 0x27, 0xa4, 0x6e, 0x4a, 0x1a,
+ 0x2b, 0x3d, 0x64, 0x55, 0x35, 0x56, 0xc7, 0xda,
+ 0xf7, 0x13, 0xf7, 0xf, 0xc2, 0xa5, 0x93, 0x1e,
+ 0xcb, 0xc2, 0x15, 0x2c, 0xe1, 0x8b, 0xaa, 0xa5,
+ 0x1a, 0xce, 0xb1, 0xb7, 0xcb, 0x1e, 0x13, 0xf4,
+ 0xdc, 0xa5, 0x48, 0x5b, 0x38, 0x50, 0x6d, 0x54,
+ 0x71, 0x1f, 0xe, 0x8f, 0x76, 0xf7, 0x93, 0xb9,
+ 0xf8, 0x2, 0xa5, 0x1, 0xd0, 0xe3, 0xf7, 0x98,
+ 0xd6, 0x3, 0xa2, 0x8c, 0x15, 0x79, 0x7, 0xf7,
+ 0x2e, 0xf7, 0xcf, 0xf7, 0x42, 0xf7, 0xbd, 0xf7,
+ 0x28, 0x3b, 0xd5, 0x24, 0xfb, 0x9, 0xfb, 0xf,
+ 0xfb, 0x10, 0xfb, 0x1d, 0xfb, 0xb, 0xcd, 0x3e,
+ 0xe0, 0xb7, 0xb7, 0x9e, 0xa5, 0xb3, 0x1f, 0x8f,
+ 0x89, 0x5, 0x51, 0x80, 0xfb, 0x54, 0xfb, 0x5f,
+ 0xfb, 0x12, 0x1b, 0xf7, 0x1a, 0xf8, 0x2f, 0x15,
+ 0xe8, 0xbb, 0xf7, 0x25, 0xf7, 0x5, 0xee, 0x8b,
+ 0xfb, 0x0, 0x64, 0x70, 0x7b, 0xfb, 0x4, 0x72,
+ 0x64, 0x1e, 0x60, 0x6f, 0x53, 0x7a, 0x6c, 0x1b,
+ 0x27, 0x87, 0xf7, 0x7, 0xab, 0x1f, 0xe, 0x73,
+ 0x80, 0xf7, 0x2, 0xf7, 0x7c, 0xf7, 0x2, 0x12,
+ 0xbd, 0xf7, 0x2, 0x82, 0xf7, 0x2, 0x13, 0xe0,
+ 0xbd, 0xb7, 0x8a, 0xa, 0x13, 0xd0, 0xf0, 0xf7,
+ 0xea, 0x8a, 0xa, 0xe, 0x73, 0xf7, 0xdd, 0xf7,
+ 0x4, 0x12, 0xf7, 0x29, 0xf7, 0x4, 0xfb, 0x3,
+ 0xf7, 0x3, 0x13, 0xa0, 0xa6, 0xfb, 0x4, 0x15,
+ 0x94, 0x7a, 0x5, 0x13, 0xc0, 0xc8, 0xa, 0x76,
+ 0x6c, 0x7c, 0x61, 0x73, 0x99, 0x83, 0x98, 0x83,
+ 0x1e, 0x95, 0x84, 0x95, 0x84, 0x7c, 0x1a, 0x66,
+ 0x54, 0x66, 0x77, 0x7e, 0x1e, 0xf7, 0xe, 0xf8,
+ 0x85, 0x15, 0x6c, 0xa4, 0x72, 0xaa, 0xaa, 0xa4,
+ 0xa4, 0xaa, 0xaa, 0x72, 0xa4, 0x6c, 0x6c, 0x72,
+ 0x72, 0x6c, 0x1e, 0xe, 0xf7, 0xd2, 0x98, 0x76,
+ 0xb9, 0x76, 0xf8, 0x85, 0x77, 0x1, 0xf7, 0x33,
+ 0xf8, 0x59, 0x3, 0xdf, 0xf7, 0x88, 0x15, 0xf8,
+ 0x90, 0xfb, 0x90, 0x5, 0xb5, 0x7, 0xfc, 0x4e,
+ 0xf7, 0x6f, 0xf8, 0x4e, 0xf7, 0x6f, 0x5, 0xb5,
+ 0x7, 0xfc, 0x90, 0xfb, 0x90, 0x5, 0xe, 0xf7,
+ 0xd2, 0xf7, 0xc, 0xce, 0xf7, 0x18, 0xce, 0x63,
+ 0xb3, 0x12, 0x13, 0xa0, 0xe1, 0xf7, 0xee, 0x15,
+ 0xf8, 0x8c, 0xb3, 0xfc, 0x8c, 0x6, 0xfb, 0x9e,
+ 0x4, 0xf8, 0x8c, 0x6, 0x13, 0xc0, 0xb0, 0xfc,
+ 0x8c, 0x7, 0xe, 0xf7, 0xd2, 0x98, 0x76, 0xf8,
+ 0x9e, 0x77, 0x1, 0xdf, 0x83, 0x15, 0xb5, 0x7,
+ 0xf8, 0x4e, 0xf7, 0x6f, 0xfc, 0x4e, 0xf7, 0x6f,
+ 0x5, 0xb5, 0x7, 0xf8, 0x90, 0xfb, 0x90, 0x5,
+ 0x79, 0x7, 0xe, 0x7f, 0xf3, 0xf8, 0xba, 0xa1,
+ 0x12, 0xf7, 0x18, 0xf3, 0x57, 0xcb, 0xf7, 0x2a,
+ 0xd5, 0x13, 0xd8, 0xf7, 0x5b, 0xf7, 0x44, 0x15,
+ 0x9c, 0x89, 0x5, 0xd3, 0xdb, 0xd6, 0xb5, 0xac,
+ 0x1e, 0xbf, 0xb4, 0xdd, 0xc1, 0xe3, 0x1a, 0xd5,
+ 0x54, 0xc0, 0x2b, 0x44, 0x49, 0x64, 0x44, 0x6e,
+ 0xa1, 0x77, 0xa3, 0x95, 0xac, 0x94, 0xa9, 0x96,
+ 0x85, 0x92, 0x85, 0x92, 0x1e, 0x85, 0x92, 0x84,
+ 0x92, 0x97, 0x1a, 0xba, 0xcc, 0x8b, 0x90, 0xd4,
+ 0x92, 0x50, 0x72, 0x44, 0x62, 0x5e, 0x5b, 0x58,
+ 0x1e, 0x57, 0x55, 0x51, 0x34, 0x41, 0x1a, 0x13,
+ 0xe8, 0x48, 0xfb, 0x1c, 0x15, 0x13, 0xd8, 0x6e,
+ 0xa2, 0x74, 0xa8, 0x1e, 0x13, 0xe8, 0xa8, 0xa2,
+ 0xa2, 0xa8, 0x1f, 0x13, 0xd8, 0xa8, 0x74, 0xa2,
+ 0x6e, 0x1e, 0x13, 0xe8, 0x6e, 0x74, 0x74, 0x6e,
+ 0x1f, 0xe, 0xf8, 0xc7, 0x79, 0xb2, 0xed, 0xac,
+ 0x7d, 0xb6, 0xf7, 0xb3, 0xb7, 0xf7, 0xf, 0xaa,
+ 0x12, 0xf7, 0xa, 0xde, 0xf7, 0xc, 0xd2, 0xf8,
+ 0xa, 0xb3, 0x13, 0xbf, 0xf8, 0x1c, 0xf7, 0x9c,
+ 0x15, 0xf7, 0xc, 0xe3, 0xd3, 0xbb, 0x1e, 0x13,
+ 0xaf, 0xa8, 0x98, 0x75, 0x61, 0x1f, 0x2a, 0x8c,
+ 0x40, 0xfb, 0x6, 0x61, 0x1b, 0x68, 0x70, 0xa3,
+ 0xc6, 0x1f, 0xf7, 0x21, 0x53, 0x15, 0x7f, 0x8a,
+ 0xa2, 0x51, 0xcd, 0x1b, 0xf7, 0xa, 0xce, 0xf7,
+ 0x1b, 0xf0, 0xf7, 0x3b, 0xfb, 0x23, 0xf7, 0x11,
+ 0xfb, 0x4b, 0xfb, 0x58, 0xfb, 0x3a, 0xfb, 0x24,
+ 0xfb, 0x69, 0xfb, 0x19, 0xf7, 0x5, 0xfb, 0x56,
+ 0xf7, 0x97, 0xd8, 0xd9, 0xab, 0xa9, 0xca, 0x1f,
+ 0x7f, 0xa8, 0x5, 0x71, 0x52, 0x4d, 0x71, 0x33,
+ 0x1b, 0xfb, 0x41, 0xfb, 0x7, 0xf7, 0x1c, 0xf7,
+ 0x21, 0xf7, 0x71, 0xf7, 0x13, 0xf7, 0x8, 0xf7,
+ 0x2c, 0xf7, 0x4a, 0xf3, 0xfb, 0x29, 0xfb, 0x5,
+ 0x1f, 0x13, 0xdf, 0x35, 0x5b, 0xfb, 0x8, 0x39,
+ 0x5f, 0x90, 0xbb, 0x9a, 0x8f, 0x1e, 0xcc, 0xf7,
+ 0x9a, 0x5, 0x46, 0x6, 0x81, 0x5c, 0x5, 0xa2,
+ 0x7e, 0x80, 0xa7, 0x5c, 0x1b, 0xfb, 0x19, 0x4d,
+ 0xfb, 0x3c, 0x45, 0x1f, 0x13, 0x0, 0xfb, 0x5,
+ 0xcf, 0x81, 0xa6, 0x1e, 0xc5, 0x8a, 0xb8, 0xc0,
+ 0x97, 0x9c, 0x8, 0xe, 0x5a, 0xa, 0x1, 0x58,
+ 0xf7, 0x4f, 0xf7, 0x98, 0xf7, 0x3c, 0x3, 0x58,
+ 0x16, 0x9b, 0xa, 0x5d, 0x7e, 0x9e, 0xa5, 0xa8,
+ 0x91, 0x91, 0xd2, 0xf7, 0x16, 0x1f, 0xf7, 0x70,
+ 0x6, 0xa1, 0xfb, 0x12, 0x8b, 0x74, 0x8a, 0x1a,
+ 0x63, 0x71, 0x77, 0x57, 0x1e, 0x7b, 0xf7, 0x8a,
+ 0x9b, 0x7, 0x51, 0x87, 0xa6, 0xc8, 0x80, 0x1f,
+ 0x2a, 0xf8, 0xc8, 0x5, 0x71, 0x6, 0xfb, 0xd9,
+ 0xfc, 0xb7, 0x5, 0x59, 0x6e, 0x70, 0x54, 0x65,
+ 0x1b, 0x45, 0xa, 0xe, 0xf7, 0x92, 0x86, 0xa9,
+ 0x72, 0xa9, 0xf7, 0xc1, 0xab, 0xf7, 0x98, 0xa9,
+ 0x12, 0xf7, 0x51, 0xf0, 0xf7, 0x21, 0xf7, 0x0,
+ 0x57, 0xf0, 0x13, 0x7c, 0x83, 0x16, 0xf7, 0xae,
+ 0x6, 0xf7, 0x14, 0xf7, 0x1d, 0xc9, 0xf7, 0x1d,
+ 0xed, 0x45, 0xa9, 0x56, 0xa2, 0x1f, 0x8d, 0x7,
+ 0x13, 0xba, 0xe9, 0x9e, 0xd9, 0xb6, 0xe5, 0x1a,
+ 0xf7, 0x7, 0x2b, 0xad, 0x23, 0x1e, 0xfb, 0x96,
+ 0x7b, 0x6, 0xdf, 0x81, 0x51, 0x52, 0x7c, 0x1f,
+ 0xfb, 0x5, 0xfc, 0x47, 0x7f, 0x5d, 0x67, 0x73,
+ 0x67, 0x8a, 0x19, 0x13, 0x7c, 0xf7, 0x4a, 0xd0,
+ 0x15, 0x9e, 0xbc, 0xf7, 0x37, 0x9a, 0xcb, 0x1e,
+ 0xf7, 0x3a, 0xa6, 0x5e, 0x3d, 0x28, 0x52, 0x3c,
+ 0xfb, 0x21, 0x6e, 0x6d, 0x9c, 0xb1, 0x1f, 0xd5,
+ 0xf7, 0xaa, 0x15, 0xb5, 0xf7, 0x33, 0x5, 0xeb,
+ 0xa2, 0x83, 0x90, 0xd1, 0x1b, 0x13, 0xba, 0xd6,
+ 0xb0, 0x67, 0x47, 0xfb, 0x20, 0xfb, 0xd, 0x7b,
+ 0xfb, 0xa, 0x1f, 0xe, 0xf7, 0xca, 0x79, 0xb8,
+ 0xd4, 0xa, 0x13, 0xb0, 0xf9, 0x20, 0xf8, 0x65,
+ 0x15, 0xb8, 0xa, 0x7e, 0x74, 0x93, 0x92, 0x6d,
+ 0x1f, 0x13, 0xd0, 0x90, 0x75, 0x70, 0x8f, 0x6c,
+ 0xd5, 0xa, 0xfb, 0x5c, 0xf7, 0x26, 0x45, 0xf7,
+ 0x8, 0xf7, 0x26, 0xe4, 0xf4, 0xb7, 0xb0, 0x6f,
+ 0xa, 0xe, 0xf8, 0x1, 0x8b, 0xa9, 0xf8, 0xe5,
+ 0xa9, 0x12, 0xf8, 0xe1, 0xf7, 0x3, 0x17, 0xb1,
+ 0xa, 0x1f, 0x13, 0xe0, 0xf4, 0x4d, 0xf7, 0x35,
+ 0xfb, 0x7a, 0x1e, 0xfb, 0xaa, 0x7b, 0x6, 0xe3,
+ 0x7e, 0x45, 0x59, 0x7d, 0x1f, 0xfb, 0x7, 0xfc,
+ 0x35, 0x5, 0x4d, 0x7a, 0x70, 0x75, 0x63, 0x1b,
+ 0xf7, 0x5f, 0xf7, 0x30, 0x15, 0xf7, 0x4, 0xf8,
+ 0x30, 0x5, 0x99, 0x8f, 0x95, 0xa4, 0xc4, 0xb2,
+ 0xa, 0x59, 0x79, 0x9d, 0xa5, 0xa6, 0x97, 0xaf,
+ 0x95, 0xae, 0x1f, 0xe, 0xf7, 0x92, 0x8b, 0xac,
+ 0xf7, 0xb9, 0xac, 0x6c, 0xe9, 0xa, 0x12, 0x8a,
+ 0xf9, 0xf, 0x13, 0xd8, 0x8b, 0xa, 0x74, 0x62,
+ 0x92, 0xb4, 0x90, 0x8b, 0x96, 0x8d, 0x92, 0x1f,
+ 0x13, 0xb8, 0x8e, 0x96, 0x85, 0x79, 0xcb, 0xf7,
+ 0x7b, 0x8, 0xf7, 0x37, 0x8b, 0x7d, 0x63, 0x40,
+ 0xa, 0x85, 0x80, 0xfb, 0x35, 0x1b, 0xb7, 0xf7,
+ 0x37, 0x5, 0xce, 0x9d, 0x81, 0xa8, 0xe9, 0x1b,
+ 0xf7, 0x3e, 0x9a, 0x6f, 0x67, 0x7c, 0x8b, 0x79,
+ 0x89, 0x76, 0x63, 0xa, 0xc2, 0x9c, 0x70, 0x75,
+ 0x77, 0x87, 0x74, 0x84, 0x74, 0x1f, 0xfb, 0x7,
+ 0xfc, 0x3a, 0x5, 0x47, 0x79, 0x64, 0x7b, 0x70,
+ 0x1b, 0xe, 0x7d, 0xa, 0xf7, 0xdc, 0xe9, 0xa,
+ 0x1, 0xf7, 0x64, 0xee, 0x3, 0x93, 0x16, 0xf7,
+ 0x90, 0x9b, 0x6, 0x49, 0x8a, 0x80, 0xb6, 0x9a,
+ 0xc4, 0xc4, 0xf7, 0x69, 0x18, 0xe3, 0xd1, 0x95,
+ 0x4f, 0x76, 0x86, 0x74, 0x88, 0x7d, 0x1f, 0x9c,
+ 0x86, 0xd7, 0xf7, 0x7e, 0x79, 0x90, 0x5, 0x2c,
+ 0x5d, 0x7a, 0x8d, 0xfb, 0x2d, 0x1b, 0xb6, 0xf7,
+ 0x35, 0x5, 0xe4, 0xa3, 0x8b, 0x94, 0xdb, 0x1b,
+ 0xf7, 0x28, 0xaf, 0x7e, 0x4c, 0x7d, 0x89, 0x7d,
+ 0x8a, 0x7d, 0x1f, 0xa0, 0x89, 0xab, 0xf7, 0x2d,
+ 0x5, 0xfc, 0x86, 0x7b, 0x6, 0xc2, 0x9b, 0x75,
+ 0x6d, 0x78, 0x87, 0x74, 0x85, 0x76, 0x1f, 0xfb,
+ 0x1, 0xfc, 0x2a, 0x75, 0x3a, 0x87, 0x84, 0x4a,
+ 0x7f, 0x19, 0xe, 0xb6, 0xa, 0xb0, 0xf8, 0xf9,
+ 0xad, 0x1, 0xbf, 0xf7, 0x2, 0x3, 0xf8, 0x5c,
+ 0xf7, 0xc3, 0x15, 0xb9, 0xa0, 0x71, 0x69, 0x85,
+ 0x8b, 0x84, 0x8a, 0x84, 0x1f, 0x88, 0x7b, 0x76,
+ 0xfb, 0x17, 0x6e, 0x74, 0x8, 0x74, 0x6e, 0x72,
+ 0x80, 0x58, 0x1b, 0xfb, 0x3e, 0x6b, 0xf7, 0x10,
+ 0xd9, 0xf7, 0x38, 0xed, 0xf7, 0x8b, 0xf7, 0x5d,
+ 0xd2, 0xf7, 0x1, 0x6a, 0xfb, 0x17, 0x1f, 0x9d,
+ 0x88, 0xbc, 0xf7, 0x59, 0x7c, 0x8f, 0x5, 0x7d,
+ 0x81, 0x7d, 0x77, 0x64, 0x1b, 0x7c, 0x70, 0x96,
+ 0x95, 0x67, 0x1f, 0x92, 0x70, 0x6b, 0x91, 0x67,
+ 0x1b, 0xfb, 0x6a, 0xfb, 0x53, 0xfb, 0x59, 0xfb,
+ 0x79, 0x60, 0xa8, 0xfb, 0x6b, 0xf7, 0x9c, 0xd4,
+ 0xe9, 0xa1, 0xb3, 0xcb, 0x1f, 0xb8, 0xf7, 0x45,
+ 0x5, 0xcb, 0x9c, 0xaa, 0x9d, 0xc0, 0x1b, 0x9b,
+ 0xfb, 0x9e, 0x7, 0xe, 0xf8, 0x1, 0xa0, 0x76,
+ 0xf7, 0xb9, 0xb5, 0xf7, 0xd2, 0x77, 0x12, 0x83,
+ 0xf7, 0x8a, 0xfb, 0x8a, 0xf9, 0x9b, 0xfb, 0x8b,
+ 0xf7, 0x8b, 0x13, 0xf4, 0x83, 0x16, 0xf7, 0x8a,
+ 0x9b, 0x6, 0x68, 0x6d, 0x9a, 0xb1, 0x92, 0x8c,
+ 0x92, 0x8d, 0x94, 0x1f, 0x13, 0xe8, 0xc7, 0xf7,
+ 0x7e, 0x5, 0xf7, 0xb1, 0x6, 0x50, 0xfb, 0x76,
+ 0x5, 0x4b, 0x79, 0x55, 0x77, 0x68, 0x1b, 0xe6,
+ 0xa, 0x64, 0x6b, 0x9b, 0xb4, 0x92, 0x8c, 0x93,
+ 0x8d, 0x93, 0x1f, 0xf7, 0x3, 0xf8, 0x3c, 0x5,
+ 0xf7, 0x7, 0xa9, 0xaa, 0x8d, 0xae, 0x1b, 0x93,
+ 0xa, 0xbb, 0x9b, 0x73, 0x6c, 0x78, 0x87, 0x76,
+ 0x85, 0x77, 0x1f, 0x62, 0xfb, 0x2e, 0x5, 0xfb,
+ 0xb1, 0x6, 0xb5, 0xf7, 0x2e, 0x5, 0xf7, 0x5,
+ 0xaa, 0xbf, 0x8d, 0xa9, 0x1b, 0xc4, 0xa, 0xc1,
+ 0x9d, 0x74, 0x6c, 0x78, 0x86, 0x76, 0x85, 0x76,
+ 0x1f, 0xfb, 0x4, 0xfc, 0x3a, 0x5, 0x4d, 0x7a,
+ 0x67, 0x75, 0x69, 0x1b, 0xe, 0x73, 0xcb, 0xa,
+ 0x83, 0xf8, 0x1c, 0x3, 0x83, 0x16, 0xf7, 0x88,
+ 0x9b, 0x6, 0x59, 0x7d, 0xa4, 0xaa, 0x9e, 0x90,
+ 0xa0, 0x90, 0x9d, 0x1f, 0xf7, 0x1, 0xf8, 0x1c,
+ 0x5, 0xec, 0xa6, 0xa2, 0x9d, 0xb6, 0x1b, 0x93,
+ 0xa, 0xb9, 0x9d, 0x76, 0x72, 0x76, 0x88, 0x72,
+ 0x85, 0x74, 0x1f, 0x20, 0xfc, 0x1c, 0x5, 0x28,
+ 0x70, 0x78, 0x7c, 0x5c, 0x1b, 0xe, 0xe2, 0x79,
+ 0xaa, 0x6c, 0xf7, 0x22, 0xf8, 0xa5, 0x77, 0x12,
+ 0x85, 0xe8, 0x13, 0xb0, 0xf7, 0x81, 0xf9, 0x11,
+ 0x15, 0xc3, 0x9d, 0x76, 0x6d, 0x78, 0x86, 0x74,
+ 0x85, 0x75, 0x1f, 0xfb, 0x15, 0xfc, 0x5b, 0x5,
+ 0x77, 0x85, 0x82, 0x69, 0x69, 0x1b, 0x6a, 0x88,
+ 0xa1, 0xa2, 0x8c, 0x1f, 0x91, 0x8c, 0x92, 0x91,
+ 0x1a, 0x13, 0x70, 0xa4, 0x75, 0xa1, 0x71, 0x6e,
+ 0x7a, 0x74, 0x6c, 0x4e, 0xc7, 0x70, 0xc0, 0xf7,
+ 0x17, 0xb2, 0xf3, 0xf5, 0xa8, 0x1e, 0xea, 0xf7,
+ 0xde, 0x5, 0xd9, 0xa2, 0x99, 0xb0, 0xc0, 0x1b,
+ 0x9b, 0xfb, 0x92, 0x7, 0xe, 0xf7, 0xca, 0xa0,
+ 0x76, 0xf7, 0xe6, 0xb0, 0xf7, 0xaa, 0x77, 0x1,
+ 0x92, 0xf9, 0x5f, 0x3, 0x92, 0x16, 0xf7, 0x8c,
+ 0x9b, 0x6, 0x52, 0x7e, 0x9d, 0xaa, 0x9a, 0x91,
+ 0x9e, 0x91, 0xa0, 0x1f, 0xc7, 0xf7, 0x6f, 0x93,
+ 0x8a, 0xf7, 0x7, 0xfb, 0x5a, 0x5, 0x9a, 0x70,
+ 0x9f, 0x6c, 0x73, 0x1a, 0x73, 0x7b, 0x79, 0x53,
+ 0x1e, 0x7b, 0xf7, 0xa7, 0x9b, 0x7, 0x5d, 0x74,
+ 0x92, 0xbc, 0x6f, 0x1f, 0xfb, 0x42, 0xf7, 0xc3,
+ 0xf7, 0xc0, 0xf7, 0x76, 0x5, 0x90, 0x92, 0xb2,
+ 0xaa, 0xa8, 0x1b, 0x9b, 0xfb, 0x72, 0x7b, 0x7,
+ 0xbc, 0x97, 0x83, 0x7a, 0x72, 0x3f, 0x4b, 0x47,
+ 0x5b, 0x1f, 0xfb, 0x24, 0x26, 0x85, 0x8c, 0xb7,
+ 0xf7, 0x31, 0x5, 0xe0, 0xa3, 0xa5, 0x9f, 0xc5,
+ 0x1b, 0xc4, 0xa, 0xc3, 0xa0, 0x7b, 0x70, 0x7a,
+ 0x87, 0x76, 0x84, 0x73, 0x1f, 0xfb, 0x7, 0xfc,
+ 0x2f, 0x5, 0x38, 0x74, 0x81, 0x75, 0x52, 0x1b,
+ 0xe, 0x6e, 0xa, 0x58, 0x59, 0x8b, 0xb2, 0x8f,
+ 0x8b, 0x90, 0x8d, 0x91, 0x1f, 0xf7, 0xd, 0xf8,
+ 0x4f, 0x5, 0xcd, 0x9d, 0xa5, 0xb1, 0xcd, 0x1b,
+ 0xc4, 0xa, 0xc7, 0x9c, 0x79, 0x6e, 0x7b, 0x86,
+ 0x77, 0x85, 0x75, 0x1f, 0xfb, 0xf, 0xfc, 0x4e,
+ 0x5, 0x4d, 0x7a, 0x6a, 0x7f, 0x6c, 0x1b, 0xe,
+ 0xf8, 0x70, 0xcb, 0xa, 0x79, 0xfa, 0xf, 0xfd,
+ 0x61, 0xf7, 0x49, 0xf7, 0x20, 0xf7, 0xa5, 0x3,
+ 0x79, 0xe4, 0xa, 0x55, 0x7d, 0xa4, 0xab, 0xa1,
+ 0x93, 0xa6, 0x92, 0xa3, 0x1f, 0xf5, 0xf8, 0x1a,
+ 0x5, 0x8f, 0x6, 0xc7, 0xfc, 0xac, 0x5, 0x9c,
+ 0x6, 0xf8, 0x8, 0xf8, 0xbd, 0x5, 0x8e, 0x6,
+ 0xfb, 0xc, 0xfc, 0x45, 0x5, 0x57, 0x7d, 0x86,
+ 0x57, 0x32, 0x1b, 0xe6, 0xa, 0x4d, 0x7a, 0x9d,
+ 0xa6, 0x9c, 0x92, 0x9f, 0x91, 0xa1, 0x1f, 0xf7,
+ 0xf, 0xf8, 0x4f, 0x5, 0xca, 0x9c, 0xa8, 0x96,
+ 0xaf, 0x1b, 0x9b, 0xfb, 0x3b, 0x7, 0xfb, 0xe1,
+ 0xfc, 0x7d, 0x5, 0x88, 0x6, 0x54, 0xf8, 0x7d,
+ 0x5, 0xfb, 0x49, 0x7b, 0x6, 0xc2, 0x9e, 0x79,
+ 0x76, 0x82, 0x80, 0x6c, 0x80, 0x63, 0x1f, 0x21,
+ 0xfc, 0x8, 0x5, 0xfb, 0x8, 0x6a, 0x6b, 0x7d,
+ 0x6a, 0x1b, 0xe, 0xf7, 0xca, 0x91, 0x76, 0xaf,
+ 0x76, 0xf7, 0x32, 0x77, 0xf8, 0x97, 0x77, 0x12,
+ 0xf7, 0x5a, 0xaa, 0x13, 0x78, 0x77, 0xe4, 0xa,
+ 0x54, 0x7b, 0xa1, 0xaa, 0xa9, 0x9a, 0xb0, 0x93,
+ 0xaa, 0x1f, 0xee, 0xf7, 0xfe, 0x5, 0x8f, 0x6,
+ 0x13, 0xb8, 0xf7, 0x78, 0xfc, 0xb4, 0x5, 0x9d,
+ 0x6, 0xf7, 0x24, 0xf8, 0x8b, 0x5, 0xf7, 0xd,
+ 0xae, 0xa0, 0xa7, 0xbb, 0x1b, 0xeb, 0xa, 0x7b,
+ 0x7, 0xc3, 0x9a, 0x77, 0x6d, 0x79, 0x7c, 0x5e,
+ 0x81, 0x67, 0x1f, 0x33, 0xfb, 0xde, 0x5, 0x88,
+ 0x6, 0xfb, 0x62, 0xf8, 0x83, 0x5, 0xfb, 0x35,
+ 0x7b, 0x6, 0xb4, 0xa7, 0x78, 0x66, 0x9c, 0x1f,
+ 0xfb, 0xb, 0xfc, 0x35, 0x5, 0xfb, 0x16, 0x66,
+ 0x75, 0x79, 0x5f, 0x1b, 0xe, 0xbf, 0xa, 0x90,
+ 0xa, 0xc7, 0xf7, 0x73, 0x15, 0xfb, 0x52, 0xf7,
+ 0x1f, 0x58, 0xe0, 0xf7, 0x74, 0xf7, 0x53, 0xf7,
+ 0x86, 0xf7, 0x5d, 0xf7, 0x3c, 0x24, 0xd4, 0xfb,
+ 0xc, 0xfb, 0x47, 0xfb, 0x81, 0xfb, 0x72, 0xfb,
+ 0x71, 0x1e, 0xf4, 0x5d, 0x15, 0xf7, 0x16, 0xf7,
+ 0x1, 0xf7, 0xda, 0xf7, 0x5a, 0xea, 0xa6, 0x47,
+ 0x30, 0xfb, 0xe, 0x30, 0xfb, 0xe5, 0xfb, 0x5f,
+ 0xfb, 0x16, 0x86, 0xf7, 0x1f, 0xa2, 0x1e, 0xe,
+ 0x7d, 0xa, 0xf7, 0xc5, 0xaf, 0xf7, 0xae, 0xa9,
+ 0x1, 0xf8, 0x8a, 0xf2, 0x3, 0x8b, 0x4, 0xf7,
+ 0x89, 0x9b, 0x6, 0x59, 0x7d, 0x9d, 0xaa, 0x9d,
+ 0x91, 0xa1, 0x92, 0xa4, 0x1f, 0xbb, 0xf7, 0x4b,
+ 0x5, 0x86, 0xa1, 0x99, 0x88, 0xd1, 0x1b, 0xf7,
+ 0x5c, 0xc4, 0xf7, 0xe, 0xd5, 0xf7, 0x2b, 0xfb,
+ 0x3b, 0x8c, 0x5f, 0x1f, 0xfb, 0x8c, 0x7b, 0x6,
+ 0xc0, 0x9c, 0x79, 0x70, 0x76, 0x83, 0x6f, 0x83,
+ 0x6f, 0x1f, 0x22, 0xfc, 0x14, 0x5, 0x4b, 0x79,
+ 0x7e, 0x58, 0x4b, 0x1b, 0xf7, 0x8f, 0xf7, 0xdf,
+ 0xd8, 0xa, 0x9b, 0xa9, 0x1b, 0xf7, 0x2, 0xa9,
+ 0x61, 0x41, 0xfb, 0x1f, 0x28, 0x70, 0x3a, 0x70,
+ 0x72, 0x8e, 0x8e, 0x78, 0x1f, 0xe, 0xf8, 0x1,
+ 0xfb, 0x4a, 0xcf, 0x73, 0xf7, 0x2f, 0x6a, 0xac,
+ 0xf8, 0xfc, 0xac, 0x12, 0x86, 0xa, 0x13, 0x5c,
+ 0xc6, 0xfb, 0x2e, 0x15, 0x95, 0x7c, 0x5, 0xa4,
+ 0xb2, 0xac, 0x91, 0xaa, 0x1b, 0xad, 0xac, 0x7e,
+ 0x80, 0xb2, 0x1f, 0x13, 0xbc, 0x81, 0xae, 0xb3,
+ 0x81, 0xbc, 0x1b, 0xba, 0xf7, 0x28, 0xa5, 0xf6,
+ 0xd2, 0x1f, 0x7c, 0x96, 0x5, 0x62, 0x63, 0x4f,
+ 0x68, 0x26, 0x1b, 0x75, 0x72, 0x91, 0x92, 0x6f,
+ 0x1f, 0x13, 0x3c, 0x5a, 0x98, 0x53, 0x9c, 0x55,
+ 0x89, 0xc8, 0xc4, 0x18, 0xae, 0xa, 0xf7, 0x82,
+ 0x4f, 0xa, 0xfb, 0x66, 0xfb, 0x71, 0xfb, 0x35,
+ 0xeb, 0x44, 0xdb, 0x7c, 0x1f, 0x2a, 0x36, 0x82,
+ 0x85, 0x44, 0x58, 0x8, 0xf5, 0xf7, 0xeb, 0x15,
+ 0xf7, 0x16, 0xef, 0xf7, 0xce, 0xf7, 0x5a, 0xea,
+ 0xaf, 0x45, 0x30, 0xfb, 0xe, 0x2b, 0xfb, 0xe1,
+ 0xfb, 0x5f, 0xfb, 0x16, 0x8b, 0xf7, 0x29, 0xa2,
+ 0x1e, 0xe, 0x7d, 0xa, 0xf7, 0xe1, 0xa7, 0xf7,
+ 0x9a, 0xa9, 0x1, 0xf8, 0x77, 0xf4, 0x3, 0x7e,
+ 0x16, 0xf7, 0x88, 0x9b, 0x6, 0x5b, 0x78, 0x98,
+ 0xaa, 0x9a, 0x8f, 0xa0, 0x92, 0xa3, 0x1f, 0xc3,
+ 0xf7, 0x65, 0xcc, 0x86, 0xf7, 0xf, 0xfb, 0xd8,
+ 0x5, 0xf7, 0x28, 0x9b, 0x6, 0x57, 0x74, 0xbb,
+ 0xae, 0x7e, 0x1f, 0x33, 0xf7, 0x7e, 0x5, 0xc1,
+ 0xf7, 0x23, 0xc4, 0xf7, 0xb, 0xf7, 0x24, 0xfb,
+ 0x40, 0x8b, 0x67, 0x1f, 0xfb, 0x8c, 0x7b, 0x6,
+ 0xbe, 0x9f, 0x7b, 0x72, 0x79, 0x85, 0x74, 0x85,
+ 0x74, 0x1f, 0xfb, 0x7, 0xfc, 0x30, 0x5, 0x4c,
+ 0x79, 0x80, 0x62, 0x4f, 0x1b, 0xf7, 0x94, 0xf7,
+ 0xf2, 0x15, 0xcc, 0xf7, 0x79, 0x5, 0x9d, 0x92,
+ 0x8f, 0x95, 0xb8, 0x1b, 0xc4, 0xc9, 0x74, 0x35,
+ 0x40, 0x66, 0x3d, 0xfb, 0x24, 0x70, 0x83, 0x8c,
+ 0x8f, 0x73, 0x1f, 0xe, 0x79, 0xae, 0x76, 0xae,
+ 0x72, 0x76, 0xf9, 0x1c, 0xac, 0x8c, 0x77, 0x12,
+ 0x13, 0x30, 0xb9, 0xa, 0x9c, 0x84, 0x83, 0x9f,
+ 0x1f, 0x13, 0x90, 0x81, 0xa4, 0xa8, 0x80, 0xb1,
+ 0x6d, 0xa, 0x13, 0x48, 0xb3, 0xf7, 0x5b, 0x5,
+ 0x74, 0x6, 0x79, 0x7f, 0x78, 0x83, 0x74, 0x1b,
+ 0x73, 0x7b, 0x94, 0x92, 0x72, 0x1f, 0x13, 0x90,
+ 0x90, 0x7b, 0x77, 0x8f, 0x70, 0x64, 0xa, 0xe,
+ 0xf7, 0x5b, 0xa0, 0x76, 0xf8, 0xfe, 0xae, 0x1,
+ 0xcc, 0x16, 0xf7, 0xb6, 0x9b, 0x6, 0x49, 0x77,
+ 0x9e, 0xac, 0x9c, 0x91, 0xa0, 0x92, 0xa3, 0x1f,
+ 0xf7, 0x1a, 0xf8, 0x7c, 0x5, 0xf7, 0x12, 0xac,
+ 0x85, 0x3c, 0x7f, 0x8a, 0x7d, 0x89, 0x7c, 0x1f,
+ 0x9c, 0x89, 0xb7, 0xf7, 0x37, 0x5, 0xfc, 0xa8,
+ 0x6, 0x61, 0xfb, 0x2e, 0x9d, 0x87, 0x5, 0xf7,
+ 0xf, 0xc5, 0xbd, 0x8b, 0xf7, 0x16, 0x1b, 0xfb,
+ 0x17, 0xfc, 0x7c, 0x5, 0x49, 0x79, 0x60, 0x5b,
+ 0x51, 0x1b, 0xe, 0xaa, 0xa, 0x77, 0x1, 0xf1,
+ 0xe5, 0xf8, 0xa, 0xf7, 0x5b, 0x3, 0xf7, 0x13,
+ 0xf9, 0x11, 0x15, 0xbe, 0xa2, 0x7b, 0x67, 0x1f,
+ 0x59, 0x28, 0xfb, 0xaf, 0x7c, 0xa, 0xf7, 0x3d,
+ 0xc5, 0xf7, 0x0, 0xf7, 0x29, 0xb7, 0x1e, 0xee,
+ 0xf7, 0xe3, 0x5, 0x9d, 0x90, 0xa7, 0xb8, 0xba,
+ 0x1b, 0xeb, 0xa, 0x7b, 0x7, 0xae, 0xaa, 0x7a,
+ 0x5f, 0x79, 0x3d, 0xfb, 0xb2, 0x83, 0x6c, 0x1f,
+ 0x26, 0x6f, 0x56, 0xfb, 0x9, 0xfb, 0x1a, 0x1b,
+ 0x4b, 0x40, 0xab, 0xe4, 0xc1, 0xef, 0xf7, 0xea,
+ 0x9a, 0xb8, 0x1f, 0xaf, 0x97, 0xb0, 0x9b, 0xb7,
+ 0x1b, 0xd2, 0xa, 0xe, 0xf7, 0x92, 0x8e, 0x76,
+ 0xf9, 0x33, 0x77, 0x1, 0xd7, 0xf8, 0xf8, 0x3,
+ 0xf7, 0x84, 0x79, 0x15, 0x9e, 0x6, 0xf7, 0xca,
+ 0xf8, 0x94, 0x5, 0x95, 0x91, 0xca, 0xf7, 0x19,
+ 0xbd, 0x1b, 0x9b, 0xfb, 0x4e, 0x7b, 0x7, 0xb4,
+ 0x9c, 0x75, 0x79, 0x69, 0x6e, 0x5b, 0x7d, 0x73,
+ 0x1f, 0xfb, 0x62, 0xfb, 0xf8, 0x5, 0x86, 0x6,
+ 0x4e, 0xf7, 0xfb, 0x5, 0x87, 0xa1, 0x85, 0xa6,
+ 0xa3, 0x1a, 0xb1, 0x9c, 0xab, 0xcc, 0x1e, 0x9b,
+ 0xfb, 0x85, 0x7b, 0x7, 0xbc, 0x8e, 0x75, 0xfb,
+ 0xf, 0x9f, 0x1f, 0xe, 0xf8, 0x70, 0x8e, 0x76,
+ 0xf9, 0x33, 0x77, 0x1, 0xd2, 0xf9, 0xd7, 0x3,
+ 0xf7, 0x68, 0x79, 0x15, 0x9e, 0x6, 0xf7, 0x72,
+ 0xf8, 0x5a, 0x5, 0x90, 0x6, 0xbd, 0xfc, 0x5a,
+ 0x5, 0x9f, 0x6, 0xf7, 0xc0, 0xf8, 0xd1, 0x5,
+ 0xbf, 0xa6, 0xa9, 0xa9, 0xa0, 0x1b, 0x9b, 0xfb,
+ 0x4d, 0x7b, 0x7, 0xbe, 0x99, 0x73, 0x75, 0x79,
+ 0x84, 0x7a, 0x89, 0x87, 0x1f, 0xfb, 0x58, 0xfc,
+ 0x15, 0x5, 0x88, 0x6, 0x5c, 0xf8, 0x24, 0x5,
+ 0x8f, 0x8b, 0x90, 0x8f, 0x1a, 0xaa, 0xb2, 0xa5,
+ 0xae, 0x1e, 0x9b, 0xfb, 0x82, 0x7b, 0x7, 0xc7,
+ 0x97, 0x74, 0x5e, 0x90, 0x1f, 0x92, 0x50, 0xfb,
+ 0x3e, 0xfb, 0xeb, 0x5, 0x88, 0x6, 0x87, 0xa9,
+ 0x61, 0xf7, 0xfd, 0x5, 0x8a, 0x93, 0x8b, 0x92,
+ 0x91, 0x1a, 0xb4, 0xb8, 0x9c, 0xaa, 0x1e, 0x9b,
+ 0xfb, 0x80, 0x7b, 0x7, 0xc1, 0x98, 0x5f, 0x69,
+ 0x8f, 0x1f, 0xe, 0xf7, 0x92, 0xcb, 0xa, 0x6e,
+ 0xf9, 0x40, 0x3, 0x6e, 0x16, 0xf7, 0x6a, 0x9b,
+ 0x6, 0x61, 0x75, 0x9a, 0xa0, 0x98, 0x91, 0x9a,
+ 0x99, 0x9c, 0x1f, 0xf7, 0x2b, 0xf7, 0x40, 0xd3,
+ 0xfb, 0x47, 0x5, 0x8f, 0x81, 0x8d, 0x81, 0x82,
+ 0x1a, 0x73, 0x79, 0x76, 0x51, 0x1e, 0xe6, 0xa,
+ 0x60, 0x67, 0x95, 0xcb, 0x72, 0x1f, 0x25, 0xf7,
+ 0x96, 0xf7, 0x4d, 0xf7, 0x68, 0x5, 0xbe, 0xb8,
+ 0xc0, 0xa5, 0x96, 0x1b, 0x9b, 0xfb, 0x64, 0x7b,
+ 0x7, 0xb4, 0x9e, 0x7d, 0x78, 0x7e, 0x85, 0x7b,
+ 0x7e, 0x7c, 0x1f, 0xfb, 0x25, 0xfb, 0x3b, 0x50,
+ 0xf7, 0x27, 0x5, 0x82, 0xa0, 0x86, 0x9e, 0x9b,
+ 0x1a, 0xa4, 0xa1, 0x9b, 0xbb, 0x1e, 0x9b, 0xfb,
+ 0x9c, 0x7b, 0x7, 0xc2, 0xa2, 0x76, 0x3f, 0xa9,
+ 0x1f, 0xe5, 0xfb, 0x77, 0xfb, 0x32, 0xfb, 0x4c,
+ 0x7d, 0x7c, 0x7a, 0x7a, 0x19, 0x53, 0x53, 0x62,
+ 0x72, 0x7a, 0x1b, 0xe, 0xf7, 0x5b, 0xcb, 0xa,
+ 0xcf, 0xa, 0x58, 0x6d, 0x99, 0xb3, 0x94, 0x8c,
+ 0x95, 0x8e, 0x97, 0x1f, 0xc1, 0xf7, 0x61, 0xf7,
+ 0x6f, 0xf7, 0xa2, 0x5, 0xb3, 0xab, 0xa9, 0xa0,
+ 0x93, 0x1b, 0xe8, 0xa, 0xaa, 0xa7, 0x7d, 0x72,
+ 0x83, 0x89, 0x83, 0x87, 0x81, 0x1f, 0x7a, 0x64,
+ 0xfb, 0x2, 0xfb, 0x16, 0x5e, 0x53, 0x73, 0xe7,
+ 0x6a, 0xf5, 0x85, 0xa5, 0x8, 0x89, 0x92, 0x8b,
+ 0x90, 0x91, 0x1a, 0xaa, 0xaf, 0x9c, 0xad, 0xcd,
+ 0xa, 0xaf, 0xa3, 0x82, 0x52, 0x9b, 0x1f, 0xd8,
+ 0xfb, 0xa1, 0x52, 0xfb, 0x5e, 0x5, 0x49, 0x78,
+ 0x55, 0x79, 0x67, 0x1b, 0xe, 0xf7, 0x5b, 0x8b,
+ 0xaf, 0xf8, 0xd9, 0xaf, 0x50, 0xa, 0xe, 0xe1,
+ 0xa, 0xa0, 0xf8, 0x6, 0x3, 0xa0, 0xfb, 0x2d,
+ 0x15, 0xf7, 0x50, 0x6, 0x92, 0xa6, 0x5, 0x5d,
+ 0x6, 0x6b, 0x68, 0x92, 0xb5, 0x97, 0x1f, 0xf7,
+ 0x34, 0xf9, 0x3a, 0x5, 0xa6, 0x91, 0xa3, 0x93,
+ 0xa6, 0x1b, 0xbf, 0x6, 0x92, 0xa6, 0x5, 0xfb,
+ 0x41, 0x6, 0xe, 0x3c, 0xfb, 0x13, 0x76, 0xf7,
+ 0x20, 0x76, 0xf9, 0x4b, 0x77, 0x1, 0x54, 0xf8,
+ 0xb, 0x3, 0xf7, 0x6b, 0xfb, 0x28, 0x15, 0xad,
+ 0x6, 0xfb, 0x41, 0xf9, 0xc2, 0x5, 0x66, 0x6,
+ 0xe, 0xe1, 0xa, 0x97, 0xf8, 0x6, 0x3, 0x9e,
+ 0xfb, 0x12, 0x15, 0x84, 0x70, 0x5, 0xf7, 0x41,
+ 0x6, 0xf7, 0x59, 0xf9, 0xc4, 0x5, 0xfb, 0x51,
+ 0x6, 0x84, 0x70, 0x5, 0xba, 0x6, 0xaa, 0xad,
+ 0x86, 0x60, 0x81, 0x1f, 0xfb, 0x35, 0xfd, 0x3a,
+ 0x5, 0x79, 0x87, 0x7d, 0x79, 0x65, 0x1b, 0xe,
+ 0xcc, 0xf9, 0x2e, 0x77, 0xa2, 0x76, 0x12, 0xf7,
+ 0x49, 0xf7, 0x41, 0x13, 0x60, 0xf7, 0xc1, 0x4,
+ 0x13, 0xa0, 0xcf, 0x6, 0xf7, 0x23, 0xf7, 0xb2,
+ 0xf7, 0x23, 0xfb, 0xb2, 0x5, 0xcf, 0x6, 0xfb,
+ 0x49, 0xf8, 0x1, 0x5, 0x4f, 0x6, 0xe, 0xfb,
+ 0x11, 0xbd, 0x1, 0x94, 0x40, 0x15, 0x82, 0x59,
+ 0x5, 0xf8, 0x80, 0x6, 0x93, 0xbd, 0x5, 0xe,
+ 0x73, 0xf8, 0x95, 0x76, 0xf7, 0x40, 0x77, 0x1,
+ 0xf7, 0xac, 0xf8, 0x80, 0xb7, 0xa, 0xfb, 0x3,
+ 0xf7, 0x22, 0xc5, 0xa, 0x79, 0x92, 0x56, 0xa,
+ 0x9e, 0x7a, 0x80, 0xa, 0x80, 0xbc, 0xf8, 0x11,
+ 0xa1, 0x12, 0x9c, 0xdf, 0xf7, 0x58, 0xd4, 0x8b,
+ 0x99, 0x17, 0xf7, 0xd2, 0xf7, 0x1f, 0x61, 0xa,
+ 0x70, 0xb5, 0xb6, 0xad, 0xb0, 0xd5, 0xc7, 0x1e,
+ 0x13, 0xf8, 0x38, 0xa, 0x45, 0x8a, 0x7a, 0x4f,
+ 0x5, 0x89, 0x6, 0xa7, 0x6d, 0xaf, 0x5f, 0xa,
+ 0x36, 0xa, 0xa8, 0xa1, 0x6e, 0x5b, 0x29, 0x2f,
+ 0xfb, 0x62, 0x21, 0x70, 0x6a, 0x9d, 0xc0, 0x1e,
+ 0xe, 0x80, 0xa2, 0x7f, 0xa2, 0xf8, 0x5, 0xbc,
+ 0x91, 0xbc, 0xf7, 0x4f, 0x77, 0x12, 0xa2, 0xe1,
+ 0xf7, 0xab, 0xe0, 0x13, 0x7e, 0xf7, 0x1, 0xb8,
+ 0x15, 0xf4, 0xeb, 0xf7, 0x86, 0xf7, 0x2, 0xca,
+ 0x95, 0x55, 0x6c, 0x1e, 0x13, 0xbe, 0x37, 0x2c,
+ 0xfb, 0x67, 0xfb, 0x1d, 0x5c, 0x8b, 0xa5, 0x92,
+ 0x1e, 0x8c, 0xf8, 0xea, 0x15, 0xb8, 0x9c, 0x7e,
+ 0x76, 0x7b, 0x85, 0x75, 0x84, 0x73, 0x1f, 0xfb,
+ 0x1c, 0xfc, 0x89, 0x5, 0x87, 0x7, 0x75, 0xd8,
+ 0x6c, 0xc0, 0xf7, 0x2d, 0xf7, 0x3b, 0xf7, 0x41,
+ 0xf7, 0x32, 0xd4, 0x5a, 0xbb, 0x45, 0x31, 0x50,
+ 0x38, 0x57, 0x6a, 0x1e, 0x89, 0x8c, 0xad, 0xf7,
+ 0x5, 0xb5, 0xf7, 0x44, 0xa1, 0xdd, 0x19, 0x86,
+ 0x90, 0x57, 0x81, 0x58, 0x84, 0x59, 0x85, 0x19,
+ 0xe, 0xe2, 0x80, 0xaf, 0xf8, 0x1f, 0xa0, 0x1,
+ 0xa9, 0xe1, 0xf7, 0x72, 0xe2, 0x3, 0xf7, 0xf2,
+ 0xf5, 0x15, 0x63, 0x67, 0x5c, 0x62, 0x4f, 0x1b,
+ 0x4e, 0x6d, 0xb8, 0xd8, 0xeb, 0xd0, 0xdb, 0xa,
+ 0x84, 0x89, 0x85, 0x88, 0x84, 0x1f, 0x87, 0x80,
+ 0x85, 0x7f, 0x7b, 0xa3, 0xa, 0xfb, 0x1e, 0xfb,
+ 0x2d, 0xfb, 0x21, 0xfb, 0x19, 0xde, 0x72, 0xcc,
+ 0xf4, 0xc5, 0xd6, 0xab, 0xa4, 0x1e, 0xe, 0x7f,
+ 0xbb, 0x6f, 0x76, 0xf8, 0x8a, 0xa2, 0xd3, 0x77,
+ 0x12, 0x9a, 0xe2, 0x13, 0xb8, 0xf1, 0xf7, 0x3,
+ 0x15, 0xe6, 0xea, 0xf7, 0x69, 0xf7, 0x4, 0xba,
+ 0x8b, 0x62, 0x74, 0xfb, 0x10, 0x29, 0xfb, 0x53,
+ 0x2c, 0x4e, 0x8b, 0xc5, 0x9c, 0x1e, 0xf7, 0x59,
+ 0x8e, 0x15, 0x83, 0x68, 0x87, 0x74, 0x74, 0x1a,
+ 0x13, 0x78, 0x76, 0x93, 0x72, 0xb2, 0xac, 0xcc,
+ 0xba, 0xce, 0xb6, 0x1e, 0x7f, 0x95, 0x5, 0x5b,
+ 0x61, 0x77, 0x74, 0x77, 0x1b, 0x81, 0x83, 0x92,
+ 0x9a, 0x9b, 0xf7, 0xd, 0xf8, 0x3e, 0xb6, 0xf7,
+ 0x42, 0x1f, 0x86, 0x90, 0x58, 0x80, 0x58, 0x84,
+ 0x58, 0x86, 0x19, 0x7a, 0x7, 0xb3, 0x9a, 0x7c,
+ 0x72, 0x79, 0x85, 0x74, 0x84, 0x72, 0x1f, 0x65,
+ 0xfb, 0x29, 0x89, 0x89, 0x5, 0xa1, 0x87, 0x84,
+ 0xa9, 0x53, 0x1b, 0x13, 0x38, 0xfb, 0xb, 0xfb,
+ 0x3e, 0xfb, 0x48, 0xfb, 0x2b, 0x1f, 0x13, 0xb8,
+ 0x57, 0xa0, 0x48, 0xde, 0xbd, 0xc3, 0x9d, 0xf7,
+ 0x2, 0xd3, 0x1e, 0xe, 0xe2, 0x80, 0xb8, 0xf8,
+ 0x14, 0xa2, 0x12, 0xaa, 0xe2, 0xf7, 0x78, 0xcd,
+ 0x17, 0xf7, 0x17, 0xf7, 0x5a, 0x15, 0xa0, 0xc1,
+ 0x5, 0xe5, 0xae, 0xd1, 0xd7, 0xc1, 0x1b, 0xa4,
+ 0x95, 0x6e, 0x76, 0x83, 0x82, 0xfb, 0xc, 0xfb,
+ 0x62, 0x61, 0x1f, 0x84, 0x75, 0x15, 0xf7, 0x52,
+ 0xa0, 0xed, 0xe2, 0xda, 0x1a, 0xb7, 0x6c, 0xad,
+ 0x58, 0x1e, 0x13, 0xa0, 0xfb, 0x21, 0xfb, 0x32,
+ 0x5c, 0xa, 0x1f, 0x73, 0xa, 0x61, 0x57, 0xa2,
+ 0xcf, 0x9f, 0x8c, 0x95, 0x90, 0xa0, 0x1f, 0xe,
+ 0x3c, 0xfb, 0x63, 0xa0, 0xf8, 0xd0, 0xab, 0xf7,
+ 0x82, 0xa1, 0x12, 0xf7, 0xed, 0xda, 0x13, 0xe0,
+ 0xa9, 0xf8, 0x16, 0x15, 0xe5, 0x6, 0x38, 0xfc,
+ 0x2e, 0x5, 0x63, 0x83, 0x71, 0xfb, 0xe, 0x4b,
+ 0x1b, 0x7f, 0x84, 0x93, 0x93, 0x8f, 0x8c, 0x8e,
+ 0x8d, 0x8e, 0x1f, 0x8e, 0x8f, 0x8e, 0x8f, 0x95,
+ 0x1a, 0xa4, 0x71, 0x97, 0x7d, 0x68, 0x8a, 0x63,
+ 0x88, 0x1e, 0x13, 0xf0, 0x65, 0xb7, 0x76, 0xad,
+ 0xf7, 0x9, 0xc4, 0xf7, 0x35, 0xf7, 0xe, 0xa6,
+ 0x1e, 0xce, 0xf7, 0xca, 0x5, 0xf7, 0x1, 0x6,
+ 0x91, 0xab, 0x5, 0xfb, 0x0, 0x6, 0xbe, 0x94,
+ 0xae, 0xf7, 0x4f, 0xdd, 0x1b, 0x98, 0x95, 0x87,
+ 0x83, 0x86, 0x89, 0x88, 0x89, 0x88, 0x1f, 0x88,
+ 0x87, 0x88, 0x85, 0x7f, 0x1a, 0x80, 0x91, 0x70,
+ 0xab, 0xa2, 0x9d, 0x9f, 0x9f, 0x9f, 0x7b, 0xb8,
+ 0x43, 0xfb, 0x12, 0x54, 0xfb, 0x43, 0x36, 0x71,
+ 0x1e, 0x2f, 0x6, 0xe, 0xfb, 0x52, 0xa1, 0xf7,
+ 0xd3, 0xa0, 0xf7, 0x8b, 0xa1, 0x12, 0x93, 0xcc,
+ 0xa2, 0xd9, 0xf7, 0x2b, 0xc7, 0x6a, 0xda, 0x13,
+ 0xfc, 0xf7, 0x11, 0xb2, 0x15, 0x37, 0x54, 0x6a,
+ 0x75, 0x52, 0x1a, 0x54, 0xc0, 0x53, 0xf7, 0x1,
+ 0xf7, 0x1d, 0xd9, 0xc8, 0xe0, 0xc6, 0x64, 0xaa,
+ 0x5f, 0x9f, 0x1e, 0x4f, 0xa6, 0x45, 0x93, 0xa9,
+ 0x1a, 0x98, 0xa1, 0xa6, 0x99, 0x1e, 0x98, 0x99,
+ 0x87, 0x98, 0x1b, 0x13, 0xfa, 0xe3, 0xea, 0xdd,
+ 0xd5, 0x9f, 0x88, 0x9f, 0x85, 0x9e, 0x1f, 0xbd,
+ 0x6, 0x13, 0xa8, 0xb2, 0x4e, 0x7, 0x7c, 0x60,
+ 0xaf, 0x50, 0x1b, 0x39, 0xfb, 0x8, 0x51, 0xfb,
+ 0x4, 0x46, 0xb6, 0x73, 0xaf, 0x7b, 0x1f, 0x69,
+ 0x74, 0x60, 0x6e, 0x6c, 0x1a, 0x78, 0x9a, 0x7f,
+ 0x97, 0x82, 0x1e, 0xa1, 0x80, 0x15, 0x92, 0x8e,
+ 0xed, 0x63, 0x9d, 0x82, 0x8, 0x13, 0xfc, 0x9e,
+ 0x82, 0xaf, 0x7a, 0x5e, 0x1a, 0x59, 0x5a, 0x5e,
+ 0x31, 0x7c, 0x2a, 0x9a, 0xdd, 0x8a, 0x1e, 0xb1,
+ 0x99, 0xbf, 0xc7, 0xa4, 0x1e, 0xa6, 0xf7, 0x72,
+ 0x15, 0x13, 0xa0, 0xce, 0xb7, 0xf1, 0xd8, 0x1e,
+ 0x13, 0xfa, 0xb5, 0x9a, 0x6e, 0x64, 0x38, 0x59,
+ 0x2b, 0x49, 0x5e, 0x7a, 0xac, 0xb8, 0x1f, 0xe,
+ 0xbe, 0xa, 0xf7, 0x86, 0x77, 0x12, 0xf8, 0x6,
+ 0xd9, 0x13, 0x70, 0x9e, 0x16, 0xd6, 0x6, 0xac,
+ 0xf7, 0x12, 0x99, 0xc2, 0xb9, 0xcf, 0x8, 0xa7,
+ 0x9e, 0xe0, 0xf7, 0x5, 0xbd, 0x1b, 0x9b, 0x98,
+ 0x81, 0x7a, 0x1f, 0x7e, 0x39, 0xfb, 0xb3, 0x71,
+ 0x1a, 0x13, 0xb0, 0x70, 0x98, 0x78, 0xab, 0xcd,
+ 0xb6, 0xc9, 0xbf, 0xaf, 0x1e, 0x13, 0x10, 0x7e,
+ 0x97, 0x5, 0x5b, 0x65, 0x73, 0x6c, 0x77, 0x1b,
+ 0x83, 0x83, 0x92, 0x97, 0x1f, 0x13, 0x38, 0xa0,
+ 0xdc, 0xf7, 0x94, 0xae, 0x1a, 0xcc, 0x5d, 0x92,
+ 0x75, 0x31, 0x25, 0xfb, 0x2e, 0x59, 0x6c, 0x1e,
+ 0x89, 0x8d, 0xf7, 0xa, 0xf8, 0x4b, 0x86, 0x90,
+ 0x57, 0x7f, 0x56, 0x82, 0x57, 0x85, 0x19, 0x7b,
+ 0x7, 0xb7, 0x9c, 0x94, 0x4f, 0x81, 0x7a, 0x51,
+ 0x83, 0x6d, 0x1f, 0xe, 0xd7, 0xa, 0xf8, 0xc4,
+ 0xf4, 0x12, 0xbc, 0xd6, 0xb0, 0xf2, 0x17, 0xf7,
+ 0x72, 0xf7, 0x6, 0x4a, 0xa, 0xe7, 0xf7, 0xe4,
+ 0x1f, 0x88, 0x8d, 0x5, 0x84, 0x64, 0x32, 0x79,
+ 0x6b, 0x1b, 0x13, 0xf0, 0x7b, 0x7, 0xc2, 0x8f,
+ 0x7c, 0x76, 0x1f, 0x6f, 0x40, 0x4b, 0xa, 0x41,
+ 0xf8, 0x86, 0x15, 0x6e, 0xa0, 0x85, 0xa, 0x76,
+ 0x73, 0x6e, 0x1e, 0xe, 0x3c, 0xfb, 0x63, 0xa2,
+ 0x74, 0xf2, 0xf9, 0x24, 0xf1, 0x12, 0xfb, 0x10,
+ 0xdc, 0xf7, 0x6d, 0xf1, 0x13, 0xb8, 0xd4, 0xf8,
+ 0x24, 0x15, 0xc7, 0x8c, 0x99, 0x8c, 0x61, 0x1a,
+ 0x33, 0xfb, 0xff, 0x5, 0x3e, 0x78, 0x72, 0x23,
+ 0x58, 0x1b, 0x82, 0x80, 0x8c, 0x95, 0x91, 0x8e,
+ 0x8e, 0x8e, 0x8f, 0x1f, 0x8e, 0x8f, 0x8f, 0x90,
+ 0x96, 0x1a, 0x13, 0x78, 0xa0, 0x77, 0x9a, 0x77,
+ 0x66, 0x87, 0x68, 0x87, 0x5a, 0xb8, 0x7c, 0xac,
+ 0xe4, 0xc5, 0xd6, 0xf7, 0x34, 0xb4, 0x1e, 0xf3,
+ 0xf8, 0x2f, 0x88, 0x8d, 0x5, 0x84, 0x64, 0x2b,
+ 0x79, 0x68, 0x1b, 0xf0, 0xf7, 0x4f, 0x15, 0x6f,
+ 0xa2, 0x74, 0xa7, 0xa7, 0xa2, 0xa2, 0xa7, 0xa7,
+ 0x74, 0xa2, 0x6f, 0x6f, 0x74, 0x74, 0x6f, 0x1e,
+ 0xe, 0xe2, 0x95, 0x76, 0xab, 0x76, 0xf9, 0x24,
+ 0x77, 0xba, 0x77, 0x12, 0x99, 0xf8, 0x53, 0x13,
+ 0x70, 0x99, 0x16, 0xd6, 0x6, 0xbb, 0xf7, 0x48,
+ 0xb5, 0xab, 0x95, 0x6d, 0xb1, 0x33, 0x97, 0x74,
+ 0x19, 0x13, 0xb0, 0x50, 0xa9, 0x9d, 0x74, 0xaa,
+ 0x1b, 0xb7, 0xa8, 0xb0, 0xd3, 0xb1, 0x1f, 0x7c,
+ 0x96, 0x5, 0x59, 0x6e, 0x81, 0x79, 0x75, 0x1b,
+ 0x71, 0x78, 0xb9, 0xf7, 0x3f, 0x43, 0x1f, 0xf7,
+ 0xe, 0xf7, 0x1e, 0xb5, 0xab, 0xb8, 0x1b, 0x13,
+ 0x38, 0x9b, 0xfb, 0x4b, 0x7b, 0x7, 0xa6, 0xa7,
+ 0x8b, 0x78, 0x6c, 0xfb, 0x14, 0x2b, 0x54, 0x60,
+ 0x1f, 0x89, 0x8d, 0xf7, 0xb, 0xf8, 0x59, 0x86,
+ 0x90, 0x5, 0x7f, 0x57, 0x36, 0x7c, 0x78, 0x1b,
+ 0x13, 0x0, 0x7b, 0x7, 0xa5, 0xb2, 0x82, 0x71,
+ 0x7c, 0x73, 0x3a, 0x82, 0x67, 0x1f, 0xe, 0x3c,
+ 0x8f, 0x76, 0xf9, 0x35, 0x77, 0xba, 0x77, 0x12,
+ 0xb4, 0xd8, 0x17, 0xf7, 0x78, 0xd3, 0xa, 0x7c,
+ 0x8b, 0x99, 0x91, 0x96, 0x93, 0xa6, 0x8d, 0x94,
+ 0x1f, 0xf7, 0x2b, 0xf8, 0xd7, 0x86, 0x90, 0x5,
+ 0x7f, 0x57, 0x3d, 0x7c, 0x71, 0x1b, 0x13, 0x90,
+ 0x7b, 0x7, 0xa5, 0xb1, 0x82, 0x71, 0x1f, 0x76,
+ 0xfb, 0x21, 0xfc, 0x94, 0x76, 0xb5, 0xa, 0xf8,
+ 0x1, 0x97, 0x76, 0xa9, 0x76, 0xf8, 0x19, 0xbf,
+ 0x12, 0x13, 0x60, 0x97, 0x16, 0xd6, 0x6, 0xb0,
+ 0xf7, 0xe, 0x9f, 0xcd, 0xb3, 0xc7, 0x8, 0xb3,
+ 0xa6, 0xd7, 0xf0, 0xb8, 0x1b, 0x94, 0x98, 0x8b,
+ 0x70, 0x78, 0x46, 0xfb, 0x8a, 0x71, 0x2a, 0x1f,
+ 0xd6, 0x6, 0xa8, 0xf7, 0x5, 0x9c, 0xca, 0xbb,
+ 0xd7, 0x8, 0xbc, 0xaa, 0xd3, 0xe3, 0xb4, 0x1b,
+ 0x97, 0x94, 0x83, 0x7c, 0x1f, 0x77, 0x3d, 0xfb,
+ 0xab, 0x70, 0x1a, 0x13, 0xa0, 0x7d, 0x8b, 0x68,
+ 0xb5, 0xc3, 0xbd, 0xc3, 0xc5, 0xb4, 0x1e, 0x7c,
+ 0x97, 0x5, 0x5c, 0x65, 0x71, 0x6b, 0x78, 0x1b,
+ 0x7f, 0x88, 0x8e, 0x9c, 0x1f, 0x99, 0xdc, 0xf7,
+ 0xa0, 0xad, 0x1a, 0xb3, 0x74, 0xa6, 0x67, 0x49,
+ 0x3a, 0x33, 0xfb, 0x8, 0x45, 0x1e, 0x89, 0x8d,
+ 0x5, 0x99, 0xb3, 0xa2, 0xde, 0x99, 0x1a, 0xb5,
+ 0x76, 0xa2, 0x65, 0x37, 0x24, 0xfb, 0x2f, 0x5a,
+ 0x6d, 0x1e, 0x89, 0x8d, 0xc3, 0xf7, 0x5a, 0x88,
+ 0x8f, 0x56, 0x80, 0x56, 0x81, 0x55, 0x81, 0x19,
+ 0x13, 0x0, 0x7b, 0x7, 0xbc, 0x96, 0x75, 0x75,
+ 0x1f, 0x13, 0x60, 0x75, 0x3d, 0xfb, 0x9a, 0x7b,
+ 0x49, 0x1e, 0xe, 0xbe, 0xa, 0x12, 0xf7, 0xfd,
+ 0xdc, 0x13, 0x70, 0x89, 0xa, 0x13, 0x90, 0xc3,
+ 0xa, 0x13, 0xb0, 0x51, 0xa, 0x13, 0x0, 0x7b,
+ 0x7, 0xc1, 0x93, 0x76, 0x7c, 0x1f, 0x13, 0x70,
+ 0x76, 0x4a, 0xfb, 0x74, 0x6c, 0xfb, 0x5, 0x1e,
+ 0xe, 0x80, 0xa0, 0xf8, 0x2e, 0xa0, 0x92, 0xa,
+ 0xa6, 0xf7, 0x1b, 0x15, 0x38, 0xba, 0x4c, 0xf5,
+ 0xf7, 0x2d, 0xf7, 0x1b, 0xf7, 0x47, 0xf7, 0xf,
+ 0xcd, 0x6a, 0xdf, 0xfb, 0x8, 0xfb, 0x26, 0xfb,
+ 0x26, 0xfb, 0x33, 0xfb, 0x27, 0x1e, 0xdf, 0x6d,
+ 0x15, 0xf7, 0xa, 0xe4, 0xf7, 0x59, 0xf7, 0x4,
+ 0xbb, 0xa3, 0x5d, 0x57, 0x20, 0x3e, 0xfb, 0x61,
+ 0xfb, 0x6, 0x59, 0x6b, 0xb1, 0xc4, 0x1e, 0xe,
+ 0xfb, 0x48, 0x76, 0xf7, 0x67, 0x76, 0xf8, 0x2d,
+ 0xb6, 0x48, 0xa, 0x73, 0x1f, 0x89, 0x8d, 0xa6,
+ 0xe8, 0x5, 0x96, 0x8e, 0x88, 0x8d, 0x88, 0x1b,
+ 0xfb, 0x2f, 0x75, 0x5, 0x13, 0x80, 0x8d, 0x7b,
+ 0x5, 0xb9, 0x9e, 0x81, 0x79, 0x76, 0x29, 0xfb,
+ 0xfe, 0x70, 0xfb, 0x4, 0x1f, 0x6b, 0x83, 0x81,
+ 0xda, 0xa, 0x61, 0x75, 0x8b, 0xd1, 0x94, 0x1f,
+ 0x8e, 0x9f, 0x9b, 0xd3, 0x94, 0xad, 0x8, 0xe,
+ 0xfb, 0x50, 0x76, 0xf7, 0x5a, 0xc0, 0xf8, 0xd,
+ 0xa1, 0x1, 0xa4, 0xe1, 0xf7, 0xa1, 0x99, 0x3,
+ 0xf7, 0x2a, 0xfb, 0x55, 0x15, 0x7b, 0xf7, 0x85,
+ 0x9d, 0x7, 0x6e, 0x5c, 0x9a, 0xb5, 0x97, 0x1f,
+ 0xf7, 0x30, 0xf8, 0xc4, 0x5, 0x42, 0x6, 0x7d,
+ 0x5f, 0x5, 0x89, 0x6, 0xa5, 0x85, 0x7b, 0xac,
+ 0x53, 0x1b, 0xfb, 0x16, 0xfb, 0x35, 0xfb, 0x52,
+ 0xfb, 0x1d, 0x47, 0xa5, 0x52, 0xd8, 0xe4, 0xc5,
+ 0xdc, 0xd8, 0xc0, 0x1f, 0x8d, 0x89, 0x3b, 0xfb,
+ 0xa7, 0x5, 0x5e, 0x7d, 0x6c, 0x79, 0x54, 0x1b,
+ 0x64, 0xf7, 0xc9, 0x15, 0xf7, 0x8, 0xf7, 0x8,
+ 0xf7, 0x4f, 0xe8, 0xaa, 0xa8, 0x76, 0x5e, 0x29,
+ 0xfb, 0x0, 0xfb, 0x69, 0x22, 0x68, 0x76, 0xaa,
+ 0xb6, 0x1e, 0xe, 0xab, 0xa0, 0x76, 0xf8, 0x4d,
+ 0x77, 0x1, 0xb8, 0xf8, 0x3, 0x3, 0xb8, 0x16,
+ 0xd7, 0x6, 0xb4, 0xf7, 0x19, 0x99, 0xb8, 0xb1,
+ 0xd3, 0x8, 0x9a, 0x93, 0xc7, 0xf7, 0x3, 0xaa,
+ 0x1b, 0x97, 0x8d, 0x83, 0x82, 0x8f, 0x1f, 0x82,
+ 0x90, 0x92, 0x81, 0xa1, 0x1b, 0x96, 0xaf, 0x8b,
+ 0xbf, 0xad, 0x72, 0x9a, 0x74, 0x4c, 0x39, 0xfb,
+ 0x6, 0x46, 0x70, 0x1f, 0x83, 0x77, 0x89, 0x8d,
+ 0xbc, 0xf7, 0x5b, 0x88, 0x8d, 0x5, 0x84, 0x5b,
+ 0x2f, 0x77, 0x7c, 0x1b, 0x7a, 0x7, 0x8d, 0x96,
+ 0x96, 0x8e, 0x96, 0x1b, 0xa3, 0x94, 0x7a, 0x73,
+ 0x73, 0x83, 0x6d, 0x84, 0x72, 0x1f, 0xe, 0xab,
+ 0x80, 0xa0, 0x89, 0x76, 0xf8, 0x43, 0xa2, 0x8c,
+ 0x77, 0x12, 0xf7, 0x1, 0xd4, 0xb9, 0xd7, 0x13,
+ 0x6c, 0xc2, 0xa, 0x9a, 0x9a, 0x86, 0x86, 0x9a,
+ 0x1f, 0x13, 0xac, 0x86, 0x9a, 0x99, 0x87, 0x9a,
+ 0x1b, 0xc3, 0xe8, 0xa4, 0xf7, 0x1, 0xb3, 0x70,
+ 0xb5, 0x6e, 0xb2, 0x1f, 0x6b, 0xb6, 0x69, 0xb3,
+ 0xac, 0x1a, 0xbc, 0xab, 0x94, 0xa1, 0xcc, 0xa8,
+ 0x49, 0x5a, 0x1e, 0x9b, 0x6, 0x13, 0x9c, 0xbb,
+ 0xa, 0x7d, 0x82, 0x8e, 0x8f, 0x80, 0x1f, 0x13,
+ 0xac, 0x90, 0x7e, 0x7d, 0x90, 0x73, 0x1b, 0x21,
+ 0x7d, 0x3b, 0x6c, 0x65, 0xa8, 0x60, 0xa9, 0x61,
+ 0x1f, 0xa9, 0x61, 0xa9, 0x62, 0x6a, 0xb4, 0xa,
+ 0xe, 0xd7, 0xa, 0xf8, 0x20, 0xab, 0xf7, 0x15,
+ 0x77, 0x1, 0xb0, 0xf7, 0x97, 0x3, 0xf7, 0x6a,
+ 0xf7, 0x9, 0x15, 0x6b, 0x72, 0x68, 0x5c, 0x77,
+ 0x1b, 0x86, 0x80, 0x8e, 0x97, 0x97, 0xa6, 0xeb,
+ 0xc7, 0xf7, 0x74, 0x1f, 0xe1, 0x6, 0x90, 0xab,
+ 0x5, 0x39, 0x6, 0xa9, 0xf7, 0x6, 0x5, 0x93,
+ 0x8d, 0x89, 0x92, 0x84, 0x1b, 0x82, 0x87, 0x84,
+ 0x86, 0x87, 0x1f, 0x6f, 0x68, 0x58, 0x53, 0x6b,
+ 0x7a, 0x8, 0x6b, 0x7a, 0x75, 0x91, 0x6d, 0x1a,
+ 0xd6, 0x6, 0x45, 0xfb, 0x9c, 0x5, 0x87, 0x7b,
+ 0x78, 0x4e, 0x7c, 0x1a, 0x6d, 0xa7, 0x81, 0x9f,
+ 0xbf, 0xb2, 0xb7, 0xd8, 0xbe, 0x1e, 0xe, 0x82,
+ 0xbe, 0x6b, 0x76, 0xf8, 0x58, 0xa9, 0xa, 0xd9,
+ 0x13, 0xa0, 0xf7, 0xe0, 0xf7, 0x77, 0x15, 0x13,
+ 0xb8, 0x4d, 0xa, 0x72, 0xa, 0x80, 0x8a, 0x96,
+ 0x90, 0x9a, 0x99, 0xb7, 0x90, 0x9f, 0x42, 0xa,
+ 0x84, 0x7c, 0x8f, 0x9e, 0x97, 0xaa, 0xf7, 0xc,
+ 0xc8, 0xf7, 0x86, 0x1f, 0x88, 0x8d, 0x5, 0x7f,
+ 0x59, 0x37, 0x7c, 0x7b, 0x1b, 0x13, 0x50, 0x5d,
+ 0xa, 0x13, 0x60, 0xa6, 0xa, 0xe2, 0x8e, 0x76,
+ 0xf8, 0x5f, 0x77, 0x12, 0xf7, 0x1c, 0xd2, 0xf7,
+ 0x3c, 0xbe, 0x17, 0xf7, 0x63, 0xd1, 0x15, 0x8a,
+ 0xc9, 0x83, 0xf7, 0x32, 0x69, 0xf7, 0x17, 0x8,
+ 0x9e, 0x86, 0x8a, 0x8c, 0x81, 0x87, 0xfb, 0x1,
+ 0x72, 0x7d, 0x1b, 0x7e, 0x7, 0xbc, 0xa2, 0x9e,
+ 0xfb, 0x4, 0xa0, 0x1f, 0x9b, 0x34, 0x91, 0xfb,
+ 0x4a, 0x6e, 0x1a, 0x7a, 0x8b, 0x7e, 0x94, 0x1e,
+ 0x13, 0x50, 0x9a, 0x9d, 0x9f, 0xd2, 0xcd, 0x1f,
+ 0xac, 0xae, 0xf7, 0x29, 0xf7, 0x46, 0xe7, 0x1a,
+ 0xb0, 0x73, 0xa5, 0x6a, 0x77, 0x7b, 0x7d, 0x7c,
+ 0x73, 0x93, 0x80, 0x94, 0x83, 0x1e, 0x97, 0x80,
+ 0x98, 0x85, 0x75, 0x1a, 0x59, 0x3b, 0xfb, 0xb,
+ 0x52, 0x50, 0x1e, 0xe, 0xf7, 0xca, 0x8e, 0x76,
+ 0xf8, 0x5e, 0x77, 0xa0, 0x77, 0x12, 0xf7, 0xd,
+ 0xd2, 0xf7, 0x38, 0xca, 0xf7, 0x49, 0xbb, 0x13,
+ 0xbc, 0xf7, 0x52, 0xf7, 0x15, 0x15, 0x9d, 0x84,
+ 0xf7, 0x13, 0x79, 0xf0, 0x1e, 0xc1, 0x81, 0x85,
+ 0x97, 0x85, 0x82, 0x29, 0x73, 0x77, 0x1b, 0x7d,
+ 0x7, 0xc4, 0x9c, 0x8e, 0x30, 0x94, 0x1f, 0x90,
+ 0x54, 0x9c, 0x3f, 0xfb, 0x2f, 0x1a, 0x7d, 0x8c,
+ 0x8a, 0x6a, 0x98, 0x1b, 0x9a, 0x92, 0xa0, 0xf7,
+ 0x40, 0xec, 0x1f, 0xb8, 0xda, 0xa3, 0xb5, 0x9d,
+ 0xab, 0x8, 0x8d, 0x6, 0xa8, 0xfb, 0xd0, 0x5,
+ 0x7b, 0x8c, 0x8b, 0x7d, 0x96, 0x1b, 0x96, 0x98,
+ 0x9e, 0xbb, 0xb3, 0x1f, 0xb9, 0xc1, 0xf7, 0x2f,
+ 0xf7, 0x57, 0xe2, 0x1a, 0xa8, 0x7b, 0xa6, 0x66,
+ 0x6e, 0x82, 0x79, 0x7a, 0x7a, 0x96, 0x82, 0x96,
+ 0x81, 0x1e, 0x96, 0x81, 0x95, 0x81, 0x79, 0x1a,
+ 0x57, 0x3e, 0x2a, 0x33, 0xfb, 0x1, 0x1e, 0x6b,
+ 0xf7, 0xfb, 0x5, 0x13, 0xdc, 0x8d, 0x8a, 0x8b,
+ 0x90, 0x84, 0x1b, 0x85, 0x88, 0x87, 0x86, 0x88,
+ 0x1f, 0xfb, 0x53, 0xfb, 0xc2, 0x5, 0xe, 0xe2,
+ 0x80, 0xc2, 0xf8, 0x21, 0x77, 0x1, 0x70, 0xf8,
+ 0x6e, 0x3, 0xf7, 0x62, 0xf7, 0x44, 0x15, 0xa9,
+ 0xfb, 0xc, 0x5, 0x56, 0x98, 0x9a, 0x7d, 0xa8,
+ 0x1b, 0xa2, 0xa8, 0x8b, 0xf7, 0x6, 0xd2, 0x1f,
+ 0x7d, 0x93, 0x5, 0x6d, 0x70, 0x77, 0x66, 0x76,
+ 0x1b, 0x77, 0x84, 0xa4, 0x9b, 0x87, 0x1f, 0x85,
+ 0xa4, 0x69, 0xf7, 0x1c, 0x9d, 0x1a, 0x8b, 0xcf,
+ 0xf7, 0xd, 0xa8, 0x96, 0x92, 0x87, 0x87, 0x92,
+ 0x1e, 0x87, 0x93, 0x93, 0x86, 0x97, 0x1b, 0xa3,
+ 0x95, 0x9e, 0x9d, 0xa3, 0x75, 0x97, 0x78, 0x57,
+ 0x5c, 0x4e, 0x39, 0x57, 0x1f, 0x80, 0xc2, 0x5,
+ 0xe3, 0x79, 0x7c, 0x8b, 0x75, 0x1b, 0x6b, 0x49,
+ 0x73, 0x82, 0x70, 0x1f, 0x8f, 0x7c, 0x5, 0x93,
+ 0xab, 0x99, 0x8e, 0x94, 0x1b, 0xa6, 0x97, 0x73,
+ 0x6c, 0x94, 0x1f, 0x8c, 0x86, 0xa5, 0xfb, 0xf,
+ 0x82, 0x1a, 0xfb, 0x17, 0x31, 0x71, 0x69, 0x7a,
+ 0x1b, 0x82, 0x82, 0x90, 0x90, 0x81, 0x1f, 0x90,
+ 0x82, 0x81, 0x8f, 0x80, 0x1b, 0x75, 0x7f, 0x79,
+ 0x7b, 0x73, 0x9b, 0x78, 0xac, 0xaa, 0x97, 0x96,
+ 0x9e, 0x9c, 0x1f, 0xad, 0xb0, 0xb5, 0xc1, 0xbb,
+ 0xcd, 0x8, 0xe, 0xe2, 0xfb, 0x4d, 0x76, 0xf9,
+ 0x1b, 0x77, 0x12, 0xf8, 0x1d, 0xc7, 0xa, 0xcf,
+ 0x7e, 0x5d, 0xf7, 0x11, 0x7e, 0x7e, 0xfb, 0x12,
+ 0x73, 0x86, 0x1b, 0x13, 0xe0, 0x98, 0xa, 0x9f,
+ 0x4c, 0xe2, 0xa, 0xae, 0xfb, 0x2f, 0x7a, 0xa,
+ 0x83, 0x85, 0x90, 0x91, 0x83, 0x1f, 0x93, 0x81,
+ 0x7f, 0x94, 0x7a, 0x96, 0xa, 0x70, 0xa, 0x76,
+ 0x96, 0x83, 0x97, 0x83, 0x1f, 0x9a, 0x82, 0x9b,
+ 0x84, 0x74, 0xa7, 0xa, 0xe, 0xab, 0x4f, 0x76,
+ 0xf8, 0x55, 0xc7, 0x1, 0xba, 0xa, 0xb1, 0xb2,
+ 0x71, 0x74, 0xb2, 0x1f, 0x78, 0xac, 0xad, 0x79,
+ 0xad, 0xaf, 0xa, 0x81, 0x8e, 0x83, 0x8e, 0x85,
+ 0x1f, 0x8f, 0x83, 0x8f, 0x85, 0x85, 0x1a, 0x7e,
+ 0x7b, 0x88, 0x7f, 0x81, 0x74, 0x8b, 0xac, 0x75,
+ 0x1e, 0xce, 0x5f, 0x50, 0xac, 0x6b, 0x1b, 0xf7,
+ 0xb6, 0xf7, 0xec, 0x5, 0xca, 0xa, 0x8e, 0x94,
+ 0xc3, 0xdd, 0x1e, 0xf7, 0x1c, 0x6, 0xe, 0xdd,
+ 0xa, 0xbe, 0xd6, 0x82, 0xd6, 0x13, 0xe0, 0xf7,
+ 0x47, 0xfb, 0x3a, 0x15, 0x6b, 0x93, 0x76, 0x9b,
+ 0xb9, 0x1a, 0x13, 0xd0, 0xb3, 0xcd, 0xf7, 0x61,
+ 0xb4, 0x1a, 0xb3, 0x69, 0x9b, 0x78, 0x93, 0x1e,
+ 0x8c, 0x8d, 0xcf, 0x9c, 0xa2, 0xb2, 0x9e, 0xd3,
+ 0x19, 0xb8, 0xf7, 0x3c, 0x5, 0xe6, 0xa3, 0xc0,
+ 0xac, 0xab, 0x1b, 0x8e, 0x96, 0x5, 0x2f, 0x50,
+ 0x7c, 0xfb, 0xc, 0x69, 0x1f, 0x5a, 0xfb, 0x3e,
+ 0x79, 0x4b, 0x77, 0x5e, 0x45, 0x79, 0x19, 0xb6,
+ 0x7d, 0x94, 0x78, 0x6d, 0x1a, 0x13, 0xe0, 0x52,
+ 0x49, 0xfb, 0x49, 0x5a, 0x1a, 0x54, 0xaa, 0x70,
+ 0xe9, 0x1e, 0xe, 0x39, 0xfb, 0x27, 0x76, 0xf7,
+ 0x3f, 0xe0, 0xa, 0x9a, 0xfb, 0x3c, 0x15, 0xb6,
+ 0x6, 0xf7, 0x6c, 0xf9, 0xd6, 0x5, 0x62, 0x6,
+ 0xe, 0xdd, 0xa, 0xf7, 0xa6, 0xd6, 0x42, 0xd6,
+ 0x13, 0xd0, 0x87, 0xfb, 0x3a, 0x15, 0x88, 0x80,
+ 0x5, 0xe7, 0xc9, 0x9a, 0xf7, 0xc, 0xac, 0x1f,
+ 0xba, 0xf7, 0x3e, 0x9c, 0xcb, 0xa0, 0xb8, 0xd1,
+ 0x9d, 0x19, 0x60, 0x99, 0x82, 0x9e, 0xa9, 0x1a,
+ 0x13, 0xe0, 0xc4, 0xcd, 0xf7, 0x49, 0xbc, 0x1a,
+ 0xc2, 0x6c, 0xa6, 0x2d, 0x1e, 0x88, 0x80, 0x5,
+ 0xa1, 0xaa, 0x73, 0x5d, 0x1f, 0x13, 0xd0, 0x63,
+ 0x49, 0xfb, 0x61, 0x62, 0x1a, 0x63, 0xad, 0x7b,
+ 0x9e, 0x83, 0x1e, 0x8a, 0x89, 0x47, 0x7a, 0x74,
+ 0x64, 0x78, 0x43, 0x19, 0x5e, 0xfb, 0x3c, 0x5,
+ 0x31, 0x73, 0x56, 0x69, 0x6b, 0x1b, 0xe, 0xf7,
+ 0x4c, 0xf7, 0x4f, 0xcb, 0x5c, 0x76, 0xd3, 0xcb,
+ 0x8f, 0x77, 0x12, 0xb3, 0xf8, 0x62, 0x13, 0x68,
+ 0xd7, 0xf7, 0x4b, 0x15, 0xae, 0x9b, 0xa3, 0xb0,
+ 0xb7, 0x1b, 0xb9, 0xa9, 0x7d, 0x7b, 0xa7, 0x1f,
+ 0x13, 0x98, 0x79, 0xac, 0xa9, 0x77, 0xbd, 0x1b,
+ 0xc9, 0xac, 0xb7, 0xb5, 0xa9, 0x1f, 0x67, 0xbd,
+ 0x5, 0x68, 0x74, 0x72, 0x66, 0x63, 0x1b, 0x69,
+ 0x6c, 0x99, 0x9b, 0x6c, 0x1f, 0x13, 0x68, 0x9d,
+ 0x67, 0x66, 0x9f, 0x5f, 0x1b, 0x48, 0x67, 0x5f,
+ 0x61, 0x75, 0x1f, 0xe, 0xab, 0xfb, 0x4c, 0x76,
+ 0xf8, 0xd0, 0xf5, 0x1, 0xf7, 0x6c, 0xf5, 0x3,
+ 0xf7, 0x6c, 0xf8, 0x38, 0x15, 0x6e, 0xa3, 0x73,
+ 0xa8, 0xa8, 0xa3, 0xa3, 0xa8, 0xa8, 0x73, 0xa3,
+ 0x6e, 0x6e, 0x73, 0x73, 0x6e, 0x1e, 0x94, 0xfb,
+ 0x1a, 0x15, 0x51, 0xfb, 0x32, 0x58, 0xfb, 0xa,
+ 0x5f, 0xfb, 0x10, 0x8, 0x84, 0x78, 0x85, 0x7d,
+ 0x7c, 0x1a, 0x75, 0x9e, 0x76, 0x9d, 0xb5, 0x95,
+ 0x9c, 0xc0, 0x96, 0x1e, 0xa5, 0xf7, 0x10, 0xa2,
+ 0xf7, 0x18, 0xad, 0xf7, 0x35, 0x8, 0xe, 0x81,
+ 0xae, 0x80, 0x76, 0xf8, 0x3c, 0xa2, 0x12, 0xd8,
+ 0xe1, 0x13, 0xb0, 0xf7, 0x1d, 0xfb, 0x23, 0xb7,
+ 0xa, 0xba, 0xf7, 0x19, 0x5, 0xf7, 0x16, 0xb5,
+ 0xdb, 0xa5, 0xa5, 0x1f, 0x7b, 0x95, 0x5, 0x64,
+ 0x69, 0x57, 0x61, 0x57, 0x1b, 0x13, 0x70, 0x81,
+ 0x80, 0x8c, 0x8e, 0x81, 0x1f, 0xf7, 0x1d, 0xf8,
+ 0x1b, 0x5, 0x9c, 0x9d, 0x85, 0x7d, 0x82, 0x87,
+ 0x82, 0x87, 0x81, 0x1f, 0x88, 0x82, 0x87, 0x81,
+ 0x7f, 0x97, 0xa, 0xa9, 0x74, 0xbd, 0x3e, 0x1e,
+ 0xb5, 0xf7, 0xc, 0x5, 0x6d, 0x6, 0x61, 0xfb,
+ 0xc, 0x5, 0x13, 0x50, 0xfb, 0x12, 0xfb, 0x1f,
+ 0xfb, 0x32, 0xfb, 0x1b, 0x1f, 0x13, 0x70, 0xfb,
+ 0x6, 0xd3, 0x63, 0xaf, 0x1e, 0x9c, 0xbb, 0x15,
+ 0x71, 0x9e, 0x7e, 0xaf, 0xbe, 0x1a, 0xf2, 0xe2,
+ 0xf7, 0x3b, 0xdf, 0x1e, 0xe, 0x7b, 0xa1, 0x7f,
+ 0xd3, 0xa9, 0xa7, 0xf7, 0x61, 0xb5, 0xf7, 0xa2,
+ 0xa8, 0x12, 0x13, 0xb8, 0xf7, 0x34, 0xf7, 0x7,
+ 0x15, 0x96, 0x63, 0x8b, 0x8b, 0x76, 0x1b, 0x49,
+ 0x74, 0x5f, 0x79, 0x59, 0xa7, 0x77, 0xb2, 0xb7,
+ 0xa7, 0xaf, 0xa6, 0xa1, 0x1f, 0x4e, 0xd6, 0xb3,
+ 0x89, 0xaa, 0x1b, 0xf3, 0xad, 0xe5, 0x92, 0x8d,
+ 0x1f, 0x80, 0x94, 0x5, 0x13, 0x78, 0x70, 0x66,
+ 0x66, 0x84, 0x68, 0x1b, 0x56, 0x55, 0x9d, 0x9f,
+ 0x6a, 0x1f, 0xb8, 0xec, 0x91, 0xa4, 0xa4, 0xf2,
+ 0x8, 0xf7, 0x12, 0x6, 0x92, 0xb5, 0x5, 0xfb,
+ 0xf, 0x6, 0x9d, 0xed, 0x96, 0xc9, 0xa3, 0xc2,
+ 0x8, 0xa1, 0x95, 0x9b, 0xac, 0xb4, 0x1b, 0xa2,
+ 0x97, 0x7e, 0x6c, 0x8f, 0x1f, 0x6d, 0x8e, 0x93,
+ 0x7d, 0xa4, 0x1b, 0x9e, 0x9f, 0x93, 0xad, 0xb1,
+ 0x6b, 0xb0, 0x50, 0xfb, 0x3e, 0x56, 0xfb, 0x76,
+ 0x42, 0x82, 0x1f, 0xfb, 0x2, 0x6, 0x82, 0x61,
+ 0x5, 0xf7, 0x5, 0x6, 0x61, 0xfb, 0x94, 0x15,
+ 0x13, 0xb8, 0x6c, 0x83, 0x67, 0x71, 0x73, 0x1b,
+ 0x69, 0x7f, 0xa0, 0x9b, 0x90, 0x8e, 0xb3, 0xbd,
+ 0xa5, 0x99, 0x81, 0x7c, 0xa0, 0x1f, 0xe, 0xf7,
+ 0x18, 0xc4, 0xf7, 0xa4, 0xc4, 0x1, 0xc4, 0xc8,
+ 0xf7, 0x9c, 0xc8, 0x3, 0xf7, 0xa, 0xf7, 0xda,
+ 0x15, 0xd3, 0xc4, 0xca, 0xd7, 0xd6, 0xc3, 0x4c,
+ 0x43, 0x41, 0x53, 0x4c, 0x40, 0x3f, 0x52, 0xca,
+ 0xd5, 0x1e, 0x47, 0xfb, 0x8a, 0x15, 0xe2, 0xe3,
+ 0x5, 0x73, 0xa5, 0xb9, 0x7f, 0xb7, 0x1b, 0xb6,
+ 0xb5, 0x97, 0xa3, 0xa4, 0x1f, 0xe4, 0x33, 0xb6,
+ 0xb8, 0x34, 0xe2, 0x5, 0xa2, 0xa6, 0x97, 0xb6,
+ 0xb6, 0x1a, 0xb6, 0x80, 0xb6, 0x73, 0xa6, 0x1e,
+ 0xe2, 0xe4, 0x60, 0xb6, 0x32, 0x34, 0x5, 0xa3,
+ 0x71, 0x5f, 0x96, 0x60, 0x1b, 0x60, 0x5f, 0x7f,
+ 0x74, 0x71, 0x1f, 0x34, 0xe2, 0x5e, 0x60, 0xe3,
+ 0x32, 0x5, 0x73, 0x71, 0x7f, 0x5f, 0x5f, 0x1a,
+ 0x60, 0x97, 0x60, 0xa3, 0x71, 0x1e, 0x33, 0x34,
+ 0x5, 0xe, 0xa0, 0x76, 0xf7, 0x4a, 0xb3, 0xe5,
+ 0xb3, 0xf7, 0xc1, 0x77, 0x1, 0xbf, 0x16, 0xf7,
+ 0xb1, 0x9b, 0x6, 0x53, 0x6a, 0xa0, 0xb7, 0x91,
+ 0x8c, 0x91, 0x8d, 0x91, 0x1f, 0x92, 0xa7, 0x8f,
+ 0x96, 0x99, 0xb7, 0x8, 0xf7, 0x48, 0x6, 0x97,
+ 0xb3, 0x5, 0xfb, 0x48, 0x6, 0xa3, 0xdd, 0x91,
+ 0x93, 0x5, 0xf7, 0x3e, 0x6, 0x97, 0xb3, 0x5,
+ 0xfb, 0x2b, 0x6, 0xf7, 0x32, 0xf7, 0x74, 0x5,
+ 0xb3, 0xab, 0xaa, 0xa0, 0x95, 0x1b, 0xe8, 0xa,
+ 0xa8, 0xab, 0x7c, 0x74, 0x84, 0x89, 0x83, 0x87,
+ 0x83, 0x1f, 0x77, 0x64, 0x35, 0xfb, 0x1a, 0x5c,
+ 0x53, 0x72, 0xe7, 0x61, 0xf5, 0x86, 0xa5, 0x8,
+ 0x89, 0x95, 0x8a, 0x94, 0x93, 0x1a, 0xaa, 0x9f,
+ 0x93, 0xbf, 0xcd, 0xa, 0xa3, 0xb7, 0x8d, 0x47,
+ 0x9f, 0x1f, 0xd4, 0xfb, 0x6f, 0x5, 0xfb, 0x20,
+ 0x6, 0x7f, 0x63, 0x5, 0xf7, 0x37, 0x6, 0x8e,
+ 0x81, 0x74, 0x3b, 0x5, 0xfb, 0x38, 0x6, 0x7f,
+ 0x63, 0x5, 0xf7, 0x39, 0x6, 0x73, 0x39, 0x5,
+ 0x48, 0x77, 0x50, 0x7a, 0x6a, 0x1b, 0xe, 0x39,
+ 0x8e, 0xe0, 0xa, 0xf7, 0x36, 0xf8, 0x1c, 0x15,
+ 0xb3, 0x6, 0xdd, 0xf7, 0xa6, 0x5, 0x65, 0x6,
+ 0xfb, 0x5d, 0xfd, 0x40, 0x15, 0xb5, 0x6, 0xd5,
+ 0xf7, 0x93, 0x5, 0x5e, 0x6, 0xe, 0xfb, 0x29,
+ 0xa0, 0xf7, 0x78, 0xa0, 0xf7, 0x9f, 0xa0, 0xe8,
+ 0xf7, 0x38, 0x7c, 0xa0, 0x12, 0xc0, 0xf2, 0x49,
+ 0xc4, 0xb0, 0xc8, 0xb5, 0xc5, 0xab, 0xc5, 0x13,
+ 0xed, 0xc0, 0xf7, 0xae, 0xf3, 0x15, 0x8d, 0x8e,
+ 0x5, 0x86, 0x96, 0x90, 0x89, 0xa0, 0x1b, 0xcf,
+ 0xb9, 0xc2, 0xd1, 0xc5, 0x70, 0xb3, 0x7d, 0x9c,
+ 0x1f, 0xfb, 0xf, 0xf7, 0x2a, 0x5, 0x7c, 0x9e,
+ 0x80, 0xa3, 0xa7, 0x1a, 0xca, 0xba, 0xa0, 0xbb,
+ 0xac, 0xa3, 0x7c, 0x7b, 0x81, 0x80, 0x82, 0x82,
+ 0x7f, 0x1e, 0x83, 0x81, 0x85, 0x80, 0x7b, 0x1a,
+ 0x13, 0xf3, 0xc0, 0x79, 0x98, 0x71, 0xac, 0xb6,
+ 0x94, 0xb7, 0xa0, 0xc0, 0x5c, 0xb9, 0x38, 0x41,
+ 0x42, 0x61, 0x37, 0x5e, 0xa3, 0x60, 0xb6, 0x58,
+ 0x1e, 0x89, 0x88, 0x5, 0x95, 0x76, 0x70, 0x8c,
+ 0x86, 0x1b, 0x55, 0x57, 0x5a, 0x3d, 0x60, 0xa4,
+ 0x56, 0xb9, 0x56, 0x1f, 0xd7, 0x34, 0x5, 0xb6,
+ 0x5a, 0x92, 0x76, 0x6f, 0x1a, 0x5a, 0x66, 0x63,
+ 0x47, 0x67, 0x6b, 0x9e, 0x9c, 0x95, 0x95, 0x92,
+ 0x95, 0x94, 0x1e, 0x13, 0xed, 0xc0, 0x96, 0x95,
+ 0x96, 0x97, 0xa4, 0x1a, 0xad, 0x73, 0x95, 0x75,
+ 0x52, 0x8b, 0x51, 0x80, 0x5c, 0xba, 0x51, 0xe7,
+ 0xd5, 0xda, 0xbe, 0xdf, 0xbe, 0x76, 0xa5, 0x61,
+ 0xc1, 0x1e, 0x13, 0xeb, 0xc0, 0xfb, 0x1b, 0xf7,
+ 0x6e, 0x15, 0xb5, 0xae, 0xa3, 0xa9, 0xa9, 0xa6,
+ 0x80, 0x4a, 0xbe, 0x1e, 0xbf, 0x49, 0x90, 0x6e,
+ 0x71, 0x1a, 0x58, 0x5f, 0x78, 0x75, 0x52, 0x20,
+ 0xf7, 0x17, 0xd1, 0x1e, 0xe, 0x73, 0xf8, 0x90,
+ 0xed, 0x1, 0xf6, 0xc6, 0xa, 0x3, 0xf6, 0xf8,
+ 0xc1, 0x23, 0xa, 0xf8, 0x27, 0x79, 0xb5, 0xf7,
+ 0x4, 0x9f, 0xf7, 0xef, 0x9f, 0xf0, 0xb5, 0x1,
+ 0xb4, 0xc2, 0xea, 0xd8, 0xf7, 0x89, 0x9b, 0xf7,
+ 0x1b, 0xc2, 0x3, 0xb4, 0xf7, 0xd7, 0x15, 0xfb,
+ 0x51, 0xf7, 0x29, 0xfb, 0x2c, 0xf7, 0x54, 0xf7,
+ 0x52, 0xf7, 0x27, 0xf7, 0x2c, 0xf7, 0x51, 0xf7,
+ 0x51, 0xfb, 0x27, 0xf7, 0x2e, 0xfb, 0x52, 0xfb,
+ 0x54, 0xfb, 0x29, 0xfb, 0x2e, 0xfb, 0x51, 0x1e,
+ 0xc2, 0x16, 0xf7, 0x33, 0xf7, 0x11, 0xf7, 0x22,
+ 0xf7, 0x35, 0xf7, 0x32, 0xf7, 0x10, 0xfb, 0x21,
+ 0xfb, 0x34, 0xfb, 0x33, 0xfb, 0x11, 0xfb, 0x20,
+ 0xfb, 0x31, 0xfb, 0x34, 0xfb, 0x12, 0xf7, 0x20,
+ 0xf7, 0x33, 0x1e, 0xf8, 0x47, 0x42, 0x15, 0x5e,
+ 0x78, 0x66, 0x5a, 0x49, 0x1b, 0x26, 0x62, 0xd7,
+ 0xf3, 0x8c, 0x1f, 0xeb, 0x8c, 0xb5, 0xd2, 0xe8,
+ 0x1b, 0xd8, 0xa6, 0x5d, 0x61, 0x90, 0x1f, 0x9b,
+ 0xd0, 0x6, 0x93, 0x86, 0x93, 0x7b, 0x90, 0x1e,
+ 0x93, 0x71, 0x72, 0x95, 0x59, 0x1b, 0xfb, 0x2a,
+ 0x49, 0xfb, 0x1, 0x39, 0xfb, 0x20, 0xea, 0x53,
+ 0xf7, 0x6, 0xb9, 0xb2, 0x95, 0x92, 0x9e, 0x1f,
+ 0x9b, 0x8f, 0x94, 0x8e, 0x8c, 0x97, 0x9c, 0xd9,
+ 0x18, 0xe, 0x3a, 0xf8, 0x2a, 0xad, 0xf7, 0x80,
+ 0x77, 0x12, 0xb5, 0xd4, 0xf7, 0x26, 0xaf, 0x13,
+ 0xe0, 0xf7, 0x87, 0xf8, 0x7a, 0x15, 0x80, 0x70,
+ 0x88, 0x7e, 0x7d, 0x1a, 0x81, 0x90, 0x7b, 0xa6,
+ 0xa7, 0xa1, 0xa1, 0xb7, 0xb2, 0x1e, 0x13, 0x70,
+ 0x84, 0x95, 0x5, 0x6f, 0x71, 0x7e, 0x80, 0x84,
+ 0x1b, 0x86, 0x8e, 0x9a, 0x99, 0x8e, 0x1f, 0x13,
+ 0xe0, 0x90, 0xa9, 0xba, 0xf7, 0x3a, 0x8d, 0x92,
+ 0x56, 0x8a, 0x18, 0x7f, 0x64, 0x5, 0x89, 0x6,
+ 0x9b, 0x89, 0x7a, 0xa4, 0x65, 0x1b, 0x35, 0x27,
+ 0xfb, 0x3, 0x33, 0x79, 0x92, 0x56, 0xd1, 0xb8,
+ 0xac, 0x9d, 0xca, 0xb7, 0x1f, 0xfb, 0x12, 0x89,
+ 0x15, 0xbd, 0xcc, 0xf7, 0xf, 0xd2, 0x98, 0x90,
+ 0x81, 0x64, 0x87, 0x1e, 0x5a, 0x86, 0x57, 0xfb,
+ 0xc, 0x4a, 0x1b, 0x83, 0x77, 0x95, 0xae, 0x1f,
+ 0xe, 0xce, 0xa, 0xc0, 0xf7, 0x6c, 0x68, 0xa,
+ 0x93, 0x78, 0xbb, 0x75, 0xbd, 0x1f, 0x81, 0xa2,
+ 0x80, 0xa3, 0x81, 0x9e, 0xa1, 0xa2, 0x9e, 0x9f,
+ 0x9b, 0x9c, 0x8, 0xd6, 0xdc, 0x99, 0xa2, 0x99,
+ 0x69, 0xa, 0xf7, 0x36, 0x82, 0x68, 0xa, 0x93,
+ 0x76, 0xc2, 0x73, 0xc0, 0x1f, 0x82, 0x9f, 0x82,
+ 0x9e, 0x82, 0x9c, 0xa2, 0xa3, 0x9f, 0xa0, 0x9c,
+ 0x9d, 0x8, 0xd4, 0xd9, 0x98, 0xa2, 0x99, 0x69,
+ 0xa, 0xe, 0xf7, 0xd2, 0xf7, 0x15, 0x76, 0xf7,
+ 0x84, 0xb1, 0x12, 0xf8, 0x92, 0xcf, 0x6d, 0xb5,
+ 0x13, 0xe0, 0xe1, 0xf7, 0xf0, 0x15, 0x13, 0xd0,
+ 0xf8, 0x62, 0xfb, 0x84, 0xb5, 0xf7, 0xaa, 0xfc,
+ 0x8c, 0x6, 0xe, 0xf8, 0x27, 0x79, 0xb5, 0xf7,
+ 0xe, 0x9a, 0x7c, 0xf7, 0x35, 0xfb, 0x35, 0xf7,
+ 0x47, 0xfb, 0x3e, 0xf7, 0x3e, 0xf7, 0x3b, 0xf7,
+ 0x42, 0x51, 0xb5, 0x71, 0xb5, 0x12, 0xb4, 0xc2,
+ 0x5f, 0xc2, 0xf7, 0x36, 0xcb, 0xf3, 0xce, 0x4e,
+ 0xce, 0xf7, 0x2e, 0xc2, 0x13, 0x92, 0x74, 0xf7,
+ 0xe1, 0xf7, 0xd9, 0x15, 0x13, 0x94, 0x74, 0xf7,
+ 0x3b, 0xb4, 0x7, 0x13, 0x92, 0x6c, 0xb1, 0xaa,
+ 0x78, 0x52, 0x56, 0x78, 0x65, 0x5a, 0x1f, 0x13,
+ 0x92, 0xb4, 0xfb, 0xe2, 0x16, 0xfb, 0x51, 0xf7,
+ 0x29, 0xfb, 0x2e, 0xf7, 0x54, 0xf7, 0x52, 0xf7,
+ 0x27, 0xf7, 0x2f, 0xf7, 0x51, 0x1e, 0x13, 0x91,
+ 0x74, 0xf7, 0x51, 0xfb, 0x27, 0xf7, 0x2b, 0xfb,
+ 0x52, 0x1e, 0x13, 0x92, 0xb4, 0xfb, 0x54, 0xfb,
+ 0x29, 0xfb, 0x2c, 0xfb, 0x51, 0x1f, 0xc2, 0x16,
+ 0x13, 0x91, 0x74, 0xf7, 0x33, 0xf7, 0x11, 0xf7,
+ 0x20, 0xf7, 0x35, 0xf7, 0x32, 0xf7, 0x10, 0xfb,
+ 0x1e, 0xfb, 0x34, 0xfb, 0x33, 0xfb, 0x11, 0xfb,
+ 0x23, 0xfb, 0x31, 0x1e, 0x13, 0x92, 0xb4, 0xfb,
+ 0x34, 0xfb, 0x12, 0xf7, 0x22, 0xf7, 0x33, 0x1f,
+ 0xf7, 0x11, 0xfb, 0x47, 0x15, 0xf7, 0x34, 0x6,
+ 0x13, 0xc2, 0x74, 0x9a, 0x7, 0x59, 0x90, 0x8d,
+ 0x8b, 0xb6, 0x1a, 0x13, 0xa2, 0x74, 0xed, 0xba,
+ 0x7, 0x2e, 0xca, 0xa4, 0x47, 0xab, 0x1b, 0xca,
+ 0x6, 0x13, 0x8a, 0x74, 0x94, 0x7, 0x78, 0x99,
+ 0x6d, 0xad, 0x71, 0xaf, 0x52, 0xd9, 0x18, 0x13,
+ 0xc2, 0x6c, 0xb8, 0x9a, 0xad, 0xb1, 0xbe, 0x1a,
+ 0xc9, 0x54, 0xa7, 0x50, 0x1e, 0xfb, 0x43, 0x7c,
+ 0x6, 0xbc, 0x86, 0x8a, 0x8c, 0x5f, 0x1a, 0xfb,
+ 0x83, 0x7, 0x60, 0x8c, 0x8b, 0x5a, 0x86, 0x1e,
+ 0xe, 0x73, 0xf8, 0xa8, 0xbe, 0x1, 0xee, 0xf7,
+ 0xcc, 0x3, 0xee, 0xf8, 0xa8, 0x15, 0xf7, 0xbf,
+ 0x6, 0x98, 0xbe, 0x5, 0xfb, 0xbf, 0x6, 0xe,
+ 0xb6, 0xf8, 0x1a, 0xad, 0xf7, 0x6e, 0xad, 0x1,
+ 0xf0, 0xb2, 0xf7, 0x64, 0xb2, 0x3, 0xf7, 0x20,
+ 0xf8, 0xab, 0x15, 0xc5, 0xb9, 0xbc, 0xc5, 0xc5,
+ 0xb9, 0x5c, 0x51, 0x51, 0x5d, 0x54, 0x51, 0x51,
+ 0x5d, 0xc0, 0xc5, 0x1e, 0x64, 0x16, 0x3b, 0xca,
+ 0x4a, 0xdb, 0xdb, 0xca, 0xce, 0xdb, 0xdb, 0x4c,
+ 0xc6, 0x3b, 0x3b, 0x4c, 0x4e, 0x3b, 0x1e, 0xe,
+ 0xf7, 0xd2, 0x8b, 0xce, 0xf7, 0x69, 0xcf, 0x54,
+ 0xb8, 0xf7, 0x3c, 0x77, 0x12, 0xf7, 0xc5, 0xcf,
+ 0x53, 0xb6, 0x13, 0xd8, 0xe1, 0x16, 0xf8, 0x8c,
+ 0xb5, 0xfc, 0x8c, 0x6, 0x13, 0xb8, 0xf7, 0x8f,
+ 0x4, 0x13, 0xb4, 0xf7, 0x7b, 0xfb, 0x3f, 0xb6,
+ 0xf7, 0x3f, 0xf7, 0x7a, 0xb8, 0xfb, 0x7a, 0xf7,
+ 0x3c, 0x60, 0xfb, 0x3c, 0xfb, 0x7b, 0x6, 0xe,
+ 0x52, 0xf7, 0xa3, 0xc0, 0xf7, 0xc1, 0xbe, 0x1,
+ 0xac, 0xf7, 0xa3, 0xc1, 0xa, 0x77, 0x7e, 0x60,
+ 0x1b, 0x29, 0x95, 0xa, 0xc2, 0x46, 0x79, 0x36,
+ 0x89, 0x75, 0xa, 0xe, 0x52, 0xf7, 0xa0, 0xb2,
+ 0x64, 0xd8, 0xf7, 0x24, 0x94, 0x82, 0xf7, 0x4f,
+ 0x6b, 0xab, 0x12, 0xf7, 0x82, 0xca, 0x6e, 0xce,
+ 0x13, 0x54, 0xf7, 0x11, 0xf8, 0x7d, 0x15, 0xc3,
+ 0xc4, 0x79, 0x37, 0x47, 0x4e, 0x77, 0x75, 0x7c,
+ 0x84, 0x95, 0x95, 0x83, 0x1f, 0x98, 0x81, 0x80,
+ 0x98, 0x70, 0x1b, 0x13, 0xac, 0x6c, 0x88, 0xa5,
+ 0xa, 0x7b, 0x93, 0x1f, 0x87, 0x8d, 0x5, 0x13,
+ 0x6a, 0xc9, 0xa, 0x66, 0x5a, 0x72, 0x67, 0x7b,
+ 0x1e, 0x83, 0xa, 0x73, 0xf8, 0x97, 0x76, 0xf7,
+ 0x3e, 0x77, 0x1, 0xf7, 0x48, 0xad, 0xa, 0xf7,
+ 0x33, 0xeb, 0x9f, 0xa, 0x9d, 0x9c, 0x9a, 0x1a,
+ 0x9d, 0x7d, 0x9c, 0x76, 0x80, 0x76, 0x7d, 0x9d,
+ 0xa, 0xe, 0xfb, 0x50, 0x76, 0xf7, 0x5b, 0xc2,
+ 0xf8, 0x13, 0x77, 0x1, 0x6d, 0xf4, 0xf7, 0x99,
+ 0xde, 0x3, 0xd9, 0xc7, 0x15, 0x4f, 0x9d, 0xbf,
+ 0x81, 0xaa, 0x1b, 0xbe, 0xcc, 0xb9, 0xbe, 0xb2,
+ 0x1f, 0x8d, 0x6, 0x89, 0x81, 0x85, 0x77, 0x81,
+ 0x1a, 0x68, 0x9d, 0x75, 0xaf, 0xaf, 0xa9, 0x95,
+ 0xba, 0xb7, 0x1e, 0x8e, 0x94, 0x5, 0x76, 0x71,
+ 0x7b, 0x86, 0x7c, 0x1b, 0x67, 0x98, 0xb4, 0xa0,
+ 0x8f, 0x1f, 0xd9, 0xf7, 0xe4, 0x5, 0x33, 0x6,
+ 0x47, 0xfb, 0xc3, 0x5, 0x72, 0x7a, 0x53, 0x54,
+ 0x58, 0x1b, 0x4f, 0x77, 0xb8, 0xc1, 0x96, 0x1f,
+ 0xce, 0xf7, 0xb0, 0x5, 0x33, 0x6, 0x36, 0xfc,
+ 0xa, 0x84, 0x6b, 0x7f, 0x68, 0x7c, 0x6a, 0x19,
+ 0x7d, 0x6c, 0x73, 0x66, 0x5a, 0x1a, 0x72, 0x91,
+ 0x76, 0xa7, 0xcb, 0x92, 0xf7, 0x0, 0xaf, 0xb4,
+ 0x87, 0xb4, 0x8f, 0xb6, 0x1e, 0xe, 0xf7, 0x3a,
+ 0xfb, 0x57, 0x76, 0xf9, 0xe7, 0xa6, 0x1, 0xf7,
+ 0x17, 0xfb, 0x6c, 0x15, 0xaf, 0x6, 0xf7, 0x88,
+ 0xf9, 0xe7, 0x5, 0xe6, 0x6, 0xfb, 0x88, 0xfd,
+ 0xe7, 0x5, 0xae, 0x6, 0xf7, 0x88, 0xf9, 0xe7,
+ 0x5, 0xcc, 0x6, 0x93, 0xa6, 0x5, 0xfb, 0x7a,
+ 0x6, 0xfb, 0x8a, 0x5c, 0xfb, 0x44, 0x4c, 0xfb,
+ 0x4, 0xed, 0x7a, 0xe7, 0x1f, 0xe, 0x20, 0xf7,
+ 0x5b, 0xf7, 0x3, 0x1, 0xd1, 0xf7, 0x3, 0x3,
+ 0xd1, 0xf7, 0x92, 0x84, 0xa, 0x73, 0xfb, 0x6d,
+ 0xaf, 0xf7, 0x49, 0x77, 0x1, 0xf7, 0x0, 0xd5,
+ 0x3, 0xdc, 0x16, 0x4c, 0x21, 0x94, 0x83, 0x5,
+ 0x91, 0x96, 0x9b, 0x8e, 0x99, 0x1b, 0xa0, 0x9e,
+ 0x81, 0x74, 0x6f, 0x6b, 0x7c, 0x68, 0x78, 0x77,
+ 0x8f, 0x95, 0x7c, 0x1f, 0x7a, 0x6e, 0x5, 0x7e,
+ 0xa3, 0xaf, 0x83, 0xaf, 0x1b, 0xc6, 0xc4, 0xa2,
+ 0xcb, 0xb5, 0x67, 0xa4, 0x64, 0x80, 0x80, 0x8b,
+ 0x88, 0x81, 0x1f, 0xb7, 0xcd, 0x5, 0xe, 0x52,
+ 0xf7, 0xa3, 0x9b, 0xf7, 0x6, 0x76, 0xf7, 0xbc,
+ 0x77, 0x1, 0xb6, 0xf7, 0x7f, 0x3, 0xb6, 0xf7,
+ 0xa3, 0x15, 0xf7, 0x49, 0x9b, 0x6, 0x68, 0x7e,
+ 0x96, 0x9b, 0x9c, 0x96, 0xa4, 0x96, 0xae, 0x1f,
+ 0xdd, 0xf7, 0x9c, 0x5, 0x8e, 0x92, 0x8c, 0x90,
+ 0x8f, 0x1a, 0x8e, 0x89, 0x8d, 0x87, 0x83, 0x2e,
+ 0x78, 0x88, 0x6e, 0x1e, 0x78, 0x7, 0x8c, 0x9b,
+ 0x97, 0x8b, 0x93, 0x1b, 0x97, 0x91, 0x86, 0x82,
+ 0x83, 0x8a, 0x81, 0x88, 0x84, 0x1f, 0x4c, 0xfb,
+ 0x63, 0x73, 0x3b, 0x83, 0x84, 0x4f, 0x7b, 0x19,
+ 0xe, 0x5c, 0xf7, 0xb9, 0xa3, 0xe4, 0xa3, 0xf7,
+ 0x5d, 0xa1, 0x8c, 0xa1, 0x1, 0xce, 0xd4, 0xf7,
+ 0x29, 0xd4, 0x3, 0xce, 0xf8, 0x82, 0x15, 0xe3,
+ 0xe8, 0xe9, 0xef, 0xd8, 0xa4, 0x59, 0x63, 0x40,
+ 0x34, 0x22, 0x23, 0x43, 0x6b, 0xb0, 0xbe, 0x1e,
+ 0xd4, 0x81, 0x15, 0x6c, 0x97, 0x74, 0xa7, 0xcf,
+ 0xb4, 0xf7, 0xb, 0xbe, 0xa6, 0x84, 0xa6, 0x70,
+ 0x48, 0x5b, 0xfb, 0x4, 0x51, 0x1e, 0xe, 0xce,
+ 0xa, 0xc2, 0xf8, 0x1c, 0x3, 0xf7, 0xff, 0xf7,
+ 0x73, 0x15, 0x49, 0xa, 0xfb, 0x36, 0x16, 0x49,
+ 0xa, 0xe, 0xd9, 0xa, 0xf7, 0x10, 0x9b, 0xf8,
+ 0x19, 0x77, 0x12, 0xac, 0xf9, 0x53, 0x13, 0x68,
+ 0x67, 0xa, 0x13, 0xbc, 0x94, 0xa, 0x13, 0xa8,
+ 0xfb, 0xb2, 0xfb, 0x31, 0x8c, 0xa, 0xfc, 0xc9,
+ 0xfc, 0x29, 0x15, 0xf7, 0x49, 0x6, 0x13, 0x10,
+ 0x9b, 0x7, 0x13, 0x1c, 0x71, 0x74, 0x95, 0x9d,
+ 0x8d, 0x8b, 0x8d, 0xf4, 0xf7, 0xe4, 0x1f, 0x8d,
+ 0x92, 0x8d, 0x8f, 0x8f, 0x1a, 0x8e, 0x8a, 0x8e,
+ 0x86, 0xdc, 0xa, 0x8c, 0x9c, 0x97, 0x8b, 0x93,
+ 0x1b, 0xa7, 0x80, 0x72, 0x7d, 0x87, 0x1f, 0x32,
+ 0xfb, 0xa7, 0x85, 0x78, 0x71, 0x7f, 0x69, 0x87,
+ 0x19, 0xe, 0xf8, 0x1d, 0x8b, 0xc0, 0x61, 0x76,
+ 0xf8, 0x0, 0xbf, 0xf7, 0xa2, 0x77, 0x12, 0xad,
+ 0xf7, 0x83, 0xfb, 0x24, 0xbe, 0xf8, 0x8c, 0xcc,
+ 0x13, 0x76, 0xf7, 0x15, 0x81, 0x8c, 0xa, 0x13,
+ 0xba, 0xfb, 0x12, 0xfd, 0x38, 0xc1, 0xa, 0x81,
+ 0x7e, 0x60, 0x1b, 0xfb, 0x0, 0x95, 0xa, 0xc3,
+ 0x46, 0x79, 0x36, 0x88, 0x75, 0xa, 0xfc, 0x3c,
+ 0xf7, 0x91, 0x15, 0xf7, 0x48, 0x6, 0x13, 0x0,
+ 0x9b, 0x7, 0x13, 0x18, 0x72, 0x6e, 0x96, 0x9b,
+ 0x90, 0x1f, 0xc8, 0xf7, 0x5d, 0xba, 0xf7, 0x2d,
+ 0x88, 0x1a, 0x8e, 0x8d, 0x93, 0x84, 0xdc, 0xa,
+ 0xb0, 0x8c, 0x5, 0x99, 0x8f, 0x86, 0x82, 0x7e,
+ 0x89, 0x88, 0x2f, 0xfb, 0xb0, 0x1f, 0x85, 0x78,
+ 0x72, 0x7f, 0x69, 0x87, 0x8, 0xe, 0xd9, 0xa,
+ 0xf7, 0xea, 0xf7, 0x4f, 0x12, 0xf7, 0x6e, 0xca,
+ 0x6e, 0xce, 0x13, 0x78, 0x67, 0xa, 0x94, 0xa,
+ 0x13, 0xb8, 0xfb, 0xb1, 0xfb, 0x31, 0x8c, 0xa,
+ 0xfc, 0x82, 0xfb, 0x4f, 0x15, 0xc3, 0xc4, 0x7e,
+ 0x32, 0x47, 0x4e, 0x77, 0x75, 0x7a, 0x7f, 0x98,
+ 0x97, 0x7f, 0x1f, 0x96, 0x80, 0x80, 0x95, 0x7d,
+ 0x1b, 0x68, 0x8b, 0xa5, 0xa, 0x77, 0x95, 0x1f,
+ 0x13, 0x74, 0xc9, 0xa, 0x1e, 0x13, 0x4, 0x66,
+ 0x5a, 0x72, 0x67, 0x7b, 0x1f, 0x83, 0xa, 0xfb,
+ 0x88, 0xa1, 0x12, 0xa5, 0xd5, 0xf7, 0x2c, 0xcb,
+ 0x55, 0xf5, 0x13, 0xe0, 0xf7, 0xb0, 0xf7, 0xb1,
+ 0x15, 0x73, 0x26, 0x54, 0x5f, 0x60, 0x68, 0x8,
+ 0x26, 0x39, 0x6a, 0x6c, 0x45, 0x1a, 0x41, 0xc2,
+ 0x56, 0xeb, 0x1e, 0xd2, 0xcd, 0xb2, 0xd2, 0xa8,
+ 0x7c, 0xa7, 0x73, 0x81, 0x6d, 0x86, 0x6d, 0x80,
+ 0x8f, 0x81, 0x8f, 0x81, 0x1f, 0x8f, 0x81, 0x8e,
+ 0x81, 0x7f, 0x1a, 0x5c, 0x4a, 0x8b, 0x86, 0x42,
+ 0x84, 0xc6, 0xa4, 0xd6, 0xba, 0xba, 0xbc, 0xc1,
+ 0x1e, 0xba, 0xbf, 0xbb, 0xc6, 0x93, 0xea, 0x8,
+ 0x13, 0xd0, 0x64, 0xf7, 0x1b, 0x15, 0x6e, 0xa3,
+ 0x85, 0xa, 0x73, 0x73, 0x6e, 0x1e, 0xe, 0x88,
+ 0xa, 0x58, 0x16, 0x9b, 0xa, 0x5f, 0x7d, 0xa0,
+ 0xa3, 0x9d, 0x93, 0xa8, 0xcf, 0xf7, 0xa, 0x1f,
+ 0xf7, 0x70, 0x6, 0xa2, 0xfb, 0x18, 0x8b, 0x82,
+ 0x82, 0x1a, 0x66, 0x74, 0x74, 0x53, 0x27, 0xa,
+ 0xc7, 0xf8, 0x4e, 0xb7, 0xa, 0xfb, 0x3, 0xf7,
+ 0x27, 0xc5, 0xa, 0x79, 0x8d, 0x56, 0xa, 0x9e,
+ 0x7f, 0x80, 0xa, 0x88, 0xa, 0xf7, 0xd3, 0xf9,
+ 0x56, 0x7f, 0xa, 0xfc, 0xa3, 0xfd, 0xf1, 0xe7,
+ 0xa, 0x64, 0x78, 0x9f, 0xa3, 0x9e, 0x94, 0xa2,
+ 0x96, 0xa0, 0x81, 0xa, 0xa1, 0xfb, 0x11, 0x8c,
+ 0x83, 0x82, 0x1a, 0x61, 0x78, 0x71, 0x4f, 0x27,
+ 0xa, 0xe, 0x5a, 0xa, 0xf7, 0x75, 0x77, 0x1,
+ 0x58, 0xf8, 0xfb, 0x3, 0xf7, 0x7f, 0x46, 0xa,
+ 0xfc, 0x4f, 0xfd, 0xfd, 0xe7, 0xa, 0x63, 0x79,
+ 0x9f, 0xa4, 0x9e, 0x94, 0xa1, 0x96, 0xa0, 0x81,
+ 0xa, 0xa3, 0xfb, 0x16, 0x8a, 0x82, 0x83, 0x1a,
+ 0x67, 0x71, 0x70, 0x56, 0x35, 0xa, 0x82, 0x68,
+ 0x7c, 0x19, 0xf7, 0x76, 0xf7, 0x8b, 0x4c, 0xa,
+ 0xe, 0x5a, 0xa, 0xdf, 0xac, 0xa, 0x13, 0xf4,
+ 0xf7, 0x83, 0xf9, 0x6d, 0x65, 0xa, 0x73, 0x97,
+ 0x96, 0x71, 0x1f, 0x13, 0xe8, 0x95, 0x73, 0x72,
+ 0x95, 0x71, 0x6c, 0xa, 0xfb, 0xb6, 0xfd, 0x6d,
+ 0xe7, 0xa, 0x64, 0x78, 0x9d, 0xa4, 0x9e, 0x94,
+ 0xa3, 0x96, 0xa0, 0x81, 0xa, 0xa1, 0xfb, 0x12,
+ 0x8c, 0x81, 0x84, 0x1a, 0x61, 0x70, 0x72, 0x57,
+ 0x27, 0xa, 0xe, 0x5a, 0xa, 0xd3, 0xed, 0x1,
+ 0xf7, 0x8a, 0xc6, 0xa, 0x3, 0x58, 0x16, 0x9b,
+ 0xa, 0x65, 0x77, 0xa0, 0x9f, 0xa3, 0x94, 0x9f,
+ 0x96, 0xa1, 0x81, 0xa, 0xa1, 0xfb, 0xf, 0x8c,
+ 0x7f, 0x84, 0x1a, 0x60, 0x72, 0x72, 0x55, 0x27,
+ 0xa, 0xfb, 0xf, 0xf8, 0x8f, 0x23, 0xa, 0x5a,
+ 0xa, 0xae, 0xf7, 0x3a, 0xab, 0xa, 0xf7, 0x39,
+ 0x12, 0x58, 0xf7, 0x4f, 0xf7, 0x28, 0xad, 0x69,
+ 0xf7, 0x39, 0xab, 0xa, 0xf7, 0x3a, 0x13, 0xf2,
+ 0x80, 0xf7, 0xb0, 0xf9, 0xa3, 0x15, 0x54, 0xb8,
+ 0x5e, 0xc2, 0x1e, 0x13, 0xe7, 0x20, 0xc2, 0xb8,
+ 0xb8, 0xc2, 0xc2, 0x5e, 0xb8, 0x54, 0x1f, 0x13,
+ 0xf2, 0x80, 0x54, 0x5e, 0x5e, 0x54, 0x1f, 0xad,
+ 0x16, 0xb3, 0xa, 0x13, 0xeb, 0x40, 0xe5, 0xa,
+ 0xfc, 0x5, 0xfd, 0xa3, 0xe7, 0xa, 0x65, 0x77,
+ 0xa0, 0x9f, 0xa3, 0x94, 0x9f, 0x96, 0xa1, 0x81,
+ 0xa, 0xa1, 0xfb, 0xf, 0x8c, 0x7f, 0x84, 0x1a,
+ 0x60, 0x72, 0x72, 0x55, 0x27, 0xa, 0xe, 0xf8,
+ 0xa8, 0x8b, 0xac, 0xf7, 0x5d, 0xb0, 0xc4, 0xe9,
+ 0xa, 0x1, 0xf9, 0x88, 0x9d, 0x3, 0x70, 0x16,
+ 0x9b, 0xa, 0x6e, 0x6a, 0x9b, 0xa2, 0xb2, 0xe4,
+ 0xe8, 0xad, 0xba, 0x1f, 0xf7, 0x52, 0x6, 0x5d,
+ 0xfb, 0x34, 0x7f, 0x63, 0x7b, 0x7f, 0x54, 0x85,
+ 0x19, 0x7b, 0xf8, 0x86, 0x7, 0xcb, 0xf7, 0x38,
+ 0x79, 0x90, 0x5, 0xfb, 0x3, 0x42, 0x49, 0x72,
+ 0xfb, 0x21, 0x1b, 0x6d, 0x6, 0x65, 0x81, 0x9f,
+ 0x9f, 0x9d, 0xba, 0xf7, 0x36, 0xa0, 0xd6, 0x1f,
+ 0xb3, 0x6, 0xeb, 0xa1, 0x84, 0x5d, 0x7b, 0x88,
+ 0x7a, 0x88, 0x7b, 0x1f, 0x9c, 0x87, 0xd0, 0xf7,
+ 0x7c, 0x79, 0x8f, 0x5, 0x2e, 0x60, 0x7c, 0x87,
+ 0xfb, 0x2d, 0x1b, 0xc8, 0xf7, 0x72, 0x5, 0xb0,
+ 0x95, 0x94, 0x8b, 0xc7, 0x1b, 0xf7, 0x4e, 0x81,
+ 0x76, 0x2a, 0x1f, 0x9c, 0x89, 0xac, 0xf7, 0x2d,
+ 0x5, 0xfc, 0x99, 0x7c, 0x6, 0xbd, 0x87, 0x99,
+ 0x8a, 0x72, 0x1a, 0x7d, 0x7a, 0x78, 0x7c, 0x79,
+ 0x1e, 0xfc, 0x16, 0xfc, 0x77, 0x71, 0x6b, 0x7a,
+ 0x77, 0x73, 0x85, 0x19, 0xf7, 0xa8, 0xf7, 0x93,
+ 0x15, 0xf7, 0x97, 0xf7, 0xde, 0x5, 0x91, 0x6,
+ 0x2f, 0xfb, 0xde, 0x5, 0xe, 0xf7, 0xca, 0xfb,
+ 0x58, 0x76, 0xf7, 0x5d, 0xb6, 0xd4, 0xa, 0x13,
+ 0xe8, 0xf7, 0x90, 0x21, 0x15, 0x93, 0x83, 0x5,
+ 0x91, 0x97, 0x9b, 0x8e, 0x9a, 0x1b, 0xa1, 0x9e,
+ 0x81, 0x74, 0x6e, 0x67, 0x7d, 0x67, 0x7a, 0x79,
+ 0xde, 0xa, 0xa3, 0xb0, 0x83, 0xaf, 0x1b, 0xc5,
+ 0xc4, 0xa3, 0xca, 0xb5, 0x67, 0xa4, 0x64, 0x80,
+ 0x81, 0x8b, 0x88, 0x80, 0x1f, 0xac, 0xbd, 0x5,
+ 0xf7, 0x1d, 0xde, 0xf4, 0xb5, 0xaf, 0x6f, 0xa,
+ 0x9d, 0x88, 0x5, 0x13, 0xd8, 0xb8, 0xa, 0x7f,
+ 0x76, 0x92, 0x91, 0x70, 0x1f, 0x13, 0xe8, 0x91,
+ 0x73, 0x6e, 0x90, 0x6a, 0xd5, 0xa, 0xfb, 0x4f,
+ 0xf7, 0x14, 0x3a, 0xf7, 0x5, 0x1f, 0xe, 0x8d,
+ 0xa, 0xf7, 0x73, 0x77, 0x1, 0xf8, 0x24, 0x9f,
+ 0xf7, 0x36, 0xa0, 0x3, 0x8b, 0xa, 0x68, 0x6d,
+ 0x98, 0xb2, 0x90, 0x8c, 0x90, 0x8c, 0x91, 0x1f,
+ 0x8d, 0x97, 0x99, 0x3c, 0xa, 0x7f, 0x80, 0xfb,
+ 0x2f, 0x74, 0xa, 0xf7, 0x50, 0x86, 0x76, 0x2a,
+ 0x41, 0xa, 0xf8, 0x42, 0xf9, 0x44, 0xb7, 0xa,
+ 0xfb, 0x1, 0xf7, 0x22, 0xc5, 0xa, 0x77, 0x92,
+ 0x56, 0xa, 0xa0, 0x7a, 0x80, 0xa, 0x8d, 0xa,
+ 0xf7, 0x73, 0x77, 0x1, 0xf8, 0xda, 0xa0, 0x3,
+ 0xf7, 0xdd, 0xf9, 0x56, 0x9e, 0xa, 0xf7, 0x38,
+ 0xf0, 0x9f, 0xa, 0x98, 0x97, 0x47, 0xa, 0x7c,
+ 0x82, 0x9d, 0xa, 0xfc, 0x79, 0xfd, 0xf1, 0x34,
+ 0xa, 0xf7, 0x92, 0x8b, 0xac, 0xf7, 0xbb, 0xac,
+ 0xf7, 0x99, 0xac, 0x89, 0xbe, 0xd1, 0xa, 0xf8,
+ 0x24, 0x9f, 0xf7, 0x36, 0xa0, 0x3, 0xf7, 0x98,
+ 0x46, 0xa, 0xfc, 0x36, 0xfd, 0xfd, 0x34, 0xa,
+ 0x8d, 0xa, 0xce, 0xed, 0x1, 0xf7, 0x9e, 0xc6,
+ 0xa, 0x3, 0x8a, 0x16, 0x32, 0xa, 0x7f, 0x80,
+ 0xfb, 0x2f, 0x74, 0xa, 0xf7, 0x50, 0x86, 0x76,
+ 0x2a, 0x41, 0xa, 0xf7, 0x9f, 0xf9, 0x85, 0x23,
+ 0xa, 0x73, 0x99, 0xa, 0x83, 0x16, 0x2a, 0xa,
+ 0xf7, 0xbe, 0xf9, 0x44, 0x77, 0xa, 0x73, 0x99,
+ 0xa, 0xf7, 0x66, 0xf9, 0x56, 0x9e, 0xa, 0xf7,
+ 0x21, 0xee, 0x9f, 0xa, 0x9b, 0x99, 0x47, 0xa,
+ 0x79, 0x80, 0x9d, 0xa, 0xfb, 0xf2, 0xfd, 0xef,
+ 0x15, 0x2a, 0xa, 0xe, 0x73, 0x9a, 0xa, 0xbe,
+ 0xd1, 0xa, 0x83, 0xf8, 0x45, 0x3, 0xf7, 0x17,
+ 0x46, 0xa, 0xfb, 0xbc, 0xfd, 0xfd, 0x15, 0x2a,
+ 0xa, 0xe, 0x73, 0x87, 0xa, 0xe2, 0xed, 0x1,
+ 0xf7, 0x1d, 0xc6, 0xa, 0x3, 0x83, 0x16, 0x2a,
+ 0xa, 0xf7, 0x25, 0xf9, 0x85, 0x23, 0xa, 0xf8,
+ 0x1, 0x8b, 0xa9, 0xf7, 0xbc, 0xb5, 0xf7, 0x93,
+ 0xa9, 0x1, 0xf7, 0x58, 0xee, 0xf7, 0xba, 0xf7,
+ 0x3, 0x3, 0xb1, 0xa, 0xf4, 0x4d, 0xf7, 0x35,
+ 0xfb, 0x7a, 0x1f, 0xfb, 0xaa, 0x7b, 0x6, 0xc4,
+ 0x9d, 0x76, 0x6d, 0x7a, 0x87, 0x79, 0x86, 0x78,
+ 0x1f, 0x5d, 0xfb, 0x38, 0x5, 0x31, 0x6, 0x7f,
+ 0x61, 0x5, 0xe5, 0x6, 0x5d, 0xfb, 0x38, 0x5,
+ 0x26, 0x6f, 0x86, 0x5e, 0x48, 0x1b, 0xf7, 0x8a,
+ 0xf7, 0xca, 0x15, 0xf7, 0x2d, 0x6, 0x97, 0xb5,
+ 0x5, 0xfb, 0x2d, 0x6, 0xb8, 0xf7, 0x39, 0x5,
+ 0xc1, 0x9a, 0x8e, 0xaf, 0xcc, 0xb2, 0xa, 0x55,
+ 0x7a, 0x9b, 0xa5, 0xa2, 0x97, 0xaa, 0x95, 0xaf,
+ 0x1f, 0xe, 0xf7, 0xca, 0x91, 0x76, 0xaf, 0x76,
+ 0xf9, 0x1e, 0xf7, 0x2f, 0xfb, 0x2c, 0x77, 0xee,
+ 0xc7, 0x56, 0xf2, 0x85, 0x77, 0x12, 0x13, 0x62,
+ 0x77, 0xe4, 0xa, 0x56, 0x7c, 0xa0, 0xab, 0x9c,
+ 0x90, 0x9e, 0x91, 0xa1, 0x1f, 0xf7, 0x0, 0xf8,
+ 0x26, 0x5, 0x8f, 0x6, 0x13, 0xa2, 0xf7, 0x78,
+ 0xfc, 0xb4, 0x5, 0x9d, 0x6, 0xf7, 0x2c, 0xf8,
+ 0xad, 0xa2, 0xdb, 0x9c, 0xa2, 0xc3, 0x97, 0x19,
+ 0x13, 0x5a, 0xeb, 0xa, 0x7, 0x13, 0x62, 0x7b,
+ 0x7, 0xbd, 0x9b, 0x74, 0x6d, 0x78, 0x87, 0x76,
+ 0x85, 0x77, 0x1f, 0x29, 0xfc, 0x2, 0x5, 0x88,
+ 0x6, 0x13, 0x5a, 0xfb, 0x62, 0xf8, 0x83, 0x5,
+ 0xfb, 0x35, 0x6, 0x13, 0x62, 0x7b, 0x7, 0xbb,
+ 0xa0, 0x78, 0x66, 0x9c, 0x1f, 0xfb, 0x13, 0xfc,
+ 0x57, 0x76, 0x3f, 0x78, 0x6d, 0x54, 0x83, 0x19,
+ 0xf7, 0xbd, 0xf9, 0x5d, 0x60, 0xa, 0x9d, 0xa9,
+ 0x7f, 0x80, 0xa8, 0x1f, 0x13, 0x5a, 0x80, 0xa7,
+ 0xa6, 0x81, 0x71, 0xa, 0x77, 0x74, 0x96, 0x96,
+ 0x71, 0x1f, 0x13, 0x54, 0x95, 0x73, 0x71, 0x96,
+ 0x71, 0xd6, 0xa, 0xbf, 0xa, 0xf7, 0x66, 0xa8,
+ 0xa, 0xc7, 0xf7, 0x77, 0x24, 0xa, 0xf7, 0xd4,
+ 0xf8, 0x71, 0x77, 0xa, 0xbf, 0xa, 0xf7, 0x66,
+ 0xa8, 0xa, 0xf8, 0x33, 0xf9, 0x56, 0x5e, 0xa,
+ 0xfc, 0x95, 0xfd, 0xe, 0x24, 0xa, 0xe, 0xb6,
+ 0xa, 0xac, 0xf8, 0xf7, 0xb1, 0x6c, 0xac, 0x8b,
+ 0xb1, 0xf7, 0x3d, 0xa8, 0xa, 0xf7, 0xd5, 0x46,
+ 0xa, 0xfc, 0x36, 0xfd, 0x1a, 0x24, 0xa, 0xe,
+ 0xb6, 0xa, 0xac, 0xf8, 0xff, 0xac, 0xd0, 0xf2,
+ 0x88, 0x77, 0x12, 0x86, 0xa, 0x13, 0xec, 0xf7,
+ 0xcf, 0xf9, 0x6d, 0x60, 0xa, 0x9c, 0xa6, 0x81,
+ 0x81, 0xa6, 0x1f, 0x7f, 0xa9, 0xa9, 0x7f, 0x9e,
+ 0x1b, 0x13, 0xdc, 0x43, 0xa, 0x78, 0x74, 0x96,
+ 0x96, 0x72, 0x1f, 0x13, 0xec, 0x96, 0x73, 0x70,
+ 0x95, 0x70, 0x6c, 0xa, 0xfb, 0x93, 0xfc, 0x8a,
+ 0x24, 0xa, 0xe, 0xb6, 0xa, 0xac, 0xf8, 0xb8,
+ 0xac, 0xf7, 0x14, 0xed, 0x12, 0xc7, 0xf4, 0xf8,
+ 0x8, 0xed, 0x62, 0xf4, 0x13, 0xf4, 0xc7, 0xf7,
+ 0x77, 0x24, 0xa, 0xf7, 0x40, 0xf8, 0xb2, 0x58,
+ 0xa, 0x13, 0xf8, 0x25, 0xa, 0xf7, 0xd2, 0xa8,
+ 0x76, 0xb4, 0x76, 0xf8, 0x56, 0x77, 0xb2, 0x77,
+ 0x12, 0xf7, 0x1e, 0xf8, 0x26, 0x13, 0x98, 0xf7,
+ 0x8, 0xc4, 0x15, 0xa7, 0x70, 0xf7, 0x57, 0xf7,
+ 0x53, 0x5, 0x13, 0x58, 0xf7, 0x57, 0xfb, 0x55,
+ 0xa7, 0xa8, 0xfb, 0x57, 0xf7, 0x56, 0xf7, 0x5c,
+ 0xf7, 0x5a, 0x5, 0x13, 0xa8, 0x6e, 0xa8, 0xfb,
+ 0x5b, 0xfb, 0x5a, 0xfb, 0x58, 0xf7, 0x58, 0x70,
+ 0x6e, 0xf7, 0x56, 0xfb, 0x58, 0x5, 0xe, 0xf8,
+ 0x1, 0x37, 0x76, 0xe2, 0xac, 0xf8, 0xfe, 0xac,
+ 0xc3, 0xa8, 0xa, 0xf7, 0x52, 0xd5, 0x15, 0x72,
+ 0xba, 0x8b, 0xe5, 0x98, 0x1a, 0xf7, 0x12, 0xf7,
+ 0x16, 0xf7, 0xaf, 0xf7, 0x3c, 0xaf, 0xa7, 0x81,
+ 0x7b, 0x9e, 0x1e, 0xfb, 0xdf, 0xfc, 0xc7, 0x15,
+ 0xf7, 0xf7, 0xf8, 0xa6, 0x5, 0x9d, 0x6f, 0x91,
+ 0x39, 0x62, 0x1a, 0xfb, 0x1, 0xfb, 0xe, 0xfb,
+ 0xbf, 0xfb, 0x44, 0x65, 0x71, 0x97, 0x9c, 0x7a,
+ 0x1e, 0xfb, 0x26, 0xfb, 0x29, 0x15, 0xb7, 0x6,
+ 0xd5, 0xf7, 0x0, 0x5, 0x7e, 0xa9, 0xad, 0x83,
+ 0xa7, 0x1b, 0xae, 0xa, 0xf7, 0x84, 0xf7, 0x5d,
+ 0xed, 0x65, 0xcd, 0x53, 0xb2, 0x1f, 0xcb, 0xeb,
+ 0x5, 0x5f, 0x6, 0x57, 0x3d, 0x5, 0x9a, 0x6a,
+ 0x67, 0x92, 0x66, 0x1b, 0xfb, 0x47, 0xfb, 0x78,
+ 0xfb, 0x6e, 0xfb, 0x71, 0x21, 0xb5, 0x4b, 0xc0,
+ 0x68, 0x1f, 0xe, 0xaa, 0xa, 0x77, 0xf7, 0x83,
+ 0x77, 0xa3, 0x77, 0x12, 0xcc, 0xa, 0x13, 0xec,
+ 0xf7, 0x13, 0xf9, 0x11, 0x29, 0xa, 0xf8, 0x4,
+ 0xbe, 0xb7, 0xa, 0x20, 0xf7, 0x22, 0x5, 0x13,
+ 0xdc, 0xa2, 0x79, 0x75, 0x92, 0x56, 0xa, 0xa2,
+ 0x7a, 0x80, 0xa, 0xaa, 0xa, 0x77, 0xf7, 0x87,
+ 0x77, 0x1, 0xcc, 0xa, 0x3, 0xf8, 0x33, 0xf9,
+ 0x56, 0x5e, 0xa, 0xfc, 0x52, 0xfb, 0x74, 0x29,
+ 0xa, 0xe, 0xaa, 0xa, 0xbe, 0xd1, 0xa, 0xcc,
+ 0xa, 0x3, 0xf7, 0xc6, 0x46, 0xa, 0xfb, 0xe4,
+ 0xfb, 0x80, 0x29, 0xa, 0xe, 0xb6, 0xa, 0xb4,
+ 0xf8, 0xfa, 0xdf, 0xa, 0xf1, 0xe5, 0xf7, 0x48,
+ 0xc6, 0xa, 0x13, 0xce, 0xf7, 0x13, 0xf9, 0x11,
+ 0x3a, 0xa, 0x13, 0xbe, 0xeb, 0xa, 0x7, 0x13,
+ 0xce, 0x37, 0xa, 0x13, 0xbe, 0xd2, 0xa, 0x13,
+ 0xce, 0xf7, 0x89, 0xf7, 0x8, 0x15, 0x13, 0xbe,
+ 0x21, 0xa, 0xf7, 0x5b, 0x99, 0xa, 0xcf, 0xa,
+ 0x59, 0x69, 0x9c, 0xba, 0x92, 0x8c, 0x91, 0x8d,
+ 0x93, 0x1f, 0x91, 0xa7, 0x92, 0xa1, 0xb8, 0xf7,
+ 0x2f, 0xf7, 0x6f, 0xf7, 0xa2, 0x18, 0xab, 0xb3,
+ 0x96, 0x93, 0xa6, 0x98, 0x8, 0xe8, 0xa, 0xab,
+ 0xac, 0x86, 0x67, 0x62, 0xfb, 0x1f, 0xfb, 0x2c,
+ 0x5e, 0x53, 0x1f, 0x73, 0xe7, 0x6c, 0xf5, 0x85,
+ 0xa5, 0x8, 0x89, 0x95, 0x8b, 0x93, 0x92, 0x1a,
+ 0xa4, 0xaa, 0x98, 0xb0, 0x8e, 0xcd, 0xa, 0xa9,
+ 0xa7, 0x88, 0x4c, 0x9d, 0x1f, 0xd8, 0xfb, 0xa1,
+ 0x51, 0xfb, 0x5e, 0x5, 0x49, 0x78, 0x57, 0x79,
+ 0x66, 0x1b, 0xf7, 0xa6, 0xf9, 0x46, 0x9e, 0xa,
+ 0xf7, 0x3f, 0xf5, 0x9f, 0xa, 0x91, 0x92, 0x47,
+ 0xa, 0x83, 0x87, 0x9d, 0xa, 0xe, 0x7d, 0xa,
+ 0xf7, 0x3e, 0xb0, 0xf7, 0xad, 0xa9, 0x6d, 0xf7,
+ 0x39, 0x12, 0xf8, 0x66, 0xf2, 0x13, 0xe8, 0x8b,
+ 0x4, 0xf7, 0x89, 0x9b, 0x6, 0x55, 0x7e, 0x9d,
+ 0xa5, 0x96, 0x8e, 0x98, 0x8f, 0x99, 0x1f, 0xa0,
+ 0xdd, 0x5, 0x84, 0xae, 0xad, 0x88, 0xab, 0x1b,
+ 0xf7, 0x2d, 0xf7, 0x1, 0xdb, 0xf7, 0x8, 0xf7,
+ 0x2b, 0xfb, 0x3b, 0x8c, 0x5f, 0x1f, 0x53, 0x6,
+ 0x99, 0xc9, 0x94, 0xaf, 0xa6, 0x9b, 0xab, 0x90,
+ 0x19, 0x13, 0xd8, 0x9b, 0xfb, 0x82, 0x7b, 0x7,
+ 0xb5, 0x86, 0xa5, 0x7e, 0x66, 0x1a, 0x7d, 0x83,
+ 0x6d, 0x85, 0x74, 0x1e, 0xfb, 0x7, 0xfc, 0x33,
+ 0x79, 0x4b, 0x7b, 0x7f, 0x58, 0x83, 0x19, 0xf7,
+ 0x6b, 0xf7, 0x57, 0xd8, 0xa, 0x9c, 0xa9, 0x1b,
+ 0xf7, 0x2, 0xa9, 0x60, 0x41, 0xfb, 0x1f, 0x30,
+ 0x72, 0x38, 0x6f, 0x70, 0x8d, 0x8d, 0x75, 0x1f,
+ 0xe, 0xfb, 0x63, 0xa3, 0x73, 0xf3, 0xdb, 0xa1,
+ 0xf9, 0x25, 0xa2, 0x12, 0xf8, 0x3, 0xe2, 0x62,
+ 0xdb, 0x13, 0xb4, 0xa2, 0x87, 0x15, 0x2c, 0x76,
+ 0x75, 0x37, 0x4c, 0x1b, 0x7d, 0x87, 0x8f, 0x90,
+ 0x8e, 0x8e, 0x8f, 0x8e, 0x92, 0x1f, 0x8e, 0x91,
+ 0x8e, 0x93, 0x92, 0x1a, 0x13, 0x74, 0x94, 0x84,
+ 0xa6, 0x6c, 0x74, 0x79, 0x80, 0x6a, 0x65, 0xaf,
+ 0x75, 0xb5, 0xf7, 0xe, 0xbf, 0xf7, 0x44, 0xb6,
+ 0x96, 0x1e, 0xf7, 0x3, 0xf8, 0x3e, 0x5, 0xb5,
+ 0x96, 0xb9, 0xf7, 0x44, 0xe1, 0x1b, 0xb4, 0xa2,
+ 0x70, 0x5b, 0x4d, 0x7b, 0x3f, 0x4b, 0x6b, 0x1f,
+ 0x74, 0x80, 0x7a, 0x89, 0x7f, 0x8a, 0x8, 0x7c,
+ 0x8a, 0x85, 0x8d, 0x7c, 0x1a, 0x80, 0x95, 0x89,
+ 0x99, 0x8a, 0x1e, 0x13, 0xb8, 0xab, 0x88, 0xbe,
+ 0x89, 0xfb, 0x1, 0x1a, 0x40, 0x61, 0xfb, 0x49,
+ 0x3a, 0x7e, 0x86, 0x94, 0x8f, 0x91, 0x8f, 0x8f,
+ 0x8e, 0x92, 0x1e, 0x8e, 0x90, 0x8d, 0x91, 0x95,
+ 0x1a, 0xa0, 0x7f, 0x9e, 0x71, 0x73, 0x77, 0x7b,
+ 0x6d, 0x58, 0xba, 0x7b, 0xaa, 0xf7, 0x28, 0xd3,
+ 0xf7, 0x4b, 0xd6, 0xdc, 0x5e, 0xc6, 0x3c, 0x91,
+ 0x1e, 0x8e, 0x7, 0x13, 0xb4, 0xc9, 0xa1, 0xf0,
+ 0xb2, 0xf3, 0x1a, 0xc7, 0x64, 0xd1, 0x28, 0xfb,
+ 0x22, 0x48, 0xfb, 0x20, 0xfb, 0x74, 0x58, 0x1e,
+ 0xe, 0xa1, 0xa, 0x33, 0xa, 0x13, 0xb8, 0x28,
+ 0xa, 0xf7, 0x9b, 0xf8, 0x13, 0x78, 0xa, 0xa1,
+ 0xa, 0xf7, 0x9c, 0xf8, 0x82, 0x7f, 0xa, 0x24,
+ 0xfc, 0x92, 0x22, 0xa, 0x13, 0xb8, 0x28, 0xa,
+ 0xe, 0x76, 0xa, 0x8b, 0xbe, 0xf7, 0x3d, 0x77,
+ 0x12, 0x9c, 0xdf, 0x13, 0x7c, 0xf7, 0x43, 0x55,
+ 0xa, 0x7d, 0xfc, 0x9e, 0x22, 0xa, 0x13, 0xbc,
+ 0x28, 0xa, 0xe, 0x76, 0xa, 0xda, 0xac, 0xa,
+ 0x9c, 0xdf, 0x13, 0xb6, 0xf7, 0x4c, 0xf8, 0x99,
+ 0x65, 0xa, 0x74, 0x97, 0x96, 0x71, 0x1f, 0x13,
+ 0x6a, 0x95, 0x73, 0x71, 0x95, 0x71, 0x6c, 0xa,
+ 0xf7, 0x1a, 0xfc, 0xe, 0x22, 0xa, 0x13, 0xb6,
+ 0x28, 0xa, 0xe, 0x76, 0xa, 0xce, 0xed, 0x12,
+ 0x9c, 0xdf, 0xe5, 0xc6, 0xa, 0x13, 0x7e, 0x33,
+ 0xa, 0x13, 0xbe, 0x28, 0xa, 0xe5, 0xf8, 0x54,
+ 0x23, 0xa, 0x76, 0xa, 0xbe, 0xac, 0x8b, 0xf7,
+ 0x17, 0xfb, 0x17, 0xf7, 0x3a, 0x12, 0x9c, 0xdf,
+ 0xf7, 0x1f, 0xf7, 0x38, 0xab, 0xa, 0xf7, 0x3a,
+ 0x13, 0x76, 0x40, 0x33, 0xa, 0x13, 0xb7, 0x0,
+ 0x28, 0xa, 0xf7, 0x1f, 0xf8, 0x76, 0x15, 0x54,
+ 0xb7, 0x5f, 0xc2, 0x1e, 0x13, 0xb6, 0x40, 0xc2,
+ 0xb8, 0xb7, 0xc2, 0xc2, 0x5e, 0xb8, 0x54, 0x1f,
+ 0x13, 0xb7, 0x0, 0x54, 0x5f, 0x5e, 0x54, 0x1f,
+ 0xac, 0x8a, 0x15, 0xb3, 0xa, 0x13, 0xba, 0x80,
+ 0xe5, 0xa, 0xe, 0xf7, 0xca, 0x80, 0xbd, 0xf8,
+ 0xd, 0xa4, 0x77, 0x9f, 0x12, 0xa2, 0xe1, 0xf7,
+ 0x53, 0xe3, 0xf7, 0x4e, 0xcd, 0x13, 0xbc, 0xf7,
+ 0xba, 0xf7, 0x20, 0x15, 0x90, 0x6, 0x89, 0x83,
+ 0x8a, 0x85, 0x82, 0x1a, 0x49, 0xab, 0x4d, 0xd9,
+ 0xeb, 0xe5, 0xf1, 0x95, 0x91, 0x1e, 0x81, 0x97,
+ 0x5, 0x48, 0x48, 0x58, 0x81, 0x76, 0x1b, 0x42,
+ 0x8b, 0xd6, 0xa8, 0xa3, 0x8c, 0x8d, 0x90, 0xa1,
+ 0x1f, 0xf7, 0xa, 0xad, 0xf7, 0x20, 0xb2, 0xf1,
+ 0x1a, 0xc7, 0x50, 0x9d, 0x75, 0x64, 0x62, 0x76,
+ 0x64, 0x65, 0x1e, 0x89, 0x8d, 0x9f, 0xc3, 0x44,
+ 0x89, 0x78, 0x60, 0x5, 0xa3, 0x80, 0x81, 0xa2,
+ 0x5b, 0x1b, 0xfb, 0x12, 0xfb, 0x2b, 0xfb, 0x6a,
+ 0xfb, 0x18, 0x5c, 0x9a, 0x50, 0xd3, 0xd7, 0xc6,
+ 0xda, 0xd3, 0xbc, 0x1f, 0xfb, 0x4d, 0x67, 0x15,
+ 0xed, 0xee, 0xf7, 0x6f, 0xe9, 0x99, 0xad, 0x88,
+ 0x54, 0x27, 0x20, 0xfb, 0x74, 0x29, 0x1e, 0x13,
+ 0x58, 0x69, 0x89, 0xaa, 0xad, 0x1f, 0xf7, 0xab,
+ 0xf7, 0x1, 0x15, 0xf7, 0x1d, 0xb5, 0xc7, 0xcd,
+ 0xbb, 0x1b, 0x13, 0xc, 0x9b, 0x9f, 0x7c, 0x6b,
+ 0x56, 0x59, 0x40, 0xfb, 0x1c, 0x6f, 0x1f, 0xe,
+ 0xe2, 0xfb, 0x6d, 0xaf, 0xdc, 0xad, 0xc3, 0xae,
+ 0xf8, 0x1f, 0xa0, 0x1, 0xa5, 0xe1, 0xd7, 0xd5,
+ 0xd7, 0xe2, 0x3, 0xf0, 0x28, 0x15, 0x94, 0x83,
+ 0x5, 0x91, 0x95, 0x98, 0x8c, 0x97, 0x1b, 0xa1,
+ 0xa0, 0x7e, 0x72, 0x6e, 0x69, 0x7d, 0x67, 0x79,
+ 0x78, 0xde, 0xa, 0xa2, 0xaf, 0x83, 0xaf, 0x1b,
+ 0xc6, 0xc5, 0xa2, 0xcb, 0xb4, 0x69, 0xa5, 0x65,
+ 0x7f, 0x7f, 0x8b, 0x88, 0x80, 0x1f, 0xb1, 0xc3,
+ 0xeb, 0x91, 0xc0, 0xd1, 0xa3, 0xa9, 0x19, 0x7b,
+ 0x95, 0x5, 0x63, 0x67, 0x5c, 0x62, 0x4f, 0x1b,
+ 0x4e, 0x69, 0xb8, 0xd8, 0xeb, 0xd4, 0xdb, 0xa,
+ 0x81, 0x86, 0x82, 0x87, 0x80, 0x1f, 0x88, 0x83,
+ 0x88, 0x81, 0x80, 0xa3, 0xa, 0xfb, 0x22, 0xfb,
+ 0x2d, 0xfb, 0x21, 0xfb, 0xa, 0xd0, 0x6a, 0xc7,
+ 0x85, 0x1e, 0xe, 0xe2, 0x80, 0xb8, 0xf7, 0xfc,
+ 0xa2, 0x8c, 0xa2, 0xf7, 0x73, 0x77, 0x1, 0xaa,
+ 0xe0, 0x3, 0xf7, 0x17, 0xf7, 0x5a, 0x15, 0x9c,
+ 0xb7, 0x5, 0x2d, 0xa, 0xf7, 0x68, 0xf7, 0xd0,
+ 0x78, 0xa, 0xe2, 0x80, 0xb8, 0xf8, 0xd, 0xa2,
+ 0xf7, 0x7a, 0x77, 0x12, 0xaa, 0xe0, 0xf7, 0x7b,
+ 0xcc, 0x17, 0xf7, 0x80, 0xad, 0xa, 0xf7, 0x3a,
+ 0xee, 0x9f, 0xa, 0x96, 0x99, 0x47, 0xa, 0x7e,
+ 0x80, 0x9d, 0xa, 0xfb, 0x9a, 0xfc, 0x55, 0x15,
+ 0x9c, 0xb7, 0x5, 0x3d, 0xa, 0x13, 0xd0, 0xb7,
+ 0x70, 0xad, 0x58, 0x1e, 0x5b, 0xa, 0x1f, 0x54,
+ 0xa, 0xe, 0xe2, 0x80, 0xb8, 0xf7, 0xf3, 0xa2,
+ 0x95, 0xa2, 0x8b, 0xbe, 0xf3, 0xcc, 0x8b, 0x77,
+ 0x1, 0xaa, 0xe0, 0xf7, 0x7b, 0xcc, 0x3, 0xf7,
+ 0x27, 0x55, 0xa, 0xfb, 0x41, 0xfc, 0x63, 0x15,
+ 0x9c, 0xb7, 0x5, 0x2d, 0xa, 0xe, 0xe2, 0x80,
+ 0xb8, 0xf8, 0xd, 0xa2, 0x7b, 0xa2, 0xce, 0xed,
+ 0x12, 0xaa, 0xe0, 0xb0, 0xc6, 0xa, 0x13, 0xde,
+ 0xf7, 0x17, 0xf7, 0x5a, 0x15, 0x9c, 0xb7, 0x5,
+ 0x13, 0xbe, 0x2d, 0xa, 0xa8, 0xf8, 0x11, 0x23,
+ 0xa, 0xd7, 0xa, 0xf9, 0x37, 0xe3, 0xa, 0xf7,
+ 0x72, 0xf7, 0x6, 0x2c, 0xa, 0x9d, 0xf8, 0x19,
+ 0xb7, 0xa, 0xfb, 0x3, 0xf7, 0x23, 0xc5, 0xa,
+ 0x79, 0x91, 0x56, 0xa, 0x9e, 0x7b, 0x80, 0xa,
+ 0xd7, 0xa, 0xf9, 0x37, 0xe3, 0xa, 0xf7, 0x18,
+ 0xad, 0xa, 0xf7, 0x3a, 0xef, 0x9f, 0xa, 0x97,
+ 0x98, 0x47, 0xa, 0x7d, 0x81, 0x9d, 0xa, 0x48,
+ 0xfc, 0xaa, 0x2c, 0xa, 0xe, 0xd7, 0xa, 0xf9,
+ 0x34, 0xe3, 0xa, 0xad, 0x55, 0xa, 0xaa, 0xfc,
+ 0xb7, 0x2c, 0xa, 0xe, 0xd7, 0xa, 0xf8, 0x9b,
+ 0xed, 0x1, 0xbc, 0xf2, 0xf2, 0xed, 0x3, 0xf7,
+ 0x72, 0xf7, 0x6, 0x2c, 0xa, 0xfb, 0x49, 0xf8,
+ 0x5a, 0x58, 0xa, 0xf7, 0x5d, 0x16, 0x20, 0xa,
+ 0xe, 0x80, 0xa0, 0xf7, 0x46, 0xa0, 0xf8, 0x6e,
+ 0x77, 0x12, 0xa6, 0xdf, 0xf7, 0xa5, 0xde, 0x17,
+ 0xf7, 0x3, 0xf2, 0x15, 0xf7, 0xa, 0xe6, 0xf7,
+ 0x5b, 0xf7, 0x4, 0xbb, 0xa1, 0x5f, 0x57, 0x20,
+ 0x3c, 0xfb, 0x63, 0xfb, 0x6, 0x59, 0x6d, 0xaf,
+ 0xc4, 0x1e, 0xf7, 0xaf, 0xf7, 0xb5, 0x15, 0xa9,
+ 0x7d, 0x6a, 0x9e, 0x66, 0x1b, 0xfb, 0x1b, 0xfb,
+ 0x28, 0xfb, 0x35, 0xfb, 0x27, 0x38, 0xb8, 0x4e,
+ 0xf5, 0xf7, 0x2d, 0xf7, 0x1c, 0xf7, 0x43, 0xf7,
+ 0x5c, 0xec, 0x67, 0xce, 0x59, 0xc1, 0x1f, 0xf0,
+ 0xb8, 0x6b, 0xa7, 0x28, 0x60, 0x64, 0xac, 0x5b,
+ 0xa9, 0x63, 0x93, 0x19, 0x68, 0x7a, 0xaf, 0x7d,
+ 0xb3, 0x6b, 0xab, 0x6c, 0x19, 0xfb, 0xf, 0x55,
+ 0xac, 0x6e, 0xf7, 0x9, 0xbe, 0xaf, 0x5e, 0xa6,
+ 0x5a, 0x94, 0x45, 0x19, 0xe, 0xbe, 0xa, 0xda,
+ 0xac, 0xa, 0xf7, 0xfd, 0xdc, 0x13, 0x6a, 0x89,
+ 0xa, 0xc3, 0xa, 0x13, 0xaa, 0x51, 0xa, 0x7b,
+ 0x7, 0xc1, 0x92, 0x76, 0x7c, 0x1f, 0x13, 0x76,
+ 0x76, 0x4b, 0xfb, 0x74, 0x6c, 0xfb, 0x5, 0x1e,
+ 0xf7, 0x1b, 0xa2, 0xa, 0xa7, 0x1f, 0x80, 0xa8,
+ 0x57, 0xa, 0x77, 0x72, 0x98, 0x96, 0x70, 0x1f,
+ 0x13, 0x6a, 0x95, 0x74, 0x72, 0x94, 0x72, 0xd6,
+ 0xa, 0xa4, 0xa, 0xa6, 0xf7, 0x19, 0x26, 0xa,
+ 0xf7, 0x91, 0xf7, 0xfc, 0xb7, 0xa, 0xfb, 0x5,
+ 0xf7, 0x26, 0xc5, 0xa, 0x7b, 0x8e, 0x56, 0xa,
+ 0x9c, 0x7e, 0x80, 0xa, 0xa4, 0xa, 0xf7, 0x9c,
+ 0xad, 0xa, 0xf7, 0x33, 0xed, 0x9f, 0xa, 0x9d,
+ 0x9a, 0x47, 0xa, 0x77, 0x7f, 0x9d, 0xa, 0xfc,
+ 0x17, 0xfc, 0x95, 0x26, 0xa, 0xe, 0x80, 0xa0,
+ 0xf8, 0x18, 0xa0, 0x8c, 0xa0, 0x8b, 0xbe, 0xf3,
+ 0xcc, 0x8b, 0x77, 0x92, 0xa, 0xf7, 0x39, 0x55,
+ 0xa, 0xfb, 0xbb, 0xfc, 0xa4, 0x26, 0xa, 0xe,
+ 0x80, 0xa0, 0xf8, 0x21, 0xa0, 0xe7, 0xac, 0xa,
+ 0xa6, 0xdf, 0xf7, 0xa5, 0xdf, 0x13, 0xee, 0xf7,
+ 0x3d, 0xf8, 0x99, 0x60, 0xa, 0x9c, 0xa6, 0x81,
+ 0x80, 0xa7, 0x1f, 0x80, 0xa8, 0xa9, 0x7f, 0x9e,
+ 0x1b, 0x43, 0xa, 0x77, 0x74, 0x97, 0x96, 0x71,
+ 0x1f, 0x13, 0xd6, 0x95, 0x73, 0x71, 0x95, 0x71,
+ 0x6c, 0xa, 0xfb, 0x22, 0xfc, 0x14, 0x26, 0xa,
+ 0xe, 0x80, 0xa0, 0xf8, 0x25, 0xa0, 0xd7, 0xed,
+ 0x12, 0xa6, 0xdf, 0xdb, 0xed, 0xea, 0xdf, 0x3e,
+ 0xed, 0x13, 0xfc, 0xa6, 0xf7, 0x19, 0x26, 0xa,
+ 0xdb, 0xf8, 0x3d, 0x58, 0xa, 0x13, 0xfa, 0x25,
+ 0xa, 0xf7, 0xd2, 0x80, 0xf7, 0x3, 0xf7, 0xc,
+ 0xcd, 0x53, 0xb9, 0xf7, 0x16, 0xf7, 0x3, 0x12,
+ 0xf7, 0xaf, 0xf7, 0x3, 0x23, 0xe1, 0x13, 0xb8,
+ 0xe1, 0xf7, 0x7a, 0x15, 0xf8, 0x8c, 0xb9, 0xfc,
+ 0x8c, 0x6, 0xf7, 0x8b, 0xf7, 0x2f, 0x15, 0x13,
+ 0xd4, 0x8e, 0xa, 0x8d, 0xfc, 0x4e, 0x15, 0x8e,
+ 0xa, 0xe, 0x82, 0xa2, 0xf8, 0x28, 0xa1, 0x12,
+ 0xa7, 0xdf, 0xf7, 0xa5, 0xdf, 0x17, 0xf7, 0x20,
+ 0xa8, 0x15, 0x78, 0x9c, 0x82, 0x97, 0xd7, 0x1a,
+ 0xd9, 0xd8, 0xf7, 0x62, 0xf7, 0x1f, 0x1e, 0xfb,
+ 0x35, 0xfc, 0x28, 0x15, 0xf7, 0x52, 0xf8, 0x1c,
+ 0x5, 0xaa, 0x67, 0x88, 0x71, 0x58, 0x1a, 0x7c,
+ 0x64, 0xfb, 0x9c, 0xfb, 0x47, 0x1e, 0x60, 0x79,
+ 0x15, 0x4b, 0xfb, 0x17, 0x5, 0xae, 0x6, 0x13,
+ 0xf0, 0xc8, 0xf7, 0x12, 0x5, 0x13, 0x50, 0xf7,
+ 0x61, 0xf7, 0x0, 0xf7, 0x54, 0xf7, 0x0, 0xcf,
+ 0x6f, 0xc6, 0x44, 0x9c, 0x1f, 0xc5, 0xf7, 0xb,
+ 0x5, 0x69, 0x6, 0x54, 0xfb, 0x6, 0x5, 0x13,
+ 0x20, 0xfb, 0x3b, 0xfb, 0x24, 0xfb, 0x34, 0xfb,
+ 0x25, 0x1f, 0x13, 0x0, 0x53, 0xa1, 0x4c, 0xd5,
+ 0x77, 0x1e, 0xe, 0xa0, 0xa, 0xf7, 0xdd, 0xf7,
+ 0x77, 0x3b, 0xa, 0xae, 0xf7, 0x9d, 0xb7, 0xa,
+ 0xfb, 0x4, 0xf7, 0x25, 0xc5, 0xa, 0x7a, 0x8f,
+ 0x56, 0xa, 0x9d, 0x7d, 0x80, 0xa, 0xa0, 0xa,
+ 0xf7, 0x92, 0xf8, 0x82, 0x7e, 0xa, 0x3b, 0xfc,
+ 0x38, 0x3b, 0xa, 0xe, 0x82, 0xba, 0x6f, 0x76,
+ 0xf8, 0x4f, 0xc7, 0xf7, 0x3d, 0xa9, 0xa, 0xe5,
+ 0x13, 0xb0, 0xf7, 0x39, 0xf8, 0x80, 0x15, 0xb2,
+ 0x6, 0x13, 0xbc, 0x39, 0xa, 0x92, 0xfc, 0x46,
+ 0x53, 0xa, 0x13, 0xac, 0x2e, 0xa, 0x13, 0x70,
+ 0xa6, 0xa, 0x82, 0xba, 0x6f, 0x76, 0xf8, 0x9b,
+ 0xed, 0x12, 0xb5, 0xd8, 0xc9, 0xc6, 0xa, 0x13,
+ 0xac, 0xf7, 0xdd, 0xf7, 0x77, 0x53, 0xa, 0x13,
+ 0xbc, 0x2b, 0xa, 0x13, 0x7c, 0x5d, 0xa, 0x62,
+ 0xa, 0xfb, 0x28, 0xf7, 0xde, 0x23, 0xa, 0xe2,
+ 0xfb, 0x62, 0xb8, 0xf8, 0xee, 0x77, 0xf7, 0x87,
+ 0x77, 0x12, 0xf8, 0x16, 0xc7, 0xa, 0xdb, 0x7c,
+ 0x5f, 0xf7, 0x5, 0x7e, 0x1b, 0x79, 0x3d, 0x7b,
+ 0x83, 0x5b, 0x1f, 0x98, 0xa, 0x9e, 0x4f, 0xe2,
+ 0xa, 0xaf, 0xfb, 0x32, 0x7a, 0xa, 0x84, 0x84,
+ 0x8f, 0x91, 0x84, 0x1f, 0x93, 0x81, 0x7f, 0x95,
+ 0x79, 0x96, 0xa, 0x1f, 0x13, 0x70, 0x70, 0xa,
+ 0x73, 0x99, 0x82, 0x99, 0x83, 0x1f, 0x98, 0x83,
+ 0x98, 0x84, 0x77, 0xa7, 0xa, 0x6f, 0xf8, 0x3a,
+ 0x7e, 0xa, 0xe, 0xfb, 0x4c, 0x76, 0xf7, 0x6b,
+ 0x76, 0xf8, 0x2d, 0xb6, 0xf7, 0x86, 0x77, 0x48,
+ 0xa, 0x77, 0x1f, 0x89, 0x8d, 0x91, 0x9c, 0xdd,
+ 0xf7, 0xce, 0x8e, 0x97, 0x19, 0x13, 0x90, 0x86,
+ 0x90, 0x58, 0x81, 0x58, 0x84, 0x59, 0x85, 0x19,
+ 0x7a, 0x7, 0xba, 0x9a, 0x7d, 0x75, 0x7a, 0x84,
+ 0x76, 0x85, 0x75, 0x1f, 0x6a, 0xfb, 0x9, 0xfb,
+ 0xf, 0xfc, 0x64, 0x76, 0x35, 0x8, 0x6b, 0x83,
+ 0x82, 0xda, 0xa, 0x74, 0x66, 0x90, 0xb9, 0x9e,
+ 0xa4, 0xe5, 0x93, 0xaf, 0x1f, 0xe, 0xe2, 0xfb,
+ 0x4d, 0x76, 0xf9, 0x1b, 0x77, 0xe2, 0xed, 0x12,
+ 0xf7, 0x23, 0xc6, 0xa, 0x54, 0xb3, 0x13, 0xf4,
+ 0xf7, 0x9c, 0xd3, 0x15, 0x6a, 0xf7, 0x3f, 0x5,
+ 0xd6, 0x7d, 0x5e, 0xf7, 0xf, 0x7e, 0x1b, 0x79,
+ 0x8a, 0x3d, 0x7c, 0x5b, 0x83, 0x8, 0x13, 0xb8,
+ 0x98, 0xa, 0x9f, 0x43, 0xe2, 0xa, 0xae, 0xfb,
+ 0x26, 0x7a, 0xa, 0x82, 0x83, 0x93, 0x92, 0x81,
+ 0x1f, 0x92, 0x82, 0x80, 0x91, 0x7d, 0x96, 0xa,
+ 0x1f, 0x13, 0x74, 0x70, 0xa, 0x75, 0x97, 0x83,
+ 0x98, 0x83, 0x1f, 0x99, 0x82, 0x9a, 0x84, 0x75,
+ 0xa7, 0xa, 0xfb, 0xd, 0xf8, 0x79, 0x58, 0xa,
+ 0x13, 0xf8, 0x25, 0xa, 0xd7, 0xa, 0xf8, 0x58,
+ 0xe3, 0xa, 0xf7, 0x72, 0xf7, 0x6, 0x3f, 0xa,
+ 0x64, 0x84, 0x38, 0x7b, 0x65, 0x89, 0x19, 0x3e,
+ 0xa, 0xe, 0x6e, 0xa, 0x54, 0x5e, 0x8b, 0xb7,
+ 0xac, 0xac, 0xe4, 0xab, 0xf7, 0x11, 0x1f, 0xf7,
+ 0x22, 0xde, 0x99, 0xbc, 0xfb, 0x23, 0x36, 0xb9,
+ 0xf7, 0x31, 0xaa, 0xf5, 0x9b, 0x82, 0xc8, 0x94,
+ 0x19, 0xc4, 0xa, 0xc3, 0x9f, 0x78, 0x6e, 0x7b,
+ 0x87, 0x77, 0x85, 0x76, 0x1f, 0x4f, 0xfb, 0x6a,
+ 0x28, 0x50, 0x7e, 0x5b, 0xee, 0xc6, 0x5c, 0xfb,
+ 0x3e, 0x7a, 0x4d, 0x79, 0x7e, 0x5a, 0x82, 0x19,
+ 0xe, 0xd7, 0xa, 0xf9, 0x4a, 0x77, 0x1, 0xb0,
+ 0xd7, 0x3, 0xf7, 0x74, 0xd3, 0xa, 0x7e, 0x88,
+ 0x95, 0x97, 0x9c, 0x94, 0xa0, 0x8d, 0x92, 0x1f,
+ 0xd5, 0xf7, 0xaf, 0xec, 0xbd, 0x97, 0xb9, 0x2a,
+ 0x59, 0xcc, 0xf7, 0x8e, 0x86, 0x90, 0x57, 0x7f,
+ 0x57, 0x82, 0x57, 0x85, 0x19, 0x7b, 0x7, 0xa5,
+ 0xb2, 0x82, 0x71, 0x81, 0x6f, 0xfb, 0x0, 0x6e,
+ 0xfb, 0x1, 0x1f, 0x43, 0x67, 0x7f, 0x5d, 0xd3,
+ 0xaf, 0x5, 0x62, 0xfb, 0x28, 0x6b, 0xfb, 0xf,
+ 0x81, 0xb5, 0xa, 0xf8, 0xdf, 0x83, 0xab, 0x73,
+ 0xac, 0xf7, 0xbb, 0xe9, 0xa, 0x78, 0xab, 0x12,
+ 0xbc, 0xf7, 0x0, 0x13, 0xb4, 0xf9, 0x84, 0xf7,
+ 0x74, 0x15, 0x9f, 0x89, 0xcd, 0xf7, 0x7a, 0x79,
+ 0x8f, 0x5, 0x37, 0x64, 0x7b, 0x80, 0xfb, 0x39,
+ 0x1b, 0xcb, 0xf7, 0x77, 0x5, 0x9a, 0x8f, 0x91,
+ 0x9c, 0xa6, 0x1b, 0xeb, 0x6, 0xf7, 0xc, 0x8b,
+ 0x69, 0x38, 0x1f, 0x9b, 0x6, 0xaa, 0xf7, 0x2a,
+ 0x5, 0xfc, 0x5, 0x6, 0x7b, 0x71, 0x8f, 0x8e,
+ 0x6f, 0x1f, 0x13, 0xac, 0x8f, 0x6e, 0x6d, 0x8d,
+ 0x73, 0x1b, 0xfb, 0x5e, 0xfb, 0x53, 0xfb, 0x5e,
+ 0xfb, 0x88, 0xfb, 0x14, 0xf0, 0x27, 0xf7, 0xc,
+ 0xb2, 0xae, 0x8d, 0x8d, 0xad, 0x1f, 0x13, 0x74,
+ 0x8d, 0xae, 0xae, 0x8d, 0xb3, 0x1b, 0xf7, 0xee,
+ 0x6, 0xcc, 0xf7, 0x3a, 0x7b, 0x91, 0x5, 0x49,
+ 0x5b, 0x56, 0x42, 0xfb, 0x37, 0x1b, 0x46, 0x71,
+ 0x8d, 0xae, 0x99, 0x95, 0xad, 0x90, 0x9f, 0x1f,
+ 0xbf, 0xf7, 0x52, 0x5, 0xf7, 0x1f, 0xa7, 0x7a,
+ 0x5e, 0x1f, 0x87, 0x71, 0x8f, 0xa0, 0x85, 0x66,
+ 0x8, 0xfb, 0xba, 0x72, 0x15, 0x13, 0xac, 0xfb,
+ 0x3, 0x6d, 0x72, 0x4b, 0x21, 0x1b, 0xfb, 0x1f,
+ 0x8a, 0xf7, 0x20, 0xb6, 0xf7, 0x45, 0xf7, 0x7,
+ 0xf7, 0x8e, 0xf7, 0x42, 0xca, 0xb5, 0x6c, 0x58,
+ 0x7a, 0x7e, 0x62, 0x84, 0x70, 0x1f, 0xe, 0xf7,
+ 0xca, 0x7f, 0xa0, 0x76, 0xb5, 0x77, 0x76, 0xf8,
+ 0x41, 0xa2, 0x12, 0x9f, 0xde, 0x13, 0x58, 0xf7,
+ 0xc3, 0xc3, 0x15, 0x62, 0x9e, 0xb3, 0x70, 0xb8,
+ 0x1b, 0xe0, 0xd6, 0xcf, 0xb1, 0xb0, 0x1f, 0x80,
+ 0x96, 0x5, 0x5f, 0x52, 0x63, 0x6c, 0x59, 0x1b,
+ 0x79, 0x54, 0x99, 0xcf, 0xa0, 0x8d, 0xaf, 0x94,
+ 0x99, 0x1f, 0x93, 0x97, 0xf0, 0x8a, 0xe5, 0xcc,
+ 0x8, 0xb7, 0xab, 0x9e, 0xb6, 0xa6, 0x1a, 0x92,
+ 0x85, 0xd4, 0x49, 0x61, 0x5c, 0x86, 0x40, 0x3c,
+ 0x1e, 0x93, 0x89, 0x73, 0xd3, 0x32, 0x1b, 0xfb,
+ 0xe, 0xfb, 0x29, 0xfb, 0x37, 0xfb, 0x1e, 0x1f,
+ 0x13, 0x38, 0xfb, 0x3, 0xdf, 0x63, 0xc2, 0xd5,
+ 0xae, 0xac, 0xad, 0xae, 0x1e, 0xfb, 0x5c, 0xc1,
+ 0x15, 0xf7, 0x5, 0xe1, 0xf7, 0x57, 0xe6, 0xc3,
+ 0x92, 0x61, 0x6e, 0x1e, 0x13, 0x98, 0x66, 0x5a,
+ 0xfb, 0xc1, 0xfb, 0xe, 0x46, 0x8b, 0xd6, 0xa5,
+ 0x1e, 0xf7, 0xb2, 0xea, 0x15, 0xf7, 0x8, 0xa9,
+ 0xd7, 0xea, 0xc1, 0x1b, 0xa2, 0x93, 0x70, 0x74,
+ 0x7a, 0x83, 0x5c, 0x54, 0x60, 0x1f, 0x6a, 0x72,
+ 0x73, 0x84, 0x44, 0x75, 0x8, 0xe, 0x79, 0xae,
+ 0x80, 0x76, 0xf9, 0x1c, 0xac, 0x8c, 0x77, 0x12,
+ 0xbe, 0x9f, 0xc7, 0xe3, 0x13, 0x6c, 0xb9, 0xa,
+ 0x9a, 0x85, 0x83, 0x9e, 0x1f, 0x13, 0xac, 0x81,
+ 0xa4, 0xaa, 0x7f, 0xb2, 0x6d, 0xa, 0x13, 0x9c,
+ 0xb3, 0xf7, 0x5b, 0x5, 0x74, 0x6, 0x78, 0x80,
+ 0x7a, 0x85, 0x78, 0x1b, 0x78, 0x75, 0x91, 0x91,
+ 0x7a, 0x1f, 0x13, 0xac, 0x91, 0x79, 0x7d, 0x91,
+ 0x5e, 0x64, 0xa, 0x13, 0x6c, 0xf7, 0x98, 0xf8,
+ 0x84, 0x52, 0xa, 0xab, 0x93, 0x76, 0xf8, 0x43,
+ 0xa2, 0xf7, 0x70, 0x77, 0x12, 0xf7, 0x1, 0xd4,
+ 0x8b, 0xf7, 0x28, 0x25, 0xd7, 0x13, 0xf4, 0xc2,
+ 0xa, 0x99, 0x9a, 0x87, 0x86, 0x99, 0x1f, 0x86,
+ 0x9a, 0x9b, 0x86, 0x9a, 0x1b, 0xc3, 0xe8, 0xa4,
+ 0xf7, 0x1, 0xb5, 0x6d, 0xb6, 0x6d, 0xb3, 0x1f,
+ 0x6c, 0xb4, 0x6c, 0xb2, 0xab, 0x1a, 0xbc, 0xab,
+ 0x94, 0xa1, 0x1e, 0x13, 0xf8, 0xcc, 0xa8, 0x51,
+ 0x52, 0x1f, 0x9b, 0x6, 0xbb, 0xa, 0x7b, 0x80,
+ 0x90, 0x90, 0x7e, 0x1f, 0x8f, 0x80, 0x7e, 0x8e,
+ 0x76, 0x1b, 0x21, 0x7d, 0x3b, 0x6c, 0x63, 0xab,
+ 0x5d, 0xaa, 0x60, 0x1f, 0x13, 0xf4, 0xa8, 0x63,
+ 0xa6, 0x65, 0x6b, 0xb4, 0xa, 0xf7, 0x65, 0xf7,
+ 0xee, 0x52, 0xa, 0xf7, 0x5b, 0xa0, 0x76, 0xf9,
+ 0x11, 0xdf, 0xa, 0xf7, 0x8d, 0xc6, 0xa, 0x13,
+ 0xcc, 0xcf, 0xa, 0x51, 0x8f, 0x6c, 0x90, 0xb6,
+ 0x1a, 0x94, 0x8d, 0x96, 0x8f, 0x98, 0x1e, 0xc7,
+ 0xf7, 0x61, 0xf7, 0x6f, 0xf7, 0xa2, 0xab, 0xb3,
+ 0x96, 0x93, 0xa6, 0x98, 0x19, 0x13, 0xbc, 0x9b,
+ 0xfb, 0x51, 0x7, 0x13, 0xcc, 0x7b, 0x7, 0xb3,
+ 0x87, 0xa6, 0x86, 0x73, 0x1a, 0x84, 0x89, 0x83,
+ 0x87, 0x80, 0x1e, 0x7c, 0x64, 0xfb, 0xc, 0xfb,
+ 0x1c, 0x5e, 0x53, 0x73, 0xe7, 0x6e, 0xf0, 0x83,
+ 0xad, 0x8, 0x88, 0x96, 0x8b, 0x94, 0x93, 0x1a,
+ 0xa4, 0xa3, 0x95, 0xb8, 0x1e, 0x13, 0xbc, 0x9b,
+ 0xfb, 0x83, 0x7, 0x13, 0xcc, 0x7b, 0x7, 0xbf,
+ 0x83, 0x93, 0x8a, 0x9b, 0x52, 0xd8, 0xfb, 0xa1,
+ 0x18, 0x4b, 0xfb, 0x5e, 0x78, 0x49, 0x67, 0x7d,
+ 0x5c, 0x87, 0x19, 0xf7, 0x3f, 0xf9, 0x85, 0x15,
+ 0x13, 0xbc, 0x21, 0xa, 0xf7, 0x5b, 0x8b, 0xaf,
+ 0xf8, 0xd9, 0xaf, 0xf7, 0x70, 0x77, 0x50, 0xa,
+ 0xf7, 0xe3, 0xf9, 0x46, 0x52, 0xa, 0xab, 0x54,
+ 0x76, 0xf8, 0x50, 0xc7, 0xf7, 0x7d, 0x77, 0x12,
+ 0xf7, 0xd8, 0xd0, 0x17, 0xba, 0xa, 0xac, 0xac,
+ 0x79, 0x77, 0xac, 0x1f, 0x74, 0xb2, 0xb2, 0x72,
+ 0xb3, 0xaf, 0xa, 0x82, 0x8d, 0x85, 0x8e, 0x85,
+ 0x1f, 0x8f, 0x82, 0x90, 0x84, 0x84, 0x1a, 0x7e,
+ 0x7b, 0x88, 0x7f, 0x81, 0x78, 0x8b, 0xac, 0x71,
+ 0x1e, 0x57, 0xce, 0x7a, 0x9e, 0x49, 0x99, 0xf7,
+ 0xb6, 0xf7, 0xec, 0x18, 0xca, 0xa, 0xc3, 0xa1,
+ 0xaa, 0x8e, 0xb1, 0x1b, 0xf7, 0x1c, 0x6, 0x13,
+ 0xa0, 0x38, 0xf7, 0x10, 0x52, 0xa, 0xfb, 0x4a,
+ 0xa2, 0xf8, 0xa7, 0xa9, 0xf7, 0x8f, 0xa8, 0x1,
+ 0xa4, 0xdf, 0xf7, 0xd1, 0xdc, 0x3, 0xf7, 0xe,
+ 0xf8, 0x8, 0x15, 0xf7, 0x4, 0x6, 0x67, 0xfb,
+ 0xe1, 0x5, 0xfb, 0x8, 0x7e, 0x80, 0x39, 0x4f,
+ 0x1b, 0x85, 0x7e, 0x8f, 0x97, 0x91, 0x8f, 0x90,
+ 0x8e, 0x91, 0x1f, 0x8f, 0x91, 0x8e, 0x92, 0x93,
+ 0x1a, 0x9c, 0x7c, 0xa0, 0x73, 0x85, 0x64, 0x89,
+ 0x5a, 0x6d, 0xa4, 0x69, 0xc2, 0xf7, 0x18, 0xb0,
+ 0xf7, 0x72, 0xb2, 0x90, 0x1e, 0xb2, 0xf7, 0xb9,
+ 0x5, 0xf7, 0xe, 0x6, 0x92, 0xa9, 0x5, 0xfb,
+ 0x12, 0x6, 0xf7, 0x34, 0x9f, 0x99, 0xe6, 0xcc,
+ 0x1b, 0x97, 0x92, 0x84, 0x85, 0x85, 0x88, 0x85,
+ 0x87, 0x85, 0x1f, 0x88, 0x86, 0x88, 0x86, 0x84,
+ 0x1a, 0x72, 0xa2, 0x7d, 0x9c, 0xa5, 0x9a, 0xa0,
+ 0xa5, 0xbe, 0x59, 0x9d, 0x6d, 0xfb, 0x2, 0x50,
+ 0xfb, 0x20, 0xfb, 0x20, 0x77, 0x1e, 0xfb, 0x1,
+ 0x6, 0xe, 0x73, 0xf8, 0x95, 0x76, 0xd1, 0xa,
+ 0xe6, 0xf8, 0x80, 0x15, 0xb4, 0x6, 0xf7, 0x16,
+ 0xf3, 0xe0, 0x23, 0x5, 0xb1, 0x6, 0x33, 0xf7,
+ 0x3d, 0x5, 0x5a, 0x6, 0xe, 0x73, 0xf8, 0x95,
+ 0x76, 0xd1, 0xa, 0xf7, 0xd, 0xf7, 0xc5, 0x3,
+ 0xf7, 0x6d, 0xf8, 0x80, 0x7b, 0xa, 0x66, 0x6,
+ 0xfb, 0x1e, 0x22, 0x2f, 0xf4, 0x5, 0x65, 0x6,
+ 0xe, 0x73, 0xf8, 0x80, 0xc3, 0xf1, 0x77, 0x1,
+ 0xf7, 0x9, 0xa9, 0x3, 0xf7, 0x9, 0xf9, 0x1e,
+ 0x15, 0x61, 0x8c, 0xfb, 0x8, 0xf7, 0x19, 0xe1,
+ 0xce, 0xd2, 0xe2, 0x99, 0x1e, 0x6d, 0x6, 0x87,
+ 0x8a, 0x6b, 0x29, 0x28, 0x1b, 0x28, 0x81, 0xe1,
+ 0x9b, 0x1f, 0xe, 0x73, 0xf8, 0x90, 0xed, 0x1,
+ 0xf7, 0x63, 0xed, 0x3, 0xf7, 0x63, 0xf8, 0xc1,
+ 0x58, 0xa, 0xe, 0x73, 0xf8, 0x80, 0xad, 0x69,
+ 0xf7, 0x39, 0xab, 0xa, 0xf7, 0x39, 0x12, 0xf7,
+ 0x2f, 0xae, 0x68, 0xf7, 0x3b, 0xfb, 0x18, 0xf7,
+ 0x18, 0xfb, 0x18, 0xf7, 0x39, 0x6a, 0xac, 0x13,
+ 0xa4, 0x80, 0xf7, 0x2f, 0xf8, 0xe3, 0x15, 0x54,
+ 0xb7, 0x5f, 0xc2, 0x1e, 0x13, 0x99, 0x0, 0xc2,
+ 0xb9, 0xb7, 0xc2, 0xc2, 0x5d, 0xb8, 0x54, 0x1f,
+ 0x13, 0x44, 0x80, 0x54, 0x5f, 0x5e, 0x54, 0x1f,
+ 0xae, 0x16, 0xaf, 0xa8, 0xa9, 0xaf, 0xaf, 0xaa,
+ 0x6d, 0x67, 0x67, 0x6c, 0x6e, 0x67, 0x1e, 0x13,
+ 0xaa, 0x80, 0xe5, 0xa, 0xe, 0x73, 0xfb, 0x3d,
+ 0xb7, 0xf7, 0x39, 0x77, 0x1, 0x77, 0xc5, 0x3,
+ 0xc5, 0xb3, 0x15, 0x6e, 0x71, 0x5a, 0x44, 0x62,
+ 0x1a, 0x59, 0xa3, 0x76, 0xaa, 0xbb, 0xe8, 0xb2,
+ 0xb4, 0xa3, 0x1e, 0x75, 0x9c, 0x5, 0x6f, 0x76,
+ 0x43, 0x72, 0x74, 0x1b, 0x7d, 0x81, 0x94, 0x9f,
+ 0xb3, 0xa2, 0xc5, 0xa5, 0xb1, 0x1f, 0xe, 0x73,
+ 0xf8, 0x9c, 0xf2, 0x12, 0xef, 0xa2, 0xa, 0xa8,
+ 0x1f, 0x13, 0x80, 0x80, 0xa7, 0x57, 0xa, 0x78,
+ 0x75, 0x95, 0x96, 0x72, 0x1f, 0x96, 0x72, 0x70,
+ 0x96, 0x70, 0xd6, 0xa, 0x73, 0xf8, 0x82, 0xf7,
+ 0x3e, 0x1, 0xe8, 0xf8, 0x1d, 0x3, 0xe8, 0xad,
+ 0xa, 0xf7, 0x36, 0xee, 0x9f, 0xa, 0x9a, 0x99,
+ 0x47, 0xa, 0x7a, 0x80, 0x9d, 0xa, 0x9c, 0xfb,
+ 0x2d, 0x5e, 0xa, 0xe, 0xf7, 0x59, 0xad, 0x69,
+ 0xb9, 0x1, 0x85, 0xf7, 0x59, 0x15, 0xf8, 0x89,
+ 0x6, 0x95, 0xad, 0x5, 0xfc, 0x89, 0x6, 0xe,
+ 0xf8, 0xa8, 0xf7, 0x59, 0xb1, 0x65, 0xb9, 0x1,
+ 0x85, 0xf7, 0x59, 0x15, 0xfa, 0xd, 0x6, 0x96,
+ 0xb1, 0x5, 0xfe, 0xd, 0x6, 0xe, 0x73, 0x91,
+ 0xa, 0xf7, 0x3f, 0xcb, 0x4b, 0xf7, 0x5, 0x13,
+ 0xd0, 0xf7, 0xca, 0xf9, 0x1d, 0x15, 0x79, 0xa,
+ 0xb9, 0x93, 0xb5, 0xa0, 0x80, 0x96, 0x7f, 0x95,
+ 0x1e, 0x13, 0xe0, 0x7e, 0x96, 0x7e, 0x93, 0x9d,
+ 0xbd, 0xa, 0xe, 0x73, 0x91, 0xa, 0xf7, 0x44,
+ 0xf7, 0x6, 0x4b, 0xcb, 0x13, 0xe0, 0xf7, 0x34,
+ 0xf8, 0x48, 0x15, 0xea, 0xa, 0xc8, 0x9c, 0xa,
+ 0xaa, 0x69, 0x83, 0x5c, 0x84, 0x61, 0x76, 0x96,
+ 0x81, 0x97, 0x81, 0x1e, 0x13, 0xd0, 0x98, 0x80,
+ 0x99, 0x82, 0x79, 0x1a, 0x66, 0x54, 0x68, 0x77,
+ 0x7e, 0x1e, 0xe, 0x73, 0xfb, 0x15, 0xf7, 0x7a,
+ 0x12, 0xd2, 0xc0, 0xa, 0x13, 0xc0, 0xb7, 0xfb,
+ 0x4, 0x15, 0x6b, 0xa, 0x74, 0x98, 0x7f, 0x98,
+ 0x81, 0x1e, 0x13, 0xa0, 0x96, 0x82, 0x96, 0x82,
+ 0x7b, 0x82, 0xa, 0xe, 0xf7, 0x5b, 0x91, 0xa,
+ 0xf7, 0x3a, 0xcb, 0x4b, 0xf7, 0x4, 0xec, 0xcb,
+ 0x4b, 0xf7, 0x4, 0x13, 0xd4, 0xf7, 0xc5, 0xf9,
+ 0x1d, 0x15, 0x79, 0xa, 0xb8, 0x93, 0xb5, 0xa2,
+ 0x7e, 0x97, 0x7e, 0x95, 0x1e, 0x13, 0xe4, 0x80,
+ 0x94, 0x80, 0x94, 0x9b, 0xbd, 0xa, 0xf7, 0x65,
+ 0x16, 0x79, 0xa, 0xb8, 0x93, 0xb5, 0xa3, 0x7d,
+ 0x96, 0x7e, 0x96, 0x1e, 0x13, 0xd8, 0x80, 0x94,
+ 0x81, 0x93, 0x9b, 0xbd, 0xa, 0xe, 0xf7, 0x5b,
+ 0x91, 0xa, 0xf7, 0x46, 0xc0, 0xa, 0xec, 0xc0,
+ 0xa, 0x13, 0xe4, 0xf7, 0x34, 0xf8, 0x48, 0x15,
+ 0x59, 0xa, 0x75, 0x96, 0x80, 0x97, 0x81, 0x1e,
+ 0x13, 0xd8, 0x97, 0x81, 0x98, 0x82, 0x7a, 0x82,
+ 0xa, 0xf7, 0x6e, 0x7a, 0x15, 0x59, 0xa, 0x77,
+ 0x94, 0x80, 0x96, 0x82, 0x1e, 0x13, 0xd4, 0x98,
+ 0x80, 0x9a, 0x82, 0x78, 0x82, 0xa, 0xe, 0xf7,
+ 0x5b, 0xfb, 0x15, 0xf7, 0x7a, 0x12, 0xdf, 0xc0,
+ 0xa, 0xec, 0xc0, 0xa, 0x13, 0xd0, 0xc4, 0xfb,
+ 0x4, 0x15, 0x6b, 0xa, 0x75, 0x97, 0x7f, 0x97,
+ 0x81, 0x1e, 0x13, 0xb0, 0x97, 0x81, 0x97, 0x83,
+ 0x7a, 0x82, 0xa, 0xf7, 0x65, 0x16, 0x6b, 0xa,
+ 0x73, 0x99, 0x80, 0x98, 0x80, 0x1e, 0x13, 0xa8,
+ 0x96, 0x82, 0x95, 0x83, 0x7b, 0x82, 0xa, 0xe,
+ 0xf8, 0x3e, 0xa0, 0xf7, 0x6f, 0x77, 0x12, 0xf7,
+ 0xb2, 0xe4, 0x17, 0xf7, 0x31, 0xfb, 0x33, 0x15,
+ 0xa1, 0x6, 0xbb, 0xf7, 0x66, 0x97, 0xc1, 0xb2,
+ 0xf7, 0x1, 0xa9, 0xb7, 0x19, 0x81, 0x8e, 0x85,
+ 0xb5, 0xb7, 0x1a, 0xa7, 0x8e, 0xa9, 0x91, 0xa0,
+ 0x1e, 0xbc, 0xa7, 0x82, 0x82, 0xa0, 0x1f, 0x84,
+ 0x9c, 0x97, 0x85, 0x9a, 0x1b, 0xa8, 0x9b, 0xa0,
+ 0xa0, 0x1f, 0x13, 0xe0, 0x9f, 0x7c, 0x9f, 0x6c,
+ 0x72, 0x7e, 0x84, 0x83, 0x7a, 0x1e, 0x84, 0x7a,
+ 0x75, 0x83, 0x5f, 0x1b, 0x96, 0xc3, 0x9d, 0xa7,
+ 0x9a, 0x9f, 0x8, 0x9a, 0x9f, 0x97, 0x98, 0xa5,
+ 0x1a, 0xb0, 0x77, 0x9e, 0x76, 0x74, 0x72, 0x77,
+ 0x67, 0x7a, 0x8e, 0x7f, 0x8d, 0x7e, 0x1e, 0x8d,
+ 0x81, 0x8d, 0x7f, 0x7c, 0x1a, 0x78, 0x88, 0x6f,
+ 0x84, 0x66, 0x1e, 0x60, 0x75, 0x92, 0x93, 0x79,
+ 0x1f, 0x92, 0x7a, 0x7e, 0x93, 0x72, 0x1b, 0x6c,
+ 0x7c, 0x77, 0x77, 0x76, 0x9b, 0x76, 0xa8, 0x9c,
+ 0x99, 0x93, 0x93, 0x9e, 0x1f, 0x93, 0x9e, 0xa4,
+ 0x92, 0xb3, 0x1b, 0x7f, 0x45, 0x73, 0x55, 0x65,
+ 0x63, 0x99, 0xfb, 0x20, 0x76, 0x56, 0x61, 0xfb,
+ 0x78, 0x8, 0xe, 0xfb, 0x57, 0x76, 0xf7, 0x3e,
+ 0xd3, 0x74, 0x76, 0xb2, 0x76, 0xf8, 0x58, 0xd3,
+ 0xf7, 0x3e, 0x77, 0x12, 0xd8, 0xe0, 0xf7, 0x39,
+ 0xe0, 0x13, 0x9f, 0xf7, 0x30, 0x79, 0x15, 0x7b,
+ 0x5b, 0x4c, 0x4a, 0x5b, 0x1a, 0x79, 0x99, 0x78,
+ 0x9e, 0xaa, 0xa0, 0xa3, 0xdb, 0xab, 0x8e, 0xab,
+ 0x94, 0xa9, 0x1e, 0xc2, 0xb8, 0x6f, 0xaf, 0x1b,
+ 0xa0, 0x9e, 0x9a, 0xa0, 0x9f, 0x78, 0x9b, 0x78,
+ 0x1f, 0x66, 0x67, 0x71, 0x50, 0x1b, 0x9b, 0xb3,
+ 0x9e, 0xb5, 0xb0, 0xa4, 0x8, 0x84, 0x9d, 0x88,
+ 0x9d, 0x9e, 0x1a, 0xd0, 0xb3, 0xee, 0xc3, 0xb4,
+ 0x1e, 0x7f, 0x9e, 0x85, 0x9a, 0xa2, 0x1a, 0x9c,
+ 0x8f, 0x9c, 0x8f, 0x9b, 0x1e, 0xc9, 0xb1, 0x71,
+ 0xae, 0x1b, 0x9f, 0x9f, 0x9a, 0xa0, 0x9e, 0x77,
+ 0x9c, 0x79, 0x1f, 0x66, 0x5b, 0x6f, 0x5c, 0x1b,
+ 0x9b, 0xbb, 0xca, 0xcc, 0xbb, 0x1a, 0x9d, 0x7d,
+ 0x9e, 0x78, 0x6c, 0x76, 0x73, 0x3b, 0x1e, 0x13,
+ 0xcf, 0x6b, 0x88, 0x6b, 0x82, 0x6d, 0x1e, 0x54,
+ 0x5e, 0xa7, 0x67, 0x1b, 0x76, 0x78, 0x7c, 0x76,
+ 0x1f, 0x13, 0xaf, 0x77, 0x9e, 0x7b, 0x9e, 0x1e,
+ 0xb0, 0xaf, 0xa5, 0xc6, 0x1b, 0x7b, 0x63, 0x78,
+ 0x61, 0x66, 0x72, 0x8, 0x92, 0x79, 0x8e, 0x79,
+ 0x78, 0x1a, 0x46, 0x63, 0x28, 0x53, 0x62, 0x1e,
+ 0x13, 0xcf, 0x97, 0x78, 0x91, 0x7c, 0x74, 0x1a,
+ 0x7a, 0x87, 0x7a, 0x87, 0x7b, 0x1e, 0x4d, 0x65,
+ 0xa5, 0x68, 0x1b, 0x13, 0x9f, 0x77, 0x77, 0x7c,
+ 0x76, 0x78, 0x9f, 0x7a, 0x9d, 0x1f, 0xb0, 0xbb,
+ 0xa7, 0xba, 0x1b, 0xe, 0x84, 0xf7, 0x68, 0x76,
+ 0xad, 0x76, 0xf7, 0x87, 0x77, 0xad, 0x77, 0x12,
+ 0xbe, 0xf7, 0x8a, 0x13, 0x98, 0xc0, 0xf7, 0xdb,
+ 0x15, 0x13, 0x58, 0x47, 0xc1, 0x54, 0xcf, 0xce,
+ 0xc1, 0xc3, 0xce, 0x1e, 0x13, 0xa8, 0xce, 0x55,
+ 0xc0, 0x47, 0x47, 0x56, 0x56, 0x48, 0x1e, 0xe,
+ 0xf8, 0xa8, 0x80, 0xef, 0x12, 0xc4, 0xf7, 0x3,
+ 0x35, 0xef, 0xf7, 0x3b, 0xef, 0x2c, 0xf7, 0x3,
+ 0xf7, 0x2c, 0xef, 0x49, 0xf7, 0x3, 0x13, 0xaa,
+ 0xdd, 0xb2, 0x15, 0x8f, 0xa, 0x13, 0xd2, 0xf7,
+ 0x9f, 0x16, 0x8f, 0xa, 0x13, 0xcc, 0xf7, 0xa0,
+ 0x16, 0x6f, 0xa0, 0x75, 0xa7, 0xa7, 0xa2, 0xa1,
+ 0xa7, 0xa7, 0x74, 0xa1, 0x6f, 0x6f, 0x76, 0x75,
+ 0x6f, 0x1e, 0xe, 0xf9, 0x17, 0xb0, 0xa, 0xcb,
+ 0xd0, 0xa, 0x75, 0xd0, 0xa, 0xb1, 0xd0, 0xa,
+ 0x13, 0xb5, 0xe0, 0xf9, 0x42, 0xf7, 0x9, 0x30,
+ 0xa, 0xfc, 0x27, 0xbc, 0x30, 0xa, 0xfb, 0xeb,
+ 0xf8, 0x11, 0x6a, 0xa, 0x1e, 0x13, 0xb6, 0xe0,
+ 0x2f, 0xa, 0x13, 0x6e, 0xe0, 0x53, 0xfc, 0x33,
+ 0x15, 0xb5, 0x6, 0xf8, 0xad, 0xf9, 0x48, 0x5,
+ 0x61, 0x6, 0xe, 0x73, 0xb0, 0xf8, 0x2, 0x1,
+ 0xbe, 0xf7, 0x7a, 0x3, 0xbe, 0xf7, 0x6c, 0x68,
+ 0xa, 0x96, 0x63, 0xef, 0x6c, 0xc8, 0x1f, 0xf7,
+ 0x12, 0xf7, 0x16, 0x9e, 0xaa, 0x9c, 0x69, 0xa,
+ 0xe, 0x73, 0xce, 0xa, 0xc7, 0xf7, 0x72, 0x3,
+ 0xf7, 0x5a, 0xf7, 0x73, 0x15, 0xfb, 0x12, 0xfb,
+ 0x16, 0x77, 0x6c, 0x7a, 0x44, 0xa, 0x80, 0xb4,
+ 0x27, 0xaa, 0x4e, 0x1f, 0xe, 0xfb, 0x52, 0x96,
+ 0x76, 0xf9, 0x42, 0x77, 0x1, 0x82, 0x81, 0x15,
+ 0xb7, 0x6, 0xf7, 0x36, 0xf9, 0x42, 0x5, 0x5c,
+ 0x6, 0xe, 0x8b, 0xb8, 0xf7, 0x65, 0xb1, 0xe1,
+ 0xb1, 0xf7, 0x6b, 0xb0, 0x1, 0xf7, 0x4e, 0xf7,
+ 0x1, 0xf7, 0x8a, 0xa2, 0x3, 0xce, 0xf7, 0x92,
+ 0x15, 0xfb, 0x41, 0xf4, 0x3a, 0xf6, 0xf6, 0xf7,
+ 0x12, 0xba, 0xdf, 0xbf, 0x1e, 0x7a, 0x94, 0x5,
+ 0x53, 0x63, 0x26, 0x64, 0x57, 0x1b, 0xfb, 0x13,
+ 0x58, 0xbf, 0xf7, 0x31, 0x1f, 0xf7, 0xac, 0x6,
+ 0x97, 0xb1, 0x5, 0xfb, 0xb7, 0x6, 0xa5, 0x94,
+ 0xab, 0x94, 0xa7, 0x1e, 0xf7, 0xb5, 0x6, 0x99,
+ 0xb1, 0x5, 0xfb, 0xb5, 0x6, 0xd5, 0x97, 0xe2,
+ 0xf7, 0x21, 0xf1, 0x1b, 0xf7, 0x6, 0x91, 0x52,
+ 0x2e, 0x1f, 0xa2, 0xf7, 0x22, 0x6, 0x9e, 0x63,
+ 0x79, 0xa5, 0x2c, 0x1b, 0x52, 0xfb, 0x44, 0x53,
+ 0xfb, 0x58, 0x49, 0x1f, 0x28, 0x6, 0x7e, 0x65,
+ 0x5, 0xeb, 0x6, 0x83, 0x6e, 0x83, 0x6f, 0x89,
+ 0x6e, 0x8, 0x4a, 0x6, 0x7e, 0x65, 0x5, 0xe,
+ 0xf9, 0x3, 0xf7, 0x8d, 0x9f, 0x8a, 0x76, 0xf8,
+ 0x16, 0x9f, 0x12, 0xf7, 0x3b, 0xd2, 0xf7, 0x8e,
+ 0xa5, 0xf7, 0xd0, 0xd2, 0x13, 0xbc, 0xf7, 0x9,
+ 0xf7, 0x8d, 0x15, 0xf7, 0x3f, 0x9f, 0x6, 0x57,
+ 0x91, 0x8d, 0x95, 0xbb, 0x1a, 0xf7, 0xc0, 0xbd,
+ 0x7, 0xb4, 0x9c, 0x6c, 0x66, 0x94, 0x1f, 0x9f,
+ 0xe3, 0xfb, 0xed, 0x33, 0x9f, 0x6, 0xb0, 0x94,
+ 0x9c, 0xaa, 0xb5, 0x1b, 0xbc, 0xfb, 0xc0, 0x6,
+ 0x5b, 0x8d, 0x81, 0x57, 0x85, 0x1e, 0xf7, 0xd3,
+ 0x77, 0x15, 0xf7, 0x17, 0x9f, 0x6, 0x5e, 0x8f,
+ 0x83, 0xa6, 0xb7, 0x1a, 0xf7, 0x65, 0x8d, 0x7,
+ 0x13, 0x7c, 0xf7, 0x29, 0xfb, 0xc6, 0x5, 0x96,
+ 0x6, 0xf7, 0x2c, 0xf7, 0xc8, 0x5, 0x8d, 0xfb,
+ 0x72, 0x6, 0x13, 0xbc, 0x5b, 0x8e, 0x81, 0x57,
+ 0x85, 0x1e, 0x77, 0xf7, 0x3e, 0x9f, 0x7, 0x57,
+ 0x91, 0x8d, 0x95, 0xbb, 0x1a, 0xf7, 0x89, 0x7,
+ 0xae, 0x97, 0x9d, 0xb7, 0x8d, 0x1e, 0x9f, 0x24,
+ 0x7, 0xfb, 0x34, 0xfb, 0xc9, 0xfb, 0x2e, 0xf7,
+ 0xc9, 0x5, 0xfb, 0xd, 0x77, 0x6, 0xa8, 0xa7,
+ 0x77, 0x6d, 0x97, 0x1f, 0xfb, 0x83, 0x7, 0x5f,
+ 0x83, 0x70, 0x5f, 0x87, 0x1e, 0xe, 0xf7, 0xd2,
+ 0xe1, 0xf7, 0x70, 0x15, 0xf8, 0x96, 0xb5, 0xfc,
+ 0x96, 0x6, 0xe, 0xfb, 0x63, 0xa3, 0x73, 0xf7,
+ 0x4, 0xf3, 0x76, 0xf8, 0x2c, 0xab, 0xf7, 0x7b,
+ 0xa1, 0x12, 0x13, 0xb8, 0xb8, 0xf8, 0x20, 0x15,
+ 0xe2, 0x6, 0x81, 0x75, 0x53, 0xfb, 0xb3, 0x74,
+ 0xfb, 0x3, 0x8, 0x55, 0x80, 0x70, 0x22, 0x54,
+ 0x1b, 0x77, 0x87, 0x8e, 0x95, 0x90, 0x8e, 0x92,
+ 0x8e, 0x93, 0x1f, 0x13, 0x78, 0x8d, 0x91, 0x8c,
+ 0x91, 0x91, 0x1a, 0x98, 0x82, 0xa3, 0x70, 0x70,
+ 0x7e, 0x68, 0x7c, 0x7a, 0x98, 0x5e, 0xcc, 0xf7,
+ 0x9, 0xc3, 0xf7, 0x34, 0xf7, 0xf, 0xa7, 0x1e,
+ 0xd3, 0xf7, 0xd4, 0x5, 0xf7, 0x2f, 0x6, 0x97,
+ 0x8f, 0x87, 0x86, 0x88, 0x8b, 0x87, 0x8a, 0x88,
+ 0x1f, 0x6e, 0x20, 0x53, 0xfb, 0x52, 0x66, 0x1a,
+ 0x6c, 0x9d, 0x77, 0xaa, 0xb8, 0xb7, 0xb9, 0xc6,
+ 0xb5, 0x1e, 0x7b, 0x94, 0x5, 0x78, 0x7b, 0x61,
+ 0x59, 0x78, 0x1b, 0x86, 0x84, 0x8d, 0x94, 0x9a,
+ 0xe3, 0xf7, 0xce, 0x92, 0xa7, 0x1f, 0x90, 0x9e,
+ 0x8c, 0x91, 0x8a, 0x8e, 0x86, 0x8e, 0x18, 0x85,
+ 0x80, 0x89, 0x89, 0x7b, 0x1f, 0x89, 0x7b, 0x75,
+ 0x89, 0x6f, 0x1b, 0xfb, 0x2a, 0x6, 0xf7, 0x16,
+ 0xb0, 0xa7, 0xf0, 0xea, 0x1b, 0x9f, 0x9a, 0x86,
+ 0x80, 0x86, 0x88, 0x87, 0x88, 0x85, 0x1f, 0x88,
+ 0x85, 0x87, 0x83, 0x7d, 0x1a, 0x70, 0x9b, 0x7d,
+ 0xa0, 0x9f, 0xa5, 0x99, 0xb2, 0xba, 0x55, 0xa1,
+ 0x5d, 0xfb, 0x37, 0x58, 0xfb, 0x31, 0x2b, 0x6f,
+ 0x1e, 0x34, 0x6, 0xe, 0xfb, 0x60, 0xa4, 0xf7,
+ 0x53, 0x76, 0xf8, 0x29, 0xab, 0xf7, 0x7c, 0xa1,
+ 0x12, 0xfb, 0x21, 0xd3, 0x17, 0xf7, 0x6c, 0xf8,
+ 0x40, 0x15, 0xd2, 0x9d, 0xb0, 0xf7, 0x35, 0xf7,
+ 0x1, 0x1b, 0x13, 0xf8, 0xa9, 0x97, 0x7d, 0x82,
+ 0x1f, 0x86, 0x7f, 0x81, 0x7d, 0x1a, 0x85, 0x8d,
+ 0x86, 0x8e, 0x85, 0x1e, 0x8e, 0x85, 0x8e, 0x84,
+ 0x89, 0x85, 0x67, 0xfb, 0x24, 0x18, 0xfb, 0xea,
+ 0x6b, 0x15, 0xe4, 0x6, 0x87, 0x79, 0x5f, 0xfb,
+ 0x69, 0x64, 0xfb, 0x4e, 0x8, 0x4e, 0x7e, 0x70,
+ 0x2a, 0x57, 0x1b, 0x75, 0x88, 0x8f, 0x94, 0x90,
+ 0x8e, 0x92, 0x8d, 0x92, 0x1f, 0x8d, 0x91, 0x8d,
+ 0x91, 0x92, 0x1a, 0x9e, 0x7c, 0x9c, 0x77, 0x6b,
+ 0x82, 0x6c, 0x77, 0x7e, 0x94, 0x5b, 0xd1, 0xea,
+ 0xce, 0xf7, 0x3, 0xf7, 0x47, 0xb3, 0x1e, 0xd0,
+ 0xf7, 0xca, 0x5, 0xf7, 0x3a, 0x6, 0x7a, 0x35,
+ 0x4c, 0xfb, 0x67, 0x53, 0x1a, 0x6a, 0x9e, 0x78,
+ 0xa7, 0xad, 0xb0, 0x9c, 0xe3, 0xc9, 0x1e, 0x7b,
+ 0x94, 0x5, 0x70, 0x74, 0x67, 0x61, 0x79, 0x1b,
+ 0x86, 0x84, 0x8d, 0x95, 0x1f, 0x13, 0x30, 0xa1,
+ 0xf7, 0x1d, 0xf8, 0xc0, 0x94, 0xac, 0x1e, 0x8c,
+ 0x90, 0x8c, 0x90, 0x8f, 0x1a, 0x90, 0x89, 0x8f,
+ 0x88, 0x87, 0x85, 0x88, 0x89, 0x84, 0x1e, 0x88,
+ 0x84, 0x84, 0x88, 0x83, 0x1b, 0x83, 0x7d, 0x8e,
+ 0x8e, 0x7b, 0x1f, 0x8d, 0x7b, 0x7a, 0x8e, 0x7d,
+ 0x1b, 0xfb, 0x2e, 0x4a, 0xfb, 0x1e, 0xfb, 0x8,
+ 0x6b, 0x1f, 0x30, 0x6, 0xe, 0x79, 0x9d, 0xf8,
+ 0x3f, 0x98, 0xf7, 0x68, 0x9c, 0x91, 0x92, 0x6,
+ 0xfb, 0x64, 0x8f, 0xf8, 0x6c, 0x8d, 0x7, 0x1e,
+ 0xa0, 0x39, 0x63, 0xff, 0xc, 0x9, 0xaa, 0xa,
+ 0xd6, 0xb, 0xf8, 0x88, 0x14, 0xf7, 0xf9, 0x15,
+ 0xb0, 0x13, 0x0, 0xcd, 0x2, 0x0, 0x1, 0x0,
+ 0x13, 0x0, 0x17, 0x0, 0x31, 0x0, 0x34, 0x0,
+ 0x61, 0x0, 0x67, 0x0, 0x9c, 0x0, 0xa5, 0x0,
+ 0xb6, 0x0, 0xbf, 0x0, 0xf3, 0x1, 0xf, 0x1,
+ 0x1b, 0x1, 0x27, 0x1, 0x2c, 0x1, 0x4e, 0x1,
+ 0x53, 0x1, 0x59, 0x1, 0x6b, 0x1, 0x72, 0x1,
+ 0x88, 0x1, 0xa2, 0x1, 0xb8, 0x1, 0xdf, 0x1,
+ 0xf3, 0x2, 0x2, 0x2, 0x21, 0x2, 0x2a, 0x2,
+ 0x37, 0x2, 0x57, 0x2, 0x63, 0x2, 0x6e, 0x2,
+ 0x85, 0x2, 0x99, 0x2, 0xae, 0x2, 0xbd, 0x2,
+ 0xe3, 0x2, 0xea, 0x2, 0xef, 0x2, 0xf7, 0x3,
+ 0x37, 0x3, 0x53, 0x3, 0x62, 0x3, 0x71, 0x3,
+ 0x7e, 0x3, 0x8f, 0x3, 0xa0, 0x3, 0xae, 0x3,
+ 0xe7, 0x4, 0x1f, 0x4, 0x2c, 0x4, 0x32, 0x4,
+ 0x3f, 0x4, 0x44, 0x4, 0x4c, 0x4, 0x51, 0x4,
+ 0x55, 0x4, 0x61, 0x4, 0x6a, 0x4, 0x71, 0x4,
+ 0x7f, 0x4, 0x8d, 0x4, 0x9d, 0x4, 0xa7, 0x4,
+ 0xb1, 0x4, 0xbb, 0x4, 0xc8, 0x4, 0xd4, 0x4,
+ 0xf9, 0x5, 0x3, 0x5, 0xa, 0x5, 0x2d, 0x5,
+ 0x40, 0x5, 0x53, 0x5, 0x5e, 0x5, 0x64, 0x5,
+ 0x6c, 0x5, 0x8c, 0x5, 0xac, 0x5, 0xcc, 0x5,
+ 0xdd, 0x5, 0xe2, 0x5, 0xec, 0x5, 0xf6, 0x6,
+ 0x2, 0x6, 0x1e, 0x6, 0x26, 0x6, 0x36, 0x6,
+ 0x46, 0x6, 0x55, 0x6, 0x64, 0x6, 0x6d, 0x6,
+ 0x76, 0x6, 0x7b, 0x6, 0x8b, 0x6, 0x9b, 0x6,
+ 0x9f, 0x6, 0xa7, 0x6, 0xaf, 0x6, 0xc3, 0x6,
+ 0xd6, 0x6, 0xe2, 0x6, 0xe8, 0x6, 0xec, 0x6,
+ 0xf7, 0x7, 0xa, 0x7, 0x1d, 0x7, 0x22, 0x7,
+ 0x2d, 0x7, 0x36, 0x7, 0x48, 0x7, 0x5a, 0x7,
+ 0x5f, 0x7, 0x67, 0x7, 0x6f, 0x7, 0x75, 0x7,
+ 0x86, 0x7, 0x97, 0x7, 0xa1, 0x7, 0xab, 0x7,
+ 0xb5, 0x7, 0xbc, 0x7, 0xc1, 0x7, 0xc6, 0x7,
+ 0xcb, 0x7, 0xcf, 0x7, 0xd3, 0x7, 0xd7, 0x7,
+ 0xe3, 0x7, 0xee, 0x7, 0xf3, 0x7, 0xfc, 0x8,
+ 0x7, 0x8, 0x16, 0x8, 0x19, 0x8, 0x22, 0x8,
+ 0x26, 0x8, 0x2d, 0x8, 0x33, 0x8, 0x3a, 0x8,
+ 0x41, 0x8, 0x46, 0x8, 0x4b, 0x8, 0x59, 0x8,
+ 0x67, 0x8, 0x75, 0x8, 0x83, 0x8, 0x91, 0x8,
+ 0x9f, 0x8, 0xab, 0x8, 0xaf, 0x8, 0xb3, 0x8,
+ 0xc0, 0x8, 0xcd, 0x8, 0xda, 0x8, 0xe7, 0x8,
+ 0xf4, 0x8, 0xfc, 0x9, 0x4, 0x9, 0xb, 0x9,
+ 0x10, 0x9, 0x1c, 0x9, 0x28, 0x9, 0x34, 0x9,
+ 0x3a, 0x9, 0x3e, 0x9, 0x42, 0x9, 0x4d, 0x9,
+ 0x55, 0x9, 0x60, 0x9, 0x6b, 0x9, 0x6f, 0x9,
+ 0x76, 0x9, 0x7d, 0x9, 0x84, 0x9, 0x8b, 0x9,
+ 0x90, 0x9, 0x95, 0x9, 0x9a, 0x9, 0xa4, 0x9,
+ 0xae, 0x9, 0xb8, 0x9, 0xbb, 0x9, 0xbf, 0x9,
+ 0xc8, 0x9, 0xd1, 0x9, 0xda, 0x9, 0xe3, 0x9,
+ 0xec, 0x9, 0xf5, 0x9, 0xfe, 0xa, 0x7, 0xa,
+ 0x10, 0xa, 0x19, 0xa, 0x1f, 0xa, 0x25, 0xa,
+ 0x2b, 0xa, 0x31, 0xa, 0x37, 0xa, 0x3b, 0xa,
+ 0x41, 0xa, 0x46, 0xa, 0x4a, 0xa, 0x4e, 0xa,
+ 0x52, 0x70, 0xa1, 0x75, 0xa6, 0xa6, 0xa1, 0xa1,
+ 0xa6, 0xa6, 0x75, 0xa1, 0x70, 0x70, 0x75, 0x75,
+ 0x70, 0x1e, 0xb, 0x20, 0xa, 0x25, 0xa, 0x61,
+ 0xa, 0x71, 0xb5, 0xb6, 0xad, 0xaf, 0xd5, 0xc7,
+ 0x1e, 0x38, 0xa, 0x47, 0x87, 0x7b, 0x52, 0x5,
+ 0x89, 0x6, 0xa4, 0x6a, 0xb2, 0x5f, 0xa, 0x1e,
+ 0xb, 0x15, 0x21, 0xa, 0x15, 0xfb, 0x52, 0xf7,
+ 0x1a, 0x54, 0xe0, 0xae, 0xa, 0xf7, 0x84, 0x4f,
+ 0xa, 0xfb, 0x6e, 0xfb, 0x71, 0x1e, 0xf4, 0x16,
+ 0xd8, 0xeb, 0xf7, 0xdd, 0xf7, 0x5e, 0xef, 0xaa,
+ 0x48, 0xfb, 0x17, 0x2e, 0x2b, 0xfb, 0xdb, 0xfb,
+ 0x5f, 0xfb, 0x16, 0x8b, 0xf7, 0x1a, 0xd9, 0x1e,
+ 0xb, 0xf7, 0x5c, 0x16, 0x20, 0xa, 0xe, 0x15,
+ 0x38, 0xb8, 0x4e, 0xf5, 0xf7, 0x2d, 0xf7, 0x1d,
+ 0xf7, 0x49, 0xf7, 0xf, 0xcd, 0x6c, 0xdd, 0xfb,
+ 0x8, 0xfb, 0x26, 0xfb, 0x28, 0xfb, 0x35, 0xfb,
+ 0x27, 0x1e, 0xdf, 0x8a, 0x15, 0xc9, 0xe6, 0xf7,
+ 0x76, 0xf7, 0x4, 0xb8, 0xa4, 0x7d, 0xfb, 0x5,
+ 0x5a, 0x3c, 0xfb, 0x7e, 0xfb, 0x6, 0x59, 0x6d,
+ 0xaa, 0xe6, 0x1e, 0xb, 0x35, 0xa, 0x83, 0x68,
+ 0x7c, 0x19, 0x45, 0xa, 0xb, 0x36, 0xa, 0xaa,
+ 0xa2, 0x7c, 0x4d, 0x2e, 0x2c, 0xfb, 0x67, 0x21,
+ 0x70, 0x6a, 0x9d, 0xc0, 0x1e, 0xb, 0x3a, 0xa,
+ 0xeb, 0xa, 0x37, 0xa, 0xd2, 0xa, 0xb, 0xf7,
+ 0x88, 0x9b, 0x6, 0x58, 0x8f, 0x7c, 0xa1, 0xa6,
+ 0x1a, 0x9e, 0x92, 0xa1, 0x90, 0x9f, 0x1e, 0xf5,
+ 0xf8, 0x1b, 0xa3, 0xe1, 0x90, 0xa0, 0xce, 0x94,
+ 0x19, 0x93, 0xa, 0xbc, 0x85, 0x9c, 0x76, 0x6f,
+ 0x1a, 0x79, 0x87, 0x76, 0x85, 0x76, 0x1e, 0xfb,
+ 0x0, 0xfc, 0x1b, 0x73, 0x36, 0x87, 0x77, 0x4a,
+ 0x81, 0x19, 0xb, 0x72, 0xa, 0x70, 0xa8, 0xd8,
+ 0x9d, 0x90, 0x42, 0xa, 0x79, 0x87, 0x9a, 0x97,
+ 0x8d, 0x8c, 0x94, 0xe6, 0xf7, 0xfb, 0x1f, 0x56,
+ 0x81, 0x59, 0x82, 0x59, 0x85, 0x8, 0xb, 0x3f,
+ 0xa, 0x5, 0x84, 0x64, 0x2c, 0x79, 0x71, 0x1b,
+ 0x3e, 0xa, 0xb, 0x3d, 0xa, 0xb7, 0x70, 0xad,
+ 0x58, 0x5b, 0xa, 0x1e, 0x54, 0xa, 0xb, 0x2b,
+ 0xa, 0x5d, 0xa, 0xb, 0xe5, 0x4d, 0xb9, 0x58,
+ 0xfb, 0x1, 0x3a, 0xfb, 0x11, 0x27, 0x1e, 0xc9,
+ 0x5a, 0x15, 0xd1, 0xc0, 0xf7, 0x4c, 0xd6, 0xb5,
+ 0x94, 0x65, 0x6f, 0x4e, 0x56, 0xfb, 0x4f, 0x3e,
+ 0x6a, 0x7b, 0xa9, 0xa9, 0x1e, 0xb, 0x6a, 0xa,
+ 0x2f, 0xa, 0xb, 0x15, 0xb2, 0x6, 0x39, 0xa,
+ 0xb, 0x4e, 0xa, 0x69, 0x6c, 0x97, 0xb0, 0x91,
+ 0x8b, 0x91, 0x8d, 0x92, 0x1f, 0x8e, 0x97, 0x98,
+ 0x3c, 0xa, 0xb, 0xf7, 0xd2, 0xf7, 0x1f, 0x22,
+ 0xa, 0xb, 0x15, 0x32, 0xa, 0x7e, 0x80, 0xfb,
+ 0x2e, 0x74, 0xa, 0xf7, 0x2f, 0xa9, 0x7d, 0x4f,
+ 0x7e, 0x8a, 0x7d, 0x8a, 0x7a, 0x41, 0xa, 0xe,
+ 0x1e, 0x7b, 0xf7, 0x8a, 0x9b, 0x7, 0x51, 0x90,
+ 0x86, 0xa0, 0x7f, 0xd1, 0x2c, 0xf8, 0xc0, 0x18,
+ 0x71, 0x6, 0xfb, 0xce, 0xfc, 0xb3, 0x5a, 0x35,
+ 0x76, 0xb, 0x6e, 0x8e, 0x32, 0xef, 0xc7, 0xc0,
+ 0xa9, 0xf7, 0xe, 0xde, 0x1e, 0xfb, 0x6b, 0x6b,
+ 0x15, 0xe5, 0xe5, 0xf7, 0x70, 0xf7, 0x9, 0xb,
+ 0x7b, 0x7, 0xb1, 0xa9, 0x7a, 0x5f, 0x79, 0x2f,
+ 0xfb, 0xd6, 0x82, 0x6c, 0x1f, 0x5f, 0x7e, 0x58,
+ 0xfb, 0x1e, 0xfb, 0x1e, 0x1b, 0x4b, 0x40, 0xab,
+ 0xe4, 0xc1, 0xf4, 0xf7, 0xe8, 0x97, 0xb9, 0x1f,
+ 0xa9, 0x93, 0xa4, 0xa2, 0xc5, 0x1b, 0xb, 0x7f,
+ 0x95, 0x5, 0x5f, 0x5e, 0x77, 0x72, 0x7c, 0xec,
+ 0xa, 0x91, 0x92, 0xaa, 0xe7, 0xf7, 0xe9, 0x8e,
+ 0x97, 0x1f, 0xb, 0xf7, 0x1d, 0xf3, 0xdd, 0x23,
+ 0x5, 0xaf, 0x6, 0x33, 0xf7, 0x3d, 0x5, 0x5a,
+ 0x6, 0xb, 0x15, 0xc5, 0x86, 0x9c, 0x7f, 0x67,
+ 0x59, 0x27, 0xfb, 0xae, 0x7c, 0xa, 0xf7, 0x2d,
+ 0xd2, 0xe3, 0xf7, 0x19, 0xb2, 0x1e, 0xf5, 0xf8,
+ 0x7, 0x95, 0xae, 0x97, 0x9c, 0xc6, 0x96, 0x19,
+ 0xb, 0x53, 0xa, 0x2e, 0xa, 0x13, 0x78, 0x62,
+ 0xa, 0xb, 0xb4, 0xb9, 0xf7, 0x42, 0x8, 0xf7,
+ 0x37, 0x8b, 0x86, 0x5a, 0x40, 0xa, 0xb, 0xe5,
+ 0xae, 0xd9, 0xe1, 0xc1, 0x1b, 0x9e, 0x98, 0x84,
+ 0x64, 0x83, 0x81, 0xfb, 0x10, 0xfb, 0x62, 0x61,
+ 0x1f, 0x84, 0x75, 0x15, 0xa7, 0x8f, 0x5, 0xf7,
+ 0x36, 0xa2, 0xed, 0xdc, 0xda, 0x1a, 0xb, 0x7b,
+ 0x7, 0xc2, 0x90, 0x7c, 0x76, 0x1f, 0x6f, 0x3f,
+ 0x4b, 0xa, 0xb, 0x4a, 0xa, 0x8f, 0x99, 0x1f,
+ 0xe3, 0xf7, 0xd6, 0x88, 0x8d, 0xb, 0x7b, 0x88,
+ 0x7b, 0x87, 0x7c, 0x1f, 0x9f, 0x86, 0xcf, 0xf7,
+ 0x7c, 0x79, 0x8f, 0x81, 0x75, 0x82, 0x78, 0x82,
+ 0x7d, 0x19, 0x6c, 0x75, 0xb, 0x63, 0xa, 0xdb,
+ 0x8f, 0x5d, 0x50, 0x79, 0x1f, 0xfb, 0x9, 0xfc,
+ 0x40, 0x7a, 0x4d, 0x76, 0x7a, 0x5a, 0x82, 0x19,
+ 0xb, 0x1f, 0xda, 0xf7, 0xbf, 0x5, 0x41, 0x6,
+ 0x64, 0x20, 0x75, 0x4c, 0x5a, 0x41, 0x8, 0x57,
+ 0x69, 0x4c, 0x2d, 0x60, 0x1b, 0xb, 0xb8, 0xb3,
+ 0xb0, 0xce, 0x96, 0x1f, 0x6f, 0x6, 0x76, 0x84,
+ 0x83, 0x74, 0x65, 0x1b, 0xb, 0x1a, 0x86, 0x8d,
+ 0x88, 0x91, 0x94, 0xd0, 0xc9, 0xa7, 0xab, 0x1e,
+ 0xaa, 0xa6, 0xbf, 0xb1, 0xa8, 0xa2, 0x8, 0x94,
+ 0x7, 0x84, 0x97, 0x5f, 0xc1, 0x7b, 0x9d, 0x8,
+ 0x9c, 0x7c, 0x56, 0xd9, 0x7e, 0x1b, 0x83, 0x8b,
+ 0x85, 0x89, 0xb, 0xf7, 0x76, 0xf7, 0x8a, 0x4c,
+ 0xa, 0xb, 0xf9, 0x54, 0x31, 0xa, 0xb, 0x9a,
+ 0x1a, 0x9d, 0x7c, 0x9c, 0x76, 0x80, 0xb, 0x12,
+ 0xf8, 0xf, 0xe5, 0x17, 0xf7, 0x9, 0xb8, 0x15,
+ 0xb2, 0xb3, 0xf7, 0x1c, 0xa4, 0xcb, 0x1e, 0xcf,
+ 0xa5, 0xc5, 0xb9, 0xba, 0x1b, 0xcc, 0x8c, 0x51,
+ 0x70, 0xfb, 0xb, 0x31, 0xfb, 0x4e, 0xfb, 0xe,
+ 0x72, 0x72, 0x96, 0xa5, 0x1f, 0x7d, 0x64, 0x15,
+ 0x7f, 0xa2, 0x9f, 0x86, 0xa4, 0x1b, 0xf7, 0x1e,
+ 0xf7, 0x34, 0xf7, 0x3a, 0xf7, 0x2f, 0xd3, 0x6d,
+ 0xc6, 0x32, 0x39, 0x52, 0x42, 0x68, 0xb, 0x75,
+ 0x74, 0x78, 0x77, 0x7b, 0x7a, 0x8, 0x40, 0x3a,
+ 0x7d, 0x74, 0x7d, 0x44, 0xa, 0x84, 0x9d, 0x5a,
+ 0xa1, 0x5a, 0x1f, 0x95, 0x73, 0x97, 0x74, 0x95,
+ 0x77, 0x8, 0xb, 0x15, 0x51, 0x62, 0x6e, 0x77,
+ 0x7f, 0x1b, 0x82, 0x84, 0x93, 0x92, 0x97, 0x97,
+ 0xb3, 0xb, 0xfb, 0x82, 0x5c, 0x1a, 0x79, 0x8b,
+ 0x5f, 0xba, 0xc3, 0xb7, 0xc2, 0xc6, 0xb2, 0x1e,
+ 0xb, 0x15, 0xf7, 0x29, 0xf7, 0x97, 0x5, 0x8c,
+ 0x6, 0xb7, 0xfb, 0x97, 0x5, 0xb, 0x74, 0x39,
+ 0x77, 0x37, 0x79, 0x1a, 0x7c, 0x8d, 0x66, 0xb8,
+ 0xbd, 0xa5, 0xa5, 0xe6, 0xca, 0x1e, 0xb, 0xf8,
+ 0x8f, 0x6, 0xc9, 0xf7, 0x36, 0x7b, 0x93, 0x5,
+ 0x28, 0x44, 0x60, 0x65, 0xfb, 0x55, 0x1b, 0xb,
+ 0xf7, 0x5d, 0xf7, 0x3c, 0xfb, 0x4, 0xd6, 0xfb,
+ 0xc, 0xfb, 0x47, 0xfb, 0x78, 0xb, 0x1, 0x85,
+ 0xf8, 0xf8, 0x3, 0x85, 0x16, 0xf8, 0x8d, 0x6,
+ 0xc1, 0xf7, 0x3c, 0x78, 0x8e, 0x5, 0x24, 0x5a,
+ 0x5c, 0x6b, 0xfb, 0x38, 0x1b, 0xfb, 0x2b, 0x6,
+ 0xf8, 0x77, 0xf8, 0xef, 0x5, 0x99, 0xfc, 0x7a,
+ 0x7, 0x5d, 0xfb, 0x26, 0x9e, 0x86, 0x5, 0xd0,
+ 0xad, 0xab, 0xb9, 0xf7, 0x2d, 0x1b, 0xf7, 0x35,
+ 0x6, 0xfc, 0x73, 0xfc, 0xef, 0x5, 0xb, 0x6e,
+ 0x8d, 0x6d, 0xb9, 0xc1, 0xae, 0xb9, 0xce, 0xbd,
+ 0x1e, 0x7d, 0x98, 0x5, 0x5c, 0x66, 0x72, 0x6b,
+ 0x77, 0x1b, 0x89, 0x7d, 0x8d, 0x9a, 0x1f, 0xa9,
+ 0xdb, 0xf7, 0x8b, 0xb6, 0x1a, 0xb5, 0x74, 0xa3,
+ 0x5d, 0x38, 0x2f, 0xfb, 0x1f, 0x41, 0x5c, 0x1e,
+ 0x89, 0x8d, 0xcb, 0xf7, 0x65, 0x88, 0x8d, 0x55,
+ 0x80, 0x55, 0x81, 0x55, 0x81, 0x19, 0xb, 0x7b,
+ 0xa, 0x67, 0x6, 0xfb, 0x22, 0x22, 0x31, 0xf4,
+ 0x5, 0x66, 0x6, 0xe, 0x15, 0x8e, 0x6, 0x4d,
+ 0xa, 0xb, 0x73, 0xa, 0x57, 0x5f, 0xb4, 0xc8,
+ 0x98, 0x8e, 0x98, 0x90, 0x99, 0x1f, 0xb, 0xf8,
+ 0x80, 0x31, 0xa, 0xb, 0x84, 0x1b, 0x75, 0x7d,
+ 0x7c, 0x77, 0x7a, 0xb, 0xa7, 0x80, 0x71, 0xa,
+ 0xb, 0x15, 0x20, 0xa, 0xb, 0xea, 0xa, 0xc7,
+ 0x9c, 0xa, 0xab, 0x69, 0x83, 0x5e, 0x83, 0x61,
+ 0xb, 0x7d, 0xa, 0xf7, 0x76, 0xaf, 0xf8, 0x2a,
+ 0x77, 0xb, 0xfb, 0x21, 0xfb, 0x36, 0x5c, 0xa,
+ 0xb, 0xfb, 0x3c, 0xfb, 0x23, 0x4c, 0xab, 0x3d,
+ 0xf4, 0xef, 0xe6, 0xe7, 0x9b, 0x96, 0xb, 0x7d,
+ 0x7, 0xb4, 0x9b, 0x81, 0x6e, 0x1f, 0x70, 0x42,
+ 0xfb, 0x86, 0x5f, 0x1a, 0xb, 0x9e, 0xa, 0xf7,
+ 0x3b, 0xf0, 0x9f, 0xa, 0x95, 0x97, 0x47, 0xa,
+ 0x7f, 0x82, 0x9d, 0xa, 0xb, 0x60, 0xfb, 0x19,
+ 0xfb, 0x2d, 0xfb, 0x4f, 0xfb, 0x27, 0xb, 0x15,
+ 0xa8, 0x6, 0xa7, 0x92, 0x9c, 0x9e, 0xa7, 0x1b,
+ 0xb, 0x15, 0x7b, 0x4e, 0x86, 0x75, 0x74, 0x1a,
+ 0x7a, 0x8b, 0xb, 0x5f, 0x9e, 0x7c, 0xaf, 0xe5,
+ 0xd5, 0xf7, 0x11, 0xf7, 0x5, 0xcf, 0x1e, 0xb,
+ 0x1f, 0xa0, 0x89, 0xaa, 0xf7, 0x2d, 0x5, 0xfc,
+ 0x85, 0x7b, 0x6, 0xb, 0x1b, 0x2e, 0x3c, 0x48,
+ 0x2a, 0x4a, 0x90, 0x80, 0xf7, 0x1e, 0xfb, 0x27,
+ 0x1f, 0xac, 0x68, 0xb0, 0x6c, 0x4b, 0x1a, 0x59,
+ 0x68, 0x39, 0x2d, 0x31, 0x53, 0xda, 0xe4, 0x93,
+ 0x8c, 0x90, 0x8c, 0x93, 0x1e, 0x77, 0x8d, 0x5,
+ 0xb, 0x66, 0xa, 0xa8, 0x1f, 0x80, 0xa7, 0x57,
+ 0xa, 0x77, 0xb, 0x60, 0xa, 0x9d, 0xa8, 0x80,
+ 0x80, 0xb, 0xf8, 0x64, 0xf7, 0x27, 0x15, 0xf7,
+ 0x4c, 0xf7, 0x49, 0x8d, 0x89, 0x8c, 0x8c, 0x51,
+ 0xfb, 0x48, 0x5, 0xfb, 0x45, 0x61, 0x15, 0xf7,
+ 0x3c, 0x6, 0x6b, 0x22, 0x5, 0xca, 0x6, 0xa9,
+ 0xf3, 0x5, 0xc5, 0x6, 0xb, 0x15, 0x92, 0x7f,
+ 0xb7, 0x55, 0x9b, 0x79, 0x8, 0x7a, 0x9a, 0xc0,
+ 0x3d, 0x98, 0x1b, 0x93, 0x8b, 0x91, 0x8d, 0xb,
+ 0x1a, 0x90, 0x89, 0x8e, 0x85, 0x82, 0x46, 0x4d,
+ 0x6f, 0x6b, 0x1e, 0x6c, 0x70, 0x57, 0x65, 0x6e,
+ 0x74, 0x8, 0xb, 0x15, 0x45, 0xb9, 0x50, 0xd4,
+ 0xde, 0xf0, 0xed, 0xf7, 0xc, 0xb, 0x94, 0x7a,
+ 0x5, 0x59, 0xa, 0xb, 0x1b, 0x41, 0x7a, 0x47,
+ 0x65, 0x81, 0x1f, 0xb, 0x1b, 0xf7, 0x19, 0xd1,
+ 0xf3, 0xe9, 0xcd, 0x77, 0xb3, 0x2e, 0xe6, 0x1f,
+ 0x35, 0xe1, 0x7e, 0xa2, 0xba, 0x1a, 0xce, 0xbe,
+ 0xac, 0xc2, 0xf7, 0xd, 0x8f, 0x22, 0x52, 0x1e,
+ 0x9d, 0x88, 0x5, 0xb, 0xf7, 0x5b, 0x8b, 0xaf,
+ 0xf8, 0xfd, 0x77, 0x1, 0x83, 0xf8, 0xcb, 0x3,
+ 0x83, 0x16, 0xf8, 0x91, 0x6, 0xc5, 0xf7, 0x47,
+ 0x77, 0x91, 0x5, 0xfb, 0x26, 0x49, 0x3a, 0x88,
+ 0xfb, 0xd, 0x1b, 0xb, 0x1f, 0x7a, 0x99, 0x5,
+ 0x5c, 0x5b, 0x45, 0x44, 0xfb, 0x5, 0x1b, 0xfb,
+ 0xb, 0x54, 0xde, 0xf7, 0x17, 0xf7, 0x27, 0xf1,
+ 0xf7, 0x86, 0xf7, 0x5c, 0xf7, 0x23, 0x96, 0xfb,
+ 0x1a, 0x6f, 0x1f, 0xb, 0xf7, 0xb, 0xf7, 0xac,
+ 0xf8, 0x66, 0xf7, 0xb, 0xaf, 0x77, 0xa5, 0x66,
+ 0x71, 0x80, 0x76, 0x7d, 0xb, 0x9d, 0x1b, 0x43,
+ 0xa, 0xb, 0x7d, 0x94, 0x5, 0x5f, 0x68, 0x6f,
+ 0x68, 0x78, 0x1b, 0xb, 0x7f, 0x97, 0x5, 0x62,
+ 0x59, 0x61, 0x69, 0x55, 0x1b, 0xb, 0x1b, 0xbc,
+ 0xf7, 0x40, 0x5, 0xd5, 0xa0, 0x82, 0x98, 0xe0,
+ 0x1b, 0xb, 0x2d, 0x68, 0x1e, 0x98, 0x83, 0x5,
+ 0x96, 0x94, 0xa4, 0xb5, 0xc5, 0x1b, 0xba, 0xa8,
+ 0x67, 0x6d, 0x7c, 0x8a, 0x67, 0x2f, 0x32, 0x1f,
+ 0xfb, 0x19, 0xfb, 0x16, 0x5, 0xb, 0x80, 0xbc,
+ 0x70, 0x76, 0xf8, 0x41, 0xa1, 0xb, 0xb7, 0xa,
+ 0xfb, 0x2, 0xf7, 0x22, 0xc5, 0xa, 0x78, 0x92,
+ 0x56, 0xa, 0x9f, 0x7a, 0x80, 0xa, 0xb7, 0xa,
+ 0xfb, 0x2, 0xf7, 0x23, 0xc5, 0xa, 0x78, 0x91,
+ 0x56, 0xa, 0x9f, 0x7b, 0x80, 0xa, 0x82, 0x9c,
+ 0x5, 0x52, 0x6f, 0x42, 0x4f, 0x48, 0x1a, 0x60,
+ 0xa4, 0x6b, 0xad, 0x93, 0xb, 0x65, 0x1a, 0x70,
+ 0x61, 0x5a, 0x72, 0x6e, 0x1e, 0x63, 0x69, 0x7e,
+ 0x82, 0x7b, 0x1b, 0xb, 0x15, 0xb9, 0x6, 0xf7,
+ 0x37, 0xf7, 0x3d, 0x5, 0xb, 0x26, 0x1a, 0xfb,
+ 0x6, 0xf7, 0x3, 0x54, 0xf1, 0xb, 0xf7, 0x92,
+ 0xa0, 0x76, 0xb, 0x9e, 0xa, 0xf7, 0x38, 0xee,
+ 0x9f, 0xa, 0x98, 0x99, 0x47, 0xa, 0x7c, 0x80,
+ 0x9d, 0xa, 0xb, 0x9e, 0xa, 0xf7, 0x3a, 0xf0,
+ 0x9f, 0xa, 0x96, 0x97, 0x47, 0xa, 0x7e, 0x82,
+ 0x9d, 0xa, 0xb, 0x90, 0x87, 0x1f, 0xe, 0x1f,
+ 0xc3, 0xf2, 0x5, 0xf7, 0x70, 0x6, 0xb, 0x1a,
+ 0x66, 0x54, 0x69, 0x77, 0x7e, 0x1e, 0xb, 0x95,
+ 0x84, 0x5, 0x94, 0x95, 0xa2, 0xa6, 0xb4, 0x1b,
+ 0x9d, 0xaa, 0x7e, 0x63, 0x51, 0x31, 0x71, 0x52,
+ 0x82, 0x1f, 0xe, 0x15, 0x6c, 0xa3, 0x73, 0xaa,
+ 0xaa, 0xa4, 0xa3, 0xaa, 0xaa, 0x72, 0xa4, 0x6c,
+ 0x6c, 0x73, 0x72, 0x6c, 0x1e, 0xe, 0x74, 0xa8,
+ 0xa8, 0xa3, 0xa2, 0xa8, 0xa8, 0x73, 0xa3, 0x6e,
+ 0x6e, 0xb, 0xc7, 0xf4, 0xf8, 0x41, 0xf4, 0xb,
+ 0x9a, 0xa, 0x77, 0xb, 0x5a, 0xa, 0xf7, 0x78,
+ 0x77, 0x1, 0x58, 0xf8, 0xfb, 0x3, 0xb, 0x99,
+ 0x16, 0xd6, 0x6, 0xb4, 0xf7, 0x1c, 0x99, 0xb6,
+ 0xb8, 0xd0, 0x8, 0xc3, 0xb0, 0xc9, 0xe1, 0xbb,
+ 0x1b, 0xb, 0x15, 0x6d, 0xa4, 0x72, 0xa9, 0xa9,
+ 0xa4, 0xa4, 0xa9, 0xa9, 0x72, 0xa4, 0x6d, 0x6d,
+ 0x72, 0x72, 0x6d, 0x1e, 0xb, 0x8a, 0x16, 0x4e,
+ 0xa, 0xb, 0x15, 0xbe, 0x6, 0xf8, 0x5b, 0xf9,
+ 0x42, 0x5, 0x58, 0x6, 0xb, 0xf7, 0x92, 0x8b,
+ 0xac, 0xf7, 0xbb, 0xe9, 0xa, 0xb, 0xa3, 0x9e,
+ 0x9e, 0xa3, 0xa3, 0x78, 0x9e, 0x73, 0x73, 0x78,
+ 0x78, 0x73, 0x73, 0x9e, 0x78, 0xa3, 0x1f, 0xb,
+ 0x6f, 0xa1, 0x75, 0xa7, 0xa7, 0xa1, 0xa1, 0xa7,
+ 0xa7, 0x75, 0xa1, 0x6f, 0x6f, 0x75, 0x75, 0x6f,
+ 0x1e, 0xb, 0x1, 0x86, 0xa, 0x3, 0xb, 0xf8,
+ 0x5d, 0x76, 0xf7, 0x7a, 0x77, 0x12, 0xb, 0x1,
+ 0xa6, 0xdf, 0xf7, 0xa5, 0xdf, 0x3, 0xb, 0x9b,
+ 0xfb, 0x8b, 0x7b, 0x7, 0xb, 0x94, 0xb6, 0x5,
+ 0x54, 0x6, 0xda, 0xf7, 0x97, 0x5, 0x67, 0x6,
+ 0xfb, 0xa3, 0xfb, 0x97, 0x5, 0xb, 0x6, 0x89,
+ 0x90, 0xf7, 0x6, 0xf7, 0x2, 0x5, 0xdb, 0xd8,
+ 0x9e, 0xa3, 0xb3, 0x1a, 0xb4, 0x64, 0xb, 0x1b,
+ 0x76, 0x7a, 0x7a, 0x76, 0x61, 0xb6, 0x88, 0x93,
+ 0xb, 0x1a, 0x74, 0x9a, 0x7d, 0xa4, 0xa4, 0xa1,
+ 0xa7, 0xa7, 0xb, 0x7a, 0x7, 0x8e, 0x97, 0x92,
+ 0x8c, 0x9a, 0x1b, 0xc4, 0xb, 0x87, 0xa, 0xf7,
+ 0x87, 0x77, 0x1, 0xb, 0xa0, 0x76, 0xf9, 0x21,
+ 0xb, 0xf7, 0x4f, 0x9b, 0x6, 0xb, 0xce, 0x1a,
+ 0xb6, 0x72, 0xb, 0x85, 0x85, 0x1e, 0xb, 0x15,
+ 0xae, 0x6, 0xb, 0x5, 0x96, 0x92, 0xb, 0x82,
+ 0xba, 0x6f, 0x76, 0xf9, 0x37, 0xa9, 0xa, 0xe5,
+ 0x13, 0xb8, 0xb, 0x76, 0xa, 0xf7, 0x73, 0x77,
+ 0x12, 0x9c, 0xdf, 0x13, 0x78, 0xb, 0xf8, 0x99,
+ 0x66, 0xa, 0xb, 0x97, 0xa, 0xaa, 0x72, 0xbd,
+ 0x37, 0xfb, 0x28, 0xb, 0x80, 0xa0, 0xf8, 0x2e,
+ 0xa0, 0xf7, 0x73, 0x77, 0x92, 0xa, 0xb, 0x72,
+ 0x7e, 0x6c, 0xaf, 0x83, 0xb2, 0xf7, 0x10, 0xc6,
+ 0xe0, 0xce, 0xcd, 0x60, 0x9c, 0xb, 0x62, 0xa,
+ 0xe, 0x1a, 0x56, 0x3c, 0xfb, 0x1b, 0x60, 0x45,
+ 0x1e, 0xb, 0x77, 0x90, 0xa, 0xb, 0x77, 0x12,
+ 0xb5, 0xd8, 0xf7, 0x3e, 0xb, 0xb6, 0xa, 0xb4,
+ 0xf9, 0xa, 0xb, 0xfb, 0x17, 0xf7, 0x17, 0xfb,
+ 0x17, 0xb, 0xc7, 0x4f, 0xf2, 0x8c, 0x77, 0x12,
+ 0xb, 0xf8, 0x82, 0x9e, 0xa, 0xb, 0xf7, 0x74,
+ 0xf7, 0x58, 0xb, 0x1b, 0xbe, 0xb6, 0xb0, 0xb1,
+ 0xab, 0x72, 0x90, 0x82, 0x74, 0x7f, 0x7d, 0x7a,
+ 0xb, 0x7f, 0x9f, 0x89, 0x76, 0xf7, 0xe5, 0x9f,
+ 0xf7, 0xcc, 0x9f, 0x8e, 0x77, 0x12, 0xb, 0x83,
+ 0x16, 0xf7, 0x91, 0x6, 0xf7, 0xba, 0xf7, 0x35,
+ 0xf7, 0x4d, 0xf7, 0x5e, 0xb, 0x1b, 0xf7, 0x45,
+ 0xad, 0xfb, 0xf, 0x26, 0x4e, 0x6a, 0xfb, 0xc8,
+ 0xfb, 0xcf, 0xb, 0xaf, 0xa8, 0xa9, 0xaf, 0xaf,
+ 0xa9, 0x6d, 0x67, 0x67, 0x6d, 0x6e, 0x67, 0x1e,
+ 0xb, 0x1a, 0x6a, 0x7b, 0x5b, 0x53, 0x3a, 0x7b,
+ 0xe7, 0xb7, 0x84, 0x1e, 0x7b, 0x6, 0xb, 0x1a,
+ 0x6f, 0x8f, 0x69, 0xb7, 0xc9, 0xb2, 0xbb, 0xd8,
+ 0xbe, 0x1e, 0xe, 0xf8, 0x1, 0x79, 0xb, 0x15,
+ 0xaa, 0x6, 0xb, 0xb0, 0xf7, 0x5b, 0x5, 0x76,
+ 0x6, 0x81, 0x86, 0x7b, 0x7f, 0x6e, 0x1b, 0xb,
+ 0x9c, 0x7c, 0x15, 0x9d, 0x6, 0x98, 0x8f, 0x9c,
+ 0x9f, 0xa7, 0x1b, 0x9a, 0xb, 0x89, 0x87, 0x15,
+ 0x94, 0x82, 0x5, 0x96, 0x98, 0x9a, 0x92, 0x9c,
+ 0x1b, 0xb, 0x9f, 0xf7, 0x1f, 0x5, 0x7d, 0x6,
+ 0x83, 0x86, 0x7b, 0x81, 0x7a, 0x1b, 0xb, 0x7d,
+ 0x72, 0x84, 0x1e, 0x82, 0x6b, 0x82, 0xfb, 0xb,
+ 0x86, 0x54, 0x8, 0xb, 0x1a, 0xb0, 0xc2, 0xad,
+ 0x9f, 0x98, 0x1e, 0xb, 0x97, 0x76, 0xa9, 0x76,
+ 0xf8, 0x1a, 0xbe, 0xb, 0xb6, 0xa, 0xac, 0xf8,
+ 0xfe, 0xac, 0xb, 0xf7, 0x4, 0x4b, 0xcb, 0xb,
+ 0x15, 0xf7, 0x7b, 0x6, 0xac, 0xda, 0x80, 0x93,
+ 0x5, 0x76, 0x7f, 0xb, 0x9b, 0x7e, 0x15, 0x9b,
+ 0x6, 0x96, 0x91, 0x99, 0x95, 0x99, 0x1b, 0xb,
+ 0x9e, 0x91, 0x7d, 0x79, 0x1f, 0x63, 0x41, 0xfb,
+ 0x88, 0x73, 0x1a, 0xb, 0x9b, 0xfb, 0xa5, 0x7b,
+ 0x7, 0xb, 0x5, 0xa2, 0x79, 0xb, 0xed, 0xf1,
+ 0xed, 0xb, 0xb3, 0x17, 0xf7, 0x9c, 0xd3, 0x15,
+ 0x6a, 0xf7, 0x44, 0x5, 0xb, 0xea, 0xa, 0xca,
+ 0x9c, 0xa, 0xa8, 0x69, 0xb, 0xcf, 0xa2, 0xac,
+ 0xa0, 0xb9, 0x1a, 0xbc, 0x59, 0xa3, 0x5b, 0xb,
+ 0x96, 0xfb, 0xb0, 0x7, 0x6c, 0xfb, 0x7, 0x9b,
+ 0x87, 0x5, 0xb, 0x87, 0xa, 0x1, 0xb, 0xf1,
+ 0xe5, 0xf8, 0x4e, 0xf7, 0x17, 0xb, 0x1e, 0x9b,
+ 0xfb, 0x83, 0x7b, 0x7, 0xb, 0xc5, 0x76, 0xf8,
+ 0x2, 0x77, 0x1, 0xb, 0xd9, 0x16, 0xf7, 0xb5,
+ 0x9b, 0x6, 0xb, 0xc9, 0xf7, 0x47, 0xc9, 0xb,
+ 0xf7, 0x3d, 0x77, 0x1, 0xb, 0x9b, 0xfb, 0xa5,
+ 0x7, 0xb, 0xf7, 0xf, 0x15, 0x4c, 0x5a, 0x76,
+ 0x6f, 0x72, 0x1b, 0xb, 0xf8, 0xef, 0xaf, 0x89,
+ 0x77, 0x12, 0xcd, 0xf7, 0x4, 0xb, 0x1b, 0xfb,
+ 0x79, 0xfb, 0x45, 0xfb, 0x71, 0xfb, 0x55, 0xb,
+ 0x6c, 0xa, 0xe, 0x3c, 0x95, 0x76, 0xb, 0x15,
+ 0xd2, 0xf7, 0x8c, 0x5, 0x97, 0x8e, 0x92, 0xb,
+ 0xf8, 0x1d, 0x96, 0x76, 0xaa, 0x76, 0xf4, 0xb5,
+ 0xb, 0x66, 0x56, 0x1b, 0x7b, 0xf7, 0x61, 0x9a,
+ 0x7, 0xb, 0xf7, 0x45, 0xf7, 0x16, 0x9d, 0x9f,
+ 0x86, 0x7c, 0xb, 0x82, 0x30, 0x79, 0x87, 0x6d,
+ 0x1e, 0x78, 0x7, 0xb, 0xb6, 0xfb, 0x30, 0x76,
+ 0xf9, 0xf4, 0x77, 0x12, 0xb, 0x90, 0x94, 0x7d,
+ 0x1f, 0x7a, 0x6e, 0x5, 0x7e, 0xb, 0xf7, 0x49,
+ 0xfb, 0x39, 0x77, 0xe2, 0xed, 0x12, 0xb, 0x76,
+ 0xf9, 0x40, 0x77, 0x1, 0xf4, 0xcd, 0x3, 0xb,
+ 0xab, 0xfb, 0x2d, 0xa6, 0xf9, 0x8e, 0xa6, 0x1,
+ 0xb, 0x30, 0xa7, 0x1f, 0x9b, 0x55, 0xb, 0x77,
+ 0x1, 0xbc, 0xd6, 0x3, 0xb, 0x16, 0xf7, 0x5a,
+ 0x9b, 0x6, 0xb, 0x67, 0x6e, 0xa8, 0xaf, 0x1f,
+ 0xb, 0x7b, 0xf7, 0xa5, 0x9b, 0x7, 0xb, 0x15,
+ 0x9b, 0xa, 0xb, 0x9b, 0xfb, 0x51, 0x7b, 0x7,
+ 0xb, 0xac, 0xf7, 0x97, 0xac, 0xb, 0xc4, 0xa7,
+ 0xd4, 0xb, 0x9b, 0xfb, 0x5b, 0xb, 0x1b, 0x83,
+ 0x85, 0xb
+ };
diff --git a/core/src/fxge/fontdata/chromefontdata/FoxitSerifMM.c b/core/src/fxge/fontdata/chromefontdata/FoxitSerifMM.c
new file mode 100644
index 0000000000..44062cd210
--- /dev/null
+++ b/core/src/fxge/fontdata/chromefontdata/FoxitSerifMM.c
@@ -0,0 +1,7097 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+const unsigned char g_FoxitSerifMMFontData [113417] = {
+ 0x80, 0x01, 0xD6, 0x29, 0x00, 0x00, 0x25, 0x21, 0x50, 0x53, 0x2D, 0x41, 0x64, 0x6F, 0x62, 0x65,
+ 0x46, 0x6F, 0x6E, 0x74, 0x2D, 0x31, 0x2E, 0x30, 0x3A, 0x20, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x53,
+ 0x65, 0x72, 0x69, 0x66, 0x4D, 0x4D, 0x20, 0x30, 0x30, 0x31, 0x2E, 0x30, 0x30, 0x30, 0x0D, 0x25,
+ 0x25, 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x44, 0x61, 0x74, 0x65, 0x3A, 0x20, 0x54,
+ 0x75, 0x65, 0x20, 0x4F, 0x63, 0x74, 0x20, 0x33, 0x31, 0x20, 0x30, 0x31, 0x3A, 0x33, 0x34, 0x3A,
+ 0x32, 0x32, 0x20, 0x32, 0x30, 0x30, 0x36, 0x0D, 0x25, 0x25, 0x56, 0x4D, 0x75, 0x73, 0x61, 0x67,
+ 0x65, 0x3A, 0x20, 0x31, 0x32, 0x30, 0x30, 0x30, 0x30, 0x20, 0x31, 0x35, 0x30, 0x30, 0x30, 0x30,
+ 0x0D, 0x31, 0x37, 0x20, 0x64, 0x69, 0x63, 0x74, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6E, 0x0D, 0x2F,
+ 0x46, 0x6F, 0x6E, 0x74, 0x49, 0x6E, 0x66, 0x6F, 0x20, 0x31, 0x34, 0x20, 0x64, 0x69, 0x63, 0x74,
+ 0x20, 0x64, 0x75, 0x70, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6E, 0x0D, 0x2F, 0x76, 0x65, 0x72, 0x73,
+ 0x69, 0x6F, 0x6E, 0x20, 0x28, 0x30, 0x30, 0x31, 0x2E, 0x30, 0x30, 0x30, 0x29, 0x20, 0x72, 0x65,
+ 0x61, 0x64, 0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x4E, 0x6F, 0x74, 0x69,
+ 0x63, 0x65, 0x20, 0x28, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x29, 0x20, 0x72, 0x65, 0x61, 0x64, 0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65,
+ 0x66, 0x0D, 0x2F, 0x46, 0x75, 0x6C, 0x6C, 0x4E, 0x61, 0x6D, 0x65, 0x20, 0x28, 0x43, 0x68, 0x72,
+ 0x6f, 0x6d, 0x65, 0x20, 0x53, 0x65, 0x72, 0x69, 0x66, 0x20, 0x4D, 0x4D, 0x29, 0x20, 0x72, 0x65, 0x61,
+ 0x64, 0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x46, 0x61, 0x6D, 0x69, 0x6C,
+ 0x79, 0x4E, 0x61, 0x6D, 0x65, 0x20, 0x28, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x20, 0x53, 0x65, 0x72,
+ 0x69, 0x66, 0x20, 0x4D, 0x4D, 0x29, 0x20, 0x72, 0x65, 0x61, 0x64, 0x6F, 0x6E, 0x6C, 0x79, 0x20,
+ 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x49, 0x74, 0x61, 0x6C, 0x69, 0x63, 0x41, 0x6E, 0x67, 0x6C, 0x65,
+ 0x20, 0x30, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x69, 0x73, 0x46, 0x69, 0x78, 0x65, 0x64, 0x50,
+ 0x69, 0x74, 0x63, 0x68, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F,
+ 0x55, 0x6E, 0x64, 0x65, 0x72, 0x6C, 0x69, 0x6E, 0x65, 0x50, 0x6F, 0x73, 0x69, 0x74, 0x69, 0x6F,
+ 0x6E, 0x20, 0x2D, 0x31, 0x30, 0x30, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x55, 0x6E, 0x64, 0x65,
+ 0x72, 0x6C, 0x69, 0x6E, 0x65, 0x54, 0x68, 0x69, 0x63, 0x6B, 0x6E, 0x65, 0x73, 0x73, 0x20, 0x35,
+ 0x30, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, 0x41,
+ 0x6C, 0x6C, 0x29, 0x20, 0x72, 0x65, 0x61, 0x64, 0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65, 0x66,
+ 0x0D, 0x2F, 0x42, 0x6C, 0x65, 0x6E, 0x64, 0x44, 0x65, 0x73, 0x69, 0x67, 0x6E, 0x50, 0x6F, 0x73,
+ 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x20, 0x5B, 0x5B, 0x30, 0x20, 0x30, 0x20, 0x5D, 0x5B, 0x31,
+ 0x20, 0x30, 0x20, 0x5D, 0x5B, 0x30, 0x20, 0x31, 0x20, 0x5D, 0x5B, 0x31, 0x20, 0x31, 0x20, 0x5D,
+ 0x5D, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x42, 0x6C, 0x65, 0x6E, 0x64, 0x44, 0x65, 0x73, 0x69,
+ 0x67, 0x6E, 0x4D, 0x61, 0x70, 0x20, 0x5B, 0x5B, 0x5B, 0x31, 0x31, 0x30, 0x20, 0x30, 0x20, 0x5D,
+ 0x5B, 0x37, 0x39, 0x30, 0x20, 0x31, 0x20, 0x5D, 0x5D, 0x5B, 0x5B, 0x31, 0x30, 0x30, 0x20, 0x30,
+ 0x20, 0x5D, 0x5B, 0x39, 0x30, 0x30, 0x20, 0x31, 0x20, 0x5D, 0x5D, 0x5D, 0x20, 0x64, 0x65, 0x66,
+ 0x0D, 0x2F, 0x42, 0x6C, 0x65, 0x6E, 0x64, 0x41, 0x78, 0x69, 0x73, 0x54, 0x79, 0x70, 0x65, 0x73,
+ 0x20, 0x5B, 0x2F, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x2F, 0x57, 0x69, 0x64, 0x74, 0x68,
+ 0x20, 0x5D, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x65, 0x6E, 0x64, 0x20, 0x72, 0x65, 0x61, 0x64, 0x6F,
+ 0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x56,
+ 0x65, 0x63, 0x74, 0x6F, 0x72, 0x20, 0x5B, 0x30, 0x2E, 0x32, 0x37, 0x30, 0x32, 0x20, 0x30, 0x2E,
+ 0x31, 0x30, 0x34, 0x38, 0x20, 0x30, 0x2E, 0x34, 0x35, 0x30, 0x34, 0x20, 0x30, 0x2E, 0x31, 0x37,
+ 0x34, 0x36, 0x20, 0x5D, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x4E, 0x61,
+ 0x6D, 0x65, 0x20, 0x2F, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x66, 0x4D, 0x4D,
+ 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x45, 0x6E, 0x63, 0x6F, 0x64, 0x69, 0x6E, 0x67, 0x20, 0x32,
+ 0x35, 0x36, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x0D, 0x30, 0x20, 0x31, 0x20, 0x32, 0x35, 0x35,
+ 0x20, 0x7B, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x2F,
+ 0x2E, 0x6E, 0x6F, 0x74, 0x64, 0x65, 0x66, 0x20, 0x70, 0x75, 0x74, 0x20, 0x7D, 0x20, 0x66, 0x6F,
+ 0x72, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x33, 0x32, 0x20, 0x2F, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20,
+ 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x33, 0x33, 0x20, 0x2F, 0x65, 0x78, 0x63, 0x6C,
+ 0x61, 0x6D, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x33, 0x34, 0x20, 0x2F, 0x71,
+ 0x75, 0x6F, 0x74, 0x65, 0x64, 0x62, 0x6C, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+ 0x33, 0x35, 0x20, 0x2F, 0x6E, 0x75, 0x6D, 0x62, 0x65, 0x72, 0x73, 0x69, 0x67, 0x6E, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x33, 0x36, 0x20, 0x2F, 0x64, 0x6F, 0x6C, 0x6C, 0x61,
+ 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x33, 0x37, 0x20, 0x2F, 0x70, 0x65,
+ 0x72, 0x63, 0x65, 0x6E, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x33, 0x38,
+ 0x20, 0x2F, 0x61, 0x6D, 0x70, 0x65, 0x72, 0x73, 0x61, 0x6E, 0x64, 0x20, 0x70, 0x75, 0x74, 0x0D,
+ 0x64, 0x75, 0x70, 0x20, 0x33, 0x39, 0x20, 0x2F, 0x71, 0x75, 0x6F, 0x74, 0x65, 0x73, 0x69, 0x6E,
+ 0x67, 0x6C, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x30, 0x20, 0x2F,
+ 0x70, 0x61, 0x72, 0x65, 0x6E, 0x6C, 0x65, 0x66, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+ 0x70, 0x20, 0x34, 0x31, 0x20, 0x2F, 0x70, 0x61, 0x72, 0x65, 0x6E, 0x72, 0x69, 0x67, 0x68, 0x74,
+ 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x32, 0x20, 0x2F, 0x61, 0x73, 0x74,
+ 0x65, 0x72, 0x69, 0x73, 0x6B, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x33,
+ 0x20, 0x2F, 0x70, 0x6C, 0x75, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34,
+ 0x34, 0x20, 0x2F, 0x63, 0x6F, 0x6D, 0x6D, 0x61, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+ 0x20, 0x34, 0x35, 0x20, 0x2F, 0x68, 0x79, 0x70, 0x68, 0x65, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D,
+ 0x64, 0x75, 0x70, 0x20, 0x34, 0x36, 0x20, 0x2F, 0x70, 0x65, 0x72, 0x69, 0x6F, 0x64, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x37, 0x20, 0x2F, 0x73, 0x6C, 0x61, 0x73, 0x68,
+ 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x38, 0x20, 0x2F, 0x7A, 0x65, 0x72,
+ 0x6F, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x39, 0x20, 0x2F, 0x6F, 0x6E,
+ 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35, 0x30, 0x20, 0x2F, 0x74, 0x77,
+ 0x6F, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35, 0x31, 0x20, 0x2F, 0x74, 0x68,
+ 0x72, 0x65, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35, 0x32, 0x20, 0x2F,
+ 0x66, 0x6F, 0x75, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35, 0x33, 0x20,
+ 0x2F, 0x66, 0x69, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35, 0x34,
+ 0x20, 0x2F, 0x73, 0x69, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35, 0x35,
+ 0x20, 0x2F, 0x73, 0x65, 0x76, 0x65, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+ 0x35, 0x36, 0x20, 0x2F, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+ 0x70, 0x20, 0x35, 0x37, 0x20, 0x2F, 0x6E, 0x69, 0x6E, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+ 0x75, 0x70, 0x20, 0x35, 0x38, 0x20, 0x2F, 0x63, 0x6F, 0x6C, 0x6F, 0x6E, 0x20, 0x70, 0x75, 0x74,
+ 0x0D, 0x64, 0x75, 0x70, 0x20, 0x35, 0x39, 0x20, 0x2F, 0x73, 0x65, 0x6D, 0x69, 0x63, 0x6F, 0x6C,
+ 0x6F, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x36, 0x30, 0x20, 0x2F, 0x6C,
+ 0x65, 0x73, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x36, 0x31, 0x20, 0x2F,
+ 0x65, 0x71, 0x75, 0x61, 0x6C, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x36, 0x32,
+ 0x20, 0x2F, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+ 0x70, 0x20, 0x36, 0x33, 0x20, 0x2F, 0x71, 0x75, 0x65, 0x73, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x36, 0x34, 0x20, 0x2F, 0x61, 0x74, 0x20, 0x70, 0x75,
+ 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x36, 0x35, 0x20, 0x2F, 0x41, 0x20, 0x70, 0x75, 0x74, 0x0D,
+ 0x64, 0x75, 0x70, 0x20, 0x36, 0x36, 0x20, 0x2F, 0x42, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+ 0x70, 0x20, 0x36, 0x37, 0x20, 0x2F, 0x43, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+ 0x36, 0x38, 0x20, 0x2F, 0x44, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x36, 0x39,
+ 0x20, 0x2F, 0x45, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, 0x30, 0x20, 0x2F,
+ 0x46, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, 0x31, 0x20, 0x2F, 0x47, 0x20,
+ 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, 0x32, 0x20, 0x2F, 0x48, 0x20, 0x70, 0x75,
+ 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, 0x33, 0x20, 0x2F, 0x49, 0x20, 0x70, 0x75, 0x74, 0x0D,
+ 0x64, 0x75, 0x70, 0x20, 0x37, 0x34, 0x20, 0x2F, 0x4A, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+ 0x70, 0x20, 0x37, 0x35, 0x20, 0x2F, 0x4B, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+ 0x37, 0x36, 0x20, 0x2F, 0x4C, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, 0x37,
+ 0x20, 0x2F, 0x4D, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, 0x38, 0x20, 0x2F,
+ 0x4E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x37, 0x39, 0x20, 0x2F, 0x4F, 0x20,
+ 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x38, 0x30, 0x20, 0x2F, 0x50, 0x20, 0x70, 0x75,
+ 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x38, 0x31, 0x20, 0x2F, 0x51, 0x20, 0x70, 0x75, 0x74, 0x0D,
+ 0x64, 0x75, 0x70, 0x20, 0x38, 0x32, 0x20, 0x2F, 0x52, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+ 0x70, 0x20, 0x38, 0x33, 0x20, 0x2F, 0x53, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+ 0x38, 0x34, 0x20, 0x2F, 0x54, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x38, 0x35,
+ 0x20, 0x2F, 0x55, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x38, 0x36, 0x20, 0x2F,
+ 0x56, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x38, 0x37, 0x20, 0x2F, 0x57, 0x20,
+ 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x38, 0x38, 0x20, 0x2F, 0x58, 0x20, 0x70, 0x75,
+ 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x38, 0x39, 0x20, 0x2F, 0x59, 0x20, 0x70, 0x75, 0x74, 0x0D,
+ 0x64, 0x75, 0x70, 0x20, 0x39, 0x30, 0x20, 0x2F, 0x5A, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+ 0x70, 0x20, 0x39, 0x31, 0x20, 0x2F, 0x62, 0x72, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x6C, 0x65, 0x66,
+ 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x39, 0x32, 0x20, 0x2F, 0x62, 0x61,
+ 0x63, 0x6B, 0x73, 0x6C, 0x61, 0x73, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+ 0x39, 0x33, 0x20, 0x2F, 0x62, 0x72, 0x61, 0x63, 0x6B, 0x65, 0x74, 0x72, 0x69, 0x67, 0x68, 0x74,
+ 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x39, 0x34, 0x20, 0x2F, 0x61, 0x73, 0x63,
+ 0x69, 0x69, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+ 0x20, 0x39, 0x35, 0x20, 0x2F, 0x75, 0x6E, 0x64, 0x65, 0x72, 0x73, 0x63, 0x6F, 0x72, 0x65, 0x20,
+ 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x39, 0x36, 0x20, 0x2F, 0x67, 0x72, 0x61, 0x76,
+ 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x39, 0x37, 0x20, 0x2F, 0x61, 0x20,
+ 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x39, 0x38, 0x20, 0x2F, 0x62, 0x20, 0x70, 0x75,
+ 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x39, 0x39, 0x20, 0x2F, 0x63, 0x20, 0x70, 0x75, 0x74, 0x0D,
+ 0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x30, 0x20, 0x2F, 0x64, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+ 0x75, 0x70, 0x20, 0x31, 0x30, 0x31, 0x20, 0x2F, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+ 0x70, 0x20, 0x31, 0x30, 0x32, 0x20, 0x2F, 0x66, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+ 0x20, 0x31, 0x30, 0x33, 0x20, 0x2F, 0x67, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+ 0x31, 0x30, 0x34, 0x20, 0x2F, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31,
+ 0x30, 0x35, 0x20, 0x2F, 0x69, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x30,
+ 0x36, 0x20, 0x2F, 0x6A, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x37,
+ 0x20, 0x2F, 0x6B, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x38, 0x20,
+ 0x2F, 0x6C, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x39, 0x20, 0x2F,
+ 0x6D, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x31, 0x30, 0x20, 0x2F, 0x6E,
+ 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x31, 0x31, 0x20, 0x2F, 0x6F, 0x20,
+ 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x31, 0x32, 0x20, 0x2F, 0x70, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x31, 0x33, 0x20, 0x2F, 0x71, 0x20, 0x70, 0x75,
+ 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x31, 0x34, 0x20, 0x2F, 0x72, 0x20, 0x70, 0x75, 0x74,
+ 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x31, 0x35, 0x20, 0x2F, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D,
+ 0x64, 0x75, 0x70, 0x20, 0x31, 0x31, 0x36, 0x20, 0x2F, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+ 0x75, 0x70, 0x20, 0x31, 0x31, 0x37, 0x20, 0x2F, 0x75, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+ 0x70, 0x20, 0x31, 0x31, 0x38, 0x20, 0x2F, 0x76, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+ 0x20, 0x31, 0x31, 0x39, 0x20, 0x2F, 0x77, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+ 0x31, 0x32, 0x30, 0x20, 0x2F, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31,
+ 0x32, 0x31, 0x20, 0x2F, 0x79, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x32,
+ 0x32, 0x20, 0x2F, 0x7A, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x32, 0x33,
+ 0x20, 0x2F, 0x62, 0x72, 0x61, 0x63, 0x65, 0x6C, 0x65, 0x66, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D,
+ 0x64, 0x75, 0x70, 0x20, 0x31, 0x32, 0x34, 0x20, 0x2F, 0x62, 0x61, 0x72, 0x20, 0x70, 0x75, 0x74,
+ 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x32, 0x35, 0x20, 0x2F, 0x62, 0x72, 0x61, 0x63, 0x65, 0x72,
+ 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x32, 0x36,
+ 0x20, 0x2F, 0x61, 0x73, 0x63, 0x69, 0x69, 0x74, 0x69, 0x6C, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74,
+ 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x32, 0x38, 0x20, 0x2F, 0x45, 0x75, 0x72, 0x6F, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x33, 0x30, 0x20, 0x2F, 0x71, 0x75, 0x6F, 0x74,
+ 0x65, 0x73, 0x69, 0x6E, 0x67, 0x6C, 0x62, 0x61, 0x73, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+ 0x75, 0x70, 0x20, 0x31, 0x33, 0x31, 0x20, 0x2F, 0x66, 0x6C, 0x6F, 0x72, 0x69, 0x6E, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x33, 0x32, 0x20, 0x2F, 0x71, 0x75, 0x6F, 0x74,
+ 0x65, 0x64, 0x62, 0x6C, 0x62, 0x61, 0x73, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+ 0x20, 0x31, 0x33, 0x33, 0x20, 0x2F, 0x65, 0x6C, 0x6C, 0x69, 0x70, 0x73, 0x69, 0x73, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x33, 0x34, 0x20, 0x2F, 0x64, 0x61, 0x67, 0x67,
+ 0x65, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x33, 0x35, 0x20, 0x2F,
+ 0x64, 0x61, 0x67, 0x67, 0x65, 0x72, 0x64, 0x62, 0x6C, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+ 0x70, 0x20, 0x31, 0x33, 0x36, 0x20, 0x2F, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65,
+ 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x33, 0x37, 0x20, 0x2F, 0x70,
+ 0x65, 0x72, 0x74, 0x68, 0x6F, 0x75, 0x73, 0x61, 0x6E, 0x64, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+ 0x75, 0x70, 0x20, 0x31, 0x33, 0x38, 0x20, 0x2F, 0x53, 0x63, 0x61, 0x72, 0x6F, 0x6E, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x33, 0x39, 0x20, 0x2F, 0x67, 0x75, 0x69, 0x6C,
+ 0x73, 0x69, 0x6E, 0x67, 0x6C, 0x6C, 0x65, 0x66, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+ 0x70, 0x20, 0x31, 0x34, 0x30, 0x20, 0x2F, 0x4F, 0x45, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+ 0x70, 0x20, 0x31, 0x34, 0x35, 0x20, 0x2F, 0x71, 0x75, 0x6F, 0x74, 0x65, 0x6C, 0x65, 0x66, 0x74,
+ 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x34, 0x36, 0x20, 0x2F, 0x71, 0x75,
+ 0x6F, 0x74, 0x65, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+ 0x20, 0x31, 0x34, 0x37, 0x20, 0x2F, 0x71, 0x75, 0x6F, 0x74, 0x65, 0x64, 0x62, 0x6C, 0x6C, 0x65,
+ 0x66, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x34, 0x38, 0x20, 0x2F,
+ 0x71, 0x75, 0x6F, 0x74, 0x65, 0x64, 0x62, 0x6C, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75,
+ 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x34, 0x39, 0x20, 0x2F, 0x62, 0x75, 0x6C, 0x6C, 0x65,
+ 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x35, 0x30, 0x20, 0x2F, 0x65,
+ 0x6E, 0x64, 0x61, 0x73, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x35,
+ 0x31, 0x20, 0x2F, 0x65, 0x6D, 0x64, 0x61, 0x73, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+ 0x70, 0x20, 0x31, 0x35, 0x32, 0x20, 0x2F, 0x74, 0x69, 0x6C, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74,
+ 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x35, 0x33, 0x20, 0x2F, 0x74, 0x72, 0x61, 0x64, 0x65, 0x6D,
+ 0x61, 0x72, 0x6B, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x35, 0x34, 0x20,
+ 0x2F, 0x73, 0x63, 0x61, 0x72, 0x6F, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+ 0x31, 0x35, 0x35, 0x20, 0x2F, 0x67, 0x75, 0x69, 0x6C, 0x73, 0x69, 0x6E, 0x67, 0x6C, 0x72, 0x69,
+ 0x67, 0x68, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x35, 0x36, 0x20,
+ 0x2F, 0x6F, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x35, 0x39, 0x20,
+ 0x2F, 0x59, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+ 0x75, 0x70, 0x20, 0x31, 0x36, 0x31, 0x20, 0x2F, 0x65, 0x78, 0x63, 0x6C, 0x61, 0x6D, 0x64, 0x6F,
+ 0x77, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36, 0x32, 0x20, 0x2F,
+ 0x63, 0x65, 0x6E, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36, 0x33,
+ 0x20, 0x2F, 0x73, 0x74, 0x65, 0x72, 0x6C, 0x69, 0x6E, 0x67, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+ 0x75, 0x70, 0x20, 0x31, 0x36, 0x34, 0x20, 0x2F, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x63, 0x79,
+ 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36, 0x35, 0x20, 0x2F, 0x79, 0x65,
+ 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36, 0x36, 0x20, 0x2F, 0x62,
+ 0x72, 0x6F, 0x6B, 0x65, 0x6E, 0x62, 0x61, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+ 0x20, 0x31, 0x36, 0x37, 0x20, 0x2F, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x70, 0x75,
+ 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36, 0x38, 0x20, 0x2F, 0x64, 0x69, 0x65, 0x72, 0x65,
+ 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x36, 0x39, 0x20,
+ 0x2F, 0x63, 0x6F, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+ 0x75, 0x70, 0x20, 0x31, 0x37, 0x30, 0x20, 0x2F, 0x6F, 0x72, 0x64, 0x66, 0x65, 0x6D, 0x69, 0x6E,
+ 0x69, 0x6E, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x37, 0x31, 0x20,
+ 0x2F, 0x67, 0x75, 0x69, 0x6C, 0x6C, 0x65, 0x6D, 0x6F, 0x74, 0x6C, 0x65, 0x66, 0x74, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x37, 0x32, 0x20, 0x2F, 0x6C, 0x6F, 0x67, 0x69,
+ 0x63, 0x61, 0x6C, 0x6E, 0x6F, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31,
+ 0x37, 0x34, 0x20, 0x2F, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x37, 0x35, 0x20, 0x2F, 0x6D, 0x61, 0x63, 0x72,
+ 0x6F, 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x37, 0x36, 0x20, 0x2F,
+ 0x64, 0x65, 0x67, 0x72, 0x65, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31,
+ 0x37, 0x37, 0x20, 0x2F, 0x70, 0x6C, 0x75, 0x73, 0x6D, 0x69, 0x6E, 0x75, 0x73, 0x20, 0x70, 0x75,
+ 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x37, 0x38, 0x20, 0x2F, 0x74, 0x77, 0x6F, 0x73, 0x75,
+ 0x70, 0x65, 0x72, 0x69, 0x6F, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31,
+ 0x37, 0x39, 0x20, 0x2F, 0x74, 0x68, 0x72, 0x65, 0x65, 0x73, 0x75, 0x70, 0x65, 0x72, 0x69, 0x6F,
+ 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x30, 0x20, 0x2F, 0x61,
+ 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x31,
+ 0x20, 0x2F, 0x6D, 0x75, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x32,
+ 0x20, 0x2F, 0x70, 0x61, 0x72, 0x61, 0x67, 0x72, 0x61, 0x70, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D,
+ 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x33, 0x20, 0x2F, 0x70, 0x65, 0x72, 0x69, 0x6F, 0x64, 0x63,
+ 0x65, 0x6E, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+ 0x31, 0x38, 0x34, 0x20, 0x2F, 0x63, 0x65, 0x64, 0x69, 0x6C, 0x6C, 0x61, 0x20, 0x70, 0x75, 0x74,
+ 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x35, 0x20, 0x2F, 0x6F, 0x6E, 0x65, 0x73, 0x75, 0x70,
+ 0x65, 0x72, 0x69, 0x6F, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38,
+ 0x36, 0x20, 0x2F, 0x6F, 0x72, 0x64, 0x6D, 0x61, 0x73, 0x63, 0x75, 0x6C, 0x69, 0x6E, 0x65, 0x20,
+ 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x37, 0x20, 0x2F, 0x67, 0x75, 0x69,
+ 0x6C, 0x6C, 0x65, 0x6D, 0x6F, 0x74, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x70, 0x75, 0x74, 0x0D,
+ 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x38, 0x20, 0x2F, 0x6F, 0x6E, 0x65, 0x71, 0x75, 0x61, 0x72,
+ 0x74, 0x65, 0x72, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x38, 0x39, 0x20,
+ 0x2F, 0x6F, 0x6E, 0x65, 0x68, 0x61, 0x6C, 0x66, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+ 0x20, 0x31, 0x39, 0x30, 0x20, 0x2F, 0x74, 0x68, 0x72, 0x65, 0x65, 0x71, 0x75, 0x61, 0x72, 0x74,
+ 0x65, 0x72, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39, 0x31, 0x20,
+ 0x2F, 0x71, 0x75, 0x65, 0x73, 0x74, 0x69, 0x6F, 0x6E, 0x64, 0x6F, 0x77, 0x6E, 0x20, 0x70, 0x75,
+ 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39, 0x32, 0x20, 0x2F, 0x41, 0x67, 0x72, 0x61, 0x76,
+ 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39, 0x33, 0x20, 0x2F, 0x41,
+ 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39,
+ 0x34, 0x20, 0x2F, 0x41, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39, 0x35, 0x20, 0x2F, 0x41, 0x74, 0x69, 0x6C,
+ 0x64, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39, 0x36, 0x20, 0x2F,
+ 0x41, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+ 0x70, 0x20, 0x31, 0x39, 0x37, 0x20, 0x2F, 0x41, 0x72, 0x69, 0x6E, 0x67, 0x20, 0x70, 0x75, 0x74,
+ 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39, 0x38, 0x20, 0x2F, 0x41, 0x45, 0x20, 0x70, 0x75, 0x74,
+ 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x39, 0x39, 0x20, 0x2F, 0x43, 0x63, 0x65, 0x64, 0x69, 0x6C,
+ 0x6C, 0x61, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x30, 0x20, 0x2F,
+ 0x45, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32,
+ 0x30, 0x31, 0x20, 0x2F, 0x45, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+ 0x75, 0x70, 0x20, 0x32, 0x30, 0x32, 0x20, 0x2F, 0x45, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66,
+ 0x6C, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x33, 0x20,
+ 0x2F, 0x45, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+ 0x75, 0x70, 0x20, 0x32, 0x30, 0x34, 0x20, 0x2F, 0x49, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x35, 0x20, 0x2F, 0x49, 0x61, 0x63, 0x75,
+ 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x36, 0x20, 0x2F,
+ 0x49, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D,
+ 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x37, 0x20, 0x2F, 0x49, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73,
+ 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x38, 0x20, 0x2F,
+ 0x45, 0x74, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x30, 0x39, 0x20,
+ 0x2F, 0x4E, 0x74, 0x69, 0x6C, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+ 0x32, 0x31, 0x30, 0x20, 0x2F, 0x4F, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D,
+ 0x64, 0x75, 0x70, 0x20, 0x32, 0x31, 0x31, 0x20, 0x2F, 0x4F, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20,
+ 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31, 0x32, 0x20, 0x2F, 0x4F, 0x63, 0x69,
+ 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+ 0x20, 0x32, 0x31, 0x33, 0x20, 0x2F, 0x4F, 0x74, 0x69, 0x6C, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74,
+ 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31, 0x34, 0x20, 0x2F, 0x4F, 0x64, 0x69, 0x65, 0x72, 0x65,
+ 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31, 0x35, 0x20,
+ 0x2F, 0x6D, 0x75, 0x6C, 0x74, 0x69, 0x70, 0x6C, 0x79, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+ 0x70, 0x20, 0x32, 0x31, 0x36, 0x20, 0x2F, 0x4F, 0x73, 0x6C, 0x61, 0x73, 0x68, 0x20, 0x70, 0x75,
+ 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31, 0x37, 0x20, 0x2F, 0x55, 0x67, 0x72, 0x61, 0x76,
+ 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31, 0x38, 0x20, 0x2F, 0x55,
+ 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x31,
+ 0x39, 0x20, 0x2F, 0x55, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32, 0x30, 0x20, 0x2F, 0x55, 0x64, 0x69, 0x65,
+ 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32,
+ 0x31, 0x20, 0x2F, 0x59, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+ 0x70, 0x20, 0x32, 0x32, 0x32, 0x20, 0x2F, 0x54, 0x68, 0x6F, 0x72, 0x6E, 0x20, 0x70, 0x75, 0x74,
+ 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32, 0x33, 0x20, 0x2F, 0x67, 0x65, 0x72, 0x6D, 0x61, 0x6E,
+ 0x64, 0x62, 0x6C, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32, 0x34,
+ 0x20, 0x2F, 0x61, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70,
+ 0x20, 0x32, 0x32, 0x35, 0x20, 0x2F, 0x61, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74,
+ 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32, 0x36, 0x20, 0x2F, 0x61, 0x63, 0x69, 0x72, 0x63, 0x75,
+ 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32,
+ 0x37, 0x20, 0x2F, 0x61, 0x74, 0x69, 0x6C, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+ 0x70, 0x20, 0x32, 0x32, 0x38, 0x20, 0x2F, 0x61, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73,
+ 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x32, 0x39, 0x20, 0x2F, 0x61, 0x72,
+ 0x69, 0x6E, 0x67, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33, 0x30, 0x20,
+ 0x2F, 0x61, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33, 0x31, 0x20,
+ 0x2F, 0x63, 0x63, 0x65, 0x64, 0x69, 0x6C, 0x6C, 0x61, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+ 0x70, 0x20, 0x32, 0x33, 0x32, 0x20, 0x2F, 0x65, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70, 0x75,
+ 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33, 0x33, 0x20, 0x2F, 0x65, 0x61, 0x63, 0x75, 0x74,
+ 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33, 0x34, 0x20, 0x2F, 0x65,
+ 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+ 0x75, 0x70, 0x20, 0x32, 0x33, 0x35, 0x20, 0x2F, 0x65, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69,
+ 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33, 0x36, 0x20, 0x2F, 0x69,
+ 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33,
+ 0x37, 0x20, 0x2F, 0x69, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+ 0x70, 0x20, 0x32, 0x33, 0x38, 0x20, 0x2F, 0x69, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C,
+ 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x33, 0x39, 0x20, 0x2F,
+ 0x69, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75,
+ 0x70, 0x20, 0x32, 0x34, 0x30, 0x20, 0x2F, 0x65, 0x74, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+ 0x75, 0x70, 0x20, 0x32, 0x34, 0x31, 0x20, 0x2F, 0x6E, 0x74, 0x69, 0x6C, 0x64, 0x65, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x32, 0x20, 0x2F, 0x6F, 0x67, 0x72, 0x61,
+ 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x33, 0x20, 0x2F,
+ 0x6F, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32,
+ 0x34, 0x34, 0x20, 0x2F, 0x6F, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66, 0x6C, 0x65, 0x78, 0x20,
+ 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x35, 0x20, 0x2F, 0x6F, 0x74, 0x69,
+ 0x6C, 0x64, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x36, 0x20,
+ 0x2F, 0x6F, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+ 0x75, 0x70, 0x20, 0x32, 0x34, 0x37, 0x20, 0x2F, 0x64, 0x69, 0x76, 0x69, 0x64, 0x65, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x38, 0x20, 0x2F, 0x6F, 0x73, 0x6C, 0x61,
+ 0x73, 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x34, 0x39, 0x20, 0x2F,
+ 0x75, 0x67, 0x72, 0x61, 0x76, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32,
+ 0x35, 0x30, 0x20, 0x2F, 0x75, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+ 0x75, 0x70, 0x20, 0x32, 0x35, 0x31, 0x20, 0x2F, 0x75, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6D, 0x66,
+ 0x6C, 0x65, 0x78, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x35, 0x32, 0x20,
+ 0x2F, 0x75, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64,
+ 0x75, 0x70, 0x20, 0x32, 0x35, 0x33, 0x20, 0x2F, 0x79, 0x61, 0x63, 0x75, 0x74, 0x65, 0x20, 0x70,
+ 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x35, 0x34, 0x20, 0x2F, 0x74, 0x68, 0x6F, 0x72,
+ 0x6E, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x32, 0x35, 0x35, 0x20, 0x2F, 0x79,
+ 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x72, 0x65, 0x61,
+ 0x64, 0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x50, 0x61, 0x69, 0x6E, 0x74,
+ 0x54, 0x79, 0x70, 0x65, 0x20, 0x30, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x46, 0x6F, 0x6E, 0x74,
+ 0x54, 0x79, 0x70, 0x65, 0x20, 0x31, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x24, 0x42, 0x6C, 0x65,
+ 0x6E, 0x64, 0x20, 0x7B, 0x20, 0x30, 0x2E, 0x31, 0x30, 0x34, 0x38, 0x20, 0x6D, 0x75, 0x6C, 0x20,
+ 0x65, 0x78, 0x63, 0x68, 0x20, 0x30, 0x2E, 0x34, 0x35, 0x30, 0x34, 0x20, 0x6D, 0x75, 0x6C, 0x20,
+ 0x61, 0x64, 0x64, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x30, 0x2E, 0x31, 0x37, 0x34, 0x36, 0x20,
+ 0x6D, 0x75, 0x6C, 0x20, 0x61, 0x64, 0x64, 0x20, 0x61, 0x64, 0x64, 0x20, 0x7D, 0x20, 0x62, 0x69,
+ 0x6E, 0x64, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x4D, 0x61, 0x74, 0x72,
+ 0x69, 0x78, 0x20, 0x5B, 0x20, 0x30, 0x2E, 0x30, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x20, 0x30,
+ 0x20, 0x30, 0x20, 0x30, 0x2E, 0x30, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x20, 0x30, 0x20, 0x30,
+ 0x20, 0x5D, 0x20, 0x72, 0x65, 0x61, 0x64, 0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0D,
+ 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x42, 0x42, 0x6F, 0x78, 0x20, 0x7B, 0x2D, 0x31, 0x35, 0x37, 0x20,
+ 0x2D, 0x32, 0x35, 0x37, 0x20, 0x31, 0x31, 0x39, 0x34, 0x20, 0x38, 0x37, 0x32, 0x7D, 0x20, 0x72,
+ 0x65, 0x61, 0x64, 0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x42, 0x6C, 0x65,
+ 0x6E, 0x64, 0x20, 0x33, 0x20, 0x64, 0x69, 0x63, 0x74, 0x20, 0x64, 0x75, 0x70, 0x20, 0x62, 0x65,
+ 0x67, 0x69, 0x6E, 0x0D, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x42, 0x42, 0x6F, 0x78, 0x20, 0x7B, 0x7B,
+ 0x20, 0x2D, 0x31, 0x33, 0x35, 0x20, 0x2D, 0x32, 0x33, 0x36, 0x20, 0x2D, 0x31, 0x33, 0x35, 0x20,
+ 0x2D, 0x32, 0x30, 0x31, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x2D, 0x32, 0x35, 0x37, 0x20, 0x2D, 0x32,
+ 0x35, 0x37, 0x20, 0x2D, 0x32, 0x35, 0x37, 0x20, 0x2D, 0x32, 0x35, 0x37, 0x20, 0x7D, 0x20, 0x7B,
+ 0x20, 0x35, 0x38, 0x32, 0x20, 0x31, 0x32, 0x31, 0x37, 0x20, 0x31, 0x32, 0x37, 0x34, 0x20, 0x31,
+ 0x39, 0x32, 0x32, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x38, 0x37, 0x32, 0x20, 0x38, 0x37, 0x32, 0x20,
+ 0x38, 0x37, 0x32, 0x20, 0x38, 0x37, 0x32, 0x20, 0x7D, 0x7D, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F,
+ 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x31, 0x34, 0x20, 0x64, 0x69, 0x63, 0x74, 0x20,
+ 0x64, 0x65, 0x66, 0x0D, 0x65, 0x6E, 0x64, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x25, 0x20, 0x43, 0x6F,
+ 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, 0x63, 0x29, 0x20, 0x31, 0x39, 0x39, 0x30,
+ 0x2D, 0x31, 0x39, 0x39, 0x34, 0x20, 0x41, 0x64, 0x6F, 0x62, 0x65, 0x20, 0x53, 0x79, 0x73, 0x74,
+ 0x65, 0x6D, 0x73, 0x20, 0x49, 0x6E, 0x63, 0x6F, 0x72, 0x70, 0x6F, 0x72, 0x61, 0x74, 0x65, 0x64,
+ 0x0D, 0x25, 0x20, 0x41, 0x6C, 0x6C, 0x20, 0x52, 0x69, 0x67, 0x68, 0x74, 0x73, 0x20, 0x52, 0x65,
+ 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x2E, 0x0D, 0x2F, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x64,
+ 0x69, 0x63, 0x74, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x0D, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20,
+ 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x7B, 0x20,
+ 0x73, 0x65, 0x74, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x7D, 0x20, 0x74, 0x72, 0x75, 0x65,
+ 0x20, 0x73, 0x65, 0x74, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x73, 0x68, 0x61, 0x72, 0x65,
+ 0x64, 0x64, 0x69, 0x63, 0x74, 0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x7B, 0x20, 0x7D, 0x20, 0x75, 0x73,
+ 0x65, 0x72, 0x64, 0x69, 0x63, 0x74, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20,
+ 0x64, 0x75, 0x70, 0x0D, 0x2F, 0x6D, 0x61, 0x6B, 0x65, 0x62, 0x6C, 0x65, 0x6E, 0x64, 0x65, 0x64,
+ 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x7B, 0x20, 0x2F, 0x6D, 0x61,
+ 0x6B, 0x65, 0x62, 0x6C, 0x65, 0x6E, 0x64, 0x65, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x67, 0x65,
+ 0x74, 0x20, 0x64, 0x75, 0x70, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x2F, 0x6F, 0x70, 0x65, 0x72,
+ 0x61, 0x74, 0x6F, 0x72, 0x74, 0x79, 0x70, 0x65, 0x20, 0x65, 0x71, 0x20, 0x7B, 0x0D, 0x70, 0x6F,
+ 0x70, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x30, 0x20, 0x67, 0x65,
+ 0x74, 0x20, 0x64, 0x75, 0x70, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x2F, 0x69, 0x6E, 0x74, 0x65,
+ 0x67, 0x65, 0x72, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6E, 0x65, 0x0D, 0x7B, 0x20, 0x70, 0x6F, 0x70,
+ 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x31, 0x31, 0x20, 0x6C, 0x74,
+ 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C,
+ 0x73, 0x65, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66,
+ 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7B, 0x20, 0x2F, 0x6D, 0x61, 0x6B, 0x65, 0x62, 0x6C, 0x65, 0x6E,
+ 0x64, 0x65, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x7B, 0x0D, 0x31, 0x31, 0x20, 0x70, 0x6F, 0x70,
+ 0x0D, 0x32, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x65,
+ 0x78, 0x63, 0x68, 0x20, 0x2F, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x56, 0x65, 0x63, 0x74, 0x6F,
+ 0x72, 0x20, 0x67, 0x65, 0x74, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x65, 0x71, 0x0D,
+ 0x7B, 0x20, 0x64, 0x75, 0x70, 0x20, 0x30, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x7B, 0x20, 0x61,
+ 0x64, 0x64, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x20, 0x31, 0x20, 0x73, 0x75,
+ 0x62, 0x20, 0x61, 0x62, 0x73, 0x20, 0x2E, 0x30, 0x30, 0x31, 0x20, 0x67, 0x74, 0x20, 0x7D, 0x0D,
+ 0x7B, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D,
+ 0x7B, 0x20, 0x2F, 0x6D, 0x61, 0x6B, 0x65, 0x62, 0x6C, 0x65, 0x6E, 0x64, 0x65, 0x64, 0x66, 0x6F,
+ 0x6E, 0x74, 0x20, 0x63, 0x76, 0x78, 0x20, 0x65, 0x72, 0x72, 0x6F, 0x72, 0x64, 0x69, 0x63, 0x74,
+ 0x20, 0x2F, 0x72, 0x61, 0x6E, 0x67, 0x65, 0x63, 0x68, 0x65, 0x63, 0x6B, 0x20, 0x67, 0x65, 0x74,
+ 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x0D, 0x65, 0x78, 0x63, 0x68, 0x20,
+ 0x64, 0x75, 0x70, 0x20, 0x64, 0x75, 0x70, 0x20, 0x6D, 0x61, 0x78, 0x6C, 0x65, 0x6E, 0x67, 0x74,
+ 0x68, 0x20, 0x64, 0x69, 0x63, 0x74, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6E, 0x20, 0x7B, 0x0D, 0x66,
+ 0x61, 0x6C, 0x73, 0x65, 0x20, 0x7B, 0x20, 0x2F, 0x46, 0x49, 0x44, 0x20, 0x2F, 0x55, 0x6E, 0x69,
+ 0x71, 0x75, 0x65, 0x49, 0x44, 0x20, 0x2F, 0x58, 0x55, 0x49, 0x44, 0x20, 0x7D, 0x20, 0x7B, 0x20,
+ 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x71, 0x20, 0x6F, 0x72, 0x20, 0x7D, 0x20,
+ 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x0D, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70,
+ 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x64, 0x65, 0x66, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73,
+ 0x65, 0x0D, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x0D, 0x2F, 0x58, 0x55, 0x49, 0x44,
+ 0x20, 0x32, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x6B, 0x6E, 0x6F, 0x77, 0x6E, 0x20, 0x7B, 0x0D,
+ 0x67, 0x65, 0x74, 0x20, 0x64, 0x75, 0x70, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x32,
+ 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x73, 0x75,
+ 0x62, 0x20, 0x64, 0x75, 0x70, 0x20, 0x30, 0x20, 0x67, 0x74, 0x20, 0x7B, 0x0D, 0x65, 0x78, 0x63,
+ 0x68, 0x20, 0x64, 0x75, 0x70, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x61, 0x72, 0x72,
+ 0x61, 0x79, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x0D, 0x65, 0x78, 0x63, 0x68, 0x20, 0x32, 0x20, 0x69,
+ 0x6E, 0x64, 0x65, 0x78, 0x20, 0x7B, 0x20, 0x36, 0x35, 0x35, 0x33, 0x36, 0x20, 0x6D, 0x75, 0x6C,
+ 0x20, 0x63, 0x76, 0x69, 0x20, 0x33, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x70, 0x75, 0x74, 0x20,
+ 0x70, 0x6F, 0x70, 0x20, 0x31, 0x20, 0x61, 0x64, 0x64, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61,
+ 0x6C, 0x6C, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x2F, 0x58, 0x55, 0x49, 0x44, 0x20, 0x65, 0x78, 0x63,
+ 0x68, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x7D, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F,
+ 0x70, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20, 0x7B, 0x20, 0x70,
+ 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D,
+ 0x7B, 0x20, 0x2F, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x2F, 0x46, 0x6F, 0x6E, 0x74,
+ 0x49, 0x6E, 0x66, 0x6F, 0x20, 0x7D, 0x20, 0x7B, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x6C, 0x6F, 0x61,
+ 0x64, 0x20, 0x64, 0x75, 0x70, 0x20, 0x6D, 0x61, 0x78, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20,
+ 0x64, 0x69, 0x63, 0x74, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6E, 0x20, 0x7B, 0x0D, 0x66, 0x61, 0x6C,
+ 0x73, 0x65, 0x20, 0x7B, 0x20, 0x2F, 0x55, 0x6E, 0x69, 0x71, 0x75, 0x65, 0x49, 0x44, 0x20, 0x2F,
+ 0x58, 0x55, 0x49, 0x44, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78,
+ 0x20, 0x65, 0x71, 0x20, 0x6F, 0x72, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x0D,
+ 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x64, 0x65,
+ 0x66, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72,
+ 0x61, 0x6C, 0x6C, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x64, 0x69, 0x63, 0x74, 0x20,
+ 0x65, 0x6E, 0x64, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C,
+ 0x0D, 0x64, 0x75, 0x70, 0x20, 0x2F, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x56, 0x65, 0x63, 0x74,
+ 0x6F, 0x72, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x64, 0x75, 0x70, 0x20,
+ 0x2F, 0x24, 0x42, 0x6C, 0x65, 0x6E, 0x64, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x5B, 0x0D, 0x65,
+ 0x78, 0x63, 0x68, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x65, 0x78, 0x63, 0x68, 0x0D, 0x64,
+ 0x75, 0x70, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x31, 0x20, 0x73, 0x75, 0x62, 0x20,
+ 0x2D, 0x31, 0x20, 0x31, 0x20, 0x7B, 0x0D, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x64,
+ 0x75, 0x70, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x33, 0x20, 0x2D, 0x31, 0x20, 0x72,
+ 0x6F, 0x6C, 0x6C, 0x20, 0x73, 0x75, 0x62, 0x20, 0x67, 0x65, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20,
+ 0x30, 0x20, 0x65, 0x71, 0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x31, 0x20, 0x69, 0x6E, 0x64,
+ 0x65, 0x78, 0x20, 0x7B, 0x20, 0x2F, 0x65, 0x78, 0x63, 0x68, 0x20, 0x6C, 0x6F, 0x61, 0x64, 0x20,
+ 0x33, 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x0D, 0x2F, 0x70,
+ 0x6F, 0x70, 0x20, 0x6C, 0x6F, 0x61, 0x64, 0x20, 0x33, 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C,
+ 0x0D, 0x7D, 0x20, 0x7B, 0x20, 0x64, 0x75, 0x70, 0x20, 0x31, 0x20, 0x65, 0x71, 0x20, 0x7B, 0x20,
+ 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20,
+ 0x7B, 0x20, 0x2F, 0x65, 0x78, 0x63, 0x68, 0x20, 0x6C, 0x6F, 0x61, 0x64, 0x20, 0x34, 0x20, 0x31,
+ 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x0D, 0x33, 0x20, 0x31, 0x20, 0x72,
+ 0x6F, 0x6C, 0x6C, 0x20, 0x2F, 0x6D, 0x75, 0x6C, 0x20, 0x6C, 0x6F, 0x61, 0x64, 0x20, 0x33, 0x20,
+ 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D,
+ 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x7B, 0x20, 0x2F, 0x61, 0x64, 0x64, 0x20, 0x6C,
+ 0x6F, 0x61, 0x64, 0x20, 0x33, 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x20, 0x7D, 0x20, 0x69,
+ 0x66, 0x0D, 0x65, 0x78, 0x63, 0x68, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20,
+ 0x65, 0x78, 0x63, 0x68, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20,
+ 0x66, 0x6F, 0x72, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x7B, 0x20, 0x2F, 0x61, 0x64, 0x64, 0x20, 0x6C,
+ 0x6F, 0x61, 0x64, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x0D, 0x5D, 0x20, 0x63, 0x76, 0x78, 0x20, 0x64,
+ 0x65, 0x66, 0x0D, 0x7B, 0x20, 0x32, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x6C, 0x65, 0x6E, 0x67,
+ 0x74, 0x68, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x6E,
+ 0x65, 0x20, 0x7B, 0x20, 0x2F, 0x6D, 0x61, 0x6B, 0x65, 0x62, 0x6C, 0x65, 0x6E, 0x64, 0x65, 0x64,
+ 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x63, 0x76, 0x78, 0x20, 0x65, 0x72, 0x72, 0x6F, 0x72, 0x64, 0x69,
+ 0x63, 0x74, 0x20, 0x2F, 0x74, 0x79, 0x70, 0x65, 0x63, 0x68, 0x65, 0x63, 0x6B, 0x20, 0x67, 0x65,
+ 0x74, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x0D, 0x30, 0x20, 0x30, 0x20,
+ 0x31, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68,
+ 0x20, 0x31, 0x20, 0x73, 0x75, 0x62, 0x20, 0x7B, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x20, 0x69,
+ 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20, 0x65, 0x78,
+ 0x63, 0x68, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20,
+ 0x67, 0x65, 0x74, 0x20, 0x6D, 0x75, 0x6C, 0x20, 0x61, 0x64, 0x64, 0x0D, 0x7D, 0x20, 0x66, 0x6F,
+ 0x72, 0x0D, 0x65, 0x78, 0x63, 0x68, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20,
+ 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x7B, 0x20, 0x64, 0x75, 0x70, 0x20, 0x74, 0x79,
+ 0x70, 0x65, 0x20, 0x64, 0x75, 0x70, 0x20, 0x64, 0x75, 0x70, 0x20, 0x2F, 0x61, 0x72, 0x72, 0x61,
+ 0x79, 0x74, 0x79, 0x70, 0x65, 0x20, 0x65, 0x71, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x2F, 0x70,
+ 0x61, 0x63, 0x6B, 0x65, 0x64, 0x61, 0x72, 0x72, 0x61, 0x79, 0x74, 0x79, 0x70, 0x65, 0x20, 0x65,
+ 0x71, 0x20, 0x6F, 0x72, 0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x31, 0x20, 0x69, 0x6E, 0x64,
+ 0x65, 0x78, 0x20, 0x2F, 0x46, 0x6F, 0x72, 0x63, 0x65, 0x42, 0x6F, 0x6C, 0x64, 0x20, 0x65, 0x71,
+ 0x20, 0x7B, 0x0D, 0x35, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x30, 0x20, 0x30, 0x20, 0x31,
+ 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20,
+ 0x31, 0x20, 0x73, 0x75, 0x62, 0x20, 0x7B, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x34, 0x20, 0x69, 0x6E,
+ 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20, 0x7B, 0x20, 0x32,
+ 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20,
+ 0x61, 0x64, 0x64, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x69, 0x66,
+ 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20,
+ 0x70, 0x6F, 0x70, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x70, 0x6F, 0x70, 0x0D, 0x32, 0x20, 0x69,
+ 0x6E, 0x64, 0x65, 0x78, 0x20, 0x2F, 0x46, 0x6F, 0x72, 0x63, 0x65, 0x42, 0x6F, 0x6C, 0x64, 0x54,
+ 0x68, 0x72, 0x65, 0x73, 0x68, 0x6F, 0x6C, 0x64, 0x20, 0x67, 0x65, 0x74, 0x20, 0x67, 0x74, 0x20,
+ 0x33, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x7D, 0x20, 0x7B, 0x0D, 0x7B, 0x20, 0x6C, 0x65, 0x6E,
+ 0x67, 0x74, 0x68, 0x20, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x6C, 0x65, 0x6E, 0x67,
+ 0x74, 0x68, 0x20, 0x6E, 0x65, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x66, 0x61, 0x6C, 0x73,
+ 0x65, 0x20, 0x7D, 0x20, 0x7B, 0x0D, 0x74, 0x72, 0x75, 0x65, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20,
+ 0x7B, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x64, 0x75, 0x70, 0x20, 0x2F, 0x69, 0x6E, 0x74, 0x65,
+ 0x67, 0x65, 0x72, 0x74, 0x79, 0x70, 0x65, 0x20, 0x65, 0x71, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20,
+ 0x2F, 0x72, 0x65, 0x61, 0x6C, 0x74, 0x79, 0x70, 0x65, 0x20, 0x65, 0x71, 0x20, 0x65, 0x78, 0x63,
+ 0x68, 0x20, 0x6F, 0x72, 0x20, 0x61, 0x6E, 0x64, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C,
+ 0x6C, 0x0D, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x0D, 0x32, 0x20, 0x63,
+ 0x6F, 0x70, 0x79, 0x20, 0x38, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68,
+ 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x35, 0x20, 0x69, 0x6E,
+ 0x64, 0x65, 0x78, 0x20, 0x35, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x65, 0x63,
+ 0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x64, 0x75, 0x70, 0x20, 0x6C, 0x65,
+ 0x6E, 0x67, 0x74, 0x68, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x31, 0x20, 0x69, 0x6E, 0x64,
+ 0x65, 0x78, 0x20, 0x78, 0x63, 0x68, 0x65, 0x63, 0x6B, 0x20, 0x7B, 0x20, 0x63, 0x76, 0x78, 0x20,
+ 0x7D, 0x20, 0x69, 0x66, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20,
+ 0x31, 0x20, 0x73, 0x75, 0x62, 0x20, 0x30, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x31, 0x20, 0x65,
+ 0x78, 0x63, 0x68, 0x20, 0x7B, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65,
+ 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20, 0x64, 0x75, 0x70, 0x20, 0x74,
+ 0x79, 0x70, 0x65, 0x20, 0x64, 0x75, 0x70, 0x20, 0x2F, 0x61, 0x72, 0x72, 0x61, 0x79, 0x74, 0x79,
+ 0x70, 0x65, 0x20, 0x65, 0x71, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x2F, 0x70, 0x61, 0x63, 0x6B,
+ 0x65, 0x64, 0x61, 0x72, 0x72, 0x61, 0x79, 0x74, 0x79, 0x70, 0x65, 0x20, 0x65, 0x71, 0x20, 0x6F,
+ 0x72, 0x20, 0x7B, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x31, 0x30, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78,
+ 0x20, 0x36, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x7B, 0x0D,
+ 0x39, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x39, 0x20, 0x69,
+ 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x20, 0x7D,
+ 0x20, 0x69, 0x66, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x33, 0x20, 0x31, 0x20,
+ 0x72, 0x6F, 0x6C, 0x6C, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x20, 0x65,
+ 0x78, 0x63, 0x68, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x70, 0x6F, 0x70,
+ 0x0D, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x33, 0x20, 0x63, 0x6F, 0x70, 0x79,
+ 0x0D, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x64, 0x75, 0x70, 0x20, 0x2F, 0x53, 0x74,
+ 0x65, 0x6D, 0x53, 0x6E, 0x61, 0x70, 0x48, 0x20, 0x65, 0x71, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20,
+ 0x2F, 0x53, 0x74, 0x65, 0x6D, 0x53, 0x6E, 0x61, 0x70, 0x56, 0x20, 0x65, 0x71, 0x20, 0x6F, 0x72,
+ 0x20, 0x7B, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x31, 0x20,
+ 0x73, 0x75, 0x62, 0x20, 0x7B, 0x20, 0x64, 0x75, 0x70, 0x20, 0x30, 0x20, 0x6C, 0x65, 0x20, 0x7B,
+ 0x20, 0x65, 0x78, 0x69, 0x74, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x64,
+ 0x75, 0x70, 0x20, 0x31, 0x20, 0x73, 0x75, 0x62, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78,
+ 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x33,
+ 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20,
+ 0x32, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x65, 0x71, 0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20,
+ 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20,
+ 0x30, 0x20, 0x70, 0x75, 0x74, 0x20, 0x30, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x20, 0x6C, 0x65, 0x20,
+ 0x7B, 0x20, 0x31, 0x20, 0x73, 0x75, 0x62, 0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x64, 0x75, 0x70, 0x20,
+ 0x64, 0x75, 0x70, 0x20, 0x31, 0x20, 0x73, 0x75, 0x62, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65,
+ 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20,
+ 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74,
+ 0x0D, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x33, 0x20,
+ 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x31, 0x20, 0x73, 0x75, 0x62, 0x20, 0x65, 0x78, 0x63, 0x68,
+ 0x20, 0x70, 0x75, 0x74, 0x0D, 0x33, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x70, 0x75, 0x74, 0x20,
+ 0x70, 0x6F, 0x70, 0x0D, 0x32, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20,
+ 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x31, 0x20, 0x73, 0x75, 0x62, 0x20, 0x6C, 0x74, 0x20,
+ 0x7B, 0x20, 0x31, 0x20, 0x61, 0x64, 0x64, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x20, 0x7D, 0x20, 0x69,
+ 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x6C, 0x6F, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70,
+ 0x0D, 0x64, 0x75, 0x70, 0x20, 0x30, 0x20, 0x67, 0x65, 0x74, 0x20, 0x30, 0x20, 0x6C, 0x65, 0x20,
+ 0x7B, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x30, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x7B, 0x20, 0x30,
+ 0x20, 0x67, 0x74, 0x20, 0x7B, 0x20, 0x65, 0x78, 0x69, 0x74, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x20,
+ 0x31, 0x20, 0x61, 0x64, 0x64, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C, 0x0D, 0x64,
+ 0x75, 0x70, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74,
+ 0x68, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x73, 0x75, 0x62, 0x20, 0x67, 0x65, 0x74, 0x69, 0x6E,
+ 0x74, 0x65, 0x72, 0x76, 0x61, 0x6C, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x20, 0x7D, 0x20, 0x69, 0x66,
+ 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x70, 0x75, 0x74, 0x20, 0x7D, 0x0D,
+ 0x7B, 0x20, 0x2F, 0x64, 0x69, 0x63, 0x74, 0x74, 0x79, 0x70, 0x65, 0x20, 0x65, 0x71, 0x20, 0x7B,
+ 0x20, 0x36, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x33, 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C,
+ 0x20, 0x67, 0x65, 0x74, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65,
+ 0x78, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x2F, 0x6D, 0x61, 0x6B, 0x65,
+ 0x62, 0x6C, 0x65, 0x6E, 0x64, 0x65, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x63, 0x76, 0x78, 0x20,
+ 0x65, 0x72, 0x72, 0x6F, 0x72, 0x64, 0x69, 0x63, 0x74, 0x20, 0x2F, 0x74, 0x79, 0x70, 0x65, 0x63,
+ 0x68, 0x65, 0x63, 0x6B, 0x20, 0x67, 0x65, 0x74, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x7D, 0x20,
+ 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20,
+ 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x66, 0x6F, 0x72, 0x61, 0x6C, 0x6C,
+ 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70,
+ 0x20, 0x7D, 0x0D, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x64, 0x69, 0x63, 0x74, 0x20, 0x42,
+ 0x6C, 0x65, 0x6E, 0x64, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x65,
+ 0x63, 0x0D, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x64, 0x69, 0x63, 0x74, 0x20, 0x65, 0x6E,
+ 0x64, 0x0D, 0x7D, 0x20, 0x62, 0x69, 0x6E, 0x64, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x2F, 0x24, 0x66,
+ 0x62, 0x66, 0x20, 0x7B, 0x20, 0x46, 0x6F, 0x6E, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F,
+ 0x72, 0x79, 0x20, 0x63, 0x6F, 0x75, 0x6E, 0x74, 0x74, 0x6F, 0x6D, 0x61, 0x72, 0x6B, 0x20, 0x33,
+ 0x20, 0x61, 0x64, 0x64, 0x20, 0x2D, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x20, 0x6B, 0x6E, 0x6F,
+ 0x77, 0x6E, 0x20, 0x7B, 0x0D, 0x63, 0x6C, 0x65, 0x61, 0x72, 0x74, 0x6F, 0x6D, 0x61, 0x72, 0x6B,
+ 0x20, 0x70, 0x6F, 0x70, 0x20, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x7D, 0x20,
+ 0x7B, 0x0D, 0x5D, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E,
+ 0x74, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x6D, 0x61, 0x6B, 0x65, 0x62, 0x6C, 0x65, 0x6E, 0x64,
+ 0x65, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x0D, 0x64, 0x75, 0x70, 0x20, 0x2F, 0x45, 0x6E, 0x63, 0x6F,
+ 0x64, 0x69, 0x6E, 0x67, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x66, 0x6F, 0x6E, 0x74,
+ 0x20, 0x2F, 0x45, 0x6E, 0x63, 0x6F, 0x64, 0x69, 0x6E, 0x67, 0x20, 0x67, 0x65, 0x74, 0x20, 0x70,
+ 0x75, 0x74, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6E, 0x65, 0x66, 0x6F, 0x6E, 0x74, 0x0D, 0x7D, 0x20,
+ 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x66, 0x6F,
+ 0x6E, 0x74, 0x20, 0x2F, 0x53, 0x63, 0x61, 0x6C, 0x65, 0x4D, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20,
+ 0x67, 0x65, 0x74, 0x20, 0x6D, 0x61, 0x6B, 0x65, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x73, 0x65, 0x74,
+ 0x66, 0x6F, 0x6E, 0x74, 0x0D, 0x7D, 0x20, 0x62, 0x69, 0x6E, 0x64, 0x20, 0x70, 0x75, 0x74, 0x20,
+ 0x7D, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x69, 0x66,
+ 0x65, 0x6C, 0x73, 0x65, 0x20, 0x65, 0x78, 0x65, 0x63, 0x0D, 0x2F, 0x4E, 0x6F, 0x72, 0x6D, 0x61,
+ 0x6C, 0x69, 0x7A, 0x65, 0x44, 0x65, 0x73, 0x69, 0x67, 0x6E, 0x56, 0x65, 0x63, 0x74, 0x6F, 0x72,
+ 0x20, 0x7B, 0x0D, 0x65, 0x78, 0x63, 0x68, 0x20, 0x31, 0x31, 0x30, 0x20, 0x73, 0x75, 0x62, 0x20,
+ 0x36, 0x38, 0x30, 0x20, 0x64, 0x69, 0x76, 0x0D, 0x65, 0x78, 0x63, 0x68, 0x20, 0x31, 0x30, 0x30,
+ 0x20, 0x73, 0x75, 0x62, 0x20, 0x38, 0x30, 0x30, 0x20, 0x64, 0x69, 0x76, 0x0D, 0x7D, 0x20, 0x62,
+ 0x69, 0x6E, 0x64, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x43, 0x6F, 0x6E, 0x76, 0x65, 0x72, 0x74,
+ 0x44, 0x65, 0x73, 0x69, 0x67, 0x6E, 0x56, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x20, 0x7B, 0x0D, 0x31,
+ 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x73, 0x75, 0x62, 0x20, 0x31, 0x20, 0x32,
+ 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x73, 0x75, 0x62, 0x20, 0x6D, 0x75, 0x6C, 0x20, 0x33,
+ 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x0D, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20,
+ 0x31, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x73, 0x75, 0x62, 0x20, 0x6D, 0x75,
+ 0x6C, 0x20, 0x33, 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x0D, 0x31, 0x20, 0x32, 0x20, 0x69,
+ 0x6E, 0x64, 0x65, 0x78, 0x20, 0x73, 0x75, 0x62, 0x20, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78,
+ 0x20, 0x6D, 0x75, 0x6C, 0x20, 0x33, 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x0D, 0x31, 0x20,
+ 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x31, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x6D, 0x75,
+ 0x6C, 0x20, 0x33, 0x20, 0x31, 0x20, 0x72, 0x6F, 0x6C, 0x6C, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x70,
+ 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x62, 0x69, 0x6E, 0x64, 0x20, 0x64, 0x65, 0x66, 0x0D, 0x2F, 0x24,
+ 0x6D, 0x6D, 0x66, 0x66, 0x5F, 0x6F, 0x72, 0x69, 0x67, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E,
+ 0x74, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x73, 0x61,
+ 0x76, 0x65, 0x20, 0x7B, 0x20, 0x72, 0x65, 0x73, 0x74, 0x6F, 0x72, 0x65, 0x20, 0x7D, 0x20, 0x7B,
+ 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x0D, 0x7D, 0x20, 0x7B, 0x20, 0x7B,
+ 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x64, 0x65, 0x66, 0x20, 0x7D, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65,
+ 0x6C, 0x73, 0x65, 0x0D, 0x2F, 0x73, 0x65, 0x74, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x77,
+ 0x68, 0x65, 0x72, 0x65, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20,
+ 0x7D, 0x20, 0x7B, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C,
+ 0x73, 0x65, 0x0D, 0x2F, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x77, 0x68, 0x65,
+ 0x72, 0x65, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x64, 0x75, 0x70, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65,
+ 0x6D, 0x64, 0x69, 0x63, 0x74, 0x20, 0x65, 0x71, 0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x7B,
+ 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x7B,
+ 0x20, 0x7B, 0x20, 0x7D, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x73, 0x65,
+ 0x74, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x7B, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20,
+ 0x73, 0x65, 0x74, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x7D, 0x20, 0x7D, 0x20, 0x69, 0x66,
+ 0x65, 0x6C, 0x73, 0x65, 0x20, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x64, 0x69, 0x63, 0x74, 0x0D,
+ 0x7D, 0x20, 0x7B, 0x20, 0x7B, 0x20, 0x7D, 0x20, 0x75, 0x73, 0x65, 0x72, 0x64, 0x69, 0x63, 0x74,
+ 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6E, 0x0D,
+ 0x7D, 0x20, 0x7B, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6E, 0x20, 0x7B, 0x20, 0x63, 0x75, 0x72, 0x72,
+ 0x65, 0x6E, 0x74, 0x64, 0x69, 0x63, 0x74, 0x20, 0x73, 0x63, 0x68, 0x65, 0x63, 0x6B, 0x20, 0x7D,
+ 0x20, 0x7B, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73,
+ 0x65, 0x20, 0x7B, 0x0D, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x73, 0x68, 0x61, 0x72, 0x65,
+ 0x64, 0x20, 0x7B, 0x20, 0x7B, 0x20, 0x7D, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x74, 0x72, 0x75, 0x65,
+ 0x20, 0x73, 0x65, 0x74, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x7B, 0x20, 0x66, 0x61, 0x6C,
+ 0x73, 0x65, 0x20, 0x73, 0x65, 0x74, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x7D, 0x20, 0x7D,
+ 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20, 0x7B, 0x20, 0x7B, 0x20, 0x7D, 0x20,
+ 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73,
+ 0x65, 0x0D, 0x2F, 0x24, 0x6D, 0x6D, 0x66, 0x66, 0x5F, 0x6F, 0x72, 0x69, 0x67, 0x66, 0x69, 0x6E,
+ 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x2F, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20,
+ 0x6C, 0x6F, 0x61, 0x64, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x65,
+ 0x63, 0x0D, 0x2F, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x7B, 0x0D, 0x64, 0x75,
+ 0x70, 0x20, 0x46, 0x6F, 0x6E, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x79, 0x20,
+ 0x65, 0x78, 0x63, 0x68, 0x20, 0x6B, 0x6E, 0x6F, 0x77, 0x6E, 0x0D, 0x7B, 0x20, 0x64, 0x75, 0x70,
+ 0x20, 0x46, 0x6F, 0x6E, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x79, 0x20, 0x65,
+ 0x78, 0x63, 0x68, 0x20, 0x67, 0x65, 0x74, 0x20, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x54, 0x79, 0x70,
+ 0x65, 0x20, 0x67, 0x65, 0x74, 0x20, 0x33, 0x20, 0x6E, 0x65, 0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x64,
+ 0x75, 0x70, 0x20, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, 0x46, 0x6F, 0x6E, 0x74, 0x44, 0x69, 0x72,
+ 0x65, 0x63, 0x74, 0x6F, 0x72, 0x79, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x6B, 0x6E, 0x6F, 0x77,
+ 0x6E, 0x0D, 0x7B, 0x20, 0x64, 0x75, 0x70, 0x20, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, 0x46, 0x6F,
+ 0x6E, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x79, 0x20, 0x65, 0x78, 0x63, 0x68,
+ 0x20, 0x67, 0x65, 0x74, 0x20, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x54, 0x79, 0x70, 0x65, 0x20, 0x67,
+ 0x65, 0x74, 0x20, 0x33, 0x20, 0x6E, 0x65, 0x20, 0x7D, 0x0D, 0x7B, 0x20, 0x66, 0x61, 0x6C, 0x73,
+ 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65,
+ 0x6C, 0x73, 0x65, 0x0D, 0x7B, 0x20, 0x24, 0x6D, 0x6D, 0x66, 0x66, 0x5F, 0x6F, 0x72, 0x69, 0x67,
+ 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x64, 0x75, 0x70,
+ 0x20, 0x64, 0x75, 0x70, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x73, 0x74, 0x72, 0x69,
+ 0x6E, 0x67, 0x20, 0x63, 0x76, 0x73, 0x20, 0x28, 0x5F, 0x29, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63,
+ 0x68, 0x20, 0x7B, 0x0D, 0x63, 0x76, 0x6E, 0x20, 0x64, 0x75, 0x70, 0x20, 0x64, 0x75, 0x70, 0x20,
+ 0x46, 0x6F, 0x6E, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x79, 0x20, 0x65, 0x78,
+ 0x63, 0x68, 0x20, 0x6B, 0x6E, 0x6F, 0x77, 0x6E, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x53, 0x68,
+ 0x61, 0x72, 0x65, 0x64, 0x46, 0x6F, 0x6E, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F, 0x72,
+ 0x79, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x6B, 0x6E, 0x6F, 0x77, 0x6E, 0x20, 0x6F, 0x72, 0x20,
+ 0x7B, 0x0D, 0x74, 0x72, 0x75, 0x65, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x64, 0x75, 0x70, 0x20, 0x6C,
+ 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x37, 0x20, 0x61, 0x64, 0x64, 0x20, 0x73, 0x74, 0x72, 0x69,
+ 0x6E, 0x67, 0x20, 0x64, 0x75, 0x70, 0x20, 0x30, 0x20, 0x28, 0x25, 0x66, 0x6F, 0x6E, 0x74, 0x25,
+ 0x29, 0x20, 0x70, 0x75, 0x74, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6C, 0x0D, 0x64, 0x75,
+ 0x70, 0x20, 0x32, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x36, 0x20, 0x65, 0x78, 0x63, 0x68,
+ 0x20, 0x64, 0x75, 0x70, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20, 0x73, 0x74, 0x72, 0x69,
+ 0x6E, 0x67, 0x20, 0x63, 0x76, 0x73, 0x20, 0x70, 0x75, 0x74, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x76,
+ 0x61, 0x6C, 0x0D, 0x7B, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x7D, 0x20, 0x73, 0x74,
+ 0x6F, 0x70, 0x70, 0x65, 0x64, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x66, 0x61, 0x6C, 0x73,
+ 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70,
+ 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x7D, 0x20,
+ 0x7B, 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65,
+ 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7B, 0x0D, 0x24, 0x6D, 0x6D, 0x66,
+ 0x66, 0x5F, 0x6F, 0x72, 0x69, 0x67, 0x66, 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x62,
+ 0x65, 0x67, 0x69, 0x6E, 0x20, 0x70, 0x6F, 0x70, 0x0D, 0x5B, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20,
+ 0x7B, 0x20, 0x28, 0x5F, 0x29, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x7B, 0x20, 0x7B,
+ 0x20, 0x63, 0x76, 0x72, 0x20, 0x7D, 0x20, 0x73, 0x74, 0x6F, 0x70, 0x70, 0x65, 0x64, 0x20, 0x7B,
+ 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x7B, 0x0D, 0x65, 0x78, 0x63,
+ 0x68, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65,
+ 0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x65, 0x78, 0x69, 0x74,
+ 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x7D, 0x20, 0x6C, 0x6F, 0x6F, 0x70,
+ 0x20, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x20, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x49, 0x6E, 0x66, 0x6F,
+ 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x7B, 0x0D, 0x70, 0x6F, 0x70, 0x20, 0x46, 0x6F, 0x6E,
+ 0x74, 0x49, 0x6E, 0x66, 0x6F, 0x20, 0x2F, 0x42, 0x6C, 0x65, 0x6E, 0x64, 0x41, 0x78, 0x69, 0x73,
+ 0x54, 0x79, 0x70, 0x65, 0x73, 0x20, 0x32, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x6B, 0x6E, 0x6F,
+ 0x77, 0x6E, 0x20, 0x7B, 0x0D, 0x67, 0x65, 0x74, 0x20, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x20,
+ 0x63, 0x6F, 0x75, 0x6E, 0x74, 0x74, 0x6F, 0x6D, 0x61, 0x72, 0x6B, 0x20, 0x32, 0x20, 0x73, 0x75,
+ 0x62, 0x20, 0x65, 0x71, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x70, 0x6F, 0x70, 0x0D, 0x7D, 0x20,
+ 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C,
+ 0x73, 0x65, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x20, 0x7B, 0x0D, 0x4E, 0x6F, 0x72, 0x6D, 0x61, 0x6C,
+ 0x69, 0x7A, 0x65, 0x44, 0x65, 0x73, 0x69, 0x67, 0x6E, 0x56, 0x65, 0x63, 0x74, 0x6F, 0x72, 0x0D,
+ 0x43, 0x6F, 0x6E, 0x76, 0x65, 0x72, 0x74, 0x44, 0x65, 0x73, 0x69, 0x67, 0x6E, 0x56, 0x65, 0x63,
+ 0x74, 0x6F, 0x72, 0x0D, 0x5D, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x64, 0x69, 0x63,
+ 0x74, 0x20, 0x65, 0x78, 0x63, 0x68, 0x20, 0x6D, 0x61, 0x6B, 0x65, 0x62, 0x6C, 0x65, 0x6E, 0x64,
+ 0x65, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x0D, 0x32, 0x20, 0x63, 0x6F, 0x70, 0x79, 0x20, 0x65, 0x78,
+ 0x63, 0x68, 0x20, 0x2F, 0x46, 0x6F, 0x6E, 0x74, 0x4E, 0x61, 0x6D, 0x65, 0x20, 0x65, 0x78, 0x63,
+ 0x68, 0x20, 0x70, 0x75, 0x74, 0x0D, 0x64, 0x65, 0x66, 0x69, 0x6E, 0x65, 0x66, 0x6F, 0x6E, 0x74,
+ 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x63, 0x6C, 0x65, 0x61, 0x72, 0x74, 0x6F, 0x6D, 0x61, 0x72, 0x6B,
+ 0x20, 0x24, 0x6D, 0x6D, 0x66, 0x66, 0x5F, 0x6F, 0x72, 0x69, 0x67, 0x66, 0x69, 0x6E, 0x64, 0x66,
+ 0x6F, 0x6E, 0x74, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x20, 0x65, 0x6E, 0x64,
+ 0x0D, 0x7D, 0x20, 0x7B, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70,
+ 0x20, 0x24, 0x6D, 0x6D, 0x66, 0x66, 0x5F, 0x6F, 0x72, 0x69, 0x67, 0x66, 0x69, 0x6E, 0x64, 0x66,
+ 0x6F, 0x6E, 0x74, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20, 0x7B,
+ 0x20, 0x70, 0x6F, 0x70, 0x20, 0x24, 0x6D, 0x6D, 0x66, 0x66, 0x5F, 0x6F, 0x72, 0x69, 0x67, 0x66,
+ 0x69, 0x6E, 0x64, 0x66, 0x6F, 0x6E, 0x74, 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65,
+ 0x20, 0x7D, 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x7D, 0x20, 0x62, 0x69, 0x6E, 0x64,
+ 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x65, 0x63, 0x0D, 0x2F, 0x53,
+ 0x68, 0x61, 0x72, 0x65, 0x64, 0x46, 0x6F, 0x6E, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6F,
+ 0x72, 0x79, 0x20, 0x64, 0x75, 0x70, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x7B, 0x20, 0x70,
+ 0x6F, 0x70, 0x20, 0x70, 0x6F, 0x70, 0x20, 0x7D, 0x20, 0x7B, 0x20, 0x30, 0x20, 0x64, 0x69, 0x63,
+ 0x74, 0x20, 0x33, 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x7D,
+ 0x20, 0x69, 0x66, 0x65, 0x6C, 0x73, 0x65, 0x0D, 0x65, 0x6E, 0x64, 0x20, 0x65, 0x78, 0x65, 0x63,
+ 0x20, 0x70, 0x6F, 0x70, 0x20, 0x65, 0x78, 0x65, 0x63, 0x0D, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E,
+ 0x74, 0x64, 0x69, 0x63, 0x74, 0x20, 0x65, 0x6E, 0x64, 0x0D, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E,
+ 0x74, 0x66, 0x69, 0x6C, 0x65, 0x20, 0x65, 0x65, 0x78, 0x65, 0x63, 0x0D, 0x80, 0x02, 0x0B, 0x8F,
+ 0x01, 0x00, 0xE8, 0xDC, 0x61, 0x72, 0x80, 0x71, 0xAB, 0xD4, 0xD5, 0xBC, 0xD2, 0x30, 0xC4, 0xE1,
+ 0x86, 0xDC, 0xE0, 0x96, 0x54, 0x1C, 0x9C, 0x1F, 0x2E, 0x58, 0x69, 0x40, 0x4E, 0x33, 0xF9, 0xCE,
+ 0xFF, 0x7D, 0x2F, 0xBF, 0xEF, 0x5F, 0x26, 0xC7, 0xE1, 0x84, 0x89, 0x54, 0xC7, 0x07, 0x55, 0x24,
+ 0x4E, 0x73, 0x41, 0xB8, 0x26, 0x97, 0xE2, 0xE8, 0xEA, 0x9C, 0xE9, 0x13, 0x1D, 0x00, 0x55, 0x78,
+ 0xAB, 0x3D, 0xE1, 0x9F, 0xA9, 0xF2, 0xFA, 0xFF, 0x3B, 0xEB, 0x53, 0x17, 0x4A, 0x8E, 0x2F, 0x33,
+ 0xE9, 0xDB, 0xE0, 0x38, 0x63, 0x42, 0xF4, 0x0E, 0x5D, 0xF2, 0x5B, 0x7A, 0x88, 0x22, 0xEE, 0x2B,
+ 0x6C, 0xDC, 0xAC, 0x58, 0xA9, 0x8F, 0x9B, 0x04, 0x71, 0x44, 0xE3, 0xF6, 0xE7, 0x4A, 0xB6, 0x0C,
+ 0x00, 0xE4, 0x42, 0xE8, 0x30, 0xB1, 0x30, 0x30, 0x8A, 0x3F, 0x0E, 0xDF, 0x2C, 0xE6, 0x62, 0x35,
+ 0xF9, 0x21, 0x6D, 0x42, 0x0F, 0x23, 0xAC, 0xED, 0xEC, 0x60, 0xA8, 0x8A, 0x73, 0x77, 0x14, 0x62,
+ 0xE1, 0xB2, 0x04, 0x04, 0x29, 0x5D, 0x49, 0xBA, 0x8A, 0x8B, 0xCB, 0xF2, 0x04, 0x2A, 0x8D, 0xEB,
+ 0x9A, 0x65, 0xBA, 0xF1, 0xC8, 0x24, 0x2F, 0x7E, 0x90, 0xD9, 0x49, 0x63, 0x23, 0x73, 0xF8, 0x43,
+ 0x8F, 0xC1, 0xE7, 0x37, 0x37, 0x0B, 0x91, 0x15, 0x08, 0x9D, 0xA7, 0x90, 0xA8, 0x28, 0x50, 0xB6,
+ 0x91, 0xE6, 0xE8, 0x3B, 0x37, 0x22, 0xC0, 0x07, 0x14, 0xDC, 0xBC, 0xEA, 0xA1, 0xDC, 0x3D, 0x22,
+ 0x98, 0x3B, 0x35, 0x61, 0x6A, 0xD7, 0xF1, 0x03, 0x35, 0x0B, 0x4A, 0x40, 0xB2, 0xAA, 0xE5, 0x0E,
+ 0xF0, 0x94, 0x6C, 0x77, 0xC5, 0x67, 0x73, 0x0D, 0x0D, 0xE6, 0x76, 0xA6, 0x95, 0x13, 0x0A, 0xBE,
+ 0xC8, 0xC7, 0xB8, 0xC4, 0x6B, 0xFA, 0xBC, 0xDA, 0xDD, 0x88, 0x2C, 0x74, 0x58, 0x58, 0x9B, 0x2B,
+ 0xEA, 0x87, 0xE1, 0x23, 0x2C, 0x60, 0x58, 0x0C, 0x62, 0x35, 0xB7, 0xD7, 0xE8, 0xC6, 0x6A, 0x2A,
+ 0x72, 0x90, 0x1F, 0x3D, 0x0D, 0x76, 0x59, 0x30, 0x0E, 0x7E, 0x04, 0xFF, 0xDE, 0x4A, 0xA6, 0xD8,
+ 0x88, 0x25, 0x75, 0x76, 0x30, 0xCF, 0x8C, 0x9E, 0x8E, 0xA4, 0x14, 0x10, 0x7F, 0x2F, 0xC4, 0xA8,
+ 0x0F, 0xCA, 0xAF, 0xCB, 0x54, 0x39, 0x87, 0x1A, 0x81, 0x71, 0xFB, 0xA5, 0x08, 0x17, 0x4F, 0x53,
+ 0xB8, 0xEC, 0xE2, 0xD3, 0xBF, 0xBD, 0xBA, 0x93, 0x75, 0xFF, 0x8F, 0xB9, 0x66, 0x12, 0x02, 0x21,
+ 0x87, 0x6D, 0xB0, 0xDC, 0x2D, 0x37, 0x22, 0xB7, 0x88, 0xB4, 0xD3, 0x8F, 0x8B, 0x24, 0xEF, 0x76,
+ 0xF3, 0xB4, 0x91, 0x58, 0x95, 0xFF, 0x41, 0xD8, 0xFA, 0xFA, 0xD8, 0xE8, 0x68, 0xA9, 0xA8, 0x5B,
+ 0x59, 0x2C, 0xF0, 0x30, 0xA1, 0xD0, 0x44, 0x8A, 0x81, 0xF5, 0xE6, 0x92, 0x1E, 0xAE, 0xE8, 0x26,
+ 0xA4, 0xD9, 0xB7, 0x05, 0x5A, 0x9C, 0xA1, 0xC7, 0x98, 0xAA, 0xFA, 0x25, 0x91, 0x11, 0x4D, 0x61,
+ 0xCB, 0x50, 0x2E, 0xFC, 0xFC, 0x44, 0x63, 0x02, 0x08, 0xCB, 0xA9, 0x17, 0x10, 0x3B, 0xC3, 0xA1,
+ 0x2A, 0x60, 0xB1, 0x79, 0x84, 0x95, 0x83, 0xD0, 0xB1, 0xF1, 0xDC, 0x9F, 0xBE, 0xB2, 0xBC, 0x90,
+ 0xD1, 0xE4, 0xF2, 0x42, 0xD5, 0x08, 0x0B, 0xD4, 0xB1, 0x4C, 0x73, 0x8D, 0x0C, 0xD1, 0x69, 0xC8,
+ 0x1E, 0xB6, 0x84, 0x5F, 0xD9, 0x2D, 0xAB, 0x2A, 0x6B, 0xBB, 0x48, 0x3F, 0xB6, 0xFB, 0x08, 0x2F,
+ 0x57, 0x11, 0xAB, 0x42, 0x54, 0xC9, 0xD7, 0xB1, 0xF8, 0x28, 0xBA, 0xCD, 0x68, 0xF9, 0x0D, 0xE0,
+ 0xD1, 0x26, 0xCE, 0xA0, 0x24, 0x56, 0x63, 0xB7, 0xA1, 0xC6, 0x85, 0xD8, 0x55, 0x18, 0x60, 0x25,
+ 0x55, 0x0B, 0xC6, 0x9B, 0xC4, 0x28, 0x0C, 0x37, 0xE0, 0x9A, 0x74, 0x52, 0x0D, 0x76, 0x5F, 0x41,
+ 0xDC, 0xEA, 0xD8, 0x35, 0x1A, 0xB7, 0x49, 0xC3, 0x5C, 0x6D, 0xD0, 0x83, 0x7A, 0x4F, 0xC1, 0xCB,
+ 0x12, 0xAB, 0x27, 0x4B, 0xCF, 0x7F, 0xF8, 0x01, 0xC1, 0x8D, 0x13, 0x34, 0x62, 0xFF, 0xE0, 0x5C,
+ 0x56, 0xCE, 0x4E, 0x3D, 0x34, 0x37, 0xAC, 0xFB, 0xB0, 0x3E, 0x05, 0xA6, 0x2B, 0xF6, 0x2C, 0xA2,
+ 0x46, 0x65, 0x6A, 0xAF, 0x3E, 0xD6, 0x5A, 0x92, 0x22, 0xFF, 0x51, 0xF3, 0x19, 0x27, 0x39, 0xB3,
+ 0x32, 0x7F, 0x94, 0x7A, 0x6B, 0x56, 0xF8, 0xB8, 0xA5, 0x70, 0xB1, 0x3F, 0x15, 0x15, 0xF6, 0x61,
+ 0x4B, 0x88, 0xB0, 0x12, 0xE0, 0x4F, 0x6F, 0xE9, 0xCB, 0x2C, 0x72, 0x01, 0xB1, 0xDB, 0x85, 0x78,
+ 0x3C, 0x0F, 0xD2, 0x3B, 0x54, 0x8E, 0x29, 0x21, 0x66, 0xBA, 0x80, 0xC6, 0x05, 0x5E, 0xD1, 0xD9,
+ 0x93, 0xCD, 0x63, 0xA0, 0x95, 0xBB, 0x26, 0xA3, 0x36, 0x12, 0x2D, 0x1C, 0xE4, 0xEA, 0x98, 0xE6,
+ 0xDC, 0x9F, 0xD6, 0x61, 0xF8, 0x71, 0x14, 0xFE, 0xF8, 0x10, 0xB9, 0x24, 0x36, 0xF9, 0xB3, 0x6C,
+ 0x0F, 0xC3, 0x28, 0x46, 0x43, 0x19, 0xAF, 0xA7, 0xB1, 0xEC, 0x4A, 0x88, 0x7C, 0xE7, 0x85, 0x81,
+ 0x23, 0x69, 0xF3, 0x21, 0x90, 0xEB, 0x3D, 0xB1, 0x73, 0x4A, 0xB2, 0xF2, 0x55, 0x30, 0xF8, 0x02,
+ 0x79, 0x76, 0x1D, 0xFB, 0x0A, 0x40, 0x06, 0x61, 0xCC, 0xCB, 0x47, 0x94, 0x1A, 0x74, 0x70, 0x8F,
+ 0x1B, 0x93, 0x16, 0x24, 0xAA, 0x32, 0xD4, 0xB0, 0xEE, 0xCA, 0xEE, 0x0D, 0x27, 0x71, 0x0D, 0xE8,
+ 0xCC, 0xD7, 0x2A, 0x28, 0xA5, 0xC4, 0xD8, 0xDD, 0x0B, 0x16, 0x74, 0xF7, 0xE3, 0x61, 0x06, 0x37,
+ 0x24, 0x1C, 0x00, 0x14, 0x0C, 0x32, 0x7F, 0x88, 0x75, 0xF9, 0x9B, 0xFA, 0x3B, 0xCA, 0xF6, 0x51,
+ 0xD2, 0xAB, 0xD5, 0x3F, 0x21, 0xCD, 0x51, 0x3D, 0x3D, 0xB4, 0x81, 0xF9, 0x33, 0x79, 0xE9, 0x62,
+ 0x9F, 0x93, 0x5F, 0xA8, 0x77, 0x26, 0x75, 0x01, 0x40, 0xD3, 0xE3, 0xBD, 0x68, 0x8D, 0x1B, 0xCC,
+ 0xE7, 0x79, 0xB2, 0x3E, 0x61, 0xB6, 0x00, 0xF0, 0x0A, 0x58, 0xF2, 0xC1, 0x4C, 0x5A, 0xA4, 0x86,
+ 0xD4, 0xCA, 0xCB, 0x15, 0xCC, 0xD1, 0x16, 0x74, 0x70, 0xF3, 0xCB, 0xBA, 0x0E, 0x8A, 0xDB, 0xEB,
+ 0x4F, 0x3D, 0x0C, 0x3C, 0xFE, 0x40, 0x7D, 0x46, 0xC0, 0x0E, 0x0E, 0x18, 0x64, 0x69, 0xAB, 0xEF,
+ 0x00, 0x68, 0x83, 0x95, 0xFF, 0x32, 0xF3, 0x13, 0x78, 0x8C, 0x1E, 0xF9, 0xA8, 0xE8, 0x2D, 0x5F,
+ 0x04, 0xB8, 0x15, 0x22, 0x76, 0xDD, 0x46, 0xCF, 0x69, 0xA4, 0xCE, 0x5B, 0x20, 0x77, 0xA0, 0x22,
+ 0x24, 0xE5, 0xDE, 0xB8, 0xF3, 0x44, 0x5B, 0xC9, 0xEF, 0x47, 0xFD, 0x3A, 0x02, 0xAF, 0x31, 0x6C,
+ 0x02, 0x4A, 0x02, 0x3C, 0x65, 0x5A, 0x0B, 0x63, 0xB0, 0x11, 0xBB, 0x07, 0x3C, 0xFC, 0xFA, 0xAD,
+ 0x93, 0x46, 0x11, 0x6D, 0x68, 0xFF, 0xB7, 0xC7, 0x58, 0x2F, 0x7C, 0x23, 0x62, 0xD7, 0xD9, 0xF9,
+ 0x7A, 0x8A, 0xD3, 0x11, 0x58, 0xAC, 0x43, 0x0D, 0xA0, 0x77, 0x8D, 0x88, 0xD5, 0x34, 0xD1, 0xB9,
+ 0x2E, 0x4A, 0x8C, 0xDC, 0xA0, 0x71, 0xB9, 0xB2, 0x18, 0xC5, 0x74, 0x1E, 0x48, 0x9E, 0x70, 0x0A,
+ 0x7E, 0x9B, 0x71, 0xFA, 0xC7, 0x4D, 0x3C, 0x6E, 0x19, 0x88, 0xF0, 0xE2, 0xA5, 0x99, 0x3D, 0x85,
+ 0xBB, 0xE1, 0xDA, 0x82, 0x7B, 0xA9, 0xBA, 0x59, 0x0E, 0x03, 0x26, 0x3B, 0x83, 0xC8, 0x81, 0x36,
+ 0x70, 0xA4, 0x11, 0x97, 0x97, 0xB6, 0x47, 0x7D, 0x81, 0x02, 0x45, 0x1C, 0x76, 0x33, 0x98, 0x84,
+ 0xFE, 0xFE, 0x65, 0xDE, 0x37, 0x31, 0xE7, 0xD9, 0x6F, 0xDC, 0xAC, 0xC1, 0x1C, 0x1F, 0xA4, 0x08,
+ 0x98, 0x47, 0xD3, 0x53, 0xF9, 0x24, 0x6E, 0x26, 0x99, 0x7C, 0xF2, 0xCF, 0x2A, 0xC8, 0xCC, 0xAD,
+ 0x17, 0x09, 0xE3, 0x1B, 0x66, 0xAC, 0x24, 0x6F, 0xE0, 0x88, 0x14, 0xC4, 0x8A, 0xF2, 0xFA, 0x93,
+ 0xE9, 0x48, 0xB5, 0xA4, 0x52, 0xF9, 0xDE, 0x54, 0xF5, 0xF4, 0x20, 0x95, 0x45, 0xCE, 0x37, 0x2E,
+ 0x9E, 0x0A, 0xC7, 0x89, 0xF2, 0x00, 0x64, 0x6D, 0xBC, 0xAF, 0x9F, 0x52, 0xBC, 0xA0, 0x17, 0xE3,
+ 0x20, 0x42, 0xAB, 0xBF, 0xFB, 0x2A, 0x7F, 0x51, 0xAC, 0xCC, 0x40, 0xEF, 0x6D, 0xF2, 0xBC, 0x3D,
+ 0xE2, 0xDC, 0x99, 0x0C, 0x2D, 0xBC, 0x47, 0x1D, 0x98, 0x02, 0x0B, 0xB2, 0xE2, 0xA2, 0x03, 0x47,
+ 0x3C, 0x17, 0x69, 0xD6, 0x09, 0xA4, 0x8B, 0x9F, 0x63, 0x40, 0xD8, 0x5F, 0x67, 0xB3, 0x95, 0x28,
+ 0x16, 0xAF, 0x67, 0x97, 0x3A, 0x67, 0x29, 0x67, 0x3C, 0xF1, 0x9D, 0x24, 0x34, 0xE3, 0x47, 0x14,
+ 0xC6, 0x94, 0xA0, 0x1F, 0xB7, 0x64, 0x9D, 0x7E, 0x38, 0xB8, 0x70, 0xD2, 0x4A, 0x74, 0x54, 0xA4,
+ 0x64, 0x34, 0x27, 0x3B, 0xB7, 0x98, 0x18, 0x07, 0x1F, 0x4E, 0x00, 0x86, 0x91, 0x6A, 0x71, 0x09,
+ 0x72, 0x6B, 0x42, 0x4F, 0x11, 0x62, 0xDC, 0x0B, 0x15, 0x0C, 0x74, 0x0B, 0x6D, 0xFF, 0xC2, 0x28,
+ 0x98, 0x97, 0x33, 0x65, 0xD6, 0xBB, 0x83, 0x4E, 0x4B, 0xE2, 0xCF, 0x7E, 0x98, 0x4B, 0xAD, 0x55,
+ 0xF2, 0x1A, 0xEF, 0x15, 0x05, 0xA6, 0xB6, 0xF4, 0xDD, 0x97, 0xAA, 0x81, 0x6D, 0x84, 0x86, 0x17,
+ 0xA0, 0xA5, 0x1D, 0xC3, 0x8C, 0xEA, 0x28, 0xCE, 0x69, 0xCC, 0x56, 0x15, 0xFA, 0xD3, 0xEC, 0x12,
+ 0xCD, 0x8A, 0x98, 0xD5, 0x13, 0xE9, 0x72, 0xBF, 0x01, 0xCE, 0xBA, 0xF7, 0xCA, 0x85, 0x8C, 0x64,
+ 0x55, 0x60, 0xBA, 0x61, 0xF0, 0xDE, 0x97, 0xD9, 0x15, 0xCF, 0xE2, 0x9C, 0xA3, 0x9A, 0x5F, 0x9F,
+ 0xFE, 0xD3, 0xC7, 0x5A, 0xF4, 0x44, 0x69, 0x7F, 0x63, 0x41, 0x97, 0x33, 0xD7, 0x41, 0xDF, 0x9B,
+ 0x3F, 0x03, 0x23, 0x4A, 0x84, 0x7B, 0x4E, 0xB9, 0x94, 0x3D, 0xBD, 0x32, 0x56, 0x1C, 0x47, 0x7A,
+ 0xF0, 0xED, 0x9D, 0x99, 0x24, 0x09, 0xC6, 0x50, 0xC0, 0x98, 0xEA, 0xFE, 0x70, 0x8B, 0xDF, 0xB8,
+ 0x5E, 0x7D, 0x64, 0x2C, 0xDC, 0xB5, 0x5F, 0xCA, 0xF6, 0x7B, 0x02, 0x88, 0xA2, 0x82, 0xD2, 0x14,
+ 0x0E, 0xA4, 0x14, 0x3B, 0x4A, 0x95, 0x14, 0x5E, 0xD9, 0xFB, 0x47, 0x5F, 0x36, 0x9F, 0x85, 0xC2,
+ 0x94, 0x15, 0xB9, 0xC0, 0x01, 0x08, 0x86, 0x75, 0x1E, 0x88, 0x2D, 0x5A, 0x39, 0xC1, 0xDE, 0xC1,
+ 0x8B, 0x32, 0xC4, 0xE7, 0x19, 0xA6, 0xFE, 0xFC, 0x62, 0xE9, 0xCF, 0x3E, 0x11, 0xD1, 0x5E, 0x24,
+ 0x66, 0x23, 0x5B, 0x8F, 0x42, 0x83, 0xD6, 0x3E, 0x2A, 0xE5, 0xF2, 0xE3, 0x6A, 0x69, 0x40, 0xBE,
+ 0xD4, 0xFA, 0x83, 0xC6, 0xE8, 0x2B, 0x35, 0xFE, 0x1A, 0xD1, 0xF3, 0x37, 0x9A, 0x88, 0xA0, 0xC9,
+ 0x55, 0x13, 0x4B, 0xC0, 0xEC, 0x45, 0xD7, 0x48, 0x16, 0x28, 0x99, 0xE4, 0x3B, 0x77, 0xF2, 0xB9,
+ 0x27, 0x34, 0x4F, 0xAB, 0x18, 0x87, 0x63, 0xE5, 0xF5, 0x68, 0x57, 0x9D, 0x5C, 0xAD, 0x53, 0xD7,
+ 0x25, 0xB3, 0x99, 0x5D, 0x70, 0xE0, 0xF6, 0x72, 0xBE, 0xD9, 0x5E, 0x82, 0xFB, 0xD0, 0x72, 0xF5,
+ 0x6E, 0x86, 0xEF, 0x7C, 0xD8, 0x23, 0x1E, 0x85, 0x20, 0x7C, 0xEA, 0x2C, 0x8E, 0x09, 0x2A, 0x9B,
+ 0x73, 0x62, 0xD3, 0x96, 0xAA, 0xE0, 0x45, 0x1E, 0x63, 0x57, 0xB7, 0x6A, 0xB7, 0xB8, 0xFE, 0x01,
+ 0x85, 0x93, 0xEB, 0x7B, 0x25, 0x41, 0xE5, 0x7D, 0xE5, 0x20, 0x50, 0x15, 0x92, 0x06, 0xFE, 0xFA,
+ 0x3F, 0x93, 0x16, 0xC5, 0x6F, 0x4A, 0xDF, 0xB3, 0xB9, 0x43, 0x17, 0x32, 0xAF, 0x81, 0x3B, 0x61,
+ 0x19, 0xDE, 0xCD, 0xBB, 0x7E, 0x24, 0x74, 0xDD, 0xEB, 0xAE, 0xEA, 0x64, 0x34, 0x59, 0x30, 0x31,
+ 0x84, 0x15, 0x77, 0x30, 0x0A, 0xB6, 0x5D, 0xD9, 0x3A, 0x47, 0xD2, 0x9D, 0xA9, 0x57, 0x6F, 0x1D,
+ 0x3E, 0x47, 0x82, 0xAD, 0x80, 0x4C, 0x11, 0x64, 0x4A, 0xA5, 0x28, 0xAE, 0xD3, 0x52, 0x13, 0x23,
+ 0xEF, 0x74, 0x9D, 0x05, 0xBD, 0xCA, 0x9D, 0xAF, 0x69, 0x55, 0xE8, 0x96, 0xDB, 0x35, 0x52, 0x75,
+ 0x0D, 0x7A, 0x19, 0x3E, 0xE9, 0x11, 0xF1, 0x84, 0x5E, 0xB5, 0x1F, 0xD8, 0xF4, 0xA3, 0x25, 0x2A,
+ 0x7F, 0xAF, 0x44, 0xD0, 0xAC, 0x7F, 0x9C, 0x87, 0xB1, 0x11, 0x48, 0x69, 0x9F, 0x3C, 0x60, 0xC4,
+ 0x38, 0x40, 0xBF, 0x43, 0xA2, 0xE4, 0x37, 0xC3, 0x7E, 0xB1, 0x51, 0x82, 0x93, 0xFE, 0x7F, 0xD1,
+ 0x30, 0xD8, 0xBF, 0xD8, 0x6D, 0x7A, 0xE8, 0x38, 0xFA, 0xE5, 0x4B, 0x42, 0x2C, 0x24, 0xF3, 0xA1,
+ 0x7D, 0xE3, 0xE7, 0x9A, 0x6B, 0x53, 0x3C, 0xAC, 0x00, 0x6A, 0xB5, 0xF9, 0x10, 0xD5, 0x3D, 0x11,
+ 0xE4, 0x1D, 0x51, 0xA2, 0x40, 0xC4, 0x48, 0xDC, 0x1C, 0x30, 0xA8, 0x1F, 0x89, 0xE2, 0x53, 0x25,
+ 0xF2, 0xDA, 0xE3, 0xA4, 0xD6, 0xBB, 0x72, 0x5A, 0x0F, 0x3F, 0x98, 0xE4, 0x27, 0xF2, 0xC6, 0x82,
+ 0x5B, 0x64, 0x8A, 0x3D, 0x29, 0x9A, 0xBF, 0x6A, 0x0D, 0x61, 0xA1, 0xCF, 0x4F, 0x00, 0xE0, 0xE2,
+ 0x9A, 0x45, 0xF7, 0xDB, 0x38, 0x0D, 0x38, 0x7C, 0x98, 0x20, 0xB6, 0xA8, 0x00, 0xFE, 0xB5, 0xCD,
+ 0xBB, 0xC2, 0x8A, 0xDF, 0xA3, 0x23, 0x87, 0x77, 0x7F, 0x33, 0x36, 0xB2, 0xC3, 0x90, 0xAA, 0x49,
+ 0x92, 0x71, 0xEB, 0xFE, 0xCD, 0x32, 0xD1, 0xAB, 0x22, 0xB3, 0xC6, 0x4B, 0x12, 0x7E, 0x53, 0xAA,
+ 0xCF, 0xC7, 0x01, 0xDA, 0x38, 0x2A, 0x0A, 0x54, 0xFC, 0x88, 0x41, 0x15, 0x04, 0x27, 0x02, 0x8C,
+ 0x0F, 0x6D, 0xC2, 0xCF, 0xDA, 0xF8, 0x3C, 0xF7, 0x58, 0xE2, 0x70, 0x1A, 0x7E, 0xBE, 0x39, 0xEE,
+ 0xC2, 0x7A, 0xD5, 0x52, 0x4B, 0x62, 0x84, 0xDE, 0x91, 0x46, 0xDC, 0x3A, 0x67, 0x4A, 0xE6, 0x4D,
+ 0x82, 0xFA, 0x60, 0xE2, 0x34, 0x26, 0x1A, 0xD8, 0x0D, 0xA1, 0x57, 0x62, 0x04, 0x38, 0x52, 0x4D,
+ 0xA6, 0x8B, 0xC2, 0x0E, 0xCE, 0x26, 0x28, 0x31, 0x53, 0xC6, 0x63, 0x5A, 0x75, 0x45, 0x65, 0xDA,
+ 0x4B, 0x8D, 0x77, 0xB0, 0x06, 0x28, 0x36, 0x43, 0x1D, 0xA3, 0xC7, 0x33, 0x28, 0x8D, 0x70, 0xB5,
+ 0x0D, 0x24, 0x25, 0x50, 0xA2, 0xEB, 0x50, 0x61, 0x98, 0x3D, 0x8C, 0xCD, 0xDC, 0x17, 0x3F, 0xE4,
+ 0xDD, 0x46, 0x3A, 0xD0, 0xA6, 0x78, 0xD7, 0x85, 0x63, 0xC8, 0x3A, 0x54, 0xDB, 0xD5, 0xB9, 0x7C,
+ 0x4B, 0xFD, 0x1E, 0xA2, 0xBD, 0x97, 0x22, 0x09, 0x06, 0x8F, 0xA5, 0x49, 0x06, 0x29, 0x71, 0x13,
+ 0x69, 0xCE, 0xEC, 0x75, 0xE9, 0x93, 0x58, 0x80, 0x05, 0xFF, 0xBF, 0x1D, 0x48, 0xCE, 0x34, 0xDC,
+ 0x03, 0x40, 0xB9, 0x6F, 0x40, 0x94, 0x2C, 0x30, 0xD0, 0x6F, 0x35, 0xC0, 0x46, 0xE5, 0xD1, 0xFF,
+ 0x44, 0x83, 0x2C, 0x6D, 0x6C, 0xB2, 0x04, 0xD8, 0xB0, 0x1E, 0x2C, 0xF8, 0x71, 0xA4, 0xA1, 0x60,
+ 0x23, 0x8F, 0x19, 0xF7, 0x58, 0x29, 0x42, 0x9F, 0x24, 0x18, 0x2B, 0xD3, 0xF0, 0x31, 0x45, 0xB1,
+ 0xA3, 0x5E, 0xA1, 0xC9, 0x52, 0xEE, 0xE6, 0xF5, 0x0A, 0xBB, 0xEB, 0x6B, 0x09, 0xE9, 0xA7, 0x84,
+ 0xB6, 0x1C, 0xE3, 0xA3, 0x0B, 0x7E, 0x8A, 0x0B, 0xD0, 0x4C, 0xE9, 0x50, 0x45, 0x34, 0x21, 0x1B,
+ 0x55, 0x0E, 0x12, 0x1A, 0x74, 0xDE, 0x28, 0xEB, 0x20, 0x66, 0x13, 0xBB, 0xEA, 0xC7, 0xDA, 0xCF,
+ 0xB4, 0x16, 0x57, 0x65, 0x0A, 0xAD, 0x98, 0xF7, 0x03, 0x1E, 0xF5, 0xD9, 0xFC, 0x3E, 0x59, 0xEC,
+ 0x7A, 0x2B, 0x46, 0xC0, 0x13, 0x19, 0xD8, 0xFD, 0xF7, 0x0D, 0x61, 0xFC, 0x41, 0x2A, 0x5C, 0xC7,
+ 0x84, 0x95, 0xEF, 0x31, 0x9F, 0x1F, 0x84, 0x53, 0x7E, 0xA8, 0x37, 0x04, 0x1D, 0x1D, 0x08, 0xD5,
+ 0xE5, 0x4B, 0x0C, 0x06, 0xCC, 0x14, 0x19, 0xA9, 0x4D, 0x75, 0x06, 0x49, 0x48, 0xC9, 0xDB, 0x3F,
+ 0x1B, 0xB1, 0x0D, 0x19, 0x71, 0xEB, 0x13, 0xE1, 0x26, 0xAF, 0xC0, 0xD9, 0x87, 0xC3, 0xD8, 0x68,
+ 0x8A, 0x3C, 0x96, 0x6B, 0xDE, 0x94, 0x3D, 0x60, 0x0B, 0x24, 0x8F, 0x0C, 0xE1, 0xA3, 0xA7, 0x05,
+ 0x40, 0xB7, 0x24, 0x35, 0x82, 0x45, 0xA0, 0xE0, 0x26, 0xD2, 0xFA, 0xAB, 0x59, 0x33, 0x4E, 0x95,
+ 0xD2, 0xFA, 0x72, 0x82, 0x2C, 0x00, 0x2F, 0xE0, 0xE5, 0x49, 0x16, 0x30, 0x0C, 0x3A, 0xC1, 0xDC,
+ 0x11, 0x70, 0x59, 0xF9, 0x98, 0x81, 0xBB, 0x9F, 0x60, 0xEB, 0xB0, 0xAD, 0x5B, 0x65, 0x7A, 0xC4,
+ 0x3E, 0xE7, 0x6A, 0x3D, 0xD2, 0x7D, 0x02, 0xD3, 0xA8, 0x98, 0xE5, 0xF1, 0xF5, 0xE1, 0xCF, 0xFA,
+ 0x71, 0x50, 0xAA, 0x8A, 0xB1, 0x43, 0xDC, 0x3A, 0x0E, 0xC2, 0x77, 0xF3, 0x95, 0x39, 0x82, 0x1D,
+ 0x4D, 0x88, 0xFD, 0xA6, 0x55, 0x02, 0x5C, 0x80, 0x1E, 0x84, 0x91, 0x5C, 0x7D, 0x63, 0x36, 0x42,
+ 0x68, 0xA8, 0x15, 0x72, 0x40, 0xC0, 0xF5, 0x52, 0xC8, 0x9B, 0xB8, 0xAD, 0x00, 0xCB, 0x4B, 0x0A,
+ 0x87, 0x54, 0x96, 0x48, 0x47, 0x7D, 0x39, 0xCA, 0x1D, 0xF0, 0x83, 0x63, 0x9A, 0x7F, 0xE9, 0xB5,
+ 0x5A, 0x11, 0x2F, 0x94, 0x30, 0x9F, 0x1D, 0xD6, 0xD5, 0x98, 0xCB, 0x80, 0x7B, 0x82, 0x2B, 0xC0,
+ 0xA0, 0x73, 0xBD, 0x17, 0x33, 0xE4, 0x3B, 0xE0, 0xE5, 0x20, 0x59, 0xE6, 0x94, 0xF8, 0xD5, 0x41,
+ 0x21, 0x2D, 0xAD, 0xF0, 0x10, 0x08, 0x79, 0x60, 0x2F, 0x7E, 0x26, 0x82, 0xE8, 0xA2, 0x41, 0x79,
+ 0xE7, 0xF6, 0x06, 0xC0, 0xB2, 0x59, 0xF9, 0x5B, 0x1B, 0x20, 0x12, 0xA0, 0xF5, 0xD8, 0x0F, 0x1F,
+ 0xA6, 0x96, 0x0A, 0x69, 0x3B, 0x2B, 0xD1, 0x95, 0x18, 0x7F, 0xA4, 0x1B, 0x4B, 0xE4, 0x82, 0xDA,
+ 0x50, 0x41, 0xA6, 0x30, 0x0D, 0xC0, 0x68, 0xEC, 0xA9, 0x43, 0x2E, 0x17, 0x13, 0x0B, 0x21, 0x00,
+ 0x42, 0xF5, 0xCE, 0x2F, 0x10, 0x81, 0x3D, 0x6F, 0xDB, 0xDE, 0x81, 0xD1, 0x10, 0xDE, 0x4E, 0x02,
+ 0x98, 0x85, 0x29, 0x81, 0x59, 0xC4, 0x24, 0x82, 0x25, 0xF0, 0x3D, 0x93, 0xB3, 0x08, 0xC9, 0xC5,
+ 0x3D, 0xA1, 0x97, 0xAE, 0x2D, 0xE3, 0x93, 0xAC, 0xBB, 0xB2, 0x06, 0xC6, 0x54, 0x58, 0x1C, 0x9A,
+ 0x37, 0x6B, 0xDE, 0xEA, 0x63, 0xDE, 0x3F, 0x07, 0x76, 0xFF, 0x8E, 0x41, 0x4D, 0x2E, 0x04, 0x54,
+ 0x7D, 0xDF, 0x7F, 0x26, 0x6A, 0xD2, 0x5D, 0xBB, 0x19, 0x5F, 0x2B, 0x09, 0xF4, 0x15, 0x7D, 0x5E,
+ 0xB5, 0x48, 0xEE, 0xF1, 0x17, 0xC0, 0x32, 0xE6, 0x14, 0x2C, 0x2D, 0xF3, 0xDD, 0xDA, 0xFD, 0xC5,
+ 0x2D, 0x05, 0xB3, 0x7D, 0x69, 0x42, 0xF4, 0x4F, 0xDC, 0xEE, 0x27, 0x6C, 0x10, 0x59, 0xCB, 0x63,
+ 0xF6, 0xE9, 0xC2, 0x3B, 0x8A, 0xD0, 0xA8, 0x10, 0x70, 0xF1, 0x35, 0x2B, 0x3D, 0x8E, 0xAE, 0xBD,
+ 0xD3, 0xB7, 0xE2, 0x9E, 0x3A, 0xD7, 0xBD, 0xF5, 0x38, 0x32, 0x90, 0x4F, 0xE2, 0x42, 0xB7, 0x73,
+ 0xE0, 0xFE, 0x83, 0xEA, 0x25, 0x87, 0xFB, 0xB7, 0xE7, 0x31, 0x66, 0xEB, 0xAA, 0xCC, 0x40, 0x4F,
+ 0x35, 0x18, 0x21, 0xFF, 0x31, 0x3C, 0x61, 0x8C, 0xEC, 0xB4, 0x20, 0xD0, 0xFE, 0x1C, 0x81, 0x53,
+ 0xB0, 0x6F, 0x76, 0xF7, 0x0F, 0x7F, 0x51, 0x51, 0x40, 0xAE, 0x35, 0x84, 0x84, 0xA9, 0x35, 0x9C,
+ 0xC0, 0x3C, 0x0D, 0x7E, 0x73, 0x5B, 0xA7, 0xE6, 0x28, 0x62, 0x6C, 0x53, 0x68, 0x2D, 0x72, 0xA1,
+ 0x0F, 0x63, 0xCB, 0x79, 0x79, 0xE5, 0xA5, 0x24, 0xCF, 0x6A, 0x60, 0x6C, 0x0E, 0xF3, 0x52, 0x5B,
+ 0xDF, 0xA4, 0x26, 0x7C, 0xC2, 0xF3, 0xD1, 0x20, 0x8A, 0x8C, 0x80, 0x04, 0x77, 0xCE, 0x0C, 0xE0,
+ 0xA3, 0x8C, 0xE5, 0xC2, 0xDE, 0x60, 0xC1, 0x35, 0x18, 0xA8, 0x94, 0xCF, 0xEA, 0x81, 0xD8, 0xE9,
+ 0x22, 0x93, 0xDB, 0x7A, 0xAA, 0x51, 0xAD, 0xE5, 0x44, 0x6B, 0x31, 0xFF, 0x04, 0xE1, 0xB6, 0xE3,
+ 0x55, 0xFA, 0xEF, 0x17, 0xE7, 0x94, 0x37, 0xDF, 0x89, 0xD5, 0x29, 0x07, 0x96, 0xC7, 0x76, 0xE5,
+ 0x21, 0xD7, 0xE2, 0xB3, 0xA4, 0x77, 0x6F, 0xE4, 0x1E, 0xAD, 0x03, 0x64, 0xF5, 0x38, 0x33, 0xC5,
+ 0x74, 0x2E, 0xA1, 0xF1, 0xBB, 0xAF, 0x1B, 0x24, 0x8B, 0xEE, 0x46, 0x86, 0x25, 0xAD, 0x95, 0x5E,
+ 0x28, 0x1F, 0xE9, 0x2C, 0xCD, 0xC9, 0x85, 0xFC, 0x5B, 0x74, 0x3F, 0xF3, 0xF9, 0x2B, 0x5C, 0x23,
+ 0x5C, 0xD0, 0xBA, 0xBA, 0x7E, 0x8C, 0xA0, 0xA9, 0x56, 0xA0, 0x55, 0xA5, 0x36, 0x7D, 0xB8, 0x8B,
+ 0xA6, 0x46, 0x62, 0x1C, 0x1E, 0x7E, 0x7C, 0xE3, 0xC3, 0xEA, 0x33, 0x8E, 0x28, 0x9A, 0xA8, 0xB6,
+ 0x8E, 0xC3, 0xA4, 0x0F, 0x4A, 0x23, 0xFF, 0x6F, 0x3B, 0x2A, 0xBE, 0x65, 0x97, 0x10, 0x30, 0x12,
+ 0xC0, 0xA6, 0x3A, 0x34, 0xE3, 0x6C, 0xA8, 0x11, 0xED, 0x78, 0x60, 0xE2, 0xAE, 0xC8, 0x2E, 0xE3,
+ 0xEA, 0xB9, 0x3E, 0xAB, 0xBD, 0x15, 0x49, 0x9C, 0x75, 0xD7, 0x49, 0xE3, 0x5C, 0xE9, 0xA2, 0x8A,
+ 0x0C, 0xBE, 0x74, 0x81, 0x1D, 0xE0, 0xCA, 0x12, 0x3E, 0x8A, 0x23, 0xF2, 0x7B, 0x5D, 0xF0, 0xF7,
+ 0x0E, 0x1B, 0x73, 0xF6, 0x5E, 0x8C, 0xE0, 0x8E, 0x57, 0xD5, 0x01, 0x56, 0x5E, 0x3B, 0x7C, 0xC8,
+ 0xF7, 0xE4, 0x61, 0x70, 0x5D, 0x4F, 0xC3, 0x01, 0x26, 0x2A, 0x71, 0x26, 0x50, 0x9B, 0x65, 0xA1,
+ 0x49, 0xBE, 0x50, 0x4C, 0x44, 0x3C, 0x5B, 0x09, 0x3B, 0x39, 0x32, 0x34, 0x82, 0x3B, 0xBF, 0x74,
+ 0x6B, 0x37, 0x59, 0xF4, 0x13, 0x21, 0x30, 0x86, 0x6D, 0x94, 0xDE, 0x2F, 0x5F, 0x69, 0x07, 0x32,
+ 0xFF, 0x14, 0x88, 0x46, 0xA4, 0xB1, 0x9E, 0x69, 0x5A, 0xB7, 0x91, 0x41, 0x2A, 0x62, 0x3C, 0x81,
+ 0xE1, 0x4A, 0x47, 0x9D, 0x61, 0xB2, 0x46, 0x2D, 0x04, 0x3F, 0xD9, 0x57, 0xF2, 0xAB, 0xC9, 0x4F,
+ 0xB3, 0xCE, 0x11, 0x2A, 0x77, 0x76, 0x49, 0x1B, 0x7E, 0x1D, 0xB7, 0xB3, 0x1D, 0xB7, 0x84, 0x5A,
+ 0xC5, 0xCC, 0x1F, 0x9C, 0x82, 0x6D, 0xE0, 0x62, 0x03, 0xEE, 0xA9, 0x9A, 0x05, 0x26, 0x0A, 0xEB,
+ 0x0D, 0x55, 0x01, 0x59, 0x71, 0x10, 0xB9, 0x53, 0x20, 0x65, 0x7B, 0x42, 0x90, 0x37, 0x36, 0x5A,
+ 0xC2, 0xBA, 0x91, 0x20, 0xE0, 0x89, 0xA9, 0x65, 0x2D, 0x67, 0x83, 0x5D, 0x5A, 0xB9, 0x6B, 0x27,
+ 0x13, 0x51, 0xA8, 0x00, 0x9E, 0x98, 0xE9, 0x62, 0xD1, 0x55, 0x7D, 0x37, 0x1E, 0xB5, 0xA3, 0x17,
+ 0x9B, 0x45, 0xD8, 0x60, 0x02, 0xAC, 0xFC, 0x2B, 0xA9, 0xAC, 0x66, 0x79, 0xF9, 0x0C, 0xBC, 0xD4,
+ 0x50, 0x15, 0x8B, 0x48, 0xB1, 0x6A, 0xB4, 0xED, 0xB7, 0xFE, 0xE8, 0x9E, 0x3B, 0xE3, 0x1C, 0xA5,
+ 0x21, 0x15, 0x06, 0x66, 0x2F, 0xBB, 0x05, 0x33, 0xE4, 0x5A, 0x17, 0x5D, 0xF7, 0xB9, 0x2F, 0x3A,
+ 0x2B, 0x83, 0xFF, 0xAC, 0xB6, 0x65, 0x92, 0xEF, 0x6E, 0x1C, 0x8A, 0x6C, 0x72, 0x52, 0x32, 0xA6,
+ 0x5A, 0x16, 0x75, 0xEE, 0xA9, 0x95, 0x84, 0x33, 0x34, 0x5E, 0x71, 0x66, 0x40, 0xB9, 0xFF, 0x8B,
+ 0xD5, 0x50, 0x81, 0xAF, 0x27, 0xC8, 0x58, 0xEE, 0x0D, 0xE7, 0x6D, 0xEB, 0x24, 0xA2, 0x3F, 0xDA,
+ 0x1A, 0xD4, 0xBE, 0x3B, 0x02, 0x7B, 0x1C, 0x5A, 0xAF, 0x1D, 0xE3, 0x4B, 0x9F, 0xBC, 0x78, 0x5B,
+ 0x0B, 0x91, 0x73, 0x78, 0x64, 0xD9, 0x77, 0xC7, 0x6E, 0x4B, 0x94, 0x5F, 0xE9, 0x8D, 0x8F, 0x49,
+ 0xDC, 0x48, 0xEE, 0x58, 0x86, 0x04, 0x63, 0xEB, 0x0D, 0x39, 0x31, 0x81, 0xB4, 0xA8, 0x16, 0xB3,
+ 0x7F, 0x60, 0x7F, 0x94, 0xEE, 0x06, 0x53, 0x38, 0x10, 0x0F, 0x93, 0x7F, 0x12, 0x1F, 0x76, 0x28,
+ 0xA7, 0x3E, 0x46, 0x10, 0x8C, 0x28, 0x53, 0xCF, 0x9F, 0x83, 0x7F, 0x0C, 0xD8, 0xD6, 0x52, 0xF3,
+ 0xE8, 0xD2, 0x21, 0xA6, 0x4A, 0xEE, 0x8B, 0xF7, 0x5B, 0x19, 0x90, 0x6D, 0x35, 0x83, 0xAF, 0x3F,
+ 0x49, 0x71, 0xB1, 0x3E, 0xD1, 0x98, 0x60, 0x77, 0x05, 0x36, 0xA5, 0xFF, 0x82, 0x37, 0x14, 0x49,
+ 0x62, 0x98, 0xB3, 0x05, 0xF5, 0xAC, 0xE2, 0xCC, 0x47, 0x09, 0x94, 0x8A, 0x59, 0x00, 0x23, 0xF4,
+ 0x6D, 0x08, 0xE2, 0xAD, 0x7A, 0xF0, 0xCC, 0x97, 0x68, 0xF7, 0x21, 0x5C, 0x43, 0xD4, 0x1F, 0x16,
+ 0x1A, 0xC6, 0x65, 0xFE, 0x96, 0xB4, 0x7C, 0x2C, 0x79, 0x9E, 0xEC, 0xD4, 0x96, 0xAF, 0x0E, 0x35,
+ 0x24, 0x06, 0x03, 0x8E, 0x9A, 0x4E, 0xA5, 0xA7, 0xCD, 0x35, 0x32, 0xD2, 0x30, 0x15, 0xAC, 0xED,
+ 0xDF, 0xF1, 0x83, 0x39, 0x17, 0xBB, 0x9B, 0x90, 0xED, 0xFB, 0x64, 0xE9, 0x55, 0x09, 0x49, 0x86,
+ 0x7A, 0x9A, 0x43, 0x13, 0xB1, 0xD2, 0xC7, 0xC7, 0xC6, 0xA1, 0x99, 0xC8, 0x51, 0x4A, 0x5F, 0x9D,
+ 0x6F, 0xA6, 0xCD, 0x97, 0x30, 0xE9, 0x55, 0x0B, 0x6F, 0x0F, 0x4A, 0x43, 0x6E, 0x71, 0xE6, 0xCF,
+ 0x3A, 0x7C, 0xC9, 0x78, 0x70, 0xFE, 0xBD, 0x0A, 0x00, 0xEC, 0xA6, 0x7F, 0x83, 0xFA, 0xBE, 0xD4,
+ 0xDF, 0xB0, 0x86, 0x41, 0x12, 0x53, 0x1B, 0x4F, 0x7C, 0x1E, 0x60, 0x2A, 0xC1, 0x20, 0x7A, 0x00,
+ 0xED, 0x6C, 0x66, 0x23, 0x1F, 0x79, 0xC3, 0x3E, 0x01, 0x74, 0xA7, 0x60, 0x7D, 0x1F, 0x29, 0x93,
+ 0x03, 0xF0, 0x64, 0xF6, 0x6F, 0x56, 0x8E, 0x75, 0x57, 0x25, 0x70, 0xDC, 0xD2, 0xD2, 0x28, 0x37,
+ 0xA8, 0x05, 0x9B, 0xB0, 0xAD, 0x1A, 0x2D, 0x86, 0xA9, 0x50, 0xB8, 0xE3, 0xF6, 0xA2, 0x3E, 0x17,
+ 0x5B, 0x78, 0x65, 0xC0, 0x61, 0x95, 0x0E, 0x27, 0x39, 0x72, 0x6A, 0x9E, 0xCB, 0x8E, 0xAD, 0xEC,
+ 0x0C, 0xFC, 0xDB, 0x9A, 0x9A, 0x12, 0x31, 0x16, 0x68, 0x4F, 0x83, 0x79, 0x11, 0x3D, 0x75, 0xED,
+ 0x2D, 0xEA, 0x92, 0x8E, 0xDE, 0xAC, 0x07, 0x55, 0xF1, 0xE4, 0x30, 0x6C, 0xFC, 0x5C, 0x88, 0x1F,
+ 0x77, 0x94, 0xC8, 0x87, 0x73, 0xB2, 0xB6, 0x9F, 0x2A, 0x05, 0x71, 0xDE, 0x8E, 0xF2, 0xEB, 0x3A,
+ 0xDB, 0xBE, 0x46, 0xFA, 0x11, 0xA1, 0xCA, 0x1A, 0xB3, 0x65, 0xAC, 0x42, 0x85, 0xD5, 0x0B, 0x23,
+ 0x57, 0xA5, 0x53, 0xE9, 0x58, 0x30, 0xE0, 0xF9, 0x23, 0xF0, 0x75, 0x2A, 0xF5, 0x2B, 0x9A, 0x25,
+ 0x96, 0xD7, 0x1E, 0x71, 0x31, 0xC7, 0xA7, 0xB0, 0x6B, 0x3F, 0x26, 0xF8, 0x8D, 0xF9, 0x1E, 0x15,
+ 0x83, 0xB8, 0xFF, 0xC6, 0xAA, 0xA6, 0x42, 0xAC, 0x90, 0x82, 0xA2, 0x50, 0x7F, 0x1F, 0xC3, 0x99,
+ 0xDC, 0x27, 0xD7, 0xAA, 0x65, 0x13, 0x08, 0xA2, 0x66, 0x51, 0x7D, 0xC7, 0x7E, 0xAE, 0x1A, 0x33,
+ 0x2B, 0x72, 0xF3, 0xF4, 0x25, 0xD9, 0xEE, 0xF1, 0x07, 0x0F, 0xC3, 0x87, 0xDF, 0x2B, 0x0C, 0xC8,
+ 0x4D, 0x2E, 0xEB, 0xA3, 0x93, 0xB2, 0xBB, 0xAA, 0x61, 0xE1, 0x71, 0x0D, 0x53, 0xE2, 0xF5, 0x7E,
+ 0xF7, 0x08, 0x06, 0xAD, 0x3E, 0xE7, 0xA6, 0xB9, 0x3B, 0xC9, 0x68, 0x5D, 0xB8, 0x7D, 0xC1, 0x31,
+ 0x9B, 0x70, 0xC2, 0x2B, 0x57, 0x26, 0x54, 0x67, 0x3D, 0x14, 0x26, 0xCF, 0xB0, 0xEC, 0xD6, 0x00,
+ 0xE3, 0x3F, 0x26, 0xCA, 0xEF, 0xB8, 0x1A, 0xFD, 0xE4, 0x06, 0xE9, 0x41, 0xF2, 0xAD, 0x2E, 0x16,
+ 0x11, 0x0A, 0x98, 0x4B, 0x01, 0x67, 0x76, 0x99, 0xAE, 0x58, 0xF4, 0xAD, 0xC2, 0xC8, 0x56, 0x26,
+ 0x50, 0xB2, 0x77, 0x4B, 0x32, 0x71, 0x16, 0x13, 0xC7, 0xAE, 0xE3, 0xDE, 0x1C, 0x6D, 0x54, 0x4C,
+ 0x89, 0xA4, 0x81, 0x18, 0x53, 0xC3, 0x01, 0xCD, 0xCF, 0x85, 0xFB, 0x3A, 0x97, 0xD5, 0x25, 0x56,
+ 0x39, 0x89, 0xEF, 0x52, 0xBB, 0x02, 0xC8, 0x23, 0xDD, 0x04, 0x36, 0x85, 0xA2, 0x33, 0xE4, 0x4F,
+ 0x41, 0xC8, 0xE9, 0x8B, 0xCE, 0xD5, 0xB0, 0xDB, 0xF3, 0xB4, 0xC3, 0x7C, 0x70, 0x29, 0x0F, 0xB6,
+ 0x3C, 0xB1, 0xD3, 0x0C, 0xD5, 0x06, 0x56, 0x2E, 0x57, 0xD1, 0x90, 0xAB, 0x5D, 0xE8, 0xE6, 0xD6,
+ 0x94, 0x58, 0xE2, 0xA8, 0x92, 0x42, 0xF8, 0xD4, 0xD7, 0x2F, 0x1F, 0x16, 0x92, 0x0C, 0xD5, 0x8E,
+ 0x69, 0x98, 0xA9, 0x48, 0xA1, 0x6E, 0x94, 0x8C, 0x66, 0x30, 0xA3, 0x52, 0x50, 0x7A, 0x29, 0x96,
+ 0xB0, 0x2B, 0x16, 0x3E, 0x2C, 0x56, 0xA4, 0x9F, 0x85, 0x96, 0x56, 0x25, 0x98, 0x56, 0xAA, 0xFB,
+ 0xEE, 0x4A, 0x31, 0xD9, 0xD7, 0xB3, 0x37, 0xE4, 0x1D, 0x49, 0x3D, 0xA7, 0xF7, 0x93, 0x31, 0x6D,
+ 0x99, 0x24, 0xE5, 0x30, 0x8F, 0xB4, 0x89, 0x56, 0x1F, 0xB7, 0x09, 0x4F, 0x71, 0xDB, 0x4D, 0x02,
+ 0x40, 0x7B, 0xEA, 0x75, 0x38, 0x2C, 0xCD, 0xE2, 0x9F, 0x60, 0xC8, 0x4A, 0x84, 0x2F, 0x9D, 0xFF,
+ 0x75, 0xED, 0x32, 0xBA, 0xB7, 0xF4, 0xC8, 0x0E, 0xCF, 0xC5, 0x31, 0x8A, 0xA0, 0xF7, 0xC9, 0x07,
+ 0x54, 0x44, 0x90, 0xC1, 0x1C, 0x46, 0x49, 0xEE, 0x33, 0x0E, 0xB4, 0x87, 0x4B, 0x9E, 0x3C, 0xF0,
+ 0xAD, 0x0B, 0xA5, 0xA4, 0x28, 0x43, 0xE6, 0x34, 0xD3, 0xD0, 0xF4, 0x88, 0x1E, 0xDE, 0x6E, 0x50,
+ 0x81, 0x0E, 0x24, 0xE5, 0x87, 0xA4, 0xAB, 0x67, 0xD1, 0x91, 0xD2, 0xB8, 0x57, 0xA6, 0x86, 0x4A,
+ 0x47, 0x45, 0x39, 0x6B, 0x1E, 0x2B, 0xCF, 0xCD, 0xE2, 0x1B, 0xBF, 0x75, 0xC2, 0xD4, 0x5A, 0x68,
+ 0x8F, 0xC6, 0xDC, 0x64, 0xBB, 0xBE, 0x71, 0x38, 0x9D, 0x4B, 0xBE, 0x4E, 0xF6, 0x2D, 0xAC, 0x5D,
+ 0x23, 0x6B, 0xC3, 0x96, 0x51, 0x4D, 0x10, 0x70, 0x83, 0xCA, 0x69, 0x91, 0x52, 0x3E, 0x46, 0x03,
+ 0x93, 0xC3, 0xE0, 0x10, 0xDF, 0x24, 0x7F, 0x9B, 0x86, 0xD6, 0x5B, 0x95, 0xD4, 0xCF, 0xED, 0x14,
+ 0xCD, 0x53, 0x82, 0x97, 0x6C, 0x81, 0x9C, 0x3F, 0x6B, 0xFA, 0x9B, 0x44, 0x1B, 0x29, 0xCA, 0x66,
+ 0xD9, 0x22, 0xB1, 0xDE, 0xFE, 0x3A, 0xE2, 0x0C, 0xD5, 0x62, 0xDB, 0x00, 0x12, 0x59, 0x74, 0xE6,
+ 0x8C, 0x22, 0x7B, 0x11, 0x7F, 0x59, 0xB3, 0x0A, 0x2C, 0x76, 0x5F, 0x71, 0x31, 0xA2, 0xD8, 0x42,
+ 0x28, 0xF3, 0x24, 0xC5, 0xF6, 0x85, 0x60, 0x32, 0xC1, 0x91, 0xD7, 0x95, 0x61, 0x70, 0x51, 0x9A,
+ 0x4E, 0x62, 0x8A, 0xCF, 0xBD, 0x98, 0x00, 0xA0, 0x12, 0xB5, 0xB6, 0x90, 0xC7, 0x6E, 0xC3, 0x4A,
+ 0x8E, 0x2F, 0x50, 0xAD, 0xC0, 0x26, 0x12, 0xF4, 0x68, 0x1D, 0x51, 0x72, 0x14, 0x06, 0xB7, 0x7A,
+ 0xCA, 0x37, 0x8F, 0x39, 0x01, 0x76, 0xE5, 0xE4, 0xF1, 0xCA, 0xDA, 0x6A, 0x6B, 0x7C, 0x7D, 0xD9,
+ 0xA9, 0x39, 0xBB, 0x50, 0x79, 0x02, 0xD6, 0xA1, 0x12, 0xE7, 0xE6, 0x9A, 0x1B, 0xF4, 0x89, 0x48,
+ 0x29, 0x88, 0xA7, 0xC8, 0xE9, 0xEF, 0xB1, 0x28, 0x18, 0x22, 0x4B, 0x6A, 0x96, 0xAF, 0x06, 0x3B,
+ 0xE0, 0x8E, 0x9B, 0x2C, 0xC1, 0x7B, 0xD9, 0x87, 0x72, 0xA5, 0xC8, 0xFE, 0x30, 0x9C, 0x24, 0x79,
+ 0xAD, 0x04, 0xBB, 0x38, 0xA9, 0xB8, 0x29, 0x01, 0x41, 0xC3, 0x40, 0xD9, 0xE6, 0xE4, 0xD3, 0x97,
+ 0xE2, 0x42, 0xBF, 0x79, 0x59, 0x7B, 0xAF, 0x31, 0x0C, 0xF3, 0xD1, 0x72, 0xA4, 0x9D, 0x36, 0xD9,
+ 0xDB, 0x0C, 0x0F, 0xCC, 0x3A, 0x8C, 0xAF, 0x71, 0xB7, 0x46, 0x2F, 0x26, 0x7D, 0x1E, 0x25, 0xC9,
+ 0x8E, 0xA3, 0x9B, 0xCF, 0x7F, 0xC4, 0x96, 0xB6, 0xC7, 0x05, 0x62, 0x08, 0x49, 0x3C, 0xFC, 0x24,
+ 0xAA, 0x16, 0xEB, 0x3C, 0xE6, 0x04, 0x57, 0xD1, 0xA3, 0x81, 0x6E, 0xD4, 0x64, 0xF5, 0xC6, 0x24,
+ 0x06, 0x9E, 0xA4, 0x76, 0x3E, 0x62, 0x31, 0x54, 0xC8, 0xC7, 0xAA, 0x31, 0xC6, 0xF0, 0x71, 0x1B,
+ 0xE7, 0x08, 0xFF, 0x3A, 0x7A, 0xD3, 0x51, 0x5A, 0xE8, 0xA6, 0xD4, 0xAA, 0x6E, 0x20, 0x37, 0x28,
+ 0x0D, 0x0A, 0xCC, 0x25, 0x6C, 0x1E, 0x76, 0x8C, 0xC5, 0xCA, 0xDA, 0x6C, 0x24, 0x17, 0xD4, 0xB0,
+ 0x45, 0x3E, 0xD7, 0x25, 0xB8, 0x03, 0xED, 0xA2, 0xDA, 0x82, 0x08, 0x8F, 0x10, 0x3F, 0x13, 0x43,
+ 0x07, 0x3F, 0x8C, 0xF9, 0xE5, 0xD5, 0xB0, 0x35, 0x01, 0x13, 0x61, 0x38, 0x97, 0xCA, 0xB4, 0xFE,
+ 0x1B, 0x1F, 0x44, 0xEC, 0xFB, 0xAB, 0x07, 0xB6, 0x3F, 0x21, 0x80, 0x6A, 0x8D, 0xBA, 0x8A, 0x1D,
+ 0xEA, 0xEF, 0xA0, 0xEB, 0xBC, 0x26, 0x37, 0x4F, 0xA6, 0x16, 0xF8, 0xA2, 0x90, 0x3E, 0xF7, 0x06,
+ 0xD8, 0x4C, 0x21, 0x94, 0x2C, 0x5F, 0x49, 0x05, 0x12, 0xF8, 0xA8, 0xA5, 0x14, 0x40, 0xBE, 0x40,
+ 0x01, 0xF5, 0x23, 0xE1, 0xEE, 0xF6, 0x5B, 0xC0, 0xE6, 0x76, 0xEF, 0x1D, 0x05, 0xA8, 0x77, 0xF2,
+ 0x5D, 0x91, 0xBA, 0x62, 0xB8, 0xDD, 0xF0, 0xFC, 0x5B, 0xA9, 0xB2, 0x25, 0xDD, 0x0E, 0x08, 0xFA,
+ 0xE8, 0x5C, 0xCA, 0x43, 0x0D, 0xD0, 0x65, 0x08, 0x23, 0xA7, 0x2A, 0x2C, 0xE6, 0x6F, 0xB6, 0x0A,
+ 0xE7, 0xED, 0x86, 0x80, 0x50, 0x94, 0x58, 0x0D, 0x11, 0x57, 0xED, 0xB9, 0xD5, 0x7C, 0x33, 0xCD,
+ 0x44, 0x9A, 0x17, 0xFB, 0x74, 0xF3, 0xB1, 0x2D, 0x9F, 0x38, 0x5E, 0x6A, 0x9A, 0xAE, 0x5F, 0x7B,
+ 0xAD, 0x4F, 0x9C, 0x8E, 0x1E, 0x3A, 0x75, 0x4F, 0x30, 0xCF, 0xF7, 0x1C, 0x82, 0x34, 0xC6, 0x3E,
+ 0xE7, 0x5B, 0x8B, 0x2C, 0xD8, 0xFE, 0xDB, 0x33, 0x27, 0xBB, 0x2E, 0x24, 0xB0, 0xDA, 0x74, 0xD3,
+ 0x94, 0x85, 0x78, 0x36, 0x40, 0x2D, 0xEE, 0x40, 0x4A, 0xED, 0x00, 0x4C, 0xDB, 0xF9, 0x49, 0x2F,
+ 0xEC, 0x03, 0x99, 0x63, 0xDD, 0x9E, 0xB7, 0xA3, 0x3B, 0xE1, 0xF2, 0x0E, 0x5D, 0x58, 0xD8, 0x33,
+ 0xE9, 0xE4, 0x0A, 0xD2, 0x83, 0xA0, 0x3F, 0x80, 0x9A, 0x01, 0xC5, 0x8D, 0xF3, 0x14, 0xC8, 0x0F,
+ 0xE4, 0xB8, 0xAD, 0xCD, 0x3E, 0x50, 0x43, 0x17, 0xC1, 0x58, 0x8D, 0x64, 0x03, 0xB1, 0xE5, 0x42,
+ 0xC8, 0x34, 0x6A, 0xFB, 0x74, 0x18, 0xA0, 0xD9, 0x3D, 0x01, 0xD7, 0x2F, 0x51, 0x0F, 0xD8, 0x29,
+ 0x74, 0xB1, 0xF8, 0x99, 0xCA, 0x74, 0xB2, 0xF1, 0xB6, 0x7B, 0x53, 0x10, 0xCE, 0x73, 0xF6, 0x32,
+ 0x3F, 0x05, 0x6E, 0xC7, 0xAD, 0x27, 0x34, 0xD4, 0xB9, 0x1D, 0x34, 0x5D, 0xEC, 0x88, 0x46, 0x22,
+ 0x90, 0x94, 0xAF, 0x1A, 0x51, 0x33, 0x10, 0xB7, 0xBF, 0xBE, 0x0A, 0xCD, 0x1E, 0xE8, 0x95, 0x78,
+ 0x61, 0x17, 0x63, 0x8F, 0x3A, 0xE2, 0x30, 0x59, 0x3F, 0xBF, 0xD8, 0xA3, 0x85, 0xEF, 0x3D, 0x1D,
+ 0xD2, 0x4F, 0x7B, 0xB3, 0xD7, 0x14, 0x91, 0x65, 0xC2, 0x3A, 0x66, 0xBC, 0xFF, 0xFD, 0xC2, 0x12,
+ 0x4A, 0xAF, 0xC4, 0xCC, 0x78, 0x1F, 0xA1, 0xAB, 0x54, 0xB7, 0xDB, 0x3B, 0x07, 0x45, 0x09, 0x93,
+ 0x45, 0x40, 0x2F, 0xA0, 0x68, 0x73, 0x54, 0x27, 0x96, 0xB4, 0x2E, 0x88, 0xC2, 0xF7, 0x98, 0x9E,
+ 0xCA, 0xBF, 0xF4, 0xEC, 0x0A, 0xB6, 0x8F, 0x33, 0x08, 0x5C, 0x91, 0x1B, 0x9F, 0x55, 0xDF, 0xF9,
+ 0x04, 0x5D, 0xF0, 0x3A, 0xE1, 0xFF, 0x93, 0x3A, 0xA7, 0xBB, 0x24, 0x75, 0xA3, 0x0D, 0x95, 0x7D,
+ 0x66, 0x11, 0x4D, 0x0C, 0xCD, 0x8A, 0x98, 0xA3, 0xC4, 0x38, 0x88, 0x00, 0xD3, 0x7F, 0xA8, 0x7D,
+ 0xE6, 0x14, 0xF0, 0xA5, 0xF2, 0x5E, 0xA0, 0xE2, 0xD4, 0x3E, 0xFA, 0x00, 0xD4, 0x5D, 0x01, 0x5D,
+ 0x55, 0xF9, 0xA4, 0xC8, 0x49, 0x59, 0x16, 0xFA, 0xC5, 0x51, 0x15, 0xDC, 0xC3, 0x1E, 0xD5, 0xED,
+ 0xE4, 0xBB, 0x14, 0xA0, 0xF3, 0x68, 0xD5, 0x60, 0xE0, 0x42, 0xB4, 0x30, 0x82, 0xD8, 0xD6, 0x3E,
+ 0xEC, 0xE7, 0xAD, 0x3C, 0x69, 0x61, 0x28, 0x8E, 0x8C, 0x04, 0xF1, 0xA0, 0x1E, 0xBD, 0xDF, 0xBE,
+ 0xFD, 0xAE, 0xD9, 0x65, 0x66, 0x33, 0x0F, 0xB0, 0x8D, 0xE9, 0x46, 0xFD, 0xD5, 0xF9, 0x20, 0x18,
+ 0x7F, 0xF7, 0x20, 0x3F, 0xE2, 0x7A, 0x38, 0x14, 0xBB, 0x1A, 0xC3, 0xCA, 0xAB, 0x56, 0x5B, 0x17,
+ 0x1B, 0x1A, 0xC3, 0x00, 0x97, 0x69, 0x9B, 0x5D, 0xBD, 0x4D, 0x22, 0x77, 0x36, 0x65, 0xD7, 0x04,
+ 0x8F, 0x5B, 0x76, 0xB2, 0x6B, 0x23, 0x52, 0xA2, 0x02, 0xC4, 0x98, 0x16, 0xE3, 0xF7, 0x2B, 0xFC,
+ 0x36, 0x94, 0x91, 0x0B, 0x0B, 0x82, 0x7F, 0xC6, 0x70, 0x8C, 0x80, 0x36, 0x48, 0x4F, 0x8C, 0x15,
+ 0xB9, 0x06, 0x4C, 0x0B, 0x79, 0xA0, 0x37, 0x7D, 0x18, 0xBB, 0x83, 0x8C, 0xA6, 0xF0, 0x02, 0x7D,
+ 0xAE, 0xD1, 0x8D, 0xF7, 0x11, 0x14, 0x69, 0x2D, 0xEE, 0x85, 0x47, 0x52, 0x44, 0x95, 0xD8, 0x8B,
+ 0x91, 0x04, 0x1A, 0x0D, 0x0A, 0xE9, 0x61, 0x35, 0x14, 0xB7, 0x3D, 0x77, 0xD3, 0x7B, 0x97, 0xE2,
+ 0x54, 0x37, 0xCD, 0x77, 0x49, 0x52, 0x2B, 0xF5, 0x0A, 0xA2, 0xCD, 0x9A, 0x51, 0x17, 0x7F, 0xD2,
+ 0x9D, 0x65, 0x0F, 0x0F, 0x54, 0xEC, 0x00, 0x71, 0x89, 0x5B, 0xAC, 0x7C, 0x59, 0x55, 0xA3, 0xEA,
+ 0x27, 0xF1, 0x47, 0x79, 0xF5, 0xDD, 0x0F, 0xD9, 0x14, 0xDB, 0x00, 0xE1, 0xA2, 0x4D, 0x92, 0xDA,
+ 0x0B, 0xEF, 0x41, 0x29, 0x1E, 0xFB, 0x37, 0xAC, 0x08, 0x5D, 0xB7, 0x75, 0x7B, 0x63, 0xC9, 0x47,
+ 0x0B, 0x13, 0x66, 0x39, 0xA1, 0x58, 0x82, 0xA3, 0x8D, 0x8B, 0xAF, 0xF9, 0x21, 0x84, 0xE1, 0xBD,
+ 0x49, 0xD4, 0xF4, 0x43, 0x7F, 0x9A, 0xCF, 0x59, 0xF2, 0xA5, 0x2C, 0x4D, 0x85, 0xB5, 0xFD, 0x95,
+ 0xE8, 0x45, 0xD2, 0xE8, 0x8A, 0xE4, 0xA9, 0x41, 0x6B, 0x99, 0xBE, 0x0D, 0xF1, 0xB2, 0x57, 0x61,
+ 0x7B, 0x6D, 0x09, 0x53, 0x26, 0xCC, 0x28, 0x2C, 0x82, 0x08, 0xFB, 0xDC, 0xA9, 0x8A, 0xEC, 0x76,
+ 0xE3, 0x4D, 0xDE, 0xAC, 0x3E, 0x54, 0xAC, 0xC7, 0x50, 0x92, 0x8A, 0x19, 0x3A, 0xF3, 0xFA, 0xF0,
+ 0xC1, 0x7E, 0xEE, 0x69, 0x0E, 0xB5, 0x35, 0x9D, 0x93, 0x4B, 0xAE, 0xA9, 0x97, 0x09, 0x34, 0x9B,
+ 0x8E, 0x3C, 0xB4, 0x2A, 0x1D, 0x59, 0xF9, 0x1C, 0x82, 0x25, 0x14, 0xCB, 0xC4, 0x89, 0xA5, 0xD5,
+ 0x62, 0xD9, 0xC4, 0xD5, 0xFF, 0xF5, 0xFF, 0x9A, 0xA8, 0x05, 0x95, 0xE1, 0xAC, 0xAF, 0x61, 0x1B,
+ 0x57, 0x77, 0xB0, 0x2C, 0x68, 0xE6, 0x3F, 0x1B, 0x63, 0xFF, 0xC3, 0x33, 0x04, 0x8A, 0x0B, 0x54,
+ 0x7D, 0x36, 0xAE, 0xAE, 0x3F, 0xD3, 0xA6, 0x83, 0x65, 0xA4, 0xFE, 0x3C, 0x29, 0xDB, 0x81, 0x99,
+ 0xF9, 0x7A, 0x9B, 0xBB, 0xA7, 0x86, 0x6B, 0xDF, 0x67, 0x08, 0x23, 0x88, 0x62, 0xE3, 0x08, 0x5C,
+ 0x23, 0x73, 0x0C, 0x01, 0x96, 0xB0, 0x99, 0xC0, 0x8D, 0xD5, 0xDB, 0xCE, 0x4C, 0x1F, 0xE4, 0xFD,
+ 0x19, 0x2E, 0xD7, 0x20, 0x81, 0x4E, 0x22, 0x4E, 0xAD, 0x02, 0x86, 0x1C, 0xEF, 0x2C, 0xEC, 0xCF,
+ 0xD0, 0x7E, 0xFB, 0x02, 0xE1, 0xE1, 0xFD, 0xE5, 0xB9, 0xBC, 0xE5, 0x12, 0xA3, 0xCA, 0xE8, 0x88,
+ 0x45, 0x03, 0x15, 0x0E, 0xA0, 0xC2, 0x1A, 0xB7, 0x13, 0xB3, 0x52, 0x3C, 0x87, 0x18, 0x95, 0x3F,
+ 0x56, 0x9C, 0x31, 0x52, 0x2A, 0x5D, 0x57, 0xD3, 0xA1, 0x41, 0x2B, 0x82, 0x11, 0x23, 0xC2, 0x4D,
+ 0xE8, 0xE5, 0xC3, 0xBA, 0x59, 0x6B, 0x32, 0xBE, 0x22, 0x37, 0xB8, 0xC9, 0x11, 0x88, 0x5C, 0x7E,
+ 0x94, 0x5F, 0xDA, 0xB5, 0xC5, 0xAB, 0xA8, 0xD7, 0x98, 0x2E, 0x4A, 0xBC, 0x5B, 0xD0, 0x7D, 0x3E,
+ 0xA3, 0x43, 0xE8, 0xAB, 0x9F, 0xA7, 0x44, 0x02, 0x07, 0xE9, 0x78, 0x50, 0xB4, 0x0A, 0xE9, 0x5D,
+ 0xDB, 0x23, 0x1E, 0x1D, 0x0A, 0xCB, 0x95, 0xE2, 0xDB, 0xCC, 0x42, 0x40, 0x52, 0x6C, 0x5C, 0xF6,
+ 0xBD, 0x80, 0x51, 0x4C, 0x56, 0x54, 0xB6, 0xC9, 0xB2, 0x9F, 0x70, 0x66, 0xE6, 0x48, 0xD5, 0xC3,
+ 0x7D, 0x94, 0x73, 0xAA, 0x50, 0x10, 0x3D, 0x53, 0x04, 0x85, 0xC1, 0x4E, 0x77, 0x3A, 0x90, 0x3B,
+ 0xBA, 0x9F, 0x37, 0x80, 0xDA, 0xF2, 0x0B, 0xB1, 0xBC, 0x30, 0x94, 0xC6, 0xB7, 0x39, 0x8D, 0xDD,
+ 0x32, 0xA2, 0x71, 0x83, 0x74, 0xE8, 0x1F, 0xB6, 0x92, 0xD5, 0xBE, 0xE6, 0x4B, 0x9F, 0xC5, 0x40,
+ 0x5A, 0x23, 0xDB, 0x3C, 0xB0, 0xAF, 0x14, 0x47, 0x9F, 0x66, 0x53, 0x0D, 0x3E, 0x43, 0x5D, 0xF3,
+ 0xE6, 0x18, 0x03, 0x47, 0xE3, 0x1A, 0xF5, 0x96, 0x53, 0xCA, 0xFE, 0x1B, 0x07, 0x88, 0xBD, 0x6D,
+ 0xE4, 0xF1, 0x86, 0x43, 0xEE, 0x09, 0x6E, 0x3A, 0x81, 0xB7, 0x6B, 0x56, 0x6B, 0x04, 0x25, 0x57,
+ 0x79, 0x5E, 0xD3, 0xAB, 0xA1, 0xBB, 0x60, 0xB8, 0x4A, 0xDB, 0x09, 0xFA, 0x3F, 0x1A, 0x3F, 0x05,
+ 0x1A, 0xDA, 0xFA, 0x5E, 0xB8, 0x55, 0xDB, 0xDC, 0xD7, 0x0A, 0x10, 0x89, 0xAF, 0x70, 0xA3, 0x70,
+ 0xC6, 0xDA, 0xB6, 0x8C, 0x04, 0x27, 0xD8, 0xEF, 0x44, 0x55, 0x8F, 0x07, 0xAF, 0xD5, 0x22, 0xDA,
+ 0x3D, 0x67, 0x9C, 0xC8, 0xE8, 0x2D, 0xE1, 0xF7, 0x2D, 0xFE, 0xFE, 0xA9, 0x27, 0x43, 0xAA, 0xB8,
+ 0x81, 0x78, 0xBC, 0x7F, 0x77, 0xBC, 0xC8, 0x83, 0x0D, 0xF8, 0x8D, 0x81, 0xD8, 0xD4, 0x1E, 0xB9,
+ 0x5C, 0x91, 0x19, 0x41, 0x13, 0xA5, 0x44, 0xC8, 0x60, 0x1F, 0x08, 0xDF, 0x5E, 0xFA, 0xB1, 0xEA,
+ 0x46, 0x01, 0x1E, 0xE2, 0x6D, 0x63, 0xF8, 0x7E, 0xD6, 0xBB, 0x17, 0xC9, 0x80, 0x76, 0x40, 0x87,
+ 0xCF, 0x1A, 0x69, 0x53, 0x40, 0xA4, 0x44, 0xA1, 0x56, 0xD1, 0x28, 0x5F, 0x60, 0x12, 0x7A, 0xBD,
+ 0x02, 0xE3, 0xE1, 0xFF, 0xA4, 0xCB, 0xA0, 0x1E, 0xDC, 0x5C, 0x6C, 0xDB, 0xF7, 0x05, 0x55, 0xC0,
+ 0xE5, 0xAB, 0x57, 0xF8, 0xB4, 0xFF, 0x20, 0xD9, 0x3D, 0xEB, 0x02, 0x1C, 0x67, 0x31, 0xC7, 0xB4,
+ 0x2D, 0x5C, 0x4A, 0x9F, 0xF1, 0x18, 0x97, 0x27, 0x5B, 0x1A, 0x72, 0xDD, 0x6A, 0x8E, 0x29, 0xBB,
+ 0x26, 0xE8, 0x3E, 0xCB, 0xF6, 0x48, 0x19, 0xC1, 0xD2, 0x18, 0x28, 0x92, 0xCA, 0x30, 0xE6, 0x59,
+ 0xBB, 0x34, 0xE4, 0x4C, 0x3B, 0xD8, 0x7D, 0x06, 0xA0, 0xD8, 0x85, 0xD6, 0x06, 0x1F, 0xE9, 0x04,
+ 0x27, 0x78, 0x8F, 0xCA, 0xFC, 0x56, 0x68, 0xE4, 0xA5, 0x25, 0xE0, 0x4C, 0xA0, 0xBC, 0x36, 0xED,
+ 0xBF, 0xAD, 0xC3, 0xA0, 0x2E, 0x83, 0xB3, 0x79, 0x80, 0x4F, 0xC2, 0x80, 0x93, 0xC7, 0xC4, 0x8C,
+ 0xFE, 0x64, 0xEC, 0xFE, 0x24, 0xF1, 0x5C, 0xC5, 0x51, 0x51, 0x13, 0xC0, 0x5E, 0x61, 0x61, 0x5D,
+ 0x5C, 0xAB, 0x50, 0x72, 0x79, 0x91, 0xA3, 0xB6, 0x17, 0x8D, 0x2F, 0xB5, 0xA7, 0x3B, 0x19, 0x8A,
+ 0x5E, 0x14, 0x13, 0xE4, 0xDC, 0x8E, 0x92, 0xE1, 0x51, 0xFF, 0x98, 0xC5, 0xAC, 0xA2, 0x5F, 0xC0,
+ 0xA5, 0x46, 0x77, 0x64, 0x9F, 0xD8, 0x82, 0x0D, 0x54, 0x3A, 0xD7, 0x77, 0xC9, 0xBE, 0x0E, 0xF6,
+ 0x05, 0xF0, 0x17, 0xF1, 0x1E, 0xBF, 0x00, 0x57, 0xAE, 0xAA, 0xE8, 0xB3, 0xEE, 0xF8, 0x2B, 0x4A,
+ 0x02, 0x79, 0xC0, 0x3C, 0xF8, 0x7A, 0x56, 0xA8, 0x69, 0xFF, 0x64, 0x7C, 0x02, 0x76, 0x26, 0x93,
+ 0x95, 0x02, 0xD9, 0x1E, 0xA6, 0x6A, 0x69, 0x3C, 0x00, 0x78, 0x8D, 0x71, 0x7C, 0x83, 0xD0, 0x38,
+ 0xD7, 0x65, 0x94, 0xBD, 0xD3, 0x7B, 0xF0, 0xC3, 0x26, 0x96, 0x27, 0x23, 0xCA, 0xC0, 0x33, 0x74,
+ 0xE1, 0x6D, 0x3E, 0x61, 0xF8, 0xF8, 0x49, 0x0B, 0x79, 0x90, 0x90, 0xCA, 0xD4, 0x5B, 0x7D, 0x9B,
+ 0x75, 0xF9, 0x08, 0x36, 0x8B, 0x2E, 0xA5, 0x50, 0xB8, 0x7E, 0x3A, 0xED, 0x09, 0xED, 0x0C, 0x1C,
+ 0xB8, 0xDD, 0x5E, 0x13, 0x0A, 0x0B, 0x5C, 0xFB, 0x75, 0x41, 0x98, 0x2B, 0xC9, 0xAB, 0xC9, 0x14,
+ 0xDA, 0xFE, 0x34, 0x72, 0xB9, 0x7C, 0x86, 0x89, 0x0E, 0x2E, 0x58, 0xC3, 0xC1, 0xD5, 0x2B, 0x66,
+ 0x26, 0xD2, 0xBF, 0xBF, 0x96, 0x33, 0x30, 0xCE, 0x5D, 0x87, 0x02, 0xE2, 0x20, 0x71, 0xEC, 0x24,
+ 0xAD, 0x40, 0xFE, 0xEF, 0x52, 0xD1, 0x84, 0x72, 0xCD, 0xCD, 0x3C, 0xDB, 0xA7, 0x94, 0x0F, 0xAD,
+ 0x4C, 0x67, 0x3F, 0x13, 0x16, 0x4B, 0x6B, 0x26, 0x92, 0x3F, 0xB2, 0xAE, 0xA4, 0x5F, 0xBB, 0x65,
+ 0x0B, 0x13, 0xE2, 0xB9, 0x87, 0xA7, 0xB2, 0x14, 0xC0, 0x2A, 0x66, 0x5B, 0x99, 0x6C, 0xC6, 0x98,
+ 0xC2, 0xB6, 0x1B, 0x05, 0x14, 0xD6, 0xC9, 0x5B, 0x33, 0xE1, 0x14, 0x35, 0x82, 0xF9, 0x50, 0xF6,
+ 0xFD, 0xA0, 0x15, 0x6D, 0xB1, 0x59, 0x4A, 0x51, 0x9D, 0x81, 0xD4, 0x1C, 0xE2, 0x31, 0xDD, 0xD0,
+ 0xFF, 0xC8, 0x9A, 0x7B, 0x9F, 0xED, 0xD4, 0x33, 0xDF, 0xBA, 0x58, 0x9E, 0x36, 0xC1, 0x69, 0xA2,
+ 0xE2, 0x93, 0xC7, 0x21, 0x8D, 0x07, 0xFD, 0xA2, 0x37, 0xA9, 0xDC, 0x28, 0x7F, 0x16, 0xA1, 0x0E,
+ 0x00, 0x5E, 0x0D, 0x01, 0xCB, 0x36, 0x97, 0xD5, 0xC1, 0xF2, 0x93, 0xC7, 0x8A, 0xAE, 0xA7, 0xE6,
+ 0xBE, 0x0B, 0xA8, 0x3E, 0xA2, 0x26, 0xDF, 0x62, 0x13, 0xEF, 0xB8, 0x9A, 0xDA, 0xD4, 0x4D, 0xD0,
+ 0x78, 0x02, 0x54, 0x78, 0xEE, 0x5A, 0x6F, 0xAB, 0xD2, 0x6D, 0x94, 0xBC, 0xE9, 0xD3, 0x71, 0x3B,
+ 0x59, 0x73, 0xBE, 0x32, 0x7E, 0x7C, 0x69, 0x5C, 0xFC, 0xA3, 0x86, 0x86, 0x59, 0x83, 0x34, 0xD8,
+ 0xC9, 0x66, 0x8C, 0xEB, 0x56, 0xE0, 0xD0, 0xC2, 0xD1, 0x08, 0x35, 0xAB, 0x6F, 0x04, 0xAA, 0xB4,
+ 0x5C, 0x4D, 0x41, 0x71, 0x0A, 0xB8, 0x3E, 0x8C, 0xAF, 0x73, 0xF0, 0xF7, 0xD2, 0x28, 0x2A, 0x20,
+ 0xD6, 0xC6, 0x21, 0x2E, 0xB8, 0xF3, 0xDE, 0x84, 0xFD, 0x1C, 0x10, 0x36, 0x3A, 0x3B, 0x27, 0x97,
+ 0x93, 0xBB, 0x0F, 0xBE, 0x4E, 0xD4, 0x44, 0xA1, 0x3F, 0x53, 0x30, 0x68, 0x58, 0xA5, 0xF9, 0x27,
+ 0xF5, 0xFF, 0x3F, 0xC1, 0x9D, 0x89, 0x57, 0xE8, 0xF9, 0x3E, 0x66, 0x82, 0x57, 0x7B, 0x00, 0xD6,
+ 0x46, 0x6E, 0x42, 0x98, 0x6D, 0xCB, 0x99, 0x71, 0x74, 0xB9, 0x2A, 0x65, 0x54, 0xCE, 0xDD, 0x10,
+ 0xD3, 0xBB, 0xA6, 0x4D, 0xCA, 0x3B, 0x4E, 0x4D, 0x5C, 0xF8, 0x80, 0x45, 0xED, 0x0D, 0xBB, 0x1F,
+ 0xC8, 0xDD, 0x69, 0x33, 0x13, 0x6D, 0x47, 0x3F, 0x29, 0x51, 0x1C, 0xF9, 0xD9, 0x95, 0x64, 0x29,
+ 0x5C, 0xEC, 0x7A, 0x8B, 0x14, 0x07, 0xA0, 0x43, 0x1E, 0x5B, 0x7A, 0x5E, 0xDA, 0x7B, 0xA7, 0xC9,
+ 0x7B, 0xDC, 0x72, 0xF5, 0x90, 0xF2, 0x7D, 0xF9, 0x59, 0xE2, 0xE3, 0x74, 0xEE, 0x8B, 0xBC, 0x87,
+ 0x15, 0x24, 0x6D, 0x5C, 0x39, 0xA6, 0xE2, 0x1E, 0xA9, 0x4D, 0xB7, 0x39, 0x39, 0x75, 0x50, 0xF9,
+ 0x05, 0x88, 0xD2, 0xB5, 0x7C, 0xDB, 0x9A, 0x4D, 0x75, 0x52, 0xAB, 0x45, 0x2F, 0x0B, 0x77, 0x11,
+ 0xEF, 0xE6, 0x22, 0x86, 0xA9, 0xB7, 0x14, 0x08, 0xA9, 0xB2, 0x52, 0x54, 0x2F, 0x01, 0x32, 0x89,
+ 0x3C, 0xBE, 0xC2, 0xF6, 0x7D, 0x34, 0xBE, 0xD1, 0xDB, 0xE3, 0x74, 0x6F, 0x9B, 0x59, 0xF9, 0x86,
+ 0x0F, 0xE1, 0xA8, 0x7F, 0x64, 0x2D, 0xE0, 0x73, 0x9A, 0xCF, 0xB3, 0xF7, 0x7C, 0x7D, 0xE7, 0xF4,
+ 0xFB, 0x70, 0xF4, 0xFF, 0x82, 0x13, 0x31, 0x47, 0x66, 0xAC, 0x93, 0x3C, 0x5E, 0x59, 0x1B, 0xEE,
+ 0xEE, 0x63, 0x39, 0xF6, 0xED, 0x97, 0xAC, 0x17, 0x63, 0x90, 0xF2, 0x99, 0xCB, 0xC1, 0x8C, 0x37,
+ 0x42, 0xE1, 0x58, 0xF1, 0x91, 0xCA, 0x9E, 0x43, 0x01, 0x17, 0xA4, 0xD5, 0xDB, 0x48, 0x26, 0x2B,
+ 0xB9, 0x91, 0xE0, 0x42, 0xC0, 0xB2, 0x9C, 0x55, 0xD6, 0x0B, 0xF2, 0xC4, 0x03, 0x3B, 0x8B, 0xD2,
+ 0x42, 0xFB, 0xDD, 0xDD, 0xB8, 0x22, 0x01, 0x10, 0xC4, 0xE9, 0xA8, 0x88, 0xA4, 0x98, 0x5A, 0xBF,
+ 0x20, 0xEB, 0x6B, 0x0D, 0x6C, 0xB5, 0x2C, 0x82, 0xA8, 0xC5, 0xE4, 0xC2, 0x38, 0x77, 0x5E, 0x43,
+ 0x73, 0x75, 0x03, 0x6D, 0xDC, 0xD3, 0xE4, 0x01, 0xFD, 0x5A, 0x25, 0xD7, 0xF2, 0x7F, 0xC7, 0xF7,
+ 0x53, 0x94, 0x32, 0x11, 0xA1, 0x70, 0x46, 0x61, 0x33, 0x39, 0x73, 0xFB, 0xB9, 0x93, 0xD1, 0x59,
+ 0x92, 0xE8, 0xCB, 0x4A, 0x17, 0xB9, 0xB8, 0x75, 0xA8, 0xCC, 0x14, 0xD9, 0xD6, 0x4D, 0xF7, 0x71,
+ 0xB6, 0x3D, 0xDC, 0x56, 0x1E, 0x5D, 0x53, 0x83, 0xEE, 0xEA, 0x5C, 0xCE, 0xA0, 0xDC, 0x73, 0x4D,
+ 0xE5, 0x6D, 0x1D, 0x8C, 0x6B, 0xE1, 0xD9, 0x27, 0xAE, 0x70, 0x61, 0xEE, 0x8C, 0x3B, 0x83, 0x6A,
+ 0x94, 0x70, 0x28, 0xB1, 0x83, 0x03, 0x6E, 0x0A, 0xE9, 0xA7, 0x15, 0x42, 0x6F, 0x11, 0x95, 0x1D,
+ 0x05, 0x63, 0x20, 0xA8, 0xFA, 0x9A, 0x4F, 0x9B, 0xCD, 0xAF, 0xDA, 0xA2, 0x76, 0x12, 0x41, 0xB1,
+ 0x38, 0xCC, 0x43, 0xFB, 0x88, 0xB7, 0xB4, 0xAB, 0xC0, 0x60, 0x13, 0xC3, 0x8D, 0x98, 0x67, 0x51,
+ 0x35, 0xCE, 0x91, 0x8D, 0xF6, 0x06, 0xA1, 0xE5, 0xB3, 0x36, 0x1C, 0xE2, 0xEA, 0x58, 0x75, 0x7A,
+ 0xD1, 0x5A, 0xF2, 0xE6, 0x97, 0x17, 0x82, 0x07, 0x8D, 0xBD, 0x73, 0xF0, 0x2B, 0x23, 0x37, 0xDA,
+ 0xF7, 0xE0, 0xCE, 0xF0, 0xFB, 0x52, 0xA5, 0x4E, 0x62, 0xF7, 0xDF, 0xC6, 0x07, 0x56, 0xF0, 0x4B,
+ 0x75, 0xD2, 0x05, 0xC2, 0xD8, 0xE2, 0x60, 0xDE, 0x02, 0x21, 0x65, 0x68, 0x38, 0x5E, 0xA4, 0x4A,
+ 0x91, 0x51, 0x12, 0x71, 0xA4, 0x32, 0x52, 0xFD, 0x34, 0x5C, 0xC4, 0x0D, 0x38, 0x66, 0x22, 0xC5,
+ 0xD5, 0x28, 0xD2, 0xB2, 0x4A, 0x76, 0x9A, 0x04, 0xAD, 0x90, 0x34, 0xCF, 0x44, 0x56, 0xF0, 0x10,
+ 0x04, 0x16, 0x25, 0x3C, 0x05, 0x6F, 0x3D, 0xBD, 0xDC, 0x56, 0x15, 0xE8, 0x51, 0xC4, 0xB3, 0x7E,
+ 0xB6, 0xBC, 0x00, 0x20, 0xEA, 0x21, 0x9D, 0x9B, 0x8F, 0xBB, 0x76, 0x70, 0x16, 0x45, 0x23, 0xDE,
+ 0xC3, 0xA5, 0xB7, 0x18, 0x2E, 0x93, 0x5B, 0x65, 0x53, 0x35, 0xDC, 0xED, 0x55, 0x01, 0x89, 0xA6,
+ 0x2A, 0x26, 0xDE, 0x31, 0x68, 0x6D, 0x65, 0xA3, 0x40, 0xB0, 0xC9, 0xC9, 0x83, 0xEF, 0xB5, 0x95,
+ 0x98, 0xC5, 0xD6, 0x35, 0xE7, 0x25, 0x79, 0x5E, 0xFE, 0x5F, 0x5F, 0x32, 0x5F, 0xF8, 0x19, 0x41,
+ 0xB8, 0x97, 0x73, 0xEE, 0xAC, 0x6A, 0x8F, 0x7C, 0x48, 0xEC, 0x02, 0x48, 0x17, 0x0C, 0x60, 0x87,
+ 0x9A, 0x4E, 0xC5, 0xAE, 0x3C, 0xA5, 0xBE, 0x18, 0x34, 0xC6, 0xDF, 0x79, 0x1B, 0x3D, 0x4E, 0xEC,
+ 0x98, 0xE5, 0x59, 0x1B, 0xAC, 0xBF, 0xC3, 0x4A, 0xF4, 0x84, 0x97, 0x21, 0xCA, 0xA2, 0xB3, 0xF3,
+ 0xE4, 0x2B, 0x78, 0xB9, 0x51, 0x43, 0x2A, 0x1C, 0x47, 0xC1, 0x54, 0x3B, 0x0A, 0x75, 0x16, 0x58,
+ 0x6E, 0x7B, 0x73, 0xBF, 0xAD, 0xEA, 0xD6, 0x86, 0xF9, 0x1B, 0x06, 0x5B, 0x1C, 0x34, 0xC0, 0xEE,
+ 0x41, 0x05, 0xB1, 0x8D, 0xE6, 0x2B, 0x61, 0xB1, 0x24, 0x17, 0x89, 0xB1, 0x43, 0xCF, 0xAE, 0xC0,
+ 0x21, 0x76, 0x23, 0xC7, 0xA5, 0xE7, 0xDE, 0x44, 0x9F, 0x12, 0x8B, 0x6C, 0xBC, 0x19, 0x82, 0xCA,
+ 0x23, 0x39, 0x9E, 0xEC, 0x4E, 0xCE, 0x0F, 0x01, 0x51, 0x0D, 0xFE, 0x62, 0x9E, 0x80, 0xF4, 0x69,
+ 0xB3, 0x7A, 0xBC, 0x63, 0x96, 0x60, 0xD3, 0xEA, 0xFB, 0xC4, 0xEE, 0x1B, 0x34, 0x86, 0xA0, 0x7C,
+ 0x2C, 0xAE, 0x6D, 0x71, 0x30, 0x59, 0x22, 0x2C, 0x24, 0xE3, 0x7B, 0x46, 0x7D, 0x18, 0xE1, 0xBA,
+ 0x5D, 0xC0, 0x15, 0x67, 0x0A, 0x04, 0x62, 0xC1, 0x8C, 0x5C, 0xC5, 0x2E, 0x19, 0xB3, 0x8A, 0x41,
+ 0xBE, 0x2A, 0x76, 0x22, 0x8C, 0x76, 0xA2, 0x45, 0xDB, 0xB7, 0x7E, 0x1D, 0xB0, 0x76, 0x37, 0x59,
+ 0xDC, 0x22, 0x47, 0x7D, 0xAB, 0x34, 0x4D, 0x5F, 0x41, 0xCE, 0x89, 0x5D, 0x84, 0xF1, 0xBE, 0x90,
+ 0x25, 0xD3, 0xAC, 0xEE, 0x9F, 0x2A, 0x1E, 0x5C, 0xE2, 0x19, 0x76, 0x6F, 0xA2, 0x5C, 0x28, 0xAC,
+ 0x99, 0xBD, 0x59, 0x86, 0x08, 0x36, 0x0C, 0xB8, 0x3E, 0xD1, 0x98, 0x5D, 0x62, 0x94, 0x8F, 0xB1,
+ 0xA3, 0xE4, 0xFD, 0x56, 0x09, 0x95, 0xCB, 0xFD, 0x79, 0x7C, 0x6A, 0x78, 0x81, 0x19, 0x3C, 0x34,
+ 0x8A, 0x3B, 0x47, 0x10, 0x48, 0xBC, 0x22, 0x3D, 0xEB, 0x6A, 0xE7, 0x2E, 0xB0, 0xE1, 0x42, 0x55,
+ 0xE4, 0x2D, 0x98, 0xD1, 0x7B, 0x9C, 0xD2, 0x5E, 0x6F, 0x52, 0x33, 0x1E, 0xBB, 0x62, 0xBA, 0xB8,
+ 0xFB, 0x2B, 0x52, 0xE1, 0x3D, 0xA0, 0xB4, 0xDD, 0x05, 0xAC, 0xA6, 0xDC, 0x3A, 0x07, 0x0F, 0xB0,
+ 0x78, 0x5E, 0x93, 0xDE, 0xBD, 0x2A, 0x34, 0x92, 0xE0, 0xF0, 0xBC, 0x32, 0xB1, 0xEC, 0xAE, 0xD6,
+ 0x10, 0x37, 0x48, 0x89, 0x50, 0x74, 0x24, 0xEF, 0xC2, 0x5A, 0xFA, 0xF1, 0xCA, 0x5D, 0x12, 0xF9,
+ 0x00, 0xCE, 0x95, 0xA5, 0x9A, 0xC1, 0x38, 0x42, 0x27, 0xE6, 0xD3, 0xD6, 0xE1, 0x20, 0xDE, 0x6E,
+ 0x96, 0x1D, 0x1A, 0x02, 0xC3, 0x0E, 0x10, 0x3E, 0x55, 0x27, 0x78, 0xFA, 0xA1, 0x2B, 0x25, 0x6D,
+ 0x30, 0x97, 0xA5, 0xA6, 0xA0, 0x9D, 0xDE, 0x12, 0x2B, 0xDA, 0x82, 0xF9, 0xE9, 0xF5, 0x4F, 0xB9,
+ 0x30, 0x44, 0x57, 0x92, 0xC7, 0x64, 0xFE, 0x77, 0xF7, 0x0A, 0x4C, 0xC0, 0x96, 0xDD, 0x79, 0xFD,
+ 0xCC, 0xE7, 0xFE, 0x6A, 0x8F, 0x69, 0x34, 0x37, 0xB4, 0x41, 0xAA, 0x72, 0x74, 0xC6, 0xDA, 0xCD,
+ 0x7E, 0x72, 0x14, 0x92, 0x2D, 0xA1, 0x77, 0xAD, 0x1C, 0xDF, 0x99, 0x79, 0x6C, 0xEE, 0xDA, 0x0F,
+ 0x4C, 0x45, 0x93, 0x52, 0xC9, 0x83, 0x07, 0x57, 0x1A, 0xE2, 0xE0, 0xE6, 0x3F, 0x91, 0x7F, 0x72,
+ 0x0E, 0x2F, 0xC9, 0x21, 0x09, 0xB6, 0x66, 0xEA, 0xB2, 0x8D, 0xFB, 0x3E, 0xD2, 0x7C, 0xA4, 0xB5,
+ 0xE9, 0xFF, 0x35, 0xFB, 0x1A, 0x92, 0x81, 0xEA, 0x1D, 0x08, 0x01, 0x6F, 0x7E, 0x02, 0x55, 0x5E,
+ 0x11, 0x51, 0xD1, 0x37, 0x35, 0xD7, 0x96, 0xAD, 0xAC, 0xE4, 0x73, 0x3B, 0x63, 0x1A, 0x57, 0xCB,
+ 0xF8, 0xF7, 0x84, 0xC5, 0x10, 0x84, 0x1F, 0x30, 0x4E, 0x8E, 0xDA, 0xA0, 0xBE, 0xD1, 0x38, 0xC5,
+ 0x7B, 0x08, 0x3C, 0x9D, 0xA3, 0x09, 0x9F, 0x64, 0xE4, 0x12, 0xBA, 0x54, 0x45, 0x2D, 0x32, 0x2A,
+ 0x14, 0xCC, 0x75, 0xF5, 0xE0, 0xEB, 0x05, 0x87, 0x9B, 0xE4, 0x83, 0x52, 0x67, 0xC4, 0xB7, 0x9E,
+ 0x97, 0x38, 0xC7, 0x35, 0x7F, 0xF6, 0x34, 0x08, 0x3F, 0x12, 0x65, 0x88, 0x57, 0x8E, 0x60, 0x76,
+ 0xCB, 0x00, 0x4D, 0xF4, 0x88, 0x12, 0xF6, 0x3C, 0x2E, 0xA1, 0x8F, 0xD8, 0xA8, 0x29, 0x3B, 0xB0,
+ 0xE9, 0x5C, 0x32, 0x36, 0x9C, 0xAF, 0x90, 0x9F, 0x72, 0xA2, 0x96, 0x65, 0x17, 0x61, 0x06, 0x63,
+ 0x2B, 0x9E, 0x57, 0xA6, 0xA7, 0x1E, 0xB7, 0xD9, 0xEB, 0xC2, 0x2A, 0x64, 0xA3, 0x0B, 0x2A, 0x9A,
+ 0x9B, 0x87, 0x13, 0x25, 0x2C, 0x7C, 0xED, 0x8F, 0x21, 0x04, 0x13, 0x4A, 0xF1, 0xB9, 0xD2, 0x0D,
+ 0xAF, 0x95, 0x85, 0x77, 0x0C, 0x94, 0x77, 0xAF, 0x03, 0xA6, 0xA7, 0x3B, 0x06, 0xDF, 0x61, 0x08,
+ 0x36, 0x01, 0x49, 0x6D, 0x7F, 0x34, 0x4F, 0x56, 0x17, 0x50, 0xB5, 0xB4, 0xE7, 0xE7, 0xAE, 0xF5,
+ 0x61, 0xB5, 0xEB, 0xFD, 0x40, 0x15, 0x37, 0x9C, 0xF0, 0xA0, 0x47, 0x89, 0x45, 0x2B, 0x16, 0x49,
+ 0x98, 0xD0, 0xF7, 0x7F, 0x7A, 0xBC, 0x60, 0xA1, 0xBD, 0x7A, 0xB1, 0x75, 0xBD, 0x55, 0xD6, 0x2D,
+ 0x19, 0x5A, 0x51, 0x09, 0xA6, 0xA5, 0x19, 0x98, 0xC2, 0xA3, 0xA0, 0x40, 0x4F, 0x1A, 0x23, 0x04,
+ 0x55, 0x46, 0xA7, 0x1E, 0xE8, 0x33, 0xE1, 0x90, 0x13, 0x74, 0x74, 0x15, 0xA1, 0xCE, 0x47, 0x9C,
+ 0x62, 0x7D, 0x46, 0x3E, 0xE6, 0x2A, 0x51, 0xC4, 0x12, 0xB3, 0x6B, 0x4A, 0x1A, 0xBD, 0xE1, 0x10,
+ 0x8D, 0x64, 0x8A, 0xA8, 0x1D, 0x5F, 0x2E, 0x2F, 0x2F, 0x34, 0xD3, 0xEF, 0x48, 0x1C, 0x5E, 0xAE,
+ 0xA1, 0x53, 0xDB, 0xD5, 0x56, 0x8D, 0xD2, 0x10, 0xDB, 0x1B, 0x6A, 0x64, 0x86, 0x44, 0x27, 0xC5,
+ 0xD0, 0xE0, 0xD0, 0x94, 0x6F, 0xDC, 0x5A, 0x0D, 0x60, 0x93, 0xFA, 0x54, 0x65, 0xE0, 0xA8, 0x14,
+ 0xDB, 0xDF, 0x9F, 0x7B, 0xBB, 0xFA, 0xF7, 0xD5, 0x49, 0x7E, 0xB1, 0x38, 0x2F, 0x49, 0x02, 0xF6,
+ 0x15, 0xB7, 0x6F, 0x25, 0xFA, 0xDB, 0xE4, 0x1A, 0xB9, 0xCF, 0x5F, 0xA1, 0x6C, 0x7D, 0x71, 0xED,
+ 0xCC, 0xAB, 0x76, 0x4E, 0xE2, 0xC8, 0x44, 0x1A, 0xF9, 0xAA, 0x63, 0x51, 0xA0, 0x47, 0xE9, 0x62,
+ 0xAD, 0x48, 0x25, 0x15, 0xBD, 0x6B, 0xA8, 0xF2, 0x69, 0x10, 0x0A, 0xA9, 0x56, 0xCA, 0xCA, 0xF4,
+ 0xCD, 0x7D, 0x55, 0x09, 0xDB, 0x3C, 0x34, 0x9B, 0xED, 0x3A, 0x3A, 0xF9, 0xA4, 0xB2, 0xF4, 0xCE,
+ 0xD5, 0x46, 0x77, 0x34, 0xA3, 0x96, 0xA8, 0x0E, 0xA1, 0xB5, 0xD3, 0x69, 0x68, 0xF5, 0xB3, 0x17,
+ 0x99, 0x30, 0xBE, 0x03, 0xB0, 0x89, 0x1D, 0x75, 0xA4, 0xF7, 0x79, 0xF6, 0x7D, 0xA0, 0x24, 0xCD,
+ 0xE0, 0x0A, 0x92, 0x4D, 0xE4, 0xF7, 0x28, 0xE7, 0x52, 0x0C, 0x28, 0x62, 0xBA, 0x24, 0xD6, 0xA4,
+ 0x02, 0xFF, 0xD1, 0x6B, 0xDE, 0x0C, 0xB9, 0xA1, 0xBC, 0xBD, 0x2C, 0x7D, 0xF6, 0xFF, 0x2C, 0x8D,
+ 0x83, 0x08, 0x62, 0xC5, 0x6B, 0x9F, 0x11, 0xA2, 0x7D, 0xB7, 0x90, 0x38, 0x08, 0xB9, 0xDC, 0x46,
+ 0xA3, 0xD1, 0xD1, 0xE5, 0x36, 0xC3, 0xEE, 0x5F, 0x82, 0x63, 0x4E, 0x66, 0x30, 0x38, 0xC8, 0x40,
+ 0x2E, 0xB8, 0x82, 0xAE, 0x95, 0xCF, 0x45, 0x1A, 0xF9, 0x2A, 0x85, 0x9C, 0x66, 0x96, 0x7D, 0x69,
+ 0xC5, 0xE7, 0x13, 0xD6, 0x86, 0x39, 0x14, 0xE3, 0x1B, 0xBF, 0x78, 0x5B, 0xFB, 0x6A, 0x88, 0x1A,
+ 0xCA, 0x21, 0x6C, 0xE3, 0x80, 0xCE, 0x61, 0x3F, 0x13, 0x7A, 0xFD, 0x16, 0x4F, 0x32, 0xE0, 0xB8,
+ 0x76, 0x6D, 0x1D, 0x46, 0xB9, 0xF4, 0xA1, 0x05, 0x53, 0x5E, 0x96, 0x42, 0xF3, 0xF5, 0xA6, 0xAF,
+ 0x87, 0x78, 0xCF, 0x3D, 0x84, 0xB1, 0xFC, 0x97, 0x1F, 0x86, 0x79, 0x1E, 0xCE, 0xEF, 0x21, 0x13,
+ 0x5F, 0xD3, 0x23, 0xD3, 0x52, 0xE7, 0x31, 0x37, 0x40, 0x08, 0xB7, 0x6C, 0x50, 0xCA, 0x82, 0xB5,
+ 0x47, 0x04, 0x98, 0x5F, 0x28, 0xAA, 0x39, 0x76, 0xFA, 0x18, 0xAD, 0x08, 0x57, 0x9F, 0xFE, 0x7B,
+ 0x6F, 0x2B, 0x46, 0x83, 0x6C, 0xDE, 0x90, 0xCB, 0x41, 0x40, 0x22, 0x24, 0x4B, 0x82, 0x23, 0x72,
+ 0xC0, 0x28, 0x79, 0xAC, 0xE8, 0xF5, 0x96, 0xC2, 0xC1, 0x76, 0x6C, 0x5B, 0xBA, 0xFB, 0x60, 0x12,
+ 0xA1, 0xF1, 0x59, 0xE9, 0x70, 0x97, 0x5C, 0xD3, 0x6D, 0x3C, 0xC2, 0x18, 0xA4, 0x30, 0x37, 0xF0,
+ 0xAC, 0x92, 0xB3, 0xC3, 0x1F, 0xAA, 0x73, 0x03, 0x0A, 0x9F, 0x01, 0x5F, 0x4C, 0x68, 0x3A, 0xA5,
+ 0xB0, 0xB9, 0xBB, 0x87, 0xA4, 0x76, 0x9B, 0x36, 0xD0, 0x35, 0x68, 0x26, 0xEE, 0x76, 0x82, 0xDA,
+ 0x81, 0x16, 0xFB, 0x82, 0xD2, 0x9D, 0xCD, 0x4F, 0x3A, 0xAD, 0xA3, 0xC2, 0xBD, 0x9E, 0x60, 0x39,
+ 0x30, 0x1B, 0x9D, 0x4F, 0xAD, 0x0C, 0x88, 0x54, 0x57, 0x64, 0xFD, 0xBB, 0x63, 0x37, 0x7A, 0xB0,
+ 0x7E, 0x4C, 0x69, 0x4C, 0x6D, 0x78, 0x84, 0x69, 0x59, 0xF2, 0xAF, 0xFD, 0x76, 0x67, 0x0D, 0x1A,
+ 0x40, 0xB4, 0x4A, 0xE7, 0xDB, 0x9D, 0xD7, 0xD8, 0x66, 0xC7, 0x8D, 0xAD, 0x4C, 0xE2, 0x9D, 0x1A,
+ 0x63, 0xA2, 0x56, 0xD9, 0x40, 0x6D, 0x7B, 0xE0, 0x0F, 0x78, 0xAA, 0x88, 0xA7, 0xA8, 0x62, 0xE3,
+ 0x7E, 0xE9, 0x8C, 0x65, 0xB5, 0x56, 0x2A, 0x1E, 0x5C, 0xDF, 0xC4, 0x3C, 0xC3, 0x5D, 0x46, 0x00,
+ 0xF1, 0x8A, 0x0B, 0x7C, 0x58, 0x94, 0xA4, 0x5B, 0xAA, 0x3A, 0x72, 0x0D, 0xE9, 0x59, 0x99, 0x87,
+ 0x06, 0xE8, 0xC9, 0x4F, 0xC5, 0x54, 0x10, 0x00, 0xAE, 0x45, 0xCF, 0xE7, 0x81, 0xE5, 0xC4, 0x85,
+ 0x70, 0xD6, 0xD9, 0x60, 0x9D, 0x19, 0x5F, 0xC9, 0xBE, 0x3D, 0xB7, 0x24, 0xB4, 0x7B, 0x08, 0xFB,
+ 0xA4, 0x9E, 0x36, 0x26, 0xA0, 0xF2, 0x86, 0xE9, 0x67, 0x10, 0xF6, 0x8E, 0xE9, 0xEB, 0xA3, 0xB3,
+ 0x75, 0x83, 0x38, 0xA7, 0x45, 0x81, 0xF0, 0xF3, 0x62, 0x18, 0x02, 0xF1, 0x95, 0x8C, 0xEA, 0x39,
+ 0xD2, 0xB7, 0x11, 0xC0, 0x06, 0x11, 0x07, 0x42, 0x54, 0xE5, 0x2B, 0xC8, 0xD5, 0x8C, 0x08, 0x25,
+ 0xE1, 0xD0, 0x8D, 0x7E, 0x61, 0x28, 0x79, 0x6A, 0x2B, 0x33, 0xD9, 0xE9, 0x6B, 0x04, 0x95, 0x1E,
+ 0xE0, 0xA1, 0xA4, 0x32, 0x71, 0x0E, 0xCD, 0xCB, 0x80, 0xB8, 0x38, 0x79, 0xF0, 0x9E, 0x58, 0x5E,
+ 0xF6, 0x35, 0xCC, 0xC5, 0xB9, 0xC7, 0x73, 0xCF, 0x13, 0xEA, 0x77, 0x18, 0xD4, 0x37, 0x46, 0x1B,
+ 0x66, 0xED, 0x68, 0xEA, 0x1B, 0x38, 0xCF, 0xAD, 0x64, 0x28, 0x1C, 0x04, 0x81, 0x52, 0x03, 0x8F,
+ 0xC7, 0x45, 0xAE, 0x52, 0xD4, 0x23, 0x27, 0xDB, 0x2C, 0x98, 0xE8, 0x74, 0xE6, 0xA7, 0x1E, 0x6E,
+ 0x31, 0x10, 0xF5, 0xBB, 0x1A, 0xA0, 0x5F, 0x6C, 0xAE, 0x38, 0xD7, 0xC6, 0xA2, 0x77, 0x6A, 0x47,
+ 0x92, 0xC5, 0xC3, 0xE3, 0x12, 0xCE, 0x9A, 0xCB, 0x1F, 0x75, 0xED, 0x1C, 0x16, 0x30, 0xB8, 0xCC,
+ 0x4E, 0xB1, 0xA5, 0xCE, 0x85, 0xD3, 0x2E, 0xC1, 0x13, 0x3D, 0x32, 0xBE, 0xBB, 0x22, 0x77, 0x9B,
+ 0x13, 0x10, 0x2C, 0x53, 0x96, 0x24, 0x02, 0xA1, 0x6B, 0xB1, 0xEF, 0xC8, 0xE9, 0xF0, 0x2A, 0x87,
+ 0xEF, 0xE3, 0xBF, 0xD8, 0xB3, 0x16, 0xC2, 0x6C, 0xFE, 0xC2, 0xAC, 0x91, 0x28, 0x4F, 0x31, 0xA8,
+ 0xAF, 0x51, 0x1C, 0xB7, 0x37, 0xA7, 0x6E, 0x77, 0x37, 0x78, 0x2B, 0x74, 0x78, 0xEF, 0x09, 0x9B,
+ 0x55, 0x30, 0x4E, 0x23, 0xFE, 0xCE, 0x62, 0xCE, 0x92, 0x38, 0x49, 0x6F, 0x5D, 0xDD, 0xCD, 0x09,
+ 0x9E, 0xEB, 0xC5, 0xCC, 0x9B, 0xC2, 0xE4, 0xBF, 0x12, 0x47, 0xFA, 0xA5, 0xB6, 0x89, 0x09, 0x25,
+ 0xDA, 0x33, 0x3A, 0xFD, 0x77, 0xB2, 0x7A, 0xB3, 0x77, 0xC1, 0x88, 0x88, 0x8E, 0xC5, 0x81, 0xA6,
+ 0x5E, 0x69, 0xE1, 0xA4, 0xB0, 0x4A, 0x99, 0x59, 0xA0, 0xC7, 0x11, 0x9E, 0xBC, 0x63, 0x62, 0x43,
+ 0xC0, 0x2C, 0x33, 0x63, 0x6B, 0x51, 0xCE, 0xDC, 0x15, 0x8C, 0x59, 0x46, 0x6D, 0x91, 0x98, 0x1B,
+ 0x59, 0xA5, 0x48, 0xF1, 0x04, 0x8E, 0x06, 0xA6, 0x5D, 0x30, 0xB6, 0xAF, 0xBF, 0x84, 0x78, 0x06,
+ 0x8B, 0x79, 0x69, 0xB5, 0x19, 0x5A, 0x85, 0xD6, 0xF4, 0x6B, 0xD4, 0x0D, 0x80, 0xDB, 0xCF, 0xC6,
+ 0xCA, 0xE1, 0x48, 0x3C, 0x97, 0x19, 0x5E, 0x4B, 0xE6, 0x5C, 0x6D, 0xAF, 0xA0, 0xBE, 0xF6, 0x50,
+ 0x4C, 0xE2, 0x58, 0xDD, 0xE7, 0xCD, 0x28, 0x70, 0x54, 0x3B, 0x50, 0x97, 0x20, 0xB1, 0x19, 0xF2,
+ 0x09, 0x0B, 0xBB, 0xCF, 0x35, 0xDA, 0x36, 0xAB, 0x12, 0xBA, 0xAF, 0xFF, 0xF4, 0x6C, 0x87, 0xA7,
+ 0xB9, 0x7C, 0x02, 0xB7, 0xC7, 0x16, 0x7E, 0x3E, 0xF1, 0x33, 0x9E, 0x60, 0x9C, 0x3F, 0xCC, 0xAC,
+ 0x01, 0x4C, 0x13, 0xF0, 0x43, 0xBF, 0x21, 0x60, 0xE9, 0xBA, 0x34, 0x2B, 0x08, 0xD2, 0xFE, 0x0F,
+ 0x73, 0x52, 0xAE, 0xA2, 0x54, 0x51, 0x90, 0xD2, 0x9E, 0xE9, 0x62, 0xAC, 0x37, 0x39, 0x2A, 0xAD,
+ 0x0A, 0x1C, 0xFE, 0x09, 0x30, 0xDD, 0x9C, 0x2F, 0x52, 0xFD, 0x8F, 0x41, 0xF9, 0xCE, 0xAE, 0xB8,
+ 0x66, 0xB6, 0x44, 0x1A, 0x82, 0x53, 0x33, 0x48, 0xA6, 0x8D, 0xEF, 0xE8, 0x80, 0xC3, 0x0E, 0xD7,
+ 0x80, 0xC6, 0x13, 0x1F, 0x4C, 0x99, 0x43, 0x56, 0x45, 0x35, 0x54, 0x33, 0x68, 0x1F, 0xEF, 0x7F,
+ 0xB2, 0xB1, 0xF5, 0x7E, 0x7E, 0x08, 0xDE, 0xD2, 0x5B, 0x52, 0x89, 0x20, 0xDF, 0xD9, 0x5A, 0x64,
+ 0x71, 0x37, 0x79, 0x98, 0x69, 0x10, 0xF6, 0xA2, 0x5F, 0xBE, 0x71, 0x35, 0xE0, 0x88, 0x74, 0x7A,
+ 0xB5, 0x81, 0x2E, 0x4E, 0x71, 0x7F, 0x5A, 0x3A, 0x8A, 0xCE, 0xBE, 0xC5, 0x40, 0x8F, 0xC5, 0x2E,
+ 0xA5, 0x9A, 0x4D, 0x74, 0xE4, 0x73, 0xC7, 0x96, 0x97, 0x84, 0x7E, 0x90, 0x44, 0x83, 0x24, 0xEE,
+ 0x83, 0x42, 0xA3, 0xCC, 0x1C, 0x7A, 0x4D, 0x27, 0x0B, 0x80, 0xD0, 0xA4, 0xAC, 0x9B, 0x1E, 0xCB,
+ 0xFC, 0x7F, 0x12, 0x31, 0x41, 0x3D, 0x06, 0x4A, 0xBC, 0xF6, 0x22, 0xF1, 0xC8, 0xF0, 0x9C, 0x1A,
+ 0x8D, 0x96, 0x5A, 0xA7, 0xB4, 0x6B, 0x45, 0xBC, 0x4D, 0x32, 0xC1, 0x9C, 0xC6, 0xA0, 0xCE, 0xED,
+ 0x7B, 0x97, 0x59, 0x7F, 0x42, 0x32, 0x22, 0xA3, 0x18, 0xFD, 0x65, 0xBC, 0x2C, 0xC3, 0xEA, 0xE8,
+ 0xBD, 0xC1, 0xFF, 0xE1, 0x20, 0xAB, 0xC0, 0x6A, 0xDA, 0xF9, 0x3A, 0x85, 0x79, 0x7A, 0x10, 0xB9,
+ 0xA0, 0x7A, 0xAA, 0xAD, 0xF1, 0x8D, 0x67, 0x8F, 0x59, 0xE0, 0x10, 0x4A, 0x62, 0xA7, 0xD1, 0x8D,
+ 0xF9, 0x26, 0xBE, 0x00, 0x42, 0x81, 0xA0, 0x1F, 0xFF, 0xCE, 0xAE, 0xAF, 0x1C, 0x56, 0x92, 0x48,
+ 0x65, 0xE7, 0x2A, 0xC6, 0xE2, 0x78, 0xDE, 0xA2, 0x87, 0x5C, 0x89, 0x3E, 0x38, 0xC4, 0x30, 0xB4,
+ 0x07, 0x75, 0x7A, 0x01, 0x76, 0xCD, 0x95, 0xD2, 0xA1, 0x4C, 0x37, 0xB5, 0xA5, 0x2B, 0xE5, 0x09,
+ 0x8B, 0x45, 0x5C, 0x77, 0x9F, 0xE8, 0xAB, 0xB9, 0xD6, 0xB0, 0x91, 0x57, 0xA6, 0x9E, 0x5D, 0x01,
+ 0xB5, 0xE2, 0xE5, 0x11, 0xC5, 0x77, 0xC1, 0x11, 0x54, 0x97, 0x45, 0x4F, 0x8E, 0x75, 0xB4, 0xA3,
+ 0xD7, 0xF4, 0x0F, 0xCC, 0x69, 0xAA, 0xB2, 0xAC, 0xB4, 0x92, 0xD4, 0x66, 0xB8, 0xA1, 0x91, 0xA2,
+ 0x74, 0xEF, 0xBE, 0x1D, 0xDF, 0xBD, 0xF9, 0x26, 0x34, 0x1D, 0x71, 0x7C, 0x54, 0x14, 0x42, 0x40,
+ 0x94, 0x4B, 0xA2, 0xF2, 0x1C, 0xD6, 0x86, 0x32, 0x22, 0x64, 0xE4, 0x13, 0x8D, 0x6A, 0xA2, 0x1C,
+ 0xB0, 0x3F, 0x78, 0xA9, 0x56, 0x61, 0xFB, 0x56, 0xEE, 0x3D, 0x26, 0x2A, 0x1C, 0x7E, 0x4D, 0x22,
+ 0xD4, 0xFA, 0xA6, 0xBA, 0x7E, 0x2D, 0x9B, 0x6C, 0xF7, 0x64, 0x20, 0xCA, 0xD6, 0x89, 0x49, 0x92,
+ 0xFF, 0x2A, 0xBB, 0xA8, 0x8A, 0xE5, 0x90, 0xEA, 0x20, 0x07, 0xFF, 0xE7, 0xF5, 0xD6, 0x96, 0x77,
+ 0xE2, 0xEB, 0xC4, 0xD2, 0x51, 0x19, 0x74, 0x83, 0xE2, 0xA3, 0xC2, 0x77, 0xF9, 0x2E, 0x73, 0x95,
+ 0x86, 0x76, 0x82, 0x6F, 0xB6, 0x4A, 0x0B, 0x6A, 0x95, 0xCA, 0xDD, 0x7F, 0x66, 0x17, 0x09, 0xE1,
+ 0xD9, 0xD1, 0xA0, 0xE7, 0x25, 0x64, 0xCB, 0xB6, 0x9A, 0x0F, 0x33, 0x0F, 0xFB, 0xB3, 0x52, 0x78,
+ 0x00, 0x4E, 0xFB, 0xFF, 0xC9, 0x55, 0x2A, 0x66, 0x8B, 0xC7, 0x9B, 0x4B, 0x94, 0xFB, 0x5E, 0x77,
+ 0x54, 0x08, 0x94, 0xC3, 0x7C, 0xFB, 0x63, 0xF0, 0x7C, 0x7C, 0xD5, 0xC4, 0xE2, 0xAE, 0x9F, 0x8E,
+ 0x7F, 0xA2, 0x43, 0x10, 0x6E, 0x1C, 0x9C, 0xC7, 0x62, 0x1E, 0x58, 0x87, 0xFE, 0x80, 0x0F, 0x53,
+ 0x40, 0x1E, 0xC9, 0xA5, 0xE1, 0xCD, 0xFC, 0x65, 0x75, 0x5B, 0xC8, 0x4B, 0x18, 0x0C, 0x71, 0x70,
+ 0xF6, 0x0E, 0x70, 0xE6, 0x9C, 0xE0, 0xF3, 0xFE, 0x2A, 0xA2, 0x58, 0x23, 0x80, 0x85, 0xAD, 0xA0,
+ 0x65, 0xA2, 0x62, 0xB6, 0xB5, 0x0A, 0x78, 0x3E, 0xF9, 0x46, 0x85, 0x22, 0xA5, 0xBD, 0x63, 0xB3,
+ 0x56, 0x75, 0x99, 0xD6, 0x87, 0xFB, 0x6A, 0xB6, 0xB1, 0x02, 0x3B, 0xB1, 0x10, 0x32, 0x19, 0x71,
+ 0x32, 0xD4, 0x12, 0xFB, 0x49, 0xBC, 0x51, 0x09, 0xC7, 0x2F, 0xFF, 0xB8, 0xA2, 0xE3, 0x1D, 0xCA,
+ 0x74, 0xC1, 0x41, 0xC3, 0xEF, 0x3F, 0xDC, 0x4D, 0x40, 0xEA, 0xF7, 0xBB, 0x05, 0x91, 0x11, 0x78,
+ 0x99, 0xB4, 0xA4, 0xD9, 0x39, 0x17, 0x87, 0xDF, 0x25, 0xDB, 0xE0, 0x73, 0xA6, 0xE9, 0x3D, 0x27,
+ 0x44, 0xCD, 0x4F, 0xB1, 0x8E, 0x1A, 0x90, 0x94, 0x07, 0xC9, 0x3E, 0x93, 0x46, 0xDB, 0x05, 0x06,
+ 0xF8, 0x64, 0x5D, 0x78, 0xBF, 0x7D, 0x73, 0x59, 0x69, 0x5C, 0x6C, 0x1A, 0xE1, 0x86, 0x9E, 0x69,
+ 0x3C, 0x3B, 0x51, 0x09, 0xE6, 0x43, 0xD3, 0x2B, 0xA8, 0x47, 0x37, 0xAE, 0x9C, 0xBA, 0x6C, 0x3C,
+ 0x2C, 0x46, 0x60, 0x24, 0x69, 0xE8, 0xCE, 0xF5, 0x40, 0xCA, 0x72, 0x7E, 0x2E, 0xAA, 0x6F, 0x60,
+ 0x7E, 0x79, 0x53, 0xFC, 0x09, 0x30, 0x3E, 0x2D, 0x60, 0x21, 0xBA, 0x68, 0x54, 0x49, 0x91, 0x76,
+ 0x53, 0x60, 0x23, 0xE5, 0xC8, 0x9B, 0xA4, 0x4C, 0x64, 0xD5, 0x02, 0x46, 0x95, 0xD9, 0x72, 0x3C,
+ 0x30, 0xE8, 0xF1, 0x53, 0x53, 0xC7, 0x8E, 0x90, 0xF4, 0x34, 0xF3, 0x0C, 0x3F, 0x72, 0xCA, 0x1D,
+ 0x75, 0x72, 0xBE, 0x46, 0x8A, 0xC0, 0xD3, 0x06, 0x93, 0x72, 0xB0, 0xBF, 0xD0, 0x77, 0x99, 0x06,
+ 0x7B, 0xDF, 0x6F, 0x10, 0xFB, 0xC6, 0x1D, 0x55, 0x66, 0x2F, 0x81, 0x83, 0x72, 0x3F, 0x30, 0x60,
+ 0xFA, 0x34, 0xE9, 0xCF, 0xB3, 0x0F, 0x95, 0xBD, 0xE4, 0x9F, 0xDF, 0x53, 0x6E, 0x00, 0xC9, 0x07,
+ 0x7E, 0x9B, 0x79, 0xBD, 0xD2, 0xE2, 0x77, 0x80, 0xB4, 0xF3, 0x9A, 0x46, 0x20, 0x8C, 0x21, 0x0A,
+ 0xEA, 0xFE, 0x07, 0x61, 0x58, 0xB8, 0x38, 0x47, 0xF5, 0x75, 0x5B, 0x33, 0x78, 0x9E, 0x66, 0xDF,
+ 0x30, 0xAD, 0xD8, 0xED, 0x5D, 0x73, 0x75, 0x6D, 0x4E, 0x63, 0x8B, 0x35, 0x4F, 0xCA, 0x75, 0x58,
+ 0xDB, 0xEA, 0x2A, 0xE2, 0xB1, 0xE1, 0x15, 0x6C, 0x69, 0x46, 0xC8, 0xD9, 0x67, 0x15, 0x4B, 0xCE,
+ 0xB4, 0x04, 0x9B, 0x9D, 0xCA, 0xB7, 0x5E, 0x4B, 0xA3, 0x6C, 0xD1, 0xFF, 0x4A, 0x71, 0x71, 0x9C,
+ 0x11, 0x87, 0x5E, 0x9E, 0x5D, 0xA9, 0x05, 0x1F, 0xD8, 0x96, 0xA9, 0x3F, 0xFA, 0xEB, 0x0A, 0x91,
+ 0x44, 0xDD, 0xCF, 0x93, 0xD5, 0x0A, 0x80, 0x9C, 0xA8, 0xCB, 0x2A, 0x7F, 0x03, 0x45, 0x43, 0xA7,
+ 0xC3, 0x59, 0xFF, 0xFC, 0xFF, 0x44, 0x24, 0xB1, 0x02, 0xBB, 0x42, 0xCF, 0x45, 0xC9, 0xF4, 0xAE,
+ 0x23, 0x5D, 0xB2, 0x0B, 0xDE, 0xAD, 0x7E, 0xD6, 0x1C, 0x75, 0xFE, 0x90, 0xCF, 0x49, 0xB1, 0x51,
+ 0x36, 0x3A, 0x48, 0xD2, 0xCE, 0xAA, 0x40, 0x2D, 0xE9, 0x70, 0x85, 0xCC, 0x66, 0xB5, 0x2A, 0x85,
+ 0xA2, 0x1E, 0x18, 0x18, 0xA7, 0x6A, 0x89, 0x39, 0x1E, 0x56, 0x7E, 0xA7, 0xC7, 0x9F, 0x9B, 0xFA,
+ 0x58, 0x4A, 0x08, 0x0E, 0x78, 0x81, 0x84, 0xB3, 0x66, 0xA4, 0x8B, 0x20, 0xF2, 0xB0, 0x48, 0xA4,
+ 0xE4, 0xA1, 0xC2, 0x05, 0xB7, 0x19, 0xFE, 0x71, 0xEF, 0xCB, 0x30, 0x8C, 0xC2, 0x3B, 0xE4, 0x78,
+ 0x1C, 0x92, 0x51, 0x96, 0xC1, 0x89, 0xA3, 0x71, 0x9A, 0x6D, 0xF5, 0x35, 0xA6, 0xEE, 0x71, 0xE2,
+ 0x12, 0x55, 0x88, 0x61, 0x10, 0x50, 0x47, 0x53, 0x3D, 0xBA, 0x0F, 0x6A, 0xE9, 0x5C, 0x8B, 0x0F,
+ 0x8B, 0xAC, 0xCD, 0x20, 0xAE, 0x5B, 0x9A, 0x80, 0xB4, 0x9C, 0x27, 0x5D, 0x47, 0xD6, 0x03, 0xFE,
+ 0x68, 0x38, 0xBC, 0x34, 0x1B, 0xFD, 0x62, 0xCF, 0x9A, 0xC0, 0xC9, 0x7C, 0xAB, 0xF5, 0x85, 0x1D,
+ 0x81, 0x41, 0x6D, 0xB3, 0x62, 0x72, 0x4A, 0x6F, 0xDD, 0xA8, 0xB4, 0xAE, 0xEA, 0xE0, 0xED, 0x57,
+ 0x82, 0x0A, 0x7E, 0xD1, 0x3B, 0x7E, 0xA5, 0x43, 0x9E, 0x5F, 0x73, 0x92, 0xEF, 0xAA, 0xC5, 0xAB,
+ 0xA9, 0x07, 0xD5, 0xB5, 0x32, 0x9E, 0xD3, 0x66, 0xA3, 0x98, 0xDC, 0xF5, 0x12, 0xB6, 0x89, 0xE0,
+ 0x58, 0xE3, 0x26, 0x62, 0xDC, 0xA2, 0xB9, 0x58, 0x7C, 0x42, 0xA7, 0xFB, 0x9E, 0x12, 0xD9, 0x50,
+ 0x55, 0xFD, 0x64, 0xC7, 0xFC, 0xA1, 0x12, 0x98, 0x43, 0xEE, 0x62, 0xBC, 0x75, 0x3B, 0x5D, 0xE1,
+ 0xFF, 0xAF, 0x29, 0x4D, 0x81, 0x6A, 0xB2, 0x13, 0x2D, 0xE9, 0x9C, 0x65, 0x90, 0x1A, 0xBE, 0x06,
+ 0x69, 0x9D, 0xC7, 0xF5, 0x98, 0xEB, 0xA4, 0x13, 0x67, 0xDD, 0xA4, 0x7E, 0x23, 0x56, 0x92, 0x31,
+ 0x62, 0xA3, 0xDD, 0x7B, 0xB9, 0x1C, 0xD1, 0x0E, 0xEF, 0x1A, 0xB5, 0x94, 0xF4, 0x10, 0xD4, 0x21,
+ 0x76, 0x14, 0xC1, 0x2D, 0x5C, 0x2F, 0x71, 0x86, 0x94, 0x84, 0x41, 0x6A, 0x1F, 0xA2, 0x75, 0xFF,
+ 0x34, 0x0B, 0xCA, 0xD4, 0x11, 0x7F, 0xB7, 0xD0, 0xAB, 0x7E, 0xB9, 0x13, 0x26, 0x1B, 0x60, 0x48,
+ 0x62, 0x2A, 0xF7, 0x18, 0x24, 0xDF, 0x51, 0x6B, 0x34, 0x61, 0x99, 0x27, 0x03, 0x95, 0x6C, 0xAA,
+ 0x81, 0xFA, 0x94, 0xAB, 0x9E, 0x34, 0xA5, 0xC5, 0x8C, 0xA6, 0x6A, 0x43, 0x2D, 0x5F, 0x99, 0xE5,
+ 0x00, 0xE5, 0x51, 0x71, 0x19, 0xA6, 0xF5, 0x36, 0x1E, 0x21, 0xF2, 0x26, 0xE4, 0x7A, 0x18, 0x76,
+ 0x10, 0xE9, 0xE0, 0x9E, 0x54, 0x2D, 0xFA, 0x83, 0x9F, 0x41, 0x7C, 0x0E, 0xA7, 0xC9, 0xDD, 0x58,
+ 0x73, 0x18, 0xCB, 0x26, 0x60, 0xE8, 0x90, 0xC1, 0x4D, 0x0B, 0x01, 0x01, 0xD8, 0x57, 0xED, 0x78,
+ 0xF9, 0x28, 0x0D, 0xA7, 0x1F, 0x66, 0x99, 0x0A, 0x17, 0x8C, 0xA7, 0xC1, 0xD2, 0x51, 0x4C, 0x2E,
+ 0x7C, 0x3F, 0xE0, 0x2F, 0x66, 0x6D, 0x68, 0x2B, 0xE0, 0x17, 0x2F, 0x21, 0xE5, 0x4A, 0xD9, 0x46,
+ 0x39, 0xA4, 0xD5, 0x2E, 0xF7, 0x6F, 0xAD, 0xA9, 0x13, 0xAE, 0x97, 0xF3, 0xFC, 0xCE, 0xDA, 0x4C,
+ 0x35, 0xF1, 0x19, 0xCC, 0x27, 0xA4, 0x5C, 0xF9, 0xDD, 0x19, 0x84, 0xF2, 0x35, 0xDD, 0x3D, 0x7A,
+ 0xD0, 0x9F, 0xA5, 0x81, 0xFB, 0x66, 0x6E, 0x71, 0x83, 0x88, 0x47, 0xA5, 0xF7, 0xE8, 0x19, 0x5B,
+ 0x93, 0xE0, 0x1A, 0xE4, 0xED, 0x56, 0xC5, 0xCC, 0x8D, 0xCB, 0x50, 0x41, 0x0B, 0xEA, 0x2D, 0x2F,
+ 0xBA, 0x8A, 0xA3, 0x64, 0x46, 0x5F, 0x27, 0x22, 0x17, 0xD9, 0xCC, 0xD6, 0xAD, 0x32, 0xE6, 0x19,
+ 0x35, 0xD2, 0x3C, 0x54, 0xB5, 0x14, 0xC8, 0x3C, 0x65, 0x9F, 0xA4, 0x2A, 0x44, 0xBA, 0xF3, 0xE5,
+ 0xBA, 0x10, 0x3B, 0xD6, 0x67, 0xFB, 0x94, 0x99, 0x9A, 0xD7, 0x37, 0x96, 0xC6, 0x6B, 0xD7, 0xBA,
+ 0x58, 0x82, 0xED, 0x49, 0xD8, 0x6A, 0x58, 0xDB, 0x04, 0x78, 0x62, 0x8D, 0x30, 0xCA, 0xA0, 0xB8,
+ 0xDE, 0xCD, 0x06, 0x7D, 0xF3, 0xE8, 0xF8, 0x54, 0xD7, 0xD4, 0x8D, 0xFB, 0xD0, 0xB9, 0x08, 0xE3,
+ 0xCE, 0x81, 0x7C, 0xCF, 0x71, 0x41, 0x03, 0x1B, 0x9A, 0xED, 0x5C, 0x71, 0xB5, 0x7B, 0x56, 0xDC,
+ 0x0B, 0x1F, 0xF1, 0xAF, 0x55, 0xE2, 0x37, 0x44, 0x42, 0x69, 0x27, 0xDB, 0xCE, 0x5E, 0xC1, 0x8A,
+ 0x20, 0x30, 0xBD, 0x7F, 0x71, 0x2C, 0x1A, 0x26, 0x7C, 0xF8, 0xEF, 0x72, 0x6B, 0x87, 0xB7, 0x13,
+ 0x9B, 0x39, 0xBC, 0xBD, 0x67, 0xEC, 0x54, 0xA9, 0xB0, 0x5C, 0x11, 0xC3, 0x60, 0xA7, 0x2F, 0x6D,
+ 0xBC, 0xEB, 0x99, 0x82, 0x47, 0xEE, 0xD4, 0xEE, 0x85, 0xA5, 0xF6, 0xEB, 0x59, 0xA1, 0xC0, 0x0E,
+ 0xC1, 0x1C, 0x1B, 0x9F, 0xC7, 0xAD, 0xF1, 0x1C, 0x35, 0x77, 0x06, 0x42, 0xD7, 0xB2, 0x98, 0x0D,
+ 0x86, 0xF1, 0x71, 0x93, 0xED, 0x29, 0x10, 0xC1, 0x64, 0xA1, 0x0D, 0x5F, 0x21, 0x8E, 0x9B, 0x7B,
+ 0x16, 0xF8, 0xAA, 0x6E, 0x39, 0x38, 0x71, 0xB0, 0xDA, 0x6F, 0xF7, 0x74, 0xBD, 0xAB, 0xF2, 0x4C,
+ 0xB2, 0x9E, 0x1E, 0x1D, 0xB0, 0x75, 0x97, 0xD3, 0x22, 0x03, 0x3D, 0xB9, 0x24, 0x16, 0x16, 0x88,
+ 0x95, 0x17, 0x9D, 0x67, 0x19, 0xC1, 0x6F, 0x40, 0xC2, 0x61, 0x52, 0xC8, 0x27, 0x39, 0x75, 0xE5,
+ 0x93, 0xD5, 0x71, 0x89, 0x3E, 0x79, 0x08, 0x49, 0x4B, 0x02, 0xD9, 0x8D, 0xD8, 0x5B, 0x19, 0x35,
+ 0x34, 0x5F, 0x32, 0x68, 0x0A, 0xBA, 0xEA, 0x9C, 0xB3, 0x21, 0x25, 0x29, 0x3F, 0xA5, 0x11, 0xF8,
+ 0x78, 0xA9, 0x6E, 0xED, 0x7E, 0x20, 0xC3, 0xA5, 0xC7, 0x56, 0xCE, 0x29, 0x4E, 0xC0, 0xA5, 0x04,
+ 0x73, 0x2A, 0xE3, 0x22, 0xF8, 0x30, 0xE5, 0x1D, 0x0C, 0x76, 0x00, 0xF6, 0x8F, 0xEC, 0x70, 0x65,
+ 0x18, 0x64, 0xCD, 0x20, 0x37, 0x35, 0x43, 0xA2, 0xF0, 0x67, 0x2D, 0xDE, 0x49, 0xE3, 0x7A, 0x66,
+ 0x5A, 0x01, 0x87, 0x31, 0xD8, 0x77, 0x85, 0x39, 0x6D, 0xBC, 0x5A, 0xF3, 0x8B, 0x5C, 0x7C, 0x8F,
+ 0xD8, 0x6A, 0x98, 0xE6, 0x8C, 0x80, 0x3A, 0x44, 0x9B, 0x44, 0xFC, 0xA1, 0x13, 0xF9, 0xA6, 0x26,
+ 0x1D, 0xC2, 0xF8, 0x49, 0x98, 0x97, 0x49, 0xEF, 0x28, 0x55, 0x0A, 0x0B, 0x0B, 0x3E, 0x12, 0x20,
+ 0x3E, 0x25, 0x57, 0xC0, 0xB4, 0xB1, 0xD8, 0x87, 0x33, 0xB7, 0xB4, 0xD8, 0x99, 0x86, 0x85, 0xB1,
+ 0xCD, 0xB0, 0x36, 0xC1, 0xFD, 0x1D, 0x6E, 0x5E, 0x6C, 0x65, 0x28, 0x34, 0x13, 0x2C, 0x65, 0x91,
+ 0x98, 0x46, 0xCF, 0x26, 0x66, 0x06, 0x35, 0x10, 0xE4, 0x82, 0x89, 0x2E, 0xE2, 0x62, 0x6C, 0xAA,
+ 0x2B, 0x97, 0xAC, 0x23, 0x67, 0x50, 0xE1, 0x88, 0xE2, 0xC2, 0x02, 0xCC, 0x8C, 0x93, 0xAC, 0x46,
+ 0xB1, 0x0D, 0x4B, 0x63, 0x53, 0xC6, 0x75, 0x17, 0xA7, 0x68, 0x98, 0xA5, 0x8D, 0x44, 0x48, 0x9D,
+ 0x7C, 0xEB, 0x78, 0x05, 0x93, 0x30, 0x6E, 0x17, 0xDF, 0x1C, 0x35, 0xED, 0x6A, 0x7A, 0x52, 0x31,
+ 0x27, 0x2F, 0x82, 0xDD, 0x8D, 0x46, 0x18, 0xCE, 0xFF, 0x13, 0xF6, 0x62, 0x3E, 0xB1, 0xBC, 0xE5,
+ 0xF7, 0x8E, 0xA2, 0x04, 0x22, 0x3D, 0xFC, 0xA7, 0x0D, 0xCE, 0x94, 0x2C, 0x48, 0xA2, 0x78, 0x7F,
+ 0x22, 0xBF, 0x08, 0x69, 0xDE, 0x89, 0x5F, 0x56, 0xE4, 0x88, 0xDB, 0xA1, 0x07, 0xD6, 0x6E, 0xCE,
+ 0x50, 0xF0, 0xEE, 0x31, 0x52, 0x69, 0xD3, 0x85, 0x22, 0x96, 0x91, 0xA4, 0x71, 0xA5, 0xB8, 0x7C,
+ 0x0A, 0x8D, 0x59, 0x1F, 0x48, 0x2A, 0xFA, 0xDC, 0x94, 0x6E, 0x31, 0x92, 0x80, 0x4A, 0x05, 0xE4,
+ 0x00, 0x02, 0x19, 0x23, 0xDD, 0xA6, 0x10, 0x03, 0x6B, 0x3D, 0xC2, 0xAE, 0x3C, 0x84, 0x44, 0x84,
+ 0x9B, 0xC9, 0x7F, 0x6D, 0xA1, 0xBE, 0xE8, 0xE9, 0x8E, 0x43, 0x17, 0x18, 0x85, 0x14, 0x6C, 0x3E,
+ 0xB2, 0xB8, 0x83, 0xFF, 0xA8, 0xE0, 0xF3, 0x9C, 0xA4, 0x74, 0xA2, 0x7D, 0x82, 0x58, 0xAB, 0x0B,
+ 0xD2, 0xC8, 0x07, 0x29, 0x8D, 0x66, 0xCD, 0x86, 0xFC, 0xF0, 0x71, 0x7A, 0x6A, 0xF4, 0xC4, 0xD7,
+ 0xEA, 0x34, 0xB8, 0xF7, 0xCC, 0xF7, 0x8F, 0x27, 0xB1, 0xA7, 0x3D, 0x33, 0xFE, 0x2F, 0xA1, 0x80,
+ 0x59, 0xE9, 0x0A, 0xF5, 0x3B, 0xEB, 0x84, 0x65, 0x36, 0xCC, 0x16, 0x49, 0xD8, 0xCE, 0x64, 0x22,
+ 0x12, 0xDA, 0x04, 0x20, 0x16, 0x85, 0x82, 0xC3, 0x5D, 0x17, 0xE2, 0x01, 0xFB, 0xB9, 0x83, 0x52,
+ 0x52, 0x50, 0x3B, 0x70, 0x07, 0x87, 0xD5, 0x2E, 0xC1, 0x09, 0x06, 0x3B, 0xCD, 0x5A, 0xF8, 0x93,
+ 0xA0, 0xD6, 0x67, 0x72, 0xD3, 0x0A, 0x24, 0xB8, 0x4D, 0x98, 0xE9, 0xB4, 0x3F, 0xDA, 0xB5, 0xA4,
+ 0x32, 0x7D, 0x8B, 0x27, 0xF3, 0xA0, 0x81, 0x73, 0x18, 0x2A, 0xE0, 0x5B, 0x09, 0x5F, 0x0D, 0xE6,
+ 0xE9, 0x30, 0x7F, 0x00, 0x33, 0xE5, 0xE3, 0x2B, 0x05, 0x5D, 0x29, 0x9B, 0xA2, 0x90, 0xEE, 0x09,
+ 0x04, 0x62, 0x07, 0x34, 0x8D, 0x95, 0x00, 0x17, 0x56, 0x88, 0x05, 0xD2, 0x8E, 0x3F, 0x49, 0x74,
+ 0xD7, 0x59, 0x69, 0x93, 0xE2, 0x8C, 0xA1, 0xC9, 0x0D, 0xE7, 0x3B, 0x51, 0xB8, 0xE4, 0xA8, 0x77,
+ 0x58, 0x7A, 0xC2, 0xC7, 0x56, 0x01, 0x0C, 0x0D, 0x5C, 0x1F, 0x00, 0x4D, 0x36, 0x74, 0x2A, 0xA1,
+ 0xD8, 0x00, 0xC2, 0xAC, 0x61, 0xAC, 0xAC, 0xC8, 0xA4, 0x0F, 0xE5, 0x8C, 0xCF, 0x9C, 0x2F, 0x93,
+ 0x1A, 0x4A, 0xD9, 0x96, 0x87, 0x31, 0x42, 0x5C, 0x59, 0x16, 0x89, 0xC4, 0xD5, 0x80, 0x0F, 0xD1,
+ 0x2E, 0x43, 0x4E, 0x8A, 0xEE, 0x55, 0x49, 0x32, 0x14, 0x31, 0xD4, 0x5E, 0x58, 0x4E, 0xE9, 0x9A,
+ 0xE3, 0xC2, 0x7C, 0x0E, 0x62, 0xFF, 0xD4, 0x93, 0xFA, 0xF3, 0x16, 0x7D, 0x35, 0xF8, 0x7A, 0x1D,
+ 0x2E, 0x4C, 0x14, 0xEC, 0xE8, 0xFB, 0x2A, 0x77, 0x1D, 0x78, 0xCB, 0xE0, 0xC8, 0x50, 0xEB, 0x90,
+ 0x87, 0xEE, 0xA4, 0xFC, 0xB4, 0x1B, 0x10, 0x11, 0x45, 0x95, 0x26, 0x4F, 0xCD, 0xDC, 0x3E, 0x16,
+ 0x53, 0xBB, 0x84, 0x5C, 0x97, 0x5D, 0x72, 0xBB, 0x96, 0xD1, 0x72, 0x08, 0x0E, 0xAB, 0xA2, 0x40,
+ 0x61, 0x84, 0x4F, 0x09, 0x1A, 0x53, 0xD8, 0x32, 0xEB, 0x48, 0xEC, 0x72, 0x6E, 0x5D, 0x59, 0x48,
+ 0x69, 0x57, 0xD4, 0x0F, 0xA9, 0xA0, 0x19, 0x4F, 0x3C, 0xBB, 0x5C, 0x97, 0xF4, 0xF1, 0x48, 0x10,
+ 0x4D, 0xC1, 0x74, 0xCB, 0x61, 0x4F, 0xDE, 0x8E, 0x04, 0x28, 0xF2, 0xFC, 0x43, 0xDD, 0x7D, 0x1A,
+ 0x30, 0xA5, 0xED, 0xF8, 0x01, 0x70, 0x73, 0xAE, 0x5F, 0x40, 0xA6, 0x83, 0xF0, 0x59, 0xE2, 0xFB,
+ 0xE3, 0x43, 0xA2, 0x54, 0x7A, 0x9E, 0xE2, 0xED, 0xF1, 0xD4, 0x82, 0x14, 0xB3, 0x89, 0x5A, 0xAE,
+ 0xAB, 0x83, 0x37, 0x73, 0x14, 0xE0, 0x48, 0x37, 0x38, 0xA2, 0x2B, 0x6D, 0x26, 0x9A, 0xD7, 0x40,
+ 0x6E, 0x29, 0xB4, 0x1A, 0xD4, 0x82, 0x07, 0x16, 0xC0, 0x0C, 0xAE, 0x4A, 0xA5, 0xB3, 0x08, 0xBD,
+ 0x3C, 0x78, 0xC9, 0x67, 0x3E, 0x3D, 0x85, 0x38, 0xC4, 0x49, 0x03, 0x1C, 0xE6, 0x92, 0x77, 0x5D,
+ 0xD3, 0xEC, 0x54, 0x7D, 0x18, 0x1F, 0x05, 0xF3, 0xBB, 0x7D, 0xD2, 0xBC, 0xB8, 0x4D, 0xD0, 0x6E,
+ 0xD5, 0x0A, 0x52, 0x4F, 0x7A, 0x29, 0x4A, 0x2C, 0xDC, 0x61, 0x5D, 0x44, 0xEA, 0xD7, 0x89, 0x4D,
+ 0x89, 0xB0, 0x0D, 0x44, 0xC9, 0x4E, 0xCF, 0xD9, 0xE2, 0xFA, 0xC8, 0xA3, 0xB8, 0x2A, 0x2D, 0x3D,
+ 0x26, 0x63, 0x0D, 0xB5, 0x28, 0x2A, 0xA0, 0x2D, 0x2F, 0xC5, 0x7B, 0xE8, 0xC4, 0x59, 0x7C, 0xEA,
+ 0xFC, 0x2E, 0x3F, 0xE1, 0x73, 0xF1, 0x38, 0xA6, 0xC0, 0x3E, 0x78, 0x69, 0xF6, 0x77, 0x64, 0x16,
+ 0x52, 0x3A, 0x0D, 0x1F, 0x33, 0x3E, 0xE6, 0x68, 0x9B, 0x32, 0x5E, 0xD6, 0x04, 0xB1, 0x86, 0x0D,
+ 0x61, 0x44, 0xB9, 0xF4, 0x2F, 0xFC, 0x53, 0x78, 0xFA, 0xB9, 0x2E, 0x37, 0x42, 0x41, 0xC1, 0x2E,
+ 0x3D, 0xBF, 0xA9, 0x2C, 0x6D, 0x49, 0x44, 0x0D, 0x7D, 0x0C, 0xD1, 0x91, 0xFF, 0xE7, 0x02, 0x6C,
+ 0x20, 0xB8, 0xE3, 0xF5, 0xD7, 0x3F, 0x6A, 0x5A, 0xFB, 0xA9, 0x24, 0x38, 0x06, 0x15, 0x22, 0xAE,
+ 0xFA, 0x4C, 0xCD, 0x94, 0xDC, 0x1C, 0x3D, 0x74, 0x15, 0x88, 0x3E, 0xD3, 0x40, 0x8D, 0x5E, 0xA1,
+ 0xD5, 0x4B, 0x25, 0x5F, 0xE6, 0x06, 0x91, 0x69, 0x1A, 0xB9, 0x70, 0x79, 0x0B, 0x67, 0xAD, 0xF9,
+ 0xB8, 0x0E, 0xCC, 0x6F, 0x2A, 0x3A, 0x89, 0x14, 0x48, 0x07, 0x69, 0x43, 0x4E, 0xAA, 0x21, 0xB0,
+ 0x55, 0xDC, 0xC1, 0x9F, 0x36, 0x39, 0x29, 0x36, 0x4B, 0x33, 0x84, 0x35, 0x1D, 0x13, 0xF5, 0x4F,
+ 0x46, 0x65, 0x30, 0xD9, 0xFB, 0xC9, 0x43, 0xAB, 0x54, 0x27, 0x77, 0x4F, 0xC7, 0x70, 0x35, 0x75,
+ 0xBF, 0xF5, 0x69, 0x65, 0x93, 0xB8, 0x27, 0x07, 0x12, 0x6F, 0x34, 0xE5, 0x6F, 0x31, 0x80, 0xD5,
+ 0xCD, 0x0D, 0x26, 0x2E, 0xC7, 0xB3, 0xF4, 0x62, 0x79, 0x5C, 0x20, 0x97, 0xB5, 0x17, 0x46, 0x8A,
+ 0xFE, 0xC4, 0x11, 0xBC, 0x7E, 0x6C, 0xFF, 0xF5, 0x5D, 0x08, 0x9F, 0xE8, 0x5A, 0x6D, 0x79, 0x22,
+ 0x0F, 0xFD, 0x0A, 0xB6, 0x76, 0xC7, 0x28, 0x43, 0x61, 0x74, 0x69, 0x7B, 0x82, 0xCF, 0x3A, 0xB2,
+ 0xC7, 0x56, 0x51, 0x6D, 0xE3, 0x6C, 0x5A, 0x7C, 0x38, 0x52, 0xAF, 0x56, 0x71, 0xBD, 0x1E, 0xB6,
+ 0x4D, 0x77, 0x43, 0xD9, 0x76, 0x9B, 0xF7, 0xD2, 0x5E, 0xD5, 0xAF, 0x39, 0xAA, 0x14, 0x74, 0xAF,
+ 0xB1, 0x15, 0x5C, 0xA9, 0x11, 0x3C, 0x62, 0xA9, 0xA7, 0x92, 0xB6, 0x4F, 0x95, 0xCD, 0x26, 0x1A,
+ 0x75, 0x23, 0x4F, 0x55, 0x29, 0x7E, 0x5E, 0xDC, 0x04, 0x57, 0x70, 0xC4, 0x4D, 0xEB, 0x7F, 0x51,
+ 0xB7, 0x99, 0x0D, 0x20, 0x92, 0xA4, 0xC8, 0x88, 0x7B, 0x6D, 0xB4, 0xC8, 0x1C, 0x19, 0x36, 0xC7,
+ 0xD2, 0xFA, 0xC1, 0x9B, 0x92, 0x16, 0x79, 0xAD, 0x88, 0x9A, 0xCB, 0x31, 0xA4, 0x92, 0xA8, 0xBC,
+ 0xF5, 0x46, 0xE3, 0x71, 0xC4, 0xE8, 0x63, 0xF5, 0x89, 0x68, 0x2A, 0x21, 0x41, 0x46, 0x81, 0x7A,
+ 0x99, 0xAC, 0x04, 0xDD, 0x18, 0x91, 0x4E, 0x3D, 0x02, 0x06, 0x8B, 0x8A, 0x6F, 0x47, 0x3A, 0xA5,
+ 0xD5, 0x75, 0xE0, 0x8E, 0x81, 0xB8, 0x36, 0x3D, 0xA0, 0x35, 0x20, 0x5F, 0x0B, 0x96, 0x8E, 0xD8,
+ 0x1D, 0x56, 0x2F, 0x14, 0x81, 0xE1, 0x40, 0x30, 0x79, 0x84, 0x7D, 0x49, 0x83, 0x71, 0xBA, 0xDC,
+ 0x14, 0x0B, 0x64, 0xFC, 0x52, 0xD8, 0xBE, 0x3F, 0x35, 0x74, 0x4C, 0x64, 0x15, 0x8D, 0x84, 0xF4,
+ 0xB5, 0x9D, 0xF9, 0x14, 0x35, 0xC9, 0x71, 0x69, 0x1C, 0x1A, 0x5D, 0x99, 0xA4, 0x41, 0xFF, 0x3B,
+ 0x98, 0x30, 0x64, 0xCE, 0xF3, 0xB3, 0xA9, 0xF7, 0xF0, 0xAA, 0xB2, 0x73, 0xF2, 0x29, 0x01, 0x95,
+ 0x6C, 0xF8, 0x14, 0x21, 0x1B, 0x6E, 0x58, 0xD4, 0x9E, 0x7A, 0x62, 0x82, 0xB7, 0xD7, 0xB3, 0xEE,
+ 0xEB, 0x3F, 0x3D, 0x3D, 0x52, 0x9F, 0xA9, 0x15, 0x5D, 0xB4, 0xB0, 0x6D, 0x17, 0xC8, 0x5C, 0x5F,
+ 0xF7, 0x55, 0xB1, 0xA9, 0xA5, 0x25, 0xEF, 0x89, 0xE2, 0x7F, 0xBA, 0xAA, 0xDD, 0x40, 0x54, 0x6F,
+ 0x6E, 0x86, 0x27, 0x24, 0x3B, 0x18, 0x49, 0xE6, 0xD3, 0x6B, 0xDD, 0x44, 0xC0, 0x94, 0xB0, 0x1D,
+ 0x32, 0xDE, 0x5B, 0x3E, 0xEA, 0x72, 0xB4, 0x01, 0xA1, 0xE4, 0x58, 0x52, 0x26, 0xD7, 0x6F, 0xC7,
+ 0x86, 0x7A, 0xB7, 0x41, 0xC2, 0xB0, 0x55, 0x55, 0x8F, 0x1F, 0xA2, 0x43, 0x60, 0x2E, 0x5A, 0x53,
+ 0xBF, 0xA8, 0xAC, 0xD6, 0x63, 0xA8, 0x0E, 0x2A, 0xA0, 0x4F, 0x8A, 0xF3, 0xF9, 0xF6, 0x1C, 0xC1,
+ 0x1A, 0x0A, 0x3D, 0x16, 0x2F, 0xF5, 0x8A, 0x6F, 0xEF, 0x41, 0x08, 0xAA, 0x5C, 0xFE, 0xFF, 0x4A,
+ 0xFE, 0x9D, 0x36, 0x1B, 0xDE, 0x4C, 0x36, 0x9E, 0x57, 0x0F, 0x4C, 0xD7, 0xFC, 0x8B, 0x03, 0x7E,
+ 0xFB, 0x59, 0x34, 0xBB, 0x1C, 0x8D, 0xCF, 0x59, 0x9D, 0x4C, 0xA4, 0x26, 0xD3, 0x68, 0x35, 0xCE,
+ 0x80, 0xCD, 0xDB, 0x6D, 0xE0, 0x02, 0x5A, 0xAE, 0x64, 0xD9, 0x9E, 0x44, 0x74, 0x08, 0x71, 0x5E,
+ 0x6D, 0x95, 0x0A, 0x60, 0x75, 0xAA, 0xA7, 0xB5, 0xD7, 0x75, 0x5E, 0xD3, 0x05, 0xA3, 0x50, 0xA1,
+ 0x32, 0x13, 0x8C, 0x29, 0x81, 0x45, 0x7A, 0x38, 0x61, 0xB5, 0xD0, 0x4C, 0xB5, 0x95, 0xD7, 0x92,
+ 0x58, 0x8C, 0xF8, 0x0B, 0x9D, 0x7C, 0x33, 0x35, 0xAE, 0x8E, 0x69, 0x48, 0x0F, 0x03, 0x75, 0x81,
+ 0x78, 0xE8, 0x91, 0x0D, 0xEF, 0x84, 0x91, 0x53, 0xF1, 0xE6, 0xED, 0xC1, 0xD7, 0x1D, 0xD3, 0xE0,
+ 0x73, 0x9E, 0x94, 0xD5, 0x68, 0xE9, 0xBD, 0x13, 0xA6, 0x22, 0x76, 0x19, 0x5F, 0x2D, 0xAC, 0xF9,
+ 0xD6, 0x06, 0x88, 0x1E, 0x5B, 0xA5, 0x00, 0x67, 0x6F, 0x0D, 0xD2, 0xF3, 0x5D, 0x8D, 0x06, 0x90,
+ 0xD1, 0xF7, 0xBE, 0x39, 0x19, 0xD5, 0x9E, 0x60, 0x6B, 0xD4, 0x51, 0xE6, 0x46, 0xB2, 0x96, 0xC4,
+ 0x01, 0xC3, 0xD2, 0xA5, 0x3D, 0xCD, 0x4F, 0x9C, 0xBD, 0x3D, 0xC3, 0x0F, 0x1E, 0x94, 0xA8, 0xFD,
+ 0x26, 0xA9, 0x9C, 0x4C, 0xA4, 0xF8, 0xBC, 0xD8, 0xB1, 0xC7, 0xFE, 0x5F, 0x8B, 0xF2, 0x60, 0x37,
+ 0x6D, 0xF9, 0x62, 0xEF, 0xAE, 0xAD, 0x19, 0x69, 0xAF, 0x20, 0x26, 0x41, 0x60, 0xEC, 0x8D, 0x32,
+ 0x6B, 0x3B, 0xA3, 0xA2, 0x67, 0xB0, 0x6D, 0xA3, 0x48, 0x8A, 0xAA, 0x03, 0xD3, 0xE4, 0xE7, 0x76,
+ 0xA0, 0x8C, 0xBE, 0x53, 0xF3, 0x2E, 0x96, 0x1A, 0xEB, 0x1E, 0x38, 0x47, 0x29, 0x64, 0x8F, 0xDB,
+ 0x15, 0xAA, 0xFF, 0xE6, 0xC0, 0x16, 0x22, 0xD8, 0x95, 0x36, 0x56, 0x28, 0x5B, 0x90, 0x0C, 0x8C,
+ 0xF3, 0x03, 0x01, 0xA3, 0x53, 0x17, 0x62, 0x0C, 0xB6, 0xDC, 0x65, 0xE4, 0x70, 0x49, 0xD2, 0x76,
+ 0x85, 0x47, 0x90, 0x8B, 0x84, 0xF4, 0x00, 0x13, 0x0A, 0xB6, 0x3F, 0xF4, 0x3E, 0x67, 0x1A, 0x11,
+ 0xFF, 0xA5, 0x28, 0x0F, 0x1E, 0x0C, 0xD5, 0xE9, 0x99, 0x3E, 0x09, 0xB5, 0x0B, 0x87, 0x9B, 0xF1,
+ 0xB2, 0x8D, 0xFD, 0x24, 0x95, 0x43, 0x52, 0x1D, 0x38, 0xA7, 0x1B, 0x98, 0x38, 0xEC, 0x68, 0x7C,
+ 0x69, 0x45, 0x17, 0x21, 0x63, 0x85, 0x16, 0xF8, 0xCE, 0x10, 0xA4, 0xE1, 0xCE, 0xD8, 0x1A, 0x82,
+ 0x6E, 0xC7, 0x06, 0xD4, 0xB0, 0x58, 0x09, 0x22, 0x95, 0x84, 0x0E, 0xD6, 0x2E, 0x06, 0x74, 0x07,
+ 0x5D, 0x01, 0x8B, 0x88, 0x8D, 0x66, 0xF4, 0x0D, 0x36, 0x52, 0x41, 0xCD, 0xE6, 0x17, 0xBF, 0xF2,
+ 0x37, 0x50, 0x68, 0x3A, 0x5C, 0x7D, 0x4F, 0xD5, 0xE0, 0xE7, 0xB3, 0x24, 0xD3, 0x2A, 0x07, 0x18,
+ 0x9F, 0x53, 0x8D, 0x52, 0xD6, 0x98, 0x26, 0x30, 0xA5, 0x43, 0x04, 0x7C, 0xB1, 0xF3, 0x93, 0xE2,
+ 0xE6, 0x21, 0x1B, 0x94, 0xDA, 0xEE, 0x29, 0xB1, 0xDB, 0x07, 0x3D, 0x9F, 0x9B, 0x14, 0x8F, 0x4E,
+ 0x9D, 0xCB, 0xCE, 0xA9, 0x5C, 0x60, 0xB1, 0xC0, 0x4C, 0xB7, 0x89, 0xBA, 0xD2, 0x14, 0xEE, 0x94,
+ 0xBC, 0xD4, 0x5D, 0x90, 0x3B, 0xC6, 0xC5, 0x7C, 0xCB, 0x13, 0xB9, 0xDE, 0xA0, 0x06, 0x37, 0x94,
+ 0x73, 0xBC, 0xC8, 0xA0, 0xDB, 0xE3, 0x51, 0xD3, 0x36, 0xB5, 0x4E, 0x4F, 0xA0, 0xB0, 0x74, 0x38,
+ 0x76, 0xBC, 0x8A, 0x98, 0x4B, 0xFA, 0x00, 0x4F, 0x89, 0xA5, 0x59, 0x92, 0xC4, 0xAD, 0x35, 0x67,
+ 0x68, 0xE5, 0x7D, 0xDD, 0x5E, 0x1C, 0x50, 0x35, 0x4E, 0xE1, 0xEB, 0x9C, 0x1A, 0xD2, 0x4C, 0x98,
+ 0x25, 0x2A, 0x43, 0x7E, 0x7C, 0x64, 0x45, 0x1B, 0x19, 0x97, 0xDE, 0xD0, 0xCB, 0x24, 0x5C, 0x40,
+ 0x95, 0x46, 0x0A, 0xEC, 0x14, 0x59, 0x55, 0x10, 0x12, 0x23, 0x1C, 0xF9, 0x9E, 0xB5, 0xEF, 0xEA,
+ 0x6E, 0xE4, 0x6B, 0xF7, 0xDD, 0x95, 0xD2, 0x8F, 0x96, 0xBA, 0xDA, 0x04, 0x87, 0x47, 0x5B, 0x2A,
+ 0xB6, 0x71, 0x2C, 0xE3, 0xCA, 0xC6, 0x94, 0xC0, 0xA0, 0xB8, 0x17, 0x78, 0x0A, 0xFE, 0xB9, 0x1E,
+ 0xB3, 0xCB, 0x21, 0x7E, 0x90, 0x01, 0xB2, 0xBD, 0xEE, 0x81, 0xD0, 0x05, 0xDE, 0xC2, 0xFB, 0x6E,
+ 0x94, 0xDC, 0x22, 0xA0, 0x0F, 0x8A, 0xD5, 0xB5, 0x56, 0xA5, 0xB4, 0x39, 0xCD, 0x1E, 0xDB, 0x5A,
+ 0xF2, 0x92, 0xA8, 0x7B, 0x1F, 0xDC, 0x44, 0xE7, 0xFF, 0xE3, 0x59, 0x69, 0x2D, 0x5E, 0x45, 0x53,
+ 0x99, 0xB6, 0xC2, 0x15, 0x21, 0x65, 0x32, 0x43, 0xFC, 0xAD, 0x6D, 0x91, 0xC9, 0x09, 0x82, 0x6B,
+ 0x2C, 0xA8, 0x0A, 0xE8, 0x4A, 0xD7, 0x19, 0x06, 0x53, 0x9A, 0x00, 0x0A, 0x9E, 0x25, 0xA6, 0x6E,
+ 0xE0, 0x98, 0xC2, 0xC9, 0xD4, 0x98, 0x32, 0xE4, 0xEE, 0x37, 0x5D, 0x1F, 0x10, 0x22, 0xCD, 0x91,
+ 0xBD, 0x7B, 0xDA, 0x27, 0xB5, 0x06, 0x5A, 0x9E, 0x27, 0x6C, 0xBA, 0x53, 0x20, 0x13, 0xA3, 0x2E,
+ 0xAC, 0x05, 0x9A, 0x3C, 0xD1, 0xEB, 0xA2, 0xE8, 0x7F, 0x4E, 0xB0, 0xE6, 0x5A, 0x73, 0x6B, 0x5D,
+ 0x37, 0x80, 0x66, 0xD3, 0x50, 0x21, 0xA6, 0x9E, 0x43, 0x15, 0x15, 0x77, 0xC7, 0x0B, 0x30, 0x16,
+ 0xB6, 0x8D, 0x38, 0x93, 0x53, 0xF5, 0x68, 0xF4, 0x34, 0x07, 0xD1, 0xBD, 0x10, 0xDE, 0xDD, 0x4E,
+ 0x87, 0x32, 0xB6, 0xB4, 0x37, 0xD1, 0xBB, 0x8A, 0xD2, 0x4B, 0xBF, 0x04, 0x73, 0x3A, 0x36, 0x5C,
+ 0x87, 0xF7, 0x0B, 0x41, 0x11, 0xF6, 0x27, 0x2C, 0xB6, 0xC2, 0x8B, 0xBE, 0x6E, 0x5D, 0x17, 0xA6,
+ 0xEC, 0x74, 0xDF, 0xE4, 0x88, 0xDD, 0x9E, 0xEF, 0xFD, 0x2B, 0x25, 0xD9, 0x3B, 0x42, 0xB1, 0x2F,
+ 0x21, 0xE4, 0x29, 0xC8, 0x69, 0x48, 0xC8, 0xB8, 0xB3, 0x8C, 0x2B, 0x4F, 0x31, 0xB9, 0x0C, 0xB2,
+ 0xE1, 0xE9, 0xE1, 0xF4, 0x7C, 0xE9, 0x78, 0x1F, 0xFF, 0xB7, 0x6D, 0xF9, 0x01, 0xF5, 0xDA, 0xCB,
+ 0x37, 0x20, 0xAE, 0x29, 0xED, 0xC7, 0x93, 0x25, 0xB7, 0x10, 0x47, 0x1E, 0x07, 0x8A, 0x82, 0xDC,
+ 0xB9, 0x93, 0x39, 0xA0, 0xD8, 0x24, 0x5F, 0xA2, 0x8C, 0xE5, 0xB0, 0xAC, 0x8C, 0x63, 0x09, 0x50,
+ 0x49, 0x04, 0x27, 0xD5, 0x2B, 0xA5, 0xA1, 0x8C, 0x86, 0x8B, 0x3D, 0x19, 0xC6, 0x39, 0x88, 0xB8,
+ 0xB4, 0x2B, 0x4C, 0x5D, 0x6B, 0x9C, 0x36, 0xA6, 0x7A, 0x1A, 0xA7, 0x71, 0xE8, 0x97, 0x78, 0x1C,
+ 0x03, 0xDA, 0x0D, 0xA3, 0xE9, 0xF6, 0x5F, 0x63, 0x2E, 0x9B, 0x6C, 0x86, 0xB9, 0x7C, 0x3D, 0xD2,
+ 0xC9, 0x90, 0xCA, 0x5F, 0x48, 0x5E, 0x1C, 0x11, 0x88, 0xCA, 0xBF, 0x79, 0xB5, 0xBF, 0x2D, 0xED,
+ 0xFE, 0x4D, 0xC6, 0x2C, 0xFB, 0x8E, 0x0E, 0x42, 0x53, 0x8C, 0xB2, 0x07, 0x92, 0xFF, 0xEC, 0x6B,
+ 0xAA, 0xC5, 0xAE, 0x25, 0x09, 0xEA, 0xBB, 0x82, 0x5E, 0x86, 0x63, 0xD2, 0xF5, 0x59, 0x8F, 0x26,
+ 0xF5, 0x98, 0x17, 0xE4, 0x6A, 0x89, 0x28, 0x2B, 0xF5, 0x8A, 0x5E, 0x96, 0x1C, 0x8D, 0xBE, 0x30,
+ 0x47, 0xE6, 0x75, 0x84, 0x79, 0xFE, 0xF1, 0x35, 0xDD, 0x70, 0x7E, 0xCA, 0xC9, 0x1F, 0xD8, 0x03,
+ 0x26, 0xEA, 0x48, 0x39, 0x68, 0xFF, 0x34, 0x8B, 0x58, 0xC6, 0x7C, 0x68, 0x54, 0x1A, 0x03, 0x17,
+ 0x55, 0x23, 0xF9, 0xA8, 0x66, 0x04, 0x6A, 0xB4, 0x3C, 0xA9, 0xDB, 0x46, 0x5C, 0x48, 0xEB, 0xB2,
+ 0x0D, 0x74, 0x67, 0x30, 0xD6, 0x2D, 0xFF, 0x30, 0x6D, 0xB5, 0x66, 0x66, 0x7C, 0xE2, 0x8B, 0xB0,
+ 0xB6, 0x08, 0xFE, 0x2F, 0x05, 0xC4, 0x26, 0x33, 0x1F, 0x40, 0xC3, 0x07, 0x04, 0xAE, 0xFC, 0xC1,
+ 0x23, 0xE5, 0x31, 0xEA, 0x16, 0x63, 0xB5, 0x9C, 0xD8, 0x2D, 0xC1, 0xCE, 0x46, 0xBC, 0x4C, 0x88,
+ 0x7C, 0xBC, 0x86, 0xC5, 0x89, 0x69, 0x93, 0x13, 0x97, 0x0C, 0x05, 0xF3, 0x7C, 0x9D, 0x23, 0xC2,
+ 0x81, 0x2C, 0xB9, 0x98, 0x05, 0x3D, 0x1B, 0x67, 0xDA, 0x50, 0x04, 0xD4, 0x79, 0x8A, 0x97, 0x63,
+ 0xE5, 0xAF, 0xA4, 0xFD, 0x3D, 0x4D, 0x17, 0x3D, 0x8B, 0x9C, 0xA8, 0xEF, 0xA1, 0x42, 0x62, 0xFE,
+ 0xD0, 0xD3, 0x86, 0xBE, 0x8D, 0xCB, 0x54, 0x02, 0xCD, 0x4D, 0xBF, 0xA9, 0xC2, 0x74, 0xBC, 0x4C,
+ 0x82, 0x5A, 0x0A, 0xF9, 0xC6, 0x6C, 0xD1, 0x59, 0x2B, 0x8F, 0xED, 0x51, 0xAF, 0xA6, 0x17, 0x4A,
+ 0xBB, 0xBD, 0xE4, 0x1B, 0xA2, 0x40, 0xC9, 0xAB, 0x7F, 0xE0, 0x59, 0x19, 0x98, 0xCE, 0x84, 0x51,
+ 0x35, 0x3F, 0x49, 0x0E, 0x9F, 0x13, 0xD3, 0x43, 0xAF, 0x98, 0xD7, 0x8A, 0x8E, 0x2E, 0x88, 0x02,
+ 0x4C, 0x17, 0x08, 0x9F, 0xFD, 0x4C, 0xF7, 0x9F, 0x38, 0x74, 0x4E, 0x39, 0xCF, 0x93, 0xC3, 0x0A,
+ 0xB2, 0x9B, 0xBF, 0xE4, 0xAE, 0xA5, 0x6D, 0x7F, 0x1A, 0x62, 0x16, 0x05, 0x9C, 0x10, 0xF4, 0x81,
+ 0x6F, 0xA7, 0xDF, 0xE8, 0x95, 0xC8, 0x88, 0x8A, 0x11, 0xEB, 0x56, 0xC6, 0x27, 0xE0, 0x92, 0x45,
+ 0x87, 0x6F, 0x63, 0x11, 0x1B, 0x5C, 0xD8, 0x4E, 0x13, 0xAA, 0xB5, 0x04, 0x15, 0xCD, 0xF6, 0x66,
+ 0x1C, 0x7C, 0x62, 0x3A, 0x6F, 0x73, 0xCF, 0x8B, 0xAB, 0x3A, 0x42, 0x5E, 0x1F, 0x58, 0x3E, 0xF2,
+ 0x4C, 0xAF, 0xCB, 0x7A, 0x0E, 0x0C, 0xAB, 0xED, 0x04, 0xF6, 0xC2, 0x91, 0xAC, 0x8D, 0x30, 0xF1,
+ 0x2A, 0x43, 0x53, 0x02, 0x5C, 0xF5, 0x92, 0x21, 0x50, 0x56, 0x2E, 0x38, 0x7C, 0x6E, 0x48, 0xDE,
+ 0x81, 0x0E, 0x41, 0x3B, 0xA0, 0x74, 0xFC, 0x63, 0xC3, 0x3D, 0x8E, 0xC9, 0x28, 0xA2, 0xA0, 0x57,
+ 0x4A, 0xDC, 0xB5, 0xAA, 0x1E, 0x86, 0xA2, 0x6C, 0x55, 0xF7, 0xC9, 0x1F, 0x28, 0x6B, 0xB5, 0xD6,
+ 0x98, 0x25, 0x32, 0xE0, 0xA5, 0x29, 0xC8, 0xA6, 0xFE, 0x95, 0xC0, 0xA5, 0xFE, 0x82, 0x32, 0xD5,
+ 0xC0, 0xFE, 0x63, 0x37, 0xBD, 0x57, 0x42, 0x53, 0xF6, 0xF9, 0x6A, 0x2C, 0x88, 0x71, 0xDC, 0xB5,
+ 0x28, 0xF0, 0x18, 0x7E, 0x45, 0xF0, 0xB2, 0x19, 0x15, 0x1C, 0x2D, 0x1A, 0xD2, 0xF4, 0xAD, 0xDB,
+ 0xAF, 0x23, 0x07, 0xA1, 0x3F, 0xDE, 0x97, 0xA5, 0x1A, 0xD2, 0x7E, 0x61, 0x8D, 0x23, 0x49, 0xC6,
+ 0x22, 0x0E, 0xE0, 0xD9, 0x40, 0xC5, 0xE2, 0xD7, 0x0C, 0xDC, 0xD1, 0x50, 0x45, 0xC3, 0x74, 0x64,
+ 0xD4, 0xCC, 0x11, 0xEC, 0x1F, 0x5E, 0x7E, 0x67, 0x76, 0x73, 0x3E, 0x55, 0x43, 0x44, 0x31, 0x1B,
+ 0xBD, 0xF3, 0xA9, 0x7C, 0x72, 0xCE, 0x83, 0x2E, 0x5D, 0x2B, 0xF6, 0x2C, 0xA5, 0xB2, 0xC6, 0xB1,
+ 0x71, 0x1E, 0xEA, 0x33, 0xF1, 0x83, 0x2A, 0x21, 0x65, 0x13, 0xFE, 0xA0, 0x21, 0xB7, 0x44, 0x07,
+ 0x04, 0xF1, 0x46, 0x1D, 0xEF, 0x71, 0x80, 0x27, 0x42, 0x5F, 0x90, 0x55, 0x54, 0x84, 0x60, 0x37,
+ 0xCF, 0xFB, 0xFA, 0x36, 0x4D, 0x92, 0x63, 0x82, 0x3D, 0xE8, 0xC2, 0x09, 0xE7, 0xBE, 0xC3, 0x7D,
+ 0x4C, 0x17, 0xF1, 0x5C, 0x0F, 0xB6, 0x57, 0x25, 0x5D, 0xC0, 0x0C, 0x63, 0xE1, 0xF2, 0x9F, 0x69,
+ 0xD6, 0x35, 0x73, 0xDC, 0xB3, 0x1D, 0xDA, 0x72, 0x5E, 0xB7, 0x12, 0x3B, 0x43, 0xF7, 0xB4, 0xCC,
+ 0x48, 0xAC, 0xE2, 0xB3, 0xFB, 0x15, 0x91, 0x03, 0xFB, 0xDF, 0x2A, 0x4D, 0x70, 0x88, 0x75, 0x02,
+ 0x18, 0x53, 0xF9, 0x9F, 0xC1, 0x9C, 0x0C, 0x5B, 0x5A, 0x59, 0x1B, 0x5F, 0x4A, 0xE5, 0x39, 0x20,
+ 0xAD, 0x28, 0xC7, 0x80, 0x77, 0x13, 0x8E, 0x61, 0xBD, 0xE8, 0x80, 0x37, 0x41, 0x6E, 0xE7, 0x75,
+ 0xCA, 0x41, 0xC6, 0xA9, 0xCC, 0x1C, 0xAF, 0xFF, 0x97, 0xCC, 0xFE, 0xF2, 0xED, 0x85, 0xD8, 0xB1,
+ 0x4F, 0xF3, 0x7A, 0xE7, 0xF9, 0x18, 0x41, 0xD7, 0x49, 0xA2, 0x1B, 0xBC, 0xE2, 0x89, 0x93, 0x54,
+ 0x5A, 0xF1, 0x5E, 0xA3, 0x66, 0x51, 0x8C, 0x66, 0x7A, 0xF7, 0x44, 0xD7, 0xFD, 0x90, 0xF1, 0xEE,
+ 0x3E, 0xF6, 0x0E, 0xA5, 0xE9, 0xDB, 0xD0, 0xDB, 0x58, 0xA7, 0x45, 0xA9, 0x34, 0xD8, 0x44, 0xA3,
+ 0x65, 0x29, 0xCB, 0x61, 0x8E, 0xAD, 0x7F, 0x95, 0xBA, 0x71, 0xFB, 0xB6, 0x93, 0x5F, 0x6F, 0xFC,
+ 0xC1, 0xAA, 0xE6, 0x9F, 0x73, 0x55, 0x69, 0xE7, 0x35, 0x12, 0xCA, 0x26, 0x56, 0x39, 0x79, 0xFB,
+ 0xAB, 0x53, 0x00, 0xF0, 0x8F, 0x72, 0xBF, 0x2D, 0x30, 0x05, 0x67, 0x65, 0x4B, 0xD3, 0x6A, 0xF7,
+ 0x8B, 0x79, 0x41, 0xFA, 0x89, 0x2A, 0xDB, 0x0C, 0xA1, 0x10, 0xFC, 0x3A, 0x12, 0x63, 0x55, 0xB0,
+ 0x3A, 0xB5, 0x30, 0xDB, 0x08, 0x76, 0xAF, 0xF6, 0x1A, 0xD9, 0xAE, 0x51, 0x81, 0xE3, 0x84, 0x90,
+ 0x70, 0x2C, 0x1B, 0xA7, 0x75, 0xA3, 0x44, 0xD2, 0x9B, 0x71, 0x7C, 0x39, 0x0E, 0x1E, 0x32, 0x7D,
+ 0x6B, 0x40, 0x90, 0xEE, 0xEF, 0x85, 0xB3, 0x21, 0x86, 0x2B, 0xE7, 0x53, 0x70, 0x7B, 0xB4, 0xE2,
+ 0x2D, 0xBE, 0x1F, 0x61, 0xEA, 0x7D, 0x31, 0x4E, 0x07, 0xB6, 0xD3, 0x20, 0x82, 0x2F, 0x7E, 0xEA,
+ 0x63, 0x8E, 0x31, 0xD8, 0xCE, 0x3C, 0x50, 0x58, 0x58, 0x99, 0x3D, 0x77, 0x18, 0x6C, 0xF6, 0x64,
+ 0xB2, 0xB8, 0xBF, 0x39, 0xE0, 0x2C, 0x47, 0xAF, 0xBC, 0xDF, 0xC9, 0xE3, 0x4A, 0x92, 0xB3, 0xAB,
+ 0x28, 0x4C, 0x07, 0x32, 0x53, 0xDC, 0x33, 0x25, 0xC8, 0xD6, 0xAC, 0xE9, 0xFF, 0x17, 0xF1, 0x63,
+ 0xD6, 0x03, 0x6A, 0x81, 0xEE, 0x3F, 0xDA, 0xAE, 0xD1, 0x5D, 0xAD, 0x92, 0x51, 0x99, 0xA8, 0x5C,
+ 0xDA, 0x47, 0x3A, 0xDB, 0x94, 0x9D, 0x89, 0xA2, 0x24, 0x88, 0xB0, 0xBB, 0x22, 0x46, 0x8F, 0x03,
+ 0xB0, 0x9C, 0xB9, 0xDE, 0xD6, 0xCA, 0xEA, 0xDE, 0x6B, 0x97, 0xA9, 0xB0, 0xB3, 0xDB, 0xA6, 0x5E,
+ 0xAD, 0xEC, 0x12, 0x23, 0x04, 0x4D, 0x7B, 0xF2, 0x7C, 0x0A, 0xE2, 0xB3, 0xA0, 0x81, 0x58, 0x8F,
+ 0xC0, 0xA6, 0xE9, 0xDF, 0x7F, 0xA7, 0x89, 0x6E, 0x2D, 0x68, 0x23, 0xF1, 0x29, 0xB7, 0xD7, 0xDC,
+ 0x63, 0x4A, 0xCB, 0x83, 0x24, 0xC0, 0xE4, 0x54, 0x5C, 0x67, 0x12, 0xB3, 0xFB, 0x6A, 0x1E, 0x37,
+ 0xE0, 0xBE, 0x85, 0xDA, 0x7C, 0xB4, 0x8B, 0xEC, 0xE8, 0xBB, 0x08, 0x84, 0xD9, 0x90, 0x4B, 0x56,
+ 0xFA, 0x2F, 0xA2, 0x36, 0xC8, 0x97, 0xFC, 0x3E, 0xC0, 0x9C, 0x28, 0x5D, 0xFD, 0x54, 0xD8, 0x53,
+ 0x7D, 0x41, 0x4F, 0x15, 0x09, 0xA6, 0x3F, 0xAF, 0x13, 0x31, 0xE6, 0xE8, 0x45, 0x8C, 0x64, 0xFC,
+ 0xF6, 0x53, 0x1C, 0x2B, 0x25, 0xDF, 0x15, 0x93, 0x06, 0xE1, 0x32, 0x45, 0x9A, 0x29, 0x6B, 0xD5,
+ 0x11, 0x27, 0xA7, 0x2E, 0x98, 0xA8, 0x30, 0xD7, 0x93, 0x37, 0xDE, 0xFE, 0xC2, 0xE7, 0xC0, 0xAE,
+ 0x5E, 0x26, 0x04, 0xA4, 0x57, 0x7A, 0x3F, 0xD7, 0x0E, 0xB6, 0x27, 0xE1, 0xCF, 0xBA, 0x27, 0xC3,
+ 0x84, 0xFE, 0xD5, 0x4A, 0x87, 0xF0, 0xB5, 0x1C, 0x44, 0x3E, 0x17, 0xC9, 0x99, 0x8F, 0x85, 0xE6,
+ 0xDA, 0x41, 0x94, 0xAB, 0x71, 0xC9, 0x0B, 0x9E, 0xA8, 0xF0, 0x5A, 0x01, 0x14, 0x8E, 0x15, 0x05,
+ 0xB7, 0xE0, 0x90, 0xDD, 0x33, 0x9E, 0x82, 0x3B, 0x14, 0x57, 0xBD, 0xD1, 0xC7, 0xC1, 0x6D, 0xDE,
+ 0x3F, 0x4B, 0x4E, 0xD6, 0xF4, 0x49, 0xED, 0xAF, 0x6C, 0x6C, 0xE3, 0x51, 0x0E, 0xDF, 0x15, 0xAF,
+ 0xCD, 0x7F, 0xBF, 0x64, 0xF4, 0x66, 0x0F, 0x25, 0x86, 0xDA, 0xEF, 0xDF, 0xBB, 0x75, 0x92, 0xAD,
+ 0x70, 0x42, 0x1E, 0xC7, 0x23, 0x2C, 0xC1, 0x49, 0x4B, 0x9B, 0xAC, 0x7C, 0x3C, 0x7D, 0xFA, 0xA2,
+ 0x80, 0xCC, 0x0E, 0xDC, 0xD2, 0xAD, 0xDA, 0xBD, 0xF2, 0xFB, 0xAD, 0xCA, 0x96, 0x68, 0x19, 0xAE,
+ 0x7E, 0xDB, 0x43, 0xF3, 0xEF, 0x52, 0x3F, 0x95, 0x3E, 0x5C, 0x9A, 0x9E, 0x54, 0x8F, 0x47, 0x27,
+ 0xEC, 0xC1, 0xBF, 0x31, 0x7A, 0xDB, 0x6B, 0xBE, 0x40, 0x98, 0x8A, 0x33, 0xD8, 0x42, 0x97, 0x0C,
+ 0x51, 0x3B, 0xD7, 0xB1, 0x95, 0xF8, 0xEF, 0x3B, 0xC8, 0xD8, 0x4C, 0x94, 0x0D, 0xDE, 0xC4, 0x09,
+ 0x77, 0x52, 0x6E, 0xF2, 0xEF, 0x50, 0x9A, 0x83, 0x48, 0x6D, 0x69, 0x91, 0x33, 0x1A, 0x56, 0x98,
+ 0xC0, 0x12, 0x86, 0xA8, 0xE3, 0xDE, 0x2E, 0xE9, 0x43, 0xB3, 0x7A, 0x71, 0x40, 0xFA, 0x34, 0xF7,
+ 0xA6, 0xC3, 0x2F, 0xBB, 0x16, 0x6B, 0x91, 0x01, 0x58, 0xB0, 0x8D, 0x7A, 0x54, 0x62, 0x59, 0x3E,
+ 0xC3, 0x2F, 0x3D, 0x48, 0xFB, 0x6C, 0x85, 0xD3, 0xD7, 0xB0, 0xFD, 0x4E, 0xCA, 0x3A, 0xEE, 0x37,
+ 0xFF, 0xA1, 0xA8, 0xB0, 0x8F, 0xF8, 0x3F, 0xC7, 0x88, 0x07, 0x30, 0x1C, 0x81, 0x56, 0x63, 0xC2,
+ 0x97, 0x05, 0x8C, 0x7A, 0x01, 0xBF, 0x14, 0x50, 0xA7, 0x87, 0x9A, 0x86, 0x79, 0x59, 0x45, 0x0F,
+ 0x78, 0xD4, 0x0D, 0x1E, 0x3B, 0xE0, 0xF1, 0x14, 0x11, 0x55, 0x04, 0xE8, 0x10, 0x34, 0xDC, 0xF8,
+ 0x3C, 0x12, 0xC5, 0x93, 0x64, 0x47, 0x70, 0x84, 0x89, 0x5F, 0xAF, 0xC3, 0x6B, 0xB2, 0x89, 0xAE,
+ 0xED, 0xF6, 0x6A, 0x55, 0xC5, 0x50, 0xC5, 0xDE, 0x02, 0x70, 0xF9, 0x03, 0x67, 0xA4, 0x82, 0xDE,
+ 0x0D, 0x38, 0x18, 0xDF, 0x5D, 0x24, 0x8D, 0x00, 0x8A, 0xF5, 0xA3, 0x01, 0xC6, 0xE3, 0xA6, 0x17,
+ 0x16, 0xB9, 0xA1, 0x8E, 0x9C, 0x08, 0x9B, 0x2A, 0x20, 0x22, 0x69, 0x50, 0x91, 0x10, 0x98, 0x2C,
+ 0x19, 0x94, 0xE6, 0xE9, 0x2C, 0x0F, 0xDD, 0x0A, 0x5A, 0xF8, 0xAD, 0xE5, 0xBE, 0x65, 0x3C, 0xD3,
+ 0x75, 0x1C, 0x75, 0x77, 0xC2, 0xF7, 0x23, 0x7E, 0x6E, 0x62, 0xAF, 0xD2, 0x5F, 0x00, 0xFC, 0xD0,
+ 0xF9, 0xF1, 0xCF, 0x7E, 0x11, 0xE6, 0xF5, 0x7E, 0xC0, 0x46, 0xCA, 0xEF, 0x1C, 0x5F, 0x62, 0x2F,
+ 0x6D, 0xF9, 0xF4, 0x88, 0x64, 0xD2, 0xE0, 0x1F, 0x04, 0x33, 0xB9, 0xBA, 0x99, 0xC9, 0x9E, 0xD9,
+ 0x48, 0x11, 0x6B, 0x2C, 0x35, 0x79, 0x36, 0x40, 0xDF, 0xB8, 0x3C, 0x2F, 0xAA, 0x35, 0x91, 0x43,
+ 0xD2, 0x23, 0x8F, 0x1E, 0x24, 0x4E, 0x29, 0xA8, 0x9F, 0x3F, 0xF9, 0xF4, 0x5E, 0xAC, 0xBF, 0x39,
+ 0xE2, 0x7F, 0x12, 0x4C, 0x95, 0xBC, 0xCE, 0x61, 0xF3, 0xEF, 0xD0, 0x30, 0x60, 0x6B, 0xFD, 0xD6,
+ 0xF8, 0x15, 0x25, 0x56, 0x57, 0xC2, 0xF5, 0x84, 0xE4, 0xDF, 0xE8, 0x28, 0xBF, 0x81, 0x98, 0x5D,
+ 0xFA, 0x28, 0x66, 0xF5, 0xD5, 0x43, 0x71, 0x17, 0xBF, 0x19, 0xA2, 0x5F, 0xB6, 0xDB, 0x14, 0x93,
+ 0xBC, 0x30, 0xC4, 0x3E, 0x11, 0x01, 0xC5, 0x04, 0x30, 0x90, 0xBE, 0xA5, 0x85, 0xC4, 0x1B, 0xAD,
+ 0x68, 0xCA, 0xBB, 0x7B, 0x8B, 0x45, 0x29, 0xF4, 0xA3, 0xCE, 0x72, 0x36, 0x79, 0x1B, 0xE6, 0x4D,
+ 0xD7, 0x52, 0xBA, 0xD7, 0x2E, 0x61, 0x97, 0xDB, 0x5B, 0xA5, 0x47, 0x1F, 0x6F, 0xE0, 0x29, 0x25,
+ 0xBC, 0xA1, 0xCF, 0x17, 0xC5, 0x32, 0xAA, 0x2B, 0xB2, 0x52, 0x89, 0x32, 0xCB, 0xFB, 0x1A, 0xCE,
+ 0x4A, 0x2B, 0x98, 0x7F, 0xB5, 0x9B, 0x72, 0x42, 0x08, 0xB4, 0x52, 0x83, 0xB5, 0x98, 0x9D, 0xA0,
+ 0x04, 0x50, 0x3B, 0xFD, 0x4B, 0x18, 0xAF, 0x9D, 0xE0, 0x70, 0xE7, 0x0B, 0x84, 0x09, 0x93, 0x51,
+ 0x35, 0xE1, 0xC0, 0xB2, 0xD3, 0xE1, 0x66, 0x17, 0xB1, 0xDC, 0xE4, 0x1D, 0xBF, 0xE6, 0x76, 0x53,
+ 0x1B, 0x05, 0xB2, 0x47, 0x02, 0x0B, 0xAB, 0x70, 0x52, 0x1B, 0x1C, 0x5B, 0xAF, 0x84, 0x0F, 0x12,
+ 0xCD, 0xB9, 0x3F, 0xB9, 0x15, 0xC6, 0x56, 0xBB, 0xD7, 0x80, 0xBB, 0x94, 0xFB, 0xFB, 0x7C, 0xB9,
+ 0xCF, 0xBC, 0x0E, 0xCB, 0xA8, 0x7E, 0x4A, 0xF3, 0xBA, 0x73, 0xCD, 0x9E, 0x14, 0x0D, 0x12, 0x17,
+ 0x91, 0xF6, 0xF4, 0x9D, 0x14, 0x13, 0x91, 0x8E, 0x6D, 0x62, 0xF3, 0x27, 0xA1, 0x01, 0x85, 0xD2,
+ 0x7A, 0xF5, 0x60, 0x13, 0xEE, 0xDC, 0x75, 0xF9, 0xFF, 0x23, 0x2D, 0xFE, 0xE7, 0x69, 0x40, 0x8B,
+ 0x0A, 0xA8, 0xFF, 0x86, 0x2A, 0x6D, 0x0D, 0xD3, 0x9D, 0x14, 0xA3, 0xDF, 0xB8, 0x1C, 0x44, 0xE9,
+ 0x7E, 0x9D, 0x73, 0x6B, 0x0C, 0xF2, 0x0F, 0x45, 0xA5, 0xCF, 0x46, 0xDA, 0xDC, 0xF6, 0x24, 0xC6,
+ 0x72, 0xD0, 0x91, 0x6E, 0x38, 0x76, 0x1F, 0xA7, 0xF9, 0x8F, 0x9A, 0xFC, 0x16, 0x1E, 0xF7, 0x6A,
+ 0x82, 0x49, 0x1C, 0xC0, 0xDE, 0x8A, 0xDA, 0x62, 0x86, 0x06, 0x6C, 0xF6, 0x8E, 0xA3, 0xE1, 0x65,
+ 0x32, 0x7B, 0x65, 0x00, 0x99, 0xEA, 0xAF, 0x86, 0x03, 0xDE, 0xCE, 0xF9, 0xE6, 0xAE, 0x16, 0x2D,
+ 0x9D, 0x90, 0xB4, 0x63, 0x96, 0xA6, 0x7E, 0xEE, 0x06, 0xE7, 0x69, 0x84, 0x40, 0xDE, 0x94, 0x20,
+ 0x7C, 0xCF, 0x37, 0x21, 0x6E, 0x3D, 0xB0, 0xED, 0x9C, 0x9E, 0xAE, 0x56, 0x5D, 0xD7, 0x54, 0x51,
+ 0x80, 0xA7, 0xCB, 0xB8, 0xC2, 0x02, 0x45, 0xF3, 0x5B, 0x15, 0xA6, 0xEC, 0x5A, 0x10, 0xB2, 0xCC,
+ 0xC6, 0x4D, 0xCD, 0xE5, 0xF5, 0xB5, 0x86, 0xC3, 0x73, 0x00, 0xDB, 0x5B, 0xE7, 0x0E, 0xF8, 0x51,
+ 0x05, 0x4B, 0x93, 0xB3, 0xD0, 0x78, 0x12, 0x1E, 0x86, 0xCD, 0xBB, 0xE4, 0x80, 0xF7, 0x72, 0xF5,
+ 0xC7, 0x95, 0xF5, 0x62, 0xFA, 0x27, 0x9B, 0x9A, 0x24, 0xDD, 0x7E, 0xE3, 0xCE, 0x7C, 0x96, 0x13,
+ 0x29, 0xD2, 0xCD, 0xB5, 0x31, 0xD8, 0x8D, 0xE9, 0x8D, 0x12, 0xD5, 0x49, 0x76, 0xFD, 0xCC, 0xCC,
+ 0x8B, 0x30, 0x6D, 0x7D, 0x33, 0xC1, 0x0B, 0x0B, 0xC8, 0xD3, 0xA2, 0x3A, 0x98, 0xAB, 0x20, 0x50,
+ 0x25, 0x44, 0xC4, 0x34, 0xC0, 0x82, 0x64, 0x94, 0x44, 0x19, 0x33, 0xCB, 0x18, 0x5A, 0x7B, 0x33,
+ 0x38, 0xED, 0xC6, 0x5F, 0xD4, 0x85, 0xD1, 0x1D, 0xDD, 0x1C, 0xD7, 0x43, 0xFF, 0x67, 0x28, 0xD2,
+ 0xC1, 0x8E, 0x3D, 0x19, 0x21, 0xC1, 0x8D, 0x00, 0xCE, 0x0C, 0x2C, 0x83, 0x89, 0x11, 0x14, 0xC1,
+ 0x59, 0x29, 0x63, 0x2D, 0xC6, 0x46, 0xD0, 0x52, 0xFB, 0x02, 0xEC, 0xF3, 0x9C, 0xF2, 0x64, 0xB4,
+ 0x37, 0x99, 0x5C, 0xF6, 0x57, 0xC9, 0x4A, 0x51, 0x18, 0x08, 0x6E, 0x8B, 0x9D, 0xEB, 0xA5, 0x8F,
+ 0xE4, 0x85, 0x29, 0x4C, 0x5F, 0xD8, 0x41, 0x2A, 0x62, 0xAB, 0x25, 0x42, 0xEE, 0x90, 0x64, 0x8E,
+ 0x93, 0x64, 0x87, 0x49, 0x98, 0x7C, 0x0E, 0xDF, 0xAC, 0xC5, 0x79, 0x2D, 0xC8, 0x53, 0x45, 0x2B,
+ 0xCF, 0x2F, 0x0B, 0xB6, 0x5B, 0x4C, 0x45, 0x38, 0x96, 0xE3, 0x70, 0x91, 0x8E, 0xAC, 0x51, 0x67,
+ 0xA2, 0xDB, 0x83, 0x55, 0x4C, 0x9D, 0xEB, 0x49, 0xE4, 0x37, 0x68, 0x9B, 0x58, 0xDC, 0x4B, 0xEC,
+ 0xB5, 0xC4, 0xDC, 0x13, 0xB1, 0x54, 0x92, 0xA5, 0x67, 0x75, 0x98, 0x43, 0x71, 0x27, 0xFF, 0xA5,
+ 0x6E, 0xE3, 0x12, 0x8C, 0xF6, 0xCB, 0x18, 0x21, 0x7C, 0x0A, 0x4B, 0xB3, 0xA5, 0xF4, 0xEA, 0x09,
+ 0x2C, 0x1C, 0x57, 0xBF, 0x8F, 0xA6, 0x94, 0xDD, 0x19, 0x35, 0x4F, 0x17, 0xA7, 0x55, 0x45, 0xBD,
+ 0xC8, 0x32, 0x72, 0x9E, 0x05, 0xD6, 0xBA, 0x3C, 0x60, 0x2E, 0xE6, 0x83, 0x12, 0xC4, 0xE2, 0x80,
+ 0x03, 0xDE, 0xBB, 0x88, 0xFB, 0x7F, 0xAD, 0x3B, 0x9C, 0xD8, 0xD0, 0x8E, 0x4C, 0x52, 0x4D, 0x7A,
+ 0xB8, 0x89, 0xB0, 0xBC, 0x7F, 0x94, 0x81, 0xBB, 0x6C, 0xE7, 0x5E, 0x1C, 0xFA, 0x69, 0x81, 0xB6,
+ 0x46, 0xC2, 0x3B, 0x70, 0xB8, 0x02, 0xA9, 0x9F, 0x17, 0x0F, 0xF2, 0x31, 0x17, 0x82, 0xFF, 0x17,
+ 0x02, 0xB9, 0x14, 0xBB, 0xE7, 0x1B, 0x1B, 0x4B, 0x92, 0x14, 0xE4, 0xE7, 0x6D, 0x6D, 0x73, 0xB8,
+ 0xCB, 0x5D, 0x92, 0x27, 0x7D, 0xDA, 0x00, 0x69, 0x70, 0x15, 0x3C, 0x0F, 0xF0, 0xDE, 0x5F, 0xCD,
+ 0x1A, 0x17, 0x86, 0x2A, 0x58, 0xB5, 0x4B, 0x3E, 0xAB, 0x4D, 0x8D, 0x75, 0x4D, 0x40, 0x7F, 0x84,
+ 0x1D, 0x19, 0x17, 0x1E, 0x41, 0x4C, 0xB9, 0xEF, 0x61, 0x46, 0x80, 0xAD, 0x5D, 0xDB, 0x01, 0x1E,
+ 0x73, 0xED, 0x42, 0xDD, 0x35, 0x07, 0x8B, 0xD0, 0xEC, 0x2E, 0x77, 0x35, 0xB8, 0xFC, 0x2E, 0xE5,
+ 0x8D, 0x30, 0x96, 0x0D, 0x88, 0x7F, 0x52, 0xE7, 0x6B, 0x11, 0xF0, 0xD2, 0x6A, 0x6F, 0x89, 0x66,
+ 0x3F, 0x3A, 0x94, 0x98, 0x64, 0x0F, 0x0E, 0x77, 0xF2, 0x04, 0x96, 0xD9, 0xAA, 0x36, 0x0B, 0x39,
+ 0xEE, 0x1F, 0x1D, 0x10, 0x23, 0xD0, 0xFA, 0x0B, 0xE1, 0x88, 0xED, 0x97, 0x73, 0xFF, 0xCC, 0xC8,
+ 0xD6, 0x49, 0x4A, 0x24, 0xC1, 0x49, 0x78, 0x25, 0x7A, 0x26, 0xD4, 0x6A, 0x9E, 0x4C, 0x98, 0xFA,
+ 0x90, 0xB4, 0xD4, 0x07, 0xA4, 0xD2, 0x5E, 0x8B, 0x6D, 0xB1, 0x03, 0xBD, 0xCE, 0x13, 0x3B, 0x3E,
+ 0x78, 0x4F, 0xFE, 0xCB, 0xB6, 0x53, 0xB7, 0x27, 0xAA, 0xC4, 0x35, 0xCD, 0xD8, 0xD9, 0x96, 0x78,
+ 0x9A, 0x1D, 0xE5, 0x97, 0xAC, 0xBE, 0x31, 0x8A, 0x77, 0x65, 0x67, 0x61, 0x3A, 0xF0, 0x0E, 0x04,
+ 0x54, 0x1C, 0xE4, 0x5F, 0xED, 0x06, 0xBA, 0xFB, 0x34, 0x59, 0xB2, 0x91, 0x33, 0xED, 0xF4, 0x52,
+ 0xFE, 0x42, 0xFB, 0xAE, 0xEF, 0x46, 0xE5, 0x01, 0x95, 0x6F, 0xB7, 0xE6, 0x8A, 0xEE, 0x45, 0xE5,
+ 0xAF, 0x13, 0x8B, 0x76, 0x74, 0xC3, 0x31, 0x36, 0xD2, 0x84, 0x1C, 0xA9, 0x4D, 0xF1, 0x1E, 0xA7,
+ 0x97, 0xF4, 0x4B, 0xD6, 0xA2, 0xF8, 0x90, 0x31, 0x2F, 0xCC, 0x70, 0x9F, 0x59, 0x98, 0x6F, 0x8F,
+ 0x6F, 0x81, 0x44, 0x01, 0x70, 0x25, 0x6B, 0x6A, 0x86, 0xF9, 0x76, 0x87, 0x37, 0xDB, 0x23, 0x5A,
+ 0xE1, 0x1B, 0x83, 0x8C, 0x87, 0x2C, 0x21, 0xC2, 0x8B, 0x76, 0x37, 0x1A, 0x5D, 0x96, 0xFB, 0x5B,
+ 0x9E, 0xF7, 0xA3, 0xFD, 0x11, 0x8F, 0x87, 0x0A, 0xD5, 0xE2, 0x13, 0x33, 0xCC, 0x02, 0xB5, 0x9B,
+ 0x31, 0x7F, 0x50, 0x4B, 0xED, 0x88, 0x74, 0xCF, 0x0A, 0x04, 0x2C, 0x92, 0xE2, 0xE7, 0x79, 0x00,
+ 0x68, 0xFF, 0xC2, 0x5B, 0xA5, 0x76, 0x40, 0xD0, 0x63, 0x53, 0x39, 0x24, 0x48, 0xB2, 0x9F, 0x34,
+ 0x76, 0xD1, 0x68, 0x75, 0x47, 0x0E, 0x51, 0x90, 0x01, 0x53, 0x05, 0x3E, 0x88, 0xE8, 0x1A, 0x10,
+ 0x85, 0x52, 0x2D, 0x57, 0x12, 0x17, 0x83, 0x4D, 0x11, 0xBB, 0x63, 0x0E, 0x59, 0x61, 0xCA, 0xAC,
+ 0x3F, 0xE0, 0x18, 0x04, 0x68, 0xDC, 0x7D, 0xC7, 0xD8, 0xF2, 0x5D, 0xB6, 0x7C, 0x86, 0x0C, 0x03,
+ 0xD6, 0x7E, 0xA6, 0x2C, 0x01, 0x5F, 0x7E, 0xFF, 0x9B, 0x0C, 0x26, 0xA9, 0x9C, 0x5D, 0x9D, 0x00,
+ 0xCD, 0x59, 0x4C, 0x3A, 0xD6, 0x82, 0x85, 0x8B, 0x65, 0x41, 0x85, 0x40, 0xE0, 0xE9, 0x0B, 0x93,
+ 0xE5, 0x32, 0x24, 0xDB, 0x94, 0x74, 0x94, 0x07, 0x47, 0x1B, 0x01, 0x6E, 0x4B, 0x5D, 0x26, 0x31,
+ 0x42, 0xBE, 0x38, 0x08, 0x2B, 0x19, 0xC1, 0x51, 0xCC, 0x51, 0xFC, 0x62, 0xFE, 0x09, 0x08, 0xD3,
+ 0x58, 0x6C, 0x8A, 0x2D, 0x35, 0xDE, 0x82, 0xD6, 0x4F, 0xEB, 0x65, 0x9F, 0xA1, 0xC9, 0xC3, 0x7A,
+ 0x70, 0x9F, 0xAA, 0xF3, 0x97, 0xF3, 0xE9, 0xFC, 0x3B, 0x84, 0x1D, 0xE5, 0x35, 0xA0, 0x05, 0xEE,
+ 0xAB, 0x78, 0xDB, 0xF0, 0xAD, 0xEC, 0x1E, 0xE9, 0x86, 0x96, 0x46, 0x45, 0x44, 0xD5, 0x28, 0x7D,
+ 0x83, 0xB0, 0x83, 0x69, 0xBC, 0x60, 0x5E, 0x14, 0x28, 0xCA, 0xA7, 0x3C, 0xEF, 0xDE, 0x74, 0x89,
+ 0x6D, 0xBF, 0x1B, 0x8F, 0x59, 0x8E, 0x96, 0xD5, 0xCE, 0x19, 0x41, 0x92, 0x88, 0x2A, 0xE8, 0x1B,
+ 0x1D, 0x9E, 0xC1, 0x34, 0x2C, 0x3E, 0x3F, 0xBC, 0x4F, 0x72, 0x61, 0x44, 0x21, 0xCA, 0x08, 0x26,
+ 0x0D, 0x28, 0xDC, 0x3D, 0x6F, 0x33, 0x49, 0xE6, 0x8B, 0xE6, 0xDD, 0x09, 0x6B, 0x29, 0x8B, 0xAB,
+ 0xF6, 0x2C, 0x23, 0x7E, 0x2B, 0x51, 0x63, 0x0F, 0x97, 0x25, 0xA1, 0x3C, 0x76, 0x39, 0x3B, 0xFB,
+ 0x75, 0x62, 0xA4, 0xF5, 0xC6, 0x72, 0x5E, 0xBF, 0x38, 0xA1, 0x8D, 0xB3, 0x31, 0x0E, 0x02, 0x7A,
+ 0x42, 0xDB, 0x92, 0xD0, 0x44, 0x85, 0x8F, 0x6E, 0x7B, 0xCA, 0xD4, 0xE1, 0x8B, 0xC9, 0x6A, 0xC2,
+ 0x20, 0xF7, 0x67, 0x00, 0x39, 0xDA, 0xAA, 0xF9, 0x54, 0x77, 0xDB, 0x54, 0x76, 0x7B, 0x15, 0xBF,
+ 0xE3, 0x8F, 0x7E, 0x75, 0x09, 0x50, 0x1D, 0x8A, 0x82, 0x91, 0xCA, 0x7E, 0xF3, 0x11, 0xB8, 0x1B,
+ 0xA7, 0x11, 0x0F, 0x29, 0xA4, 0x32, 0xB7, 0xB4, 0x66, 0x5A, 0xCE, 0xC3, 0x70, 0xCA, 0x19, 0xF1,
+ 0x75, 0x32, 0x18, 0xCD, 0x11, 0xCD, 0x29, 0x6F, 0x7D, 0x9D, 0x56, 0x17, 0x6F, 0xB2, 0x82, 0x75,
+ 0x9B, 0xE5, 0x60, 0x5F, 0x98, 0xAF, 0x2A, 0x9A, 0xBA, 0x97, 0x90, 0xC5, 0x99, 0x73, 0xC0, 0xFD,
+ 0x70, 0xA3, 0x14, 0xF7, 0xD8, 0xAF, 0xA4, 0x1C, 0xEC, 0x04, 0x27, 0xD5, 0xCB, 0x95, 0xAB, 0x1E,
+ 0x1D, 0x01, 0x33, 0xDA, 0xC1, 0xF3, 0xF3, 0x14, 0x0E, 0xE9, 0x40, 0xCA, 0x8D, 0x16, 0xAF, 0x61,
+ 0x4C, 0x5B, 0x98, 0x11, 0xFE, 0x39, 0x84, 0x08, 0x29, 0x0B, 0x3C, 0xD1, 0xC6, 0x80, 0xAB, 0x8B,
+ 0x61, 0xD3, 0x36, 0x84, 0xAC, 0xBE, 0xD0, 0xC5, 0x5D, 0xD8, 0x7B, 0x9B, 0xF0, 0x72, 0xC0, 0x0C,
+ 0xFD, 0x57, 0x57, 0x75, 0x31, 0x0D, 0x7D, 0x6E, 0xA4, 0xE8, 0xDC, 0x15, 0x73, 0x22, 0x00, 0x25,
+ 0xCB, 0xCA, 0x54, 0x5A, 0xB3, 0x1D, 0x27, 0x52, 0xE5, 0xF8, 0xEA, 0xA5, 0xE7, 0x3E, 0x25, 0x8B,
+ 0x58, 0x23, 0x93, 0xB6, 0x90, 0x62, 0x32, 0xD9, 0xAA, 0xEC, 0x37, 0xB6, 0xC3, 0xA0, 0x92, 0xE4,
+ 0xFB, 0xFF, 0xB3, 0xF4, 0xBF, 0x90, 0x58, 0x51, 0x9F, 0xAC, 0xFD, 0xA7, 0x7B, 0xEA, 0x47, 0x67,
+ 0x5B, 0x5D, 0x1A, 0x1D, 0xED, 0xC8, 0x80, 0x19, 0x86, 0x97, 0x7D, 0x8E, 0x70, 0x1E, 0x5B, 0xF1,
+ 0x04, 0x21, 0xA0, 0x41, 0xBE, 0x6A, 0x6E, 0x0D, 0x31, 0x62, 0xB7, 0xE9, 0x9F, 0xCF, 0x09, 0xC2,
+ 0xC0, 0xC0, 0xA8, 0xE2, 0x9A, 0x01, 0xDB, 0x0C, 0x8B, 0xC3, 0x04, 0xD3, 0xE6, 0xAE, 0x51, 0xCD,
+ 0xA8, 0x75, 0x51, 0xC9, 0x85, 0x87, 0x38, 0x5B, 0x6F, 0xD6, 0x7C, 0x2C, 0x56, 0x7B, 0xE3, 0x90,
+ 0x72, 0xC4, 0x17, 0x4D, 0x61, 0xE8, 0x82, 0x04, 0xB4, 0x54, 0x27, 0xA1, 0xEA, 0x75, 0xB7, 0x3A,
+ 0xA7, 0x51, 0x43, 0xB4, 0x0C, 0xC8, 0xFB, 0x7D, 0xBD, 0x47, 0x43, 0xDC, 0xE1, 0x60, 0x09, 0x94,
+ 0xF1, 0xDA, 0x45, 0x6F, 0x57, 0xFB, 0x66, 0xEF, 0xA4, 0x14, 0x6F, 0x7A, 0xAD, 0xAA, 0xE2, 0x85,
+ 0x3D, 0xC5, 0xF5, 0x14, 0xEB, 0x7B, 0x68, 0xAE, 0x41, 0xDF, 0xB6, 0xDD, 0x83, 0x14, 0x83, 0xAF,
+ 0x54, 0xF8, 0x34, 0xEA, 0x01, 0x61, 0x8D, 0x9B, 0xCC, 0xE9, 0xDB, 0x81, 0x68, 0xC2, 0x6F, 0xD2,
+ 0xAB, 0xF9, 0xF2, 0xC0, 0xF1, 0x29, 0x7A, 0x47, 0x4F, 0x52, 0x51, 0xDB, 0xDA, 0x1C, 0xD3, 0x5C,
+ 0xE8, 0x2A, 0x68, 0xFF, 0x99, 0xD1, 0x6D, 0xE8, 0xA1, 0x90, 0x17, 0x1A, 0x2C, 0x7D, 0xB3, 0x1D,
+ 0x8E, 0xF6, 0x84, 0xE2, 0x3F, 0x1A, 0xD0, 0x3D, 0xE8, 0x51, 0x7B, 0xEA, 0x3E, 0xFF, 0x2B, 0x25,
+ 0xB7, 0x27, 0x3D, 0xA0, 0x2E, 0x10, 0xD8, 0x1C, 0x99, 0xA4, 0xE0, 0x78, 0xA3, 0x30, 0x8E, 0x1E,
+ 0xD2, 0xE4, 0xA1, 0x08, 0x0E, 0x9F, 0x60, 0x22, 0xDE, 0xB3, 0x8C, 0x0F, 0xAE, 0x97, 0x21, 0x35,
+ 0xDC, 0x8E, 0x0D, 0x65, 0x99, 0xFA, 0xAC, 0x46, 0x79, 0x97, 0xEC, 0x58, 0x7E, 0x42, 0x45, 0x58,
+ 0x33, 0xAF, 0x2D, 0xE4, 0x45, 0x9F, 0x54, 0x93, 0x34, 0xCB, 0xAD, 0x10, 0xD6, 0x61, 0x33, 0xB8,
+ 0x5B, 0xCF, 0xB3, 0xF4, 0x68, 0x16, 0xA5, 0x98, 0x54, 0x75, 0x95, 0x8C, 0xCD, 0xCF, 0x74, 0x29,
+ 0x7F, 0xB5, 0xF7, 0xC9, 0x56, 0x6E, 0x5B, 0xFF, 0xEA, 0xCB, 0x8A, 0x53, 0x1E, 0x78, 0xA3, 0x25,
+ 0x68, 0x15, 0xE4, 0xD3, 0xC4, 0xDF, 0x93, 0x6E, 0xC8, 0xAA, 0x53, 0xFA, 0x3C, 0x60, 0xAC, 0x0D,
+ 0xA2, 0x01, 0xF6, 0x36, 0x1E, 0x80, 0x61, 0xE1, 0x89, 0x29, 0xDC, 0x0B, 0xC4, 0x0D, 0xB7, 0x8A,
+ 0xD2, 0xB2, 0x7C, 0xAD, 0x47, 0xB5, 0xE0, 0x1F, 0x48, 0x21, 0x55, 0xAA, 0x5F, 0x7D, 0x85, 0x48,
+ 0xE8, 0xD6, 0x19, 0xBE, 0xE6, 0x9C, 0x61, 0x8F, 0x89, 0x35, 0x49, 0x6D, 0x2E, 0x8B, 0x46, 0x1B,
+ 0xCB, 0xD8, 0x06, 0x83, 0x8B, 0x70, 0xED, 0x66, 0x17, 0xAD, 0x2C, 0xF6, 0xC8, 0xF3, 0x1E, 0xE2,
+ 0xCA, 0xDA, 0x04, 0xAA, 0xD4, 0xA0, 0xA6, 0x8B, 0xCC, 0x19, 0xF1, 0x87, 0x93, 0x3A, 0x69, 0xEE,
+ 0x82, 0x75, 0x71, 0x8B, 0x8E, 0xFD, 0x39, 0x4A, 0x9D, 0x95, 0x07, 0x80, 0x4E, 0xF6, 0x25, 0xFA,
+ 0x9C, 0x68, 0xF1, 0xA6, 0x84, 0x28, 0x8C, 0x47, 0xFB, 0xCC, 0xE5, 0x7A, 0x2B, 0xAC, 0x3B, 0x58,
+ 0xEE, 0x51, 0x31, 0x18, 0x6F, 0xFD, 0x5A, 0xE4, 0xFE, 0x80, 0x75, 0x92, 0x67, 0xF1, 0xF9, 0x78,
+ 0x73, 0xF1, 0x52, 0x4E, 0x9F, 0xFE, 0xA7, 0x18, 0x99, 0x48, 0x74, 0xE3, 0x94, 0x70, 0x1A, 0x9F,
+ 0xCD, 0x15, 0x31, 0xB3, 0x68, 0x4C, 0xFA, 0xED, 0x44, 0xC2, 0x8D, 0x71, 0xC0, 0xC2, 0x1B, 0x39,
+ 0x97, 0xE2, 0xFF, 0xA5, 0x4E, 0x07, 0xF1, 0xA7, 0xFF, 0xBF, 0x85, 0x79, 0x00, 0x29, 0x62, 0xB7,
+ 0x0F, 0xF9, 0x6A, 0xE5, 0xFE, 0x09, 0xE2, 0x2B, 0x76, 0x74, 0xF6, 0x40, 0xBE, 0x64, 0xE9, 0xD4,
+ 0x27, 0x74, 0x6F, 0xEC, 0xDD, 0xBC, 0x53, 0xCD, 0x9F, 0x16, 0x6B, 0x92, 0xAE, 0x59, 0x9E, 0x74,
+ 0x72, 0x18, 0xA5, 0x68, 0xE0, 0xA0, 0xAE, 0x06, 0xDB, 0xC4, 0xE5, 0x34, 0x37, 0x87, 0xAD, 0x80,
+ 0x2B, 0x0F, 0x84, 0x37, 0x99, 0x96, 0x9D, 0xEF, 0x87, 0x3C, 0xED, 0x7A, 0xD9, 0xAA, 0xB8, 0xC8,
+ 0x7A, 0xD4, 0xD0, 0x2A, 0xD7, 0xDA, 0xEC, 0x0B, 0x85, 0x8A, 0x93, 0x84, 0x38, 0x2D, 0x3F, 0x6B,
+ 0xE1, 0x8A, 0x88, 0x5D, 0x4C, 0x26, 0x69, 0xF5, 0x43, 0x55, 0xB1, 0x32, 0xB2, 0x78, 0x67, 0x39,
+ 0xC3, 0x64, 0x4A, 0x6A, 0x5B, 0xA3, 0x7A, 0xBC, 0x8A, 0x0A, 0x76, 0xDB, 0x69, 0x09, 0x66, 0x2C,
+ 0x2F, 0xD9, 0x30, 0x0B, 0x4E, 0xB0, 0x71, 0x5E, 0xDE, 0x48, 0x58, 0x6A, 0x10, 0x6B, 0xB1, 0x6D,
+ 0xF8, 0xB3, 0xF9, 0xD9, 0x24, 0x43, 0x0C, 0xB9, 0xAE, 0xB7, 0x9B, 0x76, 0x3A, 0xB3, 0xF1, 0x68,
+ 0x0A, 0xD4, 0xE5, 0xEC, 0x30, 0x8D, 0x19, 0xD0, 0x19, 0x42, 0x42, 0xF4, 0xD2, 0xF0, 0x3D, 0x40,
+ 0x4E, 0xF0, 0x52, 0x8C, 0x9D, 0x77, 0xE4, 0x5B, 0x04, 0x12, 0x4C, 0x08, 0xC3, 0xF6, 0x9A, 0x58,
+ 0x20, 0x40, 0x4B, 0x06, 0x8B, 0x1C, 0xD6, 0x0E, 0x7D, 0x2C, 0x8A, 0x9F, 0xEC, 0x25, 0xF0, 0x66,
+ 0x91, 0x34, 0xBE, 0xB9, 0x27, 0x02, 0xFE, 0x9C, 0x1C, 0x3D, 0x8A, 0xD9, 0x0C, 0x64, 0x98, 0xE1,
+ 0x2C, 0x9F, 0x25, 0xE9, 0x0A, 0xB7, 0xA4, 0xE7, 0xE1, 0x59, 0x51, 0x2A, 0xC0, 0xBF, 0x63, 0x80,
+ 0xEE, 0x71, 0x25, 0xD2, 0xCA, 0x3E, 0x23, 0xA2, 0x0A, 0x5D, 0x53, 0xD5, 0x38, 0xC6, 0x7E, 0xB2,
+ 0xD6, 0xA1, 0xB0, 0x1F, 0xD0, 0xDA, 0xA7, 0x59, 0x33, 0xF4, 0x43, 0x0A, 0x9E, 0xCB, 0x95, 0x5C,
+ 0x52, 0xD5, 0x34, 0x9E, 0x52, 0xAC, 0xC1, 0x36, 0x84, 0x1F, 0x62, 0x1D, 0x86, 0xD6, 0xBD, 0x56,
+ 0x9F, 0xCC, 0xAF, 0x30, 0xC0, 0x39, 0x28, 0x22, 0xDB, 0xDA, 0xD5, 0x4C, 0x4F, 0x1B, 0x36, 0x1D,
+ 0x1D, 0xAC, 0xF4, 0x98, 0xF5, 0x46, 0x94, 0x32, 0x80, 0x2B, 0xF8, 0x14, 0xF0, 0x68, 0x91, 0x1E,
+ 0xF6, 0x72, 0x1C, 0x4A, 0xF9, 0xD6, 0xC2, 0xA6, 0x3A, 0x85, 0xE9, 0xE1, 0x76, 0xB5, 0xA0, 0xEA,
+ 0x46, 0x6A, 0x2C, 0xF8, 0x8B, 0x8D, 0x0C, 0xD0, 0x1F, 0x4F, 0xD9, 0x38, 0x5B, 0xFE, 0x6E, 0x59,
+ 0xA3, 0xB8, 0xA4, 0x68, 0xED, 0x03, 0x4A, 0x06, 0xD3, 0xC1, 0xCD, 0x02, 0x95, 0x24, 0x5C, 0x3D,
+ 0x3B, 0xEC, 0x5A, 0x1C, 0x46, 0xD6, 0x1B, 0xA5, 0x42, 0xFD, 0x2E, 0xE7, 0xEA, 0x42, 0x98, 0x42,
+ 0x53, 0xB5, 0xD9, 0xCE, 0x53, 0xC1, 0x8F, 0x83, 0x4D, 0xB2, 0xB6, 0x9F, 0x8F, 0xB1, 0x88, 0x4D,
+ 0x45, 0x3D, 0x08, 0x01, 0x9A, 0x28, 0x7B, 0x10, 0x97, 0x6C, 0x76, 0x44, 0xE1, 0x07, 0x04, 0x51,
+ 0x0E, 0x4A, 0xC7, 0x98, 0xED, 0x86, 0x17, 0x69, 0x90, 0x14, 0xA9, 0xD8, 0xB7, 0x07, 0x28, 0x4A,
+ 0x77, 0x0B, 0xF9, 0x3F, 0x27, 0x4F, 0xCF, 0xA9, 0xDA, 0xCE, 0xC4, 0xDA, 0x30, 0x09, 0x56, 0x64,
+ 0x55, 0xCE, 0xD6, 0xEA, 0xE4, 0x85, 0x92, 0x95, 0x3E, 0x12, 0x5B, 0xF4, 0x21, 0x91, 0xCB, 0xD9,
+ 0xFB, 0xB7, 0x38, 0xBB, 0x1D, 0xFB, 0xAD, 0xE9, 0x55, 0x40, 0x9D, 0xF3, 0x30, 0xC5, 0xA4, 0x9E,
+ 0x02, 0xA8, 0x9B, 0x6E, 0x30, 0x07, 0x32, 0x16, 0xD9, 0xEB, 0x85, 0x55, 0xC8, 0x38, 0xBC, 0x84,
+ 0x9A, 0x9D, 0x61, 0x1C, 0x0D, 0xF5, 0x07, 0x06, 0xC8, 0x0B, 0x73, 0xC1, 0xB8, 0xD2, 0x84, 0xC2,
+ 0xAF, 0xCA, 0xB2, 0x88, 0x0A, 0xE4, 0x79, 0x84, 0x5C, 0x8B, 0xF7, 0xB6, 0xC4, 0x47, 0x92, 0xC9,
+ 0xC1, 0xBD, 0xF6, 0x84, 0x78, 0xC2, 0x74, 0xC3, 0xF8, 0x3C, 0x3F, 0xD6, 0x0E, 0x02, 0x5D, 0x22,
+ 0x42, 0x7D, 0xD3, 0xB8, 0xE9, 0xBB, 0x91, 0x36, 0x32, 0x81, 0xDD, 0x89, 0xCD, 0x41, 0x00, 0x37,
+ 0x4F, 0xA1, 0x48, 0x03, 0x2F, 0x3D, 0x54, 0x38, 0x17, 0x7C, 0x51, 0x40, 0x9A, 0x41, 0x57, 0x3C,
+ 0xF4, 0x5E, 0x0D, 0xF6, 0xA4, 0xE4, 0xA2, 0x97, 0x30, 0x71, 0x40, 0xC3, 0x20, 0x88, 0xEE, 0x95,
+ 0x7A, 0xB9, 0x03, 0x9D, 0x54, 0x10, 0xD1, 0x5B, 0xBC, 0x6D, 0x79, 0xFE, 0xF4, 0x44, 0x9C, 0xCB,
+ 0x1E, 0xAF, 0x0C, 0x6B, 0xB7, 0x17, 0x60, 0x91, 0x46, 0x1F, 0x9A, 0xA9, 0xD8, 0x84, 0x0D, 0x49,
+ 0x60, 0x4A, 0x48, 0xDD, 0x73, 0x1E, 0xDD, 0x17, 0xAD, 0xB8, 0x3C, 0x8A, 0xB3, 0xD3, 0x4C, 0x3C,
+ 0x97, 0xE3, 0xD0, 0x0A, 0x8D, 0x83, 0x7E, 0x3F, 0xE2, 0x03, 0xD1, 0xD3, 0x93, 0xA3, 0xFF, 0x3B,
+ 0x12, 0x65, 0x36, 0xF3, 0x27, 0xC1, 0x05, 0x27, 0xA2, 0x03, 0x71, 0x7C, 0xBD, 0xEC, 0xDB, 0xE4,
+ 0x3B, 0x33, 0x5F, 0x93, 0xB5, 0x41, 0xAC, 0xF8, 0x6D, 0xD7, 0xCB, 0x06, 0x33, 0x9A, 0x25, 0x2E,
+ 0xF6, 0x2F, 0xF4, 0x34, 0x6F, 0x5A, 0x05, 0xDD, 0x04, 0x95, 0x33, 0x67, 0x45, 0xD8, 0xD5, 0xD5,
+ 0xEA, 0xC8, 0x2F, 0x9B, 0xC3, 0xBE, 0xED, 0xCA, 0xC0, 0xCF, 0xB6, 0xFC, 0x7C, 0x88, 0x37, 0x1A,
+ 0x7D, 0xDA, 0x9B, 0x0E, 0xFC, 0x30, 0xD9, 0x17, 0xF3, 0x4C, 0x14, 0xF3, 0xDA, 0xF2, 0xCF, 0xCD,
+ 0x8A, 0x46, 0x23, 0xDA, 0x76, 0xC5, 0xF9, 0x06, 0xB9, 0x79, 0xD3, 0x1A, 0xD2, 0xA8, 0x11, 0x03,
+ 0x5D, 0x79, 0xA9, 0xA0, 0x93, 0x15, 0xC8, 0x27, 0xC2, 0xD9, 0x7F, 0x78, 0x3E, 0x84, 0xD4, 0x37,
+ 0x38, 0x52, 0x97, 0xD8, 0x58, 0x67, 0x6A, 0x13, 0x00, 0x00, 0x20, 0xFB, 0xF2, 0xBD, 0x52, 0x71,
+ 0xE6, 0x1C, 0x6C, 0x99, 0xF6, 0xDE, 0x72, 0x89, 0xCC, 0x92, 0x57, 0x13, 0x52, 0x04, 0x88, 0xE7,
+ 0xA5, 0xBC, 0x36, 0x46, 0x3C, 0x03, 0x59, 0xFE, 0x86, 0x99, 0xBC, 0x40, 0x70, 0xE9, 0xF1, 0xAA,
+ 0xCC, 0x4E, 0x16, 0xD2, 0x4B, 0x55, 0xC0, 0x42, 0x43, 0x3D, 0xF1, 0x1A, 0x38, 0xB9, 0x4F, 0x9E,
+ 0x31, 0x4E, 0x86, 0x08, 0x57, 0x95, 0x2D, 0xFB, 0xD7, 0x12, 0xC4, 0x11, 0xC0, 0x5D, 0x00, 0xD0,
+ 0xB5, 0x8D, 0xEA, 0x8F, 0x66, 0xD3, 0x00, 0x17, 0x80, 0x1A, 0x54, 0x0F, 0xDE, 0x75, 0x40, 0xD5,
+ 0x1B, 0x64, 0x89, 0x96, 0xF9, 0x9A, 0x0D, 0x70, 0x26, 0x50, 0x31, 0x3A, 0x3C, 0x0F, 0x5E, 0xC8,
+ 0xA3, 0xB8, 0x5D, 0x72, 0xDC, 0xBA, 0xB2, 0xEF, 0x58, 0x89, 0x52, 0x55, 0xF7, 0x9A, 0x17, 0xE7,
+ 0x43, 0xC2, 0x0F, 0x3A, 0x16, 0x75, 0xEB, 0x48, 0x87, 0x2A, 0xF8, 0x0E, 0xBA, 0xBB, 0x0D, 0xA2,
+ 0x6C, 0x37, 0x71, 0x50, 0xA4, 0xB8, 0x3F, 0x77, 0x2A, 0xDE, 0x12, 0x1B, 0x87, 0x39, 0x91, 0x40,
+ 0xA9, 0x62, 0x93, 0x87, 0x59, 0x8F, 0x1F, 0x9E, 0x27, 0xD6, 0x5F, 0xA9, 0x45, 0x67, 0xBC, 0x8C,
+ 0xE2, 0x84, 0x4C, 0x28, 0x0A, 0x7D, 0xBF, 0xC0, 0x08, 0x1C, 0x72, 0x87, 0x93, 0xC4, 0xA5, 0x88,
+ 0xFF, 0xD9, 0x29, 0x62, 0xC9, 0x2F, 0x9D, 0x96, 0x44, 0x77, 0xC1, 0x9E, 0xF4, 0xDF, 0x37, 0x5D,
+ 0x05, 0x2F, 0xD8, 0x4A, 0x46, 0x5D, 0xB2, 0x0C, 0xBE, 0x28, 0xA4, 0x15, 0x6B, 0xC0, 0xE4, 0x9A,
+ 0xFB, 0xAE, 0xCB, 0x1F, 0x14, 0x3F, 0x63, 0x65, 0x24, 0xD2, 0x49, 0x49, 0x90, 0x31, 0xBF, 0x6F,
+ 0x4F, 0x83, 0xE0, 0xDB, 0xF0, 0x0A, 0xA0, 0x7E, 0x45, 0x7F, 0x15, 0x86, 0x4A, 0x00, 0x06, 0x52,
+ 0xCE, 0x94, 0x81, 0x55, 0x48, 0x99, 0xF8, 0x2C, 0xD5, 0x18, 0x98, 0xF5, 0xB7, 0x5C, 0x71, 0x11,
+ 0x19, 0xAB, 0x7D, 0xAD, 0x35, 0x61, 0x2B, 0x00, 0x00, 0x80, 0xF0, 0x33, 0xF2, 0x4A, 0x77, 0x44,
+ 0xF2, 0x79, 0xA5, 0xE1, 0x53, 0xEE, 0x84, 0x18, 0x8C, 0x1F, 0x43, 0xA5, 0xF6, 0xA7, 0x3E, 0x73,
+ 0x89, 0x42, 0x9B, 0x45, 0xA6, 0x23, 0x09, 0x8B, 0x28, 0x02, 0xF4, 0x52, 0xBA, 0x2D, 0x9A, 0x3A,
+ 0xBC, 0x50, 0x8A, 0x6D, 0xD4, 0x0D, 0x19, 0xAC, 0x7F, 0x04, 0x99, 0xFC, 0x5C, 0x15, 0xD7, 0x30,
+ 0x9E, 0xDE, 0xCB, 0x61, 0x89, 0x54, 0x37, 0x6A, 0x9E, 0x21, 0x62, 0x5E, 0x28, 0x4E, 0xCE, 0x41,
+ 0x7D, 0x50, 0xFC, 0x99, 0xB0, 0x43, 0x86, 0x4A, 0xAD, 0x2C, 0x1C, 0xFC, 0x36, 0xF4, 0x16, 0x8A,
+ 0x23, 0x88, 0xB8, 0x32, 0xB0, 0x53, 0x3F, 0x50, 0xDB, 0x04, 0x20, 0x91, 0x9C, 0xA9, 0x71, 0x57,
+ 0xAB, 0x89, 0xE7, 0xA0, 0xAF, 0x65, 0xE4, 0xDF, 0x19, 0x7D, 0x1C, 0x95, 0xEB, 0x76, 0x9A, 0x1E,
+ 0x89, 0xEE, 0x44, 0x2D, 0xCA, 0xAF, 0x63, 0x32, 0x1B, 0xA6, 0x0C, 0x0A, 0xA0, 0x9D, 0x75, 0xFB,
+ 0x98, 0x68, 0x44, 0xC7, 0x31, 0x4E, 0xA4, 0x39, 0xE4, 0x74, 0xD6, 0xBB, 0xE4, 0x21, 0x6F, 0xAD,
+ 0x57, 0x54, 0x2C, 0x9F, 0x35, 0x01, 0xF1, 0x0A, 0xE1, 0x07, 0xF5, 0x61, 0x60, 0x0C, 0xF8, 0x9B,
+ 0x85, 0xE9, 0xC4, 0xBB, 0xBD, 0xEC, 0x45, 0x5B, 0xDD, 0x0B, 0xED, 0x0F, 0x55, 0x54, 0x7B, 0x50,
+ 0xDB, 0xC7, 0xAC, 0x05, 0x16, 0x5E, 0x55, 0x9C, 0x83, 0xB2, 0x6D, 0x95, 0x59, 0x3B, 0xCA, 0xB5,
+ 0x1B, 0x81, 0x4D, 0xC6, 0xC3, 0x8B, 0x20, 0x95, 0x5C, 0xE6, 0x03, 0xBF, 0xF8, 0xA7, 0x16, 0x8B,
+ 0x49, 0x63, 0xDD, 0x71, 0x15, 0x8B, 0x66, 0xA2, 0xAB, 0x47, 0x06, 0x74, 0xB5, 0xA8, 0xC4, 0x49,
+ 0x31, 0x4F, 0xFF, 0x08, 0x08, 0xB2, 0x2F, 0x9E, 0x6D, 0x13, 0xDD, 0xCB, 0x53, 0xB0, 0x47, 0x61,
+ 0x49, 0x47, 0x10, 0xFF, 0x87, 0xB0, 0x10, 0xD9, 0x21, 0xBD, 0x0F, 0x03, 0x98, 0x3B, 0x07, 0xC5,
+ 0xC4, 0x65, 0x39, 0x76, 0xCC, 0x44, 0x60, 0xCC, 0x79, 0x7B, 0x56, 0x37, 0xFE, 0x31, 0xBB, 0xFB,
+ 0x88, 0x82, 0xCD, 0xA4, 0xA0, 0xED, 0x2F, 0x0A, 0xF8, 0x74, 0x4A, 0x6F, 0xC3, 0xB9, 0x11, 0x76,
+ 0x0A, 0xEA, 0x0F, 0x1C, 0xFC, 0x6A, 0x49, 0x6A, 0x39, 0x32, 0xF8, 0x5C, 0x40, 0x1A, 0xA5, 0xED,
+ 0x72, 0x58, 0x6B, 0xD6, 0xA3, 0x53, 0x11, 0x82, 0xB8, 0x78, 0x85, 0x38, 0xD8, 0xFD, 0x18, 0x8B,
+ 0xDF, 0x0E, 0x62, 0xAF, 0x6B, 0xE4, 0x5F, 0x43, 0x55, 0x53, 0xB7, 0xAA, 0x43, 0x33, 0x89, 0xA8,
+ 0x67, 0x6E, 0xD8, 0x0A, 0xCC, 0x1F, 0x89, 0xDA, 0xA4, 0x16, 0xA2, 0xE0, 0xBA, 0xF5, 0x20, 0x10,
+ 0x05, 0x42, 0x00, 0xAD, 0x39, 0x49, 0xE9, 0x3D, 0x0A, 0xDF, 0x7E, 0x65, 0x14, 0xAF, 0xA8, 0x5E,
+ 0xD9, 0xC2, 0x16, 0x4F, 0x07, 0x18, 0xA0, 0xAD, 0x2C, 0xD8, 0x19, 0x6D, 0x11, 0x93, 0x63, 0xD7,
+ 0x6D, 0x05, 0xA9, 0xDB, 0xBA, 0x02, 0xC8, 0x10, 0x6A, 0xA5, 0x4F, 0x35, 0xC4, 0x35, 0x74, 0xC5,
+ 0xBF, 0x40, 0x71, 0x92, 0xDB, 0x26, 0xB6, 0xEB, 0xD8, 0x17, 0x34, 0x95, 0xEE, 0x3A, 0xF6, 0x30,
+ 0x48, 0x6C, 0xAD, 0x88, 0x82, 0x22, 0x48, 0x9B, 0xA3, 0xDE, 0x5A, 0x47, 0xEB, 0x80, 0x4C, 0x70,
+ 0xFF, 0x7B, 0x7C, 0xD9, 0xD7, 0x7E, 0x08, 0x74, 0x8F, 0xC5, 0x14, 0xBC, 0xC0, 0x4B, 0xF2, 0x3F,
+ 0xFF, 0x52, 0xBC, 0x23, 0xFB, 0x30, 0xA9, 0x2E, 0x7A, 0x93, 0x16, 0x73, 0x99, 0xF4, 0xE5, 0xB7,
+ 0x5F, 0x01, 0xDD, 0x96, 0x1A, 0xDB, 0x36, 0x74, 0xBE, 0xD4, 0xAB, 0xE2, 0x16, 0x24, 0xB2, 0x0E,
+ 0x36, 0x46, 0x36, 0x8C, 0x92, 0xB7, 0x79, 0x5E, 0x83, 0x37, 0x6A, 0x1A, 0x15, 0xCE, 0x6D, 0x61,
+ 0xEA, 0x9D, 0xE6, 0x65, 0x27, 0xD7, 0xB3, 0xF4, 0x6D, 0x55, 0xB8, 0xC0, 0x42, 0x4C, 0xE8, 0x36,
+ 0x1A, 0x0A, 0x21, 0x68, 0xB3, 0x17, 0xB1, 0xEA, 0x8D, 0x5C, 0x50, 0xBE, 0xC4, 0x49, 0xC5, 0x7D,
+ 0x19, 0x83, 0xF8, 0x02, 0x78, 0xAE, 0x3A, 0x5A, 0xB9, 0xA3, 0xA2, 0x0E, 0xCC, 0x10, 0x36, 0x49,
+ 0x84, 0x44, 0xA3, 0xFE, 0x5B, 0x56, 0x5C, 0x13, 0x43, 0xDD, 0x90, 0x29, 0x67, 0x9B, 0x3E, 0xD3,
+ 0x9B, 0x68, 0xA7, 0xAE, 0x52, 0x9C, 0x38, 0xF8, 0xF1, 0x10, 0xB7, 0x19, 0x75, 0x43, 0x27, 0x75,
+ 0x7F, 0x32, 0x40, 0x40, 0xDB, 0xD2, 0x71, 0x35, 0x45, 0x6C, 0x5B, 0x47, 0x84, 0x57, 0x49, 0x75,
+ 0xEB, 0x75, 0xDE, 0x93, 0xB2, 0xA7, 0x99, 0x65, 0xB1, 0x34, 0xA7, 0xB7, 0x67, 0x21, 0x95, 0x56,
+ 0x28, 0xF4, 0x16, 0xF6, 0xA5, 0x86, 0x04, 0x65, 0x44, 0x48, 0xDE, 0x02, 0xE4, 0x08, 0x6F, 0x57,
+ 0xA3, 0xE1, 0x45, 0x68, 0xC2, 0x9C, 0x96, 0xFD, 0xCB, 0x5B, 0x1D, 0xDF, 0xB5, 0x52, 0xAC, 0xB4,
+ 0xE4, 0x2D, 0x33, 0x76, 0x3C, 0x55, 0x8A, 0xD7, 0xD9, 0x65, 0xBD, 0x44, 0x27, 0x4F, 0x7B, 0x48,
+ 0x05, 0xD5, 0x3D, 0xB8, 0x87, 0x7E, 0x49, 0xE6, 0x99, 0x12, 0x27, 0xDA, 0x8E, 0xC9, 0x49, 0x4F,
+ 0xFC, 0x61, 0xD4, 0x8C, 0x63, 0xD1, 0x25, 0x8B, 0x09, 0xA1, 0x21, 0x96, 0xDC, 0xFF, 0x7A, 0x5F,
+ 0x99, 0xBE, 0xBC, 0x04, 0x0B, 0xD1, 0x0E, 0x44, 0xCE, 0x2C, 0xA1, 0x3C, 0x8F, 0x49, 0xD9, 0xA1,
+ 0xD4, 0x4D, 0x8E, 0x2B, 0x3E, 0xB4, 0x2F, 0x59, 0xDB, 0x71, 0x8A, 0xA5, 0x85, 0xD8, 0x31, 0x6A,
+ 0xD3, 0xEE, 0xBD, 0x32, 0x9D, 0xCA, 0x55, 0x19, 0x6A, 0x7F, 0x43, 0xE0, 0x5B, 0x91, 0x14, 0x4B,
+ 0x0C, 0xD2, 0xA1, 0xDA, 0xE8, 0x73, 0xF1, 0x24, 0xB9, 0xEA, 0x69, 0x77, 0xE4, 0x2A, 0x7D, 0xC4,
+ 0xD2, 0xB0, 0x7F, 0xAB, 0x28, 0xB1, 0xD0, 0x34, 0xF1, 0x89, 0x18, 0x57, 0xB0, 0x65, 0x50, 0x3D,
+ 0x5E, 0x81, 0xE5, 0xEE, 0xBF, 0xD1, 0x58, 0x1E, 0xC6, 0xA1, 0xCF, 0xD7, 0x31, 0x4A, 0x5D, 0x78,
+ 0xC6, 0xED, 0x7F, 0xCC, 0xC4, 0xBD, 0xFB, 0x6D, 0xF6, 0xEE, 0x26, 0xF7, 0xA6, 0xBE, 0x08, 0x6A,
+ 0xAD, 0x03, 0x24, 0xE0, 0x79, 0x24, 0xD0, 0xC1, 0xE9, 0x9A, 0xAF, 0x94, 0x3F, 0x10, 0x2E, 0xC8,
+ 0x93, 0x34, 0x08, 0x70, 0xFF, 0x2F, 0x32, 0x66, 0xAF, 0x19, 0xFD, 0xFE, 0xEC, 0x24, 0x44, 0x79,
+ 0x30, 0x41, 0x21, 0x49, 0xC0, 0xEF, 0x30, 0x59, 0xC5, 0x5B, 0xBA, 0x04, 0xAB, 0x03, 0x2F, 0x50,
+ 0x55, 0xF5, 0x48, 0x9F, 0x46, 0x98, 0xF3, 0xC1, 0xDC, 0xFE, 0x8F, 0xE9, 0x59, 0x9F, 0x49, 0xB6,
+ 0x6D, 0x53, 0x9F, 0x05, 0x3E, 0xED, 0xCE, 0xAE, 0x4F, 0xE8, 0x38, 0xE6, 0x0F, 0x55, 0x96, 0xD2,
+ 0x53, 0x72, 0x6C, 0x80, 0x78, 0xFB, 0x7C, 0xDD, 0xD0, 0x2E, 0x23, 0x1B, 0x65, 0x08, 0xF2, 0x76,
+ 0x7C, 0x34, 0x6A, 0xDC, 0xA0, 0xFB, 0xEC, 0xDF, 0x45, 0x1C, 0x53, 0x6B, 0xFD, 0x2C, 0x96, 0x3D,
+ 0xF4, 0x29, 0x4C, 0xF8, 0x92, 0x9E, 0xC4, 0x6B, 0x97, 0xCD, 0x16, 0x4D, 0xAB, 0xBC, 0x12, 0xED,
+ 0x32, 0x8C, 0xAA, 0x94, 0xEC, 0x3E, 0xF2, 0xEC, 0x24, 0x35, 0xD0, 0x97, 0xC9, 0x1E, 0x4C, 0x57,
+ 0xF3, 0xC5, 0x3D, 0xE9, 0x11, 0x6B, 0xB0, 0x66, 0xB4, 0x45, 0xE4, 0x4C, 0xE3, 0x5C, 0xFA, 0x24,
+ 0x0F, 0x70, 0x09, 0xB5, 0xF5, 0x5B, 0x80, 0xBD, 0x0B, 0x14, 0xB4, 0xF5, 0x9B, 0x51, 0x10, 0x6D,
+ 0xB8, 0x29, 0x6F, 0x74, 0x89, 0x89, 0x0E, 0x26, 0x08, 0xBF, 0x3E, 0xC2, 0xD5, 0x30, 0x1D, 0xAC,
+ 0x33, 0x19, 0x10, 0x32, 0x5E, 0xCB, 0x9A, 0x50, 0x52, 0xB4, 0x8F, 0xC8, 0xA1, 0x44, 0xB8, 0x2E,
+ 0x8B, 0x0D, 0x67, 0x1E, 0x8F, 0x31, 0x03, 0x99, 0x96, 0xB2, 0x76, 0xF2, 0xC7, 0xDF, 0xC3, 0x55,
+ 0x52, 0xE3, 0x17, 0xF1, 0xDF, 0x75, 0x60, 0xB0, 0x48, 0xF8, 0xC1, 0xDC, 0xB2, 0xFC, 0x8A, 0x17,
+ 0x6A, 0xED, 0x58, 0x33, 0x02, 0x24, 0x07, 0x86, 0xD4, 0xC0, 0xD9, 0x96, 0x3E, 0x05, 0x10, 0x78,
+ 0x5D, 0x69, 0x56, 0x7F, 0x1D, 0x08, 0x20, 0x49, 0x6E, 0x4F, 0x2A, 0x0B, 0xE6, 0xFD, 0x1E, 0x32,
+ 0x08, 0x07, 0x62, 0xA7, 0x9C, 0xD5, 0x34, 0xF0, 0x37, 0x13, 0x8E, 0x43, 0x10, 0x9D, 0xF9, 0x51,
+ 0x38, 0xBB, 0x5F, 0x61, 0x0A, 0x18, 0xD4, 0xA4, 0xFB, 0x60, 0x93, 0xED, 0x0A, 0x6F, 0x99, 0x89,
+ 0xD6, 0x63, 0x5C, 0x15, 0x6F, 0x93, 0xD8, 0xB1, 0xF2, 0x95, 0x11, 0xDE, 0x20, 0xA2, 0xEE, 0x1E,
+ 0x84, 0xDA, 0x3F, 0xF1, 0xE6, 0x10, 0xA4, 0xA8, 0x2F, 0xF1, 0x6E, 0x2A, 0x07, 0x4D, 0x8D, 0xE6,
+ 0x39, 0x96, 0x8A, 0xCC, 0x00, 0x33, 0x3F, 0x0C, 0x77, 0x5F, 0x2A, 0x85, 0x25, 0x29, 0x1E, 0xF6,
+ 0x65, 0x0F, 0x2D, 0x5E, 0x05, 0xBF, 0x3C, 0x0E, 0x0A, 0x17, 0x98, 0xB8, 0xA4, 0x49, 0x28, 0xA9,
+ 0x3B, 0xED, 0xCE, 0xF3, 0x7E, 0xB6, 0x38, 0x66, 0x0A, 0x31, 0x42, 0xC7, 0x2E, 0x40, 0x63, 0x16,
+ 0xA7, 0x80, 0xE8, 0x19, 0x3A, 0x61, 0xC7, 0x84, 0xBE, 0x89, 0x59, 0xD0, 0x23, 0xD9, 0xAA, 0x84,
+ 0x2A, 0x26, 0x53, 0x32, 0x0D, 0x6B, 0xBC, 0xBF, 0xAD, 0xE1, 0x03, 0x5F, 0x4A, 0xC7, 0x5F, 0x03,
+ 0x88, 0x0B, 0x8F, 0x7A, 0x53, 0xF8, 0xCC, 0x92, 0xAD, 0x57, 0x04, 0xD8, 0xC9, 0x9F, 0x51, 0xB7,
+ 0x9C, 0x6A, 0xAB, 0x45, 0x27, 0x0F, 0xC6, 0x21, 0xBE, 0x01, 0x43, 0x8F, 0x0C, 0x54, 0xDD, 0xAF,
+ 0xF6, 0xFB, 0x32, 0xA3, 0x95, 0xCC, 0x09, 0xBC, 0x98, 0xAD, 0xEF, 0xA8, 0xC5, 0x3F, 0x47, 0xF7,
+ 0x46, 0xBF, 0x2C, 0xF6, 0x05, 0xFB, 0xC8, 0xE8, 0x56, 0x2C, 0x50, 0x89, 0xDF, 0x14, 0x67, 0xE0,
+ 0xD4, 0x41, 0x12, 0x82, 0xD1, 0x94, 0x75, 0x00, 0x3E, 0xF9, 0x4F, 0xCB, 0x20, 0x9A, 0x62, 0x16,
+ 0xB4, 0x50, 0xB6, 0x63, 0x3A, 0x9C, 0x91, 0x3C, 0xBC, 0x0F, 0x6A, 0xB0, 0xE5, 0x2E, 0xD7, 0xEA,
+ 0xE7, 0x85, 0xA3, 0xD9, 0xB0, 0xAB, 0x8C, 0x83, 0x69, 0x62, 0x43, 0x56, 0x1E, 0xDD, 0xA1, 0x55,
+ 0x86, 0x7F, 0x1F, 0xCB, 0x1F, 0xA4, 0xF2, 0x57, 0xCE, 0xB0, 0xA2, 0x1D, 0xFA, 0x17, 0x43, 0x46,
+ 0xF7, 0xFD, 0xA3, 0x72, 0xFC, 0x5C, 0xBC, 0x96, 0xA9, 0xB3, 0x39, 0xB9, 0x54, 0xD3, 0x75, 0x11,
+ 0x78, 0xAD, 0x05, 0x61, 0x0A, 0xB6, 0x7E, 0x94, 0xCB, 0x36, 0x2F, 0x00, 0xEA, 0xCA, 0xEA, 0x5F,
+ 0x09, 0xE8, 0xDF, 0x98, 0xA0, 0xFE, 0x8B, 0x9A, 0xCB, 0x5E, 0xFC, 0x4E, 0xD8, 0x30, 0x91, 0x97,
+ 0x95, 0x92, 0x9E, 0x55, 0xAB, 0x45, 0x4A, 0x0F, 0xDD, 0xFF, 0x73, 0x4E, 0x0C, 0xC3, 0x62, 0x13,
+ 0x3A, 0xC9, 0xB5, 0xEF, 0x85, 0xD1, 0x4D, 0xB3, 0x7B, 0xD5, 0xA5, 0x33, 0xAF, 0x9D, 0xBC, 0x47,
+ 0xE3, 0x1E, 0xC8, 0x97, 0xF4, 0xAF, 0xE0, 0x96, 0x82, 0x8D, 0x3E, 0xD9, 0xBE, 0x1E, 0xDB, 0x04,
+ 0xA6, 0x38, 0xE7, 0x6F, 0x8F, 0xC1, 0xC7, 0x67, 0x0F, 0x50, 0x42, 0xCE, 0x1F, 0x42, 0xCA, 0x2C,
+ 0x52, 0xA0, 0xEC, 0xB2, 0x02, 0x56, 0x37, 0x3B, 0x95, 0x70, 0x0F, 0x03, 0x33, 0x61, 0xE7, 0xDD,
+ 0x6A, 0x0A, 0x0A, 0x27, 0x8C, 0x0E, 0x18, 0xF0, 0x39, 0x83, 0x87, 0x12, 0x18, 0x2B, 0x53, 0xF4,
+ 0x41, 0x01, 0x52, 0xCF, 0xC7, 0xBE, 0x4A, 0x1B, 0x3B, 0x77, 0xCD, 0xF2, 0xE1, 0x4D, 0xC5, 0x78,
+ 0x4E, 0x93, 0x9B, 0xBD, 0xD6, 0xFA, 0xBF, 0x60, 0x48, 0x76, 0x19, 0x3F, 0x22, 0xAB, 0xA8, 0x84,
+ 0xA0, 0xA7, 0x9E, 0x40, 0xE3, 0xA4, 0x86, 0xF1, 0x4F, 0x35, 0x7F, 0xE9, 0xAD, 0x6F, 0x43, 0x62,
+ 0x4E, 0x9B, 0x91, 0xD7, 0x3B, 0x6C, 0x1A, 0x51, 0x67, 0xDB, 0x18, 0x51, 0x9C, 0x8E, 0xB0, 0xB2,
+ 0xE2, 0x45, 0xB5, 0x48, 0x11, 0x03, 0x5C, 0xF3, 0x3A, 0xCD, 0x43, 0x14, 0x40, 0xFC, 0x72, 0x8E,
+ 0x44, 0xF0, 0xE6, 0xF7, 0x69, 0xD3, 0xC2, 0xF9, 0x5A, 0xC7, 0x68, 0xB3, 0xA0, 0x74, 0x94, 0x12,
+ 0xEA, 0x5F, 0xF4, 0x93, 0x2A, 0x9B, 0x71, 0xF5, 0x19, 0x87, 0x98, 0xC2, 0x04, 0xC0, 0x52, 0xC7,
+ 0x2C, 0x26, 0xC1, 0x93, 0xDD, 0xB1, 0xB2, 0xA8, 0x68, 0xF7, 0xE3, 0xCE, 0x20, 0x8E, 0x02, 0xBF,
+ 0x05, 0x08, 0xBD, 0x53, 0xD1, 0x31, 0x30, 0xD7, 0xF2, 0x7B, 0x15, 0xCB, 0x10, 0x47, 0x7B, 0x66,
+ 0xEE, 0x63, 0x44, 0x21, 0xAD, 0xD7, 0xDC, 0xD9, 0x61, 0xCB, 0xC7, 0x71, 0x87, 0x06, 0xEB, 0xE0,
+ 0x6B, 0x7D, 0x4E, 0x01, 0x05, 0x0A, 0xDC, 0x8F, 0xF0, 0x40, 0xA7, 0xDF, 0x18, 0xD6, 0x71, 0x2C,
+ 0x2E, 0x81, 0x05, 0x95, 0x48, 0x26, 0x52, 0xBB, 0x9F, 0x7D, 0xD0, 0x51, 0x28, 0xA5, 0x7F, 0x9F,
+ 0xC5, 0x38, 0x39, 0x3A, 0xDE, 0x1E, 0x53, 0x2F, 0x08, 0x19, 0xE0, 0x56, 0x83, 0x28, 0xB2, 0x5C,
+ 0xB4, 0xEF, 0x35, 0x90, 0xE0, 0xE0, 0x54, 0xCC, 0xE6, 0xA7, 0xB4, 0x83, 0x5E, 0xC0, 0xC4, 0xBE,
+ 0x46, 0x33, 0x14, 0xB1, 0x09, 0xBB, 0xD2, 0xB3, 0xDB, 0xE9, 0xAC, 0x62, 0xEF, 0x52, 0x42, 0x82,
+ 0x5D, 0x99, 0x8E, 0xFD, 0x28, 0xA8, 0xB6, 0xAA, 0xC6, 0x68, 0x58, 0xDF, 0x87, 0x10, 0x32, 0xD9,
+ 0xB1, 0xA7, 0x49, 0x76, 0x2D, 0x40, 0xDD, 0x6D, 0xB3, 0x67, 0x4C, 0x59, 0xC4, 0x5C, 0x66, 0x74,
+ 0xBE, 0x13, 0xC5, 0x19, 0x92, 0x23, 0x3F, 0x81, 0x74, 0xB1, 0x9A, 0x65, 0x5D, 0xDD, 0x24, 0x7E,
+ 0x6F, 0x3B, 0xF1, 0x45, 0x56, 0x9D, 0x66, 0xB2, 0x8B, 0xD6, 0x89, 0xE3, 0xF7, 0xD7, 0xDD, 0x44,
+ 0x6F, 0x41, 0x52, 0x43, 0x66, 0xE0, 0xB1, 0x18, 0x37, 0xFE, 0xE4, 0x95, 0x26, 0x71, 0x29, 0x7D,
+ 0xC5, 0x7A, 0x4A, 0x6B, 0xB0, 0xB1, 0x3B, 0xF2, 0xFA, 0x67, 0x1D, 0x57, 0xBE, 0x51, 0xF0, 0x76,
+ 0x37, 0x45, 0x65, 0xF3, 0x30, 0x75, 0x0C, 0x26, 0xD5, 0x6E, 0x7A, 0xBD, 0xB5, 0x31, 0xE7, 0x30,
+ 0x14, 0x50, 0x64, 0xB8, 0x3C, 0x89, 0x43, 0xF1, 0x32, 0x7C, 0x45, 0xE3, 0xD8, 0x52, 0xF2, 0x00,
+ 0xD4, 0x8D, 0x76, 0xD4, 0xE6, 0x4C, 0x6D, 0x98, 0x7D, 0x56, 0x37, 0x15, 0x1B, 0x0F, 0x75, 0x66,
+ 0x88, 0x29, 0xDF, 0xFB, 0xBF, 0x99, 0x51, 0x46, 0xDA, 0x20, 0xB4, 0xD1, 0xB8, 0x0D, 0xE1, 0xA8,
+ 0x82, 0x2C, 0x69, 0x7C, 0x93, 0xE7, 0x51, 0x3E, 0x0F, 0x25, 0xDE, 0x25, 0x2F, 0x8D, 0x28, 0x4C,
+ 0xAF, 0x35, 0x4F, 0x1C, 0x6B, 0x4B, 0x43, 0xC9, 0x82, 0xAA, 0x5C, 0x31, 0xF6, 0x4D, 0x9F, 0x3B,
+ 0x17, 0x25, 0x21, 0x0D, 0xE4, 0x81, 0x49, 0xD3, 0x02, 0xED, 0xEE, 0x73, 0xCD, 0x54, 0xBD, 0xF1,
+ 0x0E, 0x31, 0x5E, 0x49, 0x13, 0xFE, 0xAA, 0xFF, 0x5D, 0x77, 0x65, 0x3D, 0x9A, 0x62, 0xDE, 0x52,
+ 0x4F, 0x4E, 0x5C, 0xA6, 0xA2, 0xEA, 0xA0, 0x85, 0x69, 0x6F, 0x64, 0x30, 0x71, 0xD7, 0xE0, 0x5F,
+ 0xF0, 0xDF, 0xB7, 0xFC, 0x93, 0x08, 0xDA, 0x58, 0xAA, 0x53, 0x10, 0x3E, 0x2F, 0x47, 0x48, 0x11,
+ 0xC7, 0x02, 0xB1, 0xB0, 0x25, 0x46, 0x83, 0x88, 0x5D, 0xF8, 0xBB, 0x43, 0x00, 0x91, 0x84, 0x8E,
+ 0x80, 0xF1, 0xE8, 0xE8, 0x90, 0xE4, 0xC8, 0x4A, 0x11, 0xA0, 0x92, 0xAA, 0x7E, 0xA5, 0xCA, 0xA7,
+ 0xB6, 0x22, 0x9A, 0xB1, 0x55, 0x8E, 0x6D, 0xE5, 0x47, 0xD6, 0x2E, 0x58, 0x42, 0xCB, 0xC4, 0x19,
+ 0xB5, 0xFF, 0xAB, 0xB1, 0x8F, 0x2A, 0x81, 0x94, 0x19, 0x91, 0xDA, 0x3A, 0x3C, 0xBB, 0x74, 0x8E,
+ 0x84, 0x07, 0xD3, 0x3B, 0x6A, 0x5E, 0xD0, 0x4D, 0xD1, 0xA0, 0xD6, 0x5B, 0x32, 0x7F, 0x92, 0xCC,
+ 0x5E, 0xDF, 0xCE, 0x88, 0xCD, 0x2B, 0x6A, 0x4B, 0x3D, 0x68, 0x75, 0x7A, 0xB0, 0xF1, 0x36, 0x1B,
+ 0xCA, 0x96, 0xFB, 0xE3, 0x77, 0x9B, 0x38, 0x83, 0x2E, 0xDD, 0x4C, 0x53, 0x35, 0x85, 0xC2, 0xE3,
+ 0xCF, 0xA2, 0xF3, 0x85, 0x44, 0xA1, 0xB2, 0x9B, 0x0F, 0xE9, 0x2A, 0x82, 0xD5, 0xB3, 0xC3, 0xF1,
+ 0x2B, 0xE8, 0x1B, 0x2C, 0xFF, 0x7D, 0x3C, 0xC9, 0x24, 0x24, 0x35, 0xC8, 0x43, 0x10, 0x2A, 0x92,
+ 0x53, 0x29, 0x1D, 0x71, 0xB8, 0xFD, 0x7E, 0x18, 0x9B, 0xBA, 0x5F, 0x43, 0x9F, 0x8C, 0x35, 0xB6,
+ 0x0D, 0x93, 0xC1, 0xA7, 0xB9, 0x2A, 0x05, 0xEB, 0x59, 0xB4, 0xA1, 0x94, 0x6C, 0x8B, 0xD3, 0x82,
+ 0xD3, 0xFF, 0xA7, 0x36, 0x8C, 0x79, 0x8D, 0xB9, 0x11, 0x04, 0x78, 0x49, 0xA8, 0xBE, 0x76, 0x7C,
+ 0xAE, 0x9C, 0xD8, 0x26, 0x4C, 0x12, 0x07, 0x45, 0xE3, 0x39, 0x7A, 0xED, 0xFD, 0x1E, 0xC1, 0xC2,
+ 0xBB, 0x90, 0xB2, 0xA7, 0x7A, 0xDC, 0x65, 0x4E, 0x99, 0x73, 0x80, 0xF8, 0x9B, 0x6F, 0x93, 0x76,
+ 0x18, 0x7D, 0x69, 0x75, 0xA9, 0xB0, 0x42, 0xD9, 0xEB, 0x21, 0xF5, 0x0B, 0x33, 0x47, 0xDD, 0xB4,
+ 0xC1, 0x36, 0xDA, 0x6B, 0x82, 0xE1, 0x5B, 0x21, 0xA1, 0xB7, 0x8A, 0x29, 0x73, 0x64, 0x06, 0xC9,
+ 0x0A, 0x67, 0x82, 0xCD, 0xD2, 0xC9, 0x5C, 0x62, 0x75, 0x03, 0x1A, 0xD7, 0x32, 0xFE, 0x84, 0x4E,
+ 0xB6, 0xCF, 0x97, 0x0D, 0x6C, 0x12, 0x0A, 0x57, 0xC3, 0xF2, 0x87, 0x6C, 0x1D, 0x05, 0x39, 0x0C,
+ 0xC9, 0xDB, 0xA8, 0xE5, 0x2E, 0x6A, 0xE0, 0xAB, 0xD1, 0x1C, 0xCC, 0x16, 0xFE, 0xB7, 0x49, 0x3C,
+ 0xC0, 0xCB, 0x43, 0x63, 0x74, 0x89, 0xD8, 0xB6, 0xC0, 0x69, 0x80, 0xF4, 0x8E, 0x84, 0xE0, 0x10,
+ 0x61, 0x3E, 0xF4, 0x04, 0xB5, 0x04, 0x37, 0xA4, 0x23, 0x33, 0xD8, 0x3C, 0x35, 0x26, 0xC9, 0xF6,
+ 0x06, 0x85, 0x5B, 0xC2, 0x8F, 0x53, 0xBA, 0x46, 0xDE, 0x4C, 0x7A, 0xCD, 0x8F, 0xF9, 0x31, 0x8A,
+ 0x21, 0xD9, 0xDF, 0x0C, 0x2A, 0xC4, 0xF0, 0x1F, 0xF1, 0x37, 0xD1, 0x1F, 0xA5, 0x21, 0x27, 0xE8,
+ 0x2B, 0xA6, 0xB6, 0x89, 0x34, 0xF4, 0xF3, 0x7C, 0x24, 0x0E, 0xA6, 0xDB, 0xB3, 0x9D, 0x60, 0x29,
+ 0x3A, 0xC7, 0xD6, 0xAE, 0xE7, 0x95, 0xBF, 0x30, 0x11, 0xA4, 0x77, 0xCC, 0x7C, 0xE7, 0x96, 0x7E,
+ 0xAC, 0xFC, 0xFA, 0xFD, 0x41, 0xAA, 0x0C, 0x6C, 0x53, 0x56, 0xB6, 0x55, 0x7E, 0xC3, 0xB4, 0x82,
+ 0x4B, 0xC0, 0x4A, 0xFE, 0xF7, 0x5F, 0xD1, 0xAB, 0xD8, 0x89, 0x00, 0x44, 0xAA, 0xB1, 0x62, 0xEF,
+ 0xD6, 0x7F, 0x1B, 0x7B, 0x22, 0x48, 0xEA, 0x00, 0x53, 0x49, 0xA7, 0xCD, 0xA6, 0x7B, 0x61, 0xE3,
+ 0xDD, 0xFC, 0xBF, 0xB7, 0xB0, 0xCB, 0xAE, 0xAC, 0xDE, 0x9B, 0x98, 0xC8, 0x86, 0x7C, 0xB2, 0xFB,
+ 0xED, 0x75, 0xA4, 0x30, 0xBF, 0x8A, 0x52, 0x95, 0x7E, 0xCF, 0x4B, 0x28, 0xF2, 0xA2, 0x2F, 0xB9,
+ 0xA2, 0x24, 0x93, 0xA3, 0x84, 0xCB, 0x2C, 0xC0, 0x7D, 0x2F, 0x6E, 0x35, 0x33, 0x1B, 0x0F, 0x6E,
+ 0xFF, 0x32, 0x92, 0x09, 0x17, 0x31, 0xE4, 0xFC, 0x2C, 0x6A, 0x93, 0x1B, 0xFA, 0xA4, 0x87, 0x04,
+ 0x9D, 0x1E, 0xCC, 0xC1, 0xD4, 0x40, 0x83, 0x21, 0xB3, 0x5F, 0x3F, 0x68, 0x9C, 0x37, 0x68, 0x47,
+ 0x6A, 0x21, 0x98, 0xBC, 0x95, 0x50, 0xBE, 0xF7, 0xD4, 0x72, 0x20, 0x70, 0x12, 0x4F, 0xCB, 0x77,
+ 0xBF, 0x68, 0x5A, 0xCE, 0xB5, 0x13, 0xC6, 0x25, 0x30, 0x75, 0xA4, 0xF6, 0xE9, 0xDC, 0xF5, 0xC2,
+ 0xB0, 0x57, 0x55, 0xC3, 0x69, 0xE5, 0xF1, 0xB9, 0xAE, 0x55, 0x69, 0x56, 0x5A, 0xBC, 0xCE, 0x0F,
+ 0x11, 0x32, 0x2A, 0xE9, 0x7E, 0x40, 0x40, 0xCC, 0xDD, 0x04, 0x62, 0x8B, 0x3B, 0x57, 0xE5, 0x45,
+ 0xCB, 0xEE, 0xF0, 0x3D, 0x6A, 0xAC, 0xDD, 0x83, 0x7C, 0x2F, 0x66, 0x9A, 0x6C, 0x3B, 0xD1, 0x80,
+ 0x85, 0xE6, 0xE7, 0xEA, 0xE0, 0x89, 0x19, 0x0E, 0x5A, 0xDE, 0x7E, 0x8F, 0x6C, 0x05, 0xB3, 0xA5,
+ 0x89, 0x08, 0x45, 0x60, 0xA5, 0xE0, 0xB8, 0xD1, 0x7D, 0x45, 0xB6, 0x23, 0x19, 0x84, 0x6A, 0xC2,
+ 0x33, 0xD2, 0xD8, 0x9A, 0x87, 0xD0, 0xF4, 0xED, 0x06, 0x11, 0x08, 0xF1, 0xF2, 0x92, 0xA5, 0x4D,
+ 0xF6, 0xE7, 0xBF, 0x8E, 0x3D, 0x01, 0x60, 0x50, 0xC0, 0x4F, 0xBB, 0x37, 0xAA, 0x8E, 0xE4, 0x81,
+ 0x9F, 0xBD, 0xDD, 0xA0, 0xA1, 0x00, 0xD8, 0x5C, 0x55, 0xB0, 0xCF, 0x39, 0xEF, 0xA0, 0xE1, 0x4F,
+ 0xA7, 0x5D, 0x46, 0x85, 0x11, 0x98, 0x8F, 0x9E, 0xEB, 0x16, 0x0D, 0xF7, 0x0F, 0xEE, 0x9F, 0xBD,
+ 0x22, 0x87, 0x0B, 0x10, 0x0B, 0x9E, 0x4D, 0xC1, 0x5F, 0x82, 0xFA, 0xED, 0xCC, 0xAC, 0xB4, 0x62,
+ 0xCA, 0x57, 0x8B, 0xE7, 0x60, 0x5B, 0xCF, 0x9B, 0x78, 0xFB, 0x8D, 0x10, 0xCD, 0x33, 0x68, 0x19,
+ 0x25, 0x00, 0xCB, 0xD1, 0x13, 0xB4, 0xA3, 0x21, 0x07, 0x5C, 0xED, 0xC5, 0xBB, 0xFA, 0x60, 0x8C,
+ 0xB7, 0xD4, 0x41, 0x39, 0x2D, 0x9E, 0x69, 0x3E, 0xC8, 0x25, 0x34, 0xA4, 0x5B, 0x52, 0xB3, 0xBD,
+ 0x33, 0xC9, 0x74, 0x7B, 0x7D, 0x46, 0x61, 0x9D, 0x9F, 0x28, 0xBC, 0xE6, 0x53, 0xD3, 0xEA, 0x5E,
+ 0xEF, 0xE3, 0x2E, 0xE8, 0x76, 0x68, 0x75, 0x80, 0x98, 0x78, 0x9F, 0x20, 0xF8, 0x50, 0xB7, 0xA1,
+ 0x88, 0x0C, 0x0B, 0xD6, 0xF4, 0x84, 0x7C, 0xA5, 0x7D, 0xEE, 0xBB, 0xD6, 0x47, 0x30, 0x89, 0x5C,
+ 0xF6, 0xF3, 0x9F, 0x83, 0x56, 0xB5, 0x47, 0xCD, 0x9F, 0xD6, 0x50, 0x7A, 0xD2, 0xE5, 0x3C, 0x36,
+ 0x36, 0xBE, 0xBB, 0xAD, 0xB5, 0xDE, 0x92, 0x9F, 0xAF, 0x06, 0x5E, 0x3E, 0x36, 0xB9, 0xC2, 0x53,
+ 0xCA, 0x35, 0x21, 0x3E, 0x4F, 0x83, 0x4C, 0x6B, 0x5E, 0x80, 0x98, 0x05, 0x49, 0xE7, 0x17, 0xC6,
+ 0x6E, 0x29, 0x41, 0xF1, 0x51, 0xB6, 0xDF, 0x97, 0x9C, 0x37, 0xEB, 0xD1, 0x28, 0x57, 0xDD, 0xD5,
+ 0x64, 0x93, 0x31, 0x80, 0x67, 0x67, 0x4B, 0xF3, 0x08, 0x38, 0x6D, 0x8A, 0x0D, 0x50, 0x5D, 0x22,
+ 0x03, 0xF2, 0x5F, 0x79, 0x98, 0x87, 0x2D, 0x2D, 0x32, 0x91, 0xD9, 0x7C, 0x07, 0x8B, 0xA5, 0x83,
+ 0xC0, 0x89, 0xE1, 0x9D, 0x78, 0xF5, 0xB8, 0x88, 0x5F, 0xF6, 0x5C, 0x35, 0x13, 0x2B, 0x07, 0xEA,
+ 0xAB, 0xED, 0x98, 0x1D, 0xC2, 0x51, 0x56, 0x41, 0x90, 0xA3, 0x0D, 0xB5, 0x96, 0xCB, 0x34, 0x1C,
+ 0x6E, 0x43, 0x8F, 0xBF, 0xB5, 0x6F, 0x5D, 0x5E, 0x94, 0x99, 0xC1, 0xD9, 0x12, 0x0F, 0x1D, 0x1E,
+ 0x16, 0x01, 0xA7, 0x71, 0xB1, 0xF5, 0x49, 0xE3, 0x77, 0x3D, 0x02, 0xCF, 0xE2, 0x7C, 0x96, 0x77,
+ 0x8B, 0xA8, 0x01, 0xFD, 0xC0, 0xB5, 0x58, 0x6E, 0xA2, 0x57, 0xFF, 0x31, 0x20, 0x5D, 0x90, 0x59,
+ 0x55, 0x42, 0xB5, 0x5E, 0x8F, 0x4C, 0x23, 0x55, 0x23, 0x21, 0x4A, 0x79, 0x30, 0x9C, 0xF8, 0xB8,
+ 0xD4, 0x5F, 0x23, 0x66, 0xF4, 0x01, 0x96, 0x43, 0xF8, 0x2A, 0x20, 0xFD, 0x04, 0x7E, 0xE4, 0xC3,
+ 0x4B, 0xC3, 0x57, 0x85, 0x61, 0x15, 0x44, 0x7D, 0x8B, 0xDC, 0x29, 0xA4, 0xDB, 0xE6, 0x2D, 0xCC,
+ 0x3E, 0x12, 0x03, 0xEB, 0xC3, 0xB9, 0xDC, 0xE0, 0x13, 0x74, 0x41, 0x2B, 0xF6, 0xEF, 0x67, 0xDD,
+ 0x1D, 0xEE, 0x8B, 0x07, 0x30, 0x68, 0xF8, 0x56, 0x64, 0x2B, 0x4E, 0xB1, 0x19, 0xE3, 0xE7, 0xBE,
+ 0x72, 0xD9, 0x50, 0x69, 0x3C, 0x21, 0xDA, 0xEE, 0x63, 0x89, 0x5D, 0xB3, 0x79, 0xD8, 0xEF, 0x26,
+ 0xE2, 0x1F, 0x66, 0x17, 0x4C, 0x70, 0xCF, 0xDF, 0xC0, 0x9F, 0xE9, 0x8F, 0xA2, 0x88, 0xDB, 0xD2,
+ 0x7F, 0xDF, 0x32, 0xEA, 0xEF, 0x83, 0x4F, 0xC3, 0x6F, 0x7F, 0x0D, 0x4F, 0x63, 0x00, 0xBA, 0xDD,
+ 0x60, 0x37, 0x21, 0x02, 0xAF, 0x99, 0xE6, 0xDC, 0x12, 0xF5, 0x4F, 0xCE, 0x9A, 0xC2, 0x19, 0xB9,
+ 0xB2, 0x9E, 0x87, 0x83, 0xA8, 0x06, 0x56, 0x7D, 0xB7, 0x7F, 0x73, 0x38, 0xDC, 0xE9, 0xC7, 0x75,
+ 0x63, 0xCA, 0x3C, 0x07, 0x06, 0x6A, 0x9E, 0x97, 0x14, 0x2E, 0xED, 0x40, 0x58, 0x3D, 0x9F, 0x52,
+ 0x8F, 0x52, 0x40, 0x3A, 0x2A, 0xBB, 0x3B, 0xE1, 0x8B, 0xEA, 0xD4, 0xCD, 0xC0, 0xE9, 0x68, 0x15,
+ 0x53, 0x93, 0x59, 0xC1, 0x3A, 0x50, 0xD6, 0x98, 0xF5, 0x4E, 0xBC, 0x87, 0x3E, 0x3A, 0x2E, 0xB0,
+ 0x03, 0x88, 0x40, 0x5B, 0x6A, 0x9B, 0x6D, 0x3D, 0xCB, 0x6C, 0x1B, 0x0A, 0xAA, 0x7F, 0xBC, 0xE1,
+ 0x56, 0xF0, 0x62, 0x09, 0xC4, 0x04, 0xFB, 0xE2, 0x61, 0xAA, 0xDE, 0x73, 0xF3, 0x37, 0xA9, 0x49,
+ 0x98, 0x29, 0x05, 0x67, 0x7C, 0xB8, 0x78, 0xFE, 0xD6, 0xF8, 0xBF, 0x59, 0xD4, 0xF5, 0x20, 0x37,
+ 0xCC, 0x4C, 0x5A, 0xC5, 0x26, 0x17, 0x34, 0x8D, 0xB0, 0x30, 0x79, 0x92, 0x64, 0xAD, 0xFB, 0x6D,
+ 0x73, 0xD9, 0xD2, 0x5D, 0x4C, 0x52, 0x86, 0xB2, 0x4A, 0xE5, 0xDE, 0xF0, 0x58, 0x72, 0xE5, 0xB5,
+ 0xC3, 0x83, 0xD4, 0xFC, 0x7E, 0x2F, 0x2D, 0xAD, 0x90, 0x36, 0xCC, 0xD6, 0x49, 0x93, 0xFE, 0xA0,
+ 0x7A, 0xED, 0x8B, 0x85, 0x73, 0x65, 0x1A, 0xAD, 0xB2, 0xD5, 0xA1, 0x86, 0x8A, 0x43, 0x81, 0xD9,
+ 0x4F, 0xA0, 0x09, 0x4B, 0xBF, 0x2C, 0xBB, 0x12, 0x5C, 0xFF, 0xB6, 0x56, 0x26, 0x83, 0x98, 0x7A,
+ 0x31, 0x10, 0x72, 0x8F, 0x4F, 0x38, 0x75, 0xA4, 0x5D, 0xC3, 0x49, 0x88, 0x0B, 0x15, 0x86, 0x2D,
+ 0x30, 0x2F, 0x8B, 0xAD, 0xC2, 0x5B, 0xBE, 0xC7, 0x79, 0x04, 0x6A, 0x36, 0x2F, 0xD8, 0x27, 0xE2,
+ 0xD9, 0x58, 0x2A, 0x0A, 0xA2, 0x14, 0xCB, 0x59, 0x0F, 0xDC, 0x3C, 0x7D, 0x57, 0x0F, 0x47, 0x53,
+ 0x1E, 0x3E, 0x99, 0x6E, 0xF6, 0x3B, 0xE8, 0xCF, 0xE3, 0x13, 0x57, 0x14, 0xF5, 0x7C, 0x2F, 0x8B,
+ 0xD8, 0x83, 0x3B, 0x1A, 0x7D, 0x15, 0x0A, 0x8A, 0x67, 0x0F, 0x18, 0x21, 0x09, 0x8E, 0xE7, 0x4E,
+ 0xC2, 0x66, 0xF9, 0x53, 0x82, 0x24, 0x58, 0xF8, 0x3E, 0x41, 0x34, 0x71, 0x8E, 0x99, 0x87, 0x27,
+ 0xB9, 0x1F, 0x8A, 0xAD, 0x56, 0x56, 0x2D, 0x49, 0x00, 0xA4, 0xB2, 0x89, 0xFB, 0x8F, 0x50, 0x11,
+ 0xEB, 0x17, 0x6A, 0x51, 0x39, 0xD0, 0x23, 0x1F, 0x76, 0xD6, 0xF8, 0x41, 0x5B, 0x09, 0xDF, 0xEA,
+ 0x8B, 0x4E, 0x86, 0x56, 0x12, 0x56, 0x99, 0x8D, 0x1D, 0xC2, 0x15, 0x7C, 0x3C, 0x27, 0xAB, 0x6A,
+ 0x48, 0x5A, 0x14, 0x25, 0x1E, 0x69, 0x91, 0x03, 0x26, 0xF3, 0x87, 0xA5, 0x66, 0x14, 0x9E, 0xEA,
+ 0x78, 0xC7, 0xEC, 0x9B, 0x0A, 0x40, 0x56, 0x94, 0x78, 0x5A, 0x9D, 0x99, 0xAD, 0xD3, 0xFB, 0xC9,
+ 0x5D, 0xCE, 0x05, 0xAC, 0x6E, 0x95, 0x57, 0x6C, 0x4E, 0x04, 0xB5, 0xE4, 0x3B, 0xEF, 0x82, 0x70,
+ 0x1B, 0xC4, 0x38, 0x63, 0x0C, 0x66, 0x47, 0xB9, 0xDF, 0x4B, 0xF5, 0xB1, 0xAC, 0xB9, 0xB2, 0xB5,
+ 0xF1, 0xF2, 0xE0, 0x67, 0x39, 0x62, 0x1C, 0x0A, 0x4F, 0x10, 0xFA, 0xDA, 0xEC, 0x5A, 0xBD, 0x55,
+ 0x82, 0xB9, 0x5F, 0xB9, 0x1C, 0x7B, 0xC3, 0x88, 0x7F, 0xB6, 0x4A, 0x41, 0xA2, 0x02, 0xF2, 0x3E,
+ 0xE0, 0x0F, 0x1C, 0xD6, 0xC9, 0xB5, 0x6F, 0xFB, 0xD7, 0x16, 0x49, 0xB2, 0x14, 0xC9, 0x2C, 0x2B,
+ 0xC6, 0x45, 0x19, 0x84, 0x17, 0x87, 0xE1, 0xDC, 0x49, 0x48, 0x0B, 0x65, 0x47, 0x2B, 0xFE, 0x7C,
+ 0x75, 0x30, 0xFA, 0xB9, 0x40, 0x1C, 0xC2, 0xA2, 0x10, 0x43, 0xDE, 0x5E, 0xF1, 0x4D, 0xCE, 0x56,
+ 0xA9, 0x59, 0x5C, 0x7C, 0x37, 0x9A, 0x17, 0x8A, 0xEA, 0x2D, 0xFF, 0x32, 0xF7, 0xB7, 0x01, 0xEE,
+ 0xB6, 0xC6, 0xA1, 0xD7, 0xBB, 0x79, 0x88, 0x2B, 0xC6, 0x52, 0x7E, 0xCD, 0x75, 0x19, 0x88, 0xAB,
+ 0x51, 0x67, 0xFC, 0x5C, 0x11, 0x79, 0x49, 0x66, 0xE8, 0xE6, 0x48, 0x6B, 0x79, 0x0E, 0x35, 0x93,
+ 0x1E, 0xD4, 0x1E, 0xD7, 0xC8, 0x7A, 0xCE, 0x24, 0xF5, 0x01, 0x69, 0x16, 0xC1, 0xFB, 0x8B, 0x36,
+ 0x9E, 0x4F, 0x42, 0x0D, 0x7C, 0xB5, 0x8E, 0xDA, 0x2A, 0x07, 0x7D, 0xFF, 0xB3, 0x19, 0xB6, 0x33,
+ 0xF4, 0x2B, 0x25, 0xED, 0x7E, 0x21, 0xA2, 0x9A, 0x26, 0x0E, 0x0A, 0xE0, 0x98, 0x1F, 0xAD, 0x79,
+ 0xA6, 0x4C, 0xF6, 0x2D, 0xD1, 0xE2, 0x2C, 0x4B, 0xEA, 0xAB, 0x5E, 0xEB, 0x9E, 0xB0, 0xF4, 0xB5,
+ 0xFC, 0xCC, 0x68, 0xFF, 0x35, 0x1D, 0xBF, 0xEE, 0x3B, 0x22, 0xC1, 0x95, 0x4C, 0x39, 0x55, 0xE8,
+ 0xEA, 0x80, 0xD4, 0x9E, 0x9C, 0x8D, 0xFF, 0x22, 0x60, 0xC6, 0x56, 0x96, 0x86, 0x47, 0x3C, 0xA5,
+ 0xB8, 0xD5, 0x35, 0x97, 0xF7, 0x35, 0xC7, 0x08, 0x47, 0xE1, 0xAD, 0xC5, 0x28, 0x54, 0xCE, 0xF3,
+ 0xA9, 0x6A, 0x08, 0x38, 0xE9, 0x42, 0x6A, 0x2E, 0xC5, 0xC0, 0xA0, 0xA4, 0x62, 0x7D, 0xE0, 0x6F,
+ 0x56, 0x25, 0xEE, 0x90, 0xD9, 0x17, 0x05, 0x1A, 0x0C, 0xAB, 0xD3, 0xD2, 0xBA, 0xDE, 0xAB, 0xBA,
+ 0x8F, 0x85, 0x3E, 0xAF, 0x2E, 0xA1, 0x53, 0x02, 0x8A, 0x55, 0x91, 0x88, 0xB8, 0x92, 0x3E, 0x11,
+ 0xEF, 0xB4, 0x2B, 0x81, 0xE3, 0xCD, 0x0D, 0xEB, 0xC2, 0x5E, 0x34, 0xCB, 0x27, 0x56, 0x79, 0x69,
+ 0xD8, 0x3A, 0xC3, 0x91, 0x94, 0x47, 0xE9, 0xFC, 0x98, 0xA6, 0x74, 0x7E, 0xBE, 0x8D, 0x09, 0xB6,
+ 0x5C, 0x46, 0xA4, 0xD1, 0x7B, 0xF8, 0x78, 0x33, 0x88, 0xEF, 0xD6, 0x56, 0x66, 0x8B, 0x27, 0xB3,
+ 0x55, 0x27, 0xCB, 0xF5, 0xD1, 0x25, 0x15, 0x97, 0x70, 0x13, 0x09, 0x72, 0xEB, 0xE1, 0xD3, 0xF9,
+ 0x89, 0x75, 0x27, 0xF5, 0xA3, 0xA3, 0x00, 0xD6, 0x11, 0x1B, 0x09, 0xF9, 0xB9, 0x0B, 0x8C, 0xBA,
+ 0x40, 0xC0, 0x3F, 0x87, 0xCF, 0xC5, 0xAB, 0xB0, 0x50, 0x99, 0x72, 0x5E, 0xF6, 0x73, 0x48, 0xE8,
+ 0x0B, 0x4C, 0xDE, 0x49, 0xC0, 0xD7, 0x73, 0x21, 0x21, 0x2C, 0x22, 0x4D, 0x9D, 0xF9, 0x48, 0xA0,
+ 0x84, 0x1B, 0xCC, 0x34, 0x2F, 0x1C, 0x58, 0x7E, 0xC4, 0x75, 0xB5, 0x75, 0x28, 0xBC, 0xF8, 0x9C,
+ 0x5D, 0xEA, 0x3C, 0x94, 0xF3, 0x5F, 0x0A, 0x90, 0x4C, 0x64, 0xE4, 0xC2, 0x70, 0x69, 0x79, 0xC4,
+ 0x28, 0xDF, 0x94, 0x10, 0x43, 0x6F, 0xAD, 0x9A, 0xCC, 0xF3, 0x74, 0x28, 0xBA, 0xDB, 0x8F, 0xE5,
+ 0x5D, 0x1F, 0x2D, 0xDB, 0x0A, 0x99, 0x36, 0xA4, 0x50, 0x93, 0x53, 0xAC, 0x37, 0x71, 0x59, 0x64,
+ 0xFC, 0xD1, 0x89, 0x4F, 0x9E, 0x3A, 0xDC, 0x2C, 0xBB, 0x78, 0x1F, 0x19, 0x63, 0xD7, 0xB2, 0x55,
+ 0xF8, 0x96, 0xFC, 0x19, 0xA6, 0x46, 0xC5, 0xFB, 0xCC, 0x69, 0x97, 0xD4, 0x08, 0x3F, 0xD3, 0xB7,
+ 0x27, 0xD0, 0x52, 0x48, 0x0D, 0x42, 0xE3, 0x49, 0xFE, 0xDE, 0x4C, 0x04, 0x3F, 0x81, 0x48, 0x44,
+ 0x88, 0x29, 0x38, 0x11, 0x2A, 0x1F, 0x2B, 0x33, 0x13, 0x0F, 0x0F, 0x44, 0xAC, 0xEB, 0xBA, 0xE1,
+ 0x83, 0x15, 0x83, 0x52, 0x50, 0xD2, 0x80, 0x28, 0xED, 0x76, 0xE3, 0x59, 0xC8, 0xC1, 0x8C, 0x41,
+ 0x22, 0xBC, 0xD9, 0x5F, 0x50, 0x40, 0xFF, 0x5F, 0x66, 0x69, 0x1B, 0xD5, 0x47, 0x76, 0x44, 0xC0,
+ 0x85, 0xB5, 0x55, 0x70, 0x13, 0xAC, 0xEE, 0x11, 0x61, 0xAC, 0xFE, 0x1A, 0xA7, 0x43, 0xA9, 0x6D,
+ 0xB7, 0x94, 0x50, 0x81, 0x8D, 0xBE, 0xCC, 0xCE, 0xED, 0x62, 0xC4, 0x1B, 0x97, 0xFD, 0x10, 0x14,
+ 0xE6, 0x0E, 0x11, 0x16, 0x95, 0x6A, 0x5E, 0x0F, 0x87, 0x88, 0x72, 0xA7, 0x32, 0x9A, 0x05, 0xA2,
+ 0xC0, 0xD3, 0x23, 0x0C, 0xC0, 0x34, 0x93, 0x80, 0x51, 0x40, 0x9A, 0x25, 0x4D, 0x5D, 0x70, 0x87,
+ 0x4C, 0xCE, 0x45, 0xE2, 0x2D, 0x42, 0x5A, 0x36, 0x5A, 0x2A, 0x69, 0xF2, 0x81, 0xA0, 0x90, 0xFF,
+ 0xEB, 0xB5, 0x5A, 0x6B, 0xB5, 0x9F, 0x15, 0x6A, 0x0A, 0x39, 0xF0, 0x3A, 0x3F, 0xA7, 0x8F, 0xF5,
+ 0x1B, 0x81, 0xA9, 0x7F, 0xDF, 0x49, 0xEA, 0xC3, 0x6B, 0xC5, 0xC3, 0x23, 0xE5, 0x08, 0x8D, 0xFC,
+ 0xDE, 0x55, 0xEA, 0x65, 0xBE, 0x6E, 0x19, 0xB5, 0xAC, 0xD1, 0xE3, 0xC8, 0x70, 0x41, 0x40, 0x29,
+ 0xCC, 0xE1, 0xEA, 0x47, 0xC9, 0xB4, 0xB4, 0x86, 0x4C, 0xCC, 0x50, 0x54, 0x46, 0xC1, 0x5A, 0xC0,
+ 0x23, 0xEE, 0xF0, 0x4E, 0x7C, 0xEA, 0x5C, 0x22, 0x3D, 0x6E, 0x0C, 0xA2, 0x34, 0x11, 0x69, 0x89,
+ 0x5A, 0x95, 0xEB, 0x2A, 0x75, 0x13, 0x81, 0x8A, 0x14, 0xD0, 0x9F, 0x78, 0x90, 0x3F, 0xBC, 0xE6,
+ 0x64, 0x82, 0x7B, 0xF3, 0x5E, 0x40, 0x11, 0x1B, 0xF9, 0x21, 0x6A, 0x8F, 0x8B, 0x63, 0xCB, 0xD7,
+ 0x1E, 0x02, 0x05, 0xC6, 0x69, 0xAF, 0x0C, 0x3B, 0xAE, 0x7B, 0x53, 0x6F, 0x5B, 0x99, 0x1D, 0x46,
+ 0x81, 0x99, 0xF2, 0xC6, 0xEE, 0xDB, 0x2E, 0x23, 0xC3, 0xBB, 0x44, 0xB2, 0xD3, 0xC5, 0x6D, 0x96,
+ 0xBA, 0x7F, 0x70, 0x78, 0xC2, 0x31, 0xD8, 0xF5, 0x40, 0xD8, 0xB0, 0x2A, 0x48, 0x09, 0xB5, 0x91,
+ 0x77, 0x35, 0x9B, 0x2E, 0x87, 0xEF, 0x9E, 0x37, 0xA3, 0x2B, 0x68, 0xC4, 0xA2, 0x01, 0x48, 0x51,
+ 0x5C, 0xEF, 0xE7, 0x47, 0x97, 0x55, 0x85, 0x24, 0xCE, 0x8C, 0x20, 0xFF, 0x9D, 0x7E, 0x4D, 0x09,
+ 0xC3, 0xDE, 0x50, 0xDA, 0x52, 0x41, 0xCE, 0x75, 0x57, 0x2C, 0xDC, 0x45, 0x21, 0x33, 0xFB, 0x8C,
+ 0x72, 0xA4, 0x03, 0xF1, 0xEB, 0x86, 0x0D, 0x61, 0xA7, 0x95, 0xA4, 0xE7, 0xAD, 0x5A, 0x89, 0xCB,
+ 0x99, 0x02, 0xA1, 0xE9, 0x16, 0x64, 0x84, 0x18, 0xF6, 0x0F, 0x0E, 0x25, 0x45, 0x22, 0x5C, 0x56,
+ 0x59, 0x6D, 0x61, 0xAD, 0xC0, 0x05, 0x9A, 0x40, 0xD3, 0xCE, 0xE7, 0xA3, 0x92, 0x38, 0x3A, 0xEF,
+ 0xA9, 0xE0, 0x08, 0x35, 0x6D, 0x5B, 0x38, 0x40, 0x15, 0x6D, 0xE0, 0x4A, 0x43, 0x4B, 0x63, 0xDA,
+ 0x6A, 0x07, 0x7E, 0xB1, 0xCD, 0x12, 0xDC, 0x05, 0xA2, 0x23, 0x57, 0x28, 0x7A, 0x0D, 0xB4, 0x89,
+ 0xBD, 0xA3, 0xDB, 0xF4, 0x70, 0x8B, 0x12, 0xFC, 0xD0, 0x75, 0x40, 0x7D, 0x92, 0x8C, 0x5C, 0xD7,
+ 0xA7, 0xE4, 0x6D, 0x7B, 0x92, 0x89, 0x0C, 0xF4, 0xFA, 0xE5, 0x49, 0x15, 0x80, 0x68, 0x88, 0x25,
+ 0xC5, 0x93, 0xAF, 0x78, 0x8E, 0x92, 0x31, 0xE8, 0xBA, 0x9B, 0xEC, 0x93, 0x2E, 0x06, 0xBC, 0x87,
+ 0x30, 0x6E, 0x6F, 0x42, 0x31, 0xC6, 0xCD, 0xEA, 0xE2, 0x43, 0xDF, 0xA6, 0x2C, 0xFE, 0x05, 0x4E,
+ 0x63, 0xD6, 0x63, 0xD8, 0x46, 0x56, 0xD8, 0xB2, 0x6E, 0x4F, 0xDC, 0xF5, 0x23, 0xDE, 0x49, 0xAD,
+ 0xE8, 0x2D, 0x00, 0xEA, 0xAD, 0xE6, 0xE4, 0x4A, 0x48, 0x78, 0x20, 0xCC, 0xC0, 0x47, 0x22, 0xB4,
+ 0xB3, 0xB8, 0xAF, 0x71, 0x1D, 0x89, 0x68, 0xD6, 0x18, 0x70, 0x34, 0xAD, 0xFF, 0x99, 0xB3, 0x41,
+ 0xD4, 0x6B, 0x93, 0xB5, 0x47, 0x54, 0xB3, 0x7D, 0xF5, 0x5F, 0xA3, 0x6E, 0x54, 0x1A, 0x59, 0x11,
+ 0x53, 0x83, 0xAC, 0x23, 0xC2, 0x1F, 0x39, 0x64, 0x11, 0x67, 0x11, 0xBF, 0x50, 0xDB, 0x5D, 0x1D,
+ 0x74, 0x48, 0xDC, 0xF3, 0xBE, 0x55, 0xAA, 0x53, 0xDB, 0xC8, 0x5C, 0x79, 0xEA, 0xB3, 0x28, 0x7A,
+ 0xB6, 0xDB, 0x71, 0x7F, 0xD7, 0xCF, 0x39, 0x77, 0xFD, 0xCE, 0x8B, 0x9F, 0x1A, 0x27, 0x14, 0x3C,
+ 0x78, 0x58, 0x18, 0xE5, 0x93, 0xDD, 0x81, 0x24, 0xF8, 0xFE, 0x97, 0x3C, 0xA8, 0x8F, 0xFE, 0x6C,
+ 0xA1, 0xDB, 0xE2, 0xCF, 0x59, 0x9B, 0x28, 0xC2, 0xAB, 0x59, 0x13, 0x98, 0xDD, 0x2F, 0x03, 0xD0,
+ 0x05, 0x93, 0x72, 0x97, 0x07, 0xA0, 0xBC, 0xC3, 0x8B, 0x47, 0xDF, 0x55, 0x1C, 0x0E, 0x70, 0x6D,
+ 0xEF, 0x48, 0x0E, 0x33, 0x0D, 0x5F, 0x05, 0xF5, 0x98, 0xAC, 0xE3, 0xEE, 0x8F, 0x9D, 0xBD, 0x84,
+ 0xB7, 0x9C, 0x8C, 0x06, 0x60, 0x86, 0xB1, 0xDE, 0x80, 0xB3, 0xAC, 0xD7, 0xE8, 0x35, 0xDC, 0x51,
+ 0x57, 0x8F, 0xE8, 0x7A, 0xC8, 0xC2, 0x46, 0x3A, 0x22, 0x4D, 0x15, 0x6B, 0x9E, 0x0A, 0xB3, 0xFF,
+ 0x11, 0xD9, 0x2D, 0xE0, 0x5A, 0x32, 0xBB, 0x0D, 0x72, 0x0F, 0x8B, 0xB2, 0xD9, 0x86, 0x2D, 0x5F,
+ 0x57, 0x92, 0xBF, 0xAF, 0x00, 0x5C, 0xE2, 0x54, 0x91, 0x51, 0x22, 0xA9, 0x3A, 0x48, 0x9F, 0x8E,
+ 0xF0, 0xA8, 0x04, 0x1F, 0xD3, 0x58, 0x00, 0xB3, 0xDC, 0x7B, 0x99, 0x74, 0x18, 0x12, 0x44, 0x35,
+ 0x65, 0x1A, 0x1E, 0x95, 0xCC, 0x73, 0x53, 0xBB, 0xFC, 0x90, 0x07, 0x68, 0x2B, 0x46, 0x69, 0xF2,
+ 0x68, 0x6E, 0x62, 0x31, 0x5B, 0x11, 0x10, 0x9C, 0x18, 0x70, 0x29, 0x0D, 0x1A, 0x88, 0xD8, 0xA5,
+ 0xC6, 0x2C, 0xAA, 0xB7, 0x80, 0xC6, 0x36, 0xB0, 0x4E, 0x3C, 0x68, 0x74, 0xB8, 0xFE, 0xF6, 0x82,
+ 0x5D, 0x74, 0x71, 0xBE, 0xD1, 0x3C, 0xE0, 0x2D, 0x20, 0x3A, 0x36, 0xA9, 0x87, 0x76, 0xAA, 0x16,
+ 0xB7, 0x6F, 0xB8, 0x66, 0x05, 0xEB, 0x63, 0x15, 0xB6, 0xDE, 0x01, 0x49, 0xF5, 0x01, 0x37, 0xF0,
+ 0x98, 0x11, 0xC9, 0x43, 0x5D, 0xCB, 0x04, 0x48, 0x75, 0xD4, 0x73, 0x97, 0xE6, 0xD5, 0xEF, 0x97,
+ 0x8C, 0xF7, 0x37, 0xC8, 0xDA, 0xAB, 0x53, 0x12, 0x44, 0xF5, 0x72, 0xE7, 0x58, 0xBD, 0x2A, 0x65,
+ 0xE5, 0x79, 0x8D, 0xA5, 0x50, 0xBF, 0x3E, 0x3B, 0x36, 0x9D, 0x48, 0x73, 0xA0, 0x17, 0x4C, 0x8E,
+ 0x82, 0x98, 0xD0, 0xFD, 0xB1, 0xDB, 0x16, 0xBE, 0x05, 0x70, 0xBE, 0xEF, 0x43, 0x8A, 0xE8, 0xB8,
+ 0x79, 0x83, 0xBC, 0x3B, 0x23, 0x94, 0xAD, 0xA8, 0xD9, 0x98, 0x74, 0x4C, 0x91, 0x48, 0x22, 0x96,
+ 0x7D, 0x0E, 0x78, 0xF9, 0x35, 0xC0, 0xAE, 0xFD, 0x0A, 0xB0, 0xF0, 0x6C, 0xA7, 0x51, 0x4D, 0x44,
+ 0xD9, 0xBD, 0x84, 0x76, 0x48, 0x4A, 0x66, 0x41, 0x55, 0xA6, 0xBE, 0xA4, 0xA2, 0x3E, 0xDE, 0xA0,
+ 0xE4, 0x6F, 0xB9, 0xB2, 0xED, 0x74, 0xE2, 0x36, 0x2F, 0x54, 0x64, 0x9C, 0x41, 0xE6, 0xE3, 0xC8,
+ 0x35, 0x23, 0xD5, 0x61, 0x0E, 0x03, 0xCA, 0xFA, 0x17, 0xED, 0x05, 0x69, 0x9C, 0x7A, 0x58, 0x4D,
+ 0x16, 0x34, 0x15, 0xA3, 0x5B, 0x0C, 0x87, 0x0F, 0x02, 0xD2, 0xB3, 0xAF, 0x00, 0xC2, 0x1D, 0x39,
+ 0x87, 0x21, 0xF3, 0x9F, 0x96, 0xD2, 0xA1, 0x8C, 0xBE, 0xFB, 0xF4, 0xAB, 0x0B, 0x65, 0x3A, 0xF9,
+ 0xB7, 0x00, 0x91, 0x53, 0xE6, 0xF8, 0x9E, 0xD3, 0x65, 0xFE, 0xEB, 0x00, 0x6D, 0x15, 0x00, 0x7A,
+ 0x4D, 0xE8, 0xD2, 0xF9, 0xB7, 0xBC, 0x41, 0xBC, 0x90, 0x29, 0xEF, 0x72, 0xAE, 0x38, 0xE8, 0x25,
+ 0x77, 0xEC, 0x55, 0xFF, 0x1D, 0x71, 0x79, 0x8E, 0x7F, 0x32, 0x87, 0x39, 0x46, 0x58, 0x06, 0x19,
+ 0xBB, 0xC0, 0x77, 0x5A, 0x3E, 0xB5, 0xE2, 0x35, 0x7C, 0x24, 0xB5, 0xCC, 0x68, 0xA3, 0x2C, 0xC2,
+ 0xF4, 0x48, 0x39, 0x21, 0x25, 0x46, 0xE1, 0x2B, 0x08, 0x8D, 0x5E, 0xDC, 0x85, 0x4E, 0x03, 0x59,
+ 0x21, 0x42, 0x2C, 0x0F, 0x65, 0xC8, 0xF9, 0x27, 0x7C, 0x28, 0x0A, 0xAF, 0x2E, 0x88, 0x88, 0x0E,
+ 0xB7, 0xB7, 0xB7, 0x01, 0xCA, 0xD8, 0x19, 0xC8, 0x43, 0xE5, 0xCD, 0xBB, 0xBE, 0xC2, 0x74, 0xDE,
+ 0x1F, 0xBA, 0x0B, 0x4C, 0x40, 0x30, 0xEA, 0xC4, 0x76, 0xE7, 0x30, 0xE9, 0xDA, 0x19, 0x30, 0x33,
+ 0x86, 0xD8, 0xC7, 0x47, 0xB3, 0xBB, 0x7A, 0x0D, 0x5F, 0xF1, 0x44, 0x8A, 0xE5, 0x2F, 0x86, 0xC9,
+ 0xCF, 0x5A, 0xF5, 0x12, 0xA1, 0xC8, 0x7B, 0x5F, 0x83, 0x98, 0x96, 0x2D, 0x6A, 0x99, 0xE8, 0xE5,
+ 0xD7, 0x4E, 0x6D, 0x0A, 0x51, 0xCA, 0x90, 0x8F, 0x17, 0x4A, 0x02, 0x94, 0xAF, 0xBC, 0xB9, 0x64,
+ 0x2A, 0xFD, 0x29, 0x84, 0x40, 0x53, 0x71, 0xD6, 0x85, 0xEF, 0x26, 0xD4, 0x33, 0x6C, 0x18, 0x8C,
+ 0x4F, 0x4A, 0xFB, 0xA9, 0xAC, 0x24, 0x63, 0xED, 0x61, 0x20, 0x9C, 0x3A, 0xF0, 0xCF, 0x60, 0xDB,
+ 0xA2, 0xB8, 0xB7, 0x61, 0xB7, 0x0E, 0x68, 0xC3, 0xCB, 0x08, 0x69, 0xA2, 0x08, 0x7B, 0xB4, 0xCB,
+ 0xBA, 0x4A, 0x89, 0x26, 0x38, 0xED, 0x8D, 0x7B, 0x56, 0x27, 0xE1, 0x00, 0xB9, 0x18, 0x7F, 0xDC,
+ 0x42, 0x7C, 0x0D, 0xD6, 0x58, 0x93, 0xC9, 0x6F, 0x56, 0x22, 0x9A, 0x8C, 0x80, 0x19, 0xBA, 0x0F,
+ 0xE0, 0x52, 0x22, 0x1D, 0x98, 0xA7, 0x98, 0x85, 0xCE, 0x21, 0xE2, 0x6E, 0x70, 0x9E, 0x4F, 0xE5,
+ 0x04, 0x35, 0xEA, 0x66, 0x88, 0x22, 0x63, 0xB9, 0x17, 0x1A, 0xFA, 0x56, 0x35, 0x06, 0xB4, 0x27,
+ 0x2C, 0x8F, 0xE3, 0x13, 0x47, 0xCC, 0xA8, 0xC6, 0x46, 0x54, 0x57, 0xD8, 0x70, 0xFF, 0x86, 0x4C,
+ 0xB3, 0xF2, 0x0E, 0x29, 0x5E, 0xD8, 0x88, 0x4C, 0x5A, 0x16, 0x1A, 0x79, 0x41, 0x87, 0x70, 0x52,
+ 0x1E, 0xBA, 0x02, 0xCC, 0xA3, 0xC9, 0xEF, 0x53, 0x12, 0x56, 0x6D, 0x55, 0xBF, 0x8B, 0xAF, 0xFD,
+ 0x12, 0xE0, 0x2D, 0x27, 0x83, 0x9F, 0x8E, 0x2E, 0x1B, 0x7A, 0x22, 0x6D, 0xF9, 0x59, 0xF9, 0x63,
+ 0x7F, 0xB0, 0xBF, 0x05, 0x97, 0x78, 0x2E, 0x67, 0xC3, 0xA8, 0x4B, 0x16, 0xCB, 0x72, 0x47, 0xFD,
+ 0x0C, 0x0F, 0xAE, 0xC9, 0xB4, 0xB6, 0xE8, 0x99, 0xAA, 0xA3, 0x60, 0xF4, 0xD2, 0x07, 0xF5, 0x82,
+ 0xDA, 0x7B, 0xE6, 0x6E, 0xCC, 0x85, 0xD3, 0x2E, 0xC1, 0x13, 0x3D, 0x32, 0xBE, 0xBB, 0x25, 0xA5,
+ 0x2E, 0x00, 0xAA, 0x28, 0x63, 0x2B, 0x61, 0x3E, 0x7F, 0x34, 0xA0, 0x83, 0xCE, 0xEC, 0x44, 0x72,
+ 0x29, 0x1F, 0x81, 0x62, 0x8A, 0xED, 0x9D, 0x5F, 0xFD, 0xFE, 0x14, 0x52, 0x9C, 0xFC, 0xB4, 0x04,
+ 0x70, 0x0A, 0x27, 0x7E, 0x94, 0x69, 0x13, 0x80, 0x97, 0xCC, 0xD2, 0x69, 0xDD, 0xD1, 0x38, 0xFA,
+ 0x51, 0x88, 0xC0, 0x9D, 0xB6, 0x14, 0xE3, 0x20, 0xEB, 0x69, 0x62, 0xF4, 0xB7, 0x07, 0xF2, 0x6F,
+ 0xFE, 0xDA, 0xE3, 0xF9, 0x7A, 0x64, 0x70, 0xAD, 0x11, 0x10, 0x54, 0x6B, 0x9F, 0x8B, 0x48, 0x9C,
+ 0x19, 0x27, 0x83, 0x20, 0x29, 0x3E, 0x7C, 0x57, 0x0E, 0x6E, 0x4F, 0x0B, 0xB7, 0xB2, 0x6D, 0x61,
+ 0x52, 0xE0, 0xE5, 0x67, 0xDB, 0xF9, 0x96, 0xBA, 0xF2, 0xA6, 0x4D, 0x2A, 0x98, 0xDF, 0x2F, 0x03,
+ 0xD1, 0x78, 0xB4, 0xF9, 0x08, 0x2A, 0x7C, 0xBA, 0xD6, 0x53, 0x57, 0x6A, 0x2C, 0x8D, 0xF4, 0xDC,
+ 0xA9, 0x05, 0x00, 0xA6, 0x8C, 0xFB, 0xFF, 0x45, 0x13, 0xF4, 0xE8, 0xBD, 0xB5, 0xF4, 0x1D, 0xF7,
+ 0x5F, 0x32, 0xC8, 0x30, 0x1F, 0xD5, 0x0A, 0xC7, 0xA4, 0x28, 0x06, 0xFF, 0x44, 0x18, 0x43, 0x1A,
+ 0x8C, 0x63, 0x81, 0x2B, 0x16, 0x4C, 0xE4, 0xB0, 0xF4, 0x9A, 0x49, 0x09, 0x7B, 0x8B, 0x6F, 0x93,
+ 0x2E, 0xEC, 0x8C, 0x4F, 0x71, 0x01, 0xFF, 0x54, 0x90, 0x1B, 0x6C, 0xF1, 0x9B, 0xB1, 0x06, 0xDA,
+ 0xFC, 0xD4, 0xD6, 0xFB, 0x10, 0xDA, 0x46, 0x8C, 0x0E, 0xAF, 0xF8, 0x19, 0xC0, 0x35, 0xA5, 0xD2,
+ 0x74, 0xFD, 0x25, 0xEF, 0xDD, 0x2E, 0x9C, 0x0B, 0xE1, 0x17, 0xD5, 0x0C, 0xFB, 0xC1, 0xA8, 0xE6,
+ 0x4A, 0x44, 0x0A, 0xF2, 0x48, 0xA2, 0x07, 0x42, 0x3C, 0x36, 0xC5, 0xD7, 0x45, 0x9D, 0xDB, 0xA6,
+ 0x4B, 0x30, 0xC1, 0x3A, 0xB0, 0x31, 0x88, 0x0E, 0xB1, 0x38, 0x4E, 0x34, 0xF9, 0x33, 0xE2, 0x8A,
+ 0x0B, 0xF7, 0x7C, 0xF1, 0xE3, 0x07, 0x5A, 0xA0, 0x63, 0x12, 0x22, 0xFD, 0x44, 0x8A, 0xE7, 0x35,
+ 0xF7, 0x24, 0xAD, 0x6F, 0xBA, 0xC1, 0xA3, 0x2F, 0x6C, 0x58, 0xF3, 0xD3, 0x13, 0x4D, 0x21, 0x0A,
+ 0xA1, 0x1C, 0x54, 0xAA, 0x5E, 0x35, 0xEF, 0x00, 0x48, 0xE8, 0xDE, 0x56, 0xA4, 0xFF, 0xBB, 0xD9,
+ 0xF9, 0xA7, 0x0D, 0x83, 0x08, 0x8B, 0x41, 0xDC, 0x63, 0xA4, 0x40, 0x62, 0x46, 0xAD, 0x57, 0x49,
+ 0x43, 0x67, 0x6D, 0x43, 0x23, 0x19, 0x7E, 0x17, 0xF6, 0xEF, 0xDE, 0x07, 0xF2, 0x5D, 0x11, 0x78,
+ 0x42, 0x8D, 0x11, 0xEF, 0x9F, 0x4A, 0xA6, 0xCE, 0x95, 0x92, 0x34, 0x20, 0x02, 0x95, 0xB9, 0xA8,
+ 0x16, 0xF5, 0x5E, 0x2F, 0x7C, 0xF8, 0xE2, 0x07, 0xB8, 0xF4, 0x07, 0x30, 0x1C, 0x77, 0xD3, 0x46,
+ 0x11, 0x07, 0x8D, 0x6D, 0x69, 0x87, 0xB4, 0x91, 0xCB, 0x72, 0x8E, 0x2D, 0xAD, 0x0E, 0xCD, 0x97,
+ 0x8C, 0xA4, 0x0D, 0x05, 0x93, 0xAF, 0x42, 0xDE, 0x74, 0xF8, 0x97, 0x3B, 0x7F, 0xBF, 0x4D, 0x6A,
+ 0x12, 0xE4, 0xE2, 0xF2, 0xAF, 0x6D, 0x1F, 0x31, 0xCA, 0x81, 0x33, 0x2F, 0x42, 0x42, 0xCE, 0x48,
+ 0x31, 0xD9, 0x09, 0x2A, 0x70, 0xDF, 0x75, 0xE3, 0x9C, 0x42, 0xEF, 0x8A, 0xB1, 0x96, 0x6B, 0xA1,
+ 0xBC, 0x2C, 0x84, 0x77, 0xE9, 0x3D, 0x13, 0x3C, 0x04, 0x9F, 0xC8, 0x70, 0xC3, 0x26, 0xF0, 0xE3,
+ 0xC5, 0x04, 0xD3, 0xEA, 0x02, 0x10, 0x7E, 0xD2, 0xB5, 0x32, 0x87, 0x8D, 0x02, 0xA8, 0x1B, 0x19,
+ 0x7D, 0x6A, 0x54, 0x45, 0x62, 0x06, 0xD3, 0x28, 0x32, 0xAC, 0x2A, 0x1E, 0xA1, 0xC3, 0x56, 0x96,
+ 0xCB, 0xA4, 0x3A, 0x6F, 0xCB, 0x2B, 0xBC, 0xCF, 0x7F, 0x75, 0xE9, 0x05, 0x12, 0x24, 0xC0, 0xD4,
+ 0x97, 0xAB, 0xCF, 0x4D, 0x38, 0x23, 0x87, 0xE6, 0x3D, 0x22, 0xE6, 0x3D, 0xE1, 0xE7, 0x45, 0xF6,
+ 0x62, 0xF3, 0xAB, 0x9B, 0x0C, 0x11, 0x23, 0x57, 0x56, 0x57, 0xB7, 0xD8, 0x58, 0x37, 0x5A, 0x8C,
+ 0x1F, 0x31, 0xA8, 0x29, 0x1A, 0x04, 0xE2, 0xA7, 0x4A, 0xC7, 0x27, 0xCC, 0x39, 0x0E, 0xEF, 0x7F,
+ 0xD4, 0xE1, 0x46, 0xCD, 0xCC, 0x96, 0x22, 0xBC, 0x0E, 0xDD, 0xDF, 0xCA, 0xDB, 0x77, 0x65, 0x49,
+ 0x7C, 0x2F, 0x2C, 0xC0, 0x94, 0x05, 0x71, 0xC2, 0x23, 0x5E, 0x74, 0xC3, 0x4E, 0x59, 0xA9, 0xE2,
+ 0xD1, 0x0F, 0x2B, 0x68, 0x5E, 0x6C, 0x6B, 0x3C, 0xD4, 0x7C, 0x42, 0xE4, 0x26, 0x79, 0xAE, 0xFB,
+ 0x14, 0x65, 0x56, 0x75, 0x6F, 0xA6, 0x70, 0xB9, 0x2E, 0x28, 0x94, 0xF1, 0xD2, 0xE3, 0xDA, 0x1C,
+ 0x4B, 0xF2, 0x71, 0x8A, 0xED, 0xE6, 0x20, 0x1C, 0xF4, 0xEE, 0x63, 0xBB, 0x74, 0x73, 0x61, 0xD9,
+ 0x55, 0x84, 0xED, 0xD9, 0x59, 0x1B, 0x47, 0x8B, 0xE5, 0xEF, 0xBF, 0xA5, 0x78, 0xB4, 0x99, 0x7E,
+ 0xF3, 0x31, 0x59, 0x2A, 0xC8, 0x23, 0xB9, 0x0A, 0x81, 0xE2, 0x4C, 0x8A, 0x97, 0xBC, 0x74, 0x08,
+ 0xE4, 0x35, 0x2D, 0xD1, 0x3C, 0xBA, 0xF2, 0x20, 0x51, 0x76, 0xF8, 0xFD, 0x20, 0x5D, 0xD2, 0x63,
+ 0x7D, 0xA3, 0xEF, 0x7D, 0x56, 0x46, 0x44, 0x86, 0x29, 0x70, 0xC3, 0x5F, 0x1B, 0xC6, 0x3D, 0x42,
+ 0xD3, 0x69, 0x78, 0x5C, 0xD3, 0xD4, 0x79, 0x3B, 0x0B, 0x81, 0x48, 0x00, 0xAA, 0xEA, 0x4C, 0x95,
+ 0x56, 0x20, 0xE8, 0xB1, 0xB6, 0xE9, 0xA7, 0xD6, 0x0F, 0x4F, 0x5B, 0xB1, 0xC3, 0xCD, 0xF6, 0x43,
+ 0x83, 0x6C, 0x4C, 0xA3, 0x17, 0x58, 0xAB, 0x06, 0x68, 0xBB, 0x14, 0x50, 0x07, 0xBC, 0x7B, 0x75,
+ 0x9B, 0x5F, 0x96, 0xC6, 0x79, 0xFF, 0x3C, 0x6A, 0x05, 0x5B, 0xA4, 0x63, 0xA3, 0x93, 0x6F, 0x6F,
+ 0x87, 0xE8, 0xAF, 0x44, 0x48, 0x02, 0x49, 0x4C, 0xED, 0x8C, 0x3A, 0x51, 0x50, 0x43, 0x6F, 0xE6,
+ 0x2A, 0x5E, 0x47, 0x25, 0x05, 0xFB, 0x68, 0x17, 0x2D, 0x90, 0xEB, 0xE2, 0x76, 0xAB, 0x6B, 0x99,
+ 0xB3, 0x84, 0x59, 0xD0, 0xFD, 0x6A, 0x60, 0x6E, 0x4F, 0x46, 0xA0, 0x37, 0xE7, 0x06, 0xB6, 0x15,
+ 0xC9, 0x00, 0xEC, 0x00, 0x38, 0x0A, 0x8F, 0x81, 0xDB, 0xAB, 0xBA, 0xE7, 0xD3, 0x88, 0xF0, 0x1B,
+ 0x5D, 0xE9, 0x41, 0xAC, 0xA0, 0xBC, 0x47, 0x93, 0x73, 0x04, 0x72, 0x88, 0x63, 0x91, 0xD8, 0x60,
+ 0x82, 0xAA, 0x2D, 0x49, 0xA4, 0xFF, 0xFF, 0x0C, 0xCF, 0x16, 0x73, 0x74, 0xFE, 0x5F, 0x72, 0x90,
+ 0x8C, 0x5E, 0x82, 0x2D, 0x6E, 0xDA, 0x8B, 0x30, 0xA6, 0x39, 0xFB, 0x2A, 0x92, 0xC5, 0x0D, 0x49,
+ 0x3A, 0x59, 0x3E, 0x0D, 0xA7, 0xBB, 0x0B, 0x28, 0x46, 0x99, 0x6E, 0x7E, 0x6C, 0xD7, 0x6B, 0x89,
+ 0x8D, 0x1A, 0x85, 0x1D, 0x7E, 0x1A, 0xE8, 0xC8, 0xEF, 0x8F, 0xDD, 0x00, 0xF8, 0x4F, 0xAE, 0x12,
+ 0xF6, 0x88, 0x91, 0x36, 0xF9, 0xDB, 0x09, 0xDD, 0xF7, 0xD5, 0xB3, 0xC8, 0x90, 0x0C, 0xC4, 0xB0,
+ 0x45, 0xD2, 0x96, 0xBF, 0x61, 0xE3, 0xD8, 0xD1, 0x4F, 0xDB, 0x1B, 0xF6, 0xA8, 0x0D, 0x40, 0xF0,
+ 0xEF, 0x23, 0x26, 0x2F, 0x25, 0xAB, 0x0E, 0x15, 0xB6, 0x90, 0x1F, 0xA3, 0x6B, 0xEE, 0x93, 0xD4,
+ 0x57, 0xA7, 0x78, 0x39, 0xB4, 0x79, 0x2B, 0x9E, 0xE7, 0xFA, 0x2E, 0x1D, 0xAA, 0x41, 0xEB, 0x87,
+ 0x99, 0x4E, 0x78, 0x42, 0x47, 0x9D, 0x43, 0x80, 0x9F, 0x56, 0x13, 0x5E, 0x3D, 0x95, 0xF8, 0xB4,
+ 0x76, 0x9F, 0x72, 0x83, 0x81, 0xB1, 0x74, 0xDE, 0x43, 0xBE, 0x91, 0x57, 0x71, 0x90, 0x3C, 0xA0,
+ 0x1F, 0xA0, 0x87, 0x07, 0x47, 0xDF, 0x5C, 0xFD, 0x21, 0xD6, 0x64, 0x4C, 0x72, 0xFB, 0xCE, 0x21,
+ 0xC5, 0x89, 0x23, 0x0B, 0xAE, 0x75, 0x72, 0x73, 0xA6, 0xA6, 0xB3, 0xCE, 0x9C, 0xB1, 0xAF, 0xAB,
+ 0xDF, 0x06, 0x55, 0x5F, 0x0C, 0x1D, 0x6D, 0x13, 0xD1, 0xD2, 0xF0, 0x54, 0x00, 0xAE, 0xA6, 0x51,
+ 0xF2, 0x8B, 0x50, 0xF5, 0x5D, 0x76, 0xC9, 0x4D, 0x55, 0x3C, 0x6F, 0xC7, 0xCB, 0xD1, 0x43, 0xEB,
+ 0x52, 0xCE, 0x84, 0x00, 0x90, 0xEB, 0xBD, 0x54, 0xC9, 0x04, 0x3B, 0x4B, 0xA9, 0x5D, 0x53, 0x0D,
+ 0xB6, 0x13, 0x55, 0xD4, 0x36, 0xEB, 0x71, 0x23, 0x00, 0x98, 0xB3, 0xB9, 0x73, 0x8B, 0x0B, 0xD3,
+ 0xB9, 0x67, 0x50, 0x28, 0xBC, 0xCC, 0x16, 0xD5, 0xDE, 0x72, 0x5B, 0x75, 0x7B, 0x12, 0xF6, 0x3C,
+ 0x94, 0xAE, 0x3E, 0xEF, 0x44, 0x3B, 0x9E, 0x8F, 0x80, 0x1C, 0x18, 0x5F, 0x9B, 0x43, 0x4F, 0xF5,
+ 0xB1, 0xD7, 0x8A, 0x42, 0xA0, 0x51, 0x74, 0x86, 0x0F, 0x31, 0x18, 0x6C, 0x47, 0xF8, 0xB9, 0x97,
+ 0x0F, 0x4B, 0x47, 0x18, 0xF6, 0x5C, 0x70, 0x49, 0xBF, 0xF5, 0x00, 0x08, 0xC6, 0xD7, 0x04, 0x79,
+ 0xE2, 0xE5, 0x05, 0xAA, 0x00, 0x4A, 0xE0, 0xA8, 0x62, 0xDC, 0xD7, 0x17, 0x7C, 0x8D, 0x17, 0x14,
+ 0x0A, 0x16, 0x3B, 0x0B, 0x70, 0x50, 0xF0, 0xB8, 0x1A, 0xE0, 0xB9, 0x8C, 0x04, 0xF0, 0xEB, 0xB1,
+ 0xCB, 0x15, 0x3C, 0xF6, 0xCE, 0xED, 0x40, 0xA2, 0x40, 0x36, 0x3A, 0xF0, 0xA8, 0x21, 0xF9, 0x31,
+ 0x49, 0x8A, 0xC8, 0x1D, 0x57, 0x63, 0xC3, 0x4E, 0x98, 0x3E, 0x2A, 0x0C, 0x41, 0xD9, 0x01, 0xF6,
+ 0xB5, 0xB4, 0xCD, 0x5C, 0xCE, 0x1A, 0x04, 0x81, 0xC4, 0x66, 0x38, 0xAA, 0x06, 0xC9, 0xDA, 0x42,
+ 0x8F, 0x26, 0x7D, 0xB3, 0x51, 0x43, 0x94, 0x1A, 0xC6, 0x8E, 0x2C, 0x78, 0xC4, 0x4E, 0x88, 0x40,
+ 0xF3, 0x38, 0x47, 0x4E, 0x0F, 0xA4, 0x29, 0xBC, 0xC2, 0x02, 0x1F, 0x58, 0x44, 0xF4, 0x1B, 0x8D,
+ 0x2B, 0x82, 0x15, 0x92, 0x80, 0xA2, 0x65, 0xBD, 0x50, 0x93, 0xC5, 0xF9, 0xEF, 0x18, 0x83, 0x45,
+ 0x51, 0x4A, 0x5C, 0xCC, 0x9C, 0x69, 0xF6, 0x96, 0x9E, 0xC0, 0x14, 0x2A, 0x48, 0x72, 0xBD, 0xEE,
+ 0x93, 0x4B, 0x50, 0xFF, 0xF4, 0x60, 0x62, 0x33, 0xE2, 0x0B, 0xD3, 0x63, 0xFE, 0xE6, 0xE5, 0xE9,
+ 0xB0, 0x1A, 0x25, 0x7F, 0x5B, 0xDC, 0xF7, 0xA0, 0x9A, 0x5B, 0x61, 0x76, 0x61, 0x5D, 0x1F, 0xE3,
+ 0x24, 0x02, 0x11, 0x28, 0x97, 0x0E, 0xCB, 0x95, 0x08, 0x1B, 0xD1, 0xA8, 0xD9, 0xE7, 0x91, 0xC6,
+ 0x47, 0x38, 0x10, 0xEC, 0x33, 0xE0, 0x45, 0xF4, 0xE8, 0xAF, 0xBD, 0xCB, 0x5C, 0x32, 0x38, 0x3D,
+ 0x49, 0xC6, 0x36, 0x62, 0xE3, 0x7D, 0x94, 0xC4, 0x05, 0xAF, 0x47, 0x0B, 0x01, 0x72, 0xF1, 0x76,
+ 0x2B, 0x7C, 0xCC, 0x62, 0xB2, 0xF4, 0xD4, 0xE0, 0x10, 0x02, 0x1D, 0xFD, 0x3B, 0xE3, 0x0F, 0x46,
+ 0x45, 0x18, 0x11, 0xF5, 0xBF, 0x15, 0xEB, 0xC7, 0xA4, 0x15, 0x96, 0x53, 0x02, 0xC1, 0xCD, 0xB0,
+ 0xC0, 0xD4, 0xE7, 0xBC, 0x47, 0x7F, 0xE3, 0xAD, 0x1F, 0x4A, 0xFF, 0x36, 0xB2, 0x83, 0x5D, 0x1B,
+ 0xF1, 0x2C, 0xE9, 0xE5, 0xDA, 0x17, 0x0F, 0x6C, 0x68, 0x55, 0x23, 0xEC, 0x28, 0x4C, 0x2B, 0xC3,
+ 0xC3, 0xC2, 0x26, 0x9D, 0xF0, 0x61, 0x8C, 0xDC, 0xD6, 0xDB, 0xDB, 0x3E, 0xF0, 0x37, 0x67, 0xBC,
+ 0x67, 0xFA, 0xCD, 0x17, 0xBC, 0xBA, 0xAC, 0x05, 0xA1, 0x50, 0x41, 0x0B, 0x18, 0x97, 0xE9, 0x7B,
+ 0xE9, 0xE5, 0xA5, 0x70, 0x14, 0x24, 0x7B, 0x75, 0x74, 0xCD, 0x9C, 0x9B, 0xA6, 0xC3, 0x6B, 0x10,
+ 0x7F, 0x9C, 0x6F, 0x8A, 0xE6, 0xDD, 0x30, 0xB0, 0x70, 0x7E, 0x46, 0xB5, 0xC5, 0xDE, 0x97, 0xE0,
+ 0x65, 0x64, 0x64, 0x3E, 0xAD, 0xA3, 0xA8, 0x0A, 0x69, 0xC7, 0x37, 0x5E, 0xCE, 0x17, 0xFD, 0x2B,
+ 0x0C, 0xAE, 0x04, 0xDE, 0xFB, 0x6A, 0x96, 0xD1, 0x6C, 0x32, 0x00, 0xC8, 0xBD, 0x4B, 0xB6, 0x9A,
+ 0xC5, 0xF7, 0xDA, 0xBC, 0xED, 0xA7, 0x11, 0x0D, 0x91, 0x75, 0xC3, 0xFF, 0x7A, 0xC9, 0x06, 0x18,
+ 0x1C, 0x31, 0x92, 0xC2, 0x49, 0x7B, 0xB4, 0xC6, 0xF8, 0xA3, 0x42, 0xC0, 0x37, 0xBE, 0xAD, 0x3C,
+ 0x06, 0xF5, 0x73, 0x62, 0xBF, 0xDE, 0x08, 0x77, 0x29, 0x52, 0x2E, 0x28, 0x57, 0xBF, 0xF9, 0x98,
+ 0xFA, 0xC3, 0x9F, 0xC4, 0xF4, 0xB2, 0xC2, 0x99, 0x4E, 0x45, 0x33, 0x50, 0xB4, 0x9A, 0x65, 0xC9,
+ 0xFB, 0x40, 0xC2, 0x77, 0xAC, 0xC8, 0x87, 0x1C, 0x9F, 0x7F, 0xD9, 0x1C, 0xE7, 0xC1, 0x04, 0x44,
+ 0xAB, 0xFA, 0x47, 0x5D, 0xE4, 0x89, 0x2D, 0xCF, 0x52, 0xC1, 0x24, 0x30, 0x3D, 0xAD, 0x1B, 0x25,
+ 0x34, 0xAF, 0x76, 0xBA, 0xE0, 0x26, 0xF2, 0x63, 0xD0, 0x68, 0xFA, 0x18, 0x07, 0xA4, 0x39, 0xEE,
+ 0xF2, 0xF0, 0xEC, 0xDD, 0xB4, 0x95, 0x4E, 0xBF, 0x46, 0x31, 0x39, 0xC7, 0x1D, 0xB6, 0xCB, 0x5F,
+ 0xA2, 0xA2, 0x62, 0x83, 0x11, 0xA5, 0xE9, 0xED, 0x92, 0xC2, 0xD8, 0x5B, 0x64, 0xD9, 0x65, 0xFE,
+ 0x18, 0xE8, 0xB1, 0xBD, 0xAD, 0xF2, 0xF9, 0xD0, 0x1D, 0xCB, 0x71, 0xDC, 0x49, 0x3F, 0x4F, 0xD9,
+ 0x9E, 0x17, 0x7F, 0xF6, 0x46, 0xA0, 0xFF, 0x99, 0x17, 0xA2, 0xE6, 0xEB, 0xDE, 0xB7, 0xAF, 0x26,
+ 0x4C, 0xFD, 0xDA, 0xE1, 0xFB, 0xEF, 0xAA, 0xC5, 0x2F, 0xF9, 0x31, 0x5C, 0xF6, 0x91, 0x70, 0xDA,
+ 0x66, 0xED, 0xB3, 0x51, 0x72, 0x95, 0x29, 0x22, 0xA5, 0xE2, 0x82, 0x0C, 0x43, 0xFE, 0x92, 0xFF,
+ 0x72, 0xA8, 0xD9, 0xF5, 0x6F, 0xCF, 0x63, 0xFC, 0x75, 0xD2, 0x33, 0x47, 0xAD, 0x01, 0x87, 0xC2,
+ 0xE6, 0xDE, 0xBB, 0xB9, 0xCF, 0xE2, 0x17, 0x50, 0x3A, 0x68, 0x31, 0xD1, 0xB6, 0xC9, 0x3F, 0x43,
+ 0x25, 0xBC, 0xB5, 0xF3, 0xC9, 0xF9, 0xF3, 0xB3, 0x11, 0x5E, 0xF6, 0xE0, 0xBF, 0xAF, 0x1B, 0x90,
+ 0xA3, 0x61, 0xA3, 0x36, 0xFB, 0xBF, 0x0E, 0x62, 0xDF, 0xCC, 0x9B, 0x51, 0x59, 0xFE, 0xA4, 0xFA,
+ 0xD1, 0x3A, 0x4B, 0xA5, 0x9A, 0xA8, 0x21, 0x01, 0x1D, 0x52, 0xAF, 0xBE, 0x74, 0x2D, 0x8B, 0x91,
+ 0x91, 0x98, 0xC9, 0xD1, 0x9C, 0x5B, 0x38, 0x12, 0x00, 0x2B, 0x12, 0x6F, 0x92, 0x7A, 0xC7, 0x45,
+ 0x16, 0xB8, 0xA7, 0xB3, 0x9F, 0x46, 0xF9, 0xAE, 0xBD, 0x13, 0xFB, 0xDD, 0xDB, 0x86, 0x8A, 0x94,
+ 0xFB, 0x10, 0x3B, 0xA3, 0x4D, 0x4C, 0x4D, 0xDD, 0xC2, 0x38, 0x22, 0x58, 0xC4, 0x34, 0xCE, 0x58,
+ 0x78, 0x89, 0x7B, 0x77, 0x28, 0x30, 0xD6, 0xC7, 0x44, 0x04, 0x52, 0x7A, 0x19, 0x1E, 0xF1, 0xFD,
+ 0xD3, 0x77, 0x5F, 0x50, 0x0D, 0xAE, 0xAE, 0xEF, 0x59, 0x06, 0xF4, 0x3D, 0x18, 0x43, 0x38, 0x51,
+ 0xD6, 0x3D, 0xC5, 0x23, 0x04, 0x1F, 0x5B, 0x25, 0x4C, 0x74, 0xB0, 0xC6, 0xEB, 0x76, 0xBA, 0xE8,
+ 0xB1, 0xA7, 0x44, 0xE2, 0x5C, 0xD4, 0x18, 0x1D, 0x34, 0x8D, 0xA8, 0x05, 0x25, 0x03, 0xA2, 0xD7,
+ 0xA3, 0x3F, 0x50, 0x07, 0x52, 0x09, 0x2D, 0x88, 0xFC, 0x2C, 0xF3, 0xAF, 0xB4, 0x89, 0x6A, 0xA0,
+ 0x27, 0x5F, 0xD3, 0x2B, 0x63, 0x8D, 0xD9, 0x60, 0x1B, 0xD3, 0x35, 0x18, 0x61, 0x93, 0xF6, 0x82,
+ 0xD8, 0xBC, 0x9F, 0x90, 0xB6, 0xB1, 0xCF, 0xFD, 0x3B, 0xD4, 0xA8, 0x07, 0x0D, 0x76, 0xF1, 0x44,
+ 0x4F, 0x45, 0x10, 0x4C, 0xFB, 0x92, 0x1A, 0x56, 0x48, 0x87, 0x15, 0x7B, 0x55, 0x3D, 0x10, 0xCE,
+ 0xD8, 0x07, 0x3A, 0x79, 0x72, 0x17, 0x5C, 0xF2, 0x9C, 0x84, 0xE1, 0x72, 0x36, 0x2A, 0xEB, 0xBB,
+ 0xEE, 0x3E, 0xC8, 0x1F, 0x33, 0x2F, 0x53, 0xDF, 0x6B, 0xE8, 0x3E, 0x0A, 0x5C, 0x32, 0x36, 0x81,
+ 0x77, 0x4A, 0xD6, 0xD0, 0xA8, 0x14, 0xBB, 0x32, 0xDC, 0x8B, 0x55, 0xB2, 0xEF, 0xD4, 0xE8, 0xCA,
+ 0xFF, 0x50, 0xDC, 0xBD, 0x55, 0xB5, 0x5E, 0xBE, 0x1B, 0x74, 0x8A, 0x57, 0x5B, 0xBC, 0xCC, 0x2F,
+ 0xF6, 0x72, 0x0C, 0xAF, 0x9F, 0x2A, 0x96, 0xBE, 0xDC, 0xBC, 0xFC, 0x3A, 0xA8, 0xDF, 0x3E, 0x2E,
+ 0x78, 0xA7, 0xD8, 0xA0, 0x2A, 0x95, 0x70, 0x24, 0xBC, 0x6C, 0x1A, 0xFA, 0xAA, 0xE6, 0xE1, 0x38,
+ 0xE4, 0x8A, 0xD8, 0x63, 0x03, 0x82, 0x3C, 0xFB, 0xA6, 0x9E, 0xB9, 0x69, 0xF6, 0x04, 0x60, 0x37,
+ 0x0B, 0xBC, 0xEF, 0x85, 0x70, 0xD4, 0xCB, 0xBE, 0x3E, 0xD3, 0xF2, 0x81, 0x37, 0x45, 0x1A, 0x94,
+ 0xB4, 0x02, 0xD9, 0xA2, 0xC8, 0x1D, 0x92, 0xE0, 0x5C, 0xA4, 0x5D, 0x43, 0xA5, 0xFA, 0x1D, 0xD3,
+ 0x18, 0x14, 0x0B, 0x18, 0x86, 0x74, 0x8E, 0x16, 0xB3, 0x65, 0xD3, 0x24, 0x45, 0x71, 0xA9, 0x28,
+ 0x46, 0x25, 0x68, 0x21, 0x94, 0x8D, 0xDB, 0xCA, 0x13, 0x3C, 0x0C, 0xB1, 0xBB, 0xF2, 0x6E, 0xC2,
+ 0x2D, 0x67, 0xBA, 0x0D, 0xA9, 0x5B, 0x3A, 0xD7, 0x45, 0xDC, 0x68, 0x94, 0x41, 0x30, 0xC1, 0xAD,
+ 0x0C, 0xEF, 0x7E, 0xB1, 0x66, 0x1E, 0xEE, 0x0E, 0x23, 0xC0, 0x6B, 0x08, 0xF0, 0x3E, 0xD0, 0xA8,
+ 0xEF, 0x60, 0x34, 0xA7, 0xDB, 0x9A, 0x3C, 0xD5, 0xEE, 0x02, 0x4C, 0x3E, 0x1C, 0x94, 0x75, 0x8E,
+ 0x95, 0xD2, 0x91, 0xCD, 0xF0, 0x20, 0x49, 0xBC, 0x6A, 0xBC, 0x26, 0x0C, 0x40, 0x55, 0x4F, 0xE4,
+ 0x29, 0xC7, 0x2D, 0xB0, 0x55, 0x28, 0xB1, 0xB2, 0x99, 0x2A, 0x87, 0x4A, 0x19, 0x58, 0x7D, 0xEE,
+ 0x24, 0xE7, 0xEE, 0xA6, 0x6A, 0xBE, 0xE1, 0x96, 0xBB, 0x80, 0xF0, 0x1B, 0x55, 0x71, 0x02, 0x9D,
+ 0xCA, 0x8A, 0x51, 0xE4, 0x1D, 0x34, 0x6C, 0x1D, 0x22, 0x91, 0x3C, 0x19, 0xBC, 0x31, 0x59, 0xA0,
+ 0xD4, 0x82, 0x96, 0xAE, 0xE9, 0x2B, 0x24, 0x8E, 0xF4, 0x97, 0x3B, 0xF0, 0x06, 0xC3, 0x60, 0x18,
+ 0x0A, 0x46, 0xA3, 0x69, 0xA3, 0x9B, 0x35, 0xA8, 0x04, 0xBC, 0x5B, 0x60, 0xE5, 0xF5, 0x10, 0x22,
+ 0x03, 0x59, 0x12, 0x09, 0x1B, 0x28, 0x6B, 0xC4, 0xF1, 0x82, 0xB1, 0x72, 0x43, 0x8B, 0x0A, 0x27,
+ 0x84, 0x7A, 0x38, 0x72, 0x64, 0xFD, 0x74, 0x39, 0x02, 0xB6, 0x19, 0xE2, 0xDD, 0x28, 0x85, 0x61,
+ 0xDE, 0x4F, 0x15, 0x0B, 0x90, 0xE3, 0x83, 0xB5, 0x82, 0xC6, 0xB9, 0xA6, 0xFD, 0x6B, 0x8A, 0xB1,
+ 0x9E, 0xEB, 0xA9, 0xFC, 0xAA, 0x10, 0xC9, 0x4D, 0x06, 0xAB, 0x53, 0x06, 0x2F, 0xF5, 0x7A, 0x94,
+ 0xFB, 0x45, 0x14, 0x52, 0x1D, 0xFD, 0xCD, 0x2C, 0xC7, 0x7B, 0x6D, 0x89, 0xCB, 0x50, 0xC4, 0x6D,
+ 0x89, 0x9D, 0x66, 0x66, 0xFA, 0x17, 0xD7, 0x03, 0xB4, 0x62, 0xAA, 0x6F, 0xEC, 0xB9, 0x33, 0xF1,
+ 0x2A, 0x7E, 0x53, 0x2C, 0x86, 0x41, 0xF2, 0x73, 0xE1, 0xC6, 0xFB, 0x6E, 0x0F, 0x5B, 0x31, 0x66,
+ 0xB3, 0x6C, 0x89, 0xC7, 0x49, 0x26, 0xE6, 0x1B, 0x22, 0xB1, 0x01, 0xC8, 0x00, 0x1D, 0xFF, 0xAF,
+ 0x3C, 0x5F, 0x48, 0xB3, 0x59, 0xCC, 0xAE, 0x96, 0x36, 0x30, 0xCB, 0xBF, 0x64, 0xEB, 0x7D, 0xC1,
+ 0xF0, 0x36, 0xA8, 0x0D, 0xD1, 0x5D, 0xAB, 0x31, 0x89, 0x8E, 0x40, 0x1D, 0xED, 0x84, 0xC9, 0x08,
+ 0x73, 0xB4, 0xFE, 0x20, 0xEF, 0x15, 0x25, 0xD1, 0xF8, 0xAA, 0x24, 0xF9, 0xCE, 0xEC, 0x2B, 0x38,
+ 0x30, 0x98, 0x97, 0x7A, 0x43, 0xEE, 0xFC, 0xCE, 0x1C, 0x90, 0x87, 0x48, 0x7D, 0x7F, 0x97, 0xDF,
+ 0x72, 0x18, 0x16, 0xD7, 0xD3, 0xD7, 0x65, 0xA1, 0xB5, 0xEC, 0xC2, 0xFC, 0x95, 0xC0, 0x34, 0x34,
+ 0x51, 0x15, 0xE5, 0x72, 0xDC, 0x9A, 0x56, 0x67, 0x01, 0xF8, 0x9C, 0x96, 0x12, 0x9E, 0xF4, 0xBD,
+ 0x5B, 0xBE, 0x17, 0xC2, 0xC2, 0x32, 0x6A, 0x0A, 0xD2, 0x4A, 0x0C, 0xF6, 0xAC, 0x33, 0x64, 0x48,
+ 0xE7, 0x36, 0x20, 0x99, 0x4A, 0xCA, 0xF2, 0xFC, 0xC7, 0x88, 0x34, 0x68, 0x15, 0xFC, 0x28, 0x2E,
+ 0xAC, 0xD2, 0x9E, 0xEE, 0x39, 0x7A, 0xC9, 0xB4, 0x88, 0x64, 0xEA, 0x1F, 0x21, 0xA2, 0x5C, 0x5F,
+ 0x29, 0xD1, 0x5B, 0xE9, 0x7E, 0x76, 0x24, 0x7A, 0x05, 0x00, 0xCF, 0x49, 0x0D, 0x51, 0x28, 0x65,
+ 0x07, 0x82, 0xC2, 0x9E, 0x13, 0xED, 0x4A, 0x86, 0xB6, 0xCA, 0x78, 0x15, 0xF0, 0x2C, 0x7A, 0xE5,
+ 0x00, 0xF5, 0x74, 0xFF, 0x2E, 0x50, 0x85, 0xE0, 0x72, 0xCA, 0xB1, 0x41, 0xC2, 0x88, 0x7F, 0x37,
+ 0x9F, 0x46, 0xB2, 0x1F, 0x20, 0x69, 0x7B, 0x1B, 0x44, 0xF6, 0x56, 0xD7, 0xDB, 0xDB, 0x58, 0x5D,
+ 0xF0, 0xDB, 0x11, 0x2B, 0x6E, 0x31, 0xE0, 0x95, 0x8C, 0xAC, 0x64, 0x7A, 0xDE, 0x40, 0x6B, 0xA4,
+ 0x78, 0x7A, 0xC1, 0xAB, 0x6A, 0x03, 0x4F, 0x88, 0x96, 0x0E, 0xF1, 0x14, 0x6B, 0x66, 0xB7, 0x9F,
+ 0x51, 0x25, 0x4F, 0x9A, 0x25, 0x19, 0xBA, 0xE2, 0x31, 0xC5, 0x6D, 0xB0, 0x11, 0x28, 0x1D, 0xAF,
+ 0x8B, 0xEB, 0x75, 0x69, 0x85, 0xB9, 0x27, 0x47, 0xB1, 0x84, 0x35, 0x19, 0xC6, 0xEB, 0xE9, 0x4E,
+ 0x3F, 0x61, 0xFD, 0xA4, 0xEE, 0xD2, 0xC0, 0x31, 0xEC, 0x22, 0x56, 0xE5, 0xB7, 0x22, 0x76, 0x34,
+ 0x2A, 0x75, 0xC1, 0x5D, 0x76, 0x7A, 0xFE, 0x4D, 0x48, 0x17, 0x53, 0xEA, 0xCD, 0x13, 0x09, 0xFF,
+ 0x04, 0x9D, 0xB1, 0x11, 0x70, 0xAF, 0x9B, 0x15, 0x1B, 0xB6, 0x81, 0xD4, 0xF6, 0x38, 0x72, 0x65,
+ 0xF5, 0xFB, 0x01, 0xF5, 0xB0, 0xD0, 0xBA, 0xCA, 0xF0, 0x8E, 0x94, 0x81, 0xB1, 0x39, 0xBD, 0x7F,
+ 0x3A, 0x33, 0x89, 0x04, 0xE5, 0x96, 0x7E, 0xF6, 0xFC, 0x48, 0xE5, 0x96, 0xCF, 0x05, 0xAE, 0x8F,
+ 0x3E, 0xDE, 0x30, 0x92, 0xB8, 0xE0, 0x20, 0x1B, 0x86, 0xC3, 0x12, 0xA8, 0xCA, 0xD8, 0xF3, 0xF5,
+ 0xBF, 0x55, 0x0D, 0x8B, 0x20, 0xC8, 0x96, 0xB8, 0x8E, 0x47, 0xCB, 0xC8, 0xE2, 0x73, 0xF9, 0x1A,
+ 0xFD, 0x07, 0x90, 0x71, 0xDB, 0xC4, 0xAF, 0xCE, 0xB4, 0xB6, 0x3A, 0x53, 0xCB, 0x1F, 0xCC, 0x67,
+ 0xE9, 0x9E, 0xD2, 0x82, 0x1F, 0xE0, 0x46, 0x46, 0xF8, 0xE6, 0x22, 0x01, 0xE7, 0x54, 0x66, 0xB3,
+ 0x66, 0x2E, 0xE3, 0x2B, 0x7E, 0x78, 0x6C, 0x68, 0x81, 0xDC, 0x9E, 0x6F, 0xCA, 0xD3, 0x25, 0x94,
+ 0x30, 0x84, 0x4F, 0x32, 0xD5, 0x37, 0x21, 0x2C, 0xF6, 0xCE, 0x85, 0x83, 0x21, 0x6F, 0xC9, 0x09,
+ 0xE5, 0x0A, 0xE4, 0x8C, 0x22, 0x66, 0xB9, 0x50, 0xFB, 0xE6, 0x97, 0xCF, 0x74, 0x8A, 0xC7, 0x67,
+ 0xCB, 0x38, 0xDA, 0x85, 0x47, 0x8B, 0xF0, 0x64, 0xF3, 0xFF, 0xA4, 0x91, 0x05, 0x7C, 0xE8, 0xED,
+ 0x6F, 0x9F, 0x93, 0x3E, 0x18, 0xA2, 0x4C, 0x68, 0x0C, 0x62, 0xEB, 0x6D, 0x3A, 0x45, 0x52, 0xBF,
+ 0x05, 0xC1, 0xB8, 0xB5, 0x0C, 0xBB, 0xCB, 0xF7, 0xA5, 0x88, 0xB4, 0x94, 0x00, 0x77, 0x92, 0x9D,
+ 0xA3, 0xFB, 0xC2, 0x04, 0x11, 0x4F, 0x8F, 0xA2, 0x22, 0xFB, 0xEC, 0x71, 0xCA, 0x5E, 0x3A, 0xC2,
+ 0x42, 0x1C, 0x2B, 0x74, 0xCE, 0x9E, 0x46, 0xF7, 0xEF, 0x48, 0x24, 0xCF, 0xBA, 0xE1, 0x0A, 0x92,
+ 0xC9, 0x59, 0xF5, 0x10, 0xD7, 0x25, 0x6E, 0xAB, 0x9B, 0xAB, 0xD4, 0xC6, 0x16, 0x98, 0x5B, 0x31,
+ 0x87, 0x39, 0x21, 0xA9, 0x09, 0x7F, 0x47, 0x0B, 0xF4, 0xFB, 0xA9, 0xFE, 0x60, 0x07, 0x1A, 0x31,
+ 0xEC, 0x48, 0x64, 0x0D, 0x73, 0x71, 0xDF, 0x78, 0xE6, 0xB1, 0x76, 0xD9, 0xE1, 0x4C, 0xCF, 0x80,
+ 0xBD, 0x58, 0x96, 0xAF, 0x3D, 0x3D, 0x82, 0x7B, 0xC0, 0x16, 0xD7, 0xD7, 0x8C, 0xBC, 0x5F, 0x91,
+ 0x30, 0xA3, 0x6C, 0x5D, 0x25, 0xCF, 0xAC, 0xA6, 0xEC, 0xCF, 0x42, 0x41, 0x05, 0xA4, 0x74, 0x2E,
+ 0x82, 0xBA, 0x21, 0x42, 0x95, 0xDF, 0xF2, 0xD6, 0x29, 0x5B, 0x04, 0xBD, 0x47, 0x8E, 0x47, 0xBA,
+ 0x3F, 0x99, 0x20, 0x4D, 0x74, 0x56, 0xD6, 0x43, 0x42, 0xC4, 0x36, 0x7D, 0x24, 0xE3, 0xC9, 0xD8,
+ 0x66, 0xAB, 0x3D, 0x62, 0xE2, 0xA9, 0x51, 0x3C, 0x9F, 0x1A, 0xA7, 0x6C, 0x7F, 0x4D, 0xC9, 0xEB,
+ 0x21, 0x66, 0xBB, 0x46, 0xA4, 0x97, 0x5E, 0x6D, 0xAD, 0xD4, 0x6F, 0xFB, 0xB1, 0xC6, 0x6F, 0x51,
+ 0x2F, 0x0A, 0x9A, 0x97, 0x8E, 0xBB, 0x80, 0xD7, 0x16, 0x70, 0xC4, 0x98, 0xEE, 0xB9, 0x69, 0x48,
+ 0x49, 0xA2, 0xBB, 0x93, 0x8B, 0xE6, 0x10, 0xCB, 0xC3, 0x8D, 0x57, 0x17, 0x0A, 0xFE, 0x1B, 0xB5,
+ 0x40, 0x06, 0x7D, 0xE4, 0x89, 0x76, 0x13, 0x01, 0xB1, 0x2E, 0x01, 0xD7, 0x20, 0x1D, 0x5B, 0xE9,
+ 0x5C, 0x11, 0x24, 0x78, 0xF5, 0x9F, 0x02, 0xF8, 0x8B, 0xA9, 0x0B, 0x22, 0x42, 0x66, 0x1A, 0xFE,
+ 0x15, 0xF7, 0x51, 0x93, 0xB7, 0xDB, 0x00, 0x52, 0x0A, 0xF0, 0x4A, 0xA8, 0xE1, 0xDF, 0xCE, 0x88,
+ 0xBF, 0x47, 0x47, 0x73, 0x48, 0x19, 0x89, 0x3B, 0xDD, 0xD2, 0x82, 0x14, 0xB4, 0x70, 0xF6, 0xF2,
+ 0xC1, 0x4D, 0x8B, 0x47, 0x74, 0x12, 0xC1, 0x42, 0x69, 0xE1, 0xFD, 0x25, 0x6F, 0x62, 0xF6, 0x41,
+ 0xF8, 0x60, 0x83, 0xB8, 0x91, 0x06, 0x09, 0x5D, 0x90, 0x2E, 0x52, 0xB3, 0xFC, 0x34, 0x86, 0xD7,
+ 0xC8, 0x27, 0x94, 0xA4, 0xB9, 0x32, 0x7E, 0xA0, 0xA4, 0xB4, 0xE5, 0x2F, 0x14, 0x37, 0x7B, 0xFA,
+ 0x9C, 0x15, 0xD0, 0xE2, 0x13, 0x4C, 0x62, 0x24, 0xE8, 0x0C, 0xDC, 0x52, 0x10, 0xC3, 0xCE, 0x6F,
+ 0xE5, 0x21, 0x57, 0xF3, 0x17, 0xD0, 0x0F, 0x67, 0x9D, 0x58, 0xEA, 0x84, 0x13, 0x9E, 0xE3, 0xEA,
+ 0xF6, 0xBC, 0x5C, 0x40, 0xCE, 0xCC, 0xAA, 0xE8, 0x5B, 0x41, 0x86, 0x68, 0xD7, 0xC3, 0x3B, 0x66,
+ 0xFB, 0x6B, 0xC1, 0xAE, 0x72, 0x29, 0xE6, 0x6C, 0x2A, 0x71, 0xB4, 0xC5, 0x4F, 0x69, 0xBA, 0x40,
+ 0x80, 0x58, 0x08, 0x4F, 0x8D, 0xE5, 0x69, 0x44, 0x1B, 0xC0, 0x3D, 0x97, 0xAB, 0x7D, 0x23, 0xF3,
+ 0x79, 0x40, 0x1A, 0x9D, 0x04, 0x98, 0x31, 0x6A, 0x5E, 0x6C, 0x59, 0x17, 0xEA, 0x34, 0xEC, 0x29,
+ 0xA2, 0x7D, 0xC9, 0x2B, 0x5B, 0x76, 0x9C, 0x15, 0x22, 0x67, 0x6C, 0x08, 0x33, 0x41, 0xC5, 0x46,
+ 0xA7, 0xA6, 0x0E, 0xEB, 0xFB, 0x92, 0x17, 0x41, 0xAF, 0x3B, 0x22, 0x96, 0xDE, 0x35, 0xD6, 0xB6,
+ 0x7C, 0xEF, 0x6B, 0xF6, 0x10, 0xFC, 0xE7, 0xBC, 0x38, 0xE2, 0xB7, 0xA6, 0x93, 0x1F, 0x12, 0x86,
+ 0xF7, 0x1F, 0xBE, 0x41, 0x42, 0xCC, 0xDB, 0xF8, 0x52, 0xCB, 0xFD, 0xFF, 0x40, 0xC1, 0x38, 0x50,
+ 0x6F, 0x72, 0x77, 0x2B, 0xB1, 0x27, 0xCD, 0x9A, 0x0F, 0x6B, 0x5D, 0x1E, 0xE7, 0x9A, 0xB9, 0xA4,
+ 0xA2, 0xC3, 0x8C, 0x2D, 0x73, 0xC1, 0xF9, 0x6B, 0x5E, 0x08, 0xD8, 0x8B, 0x1E, 0x05, 0x0A, 0x04,
+ 0xBD, 0x29, 0xE2, 0x57, 0x52, 0xF7, 0x21, 0xEE, 0x10, 0x36, 0x7E, 0x90, 0x09, 0x08, 0xA3, 0x44,
+ 0xE1, 0xCA, 0xCF, 0x59, 0x53, 0xDB, 0x6E, 0x65, 0x28, 0xEE, 0xF3, 0x60, 0xCB, 0x47, 0x83, 0x18,
+ 0xDC, 0x05, 0xAD, 0xCC, 0x04, 0x09, 0x91, 0x05, 0xAE, 0x96, 0x2F, 0x10, 0x0E, 0x50, 0x0C, 0xF0,
+ 0x57, 0xA8, 0xEE, 0x81, 0x89, 0x4C, 0x9B, 0x72, 0x13, 0xA1, 0xB9, 0x5A, 0x9E, 0x31, 0xB2, 0xA9,
+ 0x80, 0xA8, 0x51, 0xEA, 0x7E, 0x59, 0xA7, 0xB9, 0x7C, 0xBE, 0x82, 0x13, 0xC7, 0x30, 0xAE, 0xF9,
+ 0xF5, 0x22, 0x15, 0xE1, 0xC6, 0xC2, 0x06, 0xD9, 0xC9, 0xD9, 0xF4, 0x4C, 0xBF, 0x0A, 0x02, 0xD3,
+ 0x4C, 0x38, 0x28, 0x60, 0x52, 0xB9, 0xF7, 0x3C, 0xD9, 0x1C, 0x28, 0x98, 0x89, 0xAC, 0xBD, 0x81,
+ 0x17, 0x5E, 0x59, 0xF5, 0x55, 0xC7, 0xED, 0x58, 0x1F, 0x29, 0xE7, 0x57, 0xC1, 0x27, 0x0A, 0x7E,
+ 0x67, 0x00, 0x56, 0xD5, 0x93, 0x99, 0xA6, 0x8E, 0x7D, 0xB1, 0xA0, 0x17, 0x98, 0x88, 0xA8, 0x9D,
+ 0x2D, 0x27, 0x6B, 0x0C, 0x59, 0x5C, 0x0B, 0x3C, 0x6A, 0x3B, 0xFD, 0x44, 0x37, 0x18, 0xAA, 0x49,
+ 0xE7, 0xA1, 0xC1, 0x24, 0xCD, 0xB6, 0xA6, 0x2C, 0x4D, 0x38, 0x1D, 0x3A, 0x0B, 0xA6, 0x42, 0x84,
+ 0x48, 0x63, 0xCB, 0x5A, 0x74, 0xBF, 0x62, 0x3B, 0x5E, 0x55, 0x94, 0xC7, 0x52, 0x7D, 0xD1, 0xA6,
+ 0xFE, 0x3B, 0x1A, 0xE8, 0x80, 0x3D, 0x57, 0x9E, 0x03, 0xE4, 0xA7, 0xB0, 0x52, 0x84, 0x42, 0xC4,
+ 0x95, 0x63, 0xC9, 0xD2, 0x6E, 0xA9, 0x51, 0xE8, 0x51, 0x9C, 0xFB, 0x67, 0xD1, 0xF6, 0x37, 0xC2,
+ 0x56, 0x64, 0x95, 0x70, 0x07, 0x23, 0x0C, 0x79, 0x4C, 0x20, 0x52, 0x94, 0x68, 0x9B, 0xC3, 0x64,
+ 0x7A, 0xBC, 0xF6, 0x54, 0x97, 0xF0, 0xEB, 0x0F, 0x71, 0x8E, 0x69, 0x85, 0xCC, 0x2F, 0x2B, 0x2F,
+ 0xCF, 0x8D, 0xEA, 0x1A, 0x04, 0x37, 0x47, 0xDA, 0xFE, 0xCF, 0xD2, 0x5E, 0xA8, 0xE7, 0x03, 0x21,
+ 0xBA, 0xFE, 0x88, 0x21, 0x33, 0x17, 0xE3, 0x78, 0xB0, 0xE4, 0x71, 0x47, 0x1A, 0x88, 0x9B, 0x4F,
+ 0x5F, 0x38, 0xF8, 0x0F, 0x8F, 0x82, 0x04, 0x72, 0xDC, 0x1E, 0x7B, 0xB6, 0x90, 0x55, 0x19, 0xDE,
+ 0xD7, 0x0E, 0xE6, 0xED, 0xEE, 0x9A, 0x47, 0x5A, 0x63, 0xC4, 0xE6, 0x2A, 0x09, 0xB0, 0xC4, 0x0A,
+ 0xBA, 0x70, 0xF8, 0x18, 0x0F, 0xE1, 0x87, 0xAD, 0x41, 0xCE, 0xB9, 0x4B, 0x6E, 0xF1, 0x0B, 0x04,
+ 0xAC, 0x6A, 0x4F, 0x09, 0x40, 0xDE, 0x60, 0xF2, 0x10, 0xC7, 0xD8, 0x11, 0xFB, 0x58, 0x4D, 0x8C,
+ 0x6F, 0xD9, 0xF7, 0xA5, 0xC3, 0x13, 0x16, 0x39, 0x25, 0x5A, 0x01, 0xE5, 0x92, 0x06, 0x8A, 0x4A,
+ 0x89, 0xB5, 0x43, 0x7A, 0x39, 0xC2, 0x12, 0xCD, 0x45, 0x8B, 0x8E, 0x59, 0x1C, 0x4F, 0x72, 0xA6,
+ 0xEE, 0xA4, 0x88, 0x6F, 0x04, 0xE8, 0x68, 0xD1, 0xDC, 0x90, 0x41, 0x28, 0x8C, 0x2B, 0xC9, 0xF1,
+ 0x92, 0x08, 0xAC, 0x7F, 0x7E, 0xEE, 0x7A, 0x3F, 0x54, 0xFB, 0x45, 0x7F, 0x73, 0xF6, 0xE5, 0xE2,
+ 0xE4, 0x8C, 0x05, 0xA4, 0xAF, 0x63, 0x86, 0xB4, 0xA5, 0x6B, 0x33, 0x19, 0x00, 0x79, 0xB0, 0x73,
+ 0x2C, 0x89, 0xFC, 0x81, 0xDF, 0x7E, 0x5C, 0x59, 0x02, 0xF2, 0xFA, 0x52, 0x9C, 0x1E, 0xD4, 0xE5,
+ 0x56, 0x90, 0x56, 0x23, 0x3A, 0x7A, 0xFD, 0x6F, 0xB4, 0x98, 0x8D, 0x47, 0xD7, 0x4D, 0x84, 0xB9,
+ 0x2A, 0x09, 0xF2, 0x6C, 0xAB, 0x1C, 0x70, 0xD1, 0x01, 0xD5, 0x63, 0xF0, 0xDF, 0x3F, 0xCD, 0x27,
+ 0x94, 0x36, 0xB8, 0xE8, 0xB9, 0xAF, 0xB7, 0xDD, 0x41, 0xE1, 0x43, 0xC7, 0xE4, 0xF5, 0xA8, 0xB7,
+ 0xF4, 0x59, 0x91, 0x84, 0x96, 0x0A, 0x6E, 0x13, 0xA8, 0x43, 0x1C, 0xC1, 0x4A, 0xB6, 0x52, 0x6E,
+ 0x36, 0x21, 0x02, 0x18, 0x15, 0xB1, 0x65, 0xA5, 0xE1, 0x0F, 0xA5, 0x0C, 0xE1, 0xFF, 0xE2, 0x10,
+ 0xCC, 0xBB, 0xBD, 0x33, 0x91, 0x73, 0x7D, 0xA0, 0x16, 0x23, 0x39, 0x9B, 0x36, 0xCF, 0x94, 0x2F,
+ 0x7C, 0xA0, 0x63, 0xE8, 0x3C, 0xB8, 0xBE, 0xC5, 0x03, 0x3D, 0x1A, 0x3D, 0x97, 0x10, 0x7F, 0x79,
+ 0x7F, 0xCA, 0x94, 0x77, 0x30, 0x1A, 0x5B, 0x3A, 0xF1, 0xAF, 0xF1, 0xF4, 0x4F, 0x69, 0xA8, 0x0C,
+ 0x7B, 0x87, 0xED, 0x30, 0x99, 0xEE, 0xEE, 0xD5, 0xEF, 0x29, 0x1B, 0xB9, 0xC0, 0x4C, 0xF6, 0x46,
+ 0x46, 0xD9, 0x12, 0x9E, 0x73, 0xF6, 0x5C, 0x8F, 0x12, 0x14, 0xF1, 0xFC, 0x4C, 0x49, 0xE6, 0xDF,
+ 0xCD, 0x92, 0x82, 0xDC, 0xD6, 0xF1, 0x2D, 0x04, 0x27, 0x94, 0x55, 0xF5, 0x7E, 0xC5, 0x81, 0x4B,
+ 0x84, 0xB8, 0x6F, 0x43, 0xD4, 0x4E, 0x58, 0x44, 0x66, 0x31, 0xC8, 0xB4, 0xD4, 0x64, 0x37, 0x72,
+ 0xAA, 0x46, 0xD0, 0x7A, 0x49, 0x94, 0xEA, 0x1E, 0xF6, 0xED, 0x31, 0xE2, 0xCF, 0xD0, 0x12, 0x53,
+ 0x5F, 0xC4, 0xA9, 0xF4, 0x79, 0xD5, 0xB2, 0x2E, 0xD2, 0x7C, 0xC9, 0x12, 0xDE, 0xFA, 0xED, 0x9E,
+ 0x6B, 0xFB, 0x08, 0xBE, 0x61, 0x53, 0x96, 0x1A, 0xB8, 0x71, 0x2C, 0x5E, 0xE5, 0xF8, 0xAE, 0x68,
+ 0xF5, 0x39, 0x11, 0x53, 0xDD, 0x30, 0x4F, 0x49, 0xCB, 0x5E, 0x9C, 0x20, 0x2B, 0x99, 0x77, 0x8F,
+ 0xA8, 0x46, 0x5F, 0xD2, 0xBB, 0x31, 0x8E, 0x2C, 0x84, 0x60, 0x63, 0xEB, 0xE9, 0x0C, 0x20, 0x98,
+ 0xAA, 0x58, 0xF5, 0x75, 0xA0, 0x2E, 0xB2, 0x65, 0x79, 0xA2, 0xB9, 0xAB, 0xD9, 0xE8, 0xA6, 0xF3,
+ 0x1B, 0x34, 0x37, 0x75, 0xA4, 0xFF, 0x00, 0xF8, 0xA6, 0xF6, 0x26, 0xA4, 0xFF, 0x63, 0x14, 0xB9,
+ 0xA5, 0xD0, 0x12, 0x45, 0x08, 0x8C, 0x6E, 0x78, 0x0C, 0xC5, 0x75, 0xB8, 0xEC, 0x77, 0x73, 0xEA,
+ 0x87, 0x6F, 0xAD, 0x4D, 0x98, 0xCD, 0xC7, 0xA5, 0x20, 0xC3, 0x4E, 0x31, 0x79, 0x16, 0xB0, 0x2A,
+ 0x9A, 0x84, 0x02, 0xAA, 0x00, 0x60, 0xBB, 0x58, 0x84, 0xC6, 0x95, 0xF3, 0xF4, 0x6C, 0xEB, 0xD8,
+ 0xEC, 0x1A, 0xC3, 0x92, 0xD6, 0x09, 0x58, 0x56, 0xDB, 0x64, 0xF9, 0x00, 0x1A, 0x45, 0xF4, 0x2F,
+ 0x65, 0x71, 0x8C, 0xD0, 0x9B, 0xFA, 0x0B, 0x7E, 0xDF, 0x29, 0xF1, 0x91, 0xD5, 0x33, 0xF2, 0x46,
+ 0xC3, 0xBD, 0x30, 0xF8, 0x7E, 0x5A, 0xA7, 0x6A, 0x19, 0x88, 0xC3, 0xE3, 0x5B, 0x37, 0xA9, 0x4C,
+ 0x4F, 0xB3, 0xBD, 0xB8, 0x65, 0x57, 0xCB, 0xBE, 0x79, 0x82, 0x88, 0xDA, 0xB5, 0xAA, 0x9A, 0xD3,
+ 0x05, 0xFA, 0x7A, 0x7B, 0xC0, 0xB9, 0x33, 0xD0, 0xCE, 0x34, 0xEF, 0x43, 0x41, 0x36, 0x23, 0xD4,
+ 0x9C, 0x1F, 0x35, 0x70, 0xC4, 0x18, 0x87, 0x51, 0x7B, 0x9C, 0x8E, 0x24, 0x7C, 0x73, 0x9F, 0x6D,
+ 0xD6, 0x4B, 0xFA, 0x22, 0x1F, 0x99, 0x2E, 0x1F, 0xEE, 0x13, 0xB4, 0xA3, 0xE8, 0xCE, 0xF6, 0xF3,
+ 0x00, 0x9B, 0xE3, 0xDD, 0x0F, 0x8A, 0xCB, 0xC5, 0x49, 0xB1, 0xCA, 0x3F, 0x83, 0x96, 0xB4, 0xA3,
+ 0x37, 0x72, 0x43, 0xAD, 0x2A, 0x79, 0xAF, 0x7F, 0x56, 0x18, 0xB3, 0x95, 0xA2, 0x3B, 0x15, 0x8A,
+ 0x82, 0xFC, 0xED, 0xD1, 0xA1, 0x81, 0x44, 0x23, 0x88, 0x39, 0x89, 0xD8, 0x11, 0x8F, 0xAC, 0x62,
+ 0xCB, 0xC9, 0x9F, 0x88, 0x3C, 0xDD, 0xE8, 0x4B, 0xB4, 0xF4, 0x99, 0xC7, 0x9E, 0xD9, 0xB7, 0xBC,
+ 0x5B, 0x81, 0xD9, 0x0C, 0x1C, 0xA2, 0x8B, 0x36, 0x3C, 0xE2, 0xA9, 0xD4, 0x81, 0x2D, 0x5D, 0x72,
+ 0x5A, 0xBF, 0xB2, 0x62, 0x8E, 0x48, 0x74, 0x56, 0xB8, 0xB9, 0x48, 0x04, 0x53, 0xCA, 0x0F, 0x20,
+ 0x4E, 0x28, 0xD4, 0x0B, 0xC8, 0xE0, 0x3F, 0x09, 0xC5, 0x8F, 0x19, 0x99, 0xB3, 0x5F, 0xC4, 0xC7,
+ 0x5A, 0x65, 0xD6, 0x1F, 0x27, 0xB0, 0xD2, 0x28, 0x03, 0x7B, 0xAB, 0x62, 0x6C, 0xAA, 0x78, 0xA0,
+ 0x15, 0x00, 0xE8, 0x0E, 0xA8, 0x28, 0xAF, 0x1B, 0xCD, 0x1E, 0x5B, 0x09, 0x0E, 0x47, 0x10, 0xA8,
+ 0x67, 0x32, 0x1D, 0x05, 0x7D, 0xBB, 0x57, 0x81, 0x2B, 0xDB, 0x4B, 0x6A, 0x4F, 0xBF, 0x9E, 0x51,
+ 0x45, 0xC3, 0xCC, 0x70, 0xC6, 0x9E, 0x70, 0x30, 0x82, 0x65, 0xCE, 0x23, 0xCD, 0x6A, 0x4F, 0x3B,
+ 0xA5, 0x58, 0x69, 0xFE, 0x37, 0x27, 0xE6, 0x03, 0x0C, 0x99, 0x8D, 0x31, 0xF5, 0xC0, 0xC8, 0xAC,
+ 0x73, 0xCC, 0x48, 0x86, 0xC6, 0x4B, 0xC4, 0xE8, 0x13, 0x0A, 0xEE, 0xC0, 0x18, 0xC8, 0xE3, 0x01,
+ 0x9B, 0x2B, 0xB5, 0x64, 0x06, 0xA9, 0xB6, 0xFD, 0xC4, 0xC1, 0x5D, 0x42, 0x49, 0xEC, 0x83, 0x53,
+ 0x61, 0xAF, 0x7A, 0x8D, 0x8C, 0x1F, 0x7C, 0xBE, 0xE5, 0xA1, 0x2B, 0x8E, 0x20, 0x31, 0x4F, 0x37,
+ 0x6A, 0x88, 0xF8, 0xBF, 0x0C, 0xD9, 0xBA, 0x1B, 0xCB, 0xC7, 0x23, 0x81, 0x85, 0x47, 0x93, 0xD0,
+ 0xC0, 0x03, 0xBE, 0x2E, 0x3D, 0x89, 0xE3, 0x75, 0xAB, 0x5B, 0x32, 0x65, 0x83, 0x40, 0xBF, 0x16,
+ 0xA9, 0x25, 0xE5, 0x4A, 0xFD, 0x86, 0xD2, 0x5F, 0xA0, 0xCF, 0x1F, 0xFF, 0x63, 0xFF, 0x75, 0x2B,
+ 0xAF, 0x1A, 0x0B, 0x3A, 0x03, 0xE3, 0x2D, 0x04, 0x57, 0xDF, 0x56, 0x6D, 0x83, 0x61, 0x81, 0xC5,
+ 0xDB, 0x51, 0xDA, 0x70, 0x0B, 0x5D, 0x5B, 0x21, 0xB6, 0xF4, 0x20, 0x0E, 0x44, 0xFD, 0x7D, 0xA0,
+ 0xD8, 0x5A, 0xF4, 0x16, 0xF1, 0x69, 0x11, 0x6B, 0x13, 0x8F, 0xB3, 0xEC, 0x1E, 0x0C, 0x7D, 0x63,
+ 0xBF, 0x96, 0xDD, 0xA2, 0x80, 0x8F, 0xE7, 0x47, 0x57, 0x4B, 0xCA, 0xE5, 0xF1, 0xB2, 0x66, 0xB5,
+ 0xDC, 0x27, 0x75, 0x72, 0x49, 0x0C, 0x1E, 0x69, 0x6D, 0x3E, 0x31, 0xC4, 0x36, 0xCA, 0x3C, 0xE9,
+ 0x5B, 0xC5, 0xDA, 0x4E, 0x28, 0xBA, 0x12, 0x39, 0x40, 0x9E, 0x92, 0x3E, 0x77, 0x60, 0xC7, 0xDF,
+ 0x0F, 0xE7, 0xDC, 0x3B, 0x97, 0x39, 0xAF, 0x24, 0x49, 0xBA, 0xB0, 0xA2, 0x44, 0x04, 0x20, 0x3C,
+ 0xE6, 0x40, 0x87, 0x30, 0xC2, 0x27, 0x23, 0x69, 0x4F, 0xDE, 0x13, 0x94, 0x09, 0x15, 0xDB, 0x39,
+ 0xDC, 0x04, 0x07, 0xE3, 0x1B, 0x0E, 0xAA, 0x80, 0x0D, 0xA7, 0x58, 0x87, 0xDC, 0x0C, 0xC0, 0xDE,
+ 0x43, 0x81, 0x70, 0x55, 0x11, 0xC8, 0x69, 0x42, 0xA2, 0x72, 0x35, 0xC4, 0xB9, 0x51, 0x2A, 0xD9,
+ 0x19, 0xEE, 0x68, 0xE1, 0x86, 0x02, 0x58, 0x24, 0x8D, 0xE0, 0xF8, 0x0D, 0x19, 0x21, 0x24, 0xF7,
+ 0x23, 0x3D, 0x07, 0xA0, 0x52, 0xE3, 0xE4, 0x98, 0xA3, 0xFD, 0x25, 0x0C, 0x48, 0x26, 0xC2, 0x97,
+ 0xEB, 0x73, 0xFB, 0x00, 0x95, 0xF9, 0x12, 0x45, 0xD9, 0xA8, 0x41, 0xFE, 0xF0, 0xD7, 0x18, 0x7E,
+ 0x6E, 0x9A, 0xFA, 0x78, 0x15, 0xA6, 0x54, 0xB0, 0x3A, 0x8A, 0xFA, 0x8F, 0xD1, 0xE5, 0x22, 0xB9,
+ 0x19, 0x40, 0xC1, 0x19, 0xBA, 0x6B, 0xD5, 0x04, 0x67, 0x4E, 0x1C, 0xDA, 0x81, 0x16, 0x22, 0xE8,
+ 0xB4, 0x7C, 0x99, 0xB7, 0xDD, 0x6E, 0x19, 0x16, 0xAE, 0x11, 0x58, 0xE4, 0x03, 0xA1, 0xA2, 0x6C,
+ 0xDF, 0xF3, 0x1A, 0x88, 0x4B, 0xAF, 0x3F, 0xA2, 0xB0, 0x54, 0xE7, 0x68, 0xE1, 0x3B, 0xB7, 0x2F,
+ 0xFC, 0xB3, 0xE6, 0x80, 0x6F, 0x2B, 0x82, 0x7E, 0x15, 0x6E, 0x61, 0xD3, 0x5F, 0x25, 0xBB, 0xE2,
+ 0xF4, 0x41, 0xD1, 0xEB, 0x47, 0x8E, 0x50, 0x0F, 0x8E, 0x04, 0x80, 0xB5, 0xA7, 0x9E, 0xBB, 0x55,
+ 0x03, 0x69, 0x11, 0x98, 0xAD, 0x64, 0x4E, 0x65, 0x9C, 0xB2, 0x17, 0x2E, 0x0A, 0xD6, 0x4C, 0xD9,
+ 0x55, 0xF1, 0x12, 0x08, 0xB4, 0xB4, 0x4C, 0xDE, 0xE1, 0x27, 0x15, 0x66, 0x28, 0x27, 0x8E, 0xDE,
+ 0xCE, 0xF0, 0x86, 0x28, 0x2B, 0x11, 0x0B, 0x45, 0x27, 0x31, 0xE3, 0x3D, 0x01, 0x71, 0xBD, 0x20,
+ 0x4F, 0xE4, 0x03, 0xBB, 0xFA, 0x1B, 0x63, 0x63, 0x62, 0x4F, 0x0C, 0x9D, 0x47, 0x27, 0x97, 0x0B,
+ 0x0A, 0x53, 0x4E, 0x08, 0xDA, 0x55, 0xDD, 0x27, 0xEB, 0x7D, 0x3B, 0x04, 0x2E, 0x29, 0x8E, 0x40,
+ 0x2F, 0x6B, 0xCC, 0x05, 0xA8, 0x2A, 0x9E, 0x33, 0xF5, 0xB3, 0x82, 0x07, 0x8D, 0x2B, 0x16, 0xA1,
+ 0x8B, 0x6F, 0xB9, 0x06, 0x67, 0x8A, 0x4B, 0x9B, 0x7F, 0x92, 0x21, 0x66, 0x5F, 0x83, 0x57, 0x81,
+ 0xD1, 0x71, 0x02, 0x7C, 0x9E, 0xA1, 0xFB, 0x69, 0xF7, 0x7F, 0x57, 0xA7, 0x49, 0xB3, 0x86, 0xA2,
+ 0x21, 0x9C, 0x71, 0xB8, 0x39, 0x45, 0x12, 0x42, 0x41, 0xA4, 0xF3, 0x89, 0x80, 0xF5, 0x13, 0x2F,
+ 0x79, 0xDB, 0xA0, 0x0E, 0xED, 0x9A, 0x6A, 0xA0, 0x4C, 0x09, 0xC9, 0x92, 0xAC, 0x10, 0x2F, 0x10,
+ 0xDF, 0xE8, 0xCB, 0x1D, 0x0F, 0x0D, 0xE1, 0x2E, 0x62, 0x99, 0xAC, 0xCB, 0x52, 0xD2, 0x1B, 0xAF,
+ 0xB6, 0xB0, 0x78, 0xE0, 0x31, 0xDC, 0x6D, 0xBE, 0x7A, 0xF9, 0x02, 0xE1, 0x48, 0xE5, 0x14, 0xD8,
+ 0x90, 0x9C, 0xE6, 0xE3, 0xF6, 0x6D, 0x7B, 0xF3, 0xDB, 0x60, 0x00, 0x39, 0x38, 0xAB, 0xE7, 0x17,
+ 0xE9, 0x15, 0xC6, 0x3A, 0x7D, 0x40, 0xDF, 0xD9, 0x02, 0xDC, 0x83, 0x50, 0x76, 0xB0, 0x12, 0x16,
+ 0x11, 0x57, 0x1D, 0xC1, 0x22, 0xBC, 0x88, 0x46, 0xCB, 0x13, 0x5D, 0x8F, 0x8F, 0xED, 0xCD, 0xAE,
+ 0x15, 0xC0, 0x2D, 0xB0, 0x2C, 0xDA, 0xD7, 0x38, 0x35, 0x29, 0x2D, 0xF5, 0x0E, 0xF0, 0xD5, 0x96,
+ 0x74, 0x80, 0x96, 0xAB, 0x83, 0xAA, 0xA8, 0xA1, 0x55, 0xB4, 0x90, 0x35, 0x0F, 0x4F, 0x19, 0xF8,
+ 0x52, 0x8A, 0x81, 0x4A, 0xDB, 0x5F, 0x34, 0x25, 0xF9, 0xBB, 0x48, 0x8B, 0x66, 0x18, 0x64, 0x32,
+ 0xC2, 0xAE, 0x44, 0x8E, 0x7F, 0xB1, 0x7F, 0x3F, 0x09, 0x83, 0xB4, 0x21, 0xEF, 0xF6, 0x70, 0xF8,
+ 0xEB, 0xE6, 0x6A, 0xFB, 0x0B, 0x46, 0x23, 0x05, 0xE8, 0x6D, 0x2B, 0x82, 0x87, 0x89, 0xA6, 0x6D,
+ 0x53, 0x86, 0xD6, 0xAC, 0x0C, 0xD3, 0x6C, 0x3A, 0x77, 0x4F, 0x7F, 0xDD, 0x61, 0x47, 0x5C, 0x17,
+ 0x02, 0x79, 0x49, 0x15, 0xCC, 0xE7, 0x33, 0xF8, 0x01, 0x51, 0x64, 0x43, 0xD7, 0x00, 0x29, 0x15,
+ 0x69, 0xD2, 0xDA, 0xF6, 0x66, 0xE1, 0x65, 0xCA, 0x40, 0xB5, 0x8A, 0xE1, 0x0B, 0x1D, 0x54, 0x17,
+ 0xF6, 0x95, 0xD1, 0xFB, 0x21, 0xD9, 0x4B, 0x34, 0xD8, 0x0D, 0x44, 0xB7, 0xEF, 0x5A, 0x94, 0xFC,
+ 0xED, 0x74, 0x01, 0xED, 0x7B, 0x70, 0x52, 0x8D, 0xC9, 0xF2, 0x33, 0x61, 0x74, 0x83, 0xC5, 0x4D,
+ 0x72, 0x53, 0xFA, 0x68, 0xCA, 0xA3, 0x85, 0xEF, 0x8A, 0x7E, 0xEF, 0xEC, 0xF8, 0xAA, 0x22, 0x2D,
+ 0x53, 0xB2, 0xA5, 0xCE, 0x74, 0x3D, 0xF1, 0x87, 0xCE, 0xE7, 0xA0, 0xAE, 0xA6, 0x68, 0xB1, 0xA4,
+ 0xE1, 0x3F, 0x60, 0xBC, 0x9A, 0x05, 0xFF, 0x1F, 0xA4, 0x12, 0x7F, 0xC5, 0xE7, 0x86, 0x18, 0x8A,
+ 0x64, 0x94, 0xDB, 0xFC, 0xB2, 0x4C, 0xFB, 0x3E, 0x2A, 0xB0, 0xC5, 0x88, 0xFC, 0x00, 0x6A, 0x5E,
+ 0x33, 0x81, 0xD4, 0x40, 0x12, 0x44, 0xB0, 0x24, 0xA9, 0xE6, 0xFB, 0x95, 0xEF, 0x56, 0xF2, 0x4B,
+ 0xF0, 0x46, 0x8B, 0xBF, 0xE6, 0x8F, 0x77, 0x90, 0x0E, 0x3B, 0xDA, 0xCD, 0xDC, 0x6F, 0x78, 0x25,
+ 0x37, 0x23, 0x55, 0x3A, 0xBA, 0x35, 0x74, 0x41, 0x31, 0xE0, 0x34, 0xFF, 0x89, 0x14, 0x92, 0xCD,
+ 0x65, 0x6E, 0x22, 0x00, 0x6C, 0xFE, 0x1E, 0x73, 0x5C, 0x59, 0xC6, 0x88, 0x32, 0xFA, 0xC4, 0x9D,
+ 0x8F, 0xF0, 0x54, 0x6F, 0x64, 0xBC, 0x13, 0x44, 0x94, 0x04, 0x92, 0xDE, 0x30, 0xCA, 0x9E, 0xE8,
+ 0x20, 0x3A, 0x03, 0x43, 0xFD, 0xE1, 0x6B, 0x17, 0x09, 0xCC, 0xEC, 0x62, 0x3B, 0x10, 0x8E, 0x79,
+ 0x64, 0x15, 0x6C, 0x01, 0x09, 0x0F, 0x0D, 0x8E, 0x79, 0xBC, 0xD4, 0xE3, 0x01, 0x2C, 0xAF, 0x0C,
+ 0xF9, 0x5F, 0x53, 0xB8, 0xB0, 0x7E, 0x6D, 0xB9, 0x8D, 0x29, 0xC9, 0x3F, 0x1E, 0x82, 0xB8, 0xF0,
+ 0xEB, 0xDD, 0x6A, 0xB4, 0xB4, 0xAE, 0x74, 0xC6, 0x0B, 0x45, 0x12, 0xEC, 0x9D, 0xDD, 0x79, 0x94,
+ 0xC1, 0x2D, 0x4D, 0x3C, 0x25, 0x75, 0xA6, 0x2E, 0x7A, 0x52, 0xE1, 0x31, 0xA4, 0xDD, 0x4E, 0x1B,
+ 0xBC, 0x54, 0x83, 0x50, 0x27, 0xA1, 0xF9, 0xB0, 0xFF, 0xA1, 0x58, 0x71, 0xAD, 0x72, 0x05, 0xAB,
+ 0x90, 0xEC, 0x99, 0x63, 0x69, 0x7F, 0x81, 0xF3, 0xED, 0x31, 0x76, 0x52, 0x6C, 0x5D, 0x56, 0xFA,
+ 0x74, 0x29, 0xFA, 0x40, 0xD7, 0x78, 0x75, 0x29, 0x66, 0x28, 0x46, 0xB2, 0x01, 0xF6, 0xAE, 0x63,
+ 0x37, 0xA5, 0xF9, 0x9F, 0x0F, 0x08, 0x65, 0x27, 0x7D, 0x68, 0xB7, 0x28, 0xD6, 0x5F, 0x04, 0x5F,
+ 0xA8, 0x3F, 0x0D, 0x0B, 0x4E, 0x4B, 0x60, 0x7D, 0xCA, 0xA4, 0x2A, 0x20, 0x5C, 0xD3, 0x0B, 0x58,
+ 0xFF, 0x65, 0x6F, 0xCF, 0x5A, 0x75, 0x1A, 0xB7, 0x75, 0x62, 0x0E, 0xBF, 0xFA, 0xD0, 0xBF, 0xB9,
+ 0x14, 0xE9, 0x56, 0xE7, 0x2C, 0x3D, 0x2C, 0x7C, 0x5D, 0x7E, 0xA8, 0x4B, 0x7F, 0x6B, 0x94, 0x84,
+ 0x17, 0x8C, 0x90, 0x24, 0x06, 0xFD, 0xE0, 0xCE, 0xD7, 0x03, 0xAB, 0x29, 0x9A, 0xCE, 0x09, 0xAB,
+ 0xF0, 0x83, 0x20, 0x19, 0xC4, 0x08, 0xB5, 0x74, 0x45, 0x5C, 0xDB, 0x99, 0xF5, 0x3D, 0x2A, 0x9F,
+ 0x6A, 0xB6, 0x70, 0xBD, 0x6D, 0x9C, 0x8A, 0xF2, 0x18, 0x64, 0x13, 0x5D, 0x92, 0x09, 0x78, 0xD6,
+ 0x04, 0x2A, 0xFB, 0x75, 0xF7, 0x0D, 0xDE, 0x95, 0x81, 0x52, 0xB3, 0x69, 0xF0, 0x0F, 0x84, 0xA2,
+ 0xED, 0x02, 0xB5, 0x79, 0x98, 0x51, 0x66, 0x0B, 0xBD, 0x72, 0x6F, 0xAA, 0xFE, 0xAA, 0x1B, 0x03,
+ 0x4B, 0x3D, 0x24, 0x52, 0xCA, 0x81, 0x78, 0xFE, 0x91, 0xAF, 0x33, 0x90, 0x1D, 0x42, 0x9B, 0x1F,
+ 0xE0, 0x26, 0x39, 0x09, 0x2B, 0xBF, 0x41, 0xDD, 0xB4, 0x99, 0xF6, 0x39, 0x29, 0x5A, 0xF6, 0x20,
+ 0x46, 0xB2, 0x4C, 0x89, 0xF6, 0x87, 0xF0, 0x91, 0x2E, 0x3C, 0xE0, 0x91, 0x1E, 0x4F, 0x4E, 0x3E,
+ 0x49, 0xAB, 0x79, 0x55, 0xA5, 0x7D, 0xE7, 0xAA, 0x35, 0x31, 0x1B, 0xB1, 0x6F, 0x76, 0x30, 0xBC,
+ 0xC6, 0x3E, 0x6C, 0x9B, 0xAB, 0x99, 0x82, 0xB5, 0xA2, 0x37, 0xBD, 0xAC, 0x37, 0x39, 0xAB, 0xA9,
+ 0xCC, 0xD9, 0x65, 0xC6, 0x3D, 0x5E, 0x8B, 0x08, 0x0B, 0x0E, 0xAE, 0xA8, 0x44, 0xFC, 0x30, 0x26,
+ 0x92, 0x3A, 0xAB, 0x9E, 0xB5, 0x16, 0x85, 0xD8, 0xDA, 0x4E, 0x54, 0x36, 0x69, 0x8E, 0x4D, 0xB6,
+ 0x61, 0x83, 0xAF, 0x46, 0x5F, 0x17, 0x71, 0xF2, 0x7C, 0xD2, 0x53, 0xD0, 0xD7, 0xC3, 0x52, 0x6A,
+ 0x8A, 0x18, 0x40, 0xB6, 0x00, 0xD7, 0x0F, 0x41, 0x0B, 0xC1, 0xC5, 0xC0, 0xA6, 0x98, 0x59, 0x7C,
+ 0x45, 0x19, 0x11, 0xDA, 0x2C, 0xE3, 0xCE, 0x56, 0x9E, 0xBF, 0x85, 0xCE, 0xFA, 0xE5, 0x68, 0x66,
+ 0x06, 0xE6, 0x57, 0x58, 0x76, 0xAD, 0xB6, 0xC7, 0xFE, 0x2E, 0x2F, 0xA1, 0x62, 0x7D, 0x8C, 0xB9,
+ 0xC6, 0xBC, 0xF9, 0x0A, 0x84, 0x1A, 0xB7, 0xF6, 0x5C, 0x75, 0x00, 0x1F, 0xA0, 0x6B, 0xF9, 0x54,
+ 0x51, 0xB6, 0xBD, 0xA4, 0xC3, 0xDF, 0x25, 0x07, 0x93, 0x33, 0x6B, 0x8C, 0x7E, 0x7C, 0xC8, 0x16,
+ 0x78, 0x1A, 0xDA, 0xCA, 0x48, 0x4A, 0x7C, 0x61, 0xAD, 0xEE, 0x08, 0x51, 0xCB, 0xE4, 0x99, 0xB2,
+ 0x2A, 0x02, 0x6F, 0x0D, 0x86, 0x1C, 0xC1, 0xD5, 0x0C, 0x55, 0x91, 0xDE, 0x77, 0xF2, 0xE2, 0x96,
+ 0xEF, 0xD7, 0x39, 0x08, 0x42, 0x22, 0x6D, 0x2B, 0xA0, 0xE4, 0xA1, 0x38, 0x86, 0x4F, 0xE4, 0x1A,
+ 0xF2, 0x30, 0xCB, 0xD9, 0x38, 0x1E, 0xF0, 0x27, 0xAA, 0x1A, 0xA3, 0xD6, 0x2B, 0xC8, 0xE8, 0x5E,
+ 0x31, 0xBF, 0xEB, 0x3A, 0x68, 0xF2, 0x98, 0x94, 0xA0, 0x8A, 0x6E, 0x07, 0x2A, 0x81, 0xE7, 0x01,
+ 0xD3, 0x7C, 0xD8, 0x58, 0x19, 0x96, 0x53, 0xA8, 0x3C, 0x71, 0x0E, 0x4C, 0xFB, 0x24, 0x7D, 0x63,
+ 0x47, 0x61, 0x90, 0x94, 0x71, 0x18, 0x38, 0x35, 0x80, 0x03, 0x41, 0xD4, 0x3E, 0xA9, 0x27, 0xAE,
+ 0xB7, 0x0B, 0x9A, 0xD1, 0xDB, 0xC5, 0x1F, 0x38, 0x88, 0x73, 0xD2, 0x3C, 0xB0, 0x72, 0x60, 0x5C,
+ 0xFD, 0xF9, 0xD3, 0x3F, 0x90, 0x89, 0x2B, 0xE2, 0x6C, 0x08, 0x4E, 0xB6, 0x4E, 0xF1, 0x4F, 0x5D,
+ 0x82, 0x3C, 0xC6, 0x08, 0x96, 0xA3, 0xEB, 0xFF, 0xEC, 0xF4, 0xC5, 0xB1, 0xC7, 0x1B, 0xF3, 0x5E,
+ 0x67, 0x6F, 0x11, 0xA3, 0xAC, 0x18, 0xF8, 0xF3, 0x0F, 0x6A, 0x64, 0x02, 0x4F, 0xE2, 0xE4, 0x3A,
+ 0x2A, 0x20, 0x28, 0x5B, 0x5E, 0xAC, 0x83, 0x8C, 0xA3, 0xF1, 0x67, 0x0D, 0xBA, 0x8E, 0xEC, 0x25,
+ 0xDE, 0x7D, 0xEF, 0xCF, 0x2C, 0x06, 0x74, 0x9F, 0x9A, 0x38, 0x70, 0x8D, 0xD0, 0x3E, 0xEA, 0x90,
+ 0x5E, 0xD1, 0xAE, 0xDB, 0x03, 0xC7, 0x8A, 0xEF, 0x55, 0x54, 0x34, 0xB2, 0x15, 0x6F, 0x17, 0x60,
+ 0x31, 0xE4, 0x32, 0x27, 0xF3, 0x82, 0xAE, 0xFB, 0x9E, 0x6E, 0x25, 0x4A, 0x96, 0xFE, 0x23, 0x4E,
+ 0xFB, 0x46, 0xFC, 0xB8, 0x02, 0xAB, 0xD4, 0xD3, 0x1F, 0x0B, 0x23, 0x72, 0x10, 0xAD, 0x6F, 0x13,
+ 0x56, 0xB4, 0x95, 0x20, 0xD3, 0x5A, 0x48, 0xE0, 0xC4, 0xBB, 0x96, 0x4C, 0x52, 0xEA, 0x25, 0x9F,
+ 0xAE, 0xFE, 0x49, 0x3A, 0xA2, 0x54, 0x98, 0x53, 0x06, 0xD3, 0x1A, 0xC2, 0x6C, 0x5A, 0x6D, 0xD7,
+ 0x28, 0xDE, 0x54, 0xDC, 0xCC, 0x2D, 0x42, 0x48, 0x3D, 0x33, 0xA7, 0x9E, 0xEE, 0x9E, 0xAE, 0xAC,
+ 0x4D, 0x8B, 0x0D, 0x98, 0x03, 0xF0, 0x4D, 0xF9, 0x40, 0x62, 0x12, 0x38, 0x34, 0xA4, 0x81, 0xA3,
+ 0x51, 0xA2, 0xDB, 0x76, 0xDD, 0x33, 0xEA, 0x6B, 0xB1, 0x54, 0x6F, 0xCF, 0x42, 0x6C, 0xAB, 0x9D,
+ 0x15, 0x93, 0x3A, 0x0C, 0xEA, 0xD0, 0x0B, 0xBB, 0x77, 0xB1, 0xA0, 0x23, 0xDA, 0x15, 0x10, 0xA9,
+ 0x3E, 0xE6, 0x2F, 0x52, 0x41, 0x57, 0xA8, 0x86, 0xEB, 0x43, 0x96, 0x63, 0x8D, 0x98, 0xE2, 0xE3,
+ 0x8F, 0x2B, 0xA3, 0xB4, 0xAD, 0x2D, 0xDE, 0x72, 0xF0, 0x08, 0xBB, 0x19, 0x42, 0xFB, 0xA4, 0x56,
+ 0x13, 0xEF, 0xF5, 0xE0, 0x6D, 0x2F, 0x9D, 0x87, 0x81, 0x2C, 0xCB, 0xC9, 0x72, 0x21, 0x27, 0xB5,
+ 0x23, 0xB2, 0x9F, 0xC4, 0x0F, 0x4E, 0xBA, 0x9C, 0xF4, 0x86, 0xBE, 0xC7, 0x9C, 0xF9, 0x53, 0xA7,
+ 0xE1, 0x99, 0xB0, 0xF0, 0xF9, 0x35, 0x47, 0x00, 0xB9, 0xC4, 0xED, 0x11, 0x21, 0x5A, 0x48, 0xAE,
+ 0x71, 0xC7, 0xD3, 0xFC, 0x78, 0xBB, 0x69, 0xEA, 0x9A, 0xEA, 0x60, 0x2A, 0x8D, 0xE8, 0x16, 0x33,
+ 0x80, 0x2F, 0x38, 0xEF, 0x9E, 0x09, 0x18, 0x2D, 0xCF, 0x0F, 0xD5, 0x23, 0x8A, 0xF2, 0xE0, 0x2E,
+ 0x68, 0x97, 0x4F, 0x24, 0xCE, 0xD9, 0xD8, 0xC4, 0xAE, 0xCC, 0x97, 0x56, 0x01, 0x0A, 0x2B, 0x3A,
+ 0x42, 0x6D, 0xB4, 0x04, 0xA2, 0x4A, 0x78, 0x77, 0x9F, 0xC2, 0x1E, 0x25, 0x2C, 0x2F, 0x69, 0xC1,
+ 0x3D, 0x4C, 0xB2, 0x8C, 0x9A, 0x02, 0xB8, 0x20, 0x4E, 0xBD, 0x7B, 0x65, 0xFC, 0x7A, 0xDE, 0x24,
+ 0x30, 0x2A, 0xF2, 0x79, 0xD1, 0x5E, 0x45, 0x7D, 0x6D, 0x6B, 0x93, 0xDC, 0xF3, 0x2A, 0xF4, 0x40,
+ 0x6B, 0xE0, 0x08, 0x09, 0xD0, 0x2E, 0x9A, 0xCA, 0x64, 0x42, 0x63, 0xF7, 0x7B, 0x8D, 0x16, 0x49,
+ 0x8F, 0x02, 0xEB, 0x22, 0xCB, 0x8B, 0xB3, 0xE1, 0x3F, 0x10, 0x89, 0xAE, 0x02, 0x72, 0xA0, 0x1A,
+ 0x5E, 0xE4, 0xDD, 0x82, 0x72, 0x50, 0x6A, 0x05, 0xAB, 0x2A, 0xFE, 0xCA, 0x27, 0x4F, 0xF7, 0xC6,
+ 0xBE, 0xDE, 0xC4, 0x7D, 0x0F, 0xF4, 0x5C, 0x38, 0x50, 0xDC, 0x37, 0xF3, 0x13, 0xCA, 0x54, 0x56,
+ 0x30, 0x2F, 0xFF, 0xB1, 0xBC, 0xD1, 0xED, 0x19, 0xA4, 0xFC, 0x84, 0xB0, 0x9E, 0xC3, 0x5A, 0xA7,
+ 0x63, 0x43, 0x7C, 0x8A, 0x06, 0x4D, 0x04, 0x72, 0x16, 0x6B, 0x22, 0xA6, 0x74, 0x0E, 0x12, 0x47,
+ 0x5E, 0xA1, 0x74, 0x72, 0xEE, 0x65, 0x95, 0x8E, 0x30, 0x6B, 0xBF, 0x92, 0xE6, 0x3E, 0xA0, 0xB8,
+ 0x86, 0x55, 0x54, 0xC8, 0x0A, 0x20, 0xA9, 0xE9, 0xAE, 0x5B, 0x47, 0x2E, 0xCE, 0x0A, 0xD5, 0x4B,
+ 0xAF, 0x22, 0xA0, 0x23, 0x3E, 0x4E, 0x77, 0xA7, 0x64, 0x01, 0x15, 0x47, 0x28, 0x6A, 0xD1, 0x90,
+ 0xCD, 0x32, 0x74, 0x7A, 0x02, 0x80, 0xEA, 0x91, 0x2E, 0x6B, 0x22, 0x52, 0x68, 0xC2, 0x40, 0x19,
+ 0xCE, 0xB7, 0x9A, 0xA2, 0xB3, 0x8A, 0xF5, 0xD8, 0xD8, 0x7B, 0x3E, 0x23, 0xA9, 0x33, 0x56, 0x06,
+ 0x1C, 0x74, 0x73, 0x93, 0x3E, 0x97, 0x5C, 0x41, 0x4D, 0x3F, 0xFF, 0x97, 0xD8, 0x94, 0x29, 0xAF,
+ 0x06, 0xD9, 0xC3, 0xF1, 0xD6, 0x8D, 0xA7, 0xEE, 0xAA, 0x26, 0xF7, 0x4F, 0x43, 0x5E, 0x60, 0x8D,
+ 0x0B, 0xD5, 0xAA, 0xD9, 0x89, 0x79, 0x04, 0x7B, 0xC3, 0x90, 0x1A, 0xDF, 0xA7, 0xB1, 0xBA, 0xC5,
+ 0xCA, 0xAB, 0x0C, 0xB8, 0xE8, 0xF0, 0x45, 0xDC, 0x85, 0xB5, 0x3B, 0xAC, 0xA7, 0xB2, 0x5C, 0x25,
+ 0x52, 0x90, 0x0D, 0x4C, 0xEF, 0xFF, 0x06, 0x0F, 0xEE, 0x0F, 0x8A, 0xE9, 0x93, 0x60, 0x3D, 0x8D,
+ 0x47, 0xC7, 0x55, 0xD9, 0x23, 0xAF, 0x77, 0xDB, 0x01, 0x69, 0xBA, 0x3D, 0x9B, 0x62, 0x74, 0x44,
+ 0x8E, 0x65, 0x40, 0x66, 0x3E, 0xDF, 0x54, 0x45, 0x8F, 0xF5, 0xA8, 0x8F, 0xD6, 0x51, 0x42, 0xDE,
+ 0x9D, 0x02, 0xDB, 0x90, 0xD3, 0x93, 0x8C, 0xE0, 0x0E, 0xFA, 0x11, 0xCF, 0xA9, 0xBD, 0x94, 0xDA,
+ 0x0F, 0x94, 0x33, 0xF7, 0xA8, 0x80, 0x62, 0x61, 0xAC, 0xE6, 0x1E, 0xC6, 0x80, 0x55, 0x9D, 0x7C,
+ 0x5B, 0xB8, 0xB3, 0x67, 0xBB, 0x69, 0xA6, 0x6D, 0xE1, 0x42, 0xD6, 0x81, 0x4E, 0x13, 0x68, 0xC0,
+ 0x6B, 0x01, 0xE8, 0x0F, 0xFB, 0xD4, 0x07, 0x08, 0xC7, 0x33, 0xAB, 0x3A, 0x68, 0x23, 0x14, 0x86,
+ 0xC7, 0x76, 0x13, 0xD5, 0x38, 0xF6, 0x4C, 0x91, 0x3E, 0x4F, 0x10, 0xC3, 0x7A, 0xD0, 0x9B, 0xF6,
+ 0x58, 0x42, 0xD5, 0x12, 0x5A, 0xCE, 0x58, 0x1A, 0xB0, 0xBF, 0x27, 0x96, 0xFA, 0xE5, 0x8C, 0x43,
+ 0xF7, 0xDE, 0xBD, 0x5F, 0xE3, 0x79, 0x69, 0xDC, 0x57, 0xA5, 0x12, 0x27, 0x77, 0x61, 0x5E, 0x97,
+ 0xD4, 0x6F, 0xF6, 0x6E, 0x5B, 0x46, 0x98, 0x8F, 0x06, 0xC9, 0x58, 0xAB, 0x2D, 0x02, 0x8C, 0x93,
+ 0x61, 0x7F, 0xDF, 0x14, 0xB1, 0xEC, 0xFD, 0x97, 0xFE, 0x80, 0xD5, 0xCA, 0x08, 0x57, 0x23, 0x9F,
+ 0x49, 0x3A, 0xE3, 0x56, 0xD8, 0x5A, 0x3C, 0x52, 0x5A, 0x4B, 0xC0, 0x8C, 0xB3, 0x79, 0xD7, 0xC4,
+ 0xFD, 0x48, 0xF3, 0xEA, 0x4C, 0x40, 0xF9, 0x36, 0x15, 0x47, 0x3B, 0x14, 0x48, 0x51, 0xF0, 0xC6,
+ 0xBB, 0x30, 0xBB, 0x80, 0xA3, 0x5C, 0x6F, 0xBD, 0xA1, 0x4E, 0xEC, 0x71, 0x52, 0x44, 0x98, 0xB2,
+ 0x82, 0x49, 0x2D, 0xEB, 0x61, 0x22, 0xEE, 0xFC, 0x60, 0xCB, 0x01, 0x53, 0xAA, 0xFD, 0x9A, 0xC8,
+ 0x1B, 0xE9, 0xE4, 0x8C, 0x2C, 0x3C, 0xC8, 0x0A, 0x82, 0xCA, 0x3C, 0x92, 0xB5, 0x96, 0xDA, 0xF1,
+ 0x41, 0x76, 0x8D, 0x19, 0xED, 0x3B, 0xEE, 0x44, 0xB0, 0xD2, 0xB3, 0xE9, 0xD5, 0x8E, 0xD5, 0x70,
+ 0x67, 0x72, 0xD0, 0x33, 0x2B, 0xFC, 0x50, 0x83, 0x1A, 0x72, 0xAE, 0xFE, 0xF0, 0x87, 0x07, 0xD7,
+ 0x19, 0x97, 0xDB, 0x95, 0xEF, 0xDD, 0xBB, 0xEC, 0x3F, 0xC8, 0x08, 0xBB, 0x87, 0x5C, 0xB2, 0x51,
+ 0x3F, 0xEE, 0x27, 0xF4, 0xA8, 0x2C, 0x6C, 0x3B, 0x0C, 0xB9, 0x7C, 0xFB, 0x75, 0xA3, 0xAE, 0x1C,
+ 0xFD, 0x1F, 0x99, 0xF2, 0x5F, 0x30, 0x16, 0x0B, 0x24, 0xB7, 0x02, 0xE5, 0xDD, 0x59, 0x8E, 0x98,
+ 0x92, 0x1E, 0xDB, 0x6C, 0x6E, 0xCF, 0x51, 0x81, 0xE0, 0xF5, 0x32, 0xAD, 0x5F, 0xCC, 0xA1, 0x91,
+ 0x5F, 0x2E, 0xAC, 0xA0, 0xB1, 0x9B, 0x2F, 0xAF, 0x7E, 0x8E, 0x30, 0x76, 0x82, 0xE3, 0x74, 0x01,
+ 0x2C, 0x2C, 0xB3, 0xB3, 0xAD, 0xC3, 0x3B, 0x2C, 0x45, 0xB3, 0x40, 0x97, 0x4B, 0xEB, 0xFD, 0xC6,
+ 0x55, 0xD9, 0x66, 0x0A, 0x4F, 0x3F, 0xB4, 0xE6, 0x01, 0x68, 0x9F, 0x20, 0xEC, 0x97, 0xBE, 0x6C,
+ 0x09, 0xFF, 0x26, 0x09, 0x3D, 0x66, 0x0F, 0x19, 0x2C, 0xAF, 0xBD, 0xA2, 0xF4, 0xEA, 0xD1, 0xF6,
+ 0x37, 0x64, 0x8A, 0x9E, 0x9A, 0x79, 0xFC, 0x20, 0xEC, 0x5B, 0x58, 0x74, 0x8A, 0xD7, 0x78, 0x8E,
+ 0x1F, 0xBF, 0xEC, 0x78, 0xC0, 0x65, 0xE8, 0xD8, 0x4A, 0x72, 0xEB, 0x13, 0x4C, 0xD8, 0xE9, 0x7B,
+ 0xEC, 0x48, 0x00, 0x33, 0x69, 0x92, 0xDC, 0xE9, 0xBE, 0xE5, 0xC7, 0xCE, 0x56, 0x2E, 0x9B, 0xD3,
+ 0x4D, 0xFD, 0xE7, 0x68, 0xE1, 0xCE, 0x18, 0x8D, 0xD0, 0x92, 0x39, 0xE1, 0x69, 0x83, 0x55, 0x54,
+ 0x62, 0xE8, 0x26, 0x8B, 0xAB, 0xA0, 0xAC, 0xB2, 0xFD, 0xB2, 0xBB, 0xB0, 0xD4, 0x1B, 0xC8, 0x2F,
+ 0xA8, 0x9E, 0x9B, 0x24, 0x56, 0xB8, 0x6E, 0xEE, 0x2F, 0x36, 0x2E, 0xD4, 0x2B, 0x9A, 0x2C, 0x00,
+ 0xE1, 0x18, 0x67, 0xD6, 0x13, 0x35, 0xF2, 0x8F, 0x77, 0x88, 0x36, 0x40, 0x1F, 0x7B, 0x18, 0x6C,
+ 0x2B, 0xE6, 0x0E, 0x26, 0x30, 0x98, 0x71, 0x20, 0xE1, 0xA5, 0xF4, 0x94, 0x36, 0xEF, 0x73, 0x52,
+ 0x59, 0xF2, 0x87, 0x67, 0xFD, 0xBA, 0x55, 0x40, 0xBE, 0x3B, 0x3B, 0x25, 0x89, 0x40, 0x73, 0xBA,
+ 0x60, 0xAF, 0x50, 0xBE, 0xEA, 0xC3, 0x31, 0x34, 0x32, 0x71, 0xE4, 0xEC, 0x0E, 0x24, 0x9D, 0x46,
+ 0x56, 0x33, 0xC7, 0x01, 0x94, 0xA5, 0x51, 0xD1, 0xC6, 0xDB, 0xCA, 0x26, 0x8D, 0x89, 0xAF, 0xA9,
+ 0x89, 0x7F, 0x26, 0xFB, 0x67, 0x92, 0x73, 0x39, 0x1A, 0x1A, 0x1C, 0x4E, 0xEB, 0x72, 0x68, 0x92,
+ 0x9F, 0x71, 0x35, 0x13, 0x38, 0x36, 0xF8, 0x0D, 0xBF, 0x95, 0x9F, 0x35, 0x00, 0x79, 0x47, 0x41,
+ 0x62, 0x23, 0xBA, 0xF4, 0xCA, 0xC6, 0x12, 0x7C, 0x96, 0x9D, 0xB8, 0x40, 0x4F, 0x7E, 0x31, 0x01,
+ 0x1E, 0xC7, 0xFD, 0x49, 0xB9, 0xC2, 0x2B, 0x35, 0x24, 0x2A, 0x13, 0x89, 0x62, 0x63, 0xBA, 0x6C,
+ 0xA8, 0x93, 0x6D, 0x99, 0xED, 0x9C, 0xE9, 0xB0, 0xF1, 0x8C, 0x9D, 0xA9, 0xEF, 0xDE, 0xF0, 0x92,
+ 0x1A, 0x3B, 0xA9, 0x94, 0x38, 0x87, 0xA2, 0x53, 0x65, 0x31, 0xAE, 0x0C, 0x96, 0x64, 0xAC, 0xC8,
+ 0xF8, 0x03, 0x65, 0x59, 0x5A, 0xAF, 0xD7, 0x8B, 0x0B, 0x31, 0xD9, 0x3A, 0x2F, 0x1C, 0xE3, 0x49,
+ 0xF3, 0xFA, 0x80, 0x9D, 0x34, 0x0D, 0xC0, 0xCE, 0xBB, 0x6E, 0x90, 0x6E, 0xA5, 0xA7, 0x0D, 0xB4,
+ 0xB8, 0x04, 0x6A, 0xD6, 0x0C, 0x95, 0x79, 0x9E, 0x27, 0x43, 0xDD, 0xD1, 0x8E, 0x8F, 0xE0, 0x19,
+ 0xB5, 0xBF, 0xD9, 0x25, 0xEE, 0xBB, 0x3E, 0x79, 0x0D, 0x9E, 0x0B, 0x03, 0x3D, 0x09, 0x9C, 0xF1,
+ 0x02, 0x0A, 0x81, 0x7B, 0xCE, 0x95, 0x44, 0x99, 0x72, 0xC5, 0x18, 0x4B, 0xD4, 0x9E, 0x5E, 0x8B,
+ 0x2D, 0x5F, 0x1E, 0x13, 0xF1, 0x95, 0xCA, 0x37, 0x75, 0x49, 0x7D, 0x3A, 0x1A, 0x22, 0x02, 0xAC,
+ 0x3E, 0xFE, 0x62, 0xF9, 0x59, 0xB7, 0x11, 0x82, 0xB6, 0x55, 0x82, 0xC7, 0x13, 0xB7, 0x83, 0x8C,
+ 0x1E, 0x90, 0xB4, 0x3D, 0x9B, 0x57, 0xE7, 0x1F, 0x4E, 0xB1, 0x70, 0xF4, 0x9E, 0x06, 0x3B, 0x97,
+ 0xF4, 0xC1, 0xBA, 0x3D, 0xAD, 0x50, 0x01, 0x21, 0xBB, 0x0F, 0xE1, 0x60, 0x49, 0x25, 0x5A, 0x0F,
+ 0xA3, 0x24, 0x33, 0x97, 0xA4, 0xA2, 0x8D, 0xFE, 0x9E, 0x17, 0x7D, 0x42, 0x3D, 0x40, 0xBB, 0xE5,
+ 0xFB, 0xB2, 0xCA, 0x2C, 0x93, 0x38, 0x13, 0xEA, 0x5C, 0xEB, 0x53, 0xFD, 0xFE, 0xD1, 0x2C, 0xB8,
+ 0xF6, 0xE2, 0x0C, 0xDF, 0xFA, 0x93, 0x2C, 0x25, 0x5C, 0x63, 0x07, 0x27, 0x11, 0x4E, 0x5E, 0xFA,
+ 0xD0, 0x9D, 0x2E, 0xE3, 0x85, 0xA8, 0xC5, 0x8B, 0x7B, 0xFE, 0xA0, 0x9C, 0xFE, 0xFE, 0xE5, 0x69,
+ 0xD8, 0x59, 0xAA, 0x52, 0x40, 0x71, 0x6B, 0x1D, 0x51, 0xDA, 0x13, 0x48, 0xEC, 0xCE, 0x1E, 0x2A,
+ 0xE5, 0x70, 0x66, 0xB1, 0x1F, 0xA6, 0x65, 0x3E, 0x99, 0x8E, 0x4B, 0x4D, 0x7C, 0x75, 0xB1, 0x46,
+ 0x51, 0x07, 0x6E, 0x31, 0x7E, 0xE7, 0x5D, 0xE7, 0x66, 0xA6, 0x6F, 0x65, 0x4E, 0xBD, 0xEF, 0x1E,
+ 0xEC, 0x90, 0x36, 0xFA, 0xDB, 0x73, 0x5F, 0x54, 0x68, 0x9A, 0xFD, 0xD9, 0x3D, 0xF0, 0xDC, 0xD5,
+ 0xA3, 0xBF, 0x45, 0xBD, 0x24, 0x7D, 0xB5, 0xC4, 0xC5, 0x63, 0x5F, 0xBC, 0x4C, 0x19, 0x1A, 0xA3,
+ 0x84, 0x71, 0xBD, 0x63, 0x8B, 0x85, 0x71, 0x30, 0x2C, 0x00, 0x76, 0x90, 0xDB, 0x44, 0xFC, 0x86,
+ 0x40, 0x10, 0x4C, 0x4F, 0x9E, 0xFB, 0xC9, 0xF3, 0x61, 0xED, 0x6A, 0x37, 0x7F, 0x76, 0x1E, 0x8D,
+ 0xB2, 0x30, 0x2B, 0xC1, 0x9F, 0x00, 0xF0, 0x54, 0x60, 0x13, 0x74, 0x87, 0x83, 0x90, 0xCD, 0xF3,
+ 0x78, 0xD7, 0x84, 0xA2, 0xCA, 0x47, 0x7F, 0x10, 0xD8, 0xC5, 0xEA, 0xA4, 0xA7, 0x53, 0x47, 0xEF,
+ 0x43, 0x44, 0xA4, 0xEB, 0xD4, 0x73, 0xB9, 0x08, 0xB1, 0x06, 0xD5, 0xD1, 0xF5, 0x9D, 0x92, 0x2C,
+ 0xA2, 0x6C, 0x69, 0x68, 0xF6, 0xD2, 0xEF, 0x35, 0x1F, 0x91, 0xC8, 0x8F, 0x78, 0xF5, 0x2D, 0xB4,
+ 0x83, 0x2C, 0x97, 0x3F, 0xF3, 0x51, 0x42, 0xE7, 0x8C, 0xE0, 0xDC, 0x01, 0x34, 0x66, 0x05, 0x9A,
+ 0x61, 0x6E, 0x90, 0x5F, 0x0C, 0xCD, 0xC9, 0x74, 0x8F, 0x5B, 0xA0, 0x40, 0xB6, 0xAF, 0x48, 0xAA,
+ 0xD9, 0xFA, 0x06, 0x6D, 0xCE, 0x4E, 0x0E, 0x62, 0x8E, 0xF3, 0x23, 0xEB, 0xF5, 0xE5, 0x22, 0x50,
+ 0x74, 0x06, 0x05, 0xA3, 0x00, 0xD7, 0x5C, 0x5E, 0x68, 0x1B, 0x0F, 0xB1, 0x38, 0xB0, 0x46, 0xE1,
+ 0x7B, 0xB7, 0xA1, 0x0F, 0x7B, 0x9A, 0xC2, 0xA3, 0x78, 0x03, 0xD5, 0xA7, 0x93, 0xB1, 0x76, 0xE8,
+ 0xB5, 0x32, 0x8E, 0x5A, 0x2E, 0xA3, 0xCC, 0xC7, 0x6B, 0xAD, 0x88, 0xB1, 0x7C, 0x68, 0xC8, 0x1A,
+ 0x09, 0xAC, 0x19, 0xA1, 0x7F, 0x00, 0xB1, 0xC2, 0xAB, 0x1F, 0x81, 0x29, 0x7A, 0x5C, 0xF1, 0x55,
+ 0xF9, 0x96, 0x52, 0x5E, 0x8C, 0x57, 0x65, 0xDA, 0x5B, 0xC6, 0x0E, 0xB1, 0xC6, 0x0F, 0x50, 0x9C,
+ 0x61, 0x20, 0x7A, 0x62, 0x68, 0x53, 0x4E, 0xF9, 0x40, 0xA4, 0xD4, 0x66, 0xF8, 0xC7, 0x0B, 0xE6,
+ 0x09, 0xA6, 0xBD, 0xBF, 0xA3, 0x57, 0x5E, 0xD6, 0xA1, 0x84, 0x49, 0x05, 0x54, 0x69, 0xC7, 0xA4,
+ 0x67, 0x08, 0x37, 0x3A, 0xD3, 0xD3, 0x43, 0x8E, 0xD3, 0xD1, 0xBF, 0xBD, 0x6A, 0x8D, 0x3A, 0x14,
+ 0x76, 0x6F, 0x04, 0xDE, 0x69, 0x0D, 0xD5, 0x07, 0xF4, 0xEA, 0x36, 0x28, 0x9E, 0x54, 0x47, 0x25,
+ 0x7D, 0x02, 0x54, 0x53, 0xFC, 0x68, 0x72, 0x77, 0xE4, 0x9E, 0x6B, 0xF7, 0xAC, 0xD2, 0xBF, 0xA7,
+ 0xC5, 0x3C, 0xF6, 0x99, 0xEB, 0xC7, 0xA3, 0x11, 0x33, 0xB6, 0xB6, 0x62, 0x4A, 0x3B, 0x93, 0xC2,
+ 0xF6, 0xC7, 0xF1, 0x7B, 0x3F, 0x6D, 0x2D, 0x12, 0x4B, 0x46, 0xC3, 0xC2, 0xC7, 0x5F, 0xDE, 0xC0,
+ 0xFD, 0x5E, 0xCD, 0x3B, 0xD1, 0x4C, 0x41, 0x77, 0x0A, 0x77, 0x3A, 0xA8, 0xB1, 0xEF, 0x02, 0x49,
+ 0x54, 0xA2, 0x3B, 0xA7, 0x79, 0xEF, 0x2B, 0x56, 0x32, 0x7E, 0x81, 0x71, 0xA6, 0x99, 0x53, 0x8D,
+ 0xBF, 0x07, 0x9A, 0x4B, 0x70, 0x7F, 0x1D, 0x84, 0x99, 0xCE, 0x0C, 0x4F, 0x7A, 0x99, 0xBA, 0x94,
+ 0x52, 0xFE, 0x06, 0xDE, 0x2A, 0xF1, 0xDF, 0x75, 0x45, 0x38, 0x25, 0xD9, 0xC4, 0x6A, 0xF1, 0x5B,
+ 0x2B, 0xA3, 0x50, 0x00, 0x68, 0xE7, 0x9C, 0xBC, 0x90, 0xDB, 0x38, 0xF7, 0xEC, 0xBD, 0xDB, 0x1B,
+ 0x77, 0xFF, 0xF8, 0xB8, 0xDB, 0xE8, 0xE5, 0x7F, 0x71, 0xF1, 0x9B, 0x83, 0x98, 0xF3, 0xE2, 0x4E,
+ 0xA6, 0xBD, 0xE7, 0xD7, 0xD2, 0xBF, 0xB1, 0x89, 0x54, 0x3D, 0x36, 0xF0, 0x4E, 0x85, 0x5F, 0x14,
+ 0xE3, 0x58, 0x5B, 0x24, 0x86, 0x75, 0x8D, 0x98, 0x0C, 0xBA, 0x5D, 0x26, 0x62, 0xC4, 0xC2, 0x84,
+ 0xA6, 0xF9, 0x9B, 0x42, 0x0F, 0xA1, 0x8D, 0x39, 0xF1, 0x67, 0xCE, 0xE7, 0xB8, 0x70, 0x24, 0xB8,
+ 0xE6, 0x82, 0xE8, 0xC7, 0xF6, 0x7B, 0xFE, 0xD8, 0x38, 0xCF, 0x1D, 0x0D, 0xEA, 0x7D, 0xBB, 0x65,
+ 0x61, 0x9B, 0xFA, 0xA2, 0xB8, 0xA7, 0x9B, 0xAD, 0x76, 0x0B, 0x93, 0x00, 0x5E, 0x43, 0x10, 0x4A,
+ 0x5F, 0x22, 0xCA, 0x74, 0x8E, 0xEC, 0x2B, 0xB4, 0x68, 0x44, 0x2C, 0x95, 0x4A, 0xDA, 0xDA, 0xC5,
+ 0xBE, 0x8B, 0xFF, 0x4C, 0xC2, 0x0A, 0x74, 0xE0, 0x6E, 0x45, 0xBD, 0xD5, 0x0A, 0x50, 0xB1, 0x33,
+ 0x8D, 0x57, 0xE8, 0xF0, 0x78, 0x6D, 0x05, 0x2B, 0x9C, 0x56, 0xC7, 0xB7, 0xE4, 0x66, 0xB8, 0x72,
+ 0x90, 0x92, 0xC0, 0x07, 0x7B, 0x18, 0xB1, 0x14, 0x6A, 0x64, 0xEE, 0xC1, 0x9F, 0x0D, 0xB4, 0x1D,
+ 0xE7, 0xF1, 0x17, 0x49, 0xB1, 0x84, 0xD9, 0x26, 0xA5, 0x9A, 0xFA, 0xF1, 0xA3, 0x55, 0xC2, 0xAA,
+ 0xF5, 0xBE, 0x49, 0xF6, 0x6C, 0x67, 0x93, 0x04, 0x0A, 0xE3, 0xC0, 0xA1, 0x72, 0x8B, 0xE7, 0x05,
+ 0xEA, 0x70, 0xEF, 0x27, 0xF4, 0xC0, 0xE3, 0xBE, 0x57, 0xA3, 0x66, 0xAF, 0x83, 0x04, 0x0E, 0xAD,
+ 0x08, 0x77, 0x1F, 0xA4, 0x1C, 0xA5, 0xF5, 0xED, 0x03, 0xB4, 0x0E, 0xDA, 0xEC, 0xFD, 0x9D, 0x8B,
+ 0x81, 0x5C, 0xDF, 0xAE, 0x5D, 0xEC, 0x08, 0x94, 0x78, 0xA4, 0x0F, 0x1A, 0x75, 0x0B, 0x32, 0xE2,
+ 0x9F, 0x0B, 0xDF, 0xD4, 0x5D, 0xFE, 0xF8, 0x43, 0x5E, 0xC5, 0xC0, 0x8C, 0xBC, 0xAB, 0xDE, 0x33,
+ 0x38, 0xA0, 0x76, 0x86, 0x94, 0xF0, 0xF0, 0x40, 0xD4, 0x3F, 0x82, 0xED, 0x3F, 0x2C, 0x5A, 0x6F,
+ 0xB3, 0xE9, 0x4C, 0x5D, 0xE5, 0xAB, 0xD5, 0xAB, 0x89, 0x9D, 0x0A, 0x37, 0x9F, 0xC0, 0x84, 0xF6,
+ 0x81, 0xB7, 0x9B, 0x5C, 0x1A, 0xC4, 0x40, 0x06, 0x29, 0xC6, 0x62, 0xCE, 0x07, 0x1B, 0x13, 0xBA,
+ 0x81, 0xDF, 0xEE, 0xF9, 0xD3, 0xE7, 0xC1, 0x9A, 0x7C, 0x43, 0x0E, 0x83, 0xB0, 0x4E, 0xCD, 0x8E,
+ 0xB4, 0x34, 0xBF, 0xEF, 0x74, 0x4D, 0xE0, 0xF4, 0xB3, 0x25, 0x93, 0xAC, 0xCE, 0x20, 0x7B, 0x22,
+ 0x6E, 0xAA, 0x75, 0x14, 0xCA, 0xA8, 0x09, 0x2A, 0xCE, 0xE0, 0x57, 0x5E, 0x3A, 0xCA, 0xF5, 0x11,
+ 0x5D, 0xC6, 0x08, 0x6D, 0xB1, 0xD8, 0x4C, 0x90, 0x4A, 0x5A, 0x4B, 0x1F, 0x98, 0xD6, 0x87, 0xF2,
+ 0xD5, 0x82, 0x86, 0x16, 0xA5, 0x01, 0xEA, 0xFC, 0x78, 0xF3, 0xF9, 0xE2, 0x3C, 0x74, 0xC4, 0xFC,
+ 0x9B, 0x8D, 0x2C, 0x36, 0x87, 0xE6, 0x57, 0x8C, 0x5D, 0xEA, 0x8F, 0x96, 0x85, 0x9A, 0xEF, 0x18,
+ 0x34, 0x36, 0xC0, 0x46, 0x7C, 0x77, 0xD6, 0xBF, 0x25, 0xA2, 0xE7, 0x95, 0xFA, 0x82, 0xDD, 0x11,
+ 0x2B, 0xAC, 0x9D, 0xB8, 0x7B, 0x21, 0xB7, 0x51, 0xFC, 0x21, 0x24, 0xA5, 0x20, 0xD4, 0x89, 0xF0,
+ 0xFF, 0x31, 0x1B, 0x3E, 0x29, 0x10, 0x00, 0xFA, 0xEA, 0x6E, 0xA7, 0xA0, 0x4E, 0x1E, 0x21, 0xDF,
+ 0x7F, 0x84, 0x16, 0x77, 0x8B, 0xF1, 0xFE, 0xAB, 0x4E, 0xBD, 0xF4, 0xA1, 0x2B, 0xA3, 0x8B, 0x7A,
+ 0x46, 0xF2, 0xD3, 0x92, 0x23, 0xBB, 0x23, 0x30, 0x10, 0x7A, 0x69, 0x38, 0x6C, 0xBA, 0xF3, 0xBD,
+ 0xDF, 0xF6, 0xCE, 0xC7, 0x9A, 0xA7, 0x20, 0xB8, 0xE9, 0xE6, 0x14, 0xEE, 0xFD, 0x3E, 0x89, 0xF8,
+ 0x93, 0x6F, 0x7B, 0xDE, 0xD9, 0xB4, 0x3A, 0xED, 0xA9, 0x4B, 0x05, 0x2E, 0x4F, 0xE4, 0x07, 0x0F,
+ 0x45, 0x3F, 0x95, 0x62, 0x6C, 0x4B, 0x23, 0xA3, 0xBF, 0x74, 0x13, 0x16, 0xFD, 0x88, 0xDB, 0xF8,
+ 0xC6, 0xB1, 0xA6, 0x72, 0x20, 0xCC, 0xE2, 0x67, 0x92, 0x30, 0xE0, 0x2C, 0xAF, 0xDA, 0xD9, 0x27,
+ 0x92, 0x01, 0x97, 0xAB, 0xBE, 0xCB, 0x2C, 0x0D, 0x01, 0x67, 0x3F, 0xE3, 0x7A, 0x5B, 0xE0, 0x06,
+ 0x08, 0xB3, 0x25, 0x4E, 0x78, 0x80, 0x76, 0x67, 0xFB, 0x4C, 0xD0, 0x5E, 0xFD, 0x5A, 0x64, 0xD7,
+ 0x0C, 0x09, 0xC2, 0x21, 0x57, 0x06, 0x63, 0x5A, 0x59, 0x2E, 0xF1, 0x3F, 0x09, 0x0D, 0x60, 0xDF,
+ 0xED, 0xDA, 0xA7, 0x75, 0x70, 0xB7, 0xD7, 0x0A, 0x66, 0x2D, 0xAC, 0xB8, 0x2F, 0xA3, 0x96, 0x19,
+ 0xB0, 0x5B, 0x29, 0x9C, 0x6E, 0x50, 0xC0, 0x00, 0x14, 0xC5, 0x3B, 0xA3, 0x6C, 0x3A, 0x6A, 0xAB,
+ 0x97, 0x96, 0x47, 0x72, 0xE7, 0x21, 0x74, 0x8F, 0xD9, 0xB4, 0xCE, 0xDC, 0x81, 0x6E, 0x48, 0x96,
+ 0x59, 0xB7, 0xC9, 0xF3, 0x99, 0xD0, 0x8D, 0x10, 0x3B, 0x69, 0xD0, 0xF5, 0xA7, 0x31, 0x9D, 0xA8,
+ 0x36, 0x63, 0xB6, 0xBC, 0x8A, 0xC9, 0x03, 0x3A, 0xCC, 0xDC, 0xFA, 0x9A, 0xAB, 0x47, 0xC4, 0x19,
+ 0x83, 0xD6, 0xD3, 0x1F, 0x6E, 0x60, 0xD9, 0xCC, 0x98, 0xE5, 0x53, 0xC6, 0xC3, 0xE8, 0xA7, 0xF3,
+ 0xB9, 0xF1, 0xAC, 0xA9, 0xB9, 0x05, 0x47, 0x46, 0x21, 0x3F, 0x0C, 0xCC, 0x60, 0x5C, 0xF8, 0x9E,
+ 0xA8, 0x42, 0x5D, 0xD9, 0xC8, 0xF3, 0x9E, 0x75, 0xAD, 0x22, 0x68, 0x67, 0x37, 0xF2, 0x8F, 0xD1,
+ 0x7C, 0x5D, 0x07, 0xD8, 0x69, 0x6C, 0x34, 0xF0, 0x7E, 0x71, 0x47, 0x29, 0xA1, 0x8D, 0x07, 0x3F,
+ 0x60, 0x75, 0xC8, 0x16, 0xEF, 0x11, 0xE3, 0xFD, 0x48, 0x35, 0xED, 0xCA, 0x2C, 0x37, 0xCF, 0xEA,
+ 0x37, 0x6D, 0xA0, 0xFF, 0x7A, 0x46, 0x15, 0x41, 0x6B, 0xE3, 0x40, 0x6F, 0x27, 0x02, 0xA4, 0x2B,
+ 0x34, 0x0B, 0x07, 0xE3, 0x69, 0x4E, 0xF3, 0xF3, 0xAC, 0x4A, 0xA7, 0xE4, 0xBB, 0x4E, 0x8E, 0xAF,
+ 0xC0, 0x76, 0x9B, 0xD3, 0xB1, 0x93, 0xF3, 0x87, 0x38, 0x7B, 0x0B, 0x84, 0xFA, 0xDA, 0x85, 0x32,
+ 0x06, 0x7C, 0xFD, 0x2E, 0xF0, 0x90, 0x31, 0xAE, 0x3E, 0x9B, 0xBF, 0x0A, 0xDF, 0xA4, 0xA9, 0x3B,
+ 0x43, 0x16, 0x31, 0x04, 0xD6, 0x2F, 0x9F, 0x7A, 0x79, 0xD5, 0x79, 0x5D, 0x1C, 0x4A, 0x6A, 0x19,
+ 0x2A, 0xD0, 0x05, 0x69, 0xFE, 0xAC, 0x78, 0x41, 0xE7, 0xEA, 0xE7, 0xDD, 0x23, 0xA7, 0x7C, 0x59,
+ 0x7F, 0x6B, 0xDA, 0x30, 0x77, 0x16, 0xE8, 0x02, 0x3D, 0xB4, 0x4D, 0xB3, 0xCC, 0x41, 0x56, 0x05,
+ 0x1F, 0xD7, 0x07, 0x0B, 0x5B, 0x30, 0x6C, 0x45, 0x7E, 0x41, 0xE4, 0x79, 0x0B, 0x5A, 0x17, 0xF5,
+ 0xD6, 0x30, 0x9E, 0xAC, 0x2F, 0x6F, 0x99, 0x18, 0x4E, 0x11, 0x39, 0xF4, 0x29, 0x55, 0x82, 0x08,
+ 0xF8, 0x2D, 0xE6, 0x06, 0xE8, 0x2D, 0x62, 0xD5, 0x66, 0xB4, 0x5E, 0x62, 0x96, 0x16, 0xA6, 0xD8,
+ 0x69, 0x04, 0x23, 0x35, 0xD0, 0x4F, 0xA0, 0x7F, 0xC5, 0xE4, 0x49, 0x6C, 0x64, 0x4A, 0xD8, 0xC3,
+ 0x4D, 0x51, 0xBC, 0x49, 0x12, 0x76, 0x8A, 0xEC, 0xB2, 0x03, 0x93, 0xB8, 0x2D, 0x42, 0x91, 0x09,
+ 0xAE, 0xC2, 0x50, 0xD2, 0x72, 0x3A, 0x11, 0x26, 0xF8, 0x43, 0x2A, 0xD5, 0x13, 0x4E, 0x4D, 0x1E,
+ 0x28, 0xE5, 0xAF, 0xCC, 0xCE, 0x6D, 0x4A, 0x06, 0xB4, 0x2E, 0xF7, 0x40, 0x89, 0x33, 0x61, 0x11,
+ 0x7A, 0x4C, 0x75, 0xC5, 0x7D, 0x2E, 0xDB, 0x1D, 0xE7, 0xA0, 0xD7, 0x96, 0xDD, 0x37, 0xF3, 0x48,
+ 0x62, 0xBB, 0xAF, 0xB2, 0x2C, 0x56, 0x99, 0x20, 0x45, 0x1A, 0x20, 0x96, 0x6F, 0x5E, 0x74, 0x7B,
+ 0x04, 0xDA, 0x67, 0x05, 0x0F, 0x4D, 0xFC, 0x7E, 0xE0, 0x65, 0x13, 0xDB, 0x06, 0x5E, 0x50, 0x93,
+ 0xA4, 0xA2, 0x1D, 0x10, 0x7D, 0x61, 0x25, 0x3D, 0x19, 0xCD, 0xC9, 0x51, 0xE2, 0xF1, 0x6A, 0xBC,
+ 0xCF, 0x7D, 0xB3, 0x0F, 0x77, 0x98, 0x7A, 0x09, 0x9C, 0x40, 0x03, 0x48, 0x17, 0xE2, 0x75, 0x10,
+ 0x59, 0xAC, 0x9F, 0x4A, 0xEC, 0x63, 0x0F, 0xD9, 0x3A, 0x75, 0x0D, 0xCD, 0xD4, 0x4E, 0x7F, 0xA5,
+ 0xE3, 0xFB, 0xA3, 0x5E, 0x0A, 0x6E, 0xD2, 0xD8, 0x05, 0x3D, 0x84, 0x20, 0x5E, 0xCE, 0xBE, 0xFC,
+ 0x9A, 0x29, 0x85, 0x08, 0xD6, 0x07, 0x07, 0x4B, 0x01, 0x60, 0x07, 0xE7, 0xF5, 0x83, 0x9E, 0x35,
+ 0x12, 0xEF, 0xDD, 0xA6, 0x97, 0x51, 0xD1, 0x39, 0x11, 0x22, 0x45, 0xB0, 0x5D, 0xCA, 0x29, 0x69,
+ 0x12, 0xE3, 0x0C, 0xA7, 0x41, 0x57, 0x99, 0xF2, 0xD9, 0x05, 0xAD, 0x87, 0xDE, 0xC7, 0x2C, 0xB3,
+ 0x2B, 0x63, 0x87, 0x9F, 0xC5, 0xEE, 0xAB, 0xF5, 0x2A, 0xF1, 0x9B, 0x54, 0xB6, 0x54, 0xC0, 0x41,
+ 0x88, 0x6E, 0x54, 0x63, 0x85, 0xD3, 0xFB, 0xED, 0xAD, 0x45, 0xEE, 0x91, 0xD3, 0x65, 0x4E, 0x5D,
+ 0xF7, 0xE1, 0xF9, 0x56, 0x29, 0x12, 0x9D, 0x3C, 0xFE, 0x91, 0x76, 0xBE, 0x49, 0xD5, 0x62, 0x61,
+ 0x24, 0x4F, 0x5C, 0x6B, 0x9A, 0xFC, 0xD2, 0x31, 0x98, 0x24, 0xA5, 0x5A, 0x7A, 0x98, 0xF5, 0x0B,
+ 0xFE, 0xD4, 0x44, 0xF1, 0xE2, 0x88, 0xE7, 0x00, 0xA7, 0x56, 0xD6, 0xC9, 0xC8, 0x0C, 0x66, 0x20,
+ 0xCC, 0x92, 0x3B, 0x8A, 0x50, 0x65, 0x09, 0x61, 0x54, 0x06, 0xA3, 0x7D, 0x73, 0xFB, 0x9E, 0x45,
+ 0xD8, 0x67, 0x0F, 0x79, 0xF6, 0xF9, 0xAB, 0x72, 0x61, 0xA0, 0x36, 0xE2, 0x95, 0x32, 0x58, 0xE6,
+ 0x47, 0xA6, 0x53, 0x27, 0x68, 0x36, 0xB5, 0x4B, 0x59, 0x61, 0x08, 0xEA, 0xE9, 0xE8, 0x0A, 0x24,
+ 0xFD, 0x96, 0x5A, 0x02, 0xDB, 0xC2, 0xB4, 0x88, 0xF2, 0x15, 0x3C, 0xDC, 0xEF, 0x51, 0x34, 0x43,
+ 0xD2, 0xF4, 0x9D, 0x9E, 0xD4, 0x5C, 0x98, 0x5B, 0xB2, 0xB8, 0x70, 0x39, 0x26, 0x5E, 0x8D, 0xAD,
+ 0x9B, 0x37, 0x18, 0xB9, 0x74, 0xAC, 0xC6, 0xD0, 0x07, 0x1D, 0x13, 0x20, 0x66, 0x36, 0x28, 0x52,
+ 0x62, 0xD9, 0x36, 0x54, 0xAE, 0x14, 0xF4, 0x62, 0x50, 0xA5, 0x96, 0x9B, 0xBE, 0xB8, 0x33, 0xFB,
+ 0xD3, 0xDC, 0xB3, 0x74, 0x90, 0x2B, 0x3B, 0xAC, 0x27, 0xD8, 0x83, 0x8E, 0xF9, 0x6D, 0x35, 0x42,
+ 0xD5, 0x60, 0x46, 0x33, 0x93, 0xF8, 0xB4, 0x77, 0xB0, 0xBF, 0xCD, 0xAE, 0x33, 0x9C, 0x8A, 0x7A,
+ 0x06, 0x33, 0x05, 0x0C, 0x27, 0x61, 0x30, 0x31, 0x13, 0xD3, 0x15, 0xB1, 0x7C, 0x23, 0x22, 0x99,
+ 0xFF, 0x47, 0xB4, 0xA2, 0x1D, 0x39, 0x9A, 0xE1, 0x52, 0xCC, 0x1A, 0x53, 0xF3, 0xA4, 0xE7, 0x2A,
+ 0x4A, 0x12, 0xE5, 0xA4, 0x8D, 0x0D, 0xC4, 0xA6, 0xFE, 0x4F, 0x45, 0x2D, 0x2C, 0xA2, 0x64, 0x39,
+ 0x41, 0xA5, 0xC0, 0xB7, 0x84, 0xA5, 0x98, 0x67, 0x2A, 0xA9, 0x2D, 0x7B, 0xAF, 0x8E, 0xDC, 0xE3,
+ 0x58, 0xAA, 0x17, 0x5B, 0xC3, 0x69, 0xE7, 0x88, 0x64, 0xB8, 0x72, 0x5A, 0xA5, 0xCD, 0x07, 0x27,
+ 0x1B, 0xC3, 0x37, 0x99, 0x9B, 0x57, 0xE7, 0x1F, 0x32, 0xED, 0xB5, 0xD6, 0x39, 0x5C, 0x40, 0x03,
+ 0x6A, 0x20, 0x51, 0xC3, 0x4E, 0x39, 0x9C, 0x5F, 0x75, 0x2B, 0xFF, 0xCA, 0xA1, 0x43, 0x83, 0xC3,
+ 0xA8, 0x5F, 0x0E, 0xC5, 0xBD, 0x88, 0xE6, 0xA9, 0x89, 0x07, 0x60, 0xA1, 0x21, 0x76, 0xF7, 0xBE,
+ 0x65, 0xBC, 0x31, 0x59, 0x88, 0x00, 0xE5, 0xA7, 0xE3, 0x7A, 0x61, 0xE6, 0x87, 0x5C, 0x4E, 0xD1,
+ 0x29, 0xDE, 0xD6, 0x4B, 0xCF, 0x64, 0x93, 0x31, 0xE9, 0x72, 0x91, 0x9F, 0xB3, 0x1E, 0x6E, 0x98,
+ 0x1D, 0xF5, 0x8F, 0xFA, 0xFD, 0x7C, 0xA1, 0x16, 0x39, 0x76, 0x15, 0x52, 0x99, 0x40, 0x5A, 0x2E,
+ 0x40, 0x71, 0x06, 0x53, 0xA9, 0x85, 0x98, 0x67, 0x5D, 0x38, 0x45, 0x50, 0xAF, 0xA3, 0x27, 0x46,
+ 0x12, 0xCF, 0x79, 0xC9, 0x20, 0x39, 0xE9, 0x37, 0xBE, 0xD1, 0xC3, 0x8A, 0xFA, 0x7E, 0x6D, 0x34,
+ 0x79, 0x64, 0x9F, 0x57, 0x78, 0xF1, 0xD2, 0x61, 0x2E, 0xD4, 0x80, 0x3B, 0xF3, 0x13, 0x9E, 0x05,
+ 0x18, 0x0A, 0x5C, 0x7B, 0x2E, 0xAA, 0xB8, 0xA6, 0xCB, 0x11, 0x85, 0x48, 0xBA, 0x78, 0x7B, 0x3A,
+ 0x8E, 0x1A, 0x91, 0xB7, 0x97, 0x61, 0xB5, 0x8E, 0xEB, 0xD4, 0x46, 0xE1, 0x68, 0x2E, 0x66, 0xC6,
+ 0x8F, 0xF3, 0xCA, 0x29, 0x5B, 0x7E, 0xAA, 0x22, 0x71, 0xCA, 0x8A, 0xBB, 0xD5, 0x0D, 0x14, 0xA5,
+ 0x98, 0xD7, 0x63, 0x60, 0xC2, 0x9A, 0x30, 0xD6, 0x5A, 0xE8, 0xCC, 0xFA, 0xCC, 0x06, 0x08, 0x63,
+ 0x1E, 0x16, 0x4C, 0x3D, 0xF5, 0x68, 0xDD, 0xDC, 0xE2, 0xFB, 0xDE, 0x3F, 0x90, 0xD6, 0x7B, 0xC5,
+ 0x09, 0xF7, 0x34, 0x5A, 0x23, 0xA0, 0x45, 0x88, 0x5C, 0x86, 0xA6, 0x12, 0x70, 0x1D, 0xF4, 0x3D,
+ 0xAE, 0xFC, 0x44, 0xA7, 0xB2, 0xBE, 0x3F, 0xEA, 0xC0, 0xA2, 0x28, 0x6C, 0x91, 0xA3, 0xB7, 0xE9,
+ 0xF6, 0x8F, 0x60, 0x29, 0xDA, 0x89, 0xF5, 0x95, 0x85, 0x2C, 0x4D, 0x09, 0xDF, 0x54, 0xC8, 0x96,
+ 0xB5, 0xD4, 0x18, 0xA8, 0xCC, 0xCD, 0x3F, 0xDF, 0x70, 0x2B, 0xD9, 0x28, 0xBC, 0x51, 0x44, 0x02,
+ 0x11, 0xE9, 0x5D, 0xDB, 0xF0, 0x25, 0x68, 0xD3, 0x2F, 0x7E, 0x17, 0x0B, 0x76, 0x31, 0xF9, 0x8E,
+ 0x46, 0x5B, 0x22, 0xB9, 0xB3, 0xBF, 0xDE, 0x24, 0x06, 0x28, 0x37, 0x2A, 0xB6, 0x3D, 0xBA, 0x4D,
+ 0xD8, 0x8F, 0xE0, 0x5D, 0x39, 0x52, 0xA0, 0x2F, 0xE1, 0xDD, 0x8B, 0x91, 0x84, 0xC2, 0xDA, 0x38,
+ 0x2D, 0x61, 0xE0, 0x31, 0x03, 0x8D, 0xE5, 0xCF, 0xDC, 0x74, 0x88, 0x7C, 0x0C, 0xF6, 0x89, 0x99,
+ 0x73, 0xD1, 0x7C, 0x06, 0xC1, 0x4B, 0xDE, 0xC0, 0x66, 0x53, 0xB5, 0xA8, 0x2E, 0xF7, 0x03, 0xE6,
+ 0x88, 0x8D, 0xC3, 0x46, 0x0C, 0xCA, 0xE3, 0x03, 0xA3, 0xEE, 0xA9, 0x4C, 0x3F, 0xAF, 0x81, 0x06,
+ 0x2C, 0xAF, 0x0D, 0x43, 0x2C, 0xF4, 0x9B, 0x42, 0xC0, 0x7B, 0x8B, 0xE5, 0x89, 0xB7, 0x43, 0xA2,
+ 0xBD, 0x4E, 0x98, 0x47, 0x74, 0x1B, 0x80, 0xC3, 0x91, 0x47, 0x11, 0xAA, 0xC0, 0x60, 0x8D, 0x11,
+ 0xFA, 0x5D, 0xC7, 0x1C, 0x3A, 0x3D, 0xE3, 0xA4, 0x2A, 0xBE, 0x4A, 0xF1, 0x30, 0xD8, 0xCC, 0x66,
+ 0x14, 0x8D, 0xE1, 0xEF, 0xB5, 0xCE, 0xE7, 0x65, 0xDB, 0xCC, 0xDF, 0xE9, 0x68, 0x61, 0x2C, 0x20,
+ 0x49, 0x5B, 0xD5, 0x8D, 0x67, 0xAA, 0x32, 0xDF, 0x12, 0x37, 0x53, 0x3E, 0x84, 0x25, 0xAB, 0x3C,
+ 0x00, 0xD7, 0x71, 0x87, 0x69, 0xEC, 0x73, 0x62, 0xED, 0x4D, 0x74, 0x1E, 0x1E, 0x28, 0x99, 0x4A,
+ 0x92, 0x48, 0x88, 0x61, 0x2E, 0x5B, 0x67, 0x0F, 0xA6, 0x43, 0xA7, 0x7F, 0xE9, 0xC5, 0x87, 0xB5,
+ 0x00, 0xE7, 0xE8, 0xF4, 0x9A, 0x51, 0x6A, 0xA6, 0xFE, 0xCD, 0x49, 0xED, 0x63, 0x3C, 0x2D, 0x41,
+ 0x31, 0xD0, 0x6D, 0x3E, 0xCA, 0x31, 0x10, 0x0B, 0x8C, 0xB0, 0x84, 0xF9, 0x55, 0x23, 0x3E, 0x18,
+ 0x48, 0x7B, 0x93, 0xBF, 0x34, 0x9F, 0x2D, 0x20, 0x24, 0x5A, 0x40, 0x4C, 0xDF, 0x97, 0xAB, 0xB9,
+ 0xF1, 0x54, 0xCF, 0x35, 0x13, 0xE8, 0x60, 0x74, 0x21, 0x64, 0xB1, 0xFE, 0xE2, 0x85, 0xD4, 0x4D,
+ 0x4A, 0xA0, 0x74, 0xDD, 0xC2, 0x03, 0xD7, 0x61, 0x4C, 0x77, 0x0F, 0x38, 0xFE, 0x43, 0xEB, 0xDE,
+ 0xEE, 0x32, 0x4D, 0x79, 0x50, 0xE6, 0x02, 0x2B, 0x97, 0x4C, 0xAA, 0x46, 0x31, 0x3A, 0x8D, 0xBD,
+ 0x7F, 0x54, 0x86, 0x0A, 0x51, 0x5D, 0x3D, 0x59, 0xBB, 0x7B, 0x07, 0x99, 0x0F, 0xF0, 0x63, 0xAD,
+ 0x39, 0x0B, 0x99, 0xDC, 0x18, 0x2F, 0x01, 0x26, 0x1F, 0x29, 0xF1, 0x81, 0xD9, 0x46, 0x68, 0x13,
+ 0xC8, 0xE8, 0xC6, 0xE7, 0x7C, 0x66, 0x72, 0xDF, 0x31, 0xEA, 0x13, 0xDF, 0x3E, 0x88, 0xF7, 0x35,
+ 0xC0, 0x27, 0xF1, 0xC8, 0x04, 0x55, 0x8D, 0xC2, 0xB3, 0x87, 0x98, 0x51, 0x54, 0x46, 0x0C, 0x63,
+ 0xBE, 0xD0, 0xBA, 0x4D, 0x6F, 0x1C, 0xDF, 0xD4, 0xB1, 0x76, 0xCA, 0xB2, 0x85, 0xFE, 0x65, 0xE6,
+ 0xC0, 0x0D, 0x56, 0xBA, 0x2D, 0x99, 0xFC, 0x9B, 0x6D, 0xC2, 0xFE, 0x28, 0x53, 0xED, 0xE0, 0xF7,
+ 0x20, 0x4D, 0xD7, 0x4D, 0xF6, 0x5D, 0xC6, 0x50, 0x8D, 0xC1, 0x19, 0xC7, 0x12, 0xF5, 0x53, 0xE0,
+ 0xE8, 0x07, 0xA5, 0x4E, 0x18, 0xF7, 0x5F, 0xFE, 0x48, 0x00, 0x12, 0x5F, 0x23, 0x4B, 0x80, 0x0D,
+ 0x43, 0x11, 0xCA, 0xAC, 0xFF, 0x1F, 0xB5, 0x3C, 0x43, 0x23, 0x7D, 0x86, 0xB3, 0x58, 0x40, 0xF4,
+ 0x42, 0xC1, 0xFB, 0x28, 0xFD, 0x89, 0x6B, 0x9C, 0x41, 0xE5, 0x60, 0xCA, 0x14, 0x76, 0xAB, 0x35,
+ 0x09, 0x74, 0xF0, 0x89, 0xBB, 0x47, 0x3C, 0xBC, 0xED, 0x90, 0x5C, 0x75, 0xFE, 0x24, 0xD9, 0x41,
+ 0x93, 0xE1, 0x98, 0x8D, 0xA7, 0x71, 0xDF, 0x54, 0x4C, 0x62, 0x02, 0x7C, 0x20, 0x9E, 0xDB, 0x59,
+ 0xBB, 0x90, 0x89, 0x2C, 0x4D, 0x8E, 0x21, 0x25, 0x5E, 0x6C, 0xD8, 0x2F, 0x4D, 0x03, 0x92, 0xDF,
+ 0xE0, 0xD3, 0x57, 0xAA, 0x12, 0xA1, 0x84, 0x88, 0x65, 0x25, 0x4B, 0xD6, 0xA1, 0x5C, 0x9F, 0xC0,
+ 0x6E, 0xCE, 0xD8, 0x49, 0xF6, 0x54, 0x22, 0x99, 0xDD, 0x69, 0x3D, 0x97, 0x57, 0x71, 0xB1, 0x8D,
+ 0x94, 0xA2, 0x3A, 0x53, 0x6C, 0xEB, 0xB7, 0x90, 0xEC, 0x4F, 0x9C, 0x35, 0xCC, 0x7B, 0xE1, 0xFD,
+ 0x54, 0xE2, 0xE8, 0xBD, 0x97, 0xDE, 0x5C, 0xE6, 0x2E, 0xEA, 0x1B, 0x72, 0xFF, 0x30, 0xD5, 0x6F,
+ 0x94, 0x60, 0x42, 0x52, 0xA7, 0x71, 0xE2, 0xEA, 0xA9, 0xDC, 0xD0, 0xC4, 0x5A, 0x01, 0x70, 0xFA,
+ 0x04, 0x85, 0x45, 0x30, 0xFF, 0x23, 0x0B, 0x38, 0xFB, 0xBA, 0x63, 0xAB, 0xA4, 0x50, 0x8F, 0x6A,
+ 0x73, 0xAC, 0xFE, 0x33, 0x95, 0x23, 0x1C, 0xD8, 0x5F, 0xEF, 0x71, 0xCD, 0x73, 0xC2, 0x84, 0x9E,
+ 0x7D, 0x81, 0x3B, 0xAE, 0x4D, 0xA8, 0xB7, 0xA8, 0xE8, 0xF5, 0x1A, 0xF0, 0x02, 0x8E, 0x1C, 0x5E,
+ 0x3F, 0x06, 0xDD, 0x2B, 0xC8, 0x38, 0x07, 0x29, 0xAF, 0x80, 0xDB, 0x9E, 0xCD, 0x8A, 0x9F, 0x96,
+ 0xB4, 0x3A, 0x94, 0x53, 0x2F, 0xDA, 0xD8, 0x54, 0x88, 0x73, 0x63, 0x46, 0x73, 0x95, 0xE2, 0xD8,
+ 0xC5, 0x32, 0x06, 0xE7, 0x7C, 0xB4, 0xC7, 0x04, 0x6B, 0x66, 0xE0, 0x18, 0xCD, 0x57, 0x45, 0x5D,
+ 0x62, 0x8A, 0x39, 0x4C, 0x5F, 0x6E, 0x2F, 0xFC, 0x73, 0xFA, 0x9E, 0xBB, 0x23, 0x9E, 0xCB, 0x56,
+ 0x15, 0x6D, 0xF1, 0xDD, 0x98, 0x1E, 0x33, 0x8E, 0xCA, 0xB7, 0x63, 0x3B, 0x62, 0x69, 0x7B, 0x68,
+ 0x71, 0xDB, 0x80, 0xA1, 0xD3, 0x9E, 0xBB, 0xC9, 0x0E, 0x90, 0x4F, 0xFA, 0x61, 0xFC, 0xA3, 0xE1,
+ 0xFA, 0xC3, 0x1F, 0x69, 0xC8, 0x4D, 0xBF, 0xB0, 0x1F, 0x0C, 0xB2, 0x37, 0x28, 0xEC, 0xF1, 0xF7,
+ 0x42, 0x80, 0xD4, 0x9B, 0x40, 0x7D, 0xDA, 0x8B, 0x07, 0x60, 0x18, 0x26, 0x5C, 0x42, 0x1B, 0x05,
+ 0x81, 0x8B, 0xD0, 0xA1, 0x72, 0x3D, 0xCD, 0x44, 0x66, 0xD4, 0xFD, 0x10, 0xDF, 0x78, 0x4D, 0xF0,
+ 0x61, 0x00, 0x05, 0xC1, 0xEC, 0xF0, 0xE8, 0x73, 0x58, 0xDE, 0xCF, 0x97, 0xAF, 0x57, 0xFC, 0x07,
+ 0x0B, 0x06, 0x0F, 0xBB, 0xCD, 0x0F, 0x62, 0x0E, 0x38, 0x80, 0x93, 0x86, 0x95, 0x17, 0x52, 0x22,
+ 0xAE, 0x1A, 0x3B, 0x55, 0x42, 0xCE, 0xF3, 0xF0, 0xFD, 0x34, 0x2F, 0x7E, 0x57, 0x71, 0xAF, 0x45,
+ 0x59, 0x3E, 0x65, 0x4C, 0xA6, 0x04, 0x3A, 0x19, 0x94, 0x00, 0xD4, 0xEE, 0xBB, 0x3F, 0x09, 0x86,
+ 0x57, 0x51, 0xD6, 0x71, 0x03, 0xA9, 0xDB, 0x56, 0xED, 0x94, 0x8D, 0x75, 0xBB, 0x5A, 0x8D, 0x35,
+ 0xBA, 0xEC, 0xDF, 0x13, 0x7A, 0xAF, 0x1D, 0x19, 0xBE, 0x2E, 0x60, 0xB8, 0xED, 0x0A, 0xEA, 0x26,
+ 0xA3, 0x48, 0xF4, 0x8A, 0x71, 0x05, 0x35, 0x5A, 0x54, 0x74, 0xAA, 0xA9, 0x15, 0x93, 0xEF, 0x0E,
+ 0x81, 0x23, 0xE9, 0x4E, 0xD1, 0x4E, 0x88, 0xC2, 0x1D, 0xE6, 0x5C, 0xC4, 0x54, 0x2B, 0xAE, 0xB4,
+ 0xF0, 0xF0, 0x4C, 0x86, 0xBA, 0xB1, 0xDD, 0x00, 0xEC, 0xF6, 0x7E, 0x6F, 0x3F, 0x45, 0xA7, 0xA7,
+ 0x09, 0x58, 0x49, 0x22, 0xBC, 0xB4, 0x0C, 0x33, 0x21, 0xD6, 0x07, 0x44, 0x3C, 0xBA, 0xFE, 0xF8,
+ 0xF8, 0x2B, 0xAE, 0x33, 0x5B, 0xE7, 0xF9, 0x67, 0x68, 0xE3, 0xED, 0x40, 0x28, 0xF5, 0xFD, 0x5C,
+ 0xE5, 0x25, 0x20, 0x04, 0x29, 0x9B, 0xC1, 0xDD, 0x51, 0xEC, 0x57, 0x56, 0x16, 0xA7, 0x4C, 0x3D,
+ 0x80, 0xAE, 0x62, 0xFE, 0xBB, 0x2D, 0x17, 0x51, 0x00, 0x01, 0x79, 0x53, 0xD7, 0x70, 0xFA, 0x89,
+ 0xEB, 0xB5, 0x37, 0x92, 0x03, 0x9C, 0x88, 0xC0, 0xA6, 0x62, 0x14, 0xB2, 0x0D, 0x22, 0xC8, 0xDC,
+ 0x43, 0x17, 0xF8, 0x72, 0xFE, 0x0B, 0x88, 0xD6, 0x96, 0x7A, 0xB5, 0xF3, 0xC4, 0x6F, 0xEF, 0xA5,
+ 0x87, 0xB7, 0x8A, 0xAD, 0x46, 0xCD, 0xFF, 0xF2, 0x38, 0x14, 0xD8, 0xD4, 0xD4, 0xC5, 0x9A, 0x5D,
+ 0x38, 0x3D, 0x44, 0x53, 0xF3, 0x43, 0x79, 0x3F, 0xCD, 0xC2, 0x93, 0xB5, 0x34, 0x4F, 0x5E, 0xFA,
+ 0x4D, 0x64, 0x61, 0x39, 0x0A, 0xDC, 0x8D, 0xB5, 0xD3, 0x82, 0xFD, 0x53, 0xAD, 0x9B, 0xC6, 0x79,
+ 0x24, 0x09, 0x91, 0x8F, 0x61, 0x25, 0x07, 0x21, 0x97, 0x73, 0x98, 0x98, 0xB5, 0x46, 0xD1, 0xFB,
+ 0xCE, 0x91, 0xF4, 0xC6, 0x39, 0xC7, 0xBE, 0xBF, 0x65, 0x97, 0x59, 0x27, 0x08, 0xDA, 0x30, 0x7D,
+ 0x05, 0x6D, 0x04, 0xD8, 0xA2, 0xDA, 0x52, 0xFA, 0xC2, 0x6B, 0x37, 0x21, 0xEC, 0x03, 0xEE, 0x4D,
+ 0x89, 0xA7, 0x81, 0x54, 0x1A, 0xB0, 0x2B, 0x3E, 0xA7, 0xE0, 0x54, 0xF6, 0x5A, 0xD6, 0x4E, 0xA2,
+ 0x23, 0x1D, 0x1E, 0xE2, 0x46, 0x89, 0x20, 0xB5, 0x63, 0x44, 0xF1, 0xF5, 0x50, 0x6E, 0x5E, 0xD1,
+ 0x6A, 0x34, 0xA8, 0xA1, 0xE8, 0xC4, 0x17, 0xE8, 0x4F, 0xC8, 0x2E, 0x64, 0x37, 0xC6, 0xEC, 0xDC,
+ 0x65, 0x88, 0x38, 0x4A, 0xBF, 0x61, 0xC0, 0x8D, 0xC6, 0xEE, 0xFA, 0x77, 0x66, 0xE5, 0xD1, 0x0C,
+ 0x92, 0xC8, 0xD8, 0xE9, 0x9B, 0xD6, 0x96, 0xB9, 0x93, 0x86, 0xB7, 0x40, 0x02, 0x7F, 0xD5, 0x5D,
+ 0x63, 0x53, 0x59, 0xCF, 0xBB, 0xD1, 0xE9, 0x3D, 0xF1, 0x2C, 0xC0, 0xAE, 0xAD, 0xFC, 0x66, 0xC2,
+ 0x0E, 0x13, 0x76, 0x2B, 0xA6, 0xB0, 0xDB, 0x31, 0x89, 0x7D, 0xFE, 0x79, 0xAA, 0x49, 0xB1, 0x9A,
+ 0xC1, 0xF0, 0x39, 0x05, 0x08, 0x1C, 0x1F, 0xFC, 0xA8, 0xDC, 0x19, 0x3F, 0xDA, 0x26, 0x09, 0x11,
+ 0x7D, 0xAD, 0x8D, 0x55, 0xC3, 0x53, 0x61, 0x17, 0x74, 0x21, 0x7B, 0x0E, 0xFC, 0xBF, 0xB5, 0x5B,
+ 0xDC, 0x2B, 0x8F, 0x05, 0x40, 0x31, 0x05, 0xB9, 0xF5, 0x9E, 0x25, 0x3D, 0x92, 0x4E, 0xDD, 0x8B,
+ 0x41, 0x63, 0xC1, 0x7A, 0x48, 0xCA, 0x8A, 0xE2, 0xA4, 0xFA, 0xB0, 0x81, 0x2F, 0x2A, 0x57, 0x8D,
+ 0x18, 0xE3, 0x34, 0xCD, 0x3F, 0x16, 0x7D, 0x69, 0x4E, 0x27, 0x84, 0x62, 0xDD, 0x0C, 0x37, 0x81,
+ 0x79, 0xB0, 0x79, 0x38, 0x46, 0xEF, 0x8B, 0xA7, 0x2A, 0xC1, 0xCA, 0x67, 0xB6, 0xF7, 0x8B, 0xB9,
+ 0x77, 0x93, 0x8F, 0x55, 0x76, 0x10, 0x1C, 0x27, 0x92, 0x94, 0xCA, 0x67, 0xD1, 0xD4, 0xB8, 0x96,
+ 0xEF, 0xD1, 0xD2, 0x32, 0xF4, 0xD7, 0x86, 0x9C, 0xBE, 0xBA, 0x8E, 0x05, 0xDA, 0x4B, 0x3D, 0x4A,
+ 0x7E, 0x09, 0xE8, 0x0C, 0xE7, 0x53, 0xCB, 0x16, 0xA1, 0x9E, 0x56, 0xCD, 0xD8, 0x6C, 0x14, 0x4C,
+ 0x19, 0x01, 0xEE, 0x5E, 0x03, 0x34, 0xB0, 0x3E, 0x30, 0x6E, 0x97, 0x75, 0x7F, 0x2B, 0xF2, 0xBA,
+ 0xB1, 0x84, 0x76, 0x79, 0xC7, 0x6E, 0x46, 0x79, 0xC1, 0x3B, 0x2F, 0x18, 0x18, 0xDF, 0xBC, 0xAE,
+ 0xFC, 0x1D, 0xE2, 0xB6, 0x77, 0x72, 0x5D, 0x04, 0x1E, 0x46, 0x20, 0xFF, 0x78, 0x9A, 0x64, 0xF9,
+ 0xE8, 0x36, 0x19, 0x19, 0xBC, 0xF6, 0x54, 0x84, 0xAA, 0x8F, 0xB9, 0x7E, 0x06, 0x40, 0xF6, 0x96,
+ 0x0A, 0xD9, 0x01, 0x1B, 0x6C, 0xCC, 0x0D, 0x63, 0x9C, 0x0A, 0x13, 0xF0, 0xC6, 0x16, 0x4D, 0xC2,
+ 0x9F, 0xAF, 0x6B, 0x07, 0x96, 0x94, 0x69, 0x5A, 0x90, 0x43, 0x51, 0xAE, 0xD3, 0x90, 0x10, 0x66,
+ 0xEE, 0x94, 0xA1, 0x6C, 0x42, 0x9F, 0x67, 0x1C, 0x85, 0x86, 0xBC, 0x81, 0xF7, 0x88, 0x30, 0xB8,
+ 0xCA, 0x47, 0xA2, 0x08, 0xC1, 0x99, 0x9A, 0x86, 0x79, 0x51, 0x12, 0xCD, 0xE1, 0x69, 0xAE, 0xD2,
+ 0x2C, 0xF8, 0x81, 0x92, 0x68, 0x3B, 0xDB, 0xDA, 0xFA, 0x98, 0x29, 0x84, 0x1C, 0xF0, 0xFD, 0xA1,
+ 0xDA, 0x90, 0x6D, 0xB3, 0x78, 0xD2, 0x04, 0x1D, 0xD1, 0x9B, 0xBF, 0x0C, 0x15, 0x36, 0x9D, 0xC6,
+ 0xB4, 0x4D, 0xB5, 0x93, 0xD9, 0xDF, 0xBC, 0x3A, 0x16, 0x2A, 0x07, 0x3C, 0xB0, 0x43, 0x95, 0x6E,
+ 0x1E, 0x65, 0x09, 0x8D, 0x0D, 0x34, 0x45, 0x0E, 0xD9, 0x3E, 0x52, 0x69, 0x91, 0xC1, 0x90, 0xCA,
+ 0x8E, 0x33, 0x02, 0xD3, 0x54, 0xB5, 0x61, 0xE8, 0xC6, 0x53, 0x01, 0x49, 0x4D, 0x0B, 0xAC, 0x3A,
+ 0x95, 0x1B, 0x70, 0x43, 0x62, 0x6B, 0xD8, 0x37, 0x6C, 0xE7, 0xAE, 0x94, 0xE5, 0xE0, 0x1D, 0xE8,
+ 0x1B, 0xC1, 0x52, 0x2A, 0x6B, 0x50, 0x32, 0xDE, 0xF7, 0xF8, 0xCE, 0x49, 0x3E, 0xE5, 0x74, 0x29,
+ 0x33, 0x75, 0xF0, 0x63, 0x8A, 0x40, 0xE3, 0x13, 0x8F, 0xEB, 0x08, 0x24, 0xB2, 0x5A, 0x7A, 0xA9,
+ 0xD0, 0x1F, 0xCE, 0x8A, 0x84, 0xBA, 0x8C, 0x4F, 0x10, 0x78, 0xAE, 0x64, 0xC3, 0xC3, 0x9A, 0x88,
+ 0x59, 0xD2, 0xCD, 0x6E, 0xC2, 0xBC, 0x71, 0xEF, 0xDF, 0xAA, 0xD4, 0x52, 0xF9, 0x1B, 0xCC, 0x17,
+ 0x51, 0x46, 0x7E, 0xB6, 0x0F, 0x77, 0x25, 0x3F, 0x23, 0x3B, 0xD9, 0xA7, 0x82, 0x6A, 0xB4, 0x12,
+ 0x30, 0x96, 0x27, 0x47, 0x9D, 0x70, 0xD6, 0xE9, 0x86, 0xFA, 0xBD, 0x9D, 0x96, 0xE3, 0x30, 0x0C,
+ 0x1E, 0xBD, 0xD9, 0xEA, 0x1E, 0x50, 0x18, 0x7F, 0x7E, 0xBE, 0xAE, 0x8E, 0x11, 0xEA, 0xDE, 0x17,
+ 0x97, 0x9D, 0x60, 0x2B, 0xA2, 0x44, 0x1B, 0xCE, 0xC5, 0x3E, 0x68, 0x88, 0x1B, 0xDE, 0x0E, 0xFB,
+ 0xD2, 0xDA, 0x30, 0x1E, 0x75, 0x70, 0x84, 0x19, 0xBD, 0x50, 0x8C, 0x9B, 0x46, 0x7F, 0xF4, 0x27,
+ 0x19, 0xBF, 0x5C, 0xFC, 0xE3, 0xCF, 0x18, 0x9D, 0xD1, 0x32, 0x39, 0x28, 0x1E, 0xCD, 0x47, 0xD4,
+ 0x38, 0xB1, 0xF8, 0x06, 0x4B, 0xC7, 0x45, 0x0B, 0x09, 0xA4, 0xE2, 0xF1, 0xC4, 0xA9, 0x00, 0xEA,
+ 0x44, 0xF5, 0x75, 0xCA, 0x9F, 0xD1, 0x3F, 0xCE, 0x4D, 0xD0, 0x42, 0x79, 0x95, 0x76, 0xD9, 0x7C,
+ 0xEF, 0x0A, 0xC6, 0x31, 0x82, 0xCC, 0xEA, 0x59, 0x4B, 0x43, 0xD5, 0xB6, 0x1D, 0x05, 0x5E, 0x59,
+ 0xA7, 0x21, 0x45, 0x0D, 0x65, 0x57, 0x38, 0x76, 0x22, 0x39, 0x8A, 0x5D, 0xC8, 0x94, 0xE0, 0x51,
+ 0x19, 0x68, 0x1E, 0x58, 0x5F, 0xB0, 0xBA, 0xC3, 0x55, 0xB4, 0x86, 0x18, 0x24, 0xDE, 0x2C, 0x8E,
+ 0xE2, 0xB6, 0x67, 0x04, 0xD0, 0x3B, 0x84, 0x22, 0x50, 0xDB, 0x04, 0x1E, 0xE0, 0x17, 0x5F, 0xF0,
+ 0xC7, 0xFE, 0x02, 0x17, 0xD0, 0x0C, 0x9D, 0x49, 0x00, 0x54, 0x79, 0xA0, 0xD0, 0x9B, 0xBF, 0xC2,
+ 0xCE, 0x5E, 0xCC, 0xDE, 0x65, 0xF4, 0x62, 0x72, 0x7D, 0x33, 0x08, 0xF9, 0x26, 0x22, 0x84, 0xEE,
+ 0xC8, 0x35, 0xD7, 0x42, 0x31, 0x8F, 0x5C, 0x23, 0xAA, 0x37, 0xC1, 0x79, 0xB0, 0xAD, 0x1E, 0x3A,
+ 0xE3, 0x1C, 0x16, 0x49, 0x4D, 0xEA, 0xB0, 0x0A, 0x06, 0xD3, 0x56, 0x33, 0xD6, 0xDE, 0x3E, 0xF3,
+ 0x64, 0xE2, 0xB6, 0xF2, 0xAC, 0xA5, 0x41, 0xDD, 0x8E, 0xDA, 0x3E, 0x56, 0x91, 0x66, 0x1B, 0x80,
+ 0xC3, 0x2D, 0xAB, 0x84, 0xC6, 0xBF, 0xDD, 0x10, 0x36, 0x21, 0x65, 0xE5, 0xBE, 0x2B, 0x54, 0xCC,
+ 0x6F, 0xE0, 0x70, 0xE5, 0x7A, 0x73, 0xC7, 0xF9, 0x8F, 0xB2, 0xEC, 0x1E, 0xD6, 0x5E, 0x55, 0x74,
+ 0xC5, 0x19, 0x9D, 0x40, 0x13, 0x7C, 0xD4, 0x85, 0x10, 0xD5, 0x1D, 0x8C, 0x8F, 0x27, 0x68, 0xBC,
+ 0x76, 0x9E, 0x14, 0xFF, 0x5D, 0xEA, 0x8B, 0xCB, 0x16, 0xBE, 0x4F, 0xFB, 0x02, 0xAC, 0x97, 0x0F,
+ 0x3E, 0xBD, 0xD0, 0x1A, 0xCB, 0x93, 0xD8, 0x98, 0xBD, 0x15, 0x26, 0x91, 0xB9, 0xD0, 0xC6, 0x8D,
+ 0x6B, 0x91, 0x82, 0x4A, 0x10, 0x77, 0xFA, 0x04, 0x60, 0xCC, 0xEB, 0x76, 0x15, 0x5D, 0x96, 0xE6,
+ 0x16, 0x19, 0x73, 0xD2, 0xB9, 0xDD, 0x25, 0xF7, 0xFB, 0xFD, 0x7A, 0xEC, 0x1D, 0xA4, 0x5D, 0x3E,
+ 0xAE, 0xBA, 0xEB, 0x84, 0x1D, 0x73, 0xD4, 0xE4, 0xB5, 0xBC, 0x0D, 0x79, 0xC5, 0xF6, 0xA3, 0xE9,
+ 0x02, 0x64, 0x96, 0x65, 0x7A, 0x23, 0xDE, 0xFD, 0xEE, 0x22, 0x24, 0xFD, 0x1A, 0x39, 0x37, 0xD0,
+ 0x51, 0xEB, 0x35, 0x3D, 0x30, 0x90, 0xE4, 0x70, 0x6A, 0x58, 0xB7, 0x9A, 0xE6, 0xB0, 0xAE, 0x7C,
+ 0x64, 0x61, 0x42, 0x74, 0x0C, 0xF3, 0x9D, 0xCC, 0x40, 0x92, 0x23, 0xC1, 0x25, 0x2E, 0x07, 0x0E,
+ 0x76, 0x0C, 0x4C, 0x3C, 0xA4, 0x2A, 0xE7, 0x1A, 0x91, 0xDE, 0x15, 0xF0, 0xF4, 0x08, 0x95, 0x77,
+ 0x58, 0x4B, 0xF2, 0x45, 0xBE, 0x7C, 0xE4, 0x51, 0x57, 0x24, 0x92, 0x8D, 0x5F, 0x50, 0xA6, 0x77,
+ 0xFA, 0x9E, 0xB4, 0xA2, 0xF9, 0xBA, 0x31, 0x37, 0xD8, 0x2D, 0xAF, 0xCB, 0x47, 0x98, 0xB3, 0x68,
+ 0xA0, 0xB7, 0xCA, 0x2F, 0x79, 0xBA, 0xB7, 0x8D, 0x53, 0xB3, 0xAB, 0xDC, 0x4E, 0x47, 0x2F, 0x35,
+ 0x4B, 0xC7, 0xAA, 0x64, 0x49, 0x9B, 0xB2, 0x92, 0x85, 0x43, 0x10, 0xE6, 0x84, 0x8B, 0xF5, 0xAE,
+ 0x77, 0x28, 0x30, 0x46, 0xF4, 0xFC, 0xEE, 0x46, 0x78, 0x71, 0xE1, 0xDA, 0xAA, 0x33, 0x23, 0x98,
+ 0x5E, 0xF0, 0xA5, 0x41, 0x75, 0x4B, 0xC9, 0xBD, 0x4B, 0x91, 0x38, 0xEF, 0x5B, 0x5D, 0x29, 0x9F,
+ 0xAE, 0x95, 0x5F, 0xDB, 0x60, 0xDD, 0xB9, 0xBE, 0x4D, 0x7D, 0xA0, 0xA4, 0xAC, 0x9F, 0x65, 0x6A,
+ 0xFA, 0x81, 0x01, 0xCF, 0x8F, 0xE2, 0x2C, 0x27, 0x64, 0x3A, 0x4D, 0x23, 0xC7, 0x7B, 0x4F, 0xCF,
+ 0xA1, 0xDC, 0x0E, 0x21, 0x82, 0x2B, 0xD8, 0x51, 0x8B, 0x35, 0x81, 0x87, 0x9F, 0xFD, 0x05, 0xC5,
+ 0x17, 0xAF, 0x99, 0x3D, 0x2B, 0x28, 0x2D, 0x82, 0x3A, 0x13, 0x68, 0x31, 0x21, 0x66, 0x53, 0xDB,
+ 0x07, 0x45, 0xBD, 0x24, 0x52, 0xAA, 0xC6, 0xD4, 0x70, 0x24, 0xB1, 0x67, 0x9A, 0x94, 0xEA, 0xF0,
+ 0x6B, 0x67, 0x99, 0xDD, 0x4F, 0x11, 0x73, 0xD2, 0x04, 0xBE, 0xB5, 0x77, 0xFB, 0xA2, 0x31, 0xCC,
+ 0xD4, 0x1E, 0x91, 0x02, 0xD2, 0x62, 0xF6, 0xB1, 0x32, 0x36, 0x12, 0xF8, 0x4D, 0x1D, 0x47, 0x10,
+ 0xA8, 0x65, 0x34, 0x71, 0x48, 0x9E, 0x22, 0x2B, 0xA2, 0x4F, 0xF9, 0x2B, 0xEB, 0x0F, 0x31, 0x80,
+ 0x7E, 0xCA, 0x4A, 0xCF, 0x37, 0x08, 0x21, 0x1D, 0xBA, 0xD9, 0x32, 0x14, 0x3E, 0xEF, 0x6C, 0xFE,
+ 0xB7, 0xA3, 0x56, 0x07, 0x62, 0x50, 0xA5, 0x23, 0xB4, 0x45, 0x9C, 0x51, 0xDF, 0xEB, 0x93, 0x1D,
+ 0x4E, 0xFF, 0x29, 0xB2, 0x50, 0xF0, 0x2A, 0xEF, 0xEE, 0x73, 0x9B, 0x51, 0x69, 0x34, 0xAE, 0xF7,
+ 0x4A, 0x4C, 0x06, 0x9D, 0x20, 0xC7, 0x12, 0x3F, 0x31, 0xBB, 0xBC, 0xD3, 0x27, 0xA9, 0x89, 0xC7,
+ 0x42, 0x1F, 0x2E, 0x60, 0xEC, 0x29, 0x0D, 0x11, 0x88, 0xFC, 0xB4, 0x31, 0x08, 0xDD, 0x69, 0x15,
+ 0xF1, 0x64, 0x25, 0x52, 0x46, 0x07, 0xAE, 0x35, 0xAA, 0x46, 0x89, 0x3A, 0xEA, 0x7F, 0xDC, 0x69,
+ 0x9F, 0xD6, 0xF1, 0x3C, 0xDC, 0x6D, 0x00, 0x09, 0x95, 0x9D, 0x72, 0x50, 0xE7, 0xD7, 0xAC, 0x7D,
+ 0x3D, 0xFD, 0x1D, 0x06, 0x38, 0xAD, 0xD7, 0x7A, 0xEC, 0x06, 0x0F, 0x2F, 0x3F, 0x4F, 0xD2, 0xC2,
+ 0xAA, 0x30, 0x92, 0x18, 0x93, 0xE0, 0x65, 0xD9, 0xD8, 0x01, 0x48, 0xFD, 0xC1, 0xA3, 0xE4, 0xBD,
+ 0x21, 0x05, 0x45, 0xA0, 0xCD, 0xDC, 0x87, 0x29, 0x6E, 0xE1, 0x77, 0x98, 0x4D, 0x09, 0x79, 0xB2,
+ 0x62, 0x51, 0x73, 0x7B, 0x61, 0x14, 0x1D, 0x41, 0xA0, 0x92, 0xB9, 0x6E, 0x32, 0xA7, 0xD1, 0x68,
+ 0xFB, 0x6D, 0x4C, 0x88, 0x3D, 0x7A, 0x54, 0x85, 0x49, 0x7C, 0x24, 0xD9, 0xFF, 0xC7, 0x07, 0x9C,
+ 0xEF, 0xF6, 0x16, 0x6A, 0xB6, 0x1B, 0xB4, 0x23, 0x71, 0x40, 0x3B, 0x0F, 0xE6, 0xC6, 0x35, 0x6E,
+ 0x3B, 0xC7, 0x8F, 0xCE, 0x08, 0xFF, 0x6A, 0x94, 0xCB, 0xB9, 0xA5, 0x21, 0x30, 0xAC, 0xE1, 0xE6,
+ 0xB1, 0xDB, 0x31, 0x84, 0xB3, 0x5A, 0x41, 0x9F, 0x10, 0x21, 0x68, 0xCF, 0xED, 0x6B, 0xB4, 0xCF,
+ 0xAB, 0x6E, 0xA2, 0x05, 0xF1, 0xF1, 0xEC, 0xE8, 0x29, 0xF4, 0xD9, 0x95, 0x61, 0xC2, 0x2A, 0xCC,
+ 0xFE, 0x9B, 0x8D, 0x5B, 0x94, 0x60, 0x96, 0x51, 0x02, 0x3D, 0xB4, 0x0F, 0xC6, 0x51, 0x05, 0x7F,
+ 0xFB, 0x4E, 0x4D, 0x21, 0x38, 0xBF, 0xDD, 0x2E, 0x2A, 0xB0, 0x85, 0xC8, 0x16, 0xB9, 0x78, 0xAB,
+ 0xE1, 0xA0, 0x54, 0x0E, 0x19, 0x86, 0xCD, 0x39, 0xBF, 0x73, 0x38, 0xFF, 0xD3, 0x2F, 0xF9, 0xEB,
+ 0x21, 0xB7, 0x9F, 0x96, 0x8C, 0x15, 0x44, 0x06, 0xEE, 0x04, 0x04, 0xAD, 0x3C, 0xCA, 0x2D, 0xB6,
+ 0xAF, 0x8F, 0x6B, 0x11, 0xE4, 0x12, 0x46, 0x2A, 0x4A, 0x9B, 0x2F, 0x8F, 0x66, 0xEB, 0x2B, 0xA1,
+ 0xF7, 0x65, 0x92, 0x14, 0x78, 0xF9, 0xA4, 0x5A, 0x8A, 0x33, 0x92, 0x87, 0x75, 0x9F, 0x0A, 0x27,
+ 0x53, 0xC8, 0xB1, 0xD5, 0xAB, 0xA2, 0x56, 0xB7, 0x8D, 0xA4, 0xA7, 0x2F, 0x95, 0xA8, 0xC5, 0xC6,
+ 0xB0, 0xBE, 0xAF, 0x68, 0x99, 0x2D, 0x86, 0x01, 0x31, 0x6A, 0x7A, 0xE3, 0xDD, 0x87, 0x03, 0x31,
+ 0x57, 0x33, 0x31, 0x49, 0x12, 0x90, 0xEB, 0x1A, 0x3C, 0x67, 0x2C, 0x60, 0xB8, 0xC4, 0x2C, 0x6A,
+ 0xD2, 0x1C, 0xF5, 0x0E, 0x2E, 0x71, 0x1A, 0x14, 0x25, 0xE0, 0xAA, 0xE2, 0xD7, 0xB7, 0x9D, 0xCE,
+ 0xDA, 0x12, 0x0C, 0x9D, 0x85, 0x37, 0x0E, 0xF3, 0x8B, 0x9D, 0xBF, 0xE7, 0xFB, 0xAC, 0x5D, 0x3D,
+ 0x00, 0x72, 0x4C, 0xB9, 0xEE, 0x7B, 0xF7, 0xA6, 0xC9, 0xD4, 0xE6, 0x27, 0x24, 0x31, 0xD0, 0x56,
+ 0x58, 0x4B, 0x00, 0x02, 0xA0, 0x2A, 0xDA, 0xBB, 0x23, 0x43, 0x87, 0x8F, 0xC0, 0xB4, 0x87, 0x6F,
+ 0xD4, 0xF8, 0x0F, 0x38, 0x6E, 0x82, 0xFC, 0xE2, 0x1E, 0xD5, 0x96, 0x05, 0xD1, 0x1A, 0x95, 0x1B,
+ 0xE6, 0xC1, 0xF0, 0xA1, 0x8A, 0x0F, 0xF0, 0xD4, 0x2D, 0x03, 0x5D, 0x2F, 0xCD, 0xF4, 0x0A, 0xFF,
+ 0xBB, 0xD2, 0x79, 0x06, 0xAA, 0x65, 0xF1, 0x4D, 0x8E, 0x6E, 0x24, 0x08, 0x6D, 0xA5, 0x66, 0x84,
+ 0x28, 0x25, 0xE2, 0xC1, 0xA8, 0xFB, 0x6F, 0x2E, 0x99, 0xC1, 0xA8, 0x99, 0x16, 0xF8, 0xCD, 0x5F,
+ 0xF5, 0x41, 0xFB, 0xD1, 0xC7, 0xA6, 0xF4, 0x2F, 0x4A, 0xAE, 0x36, 0xF8, 0x9D, 0x23, 0x62, 0x5C,
+ 0x3C, 0x62, 0xD4, 0xF5, 0x52, 0x46, 0xDE, 0x28, 0xB5, 0x7D, 0xFD, 0x25, 0xB4, 0x51, 0x70, 0xB3,
+ 0x5D, 0x56, 0x92, 0x51, 0x8C, 0x4B, 0x69, 0xE8, 0x34, 0x66, 0x41, 0x4E, 0x22, 0x72, 0x82, 0x1A,
+ 0xEB, 0xDE, 0x59, 0x5B, 0x3C, 0x0E, 0x66, 0x7F, 0xB6, 0xC8, 0x07, 0x2F, 0x82, 0x89, 0xDA, 0xC4,
+ 0x8E, 0xC4, 0x70, 0xA1, 0xEA, 0xD3, 0xA9, 0x28, 0xFE, 0x9B, 0xCA, 0xE8, 0x89, 0xD1, 0xE0, 0xC6,
+ 0x36, 0x91, 0x09, 0x98, 0x4F, 0x28, 0x9B, 0x10, 0x4B, 0x89, 0xDB, 0xC4, 0xCA, 0x60, 0x57, 0xA0,
+ 0x0F, 0x04, 0x3F, 0x1B, 0x75, 0xAE, 0x5A, 0x9F, 0x0A, 0xFB, 0xCC, 0x6F, 0x46, 0xE8, 0xC1, 0xB0,
+ 0x98, 0x1D, 0x6B, 0xC3, 0x3C, 0xEA, 0x83, 0x5E, 0xBF, 0x21, 0x5E, 0x28, 0x3C, 0x8E, 0xF4, 0x6B,
+ 0xAA, 0x3F, 0x0E, 0xBC, 0xB5, 0xAD, 0x65, 0xEF, 0xA3, 0xB1, 0x73, 0x3C, 0x55, 0x52, 0xB6, 0xBC,
+ 0x5E, 0xA4, 0xC6, 0x27, 0x88, 0xEB, 0x34, 0xB1, 0x61, 0x5F, 0x03, 0x20, 0x66, 0x95, 0x9B, 0xC6,
+ 0x94, 0xC1, 0x65, 0xAA, 0x8E, 0x4E, 0x41, 0xB4, 0xB2, 0x45, 0x04, 0x42, 0xA0, 0xC3, 0xB1, 0xD2,
+ 0x46, 0x0A, 0xFE, 0x4A, 0xDD, 0xC3, 0xC0, 0x01, 0x6A, 0x3F, 0xAF, 0xF5, 0xDE, 0x92, 0xC3, 0xF0,
+ 0xEC, 0xDF, 0x69, 0xEC, 0x25, 0x1F, 0x43, 0x4E, 0x87, 0x80, 0xF9, 0xD7, 0x54, 0x92, 0x8E, 0x02,
+ 0xCC, 0xF0, 0x46, 0x79, 0x9C, 0x2A, 0x5F, 0xCF, 0x24, 0x3F, 0x7F, 0xD3, 0x2F, 0xBE, 0x71, 0x51,
+ 0xCD, 0xAC, 0x73, 0xD5, 0x60, 0x44, 0x7E, 0x96, 0xE6, 0x5F, 0xFD, 0x08, 0x46, 0x17, 0x10, 0x3A,
+ 0x71, 0xF6, 0x8E, 0xAF, 0x6E, 0xFC, 0x4E, 0x05, 0xD1, 0x43, 0xC0, 0xF1, 0x77, 0xEE, 0x02, 0x94,
+ 0x8D, 0x84, 0x32, 0xB5, 0x7E, 0x40, 0x3F, 0xF9, 0x74, 0xF1, 0x5B, 0xCC, 0xDA, 0xB5, 0x48, 0xEC,
+ 0x5A, 0xEC, 0xC0, 0x1D, 0x50, 0x9D, 0x86, 0x6F, 0xBF, 0x42, 0xAE, 0xEE, 0x93, 0x46, 0xEF, 0xEC,
+ 0x0F, 0xFE, 0x13, 0x37, 0x7D, 0xD3, 0xF4, 0xAF, 0x7F, 0x6F, 0x62, 0x61, 0xA3, 0x1A, 0xD1, 0xEF,
+ 0x8D, 0xCF, 0x9E, 0xE3, 0x46, 0x8A, 0x9F, 0x35, 0x3A, 0xB4, 0xBC, 0xA7, 0x9F, 0x3F, 0x90, 0x16,
+ 0x66, 0xBB, 0x6B, 0x5B, 0x47, 0xF9, 0xD5, 0x80, 0x53, 0x26, 0x69, 0x0F, 0x0E, 0x5D, 0xAD, 0x3E,
+ 0x42, 0x75, 0xD1, 0x65, 0x62, 0xDD, 0xBB, 0xBB, 0x0F, 0x2B, 0x11, 0xCC, 0xEE, 0x1D, 0x47, 0x2E,
+ 0xD7, 0x83, 0x71, 0xCE, 0x24, 0x1C, 0xA4, 0xC3, 0xA1, 0x0C, 0x9F, 0x99, 0x51, 0x59, 0x39, 0x8F,
+ 0x24, 0xDA, 0x16, 0xA1, 0x1A, 0xE3, 0x69, 0x07, 0x27, 0x5B, 0xAA, 0xA7, 0x24, 0xA2, 0xEB, 0x2B,
+ 0x49, 0x29, 0x21, 0xA0, 0xA3, 0xC9, 0x0D, 0xC7, 0xB5, 0x0D, 0xDF, 0xA3, 0xED, 0xD8, 0x37, 0x97,
+ 0x47, 0x56, 0xAB, 0x6E, 0x8C, 0x64, 0xE3, 0xDC, 0x2F, 0x1C, 0x0F, 0x44, 0x71, 0x23, 0xF7, 0x59,
+ 0x26, 0xAB, 0xDA, 0x8C, 0x7D, 0x5A, 0x80, 0x15, 0x2D, 0xA0, 0x92, 0x5C, 0x6A, 0x8F, 0x07, 0x88,
+ 0x14, 0xED, 0xAE, 0x56, 0x35, 0xF4, 0x3E, 0xBF, 0x69, 0x84, 0xE0, 0xAE, 0x60, 0xB9, 0xF6, 0x8A,
+ 0x2B, 0x53, 0x22, 0xCE, 0x1C, 0x95, 0x85, 0xBC, 0xEC, 0xE4, 0xE3, 0xE2, 0x96, 0xC0, 0xCF, 0xA5,
+ 0x5D, 0x25, 0x0C, 0x85, 0x51, 0x2A, 0xC5, 0x38, 0x25, 0x97, 0xDC, 0x7C, 0x14, 0x39, 0x1F, 0xB4,
+ 0x3C, 0xBF, 0x65, 0x0F, 0x41, 0xD1, 0xE5, 0x81, 0xCA, 0xF3, 0xB7, 0x1C, 0xC5, 0xC4, 0xC0, 0xB8,
+ 0xBB, 0xCE, 0x39, 0x7C, 0x2E, 0x1F, 0x27, 0xAD, 0x16, 0x8A, 0x69, 0x69, 0x1D, 0x3B, 0x89, 0x4E,
+ 0xC3, 0x28, 0x1C, 0x1B, 0x47, 0x98, 0xA3, 0xDB, 0xC9, 0x69, 0x6E, 0x11, 0xD6, 0xA0, 0x08, 0x74,
+ 0x8B, 0x37, 0x4B, 0x66, 0x7A, 0x12, 0x70, 0x35, 0x84, 0x38, 0x27, 0x8F, 0xAC, 0xC9, 0xFF, 0xFC,
+ 0xC2, 0x1A, 0x0F, 0x58, 0x8E, 0x7E, 0xF1, 0xCD, 0x73, 0x74, 0x09, 0x57, 0x24, 0xBC, 0xA3, 0x0B,
+ 0xBD, 0x6D, 0x8E, 0x63, 0x09, 0x15, 0xBD, 0x7F, 0x09, 0xDA, 0xE1, 0x06, 0x34, 0x0B, 0x74, 0xB8,
+ 0xB8, 0x9D, 0x8A, 0xFA, 0x4E, 0x1E, 0xF4, 0x6A, 0x8C, 0x4C, 0xD6, 0x34, 0x3F, 0x82, 0xD2, 0x84,
+ 0xD5, 0xDA, 0x2D, 0xDB, 0xCD, 0x9F, 0x2A, 0x1D, 0xE8, 0x24, 0x43, 0xEC, 0x94, 0xCF, 0x51, 0xBF,
+ 0x48, 0x50, 0xC5, 0x71, 0x73, 0x78, 0x35, 0xD9, 0x98, 0x1E, 0xCF, 0x96, 0x02, 0x74, 0x29, 0xE9,
+ 0x30, 0x02, 0x5B, 0xEC, 0x66, 0xD8, 0xD0, 0xB6, 0x4D, 0x33, 0x3F, 0x2A, 0xF4, 0x2A, 0xC6, 0xAD,
+ 0x82, 0x9A, 0x1D, 0x62, 0xE2, 0xDA, 0x05, 0xE7, 0x8C, 0x69, 0xCB, 0xB4, 0xB8, 0xD9, 0xEB, 0x7D,
+ 0x49, 0xD6, 0x5E, 0xDD, 0xA5, 0x85, 0xB5, 0x3F, 0x08, 0xEB, 0x33, 0xA6, 0x2D, 0x68, 0x17, 0xF2,
+ 0x20, 0x3D, 0xEC, 0xAC, 0x71, 0x8C, 0x51, 0x7A, 0x20, 0x05, 0x63, 0xF3, 0x7A, 0x98, 0x4A, 0x26,
+ 0x2E, 0xEC, 0xD1, 0x9B, 0x50, 0x7D, 0xEB, 0x37, 0xD3, 0xD9, 0x21, 0x6B, 0x97, 0x06, 0x9F, 0x10,
+ 0x0A, 0x8B, 0x56, 0x6D, 0x7B, 0x78, 0x9D, 0xF6, 0x89, 0x8B, 0xDF, 0x7B, 0x21, 0xF0, 0x55, 0x85,
+ 0xF8, 0x23, 0xAB, 0xEA, 0x5A, 0xF8, 0x0C, 0xB8, 0xB9, 0x13, 0xDA, 0xCC, 0x0A, 0x35, 0x21, 0xAF,
+ 0x78, 0x87, 0x33, 0x78, 0x89, 0x39, 0x1E, 0x15, 0xD7, 0x14, 0x49, 0xC9, 0x14, 0x60, 0x39, 0xAC,
+ 0x4C, 0x76, 0x64, 0xD7, 0xCF, 0x8A, 0x4A, 0xDA, 0xF7, 0x20, 0xCD, 0x46, 0xB4, 0x3B, 0x20, 0x60,
+ 0x43, 0x6B, 0x52, 0xD9, 0x20, 0x10, 0x8A, 0xF9, 0xF7, 0x34, 0xDA, 0x5E, 0xCF, 0xD1, 0xCC, 0x60,
+ 0x31, 0xF8, 0xE5, 0x5C, 0xF5, 0xC8, 0xCB, 0x3C, 0xF6, 0x63, 0xD4, 0x26, 0xA1, 0x41, 0x71, 0xCD,
+ 0x73, 0x97, 0xBF, 0x27, 0x2A, 0x2C, 0x0C, 0x75, 0x6D, 0x4A, 0xA0, 0x8A, 0x0D, 0x02, 0x53, 0xBA,
+ 0x72, 0xA3, 0xE0, 0xE6, 0x1A, 0x85, 0xC5, 0xD7, 0xF1, 0x49, 0x4F, 0x24, 0x16, 0x35, 0x3F, 0x0C,
+ 0x2B, 0xCE, 0x9C, 0x35, 0x0F, 0x23, 0xA3, 0x7C, 0xCE, 0xC8, 0xED, 0x34, 0x2C, 0xCC, 0x33, 0x0A,
+ 0x73, 0xA3, 0x58, 0x53, 0x78, 0x55, 0xD1, 0xC2, 0x08, 0xCA, 0x03, 0xBE, 0x6E, 0x1D, 0x9C, 0xD2,
+ 0x67, 0x71, 0x4D, 0x77, 0x9A, 0x63, 0xA1, 0x7C, 0x31, 0x11, 0x3D, 0xDE, 0xE0, 0xDC, 0x0D, 0x06,
+ 0xDD, 0xAF, 0x16, 0x65, 0xF6, 0xF0, 0x27, 0x28, 0x9A, 0xBA, 0xED, 0xE2, 0xC2, 0x27, 0x2B, 0x74,
+ 0x2D, 0xF8, 0x6E, 0xE1, 0x0C, 0xB2, 0xC7, 0xBF, 0xD3, 0x0A, 0x94, 0x0E, 0x3A, 0xE1, 0x04, 0x34,
+ 0x97, 0xA7, 0x7E, 0x01, 0xA0, 0x31, 0x89, 0x86, 0x05, 0x28, 0x84, 0x0C, 0x3E, 0xB5, 0x22, 0x26,
+ 0x6E, 0x52, 0xFD, 0x3B, 0x39, 0x5B, 0xB7, 0xEC, 0x49, 0x50, 0x21, 0xA6, 0x58, 0x20, 0x50, 0x11,
+ 0x5D, 0x9E, 0xFF, 0xF5, 0x93, 0x74, 0x39, 0x24, 0xBD, 0xBA, 0x5A, 0xB5, 0x4E, 0x35, 0xEB, 0x13,
+ 0x31, 0x04, 0x3D, 0xAD, 0xBE, 0xBB, 0x43, 0x24, 0xC1, 0x8F, 0x2A, 0x43, 0x6D, 0x85, 0x6C, 0x8E,
+ 0x78, 0x6A, 0x7F, 0xE3, 0x5C, 0xE4, 0xC1, 0x4A, 0x68, 0x46, 0xC4, 0xA4, 0xEB, 0x8A, 0xB0, 0xFB,
+ 0x02, 0xE9, 0x76, 0x49, 0x0C, 0x90, 0x3F, 0x4F, 0x79, 0x39, 0xA9, 0x93, 0x61, 0x66, 0x4F, 0x60,
+ 0x8A, 0x5C, 0x91, 0xCC, 0x2D, 0x2D, 0x43, 0xCD, 0x38, 0xE7, 0x6B, 0xE1, 0xA5, 0xA9, 0x53, 0xC9,
+ 0x0E, 0xBB, 0x36, 0x10, 0x2C, 0xDF, 0x2E, 0xB5, 0xD1, 0x81, 0xCC, 0x4F, 0xAF, 0x77, 0x21, 0xFC,
+ 0xA8, 0xFB, 0x78, 0x3D, 0xF0, 0x16, 0x76, 0xCF, 0x97, 0x67, 0xE8, 0x2B, 0x29, 0x00, 0x93, 0xAF,
+ 0x60, 0x66, 0x38, 0x0C, 0x4A, 0xED, 0xAA, 0xA7, 0x89, 0x3F, 0xE8, 0x40, 0x9D, 0x02, 0xA7, 0xB7,
+ 0x95, 0x51, 0xBE, 0x57, 0x45, 0xC5, 0x7E, 0x1E, 0xAD, 0x09, 0x6C, 0xD9, 0x81, 0x56, 0xA2, 0x92,
+ 0x72, 0x17, 0xD2, 0x86, 0x62, 0x7A, 0x62, 0x0A, 0xAE, 0xEC, 0x0D, 0x27, 0x35, 0x40, 0xFA, 0xAE,
+ 0x78, 0xEA, 0x70, 0xD4, 0xF0, 0xDA, 0xCD, 0x87, 0xF5, 0x9D, 0x5F, 0x83, 0xCB, 0x3B, 0x07, 0x52,
+ 0xD0, 0xA2, 0xB4, 0x22, 0x8E, 0xDF, 0xAA, 0xF6, 0xAB, 0x31, 0x91, 0x90, 0xBE, 0x21, 0xF9, 0x7D,
+ 0x87, 0x23, 0x1C, 0x59, 0x00, 0x05, 0xF5, 0x4F, 0x9B, 0xBB, 0x6D, 0x50, 0x7E, 0x56, 0x6B, 0x3E,
+ 0xAE, 0x9B, 0x6F, 0xAB, 0x88, 0xEC, 0xAE, 0x0F, 0x6C, 0x89, 0xAB, 0x26, 0x6B, 0x5A, 0xD9, 0x6D,
+ 0xF1, 0x23, 0x9E, 0xB3, 0xEB, 0x97, 0x08, 0xF0, 0x0E, 0x5C, 0x80, 0x00, 0xCD, 0x7A, 0x4F, 0x64,
+ 0xF9, 0x1A, 0x80, 0x0D, 0xFA, 0x3D, 0x42, 0x71, 0x39, 0x83, 0x15, 0x8A, 0xFF, 0x91, 0x9F, 0x80,
+ 0x0F, 0x67, 0xAA, 0xBB, 0xB0, 0x67, 0x45, 0x30, 0xDD, 0x86, 0x8C, 0x1D, 0xF7, 0x7A, 0xB3, 0x28,
+ 0xA1, 0xD6, 0x56, 0x63, 0xD2, 0x75, 0x10, 0xF0, 0x77, 0x53, 0x1A, 0x95, 0x9A, 0x49, 0xD7, 0x3E,
+ 0xAA, 0x24, 0x92, 0x02, 0x92, 0xF5, 0x7D, 0x2F, 0x8F, 0x24, 0x36, 0x11, 0x59, 0xCF, 0x62, 0xA6,
+ 0x69, 0xCD, 0xB5, 0x66, 0x75, 0x20, 0x16, 0x41, 0xC1, 0x4F, 0xE5, 0x81, 0xC4, 0xC2, 0x91, 0x69,
+ 0xC0, 0xF1, 0xA3, 0x01, 0x6B, 0xA9, 0x0F, 0x55, 0x2D, 0x29, 0xD7, 0x1D, 0xDD, 0x7D, 0x9E, 0xCF,
+ 0xF5, 0x05, 0xFA, 0x7C, 0x1F, 0x8B, 0xC9, 0xCA, 0x34, 0x66, 0xEF, 0x3C, 0x24, 0x9A, 0xAE, 0xCF,
+ 0xCB, 0x12, 0xB1, 0xE5, 0x59, 0xD9, 0x30, 0x90, 0xB3, 0xA7, 0xE9, 0x38, 0x9A, 0x73, 0x1C, 0xDE,
+ 0xBE, 0x62, 0x77, 0x5E, 0x75, 0xBF, 0x37, 0x39, 0x27, 0xBA, 0x91, 0xEB, 0xED, 0xAB, 0xB5, 0xCE,
+ 0x8E, 0x6E, 0xBD, 0xD4, 0x64, 0x64, 0x47, 0x16, 0x14, 0x98, 0xC6, 0xF0, 0xB6, 0x4A, 0xE8, 0xB7,
+ 0x67, 0x86, 0xC5, 0xCB, 0xCE, 0xB1, 0x7B, 0xC0, 0xDE, 0x87, 0xF7, 0x8E, 0xE7, 0x21, 0x3A, 0x86,
+ 0xB5, 0x9C, 0x38, 0xBA, 0x60, 0x98, 0xFA, 0x93, 0xBA, 0x63, 0xE3, 0x0F, 0x74, 0xB1, 0x6B, 0x39,
+ 0x68, 0xB6, 0x53, 0xB1, 0x8A, 0xBB, 0x76, 0x65, 0x74, 0x1D, 0x99, 0xBA, 0x01, 0x8A, 0xE3, 0x7C,
+ 0xC0, 0x73, 0x2A, 0x98, 0x13, 0x0E, 0x22, 0xB4, 0xF6, 0xC4, 0xF9, 0x89, 0xAF, 0x9B, 0x52, 0x6F,
+ 0x28, 0xEC, 0x8E, 0x13, 0xC4, 0xD4, 0x97, 0x74, 0x2E, 0xDB, 0x6F, 0xA8, 0x41, 0xE3, 0xDC, 0x6A,
+ 0xE4, 0xB8, 0x18, 0x2C, 0x19, 0x59, 0xE1, 0x45, 0xC5, 0xED, 0x8F, 0xCA, 0x24, 0x2A, 0x3F, 0xAD,
+ 0xDA, 0x98, 0xC1, 0x70, 0x7F, 0xF3, 0x87, 0xE1, 0xB8, 0xBC, 0xF5, 0xFB, 0x29, 0x7B, 0x12, 0x26,
+ 0x22, 0x1A, 0x5B, 0x59, 0x21, 0x21, 0x79, 0x30, 0xA7, 0x69, 0x13, 0xD9, 0x9E, 0x62, 0x02, 0x77,
+ 0x84, 0xB9, 0x87, 0xD3, 0xCB, 0x0E, 0xB0, 0x73, 0x58, 0x21, 0xFE, 0x18, 0x6A, 0x92, 0x94, 0x30,
+ 0xEC, 0x06, 0x11, 0xB9, 0xC8, 0x99, 0x6B, 0xE9, 0xFE, 0x44, 0x9D, 0x04, 0xBA, 0xC9, 0x92, 0x7E,
+ 0x46, 0x7B, 0x81, 0x4A, 0x70, 0x79, 0x56, 0x7F, 0x39, 0x96, 0x58, 0xC6, 0x35, 0x8A, 0x8F, 0x98,
+ 0x47, 0xF8, 0xD9, 0x16, 0x81, 0xC1, 0x79, 0x43, 0x08, 0xF9, 0x4A, 0xC7, 0xBA, 0x31, 0xCA, 0xC3,
+ 0x0D, 0xEA, 0x71, 0x40, 0x42, 0x2E, 0x29, 0xF2, 0xB1, 0x96, 0xFB, 0xC0, 0x98, 0x3B, 0x2F, 0xB2,
+ 0x8D, 0x82, 0xBA, 0xB0, 0x8D, 0x3D, 0x78, 0x10, 0xF2, 0x33, 0x55, 0xD2, 0x02, 0x98, 0x3A, 0xF3,
+ 0x43, 0x8F, 0x8D, 0x27, 0xD0, 0x1B, 0x50, 0x04, 0xB2, 0xA8, 0x42, 0x36, 0xE7, 0xD9, 0x2B, 0x4A,
+ 0x33, 0x9E, 0xBF, 0x46, 0x12, 0x17, 0x82, 0x89, 0xEA, 0xAA, 0x35, 0x7F, 0x3C, 0x6B, 0xEC, 0xC2,
+ 0x84, 0x33, 0xAB, 0x10, 0x25, 0x59, 0x0F, 0x2B, 0x90, 0x3F, 0xF4, 0x2A, 0x97, 0x6F, 0xD5, 0x6C,
+ 0xE3, 0x08, 0x07, 0xA9, 0xFC, 0x84, 0x7B, 0x51, 0x2F, 0x23, 0x2A, 0x6E, 0xF1, 0x0F, 0xEF, 0x48,
+ 0x9F, 0x66, 0x8F, 0x5C, 0x9A, 0x21, 0x84, 0xD7, 0xB1, 0x14, 0x82, 0xA2, 0xE4, 0xE6, 0x72, 0x56,
+ 0x46, 0xCB, 0x26, 0x2F, 0xE2, 0x6D, 0x5B, 0x07, 0xA6, 0xF3, 0x94, 0x24, 0x24, 0x58, 0x45, 0xF4,
+ 0xB4, 0x54, 0x90, 0xFF, 0x59, 0x17, 0x04, 0xC8, 0x9A, 0x4D, 0x82, 0xEF, 0x24, 0xBB, 0x2C, 0x11,
+ 0x9F, 0x2D, 0xD4, 0xE5, 0x0A, 0x2A, 0xF0, 0x94, 0x64, 0x48, 0xFF, 0xB4, 0x7D, 0x01, 0x42, 0xBE,
+ 0x8F, 0xB2, 0x2F, 0x2A, 0x0A, 0x17, 0xB0, 0xA2, 0x0B, 0x5E, 0x32, 0x05, 0x2A, 0x0A, 0xE5, 0xF6,
+ 0x3D, 0xA8, 0x12, 0xBD, 0x5C, 0x4F, 0x59, 0x76, 0xAB, 0x9C, 0x89, 0x98, 0xFD, 0xCE, 0x0B, 0xA1,
+ 0x62, 0x4D, 0x3A, 0x16, 0xA5, 0x80, 0x62, 0x8B, 0x52, 0xD4, 0x2A, 0x8E, 0xC0, 0x17, 0xE3, 0x42,
+ 0xA6, 0x70, 0x40, 0x6B, 0xE8, 0xE7, 0xD7, 0xA7, 0x43, 0x12, 0xF6, 0xB3, 0x7A, 0xE2, 0xFE, 0x42,
+ 0xB0, 0xAF, 0x33, 0x56, 0x10, 0xB1, 0x69, 0x3D, 0x7B, 0x7F, 0xDE, 0xC6, 0xE1, 0x0F, 0xCC, 0x5B,
+ 0xF9, 0x53, 0x08, 0x80, 0x05, 0x33, 0xD8, 0x09, 0x7B, 0x87, 0x71, 0xE0, 0xF5, 0xCA, 0xB5, 0xFB,
+ 0xB4, 0x3C, 0x4A, 0x6B, 0x10, 0xBA, 0xA6, 0xE6, 0x69, 0xD6, 0x8E, 0x8C, 0x5B, 0x33, 0x07, 0xE8,
+ 0x22, 0xB9, 0xF8, 0x3C, 0xEF, 0xE0, 0xDA, 0x06, 0x54, 0xCB, 0x14, 0xDB, 0x2B, 0x50, 0x92, 0xB2,
+ 0x5C, 0xB8, 0xCB, 0xB6, 0x40, 0xB1, 0x91, 0xD4, 0xD7, 0xF9, 0xC2, 0x08, 0x77, 0xC9, 0xB7, 0x00,
+ 0x9B, 0x32, 0x20, 0xC4, 0x08, 0x39, 0xEE, 0xD6, 0x32, 0xB8, 0x63, 0x0F, 0x1A, 0x73, 0x33, 0x73,
+ 0xE1, 0xFB, 0x0E, 0x94, 0x75, 0xCE, 0x37, 0xA4, 0xAF, 0xBC, 0x39, 0xAB, 0x25, 0x35, 0xA7, 0xDF,
+ 0xC2, 0x9B, 0xF5, 0xD7, 0x52, 0x44, 0xDE, 0x21, 0x50, 0x5F, 0x3E, 0xA6, 0x37, 0x9E, 0x91, 0x56,
+ 0x12, 0x82, 0xCB, 0xA0, 0xAE, 0x6F, 0xA8, 0x81, 0x0C, 0x3B, 0xC0, 0x4C, 0xEE, 0x47, 0x57, 0x79,
+ 0xC1, 0x49, 0x4B, 0x7A, 0x92, 0xC7, 0x95, 0xA4, 0xD6, 0x3E, 0x25, 0xE5, 0xCF, 0x55, 0x65, 0x10,
+ 0x52, 0x58, 0xEA, 0x4F, 0xFC, 0x34, 0xB1, 0x0E, 0x0E, 0x2E, 0x45, 0x4C, 0xD7, 0xB7, 0x92, 0xC4,
+ 0x70, 0xE5, 0x33, 0xA1, 0x22, 0x49, 0x04, 0xF8, 0xAF, 0x5E, 0x6D, 0x4B, 0xDE, 0x76, 0xCD, 0x50,
+ 0x40, 0xFB, 0xFD, 0x7B, 0xC3, 0xF2, 0xEA, 0x4B, 0xEA, 0xA7, 0x66, 0x44, 0x2B, 0x4D, 0x0C, 0xA3,
+ 0xC4, 0xAA, 0x9C, 0x50, 0x36, 0x5A, 0x4D, 0xB7, 0x04, 0x81, 0x5C, 0xBD, 0x40, 0x62, 0x12, 0x6A,
+ 0x4C, 0x13, 0x35, 0x4E, 0x47, 0x16, 0xD9, 0x43, 0xE5, 0x8A, 0x44, 0x6D, 0x49, 0x71, 0x30, 0xA9,
+ 0x4C, 0xDE, 0x31, 0x1E, 0x2A, 0xE1, 0xDB, 0xBF, 0x1F, 0xB6, 0x7C, 0x36, 0xAA, 0x0F, 0x02, 0xBA,
+ 0x85, 0x87, 0xFC, 0x47, 0x90, 0x34, 0xD5, 0x13, 0x9E, 0x09, 0x2B, 0xC3, 0xEC, 0x83, 0x80, 0x9D,
+ 0xFE, 0x3D, 0x18, 0xBA, 0xFB, 0x51, 0x8D, 0x79, 0xF6, 0xFA, 0x38, 0x48, 0x60, 0x14, 0xCC, 0x60,
+ 0x81, 0x57, 0xEE, 0xA5, 0x04, 0x1B, 0x4A, 0x0E, 0x43, 0x15, 0x00, 0x57, 0xE2, 0x0A, 0xBC, 0xF4,
+ 0x14, 0x3B, 0x96, 0x95, 0xF3, 0xFC, 0x4E, 0x13, 0x6F, 0x0D, 0x63, 0x85, 0xD0, 0xB0, 0x3B, 0xCA,
+ 0x0A, 0x80, 0x3D, 0x11, 0xD1, 0x7A, 0xCF, 0xB2, 0x0B, 0xE1, 0x67, 0xDD, 0x45, 0x9B, 0xEC, 0x30,
+ 0xD5, 0xE3, 0x06, 0xB3, 0x94, 0xBB, 0xCB, 0x32, 0xBA, 0x17, 0xDF, 0x5F, 0x1F, 0x38, 0xAF, 0xC6,
+ 0xA9, 0xB5, 0x7F, 0xF6, 0x85, 0xC2, 0x99, 0x33, 0x0A, 0x3F, 0x7D, 0xB2, 0x72, 0x7D, 0xF7, 0xF4,
+ 0x1B, 0x11, 0xA1, 0x7D, 0xF7, 0x3D, 0x7F, 0x0F, 0xFA, 0xB1, 0xEE, 0x6C, 0xAD, 0xA9, 0xE7, 0x43,
+ 0x5D, 0xFE, 0xC9, 0x32, 0xF6, 0xF1, 0x97, 0xE7, 0x87, 0x17, 0x85, 0xB9, 0xBC, 0xC1, 0xD5, 0x2F,
+ 0xC4, 0x5A, 0xBE, 0x03, 0xC3, 0x49, 0xAB, 0x9D, 0x40, 0xFA, 0xE1, 0xBD, 0x1E, 0x44, 0xE8, 0x8A,
+ 0x6E, 0x98, 0x99, 0x4C, 0xC6, 0x2B, 0xE0, 0x18, 0x26, 0x83, 0xCA, 0x08, 0x0B, 0xDD, 0x69, 0xD1,
+ 0x33, 0xD5, 0x8F, 0xAD, 0xBD, 0x86, 0xFE, 0xC3, 0x0C, 0xC3, 0x99, 0x3D, 0x4B, 0xB0, 0x0C, 0x75,
+ 0x17, 0x89, 0x6E, 0x70, 0x0C, 0x23, 0xA9, 0x99, 0xD9, 0x59, 0x07, 0x7D, 0x30, 0xFC, 0xC5, 0x98,
+ 0xD0, 0xFF, 0x5D, 0x10, 0x99, 0xF4, 0xB7, 0xC5, 0x56, 0xE8, 0xA7, 0x0D, 0x02, 0xB4, 0x04, 0xFB,
+ 0x9E, 0x9C, 0x8B, 0x0C, 0x03, 0x57, 0x48, 0x73, 0x51, 0x9A, 0x8E, 0xB6, 0xB9, 0x15, 0x57, 0xFD,
+ 0x52, 0x1E, 0x27, 0x87, 0x68, 0xCF, 0x1C, 0x2B, 0x18, 0x2D, 0xDA, 0x00, 0x2F, 0x71, 0xB8, 0x66,
+ 0x35, 0x3F, 0x50, 0xC0, 0xBC, 0xF6, 0xF1, 0x0E, 0xD0, 0xAC, 0x1C, 0xFC, 0xAD, 0x7C, 0xD9, 0x36,
+ 0x3F, 0x20, 0xC1, 0x96, 0x83, 0xB1, 0x14, 0xAB, 0xC7, 0xD5, 0x0A, 0xF4, 0x41, 0x65, 0x7D, 0x4C,
+ 0x8D, 0x03, 0xB0, 0x4C, 0x3E, 0x16, 0x6B, 0xB7, 0xF7, 0x16, 0x6B, 0x2A, 0x82, 0x27, 0x5A, 0x1A,
+ 0x60, 0xFF, 0x21, 0x47, 0x0E, 0xF9, 0x66, 0x78, 0x3D, 0x27, 0xE7, 0x22, 0x93, 0x3C, 0x39, 0x9D,
+ 0xA1, 0xC1, 0x89, 0x6D, 0x16, 0xCF, 0x12, 0x43, 0x24, 0x9A, 0x40, 0x7A, 0x5A, 0xBA, 0xA5, 0xD2,
+ 0x1A, 0x9E, 0x71, 0x1F, 0x22, 0x33, 0x22, 0xA5, 0xEA, 0xA0, 0xF9, 0x88, 0x55, 0x05, 0x8D, 0xD9,
+ 0x0A, 0x45, 0x21, 0x9F, 0xA2, 0xD7, 0x0B, 0xE1, 0xC1, 0x3E, 0xDF, 0x89, 0xDE, 0x24, 0xF9, 0x3F,
+ 0x9B, 0x1E, 0xA6, 0xB9, 0x94, 0x67, 0x4D, 0xFB, 0x9E, 0x27, 0xA4, 0x6F, 0xF5, 0xCE, 0xEB, 0x97,
+ 0xDA, 0xB4, 0x8A, 0xFB, 0xF2, 0xAD, 0xD2, 0x2C, 0x0A, 0x76, 0xF2, 0xA7, 0x13, 0x0B, 0x47, 0xE2,
+ 0xF7, 0xDA, 0x56, 0xDF, 0x83, 0x86, 0x59, 0xE5, 0x22, 0x58, 0x2F, 0x9E, 0x9F, 0x51, 0xDF, 0xA5,
+ 0x35, 0xB1, 0xC1, 0xC6, 0xCE, 0xAF, 0x2C, 0xF7, 0x5F, 0xE1, 0x39, 0x6A, 0x87, 0x67, 0xB6, 0x86,
+ 0xC7, 0x24, 0x93, 0xEA, 0x78, 0x80, 0xDD, 0x66, 0x96, 0x40, 0x4E, 0xD7, 0x72, 0x14, 0x8F, 0x8E,
+ 0x2B, 0x62, 0x72, 0x07, 0x2F, 0x14, 0x9B, 0x3D, 0x7A, 0xB4, 0x90, 0x10, 0xF2, 0xDC, 0x1A, 0x0F,
+ 0x68, 0xAC, 0x00, 0x21, 0xA0, 0xF7, 0xE3, 0x31, 0x6F, 0xC8, 0x62, 0xDD, 0x16, 0x13, 0xDB, 0x5A,
+ 0x28, 0x56, 0xE5, 0x2A, 0x1D, 0x74, 0x7E, 0x9E, 0x33, 0xC2, 0xE2, 0x96, 0x2C, 0x88, 0xF5, 0xA4,
+ 0x46, 0x43, 0xE5, 0x90, 0x67, 0xE2, 0xC9, 0xF4, 0xB9, 0xC6, 0x44, 0xAB, 0xA2, 0x90, 0x22, 0xD2,
+ 0x7D, 0xF7, 0x23, 0x5F, 0xF7, 0x98, 0x09, 0x2A, 0xB1, 0xF5, 0xDC, 0x63, 0x50, 0x68, 0xB5, 0x07,
+ 0x22, 0x82, 0x59, 0x44, 0x34, 0x7B, 0x8C, 0x0A, 0x15, 0x16, 0x45, 0x9F, 0xAE, 0x25, 0x10, 0x94,
+ 0xB7, 0xC5, 0x4A, 0xDC, 0x42, 0x1C, 0x8A, 0xBC, 0x79, 0xD3, 0xB3, 0xA7, 0x57, 0x70, 0x52, 0xAB,
+ 0x0A, 0x17, 0x3B, 0x8B, 0xAE, 0x4B, 0x6D, 0x7C, 0x4D, 0x94, 0x30, 0x12, 0xAC, 0x9F, 0xF0, 0x2C,
+ 0xB7, 0x84, 0x4F, 0xAF, 0x54, 0x9E, 0x2A, 0x0B, 0x76, 0x65, 0xEB, 0x4C, 0x09, 0x26, 0x51, 0xAC,
+ 0x85, 0xC2, 0xD3, 0x27, 0xE8, 0x90, 0xB1, 0xBD, 0x70, 0x00, 0xBB, 0xBE, 0x32, 0x8A, 0x06, 0x90,
+ 0xB6, 0x7A, 0x28, 0x8C, 0x18, 0xE0, 0xA7, 0x0A, 0x93, 0x4E, 0x3B, 0x91, 0x63, 0xB8, 0xF8, 0xCD,
+ 0x8D, 0xFD, 0x9C, 0x80, 0x22, 0x11, 0x60, 0x16, 0x47, 0xAE, 0x63, 0xD2, 0xEA, 0x1E, 0xF6, 0x09,
+ 0x1E, 0x8A, 0x9B, 0xB5, 0x77, 0xE4, 0x66, 0x2D, 0x04, 0x89, 0xD8, 0xB6, 0xAB, 0x68, 0x70, 0x67,
+ 0x4D, 0x15, 0x70, 0x6F, 0x1C, 0xB0, 0xC0, 0x23, 0x27, 0xDB, 0xCA, 0x5A, 0x10, 0x34, 0x5A, 0x6C,
+ 0x2F, 0x89, 0x27, 0x45, 0x8D, 0xF4, 0xCD, 0x38, 0x28, 0x9B, 0x5C, 0x66, 0xD4, 0x8F, 0x23, 0x08,
+ 0xF9, 0x8F, 0x60, 0x58, 0x56, 0x92, 0xBB, 0xC2, 0x8F, 0x6E, 0xC8, 0x15, 0x92, 0x92, 0x33, 0xAD,
+ 0xB4, 0x50, 0x7C, 0x31, 0x3D, 0x77, 0x9D, 0xCF, 0x01, 0x9E, 0x08, 0xA1, 0x63, 0xEE, 0x3B, 0xDD,
+ 0x79, 0x67, 0x61, 0xF0, 0xB3, 0x90, 0x00, 0x5F, 0x70, 0x58, 0x85, 0x97, 0xED, 0x1F, 0x5C, 0x67,
+ 0x96, 0x45, 0x31, 0xC5, 0xCF, 0xDC, 0x00, 0x48, 0x34, 0xDF, 0x0B, 0x5B, 0xFB, 0xC0, 0xB3, 0x3F,
+ 0x72, 0xFF, 0x0D, 0x05, 0x4E, 0x4D, 0x42, 0x6F, 0x65, 0x75, 0x1B, 0xB5, 0xCA, 0xB5, 0xA6, 0x67,
+ 0x18, 0x77, 0x51, 0x21, 0x4D, 0x0B, 0xC3, 0x6B, 0xB7, 0x70, 0x78, 0x81, 0xCC, 0xB1, 0xD8, 0xCD,
+ 0xFA, 0xA4, 0x40, 0x80, 0xEF, 0x90, 0xE6, 0x64, 0x4C, 0x7E, 0xC7, 0x5F, 0x90, 0xF1, 0xA0, 0x66,
+ 0x7C, 0x06, 0x4F, 0xF9, 0xD3, 0x96, 0x31, 0x96, 0x4B, 0x91, 0x8B, 0x94, 0x45, 0x59, 0xCB, 0xE1,
+ 0x5F, 0x45, 0xBD, 0xDD, 0x29, 0xED, 0x2D, 0xFE, 0xDD, 0x58, 0xBC, 0xED, 0x4A, 0x8B, 0xEE, 0xF5,
+ 0xEA, 0x9B, 0xDC, 0xCE, 0x55, 0xB6, 0x9A, 0x3E, 0xE0, 0xD0, 0xE0, 0x1E, 0xDE, 0xB4, 0x33, 0xF1,
+ 0xA5, 0x1B, 0x07, 0x2B, 0x5F, 0xA2, 0x59, 0x28, 0xD7, 0xC3, 0x3B, 0x52, 0xBF, 0x4C, 0x2E, 0xD7,
+ 0x88, 0x22, 0x77, 0xD9, 0x51, 0x27, 0x08, 0xA4, 0xC7, 0xF3, 0x5B, 0xF2, 0x7B, 0x6D, 0x34, 0x6E,
+ 0x81, 0x53, 0xB2, 0xB8, 0x0F, 0xDE, 0x51, 0x75, 0x20, 0x36, 0x1E, 0x86, 0xB5, 0x1D, 0xCF, 0xCA,
+ 0x5D, 0xEF, 0x00, 0x3E, 0x68, 0xD6, 0x8C, 0x09, 0xE6, 0x12, 0x2D, 0x97, 0x24, 0xFD, 0x6A, 0xB1,
+ 0xD5, 0x13, 0x18, 0x1A, 0xBF, 0x8D, 0xE5, 0x38, 0x7E, 0x57, 0x47, 0x09, 0xEC, 0xA9, 0xDF, 0x97,
+ 0xDA, 0x8C, 0x91, 0x2F, 0x29, 0x2D, 0xAC, 0x8B, 0xCA, 0xC7, 0x03, 0xD8, 0x68, 0xF9, 0x77, 0x2E,
+ 0x9F, 0x5F, 0xCE, 0xD8, 0xA4, 0x39, 0x0E, 0x64, 0xB8, 0xD8, 0x21, 0x7D, 0xCE, 0x68, 0xA5, 0xD5,
+ 0x38, 0x79, 0x9F, 0x90, 0x49, 0x33, 0x72, 0x05, 0x72, 0x4C, 0x76, 0x83, 0x35, 0xFC, 0x1A, 0xE2,
+ 0xF4, 0x60, 0xC8, 0xA8, 0x54, 0xC3, 0xC1, 0x4D, 0x17, 0xFD, 0xAE, 0xA9, 0xA9, 0x20, 0xFE, 0xF9,
+ 0x25, 0x4A, 0xE3, 0x22, 0xDC, 0x7D, 0xE0, 0xFC, 0x47, 0xF7, 0xA6, 0xF3, 0x3F, 0xCE, 0xC8, 0x2E,
+ 0x8B, 0xCE, 0xFA, 0x46, 0x8D, 0x38, 0x4B, 0x3C, 0xB6, 0x23, 0xA9, 0x2E, 0x53, 0xD9, 0xC3, 0x60,
+ 0x60, 0xFF, 0x10, 0xC7, 0x38, 0x54, 0x5C, 0xBD, 0x3E, 0xB1, 0x52, 0x2C, 0x30, 0xB3, 0x6D, 0x14,
+ 0x5B, 0x4D, 0xAD, 0x68, 0x9E, 0xD6, 0x0A, 0x91, 0xFD, 0x40, 0x69, 0xE1, 0xB3, 0x76, 0x21, 0x9D,
+ 0x5D, 0x97, 0x9F, 0x01, 0x11, 0x55, 0x9A, 0x82, 0x57, 0x1D, 0xD6, 0x55, 0xE7, 0x20, 0x5E, 0x12,
+ 0x0A, 0xD9, 0xA8, 0x26, 0xB9, 0x1B, 0x0A, 0xE5, 0xB0, 0x25, 0x79, 0xB2, 0x94, 0x9F, 0x43, 0xA6,
+ 0xBA, 0x29, 0x7E, 0x61, 0x4C, 0x48, 0xEA, 0xBE, 0xC1, 0x5D, 0xE8, 0xF0, 0xEB, 0x4B, 0xE1, 0xF5,
+ 0x4B, 0x2D, 0xD3, 0xAA, 0x1C, 0x51, 0x00, 0x15, 0x16, 0x64, 0xFC, 0xC3, 0x2B, 0xF0, 0x91, 0xBC,
+ 0xF9, 0xDB, 0xE9, 0x88, 0x70, 0xD3, 0x56, 0x47, 0xA3, 0x65, 0xA3, 0x34, 0x74, 0xD8, 0x97, 0x14,
+ 0x7B, 0xA5, 0x1E, 0x12, 0xD7, 0xA6, 0x88, 0x00, 0x91, 0x49, 0xFE, 0xD8, 0xF1, 0x0F, 0x59, 0xE3,
+ 0xED, 0x5D, 0x8E, 0x39, 0x0D, 0x10, 0xB5, 0x42, 0x31, 0x31, 0x6A, 0x7A, 0x56, 0xD0, 0x25, 0xB6,
+ 0x47, 0x7D, 0xBB, 0xCE, 0x47, 0x0A, 0xA7, 0xFF, 0xB9, 0xCB, 0xED, 0x79, 0xFF, 0xFE, 0x16, 0x0C,
+ 0x5F, 0xC4, 0xAF, 0x31, 0x2C, 0xAB, 0x23, 0xA9, 0xBB, 0x2E, 0x9B, 0x09, 0xFA, 0x52, 0xC6, 0x80,
+ 0xF8, 0xB7, 0x3A, 0xFD, 0xD2, 0xAC, 0xBF, 0x87, 0x77, 0x3B, 0x71, 0x25, 0xCA, 0xDB, 0xC7, 0xE9,
+ 0x90, 0xCC, 0x98, 0x42, 0x36, 0xCE, 0xF5, 0x9F, 0x3D, 0x52, 0xDD, 0xE8, 0xB3, 0xFB, 0x46, 0x94,
+ 0xAE, 0x17, 0xC8, 0xA4, 0x84, 0xF7, 0xA7, 0xD3, 0xBD, 0x31, 0xCE, 0x90, 0xAF, 0xE7, 0x88, 0x59,
+ 0x06, 0x68, 0x7F, 0x05, 0xEB, 0x93, 0xDC, 0x17, 0x41, 0x1C, 0xE0, 0x8B, 0x08, 0x98, 0xCE, 0x45,
+ 0xF2, 0xE5, 0x8C, 0xF7, 0xBA, 0xBB, 0x2B, 0x0D, 0x2D, 0x78, 0xC7, 0x37, 0xB2, 0xDD, 0xE9, 0x86,
+ 0x75, 0x96, 0xB7, 0xB6, 0x90, 0x14, 0x0E, 0xB8, 0x65, 0x74, 0xC9, 0x4A, 0xA7, 0x7B, 0x39, 0x88,
+ 0x61, 0x02, 0x24, 0x55, 0x21, 0x14, 0x9B, 0x29, 0xC3, 0xB1, 0x37, 0xE3, 0x48, 0xCE, 0xAE, 0x42,
+ 0x07, 0x2C, 0x08, 0xC8, 0x6E, 0xCE, 0x6F, 0xF6, 0x40, 0x40, 0xBD, 0xC2, 0xC9, 0x76, 0x7B, 0x11,
+ 0xF7, 0x81, 0xD9, 0xE7, 0x6D, 0x4B, 0x1B, 0xDB, 0x9E, 0x13, 0x30, 0xDB, 0x55, 0xBB, 0x84, 0xE7,
+ 0x0F, 0xBA, 0x13, 0x72, 0x04, 0xBE, 0x94, 0x13, 0xB4, 0xA8, 0xF4, 0x23, 0x89, 0x20, 0x1D, 0x5A,
+ 0xC2, 0x23, 0xCF, 0x41, 0x38, 0xCD, 0xFF, 0x93, 0x76, 0x7D, 0xF6, 0x95, 0x5A, 0x3C, 0x27, 0x27,
+ 0xEC, 0x79, 0xA8, 0xF7, 0x41, 0x5C, 0xA4, 0xD7, 0x37, 0x09, 0x6E, 0xBD, 0x1D, 0x2C, 0x59, 0xFE,
+ 0xD7, 0x6B, 0x73, 0xC1, 0x1F, 0x97, 0x5F, 0x9F, 0x1E, 0xDE, 0x23, 0x9D, 0xFF, 0xE2, 0x83, 0x52,
+ 0x9E, 0xB0, 0x80, 0x2D, 0x2E, 0xE4, 0x99, 0xB1, 0x02, 0x28, 0x69, 0xEB, 0x0B, 0x5E, 0xD0, 0xEA,
+ 0xB4, 0x77, 0x96, 0xBD, 0x79, 0xE9, 0xCB, 0x1B, 0xBD, 0x4D, 0x39, 0x83, 0x4E, 0x2D, 0x62, 0x94,
+ 0xB2, 0x29, 0xFC, 0x9E, 0xC3, 0x18, 0x60, 0x8C, 0xE0, 0x60, 0x40, 0x10, 0x97, 0x16, 0xAB, 0x3A,
+ 0x85, 0x2D, 0xD5, 0x80, 0x0C, 0xDA, 0xB7, 0x41, 0xE4, 0x6A, 0x07, 0x75, 0xC5, 0x43, 0x49, 0x6B,
+ 0xBB, 0xA6, 0x12, 0x84, 0xBF, 0xDD, 0x4D, 0x76, 0xC8, 0x0F, 0xEC, 0xC1, 0x1B, 0xFE, 0x24, 0x67,
+ 0x37, 0x08, 0x42, 0xA5, 0x61, 0x60, 0xC9, 0x2B, 0x32, 0x25, 0x88, 0xB4, 0x99, 0x68, 0x40, 0xAD,
+ 0x68, 0x49, 0xD5, 0x61, 0xF9, 0xBA, 0x5A, 0xDD, 0xB1, 0x47, 0xB1, 0xA9, 0x61, 0x38, 0x87, 0xC4,
+ 0x86, 0x88, 0x0B, 0x7B, 0xA8, 0xCD, 0xB0, 0x35, 0x62, 0xA2, 0xDA, 0x7A, 0x3C, 0x85, 0x00, 0x66,
+ 0x79, 0x74, 0xFF, 0x79, 0x6F, 0x6C, 0x4B, 0x21, 0x65, 0x7E, 0x2F, 0xFF, 0x8A, 0xD8, 0xE8, 0x69,
+ 0x3D, 0x3D, 0xF5, 0xB8, 0xEF, 0x8B, 0x6D, 0xE8, 0x6F, 0x69, 0x2F, 0x8B, 0x49, 0xD8, 0x10, 0xF5,
+ 0x42, 0xB9, 0xA6, 0x2A, 0xC8, 0xB2, 0xE7, 0x6A, 0x20, 0x84, 0x89, 0x07, 0xA0, 0xFF, 0xC8, 0x0D,
+ 0x8D, 0xEE, 0xB6, 0xED, 0x7B, 0x03, 0x46, 0x36, 0xC7, 0x69, 0x8A, 0x18, 0x88, 0x5C, 0xBB, 0xA9,
+ 0xC0, 0x40, 0x49, 0x16, 0xB4, 0x85, 0x50, 0x88, 0x3D, 0x50, 0x7C, 0x50, 0x3B, 0x12, 0x19, 0xEB,
+ 0x9E, 0x1F, 0x44, 0x11, 0x8B, 0x1C, 0xF0, 0xCF, 0xE1, 0x76, 0xA4, 0xAB, 0x4F, 0x2E, 0x46, 0x43,
+ 0xA4, 0xB2, 0x6E, 0x79, 0x4A, 0x89, 0x19, 0x70, 0xD8, 0xBE, 0xF5, 0x8D, 0xAA, 0x5B, 0x23, 0xB8,
+ 0xBA, 0xFB, 0xE6, 0xA7, 0xF1, 0xE8, 0xA3, 0xF8, 0xE7, 0x2D, 0x7F, 0x3B, 0x7D, 0x89, 0x48, 0x99,
+ 0xAC, 0x5A, 0xC0, 0x5B, 0xCD, 0xE3, 0xC1, 0x65, 0x52, 0xB0, 0xA5, 0xFC, 0x5C, 0xA2, 0xEB, 0xFB,
+ 0x61, 0x04, 0xE2, 0xC9, 0xD6, 0x24, 0x27, 0x12, 0x2F, 0x3A, 0x9E, 0xE6, 0x97, 0x87, 0x19, 0x4F,
+ 0xBB, 0x09, 0x80, 0x4A, 0xAD, 0x9B, 0x18, 0x8E, 0x43, 0x91, 0xAF, 0x2C, 0x54, 0xE8, 0xDB, 0xB8,
+ 0x0C, 0x11, 0xC7, 0x29, 0xE7, 0x76, 0xCF, 0xAA, 0xCC, 0x83, 0x77, 0x4E, 0xE6, 0x4D, 0x78, 0xFD,
+ 0x1C, 0x14, 0xCA, 0x1F, 0x0F, 0xA3, 0x70, 0xDB, 0x33, 0x44, 0xF2, 0x34, 0x3F, 0xDB, 0x5E, 0x1F,
+ 0x9B, 0x25, 0x47, 0x44, 0x5F, 0x04, 0xCD, 0xBA, 0x79, 0x2A, 0x21, 0xD0, 0x8B, 0x71, 0xF8, 0x9F,
+ 0x16, 0x6D, 0xEE, 0x1A, 0xE9, 0x6C, 0x52, 0xDB, 0x8D, 0x17, 0x28, 0xAD, 0xFD, 0xEF, 0x7B, 0xAC,
+ 0x53, 0x6B, 0xED, 0x11, 0x04, 0x83, 0xFD, 0x96, 0x2E, 0xB2, 0x31, 0xC6, 0x0C, 0x13, 0x4C, 0x20,
+ 0x58, 0x19, 0xDE, 0x2F, 0x8C, 0xF1, 0x63, 0x48, 0x8C, 0x3A, 0xE9, 0xF8, 0x81, 0x75, 0x0D, 0x10,
+ 0x1E, 0x74, 0xA5, 0x7E, 0xF7, 0xC3, 0x11, 0xFB, 0x20, 0xF0, 0xF9, 0x72, 0x7B, 0x8B, 0xF4, 0x3C,
+ 0xCC, 0x54, 0x5F, 0xA6, 0xEF, 0xA8, 0x03, 0xB3, 0x7E, 0x72, 0xEB, 0xA0, 0x93, 0x67, 0xAC, 0x38,
+ 0x9F, 0xD6, 0xEF, 0x16, 0x1D, 0x33, 0x4B, 0xC5, 0x80, 0x60, 0x70, 0xF1, 0xF8, 0x10, 0x91, 0x2D,
+ 0xA7, 0x04, 0xDD, 0x0A, 0xEB, 0xEC, 0x2F, 0xA3, 0xB9, 0x4B, 0x79, 0x96, 0x3C, 0xA4, 0xE8, 0x47,
+ 0xA5, 0xDA, 0xE2, 0x65, 0x94, 0xEA, 0xAA, 0x32, 0x78, 0xBD, 0x6F, 0xA2, 0x78, 0x7D, 0x15, 0x7D,
+ 0xC3, 0xE8, 0x28, 0x91, 0xE4, 0x3C, 0x91, 0x3C, 0xC1, 0x42, 0xEA, 0x0A, 0x51, 0x3E, 0x40, 0x4B,
+ 0xAF, 0xB5, 0xBF, 0x56, 0x42, 0xDE, 0x98, 0xE5, 0xC5, 0xB7, 0xF5, 0x14, 0x22, 0xDB, 0xA6, 0xA4,
+ 0x7E, 0x88, 0xEA, 0xD1, 0x2F, 0x57, 0xD0, 0x3D, 0x17, 0x41, 0x7D, 0xD8, 0x4C, 0x3D, 0x49, 0xC4,
+ 0xF3, 0x0D, 0xC4, 0x80, 0xBE, 0x6C, 0x1A, 0x26, 0xEB, 0xBF, 0xF6, 0x95, 0xE7, 0x9A, 0x44, 0x41,
+ 0x90, 0x1F, 0xD1, 0x70, 0x7B, 0x65, 0xA1, 0x0F, 0xA3, 0xAA, 0xB5, 0xF1, 0xC0, 0x3D, 0x31, 0x92,
+ 0xA7, 0x2F, 0xB4, 0x72, 0xAB, 0x7A, 0x61, 0xB5, 0x37, 0xBF, 0xC2, 0xE5, 0x41, 0xBA, 0x75, 0x5D,
+ 0xB3, 0x59, 0xFA, 0x96, 0x04, 0x59, 0x2B, 0x96, 0x10, 0x79, 0x66, 0x76, 0xF7, 0x71, 0xCB, 0x37,
+ 0xF7, 0x60, 0x19, 0x59, 0x21, 0x5F, 0xEE, 0x8B, 0x2D, 0x91, 0x3D, 0xEB, 0x57, 0x65, 0xB4, 0x09,
+ 0x09, 0x38, 0xEB, 0x70, 0x96, 0x43, 0x87, 0x80, 0x07, 0x9F, 0x0B, 0x09, 0x03, 0xF8, 0x5F, 0xF4,
+ 0x5A, 0x53, 0x60, 0x86, 0x48, 0x8A, 0xB3, 0xB6, 0x34, 0xE0, 0xFC, 0xE5, 0x95, 0x12, 0xE7, 0x7C,
+ 0xE9, 0x14, 0x56, 0x2D, 0x8D, 0x9C, 0xA8, 0x6F, 0x2F, 0x65, 0x29, 0xBC, 0xC2, 0xEB, 0xA8, 0xD2,
+ 0xA9, 0xD3, 0x3E, 0x7E, 0xED, 0x28, 0x9C, 0xFD, 0x15, 0x5D, 0x64, 0x21, 0x30, 0xAB, 0xD3, 0x0C,
+ 0x0D, 0x63, 0x5B, 0xC5, 0xBE, 0x03, 0xB1, 0x03, 0x7E, 0x7E, 0xE5, 0xCC, 0x0C, 0x1C, 0xB8, 0x74,
+ 0x57, 0x58, 0x0E, 0xA1, 0xBE, 0xA7, 0x90, 0x3B, 0x9B, 0x98, 0xB2, 0xC0, 0xF3, 0x97, 0x41, 0xBD,
+ 0x1F, 0xD7, 0x31, 0x42, 0xB6, 0xFF, 0x6D, 0x4B, 0xEC, 0x4D, 0x98, 0x15, 0x71, 0x46, 0x4C, 0x14,
+ 0x7B, 0x59, 0xE2, 0x88, 0xE4, 0x4E, 0xF2, 0x74, 0x6F, 0x64, 0x4A, 0xEE, 0x46, 0x46, 0x4F, 0xC6,
+ 0xF5, 0x3C, 0x12, 0xC8, 0xBE, 0x8C, 0x55, 0x19, 0xC5, 0xC0, 0x9F, 0x31, 0xC4, 0xDA, 0xCB, 0x3C,
+ 0xF3, 0xC6, 0x42, 0xBC, 0x3B, 0x96, 0x62, 0xB9, 0x77, 0x54, 0x41, 0xE6, 0x74, 0x82, 0xBA, 0xCB,
+ 0x32, 0x7A, 0x8D, 0x05, 0xBF, 0x3C, 0x4A, 0x97, 0x2A, 0xF7, 0xEC, 0xCF, 0xA0, 0x3E, 0x5A, 0xDC,
+ 0x41, 0x23, 0xB0, 0xB8, 0x56, 0x55, 0xD8, 0xC2, 0xA7, 0x3F, 0x32, 0x37, 0xD3, 0x6F, 0x01, 0xA2,
+ 0x0E, 0x26, 0xD7, 0xB5, 0xA0, 0xA5, 0x34, 0x22, 0x47, 0xFD, 0xD1, 0x52, 0xF3, 0xE1, 0xE0, 0xAB,
+ 0xF9, 0xD0, 0x8E, 0x7C, 0x42, 0x1D, 0x11, 0xEA, 0xA4, 0xCE, 0x38, 0x68, 0xDE, 0xBC, 0xBA, 0x6A,
+ 0x50, 0x91, 0x54, 0x86, 0x0E, 0x98, 0xAA, 0x2C, 0x57, 0x5C, 0x2A, 0x70, 0x57, 0x58, 0x6A, 0xD1,
+ 0x9C, 0xB9, 0xEB, 0x5E, 0xD2, 0x35, 0xD9, 0xC5, 0x2A, 0x6B, 0x0C, 0x60, 0x39, 0xE4, 0x4C, 0xCD,
+ 0xF0, 0xFB, 0xF7, 0x52, 0x86, 0x48, 0xCF, 0x27, 0xB4, 0x9A, 0xC7, 0x20, 0xB2, 0xDD, 0x5E, 0x7D,
+ 0x4F, 0x2B, 0xC5, 0x96, 0xC5, 0xAE, 0x65, 0x26, 0xD9, 0x18, 0xC6, 0xBE, 0x59, 0xFF, 0x85, 0x51,
+ 0x6D, 0xE6, 0x4E, 0xED, 0x25, 0x7D, 0x8D, 0x86, 0xDD, 0xB9, 0x06, 0x7A, 0x76, 0x66, 0x68, 0x42,
+ 0x13, 0x6F, 0xC8, 0x7D, 0xF8, 0x9E, 0x9B, 0x51, 0xFD, 0xEE, 0x2F, 0xF5, 0x19, 0x5E, 0x14, 0x4E,
+ 0xFB, 0x69, 0x68, 0xE6, 0x9D, 0xB7, 0xD5, 0x31, 0xBB, 0xB4, 0x96, 0x4F, 0x25, 0x86, 0x25, 0xDA,
+ 0x98, 0xC7, 0x3A, 0xD6, 0x10, 0xD0, 0xD4, 0x52, 0x5C, 0x5E, 0x4E, 0xFD, 0xE5, 0x04, 0x6E, 0x37,
+ 0xDE, 0x84, 0x55, 0x6A, 0xB4, 0xAA, 0xC3, 0x50, 0xCB, 0x36, 0x3D, 0x0F, 0x68, 0x26, 0x2D, 0xA0,
+ 0xBB, 0xC3, 0x58, 0x85, 0x37, 0xC3, 0xD5, 0xC2, 0x13, 0x17, 0x15, 0x59, 0x77, 0x4D, 0xEE, 0x44,
+ 0xC2, 0x1E, 0x37, 0x10, 0x44, 0xC3, 0xCD, 0xB5, 0x9C, 0xD7, 0xE2, 0x82, 0xA9, 0x77, 0x83, 0x83,
+ 0xCC, 0xB8, 0xC1, 0xB0, 0xD5, 0x2D, 0xE2, 0xC2, 0x0D, 0x1A, 0x40, 0xCE, 0xBF, 0x57, 0x33, 0x19,
+ 0xFF, 0xB7, 0x9C, 0xC2, 0xAF, 0x3B, 0x7A, 0x51, 0x16, 0x0B, 0x6C, 0xB1, 0x89, 0x49, 0x7D, 0x11,
+ 0x78, 0x79, 0x99, 0xAF, 0x68, 0xB9, 0xB7, 0xA8, 0xC2, 0x8C, 0xD4, 0x54, 0x2A, 0xCB, 0xC1, 0xFA,
+ 0xBA, 0x23, 0x18, 0x44, 0xFB, 0xF4, 0x0D, 0xA9, 0xBD, 0x93, 0x33, 0x55, 0x85, 0xC6, 0xD9, 0xE9,
+ 0xCA, 0x48, 0x4C, 0xBF, 0xA8, 0xA2, 0x19, 0x9C, 0x38, 0xFD, 0x3E, 0xA6, 0x83, 0x9A, 0xFC, 0x94,
+ 0xF7, 0xF7, 0xCC, 0xD5, 0x61, 0xED, 0x3C, 0x02, 0x8B, 0xF4, 0x4E, 0xAF, 0x8A, 0x34, 0xEA, 0x30,
+ 0x4F, 0x65, 0x1A, 0x79, 0x8B, 0x64, 0xAB, 0x9D, 0x3C, 0x90, 0x6B, 0x1D, 0x17, 0x9A, 0x05, 0x9D,
+ 0x11, 0xF6, 0xC1, 0x45, 0x86, 0x87, 0xC0, 0x79, 0xAB, 0x5D, 0x9B, 0x1F, 0xAA, 0x80, 0x7F, 0x7C,
+ 0x4C, 0xAD, 0x26, 0x47, 0x9B, 0xB8, 0x59, 0x79, 0x18, 0x61, 0xC7, 0x29, 0x28, 0xCA, 0xB5, 0xC4,
+ 0x5E, 0x18, 0xA4, 0x02, 0x91, 0x9C, 0xBB, 0x63, 0xBB, 0xBA, 0xCE, 0xBC, 0xC4, 0xB8, 0x65, 0xDA,
+ 0xC4, 0x33, 0xB2, 0x44, 0xDC, 0x26, 0xB9, 0x91, 0x34, 0xA4, 0x69, 0x03, 0x4B, 0x55, 0x12, 0xAB,
+ 0x5E, 0x20, 0x49, 0xFB, 0x3F, 0xA4, 0x68, 0x23, 0x0F, 0xDF, 0xB6, 0xA1, 0x56, 0x98, 0xDD, 0x8B,
+ 0xE7, 0x33, 0xFD, 0x5C, 0x80, 0x69, 0x6E, 0x2E, 0x81, 0xD4, 0x4A, 0x8F, 0x1A, 0xD2, 0x88, 0x8C,
+ 0x1A, 0xB7, 0x41, 0xB4, 0x93, 0x82, 0x4B, 0xC9, 0xED, 0xF0, 0xC7, 0x2F, 0x4B, 0xA4, 0xB3, 0xD5,
+ 0x70, 0x47, 0x3A, 0x6F, 0xBD, 0x45, 0x85, 0x4D, 0x91, 0xDA, 0x28, 0x83, 0x6C, 0xDF, 0x24, 0xD5,
+ 0xFC, 0x4A, 0xE2, 0xFD, 0xD5, 0xC2, 0x5F, 0xC3, 0x69, 0xF4, 0x2A, 0x19, 0xD2, 0x2B, 0x13, 0xC3,
+ 0x57, 0x0D, 0x29, 0xD6, 0x6D, 0xB1, 0x1B, 0xA8, 0x38, 0x72, 0xBC, 0x09, 0x4E, 0x6B, 0x22, 0xF0,
+ 0x89, 0x6C, 0x19, 0x7A, 0x61, 0x0C, 0xC8, 0xE5, 0xCD, 0x7A, 0xA8, 0x44, 0x15, 0xCF, 0x9A, 0x43,
+ 0xA7, 0xF4, 0x75, 0x0B, 0xD1, 0x60, 0x57, 0xF6, 0xF9, 0xE5, 0x18, 0xE8, 0x80, 0xCE, 0x07, 0x17,
+ 0x17, 0x25, 0x1E, 0xA1, 0x15, 0x8C, 0x77, 0x14, 0x4F, 0x4C, 0xA0, 0x22, 0x85, 0x13, 0x5F, 0x54,
+ 0x28, 0x98, 0x23, 0x5A, 0x95, 0xC1, 0xFB, 0x1F, 0x69, 0x4D, 0xD3, 0x4C, 0x48, 0xAC, 0xD1, 0xF1,
+ 0xC6, 0x24, 0xFE, 0x02, 0x15, 0xFE, 0x00, 0x22, 0x14, 0x4A, 0x67, 0x5E, 0xD3, 0xE4, 0x36, 0x6B,
+ 0x04, 0xCA, 0x98, 0xDA, 0x97, 0x9E, 0x52, 0x9E, 0xE5, 0x94, 0xAA, 0x87, 0xEE, 0xCB, 0x08, 0xC8,
+ 0xA7, 0x24, 0x46, 0xF2, 0x23, 0x62, 0xD1, 0x9C, 0xA7, 0x7F, 0xCC, 0x93, 0xC1, 0x58, 0xFF, 0xA8,
+ 0x17, 0xAF, 0x56, 0x28, 0x1D, 0x9F, 0xFB, 0x28, 0x95, 0xBE, 0x48, 0x30, 0xBB, 0xD4, 0x0B, 0x3F,
+ 0xF3, 0x53, 0x34, 0xFC, 0x50, 0x5F, 0x90, 0x89, 0x28, 0xFE, 0x4C, 0x7E, 0x08, 0xF9, 0x0C, 0x53,
+ 0xD8, 0x16, 0xF7, 0x44, 0x88, 0x17, 0xFD, 0xFD, 0x21, 0x0D, 0x52, 0xBF, 0xD8, 0x74, 0xD8, 0xCF,
+ 0x7E, 0xB8, 0x70, 0x8B, 0xA9, 0xBB, 0x5A, 0xC9, 0x75, 0xF2, 0xC0, 0xD3, 0xC5, 0xE0, 0x61, 0x7B,
+ 0xEF, 0xA5, 0x51, 0x70, 0x37, 0xA1, 0xB8, 0x09, 0xAC, 0xF0, 0xF7, 0x43, 0xD5, 0xE8, 0xB5, 0x7C,
+ 0xE5, 0xE7, 0x97, 0xC8, 0x20, 0x88, 0x53, 0xA3, 0x8F, 0x2F, 0x6B, 0xB4, 0xD2, 0xF9, 0x88, 0xDE,
+ 0x15, 0xE3, 0x88, 0xA6, 0x94, 0xC3, 0x51, 0xCE, 0xFF, 0x2F, 0xF5, 0x59, 0xB8, 0xB4, 0x49, 0x6A,
+ 0xAE, 0x6E, 0x8B, 0x63, 0x7B, 0x08, 0xB0, 0xD7, 0x00, 0x3A, 0xF6, 0xBF, 0x55, 0x63, 0xB1, 0x09,
+ 0x24, 0x14, 0x39, 0x56, 0x62, 0x18, 0x33, 0x64, 0x64, 0xEF, 0xAA, 0xA8, 0xC9, 0x38, 0x2A, 0xA2,
+ 0x70, 0x4A, 0x61, 0x66, 0x6F, 0xD7, 0x73, 0xF7, 0xF0, 0x8B, 0x34, 0xC4, 0x92, 0xD1, 0x63, 0xFC,
+ 0x05, 0xC6, 0xD4, 0xE4, 0x9B, 0x8F, 0x4E, 0x2A, 0x58, 0x2A, 0xA7, 0x7C, 0x47, 0x34, 0x01, 0xF3,
+ 0x5D, 0x0F, 0x99, 0xF3, 0x21, 0x86, 0xB7, 0x52, 0x8F, 0x06, 0x60, 0x1D, 0xC6, 0xBB, 0xC4, 0x5A,
+ 0x8F, 0x9B, 0x5E, 0x43, 0x4A, 0xA4, 0x2C, 0x1A, 0xAD, 0xB8, 0x74, 0x79, 0x2C, 0x2D, 0x3A, 0x31,
+ 0x21, 0x7F, 0x63, 0x91, 0x0C, 0xED, 0xFF, 0x33, 0xF4, 0x2D, 0x19, 0xB6, 0x83, 0xD3, 0x33, 0x7B,
+ 0xE7, 0x9C, 0xF1, 0x8E, 0xAF, 0x57, 0x91, 0x81, 0x3A, 0x86, 0x1D, 0xA8, 0xC4, 0x58, 0x78, 0xA8,
+ 0xE8, 0x34, 0xB9, 0xE6, 0x57, 0x89, 0x4E, 0xD3, 0x72, 0xD3, 0xD2, 0x09, 0x8C, 0xF1, 0x5B, 0xFB,
+ 0x64, 0xDB, 0xA5, 0x32, 0x17, 0x99, 0x65, 0x08, 0x31, 0xAD, 0x89, 0x64, 0x60, 0x60, 0xB8, 0xFE,
+ 0x77, 0xE5, 0x33, 0x80, 0xF8, 0x41, 0x75, 0xF0, 0xAE, 0x04, 0xB3, 0x49, 0x6C, 0x24, 0x33, 0xC8,
+ 0x7A, 0x09, 0x43, 0x6D, 0x0F, 0x88, 0xE6, 0xCD, 0x35, 0xA8, 0xF2, 0xBD, 0xEA, 0x39, 0xA6, 0x46,
+ 0xB5, 0x21, 0xD4, 0xC0, 0xF5, 0x91, 0xDD, 0x9C, 0x58, 0x68, 0x04, 0x99, 0x58, 0x1C, 0xC2, 0x03,
+ 0xED, 0x1D, 0xCA, 0x93, 0xBA, 0x18, 0x1D, 0xDD, 0xB4, 0xBB, 0xE2, 0x1E, 0x38, 0x59, 0x04, 0x5E,
+ 0x8E, 0xFF, 0x80, 0xEC, 0xBB, 0x57, 0xE4, 0xA8, 0x9F, 0x4D, 0xC3, 0xE5, 0x15, 0x71, 0x57, 0xDD,
+ 0x02, 0xB2, 0x67, 0x50, 0xD2, 0xDB, 0x95, 0xFF, 0x03, 0x2C, 0xDE, 0xE3, 0x78, 0x4F, 0xFE, 0xA9,
+ 0xAC, 0xE7, 0xE9, 0xC9, 0xA6, 0xB0, 0xCF, 0x98, 0x5E, 0xF7, 0xD7, 0x2C, 0x92, 0x78, 0x44, 0xB9,
+ 0xA0, 0x1A, 0xA4, 0x17, 0xA3, 0x50, 0x5E, 0x7E, 0x1A, 0x9F, 0x18, 0x3C, 0x53, 0x8A, 0xFC, 0x9C,
+ 0xF1, 0x58, 0x5D, 0xA3, 0xD5, 0x18, 0x6C, 0xC7, 0x55, 0x2F, 0x46, 0x5D, 0xFB, 0x33, 0x75, 0x50,
+ 0x0A, 0x28, 0x37, 0x99, 0xBD, 0x06, 0xAD, 0x14, 0x84, 0xB5, 0x9D, 0xDF, 0x04, 0x3F, 0x33, 0x28,
+ 0x1F, 0xD8, 0x57, 0xB7, 0x6A, 0x90, 0x18, 0xC7, 0xA6, 0x1B, 0x56, 0xD1, 0xBF, 0x22, 0x4E, 0x33,
+ 0x6A, 0x7F, 0x94, 0xB8, 0xA6, 0x0C, 0xA0, 0xE0, 0x7C, 0xD1, 0xEE, 0xDA, 0xFF, 0xE0, 0x9B, 0x41,
+ 0x75, 0xD7, 0xCA, 0x96, 0x01, 0xA9, 0xAA, 0xAD, 0x75, 0x54, 0xBA, 0x86, 0x14, 0xF1, 0x84, 0x66,
+ 0xC3, 0xC8, 0x66, 0x71, 0x63, 0x0D, 0x4A, 0x2C, 0x85, 0x4E, 0xD7, 0x6F, 0x9A, 0x59, 0x51, 0x8A,
+ 0xB6, 0xAF, 0xF5, 0x5F, 0x18, 0xA2, 0x49, 0xD0, 0x34, 0xD4, 0x51, 0xF9, 0x8D, 0xA3, 0x91, 0x59,
+ 0x7C, 0x87, 0x9D, 0x31, 0x14, 0xE0, 0xF0, 0x08, 0x95, 0x2C, 0x61, 0xCC, 0x53, 0xE2, 0x15, 0x9D,
+ 0xEE, 0xA1, 0xC2, 0xDE, 0x2B, 0x53, 0xB6, 0x21, 0x88, 0xE0, 0x5B, 0x77, 0x1F, 0x50, 0xEF, 0xFA,
+ 0xAA, 0x48, 0xCF, 0x97, 0x40, 0x3B, 0xC1, 0x82, 0x34, 0x6D, 0xAB, 0xB4, 0xAD, 0x5A, 0xE3, 0x99,
+ 0x78, 0xB6, 0xBD, 0x16, 0x34, 0x32, 0xC9, 0xA2, 0xC2, 0xA1, 0xAB, 0xB3, 0xFA, 0xA6, 0x62, 0x7D,
+ 0xB5, 0xF7, 0x89, 0xAD, 0x9A, 0xA9, 0x7E, 0x1C, 0x7F, 0x9C, 0x64, 0x30, 0x47, 0x9B, 0x6E, 0x48,
+ 0x62, 0x2C, 0xDE, 0x9A, 0xAF, 0x2A, 0xE2, 0xF1, 0x7B, 0xEA, 0xA2, 0xAA, 0x75, 0x3C, 0xB5, 0xB2,
+ 0xC5, 0x2F, 0x0F, 0x50, 0x36, 0x15, 0x12, 0x71, 0x48, 0x2A, 0xD2, 0x73, 0x02, 0xB3, 0xA8, 0xBE,
+ 0x24, 0x18, 0x79, 0xB0, 0xE0, 0x06, 0x07, 0x13, 0xE5, 0xF6, 0x32, 0x96, 0x9C, 0x88, 0x6B, 0xF0,
+ 0xFB, 0xA9, 0x04, 0x52, 0x18, 0x41, 0x91, 0x5D, 0x4C, 0xDC, 0x96, 0x35, 0x45, 0x85, 0x1D, 0x1C,
+ 0xDF, 0x28, 0xCA, 0x07, 0xC5, 0x27, 0x47, 0xF7, 0x30, 0x6D, 0xDF, 0x28, 0x12, 0xCA, 0x28, 0x31,
+ 0x71, 0x77, 0xCC, 0x35, 0x0A, 0x2E, 0x81, 0xEE, 0xD2, 0x6F, 0x01, 0x95, 0x5A, 0x97, 0x44, 0xCA,
+ 0x18, 0x69, 0xD9, 0xA0, 0xC8, 0x88, 0xF3, 0x2B, 0x7A, 0x7F, 0xFD, 0x5F, 0xA6, 0x42, 0x3D, 0x1A,
+ 0x36, 0x78, 0x4D, 0x1B, 0x56, 0x8F, 0x3A, 0xCB, 0x65, 0x77, 0x9E, 0x78, 0x03, 0xDE, 0xA9, 0xE6,
+ 0x0D, 0x06, 0xF6, 0x43, 0xC6, 0x94, 0xCB, 0x37, 0xEA, 0xC1, 0x97, 0x01, 0x69, 0x41, 0x6D, 0x55,
+ 0x7C, 0xC8, 0x9C, 0xD1, 0x4A, 0x66, 0x9E, 0x90, 0x03, 0xCA, 0x29, 0x53, 0x68, 0x0F, 0x69, 0x6C,
+ 0x7D, 0xEB, 0xAD, 0xD9, 0x1A, 0xA4, 0x46, 0xB4, 0x92, 0x9C, 0x42, 0x0E, 0x9F, 0x81, 0x29, 0xA2,
+ 0xDF, 0xB0, 0x2C, 0x4C, 0x32, 0xA2, 0x57, 0x25, 0x01, 0xB1, 0x9C, 0x12, 0x53, 0xC7, 0xF0, 0x0A,
+ 0x60, 0xA6, 0x51, 0xC9, 0x8F, 0xB4, 0x52, 0x20, 0x8A, 0x61, 0x17, 0x76, 0xA3, 0x85, 0xB9, 0x51,
+ 0x02, 0x0A, 0x2D, 0x81, 0x07, 0x90, 0x56, 0x96, 0xA7, 0xF9, 0x5A, 0x36, 0x6E, 0x2A, 0xA8, 0x7E,
+ 0xC1, 0xD8, 0x23, 0x0E, 0x81, 0xBA, 0x85, 0xDD, 0x60, 0x61, 0x28, 0xEF, 0x93, 0x4E, 0x12, 0x9B,
+ 0x1A, 0x0B, 0xC7, 0xEB, 0x7C, 0xE0, 0xEF, 0x24, 0xA1, 0x0A, 0x7D, 0x98, 0xB8, 0x55, 0xF9, 0x88,
+ 0x42, 0xA2, 0x69, 0xC5, 0x8C, 0x24, 0xE1, 0xA1, 0xA4, 0xDE, 0x34, 0x6E, 0x08, 0xFD, 0x1F, 0x25,
+ 0x0C, 0x94, 0xEF, 0x08, 0x62, 0x63, 0x75, 0x08, 0x3E, 0x71, 0xAF, 0xA6, 0xFA, 0x5D, 0x8E, 0xA8,
+ 0x37, 0x00, 0xB7, 0xDF, 0x4A, 0x4D, 0x6E, 0x92, 0x0A, 0x45, 0x02, 0xF8, 0xF0, 0x08, 0x77, 0x38,
+ 0x0C, 0x2B, 0xAE, 0x15, 0xF8, 0x40, 0x6C, 0x40, 0xCC, 0x08, 0x76, 0xB4, 0xD5, 0x92, 0x59, 0x49,
+ 0xA0, 0x98, 0xEC, 0x65, 0xCE, 0xCC, 0xAF, 0x8B, 0xC4, 0xA9, 0xE8, 0x2B, 0x23, 0x90, 0xC0, 0x19,
+ 0x12, 0x15, 0x23, 0xCE, 0xD4, 0x80, 0x22, 0x82, 0x30, 0x6A, 0x50, 0xFA, 0x6D, 0x3A, 0xBD, 0x4B,
+ 0xE1, 0x5B, 0x1A, 0x07, 0x88, 0x4E, 0xD0, 0x42, 0xA6, 0xFD, 0x5E, 0x3C, 0x7F, 0x53, 0x20, 0xDD,
+ 0x9C, 0x46, 0xEA, 0xE8, 0x8D, 0x6F, 0x17, 0x57, 0x41, 0x59, 0xEA, 0x27, 0xC7, 0x70, 0xFB, 0x12,
+ 0x2D, 0x6C, 0xF7, 0xEF, 0xA7, 0x6A, 0x5C, 0x15, 0x09, 0xE3, 0x63, 0xF1, 0x5B, 0xB8, 0xE4, 0x69,
+ 0x92, 0x7C, 0x13, 0x90, 0xBB, 0xA3, 0xE8, 0xF0, 0xC9, 0xF3, 0xD5, 0x27, 0xB7, 0xC4, 0x2B, 0xEB,
+ 0x66, 0x19, 0x36, 0x9B, 0x88, 0x88, 0xFD, 0xBA, 0x0F, 0x2E, 0x66, 0x98, 0x94, 0x3C, 0x6F, 0x09,
+ 0x0B, 0x89, 0x35, 0x3A, 0x8A, 0x8A, 0x7B, 0xA5, 0x1F, 0x9B, 0x9D, 0x53, 0x67, 0xEE, 0xBC, 0x8C,
+ 0x63, 0x83, 0x11, 0x31, 0x87, 0x24, 0x36, 0xBA, 0x7F, 0xC5, 0xA2, 0x06, 0x33, 0x10, 0x79, 0xEC,
+ 0x01, 0x89, 0x48, 0x96, 0x2A, 0xC9, 0x25, 0x0F, 0xF3, 0x92, 0x1E, 0x52, 0x93, 0xCD, 0x65, 0x71,
+ 0x2B, 0x98, 0xE7, 0xC8, 0x29, 0xA3, 0x21, 0x43, 0xF0, 0x37, 0x3C, 0x36, 0x8E, 0x7F, 0xDC, 0x95,
+ 0xA1, 0x56, 0xA1, 0x20, 0xA1, 0xBC, 0x5C, 0x30, 0xDE, 0x52, 0x54, 0xC8, 0x73, 0xCE, 0xA6, 0x30,
+ 0x44, 0x0F, 0x3F, 0xA0, 0x7B, 0x7E, 0x11, 0x66, 0x2E, 0xD6, 0xD8, 0x85, 0x5B, 0x56, 0xC1, 0xD3,
+ 0xEE, 0xF1, 0x7E, 0xBA, 0x08, 0xF1, 0xA4, 0x49, 0xB3, 0x0C, 0x41, 0xA3, 0xFC, 0xAF, 0xA6, 0x9E,
+ 0x90, 0x25, 0x44, 0xC2, 0x36, 0x64, 0x74, 0x38, 0xC9, 0xBC, 0xA5, 0xE8, 0x36, 0x2E, 0x84, 0xCD,
+ 0xEA, 0x22, 0x8A, 0x09, 0x94, 0xB2, 0x38, 0x67, 0xC3, 0xBD, 0x7C, 0x79, 0x12, 0x3D, 0xE2, 0xA0,
+ 0x0A, 0x1F, 0xCE, 0xE7, 0x1D, 0x7A, 0xB5, 0x2B, 0x4E, 0x62, 0x82, 0x37, 0xEC, 0xFB, 0x7B, 0x05,
+ 0xAC, 0xE5, 0x10, 0x60, 0x8B, 0x09, 0x7D, 0xC8, 0x16, 0xE0, 0xFA, 0x78, 0x35, 0x13, 0xF6, 0x8D,
+ 0xB0, 0x39, 0x5F, 0xC8, 0xF4, 0x08, 0xCF, 0x0D, 0xA9, 0xA1, 0xC6, 0xE0, 0xDC, 0x0A, 0x4D, 0x54,
+ 0x6C, 0x47, 0x16, 0xFD, 0x61, 0x08, 0xD3, 0x90, 0xC3, 0x4A, 0xD2, 0xE0, 0x7E, 0xE9, 0xB1, 0x62,
+ 0xBD, 0x15, 0x61, 0xB8, 0x6A, 0xF2, 0x76, 0x66, 0xBB, 0x5C, 0xB6, 0x87, 0x40, 0x8B, 0xFF, 0x90,
+ 0x1F, 0xB7, 0x63, 0xF3, 0x73, 0xF4, 0xE9, 0xEB, 0x96, 0xA9, 0x73, 0xA5, 0xF5, 0x94, 0x5E, 0x16,
+ 0x9B, 0xB1, 0x9F, 0x2F, 0x6B, 0x9D, 0x13, 0x6F, 0x01, 0xD6, 0xB6, 0x74, 0xA7, 0x86, 0x19, 0x82,
+ 0x6F, 0x50, 0x1A, 0x44, 0x5D, 0x47, 0xC5, 0xC5, 0x66, 0xEF, 0x24, 0xE3, 0xA8, 0x16, 0xD3, 0xEB,
+ 0x2B, 0x06, 0x54, 0xDB, 0x9B, 0x1F, 0xFE, 0x8D, 0x03, 0x1C, 0x63, 0x4C, 0xFA, 0x7E, 0xB8, 0x5A,
+ 0xA3, 0x50, 0x2D, 0xE1, 0x04, 0xE1, 0x15, 0x31, 0xF7, 0xB3, 0x23, 0xD7, 0x0E, 0x78, 0x42, 0x4D,
+ 0x28, 0x1F, 0xF2, 0x9D, 0xFC, 0x4A, 0xEC, 0xA1, 0xF2, 0x6E, 0x40, 0xA2, 0xD9, 0xEC, 0x67, 0xDB,
+ 0x81, 0x7C, 0xEA, 0x72, 0x38, 0xAF, 0xA2, 0x06, 0xCC, 0xAB, 0x22, 0xFA, 0x5C, 0xF9, 0xB7, 0x9D,
+ 0xE5, 0x35, 0x11, 0xE8, 0xB3, 0x01, 0xFB, 0xEF, 0xE8, 0xE4, 0x08, 0x36, 0xDB, 0xB3, 0x83, 0x8D,
+ 0xD0, 0xA9, 0xFD, 0xFB, 0x8A, 0x28, 0x60, 0xD3, 0xDC, 0x72, 0x52, 0x40, 0x97, 0x53, 0xBB, 0xA2,
+ 0xAF, 0x6F, 0x04, 0x2B, 0xBE, 0x8E, 0x16, 0x2D, 0x0E, 0x7C, 0x2A, 0xEB, 0xC1, 0xC8, 0x6E, 0x96,
+ 0x29, 0x1F, 0x64, 0x26, 0xFF, 0x89, 0xF3, 0x2D, 0xF2, 0x26, 0xF0, 0x74, 0x0F, 0x4D, 0x7F, 0x2F,
+ 0x61, 0x3C, 0xE9, 0x03, 0x43, 0x82, 0x24, 0x2F, 0x80, 0x42, 0x5D, 0xBE, 0xFA, 0x13, 0x06, 0x0F,
+ 0xA8, 0x82, 0x44, 0x04, 0x97, 0xC4, 0x21, 0x21, 0x4C, 0x4D, 0xB4, 0x37, 0xB3, 0x5D, 0xD8, 0xF7,
+ 0xDB, 0xC3, 0xC6, 0x21, 0x98, 0xF3, 0x11, 0x7A, 0x8D, 0xD9, 0xE3, 0xD9, 0x7F, 0xF6, 0xED, 0x44,
+ 0xCC, 0xCB, 0x2A, 0x2D, 0x22, 0x3C, 0x23, 0x64, 0x25, 0xA0, 0xCC, 0xDE, 0x99, 0x01, 0xE8, 0xCB,
+ 0xB4, 0xE6, 0x4D, 0xEB, 0x57, 0xEC, 0xDA, 0xB3, 0x9A, 0x7E, 0xF5, 0xCC, 0x9B, 0x9D, 0x3A, 0xC8,
+ 0xD4, 0xA9, 0x39, 0x7D, 0x6A, 0x63, 0xC7, 0x48, 0xFF, 0x8E, 0x36, 0x81, 0x8C, 0x2B, 0x8F, 0x1E,
+ 0x52, 0x42, 0xEE, 0x1C, 0xBB, 0xB9, 0xE9, 0xC5, 0xB9, 0x27, 0x47, 0xA7, 0x92, 0x39, 0x01, 0x3E,
+ 0x35, 0xA9, 0x6C, 0x47, 0x55, 0x46, 0x07, 0x28, 0x82, 0x5C, 0x0A, 0xC7, 0x07, 0x6A, 0xE0, 0x57,
+ 0x9F, 0x3C, 0x08, 0xDA, 0xA2, 0x5E, 0xE8, 0xA1, 0xBC, 0xB2, 0x4F, 0xD1, 0xB0, 0x2E, 0x71, 0xC2,
+ 0xAC, 0xA4, 0xF1, 0x8B, 0xE1, 0xF8, 0x30, 0xD6, 0x48, 0xBC, 0x79, 0x74, 0xF6, 0xC3, 0x3F, 0x83,
+ 0x75, 0xC4, 0xC5, 0x20, 0xED, 0x01, 0xB6, 0xA9, 0x3B, 0x22, 0xC0, 0x1F, 0xC2, 0x49, 0xF0, 0xA9,
+ 0x5F, 0x53, 0x6D, 0x6D, 0xB8, 0xE1, 0x6D, 0x9E, 0xE8, 0xD5, 0x45, 0x34, 0x69, 0x87, 0xF8, 0x42,
+ 0x78, 0x1A, 0xD0, 0x07, 0x6A, 0xC6, 0x9E, 0x56, 0xEB, 0xA6, 0xF6, 0x71, 0x88, 0x80, 0x3A, 0xDD,
+ 0xDC, 0xC4, 0x8E, 0xA3, 0x74, 0x6D, 0x10, 0xBA, 0x26, 0x98, 0xE1, 0x68, 0x49, 0x6A, 0x86, 0x0F,
+ 0x62, 0xA5, 0x75, 0x83, 0xD9, 0x5A, 0xD6, 0x34, 0x81, 0x65, 0x17, 0xA9, 0xD2, 0xF0, 0x35, 0x35,
+ 0x27, 0x9D, 0x81, 0x72, 0xAE, 0xA4, 0xC0, 0xFE, 0x09, 0x95, 0xFA, 0x3D, 0x78, 0xEA, 0x3D, 0xA5,
+ 0xA9, 0xB6, 0x4B, 0x91, 0xBA, 0x31, 0x44, 0xCD, 0xD6, 0x94, 0x7A, 0x38, 0x40, 0x75, 0xD6, 0x4C,
+ 0x6F, 0x30, 0x8A, 0x8E, 0xF6, 0x75, 0x50, 0x70, 0x17, 0x28, 0xED, 0x0B, 0xDF, 0xEB, 0x8B, 0x94,
+ 0x05, 0x9B, 0x85, 0x7A, 0xAA, 0xE7, 0x76, 0xE4, 0x5D, 0x9D, 0x2A, 0x02, 0x9A, 0x96, 0x70, 0xA4,
+ 0xC5, 0x4D, 0x90, 0x18, 0x5D, 0x31, 0x2E, 0x49, 0xFF, 0xA9, 0xBE, 0x9D, 0x9E, 0x7F, 0x6E, 0x0A,
+ 0x08, 0x04, 0x83, 0x43, 0xA1, 0x5B, 0x44, 0xA4, 0xAC, 0x66, 0xE1, 0x5A, 0xA3, 0x70, 0xED, 0x00,
+ 0x84, 0x53, 0x0E, 0x52, 0x22, 0x29, 0x3D, 0x14, 0x9D, 0x9C, 0x1C, 0xBC, 0x0A, 0x19, 0xC0, 0x7B,
+ 0xED, 0xBC, 0x4D, 0x15, 0x8B, 0xEC, 0x99, 0xF7, 0x68, 0x76, 0xCD, 0x3C, 0x11, 0x57, 0x28, 0x49,
+ 0xF1, 0x0F, 0x7F, 0x74, 0x24, 0x40, 0x05, 0x98, 0xFF, 0xF4, 0xE7, 0xB7, 0x84, 0xDB, 0x55, 0x09,
+ 0xD6, 0x0B, 0xE4, 0x5B, 0xF9, 0xFF, 0xB1, 0x2E, 0x25, 0x00, 0x3C, 0x9A, 0xEE, 0x1B, 0x24, 0x07,
+ 0x3C, 0xE1, 0xA9, 0xB1, 0x90, 0x44, 0x73, 0x1E, 0xD1, 0xFA, 0x00, 0x35, 0xF5, 0x79, 0xAB, 0xDE,
+ 0xB3, 0x5E, 0x62, 0x56, 0x0B, 0xCC, 0xA3, 0x49, 0x67, 0x44, 0x79, 0x85, 0x3A, 0x5D, 0x2B, 0x9D,
+ 0xA3, 0x57, 0x44, 0x97, 0x2A, 0x50, 0x34, 0xA9, 0x2F, 0x20, 0xE7, 0x58, 0x49, 0xF9, 0x54, 0x8F,
+ 0x9B, 0xE1, 0xCC, 0x44, 0xC2, 0x27, 0xBE, 0x60, 0xDD, 0x6E, 0x4D, 0xFB, 0xA8, 0xB7, 0x5E, 0xFA,
+ 0xBF, 0xDE, 0xF2, 0xB2, 0xDE, 0xF9, 0x55, 0x40, 0xD3, 0xB7, 0x63, 0x56, 0x74, 0x2D, 0x12, 0x37,
+ 0x2D, 0xD6, 0x7E, 0x84, 0x63, 0x3E, 0xAD, 0x44, 0x69, 0x58, 0x8D, 0xEE, 0x9A, 0xA2, 0xF7, 0xFD,
+ 0x90, 0x05, 0xD3, 0x52, 0x2C, 0x53, 0xFF, 0xA0, 0xC3, 0x42, 0xE9, 0x6E, 0x61, 0x68, 0xE9, 0x88,
+ 0x39, 0x35, 0xD7, 0xA0, 0x03, 0xDA, 0x49, 0x0E, 0x9C, 0x03, 0xE4, 0x87, 0x95, 0xA5, 0xD9, 0xD6,
+ 0x29, 0xA2, 0xFB, 0x63, 0x9E, 0xDE, 0x7C, 0x9E, 0x1E, 0xAF, 0x86, 0xC8, 0xD0, 0x27, 0x5E, 0xE1,
+ 0xD3, 0xC6, 0x3A, 0x60, 0xD8, 0x43, 0xD7, 0xDC, 0xFB, 0xC5, 0x72, 0xBF, 0xCF, 0xBD, 0x3A, 0x16,
+ 0xEF, 0x79, 0xC6, 0x3E, 0xB4, 0x27, 0x4C, 0x60, 0x2B, 0x4C, 0xAF, 0x44, 0x26, 0x1E, 0xAB, 0xEC,
+ 0xB2, 0xCE, 0xD6, 0xD1, 0x71, 0xFE, 0x8A, 0xE2, 0xA5, 0x6C, 0x53, 0x89, 0x84, 0x08, 0x8E, 0x79,
+ 0x41, 0xE7, 0xBB, 0x36, 0x8F, 0xFA, 0x81, 0xED, 0x6D, 0x7B, 0x4F, 0x4B, 0x52, 0xC9, 0x03, 0x83,
+ 0x65, 0xC4, 0xF3, 0x28, 0xC3, 0x44, 0x25, 0x85, 0x5D, 0x6D, 0x07, 0x38, 0xDE, 0xC3, 0x33, 0x6E,
+ 0x09, 0x16, 0x64, 0x3F, 0x2F, 0x8A, 0x22, 0x53, 0xEE, 0xDB, 0x1B, 0xF1, 0x41, 0xD2, 0xE5, 0x26,
+ 0xD2, 0xD5, 0x9F, 0x2B, 0x1E, 0x78, 0xFE, 0x81, 0x03, 0x68, 0x79, 0x7C, 0xEB, 0x3E, 0x71, 0xF0,
+ 0x64, 0x28, 0xA0, 0x3E, 0x54, 0x44, 0x2B, 0x56, 0x21, 0x11, 0xD6, 0xD7, 0x35, 0xB3, 0xFD, 0xC1,
+ 0xE5, 0xE6, 0x10, 0xB3, 0xCC, 0xD5, 0x24, 0x25, 0xE0, 0xF6, 0x1A, 0x0F, 0xF9, 0xD5, 0x34, 0x72,
+ 0x26, 0xD1, 0x9F, 0xFA, 0xFA, 0x41, 0x1C, 0x22, 0x97, 0x99, 0x16, 0x41, 0xA8, 0xDC, 0x3B, 0x59,
+ 0xC6, 0xB1, 0x9E, 0xB6, 0x10, 0xD1, 0xD3, 0x36, 0xC8, 0x12, 0x73, 0x4D, 0x7D, 0xD0, 0xFE, 0xF5,
+ 0x82, 0x0A, 0x4A, 0x20, 0x5C, 0xE1, 0x7F, 0x19, 0xFD, 0x1B, 0x34, 0x14, 0xE1, 0x8A, 0xDB, 0x01,
+ 0x9B, 0xF8, 0x68, 0x78, 0x2E, 0x9B, 0x6A, 0x3C, 0xF5, 0x86, 0x67, 0xF7, 0x6D, 0x92, 0xF3, 0xD6,
+ 0x00, 0x77, 0x6B, 0x5F, 0x60, 0x16, 0xE6, 0x41, 0xAB, 0xF6, 0x51, 0xC5, 0x0D, 0xF0, 0x96, 0x13,
+ 0xBB, 0x14, 0x82, 0x44, 0xD1, 0xCC, 0x86, 0xDE, 0xC1, 0x51, 0x88, 0xE3, 0x72, 0x02, 0x5B, 0x41,
+ 0xA2, 0x43, 0x0E, 0xEC, 0x3B, 0xEE, 0xAB, 0xB7, 0xEE, 0xAC, 0xCA, 0x84, 0x71, 0x3F, 0x9F, 0xB7,
+ 0x59, 0x4F, 0x7B, 0x2C, 0x76, 0x10, 0xF1, 0xF8, 0xDC, 0x88, 0x8D, 0x03, 0x76, 0x6D, 0x1D, 0x4B,
+ 0x98, 0x08, 0x74, 0x1D, 0x2E, 0xD5, 0xFC, 0xF3, 0x68, 0x27, 0xB3, 0xA1, 0x89, 0x26, 0x5E, 0x8D,
+ 0x5C, 0xE4, 0x86, 0x9B, 0x10, 0xF0, 0x86, 0xC3, 0xE0, 0x76, 0xFF, 0x8B, 0x8C, 0x39, 0x32, 0x4E,
+ 0xF8, 0xF3, 0x86, 0xE6, 0x0C, 0x6A, 0x00, 0xEB, 0x7F, 0xBD, 0xDE, 0x7F, 0x0C, 0x80, 0xBA, 0x8B,
+ 0xEA, 0x8D, 0x20, 0xCB, 0x86, 0x81, 0x1B, 0x44, 0x49, 0x65, 0xD1, 0xFA, 0x12, 0xD8, 0x1B, 0xD7,
+ 0x6D, 0xA7, 0xF6, 0x53, 0x19, 0x8D, 0x9A, 0x04, 0x34, 0xB2, 0x15, 0xDD, 0xE7, 0x46, 0x75, 0xAA,
+ 0x90, 0xEC, 0x41, 0x9C, 0x93, 0xBA, 0xFD, 0xFE, 0x08, 0xFD, 0x86, 0x73, 0x7C, 0x93, 0xB6, 0xD0,
+ 0x3E, 0x16, 0x82, 0x05, 0x01, 0xC4, 0xBE, 0x9C, 0x24, 0x05, 0x94, 0x53, 0x25, 0xBD, 0x67, 0x48,
+ 0x7C, 0x66, 0xDC, 0xB6, 0x9D, 0x28, 0x26, 0x22, 0xFA, 0x5D, 0xF6, 0x39, 0x31, 0x1D, 0xDA, 0xAA,
+ 0x1A, 0x04, 0x40, 0x33, 0x67, 0xA5, 0x97, 0x48, 0xB1, 0x06, 0xFB, 0x9A, 0xEC, 0xF0, 0x04, 0x5F,
+ 0x11, 0x26, 0x23, 0x93, 0x90, 0x48, 0x72, 0x92, 0xBD, 0xB8, 0xA6, 0xD1, 0xEE, 0x70, 0xFD, 0xB8,
+ 0x53, 0x91, 0x62, 0xC1, 0x48, 0x0D, 0x70, 0xBB, 0xCD, 0xD4, 0xC3, 0xA1, 0x3D, 0x24, 0x42, 0x59,
+ 0xD6, 0x3B, 0xA0, 0xD0, 0xAC, 0x89, 0x07, 0x45, 0x66, 0xC9, 0x1D, 0xBF, 0x66, 0xC4, 0xF9, 0x5D,
+ 0x90, 0x3D, 0x84, 0x10, 0x62, 0x21, 0x37, 0x78, 0x8D, 0x27, 0xF2, 0x01, 0xA8, 0xD0, 0x2E, 0x81,
+ 0xA0, 0xDB, 0x8D, 0x89, 0x78, 0x10, 0xBB, 0x49, 0x60, 0xA0, 0x50, 0x11, 0x6B, 0x04, 0xF3, 0x2E,
+ 0x41, 0xBF, 0x00, 0xC4, 0xFA, 0xA8, 0x3B, 0x93, 0x9C, 0x90, 0x29, 0xD6, 0xBD, 0xC4, 0xE9, 0x26,
+ 0xE2, 0xDB, 0xE8, 0x7E, 0xD6, 0xA7, 0xE7, 0x55, 0x61, 0x5E, 0x46, 0x82, 0x32, 0x8D, 0xD4, 0x96,
+ 0xF5, 0x6B, 0xB3, 0x1D, 0x18, 0xA9, 0xAA, 0x8A, 0x22, 0x49, 0xF7, 0xB7, 0x36, 0xF7, 0xD0, 0x96,
+ 0x2E, 0xC6, 0x73, 0x99, 0x93, 0x63, 0x12, 0x18, 0xF3, 0x82, 0x50, 0xE1, 0x96, 0x1B, 0x7E, 0xA9,
+ 0x29, 0xFF, 0xFA, 0x75, 0x07, 0x82, 0x7D, 0x94, 0x4C, 0x2D, 0xCC, 0x06, 0xAD, 0x41, 0xF3, 0xB5,
+ 0xF3, 0x6E, 0xAD, 0x8A, 0xDD, 0x7B, 0x7F, 0xE4, 0x7D, 0x58, 0xA8, 0x6D, 0x7C, 0xED, 0x9C, 0x1B,
+ 0x63, 0x94, 0xD6, 0x81, 0x43, 0x1B, 0x8C, 0x1B, 0x7F, 0xB9, 0x1C, 0xB4, 0xD5, 0xB7, 0xBD, 0xED,
+ 0xAA, 0x8D, 0xE4, 0x06, 0xE8, 0x88, 0xDB, 0xB5, 0xCB, 0xE9, 0xA5, 0x30, 0xA6, 0xD9, 0xA0, 0x99,
+ 0x5F, 0x53, 0xC5, 0x9E, 0x4E, 0x29, 0xBB, 0xE5, 0xC5, 0xA4, 0xD9, 0x99, 0x86, 0xF1, 0x11, 0xE1,
+ 0x4A, 0x5D, 0xCB, 0xD4, 0xF4, 0xBC, 0x66, 0x87, 0x33, 0x93, 0x76, 0xBC, 0x10, 0x4E, 0xC1, 0xB3,
+ 0x0B, 0x00, 0xF5, 0x0C, 0x57, 0x9A, 0xC5, 0x30, 0x45, 0xCC, 0xDE, 0x08, 0xF0, 0x1C, 0x4C, 0x6D,
+ 0xA9, 0xD8, 0x6C, 0x65, 0x7A, 0xC5, 0x0A, 0xE2, 0x0A, 0x47, 0xB4, 0x2F, 0x82, 0x0A, 0x8B, 0x12,
+ 0xF5, 0xF5, 0xC4, 0x08, 0x17, 0x89, 0x4B, 0xEB, 0x11, 0x9E, 0x1F, 0x2E, 0x2A, 0x24, 0xDF, 0x15,
+ 0xC0, 0x1B, 0x04, 0xCE, 0x07, 0x10, 0xB5, 0x26, 0x81, 0xC4, 0x4C, 0xA5, 0x14, 0x5B, 0x17, 0x57,
+ 0x38, 0x61, 0xF9, 0x2A, 0x25, 0x0E, 0x51, 0x15, 0x5B, 0xEB, 0x85, 0xFE, 0xAA, 0x3E, 0xB6, 0x10,
+ 0x6E, 0x20, 0xAF, 0xAC, 0xFA, 0xE7, 0x86, 0xFF, 0x96, 0xA9, 0xB3, 0xB7, 0x86, 0xAC, 0x2C, 0x53,
+ 0xD9, 0x0A, 0x7A, 0x01, 0xE1, 0x58, 0xBD, 0x8C, 0x7C, 0xB0, 0x7F, 0xBB, 0x70, 0x9B, 0xE1, 0x9A,
+ 0xB8, 0x0E, 0x5D, 0xC9, 0x5D, 0x90, 0xBE, 0x2F, 0x94, 0xCE, 0x2E, 0x28, 0xFB, 0x09, 0xF8, 0xC0,
+ 0x11, 0x31, 0x2F, 0xE2, 0xFF, 0xE1, 0x63, 0xE8, 0x58, 0xB9, 0x4D, 0x27, 0x02, 0x7A, 0x05, 0xF0,
+ 0x61, 0x70, 0x34, 0xAA, 0xB6, 0xCC, 0xA1, 0xB8, 0xC3, 0x53, 0xAE, 0x1B, 0x0D, 0xB6, 0x2B, 0x3D,
+ 0x84, 0x5A, 0xC4, 0x12, 0xDF, 0x6C, 0x60, 0x73, 0x28, 0xE1, 0x07, 0xFF, 0x2C, 0x04, 0xE8, 0xF1,
+ 0x86, 0xCE, 0x38, 0x1E, 0xDE, 0x06, 0x14, 0x59, 0x2A, 0x91, 0x24, 0x6C, 0x72, 0x7A, 0xB6, 0x2A,
+ 0x1A, 0x74, 0xB6, 0x5F, 0x88, 0xE3, 0xC0, 0xC9, 0x28, 0xDE, 0xE5, 0x4B, 0x08, 0x7F, 0xD1, 0x75,
+ 0x2D, 0xF6, 0x9E, 0x91, 0x8D, 0xF0, 0x79, 0x6A, 0x0C, 0xA2, 0x19, 0xD4, 0xDE, 0xE6, 0x45, 0xFC,
+ 0x66, 0xA0, 0xB8, 0x24, 0x1D, 0x88, 0xDD, 0x31, 0x2C, 0x99, 0x02, 0x86, 0xC7, 0xF7, 0xA9, 0xFF,
+ 0x19, 0x61, 0x2E, 0xFA, 0xCE, 0xD2, 0x46, 0xD5, 0x89, 0xD1, 0xBC, 0x3E, 0x03, 0x21, 0x13, 0x14,
+ 0x65, 0x1C, 0x15, 0x54, 0xAB, 0x22, 0xA0, 0x52, 0xEA, 0xEC, 0xB5, 0x8D, 0x7B, 0xC7, 0xFC, 0x9A,
+ 0x1C, 0x30, 0x1D, 0x50, 0x6A, 0xB6, 0xA4, 0x0F, 0x57, 0xE4, 0x6B, 0xBD, 0x69, 0x79, 0xF8, 0x75,
+ 0x43, 0xBE, 0xDC, 0x5C, 0xAD, 0xC0, 0xB8, 0xEF, 0xF1, 0x57, 0xB7, 0xEE, 0xAB, 0xBA, 0x94, 0xBD,
+ 0xEE, 0x62, 0x0C, 0x99, 0xC8, 0xC1, 0x7C, 0x07, 0xCE, 0xE0, 0x51, 0x34, 0x67, 0x8D, 0xFD, 0x89,
+ 0x7E, 0xFD, 0x56, 0xBC, 0xD1, 0x3E, 0x4C, 0x30, 0x11, 0xA4, 0x2C, 0x4E, 0x98, 0xA3, 0xAC, 0xD4,
+ 0x34, 0xE4, 0xD2, 0x30, 0xA5, 0xC6, 0xD5, 0xBE, 0xE9, 0x93, 0x20, 0x2E, 0xD0, 0xD3, 0x27, 0x6C,
+ 0x18, 0xB3, 0xE4, 0x38, 0x09, 0x93, 0x49, 0xE7, 0xB3, 0x25, 0xDF, 0x5F, 0x80, 0x36, 0xC4, 0x74,
+ 0x03, 0x3B, 0x12, 0x0C, 0x4E, 0xA3, 0x79, 0x42, 0x15, 0xC8, 0x7D, 0xE3, 0xCD, 0xED, 0x30, 0x3F,
+ 0x23, 0x11, 0x15, 0x37, 0xB5, 0x03, 0x04, 0x1D, 0xD3, 0x9E, 0x6B, 0x68, 0x78, 0xE7, 0xBF, 0xB6,
+ 0x3D, 0x89, 0x21, 0xF9, 0xAA, 0xC4, 0xD7, 0x54, 0x17, 0xD6, 0xF3, 0x3E, 0xDC, 0xE9, 0xB3, 0x87,
+ 0xA0, 0x3B, 0x6A, 0x54, 0xB0, 0x6D, 0x9E, 0xB0, 0xC2, 0x48, 0xA7, 0xE9, 0x29, 0xEB, 0xDF, 0x88,
+ 0xE6, 0x9F, 0x4B, 0x83, 0xAF, 0x29, 0x4F, 0x30, 0x62, 0x37, 0xC5, 0x23, 0xFB, 0x19, 0x08, 0x1D,
+ 0xFF, 0xA3, 0x19, 0xB2, 0xEB, 0xBF, 0x68, 0x88, 0xBC, 0x1F, 0x9A, 0xE5, 0x2A, 0x24, 0x46, 0xC0,
+ 0x87, 0x82, 0x7F, 0x49, 0x7F, 0x71, 0x50, 0x69, 0xD6, 0x57, 0x27, 0x58, 0x64, 0xFD, 0x06, 0xB8,
+ 0x05, 0x5D, 0x74, 0xD0, 0x33, 0xFC, 0x5A, 0x34, 0x6F, 0x1E, 0xB3, 0x0E, 0xFE, 0x6B, 0x27, 0xCE,
+ 0x3A, 0x51, 0x2D, 0xF5, 0x48, 0x4C, 0x27, 0x36, 0x26, 0x87, 0xE7, 0x3B, 0xB6, 0x64, 0x95, 0x5C,
+ 0x73, 0x3D, 0xD4, 0x2C, 0x4C, 0x03, 0x02, 0x9F, 0x0E, 0xBD, 0xF0, 0xA3, 0x4C, 0xE6, 0xC9, 0xE1,
+ 0xBE, 0x4C, 0x1A, 0xBD, 0xE8, 0x39, 0x75, 0xEC, 0xAA, 0x0A, 0x3D, 0xED, 0x77, 0x57, 0x44, 0x92,
+ 0xF3, 0xE6, 0x86, 0xFA, 0x11, 0x75, 0x7C, 0xA2, 0x1A, 0xF3, 0x36, 0x95, 0xA5, 0xE4, 0xAB, 0x77,
+ 0x8A, 0xA5, 0xCF, 0x72, 0xAB, 0x7B, 0xBC, 0xB7, 0x4F, 0x9A, 0xB3, 0xD6, 0xE6, 0xA7, 0x76, 0x8E,
+ 0x44, 0xD3, 0x4B, 0x2D, 0xC7, 0xC9, 0xCA, 0x1C, 0xE4, 0x94, 0x86, 0x60, 0xF9, 0x9E, 0xEC, 0xA9,
+ 0xD8, 0x47, 0xF1, 0xAB, 0xD7, 0x08, 0x89, 0x63, 0xA4, 0x1D, 0x6C, 0xC7, 0xCC, 0x62, 0xB5, 0xC6,
+ 0x92, 0x1C, 0x12, 0x49, 0x3E, 0x35, 0x01, 0x44, 0x64, 0x3F, 0xEC, 0x73, 0x79, 0x88, 0xC2, 0x57,
+ 0x34, 0x41, 0x49, 0x9D, 0xF6, 0xE9, 0x4D, 0xCC, 0xE1, 0x96, 0xCF, 0x21, 0xA6, 0xFA, 0x9E, 0x1C,
+ 0xDC, 0x6A, 0x0A, 0x97, 0x46, 0x9A, 0x4B, 0x97, 0x7C, 0x24, 0x10, 0x85, 0x83, 0xE7, 0x17, 0x36,
+ 0xB9, 0xE6, 0x5D, 0xA0, 0x56, 0xAD, 0xBE, 0xB5, 0x8B, 0x30, 0xD0, 0xC0, 0x67, 0x0E, 0x7D, 0x85,
+ 0xD1, 0x8A, 0x3B, 0x9F, 0xF4, 0x63, 0x67, 0xC1, 0x37, 0xEC, 0xFF, 0x5F, 0x61, 0x4A, 0x98, 0xDC,
+ 0xF4, 0x01, 0x59, 0x5F, 0xBC, 0xF0, 0x7D, 0x3A, 0xD3, 0x2F, 0x19, 0x4F, 0xB1, 0x85, 0x18, 0x3D,
+ 0x4F, 0x99, 0xA0, 0x61, 0x3B, 0x7C, 0x56, 0x56, 0x00, 0x5C, 0x4E, 0xD9, 0x49, 0x66, 0xDF, 0xF5,
+ 0x28, 0xA3, 0x83, 0x9E, 0xAA, 0xC7, 0x6D, 0xE1, 0xF6, 0xEB, 0x7D, 0x61, 0xFF, 0xFA, 0xDC, 0x26,
+ 0x46, 0x69, 0x66, 0x77, 0x2B, 0x68, 0xA9, 0x63, 0xD0, 0x55, 0xA1, 0xFF, 0xFB, 0xC6, 0x87, 0xF1,
+ 0x01, 0x83, 0x4D, 0x1D, 0xD6, 0x26, 0x51, 0x36, 0x7F, 0x85, 0x73, 0xF7, 0x77, 0xD5, 0x03, 0xCF,
+ 0x76, 0x40, 0xA9, 0xDC, 0x7C, 0x03, 0xFE, 0x59, 0x8C, 0xF7, 0x93, 0x64, 0x7A, 0x0E, 0xA3, 0xB6,
+ 0x6B, 0xAD, 0xBD, 0xD3, 0xB0, 0x43, 0xC6, 0xCA, 0x9D, 0x10, 0x04, 0x96, 0xB1, 0xCE, 0xEF, 0x1B,
+ 0x8D, 0xE2, 0x67, 0x20, 0x4F, 0x96, 0x2E, 0x6C, 0x6D, 0x21, 0xEC, 0x74, 0x0F, 0x23, 0xAE, 0x60,
+ 0x92, 0xB6, 0x19, 0x51, 0xFF, 0x96, 0xA9, 0xC5, 0xF1, 0x04, 0x50, 0x02, 0xCE, 0xB1, 0x5E, 0x83,
+ 0x06, 0x5C, 0x41, 0xB5, 0x2E, 0xBE, 0xDE, 0xB7, 0x39, 0x4C, 0x22, 0xBB, 0x92, 0x4C, 0x74, 0x76,
+ 0x9C, 0xDD, 0xE8, 0xF4, 0xDF, 0xFF, 0xD3, 0x8F, 0x4D, 0xE8, 0xAF, 0xEA, 0xA1, 0xEC, 0x02, 0x32,
+ 0x37, 0xF0, 0xD5, 0xA4, 0x0A, 0x4C, 0x1C, 0x60, 0xE6, 0x95, 0x84, 0x9C, 0xF8, 0xC0, 0x16, 0x7B,
+ 0x88, 0xE6, 0x97, 0x82, 0x0C, 0x6A, 0xEC, 0xE5, 0x8C, 0x9B, 0xFF, 0x96, 0x6D, 0xD5, 0x04, 0xE7,
+ 0x59, 0xD0, 0xB0, 0xCE, 0x6F, 0x9D, 0xBB, 0x7E, 0x09, 0x82, 0xDD, 0xC0, 0xE5, 0x37, 0xB9, 0x07,
+ 0xF0, 0x6E, 0xBA, 0x8C, 0x19, 0x77, 0xA4, 0x21, 0xCB, 0xE1, 0xFA, 0x14, 0xC2, 0x68, 0xBF, 0x86,
+ 0xC0, 0xEE, 0xB3, 0xED, 0x17, 0x8D, 0x99, 0x70, 0x01, 0x61, 0xBF, 0x92, 0x18, 0xA9, 0x2C, 0xEE,
+ 0x94, 0xB4, 0x88, 0x35, 0x21, 0x56, 0xD1, 0x02, 0xA8, 0xC4, 0x12, 0x34, 0x69, 0x7E, 0x1A, 0xFC,
+ 0x64, 0x66, 0x32, 0x8E, 0xA4, 0x1C, 0xB9, 0xDD, 0x37, 0xF0, 0x52, 0xC6, 0x76, 0x5A, 0xEA, 0x4F,
+ 0x49, 0xD3, 0x1C, 0x83, 0x90, 0x96, 0x35, 0x67, 0x65, 0x38, 0x86, 0xE2, 0x45, 0xA9, 0xC4, 0x07,
+ 0x59, 0xAE, 0xCC, 0xD5, 0xDD, 0x88, 0xDE, 0xF2, 0x52, 0xD9, 0x88, 0x02, 0x10, 0x13, 0x62, 0x8C,
+ 0x5A, 0x32, 0x76, 0x80, 0x31, 0xD0, 0xF2, 0x91, 0x22, 0x51, 0x26, 0x3C, 0xD6, 0xA4, 0x1A, 0x61,
+ 0x5A, 0xB2, 0x7D, 0xE7, 0xCD, 0x71, 0x0B, 0x28, 0xB2, 0x3F, 0xA6, 0x38, 0xDC, 0xD9, 0x61, 0xD0,
+ 0xE5, 0xC8, 0x0F, 0xF1, 0xC9, 0x04, 0x09, 0x4A, 0x9F, 0x91, 0x7C, 0xEA, 0x88, 0x74, 0xC0, 0x32,
+ 0xB2, 0xCE, 0xBB, 0xA7, 0xE1, 0x95, 0x4E, 0xEF, 0xA0, 0x6F, 0xE0, 0x75, 0xC3, 0x9F, 0x44, 0x02,
+ 0xF1, 0x06, 0x0B, 0xFD, 0xC8, 0x11, 0x0B, 0xCB, 0xCF, 0x19, 0xE1, 0x64, 0xDE, 0x8D, 0xEE, 0x97,
+ 0x37, 0x48, 0x5F, 0xF6, 0xE7, 0xCE, 0x5C, 0x7A, 0xB7, 0xC6, 0xAB, 0x4F, 0x9A, 0x33, 0x2C, 0xBF,
+ 0x7A, 0x2F, 0xEE, 0x28, 0x90, 0xD6, 0x6E, 0x8A, 0x6D, 0xE0, 0xDE, 0x0E, 0x2B, 0x2B, 0xE1, 0x36,
+ 0xBA, 0xD6, 0xE7, 0x1A, 0x3C, 0x2F, 0x34, 0xF3, 0x39, 0xE2, 0x22, 0x33, 0x91, 0xEB, 0xFF, 0x1C,
+ 0x00, 0x09, 0x82, 0xFE, 0xAB, 0x1E, 0x1F, 0x40, 0x5E, 0x05, 0xF5, 0x6B, 0xCD, 0x52, 0xAB, 0xEA,
+ 0x52, 0x91, 0x23, 0x26, 0x91, 0x6F, 0xEF, 0xA3, 0x46, 0x70, 0xD9, 0x00, 0x79, 0xE6, 0x06, 0x2F,
+ 0x31, 0x2A, 0x35, 0x5F, 0x29, 0xDA, 0x7A, 0xF6, 0xE2, 0x5B, 0xFA, 0x50, 0x5F, 0x27, 0xD9, 0x5E,
+ 0x3D, 0x72, 0x2C, 0xE5, 0x6F, 0x6C, 0xFA, 0x73, 0x2D, 0x5C, 0x02, 0xFF, 0x64, 0xF7, 0xBB, 0xC0,
+ 0x4D, 0x72, 0xCD, 0x3A, 0x68, 0xA8, 0xD0, 0xD4, 0xB4, 0x36, 0x25, 0x4D, 0xD2, 0xF2, 0x72, 0x2E,
+ 0x29, 0x6A, 0x5C, 0xAE, 0x53, 0x36, 0x26, 0x24, 0x2D, 0x40, 0x7B, 0xE2, 0x95, 0xB1, 0x38, 0xCC,
+ 0x98, 0xC3, 0xCA, 0xFD, 0xD2, 0x14, 0x20, 0x67, 0x69, 0xFE, 0xA8, 0x3F, 0xE7, 0xA4, 0xF5, 0x12,
+ 0x72, 0x45, 0x35, 0x09, 0xFB, 0x41, 0x5E, 0xF7, 0x14, 0xC7, 0x6B, 0xF6, 0x14, 0x1B, 0x3D, 0xB6,
+ 0x30, 0xE2, 0x9E, 0xDA, 0xCE, 0x71, 0xF1, 0x7E, 0xAB, 0xD6, 0xE3, 0xFE, 0x81, 0xFB, 0x0B, 0x46,
+ 0xDB, 0x92, 0xBF, 0x0C, 0x78, 0x48, 0x26, 0xD7, 0x06, 0xD2, 0x25, 0x24, 0x07, 0x94, 0xBD, 0x4B,
+ 0x1F, 0xC4, 0x97, 0x13, 0x45, 0xD3, 0x34, 0x7C, 0x6B, 0x6F, 0x2A, 0xD7, 0x4B, 0x2C, 0xF3, 0x4D,
+ 0x30, 0x8E, 0x6F, 0x08, 0x59, 0x23, 0xAD, 0x3C, 0xE0, 0xF8, 0xF1, 0xC5, 0x6D, 0xF2, 0xB2, 0x8C,
+ 0x1B, 0xB4, 0x0D, 0x06, 0xAE, 0xBC, 0x9A, 0x26, 0xE8, 0x1B, 0xB1, 0x69, 0x57, 0xE9, 0x61, 0x9A,
+ 0xDF, 0xF2, 0xEA, 0x46, 0xC8, 0x1D, 0x49, 0xA1, 0x0F, 0x7A, 0x0D, 0xFC, 0xC7, 0x45, 0xC5, 0x8B,
+ 0xBC, 0xF7, 0x0B, 0x7E, 0x27, 0x60, 0x42, 0xD5, 0x5C, 0x7F, 0x99, 0x77, 0x57, 0x3A, 0x9F, 0x7B,
+ 0xC2, 0xE1, 0xDF, 0x96, 0xD4, 0x70, 0x25, 0x5A, 0xBB, 0xC0, 0xEC, 0xB4, 0xC6, 0x93, 0x21, 0x29,
+ 0x96, 0xEC, 0x47, 0x41, 0x6C, 0xE3, 0x60, 0xFC, 0x40, 0x7F, 0x47, 0x1D, 0x8A, 0x19, 0x2C, 0xE9,
+ 0x10, 0x1B, 0x3B, 0x1A, 0x35, 0x29, 0xE4, 0xA6, 0xBC, 0x6B, 0x35, 0x37, 0xF5, 0x39, 0xCD, 0x03,
+ 0x4E, 0x9A, 0x88, 0xF8, 0x88, 0xE1, 0x20, 0x6A, 0xA2, 0x77, 0xD0, 0xF0, 0x82, 0x3E, 0x23, 0x95,
+ 0x1C, 0x72, 0x06, 0xF6, 0x08, 0x0A, 0x79, 0x0C, 0x96, 0x0B, 0x6A, 0x19, 0x13, 0x66, 0x3F, 0xA3,
+ 0xC4, 0xBB, 0x63, 0x21, 0x8E, 0x83, 0xF9, 0x61, 0x82, 0xC5, 0x0E, 0x47, 0x79, 0x9C, 0x09, 0x7C,
+ 0xD2, 0xEE, 0x52, 0x06, 0xDA, 0xAF, 0x4A, 0x69, 0xAA, 0x8C, 0xA1, 0x74, 0x33, 0x7E, 0x58, 0x0A,
+ 0x5C, 0xA9, 0x08, 0x8A, 0x9F, 0x89, 0x3D, 0x72, 0xC4, 0x6B, 0x26, 0xED, 0xCB, 0x46, 0xFA, 0x0A,
+ 0x5C, 0x6E, 0x3C, 0x66, 0x36, 0xC7, 0x5B, 0xEF, 0xCE, 0x59, 0x9F, 0xF1, 0x41, 0xED, 0xA5, 0x70,
+ 0x97, 0xF4, 0xD7, 0xB5, 0x56, 0xFC, 0xBC, 0x50, 0xB6, 0xB4, 0x61, 0xED, 0x8E, 0x5E, 0xF0, 0x50,
+ 0xF0, 0x96, 0xF7, 0x81, 0xAD, 0xE2, 0x8C, 0xA7, 0xB8, 0xC7, 0x17, 0xD5, 0x0C, 0x80, 0xB7, 0x7B,
+ 0xA4, 0xD9, 0x89, 0x04, 0xF2, 0x7B, 0xF8, 0x89, 0x8F, 0x58, 0x8B, 0x88, 0xEF, 0x6E, 0x9A, 0xCB,
+ 0x67, 0xBA, 0x32, 0xA7, 0x68, 0x92, 0x0A, 0xD7, 0xC9, 0xB9, 0x8B, 0xE6, 0x44, 0x0C, 0x38, 0x39,
+ 0x14, 0xBF, 0x0C, 0xE4, 0x68, 0x13, 0xB2, 0x2A, 0x0D, 0x2E, 0xA8, 0x53, 0x46, 0x3D, 0xF5, 0xC6,
+ 0x67, 0x8B, 0x2C, 0x50, 0x94, 0xD5, 0x4A, 0xB3, 0xDA, 0xB0, 0x1F, 0xDD, 0x17, 0xED, 0xF9, 0xF5,
+ 0xDB, 0x1F, 0x96, 0x33, 0xE9, 0x81, 0x28, 0x86, 0x04, 0xAA, 0x0E, 0xEF, 0x8B, 0x6D, 0xE0, 0xA2,
+ 0x26, 0x34, 0xFF, 0x6D, 0xFE, 0x57, 0xB1, 0x0A, 0xE7, 0xE5, 0x7D, 0xD4, 0x13, 0xEF, 0xC8, 0xDC,
+ 0xFE, 0xFA, 0x0A, 0xF7, 0x34, 0x75, 0x37, 0xDC, 0xA3, 0x96, 0xDA, 0x18, 0x75, 0xA3, 0x2D, 0x93,
+ 0xD4, 0x2F, 0xD7, 0xDE, 0x4B, 0xA2, 0x9C, 0x6A, 0x15, 0x36, 0xC5, 0x1F, 0x69, 0x82, 0x0C, 0x65,
+ 0x8C, 0x5E, 0x96, 0x07, 0xF7, 0x5D, 0x7B, 0x22, 0x7C, 0xAB, 0x0D, 0x91, 0xD7, 0xAC, 0xB4, 0x9F,
+ 0x46, 0x82, 0x81, 0xF8, 0xCC, 0xA6, 0x88, 0x6D, 0xEA, 0x36, 0xB3, 0x0B, 0xA7, 0xC8, 0xB6, 0xBD,
+ 0xC8, 0x74, 0x26, 0x09, 0x57, 0xE4, 0xBD, 0x39, 0x86, 0xD9, 0xED, 0x2A, 0xA9, 0x77, 0x6B, 0xD3,
+ 0x77, 0xF9, 0x92, 0xEB, 0x1C, 0xF1, 0xB8, 0x97, 0xBD, 0x8E, 0xCB, 0xCB, 0xF7, 0x1A, 0xBC, 0x12,
+ 0x98, 0x79, 0x56, 0xD4, 0x0D, 0x31, 0xDE, 0xBF, 0xB9, 0x12, 0x82, 0xA2, 0x69, 0x7A, 0x55, 0x23,
+ 0x73, 0xF6, 0xF8, 0xA6, 0x12, 0xCC, 0x51, 0x65, 0xD4, 0x00, 0xDF, 0x46, 0xA0, 0x37, 0xB8, 0x1C,
+ 0x39, 0xD8, 0x73, 0x66, 0xCB, 0x5F, 0xAE, 0x69, 0x3D, 0xFF, 0x9B, 0x13, 0x33, 0xCF, 0xE0, 0x15,
+ 0xD6, 0x78, 0x6B, 0xF1, 0x0F, 0x77, 0xEF, 0x33, 0x64, 0x1C, 0xD8, 0x60, 0x2A, 0xC6, 0x62, 0xFB,
+ 0xC9, 0x84, 0x10, 0xC2, 0x76, 0x24, 0x4C, 0x6F, 0xAF, 0x23, 0x68, 0x3C, 0x71, 0xB1, 0x80, 0x71,
+ 0x0C, 0x86, 0xE0, 0x15, 0xBF, 0xC0, 0xAA, 0xB0, 0x18, 0x61, 0x48, 0x93, 0xFD, 0xAD, 0xC8, 0xC4,
+ 0x23, 0x18, 0x87, 0x21, 0x10, 0x55, 0x7A, 0x35, 0xCC, 0x08, 0xBE, 0x2E, 0xE2, 0xA5, 0x99, 0xAB,
+ 0x55, 0x90, 0x42, 0x19, 0x6E, 0x62, 0x79, 0x4A, 0xE5, 0xE3, 0x70, 0xED, 0x91, 0x3F, 0x85, 0x02,
+ 0xB4, 0x0B, 0xF4, 0x84, 0x89, 0x6D, 0x95, 0xA4, 0x2A, 0x8A, 0x9E, 0x53, 0xCE, 0x5D, 0xCA, 0xE7,
+ 0x58, 0xB2, 0xB0, 0x40, 0x15, 0x5B, 0xA8, 0x79, 0x02, 0xB5, 0x0F, 0xCA, 0x19, 0x8A, 0x3F, 0x2B,
+ 0xA4, 0xE8, 0x66, 0x1D, 0x70, 0x95, 0xF7, 0xE7, 0x4B, 0x1B, 0x37, 0x18, 0xFB, 0x4F, 0xEF, 0x93,
+ 0xDE, 0xCB, 0x2F, 0x5E, 0xD3, 0xA4, 0x56, 0x95, 0xA7, 0x0F, 0x89, 0xB8, 0xE2, 0xC5, 0x35, 0xE0,
+ 0x88, 0xD4, 0x30, 0x05, 0x56, 0xCC, 0x9F, 0x6B, 0x58, 0xA3, 0x12, 0x98, 0x91, 0x99, 0xD8, 0x9B,
+ 0x10, 0xFA, 0xF5, 0x58, 0xD6, 0xD1, 0x7A, 0xBF, 0x16, 0x6E, 0x45, 0x74, 0xF1, 0x7A, 0xC5, 0x08,
+ 0x35, 0x5E, 0xB2, 0x89, 0x93, 0xFA, 0x30, 0xE0, 0x13, 0x94, 0xA1, 0x45, 0xDF, 0x24, 0x59, 0x3B,
+ 0xE7, 0xBA, 0x15, 0x5E, 0x32, 0x49, 0x37, 0x25, 0xC2, 0x32, 0x07, 0x05, 0x5D, 0x35, 0x9C, 0x8E,
+ 0x8A, 0x53, 0x56, 0xF7, 0x53, 0xCD, 0xE5, 0x9D, 0xEF, 0x1E, 0x49, 0xC3, 0x24, 0x67, 0x96, 0x1C,
+ 0x94, 0xDF, 0x8F, 0x98, 0x1F, 0x8A, 0xF6, 0x8E, 0x8F, 0xED, 0xFD, 0xEE, 0x4E, 0xBC, 0x00, 0xE8,
+ 0x95, 0x53, 0xEF, 0x11, 0xD6, 0x65, 0xD0, 0x52, 0xDC, 0x08, 0x7C, 0xB0, 0x32, 0x01, 0xBF, 0xB3,
+ 0x1D, 0x0F, 0x62, 0x32, 0xA3, 0x7D, 0x18, 0x9E, 0x9E, 0x19, 0x9B, 0xF6, 0x68, 0xFF, 0x63, 0xB3,
+ 0x97, 0x61, 0xD6, 0x31, 0xFF, 0x42, 0x7A, 0xE8, 0xCA, 0x87, 0xFA, 0xD7, 0xF0, 0x6C, 0x3C, 0x13,
+ 0x6B, 0x3E, 0x31, 0x10, 0xA9, 0x55, 0x46, 0x64, 0xAA, 0xF6, 0xA0, 0x3A, 0x16, 0x28, 0xBE, 0x71,
+ 0xDE, 0xE0, 0x44, 0x78, 0x5B, 0xE6, 0xF6, 0xAB, 0x2F, 0x9B, 0xE7, 0x61, 0x0A, 0xA4, 0x04, 0x2D,
+ 0xFD, 0xFB, 0x2E, 0x5D, 0xD7, 0x36, 0xC8, 0x30, 0xA8, 0x93, 0xD8, 0x17, 0x4F, 0x8F, 0x4D, 0x8C,
+ 0x98, 0x57, 0x8C, 0x6F, 0x46, 0x57, 0xA0, 0x4A, 0x1A, 0xDB, 0xE7, 0x3F, 0x96, 0xC7, 0x56, 0x41,
+ 0x0D, 0x55, 0x5B, 0x3F, 0x67, 0xD2, 0xAB, 0xEC, 0x4A, 0x66, 0x67, 0x9A, 0xF2, 0x2D, 0x63, 0xC4,
+ 0xB6, 0x50, 0x86, 0xB7, 0x70, 0xAA, 0x19, 0x05, 0x9A, 0xA5, 0x3E, 0x7B, 0x89, 0x64, 0xF9, 0x97,
+ 0x0C, 0xDB, 0x3D, 0x99, 0x92, 0xF0, 0x9A, 0x5C, 0x63, 0x46, 0x6E, 0x57, 0x15, 0xF2, 0xC1, 0x24,
+ 0x09, 0xB0, 0x94, 0xB6, 0x22, 0xA0, 0x23, 0x32, 0x53, 0x9B, 0x24, 0x4B, 0xC7, 0x83, 0x6D, 0xA9,
+ 0xDB, 0x1E, 0x1A, 0xBD, 0x56, 0xB7, 0x13, 0xD8, 0x92, 0x2E, 0x0C, 0x17, 0xA5, 0xEF, 0x4B, 0x53,
+ 0x36, 0xC9, 0xC4, 0xE8, 0xFA, 0x4D, 0xD8, 0xA1, 0x81, 0xE5, 0x9C, 0xE8, 0x65, 0x62, 0xEF, 0x65,
+ 0xA6, 0xA9, 0x1C, 0xBA, 0x33, 0xE2, 0x3F, 0xE7, 0xB7, 0xD6, 0x1A, 0x07, 0xBE, 0x5D, 0xF6, 0x5C,
+ 0x3E, 0xC4, 0x40, 0xF7, 0x3F, 0x8A, 0xE0, 0x77, 0xC0, 0x61, 0x73, 0x86, 0x26, 0x2D, 0x71, 0x54,
+ 0x51, 0xE5, 0x57, 0x5E, 0xB7, 0x46, 0x57, 0x2A, 0xD3, 0x22, 0x90, 0x2E, 0x3E, 0x75, 0xF8, 0x87,
+ 0xB1, 0xD2, 0x29, 0xC2, 0xDD, 0x93, 0x94, 0xD2, 0x5E, 0xAC, 0xCC, 0x90, 0xD2, 0xD8, 0x2E, 0xD3,
+ 0x9B, 0xE5, 0x10, 0x5B, 0xE5, 0x7F, 0x8E, 0x34, 0x64, 0x97, 0xB9, 0xA0, 0x7E, 0xD9, 0x0E, 0x7F,
+ 0xB4, 0x6B, 0x0C, 0xE7, 0x31, 0xA4, 0x35, 0x46, 0x82, 0x7B, 0xDB, 0x6F, 0x0C, 0x7D, 0xE7, 0x21,
+ 0x37, 0x10, 0x54, 0x03, 0x0E, 0x83, 0x77, 0xCB, 0xD9, 0xBB, 0x23, 0x87, 0xF3, 0xA0, 0x68, 0x06,
+ 0x67, 0xF0, 0x0A, 0x6B, 0xE5, 0x98, 0x05, 0x06, 0xB1, 0xDC, 0xB7, 0xE8, 0xDC, 0x7B, 0x2D, 0x9A,
+ 0xF7, 0x1E, 0x53, 0xBE, 0xBB, 0x9D, 0x90, 0xD0, 0x80, 0xA3, 0x02, 0x53, 0xDD, 0x3B, 0x97, 0xF2,
+ 0xC9, 0x1A, 0x5A, 0xAB, 0x9F, 0x53, 0xFB, 0xED, 0x1C, 0x44, 0xEA, 0x13, 0xE6, 0xFF, 0x03, 0xB1,
+ 0xAB, 0x21, 0x94, 0x7A, 0x58, 0x5F, 0x2E, 0x0C, 0xFF, 0xC1, 0x6A, 0xA8, 0xD6, 0xE3, 0x11, 0xC6,
+ 0x9C, 0x88, 0xE5, 0xEB, 0x90, 0x50, 0x6F, 0x34, 0x59, 0x63, 0xD6, 0xAC, 0xFB, 0x1C, 0x70, 0xEC,
+ 0x7E, 0x50, 0xA6, 0xD3, 0x7E, 0xF5, 0x98, 0x4B, 0x26, 0xEE, 0x0B, 0xB4, 0x04, 0xF6, 0x72, 0x77,
+ 0x4A, 0x72, 0x70, 0xE3, 0x8B, 0xE2, 0x55, 0xD2, 0x31, 0x39, 0xF8, 0xB6, 0x8D, 0x97, 0x57, 0x54,
+ 0xAE, 0x02, 0xC8, 0x00, 0x65, 0x49, 0xF7, 0xF2, 0x88, 0xD1, 0x07, 0x46, 0x58, 0x7A, 0x52, 0x66,
+ 0x32, 0xE4, 0xF4, 0x4B, 0xD8, 0xFA, 0xFB, 0x1D, 0xF5, 0xAF, 0x61, 0x60, 0x52, 0x4D, 0x87, 0xC3,
+ 0xBB, 0x71, 0x60, 0x42, 0x1D, 0xA3, 0x8C, 0x59, 0xF3, 0x48, 0xB7, 0x9D, 0x7E, 0xE3, 0xC5, 0x91,
+ 0x20, 0xDE, 0x82, 0xFD, 0xA3, 0xDE, 0xFF, 0x0B, 0x12, 0x6C, 0x9A, 0xD4, 0x37, 0x97, 0xA1, 0x10,
+ 0x2C, 0x1A, 0x84, 0x1A, 0x65, 0xE0, 0xBB, 0xED, 0x31, 0xD9, 0x9E, 0x63, 0x48, 0x3F, 0x73, 0xCD,
+ 0x9D, 0x9C, 0x1A, 0x89, 0x01, 0x89, 0x95, 0xA0, 0x01, 0xFF, 0x15, 0x2E, 0xFD, 0x5B, 0xB7, 0x56,
+ 0x54, 0x9B, 0x1A, 0xD9, 0xD8, 0x6B, 0x4D, 0x2B, 0xEE, 0x65, 0x82, 0xF4, 0x18, 0xC0, 0x8F, 0x92,
+ 0x0F, 0xA9, 0x85, 0x36, 0xE0, 0xFF, 0x5C, 0x67, 0xBC, 0x1C, 0x4C, 0x04, 0x00, 0x1A, 0xFF, 0x33,
+ 0xF3, 0x3C, 0xB9, 0x01, 0x85, 0xF5, 0x9C, 0x42, 0x48, 0x98, 0xD1, 0x1C, 0x12, 0x12, 0x36, 0x69,
+ 0x9F, 0x00, 0x9D, 0x91, 0x55, 0xF2, 0x3B, 0x3C, 0x65, 0x1F, 0x08, 0x56, 0x48, 0x57, 0x6B, 0xE3,
+ 0x88, 0xED, 0x2A, 0x13, 0x48, 0xC4, 0x2C, 0xD5, 0x46, 0x54, 0x8A, 0xBC, 0x1C, 0x4B, 0xCF, 0x27,
+ 0x88, 0xC9, 0x74, 0xCF, 0xD5, 0x82, 0x76, 0x57, 0x76, 0x83, 0x2C, 0xA6, 0x4E, 0xD6, 0xEB, 0xD0,
+ 0xEB, 0x8C, 0x0D, 0x04, 0xD6, 0xAD, 0x88, 0xE3, 0x7C, 0x3C, 0x9C, 0xB1, 0xCA, 0x4E, 0xEF, 0x8A,
+ 0x57, 0x3B, 0x6C, 0x68, 0x2C, 0xEE, 0xA9, 0xEA, 0x71, 0xBB, 0x84, 0x2A, 0xCF, 0x68, 0xBE, 0x7F,
+ 0x16, 0x77, 0x4A, 0x6D, 0x2F, 0x9B, 0x23, 0xA7, 0x65, 0x1D, 0x3A, 0x43, 0xE1, 0xEA, 0xF8, 0x0B,
+ 0x4E, 0xA7, 0x6A, 0x9C, 0x68, 0x65, 0x80, 0x34, 0xBF, 0x92, 0x35, 0x52, 0x47, 0xA3, 0xD1, 0x19,
+ 0x54, 0xD4, 0x61, 0xB2, 0x59, 0xCB, 0x98, 0x01, 0x2A, 0x03, 0xA3, 0x26, 0x13, 0xF4, 0x8D, 0x2E,
+ 0xA5, 0xF5, 0x89, 0xA1, 0x27, 0x5F, 0x08, 0x9E, 0xDF, 0x24, 0xB6, 0x1F, 0x88, 0x0F, 0xA9, 0xA7,
+ 0x3F, 0x8B, 0x14, 0xD6, 0xAE, 0x50, 0x43, 0x73, 0x7F, 0xE5, 0x47, 0xFA, 0xF6, 0xA8, 0xC6, 0x85,
+ 0x03, 0x20, 0x5C, 0x91, 0x13, 0xB4, 0xDF, 0xD0, 0xDE, 0xD5, 0xA3, 0x7A, 0x6F, 0x85, 0xE4, 0x92,
+ 0x9B, 0xED, 0x3D, 0xE9, 0x03, 0x08, 0x45, 0x21, 0x12, 0x0E, 0x5A, 0xEB, 0x12, 0xDF, 0x07, 0x71,
+ 0xD4, 0x96, 0x06, 0x0A, 0xCA, 0xA5, 0x2D, 0x7C, 0x6D, 0xC8, 0x23, 0xAD, 0xB9, 0x7C, 0xCB, 0x0A,
+ 0xEA, 0x29, 0x77, 0x8C, 0x5E, 0x9D, 0xE2, 0x64, 0xFE, 0x41, 0x89, 0x3A, 0xEA, 0x26, 0x6F, 0x2C,
+ 0x1C, 0x73, 0x72, 0x9A, 0xA7, 0x46, 0x69, 0xC6, 0x4D, 0x0B, 0x7F, 0x30, 0x33, 0x1C, 0x73, 0x8D,
+ 0x46, 0xC0, 0xA2, 0xD6, 0x4C, 0x8E, 0x99, 0xB2, 0x0D, 0xC8, 0xD6, 0x41, 0x05, 0xAE, 0x29, 0xB2,
+ 0xEE, 0x1C, 0x58, 0x2E, 0xBB, 0xE3, 0xC1, 0x79, 0x40, 0x3F, 0xA7, 0x15, 0xC9, 0xBB, 0xA7, 0xE4,
+ 0xAF, 0x7E, 0xB3, 0x43, 0x5F, 0xF8, 0xD0, 0x78, 0x01, 0x68, 0x46, 0xFA, 0x82, 0x03, 0x77, 0x72,
+ 0x21, 0x9A, 0x51, 0x1D, 0x5D, 0xB5, 0xC5, 0x29, 0x5D, 0x75, 0xC6, 0x3B, 0x6B, 0x68, 0x7B, 0x6F,
+ 0xF3, 0xD2, 0x9D, 0xE4, 0x8E, 0x69, 0xA2, 0x63, 0x8B, 0xEE, 0xFF, 0xB5, 0x1A, 0xBF, 0xFE, 0xFD,
+ 0x59, 0x18, 0x4D, 0xFC, 0x86, 0xEB, 0x9A, 0xBF, 0x52, 0xC7, 0x4B, 0x77, 0x15, 0x2A, 0xF7, 0x20,
+ 0x37, 0xFE, 0x70, 0x43, 0xE7, 0x26, 0x91, 0xC9, 0xF8, 0x17, 0xA3, 0x96, 0xAD, 0x52, 0xFC, 0x42,
+ 0xCB, 0x0D, 0x2D, 0x16, 0xC7, 0x23, 0xE2, 0x1A, 0x54, 0x8D, 0xF1, 0xAD, 0x1F, 0xAB, 0x7A, 0x10,
+ 0x72, 0x2D, 0x3A, 0xD6, 0xF4, 0x93, 0x50, 0x5F, 0xF0, 0x90, 0xD0, 0x5D, 0xE6, 0xC7, 0x8C, 0x22,
+ 0xA8, 0xAE, 0x9A, 0x87, 0x35, 0x4D, 0x1D, 0x66, 0x2C, 0x2C, 0x4C, 0x6F, 0x8F, 0x6B, 0x10, 0xE9,
+ 0x66, 0xB2, 0xA6, 0xE9, 0x92, 0xCF, 0xC7, 0x6A, 0x87, 0xA3, 0x5F, 0x13, 0x1A, 0x36, 0x69, 0x6A,
+ 0x94, 0xA4, 0xCA, 0xB8, 0xB2, 0xD1, 0xFC, 0x97, 0x62, 0x14, 0x50, 0x2B, 0xD6, 0xEA, 0x9B, 0xDC,
+ 0xE2, 0xD6, 0xC9, 0x17, 0x7B, 0xD7, 0xAF, 0x0E, 0x62, 0x66, 0x5E, 0x67, 0x58, 0xE4, 0x09, 0x68,
+ 0x63, 0x26, 0xF0, 0x23, 0x3A, 0x18, 0xAE, 0x4E, 0xAE, 0x03, 0x6D, 0xA0, 0xBA, 0xB4, 0xE5, 0x20,
+ 0x0B, 0x8B, 0xB0, 0x0E, 0xC1, 0x09, 0x5F, 0xAA, 0xD7, 0x2B, 0xD2, 0x3E, 0xCD, 0xE6, 0xBE, 0xFE,
+ 0x11, 0x11, 0x4B, 0x55, 0x01, 0xEF, 0x0C, 0xFF, 0xF4, 0x4A, 0xBC, 0x87, 0x0F, 0x76, 0x73, 0x5E,
+ 0xCD, 0x4B, 0x3D, 0xA9, 0xAF, 0x3E, 0x96, 0x8D, 0x49, 0xDC, 0x16, 0x18, 0x76, 0x8C, 0x93, 0xB2,
+ 0x6F, 0x72, 0x8F, 0xE0, 0xBD, 0xF5, 0xFA, 0x01, 0xEF, 0x2F, 0x47, 0xD9, 0x6C, 0xAE, 0xE2, 0x37,
+ 0xA2, 0x45, 0x1F, 0xFB, 0xA2, 0xB4, 0xAF, 0x74, 0xFC, 0xE3, 0x6A, 0xC8, 0x4C, 0x9E, 0xAA, 0xFE,
+ 0x86, 0x23, 0xE7, 0xFD, 0x51, 0x32, 0x25, 0xAE, 0x57, 0xAB, 0xE2, 0x44, 0xEE, 0x6A, 0x1B, 0x61,
+ 0x0F, 0x0E, 0x8C, 0xA0, 0x87, 0x1B, 0x5F, 0x66, 0x2E, 0x97, 0x11, 0x29, 0xBD, 0x7D, 0xD9, 0x40,
+ 0x92, 0x7B, 0xF8, 0x1D, 0xCB, 0x97, 0xE8, 0x7B, 0xE8, 0x5C, 0x07, 0x61, 0x19, 0xD6, 0xEE, 0x99,
+ 0xD1, 0xBE, 0x36, 0x1F, 0x42, 0xF7, 0x33, 0x94, 0x01, 0xA4, 0xE0, 0x0C, 0x99, 0x1F, 0x21, 0x31,
+ 0x5A, 0xF9, 0xA1, 0x98, 0xFD, 0x85, 0x44, 0xBB, 0x82, 0xB7, 0x9D, 0xE9, 0x4F, 0x4A, 0xD9, 0xBC,
+ 0x8D, 0xDD, 0x2E, 0xF6, 0x75, 0x38, 0xC0, 0x12, 0x36, 0xA8, 0x1F, 0x57, 0x37, 0x9F, 0x64, 0xB3,
+ 0xF3, 0xFA, 0x5B, 0xA9, 0x81, 0x8B, 0x5E, 0x25, 0x34, 0x38, 0x28, 0x74, 0x4E, 0x58, 0xA1, 0x6C,
+ 0xC2, 0x57, 0x58, 0x40, 0x22, 0x3E, 0xE8, 0x48, 0xBA, 0x6F, 0x4F, 0xC9, 0xC5, 0x06, 0x4D, 0x12,
+ 0xDC, 0x48, 0x68, 0xDB, 0xC2, 0x6A, 0x20, 0xA2, 0x99, 0x4E, 0x08, 0x05, 0xB2, 0x8E, 0xB1, 0x61,
+ 0x2E, 0x25, 0x67, 0x27, 0x69, 0xB9, 0x04, 0xDB, 0x3A, 0x73, 0xEC, 0xA0, 0xB7, 0x73, 0x88, 0x7E,
+ 0x25, 0x4B, 0x33, 0x3B, 0xAC, 0x7F, 0x11, 0x12, 0x3A, 0x49, 0xB5, 0x3A, 0x36, 0x39, 0xD3, 0xCA,
+ 0x02, 0xA0, 0xE4, 0xD8, 0x12, 0x5C, 0x98, 0x29, 0x57, 0x69, 0x39, 0x8E, 0x35, 0x12, 0x07, 0x83,
+ 0xFE, 0x77, 0xD8, 0x30, 0xB4, 0x34, 0xD2, 0xE6, 0xB1, 0x9A, 0xFF, 0xAC, 0xFC, 0x0D, 0x3B, 0x8A,
+ 0x18, 0x1F, 0xF4, 0xE8, 0xBF, 0xE8, 0xE4, 0x26, 0xE5, 0x07, 0xB0, 0xB2, 0x2B, 0xCB, 0x14, 0xFA,
+ 0x53, 0x39, 0x64, 0x43, 0xCB, 0x3D, 0xFC, 0x61, 0x90, 0x3A, 0xF6, 0xE8, 0x7B, 0x13, 0xCD, 0x6E,
+ 0xA9, 0xA5, 0x66, 0xD0, 0x9E, 0xE2, 0x50, 0xC6, 0xCF, 0xFC, 0x03, 0xB1, 0xD5, 0x7D, 0x0A, 0x62,
+ 0x7F, 0xE2, 0x3D, 0x9F, 0x0F, 0x9F, 0x29, 0x99, 0x65, 0x13, 0x69, 0xF2, 0x85, 0x58, 0x07, 0x1D,
+ 0x00, 0x66, 0x9D, 0x4B, 0xA8, 0xC9, 0x07, 0x1A, 0x8F, 0x3E, 0xD7, 0x81, 0xA6, 0xDB, 0xE9, 0x32,
+ 0xB3, 0xD4, 0x29, 0x6D, 0xB8, 0xBA, 0x41, 0x0F, 0x51, 0xCB, 0x50, 0x74, 0x48, 0x07, 0x97, 0x27,
+ 0xC9, 0x23, 0x3C, 0xBD, 0x5B, 0x0F, 0x46, 0x04, 0x38, 0xB5, 0xC0, 0xB6, 0x20, 0x03, 0xFA, 0x56,
+ 0x52, 0x9E, 0x27, 0xAC, 0xF1, 0xE7, 0x32, 0x25, 0x72, 0xFC, 0xAB, 0xE5, 0x1F, 0xF0, 0x55, 0x7D,
+ 0xED, 0xB8, 0x28, 0x96, 0x47, 0xED, 0x86, 0x45, 0xC9, 0xBA, 0xD1, 0xF6, 0xFA, 0xFC, 0xC6, 0xF6,
+ 0x67, 0x45, 0xC4, 0xA9, 0x25, 0xDE, 0xC7, 0x3F, 0x8A, 0xD8, 0x31, 0x3C, 0xB6, 0xE4, 0x0D, 0x7B,
+ 0xBE, 0x89, 0x5A, 0x69, 0x80, 0xEB, 0x62, 0xDE, 0xAF, 0x02, 0x6E, 0xD1, 0x4B, 0x2C, 0x7B, 0xCD,
+ 0x4D, 0xF1, 0xDF, 0x58, 0x82, 0xD0, 0xE6, 0x6F, 0xB7, 0x45, 0x8E, 0xDF, 0xE6, 0x30, 0x84, 0xC4,
+ 0x5D, 0x26, 0xC0, 0x4C, 0x39, 0xC5, 0x2C, 0x99, 0x34, 0x13, 0xF5, 0x32, 0xA3, 0xEE, 0xCF, 0x54,
+ 0x5C, 0x58, 0x2B, 0x5D, 0x54, 0xEF, 0xFA, 0x11, 0xC4, 0xBB, 0x1F, 0x34, 0x7C, 0xE6, 0x2F, 0xE4,
+ 0xA9, 0xD3, 0x95, 0x8B, 0x58, 0xC7, 0xB5, 0xE2, 0x27, 0xCE, 0xF0, 0xF8, 0xD1, 0x9E, 0x0F, 0x88,
+ 0x93, 0x3D, 0x90, 0x0D, 0x15, 0x9A, 0xC3, 0xEA, 0x91, 0xF5, 0xF6, 0xE4, 0x3E, 0x89, 0x01, 0x8A,
+ 0x4E, 0x6F, 0xE3, 0x21, 0xB1, 0x93, 0x04, 0x36, 0x30, 0x22, 0x7B, 0x92, 0x7F, 0xCF, 0x06, 0x6B,
+ 0xA5, 0x60, 0x8E, 0x15, 0x77, 0x8F, 0x7E, 0x9E, 0xB1, 0xE6, 0xFA, 0x30, 0x4D, 0xD1, 0xC7, 0x20,
+ 0xEA, 0xAF, 0xD5, 0xB2, 0x58, 0xD3, 0xAA, 0x74, 0xBC, 0xDD, 0x10, 0x6F, 0x54, 0xFF, 0x15, 0xD4,
+ 0xB0, 0x20, 0xD5, 0xDC, 0xF3, 0x89, 0x28, 0x04, 0x4C, 0x69, 0x7E, 0xE9, 0xBF, 0xE5, 0x83, 0x33,
+ 0x81, 0x69, 0xE4, 0xB8, 0x46, 0xD8, 0x26, 0x24, 0x51, 0xEE, 0x5B, 0x1D, 0x8E, 0xA0, 0x2B, 0xA2,
+ 0xD6, 0x6B, 0x4C, 0x7F, 0xA3, 0xDA, 0xDF, 0x64, 0x4B, 0x79, 0xF8, 0xEA, 0x0D, 0x53, 0x20, 0xB6,
+ 0x67, 0xE4, 0x9F, 0xB5, 0xB6, 0x63, 0x1D, 0x6E, 0xDA, 0x91, 0x1C, 0x9C, 0xE1, 0x96, 0x0D, 0x67,
+ 0xD4, 0xFE, 0xE9, 0x80, 0xEA, 0x43, 0xF3, 0x6C, 0x7F, 0x9D, 0x1E, 0xCB, 0x9A, 0xB0, 0x29, 0x60,
+ 0x68, 0x8C, 0xB9, 0x1B, 0x23, 0x8E, 0x87, 0xBD, 0x27, 0x1A, 0x93, 0xCB, 0xD5, 0x3B, 0x8F, 0x9B,
+ 0xF7, 0x5F, 0xF8, 0x5D, 0xA0, 0x90, 0xC8, 0xEC, 0xDB, 0x2E, 0xCC, 0xBB, 0xDA, 0x4A, 0x8E, 0x7E,
+ 0xD9, 0x80, 0xC9, 0x7C, 0xEA, 0x17, 0x31, 0x51, 0x0E, 0xB0, 0x3E, 0xC2, 0x45, 0x40, 0x70, 0x7B,
+ 0xA4, 0x1B, 0x26, 0x9C, 0xC4, 0x35, 0x38, 0x24, 0x21, 0x6A, 0x33, 0x57, 0x10, 0x7B, 0xE1, 0x00,
+ 0x51, 0x24, 0x22, 0x46, 0xC1, 0x95, 0x0F, 0x9C, 0xC1, 0x38, 0x48, 0xD5, 0x19, 0x09, 0x75, 0xBA,
+ 0x85, 0x8A, 0x7B, 0x55, 0xD5, 0x8C, 0xD3, 0x51, 0x4D, 0x9B, 0x49, 0xCD, 0xA4, 0xCB, 0x14, 0x11,
+ 0xBF, 0x78, 0x52, 0xB1, 0x58, 0x28, 0x50, 0x9B, 0x81, 0x9C, 0xB4, 0x6D, 0xD1, 0xE4, 0x67, 0xED,
+ 0x13, 0x47, 0xE9, 0xC4, 0xDE, 0xB2, 0xC2, 0x38, 0x06, 0x58, 0x40, 0x20, 0x85, 0x80, 0x81, 0xF2,
+ 0x7A, 0xCF, 0xFC, 0x22, 0x31, 0x27, 0x31, 0x0A, 0x3C, 0xF5, 0xAE, 0xBE, 0x8D, 0xDD, 0x94, 0x80,
+ 0x25, 0x73, 0xC5, 0xFD, 0xEB, 0xFA, 0x0C, 0xA8, 0x25, 0x2D, 0xD5, 0x48, 0xF3, 0x48, 0x59, 0x84,
+ 0x4C, 0x71, 0x8D, 0x28, 0xA1, 0x7A, 0x19, 0xF7, 0x45, 0xAA, 0x83, 0x15, 0xEA, 0x40, 0x8F, 0x0F,
+ 0x90, 0xEF, 0x1F, 0x4E, 0x81, 0xAB, 0xEB, 0x03, 0x4F, 0xD4, 0x59, 0xC5, 0xFB, 0x1E, 0xFA, 0x3E,
+ 0x44, 0xB5, 0x48, 0xE2, 0x71, 0x88, 0x18, 0xF3, 0x73, 0x5F, 0xF3, 0x9B, 0x7B, 0xBF, 0x18, 0x17,
+ 0xEB, 0x48, 0x5A, 0x5C, 0xCE, 0x54, 0xDA, 0x84, 0xE8, 0xDC, 0x9C, 0x03, 0xC1, 0xD6, 0x70, 0xBF,
+ 0x5F, 0x3F, 0xC2, 0x3E, 0x05, 0x73, 0x82, 0x2C, 0xB0, 0x19, 0xCF, 0xDC, 0x7D, 0xD8, 0xF4, 0x27,
+ 0x1B, 0xBE, 0x28, 0x9A, 0x0C, 0x22, 0x90, 0x94, 0x60, 0x5A, 0x30, 0x1A, 0xBA, 0xD3, 0x2D, 0xEE,
+ 0xFF, 0x1A, 0x7A, 0x4C, 0xC9, 0x7C, 0xB4, 0x4C, 0xB1, 0x88, 0xB9, 0xF9, 0xFC, 0xE7, 0x62, 0x0F,
+ 0x54, 0xBC, 0x7A, 0x4E, 0xA6, 0xC6, 0x73, 0xE2, 0x4D, 0x49, 0x59, 0x8B, 0x2A, 0x69, 0x0A, 0x62,
+ 0x1D, 0xA4, 0x6B, 0x9C, 0x90, 0x80, 0x82, 0x02, 0x29, 0xBD, 0xF4, 0x04, 0x3A, 0x52, 0x27, 0x85,
+ 0x16, 0x81, 0xB5, 0xB9, 0x4E, 0xB5, 0xA4, 0xD7, 0x3B, 0x22, 0x02, 0x71, 0x87, 0xF5, 0x42, 0x8D,
+ 0x95, 0x13, 0xF2, 0xB5, 0xD2, 0xDE, 0xC6, 0xC4, 0xD8, 0xB9, 0x09, 0x3D, 0x89, 0x7E, 0xFD, 0x71,
+ 0x96, 0x0B, 0x2C, 0xBF, 0xD2, 0xDC, 0x12, 0xE3, 0xE8, 0xD3, 0x4B, 0xE2, 0xA8, 0x99, 0x7A, 0x0E,
+ 0xAA, 0xD8, 0x89, 0x34, 0x6B, 0x8B, 0xF9, 0x56, 0x12, 0x23, 0x5C, 0x80, 0xCC, 0x85, 0x13, 0x0D,
+ 0x9F, 0x4D, 0xBA, 0xBB, 0x66, 0xE4, 0x44, 0x6D, 0x37, 0xF2, 0x26, 0x57, 0x4C, 0x21, 0xE1, 0x99,
+ 0x96, 0xEE, 0x61, 0x80, 0xC3, 0x22, 0x51, 0x2A, 0xD8, 0x70, 0x4B, 0x10, 0x0B, 0x03, 0xF9, 0x13,
+ 0x72, 0x5E, 0xD8, 0x85, 0x81, 0x33, 0x66, 0x97, 0x7D, 0xAC, 0x18, 0x08, 0xE8, 0x24, 0xC1, 0x6C,
+ 0x5F, 0xD6, 0xA3, 0x99, 0xC6, 0x50, 0x54, 0x61, 0x90, 0xF0, 0x3B, 0xBF, 0xF3, 0x12, 0x74, 0x8C,
+ 0x24, 0x38, 0xEB, 0xC5, 0x7A, 0xF1, 0x14, 0x33, 0x59, 0x8E, 0x57, 0x0F, 0x66, 0xF7, 0x9C, 0xC2,
+ 0xE5, 0x2A, 0x39, 0x88, 0xE6, 0x5F, 0x5C, 0x80, 0xD9, 0xDB, 0x1D, 0x80, 0xF5, 0xCF, 0xA9, 0xFC,
+ 0x2F, 0x81, 0x37, 0x11, 0x90, 0x8D, 0x91, 0xD7, 0x7A, 0x76, 0x18, 0x31, 0x80, 0x97, 0xA1, 0x24,
+ 0xB2, 0x86, 0x7F, 0x01, 0x28, 0xB2, 0xA0, 0x78, 0x4F, 0x30, 0xCA, 0x37, 0xC4, 0xFC, 0xCA, 0xC2,
+ 0xC4, 0xE1, 0xD0, 0x62, 0x9E, 0x11, 0x00, 0x12, 0x29, 0xD2, 0x1A, 0x5B, 0x7D, 0x50, 0x69, 0xBF,
+ 0x32, 0xA3, 0xFF, 0x13, 0x26, 0x30, 0x6D, 0xB7, 0xB2, 0x26, 0xAC, 0xE4, 0x74, 0x94, 0x92, 0xA0,
+ 0xFB, 0x8F, 0xF4, 0xB0, 0x9D, 0xAA, 0xA4, 0x00, 0x7F, 0x3B, 0xCC, 0xC9, 0xD4, 0x67, 0xCA, 0xAD,
+ 0xB7, 0xB8, 0xB9, 0xD4, 0x01, 0x27, 0x6C, 0x8E, 0x8F, 0x16, 0x41, 0x13, 0xE5, 0xB5, 0x81, 0x3A,
+ 0x29, 0x3C, 0x21, 0x16, 0x3E, 0x49, 0x8B, 0x15, 0x59, 0x21, 0x8B, 0x14, 0xAB, 0x53, 0x58, 0x8A,
+ 0xC6, 0x02, 0x15, 0x41, 0x38, 0x9A, 0x25, 0x45, 0xBC, 0xF7, 0x84, 0x0B, 0xD7, 0x2F, 0x98, 0x4D,
+ 0xBA, 0x56, 0x9F, 0x3C, 0x0D, 0x86, 0x1F, 0xDC, 0x40, 0x2D, 0x31, 0xA9, 0xB0, 0xBE, 0x84, 0x51,
+ 0x58, 0xEC, 0x2F, 0xFB, 0x4E, 0x36, 0x09, 0xAE, 0x5A, 0x7E, 0xAA, 0x1D, 0xFC, 0xF5, 0x91, 0x9A,
+ 0x28, 0xA2, 0x58, 0x3B, 0xB6, 0x9D, 0xB5, 0x12, 0xB7, 0x70, 0x7D, 0x64, 0x52, 0xB3, 0xC4, 0x07,
+ 0xFA, 0x3A, 0xAA, 0x85, 0xA4, 0x1A, 0x4E, 0x47, 0xB0, 0xD0, 0x44, 0x75, 0x77, 0xA2, 0xFB, 0xB3,
+ 0xE3, 0x27, 0x55, 0xD0, 0x1F, 0x3C, 0x9E, 0x2A, 0xB9, 0x41, 0x1D, 0x50, 0x98, 0x7E, 0xE9, 0xC9,
+ 0xA7, 0x3C, 0x0B, 0xB1, 0x96, 0x74, 0xFC, 0xDB, 0xB6, 0x35, 0xAC, 0xD3, 0x89, 0xCA, 0x3B, 0x79,
+ 0x32, 0x81, 0x70, 0x5C, 0xEE, 0x35, 0x79, 0x55, 0xDC, 0x77, 0x85, 0x01, 0x68, 0xE7, 0xA4, 0xB9,
+ 0x9E, 0xDA, 0x55, 0xA1, 0xDF, 0x9A, 0xF5, 0xEA, 0xF0, 0xE1, 0x4F, 0x59, 0xB4, 0x13, 0xD7, 0xAC,
+ 0x12, 0xF5, 0x06, 0xA2, 0x82, 0x01, 0xA1, 0xB5, 0x04, 0x9B, 0x00, 0x62, 0x11, 0xEF, 0xF9, 0x82,
+ 0x8E, 0x00, 0x4D, 0x0C, 0x16, 0x4C, 0x0C, 0x80, 0xC7, 0x33, 0xCB, 0x0A, 0x43, 0xC3, 0x90, 0x47,
+ 0x79, 0xCD, 0xEA, 0x96, 0xDC, 0xDE, 0x7C, 0xB9, 0x1D, 0x0C, 0xB1, 0xBC, 0x0F, 0x8B, 0x76, 0xE5,
+ 0xBD, 0xD0, 0x59, 0x76, 0x08, 0x79, 0xE4, 0xF3, 0xE1, 0xB3, 0x12, 0xF1, 0x94, 0x14, 0x79, 0xBF,
+ 0xAC, 0x22, 0x4E, 0x57, 0x7B, 0xCB, 0x5B, 0xBF, 0xE4, 0x9D, 0x16, 0x18, 0xA2, 0xB3, 0x2D, 0x04,
+ 0x3A, 0x11, 0xC9, 0x18, 0x6D, 0xCC, 0x99, 0xB5, 0xB5, 0x36, 0xF5, 0x49, 0x4B, 0xEC, 0x60, 0x3E,
+ 0x22, 0x9A, 0x73, 0x60, 0x91, 0x2F, 0x4F, 0x70, 0xB7, 0xA4, 0x48, 0x61, 0xCB, 0x0D, 0x17, 0x84,
+ 0x61, 0xF1, 0xAD, 0x7F, 0xEE, 0xEC, 0x72, 0x18, 0x60, 0x6D, 0xAC, 0xEE, 0xDB, 0xC1, 0xC2, 0x81,
+ 0xF1, 0x03, 0x74, 0xA2, 0x5A, 0xA9, 0xC8, 0x0E, 0x52, 0x85, 0xDD, 0x1D, 0x12, 0xBE, 0x1C, 0xC4,
+ 0x58, 0x0F, 0x62, 0xEE, 0x17, 0xD4, 0xF5, 0x7F, 0xDB, 0xF4, 0x1B, 0xDF, 0x2D, 0x18, 0x6D, 0x0B,
+ 0x47, 0xDB, 0xFF, 0xAF, 0x70, 0xE6, 0xA1, 0x52, 0x60, 0x9E, 0xFC, 0x83, 0xCC, 0x76, 0xB3, 0xAF,
+ 0xED, 0x23, 0x21, 0xBB, 0x7D, 0xBE, 0x7E, 0x59, 0x7F, 0x3A, 0x22, 0x10, 0x8F, 0x43, 0x4E, 0x65,
+ 0xC6, 0xBC, 0xEB, 0xE0, 0x63, 0x82, 0x78, 0xB8, 0xD5, 0xD0, 0xE7, 0xDA, 0x44, 0xF2, 0x1A, 0xBD,
+ 0x75, 0x46, 0xF7, 0x2A, 0xFE, 0x5F, 0x2A, 0x95, 0xB3, 0x4F, 0x51, 0xC2, 0xD1, 0x24, 0xEA, 0x88,
+ 0x06, 0x88, 0x8E, 0xCB, 0x33, 0xA8, 0x71, 0xC3, 0x89, 0x4E, 0xD4, 0x25, 0xBC, 0x87, 0x1C, 0x05,
+ 0x87, 0x74, 0xF5, 0x99, 0x90, 0x58, 0xA1, 0x2E, 0x14, 0x13, 0x25, 0xD6, 0xCB, 0x5C, 0xE5, 0xA8,
+ 0x46, 0xA6, 0x71, 0x68, 0x72, 0x66, 0x48, 0xD8, 0x92, 0x8F, 0x75, 0xAC, 0xB7, 0x14, 0x32, 0x42,
+ 0xB9, 0x9D, 0x57, 0xF9, 0xD2, 0x8E, 0x85, 0x27, 0x92, 0xA8, 0xCC, 0x1A, 0x26, 0x33, 0x76, 0x06,
+ 0x1A, 0xB6, 0x27, 0x56, 0x5D, 0x8E, 0xDC, 0x1F, 0xFC, 0xBA, 0x3F, 0x6A, 0x67, 0xFF, 0x9B, 0x14,
+ 0xFF, 0x90, 0xE7, 0x8E, 0xED, 0x2D, 0x8B, 0x5E, 0x22, 0x84, 0xA2, 0x06, 0x8F, 0xFD, 0x25, 0x02,
+ 0xFD, 0x3D, 0x92, 0x41, 0xE5, 0x49, 0x2D, 0x43, 0x6A, 0x9B, 0x1E, 0xA5, 0x46, 0xC9, 0xA9, 0xDC,
+ 0x2D, 0x8E, 0x75, 0xE2, 0x1B, 0x8D, 0x8F, 0x23, 0x59, 0x2E, 0x21, 0x5D, 0x3C, 0x0A, 0x41, 0xC5,
+ 0x27, 0xD2, 0x76, 0x9A, 0xCA, 0x7D, 0xAC, 0x65, 0x31, 0xC8, 0xAD, 0xB6, 0xBD, 0x19, 0x88, 0x08,
+ 0x7A, 0x91, 0x74, 0xAD, 0x23, 0x14, 0x60, 0xC3, 0x93, 0xCE, 0xF2, 0x10, 0xCF, 0xE3, 0xF1, 0xF7,
+ 0x3F, 0xD2, 0x1F, 0xD1, 0x91, 0x9B, 0x9C, 0xE9, 0xB9, 0xD7, 0xE5, 0xFA, 0x8F, 0xAD, 0xB1, 0x95,
+ 0x03, 0x28, 0xB4, 0x20, 0x46, 0xA2, 0xBD, 0x23, 0x1A, 0x32, 0xB0, 0x23, 0x65, 0x54, 0x93, 0x87,
+ 0x4F, 0xF1, 0x3A, 0xA7, 0x8A, 0xD5, 0x0F, 0x59, 0xC7, 0xD6, 0x7E, 0xBE, 0x6B, 0xFB, 0x66, 0x8A,
+ 0x1E, 0x48, 0xD3, 0xCB, 0xC3, 0x78, 0xBC, 0x2A, 0x07, 0x57, 0x66, 0xD4, 0x83, 0x95, 0xE1, 0x67,
+ 0xDA, 0xE8, 0x0D, 0x68, 0x86, 0xE8, 0xF7, 0xBF, 0x05, 0x4F, 0xB0, 0x41, 0x0C, 0xE6, 0x72, 0x9C,
+ 0xB4, 0xBF, 0x93, 0x59, 0xE5, 0x97, 0xAC, 0x7B, 0xB0, 0x93, 0x0E, 0xEC, 0xE6, 0xC2, 0xC1, 0x0E,
+ 0x06, 0x81, 0x69, 0xF6, 0x27, 0xE4, 0xCA, 0x2D, 0xE0, 0x76, 0x9E, 0x0A, 0x03, 0xE3, 0x60, 0xD1,
+ 0xAB, 0x4C, 0x63, 0xCC, 0x03, 0x7E, 0xBC, 0x4A, 0x58, 0x74, 0x94, 0xEF, 0x96, 0xB7, 0x33, 0xE8,
+ 0x80, 0x56, 0xBD, 0xEC, 0x3F, 0xD6, 0x75, 0x6F, 0xF6, 0xFE, 0x85, 0x0B, 0x0A, 0x30, 0x30, 0xBE,
+ 0x0D, 0x7F, 0x5B, 0x15, 0xD2, 0x0B, 0x7D, 0xA3, 0x2B, 0xB7, 0xE7, 0xE9, 0x17, 0x4C, 0x94, 0xE1,
+ 0x70, 0xED, 0xF7, 0x40, 0x94, 0x3B, 0x3A, 0xCA, 0xCE, 0xF5, 0xB2, 0xF3, 0x8A, 0x69, 0x61, 0x57,
+ 0x5F, 0x64, 0xC5, 0xBC, 0x0F, 0x78, 0x15, 0x9C, 0xF8, 0x30, 0x3A, 0xA4, 0xC2, 0xD8, 0x35, 0xA8,
+ 0x1B, 0xFA, 0x65, 0xAE, 0x78, 0x2A, 0x2B, 0x0E, 0x8C, 0xF7, 0x7E, 0x81, 0x43, 0x0E, 0x15, 0x05,
+ 0xC6, 0x76, 0x7B, 0x29, 0xA6, 0x26, 0xDE, 0xA0, 0xF0, 0x38, 0x39, 0x8B, 0x33, 0x8D, 0x38, 0xD6,
+ 0x84, 0x69, 0x55, 0xF6, 0x5A, 0x6E, 0xBE, 0x7E, 0x18, 0x41, 0x4A, 0x4D, 0xF5, 0x7A, 0x86, 0x8B,
+ 0xCE, 0x48, 0xDD, 0xF5, 0x80, 0xEE, 0x57, 0x05, 0x99, 0x97, 0xA9, 0xCE, 0x26, 0x68, 0x20, 0xA4,
+ 0x9C, 0x84, 0x00, 0x88, 0x0A, 0x7F, 0x7B, 0x74, 0x12, 0xE6, 0x60, 0xF7, 0xD9, 0xE7, 0xB4, 0x46,
+ 0x59, 0x1A, 0x84, 0x1E, 0x08, 0x20, 0x2E, 0x74, 0x51, 0xAE, 0x95, 0xD7, 0x77, 0x5A, 0x6A, 0x9B,
+ 0x0B, 0xFF, 0xB5, 0x5D, 0x65, 0xDC, 0x35, 0x6E, 0x00, 0xAF, 0x01, 0x73, 0x41, 0x82, 0x92, 0x29,
+ 0x9B, 0x67, 0x38, 0x86, 0xE4, 0x1A, 0x2A, 0xDA, 0xBF, 0x23, 0xEC, 0x17, 0x97, 0x13, 0x1B, 0x32,
+ 0x58, 0x31, 0x2F, 0x4E, 0x6D, 0x8E, 0x39, 0x99, 0x7B, 0x9D, 0xEB, 0xBE, 0x47, 0xC5, 0x22, 0x81,
+ 0x64, 0xAE, 0x0B, 0x0D, 0xBC, 0x33, 0x6C, 0x0B, 0x30, 0xDE, 0xD0, 0xA4, 0x8D, 0xB2, 0x9E, 0xFB,
+ 0x02, 0x6C, 0xDC, 0xD3, 0x3E, 0xCF, 0xD6, 0x49, 0x76, 0x22, 0xF2, 0x21, 0x76, 0x26, 0xDE, 0x32,
+ 0x65, 0xAC, 0x1E, 0x68, 0x2F, 0xC5, 0xF3, 0x78, 0x07, 0x15, 0x08, 0xAF, 0x74, 0xD0, 0x81, 0x13,
+ 0x45, 0xAB, 0x14, 0xD4, 0x59, 0x46, 0x24, 0x9F, 0x75, 0x12, 0x0E, 0xBB, 0xDC, 0x6E, 0x4D, 0x44,
+ 0xD3, 0x28, 0x2D, 0x64, 0xA8, 0xD6, 0x71, 0xE2, 0xE0, 0x8B, 0xD2, 0xF4, 0xBD, 0xFC, 0x97, 0x30,
+ 0x0C, 0xAC, 0x52, 0x3A, 0x06, 0xE6, 0x3A, 0x24, 0x09, 0xF5, 0xEE, 0xDB, 0x6C, 0x0A, 0x34, 0xCC,
+ 0xF4, 0xEF, 0x97, 0x39, 0x4B, 0x0E, 0x51, 0xC4, 0x3F, 0x04, 0xC6, 0x79, 0xFC, 0xFC, 0x2C, 0x66,
+ 0x7C, 0x74, 0x9C, 0xF6, 0x42, 0x98, 0x57, 0xE2, 0x78, 0x24, 0x72, 0x0A, 0xF2, 0x3B, 0x82, 0x22,
+ 0xE6, 0x33, 0x80, 0xBC, 0x9A, 0xF5, 0x0D, 0x59, 0x5D, 0xEC, 0x04, 0xD1, 0x63, 0x37, 0x61, 0xB6,
+ 0xBA, 0x30, 0x50, 0x1D, 0xC8, 0x3B, 0xF9, 0x41, 0xC1, 0x4A, 0x70, 0xEF, 0x01, 0x8C, 0xFD, 0x8C,
+ 0xCF, 0xE3, 0xE1, 0x00, 0x94, 0xA0, 0xB7, 0xE8, 0xFA, 0xB9, 0x29, 0x36, 0xFD, 0x8B, 0x39, 0x86,
+ 0x32, 0x48, 0xE6, 0xA1, 0x3B, 0x2C, 0xB7, 0xDB, 0xF3, 0x81, 0xAA, 0x06, 0x45, 0x7F, 0x2F, 0x2B,
+ 0x82, 0xC7, 0xEB, 0x4A, 0x24, 0x35, 0x4F, 0x77, 0x9E, 0xCE, 0xF1, 0xDE, 0x01, 0xCB, 0x43, 0x5B,
+ 0x39, 0x3F, 0x48, 0xDF, 0xEB, 0x6E, 0x16, 0xFA, 0x3B, 0x9D, 0x76, 0x7E, 0xEA, 0xB6, 0x1B, 0x49,
+ 0x21, 0x35, 0x3C, 0xEC, 0x9B, 0x22, 0x65, 0x23, 0x8C, 0x1C, 0xA5, 0xF2, 0xD9, 0xA1, 0x9C, 0xE0,
+ 0x5D, 0x9A, 0xFC, 0xE0, 0x6B, 0x78, 0x45, 0xEF, 0xBC, 0xCC, 0x8A, 0x7C, 0xE0, 0x70, 0xDB, 0xD6,
+ 0xB1, 0x9A, 0xB3, 0x9D, 0x45, 0x3B, 0x9D, 0xE0, 0x23, 0x82, 0xF6, 0x9D, 0x6F, 0x0C, 0xF5, 0x7D,
+ 0xB7, 0x41, 0x51, 0x4C, 0x02, 0xB7, 0x8D, 0xB5, 0x30, 0x9F, 0xF8, 0xD7, 0x50, 0x72, 0xF8, 0xAD,
+ 0x2A, 0x54, 0x0F, 0xF9, 0x2D, 0x08, 0x1C, 0x32, 0x3C, 0xEE, 0xB3, 0x06, 0x73, 0x2B, 0x27, 0xEC,
+ 0x81, 0xB6, 0x73, 0xC2, 0xAE, 0xF0, 0xE0, 0x16, 0x58, 0x55, 0x56, 0xC1, 0x0E, 0x89, 0xC2, 0xA7,
+ 0xCA, 0xFD, 0x9A, 0x02, 0xC6, 0xB7, 0x68, 0xBD, 0x10, 0xFF, 0x82, 0x81, 0x58, 0x77, 0x9F, 0x55,
+ 0x62, 0xC9, 0x80, 0xE9, 0x68, 0xE4, 0xBE, 0x8B, 0xDD, 0xAC, 0x28, 0xF8, 0xE5, 0xC6, 0xC4, 0x6C,
+ 0x77, 0xA3, 0x4F, 0xB4, 0x3F, 0xDC, 0x64, 0x70, 0xF8, 0x32, 0x87, 0x19, 0x97, 0x2F, 0xEE, 0x04,
+ 0xE1, 0x92, 0x4E, 0x73, 0x28, 0x6F, 0x1B, 0x62, 0xCD, 0xD6, 0xD9, 0x7C, 0x6C, 0x5D, 0x09, 0x1F,
+ 0x9C, 0x0A, 0x72, 0x6D, 0xE7, 0x78, 0xA4, 0xA8, 0xEE, 0xF0, 0xA1, 0x3B, 0x03, 0x9E, 0xDF, 0x19,
+ 0x46, 0xD7, 0x0B, 0x8F, 0x1B, 0xCC, 0x9C, 0xD6, 0x3A, 0xB6, 0x98, 0x42, 0x4C, 0x7C, 0xD4, 0x59,
+ 0xC4, 0xBD, 0x86, 0x9E, 0x79, 0x01, 0x05, 0x7C, 0xA7, 0xC4, 0xD5, 0xC4, 0xA4, 0xD7, 0xB2, 0x8A,
+ 0x15, 0x3C, 0x08, 0x12, 0xFF, 0x0E, 0xF1, 0x20, 0x9A, 0x5C, 0x57, 0x2A, 0xDE, 0xF2, 0x21, 0xA7,
+ 0xFB, 0xF2, 0xA7, 0xE9, 0x37, 0xA8, 0x73, 0x45, 0xE8, 0xD4, 0xAC, 0x2F, 0x06, 0xC8, 0x6E, 0x04,
+ 0xDE, 0xF7, 0xE2, 0xF6, 0xD1, 0xA3, 0xC0, 0x7B, 0xD9, 0x77, 0xEF, 0x53, 0x74, 0xEA, 0xBE, 0x23,
+ 0xD2, 0x7E, 0xF0, 0xF0, 0x56, 0xAC, 0x95, 0x80, 0xF3, 0x53, 0xEE, 0x47, 0x1D, 0x76, 0x30, 0x21,
+ 0xC8, 0xAD, 0x46, 0x73, 0x8B, 0x1F, 0x4A, 0xB1, 0x48, 0x4F, 0xE7, 0x3B, 0x92, 0xC0, 0xA7, 0x68,
+ 0xF3, 0x53, 0xC7, 0xD4, 0x51, 0xA8, 0xF6, 0xC9, 0x85, 0xAD, 0xBF, 0xB9, 0x6A, 0x31, 0x0E, 0x0C,
+ 0x7E, 0x64, 0x6F, 0x50, 0x99, 0x31, 0xE4, 0x13, 0xA6, 0xBF, 0xEA, 0xFF, 0x09, 0x1A, 0xA7, 0xD8,
+ 0xD6, 0x42, 0xA7, 0x62, 0x4F, 0xAC, 0x87, 0x4B, 0xBA, 0xB7, 0xBE, 0x50, 0x5A, 0x09, 0x43, 0xD7,
+ 0x4F, 0x9B, 0x27, 0x05, 0x78, 0xEB, 0xB2, 0x16, 0x6C, 0xCA, 0x18, 0x41, 0x58, 0xF2, 0x24, 0xF9,
+ 0xED, 0xBB, 0xF6, 0x96, 0x2F, 0xF3, 0xCB, 0x4A, 0xE9, 0xF8, 0x25, 0x4A, 0x6E, 0x8E, 0x32, 0xB6,
+ 0x51, 0x17, 0x29, 0x98, 0x9B, 0x41, 0xE7, 0x23, 0x80, 0xEA, 0x17, 0x84, 0xAB, 0xF1, 0x94, 0x81,
+ 0xFE, 0xB4, 0x30, 0xA8, 0xF8, 0x59, 0x33, 0x28, 0xAE, 0xF5, 0x24, 0x20, 0x7E, 0x78, 0x54, 0x7C,
+ 0xD5, 0xE9, 0xBA, 0xC1, 0x12, 0xA2, 0x71, 0xD6, 0x1D, 0x5E, 0xE2, 0x5B, 0xF3, 0x26, 0xAA, 0x0B,
+ 0x96, 0x68, 0x46, 0x63, 0x1D, 0x71, 0x38, 0x8C, 0xB4, 0x29, 0x18, 0x92, 0x22, 0x6A, 0x0A, 0x67,
+ 0x70, 0xC2, 0x14, 0xEC, 0x4F, 0x0F, 0x3B, 0x43, 0x27, 0x6F, 0xF5, 0x1B, 0xE0, 0x7B, 0xEB, 0x35,
+ 0x3A, 0x6F, 0x7C, 0xA5, 0x9C, 0xBC, 0x17, 0x2D, 0xF5, 0xC0, 0x7D, 0x67, 0xE2, 0xF1, 0x0D, 0x00,
+ 0x04, 0xD4, 0x68, 0x9F, 0xB8, 0x48, 0xFE, 0xB6, 0xA8, 0x6F, 0xFD, 0xCB, 0x34, 0x94, 0xFA, 0x2D,
+ 0xFA, 0x46, 0x3E, 0x11, 0x2D, 0xF5, 0xBB, 0x2B, 0xD2, 0x92, 0x92, 0x0E, 0x37, 0xEB, 0x7E, 0x84,
+ 0xF9, 0xFD, 0x3B, 0x22, 0xD3, 0xCD, 0xFC, 0x46, 0xEF, 0x21, 0x35, 0x91, 0x19, 0xCF, 0x1F, 0xE0,
+ 0xFE, 0x5C, 0x1A, 0x49, 0x38, 0x95, 0xE0, 0x40, 0x1D, 0x4A, 0xB8, 0xB7, 0xBB, 0xB8, 0x52, 0x08,
+ 0x37, 0x72, 0xE4, 0xF6, 0xE8, 0x42, 0x0A, 0xAB, 0x1E, 0xF0, 0x74, 0x7B, 0xFB, 0x9E, 0x94, 0x4C,
+ 0x87, 0xF5, 0xEE, 0x0D, 0x9E, 0x07, 0x10, 0x79, 0x0C, 0x02, 0xA7, 0xE6, 0x4A, 0xBF, 0xAB, 0xAD,
+ 0x71, 0x5F, 0x31, 0xE1, 0xD5, 0x39, 0x1E, 0x72, 0x53, 0x93, 0xA4, 0x38, 0xB4, 0x04, 0x79, 0xA3,
+ 0x72, 0xCD, 0xBC, 0x29, 0x3E, 0x9F, 0x63, 0xF4, 0x87, 0xB5, 0xB8, 0x99, 0xFC, 0x4E, 0x9D, 0xD2,
+ 0xD9, 0x6F, 0xD5, 0x16, 0x1D, 0x01, 0xF8, 0x43, 0x22, 0x6B, 0xF9, 0xF8, 0xF8, 0x7E, 0x03, 0xD1,
+ 0xF0, 0xC9, 0x8B, 0x97, 0x78, 0x12, 0xF1, 0xE8, 0x23, 0x88, 0x53, 0xD3, 0x73, 0x8D, 0x8D, 0x5D,
+ 0x64, 0x7F, 0xD8, 0x5E, 0x15, 0xA6, 0x4E, 0x31, 0xE5, 0x8F, 0x1E, 0x7C, 0x8F, 0xC7, 0x60, 0x86,
+ 0x2B, 0x4F, 0x69, 0x0E, 0x2C, 0x39, 0x8B, 0xFC, 0xF4, 0x5C, 0xF4, 0x0A, 0x63, 0x4E, 0xE5, 0xCA,
+ 0x46, 0x6B, 0x15, 0xF3, 0x9B, 0x7E, 0xBB, 0xD9, 0xA1, 0x87, 0x50, 0x36, 0x23, 0xEF, 0x37, 0x88,
+ 0xE3, 0x89, 0xAB, 0x5F, 0x0A, 0x07, 0xB4, 0x5F, 0xF8, 0x45, 0xBB, 0xE8, 0x12, 0x10, 0xE8, 0x95,
+ 0xB6, 0x13, 0xEF, 0x51, 0xA2, 0x24, 0x12, 0x7F, 0x6D, 0x05, 0x0E, 0x94, 0xF9, 0x92, 0xB8, 0x2E,
+ 0x64, 0x40, 0xDC, 0xDA, 0xDC, 0xDE, 0x82, 0x81, 0x9C, 0xE0, 0x0A, 0x27, 0xC6, 0x06, 0xB5, 0x01,
+ 0xBF, 0x36, 0x76, 0xF8, 0xB1, 0xE5, 0x3C, 0x42, 0xC3, 0x07, 0xE7, 0xBD, 0xFC, 0x7B, 0xFD, 0x70,
+ 0x4C, 0x17, 0x8F, 0x21, 0x9B, 0xBA, 0x06, 0xFC, 0x34, 0x56, 0xDD, 0x23, 0x7E, 0x2C, 0x8D, 0xF8,
+ 0x99, 0xD6, 0x69, 0xDA, 0x75, 0x42, 0x84, 0x43, 0xDB, 0x51, 0x12, 0xA0, 0x78, 0xEC, 0x95, 0x87,
+ 0x86, 0x84, 0xC9, 0x21, 0xEF, 0x8C, 0x0D, 0xEA, 0xBC, 0xE7, 0x5A, 0x23, 0x01, 0xB1, 0xBD, 0x6A,
+ 0x23, 0x49, 0x1C, 0x42, 0xED, 0x39, 0x5D, 0x26, 0xEF, 0x54, 0x36, 0x5E, 0xE8, 0xA8, 0xB0, 0xC9,
+ 0xF2, 0x39, 0xD0, 0x49, 0x10, 0x89, 0x2A, 0xF3, 0x4F, 0x3B, 0x3F, 0xF3, 0x6F, 0x98, 0xC0, 0xA2,
+ 0x37, 0xC5, 0x98, 0xCB, 0x7A, 0xE6, 0x78, 0x11, 0x15, 0x97, 0x77, 0x7D, 0x34, 0xE5, 0x67, 0x61,
+ 0x8B, 0xC7, 0x2B, 0xA2, 0xE8, 0x67, 0x3F, 0xBA, 0xD6, 0xEC, 0xC1, 0x5B, 0xF7, 0x4E, 0x70, 0xC3,
+ 0x1A, 0x98, 0x20, 0x05, 0xBA, 0x2D, 0x2B, 0x79, 0xB8, 0x10, 0xA3, 0x74, 0xC9, 0x50, 0xEC, 0x90,
+ 0x3C, 0xA9, 0xF8, 0xF7, 0xF9, 0x9F, 0xF9, 0xE1, 0x8E, 0x92, 0x40, 0xEE, 0x62, 0xCE, 0x36, 0x70,
+ 0x90, 0xAA, 0x3D, 0x17, 0xDF, 0x78, 0x8D, 0x49, 0xC1, 0x77, 0x9F, 0xF0, 0xBC, 0x8A, 0xF6, 0x06,
+ 0x90, 0xF5, 0x13, 0x51, 0xA7, 0x1B, 0xB8, 0x7B, 0x15, 0xAE, 0xBA, 0x54, 0x90, 0xCA, 0x01, 0x0C,
+ 0xB0, 0x82, 0xF1, 0xA6, 0x36, 0x0E, 0x1F, 0x40, 0x38, 0x19, 0xE5, 0x3D, 0x22, 0x12, 0x0A, 0xB7,
+ 0x17, 0x5D, 0x47, 0x46, 0x85, 0xE9, 0x40, 0xC3, 0x90, 0x6D, 0xAE, 0xBE, 0x95, 0xCA, 0xA1, 0x00,
+ 0x47, 0x6C, 0x6E, 0xCE, 0xBF, 0xAB, 0x0A, 0x9B, 0x73, 0x86, 0x4C, 0x64, 0x73, 0x7D, 0xF4, 0x01,
+ 0xCF, 0x4F, 0x4F, 0xBD, 0xFB, 0xC5, 0x37, 0xC1, 0x95, 0xAC, 0xCE, 0x58, 0x0A, 0x58, 0x26, 0x67,
+ 0xF2, 0x0B, 0x10, 0x13, 0xC5, 0x8D, 0x72, 0xAC, 0xCE, 0xC2, 0x7B, 0x74, 0xB6, 0x4A, 0xB6, 0x0A,
+ 0x8B, 0xD9, 0x27, 0x3A, 0x3D, 0x15, 0x42, 0xA4, 0xF5, 0xC3, 0x04, 0x91, 0x64, 0x05, 0xF1, 0x44,
+ 0x27, 0x9D, 0xBE, 0xB6, 0x24, 0xDA, 0x68, 0x7B, 0xDB, 0x5C, 0xF7, 0x02, 0x72, 0xF4, 0xBC, 0x88,
+ 0xF6, 0x8A, 0xE1, 0x45, 0xE8, 0x9D, 0x06, 0x5F, 0x37, 0x61, 0xF5, 0xD4, 0xE8, 0x37, 0xAA, 0xE7,
+ 0x79, 0xAA, 0x7C, 0x21, 0x93, 0x0C, 0x66, 0x95, 0x63, 0xE8, 0x25, 0xAD, 0xCB, 0xBD, 0x29, 0x96,
+ 0x7A, 0x87, 0x76, 0x18, 0xC4, 0x97, 0x74, 0x24, 0xF4, 0x00, 0x00, 0x0E, 0x7E, 0xB1, 0xAD, 0x5D,
+ 0xF1, 0x63, 0x3C, 0xF0, 0xA3, 0x21, 0x91, 0x04, 0x15, 0x5C, 0xCD, 0xEC, 0xA3, 0xDC, 0x39, 0x7A,
+ 0x85, 0x12, 0xFC, 0x4C, 0x7B, 0xF6, 0x01, 0x9D, 0xBC, 0x64, 0x31, 0x27, 0xFB, 0x20, 0x69, 0xB2,
+ 0x95, 0x8A, 0xB8, 0x53, 0x15, 0x0D, 0xE8, 0x12, 0x44, 0xA5, 0x96, 0x91, 0x19, 0xA1, 0xB5, 0x77,
+ 0xA2, 0xD2, 0x91, 0x63, 0xB2, 0x3B, 0x8C, 0x29, 0x5A, 0x77, 0xCB, 0x9A, 0x82, 0x17, 0x7C, 0xEB,
+ 0x9A, 0x8D, 0x1D, 0x38, 0xFD, 0x0D, 0x33, 0x62, 0xD3, 0xF1, 0x90, 0xA1, 0x41, 0x90, 0x85, 0x10,
+ 0x28, 0x1C, 0x73, 0x77, 0xD6, 0x64, 0xAE, 0xDE, 0x21, 0x5D, 0xE6, 0xD0, 0xBE, 0x59, 0xA8, 0x04,
+ 0xB1, 0xF1, 0x70, 0xA3, 0xDA, 0xD6, 0xB0, 0xBC, 0x7F, 0x3D, 0x60, 0x91, 0x38, 0xA3, 0xC9, 0xC1,
+ 0xBE, 0xA0, 0xD6, 0x4A, 0x8E, 0x33, 0xF6, 0x1A, 0x99, 0x20, 0xBF, 0xFC, 0x38, 0x9F, 0xD6, 0x66,
+ 0x6A, 0x61, 0xF7, 0xB0, 0x09, 0xC3, 0xB2, 0xD3, 0xC1, 0xA1, 0xB3, 0xB4, 0x6A, 0xE3, 0x94, 0xF5,
+ 0x92, 0xD3, 0xC0, 0xB6, 0x12, 0x53, 0x7A, 0xAC, 0x1E, 0x69, 0x58, 0x3B, 0x1C, 0x0F, 0x69, 0x9E,
+ 0x0E, 0xAA, 0xF4, 0xF2, 0x12, 0xAE, 0x66, 0x3B, 0x40, 0x4A, 0xC3, 0x19, 0x15, 0xDA, 0x08, 0x58,
+ 0x73, 0x1A, 0x9D, 0x18, 0xAD, 0xA7, 0xA3, 0x66, 0xD1, 0x5D, 0x9A, 0x36, 0x4E, 0xF0, 0xA5, 0x69,
+ 0x33, 0xD0, 0x8A, 0x11, 0x2E, 0xBA, 0x33, 0xCB, 0xBE, 0x4F, 0x63, 0x9D, 0x97, 0x50, 0x26, 0x96,
+ 0x8F, 0x6F, 0x4D, 0x30, 0x80, 0x72, 0x28, 0x5E, 0xA8, 0x74, 0x8E, 0x42, 0x9D, 0x15, 0xDA, 0xAC,
+ 0x36, 0x74, 0x91, 0xFA, 0x29, 0x8F, 0x54, 0xF5, 0x06, 0xCC, 0x80, 0x78, 0xED, 0x76, 0xDA, 0x3D,
+ 0x86, 0x9D, 0x9D, 0x3D, 0xA4, 0xA4, 0x7E, 0x9A, 0x80, 0xCC, 0x90, 0x7C, 0x90, 0x14, 0x8D, 0x33,
+ 0x30, 0x8B, 0xCB, 0x17, 0x36, 0xBB, 0xAF, 0xA7, 0xE6, 0x7C, 0xA3, 0xE1, 0x7D, 0xB0, 0xA1, 0x9A,
+ 0xA6, 0x28, 0xFE, 0x13, 0xA3, 0xFF, 0xE5, 0xE9, 0xC9, 0xBD, 0x1E, 0xEF, 0x2C, 0xB6, 0xFE, 0x6F,
+ 0x6E, 0xDD, 0x94, 0xAB, 0x1C, 0xCE, 0x6E, 0x2A, 0x30, 0x08, 0x82, 0xD3, 0xD1, 0xFB, 0xE3, 0xC8,
+ 0x63, 0x25, 0xB2, 0xF6, 0x67, 0x1D, 0x72, 0x57, 0x8B, 0xEE, 0x9F, 0x56, 0x2F, 0x16, 0x3E, 0x9B,
+ 0xEC, 0x27, 0xDE, 0x2E, 0x84, 0x97, 0x67, 0xA9, 0x69, 0x0D, 0xC5, 0x59, 0xC3, 0xC8, 0x74, 0xEE,
+ 0x04, 0x89, 0xEF, 0xF6, 0x4B, 0xB9, 0xA2, 0xE5, 0x82, 0x78, 0x1F, 0x49, 0xDB, 0x02, 0xC6, 0x56,
+ 0x4B, 0xD6, 0x25, 0xDB, 0xBD, 0xF9, 0x9C, 0xFD, 0x2E, 0xF3, 0x05, 0x5A, 0x73, 0x69, 0x2A, 0xE9,
+ 0x62, 0xD2, 0x10, 0x82, 0x9D, 0xC8, 0x6C, 0xDC, 0xC6, 0xF2, 0x18, 0x17, 0xEB, 0x2F, 0x91, 0xDC,
+ 0x30, 0x55, 0xDF, 0xD8, 0x7C, 0xA4, 0x79, 0xE0, 0xC5, 0x37, 0x9D, 0x23, 0xD5, 0xDF, 0xA4, 0xF2,
+ 0x1B, 0x60, 0xB6, 0xC7, 0x6F, 0x20, 0x5C, 0xFC, 0xF2, 0x6D, 0x01, 0x75, 0xFB, 0x50, 0x01, 0x5D,
+ 0x24, 0x48, 0x53, 0xBF, 0x27, 0x99, 0x73, 0x3A, 0x47, 0xD4, 0xDD, 0xBF, 0xE7, 0x41, 0xD3, 0x15,
+ 0x09, 0x21, 0x29, 0xDA, 0xFE, 0x6A, 0x8E, 0x20, 0xB8, 0x86, 0xC1, 0x8D, 0x54, 0x74, 0xC7, 0xD6,
+ 0x66, 0xA7, 0xE5, 0x67, 0xB9, 0xE8, 0x0A, 0x74, 0x3A, 0xF9, 0x4D, 0xAF, 0x54, 0x2D, 0xF0, 0x44,
+ 0x79, 0x04, 0x01, 0x54, 0x49, 0xF9, 0x04, 0x2A, 0xEF, 0xDD, 0x50, 0x19, 0xF6, 0x56, 0x0A, 0x34,
+ 0x58, 0x20, 0x90, 0x23, 0x94, 0x70, 0x43, 0xBC, 0xF3, 0x1E, 0xC0, 0x7D, 0xB5, 0xBD, 0xF0, 0xBF,
+ 0xC9, 0x1F, 0x93, 0x17, 0x1D, 0x56, 0xDF, 0xA0, 0x42, 0x9C, 0xAA, 0x31, 0xD1, 0xE0, 0x74, 0x0D,
+ 0x42, 0x02, 0x3B, 0x06, 0xF6, 0xC5, 0xA8, 0xBB, 0x17, 0x5C, 0xCD, 0x56, 0x71, 0x9E, 0xAA, 0x1E,
+ 0xE8, 0x96, 0x4E, 0x0D, 0x55, 0x4E, 0xA0, 0x9E, 0xDC, 0x30, 0x3E, 0x58, 0xD3, 0x62, 0xB6, 0xAB,
+ 0x3B, 0xCF, 0x4D, 0x2B, 0x4A, 0x17, 0x25, 0xFB, 0xCA, 0x5E, 0x0A, 0x3B, 0x82, 0x36, 0xCC, 0x6D,
+ 0x5D, 0x64, 0x86, 0x5C, 0x73, 0x1E, 0x86, 0xDC, 0x32, 0x5F, 0xF5, 0x2A, 0x2D, 0x58, 0x89, 0xDA,
+ 0x23, 0x1A, 0xAB, 0x0A, 0x6E, 0x5F, 0xD3, 0x84, 0x33, 0x33, 0xC7, 0xFD, 0x42, 0xE9, 0xD3, 0xBD,
+ 0x56, 0xE3, 0x70, 0x8A, 0xBA, 0x95, 0xAF, 0xF6, 0x0A, 0xA6, 0x22, 0x50, 0x3B, 0xCB, 0x1A, 0xE8,
+ 0x88, 0xDF, 0xD3, 0xE8, 0x94, 0x8C, 0xBF, 0xC7, 0x32, 0x4C, 0x31, 0x0F, 0x1E, 0x14, 0x95, 0x9C,
+ 0x2E, 0x08, 0x5B, 0x8B, 0x63, 0x62, 0x51, 0x5B, 0xAB, 0x8B, 0x81, 0x6E, 0xA2, 0x9B, 0xE3, 0x56,
+ 0x9B, 0x78, 0x44, 0x09, 0xCC, 0xD4, 0x69, 0xC4, 0xF0, 0x4F, 0x7D, 0xA9, 0x1B, 0xE1, 0xD7, 0xFB,
+ 0xD4, 0x44, 0x3F, 0xFF, 0x3E, 0xDB, 0xEC, 0xB7, 0x52, 0x91, 0x0E, 0xE6, 0xF7, 0xEF, 0x2F, 0x32,
+ 0x15, 0xC5, 0x25, 0xA6, 0x10, 0xDF, 0xD2, 0x2F, 0x5E, 0xD0, 0x50, 0x28, 0x47, 0xA2, 0x93, 0x37,
+ 0x42, 0x33, 0xC2, 0x3E, 0x2E, 0x1C, 0x1A, 0x52, 0xE5, 0x2C, 0x71, 0x6C, 0xB5, 0x4A, 0x78, 0xD2,
+ 0x60, 0xDE, 0x9D, 0x26, 0x8E, 0xAA, 0x3C, 0x31, 0xFA, 0x55, 0x78, 0x41, 0xD1, 0xBC, 0x9D, 0x19,
+ 0x85, 0x8B, 0x4C, 0xF9, 0x10, 0x95, 0x0E, 0x43, 0x8A, 0x34, 0x66, 0x4A, 0x5A, 0x4D, 0xD9, 0x4A,
+ 0xD6, 0x19, 0x23, 0xC9, 0x67, 0x6A, 0x81, 0x36, 0x87, 0xC2, 0x79, 0x89, 0xE7, 0x17, 0x90, 0x7E,
+ 0x5B, 0x61, 0x49, 0xD8, 0x05, 0xA0, 0x4F, 0x08, 0x9A, 0x77, 0x53, 0x6D, 0x8C, 0xD5, 0x36, 0x4F,
+ 0xE7, 0x4E, 0x56, 0xB4, 0xE1, 0xC0, 0x53, 0xD3, 0xB8, 0xBE, 0xB7, 0x90, 0xCA, 0xFE, 0xB9, 0x80,
+ 0x0E, 0x13, 0xB2, 0x7C, 0x8F, 0x66, 0x40, 0xCC, 0x8B, 0xB0, 0x7C, 0x32, 0x89, 0xDE, 0x2C, 0x5D,
+ 0x6A, 0xC5, 0xE9, 0x4B, 0x36, 0x38, 0xCD, 0x51, 0xE2, 0x97, 0x9F, 0x12, 0x45, 0x92, 0x68, 0x38,
+ 0xED, 0x62, 0x6A, 0xB6, 0x9A, 0x36, 0x82, 0x72, 0x43, 0x58, 0x0F, 0xA9, 0xB0, 0x4F, 0x12, 0xC9,
+ 0x32, 0x2C, 0xC0, 0xAF, 0xF6, 0xE5, 0x4D, 0x48, 0xBF, 0xDD, 0xEC, 0xDB, 0x28, 0xC9, 0xD3, 0x5B,
+ 0xE3, 0xFC, 0x7E, 0xAD, 0x76, 0x28, 0xD4, 0x23, 0x71, 0x85, 0xA5, 0x22, 0xE9, 0x93, 0x5E, 0x43,
+ 0xB5, 0x0F, 0xAE, 0xDF, 0x8B, 0x51, 0x41, 0x86, 0xC3, 0x55, 0xE4, 0x68, 0x43, 0x27, 0x7C, 0x0C,
+ 0x8F, 0x7F, 0xA0, 0x5A, 0x7A, 0xD7, 0x88, 0xC3, 0x8E, 0xF8, 0xC0, 0xF3, 0xB3, 0xC9, 0x15, 0x34,
+ 0x80, 0x16, 0x34, 0x13, 0x17, 0x6A, 0xD1, 0x59, 0x03, 0x94, 0x59, 0x7B, 0xA0, 0xE8, 0xE0, 0xA4,
+ 0x16, 0xFC, 0x76, 0xF0, 0x7C, 0x5A, 0x00, 0x01, 0x50, 0xE8, 0x56, 0xEF, 0x18, 0xC8, 0xDA, 0xBC,
+ 0xCD, 0xB8, 0x92, 0xB8, 0x22, 0xE3, 0xB5, 0x16, 0x05, 0x25, 0xE7, 0x65, 0x3D, 0x1C, 0x0F, 0x23,
+ 0xC5, 0x24, 0x16, 0x9E, 0x75, 0xCC, 0xF0, 0xF9, 0x19, 0x47, 0x83, 0xA0, 0x42, 0xBC, 0x36, 0x99,
+ 0x76, 0xE0, 0x27, 0xA9, 0xDB, 0x4A, 0x6E, 0x50, 0x22, 0x99, 0x4D, 0xDF, 0x43, 0x69, 0xA3, 0x95,
+ 0x48, 0x97, 0xC7, 0xC5, 0x4F, 0x1B, 0x2A, 0x32, 0xBA, 0x9F, 0xB9, 0x2D, 0x1D, 0xE3, 0x6E, 0x46,
+ 0x1F, 0xBD, 0x7A, 0x4F, 0x2A, 0x07, 0xB4, 0xA2, 0xC2, 0x31, 0xA9, 0x93, 0xE9, 0x98, 0x39, 0x93,
+ 0x89, 0x51, 0x82, 0x10, 0x99, 0xD5, 0x65, 0x25, 0x27, 0x37, 0xB1, 0x7E, 0x98, 0x50, 0xEC, 0xA7,
+ 0x29, 0xE0, 0xBE, 0xA4, 0x0C, 0xD5, 0x9B, 0x3D, 0xAD, 0x02, 0x4D, 0x81, 0x93, 0x0F, 0xA4, 0xD7,
+ 0xF4, 0x48, 0xCC, 0x4E, 0xF6, 0x6F, 0xF3, 0x5C, 0xF6, 0x5A, 0x2E, 0x05, 0xFA, 0xFB, 0x04, 0x8D,
+ 0x95, 0x29, 0x94, 0x03, 0x34, 0xF2, 0x33, 0xD9, 0x5B, 0x47, 0x96, 0x6C, 0x0C, 0xE6, 0x8E, 0xF2,
+ 0xD1, 0xF2, 0x83, 0x6A, 0xF2, 0x95, 0x4C, 0xBF, 0x46, 0xB4, 0x42, 0x95, 0xDA, 0x59, 0xBE, 0x32,
+ 0x2F, 0xFB, 0x7A, 0x33, 0xA0, 0x09, 0xB6, 0x34, 0x49, 0x4B, 0xA7, 0x9B, 0xF6, 0x56, 0xA9, 0xB7,
+ 0x5A, 0x98, 0xCD, 0x74, 0xF9, 0xBB, 0xD9, 0x1A, 0x46, 0x87, 0x5D, 0xA4, 0x81, 0x25, 0xB9, 0x9E,
+ 0x58, 0xF7, 0xBE, 0x19, 0x6E, 0x84, 0x50, 0x7D, 0x94, 0x3B, 0x57, 0x0A, 0x05, 0x81, 0x42, 0x2F,
+ 0x42, 0x90, 0x9B, 0xF1, 0xA7, 0x66, 0xD0, 0xD4, 0xF6, 0xD0, 0xB7, 0xE0, 0xDF, 0x2D, 0x6D, 0x60,
+ 0x11, 0xBE, 0xC8, 0xB3, 0x65, 0xEB, 0x71, 0x33, 0x74, 0xAD, 0xD0, 0x3B, 0x5D, 0x06, 0x79, 0x9B,
+ 0xD8, 0x03, 0xB7, 0x28, 0xEC, 0x2D, 0x3F, 0x82, 0xE5, 0xD4, 0x73, 0x01, 0xE8, 0x51, 0xD5, 0x04,
+ 0x46, 0x0D, 0xA9, 0x48, 0x83, 0x75, 0x88, 0x87, 0x4F, 0xA3, 0xC5, 0xCC, 0x0E, 0x39, 0x46, 0x9E,
+ 0xE8, 0xC7, 0x7C, 0xC2, 0xA1, 0xEA, 0x89, 0x08, 0xE4, 0x37, 0xAC, 0xC6, 0x2B, 0x50, 0x7D, 0x78,
+ 0x4F, 0x72, 0xC8, 0x96, 0xDC, 0x48, 0xB0, 0xEF, 0x69, 0x70, 0xDF, 0x85, 0x0A, 0xE8, 0xEF, 0x14,
+ 0xF9, 0x8C, 0xFE, 0x9E, 0xB1, 0xA4, 0x9B, 0x58, 0xC1, 0x77, 0x5E, 0x88, 0x3D, 0xB1, 0x39, 0xC9,
+ 0xE1, 0x8B, 0x4C, 0x16, 0xC2, 0x10, 0xD7, 0x4D, 0x11, 0x11, 0x3E, 0xD9, 0x60, 0xD1, 0xAB, 0x18,
+ 0x9D, 0x85, 0x8E, 0xFF, 0xFA, 0xB6, 0x09, 0x2B, 0xD2, 0x9A, 0xFD, 0x6F, 0x5C, 0x05, 0x51, 0x04,
+ 0x03, 0x25, 0x38, 0x12, 0xCD, 0xF1, 0x0B, 0x10, 0x28, 0x8A, 0x09, 0x2E, 0x2C, 0x38, 0x43, 0x19,
+ 0x40, 0xF8, 0x45, 0xFF, 0x80, 0x5D, 0xD4, 0xDB, 0x52, 0x2C, 0x51, 0x77, 0xD7, 0xB1, 0xFF, 0xED,
+ 0x06, 0x99, 0x56, 0x48, 0x53, 0x40, 0xF7, 0x80, 0xFB, 0x9C, 0x0E, 0x6F, 0x1D, 0x25, 0xAA, 0x4C,
+ 0x8E, 0x91, 0xE7, 0xC5, 0x0A, 0xDB, 0x3F, 0xEA, 0x48, 0xB9, 0xB2, 0xFA, 0x39, 0x46, 0x9E, 0x3A,
+ 0xC3, 0xDC, 0x15, 0xF9, 0xCF, 0x8C, 0xA7, 0x14, 0xFD, 0x16, 0x11, 0x69, 0xC7, 0xD9, 0x2B, 0x00,
+ 0xBA, 0xE7, 0x47, 0xB5, 0xF3, 0x74, 0x14, 0x11, 0xC5, 0x29, 0x5F, 0xA0, 0xF2, 0x0B, 0xB5, 0x45,
+ 0xEB, 0x88, 0x96, 0x1F, 0x26, 0xCC, 0x47, 0xD7, 0x5A, 0x96, 0x1A, 0xB5, 0xD7, 0x66, 0x98, 0xD0,
+ 0x65, 0xDC, 0xE2, 0x15, 0xAF, 0xAC, 0x7E, 0x60, 0xBE, 0x9E, 0x2D, 0xB5, 0x9B, 0xD9, 0x19, 0x36,
+ 0x53, 0x2F, 0xE4, 0x40, 0xD7, 0xDC, 0x82, 0x16, 0x8B, 0x99, 0x1B, 0xB3, 0x5C, 0xBB, 0x6A, 0x3F,
+ 0x90, 0xE4, 0xF8, 0x57, 0xDE, 0x9E, 0x63, 0xFD, 0x78, 0x4F, 0x0A, 0x26, 0x73, 0x0E, 0xD9, 0x47,
+ 0x8B, 0x52, 0xBF, 0x77, 0x75, 0x15, 0xD2, 0x70, 0xDC, 0x4B, 0x47, 0x1D, 0x6A, 0x7A, 0x5F, 0xFE,
+ 0x64, 0x89, 0xAB, 0xA1, 0x95, 0x8F, 0x27, 0xD1, 0xAD, 0x5C, 0x6D, 0xAB, 0xAF, 0x53, 0xA5, 0x7E,
+ 0xFC, 0x14, 0x02, 0xE0, 0xEA, 0x14, 0x60, 0x71, 0x20, 0xB5, 0x2B, 0x33, 0x47, 0xE8, 0x05, 0x82,
+ 0x4B, 0x85, 0xE3, 0xFE, 0x9D, 0x21, 0x95, 0x7F, 0x18, 0x11, 0xB4, 0x0D, 0x7F, 0xB6, 0xAB, 0xF4,
+ 0xF4, 0xE7, 0x43, 0x20, 0x50, 0x28, 0x72, 0x8B, 0x11, 0x83, 0xA5, 0xB6, 0x1E, 0x94, 0xF9, 0x25,
+ 0x94, 0x2B, 0xBC, 0xD6, 0x55, 0x41, 0xE4, 0xF0, 0xD9, 0xF5, 0x4D, 0x30, 0x4A, 0xD4, 0x9D, 0x3B,
+ 0x23, 0xE3, 0x95, 0x2E, 0xB6, 0x60, 0x0D, 0xAD, 0x28, 0xE5, 0xF9, 0x6E, 0x6A, 0x74, 0xB5, 0x6C,
+ 0x88, 0x59, 0x87, 0x30, 0x4A, 0x54, 0xE0, 0x80, 0xAA, 0x1E, 0x76, 0x02, 0x16, 0x55, 0xC5, 0xF2,
+ 0xC8, 0x38, 0xE3, 0x22, 0x12, 0x7A, 0x16, 0x51, 0xDB, 0x5B, 0x38, 0xF3, 0xE0, 0xC1, 0x45, 0x56,
+ 0x6A, 0xD3, 0xD3, 0x25, 0x59, 0x9A, 0x7A, 0x1F, 0x8A, 0xF4, 0xAF, 0x98, 0x4E, 0xC8, 0x1D, 0x6A,
+ 0x7E, 0x34, 0x4B, 0xD7, 0x85, 0x2F, 0xBB, 0x0F, 0x7B, 0xD4, 0x76, 0x44, 0x83, 0x8A, 0x76, 0x01,
+ 0x39, 0xAE, 0x88, 0xA5, 0xB0, 0xFC, 0xBF, 0xEA, 0xD1, 0xFD, 0x44, 0x25, 0x72, 0xD9, 0xBC, 0x3F,
+ 0xD9, 0xC1, 0x29, 0x44, 0x22, 0x0E, 0x6A, 0x49, 0xE1, 0x32, 0x23, 0xB3, 0x45, 0x80, 0x81, 0x9C,
+ 0x38, 0x88, 0xE7, 0x27, 0x66, 0x09, 0x90, 0xF2, 0xBD, 0x3C, 0x4B, 0x10, 0x98, 0x52, 0x4D, 0x81,
+ 0x26, 0x25, 0xD3, 0xE3, 0x66, 0x00, 0x27, 0x39, 0xBF, 0x6A, 0x40, 0x1D, 0x8F, 0x6F, 0x21, 0x16,
+ 0x22, 0x73, 0x1E, 0x9E, 0x11, 0xFF, 0xB8, 0xC9, 0x9A, 0x56, 0x35, 0x14, 0x78, 0xBD, 0x1F, 0x7B,
+ 0x89, 0x47, 0xB6, 0x6A, 0x51, 0xBC, 0x08, 0x9F, 0x3D, 0xCF, 0x1C, 0xC5, 0x2C, 0x82, 0x88, 0x72,
+ 0xCC, 0x35, 0x9B, 0xD7, 0x31, 0xFE, 0xAE, 0x40, 0x2D, 0xBF, 0x21, 0xC3, 0xF1, 0xA8, 0x39, 0xC0,
+ 0x59, 0xB4, 0x29, 0x7C, 0x5D, 0x5C, 0x0A, 0x7C, 0xD6, 0xA2, 0xB9, 0x5A, 0x69, 0x3A, 0xF2, 0xA5,
+ 0xB5, 0x40, 0x5D, 0x84, 0x1E, 0x8A, 0x93, 0x2B, 0x75, 0x8C, 0xF0, 0x7F, 0x57, 0x12, 0xB6, 0xF9,
+ 0xBB, 0xBE, 0x28, 0x20, 0x4B, 0xB1, 0xA8, 0x90, 0xE6, 0x6A, 0xE9, 0xB3, 0xB2, 0x14, 0xCE, 0xA0,
+ 0xCD, 0x9B, 0xD2, 0x8D, 0xEB, 0x34, 0xB2, 0x71, 0x86, 0x96, 0xFB, 0x88, 0x5E, 0x9F, 0x0D, 0xE6,
+ 0x99, 0x87, 0xAB, 0xAA, 0xF4, 0xEA, 0xD3, 0xFE, 0xCE, 0x6D, 0x2C, 0x93, 0x8A, 0x06, 0x16, 0x47,
+ 0xBB, 0xFF, 0xE0, 0xC5, 0x31, 0xF1, 0x46, 0x31, 0xB4, 0x6D, 0xFE, 0x9A, 0x62, 0xC0, 0xD9, 0x17,
+ 0xC2, 0x38, 0x18, 0x5C, 0xBA, 0x00, 0xCE, 0x10, 0x89, 0x96, 0x36, 0x82, 0x95, 0xD4, 0x76, 0x90,
+ 0x7D, 0x5D, 0x79, 0x59, 0x20, 0x63, 0xA4, 0x5F, 0x10, 0x5C, 0x08, 0xF4, 0x53, 0x39, 0xC7, 0x16,
+ 0xB7, 0xE7, 0x37, 0xC6, 0x67, 0x2D, 0x75, 0xA9, 0x86, 0x96, 0x3D, 0x55, 0x45, 0xFE, 0xFA, 0xC4,
+ 0xFE, 0x66, 0xEA, 0x53, 0xD3, 0x3C, 0x40, 0xA1, 0x96, 0x31, 0x0F, 0x2C, 0x56, 0x82, 0xF5, 0xAD,
+ 0x4B, 0x56, 0x1A, 0x04, 0x5E, 0xC0, 0x92, 0xED, 0x74, 0xF1, 0x9D, 0x11, 0x0F, 0x8F, 0x69, 0x90,
+ 0x53, 0x78, 0x71, 0x0D, 0x8A, 0x6C, 0x8E, 0xB0, 0xA2, 0x33, 0x38, 0x7E, 0x18, 0xC5, 0x28, 0xEE,
+ 0x4F, 0xE5, 0x57, 0xC5, 0x5E, 0x42, 0xDE, 0xA8, 0xB7, 0x77, 0xE5, 0x5D, 0xDD, 0xD9, 0xFE, 0xFF,
+ 0x69, 0xF6, 0x0A, 0xBF, 0xE1, 0x22, 0xEC, 0x09, 0xF3, 0x05, 0x61, 0x31, 0x71, 0x31, 0x06, 0x36,
+ 0x76, 0x34, 0xB4, 0x5B, 0x46, 0x4C, 0x7F, 0x26, 0x0F, 0x97, 0x75, 0x34, 0x75, 0x2B, 0x88, 0x1B,
+ 0xEC, 0xF7, 0x65, 0xF7, 0x92, 0x30, 0x04, 0xBA, 0x56, 0xBE, 0x44, 0xF8, 0x0C, 0x3A, 0x27, 0xD9,
+ 0xE1, 0x70, 0x10, 0x18, 0xE8, 0xE0, 0xB5, 0xC6, 0x1E, 0x0E, 0x11, 0x7C, 0xB8, 0x7C, 0x3E, 0xD1,
+ 0xDD, 0xEB, 0xA4, 0x14, 0x2F, 0xC1, 0xAB, 0x77, 0x0E, 0x51, 0x23, 0xCC, 0x5E, 0x34, 0x19, 0xC9,
+ 0xBD, 0x81, 0x96, 0x00, 0xD6, 0xE9, 0xAA, 0x82, 0xD3, 0xE6, 0x00, 0x09, 0x3E, 0xC0, 0xB6, 0x4F,
+ 0xF1, 0x39, 0x00, 0xF0, 0xD6, 0xB1, 0x7A, 0xA2, 0xD3, 0xD6, 0x08, 0x65, 0xE5, 0x4A, 0x84, 0xDA,
+ 0x85, 0x17, 0xAC, 0x17, 0x03, 0x35, 0x07, 0x8F, 0xF9, 0xB3, 0xCC, 0xC9, 0x3E, 0xF9, 0x4E, 0xA4,
+ 0x30, 0xE3, 0xC9, 0x96, 0x8B, 0x6B, 0x53, 0x4E, 0x11, 0xAF, 0x53, 0xAC, 0x92, 0x8E, 0xCC, 0xFE,
+ 0xCA, 0x12, 0x7F, 0x92, 0x0A, 0x62, 0x7A, 0x38, 0xCA, 0xAA, 0x89, 0x0C, 0x00, 0x91, 0xA1, 0x9F,
+ 0x96, 0x13, 0x2B, 0x46, 0x0E, 0x59, 0xC0, 0xF3, 0x49, 0xDC, 0xF0, 0xFA, 0xBF, 0x4D, 0xE7, 0xF3,
+ 0x0A, 0x82, 0x12, 0x05, 0xDE, 0xA5, 0xA9, 0x8B, 0x67, 0xD0, 0xF5, 0x0B, 0xEE, 0xA1, 0x73, 0x8F,
+ 0xCC, 0x47, 0x67, 0x7E, 0x83, 0x79, 0x56, 0x19, 0x49, 0x5B, 0xE0, 0x30, 0x5F, 0xE6, 0xCB, 0x6E,
+ 0xEC, 0x69, 0x31, 0xB8, 0x87, 0x6E, 0xC0, 0xEA, 0x76, 0x79, 0x3A, 0x1A, 0x05, 0x8B, 0xD3, 0xB1,
+ 0x56, 0x57, 0x13, 0xDF, 0x3A, 0x6F, 0x38, 0xFF, 0x3A, 0xFB, 0x59, 0x35, 0x37, 0xFA, 0x93, 0xBB,
+ 0xA3, 0x13, 0x69, 0xC1, 0xCA, 0x3B, 0x9C, 0x73, 0x51, 0x81, 0x38, 0x57, 0x12, 0x55, 0xA7, 0x7F,
+ 0x27, 0x87, 0x8B, 0x4A, 0x0C, 0x7F, 0x2D, 0x6C, 0x6E, 0xED, 0x69, 0xDD, 0xC3, 0x29, 0xDA, 0x67,
+ 0xDF, 0x2E, 0x9B, 0x3D, 0xB1, 0xA7, 0xFA, 0x1E, 0xF0, 0x09, 0xE2, 0x69, 0x4A, 0x97, 0xE0, 0x63,
+ 0x92, 0x16, 0xF1, 0x7C, 0x70, 0x50, 0x72, 0xFE, 0x96, 0x94, 0xE4, 0xAB, 0x5A, 0xCA, 0xEB, 0x69,
+ 0x3C, 0x12, 0xE5, 0x1A, 0xB8, 0x2C, 0x8C, 0x24, 0xA2, 0xF3, 0x2A, 0xFF, 0xA0, 0xEC, 0xE8, 0xDE,
+ 0xAF, 0x4C, 0xA0, 0xEB, 0x4D, 0x13, 0x77, 0x19, 0x23, 0xE3, 0xE2, 0x72, 0xC3, 0xD4, 0x3A, 0x70,
+ 0x1D, 0xA7, 0xE0, 0x92, 0x38, 0x98, 0x68, 0xBB, 0x82, 0x98, 0xC7, 0x30, 0x38, 0x50, 0x2A, 0xDF,
+ 0xAF, 0x9C, 0x7F, 0xAB, 0x8A, 0xBB, 0x98, 0x6A, 0x48, 0x4A, 0xE4, 0x29, 0x3F, 0x5A, 0xBE, 0x7D,
+ 0x3D, 0xC8, 0xCB, 0x13, 0x9E, 0x9D, 0x86, 0xC5, 0x96, 0x1C, 0xB4, 0xD6, 0xBF, 0x32, 0xE2, 0x4D,
+ 0x1B, 0x86, 0x1A, 0xFA, 0xD0, 0xFB, 0x25, 0xA2, 0xBA, 0x6F, 0xEE, 0x36, 0xF6, 0x24, 0xEC, 0x7D,
+ 0x8E, 0x96, 0xA4, 0x95, 0x4B, 0x3F, 0x5D, 0x1F, 0x11, 0x9B, 0xAD, 0x4B, 0xC5, 0x5C, 0x87, 0x58,
+ 0xA4, 0x56, 0xEB, 0xEA, 0x99, 0xC3, 0x85, 0x11, 0x01, 0x7B, 0xFD, 0x39, 0x33, 0xB9, 0xD7, 0xDC,
+ 0x26, 0x99, 0xCD, 0xB7, 0x7E, 0x7E, 0x60, 0xE7, 0x44, 0x29, 0x6C, 0x0C, 0xFB, 0x13, 0x71, 0x2B,
+ 0x5C, 0x13, 0x88, 0xFD, 0xB9, 0xF4, 0x53, 0x20, 0xD6, 0xBB, 0xEF, 0xF0, 0xDB, 0x53, 0x4A, 0xD0,
+ 0x1B, 0xF3, 0x6F, 0xDB, 0x8E, 0xF6, 0xB0, 0x46, 0x5C, 0x2A, 0xAD, 0xFB, 0x27, 0x52, 0xE5, 0xFD,
+ 0x3D, 0x9B, 0x56, 0x9F, 0x47, 0xBA, 0xA9, 0xB7, 0xAA, 0x5C, 0xB2, 0xFD, 0x4F, 0xA8, 0xAD, 0xA9,
+ 0xDB, 0xB2, 0x34, 0xE5, 0x86, 0xCB, 0x5F, 0xE7, 0x65, 0xEE, 0x92, 0x9D, 0x3E, 0x35, 0x42, 0x35,
+ 0x48, 0x03, 0x52, 0x31, 0x71, 0xCE, 0x72, 0xEC, 0x1F, 0x88, 0xCE, 0xDC, 0xB2, 0x38, 0x32, 0xEA,
+ 0x1B, 0x71, 0x22, 0xFC, 0x14, 0x53, 0xD8, 0x2E, 0x6B, 0xF3, 0xDB, 0xF9, 0x3F, 0x01, 0xDC, 0xEF,
+ 0xFE, 0x74, 0xE4, 0xE1, 0x7B, 0x55, 0x21, 0xB5, 0x40, 0x78, 0x87, 0x76, 0xFC, 0xFA, 0x36, 0x25,
+ 0x45, 0xB9, 0x47, 0x2A, 0x65, 0x56, 0x75, 0x8E, 0xDC, 0x6E, 0x27, 0x2D, 0x43, 0x82, 0xCC, 0x76,
+ 0xA0, 0x48, 0x33, 0x88, 0x5B, 0x58, 0xF3, 0x83, 0x6D, 0x8C, 0x1E, 0xFC, 0xA3, 0x1A, 0xAC, 0x74,
+ 0xB4, 0x38, 0x47, 0xCA, 0x20, 0x06, 0x14, 0xAB, 0x5A, 0xBD, 0x5E, 0x38, 0x5A, 0x1E, 0x88, 0xC7,
+ 0xF9, 0x69, 0x7D, 0xBF, 0x91, 0x2C, 0x51, 0x18, 0x95, 0xF6, 0x19, 0x98, 0x79, 0xFC, 0x69, 0xFD,
+ 0xF7, 0xA9, 0x21, 0xA1, 0xD4, 0xBF, 0xC5, 0x21, 0xF5, 0xBA, 0xD2, 0x9B, 0xF8, 0xA5, 0x40, 0x57,
+ 0xD1, 0x10, 0x47, 0x0F, 0x93, 0x50, 0x0F, 0x5D, 0x97, 0x96, 0x14, 0x2B, 0x71, 0x63, 0x88, 0xEC,
+ 0xA1, 0x92, 0xF0, 0x76, 0x86, 0x5C, 0xCC, 0x37, 0x86, 0x04, 0xD2, 0xB0, 0xDD, 0x53, 0x82, 0xD6,
+ 0x28, 0xCC, 0x05, 0x60, 0xE1, 0x3F, 0x27, 0xD2, 0x1C, 0x80, 0x68, 0xAA, 0xA9, 0x16, 0xCD, 0xF5,
+ 0x82, 0x55, 0x11, 0xDD, 0x05, 0x2D, 0x56, 0x9F, 0xC9, 0x92, 0xA2, 0xB8, 0xDF, 0xD9, 0x32, 0x28,
+ 0xD4, 0xE9, 0xEA, 0x7E, 0x93, 0x5D, 0x33, 0x96, 0x77, 0x81, 0xCF, 0x63, 0xE2, 0xC5, 0xC4, 0x41,
+ 0x89, 0x0A, 0x64, 0xCC, 0x68, 0xD3, 0x3A, 0x80, 0x1A, 0xAC, 0x36, 0xDC, 0x50, 0x95, 0x5B, 0x8A,
+ 0xE7, 0x24, 0xAD, 0x65, 0xC9, 0x86, 0x2A, 0xC2, 0x0C, 0x48, 0xB0, 0xDD, 0x33, 0x53, 0x1F, 0x08,
+ 0x35, 0x9B, 0x91, 0x52, 0xBB, 0xA8, 0x85, 0xE2, 0xA9, 0x0D, 0x22, 0x80, 0x1D, 0xCA, 0x57, 0xA5,
+ 0x52, 0xE4, 0xDA, 0x10, 0x7C, 0x31, 0xDB, 0xAA, 0x27, 0x98, 0x85, 0xB7, 0xC7, 0x4E, 0xFC, 0x9D,
+ 0x39, 0x8A, 0x10, 0x30, 0x78, 0x4B, 0xB3, 0x3C, 0xAF, 0xAB, 0xE7, 0xD9, 0xBB, 0xB4, 0x11, 0x3E,
+ 0x59, 0x32, 0x2A, 0xD8, 0x89, 0xD8, 0xF5, 0xEB, 0x45, 0xFC, 0xEF, 0x8B, 0x78, 0xCF, 0x10, 0x1B,
+ 0xCF, 0x4A, 0x2C, 0x24, 0x57, 0xED, 0x82, 0x2E, 0x4B, 0xC9, 0x1A, 0xC8, 0x1C, 0xD0, 0x5D, 0xE1,
+ 0x87, 0x6E, 0xEA, 0xED, 0xD9, 0x0D, 0xC9, 0x1C, 0x59, 0x14, 0x85, 0xFB, 0x60, 0xFE, 0x62, 0x06,
+ 0x4A, 0xB9, 0x0F, 0x0E, 0x83, 0xFE, 0x14, 0x1A, 0x7F, 0x6F, 0xFB, 0xC0, 0xBF, 0x76, 0x02, 0x3C,
+ 0xAB, 0x58, 0x86, 0xB0, 0xDA, 0x69, 0xE7, 0xFD, 0x2B, 0x4C, 0x47, 0x66, 0xAB, 0xAB, 0xFF, 0x5D,
+ 0xA0, 0xF2, 0x95, 0x47, 0xC8, 0x23, 0xB8, 0x58, 0xA2, 0x74, 0x9D, 0x65, 0x6D, 0x3F, 0xC9, 0xD9,
+ 0xC0, 0xE9, 0x8A, 0x62, 0x0A, 0x6E, 0x1F, 0xE7, 0xD2, 0x86, 0x97, 0x26, 0xA4, 0x0A, 0x9C, 0x54,
+ 0x44, 0xC8, 0x8C, 0x4E, 0x3B, 0xA9, 0xE6, 0x97, 0xBE, 0xBE, 0x16, 0x09, 0xE3, 0xC7, 0xCA, 0x68,
+ 0x47, 0x24, 0x80, 0x22, 0x27, 0x0D, 0xC7, 0xE4, 0x11, 0x68, 0xD2, 0x1A, 0x79, 0x61, 0x89, 0x59,
+ 0xD5, 0xA3, 0x99, 0xDF, 0x9C, 0x5B, 0x10, 0x58, 0x36, 0x6D, 0xDE, 0x9F, 0xB5, 0xC2, 0xF2, 0x9F,
+ 0x68, 0x99, 0x95, 0xD1, 0x79, 0x08, 0x8F, 0xE4, 0xEC, 0x82, 0x7D, 0x70, 0xCF, 0xEA, 0x77, 0x00,
+ 0x0A, 0x0A, 0xE6, 0x39, 0x45, 0x96, 0xB6, 0xA1, 0xC0, 0xA3, 0xAA, 0x64, 0xF8, 0x3B, 0xD2, 0xF7,
+ 0x5C, 0xAD, 0xC0, 0x62, 0x93, 0xDA, 0xAE, 0x08, 0x5F, 0xB5, 0x10, 0x7F, 0x14, 0xB6, 0x91, 0xC3,
+ 0xEC, 0xBB, 0x0F, 0x18, 0x4B, 0x88, 0xBE, 0xFF, 0xA2, 0xF1, 0x02, 0x48, 0x03, 0x6C, 0x6A, 0x5C,
+ 0xAE, 0x7F, 0xBB, 0xA3, 0x02, 0x25, 0x6E, 0x13, 0x9B, 0x64, 0x8C, 0x6B, 0x3D, 0xC1, 0xC6, 0xC7,
+ 0xB6, 0xA8, 0xF2, 0x85, 0x12, 0x87, 0xEA, 0xE0, 0x07, 0x3A, 0xEE, 0x2F, 0xC2, 0x68, 0xB8, 0x05,
+ 0xB5, 0x55, 0x15, 0xDF, 0x21, 0x78, 0x9D, 0x21, 0x80, 0xE8, 0x91, 0xA4, 0x97, 0x1C, 0x08, 0xDB,
+ 0x68, 0xA8, 0xEF, 0x25, 0x00, 0xEE, 0xAC, 0xD7, 0x87, 0x26, 0xD6, 0x27, 0xB8, 0xE5, 0x85, 0x79,
+ 0x3F, 0xA4, 0xE9, 0xC8, 0x51, 0x44, 0xAF, 0xAE, 0x32, 0x08, 0x57, 0x1D, 0xC6, 0xB7, 0x4D, 0x43,
+ 0xDC, 0x3D, 0x27, 0xD4, 0x34, 0x53, 0xEA, 0x1A, 0xFA, 0x57, 0x11, 0x04, 0xC1, 0x70, 0x7D, 0x88,
+ 0x9B, 0x35, 0xAA, 0xBE, 0x23, 0xD4, 0x10, 0xFB, 0xEA, 0x9C, 0x4A, 0xBC, 0xA5, 0xC0, 0x4E, 0xE1,
+ 0x2C, 0x30, 0x15, 0x1B, 0xA6, 0xFA, 0x7C, 0x27, 0x78, 0xA3, 0x2B, 0xF7, 0x90, 0x20, 0x4B, 0xB2,
+ 0xBD, 0xEE, 0x11, 0xD1, 0x53, 0xEB, 0xBC, 0x33, 0xAD, 0x87, 0xD5, 0x15, 0x6B, 0x69, 0xFD, 0x20,
+ 0x3E, 0x74, 0xF3, 0x9D, 0x24, 0x9A, 0xC7, 0x39, 0xEB, 0xD2, 0x81, 0x24, 0x7A, 0x75, 0x20, 0x20,
+ 0xA3, 0x2B, 0xB6, 0x59, 0x62, 0x54, 0xE4, 0x6F, 0x03, 0x41, 0xCD, 0x3A, 0x13, 0x69, 0x5C, 0xDA,
+ 0xD6, 0xE1, 0x64, 0x14, 0x4F, 0x05, 0x03, 0x04, 0x4F, 0x1A, 0x38, 0xF8, 0x40, 0x9E, 0xA1, 0x38,
+ 0xDA, 0x20, 0xB5, 0x54, 0xC6, 0x0D, 0x1D, 0x58, 0xE4, 0x45, 0x10, 0xF5, 0x9C, 0xA6, 0xA4, 0x90,
+ 0x64, 0x35, 0xE6, 0xF0, 0xFE, 0x58, 0x47, 0xC6, 0x84, 0xA6, 0x69, 0x62, 0xCC, 0xFA, 0x50, 0xFA,
+ 0xAC, 0x24, 0x5E, 0x72, 0xCF, 0x4C, 0xAF, 0xCF, 0xF1, 0x12, 0xB8, 0x62, 0xA0, 0xF1, 0xB6, 0x36,
+ 0xF7, 0x3E, 0xD5, 0x3F, 0x2B, 0xD5, 0xC3, 0x57, 0xE7, 0x84, 0x9E, 0xCE, 0x48, 0x21, 0x90, 0x09,
+ 0x5D, 0x62, 0xBB, 0xDC, 0x5A, 0x93, 0x20, 0x6D, 0xF3, 0x8F, 0x9C, 0x51, 0x97, 0x74, 0xC7, 0x55,
+ 0x08, 0xD9, 0x42, 0x11, 0x70, 0x55, 0x08, 0x96, 0x2D, 0xC2, 0x5C, 0x0B, 0x02, 0x6D, 0xFC, 0x3A,
+ 0xCD, 0x21, 0xF2, 0x72, 0xD6, 0x78, 0x3B, 0xD5, 0x52, 0xC9, 0xE9, 0x94, 0x51, 0x2F, 0xBA, 0x27,
+ 0x99, 0x6B, 0xF1, 0xF2, 0xFA, 0xBF, 0x15, 0x68, 0xD1, 0xC6, 0x8A, 0x86, 0x3A, 0x51, 0x45, 0xB2,
+ 0xE9, 0x5D, 0xD1, 0x82, 0xC3, 0x32, 0x28, 0xD3, 0x8B, 0xFB, 0x90, 0x6D, 0x96, 0x9E, 0x65, 0x07,
+ 0xE1, 0x05, 0x28, 0x52, 0xE6, 0x93, 0x93, 0x4B, 0xB1, 0x44, 0xE1, 0xD5, 0xB5, 0x65, 0x1D, 0x1D,
+ 0x5C, 0xFA, 0xB0, 0xCA, 0xC3, 0x9D, 0xCD, 0xAC, 0x11, 0xFF, 0x81, 0x44, 0x91, 0xB0, 0x1C, 0xC8,
+ 0x6F, 0x21, 0xC2, 0x61, 0x95, 0x61, 0x49, 0x19, 0x3F, 0x67, 0x9A, 0xC0, 0x7F, 0xEE, 0xCF, 0xE8,
+ 0x5E, 0x75, 0x03, 0x56, 0x4D, 0x24, 0x61, 0xF9, 0xD8, 0x98, 0xA1, 0x2B, 0xD1, 0x8C, 0x40, 0x9B,
+ 0xDC, 0xB6, 0x5C, 0xC0, 0xD6, 0x84, 0x67, 0x2E, 0x00, 0x2A, 0x89, 0xCE, 0x0A, 0x6D, 0x06, 0x23,
+ 0x64, 0x10, 0xD5, 0xD2, 0x17, 0xC5, 0xF9, 0x98, 0xEE, 0xE6, 0xFC, 0x16, 0x6B, 0x0E, 0xAD, 0x40,
+ 0x4D, 0x2D, 0x78, 0x9C, 0x75, 0x60, 0xDD, 0x55, 0x5B, 0x9F, 0xDF, 0xE0, 0x70, 0x2A, 0x72, 0xF3,
+ 0x10, 0x31, 0x0F, 0xB9, 0xA6, 0xDC, 0x3E, 0x0C, 0x9D, 0x20, 0x91, 0xA6, 0x0F, 0x4E, 0x49, 0x0D,
+ 0x3D, 0x2C, 0x2D, 0x33, 0x32, 0x31, 0x1E, 0xF6, 0x89, 0xD6, 0x66, 0xF0, 0x98, 0x1E, 0x11, 0x36,
+ 0xE2, 0xF2, 0xDE, 0x09, 0x5F, 0x7B, 0x29, 0xA2, 0x51, 0x47, 0xA6, 0xAC, 0x2B, 0xE2, 0x5A, 0xAE,
+ 0x7F, 0x38, 0xA5, 0xF6, 0xFE, 0x61, 0x42, 0x70, 0xB9, 0xCC, 0xCC, 0xD7, 0x23, 0x0F, 0xBF, 0xCC,
+ 0x87, 0x48, 0x31, 0x38, 0x1B, 0x7A, 0x4B, 0x9E, 0xEB, 0x1F, 0x3D, 0x16, 0x55, 0xFA, 0xDB, 0xC2,
+ 0xA0, 0xFF, 0xDC, 0x34, 0x4B, 0x0D, 0x3C, 0x33, 0x55, 0x87, 0x7E, 0x73, 0xCD, 0x66, 0x8A, 0x5D,
+ 0x3F, 0xE4, 0xFE, 0xF1, 0x56, 0xFE, 0xB1, 0xB1, 0x09, 0x4E, 0x1D, 0xA5, 0xEE, 0xD5, 0x6D, 0x9F,
+ 0xA3, 0xA9, 0xCB, 0x16, 0xE4, 0x62, 0x87, 0x1F, 0xB5, 0x88, 0xFB, 0x2B, 0x77, 0xA0, 0xB8, 0x9D,
+ 0x51, 0x1F, 0x88, 0x60, 0x45, 0x69, 0x2A, 0x46, 0x1E, 0x7B, 0x7F, 0x63, 0x98, 0x59, 0x8A, 0x75,
+ 0x6C, 0x4E, 0xFE, 0xFD, 0xC1, 0xCB, 0x68, 0x10, 0x71, 0x38, 0x8F, 0x1A, 0x50, 0xF5, 0x4A, 0xE3,
+ 0x82, 0x28, 0x46, 0x4A, 0x72, 0x0A, 0x86, 0xF9, 0xE0, 0xF4, 0x7E, 0xCB, 0x3A, 0xB5, 0x6C, 0x6A,
+ 0x6B, 0x14, 0x1B, 0x0E, 0xAD, 0x60, 0xCE, 0x39, 0x8F, 0x62, 0x3F, 0x2A, 0x33, 0xBC, 0xF3, 0x03,
+ 0x90, 0x40, 0x3B, 0x5E, 0x30, 0x77, 0xE0, 0xA4, 0xAA, 0x5D, 0xC3, 0xCF, 0x43, 0x0F, 0xF7, 0x1C,
+ 0x4E, 0x60, 0x87, 0x82, 0xB6, 0x5A, 0xF3, 0x35, 0x17, 0x48, 0xFB, 0x8F, 0x34, 0xCB, 0xED, 0x6F,
+ 0xFC, 0xB8, 0x73, 0xBB, 0x09, 0xCE, 0x07, 0x89, 0x58, 0xEB, 0xC4, 0x82, 0x67, 0x45, 0xAD, 0xCA,
+ 0xD9, 0x49, 0xE4, 0x00, 0xAA, 0x5A, 0xED, 0x61, 0xA6, 0x49, 0x1A, 0xB6, 0xC8, 0x09, 0xDE, 0xAA,
+ 0x65, 0x1A, 0x0C, 0xF5, 0xDF, 0xA9, 0x2B, 0xB6, 0x91, 0xE9, 0xF0, 0x08, 0x2A, 0xBB, 0x4A, 0x04,
+ 0x30, 0x0C, 0x71, 0x64, 0xE2, 0xCF, 0xF3, 0xD4, 0x1E, 0x99, 0x9A, 0x2B, 0x11, 0x5D, 0x29, 0x61,
+ 0xC6, 0x2C, 0xC1, 0xA7, 0x05, 0xE8, 0x9B, 0xD0, 0xE4, 0xD2, 0x56, 0x96, 0x5E, 0xA9, 0x25, 0x96,
+ 0x25, 0xBC, 0xBC, 0x12, 0xE5, 0x50, 0x47, 0x4C, 0x8D, 0xBF, 0xA6, 0xDA, 0x0A, 0x88, 0x70, 0x2F,
+ 0x74, 0x2D, 0xE9, 0xCD, 0xD8, 0xF6, 0xD9, 0x76, 0x37, 0x9A, 0x1F, 0x1D, 0x3D, 0x10, 0xBA, 0xD0,
+ 0x3C, 0x13, 0x56, 0x73, 0x79, 0x97, 0xB9, 0x55, 0x9D, 0x8B, 0xF3, 0xD5, 0x87, 0x0B, 0x1D, 0x97,
+ 0x53, 0xD0, 0xF9, 0xA9, 0x76, 0x3B, 0xDE, 0x18, 0x3C, 0xE8, 0xF0, 0x81, 0x13, 0x16, 0x5A, 0x7D,
+ 0x59, 0xF1, 0x9E, 0xE3, 0xC5, 0xBA, 0xFC, 0xB7, 0x7E, 0x5F, 0x05, 0xF4, 0x38, 0x6C, 0xA1, 0x09,
+ 0xAA, 0x15, 0x4C, 0xC5, 0xF6, 0xE7, 0x25, 0x72, 0xC4, 0xAA, 0x82, 0xFE, 0xEB, 0x3F, 0xBC, 0x6B,
+ 0x26, 0xB2, 0xAD, 0x85, 0x83, 0xFB, 0xFA, 0xD9, 0x2D, 0x78, 0x50, 0xBE, 0xF6, 0x70, 0xB4, 0x8A,
+ 0xDB, 0x71, 0xA2, 0x60, 0x80, 0x7A, 0x91, 0xB2, 0x74, 0x54, 0x81, 0xB5, 0xF7, 0x48, 0x77, 0x96,
+ 0x05, 0xD6, 0x34, 0xC1, 0x06, 0x0E, 0x35, 0x20, 0x39, 0x28, 0x2D, 0x57, 0xC1, 0x75, 0xA2, 0x26,
+ 0x0B, 0xEB, 0x59, 0x12, 0x07, 0x46, 0x35, 0x1B, 0x7D, 0x2A, 0x5B, 0x0D, 0x19, 0x1A, 0xBD, 0x09,
+ 0x5D, 0xEF, 0x7A, 0x79, 0x7F, 0xB1, 0xD6, 0x45, 0x00, 0xC3, 0x3E, 0xB2, 0xA9, 0x03, 0x19, 0x43,
+ 0xC3, 0x53, 0x73, 0x24, 0xA2, 0xEC, 0x9B, 0x88, 0x09, 0xF4, 0x5C, 0xB5, 0xC0, 0x69, 0x00, 0xB6,
+ 0xB4, 0x80, 0xDE, 0x9A, 0x7A, 0x85, 0x1D, 0xA7, 0x85, 0x81, 0x3D, 0x83, 0x41, 0x85, 0xA5, 0x32,
+ 0x7B, 0x7D, 0x47, 0xEB, 0x35, 0x07, 0x3C, 0xED, 0xBC, 0x6B, 0xEF, 0xB0, 0x1A, 0x6F, 0x33, 0x0A,
+ 0x2C, 0xBA, 0x54, 0xF8, 0xEE, 0xA9, 0xB4, 0x2A, 0x17, 0x8A, 0x1E, 0x6C, 0x58, 0xFB, 0x09, 0xF0,
+ 0x76, 0x0F, 0x03, 0xD3, 0x34, 0xC1, 0xC2, 0xA1, 0xCD, 0x96, 0x21, 0xFC, 0x9C, 0x21, 0x3D, 0xB6,
+ 0xA2, 0xD1, 0xA2, 0x0F, 0x24, 0xF6, 0x33, 0xB4, 0xB4, 0x36, 0xCA, 0x12, 0x25, 0x52, 0x85, 0x5B,
+ 0x07, 0x82, 0xAF, 0xB8, 0x8B, 0xB1, 0x36, 0x67, 0x32, 0xAF, 0x51, 0x74, 0xDE, 0x15, 0x9B, 0xE7,
+ 0xD9, 0x6D, 0x2C, 0xEA, 0xDE, 0x68, 0x99, 0x66, 0x31, 0x87, 0x7D, 0xEA, 0xA8, 0x4D, 0xF4, 0x06,
+ 0xB5, 0x28, 0xD8, 0x93, 0xB8, 0x38, 0xB3, 0x2D, 0xA2, 0xA8, 0xCD, 0x03, 0x96, 0x61, 0xD1, 0x7B,
+ 0x49, 0x11, 0xE8, 0xEE, 0x25, 0xCE, 0x44, 0xA7, 0x77, 0xED, 0x72, 0xA3, 0xF4, 0xA7, 0xCB, 0x2D,
+ 0x9D, 0xC5, 0xBA, 0x89, 0xBD, 0x9A, 0xC0, 0x84, 0xDD, 0x14, 0x09, 0x1C, 0x11, 0x17, 0x4F, 0x99,
+ 0x23, 0xDA, 0xD2, 0xD4, 0x68, 0x4E, 0x7B, 0xFC, 0x85, 0x24, 0xE7, 0x1A, 0x79, 0xA5, 0x91, 0x9E,
+ 0xD8, 0xBB, 0x0E, 0xFA, 0xC4, 0x99, 0x31, 0xFB, 0x02, 0x4C, 0x15, 0xEC, 0x38, 0x6E, 0xBC, 0xF8,
+ 0xA1, 0xCB, 0xAD, 0x8D, 0x12, 0x66, 0x91, 0x61, 0xAF, 0xA8, 0x01, 0x86, 0xF7, 0x8A, 0x54, 0x30,
+ 0x40, 0xDE, 0x3F, 0x83, 0xA4, 0x9C, 0x43, 0x98, 0x50, 0x21, 0x12, 0xB3, 0x20, 0x53, 0xE5, 0x46,
+ 0x82, 0x7E, 0xDF, 0x59, 0x1E, 0x19, 0x0C, 0x2B, 0xFF, 0x77, 0x92, 0x25, 0xF4, 0x31, 0xDA, 0x82,
+ 0xDA, 0x3A, 0x73, 0xF8, 0x2E, 0x83, 0x30, 0xBF, 0x1E, 0x47, 0x46, 0x2C, 0x62, 0xBA, 0xA7, 0x95,
+ 0x5D, 0xE2, 0xB8, 0x7A, 0xE2, 0x3F, 0xD9, 0x6C, 0xEF, 0xC8, 0x47, 0xA7, 0x19, 0x60, 0x56, 0xC0,
+ 0x8F, 0xB4, 0x8E, 0x1F, 0x33, 0xAD, 0x2A, 0x08, 0xDA, 0x53, 0x52, 0x2D, 0x86, 0x14, 0x6A, 0xB5,
+ 0x94, 0xD0, 0xFC, 0xEE, 0xE6, 0xDD, 0x76, 0xC6, 0x91, 0xCA, 0x3D, 0x00, 0xA4, 0x63, 0x3A, 0x38,
+ 0xE4, 0x79, 0xDE, 0x44, 0x48, 0x41, 0x50, 0x9C, 0x1A, 0xCB, 0x15, 0x68, 0xD5, 0xE5, 0xE8, 0x00,
+ 0x69, 0x3E, 0x2B, 0x82, 0x3B, 0x3D, 0x0A, 0x8F, 0x8B, 0xBE, 0x98, 0x08, 0xD9, 0x66, 0xC3, 0xF2,
+ 0xC9, 0x6E, 0xDF, 0xD0, 0xDC, 0xB1, 0x24, 0x91, 0xA8, 0x70, 0xFA, 0xD2, 0xD7, 0x43, 0x25, 0xE1,
+ 0x04, 0xDA, 0xED, 0x5D, 0xBF, 0xD0, 0x1A, 0x8B, 0xBD, 0x22, 0xA1, 0xEC, 0x90, 0x76, 0xBF, 0x07,
+ 0xE2, 0xA5, 0xB4, 0x4D, 0xEA, 0x39, 0xDA, 0x95, 0x2F, 0xE0, 0x77, 0x23, 0x07, 0x48, 0x28, 0x57,
+ 0x35, 0xD7, 0x30, 0xC0, 0xB2, 0xFC, 0x6E, 0x2B, 0x2F, 0xF3, 0x44, 0x9C, 0xD8, 0xBF, 0xD9, 0x44,
+ 0x2D, 0x92, 0xDF, 0x51, 0x7A, 0x6E, 0xBB, 0x69, 0xC9, 0xA8, 0xC2, 0x27, 0x15, 0x8F, 0x88, 0xE3,
+ 0xFD, 0x96, 0xD4, 0x1D, 0x1A, 0xF9, 0xB7, 0x2C, 0x54, 0xE5, 0xA6, 0x4B, 0xBC, 0xC3, 0x89, 0xFD,
+ 0x09, 0xAB, 0xB9, 0xB2, 0xC2, 0xF1, 0xB6, 0x9E, 0xFA, 0x2E, 0xF1, 0x6A, 0x2A, 0x3F, 0x3A, 0xDC,
+ 0x21, 0x66, 0x76, 0xB5, 0x7C, 0xEA, 0xE5, 0xE0, 0xD9, 0xA9, 0x14, 0x92, 0xD6, 0x0D, 0x04, 0xB4,
+ 0x04, 0x8A, 0xF6, 0xF1, 0x85, 0x69, 0xF4, 0x1F, 0x8D, 0xBC, 0x6A, 0x9B, 0x7F, 0x0D, 0x7C, 0xC7,
+ 0x4C, 0x26, 0x60, 0x4F, 0xB0, 0x08, 0x5D, 0x15, 0x72, 0x02, 0x2E, 0xD1, 0xF1, 0xD1, 0xED, 0x8F,
+ 0x0A, 0x8B, 0x8A, 0xD1, 0x18, 0x18, 0x77, 0x40, 0x40, 0x35, 0x2B, 0xDB, 0x28, 0x9B, 0x0B, 0x32,
+ 0xBF, 0x17, 0x54, 0x3B, 0xF5, 0xEF, 0xED, 0x6A, 0x6C, 0x4D, 0x8C, 0x27, 0xF5, 0x36, 0xD2, 0x97,
+ 0x20, 0x3E, 0x72, 0x50, 0x91, 0x79, 0x93, 0x53, 0x53, 0xA3, 0x50, 0xD3, 0x09, 0xAF, 0x36, 0x90,
+ 0x0A, 0xAA, 0xE6, 0x19, 0x05, 0x5D, 0x5D, 0x6D, 0x04, 0x9A, 0x08, 0x7A, 0xD9, 0x06, 0x9C, 0x03,
+ 0xD9, 0x12, 0xFA, 0x36, 0x10, 0xEB, 0x9C, 0x4C, 0x74, 0xEC, 0x69, 0x36, 0xB3, 0x8A, 0x0C, 0x22,
+ 0xA6, 0xB3, 0xF1, 0xAE, 0x70, 0x8B, 0xA8, 0x38, 0x08, 0x0F, 0x42, 0x40, 0x89, 0x6D, 0x09, 0xEC,
+ 0x71, 0x44, 0x8F, 0xD1, 0xC7, 0xCB, 0x8F, 0x4C, 0xEC, 0xC8, 0x5B, 0x7D, 0xB1, 0x77, 0x36, 0x66,
+ 0xA6, 0xDF, 0x29, 0x2B, 0x2F, 0x5E, 0x8D, 0x3D, 0xE6, 0x38, 0xC1, 0x32, 0x0B, 0x64, 0x90, 0xB1,
+ 0xA7, 0x03, 0x4A, 0x41, 0x94, 0xE6, 0xFF, 0x37, 0x1E, 0x75, 0xD4, 0x1C, 0x71, 0x63, 0xB4, 0x64,
+ 0x9B, 0x1B, 0x4C, 0x7B, 0xFB, 0x16, 0x95, 0x95, 0xDB, 0xB6, 0x08, 0x93, 0x9B, 0x7B, 0x86, 0xA0,
+ 0x53, 0x24, 0x40, 0x7F, 0x2F, 0xF0, 0x86, 0xE4, 0x89, 0x02, 0x88, 0xBA, 0x25, 0xE9, 0xD9, 0x46,
+ 0x08, 0x1C, 0xBD, 0x73, 0x81, 0xBB, 0x48, 0x55, 0x65, 0x46, 0x9D, 0x06, 0x75, 0x99, 0x75, 0x7A,
+ 0x06, 0x3E, 0x4B, 0x25, 0x8D, 0x7B, 0x78, 0x81, 0xC6, 0x98, 0xAA, 0x20, 0x22, 0x8B, 0x74, 0x6B,
+ 0x01, 0x1E, 0x7A, 0x36, 0x39, 0xC7, 0x53, 0x09, 0x53, 0x92, 0xF0, 0x1A, 0x49, 0x2E, 0x91, 0x26,
+ 0x02, 0xEB, 0x14, 0xEE, 0x8D, 0x48, 0xC1, 0x79, 0x01, 0x1B, 0x03, 0x33, 0x7B, 0xD1, 0xAE, 0x99,
+ 0xD9, 0xDE, 0x17, 0xAB, 0xBE, 0xA8, 0x38, 0xAD, 0x8B, 0x82, 0x60, 0x4E, 0xF3, 0xF0, 0xB2, 0xFB,
+ 0x51, 0x14, 0x57, 0x9A, 0xE3, 0xDC, 0xB0, 0x5C, 0x66, 0xDD, 0xFE, 0x2A, 0x5A, 0x10, 0x23, 0x2F,
+ 0xBA, 0x07, 0x3C, 0x48, 0x37, 0x6A, 0x29, 0xA5, 0x6C, 0xC5, 0x1E, 0xCF, 0x36, 0x1C, 0x0B, 0x4B,
+ 0x1F, 0x39, 0x8C, 0xAF, 0x16, 0x50, 0xEB, 0x42, 0x30, 0x5F, 0x23, 0x74, 0x85, 0x94, 0xFA, 0x69,
+ 0x53, 0x95, 0xF8, 0xAF, 0x78, 0xDD, 0x88, 0x82, 0xC6, 0xEA, 0xBB, 0xB1, 0xAF, 0x12, 0xE8, 0x97,
+ 0x9A, 0xBB, 0x70, 0x8C, 0x5D, 0x0B, 0x89, 0xB1, 0x86, 0x2F, 0x7C, 0x8B, 0x59, 0x57, 0x2D, 0xC9,
+ 0xC8, 0x8A, 0xDC, 0xA1, 0xCD, 0xE1, 0x5D, 0x15, 0x2E, 0x6C, 0x9C, 0xAA, 0x22, 0x0A, 0x93, 0x6B,
+ 0x8B, 0x9A, 0xDF, 0xE7, 0xBE, 0xD9, 0x29, 0x02, 0x09, 0x8A, 0x7B, 0x14, 0xA4, 0x86, 0xF2, 0x50,
+ 0xFC, 0x64, 0xAA, 0x69, 0xC8, 0x8B, 0xB7, 0xA9, 0x55, 0xFB, 0x1F, 0xD4, 0x35, 0x91, 0xCE, 0x81,
+ 0xBC, 0xC6, 0x54, 0x2A, 0x86, 0x2F, 0x02, 0x90, 0xB7, 0x01, 0x15, 0x31, 0x69, 0x67, 0x18, 0xA0,
+ 0x2B, 0x90, 0x3A, 0xA9, 0xA1, 0x38, 0xDD, 0xA7, 0x42, 0x92, 0xE8, 0x71, 0xCE, 0x32, 0x18, 0x73,
+ 0xCB, 0x1D, 0xC3, 0xA2, 0xF8, 0x1C, 0x6B, 0x60, 0xED, 0xCA, 0x0F, 0xF6, 0xB5, 0x80, 0x7A, 0x7A,
+ 0x33, 0x6D, 0xD1, 0x6D, 0xD1, 0x8C, 0xD1, 0x58, 0x3E, 0xA7, 0x7A, 0x95, 0x30, 0x65, 0xBD, 0x07,
+ 0x15, 0xC1, 0xFC, 0xFF, 0x41, 0x93, 0x5F, 0x7C, 0x7F, 0x30, 0x66, 0x52, 0x44, 0x16, 0x39, 0x6D,
+ 0x42, 0x9D, 0x0D, 0xF1, 0x72, 0x69, 0x11, 0x53, 0xC3, 0xA0, 0x9B, 0x89, 0xB6, 0xE4, 0x8C, 0x4B,
+ 0x87, 0x80, 0x9A, 0xB4, 0x3E, 0x33, 0x8D, 0xAB, 0x81, 0x15, 0x05, 0x19, 0x87, 0xB1, 0xDA, 0x05,
+ 0x4B, 0x60, 0xBA, 0x1D, 0xE7, 0x3B, 0x7E, 0x42, 0xAB, 0x5A, 0xD0, 0x21, 0x30, 0xB5, 0x78, 0xB5,
+ 0xC0, 0x8F, 0x83, 0x39, 0x7A, 0x7A, 0xAF, 0x4F, 0x9B, 0xCC, 0xD9, 0xDA, 0x01, 0x9C, 0xFE, 0xAD,
+ 0xAB, 0xE7, 0xF7, 0x2F, 0xC1, 0xE6, 0x32, 0xC4, 0x9F, 0xCD, 0x10, 0xF2, 0xA5, 0x0F, 0xDD, 0x54,
+ 0x98, 0xEA, 0x57, 0x7C, 0x43, 0x39, 0xAA, 0x95, 0x83, 0x7E, 0x1B, 0x34, 0x3A, 0x29, 0xF7, 0x07,
+ 0xC0, 0x8B, 0xAF, 0x48, 0x71, 0xED, 0xEA, 0x7F, 0x73, 0xD6, 0x0E, 0x6D, 0x96, 0xC3, 0x0F, 0x9F,
+ 0xA9, 0x5C, 0x98, 0x00, 0x16, 0xC4, 0xC6, 0x72, 0xEF, 0x00, 0x27, 0x01, 0x31, 0x75, 0x18, 0x28,
+ 0x75, 0xE5, 0xCB, 0x4D, 0x9E, 0x25, 0xCD, 0x72, 0xD8, 0xAA, 0x1B, 0x0B, 0x35, 0x6A, 0xDC, 0x0A,
+ 0x11, 0x85, 0x01, 0x7B, 0x94, 0x29, 0xA8, 0x41, 0x29, 0xD4, 0xCE, 0xBE, 0x7B, 0x14, 0x45, 0x52,
+ 0x56, 0xEB, 0x4E, 0x45, 0x14, 0x62, 0x87, 0xA4, 0x29, 0x24, 0xF6, 0xF8, 0x70, 0x77, 0x29, 0x6A,
+ 0xB6, 0x56, 0x46, 0x20, 0x5A, 0x9C, 0x45, 0x3A, 0x54, 0x6B, 0xF8, 0x2B, 0x4A, 0xCA, 0x8E, 0xBB,
+ 0x97, 0x15, 0xAC, 0x6B, 0x60, 0x34, 0x73, 0x6F, 0x26, 0xEA, 0x1F, 0x1F, 0x8C, 0x10, 0x40, 0x46,
+ 0x10, 0x09, 0x16, 0x37, 0x26, 0x86, 0xB1, 0xCF, 0x29, 0x28, 0x9F, 0x14, 0x75, 0x6C, 0xEE, 0x7F,
+ 0x92, 0xFB, 0x95, 0xD6, 0xFA, 0x8F, 0x13, 0x75, 0x37, 0xA5, 0xCC, 0x8A, 0x8E, 0xD0, 0x50, 0x9D,
+ 0x80, 0x3B, 0xD8, 0x1E, 0x5A, 0xA4, 0x66, 0xA9, 0x5D, 0xC7, 0xB2, 0x25, 0x3D, 0xCB, 0x36, 0x82,
+ 0x36, 0x9F, 0xCD, 0x11, 0x07, 0x6B, 0x94, 0xED, 0x1D, 0xB2, 0x5A, 0xD8, 0x39, 0xEE, 0xC9, 0x5F,
+ 0x5A, 0xDC, 0x2D, 0xDE, 0x75, 0x9D, 0x3C, 0x6E, 0xA0, 0xD3, 0x61, 0x96, 0x08, 0x44, 0x37, 0x31,
+ 0x62, 0xDB, 0xC1, 0xEC, 0x72, 0x7A, 0xDF, 0x29, 0xD7, 0x94, 0x10, 0x42, 0xA0, 0x77, 0xC4, 0x3E,
+ 0xA2, 0x6D, 0x4D, 0x0D, 0x3F, 0xFA, 0x9A, 0x3B, 0x3D, 0x7D, 0x86, 0xD1, 0x91, 0x96, 0x3F, 0x6C,
+ 0x9C, 0xEF, 0x83, 0xE7, 0x31, 0xC9, 0xEB, 0x7B, 0xDA, 0x82, 0x7A, 0xAA, 0xF9, 0xD7, 0xB2, 0x55,
+ 0x39, 0xE8, 0xF4, 0xEC, 0x06, 0xE8, 0x1C, 0x22, 0x68, 0x18, 0x10, 0x8F, 0xF9, 0x13, 0x0C, 0x0E,
+ 0xEC, 0x26, 0xDB, 0x0D, 0x03, 0xE1, 0x24, 0xC1, 0x97, 0xDB, 0x13, 0xA1, 0x2C, 0xFC, 0x61, 0x32,
+ 0xC6, 0x1B, 0xFB, 0x4F, 0x7C, 0x18, 0xD4, 0x85, 0x1E, 0x14, 0xEE, 0x45, 0x1A, 0x0C, 0xA3, 0xD0,
+ 0x2A, 0x8F, 0x44, 0x10, 0x7F, 0x32, 0xC3, 0x6E, 0xF9, 0x57, 0x6D, 0x59, 0x49, 0xAA, 0xD0, 0x5D,
+ 0xBA, 0xB7, 0xA5, 0x28, 0xD3, 0xE9, 0x1E, 0x99, 0xB1, 0x46, 0x4B, 0xF5, 0x8D, 0x4A, 0xE1, 0x11,
+ 0xAF, 0x9F, 0xBE, 0x3A, 0x21, 0xE1, 0x3F, 0x8F, 0x83, 0xF0, 0x2F, 0x30, 0xB6, 0x59, 0x4F, 0x03,
+ 0x17, 0xDA, 0x32, 0x7F, 0x01, 0x0F, 0x58, 0xB1, 0xAC, 0x04, 0xA5, 0xC3, 0x4D, 0x5C, 0x13, 0xFD,
+ 0x14, 0x58, 0x8D, 0xEE, 0x78, 0x82, 0xBD, 0xD4, 0xFE, 0xA3, 0x7F, 0xDC, 0x78, 0x44, 0x07, 0x3A,
+ 0x4A, 0x64, 0x31, 0x1A, 0x7F, 0xBD, 0x5E, 0x7D, 0x20, 0x99, 0x3B, 0xE3, 0x2B, 0x99, 0x89, 0xDA,
+ 0xEA, 0x73, 0x13, 0x5E, 0x53, 0x5C, 0x93, 0x93, 0xE9, 0x8B, 0xEA, 0x7E, 0xB5, 0xAA, 0xDD, 0xA0,
+ 0x63, 0x0C, 0xB1, 0x2F, 0x2C, 0xD7, 0xAA, 0x13, 0x51, 0x5D, 0xA8, 0x5C, 0x97, 0x9A, 0x9B, 0xF2,
+ 0x70, 0x0D, 0xA6, 0x1C, 0x6E, 0xD1, 0xA5, 0xBA, 0xB8, 0x62, 0x78, 0x00, 0xB1, 0xE5, 0x5D, 0xB5,
+ 0x9F, 0xD0, 0x0C, 0x06, 0x51, 0x9E, 0x41, 0xF0, 0xE3, 0xBA, 0x46, 0x39, 0x83, 0x39, 0xAF, 0x7A,
+ 0xDF, 0x5C, 0x0E, 0xDB, 0xE4, 0xEB, 0x4C, 0x0E, 0x99, 0xC3, 0xD7, 0x95, 0x31, 0xBF, 0xDB, 0x2D,
+ 0xB1, 0x21, 0xA8, 0xDD, 0xB6, 0xB8, 0xAE, 0x08, 0x0A, 0x71, 0x23, 0xF9, 0xE1, 0x57, 0xAD, 0xB8,
+ 0x19, 0xBA, 0x39, 0xB6, 0x65, 0xAC, 0xC3, 0x42, 0x6F, 0xB9, 0x4A, 0xD9, 0xB5, 0xB9, 0xA9, 0x1E,
+ 0xE5, 0xA7, 0x3F, 0xE6, 0x40, 0x63, 0x02, 0x2F, 0xF2, 0x01, 0x0D, 0x07, 0xA1, 0x2F, 0xC3, 0x65,
+ 0xC0, 0x58, 0x2D, 0x21, 0xBC, 0x4C, 0x6E, 0x51, 0xF4, 0xB0, 0xF4, 0x87, 0x79, 0xA5, 0x74, 0x08,
+ 0xF7, 0xFB, 0xF6, 0xF9, 0x13, 0x49, 0x11, 0xBC, 0x36, 0x14, 0x87, 0x20, 0x06, 0x74, 0xBA, 0x1E,
+ 0xCF, 0x92, 0xBC, 0xC3, 0x26, 0x6D, 0xD9, 0x05, 0xC6, 0x08, 0x91, 0x97, 0x8F, 0x0F, 0xC1, 0x9A,
+ 0x3A, 0x91, 0x9C, 0x5F, 0xBE, 0x51, 0x9D, 0x01, 0xA4, 0xF3, 0xAA, 0x26, 0x5E, 0x25, 0xDE, 0xF2,
+ 0x01, 0x6B, 0x84, 0x85, 0x46, 0xBF, 0x8C, 0xCB, 0xBC, 0x24, 0x39, 0x88, 0xB7, 0x2E, 0x5B, 0xD4,
+ 0x36, 0x12, 0xD4, 0xFD, 0xAE, 0x81, 0xA3, 0x9E, 0xD6, 0xE8, 0xA2, 0x40, 0xBD, 0x22, 0xBA, 0x0D,
+ 0x51, 0x8C, 0x67, 0xBC, 0x54, 0x13, 0x3C, 0x1D, 0x05, 0x20, 0xA8, 0x9D, 0x61, 0x0A, 0x74, 0x73,
+ 0x99, 0x5E, 0xBD, 0xB3, 0x10, 0xD9, 0xC7, 0x7C, 0x58, 0x24, 0xF5, 0x9F, 0xFA, 0x13, 0x35, 0x83,
+ 0x1A, 0x14, 0x13, 0x7B, 0x3B, 0xB6, 0xF5, 0x16, 0xB2, 0x75, 0xC2, 0x9E, 0x41, 0x83, 0xC5, 0x68,
+ 0x8C, 0xDF, 0xFC, 0xC1, 0x2E, 0xAC, 0xFC, 0x08, 0x1C, 0xE5, 0x2D, 0x15, 0x0D, 0xB8, 0xE2, 0x3F,
+ 0xD7, 0xA1, 0x46, 0x9E, 0xCB, 0x46, 0x4A, 0x4A, 0x71, 0x88, 0x4E, 0x61, 0x0F, 0x82, 0x34, 0xF0,
+ 0xC5, 0xEA, 0xD0, 0x08, 0x9A, 0xCF, 0xAE, 0x93, 0xEB, 0x69, 0x06, 0x2D, 0x96, 0x1F, 0x96, 0x70,
+ 0xDE, 0x1A, 0x87, 0xA0, 0x24, 0x7E, 0x1F, 0x8E, 0x9C, 0xDB, 0x77, 0xC1, 0x95, 0xDC, 0xDE, 0x9E,
+ 0xE7, 0xEE, 0x85, 0xD9, 0xB4, 0xEC, 0xD5, 0x2A, 0xDF, 0xF7, 0xCD, 0xA6, 0x2B, 0x81, 0xFA, 0xE6,
+ 0x10, 0xB1, 0x3B, 0x03, 0x23, 0xE0, 0xBD, 0xA1, 0xA4, 0x7F, 0x89, 0x69, 0x55, 0x78, 0x14, 0xB1,
+ 0x86, 0x07, 0x6E, 0xB0, 0xB2, 0xB3, 0x96, 0xFD, 0xA0, 0x03, 0x00, 0xC1, 0xF5, 0x60, 0xAA, 0x62,
+ 0xD4, 0xB2, 0xC7, 0xA3, 0x9E, 0x25, 0xF5, 0xF5, 0xB3, 0x85, 0x1D, 0xD2, 0x47, 0xDB, 0xF3, 0x1E,
+ 0x70, 0x85, 0xAC, 0x30, 0x02, 0x87, 0xF4, 0xEB, 0xB8, 0x99, 0xFB, 0x65, 0xAA, 0x56, 0x3F, 0xDC,
+ 0x5C, 0x52, 0x2C, 0x2A, 0xDE, 0x23, 0xEA, 0xE7, 0xD0, 0x20, 0x9C, 0xF3, 0x9A, 0xA9, 0x16, 0x4C,
+ 0xCE, 0x29, 0x87, 0x08, 0x52, 0xA4, 0x5D, 0x3A, 0x4C, 0xC6, 0x2C, 0x13, 0x16, 0x94, 0x3E, 0x14,
+ 0x5B, 0x50, 0x92, 0x34, 0xC2, 0x64, 0x7A, 0x95, 0x89, 0x5C, 0xCA, 0x82, 0xF8, 0x59, 0x7B, 0x27,
+ 0xAA, 0x0F, 0x64, 0x45, 0xBB, 0xFA, 0x61, 0x30, 0x30, 0x57, 0x6E, 0x3A, 0x69, 0x1A, 0x8F, 0x3E,
+ 0xB7, 0x63, 0xCB, 0x86, 0xF6, 0xE2, 0xC6, 0xDF, 0xFB, 0xE5, 0xB7, 0xEA, 0x3B, 0xF5, 0x28, 0x31,
+ 0x6C, 0x44, 0x54, 0xD3, 0xEC, 0x37, 0x77, 0xB9, 0xF7, 0x08, 0xF1, 0x05, 0xDA, 0x16, 0xB8, 0x95,
+ 0x69, 0x5E, 0x84, 0x49, 0x31, 0xC5, 0xEC, 0x06, 0x30, 0x82, 0x52, 0xC2, 0x46, 0xB2, 0xE3, 0x47,
+ 0xE6, 0x60, 0x12, 0x1C, 0x96, 0xDC, 0xBB, 0x08, 0x60, 0x4A, 0xC3, 0x01, 0x4D, 0xBC, 0x1A, 0x4E,
+ 0xF8, 0x3C, 0x06, 0x66, 0xF0, 0x78, 0xB9, 0x6D, 0x04, 0x66, 0x60, 0xDF, 0x7E, 0x5F, 0x2C, 0x07,
+ 0x2A, 0x5A, 0x4F, 0x13, 0x59, 0x40, 0x26, 0x6F, 0xC6, 0x4A, 0x37, 0xE9, 0x5E, 0x58, 0x41, 0xEF,
+ 0xCD, 0xCE, 0x89, 0xAD, 0xAB, 0x72, 0xEF, 0x16, 0x8B, 0x7D, 0x66, 0x1A, 0x98, 0xFC, 0x8B, 0xC2,
+ 0xF7, 0xFD, 0xC3, 0xF9, 0x51, 0xCF, 0x26, 0x06, 0xC6, 0x28, 0x2C, 0x2E, 0x8D, 0x53, 0xBE, 0xD8,
+ 0xA7, 0x26, 0xC3, 0xD6, 0xD8, 0x05, 0xCD, 0x19, 0xCC, 0xA3, 0x23, 0x14, 0x74, 0xC2, 0x97, 0x01,
+ 0x1C, 0x0B, 0x96, 0x22, 0xE2, 0x94, 0x23, 0xD8, 0xC2, 0x1B, 0xF7, 0x03, 0xB5, 0x1E, 0x35, 0x2C,
+ 0x9A, 0x9B, 0xCC, 0x7A, 0x1F, 0x04, 0x52, 0x26, 0x69, 0xD7, 0x6A, 0x21, 0xEA, 0xA8, 0x3A, 0x62,
+ 0x51, 0xA2, 0x02, 0xB2, 0x37, 0x13, 0xC0, 0x57, 0xCC, 0x1D, 0xC4, 0xFF, 0xE6, 0x90, 0xC1, 0x86,
+ 0x20, 0x5B, 0x03, 0xED, 0x6F, 0x32, 0x77, 0x9A, 0x86, 0xB1, 0x1C, 0x89, 0xFB, 0x9B, 0x2B, 0xF4,
+ 0x86, 0xE9, 0xB9, 0xF0, 0x39, 0xF9, 0x85, 0x51, 0x0C, 0x62, 0x95, 0x01, 0x28, 0xD7, 0x6F, 0xB7,
+ 0xBF, 0xC7, 0x2F, 0x2F, 0xF8, 0xAC, 0x31, 0xD1, 0xF8, 0x5D, 0x37, 0xDC, 0xBE, 0x98, 0x2D, 0x76,
+ 0xC4, 0x9C, 0x20, 0xDA, 0xB6, 0xF3, 0xC3, 0xC0, 0x31, 0x14, 0xBF, 0x2B, 0x87, 0x00, 0x66, 0x4A,
+ 0xE2, 0x50, 0x49, 0x84, 0x1E, 0x97, 0x85, 0xB8, 0xED, 0x33, 0x2B, 0xF8, 0x59, 0xC9, 0x03, 0x3F,
+ 0x5A, 0x28, 0xA7, 0xB8, 0xFB, 0x9F, 0x2E, 0x44, 0xFA, 0x2E, 0x6D, 0xFF, 0x40, 0x9E, 0x21, 0xE4,
+ 0x05, 0xB6, 0x31, 0x76, 0xAE, 0xDB, 0x76, 0x96, 0x88, 0x4D, 0x96, 0xCE, 0x1E, 0xD4, 0x22, 0x91,
+ 0xE4, 0xA8, 0x91, 0x5B, 0xED, 0xA4, 0x03, 0x10, 0x06, 0x8C, 0x24, 0xE4, 0xC4, 0x80, 0x16, 0x4D,
+ 0x50, 0xAF, 0xC1, 0x64, 0x4A, 0xA4, 0xB9, 0x79, 0xE3, 0x37, 0x38, 0x7D, 0x8A, 0x85, 0x90, 0xB7,
+ 0x1C, 0x7D, 0x24, 0x26, 0x7F, 0x5F, 0x0C, 0x9D, 0xB3, 0x2D, 0x4D, 0xB0, 0xEE, 0xAC, 0x95, 0x8F,
+ 0x2E, 0x5A, 0xA2, 0x78, 0x7D, 0x0D, 0xDA, 0x99, 0x47, 0x93, 0x13, 0xF9, 0x0C, 0xFF, 0x5E, 0x71,
+ 0x99, 0x8D, 0xE3, 0x21, 0x03, 0x44, 0xF7, 0x4D, 0x61, 0xD0, 0x1D, 0x47, 0xCB, 0x3D, 0x57, 0x4D,
+ 0x43, 0x3C, 0x01, 0xBB, 0x33, 0xC2, 0x04, 0x91, 0x66, 0xC9, 0xA1, 0xF2, 0x18, 0x47, 0x0D, 0x60,
+ 0x61, 0x9F, 0xA7, 0x27, 0x99, 0xB5, 0x27, 0x88, 0x60, 0x2B, 0x8D, 0x3C, 0x8F, 0xD5, 0x53, 0xDD,
+ 0x64, 0xC5, 0x14, 0xB3, 0x77, 0x5C, 0xDE, 0xA9, 0x91, 0x2E, 0x23, 0x83, 0x24, 0xE3, 0xE6, 0x38,
+ 0xC5, 0xCB, 0x9B, 0x4E, 0xC4, 0xEE, 0x3D, 0x7D, 0x58, 0x6C, 0x60, 0x16, 0x97, 0xBC, 0xF6, 0x47,
+ 0x77, 0x83, 0xCE, 0xF1, 0xA9, 0x8F, 0xDA, 0xFF, 0xB3, 0xE4, 0x52, 0x50, 0x67, 0xBA, 0x13, 0x2A,
+ 0xAB, 0xB4, 0x32, 0xC0, 0x4C, 0xAE, 0xBC, 0x92, 0x3C, 0x65, 0x97, 0xA4, 0xD8, 0x10, 0xDF, 0x60,
+ 0x95, 0xCA, 0x74, 0x17, 0x3F, 0x8A, 0xC5, 0x2A, 0x9F, 0xAF, 0xDB, 0xA4, 0x3C, 0x77, 0x01, 0xA6,
+ 0x02, 0x66, 0x0C, 0x15, 0x0F, 0x00, 0x90, 0xBD, 0x9B, 0x77, 0x53, 0xFD, 0x93, 0x44, 0x6F, 0x86,
+ 0x50, 0x54, 0x11, 0x40, 0xBE, 0x72, 0xD2, 0xE5, 0x4B, 0xA4, 0x13, 0x88, 0x0D, 0xAA, 0x87, 0xFB,
+ 0xED, 0x6E, 0x66, 0x59, 0xFB, 0xB8, 0xA0, 0xFE, 0xD1, 0x08, 0x27, 0x07, 0xC4, 0x31, 0x31, 0x8C,
+ 0x6F, 0xE2, 0x0B, 0x23, 0x95, 0x96, 0xF6, 0x3B, 0xD9, 0xD4, 0xB6, 0x5D, 0x84, 0xC2, 0xC4, 0x23,
+ 0xE9, 0xF2, 0xB6, 0x96, 0x9E, 0xD0, 0x4A, 0xE2, 0x2D, 0xAB, 0xBB, 0xB0, 0xAA, 0xEC, 0xFE, 0x67,
+ 0x3A, 0xF9, 0x1A, 0xA8, 0x30, 0xDA, 0x9A, 0x17, 0xD5, 0x46, 0xCC, 0xBA, 0xF7, 0xDA, 0x8E, 0x54,
+ 0x49, 0x58, 0xBE, 0x9C, 0x3B, 0x7E, 0x4E, 0xE4, 0x06, 0x8E, 0x32, 0xB4, 0x7A, 0xEA, 0xF8, 0x40,
+ 0x78, 0xD4, 0x62, 0xBD, 0xAC, 0xA7, 0x9F, 0x0B, 0x27, 0xC4, 0x90, 0xA1, 0xDF, 0x15, 0x64, 0xBA,
+ 0xEC, 0xCB, 0x69, 0xF7, 0xBF, 0xE6, 0x0D, 0x89, 0x6E, 0x5D, 0x62, 0x5D, 0xEA, 0x04, 0x37, 0x1B,
+ 0x40, 0x04, 0x37, 0x3B, 0xD0, 0xC6, 0xE0, 0xFC, 0x63, 0xA6, 0xA1, 0xC8, 0xAB, 0x45, 0xA4, 0xFD,
+ 0x05, 0xFA, 0x57, 0x01, 0x5F, 0x34, 0x76, 0x0B, 0xCF, 0xB0, 0xD3, 0xFD, 0xED, 0x66, 0xAC, 0xFB,
+ 0x63, 0x89, 0x53, 0x46, 0x61, 0xFF, 0x22, 0x64, 0xEB, 0x20, 0x60, 0x02, 0x0B, 0x78, 0xA4, 0xEC,
+ 0xF9, 0x1D, 0x34, 0xAB, 0x98, 0x33, 0xB7, 0x76, 0x4D, 0xDA, 0x4C, 0x33, 0x57, 0xD6, 0x23, 0x84,
+ 0x25, 0x76, 0x4A, 0x0B, 0xDD, 0xC5, 0xCD, 0x8B, 0xFF, 0xB8, 0x22, 0x37, 0x16, 0xAB, 0xCE, 0xDD,
+ 0x92, 0xDB, 0xD1, 0x12, 0xB3, 0x52, 0xD0, 0xE5, 0x4E, 0xBE, 0x69, 0xA8, 0xDF, 0x2F, 0xAF, 0x22,
+ 0x29, 0xD0, 0x28, 0xD3, 0x80, 0xA1, 0x39, 0x57, 0x88, 0x17, 0xBA, 0x63, 0x75, 0xD7, 0xB9, 0x05,
+ 0xBC, 0x4E, 0x60, 0x02, 0xAC, 0x84, 0x96, 0xD9, 0x23, 0x1E, 0xE3, 0xDA, 0xD6, 0x74, 0xC2, 0xCD,
+ 0xA4, 0x22, 0x65, 0x82, 0x50, 0x10, 0xFE, 0x76, 0xF5, 0xE7, 0x61, 0x0D, 0x86, 0xD9, 0x8D, 0x56,
+ 0x10, 0x43, 0x9C, 0xFE, 0x05, 0x3A, 0x51, 0x93, 0x81, 0x74, 0xD2, 0x11, 0x10, 0x82, 0xFC, 0x4C,
+ 0xA1, 0x83, 0x64, 0x21, 0x4B, 0xEB, 0xA9, 0x8E, 0x9A, 0xB8, 0xAB, 0x95, 0x15, 0x96, 0x9D, 0x49,
+ 0x9D, 0xFE, 0xEC, 0xC8, 0xC3, 0x6B, 0xBB, 0x4C, 0x8E, 0x75, 0xBB, 0x8C, 0x42, 0x76, 0x18, 0x8E,
+ 0x6F, 0xE0, 0xD6, 0x7C, 0x19, 0xDA, 0x08, 0xD7, 0xE1, 0x73, 0x6C, 0x18, 0x1B, 0x90, 0xCF, 0x6E,
+ 0x18, 0xE4, 0x61, 0xC7, 0x1B, 0xE3, 0x93, 0x22, 0x80, 0xB0, 0xE6, 0x66, 0xA0, 0xF7, 0x06, 0xA9,
+ 0x1E, 0xD8, 0x62, 0xC5, 0xE3, 0x52, 0x59, 0xF1, 0x71, 0x2A, 0x3C, 0xC0, 0xBC, 0x37, 0xF4, 0x51,
+ 0x8C, 0x81, 0xB4, 0x65, 0x95, 0x4A, 0x9D, 0xB5, 0xDF, 0x59, 0x2A, 0x06, 0xA6, 0xB1, 0x05, 0xCE,
+ 0xF3, 0x24, 0x7A, 0x59, 0x37, 0x76, 0x79, 0xAB, 0x84, 0x23, 0xF9, 0x5C, 0xFD, 0x48, 0xA3, 0xED,
+ 0x75, 0xB8, 0x58, 0x2F, 0x8A, 0xE7, 0xAD, 0x71, 0x94, 0x62, 0x27, 0x1C, 0xAC, 0x5F, 0xE3, 0x92,
+ 0x12, 0x6F, 0xAE, 0xAC, 0x12, 0xDA, 0xA9, 0x02, 0x45, 0xD7, 0x62, 0x53, 0xE0, 0xB8, 0xB9, 0xA8,
+ 0x02, 0xD7, 0xED, 0xA9, 0x26, 0x8C, 0x8F, 0x82, 0x78, 0x93, 0x8D, 0x1E, 0x8F, 0x8D, 0xEC, 0x89,
+ 0xBA, 0x37, 0x6A, 0x35, 0x21, 0x61, 0xD9, 0xE1, 0x52, 0x95, 0x46, 0xD5, 0x3A, 0xDF, 0x8B, 0xBD,
+ 0x9F, 0x36, 0x71, 0x95, 0x09, 0x28, 0x88, 0xB1, 0xF0, 0x70, 0xC2, 0x01, 0xA1, 0x4E, 0x0A, 0xF8,
+ 0xF2, 0x25, 0x1C, 0x60, 0x3C, 0xA3, 0xA0, 0xFB, 0x5C, 0x3E, 0xF4, 0x11, 0xCC, 0x54, 0xDA, 0xD7,
+ 0x80, 0x80, 0xCC, 0xC2, 0xB0, 0x81, 0xDF, 0xC8, 0x1C, 0x96, 0x01, 0x95, 0x17, 0x4E, 0x01, 0x7E,
+ 0x76, 0xF4, 0x1C, 0x61, 0x98, 0x58, 0x2A, 0xBD, 0x04, 0x7E, 0x14, 0x8A, 0x88, 0x77, 0xB6, 0xAD,
+ 0x05, 0x54, 0xC7, 0xDA, 0xDD, 0x08, 0xBA, 0x5C, 0x9F, 0xC8, 0x3C, 0x87, 0x24, 0xB5, 0xA0, 0x53,
+ 0xC7, 0xBD, 0x92, 0x77, 0x5F, 0xE8, 0x22, 0x34, 0x27, 0x98, 0x10, 0xD7, 0x4B, 0x76, 0x77, 0x26,
+ 0x2D, 0xD0, 0x24, 0x03, 0x8E, 0x15, 0x57, 0xF2, 0xC6, 0xED, 0x39, 0xB7, 0xAD, 0xE9, 0xFA, 0x14,
+ 0xED, 0xCF, 0x50, 0x9E, 0x8D, 0xAC, 0x87, 0x4B, 0x26, 0x28, 0xE4, 0x02, 0xBE, 0x24, 0x6A, 0x39,
+ 0x17, 0xBE, 0x9B, 0x79, 0xB7, 0x7E, 0xDF, 0xA6, 0x6E, 0x7B, 0x52, 0xE6, 0x1C, 0xD2, 0xAD, 0xCE,
+ 0x30, 0xB9, 0x91, 0xE7, 0x64, 0x8B, 0xBD, 0x1E, 0x8E, 0x40, 0xE3, 0x69, 0xA6, 0xD4, 0xB2, 0x18,
+ 0x42, 0x53, 0x6C, 0xE6, 0x1C, 0x69, 0xF9, 0x26, 0x84, 0x4E, 0x6F, 0x16, 0xD5, 0x39, 0xB5, 0x4C,
+ 0x86, 0xC9, 0x0D, 0x07, 0x6D, 0x25, 0x61, 0x9E, 0x7D, 0xDA, 0xB7, 0x13, 0x73, 0x7B, 0xC6, 0xF9,
+ 0xF8, 0x25, 0x9D, 0x44, 0xA6, 0x70, 0xFE, 0x5F, 0xC0, 0xFA, 0x64, 0xEE, 0x85, 0x6D, 0xA5, 0x0C,
+ 0x28, 0x68, 0x8C, 0x17, 0xCE, 0x3E, 0x38, 0x86, 0x83, 0x24, 0x97, 0xA3, 0xC2, 0x54, 0xF9, 0x3C,
+ 0xE7, 0x3A, 0xE8, 0xBC, 0x6D, 0xB8, 0x17, 0x7D, 0xF0, 0x6C, 0xEF, 0xFB, 0xBB, 0xC9, 0xD7, 0x5B,
+ 0xBF, 0xBB, 0x99, 0x83, 0x94, 0x29, 0xE9, 0x9F, 0xFC, 0x6D, 0xD7, 0xA8, 0x6C, 0x62, 0x42, 0x18,
+ 0x95, 0x2D, 0x44, 0xFF, 0xB4, 0x48, 0x30, 0x88, 0x29, 0x25, 0x41, 0x83, 0x0F, 0xAE, 0x9D, 0xE3,
+ 0xEC, 0xB2, 0x18, 0x0F, 0xBF, 0x4F, 0x11, 0x1F, 0xDA, 0xF2, 0xEC, 0x54, 0xE3, 0xCF, 0xE9, 0xAD,
+ 0x4A, 0x7E, 0xF0, 0xDE, 0xD4, 0x65, 0x21, 0x6F, 0x3A, 0xA8, 0x2E, 0xD5, 0x02, 0x39, 0x11, 0x4C,
+ 0xA5, 0x0A, 0xF1, 0xE4, 0x04, 0xFE, 0xC7, 0xFA, 0xE2, 0x2B, 0x74, 0xD3, 0xBD, 0xB2, 0x8D, 0xAB,
+ 0x18, 0x6B, 0x22, 0x3B, 0x79, 0x67, 0x88, 0x0F, 0x05, 0xB2, 0xA5, 0x26, 0x9B, 0x5A, 0x4E, 0x96,
+ 0xBE, 0xE4, 0x60, 0x9F, 0xD5, 0x8C, 0x0F, 0x81, 0x12, 0xEE, 0x5E, 0xAA, 0x63, 0x10, 0x0C, 0x87,
+ 0x42, 0x73, 0xA7, 0x16, 0x97, 0x7D, 0x8A, 0x3E, 0x6C, 0xAC, 0xB8, 0xAF, 0x70, 0xC2, 0xCA, 0x95,
+ 0xD5, 0x01, 0x9A, 0x3B, 0xB0, 0x36, 0xBF, 0xEE, 0xF9, 0x7D, 0x0B, 0xA1, 0x21, 0xA6, 0x6D, 0x85,
+ 0x12, 0xB1, 0xCF, 0x14, 0xE8, 0xCC, 0xFC, 0xC3, 0xA2, 0x1A, 0x09, 0x28, 0x48, 0xEB, 0xA8, 0xB2,
+ 0x8B, 0x4D, 0x17, 0xCD, 0x5C, 0x47, 0x70, 0xB9, 0x82, 0xB0, 0xFF, 0xEA, 0xE8, 0x3F, 0x64, 0xDB,
+ 0x9A, 0x0E, 0xFC, 0xED, 0x1D, 0xD2, 0xDE, 0x03, 0x92, 0x91, 0x17, 0xF1, 0x6F, 0x38, 0x14, 0xEC,
+ 0x79, 0x14, 0xCF, 0xA0, 0x2B, 0x63, 0x65, 0x84, 0x28, 0xD3, 0xB8, 0x77, 0x4C, 0x0B, 0x55, 0x4D,
+ 0xF5, 0x89, 0xEF, 0xE7, 0x41, 0xC1, 0x5F, 0x18, 0xAE, 0x06, 0x7F, 0xA9, 0x37, 0x84, 0x34, 0x6F,
+ 0x7C, 0xC3, 0x9B, 0x96, 0x68, 0x88, 0x91, 0x99, 0x35, 0x2B, 0xFF, 0x62, 0xD8, 0xC5, 0xE0, 0x4D,
+ 0x40, 0x79, 0x1D, 0x18, 0x30, 0x58, 0x4B, 0xF9, 0x48, 0xA7, 0x27, 0x02, 0xF5, 0x67, 0xB3, 0x17,
+ 0x4C, 0x22, 0x46, 0x2B, 0x39, 0x20, 0x79, 0x22, 0xE9, 0x25, 0x13, 0x1D, 0x28, 0x20, 0x3E, 0xDA,
+ 0x49, 0x53, 0xA6, 0x3D, 0x7F, 0x70, 0x7B, 0xA6, 0x75, 0xA9, 0x45, 0xEB, 0x3B, 0x8F, 0xFE, 0x36,
+ 0xAD, 0xBA, 0xBE, 0x5B, 0x5A, 0x5B, 0x9E, 0x2A, 0xEA, 0x28, 0xFE, 0xD5, 0x2D, 0x4A, 0x89, 0x7B,
+ 0x6C, 0xBE, 0xF6, 0xEF, 0x19, 0xCD, 0xA1, 0x90, 0xD1, 0x44, 0x10, 0x58, 0x58, 0xD8, 0x39, 0x53,
+ 0x13, 0xA9, 0xBF, 0x02, 0xBC, 0x7A, 0xD3, 0xBC, 0xD1, 0x61, 0xA4, 0xCC, 0x64, 0x0C, 0xF3, 0x51,
+ 0x7C, 0x8B, 0x03, 0x67, 0xBC, 0xA4, 0x0C, 0x20, 0x5C, 0xD5, 0xF1, 0xCA, 0xF3, 0x7B, 0x93, 0x5D,
+ 0x1D, 0x5B, 0x2C, 0xF2, 0x92, 0x3D, 0xF5, 0x0B, 0x90, 0x4C, 0x0C, 0xB6, 0x1C, 0x4D, 0x8D, 0x15,
+ 0x9C, 0x9B, 0x46, 0xDC, 0xC0, 0x7D, 0x01, 0x92, 0x2B, 0x7D, 0xED, 0xCA, 0x27, 0xF3, 0xA2, 0x0F,
+ 0x46, 0x62, 0x09, 0xEA, 0x4B, 0xB1, 0x70, 0x6C, 0x24, 0x96, 0x93, 0xFB, 0xA5, 0x95, 0xD6, 0xF6,
+ 0xDD, 0x04, 0x39, 0x05, 0x58, 0x5C, 0xAC, 0xE2, 0x12, 0xAC, 0x9C, 0x7F, 0x69, 0xBB, 0x0D, 0xD1,
+ 0xD8, 0xE7, 0x26, 0x6D, 0x32, 0xCF, 0xB7, 0x12, 0xC5, 0x21, 0x49, 0x64, 0xCC, 0x31, 0x72, 0x33,
+ 0x8E, 0x2F, 0xC5, 0x9F, 0x4C, 0x92, 0x5E, 0xDB, 0x03, 0x8F, 0x1F, 0x2A, 0xBB, 0xA6, 0x9C, 0xA0,
+ 0x1F, 0xC2, 0x89, 0xB1, 0xA6, 0x70, 0x32, 0x17, 0x74, 0x35, 0x14, 0xE2, 0xF8, 0x83, 0x9D, 0x1E,
+ 0x04, 0xD7, 0x05, 0x34, 0x8E, 0xAE, 0xA8, 0x0A, 0x34, 0x74, 0xA7, 0x42, 0x1B, 0x1F, 0x90, 0x31,
+ 0xA7, 0x9A, 0xFA, 0xC7, 0xD3, 0x6C, 0x45, 0xBA, 0x49, 0x3C, 0x4E, 0xBA, 0x85, 0xFC, 0x0B, 0x8A,
+ 0x89, 0xEF, 0x6A, 0xD2, 0x88, 0xF1, 0xA9, 0xA4, 0x55, 0x54, 0xA0, 0x38, 0x4D, 0xEC, 0x1B, 0x9D,
+ 0x70, 0x7F, 0x98, 0x9E, 0xE0, 0x7E, 0xC0, 0x4F, 0xD3, 0xA5, 0xC5, 0x78, 0x86, 0xDD, 0x92, 0xB5,
+ 0x8A, 0xA5, 0xFB, 0x75, 0x64, 0x06, 0x66, 0xAF, 0x06, 0xF2, 0xEF, 0x7C, 0x82, 0x61, 0xE3, 0x81,
+ 0x64, 0xBC, 0x53, 0x03, 0x8B, 0x62, 0x61, 0xE7, 0xFD, 0x75, 0x3A, 0x63, 0x9C, 0x03, 0x84, 0x00,
+ 0xA0, 0x90, 0x27, 0xAA, 0xF3, 0xA7, 0xF8, 0xB4, 0xB5, 0xF5, 0xC7, 0x22, 0xDE, 0x35, 0x95, 0x3A,
+ 0x35, 0xE6, 0x6D, 0x89, 0x58, 0x0D, 0xBC, 0xC2, 0xC6, 0x97, 0xB1, 0xD4, 0xA6, 0xF0, 0x65, 0x66,
+ 0x7F, 0x19, 0xAF, 0x50, 0x88, 0xB9, 0x58, 0x8C, 0xC2, 0xED, 0x6E, 0x4A, 0xF8, 0xB3, 0xC7, 0x06,
+ 0x1A, 0xCF, 0x92, 0xC4, 0x98, 0x43, 0x27, 0x0D, 0xA2, 0x01, 0x5B, 0x85, 0x98, 0x8C, 0x9C, 0x5E,
+ 0x82, 0x19, 0xA8, 0x4E, 0xA8, 0x60, 0xB1, 0xEE, 0x14, 0x73, 0xC7, 0x70, 0xA9, 0x6E, 0x2A, 0x39,
+ 0x4F, 0xF6, 0x4C, 0x77, 0x1F, 0xB3, 0x7A, 0x4B, 0xAB, 0xA8, 0x14, 0x8D, 0xF2, 0xC5, 0xBC, 0xE2,
+ 0xF1, 0x7E, 0xB8, 0xC3, 0x6B, 0xA2, 0xF5, 0x61, 0x79, 0x93, 0x98, 0xBB, 0x13, 0x5F, 0x7F, 0x62,
+ 0xAE, 0x74, 0xC6, 0xF8, 0x23, 0x4F, 0xA6, 0x41, 0x0D, 0x23, 0xF6, 0x3F, 0xF5, 0x23, 0xD9, 0xE4,
+ 0xCC, 0x87, 0xA5, 0x3E, 0xF8, 0xCC, 0xBC, 0x4F, 0x8F, 0xC8, 0x5C, 0xC8, 0x7D, 0xC1, 0xC4, 0x23,
+ 0x66, 0x62, 0xA5, 0x75, 0xC7, 0x44, 0x15, 0x84, 0xC3, 0xFC, 0x16, 0x81, 0x7F, 0xE5, 0x0C, 0xDA,
+ 0xAC, 0xD8, 0x53, 0x71, 0x5D, 0xBE, 0x91, 0xB8, 0xFC, 0x3B, 0x8F, 0x88, 0x2D, 0x67, 0xA4, 0x1D,
+ 0x9F, 0xFB, 0x12, 0xD7, 0x1D, 0xF0, 0x6C, 0x2F, 0x2D, 0xA3, 0x36, 0x97, 0x1A, 0xA5, 0x5D, 0xE7,
+ 0x18, 0x21, 0x31, 0xFB, 0xAB, 0x1E, 0x75, 0x41, 0x70, 0x4C, 0xC4, 0xBB, 0x01, 0x7B, 0x72, 0x51,
+ 0xAE, 0x0B, 0xB3, 0x59, 0x6D, 0xA4, 0x1F, 0xCB, 0x69, 0x7C, 0x72, 0x28, 0xF6, 0x85, 0xC2, 0xA1,
+ 0x88, 0x4A, 0x82, 0xEA, 0xCF, 0xBA, 0x87, 0xB7, 0x13, 0x5B, 0xD0, 0xFC, 0x5E, 0x77, 0x4F, 0x3D,
+ 0x92, 0x9E, 0x3F, 0xB0, 0xE0, 0xDC, 0x9B, 0xB8, 0x67, 0x13, 0xCE, 0x5D, 0x2F, 0xE8, 0x96, 0xF6,
+ 0x18, 0x24, 0x52, 0x87, 0x6E, 0x46, 0x51, 0x80, 0x37, 0x56, 0xE2, 0xE2, 0x3D, 0x33, 0x82, 0x31,
+ 0xEF, 0x0E, 0xA2, 0xB2, 0x56, 0xF9, 0x3F, 0xBA, 0x22, 0x26, 0x96, 0x3E, 0x3D, 0xE6, 0x35, 0x8E,
+ 0x24, 0x19, 0x7D, 0x0E, 0x0B, 0x10, 0x4C, 0xFE, 0x74, 0x59, 0x32, 0x9C, 0x65, 0xA7, 0xB1, 0xEF,
+ 0x08, 0xF8, 0x07, 0x1C, 0x11, 0x52, 0xC0, 0x8F, 0xE3, 0x93, 0x9E, 0x53, 0x23, 0x13, 0xA6, 0x3E,
+ 0xB3, 0xB1, 0x20, 0x24, 0xB6, 0xE1, 0x22, 0xD1, 0xED, 0x36, 0xD3, 0x5C, 0x18, 0xC4, 0xE4, 0x09,
+ 0x7F, 0x60, 0x45, 0x9D, 0xCE, 0xAE, 0xDF, 0xE2, 0xD4, 0xC6, 0xBA, 0x53, 0x6B, 0x97, 0xAD, 0x2B,
+ 0x60, 0x54, 0x60, 0x22, 0x3C, 0x4C, 0x25, 0x2C, 0x87, 0xF9, 0x64, 0x51, 0x60, 0x2E, 0xE1, 0x90,
+ 0xAE, 0xCC, 0x70, 0xC1, 0xCA, 0x62, 0x07, 0xEF, 0x63, 0x40, 0x80, 0x7B, 0xC2, 0x35, 0x56, 0xC6,
+ 0xB8, 0x12, 0x0E, 0x34, 0xF4, 0x54, 0x28, 0x53, 0x52, 0xD4, 0x4F, 0x0F, 0x98, 0x78, 0x74, 0x9A,
+ 0x4A, 0x1E, 0x77, 0x31, 0x4D, 0xAB, 0x7D, 0xDD, 0x07, 0x4E, 0x57, 0x24, 0xAE, 0x3F, 0xF1, 0x30,
+ 0x19, 0xA8, 0x2E, 0x66, 0xB1, 0x4D, 0x30, 0x5B, 0x28, 0xB4, 0x9F, 0x48, 0xFF, 0x59, 0x19, 0xED,
+ 0xA1, 0x47, 0x5F, 0xBF, 0xC0, 0x6C, 0x50, 0xCA, 0x7C, 0xF3, 0x01, 0x40, 0xAE, 0xD2, 0x06, 0x29,
+ 0x68, 0xAF, 0xDA, 0xD5, 0x42, 0x5B, 0x75, 0xA3, 0xD0, 0xC1, 0x95, 0x6D, 0xB5, 0xB5, 0x1C, 0x63,
+ 0x7D, 0x3F, 0x8F, 0x37, 0x84, 0x67, 0x69, 0xF9, 0xF4, 0x17, 0x03, 0xAB, 0xD8, 0x79, 0x0B, 0x8F,
+ 0xB8, 0x78, 0x6C, 0x7B, 0xE6, 0x43, 0xA4, 0x87, 0x39, 0x3E, 0x57, 0xC6, 0x69, 0x13, 0x41, 0x8A,
+ 0x14, 0x53, 0xBD, 0x1B, 0x44, 0x51, 0x96, 0x87, 0x4A, 0xEB, 0xD4, 0xCB, 0xE1, 0x65, 0x4A, 0x2F,
+ 0xF6, 0xAC, 0x8A, 0x58, 0x94, 0x87, 0xC0, 0xB8, 0x19, 0x7F, 0x88, 0xC2, 0xDE, 0x9A, 0x8E, 0x57,
+ 0xD7, 0xD5, 0xDB, 0x92, 0x8C, 0x16, 0xB7, 0x85, 0x93, 0xE1, 0x7E, 0x16, 0x80, 0x23, 0x2B, 0x5C,
+ 0x83, 0x63, 0xB0, 0xDD, 0x82, 0xDB, 0x21, 0x17, 0x22, 0x51, 0x35, 0xE3, 0x22, 0x36, 0x2B, 0xDA,
+ 0x5E, 0xE5, 0x48, 0xEA, 0xC5, 0x23, 0x05, 0x8E, 0xD1, 0xFF, 0xE6, 0x81, 0xC5, 0x0B, 0xE1, 0x06,
+ 0x0E, 0xD0, 0x2C, 0xA6, 0x43, 0xF3, 0x89, 0x5A, 0x67, 0xBD, 0x33, 0xE6, 0xC8, 0x5E, 0xAC, 0x83,
+ 0xB5, 0xDC, 0x0E, 0x98, 0xAB, 0x32, 0x5A, 0x25, 0xFD, 0xE4, 0x77, 0x48, 0x11, 0xE6, 0x81, 0x22,
+ 0x26, 0x2C, 0x95, 0x3E, 0xDB, 0x5E, 0x74, 0x6C, 0x5E, 0x3B, 0x58, 0x09, 0x89, 0x3F, 0x4A, 0xB8,
+ 0xAF, 0x53, 0xE2, 0x45, 0x3B, 0x63, 0xB5, 0xEE, 0x15, 0xDF, 0x0B, 0x3E, 0x29, 0xF1, 0xAF, 0x54,
+ 0x69, 0xB2, 0x89, 0xF3, 0x42, 0x92, 0x14, 0xF0, 0xC0, 0xC5, 0x25, 0x7F, 0xDF, 0x42, 0xDE, 0xC1,
+ 0x29, 0x60, 0x1A, 0x62, 0xFB, 0x0C, 0xF8, 0xC6, 0x57, 0x8B, 0x1E, 0x82, 0x06, 0x35, 0xA9, 0x06,
+ 0x41, 0xAC, 0x76, 0x7E, 0x8C, 0x84, 0xE2, 0xF9, 0x18, 0x69, 0xC4, 0xD2, 0xB7, 0xB1, 0xBE, 0xDB,
+ 0x83, 0x92, 0xA8, 0x7F, 0x32, 0xC7, 0xF4, 0x08, 0xE0, 0x26, 0xBE, 0x2D, 0x6B, 0x76, 0x9D, 0x68,
+ 0xE3, 0x4B, 0xC9, 0x1A, 0x0A, 0xE4, 0x77, 0x19, 0xB8, 0xB2, 0xBE, 0x46, 0x2A, 0x3C, 0x76, 0xB7,
+ 0x54, 0x6F, 0x41, 0x59, 0x21, 0x7A, 0xA6, 0x44, 0xCE, 0x74, 0xA9, 0xD4, 0x13, 0x47, 0xD1, 0x55,
+ 0xA0, 0xF0, 0x85, 0x20, 0x80, 0xDF, 0x4E, 0x7D, 0xF4, 0xB2, 0xBE, 0x75, 0x9A, 0xA2, 0x10, 0xC2,
+ 0xFD, 0xB1, 0xB9, 0x8E, 0x14, 0x80, 0xB6, 0x5B, 0x8A, 0x6A, 0x81, 0x37, 0x8C, 0x03, 0x51, 0x85,
+ 0x25, 0xD7, 0x85, 0x6A, 0xC8, 0x0A, 0x1F, 0x24, 0xB6, 0x2C, 0xB0, 0x1A, 0x20, 0x23, 0xCB, 0xB5,
+ 0xF8, 0x19, 0x88, 0x63, 0x67, 0xB7, 0xCD, 0x5B, 0x4F, 0x3C, 0xAA, 0xE6, 0x90, 0xCC, 0x6A, 0xDD,
+ 0xE0, 0x51, 0x29, 0x22, 0xFF, 0x17, 0x53, 0x62, 0x40, 0xF4, 0xB6, 0x5F, 0x55, 0x65, 0x67, 0x79,
+ 0x5B, 0x98, 0xA3, 0x58, 0x35, 0xB2, 0x21, 0xDB, 0x0C, 0x6C, 0x20, 0x07, 0x3A, 0x58, 0xE5, 0x96,
+ 0x7F, 0xB9, 0x1F, 0x31, 0x7A, 0x8A, 0x64, 0xA8, 0x06, 0xAA, 0x56, 0x55, 0x2D, 0x0B, 0x8B, 0x71,
+ 0x78, 0x8B, 0x9F, 0xC1, 0x12, 0x54, 0x00, 0x5E, 0x2E, 0x76, 0x98, 0x99, 0x77, 0xE3, 0x4D, 0x08,
+ 0x47, 0xC2, 0xF1, 0xFB, 0xF9, 0xE1, 0x8D, 0x40, 0x71, 0x67, 0xF9, 0x15, 0x34, 0xED, 0x10, 0x63,
+ 0x63, 0xA2, 0x2A, 0x59, 0x0B, 0x3E, 0xA2, 0xB6, 0xC2, 0x03, 0x19, 0x8B, 0x7C, 0x76, 0x17, 0xEF,
+ 0x6B, 0xE3, 0x1F, 0xBF, 0x32, 0xDC, 0xF4, 0x2E, 0x69, 0x15, 0x54, 0x40, 0x78, 0x97, 0x13, 0x2D,
+ 0xB5, 0x7D, 0x18, 0x91, 0x40, 0x84, 0x8F, 0x92, 0x44, 0x32, 0x42, 0x9F, 0xD1, 0x2D, 0xEA, 0x82,
+ 0x48, 0x39, 0x49, 0x19, 0x07, 0xC6, 0x32, 0x9F, 0xD5, 0x87, 0x80, 0x92, 0x78, 0xDA, 0x9A, 0x93,
+ 0x90, 0x71, 0xDD, 0xC4, 0x6D, 0xC3, 0x74, 0xA6, 0xC9, 0x88, 0x98, 0xFF, 0x8A, 0x81, 0x50, 0xAC,
+ 0x73, 0x49, 0x0A, 0x75, 0x27, 0x02, 0xAF, 0x81, 0xB8, 0xAD, 0x83, 0xA9, 0x08, 0x29, 0xF0, 0x78,
+ 0x4A, 0x32, 0xDB, 0x10, 0xA4, 0x5E, 0xFA, 0x3B, 0x49, 0xBD, 0xA5, 0xE1, 0xE6, 0x0B, 0xDB, 0x6F,
+ 0x31, 0x18, 0xDC, 0xA7, 0x63, 0xD0, 0xBA, 0xC7, 0xA3, 0x0A, 0x88, 0x76, 0xA8, 0x6C, 0x4B, 0xBE,
+ 0x3A, 0xD6, 0x81, 0x20, 0xEF, 0xD4, 0x36, 0x4C, 0x2E, 0xBD, 0x22, 0x56, 0x5E, 0xE9, 0xBB, 0x25,
+ 0x75, 0x54, 0x33, 0xF6, 0x1B, 0x7F, 0xD8, 0x95, 0x49, 0x9B, 0xB1, 0x30, 0x3E, 0x6F, 0x17, 0x91,
+ 0x42, 0x82, 0x42, 0x81, 0x16, 0x56, 0xCF, 0x2D, 0xC2, 0x34, 0x6C, 0x38, 0xA0, 0x42, 0x14, 0x7A,
+ 0x13, 0x9D, 0x38, 0xC1, 0x6D, 0x3A, 0x3D, 0x0E, 0x24, 0x2C, 0x23, 0xE3, 0xBC, 0x36, 0x2A, 0x97,
+ 0x05, 0x9E, 0x31, 0x9A, 0xF2, 0x88, 0x84, 0xA2, 0x28, 0xB8, 0xB3, 0x40, 0x3E, 0xE8, 0x5F, 0x44,
+ 0x32, 0x7E, 0xD7, 0x64, 0xFE, 0x37, 0x51, 0x32, 0xD1, 0x59, 0x4E, 0xB8, 0x98, 0xC4, 0x87, 0x50,
+ 0xB0, 0x0C, 0xAD, 0xE8, 0x98, 0x20, 0xA2, 0xAA, 0xFC, 0x94, 0xCF, 0x87, 0xFB, 0x60, 0xDB, 0xBF,
+ 0x93, 0x7E, 0xBD, 0x5F, 0x13, 0x6C, 0xC9, 0x06, 0x34, 0xD5, 0x8A, 0xED, 0x5D, 0xAC, 0x77, 0xC9,
+ 0x84, 0xD5, 0x05, 0x61, 0x71, 0x4E, 0x69, 0xE1, 0xC6, 0xFD, 0x12, 0x3F, 0x37, 0x3F, 0xEE, 0x1D,
+ 0x93, 0x6E, 0xF3, 0x32, 0x18, 0x26, 0x87, 0x2A, 0x7C, 0x0F, 0x75, 0x1A, 0x06, 0x61, 0x76, 0x22,
+ 0x18, 0x39, 0x24, 0x49, 0xA7, 0xF7, 0x81, 0x51, 0x1E, 0x8F, 0x86, 0x76, 0xE3, 0xF2, 0xF0, 0xCF,
+ 0x8B, 0xB1, 0x5E, 0xFA, 0xA7, 0xF3, 0x0F, 0x63, 0x6B, 0x4D, 0x0B, 0x71, 0x3A, 0xAB, 0x60, 0x76,
+ 0x01, 0xA5, 0x28, 0x4D, 0xB4, 0xBF, 0xDB, 0x8E, 0x2B, 0xE1, 0xD6, 0xE6, 0xC8, 0x8F, 0xE6, 0x79,
+ 0xD6, 0x19, 0xD9, 0x3A, 0x6F, 0x0C, 0xDC, 0xC0, 0x31, 0x61, 0x70, 0x21, 0xE4, 0xFA, 0x43, 0x43,
+ 0x03, 0xFC, 0x88, 0xA8, 0x77, 0xCA, 0xE6, 0x79, 0x59, 0x84, 0x5D, 0x2B, 0x0A, 0xB7, 0x13, 0x1B,
+ 0x2C, 0xEC, 0xDD, 0x8A, 0x26, 0xE9, 0xB3, 0x69, 0x4F, 0x72, 0xCB, 0x82, 0x2E, 0x54, 0x00, 0xD1,
+ 0x19, 0xA5, 0x0F, 0xB2, 0x5F, 0xCA, 0x3C, 0xB6, 0x5F, 0x8B, 0xC8, 0xD4, 0x21, 0xCF, 0x26, 0x83,
+ 0x5A, 0xD2, 0xCA, 0xFF, 0x26, 0x46, 0x5E, 0xE8, 0x2C, 0x0F, 0xA7, 0xBA, 0x8E, 0xCD, 0xBB, 0xB0,
+ 0x70, 0x78, 0xA2, 0xF4, 0x8F, 0x9D, 0x0F, 0x23, 0x29, 0xF4, 0xBC, 0xFC, 0x54, 0x22, 0x00, 0x7B,
+ 0x88, 0x0F, 0x87, 0x08, 0xF2, 0x37, 0x3E, 0x07, 0x4E, 0xEF, 0xF3, 0x4F, 0x96, 0x7B, 0xB3, 0xA4,
+ 0x1D, 0x45, 0x3D, 0x88, 0x5D, 0xC2, 0xA8, 0xFA, 0x71, 0xBE, 0xA6, 0x1F, 0x7E, 0x77, 0xD5, 0x48,
+ 0x23, 0x73, 0x1C, 0x62, 0xF5, 0x98, 0x8E, 0xB7, 0x67, 0xB1, 0xC8, 0xFA, 0xD7, 0xCB, 0x08, 0x0A,
+ 0x64, 0x57, 0x93, 0x7E, 0x8E, 0xF2, 0x20, 0xAA, 0xB5, 0x06, 0x8D, 0x12, 0xE2, 0xB8, 0x4D, 0xFC,
+ 0xC8, 0x23, 0xAB, 0x61, 0x05, 0xE4, 0x46, 0x87, 0x15, 0x25, 0x23, 0x43, 0x15, 0x32, 0x63, 0x9E,
+ 0x79, 0xFA, 0xBE, 0x10, 0x2B, 0xA3, 0x49, 0xA0, 0x80, 0xB0, 0x3F, 0x50, 0x68, 0xF5, 0xC0, 0x7C,
+ 0x55, 0xA2, 0x58, 0x92, 0xD4, 0xF3, 0xA0, 0xEE, 0x83, 0x33, 0x71, 0xE6, 0xAB, 0x77, 0x44, 0x25,
+ 0x5D, 0xBF, 0x57, 0x91, 0x25, 0x14, 0x0C, 0x5D, 0x07, 0xA0, 0x8F, 0x82, 0x9C, 0xA8, 0x33, 0x05,
+ 0x25, 0x5F, 0x6B, 0x20, 0xB1, 0x92, 0xDC, 0x4E, 0xDA, 0x6D, 0xC4, 0x85, 0xE7, 0xDE, 0x00, 0xAD,
+ 0x0E, 0x45, 0x9A, 0x3E, 0xBF, 0x1E, 0x7B, 0xF1, 0x94, 0x11, 0x77, 0xCE, 0xE2, 0xF0, 0x7B, 0x9A,
+ 0x85, 0x46, 0x98, 0x27, 0x44, 0xCC, 0xC7, 0x3F, 0x2D, 0x6F, 0xE2, 0xD3, 0xDF, 0x6E, 0x6D, 0x74,
+ 0xFD, 0xC0, 0xEF, 0x8C, 0xA3, 0x71, 0xEA, 0xA4, 0x56, 0x59, 0x57, 0x23, 0x78, 0x87, 0x16, 0x8C,
+ 0x1E, 0x63, 0x9C, 0xE2, 0xA7, 0x28, 0x2A, 0x64, 0xC0, 0x97, 0x34, 0xB0, 0xD5, 0x78, 0x4C, 0xC3,
+ 0xB2, 0x5D, 0x9B, 0x89, 0x3F, 0xD3, 0x7E, 0xD2, 0x8A, 0x78, 0x8C, 0x1A, 0x82, 0xB2, 0xA5, 0xFD,
+ 0x37, 0xE6, 0x64, 0x32, 0xF0, 0xC9, 0xDE, 0xAF, 0xA6, 0xBD, 0xB9, 0xDD, 0xE1, 0xF6, 0x2D, 0xC1,
+ 0x17, 0x15, 0xF1, 0x73, 0xA4, 0x4C, 0x65, 0x11, 0x92, 0xDC, 0x61, 0xFD, 0x0C, 0x60, 0x49, 0x43,
+ 0x54, 0xAC, 0xC9, 0xD7, 0xD5, 0x85, 0x09, 0xD4, 0x57, 0x74, 0x18, 0xD6, 0x53, 0xEB, 0x26, 0xAE,
+ 0x13, 0xCE, 0x0C, 0x6F, 0x7C, 0x11, 0x90, 0x02, 0xB9, 0x46, 0xB8, 0xEC, 0x25, 0x31, 0xE2, 0xBA,
+ 0xD4, 0xE4, 0x19, 0x1F, 0xF8, 0xB9, 0x6D, 0xA6, 0x7A, 0xE8, 0x03, 0x9A, 0x94, 0x9F, 0x26, 0x3B,
+ 0xE0, 0x1A, 0x32, 0xAD, 0x73, 0x3C, 0xB7, 0xE4, 0x32, 0x6F, 0x51, 0x3B, 0x3D, 0x83, 0x86, 0xD7,
+ 0x62, 0x6D, 0xF8, 0xDF, 0x5C, 0xB2, 0x59, 0x92, 0xAE, 0x52, 0xA7, 0xFE, 0xA9, 0x9B, 0x0F, 0xD8,
+ 0x5C, 0xCA, 0x50, 0xC3, 0xD7, 0x7C, 0x8E, 0x80, 0x1E, 0xCE, 0xC9, 0x8E, 0x6B, 0x7A, 0x4F, 0x1B,
+ 0x3A, 0x1E, 0x91, 0x18, 0x4C, 0x01, 0x50, 0x47, 0x54, 0x65, 0xF2, 0x72, 0xA1, 0x83, 0xE2, 0x86,
+ 0x9B, 0x93, 0x07, 0x75, 0xE4, 0x33, 0x47, 0xB5, 0xBD, 0x42, 0xB2, 0x30, 0x6B, 0x69, 0x1F, 0xE9,
+ 0xB3, 0x58, 0x91, 0x95, 0x7B, 0xED, 0xC3, 0xF2, 0x46, 0x28, 0xB5, 0x18, 0x21, 0x27, 0x57, 0xF2,
+ 0x39, 0xE6, 0x8A, 0x28, 0xA7, 0x7D, 0xFB, 0x01, 0xF2, 0x7B, 0x56, 0x5A, 0xC4, 0x85, 0x5A, 0x41,
+ 0x96, 0xF7, 0xF7, 0xC5, 0x91, 0xA4, 0x89, 0x9A, 0x09, 0x91, 0xBB, 0xE9, 0x29, 0x92, 0x7F, 0xE6,
+ 0x5B, 0x94, 0x8E, 0x93, 0x43, 0x90, 0x53, 0x0F, 0x10, 0xD7, 0x7E, 0x04, 0x28, 0xB7, 0xF7, 0x14,
+ 0xB3, 0x42, 0x5E, 0xDF, 0xB5, 0xAA, 0xE4, 0xF7, 0xED, 0x98, 0x43, 0xC6, 0x8C, 0xFA, 0x7C, 0xB0,
+ 0x71, 0xB1, 0xE9, 0x64, 0x65, 0xBB, 0x58, 0xCC, 0x73, 0x5F, 0x6A, 0x5A, 0x86, 0x2D, 0x2E, 0x89,
+ 0xB4, 0x5A, 0xFE, 0x16, 0x5B, 0x64, 0x56, 0x27, 0x38, 0xC2, 0x1D, 0x1C, 0xF0, 0xC5, 0x0B, 0x80,
+ 0x8D, 0x6F, 0x2E, 0x0C, 0x7B, 0x56, 0xEF, 0x23, 0xE5, 0xFC, 0xD2, 0x55, 0xF6, 0x9C, 0xF7, 0x5F,
+ 0xB5, 0xEC, 0xB7, 0xEE, 0xC4, 0xEC, 0xFE, 0xD6, 0xAA, 0xEC, 0x24, 0xB8, 0xB7, 0x98, 0x8D, 0x0B,
+ 0x12, 0x36, 0xAC, 0x5B, 0x3E, 0x87, 0x29, 0x21, 0x9C, 0xFD, 0x84, 0xFD, 0xF5, 0x10, 0xA4, 0xE8,
+ 0x1C, 0x4F, 0x16, 0x45, 0xBF, 0xC9, 0x18, 0x9F, 0xDE, 0xF1, 0x96, 0x64, 0x58, 0x61, 0xF1, 0x41,
+ 0x82, 0xE2, 0xDA, 0xA3, 0xE4, 0x86, 0x0F, 0xB7, 0xCA, 0x17, 0x17, 0x2A, 0x7D, 0xAC, 0x9F, 0xB3,
+ 0x8E, 0x65, 0x63, 0x80, 0x64, 0x8E, 0x6F, 0xDB, 0xD4, 0x05, 0x65, 0xEE, 0x13, 0x1C, 0xE6, 0x51,
+ 0x53, 0x01, 0xA1, 0xE2, 0xA1, 0x3E, 0x46, 0x82, 0xBB, 0x4A, 0x7E, 0xC1, 0x4A, 0x12, 0xBB, 0x56,
+ 0xA2, 0x2F, 0x81, 0xC0, 0x0F, 0x47, 0x7F, 0xA1, 0xD9, 0x8F, 0x21, 0xC5, 0x48, 0x34, 0xF0, 0x7F,
+ 0x07, 0xE8, 0xB4, 0x0C, 0x37, 0xEA, 0x4A, 0x76, 0x5E, 0x98, 0xA0, 0x87, 0x08, 0xC1, 0x51, 0x3D,
+ 0xED, 0xC6, 0xA2, 0x75, 0x90, 0xB4, 0x23, 0xFC, 0x3E, 0x36, 0x4A, 0x9A, 0xEA, 0x25, 0x1F, 0x62,
+ 0x41, 0x69, 0xCC, 0x8C, 0xB0, 0xB7, 0xAA, 0x6B, 0x67, 0xC9, 0x85, 0x7F, 0x92, 0xC0, 0x7A, 0x30,
+ 0x18, 0x35, 0xCD, 0xFD, 0x85, 0xC4, 0x70, 0x23, 0x75, 0x45, 0x67, 0x79, 0xAB, 0xFE, 0x83, 0x4B,
+ 0xC9, 0x09, 0x78, 0xF1, 0x7F, 0xFA, 0xCC, 0xF2, 0x0A, 0x03, 0x0E, 0x43, 0x9A, 0xD1, 0xBF, 0x53,
+ 0xA8, 0x1E, 0x0F, 0x75, 0xC9, 0x14, 0x54, 0x07, 0x6D, 0xCD, 0xC7, 0xB3, 0x5D, 0x14, 0x87, 0x29,
+ 0x0C, 0x43, 0xED, 0x91, 0xE3, 0x0A, 0xD0, 0x6F, 0xAE, 0x3B, 0xB5, 0xA8, 0x29, 0x3C, 0xA5, 0x5E,
+ 0x0A, 0x51, 0xB4, 0x7F, 0x3D, 0x15, 0xCC, 0x1A, 0x35, 0xFB, 0xA4, 0x70, 0xDC, 0x4B, 0x98, 0xD4,
+ 0xBF, 0x28, 0xE6, 0x29, 0x42, 0x60, 0x71, 0xA7, 0xAE, 0x02, 0xC0, 0xE4, 0xEE, 0x61, 0x48, 0x07,
+ 0x84, 0x87, 0xAD, 0x5E, 0x70, 0xA8, 0x03, 0x30, 0x81, 0xE3, 0xE3, 0x53, 0x28, 0xFC, 0x06, 0xF8,
+ 0x37, 0x19, 0x69, 0xA1, 0xD2, 0x7A, 0xDB, 0x91, 0xAD, 0xB2, 0x8E, 0x51, 0xE1, 0xC0, 0x0A, 0xEE,
+ 0x70, 0x3B, 0xB7, 0x37, 0x96, 0x07, 0xBC, 0x66, 0x3B, 0x10, 0x6F, 0x18, 0xCC, 0xA8, 0x8F, 0xDD,
+ 0x6C, 0x30, 0x18, 0xEF, 0x96, 0x09, 0xE5, 0x89, 0x47, 0x8E, 0xBA, 0x57, 0x8D, 0x8F, 0x63, 0x8A,
+ 0xAB, 0x30, 0xA0, 0x45, 0x1C, 0x4C, 0x0D, 0xB0, 0x72, 0x09, 0x0A, 0xC8, 0x56, 0xD8, 0x45, 0x71,
+ 0xD3, 0xB8, 0x03, 0xD3, 0xCD, 0x9E, 0x86, 0x53, 0xA5, 0xD5, 0x58, 0xA5, 0x03, 0xE3, 0xFC, 0x5E,
+ 0x1C, 0x63, 0x65, 0xE9, 0x70, 0x53, 0xF4, 0x99, 0x71, 0x7A, 0x76, 0x2C, 0x2C, 0x38, 0xBE, 0x5A,
+ 0x20, 0xFF, 0xC0, 0x25, 0x16, 0x46, 0xA8, 0x65, 0x9B, 0xE0, 0xB1, 0x10, 0x7D, 0xB2, 0x90, 0xBC,
+ 0xE4, 0xB5, 0x22, 0xC7, 0xD6, 0x8A, 0xBB, 0x19, 0x9F, 0xCD, 0x11, 0x62, 0x82, 0xFC, 0x8D, 0x36,
+ 0xE2, 0x08, 0xF0, 0xDD, 0x68, 0x60, 0x48, 0x09, 0x1F, 0xF0, 0xC5, 0x54, 0xE9, 0x47, 0x7D, 0x79,
+ 0xE6, 0xC4, 0xC1, 0xF1, 0xFF, 0x2D, 0x5C, 0xA3, 0xFD, 0xF2, 0xB1, 0xA7, 0x89, 0xB7, 0xB9, 0x7C,
+ 0x44, 0x28, 0xE5, 0x82, 0x36, 0x4D, 0x48, 0x34, 0x01, 0x5B, 0x43, 0x36, 0x2D, 0x05, 0x93, 0xEE,
+ 0xF5, 0x92, 0x73, 0xDF, 0xA6, 0xBA, 0x3D, 0x5B, 0x96, 0x49, 0x73, 0xDF, 0x70, 0x9B, 0x7A, 0x70,
+ 0x5C, 0x30, 0x14, 0xB8, 0xB7, 0x46, 0xE0, 0xD7, 0xFF, 0x5C, 0x8E, 0x27, 0x39, 0x0E, 0xEE, 0x99,
+ 0x2F, 0x08, 0x1E, 0x95, 0xD4, 0x70, 0xB0, 0xC4, 0x28, 0x83, 0x78, 0x92, 0x93, 0x46, 0xB9, 0xF9,
+ 0xFF, 0x8C, 0x16, 0xA9, 0x63, 0x71, 0xAF, 0xBD, 0x84, 0x1A, 0x25, 0xBE, 0xE8, 0xE3, 0xB2, 0x33,
+ 0x51, 0xB9, 0xB6, 0x0E, 0x12, 0xB8, 0xA7, 0x6E, 0x28, 0xBC, 0xA3, 0x66, 0x24, 0x49, 0x4D, 0x45,
+ 0xA4, 0x5C, 0xCD, 0x4D, 0x2E, 0x17, 0xFB, 0xC0, 0xB5, 0xA7, 0x55, 0x34, 0x08, 0xD7, 0xC7, 0x54,
+ 0x0A, 0xFE, 0xE6, 0x98, 0x85, 0x6D, 0xAF, 0x42, 0x79, 0xED, 0x0A, 0xFA, 0xCF, 0xD3, 0xE2, 0x7C,
+ 0xB8, 0x24, 0xA5, 0xE1, 0x01, 0xA5, 0x94, 0x55, 0x61, 0xA0, 0x49, 0x1B, 0x7C, 0x71, 0xA8, 0x96,
+ 0x5A, 0x4C, 0xF5, 0xC5, 0x1E, 0x8D, 0xD9, 0x2E, 0xBE, 0xC4, 0x13, 0x27, 0xD0, 0xC0, 0x67, 0xA7,
+ 0x77, 0x86, 0x61, 0xAE, 0x7E, 0x69, 0x53, 0xB4, 0x70, 0xC6, 0x1E, 0x62, 0x1A, 0x8B, 0xB3, 0x0A,
+ 0xC5, 0xDF, 0xF4, 0xFA, 0xEB, 0xC5, 0x50, 0x7E, 0xDE, 0xD5, 0x15, 0xB1, 0x2E, 0x09, 0x75, 0xD7,
+ 0x9E, 0xB1, 0x58, 0x76, 0x2F, 0xFE, 0x86, 0x0A, 0xC2, 0x10, 0x1D, 0x84, 0xDF, 0x94, 0x11, 0xD0,
+ 0x86, 0x06, 0xFA, 0x9E, 0x00, 0xF0, 0x27, 0x51, 0x00, 0x43, 0xAF, 0xEA, 0x13, 0x4E, 0xC8, 0x48,
+ 0x5A, 0x57, 0xDB, 0x5C, 0x20, 0xDC, 0xF3, 0x7D, 0x2B, 0x77, 0x35, 0x20, 0xBD, 0x17, 0x0C, 0x3A,
+ 0x2C, 0x3B, 0x58, 0x7D, 0x9D, 0x40, 0xA0, 0xDF, 0xD5, 0xBA, 0x84, 0xA2, 0x9E, 0x4C, 0x87, 0xA5,
+ 0xF9, 0xED, 0xEA, 0xEB, 0x98, 0x0D, 0x81, 0xD9, 0xCB, 0xE3, 0xD5, 0xA0, 0xF7, 0xFF, 0x2A, 0x28,
+ 0xE9, 0x6F, 0x08, 0xE4, 0xBA, 0x76, 0x16, 0x0A, 0xF5, 0x3C, 0x01, 0x11, 0xB3, 0xBA, 0x4C, 0x7E,
+ 0xC3, 0x1F, 0x0B, 0x91, 0x62, 0x82, 0xDD, 0x29, 0x7C, 0x60, 0x5F, 0x56, 0xE5, 0x48, 0x7D, 0xB8,
+ 0x4A, 0xC7, 0x1F, 0x7D, 0xD5, 0xB7, 0x17, 0x9F, 0x91, 0xDD, 0xE3, 0xE0, 0x04, 0x14, 0xF3, 0x4C,
+ 0xD2, 0xB3, 0xC3, 0xAC, 0x7F, 0x63, 0x67, 0xFA, 0x1B, 0x14, 0x0E, 0x2A, 0x8C, 0x82, 0xD8, 0x49,
+ 0x8B, 0x24, 0x4B, 0xF3, 0x21, 0x86, 0x06, 0x91, 0xC9, 0x81, 0xF9, 0x84, 0xC6, 0x2B, 0x12, 0xCF,
+ 0x95, 0x32, 0x7A, 0xFD, 0x9C, 0x1C, 0xFC, 0x3B, 0x3B, 0x06, 0xBA, 0x2C, 0x45, 0x88, 0xDA, 0x5B,
+ 0x5D, 0x90, 0xDC, 0x07, 0xBD, 0xEC, 0xAF, 0xB2, 0x06, 0x98, 0x05, 0xAC, 0x1D, 0x41, 0xA1, 0xD5,
+ 0x76, 0x9D, 0x7B, 0x59, 0x82, 0x9C, 0x46, 0x02, 0xF4, 0x03, 0xB4, 0xFB, 0x70, 0x48, 0x73, 0xB2,
+ 0x4C, 0x8B, 0xA6, 0xDB, 0x11, 0xC5, 0x7E, 0xFE, 0x23, 0x4E, 0xC2, 0x2B, 0x0F, 0x95, 0x51, 0x2A,
+ 0x3B, 0x46, 0x1C, 0xB7, 0xBF, 0x51, 0xF0, 0xA4, 0xF8, 0xAD, 0x16, 0x96, 0xAA, 0x6D, 0xBE, 0xFE,
+ 0x45, 0x46, 0xEF, 0x8B, 0x96, 0xED, 0xE1, 0xE5, 0xB5, 0xEF, 0x22, 0x8C, 0xBA, 0x3A, 0xB0, 0x2F,
+ 0x9A, 0x34, 0x16, 0x52, 0x56, 0x5A, 0x36, 0x8B, 0x50, 0x89, 0xBD, 0xC0, 0xFE, 0xAE, 0x2B, 0xBB,
+ 0x53, 0xAE, 0x76, 0x8D, 0xB6, 0x91, 0x9D, 0x32, 0x18, 0xF5, 0xD7, 0x1A, 0xE5, 0x04, 0x05, 0xFD,
+ 0xDC, 0x5B, 0x67, 0xBE, 0x34, 0x05, 0x03, 0x90, 0xD5, 0xBF, 0xAA, 0x35, 0x8D, 0xB7, 0x63, 0x76,
+ 0xC9, 0x98, 0x2B, 0x99, 0xD6, 0x5A, 0xB4, 0x39, 0x4A, 0xAA, 0xDF, 0xEC, 0x82, 0x83, 0xC6, 0x80,
+ 0xA1, 0x86, 0x74, 0xC8, 0x8E, 0x37, 0xAB, 0x7A, 0xC2, 0x35, 0x99, 0x62, 0xAD, 0x30, 0xD2, 0x4E,
+ 0x30, 0xA4, 0x3F, 0xC6, 0x16, 0x9C, 0xBF, 0xD5, 0x5C, 0x08, 0xF8, 0xF4, 0x35, 0x20, 0x86, 0xF4,
+ 0x0C, 0x12, 0x56, 0xD4, 0xDB, 0x73, 0xDB, 0x82, 0x30, 0x73, 0xD2, 0x60, 0xCF, 0xF7, 0xA8, 0xF6,
+ 0xC8, 0x71, 0xB2, 0x6E, 0xC3, 0x65, 0x05, 0x07, 0x6C, 0x9C, 0x3F, 0xD7, 0xC9, 0x6E, 0x09, 0xFF,
+ 0x9E, 0xF0, 0x68, 0xB6, 0xE0, 0xDB, 0x6A, 0x1F, 0xE9, 0xBC, 0x8C, 0xC1, 0xEB, 0xC5, 0x2A, 0x8B,
+ 0x99, 0x23, 0xFC, 0x35, 0xAF, 0xC1, 0x4A, 0xD8, 0x62, 0x28, 0x95, 0x4C, 0xD5, 0x93, 0x21, 0xBC,
+ 0x19, 0x52, 0xA0, 0x71, 0x3C, 0x2B, 0x3F, 0x88, 0x68, 0xA0, 0xE0, 0x16, 0x10, 0x85, 0xCA, 0xDB,
+ 0x45, 0x96, 0xBD, 0x44, 0xB3, 0x24, 0xE2, 0xCB, 0xE6, 0xE7, 0xC9, 0xDD, 0x7A, 0x78, 0x9B, 0x7C,
+ 0x1E, 0x28, 0x2B, 0xC2, 0x2B, 0x53, 0x12, 0xB2, 0xD7, 0xB8, 0x59, 0x41, 0x19, 0x3D, 0xF9, 0x6F,
+ 0x34, 0xDB, 0x76, 0x43, 0x8C, 0x21, 0x2A, 0xC2, 0xAB, 0x4B, 0x0D, 0xC5, 0x0A, 0x92, 0x41, 0xD2,
+ 0xD2, 0xEB, 0x40, 0x7C, 0x14, 0x5D, 0x73, 0x3D, 0x6C, 0x42, 0xAC, 0xF1, 0xC8, 0x37, 0xCD, 0xC3,
+ 0xC0, 0xDD, 0xC0, 0x42, 0x35, 0x6A, 0x99, 0xF3, 0x7F, 0x63, 0xE1, 0x17, 0xB5, 0x8F, 0xC3, 0x2C,
+ 0xF5, 0x67, 0x4A, 0x96, 0x25, 0xDD, 0xC9, 0x06, 0x3A, 0x86, 0x3C, 0x2B, 0x23, 0x04, 0xB0, 0x53,
+ 0x3C, 0x82, 0xDD, 0x7E, 0xAE, 0x1A, 0xF4, 0x76, 0x65, 0x57, 0xF1, 0x7F, 0xBC, 0x5C, 0xFC, 0xB0,
+ 0xBB, 0x04, 0x13, 0x9B, 0x81, 0x9C, 0x70, 0x87, 0xFE, 0x6C, 0xC2, 0x9B, 0x88, 0x83, 0x3C, 0x4D,
+ 0x43, 0x0B, 0x64, 0xE3, 0x8C, 0x79, 0x25, 0x5D, 0xF7, 0x20, 0xCF, 0xAB, 0x65, 0xC3, 0x9F, 0x17,
+ 0xDA, 0x5A, 0x6F, 0x02, 0x81, 0xEC, 0x8A, 0x20, 0x56, 0x09, 0x31, 0xE2, 0x0E, 0x80, 0x68, 0xE5,
+ 0xA7, 0xFF, 0x70, 0x92, 0x68, 0x09, 0x70, 0x93, 0x98, 0xD1, 0x73, 0xD4, 0x47, 0xA2, 0xD3, 0x91,
+ 0x00, 0xAB, 0xF0, 0x35, 0xD1, 0xBE, 0xB8, 0xC9, 0x9E, 0x82, 0x39, 0x17, 0x2E, 0xB7, 0x8B, 0x0C,
+ 0x7B, 0xAF, 0x84, 0x5C, 0xB5, 0x0A, 0xCE, 0x31, 0x30, 0xE7, 0x38, 0x06, 0xAA, 0x10, 0x48, 0x2C,
+ 0xA8, 0xE1, 0xBD, 0xBD, 0xEE, 0x3D, 0xDA, 0x11, 0xA0, 0x0C, 0x07, 0xFA, 0xD0, 0x5B, 0xA5, 0x91,
+ 0xE5, 0x1D, 0x54, 0x6A, 0xBF, 0x53, 0x56, 0x55, 0x11, 0xC9, 0x5C, 0x89, 0xFE, 0x72, 0x5A, 0xA7,
+ 0x15, 0x9C, 0xBB, 0x37, 0x4E, 0x18, 0x89, 0xED, 0xF2, 0x82, 0x83, 0xF1, 0x5B, 0x9D, 0x27, 0x3D,
+ 0xCF, 0xF3, 0x0B, 0x0C, 0xCB, 0x53, 0xF3, 0x13, 0xA8, 0xA1, 0x5A, 0x0E, 0xB2, 0x21, 0x8B, 0x16,
+ 0xD7, 0x5E, 0xAE, 0xD2, 0x7B, 0x3A, 0x2A, 0xCD, 0x23, 0x14, 0x0F, 0xE7, 0x0D, 0x81, 0x82, 0xF2,
+ 0x41, 0x8B, 0x77, 0x53, 0x16, 0xAE, 0xC7, 0xDF, 0xF7, 0xD1, 0x91, 0x8B, 0x73, 0xA5, 0x0E, 0x9F,
+ 0xC3, 0xBF, 0x2C, 0xC3, 0xE4, 0xB7, 0x60, 0x60, 0xF7, 0xCA, 0x95, 0x6D, 0xFA, 0x4F, 0x66, 0xC2,
+ 0x98, 0xA0, 0x72, 0xC9, 0x0C, 0x9E, 0x6B, 0xFD, 0x5D, 0x14, 0x8B, 0x9E, 0x7F, 0xA1, 0x20, 0x48,
+ 0x99, 0x09, 0xDC, 0xAA, 0xAB, 0xB4, 0x46, 0x10, 0xAB, 0x1B, 0x77, 0x98, 0x2F, 0x7D, 0xE0, 0xD4,
+ 0x18, 0x64, 0x4A, 0x5C, 0xBA, 0x23, 0x3C, 0x7E, 0x2F, 0x96, 0x13, 0xC6, 0x4D, 0x38, 0xED, 0xCE,
+ 0x4D, 0xB3, 0x02, 0x23, 0xAE, 0x9E, 0xD8, 0x8A, 0xC0, 0x17, 0x39, 0x91, 0x75, 0x33, 0x6A, 0xA9,
+ 0x75, 0x12, 0xE3, 0x65, 0x19, 0x30, 0x98, 0x00, 0x4D, 0x82, 0xDB, 0xA3, 0xA2, 0xE7, 0x11, 0x51,
+ 0x7A, 0xA1, 0xFE, 0xD2, 0x4E, 0xEA, 0xBB, 0xCD, 0xA1, 0x29, 0xB0, 0xB3, 0x63, 0x23, 0x54, 0x11,
+ 0x0B, 0xF3, 0xBD, 0x82, 0xA4, 0x60, 0xC2, 0xFE, 0xE9, 0x5C, 0xD7, 0xB5, 0xDA, 0x7D, 0x6C, 0x3D,
+ 0x57, 0xD1, 0xF9, 0x90, 0x03, 0x0B, 0xE8, 0xC1, 0x20, 0xEE, 0x46, 0x68, 0x18, 0x95, 0x66, 0x3C,
+ 0x01, 0x2A, 0xE8, 0x84, 0xC1, 0x26, 0x3B, 0x15, 0xBB, 0x20, 0x5E, 0x3B, 0x57, 0x0E, 0x59, 0xEA,
+ 0x1C, 0xD3, 0x6C, 0xC7, 0x35, 0xE7, 0x23, 0xFE, 0x40, 0x37, 0x84, 0x2D, 0x70, 0x0F, 0xE9, 0x2F,
+ 0xB2, 0x22, 0xEA, 0xB9, 0xB6, 0x93, 0xDC, 0x67, 0xE1, 0xFB, 0x0E, 0x34, 0x91, 0x35, 0x76, 0x52,
+ 0x03, 0x27, 0x79, 0x42, 0x55, 0x1D, 0x5B, 0x8D, 0xAA, 0x17, 0x5C, 0x64, 0x3D, 0x8D, 0xA1, 0x04,
+ 0xBE, 0x3E, 0x6D, 0x92, 0x6E, 0xE6, 0x2C, 0x0B, 0x6E, 0x9B, 0x8A, 0x5D, 0x18, 0x05, 0xB8, 0xE4,
+ 0x18, 0x6E, 0x9E, 0x90, 0x74, 0xD3, 0x1D, 0x33, 0x4D, 0x72, 0xF5, 0x99, 0xE3, 0x2B, 0x2A, 0x0C,
+ 0x11, 0x5C, 0x94, 0xB7, 0x66, 0xCC, 0xAC, 0xF1, 0x0D, 0x8D, 0x20, 0xC5, 0x75, 0x20, 0x4C, 0x0A,
+ 0xB8, 0xBA, 0xCD, 0x0F, 0xD9, 0xF1, 0x59, 0x6E, 0xC8, 0x63, 0x5C, 0x9E, 0xE5, 0xBB, 0x85, 0x93,
+ 0xFE, 0x1F, 0xD9, 0x8C, 0x89, 0xB4, 0x7E, 0xD8, 0xB5, 0xC6, 0x62, 0x03, 0xD1, 0xAB, 0x5F, 0xD2,
+ 0xB4, 0x47, 0xC0, 0xC5, 0xC9, 0x75, 0x14, 0x91, 0x37, 0xFE, 0x3B, 0x78, 0x1F, 0x56, 0x87, 0x13,
+ 0xF4, 0xCC, 0x3A, 0xBD, 0x2C, 0xC1, 0x61, 0xF5, 0xAB, 0x3A, 0xE8, 0x9C, 0x97, 0xCA, 0xAA, 0xA3,
+ 0x12, 0xC4, 0x70, 0x8F, 0x32, 0xDD, 0xEA, 0xE8, 0xF8, 0x8A, 0x03, 0x65, 0x89, 0x99, 0x53, 0x45,
+ 0x28, 0xF3, 0xA8, 0xF3, 0x14, 0x80, 0xB4, 0xD6, 0x44, 0xD4, 0x02, 0xEE, 0x9C, 0x58, 0x46, 0xC1,
+ 0x4F, 0xEE, 0xFA, 0xCD, 0x63, 0x4D, 0x87, 0xE6, 0x22, 0x9F, 0xF9, 0xDA, 0x77, 0xD0, 0x51, 0xAA,
+ 0x1F, 0x2A, 0x2F, 0x48, 0x66, 0x55, 0xE0, 0x2A, 0x5F, 0xEC, 0x12, 0xA6, 0x14, 0xAD, 0x7D, 0xDD,
+ 0xC2, 0x7B, 0x3E, 0xE9, 0x8F, 0x2C, 0xB8, 0x60, 0x7E, 0x03, 0x76, 0x28, 0x7C, 0x22, 0x18, 0x6B,
+ 0x53, 0x39, 0x21, 0x6A, 0xB2, 0x05, 0x75, 0x58, 0xB7, 0xB1, 0x49, 0x1B, 0x11, 0x1D, 0xD6, 0xFA,
+ 0xC8, 0x01, 0x77, 0x12, 0x16, 0x17, 0xB8, 0x71, 0xC2, 0x6F, 0x12, 0xE0, 0xFA, 0xBF, 0x7A, 0xB3,
+ 0xE3, 0xDB, 0xB6, 0x19, 0x78, 0xAF, 0x25, 0x18, 0x4F, 0x7A, 0x21, 0x63, 0xF6, 0x68, 0x33, 0xCC,
+ 0xD9, 0x12, 0x4A, 0x36, 0x73, 0x3D, 0x7C, 0xA4, 0x6E, 0x5E, 0xFD, 0x5E, 0x0D, 0x45, 0xDF, 0x68,
+ 0x66, 0xC6, 0x3F, 0x42, 0xEF, 0xD5, 0x0A, 0x7D, 0x41, 0x3E, 0x1B, 0x4E, 0x3F, 0x93, 0x4F, 0xAA,
+ 0x0B, 0xB4, 0x34, 0x67, 0xEC, 0xEF, 0x23, 0x6B, 0x87, 0x8A, 0xF9, 0x66, 0x48, 0x19, 0xF5, 0x92,
+ 0x57, 0xA8, 0x60, 0x53, 0xC3, 0x37, 0xF3, 0x61, 0x82, 0x42, 0xC3, 0x09, 0x95, 0xBE, 0xE9, 0x1F,
+ 0xBA, 0x1F, 0x01, 0xB6, 0x37, 0xC7, 0xD9, 0x65, 0xAF, 0x2D, 0xB4, 0x42, 0x22, 0xC0, 0x54, 0x1A,
+ 0x3B, 0x13, 0x07, 0x30, 0x94, 0x15, 0x01, 0x17, 0x21, 0x36, 0x3A, 0x4F, 0xC3, 0x76, 0xC4, 0xA9,
+ 0x64, 0x0D, 0xE0, 0x4F, 0x93, 0xCD, 0x5D, 0x7D, 0xD4, 0xB6, 0xDE, 0xAC, 0x9C, 0xB6, 0x79, 0x3B,
+ 0xCE, 0x49, 0x35, 0x21, 0xE2, 0x20, 0xC2, 0x36, 0x9E, 0xCF, 0x51, 0x4D, 0x1D, 0x41, 0x32, 0x05,
+ 0xB0, 0x45, 0x85, 0xEF, 0x68, 0x94, 0xE2, 0x56, 0x61, 0x7A, 0x08, 0xE7, 0x46, 0x3E, 0xBA, 0xEC,
+ 0x9E, 0x82, 0x17, 0x1B, 0xE4, 0xE1, 0x32, 0xCD, 0x9C, 0xF8, 0xC1, 0xE5, 0x1C, 0x9E, 0x84, 0xBB,
+ 0x20, 0x71, 0xF5, 0x6F, 0x0B, 0x55, 0x6F, 0x4C, 0x96, 0x28, 0x08, 0x6E, 0x5D, 0xF2, 0xFE, 0xF9,
+ 0xE2, 0xBB, 0xEF, 0x58, 0xFC, 0x34, 0xEF, 0xD6, 0xF5, 0xB2, 0x77, 0x5F, 0x62, 0x4F, 0x8F, 0x32,
+ 0xD7, 0xAD, 0x14, 0x07, 0xFC, 0xAB, 0x53, 0x06, 0xC9, 0x65, 0x8A, 0x0F, 0xDA, 0xDF, 0x4F, 0xA4,
+ 0x88, 0x45, 0xFC, 0x17, 0x74, 0x1C, 0xE0, 0x9F, 0xBC, 0x91, 0xF3, 0x7A, 0x9D, 0xE8, 0x92, 0xD6,
+ 0x3C, 0x8E, 0x71, 0x65, 0x34, 0x64, 0x4B, 0xAE, 0x41, 0x04, 0x37, 0x3E, 0xE3, 0x79, 0xA1, 0xD4,
+ 0x4F, 0x89, 0xE8, 0x3C, 0x1C, 0x36, 0x41, 0x66, 0x14, 0xA4, 0xCF, 0xC5, 0x38, 0x59, 0xE6, 0x8C,
+ 0x75, 0xE7, 0x6F, 0x3B, 0x20, 0x11, 0x41, 0x55, 0x28, 0x67, 0x12, 0xD5, 0x67, 0x81, 0xC5, 0x76,
+ 0x02, 0xC3, 0xC7, 0x03, 0x1C, 0xC0, 0x2E, 0xDC, 0x7E, 0xD9, 0xAD, 0x24, 0xE0, 0x7A, 0x07, 0x8D,
+ 0xC7, 0xE5, 0x2B, 0x27, 0x13, 0xAC, 0x76, 0x46, 0x93, 0x4B, 0x3B, 0x1C, 0xC7, 0xD2, 0x9E, 0xEF,
+ 0x32, 0xEA, 0x3A, 0x43, 0xDC, 0x79, 0xD6, 0xE8, 0x52, 0x89, 0xAB, 0xEE, 0x9F, 0x22, 0xAA, 0x02,
+ 0xD7, 0x08, 0xE2, 0x50, 0x94, 0x16, 0x09, 0x49, 0x5C, 0x70, 0x61, 0x97, 0xEA, 0x99, 0x42, 0xAC,
+ 0xFB, 0x97, 0xFA, 0x35, 0xA1, 0x80, 0xFD, 0x06, 0x44, 0xA3, 0x6F, 0xFC, 0x39, 0x7A, 0xA2, 0x37,
+ 0x87, 0x3B, 0x72, 0xC2, 0x7A, 0x2A, 0xBA, 0x54, 0x6B, 0xF9, 0xFA, 0x75, 0x46, 0xE6, 0x1B, 0x3C,
+ 0xE7, 0x21, 0xA0, 0xDE, 0xC1, 0x26, 0xC7, 0x3F, 0x8C, 0xA1, 0x8A, 0xC5, 0xBD, 0x7D, 0xC6, 0x70,
+ 0xF7, 0xB6, 0x6B, 0x84, 0xCB, 0x20, 0x4B, 0x34, 0x4D, 0x50, 0xA5, 0xD8, 0xF3, 0x50, 0xF2, 0xE7,
+ 0xE0, 0xE0, 0x32, 0x07, 0x5F, 0xF6, 0x86, 0x06, 0x9D, 0x31, 0x7A, 0xB0, 0x63, 0xB7, 0xB3, 0x04,
+ 0x5B, 0x31, 0xA6, 0x9B, 0x29, 0x27, 0x96, 0xB1, 0x5A, 0x41, 0x09, 0xE3, 0x13, 0x39, 0x8E, 0x0C,
+ 0x94, 0xFF, 0xD2, 0x2D, 0x8F, 0x91, 0x73, 0x43, 0xC7, 0xFA, 0x65, 0x56, 0x70, 0x94, 0x0B, 0x5F,
+ 0xA3, 0xD1, 0xCB, 0x4C, 0x95, 0x5F, 0x64, 0x8D, 0xD2, 0x7C, 0x68, 0xBA, 0x31, 0x0D, 0x1C, 0x55,
+ 0xB6, 0x2F, 0x96, 0xB7, 0xB1, 0x79, 0xDE, 0x50, 0xB5, 0x8D, 0x4C, 0xC4, 0xD5, 0x3A, 0xE2, 0x13,
+ 0x80, 0x37, 0x68, 0x51, 0xDA, 0x33, 0x70, 0x95, 0x49, 0x57, 0xB5, 0x3F, 0x3F, 0x2F, 0xDA, 0xC5,
+ 0xE3, 0x63, 0x95, 0x63, 0x29, 0x96, 0x4A, 0xED, 0xB5, 0x2F, 0x7D, 0xC2, 0xCC, 0x4C, 0x87, 0xDE,
+ 0x49, 0xE2, 0xCA, 0x46, 0x60, 0x38, 0x31, 0xB4, 0x65, 0x86, 0x3F, 0x91, 0x61, 0x8C, 0x11, 0x0F,
+ 0xAF, 0x6F, 0xED, 0xED, 0x4B, 0x9F, 0x32, 0xAB, 0x7A, 0xBB, 0x83, 0xCD, 0xE9, 0x36, 0x58, 0x7E,
+ 0x3D, 0xCD, 0xD1, 0x00, 0x41, 0x80, 0x41, 0x14, 0xD3, 0xF1, 0xEA, 0x24, 0xF2, 0xD7, 0x79, 0x71,
+ 0x71, 0x0B, 0x24, 0x5E, 0x2B, 0xA8, 0x15, 0xCA, 0x20, 0x35, 0xF5, 0x8B, 0xED, 0xC6, 0xD7, 0x7B,
+ 0xAB, 0xF5, 0x74, 0x7E, 0x55, 0xEE, 0xCC, 0x92, 0xF0, 0xBB, 0x0D, 0xE4, 0xF7, 0xD9, 0xD4, 0x74,
+ 0x89, 0x87, 0xF2, 0xE2, 0xAA, 0x73, 0xDF, 0xCD, 0x5C, 0xE1, 0x0D, 0xF1, 0xDA, 0xA9, 0x62, 0x33,
+ 0x20, 0x61, 0x5B, 0xC4, 0x17, 0x8A, 0xDA, 0xA3, 0xD1, 0xA7, 0xB1, 0x27, 0xA1, 0xD7, 0x41, 0x02,
+ 0x06, 0x4A, 0x18, 0xC7, 0xDE, 0x2B, 0xD2, 0xF9, 0xD2, 0x16, 0x43, 0x4B, 0x02, 0x0E, 0xD6, 0x2F,
+ 0x16, 0x28, 0xCA, 0x9C, 0x19, 0xAE, 0x27, 0x61, 0xC8, 0x09, 0xD6, 0xAE, 0x89, 0x90, 0x52, 0x04,
+ 0xC2, 0x17, 0x7D, 0x3D, 0x41, 0x18, 0x20, 0x70, 0xB4, 0xBA, 0x83, 0x51, 0xE1, 0xF0, 0x23, 0x7E,
+ 0x9B, 0x4B, 0x56, 0xC7, 0x9F, 0x3D, 0x0D, 0xE6, 0x92, 0xED, 0xC0, 0xAD, 0x46, 0xC3, 0x35, 0x94,
+ 0xFB, 0xDB, 0x3C, 0xB3, 0x95, 0x9C, 0xFD, 0xA2, 0x9E, 0x23, 0x49, 0xA6, 0xDC, 0xA0, 0x63, 0xC3,
+ 0x5D, 0x37, 0xF1, 0x9C, 0x57, 0xE7, 0x58, 0xD5, 0x28, 0xC4, 0x73, 0x2B, 0xE3, 0xBF, 0x14, 0xD3,
+ 0x83, 0xEC, 0x49, 0x03, 0x42, 0xD1, 0x3F, 0xE6, 0x22, 0xEE, 0xC5, 0x23, 0x50, 0x64, 0x5F, 0xA6,
+ 0x9F, 0x92, 0x5A, 0x69, 0xC5, 0x7D, 0x76, 0x81, 0xB9, 0x0F, 0x43, 0x24, 0x94, 0x20, 0xF1, 0x51,
+ 0xF7, 0x30, 0xF7, 0x6A, 0x3A, 0x73, 0xEF, 0x5B, 0x39, 0xD8, 0x75, 0x0F, 0x78, 0xFB, 0x7A, 0xFD,
+ 0xEB, 0x80, 0xE8, 0xF0, 0x98, 0x4C, 0xE2, 0xDE, 0xA9, 0x5F, 0x75, 0x36, 0x62, 0x3F, 0x7B, 0x66,
+ 0xF1, 0xA8, 0xA7, 0x55, 0xD4, 0x6C, 0x03, 0xE8, 0xFF, 0xD6, 0xBB, 0x50, 0x0E, 0x38, 0xFB, 0xD5,
+ 0xD9, 0xB2, 0x4B, 0xFD, 0xC5, 0x05, 0x08, 0x88, 0xBC, 0x90, 0x47, 0x15, 0xE1, 0x92, 0x04, 0x18,
+ 0x06, 0x4B, 0x13, 0x12, 0x12, 0xCE, 0xF6, 0xA4, 0x9A, 0xBC, 0x1B, 0x60, 0x9E, 0x49, 0xBA, 0xC5,
+ 0x56, 0x9D, 0x47, 0x21, 0x5F, 0xE5, 0x19, 0xFC, 0x71, 0xCB, 0x8D, 0x6F, 0x9E, 0x91, 0x18, 0x6F,
+ 0x6E, 0xF8, 0x07, 0xE9, 0x6C, 0xB3, 0x6B, 0x94, 0x2C, 0xCF, 0xAC, 0x5F, 0x1C, 0x1A, 0xA1, 0xD7,
+ 0x8F, 0x9A, 0x1B, 0x49, 0x28, 0x22, 0xEA, 0x52, 0xDE, 0x0D, 0xB5, 0xF9, 0x0E, 0x08, 0xA4, 0x78,
+ 0x3B, 0x7F, 0x31, 0x1C, 0x75, 0x91, 0x0A, 0xC4, 0x35, 0x68, 0x0D, 0xDF, 0x00, 0xEB, 0x31, 0x0C,
+ 0x84, 0x62, 0xEC, 0xAF, 0x82, 0xAD, 0x52, 0xA2, 0xE2, 0x1F, 0xFE, 0xAC, 0xBE, 0x4D, 0xFB, 0xCE,
+ 0x0C, 0x82, 0xE5, 0x4A, 0x4D, 0xD8, 0x98, 0x57, 0xFD, 0xE6, 0x83, 0x21, 0x95, 0x25, 0xF3, 0xAD,
+ 0x2E, 0xAD, 0x69, 0xB9, 0x4E, 0x1E, 0x4A, 0x29, 0xF0, 0x75, 0xB2, 0xE2, 0x05, 0x7A, 0x4E, 0xF2,
+ 0x7D, 0x1A, 0xFB, 0x03, 0xB4, 0xEE, 0xA2, 0x69, 0x44, 0x42, 0x5C, 0x96, 0xFB, 0xE9, 0xC7, 0x42,
+ 0x74, 0x7A, 0x2F, 0xDE, 0xCC, 0xA4, 0x5C, 0x29, 0xA9, 0x8C, 0xB6, 0x18, 0xBD, 0x0F, 0xB5, 0xB4,
+ 0x79, 0x63, 0x87, 0xAA, 0x60, 0xCA, 0xE9, 0x7C, 0x6A, 0xA9, 0x94, 0x0F, 0x7A, 0x5B, 0xEB, 0x4D,
+ 0x14, 0x27, 0xC5, 0x27, 0xDB, 0x98, 0x7A, 0xB4, 0x6A, 0x79, 0xCB, 0x27, 0xEB, 0x6E, 0x51, 0x9E,
+ 0x6C, 0x55, 0xFC, 0x40, 0xAF, 0xBF, 0x2F, 0x66, 0xED, 0xE1, 0xB0, 0x46, 0x29, 0xCE, 0x04, 0x92,
+ 0xF1, 0xF2, 0x9C, 0xA4, 0x9D, 0x0C, 0xFC, 0x85, 0x57, 0xC4, 0x1D, 0x85, 0x28, 0x8A, 0xFD, 0xA7,
+ 0xF1, 0x3E, 0x24, 0x10, 0x90, 0xBE, 0x97, 0xCE, 0x15, 0x78, 0x7C, 0x46, 0x13, 0xB2, 0x5E, 0x42,
+ 0x4D, 0x67, 0x5D, 0x1F, 0x71, 0x7A, 0xB0, 0xAD, 0xB8, 0xAA, 0x8E, 0xA2, 0x8E, 0x1E, 0x3F, 0xD1,
+ 0x7C, 0xE4, 0x66, 0xCA, 0x06, 0xD7, 0xC8, 0xDC, 0x9B, 0xC5, 0x87, 0x11, 0x99, 0x8D, 0xEF, 0xE9,
+ 0xDA, 0xB3, 0x2F, 0x20, 0x8D, 0x9F, 0xB0, 0x4B, 0xF8, 0xDE, 0x68, 0xC5, 0x88, 0xC2, 0x5D, 0x84,
+ 0xB9, 0xB5, 0x90, 0x7A, 0x41, 0x0C, 0x31, 0x33, 0x55, 0x9D, 0xD6, 0xBE, 0x86, 0x15, 0xA9, 0xE3,
+ 0xFD, 0xB0, 0xB9, 0x79, 0xF8, 0x5C, 0xF4, 0x4B, 0x49, 0x74, 0x27, 0x81, 0xC1, 0xEC, 0xB4, 0x2B,
+ 0x91, 0x7E, 0xF3, 0xC2, 0x9D, 0x62, 0x35, 0x49, 0xF4, 0xE3, 0x8E, 0x4D, 0xEE, 0x44, 0xB7, 0xE2,
+ 0x20, 0xB1, 0x38, 0xC5, 0x30, 0xFD, 0x01, 0x6C, 0xCC, 0x6E, 0x76, 0xF9, 0x6C, 0x27, 0xD1, 0x0F,
+ 0x67, 0x04, 0xCF, 0xF1, 0x00, 0xB5, 0x6A, 0xD4, 0xCD, 0x58, 0x76, 0xAF, 0x1C, 0xFF, 0x74, 0xD7,
+ 0xA7, 0x77, 0x45, 0xCD, 0x33, 0x4E, 0x45, 0xBD, 0xCC, 0x38, 0x5C, 0x6C, 0xF7, 0x7C, 0xF7, 0x2B,
+ 0xCF, 0x45, 0x2C, 0xC4, 0x73, 0xB1, 0x2D, 0x2B, 0xE6, 0x06, 0x0F, 0x4B, 0xAB, 0x48, 0x1E, 0xF2,
+ 0x58, 0x0C, 0x8B, 0x47, 0x4D, 0x81, 0x32, 0x23, 0x7F, 0x7D, 0x2F, 0xF4, 0x80, 0x43, 0x3E, 0x8A,
+ 0xDC, 0x5D, 0x1F, 0x27, 0xE6, 0xA2, 0xDC, 0xC8, 0xB6, 0xF7, 0x63, 0x0E, 0x6D, 0xEB, 0xE8, 0x16,
+ 0x52, 0x69, 0x97, 0xF2, 0x61, 0x7B, 0x2C, 0x8A, 0x15, 0xD8, 0xE1, 0xE9, 0x28, 0xFF, 0x54, 0x92,
+ 0xF3, 0xCB, 0x72, 0x72, 0xB5, 0x23, 0x48, 0xE9, 0x52, 0xA3, 0xC7, 0x3B, 0x1D, 0x05, 0x90, 0x26,
+ 0x10, 0xA4, 0x42, 0x9B, 0xA5, 0xAF, 0x7F, 0x99, 0x3B, 0x5A, 0x70, 0xA4, 0x6C, 0xF8, 0xB5, 0xC3,
+ 0x42, 0x46, 0x47, 0xEA, 0x62, 0xA0, 0x8F, 0x34, 0x5F, 0x5F, 0x0A, 0x88, 0xB9, 0x19, 0x47, 0xFD,
+ 0x94, 0x04, 0x05, 0x7C, 0x8B, 0x65, 0xC4, 0x1D, 0xD2, 0xFC, 0xDD, 0x0E, 0x3A, 0x92, 0x8B, 0xE0,
+ 0xCE, 0xBD, 0xF9, 0x1B, 0xFB, 0x91, 0xD3, 0x90, 0x80, 0x08, 0x6B, 0x94, 0x20, 0xCC, 0xC8, 0xC9,
+ 0xF9, 0x60, 0x28, 0x7D, 0x6F, 0xDA, 0x5E, 0x64, 0xE0, 0x1C, 0x5F, 0xE9, 0xB8, 0xC3, 0x33, 0x18,
+ 0xA5, 0x60, 0xE4, 0xE1, 0x45, 0x1B, 0xEE, 0x20, 0xFF, 0x40, 0x52, 0xFB, 0x3F, 0xD2, 0x03, 0x0A,
+ 0x71, 0xD2, 0xCE, 0xC5, 0x84, 0x98, 0x21, 0xE1, 0xF8, 0x13, 0xD6, 0x78, 0x21, 0x75, 0x3C, 0x22,
+ 0x1A, 0xCC, 0x67, 0x12, 0x9B, 0x31, 0x06, 0xB7, 0x5E, 0xE6, 0x4B, 0xC2, 0x7E, 0x12, 0xCA, 0x6D,
+ 0xD6, 0x95, 0x67, 0xDC, 0xF1, 0x7C, 0xC8, 0xAD, 0x95, 0x53, 0x25, 0x7B, 0x16, 0xD3, 0x0B, 0xE4,
+ 0xF4, 0x17, 0x86, 0xC6, 0xA1, 0x2B, 0x28, 0xA9, 0x02, 0x1D, 0x48, 0x14, 0x42, 0x0A, 0x76, 0x95,
+ 0x3D, 0xC4, 0x2D, 0x77, 0x5A, 0x67, 0x6F, 0xDB, 0x81, 0xA4, 0xA4, 0x74, 0x19, 0xA0, 0xFC, 0x2F,
+ 0x9D, 0x26, 0x4D, 0x44, 0x44, 0xDD, 0xAE, 0xCB, 0x85, 0xBC, 0x21, 0xBB, 0xFC, 0xDF, 0xDB, 0x54,
+ 0xAA, 0x21, 0x95, 0x0C, 0xFF, 0x2C, 0x17, 0x37, 0x5A, 0xFC, 0x4A, 0x39, 0x34, 0xED, 0xE4, 0x71,
+ 0x84, 0x5C, 0x28, 0xEB, 0x0A, 0x25, 0x16, 0xA4, 0xA1, 0x8B, 0x63, 0xB0, 0xFB, 0x26, 0xF3, 0xD1,
+ 0x37, 0x0E, 0x52, 0xF9, 0x77, 0x3D, 0xAA, 0x66, 0xC7, 0xB9, 0xED, 0x84, 0x88, 0xFE, 0xEF, 0x33,
+ 0x5A, 0x61, 0x87, 0x03, 0x2A, 0x83, 0xDB, 0x4C, 0x73, 0xBE, 0xF9, 0x6A, 0x04, 0x3F, 0xEC, 0x6E,
+ 0xCC, 0x5D, 0xA5, 0x8F, 0xA1, 0xCB, 0x53, 0x86, 0x80, 0xC4, 0x21, 0xBA, 0xC2, 0x2D, 0x65, 0xE7,
+ 0xE2, 0x35, 0x97, 0x2C, 0xA6, 0xE2, 0x09, 0x76, 0x10, 0xA2, 0xC0, 0x30, 0xDF, 0x9A, 0xDC, 0x38,
+ 0x06, 0x3D, 0x05, 0x26, 0x16, 0x4D, 0xA8, 0xA9, 0x1E, 0x07, 0x1D, 0x62, 0x6C, 0xA5, 0xCC, 0xEB,
+ 0x05, 0x21, 0x64, 0xD4, 0x3E, 0x4B, 0xB3, 0x96, 0x14, 0x75, 0xFC, 0x5C, 0xCA, 0xDB, 0x1F, 0xDC,
+ 0x41, 0x9D, 0x60, 0x05, 0xF8, 0x89, 0xC9, 0x7E, 0x3B, 0x74, 0x75, 0x49, 0x34, 0x3A, 0x74, 0x79,
+ 0xDF, 0x16, 0x3D, 0x6F, 0xA1, 0xF3, 0x26, 0x29, 0x61, 0x5F, 0xBB, 0xEB, 0x62, 0x42, 0x3A, 0x7F,
+ 0x2F, 0xC5, 0x19, 0xD6, 0x77, 0x9E, 0x1D, 0xF5, 0x15, 0x71, 0x6F, 0x74, 0x1E, 0xE5, 0xBA, 0x08,
+ 0x21, 0x07, 0x64, 0x9F, 0x78, 0x5A, 0x11, 0x20, 0xFB, 0x43, 0x4F, 0x4A, 0xFD, 0x6A, 0x2F, 0xB7,
+ 0x66, 0x7A, 0xA5, 0x27, 0xF7, 0x6F, 0x05, 0x85, 0xCC, 0xC2, 0xC5, 0xDE, 0x18, 0x43, 0xB9, 0x9F,
+ 0x84, 0xBA, 0x09, 0x1A, 0x0E, 0x7E, 0xBE, 0xBA, 0xE4, 0xD6, 0x1E, 0x9E, 0x83, 0x7D, 0x1D, 0xED,
+ 0xDE, 0x4D, 0x96, 0x91, 0x50, 0x2D, 0x54, 0x46, 0x98, 0xC5, 0xE2, 0xE6, 0xE7, 0x6F, 0xB4, 0x06,
+ 0xF0, 0x56, 0x4C, 0x2B, 0xB1, 0xEC, 0xC4, 0x98, 0x87, 0x76, 0x00, 0xF8, 0x47, 0x70, 0x4F, 0x13,
+ 0x2C, 0xDE, 0x79, 0x9B, 0xB5, 0x90, 0xFA, 0xC3, 0xAA, 0x0D, 0xB6, 0xCC, 0x37, 0xB2, 0x5D, 0xB7,
+ 0x8B, 0x19, 0x96, 0x20, 0xFF, 0x0C, 0x21, 0x23, 0x41, 0xA8, 0x15, 0x3F, 0x03, 0x01, 0x57, 0xA2,
+ 0x7F, 0xF1, 0xE6, 0x4B, 0x50, 0xC3, 0xD6, 0xF3, 0xEF, 0xE0, 0x7A, 0xEE, 0x76, 0xA0, 0x67, 0x22,
+ 0x09, 0x45, 0x91, 0x07, 0x87, 0x1E, 0xC6, 0x2A, 0x13, 0x45, 0x10, 0x0E, 0x72, 0x9E, 0xFB, 0xA0,
+ 0x9C, 0xA4, 0xA3, 0xE7, 0x17, 0xC5, 0x90, 0x30, 0x42, 0x87, 0x1B, 0x3A, 0xC0, 0xD9, 0xA7, 0x9A,
+ 0xEE, 0xDE, 0x42, 0xFE, 0x96, 0xD3, 0x7A, 0x3E, 0xBE, 0xAF, 0xE9, 0xCD, 0xEF, 0xA6, 0xD9, 0xC6,
+ 0x0E, 0x2C, 0xA9, 0xC1, 0x6B, 0x99, 0x11, 0xC2, 0x91, 0x45, 0x0B, 0xC4, 0xD0, 0xC3, 0xD7, 0xF9,
+ 0x0B, 0x9A, 0x1E, 0x2E, 0xC7, 0x01, 0x22, 0x6A, 0x75, 0x50, 0x89, 0x79, 0x07, 0x21, 0x8C, 0xF9,
+ 0xA6, 0x15, 0x95, 0xC0, 0xE3, 0xFC, 0x20, 0x65, 0x36, 0x2D, 0x5F, 0xAE, 0xFE, 0xCE, 0x97, 0x71,
+ 0xF5, 0x3A, 0xBD, 0xCB, 0xA1, 0x9F, 0x46, 0xA6, 0x3A, 0xA7, 0x7A, 0x26, 0xA2, 0xDE, 0x36, 0x19,
+ 0x15, 0xDE, 0x17, 0x7E, 0xD7, 0x5E, 0x4A, 0xEE, 0xE2, 0xC9, 0x53, 0x25, 0x77, 0xC3, 0x18, 0xBB,
+ 0xB4, 0xAA, 0x43, 0xFD, 0x5C, 0x21, 0x8A, 0x37, 0xDB, 0x1C, 0x3D, 0x36, 0x2E, 0x6D, 0xEA, 0x61,
+ 0x72, 0x9E, 0xF1, 0x6F, 0xD1, 0x14, 0xF6, 0x29, 0x4E, 0xFD, 0xFD, 0x3D, 0x4D, 0xB9, 0x25, 0x4B,
+ 0x38, 0xA2, 0x00, 0xEB, 0x14, 0xBA, 0xEE, 0xB1, 0x03, 0x84, 0x98, 0xF4, 0xCF, 0x05, 0x9E, 0x1C,
+ 0x7A, 0x8F, 0xAE, 0x85, 0x76, 0x57, 0xF4, 0x8E, 0x16, 0x06, 0x35, 0x77, 0xBB, 0x90, 0x41, 0x9E,
+ 0xCB, 0x52, 0x97, 0xCA, 0xC1, 0x7F, 0xA9, 0x01, 0x8B, 0x7D, 0xC4, 0xB8, 0xD9, 0xDC, 0x01, 0x3D,
+ 0x58, 0xF8, 0x10, 0xD1, 0xDF, 0x1A, 0x6A, 0x27, 0xE2, 0x65, 0x47, 0x1A, 0xC3, 0x8C, 0xDB, 0xE4,
+ 0xC5, 0x5C, 0x72, 0x0D, 0xAB, 0x84, 0x71, 0x54, 0xE2, 0x0F, 0xBB, 0xDE, 0xE0, 0x1F, 0xB1, 0x70,
+ 0x08, 0x09, 0x6B, 0x43, 0x72, 0x76, 0x71, 0x7C, 0xA5, 0x87, 0x65, 0x11, 0x7F, 0xA3, 0x17, 0x93,
+ 0x1C, 0x88, 0x4C, 0x6D, 0x9E, 0x36, 0x17, 0x37, 0x7F, 0x18, 0xDE, 0x6B, 0xC9, 0xEF, 0x04, 0x95,
+ 0xE6, 0x0A, 0x20, 0xEF, 0x30, 0x53, 0xED, 0x09, 0x1F, 0x08, 0xA3, 0x42, 0x1B, 0xA5, 0x5F, 0x21,
+ 0x9D, 0xFF, 0xE1, 0x13, 0x23, 0xC9, 0x36, 0xB4, 0x43, 0x1F, 0x34, 0x2A, 0x18, 0xC5, 0x26, 0x42,
+ 0xCB, 0xFB, 0xF3, 0x67, 0xA8, 0x5E, 0xF6, 0x14, 0x50, 0x68, 0xA6, 0xF9, 0x6D, 0x78, 0xB5, 0xF3,
+ 0x8A, 0x14, 0xE3, 0xFE, 0xB5, 0x7C, 0x88, 0x11, 0x56, 0xDA, 0x9A, 0x62, 0x30, 0x46, 0x34, 0xFB,
+ 0x9D, 0x99, 0xE0, 0xA6, 0xB2, 0x2F, 0xA6, 0xF3, 0x7F, 0x2D, 0xAC, 0x71, 0x29, 0x0A, 0x3D, 0x86,
+ 0xB0, 0x75, 0x97, 0xA4, 0xC3, 0x28, 0x9D, 0x6D, 0x0F, 0xA1, 0x3A, 0xB1, 0xC7, 0xEB, 0xC5, 0x3D,
+ 0x38, 0xE5, 0xED, 0xA6, 0xD9, 0xDF, 0x25, 0x38, 0x81, 0xBC, 0xBA, 0x73, 0x80, 0x09, 0xED, 0x98,
+ 0x59, 0xB9, 0xD9, 0x71, 0xD1, 0xD8, 0x6B, 0xF7, 0x08, 0xF8, 0x8E, 0x0A, 0xD2, 0x57, 0x66, 0xEA,
+ 0x02, 0x5F, 0x8B, 0xF3, 0xAD, 0x62, 0xCA, 0x25, 0x83, 0xD3, 0xA4, 0x0C, 0x3A, 0x68, 0x8E, 0xFC,
+ 0x8A, 0xDE, 0xD8, 0x42, 0x47, 0x6C, 0x38, 0x57, 0xE6, 0xD2, 0x6B, 0x42, 0xDD, 0x68, 0x8E, 0xBA,
+ 0xCD, 0xC7, 0xFB, 0x1C, 0x72, 0x6E, 0xE8, 0x2C, 0x16, 0xCF, 0xB1, 0xEB, 0x1F, 0x07, 0xF4, 0xEB,
+ 0x56, 0x44, 0xD2, 0xA5, 0xC8, 0xCB, 0x97, 0xD5, 0x71, 0xA1, 0xAE, 0x11, 0x38, 0x2F, 0x2E, 0xB8,
+ 0x06, 0x80, 0x73, 0xA2, 0x82, 0xC6, 0x0F, 0x24, 0x58, 0xD9, 0xDB, 0x5A, 0x1A, 0xAC, 0xCA, 0xCA,
+ 0x6C, 0xB3, 0x74, 0x59, 0x4A, 0xBC, 0x42, 0x80, 0x8D, 0x2A, 0xF7, 0x5E, 0x12, 0x7F, 0x01, 0x01,
+ 0x6B, 0xF4, 0x0B, 0xFE, 0x83, 0xD1, 0xC9, 0x9C, 0x11, 0xFE, 0x7C, 0x18, 0xBD, 0xF0, 0xB9, 0x93,
+ 0xEA, 0x5E, 0x6F, 0x95, 0xA1, 0x06, 0x90, 0xA2, 0xEA, 0xAD, 0xA5, 0x87, 0x23, 0x78, 0x9A, 0x20,
+ 0x50, 0xAF, 0x38, 0x17, 0x6D, 0x14, 0xBB, 0x68, 0x5C, 0xCB, 0x6E, 0xC7, 0xD3, 0x11, 0x81, 0x43,
+ 0xD5, 0xE5, 0x87, 0xE4, 0x4E, 0xFB, 0xEE, 0x3E, 0x3A, 0x6D, 0xEC, 0x79, 0xE5, 0x90, 0x68, 0xCB,
+ 0xF7, 0x01, 0xFF, 0x26, 0x3B, 0x82, 0xB1, 0x67, 0x04, 0xB7, 0x32, 0x52, 0xA0, 0xFF, 0x60, 0x97,
+ 0x8D, 0xA9, 0x8C, 0xDC, 0xF3, 0x37, 0xE1, 0x87, 0x1F, 0x95, 0xAD, 0x16, 0x69, 0x4B, 0xF2, 0x26,
+ 0xE4, 0x79, 0x1C, 0x3C, 0xA8, 0x87, 0x4D, 0x9D, 0x0D, 0xB2, 0x01, 0x29, 0x22, 0xB6, 0x20, 0x8B,
+ 0x66, 0x8A, 0x1A, 0x09, 0xF4, 0xE1, 0xAF, 0x52, 0xBA, 0x63, 0xA9, 0x35, 0xD1, 0x1D, 0x4B, 0xDD,
+ 0xBE, 0x30, 0x11, 0x4E, 0xFE, 0xCD, 0x57, 0x54, 0xFA, 0x39, 0xB4, 0x8C, 0x2B, 0x0D, 0x83, 0x36,
+ 0x18, 0x81, 0xE5, 0xBA, 0x18, 0xDF, 0x41, 0x5F, 0x21, 0x25, 0xCE, 0x47, 0x11, 0x56, 0x20, 0x5D,
+ 0x72, 0xFA, 0x54, 0x1E, 0xF5, 0x0A, 0x31, 0x92, 0x85, 0x95, 0x26, 0x11, 0x26, 0x24, 0x67, 0x84,
+ 0x1A, 0xA2, 0x71, 0xFB, 0xAE, 0x7E, 0xAE, 0x27, 0xB5, 0x64, 0xF0, 0xF3, 0x40, 0x55, 0x7D, 0xDB,
+ 0xF3, 0x28, 0x62, 0xDD, 0xF0, 0xFA, 0x41, 0xD7, 0xCA, 0x38, 0x73, 0x25, 0xD9, 0x13, 0x3E, 0xCB,
+ 0xC2, 0x49, 0x79, 0x10, 0xE9, 0x43, 0xCD, 0xEA, 0x78, 0x6C, 0x61, 0x36, 0x87, 0xF3, 0x37, 0x80,
+ 0x08, 0x3C, 0x5B, 0x41, 0x1A, 0x59, 0x3E, 0xA0, 0x2D, 0x07, 0x03, 0x9B, 0xEE, 0x47, 0xEC, 0xB4,
+ 0xB8, 0xB5, 0x5C, 0x5F, 0x70, 0xAB, 0x04, 0x12, 0xF7, 0x5A, 0x89, 0xB7, 0x00, 0x6A, 0x2A, 0x37,
+ 0x14, 0x56, 0xA8, 0x03, 0x45, 0x38, 0xBB, 0xC5, 0x70, 0xAB, 0x4B, 0xBE, 0x6D, 0xEA, 0xA6, 0x27,
+ 0x1F, 0x19, 0x5A, 0x02, 0x12, 0xE0, 0x9E, 0x83, 0xD9, 0x78, 0x27, 0x34, 0x6B, 0x81, 0x2A, 0x82,
+ 0x73, 0x80, 0x06, 0x7E, 0x9C, 0xE2, 0xFB, 0x6E, 0x12, 0xAE, 0xA6, 0x7E, 0x8D, 0xBF, 0xAC, 0x5A,
+ 0x6C, 0x49, 0x81, 0xE7, 0x03, 0x8C, 0x3C, 0x05, 0x01, 0x61, 0x96, 0xD8, 0x05, 0x62, 0xFA, 0x36,
+ 0xBC, 0x26, 0x8E, 0xB3, 0x2D, 0x49, 0x80, 0x6B, 0x4D, 0xF1, 0x63, 0x42, 0x56, 0x53, 0xA8, 0x8E,
+ 0x63, 0xB2, 0xCF, 0x38, 0x31, 0xF0, 0x56, 0x6D, 0x58, 0x6A, 0xEB, 0x59, 0x07, 0x27, 0x08, 0x1D,
+ 0x64, 0xE2, 0x5A, 0x69, 0xBE, 0x47, 0xE8, 0xCA, 0xEE, 0x66, 0x3D, 0x95, 0xE3, 0x00, 0x24, 0xAF,
+ 0xEA, 0xF6, 0xE8, 0x30, 0xB2, 0x24, 0x85, 0x30, 0x28, 0xFB, 0x46, 0x7A, 0xDC, 0xC1, 0x11, 0xF6,
+ 0xBE, 0xBB, 0x12, 0x92, 0x9E, 0x7A, 0x85, 0x24, 0x25, 0xF1, 0xFB, 0xDE, 0xD1, 0x1E, 0x46, 0xCE,
+ 0x4D, 0xCC, 0xB4, 0x5D, 0xD2, 0x41, 0x7F, 0x47, 0x92, 0x1A, 0xAE, 0xB3, 0xB5, 0x26, 0x96, 0xB2,
+ 0x38, 0x92, 0x33, 0x67, 0x52, 0x3D, 0xA9, 0x3C, 0xA0, 0x46, 0x43, 0xE8, 0xEE, 0x22, 0x82, 0xD7,
+ 0xEC, 0xBC, 0x79, 0x9E, 0x0F, 0x47, 0x20, 0x32, 0x48, 0x7E, 0x79, 0x2C, 0x82, 0xD7, 0x57, 0x31,
+ 0xD8, 0xE8, 0xEC, 0x4D, 0x44, 0x7E, 0x92, 0xB8, 0xA2, 0xE3, 0xC5, 0x09, 0x6C, 0x13, 0xFF, 0xF0,
+ 0x35, 0x12, 0x63, 0x46, 0x46, 0x35, 0x3F, 0xC7, 0x7C, 0xB8, 0xEA, 0xA7, 0x96, 0x9D, 0x19, 0xAC,
+ 0x72, 0x44, 0xA5, 0xBC, 0x41, 0xD0, 0x4D, 0xA2, 0xD7, 0x00, 0x19, 0xFF, 0xD7, 0x3F, 0x09, 0xEB,
+ 0x58, 0xAC, 0x81, 0x9D, 0xBB, 0x80, 0x74, 0xFA, 0x2E, 0xBC, 0x6D, 0xE6, 0xEB, 0x91, 0x80, 0x5F,
+ 0x67, 0x03, 0x14, 0x54, 0x65, 0x0A, 0x7D, 0x6C, 0xC1, 0xC9, 0xC0, 0xF4, 0xE0, 0x7B, 0x6A, 0x45,
+ 0xCF, 0x13, 0x3E, 0x37, 0x07, 0x03, 0x42, 0xCA, 0xE0, 0xA2, 0xD1, 0x00, 0x00, 0x10, 0xDE, 0xE5,
+ 0x81, 0x9A, 0xD0, 0x14, 0xF7, 0x98, 0xA5, 0xE1, 0xD3, 0x84, 0xAC, 0x70, 0xC6, 0x75, 0xB4, 0x27,
+ 0xF5, 0xEB, 0x08, 0x4C, 0x64, 0xC1, 0x74, 0x45, 0xB1, 0x30, 0x48, 0xE4, 0xAA, 0x99, 0xBD, 0xC0,
+ 0x27, 0xDE, 0x54, 0xA4, 0xC4, 0xFE, 0xDF, 0x69, 0xF2, 0x46, 0xF8, 0x7E, 0x79, 0x99, 0xFE, 0xD1,
+ 0x4A, 0x77, 0x6C, 0xFA, 0x13, 0x2C, 0xD3, 0x9B, 0x45, 0x2F, 0x86, 0x0F, 0xB6, 0xAA, 0x76, 0x42,
+ 0xE7, 0x11, 0x3D, 0xE9, 0x52, 0xC1, 0x3B, 0x17, 0x66, 0x60, 0x1C, 0x67, 0xA9, 0xF0, 0x83, 0xFF,
+ 0x80, 0x59, 0x4F, 0xAA, 0xC7, 0xE7, 0x95, 0x81, 0xA0, 0xEE, 0x5D, 0x3D, 0x36, 0xA6, 0x0B, 0x81,
+ 0xFD, 0xD0, 0xF3, 0xE7, 0x76, 0x7C, 0x11, 0xB4, 0x4F, 0x62, 0xD6, 0x3A, 0x1E, 0x5D, 0xED, 0x91,
+ 0xB3, 0x55, 0x2D, 0x83, 0xD3, 0xF4, 0xC9, 0x52, 0x59, 0x6B, 0xD2, 0xCA, 0x22, 0xC4, 0x8D, 0x74,
+ 0xEC, 0x15, 0x47, 0x03, 0x0B, 0xDD, 0x1E, 0x83, 0x6A, 0xD7, 0x3C, 0x6F, 0x57, 0x67, 0x6B, 0x77,
+ 0x8D, 0x67, 0x98, 0x88, 0x5D, 0x3C, 0x4C, 0x52, 0x6B, 0xC5, 0x8F, 0x82, 0x10, 0x18, 0x13, 0x3F,
+ 0xD4, 0x65, 0x18, 0xFC, 0xFA, 0xD7, 0x97, 0xFD, 0x89, 0xC4, 0x82, 0x4E, 0xB6, 0x40, 0xC0, 0x62,
+ 0x60, 0xB9, 0x95, 0xAB, 0x86, 0xB8, 0xE1, 0x10, 0xBD, 0xB3, 0xEC, 0x58, 0xDF, 0x13, 0xF4, 0x4D,
+ 0x0A, 0x1D, 0xB8, 0x78, 0x2C, 0x0D, 0x70, 0xC2, 0xF9, 0xB8, 0x78, 0x10, 0x0E, 0x4D, 0xC6, 0x7B,
+ 0xED, 0x1D, 0xBF, 0x64, 0x4E, 0xBC, 0xEA, 0x0A, 0x61, 0x49, 0xCE, 0x20, 0xD1, 0x21, 0x31, 0xEC,
+ 0x30, 0xF9, 0x34, 0x94, 0x46, 0xF0, 0xFF, 0x4E, 0xFE, 0xB8, 0x6D, 0x78, 0xA5, 0x2C, 0x95, 0xDD,
+ 0x45, 0x1E, 0x73, 0xA1, 0xC1, 0x7B, 0x60, 0xBD, 0x62, 0x2F, 0x31, 0x59, 0x6D, 0x3D, 0x00, 0x09,
+ 0x0D, 0x2A, 0xA4, 0x86, 0xF3, 0x5A, 0x12, 0xAA, 0x50, 0x72, 0x8F, 0xA6, 0x96, 0xFD, 0x27, 0xA5,
+ 0x52, 0xE3, 0xD1, 0x87, 0x8C, 0x00, 0xAE, 0xF9, 0x98, 0x98, 0x05, 0xD6, 0x89, 0x54, 0x71, 0x7E,
+ 0x8F, 0xA7, 0xFE, 0x40, 0xAB, 0xEE, 0x04, 0xE2, 0xB2, 0xB5, 0x89, 0xFD, 0x38, 0xF0, 0xF9, 0x63,
+ 0xAD, 0xBA, 0x2F, 0xF2, 0xF2, 0xC4, 0x7B, 0xF4, 0xE4, 0x10, 0x25, 0x8C, 0xBD, 0x6A, 0xF3, 0x23,
+ 0x4B, 0xAE, 0xB1, 0x9B, 0x83, 0xF4, 0x1D, 0x12, 0x54, 0x72, 0xB5, 0xD4, 0xA0, 0xED, 0x4F, 0xA0,
+ 0xBB, 0xBD, 0xEF, 0x4E, 0xC7, 0xDC, 0x5F, 0x04, 0x8B, 0x4F, 0x28, 0x02, 0x6D, 0x57, 0xE5, 0xD1,
+ 0x44, 0x86, 0x26, 0xBB, 0x8E, 0x20, 0xC2, 0xCD, 0xD2, 0x1E, 0x49, 0x0E, 0x71, 0x36, 0xD8, 0x38,
+ 0x7F, 0x18, 0x08, 0x16, 0x98, 0x13, 0x84, 0x39, 0x1C, 0x17, 0xED, 0x52, 0xE8, 0x43, 0x48, 0x44,
+ 0x00, 0x7C, 0x9C, 0xE8, 0x80, 0xF3, 0x71, 0xD0, 0x2D, 0xF8, 0x6D, 0xFF, 0x6E, 0x0B, 0xF5, 0x86,
+ 0xE8, 0x68, 0x25, 0x90, 0xC2, 0x04, 0x0C, 0x30, 0x6B, 0x31, 0x3E, 0x71, 0x51, 0x98, 0xD6, 0xD8,
+ 0x50, 0xB4, 0xAA, 0xDF, 0x02, 0x0C, 0x78, 0x8F, 0x5E, 0x29, 0x02, 0xC8, 0xB5, 0xAD, 0x43, 0x9E,
+ 0x59, 0x7D, 0xF1, 0xBB, 0x1E, 0xCC, 0xA0, 0x78, 0x53, 0xB1, 0x1C, 0x77, 0xAC, 0x55, 0xE1, 0x8C,
+ 0xE3, 0x65, 0x27, 0x06, 0x79, 0x61, 0x95, 0x9D, 0x93, 0x05, 0xBA, 0x35, 0xCF, 0xAA, 0x96, 0x4F,
+ 0x9A, 0xD1, 0x4C, 0x71, 0x27, 0xC4, 0x06, 0x5A, 0xBD, 0x39, 0x26, 0x87, 0x5F, 0x3C, 0x61, 0x94,
+ 0xB9, 0x55, 0x48, 0x03, 0x06, 0x47, 0x8F, 0x81, 0x88, 0x19, 0x63, 0xE9, 0x3D, 0x8E, 0x6C, 0x5F,
+ 0x72, 0xDE, 0x48, 0x1B, 0xFF, 0x8C, 0xEC, 0x2B, 0xF1, 0x75, 0x64, 0x03, 0xE7, 0xA3, 0xB4, 0xCC,
+ 0x19, 0x44, 0x42, 0x96, 0x5C, 0xC4, 0x17, 0x6C, 0x7A, 0x20, 0xFF, 0xE3, 0xD5, 0x2C, 0xB6, 0x5C,
+ 0x27, 0x97, 0xB3, 0x5B, 0x7B, 0xBC, 0x65, 0x76, 0xB5, 0xFD, 0x05, 0xD2, 0xA3, 0xC5, 0x79, 0x77,
+ 0xBF, 0x77, 0x00, 0x7D, 0xA0, 0x0E, 0x53, 0x15, 0x2B, 0xC1, 0xB7, 0x40, 0xEA, 0xBC, 0x37, 0xE0,
+ 0x52, 0x28, 0xAE, 0x03, 0x4D, 0x3E, 0x95, 0x03, 0x61, 0x2B, 0x5C, 0x7D, 0x6E, 0x51, 0xCA, 0x49,
+ 0x37, 0xA2, 0xCF, 0xEA, 0x4C, 0x4B, 0x4D, 0x43, 0xCD, 0xF7, 0xBC, 0xCE, 0xEE, 0x4D, 0xE2, 0x96,
+ 0x6D, 0xD6, 0xE2, 0x82, 0x92, 0xFE, 0x4C, 0x3E, 0x97, 0xD5, 0xDA, 0x45, 0xA3, 0xB0, 0xE0, 0x8C,
+ 0x7E, 0x45, 0xF7, 0xE5, 0x9E, 0xB5, 0xA0, 0x63, 0xE6, 0xC4, 0x0C, 0x02, 0x91, 0x17, 0x4A, 0xC2,
+ 0xD3, 0xB1, 0xDB, 0x85, 0xD1, 0x90, 0x7F, 0x21, 0x4B, 0x8E, 0xEA, 0x13, 0x55, 0xEE, 0xD5, 0xA2,
+ 0xA6, 0xB9, 0x09, 0x96, 0xA2, 0xF8, 0xCB, 0xCE, 0xC4, 0x3B, 0x1C, 0x05, 0xEB, 0x00, 0x13, 0xFC,
+ 0xFC, 0x9F, 0xC0, 0xCD, 0x2C, 0xB0, 0xC5, 0x8F, 0x38, 0xD7, 0xAB, 0xE4, 0x86, 0xB4, 0xA3, 0x78,
+ 0x1F, 0x36, 0x22, 0xD2, 0x81, 0x6A, 0xBD, 0xA0, 0x9F, 0x61, 0x92, 0xF8, 0x6A, 0x27, 0x75, 0x72,
+ 0x06, 0x16, 0x66, 0x76, 0x90, 0x93, 0x29, 0xBD, 0xEB, 0x9D, 0xA5, 0x81, 0xEF, 0xEB, 0x69, 0x93,
+ 0x8E, 0xE8, 0x17, 0x8F, 0x42, 0x0A, 0x4D, 0xA0, 0x2D, 0x20, 0xB3, 0x1F, 0x6A, 0xDB, 0x22, 0xE9,
+ 0x24, 0x64, 0x52, 0x06, 0x65, 0xA5, 0xC5, 0x82, 0x59, 0x47, 0xF4, 0xE9, 0xB9, 0xA3, 0xB1, 0x02,
+ 0xFC, 0x60, 0x8B, 0x42, 0xF5, 0x23, 0xD8, 0xD8, 0x35, 0x70, 0x38, 0xEB, 0x5D, 0x15, 0xEF, 0xD6,
+ 0xD3, 0x75, 0x80, 0x6E, 0xBA, 0x2E, 0xD6, 0x11, 0x54, 0x6E, 0x24, 0xC1, 0xC7, 0x7A, 0xE1, 0xCB,
+ 0xAE, 0x62, 0x27, 0x48, 0xB7, 0x9C, 0xA7, 0x9E, 0x15, 0xFD, 0xDE, 0xC0, 0xBE, 0xBB, 0xC2, 0x2E,
+ 0x4A, 0x5C, 0xD4, 0x81, 0xC0, 0x93, 0x58, 0x00, 0x9C, 0xFB, 0x36, 0x27, 0xD7, 0x72, 0x46, 0x9D,
+ 0xAC, 0xEF, 0xD8, 0x14, 0x1C, 0x58, 0xC0, 0x4E, 0xD4, 0x16, 0xE1, 0x58, 0x56, 0x25, 0xA9, 0x38,
+ 0xCF, 0x06, 0xAA, 0xA3, 0x4F, 0x52, 0x70, 0x09, 0x41, 0x44, 0xD0, 0x98, 0x73, 0xED, 0x18, 0xB4,
+ 0xDB, 0x07, 0xC9, 0xB7, 0xBB, 0x5A, 0xD6, 0x08, 0xE5, 0x89, 0x19, 0xD8, 0x1A, 0xB6, 0x84, 0x72,
+ 0x1B, 0xEA, 0x14, 0x78, 0x96, 0xB4, 0x2D, 0x61, 0x20, 0x8D, 0x9A, 0xD2, 0x87, 0x23, 0x18, 0x7A,
+ 0xA3, 0x70, 0x4D, 0xA6, 0xBB, 0xEE, 0x99, 0x78, 0xD8, 0x94, 0xF1, 0x35, 0x91, 0x45, 0xDB, 0x2A,
+ 0x8A, 0xDD, 0x8F, 0xC5, 0x05, 0x17, 0xB6, 0x69, 0x4E, 0xD2, 0xF0, 0x16, 0x09, 0x14, 0x65, 0xE0,
+ 0x76, 0x6B, 0x33, 0xE8, 0x4D, 0xDF, 0xAF, 0x5A, 0x0C, 0xF6, 0xB0, 0x29, 0xEF, 0xB9, 0x85, 0x96,
+ 0x16, 0xED, 0x03, 0x45, 0xFA, 0x6F, 0x03, 0x64, 0x62, 0x6D, 0x32, 0x75, 0x82, 0x32, 0x14, 0x23,
+ 0x5A, 0x85, 0xFF, 0xFE, 0x65, 0x52, 0xBC, 0xAD, 0x99, 0xC2, 0xDA, 0x8B, 0x86, 0xC0, 0x2E, 0x78,
+ 0x38, 0xDF, 0x5E, 0x83, 0xDE, 0xE0, 0x72, 0xD5, 0x91, 0x6B, 0xDB, 0xDF, 0x7F, 0xA7, 0x8B, 0xA4,
+ 0x5B, 0x10, 0x93, 0x4D, 0xA4, 0xB4, 0x22, 0xC1, 0xB3, 0xBE, 0x8B, 0x56, 0x82, 0xB9, 0x33, 0x85,
+ 0x01, 0xFA, 0xF5, 0x95, 0x9D, 0x0C, 0xBC, 0xD4, 0xB0, 0x2F, 0x94, 0xD9, 0x2E, 0xDA, 0xB9, 0x49,
+ 0xC5, 0x53, 0xA2, 0xE9, 0x4D, 0x81, 0xDE, 0xC0, 0xF8, 0x01, 0x60, 0xEA, 0xAA, 0x57, 0x66, 0xA5,
+ 0x5D, 0x4B, 0x6D, 0xEC, 0x85, 0xBF, 0x10, 0x18, 0x43, 0xD1, 0xD7, 0xA2, 0xBA, 0x72, 0x09, 0x63,
+ 0x71, 0xB2, 0xA2, 0x14, 0x52, 0x94, 0xFD, 0x40, 0xA6, 0x89, 0x1B, 0xD5, 0x16, 0x7D, 0xB1, 0x22,
+ 0x00, 0xF7, 0x62, 0x12, 0x5E, 0xBB, 0xA1, 0x03, 0x6C, 0x3D, 0x32, 0x1C, 0xD8, 0x3A, 0xB5, 0x24,
+ 0xF6, 0x64, 0x67, 0xCD, 0x47, 0xEB, 0x6A, 0xFB, 0x94, 0xCE, 0xA6, 0xF4, 0x9D, 0x2B, 0xBD, 0x50,
+ 0x2A, 0x53, 0x63, 0xEF, 0x7B, 0x94, 0x68, 0x26, 0xE2, 0xD8, 0x13, 0x5A, 0xD2, 0xE3, 0x1D, 0x01,
+ 0xE4, 0xB8, 0x3C, 0x42, 0x07, 0x3B, 0x14, 0x01, 0xEB, 0x18, 0xBF, 0x39, 0xD9, 0xC4, 0xD6, 0x41,
+ 0xB2, 0xE7, 0xCD, 0x02, 0x86, 0x8B, 0xA7, 0x77, 0x5D, 0xC9, 0x5C, 0xC0, 0xBE, 0xDE, 0x3D, 0x67,
+ 0xA3, 0xD7, 0xDA, 0xB5, 0x88, 0x39, 0xEA, 0x9D, 0x7A, 0xF7, 0x99, 0x3E, 0xDE, 0xF9, 0x36, 0x1E,
+ 0xBB, 0xAB, 0x61, 0x8C, 0xB2, 0xB9, 0x61, 0x18, 0x7D, 0x4A, 0x32, 0x7E, 0xCC, 0x71, 0xBC, 0xC6,
+ 0xAA, 0xDE, 0x08, 0xFF, 0xEE, 0x44, 0x4B, 0xD7, 0xC1, 0xDB, 0xCE, 0xFE, 0x89, 0x56, 0x03, 0xDA,
+ 0x3A, 0xF5, 0xD3, 0x9D, 0x39, 0x63, 0x92, 0x33, 0x50, 0x13, 0x8B, 0x7B, 0x5A, 0xC0, 0x79, 0xED,
+ 0x40, 0xAD, 0x1B, 0x53, 0x50, 0x74, 0x0A, 0xA0, 0xA7, 0x5D, 0x5B, 0x61, 0x85, 0x93, 0x8A, 0xB9,
+ 0xA9, 0x2C, 0x0F, 0xA2, 0xBD, 0x7A, 0x33, 0xF3, 0xD6, 0xD6, 0x64, 0x60, 0xCF, 0x12, 0x88, 0x08,
+ 0x13, 0x0B, 0xC2, 0x76, 0xEC, 0x4B, 0x75, 0x74, 0xCC, 0x60, 0xF8, 0x9E, 0xAD, 0x40, 0xFD, 0x5E,
+ 0x58, 0x2D, 0x08, 0xB7, 0x6C, 0xB6, 0x27, 0x73, 0x4B, 0x31, 0x03, 0x1D, 0x7A, 0xC5, 0x59, 0x67,
+ 0x1F, 0x5C, 0xDE, 0x08, 0x24, 0x0D, 0xB9, 0x33, 0x97, 0x51, 0xC6, 0xC3, 0x13, 0xE0, 0xFC, 0x45,
+ 0xDA, 0x5F, 0xFC, 0xA9, 0x8E, 0x71, 0x54, 0x1C, 0x3A, 0x4D, 0xFB, 0x7B, 0x06, 0xFB, 0x65, 0xB1,
+ 0x27, 0x0B, 0x8C, 0xAF, 0xF2, 0xA0, 0x12, 0xA6, 0xD7, 0xAC, 0x27, 0xC1, 0x55, 0xE7, 0x17, 0x81,
+ 0xFD, 0xA2, 0xF8, 0xC3, 0x17, 0x55, 0x9B, 0x00, 0xFE, 0x91, 0xA9, 0xDC, 0xDE, 0xB0, 0xD7, 0x5D,
+ 0x2A, 0xE8, 0x87, 0xF2, 0x1B, 0x28, 0x19, 0x20, 0x63, 0x9E, 0xD8, 0x7E, 0x85, 0xF3, 0x87, 0x0D,
+ 0xAF, 0x35, 0xA5, 0x9F, 0x3B, 0xE7, 0x44, 0x8D, 0x63, 0xDE, 0xEB, 0x7E, 0xC7, 0xD2, 0x0F, 0x09,
+ 0x30, 0xE3, 0xE2, 0x7B, 0xEA, 0x74, 0xAD, 0x46, 0x7D, 0xB4, 0xB8, 0x0C, 0xF1, 0xD3, 0xFA, 0x07,
+ 0xF3, 0xDD, 0xC5, 0xB1, 0x00, 0xF2, 0xD6, 0xBD, 0x4B, 0xBD, 0xAC, 0xC8, 0xBB, 0xA7, 0xD4, 0x53,
+ 0xDE, 0x73, 0x0D, 0xED, 0xFB, 0x84, 0x4C, 0x82, 0x47, 0x0D, 0x2D, 0x9D, 0x2B, 0x0C, 0x4A, 0x4D,
+ 0x4B, 0xD4, 0x3A, 0x4D, 0x64, 0x27, 0xD8, 0x59, 0x27, 0xD3, 0x41, 0x73, 0xA5, 0xCB, 0xF5, 0x31,
+ 0xA2, 0x88, 0x99, 0x79, 0xFB, 0x2B, 0x9A, 0xBA, 0x68, 0x88, 0x35, 0x12, 0x15, 0x11, 0xF6, 0xEA,
+ 0x9A, 0x1B, 0x2A, 0xE1, 0x95, 0x5B, 0x15, 0xAB, 0x79, 0xE2, 0x5A, 0x4A, 0x6E, 0xE2, 0xF7, 0x63,
+ 0x74, 0x52, 0xB5, 0x9B, 0xA9, 0x58, 0x5D, 0x78, 0xAB, 0x61, 0x40, 0xA5, 0x6F, 0x99, 0x80, 0x06,
+ 0xCA, 0x73, 0x82, 0x78, 0x64, 0x8F, 0xE4, 0xA7, 0x2F, 0x9F, 0x6D, 0x50, 0x80, 0x11, 0xF4, 0xE9,
+ 0xE3, 0x63, 0x2A, 0x96, 0x0C, 0xFC, 0x3C, 0xE0, 0xAA, 0xF7, 0x05, 0x55, 0x28, 0xB0, 0x76, 0x24,
+ 0x87, 0xDA, 0x29, 0x28, 0x05, 0xA9, 0x61, 0x0B, 0x66, 0x3C, 0xA0, 0x51, 0x5E, 0xCE, 0xF5, 0x80,
+ 0x0F, 0x1C, 0x90, 0xDD, 0x56, 0x52, 0x07, 0xDF, 0xB4, 0xE6, 0x92, 0x4A, 0x57, 0x97, 0x71, 0xAB,
+ 0x58, 0xF3, 0x03, 0x43, 0x99, 0x49, 0x1A, 0xFC, 0x96, 0x29, 0x31, 0x15, 0x30, 0x6D, 0xCA, 0x92,
+ 0x39, 0x68, 0xF6, 0xAE, 0xDE, 0x56, 0x74, 0x53, 0xC5, 0xCA, 0xBE, 0x09, 0x0C, 0x88, 0xEE, 0xEC,
+ 0xE9, 0xE8, 0xD0, 0x6A, 0x55, 0x6A, 0xB2, 0xDF, 0x41, 0x79, 0xC8, 0x44, 0xD1, 0x2B, 0x6B, 0x5F,
+ 0xB4, 0x27, 0x02, 0xFE, 0x9E, 0x70, 0x48, 0xE9, 0xE8, 0x9B, 0x44, 0x5D, 0x19, 0xB7, 0x24, 0x47,
+ 0x42, 0x0D, 0x1D, 0xA9, 0x26, 0x07, 0x70, 0xC4, 0x36, 0x6A, 0x03, 0xA2, 0xBD, 0x60, 0x65, 0x9A,
+ 0x92, 0x6F, 0x0A, 0x1B, 0xE6, 0x36, 0x7B, 0xA4, 0x55, 0x79, 0xBF, 0x7B, 0x27, 0xBE, 0x6D, 0x67,
+ 0x01, 0x6D, 0xB7, 0x49, 0x7C, 0x3F, 0x99, 0x1B, 0x4E, 0xFB, 0x32, 0x3A, 0xE5, 0x76, 0x0B, 0x96,
+ 0xC6, 0x55, 0xC5, 0x90, 0x5F, 0x80, 0x19, 0x77, 0xAD, 0xB1, 0x5F, 0x6C, 0x75, 0x41, 0x1E, 0x07,
+ 0x58, 0x6F, 0x6D, 0xB5, 0xDA, 0x2E, 0x3E, 0x2B, 0x76, 0xAA, 0x4D, 0xF5, 0x3F, 0x9A, 0x56, 0x31,
+ 0x53, 0x74, 0x1F, 0xA6, 0xC3, 0x97, 0xAE, 0x8A, 0x3E, 0x8B, 0x76, 0xE1, 0x2C, 0x77, 0x6C, 0x70,
+ 0xEC, 0xBB, 0xD5, 0xA5, 0xA7, 0x30, 0x4B, 0xE8, 0xA6, 0x29, 0xAC, 0xE6, 0x6F, 0x8E, 0xC7, 0xFF,
+ 0xBA, 0xD9, 0xCB, 0x62, 0xE8, 0x2E, 0xD7, 0xCF, 0xA3, 0x02, 0xD4, 0x55, 0x88, 0x2D, 0x12, 0x9D,
+ 0x6A, 0x19, 0x50, 0xB4, 0x98, 0xFA, 0x29, 0xF5, 0x2E, 0xFF, 0xF2, 0xD4, 0xAD, 0x04, 0x85, 0xF4,
+ 0xB6, 0x22, 0x56, 0x03, 0x50, 0x3F, 0x96, 0x5D, 0xDE, 0xCD, 0x0D, 0xB3, 0xC5, 0xFB, 0xDB, 0xAC,
+ 0x7F, 0xBD, 0xC1, 0xB6, 0xD0, 0x20, 0xCF, 0x30, 0x5E, 0x62, 0xD6, 0xF9, 0x44, 0x19, 0xF3, 0x96,
+ 0x0D, 0x72, 0xF8, 0xFB, 0x71, 0xB1, 0x9D, 0xA7, 0x77, 0x6E, 0xDD, 0xD2, 0x1B, 0xD9, 0x39, 0xAB,
+ 0x10, 0x26, 0x18, 0xB8, 0x56, 0x92, 0x6E, 0x9B, 0xC2, 0x3D, 0x9B, 0x94, 0x88, 0x9E, 0x2B, 0x4D,
+ 0x79, 0xF6, 0x8D, 0xC6, 0x23, 0x0B, 0x8D, 0xF4, 0xB3, 0x00, 0x8C, 0xD4, 0x4F, 0xE1, 0xA1, 0x2B,
+ 0x9F, 0xE7, 0x3D, 0xE9, 0x04, 0x65, 0xD4, 0x21, 0x87, 0x44, 0xDB, 0x00, 0x30, 0x23, 0x7A, 0x94,
+ 0xC1, 0xE7, 0x4B, 0xC4, 0xA0, 0xA6, 0x90, 0x20, 0x99, 0xE6, 0x98, 0x48, 0x67, 0xB6, 0x49, 0x90,
+ 0x20, 0xB4, 0xA0, 0xA8, 0x90, 0x1E, 0x1B, 0x49, 0x50, 0x41, 0x7B, 0xC5, 0x02, 0xF3, 0xFF, 0xB1,
+ 0x6D, 0x39, 0x79, 0x1C, 0x3C, 0x5E, 0xC7, 0x98, 0x1F, 0xD9, 0x52, 0x49, 0x75, 0x59, 0x01, 0x1A,
+ 0xC1, 0x82, 0xBD, 0xDB, 0x1A, 0x86, 0xD8, 0x9F, 0x12, 0x93, 0xD2, 0x80, 0x13, 0xDE, 0x79, 0x3D,
+ 0xB6, 0xEB, 0xC5, 0x47, 0x75, 0x24, 0xE3, 0x70, 0x8E, 0x20, 0xBE, 0x78, 0x26, 0x15, 0xBD, 0xD4,
+ 0x5B, 0x9D, 0x6D, 0x7B, 0x02, 0x80, 0x73, 0x44, 0xA2, 0xC7, 0x22, 0x8D, 0xAD, 0x19, 0xD0, 0x38,
+ 0x2B, 0xEA, 0x4F, 0xDE, 0x68, 0x84, 0x3C, 0x77, 0x6B, 0xA2, 0x6C, 0x9A, 0x56, 0x13, 0x75, 0x66,
+ 0x8A, 0x91, 0x87, 0xDA, 0xC4, 0x24, 0xE6, 0xC5, 0x14, 0xE7, 0x91, 0x0B, 0x40, 0xBD, 0x7D, 0x8A,
+ 0x3A, 0x0D, 0x39, 0xB5, 0x65, 0x1A, 0xF6, 0x0F, 0x79, 0x4D, 0xED, 0x07, 0x8F, 0xE4, 0x48, 0xA3,
+ 0x7A, 0xE8, 0x9F, 0x09, 0x5B, 0x9E, 0x30, 0x46, 0xA8, 0x63, 0x89, 0x9E, 0xAF, 0xD1, 0x8F, 0xBE,
+ 0x53, 0x20, 0x07, 0xDE, 0x54, 0x8B, 0x8B, 0x98, 0xED, 0x76, 0xD7, 0x3A, 0xE9, 0x40, 0xEC, 0x27,
+ 0x64, 0xDC, 0x66, 0xD4, 0x32, 0x22, 0x43, 0x7E, 0xE0, 0x3E, 0xF8, 0x15, 0xAB, 0xDE, 0xAA, 0xC4,
+ 0x13, 0x7F, 0x56, 0x4E, 0x57, 0xC8, 0x69, 0x27, 0xD4, 0xC6, 0x6B, 0x72, 0x71, 0xB8, 0xA4, 0x7A,
+ 0x2F, 0x82, 0x7D, 0xEE, 0x0C, 0x21, 0xCE, 0xDF, 0xA5, 0x56, 0x01, 0xFC, 0xD2, 0xE7, 0x48, 0x35,
+ 0xD6, 0x8C, 0x87, 0xEF, 0xD8, 0xE1, 0xDC, 0xFC, 0x60, 0x1D, 0xD7, 0x81, 0xE5, 0xE2, 0x83, 0x83,
+ 0xF7, 0x14, 0xDA, 0xC8, 0x64, 0xA1, 0xDC, 0xBF, 0x6A, 0x0D, 0xB4, 0x5D, 0xCB, 0x1E, 0xDF, 0xA7,
+ 0xE7, 0x37, 0xDE, 0xCD, 0x35, 0x27, 0xAF, 0x18, 0xD3, 0xB3, 0xC5, 0xF1, 0x69, 0x57, 0xCD, 0xE4,
+ 0x64, 0x07, 0x50, 0x08, 0x80, 0x80, 0x6A, 0x2F, 0xD3, 0x1E, 0xA8, 0xC9, 0xA7, 0x6C, 0xFD, 0xA1,
+ 0x91, 0xF3, 0x06, 0x12, 0x97, 0x56, 0x9E, 0x37, 0x6A, 0x3D, 0x30, 0x0E, 0x0D, 0x88, 0x1D, 0x47,
+ 0xCC, 0x95, 0x53, 0xAA, 0xF4, 0xDC, 0x11, 0x9C, 0xD5, 0xBA, 0xDA, 0xA6, 0xAC, 0xE3, 0xC6, 0x14,
+ 0x54, 0x75, 0xA9, 0x22, 0x31, 0x0E, 0x58, 0x6B, 0xF6, 0x3E, 0x42, 0x54, 0x81, 0xF1, 0x26, 0x60,
+ 0x42, 0x7E, 0xD7, 0x15, 0x7C, 0x1A, 0xB3, 0x48, 0x74, 0x7E, 0x2A, 0xBC, 0x32, 0xEA, 0x37, 0x98,
+ 0x56, 0x7C, 0x06, 0x44, 0xD3, 0xC6, 0x91, 0x8D, 0x8A, 0xA0, 0xF6, 0x8E, 0x84, 0x11, 0xC1, 0xEB,
+ 0x9A, 0x39, 0x1A, 0xF2, 0xA7, 0x78, 0x17, 0x21, 0x3B, 0xBF, 0x32, 0x5B, 0x9C, 0x61, 0x6A, 0xDD,
+ 0x96, 0x55, 0x62, 0x38, 0x57, 0x6F, 0xA8, 0x7A, 0xB3, 0x44, 0x85, 0x6C, 0x4B, 0x06, 0xD6, 0x8E,
+ 0xAF, 0x6F, 0x30, 0x03, 0xBA, 0x88, 0xE4, 0x2A, 0x61, 0x58, 0x33, 0x34, 0xC9, 0xBF, 0x52, 0xC4,
+ 0x11, 0x71, 0xD1, 0x65, 0xEC, 0x07, 0x40, 0x92, 0x4A, 0x39, 0x4A, 0xF1, 0x6A, 0x37, 0x25, 0x82,
+ 0x91, 0x4A, 0x68, 0x98, 0xAA, 0x25, 0xDC, 0xD4, 0xCB, 0x51, 0x15, 0x46, 0xE4, 0xF0, 0x06, 0xA1,
+ 0x5B, 0x7F, 0xCA, 0xC9, 0xC9, 0xD7, 0x91, 0xF3, 0x9F, 0x0E, 0xC0, 0x69, 0x37, 0x48, 0x81, 0x0C,
+ 0xF4, 0x15, 0x51, 0x9E, 0xE3, 0x73, 0xAC, 0xDF, 0x57, 0x49, 0x2A, 0xF6, 0x98, 0x72, 0x5C, 0x43,
+ 0x2A, 0x63, 0x40, 0x94, 0xF1, 0xB4, 0x0B, 0xBD, 0x79, 0x67, 0xB8, 0xAB, 0xAE, 0xD4, 0x9C, 0xFA,
+ 0x2F, 0x64, 0x0D, 0x33, 0xB7, 0x7F, 0x9E, 0xC4, 0xB7, 0xE6, 0xCB, 0x5E, 0x61, 0x60, 0x29, 0x6D,
+ 0xB7, 0xC9, 0xCA, 0x7D, 0xE2, 0x43, 0x1E, 0x95, 0x04, 0xE1, 0xA9, 0x6B, 0xBD, 0x5F, 0xB2, 0xBF,
+ 0x07, 0x1C, 0xFF, 0x30, 0x74, 0x9A, 0xBC, 0xC4, 0xD5, 0x5C, 0x00, 0x32, 0x76, 0xA6, 0xDD, 0x25,
+ 0x3D, 0x53, 0xD0, 0x38, 0x34, 0x53, 0x7B, 0xD6, 0xBF, 0x0E, 0x84, 0xA0, 0x96, 0xF9, 0x8A, 0x82,
+ 0x8D, 0x94, 0x60, 0x57, 0xE2, 0x54, 0xBE, 0x44, 0x96, 0xF7, 0x86, 0xF5, 0x39, 0x0D, 0x05, 0xA7,
+ 0xB6, 0x74, 0xA5, 0x41, 0xB3, 0x0A, 0xB0, 0x5D, 0x91, 0xCB, 0x85, 0x79, 0x83, 0x4B, 0xC6, 0x55,
+ 0x57, 0x68, 0x8C, 0x91, 0x2F, 0x2A, 0xB8, 0x4A, 0x08, 0x82, 0x1F, 0xEC, 0x9A, 0x68, 0x11, 0x4C,
+ 0x22, 0x2C, 0x90, 0x86, 0x7E, 0xA5, 0x71, 0x46, 0xB5, 0xE0, 0x2B, 0x3F, 0x21, 0x8E, 0xCD, 0x41,
+ 0xA3, 0x96, 0xA5, 0x9E, 0x88, 0x9D, 0xC0, 0x06, 0x64, 0x4A, 0x4B, 0x3A, 0xD4, 0xA1, 0xE7, 0x16,
+ 0xD4, 0x3E, 0x57, 0xD2, 0x0C, 0xDA, 0xE1, 0x34, 0xD8, 0xD6, 0x58, 0xF7, 0x86, 0xBD, 0xF6, 0xC4,
+ 0xBC, 0xDA, 0x21, 0x74, 0xCA, 0x8A, 0xA6, 0xAA, 0x30, 0xEF, 0x25, 0x1F, 0x32, 0x7B, 0x49, 0xA6,
+ 0xEF, 0x9B, 0x95, 0x51, 0x83, 0x34, 0xB8, 0xB8, 0x3E, 0xCE, 0xF6, 0x85, 0x21, 0x3F, 0xE2, 0x93,
+ 0x5E, 0x52, 0xBF, 0x8D, 0xE7, 0xDD, 0xCE, 0xDF, 0x0B, 0x99, 0xB4, 0xB3, 0x89, 0x31, 0x70, 0xAE,
+ 0x82, 0x4D, 0xF5, 0xD1, 0x31, 0xF7, 0x04, 0xB2, 0x8A, 0x6A, 0xD8, 0xAD, 0x36, 0x50, 0x7D, 0x5B,
+ 0xD5, 0xD1, 0x26, 0x07, 0xB0, 0x40, 0xF0, 0x93, 0x4C, 0x17, 0xCD, 0x3F, 0xC3, 0x65, 0x95, 0x25,
+ 0xF4, 0x58, 0x12, 0xEE, 0xAA, 0xE6, 0x86, 0xAB, 0x92, 0x90, 0x18, 0xCD, 0xBD, 0x9A, 0x98, 0xFB,
+ 0x64, 0x17, 0x61, 0xF7, 0x04, 0x8B, 0x26, 0xD6, 0x13, 0xA2, 0x0C, 0x7C, 0xB7, 0x98, 0x35, 0xD0,
+ 0x47, 0x2C, 0x44, 0xB0, 0xA6, 0x5E, 0x96, 0xAE, 0x60, 0x54, 0x15, 0x1C, 0x1F, 0xEF, 0x95, 0x2A,
+ 0x7F, 0xF5, 0x11, 0x8B, 0xD2, 0xFA, 0x9D, 0x2B, 0x80, 0xD7, 0xA3, 0x0E, 0x25, 0xFD, 0x61, 0xA1,
+ 0x59, 0xEF, 0xFA, 0xC6, 0x7D, 0x8C, 0xE2, 0x0E, 0xD5, 0x3B, 0x7F, 0x0A, 0x9B, 0x07, 0x66, 0x2A,
+ 0x10, 0xF7, 0x58, 0x97, 0x78, 0xB5, 0x9E, 0x8C, 0x17, 0x10, 0x36, 0x8F, 0x7E, 0xB5, 0x62, 0xDD,
+ 0xBA, 0x53, 0x62, 0x20, 0x86, 0x69, 0x0B, 0x44, 0xDF, 0x3A, 0xEA, 0x0B, 0xB6, 0xD8, 0xDD, 0x3E,
+ 0x0F, 0x0D, 0xD0, 0x37, 0xDC, 0x2D, 0xD7, 0xEF, 0xB6, 0xD7, 0x4E, 0x2B, 0xFE, 0xA1, 0x4B, 0xDC,
+ 0xC2, 0x69, 0xEA, 0x04, 0x79, 0x6E, 0xC2, 0xD4, 0xD6, 0xC7, 0x3D, 0x21, 0x7C, 0xBD, 0x12, 0x4C,
+ 0x3A, 0x0F, 0xA6, 0xB9, 0xA8, 0x64, 0xF0, 0x13, 0x24, 0x9C, 0xD9, 0xC8, 0x97, 0xBB, 0xAD, 0x31,
+ 0x3D, 0x74, 0x6C, 0x6D, 0x62, 0xE7, 0x4E, 0x54, 0xC9, 0xEA, 0x0C, 0x65, 0xA5, 0xF8, 0x4A, 0xC1,
+ 0x7C, 0x26, 0x6B, 0x3F, 0x71, 0x06, 0xA8, 0xE6, 0xD5, 0x41, 0xCF, 0xD3, 0xFB, 0x6C, 0x88, 0xBC,
+ 0x82, 0xE1, 0x4D, 0x5F, 0x3C, 0x48, 0x61, 0xB4, 0xA1, 0x17, 0x43, 0x18, 0x8E, 0xA3, 0xD2, 0xDE,
+ 0xF5, 0x11, 0xE7, 0x6F, 0xBA, 0x9D, 0x00, 0x8E, 0x59, 0x6D, 0xC5, 0x1C, 0x59, 0x38, 0xD5, 0x3D,
+ 0x1F, 0xB9, 0x20, 0xDA, 0x91, 0xF3, 0xA6, 0x79, 0x91, 0xD4, 0x6A, 0x96, 0xB6, 0xDE, 0xF6, 0xD9,
+ 0xB7, 0x43, 0xD9, 0x14, 0x03, 0x61, 0x69, 0x6B, 0xF1, 0x96, 0x91, 0x5B, 0xA6, 0x47, 0xA5, 0x87,
+ 0x07, 0x5C, 0xB7, 0x33, 0xE1, 0x35, 0xFA, 0x71, 0x0B, 0xF0, 0x15, 0x96, 0x1D, 0xA7, 0x01, 0x88,
+ 0xEC, 0x94, 0xC5, 0xD1, 0x62, 0x53, 0x0F, 0xD9, 0x37, 0x88, 0x7B, 0x83, 0x9F, 0x59, 0x19, 0xB6,
+ 0xC3, 0x6F, 0x98, 0xF7, 0x40, 0x34, 0x10, 0x84, 0xB3, 0x66, 0x72, 0x4E, 0x9B, 0x5B, 0xD5, 0xCE,
+ 0x84, 0x47, 0x6C, 0xBB, 0x89, 0xC0, 0xD7, 0x07, 0x11, 0x20, 0xD8, 0x2E, 0x27, 0x52, 0x3C, 0x33,
+ 0x9E, 0xC9, 0x9F, 0x9F, 0x4A, 0x5F, 0x73, 0xC9, 0xBE, 0xC9, 0x63, 0xD9, 0xF1, 0xDA, 0xE6, 0x3B,
+ 0x09, 0xC0, 0xAA, 0x55, 0xD1, 0xA6, 0x31, 0xF6, 0xB4, 0x3D, 0xED, 0x79, 0x56, 0xE8, 0xB9, 0x04,
+ 0xC6, 0x5D, 0x10, 0x81, 0x86, 0xB8, 0xD4, 0x32, 0xF8, 0x7B, 0xC4, 0x9C, 0x89, 0x68, 0x26, 0x8C,
+ 0xA1, 0xC2, 0x40, 0x34, 0x4B, 0xAD, 0x06, 0xC9, 0x31, 0xD1, 0xDD, 0xE6, 0xB8, 0x77, 0x82, 0xA4,
+ 0xFE, 0x8F, 0x74, 0x69, 0x8E, 0xFF, 0x33, 0xB8, 0xAE, 0x29, 0x99, 0x92, 0x37, 0x8B, 0x82, 0x73,
+ 0x51, 0xE3, 0x0D, 0x5A, 0x88, 0xBE, 0x20, 0x12, 0x7E, 0x04, 0x1A, 0xDA, 0x76, 0x79, 0x34, 0x15,
+ 0xA3, 0x52, 0x5D, 0x77, 0x90, 0x41, 0xFD, 0x32, 0xA5, 0x43, 0x27, 0x03, 0xEC, 0xD6, 0x05, 0x49,
+ 0x6E, 0x0F, 0x21, 0xD2, 0xBD, 0x5E, 0x2C, 0x46, 0x8C, 0x07, 0xAB, 0x64, 0xA3, 0x00, 0x52, 0x6F,
+ 0x65, 0x87, 0x91, 0x2A, 0x88, 0x3F, 0x93, 0x5C, 0xC6, 0x2F, 0xD2, 0xF6, 0x7E, 0x6D, 0x48, 0xC8,
+ 0x7E, 0x29, 0x37, 0x3E, 0xA5, 0xA6, 0x04, 0x3B, 0x55, 0x65, 0xB5, 0x9B, 0x49, 0x72, 0x9C, 0xB7,
+ 0xE6, 0xC4, 0x6D, 0x6A, 0xBD, 0x71, 0x60, 0x6B, 0xBD, 0x60, 0x2E, 0x43, 0xFE, 0x84, 0x88, 0xD8,
+ 0x8C, 0x81, 0xD1, 0xB0, 0x8F, 0xAA, 0xA0, 0x91, 0x9B, 0x1E, 0xE2, 0xA7, 0x1D, 0x56, 0x89, 0x72,
+ 0xE7, 0xD3, 0xE1, 0x58, 0x4E, 0x07, 0x30, 0x75, 0xDE, 0xCD, 0x00, 0xD2, 0xF6, 0xFB, 0x2D, 0x5D,
+ 0xAA, 0x29, 0xF7, 0xEB, 0x84, 0x16, 0x28, 0x17, 0xEB, 0xC9, 0x6D, 0x18, 0xE9, 0x22, 0xF2, 0xED,
+ 0x11, 0xBC, 0xDC, 0x33, 0x91, 0x01, 0xC9, 0x6F, 0x96, 0xD1, 0x89, 0xEB, 0xEF, 0x47, 0x55, 0x93,
+ 0xF1, 0x94, 0x2D, 0xDE, 0x40, 0x2B, 0x9E, 0xDB, 0x02, 0x9E, 0xB8, 0xA9, 0x7E, 0x9D, 0xB6, 0xBF,
+ 0x96, 0x87, 0x3F, 0x07, 0x8D, 0x43, 0x58, 0x70, 0x92, 0xB8, 0x41, 0x7A, 0x05, 0x3F, 0x1F, 0xA7,
+ 0x0B, 0x5B, 0x29, 0xB1, 0x6C, 0x76, 0xB3, 0x44, 0x6C, 0x6F, 0x82, 0x74, 0x10, 0xAB, 0xF0, 0x29,
+ 0x20, 0x6D, 0x00, 0x1E, 0x42, 0x89, 0x8B, 0x79, 0x4B, 0x6A, 0xF0, 0x9D, 0x5E, 0x1C, 0x05, 0x7B,
+ 0x2B, 0x57, 0xB3, 0x45, 0xBF, 0x5A, 0x72, 0x46, 0x01, 0xFB, 0xF6, 0x03, 0x14, 0xBB, 0x1A, 0x1C,
+ 0x62, 0xCA, 0x9B, 0x40, 0xB9, 0xAE, 0x48, 0x4A, 0xC9, 0x0E, 0x0A, 0x26, 0x85, 0x2C, 0x01, 0x92,
+ 0x3F, 0xE1, 0x22, 0x3B, 0xBC, 0x25, 0xF6, 0x08, 0xB7, 0x7E, 0x94, 0x45, 0x18, 0x9B, 0x48, 0xEE,
+ 0x5E, 0xD0, 0xC6, 0x74, 0x34, 0xAF, 0x6E, 0x66, 0xBC, 0x0C, 0xAA, 0x6D, 0xD6, 0x1A, 0xC1, 0x0F,
+ 0xAC, 0xF6, 0x97, 0x20, 0xCF, 0xF3, 0x9A, 0x78, 0xCA, 0x1B, 0x9F, 0x25, 0x52, 0x3D, 0xA9, 0x35,
+ 0x0D, 0xEA, 0x12, 0xCF, 0x0C, 0x32, 0x53, 0x5A, 0x55, 0x4B, 0x99, 0x05, 0x80, 0x56, 0xB6, 0xE2,
+ 0x59, 0xC8, 0x37, 0x0F, 0x4C, 0x79, 0xEF, 0xE5, 0xE0, 0x41, 0x0A, 0x4C, 0x1E, 0x5F, 0x85, 0x90,
+ 0xC7, 0x66, 0x28, 0xAB, 0xD7, 0xF1, 0x91, 0x60, 0xE7, 0x77, 0x28, 0x01, 0x7C, 0xA8, 0x2A, 0x23,
+ 0x84, 0x76, 0x91, 0xAA, 0x65, 0xA4, 0xFF, 0xEC, 0xA2, 0x02, 0x36, 0x9A, 0x43, 0x18, 0xAA, 0x0F,
+ 0x81, 0x26, 0x8F, 0x8B, 0x9C, 0x46, 0x2C, 0x53, 0x63, 0x01, 0x5C, 0x44, 0x4B, 0xBC, 0x28, 0xEA,
+ 0x2F, 0x4E, 0x57, 0x72, 0x35, 0xA3, 0x85, 0x4F, 0x27, 0x22, 0xB5, 0x92, 0x5F, 0x5B, 0xD0, 0x78,
+ 0x49, 0xAF, 0x42, 0x1F, 0x0B, 0x19, 0x9E, 0x17, 0xB0, 0xA6, 0xFB, 0x2F, 0xD7, 0x82, 0x60, 0x11,
+ 0xB6, 0x63, 0x4C, 0x65, 0x44, 0xD1, 0xB4, 0x9A, 0xDA, 0x7A, 0xF8, 0x6E, 0xA5, 0xAE, 0x55, 0x32,
+ 0x46, 0xDD, 0xE5, 0xB8, 0xC3, 0xC6, 0xDC, 0xC4, 0x49, 0x2C, 0x35, 0x2A, 0x2F, 0xFE, 0x85, 0xEE,
+ 0xD0, 0xD7, 0x5E, 0xF1, 0xD9, 0xE9, 0x23, 0xCB, 0x96, 0xAE, 0x30, 0x22, 0x54, 0x80, 0x93, 0x9A,
+ 0xD5, 0x7C, 0x0A, 0xF9, 0x47, 0x1F, 0x02, 0x80, 0x21, 0xFF, 0x53, 0x39, 0xC6, 0xB7, 0x73, 0xDE,
+ 0x4B, 0x03, 0xC8, 0xB7, 0xBF, 0x34, 0x0F, 0xCB, 0x37, 0xD1, 0x5F, 0x53, 0x5F, 0x05, 0x62, 0x2D,
+ 0x62, 0xC4, 0xB6, 0xED, 0x82, 0xC3, 0x19, 0x09, 0xFD, 0xC8, 0x93, 0xAB, 0x63, 0xB2, 0xA5, 0x6B,
+ 0x97, 0x82, 0x37, 0x29, 0xBF, 0x97, 0x54, 0xFE, 0x9B, 0x32, 0xFD, 0x51, 0xE9, 0x14, 0xE1, 0x74,
+ 0x07, 0x2B, 0xFA, 0x39, 0x1C, 0x6A, 0x5B, 0xA3, 0x5B, 0x7E, 0xB6, 0xD9, 0x66, 0x82, 0x0D, 0xF9,
+ 0xD7, 0x9C, 0x64, 0xE8, 0x2A, 0x73, 0x98, 0x95, 0x31, 0xCF, 0xAE, 0xBE, 0x6D, 0x57, 0x69, 0x34,
+ 0x4E, 0x58, 0x0A, 0xD1, 0x5A, 0x94, 0x8F, 0xFE, 0xF5, 0xD6, 0x4E, 0x73, 0xC0, 0x96, 0x4E, 0xFD,
+ 0x21, 0x25, 0xC4, 0xB6, 0x11, 0xFA, 0xA7, 0x41, 0x7E, 0xB2, 0xFC, 0x42, 0x14, 0x16, 0x90, 0xC9,
+ 0x74, 0x5D, 0x4A, 0x25, 0x73, 0xE1, 0x63, 0x7E, 0x81, 0xF9, 0x3F, 0x8E, 0x24, 0x4C, 0x61, 0x02,
+ 0xD5, 0xF8, 0xB2, 0x2E, 0xF3, 0x80, 0x79, 0xBF, 0x13, 0xA0, 0x38, 0xC7, 0x0E, 0x4E, 0x2C, 0x22,
+ 0x46, 0x0E, 0x29, 0xEE, 0x2A, 0x8C, 0xDD, 0x86, 0x33, 0xB7, 0xF0, 0xCC, 0x0F, 0x13, 0x7E, 0x03,
+ 0x07, 0xB3, 0x3E, 0x97, 0xC5, 0x6F, 0xDC, 0xFF, 0x96, 0x23, 0xCB, 0x69, 0x8B, 0x86, 0x94, 0x6D,
+ 0x86, 0xEF, 0x2F, 0x5C, 0x31, 0x7F, 0xF7, 0x22, 0x96, 0x61, 0x88, 0x75, 0x3C, 0x76, 0x97, 0x12,
+ 0x1A, 0xEF, 0x70, 0x7D, 0x6A, 0x17, 0xF5, 0xB1, 0xB5, 0x68, 0x50, 0x91, 0xDD, 0x88, 0x0F, 0xCB,
+ 0x33, 0x73, 0xB9, 0xBF, 0xC6, 0x65, 0xAE, 0x15, 0x6B, 0x20, 0xCF, 0x8A, 0xDF, 0xDF, 0x5D, 0xAD,
+ 0xE8, 0x45, 0x69, 0x7D, 0x1C, 0x1B, 0xF2, 0xAC, 0xCD, 0x9D, 0x9F, 0xB8, 0x6D, 0x57, 0x16, 0x92,
+ 0xCC, 0x1A, 0xF2, 0xC2, 0x62, 0xEE, 0xE2, 0x71, 0x2D, 0x58, 0xAB, 0xB7, 0x60, 0x4D, 0xDB, 0xEF,
+ 0x88, 0xC2, 0x2B, 0x39, 0x8B, 0x4C, 0x0F, 0xEF, 0xEB, 0x86, 0x16, 0x34, 0x49, 0x9E, 0x1E, 0x24,
+ 0xFC, 0xE9, 0x77, 0x2A, 0xD2, 0x75, 0x76, 0x96, 0x24, 0xD3, 0x33, 0x4D, 0x8B, 0xDD, 0x92, 0xBE,
+ 0xBF, 0xE5, 0xB0, 0x12, 0x92, 0x0C, 0x89, 0xD8, 0x73, 0xE2, 0xA6, 0xD7, 0xF3, 0x15, 0x59, 0x76,
+ 0x9F, 0x3B, 0x10, 0xC1, 0xA4, 0x9B, 0x64, 0xC8, 0x4B, 0xD4, 0xEE, 0x63, 0xA7, 0xF7, 0xE9, 0xB4,
+ 0x43, 0x50, 0xC4, 0x7B, 0xE1, 0x7A, 0x53, 0x6D, 0xC8, 0x17, 0x82, 0x31, 0xE4, 0x53, 0xF3, 0x20,
+ 0xF0, 0xE9, 0x78, 0xAF, 0x8F, 0x95, 0x96, 0xA8, 0xE9, 0x0E, 0xFE, 0x10, 0x51, 0x8E, 0xF1, 0x64,
+ 0x89, 0x2B, 0x0B, 0xE1, 0xCE, 0xA1, 0xA9, 0xCA, 0xF0, 0xD4, 0xD3, 0xAA, 0x49, 0xE3, 0x68, 0x76,
+ 0xDE, 0x20, 0x77, 0xCB, 0x92, 0x60, 0x36, 0x66, 0x82, 0x06, 0x6D, 0xDF, 0x11, 0xF7, 0xA3, 0x07,
+ 0x43, 0x18, 0x48, 0x89, 0x40, 0x19, 0x72, 0xAD, 0xF5, 0x06, 0x0B, 0x61, 0x87, 0xD9, 0x48, 0x17,
+ 0x8A, 0x0D, 0xC8, 0x6C, 0xD9, 0xC9, 0x9D, 0xEE, 0x08, 0x16, 0x1F, 0x0D, 0x88, 0xB5, 0xEF, 0x5B,
+ 0x2F, 0x40, 0xAE, 0x71, 0x0F, 0x02, 0x96, 0xAF, 0x2C, 0xC8, 0x8E, 0x86, 0x64, 0x58, 0xF1, 0x7C,
+ 0xE9, 0x86, 0xDB, 0xCF, 0x57, 0x5E, 0xF9, 0x57, 0x7E, 0x85, 0xAE, 0x8B, 0x6A, 0x1E, 0x9B, 0x2B,
+ 0x0D, 0xE2, 0x07, 0xDE, 0x42, 0x76, 0x79, 0x72, 0x25, 0xBB, 0xD6, 0xDA, 0xD8, 0x8D, 0xE4, 0x34,
+ 0xF6, 0xC6, 0xBB, 0x00, 0x62, 0x22, 0x4D, 0x0F, 0x90, 0xD1, 0x35, 0x20, 0x6B, 0x3C, 0x43, 0xB2,
+ 0xBF, 0xED, 0xCA, 0x5D, 0xC2, 0x0F, 0x5A, 0x94, 0x87, 0xE3, 0x61, 0x94, 0x85, 0xE4, 0x24, 0x63,
+ 0xEF, 0x8C, 0xD9, 0x7B, 0xEE, 0x24, 0x5C, 0x51, 0x4A, 0xF1, 0x6B, 0xEB, 0xD6, 0x5A, 0x0F, 0xCE,
+ 0x3B, 0x29, 0xAE, 0x86, 0xAA, 0xFF, 0xEC, 0x66, 0x54, 0x45, 0xA4, 0x86, 0xD1, 0x3F, 0x2C, 0xEF,
+ 0xF1, 0x71, 0x33, 0x4E, 0xB8, 0x16, 0x1A, 0xB2, 0x18, 0x6E, 0xCD, 0xBA, 0x59, 0xDB, 0x52, 0xE8,
+ 0x49, 0x78, 0x75, 0x5C, 0x9F, 0x97, 0xB7, 0x00, 0x57, 0x11, 0xB1, 0x9D, 0x99, 0x0C, 0xA2, 0x54,
+ 0xDD, 0x0A, 0x03, 0xF5, 0xAA, 0x0D, 0xBF, 0x47, 0x2D, 0xC0, 0x41, 0x3A, 0x29, 0x0A, 0xA5, 0x8C,
+ 0x77, 0x38, 0xA5, 0x4F, 0xE9, 0x9C, 0x7E, 0x23, 0x7E, 0xEF, 0x8F, 0xB3, 0x45, 0x96, 0xA5, 0xDC,
+ 0xAC, 0x1A, 0x44, 0xEE, 0xE4, 0x1C, 0x17, 0x01, 0x7E, 0x26, 0x9D, 0xA0, 0x90, 0xD8, 0x4F, 0x5A,
+ 0x14, 0x99, 0x46, 0x51, 0x1F, 0x29, 0xFA, 0xE2, 0xB6, 0xEB, 0x71, 0x1A, 0xF4, 0xE2, 0x59, 0x32,
+ 0x18, 0x66, 0x31, 0x73, 0x58, 0x23, 0xF3, 0xDC, 0xCB, 0x73, 0xBF, 0x04, 0xB5, 0xBD, 0xAD, 0x4D,
+ 0x67, 0x96, 0x84, 0xFA, 0x60, 0x48, 0x97, 0x32, 0xED, 0x55, 0xB1, 0x90, 0xD3, 0x15, 0xFA, 0xD9,
+ 0xE4, 0x9E, 0x65, 0x72, 0x8D, 0xC5, 0x16, 0x99, 0xC9, 0xE7, 0xF7, 0x29, 0xAD, 0xF7, 0xDB, 0x4C,
+ 0x0A, 0xD0, 0x40, 0xBE, 0x26, 0xF4, 0xC3, 0x89, 0x70, 0xE1, 0x82, 0xF1, 0x95, 0xB3, 0xB8, 0x64,
+ 0xE4, 0xBA, 0x2E, 0x4C, 0x4A, 0x93, 0x41, 0x21, 0xF1, 0xBD, 0x2C, 0x8E, 0x15, 0xFC, 0xC2, 0x33,
+ 0x9E, 0x76, 0xAD, 0xCE, 0x93, 0xED, 0x4D, 0x04, 0x27, 0x71, 0xDB, 0x21, 0x0A, 0xDE, 0x48, 0xAD,
+ 0x43, 0x6F, 0xF7, 0x97, 0x7B, 0xBC, 0xCD, 0x5A, 0xDE, 0x60, 0x07, 0x07, 0x2A, 0x83, 0xF4, 0x25,
+ 0x6A, 0xD1, 0xBF, 0xB2, 0x3B, 0xF7, 0x4E, 0x46, 0xB0, 0x34, 0xC2, 0x93, 0x45, 0xB9, 0xE6, 0x32,
+ 0x8E, 0x75, 0x67, 0x12, 0x06, 0x46, 0x7B, 0xB1, 0xD6, 0xEC, 0x91, 0x73, 0x87, 0x99, 0x3E, 0x9E,
+ 0xBB, 0xAC, 0x0C, 0x94, 0xCC, 0xBD, 0x33, 0xCF, 0x27, 0x65, 0x70, 0x18, 0x49, 0x27, 0xD9, 0xAF,
+ 0x17, 0x43, 0x16, 0x99, 0xD3, 0x0A, 0xB9, 0xE9, 0xD6, 0x4A, 0xDE, 0x9C, 0x9C, 0x3F, 0xE8, 0x25,
+ 0xB8, 0xB9, 0xAE, 0xB6, 0x5B, 0xD5, 0x9E, 0x5E, 0x41, 0x41, 0xDE, 0xC8, 0x8E, 0xE3, 0xEC, 0x88,
+ 0xE8, 0xD6, 0x09, 0x16, 0xAB, 0x5C, 0x93, 0xC5, 0xAC, 0xA8, 0x70, 0x14, 0x8B, 0x9D, 0x87, 0x27,
+ 0xC9, 0x07, 0x83, 0x94, 0xD3, 0xBD, 0x38, 0xF8, 0x92, 0xB9, 0xB0, 0xFB, 0xC2, 0xCF, 0x69, 0x0A,
+ 0x6E, 0x39, 0xB4, 0x11, 0xD7, 0x54, 0xCF, 0x2C, 0x87, 0x94, 0x7E, 0xD8, 0x6D, 0xED, 0x54, 0xDF,
+ 0xBA, 0xF6, 0x57, 0x2E, 0xE6, 0x5B, 0x26, 0x3E, 0xD2, 0xA3, 0xE6, 0xB3, 0x9B, 0x75, 0xD5, 0xBD,
+ 0x76, 0x9E, 0xE5, 0x82, 0xA8, 0x4A, 0x2B, 0xC5, 0x45, 0x80, 0xC5, 0x55, 0x0A, 0x72, 0x78, 0x58,
+ 0x3E, 0x88, 0x9D, 0x7D, 0x7C, 0x23, 0xE8, 0xCD, 0x1C, 0xAF, 0x7C, 0x43, 0xB1, 0xE0, 0x19, 0x96,
+ 0x5C, 0xBC, 0xF7, 0x2A, 0x60, 0xF2, 0x50, 0x54, 0xCC, 0xE7, 0xF4, 0xD7, 0x2D, 0xDF, 0x03, 0xBB,
+ 0x77, 0xCE, 0x9C, 0xB3, 0x9F, 0xC0, 0xBC, 0xC3, 0xBB, 0x47, 0xC6, 0xAE, 0x1A, 0x0A, 0x57, 0x52,
+ 0xA5, 0x75, 0xB5, 0x32, 0x62, 0x9A, 0x11, 0xD6, 0x45, 0x03, 0xFC, 0xAA, 0x43, 0x55, 0x4D, 0xDC,
+ 0xE8, 0x0F, 0xBC, 0x46, 0x5B, 0x57, 0x37, 0x9F, 0xD4, 0x5E, 0xFC, 0xD4, 0x7A, 0x1B, 0x67, 0xB7,
+ 0x2A, 0xBE, 0x6A, 0x58, 0xF6, 0x21, 0x20, 0x29, 0x90, 0xC9, 0xB1, 0x25, 0x05, 0xF2, 0x95, 0x5F,
+ 0xA2, 0x3E, 0x39, 0xFC, 0xF0, 0x08, 0x61, 0xE5, 0xB2, 0x9A, 0xFB, 0xE0, 0x9D, 0x40, 0x5D, 0xE4,
+ 0x2D, 0x62, 0x37, 0x8E, 0x02, 0x5A, 0xA1, 0xD5, 0x63, 0x9A, 0xE2, 0x77, 0x46, 0xC6, 0xD1, 0x10,
+ 0xAA, 0x46, 0x1D, 0x22, 0x46, 0x2F, 0xE9, 0x95, 0xF4, 0xD5, 0x69, 0xE6, 0x70, 0xDC, 0x09, 0x4E,
+ 0x0D, 0xA6, 0xD6, 0x16, 0x97, 0xD1, 0x4C, 0xD3, 0xD7, 0x0B, 0x4C, 0x97, 0x66, 0xC0, 0x3F, 0x91,
+ 0xB0, 0x9E, 0x2F, 0x00, 0xF1, 0x10, 0x78, 0x50, 0x9F, 0xC6, 0x38, 0xC5, 0x46, 0xB0, 0x45, 0x53,
+ 0x4F, 0x01, 0x7C, 0x46, 0xB2, 0x85, 0xBE, 0x89, 0xB3, 0x99, 0x33, 0xCB, 0x84, 0x07, 0x45, 0x40,
+ 0x16, 0x0E, 0x2F, 0xE7, 0x5D, 0x0E, 0xFE, 0xF7, 0x68, 0xF3, 0x70, 0xED, 0x8C, 0x82, 0x2F, 0x48,
+ 0x65, 0xD2, 0xCD, 0x3E, 0x65, 0xC3, 0xCD, 0x7A, 0x3D, 0xAD, 0xA0, 0xB4, 0x29, 0x57, 0x26, 0xF1,
+ 0xFF, 0xA1, 0x92, 0x9F, 0x64, 0xAF, 0x1D, 0xB4, 0xF1, 0xDD, 0x4F, 0xC8, 0x1C, 0x1A, 0x8A, 0x26,
+ 0x3D, 0xBC, 0xC8, 0x57, 0x92, 0xDB, 0xAA, 0x5D, 0x5B, 0x7F, 0x77, 0xC5, 0x47, 0x02, 0x34, 0x25,
+ 0x60, 0xC5, 0x7B, 0x8C, 0x84, 0x30, 0x9D, 0xF2, 0x8A, 0x14, 0x6D, 0x55, 0x14, 0xA4, 0xA2, 0x56,
+ 0xFC, 0x26, 0x9F, 0x1B, 0x66, 0xCC, 0x5F, 0x69, 0xF5, 0x9B, 0x43, 0xA0, 0xFC, 0x84, 0x00, 0x1F,
+ 0x85, 0x6A, 0x9C, 0x23, 0x99, 0x6F, 0xF1, 0xFC, 0x8E, 0x07, 0xC4, 0x62, 0x73, 0xEA, 0xFD, 0x7F,
+ 0x92, 0x28, 0xE1, 0xC1, 0x51, 0x5B, 0xDC, 0x2D, 0xB1, 0x88, 0xE5, 0x8C, 0x69, 0x18, 0xF3, 0xD7,
+ 0xFF, 0x76, 0x35, 0x83, 0x0A, 0x54, 0x59, 0x22, 0x31, 0x83, 0x26, 0xB8, 0x5F, 0x26, 0xA7, 0x73,
+ 0x50, 0xB1, 0xB7, 0x53, 0x82, 0x2C, 0x15, 0x65, 0xDF, 0xF9, 0x5E, 0x2A, 0x9A, 0x7E, 0x19, 0xEE,
+ 0xBE, 0xDE, 0xA8, 0xB2, 0x82, 0x58, 0x06, 0xE1, 0xD1, 0xAB, 0xE6, 0x15, 0x7A, 0x31, 0x1B, 0x4B,
+ 0xF6, 0xEE, 0x49, 0x25, 0xB3, 0x68, 0xFE, 0x25, 0x6C, 0x46, 0x9B, 0x88, 0xFA, 0x4C, 0xFC, 0x90,
+ 0xA5, 0x6B, 0x40, 0x07, 0xDB, 0xA5, 0xE5, 0x97, 0x20, 0xD5, 0xE3, 0x0A, 0xC9, 0xB8, 0x55, 0xDD,
+ 0x9B, 0xBA, 0x11, 0x06, 0x4C, 0x3D, 0x34, 0x09, 0xD1, 0xAA, 0x87, 0x5B, 0x95, 0xDD, 0xF9, 0x5D,
+ 0x7E, 0x53, 0xE3, 0x31, 0x46, 0xAB, 0x33, 0x12, 0x0B, 0xB8, 0xEB, 0x4C, 0x2F, 0x95, 0x0D, 0x39,
+ 0xD5, 0xB4, 0xED, 0x96, 0xCE, 0xC0, 0x5A, 0xA3, 0x16, 0xB8, 0x9A, 0x68, 0xDC, 0xE9, 0x3B, 0xC6,
+ 0x36, 0x75, 0x8C, 0x8E, 0x25, 0x97, 0xF7, 0x81, 0xC2, 0xAC, 0x3F, 0x5E, 0x6B, 0x4C, 0x7E, 0x95,
+ 0xAE, 0xD1, 0x50, 0x91, 0x15, 0x67, 0x8E, 0xC8, 0xF2, 0x81, 0x8A, 0x6B, 0xBF, 0x4B, 0xC6, 0xAF,
+ 0xCD, 0x04, 0xCC, 0x16, 0xA2, 0x43, 0x7A, 0x78, 0x56, 0xC1, 0x7E, 0xC8, 0xBE, 0x91, 0x9D, 0x7B,
+ 0x9C, 0xAC, 0x7E, 0x18, 0xFA, 0xEB, 0xAD, 0x1F, 0x28, 0xE0, 0x61, 0x81, 0xC3, 0xD3, 0x24, 0x78,
+ 0x08, 0xE6, 0xD5, 0x91, 0x83, 0x36, 0xA4, 0x1A, 0xB8, 0xCF, 0x93, 0x4F, 0x26, 0x6C, 0xC1, 0x7F,
+ 0x48, 0x93, 0xD2, 0xD6, 0xC2, 0x33, 0x5C, 0x9D, 0x3F, 0x84, 0x7C, 0xD7, 0x8B, 0xBC, 0x9A, 0xDC,
+ 0x46, 0x84, 0xCC, 0x72, 0xF7, 0x7C, 0xEE, 0xA8, 0x37, 0x54, 0x77, 0xD8, 0x21, 0x44, 0xA3, 0x3A,
+ 0xBD, 0xCF, 0x65, 0xF3, 0xDB, 0xD0, 0x6F, 0xCA, 0x19, 0xCD, 0xAC, 0xBD, 0x66, 0x92, 0x89, 0xDF,
+ 0x2B, 0xFE, 0x8D, 0x28, 0xBA, 0x79, 0x5B, 0xBF, 0x66, 0x67, 0x05, 0xE9, 0xA6, 0xFD, 0x56, 0xD6,
+ 0x63, 0x8A, 0x23, 0x01, 0x24, 0x5A, 0x6D, 0x43, 0xCD, 0x26, 0x13, 0x2E, 0x48, 0x46, 0x01, 0x20,
+ 0x52, 0x5A, 0xD8, 0x34, 0x75, 0xF5, 0x4E, 0x63, 0x56, 0x17, 0x35, 0x10, 0x29, 0x4B, 0xDD, 0x0B,
+ 0xA5, 0xAF, 0x95, 0x92, 0xEE, 0x11, 0x99, 0xD2, 0xEA, 0x30, 0x80, 0x16, 0xB3, 0xF8, 0x96, 0x24,
+ 0xED, 0x98, 0x5F, 0x4F, 0x02, 0xBB, 0x69, 0xDD, 0x30, 0x1C, 0xBE, 0x3F, 0x1B, 0x33, 0x2A, 0xA7,
+ 0x83, 0xD7, 0x0E, 0x3D, 0x49, 0x58, 0xEF, 0x61, 0x0D, 0x1C, 0x6B, 0x1B, 0x41, 0xB7, 0xB3, 0x64,
+ 0xF9, 0xE1, 0x1F, 0xF2, 0x4B, 0xC8, 0xED, 0xC7, 0xEE, 0x3A, 0xCB, 0xCD, 0x18, 0x40, 0x28, 0x2F,
+ 0x1C, 0x41, 0x02, 0x31, 0x7A, 0xC3, 0x71, 0x75, 0x21, 0x49, 0x65, 0x6D, 0x32, 0xAC, 0x06, 0x42,
+ 0x11, 0x96, 0xB2, 0xEC, 0xD9, 0x5D, 0xD3, 0xB4, 0xB1, 0x21, 0xFF, 0x98, 0x9F, 0xD6, 0x77, 0x70,
+ 0x6B, 0xA4, 0x6E, 0x45, 0x69, 0x8C, 0xDB, 0x77, 0x92, 0x80, 0xF3, 0x82, 0x95, 0x2E, 0x73, 0xA6,
+ 0x7E, 0xAA, 0x6F, 0xE2, 0x78, 0x82, 0x9E, 0x78, 0x3C, 0xB7, 0x5A, 0x90, 0xA0, 0xE8, 0xB4, 0x5D,
+ 0x7A, 0xA8, 0xCE, 0xAC, 0xBA, 0x00, 0xEA, 0x0F, 0xDF, 0x6B, 0x75, 0x4C, 0x0D, 0x1C, 0x30, 0x7F,
+ 0x6E, 0xFA, 0x03, 0xDC, 0x6B, 0x48, 0xE0, 0x74, 0xD9, 0xB9, 0x67, 0x9D, 0x0B, 0x55, 0xD3, 0xFE,
+ 0x68, 0x79, 0xF7, 0x10, 0x7F, 0x9E, 0xE1, 0xB9, 0x60, 0xE7, 0x54, 0x13, 0x67, 0x2C, 0x04, 0x48,
+ 0xDF, 0xD9, 0x85, 0x2C, 0xFF, 0x1E, 0x01, 0x61, 0x0F, 0x74, 0x2C, 0x21, 0x69, 0x3F, 0xE6, 0x7A,
+ 0xF3, 0xD7, 0xE6, 0xD3, 0xBF, 0x77, 0x83, 0xC8, 0xF5, 0x5D, 0xF4, 0x4D, 0xC6, 0x0B, 0xEC, 0x46,
+ 0x39, 0xDA, 0xBD, 0x39, 0x51, 0xB9, 0xF2, 0xC3, 0x48, 0x41, 0xDA, 0x1E, 0x2F, 0xD8, 0xFB, 0x7F,
+ 0x9E, 0x9C, 0x10, 0xF1, 0xB2, 0x2A, 0x14, 0xD1, 0x3C, 0x38, 0x0F, 0x21, 0x9D, 0xAF, 0x64, 0x95,
+ 0x46, 0x6A, 0xD2, 0x28, 0x14, 0x16, 0xF0, 0x28, 0x43, 0xC9, 0x81, 0x1D, 0x1E, 0xB7, 0x0D, 0x84,
+ 0x8B, 0x30, 0xFD, 0xE3, 0xBB, 0x46, 0x5E, 0xFD, 0xEA, 0x0A, 0x9E, 0x02, 0x3F, 0x5E, 0xE5, 0x00,
+ 0x97, 0xFB, 0x0D, 0xEA, 0xF8, 0x66, 0x7F, 0xB3, 0x6D, 0x2E, 0xFD, 0xC8, 0x15, 0x97, 0xE0, 0xDB,
+ 0x44, 0x59, 0xBC, 0x32, 0xB7, 0x70, 0x61, 0x88, 0xC9, 0x81, 0x21, 0xA4, 0x82, 0x8D, 0x27, 0x67,
+ 0x33, 0x31, 0xE5, 0x6B, 0x94, 0x26, 0xB9, 0xC3, 0xB8, 0x45, 0x69, 0x5D, 0x0B, 0xD2, 0xB1, 0x3A,
+ 0x03, 0x40, 0x8B, 0x06, 0x79, 0x76, 0x63, 0x24, 0x61, 0xB9, 0x26, 0x64, 0x14, 0xC3, 0x9C, 0x9A,
+ 0xFA, 0xD9, 0xBF, 0x7B, 0x6A, 0xB3, 0x2B, 0x9C, 0x9A, 0x8D, 0x9A, 0x11, 0x9B, 0xF7, 0x9D, 0xD2,
+ 0xF8, 0xE4, 0x74, 0x6D, 0x5E, 0x12, 0xD9, 0xC2, 0xE3, 0x7D, 0xDE, 0xDA, 0x57, 0xD6, 0xEF, 0x9A,
+ 0xB1, 0x13, 0xF0, 0xC5, 0x99, 0x5B, 0x88, 0xE2, 0x9B, 0xDF, 0x3B, 0x62, 0x9F, 0x3C, 0x10, 0x38,
+ 0x91, 0xFA, 0x97, 0x82, 0x44, 0x36, 0x65, 0x8C, 0xA2, 0x47, 0x9B, 0x10, 0x12, 0x96, 0xA1, 0x4E,
+ 0x0E, 0x57, 0x42, 0x62, 0xF4, 0xE6, 0xAF, 0x23, 0xC0, 0xB4, 0xA0, 0x49, 0x5A, 0x33, 0xA9, 0x4D,
+ 0xB1, 0xB0, 0x5B, 0x0C, 0x6A, 0x67, 0x47, 0xFB, 0x03, 0x7C, 0x1F, 0x15, 0xA1, 0x72, 0x99, 0xBE,
+ 0x84, 0x58, 0x68, 0x36, 0x13, 0x34, 0x0C, 0x20, 0x11, 0xDB, 0x68, 0x30, 0x9F, 0xEA, 0x05, 0x99,
+ 0xDC, 0x30, 0xF3, 0xA7, 0xA9, 0x3C, 0x7D, 0xA8, 0x3C, 0x0D, 0x43, 0xCB, 0xCC, 0xA5, 0x40, 0xCF,
+ 0x0F, 0xF4, 0x34, 0x91, 0x79, 0x36, 0xB8, 0x4D, 0x25, 0x3E, 0xF7, 0x69, 0xC7, 0x31, 0x9D, 0x45,
+ 0xEC, 0x3C, 0x3D, 0x99, 0x13, 0x54, 0x19, 0x3D, 0xDD, 0x2B, 0xE9, 0x6B, 0xE0, 0xCE, 0xB7, 0xBF,
+ 0x8F, 0x47, 0x0F, 0x1A, 0x43, 0x14, 0x4C, 0xAB, 0xD4, 0xEE, 0xAC, 0x55, 0x0C, 0x4D, 0x7E, 0xA5,
+ 0x40, 0xE9, 0xD0, 0x0A, 0xC0, 0xCD, 0xB8, 0xB4, 0x31, 0x63, 0xEB, 0x78, 0xE9, 0x32, 0x19, 0xE3,
+ 0xFB, 0xA4, 0xCF, 0x48, 0x39, 0x92, 0xA5, 0xAA, 0xA0, 0x4E, 0xA1, 0xF3, 0x2E, 0x1A, 0x59, 0x62,
+ 0xA4, 0xC0, 0x7B, 0xAC, 0xCA, 0xAD, 0x52, 0xA4, 0xB7, 0x6F, 0x4B, 0x67, 0x5E, 0x5E, 0x2A, 0xE0,
+ 0xEC, 0x9B, 0xA7, 0xD6, 0x65, 0xD4, 0x60, 0xF3, 0x48, 0xDF, 0x45, 0xF3, 0xFD, 0xB5, 0x0F, 0xC9,
+ 0xE6, 0x10, 0x78, 0x4D, 0xAD, 0x30, 0xD1, 0x07, 0xEA, 0x38, 0x6A, 0xE3, 0x3B, 0x10, 0x99, 0x1A,
+ 0xA6, 0xDE, 0x2D, 0x9D, 0x1D, 0xCE, 0x5D, 0x26, 0x76, 0x25, 0x87, 0x43, 0xA1, 0xBD, 0xE9, 0xA9,
+ 0xB8, 0xA0, 0x1E, 0x88, 0x1A, 0x6A, 0x99, 0x79, 0x01, 0x32, 0x3A, 0x4C, 0x3B, 0xC1, 0xB5, 0x18,
+ 0x72, 0x32, 0x0F, 0x7B, 0x91, 0x38, 0x66, 0x8A, 0x16, 0x12, 0xAF, 0xBE, 0x5F, 0x73, 0xA3, 0x0A,
+ 0x1D, 0x97, 0x35, 0x87, 0x53, 0x27, 0xB6, 0x5B, 0x43, 0x12, 0xB4, 0xEC, 0xF0, 0x2F, 0x16, 0x59,
+ 0x6E, 0x11, 0x2C, 0x20, 0x11, 0xAB, 0x84, 0x2B, 0x7F, 0x9C, 0x82, 0x19, 0x5D, 0xD3, 0x9A, 0x18,
+ 0xA2, 0xFF, 0x38, 0x7A, 0x07, 0xD3, 0xBE, 0x23, 0x5C, 0x33, 0x00, 0x99, 0xFE, 0xE0, 0xFC, 0xC0,
+ 0x35, 0x05, 0x89, 0xFF, 0x58, 0x93, 0x20, 0x41, 0xDC, 0xD0, 0x27, 0x31, 0xA0, 0xD5, 0xAC, 0xBF,
+ 0x78, 0x87, 0x23, 0x33, 0xBF, 0x52, 0xE2, 0xDB, 0x24, 0xB8, 0x83, 0xE1, 0x26, 0x42, 0x8C, 0x1D,
+ 0xD4, 0xD4, 0xFC, 0xE3, 0x34, 0xF4, 0x5D, 0x98, 0x17, 0xA1, 0xC4, 0x2A, 0x48, 0x3C, 0x4E, 0x89,
+ 0x7D, 0x03, 0x38, 0xE3, 0x13, 0x66, 0xD4, 0x76, 0xB2, 0x93, 0xD2, 0x9C, 0x75, 0x3F, 0xD3, 0x91,
+ 0x34, 0xAF, 0x61, 0x55, 0x1D, 0xE8, 0x4C, 0x2F, 0x59, 0x2A, 0x64, 0x05, 0xB9, 0x1D, 0xC1, 0x0B,
+ 0x1F, 0x4B, 0xFF, 0x83, 0xAB, 0xBE, 0xB7, 0xB5, 0xF2, 0x23, 0x78, 0xD1, 0xA3, 0x81, 0x8F, 0xF2,
+ 0x7C, 0xC6, 0xE7, 0x9F, 0x29, 0xD2, 0x81, 0xFE, 0x50, 0x1C, 0xE7, 0xEF, 0xBF, 0x7F, 0x1C, 0x2A,
+ 0x3F, 0x1A, 0x7C, 0x5E, 0xF7, 0xF5, 0x1B, 0x11, 0x8D, 0xB1, 0xF3, 0xC7, 0xE3, 0x38, 0x43, 0x56,
+ 0x1A, 0x1E, 0x26, 0xE6, 0xD4, 0x15, 0x84, 0x03, 0x04, 0x49, 0xBD, 0xA0, 0xC0, 0x21, 0xC8, 0x8E,
+ 0xC9, 0x96, 0x9B, 0xFA, 0xCA, 0x98, 0xAE, 0x2F, 0xE2, 0x9A, 0x9B, 0xEC, 0x29, 0x8F, 0xF2, 0x04,
+ 0xEA, 0x94, 0xB9, 0x70, 0xED, 0xB1, 0x4E, 0x2B, 0x5C, 0x65, 0x00, 0x79, 0x41, 0x53, 0x4B, 0x9D,
+ 0xFA, 0x90, 0x22, 0x52, 0x76, 0x51, 0xEC, 0xC2, 0x50, 0xCC, 0x6C, 0xA1, 0x5B, 0x4A, 0xAC, 0x58,
+ 0x8F, 0x97, 0x0D, 0xFE, 0xE5, 0x3C, 0x24, 0x34, 0xDC, 0xF2, 0x7A, 0x81, 0xA7, 0x9D, 0x3D, 0x28,
+ 0x87, 0xCF, 0xF3, 0xD2, 0x51, 0x0D, 0xF1, 0x5C, 0x01, 0xD5, 0x58, 0x72, 0x33, 0xD7, 0x48, 0x4A,
+ 0x75, 0xF5, 0x1A, 0x10, 0xF1, 0x12, 0x76, 0x70, 0xD2, 0x0E, 0x3A, 0x9B, 0x09, 0x23, 0x66, 0xED,
+ 0x15, 0xB7, 0xEB, 0x5D, 0xEF, 0x66, 0xEB, 0x8F, 0xAF, 0xD7, 0xDC, 0xF6, 0x5E, 0xA5, 0xED, 0xA8,
+ 0x77, 0xE2, 0xC0, 0xF6, 0x19, 0xFE, 0x38, 0xEC, 0x2D, 0xCC, 0x82, 0xC6, 0x21, 0x22, 0x69, 0x67,
+ 0xE4, 0x86, 0x26, 0x0E, 0xCC, 0x88, 0x55, 0x6A, 0x17, 0xC6, 0xD0, 0x5F, 0x1C, 0x68, 0x72, 0x08,
+ 0x2D, 0x8B, 0xB7, 0xD7, 0xAF, 0x85, 0x0C, 0xC5, 0x9F, 0x4F, 0x6D, 0x0B, 0x34, 0xA2, 0x8D, 0x6D,
+ 0x92, 0x31, 0x6C, 0x92, 0x91, 0xFE, 0x3F, 0xC0, 0xA5, 0x4A, 0x58, 0xA7, 0x23, 0x06, 0xA7, 0xE3,
+ 0xAF, 0xC6, 0xF5, 0x4C, 0x9D, 0x2A, 0x74, 0x4D, 0xAA, 0xD3, 0xA5, 0xD9, 0xB9, 0x4D, 0xDE, 0x2F,
+ 0xA4, 0x69, 0x24, 0x56, 0x5F, 0xCA, 0x0F, 0x43, 0x1E, 0x58, 0xD4, 0x70, 0xD9, 0x11, 0x53, 0xE7,
+ 0xB6, 0x9E, 0x8F, 0x06, 0xCA, 0xBF, 0x20, 0x59, 0xE9, 0x51, 0xAE, 0xBA, 0x68, 0x30, 0xDE, 0x5E,
+ 0x9C, 0x4D, 0x0A, 0xD1, 0xF7, 0xFB, 0x1E, 0xEF, 0xE3, 0x71, 0xFC, 0x9E, 0x12, 0x96, 0xEF, 0xB7,
+ 0xC1, 0xD5, 0x44, 0x48, 0x5E, 0x44, 0x32, 0xED, 0x52, 0xFA, 0x18, 0xA1, 0xAE, 0x6F, 0xCD, 0xDB,
+ 0x83, 0x38, 0x8E, 0xD0, 0xEC, 0x8E, 0x3A, 0xEF, 0x43, 0x03, 0xF2, 0x68, 0x14, 0xE2, 0xD3, 0x7D,
+ 0xF8, 0x2E, 0x23, 0xBC, 0x54, 0x52, 0x60, 0xE4, 0x89, 0xED, 0x87, 0x78, 0x21, 0x07, 0xF8, 0x24,
+ 0x12, 0x1E, 0x99, 0x21, 0x36, 0x3F, 0x6B, 0xB1, 0xE5, 0x62, 0x46, 0x82, 0xC9, 0x44, 0x67, 0x33,
+ 0x3E, 0x38, 0x62, 0x02, 0xA0, 0x48, 0x1B, 0xD7, 0xBD, 0x21, 0xAB, 0x2E, 0x62, 0x9E, 0x35, 0x8E,
+ 0x3E, 0xDA, 0x2D, 0xA4, 0xDC, 0x7E, 0x43, 0x57, 0x45, 0x13, 0xD4, 0x62, 0x45, 0xAB, 0x95, 0x57,
+ 0x4C, 0x56, 0x4C, 0xAD, 0x5F, 0xBF, 0xA0, 0x24, 0x23, 0x53, 0x71, 0xE5, 0xA1, 0x5C, 0x6C, 0xD3,
+ 0xFD, 0xE6, 0x43, 0xFD, 0x28, 0x86, 0xA6, 0x63, 0xA7, 0x73, 0x35, 0xF0, 0xFD, 0xFF, 0xC7, 0x7B,
+ 0x16, 0x38, 0x73, 0x9C, 0xFC, 0x65, 0x50, 0x94, 0x2D, 0x57, 0xE5, 0xDD, 0x8C, 0x3B, 0x68, 0x81,
+ 0xEA, 0x90, 0xA5, 0x3F, 0xC2, 0x2F, 0x9C, 0xD6, 0x9F, 0xBA, 0x01, 0xD7, 0x8E, 0xA1, 0x71, 0xE2,
+ 0xA5, 0x2A, 0x6A, 0xA5, 0xFA, 0xE1, 0x6F, 0x44, 0x13, 0x56, 0x16, 0x3A, 0x1A, 0xBA, 0xBE, 0x5D,
+ 0xA6, 0xFA, 0x73, 0xEB, 0x05, 0xE0, 0x88, 0x8A, 0xEB, 0x5A, 0x50, 0xF5, 0xFC, 0x86, 0xA2, 0x35,
+ 0x41, 0x03, 0x72, 0x92, 0x4A, 0x8F, 0x73, 0xF0, 0x05, 0x2A, 0xA4, 0x8C, 0x5C, 0x46, 0xEB, 0xE9,
+ 0xE3, 0x3C, 0x6F, 0xB2, 0x23, 0x6B, 0xA0, 0x77, 0xED, 0xA9, 0x95, 0x5C, 0x50, 0xA3, 0x01, 0xB0,
+ 0x8D, 0xE9, 0x5B, 0x5C, 0x0B, 0x91, 0xF5, 0x32, 0x9D, 0x52, 0xA1, 0x45, 0x21, 0x45, 0x4A, 0xEA,
+ 0x42, 0x8A, 0x7A, 0x91, 0xA0, 0x34, 0x95, 0x85, 0xEC, 0x84, 0x21, 0xEB, 0x9E, 0x6C, 0xC8, 0xE5,
+ 0x5C, 0x5F, 0xAF, 0x0C, 0xC8, 0x17, 0xC8, 0x87, 0x3C, 0x10, 0xD2, 0x20, 0x03, 0x08, 0xD3, 0x3E,
+ 0xC6, 0x70, 0x33, 0xFE, 0x9E, 0x11, 0x85, 0xDC, 0xB2, 0xD6, 0xEA, 0x83, 0xD2, 0xE2, 0x41, 0x1E,
+ 0x70, 0x0E, 0xED, 0xE5, 0x64, 0xBC, 0x83, 0x6F, 0x1F, 0xEF, 0xC4, 0xFE, 0x20, 0x99, 0x87, 0xF6,
+ 0x76, 0x76, 0x4B, 0xC2, 0xEF, 0x9C, 0xA9, 0xED, 0x33, 0xF8, 0x6A, 0x64, 0x83, 0x76, 0xAE, 0x5D,
+ 0x48, 0xAA, 0x08, 0x64, 0x95, 0xB8, 0x8F, 0x33, 0xB3, 0x88, 0x07, 0x55, 0xDB, 0x6C, 0xA5, 0x1E,
+ 0x3B, 0xCA, 0x76, 0xDC, 0x0D, 0x85, 0x02, 0xA2, 0xEC, 0xB5, 0x0F, 0xC4, 0x52, 0x11, 0x57, 0xF5,
+ 0x2D, 0x8D, 0xFB, 0x3C, 0x49, 0xC7, 0x59, 0x68, 0x3A, 0x62, 0xC9, 0x28, 0xCD, 0x81, 0x98, 0x10,
+ 0xB0, 0x71, 0x3B, 0x96, 0xB9, 0xC2, 0x16, 0x14, 0x88, 0xCC, 0x56, 0x1A, 0xD2, 0x78, 0xBC, 0x53,
+ 0x4A, 0xA8, 0x27, 0xDE, 0x8A, 0x5B, 0xEF, 0x58, 0x97, 0x95, 0x02, 0xF3, 0x76, 0xC1, 0xA2, 0x01,
+ 0xB8, 0xD2, 0xB8, 0xAC, 0xC5, 0xB3, 0x36, 0x33, 0x7C, 0x1A, 0xCA, 0x06, 0x4C, 0x09, 0xBC, 0x3C,
+ 0x0B, 0x0A, 0xD8, 0xAC, 0x74, 0x25, 0xA4, 0x91, 0xDB, 0x13, 0xE5, 0x2B, 0x09, 0xC7, 0x3D, 0x99,
+ 0xFB, 0x4F, 0xFF, 0xB4, 0x9C, 0x9E, 0x89, 0xF8, 0xD3, 0xAC, 0xCF, 0x37, 0xEA, 0x3F, 0xAC, 0x3E,
+ 0x8F, 0x7E, 0xFD, 0x66, 0x97, 0xF1, 0x8A, 0x94, 0xE0, 0x36, 0x2A, 0x48, 0x1C, 0xA9, 0x5B, 0x1E,
+ 0x4D, 0xCC, 0xB0, 0xF6, 0xA6, 0x26, 0x2E, 0x6D, 0x29, 0x6E, 0x89, 0x30, 0x6C, 0x2B, 0xA3, 0x04,
+ 0xD4, 0x8F, 0x8C, 0xCB, 0xA7, 0xA2, 0x05, 0x94, 0x93, 0xE9, 0x9B, 0x03, 0x18, 0x91, 0x76, 0x25,
+ 0x42, 0xF6, 0xC1, 0xE1, 0xE8, 0x6B, 0x56, 0xEF, 0x61, 0xED, 0xDB, 0xF7, 0xD6, 0xD3, 0x50, 0xB1,
+ 0x59, 0xAE, 0x79, 0x22, 0xEB, 0xCC, 0x39, 0x3E, 0x10, 0xD7, 0x21, 0x04, 0x7D, 0xEF, 0x96, 0x73,
+ 0xBC, 0x6C, 0xE5, 0x0D, 0x15, 0x8A, 0x94, 0x07, 0x14, 0x96, 0x86, 0x31, 0x68, 0xD6, 0xC0, 0xE7,
+ 0xE5, 0xEE, 0x6C, 0x77, 0xBD, 0x9E, 0xD9, 0x27, 0xE7, 0x68, 0x1E, 0x57, 0x1A, 0x0D, 0x01, 0xDD,
+ 0x3B, 0xAF, 0x85, 0x5A, 0xA3, 0x49, 0x4A, 0xCB, 0x1D, 0x2E, 0xC4, 0xFE, 0x39, 0x50, 0x36, 0x5C,
+ 0xF8, 0xE4, 0xC4, 0x0D, 0x6A, 0x84, 0xCC, 0xC1, 0x5C, 0xF1, 0x72, 0x34, 0x1B, 0xAE, 0x8E, 0xFB,
+ 0x45, 0x23, 0xBE, 0xC5, 0x4B, 0xAE, 0xC2, 0xC9, 0x74, 0xF5, 0x83, 0x84, 0x26, 0x7A, 0xFA, 0x8D,
+ 0xFF, 0x34, 0x68, 0xDE, 0x39, 0xB3, 0xDB, 0x15, 0xDB, 0x13, 0xC2, 0x59, 0xDE, 0x5F, 0x78, 0xD2,
+ 0x04, 0x1D, 0x3A, 0x45, 0x7B, 0xCD, 0xB5, 0xC4, 0x51, 0xCF, 0x8F, 0xAD, 0x2E, 0x61, 0x23, 0xEC,
+ 0x66, 0x37, 0x2D, 0x4A, 0xB3, 0xD4, 0xCA, 0x8C, 0x37, 0x3F, 0xAE, 0x15, 0x3F, 0xBE, 0xE7, 0x5E,
+ 0x2D, 0xAD, 0x95, 0x30, 0xFB, 0x35, 0x42, 0xC9, 0xFB, 0xF1, 0x5A, 0xD0, 0x20, 0x3A, 0x06, 0xF5,
+ 0x1D, 0x2D, 0xDB, 0xAC, 0x4C, 0xEB, 0x02, 0xF0, 0x11, 0x4D, 0xC9, 0x24, 0x46, 0x5E, 0x1A, 0xAA,
+ 0x24, 0xE8, 0x0B, 0xAC, 0x83, 0xAD, 0x12, 0x9D, 0xD1, 0x79, 0xBC, 0xE0, 0xF7, 0x56, 0x21, 0x90,
+ 0x71, 0x7D, 0x6D, 0x36, 0x59, 0xC3, 0xF8, 0x4C, 0x60, 0xBF, 0x0B, 0xF4, 0x29, 0x60, 0x65, 0xF3,
+ 0xC7, 0x48, 0xAC, 0x8F, 0x7C, 0x5D, 0x4B, 0xF8, 0x75, 0x5E, 0x94, 0x97, 0x1C, 0x02, 0x70, 0xED,
+ 0xA3, 0xC4, 0x22, 0xB6, 0x10, 0xFA, 0x74, 0x00, 0x8C, 0x73, 0x6C, 0xC7, 0xB2, 0xFA, 0x6E, 0x0F,
+ 0x42, 0x8B, 0xF5, 0xB7, 0xF0, 0xE9, 0x29, 0xE8, 0x48, 0xB3, 0x1C, 0xD2, 0xAB, 0xA1, 0xA5, 0x8B,
+ 0x1C, 0x43, 0x44, 0xEF, 0xE9, 0x95, 0xC8, 0xA6, 0xE9, 0x48, 0x8C, 0x73, 0xFA, 0x6C, 0x9C, 0xC4,
+ 0xAE, 0x2B, 0xB3, 0xC9, 0x11, 0x06, 0x20, 0xA9, 0x00, 0xFB, 0x50, 0x1D, 0x73, 0x68, 0xD5, 0xC0,
+ 0x4D, 0x38, 0x4C, 0xAA, 0x93, 0xC0, 0x24, 0x25, 0xE0, 0x55, 0x0C, 0x6F, 0xE8, 0xA2, 0x66, 0x3C,
+ 0xE0, 0x5E, 0x5C, 0x2F, 0xBC, 0x27, 0x66, 0x99, 0x0E, 0xF6, 0xFE, 0xCF, 0x14, 0x19, 0x0E, 0x9D,
+ 0x75, 0xCF, 0xE9, 0x29, 0xC1, 0x77, 0x26, 0xF5, 0x78, 0xA5, 0x4E, 0x7D, 0x7F, 0x3F, 0x33, 0x11,
+ 0x5F, 0x26, 0xCD, 0xCB, 0x5B, 0x47, 0xD4, 0x37, 0x4C, 0xBA, 0x38, 0x59, 0x23, 0x80, 0x84, 0xEF,
+ 0x3C, 0xCC, 0xD6, 0xA9, 0x71, 0xA3, 0xFE, 0x5B, 0xD5, 0x3B, 0x21, 0x52, 0xC2, 0xD6, 0x1B, 0x71,
+ 0x3B, 0x06, 0x55, 0x5C, 0x1B, 0x77, 0xAB, 0x80, 0x0B, 0x17, 0xCB, 0x14, 0x72, 0x87, 0xFB, 0x81,
+ 0xD4, 0xFB, 0xB7, 0xD0, 0x84, 0x65, 0x9B, 0x6F, 0x2B, 0xD5, 0x7A, 0x12, 0xA8, 0x2A, 0xBE, 0xA5,
+ 0xE7, 0xE2, 0x8F, 0x05, 0x1A, 0x54, 0x10, 0xAA, 0x72, 0x34, 0xF6, 0xE9, 0x08, 0x6B, 0xB4, 0xFC,
+ 0x69, 0xAF, 0x26, 0x5F, 0xC5, 0x72, 0x61, 0x96, 0x3A, 0xD6, 0xE4, 0x5B, 0xBA, 0xCB, 0x0C, 0xD1,
+ 0xAE, 0xF8, 0x19, 0xFA, 0xB6, 0xCF, 0x0C, 0xCC, 0xFC, 0xCD, 0x82, 0x15, 0xAC, 0x36, 0x04, 0x80,
+ 0x75, 0x3D, 0x8D, 0xF9, 0x36, 0x57, 0x4F, 0x7C, 0x55, 0x60, 0xE0, 0x2F, 0xB4, 0x89, 0x9E, 0x77,
+ 0xED, 0xCB, 0x19, 0x96, 0xB4, 0xC0, 0x5E, 0xBE, 0x4E, 0xEF, 0xB9, 0xA7, 0xCB, 0x92, 0x68, 0x74,
+ 0xF0, 0x9A, 0x38, 0xE1, 0x15, 0x67, 0x64, 0xE0, 0x70, 0x08, 0x36, 0xED, 0xC4, 0x47, 0x11, 0xD6,
+ 0x79, 0x5E, 0x12, 0x4A, 0x50, 0xD8, 0xFE, 0x7D, 0x09, 0x67, 0x11, 0x53, 0x2B, 0x2E, 0x6F, 0x5B,
+ 0x91, 0xF5, 0x1A, 0xAA, 0x0C, 0x0C, 0x50, 0x45, 0x0B, 0x94, 0x01, 0x16, 0xB7, 0x83, 0x9A, 0xF6,
+ 0xCC, 0x45, 0x79, 0x7C, 0xD0, 0x9C, 0xFD, 0x66, 0xB1, 0xBD, 0xCF, 0x70, 0xBC, 0x77, 0xF4, 0xA2,
+ 0xEE, 0x6F, 0x13, 0x28, 0x48, 0x39, 0x81, 0xCB, 0x80, 0x52, 0xED, 0x49, 0xEE, 0x54, 0xFD, 0x59,
+ 0x27, 0x51, 0x68, 0x8E, 0xFA, 0x46, 0x89, 0x9A, 0xCF, 0x48, 0x45, 0x9F, 0xA5, 0x6F, 0x16, 0x6C,
+ 0x3C, 0x36, 0x41, 0xF7, 0x06, 0xAA, 0x3A, 0x7D, 0xFF, 0x4E, 0x37, 0xE6, 0x7D, 0x83, 0x9F, 0xDE,
+ 0x6E, 0xBC, 0x7C, 0x95, 0xEF, 0x93, 0x82, 0x42, 0x43, 0xAA, 0xC2, 0x85, 0xBA, 0x7E, 0x9C, 0xB6,
+ 0xD4, 0xE1, 0x11, 0xB2, 0x44, 0xDC, 0xFF, 0xC7, 0x5C, 0x92, 0xCE, 0xC0, 0xBC, 0xA7, 0xB2, 0x41,
+ 0x75, 0x05, 0x4F, 0x00, 0xB9, 0x23, 0xF2, 0xCA, 0xE9, 0x65, 0x23, 0x24, 0x49, 0xA4, 0x15, 0x8E,
+ 0x10, 0xB1, 0xC1, 0x2F, 0xCA, 0xB4, 0xAF, 0x86, 0xF7, 0x80, 0x3D, 0xF2, 0xC1, 0x5A, 0x42, 0x2F,
+ 0xC7, 0x39, 0xFD, 0x06, 0x74, 0xEF, 0x15, 0xEB, 0xE0, 0x24, 0x8F, 0x7B, 0xEE, 0xE0, 0xE4, 0x1D,
+ 0x5F, 0x2A, 0x88, 0xDC, 0x9E, 0xB5, 0xA9, 0x9F, 0xDE, 0x73, 0x2C, 0x7A, 0xF3, 0x9B, 0x32, 0xF3,
+ 0xF4, 0x5F, 0x3C, 0x5E, 0xBE, 0xBA, 0xA0, 0xEA, 0xB6, 0x0B, 0x00, 0x10, 0xE5, 0xBA, 0x6C, 0x62,
+ 0x26, 0x27, 0x62, 0x3B, 0x48, 0x5C, 0x60, 0xEE, 0xEB, 0xFA, 0xEE, 0xB1, 0x6C, 0x0A, 0x46, 0xF3,
+ 0x1E, 0xED, 0xA3, 0x1B, 0xF3, 0x60, 0x02, 0xF3, 0x60, 0x6A, 0x1A, 0x8A, 0x33, 0x70, 0x13, 0x7C,
+ 0x5F, 0xC6, 0xEF, 0x8A, 0x15, 0xCB, 0xC1, 0x44, 0xDD, 0xEF, 0x73, 0x9D, 0x01, 0x70, 0xAF, 0xAA,
+ 0x60, 0x34, 0xB4, 0x2D, 0x4B, 0xA1, 0xBB, 0x5B, 0xF2, 0x54, 0x0F, 0x10, 0xDD, 0xA4, 0xBB, 0xA4,
+ 0xE5, 0xC4, 0x3D, 0xAE, 0xEF, 0x70, 0xF9, 0xED, 0x9A, 0x60, 0x2E, 0x22, 0xAB, 0xF5, 0xA8, 0x8A,
+ 0xEA, 0x62, 0x05, 0x2A, 0x32, 0x31, 0x29, 0xDE, 0x4C, 0x8E, 0x8C, 0x6C, 0x4B, 0x70, 0xB0, 0x9C,
+ 0x0A, 0x95, 0x52, 0xC6, 0x90, 0x0D, 0x2A, 0xAA, 0xAC, 0x07, 0x54, 0xCE, 0xFE, 0xF6, 0x95, 0xBB,
+ 0xCD, 0xF3, 0xE4, 0x69, 0xC7, 0x44, 0x75, 0x63, 0x72, 0x84, 0x0E, 0xD5, 0x13, 0xE4, 0xFA, 0x48,
+ 0xC1, 0x42, 0xD5, 0x5F, 0x6B, 0x88, 0x3D, 0x8E, 0x09, 0x67, 0x42, 0x61, 0x69, 0x72, 0xEE, 0xE3,
+ 0xDF, 0x37, 0x75, 0x30, 0xCE, 0x9D, 0xE3, 0x0C, 0xF9, 0x16, 0x0C, 0xD2, 0x6F, 0x3C, 0x69, 0x8D,
+ 0x8F, 0x1D, 0x78, 0x1C, 0x8B, 0x3A, 0x6C, 0xDF, 0x28, 0x5E, 0x76, 0x79, 0x89, 0x75, 0x82, 0xB7,
+ 0x46, 0x97, 0xB3, 0xF2, 0x60, 0x98, 0x96, 0x5E, 0x5C, 0x24, 0x35, 0xA7, 0x0B, 0xA7, 0xB6, 0x96,
+ 0x80, 0xD3, 0x9C, 0x38, 0xE2, 0xF3, 0x9B, 0x76, 0x86, 0x68, 0xC9, 0xA4, 0x08, 0x46, 0x8D, 0x1D,
+ 0x5C, 0xF7, 0x68, 0x62, 0xBC, 0x6B, 0x7B, 0x1C, 0xE5, 0x72, 0x94, 0x4A, 0xAF, 0x2C, 0x74, 0x4D,
+ 0x9A, 0x05, 0x90, 0xA6, 0xD9, 0x2C, 0xDF, 0x20, 0x2A, 0xE9, 0x0D, 0x8B, 0xDD, 0xD9, 0x97, 0x1D,
+ 0x30, 0x8B, 0xC0, 0x23, 0xCD, 0x1E, 0xF4, 0x3C, 0x06, 0xA2, 0xDC, 0xE9, 0x13, 0xDA, 0xC7, 0x82,
+ 0xC0, 0x5F, 0x08, 0x12, 0x7C, 0xEE, 0x7A, 0x3D, 0x95, 0xE9, 0xCB, 0xA2, 0xBC, 0xA0, 0x55, 0x18,
+ 0x49, 0x83, 0x86, 0x62, 0xCF, 0x8F, 0xA6, 0xF1, 0x14, 0xAA, 0x0A, 0x5A, 0xE1, 0x96, 0xF7, 0x13,
+ 0x0C, 0xC1, 0x09, 0xFD, 0xBF, 0x84, 0xEE, 0x6D, 0x0A, 0x34, 0x73, 0x88, 0xD8, 0x54, 0x61, 0x9A,
+ 0x1F, 0x2B, 0x34, 0x36, 0x44, 0x34, 0x41, 0x7F, 0x09, 0x8F, 0x08, 0x08, 0x40, 0xA1, 0x70, 0x24,
+ 0x30, 0x23, 0x02, 0x2D, 0x76, 0x39, 0xC0, 0xCA, 0xF1, 0xAC, 0xA2, 0xFA, 0x09, 0x07, 0xE0, 0x5D,
+ 0xE2, 0x44, 0x0C, 0x2C, 0xAB, 0x77, 0x4C, 0xE7, 0x7E, 0xFA, 0xAB, 0xF3, 0x43, 0xAF, 0x6F, 0x5D,
+ 0xC1, 0xE3, 0x81, 0x28, 0x9A, 0x47, 0xD4, 0xE5, 0x4B, 0x04, 0x0A, 0x47, 0xFD, 0xF6, 0x31, 0x6D,
+ 0x54, 0xAD, 0x3B, 0x19, 0xF7, 0x28, 0x1D, 0x42, 0x7C, 0x3A, 0x4C, 0xCC, 0xB3, 0x66, 0xE2, 0x9F,
+ 0x8C, 0x18, 0x0F, 0x77, 0xC4, 0xA3, 0xF4, 0x22, 0x75, 0x83, 0x65, 0xFB, 0x4F, 0x02, 0x71, 0xE6,
+ 0x4A, 0x2D, 0x2F, 0xE2, 0x46, 0xB4, 0x0C, 0x39, 0x29, 0xAB, 0xC7, 0x3E, 0x38, 0xC3, 0x0B, 0xA5,
+ 0xE8, 0xB5, 0xE6, 0x0E, 0xEC, 0x77, 0x7C, 0xD0, 0xBF, 0x2F, 0xB1, 0x27, 0x4F, 0x56, 0x73, 0xCA,
+ 0x70, 0xA5, 0x35, 0x71, 0x4A, 0x42, 0xA5, 0x37, 0x0A, 0xA7, 0xAD, 0x27, 0x18, 0x02, 0x8C, 0x4B,
+ 0x3A, 0xB1, 0x6D, 0x17, 0xC1, 0x81, 0x76, 0x70, 0x8D, 0xAC, 0xAD, 0x4A, 0xDD, 0x3D, 0x27, 0x18,
+ 0x66, 0x63, 0x3A, 0x0D, 0xFC, 0xA2, 0x9F, 0xC5, 0x2E, 0x29, 0xD9, 0xA5, 0x0C, 0x4C, 0xA3, 0x6F,
+ 0xA9, 0x3F, 0xFF, 0xB5, 0x83, 0x6B, 0x00, 0x93, 0x57, 0x39, 0x26, 0x6D, 0x40, 0x81, 0x89, 0x4A,
+ 0xAE, 0x55, 0x06, 0x58, 0x75, 0x6F, 0x49, 0xC2, 0xFF, 0xA0, 0x92, 0x7B, 0xB6, 0x60, 0x80, 0x72,
+ 0x52, 0xE5, 0x8D, 0x33, 0xC0, 0xB6, 0x3F, 0xF2, 0x2A, 0x81, 0x11, 0x8F, 0xF5, 0xA2, 0x98, 0x84,
+ 0x59, 0x7C, 0xA8, 0xD5, 0x9C, 0xDE, 0x69, 0x4C, 0x67, 0xD9, 0xFB, 0xBC, 0x68, 0x29, 0x92, 0x25,
+ 0x7D, 0xFD, 0x01, 0x8D, 0x60, 0xBC, 0xAE, 0x34, 0x00, 0x77, 0x06, 0x99, 0xD2, 0x9B, 0xFD, 0x69,
+ 0xD5, 0x56, 0x00, 0xB0, 0x76, 0x71, 0x38, 0xCE, 0xBE, 0xAE, 0xA2, 0xA4, 0x8C, 0xA4, 0xE6, 0x78,
+ 0x9E, 0x96, 0x2F, 0x92, 0xF3, 0x13, 0x22, 0x50, 0xE9, 0x0F, 0xB2, 0x0F, 0x31, 0x4E, 0xC7, 0x2E,
+ 0xF0, 0x70, 0x21, 0x33, 0x41, 0xCA, 0xFA, 0xF0, 0x4D, 0xF8, 0xCD, 0x1E, 0x41, 0x42, 0xED, 0xAA,
+ 0xA0, 0x49, 0x30, 0x2D, 0xBA, 0x1E, 0x11, 0x09, 0x14, 0x0E, 0x39, 0x32, 0x32, 0x22, 0x48, 0x93,
+ 0xCF, 0x1A, 0xF8, 0xC1, 0x91, 0x6A, 0x0B, 0xCC, 0x76, 0x98, 0xD1, 0x2B, 0x9A, 0x40, 0xBF, 0x12,
+ 0xD6, 0xFF, 0x20, 0x7E, 0x54, 0xB8, 0x4E, 0x65, 0xEB, 0xB3, 0x46, 0xD1, 0x44, 0x6A, 0x80, 0x19,
+ 0x72, 0xFD, 0x39, 0x11, 0xD7, 0x7A, 0x7C, 0x03, 0x7D, 0x76, 0xE0, 0xB2, 0x30, 0x02, 0xAA, 0xEC,
+ 0x29, 0xA7, 0x90, 0x08, 0xC8, 0x16, 0x12, 0xA0, 0x30, 0x2C, 0xA1, 0x4E, 0xC1, 0x7C, 0x5F, 0xB7,
+ 0x5A, 0x17, 0xF7, 0xA7, 0xFC, 0xFA, 0xCB, 0x5D, 0xC2, 0xDC, 0x2C, 0x86, 0xF7, 0xCD, 0x2A, 0x0A,
+ 0xA7, 0x22, 0x47, 0x48, 0xC2, 0x75, 0x1E, 0x24, 0xC6, 0x26, 0x98, 0x84, 0x15, 0xAD, 0xB9, 0xBA,
+ 0xC9, 0xAF, 0x7D, 0xA2, 0x5D, 0xDD, 0x8E, 0xE0, 0xEE, 0xEF, 0x74, 0xCE, 0x3F, 0xBC, 0xFC, 0xA0,
+ 0x26, 0x09, 0x15, 0x30, 0xEC, 0x3B, 0xBB, 0x0A, 0xC4, 0x43, 0x9F, 0x27, 0x90, 0x1F, 0xCC, 0x2D,
+ 0x8B, 0x7F, 0xDA, 0x51, 0xCB, 0xF7, 0x27, 0xAC, 0xE5, 0xD7, 0x7D, 0xAA, 0xB0, 0xD9, 0x7C, 0xBF,
+ 0x17, 0xD0, 0x42, 0x57, 0xC0, 0xF9, 0xE3, 0xF0, 0x0E, 0x7B, 0x5F, 0xE4, 0x4B, 0xA0, 0xC1, 0xEE,
+ 0xF1, 0xF2, 0xEB, 0x33, 0xDA, 0x25, 0xFB, 0x08, 0xAE, 0x6F, 0x4B, 0xFB, 0x5E, 0x98, 0x91, 0xD7,
+ 0x91, 0x9A, 0x62, 0x76, 0xC6, 0x51, 0xAA, 0x64, 0x6A, 0xF2, 0xCD, 0xAD, 0x24, 0x42, 0x87, 0x05,
+ 0xD3, 0x39, 0xE1, 0xC5, 0xA8, 0x30, 0x79, 0xD8, 0xC0, 0x03, 0x42, 0x84, 0x5A, 0x75, 0xB4, 0x8C,
+ 0x0D, 0xE3, 0xB4, 0xCB, 0x00, 0xFD, 0x51, 0xDC, 0xE1, 0xA8, 0xDE, 0xE7, 0x33, 0x6D, 0x74, 0x62,
+ 0x2A, 0xAE, 0x99, 0x79, 0x9E, 0xFC, 0x0E, 0x19, 0x35, 0xDD, 0xA1, 0x75, 0xE4, 0x2B, 0x0C, 0xC5,
+ 0x37, 0xCB, 0x70, 0x3E, 0x00, 0x0B, 0x28, 0x37, 0x03, 0x23, 0x4D, 0xF0, 0x85, 0xFB, 0xF5, 0x3B,
+ 0x8D, 0xC1, 0xB9, 0xB2, 0x7D, 0x15, 0x4C, 0xC0, 0x86, 0x78, 0x74, 0x01, 0xDB, 0xB0, 0xC3, 0x01,
+ 0x25, 0x4D, 0x56, 0x70, 0x60, 0x66, 0xCC, 0xC0, 0x1A, 0xD7, 0x77, 0x90, 0x42, 0xDE, 0xE1, 0x09,
+ 0xA9, 0x14, 0xB8, 0xB9, 0x78, 0xAF, 0x64, 0x1F, 0x50, 0x02, 0xF9, 0xAF, 0x2C, 0x43, 0x9A, 0xF3,
+ 0xD9, 0x00, 0x56, 0x81, 0xC9, 0xC6, 0xC8, 0xAF, 0x1D, 0x49, 0x5A, 0xC5, 0xFB, 0x80, 0xF6, 0x3E,
+ 0xD1, 0x03, 0x5B, 0x8B, 0xF4, 0xFA, 0x8B, 0x81, 0xB8, 0x87, 0xD3, 0xEE, 0x40, 0x17, 0xB0, 0x39,
+ 0xE5, 0x20, 0xF4, 0x96, 0xEE, 0x8E, 0xA3, 0x71, 0xCE, 0x05, 0xD4, 0x3C, 0x71, 0x46, 0x91, 0xEA,
+ 0x89, 0xC5, 0x9F, 0xD3, 0x07, 0x77, 0x1E, 0x1C, 0x4B, 0x28, 0xA1, 0xA4, 0x5F, 0xE3, 0xC3, 0x9A,
+ 0xF5, 0x2A, 0xF8, 0xC3, 0x68, 0x4C, 0x76, 0x7B, 0x8B, 0x62, 0x49, 0x8C, 0x7C, 0x31, 0x9D, 0x41,
+ 0x07, 0x29, 0xE9, 0xD9, 0xF1, 0x58, 0x6F, 0x20, 0x31, 0x06, 0x45, 0xEA, 0xAB, 0x5E, 0x94, 0x21,
+ 0xEC, 0xB2, 0xC0, 0xA9, 0xD3, 0x23, 0x54, 0x09, 0x32, 0x95, 0xF7, 0x50, 0x41, 0x13, 0x7E, 0x9D,
+ 0x7C, 0xEB, 0xB8, 0x49, 0x87, 0xD2, 0xF9, 0x55, 0xDC, 0xE5, 0x57, 0x5E, 0x45, 0x3C, 0xA0, 0xE7,
+ 0xF2, 0x70, 0x2B, 0x7A, 0x08, 0x38, 0x1D, 0xCC, 0x34, 0x55, 0xF3, 0x79, 0x99, 0xD8, 0x3A, 0x6C,
+ 0xEA, 0xFD, 0x18, 0xE6, 0xA8, 0x8C, 0x22, 0xE6, 0x24, 0x02, 0xC6, 0x71, 0xFE, 0x09, 0x01, 0x63,
+ 0xD9, 0x13, 0xD6, 0x82, 0xE7, 0x86, 0x9C, 0x08, 0xDC, 0xC5, 0x2A, 0x83, 0x13, 0x3A, 0x03, 0x52,
+ 0x25, 0x71, 0x8B, 0x9E, 0xB5, 0xCC, 0x08, 0x05, 0x98, 0xBC, 0xFF, 0xF0, 0xB8, 0x22, 0xF1, 0x87,
+ 0x6B, 0xE7, 0x0A, 0xB0, 0xF1, 0x77, 0xAC, 0x70, 0xA5, 0x34, 0x22, 0x46, 0xD0, 0x53, 0xB5, 0xE8,
+ 0x77, 0x04, 0x9D, 0x90, 0x8D, 0xE8, 0x57, 0x47, 0x5D, 0xE7, 0x91, 0x41, 0xA5, 0x2B, 0xD2, 0xF0,
+ 0xBE, 0x7B, 0xFE, 0x03, 0xF4, 0x81, 0x73, 0x2F, 0xA4, 0x39, 0x21, 0x3D, 0x24, 0x35, 0xAE, 0xCE,
+ 0xE3, 0x9C, 0x36, 0x5B, 0x45, 0xC4, 0xA0, 0xD4, 0x46, 0x02, 0x38, 0xF7, 0x9E, 0xC3, 0x11, 0x01,
+ 0x31, 0xB8, 0xAC, 0xE8, 0xFC, 0xDB, 0xC5, 0xB4, 0xC4, 0xD5, 0x2A, 0xFB, 0x0D, 0xF7, 0x29, 0xB5,
+ 0xCC, 0xE7, 0xD1, 0xF5, 0x1F, 0x53, 0xDF, 0xD7, 0x7D, 0x71, 0xED, 0x0C, 0xB4, 0xDA, 0xFE, 0xA5,
+ 0x28, 0x5D, 0x5A, 0x4D, 0x54, 0x9D, 0x04, 0x40, 0x92, 0xBD, 0xC4, 0xD7, 0x38, 0x4B, 0xBC, 0xF5,
+ 0x1F, 0x58, 0xAE, 0xD8, 0x0D, 0xA6, 0x92, 0xE8, 0xEF, 0x43, 0xEF, 0xDF, 0x0F, 0xCD, 0x22, 0xFA,
+ 0x61, 0x24, 0x77, 0x6A, 0x60, 0x8D, 0x42, 0xFA, 0x8A, 0x0D, 0x6C, 0x47, 0xDB, 0xC2, 0x57, 0x9F,
+ 0x12, 0x0E, 0x32, 0xD4, 0x12, 0xD7, 0x05, 0x1F, 0xDF, 0x7A, 0xEC, 0xE2, 0x79, 0xEB, 0xC4, 0x8B,
+ 0xC4, 0x71, 0x47, 0xB8, 0xE2, 0xA6, 0xF7, 0x55, 0x7D, 0x6D, 0xC7, 0x93, 0xDB, 0x11, 0xED, 0x70,
+ 0xDE, 0xCD, 0xD9, 0x87, 0x14, 0xDA, 0x69, 0x00, 0x63, 0xFF, 0x5E, 0x0F, 0x9A, 0x38, 0xE7, 0xA2,
+ 0x2F, 0xA6, 0x38, 0x0E, 0xA8, 0x88, 0x38, 0xD4, 0xF5, 0xF3, 0x26, 0x27, 0x33, 0x2A, 0xF0, 0xA1,
+ 0xC8, 0x01, 0x7E, 0xF3, 0xB1, 0xEB, 0x59, 0xCE, 0x3F, 0xE0, 0xC4, 0x86, 0x25, 0xDD, 0xCA, 0x55,
+ 0x58, 0x4F, 0x4B, 0x4F, 0x5D, 0x8A, 0x01, 0xAB, 0x82, 0x3E, 0x48, 0x9F, 0x14, 0x4B, 0x9E, 0x05,
+ 0x6C, 0x3E, 0xEE, 0xF6, 0x84, 0x59, 0x76, 0x56, 0x69, 0x10, 0x6B, 0x4B, 0x79, 0xB6, 0x90, 0x0F,
+ 0x2E, 0x04, 0x45, 0x5C, 0x5A, 0x35, 0x7C, 0x4A, 0x8D, 0xEA, 0xC3, 0xA8, 0x35, 0xD2, 0xCD, 0x0B,
+ 0xE1, 0x37, 0xF3, 0x83, 0xCB, 0x65, 0x8B, 0x65, 0x73, 0xEC, 0xA9, 0x80, 0x11, 0xA2, 0xA5, 0x97,
+ 0x83, 0xC2, 0x0D, 0xF0, 0x23, 0x27, 0x6C, 0xA7, 0xFE, 0xD3, 0x01, 0x1A, 0x1A, 0x60, 0x1C, 0x82,
+ 0x09, 0xE6, 0xB7, 0x7E, 0xE3, 0xE5, 0x9E, 0xF3, 0xEC, 0x7F, 0x76, 0x23, 0xCD, 0xF5, 0xCD, 0xA7,
+ 0x21, 0xD5, 0xCF, 0x7C, 0x56, 0x56, 0x1E, 0xF2, 0x25, 0x36, 0x81, 0x81, 0xE8, 0x33, 0x39, 0xFC,
+ 0x93, 0xE7, 0xC8, 0x4A, 0x39, 0xB5, 0x1C, 0x86, 0x13, 0xC9, 0xD2, 0xAA, 0xC6, 0x31, 0x46, 0xDE,
+ 0xEF, 0x35, 0x26, 0x5A, 0x09, 0x42, 0x0F, 0x24, 0xA5, 0x6A, 0x82, 0x84, 0x17, 0x95, 0x35, 0x7C,
+ 0xB7, 0x99, 0x60, 0x6E, 0x54, 0xE1, 0x43, 0xDC, 0xDD, 0x2A, 0x17, 0x06, 0xB9, 0xF2, 0x34, 0xAE,
+ 0xDB, 0xE9, 0xF3, 0xAB, 0x6C, 0xAA, 0x1A, 0x5E, 0x65, 0xCF, 0x45, 0x3B, 0xB2, 0x6C, 0x47, 0xE5,
+ 0x26, 0x7B, 0x43, 0xD0, 0x58, 0x0A, 0x74, 0xE3, 0xEC, 0xDD, 0x7C, 0xB8, 0x3B, 0xE6, 0xCC, 0x72,
+ 0xD3, 0x35, 0x63, 0xB5, 0x26, 0x7A, 0xBE, 0x71, 0x21, 0x82, 0x75, 0x35, 0x20, 0x11, 0x7F, 0x1D,
+ 0xFE, 0xD4, 0x19, 0xD0, 0xB7, 0xC1, 0xF3, 0xF4, 0xE6, 0x9A, 0xE0, 0x7D, 0x02, 0x60, 0xF0, 0xC8,
+ 0x41, 0xC9, 0x36, 0x14, 0xDE, 0xF5, 0x03, 0x91, 0xE6, 0xFE, 0xAD, 0x1F, 0x50, 0xA7, 0x95, 0xFB,
+ 0x09, 0x26, 0x21, 0x23, 0xA4, 0xF8, 0x84, 0xD2, 0xAB, 0x02, 0x88, 0x62, 0xDD, 0xB9, 0x7A, 0x57,
+ 0xF0, 0x57, 0x92, 0x6E, 0xA5, 0xDD, 0x6D, 0xCF, 0xEF, 0x30, 0x0B, 0xC3, 0xD3, 0xE1, 0xDF, 0xB4,
+ 0x39, 0x35, 0x73, 0x19, 0xED, 0xAE, 0x1A, 0x8A, 0x0D, 0xC8, 0x31, 0x94, 0x3C, 0xB5, 0xEF, 0x2C,
+ 0x67, 0xBA, 0xFD, 0x34, 0x13, 0x95, 0x5B, 0x00, 0x0B, 0xDF, 0x23, 0xBC, 0x7D, 0xDE, 0x1C, 0x30,
+ 0x72, 0x81, 0x9C, 0x34, 0xB7, 0x60, 0x0E, 0x4C, 0x96, 0x64, 0x5C, 0x93, 0x61, 0x53, 0x12, 0x20,
+ 0xD3, 0xA2, 0xBB, 0x9F, 0x1F, 0x26, 0x7F, 0xD5, 0xD7, 0xDE, 0x4C, 0x20, 0x8F, 0x1D, 0x43, 0xAB,
+ 0x2C, 0x7F, 0x50, 0xED, 0x9C, 0x7C, 0x2B, 0x44, 0x2C, 0x22, 0xBF, 0xD6, 0x56, 0xB2, 0x56, 0xE4,
+ 0x74, 0x8A, 0x78, 0x5F, 0x21, 0xB9, 0xD2, 0xDB, 0x9D, 0x7D, 0x42, 0x54, 0x92, 0x8F, 0x55, 0x9E,
+ 0x85, 0xE8, 0x28, 0x92, 0xF0, 0x27, 0x77, 0xCF, 0xFD, 0xE0, 0xB6, 0x2F, 0xBD, 0xC6, 0x4B, 0x8E,
+ 0x3E, 0x90, 0xBB, 0x52, 0xED, 0xF6, 0xAA, 0x22, 0x6F, 0x50, 0xDF, 0xFC, 0x65, 0x7B, 0x0D, 0xE9,
+ 0x27, 0x03, 0x7E, 0x4A, 0x38, 0xDD, 0x0E, 0x7A, 0x27, 0x66, 0x65, 0xDF, 0xD4, 0xDC, 0x62, 0x41,
+ 0x4F, 0xBE, 0x74, 0xBB, 0xCE, 0x45, 0x98, 0xBC, 0x78, 0xC4, 0x58, 0xCB, 0x8B, 0xD7, 0x6E, 0xDE,
+ 0x47, 0xE7, 0x62, 0xE5, 0xE4, 0x83, 0xC4, 0x88, 0x07, 0xE8, 0x59, 0xA8, 0x45, 0x66, 0xE7, 0x2E,
+ 0xC0, 0xC6, 0x34, 0x56, 0x9B, 0x6E, 0xC8, 0x7A, 0x79, 0xE1, 0x67, 0x1A, 0x02, 0x00, 0xC9, 0x0D,
+ 0x4F, 0xFE, 0x10, 0x39, 0x18, 0x01, 0xF4, 0xB9, 0x07, 0x10, 0x72, 0xC7, 0xCF, 0x39, 0xE4, 0xFE,
+ 0x7C, 0x90, 0x2E, 0x29, 0x27, 0x7E, 0x6A, 0x64, 0x8E, 0xC6, 0x52, 0x49, 0x00, 0x15, 0x54, 0xFB,
+ 0x17, 0x73, 0x19, 0x22, 0x24, 0x47, 0x9C, 0x90, 0xA3, 0xC2, 0x16, 0xAC, 0x33, 0x93, 0x1B, 0x3F,
+ 0x3D, 0x7C, 0xC2, 0xB1, 0x73, 0xC4, 0xD4, 0xB5, 0xB3, 0xE0, 0x3D, 0x10, 0x8C, 0x1C, 0x93, 0xE0,
+ 0xAC, 0x24, 0xB0, 0xBE, 0x45, 0xF3, 0xE6, 0x44, 0xD8, 0xEB, 0x82, 0x6D, 0x13, 0x73, 0x71, 0x2A,
+ 0x56, 0xD6, 0x7C, 0x25, 0xFB, 0xD6, 0xC2, 0xE9, 0xB0, 0x8A, 0xE9, 0xEB, 0x1D, 0xA5, 0x6F, 0x19,
+ 0xDD, 0x66, 0x6C, 0x24, 0xCF, 0x44, 0x06, 0x12, 0xF3, 0xC0, 0xAE, 0x21, 0x8B, 0xA1, 0xDF, 0x04,
+ 0xC2, 0x1B, 0xF1, 0xA7, 0x3C, 0xF3, 0x68, 0xB9, 0xB2, 0xAF, 0x8C, 0x24, 0xBF, 0x75, 0x72, 0x60,
+ 0x18, 0x06, 0x1C, 0x3F, 0x26, 0x4D, 0x3B, 0x1B, 0xFD, 0x76, 0xC6, 0x91, 0xB0, 0xB6, 0xD2, 0x5F,
+ 0x67, 0xFA, 0x7D, 0xFF, 0xEC, 0xC7, 0x93, 0x7A, 0x15, 0x4F, 0xE1, 0x1C, 0x46, 0x71, 0x1E, 0x96,
+ 0xBE, 0xAD, 0x2F, 0x31, 0x28, 0x71, 0xCB, 0x04, 0x21, 0xFA, 0x47, 0xB4, 0x4D, 0x8B, 0xEC, 0xD0,
+ 0x78, 0xA1, 0x2B, 0x1B, 0x39, 0xDB, 0x41, 0x27, 0x14, 0x28, 0xE2, 0xA8, 0xFE, 0xAC, 0x68, 0x47,
+ 0xFD, 0x7B, 0x4F, 0xE0, 0xA2, 0xC8, 0x7E, 0x83, 0x86, 0xBD, 0x73, 0x03, 0x18, 0x37, 0xDB, 0x46,
+ 0x1F, 0x6B, 0x17, 0x19, 0x11, 0x0C, 0xA2, 0x14, 0x8B, 0x75, 0xB8, 0xB9, 0xEB, 0xC9, 0xD6, 0x0E,
+ 0x8D, 0x78, 0x62, 0xEB, 0x51, 0x9F, 0xE7, 0xAE, 0x96, 0x83, 0x50, 0x75, 0x36, 0xF6, 0x7F, 0x30,
+ 0x9B, 0x52, 0x57, 0x5B, 0x4D, 0xBC, 0x95, 0x70, 0xCA, 0x2C, 0x8E, 0x3F, 0x59, 0xE0, 0x1C, 0x21,
+ 0x3F, 0x81, 0x07, 0x5B, 0x0D, 0xEB, 0x35, 0xA3, 0x04, 0x10, 0x48, 0xE8, 0x1D, 0x82, 0xEB, 0x3C,
+ 0x5A, 0xCF, 0xA7, 0x96, 0x6C, 0x04, 0x80, 0x38, 0x94, 0x8A, 0x5A, 0x20, 0xDD, 0xE0, 0x84, 0x23,
+ 0xEB, 0x88, 0x31, 0x1E, 0x75, 0xD5, 0x1B, 0x35, 0xE0, 0xE6, 0x79, 0xDF, 0x97, 0xCF, 0x5D, 0x9A,
+ 0xDA, 0x22, 0x55, 0xD3, 0x37, 0xDC, 0x09, 0x4D, 0xE4, 0x06, 0x00, 0x4F, 0xA1, 0xD3, 0x8D, 0xFA,
+ 0xDF, 0x99, 0x67, 0x10, 0x46, 0x61, 0x1D, 0x54, 0x73, 0x7D, 0x5F, 0xF6, 0x5C, 0x38, 0x67, 0xB4,
+ 0x31, 0x59, 0xFF, 0xD2, 0x09, 0x28, 0x2F, 0x7C, 0x2A, 0x95, 0xA2, 0x10, 0x55, 0xED, 0xE3, 0xBA,
+ 0x9D, 0x8F, 0x34, 0xB8, 0xC0, 0xC8, 0x25, 0x4D, 0xF2, 0x1C, 0x50, 0x2A, 0x60, 0xF7, 0x0D, 0x1D,
+ 0x29, 0xD3, 0x26, 0xF9, 0x88, 0xDD, 0xA2, 0x62, 0x1E, 0x9E, 0x84, 0xC3, 0xB9, 0x5A, 0xAD, 0x5F,
+ 0xA9, 0xAA, 0xC9, 0x00, 0xDA, 0xCD, 0x89, 0xB5, 0x33, 0xEB, 0x3B, 0x02, 0xBC, 0x86, 0xD5, 0x46,
+ 0x95, 0x43, 0xC7, 0xD7, 0x5E, 0x19, 0x99, 0xD7, 0xB5, 0x5F, 0x9D, 0x60, 0x11, 0x84, 0xA0, 0xDB,
+ 0x24, 0x13, 0xBD, 0x88, 0xAC, 0xBE, 0x04, 0x0E, 0x43, 0xF0, 0x6F, 0x2D, 0x28, 0xBF, 0x23, 0xA0,
+ 0x27, 0xF4, 0xDF, 0xA5, 0xAD, 0x51, 0x77, 0xE3, 0x17, 0x8A, 0x4C, 0x74, 0x32, 0x70, 0x91, 0x39,
+ 0xB2, 0xE6, 0xA8, 0x55, 0x87, 0xF5, 0xDD, 0x6D, 0xA6, 0x7B, 0x53, 0x1F, 0xFF, 0xFD, 0xB2, 0x97,
+ 0x59, 0x8E, 0x5F, 0xB3, 0x54, 0xDB, 0xF7, 0x5C, 0x57, 0x4E, 0xDD, 0xF6, 0x36, 0x23, 0xBF, 0xBE,
+ 0xB9, 0xD0, 0x2C, 0x9E, 0xDA, 0x4B, 0x33, 0x38, 0x5A, 0x25, 0xED, 0xFE, 0x00, 0x08, 0xE5, 0x64,
+ 0xC3, 0x95, 0x00, 0xAA, 0x96, 0xD3, 0xA9, 0x39, 0xB8, 0xE4, 0x47, 0x72, 0x6C, 0xEB, 0x1A, 0x93,
+ 0x37, 0x9E, 0xD6, 0x1E, 0x5C, 0x6D, 0xDB, 0x74, 0x42, 0x16, 0x95, 0x44, 0x7E, 0x3B, 0xAE, 0xBC,
+ 0x02, 0x15, 0x93, 0xB9, 0x07, 0xBF, 0xFD, 0x4B, 0xD2, 0x94, 0xF2, 0x35, 0xFD, 0xA1, 0x44, 0x37,
+ 0x74, 0xFB, 0x45, 0x46, 0x83, 0x39, 0x1D, 0xA8, 0xE9, 0xE8, 0x9C, 0x67, 0x55, 0xEC, 0x2C, 0x59,
+ 0xF8, 0x3E, 0x6A, 0x54, 0x75, 0x23, 0x1F, 0x90, 0xCE, 0x6A, 0xAA, 0x5C, 0x80, 0x93, 0x6E, 0x6D,
+ 0x2C, 0xC3, 0x5A, 0xF2, 0xA2, 0x93, 0x97, 0xAA, 0x7F, 0xAA, 0x76, 0x0B, 0x59, 0x6D, 0x39, 0x38,
+ 0x32, 0x00, 0xA1, 0xF5, 0x39, 0x94, 0x60, 0x9D, 0xD3, 0xE6, 0xF8, 0xF8, 0x14, 0xC4, 0x6D, 0x47,
+ 0x21, 0x66, 0x43, 0xE4, 0xCB, 0x07, 0x0D, 0xBD, 0xD9, 0x55, 0xDD, 0x03, 0x75, 0x90, 0x91, 0x38,
+ 0x3F, 0x32, 0xE6, 0x73, 0x34, 0xC9, 0xC0, 0x87, 0x3A, 0xC5, 0x62, 0x25, 0x1D, 0x74, 0xB8, 0x0D,
+ 0xA5, 0xED, 0xAF, 0x20, 0xC1, 0x0D, 0xA6, 0x2C, 0x78, 0xC2, 0x46, 0xEA, 0x05, 0xDE, 0x06, 0x47,
+ 0x8D, 0xE2, 0x42, 0x1B, 0x4F, 0x44, 0xEE, 0x83, 0x1A, 0xD7, 0x66, 0x49, 0xBE, 0xD0, 0x8C, 0x58,
+ 0x73, 0xF1, 0x9F, 0x97, 0x74, 0x11, 0xA6, 0x4A, 0x07, 0xDA, 0xA5, 0x75, 0x3D, 0x4A, 0x0F, 0x0D,
+ 0x06, 0x56, 0xB2, 0x5F, 0x5A, 0x8E, 0x2A, 0x1C, 0x38, 0x72, 0xBF, 0xC4, 0xD1, 0x06, 0x55, 0xB2,
+ 0x73, 0xC0, 0x9D, 0x5F, 0x2F, 0x9B, 0x07, 0x17, 0xA7, 0x44, 0xA0, 0x0A, 0x0E, 0xE4, 0x72, 0xB7,
+ 0x70, 0x2E, 0x1E, 0x82, 0x76, 0x63, 0xB5, 0xC1, 0x8F, 0x03, 0x6C, 0xEE, 0x80, 0x3C, 0x86, 0xE1,
+ 0x8E, 0x56, 0xD7, 0x14, 0x37, 0x77, 0x93, 0x9C, 0xB6, 0xE0, 0xFC, 0x49, 0x64, 0x56, 0x77, 0xAE,
+ 0x4E, 0xB0, 0x28, 0xBA, 0x5B, 0x49, 0x5A, 0xB8, 0x83, 0xD8, 0x6B, 0xE5, 0x41, 0x7A, 0x65, 0x8C,
+ 0xC1, 0x71, 0xDD, 0x97, 0x01, 0xA8, 0x9A, 0xAD, 0xC8, 0x43, 0xAB, 0xA6, 0xDC, 0x71, 0xD7, 0x9A,
+ 0xCB, 0x99, 0x5F, 0xCA, 0x4D, 0x75, 0xC7, 0xE4, 0x20, 0x0A, 0x12, 0xE5, 0x45, 0x64, 0x19, 0x7E,
+ 0x32, 0x50, 0x67, 0x22, 0x5C, 0x88, 0xA4, 0xAB, 0x30, 0x97, 0x42, 0xF7, 0xE6, 0x17, 0x35, 0xD5,
+ 0xFE, 0xF3, 0x51, 0xD3, 0x6F, 0x2A, 0xB6, 0x01, 0x9B, 0x80, 0x4F, 0x86, 0x1F, 0xA7, 0x2B, 0xF5,
+ 0x84, 0xD9, 0xBB, 0x0E, 0xE6, 0x2A, 0x05, 0x22, 0xBE, 0xFF, 0x21, 0xCD, 0xFD, 0xCD, 0x85, 0x62,
+ 0xAC, 0xC3, 0xC1, 0x99, 0xDD, 0x8F, 0xDB, 0xCD, 0xDC, 0xD5, 0xA7, 0x08, 0x75, 0x9B, 0x3F, 0x44,
+ 0xB9, 0x91, 0xE9, 0xF0, 0x56, 0x59, 0x33, 0x9F, 0xC3, 0xBD, 0x08, 0x04, 0x17, 0x93, 0x3C, 0x41,
+ 0x66, 0x14, 0x20, 0x44, 0x01, 0x46, 0xEB, 0x05, 0x10, 0xBF, 0x6A, 0xAF, 0x4E, 0x44, 0x8C, 0xE1,
+ 0xBB, 0xB9, 0x86, 0x64, 0x64, 0xB4, 0xDE, 0x7C, 0x17, 0x92, 0xD3, 0x9B, 0x98, 0x23, 0xAA, 0x8C,
+ 0x15, 0xE8, 0xBC, 0xEC, 0xDA, 0x58, 0x3D, 0x8F, 0x53, 0x66, 0x66, 0xA1, 0x87, 0xD1, 0x75, 0x56,
+ 0xFD, 0x9F, 0x6C, 0x72, 0x65, 0xDF, 0x2D, 0x48, 0x58, 0x44, 0xD4, 0x6D, 0xD4, 0x47, 0xFD, 0x4C,
+ 0xF1, 0xBA, 0x76, 0x55, 0xD5, 0x35, 0x76, 0x97, 0x1D, 0x25, 0x8B, 0x20, 0xEA, 0x70, 0x6B, 0x7B,
+ 0x8A, 0x44, 0xA0, 0xC6, 0x04, 0x14, 0xD1, 0x91, 0x50, 0x5E, 0x8E, 0xDC, 0xBC, 0xF9, 0xEA, 0xC2,
+ 0xF7, 0x08, 0x0B, 0x20, 0x46, 0x8F, 0x44, 0x2F, 0xD8, 0xAF, 0x16, 0xD8, 0x9A, 0xEA, 0x7A, 0x93,
+ 0x22, 0xAB, 0x3D, 0x6B, 0x82, 0x81, 0x3D, 0xE8, 0x3B, 0x33, 0xA4, 0x2E, 0x6D, 0x4B, 0x24, 0xFD,
+ 0x00, 0x9C, 0xA6, 0x6F, 0x84, 0xC0, 0xE8, 0xDE, 0x66, 0x8C, 0xDF, 0x10, 0xE0, 0x13, 0xF1, 0x6C,
+ 0xC6, 0x2E, 0x29, 0xD9, 0xB3, 0x77, 0xB4, 0x5E, 0xFB, 0xE9, 0x10, 0x89, 0xC5, 0x23, 0x36, 0x1C,
+ 0x59, 0xD8, 0xE4, 0x78, 0x45, 0x00, 0xCB, 0xC8, 0x31, 0xE1, 0x5A, 0x78, 0x6E, 0x05, 0x56, 0x82,
+ 0xF0, 0x66, 0x4A, 0x40, 0xA4, 0x49, 0xA8, 0x3A, 0xF0, 0x32, 0x55, 0xAD, 0x21, 0xE8, 0x56, 0xDB,
+ 0x4C, 0xB5, 0xD4, 0x45, 0x89, 0x57, 0x53, 0xFC, 0x65, 0x23, 0xA7, 0xF0, 0x78, 0x61, 0xC6, 0x4A,
+ 0x32, 0x1F, 0x95, 0xAE, 0x69, 0x46, 0x28, 0xBF, 0xB4, 0x88, 0xD7, 0x18, 0xF6, 0xD3, 0xBE, 0xD4,
+ 0x00, 0x8C, 0x44, 0x17, 0xDC, 0xA1, 0x65, 0x06, 0xF4, 0xE4, 0x9D, 0x51, 0x40, 0x49, 0x30, 0xD1,
+ 0x5A, 0x09, 0xE6, 0xBD, 0x2A, 0x16, 0x47, 0xDD, 0x14, 0x68, 0xF4, 0xED, 0xEB, 0xD5, 0xF2, 0xF5,
+ 0xF3, 0x1C, 0xEC, 0xCF, 0x89, 0x10, 0x9C, 0xDF, 0x26, 0x4C, 0xD7, 0x50, 0xE6, 0x0F, 0x8B, 0x64,
+ 0x86, 0x36, 0x05, 0x35, 0x6C, 0xED, 0x80, 0x9E, 0x68, 0x1E, 0x44, 0x1D, 0xF7, 0x4C, 0xD9, 0xC2,
+ 0xEB, 0x81, 0x6A, 0xB3, 0xA0, 0xE4, 0xFC, 0x06, 0x84, 0x5B, 0xFE, 0x8A, 0x82, 0xE4, 0xD0, 0x20,
+ 0x11, 0x78, 0x0F, 0xD5, 0xDC, 0x4B, 0x6F, 0xCA, 0xCE, 0x2B, 0xB4, 0x0A, 0x67, 0x1A, 0x19, 0x19,
+ 0xA0, 0x06, 0x5C, 0x56, 0xC1, 0x45, 0xA7, 0x3E, 0xDC, 0xD2, 0x41, 0x59, 0x75, 0x59, 0x7E, 0xCB,
+ 0xB7, 0x0B, 0x9C, 0x44, 0xA8, 0x81, 0x6C, 0xF7, 0x89, 0x49, 0x67, 0x11, 0xCF, 0xB8, 0x0D, 0x44,
+ 0x87, 0x97, 0x97, 0xDC, 0x44, 0xF8, 0x37, 0x93, 0xE4, 0x14, 0xAC, 0xF7, 0xB1, 0x64, 0xA4, 0x2C,
+ 0xDF, 0xC5, 0x04, 0xB1, 0x99, 0x9B, 0x6F, 0x85, 0x7F, 0x77, 0x11, 0xF6, 0x70, 0x6A, 0xF6, 0xE4,
+ 0x54, 0xE7, 0xEC, 0xBC, 0x29, 0xE8, 0x11, 0x0A, 0x24, 0x8F, 0xB6, 0xC7, 0xE8, 0x76, 0x65, 0x54,
+ 0x05, 0x54, 0x80, 0x46, 0x4D, 0xA9, 0x8A, 0xF8, 0x6E, 0x46, 0x01, 0x7B, 0xD6, 0x42, 0x74, 0x54,
+ 0x43, 0xE9, 0xC7, 0xE5, 0x1E, 0xAB, 0x28, 0x66, 0xF7, 0x0A, 0xF0, 0x86, 0x71, 0x7B, 0x05, 0x50,
+ 0xDF, 0xAB, 0x7D, 0x19, 0x04, 0x5D, 0x48, 0x31, 0xD2, 0xE1, 0x75, 0x3C, 0xFF, 0xDB, 0x4A, 0xC1,
+ 0xAA, 0x63, 0xEE, 0x2C, 0xF9, 0x79, 0x11, 0x1E, 0x09, 0xCF, 0x86, 0x86, 0x0B, 0x4E, 0xD1, 0x94,
+ 0x13, 0x3F, 0x29, 0xE5, 0x81, 0xA8, 0x12, 0x41, 0xF3, 0xF3, 0x83, 0x2B, 0x2F, 0xF4, 0x18, 0x10,
+ 0x43, 0x16, 0x95, 0xD7, 0xF8, 0x3E, 0x32, 0x9E, 0x2E, 0x93, 0x08, 0xE3, 0x80, 0xD0, 0x52, 0xDD,
+ 0x68, 0x71, 0x82, 0x2A, 0x16, 0x02, 0xBF, 0xE1, 0x45, 0x93, 0x2A, 0x98, 0x49, 0x87, 0x2A, 0x3C,
+ 0xDF, 0xA0, 0xCD, 0x4C, 0x64, 0x8A, 0xAE, 0xBC, 0x39, 0x71, 0xF8, 0xBA, 0xE6, 0xAB, 0x21, 0x60,
+ 0x34, 0x74, 0x54, 0x99, 0xCD, 0x9F, 0x94, 0xB6, 0xE7, 0x62, 0x3A, 0xB7, 0x4D, 0xCB, 0x27, 0xE4,
+ 0xC8, 0x92, 0xF5, 0x45, 0x6E, 0x32, 0x91, 0x15, 0x8C, 0x4E, 0x10, 0x76, 0x1A, 0x93, 0x2C, 0x4E,
+ 0xBD, 0xDA, 0x27, 0x3F, 0x99, 0xAA, 0xB7, 0x3D, 0xF0, 0xFB, 0x34, 0xB2, 0xD2, 0x7A, 0x23, 0xBA,
+ 0xCF, 0xF4, 0xDE, 0xDB, 0xCC, 0x8C, 0xB1, 0x2D, 0x4A, 0xD6, 0xCA, 0xC0, 0xD8, 0x70, 0x58, 0xBC,
+ 0x9E, 0x22, 0x92, 0xAB, 0xD8, 0xFB, 0xE7, 0xBC, 0xEB, 0x81, 0xB3, 0x77, 0x70, 0x31, 0x86, 0xE1,
+ 0x79, 0xD8, 0x52, 0xD0, 0x6D, 0x39, 0x14, 0x78, 0x73, 0x52, 0x96, 0xE5, 0xBC, 0x2E, 0x42, 0x90,
+ 0x43, 0x2D, 0x81, 0x31, 0x01, 0xE1, 0xA4, 0x59, 0x83, 0x6E, 0xB5, 0x02, 0x8F, 0x53, 0xD0, 0x04,
+ 0x82, 0x0B, 0x60, 0xF0, 0xC6, 0x5F, 0xE4, 0x07, 0x6C, 0x8E, 0xF3, 0xC9, 0x15, 0x15, 0x38, 0xB6,
+ 0x1A, 0x17, 0x0A, 0x52, 0xEF, 0xEF, 0xDC, 0x03, 0x4E, 0x62, 0x5E, 0xF6, 0x7E, 0xAD, 0xCA, 0x52,
+ 0xA6, 0xBC, 0x21, 0xC9, 0x0A, 0x15, 0xAB, 0xA6, 0xDF, 0x6C, 0xB1, 0xF9, 0xC6, 0xF3, 0x53, 0x3B,
+ 0xA9, 0x87, 0x06, 0x62, 0x18, 0xBA, 0x06, 0x23, 0xC8, 0xA8, 0x72, 0xC7, 0x89, 0x1E, 0x1D, 0xEC,
+ 0x5E, 0x46, 0xB9, 0xBE, 0x38, 0x04, 0x0B, 0x29, 0x69, 0x60, 0x97, 0x2E, 0x6F, 0x6A, 0x7F, 0x7A,
+ 0xDD, 0x9C, 0x4A, 0x60, 0x2D, 0x19, 0x16, 0x1A, 0xD6, 0x25, 0xAB, 0x17, 0x44, 0x5E, 0x51, 0x5B,
+ 0xC3, 0x4D, 0x36, 0xC0, 0xEE, 0xA3, 0x8B, 0x10, 0x78, 0x4D, 0xC3, 0x00, 0xB5, 0x07, 0x19, 0xA4,
+ 0xC0, 0x3C, 0x99, 0x4B, 0x70, 0x48, 0xBB, 0x53, 0xFB, 0x21, 0x4D, 0x9B, 0x2B, 0x4C, 0x75, 0x6D,
+ 0x0B, 0x86, 0x49, 0x27, 0x76, 0x61, 0x1D, 0xBB, 0x8C, 0x9F, 0xCB, 0x3B, 0xF6, 0x2F, 0x63, 0x64,
+ 0x65, 0x2C, 0x38, 0x9E, 0xE7, 0x12, 0x85, 0xA7, 0x29, 0x48, 0xE9, 0xC6, 0xDB, 0x2D, 0xA6, 0x54,
+ 0x5A, 0xD5, 0xE0, 0xB6, 0x77, 0xA1, 0x78, 0x84, 0x52, 0xD7, 0xC1, 0x5B, 0x9D, 0x0D, 0x8A, 0x70,
+ 0x3E, 0x72, 0x6A, 0x5D, 0x63, 0x0D, 0xEF, 0x97, 0x68, 0x78, 0x1F, 0x35, 0xDA, 0x98, 0x6E, 0x25,
+ 0x05, 0xCC, 0xF3, 0xC0, 0x1E, 0x4F, 0xD2, 0x29, 0xE4, 0x26, 0xC2, 0x32, 0xE6, 0xA0, 0x65, 0xFE,
+ 0x3E, 0xDB, 0x71, 0xAB, 0x85, 0x79, 0xAB, 0xC9, 0x8D, 0xD1, 0x8A, 0xF2, 0xA2, 0x62, 0xE7, 0x4F,
+ 0xC5, 0xCD, 0x09, 0x94, 0xFD, 0xF0, 0x0E, 0xA2, 0x3D, 0x98, 0x8E, 0x65, 0x35, 0x5F, 0xC8, 0xD5,
+ 0xCC, 0xE2, 0xED, 0x3B, 0x50, 0xB5, 0x52, 0x57, 0xB1, 0x04, 0xA1, 0x6E, 0x48, 0x58, 0xE5, 0x61,
+ 0x75, 0x8D, 0xD2, 0x34, 0x21, 0x62, 0xC3, 0xD2, 0x0C, 0x51, 0xF1, 0x2B, 0xD4, 0xF7, 0xA7, 0x04,
+ 0xE7, 0x22, 0x7B, 0xC0, 0xF0, 0x14, 0xFF, 0x3F, 0xAD, 0x46, 0xED, 0xF3, 0xC1, 0xC6, 0x4D, 0xE7,
+ 0x95, 0x86, 0x60, 0xE3, 0x6E, 0x01, 0xE8, 0x96, 0xEF, 0x85, 0xF3, 0xC0, 0x8C, 0xF1, 0x7D, 0x70,
+ 0x4E, 0x69, 0x5C, 0x06, 0xD0, 0xF9, 0x71, 0x0D, 0x9C, 0x6F, 0x5F, 0xC9, 0xFC, 0x27, 0x32, 0x13,
+ 0x0A, 0xA2, 0x79, 0x31, 0x91, 0x19, 0xFE, 0x50, 0xA5, 0x49, 0xC5, 0x39, 0x9E, 0x7C, 0xD6, 0x89,
+ 0xF9, 0x85, 0x1D, 0x08, 0x1A, 0xD1, 0xF1, 0xA5, 0x9C, 0x35, 0xE9, 0x24, 0x12, 0xDC, 0x15, 0x89,
+ 0x30, 0xB9, 0x99, 0xEF, 0x54, 0x79, 0xCC, 0x68, 0x78, 0xFE, 0x77, 0xDE, 0x51, 0xAD, 0x89, 0x7A,
+ 0x4C, 0x31, 0x29, 0x1D, 0x70, 0x45, 0x80, 0xC6, 0x7D, 0xA4, 0xFD, 0xE4, 0x86, 0xA0, 0xA2, 0x4A,
+ 0x31, 0x17, 0xA9, 0xD0, 0x08, 0xCC, 0xF9, 0xEF, 0x3C, 0x71, 0x1A, 0xEE, 0xFA, 0x94, 0x83, 0x1D,
+ 0x2B, 0xEF, 0x19, 0x00, 0xD0, 0x43, 0xB8, 0x10, 0x35, 0x63, 0x06, 0x9D, 0xA8, 0xFC, 0xF9, 0xC3,
+ 0x07, 0x39, 0x48, 0x0E, 0x86, 0x95, 0x80, 0xD2, 0x9E, 0xB0, 0x9E, 0x89, 0x96, 0x2D, 0x58, 0x5D,
+ 0xD6, 0x88, 0x77, 0xEB, 0x64, 0xC0, 0xA2, 0xB6, 0xCD, 0x96, 0x7D, 0xE2, 0xC8, 0x21, 0x93, 0x65,
+ 0x51, 0xF1, 0x17, 0xAE, 0xB7, 0xF8, 0xBF, 0x90, 0x54, 0x40, 0xE0, 0x9C, 0xD0, 0xDE, 0xD7, 0xFC,
+ 0x18, 0x55, 0x6B, 0x58, 0x0C, 0x17, 0xC7, 0xA3, 0x06, 0x93, 0x9B, 0x2F, 0x68, 0x7E, 0x7D, 0x0F,
+ 0x0C, 0xC8, 0x6F, 0xC5, 0xDB, 0x37, 0xA1, 0x46, 0xE4, 0xDA, 0x1E, 0x66, 0x06, 0xF3, 0x24, 0xB0,
+ 0x05, 0xA2, 0x16, 0x76, 0x2D, 0xA4, 0xA2, 0x27, 0x18, 0x56, 0x63, 0x92, 0xD8, 0xED, 0x9D, 0xA7,
+ 0x3A, 0xC0, 0xA8, 0xFE, 0x24, 0x0F, 0x06, 0xC4, 0x05, 0x74, 0xA5, 0x31, 0xA0, 0x42, 0xFC, 0x59,
+ 0xD0, 0xC3, 0x79, 0x6E, 0x1D, 0x6E, 0x35, 0xFC, 0xBB, 0x58, 0x20, 0x0D, 0x5B, 0xA6, 0xAF, 0xBD,
+ 0x07, 0x81, 0xBC, 0xBE, 0x52, 0x37, 0x20, 0x4C, 0x0D, 0x6A, 0x28, 0xE6, 0x12, 0x3D, 0x0B, 0x84,
+ 0xE1, 0xBE, 0x4F, 0x93, 0x56, 0x5A, 0xCB, 0x82, 0x23, 0x8C, 0xF1, 0xF9, 0xB1, 0xEB, 0xAC, 0x5C,
+ 0x88, 0xB4, 0xC0, 0xF8, 0x6A, 0x78, 0x40, 0x13, 0x43, 0xA3, 0xB9, 0xE3, 0x65, 0xE8, 0xAA, 0x0A,
+ 0xC3, 0xCB, 0x19, 0x9A, 0x7B, 0x76, 0xBA, 0x2A, 0xBF, 0x48, 0xAF, 0xFA, 0x9A, 0xFD, 0x69, 0x46,
+ 0x27, 0x7F, 0x34, 0xF8, 0x9F, 0x89, 0x87, 0xB8, 0x5E, 0x34, 0xCE, 0x40, 0x9E, 0xE7, 0x0E, 0xC1,
+ 0x29, 0x27, 0x5F, 0xD4, 0xEB, 0x5F, 0x3A, 0xD3, 0x20, 0xD7, 0xCC, 0x4B, 0x04, 0x22, 0xD5, 0x48,
+ 0x3B, 0x87, 0x7E, 0x80, 0x31, 0xD0, 0xCF, 0xEB, 0x9E, 0xAB, 0xAE, 0xF0, 0x98, 0x5B, 0x50, 0xC3,
+ 0xED, 0x5A, 0xF9, 0xF8, 0xC6, 0xA2, 0xF9, 0x6E, 0x32, 0x22, 0x46, 0x74, 0x01, 0x55, 0xE2, 0x40,
+ 0xA2, 0x0D, 0x15, 0xEA, 0x4B, 0x67, 0x9A, 0x61, 0x5E, 0x10, 0x40, 0x43, 0xE8, 0xDF, 0x81, 0xB3,
+ 0x4C, 0x0C, 0x27, 0x1F, 0x04, 0x74, 0x5F, 0x49, 0x3E, 0x81, 0x6F, 0x52, 0xC8, 0x4A, 0xD7, 0x0F,
+ 0xD8, 0xCB, 0x6F, 0x0B, 0x76, 0xBE, 0xB2, 0x64, 0xE0, 0x02, 0x08, 0xC6, 0x9E, 0x17, 0xDC, 0x37,
+ 0x76, 0xD4, 0x94, 0xE4, 0xAC, 0xA0, 0x7A, 0x06, 0x4A, 0x48, 0x30, 0x16, 0x54, 0x5B, 0xB8, 0x03,
+ 0x4D, 0x83, 0x67, 0x56, 0x2F, 0x37, 0xFD, 0xC7, 0xC3, 0x60, 0xCC, 0xF9, 0x9D, 0x71, 0x9F, 0x0F,
+ 0xE4, 0xDE, 0x4F, 0xE1, 0xE0, 0x4A, 0xF5, 0xEB, 0xB1, 0x19, 0x92, 0xDF, 0x20, 0x9D, 0x7E, 0x99,
+ 0x0A, 0x06, 0xB6, 0x90, 0x25, 0x3A, 0x6E, 0x21, 0x10, 0x8F, 0x71, 0xAF, 0x7B, 0x26, 0xB3, 0x48,
+ 0x85, 0x1E, 0x37, 0x14, 0x16, 0x6C, 0x71, 0x2A, 0xED, 0x0A, 0x73, 0xFB, 0x9B, 0x8B, 0x30, 0xC6,
+ 0x6B, 0xE5, 0xCD, 0x29, 0x4B, 0xE3, 0x16, 0xC7, 0x8B, 0x97, 0x24, 0xE6, 0xD6, 0x5D, 0x4C, 0x66,
+ 0xAE, 0xE6, 0x28, 0xC3, 0x79, 0x93, 0xE5, 0x38, 0xE9, 0x83, 0x9C, 0x3B, 0xAC, 0x90, 0x8F, 0x7C,
+ 0x73, 0x4E, 0xA7, 0xC9, 0x56, 0x39, 0x75, 0x20, 0xE1, 0x94, 0x4A, 0x34, 0x99, 0xF1, 0x6D, 0x47,
+ 0xD5, 0x51, 0x24, 0x0A, 0xD3, 0x3B, 0xB6, 0x4F, 0x87, 0xD2, 0x8C, 0x3E, 0xAE, 0xCD, 0xC0, 0xBA,
+ 0xCA, 0x51, 0xAC, 0x56, 0xBD, 0xB5, 0xAA, 0xAC, 0xA4, 0xB0, 0xC5, 0x7E, 0xD8, 0x7B, 0x50, 0xC2,
+ 0x8B, 0x0F, 0xCE, 0x14, 0xEB, 0xB6, 0x0C, 0x0A, 0x0F, 0x2D, 0xE0, 0xFF, 0x8D, 0x3C, 0xCE, 0x0E,
+ 0x98, 0xF3, 0x97, 0x44, 0x28, 0xE8, 0x6C, 0x0B, 0x90, 0x7F, 0xAB, 0xD1, 0xB6, 0xA2, 0xDE, 0x7F,
+ 0x49, 0x30, 0x52, 0x45, 0x90, 0x8F, 0xB2, 0x3E, 0x50, 0x3E, 0x24, 0x72, 0x11, 0xB8, 0xB6, 0x20,
+ 0x69, 0xC1, 0x85, 0x54, 0xD4, 0x33, 0x46, 0xEC, 0x99, 0xDD, 0x21, 0xB9, 0x37, 0x2A, 0x81, 0xD0,
+ 0xC2, 0xC8, 0x19, 0xEC, 0x95, 0x7B, 0x5E, 0xC5, 0xBC, 0x08, 0x53, 0x36, 0xD9, 0xE1, 0x51, 0x50,
+ 0xD3, 0x7B, 0xB2, 0xDA, 0xF9, 0x33, 0x92, 0xBF, 0x17, 0x28, 0xF4, 0x1C, 0x5E, 0x35, 0x4C, 0x74,
+ 0xD4, 0x82, 0xFA, 0xBA, 0xBE, 0x89, 0x81, 0x44, 0x10, 0xBE, 0x9D, 0x2E, 0xBA, 0x40, 0xF0, 0x83,
+ 0xE3, 0x42, 0xF4, 0x5F, 0x4D, 0x2A, 0xFD, 0xC5, 0x5D, 0xF1, 0xCE, 0x83, 0x20, 0xD6, 0xEF, 0xBF,
+ 0xB1, 0xBB, 0xC4, 0xC7, 0x53, 0x69, 0x10, 0x80, 0x65, 0x73, 0xBF, 0xCE, 0x0A, 0x41, 0x03, 0xEF,
+ 0x4A, 0xB4, 0xA7, 0x23, 0x7D, 0x6C, 0xE8, 0x5F, 0x2F, 0x44, 0x96, 0xD9, 0xD3, 0x10, 0xA5, 0xF7,
+ 0xAA, 0x5C, 0x18, 0xA0, 0x31, 0x00, 0xB9, 0xB2, 0xD9, 0x12, 0x1C, 0x4B, 0x22, 0x66, 0xCF, 0xED,
+ 0xB8, 0xC3, 0xF7, 0xE6, 0x1A, 0xF5, 0xCE, 0xA4, 0xEB, 0xED, 0x69, 0xE8, 0x38, 0xA0, 0x9F, 0x47,
+ 0x3E, 0x4C, 0x51, 0xDC, 0xFB, 0x4B, 0x34, 0xBC, 0xFA, 0xD4, 0x52, 0xFC, 0x11, 0x6F, 0xBA, 0x3E,
+ 0x06, 0x82, 0x4B, 0x06, 0x8F, 0x8A, 0x66, 0x2C, 0xAE, 0x9B, 0x5F, 0x1D, 0x74, 0x46, 0xBF, 0x9B,
+ 0xB3, 0x94, 0x7A, 0xE2, 0xEE, 0x68, 0xB4, 0x91, 0x37, 0x44, 0x8A, 0xF6, 0x2C, 0xC5, 0x99, 0x7E,
+ 0x68, 0x3A, 0xED, 0x2E, 0x05, 0x0B, 0xBF, 0xCB, 0x99, 0x31, 0xBC, 0xBD, 0x96, 0x26, 0x2F, 0x11,
+ 0xA3, 0xEC, 0x67, 0x3D, 0xBF, 0x08, 0x02, 0xAB, 0x12, 0x43, 0x39, 0x60, 0xCE, 0xCF, 0x35, 0xE8,
+ 0x88, 0xC6, 0x57, 0xA4, 0x7A, 0x35, 0x80, 0x48, 0x3C, 0x6C, 0xC9, 0x9B, 0xDA, 0xE5, 0xB3, 0x48,
+ 0x51, 0x92, 0x7B, 0x8B, 0x45, 0xFB, 0x5F, 0x88, 0xDB, 0x95, 0x73, 0xC2, 0x43, 0xD2, 0x92, 0xA3,
+ 0x34, 0x0F, 0xCB, 0x83, 0x90, 0x78, 0xE6, 0x7A, 0x45, 0x9C, 0xEA, 0xD5, 0x03, 0xCC, 0xEB, 0xB3,
+ 0x74, 0xE2, 0x0E, 0x9A, 0xB5, 0xFB, 0xF2, 0x48, 0x5C, 0x3E, 0xB1, 0x67, 0x0C, 0xB8, 0x6C, 0x36,
+ 0x08, 0x84, 0xC6, 0x4C, 0x82, 0x98, 0xE4, 0xD8, 0x1D, 0x58, 0x15, 0xAC, 0xC4, 0x41, 0xF7, 0x9D,
+ 0x08, 0x64, 0x4A, 0xE9, 0x74, 0x7E, 0x3B, 0x91, 0xC1, 0xE3, 0x9A, 0x0E, 0x81, 0x5C, 0xD1, 0x5C,
+ 0x7A, 0x95, 0x02, 0xD4, 0x28, 0x30, 0xD4, 0xE0, 0xAE, 0xB8, 0xF1, 0x7B, 0xCF, 0xAC, 0x50, 0x90,
+ 0xEF, 0x8F, 0x18, 0xD1, 0x9A, 0x19, 0x6F, 0x41, 0x65, 0xCB, 0x28, 0xBD, 0x9C, 0xB6, 0x27, 0x65,
+ 0x8B, 0xB5, 0xB8, 0x08, 0xC7, 0x41, 0xBC, 0xF2, 0x63, 0x6D, 0x9C, 0xD7, 0x69, 0x03, 0xBF, 0xB0,
+ 0x7B, 0x04, 0xCC, 0xFD, 0x74, 0xA0, 0xBD, 0x81, 0x08, 0x86, 0x4F, 0x42, 0x25, 0xD2, 0x4A, 0x66,
+ 0x49, 0x3E, 0xD0, 0x7A, 0x3D, 0x54, 0xCB, 0x50, 0x94, 0xF3, 0x7F, 0x3A, 0xF2, 0x91, 0xE6, 0x5E,
+ 0x11, 0xC6, 0xA4, 0x76, 0x97, 0xC3, 0x6C, 0x21, 0x0E, 0xB6, 0xBA, 0x10, 0x4A, 0xE3, 0xDC, 0xDC,
+ 0x43, 0x3B, 0xF0, 0x0B, 0x47, 0x65, 0xB9, 0xD7, 0x0B, 0x32, 0xFD, 0xF5, 0x51, 0x03, 0xEA, 0x8C,
+ 0x01, 0x65, 0xC4, 0x6B, 0x25, 0xF1, 0xC2, 0x3A, 0x09, 0x65, 0x1D, 0x58, 0xDE, 0xF4, 0x2B, 0xC7,
+ 0x67, 0x30, 0x04, 0x08, 0x0A, 0x7A, 0x3A, 0x4B, 0xE4, 0xE7, 0xE8, 0xBE, 0xFF, 0x05, 0x42, 0xFC,
+ 0xE0, 0x1F, 0xAE, 0xA8, 0x75, 0xBA, 0xE9, 0xDC, 0x8C, 0xBD, 0x30, 0xB8, 0x1D, 0x04, 0x57, 0xD3,
+ 0x93, 0x1A, 0x43, 0x93, 0xFE, 0x5D, 0x6A, 0x28, 0xBE, 0xE0, 0x39, 0xB2, 0xCC, 0xF0, 0x7D, 0x06,
+ 0x4C, 0x95, 0xFC, 0x62, 0xC7, 0x05, 0xEB, 0x16, 0x88, 0x2B, 0x0E, 0x96, 0xF1, 0xC7, 0x43, 0xC2,
+ 0xB7, 0xE9, 0x2F, 0xEC, 0xA0, 0x5C, 0x9A, 0xD7, 0x26, 0x64, 0x69, 0xDB, 0x13, 0x25, 0xD8, 0x43,
+ 0xE0, 0x5B, 0x0B, 0xA1, 0xE4, 0xB0, 0xF2, 0x4E, 0x6A, 0x9C, 0xF4, 0x7B, 0x9E, 0xE3, 0xB7, 0xD4,
+ 0xC6, 0x10, 0xF2, 0x37, 0x45, 0x8A, 0x6B, 0x97, 0x28, 0x2E, 0x0E, 0xA0, 0x93, 0x13, 0xF7, 0x0B,
+ 0x8A, 0xB9, 0x9F, 0xC0, 0xE4, 0x4A, 0xED, 0xE1, 0x79, 0x32, 0x31, 0x97, 0x2B, 0xB7, 0x09, 0xB5,
+ 0xB9, 0xE3, 0x57, 0x56, 0x5F, 0x81, 0x28, 0x85, 0xAA, 0xF8, 0x69, 0x77, 0x40, 0x74, 0xD6, 0x4B,
+ 0x7A, 0xAC, 0xD5, 0x2D, 0x74, 0xB4, 0x67, 0x89, 0xE1, 0xF1, 0xD9, 0x1F, 0xB8, 0xDC, 0xDF, 0x0D,
+ 0x8D, 0xA6, 0xA7, 0x8D, 0xF1, 0x59, 0x30, 0xD6, 0x00, 0x26, 0xD1, 0x21, 0x2E, 0xE7, 0xB7, 0x91,
+ 0x2E, 0xA9, 0xF6, 0xD0, 0x5A, 0xB6, 0x8A, 0x34, 0x59, 0x92, 0x9E, 0x37, 0x1E, 0xD9, 0x38, 0x2A,
+ 0xAE, 0x12, 0xD4, 0x95, 0x8B, 0xE8, 0xA7, 0x5D, 0x8C, 0x92, 0xA1, 0x8A, 0x4D, 0x9E, 0x64, 0x20,
+ 0xA2, 0x7E, 0xCC, 0x39, 0x50, 0xA4, 0x01, 0xEC, 0xA7, 0xF5, 0x6D, 0x88, 0x8E, 0xB6, 0xCE, 0xA4,
+ 0x58, 0xAA, 0xFB, 0xCA, 0xC5, 0x67, 0x26, 0x07, 0xBB, 0xEC, 0xFB, 0x73, 0x5D, 0x48, 0x9B, 0x49,
+ 0xFE, 0x99, 0x25, 0x6D, 0x82, 0x1F, 0x6E, 0x6E, 0x1E, 0x21, 0xBF, 0x94, 0x52, 0xB7, 0xAC, 0x8E,
+ 0x74, 0x22, 0x10, 0x27, 0x14, 0x6F, 0xDC, 0x80, 0xBD, 0xB3, 0xD6, 0xAD, 0x1F, 0x17, 0x59, 0x6B,
+ 0x42, 0x68, 0xBD, 0x37, 0xCF, 0xC6, 0x46, 0x11, 0x64, 0x9E, 0xEB, 0xF5, 0xCD, 0xA2, 0x5F, 0x3F,
+ 0xC8, 0x0E, 0x1F, 0xCC, 0xFA, 0xE0, 0x59, 0xC4, 0x82, 0x8B, 0x8E, 0xC4, 0x8C, 0x96, 0x56, 0xF5,
+ 0x16, 0x2A, 0x53, 0x0E, 0x36, 0xC9, 0x61, 0x34, 0x3F, 0x0F, 0x73, 0xC3, 0xD9, 0x0C, 0x3B, 0x74,
+ 0xD5, 0x97, 0x3F, 0x2D, 0x1B, 0xCF, 0x1F, 0xD2, 0xFC, 0xFF, 0xBC, 0xFB, 0x9E, 0xE7, 0x5D, 0x30,
+ 0x5D, 0x9C, 0x66, 0x06, 0x26, 0xD3, 0x0A, 0x4E, 0x4C, 0x45, 0xA8, 0xE6, 0x23, 0x0A, 0xE1, 0x3A,
+ 0x31, 0x39, 0xC0, 0x01, 0x9D, 0x19, 0xD3, 0x2A, 0x28, 0xD7, 0x43, 0x40, 0x38, 0xC5, 0xA9, 0xCC,
+ 0x80, 0x71, 0xAF, 0xDC, 0xEF, 0x4E, 0x85, 0xC0, 0xBE, 0x56, 0xC1, 0x54, 0xA6, 0xDE, 0x30, 0xE4,
+ 0xF9, 0xD0, 0x1B, 0x40, 0x6A, 0x61, 0x2B, 0x5C, 0x2B, 0xF6, 0x16, 0x99, 0xD7, 0x62, 0xC2, 0x59,
+ 0x81, 0x87, 0xFB, 0x93, 0x45, 0xEE, 0x38, 0xB8, 0xE7, 0xDD, 0x37, 0xC0, 0x76, 0xC9, 0x0D, 0x17,
+ 0x06, 0x34, 0xD3, 0xB3, 0x6E, 0x88, 0x26, 0x99, 0x48, 0x0E, 0x67, 0x46, 0xE3, 0xE4, 0x22, 0x97,
+ 0xFA, 0xD3, 0xC3, 0x66, 0xD1, 0x08, 0x17, 0x93, 0xDD, 0xC9, 0xC6, 0x41, 0xC7, 0x12, 0x4F, 0x83,
+ 0xB8, 0xCC, 0x60, 0xA0, 0x24, 0xB7, 0x17, 0x16, 0x31, 0xC6, 0x42, 0xEB, 0xEC, 0x48, 0xE1, 0xEB,
+ 0x75, 0x54, 0x75, 0xE8, 0x01, 0xF6, 0x42, 0x67, 0xF1, 0x46, 0xF7, 0xB7, 0x2A, 0x22, 0x88, 0x20,
+ 0xAC, 0xCF, 0xA3, 0x27, 0x36, 0x38, 0xD0, 0x70, 0x99, 0xD5, 0x63, 0xA3, 0xF7, 0x05, 0x25, 0x52,
+ 0x82, 0x04, 0x02, 0xED, 0xBD, 0x13, 0x9F, 0xCE, 0x89, 0xD0, 0x6E, 0xE2, 0x85, 0xBB, 0xEC, 0x7B,
+ 0xFA, 0x6C, 0x88, 0x4B, 0x57, 0xD4, 0xC7, 0xCA, 0x5A, 0x01, 0x6A, 0x6C, 0xD9, 0x75, 0x1E, 0x89,
+ 0x26, 0xFA, 0x4A, 0x0E, 0x1F, 0x2B, 0xA9, 0x97, 0xDB, 0x19, 0x4E, 0xD4, 0x55, 0x5C, 0x3D, 0xF2,
+ 0xDB, 0xD7, 0x5B, 0x60, 0x9E, 0x12, 0x4A, 0x62, 0x45, 0xE7, 0xBB, 0x0E, 0xEF, 0x67, 0x99, 0x68,
+ 0xAA, 0x0E, 0x2B, 0x49, 0x82, 0x8D, 0x7E, 0x4C, 0xA4, 0x78, 0x08, 0xC3, 0xAE, 0x79, 0xF4, 0x39,
+ 0xC1, 0xEC, 0x00, 0xB4, 0x9D, 0x7C, 0x40, 0xFC, 0x6B, 0xBC, 0x16, 0xDB, 0xD8, 0xC4, 0x48, 0x5B,
+ 0x63, 0x16, 0xF6, 0xCE, 0xAA, 0x99, 0xC8, 0xF2, 0x87, 0x2A, 0x05, 0xAD, 0x31, 0xB8, 0xA0, 0x1D,
+ 0xA0, 0xA2, 0x03, 0x0C, 0x54, 0xD5, 0x7B, 0x0C, 0xBF, 0x35, 0x70, 0x57, 0xCD, 0xE3, 0xB0, 0x57,
+ 0xE8, 0xBE, 0x7A, 0x95, 0xDF, 0xDF, 0xAB, 0x11, 0x55, 0x86, 0xA3, 0x27, 0x6E, 0x0B, 0x7B, 0xF0,
+ 0xAD, 0x2E, 0xEE, 0xF8, 0xD6, 0x10, 0xC8, 0x4D, 0x68, 0xCE, 0xA7, 0x86, 0xFC, 0x45, 0xC1, 0x1E,
+ 0x4E, 0x56, 0x61, 0x1E, 0xE8, 0x2C, 0xCA, 0x0D, 0x51, 0xD2, 0x2C, 0xC3, 0x7E, 0xCF, 0xB3, 0x96,
+ 0x1B, 0xEA, 0xD6, 0x0B, 0x2D, 0x86, 0xDD, 0x8C, 0xAA, 0xAF, 0x1B, 0x4C, 0x4A, 0xA7, 0xA1, 0x53,
+ 0x5F, 0x8D, 0xB6, 0x0A, 0x3F, 0x5C, 0xA8, 0x23, 0x33, 0xCB, 0x92, 0xEA, 0x1A, 0xEF, 0xBD, 0x2F,
+ 0x89, 0xA1, 0x5C, 0x73, 0x3D, 0xDE, 0x51, 0x64, 0xC5, 0x52, 0xA7, 0x92, 0xBC, 0x1D, 0xCA, 0xBA,
+ 0xC8, 0xFC, 0x2C, 0x1A, 0x69, 0x44, 0x71, 0xFE, 0xAB, 0x2A, 0x2E, 0xBB, 0x02, 0x92, 0xED, 0x90,
+ 0x01, 0xBC, 0x44, 0x7F, 0x6F, 0x76, 0x1E, 0x30, 0xDC, 0x4D, 0x3D, 0xBC, 0x01, 0xD1, 0x1E, 0xE5,
+ 0x71, 0x0E, 0xA6, 0x7D, 0xE1, 0xD5, 0xA6, 0x08, 0xA6, 0x66, 0x9F, 0x0F, 0xAC, 0x11, 0x96, 0x66,
+ 0x13, 0x03, 0x9F, 0x4C, 0x0E, 0x8A, 0x2A, 0x4C, 0x39, 0xF0, 0xC6, 0x8E, 0x41, 0x9B, 0x23, 0xDD,
+ 0xDB, 0x7B, 0x94, 0x71, 0x6C, 0x78, 0x1B, 0xA6, 0xC1, 0xA8, 0x9B, 0xA5, 0x86, 0x0E, 0x02, 0x97,
+ 0x72, 0x2F, 0xE8, 0xE0, 0x01, 0x64, 0x39, 0x8C, 0x6C, 0x4F, 0x64, 0x24, 0x34, 0x81, 0x33, 0x6D,
+ 0xC6, 0x56, 0x60, 0x23, 0x8C, 0xB1, 0xA3, 0x11, 0x94, 0x37, 0xEF, 0xE4, 0x3E, 0x4D, 0xAF, 0x61,
+ 0x2C, 0xF8, 0x86, 0x03, 0xFB, 0x25, 0xA3, 0x0F, 0xFA, 0x04, 0x3F, 0x72, 0x10, 0xF1, 0xE6, 0x71,
+ 0x13, 0x8A, 0xD7, 0xD3, 0x04, 0x92, 0x46, 0x4A, 0x31, 0xAB, 0x5A, 0x1D, 0x16, 0x68, 0x77, 0x26,
+ 0x9C, 0x28, 0x86, 0x27, 0xD9, 0x60, 0xCA, 0x74, 0x41, 0x90, 0xB6, 0x0C, 0x91, 0xB1, 0x1E, 0x82,
+ 0xD9, 0x81, 0x63, 0x00, 0x2A, 0xA0, 0x07, 0x74, 0x62, 0x3B, 0xBD, 0x5B, 0x9C, 0xA0, 0x6E, 0xE0,
+ 0x55, 0x9B, 0x0A, 0x60, 0x84, 0x92, 0x7E, 0xB1, 0xF1, 0xFC, 0x36, 0x97, 0xF8, 0x92, 0xAF, 0x3B,
+ 0xD1, 0x2A, 0xBF, 0x4E, 0xFD, 0x68, 0xC2, 0xF5, 0x89, 0xED, 0xE8, 0x4A, 0x44, 0xA0, 0x66, 0x50,
+ 0xDF, 0x4F, 0x6B, 0x9D, 0x1C, 0x98, 0xA4, 0xF4, 0x22, 0x9F, 0x51, 0x17, 0x46, 0x4F, 0xFC, 0x07,
+ 0xAD, 0xE6, 0x24, 0xF9, 0x5F, 0x9F, 0x56, 0x49, 0x6A, 0x15, 0x39, 0xCA, 0x68, 0x98, 0xAF, 0xF1,
+ 0x3F, 0xFB, 0x60, 0x36, 0xDC, 0xB7, 0xD4, 0x27, 0x1F, 0x98, 0xDD, 0x6B, 0x21, 0x72, 0x1C, 0x4F,
+ 0x4C, 0x93, 0xC4, 0x01, 0xA4, 0x9C, 0xB7, 0x02, 0xC3, 0xFE, 0xCA, 0xC0, 0x8D, 0xD5, 0xBA, 0x09,
+ 0xB9, 0xAF, 0x1C, 0xB0, 0x08, 0x09, 0x36, 0x70, 0x91, 0x08, 0xF5, 0x1B, 0x14, 0xE9, 0x81, 0xB1,
+ 0xD1, 0xA0, 0x94, 0x4C, 0x73, 0x46, 0xBB, 0x7C, 0xFA, 0xB9, 0xE7, 0x31, 0x94, 0xFD, 0xCE, 0x97,
+ 0xDB, 0x52, 0x32, 0x11, 0x72, 0xD7, 0x1C, 0xDE, 0x97, 0xBE, 0x19, 0xD9, 0xCB, 0xCC, 0xEF, 0x0F,
+ 0x2C, 0x90, 0xEA, 0xED, 0x1F, 0x07, 0x10, 0xD4, 0x4E, 0xDF, 0x3F, 0x92, 0x29, 0x57, 0x22, 0x7A,
+ 0x18, 0xB0, 0xE1, 0xDE, 0x76, 0x61, 0xF3, 0xBA, 0x84, 0xD4, 0x7D, 0x9C, 0x92, 0x7B, 0x0B, 0xC2,
+ 0x7F, 0x6A, 0xF5, 0x5E, 0x77, 0xD6, 0xBB, 0xF5, 0x23, 0x1D, 0xCE, 0x52, 0xFA, 0x21, 0x33, 0xD1,
+ 0x33, 0x38, 0x65, 0x34, 0xCE, 0x8C, 0x25, 0x9D, 0xF4, 0x95, 0xF1, 0x71, 0x17, 0xE6, 0x08, 0x96,
+ 0xEA, 0x54, 0xA1, 0xA1, 0xEB, 0xFD, 0x90, 0xAE, 0x63, 0x42, 0xC0, 0x8B, 0x57, 0xD4, 0x64, 0xDF,
+ 0xB9, 0xF1, 0xB2, 0x8A, 0xAD, 0x42, 0x64, 0x99, 0xF4, 0x3E, 0x72, 0xDB, 0xE1, 0x18, 0xF2, 0x28,
+ 0x0A, 0xDD, 0xB9, 0x8D, 0x66, 0xC2, 0xB1, 0x02, 0xDC, 0xAB, 0x31, 0x2E, 0x42, 0xC8, 0x7A, 0xC0,
+ 0xD2, 0x82, 0x7B, 0x2E, 0xBA, 0x25, 0x07, 0x51, 0xB6, 0xC2, 0xDC, 0x75, 0x84, 0x5B, 0xB5, 0x43,
+ 0x36, 0x37, 0x26, 0x8B, 0x89, 0x77, 0x50, 0xC3, 0x49, 0xC0, 0xA1, 0x41, 0xDC, 0xAA, 0x84, 0x32,
+ 0x4E, 0x77, 0xE5, 0xC3, 0xF2, 0x2E, 0xD8, 0xA0, 0x29, 0x64, 0xAA, 0x4A, 0x43, 0x90, 0xBA, 0xB1,
+ 0x84, 0xFB, 0x9D, 0x40, 0x82, 0x97, 0x01, 0xFE, 0x22, 0x40, 0x54, 0x06, 0x68, 0x9A, 0x9E, 0xB6,
+ 0x29, 0x21, 0xFB, 0x9F, 0xD4, 0x3A, 0x23, 0xDC, 0xAC, 0xB6, 0x7F, 0x19, 0xC8, 0x01, 0x12, 0x40,
+ 0xDB, 0xFB, 0xA1, 0x93, 0xAD, 0xD2, 0x03, 0xFA, 0xB3, 0xA1, 0x47, 0x49, 0x8E, 0x8E, 0xA2, 0xF8,
+ 0xDA, 0xB8, 0xDA, 0xF8, 0x55, 0x2E, 0x8D, 0x91, 0x8E, 0x8C, 0x03, 0x1C, 0x6D, 0x9F, 0x09, 0x41,
+ 0x4B, 0x0A, 0x20, 0xDF, 0x6C, 0x1E, 0x07, 0x33, 0x39, 0xDC, 0xFE, 0x4F, 0xD1, 0xC9, 0xFE, 0xC1,
+ 0x44, 0x38, 0x95, 0x88, 0xE6, 0xAA, 0x20, 0x43, 0x3A, 0x23, 0xBB, 0x05, 0x47, 0x34, 0x26, 0x19,
+ 0xD0, 0x9F, 0x7B, 0x3F, 0x6D, 0x10, 0x36, 0xBD, 0xC1, 0x96, 0x4B, 0xB2, 0x2B, 0x25, 0x36, 0xD3,
+ 0x79, 0x74, 0x1D, 0xDD, 0x88, 0x8D, 0x05, 0x4A, 0xF1, 0xA6, 0xC6, 0x62, 0xE7, 0x28, 0x06, 0xD7,
+ 0x34, 0x73, 0x2F, 0xB8, 0xDE, 0x3C, 0xB3, 0xAA, 0x69, 0xBD, 0xDA, 0x1A, 0x30, 0xE8, 0x59, 0x44,
+ 0x81, 0xCB, 0xCF, 0xAA, 0xE0, 0xD0, 0x1B, 0x7C, 0xC6, 0x0E, 0xD7, 0x24, 0x12, 0xA9, 0x86, 0xB7,
+ 0xC3, 0x73, 0xA4, 0x87, 0x35, 0xC5, 0x6D, 0x44, 0x41, 0x30, 0xC0, 0x53, 0xF3, 0x15, 0x12, 0x12,
+ 0xEA, 0xA0, 0x50, 0x95, 0xA4, 0x8A, 0xC3, 0x4B, 0xB1, 0xC1, 0xA8, 0xB6, 0x20, 0x63, 0x00, 0x8B,
+ 0x77, 0x29, 0x30, 0x51, 0x60, 0x87, 0x7C, 0x0E, 0x80, 0x3C, 0x7A, 0xB3, 0x56, 0x82, 0x99, 0xEC,
+ 0xA2, 0x9D, 0x87, 0xE0, 0x8A, 0x7B, 0xF9, 0x88, 0x74, 0xEF, 0xE6, 0x95, 0xC4, 0x58, 0xFD, 0x85,
+ 0xAF, 0xBD, 0x16, 0xFD, 0xAD, 0x5D, 0x5F, 0xFB, 0xE7, 0xCC, 0xD0, 0x50, 0x59, 0x80, 0x2B, 0x12,
+ 0x2F, 0xB2, 0x2E, 0xC0, 0xEB, 0x6C, 0xF9, 0xE9, 0x95, 0xA7, 0x7E, 0xD5, 0xBD, 0x07, 0x68, 0xFB,
+ 0x09, 0xF3, 0xF9, 0x6F, 0xF2, 0xE1, 0x40, 0x78, 0x9D, 0xD1, 0xA4, 0x85, 0xFF, 0x8F, 0x2E, 0x85,
+ 0x87, 0xF2, 0xAA, 0x77, 0xD8, 0xFC, 0xF9, 0x96, 0x74, 0xB0, 0xB4, 0x1E, 0x3C, 0x2C, 0x17, 0x63,
+ 0x3B, 0x03, 0xF0, 0xF0, 0xC9, 0x29, 0x57, 0x11, 0x81, 0xF8, 0x1B, 0x68, 0x03, 0x40, 0x53, 0x0C,
+ 0x75, 0x4C, 0x93, 0x6D, 0xC4, 0x5D, 0x40, 0xD0, 0x91, 0xAC, 0xA1, 0x6E, 0x5F, 0xDD, 0x0F, 0x51,
+ 0xB8, 0x77, 0x2D, 0x0E, 0x71, 0x45, 0x53, 0x2A, 0x10, 0x83, 0x4A, 0xFA, 0x1B, 0xE7, 0x51, 0x8E,
+ 0xE0, 0xDF, 0x54, 0xBF, 0xBF, 0xA8, 0x6E, 0xC2, 0xA9, 0x15, 0x1D, 0x15, 0x15, 0x21, 0x9A, 0x9F,
+ 0x72, 0x00, 0x0C, 0xB3, 0xD6, 0xF6, 0xF6, 0x25, 0x73, 0xE6, 0x27, 0xFD, 0x24, 0xF4, 0x06, 0x63,
+ 0x21, 0x40, 0x0F, 0x38, 0x24, 0xDC, 0x78, 0x7A, 0x5A, 0x60, 0x50, 0xA6, 0xAD, 0x1D, 0x02, 0x27,
+ 0x60, 0xC5, 0x2B, 0x11, 0x6B, 0xD3, 0x44, 0x52, 0x25, 0xAC, 0x90, 0x8C, 0x8E, 0xBD, 0x77, 0xC7,
+ 0xB7, 0x14, 0x8D, 0xDB, 0xF4, 0xBD, 0xD0, 0xED, 0x4F, 0x76, 0xFE, 0x0C, 0x5E, 0x81, 0x63, 0x49,
+ 0xDD, 0x27, 0x79, 0xD3, 0xEF, 0x12, 0x64, 0xD5, 0x84, 0x99, 0xA4, 0x16, 0x25, 0xC6, 0xE2, 0xAC,
+ 0xD5, 0xC4, 0x8C, 0xBA, 0x42, 0x12, 0x21, 0x96, 0x53, 0xFF, 0xC2, 0xCB, 0x12, 0x98, 0xEB, 0xEC,
+ 0x0E, 0x72, 0xE3, 0x4A, 0x15, 0x5F, 0x61, 0xAF, 0xA4, 0x60, 0x43, 0x3F, 0x79, 0x17, 0xC6, 0xCF,
+ 0x9B, 0x48, 0x4C, 0x49, 0x74, 0xC6, 0x64, 0x92, 0x6C, 0x41, 0xD4, 0xBB, 0xB9, 0x9D, 0x17, 0xA1,
+ 0x68, 0xF1, 0x6E, 0xD5, 0x5E, 0xD6, 0xD9, 0xF6, 0xDA, 0xD8, 0x36, 0xC1, 0x3E, 0xC2, 0xF2, 0x85,
+ 0xBC, 0x9B, 0x05, 0xE0, 0xD5, 0x15, 0xCF, 0x00, 0xBC, 0xD1, 0x1F, 0xCE, 0x50, 0x47, 0x37, 0xFE,
+ 0x57, 0x7A, 0xCB, 0x1C, 0x2E, 0x36, 0x79, 0xC4, 0xDC, 0x1C, 0x11, 0x84, 0xDF, 0xD0, 0xF2, 0x7A,
+ 0x02, 0xDD, 0x37, 0x5E, 0xD0, 0x4A, 0x11, 0x0D, 0x59, 0x8F, 0xDD, 0xEB, 0xF6, 0x1D, 0xE6, 0x0D,
+ 0x58, 0x18, 0x7D, 0xD4, 0x4D, 0x3D, 0x1B, 0xD5, 0x13, 0xB1, 0xD4, 0xBB, 0x50, 0x56, 0x29, 0xB1,
+ 0x78, 0xCA, 0xC9, 0xC3, 0xA4, 0x10, 0x67, 0xFA, 0x48, 0x13, 0x12, 0xAB, 0xB5, 0xDA, 0x45, 0x72,
+ 0x6A, 0x41, 0x11, 0x6B, 0xA9, 0xBF, 0x93, 0xFA, 0x47, 0x6D, 0x46, 0xE4, 0xAE, 0x58, 0xED, 0x5D,
+ 0xF3, 0x38, 0x57, 0xED, 0x49, 0xB7, 0x6A, 0x15, 0xC9, 0xBA, 0x05, 0xF2, 0xA5, 0x9D, 0xC0, 0x0A,
+ 0x31, 0x02, 0xC4, 0x70, 0x33, 0x4E, 0x5D, 0x29, 0x02, 0x5B, 0x99, 0xEF, 0x2A, 0x1B, 0xD6, 0x90,
+ 0xA9, 0xF1, 0x9A, 0x52, 0x09, 0xD4, 0xFD, 0xF7, 0x5F, 0x50, 0xA1, 0x78, 0xD5, 0xA0, 0x69, 0xBE,
+ 0xD7, 0x61, 0x5E, 0x97, 0x16, 0x33, 0xBD, 0x25, 0x2B, 0x9F, 0x25, 0x49, 0x6C, 0x9B, 0x5B, 0xB7,
+ 0x8A, 0x9F, 0x54, 0x46, 0x2C, 0x3F, 0xC9, 0xFA, 0xB8, 0xD0, 0xA3, 0x35, 0xBB, 0xF1, 0x7D, 0x4A,
+ 0x74, 0xEC, 0x6F, 0xD3, 0x14, 0xB3, 0x5E, 0x92, 0xFB, 0xF2, 0xE8, 0x41, 0x0A, 0xD2, 0x33, 0xF0,
+ 0x73, 0x5B, 0x36, 0x9A, 0x70, 0x97, 0x6E, 0x60, 0x54, 0xFD, 0x27, 0x79, 0xC0, 0x4B, 0x1C, 0x86,
+ 0x22, 0xAA, 0xA0, 0x14, 0x9D, 0xF6, 0x79, 0x3A, 0xC3, 0x5C, 0xC4, 0xAC, 0xB2, 0xBC, 0x4D, 0xCC,
+ 0xDC, 0xE0, 0x48, 0xB7, 0x8E, 0xBD, 0x49, 0x08, 0x15, 0xB2, 0xA7, 0x05, 0xF9, 0x15, 0x18, 0x79,
+ 0xF1, 0x5F, 0xEA, 0xB8, 0x53, 0x5B, 0xA2, 0xD8, 0x7E, 0xA7, 0x0A, 0x28, 0x1B, 0x0E, 0x21, 0x10,
+ 0x02, 0xB9, 0xAA, 0x62, 0x1E, 0x17, 0x12, 0x31, 0x8A, 0x60, 0x70, 0x90, 0x66, 0xFF, 0x83, 0x3F,
+ 0x39, 0x97, 0x75, 0xE3, 0x8D, 0x51, 0xA8, 0x0A, 0xA4, 0x9C, 0x1F, 0x73, 0x91, 0x8F, 0x8A, 0x9D,
+ 0x17, 0x7C, 0x43, 0x33, 0x1C, 0xE8, 0x29, 0x73, 0xA2, 0x3D, 0x2C, 0x43, 0x07, 0x9B, 0x6D, 0xB2,
+ 0x7F, 0x4E, 0x16, 0x6D, 0x94, 0x5D, 0x3F, 0xC4, 0x0E, 0xEF, 0xEB, 0x0F, 0x71, 0x04, 0x2F, 0x99,
+ 0xCD, 0x50, 0x81, 0x23, 0x2A, 0x9C, 0xB0, 0x74, 0x63, 0x94, 0x8E, 0x41, 0x29, 0x93, 0x2B, 0x20,
+ 0x8B, 0xC8, 0x75, 0x34, 0xEB, 0x11, 0x4C, 0x4F, 0xDA, 0x1A, 0x8B, 0xE5, 0x87, 0xA6, 0xB0, 0x57,
+ 0xE2, 0x3F, 0x58, 0x68, 0xA3, 0xC0, 0x2E, 0x48, 0x92, 0x4B, 0x9A, 0xE1, 0xFD, 0xF3, 0x22, 0x66,
+ 0x8B, 0xF6, 0xCA, 0x10, 0xBA, 0x83, 0x0C, 0x50, 0x68, 0x73, 0xD0, 0x21, 0x06, 0x2E, 0xAD, 0x68,
+ 0x2F, 0x11, 0x1E, 0x31, 0x38, 0x8D, 0xCF, 0x3E, 0xD7, 0x68, 0x08, 0xE3, 0xD2, 0x47, 0x7B, 0x71,
+ 0x68, 0xF6, 0x4F, 0x11, 0x36, 0x97, 0xD9, 0x2A, 0xCF, 0x87, 0x0A, 0xCB, 0x5E, 0xE7, 0x1C, 0x1B,
+ 0x02, 0x7F, 0x58, 0x4F, 0x16, 0x3E, 0x5E, 0x28, 0x9E, 0xB4, 0x3B, 0x20, 0x5C, 0x9B, 0x6D, 0x25,
+ 0x4B, 0x72, 0xE1, 0xA5, 0x38, 0xC1, 0x7F, 0x69, 0x0A, 0x60, 0x42, 0xAB, 0x24, 0x86, 0x09, 0xAA,
+ 0x5D, 0x9E, 0x65, 0xF8, 0xC7, 0x6A, 0xCD, 0x31, 0x14, 0xBC, 0xC0, 0x45, 0x80, 0x68, 0x09, 0xA2,
+ 0x77, 0xD6, 0x4B, 0x95, 0xD4, 0xF4, 0x58, 0xF0, 0xAB, 0x2F, 0x79, 0x77, 0x59, 0x74, 0x38, 0xD5,
+ 0x69, 0xB8, 0x77, 0x32, 0x92, 0x2A, 0x49, 0x96, 0xBE, 0x40, 0x31, 0x4F, 0xC5, 0xCD, 0x9B, 0xA1,
+ 0xD6, 0xB9, 0xCE, 0xF6, 0x4B, 0x01, 0x87, 0xE1, 0x0E, 0x55, 0x40, 0x13, 0xE5, 0x42, 0x01, 0xC8,
+ 0x78, 0x90, 0x6F, 0xA9, 0x5B, 0x65, 0x79, 0xA0, 0x84, 0x85, 0x3B, 0x42, 0x73, 0x2D, 0x7C, 0xBA,
+ 0x2B, 0x7F, 0x19, 0xEB, 0x8D, 0x9D, 0x82, 0xA6, 0xE5, 0x10, 0x0A, 0x5A, 0xAB, 0xA1, 0x1B, 0xD8,
+ 0x87, 0xAB, 0xC5, 0x70, 0x78, 0xC1, 0xBC, 0xF6, 0x5C, 0xFC, 0x60, 0x69, 0x5A, 0xD7, 0xE1, 0x20,
+ 0x50, 0xCB, 0xDD, 0x55, 0x1E, 0x80, 0x1F, 0x0A, 0x97, 0x65, 0x86, 0x02, 0xD4, 0x6C, 0x2E, 0x08,
+ 0xB8, 0xB0, 0x26, 0x78, 0xB9, 0xB3, 0x6D, 0x57, 0x9E, 0x21, 0x37, 0x01, 0xDB, 0xEF, 0x49, 0x4D,
+ 0x66, 0xE0, 0x7C, 0xCB, 0xCC, 0xD9, 0xAC, 0xEE, 0xF2, 0xCE, 0xA5, 0x8E, 0x15, 0x4F, 0x1C, 0x83,
+ 0x3C, 0xC8, 0xD0, 0x88, 0x7E, 0x66, 0xCE, 0xA9, 0xBA, 0x32, 0x97, 0x15, 0x5F, 0x8B, 0xBC, 0x9E,
+ 0x1C, 0x14, 0x55, 0x9A, 0xBC, 0x4E, 0x4A, 0x6B, 0xB0, 0xE0, 0xF0, 0xDB, 0x3A, 0x64, 0x14, 0x75,
+ 0xAC, 0x14, 0x36, 0xE8, 0x6A, 0xB0, 0x3D, 0x7E, 0xD9, 0xB4, 0x2B, 0x1F, 0xE9, 0x50, 0xB1, 0x7C,
+ 0x18, 0x05, 0xA6, 0xE2, 0x44, 0xF3, 0xCE, 0xE6, 0x4C, 0x21, 0x9E, 0x69, 0xAA, 0x22, 0x7E, 0xE2,
+ 0x35, 0x76, 0x3A, 0xAE, 0x6E, 0x4E, 0x72, 0x25, 0xB5, 0x4D, 0xA4, 0xF7, 0x47, 0x82, 0x9C, 0xD5,
+ 0xA0, 0x08, 0x53, 0x17, 0x74, 0xB5, 0xB4, 0xA2, 0x6F, 0x10, 0x40, 0x62, 0x47, 0xB9, 0xCE, 0x00,
+ 0xC8, 0x68, 0x94, 0x9F, 0xD6, 0x7C, 0x0D, 0xD5, 0xB7, 0x8A, 0x13, 0xDE, 0x8C, 0x5B, 0x0B, 0x33,
+ 0xB7, 0x15, 0xD5, 0x43, 0xAE, 0xC0, 0x87, 0x0A, 0x13, 0xF3, 0xB5, 0x1C, 0x00, 0xC7, 0xA4, 0x36,
+ 0x05, 0xE4, 0xFF, 0xE2, 0x18, 0x6E, 0xF5, 0xF9, 0x0D, 0xDE, 0xDA, 0x4D, 0xC6, 0x1B, 0x0D, 0x89,
+ 0xD7, 0xD5, 0x5E, 0x84, 0xDA, 0xC2, 0xAF, 0x42, 0x2D, 0x89, 0xD3, 0x69, 0x38, 0x25, 0xDB, 0xE0,
+ 0xC3, 0x17, 0xCF, 0x3A, 0xB1, 0x8F, 0x60, 0x74, 0xC4, 0x3C, 0x20, 0x1B, 0xE3, 0x0C, 0x91, 0x93,
+ 0xDC, 0xCB, 0x39, 0x45, 0x0E, 0xB3, 0x78, 0x52, 0xBF, 0x6A, 0x79, 0x10, 0x93, 0x67, 0x25, 0x87,
+ 0xD7, 0xA6, 0x55, 0xEB, 0xC0, 0xE2, 0x04, 0x43, 0xF9, 0x25, 0x3B, 0x10, 0x95, 0xEF, 0xD5, 0x34,
+ 0xB0, 0xA6, 0x67, 0x24, 0x26, 0x94, 0x71, 0x4C, 0xA5, 0x7F, 0x4E, 0xAC, 0xA7, 0x58, 0x89, 0xA1,
+ 0x47, 0x47, 0x76, 0x17, 0xC0, 0x79, 0x21, 0xFE, 0x53, 0xB8, 0x55, 0xC3, 0x73, 0xF7, 0x07, 0x4C,
+ 0x76, 0xEE, 0x45, 0x92, 0x72, 0x75, 0x07, 0xAE, 0x18, 0x44, 0xC0, 0x96, 0x20, 0x9F, 0xE6, 0x54,
+ 0x04, 0xEE, 0x16, 0xBA, 0x4B, 0x29, 0xA9, 0x27, 0x35, 0xBE, 0x58, 0xA6, 0x32, 0x00, 0xEE, 0x7C,
+ 0x8D, 0x3F, 0x4D, 0xB2, 0x1D, 0xB2, 0x0C, 0x6D, 0xC9, 0xFE, 0x26, 0x92, 0xCF, 0x50, 0xD8, 0x0F,
+ 0x27, 0x00, 0xDA, 0x4A, 0xB6, 0xD5, 0xD7, 0x03, 0x8E, 0x09, 0xCA, 0x9D, 0xA8, 0xC0, 0x95, 0x6D,
+ 0x7E, 0xC8, 0x36, 0x43, 0x9C, 0x41, 0x30, 0x92, 0xC6, 0x97, 0x0D, 0x6C, 0x87, 0x9F, 0xBC, 0x41,
+ 0x72, 0x83, 0x6F, 0x7E, 0xCA, 0x29, 0x9B, 0x9B, 0x43, 0x7F, 0x1A, 0x1B, 0xE3, 0xEF, 0x48, 0x3B,
+ 0x22, 0x3F, 0x18, 0xDA, 0x3B, 0xE6, 0xE0, 0x10, 0xCA, 0xD4, 0x0E, 0xAF, 0x56, 0xD4, 0x17, 0x20,
+ 0xD8, 0x80, 0xB7, 0xCF, 0xB1, 0xE5, 0x3B, 0xE8, 0x9A, 0x5F, 0xD0, 0x16, 0x44, 0xEE, 0x3A, 0x8B,
+ 0xB3, 0x23, 0x75, 0x1F, 0xBD, 0xDF, 0xE1, 0xF0, 0xFD, 0xB9, 0xEB, 0x21, 0x49, 0x16, 0x00, 0xEE,
+ 0xFD, 0x87, 0x45, 0x97, 0x45, 0x68, 0xDA, 0x57, 0x01, 0x60, 0x33, 0x1A, 0x01, 0x43, 0xB2, 0x1C,
+ 0xB7, 0xA6, 0xCD, 0x67, 0xFD, 0x38, 0x00, 0x44, 0x04, 0xFD, 0xA4, 0x35, 0x63, 0x58, 0x79, 0x47,
+ 0x6A, 0x1B, 0x6F, 0x65, 0x7A, 0x49, 0x2E, 0xA4, 0xCE, 0xEE, 0x44, 0x78, 0xA7, 0xCB, 0x0C, 0xF1,
+ 0x9E, 0x8B, 0x3E, 0xC8, 0x4E, 0xDA, 0x4F, 0x90, 0xF6, 0xA6, 0x38, 0x1C, 0x14, 0x64, 0x21, 0x16,
+ 0x7C, 0x09, 0xAA, 0x52, 0x03, 0xC7, 0xBE, 0x62, 0x9E, 0xBD, 0xC6, 0x3F, 0x6A, 0x0A, 0x79, 0x24,
+ 0xFD, 0x00, 0xDF, 0xCB, 0x9E, 0xC9, 0x8D, 0x56, 0xC6, 0x58, 0x81, 0x78, 0xCD, 0xA6, 0x36, 0x63,
+ 0xE4, 0x78, 0x2F, 0xC8, 0xAF, 0x6E, 0xD5, 0xB4, 0xDD, 0x31, 0xE4, 0x84, 0x33, 0x4E, 0x6F, 0x4D,
+ 0xE1, 0xD2, 0x87, 0x2A, 0xE3, 0xBA, 0x11, 0xBC, 0x0A, 0x4E, 0x28, 0xC9, 0x8B, 0x50, 0x6E, 0xCF,
+ 0x55, 0x06, 0x63, 0x89, 0x6B, 0x45, 0x83, 0x36, 0x08, 0xA2, 0x67, 0x61, 0xBB, 0x72, 0x2F, 0xD1,
+ 0xA4, 0x45, 0xD7, 0x1C, 0x1A, 0x76, 0x47, 0x43, 0xED, 0x72, 0xA7, 0x68, 0x2F, 0xEA, 0xCB, 0x04,
+ 0xD0, 0x70, 0x00, 0xE9, 0xB5, 0xCA, 0xF0, 0x47, 0x5E, 0x5C, 0x28, 0x5E, 0x03, 0x88, 0xB4, 0xD6,
+ 0x52, 0x6A, 0xFE, 0xFF, 0x88, 0x9C, 0x2B, 0x32, 0xD1, 0x3D, 0x9E, 0x4F, 0xD3, 0xD4, 0xA7, 0xE1,
+ 0xB6, 0xB9, 0x89, 0xE7, 0xE2, 0xF7, 0xBC, 0x57, 0xD7, 0xC4, 0x20, 0xFB, 0x91, 0xC0, 0x87, 0x5E,
+ 0xC4, 0x4F, 0xB7, 0x0B, 0xD4, 0x34, 0x30, 0xAC, 0x02, 0x1F, 0xC7, 0x7A, 0xBE, 0x64, 0x25, 0x34,
+ 0x92, 0x12, 0x22, 0x66, 0xB5, 0x81, 0x7F, 0x6E, 0x89, 0xA6, 0x49, 0x07, 0xFA, 0xA6, 0x14, 0x80,
+ 0x7A, 0x5D, 0x4D, 0x06, 0x9D, 0x57, 0x17, 0x82, 0x1B, 0x70, 0xBE, 0xFA, 0x50, 0x1A, 0x5E, 0x7B,
+ 0x48, 0x11, 0xF8, 0x2F, 0xFD, 0xC0, 0xE4, 0x75, 0x57, 0xCD, 0x81, 0x57, 0xDA, 0x84, 0x1A, 0x92,
+ 0x18, 0x40, 0x8A, 0xC3, 0x66, 0xCC, 0xE0, 0x93, 0x8A, 0x19, 0x30, 0x2F, 0xD5, 0x9A, 0xAD, 0x24,
+ 0x8A, 0x39, 0x03, 0x45, 0xCF, 0x8E, 0xF9, 0x8C, 0x8D, 0xE1, 0x29, 0x2D, 0xDD, 0xB6, 0xA0, 0x33,
+ 0xCD, 0x75, 0x99, 0x27, 0xBA, 0x20, 0x10, 0x6C, 0xEE, 0xC5, 0xFE, 0xDB, 0x86, 0x53, 0xD6, 0xCE,
+ 0x48, 0x24, 0xEF, 0xB3, 0x27, 0x99, 0xFC, 0x51, 0x25, 0x52, 0x76, 0x6F, 0xCD, 0x75, 0x68, 0x7E,
+ 0xD2, 0xC8, 0xB7, 0x82, 0x55, 0x5D, 0x2F, 0x30, 0xD0, 0xBF, 0x0C, 0xC6, 0xD6, 0xAB, 0xC8, 0x3A,
+ 0x48, 0x76, 0x26, 0x24, 0x08, 0xBF, 0x44, 0xA2, 0x27, 0xC8, 0x3F, 0xE7, 0xD8, 0xBB, 0xD5, 0xED,
+ 0x5D, 0xE4, 0xFE, 0x94, 0x9F, 0xE0, 0x13, 0xFC, 0x1B, 0xB8, 0x0D, 0xED, 0x68, 0x33, 0xE5, 0x38,
+ 0xFC, 0x7C, 0x05, 0xB1, 0x74, 0xEA, 0x8E, 0xA2, 0x2F, 0x53, 0x5B, 0x9D, 0xD3, 0x53, 0x55, 0x18,
+ 0x01, 0x4C, 0xFE, 0x84, 0x00, 0xF7, 0x66, 0x11, 0x4E, 0xEF, 0x45, 0xF1, 0xAE, 0xCF, 0x6B, 0x5C,
+ 0x40, 0x76, 0x8B, 0xE3, 0xE0, 0x3F, 0x10, 0x14, 0x07, 0x22, 0x9C, 0xBD, 0xE0, 0xFF, 0x56, 0x2F,
+ 0x62, 0xEA, 0x50, 0x50, 0xF6, 0x73, 0xA9, 0x2D, 0x3D, 0xED, 0x2B, 0x1A, 0x10, 0xB8, 0xAC, 0x07,
+ 0x69, 0xB0, 0x7D, 0x42, 0x9A, 0x58, 0x18, 0xA9, 0x87, 0x04, 0x63, 0xE0, 0x64, 0x81, 0x9B, 0x17,
+ 0xB1, 0x42, 0x36, 0x00, 0xA1, 0xA9, 0x1C, 0x9F, 0x03, 0xC2, 0x6E, 0xB8, 0x40, 0xC4, 0xB1, 0x40,
+ 0xDB, 0x45, 0xD3, 0x47, 0xB6, 0x1A, 0x55, 0xB0, 0x91, 0x6B, 0xAE, 0xE4, 0x8C, 0x75, 0x9F, 0x6A,
+ 0x1F, 0xFA, 0xD2, 0x4B, 0x7B, 0x34, 0xE3, 0xAC, 0x77, 0x66, 0x1E, 0x88, 0x2A, 0x89, 0x2E, 0x19,
+ 0xF3, 0x21, 0xC5, 0xEA, 0x09, 0x99, 0xB2, 0x30, 0x9F, 0xA5, 0x6B, 0x75, 0xF0, 0xE8, 0xCB, 0x9F,
+ 0xB0, 0x3E, 0x17, 0x59, 0x10, 0xDD, 0x0B, 0xA7, 0x97, 0xB4, 0x7E, 0x68, 0x26, 0x46, 0xE8, 0xA4,
+ 0x88, 0x4B, 0x0C, 0xE8, 0x5F, 0x4A, 0x2F, 0x67, 0xFE, 0x70, 0x33, 0xA4, 0x55, 0x35, 0xC3, 0x85,
+ 0x20, 0xBC, 0x12, 0x18, 0x85, 0x6B, 0x8D, 0x53, 0x70, 0x1F, 0xF3, 0x8E, 0x1A, 0x56, 0x6F, 0x2E,
+ 0xAD, 0xC9, 0x67, 0x00, 0x28, 0x11, 0x72, 0x2D, 0xAF, 0x8D, 0x45, 0xC3, 0x86, 0xC7, 0xE9, 0xA8,
+ 0xC0, 0xBB, 0x26, 0x97, 0xD5, 0xE4, 0xB7, 0xCF, 0x57, 0x01, 0x00, 0x1E, 0xBF, 0x11, 0xE2, 0xE4,
+ 0x1E, 0x4D, 0xB6, 0x52, 0xC6, 0x69, 0xDE, 0xA0, 0x3A, 0xD6, 0x97, 0x38, 0x63, 0x39, 0x60, 0x17,
+ 0xAC, 0xD6, 0xED, 0xFB, 0x10, 0xA9, 0xE0, 0x5E, 0x6D, 0x43, 0xC2, 0x24, 0xA8, 0xAC, 0xB8, 0xC5,
+ 0xE1, 0xF5, 0xBD, 0x4B, 0x89, 0x47, 0x50, 0x9F, 0x02, 0xB4, 0x40, 0xB1, 0xFA, 0xCD, 0x48, 0x52,
+ 0x68, 0xE5, 0x25, 0xE0, 0x74, 0xA2, 0x64, 0xC4, 0x7B, 0xE5, 0xF1, 0x61, 0x21, 0xA6, 0x39, 0x42,
+ 0x26, 0xC1, 0x87, 0x1F, 0x6F, 0x3D, 0x68, 0x96, 0xC4, 0x74, 0xCD, 0x5E, 0xEE, 0x43, 0x6F, 0x99,
+ 0x91, 0x1D, 0x30, 0x97, 0xBA, 0x7E, 0xA5, 0xA6, 0x08, 0x3B, 0x8D, 0x40, 0x61, 0xAF, 0x1B, 0xA2,
+ 0x37, 0x63, 0x48, 0xD1, 0x70, 0xF6, 0xFC, 0x6A, 0xDF, 0x09, 0x82, 0x4E, 0x00, 0xD6, 0xAA, 0x31,
+ 0x76, 0x98, 0x24, 0x78, 0xE3, 0x18, 0x91, 0xF6, 0x88, 0x3E, 0xA8, 0x54, 0xA1, 0x3F, 0xAD, 0xE1,
+ 0x67, 0xCE, 0x3E, 0x9E, 0x82, 0x62, 0x99, 0x18, 0xF8, 0x40, 0x60, 0x22, 0x92, 0x55, 0xF6, 0xA1,
+ 0x6D, 0x80, 0x69, 0xB9, 0x77, 0x40, 0xBA, 0xAC, 0x3C, 0x31, 0x32, 0xAA, 0xE8, 0x09, 0x26, 0x64,
+ 0x2B, 0xE7, 0x6D, 0x19, 0x31, 0xF3, 0x88, 0xFF, 0x45, 0xF2, 0xA9, 0xD7, 0xBF, 0xDA, 0x50, 0x33,
+ 0xD7, 0x83, 0x55, 0x08, 0xCA, 0xFE, 0xF6, 0x3B, 0x2A, 0x5A, 0xC4, 0xBD, 0x26, 0x35, 0xF5, 0x9D,
+ 0xE8, 0xA8, 0xFE, 0x9C, 0x43, 0x0F, 0x2C, 0xFD, 0x33, 0x81, 0x08, 0x11, 0x4D, 0xE6, 0x5B, 0xB1,
+ 0x96, 0xE7, 0x3A, 0x83, 0xCB, 0xEF, 0x18, 0xDE, 0xF8, 0x5B, 0x09, 0x4D, 0x61, 0x3D, 0xB5, 0xB7,
+ 0xE4, 0xC9, 0x73, 0xFE, 0x5C, 0xD3, 0x57, 0x4F, 0x46, 0x6F, 0x42, 0x56, 0x85, 0xC1, 0x4A, 0x8A,
+ 0xD8, 0x61, 0xA3, 0x15, 0x49, 0x66, 0xA6, 0x1C, 0xC0, 0x1F, 0xB7, 0xA9, 0x88, 0x06, 0xA4, 0x2F,
+ 0xE4, 0x9A, 0xCC, 0x38, 0xE0, 0x90, 0x64, 0xB6, 0x0F, 0xE5, 0xAE, 0xB5, 0x87, 0x64, 0x1C, 0x42,
+ 0x5C, 0x11, 0x01, 0xB5, 0xC2, 0x90, 0x3D, 0xAB, 0x26, 0x4B, 0x2A, 0x67, 0x9F, 0x5B, 0x5B, 0xE3,
+ 0x21, 0xA0, 0xB9, 0x7D, 0x64, 0xD3, 0xF8, 0xB3, 0x77, 0x91, 0x2D, 0x34, 0x78, 0x8E, 0xB8, 0x1D,
+ 0x30, 0x4B, 0xE1, 0x31, 0xFE, 0x3D, 0xE6, 0xAB, 0xDA, 0xA6, 0xB4, 0xDF, 0xB0, 0x67, 0x25, 0x57,
+ 0x4A, 0x30, 0x8F, 0x86, 0x58, 0x13, 0xE6, 0xEA, 0xEE, 0x91, 0x86, 0xD2, 0x0D, 0xCD, 0x19, 0xDC,
+ 0x26, 0x18, 0x86, 0x52, 0xD2, 0x77, 0x79, 0x31, 0xDA, 0xF9, 0x9A, 0xCA, 0x7B, 0xBE, 0xF6, 0x96,
+ 0x61, 0xAE, 0x32, 0xC8, 0x68, 0x17, 0xFF, 0xB8, 0xF4, 0xF5, 0xE5, 0xA4, 0x20, 0xC9, 0x44, 0x8A,
+ 0xD6, 0x8D, 0xB0, 0x0D, 0x3D, 0x2B, 0x47, 0x4B, 0xA5, 0x49, 0x37, 0x11, 0x18, 0x2C, 0x94, 0x37,
+ 0xEB, 0x7D, 0xD6, 0x49, 0x59, 0xFD, 0x75, 0xC7, 0x6C, 0x11, 0x83, 0xBD, 0x92, 0xF4, 0xA0, 0xFD,
+ 0x5D, 0x2D, 0x24, 0x42, 0x8D, 0x3E, 0x96, 0xDA, 0x4B, 0xCD, 0x85, 0xDA, 0xF4, 0x11, 0x27, 0x0F,
+ 0x5B, 0xE1, 0xB4, 0x62, 0x51, 0xC6, 0x04, 0x22, 0xCD, 0x8D, 0x3D, 0x26, 0x59, 0xC9, 0xF3, 0xBF,
+ 0xBD, 0x07, 0xEB, 0x3D, 0xDD, 0x41, 0x3A, 0xAE, 0x35, 0xB6, 0x9C, 0x76, 0xE6, 0xE9, 0x5E, 0x98,
+ 0xF6, 0x9F, 0x9B, 0x6D, 0x9A, 0x0F, 0xF3, 0xA2, 0x5E, 0xD0, 0x37, 0x0F, 0xA7, 0xB9, 0xC1, 0xC2,
+ 0xFF, 0x26, 0x59, 0x51, 0xC6, 0x27, 0x15, 0x25, 0xFD, 0x8E, 0xA0, 0xAA, 0x72, 0xD4, 0xA8, 0x13,
+ 0x61, 0xE0, 0x4C, 0xD0, 0xD2, 0xCA, 0xA8, 0x85, 0x98, 0x95, 0x26, 0x68, 0x7A, 0x1D, 0xBC, 0x6D,
+ 0x87, 0xF8, 0x8C, 0xEC, 0x31, 0xA7, 0x8E, 0x98, 0x1C, 0xEC, 0x51, 0xCA, 0xF7, 0x38, 0x5A, 0x03,
+ 0xF1, 0x7B, 0x84, 0x9D, 0x96, 0x75, 0x30, 0x96, 0x92, 0xDD, 0x4F, 0xCD, 0xD8, 0x00, 0xA0, 0xAB,
+ 0x7B, 0x52, 0x42, 0x2F, 0x0A, 0x9F, 0x28, 0x18, 0x12, 0xD7, 0x47, 0xF5, 0x83, 0xB4, 0x27, 0xA6,
+ 0x5D, 0x8C, 0xB1, 0xD7, 0xC2, 0xB5, 0x3F, 0xCC, 0x31, 0xCA, 0x7C, 0xB5, 0xB5, 0x37, 0xAA, 0xCB,
+ 0xA5, 0x8A, 0x2D, 0x21, 0x72, 0x24, 0xCE, 0xD6, 0x05, 0xDA, 0x32, 0x2A, 0xA9, 0x92, 0x57, 0x07,
+ 0x24, 0x7C, 0x53, 0x92, 0xBA, 0x4A, 0x3D, 0xF8, 0xA9, 0xCB, 0xEC, 0x7A, 0x34, 0x4A, 0xFD, 0x2E,
+ 0x3D, 0x22, 0xA1, 0x8B, 0xC4, 0x8B, 0x39, 0x8F, 0x11, 0x8E, 0x75, 0x85, 0xB3, 0x1C, 0xB3, 0x2E,
+ 0x5B, 0xF6, 0xF7, 0x03, 0x88, 0x11, 0x14, 0x7A, 0x42, 0xDA, 0x25, 0x0C, 0xAD, 0x88, 0xE7, 0xC9,
+ 0xE6, 0x90, 0x65, 0x13, 0x2B, 0x40, 0x20, 0xC3, 0x03, 0xCC, 0x38, 0x71, 0x5C, 0x32, 0x54, 0xFE,
+ 0x42, 0x2A, 0xC8, 0x4D, 0xDB, 0x4F, 0x0F, 0x9D, 0x53, 0xEA, 0xBE, 0xA8, 0x84, 0x87, 0x63, 0x8F,
+ 0xC7, 0xC5, 0xC7, 0xD9, 0x41, 0xDF, 0x53, 0x72, 0x50, 0x61, 0x9A, 0x81, 0x6B, 0x70, 0x6F, 0xE4,
+ 0x98, 0xBB, 0x46, 0xEF, 0x24, 0xA6, 0xA0, 0xCB, 0x49, 0x05, 0x13, 0xA6, 0xC2, 0x1F, 0x2D, 0x1A,
+ 0x2B, 0xBD, 0xA9, 0x97, 0xB4, 0xEC, 0x6C, 0x0C, 0x1C, 0xA1, 0x9E, 0xDB, 0x5E, 0x55, 0x95, 0xE0,
+ 0xE1, 0xC5, 0x4E, 0x97, 0x89, 0x69, 0xDA, 0xB6, 0x5C, 0xAA, 0xF2, 0x96, 0x28, 0x7A, 0xCB, 0xA9,
+ 0xCE, 0x46, 0x5E, 0x07, 0xFE, 0x73, 0x4F, 0x2C, 0x46, 0xAF, 0xFB, 0x2F, 0xC5, 0xD1, 0xB6, 0xB2,
+ 0x85, 0x65, 0x1C, 0x7F, 0x72, 0xBC, 0xF9, 0x51, 0x1B, 0x02, 0xAE, 0x6A, 0x46, 0xB5, 0x39, 0x1A,
+ 0x8D, 0x34, 0x84, 0x40, 0xE5, 0x1B, 0x91, 0x11, 0xE9, 0x42, 0x44, 0x56, 0x64, 0x01, 0xF5, 0xC0,
+ 0x7D, 0x64, 0x37, 0x72, 0xA4, 0x7A, 0xE5, 0xD6, 0x19, 0xA6, 0xDB, 0x78, 0x23, 0x47, 0x68, 0xE5,
+ 0x8D, 0x7D, 0x8C, 0xE5, 0x63, 0xF3, 0x3E, 0x07, 0xEE, 0x4E, 0x8D, 0xF1, 0x56, 0x37, 0xA4, 0x27,
+ 0xDC, 0x67, 0x45, 0x84, 0x41, 0x89, 0xD2, 0x77, 0x67, 0x3C, 0x76, 0x27, 0x6B, 0x8B, 0xD2, 0x65,
+ 0x6A, 0x65, 0x2B, 0xB1, 0xA6, 0x73, 0x3F, 0xD2, 0xC6, 0x78, 0x5D, 0xF9, 0xDA, 0xBD, 0x8B, 0x9F,
+ 0xC0, 0x5B, 0xF2, 0xF4, 0xA6, 0x46, 0xF4, 0x5A, 0xCD, 0xDC, 0x40, 0x0E, 0x48, 0x28, 0xA2, 0x98,
+ 0x87, 0xE7, 0x4F, 0x46, 0xD4, 0x6E, 0xFB, 0x6F, 0x11, 0xC5, 0x85, 0xCF, 0xDF, 0xA9, 0xBB, 0xE1,
+ 0x61, 0x80, 0x41, 0xFC, 0x69, 0x8F, 0xD7, 0xDD, 0xD9, 0x8B, 0x63, 0xE2, 0x60, 0x1A, 0x0A, 0xFF,
+ 0x56, 0x85, 0x6C, 0x4C, 0x0D, 0x19, 0x9E, 0xE1, 0xCB, 0xF3, 0xEB, 0x9C, 0xBF, 0x11, 0x4A, 0x0B,
+ 0x23, 0xFD, 0x88, 0x93, 0x1A, 0x8B, 0xA2, 0x68, 0xD2, 0x07, 0x90, 0x11, 0xC6, 0x3D, 0xEF, 0x2C,
+ 0x3C, 0x02, 0x41, 0x1F, 0x41, 0x93, 0x2B, 0x83, 0xAB, 0x2D, 0x35, 0xA4, 0x6E, 0xD7, 0x36, 0x51,
+ 0x09, 0x7C, 0x23, 0x4F, 0xAD, 0xF8, 0x38, 0xF0, 0x1D, 0x98, 0x2E, 0xEA, 0x20, 0xAF, 0x10, 0x9B,
+ 0x03, 0x96, 0xE0, 0x68, 0xCB, 0x01, 0xC2, 0xAF, 0x4B, 0x70, 0xB0, 0x6F, 0xB6, 0xBC, 0x71, 0xA8,
+ 0x57, 0x32, 0x26, 0x98, 0x23, 0xAD, 0xC6, 0x07, 0xE8, 0xDF, 0xB6, 0xC8, 0x83, 0xF6, 0x17, 0xFD,
+ 0x4C, 0xDA, 0xB7, 0x1D, 0xA4, 0x92, 0xCE, 0xAD, 0x4B, 0xB8, 0xD2, 0xBB, 0xC4, 0x2E, 0x9C, 0xE3,
+ 0x40, 0x31, 0xF1, 0xF8, 0x1A, 0xC7, 0x55, 0x99, 0x08, 0xAE, 0xFF, 0xD1, 0x39, 0x74, 0x4F, 0x87,
+ 0x6A, 0x26, 0xBC, 0x36, 0x5D, 0x2C, 0x25, 0x53, 0x0B, 0x18, 0x15, 0x7F, 0xA3, 0x2A, 0x45, 0xC4,
+ 0x9A, 0xE2, 0xEF, 0xDC, 0xDC, 0xF1, 0x9D, 0xE9, 0x5E, 0xD9, 0xD5, 0x54, 0x89, 0x6D, 0x5A, 0xCE,
+ 0x8D, 0x22, 0x16, 0xF1, 0xD7, 0x36, 0xB9, 0x9A, 0xB0, 0xF4, 0xCD, 0xEF, 0xE6, 0x0C, 0x3A, 0x5D,
+ 0x09, 0x22, 0xF6, 0x45, 0xD7, 0x02, 0x55, 0x01, 0x02, 0x7A, 0x4F, 0xBB, 0x22, 0x6A, 0x87, 0x66,
+ 0x62, 0xD0, 0x1D, 0x54, 0x72, 0xB2, 0xD8, 0x0A, 0x7E, 0x60, 0xC1, 0x1D, 0x68, 0xEA, 0xFB, 0x6A,
+ 0xE3, 0x5F, 0x97, 0xC5, 0xFD, 0xEB, 0x08, 0x2C, 0x50, 0x96, 0xB8, 0xC1, 0x9D, 0x5E, 0x1E, 0x3E,
+ 0x46, 0xA6, 0x49, 0x57, 0xC8, 0xBD, 0xB1, 0xD6, 0xD5, 0x21, 0x2A, 0x03, 0x84, 0x65, 0x24, 0x11,
+ 0xB0, 0xF0, 0x0F, 0xF4, 0x04, 0x52, 0x43, 0xBA, 0xEA, 0x93, 0xBA, 0x9F, 0x34, 0x26, 0x1F, 0xD7,
+ 0x1F, 0x7B, 0xC0, 0x30, 0x01, 0x69, 0x68, 0x9B, 0x21, 0x13, 0xA5, 0xD4, 0x87, 0x30, 0xDC, 0xEB,
+ 0x35, 0x39, 0x76, 0x35, 0xB9, 0xE3, 0xDF, 0xCD, 0xB5, 0xE5, 0x89, 0xEA, 0x54, 0x1F, 0x3E, 0xDB,
+ 0x90, 0xCF, 0x5C, 0x4A, 0x96, 0x97, 0x32, 0x3F, 0x6F, 0xB4, 0xE5, 0x28, 0xDF, 0xE4, 0xCA, 0xB1,
+ 0x1B, 0x78, 0x65, 0x2C, 0x99, 0x3D, 0x77, 0x32, 0x5F, 0x6C, 0x6D, 0xD3, 0x53, 0x67, 0x15, 0x39,
+ 0xFD, 0xE1, 0x2A, 0xB0, 0x48, 0x24, 0x4D, 0x36, 0x4D, 0x90, 0x9F, 0xF3, 0x1D, 0x4F, 0x9D, 0x3B,
+ 0xBE, 0x64, 0xFE, 0xF0, 0xF2, 0xAE, 0x31, 0xB2, 0xBE, 0x35, 0x8E, 0x34, 0xD6, 0x56, 0xAB, 0xF2,
+ 0x45, 0xC4, 0x37, 0x65, 0xA0, 0x08, 0x66, 0x5D, 0x9F, 0x0D, 0x96, 0x0B, 0x58, 0xC2, 0x18, 0x00,
+ 0x43, 0xBA, 0xC4, 0xFE, 0xD3, 0x6C, 0x96, 0x78, 0xAE, 0x10, 0x2D, 0x86, 0x4D, 0x8F, 0x87, 0x44,
+ 0xCF, 0x8E, 0x1D, 0x23, 0x00, 0x8D, 0x8A, 0x91, 0x28, 0xDE, 0x13, 0xF1, 0x2B, 0xBC, 0x75, 0x32,
+ 0xB3, 0x50, 0xDB, 0xD3, 0x5A, 0xA5, 0x2A, 0x28, 0x82, 0x70, 0x4B, 0xF9, 0x77, 0x70, 0xC5, 0x5D,
+ 0x4A, 0x52, 0x43, 0x4C, 0x1D, 0x6E, 0xB5, 0x6A, 0x41, 0x65, 0xFF, 0xF2, 0x67, 0xC2, 0x86, 0x85,
+ 0x0C, 0x95, 0x25, 0xAB, 0x61, 0x3E, 0x79, 0x0A, 0x2F, 0x3F, 0xBB, 0x4A, 0xC7, 0x33, 0xEE, 0x2E,
+ 0x04, 0xD6, 0x44, 0xCE, 0x40, 0xB9, 0xFA, 0xF4, 0x8A, 0x7B, 0xA2, 0xE0, 0x43, 0xFE, 0x80, 0x88,
+ 0xA5, 0xB1, 0x47, 0x51, 0xFF, 0x48, 0xE4, 0x13, 0xA1, 0x6D, 0x6D, 0x1E, 0x4F, 0x14, 0x5C, 0x32,
+ 0x05, 0x73, 0x4E, 0x1B, 0x9E, 0xB2, 0xEB, 0xF1, 0xC7, 0x42, 0x84, 0x3A, 0xAA, 0xE0, 0x6D, 0xEC,
+ 0x3E, 0x79, 0x60, 0x00, 0x36, 0x01, 0x2F, 0xBC, 0xB7, 0x82, 0x03, 0x6D, 0x26, 0x6F, 0x28, 0x6E,
+ 0x4C, 0xB7, 0xD7, 0x93, 0xCB, 0xF2, 0xFC, 0x58, 0x2B, 0x3F, 0x5A, 0x2F, 0x88, 0x36, 0xCB, 0x7A,
+ 0xEF, 0xF2, 0xC6, 0x63, 0xC1, 0x60, 0x20, 0x71, 0x1F, 0xE4, 0xA6, 0x8A, 0x14, 0x16, 0x7D, 0x9F,
+ 0xD3, 0x83, 0x8D, 0x0C, 0x8D, 0xC4, 0x8A, 0x5D, 0x1F, 0xE2, 0x05, 0x07, 0xC7, 0x1D, 0x2B, 0x4F,
+ 0xAF, 0x20, 0x33, 0x60, 0x43, 0x6D, 0x60, 0x5F, 0xEC, 0x57, 0x2F, 0xF5, 0x8A, 0xC4, 0xC7, 0x8E,
+ 0x2B, 0x6B, 0xE8, 0xF0, 0xA2, 0x4E, 0x66, 0xBA, 0x55, 0xEF, 0x67, 0x78, 0x20, 0x70, 0x1D, 0x57,
+ 0x25, 0x1C, 0xC8, 0x0C, 0x7F, 0x1D, 0x88, 0x4D, 0x28, 0xCE, 0x90, 0xDE, 0xE5, 0xBE, 0x9B, 0xCC,
+ 0x28, 0x38, 0x52, 0xA5, 0xB4, 0xE0, 0x86, 0x7F, 0x73, 0x22, 0x75, 0x9D, 0xCA, 0x1F, 0xCB, 0x31,
+ 0x35, 0xC7, 0x55, 0xA7, 0xD2, 0xCD, 0x56, 0xC7, 0x22, 0xA6, 0xD3, 0x37, 0x02, 0x2E, 0xBE, 0x08,
+ 0x00, 0x26, 0x9A, 0x99, 0x62, 0x46, 0x1B, 0x25, 0xED, 0x6A, 0xD5, 0x61, 0x20, 0xB9, 0xDD, 0xF7,
+ 0xBE, 0xDD, 0x64, 0x5D, 0x61, 0xE5, 0x2F, 0x87, 0x81, 0x47, 0x7E, 0xC2, 0x7D, 0x45, 0xB7, 0x2A,
+ 0x0C, 0xB0, 0x0C, 0x5F, 0x4C, 0x93, 0x02, 0xEE, 0x96, 0x55, 0xAF, 0x7C, 0x06, 0xA8, 0x74, 0x64,
+ 0x61, 0x6A, 0xA1, 0x41, 0x69, 0x55, 0x63, 0x15, 0x5B, 0x50, 0xA9, 0x8A, 0xC5, 0x02, 0x3E, 0x5E,
+ 0xFF, 0x4D, 0xD7, 0xE4, 0xE0, 0x88, 0xFE, 0xB5, 0x53, 0x72, 0xA0, 0x52, 0xCE, 0x3C, 0x25, 0x98,
+ 0xFF, 0x05, 0xFC, 0xE4, 0x0C, 0x57, 0xE7, 0x4C, 0xD0, 0xEB, 0x1B, 0x4C, 0xEC, 0x89, 0xCE, 0x88,
+ 0x15, 0x6A, 0x9B, 0x7B, 0xDD, 0x0C, 0x53, 0x72, 0x0D, 0x0C, 0xD2, 0xE0, 0x6E, 0x20, 0xF5, 0x30,
+ 0xCE, 0xD2, 0xF6, 0x11, 0x0D, 0xCC, 0x85, 0x4C, 0x9A, 0xD3, 0xBF, 0xF2, 0x39, 0xFF, 0x26, 0x4F,
+ 0x4D, 0xAE, 0x25, 0x4A, 0x72, 0xD9, 0x22, 0x8B, 0xE1, 0x07, 0xA9, 0xBD, 0x53, 0x45, 0x7C, 0xEB,
+ 0xFE, 0x56, 0xAE, 0x01, 0x7F, 0x12, 0x4E, 0x18, 0xE7, 0x96, 0xB1, 0x0E, 0x9C, 0x89, 0xA8, 0xB4,
+ 0x1C, 0xDA, 0x3E, 0xFE, 0x8C, 0x1C, 0xEF, 0xB4, 0x50, 0xE5, 0x46, 0x1B, 0x56, 0xCE, 0x01, 0x53,
+ 0xB2, 0x6D, 0xB0, 0xD0, 0x8E, 0x08, 0x89, 0x2A, 0x5B, 0xC8, 0xFC, 0x9B, 0x6B, 0x4B, 0x6D, 0xDC,
+ 0x2E, 0x2E, 0x74, 0xAB, 0xE1, 0xAE, 0xA6, 0x74, 0x8F, 0x31, 0x74, 0x5F, 0x34, 0x45, 0xE4, 0x88,
+ 0xCE, 0x66, 0x24, 0xE9, 0x93, 0x68, 0x76, 0xD6, 0xB9, 0x10, 0xA9, 0xBA, 0x6A, 0x3A, 0xCD, 0xB8,
+ 0x95, 0x44, 0x7D, 0x75, 0x13, 0x64, 0x7B, 0xD2, 0x29, 0xB9, 0x3A, 0x75, 0x98, 0x26, 0xFC, 0x2B,
+ 0x46, 0x8A, 0xFD, 0x5C, 0x2B, 0xB5, 0x6C, 0x48, 0x20, 0x5F, 0xAA, 0x09, 0xAD, 0xBA, 0x7B, 0xE3,
+ 0x13, 0x55, 0x3D, 0xBD, 0x43, 0xEA, 0xC7, 0xA7, 0x3E, 0xDD, 0xF3, 0xEB, 0xBB, 0x7D, 0xFE, 0x2A,
+ 0x9B, 0xC4, 0xFB, 0x44, 0x1D, 0xD1, 0x72, 0x33, 0x88, 0x65, 0xFE, 0xE7, 0xD1, 0xD7, 0x55, 0xDC,
+ 0x2F, 0x17, 0xC0, 0x8A, 0xE2, 0xDA, 0x5E, 0xA4, 0x68, 0x9C, 0xA2, 0x5C, 0xA0, 0xE7, 0x1F, 0x02,
+ 0xFB, 0xC3, 0xEE, 0x63, 0xB7, 0xBD, 0x29, 0xEF, 0xCB, 0xA5, 0x47, 0x5A, 0x79, 0x4D, 0x5E, 0x9D,
+ 0x44, 0x5A, 0xF9, 0xC6, 0xDE, 0x0A, 0x71, 0x58, 0xB6, 0xA0, 0x02, 0xE5, 0xAA, 0x62, 0x15, 0xF4,
+ 0x39, 0x28, 0x9A, 0xF8, 0x59, 0xF1, 0x92, 0x17, 0x45, 0x27, 0x6A, 0x1D, 0x11, 0x3E, 0x08, 0xA2,
+ 0xCD, 0x31, 0x0E, 0xEE, 0xD4, 0xFC, 0xF9, 0x3C, 0x1F, 0x87, 0x00, 0xE2, 0x5F, 0xB8, 0x35, 0xBB,
+ 0xC5, 0x97, 0x32, 0xCE, 0x7F, 0x1D, 0xD6, 0x05, 0xEE, 0xD7, 0x0D, 0xB9, 0x3C, 0x6B, 0xAF, 0x23,
+ 0x0B, 0x86, 0x3C, 0x40, 0x66, 0xCD, 0x65, 0x8A, 0xF8, 0xEB, 0x6B, 0xAB, 0x2F, 0x98, 0x6C, 0x40,
+ 0x8E, 0x54, 0x90, 0xB5, 0x1C, 0x79, 0x7B, 0x83, 0x12, 0xA4, 0x0B, 0x20, 0xD5, 0x95, 0x30, 0x2C,
+ 0x8A, 0x6E, 0x94, 0xD2, 0xAB, 0x78, 0xF5, 0x71, 0x38, 0x4F, 0xB2, 0x93, 0x50, 0xDB, 0x16, 0x94,
+ 0xC4, 0xA9, 0x7D, 0x9D, 0x2F, 0x48, 0x98, 0xEB, 0x74, 0xE2, 0xD7, 0x97, 0x91, 0xBC, 0xF8, 0x90,
+ 0xAF, 0x74, 0x71, 0x38, 0x94, 0xFE, 0xA6, 0xC7, 0x89, 0x63, 0x0D, 0x9B, 0xF1, 0x81, 0x28, 0x4A,
+ 0x75, 0x85, 0x53, 0x83, 0x34, 0x99, 0xE6, 0xF4, 0xAA, 0xF4, 0xF0, 0x1D, 0x92, 0xBE, 0x12, 0x8E,
+ 0x20, 0xBF, 0xCA, 0x41, 0x30, 0x08, 0x9B, 0x47, 0xD0, 0x23, 0x45, 0x67, 0x38, 0x2B, 0x0F, 0xD3,
+ 0xBA, 0x59, 0xEB, 0x7C, 0x39, 0xCF, 0xA8, 0xB7, 0xA9, 0xEF, 0xF4, 0xC7, 0xD9, 0x1B, 0x5B, 0xC4,
+ 0xC3, 0xA3, 0x92, 0xA2, 0xF9, 0x1F, 0xC1, 0x99, 0x57, 0xE6, 0xD8, 0x22, 0xF8, 0xA5, 0xC8, 0x4B,
+ 0xCE, 0xAD, 0xBD, 0x19, 0x71, 0xC3, 0x1A, 0xEB, 0x25, 0xFD, 0xA7, 0x7F, 0xA8, 0x7A, 0xEC, 0x54,
+ 0x0A, 0x97, 0x3E, 0x85, 0x29, 0xAF, 0x85, 0xDE, 0x14, 0x10, 0x3C, 0xBD, 0x66, 0xBE, 0x59, 0xE4,
+ 0x71, 0xD8, 0x7E, 0xEA, 0xF6, 0x8A, 0x8F, 0xF1, 0x3A, 0x03, 0x41, 0x99, 0x27, 0x45, 0xB6, 0x05,
+ 0x2F, 0x6B, 0x11, 0x61, 0xB4, 0x40, 0x40, 0x3A, 0xD2, 0xE9, 0x90, 0xDD, 0x0C, 0x19, 0x3B, 0x01,
+ 0xF2, 0xA4, 0xF5, 0x3B, 0x9C, 0x18, 0x32, 0x26, 0xCB, 0xDB, 0x20, 0x5B, 0xE2, 0x43, 0x70, 0xCB,
+ 0x37, 0xA6, 0xEC, 0x34, 0x85, 0x33, 0xD6, 0x8B, 0x1F, 0x5F, 0x10, 0xCC, 0x86, 0xAB, 0x04, 0x31,
+ 0x5D, 0x07, 0xD6, 0x7C, 0x5F, 0x71, 0x08, 0xAC, 0x3F, 0x08, 0xC6, 0xCF, 0xAC, 0x50, 0xCF, 0xA2,
+ 0xFC, 0xDB, 0x02, 0x01, 0xD5, 0x33, 0x9E, 0x57, 0xDC, 0x88, 0xBC, 0x51, 0x71, 0x95, 0x9A, 0x86,
+ 0x99, 0xBB, 0xFC, 0x5A, 0x3C, 0xB8, 0xC0, 0xA5, 0x12, 0xA4, 0x26, 0x55, 0xE7, 0x8A, 0xD0, 0x6F,
+ 0x2C, 0x52, 0x21, 0xA4, 0x0A, 0xBE, 0xC9, 0xA7, 0x87, 0x4B, 0xBD, 0x47, 0x44, 0xFA, 0x7A, 0xE5,
+ 0xDF, 0x07, 0x54, 0xC8, 0xA3, 0xF3, 0x73, 0x28, 0xE5, 0x52, 0x36, 0x04, 0x42, 0xAB, 0x9C, 0x6E,
+ 0x80, 0x5B, 0x44, 0xF0, 0xA7, 0xC6, 0x00, 0xC3, 0x69, 0x14, 0xE9, 0x01, 0xD2, 0xE4, 0x69, 0x7D,
+ 0x32, 0xAC, 0x78, 0x70, 0x76, 0x81, 0x9A, 0x19, 0x7D, 0x80, 0x82, 0xB5, 0xCE, 0x11, 0xBD, 0xF1,
+ 0x15, 0x36, 0x49, 0xB1, 0x84, 0xCB, 0x15, 0x46, 0x87, 0xF4, 0x83, 0x3D, 0x82, 0x9A, 0x84, 0xB7,
+ 0x86, 0x47, 0x06, 0x72, 0xE9, 0xE5, 0xFE, 0x4C, 0x11, 0xAE, 0xD1, 0x0D, 0xA7, 0xBE, 0xFD, 0xE2,
+ 0xF7, 0xAD, 0xC2, 0x47, 0xA5, 0x72, 0x4A, 0x96, 0x38, 0xCC, 0x6B, 0xE7, 0x94, 0xA3, 0x91, 0x6B,
+ 0x3D, 0x20, 0x86, 0xA4, 0x70, 0x84, 0xDB, 0x35, 0x78, 0xC9, 0x50, 0x89, 0x57, 0xE6, 0xB1, 0xA7,
+ 0x60, 0xD7, 0x89, 0x13, 0x8C, 0x04, 0xEC, 0x19, 0x40, 0x0C, 0xFB, 0x5D, 0x73, 0xAB, 0x2B, 0x58,
+ 0xEF, 0xD2, 0x9C, 0x2C, 0x8F, 0x11, 0x5F, 0x86, 0x43, 0xD3, 0x68, 0xE3, 0x7C, 0xB6, 0x6B, 0xEF,
+ 0x88, 0xC6, 0x64, 0x69, 0x32, 0x0C, 0x86, 0x30, 0xCC, 0x25, 0x0B, 0x5A, 0x74, 0x64, 0x5C, 0xCC,
+ 0xAC, 0xEF, 0x61, 0xFD, 0x06, 0xEE, 0x95, 0xC6, 0xEB, 0xB8, 0xD1, 0x46, 0x7B, 0x50, 0xD1, 0x1D,
+ 0x82, 0x4C, 0xE5, 0xA2, 0xB2, 0xAC, 0x24, 0x49, 0xE0, 0xFB, 0x14, 0x29, 0xC9, 0x39, 0x93, 0x9C,
+ 0x35, 0x61, 0xD4, 0x29, 0xD3, 0x1A, 0x21, 0x6C, 0xD4, 0x89, 0x84, 0x47, 0xF6, 0xE2, 0x00, 0x3A,
+ 0x40, 0xB2, 0xC1, 0x39, 0xFE, 0x79, 0x18, 0xC8, 0x5A, 0x41, 0x1C, 0xAD, 0x8A, 0xB6, 0x79, 0x3F,
+ 0x32, 0xFD, 0x8F, 0x3E, 0x57, 0x22, 0x5F, 0xDE, 0xE0, 0x90, 0x9B, 0xB7, 0xF7, 0x80, 0xA2, 0x42,
+ 0x33, 0x4E, 0x64, 0xD2, 0xB4, 0x25, 0x77, 0x62, 0xA2, 0x48, 0x80, 0x06, 0x17, 0xBB, 0xC8, 0x04,
+ 0x35, 0x94, 0x1A, 0xD7, 0x64, 0xA4, 0xE6, 0xB6, 0xE6, 0x43, 0x30, 0x46, 0x78, 0xB6, 0x98, 0x1B,
+ 0x0F, 0x90, 0xE6, 0xF7, 0x9A, 0x6A, 0xEC, 0x96, 0x7F, 0x46, 0xD8, 0x1E, 0x62, 0xA6, 0x56, 0x54,
+ 0x63, 0x44, 0x62, 0x18, 0x75, 0x61, 0xB4, 0x11, 0x0F, 0x6D, 0x5E, 0xE3, 0x45, 0xD4, 0x80, 0xC1,
+ 0xAF, 0x98, 0xF6, 0x48, 0x15, 0xDF, 0xD5, 0x3C, 0xD3, 0xE9, 0xD2, 0x17, 0x7E, 0x1A, 0x18, 0x3A,
+ 0xA1, 0xFF, 0xF0, 0x46, 0x9C, 0x48, 0xBA, 0x72, 0xFF, 0x21, 0x66, 0x63, 0x8D, 0xB7, 0xA5, 0x17,
+ 0x42, 0x4F, 0x2E, 0xCA, 0xEA, 0x8E, 0xD9, 0x6F, 0xBD, 0x4B, 0x80, 0x4C, 0x73, 0x4F, 0x85, 0x3D,
+ 0x0B, 0x80, 0x32, 0x1A, 0xAD, 0x93, 0x83, 0x82, 0x0B, 0xA6, 0x5E, 0x76, 0x5B, 0x60, 0x51, 0x81,
+ 0x53, 0x9D, 0x82, 0x5F, 0x65, 0xAD, 0x93, 0x80, 0x81, 0x2C, 0x8A, 0x0B, 0x7D, 0x58, 0x67, 0xE5,
+ 0xAD, 0xB9, 0x94, 0xF7, 0x11, 0x58, 0xE9, 0x7D, 0xE0, 0xC6, 0x92, 0xC9, 0x7D, 0x4C, 0xDC, 0x4C,
+ 0x88, 0x22, 0x31, 0x68, 0xC3, 0x37, 0xE3, 0x1E, 0xE5, 0xA4, 0x6B, 0x41, 0xEA, 0x9D, 0xE8, 0xFC,
+ 0xF1, 0xF3, 0x78, 0xF4, 0x54, 0x40, 0x53, 0x9D, 0x7D, 0x4C, 0x70, 0x56, 0xBE, 0xB0, 0x74, 0x67,
+ 0xAC, 0x7D, 0xE0, 0x4F, 0x67, 0x28, 0x71, 0xDD, 0xCE, 0x78, 0xDB, 0xB5, 0xFF, 0x54, 0x22, 0xBD,
+ 0x89, 0x74, 0x38, 0x14, 0x1A, 0x10, 0x2C, 0xDF, 0x30, 0x24, 0xB0, 0xC1, 0x85, 0x09, 0x4D, 0xB5,
+ 0xE2, 0x02, 0x5E, 0x85, 0x9E, 0x6E, 0x6A, 0xB7, 0xE0, 0x6C, 0xF3, 0x91, 0x42, 0xE7, 0x08, 0x07,
+ 0x95, 0x00, 0xD9, 0x7F, 0x2C, 0xD0, 0xA1, 0x2A, 0xB1, 0x52, 0x18, 0x62, 0x57, 0x51, 0xA0, 0xF2,
+ 0xC9, 0x8B, 0xAA, 0x01, 0x08, 0x74, 0xA6, 0x7C, 0x60, 0x3D, 0x3C, 0x4B, 0xED, 0x45, 0xFE, 0xCE,
+ 0x00, 0x9E, 0x6E, 0x99, 0xDA, 0x0B, 0xC6, 0xB6, 0xC5, 0xCF, 0xAA, 0x03, 0xEE, 0x7F, 0x41, 0xAE,
+ 0x83, 0xAB, 0x23, 0xAA, 0x67, 0x1E, 0x20, 0x42, 0x55, 0x54, 0x95, 0xAE, 0xAE, 0x82, 0x2A, 0x3F,
+ 0xAA, 0x14, 0x66, 0xF4, 0xAB, 0x01, 0xAD, 0x5F, 0xA7, 0x76, 0xFA, 0x21, 0xF4, 0x82, 0x22, 0x67,
+ 0x8F, 0xDC, 0xA2, 0x1A, 0xBC, 0x01, 0x75, 0x8D, 0x66, 0x8C, 0xD5, 0x46, 0x90, 0x4D, 0xD8, 0xC0,
+ 0xBC, 0x0F, 0x61, 0xB2, 0xE9, 0xE2, 0xD0, 0x32, 0x27, 0x4B, 0x39, 0x43, 0x50, 0xD0, 0xF7, 0xF2,
+ 0x32, 0x24, 0xE8, 0x32, 0x19, 0x31, 0x57, 0x04, 0x5B, 0xAB, 0x54, 0xC7, 0x44, 0x6B, 0x5F, 0x6C,
+ 0x14, 0xB2, 0x83, 0xA2, 0xEC, 0x5F, 0x04, 0x8A, 0x78, 0x0D, 0xF8, 0x8F, 0x61, 0xFA, 0x32, 0xC9,
+ 0xB4, 0x60, 0xCC, 0xCB, 0x35, 0x92, 0xB3, 0x23, 0x29, 0x28, 0x4D, 0x48, 0x6C, 0x00, 0x9F, 0xF9,
+ 0x8D, 0x26, 0x44, 0xC9, 0x0B, 0xB2, 0x73, 0x94, 0xF3, 0x7A, 0x9C, 0x4E, 0x7E, 0xC3, 0xB7, 0x7E,
+ 0x87, 0x98, 0x18, 0x83, 0x35, 0x93, 0xDD, 0x35, 0xF7, 0xD1, 0x3D, 0xF1, 0x40, 0x48, 0x89, 0xAC,
+ 0xEE, 0x98, 0xE7, 0x5A, 0x77, 0xED, 0x3A, 0xED, 0x5A, 0xE7, 0x38, 0x74, 0xF7, 0xD6, 0xB6, 0x40,
+ 0x76, 0xAE, 0xBD, 0x99, 0x93, 0x02, 0xB3, 0xFF, 0xDE, 0x14, 0x70, 0xC3, 0xBF, 0x77, 0x00, 0x4F,
+ 0xC6, 0x7E, 0x7A, 0x1E, 0x39, 0xD3, 0x00, 0xDC, 0xC2, 0x35, 0x01, 0x25, 0x8C, 0x9C, 0x34, 0x79,
+ 0xA0, 0x47, 0xD4, 0xD4, 0x3B, 0xFF, 0x89, 0x7D, 0x79, 0x8B, 0xBF, 0x9A, 0x64, 0x4E, 0xB7, 0xE5,
+ 0x79, 0x31, 0xB8, 0x45, 0x03, 0xD0, 0xCC, 0xA6, 0xE5, 0x22, 0xBC, 0xF1, 0x40, 0x24, 0xBA, 0xF6,
+ 0x2B, 0xE0, 0x21, 0xE3, 0xA5, 0x4D, 0xBE, 0xBB, 0x45, 0x12, 0x5A, 0x10, 0x1B, 0x28, 0xC2, 0xD6,
+ 0x85, 0xBE, 0xBD, 0xD0, 0xDD, 0xA3, 0xA0, 0x7B, 0x2F, 0x98, 0xE2, 0x9D, 0x62, 0xB1, 0xB6, 0xE2,
+ 0x1E, 0x1D, 0x7E, 0x69, 0x6F, 0x39, 0x92, 0xF2, 0x97, 0x3D, 0x02, 0xE1, 0x17, 0x25, 0x03, 0x63,
+ 0x20, 0x39, 0xEF, 0xBD, 0x56, 0xFD, 0x66, 0xD5, 0x40, 0x31, 0x9A, 0xA7, 0x45, 0x00, 0xD0, 0x01,
+ 0x60, 0x30, 0xA2, 0xD5, 0x6C, 0x5A, 0x56, 0x67, 0x11, 0x57, 0xC8, 0x09, 0x9D, 0x96, 0xB0, 0xD1,
+ 0x88, 0x9F, 0xE7, 0xE3, 0xAC, 0xD0, 0x0C, 0x39, 0x13, 0xB8, 0xF5, 0xFA, 0xDB, 0xFE, 0x5C, 0x52,
+ 0x4A, 0x8D, 0xA2, 0x8C, 0xA8, 0x7E, 0xAB, 0xEC, 0x22, 0x7F, 0x23, 0x04, 0x16, 0x0E, 0x8F, 0x99,
+ 0xD7, 0x83, 0x13, 0xDF, 0x40, 0x3F, 0xB7, 0xF1, 0xA9, 0x2A, 0x04, 0x62, 0xD3, 0xC1, 0x2F, 0x4B,
+ 0x5D, 0xE8, 0xB8, 0x0E, 0xD2, 0x46, 0xF3, 0x13, 0x92, 0x9A, 0x63, 0x03, 0x54, 0xEC, 0x9E, 0xD3,
+ 0x30, 0x00, 0x03, 0x8A, 0x77, 0x8B, 0xCD, 0x8C, 0x3D, 0x6B, 0x9E, 0xBB, 0x72, 0x7B, 0xB8, 0x72,
+ 0xB9, 0xCD, 0x98, 0x69, 0xFB, 0x20, 0xB8, 0xC5, 0x3F, 0xA0, 0x9C, 0xD1, 0x29, 0x89, 0xE0, 0x55,
+ 0xDF, 0x87, 0x5D, 0x90, 0x28, 0x99, 0xE6, 0x39, 0x63, 0x6A, 0x19, 0xE8, 0x0D, 0x50, 0xB1, 0x2C,
+ 0xF3, 0x31, 0xC1, 0x68, 0x23, 0xE3, 0x70, 0xFF, 0x7E, 0x1F, 0x4D, 0xF5, 0xC5, 0x90, 0xE9, 0x81,
+ 0x17, 0x66, 0x17, 0x40, 0x44, 0xDF, 0x2F, 0x63, 0x50, 0x82, 0x72, 0x87, 0x23, 0x93, 0x6B, 0x7E,
+ 0xAD, 0x53, 0x6F, 0xD7, 0x78, 0x31, 0x25, 0x9F, 0x9E, 0xC3, 0xC9, 0x42, 0x18, 0x40, 0xE9, 0x4C,
+ 0xFC, 0xAA, 0xC7, 0xF5, 0x51, 0x93, 0x24, 0xE2, 0xFD, 0x69, 0x72, 0x68, 0xE1, 0x8D, 0x59, 0x42,
+ 0x1A, 0x14, 0x48, 0x6A, 0xDD, 0x59, 0xC3, 0xA7, 0x34, 0x73, 0x37, 0xAE, 0x82, 0xB9, 0xEB, 0x46,
+ 0xD2, 0xB6, 0x31, 0xB4, 0x3E, 0x82, 0x49, 0x4B, 0x0F, 0x13, 0xB5, 0x98, 0x47, 0x26, 0xD4, 0x45,
+ 0x8C, 0xE2, 0x04, 0xD4, 0xC6, 0x8B, 0x7B, 0x7D, 0x0E, 0x7D, 0x3C, 0x63, 0x39, 0xD7, 0xDF, 0xB2,
+ 0x68, 0x34, 0xD4, 0xB4, 0x70, 0x6A, 0x98, 0x15, 0xDF, 0x16, 0xEF, 0xAF, 0x1E, 0xC5, 0x1F, 0x5C,
+ 0x3D, 0x85, 0x74, 0xC6, 0xCF, 0x44, 0x01, 0xD3, 0xC3, 0x61, 0x93, 0xBF, 0x23, 0x9F, 0x99, 0x44,
+ 0x54, 0x2A, 0x32, 0xB9, 0x75, 0x21, 0x1B, 0x2C, 0xE1, 0xFB, 0xFF, 0xAF, 0x62, 0x6F, 0x86, 0x23,
+ 0xFE, 0xCD, 0x68, 0x38, 0xB6, 0xAC, 0x49, 0xF6, 0x4A, 0x0C, 0xA1, 0xF5, 0x19, 0xD1, 0x5A, 0xA8,
+ 0xF0, 0xB4, 0x9B, 0x4E, 0x0F, 0x6B, 0x65, 0x46, 0x44, 0x16, 0x2F, 0x7E, 0x6E, 0xDC, 0x5F, 0x5E,
+ 0x6F, 0x31, 0x99, 0x43, 0xA0, 0x27, 0xBD, 0x2A, 0x58, 0x6E, 0xB2, 0x82, 0x29, 0x78, 0xED, 0xA6,
+ 0x83, 0x4D, 0x1B, 0xCD, 0x9C, 0x0F, 0xE5, 0xE7, 0x1A, 0xE4, 0x63, 0xD6, 0x6A, 0xD5, 0x03, 0x39,
+ 0xB8, 0x48, 0x77, 0x80, 0xF7, 0xF3, 0xFE, 0x64, 0x8B, 0x98, 0x72, 0xBE, 0x31, 0x28, 0xF0, 0x48,
+ 0x2A, 0x65, 0x37, 0xDA, 0xD1, 0x9A, 0x18, 0x37, 0xBB, 0x23, 0x59, 0xB3, 0x24, 0x75, 0xF7, 0xF5,
+ 0x79, 0x4E, 0xF0, 0xCA, 0x85, 0x13, 0x3C, 0x93, 0xD0, 0xC6, 0xD9, 0xEA, 0xAE, 0xDF, 0x7E, 0xAC,
+ 0xE4, 0xAB, 0x88, 0x0E, 0x78, 0x80, 0x1D, 0x26, 0x2A, 0x5C, 0x95, 0x23, 0x6B, 0x70, 0x99, 0x6C,
+ 0x15, 0xC4, 0x86, 0xC0, 0x29, 0x9D, 0x55, 0xE4, 0xC1, 0x84, 0x37, 0x6B, 0xA7, 0x26, 0x82, 0xCC,
+ 0x9C, 0xDA, 0xEB, 0x54, 0x17, 0x67, 0xD3, 0x74, 0x4B, 0x4F, 0x7C, 0x63, 0x4D, 0xE7, 0xE4, 0x93,
+ 0x34, 0xDB, 0xDE, 0x9D, 0x17, 0x28, 0x06, 0xEA, 0x09, 0x2A, 0x63, 0x8D, 0x1A, 0x32, 0xD8, 0xC9,
+ 0x66, 0xE2, 0x77, 0xE6, 0x19, 0x59, 0x44, 0x13, 0x2A, 0x7E, 0x4E, 0xF4, 0x5A, 0xC7, 0xBB, 0x43,
+ 0xDC, 0xC8, 0x6A, 0x56, 0x5D, 0x2F, 0x55, 0xFD, 0x7E, 0x5A, 0x37, 0x1F, 0x99, 0xE3, 0xF8, 0xEC,
+ 0x50, 0x0B, 0xE3, 0x94, 0xC4, 0xF5, 0xCD, 0xC1, 0x03, 0x96, 0x76, 0xB3, 0x34, 0x01, 0xF9, 0x5C,
+ 0xE6, 0xC9, 0x99, 0x40, 0xB7, 0xCD, 0x5C, 0xF8, 0xE6, 0xF7, 0x3F, 0x7B, 0x13, 0x19, 0x22, 0x02,
+ 0xEF, 0x59, 0x45, 0x48, 0x61, 0x2B, 0xED, 0xCD, 0xB5, 0x90, 0x2C, 0xD0, 0x49, 0xB4, 0x39, 0x76,
+ 0x51, 0xBE, 0x51, 0xD7, 0x3D, 0xD7, 0xDD, 0x55, 0x98, 0xC5, 0x0F, 0xBD, 0xF6, 0xE0, 0x96, 0xAA,
+ 0xB8, 0x19, 0x97, 0x7F, 0x35, 0x2C, 0x50, 0x69, 0xE8, 0xEE, 0x6A, 0x2F, 0x00, 0x18, 0x65, 0x1B,
+ 0xD6, 0xB8, 0x2A, 0xC3, 0x0A, 0x37, 0xEA, 0x7E, 0x95, 0x8B, 0x60, 0xA5, 0x2E, 0xC0, 0x55, 0x24,
+ 0x3B, 0x3D, 0xB1, 0x40, 0x22, 0x8A, 0x56, 0xAB, 0x04, 0x6B, 0x31, 0x0E, 0xB6, 0xD7, 0x17, 0xF1,
+ 0xEA, 0x9B, 0x91, 0x0E, 0xEE, 0xCE, 0x0A, 0xFE, 0x37, 0x46, 0xAC, 0x15, 0xF9, 0x60, 0xFF, 0x73,
+ 0x54, 0xC9, 0xE1, 0x8C, 0x42, 0xFA, 0x39, 0x51, 0xD4, 0x77, 0xAC, 0x62, 0xF3, 0x15, 0x8D, 0xC5,
+ 0xEC, 0x46, 0x75, 0x97, 0x50, 0xED, 0x10, 0xF5, 0xC7, 0x81, 0xEC, 0x1D, 0x7C, 0x40, 0x7B, 0x9F,
+ 0x4F, 0x37, 0xA4, 0xED, 0x3C, 0x35, 0x68, 0xDB, 0xDB, 0x7F, 0xF2, 0xF3, 0xDC, 0x39, 0xA0, 0x40,
+ 0xE8, 0x17, 0x9C, 0xD8, 0x26, 0x92, 0xF2, 0x57, 0x5E, 0xE7, 0x56, 0xDA, 0x4F, 0x3F, 0x4C, 0xF4,
+ 0x90, 0x4A, 0x89, 0x33, 0x49, 0xBB, 0x99, 0xE9, 0xCA, 0x6F, 0x5F, 0x51, 0xAE, 0xFF, 0x83, 0x90,
+ 0x83, 0x53, 0xFF, 0x00, 0x7F, 0x2F, 0x84, 0xD7, 0xD8, 0xE8, 0xB1, 0xAB, 0xF9, 0x56, 0x65, 0x93,
+ 0xA7, 0xC2, 0xB4, 0xD7, 0x6B, 0xB4, 0xCF, 0x65, 0xC8, 0xCA, 0x20, 0x15, 0x91, 0x74, 0x30, 0x4D,
+ 0x72, 0x5B, 0xBD, 0x70, 0xC5, 0x8B, 0xD3, 0xC7, 0xD4, 0x7B, 0xFB, 0xDF, 0x6B, 0x7B, 0x19, 0x6B,
+ 0x8B, 0x83, 0x47, 0x83, 0xC6, 0x44, 0xBA, 0xA8, 0xEA, 0xB8, 0x38, 0x67, 0x6B, 0x58, 0xF3, 0x4E,
+ 0xC8, 0xA8, 0xF4, 0xDD, 0x30, 0xDD, 0x59, 0x4D, 0x55, 0x27, 0x1E, 0x14, 0x3A, 0x71, 0xD5, 0xFD,
+ 0x59, 0x0B, 0xC2, 0x17, 0x2F, 0x08, 0x53, 0x27, 0x07, 0xEE, 0xA0, 0xC6, 0xE9, 0xF8, 0x31, 0xDD,
+ 0x97, 0xC4, 0xAD, 0xC1, 0x9A, 0x60, 0x5C, 0xE4, 0x27, 0x0A, 0x03, 0x35, 0x10, 0x9C, 0xE8, 0x70,
+ 0xE3, 0xF3, 0xD8, 0xE6, 0x72, 0xA5, 0x31, 0xC6, 0xFE, 0x46, 0xA8, 0x46, 0x6E, 0x74, 0x90, 0xD6,
+ 0x8F, 0x27, 0x3C, 0x39, 0x24, 0x5E, 0x31, 0x3C, 0xCC, 0x9A, 0xDD, 0xFE, 0xE9, 0xDA, 0x84, 0xE8,
+ 0xA1, 0xCC, 0x4B, 0xE1, 0x1B, 0xAA, 0x7D, 0xF6, 0x7C, 0xA8, 0x4C, 0xD5, 0xFC, 0x3C, 0x4C, 0xFC,
+ 0x62, 0x32, 0xAE, 0x5D, 0xBA, 0x65, 0xDC, 0xC3, 0x1D, 0x8C, 0x9D, 0x0E, 0x2A, 0x46, 0x64, 0x8D,
+ 0xCD, 0x6E, 0xBC, 0x86, 0x16, 0x15, 0xA2, 0x26, 0xD1, 0x3E, 0x5F, 0x0A, 0x81, 0x86, 0x0F, 0xE8,
+ 0xA1, 0x28, 0xA3, 0x5F, 0xFF, 0xE4, 0x68, 0x2C, 0xE6, 0x30, 0x16, 0xB8, 0x2E, 0xCD, 0x41, 0x52,
+ 0xE3, 0x81, 0xFB, 0x1D, 0x1C, 0xA2, 0x17, 0xC3, 0xF1, 0x24, 0x02, 0x94, 0xB9, 0x59, 0xEC, 0x4A,
+ 0x6D, 0xE3, 0x27, 0x18, 0x2C, 0xDA, 0x75, 0x17, 0x42, 0xAA, 0xF7, 0x61, 0x50, 0x29, 0x8C, 0x0A,
+ 0xCA, 0x8E, 0xCA, 0x59, 0x82, 0x1F, 0x1D, 0x0B, 0x00, 0x36, 0xE4, 0x78, 0x25, 0x01, 0xF7, 0xFB,
+ 0x0E, 0x65, 0x4E, 0x07, 0x5E, 0xD8, 0x23, 0xC6, 0x49, 0x76, 0x06, 0x0B, 0xA5, 0xC2, 0x30, 0x55,
+ 0x82, 0xF6, 0x60, 0x69, 0xAE, 0x1B, 0x37, 0xC1, 0x02, 0xE8, 0x23, 0x9B, 0x15, 0x70, 0x7B, 0xF8,
+ 0xF9, 0x5E, 0x50, 0x69, 0x2F, 0x28, 0x7E, 0xDB, 0x35, 0x2F, 0x6C, 0x87, 0xCC, 0xFD, 0x23, 0x1A,
+ 0x3B, 0x32, 0x9C, 0xFC, 0xE2, 0x6A, 0x24, 0x2A, 0x0C, 0x5E, 0x4D, 0x19, 0x7E, 0xDA, 0xCA, 0x95,
+ 0x61, 0xE1, 0xC6, 0x60, 0x4E, 0x62, 0xCB, 0x6A, 0x09, 0x83, 0x02, 0xEF, 0xC8, 0x7E, 0x36, 0x79,
+ 0x14, 0x24, 0x35, 0x01, 0xCF, 0xCB, 0x95, 0xF5, 0x08, 0x5E, 0x0A, 0x46, 0xD2, 0x5B, 0x46, 0x43,
+ 0x54, 0x3B, 0x4F, 0x96, 0xD5, 0x53, 0x81, 0x8D, 0x0E, 0xDE, 0x7A, 0x94, 0xB8, 0x09, 0x11, 0x47,
+ 0x8F, 0x38, 0xFE, 0x47, 0x00, 0xFA, 0x76, 0x73, 0x96, 0xDA, 0x1C, 0x55, 0xE9, 0x9E, 0x73, 0x1E,
+ 0x75, 0xCF, 0x7A, 0x4D, 0xB0, 0x44, 0x6E, 0x2A, 0x6D, 0x98, 0x2B, 0x39, 0xDC, 0xBA, 0x17, 0x50,
+ 0x06, 0xEA, 0xA6, 0x62, 0x33, 0xD9, 0xD2, 0x66, 0x78, 0x05, 0xE5, 0x52, 0x2B, 0x9F, 0x34, 0xAE,
+ 0xDF, 0xE9, 0x9D, 0x44, 0xBA, 0x93, 0xD8, 0x29, 0x02, 0xC6, 0xED, 0x5A, 0x59, 0x0A, 0xD0, 0xD9,
+ 0x6D, 0xBE, 0x97, 0x25, 0x5E, 0xDA, 0x95, 0x44, 0xCE, 0x73, 0xFD, 0xE5, 0x98, 0xFD, 0x75, 0x38,
+ 0x88, 0x1E, 0x42, 0x2A, 0x3F, 0x65, 0x96, 0x7C, 0xF1, 0x86, 0x51, 0xBE, 0x51, 0xB1, 0x1E, 0xD1,
+ 0x76, 0x64, 0x08, 0x85, 0x49, 0xD7, 0xDD, 0xDD, 0xD4, 0xFA, 0xFE, 0xCA, 0x67, 0xDB, 0x36, 0x90,
+ 0x07, 0xEB, 0x86, 0xF6, 0x07, 0x7A, 0x21, 0xDB, 0xEE, 0x57, 0x24, 0x55, 0x87, 0x2C, 0xD2, 0xA4,
+ 0xEE, 0x45, 0x51, 0xE8, 0x05, 0xD1, 0x24, 0x08, 0xD0, 0x3B, 0x7D, 0xCA, 0x0E, 0x5D, 0x03, 0x57,
+ 0x44, 0xF7, 0x76, 0x0A, 0xCD, 0x20, 0x9B, 0x93, 0xE0, 0x7D, 0x86, 0x3E, 0x48, 0x8D, 0xF0, 0x4C,
+ 0x28, 0x32, 0x77, 0xD8, 0xA3, 0x48, 0xA0, 0x93, 0x36, 0x05, 0xA0, 0x19, 0xF2, 0x98, 0x6C, 0x17,
+ 0x5E, 0x2C, 0x5E, 0xE4, 0xAD, 0x36, 0x96, 0x10, 0x1B, 0xE5, 0xB7, 0x6B, 0x84, 0x0C, 0xED, 0xE3,
+ 0xDC, 0x4B, 0xA4, 0xE7, 0x0A, 0xDA, 0xD4, 0xE7, 0xD9, 0x1E, 0xEE, 0xF9, 0xD5, 0x06, 0xAF, 0x3F,
+ 0x51, 0x1D, 0x98, 0x42, 0x77, 0x11, 0x02, 0x57, 0x10, 0x3C, 0x5C, 0x98, 0xDA, 0x7D, 0x64, 0x6B,
+ 0xEC, 0x6B, 0x51, 0xFB, 0x77, 0x31, 0x79, 0xCE, 0x9C, 0x58, 0x03, 0xEA, 0x2A, 0xDF, 0x92, 0x5D,
+ 0xED, 0x0F, 0x20, 0xCC, 0x0A, 0x70, 0x42, 0x94, 0x37, 0xFA, 0xDF, 0xA1, 0xAF, 0x70, 0x1B, 0x0E,
+ 0x80, 0x5B, 0x3E, 0xA9, 0xBF, 0x0F, 0x2B, 0x5D, 0xD8, 0x2F, 0xEF, 0xF9, 0xF3, 0x53, 0xC5, 0xE7,
+ 0x93, 0x87, 0x49, 0x54, 0xE4, 0x48, 0x74, 0xD2, 0xDC, 0x2A, 0x9A, 0xE2, 0x18, 0x61, 0xD7, 0xAC,
+ 0x4C, 0x1A, 0x2E, 0x72, 0x83, 0x8D, 0xDA, 0xCE, 0x16, 0xD1, 0x3F, 0x90, 0x62, 0xCA, 0xA7, 0x06,
+ 0x22, 0x66, 0xF3, 0x67, 0xB0, 0xA3, 0xD4, 0xDD, 0xB1, 0xA4, 0xF3, 0x22, 0xB3, 0x02, 0x4D, 0xD4,
+ 0x2C, 0x84, 0xF5, 0x75, 0x87, 0x7D, 0x56, 0x04, 0xC1, 0xC1, 0x62, 0x12, 0x59, 0xCF, 0x04, 0xA4,
+ 0x20, 0x1F, 0xF5, 0xC5, 0x8D, 0xB6, 0x88, 0x54, 0x61, 0xF3, 0x5A, 0x88, 0x3F, 0x6E, 0x5C, 0xE9,
+ 0x8B, 0x81, 0x56, 0xE6, 0x10, 0xC7, 0xED, 0x5F, 0x03, 0x67, 0x3E, 0x2E, 0xBD, 0x6A, 0xC3, 0x4D,
+ 0x33, 0xB7, 0xD4, 0x87, 0x46, 0x0B, 0x27, 0x86, 0xFC, 0x65, 0x6F, 0xDF, 0x5A, 0x3D, 0x77, 0x49,
+ 0x5A, 0xFB, 0x3A, 0x81, 0xCE, 0xA1, 0xAC, 0x02, 0x18, 0x7E, 0x5B, 0x58, 0x75, 0xFB, 0x64, 0x7C,
+ 0xAA, 0x50, 0xE6, 0xE6, 0xA2, 0x7E, 0xFC, 0xC7, 0x67, 0x25, 0x5D, 0xE5, 0x24, 0x28, 0x1F, 0x3B,
+ 0xE6, 0x31, 0x6D, 0x43, 0x93, 0xD3, 0xC4, 0xB4, 0x6F, 0x89, 0x02, 0x9B, 0x54, 0xC7, 0x6B, 0x97,
+ 0xD3, 0x85, 0x06, 0xE1, 0x4E, 0x15, 0xD2, 0xE8, 0xF3, 0x94, 0x37, 0x40, 0x30, 0x2C, 0xA0, 0x25,
+ 0x77, 0xA8, 0xC0, 0x23, 0x3F, 0x5F, 0x55, 0x71, 0x21, 0xD3, 0x33, 0x0B, 0x7A, 0x2F, 0xDF, 0xB9,
+ 0x39, 0x0D, 0xAE, 0x65, 0xCF, 0x53, 0x9C, 0x82, 0xA2, 0xE5, 0x40, 0xF9, 0xF6, 0xDF, 0xBA, 0x33,
+ 0x96, 0xF3, 0x55, 0x25, 0x35, 0x9E, 0x5F, 0x9B, 0x25, 0x39, 0x94, 0x2F, 0x03, 0xA6, 0x28, 0xB0,
+ 0x6A, 0xFF, 0xFA, 0x14, 0xD6, 0xE7, 0x02, 0x07, 0x8F, 0x1A, 0xC4, 0xF0, 0x51, 0x34, 0x3D, 0xD3,
+ 0xDF, 0xCB, 0x57, 0xC3, 0xF5, 0x04, 0xE2, 0x4C, 0x58, 0x18, 0xA5, 0xE2, 0x39, 0xB4, 0xA3, 0xE2,
+ 0xE6, 0x25, 0xC5, 0xAC, 0xFD, 0x75, 0xB2, 0x2B, 0x5B, 0x93, 0xC5, 0xFF, 0x56, 0xDB, 0xAA, 0x6E,
+ 0xCC, 0x18, 0x98, 0x90, 0x8A, 0x2C, 0x85, 0x84, 0xE7, 0xCF, 0xB0, 0xC5, 0x18, 0x1F, 0x59, 0xC7,
+ 0xA4, 0xCE, 0xAD, 0xB2, 0x04, 0x41, 0xBD, 0x56, 0xD3, 0x12, 0xD5, 0x0A, 0x19, 0x83, 0x6D, 0xED,
+ 0x87, 0xB0, 0xAB, 0xAE, 0x8F, 0x79, 0xE5, 0x51, 0x30, 0xE9, 0x90, 0xBB, 0x91, 0x38, 0x2A, 0x17,
+ 0xDE, 0x3F, 0x53, 0x54, 0x34, 0x1E, 0x3F, 0x20, 0xE1, 0xA5, 0x17, 0xD5, 0xCD, 0x64, 0x62, 0x1C,
+ 0x60, 0xD2, 0xFC, 0xC1, 0x86, 0xA1, 0x55, 0x62, 0x29, 0x58, 0x33, 0xD6, 0x1D, 0x3F, 0xD2, 0x70,
+ 0xD6, 0x79, 0x09, 0x35, 0x23, 0x6B, 0xEA, 0x8E, 0x80, 0xEB, 0x43, 0xAF, 0xBF, 0x86, 0xE8, 0xD6,
+ 0xBB, 0x1F, 0x75, 0x7A, 0x43, 0xAC, 0xC7, 0x84, 0x85, 0xAD, 0xE1, 0x72, 0x4A, 0xF8, 0x97, 0xBE,
+ 0xC6, 0x11, 0xCD, 0xAD, 0x99, 0xAE, 0xD4, 0x78, 0x4F, 0xFA, 0x76, 0x5F, 0x95, 0xEF, 0x0E, 0x0C,
+ 0x86, 0x2F, 0x45, 0x6F, 0xB0, 0xED, 0x35, 0x87, 0x55, 0x79, 0x0B, 0x39, 0x0E, 0x13, 0x4A, 0x67,
+ 0x9A, 0xC5, 0x27, 0xC7, 0x5C, 0x99, 0x84, 0x75, 0xE6, 0xD1, 0x66, 0x2F, 0x2F, 0x47, 0xA9, 0xE6,
+ 0xDD, 0x9C, 0xCF, 0x10, 0x64, 0x33, 0xDE, 0xBB, 0x35, 0x54, 0x9F, 0xBB, 0x40, 0x1B, 0xF1, 0x53,
+ 0x48, 0xA1, 0x68, 0x42, 0x39, 0x92, 0x52, 0xAE, 0xAC, 0xA5, 0x6E, 0xA4, 0x09, 0x96, 0x1A, 0xE8,
+ 0x88, 0x59, 0x38, 0xF3, 0xCA, 0x72, 0x52, 0xCC, 0xB0, 0x4F, 0x2B, 0x86, 0xA9, 0xA9, 0x7D, 0xBF,
+ 0x6F, 0x6A, 0x07, 0x89, 0x52, 0x99, 0xF8, 0x06, 0xE5, 0x28, 0xC5, 0x74, 0xEC, 0x81, 0xE1, 0xE8,
+ 0x25, 0x66, 0xD7, 0x7F, 0xEA, 0x51, 0x56, 0xF7, 0xA8, 0x06, 0x44, 0xE9, 0xE0, 0x2F, 0x33, 0x19,
+ 0x4A, 0xD1, 0xCD, 0x92, 0x19, 0x2A, 0x1F, 0x03, 0x07, 0xD1, 0x46, 0x05, 0x0D, 0x64, 0x23, 0xEC,
+ 0x4D, 0x4E, 0x03, 0x2A, 0xED, 0xA5, 0xF4, 0x9F, 0xC3, 0x93, 0xAB, 0xA3, 0xE2, 0x8C, 0x3F, 0xC4,
+ 0xA5, 0xE1, 0x47, 0x0D, 0x1A, 0x37, 0x52, 0x9D, 0x45, 0x96, 0xE2, 0x4D, 0x7F, 0xFD, 0x06, 0x28,
+ 0xE3, 0xEE, 0xE4, 0x57, 0x5D, 0x7B, 0x72, 0xA7, 0x8A, 0xCE, 0x77, 0x26, 0xCF, 0x98, 0x06, 0x31,
+ 0xB7, 0x28, 0x73, 0x1D, 0xA3, 0x4F, 0xB5, 0x01, 0xE5, 0x4C, 0x14, 0xAD, 0xDB, 0x3F, 0xE6, 0xD1,
+ 0xDA, 0xF7, 0x58, 0xBC, 0x54, 0x76, 0x9E, 0x99, 0xD4, 0xFC, 0x7F, 0xE9, 0x6D, 0xF9, 0xAE, 0xC2,
+ 0x7B, 0x45, 0x32, 0x7D, 0x29, 0x22, 0xB2, 0xF3, 0x7D, 0x08, 0x37, 0x49, 0x0C, 0xB7, 0xC4, 0x0E,
+ 0xE7, 0x6C, 0x1E, 0xA7, 0xBE, 0x75, 0x4E, 0x4C, 0x1A, 0xBD, 0x2F, 0xC6, 0x70, 0xD7, 0x38, 0xAE,
+ 0x61, 0x3C, 0x01, 0xEB, 0x07, 0x25, 0xEA, 0x45, 0x21, 0x06, 0x99, 0xBF, 0xD0, 0xAC, 0xD1, 0xDB,
+ 0x69, 0xF4, 0x64, 0x9F, 0xEB, 0xB3, 0xCF, 0xD8, 0xB1, 0x90, 0xAA, 0xAF, 0x80, 0x50, 0xA0, 0x92,
+ 0xBA, 0x7E, 0xA2, 0x7B, 0x2D, 0x13, 0x7E, 0x9F, 0x4F, 0xFD, 0x0F, 0x40, 0xEC, 0x2D, 0x0E, 0x85,
+ 0xB7, 0xDA, 0x01, 0x64, 0x95, 0x95, 0x66, 0x91, 0x15, 0x3F, 0x09, 0x77, 0xAC, 0xBF, 0x0D, 0x6F,
+ 0x7C, 0xC1, 0xB7, 0x5F, 0xBD, 0xDA, 0xE9, 0xF7, 0xCC, 0x83, 0x17, 0x3B, 0x14, 0x20, 0x81, 0xE5,
+ 0x9A, 0xA5, 0x4A, 0x40, 0xD7, 0x4A, 0x7A, 0x94, 0xE1, 0x6F, 0x3B, 0x27, 0xEA, 0x13, 0x7E, 0x5E,
+ 0xE7, 0x4D, 0x96, 0xF1, 0x47, 0x8F, 0xD4, 0x79, 0x3D, 0x98, 0xD7, 0xCD, 0x3C, 0x35, 0x3A, 0x3F,
+ 0x54, 0x3A, 0x48, 0x73, 0x66, 0xC3, 0xFD, 0x11, 0x87, 0x76, 0x0C, 0xF0, 0xC5, 0x08, 0x97, 0xA6,
+ 0xC5, 0x88, 0x3F, 0x4F, 0xC7, 0x32, 0x72, 0x5C, 0xD4, 0x17, 0x8D, 0x45, 0x91, 0x62, 0xB2, 0xC3,
+ 0x4A, 0xA4, 0x58, 0x88, 0x5C, 0x9C, 0xB5, 0x72, 0xFE, 0xE9, 0xB7, 0x73, 0x55, 0x7B, 0xD5, 0x91,
+ 0x66, 0x02, 0x4C, 0xF7, 0x11, 0x77, 0x9D, 0x68, 0x4E, 0x1A, 0xC5, 0x6B, 0xB9, 0x0A, 0xC3, 0x7F,
+ 0xB0, 0x48, 0x87, 0xC4, 0xC9, 0x29, 0x73, 0x1A, 0x25, 0xDA, 0x46, 0x3E, 0x10, 0x02, 0x9A, 0xCE,
+ 0x23, 0xD9, 0x77, 0xC6, 0x0D, 0xA3, 0xD5, 0xF8, 0x6B, 0xE2, 0x10, 0x90, 0x01, 0xE7, 0xF7, 0xAF,
+ 0x35, 0x59, 0x8D, 0x1D, 0xA7, 0x3B, 0xD2, 0x5A, 0x33, 0x33, 0xAF, 0xB0, 0xAC, 0xD1, 0x2A, 0x43,
+ 0x79, 0x13, 0x5C, 0x2A, 0x55, 0x37, 0x52, 0xA1, 0x69, 0x17, 0x7F, 0xE9, 0x7C, 0xD7, 0x6D, 0x43,
+ 0x57, 0xC3, 0x1B, 0x2E, 0x5D, 0xA0, 0x5B, 0x3D, 0x75, 0x4E, 0xF4, 0xA1, 0x24, 0xDE, 0x50, 0x18,
+ 0x90, 0xB9, 0x89, 0xF1, 0x47, 0x4C, 0x61, 0xDB, 0xD8, 0xF0, 0x66, 0xD6, 0x1F, 0xB3, 0x9F, 0x91,
+ 0x4D, 0x91, 0xFD, 0x6E, 0xB9, 0x4B, 0x47, 0xC9, 0xF6, 0x48, 0x07, 0xFB, 0xC6, 0x64, 0x48, 0x33,
+ 0x5F, 0x92, 0x19, 0x22, 0xB7, 0x69, 0xE2, 0x9D, 0x69, 0x02, 0xE7, 0x47, 0x97, 0xAC, 0x52, 0xAA,
+ 0xB6, 0x50, 0xC7, 0x9B, 0x16, 0x29, 0x15, 0x1F, 0x12, 0x46, 0xE0, 0xC0, 0x3F, 0xA9, 0xB0, 0x30,
+ 0x47, 0xE7, 0x6F, 0x73, 0x62, 0xB0, 0xD6, 0x50, 0x20, 0x40, 0x47, 0x4C, 0x5D, 0x5C, 0xA1, 0xBA,
+ 0x05, 0x8E, 0x06, 0x22, 0xEA, 0xDF, 0x4C, 0x52, 0xFE, 0x21, 0x72, 0x6B, 0xD4, 0xB1, 0xEF, 0x38,
+ 0x74, 0xF5, 0xB3, 0x4D, 0x38, 0x91, 0x5F, 0x21, 0x74, 0x4B, 0x18, 0x27, 0xBD, 0x70, 0x4A, 0x6A,
+ 0xBD, 0x62, 0x2A, 0xEE, 0xCE, 0xAE, 0x6B, 0x23, 0xA2, 0x97, 0x7E, 0x06, 0x24, 0xAE, 0x09, 0xD6,
+ 0xC3, 0xEE, 0x10, 0x6D, 0x8D, 0x04, 0xF2, 0xAE, 0x09, 0x10, 0xB0, 0x54, 0xD0, 0x1C, 0x84, 0x55,
+ 0xCF, 0xED, 0xFD, 0xB8, 0xDE, 0xF5, 0xA4, 0x5B, 0xFA, 0x7D, 0x7C, 0xAC, 0xC0, 0x85, 0x48, 0xB2,
+ 0x05, 0x45, 0x05, 0x36, 0xDD, 0x9A, 0xD9, 0x43, 0x75, 0x94, 0xAF, 0xD5, 0xDF, 0x70, 0xE4, 0x7D,
+ 0x37, 0x49, 0x0E, 0xE6, 0xD1, 0xC2, 0x1A, 0xBD, 0xCD, 0xC6, 0xD8, 0xC5, 0xAA, 0xD8, 0x90, 0x6E,
+ 0xD7, 0x5D, 0xA4, 0x6B, 0x19, 0xB1, 0x7A, 0x18, 0xF1, 0x29, 0x4D, 0x20, 0xF7, 0x7A, 0x7F, 0x7C,
+ 0xE6, 0x8A, 0x54, 0x05, 0xB7, 0xA0, 0xD9, 0x32, 0xDB, 0x53, 0xF6, 0x48, 0x65, 0x89, 0x86, 0x5B,
+ 0x85, 0x7F, 0x11, 0x61, 0x0A, 0x99, 0xBE, 0x01, 0x56, 0xA3, 0xA7, 0x3A, 0xE6, 0xAB, 0xDF, 0x6B,
+ 0xB4, 0x11, 0x24, 0xFC, 0x36, 0x30, 0x8C, 0x85, 0x06, 0xFB, 0x0C, 0xB9, 0xB2, 0x50, 0x51, 0xF8,
+ 0xDD, 0x3B, 0xB3, 0xC7, 0x4E, 0x7A, 0x4A, 0x8E, 0x42, 0x01, 0xCB, 0xA9, 0xE5, 0x21, 0xD5, 0xDF,
+ 0x8E, 0x59, 0x53, 0x82, 0xA8, 0xA0, 0x25, 0x9F, 0xCE, 0x99, 0x17, 0x9F, 0xC6, 0xD7, 0xDB, 0x67,
+ 0xA7, 0x72, 0xC8, 0x22, 0x43, 0x32, 0x8E, 0x75, 0xE7, 0x29, 0xAC, 0x7A, 0x0A, 0x95, 0xC3, 0x32,
+ 0xA9, 0x56, 0xE6, 0xD7, 0xFE, 0x29, 0xC1, 0x5C, 0x02, 0xB6, 0xD7, 0x16, 0x06, 0xC7, 0x86, 0x33,
+ 0x68, 0x41, 0x64, 0xAE, 0x1D, 0xD6, 0xEC, 0x9F, 0x4D, 0x2A, 0x79, 0x01, 0xDB, 0x48, 0x52, 0xB7,
+ 0x62, 0x36, 0x2B, 0x47, 0x2C, 0x0C, 0x9F, 0x10, 0xB0, 0x16, 0x34, 0x13, 0xAA, 0xF8, 0x18, 0xC5,
+ 0xAA, 0xAF, 0x57, 0x03, 0xC9, 0x48, 0xE4, 0x75, 0x94, 0xCB, 0xDA, 0xC2, 0xDF, 0xDE, 0x92, 0x23,
+ 0x1E, 0x07, 0xF8, 0x04, 0xFC, 0x90, 0x34, 0xCE, 0xC3, 0x9C, 0x87, 0xBF, 0xA6, 0x45, 0x1B, 0xFC,
+ 0x73, 0x2B, 0xF8, 0x4E, 0x96, 0x82, 0xDA, 0xE8, 0x98, 0x87, 0x0D, 0x37, 0xCD, 0xD1, 0x3E, 0x31,
+ 0x15, 0x72, 0x87, 0x3B, 0x67, 0xAF, 0x5D, 0x0B, 0x88, 0xFF, 0x44, 0xC1, 0xAB, 0xD1, 0x1E, 0x5F,
+ 0xE6, 0x8B, 0xAD, 0x0F, 0x95, 0xFC, 0x9F, 0x8F, 0x91, 0xED, 0x36, 0xE2, 0xD6, 0x2E, 0xC3, 0x2D,
+ 0x9E, 0x80, 0x6A, 0x78, 0x4A, 0xCA, 0x04, 0xCD, 0x64, 0x73, 0x7A, 0x81, 0x2D, 0x45, 0x53, 0xC8,
+ 0xED, 0x68, 0x74, 0x36, 0x85, 0x83, 0xD9, 0x6F, 0x8C, 0xAF, 0xEC, 0xE5, 0xC1, 0xF1, 0x65, 0x0C,
+ 0x45, 0xB4, 0xE7, 0xD1, 0xF8, 0x3C, 0xAA, 0xF3, 0x1E, 0xC7, 0x99, 0x78, 0x13, 0xC9, 0x55, 0x2B,
+ 0xA8, 0x5C, 0x24, 0xE2, 0xDF, 0x43, 0x46, 0x09, 0xAD, 0xAB, 0x1D, 0xED, 0xAA, 0xE0, 0xE6, 0x09,
+ 0xE2, 0x52, 0xE0, 0x5E, 0x78, 0xF8, 0x26, 0x88, 0x66, 0xB9, 0x98, 0x68, 0x52, 0x7A, 0xB4, 0xDF,
+ 0x34, 0xAA, 0xF6, 0x1A, 0x4C, 0x3D, 0x36, 0x8D, 0xB7, 0x05, 0x5B, 0x0B, 0x00, 0xF8, 0x3B, 0xDD,
+ 0x95, 0xB7, 0x47, 0x3A, 0xB0, 0x5A, 0x0A, 0xA8, 0x85, 0x17, 0xCB, 0x4E, 0x92, 0x47, 0x72, 0x92,
+ 0x73, 0x6A, 0xAB, 0xB5, 0x7D, 0x99, 0xBC, 0x8B, 0xAC, 0x1B, 0xE8, 0x1A, 0xE6, 0x32, 0x11, 0x79,
+ 0x2C, 0x6B, 0x88, 0x56, 0x70, 0x41, 0xED, 0xC3, 0x7E, 0x0A, 0xA8, 0xDF, 0xCA, 0xA8, 0xD4, 0x3E,
+ 0x1A, 0xE0, 0x9E, 0x6D, 0x7C, 0xBD, 0x32, 0xB1, 0x7F, 0x7D, 0x32, 0x18, 0x4D, 0x18, 0x5E, 0xF3,
+ 0x19, 0x30, 0xCA, 0x8C, 0x66, 0xB5, 0x77, 0x57, 0x5B, 0x98, 0x8F, 0x6D, 0x6B, 0x2D, 0x8D, 0xC4,
+ 0x0B, 0x76, 0xE0, 0x37, 0x42, 0x02, 0xC4, 0x61, 0xFE, 0x43, 0x5F, 0x41, 0xA7, 0x40, 0x64, 0x45,
+ 0xD6, 0x09, 0x99, 0x3F, 0x95, 0x73, 0x0D, 0x9F, 0xC4, 0xBE, 0x22, 0x2A, 0xE5, 0x4C, 0xAD, 0x32,
+ 0xC2, 0xF3, 0x49, 0xC4, 0xCF, 0x9C, 0xD1, 0x63, 0x3E, 0xBA, 0xD3, 0x9B, 0x24, 0x2F, 0x52, 0xF3,
+ 0xBA, 0x21, 0x2E, 0xEC, 0xDF, 0x8D, 0xAD, 0x3F, 0xF3, 0xE1, 0x23, 0x8C, 0x0D, 0x76, 0xDD, 0xCB,
+ 0x36, 0xB9, 0x7A, 0x13, 0x78, 0xB2, 0x6D, 0xDB, 0x16, 0xAD, 0x2A, 0x94, 0xAC, 0xF9, 0x86, 0x8B,
+ 0x2D, 0x75, 0x33, 0x86, 0x43, 0x18, 0xCF, 0x65, 0x4F, 0x08, 0x22, 0x88, 0x6E, 0x38, 0xBF, 0xF7,
+ 0x12, 0x3F, 0x8A, 0xC3, 0x49, 0xA0, 0xC6, 0x03, 0xAB, 0x1C, 0xD5, 0x3D, 0xA2, 0x43, 0xFF, 0x93,
+ 0xD4, 0x80, 0xDA, 0xDC, 0x77, 0x6D, 0xF8, 0xE1, 0xD3, 0x88, 0xA4, 0xCF, 0x82, 0xE0, 0x08, 0xB2,
+ 0x6E, 0x98, 0xBA, 0x6C, 0x0A, 0x84, 0xA0, 0x94, 0x51, 0xFE, 0x17, 0x96, 0xF1, 0xBC, 0xD0, 0xFB,
+ 0x6B, 0x50, 0x13, 0xA6, 0x8E, 0x42, 0xFA, 0x01, 0x8C, 0xF4, 0x04, 0x02, 0xB1, 0xA8, 0x53, 0x5D,
+ 0x9B, 0x15, 0x48, 0xC3, 0x81, 0xCB, 0xAF, 0x4B, 0x4E, 0x61, 0xB6, 0x86, 0x5C, 0xB1, 0x83, 0x44,
+ 0x5C, 0xB9, 0x3F, 0x31, 0x84, 0xEF, 0x75, 0x20, 0x66, 0x4C, 0x77, 0x66, 0x73, 0x04, 0x45, 0xB8,
+ 0xE7, 0xBD, 0x14, 0xF9, 0x93, 0xC7, 0x17, 0x60, 0xE5, 0x63, 0xAE, 0x6A, 0xD6, 0x99, 0xCD, 0x10,
+ 0x4F, 0x6B, 0xC1, 0x44, 0x63, 0x37, 0x79, 0x9C, 0x9C, 0xAA, 0xBC, 0x64, 0x19, 0x61, 0xB5, 0xC1,
+ 0x52, 0x09, 0x6E, 0x6B, 0x6B, 0x90, 0x8B, 0xA6, 0x23, 0xDC, 0xE4, 0xE1, 0xB4, 0x82, 0x47, 0x11,
+ 0x86, 0x9B, 0x9F, 0xE0, 0x24, 0xC0, 0x19, 0xAE, 0x7D, 0x9A, 0x8C, 0x49, 0x6C, 0x42, 0x6D, 0x4E,
+ 0x1F, 0xC7, 0x66, 0x20, 0x19, 0xCA, 0xA0, 0xF0, 0x44, 0x1A, 0x61, 0x1E, 0x67, 0x58, 0x4B, 0xA4,
+ 0x15, 0x8F, 0x26, 0x2C, 0xAC, 0xE8, 0xBA, 0x1D, 0x33, 0x77, 0x22, 0x83, 0xBB, 0xE1, 0x18, 0xBD,
+ 0x45, 0x1A, 0xB4, 0x9F, 0x4F, 0x1F, 0x80, 0xE8, 0x99, 0x14, 0xB2, 0x1C, 0x1E, 0x4E, 0xBB, 0x04,
+ 0xD6, 0x57, 0x50, 0x6F, 0x79, 0x60, 0xAA, 0xC1, 0xFD, 0x5D, 0xC7, 0x72, 0xA7, 0xBC, 0xD0, 0x29,
+ 0x29, 0x32, 0xD9, 0xDF, 0x9D, 0xF4, 0xC6, 0xF6, 0x54, 0x67, 0xF4, 0x16, 0x3C, 0xB7, 0xA9, 0x06,
+ 0x9D, 0xDC, 0xD9, 0x69, 0x4C, 0xD7, 0xC2, 0x8B, 0xF7, 0x7E, 0xAD, 0x7E, 0xD8, 0xC7, 0x23, 0x90,
+ 0x1F, 0xD6, 0xC4, 0xD3, 0xBB, 0xD4, 0x57, 0x35, 0xF6, 0xD3, 0x52, 0x32, 0x18, 0x20, 0xEC, 0x33,
+ 0x97, 0x01, 0xB5, 0x91, 0x7C, 0xCF, 0xB4, 0x6B, 0x55, 0x0C, 0x5C, 0x73, 0xE9, 0x8D, 0x9E, 0xDD,
+ 0xCF, 0xF8, 0xDF, 0xB8, 0x21, 0x13, 0x62, 0x2B, 0x66, 0x6E, 0x76, 0x03, 0x04, 0x75, 0xAA, 0x56,
+ 0xDF, 0x91, 0x5F, 0x26, 0x9B, 0xF9, 0x72, 0x25, 0x81, 0x63, 0x5B, 0xFE, 0xE4, 0x2A, 0x8E, 0x14,
+ 0x03, 0xFD, 0x8D, 0x23, 0x35, 0x82, 0x64, 0x70, 0x30, 0x91, 0x3F, 0xBB, 0x19, 0x2C, 0x04, 0x9E,
+ 0x44, 0xDC, 0x79, 0x9A, 0x7B, 0x69, 0x52, 0x08, 0xC3, 0x9E, 0x2A, 0xB9, 0x02, 0xD4, 0x19, 0xF2,
+ 0x3A, 0x4A, 0x4C, 0x47, 0x08, 0x38, 0x4B, 0x2E, 0x75, 0xF8, 0x86, 0x7C, 0x09, 0x72, 0xEC, 0xB2,
+ 0xAC, 0x9C, 0xEC, 0x42, 0x5C, 0x61, 0x7F, 0xD8, 0x24, 0x05, 0x88, 0x55, 0x3D, 0xB7, 0x79, 0x90,
+ 0x73, 0x7D, 0x0A, 0x10, 0xF5, 0xB3, 0x5C, 0xC8, 0x8D, 0x5E, 0x59, 0x51, 0xD2, 0xDB, 0x4E, 0x5D,
+ 0x4B, 0x39, 0x16, 0x14, 0xF2, 0xA2, 0x75, 0x28, 0x66, 0x45, 0xBF, 0x73, 0x60, 0xD3, 0xFD, 0x53,
+ 0xDA, 0x8D, 0x5C, 0x94, 0x2E, 0x91, 0x14, 0xE2, 0xAA, 0xEF, 0x93, 0x82, 0x68, 0x0A, 0x69, 0x1F,
+ 0xE2, 0x10, 0x26, 0xEB, 0x69, 0xD6, 0x35, 0x9B, 0x62, 0x05, 0x97, 0x7D, 0x04, 0x6D, 0x6C, 0x22,
+ 0x3E, 0x7C, 0xAB, 0x13, 0xC0, 0xEF, 0x4C, 0xE1, 0x96, 0x5B, 0xB7, 0xA3, 0x80, 0xC2, 0x89, 0x1A,
+ 0x2F, 0x47, 0x0B, 0xD9, 0x76, 0x6C, 0xD3, 0x03, 0x08, 0xA3, 0x8E, 0x9B, 0xAE, 0xA1, 0x55, 0x73,
+ 0x7B, 0x9F, 0xAE, 0x40, 0xB6, 0x0C, 0x0A, 0x8A, 0x83, 0x7A, 0x88, 0x6B, 0x3E, 0xD7, 0x98, 0x7F,
+ 0x43, 0x40, 0x01, 0xE4, 0x3A, 0xFF, 0x26, 0xEC, 0x91, 0x68, 0x71, 0xD8, 0x84, 0x18, 0xC1, 0xD5,
+ 0xAB, 0xA2, 0xBB, 0xCC, 0xEA, 0x43, 0x79, 0x73, 0x97, 0x4C, 0x9B, 0x03, 0xD0, 0x10, 0x7C, 0x09,
+ 0x84, 0x32, 0x04, 0x0A, 0x35, 0xA6, 0x29, 0xAB, 0x6E, 0x26, 0x9A, 0xCF, 0x49, 0x8F, 0x15, 0xC2,
+ 0xAC, 0x56, 0xD6, 0x82, 0xB9, 0x3C, 0xD2, 0xDD, 0x68, 0xB7, 0x43, 0xBC, 0xBC, 0xFD, 0xA4, 0xC5,
+ 0xCE, 0x5C, 0xC0, 0xD3, 0x93, 0xD6, 0x40, 0xAF, 0xDA, 0x23, 0x55, 0x83, 0x3A, 0xE6, 0x6C, 0x64,
+ 0xA0, 0x37, 0xC0, 0x47, 0xBA, 0xAA, 0x62, 0x79, 0x56, 0x85, 0x55, 0xC1, 0xEA, 0x80, 0xD5, 0x3C,
+ 0xBB, 0x9F, 0x89, 0xEA, 0x45, 0xFC, 0x59, 0x6C, 0x26, 0xF0, 0x07, 0x72, 0x31, 0xCC, 0x5F, 0x8F,
+ 0xA5, 0x61, 0x20, 0x16, 0x55, 0x4D, 0x87, 0x72, 0x13, 0xE6, 0xA9, 0xB3, 0xAF, 0xBD, 0x42, 0x08,
+ 0x39, 0xD5, 0xCF, 0x81, 0xCA, 0x5E, 0xD0, 0xAB, 0x77, 0xB0, 0x05, 0x7E, 0x73, 0x87, 0xFE, 0xF4,
+ 0xA7, 0x7F, 0x00, 0xBE, 0xF9, 0x67, 0x83, 0x64, 0x61, 0x19, 0x4F, 0x23, 0x21, 0xD9, 0x37, 0xB7,
+ 0x54, 0xD3, 0x2F, 0x0C, 0x39, 0xD2, 0xA4, 0x78, 0xFD, 0x3C, 0x9F, 0x5C, 0xC5, 0x16, 0x55, 0x9B,
+ 0xBB, 0x96, 0x72, 0x13, 0x1D, 0xCC, 0xAF, 0xB4, 0xC1, 0xEB, 0x7D, 0xF9, 0xA1, 0x37, 0x93, 0x13,
+ 0xC3, 0xDB, 0x58, 0xF8, 0x7C, 0xFB, 0x2E, 0x91, 0x7B, 0x6D, 0x21, 0xE2, 0xCE, 0xB1, 0xAF, 0x8A,
+ 0x55, 0x25, 0x5A, 0x08, 0x35, 0xAD, 0xF6, 0x1E, 0x54, 0x56, 0xB9, 0x52, 0xA8, 0x9F, 0x9F, 0x06,
+ 0x9B, 0x30, 0x7B, 0x5F, 0x25, 0x13, 0x7C, 0xD4, 0xA7, 0x56, 0xE3, 0x48, 0x55, 0x40, 0xB8, 0x3E,
+ 0x11, 0x7B, 0x81, 0x89, 0x2E, 0x40, 0x76, 0x1D, 0x4C, 0x30, 0xCF, 0xBE, 0xA6, 0x66, 0x25, 0x69,
+ 0x9B, 0xE7, 0x85, 0x36, 0x71, 0x45, 0xD4, 0x54, 0x24, 0x3B, 0x2D, 0x16, 0x9B, 0xD6, 0xE6, 0x91,
+ 0x13, 0x53, 0x6E, 0x56, 0x21, 0xB6, 0x3C, 0x12, 0x23, 0x20, 0xC9, 0xB7, 0xDD, 0xF1, 0x04, 0x1C,
+ 0x49, 0x58, 0x44, 0x97, 0x4A, 0x21, 0x36, 0x0C, 0x7D, 0xDE, 0x3F, 0x2F, 0xE6, 0x8E, 0x05, 0x42,
+ 0x28, 0x2A, 0xA5, 0x0F, 0xF1, 0x31, 0x7B, 0x9A, 0x1B, 0x36, 0x40, 0x48, 0xC3, 0xC4, 0x59, 0x8F,
+ 0xFF, 0x82, 0x2F, 0xE2, 0x75, 0xEF, 0x54, 0x39, 0x31, 0xC8, 0x5F, 0xD2, 0xDA, 0x74, 0x50, 0x47,
+ 0x45, 0x16, 0xC9, 0xF8, 0x2B, 0xAE, 0x07, 0x6B, 0x18, 0xF6, 0x22, 0x1F, 0xF4, 0x39, 0x6D, 0x13,
+ 0x83, 0x0C, 0xCB, 0xF3, 0x12, 0x1B, 0xB4, 0x27, 0xB6, 0xB1, 0x67, 0x79, 0x29, 0xD7, 0xAF, 0x00,
+ 0xF1, 0xE4, 0x14, 0xB4, 0xA1, 0x95, 0x54, 0x47, 0x19, 0x7B, 0xB0, 0xF6, 0x81, 0x42, 0x94, 0xE4,
+ 0xD3, 0xA3, 0x9D, 0x74, 0xE5, 0x93, 0xEE, 0x02, 0x5A, 0x44, 0x9F, 0x25, 0xCB, 0xB2, 0x8E, 0xEE,
+ 0xD8, 0xE7, 0x02, 0x5D, 0x83, 0x94, 0x68, 0xDD, 0xA4, 0x3E, 0x6A, 0x86, 0xE6, 0x2E, 0xFC, 0x1C,
+ 0xC5, 0xAE, 0x91, 0x7D, 0x34, 0x12, 0xD5, 0x10, 0xD8, 0x4E, 0x34, 0x18, 0x6B, 0x72, 0x0D, 0x8F,
+ 0x28, 0x17, 0xE2, 0x81, 0xD6, 0xE4, 0x70, 0xBB, 0x20, 0x0C, 0xE9, 0xA9, 0x65, 0xEC, 0xDC, 0x80,
+ 0x41, 0x13, 0xB4, 0x53, 0x67, 0x1F, 0xF4, 0xB0, 0xA6, 0x4D, 0xB1, 0x43, 0x29, 0x00, 0xAD, 0x51,
+ 0xE8, 0x4C, 0x6A, 0x62, 0x8B, 0xB9, 0xEE, 0x05, 0x53, 0xE5, 0xBE, 0xCC, 0xDD, 0x08, 0xA9, 0x89,
+ 0x84, 0x04, 0xF3, 0xC4, 0xA9, 0x4E, 0x40, 0x18, 0xE4, 0xF8, 0xEC, 0xB0, 0xF4, 0x7B, 0x69, 0x6D,
+ 0xD1, 0xB3, 0x5F, 0x53, 0x85, 0x14, 0xF5, 0xC9, 0xBE, 0x9D, 0x8E, 0x7B, 0x9A, 0x8C, 0x77, 0xA2,
+ 0xD6, 0x97, 0xA3, 0x35, 0x48, 0x47, 0x93, 0x5C, 0x2D, 0xB7, 0xBA, 0x80, 0xC0, 0xB5, 0xD5, 0x24,
+ 0x40, 0xA8, 0xB6, 0xA6, 0x4E, 0x4C, 0x4C, 0xE8, 0x60, 0xE4, 0xF7, 0xDC, 0x24, 0xD9, 0x0F, 0x3C,
+ 0xC7, 0x86, 0xC9, 0xEB, 0xEA, 0xD9, 0xDC, 0x12, 0x50, 0x30, 0xB2, 0x7D, 0x28, 0x2E, 0x9D, 0x7C,
+ 0xC3, 0x72, 0x6D, 0x22, 0x40, 0x81, 0x1A, 0x5B, 0xED, 0x16, 0xDD, 0x6D, 0x15, 0x83, 0xD1, 0xC6,
+ 0x35, 0xBD, 0x11, 0x1F, 0x0F, 0x60, 0x89, 0x22, 0xCD, 0x63, 0x39, 0x42, 0x2B, 0x05, 0xE5, 0x40,
+ 0x89, 0xC3, 0x64, 0xBC, 0xB2, 0x7B, 0x1E, 0xBF, 0x37, 0x68, 0x0A, 0x82, 0xD8, 0x71, 0x10, 0xE7,
+ 0xD3, 0xEB, 0xF9, 0x24, 0xBD, 0x5F, 0x62, 0x7F, 0xAA, 0xF0, 0x5B, 0xE5, 0x75, 0xCB, 0x84, 0xA4,
+ 0x66, 0x78, 0x80, 0xE4, 0xD5, 0x04, 0x02, 0xE4, 0xE6, 0x79, 0x67, 0xC2, 0x79, 0x92, 0x3C, 0x32,
+ 0x8C, 0xB6, 0x1D, 0x21, 0xDB, 0xB8, 0x91, 0x88, 0x76, 0xBD, 0x20, 0x30, 0x8A, 0x87, 0x49, 0x7F,
+ 0x54, 0x32, 0x95, 0x3D, 0x1F, 0x44, 0xDE, 0xA0, 0xE6, 0x4D, 0x00, 0xE9, 0x1F, 0x12, 0x49, 0x2A,
+ 0x73, 0x58, 0x55, 0xB2, 0x22, 0x36, 0x46, 0x37, 0x6E, 0x89, 0xCF, 0x8E, 0x17, 0x91, 0x8C, 0xD3,
+ 0xAE, 0x40, 0x75, 0x66, 0xAA, 0xAD, 0x37, 0x77, 0x00, 0x9B, 0x56, 0x98, 0x52, 0x1F, 0x41, 0x01,
+ 0x60, 0x6A, 0x3D, 0xB1, 0x07, 0x5F, 0x57, 0x72, 0xE6, 0x69, 0x0B, 0x93, 0xE7, 0x1B, 0xB1, 0x54,
+ 0x26, 0xB0, 0x52, 0xA1, 0xB1, 0x0A, 0x1A, 0x59, 0xBD, 0xA5, 0x70, 0x98, 0x21, 0xCD, 0x09, 0x35,
+ 0x1A, 0x29, 0x03, 0x10, 0xAC, 0x40, 0x90, 0x47, 0xFB, 0xA3, 0x07, 0xB4, 0x43, 0xCC, 0x37, 0x14,
+ 0xC9, 0xA8, 0xD4, 0x5A, 0xD0, 0x70, 0xF9, 0x85, 0xAC, 0xF3, 0xFA, 0xA5, 0x5A, 0x9A, 0xF1, 0xC3,
+ 0x54, 0xDC, 0xE1, 0x00, 0x2D, 0xD6, 0xCF, 0x7A, 0x02, 0x87, 0x8B, 0x49, 0x6C, 0x19, 0xF4, 0x68,
+ 0xDE, 0x5F, 0x11, 0x91, 0xF1, 0x7A, 0xF2, 0x34, 0xA5, 0xDF, 0x42, 0x01, 0x2E, 0x2F, 0x12, 0x91,
+ 0xA9, 0x5E, 0x23, 0x6E, 0xFC, 0x1C, 0x96, 0xFA, 0xE8, 0xBB, 0x4A, 0x42, 0x7F, 0xB7, 0xEE, 0x12,
+ 0x3C, 0x25, 0xDB, 0x7B, 0x95, 0xED, 0xF6, 0xAB, 0xBC, 0x59, 0xE4, 0xF3, 0x15, 0x71, 0xAB, 0xAB,
+ 0x1B, 0x27, 0x6B, 0x48, 0x44, 0x52, 0xC3, 0xA3, 0xB0, 0xC1, 0x49, 0xCE, 0x74, 0xD9, 0x9D, 0xC8,
+ 0xAC, 0x71, 0xB5, 0xB9, 0x1B, 0xA6, 0xD3, 0xF9, 0x84, 0x30, 0xAE, 0x9E, 0x69, 0x31, 0xB8, 0xB4,
+ 0x64, 0xE8, 0xD9, 0x47, 0xBD, 0x63, 0xB5, 0x25, 0x30, 0x1A, 0xD7, 0xB2, 0xC0, 0xBD, 0x75, 0x30,
+ 0x55, 0x02, 0x5B, 0xC6, 0xE6, 0x63, 0x69, 0x65, 0xAF, 0xE7, 0x7B, 0xAB, 0x5D, 0xA6, 0xA5, 0xC4,
+ 0xAF, 0xDE, 0xAC, 0x67, 0x1E, 0x7F, 0x73, 0x55, 0x2C, 0x33, 0x25, 0x83, 0x24, 0x3F, 0xB0, 0x48,
+ 0xFC, 0x08, 0xB9, 0x60, 0xBB, 0xFB, 0x3D, 0xFD, 0xA3, 0xF6, 0xF2, 0x1B, 0x89, 0x82, 0x87, 0xD1,
+ 0x10, 0xE5, 0xBD, 0xEF, 0x16, 0xA7, 0x3F, 0x15, 0x32, 0x11, 0x50, 0xB9, 0x7D, 0x77, 0x15, 0x0F,
+ 0xBA, 0xFE, 0x76, 0x0A, 0x4F, 0xF2, 0xA0, 0xFB, 0x2D, 0xF1, 0xCE, 0x5E, 0xE7, 0x50, 0x6A, 0xA0,
+ 0xB2, 0xB4, 0xEE, 0x2B, 0xD5, 0x3B, 0x03, 0x07, 0xB0, 0x40, 0x4A, 0x26, 0xF4, 0x3E, 0x1F, 0xC4,
+ 0x58, 0x80, 0x8A, 0x3B, 0x00, 0x52, 0x2B, 0x53, 0xBF, 0xD4, 0x8F, 0xEE, 0x6D, 0xA4, 0x0D, 0xF7,
+ 0x82, 0xF8, 0x53, 0xDA, 0xF6, 0x53, 0xAF, 0xF8, 0xD2, 0xD8, 0xFB, 0x1F, 0x2D, 0x98, 0x87, 0xDA,
+ 0x19, 0xAC, 0x48, 0x6B, 0xEA, 0xDE, 0x08, 0xA6, 0x13, 0x37, 0x1B, 0x2C, 0x15, 0x60, 0xB2, 0xDB,
+ 0x28, 0x0E, 0x2E, 0xA3, 0x4A, 0xB1, 0xF2, 0x5C, 0x48, 0x69, 0x46, 0xFA, 0x08, 0x9F, 0xE9, 0x65,
+ 0x2F, 0x3A, 0x29, 0xB0, 0x88, 0xB5, 0x13, 0x44, 0x41, 0x92, 0x30, 0x74, 0x9C, 0x9C, 0xD8, 0xC8,
+ 0xB1, 0x59, 0x42, 0x67, 0xAC, 0xC8, 0x0D, 0xFF, 0x8E, 0x52, 0x4C, 0xED, 0x86, 0xFF, 0x4E, 0x45,
+ 0xBE, 0xC4, 0xAF, 0x32, 0xE4, 0xBC, 0x41, 0xC5, 0xDC, 0x3F, 0x71, 0x8C, 0x2C, 0xAD, 0x78, 0x7E,
+ 0x79, 0x47, 0xB2, 0x02, 0xA6, 0x11, 0xDE, 0x0F, 0x5D, 0xAD, 0xFE, 0x8D, 0x6B, 0x09, 0xEA, 0x28,
+ 0x4B, 0xB1, 0x9F, 0xD3, 0x09, 0x4A, 0x77, 0x52, 0x58, 0xA2, 0x31, 0xC1, 0x48, 0xF1, 0x35, 0x48,
+ 0x46, 0x93, 0xDB, 0x22, 0xFD, 0x06, 0x49, 0xEB, 0x22, 0xE8, 0xB3, 0x9C, 0xCF, 0x40, 0x8B, 0xC7,
+ 0x35, 0x07, 0xBD, 0x2C, 0x21, 0xFB, 0x15, 0x53, 0x38, 0x0B, 0x61, 0x10, 0x75, 0x11, 0x17, 0x1F,
+ 0xE1, 0x76, 0x10, 0x53, 0x66, 0x2E, 0x36, 0x65, 0xF6, 0x62, 0x19, 0xAC, 0x68, 0x63, 0x1D, 0x17,
+ 0x6C, 0x49, 0x6C, 0xA8, 0x40, 0x49, 0xFC, 0xBA, 0x63, 0x25, 0x5E, 0x79, 0x07, 0x10, 0xC3, 0x3C,
+ 0xC5, 0x81, 0x14, 0xBB, 0xCD, 0xC3, 0x63, 0x36, 0x9F, 0xB9, 0x68, 0x54, 0x8D, 0x31, 0x66, 0xC8,
+ 0xF7, 0x4A, 0xA0, 0x68, 0x8A, 0xCC, 0xE2, 0xB8, 0x50, 0x88, 0x7B, 0xFF, 0x38, 0xE0, 0x8B, 0x90,
+ 0x0C, 0x98, 0xF1, 0xC5, 0x5F, 0xFA, 0x2A, 0x37, 0x6A, 0x3C, 0x39, 0xC0, 0xF1, 0x29, 0x0F, 0xC1,
+ 0xA6, 0xCE, 0xCC, 0x98, 0xD7, 0x9C, 0xAE, 0x71, 0xAB, 0xFE, 0xA1, 0xC6, 0x0E, 0xF7, 0xE7, 0x60,
+ 0x9B, 0x63, 0x50, 0x00, 0x8B, 0x1A, 0xC4, 0xF2, 0xDB, 0xFF, 0xCB, 0xC8, 0xDC, 0x23, 0x49, 0xA9,
+ 0xFB, 0xF3, 0x1A, 0x09, 0xA5, 0x27, 0xD5, 0x18, 0x4C, 0x84, 0x2E, 0x6E, 0x56, 0x39, 0x3F, 0xD3,
+ 0x08, 0xDE, 0x76, 0x90, 0xC1, 0x43, 0x33, 0x32, 0xF8, 0x76, 0x59, 0x48, 0x14, 0xCD, 0x2E, 0x19,
+ 0xDF, 0x8B, 0x72, 0xAF, 0xB2, 0x2F, 0xD9, 0x5C, 0x5C, 0x87, 0x8C, 0x3A, 0x66, 0x86, 0xBD, 0xEA,
+ 0x82, 0xFC, 0x36, 0xFA, 0x05, 0xE8, 0xE0, 0x07, 0x53, 0xD8, 0x68, 0xD4, 0x86, 0x3A, 0xA4, 0x64,
+ 0xD5, 0x13, 0x16, 0x3F, 0x9B, 0x1D, 0x60, 0x3A, 0x46, 0xAF, 0x99, 0x89, 0xBF, 0x1A, 0xD2, 0x45,
+ 0xF8, 0xD7, 0x86, 0x6E, 0x0C, 0x3A, 0xCD, 0x69, 0x05, 0x1A, 0x07, 0x7D, 0x52, 0x96, 0xE1, 0xB6,
+ 0x84, 0xE9, 0x63, 0x5B, 0x3D, 0xEE, 0xF6, 0xDC, 0x8A, 0xE2, 0xDC, 0xFA, 0xDD, 0xD6, 0x5F, 0xA3,
+ 0x17, 0xD3, 0xE6, 0x3C, 0xC6, 0xEE, 0x7C, 0x84, 0x6F, 0x82, 0x9A, 0x01, 0xF7, 0xC4, 0x71, 0x69,
+ 0x0B, 0x56, 0xEB, 0x48, 0xB3, 0x09, 0x23, 0x05, 0x26, 0x47, 0xD5, 0x8B, 0x2D, 0x8B, 0x91, 0x73,
+ 0xF8, 0x14, 0xAC, 0xE6, 0xEE, 0xB3, 0x40, 0x6D, 0x43, 0x70, 0x18, 0x8A, 0xA4, 0xA9, 0x9A, 0x66,
+ 0x77, 0x85, 0x7E, 0x0F, 0x48, 0x24, 0x0B, 0xF1, 0x15, 0xEF, 0xBB, 0x25, 0xB8, 0x44, 0x43, 0x8E,
+ 0x91, 0x29, 0x74, 0x43, 0xEC, 0xF9, 0x31, 0x48, 0x97, 0xFC, 0xDF, 0x5A, 0xA9, 0x3B, 0x50, 0xAB,
+ 0x9E, 0xE5, 0x93, 0xF3, 0x39, 0xD8, 0x4E, 0xAB, 0x7F, 0xAD, 0x2E, 0x83, 0x7F, 0x85, 0x46, 0x24,
+ 0xE7, 0x76, 0xF4, 0x64, 0xFF, 0x6A, 0xDA, 0x79, 0x2F, 0x49, 0x16, 0xD8, 0xF1, 0x54, 0xD6, 0x37,
+ 0xCB, 0x50, 0x13, 0xA0, 0xB2, 0x4E, 0xDC, 0x1E, 0xF0, 0x59, 0xB4, 0x4F, 0xB4, 0x9B, 0x6D, 0x17,
+ 0xA1, 0x4C, 0x25, 0x24, 0x71, 0x3C, 0x06, 0x6D, 0xEE, 0x35, 0x8D, 0xA7, 0x6E, 0x1C, 0x59, 0x17,
+ 0x7A, 0xA5, 0xB4, 0x14, 0x9F, 0x12, 0x8D, 0xE0, 0xC1, 0xEE, 0xAA, 0xE5, 0xF6, 0x9D, 0x2F, 0x81,
+ 0x75, 0x9F, 0xCC, 0xE4, 0xE1, 0x87, 0x85, 0x65, 0x86, 0x08, 0xD4, 0xC2, 0xC5, 0xE1, 0x87, 0x4C,
+ 0x76, 0x25, 0xFC, 0x9F, 0x70, 0x08, 0x5C, 0x69, 0xB2, 0xEF, 0xDD, 0x2E, 0x41, 0xAF, 0x8E, 0x8A,
+ 0x51, 0x0F, 0x1E, 0x7D, 0xD2, 0x24, 0x8C, 0x70, 0x4D, 0xB9, 0x22, 0x8B, 0x39, 0x51, 0xEF, 0xCB,
+ 0x19, 0x16, 0xDC, 0x38, 0xF2, 0x95, 0xE6, 0x39, 0xD0, 0x2A, 0x59, 0x2D, 0xD0, 0xFA, 0xC3, 0x7E,
+ 0xC7, 0x43, 0xF1, 0x74, 0x11, 0x1D, 0x4D, 0xA2, 0x35, 0x35, 0xCA, 0x97, 0x05, 0x02, 0x2B, 0xA2,
+ 0x82, 0x23, 0x36, 0xEF, 0xFC, 0xEC, 0xA9, 0x0A, 0x1B, 0xCA, 0x55, 0x77, 0x11, 0xAC, 0x3F, 0xCC,
+ 0xA7, 0xF5, 0x12, 0x1D, 0x7C, 0x4C, 0xA3, 0xF9, 0x14, 0x85, 0x1D, 0x8E, 0x5E, 0xD3, 0x49, 0x52,
+ 0x9D, 0x37, 0x6D, 0x8E, 0x35, 0x8C, 0xA9, 0xFE, 0x37, 0x23, 0x56, 0xB8, 0x05, 0x65, 0x54, 0x07,
+ 0xF2, 0xC6, 0xED, 0x70, 0x10, 0xA1, 0x97, 0x77, 0xD4, 0xD7, 0x77, 0x50, 0x50, 0x16, 0x8C, 0x6E,
+ 0x45, 0xED, 0x9D, 0xB4, 0xF3, 0xE5, 0x82, 0x37, 0x99, 0x67, 0x53, 0x68, 0xC6, 0x22, 0x33, 0xFD,
+ 0x0C, 0xAD, 0x18, 0x24, 0x76, 0x06, 0x26, 0x5D, 0x9B, 0x14, 0xF6, 0xCC, 0xB8, 0x48, 0x7E, 0x85,
+ 0x15, 0x35, 0xC7, 0x16, 0x1F, 0xE5, 0x3A, 0x41, 0x9B, 0xB6, 0xA8, 0x64, 0x48, 0x57, 0x32, 0x60,
+ 0x91, 0xE5, 0xC1, 0x41, 0xEC, 0x4C, 0x97, 0xEF, 0xD4, 0xF8, 0x84, 0x41, 0x61, 0x47, 0x17, 0x08,
+ 0x96, 0xC3, 0xBB, 0xF3, 0xB7, 0x2C, 0xF6, 0xB9, 0xA1, 0x89, 0x78, 0x79, 0x73, 0x89, 0x4C, 0x07,
+ 0x34, 0x4E, 0x75, 0x88, 0xA8, 0x18, 0x54, 0x3C, 0xF3, 0x8F, 0xED, 0x04, 0xE7, 0x86, 0xD7, 0x8B,
+ 0xED, 0x34, 0x6B, 0xCF, 0x29, 0x1F, 0x7A, 0x54, 0x7E, 0x8A, 0xE1, 0x81, 0x4C, 0xEE, 0xEA, 0x23,
+ 0x7B, 0x3F, 0x16, 0x24, 0x71, 0x9D, 0x97, 0xF8, 0x5B, 0xD0, 0x73, 0x86, 0xFA, 0x21, 0x27, 0x3E,
+ 0x73, 0x1F, 0x0C, 0x36, 0x87, 0x56, 0x2F, 0x21, 0x10, 0x38, 0xFD, 0x14, 0xB4, 0x1E, 0xAB, 0x3B,
+ 0xC1, 0x54, 0xE2, 0xDB, 0xB5, 0x76, 0xF2, 0x61, 0x14, 0xBA, 0x19, 0x23, 0x7C, 0x53, 0x30, 0xC8,
+ 0x0C, 0x62, 0x61, 0x93, 0x41, 0x83, 0x1C, 0xA7, 0x2D, 0x15, 0xD5, 0x67, 0x95, 0xEE, 0xBD, 0xDB,
+ 0x27, 0x31, 0x16, 0x81, 0xC9, 0x3A, 0x78, 0xFC, 0xB2, 0x26, 0x10, 0x3F, 0xCA, 0x89, 0x11, 0xB0,
+ 0x03, 0xE1, 0xB9, 0x7E, 0xDE, 0x0C, 0x34, 0xD1, 0xAA, 0x72, 0x34, 0x90, 0xD8, 0x62, 0x74, 0xAE,
+ 0xA7, 0x63, 0x96, 0xCD, 0xBA, 0x58, 0x60, 0x6E, 0xD1, 0x6C, 0x6B, 0xAE, 0xB2, 0x15, 0x7E, 0x12,
+ 0x1A, 0x29, 0x03, 0x2E, 0x28, 0x98, 0x59, 0x52, 0xE2, 0x94, 0xAC, 0x18, 0x00, 0x1B, 0x2D, 0xCC,
+ 0xE0, 0xDC, 0x71, 0xA0, 0x97, 0xAF, 0xA1, 0xD3, 0x9D, 0xA6, 0xEE, 0x62, 0xB4, 0x51, 0xBE, 0xE9,
+ 0xF0, 0x23, 0xBD, 0x5A, 0xED, 0x16, 0xEC, 0x01, 0x70, 0x8F, 0x39, 0xF2, 0xF9, 0xD8, 0x6D, 0x54,
+ 0x6A, 0xD3, 0x70, 0x7B, 0xE4, 0x6E, 0x1D, 0x40, 0xF4, 0x4A, 0x04, 0xA6, 0x3A, 0x2B, 0x76, 0x62,
+ 0x7F, 0x04, 0xC2, 0x0B, 0xB0, 0xAC, 0xB6, 0xE1, 0x85, 0x8A, 0xD5, 0x35, 0xCA, 0xDF, 0xDE, 0x8A,
+ 0x57, 0x34, 0x51, 0xD0, 0x44, 0xC0, 0xBB, 0x51, 0x16, 0x44, 0x3F, 0xC7, 0xC4, 0x10, 0x3B, 0x06,
+ 0xB2, 0xB7, 0xA1, 0xF4, 0x9C, 0x2F, 0xFA, 0xD3, 0x46, 0x51, 0xC3, 0x25, 0x9A, 0x94, 0xB8, 0x78,
+ 0xE3, 0x3B, 0x63, 0x64, 0x61, 0xF6, 0x1D, 0x4C, 0x9C, 0xFF, 0x68, 0x18, 0xCC, 0x51, 0xD0, 0xC3,
+ 0x0B, 0x67, 0x0D, 0xED, 0x78, 0xF4, 0xD7, 0x26, 0x41, 0x0C, 0xEE, 0xB7, 0x35, 0x72, 0xDA, 0x39,
+ 0x3D, 0x20, 0x35, 0xF0, 0xC8, 0xF2, 0x6A, 0x29, 0xE3, 0x03, 0x90, 0x80, 0xE7, 0x76, 0xBA, 0x78,
+ 0x5E, 0x5C, 0x9A, 0x35, 0x05, 0x9C, 0x2E, 0xB8, 0xA8, 0x86, 0x2F, 0xD3, 0xEA, 0x37, 0x7D, 0xED,
+ 0x66, 0xA8, 0x4E, 0xEF, 0xA3, 0xBF, 0x3F, 0x85, 0x21, 0x94, 0x59, 0x23, 0x3A, 0xB5, 0x42, 0x6D,
+ 0x95, 0x3D, 0x9A, 0xE2, 0x2A, 0x08, 0xC9, 0xD5, 0x6D, 0xC3, 0x6C, 0x09, 0x09, 0xAC, 0x48, 0x4A,
+ 0x7A, 0x46, 0xB7, 0x34, 0x03, 0xF0, 0x8A, 0x33, 0x3E, 0xAE, 0x27, 0xFD, 0x2D, 0xF8, 0xAB, 0xE4,
+ 0x82, 0x81, 0x93, 0x65, 0x4E, 0xC2, 0x0D, 0x6D, 0xD0, 0xEA, 0xDF, 0x8D, 0xA5, 0xD6, 0xA1, 0x45,
+ 0x7F, 0x08, 0xE1, 0x93, 0x7E, 0x87, 0x50, 0x84, 0xDE, 0x7D, 0x03, 0x9F, 0x3C, 0xD9, 0x81, 0x31,
+ 0x1B, 0x1E, 0xA1, 0x82, 0x17, 0x76, 0xE4, 0x3F, 0x45, 0xC9, 0x2E, 0x8E, 0x72, 0xE3, 0x43, 0xF1,
+ 0x84, 0xF2, 0xFC, 0x0B, 0x8E, 0x6E, 0xB4, 0x5F, 0x10, 0xF2, 0x3E, 0xC0, 0x7D, 0x57, 0xC2, 0x3E,
+ 0xE9, 0x15, 0x4F, 0xC8, 0x0B, 0x65, 0x53, 0xBB, 0xD9, 0x50, 0xA2, 0x5C, 0xCB, 0x11, 0x14, 0x77,
+ 0xDF, 0x2A, 0x18, 0x43, 0x3E, 0xE0, 0x1D, 0x30, 0x6E, 0xF3, 0xFE, 0xB7, 0x3D, 0x7B, 0x22, 0x7A,
+ 0x73, 0xF4, 0x62, 0xBA, 0x82, 0x51, 0x5D, 0x42, 0x0B, 0x27, 0x0E, 0x13, 0x27, 0xB4, 0xB5, 0xB4,
+ 0x29, 0xDA, 0x94, 0xB3, 0x99, 0x9B, 0x3B, 0x37, 0x6E, 0xB2, 0x28, 0x26, 0x52, 0xCF, 0x5C, 0xCB,
+ 0x74, 0x95, 0x30, 0x50, 0x48, 0xC9, 0xAD, 0xEE, 0x8B, 0xC6, 0x72, 0x55, 0xEC, 0x28, 0x14, 0x00,
+ 0x78, 0xC4, 0x42, 0x61, 0xBF, 0x96, 0x81, 0x06, 0xFA, 0x45, 0x4F, 0xC0, 0x1F, 0xC0, 0x4F, 0xCA,
+ 0xEE, 0xBC, 0xCC, 0xF5, 0xAA, 0xC4, 0x78, 0x0A, 0x16, 0xF5, 0xD2, 0x65, 0x6D, 0xCD, 0x74, 0x2D,
+ 0x87, 0x93, 0xBC, 0x51, 0x02, 0x68, 0xE0, 0x72, 0xE0, 0x5F, 0x98, 0x1E, 0x7D, 0x2B, 0x9F, 0xCD,
+ 0x1D, 0xC7, 0x20, 0x34, 0xF5, 0x95, 0x82, 0x7A, 0x04, 0x80, 0x35, 0x96, 0x88, 0xB8, 0x1C, 0x26,
+ 0x16, 0x62, 0xD9, 0x32, 0x91, 0xD0, 0x0F, 0x87, 0x23, 0x4E, 0x44, 0x25, 0x7C, 0x2A, 0xD4, 0x8E,
+ 0x43, 0x0B, 0xEC, 0xA4, 0xD0, 0x92, 0x46, 0xEE, 0xB1, 0xC3, 0xC4, 0x61, 0xE5, 0xA9, 0x90, 0x0D,
+ 0x03, 0x00, 0xBD, 0xA5, 0xEB, 0x81, 0xB0, 0x2B, 0xAB, 0xEF, 0x5F, 0x70, 0x6A, 0x80, 0x2F, 0xA1,
+ 0xDC, 0xB3, 0x47, 0x7F, 0xF4, 0x8A, 0x41, 0xB2, 0x94, 0xEA, 0x06, 0x91, 0x92, 0x1D, 0xEF, 0x4A,
+ 0xF1, 0x81, 0xAE, 0x8E, 0xA6, 0xE8, 0x7B, 0xC1, 0x46, 0xDD, 0x33, 0xBE, 0x14, 0x1C, 0x24, 0x27,
+ 0xD8, 0xE0, 0xE7, 0x69, 0x9E, 0xFC, 0x53, 0x7E, 0x40, 0x2C, 0x13, 0xA7, 0xD6, 0x5A, 0x82, 0xD6,
+ 0xFF, 0x09, 0xA8, 0x6B, 0xB1, 0x60, 0x82, 0x0A, 0xDD, 0x90, 0x1C, 0xE4, 0x6A, 0xA3, 0x18, 0xFB,
+ 0x66, 0xD4, 0x4F, 0x9B, 0x28, 0xB2, 0x5B, 0xE7, 0x73, 0xCA, 0x33, 0x2F, 0x75, 0x57, 0x9B, 0xEA,
+ 0x36, 0x03, 0xC4, 0x06, 0x22, 0x4D, 0xDE, 0x30, 0x57, 0x4C, 0x7C, 0x90, 0xE5, 0xCF, 0x88, 0x39,
+ 0xF5, 0x19, 0x18, 0x18, 0x2A, 0x1A, 0x16, 0x11, 0xD8, 0x49, 0xCF, 0x5A, 0x4A, 0x51, 0x1B, 0x78,
+ 0x1D, 0xF1, 0x65, 0xB2, 0x7C, 0xC7, 0xD4, 0xF1, 0xB1, 0x3D, 0xA3, 0x5C, 0x0A, 0xB5, 0x3E, 0x72,
+ 0x4B, 0xE3, 0x28, 0xEA, 0xC9, 0x73, 0x9F, 0x36, 0xC1, 0x50, 0x4F, 0x19, 0x33, 0x47, 0xAB, 0x46,
+ 0x71, 0x60, 0x0E, 0xE8, 0x1D, 0xD2, 0xDB, 0xD3, 0xD8, 0xF3, 0xA9, 0xD7, 0xE5, 0x25, 0x2B, 0xA2,
+ 0x75, 0x36, 0x77, 0x55, 0x00, 0x8E, 0x67, 0xF1, 0xF9, 0xDE, 0x38, 0x45, 0x24, 0x84, 0x01, 0x15,
+ 0xA6, 0xD2, 0x30, 0x91, 0x71, 0xE3, 0xA6, 0xA7, 0xF4, 0x52, 0x77, 0x76, 0x74, 0xC8, 0x43, 0x76,
+ 0x3E, 0xBF, 0x61, 0xB1, 0xBD, 0x1C, 0x68, 0x10, 0x8B, 0x69, 0xCD, 0x90, 0x1C, 0x2D, 0x76, 0xD4,
+ 0x4B, 0x3F, 0xF4, 0x3F, 0xC0, 0x8F, 0xB2, 0x13, 0x2D, 0x07, 0xC0, 0x9A, 0x03, 0x74, 0x11, 0x0A,
+ 0xAA, 0x74, 0x61, 0xB7, 0x5F, 0x64, 0xE8, 0x0D, 0xE7, 0x57, 0x4C, 0x46, 0x36, 0xAE, 0x54, 0x71,
+ 0xFD, 0x02, 0xD1, 0x6E, 0x18, 0x06, 0xCA, 0x74, 0x7F, 0xA8, 0xF4, 0xDF, 0x1A, 0x37, 0xF2, 0xD6,
+ 0x43, 0xD3, 0xF5, 0x70, 0x22, 0xFD, 0x78, 0x24, 0x65, 0xF1, 0x90, 0x79, 0xE2, 0x12, 0x31, 0xBD,
+ 0xAA, 0xFF, 0xA1, 0x89, 0x05, 0xBE, 0xAE, 0xCA, 0x1A, 0x4B, 0x9A, 0x6D, 0x24, 0xF3, 0xDF, 0x4E,
+ 0xB2, 0xB9, 0x71, 0x10, 0x96, 0xCD, 0xA5, 0xEB, 0x99, 0xDA, 0x5D, 0xB1, 0xF4, 0x50, 0x30, 0x8F,
+ 0x51, 0x6F, 0xDF, 0xF5, 0x7F, 0xB5, 0x8B, 0xD9, 0x58, 0xD2, 0x0C, 0x72, 0x00, 0xB2, 0x32, 0x62,
+ 0x18, 0x78, 0xBD, 0x8A, 0x2B, 0x07, 0xB4, 0x5E, 0x4E, 0xB5, 0x1B, 0xE4, 0x4D, 0xD4, 0x59, 0x29,
+ 0x8E, 0xAA, 0x97, 0x71, 0x66, 0x7F, 0x9E, 0x3B, 0x57, 0xE0, 0x35, 0x03, 0x6B, 0xF7, 0x12, 0x3C,
+ 0x5A, 0xAD, 0x1A, 0xF1, 0xC6, 0xC9, 0x5A, 0xF0, 0x1D, 0x25, 0x15, 0xE4, 0x3B, 0x45, 0x88, 0x70,
+ 0x77, 0x7F, 0x33, 0xC0, 0xA7, 0x50, 0x6F, 0x22, 0x9B, 0xB6, 0xAF, 0x35, 0xF4, 0xC1, 0xEC, 0xEC,
+ 0xF7, 0x7B, 0x59, 0x45, 0x2E, 0x8C, 0x45, 0x94, 0xCF, 0xF2, 0x64, 0xD4, 0x99, 0x78, 0xB6, 0xD3,
+ 0x20, 0x42, 0x49, 0xF4, 0x8E, 0xC4, 0x4E, 0xC9, 0x63, 0x10, 0xE7, 0x57, 0xA8, 0x33, 0xBB, 0xE3,
+ 0xF2, 0xDF, 0x38, 0x24, 0xF4, 0xC5, 0xEA, 0x86, 0xAF, 0xB7, 0xB1, 0x34, 0x46, 0x74, 0xAD, 0x96,
+ 0x84, 0x5F, 0x44, 0x16, 0xE2, 0x54, 0xCA, 0x6A, 0x93, 0xE1, 0x59, 0xBD, 0x56, 0xCF, 0x8C, 0x3A,
+ 0x3C, 0x1B, 0xAB, 0xBE, 0x6A, 0x0E, 0xCA, 0x56, 0x20, 0x1C, 0xDE, 0xDF, 0x0A, 0x5D, 0x7F, 0x55,
+ 0xF9, 0x9E, 0x21, 0x9D, 0x98, 0x37, 0xFD, 0xFE, 0xE7, 0xD7, 0xDC, 0x87, 0xD1, 0xC5, 0x60, 0xF5,
+ 0x91, 0xD9, 0x10, 0x95, 0x6C, 0x24, 0x5B, 0x0F, 0x59, 0x54, 0x4D, 0x04, 0xE8, 0xF8, 0x33, 0x94,
+ 0x1D, 0x00, 0x72, 0xCE, 0x6B, 0xCD, 0x90, 0xC7, 0x6A, 0x9F, 0xF4, 0xE7, 0x5B, 0x67, 0x52, 0xBB,
+ 0xB6, 0x58, 0x19, 0xBB, 0xD5, 0x09, 0x0B, 0x8C, 0x30, 0xBE, 0x21, 0xDA, 0xCB, 0xE7, 0x67, 0xDC,
+ 0x24, 0x00, 0xDD, 0x1A, 0x43, 0x13, 0x71, 0x44, 0x11, 0xA1, 0xA5, 0x9D, 0x9E, 0xD1, 0x19, 0xE4,
+ 0x9D, 0x59, 0x2D, 0xF9, 0x9F, 0x8D, 0x2D, 0x09, 0x01, 0x32, 0x35, 0xC7, 0x2E, 0x12, 0x15, 0x84,
+ 0x88, 0x9F, 0xA7, 0xA2, 0x48, 0x72, 0xA6, 0xB2, 0xE0, 0x81, 0x8A, 0xB1, 0x07, 0x21, 0x5D, 0x9D,
+ 0x74, 0x1D, 0x3D, 0x98, 0x24, 0x1E, 0x4C, 0x45, 0xBD, 0x45, 0x3F, 0x1E, 0x31, 0x5D, 0xBE, 0x8C,
+ 0x4F, 0xDD, 0x1D, 0x0C, 0xA7, 0xFC, 0x5C, 0xA3, 0x20, 0x13, 0x71, 0x9F, 0xB8, 0x0E, 0x50, 0xFA,
+ 0x27, 0x5A, 0xA0, 0x91, 0x28, 0xCA, 0xDF, 0x43, 0x39, 0x18, 0xA2, 0x9F, 0x60, 0xAB, 0xEC, 0x2B,
+ 0x89, 0x03, 0x03, 0x58, 0xB0, 0xA0, 0x76, 0x46, 0xBB, 0x2A, 0x37, 0xEF, 0xD9, 0xD7, 0xDD, 0x93,
+ 0x40, 0x0A, 0x13, 0x7E, 0xF6, 0x84, 0xB7, 0x34, 0x10, 0xB2, 0x31, 0x83, 0x09, 0x66, 0x78, 0xA1,
+ 0x60, 0xD5, 0x30, 0xC4, 0x82, 0xD4, 0x2E, 0x6D, 0xFD, 0x8B, 0x01, 0x84, 0x91, 0x78, 0x4A, 0x4E,
+ 0x2A, 0x85, 0x82, 0xC9, 0x92, 0x0D, 0x28, 0x32, 0x26, 0xE5, 0x25, 0x35, 0x09, 0x79, 0x04, 0xA5,
+ 0xE4, 0xFA, 0x35, 0xE0, 0xB3, 0x87, 0x8B, 0x18, 0x02, 0xED, 0xEC, 0x7B, 0x34, 0x56, 0xAE, 0x6C,
+ 0x00, 0x3C, 0x8F, 0xEF, 0xA6, 0x06, 0xFC, 0xBD, 0xD9, 0x35, 0x47, 0x79, 0x0F, 0xB4, 0x49, 0x7D,
+ 0x9A, 0x1B, 0xB9, 0xEE, 0xB4, 0xFB, 0xDA, 0xAA, 0xCD, 0xEF, 0xA1, 0xD6, 0xD4, 0xCA, 0x7F, 0xE8,
+ 0x1D, 0x91, 0x72, 0x83, 0xB6, 0x4B, 0x86, 0xE4, 0xEC, 0x27, 0xD9, 0xEF, 0xDC, 0x0D, 0xA0, 0x25,
+ 0xE8, 0xD8, 0xEA, 0xC0, 0xD1, 0x5C, 0x58, 0x00, 0xFD, 0x31, 0x48, 0x69, 0xD7, 0x09, 0xFD, 0xD4,
+ 0x1A, 0x8D, 0x5B, 0xE7, 0xA6, 0xE1, 0x9A, 0xF6, 0x1A, 0x03, 0xF9, 0x2D, 0x2E, 0x42, 0xC9, 0x93,
+ 0xCA, 0x31, 0xAA, 0xF1, 0xBB, 0x52, 0xCF, 0x20, 0x01, 0x67, 0xE0, 0x7D, 0x80, 0x69, 0xBA, 0x81,
+ 0xF5, 0x3A, 0x55, 0x40, 0x4E, 0x4F, 0x9B, 0xDD, 0x0F, 0xF9, 0x20, 0xB8, 0x4A, 0x16, 0x58, 0x21,
+ 0x6D, 0x71, 0x42, 0x78, 0xC4, 0x25, 0x3D, 0x6F, 0x9C, 0xC5, 0xE1, 0x2B, 0x39, 0xE0, 0x52, 0x07,
+ 0x4A, 0xFF, 0x62, 0x2C, 0xD2, 0xAB, 0xF3, 0x5B, 0x20, 0xB3, 0x85, 0x44, 0x24, 0x84, 0x8C, 0x3C,
+ 0x38, 0x09, 0x9A, 0x3A, 0x4E, 0xAF, 0xBC, 0xAB, 0x6E, 0x0D, 0x60, 0x30, 0xBA, 0x04, 0xAA, 0x74,
+ 0x93, 0x15, 0x14, 0xB8, 0xD4, 0x20, 0xD6, 0x2F, 0x2B, 0x23, 0x7F, 0x03, 0xC1, 0x3F, 0xF0, 0xE2,
+ 0xBA, 0x77, 0x9C, 0xF3, 0x83, 0xE5, 0x61, 0x11, 0xA2, 0x77, 0x9D, 0xB8, 0x65, 0xB5, 0x87, 0xC2,
+ 0xFD, 0xEA, 0x9E, 0x6E, 0xBA, 0x5D, 0x5E, 0x76, 0x46, 0x49, 0x4E, 0x5A, 0x5F, 0x4C, 0x96, 0xB1,
+ 0x5F, 0x6A, 0xE5, 0xA2, 0xC2, 0xDB, 0xC6, 0x66, 0x92, 0xD7, 0xD4, 0x80, 0x6F, 0x63, 0x01, 0x1C,
+ 0x0D, 0x13, 0xB5, 0xA9, 0x72, 0x8B, 0x6B, 0xA6, 0xF0, 0x98, 0xE4, 0xC6, 0xF8, 0x46, 0x23, 0x61,
+ 0x1E, 0x4C, 0xFD, 0xFF, 0x3E, 0x4C, 0x78, 0xE8, 0x49, 0xCE, 0xA6, 0xD0, 0x5C, 0x2B, 0x85, 0x7D,
+ 0xB4, 0xF5, 0x7D, 0x71, 0x1C, 0x89, 0x57, 0x42, 0x6A, 0x7A, 0x71, 0x44, 0x75, 0x01, 0x90, 0xC3,
+ 0xBF, 0x95, 0x7B, 0x0A, 0x4E, 0x01, 0x0A, 0x52, 0xF4, 0xA0, 0x21, 0x94, 0x7C, 0xEB, 0xA9, 0xEB,
+ 0xAD, 0x1B, 0xBE, 0x78, 0x98, 0x04, 0xC4, 0x26, 0x20, 0x73, 0x5F, 0xB5, 0x45, 0x6C, 0xE2, 0xC7,
+ 0x04, 0xD2, 0xEB, 0x67, 0xE5, 0x8F, 0x2F, 0xA0, 0x66, 0x4C, 0xBD, 0x36, 0x2C, 0xFE, 0x8E, 0x40,
+ 0x46, 0xB6, 0xAB, 0x2F, 0xCF, 0x1F, 0xA1, 0x3E, 0xBF, 0x96, 0x61, 0x74, 0x68, 0xD6, 0x82, 0x1D,
+ 0x12, 0xD5, 0xFD, 0xB9, 0x45, 0xDA, 0x8D, 0x2B, 0x76, 0xDE, 0x9C, 0x65, 0xA0, 0x2D, 0x76, 0x2F,
+ 0x49, 0x2E, 0xEC, 0x27, 0xD4, 0x40, 0x26, 0xA3, 0x06, 0x01, 0x2E, 0x60, 0x04, 0x94, 0x43, 0xA4,
+ 0x79, 0x5D, 0xEA, 0xD8, 0xD1, 0x5B, 0x95, 0xF2, 0x2E, 0x13, 0x17, 0x9E, 0xED, 0x7A, 0x7E, 0x83,
+ 0x86, 0xDF, 0xD1, 0xD4, 0xE9, 0x00, 0x55, 0x8D, 0xCA, 0x4F, 0x18, 0x74, 0x4E, 0x5E, 0x7C, 0xAC,
+ 0xE9, 0x4A, 0x25, 0xA7, 0x3A, 0x84, 0x43, 0xF5, 0x77, 0x74, 0x1E, 0xDC, 0x32, 0xDB, 0x50, 0xCF,
+ 0xF8, 0xAC, 0x01, 0x37, 0x33, 0x59, 0xBE, 0xF5, 0xC2, 0x98, 0xE7, 0x09, 0x29, 0xE3, 0x6E, 0xBC,
+ 0x22, 0x1D, 0x20, 0x06, 0x89, 0x90, 0x95, 0xCC, 0xC7, 0x3F, 0x2B, 0x48, 0x5F, 0x23, 0x0B, 0xCB,
+ 0xD5, 0xA2, 0x4E, 0x52, 0x5A, 0x1E, 0x1A, 0x4C, 0x51, 0x75, 0x67, 0x33, 0xD6, 0xF1, 0xBE, 0x9B,
+ 0x8D, 0x31, 0x0F, 0xBA, 0x2A, 0x67, 0x58, 0xF5, 0x62, 0xC3, 0x80, 0x48, 0x89, 0x5C, 0x3F, 0x81,
+ 0xFF, 0x27, 0x6E, 0x0B, 0x79, 0x6A, 0xD0, 0x33, 0xD6, 0x2D, 0x6A, 0xF1, 0x36, 0xCC, 0x96, 0x6C,
+ 0xA6, 0x6D, 0xA0, 0x92, 0x04, 0x5B, 0x27, 0xC9, 0x05, 0x1D, 0xCA, 0xB2, 0x8D, 0x4F, 0x20, 0xB6,
+ 0xEA, 0xE4, 0x57, 0xAE, 0xAF, 0x77, 0xF7, 0xA8, 0xA5, 0xCD, 0xFF, 0x5C, 0xB9, 0x7F, 0x29, 0x98,
+ 0x2C, 0x5E, 0xDA, 0x69, 0x3E, 0x99, 0x21, 0x25, 0x49, 0x1F, 0xEA, 0xD4, 0x91, 0x63, 0x89, 0xB8,
+ 0xEC, 0xCF, 0x8B, 0x1D, 0xF6, 0x33, 0x3C, 0x29, 0x26, 0xEF, 0xAC, 0x81, 0x12, 0xC5, 0x1B, 0x44,
+ 0xAC, 0x18, 0x90, 0x20, 0xBB, 0x03, 0x5B, 0x3F, 0x3E, 0xD3, 0xD3, 0xC5, 0x47, 0xAF, 0x7F, 0x44,
+ 0x9E, 0x32, 0xC5, 0x06, 0xE9, 0xB6, 0x7D, 0xB3, 0xA1, 0xF6, 0x77, 0x29, 0x7F, 0xA9, 0xA9, 0x10,
+ 0x20, 0xCE, 0x2E, 0x18, 0xC8, 0xAA, 0x68, 0x65, 0x64, 0x11, 0x57, 0x4F, 0xE9, 0xA2, 0xE3, 0xD1,
+ 0xEA, 0x03, 0x40, 0xAC, 0x68, 0x04, 0xC8, 0x36, 0x69, 0xE9, 0xB5, 0x6D, 0x77, 0x93, 0xFA, 0xD6,
+ 0xB8, 0xA5, 0x71, 0x63, 0x70, 0xE8, 0xA0, 0x27, 0x39, 0xD7, 0x33, 0x52, 0x76, 0x59, 0xF1, 0xEF,
+ 0xE2, 0x76, 0x83, 0xC5, 0x4D, 0xC5, 0xA3, 0xF2, 0x10, 0x4C, 0xB3, 0x35, 0x6E, 0x12, 0x5B, 0x26,
+ 0x7C, 0x4A, 0x8B, 0xFB, 0x02, 0x2B, 0xBE, 0xF4, 0x0A, 0x91, 0xF5, 0x7C, 0x82, 0x08, 0x62, 0x70,
+ 0xD8, 0xA4, 0x29, 0xE0, 0xF8, 0x97, 0x19, 0x1D, 0x06, 0xD3, 0x46, 0x90, 0xEB, 0xB5, 0x89, 0x5B,
+ 0x6C, 0x50, 0xB5, 0xB6, 0x70, 0x58, 0xA0, 0x30, 0x05, 0xF5, 0x40, 0x51, 0x4E, 0x30, 0xDF, 0x64,
+ 0x6F, 0x7A, 0x4E, 0x54, 0x64, 0xE3, 0x20, 0xD3, 0x93, 0xE3, 0x79, 0x28, 0x39, 0xB1, 0x18, 0xDF,
+ 0xCC, 0xF1, 0x98, 0xD1, 0x2D, 0x86, 0x34, 0x84, 0xA1, 0x83, 0x4A, 0xE5, 0xA9, 0x61, 0x6B, 0x09,
+ 0xA2, 0x3B, 0xCE, 0x5E, 0xF7, 0x6B, 0xFF, 0xC2, 0x20, 0xFC, 0xF3, 0xAC, 0x2E, 0x7C, 0x63, 0x55,
+ 0x11, 0x24, 0xEE, 0xE3, 0x51, 0xE6, 0x18, 0xB0, 0xD6, 0x6E, 0x85, 0xF5, 0xE5, 0x00, 0x91, 0x21,
+ 0xD4, 0x88, 0xF1, 0x50, 0x31, 0x39, 0x0A, 0x08, 0x23, 0xA9, 0x01, 0xB3, 0xEF, 0xE8, 0xAF, 0xDF,
+ 0xAE, 0x2B, 0xAF, 0xF9, 0x0D, 0xE2, 0x4D, 0x00, 0xE3, 0x5B, 0x56, 0x80, 0x90, 0xB8, 0xD4, 0x76,
+ 0xEA, 0x14, 0x68, 0x40, 0x53, 0x9A, 0x3B, 0x82, 0xFC, 0x63, 0x9F, 0x9A, 0x4C, 0xFF, 0xE3, 0x10,
+ 0x49, 0xCB, 0xA8, 0x1D, 0x59, 0x98, 0x3F, 0x4C, 0xDD, 0x2C, 0xB2, 0x8D, 0x11, 0xB5, 0x23, 0xF4,
+ 0x90, 0x87, 0xE3, 0x85, 0x24, 0xD4, 0x0A, 0xE9, 0x79, 0xBB, 0x1F, 0x56, 0xC3, 0x62, 0x35, 0xDF,
+ 0xE0, 0xAA, 0x51, 0x02, 0x93, 0xAE, 0x11, 0x21, 0xCF, 0xE4, 0xF3, 0x84, 0x08, 0x64, 0x06, 0x8B,
+ 0x8A, 0x32, 0xB0, 0xF0, 0xC5, 0xD3, 0x5E, 0x1E, 0xF1, 0x69, 0x48, 0x46, 0xEC, 0x61, 0xA2, 0x7F,
+ 0x28, 0xB6, 0xF8, 0xC9, 0x78, 0x35, 0x9B, 0x4D, 0x8C, 0xFE, 0xB7, 0xC9, 0xBC, 0xE9, 0x6E, 0x17,
+ 0xCB, 0xFB, 0x00, 0x91, 0xE8, 0x27, 0x77, 0x7C, 0x96, 0xD6, 0xAF, 0x8D, 0xE4, 0x18, 0x8F, 0xEB,
+ 0x7B, 0x9F, 0x01, 0x9C, 0x2E, 0x77, 0xF5, 0x40, 0x7C, 0x6D, 0x85, 0xA5, 0x17, 0x8F, 0x40, 0xB7,
+ 0x9D, 0xBB, 0x68, 0x96, 0x22, 0x17, 0x0A, 0x75, 0xA3, 0x1D, 0x07, 0xE4, 0x93, 0x8A, 0xBB, 0xAD,
+ 0x7E, 0x2E, 0xAA, 0x21, 0xDA, 0x62, 0xBF, 0xE8, 0xBB, 0x28, 0xB2, 0xCE, 0xE3, 0x0F, 0xCB, 0x3C,
+ 0x2C, 0x4A, 0x3D, 0xAA, 0xFC, 0x4B, 0xB5, 0x6A, 0x04, 0x05, 0xA4, 0x63, 0x98, 0xD8, 0xA2, 0x5E,
+ 0x96, 0xD5, 0x52, 0x7B, 0xCB, 0xED, 0xA3, 0x72, 0x3E, 0x2A, 0x3F, 0xE2, 0x79, 0x3D, 0xFE, 0x8A,
+ 0xA0, 0xD4, 0x32, 0x60, 0x10, 0xBE, 0xF2, 0xE5, 0xF9, 0x03, 0xE2, 0x66, 0x76, 0x7A, 0x48, 0xEF,
+ 0x33, 0x63, 0xA0, 0x93, 0x99, 0x28, 0x97, 0x40, 0xB9, 0xAD, 0xEC, 0xB4, 0xD7, 0x98, 0x9D, 0x87,
+ 0x6A, 0x6C, 0x9D, 0xD5, 0xF6, 0xAA, 0x64, 0xE4, 0xD6, 0x73, 0x92, 0xA9, 0xC2, 0xB4, 0x80, 0x0F,
+ 0x58, 0x7B, 0x01, 0x17, 0xAD, 0x7C, 0x3E, 0x5C, 0xDE, 0x7D, 0x77, 0xF2, 0x35, 0x4E, 0x6F, 0x0D,
+ 0xE1, 0x4E, 0xAD, 0x4E, 0x82, 0x36, 0x87, 0x89, 0x43, 0x13, 0x50, 0x08, 0x22, 0x3D, 0x14, 0x3D,
+ 0x85, 0x50, 0xBC, 0x17, 0x18, 0x66, 0xE1, 0x85, 0xEF, 0xCA, 0xF1, 0x12, 0x9B, 0xA1, 0xC0, 0x95,
+ 0x14, 0x2E, 0x2C, 0xB6, 0x1B, 0x25, 0x9F, 0x4C, 0xF2, 0x49, 0xAE, 0x8A, 0xD4, 0xE7, 0x1A, 0x05,
+ 0xFB, 0x6F, 0x75, 0x42, 0xC6, 0x14, 0xD8, 0xE5, 0x03, 0x04, 0x80, 0xEB, 0x58, 0x8F, 0x92, 0xAF,
+ 0xD1, 0x15, 0x00, 0x63, 0xB7, 0xFF, 0xF8, 0xD7, 0xE3, 0xC0, 0x37, 0xEF, 0x68, 0xF9, 0xC8, 0x5A,
+ 0x03, 0x6D, 0x4A, 0x56, 0xAE, 0xDF, 0x8E, 0xBD, 0x52, 0x5F, 0x7D, 0x22, 0x4A, 0xFA, 0xFE, 0xA2,
+ 0x3F, 0xCE, 0x45, 0xD8, 0x41, 0x94, 0x70, 0x21, 0x48, 0xF7, 0x95, 0xE5, 0xE4, 0x22, 0x52, 0x7E,
+ 0x15, 0xAE, 0xC7, 0x34, 0xA8, 0xF9, 0x15, 0x4B, 0x15, 0x11, 0x19, 0x19, 0xDC, 0x4A, 0x3D, 0x3D,
+ 0x33, 0x79, 0x0E, 0x8A, 0x34, 0x11, 0xEB, 0x4A, 0x8B, 0xAF, 0x0F, 0xE8, 0xBA, 0x3E, 0x94, 0xA6,
+ 0x2C, 0xF8, 0xF8, 0xA9, 0xD1, 0xE7, 0x3A, 0x3D, 0x44, 0xC8, 0x08, 0x47, 0x5E, 0xD8, 0xF1, 0x6C,
+ 0xCD, 0x8C, 0x60, 0xD7, 0xF6, 0xA5, 0x57, 0xF2, 0x0C, 0xD6, 0x9E, 0x0C, 0x90, 0xCB, 0xAE, 0xC0,
+ 0xC1, 0x62, 0xD4, 0xC6, 0x6C, 0x7F, 0xED, 0x38, 0x23, 0x48, 0x0B, 0x53, 0x64, 0xBE, 0xD2, 0x6C,
+ 0xE2, 0xAB, 0x71, 0x9E, 0x51, 0x87, 0xBF, 0x54, 0xC1, 0x36, 0xC0, 0x5B, 0x0E, 0xD0, 0x63, 0xE9,
+ 0x1C, 0x0C, 0x07, 0x3B, 0xAE, 0xEE, 0xA5, 0x51, 0x1E, 0xE6, 0x8E, 0x01, 0x1E, 0x59, 0xEA, 0x6C,
+ 0x25, 0x63, 0x33, 0x08, 0x08, 0x2C, 0x21, 0xF5, 0xEA, 0x01, 0x56, 0x44, 0x7D, 0xE0, 0x85, 0x1C,
+ 0xD5, 0x4D, 0x8D, 0xC2, 0xB7, 0xEE, 0x54, 0x51, 0xCA, 0x8B, 0xA6, 0xCF, 0x47, 0x85, 0x02, 0x29,
+ 0xDD, 0x60, 0x42, 0xE4, 0x17, 0x8E, 0x42, 0x5D, 0xFF, 0x10, 0x91, 0x25, 0x46, 0x93, 0x6B, 0xDA,
+ 0xAD, 0xDA, 0x01, 0x0F, 0x31, 0x85, 0x53, 0x9E, 0x7A, 0x3C, 0x14, 0xF5, 0xF0, 0xA4, 0x12, 0x9B,
+ 0xED, 0xC7, 0x83, 0x73, 0xA4, 0x6B, 0xC8, 0xAA, 0x7B, 0xD4, 0x64, 0xF7, 0xF5, 0xD3, 0x07, 0x2F,
+ 0x41, 0x8B, 0x09, 0xBF, 0xC7, 0xBD, 0x00, 0x2A, 0xBC, 0xBA, 0xFC, 0x9A, 0xE2, 0x58, 0x64, 0xFD,
+ 0xE1, 0x60, 0x4E, 0x3C, 0x60, 0xE3, 0x84, 0xCD, 0xD3, 0xAE, 0xB4, 0x0D, 0xF8, 0xA3, 0xAA, 0x74,
+ 0xE1, 0x42, 0x18, 0x56, 0xA6, 0x72, 0x65, 0xD1, 0x14, 0xCC, 0xFE, 0x1F, 0xD0, 0x91, 0x84, 0xA1,
+ 0x6A, 0x33, 0x76, 0x97, 0x5B, 0x72, 0x3F, 0xB3, 0xB8, 0xDF, 0xD9, 0x3E, 0x1D, 0x1E, 0xFD, 0x35,
+ 0xDF, 0x4B, 0xD7, 0x50, 0xE7, 0x2D, 0x1B, 0xC8, 0xCA, 0xB3, 0x89, 0xE4, 0x56, 0xA9, 0x81, 0x4A,
+ 0xED, 0x96, 0xE3, 0x0C, 0xE5, 0x9F, 0x60, 0xF5, 0xB4, 0x9A, 0xCD, 0xAD, 0xBA, 0x63, 0x8B, 0x54,
+ 0x39, 0xD0, 0x0A, 0xE9, 0x98, 0x5E, 0xC1, 0xC9, 0x40, 0xB7, 0xA4, 0x10, 0x32, 0x7D, 0x9E, 0x00,
+ 0x68, 0x69, 0xB8, 0x23, 0xDF, 0xBE, 0xC0, 0x45, 0x33, 0xF1, 0x8E, 0x27, 0xED, 0xA1, 0xD9, 0x38,
+ 0x74, 0xF2, 0x8A, 0xBE, 0x85, 0x1E, 0xF0, 0x5B, 0x1A, 0x34, 0x93, 0x72, 0xDE, 0x37, 0xD7, 0x83,
+ 0xEB, 0x7B, 0x28, 0x5E, 0x14, 0x2A, 0xBC, 0xC7, 0xE2, 0xB3, 0x06, 0x29, 0x76, 0x37, 0xD3, 0xC4,
+ 0x47, 0x8A, 0xDB, 0xC7, 0x30, 0x02, 0x66, 0xC9, 0x53, 0x5E, 0xBA, 0xDB, 0x07, 0x60, 0x0D, 0x6B,
+ 0x54, 0xCB, 0x0C, 0xC1, 0x27, 0x54, 0xDE, 0x12, 0xED, 0x7D, 0x8E, 0x76, 0xCD, 0x57, 0x52, 0x88,
+ 0xF0, 0x16, 0x9C, 0x80, 0xE1, 0x00, 0x50, 0x95, 0x61, 0x8E, 0x55, 0xEE, 0xE1, 0xC9, 0x8F, 0xD4,
+ 0x1C, 0x74, 0xDD, 0x85, 0xCB, 0xE5, 0x7C, 0x8B, 0x24, 0x4C, 0x4B, 0xDA, 0x16, 0x98, 0xA0, 0x70,
+ 0x58, 0x13, 0x5D, 0x05, 0x0C, 0x3F, 0x61, 0xE3, 0x14, 0xE2, 0xEF, 0x92, 0xC8, 0x3A, 0xDA, 0xFF,
+ 0x0E, 0x1A, 0xB3, 0x7D, 0x02, 0x43, 0xDD, 0xE5, 0xE3, 0x8C, 0xE9, 0xFC, 0xD1, 0x66, 0xA2, 0x8E,
+ 0x4D, 0x81, 0xA4, 0x4C, 0xBF, 0x4D, 0x9B, 0x67, 0x53, 0x63, 0x11, 0x86, 0x78, 0x54, 0xF0, 0x9E,
+ 0x70, 0x56, 0x1C, 0x5F, 0xBA, 0xC9, 0x1C, 0xAB, 0xC8, 0x39, 0x8B, 0xC9, 0xE4, 0xB1, 0x07, 0xEA,
+ 0xB5, 0xD4, 0x75, 0xF2, 0x91, 0x83, 0x1C, 0x2F, 0x73, 0xEC, 0xFB, 0x56, 0x68, 0xA1, 0xC8, 0xAC,
+ 0xCA, 0x20, 0x3F, 0x6A, 0xE9, 0xBF, 0xC1, 0x1D, 0x00, 0xBC, 0x23, 0x1F, 0x1E, 0xF8, 0xC3, 0x08,
+ 0xBD, 0x66, 0xA5, 0xF6, 0x5D, 0x77, 0xD5, 0x5A, 0x6D, 0x04, 0xEB, 0x76, 0x9E, 0xDB, 0x0C, 0x8C,
+ 0x28, 0x9F, 0xCC, 0x4E, 0x77, 0xFC, 0x00, 0x36, 0xEC, 0xCE, 0x4B, 0x72, 0x06, 0xD1, 0x73, 0x1A,
+ 0xD8, 0x91, 0x45, 0x55, 0xB8, 0xA7, 0x8C, 0x40, 0xCA, 0xF7, 0xCF, 0x39, 0x6A, 0x74, 0x63, 0xD3,
+ 0x71, 0x76, 0xA4, 0x59, 0xB8, 0x8C, 0xB5, 0x4E, 0xCA, 0x12, 0x35, 0xB5, 0x87, 0x9F, 0xA9, 0x94,
+ 0x07, 0x67, 0x4D, 0xF0, 0xDF, 0x97, 0x0F, 0x53, 0x68, 0xCC, 0x67, 0x26, 0xF8, 0xF5, 0xBE, 0xAD,
+ 0x1E, 0x95, 0xD0, 0x90, 0x88, 0x27, 0xA8, 0x3D, 0x4F, 0xA1, 0x58, 0xDE, 0x8F, 0xBC, 0x36, 0x2F,
+ 0x36, 0x0B, 0x38, 0x9A, 0x51, 0x95, 0xA2, 0xE5, 0x8F, 0xC5, 0x1D, 0xE4, 0x2E, 0x27, 0x9D, 0xEA,
+ 0x43, 0xD7, 0x07, 0x02, 0x0B, 0x26, 0x85, 0xD3, 0xEC, 0xA3, 0x67, 0xA9, 0xC3, 0x23, 0xFA, 0x46,
+ 0x5F, 0x9C, 0x64, 0xD5, 0xCC, 0x7D, 0x75, 0xE3, 0x51, 0x32, 0x31, 0x1F, 0x51, 0x99, 0xF0, 0x57,
+ 0x30, 0xC9, 0x22, 0xA0, 0x2B, 0xA3, 0xA7, 0x7A, 0x26, 0x21, 0x91, 0xD1, 0x75, 0xD4, 0xB7, 0x0B,
+ 0xC5, 0x96, 0x71, 0x66, 0x2D, 0x5E, 0xDA, 0x71, 0x48, 0xEA, 0xAC, 0x97, 0x8B, 0x23, 0xD5, 0x49,
+ 0xC2, 0x66, 0x1D, 0x62, 0xFC, 0x06, 0x17, 0xA1, 0xEC, 0x71, 0x17, 0xA0, 0x3B, 0xE3, 0xF0, 0xF7,
+ 0x0D, 0xCB, 0x84, 0xB6, 0x7C, 0xC0, 0x42, 0x0E, 0xB8, 0xA3, 0x8C, 0x31, 0x4A, 0x9A, 0xAA, 0x97,
+ 0xFC, 0x67, 0xB1, 0x75, 0xC6, 0x51, 0xFC, 0x28, 0x69, 0xD0, 0x43, 0x28, 0x54, 0xB9, 0xAE, 0xBE,
+ 0x44, 0x7A, 0x18, 0x36, 0x39, 0x26, 0x46, 0x29, 0x33, 0x0E, 0x15, 0xAF, 0x03, 0x21, 0x07, 0x87,
+ 0xDE, 0x30, 0xE3, 0xE5, 0xDA, 0x34, 0x81, 0xE5, 0xE2, 0xCD, 0x6B, 0xEE, 0xEF, 0x95, 0xD3, 0x2C,
+ 0x7B, 0x31, 0x15, 0x56, 0xB4, 0x77, 0xDA, 0x40, 0xFD, 0x59, 0xB9, 0xDF, 0xEC, 0x39, 0x2B, 0x6C,
+ 0x18, 0x7E, 0xCA, 0x99, 0x5E, 0x55, 0xF2, 0x61, 0x45, 0x74, 0x2C, 0x50, 0xB7, 0x42, 0x31, 0xD9,
+ 0x58, 0xAE, 0x75, 0x17, 0x4D, 0xFA, 0xF1, 0x18, 0x26, 0x6B, 0x2C, 0xD9, 0xE8, 0x98, 0x75, 0xE7,
+ 0x8A, 0xC9, 0x07, 0x63, 0x6D, 0x55, 0xFD, 0xEE, 0x2D, 0x24, 0x4D, 0x0F, 0x11, 0x7C, 0x0B, 0x48,
+ 0x99, 0xC0, 0x06, 0x83, 0xC3, 0xF5, 0x90, 0xBD, 0x12, 0xE7, 0xC6, 0x86, 0x16, 0x8A, 0x63, 0xD7,
+ 0xF8, 0x1E, 0x54, 0xCD, 0x06, 0x20, 0x4C, 0x5C, 0xC6, 0x15, 0x76, 0x56, 0xE0, 0xE1, 0xDD, 0xE4,
+ 0xC1, 0x63, 0x75, 0x53, 0xBC, 0xE1, 0x8C, 0xBF, 0x26, 0x41, 0xF9, 0xA9, 0xCC, 0xEE, 0x69, 0xEA,
+ 0x7D, 0x0E, 0x9F, 0xF2, 0x70, 0x0C, 0x4A, 0xD0, 0x2D, 0x17, 0x47, 0xB0, 0x66, 0xD4, 0xDF, 0x9A,
+ 0xDC, 0xAD, 0x94, 0xE6, 0x66, 0x3F, 0x0D, 0x57, 0xB3, 0xAD, 0x90, 0xD0, 0xD7, 0x72, 0x3D, 0x1E,
+ 0x9C, 0xAF, 0x1A, 0x46, 0x20, 0x8B, 0x48, 0xEA, 0x3A, 0x10, 0x42, 0x32, 0x3D, 0xB9, 0xEB, 0x61,
+ 0x47, 0x29, 0x61, 0xED, 0xB6, 0x8C, 0x1D, 0x9E, 0xD4, 0x00, 0x34, 0xD9, 0xAB, 0x16, 0x16, 0x84,
+ 0xAF, 0xC5, 0x79, 0x37, 0xE4, 0xC9, 0xBE, 0x91, 0x57, 0x4F, 0xFE, 0x87, 0xF7, 0x47, 0x62, 0x99,
+ 0x4F, 0xFA, 0xAE, 0x51, 0x68, 0x1A, 0xE2, 0x90, 0xB5, 0x62, 0x21, 0xE4, 0x06, 0x14, 0x3D, 0xB5,
+ 0xC2, 0x34, 0xB0, 0xF3, 0x6B, 0x0D, 0xF7, 0x0F, 0x3C, 0x54, 0xD6, 0x2B, 0xCF, 0xD8, 0xD1, 0x9B,
+ 0x54, 0x8B, 0x93, 0xBB, 0x15, 0xF1, 0xC5, 0x9F, 0x24, 0x53, 0x02, 0x94, 0xDE, 0x66, 0x4F, 0x2F,
+ 0x77, 0xF6, 0xE4, 0x4C, 0x58, 0x19, 0xBB, 0x08, 0x0A, 0x9B, 0xAC, 0x4C, 0xA5, 0xAC, 0x4A, 0x66,
+ 0x72, 0x01, 0x45, 0x41, 0xDA, 0x86, 0xF9, 0x7C, 0x0A, 0x8E, 0xA6, 0xFD, 0x10, 0x18, 0x4F, 0x2F,
+ 0xEA, 0x5A, 0xD9, 0x79, 0xD2, 0xD8, 0x3F, 0x02, 0x11, 0x5F, 0x43, 0x79, 0x3A, 0x40, 0x75, 0x6C,
+ 0xFC, 0x3A, 0x24, 0xEB, 0xBF, 0xD2, 0xC0, 0xF3, 0xD0, 0xD1, 0x21, 0xA9, 0x84, 0xFB, 0x9D, 0xA3,
+ 0xF1, 0x0F, 0x57, 0xAE, 0x99, 0xCB, 0x3B, 0xBC, 0x55, 0x88, 0xE6, 0xE1, 0x7D, 0xC6, 0xDB, 0xA9,
+ 0x35, 0x59, 0x11, 0x26, 0x05, 0x0E, 0x8E, 0x5D, 0xBE, 0xF1, 0x32, 0x5A, 0xBF, 0xBE, 0xE8, 0x07,
+ 0xB8, 0x80, 0x61, 0x70, 0xEA, 0x8C, 0x05, 0xC0, 0x4D, 0xBF, 0xE9, 0x63, 0xA1, 0x11, 0xFC, 0x0A,
+ 0x4B, 0x6D, 0x03, 0x11, 0x86, 0x7A, 0x69, 0x49, 0x15, 0xDA, 0x23, 0x67, 0xC5, 0x51, 0x3A, 0x5A,
+ 0xAD, 0xCA, 0xAC, 0xF7, 0xD7, 0x6C, 0x0E, 0x2D, 0xC5, 0x88, 0xD9, 0x95, 0x48, 0x58, 0x70, 0x37,
+ 0xBE, 0x8E, 0xBC, 0xF6, 0x14, 0x4C, 0xA0, 0x13, 0x9C, 0x8D, 0x58, 0x9F, 0x02, 0xAB, 0x65, 0xCA,
+ 0x66, 0x73, 0x84, 0x3B, 0xC6, 0xD5, 0x43, 0x9E, 0x1C, 0xCE, 0xA0, 0x00, 0x59, 0xEC, 0x4A, 0xC0,
+ 0x9D, 0x31, 0x5A, 0xB2, 0x0A, 0x86, 0x23, 0x2A, 0xCD, 0xCF, 0x18, 0x96, 0xE2, 0xE5, 0xFF, 0x36,
+ 0xBC, 0x66, 0x8A, 0xA7, 0x8A, 0xE0, 0xF4, 0x06, 0x39, 0x7C, 0xCF, 0x21, 0xEE, 0x17, 0x39, 0x87,
+ 0x74, 0xA0, 0x73, 0x38, 0xA9, 0x90, 0x6C, 0xC2, 0x1B, 0xF0, 0x69, 0xD8, 0xBF, 0x6E, 0x44, 0x6F,
+ 0x77, 0x75, 0x1E, 0x45, 0xB5, 0x65, 0xAD, 0xDF, 0x56, 0x66, 0xFD, 0xA0, 0x59, 0x85, 0xC5, 0x06,
+ 0x0C, 0xBF, 0xD5, 0x17, 0xA1, 0x48, 0x99, 0x63, 0xEE, 0xF0, 0x7D, 0xAE, 0x3A, 0x7C, 0x6A, 0x7C,
+ 0xB4, 0xDA, 0xDB, 0x1A, 0xED, 0x70, 0xF9, 0x4D, 0xD2, 0xA4, 0x09, 0xE4, 0xFA, 0x4B, 0x95, 0xDD,
+ 0x95, 0x7B, 0x3D, 0xD1, 0x52, 0xDB, 0x59, 0x68, 0xFF, 0xE5, 0x13, 0x39, 0xE5, 0x01, 0x12, 0x7F,
+ 0x9A, 0x0E, 0xFF, 0x35, 0x75, 0x6A, 0x56, 0xEA, 0x66, 0x91, 0xF7, 0x3E, 0x71, 0x86, 0x6C, 0xC3,
+ 0x11, 0x1B, 0x04, 0x4C, 0x98, 0x13, 0xA1, 0x35, 0x23, 0x96, 0xC9, 0x8C, 0xFB, 0x43, 0x96, 0x4B,
+ 0xC0, 0x1F, 0x30, 0x95, 0xAA, 0x8B, 0x27, 0x16, 0x6C, 0x91, 0x0D, 0x62, 0xAB, 0x87, 0x1A, 0xDA,
+ 0x61, 0xB1, 0x2E, 0xBC, 0x19, 0xA8, 0xF0, 0x32, 0xD7, 0x06, 0x6F, 0x82, 0xFD, 0x5F, 0xF1, 0x08,
+ 0x5E, 0x97, 0x83, 0xEF, 0xB0, 0x91, 0xC2, 0xE6, 0x37, 0x47, 0xFC, 0xD1, 0xE7, 0x6C, 0xC1, 0x1A,
+ 0xAF, 0x91, 0xDF, 0x5C, 0x2D, 0x1B, 0xBC, 0x6A, 0x10, 0xAC, 0xAE, 0x2C, 0x34, 0xCD, 0xD2, 0x6B,
+ 0x15, 0x07, 0xEA, 0xD0, 0x6C, 0x3E, 0x19, 0x14, 0xEF, 0x35, 0xA4, 0x2B, 0x17, 0xF8, 0x2F, 0x48,
+ 0x0D, 0x5C, 0x70, 0xE2, 0xFF, 0x94, 0x2B, 0x59, 0x3C, 0xDE, 0x2F, 0x14, 0x84, 0x5F, 0x0F, 0xF3,
+ 0xA0, 0xFC, 0x40, 0xBE, 0xFA, 0xAE, 0x97, 0xC7, 0xC6, 0xF3, 0xB5, 0xC2, 0x50, 0xBB, 0xA3, 0xB8,
+ 0xC1, 0x7D, 0x6B, 0xE9, 0x87, 0x98, 0x8B, 0xBE, 0x19, 0xA5, 0xAC, 0xB1, 0x8D, 0x6C, 0x67, 0x94,
+ 0x95, 0x7C, 0x60, 0xCC, 0x0B, 0x75, 0x24, 0xB9, 0x54, 0x7D, 0xD4, 0x4D, 0x9B, 0xF2, 0xA6, 0xFB,
+ 0xC0, 0x78, 0x38, 0x90, 0x19, 0x5A, 0x62, 0x85, 0x3A, 0x34, 0xD8, 0xCD, 0xA1, 0xA5, 0xD9, 0xC0,
+ 0xC5, 0xB3, 0x6E, 0x26, 0x13, 0xCF, 0x7C, 0xC1, 0x50, 0x6D, 0x80, 0xCE, 0xF9, 0xA7, 0xFE, 0x2F,
+ 0x14, 0x53, 0x03, 0x0E, 0xFE, 0xB4, 0xA2, 0x75, 0x0A, 0xB4, 0xD9, 0xDB, 0xEA, 0xBC, 0xF1, 0xB0,
+ 0x8E, 0xE5, 0x33, 0x49, 0x16, 0xCD, 0x3B, 0x7C, 0x3B, 0x31, 0x51, 0x8D, 0xF2, 0x12, 0xDB, 0x09,
+ 0xA7, 0x06, 0x7E, 0x66, 0x09, 0x77, 0xA2, 0x3E, 0xB9, 0xA2, 0xA2, 0xEE, 0xFB, 0x9E, 0x84, 0xF1,
+ 0x77, 0x28, 0xB1, 0x02, 0xF4, 0xE9, 0x74, 0x56, 0x3D, 0x6F, 0x83, 0x2F, 0xDE, 0x50, 0x4F, 0xAA,
+ 0x2C, 0xC9, 0x8A, 0x71, 0x45, 0xE1, 0x79, 0x4D, 0x9B, 0xC0, 0xC0, 0x8B, 0x33, 0x7D, 0x3F, 0x07,
+ 0x2B, 0x4C, 0x16, 0x4F, 0xD1, 0xFB, 0x28, 0xB8, 0x7B, 0xF2, 0x4F, 0xA8, 0x56, 0x84, 0xDF, 0x61,
+ 0xEC, 0x1F, 0x4D, 0x95, 0xC5, 0xD7, 0x90, 0x4D, 0x38, 0x35, 0xE5, 0x96, 0xBA, 0x6D, 0x31, 0xAE,
+ 0xE7, 0xAC, 0xE6, 0xDD, 0x05, 0x5E, 0xD4, 0xF5, 0x47, 0x5B, 0xEA, 0xA3, 0x36, 0x7C, 0x58, 0x04,
+ 0x41, 0x3C, 0xEC, 0xC6, 0x70, 0x59, 0xEC, 0x4D, 0xE3, 0x80, 0x59, 0x6D, 0xA1, 0x3A, 0x31, 0xA1,
+ 0x50, 0xB7, 0x10, 0xC0, 0xC4, 0x47, 0x87, 0xAB, 0xEA, 0x4B, 0xFD, 0xF6, 0x5C, 0xA8, 0x62, 0x40,
+ 0x3E, 0x89, 0x1D, 0xE1, 0x9B, 0x04, 0x1F, 0x22, 0x2B, 0xAF, 0x0B, 0xFC, 0xD1, 0x64, 0x4B, 0xCE,
+ 0xC4, 0xF9, 0x19, 0xF4, 0x21, 0x95, 0xBA, 0xC0, 0x77, 0x4B, 0xFC, 0x15, 0xC7, 0x6F, 0xF7, 0x70,
+ 0x8E, 0xE2, 0xDF, 0xFE, 0x48, 0xA9, 0x17, 0xA2, 0xAB, 0xA5, 0xFC, 0x2A, 0x72, 0x08, 0xFF, 0xBC,
+ 0x56, 0xFC, 0xAF, 0xFF, 0x47, 0xEC, 0xCE, 0x29, 0x17, 0xAE, 0x2D, 0xB3, 0xB3, 0x5F, 0x93, 0x9D,
+ 0x57, 0x2A, 0xF4, 0xDE, 0xDD, 0xE4, 0xE6, 0x43, 0x73, 0xCA, 0x00, 0x16, 0xB8, 0xD7, 0x15, 0x67,
+ 0xEB, 0x33, 0x6C, 0xCE, 0x0C, 0xFA, 0x8F, 0xF1, 0x08, 0x6E, 0xC0, 0x3F, 0xAF, 0x30, 0x9F, 0x2A,
+ 0x98, 0x4C, 0x03, 0x1C, 0x88, 0x7D, 0xBF, 0x7A, 0xB1, 0xAE, 0x51, 0x69, 0x6D, 0xE9, 0x67, 0x8F,
+ 0x73, 0x3A, 0xB9, 0x58, 0x9B, 0xB0, 0xE6, 0x14, 0xB2, 0x04, 0x57, 0x85, 0x6E, 0x09, 0x84, 0x53,
+ 0x1F, 0x6D, 0xAA, 0xD1, 0x42, 0xCA, 0xFA, 0x8D, 0xB5, 0xAA, 0xD6, 0xDC, 0x9A, 0xC1, 0x90, 0x69,
+ 0x5A, 0xB7, 0xB8, 0x75, 0xD4, 0xD8, 0x5E, 0x2B, 0x5E, 0xB5, 0x73, 0x4B, 0x42, 0x2D, 0x5C, 0x4C,
+ 0x58, 0x9E, 0xF1, 0xE0, 0x18, 0x51, 0x5B, 0x68, 0xEA, 0x4E, 0x92, 0x98, 0x62, 0x6C, 0xF8, 0x68,
+ 0xA8, 0x92, 0x48, 0x8E, 0x2B, 0x11, 0xC7, 0xC5, 0x8E, 0x3A, 0x3C, 0xFF, 0xB3, 0x93, 0x32, 0xA8,
+ 0x55, 0x94, 0x0E, 0xA1, 0x78, 0x7E, 0x3D, 0xD2, 0xF0, 0xA2, 0x27, 0x1B, 0x8F, 0x14, 0x73, 0x0B,
+ 0xE7, 0xC9, 0xBE, 0xE5, 0x49, 0xCF, 0x26, 0xE2, 0xC0, 0x5E, 0x51, 0xE5, 0xAC, 0x32, 0x45, 0x37,
+ 0x6A, 0x4C, 0xF9, 0xCC, 0x6C, 0x0A, 0x0B, 0xEE, 0x1C, 0x5B, 0x7D, 0xE8, 0xDF, 0x83, 0x96, 0x0E,
+ 0x7D, 0x6E, 0x87, 0x2D, 0x4A, 0xA8, 0x00, 0x7C, 0xE9, 0xE2, 0x1A, 0xE7, 0x9E, 0x9D, 0x09, 0x99,
+ 0xA5, 0xB6, 0x46, 0x4D, 0xDE, 0xD7, 0xA9, 0x9B, 0x13, 0xA5, 0xC9, 0xB1, 0x6E, 0xDC, 0xF6, 0x42,
+ 0x20, 0x08, 0x86, 0xFE, 0x8A, 0x3E, 0x42, 0x42, 0x33, 0x0B, 0x54, 0xD1, 0xB9, 0x97, 0x86, 0x03,
+ 0xC9, 0xA7, 0x20, 0x0B, 0x09, 0x46, 0x0C, 0xCF, 0x6B, 0x7B, 0x74, 0x95, 0xFE, 0xC0, 0x24, 0x8D,
+ 0x12, 0xBD, 0xC9, 0x60, 0x48, 0x2F, 0x02, 0x77, 0x5C, 0x5F, 0x86, 0xA9, 0x39, 0xB3, 0x7C, 0x77,
+ 0x10, 0xCE, 0xE9, 0xB4, 0x61, 0x63, 0x63, 0x39, 0x86, 0x89, 0x97, 0x4A, 0xD3, 0x16, 0x51, 0x1F,
+ 0x8E, 0xFC, 0xF0, 0x51, 0xF4, 0x5D, 0x62, 0x73, 0xF3, 0x47, 0x82, 0x04, 0xF0, 0xD8, 0xD8, 0xD5,
+ 0x16, 0x63, 0x96, 0xBE, 0xF5, 0xB5, 0x4A, 0x70, 0xCB, 0x8B, 0x23, 0xF5, 0xB0, 0xEE, 0x0F, 0xFA,
+ 0xC7, 0x9A, 0xA5, 0xB1, 0x6B, 0x39, 0x53, 0x90, 0xAF, 0xF8, 0x9F, 0xCC, 0x99, 0xE4, 0x65, 0x7A,
+ 0x69, 0xBD, 0x2B, 0x1F, 0x27, 0x3F, 0x87, 0x69, 0x2D, 0x1E, 0x9F, 0xC2, 0x96, 0xE9, 0x64, 0xEC,
+ 0xF8, 0x34, 0x30, 0xA1, 0xC3, 0xAF, 0x77, 0x55, 0x42, 0x30, 0xA7, 0x8E, 0x35, 0x12, 0xBF, 0x1C,
+ 0xA3, 0x1F, 0x74, 0x43, 0x41, 0xD5, 0x35, 0xC9, 0x02, 0x6E, 0xB9, 0x3C, 0x12, 0x6D, 0x23, 0x3B,
+ 0xD6, 0xCB, 0x2D, 0x01, 0xCA, 0x96, 0xCB, 0x36, 0xCD, 0x65, 0x81, 0x04, 0xDA, 0x83, 0xB2, 0x8E,
+ 0x32, 0xB7, 0x85, 0xAE, 0x7F, 0xC2, 0x2F, 0x05, 0xFE, 0x0C, 0x29, 0x9D, 0x21, 0x8D, 0x9E, 0xED,
+ 0x9A, 0x45, 0xCD, 0xD6, 0xC1, 0xC5, 0x22, 0xAF, 0x4B, 0xFD, 0xED, 0xEE, 0x34, 0xA4, 0xD7, 0x51,
+ 0xFE, 0x05, 0x20, 0xE0, 0x25, 0xBF, 0x4D, 0xCE, 0xCE, 0x8B, 0xC6, 0xBA, 0xF2, 0x8C, 0x13, 0xF2,
+ 0xA5, 0x50, 0xC9, 0xC7, 0x69, 0x64, 0xA7, 0x9F, 0x42, 0xD4, 0x82, 0xA8, 0x1A, 0x65, 0x36, 0xBD,
+ 0xF8, 0x42, 0x98, 0x41, 0x76, 0x32, 0x34, 0x19, 0x1C, 0xC9, 0x3E, 0x08, 0x43, 0xB2, 0x1F, 0xE4,
+ 0x3B, 0x17, 0x75, 0x8F, 0x6A, 0x66, 0xFA, 0xF0, 0x63, 0xC5, 0xA0, 0x96, 0x0B, 0x9C, 0xB8, 0xA1,
+ 0x76, 0xDE, 0xEC, 0xB2, 0x8B, 0x28, 0xC0, 0xAC, 0x99, 0x7E, 0x4B, 0x36, 0x50, 0xD1, 0xBC, 0xE6,
+ 0xBA, 0xEE, 0x8B, 0x4C, 0x5A, 0xD7, 0xD4, 0x59, 0x4B, 0xE2, 0x96, 0xC5, 0x29, 0xFC, 0xE2, 0x22,
+ 0xE1, 0x90, 0x64, 0x4F, 0xBA, 0x52, 0x20, 0x11, 0x96, 0x5B, 0x1D, 0x92, 0xC9, 0x6F, 0x32, 0x8E,
+ 0x2D, 0x21, 0xEC, 0xA0, 0xDE, 0x49, 0xBA, 0x44, 0xB7, 0x86, 0xCE, 0xA8, 0x5D, 0xB0, 0xB2, 0x80,
+ 0x14, 0x64, 0x2E, 0xA0, 0x3D, 0xB2, 0x17, 0xE2, 0xD3, 0x83, 0x09, 0x30, 0x26, 0x32, 0x90, 0x8D,
+ 0x41, 0x1F, 0x18, 0x47, 0xC0, 0xC2, 0x35, 0x47, 0xA1, 0xE5, 0x83, 0x68, 0x96, 0x4E, 0x84, 0x9C,
+ 0x2F, 0x0E, 0x64, 0xBA, 0x07, 0x18, 0x50, 0xFE, 0x1B, 0xF2, 0xD7, 0xED, 0x05, 0x3A, 0x1A, 0xE8,
+ 0xC9, 0x89, 0xCE, 0xC0, 0x45, 0x19, 0xB4, 0x3F, 0x98, 0x08, 0xAB, 0x2D, 0x32, 0xE8, 0x36, 0x58,
+ 0x14, 0xBA, 0xF1, 0x28, 0x37, 0x4D, 0xA0, 0x51, 0x53, 0xA6, 0xAE, 0xDA, 0x5D, 0xF0, 0xEC, 0x51,
+ 0xDA, 0x22, 0xDB, 0xEB, 0x6A, 0x79, 0xC6, 0x63, 0x3B, 0x03, 0x1A, 0xF7, 0x8F, 0x87, 0xBB, 0x7B,
+ 0x85, 0x56, 0x5E, 0x99, 0xCD, 0xFA, 0x4A, 0x6C, 0x13, 0xCF, 0x55, 0x8E, 0x90, 0xE7, 0xB1, 0x6B,
+ 0x73, 0xF3, 0x44, 0xAF, 0xDB, 0x05, 0xAB, 0x6B, 0xEF, 0x34, 0x56, 0xF8, 0xAC, 0x76, 0xC4, 0xD0,
+ 0xF7, 0xE9, 0x12, 0xF6, 0xF1, 0x7B, 0xB9, 0x27, 0x4D, 0xF6, 0xBF, 0x3A, 0xC9, 0x25, 0xD1, 0x08,
+ 0xF0, 0xE1, 0x0F, 0xF0, 0x0E, 0x1D, 0xBC, 0x31, 0x09, 0x2A, 0x58, 0x37, 0xC1, 0x25, 0x45, 0x7E,
+ 0x9D, 0x15, 0xEA, 0x53, 0x8B, 0xE9, 0x27, 0x7C, 0xB1, 0xEC, 0x0A, 0xC0, 0x36, 0x64, 0xBB, 0xC3,
+ 0x2F, 0xB7, 0xD3, 0x95, 0x24, 0x7D, 0xEA, 0x35, 0x42, 0xDF, 0x48, 0xF5, 0x23, 0x2E, 0xF1, 0x7F,
+ 0xE8, 0x4A, 0x4E, 0x7B, 0x38, 0xB5, 0xD8, 0x13, 0xE4, 0x73, 0x31, 0x50, 0x9D, 0x21, 0xE1, 0xD9,
+ 0xDC, 0xF5, 0x87, 0x6F, 0xC1, 0xBC, 0x9F, 0xF5, 0x1A, 0xEB, 0x61, 0x92, 0xD8, 0x10, 0x88, 0x2B,
+ 0xC7, 0x48, 0x3E, 0xC6, 0x2E, 0x9B, 0xF4, 0x20, 0x4D, 0x10, 0x5C, 0x45, 0xA2, 0x82, 0x87, 0xBE,
+ 0x96, 0x54, 0xEA, 0xE7, 0x53, 0xDC, 0x35, 0x36, 0xAD, 0x48, 0x98, 0xD8, 0xD2, 0x37, 0x0A, 0x82,
+ 0xF7, 0x55, 0x8C, 0x28, 0x01, 0x68, 0x9C, 0x8E, 0xE0, 0x44, 0x2A, 0xD5, 0x09, 0x95, 0x8F, 0x2D,
+ 0xD7, 0xE7, 0x26, 0xB9, 0xDC, 0x7D, 0x00, 0x0B, 0x5A, 0xDB, 0x30, 0xDC, 0x58, 0x3F, 0x53, 0x6D,
+ 0x14, 0xBA, 0x5C, 0x4B, 0x3E, 0xB1, 0x7F, 0x3C, 0xF8, 0x2E, 0x49, 0xB3, 0x7F, 0x05, 0x44, 0xC6,
+ 0x44, 0x5D, 0x83, 0xFC, 0xD7, 0x15, 0x3F, 0xA3, 0x55, 0x60, 0x15, 0x13, 0x38, 0xBD, 0x9C, 0x3B,
+ 0xFE, 0xF3, 0x68, 0x06, 0xD8, 0xF1, 0x7C, 0x19, 0xB4, 0x01, 0xAB, 0x5C, 0x81, 0xBC, 0x69, 0xAD,
+ 0xF5, 0xB2, 0xF6, 0x58, 0xFB, 0x03, 0xE3, 0x79, 0xE5, 0xC3, 0x63, 0xDB, 0x23, 0xA5, 0xD8, 0xE9,
+ 0x32, 0xCE, 0xA0, 0x56, 0xD6, 0xFD, 0x53, 0xA0, 0xA5, 0xB4, 0x1D, 0xE9, 0x44, 0x19, 0x27, 0xEE,
+ 0x3C, 0xE7, 0x5D, 0x11, 0x14, 0x7B, 0x56, 0xEA, 0x16, 0xB8, 0x2A, 0x4B, 0x7E, 0x7C, 0x6D, 0x7D,
+ 0xD1, 0x8F, 0x72, 0xFB, 0x75, 0x8F, 0x12, 0x5C, 0x6D, 0x1C, 0xBF, 0x40, 0xD7, 0x8E, 0x30, 0x09,
+ 0xAB, 0xAE, 0xB3, 0x7D, 0x34, 0x23, 0xCD, 0xA8, 0x69, 0xB7, 0xD7, 0x78, 0x75, 0x14, 0x82, 0xD5,
+ 0x36, 0x12, 0x9B, 0x70, 0x3E, 0x94, 0xE7, 0xA5, 0x2E, 0xF4, 0x44, 0x48, 0x82, 0x47, 0xCF, 0xE9,
+ 0xA1, 0x21, 0x28, 0x60, 0x4C, 0x60, 0x4A, 0xDB, 0xC6, 0x25, 0x0B, 0xF3, 0x5B, 0x5C, 0x34, 0x7B,
+ 0x6B, 0x8F, 0x1D, 0x6C, 0xCD, 0xA5, 0x03, 0x62, 0x24, 0xB5, 0x4E, 0x8F, 0x1B, 0x80, 0x61, 0x19,
+ 0x52, 0x95, 0xC8, 0x46, 0xEF, 0x57, 0xB6, 0x8F, 0x0C, 0xE3, 0xA1, 0xD6, 0x08, 0x16, 0xC8, 0x20,
+ 0x3C, 0x13, 0x93, 0x42, 0xDE, 0xE4, 0xE2, 0x28, 0xAC, 0x62, 0xA4, 0xCC, 0x28, 0x83, 0xB0, 0xF9,
+ 0xEB, 0xD8, 0x51, 0xA9, 0x13, 0x3C, 0x53, 0x73, 0x7A, 0x9D, 0xB5, 0xC4, 0xFA, 0xC8, 0x0D, 0xB8,
+ 0x66, 0x15, 0x8E, 0x65, 0x79, 0x08, 0xC9, 0x6E, 0x65, 0xC5, 0x09, 0x9B, 0x20, 0x7D, 0xC0, 0xBE,
+ 0xCC, 0xC3, 0x60, 0xA5, 0x10, 0xBD, 0xC9, 0x50, 0xCE, 0xE2, 0xAF, 0x16, 0xD7, 0xE0, 0xAC, 0x17,
+ 0x78, 0x35, 0x2A, 0x0A, 0xAF, 0x4C, 0x2C, 0x78, 0x78, 0x3E, 0xF4, 0x7A, 0xB2, 0x63, 0xD4, 0xBD,
+ 0x4B, 0xC2, 0x8C, 0x0C, 0x5C, 0x57, 0xBA, 0x90, 0x5C, 0x2D, 0xDB, 0x79, 0xCE, 0x4B, 0x83, 0xB6,
+ 0x3C, 0xB0, 0x7B, 0xFA, 0x7B, 0x05, 0xAD, 0x0B, 0xA0, 0xF5, 0xBD, 0x24, 0x42, 0x69, 0x2D, 0xE4,
+ 0x9B, 0x67, 0xB9, 0xBD, 0x6E, 0x18, 0x61, 0xE6, 0x30, 0x62, 0x01, 0xBB, 0x88, 0xB6, 0xC2, 0x6A,
+ 0x09, 0x87, 0x2C, 0xB9, 0xC6, 0x11, 0x54, 0xC5, 0x19, 0xA3, 0xBC, 0x54, 0xDD, 0x2C, 0x13, 0xDD,
+ 0xA1, 0xD2, 0x4D, 0x79, 0x2A, 0xE0, 0x89, 0xB0, 0x3B, 0xC1, 0xF4, 0xB8, 0xCC, 0x7A, 0xF8, 0x90,
+ 0xC2, 0xEF, 0x2F, 0x1E, 0xEC, 0xBB, 0xDC, 0x8A, 0x82, 0x9E, 0x94, 0x04, 0x30, 0x1E, 0x33, 0x66,
+ 0x8F, 0x22, 0x47, 0xE4, 0x80, 0x6A, 0x70, 0x87, 0x47, 0x95, 0x5D, 0x7F, 0x10, 0x66, 0x7D, 0x94,
+ 0xDB, 0xB2, 0xD2, 0xA6, 0x10, 0xE0, 0xBE, 0x01, 0xB2, 0x5A, 0xB2, 0x66, 0x01, 0xA2, 0xA1, 0x4E,
+ 0xB5, 0xD5, 0xBE, 0x52, 0x88, 0x11, 0xB0, 0x45, 0xB6, 0xA4, 0x0B, 0xEE, 0x50, 0x45, 0x0C, 0x9D,
+ 0x3F, 0xA3, 0x4C, 0xEC, 0x63, 0x6D, 0x99, 0x6C, 0x30, 0x7F, 0xB1, 0x27, 0x38, 0xB7, 0xBC, 0x41,
+ 0x49, 0x08, 0x7E, 0xBE, 0x84, 0x9C, 0x3C, 0x5C, 0xBA, 0x19, 0xA3, 0x00, 0xB1, 0x1F, 0xD4, 0x1B,
+ 0x80, 0x9D, 0xA2, 0xFC, 0xCA, 0x70, 0xFF, 0x15, 0x02, 0x60, 0x69, 0x12, 0x64, 0x40, 0x1D, 0xF1,
+ 0x65, 0x12, 0x52, 0x64, 0x3A, 0xAC, 0x44, 0xE2, 0x9D, 0xE3, 0x8C, 0x50, 0xD5, 0x59, 0x7E, 0x1A,
+ 0xE0, 0x26, 0x72, 0xB5, 0x52, 0xB4, 0x79, 0xB9, 0x93, 0x41, 0xA2, 0xC9, 0x5D, 0x9E, 0x65, 0x70,
+ 0x83, 0x2D, 0x3A, 0x93, 0xE4, 0xDE, 0xC3, 0x40, 0x35, 0xA2, 0x86, 0x3D, 0x9D, 0x0A, 0x9E, 0x11,
+ 0xEA, 0x81, 0xDB, 0x3B, 0x99, 0xCB, 0x46, 0xD3, 0x6B, 0x49, 0xB6, 0xDA, 0xE8, 0xF1, 0xB5, 0xA4,
+ 0x52, 0x15, 0x39, 0xAE, 0xBF, 0xA7, 0xDB, 0xEE, 0xDF, 0x41, 0x24, 0x98, 0xED, 0xF3, 0x0D, 0x12,
+ 0xBE, 0x59, 0x4E, 0x09, 0xF8, 0x50, 0xDE, 0xE2, 0x36, 0x9A, 0x12, 0xC4, 0x12, 0xF2, 0xF1, 0xF8,
+ 0x58, 0xC8, 0x86, 0x14, 0xE1, 0x39, 0x3B, 0x9A, 0xFB, 0x46, 0x7B, 0x98, 0x0D, 0x26, 0xBC, 0xA3,
+ 0x54, 0xEA, 0x01, 0x72, 0x68, 0x73, 0x2F, 0xD5, 0x08, 0x3B, 0xF3, 0x7B, 0x7A, 0x9F, 0xDB, 0x29,
+ 0x11, 0x3B, 0xF0, 0x07, 0x4C, 0x46, 0x10, 0xDF, 0xA0, 0x9D, 0x0A, 0xD8, 0x08, 0x1A, 0x7B, 0xD1,
+ 0xE1, 0x9A, 0x83, 0x77, 0x1A, 0x2F, 0x1A, 0x16, 0x77, 0x22, 0x75, 0x98, 0xED, 0x70, 0x40, 0x54,
+ 0x9A, 0x15, 0x56, 0x32, 0x93, 0xC9, 0xA2, 0xD1, 0x48, 0x54, 0x8F, 0xEF, 0x07, 0x43, 0x4D, 0x9E,
+ 0xC7, 0x07, 0x32, 0x6C, 0x6E, 0xAC, 0x79, 0x8C, 0x6E, 0x1A, 0x48, 0x99, 0xBC, 0x6A, 0x0D, 0x19,
+ 0x47, 0x5B, 0x1C, 0x3E, 0x18, 0xCA, 0x54, 0x6A, 0x7F, 0xA4, 0xAB, 0xD3, 0x2B, 0x86, 0xD1, 0x1B,
+ 0x32, 0xCB, 0x8C, 0x12, 0x1C, 0x0D, 0x28, 0x52, 0xD1, 0x02, 0x47, 0x22, 0xD2, 0xD4, 0x79, 0xDD,
+ 0xB9, 0x8C, 0x49, 0xD0, 0x26, 0x94, 0xAE, 0x0E, 0xC1, 0xA3, 0x27, 0x6F, 0x87, 0x5D, 0x30, 0xED,
+ 0xFB, 0x30, 0x13, 0x23, 0x9C, 0xC3, 0x10, 0x5D, 0x8F, 0x8A, 0x9D, 0xD8, 0x91, 0xC2, 0xA5, 0x70,
+ 0x8C, 0xC4, 0x56, 0xD0, 0x43, 0xE7, 0xAB, 0x40, 0xD4, 0x8F, 0xBE, 0x1B, 0xE4, 0xD5, 0xD2, 0xC5,
+ 0x83, 0x8C, 0x27, 0xE9, 0x3B, 0x4F, 0xDB, 0xF4, 0x79, 0xCA, 0x91, 0x89, 0xF3, 0x78, 0xEB, 0x40,
+ 0x25, 0x80, 0x73, 0xB6, 0x49, 0x8F, 0x76, 0x74, 0x70, 0xD4, 0x70, 0xDC, 0x77, 0x2F, 0xDD, 0xC2,
+ 0x1B, 0x12, 0xB1, 0xA1, 0x3F, 0xC5, 0xAC, 0x70, 0x22, 0x1F, 0xB4, 0x8E, 0x36, 0xC2, 0x5E, 0x93,
+ 0x51, 0x42, 0x93, 0xEB, 0x26, 0x13, 0xDC, 0x38, 0x03, 0x68, 0xF6, 0xE1, 0x77, 0x3C, 0x81, 0x07,
+ 0xD4, 0x55, 0x70, 0x56, 0x25, 0x0A, 0x08, 0x36, 0x6F, 0x99, 0xFE, 0x12, 0xDC, 0xA1, 0x35, 0x19,
+ 0x30, 0xAA, 0x84, 0xB5, 0xE6, 0xF6, 0x23, 0x81, 0xC4, 0x7D, 0x95, 0x35, 0x4C, 0xD5, 0xFA, 0x12,
+ 0xB4, 0x09, 0x20, 0x00, 0x5C, 0x15, 0xB2, 0xDD, 0x8B, 0x77, 0x2F, 0x97, 0xDD, 0xFD, 0x4E, 0xEF,
+ 0x20, 0x3F, 0x0F, 0x0C, 0xA6, 0xE3, 0x40, 0x12, 0xA3, 0xD1, 0x18, 0x0F, 0x88, 0x16, 0x97, 0x48,
+ 0x6B, 0x76, 0x10, 0xE8, 0x4A, 0x91, 0xA4, 0x9C, 0x05, 0x88, 0xA8, 0xC7, 0x2B, 0x3A, 0xAB, 0x87,
+ 0xE1, 0x51, 0x21, 0xE5, 0x7B, 0xD4, 0x78, 0xB7, 0x4C, 0x35, 0x7C, 0x0A, 0x27, 0x63, 0xA8, 0x15,
+ 0xCF, 0xB8, 0xEE, 0x00, 0x5C, 0xD5, 0x9F, 0x40, 0x5B, 0x8A, 0xEC, 0xA3, 0xFA, 0x64, 0x73, 0xE2,
+ 0x8E, 0x5E, 0x1F, 0x69, 0x0C, 0xD4, 0x0A, 0x95, 0x2E, 0x62, 0xD6, 0xB1, 0x7B, 0x51, 0x3E, 0x54,
+ 0x7C, 0x51, 0x00, 0xF2, 0xF0, 0x49, 0xD2, 0xB2, 0x13, 0xF6, 0x1E, 0x37, 0xC4, 0xE8, 0x2A, 0xC2,
+ 0x5D, 0x50, 0xCE, 0x31, 0xDD, 0x4F, 0x5E, 0x94, 0x8A, 0x33, 0xF3, 0x52, 0xDC, 0x9E, 0xBE, 0x1B,
+ 0xE9, 0xA2, 0x97, 0xF4, 0x4A, 0xC0, 0xCA, 0x26, 0x24, 0x2B, 0x94, 0xA3, 0xBF, 0x41, 0xD5, 0x1E,
+ 0x06, 0xFC, 0x74, 0x34, 0xCA, 0x2A, 0x61, 0x3C, 0xB2, 0x22, 0xD9, 0x24, 0xF9, 0x8C, 0x37, 0x3E,
+ 0x48, 0x1D, 0xAA, 0xBE, 0x9F, 0x0F, 0x93, 0x14, 0x94, 0x3A, 0x44, 0x7F, 0x47, 0x7A, 0x1D, 0x07,
+ 0x33, 0x4F, 0x86, 0x39, 0xF3, 0xD5, 0x23, 0xAF, 0x83, 0xF0, 0xCC, 0xFA, 0xDA, 0x86, 0x5F, 0x6B,
+ 0x28, 0x77, 0xF2, 0x28, 0x78, 0xFF, 0x7B, 0xB9, 0xB9, 0x9B, 0xF7, 0x45, 0x46, 0x86, 0x12, 0xED,
+ 0xB0, 0x93, 0x89, 0x7B, 0xFF, 0xE8, 0x93, 0xB7, 0xAD, 0x08, 0xBC, 0xB2, 0xE9, 0x53, 0xFB, 0x78,
+ 0xD6, 0xAD, 0xB3, 0x0D, 0x9F, 0xEC, 0x97, 0x49, 0xA6, 0x43, 0xAB, 0xBE, 0x5E, 0xF9, 0x9D, 0xA0,
+ 0xAE, 0x1D, 0x7C, 0x05, 0xB7, 0x2B, 0x60, 0x3A, 0x61, 0xE3, 0x69, 0xA8, 0xBA, 0x6F, 0xD5, 0x9E,
+ 0x23, 0x8E, 0x0C, 0x99, 0x03, 0x24, 0xE9, 0xDC, 0x52, 0xC5, 0x74, 0xE9, 0x14, 0x1F, 0x71, 0x5C,
+ 0x91, 0x61, 0x6D, 0x2F, 0xB2, 0xA8, 0xCE, 0x88, 0xBE, 0x8E, 0x73, 0x44, 0xF4, 0x53, 0x9B, 0x19,
+ 0x0A, 0xEC, 0xBE, 0x54, 0xF6, 0x31, 0x00, 0x91, 0xE9, 0x39, 0x72, 0x0E, 0x07, 0x6A, 0xE9, 0x46,
+ 0x5E, 0xF8, 0xF8, 0x3B, 0x30, 0x60, 0x8E, 0xD0, 0xBC, 0x05, 0x1E, 0xF5, 0xEE, 0x33, 0x6A, 0xFA,
+ 0x54, 0xCD, 0x4E, 0x8B, 0xCF, 0xEC, 0xD9, 0x9F, 0x53, 0x3A, 0xEF, 0x21, 0xC3, 0x6F, 0x09, 0xF8,
+ 0x67, 0xFD, 0x3E, 0x70, 0xE6, 0x6F, 0x63, 0x99, 0xE5, 0x4F, 0xD6, 0x70, 0xED, 0xFB, 0x3B, 0xD9,
+ 0xFF, 0xAA, 0x30, 0x5C, 0xBE, 0xB2, 0x28, 0x78, 0xE4, 0xB5, 0x26, 0x82, 0x03, 0x86, 0xB9, 0xDB,
+ 0x9D, 0xBD, 0x99, 0xD8, 0xF2, 0x70, 0x9C, 0x9D, 0x6C, 0x81, 0xFC, 0xF8, 0x2B, 0x5E, 0xD4, 0x85,
+ 0x95, 0x62, 0xEB, 0xFA, 0xEB, 0x5A, 0x09, 0xC6, 0x14, 0x51, 0xE2, 0x43, 0x62, 0xE9, 0x69, 0x31,
+ 0xB1, 0x7B, 0x8F, 0xA6, 0x4D, 0x76, 0xD5, 0x8C, 0xF1, 0xB2, 0xD5, 0x07, 0x17, 0x21, 0x64, 0x23,
+ 0xCA, 0x68, 0xF8, 0x60, 0xFF, 0x15, 0x7D, 0xB8, 0xCE, 0xBA, 0xF3, 0x92, 0x77, 0x04, 0x2F, 0x38,
+ 0x99, 0x1A, 0xF7, 0x91, 0xC9, 0x0C, 0x99, 0x0F, 0x3A, 0x58, 0x7D, 0x31, 0x01, 0xCB, 0x10, 0xBD,
+ 0xC0, 0xAD, 0x4D, 0x37, 0x6C, 0x87, 0x3E, 0x9B, 0x4B, 0xE2, 0x68, 0x72, 0x8C, 0x40, 0xED, 0x6F,
+ 0xD6, 0xC1, 0x8B, 0xA0, 0x82, 0xA7, 0x72, 0x73, 0x79, 0x8A, 0xC9, 0xFB, 0x57, 0xEE, 0xFA, 0x5D,
+ 0x15, 0x53, 0x2F, 0x81, 0x66, 0x7E, 0xC1, 0x4E, 0xEF, 0x23, 0xC2, 0xB5, 0x76, 0x61, 0xC1, 0xAC,
+ 0x55, 0x01, 0x72, 0xB6, 0x2E, 0xC9, 0x56, 0x30, 0x73, 0x77, 0xFE, 0x6F, 0x0F, 0x4F, 0xD4, 0xA3,
+ 0xA0, 0x51, 0xC1, 0xEC, 0xE9, 0xF8, 0x16, 0x7A, 0x22, 0x9F, 0x55, 0xDA, 0xA9, 0xC0, 0x31, 0x84,
+ 0xC0, 0x3F, 0x3A, 0x57, 0x9D, 0x41, 0x9B, 0x4A, 0x5E, 0x84, 0x19, 0xE5, 0x93, 0xC8, 0xAE, 0xFA,
+ 0x91, 0xD8, 0xB8, 0x98, 0x67, 0xB2, 0x8C, 0x37, 0x4B, 0x4C, 0xAA, 0xF9, 0x7C, 0xCD, 0x67, 0x50,
+ 0xB2, 0x83, 0x19, 0x88, 0x89, 0xE9, 0xD1, 0xD1, 0x29, 0xA8, 0x9C, 0x94, 0x24, 0x65, 0x1D, 0xF4,
+ 0x67, 0x9A, 0xF3, 0x91, 0xB2, 0x3B, 0xAB, 0x94, 0xE9, 0x8C, 0x16, 0xD6, 0x58, 0x17, 0x18, 0x72,
+ 0xB2, 0xBD, 0xCD, 0x1B, 0x4B, 0x8A, 0x32, 0x70, 0xDC, 0xFC, 0x97, 0x54, 0x73, 0x25, 0x74, 0x9B,
+ 0xF3, 0x90, 0x0C, 0x04, 0xDD, 0x7C, 0x1A, 0xA8, 0xD7, 0x33, 0xCD, 0xE6, 0x88, 0xAF, 0x8E, 0x96,
+ 0xD1, 0xE9, 0xFF, 0xCE, 0xEE, 0x3C, 0x1A, 0x42, 0xA5, 0xB2, 0x56, 0xB3, 0x99, 0xA3, 0x8E, 0xED,
+ 0x2D, 0xE7, 0xAE, 0xB0, 0x2E, 0x3C, 0xC6, 0x7C, 0xAA, 0xA3, 0x3F, 0xC7, 0xD2, 0x79, 0x04, 0x98,
+ 0x9A, 0xC0, 0xA4, 0x6A, 0xDC, 0x64, 0x49, 0x24, 0x4F, 0x8B, 0xFA, 0x86, 0x45, 0x17, 0xE8, 0x7E,
+ 0xF5, 0xD3, 0x8A, 0x56, 0x76, 0xBF, 0x95, 0x50, 0xE2, 0x4A, 0xE1, 0x3F, 0xF2, 0x50, 0x5E, 0x8F,
+ 0x99, 0x2C, 0xE7, 0xB9, 0x10, 0x6C, 0x99, 0x7C, 0x39, 0x6C, 0xA3, 0x39, 0xAB, 0x0B, 0xF0, 0x84,
+ 0x82, 0x7C, 0xD6, 0x59, 0x21, 0x5B, 0x85, 0xFD, 0xFC, 0xF9, 0x15, 0xC2, 0x35, 0x02, 0x52, 0xD2,
+ 0x16, 0x20, 0x3B, 0x6F, 0x27, 0xFB, 0x7F, 0x11, 0xBF, 0x05, 0xA1, 0xF1, 0x7C, 0xA1, 0x73, 0x34,
+ 0xFD, 0x40, 0x3D, 0xF0, 0x36, 0xEE, 0xC8, 0x4B, 0xC7, 0x4F, 0x35, 0x04, 0x1C, 0x69, 0x49, 0x65,
+ 0x0B, 0xCD, 0x4E, 0x3B, 0xED, 0x5C, 0xA6, 0x42, 0x11, 0xB8, 0xFC, 0x8F, 0xA9, 0x44, 0x04, 0x55,
+ 0x19, 0x12, 0xA8, 0xAC, 0xE0, 0x4F, 0x13, 0xB5, 0xA0, 0xBA, 0xAD, 0xFA, 0x84, 0x5E, 0x11, 0x95,
+ 0x4B, 0xC1, 0x19, 0x57, 0x45, 0x3E, 0x3C, 0x46, 0x92, 0x0C, 0xAD, 0x54, 0xD2, 0xDD, 0x47, 0x6F,
+ 0xF0, 0x77, 0x0E, 0xAD, 0xD2, 0x5D, 0xEF, 0x39, 0xF3, 0x67, 0xD7, 0x8D, 0x31, 0x3C, 0xCD, 0x5B,
+ 0xB0, 0x3A, 0x47, 0x4C, 0xD1, 0x16, 0xBB, 0xB2, 0xDA, 0x65, 0xF0, 0x9B, 0x82, 0x75, 0x3B, 0xF7,
+ 0x46, 0xD3, 0x12, 0xBA, 0xFD, 0x04, 0x9D, 0x2E, 0x8A, 0x3E, 0x75, 0x88, 0x9A, 0xC7, 0xF3, 0x20,
+ 0x6B, 0x9E, 0xD7, 0xD3, 0xD3, 0x39, 0x75, 0xF9, 0x76, 0x47, 0xB0, 0xEB, 0xD1, 0x3E, 0xEA, 0xD9,
+ 0xF4, 0x7F, 0x0B, 0x6C, 0xF6, 0x8B, 0x04, 0xD3, 0x6F, 0x1F, 0x6D, 0x30, 0xA0, 0xA3, 0x09, 0x45,
+ 0x57, 0x6E, 0xE2, 0x3A, 0x0E, 0xE7, 0x07, 0x98, 0x24, 0xED, 0xCB, 0x6D, 0x73, 0xB9, 0x4E, 0x09,
+ 0xE7, 0xA9, 0xDD, 0xF7, 0x28, 0xBE, 0xA6, 0x94, 0x4E, 0x58, 0x92, 0x88, 0x74, 0x91, 0x85, 0x20,
+ 0x3C, 0x78, 0xBB, 0xA4, 0x13, 0x65, 0xA6, 0x82, 0x2A, 0xCF, 0x1F, 0x2F, 0x43, 0x78, 0x43, 0x36,
+ 0x32, 0x8B, 0x99, 0xE9, 0x7E, 0xC3, 0x73, 0x39, 0x3E, 0xC3, 0xFF, 0x42, 0x29, 0x76, 0xD7, 0x99,
+ 0x3B, 0x7A, 0x0A, 0xCF, 0x7F, 0x40, 0xB7, 0x54, 0x92, 0x23, 0x18, 0x64, 0xD8, 0xD1, 0x12, 0xC4,
+ 0x91, 0xBF, 0xA1, 0x90, 0x5E, 0x03, 0xB3, 0x1D, 0xC5, 0xF4, 0xD7, 0xC7, 0x9A, 0x6C, 0x87, 0x90,
+ 0xB8, 0xD2, 0x0C, 0x66, 0x04, 0x20, 0x73, 0xA9, 0x6A, 0x73, 0xD4, 0xC5, 0x76, 0x5A, 0xBA, 0x4D,
+ 0xD1, 0x56, 0xFA, 0x99, 0xF6, 0x32, 0x90, 0x5E, 0xFD, 0x19, 0xA4, 0xCD, 0x85, 0x1F, 0x13, 0x39,
+ 0x0D, 0x2D, 0x6B, 0x01, 0xA4, 0x48, 0x59, 0x0F, 0x6E, 0x4B, 0xC2, 0xD4, 0xF4, 0x03, 0x71, 0x92,
+ 0x91, 0x0E, 0xCD, 0x5B, 0x0A, 0x48, 0xB4, 0xA2, 0x1A, 0xA4, 0xF1, 0x93, 0x6F, 0x1B, 0x90, 0x33,
+ 0xCF, 0x05, 0xF5, 0xB4, 0x0D, 0x7F, 0xE3, 0x88, 0xD7, 0x8F, 0xB6, 0x34, 0xBD, 0xEC, 0x0B, 0xA2,
+ 0x45, 0xCA, 0x3B, 0xFD, 0xB2, 0x74, 0x10, 0xC0, 0x16, 0x03, 0x77, 0x1B, 0x0C, 0xBC, 0xFB, 0x36,
+ 0x93, 0x8A, 0x95, 0x52, 0x14, 0x4A, 0x52, 0x42, 0x4E, 0x8C, 0x5E, 0x59, 0xEC, 0x68, 0xC7, 0xCE,
+ 0x8F, 0xFB, 0x15, 0x10, 0xA1, 0xDB, 0xA2, 0x6A, 0x6D, 0x49, 0x65, 0x3C, 0x7C, 0x71, 0xE9, 0x91,
+ 0xD5, 0x25, 0x08, 0x19, 0x66, 0xFD, 0x67, 0xF7, 0xC3, 0x4C, 0x1A, 0x4D, 0x6E, 0x31, 0xA0, 0x2A,
+ 0x49, 0x57, 0x97, 0xB0, 0x8E, 0xB4, 0xB6, 0x0D, 0xCE, 0xA5, 0x26, 0x52, 0x6C, 0xA3, 0xB3, 0x0E,
+ 0xC6, 0x1E, 0x28, 0xA6, 0x4B, 0xEF, 0x20, 0xD1, 0x58, 0x86, 0x64, 0xEF, 0x49, 0x40, 0x62, 0x43,
+ 0x58, 0x2A, 0x65, 0x5D, 0x8C, 0x91, 0xFE, 0xDB, 0x85, 0x2D, 0x9D, 0x66, 0x0B, 0x5B, 0xDF, 0xCA,
+ 0xFC, 0xA4, 0x35, 0x01, 0xA4, 0x0C, 0x3E, 0x82, 0xF6, 0xD0, 0xB6, 0xEB, 0x38, 0x6F, 0x6F, 0xD6,
+ 0xB0, 0x6D, 0xD5, 0xC8, 0x37, 0x2D, 0xD4, 0x3F, 0x7F, 0xA9, 0xCD, 0x95, 0xD0, 0xE0, 0xBA, 0x56,
+ 0xF2, 0xF5, 0x2F, 0x38, 0xDA, 0x23, 0x3C, 0x62, 0xC1, 0x96, 0xAC, 0xE4, 0xA5, 0xAB, 0xD3, 0xE4,
+ 0x42, 0xD6, 0x06, 0x7D, 0x2F, 0x64, 0xBC, 0x8E, 0xD7, 0x49, 0xF1, 0xA8, 0x08, 0xC0, 0xD4, 0xED,
+ 0x10, 0x53, 0x99, 0x3F, 0x7E, 0x66, 0xC8, 0x24, 0xDB, 0x12, 0x1E, 0x15, 0x30, 0x8E, 0x76, 0xD7,
+ 0xCD, 0x65, 0xD4, 0x97, 0xCB, 0xC7, 0xDD, 0x89, 0x1E, 0x28, 0x7B, 0x08, 0xED, 0x16, 0xBD, 0x78,
+ 0x21, 0x5A, 0xBD, 0x37, 0x98, 0xD8, 0xE3, 0x81, 0x6B, 0x5C, 0x96, 0x51, 0x45, 0x95, 0xED, 0x2A,
+ 0x53, 0x4B, 0xDB, 0x96, 0x66, 0xB4, 0xBF, 0x54, 0x55, 0xBC, 0x82, 0xB0, 0x31, 0x75, 0xA0, 0xA7,
+ 0x5F, 0x4D, 0xED, 0x89, 0xBB, 0x47, 0x87, 0x40, 0x68, 0xCA, 0x74, 0x3A, 0xD9, 0x3A, 0xC3, 0x10,
+ 0xBA, 0x18, 0xAF, 0xC7, 0x67, 0x0A, 0x86, 0x31, 0x08, 0xE6, 0x8A, 0xD6, 0x0C, 0xD6, 0xDE, 0xB6,
+ 0x4A, 0xD7, 0x99, 0xC6, 0x28, 0xBF, 0xD2, 0x82, 0xF6, 0x8C, 0xFA, 0xC9, 0x0F, 0x81, 0x1A, 0x9B,
+ 0xD1, 0xE5, 0x7C, 0x3B, 0x31, 0x30, 0x14, 0x27, 0x23, 0x69, 0xD6, 0x3E, 0xB2, 0x94, 0x0A, 0xC4,
+ 0xD0, 0x6F, 0x98, 0x4A, 0x42, 0xE5, 0x81, 0x51, 0x00, 0xD4, 0x46, 0x1F, 0x6A, 0x96, 0x3B, 0xB1,
+ 0x03, 0x2F, 0x81, 0x2B, 0xD8, 0xC8, 0x79, 0xCF, 0x3E, 0x3F, 0x53, 0xDC, 0x88, 0x1A, 0xF8, 0xAF,
+ 0x1C, 0xF5, 0x71, 0x0A, 0xCF, 0xE2, 0x06, 0x29, 0x76, 0xBD, 0xAA, 0x55, 0x9E, 0x87, 0x72, 0x47,
+ 0x7C, 0x74, 0x36, 0x17, 0xC7, 0xDF, 0x90, 0xA4, 0x92, 0x2C, 0x72, 0x17, 0x4B, 0xAB, 0x41, 0x7B,
+ 0xA2, 0xEC, 0x60, 0x0A, 0xB9, 0x25, 0xAF, 0xAC, 0x0F, 0x66, 0x60, 0x92, 0xC1, 0xA8, 0x5F, 0xD4,
+ 0x67, 0x3F, 0x9D, 0xF4, 0x63, 0x3A, 0x28, 0x21, 0x2A, 0x8C, 0x4A, 0x4E, 0x89, 0x0B, 0x23, 0x46,
+ 0x81, 0x8D, 0xC1, 0xE0, 0x0F, 0x87, 0x60, 0xFA, 0xA1, 0xC1, 0x71, 0x1F, 0x10, 0x37, 0xDA, 0xCC,
+ 0x65, 0xF5, 0xA0, 0x33, 0x84, 0x84, 0x36, 0x0A, 0xED, 0x28, 0x3F, 0x5A, 0xBE, 0x76, 0x95, 0xB6,
+ 0xA4, 0xBA, 0xE3, 0x92, 0xF8, 0x4B, 0x55, 0x78, 0x23, 0xBF, 0xAD, 0x7B, 0x39, 0x72, 0xAF, 0xE8,
+ 0xAC, 0xEE, 0x27, 0x69, 0x0E, 0x8C, 0x57, 0x29, 0x08, 0xDA, 0xCB, 0x35, 0x07, 0x6D, 0xA4, 0x66,
+ 0xC5, 0xF6, 0xF0, 0x73, 0x3A, 0xDC, 0xD3, 0x08, 0x79, 0x9A, 0x28, 0xCC, 0xD0, 0xCC, 0x45, 0x7C,
+ 0xED, 0x82, 0x5A, 0x14, 0x29, 0xEF, 0x7E, 0x1E, 0x80, 0x42, 0x5E, 0x36, 0xD3, 0x21, 0x48, 0x8C,
+ 0xE6, 0xBA, 0x91, 0x42, 0x54, 0xC6, 0xCF, 0x36, 0x4D, 0x68, 0xE5, 0xC3, 0x18, 0xEF, 0xCE, 0x92,
+ 0x47, 0xE7, 0x2E, 0x8F, 0xB1, 0x67, 0x88, 0xC6, 0xB4, 0xB3, 0x98, 0xF8, 0x44, 0x51, 0x6D, 0x44,
+ 0xC5, 0x11, 0xFB, 0x2E, 0xA5, 0x67, 0x48, 0xDE, 0xED, 0x7E, 0x9C, 0x6F, 0x53, 0x5D, 0xA0, 0xFF,
+ 0x9F, 0x4D, 0x2E, 0x3F, 0xB6, 0x0D, 0x61, 0x41, 0x35, 0xB7, 0x0B, 0x28, 0x8F, 0x6A, 0x29, 0xD5,
+ 0xFC, 0x25, 0x42, 0xBF, 0x04, 0x0E, 0xA7, 0xC0, 0xE9, 0xD4, 0xD0, 0x99, 0x26, 0x0C, 0x3B, 0xEE,
+ 0xE0, 0x66, 0xFB, 0x66, 0x0E, 0xEC, 0x37, 0x13, 0xE2, 0xD8, 0x2F, 0x90, 0x6B, 0x0D, 0x4E, 0x9C,
+ 0x14, 0xCB, 0xBA, 0xF0, 0xD6, 0x49, 0x55, 0xAB, 0xFE, 0x96, 0x74, 0x48, 0x07, 0xA2, 0x0B, 0x6F,
+ 0x91, 0x0B, 0x7D, 0x75, 0x60, 0xB9, 0x11, 0x1B, 0x8F, 0x48, 0x6D, 0x66, 0xED, 0xDD, 0xCC, 0x83,
+ 0x57, 0x1A, 0x2B, 0x81, 0x7F, 0xC5, 0x7B, 0x3B, 0x16, 0x92, 0x93, 0x6C, 0xC7, 0xB2, 0xC5, 0x48,
+ 0xAE, 0xB2, 0x2E, 0x4C, 0x22, 0xE8, 0xF9, 0xD4, 0x91, 0x95, 0xA9, 0xA1, 0x97, 0x48, 0x80, 0x4D,
+ 0x4D, 0x5E, 0xEF, 0x3E, 0x87, 0xD5, 0x3C, 0xF7, 0xDF, 0xFA, 0x36, 0x4A, 0xC4, 0x72, 0x0C, 0x2E,
+ 0x0E, 0xA2, 0xC6, 0x61, 0xB1, 0x3D, 0xEC, 0x5A, 0x6C, 0x9D, 0x16, 0x81, 0x13, 0x61, 0x8E, 0x7E,
+ 0x28, 0xA0, 0x3D, 0xEB, 0x8E, 0x97, 0x59, 0x0E, 0x24, 0xCF, 0x5B, 0x4D, 0x98, 0xDE, 0x01, 0xC9,
+ 0x48, 0x97, 0x8F, 0x1C, 0xCC, 0xF9, 0x6B, 0xA8, 0xC0, 0x44, 0x73, 0xEB, 0x06, 0x17, 0xB2, 0x8D,
+ 0xA5, 0xD4, 0x25, 0x87, 0x0E, 0xE2, 0x6E, 0x0D, 0x99, 0x7E, 0xCE, 0x06, 0x83, 0x99, 0x3A, 0x8C,
+ 0xE6, 0xC7, 0x99, 0xAC, 0x3C, 0xF3, 0x0C, 0x50, 0x8F, 0xA7, 0xB2, 0x2B, 0x3C, 0xCA, 0x56, 0x06,
+ 0x63, 0xA0, 0x9A, 0xB6, 0xF8, 0x84, 0x43, 0x03, 0x04, 0x07, 0x8A, 0xEC, 0x43, 0xA1, 0x3E, 0x5F,
+ 0xE2, 0x2A, 0x50, 0x02, 0xBA, 0x62, 0xDA, 0x77, 0x7A, 0xC9, 0x06, 0x50, 0xF5, 0xEE, 0xE0, 0xD0,
+ 0x85, 0xDA, 0x15, 0x54, 0x36, 0x83, 0x44, 0xC5, 0x14, 0xBD, 0x98, 0xB4, 0x37, 0x27, 0x56, 0x4B,
+ 0xB2, 0x19, 0x59, 0xEB, 0xD5, 0x95, 0x27, 0xAD, 0x94, 0x2F, 0x36, 0x8D, 0x61, 0x26, 0x95, 0xEF,
+ 0x4B, 0x05, 0x9E, 0x22, 0xDB, 0x76, 0x06, 0x67, 0xA0, 0x0D, 0x28, 0x90, 0x5D, 0x6D, 0xFF, 0xA6,
+ 0x2F, 0x2F, 0x8F, 0x1F, 0x72, 0xEA, 0x88, 0x79, 0xE2, 0xC8, 0x8B, 0xA1, 0x19, 0xC3, 0x09, 0xA3,
+ 0x21, 0x93, 0xB4, 0x74, 0xB1, 0xDF, 0x53, 0x78, 0x08, 0x25, 0x01, 0xC6, 0x83, 0x2D, 0x17, 0xD4,
+ 0x6C, 0x44, 0x1C, 0xAE, 0xFD, 0x3D, 0xE8, 0xF0, 0xA7, 0x93, 0x59, 0x3B, 0x96, 0x01, 0x5F, 0xC1,
+ 0xA4, 0x5F, 0x82, 0xA7, 0x1D, 0x9C, 0xB9, 0x60, 0x00, 0xF4, 0x02, 0x9A, 0xD0, 0xCF, 0xA7, 0x8F,
+ 0x25, 0x9E, 0x21, 0xD7, 0x47, 0x9A, 0x18, 0x9E, 0x7F, 0x39, 0x1A, 0x7E, 0x5E, 0x52, 0x44, 0x11,
+ 0x1A, 0xF0, 0xD6, 0x4D, 0x3E, 0x98, 0x2D, 0x88, 0x45, 0xDA, 0xC4, 0xBF, 0x51, 0x9F, 0x34, 0xC0,
+ 0xEA, 0x0E, 0xD1, 0x32, 0xCD, 0xB9, 0x7E, 0x16, 0x01, 0xF2, 0xD4, 0x81, 0x9E, 0x40, 0xC9, 0xBA,
+ 0xC0, 0x93, 0xFB, 0x88, 0x14, 0x8E, 0x79, 0x2F, 0x85, 0x54, 0x12, 0x29, 0x54, 0x8E, 0x4F, 0x72,
+ 0x6C, 0x3F, 0x0D, 0xB6, 0xD4, 0x27, 0x91, 0xCE, 0xAC, 0xC7, 0x7B, 0x9A, 0x77, 0xEA, 0xCB, 0xBE,
+ 0x0C, 0x53, 0xCB, 0x2E, 0x8E, 0x45, 0x3E, 0xC0, 0x95, 0x76, 0x35, 0x96, 0xF0, 0xAF, 0xA1, 0x91,
+ 0x7E, 0x64, 0xE8, 0x82, 0xA2, 0x27, 0x3F, 0x90, 0xC6, 0xE3, 0x78, 0x75, 0xC6, 0x32, 0x3B, 0xDD,
+ 0x91, 0xE4, 0x7C, 0xFD, 0x18, 0x16, 0xAC, 0xEF, 0x93, 0xEF, 0x76, 0xC4, 0x4C, 0xC8, 0x1F, 0x61,
+ 0xEF, 0xD0, 0x40, 0x0D, 0xD9, 0x9B, 0x13, 0xB8, 0xAA, 0x6E, 0xFC, 0x9F, 0x1D, 0x5E, 0x7C, 0x7F,
+ 0xB6, 0x2B, 0xCA, 0x06, 0xF6, 0xDA, 0x06, 0xE0, 0x94, 0x81, 0x8C, 0x49, 0x75, 0xD6, 0x8A, 0xA3,
+ 0xC0, 0x7A, 0x59, 0xCE, 0xFC, 0x85, 0xB4, 0xCA, 0xE5, 0xA3, 0x58, 0x64, 0x31, 0xA8, 0x41, 0x2D,
+ 0xF4, 0xCD, 0x56, 0x10, 0x2A, 0x18, 0x4C, 0x15, 0xBE, 0xD5, 0x1B, 0xAC, 0xC7, 0x68, 0xB4, 0x3C,
+ 0x60, 0x4D, 0xD0, 0xC2, 0x7A, 0xE4, 0xE1, 0x59, 0x84, 0x95, 0x5D, 0x0C, 0x1D, 0x74, 0x4E, 0x5A,
+ 0xCC, 0xBB, 0x85, 0xAA, 0xFC, 0x91, 0x81, 0x50, 0xFC, 0x05, 0xC7, 0x77, 0xC5, 0xE3, 0xCE, 0x70,
+ 0xA1, 0x35, 0xBD, 0xAF, 0x9C, 0x17, 0xB3, 0x52, 0xD0, 0xE1, 0xC4, 0x6B, 0x12, 0x00, 0x4E, 0xA3,
+ 0x2E, 0xC2, 0x45, 0xB3, 0x85, 0x1E, 0xBF, 0x4C, 0x1C, 0xC5, 0x49, 0x7A, 0xB4, 0x9D, 0xCB, 0xB9,
+ 0x2D, 0x93, 0xAF, 0xB3, 0x98, 0x30, 0xA1, 0x17, 0x93, 0x31, 0xE8, 0x79, 0xBE, 0xFB, 0xE3, 0xF6,
+ 0x8E, 0x8F, 0xBE, 0x11, 0x43, 0xCB, 0x06, 0x38, 0xDD, 0x33, 0x5A, 0x27, 0x77, 0xF7, 0x59, 0xF9,
+ 0x12, 0x8E, 0x9E, 0xAA, 0xA6, 0x99, 0x54, 0x9C, 0x26, 0xD8, 0x55, 0x39, 0x8C, 0xD0, 0x62, 0xC7,
+ 0x2B, 0xE7, 0xAD, 0x43, 0xDC, 0xFA, 0xA4, 0xB7, 0xB3, 0xB2, 0xEE, 0xDB, 0xC1, 0x1F, 0x37, 0x44,
+ 0x89, 0x30, 0xBC, 0xE6, 0x6A, 0x17, 0xEC, 0x31, 0xBB, 0x52, 0x52, 0x36, 0x99, 0x49, 0x45, 0x59,
+ 0x6A, 0x55, 0xD0, 0xC6, 0x5C, 0xAD, 0x1B, 0xE6, 0x2F, 0x1B, 0x71, 0x6A, 0x3D, 0x78, 0x3C, 0xFD,
+ 0x63, 0x6F, 0x41, 0x6B, 0x4D, 0xA7, 0x83, 0x65, 0x01, 0xFF, 0x82, 0x0E, 0x0E, 0x04, 0xFC, 0x8B,
+ 0x24, 0xD1, 0x65, 0x3B, 0xF0, 0x61, 0x78, 0x2A, 0x43, 0x4A, 0xD5, 0xDE, 0xE2, 0x7E, 0x41, 0x15,
+ 0x76, 0x08, 0xB8, 0x9B, 0x24, 0x2D, 0x2A, 0xD9, 0x3C, 0xA7, 0x17, 0x47, 0xF7, 0x88, 0xA0, 0xCF,
+ 0xDD, 0x5B, 0x08, 0xB6, 0x05, 0x25, 0x54, 0x80, 0x93, 0x83, 0x9E, 0x8D, 0xE1, 0x1F, 0xE6, 0x8E,
+ 0x08, 0x4C, 0x06, 0x26, 0xE2, 0x0B, 0xE5, 0xEE, 0xDD, 0x4D, 0xAB, 0xD0, 0x43, 0x15, 0x95, 0x66,
+ 0x8F, 0xB6, 0xF8, 0x54, 0xF2, 0xF5, 0x9F, 0x79, 0xB5, 0x08, 0x2E, 0x94, 0x8D, 0x1F, 0x00, 0x86,
+ 0xEF, 0xF2, 0xB7, 0x1C, 0x9A, 0x01, 0xA9, 0x00, 0xE2, 0x61, 0x39, 0x47, 0x52, 0xF1, 0x25, 0xA6,
+ 0xA2, 0xCC, 0x82, 0xB4, 0xE1, 0x93, 0xBE, 0xC4, 0xBF, 0x2E, 0xBA, 0x02, 0x5D, 0x65, 0x09, 0x50,
+ 0x2F, 0x36, 0x58, 0x82, 0x49, 0x9C, 0xC3, 0x78, 0xD8, 0x1D, 0xD5, 0xBC, 0xE8, 0x18, 0xA7, 0xD8,
+ 0x9C, 0xB0, 0x15, 0x7D, 0xF9, 0xE1, 0x58, 0xD3, 0x59, 0xEA, 0x13, 0xEC, 0x9F, 0xD7, 0xF3, 0x35,
+ 0x90, 0xF7, 0x29, 0xC0, 0x21, 0x7C, 0x55, 0xD4, 0x11, 0x48, 0xF7, 0x6F, 0x6A, 0x00, 0xC5, 0x25,
+ 0xE5, 0x00, 0x64, 0xC4, 0xB0, 0x31, 0xE5, 0xF2, 0x03, 0x92, 0x9A, 0x07, 0x47, 0x5E, 0xA0, 0x94,
+ 0x65, 0xAF, 0x5A, 0xB6, 0xFC, 0x4B, 0x48, 0xB6, 0x4A, 0xCF, 0x4D, 0xCA, 0x8C, 0x16, 0x77, 0x6C,
+ 0xF7, 0x99, 0xBD, 0xCC, 0x1E, 0x40, 0x55, 0xE2, 0xAA, 0xCB, 0xBF, 0xCC, 0x74, 0x92, 0xA2, 0x8A,
+ 0x64, 0xC3, 0xE6, 0x17, 0x60, 0x10, 0x72, 0xD1, 0xA0, 0x62, 0xD3, 0x06, 0xCF, 0x12, 0xAD, 0xE6,
+ 0xBE, 0xC4, 0x76, 0xD7, 0x34, 0x8E, 0xA7, 0xB4, 0x76, 0xD5, 0x9D, 0xC3, 0xA1, 0x4A, 0xCE, 0xA9,
+ 0xC0, 0x4F, 0x70, 0x15, 0x91, 0xAD, 0x41, 0x23, 0x44, 0xB8, 0x65, 0x8C, 0x44, 0x49, 0x4F, 0xB8,
+ 0xBE, 0x45, 0x49, 0xA5, 0xAF, 0x02, 0x66, 0x71, 0x58, 0xB6, 0x8D, 0x40, 0xAD, 0x4F, 0x89, 0xF4,
+ 0x6F, 0x25, 0x14, 0xB0, 0x62, 0x9A, 0xA6, 0xE8, 0x72, 0x01, 0x66, 0x02, 0xC9, 0xF2, 0xCE, 0xCA,
+ 0xBD, 0xA1, 0x3A, 0x12, 0xE4, 0xD4, 0x3A, 0x4B, 0x40, 0xC6, 0xB6, 0x29, 0x00, 0xC9, 0x92, 0x04,
+ 0x3B, 0xBC, 0xA9, 0x2E, 0xAD, 0x63, 0x7C, 0xC5, 0x84, 0xAE, 0x3D, 0x91, 0x64, 0x28, 0xB1, 0xA2,
+ 0xA7, 0x7E, 0x67, 0xD5, 0xBF, 0x8B, 0x00, 0x23, 0x37, 0x87, 0x57, 0x83, 0xA8, 0x2C, 0x13, 0x12,
+ 0x5A, 0x86, 0x67, 0x79, 0x3A, 0xF7, 0xFA, 0x2B, 0xCB, 0xC2, 0xB6, 0x20, 0xF0, 0xD2, 0x3F, 0x39,
+ 0x1B, 0x23, 0xA2, 0x11, 0x74, 0x9C, 0xA2, 0x8E, 0x91, 0x4E, 0x70, 0xB3, 0xE1, 0x85, 0x18, 0xC6,
+ 0x16, 0x4B, 0x25, 0x93, 0xF1, 0x76, 0x74, 0x4C, 0xA8, 0x9C, 0x81, 0x73, 0xE4, 0x97, 0x54, 0x2A,
+ 0x74, 0x45, 0xD7, 0x3A, 0x80, 0x36, 0x43, 0x68, 0x91, 0xAE, 0x99, 0x3B, 0xE6, 0x64, 0x28, 0xC1,
+ 0xFD, 0xE6, 0xD3, 0xFA, 0xCE, 0xE2, 0x63, 0xA2, 0x27, 0xA0, 0x50, 0x83, 0x9E, 0x90, 0xE9, 0x47,
+ 0x95, 0x27, 0x20, 0x6F, 0x82, 0x4A, 0x88, 0x46, 0xBB, 0xC6, 0xBA, 0x55, 0x72, 0xA8, 0xBD, 0x21,
+ 0xD7, 0xE7, 0xFC, 0xC2, 0xCF, 0x30, 0x43, 0x09, 0x80, 0x15, 0xDC, 0x61, 0xFA, 0xE3, 0x46, 0x03,
+ 0xD6, 0x28, 0x05, 0xC4, 0x24, 0xD3, 0xC6, 0x90, 0x36, 0x4B, 0x58, 0xE0, 0x32, 0x3A, 0x6B, 0xDD,
+ 0x95, 0xEF, 0x4A, 0xDB, 0x72, 0x8A, 0x85, 0xFD, 0x1B, 0x72, 0x48, 0xAF, 0xE1, 0x75, 0x0B, 0xAF,
+ 0x65, 0xAA, 0xDC, 0xD1, 0xBA, 0xB5, 0x6F, 0x15, 0x95, 0xE6, 0x2B, 0x9B, 0x78, 0xE3, 0xCF, 0xB8,
+ 0xB6, 0x1D, 0xE6, 0xB9, 0xB9, 0xA5, 0x20, 0x53, 0xC4, 0x50, 0xDC, 0xD2, 0x4A, 0x4D, 0x80, 0x44,
+ 0xF5, 0xFD, 0x68, 0xB0, 0x78, 0x75, 0x79, 0x08, 0x19, 0xCE, 0x4C, 0xA1, 0x85, 0x51, 0xFA, 0xCB,
+ 0xB6, 0xE6, 0x4B, 0x81, 0x42, 0x5D, 0xEA, 0xF3, 0x97, 0xC6, 0x68, 0xD1, 0x56, 0x51, 0x52, 0x48,
+ 0x3D, 0x61, 0xD2, 0x1C, 0x0D, 0x68, 0x4A, 0xC4, 0xDE, 0x06, 0x04, 0x34, 0x1C, 0xE4, 0xD1, 0x36,
+ 0xED, 0x6D, 0xA7, 0x70, 0x38, 0x89, 0x64, 0x34, 0xC3, 0xBB, 0x93, 0xA2, 0x75, 0xE6, 0x39, 0xF7,
+ 0x97, 0x1C, 0xBD, 0x8F, 0xD1, 0xAF, 0x4C, 0x98, 0xF4, 0x7D, 0xD7, 0x71, 0xEE, 0x50, 0x78, 0x72,
+ 0x86, 0xB0, 0xD4, 0xB9, 0xD0, 0xCB, 0x5B, 0xB1, 0x50, 0x55, 0xFC, 0xC2, 0xB3, 0x0B, 0x2F, 0xAF,
+ 0x54, 0x32, 0x7C, 0x77, 0x6E, 0xC8, 0x2A, 0x57, 0xBB, 0x99, 0x8E, 0xB3, 0x93, 0x37, 0x11, 0xFE,
+ 0x23, 0x2C, 0x4B, 0x33, 0x48, 0x9D, 0x13, 0x05, 0xD9, 0x90, 0xF3, 0x4D, 0xBB, 0x3C, 0x3C, 0xBE,
+ 0xF2, 0x29, 0x6A, 0xFB, 0xC9, 0x77, 0x21, 0x64, 0x3A, 0xA7, 0xA4, 0x8D, 0xC8, 0x62, 0x4D, 0xE7,
+ 0x97, 0x96, 0x2D, 0x88, 0xF7, 0xF1, 0x0D, 0x99, 0x35, 0x09, 0x2B, 0x34, 0xAF, 0x19, 0xB4, 0xBC,
+ 0x0C, 0xBA, 0x35, 0x13, 0x9F, 0x85, 0x27, 0x98, 0xD7, 0x5A, 0x98, 0x76, 0x41, 0x3D, 0xE3, 0xDC,
+ 0xB1, 0x57, 0x2F, 0x84, 0xA7, 0xAC, 0x60, 0x28, 0x0A, 0x41, 0xCA, 0xA1, 0xB6, 0xB4, 0x68, 0xA9,
+ 0x4F, 0xC8, 0xDA, 0x4A, 0x43, 0x89, 0x25, 0x36, 0xC9, 0xCF, 0x6E, 0x3F, 0x04, 0x73, 0xCB, 0xE7,
+ 0x9E, 0x2A, 0xB6, 0x04, 0xFF, 0x9F, 0x4B, 0x42, 0x7D, 0x2D, 0x74, 0xAC, 0x3D, 0x6D, 0x78, 0xC7,
+ 0xA5, 0x34, 0x9C, 0xD2, 0x8A, 0x09, 0x06, 0xF0, 0x80, 0xA9, 0x69, 0x60, 0xEC, 0x52, 0x70, 0x6B,
+ 0x34, 0x0C, 0x7E, 0xAF, 0x17, 0xA7, 0x48, 0x5E, 0xAF, 0x85, 0xF7, 0x29, 0xE4, 0x33, 0x54, 0xA2,
+ 0x44, 0x8B, 0xA0, 0x30, 0xF0, 0xAA, 0xE5, 0xAD, 0x87, 0x5E, 0xF6, 0xA8, 0x67, 0xBA, 0x4A, 0x4E,
+ 0xA8, 0x85, 0xED, 0x50, 0x2C, 0x4D, 0xBA, 0xC2, 0x89, 0x2F, 0x39, 0x64, 0x62, 0x9F, 0x4B, 0x8E,
+ 0x60, 0x5B, 0x2C, 0x5F, 0x4A, 0xFA, 0x65, 0xB3, 0xCD, 0x52, 0x93, 0x43, 0xC1, 0x71, 0x3E, 0xE7,
+ 0xFB, 0x78, 0xAD, 0x32, 0xEC, 0xF0, 0xB8, 0x2C, 0x72, 0xEF, 0xD8, 0x37, 0xCA, 0x80, 0xFB, 0x4F,
+ 0x2C, 0x18, 0xF4, 0x6D, 0x88, 0x5E, 0xCB, 0x07, 0xB7, 0xB3, 0x9C, 0x05, 0x58, 0x84, 0x71, 0xB1,
+ 0xE1, 0x11, 0xD4, 0xC9, 0x63, 0xAE, 0x23, 0x82, 0xEB, 0xF9, 0x48, 0x97, 0xCA, 0x26, 0x30, 0xC2,
+ 0xF1, 0x37, 0x8E, 0xE6, 0x53, 0x08, 0x16, 0x5E, 0x2A, 0x24, 0x95, 0xFB, 0x92, 0x68, 0xF5, 0xFC,
+ 0x34, 0x70, 0x98, 0x6E, 0x2C, 0x54, 0x97, 0x81, 0x11, 0xFC, 0x95, 0xEF, 0xCA, 0xD3, 0xBF, 0xC3,
+ 0xB5, 0xB5, 0xC0, 0xC7, 0xCE, 0xF3, 0x22, 0x8C, 0x9F, 0xD7, 0xC7, 0xA2, 0xFC, 0x95, 0xEE, 0x69,
+ 0x94, 0x20, 0x16, 0x5B, 0x55, 0xA4, 0x48, 0x66, 0x2A, 0x70, 0x91, 0xD5, 0x61, 0x32, 0xBB, 0x34,
+ 0x61, 0x13, 0x00, 0x59, 0xEA, 0xB7, 0xDE, 0xAE, 0xE0, 0xA2, 0xEF, 0x3B, 0xF0, 0x1C, 0xA9, 0xC2,
+ 0xFC, 0x02, 0xE3, 0x69, 0x8E, 0xBA, 0xED, 0xAD, 0xBA, 0x37, 0x52, 0x71, 0x4E, 0x8A, 0xC3, 0xA1,
+ 0x77, 0xA8, 0xDF, 0xA5, 0x3E, 0x95, 0xF7, 0xEE, 0xEF, 0xD7, 0xBE, 0x46, 0x4F, 0x65, 0x7A, 0xB5,
+ 0x8C, 0xBB, 0xB7, 0x45, 0xB9, 0x36, 0xA2, 0xD1, 0x44, 0xBE, 0x10, 0x8F, 0x9F, 0x29, 0xDF, 0xFC,
+ 0x4E, 0xC0, 0x69, 0x49, 0x8E, 0x05, 0x07, 0x7D, 0x9E, 0xA2, 0x0B, 0x6E, 0x92, 0x47, 0x18, 0x99,
+ 0xF2, 0xF7, 0x62, 0x5C, 0x38, 0xD9, 0xE6, 0x92, 0x82, 0x37, 0x44, 0xB7, 0xAB, 0x8B, 0x7D, 0xB5,
+ 0x4D, 0x3E, 0xA4, 0xF3, 0x8F, 0x6B, 0x0B, 0x8B, 0x60, 0xDD, 0x55, 0x2D, 0x9E, 0xB7, 0xF8, 0x79,
+ 0x9B, 0xCA, 0x8F, 0x76, 0x78, 0x7B, 0x1B, 0xE7, 0xDB, 0x55, 0xBA, 0x71, 0x0B, 0x7F, 0x7D, 0xEC,
+ 0xF4, 0x2A, 0x7D, 0x7E, 0xA6, 0xD5, 0xE6, 0x7C, 0x50, 0x6E, 0x11, 0x3A, 0x00, 0x33, 0xA5, 0xB7,
+ 0xF1, 0x40, 0xF5, 0xDE, 0x62, 0xD5, 0xC9, 0x18, 0x76, 0x70, 0x7C, 0x09, 0x5A, 0x88, 0x2F, 0x0F,
+ 0x5C, 0xC9, 0x80, 0xB1, 0xEA, 0x55, 0x05, 0x4F, 0x7E, 0x51, 0x25, 0xF8, 0x82, 0x76, 0xF6, 0x0B,
+ 0x5E, 0xC5, 0x7E, 0xCE, 0xB8, 0x59, 0x2B, 0x2C, 0x8B, 0x0B, 0x43, 0xDC, 0xC7, 0x74, 0x96, 0x13,
+ 0xBA, 0x34, 0xD7, 0x69, 0x11, 0x6C, 0x01, 0x4E, 0xC2, 0x8A, 0xD7, 0x38, 0x10, 0x20, 0xB8, 0xAB,
+ 0x20, 0xA1, 0xA7, 0x10, 0x20, 0xD3, 0x61, 0x07, 0x01, 0x5C, 0x48, 0x89, 0x87, 0x93, 0xFE, 0x36,
+ 0x05, 0x28, 0x52, 0x07, 0x35, 0xF0, 0x05, 0x75, 0x0D, 0x26, 0x95, 0x77, 0xEC, 0x41, 0x99, 0xBF,
+ 0xEB, 0xC4, 0xD8, 0xD1, 0x0A, 0x08, 0x78, 0xC6, 0x6A, 0xEA, 0x52, 0x05, 0x1D, 0x45, 0x5D, 0x87,
+ 0x80, 0x94, 0x42, 0xD9, 0x5A, 0x1F, 0xBA, 0xAE, 0x11, 0x86, 0xA1, 0xCC, 0xF9, 0xBA, 0x29, 0xE4,
+ 0xF2, 0x07, 0x91, 0xF1, 0xDF, 0x17, 0x61, 0x56, 0xF5, 0xEC, 0x19, 0xCC, 0x1F, 0xB0, 0xF5, 0x22,
+ 0x9F, 0xD1, 0x06, 0x93, 0x6B, 0xE5, 0x98, 0xF6, 0xBE, 0xE1, 0x3C, 0x0E, 0x62, 0xF5, 0x77, 0xF6,
+ 0x27, 0x7E, 0xDB, 0xB2, 0x96, 0x13, 0xCE, 0x0E, 0x43, 0x41, 0x14, 0x52, 0x35, 0xAF, 0x63, 0x36,
+ 0xAE, 0x97, 0x2E, 0xB0, 0x22, 0xCA, 0xC1, 0xEC, 0xC9, 0x98, 0x93, 0xBD, 0xCD, 0x8E, 0x90, 0x6B,
+ 0x12, 0x30, 0x1D, 0xAA, 0x6C, 0xB4, 0xEF, 0x3B, 0x0D, 0x24, 0xBE, 0x28, 0xB0, 0xD1, 0xAD, 0x06,
+ 0xDA, 0x82, 0x16, 0x0F, 0xB2, 0xD4, 0xDB, 0x2A, 0xAC, 0x7B, 0x94, 0x62, 0xF3, 0x3F, 0x29, 0xA6,
+ 0xF3, 0x6F, 0xC5, 0xD6, 0xBB, 0x81, 0x53, 0xAB, 0x86, 0xE5, 0xA5, 0x63, 0x02, 0xDA, 0xF3, 0x88,
+ 0x8E, 0xBF, 0xB5, 0x56, 0x1A, 0x79, 0x4D, 0x39, 0xCA, 0xDB, 0xC9, 0xD4, 0x78, 0xFD, 0x4C, 0xDB,
+ 0x03, 0x10, 0x84, 0x83, 0xAD, 0x4A, 0x13, 0xCF, 0xB8, 0xD7, 0x58, 0x34, 0x51, 0xD8, 0x13, 0x25,
+ 0x99, 0x46, 0x9E, 0xD6, 0xD7, 0xDB, 0xE6, 0x2F, 0x6F, 0xAC, 0x12, 0xF1, 0x08, 0xB1, 0x07, 0xB9,
+ 0x73, 0x61, 0xDB, 0x68, 0xAE, 0x3A, 0xC3, 0xBC, 0x74, 0x02, 0xD3, 0x55, 0x8F, 0x69, 0x8A, 0x2E,
+ 0x51, 0x84, 0xEA, 0x19, 0x6B, 0xA9, 0x52, 0xC7, 0x06, 0x47, 0x79, 0xFB, 0xD0, 0x98, 0xC6, 0x7D,
+ 0xF2, 0xBA, 0xF6, 0xE4, 0xEC, 0x10, 0x69, 0xE0, 0xB8, 0x52, 0x2C, 0x7F, 0xB8, 0x9C, 0x4F, 0xB2,
+ 0x5A, 0x48, 0x39, 0x05, 0x81, 0xA8, 0x5E, 0x91, 0xD6, 0xFA, 0x84, 0xC9, 0xE6, 0x12, 0xC6, 0x09,
+ 0x44, 0x3A, 0x69, 0xE9, 0x9C, 0x20, 0x9C, 0x4B, 0x6E, 0x39, 0xC8, 0x0A, 0xC8, 0x65, 0x28, 0x96,
+ 0xA6, 0x6F, 0x3B, 0x07, 0x5E, 0xB0, 0xF1, 0x91, 0x27, 0x99, 0x38, 0x23, 0xF9, 0x0B, 0xF1, 0xE1,
+ 0xC6, 0x01, 0xFB, 0x64, 0xA1, 0x41, 0x4D, 0x49, 0xEA, 0xC6, 0x35, 0xF4, 0x6A, 0x73, 0xE9, 0x9E,
+ 0x6A, 0x2F, 0xA0, 0x00, 0x06, 0xF7, 0xF6, 0x8C, 0xD7, 0x3D, 0x7A, 0xC5, 0xEF, 0xBD, 0x91, 0xFD,
+ 0x76, 0x8D, 0x78, 0xAA, 0x2D, 0x14, 0x0F, 0x01, 0xC8, 0x70, 0x96, 0xF9, 0x8F, 0x83, 0x61, 0xC7,
+ 0xE4, 0xB2, 0xA6, 0x52, 0xBB, 0xE5, 0x1B, 0x49, 0x16, 0xCC, 0xBE, 0xD7, 0xAF, 0x76, 0xA7, 0x38,
+ 0x44, 0x4D, 0xF2, 0xAC, 0x23, 0xD2, 0x50, 0x2C, 0xE7, 0x4E, 0xDC, 0xBA, 0xFD, 0xCB, 0x0C, 0x8A,
+ 0xEA, 0xE7, 0x7A, 0x00, 0xEE, 0x14, 0xAB, 0xC9, 0x52, 0xCE, 0xA4, 0x38, 0x40, 0xE0, 0x75, 0x5E,
+ 0x33, 0xCA, 0xA5, 0x20, 0xB7, 0x5D, 0xF9, 0x09, 0x1A, 0xA8, 0xBD, 0xBE, 0x34, 0xBF, 0xD8, 0x12,
+ 0xF9, 0xF0, 0xC2, 0x63, 0xEE, 0xFF, 0xA9, 0xBF, 0x5C, 0xD7, 0xD3, 0x3A, 0x40, 0xEC, 0xE6, 0x32,
+ 0x86, 0xA7, 0xA7, 0x0B, 0xA8, 0x87, 0x7A, 0x3E, 0x5E, 0x53, 0x4B, 0x85, 0x53, 0xFA, 0x9F, 0xA2,
+ 0xAB, 0xC7, 0x88, 0x16, 0x77, 0x4D, 0x35, 0x06, 0xFE, 0xDA, 0x4A, 0x47, 0x4F, 0x1C, 0x7C, 0xFF,
+ 0x4C, 0xB2, 0x84, 0x2D, 0x4F, 0x51, 0x7F, 0x65, 0x4E, 0x1C, 0xA7, 0x92, 0xE6, 0xCD, 0x80, 0x0A,
+ 0xA3, 0xE8, 0xB8, 0x7A, 0x42, 0xBC, 0x3A, 0x09, 0xEC, 0xE4, 0x7D, 0x2F, 0xBC, 0x27, 0x2A, 0xBD,
+ 0x8C, 0x6E, 0xE4, 0x48, 0x54, 0x73, 0x6D, 0x1F, 0x15, 0xCD, 0x37, 0x39, 0x64, 0x12, 0xE3, 0xE4,
+ 0x49, 0x35, 0xCA, 0x83, 0x84, 0xE3, 0xE2, 0x58, 0xEB, 0xEB, 0x8D, 0xC7, 0x3B, 0x9E, 0xB0, 0xD4,
+ 0x74, 0xF9, 0xC9, 0x09, 0x58, 0x15, 0xC4, 0x43, 0x18, 0x1E, 0x1D, 0x6D, 0xE2, 0xB1, 0xE7, 0x2A,
+ 0x50, 0xC6, 0x4F, 0x32, 0x39, 0xAE, 0xC8, 0x9E, 0x6C, 0xFF, 0xF7, 0xD2, 0xD9, 0xA6, 0x13, 0x85,
+ 0x82, 0xA2, 0xF7, 0x0A, 0xF7, 0x2E, 0x52, 0x96, 0x41, 0xCE, 0x84, 0x1E, 0x54, 0x53, 0x4A, 0x63,
+ 0x34, 0xA2, 0x56, 0x3A, 0xD1, 0xAF, 0x52, 0xDF, 0x33, 0x39, 0x37, 0xBD, 0x78, 0x52, 0x01, 0x95,
+ 0x52, 0xA1, 0x39, 0xE0, 0xEB, 0x33, 0xC5, 0x05, 0x5B, 0x02, 0xB7, 0xFE, 0xA7, 0x89, 0x7F, 0xE2,
+ 0x30, 0x27, 0xF4, 0xD4, 0xBF, 0x07, 0x44, 0xF8, 0x6A, 0x56, 0x82, 0xE1, 0x87, 0xE1, 0xFB, 0xBA,
+ 0x06, 0xD1, 0x75, 0xBB, 0x32, 0x69, 0x61, 0x6B, 0x45, 0x68, 0x87, 0x2C, 0x4C, 0xF2, 0xBE, 0xAD,
+ 0x27, 0xB7, 0x7B, 0x9E, 0xB2, 0x24, 0x15, 0x44, 0x89, 0x2D, 0x2A, 0xF2, 0x10, 0xE5, 0x0D, 0x60,
+ 0x44, 0xC8, 0x25, 0x03, 0xAD, 0xC9, 0x64, 0xAA, 0xD6, 0x90, 0x05, 0x14, 0xD7, 0xFE, 0xBF, 0x3B,
+ 0x0F, 0xD8, 0x76, 0xD9, 0x76, 0x24, 0xE8, 0xA5, 0xF1, 0x0C, 0xAA, 0x78, 0x4D, 0xF1, 0x43, 0x8A,
+ 0x5E, 0x8B, 0x40, 0xC2, 0x15, 0xD9, 0x3E, 0x29, 0x75, 0x8F, 0x8D, 0x63, 0x32, 0x4B, 0xC4, 0xFD,
+ 0x4F, 0x7C, 0x9C, 0x33, 0x6A, 0x21, 0x17, 0xE6, 0xF7, 0xA5, 0x03, 0x3D, 0x68, 0x3E, 0xC9, 0x2A,
+ 0x46, 0xCB, 0xB1, 0x5F, 0x69, 0x67, 0xDC, 0x28, 0xD7, 0xA9, 0x0D, 0x08, 0xAA, 0x55, 0x9B, 0xB1,
+ 0x52, 0x7B, 0x20, 0x28, 0xC2, 0x67, 0x77, 0xBA, 0xB1, 0xC4, 0x81, 0x70, 0x5E, 0xDD, 0x46, 0x89,
+ 0x16, 0xC9, 0x16, 0x5E, 0x79, 0x16, 0xEC, 0x7C, 0x5C, 0x5B, 0x6B, 0x15, 0x74, 0x28, 0xE4, 0xB7,
+ 0xFC, 0x59, 0xB7, 0x22, 0xB7, 0x5C, 0x8D, 0x7A, 0xB2, 0x4F, 0xE4, 0x29, 0x2D, 0xD1, 0x10, 0xBF,
+ 0xCA, 0x92, 0x90, 0x85, 0x51, 0x76, 0x48, 0x1D, 0x4F, 0x7B, 0x40, 0xC1, 0xB2, 0xED, 0x91, 0x20,
+ 0x96, 0xD3, 0xD4, 0x46, 0x10, 0xD0, 0xA6, 0xF4, 0x3F, 0x0B, 0x7D, 0x6D, 0x6C, 0x04, 0xC9, 0x94,
+ 0x23, 0x97, 0x2F, 0xBD, 0x75, 0x06, 0x68, 0x85, 0xCB, 0x2D, 0xFD, 0xA9, 0xD1, 0xD5, 0xD2, 0x98,
+ 0x60, 0x74, 0xC8, 0x1D, 0xAD, 0x8A, 0x21, 0xD3, 0x54, 0x8F, 0x20, 0xBE, 0x06, 0x3D, 0x34, 0xE4,
+ 0x95, 0x78, 0x55, 0x8E, 0x70, 0xC5, 0xB5, 0x3B, 0x68, 0x58, 0x2F, 0xC2, 0x16, 0xEC, 0x7F, 0x85,
+ 0xC0, 0x05, 0x28, 0xB7, 0xBF, 0x33, 0x3F, 0x0D, 0x83, 0xC7, 0x93, 0x36, 0x97, 0x24, 0x18, 0x0A,
+ 0x43, 0x28, 0xFF, 0x90, 0xA1, 0x38, 0xF5, 0xCE, 0x27, 0xCA, 0xD7, 0x47, 0x46, 0xBD, 0x40, 0x7A,
+ 0xF2, 0x49, 0x2D, 0x56, 0x1B, 0xAD, 0xDA, 0x00, 0x51, 0x74, 0x44, 0xA3, 0x09, 0x25, 0xE7, 0xB9,
+ 0x13, 0xA8, 0x51, 0xED, 0xED, 0xDB, 0xB1, 0x54, 0xFB, 0x5F, 0x38, 0x30, 0x0D, 0x4B, 0x4B, 0x92,
+ 0xB5, 0x2B, 0x45, 0x5E, 0x41, 0xFB, 0x27, 0xC4, 0x17, 0xDF, 0x82, 0x3D, 0x9C, 0xD3, 0xF9, 0x8A,
+ 0x0E, 0x4A, 0x2F, 0xA1, 0x4D, 0xF4, 0x7C, 0x26, 0xFB, 0x8A, 0xA9, 0xBC, 0xB3, 0xE8, 0x3D, 0x11,
+ 0x5A, 0x2B, 0x9D, 0x7D, 0xDA, 0xE7, 0x85, 0x19, 0x9F, 0x78, 0x70, 0x5A, 0x5C, 0xDE, 0x88, 0x40,
+ 0x8C, 0x09, 0x5A, 0x0A, 0x2E, 0x0C, 0x6E, 0xF2, 0xFA, 0x9A, 0x00, 0xAC, 0x2A, 0x29, 0xB1, 0x30,
+ 0xB1, 0x19, 0x0A, 0x1E, 0x01, 0x6C, 0x02, 0x2F, 0x6F, 0x1D, 0xDF, 0x77, 0x45, 0xF6, 0x81, 0x1F,
+ 0xBC, 0x2D, 0x55, 0x2D, 0x31, 0xC9, 0x34, 0x9A, 0xE3, 0x04, 0xC7, 0xD1, 0x1D, 0xA2, 0xE1, 0x5D,
+ 0xD4, 0xFF, 0x2F, 0xD5, 0x74, 0x1B, 0xAF, 0x49, 0xA3, 0x2A, 0xE2, 0x31, 0x8D, 0x7E, 0x3B, 0x21,
+ 0x64, 0x54, 0x8D, 0x52, 0x64, 0x58, 0x96, 0xFF, 0x83, 0x4F, 0x43, 0xA8, 0x4A, 0xDD, 0xB0, 0xFE,
+ 0xC7, 0x4F, 0x8C, 0xDD, 0xA3, 0x02, 0x30, 0xCA, 0xC2, 0xB2, 0x59, 0x17, 0x5D, 0xB3, 0xD7, 0x0A,
+ 0x66, 0x4D, 0xF6, 0x7B, 0x38, 0xA2, 0x67, 0xDA, 0x37, 0x3C, 0x69, 0xF0, 0x89, 0xE5, 0x57, 0xBA,
+ 0xAF, 0x7C, 0x0C, 0x64, 0x3A, 0x5B, 0x8D, 0xD5, 0x33, 0xE4, 0xBC, 0xFD, 0x45, 0x44, 0x04, 0x23,
+ 0xDB, 0x03, 0x3D, 0xCD, 0xA1, 0xA8, 0x6A, 0xE6, 0x9E, 0xDB, 0x1D, 0xBF, 0x10, 0xBB, 0x32, 0xD8,
+ 0x6A, 0x47, 0xDB, 0x83, 0x24, 0xE4, 0x1B, 0x4C, 0xC3, 0xDE, 0x5B, 0x3D, 0xD5, 0x1E, 0x69, 0x51,
+ 0xA3, 0x94, 0xFF, 0x97, 0x54, 0x44, 0xDF, 0x20, 0x41, 0xD8, 0xE2, 0xFE, 0x72, 0xC7, 0x0B, 0x99,
+ 0x0B, 0x1D, 0x49, 0x09, 0xA9, 0xBE, 0xE4, 0x66, 0xD1, 0x16, 0x49, 0x8A, 0xE9, 0xBD, 0x7D, 0xEF,
+ 0xCF, 0xE2, 0x69, 0x2A, 0x51, 0x28, 0xCC, 0xD6, 0x80, 0xC7, 0xCE, 0x9C, 0x9E, 0x20, 0x1D, 0x42,
+ 0x00, 0x5F, 0x3C, 0xCC, 0x0B, 0x10, 0x40, 0xE3, 0x7A, 0xB6, 0x2A, 0x34, 0xB6, 0x44, 0x50, 0x6F,
+ 0x9B, 0x6E, 0xC5, 0xE5, 0xE1, 0x94, 0x0D, 0x0C, 0x9B, 0xF7, 0x35, 0x91, 0xFD, 0xCE, 0x65, 0x1A,
+ 0x79, 0xE1, 0x20, 0x69, 0xAD, 0xB4, 0x92, 0xC2, 0x58, 0x85, 0xF9, 0x45, 0x1C, 0x98, 0x46, 0xC7,
+ 0x23, 0xA4, 0xDD, 0x81, 0x7C, 0x93, 0x81, 0x55, 0x1D, 0x47, 0x7B, 0x23, 0x18, 0xB4, 0x7D, 0xFF,
+ 0x03, 0xA5, 0xE0, 0x78, 0xE3, 0x57, 0xA3, 0x17, 0xB3, 0xB1, 0x01, 0x88, 0x03, 0xA9, 0x10, 0x0B,
+ 0x35, 0xFE, 0x67, 0xFA, 0x67, 0x6F, 0xD3, 0xF5, 0x25, 0xCB, 0x75, 0xA0, 0x4F, 0x39, 0xD6, 0x5B,
+ 0xD0, 0x65, 0xD7, 0xA8, 0x77, 0xBB, 0xD8, 0x60, 0xAF, 0x2B, 0x9D, 0x37, 0x19, 0xFA, 0x83, 0xF8,
+ 0x52, 0x57, 0xDA, 0x2D, 0xEF, 0xBC, 0x17, 0xAA, 0xC6, 0x97, 0xF4, 0xC5, 0xEF, 0x16, 0x81, 0xA7,
+ 0xBF, 0x27, 0x49, 0xEA, 0x7A, 0x23, 0x6F, 0x31, 0x6D, 0x62, 0x5B, 0xB6, 0xF3, 0x61, 0xE1, 0xFA,
+ 0x87, 0x72, 0xE8, 0xE1, 0x0C, 0x89, 0x6B, 0x53, 0xF0, 0x7F, 0x09, 0x9D, 0x7E, 0x1D, 0x8C, 0x02,
+ 0xFE, 0x29, 0xAA, 0xBD, 0x6C, 0xB1, 0x68, 0x67, 0xCC, 0xA6, 0xEA, 0xAE, 0xA9, 0x84, 0xDD, 0xC4,
+ 0x44, 0xF7, 0x2E, 0x22, 0x8C, 0xA5, 0x07, 0xE7, 0xEE, 0xE5, 0xC6, 0xB5, 0xF3, 0x5A, 0x41, 0xD4,
+ 0x02, 0x2A, 0xE6, 0x1E, 0x79, 0x5C, 0x4B, 0x1B, 0xED, 0x9F, 0x2A, 0xBA, 0xB6, 0x0E, 0x9B, 0xAB,
+ 0x83, 0x2D, 0xF0, 0x84, 0x35, 0x83, 0xA2, 0xF4, 0x2C, 0xB6, 0x2F, 0x4C, 0xE9, 0x8B, 0xF6, 0xA4,
+ 0x5C, 0x8A, 0xEC, 0x01, 0x9A, 0x2E, 0x80, 0xC0, 0x6C, 0x5B, 0xAC, 0x92, 0x07, 0xAB, 0x93, 0x2D,
+ 0x5D, 0x77, 0x7A, 0xA3, 0xA1, 0xDB, 0x8F, 0x05, 0x51, 0xD9, 0x92, 0x98, 0x1E, 0xD1, 0x23, 0x01,
+ 0xEC, 0x7E, 0xB7, 0xB8, 0x4F, 0xA7, 0xCD, 0xCC, 0x5F, 0x76, 0x64, 0xDD, 0x06, 0xA9, 0xC9, 0x98,
+ 0xD2, 0x3C, 0xB8, 0x06, 0x4B, 0x79, 0x28, 0x9E, 0x14, 0x10, 0xFB, 0x39, 0xDC, 0xF9, 0xE1, 0xE5,
+ 0x27, 0xFB, 0x89, 0x8C, 0x66, 0xB6, 0xFE, 0xC1, 0x13, 0x0F, 0x7C, 0xAA, 0x6A, 0x02, 0x45, 0xB1,
+ 0x18, 0xD8, 0x3A, 0x2C, 0x94, 0x09, 0x8B, 0x66, 0xED, 0xE9, 0xD7, 0x5E, 0xA2, 0x48, 0x01, 0x8D,
+ 0x8D, 0xC7, 0x05, 0x6A, 0xD3, 0x67, 0x07, 0xFC, 0x22, 0x28, 0xE8, 0x0F, 0xCD, 0xFF, 0x12, 0xD5,
+ 0xED, 0x64, 0x3F, 0xE5, 0x89, 0x08, 0x41, 0x2C, 0x49, 0x4D, 0x07, 0x7D, 0xF8, 0x2C, 0x28, 0xB5,
+ 0x2F, 0xCB, 0xF6, 0xC0, 0x68, 0xDB, 0x0E, 0xFF, 0x92, 0x06, 0xCC, 0x15, 0x17, 0xDD, 0xA7, 0xF4,
+ 0xA9, 0x7C, 0x49, 0xFF, 0x91, 0x8B, 0xBE, 0xA5, 0xDC, 0x43, 0x5B, 0xD9, 0x17, 0x17, 0x4A, 0xBC,
+ 0x27, 0xAC, 0x90, 0xC4, 0xC7, 0x68, 0x9F, 0x84, 0x29, 0x4E, 0x52, 0xF4, 0x6D, 0x29, 0x30, 0xA7,
+ 0xB4, 0x87, 0x42, 0x4F, 0x93, 0x1D, 0x71, 0x7A, 0xC4, 0x97, 0x7C, 0xEB, 0xB1, 0x55, 0xDA, 0x95,
+ 0xA5, 0x48, 0xC8, 0xA3, 0xFF, 0x2E, 0xE0, 0x2F, 0x5B, 0xE1, 0xA3, 0x2A, 0x93, 0x2A, 0x34, 0x30,
+ 0x19, 0x63, 0x45, 0xB1, 0x7D, 0x68, 0x95, 0x23, 0xCD, 0xE1, 0x79, 0x1B, 0x4D, 0x10, 0x45, 0x0C,
+ 0x9B, 0xF3, 0x7A, 0x13, 0x78, 0xC1, 0x06, 0x09, 0x7E, 0x24, 0xAE, 0xDE, 0xB7, 0xE0, 0x91, 0x12,
+ 0x4C, 0x0C, 0xA3, 0x0F, 0xA9, 0xFE, 0xB5, 0x2E, 0x13, 0x16, 0x87, 0x9F, 0x89, 0xBD, 0x33, 0x72,
+ 0xF9, 0x34, 0xBC, 0x50, 0xA3, 0x60, 0x49, 0xED, 0x65, 0x04, 0xD3, 0xB7, 0x94, 0x95, 0x8D, 0xFA,
+ 0xE9, 0xE5, 0x8C, 0x6F, 0x72, 0xEB, 0xE6, 0x21, 0x77, 0x6E, 0xCE, 0x77, 0xEE, 0xFC, 0xDA, 0x4E,
+ 0x93, 0xDA, 0x1E, 0xCD, 0xA3, 0xB0, 0xB1, 0x40, 0x37, 0xC8, 0x7B, 0x3E, 0xFF, 0x8D, 0x99, 0xAF,
+ 0xB7, 0x79, 0x18, 0x6D, 0xF6, 0xB0, 0x7E, 0xA1, 0xFD, 0x0F, 0x55, 0x98, 0x65, 0xCD, 0x74, 0x64,
+ 0x4C, 0x97, 0x63, 0x48, 0xC1, 0x0C, 0x24, 0xBE, 0xC9, 0x92, 0x8E, 0x8F, 0x15, 0x66, 0x0A, 0x02,
+ 0x13, 0xC2, 0x5B, 0x9F, 0xB2, 0x03, 0xD1, 0xC3, 0x0A, 0xCE, 0x56, 0x6E, 0x26, 0xD1, 0x55, 0x4E,
+ 0xFA, 0xE9, 0xCB, 0x48, 0xA5, 0x74, 0xCC, 0x59, 0x54, 0x92, 0x40, 0x15, 0x07, 0x5D, 0x92, 0xAD,
+ 0xCF, 0x7C, 0x75, 0x2D, 0x0C, 0xEE, 0x5B, 0x75, 0x99, 0xB5, 0x66, 0x9B, 0xC6, 0x62, 0xAC, 0x84,
+ 0xC8, 0x69, 0x53, 0xA3, 0xD3, 0xAC, 0x64, 0x1F, 0x3C, 0x6B, 0xD4, 0xB8, 0x57, 0x79, 0x20, 0xDB,
+ 0x28, 0xD8, 0x0B, 0xB0, 0x40, 0x72, 0x76, 0x40, 0x51, 0xEC, 0xBC, 0x36, 0x4A, 0xC7, 0x01, 0x55,
+ 0x1D, 0x76, 0xE8, 0xB3, 0xF6, 0x5B, 0x38, 0x9A, 0x01, 0xFE, 0x00, 0xE0, 0x5B, 0xF6, 0x3F, 0x5D,
+ 0xC2, 0x55, 0x0E, 0x1A, 0xB6, 0xC1, 0x88, 0x43, 0xB9, 0xB8, 0xE5, 0xDA, 0xF9, 0x6D, 0xBC, 0x96,
+ 0x3F, 0xC5, 0xB3, 0xC2, 0x14, 0xFF, 0xB8, 0x24, 0x70, 0x4D, 0x8F, 0xF2, 0x65, 0xD9, 0x52, 0xE2,
+ 0x6F, 0x95, 0x47, 0x0F, 0xEF, 0xD3, 0xBD, 0xF0, 0x93, 0xF6, 0x77, 0x7C, 0x4B, 0xDD, 0x09, 0xA1,
+ 0x9D, 0x14, 0xB7, 0x09, 0x75, 0x5A, 0xD5, 0xE7, 0xCD, 0xB4, 0x4E, 0xC9, 0xB2, 0xCC, 0xEB, 0xA7,
+ 0x13, 0x8D, 0xF1, 0xBE, 0x7B, 0xF1, 0x3C, 0x03, 0xDC, 0xAE, 0x73, 0x50, 0xC1, 0x79, 0xDC, 0x1E,
+ 0xC1, 0x3A, 0xD1, 0x23, 0x9D, 0xF1, 0xF3, 0x87, 0x18, 0x5B, 0x97, 0x09, 0x53, 0xF2, 0x61, 0x89,
+ 0x2D, 0xD7, 0x20, 0x3F, 0x40, 0x85, 0x83, 0x1F, 0x69, 0xB0, 0xF7, 0x07, 0x48, 0x50, 0x2D, 0x2D,
+ 0xEF, 0xA8, 0x1A, 0x9F, 0x0B, 0xC1, 0xA5, 0x3C, 0xAD, 0x43, 0x59, 0x8A, 0xAA, 0x64, 0x6C, 0x60,
+ 0x50, 0x67, 0x3B, 0x52, 0x61, 0x3D, 0x8B, 0x7B, 0xA5, 0x2D, 0x04, 0x7E, 0xE5, 0xEB, 0xE7, 0x79,
+ 0x69, 0xD1, 0x05, 0xAE, 0xA2, 0x20, 0x7A, 0xC7, 0x68, 0x8A, 0xCA, 0xBE, 0xBF, 0x27, 0x0C, 0xB3,
+ 0x49, 0x05, 0x16, 0x83, 0x7F, 0x29, 0x87, 0x1E, 0x58, 0x94, 0x76, 0xEA, 0xEA, 0xC5, 0x43, 0x3B,
+ 0xB3, 0x17, 0xB6, 0x41, 0x3C, 0x59, 0x03, 0x20, 0x83, 0x78, 0x57, 0xD8, 0x9A, 0x69, 0x2C, 0xEE,
+ 0x27, 0xCC, 0xC1, 0xAA, 0x7F, 0x52, 0x3A, 0x81, 0x04, 0xC3, 0xCD, 0x64, 0xC0, 0xAF, 0xCF, 0xF8,
+ 0xB2, 0x34, 0x8A, 0x94, 0xBD, 0xF7, 0x83, 0x0D, 0x16, 0xE7, 0xB0, 0x47, 0xA2, 0xFA, 0xD6, 0xA7,
+ 0x3E, 0xDF, 0xE1, 0x3A, 0xBA, 0x87, 0xA7, 0xF3, 0x8C, 0x5B, 0xB2, 0x28, 0x88, 0x4A, 0x13, 0x69,
+ 0x1C, 0xEF, 0x07, 0xAE, 0xC4, 0xCE, 0x95, 0x0D, 0x49, 0x1E, 0x11, 0x96, 0x79, 0x72, 0xEB, 0xA5,
+ 0x3E, 0x86, 0x6B, 0x80, 0xF8, 0xE2, 0xAF, 0x28, 0x70, 0x22, 0xE0, 0x07, 0x98, 0xD9, 0xE5, 0x0A,
+ 0x45, 0xD1, 0x9A, 0xD9, 0x86, 0x85, 0xEE, 0x92, 0xCC, 0x9B, 0x3A, 0xB6, 0xFE, 0x3F, 0x17, 0x59,
+ 0x53, 0xE1, 0xDA, 0xF0, 0x7A, 0x3B, 0x28, 0xD6, 0x28, 0xFD, 0xA2, 0xE6, 0x49, 0xBA, 0x68, 0x99,
+ 0x32, 0x89, 0x73, 0xB1, 0x87, 0xA8, 0x3E, 0x84, 0x70, 0xE9, 0xD4, 0x22, 0x24, 0x89, 0x20, 0x01,
+ 0xAF, 0x1B, 0xD9, 0xB5, 0x51, 0xA6, 0xFB, 0x67, 0x26, 0x9A, 0x89, 0x47, 0x85, 0x52, 0xB6, 0x0B,
+ 0xD4, 0x6B, 0xEE, 0xF4, 0xEF, 0x44, 0xD8, 0x27, 0x74, 0xBA, 0x1E, 0x3C, 0x45, 0x68, 0xFF, 0x93,
+ 0xDE, 0x4F, 0x03, 0xA7, 0xC1, 0xB9, 0x11, 0xD3, 0x27, 0xEB, 0x78, 0x40, 0x68, 0xF5, 0x1D, 0x78,
+ 0xE9, 0x24, 0x47, 0x3E, 0x80, 0x87, 0xF7, 0xE1, 0x87, 0xDA, 0xA0, 0xE3, 0x79, 0xA6, 0x61, 0x80,
+ 0xFD, 0x1A, 0xEB, 0x03, 0x7F, 0xE9, 0x50, 0x00, 0xD3, 0x1E, 0xBC, 0x6D, 0x65, 0xA2, 0xD5, 0x09,
+ 0x53, 0x3E, 0x60, 0x54, 0x6D, 0xD0, 0x2E, 0x01, 0x04, 0xA6, 0x13, 0xEE, 0xC0, 0x72, 0x8A, 0x66,
+ 0x09, 0x91, 0x56, 0x84, 0x40, 0xFC, 0x8D, 0x35, 0x01, 0xE2, 0x13, 0x76, 0x4E, 0x63, 0xCE, 0xE8,
+ 0xF0, 0xD9, 0x0F, 0x09, 0xBA, 0x19, 0x44, 0x4B, 0x44, 0x79, 0xAB, 0xF5, 0xE2, 0x48, 0x92, 0x3F,
+ 0xD9, 0x16, 0x57, 0xCA, 0x94, 0x82, 0x9E, 0xFE, 0x02, 0x24, 0x93, 0xAE, 0xF2, 0xF3, 0x2B, 0xCE,
+ 0x0A, 0x17, 0x91, 0x5D, 0x90, 0x97, 0x74, 0x13, 0x59, 0x8B, 0x16, 0xB4, 0x65, 0xD2, 0xFF, 0x5C,
+ 0x91, 0x35, 0xB8, 0x6D, 0xA0, 0xEA, 0xCB, 0x07, 0xD2, 0x88, 0x6E, 0x8C, 0xF1, 0xC3, 0x9C, 0x6E,
+ 0x25, 0xDC, 0xC4, 0x16, 0x73, 0x2B, 0xEA, 0x87, 0xAC, 0x60, 0x7B, 0x0D, 0x50, 0xFF, 0xE8, 0x24,
+ 0xB2, 0x77, 0xEF, 0xFD, 0x5D, 0x93, 0x16, 0x62, 0xF5, 0x47, 0x17, 0x5B, 0x3E, 0x0B, 0x55, 0x93,
+ 0xCD, 0x04, 0xCD, 0xB2, 0x51, 0xFC, 0x78, 0x0A, 0x4E, 0xAD, 0x07, 0x46, 0xC3, 0x66, 0xE5, 0xA6,
+ 0xB7, 0xE4, 0xE2, 0x71, 0x99, 0xA8, 0x44, 0x5B, 0xD6, 0x3D, 0x63, 0x7A, 0x3A, 0x4F, 0x15, 0x6E,
+ 0x3E, 0x07, 0x23, 0xDB, 0xBF, 0xD6, 0x78, 0x2B, 0x51, 0x73, 0xCF, 0x48, 0xB3, 0x2C, 0x6A, 0xB6,
+ 0x8A, 0x3D, 0x5D, 0x25, 0xA7, 0x70, 0x8D, 0x5A, 0x44, 0x2D, 0x1B, 0x24, 0x4C, 0x27, 0xAA, 0x02,
+ 0xE3, 0x57, 0x79, 0xA1, 0x74, 0x0F, 0x73, 0x5F, 0xD2, 0x09, 0x64, 0xE7, 0x26, 0xE6, 0xC3, 0xA4,
+ 0x15, 0x90, 0x12, 0x68, 0x54, 0x4A, 0xAF, 0xA5, 0x01, 0x0C, 0x10, 0x1D, 0x22, 0xF3, 0x79, 0xAF,
+ 0xED, 0xA4, 0x68, 0x58, 0x4B, 0x97, 0x6F, 0xE9, 0x2B, 0x59, 0x4B, 0x61, 0x91, 0x87, 0x0D, 0x33,
+ 0x2C, 0x75, 0xAA, 0x19, 0x93, 0x81, 0xC1, 0xD0, 0x5D, 0xA6, 0xA4, 0xE4, 0x85, 0x1C, 0xBC, 0x32,
+ 0xA7, 0xB5, 0x36, 0x3F, 0x26, 0x57, 0xAB, 0xAA, 0xEC, 0x9F, 0xC8, 0x74, 0x08, 0x83, 0x4B, 0x09,
+ 0xE1, 0x22, 0x94, 0xD5, 0xD8, 0xB4, 0xAA, 0x90, 0xFD, 0x34, 0x14, 0x27, 0xCA, 0x6B, 0x9A, 0x5A,
+ 0x30, 0x2D, 0x75, 0x6D, 0x01, 0x6D, 0x17, 0xCB, 0xEF, 0xA6, 0x3F, 0x36, 0xE2, 0xB2, 0x6B, 0x81,
+ 0x3E, 0xAF, 0x8C, 0x92, 0x70, 0x43, 0xA1, 0x1D, 0x09, 0x61, 0x71, 0x6B, 0x0E, 0x53, 0x0F, 0x6B,
+ 0x00, 0x32, 0xAC, 0x78, 0xCC, 0x2D, 0xC9, 0x42, 0x0C, 0x70, 0x3F, 0xDF, 0x52, 0x5C, 0xD4, 0x43,
+ 0xC7, 0xAC, 0x1C, 0x17, 0xE2, 0xC0, 0x75, 0x8B, 0xF8, 0xC8, 0xD2, 0xE1, 0x69, 0xB1, 0x86, 0x07,
+ 0x82, 0x37, 0xB9, 0x4A, 0x5F, 0xC6, 0x4F, 0x95, 0x86, 0x1B, 0x6D, 0x2B, 0xEB, 0x21, 0xD2, 0x84,
+ 0xD6, 0x4B, 0xFA, 0xBF, 0x54, 0x41, 0x34, 0xA8, 0x5C, 0x86, 0x23, 0x3A, 0x3D, 0xB6, 0x0C, 0x97,
+ 0x28, 0x8B, 0xBB, 0xE8, 0xF6, 0xC0, 0x68, 0xE5, 0x83, 0x21, 0x60, 0xF0, 0xE8, 0x8D, 0x80, 0xFA,
+ 0x1F, 0xAC, 0x32, 0xC6, 0x1D, 0x17, 0xD2, 0x3E, 0x57, 0xEB, 0x81, 0x68, 0x28, 0x0B, 0x36, 0x6F,
+ 0x3C, 0x08, 0xA3, 0xEB, 0xEE, 0xF0, 0x25, 0x24, 0xB2, 0x70, 0xC5, 0x62, 0xA9, 0xC8, 0x48, 0xDC,
+ 0xA1, 0x02, 0x49, 0x0E, 0xE8, 0x19, 0xBE, 0xFC, 0x8C, 0x8E, 0xC4, 0xBE, 0x9D, 0x6A, 0xDB, 0x70,
+ 0xDC, 0x78, 0xE1, 0xD4, 0xD1, 0xA4, 0xC8, 0x57, 0x3E, 0xC7, 0x40, 0xA6, 0xF0, 0xA9, 0x83, 0x12,
+ 0x76, 0x52, 0x4D, 0xB0, 0xBB, 0xBA, 0xE4, 0x85, 0x93, 0xBF, 0x6D, 0x71, 0x2C, 0x18, 0x57, 0xDE,
+ 0x57, 0x24, 0x8E, 0x33, 0xD7, 0xF9, 0x36, 0xE6, 0x3B, 0x63, 0x3B, 0x71, 0xB6, 0xF5, 0x9C, 0x4D,
+ 0x2C, 0xC3, 0x55, 0x7B, 0xDB, 0xD9, 0x1F, 0x7D, 0xC7, 0x2B, 0x4E, 0x65, 0x3C, 0xD4, 0xFD, 0xEC,
+ 0x01, 0xA6, 0xD8, 0xDB, 0x4F, 0x0A, 0x76, 0xF2, 0x3E, 0x3E, 0x16, 0xB5, 0xE9, 0xBB, 0xE7, 0x8B,
+ 0xDF, 0x8D, 0x60, 0x80, 0x79, 0xB5, 0xC6, 0x79, 0x1E, 0x9A, 0xDB, 0x53, 0xB4, 0x80, 0x6C, 0x9C,
+ 0xC9, 0x97, 0x7C, 0x0E, 0xAF, 0x41, 0xF9, 0x4C, 0x5E, 0xA4, 0xA4, 0x46, 0x85, 0xF2, 0x9A, 0xAE,
+ 0xFE, 0xC5, 0xB0, 0xB7, 0x16, 0x07, 0x03, 0x89, 0x27, 0x3F, 0x53, 0x92, 0x3E, 0x85, 0xE3, 0x23,
+ 0xE4, 0x72, 0x1F, 0xD7, 0x77, 0xCF, 0x3E, 0x57, 0xB3, 0x1F, 0xD8, 0x5D, 0x0C, 0xE2, 0xD1, 0xD6,
+ 0xCF, 0x20, 0xB0, 0xE1, 0x80, 0x38, 0xF6, 0xEF, 0x91, 0xD3, 0xD7, 0x2E, 0xDE, 0xA3, 0xEA, 0x77,
+ 0x44, 0xAF, 0xDC, 0x9A, 0x13, 0x19, 0x75, 0x28, 0x85, 0x61, 0xE5, 0x40, 0x8C, 0xE3, 0xF9, 0x5A,
+ 0xEC, 0x2A, 0x5C, 0x29, 0x12, 0x7B, 0x13, 0xBC, 0x21, 0x4D, 0x79, 0xF8, 0xEF, 0xD4, 0xEB, 0xA2,
+ 0x95, 0x43, 0xC5, 0xB5, 0x9E, 0x5B, 0x11, 0xAB, 0xE1, 0x9E, 0xB3, 0x76, 0xFF, 0x05, 0xD5, 0x42,
+ 0x4F, 0x92, 0x47, 0x58, 0x7A, 0xE2, 0x4D, 0x58, 0x8F, 0x95, 0xC4, 0xDC, 0xC3, 0xD4, 0x4A, 0x78,
+ 0x8A, 0xB7, 0x9B, 0x5D, 0x2D, 0x51, 0xFA, 0x4B, 0x10, 0x7B, 0x92, 0xF0, 0x66, 0xEC, 0x7C, 0x01,
+ 0xCA, 0xEE, 0x5F, 0xB8, 0x45, 0x78, 0x54, 0x87, 0xB8, 0xDF, 0xDE, 0x80, 0xE8, 0xAD, 0x3A, 0xB7,
+ 0xA6, 0xB2, 0x60, 0xC4, 0xA0, 0xE0, 0x42, 0x13, 0x38, 0xED, 0xFF, 0xB4, 0x77, 0xA8, 0xF4, 0xE7,
+ 0xF7, 0xE8, 0x71, 0xAE, 0x93, 0x3D, 0xA0, 0xCE, 0xB5, 0x55, 0xC9, 0x5F, 0xE0, 0x65, 0x4F, 0x2C,
+ 0xD6, 0x31, 0x7B, 0x61, 0x8E, 0x45, 0x00, 0x02, 0x97, 0x4F, 0x0F, 0xB9, 0x05, 0x03, 0xC4, 0xC2,
+ 0xBE, 0x3C, 0x4C, 0x2C, 0xB5, 0x04, 0x22, 0x7F, 0x7E, 0x16, 0x3E, 0xC1, 0xC7, 0xBD, 0x6A, 0xEB,
+ 0x10, 0xA6, 0x15, 0x78, 0x6C, 0x66, 0x55, 0x7D, 0xFA, 0xE0, 0x2B, 0xD0, 0x88, 0xAB, 0x80, 0x71,
+ 0x6D, 0x2B, 0xD9, 0xC3, 0x39, 0x7A, 0x6F, 0x39, 0xCC, 0xC0, 0x17, 0x73, 0xC8, 0x58, 0x21, 0x63,
+ 0xF5, 0x7F, 0x99, 0xF7, 0xC7, 0x46, 0xFC, 0x2B, 0xE3, 0x3B, 0x66, 0x73, 0x0E, 0x90, 0x4A, 0xC3,
+ 0x48, 0xCE, 0xDB, 0x39, 0x46, 0xF9, 0xE9, 0x7B, 0x33, 0xCD, 0x9B, 0x8B, 0x3E, 0x21, 0x55, 0x35,
+ 0xAE, 0x71, 0xFE, 0xA4, 0x2E, 0xC9, 0xC8, 0xA0, 0x1E, 0x97, 0x10, 0x6A, 0x29, 0x95, 0xFC, 0xCD,
+ 0xE0, 0xEC, 0x37, 0x95, 0xFA, 0x61, 0xB5, 0x62, 0x5C, 0xC5, 0xEA, 0xDF, 0x8D, 0xA7, 0xC2, 0xF7,
+ 0x4A, 0xC9, 0x34, 0x15, 0xA4, 0x8C, 0x63, 0xA5, 0x16, 0x25, 0x4F, 0xA9, 0x89, 0xD7, 0x2D, 0x77,
+ 0x0D, 0x5E, 0xC1, 0x32, 0x2A, 0x86, 0x55, 0x80, 0x97, 0xD1, 0x8C, 0x98, 0x04, 0x5A, 0x89, 0xC9,
+ 0xD1, 0x5F, 0x00, 0x5E, 0x29, 0x2C, 0xEB, 0x17, 0x96, 0x6A, 0xEB, 0x9A, 0xEA, 0x5F, 0x2D, 0x99,
+ 0x3D, 0x47, 0xCD, 0xFA, 0xA7, 0x8B, 0xFA, 0xB8, 0x16, 0x1A, 0xE7, 0x07, 0x85, 0x47, 0xB6, 0x3F,
+ 0xBD, 0x96, 0x4C, 0xD2, 0xE8, 0xBE, 0x78, 0xE0, 0xFE, 0xF8, 0xD7, 0x9F, 0x05, 0xC2, 0xDF, 0x2F,
+ 0x1D, 0x8C, 0xDC, 0xDF, 0x4C, 0x36, 0x06, 0xF5, 0xD3, 0xAD, 0xFC, 0x82, 0xB3, 0x7D, 0x47, 0xE3,
+ 0xE6, 0x26, 0xD7, 0xA8, 0xC1, 0xA8, 0xD7, 0x73, 0x55, 0x0D, 0x99, 0x81, 0xE8, 0x97, 0x84, 0x22,
+ 0x5D, 0x93, 0x7B, 0x83, 0xE3, 0x27, 0xEA, 0x60, 0x03, 0x2E, 0xC9, 0x71, 0xBB, 0x31, 0xF1, 0x4A,
+ 0x4D, 0xEA, 0x5B, 0xAD, 0x29, 0x37, 0xAA, 0x4F, 0x6D, 0xEC, 0xBB, 0x00, 0x6A, 0xD9, 0x98, 0xDB,
+ 0x08, 0x72, 0x8A, 0x94, 0xC8, 0x9C, 0x03, 0xC5, 0x02, 0x54, 0x46, 0xB5, 0x1E, 0x25, 0xD1, 0x50,
+ 0x3C, 0x3E, 0xE0, 0x55, 0x89, 0x28, 0xC0, 0xE3, 0x08, 0x1A, 0x26, 0x9C, 0x4D, 0x74, 0x57, 0x09,
+ 0x34, 0xB3, 0x2D, 0x21, 0xA0, 0x4E, 0x9B, 0xB2, 0x93, 0xC0, 0x7A, 0x52, 0xAC, 0x0D, 0x2B, 0xAA,
+ 0x5F, 0xCF, 0x9E, 0x94, 0x88, 0x0D, 0xCB, 0x30, 0x74, 0xC7, 0x6B, 0x78, 0x5E, 0xEE, 0x24, 0xC4,
+ 0xA8, 0x0B, 0x84, 0x2D, 0xD7, 0xEC, 0x31, 0xA8, 0xE3, 0x62, 0xC8, 0x43, 0x6A, 0x12, 0x0E, 0x46,
+ 0xEE, 0x86, 0x33, 0x4B, 0xF9, 0xA6, 0x52, 0x96, 0x6D, 0xA1, 0xD2, 0x1C, 0x50, 0xEC, 0xEE, 0x53,
+ 0xE8, 0x7E, 0xD4, 0xE1, 0x41, 0x76, 0x6E, 0xF7, 0x66, 0x89, 0x46, 0xA6, 0xC9, 0x06, 0x32, 0xCC,
+ 0x13, 0x23, 0x80, 0xE8, 0x3E, 0x93, 0x52, 0x05, 0x78, 0x1A, 0x02, 0xAA, 0x5C, 0x11, 0xD7, 0xF0,
+ 0x39, 0x77, 0x06, 0x4F, 0xB3, 0x4B, 0x8E, 0x9D, 0x84, 0x00, 0x3A, 0xEE, 0x03, 0xFD, 0x48, 0xBA,
+ 0xA7, 0x23, 0x59, 0xBE, 0x43, 0x7B, 0x2F, 0xA0, 0x23, 0x6F, 0x9A, 0xE9, 0xB0, 0xC2, 0x84, 0x1A,
+ 0x9F, 0x5A, 0x39, 0x22, 0xB6, 0x78, 0x21, 0x86, 0xDD, 0xEC, 0x37, 0x24, 0x1C, 0xB1, 0xD8, 0x7C,
+ 0x88, 0xAB, 0xC3, 0x9F, 0xA1, 0x3C, 0xBA, 0xF8, 0x1C, 0x43, 0x41, 0xB2, 0x12, 0x3C, 0x16, 0x38,
+ 0xD6, 0x58, 0xFF, 0xBF, 0x73, 0xEA, 0xFE, 0x63, 0xE0, 0x36, 0xA4, 0xE7, 0x38, 0xA2, 0xA5, 0xB2,
+ 0xEF, 0xE0, 0x7B, 0x32, 0xCC, 0x34, 0x0A, 0x32, 0x23, 0x14, 0xCE, 0xE9, 0xDC, 0xC7, 0xF1, 0x85,
+ 0x79, 0x19, 0x4B, 0xC2, 0x39, 0xC8, 0x57, 0x2A, 0xDD, 0x19, 0x6D, 0x10, 0xC9, 0x3E, 0x39, 0x13,
+ 0x5A, 0xC3, 0x33, 0xC5, 0xB1, 0x6D, 0xD8, 0x8B, 0x35, 0x14, 0x9C, 0x67, 0xE6, 0x58, 0xC9, 0x0C,
+ 0xE6, 0xC7, 0x59, 0xCA, 0xA7, 0xB6, 0x10, 0x8B, 0x44, 0x2D, 0x8D, 0x12, 0xC3, 0xC3, 0xEE, 0x58,
+ 0xB9, 0xFA, 0x60, 0xBD, 0xAB, 0x29, 0xD4, 0xB9, 0x86, 0xA1, 0x2D, 0x8F, 0x62, 0xE4, 0x19, 0x9A,
+ 0x71, 0xC2, 0xF4, 0xA5, 0x93, 0x04, 0xBB, 0x8D, 0x64, 0xB5, 0x40, 0x8C, 0x8B, 0xA6, 0x52, 0xCE,
+ 0xE3, 0x95, 0x53, 0xEA, 0x14, 0x21, 0x7C, 0x64, 0xCE, 0xCA, 0x69, 0xE9, 0x3F, 0xD9, 0xB7, 0xD4,
+ 0xB3, 0xB3, 0xC2, 0x82, 0x64, 0xA2, 0x23, 0xC6, 0xE6, 0x8A, 0x5F, 0xFE, 0xFA, 0x06, 0xE6, 0x5F,
+ 0xA2, 0x82, 0x3B, 0x4E, 0x89, 0xAA, 0xCF, 0xCB, 0x18, 0xA1, 0x69, 0x65, 0x93, 0xA8, 0x19, 0xC7,
+ 0x78, 0x6F, 0x94, 0x9A, 0x2F, 0x1F, 0x5B, 0x47, 0x30, 0x06, 0xBE, 0x59, 0x5D, 0x84, 0xDB, 0xDF,
+ 0xAC, 0xAF, 0x91, 0x8A, 0x39, 0x28, 0xB4, 0xA1, 0x68, 0x2D, 0x4F, 0x39, 0x64, 0xC3, 0x92, 0xB7,
+ 0x31, 0x38, 0xAE, 0x87, 0xD1, 0xCD, 0xB8, 0x11, 0xD4, 0xF6, 0xEA, 0x06, 0xB6, 0xB2, 0x22, 0xE8,
+ 0x46, 0x7C, 0xB3, 0xC4, 0x93, 0xD1, 0x19, 0x2D, 0xEE, 0x9B, 0xAC, 0x1E, 0x9C, 0xEE, 0x6C, 0x85,
+ 0x6F, 0x35, 0xAC, 0x97, 0x3E, 0x97, 0xD0, 0x50, 0x38, 0x59, 0xF8, 0x5E, 0xB0, 0x3D, 0xAA, 0x9E,
+ 0x8F, 0x78, 0x51, 0x04, 0xE0, 0x01, 0x8C, 0xF3, 0xE3, 0x9F, 0x59, 0x11, 0x7D, 0x5F, 0xC9, 0xDB,
+ 0xA3, 0x99, 0xA6, 0xE2, 0x65, 0x90, 0x75, 0xDD, 0xEC, 0x59, 0x60, 0x19, 0x70, 0x66, 0x12, 0x0B,
+ 0x27, 0x26, 0xC2, 0x3B, 0x5B, 0xDB, 0x6F, 0x11, 0x39, 0x08, 0xDC, 0xF4, 0x14, 0x51, 0x06, 0xFE,
+ 0x9B, 0xDB, 0x22, 0x25, 0x1E, 0x25, 0x43, 0x8D, 0xD5, 0xD0, 0xFB, 0x68, 0xF3, 0x65, 0xEA, 0x97,
+ 0x20, 0xDD, 0x60, 0x7B, 0xB4, 0xE0, 0x90, 0x24, 0x62, 0xF6, 0x84, 0xF0, 0x47, 0xD6, 0xB9, 0xE3,
+ 0xB8, 0x16, 0x6A, 0xDB, 0xA7, 0xF7, 0xFD, 0xFC, 0x74, 0x1F, 0x8C, 0xFD, 0x88, 0x4A, 0xE9, 0xEE,
+ 0xFE, 0xCC, 0xE5, 0xA0, 0x2C, 0x1D, 0xAE, 0xD0, 0xF3, 0x56, 0xBE, 0xD8, 0x45, 0xC4, 0x44, 0xEA,
+ 0xD7, 0x71, 0x34, 0x7C, 0x2A, 0x0A, 0x3F, 0xD1, 0xA8, 0xCA, 0xF1, 0x7E, 0x9C, 0x39, 0x6B, 0x51,
+ 0xBD, 0xDB, 0x56, 0x87, 0xAC, 0xDF, 0x31, 0xF9, 0xC0, 0x73, 0xDB, 0xBC, 0x0D, 0x1D, 0xD7, 0x8B,
+ 0xBB, 0x50, 0x3B, 0xE7, 0xB5, 0xE9, 0x6A, 0x3B, 0x83, 0xF8, 0x27, 0xE8, 0x7C, 0xD1, 0x8D, 0x14,
+ 0xDD, 0x5A, 0xDF, 0xD1, 0xBE, 0xBA, 0xFD, 0x3E, 0xF8, 0xA4, 0x8A, 0xED, 0xAD, 0x82, 0xFD, 0x28,
+ 0x3F, 0x46, 0x1C, 0x56, 0x71, 0x71, 0x71, 0xFB, 0x1F, 0xEB, 0xE6, 0x72, 0x10, 0x40, 0xDB, 0xA3,
+ 0x40, 0xEA, 0x06, 0x63, 0x74, 0xE7, 0xC3, 0xA9, 0xE4, 0x07, 0xFD, 0xA8, 0x5C, 0x83, 0x16, 0x69,
+ 0xB4, 0x6A, 0xAE, 0x85, 0xFC, 0x32, 0xDF, 0x59, 0x71, 0xBB, 0x7A, 0xC1, 0xC2, 0x0E, 0xC0, 0x5A,
+ 0xA1, 0x1F, 0x88, 0x6E, 0xF4, 0x79, 0xF2, 0x4F, 0xA5, 0x84, 0x8B, 0xA7, 0x39, 0xCC, 0x6D, 0x44,
+ 0x33, 0xD8, 0x1A, 0x9B, 0xAD, 0x8F, 0x12, 0x49, 0x63, 0x93, 0xBB, 0x70, 0xA7, 0x9D, 0x4A, 0x69,
+ 0xDC, 0x18, 0x09, 0xB8, 0xED, 0xB1, 0x50, 0x13, 0x59, 0xEA, 0xDC, 0x7B, 0xBF, 0x7F, 0x83, 0x4F,
+ 0xC7, 0xFA, 0x3B, 0x44, 0xEF, 0xF9, 0x4C, 0xE9, 0x72, 0x70, 0xD7, 0x27, 0xEC, 0x80, 0x18, 0x2A,
+ 0x45, 0x71, 0x87, 0x99, 0x9F, 0xE0, 0x74, 0x3E, 0xE0, 0xE1, 0xCD, 0xF6, 0x76, 0xD9, 0x82, 0x6D,
+ 0xF5, 0x01, 0x9C, 0x33, 0x19, 0xB7, 0x0A, 0x1E, 0x07, 0xC7, 0x11, 0x4B, 0xC2, 0x64, 0x16, 0x14,
+ 0x9F, 0xE6, 0xD2, 0x65, 0x64, 0x9E, 0xCA, 0x29, 0xB9, 0xC1, 0xA1, 0x64, 0x4A, 0x39, 0x36, 0xD7,
+ 0xED, 0xC4, 0xCA, 0x4D, 0x93, 0xB7, 0xE7, 0x52, 0x6E, 0xC4, 0x2A, 0x89, 0x16, 0x14, 0xC2, 0x26,
+ 0xF9, 0xD6, 0x69, 0xA6, 0x8B, 0x52, 0x04, 0xA3, 0xF9, 0xB5, 0x34, 0x97, 0x98, 0x0F, 0x77, 0x01,
+ 0x02, 0xD7, 0x3D, 0x75, 0x08, 0xE7, 0x90, 0x1B, 0x0A, 0xA4, 0x1D, 0x27, 0xBB, 0xC3, 0xF5, 0x9A,
+ 0x3A, 0x75, 0xC2, 0x85, 0x12, 0x98, 0x59, 0x90, 0x92, 0x99, 0x15, 0x73, 0xA2, 0x1D, 0x8A, 0xC0,
+ 0x68, 0x39, 0x69, 0x93, 0x2C, 0xCF, 0xE1, 0x43, 0x99, 0xD6, 0x68, 0xEB, 0xBD, 0xB1, 0xF2, 0xA4,
+ 0xB4, 0x84, 0x78, 0x62, 0xCA, 0xF7, 0xE3, 0xC8, 0x5B, 0x12, 0x92, 0xA4, 0x93, 0xAA, 0x04, 0x07,
+ 0x45, 0x26, 0x09, 0x77, 0x6E, 0x30, 0x47, 0x26, 0x9D, 0x24, 0x8B, 0xED, 0xDC, 0xFB, 0xFF, 0x23,
+ 0x3A, 0xFD, 0x6B, 0xCB, 0xA0, 0x88, 0x08, 0x76, 0x66, 0x0A, 0xF9, 0x7B, 0x4F, 0xE2, 0x23, 0x5C,
+ 0x4E, 0xE9, 0x16, 0x29, 0xA0, 0x9E, 0xE2, 0x7B, 0xB7, 0xD6, 0xDB, 0xD9, 0xC5, 0xCF, 0x68, 0x4A,
+ 0x9F, 0x08, 0x22, 0xA0, 0xEC, 0xF2, 0x3F, 0x95, 0xAE, 0x25, 0x95, 0xED, 0x10, 0x6F, 0x35, 0x1A,
+ 0xCA, 0x58, 0xB2, 0xC6, 0x72, 0xA1, 0x03, 0x7E, 0x58, 0x70, 0x59, 0x24, 0x6A, 0x39, 0x00, 0x8B,
+ 0x4A, 0x27, 0xBC, 0xB9, 0x00, 0x92, 0x6A, 0xA5, 0xC8, 0x1D, 0xBA, 0xFB, 0x24, 0x7F, 0x91, 0x3D,
+ 0xF3, 0x4D, 0x7D, 0xB5, 0xF8, 0xB8, 0x76, 0x27, 0x0A, 0x50, 0x10, 0x98, 0xD3, 0xFE, 0xD8, 0xCD,
+ 0x55, 0xDD, 0xC3, 0x70, 0x38, 0x23, 0x75, 0x44, 0xA1, 0x16, 0x01, 0xC4, 0xFB, 0x7A, 0x31, 0xBD,
+ 0xC1, 0x1B, 0x51, 0x7F, 0xAB, 0xC0, 0xAE, 0x0C, 0x43, 0xA5, 0x07, 0x35, 0x88, 0xAF, 0x8D, 0x5F,
+ 0xF6, 0xE0, 0xFA, 0x6C, 0x83, 0x05, 0xEC, 0xFC, 0x85, 0xDD, 0x66, 0x11, 0x64, 0x77, 0xE7, 0xCA,
+ 0xF4, 0xE5, 0xC8, 0x11, 0xC2, 0xAE, 0x06, 0x94, 0x40, 0xF7, 0xA4, 0x00, 0x6F, 0xDD, 0x99, 0xBD,
+ 0x3A, 0xA3, 0x69, 0x5B, 0xFF, 0x09, 0xC8, 0xC7, 0xF5, 0xFD, 0xA7, 0xE3, 0x6D, 0x0D, 0x81, 0xC4,
+ 0x70, 0xA1, 0x86, 0x35, 0xEF, 0x76, 0x58, 0x4F, 0xD8, 0x91, 0xD2, 0x34, 0xF6, 0x48, 0x86, 0x20,
+ 0x95, 0xA2, 0x39, 0xDD, 0x4A, 0x63, 0xC4, 0xFD, 0xAC, 0x12, 0x61, 0xCC, 0xF9, 0x08, 0x15, 0x17,
+ 0x4D, 0x94, 0x9B, 0x03, 0xFF, 0x27, 0x06, 0xDC, 0x2A, 0x6B, 0xC6, 0x45, 0x8C, 0xBE, 0x6B, 0x2E,
+ 0x21, 0x9A, 0xDE, 0xBE, 0x17, 0x3A, 0x91, 0xA8, 0xA4, 0x09, 0x94, 0x70, 0x22, 0x62, 0x06, 0xDD,
+ 0x65, 0x5E, 0x81, 0x8C, 0xB0, 0x2D, 0xA7, 0xA6, 0x6B, 0xD9, 0x9C, 0x75, 0xA1, 0x4C, 0x55, 0x96,
+ 0x67, 0x6C, 0xF7, 0xFB, 0x34, 0xA6, 0x4C, 0x53, 0x10, 0x5A, 0xDB, 0x54, 0x7E, 0xAC, 0x67, 0xEA,
+ 0x12, 0xF0, 0x29, 0x2A, 0x49, 0x89, 0xFF, 0xC5, 0xF3, 0xD4, 0x1D, 0xBA, 0xFB, 0xEF, 0xCE, 0xA3,
+ 0x58, 0x33, 0x7C, 0xFA, 0xC0, 0x30, 0x45, 0x70, 0x15, 0xB0, 0xDE, 0x85, 0xD7, 0x66, 0xCA, 0x00,
+ 0x87, 0x93, 0x85, 0x6B, 0xD0, 0x2E, 0x94, 0x80, 0x30, 0x24, 0x69, 0xC5, 0xD9, 0xD8, 0x00, 0xA7,
+ 0xBF, 0x4E, 0xF7, 0x5C, 0xDE, 0x10, 0xBE, 0x0A, 0xAE, 0xDA, 0x8D, 0xFD, 0xCB, 0xD0, 0xAF, 0x6F,
+ 0xBB, 0xD2, 0xEB, 0xEB, 0x05, 0xA4, 0xF7, 0x3B, 0x0B, 0xC1, 0x0E, 0x50, 0xE4, 0x80, 0x65, 0xF6,
+ 0xEE, 0x78, 0xDB, 0xFA, 0xCD, 0x96, 0xDA, 0xB7, 0x47, 0xDD, 0x95, 0x0D, 0xEC, 0x65, 0x4F, 0x2A,
+ 0x51, 0x8A, 0xC6, 0xA9, 0x25, 0xCE, 0x3D, 0x2D, 0xC2, 0x06, 0xB9, 0x26, 0xE1, 0x68, 0xA4, 0x68,
+ 0x23, 0xB9, 0x0B, 0x12, 0x7D, 0x79, 0xD3, 0x48, 0x0E, 0xA6, 0x2A, 0x2B, 0xA3, 0x23, 0x64, 0x10,
+ 0xBA, 0xA3, 0x92, 0x83, 0xF0, 0x91, 0xB9, 0xF7, 0x12, 0x4A, 0x08, 0xFA, 0xE3, 0x10, 0xAE, 0x69,
+ 0xDD, 0x93, 0x1C, 0xC6, 0xCC, 0x32, 0x78, 0x85, 0x15, 0x84, 0xBE, 0x0E, 0x9B, 0x21, 0xB0, 0xE7,
+ 0x0B, 0xC0, 0x25, 0xCA, 0xE3, 0xA3, 0xC0, 0x6A, 0x96, 0xC4, 0x98, 0x51, 0x9B, 0xF6, 0x5B, 0x09,
+ 0xAD, 0x67, 0x03, 0xA1, 0x4A, 0x51, 0x1B, 0xC0, 0x4B, 0x0B, 0x1C, 0x23, 0x0A, 0x2B, 0xBA, 0x9F,
+ 0xAE, 0x74, 0xED, 0xFA, 0xA1, 0xC4, 0x30, 0xAB, 0x00, 0xED, 0x7A, 0x17, 0xCC, 0x15, 0xC5, 0xBF,
+ 0xCC, 0x49, 0x41, 0x97, 0x3D, 0xBE, 0x2A, 0xE7, 0xED, 0x33, 0x02, 0x5B, 0x42, 0xF3, 0x18, 0x10,
+ 0xD3, 0xD5, 0x27, 0x08, 0x4A, 0xFD, 0xFB, 0xA5, 0x19, 0x43, 0xE6, 0x38, 0x26, 0xAA, 0xC3, 0xE6,
+ 0x7B, 0xF1, 0xD5, 0x02, 0x96, 0x27, 0x86, 0xAC, 0x38, 0x86, 0x4E, 0xD0, 0x8B, 0xD7, 0x2B, 0xCC,
+ 0x97, 0x96, 0x24, 0x6D, 0x66, 0x7D, 0x2B, 0xC8, 0xF7, 0x49, 0xEA, 0x26, 0x74, 0xED, 0x29, 0x50,
+ 0x03, 0x72, 0x2E, 0x3D, 0x52, 0x3D, 0x1C, 0x63, 0x38, 0x67, 0x47, 0x3B, 0x07, 0xF8, 0x5C, 0x54,
+ 0x98, 0x0A, 0xEA, 0xB9, 0x0E, 0xB7, 0x7E, 0x78, 0xF6, 0xD5, 0x8E, 0xC1, 0x1C, 0x36, 0x2A, 0x17,
+ 0x17, 0x0A, 0x3E, 0x90, 0xA4, 0x77, 0x27, 0x47, 0xBA, 0xC9, 0x03, 0x6A, 0x3C, 0x88, 0x17, 0xF5,
+ 0xEC, 0x7A, 0x94, 0x3D, 0xD3, 0x06, 0x00, 0xEE, 0xB2, 0x31, 0x36, 0xB5, 0xCA, 0x53, 0x52, 0xC9,
+ 0x4C, 0xA6, 0x54, 0x12, 0xC6, 0x58, 0xB7, 0x2F, 0xD1, 0xD1, 0xF5, 0x8A, 0x96, 0x3E, 0x44, 0x61,
+ 0x4B, 0xA0, 0x9D, 0xF1, 0x54, 0x4A, 0xE7, 0x27, 0x8B, 0x02, 0x8B, 0x8E, 0xC3, 0xF2, 0xAF, 0x01,
+ 0xDE, 0x38, 0xE9, 0x7A, 0x15, 0xAE, 0x0D, 0xA2, 0xF2, 0x43, 0x2C, 0x2D, 0x2E, 0xCD, 0xD9, 0x61,
+ 0x72, 0xD2, 0x34, 0x7E, 0x07, 0x2C, 0x2A, 0x00, 0x2D, 0x56, 0x6A, 0x9C, 0xFF, 0x13, 0xBE, 0xF2,
+ 0x60, 0xCD, 0xBA, 0xFA, 0xB5, 0xBA, 0x95, 0x7F, 0x3B, 0xE1, 0x6F, 0x86, 0x83, 0xAF, 0x52, 0xD3,
+ 0x86, 0xBE, 0xDF, 0x71, 0xFD, 0x39, 0x1B, 0x49, 0x23, 0xE8, 0x82, 0x3D, 0x98, 0xE7, 0x6A, 0x7E,
+ 0xE4, 0x76, 0xB0, 0x2C, 0xBD, 0xAE, 0x26, 0xC5, 0xB5, 0x6F, 0x9A, 0xA2, 0x7E, 0x95, 0x84, 0x2A,
+ 0x74, 0x4A, 0xEC, 0x70, 0x4D, 0xC1, 0xA9, 0xEB, 0x30, 0xD9, 0xAE, 0x8D, 0x7A, 0xA3, 0xF7, 0x5F,
+ 0x3F, 0xDE, 0xC2, 0xCD, 0x8B, 0xB0, 0xD6, 0xD0, 0xC5, 0x71, 0x7C, 0xC7, 0xF9, 0x97, 0x98, 0x51,
+ 0x52, 0x7E, 0x0D, 0x50, 0xB4, 0xC9, 0x29, 0x79, 0x65, 0xC8, 0x43, 0x7B, 0x46, 0x9B, 0x57, 0xF8,
+ 0x74, 0xF7, 0x8B, 0x58, 0xE8, 0xB3, 0x22, 0x43, 0xEB, 0x06, 0xCD, 0xED, 0x0C, 0xC9, 0x86, 0x2B,
+ 0x5E, 0xF9, 0xBA, 0xF5, 0xA3, 0x01, 0x46, 0xE5, 0xE7, 0x99, 0x17, 0x83, 0xA2, 0x4F, 0x2C, 0xEA,
+ 0x9B, 0x12, 0xDB, 0xC9, 0x0B, 0x51, 0x79, 0x65, 0x6F, 0x3A, 0xC6, 0x1D, 0x35, 0x3B, 0xCB, 0xC2,
+ 0xA1, 0x27, 0xA0, 0xE0, 0xC8, 0xCB, 0xBF, 0xA0, 0x7E, 0x9D, 0x7B, 0x8A, 0x6F, 0x38, 0x1D, 0x6A,
+ 0xDA, 0x14, 0xF6, 0x00, 0xA4, 0xEA, 0x18, 0x71, 0x48, 0x3D, 0x05, 0x03, 0x42, 0x42, 0xE7, 0x50,
+ 0x3C, 0x3F, 0x21, 0x2F, 0x7C, 0x18, 0x65, 0x3F, 0xDE, 0xDC, 0x65, 0x9D, 0xB2, 0x8E, 0x92, 0xA1,
+ 0xC7, 0x0B, 0xAD, 0x3C, 0x22, 0x3C, 0x07, 0x62, 0x1D, 0x3C, 0x8F, 0x57, 0xF0, 0x50, 0x21, 0x5C,
+ 0xC2, 0x6A, 0xA9, 0x72, 0x3B, 0x9F, 0xB0, 0x51, 0xEF, 0x1F, 0x5C, 0x83, 0x27, 0x1F, 0xAA, 0x81,
+ 0x50, 0xDC, 0xB2, 0x80, 0x94, 0xE2, 0x69, 0x66, 0x4B, 0x7E, 0xBD, 0xCA, 0x8B, 0x5F, 0xD0, 0xE8,
+ 0x69, 0x63, 0x6D, 0xE4, 0xDA, 0xF7, 0x83, 0x45, 0xCB, 0xFC, 0x33, 0xDB, 0x43, 0x99, 0x7E, 0x41,
+ 0x86, 0x3F, 0x95, 0xDC, 0xB2, 0x58, 0x8F, 0x8E, 0x7F, 0xAA, 0xC8, 0x37, 0x80, 0x08, 0x1C, 0xAE,
+ 0x22, 0x03, 0xF1, 0x98, 0x73, 0x47, 0x75, 0x38, 0x5B, 0x1F, 0x99, 0x70, 0xE4, 0x48, 0x15, 0x48,
+ 0xCE, 0x24, 0x15, 0xE4, 0x0B, 0xCA, 0x01, 0x8E, 0x8B, 0xE7, 0x9B, 0x4E, 0x5B, 0x56, 0x11, 0x14,
+ 0x31, 0x78, 0x8F, 0xA9, 0x9A, 0xDA, 0x41, 0x52, 0x21, 0xBB, 0x34, 0x10, 0x74, 0x55, 0x87, 0x4B,
+ 0x7A, 0x65, 0xBA, 0x53, 0xFB, 0x06, 0xB3, 0x82, 0x3F, 0xEC, 0x43, 0x84, 0xF4, 0xC9, 0xAF, 0x11,
+ 0x7F, 0x25, 0x7A, 0x7A, 0x2F, 0x33, 0x93, 0x10, 0x9B, 0x7D, 0xA0, 0xAB, 0x35, 0x54, 0x61, 0x85,
+ 0x3A, 0x08, 0x6B, 0x38, 0x45, 0x35, 0xCB, 0xAC, 0x71, 0x07, 0x43, 0x5C, 0x38, 0x79, 0x28, 0xFB,
+ 0x9E, 0x30, 0xDC, 0x69, 0xBE, 0x28, 0x25, 0x52, 0x1A, 0xCF, 0x0C, 0x67, 0x9E, 0x20, 0xF9, 0x18,
+ 0xE2, 0x48, 0x4B, 0xD3, 0x2D, 0x78, 0xF5, 0xFC, 0xB0, 0xCF, 0x03, 0xC8, 0x9B, 0x4D, 0x82, 0xF5,
+ 0xEE, 0x4A, 0x87, 0x45, 0xEC, 0x49, 0x32, 0x59, 0x15, 0x32, 0xEC, 0x63, 0x0B, 0x44, 0x9F, 0x03,
+ 0xAD, 0x0C, 0x4B, 0xC4, 0xCE, 0x74, 0xF0, 0xBA, 0x8D, 0xE6, 0x4A, 0xBC, 0x69, 0xB7, 0xF5, 0xAE,
+ 0xCB, 0x54, 0x43, 0xE8, 0x5A, 0x61, 0xF9, 0x4D, 0x04, 0xAA, 0xCE, 0x99, 0xF4, 0x67, 0x60, 0x63,
+ 0x70, 0x3A, 0x98, 0x3C, 0x42, 0x48, 0x38, 0x9B, 0x90, 0xB4, 0x2F, 0xD7, 0xE1, 0xCF, 0x15, 0x63,
+ 0x1F, 0x9C, 0xDC, 0x3C, 0x1A, 0xE7, 0x43, 0x2A, 0x54, 0xE7, 0x95, 0x16, 0x12, 0xE9, 0x93, 0xAE,
+ 0x89, 0x21, 0x0B, 0xAD, 0xFB, 0x05, 0x50, 0x5A, 0x70, 0x02, 0xD0, 0xCC, 0xDA, 0x66, 0x25, 0x68,
+ 0x11, 0x1F, 0x42, 0x07, 0x10, 0x56, 0x47, 0xCC, 0xA2, 0x3A, 0xAA, 0x44, 0x5B, 0x10, 0xA0, 0x0F,
+ 0x25, 0x44, 0x70, 0x3E, 0x72, 0x3A, 0x58, 0x7C, 0x82, 0x03, 0x3B, 0x8B, 0xFF, 0x5E, 0x6C, 0x06,
+ 0x5A, 0xFC, 0x23, 0x1B, 0x78, 0xD1, 0xCE, 0xC6, 0xC0, 0x3A, 0xAA, 0x07, 0x0F, 0xC0, 0xAC, 0xB7,
+ 0x88, 0x31, 0x31, 0x9A, 0x67, 0x3C, 0xDA, 0x7F, 0xE6, 0x48, 0xAB, 0xE8, 0x30, 0xC0, 0xB4, 0xBF,
+ 0x0B, 0x14, 0x97, 0x81, 0x8F, 0x5E, 0x65, 0x5D, 0xC9, 0x80, 0xDC, 0x85, 0x76, 0x84, 0x90, 0x7B,
+ 0xC0, 0x2E, 0x59, 0x03, 0xB2, 0x19, 0x2C, 0x5B, 0x98, 0xA7, 0xA9, 0xDC, 0xE9, 0x4A, 0x02, 0xE3,
+ 0x80, 0x0D, 0x08, 0x57, 0x03, 0x1D, 0xBB, 0xB0, 0x88, 0x32, 0xCA, 0xF0, 0x4C, 0xD3, 0xF9, 0xBD,
+ 0x25, 0x56, 0x86, 0xBC, 0x99, 0x92, 0xFC, 0xAE, 0x66, 0xF2, 0x9B, 0x43, 0xF9, 0xCF, 0xEE, 0xD4,
+ 0xEF, 0xF9, 0xFE, 0xB6, 0x26, 0x5D, 0x47, 0x07, 0x94, 0x1F, 0xE9, 0xD9, 0xA0, 0x78, 0xF9, 0x57,
+ 0x26, 0x6E, 0xF9, 0xEB, 0x02, 0x01, 0x9E, 0xB0, 0x75, 0x43, 0x0C, 0x6D, 0x82, 0x54, 0xFC, 0xE2,
+ 0xFA, 0x1B, 0x3C, 0x31, 0x64, 0xD5, 0x66, 0x22, 0x45, 0x1F, 0x35, 0x74, 0x8A, 0x70, 0x9A, 0xD8,
+ 0xEC, 0xE8, 0x44, 0x0C, 0x9D, 0x10, 0xFD, 0x5A, 0xB3, 0x53, 0x21, 0x6A, 0x64, 0xD5, 0x15, 0x6A,
+ 0x96, 0x48, 0x1A, 0xA3, 0x4E, 0x97, 0xB8, 0xCF, 0xB2, 0xA3, 0x14, 0x23, 0x83, 0xC1, 0x1A, 0x07,
+ 0x6B, 0x89, 0x64, 0x16, 0x02, 0x9B, 0x04, 0x17, 0xA4, 0xE3, 0xF3, 0xDB, 0x1C, 0x8F, 0x9E, 0x0D,
+ 0x0A, 0x6D, 0xB4, 0xA2, 0xA7, 0x76, 0x49, 0xBB, 0xBA, 0x79, 0x2D, 0x6F, 0xCE, 0xD9, 0x5C, 0x24,
+ 0xC7, 0xDD, 0xF1, 0x22, 0xCC, 0x7D, 0xDF, 0xED, 0x97, 0x93, 0x60, 0xDD, 0x0B, 0x99, 0xBD, 0x58,
+ 0x0B, 0x06, 0x77, 0x91, 0x82, 0x1F, 0xE2, 0xFE, 0xCF, 0x14, 0xF8, 0x51, 0x12, 0x2B, 0xBE, 0xFF,
+ 0x68, 0xE7, 0xD9, 0xA5, 0xA4, 0x2E, 0xD5, 0xAA, 0xE2, 0xFA, 0x80, 0x58, 0xAC, 0xD1, 0x6C, 0xDD,
+ 0xB6, 0x40, 0xB6, 0xCE, 0x39, 0x6B, 0x95, 0x5C, 0xFF, 0x46, 0x7D, 0x2F, 0x03, 0xCA, 0xE1, 0x92,
+ 0x5E, 0x2D, 0xD5, 0x58, 0x56, 0x82, 0xE1, 0x7D, 0x13, 0x21, 0xB0, 0x76, 0x1A, 0x92, 0xDE, 0x77,
+ 0xB4, 0x05, 0xD0, 0xBC, 0xC9, 0xE3, 0xCE, 0xD2, 0xB9, 0x2B, 0x70, 0xBD, 0xF4, 0x79, 0x3C, 0xFA,
+ 0xF3, 0x91, 0x51, 0xAA, 0xF4, 0xF0, 0x14, 0x0C, 0x4E, 0xD1, 0x66, 0x60, 0x90, 0x16, 0x5B, 0xEF,
+ 0x34, 0xE8, 0xB1, 0x5A, 0x2B, 0x8E, 0x2C, 0x11, 0x39, 0x2D, 0x37, 0x43, 0x4F, 0xA3, 0x9C, 0x0B,
+ 0x19, 0x19, 0x3D, 0x30, 0xCA, 0x51, 0x07, 0x67, 0x5A, 0xD2, 0xE0, 0x1D, 0x6C, 0xDD, 0xB2, 0xF8,
+ 0x9E, 0x32, 0x07, 0x7A, 0x33, 0x26, 0x2F, 0x3A, 0x71, 0x25, 0xB0, 0x26, 0xDF, 0xAB, 0xEE, 0xCC,
+ 0xAD, 0xA9, 0x46, 0x40, 0x65, 0xD6, 0x51, 0xD2, 0x12, 0x5D, 0x27, 0x4F, 0xBB, 0x95, 0x51, 0x87,
+ 0x55, 0xB2, 0xF7, 0xEB, 0x89, 0x65, 0xDF, 0xCA, 0xDF, 0xA2, 0x55, 0xAD, 0xA0, 0x19, 0x6A, 0xE5,
+ 0x88, 0x0A, 0xCE, 0x24, 0xA2, 0xA7, 0xEB, 0x0C, 0x29, 0xDC, 0x24, 0x09, 0x93, 0x99, 0x50, 0x2C,
+ 0xB7, 0x0F, 0x21, 0xB7, 0x71, 0xF6, 0x8B, 0x3F, 0x69, 0x0C, 0x32, 0xA1, 0x18, 0x3A, 0x81, 0xEE,
+ 0x42, 0x67, 0x82, 0x5E, 0xE1, 0x7B, 0x1C, 0x6F, 0x57, 0xA9, 0x60, 0x38, 0x53, 0x42, 0x04, 0x65,
+ 0x21, 0x31, 0x8B, 0xB8, 0xEA, 0x9F, 0x0D, 0xA6, 0xAE, 0xD8, 0x4D, 0x9B, 0xCB, 0x36, 0x53, 0xC4,
+ 0x60, 0x2F, 0x84, 0x0E, 0x64, 0xBF, 0xCE, 0x08, 0x89, 0xD0, 0x2B, 0xB9, 0xE3, 0x87, 0xEC, 0x10,
+ 0xA8, 0x61, 0x70, 0xF7, 0xE5, 0x23, 0xAA, 0x2E, 0x7A, 0x70, 0x64, 0x5D, 0x04, 0xD6, 0xC6, 0xA2,
+ 0xA9, 0x3B, 0x79, 0xD6, 0x9A, 0x9A, 0x15, 0x39, 0xDF, 0xF4, 0x4A, 0x2A, 0xE0, 0x2C, 0x67, 0xC7,
+ 0x01, 0xF3, 0x02, 0x6B, 0xE4, 0xF4, 0xE0, 0x77, 0x17, 0xA2, 0xEC, 0x93, 0xD3, 0x61, 0x49, 0xB4,
+ 0xAC, 0x52, 0x3A, 0x84, 0xFA, 0x3E, 0x2C, 0xD8, 0xAB, 0xD9, 0xE6, 0xDD, 0x59, 0x1C, 0x1E, 0x41,
+ 0x97, 0xEF, 0x29, 0x13, 0xF2, 0x2D, 0x1D, 0x21, 0x5F, 0x6F, 0x16, 0xF2, 0x7C, 0x72, 0x69, 0xB6,
+ 0x93, 0xC9, 0xE5, 0x7A, 0x1B, 0x4E, 0x10, 0x78, 0x6C, 0x79, 0x4B, 0x23, 0x73, 0x02, 0x9B, 0xF2,
+ 0xE0, 0xC3, 0xDB, 0x58, 0xF3, 0x23, 0x37, 0xC9, 0x06, 0x20, 0xF1, 0x08, 0x34, 0x47, 0x91, 0xB0,
+ 0x8E, 0xF3, 0xFF, 0xFE, 0x83, 0x4A, 0x97, 0xA4, 0x55, 0x22, 0x55, 0xF3, 0x9F, 0x41, 0x7F, 0xE1,
+ 0xF5, 0xE3, 0x42, 0xAE, 0x54, 0xF0, 0x83, 0x68, 0x08, 0x09, 0x2C, 0x95, 0x6C, 0x23, 0x11, 0x7E,
+ 0x9F, 0x7D, 0x53, 0x78, 0xA1, 0x6B, 0x02, 0x14, 0x8C, 0xDD, 0xF2, 0x34, 0x35, 0x7D, 0xF7, 0xCB,
+ 0xEF, 0x68, 0x04, 0x07, 0x2C, 0xC2, 0x36, 0x1E, 0x15, 0x17, 0x15, 0x6B, 0x74, 0x56, 0xC4, 0x12,
+ 0xB7, 0xBF, 0xC8, 0xDB, 0x66, 0xF2, 0x88, 0xFA, 0xEB, 0xD3, 0xA3, 0x99, 0xBE, 0xD3, 0x21, 0x35,
+ 0x05, 0xED, 0x73, 0x9A, 0xA0, 0x14, 0x3C, 0x24, 0x0A, 0xDF, 0x97, 0x0F, 0x1B, 0xA2, 0x9A, 0xB0,
+ 0x0F, 0x01, 0xAD, 0x1D, 0x87, 0xED, 0x21, 0x8F, 0x2F, 0xA8, 0x4D, 0xFD, 0x02, 0x5E, 0x4B, 0xEA,
+ 0xAD, 0x44, 0x2D, 0x58, 0xB4, 0xC8, 0x8F, 0x40, 0x38, 0x9D, 0x93, 0x3D, 0x32, 0x28, 0x6C, 0x50,
+ 0xE2, 0x10, 0xC1, 0x7C, 0xDD, 0x10, 0x08, 0x22, 0xB1, 0x1C, 0xB2, 0x2C, 0xA2, 0x33, 0xB5, 0x91,
+ 0x55, 0x3C, 0xDA, 0xAA, 0xF2, 0xDA, 0xBF, 0x97, 0xA8, 0xB0, 0x81, 0x21, 0xD8, 0x5E, 0xBE, 0xCE,
+ 0x21, 0x55, 0xD7, 0xBE, 0xC0, 0xAF, 0xDE, 0xF3, 0xB7, 0x5E, 0xDB, 0x98, 0x40, 0x71, 0x8D, 0xB0,
+ 0xDD, 0xAB, 0x7D, 0xEB, 0x68, 0x9C, 0xAD, 0x24, 0xA6, 0xE1, 0xB0, 0x90, 0x79, 0xAC, 0xEB, 0xD4,
+ 0x9D, 0x69, 0x09, 0xE8, 0xE1, 0x7E, 0xFD, 0xE5, 0xAD, 0x59, 0xD2, 0x3A, 0xBD, 0x83, 0x96, 0xC8,
+ 0x04, 0xF4, 0x8E, 0x55, 0x56, 0xBC, 0x95, 0xC9, 0x0D, 0x9E, 0xC6, 0x6F, 0xA3, 0x4F, 0x68, 0xD2,
+ 0x78, 0x16, 0x57, 0x5D, 0x09, 0xE0, 0x61, 0xC5, 0xAD, 0x3F, 0xD1, 0xE0, 0xFA, 0xE8, 0x1D, 0x77,
+ 0x70, 0x42, 0xF7, 0x53, 0x47, 0xAA, 0xBB, 0x7D, 0xF3, 0xBA, 0xC9, 0x26, 0xB2, 0xC9, 0xC3, 0x0A,
+ 0x17, 0x4C, 0x2A, 0x1B, 0xB6, 0x12, 0x32, 0x54, 0x9A, 0xB1, 0xEA, 0xC7, 0xB5, 0x28, 0x5F, 0x59,
+ 0xD9, 0x19, 0x4E, 0xFF, 0x0D, 0xB1, 0x67, 0x40, 0xD3, 0x76, 0xA7, 0x0A, 0x94, 0xD9, 0x75, 0x71,
+ 0xCE, 0x6E, 0xE5, 0xFB, 0xD8, 0x9F, 0xB6, 0x5F, 0x91, 0x74, 0x68, 0x9F, 0x7C, 0xA3, 0x99, 0x3A,
+ 0xD9, 0x0C, 0x83, 0x64, 0xFB, 0x7E, 0xB2, 0x9B, 0x1A, 0x5F, 0xDA, 0x85, 0xB5, 0xB9, 0x4C, 0xB1,
+ 0x72, 0xA2, 0x1B, 0x92, 0x20, 0x7A, 0x77, 0xD3, 0x41, 0x8E, 0x1B, 0xF1, 0xC3, 0x5A, 0x6B, 0xF0,
+ 0x66, 0x16, 0x94, 0x1F, 0x57, 0x5A, 0xC1, 0x16, 0xB3, 0xF9, 0xE9, 0xFA, 0x0C, 0x28, 0xC5, 0x32,
+ 0x6F, 0x04, 0xF1, 0xAF, 0x66, 0x9F, 0xF8, 0x72, 0xD6, 0x91, 0x5F, 0x4C, 0xE9, 0x9A, 0xA8, 0x38,
+ 0x47, 0x6C, 0x8C, 0x00, 0xB4, 0x47, 0x20, 0x41, 0x68, 0x12, 0x54, 0x51, 0x1A, 0x56, 0x66, 0x56,
+ 0x4B, 0xC3, 0x59, 0xC7, 0x9C, 0x49, 0x74, 0x06, 0xAB, 0x45, 0x1D, 0x7B, 0x01, 0xA0, 0xF5, 0x34,
+ 0x9E, 0xE3, 0xAD, 0x5B, 0x3A, 0x12, 0x33, 0x3E, 0x03, 0xB7, 0xA6, 0x92, 0x62, 0x11, 0x75, 0x5D,
+ 0xE4, 0xB9, 0x78, 0x43, 0xCC, 0x4D, 0xF7, 0x03, 0x0C, 0x5A, 0xED, 0x74, 0x55, 0x96, 0x91, 0x29,
+ 0xFA, 0xBA, 0xC6, 0x38, 0xCB, 0x22, 0xF2, 0x90, 0x6B, 0x7B, 0x3D, 0xFF, 0xEF, 0x94, 0x29, 0x59,
+ 0x33, 0x8B, 0x60, 0x66, 0xE7, 0x32, 0xFD, 0x6B, 0xE1, 0x19, 0x68, 0x2F, 0xD3, 0x71, 0xA0, 0x70,
+ 0xE9, 0xAF, 0xE6, 0x25, 0x4E, 0xE8, 0x46, 0x08, 0x1C, 0xF1, 0xE3, 0x60, 0x75, 0x63, 0xF2, 0xAC,
+ 0xAE, 0x25, 0x45, 0x6E, 0xB7, 0x43, 0x71, 0xFD, 0xF9, 0x0B, 0x34, 0x2F, 0xDA, 0xBD, 0x6B, 0x27,
+ 0x68, 0x0D, 0x27, 0x8D, 0xDE, 0xC7, 0x7C, 0x8D, 0x24, 0xC4, 0xCB, 0x9B, 0xED, 0x80, 0x01, 0x14,
+ 0x02, 0x00, 0x00, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x0D, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x0D, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x0D, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0D, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0D, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0D, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0D, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0D, 0x63, 0x6C, 0x65, 0x61, 0x72,
+ 0x74, 0x6F, 0x6D, 0x61, 0x72, 0x6B, 0x0D, 0x80, 0x03,
+};
diff --git a/core/src/fxge/fontdata/chromefontdata/FoxitSymbol.c b/core/src/fxge/fontdata/chromefontdata/FoxitSymbol.c
new file mode 100644
index 0000000000..18cde34c66
--- /dev/null
+++ b/core/src/fxge/fontdata/chromefontdata/FoxitSymbol.c
@@ -0,0 +1,2099 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+const unsigned char g_FoxitSymbolFontData [16729] = {0x1,
+ 0x0, 0x4, 0x2, 0x0, 0x1, 0x1, 0x1, 0xf,
+ 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x53, 0x79, 0x6d,
+ 0x62, 0x6f, 0x6c, 0x4f, 0x54, 0x46, 0x0, 0x1,
+ 0x1, 0x1, 0x26, 0xf8, 0x10, 0x0, 0xf8, 0xad,
+ 0x1, 0xf8, 0xae, 0x2, 0xf8, 0xae, 0x3, 0xf8,
+ 0x18, 0x4, 0xfb, 0x48, 0xfb, 0xba, 0xfa, 0xd6,
+ 0xfa, 0x86, 0x5, 0x1c, 0x6, 0x3d, 0xf, 0x1c,
+ 0x6, 0x89, 0x11, 0xab, 0x1c, 0x3e, 0xa2, 0x12,
+ 0x0, 0x94, 0x2, 0x0, 0x1, 0x0, 0x6, 0x0,
+ 0xa, 0x0, 0xf, 0x0, 0x16, 0x0, 0x1a, 0x0,
+ 0x1d, 0x0, 0x22, 0x0, 0x26, 0x0, 0x2b, 0x0,
+ 0x31, 0x0, 0x33, 0x0, 0x35, 0x0, 0x37, 0x0,
+ 0x3e, 0x0, 0x40, 0x0, 0x43, 0x0, 0x48, 0x0,
+ 0x4b, 0x0, 0x52, 0x0, 0x55, 0x0, 0x58, 0x0,
+ 0x5b, 0x0, 0x60, 0x0, 0x64, 0x0, 0x69, 0x0,
+ 0x6e, 0x0, 0x75, 0x0, 0x79, 0x0, 0x7c, 0x0,
+ 0x81, 0x0, 0x85, 0x0, 0x8a, 0x0, 0x90, 0x0,
+ 0x92, 0x0, 0x94, 0x0, 0x9b, 0x0, 0x9d, 0x0,
+ 0xa0, 0x0, 0xa6, 0x0, 0xab, 0x0, 0xae, 0x0,
+ 0xb5, 0x0, 0xb8, 0x0, 0xbb, 0x0, 0xbe, 0x0,
+ 0xc3, 0x0, 0xc9, 0x0, 0xd1, 0x0, 0xd5, 0x0,
+ 0xdb, 0x0, 0xe1, 0x0, 0xe7, 0x0, 0xeb, 0x0,
+ 0xf3, 0x0, 0xfe, 0x1, 0x6, 0x1, 0xb, 0x1,
+ 0x10, 0x1, 0x19, 0x1, 0x20, 0x1, 0x2a, 0x1,
+ 0x33, 0x1, 0x3c, 0x1, 0x4a, 0x1, 0x56, 0x1,
+ 0x60, 0x1, 0x6d, 0x1, 0x79, 0x1, 0x85, 0x1,
+ 0x8e, 0x1, 0x99, 0x1, 0xa4, 0x1, 0xac, 0x1,
+ 0xb1, 0x1, 0xb9, 0x1, 0xc0, 0x1, 0xca, 0x1,
+ 0xd2, 0x1, 0xd9, 0x1, 0xe2, 0x1, 0xee, 0x1,
+ 0xf5, 0x2, 0x1, 0x2, 0x9, 0x2, 0xe, 0x2,
+ 0x18, 0x2, 0x21, 0x2, 0x2d, 0x2, 0x32, 0x2,
+ 0x3a, 0x2, 0x43, 0x2, 0x4a, 0x2, 0x53, 0x2,
+ 0x5e, 0x2, 0x66, 0x2, 0x71, 0x2, 0x7a, 0x2,
+ 0x86, 0x2, 0x92, 0x2, 0xa0, 0x2, 0xa9, 0x2,
+ 0xb5, 0x2, 0xc3, 0x2, 0xcd, 0x2, 0xdb, 0x2,
+ 0xe8, 0x2, 0xef, 0x2, 0xf9, 0x3, 0x3, 0x3,
+ 0xc, 0x3, 0x16, 0x3, 0x1d, 0x3, 0x22, 0x3,
+ 0x26, 0x3, 0x2b, 0x3, 0x32, 0x3, 0x40, 0x3,
+ 0x4d, 0x3, 0x5b, 0x3, 0x64, 0x3, 0x6f, 0x3,
+ 0x7b, 0x3, 0x87, 0x3, 0x94, 0x3, 0xa1, 0x3,
+ 0xac, 0x3, 0xb7, 0x3, 0xc2, 0x3, 0xcf, 0x3,
+ 0xdc, 0x3, 0xe9, 0x3, 0xf4, 0x4, 0x0, 0x4,
+ 0xb, 0x4, 0x12, 0x4, 0x1c, 0x4, 0x28, 0x4,
+ 0x34, 0x4, 0x40, 0x4, 0x4e, 0x4, 0x5c, 0x4,
+ 0x6a, 0x4, 0x76, 0x4, 0x83, 0x4, 0x8f, 0x4,
+ 0x94, 0x4, 0xbe, 0x4, 0xce, 0x41, 0x6c, 0x70,
+ 0x68, 0x61, 0x42, 0x65, 0x74, 0x61, 0x47, 0x61,
+ 0x6d, 0x6d, 0x61, 0x45, 0x70, 0x73, 0x69, 0x6c,
+ 0x6f, 0x6e, 0x5a, 0x65, 0x74, 0x61, 0x45, 0x74,
+ 0x61, 0x54, 0x68, 0x65, 0x74, 0x61, 0x49, 0x6f,
+ 0x74, 0x61, 0x4b, 0x61, 0x70, 0x70, 0x61, 0x4c,
+ 0x61, 0x6d, 0x62, 0x64, 0x61, 0x4d, 0x75, 0x4e,
+ 0x75, 0x58, 0x69, 0x4f, 0x6d, 0x69, 0x63, 0x72,
+ 0x6f, 0x6e, 0x50, 0x69, 0x52, 0x68, 0x6f, 0x53,
+ 0x69, 0x67, 0x6d, 0x61, 0x54, 0x61, 0x75, 0x55,
+ 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x50, 0x68,
+ 0x69, 0x43, 0x68, 0x69, 0x50, 0x73, 0x69, 0x61,
+ 0x6c, 0x70, 0x68, 0x61, 0x62, 0x65, 0x74, 0x61,
+ 0x67, 0x61, 0x6d, 0x6d, 0x61, 0x64, 0x65, 0x6c,
+ 0x74, 0x61, 0x65, 0x70, 0x73, 0x69, 0x6c, 0x6f,
+ 0x6e, 0x7a, 0x65, 0x74, 0x61, 0x65, 0x74, 0x61,
+ 0x74, 0x68, 0x65, 0x74, 0x61, 0x69, 0x6f, 0x74,
+ 0x61, 0x6b, 0x61, 0x70, 0x70, 0x61, 0x6c, 0x61,
+ 0x6d, 0x62, 0x64, 0x61, 0x6e, 0x75, 0x78, 0x69,
+ 0x6f, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x6e, 0x70,
+ 0x69, 0x72, 0x68, 0x6f, 0x73, 0x69, 0x67, 0x6d,
+ 0x61, 0x31, 0x73, 0x69, 0x67, 0x6d, 0x61, 0x74,
+ 0x61, 0x75, 0x75, 0x70, 0x73, 0x69, 0x6c, 0x6f,
+ 0x6e, 0x70, 0x68, 0x69, 0x63, 0x68, 0x69, 0x70,
+ 0x73, 0x69, 0x6f, 0x6d, 0x65, 0x67, 0x61, 0x74,
+ 0x68, 0x65, 0x74, 0x61, 0x31, 0x55, 0x70, 0x73,
+ 0x69, 0x6c, 0x6f, 0x6e, 0x31, 0x70, 0x68, 0x69,
+ 0x31, 0x6f, 0x6d, 0x65, 0x67, 0x61, 0x31, 0x6d,
+ 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x65, 0x63,
+ 0x6f, 0x6e, 0x64, 0x45, 0x75, 0x72, 0x6f, 0x49,
+ 0x66, 0x72, 0x61, 0x6b, 0x74, 0x75, 0x72, 0x77,
+ 0x65, 0x69, 0x65, 0x72, 0x73, 0x74, 0x72, 0x61,
+ 0x73, 0x73, 0x52, 0x66, 0x72, 0x61, 0x6b, 0x74,
+ 0x75, 0x72, 0x4f, 0x6d, 0x65, 0x67, 0x61, 0x61,
+ 0x6c, 0x65, 0x70, 0x68, 0x61, 0x72, 0x72, 0x6f,
+ 0x77, 0x6c, 0x65, 0x66, 0x74, 0x61, 0x72, 0x72,
+ 0x6f, 0x77, 0x75, 0x70, 0x61, 0x72, 0x72, 0x6f,
+ 0x77, 0x72, 0x69, 0x67, 0x68, 0x74, 0x61, 0x72,
+ 0x72, 0x6f, 0x77, 0x64, 0x6f, 0x77, 0x6e, 0x61,
+ 0x72, 0x72, 0x6f, 0x77, 0x62, 0x6f, 0x74, 0x68,
+ 0x63, 0x61, 0x72, 0x72, 0x69, 0x61, 0x67, 0x65,
+ 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x61, 0x72,
+ 0x72, 0x6f, 0x77, 0x64, 0x62, 0x6c, 0x6c, 0x65,
+ 0x66, 0x74, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x64,
+ 0x62, 0x6c, 0x75, 0x70, 0x61, 0x72, 0x72, 0x6f,
+ 0x77, 0x64, 0x62, 0x6c, 0x72, 0x69, 0x67, 0x68,
+ 0x74, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x64, 0x62,
+ 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x61, 0x72, 0x72,
+ 0x6f, 0x77, 0x64, 0x62, 0x6c, 0x62, 0x6f, 0x74,
+ 0x68, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73,
+ 0x61, 0x6c, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61,
+ 0x6c, 0x64, 0x69, 0x66, 0x66, 0x65, 0x78, 0x69,
+ 0x73, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c,
+ 0x65, 0x6d, 0x70, 0x74, 0x79, 0x73, 0x65, 0x74,
+ 0x44, 0x65, 0x6c, 0x74, 0x61, 0x67, 0x72, 0x61,
+ 0x64, 0x69, 0x65, 0x6e, 0x74, 0x65, 0x6c, 0x65,
+ 0x6d, 0x65, 0x6e, 0x74, 0x6e, 0x6f, 0x74, 0x65,
+ 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x75,
+ 0x63, 0x68, 0x74, 0x68, 0x61, 0x74, 0x70, 0x72,
+ 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x75, 0x6d,
+ 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x73,
+ 0x74, 0x65, 0x72, 0x69, 0x73, 0x6b, 0x6d, 0x61,
+ 0x74, 0x68, 0x72, 0x61, 0x64, 0x69, 0x63, 0x61,
+ 0x6c, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x72, 0x74,
+ 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x69, 0x6e, 0x66,
+ 0x69, 0x6e, 0x69, 0x74, 0x79, 0x61, 0x6e, 0x67,
+ 0x6c, 0x65, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x61,
+ 0x6c, 0x61, 0x6e, 0x64, 0x6c, 0x6f, 0x67, 0x69,
+ 0x63, 0x61, 0x6c, 0x6f, 0x72, 0x69, 0x6e, 0x74,
+ 0x65, 0x72, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f,
+ 0x6e, 0x75, 0x6e, 0x69, 0x6f, 0x6e, 0x69, 0x6e,
+ 0x74, 0x65, 0x67, 0x72, 0x61, 0x6c, 0x74, 0x68,
+ 0x65, 0x72, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x73,
+ 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x63, 0x6f,
+ 0x6e, 0x67, 0x72, 0x75, 0x65, 0x6e, 0x74, 0x61,
+ 0x70, 0x70, 0x72, 0x6f, 0x78, 0x65, 0x71, 0x75,
+ 0x61, 0x6c, 0x6e, 0x6f, 0x74, 0x65, 0x71, 0x75,
+ 0x61, 0x6c, 0x65, 0x71, 0x75, 0x69, 0x76, 0x61,
+ 0x6c, 0x65, 0x6e, 0x63, 0x65, 0x6c, 0x65, 0x73,
+ 0x73, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x67, 0x72,
+ 0x65, 0x61, 0x74, 0x65, 0x72, 0x65, 0x71, 0x75,
+ 0x61, 0x6c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x73, 0x75, 0x62, 0x73, 0x65, 0x74, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x73, 0x75, 0x70, 0x65,
+ 0x72, 0x73, 0x65, 0x74, 0x6e, 0x6f, 0x74, 0x73,
+ 0x75, 0x62, 0x73, 0x65, 0x74, 0x72, 0x65, 0x66,
+ 0x6c, 0x65, 0x78, 0x73, 0x75, 0x62, 0x73, 0x65,
+ 0x74, 0x72, 0x65, 0x66, 0x6c, 0x65, 0x78, 0x73,
+ 0x75, 0x70, 0x65, 0x72, 0x73, 0x65, 0x74, 0x63,
+ 0x69, 0x72, 0x63, 0x6c, 0x65, 0x70, 0x6c, 0x75,
+ 0x73, 0x63, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x6d,
+ 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, 0x70,
+ 0x65, 0x72, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x63,
+ 0x75, 0x6c, 0x61, 0x72, 0x64, 0x6f, 0x74, 0x6d,
+ 0x61, 0x74, 0x68, 0x69, 0x6e, 0x74, 0x65, 0x67,
+ 0x72, 0x61, 0x6c, 0x74, 0x70, 0x69, 0x6e, 0x74,
+ 0x65, 0x67, 0x72, 0x61, 0x6c, 0x62, 0x74, 0x61,
+ 0x6e, 0x67, 0x6c, 0x65, 0x6c, 0x65, 0x66, 0x74,
+ 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x72, 0x69, 0x67,
+ 0x68, 0x74, 0x6c, 0x6f, 0x7a, 0x65, 0x6e, 0x67,
+ 0x65, 0x73, 0x70, 0x61, 0x64, 0x65, 0x63, 0x6c,
+ 0x75, 0x62, 0x68, 0x65, 0x61, 0x72, 0x74, 0x64,
+ 0x69, 0x61, 0x6d, 0x6f, 0x6e, 0x64, 0x63, 0x6f,
+ 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73,
+ 0x65, 0x72, 0x69, 0x66, 0x72, 0x65, 0x67, 0x69,
+ 0x73, 0x74, 0x65, 0x72, 0x73, 0x65, 0x72, 0x69,
+ 0x66, 0x74, 0x72, 0x61, 0x64, 0x65, 0x6d, 0x61,
+ 0x72, 0x6b, 0x73, 0x65, 0x72, 0x69, 0x66, 0x72,
+ 0x61, 0x64, 0x69, 0x63, 0x61, 0x6c, 0x65, 0x78,
+ 0x61, 0x72, 0x72, 0x6f, 0x77, 0x76, 0x65, 0x72,
+ 0x74, 0x65, 0x78, 0x61, 0x72, 0x72, 0x6f, 0x77,
+ 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x78, 0x72,
+ 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x73,
+ 0x61, 0x6e, 0x73, 0x63, 0x6f, 0x70, 0x79, 0x72,
+ 0x69, 0x67, 0x68, 0x74, 0x73, 0x61, 0x6e, 0x73,
+ 0x74, 0x72, 0x61, 0x64, 0x65, 0x6d, 0x61, 0x72,
+ 0x6b, 0x73, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72,
+ 0x65, 0x6e, 0x6c, 0x65, 0x66, 0x74, 0x74, 0x70,
+ 0x70, 0x61, 0x72, 0x65, 0x6e, 0x6c, 0x65, 0x66,
+ 0x74, 0x65, 0x78, 0x70, 0x61, 0x72, 0x65, 0x6e,
+ 0x6c, 0x65, 0x66, 0x74, 0x62, 0x74, 0x62, 0x72,
+ 0x61, 0x63, 0x6b, 0x65, 0x74, 0x6c, 0x65, 0x66,
+ 0x74, 0x74, 0x70, 0x62, 0x72, 0x61, 0x63, 0x6b,
+ 0x65, 0x74, 0x6c, 0x65, 0x66, 0x74, 0x65, 0x78,
+ 0x62, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x6c,
+ 0x65, 0x66, 0x74, 0x62, 0x74, 0x62, 0x72, 0x61,
+ 0x63, 0x65, 0x6c, 0x65, 0x66, 0x74, 0x74, 0x70,
+ 0x62, 0x72, 0x61, 0x63, 0x65, 0x6c, 0x65, 0x66,
+ 0x74, 0x6d, 0x69, 0x64, 0x62, 0x72, 0x61, 0x63,
+ 0x65, 0x6c, 0x65, 0x66, 0x74, 0x62, 0x74, 0x62,
+ 0x72, 0x61, 0x63, 0x65, 0x65, 0x78, 0x69, 0x6e,
+ 0x74, 0x65, 0x67, 0x72, 0x61, 0x6c, 0x65, 0x78,
+ 0x70, 0x61, 0x72, 0x65, 0x6e, 0x72, 0x69, 0x67,
+ 0x68, 0x74, 0x74, 0x70, 0x70, 0x61, 0x72, 0x65,
+ 0x6e, 0x72, 0x69, 0x67, 0x68, 0x74, 0x65, 0x78,
+ 0x70, 0x61, 0x72, 0x65, 0x6e, 0x72, 0x69, 0x67,
+ 0x68, 0x74, 0x62, 0x74, 0x62, 0x72, 0x61, 0x63,
+ 0x6b, 0x65, 0x74, 0x72, 0x69, 0x67, 0x68, 0x74,
+ 0x74, 0x70, 0x62, 0x72, 0x61, 0x63, 0x6b, 0x65,
+ 0x74, 0x72, 0x69, 0x67, 0x68, 0x74, 0x65, 0x78,
+ 0x62, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x72,
+ 0x69, 0x67, 0x68, 0x74, 0x62, 0x74, 0x62, 0x72,
+ 0x61, 0x63, 0x65, 0x72, 0x69, 0x67, 0x68, 0x74,
+ 0x74, 0x70, 0x62, 0x72, 0x61, 0x63, 0x65, 0x72,
+ 0x69, 0x67, 0x68, 0x74, 0x6d, 0x69, 0x64, 0x62,
+ 0x72, 0x61, 0x63, 0x65, 0x72, 0x69, 0x67, 0x68,
+ 0x74, 0x62, 0x74, 0x61, 0x70, 0x70, 0x6c, 0x65,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x20,
+ 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x20, 0x4f,
+ 0x54, 0x46, 0x0, 0x0, 0x1, 0x0, 0x1, 0x1,
+ 0x0, 0x4, 0x0, 0x0, 0x6, 0x1, 0x0, 0x9,
+ 0x1, 0x0, 0xc, 0x1, 0x0, 0xf, 0x11, 0x0,
+ 0x3c, 0x0, 0x0, 0x3e, 0x0, 0x0, 0x40, 0x0,
+ 0x0, 0x5c, 0x2, 0x0, 0x97, 0x0, 0x0, 0xa1,
+ 0x0, 0x0, 0x9c, 0x0, 0x0, 0x98, 0x0, 0x0,
+ 0xa8, 0x0, 0x0, 0x9f, 0x0, 0x0, 0x65, 0x0,
+ 0x1, 0x87, 0x31, 0x0, 0x74, 0x0, 0x0, 0x79,
+ 0x0, 0x1, 0xb9, 0x1, 0x0, 0x63, 0x0, 0x1,
+ 0xbb, 0x1b, 0x0, 0xa6, 0x0, 0x1, 0xd7, 0x41,
+ 0x0, 0xbf, 0x2, 0x0, 0x1, 0x0, 0x4, 0x0,
+ 0x7, 0x0, 0x3b, 0x0, 0xad, 0x1, 0x68, 0x2,
+ 0x26, 0x2, 0x5c, 0x2, 0x8f, 0x2, 0xb0, 0x3,
+ 0x4, 0x3, 0x13, 0x3, 0x27, 0x3, 0x73, 0x3,
+ 0xa3, 0x3, 0xf5, 0x4, 0x65, 0x4, 0x99, 0x4,
+ 0xf2, 0x5, 0x53, 0x5, 0x7a, 0x5, 0xf1, 0x6,
+ 0x56, 0x6, 0x6d, 0x6, 0xd9, 0x6, 0xf0, 0x7,
+ 0x3, 0x7, 0x1c, 0x7, 0x79, 0x7, 0x9a, 0x7,
+ 0xbc, 0x7, 0xcc, 0x8, 0x17, 0x8, 0x2d, 0x8,
+ 0x79, 0x8, 0x91, 0x8, 0xc9, 0x8, 0xf8, 0x9,
+ 0x6e, 0x9, 0x9d, 0x9, 0xbd, 0xa, 0x3c, 0xa,
+ 0xa0, 0xb, 0xa, 0xb, 0x4c, 0xb, 0xa9, 0xb,
+ 0xe8, 0xc, 0x18, 0xc, 0xb5, 0xc, 0xc4, 0xd,
+ 0x1e, 0xd, 0x6f, 0xd, 0xca, 0xe, 0x11, 0xe,
+ 0x88, 0xe, 0xdd, 0xf, 0x1c, 0xf, 0x69, 0xf,
+ 0xa5, 0xf, 0xde, 0x10, 0x2e, 0x10, 0xab, 0x11,
+ 0x40, 0x11, 0xab, 0x12, 0x1a, 0x12, 0xa8, 0x13,
+ 0x2, 0x13, 0x87, 0x14, 0xa, 0x14, 0x90, 0x14,
+ 0xf6, 0x15, 0x4d, 0x15, 0x89, 0x16, 0x4, 0x16,
+ 0x61, 0x16, 0xac, 0x17, 0x62, 0x17, 0xa8, 0x18,
+ 0x10, 0x18, 0x71, 0x18, 0xe3, 0x19, 0x2e, 0x19,
+ 0x80, 0x19, 0xe3, 0x1a, 0x47, 0x1a, 0xa3, 0x1b,
+ 0x18, 0x1b, 0x93, 0x1c, 0x24, 0x1c, 0x85, 0x1c,
+ 0xf2, 0x1d, 0x87, 0x1d, 0xab, 0x1d, 0xd0, 0x1d,
+ 0xf2, 0x1e, 0x1f, 0x1e, 0x38, 0x1e, 0xc3, 0x1f,
+ 0x58, 0x20, 0xc, 0x20, 0xe9, 0x21, 0x72, 0x22,
+ 0x1a, 0x22, 0x4b, 0x22, 0x79, 0x22, 0xa5, 0x22,
+ 0xd4, 0x23, 0x31, 0x23, 0x53, 0x23, 0x96, 0x23,
+ 0xd5, 0x24, 0xf, 0x24, 0x4e, 0x24, 0xad, 0x24,
+ 0xde, 0x25, 0x46, 0x25, 0x6b, 0x25, 0xea, 0x26,
+ 0xe, 0x26, 0x33, 0x26, 0x74, 0x26, 0xe6, 0x27,
+ 0x31, 0x27, 0x80, 0x27, 0xd8, 0x27, 0xe3, 0x28,
+ 0xf3, 0x29, 0x16, 0x29, 0x88, 0x29, 0xf3, 0x2a,
+ 0xa, 0x2a, 0x26, 0x2a, 0x49, 0x2a, 0x7f, 0x2a,
+ 0xb5, 0x2b, 0xc, 0x2b, 0x54, 0x2b, 0xa0, 0x2b,
+ 0xfb, 0x2c, 0x46, 0x2c, 0x84, 0x2c, 0xa1, 0x2c,
+ 0xb3, 0x2c, 0xc8, 0x2c, 0xfa, 0x2d, 0x24, 0x2d,
+ 0x7a, 0x2d, 0xb6, 0x2d, 0xef, 0x2e, 0x31, 0x2e,
+ 0x7d, 0x2e, 0x98, 0x2e, 0xb7, 0x2e, 0xf1, 0x2f,
+ 0x2d, 0x2f, 0x45, 0x2f, 0x5f, 0x2f, 0x95, 0x2f,
+ 0xff, 0x30, 0x8e, 0x30, 0xda, 0x30, 0xf9, 0x31,
+ 0x55, 0x31, 0xeb, 0x32, 0x87, 0x32, 0x99, 0x32,
+ 0xab, 0x32, 0xc0, 0x33, 0x45, 0x33, 0x92, 0x33,
+ 0xdb, 0x34, 0x6, 0x34, 0x12, 0x34, 0x3a, 0x34,
+ 0x57, 0x34, 0x68, 0x34, 0x84, 0x34, 0xa7, 0x34,
+ 0xd5, 0x34, 0xf4, 0x34, 0xfb, 0x35, 0xe, 0x35,
+ 0x35, 0x35, 0x43, 0x35, 0x6b, 0x35, 0x8a, 0x35,
+ 0x9e, 0x35, 0xbb, 0x35, 0xd7, 0x36, 0x5, 0x36,
+ 0x21, 0x36, 0x97, 0xfc, 0x45, 0xe, 0xfc, 0x45,
+ 0xe, 0xfb, 0xf2, 0x7a, 0xf7, 0x4, 0xf8, 0xd5,
+ 0x77, 0x1, 0xf7, 0x14, 0xf7, 0x4, 0x3, 0xf7,
+ 0x42, 0xf7, 0x64, 0x15, 0x7f, 0x8c, 0x90, 0x85,
+ 0x8f, 0x1b, 0x8f, 0x8f, 0x91, 0x97, 0x8d, 0x1f,
+ 0xb0, 0xf7, 0xb8, 0x94, 0xc1, 0xb6, 0x1a, 0xcb,
+ 0x69, 0x96, 0x75, 0x75, 0x69, 0x81, 0x4a, 0x1e,
+ 0xfc, 0xc2, 0x4, 0x22, 0xa, 0xfb, 0x4b, 0x90,
+ 0x76, 0xf7, 0x64, 0xb9, 0xf7, 0x4a, 0xb9, 0xf7,
+ 0x63, 0x77, 0x1, 0x9f, 0xf8, 0x61, 0x3, 0xe9,
+ 0x7b, 0x15, 0xba, 0x6, 0xa8, 0xf7, 0x64, 0x5,
+ 0xf7, 0x10, 0x6, 0x6f, 0xfb, 0x64, 0x5, 0xba,
+ 0x6, 0xa7, 0xf7, 0x64, 0x5, 0xf3, 0x6, 0x91,
+ 0xb9, 0x5, 0x24, 0x6, 0xa3, 0xf7, 0x4a, 0x5,
+ 0xf2, 0x6, 0x91, 0xb9, 0x5, 0x25, 0x6, 0xa7,
+ 0xf7, 0x63, 0x5, 0x5c, 0x6, 0x6f, 0xfb, 0x63,
+ 0x5, 0xfb, 0x11, 0x6, 0xa8, 0xf7, 0x63, 0x5,
+ 0x5c, 0x6, 0x6e, 0xfb, 0x63, 0x5, 0x27, 0x6,
+ 0x85, 0x5d, 0x5, 0xef, 0x6, 0x72, 0xfb, 0x4a,
+ 0x5, 0x24, 0x6, 0x85, 0x5d, 0x5, 0xf2, 0x6,
+ 0xc0, 0xb9, 0x15, 0xa4, 0xf7, 0x4a, 0x5, 0xf7,
+ 0x10, 0x6, 0x73, 0xfb, 0x4a, 0x5, 0xe, 0xf7,
+ 0x2a, 0x5d, 0xb1, 0xf7, 0xa6, 0xbc, 0x7c, 0xb1,
+ 0xf7, 0x70, 0xa7, 0xd0, 0x77, 0x12, 0xca, 0xdc,
+ 0xf7, 0x70, 0xa8, 0xb7, 0xd6, 0xf7, 0x79, 0xaa,
+ 0x13, 0xdf, 0x80, 0xf7, 0x3f, 0x67, 0x15, 0xc2,
+ 0x6, 0xf8, 0x4d, 0xf9, 0x47, 0x5, 0x54, 0x6,
+ 0x66, 0x82, 0x33, 0x6b, 0x5c, 0x1b, 0x53, 0x8a,
+ 0x6c, 0xa4, 0x83, 0x8f, 0x8, 0xa0, 0x71, 0x79,
+ 0x9f, 0x63, 0x1b, 0xfb, 0x4, 0xfb, 0x6, 0xfb,
+ 0x23, 0xfb, 0x19, 0x40, 0xb9, 0x65, 0xc7, 0xf7,
+ 0x1a, 0xe4, 0xf7, 0x25, 0xef, 0x8c, 0x1f, 0xa0,
+ 0x8b, 0xa0, 0x88, 0x9f, 0x1e, 0x9c, 0x81, 0xaa,
+ 0x85, 0xac, 0x8c, 0xb0, 0x8c, 0xb3, 0x93, 0xa4,
+ 0x9b, 0x8, 0xfb, 0x69, 0x87, 0x15, 0x8d, 0x76,
+ 0x8d, 0x80, 0x6f, 0x1a, 0x3a, 0x45, 0xfb, 0xf,
+ 0x27, 0x66, 0x7e, 0xb3, 0xad, 0xe3, 0xda, 0xf7,
+ 0x14, 0xcd, 0x95, 0x1e, 0x9b, 0x7e, 0xac, 0x7d,
+ 0xa1, 0x82, 0x8, 0xd8, 0xfc, 0x7e, 0x15, 0x3b,
+ 0xbc, 0x5e, 0xd8, 0xf7, 0xc, 0xe4, 0xf7, 0x2a,
+ 0xf2, 0x1e, 0x13, 0xbf, 0x80, 0xc2, 0x76, 0xcd,
+ 0x35, 0xfb, 0x18, 0x2b, 0xfb, 0x20, 0xfb, 0x1,
+ 0x1e, 0xd6, 0x80, 0x15, 0xe8, 0xdf, 0xf7, 0x16,
+ 0xd3, 0x8a, 0x1e, 0xc6, 0x99, 0x5c, 0x60, 0x38,
+ 0x38, 0xfb, 0x11, 0x26, 0x6c, 0x7d, 0xb0, 0xb2,
+ 0x1f, 0xe, 0xea, 0x79, 0xc6, 0x50, 0xd6, 0xf7,
+ 0xed, 0x9d, 0xf7, 0x5d, 0xb3, 0x12, 0xb4, 0xe8,
+ 0xc9, 0xd7, 0x8b, 0xf7, 0x38, 0x8b, 0xbd, 0x13,
+ 0x7f, 0xf8, 0x3e, 0xdd, 0x15, 0x76, 0xa0, 0xd2,
+ 0x3c, 0xdb, 0x1b, 0x13, 0xbf, 0xdb, 0xb2, 0xb4,
+ 0xd8, 0xac, 0x1f, 0x7b, 0x99, 0x5, 0x66, 0x61,
+ 0x64, 0x77, 0x73, 0x1b, 0x4f, 0x56, 0xc2, 0xaa,
+ 0x6c, 0x1f, 0xcc, 0xd7, 0x9f, 0xb7, 0xb2, 0xc8,
+ 0x8, 0xaf, 0xa2, 0xa3, 0xb5, 0xbd, 0x1b, 0x9d,
+ 0xfb, 0x67, 0x79, 0x7, 0xae, 0xa2, 0x7d, 0x71,
+ 0x52, 0x48, 0xfb, 0xa, 0x75, 0x7b, 0x1f, 0x4d,
+ 0xd3, 0x60, 0xd6, 0x69, 0xc9, 0x8, 0xe2, 0xb1,
+ 0xd5, 0xab, 0xe8, 0x1a, 0xc9, 0x4d, 0xc3, 0x49,
+ 0x27, 0x4d, 0x54, 0x24, 0x1e, 0x13, 0x9f, 0x56,
+ 0x9e, 0x6f, 0x9c, 0x5b, 0x1e, 0xfb, 0x2, 0x44,
+ 0x3a, 0x5f, 0xfb, 0xd, 0x1a, 0xfb, 0x0, 0xe2,
+ 0x5b, 0xe4, 0xf7, 0x11, 0xc2, 0xd0, 0xaa, 0xa8,
+ 0x1e, 0xfb, 0xd, 0xf7, 0xdc, 0x15, 0x7c, 0xb0,
+ 0x79, 0xbc, 0xb8, 0x1a, 0xb6, 0xb1, 0xb0, 0xba,
+ 0xaf, 0xb6, 0x6a, 0x52, 0x51, 0x3c, 0x6a, 0x57,
+ 0x6d, 0x1e, 0xe8, 0xfb, 0xc4, 0x15, 0x13, 0xbf,
+ 0x82, 0x83, 0x4e, 0x53, 0x48, 0x1b, 0x44, 0x52,
+ 0xc9, 0xda, 0xe4, 0xd2, 0xb1, 0xb4, 0xaa, 0x1f,
+ 0xba, 0x3b, 0xa2, 0x5b, 0xde, 0x24, 0x8, 0xe,
+ 0x50, 0xa, 0xc0, 0xdd, 0x3, 0xf7, 0xb6, 0xfb,
+ 0x53, 0x15, 0x95, 0x9c, 0x5, 0xfb, 0xe, 0xe6,
+ 0x60, 0xf7, 0x35, 0xf7, 0x3a, 0x1a, 0xf7, 0x40,
+ 0xad, 0xf7, 0x2f, 0xf7, 0x17, 0xe0, 0x1e, 0x81,
+ 0x9c, 0x5, 0xfb, 0x0, 0x72, 0xfb, 0x15, 0xfb,
+ 0x2a, 0xfb, 0x95, 0x1a, 0xfb, 0x7a, 0xf7, 0x22,
+ 0xfb, 0x48, 0xea, 0x75, 0x1e, 0xe, 0x50, 0xa,
+ 0xf7, 0x58, 0xdd, 0x3, 0xb4, 0xfb, 0x53, 0x15,
+ 0xea, 0xa1, 0xf7, 0x22, 0xf7, 0x48, 0xf7, 0x7a,
+ 0x1a, 0xf7, 0x95, 0xfb, 0x15, 0xf7, 0x2a, 0xfb,
+ 0x0, 0xa4, 0x1e, 0x81, 0x7a, 0x5, 0xf7, 0x17,
+ 0x36, 0xad, 0xfb, 0x2f, 0xfb, 0x40, 0x1a, 0xfb,
+ 0x3a, 0x60, 0xfb, 0x35, 0xfb, 0xe, 0x30, 0x1e,
+ 0xe, 0xf7, 0xbe, 0x8b, 0x1, 0xf7, 0x8b, 0xc2,
+ 0x3, 0x95, 0xf7, 0x87, 0x15, 0xf7, 0x81, 0xfb,
+ 0x87, 0xc2, 0xf7, 0x87, 0xf7, 0x81, 0xc2, 0xfb,
+ 0x81, 0xf7, 0x7f, 0x54, 0xfb, 0x7f, 0xfb, 0x81,
+ 0x6, 0xe, 0xfc, 0x45, 0xfb, 0x17, 0x76, 0xf7,
+ 0x24, 0xf7, 0x4, 0x22, 0xf4, 0x12, 0xc3, 0xf7,
+ 0x1e, 0x13, 0xd0, 0xc3, 0xb8, 0x15, 0x6b, 0x9e,
+ 0x76, 0xaf, 0x1e, 0x13, 0xb0, 0x97, 0x99, 0x93,
+ 0x8a, 0x93, 0x1f, 0x8f, 0x8a, 0x8d, 0x89, 0x84,
+ 0x1a, 0x54, 0x51, 0x62, 0x73, 0x79, 0x1e, 0x86,
+ 0x87, 0x83, 0x86, 0x84, 0x1a, 0x84, 0x90, 0x87,
+ 0x92, 0x8f, 0x92, 0x8c, 0x90, 0x92, 0x1e, 0x9c,
+ 0x95, 0xac, 0xa4, 0x9f, 0xa4, 0x8, 0xaf, 0xb9,
+ 0x8d, 0xb4, 0xa7, 0x1a, 0xba, 0x65, 0xa7, 0x67,
+ 0x5f, 0x77, 0x6c, 0x6f, 0x1e, 0xe, 0xfc, 0x45,
+ 0x7a, 0xf7, 0x4, 0x1, 0xd0, 0xf7, 0x4, 0x3,
+ 0xd0, 0xb2, 0x15, 0x22, 0xa, 0xfc, 0x29, 0x8e,
+ 0x76, 0xf9, 0x2c, 0x77, 0x1, 0x79, 0x4, 0xb7,
+ 0x6, 0xf7, 0x66, 0xf9, 0x2c, 0x5, 0x5f, 0x6,
+ 0xe, 0xfb, 0x4b, 0x7a, 0xab, 0xf9, 0x14, 0xa9,
+ 0x1, 0xa2, 0xee, 0xf7, 0x93, 0xe9, 0x3, 0xf7,
+ 0xe, 0xf7, 0xe3, 0x15, 0xd4, 0x8b, 0xf7, 0x8b,
+ 0xf7, 0x14, 0xf7, 0x14, 0x8a, 0xfb, 0x8b, 0x42,
+ 0x38, 0x8c, 0xfb, 0x81, 0xfb, 0x14, 0xfb, 0x14,
+ 0x8b, 0xf7, 0x7f, 0xe0, 0x1e, 0x28, 0x16, 0xfb,
+ 0x11, 0xb6, 0xfb, 0x77, 0xf7, 0x4c, 0xf7, 0x4c,
+ 0xb0, 0xf7, 0x77, 0xf7, 0x11, 0xf7, 0xf, 0x66,
+ 0xf7, 0x77, 0xfb, 0x4c, 0xfb, 0x4c, 0x60, 0xfb,
+ 0x77, 0xfb, 0xf, 0x1e, 0xe, 0xfb, 0x4b, 0x3b,
+ 0xa, 0xf7, 0x69, 0xdf, 0x3, 0xf7, 0x9, 0x16,
+ 0xf7, 0xa5, 0x9d, 0x6, 0x7e, 0x3b, 0x96, 0xd2,
+ 0x1f, 0xf8, 0xd1, 0x79, 0x7, 0xfb, 0x36, 0x32,
+ 0x5, 0x79, 0x7, 0xc4, 0xa0, 0x5, 0xa7, 0x95,
+ 0x96, 0x7e, 0x77, 0x1a, 0xfc, 0x64, 0x7, 0x44,
+ 0x38, 0x80, 0x7e, 0x1e, 0xe, 0xfb, 0x4b, 0x8b,
+ 0xd7, 0xf8, 0x1c, 0x9d, 0xf7, 0xc, 0xdb, 0x1,
+ 0xf7, 0xe0, 0xe5, 0x3, 0xa4, 0x16, 0xf8, 0x1d,
+ 0x6, 0xc4, 0xf7, 0x1d, 0x7e, 0x90, 0x5, 0x4c,
+ 0x64, 0x6e, 0x88, 0x64, 0x1b, 0xfb, 0x77, 0x6,
+ 0xf7, 0x58, 0xf7, 0x5c, 0xed, 0xf7, 0x6, 0xf5,
+ 0x1a, 0xf7, 0xd, 0x41, 0xd0, 0x22, 0x33, 0x2d,
+ 0x5a, 0xfb, 0x2b, 0x6d, 0x1e, 0xa0, 0x86, 0x5,
+ 0xc1, 0xa1, 0xa9, 0xd2, 0xe6, 0x1b, 0xf7, 0x7,
+ 0xa1, 0x30, 0x5c, 0x37, 0x5d, 0x34, 0x46, 0x40,
+ 0x1f, 0xfb, 0x54, 0xfb, 0x66, 0x5, 0xe, 0xfb,
+ 0x4b, 0x7a, 0xb2, 0xf8, 0xef, 0xc7, 0x12, 0xf7,
+ 0xcf, 0xdd, 0x65, 0xd7, 0x13, 0xd0, 0xf7, 0x25,
+ 0xf7, 0xe8, 0x15, 0xf1, 0x8c, 0xf7, 0x4, 0x5c,
+ 0xfb, 0x1, 0x1a, 0x37, 0x62, 0x3c, 0x2e, 0x6e,
+ 0x74, 0x97, 0x9c, 0x76, 0x1e, 0x9c, 0x76, 0x77,
+ 0x98, 0x74, 0x1b, 0x68, 0x7d, 0x7e, 0x6e, 0x58,
+ 0xf7, 0x10, 0x86, 0x9e, 0xf7, 0x20, 0xf7, 0x5,
+ 0xe5, 0xf7, 0x27, 0xf7, 0x16, 0x36, 0xb5, 0x5d,
+ 0x9b, 0x1f, 0x13, 0xe0, 0xcd, 0xb8, 0xa6, 0xb6,
+ 0xc1, 0x1a, 0xb4, 0x70, 0xe9, 0xfb, 0x15, 0x48,
+ 0x2c, 0x6b, 0xfb, 0x17, 0x63, 0x1e, 0x9a, 0x87,
+ 0x5, 0xa7, 0x9a, 0xbb, 0xda, 0xe6, 0x1b, 0xd5,
+ 0xac, 0x56, 0x58, 0x2f, 0x40, 0x5b, 0x2c, 0x71,
+ 0x1f, 0x86, 0x8b, 0x86, 0x86, 0x1a, 0xe, 0xfb,
+ 0x4b, 0xa0, 0x76, 0xf7, 0x33, 0xd1, 0xf8, 0x5c,
+ 0x77, 0x1, 0x9b, 0xb8, 0xf7, 0x81, 0xdf, 0x3,
+ 0x9b, 0xf7, 0x33, 0x15, 0xf7, 0xae, 0xfb, 0x33,
+ 0xdf, 0xf7, 0x33, 0xe2, 0xd1, 0x34, 0xf8, 0x5c,
+ 0x59, 0x6, 0xfb, 0xd0, 0xfc, 0x5b, 0x5, 0xb8,
+ 0x8a, 0x15, 0xf7, 0x81, 0xf7, 0xe4, 0x5, 0xfb,
+ 0xe4, 0x7, 0xe, 0xfb, 0x4b, 0x7a, 0xb3, 0xf8,
+ 0x1c, 0xe0, 0xe9, 0xda, 0x1, 0xf7, 0xf7, 0xd2,
+ 0x3, 0xc7, 0xf8, 0x33, 0x15, 0xf7, 0x7, 0x86,
+ 0xf7, 0x48, 0x59, 0xfb, 0x34, 0x1a, 0xfb, 0xe,
+ 0x42, 0x54, 0x4a, 0x70, 0x78, 0x9d, 0x9d, 0x77,
+ 0x1e, 0x9d, 0x78, 0x77, 0x9d, 0x6d, 0x1b, 0x6c,
+ 0x75, 0x7a, 0x6b, 0x57, 0xe5, 0x80, 0xbd, 0xf7,
+ 0x32, 0xee, 0xf7, 0x1, 0xf7, 0x19, 0xf7, 0x2d,
+ 0x30, 0xf7, 0x4, 0xfb, 0x57, 0x95, 0x1f, 0xaf,
+ 0xe9, 0x5, 0xf7, 0x79, 0x6, 0xb1, 0xe1, 0x7c,
+ 0x90, 0x5, 0x81, 0x81, 0x6e, 0x89, 0x64, 0x1b,
+ 0xfb, 0x48, 0x6, 0xe, 0xfb, 0x4b, 0x7d, 0xa7,
+ 0xf8, 0x4, 0xb9, 0xf7, 0x95, 0x77, 0x1, 0xad,
+ 0xe8, 0xf7, 0x8f, 0xe5, 0x3, 0xf8, 0x51, 0xf9,
+ 0x41, 0x15, 0xfb, 0x85, 0x82, 0xfb, 0x3e, 0xfb,
+ 0x4a, 0xfb, 0x5f, 0x1a, 0xfb, 0x66, 0xf1, 0x2c,
+ 0xf7, 0xa, 0xf7, 0x46, 0xaf, 0xf7, 0x33, 0xd4,
+ 0xf7, 0x1a, 0x3d, 0xd7, 0x22, 0x54, 0x74, 0x7f,
+ 0x6c, 0x52, 0x1e, 0xa0, 0xf7, 0xc, 0xee, 0xf7,
+ 0x1b, 0xf7, 0x48, 0xa7, 0x8, 0xfb, 0xce, 0xfb,
+ 0xdc, 0x15, 0xad, 0xaf, 0xaf, 0x93, 0xb0, 0x1b,
+ 0xf2, 0xa9, 0x27, 0x24, 0xfb, 0x5, 0x5d, 0x57,
+ 0x4c, 0x40, 0x48, 0xd5, 0xf7, 0x3c, 0xad, 0x8c,
+ 0xa5, 0x93, 0xa3, 0x1f, 0xe, 0xfb, 0x4b, 0x92,
+ 0x76, 0xf8, 0xe9, 0xe5, 0x1, 0xf7, 0x43, 0x7b,
+ 0x15, 0xc7, 0x6, 0xf7, 0x69, 0xf9, 0x25, 0x5,
+ 0xab, 0xfb, 0xff, 0x7, 0x4e, 0xfb, 0x34, 0xa1,
+ 0x82, 0x5, 0xb3, 0xa3, 0xa6, 0xb2, 0xc3, 0x1b,
+ 0xf7, 0x6d, 0x6, 0xe, 0xfb, 0x4b, 0x79, 0xab,
+ 0xf9, 0xe, 0xb0, 0x12, 0xc1, 0xd9, 0x45, 0xd1,
+ 0xf7, 0x72, 0xcc, 0x55, 0xd6, 0x13, 0xe4, 0xf7,
+ 0x63, 0xf7, 0xcd, 0x15, 0xf7, 0x4, 0x38, 0xb9,
+ 0x6d, 0x41, 0x1a, 0x45, 0x5d, 0x61, 0x4c, 0x3a,
+ 0x60, 0xcc, 0xd8, 0xe6, 0xb3, 0xb2, 0xae, 0xa6,
+ 0x1e, 0x6f, 0xa6, 0x15, 0x34, 0x4a, 0x65, 0x61,
+ 0x34, 0x1a, 0x3d, 0xcf, 0x35, 0xf7, 0x10, 0xf7,
+ 0x3a, 0xa7, 0xf7, 0x8, 0xbf, 0xce, 0x7c, 0xc8,
+ 0xfb, 0x16, 0xe1, 0x1e, 0x13, 0xd8, 0xc1, 0xb1,
+ 0xd1, 0xbc, 0xe7, 0x1a, 0xd7, 0x4c, 0xcd, 0xfb,
+ 0x5, 0x35, 0x2c, 0x55, 0x26, 0x3a, 0xab, 0x69,
+ 0xe0, 0x40, 0x1e, 0xde, 0xbd, 0x15, 0x68, 0xa1,
+ 0x30, 0xc4, 0xd9, 0x1a, 0xbb, 0xab, 0xc0, 0xd6,
+ 0xd8, 0xad, 0x55, 0x54, 0x33, 0x56, 0x66, 0x64,
+ 0x73, 0x1e, 0xe, 0xfb, 0x4b, 0x8e, 0x76, 0xf7,
+ 0x8d, 0xb6, 0xf8, 0xe, 0xac, 0x1, 0xaa, 0xe6,
+ 0xf7, 0x84, 0xed, 0x3, 0xc2, 0x8d, 0x15, 0x90,
+ 0x77, 0x5, 0xf7, 0x8e, 0x98, 0xf7, 0x2a, 0xf7,
+ 0x48, 0xf7, 0x75, 0x1a, 0xf7, 0x3b, 0x2a, 0xf7,
+ 0xa, 0xfb, 0xf, 0xfb, 0x16, 0x3c, 0xfb, 0x5,
+ 0xfb, 0x19, 0x39, 0xb8, 0xfb, 0x12, 0xf7, 0x1a,
+ 0xbd, 0xc0, 0x9d, 0xb0, 0xb7, 0x1e, 0x87, 0x70,
+ 0x54, 0xfb, 0x6d, 0xfb, 0x87, 0x63, 0x8, 0xf7,
+ 0xc3, 0xf7, 0xd8, 0x15, 0x69, 0x6a, 0x61, 0x79,
+ 0x6a, 0x1b, 0x21, 0x75, 0xf7, 0x13, 0xd7, 0xdd,
+ 0xa2, 0xe8, 0xdf, 0xf7, 0x17, 0x8d, 0xfb, 0x4f,
+ 0x4a, 0x76, 0x89, 0x69, 0x89, 0x78, 0x1f, 0xe,
+ 0xfc, 0x29, 0x7a, 0xf7, 0x4, 0xf7, 0x91, 0xf7,
+ 0x4, 0x1, 0xdc, 0xf7, 0x4, 0x3, 0xdc, 0xb2,
+ 0x37, 0xa, 0xf8, 0x1, 0x4, 0x22, 0xa, 0xfc,
+ 0x29, 0xfb, 0x17, 0x76, 0xf7, 0x3b, 0x76, 0xa6,
+ 0x76, 0xf7, 0xf0, 0xf7, 0x4, 0x12, 0xde, 0xf7,
+ 0x1e, 0xfb, 0x15, 0xf7, 0x4, 0x13, 0xd8, 0xde,
+ 0xb5, 0x15, 0x72, 0x9b, 0x74, 0xb0, 0x90, 0x91,
+ 0x8c, 0x8d, 0x90, 0x1e, 0x13, 0xb8, 0x8d, 0x91,
+ 0x91, 0x8c, 0x8f, 0x1b, 0x91, 0x8f, 0x87, 0x80,
+ 0x6f, 0x7b, 0x71, 0x7b, 0x7a, 0x1f, 0x7c, 0x7c,
+ 0x7a, 0x7f, 0x7f, 0x83, 0x8, 0x7e, 0x82, 0x85,
+ 0x88, 0x80, 0x1a, 0x86, 0x8d, 0x88, 0x91, 0x8e,
+ 0x8f, 0x8b, 0x8c, 0x90, 0x1e, 0x95, 0x8d, 0xb7,
+ 0xab, 0xa5, 0xaa, 0x8, 0xa8, 0xae, 0x94, 0xb7,
+ 0xab, 0x1a, 0xb2, 0x6a, 0xaf, 0x5d, 0x6a, 0x71,
+ 0x75, 0x67, 0x1e, 0x13, 0xd4, 0x94, 0xf7, 0xfe,
+ 0x15, 0x22, 0xa, 0xa0, 0x76, 0xf8, 0x9e, 0x77,
+ 0x1, 0xa5, 0xf7, 0x7a, 0x15, 0xf8, 0x85, 0xfb,
+ 0x7a, 0x5, 0xc9, 0x7, 0xfc, 0x45, 0xf7, 0x5b,
+ 0x3e, 0xa, 0xf7, 0x21, 0xc2, 0xf7, 0x1f, 0xc2,
+ 0x1, 0x96, 0xf7, 0xe3, 0x15, 0x3a, 0xa, 0xfb,
+ 0x8d, 0x4, 0x3a, 0xa, 0xe, 0xa0, 0x76, 0xf8,
+ 0x9e, 0x77, 0x1, 0xf8, 0x9f, 0xf7, 0x7a, 0x15,
+ 0x51, 0xa, 0xf8, 0x44, 0xfb, 0x5b, 0xfc, 0x44,
+ 0xfb, 0x5b, 0x5, 0x4d, 0x7, 0xe, 0xfb, 0x83,
+ 0x7a, 0xf7, 0x4, 0xf8, 0xc3, 0xab, 0x1, 0xf7,
+ 0x42, 0xf7, 0x4, 0xa6, 0xeb, 0x3, 0xf7, 0x74,
+ 0xf7, 0x3b, 0x15, 0xa0, 0x6, 0x98, 0xe7, 0xb1,
+ 0xc3, 0xad, 0xb3, 0x8, 0x9f, 0xa3, 0xc6, 0xd6,
+ 0xd6, 0x1a, 0xbd, 0x77, 0xf6, 0xfb, 0x32, 0xfb,
+ 0x5, 0x5b, 0x32, 0x4a, 0x69, 0x9f, 0x68, 0xa8,
+ 0xa1, 0x9b, 0x97, 0xa5, 0x9e, 0x80, 0x99, 0x81,
+ 0x9a, 0x1e, 0x82, 0x98, 0x82, 0x99, 0x9e, 0x1a,
+ 0xb2, 0xb9, 0x9f, 0xbe, 0xc1, 0xb7, 0x56, 0x41,
+ 0x4b, 0x76, 0x56, 0x75, 0x51, 0x1e, 0x77, 0x53,
+ 0x77, 0x48, 0x85, 0x4d, 0x8, 0x59, 0xfb, 0x14,
+ 0x15, 0x22, 0xa, 0x4e, 0xa, 0xe1, 0xd8, 0x3,
+ 0xe1, 0xfb, 0x2f, 0x15, 0xf7, 0x69, 0xa4, 0x3c,
+ 0x6, 0x64, 0x79, 0xa3, 0xb0, 0x1f, 0xf9, 0x25,
+ 0x7, 0xb0, 0x9d, 0xa3, 0xb2, 0x1e, 0xda, 0xa4,
+ 0xfb, 0x69, 0x6, 0xe, 0x4e, 0xa, 0xf7, 0x3d,
+ 0xd8, 0x3, 0xac, 0xfb, 0x16, 0x15, 0x72, 0xf7,
+ 0x69, 0xf9, 0xd1, 0xfb, 0x69, 0x72, 0xda, 0x7,
+ 0xb2, 0x9d, 0x73, 0x66, 0x1f, 0xfd, 0x25, 0x7,
+ 0x66, 0x79, 0x73, 0x64, 0x1e, 0xe, 0xfb, 0x4b,
+ 0xfb, 0x90, 0xb9, 0x1, 0x89, 0xfb, 0x62, 0x15,
+ 0x5d, 0xf8, 0x8c, 0xb9, 0x7, 0xe, 0x4d, 0xa,
+ 0xf7, 0x4e, 0xd6, 0x3, 0xc5, 0xf7, 0x7c, 0x15,
+ 0xc4, 0x7f, 0xd2, 0x8b, 0x27, 0x1a, 0xfb, 0x53,
+ 0x7, 0x39, 0xac, 0x6d, 0xd8, 0x1e, 0xf0, 0xa4,
+ 0x5a, 0x6, 0x52, 0x6d, 0xaa, 0xc3, 0x1f, 0xf7,
+ 0x53, 0x7, 0xdb, 0x28, 0xb4, 0x5b, 0x8e, 0x1e,
+ 0xb8, 0x93, 0xf1, 0xaf, 0xdd, 0x1a, 0xf7, 0x53,
+ 0x7, 0xc5, 0xa9, 0xa8, 0xc4, 0x1e, 0xbc, 0xa4,
+ 0x26, 0x6, 0x3f, 0x69, 0x71, 0x35, 0x1f, 0xfb,
+ 0x53, 0x7, 0x27, 0x44, 0x8b, 0x52, 0x7f, 0x1e,
+ 0xe, 0xfc, 0x77, 0xfb, 0x30, 0x76, 0xf9, 0xe6,
+ 0x77, 0x1, 0xcc, 0xd1, 0x3, 0xcc, 0xfb, 0x45,
+ 0x15, 0xd1, 0xf9, 0xe6, 0x45, 0x6, 0xe, 0x4d,
+ 0xa, 0xf7, 0x6b, 0xd6, 0x3, 0xda, 0xfb, 0x32,
+ 0x15, 0x72, 0xf0, 0x7, 0xd8, 0xac, 0xa7, 0xdf,
+ 0x1f, 0xf7, 0x53, 0x7, 0xef, 0xd2, 0x8b, 0xc4,
+ 0x97, 0x1e, 0xa5, 0x7, 0x52, 0x97, 0x44, 0x8b,
+ 0xef, 0x1a, 0xf7, 0x53, 0x7, 0xdd, 0x6b, 0xa9,
+ 0x3d, 0x1e, 0x26, 0x72, 0xbc, 0x6, 0xbd, 0xb0,
+ 0x74, 0x4b, 0x1f, 0xfb, 0x53, 0x7, 0x39, 0xf3,
+ 0x65, 0xb6, 0x83, 0x1e, 0x5e, 0x89, 0x25, 0x63,
+ 0x3b, 0x1a, 0xfb, 0x53, 0x7, 0x4b, 0x66, 0x74,
+ 0x59, 0x1e, 0xe, 0xa9, 0xf7, 0x7d, 0xc2, 0x1,
+ 0xf8, 0xf1, 0xc2, 0x3, 0xae, 0xf7, 0xb4, 0x15,
+ 0xf9, 0x5, 0xfb, 0xb4, 0x54, 0xf7, 0x7d, 0xfc,
+ 0xce, 0x6, 0xe, 0xfb, 0xaf, 0xf8, 0x15, 0xb4,
+ 0xf7, 0x6e, 0xb4, 0x1, 0xbd, 0xb6, 0xf7, 0x6b,
+ 0xb5, 0x3, 0xbd, 0xf8, 0xab, 0x15, 0x38, 0xce,
+ 0x48, 0xde, 0xdd, 0xcf, 0xce, 0xde, 0xdd, 0x47,
+ 0xcf, 0x39, 0x38, 0x48, 0x49, 0x37, 0x1e, 0xb6,
+ 0x16, 0xc7, 0xb9, 0xbc, 0xc7, 0xc8, 0xbb, 0x5a,
+ 0x4f, 0x4e, 0x5b, 0x5b, 0x4f, 0x4e, 0x5d, 0xbb,
+ 0xc8, 0x1e, 0xe, 0x8b, 0xc2, 0xf7, 0xbe, 0xc2,
+ 0xf7, 0x81, 0x77, 0x1, 0xf7, 0x8b, 0xc2, 0x3,
+ 0x95, 0xf7, 0xf5, 0x15, 0xf7, 0x81, 0xfb, 0x82,
+ 0xc2, 0xf7, 0x82, 0xf7, 0x81, 0xc2, 0xfb, 0x81,
+ 0xf7, 0x81, 0x54, 0xfb, 0x81, 0xfb, 0x81, 0x6,
+ 0xfc, 0x2c, 0x4, 0xf8, 0xa5, 0xc2, 0xfc, 0xa5,
+ 0x6, 0xe, 0x20, 0xfb, 0x5e, 0x76, 0xf7, 0x61,
+ 0xbd, 0x59, 0xd2, 0xf8, 0x53, 0x77, 0x12, 0xc8,
+ 0xe1, 0xf7, 0x63, 0xe1, 0x13, 0xdc, 0xec, 0xaa,
+ 0x15, 0x6c, 0x9c, 0xbd, 0x79, 0xb4, 0x1b, 0xca,
+ 0xd3, 0xd2, 0xb1, 0x9a, 0x1f, 0x52, 0x8c, 0xb8,
+ 0x57, 0xcf, 0x1b, 0xd1, 0xa7, 0xc6, 0xc7, 0x1f,
+ 0x77, 0x6, 0x72, 0x81, 0x80, 0x5f, 0x67, 0x1b,
+ 0x69, 0x7b, 0xbd, 0xad, 0x1f, 0xf8, 0x14, 0x35,
+ 0xfb, 0xfe, 0x7, 0x13, 0xbc, 0x5d, 0x6f, 0x62,
+ 0x64, 0x5c, 0x1b, 0x4a, 0x71, 0xbf, 0xc9, 0x1f,
+ 0xf7, 0xe1, 0x35, 0xfc, 0x80, 0x7, 0x73, 0x88,
+ 0x78, 0x87, 0x7b, 0x1e, 0x83, 0x6b, 0x7e, 0x72,
+ 0x63, 0x1a, 0x66, 0x9e, 0x65, 0xa8, 0xa6, 0x9e,
+ 0xb2, 0xb0, 0xb0, 0x7e, 0xa1, 0x82, 0xaf, 0x1e,
+ 0x87, 0x9b, 0x88, 0x9f, 0x8a, 0xa3, 0x8, 0xe,
+ 0xa8, 0x76, 0xf8, 0x98, 0x77, 0x1, 0x9c, 0xb8,
+ 0x15, 0xaf, 0x66, 0xf7, 0x72, 0xf7, 0x72, 0xf7,
+ 0x72, 0xfb, 0x72, 0xaf, 0xb0, 0xfb, 0x70, 0xf7,
+ 0x71, 0xf7, 0x70, 0xf7, 0x71, 0x68, 0xb0, 0xfb,
+ 0x73, 0xfb, 0x72, 0xfb, 0x72, 0xf7, 0x72, 0x67,
+ 0x66, 0xf7, 0x70, 0xfb, 0x71, 0x5, 0xe, 0xd2,
+ 0xf7, 0x4, 0xc0, 0xc2, 0xc0, 0xf7, 0x4, 0x1,
+ 0xf7, 0x68, 0xf7, 0x4, 0x14, 0xe0, 0x95, 0xf7,
+ 0x80, 0x15, 0x3a, 0xa, 0xf7, 0x5e, 0xf7, 0x1,
+ 0x37, 0xa, 0xfb, 0xa5, 0x4, 0x22, 0xa, 0xfb,
+ 0x4b, 0xf8, 0xa, 0xac, 0xf7, 0x91, 0xa5, 0x1,
+ 0x8d, 0xdf, 0xf7, 0xdc, 0xdb, 0x3, 0xf0, 0xf8,
+ 0xa, 0x15, 0xf7, 0x9, 0x6, 0x6d, 0xfb, 0xab,
+ 0x85, 0x4f, 0x84, 0x53, 0x8, 0x6a, 0x87, 0x76,
+ 0xfb, 0x5, 0x53, 0x1b, 0x82, 0x80, 0x8d, 0x90,
+ 0x1f, 0x9a, 0x97, 0x8b, 0xb0, 0x1a, 0x9f, 0x78,
+ 0x9e, 0x78, 0x76, 0x72, 0x7d, 0x65, 0x5a, 0xb6,
+ 0x74, 0xb5, 0x1e, 0xe8, 0x8c, 0xb0, 0xe6, 0x9c,
+ 0xd7, 0xa7, 0xf7, 0x1c, 0x9c, 0xf7, 0x16, 0xa2,
+ 0xf7, 0x19, 0x8, 0xf7, 0xe, 0x6, 0x95, 0xac,
+ 0x5, 0xfb, 0x14, 0x6, 0xf7, 0x3d, 0xa0, 0x9c,
+ 0xdf, 0xbe, 0x1b, 0x9b, 0x94, 0x87, 0x83, 0x1f,
+ 0x84, 0x85, 0x7b, 0x81, 0x1a, 0x76, 0x9c, 0x73,
+ 0xa4, 0xa5, 0x97, 0x9e, 0xa8, 0xb3, 0x67, 0xa7,
+ 0x6b, 0xfb, 0x26, 0x65, 0xfb, 0x30, 0xfb, 0xf,
+ 0x7b, 0x1e, 0xfb, 0x4, 0x6, 0xe, 0xb2, 0xa0,
+ 0x76, 0xf7, 0x6e, 0xb5, 0xf8, 0x31, 0x77, 0x1,
+ 0x8f, 0xf7, 0x13, 0xf8, 0x4, 0xf7, 0x4d, 0x3,
+ 0x8f, 0x16, 0xf7, 0x54, 0x9d, 0x6, 0x7c, 0x59,
+ 0x90, 0xb5, 0x94, 0x8d, 0x95, 0x8f, 0x97, 0x1f,
+ 0xbb, 0xf7, 0xe, 0x5, 0xf7, 0x97, 0x6, 0xbc,
+ 0xfb, 0xe, 0x5, 0x8f, 0x7f, 0x8d, 0x81, 0x82,
+ 0x1a, 0x61, 0x59, 0x86, 0x7c, 0x1e, 0x79, 0xf7,
+ 0x8e, 0x9d, 0x7, 0x5d, 0x7d, 0xaf, 0xb1, 0x7a,
+ 0x1f, 0xfb, 0x8f, 0xf8, 0xd9, 0x5, 0x71, 0x6,
+ 0xfb, 0x8d, 0xfc, 0xd9, 0x5, 0x67, 0x7b, 0x79,
+ 0x65, 0x60, 0x1b, 0xf7, 0x5c, 0xf7, 0x86, 0x15,
+ 0xf7, 0x5, 0xf7, 0xa0, 0xf7, 0x5, 0xfb, 0xa0,
+ 0x5, 0xe, 0x7b, 0x8b, 0xb5, 0xf7, 0xb2, 0xb5,
+ 0xf7, 0x98, 0xb6, 0x12, 0xf7, 0xb, 0xf3, 0xf7,
+ 0x81, 0xf2, 0x36, 0xf7, 0x6, 0x13, 0xf4, 0xa8,
+ 0x16, 0xf7, 0xe7, 0x6, 0xf7, 0x10, 0xef, 0xd5,
+ 0xf7, 0x2, 0xd6, 0x5d, 0xd0, 0xfb, 0x2, 0xa3,
+ 0x1f, 0x8d, 0x7, 0x13, 0xf8, 0xe3, 0xa5, 0xb2,
+ 0xbb, 0xd3, 0x1a, 0xf7, 0x32, 0xfb, 0x32, 0x9a,
+ 0x28, 0x33, 0xa, 0xf7, 0xf4, 0x15, 0x13, 0x78,
+ 0xf7, 0x8f, 0x7, 0x99, 0xd2, 0x86, 0x97, 0xf7,
+ 0xc, 0xad, 0x42, 0x4e, 0xfb, 0xd, 0xfb, 0xa,
+ 0x86, 0x63, 0x1e, 0x3c, 0x61, 0x15, 0xde, 0x6,
+ 0x13, 0xf4, 0xf1, 0xd1, 0x68, 0xfb, 0x9, 0x3a,
+ 0x4f, 0x56, 0x4b, 0x1f, 0x33, 0x6, 0x61, 0x8a,
+ 0xab, 0xa3, 0x1f, 0xe, 0x3b, 0xa0, 0x76, 0xf9,
+ 0x8, 0xb8, 0x77, 0x9f, 0x12, 0xf7, 0x11, 0xf3,
+ 0xf7, 0xf7, 0xa4, 0x13, 0xd0, 0xa3, 0x16, 0xf7,
+ 0xbb, 0x9d, 0x6, 0x2a, 0xa, 0x13, 0x58, 0xf8,
+ 0xac, 0xf7, 0x54, 0x7, 0xea, 0xcc, 0x6a, 0x37,
+ 0x8e, 0x1f, 0xa4, 0x6, 0x7a, 0xf7, 0x36, 0x5,
+ 0xfc, 0xcc, 0x6, 0x13, 0xb0, 0x77, 0x7, 0x9f,
+ 0x8a, 0xdc, 0x86, 0x23, 0x1a, 0xfc, 0x57, 0x7,
+ 0x54, 0x5d, 0x78, 0x54, 0x1e, 0xe, 0x43, 0x8b,
+ 0xb9, 0xf7, 0xb3, 0xb5, 0xf7, 0x8e, 0xbb, 0x79,
+ 0x9d, 0x12, 0xf7, 0xe, 0xf3, 0xf7, 0x96, 0xa2,
+ 0xa8, 0xa6, 0x13, 0xee, 0xab, 0x16, 0xf8, 0xa9,
+ 0x6, 0xb9, 0xf7, 0x3e, 0x5, 0x6c, 0x6, 0x58,
+ 0x73, 0x72, 0x42, 0x21, 0x1b, 0xfb, 0x33, 0x6,
+ 0x76, 0x78, 0x99, 0xae, 0x1f, 0xf7, 0x82, 0xf7,
+ 0x30, 0x7, 0xdb, 0xa1, 0x69, 0x4f, 0x1f, 0xa2,
+ 0xf7, 0x7a, 0x74, 0x6, 0x4f, 0x75, 0x69, 0x3b,
+ 0x1e, 0xfb, 0x30, 0xf7, 0x8e, 0xf7, 0x6b, 0x6,
+ 0xe1, 0x87, 0x55, 0x5d, 0x98, 0x1f, 0xa6, 0xf7,
+ 0x28, 0xfc, 0xa7, 0x6, 0x13, 0xdc, 0x79, 0x7,
+ 0x25, 0xa, 0xe, 0x43, 0x8b, 0xb5, 0xf8, 0xe1,
+ 0xb5, 0x1, 0xb7, 0xf8, 0xe4, 0x3, 0xb7, 0x16,
+ 0xf8, 0xcb, 0x6, 0xa4, 0xf7, 0x49, 0x5, 0x6e,
+ 0x6, 0x5c, 0x7d, 0x78, 0x2f, 0xfb, 0x1f, 0x1b,
+ 0xfb, 0x87, 0x6, 0xf8, 0x31, 0xf8, 0xf0, 0x5,
+ 0xa6, 0xfc, 0x9e, 0x7, 0x7c, 0xfb, 0x43, 0x5,
+ 0xa4, 0x6, 0xd1, 0x9f, 0x9a, 0xca, 0xf7, 0x12,
+ 0x1b, 0xf7, 0x6f, 0x6, 0xfc, 0x41, 0xfc, 0xf8,
+ 0x5, 0xe, 0xb2, 0xa0, 0x76, 0xf7, 0xd7, 0xb5,
+ 0xf7, 0xc8, 0x77, 0x1, 0xf7, 0x15, 0xf3, 0xf7,
+ 0xc2, 0xf3, 0x3, 0xb2, 0x24, 0xa, 0xf7, 0x7b,
+ 0xf7, 0xc2, 0xfb, 0x7b, 0x27, 0xa, 0x79, 0xf7,
+ 0xb0, 0x9d, 0x7, 0x2a, 0xa, 0xf8, 0x7d, 0x7,
+ 0x3c, 0xa, 0xfb, 0x6c, 0xfb, 0xc2, 0xf7, 0x6c,
+ 0x26, 0xa, 0xc5, 0x7a, 0xb2, 0xf7, 0xae, 0xce,
+ 0xf7, 0xa5, 0xb2, 0x1, 0xb4, 0xf7, 0x6, 0xf8,
+ 0x50, 0xf7, 0x8, 0x3, 0xb4, 0xf7, 0xe6, 0x15,
+ 0xfb, 0x42, 0xf7, 0x14, 0xfb, 0x49, 0xf7, 0x63,
+ 0xf7, 0x63, 0xf7, 0x18, 0xf7, 0x49, 0xf7, 0x42,
+ 0xf7, 0x3e, 0xfb, 0x1b, 0xf7, 0x43, 0xfb, 0x60,
+ 0xfb, 0x60, 0xfb, 0x17, 0xfb, 0x43, 0xfb, 0x3e,
+ 0x1e, 0xf7, 0x6, 0x16, 0xf7, 0x22, 0xbc, 0xf7,
+ 0x38, 0xf7, 0x40, 0xf7, 0x41, 0xbd, 0xfb, 0x38,
+ 0xfb, 0x22, 0xfb, 0x1a, 0x50, 0xfb, 0x4a, 0xfb,
+ 0x38, 0xfb, 0x3d, 0x57, 0xf7, 0x4a, 0xf7, 0x1a,
+ 0x1e, 0xd9, 0x35, 0x15, 0x9a, 0x8a, 0x5, 0xad,
+ 0x96, 0x9e, 0x9e, 0xb0, 0x1b, 0xf7, 0x12, 0x6,
+ 0xb0, 0x9e, 0x78, 0x69, 0x96, 0x1f, 0x9a, 0x8c,
+ 0x5, 0x87, 0xac, 0x89, 0xa7, 0xa4, 0x1a, 0xa4,
+ 0x8d, 0xa7, 0x8f, 0xab, 0x1e, 0x7c, 0x8c, 0x5,
+ 0x6a, 0x80, 0x78, 0x77, 0x66, 0x1b, 0xfb, 0x12,
+ 0x6, 0x66, 0x78, 0x9f, 0xac, 0x80, 0x1f, 0x7c,
+ 0x8a, 0x5, 0x8f, 0x6b, 0x8d, 0x6f, 0x72, 0x1a,
+ 0x72, 0x89, 0x6f, 0x87, 0x6a, 0x1e, 0xe, 0xfb,
+ 0xf2, 0x3b, 0xa, 0xf7, 0xe, 0xf3, 0x3, 0xab,
+ 0x24, 0xa, 0xf8, 0x7d, 0x26, 0xa, 0xb2, 0x3b,
+ 0xa, 0xf7, 0x11, 0xf3, 0xf7, 0x9a, 0xf7, 0x42,
+ 0x3, 0xae, 0x24, 0xa, 0xf7, 0x61, 0x7, 0xac,
+ 0xa9, 0xf7, 0x66, 0xfb, 0x81, 0x5, 0x9a, 0x79,
+ 0x93, 0x7d, 0x80, 0x1a, 0x77, 0x72, 0x82, 0x57,
+ 0x1e, 0x79, 0xf7, 0xc4, 0x9d, 0x7, 0x6a, 0x91,
+ 0x73, 0x88, 0x43, 0xdc, 0xfb, 0x95, 0xf7, 0xb6,
+ 0x18, 0xd5, 0xd0, 0xbd, 0xbb, 0xcd, 0xd0, 0x8,
+ 0xc5, 0xc6, 0xae, 0x9e, 0xb8, 0x1b, 0x9d, 0xfb,
+ 0x98, 0x79, 0x7, 0xbd, 0xaf, 0x81, 0x74, 0x80,
+ 0x84, 0x7c, 0x79, 0x79, 0x1f, 0x3f, 0x3d, 0x3d,
+ 0x43, 0x38, 0x47, 0x8, 0xf7, 0x71, 0x26, 0xa,
+ 0x8e, 0x8b, 0x9d, 0xf9, 0x28, 0x77, 0x1, 0x91,
+ 0xf7, 0x28, 0xf7, 0xdd, 0xf7, 0x59, 0x3, 0x91,
+ 0x16, 0xf7, 0x6b, 0x9d, 0x6, 0x6d, 0x66, 0x91,
+ 0xb4, 0x97, 0x8e, 0x9a, 0x92, 0x9e, 0x1f, 0xf7,
+ 0x26, 0xf8, 0x15, 0xf7, 0x36, 0xfc, 0x17, 0x5,
+ 0x91, 0x7c, 0x90, 0x75, 0x81, 0x1a, 0x5f, 0x51,
+ 0x8b, 0x7a, 0x1e, 0x79, 0xf7, 0xa4, 0x9d, 0x7,
+ 0x80, 0x53, 0xa1, 0xd0, 0x6d, 0x1f, 0xfb, 0x87,
+ 0xf8, 0xcd, 0x5, 0x83, 0x6, 0xfb, 0x6c, 0xfc,
+ 0xcb, 0x5, 0x52, 0x74, 0x46, 0x67, 0x79, 0x1b,
+ 0xe, 0xf7, 0x62, 0x3b, 0xa, 0xf7, 0xd, 0xbc,
+ 0xf8, 0x9f, 0xf3, 0x3, 0xa7, 0x16, 0xf7, 0x7c,
+ 0x9d, 0x6, 0x58, 0x64, 0xa6, 0xba, 0x1f, 0xf8,
+ 0x57, 0x7, 0xf7, 0x98, 0xfc, 0xb3, 0x5, 0x9d,
+ 0x6, 0xf7, 0x89, 0xf8, 0xd0, 0x5, 0xfc, 0x74,
+ 0x27, 0xa, 0x79, 0xf7, 0xb0, 0x9d, 0x7, 0x54,
+ 0x68, 0x94, 0xcc, 0x1f, 0xf8, 0x76, 0x7, 0xd2,
+ 0xc8, 0x95, 0xa8, 0x1e, 0x9d, 0xfb, 0x5c, 0x7,
+ 0xfb, 0x74, 0xfc, 0x92, 0xfb, 0x7e, 0xf8, 0x92,
+ 0x5, 0xfb, 0x5d, 0x79, 0x6, 0xda, 0x85, 0x99,
+ 0x65, 0x49, 0x1a, 0xfc, 0x59, 0x7, 0x5c, 0x61,
+ 0x70, 0x58, 0x1e, 0xe, 0xb2, 0x98, 0x76, 0xf9,
+ 0x3d, 0x77, 0x1, 0xf7, 0xb, 0xbc, 0xf8, 0x31,
+ 0xbc, 0x3, 0xa8, 0x83, 0x15, 0xf7, 0x79, 0x9d,
+ 0x6, 0x58, 0x64, 0xa6, 0xba, 0x1f, 0xf8, 0x5b,
+ 0x7, 0xf8, 0x4c, 0xfc, 0xb7, 0x5, 0xa1, 0xf8,
+ 0xe1, 0x6, 0x31, 0xa, 0xfb, 0x79, 0x45, 0xa,
+ 0xfc, 0x20, 0x7, 0xfc, 0x13, 0xf8, 0x7c, 0x5,
+ 0xfb, 0x3d, 0x79, 0x6, 0xbe, 0x94, 0x79, 0x69,
+ 0xa9, 0x1f, 0xfc, 0x9b, 0x7, 0x5c, 0x64, 0x70,
+ 0x58, 0x1e, 0xe, 0x65, 0x8b, 0xe8, 0xf7, 0x69,
+ 0xea, 0xf7, 0x4a, 0xe5, 0x1, 0xaf, 0x9d, 0xe8,
+ 0x9d, 0xf7, 0xc9, 0x9d, 0xe4, 0x9d, 0x3, 0xc7,
+ 0xf8, 0x9e, 0x15, 0x9b, 0x6, 0x9d, 0x8e, 0x8d,
+ 0xb6, 0xcd, 0x1b, 0xf7, 0xec, 0x6, 0xcd, 0x8e,
+ 0x60, 0x79, 0x8e, 0x1f, 0x9b, 0xf7, 0x2b, 0xfc,
+ 0x9b, 0x6, 0xe2, 0xfc, 0x3b, 0x15, 0x9d, 0x6,
+ 0xbb, 0x8e, 0xa3, 0x93, 0xae, 0x1b, 0xf7, 0x4d,
+ 0x6, 0xae, 0xa3, 0x83, 0x5b, 0x8e, 0x1f, 0x9d,
+ 0xf7, 0x63, 0x79, 0x6, 0x5b, 0x88, 0x73, 0x83,
+ 0x68, 0x1b, 0xfb, 0x4d, 0x6, 0x68, 0x73, 0x93,
+ 0xbb, 0x88, 0x1f, 0x79, 0x6, 0xfb, 0x3, 0xfc,
+ 0x5d, 0x15, 0xf8, 0xc7, 0xf7, 0x56, 0x79, 0x6,
+ 0x47, 0x82, 0x7b, 0x6a, 0x43, 0x1b, 0xfb, 0xdd,
+ 0x6, 0x43, 0x77, 0xac, 0xcf, 0x82, 0x1f, 0x79,
+ 0x6, 0xe, 0xb2, 0x7a, 0xb2, 0xf9, 0x4, 0xb2,
+ 0x1, 0xb4, 0xf7, 0x8, 0xf8, 0x4f, 0xf7, 0x7,
+ 0x3, 0xb4, 0xf7, 0xe4, 0x15, 0xfb, 0x42, 0xf7,
+ 0x16, 0xfb, 0x47, 0xf7, 0x63, 0xf7, 0x63, 0xf7,
+ 0x16, 0xf7, 0x47, 0xf7, 0x42, 0xf7, 0x3e, 0xfb,
+ 0x19, 0xf7, 0x47, 0xfb, 0x60, 0xfb, 0x60, 0xfb,
+ 0x19, 0xfb, 0x47, 0xfb, 0x3e, 0x1e, 0xf7, 0x8,
+ 0x16, 0xf7, 0x1b, 0xc6, 0xf7, 0x43, 0xf7, 0x36,
+ 0xf7, 0x3b, 0xc2, 0xfb, 0x3f, 0xfb, 0x20, 0xfb,
+ 0x1b, 0x53, 0xfb, 0x46, 0xfb, 0x3a, 0xfb, 0x3c,
+ 0x56, 0xf7, 0x48, 0xf7, 0x1a, 0x1e, 0xe, 0xe0,
+ 0xa0, 0x76, 0xf9, 0xc, 0xb4, 0x79, 0x9d, 0x12,
+ 0xf7, 0x7, 0xf2, 0xf7, 0xe1, 0xf2, 0x13, 0xd8,
+ 0xa4, 0x24, 0xa, 0x8a, 0xf8, 0xb0, 0x5, 0xf7,
+ 0xe1, 0xfc, 0xb0, 0x6, 0x28, 0xa, 0x79, 0xf7,
+ 0xb0, 0x9d, 0x7, 0x2a, 0xa, 0x8a, 0xf8, 0x6f,
+ 0x5, 0x13, 0xb8, 0xd4, 0xcc, 0x9a, 0xa5, 0x1e,
+ 0x9d, 0xfd, 0x64, 0x79, 0x7, 0xa5, 0xcb, 0x7c,
+ 0x42, 0x1f, 0xfc, 0x6f, 0x39, 0xa, 0xfb, 0x13,
+ 0xa0, 0x76, 0xf7, 0xc0, 0xb4, 0xf7, 0xb8, 0xb3,
+ 0x79, 0x9d, 0x12, 0xf7, 0xa, 0xf3, 0xf7, 0x6a,
+ 0xf6, 0x13, 0xdc, 0xa7, 0x24, 0xa, 0xf7, 0x64,
+ 0x7, 0xf7, 0xbe, 0x8a, 0xa2, 0xd5, 0xf7, 0xf,
+ 0x1a, 0xf7, 0x5, 0x6a, 0xcb, 0xfb, 0x61, 0x33,
+ 0xa, 0xf7, 0xe3, 0x15, 0xf7, 0x94, 0x7, 0x13,
+ 0xec, 0x9e, 0x9d, 0x90, 0x9c, 0x1e, 0xf7, 0x9,
+ 0x8c, 0xc9, 0x77, 0xfb, 0xa, 0x1a, 0xfb, 0x12,
+ 0x6b, 0x6e, 0xfb, 0x2d, 0x7f, 0x81, 0x92, 0x90,
+ 0x84, 0x1e, 0xe, 0x30, 0x8b, 0xe9, 0xf8, 0xa9,
+ 0xb9, 0x1, 0x90, 0x16, 0xf8, 0xb7, 0x6, 0xb0,
+ 0xf7, 0x61, 0x5, 0x77, 0x6, 0x2a, 0x6d, 0x5c,
+ 0x7d, 0x4b, 0x1b, 0xfb, 0xaf, 0x6, 0xf7, 0x80,
+ 0xf7, 0xa7, 0xfb, 0x5d, 0xf7, 0x96, 0x5, 0xf7,
+ 0x66, 0x6, 0xee, 0xa6, 0x48, 0x65, 0x95, 0x1f,
+ 0x9e, 0x6, 0x81, 0xf7, 0x2b, 0x5, 0xfc, 0x9a,
+ 0x6, 0xf7, 0xa1, 0xfb, 0xee, 0x5, 0xe, 0x43,
+ 0xa0, 0x76, 0xf9, 0xe, 0xb2, 0x1, 0xae, 0xa3,
+ 0xf7, 0x65, 0xf3, 0xf7, 0x65, 0xa2, 0x3, 0xf7,
+ 0x46, 0x24, 0xa, 0xf8, 0xb2, 0x7, 0xf7, 0xc,
+ 0x8c, 0xe5, 0x6f, 0x8a, 0x20, 0xa5, 0x8d, 0x18,
+ 0x86, 0xf7, 0x3f, 0x5, 0xfc, 0xc8, 0x6, 0x86,
+ 0xfb, 0x3f, 0xa5, 0x89, 0x8c, 0xf6, 0xdb, 0xa7,
+ 0xf7, 0x14, 0x8a, 0x19, 0xfc, 0xb2, 0x39, 0xa,
+ 0x92, 0x3b, 0xa, 0xf7, 0xba, 0xf3, 0x3, 0xf7,
+ 0x60, 0x24, 0xa, 0xf7, 0x60, 0x7, 0xf7, 0x4d,
+ 0xf7, 0xbe, 0x5, 0xca, 0xb2, 0xb0, 0x89, 0xae,
+ 0x1b, 0x9d, 0xfb, 0x7c, 0x79, 0x7, 0xbf, 0x9b,
+ 0x7f, 0x7c, 0x81, 0x84, 0x7e, 0x84, 0x80, 0x1f,
+ 0xfb, 0x20, 0xfb, 0x7b, 0xfb, 0x30, 0xf7, 0x83,
+ 0x5, 0x85, 0x95, 0x88, 0x94, 0x92, 0x1a, 0x9d,
+ 0xa5, 0x94, 0xbf, 0x1e, 0x9d, 0xfb, 0xbd, 0x79,
+ 0x7, 0xc0, 0xac, 0x64, 0x7b, 0x97, 0x1f, 0xf7,
+ 0x60, 0xfb, 0xc0, 0x5, 0xfb, 0x64, 0x39, 0xa,
+ 0xdb, 0x8b, 0x9d, 0xe2, 0xae, 0xf8, 0x21, 0xaa,
+ 0xe2, 0x9d, 0x1, 0xa5, 0xf7, 0xd, 0xf7, 0x4f,
+ 0xf1, 0xf7, 0x4f, 0xf7, 0xa, 0x3, 0xf7, 0x7c,
+ 0x16, 0xf7, 0xc6, 0x9d, 0x6, 0x32, 0x7e, 0xb4,
+ 0xb9, 0x1f, 0xf7, 0x21, 0x8a, 0xf7, 0x38, 0xd5,
+ 0xf7, 0x2d, 0x1a, 0xf7, 0x23, 0xfb, 0x2b, 0xe9,
+ 0xfb, 0x2e, 0x1e, 0xb9, 0x97, 0xb4, 0xe4, 0x1e,
+ 0x9d, 0xfb, 0xc4, 0x79, 0x7, 0xe4, 0x97, 0x62,
+ 0x5d, 0x1f, 0xfb, 0x37, 0xfb, 0x25, 0x2f, 0xfb,
+ 0x25, 0xfb, 0x2f, 0xf7, 0x35, 0x43, 0xf7, 0x27,
+ 0x8c, 0x1f, 0x5d, 0x7e, 0x62, 0x32, 0x1e, 0xf7,
+ 0x60, 0xf7, 0xe, 0x15, 0xf8, 0x21, 0x7, 0xf7,
+ 0x4, 0xd6, 0x31, 0xfb, 0x8, 0x3d, 0x5a, 0xfb,
+ 0x5, 0xfb, 0x1e, 0x1f, 0x25, 0x16, 0xfb, 0x1c,
+ 0x58, 0xf7, 0x4, 0xda, 0xf7, 0x1, 0xce, 0xeb,
+ 0xf7, 0xc, 0x8c, 0x1f, 0xe, 0xb2, 0xa0, 0x76,
+ 0xf9, 0x35, 0x77, 0x12, 0x82, 0xf7, 0x38, 0xfb,
+ 0x38, 0xf9, 0x5d, 0xfb, 0x46, 0xf7, 0x35, 0x13,
+ 0xe8, 0x82, 0x16, 0xf7, 0x7a, 0x9d, 0x6, 0x59,
+ 0x7b, 0x9f, 0xa0, 0x95, 0x90, 0x96, 0x92, 0x94,
+ 0x1f, 0xf7, 0x39, 0xf7, 0x5f, 0xf7, 0x21, 0xfb,
+ 0x67, 0x5, 0x91, 0x81, 0x8e, 0x82, 0x83, 0x1a,
+ 0x76, 0x72, 0x7c, 0x56, 0x1e, 0x79, 0x7, 0x13,
+ 0xd0, 0xf7, 0xc0, 0x9d, 0x6, 0x62, 0x5f, 0xb9,
+ 0x9b, 0x7f, 0x1f, 0xfb, 0x67, 0xf7, 0xbb, 0xf7,
+ 0x42, 0xf7, 0x65, 0x5, 0x13, 0xf0, 0xae, 0xa9,
+ 0xc7, 0xaf, 0xa6, 0x1b, 0x9d, 0xfb, 0x7c, 0x79,
+ 0x7, 0xc0, 0x9d, 0x7e, 0x7a, 0x7d, 0x83, 0x7c,
+ 0x82, 0x7f, 0x1f, 0xfb, 0x20, 0xfb, 0x3f, 0xfb,
+ 0xf, 0xf7, 0x47, 0x5, 0x84, 0x96, 0x89, 0x95,
+ 0x94, 0x1a, 0x9f, 0xa4, 0x98, 0xc0, 0x1e, 0x9d,
+ 0xfb, 0xc0, 0x79, 0x7, 0xb8, 0xb7, 0x5b, 0x7b,
+ 0x97, 0x1f, 0xf7, 0x51, 0xfb, 0x96, 0xfb, 0x5d,
+ 0xfb, 0x88, 0x5, 0x66, 0x6c, 0x51, 0x69, 0x73,
+ 0x1b, 0xe, 0xf7, 0x4, 0xa0, 0x76, 0xf7, 0xb6,
+ 0xb3, 0xf7, 0xd9, 0x9d, 0x96, 0x77, 0x12, 0xd2,
+ 0xf7, 0x7, 0xf7, 0x34, 0xf3, 0xf7, 0x34, 0xf7,
+ 0x7, 0x14, 0xe, 0x13, 0xde, 0xf7, 0x94, 0x24,
+ 0xa, 0xf7, 0x5a, 0x7, 0xf7, 0x1b, 0xf7, 0x20,
+ 0xad, 0xf7, 0x20, 0xf7, 0x5, 0x82, 0xe4, 0xcc,
+ 0x1f, 0x9d, 0x7, 0xfb, 0x19, 0x65, 0x3a, 0xfb,
+ 0x1b, 0xfb, 0x12, 0x29, 0x80, 0x4d, 0x8a, 0x1f,
+ 0xf7, 0x8f, 0x7, 0x13, 0xee, 0x3c, 0xa, 0xfb,
+ 0x8f, 0x7, 0x4d, 0x8c, 0x29, 0x96, 0xf7, 0x12,
+ 0x1a, 0x13, 0xde, 0xf7, 0x1e, 0x6c, 0xd9, 0xfb,
+ 0x20, 0x1e, 0x79, 0x7, 0xd2, 0x7c, 0x33, 0xfb,
+ 0x6, 0xfb, 0x21, 0xf7, 0x1f, 0x6a, 0xf7, 0x1c,
+ 0x1f, 0xfb, 0x5a, 0x39, 0xa, 0x57, 0x79, 0xad,
+ 0x69, 0xd1, 0xf8, 0x26, 0xb9, 0x12, 0xb4, 0xf5,
+ 0x13, 0x70, 0xf8, 0x4e, 0xf6, 0x15, 0x49, 0xae,
+ 0xa5, 0x50, 0xb7, 0x1b, 0xd4, 0x8d, 0xf7, 0x4,
+ 0xb6, 0x1f, 0x79, 0x6, 0x7d, 0x8c, 0x76, 0x44,
+ 0x6b, 0x1b, 0x69, 0x6b, 0xcb, 0xc1, 0x7d, 0x1f,
+ 0xf7, 0x7, 0xf7, 0xde, 0x5, 0x33, 0x6, 0x4b,
+ 0xfb, 0x53, 0x5, 0xdc, 0x7c, 0x55, 0xf7, 0x2,
+ 0xfb, 0x2, 0x1b, 0xfb, 0x22, 0x42, 0xfb, 0x0,
+ 0xfb, 0x13, 0xfb, 0x35, 0xaf, 0xfb, 0xe, 0xf7,
+ 0x3b, 0xea, 0xe1, 0xeb, 0xa8, 0x9c, 0x1f, 0x68,
+ 0xf7, 0x8, 0x15, 0x13, 0xb0, 0x20, 0x70, 0x40,
+ 0x27, 0x4f, 0x1b, 0x2b, 0x89, 0xf7, 0x42, 0xd4,
+ 0xf4, 0x92, 0xe1, 0xf3, 0xd1, 0xcc, 0xfb, 0x28,
+ 0x38, 0x99, 0x1f, 0xe, 0xfb, 0x5e, 0x76, 0xf7,
+ 0x61, 0xbb, 0xf8, 0x5, 0xc2, 0xf7, 0x91, 0xad,
+ 0x12, 0xd8, 0xd9, 0xf7, 0x61, 0xf2, 0x56, 0xf4,
+ 0x13, 0xfa, 0xf7, 0x32, 0xb0, 0x15, 0xbd, 0x65,
+ 0xc9, 0x79, 0xc6, 0x8c, 0x8, 0xe8, 0x8c, 0xe8,
+ 0xda, 0xf7, 0x1e, 0x1a, 0xf2, 0x55, 0xe1, 0x2f,
+ 0xb6, 0x1e, 0x13, 0xfc, 0xc8, 0xa2, 0xac, 0xc7,
+ 0xc8, 0x1a, 0xf7, 0x7, 0x34, 0xbd, 0xfb, 0x0,
+ 0x3c, 0xfb, 0x4, 0x51, 0x28, 0x1e, 0xfd, 0x23,
+ 0x7, 0x58, 0x80, 0x59, 0x86, 0x58, 0x1e, 0xe2,
+ 0x6, 0x8e, 0xa4, 0x90, 0xa4, 0xa4, 0x1a, 0x8a,
+ 0xf7, 0x85, 0x15, 0xf8, 0x8c, 0x7, 0xc7, 0xbc,
+ 0xbd, 0xc0, 0xd6, 0xa6, 0x4f, 0x49, 0x8c, 0x1e,
+ 0x5c, 0x8c, 0x7b, 0x3b, 0x65, 0x7a, 0x77, 0x91,
+ 0x74, 0x1b, 0x77, 0x78, 0x81, 0x74, 0x73, 0x9e,
+ 0x81, 0xa0, 0x1f, 0xa3, 0x9e, 0x91, 0x9f, 0x1b,
+ 0x13, 0xfa, 0xc0, 0xb9, 0xfb, 0x3a, 0x4b, 0x40,
+ 0x6a, 0x4b, 0x31, 0x59, 0x54, 0xa6, 0xaf, 0x70,
+ 0x1f, 0xe, 0xfb, 0xa4, 0xfb, 0x60, 0x76, 0xf9,
+ 0x1b, 0xd8, 0x1, 0x90, 0x9b, 0xf7, 0x32, 0xf7,
+ 0xb, 0x3, 0xf7, 0x83, 0xc7, 0x15, 0x78, 0x5a,
+ 0x62, 0x2b, 0x45, 0x1a, 0x63, 0x9e, 0x6d, 0xa7,
+ 0xbd, 0xa1, 0xca, 0xc1, 0xcf, 0x7c, 0xd4, 0x88,
+ 0xa4, 0x1e, 0xf7, 0x60, 0xf8, 0x4d, 0x5, 0x23,
+ 0x6, 0xfb, 0x5, 0xfb, 0xf9, 0x5, 0x89, 0x6,
+ 0xe8, 0x79, 0x6c, 0xf7, 0x9c, 0xfb, 0x0, 0x1b,
+ 0x4c, 0x65, 0x54, 0x3d, 0x8a, 0x1f, 0x74, 0x8b,
+ 0x77, 0x8a, 0x7b, 0x1e, 0x9b, 0x6, 0xb3, 0x8e,
+ 0x9a, 0xd6, 0xc0, 0x1b, 0xef, 0xad, 0xfb, 0x9f,
+ 0x2c, 0x98, 0x1f, 0xe, 0xfb, 0x51, 0x78, 0xba,
+ 0xf9, 0x34, 0xb3, 0x12, 0xb3, 0xee, 0x61, 0xbc,
+ 0xf7, 0x82, 0xec, 0x13, 0xe8, 0xf7, 0x93, 0xf8,
+ 0x53, 0x15, 0xfb, 0x2b, 0x68, 0x4b, 0x34, 0xfb,
+ 0x17, 0x1a, 0x25, 0xe7, 0xfb, 0x3, 0xf7, 0x18,
+ 0xf7, 0xb, 0xed, 0xf7, 0x0, 0xf7, 0x8, 0xf7,
+ 0xf, 0x54, 0xcf, 0x43, 0xc4, 0x1e, 0x13, 0xd8,
+ 0x21, 0xde, 0x25, 0xb9, 0xcf, 0x1a, 0xa7, 0xb1,
+ 0xa1, 0xad, 0xb2, 0xa4, 0x7b, 0x77, 0x9d, 0x1e,
+ 0x6b, 0xa9, 0x9a, 0x60, 0xb5, 0x1b, 0xa8, 0xa3,
+ 0x9c, 0xaa, 0xcf, 0xfb, 0xa, 0xae, 0x3d, 0x4b,
+ 0x38, 0x78, 0x40, 0x33, 0xf7, 0x2, 0x58, 0xbb,
+ 0x4f, 0x1f, 0xaa, 0x6e, 0x15, 0x97, 0x88, 0xe6,
+ 0x24, 0x86, 0xfb, 0x2, 0x8, 0x32, 0x87, 0x5f,
+ 0x36, 0x41, 0x1b, 0x66, 0x6d, 0xa4, 0xad, 0x77,
+ 0x1f, 0x13, 0xe8, 0x76, 0xae, 0x7c, 0xb7, 0xb1,
+ 0x1a, 0xef, 0xb0, 0xe0, 0xf7, 0x2, 0xa8, 0x1e,
+ 0xe, 0xfb, 0x88, 0x78, 0xb9, 0xf7, 0x58, 0xba,
+ 0x64, 0xbc, 0xf7, 0x4e, 0xaf, 0x12, 0xa1, 0xf3,
+ 0x30, 0xe6, 0x13, 0xb8, 0xf7, 0x19, 0xf7, 0x90,
+ 0x15, 0x65, 0x86, 0x42, 0x66, 0x30, 0x1a, 0x28,
+ 0xf7, 0x4, 0x64, 0xe6, 0xf7, 0x4, 0xe5, 0xa7,
+ 0xed, 0x1e, 0x71, 0x92, 0x5, 0x49, 0x77, 0x63,
+ 0x76, 0x4f, 0x1b, 0x4d, 0x8a, 0x2e, 0xa6, 0xdb,
+ 0x1a, 0xc5, 0xb0, 0xb3, 0xce, 0x1e, 0x13, 0xd8,
+ 0xa6, 0x97, 0x83, 0xb0, 0x1b, 0x9d, 0x9b, 0x94,
+ 0xa2, 0x1f, 0x13, 0xb8, 0x9d, 0x79, 0x92, 0x79,
+ 0x1e, 0x13, 0xd4, 0x67, 0x7c, 0x81, 0x6f, 0x1b,
+ 0x5a, 0x5a, 0xb1, 0xcf, 0xb2, 0xb3, 0xbe, 0xc0,
+ 0x1f, 0xaf, 0x8c, 0xab, 0x76, 0x92, 0x6e, 0x8,
+ 0x5c, 0x96, 0xa8, 0x86, 0x9e, 0x1b, 0xa4, 0x9c,
+ 0xa2, 0xa5, 0xc5, 0x30, 0xa9, 0x53, 0x37, 0xfb,
+ 0x16, 0x67, 0x20, 0x1f, 0x8c, 0x55, 0xb7, 0x69,
+ 0xc0, 0x78, 0x8, 0xe, 0xfb, 0x51, 0xfb, 0x75,
+ 0xef, 0xf7, 0x17, 0xed, 0xf9, 0x20, 0x77, 0x12,
+ 0xc7, 0xbb, 0x85, 0xc6, 0xf7, 0x9c, 0xb5, 0x13,
+ 0xf4, 0xf7, 0x59, 0xf8, 0xdc, 0x15, 0x3c, 0x33,
+ 0x51, 0xfb, 0x35, 0x2d, 0x1a, 0xfb, 0x54, 0xf7,
+ 0x0, 0x60, 0xf7, 0x44, 0xb8, 0xaf, 0x77, 0x62,
+ 0x70, 0x76, 0x43, 0x51, 0x98, 0x1e, 0x8e, 0x7c,
+ 0x68, 0x98, 0x72, 0x1b, 0x63, 0x7d, 0x6f, 0x77,
+ 0x63, 0xc0, 0x7f, 0xaa, 0xf1, 0xcb, 0xd9, 0xf7,
+ 0xd, 0xf7, 0x12, 0xfb, 0x13, 0x8f, 0xfb, 0x2,
+ 0xfb, 0x2, 0x7f, 0xec, 0xb7, 0xf7, 0x20, 0xce,
+ 0xf7, 0x2, 0xcc, 0xe2, 0x1f, 0xbe, 0x86, 0xf7,
+ 0x23, 0xbc, 0xc5, 0x1a, 0xab, 0x77, 0x9a, 0x73,
+ 0x4f, 0x27, 0x25, 0x7c, 0x7f, 0x1e, 0x13, 0xec,
+ 0x72, 0x8e, 0x6b, 0xa2, 0xae, 0x1a, 0xb2, 0xb5,
+ 0x9e, 0x96, 0x90, 0x1e, 0x89, 0x9d, 0x5, 0x67,
+ 0x41, 0x58, 0x5d, 0x72, 0xa1, 0x66, 0xd4, 0x7e,
+ 0x1f, 0xe, 0x3b, 0xfb, 0x49, 0x76, 0xf7, 0x73,
+ 0x76, 0xf8, 0x4f, 0xd2, 0x62, 0x76, 0x12, 0x8b,
+ 0x9d, 0xf2, 0xe0, 0xf7, 0x61, 0xe4, 0x13, 0xee,
+ 0xf7, 0xd, 0x16, 0xe0, 0xf7, 0xeb, 0x6, 0xb7,
+ 0x9e, 0xac, 0xc3, 0xbe, 0x1b, 0xc6, 0xb3, 0x74,
+ 0x41, 0x8e, 0x1f, 0x99, 0xfc, 0x5c, 0x8d, 0x56,
+ 0x92, 0x7c, 0x8f, 0x73, 0x19, 0xe4, 0x6, 0x82,
+ 0x9e, 0x84, 0xb7, 0x97, 0x1a, 0x80, 0xf8, 0x85,
+ 0x5, 0xda, 0x89, 0x5b, 0xcc, 0x39, 0x1b, 0x40,
+ 0x4f, 0x6f, 0x33, 0x6d, 0x1f, 0xbf, 0x8e, 0x6c,
+ 0xc3, 0x53, 0x1b, 0x36, 0x69, 0x39, 0x4b, 0x1f,
+ 0x9d, 0x6, 0x13, 0xde, 0xa9, 0x8c, 0xa0, 0xc9,
+ 0xae, 0x1b, 0xb3, 0x91, 0x52, 0x58, 0x1f, 0xe,
+ 0xfb, 0x36, 0x7a, 0xb1, 0xf7, 0xbb, 0xbf, 0xf7,
+ 0xb4, 0xad, 0x1, 0xb6, 0xf1, 0xf7, 0x86, 0xed,
+ 0x3, 0xf7, 0x9f, 0x7a, 0x15, 0xf7, 0x3f, 0xba,
+ 0xf7, 0x71, 0xf7, 0x1d, 0xf7, 0x24, 0x4f, 0xf7,
+ 0x61, 0xfb, 0x34, 0xfb, 0x35, 0x4e, 0xfb, 0x70,
+ 0xfb, 0x11, 0xfb, 0x18, 0xc5, 0xfb, 0x7a, 0xf7,
+ 0x3a, 0x1f, 0xfb, 0xe, 0xf8, 0x15, 0x15, 0xf7,
+ 0x1d, 0xae, 0xf7, 0x2b, 0xe1, 0xf0, 0x9e, 0xfb,
+ 0x49, 0x20, 0x8c, 0x1e, 0xfb, 0x85, 0x57, 0x15,
+ 0xf7, 0x84, 0x6, 0x32, 0x71, 0xfb, 0x62, 0x2e,
+ 0x2c, 0x71, 0xf7, 0x65, 0xe1, 0x1e, 0xe, 0xfb,
+ 0xf6, 0x7a, 0xbd, 0xf8, 0x6a, 0x77, 0x1, 0xe3,
+ 0xe0, 0x3, 0xf7, 0xd5, 0xf0, 0x15, 0x78, 0x6,
+ 0x6e, 0x89, 0x7e, 0x64, 0x61, 0x1b, 0x5a, 0x88,
+ 0xce, 0xae, 0x1f, 0xf8, 0x4, 0x7, 0x57, 0x78,
+ 0x6c, 0x7b, 0x31, 0x79, 0x8, 0x77, 0x7, 0xab,
+ 0xc3, 0x8f, 0xfb, 0x17, 0x1f, 0xfb, 0x78, 0x7,
+ 0x5f, 0xa7, 0x5b, 0xcd, 0xf5, 0x93, 0xe8, 0xa4,
+ 0x90, 0x1e, 0xe, 0xa0, 0x76, 0xf8, 0x41, 0xd3,
+ 0x48, 0xa0, 0x12, 0xf7, 0xb, 0xd6, 0x13, 0xd0,
+ 0xf7, 0xb, 0x16, 0xd6, 0xf7, 0x96, 0x6, 0xf7,
+ 0x2f, 0xfb, 0x55, 0x5, 0x92, 0x82, 0x90, 0x81,
+ 0x83, 0x1a, 0x80, 0x81, 0x82, 0x6f, 0x1e, 0x79,
+ 0xf7, 0x7f, 0x9d, 0x7, 0x50, 0x71, 0xaf, 0xb0,
+ 0x6c, 0x1f, 0xfb, 0x3c, 0xf7, 0x6a, 0xbe, 0xbe,
+ 0xaa, 0xa6, 0xab, 0xa6, 0x19, 0x99, 0x9c, 0x96,
+ 0x90, 0x95, 0x1b, 0x97, 0x8a, 0x95, 0x81, 0x9e,
+ 0x7e, 0x93, 0x84, 0x9b, 0x87, 0x9b, 0x8c, 0x8,
+ 0xa4, 0x8c, 0xa5, 0x98, 0xb0, 0x1a, 0xaf, 0x62,
+ 0x9e, 0x6a, 0x6f, 0x6d, 0x80, 0x7b, 0x78, 0x1e,
+ 0x41, 0x4f, 0x48, 0x49, 0x43, 0x4b, 0x8, 0x13,
+ 0x50, 0xf7, 0x6d, 0x7, 0x13, 0xb0, 0x39, 0x69,
+ 0x65, 0x82, 0x62, 0x88, 0x8, 0x76, 0x7, 0xae,
+ 0x8a, 0xbe, 0x85, 0x35, 0x1a, 0xe, 0x7a, 0xe2,
+ 0xf8, 0xe5, 0xd7, 0x1, 0xc6, 0x9e, 0xf7, 0x67,
+ 0xb1, 0xf7, 0x5e, 0x9e, 0x3, 0xa3, 0x7a, 0x15,
+ 0xe7, 0x6, 0xf7, 0x3f, 0xf8, 0x12, 0x5, 0x8d,
+ 0x6, 0xfb, 0x24, 0xaa, 0x89, 0xfb, 0x82, 0xf7,
+ 0xf, 0x1b, 0xe1, 0xa0, 0xf6, 0xd4, 0x1f, 0x78,
+ 0x6, 0x70, 0x8a, 0x77, 0x41, 0x57, 0x1b, 0x62,
+ 0x6e, 0xba, 0xb6, 0x7f, 0x1f, 0x5f, 0xf7, 0x30,
+ 0x65, 0xf7, 0x51, 0x60, 0xf7, 0x3a, 0x8, 0xb5,
+ 0x80, 0x6b, 0xad, 0x5a, 0x1b, 0x45, 0x6d, 0xfb,
+ 0x12, 0x56, 0x8d, 0x1f, 0x9e, 0x6, 0xa3, 0x8a,
+ 0xa3, 0xda, 0xc1, 0x1b, 0xbf, 0xaa, 0x2f, 0x42,
+ 0x9c, 0x1f, 0xe, 0xfb, 0x36, 0x90, 0x76, 0xf8,
+ 0x9f, 0x77, 0x1, 0xf7, 0x7c, 0x7b, 0x15, 0xb0,
+ 0x6, 0xa1, 0xb7, 0xe2, 0xf7, 0x44, 0xc1, 0xf7,
+ 0x2, 0x8, 0xa5, 0xc0, 0x9c, 0xb5, 0xb5, 0x1a,
+ 0xa6, 0x82, 0xa8, 0x5d, 0x58, 0x89, 0x50, 0x5a,
+ 0x94, 0x1e, 0x8f, 0x75, 0x8e, 0x7a, 0x7c, 0x1a,
+ 0x6d, 0x83, 0x74, 0x78, 0x66, 0x1e, 0x3f, 0xfb,
+ 0x2c, 0xfb, 0x32, 0xf8, 0x28, 0x51, 0x72, 0x88,
+ 0x8c, 0x45, 0x84, 0x19, 0x78, 0x7, 0xb4, 0x86,
+ 0xa4, 0x87, 0x99, 0x67, 0x8, 0xe, 0xfb, 0x52,
+ 0xfb, 0x5f, 0x76, 0xf7, 0x70, 0xeb, 0xf7, 0xb8,
+ 0xe7, 0xf7, 0xb6, 0x77, 0x12, 0xa6, 0xbc, 0x7f,
+ 0xc0, 0x74, 0xb2, 0xf7, 0xb3, 0xbc, 0x13, 0xfb,
+ 0xf7, 0x2d, 0xf8, 0x2e, 0x15, 0x42, 0x50, 0x56,
+ 0x53, 0x31, 0x1a, 0xfb, 0x43, 0xf7, 0x37, 0x69,
+ 0xf7, 0x28, 0xa7, 0xc1, 0x89, 0x51, 0x53, 0x64,
+ 0x6d, 0x68, 0x97, 0x1e, 0x6a, 0x96, 0x72, 0x90,
+ 0x79, 0x89, 0x8, 0x6d, 0x89, 0x7c, 0x7b, 0x6e,
+ 0x1a, 0x60, 0xc0, 0x81, 0xa6, 0xf4, 0xc6, 0xdc,
+ 0xf7, 0xd, 0xd7, 0x43, 0xb1, 0x3d, 0xfb, 0x3d,
+ 0x41, 0xc8, 0xce, 0xe1, 0xe1, 0xd5, 0xb2, 0x9b,
+ 0x1e, 0x85, 0x8c, 0xb8, 0x85, 0xbb, 0x1b, 0xc6,
+ 0xc1, 0x97, 0xb9, 0xa6, 0x6b, 0x92, 0x72, 0x51,
+ 0x39, 0x6c, 0x7c, 0x71, 0x1f, 0x64, 0xa3, 0x7e,
+ 0xac, 0xab, 0x1a, 0xb5, 0xa8, 0xb3, 0xaa, 0x98,
+ 0x1e, 0xad, 0x85, 0xf7, 0x19, 0xb0, 0xc0, 0x1a,
+ 0xa1, 0x7e, 0x9b, 0x6f, 0x5a, 0x45, 0x4f, 0x73,
+ 0x6e, 0x1e, 0x13, 0xf5, 0x6e, 0x8d, 0x72, 0x9c,
+ 0xa7, 0x1a, 0xac, 0x9e, 0x96, 0x97, 0x90, 0x1e,
+ 0x89, 0x9d, 0x5, 0x58, 0x6c, 0x6c, 0x62, 0x64,
+ 0xb6, 0x6e, 0xa9, 0x83, 0x1f, 0x13, 0xfb, 0x6f,
+ 0x6b, 0x7c, 0x68, 0x68, 0x1a, 0x66, 0x9d, 0x66,
+ 0xb4, 0x6b, 0x1e, 0xe, 0x78, 0xb7, 0xf8, 0x4f,
+ 0xaa, 0x1, 0xae, 0xea, 0xf7, 0xad, 0xe5, 0x3,
+ 0xae, 0xf7, 0x80, 0x15, 0xfb, 0xe, 0xef, 0xfb,
+ 0x19, 0xf7, 0x21, 0xf7, 0x23, 0xdd, 0xf7, 0x17,
+ 0xf7, 0x2a, 0xf7, 0x24, 0x20, 0xe8, 0xfb, 0x1b,
+ 0xfb, 0x1d, 0x34, 0xfb, 0x1b, 0xfb, 0x14, 0x1e,
+ 0xea, 0xaa, 0x15, 0xde, 0xa1, 0xf7, 0xa, 0xf0,
+ 0xf7, 0xd, 0xb0, 0xfb, 0x34, 0x29, 0x33, 0x68,
+ 0x2a, 0x30, 0xfb, 0x2, 0x5e, 0xf7, 0x28, 0xe9,
+ 0x1e, 0xe, 0x78, 0xe9, 0xf7, 0xda, 0xe1, 0x1,
+ 0x95, 0xf7, 0xdc, 0x15, 0x9c, 0x6, 0xc4, 0xab,
+ 0x9c, 0x9b, 0xa7, 0x1b, 0xc4, 0x6, 0x6e, 0xfb,
+ 0x6c, 0x8b, 0x6d, 0x7c, 0x73, 0x8, 0x77, 0x6b,
+ 0x64, 0x72, 0x63, 0x1a, 0x7d, 0x95, 0x64, 0xb8,
+ 0xb2, 0x9a, 0xa7, 0xb4, 0x94, 0x1e, 0x97, 0xc1,
+ 0x9d, 0xf7, 0x2, 0x9b, 0xf7, 0x4f, 0x8, 0xf7,
+ 0x5, 0x6, 0x7a, 0xfb, 0x35, 0x5, 0x3a, 0x82,
+ 0x87, 0xfb, 0x46, 0xf7, 0x9, 0x1b, 0xd3, 0xaf,
+ 0xd8, 0xf2, 0x1f, 0x76, 0x6, 0x76, 0x78, 0x4a,
+ 0x5c, 0x66, 0x75, 0xbf, 0xb2, 0xb1, 0x8b, 0xdb,
+ 0x97, 0xf7, 0x9, 0x1e, 0xf7, 0x1a, 0xe1, 0xfc,
+ 0x11, 0x6, 0x33, 0x63, 0xfb, 0x0, 0x58, 0x80,
+ 0x1f, 0xe, 0xfb, 0x65, 0x76, 0xf9, 0x36, 0xc2,
+ 0x1, 0xc6, 0xe3, 0xf7, 0x91, 0xe5, 0x3, 0xf7,
+ 0x27, 0xb3, 0x15, 0xb0, 0x69, 0xab, 0x6f, 0xca,
+ 0x8c, 0x8, 0xf7, 0x2b, 0x8d, 0xc7, 0xef, 0xf7,
+ 0x4a, 0x1a, 0xf7, 0x4f, 0x45, 0xbc, 0xfb, 0x2d,
+ 0xfb, 0x1c, 0x40, 0x26, 0xfb, 0xa, 0x8c, 0x1e,
+ 0x8f, 0xfc, 0x3b, 0x5, 0x6d, 0x87, 0x69, 0x84,
+ 0x74, 0x1e, 0xe2, 0x6, 0x95, 0xb3, 0x8b, 0xae,
+ 0xb3, 0x1a, 0x88, 0xf7, 0x70, 0x15, 0x85, 0xf7,
+ 0x7b, 0x5, 0xc2, 0x8a, 0xab, 0xc0, 0xc2, 0x1b,
+ 0xf7, 0x18, 0xb7, 0x4f, 0xfb, 0x22, 0xfb, 0x7,
+ 0x6d, 0x30, 0xfb, 0xd, 0x64, 0x5d, 0xa2, 0xb9,
+ 0x77, 0x1f, 0xe, 0xfb, 0x88, 0xfb, 0x68, 0x76,
+ 0xf7, 0x75, 0xf4, 0xf7, 0xbe, 0xf4, 0x3b, 0xdb,
+ 0x12, 0xb3, 0xb5, 0xf7, 0xd0, 0xb1, 0x13, 0xdc,
+ 0xb3, 0xf7, 0x66, 0x15, 0xfb, 0x15, 0xd4, 0x32,
+ 0xf7, 0x1b, 0xf7, 0xa, 0xab, 0x74, 0x62, 0x68,
+ 0x78, 0x66, 0x65, 0x8a, 0x1e, 0x7d, 0x7c, 0x90,
+ 0x91, 0x7b, 0x1f, 0x91, 0x7b, 0x7a, 0x92, 0x7b,
+ 0x1b, 0x72, 0x71, 0x78, 0x68, 0x6c, 0xaa, 0x70,
+ 0xbe, 0xd3, 0xe1, 0xd2, 0xf7, 0x5, 0xf1, 0x50,
+ 0xb7, 0x34, 0x20, 0x26, 0x88, 0xf7, 0x1f, 0xf1,
+ 0xca, 0xdf, 0xdc, 0x8c, 0x1f, 0x9f, 0xa0, 0x84,
+ 0x84, 0xa0, 0x1f, 0x13, 0xec, 0x85, 0x9c, 0x9c,
+ 0x86, 0x9a, 0x1b, 0xb9, 0xa9, 0x9c, 0xa7, 0xbe,
+ 0x52, 0x94, 0x62, 0xfb, 0x38, 0xfb, 0x3, 0xfb,
+ 0x14, 0xfb, 0x36, 0x1f, 0xe, 0x3b, 0x76, 0xb7,
+ 0xf8, 0x1b, 0xe1, 0x1, 0xa9, 0xf0, 0xf7, 0xc2,
+ 0xe9, 0x3, 0xf8, 0xe0, 0xf8, 0x32, 0x15, 0xe1,
+ 0xfb, 0x97, 0x7, 0xfb, 0x14, 0xfb, 0x3f, 0x42,
+ 0xfb, 0x31, 0xfb, 0x17, 0xd9, 0xfb, 0x34, 0xf7,
+ 0x43, 0xf7, 0x4e, 0xc5, 0xf7, 0xc, 0xec, 0xee,
+ 0x46, 0xd1, 0x34, 0xba, 0x1f, 0x8d, 0x7, 0x56,
+ 0x16, 0xe0, 0x40, 0xa9, 0x48, 0xfb, 0x0, 0x1a,
+ 0x3e, 0x60, 0x4b, 0x3b, 0x2b, 0x38, 0xf7, 0xd,
+ 0xf7, 0xa, 0xf1, 0xe7, 0xbd, 0xea, 0x1e, 0xe,
+ 0xfb, 0x88, 0x78, 0xe8, 0xf7, 0xe1, 0xe8, 0x1,
+ 0xf7, 0x4a, 0xd5, 0x3, 0xa7, 0xf7, 0xc1, 0x15,
+ 0xaf, 0x98, 0xb0, 0xd1, 0xad, 0x1b, 0xe6, 0x6,
+ 0x85, 0x56, 0x7c, 0xfb, 0x11, 0x28, 0x1a, 0x23,
+ 0xb5, 0x5e, 0xc6, 0xe8, 0x9d, 0xf7, 0x7, 0xcd,
+ 0x87, 0x1e, 0x79, 0x6, 0x84, 0x62, 0x7d, 0x5b,
+ 0x5d, 0x8c, 0x58, 0x8c, 0x81, 0xca, 0x8f, 0xbd,
+ 0x9b, 0xf7, 0x70, 0x18, 0xf7, 0x2e, 0x8a, 0x5,
+ 0xe8, 0xfb, 0x7f, 0x7, 0x66, 0x60, 0x7b, 0x6f,
+ 0x72, 0x1f, 0x6b, 0x67, 0x7c, 0x62, 0x76, 0x3d,
+ 0x8, 0xe, 0x20, 0x79, 0xbb, 0xf8, 0x71, 0x77,
+ 0x1, 0xf7, 0x21, 0xe1, 0xf7, 0x79, 0xda, 0x3,
+ 0x92, 0xf7, 0xee, 0x15, 0xa1, 0x6, 0x97, 0xac,
+ 0x9e, 0xbd, 0xaf, 0x8c, 0x8, 0x98, 0x96, 0x7b,
+ 0x7f, 0x8d, 0x1f, 0x92, 0x66, 0x97, 0xfb, 0x2,
+ 0x40, 0x1a, 0x26, 0xc7, 0x2a, 0xf7, 0xc, 0xf7,
+ 0x21, 0xd4, 0xf7, 0x9, 0xf7, 0x26, 0xf7, 0x3,
+ 0x65, 0xe2, 0xfb, 0x2c, 0xcb, 0x1e, 0x85, 0x7a,
+ 0x5, 0x9d, 0x89, 0xee, 0x4f, 0xfb, 0x47, 0x1a,
+ 0x28, 0x73, 0xfb, 0xc, 0x2f, 0x4b, 0x5a, 0xcb,
+ 0xd9, 0xc7, 0x82, 0xf7, 0x14, 0x81, 0xd3, 0x1e,
+ 0xbc, 0x84, 0x6e, 0xa5, 0x65, 0x1b, 0x38, 0x69,
+ 0x2f, 0x46, 0x81, 0x1f, 0xe, 0xfb, 0x36, 0xfb,
+ 0x5f, 0x76, 0xfa, 0x13, 0x77, 0x1, 0xa6, 0xe6,
+ 0xf7, 0x8, 0xbb, 0x5e, 0xb8, 0xf7, 0xc, 0xe3,
+ 0x3, 0xf7, 0x85, 0x7e, 0x15, 0x8d, 0xfb, 0x5b,
+ 0xb2, 0x7f, 0x5, 0xf7, 0x67, 0x7, 0xb5, 0xf7,
+ 0x3a, 0xaa, 0xf7, 0x7c, 0xf7, 0x46, 0xfb, 0x2a,
+ 0xd3, 0x51, 0x1f, 0xf7, 0x2e, 0x7, 0x5a, 0x9c,
+ 0x8d, 0xfb, 0x3f, 0x5, 0x68, 0xfb, 0x41, 0x63,
+ 0xfb, 0x70, 0xfb, 0x52, 0xf7, 0x24, 0x4c, 0xd1,
+ 0x1f, 0xb4, 0xb0, 0x15, 0xf8, 0x4c, 0x7, 0x9b,
+ 0xf3, 0x55, 0xfb, 0x3c, 0xfb, 0x48, 0x28, 0x67,
+ 0x76, 0x89, 0x1f, 0x61, 0x16, 0x72, 0x2a, 0xb8,
+ 0xf7, 0x40, 0xf7, 0x3e, 0xe9, 0xc0, 0xa2, 0x1f,
+ 0xe, 0xfb, 0x7b, 0xe3, 0xf8, 0xca, 0xd7, 0x1,
+ 0x98, 0xfb, 0x7b, 0x15, 0xf1, 0x6, 0xf7, 0x2e,
+ 0xf7, 0xae, 0x5, 0x8d, 0x6, 0x3a, 0x9a, 0xa1,
+ 0xfb, 0x5d, 0xe9, 0x1b, 0xe7, 0xa5, 0xf7, 0x1f,
+ 0xbf, 0x8d, 0x1f, 0x78, 0x6, 0x6f, 0x8a, 0x6c,
+ 0x40, 0x4e, 0x1b, 0x3c, 0x71, 0xf7, 0x5c, 0xb5,
+ 0x82, 0x1f, 0xf7, 0x76, 0xf8, 0x24, 0x5, 0x25,
+ 0x6, 0xfb, 0x2f, 0xfb, 0xa1, 0x5, 0xf7, 0x20,
+ 0x73, 0x79, 0xf7, 0x15, 0x25, 0x1b, 0x34, 0x7b,
+ 0xfb, 0x1f, 0x5a, 0x85, 0x1f, 0x9d, 0x6, 0xa8,
+ 0x90, 0xa3, 0xde, 0xbe, 0x1b, 0xdb, 0xa8, 0xfb,
+ 0x43, 0x46, 0x9e, 0x1f, 0xe, 0x8e, 0xfb, 0x63,
+ 0x76, 0xf9, 0x6c, 0x77, 0x1, 0xf7, 0xd9, 0xca,
+ 0x3, 0xf7, 0xd9, 0x70, 0x15, 0xfb, 0x5d, 0xca,
+ 0xf7, 0x5d, 0x7, 0xc0, 0x96, 0xcd, 0xa3, 0xba,
+ 0xca, 0xaa, 0xb5, 0xa3, 0xbe, 0x97, 0xf7, 0x81,
+ 0x8e, 0xc2, 0xaa, 0x8f, 0xb9, 0x95, 0x8, 0x9d,
+ 0x7, 0x97, 0x75, 0x69, 0x8b, 0x7f, 0x1b, 0xfb,
+ 0x17, 0x8b, 0xfb, 0x8b, 0xfb, 0x11, 0x7d, 0x1f,
+ 0x83, 0x3f, 0x57, 0x6d, 0x63, 0x81, 0x8, 0xf8,
+ 0x6f, 0x4c, 0xfc, 0x6f, 0x7, 0x63, 0x95, 0x57,
+ 0xa9, 0x83, 0xd7, 0x8, 0xf7, 0x11, 0x7e, 0x95,
+ 0xf7, 0x8b, 0xfb, 0x22, 0x1b, 0x7f, 0x69, 0x8b,
+ 0x7f, 0x75, 0x1f, 0x79, 0x7, 0xb9, 0x81, 0xaa,
+ 0x87, 0x8e, 0x54, 0x97, 0xfb, 0x81, 0xa3, 0x58,
+ 0xaa, 0x61, 0xba, 0x4c, 0xcd, 0x73, 0xc0, 0x80,
+ 0x8, 0xe, 0x8e, 0x7a, 0xb9, 0xf8, 0x6b, 0x77,
+ 0x1, 0xb5, 0xf2, 0xf7, 0x39, 0xf5, 0xf7, 0x38,
+ 0xf3, 0x3, 0xf7, 0xff, 0xd3, 0x15, 0x5c, 0xa9,
+ 0xc3, 0x61, 0xc5, 0x1b, 0xf7, 0x5, 0xcb, 0xf7,
+ 0x9, 0xf6, 0xf7, 0x2a, 0x36, 0xf7, 0x23, 0xfb,
+ 0x3e, 0x1f, 0x7a, 0x7, 0xf7, 0x7, 0x74, 0xaf,
+ 0xfb, 0x8, 0x26, 0x1a, 0x46, 0x83, 0xfb, 0x25,
+ 0x39, 0x41, 0x6b, 0xe2, 0xa4, 0x8e, 0x1e, 0x97,
+ 0x98, 0x9c, 0xd4, 0xce, 0x1a, 0xc9, 0x7f, 0xc4,
+ 0x62, 0x62, 0x7f, 0x52, 0x4d, 0x48, 0x9c, 0x42,
+ 0x97, 0x7e, 0x1e, 0x73, 0x8d, 0x6e, 0x33, 0x41,
+ 0x1b, 0x3d, 0x7c, 0xf7, 0x18, 0xd0, 0xf3, 0xab,
+ 0xf7, 0x11, 0xf7, 0xc, 0xa3, 0x1f, 0x9c, 0x7,
+ 0xfb, 0x3a, 0x32, 0xfb, 0x15, 0xfb, 0x26, 0xfb,
+ 0x2, 0xc6, 0xfb, 0x18, 0xf7, 0x10, 0xc3, 0xc0,
+ 0xb7, 0xb8, 0xa8, 0x1f, 0xe, 0x57, 0x79, 0xa7,
+ 0xf8, 0x15, 0xd1, 0xf7, 0x43, 0xb4, 0x12, 0xf7,
+ 0x1d, 0xdd, 0x48, 0xe5, 0x92, 0xad, 0xf7, 0x50,
+ 0xd9, 0x13, 0xee, 0x9d, 0xf7, 0xd6, 0x15, 0x90,
+ 0x89, 0x90, 0x8a, 0x90, 0x89, 0x8, 0xb1, 0xa1,
+ 0xa4, 0xb3, 0xaf, 0x1b, 0xa4, 0x94, 0x78, 0x77,
+ 0x8d, 0x1f, 0x13, 0xf6, 0x8f, 0x4f, 0x78, 0x42,
+ 0x4e, 0x1a, 0xfb, 0x6, 0xc4, 0x49, 0xf2, 0xf7,
+ 0x37, 0xe4, 0xf7, 0x28, 0xf7, 0x51, 0x1e, 0xd5,
+ 0x5d, 0x5, 0xc0, 0x7, 0x41, 0xb0, 0x5, 0xf2,
+ 0x66, 0xf7, 0x6b, 0xfb, 0x3a, 0x48, 0x6d, 0x60,
+ 0x55, 0xfb, 0xa, 0xf0, 0x56, 0xf7, 0xd, 0x49,
+ 0x1e, 0x37, 0x8c, 0x7e, 0xfb, 0x91, 0xfb, 0x26,
+ 0x1b, 0x47, 0x71, 0xc4, 0xcc, 0x1f, 0x13, 0xee,
+ 0xdb, 0xa2, 0xda, 0xdb, 0x1a, 0xbf, 0x62, 0xb5,
+ 0x5c, 0x53, 0x4c, 0x42, 0x45, 0x7a, 0x1e, 0xf8,
+ 0x58, 0xcf, 0x15, 0x63, 0x9f, 0xfb, 0x27, 0xcd,
+ 0xf0, 0x1a, 0xad, 0x9f, 0xa8, 0xb3, 0xf7, 0xa,
+ 0x94, 0xfb, 0x73, 0x70, 0x1e, 0xe, 0x4c, 0xa0,
+ 0x76, 0xf8, 0x8b, 0xf7, 0x4a, 0x66, 0xb0, 0x12,
+ 0xf7, 0x84, 0xf3, 0x13, 0xb0, 0xf7, 0x2b, 0x24,
+ 0xa, 0x8a, 0xf7, 0x6a, 0x5, 0xda, 0x91, 0xb1,
+ 0xf7, 0x9b, 0xf7, 0x4, 0x1b, 0x9d, 0x9a, 0x81,
+ 0x7d, 0x1f, 0x75, 0x65, 0x72, 0x6d, 0x1a, 0x13,
+ 0xd0, 0x6b, 0xa5, 0x7f, 0xa6, 0xad, 0xa7, 0xb4,
+ 0xb4, 0xcc, 0x6d, 0xae, 0x56, 0xfb, 0x1d, 0x58,
+ 0xfb, 0x2a, 0x2a, 0x76, 0x1e, 0xf7, 0x31, 0x7d,
+ 0xfb, 0x1d, 0xe1, 0xfb, 0x27, 0x1b, 0x7e, 0x82,
+ 0x83, 0x84, 0x87, 0x8f, 0x87, 0x92, 0x89, 0x1f,
+ 0xf7, 0x59, 0x5e, 0xac, 0x2e, 0x8c, 0xfb, 0x6b,
+ 0x8c, 0xfb, 0x67, 0x18, 0x28, 0xa, 0xe, 0x3b,
+ 0xfb, 0x5f, 0x76, 0xf7, 0x68, 0xb1, 0xf8, 0x21,
+ 0xd7, 0x1, 0xaf, 0xf4, 0xf7, 0x1a, 0xcc, 0xf7,
+ 0x27, 0xef, 0x3, 0xf7, 0xa9, 0x7f, 0x15, 0xfb,
+ 0x68, 0xca, 0xf7, 0x68, 0x7, 0xf7, 0x1b, 0x8a,
+ 0xf7, 0x4, 0xee, 0xf7, 0x27, 0x1a, 0xf7, 0x27,
+ 0x49, 0xf7, 0xb, 0xfb, 0x10, 0x26, 0x73, 0x48,
+ 0x3e, 0x8d, 0x1e, 0x8e, 0xfb, 0xdd, 0x5, 0x28,
+ 0x66, 0xf7, 0x7, 0xf0, 0xd7, 0x9b, 0xf7, 0x15,
+ 0xe6, 0xad, 0x1f, 0x9d, 0x7, 0xfb, 0x10, 0x33,
+ 0xfb, 0x1d, 0xfb, 0x10, 0xfb, 0x36, 0xf7, 0x4,
+ 0x32, 0xf7, 0x15, 0x8c, 0x1f, 0xca, 0xb1, 0x15,
+ 0xf7, 0xde, 0x7, 0xa5, 0x8c, 0x8a, 0xb4, 0xb7,
+ 0x1b, 0xd8, 0xa5, 0x28, 0x32, 0xfb, 0x8, 0x53,
+ 0x2e, 0x30, 0x1f, 0xe, 0xa9, 0x79, 0xb4, 0xf8,
+ 0x6f, 0xe0, 0x1, 0xae, 0xf5, 0xf7, 0x37, 0xec,
+ 0xf7, 0x40, 0xed, 0x3, 0xf7, 0xf8, 0xd0, 0x15,
+ 0x61, 0x9b, 0xbc, 0x5e, 0xd6, 0x1b, 0xf7, 0xc,
+ 0xc2, 0xf7, 0x1d, 0xf7, 0x11, 0xec, 0x3e, 0xf7,
+ 0x17, 0x24, 0xa5, 0x1f, 0xf7, 0x48, 0x8c, 0x5,
+ 0xdf, 0xfc, 0x9d, 0x7, 0x6b, 0x47, 0x66, 0x25,
+ 0x65, 0x1f, 0x9d, 0x87, 0xc6, 0xb7, 0xab, 0x94,
+ 0xe4, 0x92, 0x19, 0x26, 0x4e, 0x41, 0x36, 0xfb,
+ 0x6, 0x1a, 0xfb, 0x14, 0xb7, 0xfb, 0x16, 0xf7,
+ 0x1b, 0xc5, 0xca, 0xbb, 0xb2, 0xa0, 0x1e, 0x72,
+ 0xd4, 0x15, 0x62, 0x8d, 0x5e, 0x3d, 0x52, 0x1b,
+ 0x36, 0x86, 0xf7, 0x2c, 0xd1, 0xf7, 0xa, 0xc2,
+ 0xf0, 0xed, 0xad, 0x1f, 0xf7, 0x10, 0x6, 0xf0,
+ 0x6d, 0xc1, 0xfb, 0x9, 0x23, 0x1a, 0x3d, 0x8b,
+ 0xfb, 0x22, 0x30, 0x4e, 0x5e, 0xcf, 0xba, 0x8d,
+ 0x1e, 0x98, 0xc5, 0x95, 0xd1, 0xad, 0x1a, 0xab,
+ 0x8d, 0xdc, 0x5a, 0x57, 0x8e, 0x3f, 0x67, 0x8a,
+ 0x1e, 0x8a, 0x60, 0x95, 0x41, 0x9d, 0x5d, 0x8,
+ 0xe, 0xfb, 0x73, 0xf7, 0x1a, 0x76, 0xf7, 0xfc,
+ 0x77, 0x1, 0xbd, 0xf7, 0xfc, 0x3, 0xf7, 0x7a,
+ 0xf7, 0x5, 0x15, 0xee, 0xdc, 0xdb, 0xef, 0xee,
+ 0x3a, 0xdc, 0x28, 0x27, 0x3b, 0x3a, 0x28, 0x27,
+ 0xdb, 0x3b, 0xef, 0x1f, 0xe, 0xf7, 0xd1, 0x7a,
+ 0xf7, 0x4, 0x1, 0xf7, 0x3, 0xf7, 0x4, 0xf7,
+ 0x71, 0xf7, 0x4, 0xf7, 0x71, 0xf7, 0x4, 0x14,
+ 0x70, 0xf7, 0x3, 0xb1, 0x15, 0x29, 0xa, 0xf7,
+ 0xe1, 0x16, 0x29, 0xa, 0xf7, 0xe1, 0x16, 0x29,
+ 0xa, 0xe, 0xfc, 0x48, 0xf8, 0x74, 0x76, 0xf7,
+ 0xa8, 0x77, 0x1, 0xa9, 0xf8, 0x7d, 0x15, 0x38,
+ 0xa, 0x59, 0xa, 0x1e, 0xf7, 0x31, 0xf7, 0x5a,
+ 0x40, 0xa, 0x6d, 0xa1, 0x6c, 0x7b, 0x7d, 0x85,
+ 0x81, 0x87, 0x1e, 0xe, 0xfb, 0xa4, 0xf8, 0x74,
+ 0x76, 0xf7, 0xaa, 0x77, 0x1, 0xb9, 0xf8, 0x5f,
+ 0x15, 0x59, 0xa, 0x1f, 0xf7, 0x32, 0x36, 0xa,
+ 0x23, 0xfb, 0x7c, 0x5, 0x38, 0xa, 0x1e, 0xf7,
+ 0x54, 0x16, 0x59, 0xa, 0x1f, 0xf7, 0x31, 0x36,
+ 0xa, 0x24, 0xfb, 0x7c, 0x5, 0x38, 0xa, 0x1e,
+ 0xe, 0xfc, 0x98, 0x94, 0x76, 0xf9, 0x45, 0x77,
+ 0x1, 0xfb, 0x10, 0x7f, 0x15, 0xf8, 0x64, 0xf9,
+ 0x45, 0x5, 0x53, 0x6, 0xfc, 0x64, 0xfd, 0x45,
+ 0x5, 0xe, 0xce, 0x7f, 0xca, 0xf7, 0x54, 0xca,
+ 0xca, 0xca, 0xf7, 0x52, 0xca, 0x1, 0xf7, 0x7,
+ 0xce, 0x3, 0x9f, 0xf7, 0x87, 0x15, 0xf7, 0x0,
+ 0x6, 0xfb, 0x26, 0xb0, 0xf7, 0x1b, 0xfb, 0x1,
+ 0xf7, 0x39, 0x1b, 0xea, 0xd6, 0xb0, 0xb3, 0xbd,
+ 0x1f, 0xe5, 0x7, 0x4b, 0x57, 0x39, 0x63, 0x35,
+ 0x1b, 0xfb, 0x11, 0x25, 0xdb, 0xf7, 0x4, 0x64,
+ 0x1f, 0xf7, 0xf8, 0x6, 0xa9, 0xca, 0x5, 0xfc,
+ 0x25, 0x6, 0x8a, 0x96, 0x8a, 0x94, 0x95, 0x1a,
+ 0x95, 0x8c, 0x95, 0x8c, 0x98, 0x1e, 0xf8, 0x42,
+ 0x6, 0xa9, 0xca, 0x5, 0xfc, 0x51, 0x6, 0xf7,
+ 0x0, 0xad, 0xf6, 0xdd, 0xf7, 0x11, 0x1b, 0xe5,
+ 0xdc, 0x61, 0x4f, 0xbc, 0x1f, 0xa8, 0xc8, 0x5,
+ 0xcb, 0x4b, 0x31, 0xb3, 0x2c, 0x1b, 0xfb, 0x35,
+ 0xfb, 0x1f, 0x22, 0xfb, 0x28, 0x66, 0x1f, 0x3d,
+ 0x6, 0x6d, 0x4c, 0x5, 0xeb, 0x6, 0x8a, 0x7e,
+ 0x8b, 0x82, 0x81, 0x1a, 0x82, 0x8b, 0x82, 0x8c,
+ 0x7e, 0x1e, 0x49, 0x6, 0xe, 0x8e, 0x56, 0xde,
+ 0xad, 0xcf, 0xf7, 0x70, 0xa2, 0xf7, 0xa9, 0xe3,
+ 0x1, 0xc4, 0xb2, 0xf7, 0xac, 0xd1, 0xc3, 0xd7,
+ 0x3, 0xa5, 0xb7, 0x15, 0x98, 0xa6, 0x9b, 0x92,
+ 0x9b, 0x1b, 0x99, 0xc2, 0x6f, 0x6e, 0xc3, 0x1f,
+ 0x6d, 0xc5, 0xc6, 0x6d, 0x99, 0x1b, 0xac, 0xf7,
+ 0x60, 0xf7, 0x3e, 0xcd, 0xb0, 0x5d, 0xd0, 0x65,
+ 0xcf, 0x1f, 0x71, 0xba, 0x75, 0xb9, 0xaf, 0x1a,
+ 0x9f, 0xda, 0xe7, 0xb3, 0xc3, 0x1e, 0xb1, 0x42,
+ 0x25, 0xbb, 0x32, 0x1b, 0xfb, 0x5, 0xfb, 0x17,
+ 0x44, 0xfb, 0x14, 0xfb, 0x6, 0xef, 0x3f, 0xf7,
+ 0x0, 0x8c, 0x1f, 0x8d, 0xa2, 0x5, 0x41, 0x8a,
+ 0x2a, 0xcd, 0xdc, 0x1a, 0xdf, 0xd0, 0xb8, 0xdd,
+ 0x8d, 0x1e, 0xcd, 0x8d, 0xf1, 0x64, 0xbe, 0x71,
+ 0x8, 0x39, 0x23, 0x83, 0x75, 0x74, 0x1a, 0x63,
+ 0xa2, 0x5c, 0xa5, 0x5d, 0x1e, 0xae, 0x4d, 0xb5,
+ 0x4d, 0x5c, 0x1a, 0x5f, 0x4b, 0x4d, 0x5b, 0x77,
+ 0x57, 0xa7, 0xa6, 0x57, 0x1e, 0xa5, 0x59, 0x5c,
+ 0xa0, 0x77, 0x1b, 0x72, 0x2d, 0x50, 0x7f, 0x77,
+ 0x1f, 0xe, 0xf7, 0xc4, 0xfb, 0x67, 0xac, 0xf7,
+ 0x39, 0xaf, 0xf8, 0x4b, 0xb5, 0xd0, 0x77, 0x1,
+ 0xf7, 0x33, 0xab, 0x9e, 0xdb, 0xb8, 0xd3, 0xac,
+ 0xb9, 0xf7, 0xb2, 0xed, 0x3, 0xf7, 0x8c, 0xf7,
+ 0x10, 0x15, 0x67, 0x4b, 0x56, 0x50, 0x40, 0x1a,
+ 0x45, 0xa8, 0x48, 0xe5, 0xee, 0xa9, 0xdb, 0xd8,
+ 0xee, 0x64, 0xbf, 0x6a, 0xde, 0x1e, 0xef, 0xd6,
+ 0xf7, 0x5c, 0xf7, 0x4a, 0xf0, 0x1b, 0xb0, 0xa3,
+ 0x6b, 0x46, 0xfb, 0x26, 0x26, 0xfb, 0x54, 0x2f,
+ 0x48, 0x71, 0xac, 0xae, 0xa2, 0x9e, 0x91, 0x97,
+ 0x1f, 0xa7, 0x8c, 0xa0, 0xa7, 0xa3, 0x1a, 0xa3,
+ 0x76, 0x9e, 0x73, 0x8a, 0x1e, 0x5b, 0x8a, 0x6a,
+ 0x5e, 0x58, 0x1a, 0x43, 0xbe, 0x50, 0xe4, 0xf7,
+ 0x41, 0xf7, 0x9, 0xf7, 0x87, 0xf7, 0x6, 0xd9,
+ 0x5a, 0xdd, 0x33, 0xfb, 0x3e, 0xfb, 0x1f, 0xfb,
+ 0x50, 0x21, 0x25, 0x1e, 0x75, 0xb5, 0x81, 0xa6,
+ 0xa5, 0x1a, 0xda, 0xf7, 0x16, 0xf7, 0x1, 0xc9,
+ 0xcb, 0x1e, 0x82, 0x9b, 0x5, 0x27, 0x48, 0xfb,
+ 0x37, 0xfb, 0x8, 0xfb, 0x11, 0x1a, 0x8a, 0x56,
+ 0xa4, 0x58, 0x99, 0x66, 0x8, 0x9a, 0x6d, 0x15,
+ 0xc1, 0xfb, 0x0, 0x9d, 0x5d, 0x65, 0x1a, 0x63,
+ 0x7f, 0x63, 0x5c, 0x5c, 0x65, 0xb7, 0xcb, 0xbc,
+ 0xaf, 0xc5, 0xaf, 0xc4, 0x1e, 0xe, 0xf7, 0x4,
+ 0x91, 0x76, 0xc2, 0xdf, 0xf8, 0xa4, 0xdd, 0x52,
+ 0xc4, 0x12, 0xa5, 0xac, 0xf7, 0x24, 0xc0, 0xe5,
+ 0xe3, 0x13, 0xee, 0xd1, 0xac, 0x15, 0x92, 0x86,
+ 0x90, 0x86, 0x92, 0x86, 0x8, 0x9a, 0x9e, 0x9b,
+ 0x92, 0x97, 0x1b, 0xaa, 0xa7, 0x64, 0x7b, 0xa4,
+ 0x1f, 0xf7, 0x2c, 0xc3, 0xc8, 0xf7, 0x42, 0xf7,
+ 0x19, 0x1a, 0x13, 0xae, 0xd0, 0x8b, 0xe5, 0x7c,
+ 0xe3, 0x1e, 0xb6, 0xce, 0x98, 0x99, 0xa0, 0x1b,
+ 0xa2, 0xf3, 0x2a, 0x84, 0x92, 0x1f, 0xfb, 0x55,
+ 0xfb, 0x24, 0x96, 0x77, 0x5, 0xd3, 0x9e, 0x39,
+ 0x21, 0xfb, 0xd, 0x9a, 0x4c, 0xd3, 0x70, 0x1f,
+ 0xf7, 0x2, 0xe3, 0x7c, 0xa2, 0x5, 0x86, 0x7f,
+ 0x6f, 0x79, 0x7c, 0x1b, 0x69, 0x86, 0xb4, 0xed,
+ 0xef, 0x82, 0xf7, 0x1, 0x46, 0xa3, 0x1f, 0xf7,
+ 0x4a, 0xf7, 0x1f, 0x5, 0x13, 0x1e, 0xf7, 0x26,
+ 0xfb, 0x38, 0x8a, 0x8f, 0x7b, 0x1b, 0x79, 0xfb,
+ 0xe, 0x2f, 0x78, 0x71, 0x1f, 0xce, 0x76, 0x41,
+ 0xb7, 0x44, 0x1b, 0xfb, 0x1d, 0x3d, 0x47, 0xfb,
+ 0x11, 0x2e, 0xdd, 0x5b, 0xd3, 0x63, 0x1f, 0x9a,
+ 0x82, 0x93, 0x81, 0x81, 0x1a, 0x78, 0x77, 0x7f,
+ 0x85, 0x82, 0x1e, 0xa2, 0x7b, 0x5, 0xb6, 0xb8,
+ 0x98, 0xa0, 0x9e, 0x1a, 0xa9, 0x60, 0xa9, 0x5e,
+ 0xa6, 0x1e, 0x57, 0xa8, 0x52, 0xa9, 0xcc, 0x1a,
+ 0x13, 0xde, 0xc8, 0xd5, 0xb8, 0xc4, 0xf7, 0x1c,
+ 0x9e, 0xfb, 0x29, 0xfb, 0x1f, 0xfb, 0x15, 0x64,
+ 0xfb, 0x25, 0x60, 0x50, 0x1e, 0xc6, 0x35, 0x9d,
+ 0x94, 0x7a, 0x1b, 0x75, 0x88, 0x40, 0x36, 0x80,
+ 0x88, 0x8, 0xe, 0xe0, 0x8b, 0xf0, 0xf8, 0xbf,
+ 0xab, 0x12, 0xad, 0x9a, 0x91, 0xf7, 0x8, 0xf8,
+ 0x40, 0xf7, 0x9, 0x90, 0x9a, 0x17, 0xad, 0x16,
+ 0x13, 0xdc, 0xf7, 0xb8, 0x6, 0x7b, 0xf7, 0x2c,
+ 0x5, 0xfb, 0x1, 0xa9, 0x6d, 0xf7, 0xf, 0xf4,
+ 0x1a, 0xf7, 0x16, 0xdb, 0xf7, 0x8, 0xf7, 0x1a,
+ 0xf7, 0x20, 0xd5, 0xfb, 0x8, 0xfb, 0x1a, 0x27,
+ 0x65, 0xfb, 0x14, 0x26, 0x71, 0x1e, 0x7b, 0xfb,
+ 0x2c, 0x5, 0x13, 0xfc, 0xf7, 0xb8, 0xf7, 0x36,
+ 0x6, 0x13, 0xdc, 0x7c, 0x6, 0x5a, 0x7f, 0x75,
+ 0x7f, 0x61, 0x1b, 0xfb, 0x28, 0x6, 0x8d, 0xa7,
+ 0x5, 0xf7, 0x1e, 0xa1, 0xda, 0xf7, 0x18, 0xf7,
+ 0x10, 0x1a, 0xf7, 0x52, 0xfb, 0x3f, 0xe6, 0xfb,
+ 0x34, 0xfb, 0x33, 0xfb, 0x3e, 0x2f, 0xfb, 0x4d,
+ 0x8a, 0x1e, 0x8a, 0xfb, 0x12, 0xd6, 0xfb, 0x1b,
+ 0xf7, 0x22, 0x76, 0x8d, 0x6f, 0x18, 0x13, 0xa0,
+ 0xfb, 0x28, 0x6, 0x61, 0x75, 0x97, 0xbc, 0x7f,
+ 0x1f, 0x7c, 0x6, 0xe, 0xf7, 0x20, 0x8e, 0x76,
+ 0xb2, 0x76, 0xf8, 0x69, 0xf7, 0x18, 0xc4, 0x77,
+ 0x12, 0xf7, 0x43, 0xe6, 0x13, 0x78, 0xf7, 0x43,
+ 0x16, 0xf7, 0x47, 0x6, 0x9b, 0xb6, 0x86, 0x9e,
+ 0x99, 0x1a, 0xac, 0x6e, 0xb0, 0x70, 0xb1, 0x1e,
+ 0x75, 0xab, 0x76, 0xac, 0xac, 0x1a, 0xaa, 0xa6,
+ 0xa1, 0xa0, 0xa1, 0x1e, 0x13, 0xb8, 0xf7, 0x7c,
+ 0xfb, 0xa1, 0xbb, 0x4f, 0x97, 0x5d, 0x8, 0x9e,
+ 0x93, 0xaf, 0xab, 0xcd, 0x1a, 0xc3, 0x6a, 0xb1,
+ 0x6b, 0xac, 0x1e, 0x6b, 0xab, 0x6c, 0xa6, 0xac,
+ 0x1a, 0xd9, 0xd0, 0xe0, 0xc1, 0x7e, 0x1e, 0x90,
+ 0xe0, 0x5, 0xad, 0x86, 0x74, 0xa4, 0x6a, 0x1b,
+ 0x7a, 0x7d, 0x8b, 0x8c, 0x7f, 0x1f, 0x55, 0x8e,
+ 0x87, 0x96, 0x90, 0xb5, 0x8, 0x5c, 0x84, 0x76,
+ 0x54, 0x5b, 0x1a, 0x47, 0xcb, 0x7d, 0xc2, 0x8e,
+ 0x1e, 0x62, 0x5d, 0x7f, 0x61, 0x77, 0x5d, 0xfb,
+ 0x6c, 0xf7, 0x92, 0x79, 0x99, 0x83, 0xbb, 0x8,
+ 0x70, 0x82, 0x65, 0x5a, 0x60, 0x1a, 0x64, 0xd0,
+ 0x40, 0xb4, 0x5d, 0x1e, 0x4b, 0x4a, 0x5d, 0x6f,
+ 0x3e, 0x1a, 0x74, 0xa0, 0x71, 0x9b, 0x6a, 0x1e,
+ 0x95, 0x76, 0x94, 0x73, 0x6f, 0x1a, 0x6e, 0x67,
+ 0x8c, 0x77, 0x1e, 0xe, 0x46, 0xa, 0xab, 0xfa,
+ 0x22, 0x3, 0xab, 0xf7, 0x8c, 0x15, 0xe9, 0x31,
+ 0xd1, 0x45, 0xe2, 0x24, 0xae, 0xae, 0x18, 0x5b,
+ 0xc7, 0x2d, 0xf1, 0x64, 0xb1, 0x8, 0xf9, 0xb9,
+ 0xc3, 0xfd, 0xb9, 0x6, 0xb2, 0xb1, 0xe9, 0xf1,
+ 0xbb, 0xc7, 0x68, 0xae, 0x18, 0x34, 0x24, 0x45,
+ 0x45, 0x2d, 0x31, 0x8, 0xe, 0x3b, 0xa0, 0x76,
+ 0xfa, 0x22, 0x49, 0xa, 0xf7, 0xac, 0x16, 0xc3,
+ 0xf9, 0xb9, 0x6, 0xb1, 0x64, 0xf1, 0x2d, 0xc7,
+ 0x5b, 0xae, 0xae, 0x18, 0x24, 0xe2, 0x45, 0xd1,
+ 0x31, 0xe9, 0x31, 0x2d, 0x45, 0x45, 0x24, 0x34,
+ 0xae, 0x68, 0x18, 0xc7, 0xbb, 0xf1, 0xe9, 0xb1,
+ 0xb2, 0x8, 0xe, 0x46, 0xa, 0xbc, 0xf7, 0x70,
+ 0x15, 0xf9, 0xb9, 0x6, 0x64, 0x65, 0x2d, 0x25,
+ 0x5b, 0x4f, 0xae, 0x68, 0x18, 0xe2, 0xf2, 0xd1,
+ 0xd1, 0xe9, 0xe5, 0x2d, 0xe5, 0x45, 0xd1, 0x34,
+ 0xf2, 0x68, 0x68, 0x18, 0xbb, 0x4f, 0xe9, 0x25,
+ 0xb2, 0x65, 0x8, 0xfd, 0xb9, 0x6, 0xe, 0x3b,
+ 0x8a, 0x76, 0xfa, 0x22, 0x49, 0xa, 0xb8, 0xf7,
+ 0x79, 0x15, 0xf2, 0x34, 0xd1, 0x45, 0xe5, 0x2d,
+ 0xe5, 0xe9, 0xd1, 0xd1, 0xf2, 0xe2, 0x68, 0xae,
+ 0x18, 0x4f, 0x5b, 0x25, 0x2d, 0x65, 0x64, 0x8,
+ 0xf9, 0xb9, 0x53, 0xfd, 0xb9, 0x7, 0x65, 0xb2,
+ 0x25, 0xe9, 0x4f, 0xbb, 0x8, 0xe, 0xf7, 0xfb,
+ 0x91, 0x76, 0xf7, 0x81, 0xbf, 0xf7, 0x81, 0x77,
+ 0x1, 0xa3, 0xfa, 0x7c, 0x3, 0xa3, 0xf7, 0x8c,
+ 0x15, 0xf7, 0x7, 0x25, 0xc2, 0x48, 0xda, 0x2d,
+ 0xb0, 0xab, 0x18, 0x47, 0xea, 0x6f, 0xa0, 0x36,
+ 0xe4, 0x8, 0xf9, 0xaa, 0x6, 0x36, 0x32, 0x70,
+ 0x75, 0x46, 0x2d, 0xb0, 0x6b, 0x18, 0xda, 0xe9,
+ 0xc2, 0xce, 0xf7, 0x7, 0xf1, 0xfb, 0x7, 0xf1,
+ 0x54, 0xce, 0x3c, 0xe9, 0x66, 0x6b, 0x18, 0xd0,
+ 0x2e, 0xa5, 0x73, 0xe1, 0x33, 0x8, 0xfd, 0xaa,
+ 0x6, 0xe0, 0xe4, 0xa7, 0xa0, 0xcf, 0xea, 0x66,
+ 0xab, 0x18, 0x3c, 0x2d, 0x54, 0x48, 0xfb, 0x7,
+ 0x25, 0x8, 0xe, 0x72, 0x90, 0x76, 0xe9, 0xc2,
+ 0xf8, 0x84, 0x77, 0x1, 0xf8, 0xb7, 0xc2, 0x3,
+ 0x9a, 0xf5, 0x15, 0xf7, 0x3a, 0xfb, 0xe, 0x5,
+ 0xe9, 0xf8, 0x39, 0xf8, 0xbb, 0x54, 0xfc, 0x84,
+ 0xfc, 0x2, 0xe9, 0x7, 0xe, 0xf7, 0xc4, 0xeb,
+ 0xc0, 0xf7, 0x5c, 0xc0, 0xd9, 0xac, 0x8b, 0x77,
+ 0x1, 0xa9, 0xfa, 0x21, 0x3, 0xa9, 0xf7, 0x8d,
+ 0x15, 0xf7, 0xa, 0xfb, 0x3, 0xb4, 0x61, 0xe5,
+ 0xfb, 0x3, 0xb4, 0xac, 0x18, 0x4d, 0xd9, 0x5,
+ 0xf9, 0x3d, 0xc0, 0xfd, 0x65, 0x6, 0x23, 0xef,
+ 0xf3, 0xef, 0x5, 0xf9, 0x65, 0xc0, 0xfd, 0x3d,
+ 0x6, 0xc9, 0xd9, 0x62, 0xac, 0x31, 0xfb, 0x3,
+ 0x62, 0x61, 0xfb, 0xa, 0xfb, 0x3, 0x19, 0xe,
+ 0x3b, 0xa2, 0x76, 0xfa, 0x21, 0x77, 0x1, 0xf7,
+ 0x3e, 0xc0, 0xf7, 0x34, 0xc0, 0x3, 0xf7, 0x3e,
+ 0x8d, 0x15, 0xc0, 0xf9, 0x7c, 0x6, 0xdb, 0xdc,
+ 0xdb, 0x3a, 0x5, 0xfd, 0x7c, 0xc0, 0xf9, 0x4c,
+ 0x7, 0xed, 0x3e, 0xac, 0xb4, 0xfb, 0x3, 0xe5,
+ 0x61, 0xb4, 0xfb, 0x3, 0xf7, 0xa, 0x19, 0xfb,
+ 0x3, 0xfb, 0xa, 0x61, 0x62, 0xfb, 0x3, 0x31,
+ 0xac, 0x62, 0x18, 0xed, 0xd8, 0x5, 0xe, 0xf7,
+ 0xc4, 0xee, 0xc0, 0xf7, 0x51, 0xc0, 0x1, 0xb8,
+ 0xee, 0x15, 0xf9, 0x3d, 0x6, 0x48, 0x35, 0xb9,
+ 0x6a, 0xe5, 0xf7, 0x3, 0xb4, 0xb5, 0xf7, 0xa,
+ 0xf7, 0x3, 0x19, 0xfb, 0xa, 0xf7, 0x3, 0x62,
+ 0xb5, 0x31, 0xf7, 0x3, 0x5d, 0x6a, 0x18, 0xce,
+ 0x3a, 0x5, 0xfd, 0x3d, 0x56, 0xf9, 0x68, 0x6,
+ 0xf0, 0x2a, 0x26, 0x2f, 0x5, 0xfd, 0x68, 0x6,
+ 0xe, 0x3b, 0x8d, 0x76, 0xfa, 0x21, 0x77, 0x1,
+ 0xf7, 0x43, 0xc0, 0xf7, 0x34, 0xc0, 0x3, 0xb7,
+ 0xf7, 0x7a, 0x15, 0xf7, 0x3, 0x31, 0xb5, 0x62,
+ 0xf7, 0x3, 0xfb, 0xa, 0xf7, 0x3, 0xf7, 0xa,
+ 0xb5, 0xb4, 0xf7, 0x3, 0xe5, 0x6a, 0xb4, 0x18,
+ 0x29, 0x3e, 0x5, 0xf9, 0x4c, 0x56, 0xfd, 0x7c,
+ 0x7, 0x3b, 0x3a, 0x3b, 0xdc, 0x5, 0xf9, 0x7c,
+ 0x56, 0xfd, 0x4c, 0x7, 0x29, 0xd8, 0x5, 0xe,
+ 0xf7, 0xfb, 0xf7, 0x1, 0xbd, 0xf7, 0x40, 0xbd,
+ 0x1, 0xa6, 0xfa, 0x78, 0x3, 0xa6, 0xf7, 0x89,
+ 0x15, 0xf7, 0x8, 0x21, 0xb2, 0x61, 0xed, 0xfb,
+ 0x9, 0xb3, 0xad, 0x18, 0x3f, 0xea, 0x5, 0xf8,
+ 0xc6, 0x6, 0x3f, 0x2c, 0xb3, 0x69, 0xed, 0xf7,
+ 0x9, 0xb2, 0xb5, 0xf7, 0x8, 0xf5, 0x19, 0xfb,
+ 0x8, 0xf5, 0x64, 0xb5, 0x29, 0xf7, 0x9, 0x63,
+ 0x69, 0x18, 0xd7, 0x2c, 0x5, 0xfc, 0xc6, 0x6,
+ 0xd7, 0xea, 0x63, 0xad, 0x29, 0xfb, 0x9, 0x64,
+ 0x61, 0xfb, 0x8, 0x21, 0x19, 0xf7, 0x41, 0x35,
+ 0x15, 0x34, 0xe1, 0xe2, 0xe1, 0x5, 0xf9, 0x1f,
+ 0x6, 0xe2, 0x35, 0x34, 0x35, 0x5, 0xe, 0xa9,
+ 0xa0, 0x76, 0xf8, 0x5d, 0xc2, 0xf7, 0x55, 0x77,
+ 0x1, 0xf7, 0xdd, 0x16, 0xc6, 0x6, 0xf7, 0xb9,
+ 0xf9, 0x55, 0x5, 0x52, 0x6, 0x39, 0xfb, 0x55,
+ 0x5, 0xfc, 0x5, 0x6, 0x36, 0xf7, 0x55, 0x5,
+ 0x52, 0x6, 0xf7, 0xde, 0xfd, 0xf, 0x15, 0xfb,
+ 0x38, 0xf8, 0x17, 0x5, 0xf7, 0xd6, 0x6, 0xe,
+ 0xfb, 0x51, 0x77, 0xa8, 0xf8, 0x0, 0xb2, 0xf7,
+ 0xb2, 0xbb, 0x1, 0xa5, 0xe1, 0xf7, 0x9f, 0xde,
+ 0x3, 0xf8, 0xf, 0xf7, 0xec, 0x15, 0xbf, 0x48,
+ 0x6e, 0x9b, 0x50, 0x1b, 0xfb, 0xa, 0x3b, 0x27,
+ 0xfb, 0xe, 0xfb, 0x10, 0xdf, 0x35, 0xf6, 0xf7,
+ 0x56, 0xbe, 0xf7, 0xb4, 0xf7, 0x11, 0xf7, 0x30,
+ 0x48, 0xf7, 0x59, 0xfb, 0x59, 0x57, 0x58, 0x7b,
+ 0x7e, 0x6d, 0x1f, 0xb2, 0x59, 0x5, 0xa0, 0xb4,
+ 0xa4, 0x95, 0xd2, 0x1b, 0xf1, 0xb6, 0xfb, 0x36,
+ 0xfb, 0x54, 0x84, 0x1f, 0x83, 0x68, 0x15, 0x2b,
+ 0x77, 0x7a, 0xfb, 0x60, 0xfb, 0x1b, 0x1b, 0x40,
+ 0x7f, 0xea, 0xb7, 0xd9, 0xb1, 0xf7, 0x27, 0xf7,
+ 0x0, 0xc8, 0xaa, 0x62, 0x74, 0xa0, 0x1f, 0xe,
+ 0x8b, 0xc2, 0xf7, 0xb3, 0xc2, 0xf7, 0x93, 0xc2,
+ 0x1, 0xf8, 0x3b, 0xc2, 0x3, 0xa4, 0x16, 0xf8,
+ 0x59, 0xf9, 0x57, 0xfc, 0x59, 0x54, 0xf8, 0x22,
+ 0xfb, 0x93, 0xfb, 0xf6, 0x54, 0xf7, 0xf6, 0xfb,
+ 0xb3, 0xfc, 0x22, 0x6, 0xe, 0xf7, 0x20, 0x73,
+ 0xc0, 0xf9, 0x14, 0xbd, 0x1, 0xb2, 0xc3, 0xf9,
+ 0xb, 0xc2, 0x3, 0xf7, 0x6c, 0xf7, 0x0, 0x15,
+ 0xf8, 0x42, 0xf8, 0x56, 0x5, 0xba, 0x55, 0xac,
+ 0x40, 0x3c, 0x1a, 0xfb, 0x40, 0xfb, 0x20, 0xfb,
+ 0x29, 0xfb, 0x40, 0x3c, 0x48, 0xad, 0xb8, 0x57,
+ 0x1e, 0x66, 0xb1, 0x15, 0x73, 0xa8, 0x4f, 0xc5,
+ 0xf7, 0xe, 0x1a, 0xf7, 0x2e, 0xf7, 0x24, 0xf7,
+ 0x34, 0xf7, 0x3f, 0xd7, 0xd0, 0x6d, 0x5d, 0xc2,
+ 0x1e, 0xfc, 0xcb, 0xfc, 0xdc, 0x15, 0xac, 0x6a,
+ 0xee, 0xe5, 0x5, 0x53, 0xca, 0xde, 0x69, 0xe8,
+ 0x1b, 0xf7, 0x5f, 0xf7, 0x38, 0xf7, 0x3f, 0xf7,
+ 0x5f, 0xe8, 0x65, 0xe4, 0x51, 0xcc, 0x1f, 0xe4,
+ 0xe3, 0x67, 0xad, 0x33, 0x34, 0x5, 0xc2, 0x4b,
+ 0x37, 0xab, 0x2f, 0x1b, 0xfb, 0x5f, 0xfb, 0x3c,
+ 0xfb, 0x3f, 0xfb, 0x55, 0xfb, 0x10, 0xbc, 0x3b,
+ 0xbd, 0x5b, 0x1f, 0xe, 0x44, 0x8b, 0xbc, 0xf9,
+ 0x13, 0x77, 0x1, 0x91, 0xf8, 0xee, 0x3, 0x91,
+ 0x16, 0xf8, 0xee, 0x6, 0xfb, 0xc3, 0xf9, 0x44,
+ 0x5, 0xfb, 0x88, 0xfd, 0x13, 0x15, 0xf7, 0x6e,
+ 0xf8, 0x68, 0xf7, 0x5b, 0xfc, 0x68, 0x5, 0xe,
+ 0xa9, 0x8d, 0x76, 0xf9, 0x42, 0xbe, 0x1, 0xaf,
+ 0xf9, 0x19, 0x3, 0xf7, 0xe5, 0x78, 0x15, 0xf7,
+ 0xec, 0xf9, 0x75, 0x5, 0xfd, 0x19, 0x6, 0xf7,
+ 0xe9, 0xfc, 0xc0, 0x15, 0xfb, 0x62, 0xf8, 0x8d,
+ 0x5, 0xf8, 0x47, 0x6, 0xe, 0xa9, 0x8b, 0xc1,
+ 0xf7, 0x2d, 0xc1, 0xf7, 0x2d, 0xc1, 0x1, 0xb8,
+ 0xf8, 0x60, 0x14, 0xe0, 0xef, 0xf7, 0x63, 0x15,
+ 0xf8, 0x29, 0xc1, 0xfc, 0x29, 0x6, 0xe2, 0x95,
+ 0xd7, 0xcd, 0xdd, 0x1b, 0xf7, 0x81, 0xc1, 0xfb,
+ 0x81, 0x6, 0xfb, 0x2a, 0x42, 0xfb, 0xd, 0xfb,
+ 0x5, 0xfb, 0x6, 0xd7, 0xfb, 0xc, 0xf7, 0x27,
+ 0x1f, 0xf7, 0x81, 0xc1, 0xfb, 0x81, 0x6, 0x39,
+ 0x3f, 0xcd, 0xe2, 0x81, 0x1f, 0xe, 0xa9, 0x66,
+ 0x76, 0xc5, 0xc1, 0xf7, 0x2d, 0xc1, 0xf7, 0x2d,
+ 0xc1, 0xe2, 0x77, 0x1, 0xb8, 0xc2, 0x3, 0xe9,
+ 0x6a, 0x15, 0xb7, 0x72, 0xb8, 0xd8, 0x5, 0x80,
+ 0x9a, 0xa9, 0x83, 0xa1, 0x1b, 0xf7, 0x93, 0xc1,
+ 0xfb, 0x89, 0x6, 0x7f, 0x73, 0x8d, 0x95, 0x7c,
+ 0x1f, 0xdb, 0xf7, 0x21, 0x5, 0xf7, 0x6c, 0xc1,
+ 0xfb, 0x4e, 0x6, 0xe2, 0xf7, 0x2d, 0x5, 0xee,
+ 0xc1, 0x47, 0x6, 0xae, 0xc9, 0x5d, 0xa4, 0x5a,
+ 0x34, 0x5, 0xfb, 0x8, 0x6, 0x29, 0xfb, 0xa,
+ 0x2e, 0xfb, 0x1b, 0x38, 0xa7, 0x57, 0xcc, 0x4f,
+ 0x1f, 0x65, 0xf7, 0x6c, 0x15, 0xd2, 0x91, 0xd6,
+ 0xdf, 0xd5, 0x1b, 0xe8, 0x6, 0x32, 0xfb, 0x2f,
+ 0x5, 0x2e, 0xfb, 0x3b, 0x15, 0x6e, 0xa6, 0x70,
+ 0xb3, 0x83, 0xb9, 0x8, 0xf7, 0x14, 0x6, 0xe,
+ 0xfb, 0x88, 0x7a, 0xba, 0xf7, 0x4b, 0xc2, 0xf7,
+ 0x4a, 0xbd, 0x1, 0xf7, 0xd4, 0xe9, 0x3, 0xbb,
+ 0x8e, 0x15, 0x85, 0x9d, 0xab, 0x7d, 0xbe, 0x1b,
+ 0xf7, 0x22, 0xf7, 0xf, 0xf7, 0x1, 0xf7, 0x3d,
+ 0xe3, 0x50, 0xf7, 0x2b, 0xfb, 0x43, 0x6c, 0x69,
+ 0x88, 0x82, 0x64, 0x1f, 0x60, 0x7, 0x8e, 0x98,
+ 0x99, 0x8d, 0x98, 0x1b, 0xf0, 0xf2, 0x45, 0xfb,
+ 0x4, 0x1f, 0xfb, 0x5c, 0x54, 0xf7, 0x5a, 0x6,
+ 0x24, 0x2f, 0x3b, 0x25, 0x72, 0x71, 0x8f, 0x94,
+ 0x72, 0x1e, 0xe, 0xf7, 0x20, 0x26, 0xa2, 0xf9,
+ 0xba, 0xa2, 0x1, 0xf7, 0xe, 0xf7, 0x5, 0xf7,
+ 0xfa, 0xf7, 0x5, 0x3, 0xa4, 0x3d, 0x15, 0x74,
+ 0xf7, 0xc7, 0xa2, 0x7, 0x50, 0x65, 0xa0, 0xd1,
+ 0x1f, 0xf9, 0x43, 0xf7, 0xfa, 0xfd, 0x43, 0x7,
+ 0x45, 0x65, 0x76, 0x51, 0x1e, 0x74, 0xf7, 0xc6,
+ 0xa2, 0x7, 0x50, 0x65, 0xa0, 0xd1, 0x1f, 0xf8,
+ 0xf2, 0x7, 0xe8, 0xd0, 0x9b, 0xa7, 0x1e, 0xa2,
+ 0xfd, 0x9e, 0x74, 0x7, 0xa7, 0xd0, 0x7b, 0x2e,
+ 0x1f, 0xfc, 0xf2, 0x7, 0x45, 0x66, 0x76, 0x4f,
+ 0x1e, 0xe, 0xa9, 0x27, 0xf2, 0xf9, 0x4d, 0xb8,
+ 0x1, 0xf8, 0xef, 0x9f, 0x3, 0x99, 0xfb, 0x0,
+ 0x15, 0x9f, 0xa6, 0x93, 0x9f, 0x1b, 0xf8, 0x78,
+ 0x8e, 0x5, 0xa4, 0xaf, 0x84, 0x87, 0xa5, 0x1f,
+ 0x98, 0xf1, 0x90, 0x9f, 0xa4, 0xf1, 0x8, 0x74,
+ 0x6, 0x32, 0x68, 0x6b, 0x73, 0x3d, 0x1b, 0xfb,
+ 0xfd, 0x6, 0xf7, 0xba, 0xf7, 0xe7, 0xfb, 0xa5,
+ 0xf7, 0xfa, 0x5, 0xf7, 0x91, 0x6, 0xf7, 0x14,
+ 0x9a, 0x5a, 0x4a, 0x9f, 0x1f, 0x9f, 0x6, 0x85,
+ 0xf7, 0x33, 0x5, 0xfc, 0x85, 0x6, 0x69, 0x65,
+ 0x90, 0x8d, 0x69, 0x1f, 0xf7, 0xf1, 0xfc, 0x5a,
+ 0x5, 0xe, 0xf7, 0x7d, 0xc2, 0x1, 0x96, 0xf7,
+ 0x7d, 0x15, 0x42, 0xa, 0xe, 0xfb, 0x4b, 0xf7,
+ 0x2f, 0x76, 0xf7, 0x4f, 0xb9, 0x9e, 0xdb, 0xe0,
+ 0x77, 0x1, 0xf7, 0x81, 0x9d, 0x3, 0xcc, 0xf7,
+ 0x94, 0x15, 0x75, 0x9e, 0x7f, 0x9f, 0xa2, 0x93,
+ 0xa0, 0xa1, 0x9f, 0x1e, 0x9e, 0xa0, 0x97, 0x96,
+ 0xab, 0x9f, 0x8, 0x8e, 0x90, 0x92, 0x8c, 0x8d,
+ 0x1b, 0x91, 0x8a, 0x7f, 0x87, 0x76, 0x86, 0x7a,
+ 0x86, 0x7c, 0x1f, 0x83, 0x73, 0x80, 0x77, 0x6d,
+ 0x1a, 0x74, 0x96, 0x76, 0xa6, 0xa5, 0x95, 0xa2,
+ 0xa0, 0x8c, 0x1e, 0xa9, 0x81, 0x9f, 0x83, 0xa4,
+ 0x1e, 0x86, 0x9a, 0x87, 0x9b, 0xa0, 0x1a, 0x8f,
+ 0x89, 0x96, 0x91, 0x8e, 0x8e, 0x8a, 0x87, 0x92,
+ 0x1e, 0xa6, 0x7a, 0x9e, 0x7a, 0x98, 0x7e, 0x8,
+ 0x73, 0xa3, 0x99, 0x75, 0xa6, 0x1b, 0x9b, 0x99,
+ 0x97, 0xa1, 0xaa, 0x68, 0x94, 0x6e, 0x93, 0x1f,
+ 0x6f, 0x93, 0x6b, 0x93, 0x74, 0x97, 0x8, 0x84,
+ 0x8f, 0x85, 0x8e, 0x90, 0x1a, 0x8e, 0x8f, 0x8f,
+ 0x94, 0x90, 0x1e, 0xcd, 0xaa, 0x8d, 0x82, 0xb3,
+ 0x95, 0x8, 0x97, 0x8e, 0xa6, 0x98, 0xa3, 0x1a,
+ 0xa4, 0x7a, 0x97, 0x78, 0x6e, 0x79, 0x6b, 0x6f,
+ 0x70, 0x1e, 0x7f, 0x7f, 0x7a, 0x7f, 0x7d, 0x83,
+ 0x8, 0x88, 0x85, 0x86, 0x88, 0x88, 0x1b, 0x87,
+ 0x8a, 0x90, 0x98, 0xa6, 0x92, 0x9e, 0x92, 0x9f,
+ 0x1f, 0x91, 0x9c, 0x91, 0x9d, 0xa4, 0x1a, 0x9d,
+ 0x83, 0xa1, 0x70, 0x70, 0x83, 0x76, 0x79, 0x73,
+ 0x91, 0x79, 0x91, 0x78, 0x1e, 0x92, 0x77, 0x92,
+ 0x77, 0x71, 0x1a, 0x7f, 0x8a, 0x85, 0x87, 0x88,
+ 0x87, 0x8d, 0x8f, 0x84, 0x1e, 0x75, 0x96, 0x7d,
+ 0x97, 0x80, 0x96, 0x8, 0xa3, 0x75, 0x80, 0xae,
+ 0x6a, 0x1b, 0x73, 0x7b, 0x7a, 0x75, 0x71, 0x9f,
+ 0x83, 0xb3, 0x84, 0x1f, 0xa8, 0x86, 0x8b, 0x8d,
+ 0xc5, 0x70, 0x8, 0x96, 0x86, 0x90, 0x87, 0x88,
+ 0x1a, 0x88, 0x87, 0x87, 0x82, 0x86, 0x1e, 0x70,
+ 0x7b, 0x71, 0x84, 0x72, 0x86, 0x8, 0x6b, 0x86,
+ 0x63, 0x7f, 0x6c, 0x1a, 0xe, 0x65, 0xfa, 0x4f,
+ 0x1, 0x95, 0xf8, 0x8d, 0x3, 0xf8, 0x1, 0x65,
+ 0x15, 0xf7, 0x2a, 0xfa, 0x4a, 0x68, 0x90, 0xfb,
+ 0x13, 0xfd, 0xb2, 0xfb, 0x59, 0xf8, 0x31, 0xfb,
+ 0x26, 0x43, 0x9b, 0x6a, 0xeb, 0xba, 0x5, 0xe,
+ 0xa9, 0xf7, 0xf, 0xbe, 0xf7, 0x46, 0xbf, 0x1,
+ 0xa6, 0xc0, 0x3, 0xf8, 0x1, 0xf7, 0x81, 0x15,
+ 0x60, 0xb6, 0xda, 0x44, 0xd0, 0x1b, 0xad, 0xa8,
+ 0x9b, 0x9f, 0x9f, 0x1f, 0x6b, 0xad, 0x5, 0x7f,
+ 0x7d, 0x7b, 0x84, 0x7a, 0x1b, 0x5d, 0x59, 0xb2,
+ 0xc4, 0x50, 0x1f, 0xbc, 0xbf, 0xba, 0xb0, 0xb8,
+ 0x1b, 0xa0, 0x9f, 0x85, 0x7b, 0x9f, 0x1f, 0xa8,
+ 0xb1, 0x5, 0x93, 0x7e, 0x72, 0xa3, 0x63, 0x1b,
+ 0x37, 0x68, 0x64, 0x4e, 0x3f, 0x1f, 0xc6, 0x44,
+ 0x51, 0xb4, 0x47, 0x1b, 0x33, 0x55, 0x3f, 0x51,
+ 0x3e, 0xc3, 0x45, 0xde, 0xd6, 0xc7, 0xbf, 0xc9,
+ 0xcb, 0x1f, 0x62, 0xab, 0x15, 0x73, 0x7d, 0x3b,
+ 0x45, 0x4f, 0x1b, 0x56, 0x66, 0xc2, 0xb2, 0xa5,
+ 0xa3, 0xc4, 0xcf, 0xbe, 0xe1, 0x4c, 0x77, 0x9a,
+ 0x1f, 0xe, 0xa9, 0xf7, 0x10, 0xbe, 0xf7, 0x48,
+ 0xbc, 0x1, 0xa5, 0xbe, 0xf8, 0xc2, 0xc0, 0x3,
+ 0xf7, 0xf9, 0xf7, 0x80, 0x15, 0x76, 0xa3, 0xcf,
+ 0x30, 0xdf, 0x1b, 0xf4, 0xbd, 0xd2, 0xd5, 0xd1,
+ 0x4a, 0xcc, 0x31, 0x36, 0x67, 0x5a, 0x56, 0x54,
+ 0x1f, 0xc5, 0x4d, 0x61, 0xb7, 0x34, 0x1b, 0x42,
+ 0x8a, 0x48, 0x4f, 0x41, 0x1a, 0x41, 0xba, 0x44,
+ 0xe8, 0xf2, 0xcb, 0xe6, 0xa0, 0xa3, 0x1e, 0x69,
+ 0xac, 0x15, 0x58, 0x5d, 0x5a, 0x60, 0x4d, 0x1b,
+ 0x5c, 0x61, 0xae, 0xc6, 0xb0, 0xa6, 0xbc, 0xc9,
+ 0xbf, 0xb3, 0x6b, 0x55, 0xcc, 0x1f, 0xce, 0x16,
+ 0xc2, 0xca, 0xa1, 0xa8, 0xc5, 0x1b, 0xd6, 0xa6,
+ 0x51, 0x71, 0x49, 0x56, 0x6d, 0x5a, 0x61, 0x61,
+ 0xb2, 0xc4, 0x50, 0x1f, 0xe, 0xe0, 0x8b, 0xc2,
+ 0xf8, 0xfe, 0x77, 0x1, 0xa5, 0x16, 0xf9, 0x5c,
+ 0xc2, 0xfc, 0xd6, 0x6, 0xf8, 0xd6, 0xf8, 0xd9,
+ 0x62, 0xb0, 0x5, 0xe, 0x3b, 0xa0, 0x76, 0xf8,
+ 0x5a, 0x77, 0x1, 0xa2, 0x16, 0xcc, 0x6, 0xf7,
+ 0x6b, 0xf7, 0xf2, 0xf7, 0x6b, 0xfb, 0xf2, 0x5,
+ 0xcc, 0x6, 0xfb, 0xac, 0xf8, 0x5a, 0x5, 0xe,
+ 0x3b, 0xa0, 0x76, 0xf8, 0x71, 0x77, 0x1, 0xa9,
+ 0xf8, 0xb8, 0x3, 0xa9, 0xf8, 0x54, 0x15, 0xf7,
+ 0xa6, 0xfc, 0x54, 0xf7, 0xa6, 0xf8, 0x54, 0x5f,
+ 0xa8, 0xfb, 0x7a, 0xfc, 0xb, 0xfb, 0x7a, 0xf8,
+ 0xb, 0x5, 0xe, 0xe0, 0xa0, 0x76, 0xf8, 0x61,
+ 0xbb, 0x55, 0xa, 0x16, 0xc2, 0xf7, 0x51, 0x6,
+ 0xf7, 0x23, 0xf7, 0x27, 0xf7, 0x15, 0xf7, 0x24,
+ 0xf7, 0x32, 0xf7, 0x19, 0xfb, 0x27, 0xfb, 0x11,
+ 0x1e, 0xfb, 0x51, 0xc2, 0xf7, 0x51, 0x7, 0xf7,
+ 0x41, 0xfb, 0x2f, 0xf7, 0x27, 0xfb, 0x53, 0xfb,
+ 0x53, 0xfb, 0x2f, 0xfb, 0x27, 0xfb, 0x41, 0x1e,
+ 0xe, 0xe0, 0x7a, 0xba, 0xf8, 0x62, 0x77, 0x55,
+ 0xa, 0xf7, 0xc1, 0x15, 0xfb, 0x41, 0xf7, 0x2f,
+ 0xfb, 0x25, 0x4b, 0xa, 0xf7, 0x2f, 0xf7, 0x25,
+ 0xf7, 0x41, 0x1e, 0xf7, 0x53, 0x54, 0xfb, 0x52,
+ 0x7, 0xfb, 0x11, 0xfb, 0x19, 0xfb, 0x27, 0xfb,
+ 0x32, 0xfb, 0x24, 0xfb, 0x27, 0xf7, 0x15, 0xf7,
+ 0x23, 0x1e, 0xf7, 0x52, 0x54, 0x7, 0xe, 0xfc,
+ 0x2d, 0x20, 0xf7, 0x4, 0xf9, 0xb8, 0xf6, 0x1,
+ 0xf7, 0xc, 0xd1, 0x3, 0x8d, 0x58, 0x15, 0x6a,
+ 0xaa, 0x74, 0xae, 0xf7, 0x27, 0x6e, 0xf8, 0x5d,
+ 0xf7, 0x1e, 0x8f, 0x1e, 0xf7, 0x1c, 0x76, 0xf7,
+ 0x31, 0x8d, 0xb0, 0x1e, 0x95, 0x8c, 0x8e, 0x92,
+ 0x94, 0x9b, 0x9a, 0x71, 0xac, 0x1b, 0xa4, 0x9d,
+ 0x9d, 0xa6, 0xb2, 0x72, 0xa2, 0x67, 0xfb, 0xb,
+ 0x94, 0xfb, 0x8a, 0xfb, 0x27, 0x1f, 0x8a, 0xfb,
+ 0xca, 0x90, 0x2e, 0x8d, 0x41, 0x8, 0x5c, 0x8d,
+ 0x8a, 0x73, 0x7c, 0x7c, 0x7a, 0xa9, 0x71, 0x1b,
+ 0x6f, 0x73, 0x7e, 0x60, 0x1f, 0xe, 0xf7, 0x48,
+ 0x8b, 0xf7, 0x15, 0xf7, 0x6f, 0xf7, 0x16, 0x1,
+ 0xf7, 0x37, 0xf7, 0x15, 0xd6, 0xf7, 0x16, 0xd6,
+ 0xf7, 0x15, 0x14, 0x38, 0xf7, 0x37, 0xcc, 0x15,
+ 0x52, 0xa, 0x6f, 0xa7, 0x67, 0x67, 0x6e, 0x6f,
+ 0x67, 0x1e, 0xf8, 0x2d, 0x16, 0x52, 0xa, 0x6d,
+ 0xa7, 0x67, 0x67, 0x70, 0x6f, 0x67, 0x1e, 0xfb,
+ 0x61, 0xf7, 0xf0, 0x15, 0x67, 0xa8, 0x6e, 0xaf,
+ 0xaf, 0xa8, 0xa8, 0xaf, 0xaf, 0x6e, 0xa8, 0x67,
+ 0x67, 0x6e, 0x6e, 0x67, 0x1e, 0xe, 0xf7, 0x5f,
+ 0xbf, 0x8b, 0xbf, 0x12, 0x9c, 0xf8, 0x94, 0x17,
+ 0x13, 0x60, 0xbc, 0xf7, 0x5f, 0x15, 0xa9, 0xa6,
+ 0xaa, 0xa1, 0xb8, 0x1b, 0xa9, 0xaa, 0x7f, 0x7c,
+ 0xba, 0x1f, 0x7f, 0xb1, 0xc0, 0x7e, 0xba, 0x1b,
+ 0xa2, 0xa1, 0x92, 0x94, 0x9f, 0x1f, 0xaa, 0x9a,
+ 0xa5, 0xa0, 0x94, 0x9d, 0x6a, 0xad, 0x18, 0x7c,
+ 0x7d, 0x6f, 0x66, 0x53, 0x1b, 0x63, 0x5f, 0x96,
+ 0x98, 0x65, 0x1f, 0x13, 0xe0, 0x99, 0x63, 0x66,
+ 0x99, 0x5c, 0x1b, 0x40, 0x6a, 0x61, 0x73, 0x70,
+ 0x1f, 0xe, 0x8b, 0xc2, 0xf7, 0x15, 0xc2, 0xf7,
+ 0x1b, 0xba, 0x90, 0xbb, 0x12, 0x96, 0xf7, 0x4c,
+ 0x15, 0x3a, 0xa, 0xfb, 0x83, 0x4, 0x3a, 0xa,
+ 0x13, 0x30, 0xba, 0xf7, 0xcf, 0x15, 0xab, 0xa8,
+ 0xa2, 0xa3, 0xbe, 0x1b, 0xa5, 0xad, 0x84, 0x7b,
+ 0xb9, 0x1f, 0x13, 0x20, 0x78, 0xc0, 0xb4, 0x81,
+ 0xaf, 0x1b, 0xa4, 0xa1, 0x90, 0x96, 0xa2, 0x1f,
+ 0xb7, 0xa0, 0x96, 0xa4, 0x93, 0x9a, 0x66, 0xa3,
+ 0x18, 0x7b, 0x7d, 0x73, 0x65, 0x4b, 0x1b, 0x72,
+ 0x63, 0x94, 0x97, 0x6c, 0x1f, 0x13, 0x10, 0x66,
+ 0x99, 0x60, 0x9c, 0x5e, 0x8c, 0x8, 0x34, 0x5e,
+ 0x5d, 0x6b, 0x77, 0x1f, 0xe, 0xf7, 0x1b, 0xbe,
+ 0xf4, 0xbe, 0x12, 0x99, 0xf8, 0x96, 0x17, 0xb9,
+ 0xf7, 0xb7, 0x57, 0xa, 0xb3, 0x7b, 0x7d, 0xbc,
+ 0x1f, 0x80, 0xb0, 0xb6, 0x32, 0xa, 0x97, 0x98,
+ 0x65, 0x1f, 0x98, 0x63, 0x62, 0x99, 0x5c, 0x1b,
+ 0x40, 0x68, 0x63, 0x72, 0x6d, 0x1f, 0xab, 0xfb,
+ 0x56, 0x57, 0xa, 0xb5, 0x7b, 0x7d, 0xbc, 0x1f,
+ 0x13, 0xa0, 0x80, 0xb0, 0xb4, 0x32, 0xa, 0x98,
+ 0x98, 0x64, 0x1f, 0x98, 0x63, 0x63, 0x98, 0x5c,
+ 0x1b, 0x40, 0x68, 0x62, 0x72, 0x6d, 0x1f, 0xe,
+ 0x87, 0x76, 0xf7, 0x35, 0xc2, 0xf7, 0x1f, 0xc2,
+ 0xf7, 0x38, 0x77, 0x1, 0xe9, 0x16, 0xbd, 0x72,
+ 0xe6, 0xf7, 0x35, 0x5, 0xf7, 0xc5, 0xc2, 0xfb,
+ 0xa7, 0x6, 0xd8, 0xf7, 0x1f, 0x5, 0xf7, 0x5a,
+ 0xc2, 0xfb, 0x3c, 0x6, 0xd7, 0xf7, 0x1c, 0x5a,
+ 0xa7, 0x30, 0xfb, 0x38, 0x5, 0xfb, 0xb9, 0x54,
+ 0xf7, 0x9a, 0x6, 0x3e, 0xfb, 0x1f, 0x5, 0xfb,
+ 0x4d, 0x54, 0xf7, 0x2f, 0x6, 0xe, 0xdd, 0xc2,
+ 0xed, 0xc2, 0xed, 0xc2, 0x1, 0x99, 0xf8, 0xa0,
+ 0x14, 0xe0, 0x99, 0xf8, 0x18, 0x15, 0x42, 0xa,
+ 0xfb, 0x64, 0x4, 0x42, 0xa, 0xfb, 0x64, 0x4,
+ 0x42, 0xa, 0xe, 0x3d, 0xa, 0xf7, 0xb8, 0x4,
+ 0xf8, 0x85, 0xfb, 0x76, 0x5, 0xc9, 0x7, 0xfc,
+ 0x45, 0xf7, 0x57, 0x3e, 0xa, 0x3d, 0xa, 0xcd,
+ 0x4, 0xf8, 0x85, 0xf7, 0x76, 0x5, 0x51, 0xa,
+ 0xf8, 0x45, 0xfb, 0x5b, 0xfc, 0x45, 0xfb, 0x57,
+ 0x5, 0xe, 0xa9, 0x8b, 0x47, 0xa, 0xb1, 0xc5,
+ 0x3, 0xf9, 0x46, 0x16, 0xc2, 0xfc, 0x29, 0x7,
+ 0x21, 0x8c, 0x39, 0xe3, 0xe2, 0x1a, 0xf0, 0xe1,
+ 0xde, 0xf3, 0x1e, 0xf8, 0x27, 0xc2, 0xfc, 0x28,
+ 0x6, 0xfb, 0x33, 0x34, 0xfb, 0x11, 0xfb, 0x6,
+ 0x8a, 0x1f, 0xfb, 0x19, 0x8a, 0xf7, 0x6, 0x29,
+ 0xf7, 0x16, 0x1b, 0xe, 0xa9, 0x8b, 0x47, 0xa,
+ 0xf8, 0xfb, 0xc5, 0x3, 0xf8, 0x40, 0x16, 0xf7,
+ 0x16, 0xf7, 0x7, 0xed, 0xf7, 0x19, 0xf7, 0x6,
+ 0x31, 0xf7, 0x11, 0xfb, 0x33, 0x1f, 0xfc, 0x28,
+ 0x54, 0xf8, 0x27, 0x6, 0xf3, 0xe3, 0x38, 0x26,
+ 0x34, 0x37, 0x33, 0x21, 0x58, 0xa, 0xa9, 0x5a,
+ 0x76, 0xd1, 0xc2, 0xf7, 0xfb, 0xc2, 0xd2, 0x77,
+ 0x1, 0xaf, 0xc5, 0x3, 0xf7, 0x8d, 0x45, 0x15,
+ 0xc7, 0x6, 0xaf, 0xd1, 0x5, 0xf7, 0xed, 0xc2,
+ 0xfb, 0xd0, 0x6, 0xf7, 0x44, 0xf7, 0xfb, 0x5,
+ 0xf7, 0x20, 0xc2, 0xfb, 0x4, 0x6, 0xb0, 0xd2,
+ 0x5, 0x4f, 0x6, 0x67, 0x44, 0x5, 0xfb, 0x8a,
+ 0x6, 0xfb, 0x4, 0xfb, 0x11, 0x36, 0xfb, 0x2b,
+ 0xfb, 0x31, 0xf7, 0x11, 0x3f, 0xf7, 0x10, 0x8a,
+ 0x1f, 0xa7, 0xc2, 0x15, 0xfb, 0x14, 0x8c, 0x30,
+ 0xdc, 0xee, 0x1a, 0xe2, 0xd9, 0xe7, 0xf5, 0x1e,
+ 0xf7, 0x68, 0x6, 0xe, 0xa9, 0xfb, 0x11, 0xc2,
+ 0xd1, 0x47, 0xa, 0xb0, 0xc3, 0x3, 0xb0, 0x45,
+ 0x15, 0x54, 0xf9, 0x21, 0xc2, 0x7, 0xd1, 0x4,
+ 0xc2, 0xfc, 0x29, 0x7, 0xfb, 0x10, 0x8c, 0x46,
+ 0xee, 0x8c, 0xdc, 0x8, 0xf7, 0x0, 0x8c, 0xea,
+ 0xd2, 0xed, 0x1b, 0xf8, 0x27, 0xc2, 0xfc, 0x28,
+ 0x6, 0xfb, 0x40, 0x3e, 0xfb, 0x16, 0xfb, 0x1,
+ 0xfb, 0x19, 0xf3, 0x29, 0xf7, 0x21, 0x1f, 0xe,
+ 0xa9, 0xfb, 0x11, 0xc2, 0xd1, 0x47, 0xa, 0xf8,
+ 0xfd, 0xc3, 0x3, 0x9f, 0xfb, 0x11, 0x15, 0xf9,
+ 0x21, 0xc2, 0xfd, 0x21, 0x6, 0xf8, 0x2c, 0xd1,
+ 0x15, 0xf7, 0x21, 0xf3, 0xed, 0xf7, 0x19, 0xf7,
+ 0x1, 0x3e, 0xf7, 0x16, 0xfb, 0x40, 0x1f, 0xfc,
+ 0x28, 0x54, 0xf8, 0x27, 0x6, 0xed, 0xeb, 0x44,
+ 0xfb, 0x0, 0x3a, 0x47, 0x28, 0xfb, 0x10, 0x58,
+ 0xa, 0xe0, 0x7c, 0xc0, 0xf7, 0x9d, 0xc1, 0xf7,
+ 0x9d, 0xc0, 0x1, 0xb6, 0xc4, 0xf7, 0x99, 0xc1,
+ 0xf7, 0x9d, 0xc0, 0x14, 0xe0, 0xf7, 0x24, 0xf7,
+ 0xc3, 0x15, 0xf7, 0x6d, 0xfb, 0x71, 0xc1, 0xf7,
+ 0x71, 0xf7, 0x6e, 0xc1, 0xfb, 0x6e, 0xf7, 0x6f,
+ 0x55, 0xfb, 0x6f, 0xfb, 0x6d, 0x6, 0x5f, 0x70,
+ 0x15, 0xf7, 0x35, 0xf7, 0x13, 0x30, 0xa, 0xfb,
+ 0x13, 0xf7, 0x17, 0xf7, 0x35, 0x1e, 0x52, 0x16,
+ 0x21, 0xa, 0xe, 0xe0, 0x7a, 0xc0, 0xf8, 0xdc,
+ 0xc0, 0x1, 0xb6, 0xc0, 0xf8, 0xdc, 0xc0, 0x3,
+ 0xf7, 0x54, 0xf7, 0x3f, 0x15, 0xb2, 0x64, 0xf7,
+ 0x31, 0xf7, 0x32, 0xf7, 0x32, 0xfb, 0x33, 0xb2,
+ 0xb1, 0xfb, 0x32, 0xf7, 0x33, 0xf7, 0x30, 0xf7,
+ 0x30, 0x64, 0xb1, 0xfb, 0x30, 0xfb, 0x30, 0xfb,
+ 0x31, 0xf7, 0x32, 0x64, 0x64, 0xf7, 0x31, 0xfb,
+ 0x31, 0x5, 0xfb, 0xc6, 0x16, 0x21, 0xa, 0xc0,
+ 0x16, 0xf7, 0x35, 0xf7, 0x17, 0x30, 0xa, 0xfb,
+ 0x17, 0xf7, 0x17, 0xf7, 0x35, 0x1e, 0xe, 0x72,
+ 0x8b, 0xc2, 0xf8, 0xff, 0x77, 0x1, 0xf7, 0xc6,
+ 0xc2, 0x3, 0x9a, 0x16, 0xf9, 0x11, 0xc2, 0xfb,
+ 0xb7, 0xf8, 0xff, 0x54, 0xfc, 0xff, 0xfb, 0xb7,
+ 0x6, 0xe, 0xfc, 0x45, 0xf7, 0x66, 0xef, 0x1,
+ 0xd0, 0xef, 0x3, 0xd0, 0xf7, 0x98, 0x15, 0x6f,
+ 0xa1, 0x75, 0xa7, 0xa6, 0xa2, 0xa1, 0xa7, 0xa6,
+ 0x74, 0xa2, 0x70, 0x6f, 0x75, 0x74, 0x70, 0x1e,
+ 0xe, 0x8e, 0x4d, 0x76, 0xf9, 0xe9, 0xf7, 0x2b,
+ 0x1, 0xf7, 0xe0, 0xd1, 0x3, 0xf7, 0xe0, 0x38,
+ 0x15, 0xd1, 0xf8, 0x13, 0x6, 0xf8, 0x88, 0xf7,
+ 0x33, 0xd0, 0xae, 0x93, 0x92, 0x89, 0x89, 0x8f,
+ 0x1e, 0x82, 0x86, 0x80, 0x79, 0x78, 0x1a, 0x73,
+ 0x9d, 0x6e, 0xb1, 0xb7, 0x9f, 0xb3, 0xb2, 0xaf,
+ 0x68, 0xaf, 0x5e, 0x4f, 0xfb, 0x87, 0x59, 0xfc,
+ 0xd3, 0x1e, 0xe, 0x8e, 0x3a, 0xf7, 0x29, 0xf9,
+ 0xe9, 0x77, 0x1, 0xf7, 0xee, 0xd0, 0x3, 0xf7,
+ 0x1e, 0x70, 0x15, 0x94, 0x90, 0x96, 0x9d, 0x9e,
+ 0x1a, 0xa3, 0x79, 0xa8, 0x65, 0x5f, 0x78, 0x64,
+ 0x64, 0x67, 0xad, 0x68, 0xb8, 0xc7, 0xf7, 0x81,
+ 0xbb, 0xf8, 0xd3, 0x1e, 0xf8, 0xf, 0x46, 0xfc,
+ 0x13, 0x7, 0xfc, 0x88, 0xfb, 0x2e, 0x46, 0x68,
+ 0x83, 0x84, 0x8d, 0x8d, 0x87, 0x1e, 0xe, 0x4c,
+ 0xa, 0xa4, 0xf7, 0xa6, 0x15, 0xf7, 0x7a, 0xfc,
+ 0x6c, 0xbe, 0xa4, 0xfb, 0x6e, 0xf8, 0x53, 0xf7,
+ 0x6e, 0xf8, 0x54, 0x58, 0xa3, 0x5, 0xe, 0x4c,
+ 0xa, 0xd3, 0xfb, 0x5a, 0x15, 0xf7, 0x7a, 0xf8,
+ 0x6c, 0xfb, 0x7a, 0xf8, 0x6c, 0x58, 0x73, 0xf7,
+ 0x6e, 0xfc, 0x54, 0xfb, 0x6e, 0xfc, 0x53, 0x5,
+ 0xe, 0xfb, 0x51, 0xa0, 0x76, 0xf9, 0x7d, 0x77,
+ 0x1, 0x9d, 0xc7, 0xf7, 0xde, 0xc7, 0x3, 0xf7,
+ 0x68, 0x16, 0xc7, 0x6, 0xf7, 0x58, 0xf8, 0xd,
+ 0xfb, 0x58, 0xf8, 0x4, 0x5, 0x4f, 0x6, 0xfb,
+ 0x56, 0xfc, 0x4, 0x5, 0xf7, 0x74, 0xfb, 0xd6,
+ 0x15, 0xfb, 0x38, 0xf7, 0xd6, 0xf7, 0x38, 0xf7,
+ 0xce, 0xf7, 0x3a, 0xfb, 0xce, 0x5, 0xe, 0xd1,
+ 0x7c, 0x76, 0xf8, 0xdc, 0x77, 0x1, 0xf7, 0xec,
+ 0xc1, 0x3, 0xf7, 0xbb, 0x67, 0x15, 0xf7, 0x2c,
+ 0x6, 0x84, 0x95, 0x62, 0xac, 0x8a, 0xce, 0x8,
+ 0xaf, 0x8a, 0x94, 0xa0, 0x9d, 0x1b, 0x91, 0x8f,
+ 0x86, 0x81, 0x90, 0x1f, 0x5d, 0xa2, 0xa2, 0x5e,
+ 0xcc, 0x1b, 0xbb, 0xaa, 0xc4, 0xbb, 0xc0, 0x74,
+ 0xb2, 0x61, 0xc2, 0x1f, 0x2d, 0xf7, 0x10, 0x6f,
+ 0xae, 0x44, 0xf7, 0x4, 0x44, 0xfb, 0x4, 0x6f,
+ 0x68, 0x2d, 0xfb, 0x10, 0x8, 0x61, 0x54, 0x74,
+ 0x64, 0x56, 0x1a, 0x5f, 0xa1, 0x4c, 0xcb, 0xc8,
+ 0xa6, 0xc6, 0xb1, 0x9c, 0x1e, 0x92, 0x8e, 0x8f,
+ 0x90, 0x94, 0x1b, 0x98, 0x97, 0x77, 0x65, 0x8a,
+ 0x1f, 0x8a, 0x48, 0x62, 0x6a, 0x84, 0x81, 0x8,
+ 0xe, 0xd1, 0x86, 0x76, 0xf7, 0x3c, 0xf7, 0x17,
+ 0x12, 0xf7, 0xe5, 0xd2, 0x4f, 0xbd, 0x13, 0xd0,
+ 0xf7, 0xbf, 0x71, 0x15, 0xf7, 0x28, 0x6, 0x70,
+ 0xac, 0x75, 0x9f, 0xcd, 0x1a, 0xaa, 0x8e, 0x9e,
+ 0x99, 0x95, 0x9a, 0x7e, 0x6f, 0xa2, 0x1e, 0x6b,
+ 0xa6, 0xab, 0x81, 0xb2, 0x1b, 0xc5, 0xb4, 0xc7,
+ 0xc9, 0xd1, 0x67, 0xc6, 0x47, 0x5f, 0x5e, 0x6d,
+ 0x83, 0x7c, 0x1f, 0x13, 0xe0, 0x70, 0x7d, 0x7a,
+ 0x92, 0x9a, 0x1a, 0x92, 0x8f, 0x92, 0x90, 0x90,
+ 0x1e, 0x9d, 0x9e, 0xcd, 0xb0, 0xd1, 0x1a, 0xd9,
+ 0x4b, 0xa8, 0x4b, 0x4a, 0x4b, 0x6c, 0x38, 0x48,
+ 0xd1, 0x67, 0x9a, 0x7b, 0x1e, 0x90, 0x85, 0x8e,
+ 0x85, 0x84, 0x1a, 0x7c, 0x79, 0x86, 0x72, 0x97,
+ 0x1e, 0x93, 0x7c, 0x64, 0xa9, 0x5f, 0x1b, 0x46,
+ 0x62, 0x53, 0x46, 0x47, 0xb5, 0x50, 0xcc, 0xaf,
+ 0xa8, 0x98, 0xa9, 0xa5, 0x1f, 0xa7, 0xa4, 0x9b,
+ 0x97, 0x94, 0x1b, 0x13, 0xd0, 0x99, 0x8b, 0x71,
+ 0x74, 0x49, 0x74, 0x76, 0x71, 0x6b, 0x1f, 0xe,
+ 0xd1, 0x7f, 0x76, 0xf8, 0xc9, 0x77, 0x1, 0xf8,
+ 0xa, 0x6a, 0x15, 0xd9, 0xf7, 0x7, 0x9a, 0xa7,
+ 0xe6, 0xf7, 0x9, 0x8, 0xb4, 0xc0, 0xab, 0xc0,
+ 0xc4, 0x1a, 0xf7, 0x8, 0x43, 0xa5, 0x61, 0x5d,
+ 0x5d, 0x76, 0x48, 0x72, 0x1e, 0x78, 0x83, 0x88,
+ 0x75, 0x7c, 0x1b, 0x7c, 0x88, 0xa1, 0x9e, 0x83,
+ 0x1f, 0xce, 0x72, 0x5d, 0xa0, 0x5d, 0x1b, 0x61,
+ 0x43, 0x71, 0xfb, 0x8, 0x52, 0xab, 0x56, 0xb4,
+ 0x56, 0x1f, 0xe6, 0xfb, 0x9, 0x9a, 0x6f, 0xd9,
+ 0xfb, 0x7, 0x8, 0xe, 0xd1, 0x7c, 0x76, 0xf8,
+ 0xde, 0x77, 0x1, 0xf7, 0x22, 0xf8, 0x5e, 0x3,
+ 0xf7, 0x22, 0xf7, 0x95, 0x15, 0xf7, 0x7c, 0xfb,
+ 0xb9, 0xf7, 0x76, 0xf7, 0xb9, 0xfb, 0x76, 0xf7,
+ 0xb9, 0x5, 0xe, 0xf6, 0x7c, 0xb3, 0xf3, 0xb1,
+ 0xf7, 0xdb, 0xa5, 0xf7, 0x7, 0xb3, 0x1, 0xbe,
+ 0xb3, 0xf7, 0xa, 0xcc, 0xf7, 0x92, 0x9f, 0xf7,
+ 0x2d, 0xb3, 0x3, 0xf8, 0xaf, 0xf7, 0x70, 0x15,
+ 0x62, 0x59, 0x6a, 0x7f, 0x5e, 0x1b, 0x40, 0x4d,
+ 0xc7, 0xf1, 0xd5, 0xb8, 0xe6, 0xdc, 0xc6, 0xc6,
+ 0x6c, 0x42, 0x95, 0x1f, 0x9f, 0x6, 0x87, 0xf7,
+ 0x14, 0x5, 0x78, 0x6, 0x88, 0x7d, 0x7c, 0x86,
+ 0x79, 0x8f, 0x8, 0x90, 0x76, 0x6b, 0x97, 0x64,
+ 0x1b, 0x24, 0x36, 0x31, 0x23, 0xfb, 0x9, 0xdb,
+ 0x3b, 0xf7, 0xb, 0xd7, 0xb7, 0xbd, 0xa2, 0xa1,
+ 0x1f, 0xfc, 0x87, 0xf7, 0x14, 0x23, 0xa, 0xf6,
+ 0x7a, 0xb3, 0xf7, 0x18, 0x9d, 0xf7, 0x31, 0xa2,
+ 0xf7, 0x32, 0xa3, 0xed, 0xb3, 0x1, 0xbd, 0xb3,
+ 0xf7, 0x51, 0xcb, 0xf7, 0x17, 0xcf, 0xf7, 0x32,
+ 0xb3, 0x3, 0xbd, 0xf7, 0xdc, 0x4f, 0xa, 0xf7,
+ 0x52, 0xf7, 0x2f, 0xf7, 0x2e, 0xf7, 0x53, 0x48,
+ 0xa, 0xfb, 0x2f, 0xfb, 0x2f, 0xfb, 0x52, 0x8c,
+ 0x2c, 0xa, 0x1e, 0xfb, 0x3d, 0x8a, 0xfb, 0x1c,
+ 0x43, 0xa, 0x1a, 0xf7, 0x20, 0xfb, 0x40, 0x15,
+ 0xf7, 0x34, 0x9d, 0x6, 0x75, 0x72, 0x9a, 0xa3,
+ 0x1f, 0xf7, 0xa, 0xa5, 0x7, 0xf7, 0x19, 0xfb,
+ 0x43, 0x5, 0xea, 0x9d, 0x6, 0x7e, 0x7f, 0x8b,
+ 0x99, 0x80, 0x1f, 0xfb, 0xc, 0xf7, 0x2c, 0x5,
+ 0xc5, 0x9c, 0xb6, 0xa2, 0xc9, 0x1a, 0xd8, 0x3b,
+ 0x9c, 0x4f, 0x1e, 0xfb, 0x3b, 0x79, 0x6, 0xb3,
+ 0x8f, 0x80, 0x6e, 0x1f, 0xfb, 0xa0, 0x7, 0x78,
+ 0x71, 0x7a, 0x74, 0x1e, 0xf7, 0x5, 0xf7, 0x48,
+ 0x15, 0xf7, 0x12, 0x7, 0x9c, 0x95, 0x9a, 0x95,
+ 0xcf, 0xb5, 0x79, 0x58, 0x8c, 0x1e, 0x39, 0x43,
+ 0x85, 0x50, 0x8a, 0x1e, 0xe, 0xf7, 0x63, 0xf7,
+ 0xce, 0x76, 0xf7, 0xf9, 0xa2, 0x79, 0x9d, 0x12,
+ 0x9d, 0x9d, 0xf7, 0x6, 0xc6, 0xf7, 0x6, 0x9d,
+ 0xdd, 0xa6, 0xf7, 0xbc, 0xc6, 0x13, 0xdf, 0xee,
+ 0xf7, 0xb9, 0x15, 0xf7, 0x34, 0x9d, 0x6, 0x6c,
+ 0x78, 0x9a, 0xa2, 0x1f, 0xf7, 0xc2, 0x7, 0xb0,
+ 0x8a, 0xc3, 0x89, 0xa2, 0x6e, 0x89, 0x5f, 0x19,
+ 0x9d, 0x8c, 0x88, 0xec, 0x5, 0xfb, 0xd1, 0x6,
+ 0x88, 0x2a, 0x9d, 0x8a, 0x89, 0xb7, 0xa2, 0xa8,
+ 0xc3, 0x8d, 0x19, 0xb0, 0x8c, 0x5, 0xfb, 0xc2,
+ 0x4a, 0xa, 0xf7, 0xa5, 0x79, 0x15, 0xf7, 0x15,
+ 0x9d, 0x6, 0x6c, 0x77, 0x9a, 0xa2, 0x1f, 0xf7,
+ 0x8f, 0x7, 0xf7, 0x24, 0xfb, 0xc7, 0x5, 0x9d,
+ 0x6, 0xf7, 0x1a, 0xf7, 0xd7, 0x5, 0xfb, 0x9f,
+ 0x4a, 0xa, 0x79, 0xf7, 0x34, 0x9d, 0x7, 0x6c,
+ 0x78, 0x9a, 0xa2, 0x1f, 0xf7, 0xad, 0x7, 0x13,
+ 0xbf, 0xa6, 0xa8, 0x89, 0xa0, 0x1e, 0x9d, 0xfb,
+ 0x5, 0x7, 0xfb, 0x12, 0xfb, 0xb4, 0xfb, 0x18,
+ 0xf7, 0xb4, 0x5, 0xfb, 0x6, 0x79, 0x6, 0xab,
+ 0xa0, 0x8e, 0x65, 0x1f, 0xfb, 0xa3, 0x4a, 0xa,
+ 0xe, 0xfb, 0x4b, 0xfa, 0x5, 0xaf, 0x1, 0xf8,
+ 0x74, 0xfa, 0x5, 0x15, 0xf8, 0xf6, 0xaf, 0xfc,
+ 0xf6, 0x6, 0xe, 0x3b, 0x28, 0x76, 0xfa, 0xfe,
+ 0x49, 0xa, 0xf7, 0xac, 0xfb, 0xc, 0x15, 0xc3,
+ 0xfa, 0xfe, 0x53, 0x6, 0xe, 0xf7, 0xd1, 0xf7,
+ 0x70, 0xc3, 0x1, 0x4f, 0xfa, 0xea, 0x3, 0x4f,
+ 0xf7, 0x70, 0x15, 0xfa, 0xea, 0xc3, 0xfe, 0xea,
+ 0x6, 0xe, 0xf6, 0x77, 0xb3, 0xf7, 0xb4, 0xb6,
+ 0xf7, 0x17, 0xb6, 0xf4, 0xb3, 0x1, 0xbd, 0xb3,
+ 0xf7, 0x44, 0xbc, 0xf7, 0x54, 0xb9, 0xf7, 0x27,
+ 0xb3, 0x3, 0xbd, 0xf7, 0xd9, 0x4f, 0xa, 0x1e,
+ 0xf7, 0x52, 0x8c, 0xf7, 0x2f, 0xf7, 0x2d, 0xf7,
+ 0x53, 0x1a, 0x48, 0xa, 0xfb, 0x2e, 0xfb, 0x2f,
+ 0xfb, 0x52, 0x2c, 0xa, 0xfb, 0x3d, 0xfb, 0x1c,
+ 0xf7, 0x1c, 0xf7, 0x3c, 0x1e, 0xf7, 0x44, 0xfb,
+ 0x50, 0x15, 0xbc, 0xf7, 0x40, 0xf7, 0x11, 0x6,
+ 0xd2, 0x82, 0x3c, 0x67, 0x8c, 0x1f, 0x8c, 0x6f,
+ 0x93, 0x89, 0x94, 0x79, 0x8, 0x9e, 0xa1, 0x8b,
+ 0x9e, 0x1b, 0x73, 0xa7, 0x87, 0xa3, 0xb0, 0x1a,
+ 0xbe, 0x7c, 0xa6, 0x6c, 0xa0, 0x1e, 0xb0, 0xa7,
+ 0x98, 0x9d, 0xbc, 0x1a, 0xe1, 0x4d, 0x96, 0x50,
+ 0x1e, 0xfb, 0x3e, 0x6, 0xbc, 0xfb, 0x42, 0x15,
+ 0xf7, 0x17, 0xf7, 0xe, 0x7, 0xa9, 0xb3, 0x83,
+ 0x4a, 0x5a, 0x66, 0x82, 0x6a, 0x1f, 0xe, 0xf6,
+ 0x7c, 0xb3, 0xef, 0xb9, 0xf7, 0xcc, 0xb6, 0xf7,
+ 0x1, 0xb3, 0x1, 0xbc, 0xb3, 0xf7, 0x1e, 0xbc,
+ 0xf7, 0x80, 0xb8, 0xf7, 0x22, 0xb3, 0x3, 0xf8,
+ 0x94, 0xf7, 0xa6, 0x15, 0x52, 0x59, 0x5d, 0x52,
+ 0x35, 0x60, 0xe5, 0xd6, 0xdd, 0xb7, 0xcc, 0xd8,
+ 0xce, 0xb3, 0x6f, 0x58, 0x8d, 0x1e, 0xbe, 0x6,
+ 0xe5, 0x89, 0x44, 0xab, 0x33, 0x1b, 0xfb, 0x0,
+ 0x4e, 0x33, 0x23, 0xfb, 0x4, 0xcd, 0x2a, 0xf7,
+ 0x4, 0xf7, 0x0, 0xb9, 0xe7, 0xc4, 0x1f, 0xfc,
+ 0x92, 0xc3, 0x23, 0xa, 0xf2, 0xf7, 0xce, 0x76,
+ 0xf7, 0xe5, 0xb6, 0x1, 0xf7, 0x16, 0xbc, 0xf7,
+ 0x50, 0xbc, 0xf7, 0x98, 0xbc, 0x3, 0xf7, 0x16,
+ 0xf7, 0xb9, 0x15, 0xbc, 0xf7, 0xe5, 0xf7, 0x11,
+ 0xb6, 0xfb, 0xbf, 0x60, 0xf7, 0x11, 0x6, 0xf7,
+ 0x81, 0xfb, 0xe5, 0x15, 0xbc, 0xf7, 0xc9, 0x6,
+ 0xf4, 0xfb, 0xc4, 0x5, 0xbd, 0x6, 0xf4, 0xf7,
+ 0xc4, 0x5, 0xfb, 0xc9, 0xbc, 0xf8, 0x10, 0x44,
+ 0x7, 0xfb, 0x0, 0xfb, 0xd2, 0xfb, 0x0, 0xf7,
+ 0xd2, 0x5, 0x44, 0x6, 0xe, 0xfb, 0xbf, 0xfb,
+ 0xb9, 0x1c, 0x4, 0xb9, 0x1, 0xa3, 0xdf, 0x3,
+ 0xa3, 0xfb, 0xb9, 0x15, 0xdf, 0xf8, 0x2e, 0x6,
+ 0xf7, 0xf3, 0xf5, 0xf7, 0xc9, 0xf7, 0x72, 0xf7,
+ 0x1f, 0x1e, 0x7e, 0x95, 0x5, 0xfb, 0x57, 0x2a,
+ 0xfb, 0x60, 0xfb, 0x62, 0xfc, 0x8e, 0x1a, 0xe,
+ 0xfb, 0xbf, 0xfa, 0x31, 0x8b, 0x1, 0xa3, 0xdf,
+ 0x3, 0xa3, 0x54, 0xa, 0x3f, 0xa, 0xa3, 0xdf,
+ 0x3, 0xf8, 0x41, 0xfb, 0xb9, 0x15, 0x92, 0x95,
+ 0x5, 0xfb, 0x72, 0xf7, 0x29, 0x21, 0xf7, 0xbf,
+ 0xf7, 0xf3, 0x1a, 0xf8, 0x2e, 0x37, 0xfc, 0x2e,
+ 0x7, 0xfc, 0x8e, 0xf7, 0x65, 0xfb, 0x58, 0xf7,
+ 0x57, 0x20, 0x1e, 0xe, 0xfb, 0xbf, 0xfa, 0x9,
+ 0xb4, 0x1, 0x8b, 0xd8, 0x3, 0x3b, 0x4, 0xd8,
+ 0xf9, 0xd2, 0x6, 0xf7, 0x11, 0x9b, 0x95, 0xf7,
+ 0x11, 0x1e, 0xf7, 0x17, 0xb4, 0xfb, 0xf1, 0x6,
+ 0xe, 0xfb, 0xbf, 0x3c, 0xfa, 0x80, 0x1, 0x8b,
+ 0xd8, 0x3, 0x3c, 0x4, 0xd8, 0xfa, 0x80, 0x3e,
+ 0x6, 0xe, 0xfb, 0xbf, 0x3b, 0xb4, 0x1, 0x8b,
+ 0xd8, 0x3, 0x3b, 0x4, 0xf7, 0xe8, 0xb4, 0xfb,
+ 0xe, 0x6, 0xfb, 0x11, 0x7b, 0x95, 0xf7, 0x11,
+ 0x1f, 0xf9, 0xd2, 0x3e, 0x7, 0xe, 0xfb, 0x51,
+ 0xfa, 0x13, 0xa9, 0x35, 0xa, 0xf7, 0xb0, 0x36,
+ 0x15, 0xf9, 0xc8, 0x7, 0xf7, 0x2, 0x91, 0xbd,
+ 0xdb, 0x1e, 0xd6, 0xa9, 0x40, 0x6, 0xfb, 0x2,
+ 0x58, 0x6e, 0xfb, 0x35, 0x1f, 0xfd, 0xc8, 0x7,
+ 0xe, 0x2d, 0xa, 0xf7, 0x7f, 0x6, 0xf7, 0x2d,
+ 0x4c, 0xde, 0xfb, 0x1c, 0xb2, 0x1e, 0xf7, 0x1c,
+ 0xb2, 0xca, 0xde, 0xf7, 0x2d, 0x1a, 0xf7, 0x7f,
+ 0x40, 0xfb, 0x7f, 0x7, 0x27, 0x67, 0xfb, 0x7,
+ 0xfb, 0x2d, 0x5e, 0x1e, 0x6d, 0x7, 0xf7, 0x2d,
+ 0x5e, 0xaf, 0xfb, 0x7, 0x27, 0x1a, 0xe, 0x53,
+ 0xa, 0xf7, 0x65, 0xfa, 0x3b, 0x15, 0xfd, 0xcc,
+ 0x7, 0xfb, 0x35, 0xb4, 0x72, 0xf7, 0x2, 0x1e,
+ 0xe0, 0xa9, 0x36, 0x6, 0x3b, 0x8f, 0xb9, 0xf7,
+ 0x2, 0x1f, 0xf9, 0xcc, 0x7, 0xe, 0x2d, 0xa,
+ 0xfa, 0x90, 0x40, 0x6, 0xe, 0x8e, 0x33, 0xfa,
+ 0xbb, 0x1, 0xf7, 0xc8, 0xd1, 0x3, 0xf7, 0xc8,
+ 0x33, 0x15, 0xd1, 0xfa, 0xbb, 0x45, 0x6, 0xe,
+ 0x3f, 0xa, 0xf8, 0x12, 0xdf, 0x3, 0xf8, 0x12,
+ 0xfb, 0xb9, 0x15, 0xdf, 0xf8, 0x38, 0x6, 0xf8,
+ 0x8e, 0xfb, 0x60, 0xf7, 0x58, 0xfb, 0x57, 0xec,
+ 0x1e, 0x7e, 0x81, 0x5, 0xf7, 0x72, 0xfb, 0x1f,
+ 0xf5, 0xfb, 0xbf, 0xfb, 0xf3, 0x1a, 0xe, 0xfb,
+ 0xbf, 0x36, 0xfa, 0x86, 0x1, 0xf8, 0x12, 0xdf,
+ 0x3, 0xf8, 0x12, 0x54, 0xa, 0x3f, 0xa, 0xf8,
+ 0x12, 0xdf, 0x3, 0xc1, 0xfb, 0xaf, 0x15, 0x98,
+ 0x81, 0x5, 0xf7, 0x57, 0xec, 0xf7, 0x60, 0xf7,
+ 0x5d, 0xf8, 0x8e, 0x1a, 0xf8, 0x33, 0x37, 0xfc,
+ 0x33, 0x7, 0xfb, 0xf3, 0x21, 0xfb, 0xc4, 0xfb,
+ 0x72, 0xfb, 0x1f, 0x1e, 0xe, 0xfb, 0xbf, 0xfa,
+ 0x9, 0xb4, 0x1, 0xf7, 0xb9, 0xd9, 0x3, 0xf7,
+ 0xb9, 0x3b, 0x15, 0xd9, 0xfa, 0x82, 0xfb, 0xf1,
+ 0x62, 0xf7, 0x1b, 0x6, 0xf7, 0x11, 0x96, 0x80,
+ 0xfb, 0x11, 0x1f, 0xe, 0xfb, 0xbf, 0x3c, 0xfa,
+ 0x80, 0x1, 0xf7, 0xba, 0xd8, 0x3, 0xf7, 0xba,
+ 0x3c, 0x15, 0xd8, 0xfa, 0x80, 0x3e, 0x6, 0xe,
+ 0xfb, 0xbf, 0x3b, 0xb4, 0x1, 0xf7, 0xba, 0xd8,
+ 0x3, 0xa1, 0x64, 0x15, 0x62, 0xf7, 0xf1, 0xfa,
+ 0x82, 0x3e, 0xfd, 0xcf, 0x7, 0xfb, 0x13, 0x79,
+ 0x80, 0xfb, 0x11, 0x1e, 0xe, 0xfb, 0x51, 0xfa,
+ 0x13, 0xa9, 0x2e, 0xa, 0xf9, 0xc8, 0x6, 0xf7,
+ 0x2c, 0x74, 0xb1, 0xfb, 0x19, 0x1e, 0x3b, 0x6d,
+ 0xdb, 0x6, 0xd1, 0x96, 0x5f, 0xfb, 0x8, 0x1f,
+ 0xe, 0x2d, 0xa, 0xf7, 0x80, 0x6, 0xef, 0xaf,
+ 0xf7, 0x6, 0xf7, 0x2d, 0xb8, 0x1e, 0xa9, 0x7,
+ 0xfb, 0x2d, 0xb8, 0x67, 0xf7, 0x6, 0xef, 0x1a,
+ 0xf7, 0x80, 0x40, 0xfb, 0x80, 0x7, 0xfb, 0x2d,
+ 0xca, 0x39, 0xf7, 0x1c, 0x64, 0x1e, 0xfb, 0x1c,
+ 0x64, 0x4c, 0x39, 0xfb, 0x2d, 0x1a, 0xe, 0x53,
+ 0xa, 0xbb, 0x5e, 0x15, 0x6d, 0xdb, 0x7, 0xf7,
+ 0x16, 0xa5, 0xb3, 0xf7, 0x2b, 0x1f, 0xf9, 0xc7,
+ 0x40, 0xfd, 0xc7, 0x7, 0xfb, 0x16, 0x80, 0x6c,
+ 0x45, 0x1e, 0xe, 0xf6, 0x9d, 0x76, 0xf8, 0xff,
+ 0xf7, 0x54, 0x1, 0xf9, 0x71, 0xf7, 0x69, 0x15,
+ 0x3f, 0xa0, 0x65, 0xd3, 0xd4, 0x1a, 0xce, 0xa9,
+ 0xcd, 0xca, 0xa9, 0x1e, 0xbf, 0x6e, 0x41, 0xa4,
+ 0x52, 0x1b, 0x6e, 0x76, 0x84, 0x83, 0x76, 0x1f,
+ 0x83, 0x76, 0x75, 0x83, 0x6e, 0x1b, 0x72, 0x75,
+ 0x93, 0x93, 0x76, 0x1f, 0x94, 0x74, 0x75, 0x94,
+ 0x70, 0x1b, 0xfb, 0x3, 0x25, 0x2b, 0xfb, 0x21,
+ 0xfb, 0x1a, 0xd2, 0xfb, 0x92, 0xf7, 0x37, 0xa5,
+ 0x9e, 0x96, 0x94, 0xa0, 0x1f, 0x92, 0x9b, 0x9b,
+ 0x91, 0xa0, 0x1b, 0xa1, 0x9b, 0x85, 0x85, 0x9a,
+ 0x1f, 0x82, 0xa1, 0x9d, 0x7f, 0xa7, 0x1b, 0xe1,
+ 0xb5, 0xe2, 0xf7, 0x15, 0xd6, 0x1f, 0xfb, 0xdb,
+ 0xf8, 0x27, 0x15, 0xe6, 0x88, 0xe5, 0xf0, 0x76,
+ 0xe9, 0x8, 0x3c, 0x35, 0x2b, 0x2b, 0x90, 0x1f,
+ 0xe, 0x78, 0x9e, 0xf8, 0x7b, 0x98, 0xf7, 0x41,
+ 0x9a, 0x6, 0x1e, 0xa0, 0x39, 0x63, 0xff, 0xc,
+ 0x9, 0xe7, 0xa, 0xe0, 0xb, 0x9f, 0xd3, 0xc,
+ 0xc, 0xf8, 0xb9, 0x14, 0xf9, 0x3f, 0x15, 0xab,
+ 0x13, 0x0, 0x3a, 0x2, 0x0, 0x1, 0x0, 0x13,
+ 0x0, 0x2d, 0x0, 0x30, 0x0, 0x47, 0x0, 0x4f,
+ 0x0, 0x56, 0x0, 0x5d, 0x0, 0x61, 0x0, 0x67,
+ 0x0, 0x7c, 0x0, 0x82, 0x0, 0x8b, 0x0, 0xa6,
+ 0x0, 0xae, 0x0, 0xb4, 0x0, 0xba, 0x0, 0xc7,
+ 0x0, 0xce, 0x0, 0xe3, 0x0, 0xed, 0x0, 0xf6,
+ 0x0, 0xfc, 0x1, 0xa, 0x1, 0xe, 0x1, 0x19,
+ 0x1, 0x1c, 0x1, 0x23, 0x1, 0x2a, 0x1, 0x31,
+ 0x1, 0x40, 0x1, 0x4d, 0x1, 0x56, 0x1, 0x5f,
+ 0x1, 0x66, 0x1, 0x6d, 0x1, 0x72, 0x1, 0x77,
+ 0x1, 0x7c, 0x1, 0x88, 0x1, 0x8e, 0x1, 0x99,
+ 0x1, 0xa0, 0x1, 0xa7, 0x1, 0xac, 0x1, 0xb6,
+ 0x1, 0xc0, 0x1, 0xca, 0x1, 0xce, 0x1, 0xd8,
+ 0x1, 0xe2, 0x1, 0xec, 0x1, 0xf3, 0x1, 0xfb,
+ 0x2, 0x4, 0x2, 0x9, 0x2, 0x12, 0x2, 0x19,
+ 0x2, 0x1f, 0x6c, 0xa4, 0x72, 0xaa, 0xaa, 0xa4,
+ 0xa4, 0xaa, 0xaa, 0x72, 0xa4, 0x6c, 0x6c, 0x72,
+ 0x72, 0x6c, 0x1e, 0xb, 0x2b, 0xa, 0xf7, 0x53,
+ 0xf7, 0x2e, 0xf7, 0x2e, 0x4b, 0xa, 0xfb, 0x2e,
+ 0xf7, 0x2e, 0xfb, 0x53, 0xfb, 0x53, 0xfb, 0x2e,
+ 0xfb, 0x2e, 0xfb, 0x53, 0x1e, 0xb, 0x20, 0xa,
+ 0xe, 0x15, 0x21, 0xa, 0xb3, 0x16, 0xf7, 0x3c,
+ 0xf7, 0x1d, 0x43, 0xa, 0xf7, 0x3c, 0xf7, 0x1d,
+ 0x34, 0xa, 0x34, 0xa, 0x43, 0xa, 0x1e, 0xe,
+ 0x16, 0xf7, 0xb0, 0x9d, 0x6, 0x2a, 0xa, 0xb,
+ 0x2f, 0xa, 0xfc, 0x7d, 0x27, 0xa, 0xb, 0x7,
+ 0x3c, 0xa, 0xfc, 0x7d, 0x39, 0xa, 0x7, 0x28,
+ 0xa, 0xb, 0x54, 0x68, 0x78, 0x54, 0x1e, 0xb,
+ 0x6d, 0xa4, 0x72, 0xaa, 0x1e, 0xa9, 0x8c, 0xa5,
+ 0xa3, 0xaa, 0x1a, 0xa9, 0x71, 0xa5, 0x6d, 0x6c,
+ 0x72, 0x71, 0x6c, 0x1e, 0xb, 0x54, 0x68, 0x9e,
+ 0xc2, 0x1f, 0xb, 0xfb, 0x53, 0xf7, 0x2e, 0xfb,
+ 0x2e, 0xf7, 0x53, 0xb, 0x1e, 0xb3, 0x8a, 0x15,
+ 0xf7, 0x3d, 0xf7, 0x1c, 0x43, 0xa, 0xf7, 0x3d,
+ 0xf7, 0x1d, 0xfb, 0x1d, 0xfb, 0x3c, 0xfb, 0x3d,
+ 0xfb, 0x1d, 0xfb, 0x1c, 0xfb, 0x3c, 0xb, 0xfb,
+ 0x51, 0x36, 0xfa, 0x90, 0x2e, 0xa, 0xb, 0x44,
+ 0xa, 0x36, 0x15, 0xd6, 0xb, 0xc2, 0xae, 0x78,
+ 0x54, 0x1f, 0xb, 0xf7, 0x17, 0xf7, 0x35, 0xf7,
+ 0x35, 0xf7, 0x17, 0x56, 0xa, 0x41, 0xa, 0xb,
+ 0xc2, 0xae, 0x9e, 0xc2, 0x1e, 0x9d, 0xb, 0x82,
+ 0xb9, 0x1b, 0xc5, 0xc7, 0xb4, 0xa8, 0x9a, 0x1f,
+ 0x68, 0xac, 0x5, 0x7c, 0x7d, 0x72, 0x66, 0x53,
+ 0x1b, 0x62, 0x66, 0xb, 0x1e, 0xfb, 0xa9, 0x79,
+ 0x6, 0x25, 0xa, 0xf7, 0x56, 0xb, 0xfb, 0x1d,
+ 0xfb, 0x3c, 0xfb, 0x3c, 0xfb, 0x1d, 0xb, 0x1,
+ 0xf7, 0x65, 0xd6, 0x3, 0xb, 0xf7, 0x5c, 0x40,
+ 0xa, 0x6f, 0xa1, 0x6c, 0x7b, 0x7b, 0x85, 0x81,
+ 0x87, 0x1e, 0xb, 0x15, 0x20, 0xa, 0xb, 0x88,
+ 0x85, 0x8b, 0x89, 0x8a, 0x1a, 0x7c, 0x9a, 0x85,
+ 0x96, 0xb, 0x27, 0xa, 0xe, 0xf8, 0xa2, 0xc2,
+ 0xfc, 0xa2, 0x6, 0xb, 0xa0, 0x76, 0xf9, 0x35,
+ 0x77, 0x1, 0xb, 0x31, 0xa, 0xfb, 0xb0, 0x45,
+ 0xa, 0xb, 0x8b, 0xc2, 0xf8, 0xdc, 0x77, 0x1,
+ 0xa8, 0x16, 0xf8, 0x85, 0xc2, 0xfc, 0x85, 0x6,
+ 0xb, 0xf8, 0x45, 0xf7, 0x5b, 0x5, 0xc9, 0x7,
+ 0xfc, 0x85, 0xfb, 0x7a, 0x5, 0xe, 0xfb, 0xbf,
+ 0xfb, 0xb9, 0x1c, 0x4, 0xc3, 0x1, 0xb, 0x5,
+ 0x8f, 0x8f, 0x8d, 0x95, 0x91, 0x1a, 0xa8, 0xb,
+ 0xfb, 0x17, 0xfb, 0x35, 0xfb, 0x35, 0xb, 0xf8,
+ 0xa0, 0xc2, 0xfc, 0xa0, 0x6, 0xb, 0xf7, 0x1d,
+ 0xf7, 0x3c, 0xb, 0x35, 0xa, 0xf7, 0x65, 0xb,
+ 0x79, 0x7, 0x2f, 0xa, 0xb, 0xf7, 0xc4, 0x91,
+ 0x76, 0xf7, 0x7f, 0xc3, 0xf7, 0x7f, 0x77, 0x1,
+ 0xb, 0xc2, 0xf7, 0xfc, 0xc2, 0x1, 0xb, 0xf7,
+ 0x52, 0xfb, 0x2f, 0xf7, 0x2f, 0xfb, 0x52, 0xfb,
+ 0x53, 0xb, 0x77, 0x1, 0xf7, 0xac, 0xc3, 0x3,
+ 0xb, 0x7, 0x74, 0x77, 0x7c, 0x6c, 0x1e, 0xb,
+ 0xf7, 0x53, 0xf7, 0x53, 0xb, 0xfb, 0xf6, 0xfb,
+ 0x45, 0x76, 0xfa, 0x44, 0x77, 0x1, 0xb, 0xfb,
+ 0x5f, 0xfb, 0x4b, 0xa4, 0xf9, 0xba, 0xa4, 0x1,
+ 0xb, 0xfb, 0xf2, 0xfb, 0x2f, 0xa4, 0xf9, 0x9f,
+ 0xa4, 0x1, 0xb, 0x15, 0x2b, 0xa, 0xb, 0xfb,
+ 0xf2, 0xfb, 0x3e, 0x76, 0xf9, 0xf4, 0x77, 0x1,
+ 0xb, 0xc9, 0x7, 0xfc, 0x85, 0xf7, 0x7a, 0x5,
+ 0x4d, 0x7, 0xb, 0x67, 0xa8, 0x6e, 0xaf, 0xaf,
+ 0xa7, 0xa8, 0xaf, 0xaf, 0xb, 0xfb, 0x51, 0x40,
+ 0xa9, 0x35, 0xa, 0xb, 0x36, 0x15, 0xdf, 0xfa,
+ 0x86, 0x37, 0x6, 0xe, 0x1, 0xb3, 0xc2, 0xf8,
+ 0xda, 0xc2, 0x3, 0xb3, 0xb, 0x41, 0xa, 0xfb,
+ 0x17, 0xb, 0x15, 0xa9, 0xa6, 0xaa, 0x9f, 0xb8,
+ 0x1b, 0xaa, 0xb, 0x8a, 0x1f, 0xfc, 0x29, 0x54,
+ 0x6, 0xe, 0x90, 0x90, 0x8f, 0x8e, 0x8d, 0xb
+ };
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/foxitnames.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/foxitnames.h
new file mode 100644
index 0000000000..c5ccbaf64a
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/foxitnames.h
@@ -0,0 +1,288 @@
+#ifndef _FX_FREETYPE_DONT_RENAME_
+
+#ifdef _MSC_VER
+#define _CRT_SECURE_NO_WARNINGS
+#endif
+
+// To avoid any possible linking confliction, we rename all FreeType exported names
+
+#define FT_Init_FreeType FPDFAPI_FT_Init_FreeType
+#define FT_Done_FreeType FPDFAPI_FT_Done_FreeType
+#define FT_New_Face FPDFAPI_FT_New_Face
+#define FT_Select_Charmap FPDFAPI_FT_Select_Charmap
+#define FT_Done_Face FPDFAPI_FT_Done_Face
+#define FT_Get_Charmap_Index FPDFAPI_FT_Get_Charmap_Index
+#define FT_New_Memory_Face FPDFAPI_FT_New_Memory_Face
+#define FT_MulDiv FPDFAPI_FT_MulDiv
+#define FT_Vector_Transform FPDFAPI_FT_Vector_Transform
+#define FT_Cos FPDFAPI_FT_Cos
+#define FT_Sin FPDFAPI_FT_Sin
+#define FT_Load_Glyph FPDFAPI_FT_Load_Glyph
+#define FT_DivFix FPDFAPI_FT_DivFix
+#define FT_Realloc FPDFAPI_FT_Realloc
+#define FT_Alloc FPDFAPI_FT_Alloc
+#define FT_Get_Char_Index FPDFAPI_FT_Get_Char_Index
+#define FT_GlyphLoader_CheckPoints FPDFAPI_FT_GlyphLoader_CheckPoints
+#define FT_GlyphLoader_Add FPDFAPI_FT_GlyphLoader_Add
+#define FT_GlyphLoader_CheckSubGlyphs FPDFAPI_FT_GlyphLoader_CheckSubGlyphs
+#define FT_Outline_Translate FPDFAPI_FT_Outline_Translate
+#define FT_Outline_Transform FPDFAPI_FT_Outline_Transform
+#define FT_Outline_Get_CBox FPDFAPI_FT_Outline_Get_CBox
+#define FT_GlyphLoader_Rewind FPDFAPI_FT_GlyphLoader_Rewind
+#define FT_GlyphLoader_CopyPoints FPDFAPI_FT_GlyphLoader_CopyPoints
+#define FT_GlyphLoader_New FPDFAPI_FT_GlyphLoader_New
+#define FT_GlyphLoader_CreateExtra FPDFAPI_FT_GlyphLoader_CreateExtra
+#define FT_Free FPDFAPI_FT_Free
+#define FT_Set_Charmap FPDFAPI_FT_Set_Charmap
+#define FT_GlyphLoader_Done FPDFAPI_FT_GlyphLoader_Done
+#define _debug_mem_dummy FPDFAPI__debug_mem_dummy
+#define _debug_mem_dummy FPDFAPI__debug_mem_dummy
+#define FT_QAlloc FPDFAPI_FT_QAlloc
+#define FT_QRealloc FPDFAPI_FT_QRealloc
+#define FT_List_Find FPDFAPI_FT_List_Find
+#define FT_List_Add FPDFAPI_FT_List_Add
+#define FT_List_Insert FPDFAPI_FT_List_Insert
+#define FT_List_Remove FPDFAPI_FT_List_Remove
+#define FT_List_Up FPDFAPI_FT_List_Up
+#define FT_List_Iterate FPDFAPI_FT_List_Iterate
+#define FT_List_Finalize FPDFAPI_FT_List_Finalize
+#define ft_highpow2 FPDFAPI_ft_highpow2
+#define FT_Stream_OpenMemory FPDFAPI_FT_Stream_OpenMemory
+#define FT_Stream_Close FPDFAPI_FT_Stream_Close
+#define FT_Stream_Seek FPDFAPI_FT_Stream_Seek
+#define FT_Stream_Skip FPDFAPI_FT_Stream_Skip
+#define FT_Stream_Pos FPDFAPI_FT_Stream_Pos
+#define FT_Stream_ReadAt FPDFAPI_FT_Stream_ReadAt
+#define FT_Stream_Read FPDFAPI_FT_Stream_Read
+#define FT_Stream_TryRead FPDFAPI_FT_Stream_TryRead
+#define FT_Stream_EnterFrame FPDFAPI_FT_Stream_EnterFrame
+#define FT_Stream_ExtractFrame FPDFAPI_FT_Stream_ExtractFrame
+#define FT_Stream_ReleaseFrame FPDFAPI_FT_Stream_ReleaseFrame
+#define FT_Stream_ExitFrame FPDFAPI_FT_Stream_ExitFrame
+#define FT_Stream_GetChar FPDFAPI_FT_Stream_GetChar
+#define FT_Stream_GetShort FPDFAPI_FT_Stream_GetShort
+#define FT_Stream_GetShortLE FPDFAPI_FT_Stream_GetShortLE
+#define FT_Stream_GetOffset FPDFAPI_FT_Stream_GetOffset
+#define FT_Stream_GetLong FPDFAPI_FT_Stream_GetLong
+#define FT_Stream_GetLongLE FPDFAPI_FT_Stream_GetLongLE
+#define FT_Stream_ReadChar FPDFAPI_FT_Stream_ReadChar
+#define FT_Stream_ReadShort FPDFAPI_FT_Stream_ReadShort
+#define FT_Stream_ReadShortLE FPDFAPI_FT_Stream_ReadShortLE
+#define FT_Stream_ReadOffset FPDFAPI_FT_Stream_ReadOffset
+#define FT_Stream_ReadLong FPDFAPI_FT_Stream_ReadLong
+#define FT_Stream_ReadLongLE FPDFAPI_FT_Stream_ReadLongLE
+#define FT_Stream_ReadFields FPDFAPI_FT_Stream_ReadFields
+#define FT_RoundFix FPDFAPI_FT_RoundFix
+#define FT_CeilFix FPDFAPI_FT_CeilFix
+#define FT_FloorFix FPDFAPI_FT_FloorFix
+#define FT_Sqrt32 FPDFAPI_FT_Sqrt32
+#define FT_SqrtFixed FPDFAPI_FT_SqrtFixed
+#define FT_Tan FPDFAPI_FT_Tan
+#define FT_Atan2 FPDFAPI_FT_Atan2
+#define FT_Vector_Unit FPDFAPI_FT_Vector_Unit
+#define FT_Vector_Rotate FPDFAPI_FT_Vector_Rotate
+#define FT_Vector_Length FPDFAPI_FT_Vector_Length
+#define FT_Vector_Polarize FPDFAPI_FT_Vector_Polarize
+#define FT_Vector_From_Polar FPDFAPI_FT_Vector_From_Polar
+#define FT_Angle_Diff FPDFAPI_FT_Angle_Diff
+#define FT_Outline_Decompose FPDFAPI_FT_Outline_Decompose
+#define FT_Outline_Done_Internal FPDFAPI_FT_Outline_Done_Internal
+#define FT_Outline_New_Internal FPDFAPI_FT_Outline_New_Internal
+#define FT_Outline_New FPDFAPI_FT_Outline_New
+#define FT_Outline_Check FPDFAPI_FT_Outline_Check
+#define FT_Outline_Copy FPDFAPI_FT_Outline_Copy
+#define FT_Outline_Done FPDFAPI_FT_Outline_Done
+#define FT_Outline_Reverse FPDFAPI_FT_Outline_Reverse
+#define FT_Set_Renderer FPDFAPI_FT_Set_Renderer
+#define FT_Lookup_Renderer FPDFAPI_FT_Lookup_Renderer
+#define FT_Outline_Render FPDFAPI_FT_Outline_Render
+#define FT_Outline_Get_Bitmap FPDFAPI_FT_Outline_Get_Bitmap
+#define FT_Outline_Get_Orientation FPDFAPI_FT_Outline_Get_Orientation
+#define FT_Outline_Embolden FPDFAPI_FT_Outline_Embolden
+#define FT_GlyphLoader_Reset FPDFAPI_FT_GlyphLoader_Reset
+#define FT_GlyphLoader_Prepare FPDFAPI_FT_GlyphLoader_Prepare
+#define ft_service_list_lookup FPDFAPI_ft_service_list_lookup
+#define ft_validator_init FPDFAPI_ft_validator_init
+#define ft_validator_run FPDFAPI_ft_validator_run
+#define ft_validator_error FPDFAPI_ft_validator_error
+#define FT_Stream_New FPDFAPI_FT_Stream_New
+#define FT_Stream_Free FPDFAPI_FT_Stream_Free
+#define ft_glyphslot_free_bitmap FPDFAPI_ft_glyphslot_free_bitmap
+#define ft_glyphslot_set_bitmap FPDFAPI_ft_glyphslot_set_bitmap
+#define FT_GlyphSlot_Own_Bitmap FPDFAPI_FT_GlyphSlot_Own_Bitmap
+#define ft_glyphslot_alloc_bitmap FPDFAPI_ft_glyphslot_alloc_bitmap
+#define FT_New_GlyphSlot FPDFAPI_FT_New_GlyphSlot
+#define FT_Done_GlyphSlot FPDFAPI_FT_Done_GlyphSlot
+#define FT_Set_Transform FPDFAPI_FT_Set_Transform
+#define FT_Render_Glyph_Internal FPDFAPI_FT_Render_Glyph_Internal
+#define FT_Render_Glyph FPDFAPI_FT_Render_Glyph
+#define FT_Load_Char FPDFAPI_FT_Load_Char
+#define FT_New_Size FPDFAPI_FT_New_Size
+#define FT_Open_Face FPDFAPI_FT_Open_Face
+#define FT_Attach_Stream FPDFAPI_FT_Attach_Stream
+#define FT_Attach_File FPDFAPI_FT_Attach_File
+#define FT_Done_Size FPDFAPI_FT_Done_Size
+#define FT_Set_Char_Size FPDFAPI_FT_Set_Char_Size
+#define FT_Set_Pixel_Sizes FPDFAPI_FT_Set_Pixel_Sizes
+#define FT_Get_Kerning FPDFAPI_FT_Get_Kerning
+#define FT_CMap_Done FPDFAPI_FT_CMap_Done
+#define FT_CMap_New FPDFAPI_FT_CMap_New
+#define FT_Get_Next_Char FPDFAPI_FT_Get_Next_Char
+#define FT_Get_First_Char FPDFAPI_FT_Get_First_Char
+#define FT_Get_Name_Index FPDFAPI_FT_Get_Name_Index
+#define FT_Get_Glyph_Name FPDFAPI_FT_Get_Glyph_Name
+#define FT_Get_Postscript_Name FPDFAPI_FT_Get_Postscript_Name
+#define FT_Get_Sfnt_Table FPDFAPI_FT_Get_Sfnt_Table
+#define FT_Load_Sfnt_Table FPDFAPI_FT_Load_Sfnt_Table
+#define FT_Sfnt_Table_Info FPDFAPI_FT_Sfnt_Table_Info
+#define FT_Get_CMap_Language_ID FPDFAPI_FT_Get_CMap_Language_ID
+#define FT_Activate_Size FPDFAPI_FT_Activate_Size
+#define FT_Get_Renderer FPDFAPI_FT_Get_Renderer
+#define FT_Remove_Module FPDFAPI_FT_Remove_Module
+#define FT_Add_Module FPDFAPI_FT_Add_Module
+#define FT_Get_Module FPDFAPI_FT_Get_Module
+#define FT_Get_Module_Interface FPDFAPI_FT_Get_Module_Interface
+#define ft_module_get_service FPDFAPI_ft_module_get_service
+#define FT_New_Library FPDFAPI_FT_New_Library
+#define FT_Library_Version FPDFAPI_FT_Library_Version
+#define FT_Done_Library FPDFAPI_FT_Done_Library
+#define FT_Set_Debug_Hook FPDFAPI_FT_Set_Debug_Hook
+#define FT_Raccess_Get_HeaderInfo FPDFAPI_FT_Raccess_Get_HeaderInfo
+#define FT_Raccess_Get_DataOffsets FPDFAPI_FT_Raccess_Get_DataOffsets
+#define FT_Raccess_Guess FPDFAPI_FT_Raccess_Guess
+#define af_dummy_script_class FPDFAPI_af_dummy_script_class
+#define af_latin_script_class FPDFAPI_af_latin_script_class
+#define af_cjk_script_class FPDFAPI_af_cjk_script_class
+#define af_autofitter_service FPDFAPI_af_autofitter_service
+#define autofit_module_class FPDFAPI_autofit_module_class
+#define cff_cmap_encoding_class_rec FPDFAPI_cff_cmap_encoding_class_rec
+#define cff_cmap_unicode_class_rec FPDFAPI_cff_cmap_unicode_class_rec
+#define cff_driver_class FPDFAPI_cff_driver_class
+#define FT_Stream_Open FPDFAPI_FT_Stream_Open
+#define FT_New_Memory FPDFAPI_FT_New_Memory
+#define FT_Done_Memory FPDFAPI_FT_Done_Memory
+#define ft_mem_qalloc FPDFAPI_ft_mem_qalloc
+#define ft_mem_alloc FPDFAPI_ft_mem_alloc
+#define ft_mem_free FPDFAPI_ft_mem_free
+#define ft_mem_qrealloc FPDFAPI_ft_mem_qrealloc
+#define ft_mem_realloc FPDFAPI_ft_mem_realloc
+#define FT_Get_TrueType_Engine_Type FPDFAPI_FT_Get_TrueType_Engine_Type
+#define ft_stub_set_char_sizes FPDFAPI_ft_stub_set_char_sizes
+#define ft_stub_set_pixel_sizes FPDFAPI_ft_stub_set_pixel_sizes
+#define FT_Get_SubGlyph_Info FPDFAPI_FT_Get_SubGlyph_Info
+#define FT_Get_Sfnt_Name_Count FPDFAPI_FT_Get_Sfnt_Name_Count
+#define FT_Get_Sfnt_Name FPDFAPI_FT_Get_Sfnt_Name
+#define FT_Bitmap_New FPDFAPI_FT_Bitmap_New
+#define FT_Bitmap_Copy FPDFAPI_FT_Bitmap_Copy
+#define FT_Bitmap_Done FPDFAPI_FT_Bitmap_Done
+#define FT_Bitmap_Convert FPDFAPI_FT_Bitmap_Convert
+#define FT_Bitmap_Embolden FPDFAPI_FT_Bitmap_Embolden
+#define ft_bitmap_glyph_class FPDFAPI_ft_bitmap_glyph_class
+#define ft_outline_glyph_class FPDFAPI_ft_outline_glyph_class
+#define FT_Matrix_Multiply FPDFAPI_FT_Matrix_Multiply
+#define FT_Matrix_Invert FPDFAPI_FT_Matrix_Invert
+#define FT_Done_Glyph FPDFAPI_FT_Done_Glyph
+#define FT_Glyph_Copy FPDFAPI_FT_Glyph_Copy
+#define FT_Get_Glyph FPDFAPI_FT_Get_Glyph
+#define FT_Glyph_Transform FPDFAPI_FT_Glyph_Transform
+#define FT_Glyph_Get_CBox FPDFAPI_FT_Glyph_Get_CBox
+#define FT_Glyph_To_Bitmap FPDFAPI_FT_Glyph_To_Bitmap
+#define FT_Add_Default_Modules FPDFAPI_FT_Add_Default_Modules
+#define FT_Get_Multi_Master FPDFAPI_FT_Get_Multi_Master
+#define FT_Get_MM_Var FPDFAPI_FT_Get_MM_Var
+#define FT_Set_MM_Design_Coordinates FPDFAPI_FT_Set_MM_Design_Coordinates
+#define FT_Set_Var_Design_Coordinates FPDFAPI_FT_Set_Var_Design_Coordinates
+#define FT_Set_MM_Blend_Coordinates FPDFAPI_FT_Set_MM_Blend_Coordinates
+#define FT_Set_Var_Blend_Coordinates FPDFAPI_FT_Set_Var_Blend_Coordinates
+#define ps_table_funcs FPDFAPI_ps_table_funcs
+#define ps_parser_funcs FPDFAPI_ps_parser_funcs
+#define t1_builder_funcs FPDFAPI_t1_builder_funcs
+#define t1_decoder_funcs FPDFAPI_t1_decoder_funcs
+#define afm_parser_funcs FPDFAPI_afm_parser_funcs
+#define t1_cmap_classes FPDFAPI_t1_cmap_classes
+#define t1_cmap_standard_class_rec FPDFAPI_t1_cmap_standard_class_rec
+#define t1_cmap_expert_class_rec FPDFAPI_t1_cmap_expert_class_rec
+#define t1_cmap_custom_class_rec FPDFAPI_t1_cmap_custom_class_rec
+#define t1_cmap_unicode_class_rec FPDFAPI_t1_cmap_unicode_class_rec
+#define psaux_module_class FPDFAPI_psaux_module_class
+#define pshinter_module_class FPDFAPI_pshinter_module_class
+#define ps_hints_apply FPDFAPI_ps_hints_apply
+#define psnames_module_class FPDFAPI_psnames_module_class
+#define ft_raster1_renderer_class FPDFAPI_ft_raster1_renderer_class
+#define ft_standard_raster FPDFAPI_ft_standard_raster
+#define ft_raster5_renderer_class FPDFAPI_ft_raster5_renderer_class
+#define tt_cmap0_class_rec FPDFAPI_tt_cmap0_class_rec
+#define tt_cmap2_class_rec FPDFAPI_tt_cmap2_class_rec
+#define tt_cmap4_class_rec FPDFAPI_tt_cmap4_class_rec
+#define tt_cmap6_class_rec FPDFAPI_tt_cmap6_class_rec
+#define tt_cmap8_class_rec FPDFAPI_tt_cmap8_class_rec
+#define tt_cmap10_class_rec FPDFAPI_tt_cmap10_class_rec
+#define tt_cmap12_class_rec FPDFAPI_tt_cmap12_class_rec
+#define tt_cmap13_class_rec FPDFAPI_tt_cmap13_class_rec
+#define tt_cmap14_class_rec FPDFAPI_tt_cmap14_class_rec
+#define sfnt_module_class FPDFAPI_sfnt_module_class
+#define ft_grays_raster FPDFAPI_ft_grays_raster
+#define ft_smooth_renderer_class FPDFAPI_ft_smooth_renderer_class
+#define ft_smooth_lcd_renderer_class FPDFAPI_ft_smooth_lcd_renderer_class
+#define ft_smooth_lcdv_renderer_class FPDFAPI_ft_smooth_lcdv_renderer_class
+#define tt_default_graphics_state FPDFAPI_tt_default_graphics_state
+#define tt_driver_class FPDFAPI_tt_driver_class
+#define TT_RunIns FPDFAPI_TT_RunIns
+#define TT_New_Context FPDFAPI_TT_New_Context
+#define t1_driver_class FPDFAPI_t1_driver_class
+#define t1cid_driver_class FPDFAPI_t1cid_driver_class
+#define FT_Get_Track_Kerning FPDFAPI_FT_Get_Track_Kerning
+#define FT_Match_Size FPDFAPI_FT_Match_Size
+#define FT_MulDiv_No_Round FPDFAPI_FT_MulDiv_No_Round
+#define FT_Request_Metrics FPDFAPI_FT_Request_Metrics
+#define FT_Request_Size FPDFAPI_FT_Request_Size
+#define FT_Select_Metrics FPDFAPI_FT_Select_Metrics
+#define FT_Select_Size FPDFAPI_FT_Select_Size
+#define ft_synthesize_vertical_metrics FPDFAPI_ft_synthesize_vertical_metrics
+#define New_Profile FPDFAPI_New_Profile
+#define End_Profile FPDFAPI_End_Profile
+#define Insert_Y_Turn FPDFAPI_Insert_Y_Turn
+#define Split_Conic FPDFAPI_Split_Conic
+#define Split_Cubic FPDFAPI_Split_Cubic
+#define Line_Up FPDFAPI_Line_Up
+#define Bezier_Up FPDFAPI_Bezier_Up
+#define Bezier_Down FPDFAPI_Bezier_Down
+#define Line_To FPDFAPI_Line_To
+#define Conic_To FPDFAPI_Conic_To
+#define Cubic_To FPDFAPI_Cubic_To
+#define Decompose_Curve FPDFAPI_Decompose_Curve
+#define Convert_Glyph FPDFAPI_Convert_Glyph
+#define Sort FPDFAPI_Sort
+#define Vertical_Sweep_Init FPDFAPI_Vertical_Sweep_Init
+#define Vertical_Sweep_Span FPDFAPI_Vertical_Sweep_Span
+#define Vertical_Sweep_Drop FPDFAPI_Vertical_Sweep_Drop
+#define Vertical_Sweep_Step FPDFAPI_Vertical_Sweep_Step
+#define Horizontal_Sweep_Init FPDFAPI_Horizontal_Sweep_Init
+#define Horizontal_Sweep_Span FPDFAPI_Horizontal_Sweep_Span
+#define Horizontal_Sweep_Drop FPDFAPI_Horizontal_Sweep_Drop
+#define Horizontal_Sweep_Step FPDFAPI_Horizontal_Sweep_Step
+#define Draw_Sweep FPDFAPI_Draw_Sweep
+#define Render_Single_Pass FPDFAPI_Render_Single_Pass
+#define Render_Glyph FPDFAPI_Render_Glyph
+#define Finalize_Profile_Table FPDFAPI_Finalize_Profile_Table
+#define InsNew FPDFAPI_InsNew
+#define DelOld FPDFAPI_DelOld
+#define FT_MulFix FPDFAPI_FT_MulFix
+#define FT_Matrix_Multiply_Scaled FPDFAPI_FT_Matrix_Multiply_Scaled
+#define FT_Vector_Transform_Scaled FPDFAPI_FT_Vector_Transform_Scaled
+#define ft_corner_orientation FPDFAPI_ft_corner_orientation
+#define ft_corner_is_flat FPDFAPI_ft_corner_is_flat
+#define FT_Get_CMap_Format FPDFAPI_FT_Get_CMap_Format
+#define ft_mem_strcpyn FPDFAPI_ft_mem_strcpyn
+#define ft_mem_dup FPDFAPI_ft_mem_dup
+#define ft_mem_strdup FPDFAPI_ft_mem_strdup
+#define FT_Face_GetCharVariantIsDefault FPDFAPI_FT_Face_GetCharVariantIsDefault
+#define FT_Face_GetCharsOfVariant FPDFAPI_FT_Face_GetCharsOfVariant
+#define FT_Face_GetVariantsOfChar FPDFAPI_FT_Face_GetVariantsOfChar
+#define FT_Face_GetVariantSelectors FPDFAPI_FT_Face_GetVariantSelectors
+#define FT_Face_GetCharVariantIndex FPDFAPI_FT_Face_GetCharVariantIndex
+#define FT_Get_Advances FPDFAPI_FT_Get_Advances
+#define FT_Get_Advance FPDFAPI_FT_Get_Advance
+#define FT_Library_SetLcdFilter FPDFAPI_FT_Library_SetLcdFilter
+
+#endif // !_FX_FREETYPE_DONT_RENAME_
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/config/ftconfig.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/config/ftconfig.h
new file mode 100644
index 0000000000..b971d146ed
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/config/ftconfig.h
@@ -0,0 +1,599 @@
+/***************************************************************************/
+/* */
+/* ftconfig.h */
+/* */
+/* ANSI-specific configuration file (specification only). */
+/* */
+/* Copyright 1996-2004, 2006-2008, 2010-2011, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* This header file contains a number of macro definitions that are used */
+ /* by the rest of the engine. Most of the macros here are automatically */
+ /* determined at compile time, and you should not need to change it to */
+ /* port FreeType, except to compile the library with a non-ANSI */
+ /* compiler. */
+ /* */
+ /* Note however that if some specific modifications are needed, we */
+ /* advise you to place a modified copy in your build directory. */
+ /* */
+ /* The build directory is usually `freetype/builds/<system>', and */
+ /* contains system-specific files that are always included first when */
+ /* building the library. */
+ /* */
+ /* This ANSI version should stay in `include/freetype/config'. */
+ /* */
+ /*************************************************************************/
+
+#ifndef __FTCONFIG_H__
+#define __FTCONFIG_H__
+
+#include "../../ft2build.h"
+#include "ftoption.h"
+#include "ftstdlib.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* PLATFORM-SPECIFIC CONFIGURATION MACROS */
+ /* */
+ /* These macros can be toggled to suit a specific system. The current */
+ /* ones are defaults used to compile FreeType in an ANSI C environment */
+ /* (16bit compilers are also supported). Copy this file to your own */
+ /* `freetype/builds/<system>' directory, and edit it to port the engine. */
+ /* */
+ /*************************************************************************/
+
+
+ /* There are systems (like the Texas Instruments 'C54x) where a `char' */
+ /* has 16 bits. ANSI C says that sizeof(char) is always 1. Since an */
+ /* `int' has 16 bits also for this system, sizeof(int) gives 1 which */
+ /* is probably unexpected. */
+ /* */
+ /* `CHAR_BIT' (defined in limits.h) gives the number of bits in a */
+ /* `char' type. */
+
+#ifndef FT_CHAR_BIT
+#define FT_CHAR_BIT CHAR_BIT
+#endif
+
+
+ /* The size of an `int' type. */
+#if FT_UINT_MAX == 0xFFFFUL
+#define FT_SIZEOF_INT (16 / FT_CHAR_BIT)
+#elif FT_UINT_MAX == 0xFFFFFFFFUL
+#define FT_SIZEOF_INT (32 / FT_CHAR_BIT)
+#elif FT_UINT_MAX > 0xFFFFFFFFUL && FT_UINT_MAX == 0xFFFFFFFFFFFFFFFFUL
+#define FT_SIZEOF_INT (64 / FT_CHAR_BIT)
+#else
+#error "Unsupported size of `int' type!"
+#endif
+
+ /* The size of a `long' type. A five-byte `long' (as used e.g. on the */
+ /* DM642) is recognized but avoided. */
+#if FT_ULONG_MAX == 0xFFFFFFFFUL
+#define FT_SIZEOF_LONG (32 / FT_CHAR_BIT)
+#elif FT_ULONG_MAX > 0xFFFFFFFFUL && FT_ULONG_MAX == 0xFFFFFFFFFFUL
+#define FT_SIZEOF_LONG (32 / FT_CHAR_BIT)
+#elif FT_ULONG_MAX > 0xFFFFFFFFUL && FT_ULONG_MAX == 0xFFFFFFFFFFFFFFFFUL
+#define FT_SIZEOF_LONG (64 / FT_CHAR_BIT)
+#else
+#error "Unsupported size of `long' type!"
+#endif
+
+
+ /* FT_UNUSED is a macro used to indicate that a given parameter is not */
+ /* used -- this is only used to get rid of unpleasant compiler warnings */
+#ifndef FT_UNUSED
+#define FT_UNUSED( arg ) ( (arg) = (arg) )
+#endif
+
+
+ /*************************************************************************/
+ /* */
+ /* AUTOMATIC CONFIGURATION MACROS */
+ /* */
+ /* These macros are computed from the ones defined above. Don't touch */
+ /* their definition, unless you know precisely what you are doing. No */
+ /* porter should need to mess with them. */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* Mac support */
+ /* */
+ /* This is the only necessary change, so it is defined here instead */
+ /* providing a new configuration file. */
+ /* */
+#if defined( __APPLE__ ) || ( defined( __MWERKS__ ) && defined( macintosh ) )
+ /* no Carbon frameworks for 64bit 10.4.x */
+ /* AvailabilityMacros.h is available since Mac OS X 10.2, */
+ /* so guess the system version by maximum errno before inclusion */
+#include <errno.h>
+#ifdef ECANCELED /* defined since 10.2 */
+#include "AvailabilityMacros.h"
+#endif
+#if defined( __LP64__ ) && \
+ ( MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 )
+#undef FT_MACINTOSH
+#endif
+
+#elif defined( __SC__ ) || defined( __MRC__ )
+ /* Classic MacOS compilers */
+#include "ConditionalMacros.h"
+#if TARGET_OS_MAC
+#define FT_MACINTOSH 1
+#endif
+
+#endif
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* basic_types */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Int16 */
+ /* */
+ /* <Description> */
+ /* A typedef for a 16bit signed integer type. */
+ /* */
+ typedef signed short FT_Int16;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_UInt16 */
+ /* */
+ /* <Description> */
+ /* A typedef for a 16bit unsigned integer type. */
+ /* */
+ typedef unsigned short FT_UInt16;
+
+ /* */
+
+
+ /* this #if 0 ... #endif clause is for documentation purposes */
+#if 0
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Int32 */
+ /* */
+ /* <Description> */
+ /* A typedef for a 32bit signed integer type. The size depends on */
+ /* the configuration. */
+ /* */
+ typedef signed XXX FT_Int32;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_UInt32 */
+ /* */
+ /* A typedef for a 32bit unsigned integer type. The size depends on */
+ /* the configuration. */
+ /* */
+ typedef unsigned XXX FT_UInt32;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Int64 */
+ /* */
+ /* A typedef for a 64bit signed integer type. The size depends on */
+ /* the configuration. Only defined if there is real 64bit support; */
+ /* otherwise, it gets emulated with a structure (if necessary). */
+ /* */
+ typedef signed XXX FT_Int64;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_UInt64 */
+ /* */
+ /* A typedef for a 64bit unsigned integer type. The size depends on */
+ /* the configuration. Only defined if there is real 64bit support; */
+ /* otherwise, it gets emulated with a structure (if necessary). */
+ /* */
+ typedef unsigned XXX FT_UInt64;
+
+ /* */
+
+#endif
+
+#if FT_SIZEOF_INT == (32 / FT_CHAR_BIT)
+
+ typedef signed int FT_Int32;
+ typedef unsigned int FT_UInt32;
+
+#elif FT_SIZEOF_LONG == (32 / FT_CHAR_BIT)
+
+ typedef signed long FT_Int32;
+ typedef unsigned long FT_UInt32;
+
+#else
+#error "no 32bit type found -- please check your configuration files"
+#endif
+
+
+ /* look up an integer type that is at least 32 bits */
+#if FT_SIZEOF_INT >= (32 / FT_CHAR_BIT)
+
+ typedef int FT_Fast;
+ typedef unsigned int FT_UFast;
+
+#elif FT_SIZEOF_LONG >= (32 / FT_CHAR_BIT)
+
+ typedef long FT_Fast;
+ typedef unsigned long FT_UFast;
+
+#endif
+
+
+ /* determine whether we have a 64-bit int type for platforms without */
+ /* Autoconf */
+#if FT_SIZEOF_LONG == (64 / FT_CHAR_BIT)
+
+ /* FT_LONG64 must be defined if a 64-bit type is available */
+#define FT_LONG64
+#define FT_INT64 long
+#define FT_UINT64 unsigned long
+
+#elif defined( _MSC_VER ) && _MSC_VER >= 900 /* Visual C++ (and Intel C++) */
+
+ /* this compiler provides the __int64 type */
+#define FT_LONG64
+#define FT_INT64 __int64
+#define FT_UINT64 unsigned __int64
+
+#elif defined( __BORLANDC__ ) /* Borland C++ */
+
+ /* XXXX: We should probably check the value of __BORLANDC__ in order */
+ /* to test the compiler version. */
+
+ /* this compiler provides the __int64 type */
+#define FT_LONG64
+#define FT_INT64 __int64
+#define FT_UINT64 unsigned __int64
+
+#elif defined( __WATCOMC__ ) /* Watcom C++ */
+
+ /* Watcom doesn't provide 64-bit data types */
+
+#elif defined( __MWERKS__ ) /* Metrowerks CodeWarrior */
+
+#define FT_LONG64
+#define FT_INT64 long long int
+#define FT_UINT64 unsigned long long int
+
+#elif defined( __GNUC__ )
+
+ /* GCC provides the `long long' type */
+#define FT_LONG64
+#define FT_INT64 long long int
+#define FT_UINT64 unsigned long long int
+
+#endif /* FT_SIZEOF_LONG == (64 / FT_CHAR_BIT) */
+
+
+ /*************************************************************************/
+ /* */
+ /* A 64-bit data type will create compilation problems if you compile */
+ /* in strict ANSI mode. To avoid them, we disable its use if __STDC__ */
+ /* is defined. You can however ignore this rule by defining the */
+ /* FT_CONFIG_OPTION_FORCE_INT64 configuration macro. */
+ /* */
+#if defined( FT_LONG64 ) && !defined( FT_CONFIG_OPTION_FORCE_INT64 )
+
+#ifdef __STDC__
+
+ /* undefine the 64-bit macros in strict ANSI compilation mode */
+#undef FT_LONG64
+#undef FT_INT64
+
+#endif /* __STDC__ */
+
+#endif /* FT_LONG64 && !FT_CONFIG_OPTION_FORCE_INT64 */
+
+#ifdef FT_LONG64
+ typedef FT_INT64 FT_Int64;
+ typedef FT_UINT64 FT_UInt64;
+#endif
+
+
+#define FT_BEGIN_STMNT do {
+#define FT_END_STMNT } while ( 0 )
+#define FT_DUMMY_STMNT FT_BEGIN_STMNT FT_END_STMNT
+
+
+#ifndef FT_CONFIG_OPTION_NO_ASSEMBLER
+ /* Provide assembler fragments for performance-critical functions. */
+ /* These must be defined `static __inline__' with GCC. */
+
+ /**Johnson add !defined( __thumb__ )*/
+#if (defined( __CC_ARM ) || defined( __ARMCC__ ))&& !defined( __thumb__ ) /* RVCT */
+#define FT_MULFIX_ASSEMBLER FT_MulFix_arm
+
+ /* documentation is in freetype.h */
+
+ static __inline FT_Int32
+ FT_MulFix_arm( FT_Int32 a,
+ FT_Int32 b )
+ {
+ register FT_Int32 t, t2;
+
+
+ __asm
+ {
+ smull t2, t, b, a /* (lo=t2,hi=t) = a*b */
+ mov a, t, asr #31 /* a = (hi >> 31) */
+ add a, a, #0x8000 /* a += 0x8000 */
+ adds t2, t2, a /* t2 += a */
+ adc t, t, #0 /* t += carry */
+ mov a, t2, lsr #16 /* a = t2 >> 16 */
+ orr a, a, t, lsl #16 /* a |= t << 16 */
+ }
+ return a;
+ }
+
+#endif /* __CC_ARM || __ARMCC__ */
+
+
+#ifdef __GNUC__
+
+#if defined( __arm__ ) && !defined( __thumb__ ) && \
+ !( defined( __CC_ARM ) || defined( __ARMCC__ ) )
+#define FT_MULFIX_ASSEMBLER FT_MulFix_arm
+
+ /* documentation is in freetype.h */
+
+ static __inline__ FT_Int32
+ FT_MulFix_arm( FT_Int32 a,
+ FT_Int32 b )
+ {
+ register FT_Int32 t, t2;
+
+
+ __asm__ __volatile__ (
+ "smull %1, %2, %4, %3\n\t" /* (lo=%1,hi=%2) = a*b */
+ "mov %0, %2, asr #31\n\t" /* %0 = (hi >> 31) */
+ "add %0, %0, #0x8000\n\t" /* %0 += 0x8000 */
+ "adds %1, %1, %0\n\t" /* %1 += %0 */
+ "adc %2, %2, #0\n\t" /* %2 += carry */
+ "mov %0, %1, lsr #16\n\t" /* %0 = %1 >> 16 */
+ "orr %0, %0, %2, lsl #16\n\t" /* %0 |= %2 << 16 */
+ : "=r"(a), "=&r"(t2), "=&r"(t)
+ : "r"(a), "r"(b)
+ : "cc" );
+ return a;
+ }
+
+#endif /* __arm__ && !__thumb__ && !( __CC_ARM || __ARMCC__ ) */
+
+#if defined( __i386__ )
+#define FT_MULFIX_ASSEMBLER FT_MulFix_i386
+
+ /* documentation is in freetype.h */
+
+ static __inline__ FT_Int32
+ FT_MulFix_i386( FT_Int32 a,
+ FT_Int32 b )
+ {
+ register FT_Int32 result;
+
+
+ __asm__ __volatile__ (
+ "imul %%edx\n"
+ "movl %%edx, %%ecx\n"
+ "sarl $31, %%ecx\n"
+ "addl $0x8000, %%ecx\n"
+ "addl %%ecx, %%eax\n"
+ "adcl $0, %%edx\n"
+ "shrl $16, %%eax\n"
+ "shll $16, %%edx\n"
+ "addl %%edx, %%eax\n"
+ : "=a"(result), "=d"(b)
+ : "a"(a), "d"(b)
+ : "%ecx", "cc" );
+ return result;
+ }
+
+#endif /* i386 */
+
+#endif /* __GNUC__ */
+
+
+#ifdef _MSC_VER /* Visual C++ */
+
+#ifdef _M_IX86
+
+#define FT_MULFIX_ASSEMBLER FT_MulFix_i386
+
+ /* documentation is in freetype.h */
+
+ static __inline FT_Int32
+ FT_MulFix_i386( FT_Int32 a,
+ FT_Int32 b )
+ {
+ register FT_Int32 result;
+
+ __asm
+ {
+ mov eax, a
+ mov edx, b
+ imul edx
+ mov ecx, edx
+ sar ecx, 31
+ add ecx, 8000h
+ add eax, ecx
+ adc edx, 0
+ shr eax, 16
+ shl edx, 16
+ add eax, edx
+ mov result, eax
+ }
+ return result;
+ }
+
+#endif /* _M_IX86 */
+
+#endif /* _MSC_VER */
+
+#endif /* !FT_CONFIG_OPTION_NO_ASSEMBLER */
+
+
+#ifdef FT_CONFIG_OPTION_INLINE_MULFIX
+#ifdef FT_MULFIX_ASSEMBLER
+#define FT_MULFIX_INLINED FT_MULFIX_ASSEMBLER
+#endif
+#endif
+
+
+#ifdef FT_MAKE_OPTION_SINGLE_OBJECT
+
+#define FT_LOCAL( x ) static x
+#define FT_LOCAL_DEF( x ) static x
+
+#else
+
+#ifdef __cplusplus
+#define FT_LOCAL( x ) extern "C" x
+#define FT_LOCAL_DEF( x ) extern "C" x
+#else
+#define FT_LOCAL( x ) extern x
+#define FT_LOCAL_DEF( x ) x
+#endif
+
+#endif /* FT_MAKE_OPTION_SINGLE_OBJECT */
+
+
+#ifndef FT_BASE
+
+#ifdef __cplusplus
+#define FT_BASE( x ) extern "C" x
+#else
+#define FT_BASE( x ) extern x
+#endif
+
+#endif /* !FT_BASE */
+
+
+#ifndef FT_BASE_DEF
+
+#ifdef __cplusplus
+#define FT_BASE_DEF( x ) x
+#else
+#define FT_BASE_DEF( x ) x
+#endif
+
+#endif /* !FT_BASE_DEF */
+
+
+#ifndef FT_EXPORT
+
+#ifdef __cplusplus
+#define FT_EXPORT( x ) extern "C" x
+#else
+#define FT_EXPORT( x ) extern x
+#endif
+
+#endif /* !FT_EXPORT */
+
+
+#ifndef FT_EXPORT_DEF
+
+#ifdef __cplusplus
+#define FT_EXPORT_DEF( x ) extern "C" x
+#else
+#define FT_EXPORT_DEF( x ) extern x
+#endif
+
+#endif /* !FT_EXPORT_DEF */
+
+
+#ifndef FT_EXPORT_VAR
+
+#ifdef __cplusplus
+#define FT_EXPORT_VAR( x ) extern "C" x
+#else
+#define FT_EXPORT_VAR( x ) extern x
+#endif
+
+#endif /* !FT_EXPORT_VAR */
+
+ /* The following macros are needed to compile the library with a */
+ /* C++ compiler and with 16bit compilers. */
+ /* */
+
+ /* This is special. Within C++, you must specify `extern "C"' for */
+ /* functions which are used via function pointers, and you also */
+ /* must do that for structures which contain function pointers to */
+ /* assure C linkage -- it's not possible to have (local) anonymous */
+ /* functions which are accessed by (global) function pointers. */
+ /* */
+ /* */
+ /* FT_CALLBACK_DEF is used to _define_ a callback function. */
+ /* */
+ /* FT_CALLBACK_TABLE is used to _declare_ a constant variable that */
+ /* contains pointers to callback functions. */
+ /* */
+ /* FT_CALLBACK_TABLE_DEF is used to _define_ a constant variable */
+ /* that contains pointers to callback functions. */
+ /* */
+ /* */
+ /* Some 16bit compilers have to redefine these macros to insert */
+ /* the infamous `_cdecl' or `__fastcall' declarations. */
+ /* */
+#ifndef FT_CALLBACK_DEF
+#ifdef __cplusplus
+#define FT_CALLBACK_DEF( x ) extern "C" x
+#else
+#define FT_CALLBACK_DEF( x ) static x
+#endif
+#endif /* FT_CALLBACK_DEF */
+
+#ifndef FT_CALLBACK_TABLE
+#ifdef __cplusplus
+#define FT_CALLBACK_TABLE extern "C"
+#define FT_CALLBACK_TABLE_DEF extern "C"
+#else
+#define FT_CALLBACK_TABLE extern
+#define FT_CALLBACK_TABLE_DEF /* nothing */
+#endif
+#endif /* FT_CALLBACK_TABLE */
+
+
+FT_END_HEADER
+
+
+#endif /* __FTCONFIG_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/config/ftheader.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/config/ftheader.h
new file mode 100644
index 0000000000..d97910471e
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/config/ftheader.h
@@ -0,0 +1,832 @@
+/***************************************************************************/
+/* */
+/* ftheader.h */
+/* */
+/* Build macros of the FreeType 2 library. */
+/* */
+/* Copyright 1996-2008, 2010, 2012, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+#ifndef __FT_HEADER_H__
+#define __FT_HEADER_H__
+
+
+ /*@***********************************************************************/
+ /* */
+ /* <Macro> */
+ /* FT_BEGIN_HEADER */
+ /* */
+ /* <Description> */
+ /* This macro is used in association with @FT_END_HEADER in header */
+ /* files to ensure that the declarations within are properly */
+ /* encapsulated in an `extern "C" { .. }' block when included from a */
+ /* C++ compiler. */
+ /* */
+#ifdef __cplusplus
+#define FT_BEGIN_HEADER extern "C" {
+#else
+#define FT_BEGIN_HEADER /* nothing */
+#endif
+
+
+ /*@***********************************************************************/
+ /* */
+ /* <Macro> */
+ /* FT_END_HEADER */
+ /* */
+ /* <Description> */
+ /* This macro is used in association with @FT_BEGIN_HEADER in header */
+ /* files to ensure that the declarations within are properly */
+ /* encapsulated in an `extern "C" { .. }' block when included from a */
+ /* C++ compiler. */
+ /* */
+#ifdef __cplusplus
+#define FT_END_HEADER }
+#else
+#define FT_END_HEADER /* nothing */
+#endif
+
+
+ /*************************************************************************/
+ /* */
+ /* Aliases for the FreeType 2 public and configuration files. */
+ /* */
+ /*************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* header_file_macros */
+ /* */
+ /* <Title> */
+ /* Header File Macros */
+ /* */
+ /* <Abstract> */
+ /* Macro definitions used to #include specific header files. */
+ /* */
+ /* <Description> */
+ /* The following macros are defined to the name of specific */
+ /* FreeType~2 header files. They can be used directly in #include */
+ /* statements as in: */
+ /* */
+ /* { */
+ /* #include "../freetype.h" */
+ /* #include "../ftmm.h" */
+ /* #include "../ftglyph.h" */
+ /* } */
+ /* */
+ /* There are several reasons why we are now using macros to name */
+ /* public header files. The first one is that such macros are not */
+ /* limited to the infamous 8.3~naming rule required by DOS (and */
+ /* `FT_MULTIPLE_MASTERS_H' is a lot more meaningful than `ftmm.h'). */
+ /* */
+ /* The second reason is that it allows for more flexibility in the */
+ /* way FreeType~2 is installed on a given system. */
+ /* */
+ /*************************************************************************/
+
+
+ /* configuration files */
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_CONFIG_CONFIG_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing
+ * FreeType~2 configuration data.
+ *
+ */
+#ifndef FT_CONFIG_CONFIG_H
+#define FT_CONFIG_CONFIG_H <freetype/config/ftconfig.h>
+#endif
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_CONFIG_STANDARD_LIBRARY_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing
+ * FreeType~2 interface to the standard C library functions.
+ *
+ */
+#ifndef FT_CONFIG_STANDARD_LIBRARY_H
+#define FT_CONFIG_STANDARD_LIBRARY_H <freetype/config/ftstdlib.h>
+#endif
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_CONFIG_OPTIONS_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing
+ * FreeType~2 project-specific configuration options.
+ *
+ */
+#ifndef FT_CONFIG_OPTIONS_H
+#define FT_CONFIG_OPTIONS_H <freetype/config/ftoption.h>
+#endif
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_CONFIG_MODULES_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * list of FreeType~2 modules that are statically linked to new library
+ * instances in @FT_Init_FreeType.
+ *
+ */
+#ifndef FT_CONFIG_MODULES_H
+#define FT_CONFIG_MODULES_H <freetype/config/ftmodule.h>
+#endif
+
+ /* */
+
+ /* public headers */
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_FREETYPE_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * base FreeType~2 API.
+ *
+ */
+#define FT_FREETYPE_H <freetype/freetype.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_ERRORS_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * list of FreeType~2 error codes (and messages).
+ *
+ * It is included by @FT_FREETYPE_H.
+ *
+ */
+#define FT_ERRORS_H <freetype/fterrors.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_MODULE_ERRORS_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * list of FreeType~2 module error offsets (and messages).
+ *
+ */
+#define FT_MODULE_ERRORS_H <freetype/ftmoderr.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_SYSTEM_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * FreeType~2 interface to low-level operations (i.e., memory management
+ * and stream i/o).
+ *
+ * It is included by @FT_FREETYPE_H.
+ *
+ */
+#define FT_SYSTEM_H <freetype/ftsystem.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_IMAGE_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing type
+ * definitions related to glyph images (i.e., bitmaps, outlines,
+ * scan-converter parameters).
+ *
+ * It is included by @FT_FREETYPE_H.
+ *
+ */
+#define FT_IMAGE_H <freetype/ftimage.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_TYPES_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * basic data types defined by FreeType~2.
+ *
+ * It is included by @FT_FREETYPE_H.
+ *
+ */
+#define FT_TYPES_H <freetype/fttypes.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_LIST_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * list management API of FreeType~2.
+ *
+ * (Most applications will never need to include this file.)
+ *
+ */
+#define FT_LIST_H <freetype/ftlist.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_OUTLINE_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * scalable outline management API of FreeType~2.
+ *
+ */
+#define FT_OUTLINE_H <freetype/ftoutln.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_SIZES_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * API which manages multiple @FT_Size objects per face.
+ *
+ */
+#define FT_SIZES_H <freetype/ftsizes.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_MODULE_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * module management API of FreeType~2.
+ *
+ */
+#define FT_MODULE_H <freetype/ftmodapi.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_RENDER_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * renderer module management API of FreeType~2.
+ *
+ */
+#define FT_RENDER_H <freetype/ftrender.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_AUTOHINTER_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing
+ * structures and macros related to the auto-hinting module.
+ *
+ */
+#define FT_AUTOHINTER_H <freetype/ftautoh.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_CFF_DRIVER_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing
+ * structures and macros related to the CFF driver module.
+ *
+ */
+#define FT_CFF_DRIVER_H <freetype/ftcffdrv.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_TRUETYPE_DRIVER_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing
+ * structures and macros related to the TrueType driver module.
+ *
+ */
+#define FT_TRUETYPE_DRIVER_H <freetype/ftttdrv.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_TYPE1_TABLES_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * types and API specific to the Type~1 format.
+ *
+ */
+#define FT_TYPE1_TABLES_H <freetype/t1tables.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_TRUETYPE_IDS_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * enumeration values which identify name strings, languages, encodings,
+ * etc. This file really contains a _large_ set of constant macro
+ * definitions, taken from the TrueType and OpenType specifications.
+ *
+ */
+#define FT_TRUETYPE_IDS_H <freetype/ttnameid.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_TRUETYPE_TABLES_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * types and API specific to the TrueType (as well as OpenType) format.
+ *
+ */
+#define FT_TRUETYPE_TABLES_H <freetype/tttables.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_TRUETYPE_TAGS_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * definitions of TrueType four-byte `tags' which identify blocks in
+ * SFNT-based font formats (i.e., TrueType and OpenType).
+ *
+ */
+#define FT_TRUETYPE_TAGS_H <freetype/tttags.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_BDF_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * definitions of an API which accesses BDF-specific strings from a
+ * face.
+ *
+ */
+#define FT_BDF_H <freetype/ftbdf.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_CID_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * definitions of an API which access CID font information from a
+ * face.
+ *
+ */
+#define FT_CID_H <freetype/ftcid.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_GZIP_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * definitions of an API which supports gzip-compressed files.
+ *
+ */
+#define FT_GZIP_H <freetype/ftgzip.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_LZW_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * definitions of an API which supports LZW-compressed files.
+ *
+ */
+#define FT_LZW_H <freetype/ftlzw.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_BZIP2_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * definitions of an API which supports bzip2-compressed files.
+ *
+ */
+#define FT_BZIP2_H <freetype/ftbzip2.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_WINFONTS_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * definitions of an API which supports Windows FNT files.
+ *
+ */
+#define FT_WINFONTS_H <freetype/ftwinfnt.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_GLYPH_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * API of the optional glyph management component.
+ *
+ */
+#define FT_GLYPH_H <freetype/ftglyph.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_BITMAP_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * API of the optional bitmap conversion component.
+ *
+ */
+#define FT_BITMAP_H <freetype/ftbitmap.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_BBOX_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * API of the optional exact bounding box computation routines.
+ *
+ */
+#define FT_BBOX_H <freetype/ftbbox.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_CACHE_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * API of the optional FreeType~2 cache sub-system.
+ *
+ */
+#define FT_CACHE_H <freetype/ftcache.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_CACHE_IMAGE_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * `glyph image' API of the FreeType~2 cache sub-system.
+ *
+ * It is used to define a cache for @FT_Glyph elements. You can also
+ * use the API defined in @FT_CACHE_SMALL_BITMAPS_H if you only need to
+ * store small glyph bitmaps, as it will use less memory.
+ *
+ * This macro is deprecated. Simply include @FT_CACHE_H to have all
+ * glyph image-related cache declarations.
+ *
+ */
+#define FT_CACHE_IMAGE_H FT_CACHE_H
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_CACHE_SMALL_BITMAPS_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * `small bitmaps' API of the FreeType~2 cache sub-system.
+ *
+ * It is used to define a cache for small glyph bitmaps in a relatively
+ * memory-efficient way. You can also use the API defined in
+ * @FT_CACHE_IMAGE_H if you want to cache arbitrary glyph images,
+ * including scalable outlines.
+ *
+ * This macro is deprecated. Simply include @FT_CACHE_H to have all
+ * small bitmaps-related cache declarations.
+ *
+ */
+#define FT_CACHE_SMALL_BITMAPS_H FT_CACHE_H
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_CACHE_CHARMAP_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * `charmap' API of the FreeType~2 cache sub-system.
+ *
+ * This macro is deprecated. Simply include @FT_CACHE_H to have all
+ * charmap-based cache declarations.
+ *
+ */
+#define FT_CACHE_CHARMAP_H FT_CACHE_H
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_MAC_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * Macintosh-specific FreeType~2 API. The latter is used to access
+ * fonts embedded in resource forks.
+ *
+ * This header file must be explicitly included by client applications
+ * compiled on the Mac (note that the base API still works though).
+ *
+ */
+#define FT_MAC_H <freetype/ftmac.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_MULTIPLE_MASTERS_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * optional multiple-masters management API of FreeType~2.
+ *
+ */
+#define FT_MULTIPLE_MASTERS_H <freetype/ftmm.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_SFNT_NAMES_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * optional FreeType~2 API which accesses embedded `name' strings in
+ * SFNT-based font formats (i.e., TrueType and OpenType).
+ *
+ */
+#define FT_SFNT_NAMES_H <freetype/ftsnames.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_OPENTYPE_VALIDATE_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * optional FreeType~2 API which validates OpenType tables (BASE, GDEF,
+ * GPOS, GSUB, JSTF).
+ *
+ */
+#define FT_OPENTYPE_VALIDATE_H <freetype/ftotval.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_GX_VALIDATE_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * optional FreeType~2 API which validates TrueTypeGX/AAT tables (feat,
+ * mort, morx, bsln, just, kern, opbd, trak, prop).
+ *
+ */
+#define FT_GX_VALIDATE_H <freetype/ftgxval.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_PFR_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * FreeType~2 API which accesses PFR-specific data.
+ *
+ */
+#define FT_PFR_H <freetype/ftpfr.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_STROKER_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * FreeType~2 API which provides functions to stroke outline paths.
+ */
+#define FT_STROKER_H <freetype/ftstroke.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_SYNTHESIS_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * FreeType~2 API which performs artificial obliquing and emboldening.
+ */
+#define FT_SYNTHESIS_H <freetype/ftsynth.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_XFREE86_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * FreeType~2 API which provides functions specific to the XFree86 and
+ * X.Org X11 servers.
+ */
+#define FT_XFREE86_H <freetype/ftxf86.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_TRIGONOMETRY_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * FreeType~2 API which performs trigonometric computations (e.g.,
+ * cosines and arc tangents).
+ */
+#define FT_TRIGONOMETRY_H <freetype/fttrigon.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_LCD_FILTER_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * FreeType~2 API which performs color filtering for subpixel rendering.
+ */
+#define FT_LCD_FILTER_H <freetype/ftlcdfil.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_UNPATENTED_HINTING_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * FreeType~2 API which performs color filtering for subpixel rendering.
+ */
+#define FT_UNPATENTED_HINTING_H <freetype/ttunpat.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_INCREMENTAL_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * FreeType~2 API which performs color filtering for subpixel rendering.
+ */
+#define FT_INCREMENTAL_H <freetype/ftincrem.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_GASP_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * FreeType~2 API which returns entries from the TrueType GASP table.
+ */
+#define FT_GASP_H <freetype/ftgasp.h>
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_ADVANCES_H
+ *
+ * @description:
+ * A macro used in #include statements to name the file containing the
+ * FreeType~2 API which returns individual and ranged glyph advances.
+ */
+#define FT_ADVANCES_H <freetype/ftadvanc.h>
+
+
+ /* */
+
+#define FT_ERROR_DEFINITIONS_H <freetype/fterrdef.h>
+
+
+ /* The internals of the cache sub-system are no longer exposed. We */
+ /* default to FT_CACHE_H at the moment just in case, but we know of */
+ /* no rogue client that uses them. */
+ /* */
+#define FT_CACHE_MANAGER_H <freetype/ftcache.h>
+#define FT_CACHE_INTERNAL_MRU_H <freetype/ftcache.h>
+#define FT_CACHE_INTERNAL_MANAGER_H <freetype/ftcache.h>
+#define FT_CACHE_INTERNAL_CACHE_H <freetype/ftcache.h>
+#define FT_CACHE_INTERNAL_GLYPH_H <freetype/ftcache.h>
+#define FT_CACHE_INTERNAL_IMAGE_H <freetype/ftcache.h>
+#define FT_CACHE_INTERNAL_SBITS_H <freetype/ftcache.h>
+
+
+#define FT_INCREMENTAL_H <freetype/ftincrem.h>
+
+#define FT_TRUETYPE_UNPATENTED_H <freetype/ttunpat.h>
+
+
+ /*
+ * Include internal headers definitions from <freetype/internal/...>
+ * only when building the library.
+ */
+#ifdef FT2_BUILD_LIBRARY
+#define FT_INTERNAL_INTERNAL_H <freetype/internal/internal.h>
+#include "../internal/internal.h"
+#endif /* FT2_BUILD_LIBRARY */
+
+
+#endif /* __FT2_BUILD_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/config/ftmodule.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/config/ftmodule.h
new file mode 100644
index 0000000000..0d31ce6932
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/config/ftmodule.h
@@ -0,0 +1,32 @@
+/*
+ * This file registers the FreeType modules compiled into the library.
+ *
+ * If you use GNU make, this file IS NOT USED! Instead, it is created in
+ * the objects directory (normally `<topdir>/objs/') based on information
+ * from `<topdir>/modules.cfg'.
+ *
+ * Please read `docs/INSTALL.ANY' and `docs/CUSTOMIZE' how to compile
+ * FreeType without GNU make.
+ *
+ */
+
+//FT_USE_MODULE( FT_Module_Class, autofit_module_class )
+FT_USE_MODULE( FT_Driver_ClassRec, tt_driver_class )
+FT_USE_MODULE( FT_Driver_ClassRec, t1_driver_class )
+FT_USE_MODULE( FT_Driver_ClassRec, cff_driver_class )
+FT_USE_MODULE( FT_Driver_ClassRec, t1cid_driver_class )
+//FT_USE_MODULE( FT_Driver_ClassRec, pfr_driver_class )
+//FT_USE_MODULE( FT_Driver_ClassRec, t42_driver_class )
+//FT_USE_MODULE( FT_Driver_ClassRec, winfnt_driver_class )
+//FT_USE_MODULE( FT_Driver_ClassRec, pcf_driver_class )
+FT_USE_MODULE( FT_Module_Class, psaux_module_class )
+FT_USE_MODULE( FT_Module_Class, psnames_module_class )
+FT_USE_MODULE( FT_Module_Class, pshinter_module_class )
+FT_USE_MODULE( FT_Renderer_Class, ft_raster1_renderer_class )
+FT_USE_MODULE( FT_Module_Class, sfnt_module_class )
+FT_USE_MODULE( FT_Renderer_Class, ft_smooth_renderer_class )
+FT_USE_MODULE( FT_Renderer_Class, ft_smooth_lcd_renderer_class )
+FT_USE_MODULE( FT_Renderer_Class, ft_smooth_lcdv_renderer_class )
+//FT_USE_MODULE( FT_Driver_ClassRec, bdf_driver_class )
+
+/* EOF */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/config/ftoption.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/config/ftoption.h
new file mode 100644
index 0000000000..e16e3c199c
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/config/ftoption.h
@@ -0,0 +1,833 @@
+/***************************************************************************/
+/* */
+/* ftoption.h */
+/* */
+/* User-selectable configuration macros (specification only). */
+/* */
+/* Copyright 1996-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTOPTION_H__
+#define __FTOPTION_H__
+
+
+#include "../../ft2build.h"
+
+
+FT_BEGIN_HEADER
+
+ /*************************************************************************/
+ /* */
+ /* USER-SELECTABLE CONFIGURATION MACROS */
+ /* */
+ /* This file contains the default configuration macro definitions for */
+ /* a standard build of the FreeType library. There are three ways to */
+ /* use this file to build project-specific versions of the library: */
+ /* */
+ /* - You can modify this file by hand, but this is not recommended in */
+ /* cases where you would like to build several versions of the */
+ /* library from a single source directory. */
+ /* */
+ /* - You can put a copy of this file in your build directory, more */
+ /* precisely in `$BUILD/freetype/config/ftoption.h', where `$BUILD' */
+ /* is the name of a directory that is included _before_ the FreeType */
+ /* include path during compilation. */
+ /* */
+ /* The default FreeType Makefiles and Jamfiles use the build */
+ /* directory `builds/<system>' by default, but you can easily change */
+ /* that for your own projects. */
+ /* */
+ /* - Copy the file <ft2build.h> to `$BUILD/ft2build.h' and modify it */
+ /* slightly to pre-define the macro FT_CONFIG_OPTIONS_H used to */
+ /* locate this file during the build. For example, */
+ /* */
+ /* #define FT_CONFIG_OPTIONS_H <myftoptions.h> */
+ /* #include <freetype/config/ftheader.h> */
+ /* */
+ /* will use `$BUILD/myftoptions.h' instead of this file for macro */
+ /* definitions. */
+ /* */
+ /* Note also that you can similarly pre-define the macro */
+ /* FT_CONFIG_MODULES_H used to locate the file listing of the modules */
+ /* that are statically linked to the library at compile time. By */
+ /* default, this file is <freetype/config/ftmodule.h>. */
+ /* */
+ /* We highly recommend using the third method whenever possible. */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** G E N E R A L F R E E T Y P E 2 C O N F I G U R A T I O N ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* Uncomment the line below if you want to activate sub-pixel rendering */
+ /* (a.k.a. LCD rendering, or ClearType) in this build of the library. */
+ /* */
+ /* Note that this feature is covered by several Microsoft patents */
+ /* and should not be activated in any default build of the library. */
+ /* */
+ /* This macro has no impact on the FreeType API, only on its */
+ /* _implementation_. For example, using FT_RENDER_MODE_LCD when calling */
+ /* FT_Render_Glyph still generates a bitmap that is 3 times wider than */
+ /* the original size in case this macro isn't defined; however, each */
+ /* triplet of subpixels has R=G=B. */
+ /* */
+ /* This is done to allow FreeType clients to run unmodified, forcing */
+ /* them to display normal gray-level anti-aliased glyphs. */
+ /* */
+#define FT_CONFIG_OPTION_SUBPIXEL_RENDERING
+
+
+ /*************************************************************************/
+ /* */
+ /* Many compilers provide a non-ANSI 64-bit data type that can be used */
+ /* by FreeType to speed up some computations. However, this will create */
+ /* some problems when compiling the library in strict ANSI mode. */
+ /* */
+ /* For this reason, the use of 64-bit integers is normally disabled when */
+ /* the __STDC__ macro is defined. You can however disable this by */
+ /* defining the macro FT_CONFIG_OPTION_FORCE_INT64 here. */
+ /* */
+ /* For most compilers, this will only create compilation warnings when */
+ /* building the library. */
+ /* */
+ /* ObNote: The compiler-specific 64-bit integers are detected in the */
+ /* file `ftconfig.h' either statically or through the */
+ /* `configure' script on supported platforms. */
+ /* */
+#undef FT_CONFIG_OPTION_FORCE_INT64
+
+
+ /*************************************************************************/
+ /* */
+ /* If this macro is defined, do not try to use an assembler version of */
+ /* performance-critical functions (e.g. FT_MulFix). You should only do */
+ /* that to verify that the assembler function works properly, or to */
+ /* execute benchmark tests of the various implementations. */
+/* #define FT_CONFIG_OPTION_NO_ASSEMBLER */
+
+
+ /*************************************************************************/
+ /* */
+ /* If this macro is defined, try to use an inlined assembler version of */
+ /* the `FT_MulFix' function, which is a `hotspot' when loading and */
+ /* hinting glyphs, and which should be executed as fast as possible. */
+ /* */
+ /* Note that if your compiler or CPU is not supported, this will default */
+ /* to the standard and portable implementation found in `ftcalc.c'. */
+ /* */
+#define FT_CONFIG_OPTION_INLINE_MULFIX
+
+
+ /*************************************************************************/
+ /* */
+ /* LZW-compressed file support. */
+ /* */
+ /* FreeType now handles font files that have been compressed with the */
+ /* `compress' program. This is mostly used to parse many of the PCF */
+ /* files that come with various X11 distributions. The implementation */
+ /* uses NetBSD's `zopen' to partially uncompress the file on the fly */
+ /* (see src/lzw/ftgzip.c). */
+ /* */
+ /* Define this macro if you want to enable this `feature'. */
+ /* */
+#define FT_CONFIG_OPTION_USE_LZW
+
+
+ /*************************************************************************/
+ /* */
+ /* Gzip-compressed file support. */
+ /* */
+ /* FreeType now handles font files that have been compressed with the */
+ /* `gzip' program. This is mostly used to parse many of the PCF files */
+ /* that come with XFree86. The implementation uses `zlib' to */
+ /* partially uncompress the file on the fly (see src/gzip/ftgzip.c). */
+ /* */
+ /* Define this macro if you want to enable this `feature'. See also */
+ /* the macro FT_CONFIG_OPTION_SYSTEM_ZLIB below. */
+ /* */
+#define FT_CONFIG_OPTION_USE_ZLIB
+
+
+ /*************************************************************************/
+ /* */
+ /* ZLib library selection */
+ /* */
+ /* This macro is only used when FT_CONFIG_OPTION_USE_ZLIB is defined. */
+ /* It allows FreeType's `ftgzip' component to link to the system's */
+ /* installation of the ZLib library. This is useful on systems like */
+ /* Unix or VMS where it generally is already available. */
+ /* */
+ /* If you let it undefined, the component will use its own copy */
+ /* of the zlib sources instead. These have been modified to be */
+ /* included directly within the component and *not* export external */
+ /* function names. This allows you to link any program with FreeType */
+ /* _and_ ZLib without linking conflicts. */
+ /* */
+ /* Do not #undef this macro here since the build system might define */
+ /* it for certain configurations only. */
+ /* */
+/* #define FT_CONFIG_OPTION_SYSTEM_ZLIB */
+
+
+ /*************************************************************************/
+ /* */
+ /* Bzip2-compressed file support. */
+ /* */
+ /* FreeType now handles font files that have been compressed with the */
+ /* `bzip2' program. This is mostly used to parse many of the PCF */
+ /* files that come with XFree86. The implementation uses `libbz2' to */
+ /* partially uncompress the file on the fly (see src/bzip2/ftbzip2.c). */
+ /* Contrary to gzip, bzip2 currently is not included and need to use */
+ /* the system available bzip2 implementation. */
+ /* */
+ /* Define this macro if you want to enable this `feature'. */
+ /* */
+/* #define FT_CONFIG_OPTION_USE_BZIP2 */
+
+
+ /*************************************************************************/
+ /* */
+ /* Define to disable the use of file stream functions and types, FILE, */
+ /* fopen() etc. Enables the use of smaller system libraries on embedded */
+ /* systems that have multiple system libraries, some with or without */
+ /* file stream support, in the cases where file stream support is not */
+ /* necessary such as memory loading of font files. */
+ /* */
+/* #define FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT */
+
+
+ /*************************************************************************/
+ /* */
+ /* PNG bitmap support. */
+ /* */
+ /* FreeType now handles loading color bitmap glyphs in the PNG format. */
+ /* This requires help from the external libpng library. Uncompressed */
+ /* color bitmaps do not need any external libraries and will be */
+ /* supported regardless of this configuration. */
+ /* */
+ /* Define this macro if you want to enable this `feature'. */
+ /* */
+/* #define FT_CONFIG_OPTION_USE_PNG */
+
+
+ /*************************************************************************/
+ /* */
+ /* DLL export compilation */
+ /* */
+ /* When compiling FreeType as a DLL, some systems/compilers need a */
+ /* special keyword in front OR after the return type of function */
+ /* declarations. */
+ /* */
+ /* Two macros are used within the FreeType source code to define */
+ /* exported library functions: FT_EXPORT and FT_EXPORT_DEF. */
+ /* */
+ /* FT_EXPORT( return_type ) */
+ /* */
+ /* is used in a function declaration, as in */
+ /* */
+ /* FT_EXPORT( FT_Error ) */
+ /* FT_Init_FreeType( FT_Library* alibrary ); */
+ /* */
+ /* */
+ /* FT_EXPORT_DEF( return_type ) */
+ /* */
+ /* is used in a function definition, as in */
+ /* */
+ /* FT_EXPORT_DEF( FT_Error ) */
+ /* FT_Init_FreeType( FT_Library* alibrary ) */
+ /* { */
+ /* ... some code ... */
+ /* return FT_Err_Ok; */
+ /* } */
+ /* */
+ /* You can provide your own implementation of FT_EXPORT and */
+ /* FT_EXPORT_DEF here if you want. If you leave them undefined, they */
+ /* will be later automatically defined as `extern return_type' to */
+ /* allow normal compilation. */
+ /* */
+ /* Do not #undef these macros here since the build system might define */
+ /* them for certain configurations only. */
+ /* */
+/* #define FT_EXPORT(x) extern x */
+/* #define FT_EXPORT_DEF(x) x */
+
+
+ /*************************************************************************/
+ /* */
+ /* Glyph Postscript Names handling */
+ /* */
+ /* By default, FreeType 2 is compiled with the `psnames' module. This */
+ /* module is in charge of converting a glyph name string into a */
+ /* Unicode value, or return a Macintosh standard glyph name for the */
+ /* use with the TrueType `post' table. */
+ /* */
+ /* Undefine this macro if you do not want `psnames' compiled in your */
+ /* build of FreeType. This has the following effects: */
+ /* */
+ /* - The TrueType driver will provide its own set of glyph names, */
+ /* if you build it to support postscript names in the TrueType */
+ /* `post' table. */
+ /* */
+ /* - The Type 1 driver will not be able to synthesize a Unicode */
+ /* charmap out of the glyphs found in the fonts. */
+ /* */
+ /* You would normally undefine this configuration macro when building */
+ /* a version of FreeType that doesn't contain a Type 1 or CFF driver. */
+ /* */
+#define FT_CONFIG_OPTION_POSTSCRIPT_NAMES
+
+
+ /*************************************************************************/
+ /* */
+ /* Postscript Names to Unicode Values support */
+ /* */
+ /* By default, FreeType 2 is built with the `PSNames' module compiled */
+ /* in. Among other things, the module is used to convert a glyph name */
+ /* into a Unicode value. This is especially useful in order to */
+ /* synthesize on the fly a Unicode charmap from the CFF/Type 1 driver */
+ /* through a big table named the `Adobe Glyph List' (AGL). */
+ /* */
+ /* Undefine this macro if you do not want the Adobe Glyph List */
+ /* compiled in your `PSNames' module. The Type 1 driver will not be */
+ /* able to synthesize a Unicode charmap out of the glyphs found in the */
+ /* fonts. */
+ /* */
+#define FT_CONFIG_OPTION_ADOBE_GLYPH_LIST
+
+
+ /*************************************************************************/
+ /* */
+ /* Support for Mac fonts */
+ /* */
+ /* Define this macro if you want support for outline fonts in Mac */
+ /* format (mac dfont, mac resource, macbinary containing a mac */
+ /* resource) on non-Mac platforms. */
+ /* */
+ /* Note that the `FOND' resource isn't checked. */
+ /* */
+//#define FT_CONFIG_OPTION_MAC_FONTS
+
+
+ /*************************************************************************/
+ /* */
+ /* Guessing methods to access embedded resource forks */
+ /* */
+ /* Enable extra Mac fonts support on non-Mac platforms (e.g. */
+ /* GNU/Linux). */
+ /* */
+ /* Resource forks which include fonts data are stored sometimes in */
+ /* locations which users or developers don't expected. In some cases, */
+ /* resource forks start with some offset from the head of a file. In */
+ /* other cases, the actual resource fork is stored in file different */
+ /* from what the user specifies. If this option is activated, */
+ /* FreeType tries to guess whether such offsets or different file */
+ /* names must be used. */
+ /* */
+ /* Note that normal, direct access of resource forks is controlled via */
+ /* the FT_CONFIG_OPTION_MAC_FONTS option. */
+ /* */
+#ifdef FT_CONFIG_OPTION_MAC_FONTS
+#define FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK
+#endif
+
+
+ /*************************************************************************/
+ /* */
+ /* Allow the use of FT_Incremental_Interface to load typefaces that */
+ /* contain no glyph data, but supply it via a callback function. */
+ /* This is required by clients supporting document formats which */
+ /* supply font data incrementally as the document is parsed, such */
+ /* as the Ghostscript interpreter for the PostScript language. */
+ /* */
+#define FT_CONFIG_OPTION_INCREMENTAL
+
+
+ /*************************************************************************/
+ /* */
+ /* The size in bytes of the render pool used by the scan-line converter */
+ /* to do all of its work. */
+ /* */
+ /* This must be greater than 4KByte if you use FreeType to rasterize */
+ /* glyphs; otherwise, you may set it to zero to avoid unnecessary */
+ /* allocation of the render pool. */
+ /* */
+#define FT_RENDER_POOL_SIZE 16384L
+
+
+ /*************************************************************************/
+ /* */
+ /* FT_MAX_MODULES */
+ /* */
+ /* The maximum number of modules that can be registered in a single */
+ /* FreeType library object. 32 is the default. */
+ /* */
+#define FT_MAX_MODULES 32
+
+
+ /*************************************************************************/
+ /* */
+ /* Debug level */
+ /* */
+ /* FreeType can be compiled in debug or trace mode. In debug mode, */
+ /* errors are reported through the `ftdebug' component. In trace */
+ /* mode, additional messages are sent to the standard output during */
+ /* execution. */
+ /* */
+ /* Define FT_DEBUG_LEVEL_ERROR to build the library in debug mode. */
+ /* Define FT_DEBUG_LEVEL_TRACE to build it in trace mode. */
+ /* */
+ /* Don't define any of these macros to compile in `release' mode! */
+ /* */
+ /* Do not #undef these macros here since the build system might define */
+ /* them for certain configurations only. */
+ /* */
+/* #define FT_DEBUG_LEVEL_ERROR */
+/* #define FT_DEBUG_LEVEL_TRACE */
+
+
+ /*************************************************************************/
+ /* */
+ /* Autofitter debugging */
+ /* */
+ /* If FT_DEBUG_AUTOFIT is defined, FreeType provides some means to */
+ /* control the autofitter behaviour for debugging purposes with global */
+ /* boolean variables (consequently, you should *never* enable this */
+ /* while compiling in `release' mode): */
+ /* */
+ /* _af_debug_disable_horz_hints */
+ /* _af_debug_disable_vert_hints */
+ /* _af_debug_disable_blue_hints */
+ /* */
+ /* Additionally, the following functions provide dumps of various */
+ /* internal autofit structures to stdout (using `printf'): */
+ /* */
+ /* af_glyph_hints_dump_points */
+ /* af_glyph_hints_dump_segments */
+ /* af_glyph_hints_dump_edges */
+ /* */
+ /* As an argument, they use another global variable: */
+ /* */
+ /* _af_debug_hints */
+ /* */
+ /* Please have a look at the `ftgrid' demo program to see how those */
+ /* variables and macros should be used. */
+ /* */
+ /* Do not #undef these macros here since the build system might define */
+ /* them for certain configurations only. */
+ /* */
+/* #define FT_DEBUG_AUTOFIT */
+
+
+ /*************************************************************************/
+ /* */
+ /* Memory Debugging */
+ /* */
+ /* FreeType now comes with an integrated memory debugger that is */
+ /* capable of detecting simple errors like memory leaks or double */
+ /* deletes. To compile it within your build of the library, you */
+ /* should define FT_DEBUG_MEMORY here. */
+ /* */
+ /* Note that the memory debugger is only activated at runtime when */
+ /* when the _environment_ variable `FT2_DEBUG_MEMORY' is defined also! */
+ /* */
+ /* Do not #undef this macro here since the build system might define */
+ /* it for certain configurations only. */
+ /* */
+/* #define FT_DEBUG_MEMORY */
+
+
+ /*************************************************************************/
+ /* */
+ /* Module errors */
+ /* */
+ /* If this macro is set (which is _not_ the default), the higher byte */
+ /* of an error code gives the module in which the error has occurred, */
+ /* while the lower byte is the real error code. */
+ /* */
+ /* Setting this macro makes sense for debugging purposes only, since */
+ /* it would break source compatibility of certain programs that use */
+ /* FreeType 2. */
+ /* */
+ /* More details can be found in the files ftmoderr.h and fterrors.h. */
+ /* */
+#undef FT_CONFIG_OPTION_USE_MODULE_ERRORS
+
+
+ /*************************************************************************/
+ /* */
+ /* Position Independent Code */
+ /* */
+ /* If this macro is set (which is _not_ the default), FreeType2 will */
+ /* avoid creating constants that require address fixups. Instead the */
+ /* constants will be moved into a struct and additional intialization */
+ /* code will be used. */
+ /* */
+ /* Setting this macro is needed for systems that prohibit address */
+ /* fixups, such as BREW. */
+ /* */
+/* #define FT_CONFIG_OPTION_PIC */
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** S F N T D R I V E R C O N F I G U R A T I O N ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* Define TT_CONFIG_OPTION_EMBEDDED_BITMAPS if you want to support */
+ /* embedded bitmaps in all formats using the SFNT module (namely */
+ /* TrueType & OpenType). */
+ /* */
+#undef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+
+
+ /*************************************************************************/
+ /* */
+ /* Define TT_CONFIG_OPTION_POSTSCRIPT_NAMES if you want to be able to */
+ /* load and enumerate the glyph Postscript names in a TrueType or */
+ /* OpenType file. */
+ /* */
+ /* Note that when you do not compile the `PSNames' module by undefining */
+ /* the above FT_CONFIG_OPTION_POSTSCRIPT_NAMES, the `sfnt' module will */
+ /* contain additional code used to read the PS Names table from a font. */
+ /* */
+ /* (By default, the module uses `PSNames' to extract glyph names.) */
+ /* */
+#define TT_CONFIG_OPTION_POSTSCRIPT_NAMES
+
+
+ /*************************************************************************/
+ /* */
+ /* Define TT_CONFIG_OPTION_SFNT_NAMES if your applications need to */
+ /* access the internal name table in a SFNT-based format like TrueType */
+ /* or OpenType. The name table contains various strings used to */
+ /* describe the font, like family name, copyright, version, etc. It */
+ /* does not contain any glyph name though. */
+ /* */
+ /* Accessing SFNT names is done through the functions declared in */
+ /* `freetype/ftsnames.h'. */
+ /* */
+#define TT_CONFIG_OPTION_SFNT_NAMES
+
+
+ /*************************************************************************/
+ /* */
+ /* TrueType CMap support */
+ /* */
+ /* Here you can fine-tune which TrueType CMap table format shall be */
+ /* supported. */
+#define TT_CONFIG_CMAP_FORMAT_0
+#define TT_CONFIG_CMAP_FORMAT_2
+#define TT_CONFIG_CMAP_FORMAT_4
+#define TT_CONFIG_CMAP_FORMAT_6
+#define TT_CONFIG_CMAP_FORMAT_8
+#define TT_CONFIG_CMAP_FORMAT_10
+#define TT_CONFIG_CMAP_FORMAT_12
+#define TT_CONFIG_CMAP_FORMAT_13
+#define TT_CONFIG_CMAP_FORMAT_14
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** T R U E T Y P E D R I V E R C O N F I G U R A T I O N ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* Define TT_CONFIG_OPTION_BYTECODE_INTERPRETER if you want to compile */
+ /* a bytecode interpreter in the TrueType driver. */
+ /* */
+ /* By undefining this, you will only compile the code necessary to load */
+ /* TrueType glyphs without hinting. */
+ /* */
+ /* Do not #undef this macro here, since the build system might */
+ /* define it for certain configurations only. */
+ /* */
+#define TT_CONFIG_OPTION_BYTECODE_INTERPRETER
+
+
+ /*************************************************************************/
+ /* */
+ /* Define TT_CONFIG_OPTION_SUBPIXEL_HINTING if you want to compile */
+ /* EXPERIMENTAL subpixel hinting support into the TrueType driver. This */
+ /* replaces the native TrueType hinting mechanism when anything but */
+ /* FT_RENDER_MODE_MONO is requested. */
+ /* */
+ /* Enabling this causes the TrueType driver to ignore instructions under */
+ /* certain conditions. This is done in accordance with the guide here, */
+ /* with some minor differences: */
+ /* */
+ /* http://www.microsoft.com/typography/cleartype/truetypecleartype.aspx */
+ /* */
+ /* By undefining this, you only compile the code necessary to hint */
+ /* TrueType glyphs with native TT hinting. */
+ /* */
+ /* This option requires TT_CONFIG_OPTION_BYTECODE_INTERPRETER to be */
+ /* defined. */
+ /* */
+/* #define TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+
+ /*************************************************************************/
+ /* */
+ /* If you define TT_CONFIG_OPTION_UNPATENTED_HINTING, a special version */
+ /* of the TrueType bytecode interpreter is used that doesn't implement */
+ /* any of the patented opcodes and algorithms. The patents related to */
+ /* TrueType hinting have expired worldwide since May 2010; this option */
+ /* is now deprecated. */
+ /* */
+ /* Note that the TT_CONFIG_OPTION_UNPATENTED_HINTING macro is *ignored* */
+ /* if you define TT_CONFIG_OPTION_BYTECODE_INTERPRETER; in other words, */
+ /* either define TT_CONFIG_OPTION_BYTECODE_INTERPRETER or */
+ /* TT_CONFIG_OPTION_UNPATENTED_HINTING but not both at the same time. */
+ /* */
+ /* This macro is only useful for a small number of font files (mostly */
+ /* for Asian scripts) that require bytecode interpretation to properly */
+ /* load glyphs. For all other fonts, this produces unpleasant results, */
+ /* thus the unpatented interpreter is never used to load glyphs from */
+ /* TrueType fonts unless one of the following two options is used. */
+ /* */
+ /* - The unpatented interpreter is explicitly activated by the user */
+ /* through the FT_PARAM_TAG_UNPATENTED_HINTING parameter tag */
+ /* when opening the FT_Face. */
+ /* */
+ /* - FreeType detects that the FT_Face corresponds to one of the */
+ /* `trick' fonts (e.g., `Mingliu') it knows about. The font engine */
+ /* contains a hard-coded list of font names and other matching */
+ /* parameters (see function `tt_face_init' in file */
+ /* `src/truetype/ttobjs.c'). */
+ /* */
+ /* Here a sample code snippet for using FT_PARAM_TAG_UNPATENTED_HINTING. */
+ /* */
+ /* { */
+ /* FT_Parameter parameter; */
+ /* FT_Open_Args open_args; */
+ /* */
+ /* */
+ /* parameter.tag = FT_PARAM_TAG_UNPATENTED_HINTING; */
+ /* */
+ /* open_args.flags = FT_OPEN_PATHNAME | FT_OPEN_PARAMS; */
+ /* open_args.pathname = my_font_pathname; */
+ /* open_args.num_params = 1; */
+ /* open_args.params = &parameter; */
+ /* */
+ /* error = FT_Open_Face( library, &open_args, index, &face ); */
+ /* ... */
+ /* } */
+ /* */
+/* #define TT_CONFIG_OPTION_UNPATENTED_HINTING */
+
+
+ /*************************************************************************/
+ /* */
+ /* Define TT_CONFIG_OPTION_INTERPRETER_SWITCH to compile the TrueType */
+ /* bytecode interpreter with a huge switch statement, rather than a call */
+ /* table. This results in smaller and faster code for a number of */
+ /* architectures. */
+ /* */
+ /* Note however that on some compiler/processor combinations, undefining */
+ /* this macro will generate faster, though larger, code. */
+ /* */
+#define TT_CONFIG_OPTION_INTERPRETER_SWITCH
+
+
+ /*************************************************************************/
+ /* */
+ /* Define TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED to compile the */
+ /* TrueType glyph loader to use Apple's definition of how to handle */
+ /* component offsets in composite glyphs. */
+ /* */
+ /* Apple and MS disagree on the default behavior of component offsets */
+ /* in composites. Apple says that they should be scaled by the scaling */
+ /* factors in the transformation matrix (roughly, it's more complex) */
+ /* while MS says they should not. OpenType defines two bits in the */
+ /* composite flags array which can be used to disambiguate, but old */
+ /* fonts will not have them. */
+ /* */
+ /* http://www.microsoft.com/typography/otspec/glyf.htm */
+ /* http://fonts.apple.com/TTRefMan/RM06/Chap6glyf.html */
+ /* */
+#undef TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED
+
+
+ /*************************************************************************/
+ /* */
+ /* Define TT_CONFIG_OPTION_GX_VAR_SUPPORT if you want to include */
+ /* support for Apple's distortable font technology (fvar, gvar, cvar, */
+ /* and avar tables). This has many similarities to Type 1 Multiple */
+ /* Masters support. */
+ /* */
+#undef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+
+
+ /*************************************************************************/
+ /* */
+ /* Define TT_CONFIG_OPTION_BDF if you want to include support for */
+ /* an embedded `BDF ' table within SFNT-based bitmap formats. */
+ /* */
+#undef TT_CONFIG_OPTION_BDF
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** T Y P E 1 D R I V E R C O N F I G U R A T I O N ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* T1_MAX_DICT_DEPTH is the maximum depth of nest dictionaries and */
+ /* arrays in the Type 1 stream (see t1load.c). A minimum of 4 is */
+ /* required. */
+ /* */
+#define T1_MAX_DICT_DEPTH 5
+
+
+ /*************************************************************************/
+ /* */
+ /* T1_MAX_SUBRS_CALLS details the maximum number of nested sub-routine */
+ /* calls during glyph loading. */
+ /* */
+#define T1_MAX_SUBRS_CALLS 16
+
+
+ /*************************************************************************/
+ /* */
+ /* T1_MAX_CHARSTRING_OPERANDS is the charstring stack's capacity. A */
+ /* minimum of 16 is required. */
+ /* */
+ /* The Chinese font MingTiEG-Medium (CNS 11643 character set) needs 256. */
+ /* */
+#define T1_MAX_CHARSTRINGS_OPERANDS 512
+
+
+ /*************************************************************************/
+ /* */
+ /* Define this configuration macro if you want to prevent the */
+ /* compilation of `t1afm', which is in charge of reading Type 1 AFM */
+ /* files into an existing face. Note that if set, the T1 driver will be */
+ /* unable to produce kerning distances. */
+ /* */
+#undef T1_CONFIG_OPTION_NO_AFM
+
+
+ /*************************************************************************/
+ /* */
+ /* Define this configuration macro if you want to prevent the */
+ /* compilation of the Multiple Masters font support in the Type 1 */
+ /* driver. */
+ /* */
+#undef T1_CONFIG_OPTION_NO_MM_SUPPORT
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** C F F D R I V E R C O N F I G U R A T I O N ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* CFF_CONFIG_OPTION_OLD_ENGINE controls whether the pre-Adobe CFF */
+ /* engine gets compiled into FreeType. If defined, it is possible to */
+ /* switch between the two engines using the `hinting-engine' property of */
+ /* the cff driver module. */
+ /* */
+/* #define CFF_CONFIG_OPTION_OLD_ENGINE */
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** A U T O F I T M O D U L E C O N F I G U R A T I O N ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* Compile autofit module with CJK (Chinese, Japanese, Korean) script */
+ /* support. */
+ /* */
+#define AF_CONFIG_OPTION_CJK
+
+ /*************************************************************************/
+ /* */
+ /* Compile autofit module with Indic script support. */
+ /* */
+#define AF_CONFIG_OPTION_INDIC
+
+ /*************************************************************************/
+ /* */
+ /* Compile autofit module with warp hinting. The idea of the warping */
+ /* code is to slightly scale and shift a glyph within a single dimension */
+ /* so that as much of its segments are aligned (more or less) on the */
+ /* grid. To find out the optimal scaling and shifting value, various */
+ /* parameter combinations are tried and scored. */
+ /* */
+ /* This experimental option is only active if the render mode is */
+ /* FT_RENDER_MODE_LIGHT. */
+ /* */
+/* #define AF_CONFIG_OPTION_USE_WARPER */
+
+ /* */
+
+
+ /*
+ * This macro is obsolete. Support has been removed in FreeType
+ * version 2.5.
+ */
+/* #define FT_CONFIG_OPTION_OLD_INTERNALS */
+
+
+ /*
+ * This macro is defined if either unpatented or native TrueType
+ * hinting is requested by the definitions above.
+ */
+#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
+#define TT_USE_BYTECODE_INTERPRETER
+#undef TT_CONFIG_OPTION_UNPATENTED_HINTING
+#elif defined TT_CONFIG_OPTION_UNPATENTED_HINTING
+#define TT_USE_BYTECODE_INTERPRETER
+#endif
+
+FT_END_HEADER
+
+
+#endif /* __FTOPTION_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/config/ftstdlib.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/config/ftstdlib.h
new file mode 100644
index 0000000000..b7cd237f40
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/config/ftstdlib.h
@@ -0,0 +1,174 @@
+/***************************************************************************/
+/* */
+/* ftstdlib.h */
+/* */
+/* ANSI-specific library and header configuration file (specification */
+/* only). */
+/* */
+/* Copyright 2002-2007, 2009, 2011-2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* This file is used to group all #includes to the ANSI C library that */
+ /* FreeType normally requires. It also defines macros to rename the */
+ /* standard functions within the FreeType source code. */
+ /* */
+ /* Load a file which defines __FTSTDLIB_H__ before this one to override */
+ /* it. */
+ /* */
+ /*************************************************************************/
+
+
+#ifndef __FTSTDLIB_H__
+#define __FTSTDLIB_H__
+
+
+#include <stddef.h>
+
+#define ft_ptrdiff_t ptrdiff_t
+
+
+ /**********************************************************************/
+ /* */
+ /* integer limits */
+ /* */
+ /* UINT_MAX and ULONG_MAX are used to automatically compute the size */
+ /* of `int' and `long' in bytes at compile-time. So far, this works */
+ /* for all platforms the library has been tested on. */
+ /* */
+ /* Note that on the extremely rare platforms that do not provide */
+ /* integer types that are _exactly_ 16 and 32 bits wide (e.g. some */
+ /* old Crays where `int' is 36 bits), we do not make any guarantee */
+ /* about the correct behaviour of FT2 with all fonts. */
+ /* */
+ /* In these case, `ftconfig.h' will refuse to compile anyway with a */
+ /* message like `couldn't find 32-bit type' or something similar. */
+ /* */
+ /**********************************************************************/
+
+
+#include <limits.h>
+
+#define FT_CHAR_BIT CHAR_BIT
+#define FT_USHORT_MAX USHRT_MAX
+#define FT_INT_MAX INT_MAX
+#define FT_INT_MIN INT_MIN
+#define FT_UINT_MAX UINT_MAX
+#define FT_ULONG_MAX ULONG_MAX
+
+
+ /**********************************************************************/
+ /* */
+ /* character and string processing */
+ /* */
+ /**********************************************************************/
+
+#include "../../../../../../../include/fxcrt/fx_system.h"
+#include <string.h>
+
+#define ft_memchr FXSYS_memchr
+#define ft_memcmp FXSYS_memcmp32
+#define ft_memcpy FXSYS_memcpy32
+#define ft_memmove FXSYS_memmove32
+#define ft_memset FXSYS_memset8
+//#define ft_strcat FXSYS_strcat
+#define ft_strcmp FXSYS_strcmp
+#define ft_strcpy FXSYS_strcpy
+#define ft_strlen FXSYS_strlen
+#define ft_strncmp FXSYS_strncmp
+#define ft_strncpy FXSYS_strncpy
+#define ft_strrchr FXSYS_strrchr
+#define ft_strstr FXSYS_strstr
+
+
+ /**********************************************************************/
+ /* */
+ /* file handling */
+ /* */
+ /**********************************************************************/
+
+
+#include <stdio.h>
+
+#define FT_FILE FXSYS_FILE
+#define ft_fclose FXSYS_fclose
+#define ft_fopen FXSYS_fopen
+#define ft_fread FXSYS_fread
+#define ft_fseek FXSYS_fseek
+#define ft_ftell FXSYS_ftell
+#define ft_sprintf FXSYS_sprintf
+
+
+ /**********************************************************************/
+ /* */
+ /* sorting */
+ /* */
+ /**********************************************************************/
+
+
+//#include <stdlib.h>
+
+#define ft_qsort FXSYS_qsort
+
+
+ /**********************************************************************/
+ /* */
+ /* memory allocation */
+ /* */
+ /**********************************************************************/
+
+
+#define ft_scalloc calloc
+#define ft_sfree free
+#define ft_smalloc malloc
+#define ft_srealloc realloc
+
+
+ /**********************************************************************/
+ /* */
+ /* miscellaneous */
+ /* */
+ /**********************************************************************/
+
+
+#define ft_atol FXSYS_atoi
+#define ft_labs labs
+
+
+ /**********************************************************************/
+ /* */
+ /* execution control */
+ /* */
+ /**********************************************************************/
+
+
+//#include <setjmp.h>
+
+#define ft_jmp_buf jmp_buf /* note: this cannot be a typedef since */
+ /* jmp_buf is defined as a macro */
+ /* on certain platforms */
+
+#define ft_longjmp longjmp
+#define ft_setjmp( b ) setjmp( *(ft_jmp_buf*) &(b) ) /* same thing here */
+
+
+ /* the following is only used for debugging purposes, i.e., if */
+ /* FT_DEBUG_LEVEL_ERROR or FT_DEBUG_LEVEL_TRACE are defined */
+
+#include <stdarg.h>
+
+
+#endif /* __FTSTDLIB_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/freetype.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/freetype.h
new file mode 100644
index 0000000000..b6c77153a9
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/freetype.h
@@ -0,0 +1,4016 @@
+/***************************************************************************/
+/* */
+/* freetype.h */
+/* */
+/* FreeType high-level API and common types (specification only). */
+/* */
+/* Copyright 1996-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FREETYPE_H__
+#define __FREETYPE_H__
+
+
+#ifndef FT_FREETYPE_H
+#error "`ft2build.h' hasn't been included yet!"
+#error "Please always use macros to include FreeType header files."
+#error "Example:"
+#error " #include <ft2build.h>"
+#error " #include FT_FREETYPE_H"
+#endif
+
+
+#include "../ft2build.h"
+#include "config/ftconfig.h"
+#include "fttypes.h"
+#include "fterrors.h"
+
+
+FT_BEGIN_HEADER
+
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* user_allocation */
+ /* */
+ /* <Title> */
+ /* User allocation */
+ /* */
+ /* <Abstract> */
+ /* How client applications should allocate FreeType data structures. */
+ /* */
+ /* <Description> */
+ /* FreeType assumes that structures allocated by the user and passed */
+ /* as arguments are zeroed out except for the actual data. In other */
+ /* words, it is recommended to use `calloc' (or variants of it) */
+ /* instead of `malloc' for allocation. */
+ /* */
+ /*************************************************************************/
+
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /* */
+ /* B A S I C T Y P E S */
+ /* */
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* base_interface */
+ /* */
+ /* <Title> */
+ /* Base Interface */
+ /* */
+ /* <Abstract> */
+ /* The FreeType~2 base font interface. */
+ /* */
+ /* <Description> */
+ /* This section describes the public high-level API of FreeType~2. */
+ /* */
+ /* <Order> */
+ /* FT_Library */
+ /* FT_Face */
+ /* FT_Size */
+ /* FT_GlyphSlot */
+ /* FT_CharMap */
+ /* FT_Encoding */
+ /* */
+ /* FT_FaceRec */
+ /* */
+ /* FT_FACE_FLAG_SCALABLE */
+ /* FT_FACE_FLAG_FIXED_SIZES */
+ /* FT_FACE_FLAG_FIXED_WIDTH */
+ /* FT_FACE_FLAG_HORIZONTAL */
+ /* FT_FACE_FLAG_VERTICAL */
+ /* FT_FACE_FLAG_SFNT */
+ /* FT_FACE_FLAG_KERNING */
+ /* FT_FACE_FLAG_MULTIPLE_MASTERS */
+ /* FT_FACE_FLAG_GLYPH_NAMES */
+ /* FT_FACE_FLAG_EXTERNAL_STREAM */
+ /* FT_FACE_FLAG_FAST_GLYPHS */
+ /* FT_FACE_FLAG_HINTER */
+ /* */
+ /* FT_STYLE_FLAG_BOLD */
+ /* FT_STYLE_FLAG_ITALIC */
+ /* */
+ /* FT_SizeRec */
+ /* FT_Size_Metrics */
+ /* */
+ /* FT_GlyphSlotRec */
+ /* FT_Glyph_Metrics */
+ /* FT_SubGlyph */
+ /* */
+ /* FT_Bitmap_Size */
+ /* */
+ /* FT_Init_FreeType */
+ /* FT_Done_FreeType */
+ /* */
+ /* FT_New_Face */
+ /* FT_Done_Face */
+ /* FT_New_Memory_Face */
+ /* FT_Open_Face */
+ /* FT_Open_Args */
+ /* FT_Parameter */
+ /* FT_Attach_File */
+ /* FT_Attach_Stream */
+ /* */
+ /* FT_Set_Char_Size */
+ /* FT_Set_Pixel_Sizes */
+ /* FT_Request_Size */
+ /* FT_Select_Size */
+ /* FT_Size_Request_Type */
+ /* FT_Size_Request */
+ /* FT_Set_Transform */
+ /* FT_Load_Glyph */
+ /* FT_Get_Char_Index */
+ /* FT_Get_Name_Index */
+ /* FT_Load_Char */
+ /* */
+ /* FT_OPEN_MEMORY */
+ /* FT_OPEN_STREAM */
+ /* FT_OPEN_PATHNAME */
+ /* FT_OPEN_DRIVER */
+ /* FT_OPEN_PARAMS */
+ /* */
+ /* FT_LOAD_DEFAULT */
+ /* FT_LOAD_RENDER */
+ /* FT_LOAD_MONOCHROME */
+ /* FT_LOAD_LINEAR_DESIGN */
+ /* FT_LOAD_NO_SCALE */
+ /* FT_LOAD_NO_HINTING */
+ /* FT_LOAD_NO_BITMAP */
+ /* FT_LOAD_CROP_BITMAP */
+ /* */
+ /* FT_LOAD_VERTICAL_LAYOUT */
+ /* FT_LOAD_IGNORE_TRANSFORM */
+ /* FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH */
+ /* FT_LOAD_FORCE_AUTOHINT */
+ /* FT_LOAD_NO_RECURSE */
+ /* FT_LOAD_PEDANTIC */
+ /* */
+ /* FT_LOAD_TARGET_NORMAL */
+ /* FT_LOAD_TARGET_LIGHT */
+ /* FT_LOAD_TARGET_MONO */
+ /* FT_LOAD_TARGET_LCD */
+ /* FT_LOAD_TARGET_LCD_V */
+ /* */
+ /* FT_Render_Glyph */
+ /* FT_Render_Mode */
+ /* FT_Get_Kerning */
+ /* FT_Kerning_Mode */
+ /* FT_Get_Track_Kerning */
+ /* FT_Get_Glyph_Name */
+ /* FT_Get_Postscript_Name */
+ /* */
+ /* FT_CharMapRec */
+ /* FT_Select_Charmap */
+ /* FT_Set_Charmap */
+ /* FT_Get_Charmap_Index */
+ /* */
+ /* FT_FSTYPE_INSTALLABLE_EMBEDDING */
+ /* FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING */
+ /* FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING */
+ /* FT_FSTYPE_EDITABLE_EMBEDDING */
+ /* FT_FSTYPE_NO_SUBSETTING */
+ /* FT_FSTYPE_BITMAP_EMBEDDING_ONLY */
+ /* */
+ /* FT_Get_FSType_Flags */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Glyph_Metrics */
+ /* */
+ /* <Description> */
+ /* A structure used to model the metrics of a single glyph. The */
+ /* values are expressed in 26.6 fractional pixel format; if the flag */
+ /* @FT_LOAD_NO_SCALE has been used while loading the glyph, values */
+ /* are expressed in font units instead. */
+ /* */
+ /* <Fields> */
+ /* width :: */
+ /* The glyph's width. */
+ /* */
+ /* height :: */
+ /* The glyph's height. */
+ /* */
+ /* horiBearingX :: */
+ /* Left side bearing for horizontal layout. */
+ /* */
+ /* horiBearingY :: */
+ /* Top side bearing for horizontal layout. */
+ /* */
+ /* horiAdvance :: */
+ /* Advance width for horizontal layout. */
+ /* */
+ /* vertBearingX :: */
+ /* Left side bearing for vertical layout. */
+ /* */
+ /* vertBearingY :: */
+ /* Top side bearing for vertical layout. Larger positive values */
+ /* mean further below the vertical glyph origin. */
+ /* */
+ /* vertAdvance :: */
+ /* Advance height for vertical layout. Positive values mean the */
+ /* glyph has a positive advance downward. */
+ /* */
+ /* <Note> */
+ /* If not disabled with @FT_LOAD_NO_HINTING, the values represent */
+ /* dimensions of the hinted glyph (in case hinting is applicable). */
+ /* */
+ /* Stroking a glyph with an outside border does not increase */
+ /* `horiAdvance' or `vertAdvance'; you have to manually adjust these */
+ /* values to account for the added width and height. */
+ /* */
+ typedef struct FT_Glyph_Metrics_
+ {
+ FT_Pos width;
+ FT_Pos height;
+
+ FT_Pos horiBearingX;
+ FT_Pos horiBearingY;
+ FT_Pos horiAdvance;
+
+ FT_Pos vertBearingX;
+ FT_Pos vertBearingY;
+ FT_Pos vertAdvance;
+
+ } FT_Glyph_Metrics;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Bitmap_Size */
+ /* */
+ /* <Description> */
+ /* This structure models the metrics of a bitmap strike (i.e., a set */
+ /* of glyphs for a given point size and resolution) in a bitmap font. */
+ /* It is used for the `available_sizes' field of @FT_Face. */
+ /* */
+ /* <Fields> */
+ /* height :: The vertical distance, in pixels, between two */
+ /* consecutive baselines. It is always positive. */
+ /* */
+ /* width :: The average width, in pixels, of all glyphs in the */
+ /* strike. */
+ /* */
+ /* size :: The nominal size of the strike in 26.6 fractional */
+ /* points. This field is not very useful. */
+ /* */
+ /* x_ppem :: The horizontal ppem (nominal width) in 26.6 fractional */
+ /* pixels. */
+ /* */
+ /* y_ppem :: The vertical ppem (nominal height) in 26.6 fractional */
+ /* pixels. */
+ /* */
+ /* <Note> */
+ /* Windows FNT: */
+ /* The nominal size given in a FNT font is not reliable. Thus when */
+ /* the driver finds it incorrect, it sets `size' to some calculated */
+ /* values and sets `x_ppem' and `y_ppem' to the pixel width and */
+ /* height given in the font, respectively. */
+ /* */
+ /* TrueType embedded bitmaps: */
+ /* `size', `width', and `height' values are not contained in the */
+ /* bitmap strike itself. They are computed from the global font */
+ /* parameters. */
+ /* */
+ typedef struct FT_Bitmap_Size_
+ {
+ FT_Short height;
+ FT_Short width;
+
+ FT_Pos size;
+
+ FT_Pos x_ppem;
+ FT_Pos y_ppem;
+
+ } FT_Bitmap_Size;
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /* */
+ /* O B J E C T C L A S S E S */
+ /* */
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Library */
+ /* */
+ /* <Description> */
+ /* A handle to a FreeType library instance. Each `library' is */
+ /* completely independent from the others; it is the `root' of a set */
+ /* of objects like fonts, faces, sizes, etc. */
+ /* */
+ /* It also embeds a memory manager (see @FT_Memory), as well as a */
+ /* scan-line converter object (see @FT_Raster). */
+ /* */
+ /* In multi-threaded applications, make sure that the same FT_Library */
+ /* object or any of its children doesn't get accessed in parallel. */
+ /* */
+ /* <Note> */
+ /* Library objects are normally created by @FT_Init_FreeType, and */
+ /* destroyed with @FT_Done_FreeType. If you need reference-counting */
+ /* (cf. @FT_Reference_Library), use @FT_New_Library and */
+ /* @FT_Done_Library. */
+ /* */
+ typedef struct FT_LibraryRec_ *FT_Library;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Module */
+ /* */
+ /* <Description> */
+ /* A handle to a given FreeType module object. Each module can be a */
+ /* font driver, a renderer, or anything else that provides services */
+ /* to the formers. */
+ /* */
+ typedef struct FT_ModuleRec_* FT_Module;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Driver */
+ /* */
+ /* <Description> */
+ /* A handle to a given FreeType font driver object. Each font driver */
+ /* is a special module capable of creating faces from font files. */
+ /* */
+ typedef struct FT_DriverRec_* FT_Driver;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Renderer */
+ /* */
+ /* <Description> */
+ /* A handle to a given FreeType renderer. A renderer is a special */
+ /* module in charge of converting a glyph image to a bitmap, when */
+ /* necessary. Each renderer supports a given glyph image format, and */
+ /* one or more target surface depths. */
+ /* */
+ typedef struct FT_RendererRec_* FT_Renderer;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Face */
+ /* */
+ /* <Description> */
+ /* A handle to a given typographic face object. A face object models */
+ /* a given typeface, in a given style. */
+ /* */
+ /* <Note> */
+ /* Each face object also owns a single @FT_GlyphSlot object, as well */
+ /* as one or more @FT_Size objects. */
+ /* */
+ /* Use @FT_New_Face or @FT_Open_Face to create a new face object from */
+ /* a given filepathname or a custom input stream. */
+ /* */
+ /* Use @FT_Done_Face to destroy it (along with its slot and sizes). */
+ /* */
+ /* <Also> */
+ /* See @FT_FaceRec for the publicly accessible fields of a given face */
+ /* object. */
+ /* */
+ typedef struct FT_FaceRec_* FT_Face;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Size */
+ /* */
+ /* <Description> */
+ /* A handle to an object used to model a face scaled to a given */
+ /* character size. */
+ /* */
+ /* <Note> */
+ /* Each @FT_Face has an _active_ @FT_Size object that is used by */
+ /* functions like @FT_Load_Glyph to determine the scaling */
+ /* transformation which is used to load and hint glyphs and metrics. */
+ /* */
+ /* You can use @FT_Set_Char_Size, @FT_Set_Pixel_Sizes, */
+ /* @FT_Request_Size or even @FT_Select_Size to change the content */
+ /* (i.e., the scaling values) of the active @FT_Size. */
+ /* */
+ /* You can use @FT_New_Size to create additional size objects for a */
+ /* given @FT_Face, but they won't be used by other functions until */
+ /* you activate it through @FT_Activate_Size. Only one size can be */
+ /* activated at any given time per face. */
+ /* */
+ /* <Also> */
+ /* See @FT_SizeRec for the publicly accessible fields of a given size */
+ /* object. */
+ /* */
+ typedef struct FT_SizeRec_* FT_Size;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_GlyphSlot */
+ /* */
+ /* <Description> */
+ /* A handle to a given `glyph slot'. A slot is a container where it */
+ /* is possible to load any of the glyphs contained in its parent */
+ /* face. */
+ /* */
+ /* In other words, each time you call @FT_Load_Glyph or */
+ /* @FT_Load_Char, the slot's content is erased by the new glyph data, */
+ /* i.e., the glyph's metrics, its image (bitmap or outline), and */
+ /* other control information. */
+ /* */
+ /* <Also> */
+ /* See @FT_GlyphSlotRec for the publicly accessible glyph fields. */
+ /* */
+ typedef struct FT_GlyphSlotRec_* FT_GlyphSlot;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_CharMap */
+ /* */
+ /* <Description> */
+ /* A handle to a given character map. A charmap is used to translate */
+ /* character codes in a given encoding into glyph indexes for its */
+ /* parent's face. Some font formats may provide several charmaps per */
+ /* font. */
+ /* */
+ /* Each face object owns zero or more charmaps, but only one of them */
+ /* can be `active' and used by @FT_Get_Char_Index or @FT_Load_Char. */
+ /* */
+ /* The list of available charmaps in a face is available through the */
+ /* `face->num_charmaps' and `face->charmaps' fields of @FT_FaceRec. */
+ /* */
+ /* The currently active charmap is available as `face->charmap'. */
+ /* You should call @FT_Set_Charmap to change it. */
+ /* */
+ /* <Note> */
+ /* When a new face is created (either through @FT_New_Face or */
+ /* @FT_Open_Face), the library looks for a Unicode charmap within */
+ /* the list and automatically activates it. */
+ /* */
+ /* <Also> */
+ /* See @FT_CharMapRec for the publicly accessible fields of a given */
+ /* character map. */
+ /* */
+ typedef struct FT_CharMapRec_* FT_CharMap;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Macro> */
+ /* FT_ENC_TAG */
+ /* */
+ /* <Description> */
+ /* This macro converts four-letter tags into an unsigned long. It is */
+ /* used to define `encoding' identifiers (see @FT_Encoding). */
+ /* */
+ /* <Note> */
+ /* Since many 16-bit compilers don't like 32-bit enumerations, you */
+ /* should redefine this macro in case of problems to something like */
+ /* this: */
+ /* */
+ /* { */
+ /* #define FT_ENC_TAG( value, a, b, c, d ) value */
+ /* } */
+ /* */
+ /* to get a simple enumeration without assigning special numbers. */
+ /* */
+
+#ifndef FT_ENC_TAG
+#define FT_ENC_TAG( value, a, b, c, d ) \
+ value = ( ( (FT_UInt32)(a) << 24 ) | \
+ ( (FT_UInt32)(b) << 16 ) | \
+ ( (FT_UInt32)(c) << 8 ) | \
+ (FT_UInt32)(d) )
+
+#endif /* FT_ENC_TAG */
+
+
+ /*************************************************************************/
+ /* */
+ /* <Enum> */
+ /* FT_Encoding */
+ /* */
+ /* <Description> */
+ /* An enumeration used to specify character sets supported by */
+ /* charmaps. Used in the @FT_Select_Charmap API function. */
+ /* */
+ /* <Note> */
+ /* Despite the name, this enumeration lists specific character */
+ /* repertories (i.e., charsets), and not text encoding methods (e.g., */
+ /* UTF-8, UTF-16, etc.). */
+ /* */
+ /* Other encodings might be defined in the future. */
+ /* */
+ /* <Values> */
+ /* FT_ENCODING_NONE :: */
+ /* The encoding value~0 is reserved. */
+ /* */
+ /* FT_ENCODING_UNICODE :: */
+ /* Corresponds to the Unicode character set. This value covers */
+ /* all versions of the Unicode repertoire, including ASCII and */
+ /* Latin-1. Most fonts include a Unicode charmap, but not all */
+ /* of them. */
+ /* */
+ /* For example, if you want to access Unicode value U+1F028 (and */
+ /* the font contains it), use value 0x1F028 as the input value for */
+ /* @FT_Get_Char_Index. */
+ /* */
+ /* FT_ENCODING_MS_SYMBOL :: */
+ /* Corresponds to the Microsoft Symbol encoding, used to encode */
+ /* mathematical symbols in the 32..255 character code range. For */
+ /* more information, see `http://www.ceviz.net/symbol.htm'. */
+ /* */
+ /* FT_ENCODING_SJIS :: */
+ /* Corresponds to Japanese SJIS encoding. More info at */
+ /* at `http://langsupport.japanreference.com/encoding.shtml'. */
+ /* See note on multi-byte encodings below. */
+ /* */
+ /* FT_ENCODING_GB2312 :: */
+ /* Corresponds to an encoding system for Simplified Chinese as used */
+ /* used in mainland China. */
+ /* */
+ /* FT_ENCODING_BIG5 :: */
+ /* Corresponds to an encoding system for Traditional Chinese as */
+ /* used in Taiwan and Hong Kong. */
+ /* */
+ /* FT_ENCODING_WANSUNG :: */
+ /* Corresponds to the Korean encoding system known as Wansung. */
+ /* For more information see */
+ /* `http://www.microsoft.com/typography/unicode/949.txt'. */
+ /* */
+ /* FT_ENCODING_JOHAB :: */
+ /* The Korean standard character set (KS~C 5601-1992), which */
+ /* corresponds to MS Windows code page 1361. This character set */
+ /* includes all possible Hangeul character combinations. */
+ /* */
+ /* FT_ENCODING_ADOBE_LATIN_1 :: */
+ /* Corresponds to a Latin-1 encoding as defined in a Type~1 */
+ /* PostScript font. It is limited to 256 character codes. */
+ /* */
+ /* FT_ENCODING_ADOBE_STANDARD :: */
+ /* Corresponds to the Adobe Standard encoding, as found in Type~1, */
+ /* CFF, and OpenType/CFF fonts. It is limited to 256 character */
+ /* codes. */
+ /* */
+ /* FT_ENCODING_ADOBE_EXPERT :: */
+ /* Corresponds to the Adobe Expert encoding, as found in Type~1, */
+ /* CFF, and OpenType/CFF fonts. It is limited to 256 character */
+ /* codes. */
+ /* */
+ /* FT_ENCODING_ADOBE_CUSTOM :: */
+ /* Corresponds to a custom encoding, as found in Type~1, CFF, and */
+ /* OpenType/CFF fonts. It is limited to 256 character codes. */
+ /* */
+ /* FT_ENCODING_APPLE_ROMAN :: */
+ /* Corresponds to the 8-bit Apple roman encoding. Many TrueType */
+ /* and OpenType fonts contain a charmap for this encoding, since */
+ /* older versions of Mac OS are able to use it. */
+ /* */
+ /* FT_ENCODING_OLD_LATIN_2 :: */
+ /* This value is deprecated and was never used nor reported by */
+ /* FreeType. Don't use or test for it. */
+ /* */
+ /* FT_ENCODING_MS_SJIS :: */
+ /* Same as FT_ENCODING_SJIS. Deprecated. */
+ /* */
+ /* FT_ENCODING_MS_GB2312 :: */
+ /* Same as FT_ENCODING_GB2312. Deprecated. */
+ /* */
+ /* FT_ENCODING_MS_BIG5 :: */
+ /* Same as FT_ENCODING_BIG5. Deprecated. */
+ /* */
+ /* FT_ENCODING_MS_WANSUNG :: */
+ /* Same as FT_ENCODING_WANSUNG. Deprecated. */
+ /* */
+ /* FT_ENCODING_MS_JOHAB :: */
+ /* Same as FT_ENCODING_JOHAB. Deprecated. */
+ /* */
+ /* <Note> */
+ /* By default, FreeType automatically synthesizes a Unicode charmap */
+ /* for PostScript fonts, using their glyph names dictionaries. */
+ /* However, it also reports the encodings defined explicitly in the */
+ /* font file, for the cases when they are needed, with the Adobe */
+ /* values as well. */
+ /* */
+ /* FT_ENCODING_NONE is set by the BDF and PCF drivers if the charmap */
+ /* is neither Unicode nor ISO-8859-1 (otherwise it is set to */
+ /* FT_ENCODING_UNICODE). Use @FT_Get_BDF_Charset_ID to find out */
+ /* which encoding is really present. If, for example, the */
+ /* `cs_registry' field is `KOI8' and the `cs_encoding' field is `R', */
+ /* the font is encoded in KOI8-R. */
+ /* */
+ /* FT_ENCODING_NONE is always set (with a single exception) by the */
+ /* winfonts driver. Use @FT_Get_WinFNT_Header and examine the */
+ /* `charset' field of the @FT_WinFNT_HeaderRec structure to find out */
+ /* which encoding is really present. For example, */
+ /* @FT_WinFNT_ID_CP1251 (204) means Windows code page 1251 (for */
+ /* Russian). */
+ /* */
+ /* FT_ENCODING_NONE is set if `platform_id' is @TT_PLATFORM_MACINTOSH */
+ /* and `encoding_id' is not @TT_MAC_ID_ROMAN (otherwise it is set to */
+ /* FT_ENCODING_APPLE_ROMAN). */
+ /* */
+ /* If `platform_id' is @TT_PLATFORM_MACINTOSH, use the function */
+ /* @FT_Get_CMap_Language_ID to query the Mac language ID which may */
+ /* be needed to be able to distinguish Apple encoding variants. See */
+ /* */
+ /* http://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/README.TXT */
+ /* */
+ /* to get an idea how to do that. Basically, if the language ID */
+ /* is~0, don't use it, otherwise subtract 1 from the language ID. */
+ /* Then examine `encoding_id'. If, for example, `encoding_id' is */
+ /* @TT_MAC_ID_ROMAN and the language ID (minus~1) is */
+ /* `TT_MAC_LANGID_GREEK', it is the Greek encoding, not Roman. */
+ /* @TT_MAC_ID_ARABIC with `TT_MAC_LANGID_FARSI' means the Farsi */
+ /* variant the Arabic encoding. */
+ /* */
+ typedef enum FT_Encoding_
+ {
+ FT_ENC_TAG( FT_ENCODING_NONE, 0, 0, 0, 0 ),
+
+ FT_ENC_TAG( FT_ENCODING_MS_SYMBOL, 's', 'y', 'm', 'b' ),
+ FT_ENC_TAG( FT_ENCODING_UNICODE, 'u', 'n', 'i', 'c' ),
+
+ FT_ENC_TAG( FT_ENCODING_SJIS, 's', 'j', 'i', 's' ),
+ FT_ENC_TAG( FT_ENCODING_GB2312, 'g', 'b', ' ', ' ' ),
+ FT_ENC_TAG( FT_ENCODING_BIG5, 'b', 'i', 'g', '5' ),
+ FT_ENC_TAG( FT_ENCODING_WANSUNG, 'w', 'a', 'n', 's' ),
+ FT_ENC_TAG( FT_ENCODING_JOHAB, 'j', 'o', 'h', 'a' ),
+
+ /* for backwards compatibility */
+ FT_ENCODING_MS_SJIS = FT_ENCODING_SJIS,
+ FT_ENCODING_MS_GB2312 = FT_ENCODING_GB2312,
+ FT_ENCODING_MS_BIG5 = FT_ENCODING_BIG5,
+ FT_ENCODING_MS_WANSUNG = FT_ENCODING_WANSUNG,
+ FT_ENCODING_MS_JOHAB = FT_ENCODING_JOHAB,
+
+ FT_ENC_TAG( FT_ENCODING_ADOBE_STANDARD, 'A', 'D', 'O', 'B' ),
+ FT_ENC_TAG( FT_ENCODING_ADOBE_EXPERT, 'A', 'D', 'B', 'E' ),
+ FT_ENC_TAG( FT_ENCODING_ADOBE_CUSTOM, 'A', 'D', 'B', 'C' ),
+ FT_ENC_TAG( FT_ENCODING_ADOBE_LATIN_1, 'l', 'a', 't', '1' ),
+
+ FT_ENC_TAG( FT_ENCODING_OLD_LATIN_2, 'l', 'a', 't', '2' ),
+
+ FT_ENC_TAG( FT_ENCODING_APPLE_ROMAN, 'a', 'r', 'm', 'n' )
+
+ } FT_Encoding;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Enum> */
+ /* ft_encoding_xxx */
+ /* */
+ /* <Description> */
+ /* These constants are deprecated; use the corresponding @FT_Encoding */
+ /* values instead. */
+ /* */
+#define ft_encoding_none FT_ENCODING_NONE
+#define ft_encoding_unicode FT_ENCODING_UNICODE
+#define ft_encoding_symbol FT_ENCODING_MS_SYMBOL
+#define ft_encoding_latin_1 FT_ENCODING_ADOBE_LATIN_1
+#define ft_encoding_latin_2 FT_ENCODING_OLD_LATIN_2
+#define ft_encoding_sjis FT_ENCODING_SJIS
+#define ft_encoding_gb2312 FT_ENCODING_GB2312
+#define ft_encoding_big5 FT_ENCODING_BIG5
+#define ft_encoding_wansung FT_ENCODING_WANSUNG
+#define ft_encoding_johab FT_ENCODING_JOHAB
+
+#define ft_encoding_adobe_standard FT_ENCODING_ADOBE_STANDARD
+#define ft_encoding_adobe_expert FT_ENCODING_ADOBE_EXPERT
+#define ft_encoding_adobe_custom FT_ENCODING_ADOBE_CUSTOM
+#define ft_encoding_apple_roman FT_ENCODING_APPLE_ROMAN
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_CharMapRec */
+ /* */
+ /* <Description> */
+ /* The base charmap structure. */
+ /* */
+ /* <Fields> */
+ /* face :: A handle to the parent face object. */
+ /* */
+ /* encoding :: An @FT_Encoding tag identifying the charmap. Use */
+ /* this with @FT_Select_Charmap. */
+ /* */
+ /* platform_id :: An ID number describing the platform for the */
+ /* following encoding ID. This comes directly from */
+ /* the TrueType specification and should be emulated */
+ /* for other formats. */
+ /* */
+ /* encoding_id :: A platform specific encoding number. This also */
+ /* comes from the TrueType specification and should be */
+ /* emulated similarly. */
+ /* */
+ typedef struct FT_CharMapRec_
+ {
+ FT_Face face;
+ FT_Encoding encoding;
+ FT_UShort platform_id;
+ FT_UShort encoding_id;
+
+ } FT_CharMapRec;
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /* */
+ /* B A S E O B J E C T C L A S S E S */
+ /* */
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Face_Internal */
+ /* */
+ /* <Description> */
+ /* An opaque handle to an `FT_Face_InternalRec' structure, used to */
+ /* model private data of a given @FT_Face object. */
+ /* */
+ /* This structure might change between releases of FreeType~2 and is */
+ /* not generally available to client applications. */
+ /* */
+ typedef struct FT_Face_InternalRec_* FT_Face_Internal;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_FaceRec */
+ /* */
+ /* <Description> */
+ /* FreeType root face class structure. A face object models a */
+ /* typeface in a font file. */
+ /* */
+ /* <Fields> */
+ /* num_faces :: The number of faces in the font file. Some */
+ /* font formats can have multiple faces in */
+ /* a font file. */
+ /* */
+ /* face_index :: The index of the face in the font file. It */
+ /* is set to~0 if there is only one face in */
+ /* the font file. */
+ /* */
+ /* face_flags :: A set of bit flags that give important */
+ /* information about the face; see */
+ /* @FT_FACE_FLAG_XXX for the details. */
+ /* */
+ /* style_flags :: A set of bit flags indicating the style of */
+ /* the face; see @FT_STYLE_FLAG_XXX for the */
+ /* details. */
+ /* */
+ /* num_glyphs :: The number of glyphs in the face. If the */
+ /* face is scalable and has sbits (see */
+ /* `num_fixed_sizes'), it is set to the number */
+ /* of outline glyphs. */
+ /* */
+ /* For CID-keyed fonts, this value gives the */
+ /* highest CID used in the font. */
+ /* */
+ /* family_name :: The face's family name. This is an ASCII */
+ /* string, usually in English, which describes */
+ /* the typeface's family (like `Times New */
+ /* Roman', `Bodoni', `Garamond', etc). This */
+ /* is a least common denominator used to list */
+ /* fonts. Some formats (TrueType & OpenType) */
+ /* provide localized and Unicode versions of */
+ /* this string. Applications should use the */
+ /* format specific interface to access them. */
+ /* Can be NULL (e.g., in fonts embedded in a */
+ /* PDF file). */
+ /* */
+ /* style_name :: The face's style name. This is an ASCII */
+ /* string, usually in English, which describes */
+ /* the typeface's style (like `Italic', */
+ /* `Bold', `Condensed', etc). Not all font */
+ /* formats provide a style name, so this field */
+ /* is optional, and can be set to NULL. As */
+ /* for `family_name', some formats provide */
+ /* localized and Unicode versions of this */
+ /* string. Applications should use the format */
+ /* specific interface to access them. */
+ /* */
+ /* num_fixed_sizes :: The number of bitmap strikes in the face. */
+ /* Even if the face is scalable, there might */
+ /* still be bitmap strikes, which are called */
+ /* `sbits' in that case. */
+ /* */
+ /* available_sizes :: An array of @FT_Bitmap_Size for all bitmap */
+ /* strikes in the face. It is set to NULL if */
+ /* there is no bitmap strike. */
+ /* */
+ /* num_charmaps :: The number of charmaps in the face. */
+ /* */
+ /* charmaps :: An array of the charmaps of the face. */
+ /* */
+ /* generic :: A field reserved for client uses. See the */
+ /* @FT_Generic type description. */
+ /* */
+ /* bbox :: The font bounding box. Coordinates are */
+ /* expressed in font units (see */
+ /* `units_per_EM'). The box is large enough */
+ /* to contain any glyph from the font. Thus, */
+ /* `bbox.yMax' can be seen as the `maximum */
+ /* ascender', and `bbox.yMin' as the `minimum */
+ /* descender'. Only relevant for scalable */
+ /* formats. */
+ /* */
+ /* Note that the bounding box might be off by */
+ /* (at least) one pixel for hinted fonts. See */
+ /* @FT_Size_Metrics for further discussion. */
+ /* */
+ /* units_per_EM :: The number of font units per EM square for */
+ /* this face. This is typically 2048 for */
+ /* TrueType fonts, and 1000 for Type~1 fonts. */
+ /* Only relevant for scalable formats. */
+ /* */
+ /* ascender :: The typographic ascender of the face, */
+ /* expressed in font units. For font formats */
+ /* not having this information, it is set to */
+ /* `bbox.yMax'. Only relevant for scalable */
+ /* formats. */
+ /* */
+ /* descender :: The typographic descender of the face, */
+ /* expressed in font units. For font formats */
+ /* not having this information, it is set to */
+ /* `bbox.yMin'. Note that this field is */
+ /* usually negative. Only relevant for */
+ /* scalable formats. */
+ /* */
+ /* height :: This value is the vertical distance */
+ /* between two consecutive baselines, */
+ /* expressed in font units. It is always */
+ /* positive. Only relevant for scalable */
+ /* formats. */
+ /* */
+ /* If you want the global glyph height, use */
+ /* `ascender - descender'. */
+ /* */
+ /* max_advance_width :: The maximum advance width, in font units, */
+ /* for all glyphs in this face. This can be */
+ /* used to make word wrapping computations */
+ /* faster. Only relevant for scalable */
+ /* formats. */
+ /* */
+ /* max_advance_height :: The maximum advance height, in font units, */
+ /* for all glyphs in this face. This is only */
+ /* relevant for vertical layouts, and is set */
+ /* to `height' for fonts that do not provide */
+ /* vertical metrics. Only relevant for */
+ /* scalable formats. */
+ /* */
+ /* underline_position :: The position, in font units, of the */
+ /* underline line for this face. It is the */
+ /* center of the underlining stem. Only */
+ /* relevant for scalable formats. */
+ /* */
+ /* underline_thickness :: The thickness, in font units, of the */
+ /* underline for this face. Only relevant for */
+ /* scalable formats. */
+ /* */
+ /* glyph :: The face's associated glyph slot(s). */
+ /* */
+ /* size :: The current active size for this face. */
+ /* */
+ /* charmap :: The current active charmap for this face. */
+ /* */
+ /* <Note> */
+ /* Fields may be changed after a call to @FT_Attach_File or */
+ /* @FT_Attach_Stream. */
+ /* */
+ typedef struct FT_FaceRec_
+ {
+ FT_Long num_faces;
+ FT_Long face_index;
+
+ FT_Long face_flags;
+ FT_Long style_flags;
+
+ FT_Long num_glyphs;
+
+ FT_String* family_name;
+ FT_String* style_name;
+
+ FT_Int num_fixed_sizes;
+ FT_Bitmap_Size* available_sizes;
+
+ FT_Int num_charmaps;
+ FT_CharMap* charmaps;
+
+#ifdef _FX_MANAGED_CODE_
+#define generic generic_data
+#endif
+
+ FT_Generic generic;
+
+ /*# The following member variables (down to `underline_thickness') */
+ /*# are only relevant to scalable outlines; cf. @FT_Bitmap_Size */
+ /*# for bitmap fonts. */
+ FT_BBox bbox;
+
+ FT_UShort units_per_EM;
+ FT_Short ascender;
+ FT_Short descender;
+ FT_Short height;
+
+ FT_Short max_advance_width;
+ FT_Short max_advance_height;
+
+ FT_Short underline_position;
+ FT_Short underline_thickness;
+
+ FT_GlyphSlot glyph;
+ FT_Size size;
+ FT_CharMap charmap;
+
+ /*@private begin */
+
+ FT_Driver driver;
+ FT_Memory memory;
+ FT_Stream stream;
+
+ FT_ListRec sizes_list;
+
+ FT_Generic autohint; /* face-specific auto-hinter data */
+ void* extensions; /* unused */
+
+ FT_Face_Internal internal;
+
+ /*@private end */
+
+ } FT_FaceRec;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Enum> */
+ /* FT_FACE_FLAG_XXX */
+ /* */
+ /* <Description> */
+ /* A list of bit flags used in the `face_flags' field of the */
+ /* @FT_FaceRec structure. They inform client applications of */
+ /* properties of the corresponding face. */
+ /* */
+ /* <Values> */
+ /* FT_FACE_FLAG_SCALABLE :: */
+ /* Indicates that the face contains outline glyphs. This doesn't */
+ /* prevent bitmap strikes, i.e., a face can have both this and */
+ /* and @FT_FACE_FLAG_FIXED_SIZES set. */
+ /* */
+ /* FT_FACE_FLAG_FIXED_SIZES :: */
+ /* Indicates that the face contains bitmap strikes. See also the */
+ /* `num_fixed_sizes' and `available_sizes' fields of @FT_FaceRec. */
+ /* */
+ /* FT_FACE_FLAG_FIXED_WIDTH :: */
+ /* Indicates that the face contains fixed-width characters (like */
+ /* Courier, Lucido, MonoType, etc.). */
+ /* */
+ /* FT_FACE_FLAG_SFNT :: */
+ /* Indicates that the face uses the `sfnt' storage scheme. For */
+ /* now, this means TrueType and OpenType. */
+ /* */
+ /* FT_FACE_FLAG_HORIZONTAL :: */
+ /* Indicates that the face contains horizontal glyph metrics. This */
+ /* should be set for all common formats. */
+ /* */
+ /* FT_FACE_FLAG_VERTICAL :: */
+ /* Indicates that the face contains vertical glyph metrics. This */
+ /* is only available in some formats, not all of them. */
+ /* */
+ /* FT_FACE_FLAG_KERNING :: */
+ /* Indicates that the face contains kerning information. If set, */
+ /* the kerning distance can be retrieved through the function */
+ /* @FT_Get_Kerning. Otherwise the function always return the */
+ /* vector (0,0). Note that FreeType doesn't handle kerning data */
+ /* from the `GPOS' table (as present in some OpenType fonts). */
+ /* */
+ /* FT_FACE_FLAG_FAST_GLYPHS :: */
+ /* THIS FLAG IS DEPRECATED. DO NOT USE OR TEST IT. */
+ /* */
+ /* FT_FACE_FLAG_MULTIPLE_MASTERS :: */
+ /* Indicates that the font contains multiple masters and is capable */
+ /* of interpolating between them. See the multiple-masters */
+ /* specific API for details. */
+ /* */
+ /* FT_FACE_FLAG_GLYPH_NAMES :: */
+ /* Indicates that the font contains glyph names that can be */
+ /* retrieved through @FT_Get_Glyph_Name. Note that some TrueType */
+ /* fonts contain broken glyph name tables. Use the function */
+ /* @FT_Has_PS_Glyph_Names when needed. */
+ /* */
+ /* FT_FACE_FLAG_EXTERNAL_STREAM :: */
+ /* Used internally by FreeType to indicate that a face's stream was */
+ /* provided by the client application and should not be destroyed */
+ /* when @FT_Done_Face is called. Don't read or test this flag. */
+ /* */
+ /* FT_FACE_FLAG_HINTER :: */
+ /* Set if the font driver has a hinting machine of its own. For */
+ /* example, with TrueType fonts, it makes sense to use data from */
+ /* the SFNT `gasp' table only if the native TrueType hinting engine */
+ /* (with the bytecode interpreter) is available and active. */
+ /* */
+ /* FT_FACE_FLAG_CID_KEYED :: */
+ /* Set if the font is CID-keyed. In that case, the font is not */
+ /* accessed by glyph indices but by CID values. For subsetted */
+ /* CID-keyed fonts this has the consequence that not all index */
+ /* values are a valid argument to FT_Load_Glyph. Only the CID */
+ /* values for which corresponding glyphs in the subsetted font */
+ /* exist make FT_Load_Glyph return successfully; in all other cases */
+ /* you get an `FT_Err_Invalid_Argument' error. */
+ /* */
+ /* Note that CID-keyed fonts which are in an SFNT wrapper don't */
+ /* have this flag set since the glyphs are accessed in the normal */
+ /* way (using contiguous indices); the `CID-ness' isn't visible to */
+ /* the application. */
+ /* */
+ /* FT_FACE_FLAG_TRICKY :: */
+ /* Set if the font is `tricky', this is, it always needs the */
+ /* font format's native hinting engine to get a reasonable result. */
+ /* A typical example is the Chinese font `mingli.ttf' which uses */
+ /* TrueType bytecode instructions to move and scale all of its */
+ /* subglyphs. */
+ /* */
+ /* It is not possible to autohint such fonts using */
+ /* @FT_LOAD_FORCE_AUTOHINT; it will also ignore */
+ /* @FT_LOAD_NO_HINTING. You have to set both @FT_LOAD_NO_HINTING */
+ /* and @FT_LOAD_NO_AUTOHINT to really disable hinting; however, you */
+ /* probably never want this except for demonstration purposes. */
+ /* */
+ /* Currently, there are about a dozen TrueType fonts in the list of */
+ /* tricky fonts; they are hard-coded in file `ttobjs.c'. */
+ /* */
+#define FT_FACE_FLAG_SCALABLE ( 1L << 0 )
+#define FT_FACE_FLAG_FIXED_SIZES ( 1L << 1 )
+#define FT_FACE_FLAG_FIXED_WIDTH ( 1L << 2 )
+#define FT_FACE_FLAG_SFNT ( 1L << 3 )
+#define FT_FACE_FLAG_HORIZONTAL ( 1L << 4 )
+#define FT_FACE_FLAG_VERTICAL ( 1L << 5 )
+#define FT_FACE_FLAG_KERNING ( 1L << 6 )
+#define FT_FACE_FLAG_FAST_GLYPHS ( 1L << 7 )
+#define FT_FACE_FLAG_MULTIPLE_MASTERS ( 1L << 8 )
+#define FT_FACE_FLAG_GLYPH_NAMES ( 1L << 9 )
+#define FT_FACE_FLAG_EXTERNAL_STREAM ( 1L << 10 )
+#define FT_FACE_FLAG_HINTER ( 1L << 11 )
+#define FT_FACE_FLAG_CID_KEYED ( 1L << 12 )
+#define FT_FACE_FLAG_TRICKY ( 1L << 13 )
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_HAS_HORIZONTAL( face )
+ *
+ * @description:
+ * A macro that returns true whenever a face object contains
+ * horizontal metrics (this is true for all font formats though).
+ *
+ * @also:
+ * @FT_HAS_VERTICAL can be used to check for vertical metrics.
+ *
+ */
+#define FT_HAS_HORIZONTAL( face ) \
+ ( face->face_flags & FT_FACE_FLAG_HORIZONTAL )
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_HAS_VERTICAL( face )
+ *
+ * @description:
+ * A macro that returns true whenever a face object contains real
+ * vertical metrics (and not only synthesized ones).
+ *
+ */
+#define FT_HAS_VERTICAL( face ) \
+ ( face->face_flags & FT_FACE_FLAG_VERTICAL )
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_HAS_KERNING( face )
+ *
+ * @description:
+ * A macro that returns true whenever a face object contains kerning
+ * data that can be accessed with @FT_Get_Kerning.
+ *
+ */
+#define FT_HAS_KERNING( face ) \
+ ( face->face_flags & FT_FACE_FLAG_KERNING )
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_IS_SCALABLE( face )
+ *
+ * @description:
+ * A macro that returns true whenever a face object contains a scalable
+ * font face (true for TrueType, Type~1, Type~42, CID, OpenType/CFF,
+ * and PFR font formats.
+ *
+ */
+#define FT_IS_SCALABLE( face ) \
+ ( face->face_flags & FT_FACE_FLAG_SCALABLE )
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_IS_SFNT( face )
+ *
+ * @description:
+ * A macro that returns true whenever a face object contains a font
+ * whose format is based on the SFNT storage scheme. This usually
+ * means: TrueType fonts, OpenType fonts, as well as SFNT-based embedded
+ * bitmap fonts.
+ *
+ * If this macro is true, all functions defined in @FT_SFNT_NAMES_H and
+ * @FT_TRUETYPE_TABLES_H are available.
+ *
+ */
+#define FT_IS_SFNT( face ) \
+ ( face->face_flags & FT_FACE_FLAG_SFNT )
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_IS_FIXED_WIDTH( face )
+ *
+ * @description:
+ * A macro that returns true whenever a face object contains a font face
+ * that contains fixed-width (or `monospace', `fixed-pitch', etc.)
+ * glyphs.
+ *
+ */
+#define FT_IS_FIXED_WIDTH( face ) \
+ ( face->face_flags & FT_FACE_FLAG_FIXED_WIDTH )
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_HAS_FIXED_SIZES( face )
+ *
+ * @description:
+ * A macro that returns true whenever a face object contains some
+ * embedded bitmaps. See the `available_sizes' field of the
+ * @FT_FaceRec structure.
+ *
+ */
+#define FT_HAS_FIXED_SIZES( face ) \
+ ( face->face_flags & FT_FACE_FLAG_FIXED_SIZES )
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_HAS_FAST_GLYPHS( face )
+ *
+ * @description:
+ * Deprecated.
+ *
+ */
+#define FT_HAS_FAST_GLYPHS( face ) 0
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_HAS_GLYPH_NAMES( face )
+ *
+ * @description:
+ * A macro that returns true whenever a face object contains some glyph
+ * names that can be accessed through @FT_Get_Glyph_Name.
+ *
+ */
+#define FT_HAS_GLYPH_NAMES( face ) \
+ ( face->face_flags & FT_FACE_FLAG_GLYPH_NAMES )
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_HAS_MULTIPLE_MASTERS( face )
+ *
+ * @description:
+ * A macro that returns true whenever a face object contains some
+ * multiple masters. The functions provided by @FT_MULTIPLE_MASTERS_H
+ * are then available to choose the exact design you want.
+ *
+ */
+#define FT_HAS_MULTIPLE_MASTERS( face ) \
+ ( face->face_flags & FT_FACE_FLAG_MULTIPLE_MASTERS )
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_IS_CID_KEYED( face )
+ *
+ * @description:
+ * A macro that returns true whenever a face object contains a CID-keyed
+ * font. See the discussion of @FT_FACE_FLAG_CID_KEYED for more
+ * details.
+ *
+ * If this macro is true, all functions defined in @FT_CID_H are
+ * available.
+ *
+ */
+#define FT_IS_CID_KEYED( face ) \
+ ( face->face_flags & FT_FACE_FLAG_CID_KEYED )
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_IS_TRICKY( face )
+ *
+ * @description:
+ * A macro that returns true whenever a face represents a `tricky' font.
+ * See the discussion of @FT_FACE_FLAG_TRICKY for more details.
+ *
+ */
+#define FT_IS_TRICKY( face ) \
+ ( face->face_flags & FT_FACE_FLAG_TRICKY )
+
+
+ /*************************************************************************/
+ /* */
+ /* <Const> */
+ /* FT_STYLE_FLAG_XXX */
+ /* */
+ /* <Description> */
+ /* A list of bit-flags used to indicate the style of a given face. */
+ /* These are used in the `style_flags' field of @FT_FaceRec. */
+ /* */
+ /* <Values> */
+ /* FT_STYLE_FLAG_ITALIC :: */
+ /* Indicates that a given face style is italic or oblique. */
+ /* */
+ /* FT_STYLE_FLAG_BOLD :: */
+ /* Indicates that a given face is bold. */
+ /* */
+ /* <Note> */
+ /* The style information as provided by FreeType is very basic. More */
+ /* details are beyond the scope and should be done on a higher level */
+ /* (for example, by analyzing various fields of the `OS/2' table in */
+ /* SFNT based fonts). */
+ /* */
+#define FT_STYLE_FLAG_ITALIC ( 1 << 0 )
+#define FT_STYLE_FLAG_BOLD ( 1 << 1 )
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Size_Internal */
+ /* */
+ /* <Description> */
+ /* An opaque handle to an `FT_Size_InternalRec' structure, used to */
+ /* model private data of a given @FT_Size object. */
+ /* */
+ typedef struct FT_Size_InternalRec_* FT_Size_Internal;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Size_Metrics */
+ /* */
+ /* <Description> */
+ /* The size metrics structure gives the metrics of a size object. */
+ /* */
+ /* <Fields> */
+ /* x_ppem :: The width of the scaled EM square in pixels, hence */
+ /* the term `ppem' (pixels per EM). It is also */
+ /* referred to as `nominal width'. */
+ /* */
+ /* y_ppem :: The height of the scaled EM square in pixels, */
+ /* hence the term `ppem' (pixels per EM). It is also */
+ /* referred to as `nominal height'. */
+ /* */
+ /* x_scale :: A 16.16 fractional scaling value used to convert */
+ /* horizontal metrics from font units to 26.6 */
+ /* fractional pixels. Only relevant for scalable */
+ /* font formats. */
+ /* */
+ /* y_scale :: A 16.16 fractional scaling value used to convert */
+ /* vertical metrics from font units to 26.6 */
+ /* fractional pixels. Only relevant for scalable */
+ /* font formats. */
+ /* */
+ /* ascender :: The ascender in 26.6 fractional pixels. See */
+ /* @FT_FaceRec for the details. */
+ /* */
+ /* descender :: The descender in 26.6 fractional pixels. See */
+ /* @FT_FaceRec for the details. */
+ /* */
+ /* height :: The height in 26.6 fractional pixels. See */
+ /* @FT_FaceRec for the details. */
+ /* */
+ /* max_advance :: The maximum advance width in 26.6 fractional */
+ /* pixels. See @FT_FaceRec for the details. */
+ /* */
+ /* <Note> */
+ /* The scaling values, if relevant, are determined first during a */
+ /* size changing operation. The remaining fields are then set by the */
+ /* driver. For scalable formats, they are usually set to scaled */
+ /* values of the corresponding fields in @FT_FaceRec. */
+ /* */
+ /* Note that due to glyph hinting, these values might not be exact */
+ /* for certain fonts. Thus they must be treated as unreliable */
+ /* with an error margin of at least one pixel! */
+ /* */
+ /* Indeed, the only way to get the exact metrics is to render _all_ */
+ /* glyphs. As this would be a definite performance hit, it is up to */
+ /* client applications to perform such computations. */
+ /* */
+ /* The FT_Size_Metrics structure is valid for bitmap fonts also. */
+ /* */
+ typedef struct FT_Size_Metrics_
+ {
+ FT_UShort x_ppem; /* horizontal pixels per EM */
+ FT_UShort y_ppem; /* vertical pixels per EM */
+
+ FT_Fixed x_scale; /* scaling values used to convert font */
+ FT_Fixed y_scale; /* units to 26.6 fractional pixels */
+
+ FT_Pos ascender; /* ascender in 26.6 frac. pixels */
+ FT_Pos descender; /* descender in 26.6 frac. pixels */
+ FT_Pos height; /* text height in 26.6 frac. pixels */
+ FT_Pos max_advance; /* max horizontal advance, in 26.6 pixels */
+
+ } FT_Size_Metrics;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_SizeRec */
+ /* */
+ /* <Description> */
+ /* FreeType root size class structure. A size object models a face */
+ /* object at a given size. */
+ /* */
+ /* <Fields> */
+ /* face :: Handle to the parent face object. */
+ /* */
+ /* generic :: A typeless pointer, which is unused by the FreeType */
+ /* library or any of its drivers. It can be used by */
+ /* client applications to link their own data to each size */
+ /* object. */
+ /* */
+ /* metrics :: Metrics for this size object. This field is read-only. */
+ /* */
+ typedef struct FT_SizeRec_
+ {
+ FT_Face face; /* parent face object */
+ FT_Generic generic; /* generic pointer for client uses */
+ FT_Size_Metrics metrics; /* size metrics */
+ FT_Size_Internal internal;
+
+ } FT_SizeRec;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_SubGlyph */
+ /* */
+ /* <Description> */
+ /* The subglyph structure is an internal object used to describe */
+ /* subglyphs (for example, in the case of composites). */
+ /* */
+ /* <Note> */
+ /* The subglyph implementation is not part of the high-level API, */
+ /* hence the forward structure declaration. */
+ /* */
+ /* You can however retrieve subglyph information with */
+ /* @FT_Get_SubGlyph_Info. */
+ /* */
+ typedef struct FT_SubGlyphRec_* FT_SubGlyph;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Slot_Internal */
+ /* */
+ /* <Description> */
+ /* An opaque handle to an `FT_Slot_InternalRec' structure, used to */
+ /* model private data of a given @FT_GlyphSlot object. */
+ /* */
+ typedef struct FT_Slot_InternalRec_* FT_Slot_Internal;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_GlyphSlotRec */
+ /* */
+ /* <Description> */
+ /* FreeType root glyph slot class structure. A glyph slot is a */
+ /* container where individual glyphs can be loaded, be they in */
+ /* outline or bitmap format. */
+ /* */
+ /* <Fields> */
+ /* library :: A handle to the FreeType library instance */
+ /* this slot belongs to. */
+ /* */
+ /* face :: A handle to the parent face object. */
+ /* */
+ /* next :: In some cases (like some font tools), several */
+ /* glyph slots per face object can be a good */
+ /* thing. As this is rare, the glyph slots are */
+ /* listed through a direct, single-linked list */
+ /* using its `next' field. */
+ /* */
+ /* generic :: A typeless pointer which is unused by the */
+ /* FreeType library or any of its drivers. It */
+ /* can be used by client applications to link */
+ /* their own data to each glyph slot object. */
+ /* */
+ /* metrics :: The metrics of the last loaded glyph in the */
+ /* slot. The returned values depend on the last */
+ /* load flags (see the @FT_Load_Glyph API */
+ /* function) and can be expressed either in 26.6 */
+ /* fractional pixels or font units. */
+ /* */
+ /* Note that even when the glyph image is */
+ /* transformed, the metrics are not. */
+ /* */
+ /* linearHoriAdvance :: The advance width of the unhinted glyph. */
+ /* Its value is expressed in 16.16 fractional */
+ /* pixels, unless @FT_LOAD_LINEAR_DESIGN is set */
+ /* when loading the glyph. This field can be */
+ /* important to perform correct WYSIWYG layout. */
+ /* Only relevant for outline glyphs. */
+ /* */
+ /* linearVertAdvance :: The advance height of the unhinted glyph. */
+ /* Its value is expressed in 16.16 fractional */
+ /* pixels, unless @FT_LOAD_LINEAR_DESIGN is set */
+ /* when loading the glyph. This field can be */
+ /* important to perform correct WYSIWYG layout. */
+ /* Only relevant for outline glyphs. */
+ /* */
+ /* advance :: This shorthand is, depending on */
+ /* @FT_LOAD_IGNORE_TRANSFORM, the transformed */
+ /* advance width for the glyph (in 26.6 */
+ /* fractional pixel format). As specified with */
+ /* @FT_LOAD_VERTICAL_LAYOUT, it uses either the */
+ /* `horiAdvance' or the `vertAdvance' value of */
+ /* `metrics' field. */
+ /* */
+ /* format :: This field indicates the format of the image */
+ /* contained in the glyph slot. Typically */
+ /* @FT_GLYPH_FORMAT_BITMAP, */
+ /* @FT_GLYPH_FORMAT_OUTLINE, or */
+ /* @FT_GLYPH_FORMAT_COMPOSITE, but others are */
+ /* possible. */
+ /* */
+ /* bitmap :: This field is used as a bitmap descriptor */
+ /* when the slot format is */
+ /* @FT_GLYPH_FORMAT_BITMAP. Note that the */
+ /* address and content of the bitmap buffer can */
+ /* change between calls of @FT_Load_Glyph and a */
+ /* few other functions. */
+ /* */
+ /* bitmap_left :: This is the bitmap's left bearing expressed */
+ /* in integer pixels. Of course, this is only */
+ /* valid if the format is */
+ /* @FT_GLYPH_FORMAT_BITMAP. */
+ /* */
+ /* bitmap_top :: This is the bitmap's top bearing expressed in */
+ /* integer pixels. Remember that this is the */
+ /* distance from the baseline to the top-most */
+ /* glyph scanline, upwards y~coordinates being */
+ /* *positive*. */
+ /* */
+ /* outline :: The outline descriptor for the current glyph */
+ /* image if its format is */
+ /* @FT_GLYPH_FORMAT_OUTLINE. Once a glyph is */
+ /* loaded, `outline' can be transformed, */
+ /* distorted, embolded, etc. However, it must */
+ /* not be freed. */
+ /* */
+ /* num_subglyphs :: The number of subglyphs in a composite glyph. */
+ /* This field is only valid for the composite */
+ /* glyph format that should normally only be */
+ /* loaded with the @FT_LOAD_NO_RECURSE flag. */
+ /* For now this is internal to FreeType. */
+ /* */
+ /* subglyphs :: An array of subglyph descriptors for */
+ /* composite glyphs. There are `num_subglyphs' */
+ /* elements in there. Currently internal to */
+ /* FreeType. */
+ /* */
+ /* control_data :: Certain font drivers can also return the */
+ /* control data for a given glyph image (e.g. */
+ /* TrueType bytecode, Type~1 charstrings, etc.). */
+ /* This field is a pointer to such data. */
+ /* */
+ /* control_len :: This is the length in bytes of the control */
+ /* data. */
+ /* */
+ /* other :: Really wicked formats can use this pointer to */
+ /* present their own glyph image to client */
+ /* applications. Note that the application */
+ /* needs to know about the image format. */
+ /* */
+ /* lsb_delta :: The difference between hinted and unhinted */
+ /* left side bearing while autohinting is */
+ /* active. Zero otherwise. */
+ /* */
+ /* rsb_delta :: The difference between hinted and unhinted */
+ /* right side bearing while autohinting is */
+ /* active. Zero otherwise. */
+ /* */
+ /* <Note> */
+ /* If @FT_Load_Glyph is called with default flags (see */
+ /* @FT_LOAD_DEFAULT) the glyph image is loaded in the glyph slot in */
+ /* its native format (e.g., an outline glyph for TrueType and Type~1 */
+ /* formats). */
+ /* */
+ /* This image can later be converted into a bitmap by calling */
+ /* @FT_Render_Glyph. This function finds the current renderer for */
+ /* the native image's format, then invokes it. */
+ /* */
+ /* The renderer is in charge of transforming the native image through */
+ /* the slot's face transformation fields, then converting it into a */
+ /* bitmap that is returned in `slot->bitmap'. */
+ /* */
+ /* Note that `slot->bitmap_left' and `slot->bitmap_top' are also used */
+ /* to specify the position of the bitmap relative to the current pen */
+ /* position (e.g., coordinates (0,0) on the baseline). Of course, */
+ /* `slot->format' is also changed to @FT_GLYPH_FORMAT_BITMAP. */
+ /* */
+ /* <Note> */
+ /* Here a small pseudo code fragment which shows how to use */
+ /* `lsb_delta' and `rsb_delta': */
+ /* */
+ /* { */
+ /* FT_Pos origin_x = 0; */
+ /* FT_Pos prev_rsb_delta = 0; */
+ /* */
+ /* */
+ /* for all glyphs do */
+ /* <compute kern between current and previous glyph and add it to */
+ /* `origin_x'> */
+ /* */
+ /* <load glyph with `FT_Load_Glyph'> */
+ /* */
+ /* if ( prev_rsb_delta - face->glyph->lsb_delta >= 32 ) */
+ /* origin_x -= 64; */
+ /* else if ( prev_rsb_delta - face->glyph->lsb_delta < -32 ) */
+ /* origin_x += 64; */
+ /* */
+ /* prev_rsb_delta = face->glyph->rsb_delta; */
+ /* */
+ /* <save glyph image, or render glyph, or ...> */
+ /* */
+ /* origin_x += face->glyph->advance.x; */
+ /* endfor */
+ /* } */
+ /* */
+ typedef struct FT_GlyphSlotRec_
+ {
+ FT_Library library;
+ FT_Face face;
+ FT_GlyphSlot next;
+ FT_UInt reserved; /* retained for binary compatibility */
+ FT_Generic generic;
+
+ FT_Glyph_Metrics metrics;
+ FT_Fixed linearHoriAdvance;
+ FT_Fixed linearVertAdvance;
+ FT_Vector advance;
+
+ FT_Glyph_Format format;
+
+ FT_Bitmap bitmap;
+ FT_Int bitmap_left;
+ FT_Int bitmap_top;
+
+ FT_Outline outline;
+
+ FT_UInt num_subglyphs;
+ FT_SubGlyph subglyphs;
+
+ void* control_data;
+ long control_len;
+
+ FT_Pos lsb_delta;
+ FT_Pos rsb_delta;
+
+ void* other;
+
+ FT_Slot_Internal internal;
+
+ } FT_GlyphSlotRec;
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /* */
+ /* F U N C T I O N S */
+ /* */
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Init_FreeType */
+ /* */
+ /* <Description> */
+ /* Initialize a new FreeType library object. The set of modules */
+ /* that are registered by this function is determined at build time. */
+ /* */
+ /* <Output> */
+ /* alibrary :: A handle to a new library object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* In case you want to provide your own memory allocating routines, */
+ /* use @FT_New_Library instead, followed by a call to */
+ /* @FT_Add_Default_Modules (or a series of calls to @FT_Add_Module). */
+ /* */
+ /* For multi-threading applications each thread should have its own */
+ /* FT_Library object. */
+ /* */
+ /* If you need reference-counting (cf. @FT_Reference_Library), use */
+ /* @FT_New_Library and @FT_Done_Library. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Init_FreeType( FT_Library *alibrary );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Done_FreeType */
+ /* */
+ /* <Description> */
+ /* Destroy a given FreeType library object and all of its children, */
+ /* including resources, drivers, faces, sizes, etc. */
+ /* */
+ /* <Input> */
+ /* library :: A handle to the target library object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Done_FreeType( FT_Library library );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Enum> */
+ /* FT_OPEN_XXX */
+ /* */
+ /* <Description> */
+ /* A list of bit-field constants used within the `flags' field of the */
+ /* @FT_Open_Args structure. */
+ /* */
+ /* <Values> */
+ /* FT_OPEN_MEMORY :: This is a memory-based stream. */
+ /* */
+ /* FT_OPEN_STREAM :: Copy the stream from the `stream' field. */
+ /* */
+ /* FT_OPEN_PATHNAME :: Create a new input stream from a C~path */
+ /* name. */
+ /* */
+ /* FT_OPEN_DRIVER :: Use the `driver' field. */
+ /* */
+ /* FT_OPEN_PARAMS :: Use the `num_params' and `params' fields. */
+ /* */
+ /* ft_open_memory :: Deprecated; use @FT_OPEN_MEMORY instead. */
+ /* */
+ /* ft_open_stream :: Deprecated; use @FT_OPEN_STREAM instead. */
+ /* */
+ /* ft_open_pathname :: Deprecated; use @FT_OPEN_PATHNAME instead. */
+ /* */
+ /* ft_open_driver :: Deprecated; use @FT_OPEN_DRIVER instead. */
+ /* */
+ /* ft_open_params :: Deprecated; use @FT_OPEN_PARAMS instead. */
+ /* */
+ /* <Note> */
+ /* The `FT_OPEN_MEMORY', `FT_OPEN_STREAM', and `FT_OPEN_PATHNAME' */
+ /* flags are mutually exclusive. */
+ /* */
+#define FT_OPEN_MEMORY 0x1
+#define FT_OPEN_STREAM 0x2
+#define FT_OPEN_PATHNAME 0x4
+#define FT_OPEN_DRIVER 0x8
+#define FT_OPEN_PARAMS 0x10
+
+#define ft_open_memory FT_OPEN_MEMORY /* deprecated */
+#define ft_open_stream FT_OPEN_STREAM /* deprecated */
+#define ft_open_pathname FT_OPEN_PATHNAME /* deprecated */
+#define ft_open_driver FT_OPEN_DRIVER /* deprecated */
+#define ft_open_params FT_OPEN_PARAMS /* deprecated */
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Parameter */
+ /* */
+ /* <Description> */
+ /* A simple structure used to pass more or less generic parameters to */
+ /* @FT_Open_Face. */
+ /* */
+ /* <Fields> */
+ /* tag :: A four-byte identification tag. */
+ /* */
+ /* data :: A pointer to the parameter data. */
+ /* */
+ /* <Note> */
+ /* The ID and function of parameters are driver-specific. See the */
+ /* various FT_PARAM_TAG_XXX flags for more information. */
+ /* */
+ typedef struct FT_Parameter_
+ {
+ FT_ULong tag;
+ FT_Pointer data;
+
+ } FT_Parameter;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Open_Args */
+ /* */
+ /* <Description> */
+ /* A structure used to indicate how to open a new font file or */
+ /* stream. A pointer to such a structure can be used as a parameter */
+ /* for the functions @FT_Open_Face and @FT_Attach_Stream. */
+ /* */
+ /* <Fields> */
+ /* flags :: A set of bit flags indicating how to use the */
+ /* structure. */
+ /* */
+ /* memory_base :: The first byte of the file in memory. */
+ /* */
+ /* memory_size :: The size in bytes of the file in memory. */
+ /* */
+ /* pathname :: A pointer to an 8-bit file pathname. */
+ /* */
+ /* stream :: A handle to a source stream object. */
+ /* */
+ /* driver :: This field is exclusively used by @FT_Open_Face; */
+ /* it simply specifies the font driver to use to open */
+ /* the face. If set to~0, FreeType tries to load the */
+ /* face with each one of the drivers in its list. */
+ /* */
+ /* num_params :: The number of extra parameters. */
+ /* */
+ /* params :: Extra parameters passed to the font driver when */
+ /* opening a new face. */
+ /* */
+ /* <Note> */
+ /* The stream type is determined by the contents of `flags' which */
+ /* are tested in the following order by @FT_Open_Face: */
+ /* */
+ /* If the `FT_OPEN_MEMORY' bit is set, assume that this is a */
+ /* memory file of `memory_size' bytes, located at `memory_address'. */
+ /* The data are are not copied, and the client is responsible for */
+ /* releasing and destroying them _after_ the corresponding call to */
+ /* @FT_Done_Face. */
+ /* */
+ /* Otherwise, if the `FT_OPEN_STREAM' bit is set, assume that a */
+ /* custom input stream `stream' is used. */
+ /* */
+ /* Otherwise, if the `FT_OPEN_PATHNAME' bit is set, assume that this */
+ /* is a normal file and use `pathname' to open it. */
+ /* */
+ /* If the `FT_OPEN_DRIVER' bit is set, @FT_Open_Face only tries to */
+ /* open the file with the driver whose handler is in `driver'. */
+ /* */
+ /* If the `FT_OPEN_PARAMS' bit is set, the parameters given by */
+ /* `num_params' and `params' is used. They are ignored otherwise. */
+ /* */
+ /* Ideally, both the `pathname' and `params' fields should be tagged */
+ /* as `const'; this is missing for API backwards compatibility. In */
+ /* other words, applications should treat them as read-only. */
+ /* */
+ typedef struct FT_Open_Args_
+ {
+ FT_UInt flags;
+ const FT_Byte* memory_base;
+ FT_Long memory_size;
+ FT_String* pathname;
+ FT_Stream stream;
+ FT_Module driver;
+ FT_Int num_params;
+ FT_Parameter* params;
+
+ } FT_Open_Args;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_New_Face */
+ /* */
+ /* <Description> */
+ /* This function calls @FT_Open_Face to open a font by its pathname. */
+ /* */
+ /* <InOut> */
+ /* library :: A handle to the library resource. */
+ /* */
+ /* <Input> */
+ /* pathname :: A path to the font file. */
+ /* */
+ /* face_index :: The index of the face within the font. The first */
+ /* face has index~0. */
+ /* */
+ /* <Output> */
+ /* aface :: A handle to a new face object. If `face_index' is */
+ /* greater than or equal to zero, it must be non-NULL. */
+ /* See @FT_Open_Face for more details. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* Use @FT_Done_Face to destroy the created @FT_Face object (along */
+ /* with its slot and sizes). */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_New_Face( FT_Library library,
+ const char* filepathname,
+ FT_Long face_index,
+ FT_Face *aface );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_New_Memory_Face */
+ /* */
+ /* <Description> */
+ /* This function calls @FT_Open_Face to open a font which has been */
+ /* loaded into memory. */
+ /* */
+ /* <InOut> */
+ /* library :: A handle to the library resource. */
+ /* */
+ /* <Input> */
+ /* file_base :: A pointer to the beginning of the font data. */
+ /* */
+ /* file_size :: The size of the memory chunk used by the font data. */
+ /* */
+ /* face_index :: The index of the face within the font. The first */
+ /* face has index~0. */
+ /* */
+ /* <Output> */
+ /* aface :: A handle to a new face object. If `face_index' is */
+ /* greater than or equal to zero, it must be non-NULL. */
+ /* See @FT_Open_Face for more details. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* You must not deallocate the memory before calling @FT_Done_Face. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_New_Memory_Face( FT_Library library,
+ const FT_Byte* file_base,
+ FT_Long file_size,
+ FT_Long face_index,
+ FT_Face *aface );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Open_Face */
+ /* */
+ /* <Description> */
+ /* Create a face object from a given resource described by */
+ /* @FT_Open_Args. */
+ /* */
+ /* <InOut> */
+ /* library :: A handle to the library resource. */
+ /* */
+ /* <Input> */
+ /* args :: A pointer to an `FT_Open_Args' structure which must */
+ /* be filled by the caller. */
+ /* */
+ /* face_index :: The index of the face within the font. The first */
+ /* face has index~0. */
+ /* */
+ /* <Output> */
+ /* aface :: A handle to a new face object. If `face_index' is */
+ /* greater than or equal to zero, it must be non-NULL. */
+ /* See note below. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* Unlike FreeType 1.x, this function automatically creates a glyph */
+ /* slot for the face object which can be accessed directly through */
+ /* `face->glyph'. */
+ /* */
+ /* FT_Open_Face can be used to quickly check whether the font */
+ /* format of a given font resource is supported by FreeType. If the */
+ /* `face_index' field is negative, the function's return value is~0 */
+ /* if the font format is recognized, or non-zero otherwise; */
+ /* the function returns a more or less empty face handle in `*aface' */
+ /* (if `aface' isn't NULL). The only useful field in this special */
+ /* case is `face->num_faces' which gives the number of faces within */
+ /* the font file. After examination, the returned @FT_Face structure */
+ /* should be deallocated with a call to @FT_Done_Face. */
+ /* */
+ /* Each new face object created with this function also owns a */
+ /* default @FT_Size object, accessible as `face->size'. */
+ /* */
+ /* One @FT_Library instance can have multiple face objects, this is, */
+ /* @FT_Open_Face and its siblings can be called multiple times using */
+ /* the same `library' argument. */
+ /* */
+ /* See the discussion of reference counters in the description of */
+ /* @FT_Reference_Face. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Open_Face( FT_Library library,
+ const FT_Open_Args* args,
+ FT_Long face_index,
+ FT_Face *aface );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Attach_File */
+ /* */
+ /* <Description> */
+ /* This function calls @FT_Attach_Stream to attach a file. */
+ /* */
+ /* <InOut> */
+ /* face :: The target face object. */
+ /* */
+ /* <Input> */
+ /* filepathname :: The pathname. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Attach_File( FT_Face face,
+ const char* filepathname );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Attach_Stream */
+ /* */
+ /* <Description> */
+ /* `Attach' data to a face object. Normally, this is used to read */
+ /* additional information for the face object. For example, you can */
+ /* attach an AFM file that comes with a Type~1 font to get the */
+ /* kerning values and other metrics. */
+ /* */
+ /* <InOut> */
+ /* face :: The target face object. */
+ /* */
+ /* <Input> */
+ /* parameters :: A pointer to @FT_Open_Args which must be filled by */
+ /* the caller. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* The meaning of the `attach' (i.e., what really happens when the */
+ /* new file is read) is not fixed by FreeType itself. It really */
+ /* depends on the font format (and thus the font driver). */
+ /* */
+ /* Client applications are expected to know what they are doing */
+ /* when invoking this function. Most drivers simply do not implement */
+ /* file attachments. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Attach_Stream( FT_Face face,
+ FT_Open_Args* parameters );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Reference_Face */
+ /* */
+ /* <Description> */
+ /* A counter gets initialized to~1 at the time an @FT_Face structure */
+ /* is created. This function increments the counter. @FT_Done_Face */
+ /* then only destroys a face if the counter is~1, otherwise it simply */
+ /* decrements the counter. */
+ /* */
+ /* This function helps in managing life-cycles of structures which */
+ /* reference @FT_Face objects. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to a target face object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Since> */
+ /* 2.4.2 */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Reference_Face( FT_Face face );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Done_Face */
+ /* */
+ /* <Description> */
+ /* Discard a given face object, as well as all of its child slots and */
+ /* sizes. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to a target face object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* See the discussion of reference counters in the description of */
+ /* @FT_Reference_Face. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Done_Face( FT_Face face );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Select_Size */
+ /* */
+ /* <Description> */
+ /* Select a bitmap strike. */
+ /* */
+ /* <InOut> */
+ /* face :: A handle to a target face object. */
+ /* */
+ /* <Input> */
+ /* strike_index :: The index of the bitmap strike in the */
+ /* `available_sizes' field of @FT_FaceRec structure. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Select_Size( FT_Face face,
+ FT_Int strike_index );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Enum> */
+ /* FT_Size_Request_Type */
+ /* */
+ /* <Description> */
+ /* An enumeration type that lists the supported size request types. */
+ /* */
+ /* <Values> */
+ /* FT_SIZE_REQUEST_TYPE_NOMINAL :: */
+ /* The nominal size. The `units_per_EM' field of @FT_FaceRec is */
+ /* used to determine both scaling values. */
+ /* */
+ /* FT_SIZE_REQUEST_TYPE_REAL_DIM :: */
+ /* The real dimension. The sum of the the `ascender' and (minus */
+ /* of) the `descender' fields of @FT_FaceRec are used to determine */
+ /* both scaling values. */
+ /* */
+ /* FT_SIZE_REQUEST_TYPE_BBOX :: */
+ /* The font bounding box. The width and height of the `bbox' field */
+ /* of @FT_FaceRec are used to determine the horizontal and vertical */
+ /* scaling value, respectively. */
+ /* */
+ /* FT_SIZE_REQUEST_TYPE_CELL :: */
+ /* The `max_advance_width' field of @FT_FaceRec is used to */
+ /* determine the horizontal scaling value; the vertical scaling */
+ /* value is determined the same way as */
+ /* @FT_SIZE_REQUEST_TYPE_REAL_DIM does. Finally, both scaling */
+ /* values are set to the smaller one. This type is useful if you */
+ /* want to specify the font size for, say, a window of a given */
+ /* dimension and 80x24 cells. */
+ /* */
+ /* FT_SIZE_REQUEST_TYPE_SCALES :: */
+ /* Specify the scaling values directly. */
+ /* */
+ /* <Note> */
+ /* The above descriptions only apply to scalable formats. For bitmap */
+ /* formats, the behaviour is up to the driver. */
+ /* */
+ /* See the note section of @FT_Size_Metrics if you wonder how size */
+ /* requesting relates to scaling values. */
+ /* */
+ typedef enum FT_Size_Request_Type_
+ {
+ FT_SIZE_REQUEST_TYPE_NOMINAL,
+ FT_SIZE_REQUEST_TYPE_REAL_DIM,
+ FT_SIZE_REQUEST_TYPE_BBOX,
+ FT_SIZE_REQUEST_TYPE_CELL,
+ FT_SIZE_REQUEST_TYPE_SCALES,
+
+ FT_SIZE_REQUEST_TYPE_MAX
+
+ } FT_Size_Request_Type;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Size_RequestRec */
+ /* */
+ /* <Description> */
+ /* A structure used to model a size request. */
+ /* */
+ /* <Fields> */
+ /* type :: See @FT_Size_Request_Type. */
+ /* */
+ /* width :: The desired width. */
+ /* */
+ /* height :: The desired height. */
+ /* */
+ /* horiResolution :: The horizontal resolution. If set to zero, */
+ /* `width' is treated as a 26.6 fractional pixel */
+ /* value. */
+ /* */
+ /* vertResolution :: The vertical resolution. If set to zero, */
+ /* `height' is treated as a 26.6 fractional pixel */
+ /* value. */
+ /* */
+ /* <Note> */
+ /* If `width' is zero, then the horizontal scaling value is set equal */
+ /* to the vertical scaling value, and vice versa. */
+ /* */
+ typedef struct FT_Size_RequestRec_
+ {
+ FT_Size_Request_Type type;
+ FT_Long width;
+ FT_Long height;
+ FT_UInt horiResolution;
+ FT_UInt vertResolution;
+
+ } FT_Size_RequestRec;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Size_Request */
+ /* */
+ /* <Description> */
+ /* A handle to a size request structure. */
+ /* */
+ typedef struct FT_Size_RequestRec_ *FT_Size_Request;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Request_Size */
+ /* */
+ /* <Description> */
+ /* Resize the scale of the active @FT_Size object in a face. */
+ /* */
+ /* <InOut> */
+ /* face :: A handle to a target face object. */
+ /* */
+ /* <Input> */
+ /* req :: A pointer to a @FT_Size_RequestRec. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* Although drivers may select the bitmap strike matching the */
+ /* request, you should not rely on this if you intend to select a */
+ /* particular bitmap strike. Use @FT_Select_Size instead in that */
+ /* case. */
+ /* */
+ /* The relation between the requested size and the resulting glyph */
+ /* size is dependent entirely on how the size is defined in the */
+ /* source face. The font designer chooses the final size of each */
+ /* glyph relative to this size. For more information refer to */
+ /* `http://www.freetype.org/freetype2/docs/glyphs/glyphs-2.html' */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Request_Size( FT_Face face,
+ FT_Size_Request req );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Set_Char_Size */
+ /* */
+ /* <Description> */
+ /* This function calls @FT_Request_Size to request the nominal size */
+ /* (in points). */
+ /* */
+ /* <InOut> */
+ /* face :: A handle to a target face object. */
+ /* */
+ /* <Input> */
+ /* char_width :: The nominal width, in 26.6 fractional points. */
+ /* */
+ /* char_height :: The nominal height, in 26.6 fractional points. */
+ /* */
+ /* horz_resolution :: The horizontal resolution in dpi. */
+ /* */
+ /* vert_resolution :: The vertical resolution in dpi. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* If either the character width or height is zero, it is set equal */
+ /* to the other value. */
+ /* */
+ /* If either the horizontal or vertical resolution is zero, it is set */
+ /* equal to the other value. */
+ /* */
+ /* A character width or height smaller than 1pt is set to 1pt; if */
+ /* both resolution values are zero, they are set to 72dpi. */
+ /* */
+ /* Don't use this function if you are using the FreeType cache API. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Set_Char_Size( FT_Face face,
+ FT_F26Dot6 char_width,
+ FT_F26Dot6 char_height,
+ FT_UInt horz_resolution,
+ FT_UInt vert_resolution );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Set_Pixel_Sizes */
+ /* */
+ /* <Description> */
+ /* This function calls @FT_Request_Size to request the nominal size */
+ /* (in pixels). */
+ /* */
+ /* <InOut> */
+ /* face :: A handle to the target face object. */
+ /* */
+ /* <Input> */
+ /* pixel_width :: The nominal width, in pixels. */
+ /* */
+ /* pixel_height :: The nominal height, in pixels. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* You should not rely on the resulting glyphs matching, or being */
+ /* constrained, to this pixel size. Refer to @FT_Request_Size to */
+ /* understand how requested sizes relate to actual sizes. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Set_Pixel_Sizes( FT_Face face,
+ FT_UInt pixel_width,
+ FT_UInt pixel_height );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Load_Glyph */
+ /* */
+ /* <Description> */
+ /* A function used to load a single glyph into the glyph slot of a */
+ /* face object. */
+ /* */
+ /* <InOut> */
+ /* face :: A handle to the target face object where the glyph */
+ /* is loaded. */
+ /* */
+ /* <Input> */
+ /* glyph_index :: The index of the glyph in the font file. For */
+ /* CID-keyed fonts (either in PS or in CFF format) */
+ /* this argument specifies the CID value. */
+ /* */
+ /* load_flags :: A flag indicating what to load for this glyph. The */
+ /* @FT_LOAD_XXX constants can be used to control the */
+ /* glyph loading process (e.g., whether the outline */
+ /* should be scaled, whether to load bitmaps or not, */
+ /* whether to hint the outline, etc). */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* The loaded glyph may be transformed. See @FT_Set_Transform for */
+ /* the details. */
+ /* */
+ /* For subsetted CID-keyed fonts, `FT_Err_Invalid_Argument' is */
+ /* returned for invalid CID values (this is, for CID values which */
+ /* don't have a corresponding glyph in the font). See the discussion */
+ /* of the @FT_FACE_FLAG_CID_KEYED flag for more details. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Load_Glyph( FT_Face face,
+ FT_UInt glyph_index,
+ FT_Int32 load_flags );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Load_Char */
+ /* */
+ /* <Description> */
+ /* A function used to load a single glyph into the glyph slot of a */
+ /* face object, according to its character code. */
+ /* */
+ /* <InOut> */
+ /* face :: A handle to a target face object where the glyph */
+ /* is loaded. */
+ /* */
+ /* <Input> */
+ /* char_code :: The glyph's character code, according to the */
+ /* current charmap used in the face. */
+ /* */
+ /* load_flags :: A flag indicating what to load for this glyph. The */
+ /* @FT_LOAD_XXX constants can be used to control the */
+ /* glyph loading process (e.g., whether the outline */
+ /* should be scaled, whether to load bitmaps or not, */
+ /* whether to hint the outline, etc). */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* This function simply calls @FT_Get_Char_Index and @FT_Load_Glyph. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Load_Char( FT_Face face,
+ FT_ULong char_code,
+ FT_Int32 load_flags );
+
+
+ /*************************************************************************
+ *
+ * @enum:
+ * FT_LOAD_XXX
+ *
+ * @description:
+ * A list of bit-field constants used with @FT_Load_Glyph to indicate
+ * what kind of operations to perform during glyph loading.
+ *
+ * @values:
+ * FT_LOAD_DEFAULT ::
+ * Corresponding to~0, this value is used as the default glyph load
+ * operation. In this case, the following happens:
+ *
+ * 1. FreeType looks for a bitmap for the glyph corresponding to the
+ * face's current size. If one is found, the function returns.
+ * The bitmap data can be accessed from the glyph slot (see note
+ * below).
+ *
+ * 2. If no embedded bitmap is searched or found, FreeType looks for a
+ * scalable outline. If one is found, it is loaded from the font
+ * file, scaled to device pixels, then `hinted' to the pixel grid
+ * in order to optimize it. The outline data can be accessed from
+ * the glyph slot (see note below).
+ *
+ * Note that by default, the glyph loader doesn't render outlines into
+ * bitmaps. The following flags are used to modify this default
+ * behaviour to more specific and useful cases.
+ *
+ * FT_LOAD_NO_SCALE ::
+ * Don't scale the loaded outline glyph but keep it in font units.
+ *
+ * This flag implies @FT_LOAD_NO_HINTING and @FT_LOAD_NO_BITMAP, and
+ * unsets @FT_LOAD_RENDER.
+ *
+ * If the font is `tricky' (see @FT_FACE_FLAG_TRICKY for more), using
+ * FT_LOAD_NO_SCALE usually yields meaningless outlines because the
+ * subglyphs must be scaled and positioned with hinting instructions.
+ * This can be solved by loading the font without FT_LOAD_NO_SCALE and
+ * setting the character size to `font->units_per_EM'.
+ *
+ * FT_LOAD_NO_HINTING ::
+ * Disable hinting. This generally generates `blurrier' bitmap glyphs
+ * when the glyph are rendered in any of the anti-aliased modes. See
+ * also the note below.
+ *
+ * This flag is implied by @FT_LOAD_NO_SCALE.
+ *
+ * FT_LOAD_RENDER ::
+ * Call @FT_Render_Glyph after the glyph is loaded. By default, the
+ * glyph is rendered in @FT_RENDER_MODE_NORMAL mode. This can be
+ * overridden by @FT_LOAD_TARGET_XXX or @FT_LOAD_MONOCHROME.
+ *
+ * This flag is unset by @FT_LOAD_NO_SCALE.
+ *
+ * FT_LOAD_NO_BITMAP ::
+ * Ignore bitmap strikes when loading. Bitmap-only fonts ignore this
+ * flag.
+ *
+ * @FT_LOAD_NO_SCALE always sets this flag.
+ *
+ * FT_LOAD_VERTICAL_LAYOUT ::
+ * Load the glyph for vertical text layout. In particular, the
+ * `advance' value in the @FT_GlyphSlotRec structure is set to the
+ * `vertAdvance' value of the `metrics' field.
+ *
+ * In case @FT_HAS_VERTICAL doesn't return true, you shouldn't use
+ * this flag currently. Reason is that in this case vertical metrics
+ * get synthesized, and those values are not always consistent across
+ * various font formats.
+ *
+ * FT_LOAD_FORCE_AUTOHINT ::
+ * Indicates that the auto-hinter is preferred over the font's native
+ * hinter. See also the note below.
+ *
+ * FT_LOAD_CROP_BITMAP ::
+ * Indicates that the font driver should crop the loaded bitmap glyph
+ * (i.e., remove all space around its black bits). Not all drivers
+ * implement this.
+ *
+ * FT_LOAD_PEDANTIC ::
+ * Indicates that the font driver should perform pedantic verifications
+ * during glyph loading. This is mostly used to detect broken glyphs
+ * in fonts. By default, FreeType tries to handle broken fonts also.
+ *
+ * In particular, errors from the TrueType bytecode engine are not
+ * passed to the application if this flag is not set; this might
+ * result in partially hinted or distorted glyphs in case a glyph's
+ * bytecode is buggy.
+ *
+ * FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH ::
+ * Ignored. Deprecated.
+ *
+ * FT_LOAD_NO_RECURSE ::
+ * This flag is only used internally. It merely indicates that the
+ * font driver should not load composite glyphs recursively. Instead,
+ * it should set the `num_subglyph' and `subglyphs' values of the
+ * glyph slot accordingly, and set `glyph->format' to
+ * @FT_GLYPH_FORMAT_COMPOSITE.
+ *
+ * The description of sub-glyphs is not available to client
+ * applications for now.
+ *
+ * This flag implies @FT_LOAD_NO_SCALE and @FT_LOAD_IGNORE_TRANSFORM.
+ *
+ * FT_LOAD_IGNORE_TRANSFORM ::
+ * Indicates that the transform matrix set by @FT_Set_Transform should
+ * be ignored.
+ *
+ * FT_LOAD_MONOCHROME ::
+ * This flag is used with @FT_LOAD_RENDER to indicate that you want to
+ * render an outline glyph to a 1-bit monochrome bitmap glyph, with
+ * 8~pixels packed into each byte of the bitmap data.
+ *
+ * Note that this has no effect on the hinting algorithm used. You
+ * should rather use @FT_LOAD_TARGET_MONO so that the
+ * monochrome-optimized hinting algorithm is used.
+ *
+ * FT_LOAD_LINEAR_DESIGN ::
+ * Indicates that the `linearHoriAdvance' and `linearVertAdvance'
+ * fields of @FT_GlyphSlotRec should be kept in font units. See
+ * @FT_GlyphSlotRec for details.
+ *
+ * FT_LOAD_NO_AUTOHINT ::
+ * Disable auto-hinter. See also the note below.
+ *
+ * FT_LOAD_COLOR ::
+ * This flag is used to request loading of color embedded-bitmap
+ * images. The resulting color bitmaps, if available, will have the
+ * @FT_PIXEL_MODE_BGRA format. When the flag is not used and color
+ * bitmaps are found, they will be converted to 256-level gray
+ * bitmaps transparently. Those bitmaps will be in the
+ * @FT_PIXEL_MODE_GRAY format.
+ *
+ * @note:
+ * By default, hinting is enabled and the font's native hinter (see
+ * @FT_FACE_FLAG_HINTER) is preferred over the auto-hinter. You can
+ * disable hinting by setting @FT_LOAD_NO_HINTING or change the
+ * precedence by setting @FT_LOAD_FORCE_AUTOHINT. You can also set
+ * @FT_LOAD_NO_AUTOHINT in case you don't want the auto-hinter to be
+ * used at all.
+ *
+ * See the description of @FT_FACE_FLAG_TRICKY for a special exception
+ * (affecting only a handful of Asian fonts).
+ *
+ * Besides deciding which hinter to use, you can also decide which
+ * hinting algorithm to use. See @FT_LOAD_TARGET_XXX for details.
+ *
+ * Note that the auto-hinter needs a valid Unicode cmap (either a native
+ * one or synthesized by FreeType) for producing correct results. If a
+ * font provides an incorrect mapping (for example, assigning the
+ * character code U+005A, LATIN CAPITAL LETTER Z, to a glyph depicting a
+ * mathematical integral sign), the auto-hinter might produce useless
+ * results.
+ *
+ */
+#define FT_LOAD_DEFAULT 0x0
+#define FT_LOAD_NO_SCALE ( 1L << 0 )
+#define FT_LOAD_NO_HINTING ( 1L << 1 )
+#define FT_LOAD_RENDER ( 1L << 2 )
+#define FT_LOAD_NO_BITMAP ( 1L << 3 )
+#define FT_LOAD_VERTICAL_LAYOUT ( 1L << 4 )
+#define FT_LOAD_FORCE_AUTOHINT ( 1L << 5 )
+#define FT_LOAD_CROP_BITMAP ( 1L << 6 )
+#define FT_LOAD_PEDANTIC ( 1L << 7 )
+#define FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH ( 1L << 9 )
+#define FT_LOAD_NO_RECURSE ( 1L << 10 )
+#define FT_LOAD_IGNORE_TRANSFORM ( 1L << 11 )
+#define FT_LOAD_MONOCHROME ( 1L << 12 )
+#define FT_LOAD_LINEAR_DESIGN ( 1L << 13 )
+#define FT_LOAD_NO_AUTOHINT ( 1L << 15 )
+ /* Bits 16..19 are used by `FT_LOAD_TARGET_' */
+#define FT_LOAD_COLOR ( 1L << 20 )
+
+ /* */
+
+ /* used internally only by certain font drivers! */
+#define FT_LOAD_ADVANCE_ONLY ( 1L << 8 )
+#define FT_LOAD_SBITS_ONLY ( 1L << 14 )
+
+
+ /**************************************************************************
+ *
+ * @enum:
+ * FT_LOAD_TARGET_XXX
+ *
+ * @description:
+ * A list of values that are used to select a specific hinting algorithm
+ * to use by the hinter. You should OR one of these values to your
+ * `load_flags' when calling @FT_Load_Glyph.
+ *
+ * Note that font's native hinters may ignore the hinting algorithm you
+ * have specified (e.g., the TrueType bytecode interpreter). You can set
+ * @FT_LOAD_FORCE_AUTOHINT to ensure that the auto-hinter is used.
+ *
+ * Also note that @FT_LOAD_TARGET_LIGHT is an exception, in that it
+ * always implies @FT_LOAD_FORCE_AUTOHINT.
+ *
+ * @values:
+ * FT_LOAD_TARGET_NORMAL ::
+ * This corresponds to the default hinting algorithm, optimized for
+ * standard gray-level rendering. For monochrome output, use
+ * @FT_LOAD_TARGET_MONO instead.
+ *
+ * FT_LOAD_TARGET_LIGHT ::
+ * A lighter hinting algorithm for non-monochrome modes. Many
+ * generated glyphs are more fuzzy but better resemble its original
+ * shape. A bit like rendering on Mac OS~X.
+ *
+ * As a special exception, this target implies @FT_LOAD_FORCE_AUTOHINT.
+ *
+ * FT_LOAD_TARGET_MONO ::
+ * Strong hinting algorithm that should only be used for monochrome
+ * output. The result is probably unpleasant if the glyph is rendered
+ * in non-monochrome modes.
+ *
+ * FT_LOAD_TARGET_LCD ::
+ * A variant of @FT_LOAD_TARGET_NORMAL optimized for horizontally
+ * decimated LCD displays.
+ *
+ * FT_LOAD_TARGET_LCD_V ::
+ * A variant of @FT_LOAD_TARGET_NORMAL optimized for vertically
+ * decimated LCD displays.
+ *
+ * @note:
+ * You should use only _one_ of the FT_LOAD_TARGET_XXX values in your
+ * `load_flags'. They can't be ORed.
+ *
+ * If @FT_LOAD_RENDER is also set, the glyph is rendered in the
+ * corresponding mode (i.e., the mode which matches the used algorithm
+ * best). An exeption is FT_LOAD_TARGET_MONO since it implies
+ * @FT_LOAD_MONOCHROME.
+ *
+ * You can use a hinting algorithm that doesn't correspond to the same
+ * rendering mode. As an example, it is possible to use the `light'
+ * hinting algorithm and have the results rendered in horizontal LCD
+ * pixel mode, with code like
+ *
+ * {
+ * FT_Load_Glyph( face, glyph_index,
+ * load_flags | FT_LOAD_TARGET_LIGHT );
+ *
+ * FT_Render_Glyph( face->glyph, FT_RENDER_MODE_LCD );
+ * }
+ *
+ */
+#define FT_LOAD_TARGET_( x ) ( (FT_Int32)( (x) & 15 ) << 16 )
+
+#define FT_LOAD_TARGET_NORMAL FT_LOAD_TARGET_( FT_RENDER_MODE_NORMAL )
+#define FT_LOAD_TARGET_LIGHT FT_LOAD_TARGET_( FT_RENDER_MODE_LIGHT )
+#define FT_LOAD_TARGET_MONO FT_LOAD_TARGET_( FT_RENDER_MODE_MONO )
+#define FT_LOAD_TARGET_LCD FT_LOAD_TARGET_( FT_RENDER_MODE_LCD )
+#define FT_LOAD_TARGET_LCD_V FT_LOAD_TARGET_( FT_RENDER_MODE_LCD_V )
+
+
+ /**************************************************************************
+ *
+ * @macro:
+ * FT_LOAD_TARGET_MODE
+ *
+ * @description:
+ * Return the @FT_Render_Mode corresponding to a given
+ * @FT_LOAD_TARGET_XXX value.
+ *
+ */
+#define FT_LOAD_TARGET_MODE( x ) ( (FT_Render_Mode)( ( (x) >> 16 ) & 15 ) )
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Set_Transform */
+ /* */
+ /* <Description> */
+ /* A function used to set the transformation that is applied to glyph */
+ /* images when they are loaded into a glyph slot through */
+ /* @FT_Load_Glyph. */
+ /* */
+ /* <InOut> */
+ /* face :: A handle to the source face object. */
+ /* */
+ /* <Input> */
+ /* matrix :: A pointer to the transformation's 2x2 matrix. Use~0 for */
+ /* the identity matrix. */
+ /* delta :: A pointer to the translation vector. Use~0 for the null */
+ /* vector. */
+ /* */
+ /* <Note> */
+ /* The transformation is only applied to scalable image formats after */
+ /* the glyph has been loaded. It means that hinting is unaltered by */
+ /* the transformation and is performed on the character size given in */
+ /* the last call to @FT_Set_Char_Size or @FT_Set_Pixel_Sizes. */
+ /* */
+ /* Note that this also transforms the `face.glyph.advance' field, but */
+ /* *not* the values in `face.glyph.metrics'. */
+ /* */
+ FT_EXPORT( void )
+ FT_Set_Transform( FT_Face face,
+ FT_Matrix* matrix,
+ FT_Vector* delta );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Enum> */
+ /* FT_Render_Mode */
+ /* */
+ /* <Description> */
+ /* An enumeration type that lists the render modes supported by */
+ /* FreeType~2. Each mode corresponds to a specific type of scanline */
+ /* conversion performed on the outline. */
+ /* */
+ /* For bitmap fonts and embedded bitmaps the `bitmap->pixel_mode' */
+ /* field in the @FT_GlyphSlotRec structure gives the format of the */
+ /* returned bitmap. */
+ /* */
+ /* All modes except @FT_RENDER_MODE_MONO use 256 levels of opacity. */
+ /* */
+ /* <Values> */
+ /* FT_RENDER_MODE_NORMAL :: */
+ /* This is the default render mode; it corresponds to 8-bit */
+ /* anti-aliased bitmaps. */
+ /* */
+ /* FT_RENDER_MODE_LIGHT :: */
+ /* This is equivalent to @FT_RENDER_MODE_NORMAL. It is only */
+ /* defined as a separate value because render modes are also used */
+ /* indirectly to define hinting algorithm selectors. See */
+ /* @FT_LOAD_TARGET_XXX for details. */
+ /* */
+ /* FT_RENDER_MODE_MONO :: */
+ /* This mode corresponds to 1-bit bitmaps (with 2~levels of */
+ /* opacity). */
+ /* */
+ /* FT_RENDER_MODE_LCD :: */
+ /* This mode corresponds to horizontal RGB and BGR sub-pixel */
+ /* displays like LCD screens. It produces 8-bit bitmaps that are */
+ /* 3~times the width of the original glyph outline in pixels, and */
+ /* which use the @FT_PIXEL_MODE_LCD mode. */
+ /* */
+ /* FT_RENDER_MODE_LCD_V :: */
+ /* This mode corresponds to vertical RGB and BGR sub-pixel displays */
+ /* (like PDA screens, rotated LCD displays, etc.). It produces */
+ /* 8-bit bitmaps that are 3~times the height of the original */
+ /* glyph outline in pixels and use the @FT_PIXEL_MODE_LCD_V mode. */
+ /* */
+ /* <Note> */
+ /* The LCD-optimized glyph bitmaps produced by FT_Render_Glyph can be */
+ /* filtered to reduce color-fringes by using @FT_Library_SetLcdFilter */
+ /* (not active in the default builds). It is up to the caller to */
+ /* either call @FT_Library_SetLcdFilter (if available) or do the */
+ /* filtering itself. */
+ /* */
+ /* The selected render mode only affects vector glyphs of a font. */
+ /* Embedded bitmaps often have a different pixel mode like */
+ /* @FT_PIXEL_MODE_MONO. You can use @FT_Bitmap_Convert to transform */
+ /* them into 8-bit pixmaps. */
+ /* */
+ typedef enum FT_Render_Mode_
+ {
+ FT_RENDER_MODE_NORMAL = 0,
+ FT_RENDER_MODE_LIGHT,
+ FT_RENDER_MODE_MONO,
+ FT_RENDER_MODE_LCD,
+ FT_RENDER_MODE_LCD_V,
+
+ FT_RENDER_MODE_MAX
+
+ } FT_Render_Mode;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Enum> */
+ /* ft_render_mode_xxx */
+ /* */
+ /* <Description> */
+ /* These constants are deprecated. Use the corresponding */
+ /* @FT_Render_Mode values instead. */
+ /* */
+ /* <Values> */
+ /* ft_render_mode_normal :: see @FT_RENDER_MODE_NORMAL */
+ /* ft_render_mode_mono :: see @FT_RENDER_MODE_MONO */
+ /* */
+#define ft_render_mode_normal FT_RENDER_MODE_NORMAL
+#define ft_render_mode_mono FT_RENDER_MODE_MONO
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Render_Glyph */
+ /* */
+ /* <Description> */
+ /* Convert a given glyph image to a bitmap. It does so by inspecting */
+ /* the glyph image format, finding the relevant renderer, and */
+ /* invoking it. */
+ /* */
+ /* <InOut> */
+ /* slot :: A handle to the glyph slot containing the image to */
+ /* convert. */
+ /* */
+ /* <Input> */
+ /* render_mode :: This is the render mode used to render the glyph */
+ /* image into a bitmap. See @FT_Render_Mode for a */
+ /* list of possible values. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Render_Glyph( FT_GlyphSlot slot,
+ FT_Render_Mode render_mode );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Enum> */
+ /* FT_Kerning_Mode */
+ /* */
+ /* <Description> */
+ /* An enumeration used to specify which kerning values to return in */
+ /* @FT_Get_Kerning. */
+ /* */
+ /* <Values> */
+ /* FT_KERNING_DEFAULT :: Return scaled and grid-fitted kerning */
+ /* distances (value is~0). */
+ /* */
+ /* FT_KERNING_UNFITTED :: Return scaled but un-grid-fitted kerning */
+ /* distances. */
+ /* */
+ /* FT_KERNING_UNSCALED :: Return the kerning vector in original font */
+ /* units. */
+ /* */
+ typedef enum FT_Kerning_Mode_
+ {
+ FT_KERNING_DEFAULT = 0,
+ FT_KERNING_UNFITTED,
+ FT_KERNING_UNSCALED
+
+ } FT_Kerning_Mode;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Const> */
+ /* ft_kerning_default */
+ /* */
+ /* <Description> */
+ /* This constant is deprecated. Please use @FT_KERNING_DEFAULT */
+ /* instead. */
+ /* */
+#define ft_kerning_default FT_KERNING_DEFAULT
+
+
+ /*************************************************************************/
+ /* */
+ /* <Const> */
+ /* ft_kerning_unfitted */
+ /* */
+ /* <Description> */
+ /* This constant is deprecated. Please use @FT_KERNING_UNFITTED */
+ /* instead. */
+ /* */
+#define ft_kerning_unfitted FT_KERNING_UNFITTED
+
+
+ /*************************************************************************/
+ /* */
+ /* <Const> */
+ /* ft_kerning_unscaled */
+ /* */
+ /* <Description> */
+ /* This constant is deprecated. Please use @FT_KERNING_UNSCALED */
+ /* instead. */
+ /* */
+#define ft_kerning_unscaled FT_KERNING_UNSCALED
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_Kerning */
+ /* */
+ /* <Description> */
+ /* Return the kerning vector between two glyphs of a same face. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to a source face object. */
+ /* */
+ /* left_glyph :: The index of the left glyph in the kern pair. */
+ /* */
+ /* right_glyph :: The index of the right glyph in the kern pair. */
+ /* */
+ /* kern_mode :: See @FT_Kerning_Mode for more information. */
+ /* Determines the scale and dimension of the returned */
+ /* kerning vector. */
+ /* */
+ /* <Output> */
+ /* akerning :: The kerning vector. This is either in font units */
+ /* or in pixels (26.6 format) for scalable formats, */
+ /* and in pixels for fixed-sizes formats. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* Only horizontal layouts (left-to-right & right-to-left) are */
+ /* supported by this method. Other layouts, or more sophisticated */
+ /* kernings, are out of the scope of this API function -- they can be */
+ /* implemented through format-specific interfaces. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Get_Kerning( FT_Face face,
+ FT_UInt left_glyph,
+ FT_UInt right_glyph,
+ FT_UInt kern_mode,
+ FT_Vector *akerning );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_Track_Kerning */
+ /* */
+ /* <Description> */
+ /* Return the track kerning for a given face object at a given size. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to a source face object. */
+ /* */
+ /* point_size :: The point size in 16.16 fractional points. */
+ /* */
+ /* degree :: The degree of tightness. Increasingly negative */
+ /* values represent tighter track kerning, while */
+ /* increasingly positive values represent looser track */
+ /* kerning. Value zero means no track kerning. */
+ /* */
+ /* <Output> */
+ /* akerning :: The kerning in 16.16 fractional points, to be */
+ /* uniformly applied between all glyphs. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* Currently, only the Type~1 font driver supports track kerning, */
+ /* using data from AFM files (if attached with @FT_Attach_File or */
+ /* @FT_Attach_Stream). */
+ /* */
+ /* Only very few AFM files come with track kerning data; please refer */
+ /* to the Adobe's AFM specification for more details. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Get_Track_Kerning( FT_Face face,
+ FT_Fixed point_size,
+ FT_Int degree,
+ FT_Fixed* akerning );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_Glyph_Name */
+ /* */
+ /* <Description> */
+ /* Retrieve the ASCII name of a given glyph in a face. This only */
+ /* works for those faces where @FT_HAS_GLYPH_NAMES(face) returns~1. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to a source face object. */
+ /* */
+ /* glyph_index :: The glyph index. */
+ /* */
+ /* buffer_max :: The maximum number of bytes available in the */
+ /* buffer. */
+ /* */
+ /* <Output> */
+ /* buffer :: A pointer to a target buffer where the name is */
+ /* copied to. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* An error is returned if the face doesn't provide glyph names or if */
+ /* the glyph index is invalid. In all cases of failure, the first */
+ /* byte of `buffer' is set to~0 to indicate an empty name. */
+ /* */
+ /* The glyph name is truncated to fit within the buffer if it is too */
+ /* long. The returned string is always zero-terminated. */
+ /* */
+ /* Be aware that FreeType reorders glyph indices internally so that */
+ /* glyph index~0 always corresponds to the `missing glyph' (called */
+ /* `.notdef'). */
+ /* */
+ /* This function is not compiled within the library if the config */
+ /* macro `FT_CONFIG_OPTION_NO_GLYPH_NAMES' is defined in */
+ /* `include/freetype/config/ftoptions.h'. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Get_Glyph_Name( FT_Face face,
+ FT_UInt glyph_index,
+ FT_Pointer buffer,
+ FT_UInt buffer_max );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_Postscript_Name */
+ /* */
+ /* <Description> */
+ /* Retrieve the ASCII PostScript name of a given face, if available. */
+ /* This only works with PostScript and TrueType fonts. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the source face object. */
+ /* */
+ /* <Return> */
+ /* A pointer to the face's PostScript name. NULL if unavailable. */
+ /* */
+ /* <Note> */
+ /* The returned pointer is owned by the face and is destroyed with */
+ /* it. */
+ /* */
+ FT_EXPORT( const char* )
+ FT_Get_Postscript_Name( FT_Face face );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Select_Charmap */
+ /* */
+ /* <Description> */
+ /* Select a given charmap by its encoding tag (as listed in */
+ /* `freetype.h'). */
+ /* */
+ /* <InOut> */
+ /* face :: A handle to the source face object. */
+ /* */
+ /* <Input> */
+ /* encoding :: A handle to the selected encoding. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* This function returns an error if no charmap in the face */
+ /* corresponds to the encoding queried here. */
+ /* */
+ /* Because many fonts contain more than a single cmap for Unicode */
+ /* encoding, this function has some special code to select the one */
+ /* which covers Unicode best (`best' in the sense that a UCS-4 cmap */
+ /* is preferred to a UCS-2 cmap). It is thus preferable to */
+ /* @FT_Set_Charmap in this case. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Select_Charmap( FT_Face face,
+ FT_Encoding encoding );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Set_Charmap */
+ /* */
+ /* <Description> */
+ /* Select a given charmap for character code to glyph index mapping. */
+ /* */
+ /* <InOut> */
+ /* face :: A handle to the source face object. */
+ /* */
+ /* <Input> */
+ /* charmap :: A handle to the selected charmap. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* This function returns an error if the charmap is not part of */
+ /* the face (i.e., if it is not listed in the `face->charmaps' */
+ /* table). */
+ /* */
+ /* It also fails if a type~14 charmap is selected. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Set_Charmap( FT_Face face,
+ FT_CharMap charmap );
+
+
+ /*************************************************************************
+ *
+ * @function:
+ * FT_Get_Charmap_Index
+ *
+ * @description:
+ * Retrieve index of a given charmap.
+ *
+ * @input:
+ * charmap ::
+ * A handle to a charmap.
+ *
+ * @return:
+ * The index into the array of character maps within the face to which
+ * `charmap' belongs. If an error occurs, -1 is returned.
+ *
+ */
+ FT_EXPORT( FT_Int )
+ FT_Get_Charmap_Index( FT_CharMap charmap );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_Char_Index */
+ /* */
+ /* <Description> */
+ /* Return the glyph index of a given character code. This function */
+ /* uses a charmap object to do the mapping. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the source face object. */
+ /* */
+ /* charcode :: The character code. */
+ /* */
+ /* <Return> */
+ /* The glyph index. 0~means `undefined character code'. */
+ /* */
+ /* <Note> */
+ /* If you use FreeType to manipulate the contents of font files */
+ /* directly, be aware that the glyph index returned by this function */
+ /* doesn't always correspond to the internal indices used within the */
+ /* file. This is done to ensure that value~0 always corresponds to */
+ /* the `missing glyph'. If the first glyph is not named `.notdef', */
+ /* then for Type~1 and Type~42 fonts, `.notdef' will be moved into */
+ /* the glyph ID~0 position, and whatever was there will be moved to */
+ /* the position `.notdef' had. For Type~1 fonts, if there is no */
+ /* `.notdef' glyph at all, then one will be created at index~0 and */
+ /* whatever was there will be moved to the last index -- Type~42 */
+ /* fonts are considered invalid under this condition. */
+ /* */
+ FT_EXPORT( FT_UInt )
+ FT_Get_Char_Index( FT_Face face,
+ FT_ULong charcode );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_First_Char */
+ /* */
+ /* <Description> */
+ /* This function is used to return the first character code in the */
+ /* current charmap of a given face. It also returns the */
+ /* corresponding glyph index. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the source face object. */
+ /* */
+ /* <Output> */
+ /* agindex :: Glyph index of first character code. 0~if charmap is */
+ /* empty. */
+ /* */
+ /* <Return> */
+ /* The charmap's first character code. */
+ /* */
+ /* <Note> */
+ /* You should use this function with @FT_Get_Next_Char to be able to */
+ /* parse all character codes available in a given charmap. The code */
+ /* should look like this: */
+ /* */
+ /* { */
+ /* FT_ULong charcode; */
+ /* FT_UInt gindex; */
+ /* */
+ /* */
+ /* charcode = FT_Get_First_Char( face, &gindex ); */
+ /* while ( gindex != 0 ) */
+ /* { */
+ /* ... do something with (charcode,gindex) pair ... */
+ /* */
+ /* charcode = FT_Get_Next_Char( face, charcode, &gindex ); */
+ /* } */
+ /* } */
+ /* */
+ /* Note that `*agindex' is set to~0 if the charmap is empty. The */
+ /* result itself can be~0 in two cases: if the charmap is empty or */
+ /* if the value~0 is the first valid character code. */
+ /* */
+ FT_EXPORT( FT_ULong )
+ FT_Get_First_Char( FT_Face face,
+ FT_UInt *agindex );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_Next_Char */
+ /* */
+ /* <Description> */
+ /* This function is used to return the next character code in the */
+ /* current charmap of a given face following the value `char_code', */
+ /* as well as the corresponding glyph index. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the source face object. */
+ /* char_code :: The starting character code. */
+ /* */
+ /* <Output> */
+ /* agindex :: Glyph index of next character code. 0~if charmap */
+ /* is empty. */
+ /* */
+ /* <Return> */
+ /* The charmap's next character code. */
+ /* */
+ /* <Note> */
+ /* You should use this function with @FT_Get_First_Char to walk */
+ /* over all character codes available in a given charmap. See the */
+ /* note for this function for a simple code example. */
+ /* */
+ /* Note that `*agindex' is set to~0 when there are no more codes in */
+ /* the charmap. */
+ /* */
+ FT_EXPORT( FT_ULong )
+ FT_Get_Next_Char( FT_Face face,
+ FT_ULong char_code,
+ FT_UInt *agindex );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_Name_Index */
+ /* */
+ /* <Description> */
+ /* Return the glyph index of a given glyph name. This function uses */
+ /* driver specific objects to do the translation. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the source face object. */
+ /* */
+ /* glyph_name :: The glyph name. */
+ /* */
+ /* <Return> */
+ /* The glyph index. 0~means `undefined character code'. */
+ /* */
+ FT_EXPORT( FT_UInt )
+ FT_Get_Name_Index( FT_Face face,
+ FT_String* glyph_name );
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_SUBGLYPH_FLAG_XXX
+ *
+ * @description:
+ * A list of constants used to describe subglyphs. Please refer to the
+ * TrueType specification for the meaning of the various flags.
+ *
+ * @values:
+ * FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS ::
+ * FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES ::
+ * FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID ::
+ * FT_SUBGLYPH_FLAG_SCALE ::
+ * FT_SUBGLYPH_FLAG_XY_SCALE ::
+ * FT_SUBGLYPH_FLAG_2X2 ::
+ * FT_SUBGLYPH_FLAG_USE_MY_METRICS ::
+ *
+ */
+#define FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS 1
+#define FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES 2
+#define FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID 4
+#define FT_SUBGLYPH_FLAG_SCALE 8
+#define FT_SUBGLYPH_FLAG_XY_SCALE 0x40
+#define FT_SUBGLYPH_FLAG_2X2 0x80
+#define FT_SUBGLYPH_FLAG_USE_MY_METRICS 0x200
+
+
+ /*************************************************************************
+ *
+ * @func:
+ * FT_Get_SubGlyph_Info
+ *
+ * @description:
+ * Retrieve a description of a given subglyph. Only use it if
+ * `glyph->format' is @FT_GLYPH_FORMAT_COMPOSITE; an error is
+ * returned otherwise.
+ *
+ * @input:
+ * glyph ::
+ * The source glyph slot.
+ *
+ * sub_index ::
+ * The index of the subglyph. Must be less than
+ * `glyph->num_subglyphs'.
+ *
+ * @output:
+ * p_index ::
+ * The glyph index of the subglyph.
+ *
+ * p_flags ::
+ * The subglyph flags, see @FT_SUBGLYPH_FLAG_XXX.
+ *
+ * p_arg1 ::
+ * The subglyph's first argument (if any).
+ *
+ * p_arg2 ::
+ * The subglyph's second argument (if any).
+ *
+ * p_transform ::
+ * The subglyph transformation (if any).
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * The values of `*p_arg1', `*p_arg2', and `*p_transform' must be
+ * interpreted depending on the flags returned in `*p_flags'. See the
+ * TrueType specification for details.
+ *
+ */
+ FT_EXPORT( FT_Error )
+ FT_Get_SubGlyph_Info( FT_GlyphSlot glyph,
+ FT_UInt sub_index,
+ FT_Int *p_index,
+ FT_UInt *p_flags,
+ FT_Int *p_arg1,
+ FT_Int *p_arg2,
+ FT_Matrix *p_transform );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Enum> */
+ /* FT_FSTYPE_XXX */
+ /* */
+ /* <Description> */
+ /* A list of bit flags used in the `fsType' field of the OS/2 table */
+ /* in a TrueType or OpenType font and the `FSType' entry in a */
+ /* PostScript font. These bit flags are returned by */
+ /* @FT_Get_FSType_Flags; they inform client applications of embedding */
+ /* and subsetting restrictions associated with a font. */
+ /* */
+ /* See http://www.adobe.com/devnet/acrobat/pdfs/FontPolicies.pdf for */
+ /* more details. */
+ /* */
+ /* <Values> */
+ /* FT_FSTYPE_INSTALLABLE_EMBEDDING :: */
+ /* Fonts with no fsType bit set may be embedded and permanently */
+ /* installed on the remote system by an application. */
+ /* */
+ /* FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING :: */
+ /* Fonts that have only this bit set must not be modified, embedded */
+ /* or exchanged in any manner without first obtaining permission of */
+ /* the font software copyright owner. */
+ /* */
+ /* FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING :: */
+ /* If this bit is set, the font may be embedded and temporarily */
+ /* loaded on the remote system. Documents containing Preview & */
+ /* Print fonts must be opened `read-only'; no edits can be applied */
+ /* to the document. */
+ /* */
+ /* FT_FSTYPE_EDITABLE_EMBEDDING :: */
+ /* If this bit is set, the font may be embedded but must only be */
+ /* installed temporarily on other systems. In contrast to Preview */
+ /* & Print fonts, documents containing editable fonts may be opened */
+ /* for reading, editing is permitted, and changes may be saved. */
+ /* */
+ /* FT_FSTYPE_NO_SUBSETTING :: */
+ /* If this bit is set, the font may not be subsetted prior to */
+ /* embedding. */
+ /* */
+ /* FT_FSTYPE_BITMAP_EMBEDDING_ONLY :: */
+ /* If this bit is set, only bitmaps contained in the font may be */
+ /* embedded; no outline data may be embedded. If there are no */
+ /* bitmaps available in the font, then the font is unembeddable. */
+ /* */
+ /* <Note> */
+ /* While the fsType flags can indicate that a font may be embedded, a */
+ /* license with the font vendor may be separately required to use the */
+ /* font in this way. */
+ /* */
+#define FT_FSTYPE_INSTALLABLE_EMBEDDING 0x0000
+#define FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING 0x0002
+#define FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING 0x0004
+#define FT_FSTYPE_EDITABLE_EMBEDDING 0x0008
+#define FT_FSTYPE_NO_SUBSETTING 0x0100
+#define FT_FSTYPE_BITMAP_EMBEDDING_ONLY 0x0200
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_FSType_Flags */
+ /* */
+ /* <Description> */
+ /* Return the fsType flags for a font. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the source face object. */
+ /* */
+ /* <Return> */
+ /* The fsType flags, @FT_FSTYPE_XXX. */
+ /* */
+ /* <Note> */
+ /* Use this function rather than directly reading the `fs_type' field */
+ /* in the @PS_FontInfoRec structure which is only guaranteed to */
+ /* return the correct results for Type~1 fonts. */
+ /* */
+ /* <Since> */
+ /* 2.3.8 */
+ /* */
+ FT_EXPORT( FT_UShort )
+ FT_Get_FSType_Flags( FT_Face face );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* glyph_variants */
+ /* */
+ /* <Title> */
+ /* Glyph Variants */
+ /* */
+ /* <Abstract> */
+ /* The FreeType~2 interface to Unicode Ideographic Variation */
+ /* Sequences (IVS), using the SFNT cmap format~14. */
+ /* */
+ /* <Description> */
+ /* Many CJK characters have variant forms. They are a sort of grey */
+ /* area somewhere between being totally irrelevant and semantically */
+ /* distinct; for this reason, the Unicode consortium decided to */
+ /* introduce Ideographic Variation Sequences (IVS), consisting of a */
+ /* Unicode base character and one of 240 variant selectors */
+ /* (U+E0100-U+E01EF), instead of further extending the already huge */
+ /* code range for CJK characters. */
+ /* */
+ /* An IVS is registered and unique; for further details please refer */
+ /* to Unicode Technical Standard #37, the Ideographic Variation */
+ /* Database: */
+ /* */
+ /* http://www.unicode.org/reports/tr37/ */
+ /* */
+ /* To date (November 2012), the character with the most variants is */
+ /* U+9089, having 31 such IVS. */
+ /* */
+ /* Adobe and MS decided to support IVS with a new cmap subtable */
+ /* (format~14). It is an odd subtable because it is not a mapping of */
+ /* input code points to glyphs, but contains lists of all variants */
+ /* supported by the font. */
+ /* */
+ /* A variant may be either `default' or `non-default'. A default */
+ /* variant is the one you will get for that code point if you look it */
+ /* up in the standard Unicode cmap. A non-default variant is a */
+ /* different glyph. */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Face_GetCharVariantIndex */
+ /* */
+ /* <Description> */
+ /* Return the glyph index of a given character code as modified by */
+ /* the variation selector. */
+ /* */
+ /* <Input> */
+ /* face :: */
+ /* A handle to the source face object. */
+ /* */
+ /* charcode :: */
+ /* The character code point in Unicode. */
+ /* */
+ /* variantSelector :: */
+ /* The Unicode code point of the variation selector. */
+ /* */
+ /* <Return> */
+ /* The glyph index. 0~means either `undefined character code', or */
+ /* `undefined selector code', or `no variation selector cmap */
+ /* subtable', or `current CharMap is not Unicode'. */
+ /* */
+ /* <Note> */
+ /* If you use FreeType to manipulate the contents of font files */
+ /* directly, be aware that the glyph index returned by this function */
+ /* doesn't always correspond to the internal indices used within */
+ /* the file. This is done to ensure that value~0 always corresponds */
+ /* to the `missing glyph'. */
+ /* */
+ /* This function is only meaningful if */
+ /* a) the font has a variation selector cmap sub table, */
+ /* and */
+ /* b) the current charmap has a Unicode encoding. */
+ /* */
+ /* <Since> */
+ /* 2.3.6 */
+ /* */
+ FT_EXPORT( FT_UInt )
+ FT_Face_GetCharVariantIndex( FT_Face face,
+ FT_ULong charcode,
+ FT_ULong variantSelector );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Face_GetCharVariantIsDefault */
+ /* */
+ /* <Description> */
+ /* Check whether this variant of this Unicode character is the one to */
+ /* be found in the `cmap'. */
+ /* */
+ /* <Input> */
+ /* face :: */
+ /* A handle to the source face object. */
+ /* */
+ /* charcode :: */
+ /* The character codepoint in Unicode. */
+ /* */
+ /* variantSelector :: */
+ /* The Unicode codepoint of the variation selector. */
+ /* */
+ /* <Return> */
+ /* 1~if found in the standard (Unicode) cmap, 0~if found in the */
+ /* variation selector cmap, or -1 if it is not a variant. */
+ /* */
+ /* <Note> */
+ /* This function is only meaningful if the font has a variation */
+ /* selector cmap subtable. */
+ /* */
+ /* <Since> */
+ /* 2.3.6 */
+ /* */
+ FT_EXPORT( FT_Int )
+ FT_Face_GetCharVariantIsDefault( FT_Face face,
+ FT_ULong charcode,
+ FT_ULong variantSelector );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Face_GetVariantSelectors */
+ /* */
+ /* <Description> */
+ /* Return a zero-terminated list of Unicode variant selectors found */
+ /* in the font. */
+ /* */
+ /* <Input> */
+ /* face :: */
+ /* A handle to the source face object. */
+ /* */
+ /* <Return> */
+ /* A pointer to an array of selector code points, or NULL if there is */
+ /* no valid variant selector cmap subtable. */
+ /* */
+ /* <Note> */
+ /* The last item in the array is~0; the array is owned by the */
+ /* @FT_Face object but can be overwritten or released on the next */
+ /* call to a FreeType function. */
+ /* */
+ /* <Since> */
+ /* 2.3.6 */
+ /* */
+ FT_EXPORT( FT_UInt32* )
+ FT_Face_GetVariantSelectors( FT_Face face );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Face_GetVariantsOfChar */
+ /* */
+ /* <Description> */
+ /* Return a zero-terminated list of Unicode variant selectors found */
+ /* for the specified character code. */
+ /* */
+ /* <Input> */
+ /* face :: */
+ /* A handle to the source face object. */
+ /* */
+ /* charcode :: */
+ /* The character codepoint in Unicode. */
+ /* */
+ /* <Return> */
+ /* A pointer to an array of variant selector code points which are */
+ /* active for the given character, or NULL if the corresponding list */
+ /* is empty. */
+ /* */
+ /* <Note> */
+ /* The last item in the array is~0; the array is owned by the */
+ /* @FT_Face object but can be overwritten or released on the next */
+ /* call to a FreeType function. */
+ /* */
+ /* <Since> */
+ /* 2.3.6 */
+ /* */
+ FT_EXPORT( FT_UInt32* )
+ FT_Face_GetVariantsOfChar( FT_Face face,
+ FT_ULong charcode );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Face_GetCharsOfVariant */
+ /* */
+ /* <Description> */
+ /* Return a zero-terminated list of Unicode character codes found for */
+ /* the specified variant selector. */
+ /* */
+ /* <Input> */
+ /* face :: */
+ /* A handle to the source face object. */
+ /* */
+ /* variantSelector :: */
+ /* The variant selector code point in Unicode. */
+ /* */
+ /* <Return> */
+ /* A list of all the code points which are specified by this selector */
+ /* (both default and non-default codes are returned) or NULL if there */
+ /* is no valid cmap or the variant selector is invalid. */
+ /* */
+ /* <Note> */
+ /* The last item in the array is~0; the array is owned by the */
+ /* @FT_Face object but can be overwritten or released on the next */
+ /* call to a FreeType function. */
+ /* */
+ /* <Since> */
+ /* 2.3.6 */
+ /* */
+ FT_EXPORT( FT_UInt32* )
+ FT_Face_GetCharsOfVariant( FT_Face face,
+ FT_ULong variantSelector );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* computations */
+ /* */
+ /* <Title> */
+ /* Computations */
+ /* */
+ /* <Abstract> */
+ /* Crunching fixed numbers and vectors. */
+ /* */
+ /* <Description> */
+ /* This section contains various functions used to perform */
+ /* computations on 16.16 fixed-float numbers or 2d vectors. */
+ /* */
+ /* <Order> */
+ /* FT_MulDiv */
+ /* FT_MulFix */
+ /* FT_DivFix */
+ /* FT_RoundFix */
+ /* FT_CeilFix */
+ /* FT_FloorFix */
+ /* FT_Vector_Transform */
+ /* FT_Matrix_Multiply */
+ /* FT_Matrix_Invert */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_MulDiv */
+ /* */
+ /* <Description> */
+ /* A very simple function used to perform the computation `(a*b)/c' */
+ /* with maximum accuracy (it uses a 64-bit intermediate integer */
+ /* whenever necessary). */
+ /* */
+ /* This function isn't necessarily as fast as some processor specific */
+ /* operations, but is at least completely portable. */
+ /* */
+ /* <Input> */
+ /* a :: The first multiplier. */
+ /* b :: The second multiplier. */
+ /* c :: The divisor. */
+ /* */
+ /* <Return> */
+ /* The result of `(a*b)/c'. This function never traps when trying to */
+ /* divide by zero; it simply returns `MaxInt' or `MinInt' depending */
+ /* on the signs of `a' and `b'. */
+ /* */
+ FT_EXPORT( FT_Long )
+ FT_MulDiv( FT_Long a,
+ FT_Long b,
+ FT_Long c );
+
+
+ /* */
+
+ /* The following #if 0 ... #endif is for the documentation formatter, */
+ /* hiding the internal `FT_MULFIX_INLINED' macro. */
+
+#if 0
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_MulFix */
+ /* */
+ /* <Description> */
+ /* A very simple function used to perform the computation */
+ /* `(a*b)/0x10000' with maximum accuracy. Most of the time this is */
+ /* used to multiply a given value by a 16.16 fixed-point factor. */
+ /* */
+ /* <Input> */
+ /* a :: The first multiplier. */
+ /* b :: The second multiplier. Use a 16.16 factor here whenever */
+ /* possible (see note below). */
+ /* */
+ /* <Return> */
+ /* The result of `(a*b)/0x10000'. */
+ /* */
+ /* <Note> */
+ /* This function has been optimized for the case where the absolute */
+ /* value of `a' is less than 2048, and `b' is a 16.16 scaling factor. */
+ /* As this happens mainly when scaling from notional units to */
+ /* fractional pixels in FreeType, it resulted in noticeable speed */
+ /* improvements between versions 2.x and 1.x. */
+ /* */
+ /* As a conclusion, always try to place a 16.16 factor as the */
+ /* _second_ argument of this function; this can make a great */
+ /* difference. */
+ /* */
+ FT_EXPORT( FT_Long )
+ FT_MulFix( FT_Long a,
+ FT_Long b );
+
+ /* */
+#endif
+
+#ifdef FT_MULFIX_INLINED
+#define FPDFAPI_FT_MulFix( a, b ) FT_MULFIX_INLINED( a, b )
+#else
+ FT_EXPORT( FT_Long )
+ FT_MulFix( FT_Long a,
+ FT_Long b );
+#endif
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_DivFix */
+ /* */
+ /* <Description> */
+ /* A very simple function used to perform the computation */
+ /* `(a*0x10000)/b' with maximum accuracy. Most of the time, this is */
+ /* used to divide a given value by a 16.16 fixed-point factor. */
+ /* */
+ /* <Input> */
+ /* a :: The first multiplier. */
+ /* b :: The second multiplier. Use a 16.16 factor here whenever */
+ /* possible (see note below). */
+ /* */
+ /* <Return> */
+ /* The result of `(a*0x10000)/b'. */
+ /* */
+ /* <Note> */
+ /* The optimization for FT_DivFix() is simple: If (a~<<~16) fits in */
+ /* 32~bits, then the division is computed directly. Otherwise, we */
+ /* use a specialized version of @FT_MulDiv. */
+ /* */
+ FT_EXPORT( FT_Long )
+ FT_DivFix( FT_Long a,
+ FT_Long b );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_RoundFix */
+ /* */
+ /* <Description> */
+ /* A very simple function used to round a 16.16 fixed number. */
+ /* */
+ /* <Input> */
+ /* a :: The number to be rounded. */
+ /* */
+ /* <Return> */
+ /* The result of `(a + 0x8000) & -0x10000'. */
+ /* */
+ FT_EXPORT( FT_Fixed )
+ FT_RoundFix( FT_Fixed a );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_CeilFix */
+ /* */
+ /* <Description> */
+ /* A very simple function used to compute the ceiling function of a */
+ /* 16.16 fixed number. */
+ /* */
+ /* <Input> */
+ /* a :: The number for which the ceiling function is to be computed. */
+ /* */
+ /* <Return> */
+ /* The result of `(a + 0x10000 - 1) & -0x10000'. */
+ /* */
+ FT_EXPORT( FT_Fixed )
+ FT_CeilFix( FT_Fixed a );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_FloorFix */
+ /* */
+ /* <Description> */
+ /* A very simple function used to compute the floor function of a */
+ /* 16.16 fixed number. */
+ /* */
+ /* <Input> */
+ /* a :: The number for which the floor function is to be computed. */
+ /* */
+ /* <Return> */
+ /* The result of `a & -0x10000'. */
+ /* */
+ FT_EXPORT( FT_Fixed )
+ FT_FloorFix( FT_Fixed a );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Vector_Transform */
+ /* */
+ /* <Description> */
+ /* Transform a single vector through a 2x2 matrix. */
+ /* */
+ /* <InOut> */
+ /* vector :: The target vector to transform. */
+ /* */
+ /* <Input> */
+ /* matrix :: A pointer to the source 2x2 matrix. */
+ /* */
+ /* <Note> */
+ /* The result is undefined if either `vector' or `matrix' is invalid. */
+ /* */
+ FT_EXPORT( void )
+ FT_Vector_Transform( FT_Vector* vec,
+ const FT_Matrix* matrix );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* version */
+ /* */
+ /* <Title> */
+ /* FreeType Version */
+ /* */
+ /* <Abstract> */
+ /* Functions and macros related to FreeType versions. */
+ /* */
+ /* <Description> */
+ /* Note that those functions and macros are of limited use because */
+ /* even a new release of FreeType with only documentation changes */
+ /* increases the version number. */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************
+ *
+ * @enum:
+ * FREETYPE_XXX
+ *
+ * @description:
+ * These three macros identify the FreeType source code version.
+ * Use @FT_Library_Version to access them at runtime.
+ *
+ * @values:
+ * FREETYPE_MAJOR :: The major version number.
+ * FREETYPE_MINOR :: The minor version number.
+ * FREETYPE_PATCH :: The patch level.
+ *
+ * @note:
+ * The version number of FreeType if built as a dynamic link library
+ * with the `libtool' package is _not_ controlled by these three
+ * macros.
+ *
+ */
+#define FREETYPE_MAJOR 2
+#define FREETYPE_MINOR 5
+#define FREETYPE_PATCH 0
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Library_Version */
+ /* */
+ /* <Description> */
+ /* Return the version of the FreeType library being used. This is */
+ /* useful when dynamically linking to the library, since one cannot */
+ /* use the macros @FREETYPE_MAJOR, @FREETYPE_MINOR, and */
+ /* @FREETYPE_PATCH. */
+ /* */
+ /* <Input> */
+ /* library :: A source library handle. */
+ /* */
+ /* <Output> */
+ /* amajor :: The major version number. */
+ /* */
+ /* aminor :: The minor version number. */
+ /* */
+ /* apatch :: The patch version number. */
+ /* */
+ /* <Note> */
+ /* The reason why this function takes a `library' argument is because */
+ /* certain programs implement library initialization in a custom way */
+ /* that doesn't use @FT_Init_FreeType. */
+ /* */
+ /* In such cases, the library version might not be available before */
+ /* the library object has been created. */
+ /* */
+ FT_EXPORT( void )
+ FT_Library_Version( FT_Library library,
+ FT_Int *amajor,
+ FT_Int *aminor,
+ FT_Int *apatch );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Face_CheckTrueTypePatents */
+ /* */
+ /* <Description> */
+ /* Parse all bytecode instructions of a TrueType font file to check */
+ /* whether any of the patented opcodes are used. This is only useful */
+ /* if you want to be able to use the unpatented hinter with */
+ /* fonts that do *not* use these opcodes. */
+ /* */
+ /* Note that this function parses *all* glyph instructions in the */
+ /* font file, which may be slow. */
+ /* */
+ /* <Input> */
+ /* face :: A face handle. */
+ /* */
+ /* <Return> */
+ /* 1~if this is a TrueType font that uses one of the patented */
+ /* opcodes, 0~otherwise. */
+ /* */
+ /* <Note> */
+ /* Since May 2010, TrueType hinting is no longer patented. */
+ /* */
+ /* <Since> */
+ /* 2.3.5 */
+ /* */
+ FT_EXPORT( FT_Bool )
+ FT_Face_CheckTrueTypePatents( FT_Face face );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Face_SetUnpatentedHinting */
+ /* */
+ /* <Description> */
+ /* Enable or disable the unpatented hinter for a given face. */
+ /* Only enable it if you have determined that the face doesn't */
+ /* use any patented opcodes (see @FT_Face_CheckTrueTypePatents). */
+ /* */
+ /* <Input> */
+ /* face :: A face handle. */
+ /* */
+ /* value :: New boolean setting. */
+ /* */
+ /* <Return> */
+ /* The old setting value. This will always be false if this is not */
+ /* an SFNT font, or if the unpatented hinter is not compiled in this */
+ /* instance of the library. */
+ /* */
+ /* <Note> */
+ /* Since May 2010, TrueType hinting is no longer patented. */
+ /* */
+ /* <Since> */
+ /* 2.3.5 */
+ /* */
+ FT_EXPORT( FT_Bool )
+ FT_Face_SetUnpatentedHinting( FT_Face face,
+ FT_Bool value );
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FREETYPE_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftadvanc.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftadvanc.h
new file mode 100644
index 0000000000..0163ba1874
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftadvanc.h
@@ -0,0 +1,182 @@
+/***************************************************************************/
+/* */
+/* ftadvanc.h */
+/* */
+/* Quick computation of advance widths (specification only). */
+/* */
+/* Copyright 2008, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTADVANC_H__
+#define __FTADVANC_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /**************************************************************************
+ *
+ * @section:
+ * quick_advance
+ *
+ * @title:
+ * Quick retrieval of advance values
+ *
+ * @abstract:
+ * Retrieve horizontal and vertical advance values without processing
+ * glyph outlines, if possible.
+ *
+ * @description:
+ * This section contains functions to quickly extract advance values
+ * without handling glyph outlines, if possible.
+ */
+
+
+ /*************************************************************************/
+ /* */
+ /* <Const> */
+ /* FT_ADVANCE_FLAG_FAST_ONLY */
+ /* */
+ /* <Description> */
+ /* A bit-flag to be OR-ed with the `flags' parameter of the */
+ /* @FT_Get_Advance and @FT_Get_Advances functions. */
+ /* */
+ /* If set, it indicates that you want these functions to fail if the */
+ /* corresponding hinting mode or font driver doesn't allow for very */
+ /* quick advance computation. */
+ /* */
+ /* Typically, glyphs which are either unscaled, unhinted, bitmapped, */
+ /* or light-hinted can have their advance width computed very */
+ /* quickly. */
+ /* */
+ /* Normal and bytecode hinted modes, which require loading, scaling, */
+ /* and hinting of the glyph outline, are extremely slow by */
+ /* comparison. */
+ /* */
+#define FT_ADVANCE_FLAG_FAST_ONLY 0x20000000UL
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_Advance */
+ /* */
+ /* <Description> */
+ /* Retrieve the advance value of a given glyph outline in an */
+ /* @FT_Face. */
+ /* */
+ /* <Input> */
+ /* face :: The source @FT_Face handle. */
+ /* */
+ /* gindex :: The glyph index. */
+ /* */
+ /* load_flags :: A set of bit flags similar to those used when */
+ /* calling @FT_Load_Glyph, used to determine what kind */
+ /* of advances you need. */
+ /* <Output> */
+ /* padvance :: The advance value. If scaling is performed (based on */
+ /* the value of `load_flags'), the advance value is in */
+ /* 16.16 format. Otherwise, it is in font units. */
+ /* */
+ /* If @FT_LOAD_VERTICAL_LAYOUT is set, this is the */
+ /* vertical advance corresponding to a vertical layout. */
+ /* Otherwise, it is the horizontal advance in a */
+ /* horizontal layout. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ /* <Note> */
+ /* This function may fail if you use @FT_ADVANCE_FLAG_FAST_ONLY and */
+ /* if the corresponding font backend doesn't have a quick way to */
+ /* retrieve the advances. */
+ /* */
+ /* A scaled advance is returned in 16.16 format but isn't transformed */
+ /* by the affine transformation specified by @FT_Set_Transform. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Get_Advance( FT_Face face,
+ FT_UInt gindex,
+ FT_Int32 load_flags,
+ FT_Fixed *padvance );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_Advances */
+ /* */
+ /* <Description> */
+ /* Retrieve the advance values of several glyph outlines in an */
+ /* @FT_Face. */
+ /* */
+ /* <Input> */
+ /* face :: The source @FT_Face handle. */
+ /* */
+ /* start :: The first glyph index. */
+ /* */
+ /* count :: The number of advance values you want to retrieve. */
+ /* */
+ /* load_flags :: A set of bit flags similar to those used when */
+ /* calling @FT_Load_Glyph. */
+ /* */
+ /* <Output> */
+ /* padvance :: The advance values. This array, to be provided by the */
+ /* caller, must contain at least `count' elements. */
+ /* */
+ /* If scaling is performed (based on the value of */
+ /* `load_flags'), the advance values are in 16.16 format. */
+ /* Otherwise, they are in font units. */
+ /* */
+ /* If @FT_LOAD_VERTICAL_LAYOUT is set, these are the */
+ /* vertical advances corresponding to a vertical layout. */
+ /* Otherwise, they are the horizontal advances in a */
+ /* horizontal layout. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ /* <Note> */
+ /* This function may fail if you use @FT_ADVANCE_FLAG_FAST_ONLY and */
+ /* if the corresponding font backend doesn't have a quick way to */
+ /* retrieve the advances. */
+ /* */
+ /* Scaled advances are returned in 16.16 format but aren't */
+ /* transformed by the affine transformation specified by */
+ /* @FT_Set_Transform. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Get_Advances( FT_Face face,
+ FT_UInt start,
+ FT_UInt count,
+ FT_Int32 load_flags,
+ FT_Fixed *padvances );
+
+/* */
+
+
+FT_END_HEADER
+
+#endif /* __FTADVANC_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftautoh.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftautoh.h
new file mode 100644
index 0000000000..6edd9f4b73
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftautoh.h
@@ -0,0 +1,357 @@
+/***************************************************************************/
+/* */
+/* ftautoh.h */
+/* */
+/* FreeType API for controlling the auto-hinter (specification only). */
+/* */
+/* Copyright 2012, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTAUTOH_H__
+#define __FTAUTOH_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /**************************************************************************
+ *
+ * @section:
+ * auto_hinter
+ *
+ * @title:
+ * The auto-hinter
+ *
+ * @abstract:
+ * Controlling the auto-hinting module.
+ *
+ * @description:
+ * While FreeType's auto-hinter doesn't expose API functions by itself,
+ * it is possible to control its behaviour with @FT_Property_Set and
+ * @FT_Property_Get. The following lists the available properties
+ * together with the necessary macros and structures.
+ *
+ * Note that the auto-hinter's module name is `autofitter' for
+ * historical reasons.
+ *
+ */
+
+
+ /**************************************************************************
+ *
+ * @property:
+ * glyph-to-script-map
+ *
+ * @description:
+ * *Experimental* *only*
+ *
+ * The auto-hinter provides various script modules to hint glyphs.
+ * Examples of supported scripts are Latin or CJK. Before a glyph is
+ * auto-hinted, the Unicode character map of the font gets examined, and
+ * the script is then determined based on Unicode character ranges, see
+ * below.
+ *
+ * OpenType fonts, however, often provide much more glyphs than
+ * character codes (small caps, superscripts, ligatures, swashes, etc.),
+ * to be controlled by so-called `features'. Handling OpenType features
+ * can be quite complicated and thus needs a separate library on top of
+ * FreeType.
+ *
+ * The mapping between glyph indices and scripts (in the auto-hinter
+ * sense, see the @FT_AUTOHINTER_SCRIPT_XXX values) is stored as an
+ * array with `num_glyphs' elements, as found in the font's @FT_Face
+ * structure. The `glyph-to-script-map' property returns a pointer to
+ * this array which can be modified as needed. Note that the
+ * modification should happen before the first glyph gets processed by
+ * the auto-hinter so that the global analysis of the font shapes
+ * actually uses the modified mapping.
+ *
+ * The following example code demonstrates how to access it (omitting
+ * the error handling).
+ *
+ * {
+ * FT_Library library;
+ * FT_Face face;
+ * FT_Prop_GlyphToScriptMap prop;
+ *
+ *
+ * FT_Init_FreeType( &library );
+ * FT_New_Face( library, "foo.ttf", 0, &face );
+ *
+ * prop.face = face;
+ *
+ * FT_Property_Get( library, "autofitter",
+ * "glyph-to-script-map", &prop );
+ *
+ * // adjust `prop.map' as needed right here
+ *
+ * FT_Load_Glyph( face, ..., FT_LOAD_FORCE_AUTOHINT );
+ * }
+ *
+ */
+
+
+ /**************************************************************************
+ *
+ * @enum:
+ * FT_AUTOHINTER_SCRIPT_XXX
+ *
+ * @description:
+ * *Experimental* *only*
+ *
+ * A list of constants used for the @glyph-to-script-map property to
+ * specify the script submodule the auto-hinter should use for hinting a
+ * particular glyph.
+ *
+ * @values:
+ * FT_AUTOHINTER_SCRIPT_NONE ::
+ * Don't auto-hint this glyph.
+ *
+ * FT_AUTOHINTER_SCRIPT_LATIN ::
+ * Apply the latin auto-hinter. For the auto-hinter, `latin' is a
+ * very broad term, including Cyrillic and Greek also since characters
+ * from those scripts share the same design constraints.
+ *
+ * By default, characters from the following Unicode ranges are
+ * assigned to this submodule.
+ *
+ * {
+ * U+0020 - U+007F // Basic Latin (no control characters)
+ * U+00A0 - U+00FF // Latin-1 Supplement (no control characters)
+ * U+0100 - U+017F // Latin Extended-A
+ * U+0180 - U+024F // Latin Extended-B
+ * U+0250 - U+02AF // IPA Extensions
+ * U+02B0 - U+02FF // Spacing Modifier Letters
+ * U+0300 - U+036F // Combining Diacritical Marks
+ * U+0370 - U+03FF // Greek and Coptic
+ * U+0400 - U+04FF // Cyrillic
+ * U+0500 - U+052F // Cyrillic Supplement
+ * U+1D00 - U+1D7F // Phonetic Extensions
+ * U+1D80 - U+1DBF // Phonetic Extensions Supplement
+ * U+1DC0 - U+1DFF // Combining Diacritical Marks Supplement
+ * U+1E00 - U+1EFF // Latin Extended Additional
+ * U+1F00 - U+1FFF // Greek Extended
+ * U+2000 - U+206F // General Punctuation
+ * U+2070 - U+209F // Superscripts and Subscripts
+ * U+20A0 - U+20CF // Currency Symbols
+ * U+2150 - U+218F // Number Forms
+ * U+2460 - U+24FF // Enclosed Alphanumerics
+ * U+2C60 - U+2C7F // Latin Extended-C
+ * U+2DE0 - U+2DFF // Cyrillic Extended-A
+ * U+2E00 - U+2E7F // Supplemental Punctuation
+ * U+A640 - U+A69F // Cyrillic Extended-B
+ * U+A720 - U+A7FF // Latin Extended-D
+ * U+FB00 - U+FB06 // Alphab. Present. Forms (Latin Ligatures)
+ * U+1D400 - U+1D7FF // Mathematical Alphanumeric Symbols
+ * U+1F100 - U+1F1FF // Enclosed Alphanumeric Supplement
+ * }
+ *
+ * FT_AUTOHINTER_SCRIPT_CJK ::
+ * Apply the CJK auto-hinter, covering Chinese, Japanese, Korean, old
+ * Vietnamese, and some other scripts.
+ *
+ * By default, characters from the following Unicode ranges are
+ * assigned to this submodule.
+ *
+ * {
+ * U+1100 - U+11FF // Hangul Jamo
+ * U+2E80 - U+2EFF // CJK Radicals Supplement
+ * U+2F00 - U+2FDF // Kangxi Radicals
+ * U+2FF0 - U+2FFF // Ideographic Description Characters
+ * U+3000 - U+303F // CJK Symbols and Punctuation
+ * U+3040 - U+309F // Hiragana
+ * U+30A0 - U+30FF // Katakana
+ * U+3100 - U+312F // Bopomofo
+ * U+3130 - U+318F // Hangul Compatibility Jamo
+ * U+3190 - U+319F // Kanbun
+ * U+31A0 - U+31BF // Bopomofo Extended
+ * U+31C0 - U+31EF // CJK Strokes
+ * U+31F0 - U+31FF // Katakana Phonetic Extensions
+ * U+3200 - U+32FF // Enclosed CJK Letters and Months
+ * U+3300 - U+33FF // CJK Compatibility
+ * U+3400 - U+4DBF // CJK Unified Ideographs Extension A
+ * U+4DC0 - U+4DFF // Yijing Hexagram Symbols
+ * U+4E00 - U+9FFF // CJK Unified Ideographs
+ * U+A960 - U+A97F // Hangul Jamo Extended-A
+ * U+AC00 - U+D7AF // Hangul Syllables
+ * U+D7B0 - U+D7FF // Hangul Jamo Extended-B
+ * U+F900 - U+FAFF // CJK Compatibility Ideographs
+ * U+FE10 - U+FE1F // Vertical forms
+ * U+FE30 - U+FE4F // CJK Compatibility Forms
+ * U+FF00 - U+FFEF // Halfwidth and Fullwidth Forms
+ * U+1B000 - U+1B0FF // Kana Supplement
+ * U+1D300 - U+1D35F // Tai Xuan Hing Symbols
+ * U+1F200 - U+1F2FF // Enclosed Ideographic Supplement
+ * U+20000 - U+2A6DF // CJK Unified Ideographs Extension B
+ * U+2A700 - U+2B73F // CJK Unified Ideographs Extension C
+ * U+2B740 - U+2B81F // CJK Unified Ideographs Extension D
+ * U+2F800 - U+2FA1F // CJK Compatibility Ideographs Supplement
+ * }
+ *
+ * FT_AUTOHINTER_SCRIPT_INDIC ::
+ * Apply the indic auto-hinter, covering all major scripts from the
+ * Indian sub-continent and some other related scripts like Thai, Lao,
+ * or Tibetan.
+ *
+ * By default, characters from the following Unicode ranges are
+ * assigned to this submodule.
+ *
+ * {
+ * U+0900 - U+0DFF // Indic Range
+ * U+0F00 - U+0FFF // Tibetan
+ * U+1900 - U+194F // Limbu
+ * U+1B80 - U+1BBF // Sundanese
+ * U+1C80 - U+1CDF // Meetei Mayak
+ * U+A800 - U+A82F // Syloti Nagri
+ * U+11800 - U+118DF // Sharada
+ * }
+ *
+ * Note that currently Indic support is rudimentary only, missing blue
+ * zone support.
+ *
+ */
+#define FT_AUTOHINTER_SCRIPT_NONE 0
+#define FT_AUTOHINTER_SCRIPT_LATIN 1
+#define FT_AUTOHINTER_SCRIPT_CJK 2
+#define FT_AUTOHINTER_SCRIPT_INDIC 3
+
+
+ /**************************************************************************
+ *
+ * @struct:
+ * FT_Prop_GlyphToScriptMap
+ *
+ * @description:
+ * *Experimental* *only*
+ *
+ * The data exchange structure for the @glyph-to-script-map property.
+ *
+ */
+ typedef struct FT_Prop_GlyphToScriptMap_
+ {
+ FT_Face face;
+ FT_Byte* map;
+
+ } FT_Prop_GlyphToScriptMap;
+
+
+ /**************************************************************************
+ *
+ * @property:
+ * fallback-script
+ *
+ * @description:
+ * *Experimental* *only*
+ *
+ * If no auto-hinter script module can be assigned to a glyph, a
+ * fallback script gets assigned to it (see also the
+ * @glyph-to-script-map property). By default, this is
+ * @FT_AUTOHINTER_SCRIPT_CJK. Using the `fallback-script' property,
+ * this fallback value can be changed.
+ *
+ * {
+ * FT_Library library;
+ * FT_UInt fallback_script = FT_AUTOHINTER_SCRIPT_NONE;
+ *
+ *
+ * FT_Init_FreeType( &library );
+ *
+ * FT_Property_Set( library, "autofitter",
+ * "fallback-script", &fallback_script );
+ * }
+ *
+ * @note:
+ * This property can be used with @FT_Property_Get also.
+ *
+ * It's important to use the right timing for changing this value: The
+ * creation of the glyph-to-script map which eventually uses the
+ * fallback script value gets triggered either by setting or reading a
+ * face-specific property like @glyph-to-script-map, or by auto-hinting
+ * any glyph from that face. In particular, if you have already created
+ * an @FT_Face structure but not loaded any glyph (using the
+ * auto-hinter), a change of the fallback glyph will affect this face.
+ *
+ */
+
+
+ /**************************************************************************
+ *
+ * @property:
+ * increase-x-height
+ *
+ * @description:
+ * For ppem values in the range 6~<= ppem <= `increase-x-height', round
+ * up the font's x~height much more often than normally. If the value
+ * is set to~0, which is the default, this feature is switched off. Use
+ * this property to improve the legibility of small font sizes if
+ * necessary.
+ *
+ * {
+ * FT_Library library;
+ * FT_Face face;
+ * FT_Prop_IncreaseXHeight prop;
+ *
+ *
+ * FT_Init_FreeType( &library );
+ * FT_New_Face( library, "foo.ttf", 0, &face );
+ * FT_Set_Char_Size( face, 10 * 64, 0, 72, 0 );
+ *
+ * prop.face = face;
+ * prop.limit = 14;
+ *
+ * FT_Property_Set( library, "autofitter",
+ * "increase-x-height", &prop );
+ * }
+ *
+ * @note:
+ * This property can be used with @FT_Property_Get also.
+ *
+ * Set this value right after calling @FT_Set_Char_Size, but before
+ * loading any glyph (using the auto-hinter).
+ *
+ */
+
+
+ /**************************************************************************
+ *
+ * @struct:
+ * FT_Prop_IncreaseXHeight
+ *
+ * @description:
+ * The data exchange structure for the @increase-x-height property.
+ *
+ */
+ typedef struct FT_Prop_IncreaseXHeight_
+ {
+ FT_Face face;
+ FT_UInt limit;
+
+ } FT_Prop_IncreaseXHeight;
+
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __FTAUTOH_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftbbox.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftbbox.h
new file mode 100644
index 0000000000..5f54246976
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftbbox.h
@@ -0,0 +1,102 @@
+/***************************************************************************/
+/* */
+/* ftbbox.h */
+/* */
+/* FreeType exact bbox computation (specification). */
+/* */
+/* Copyright 1996-2001, 2003, 2007, 2011 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* This component has a _single_ role: to compute exact outline bounding */
+ /* boxes. */
+ /* */
+ /* It is separated from the rest of the engine for various technical */
+ /* reasons. It may well be integrated in `ftoutln' later. */
+ /* */
+ /*************************************************************************/
+
+
+#ifndef __FTBBOX_H__
+#define __FTBBOX_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* outline_processing */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Outline_Get_BBox */
+ /* */
+ /* <Description> */
+ /* Compute the exact bounding box of an outline. This is slower */
+ /* than computing the control box. However, it uses an advanced */
+ /* algorithm which returns _very_ quickly when the two boxes */
+ /* coincide. Otherwise, the outline Bézier arcs are traversed to */
+ /* extract their extrema. */
+ /* */
+ /* <Input> */
+ /* outline :: A pointer to the source outline. */
+ /* */
+ /* <Output> */
+ /* abbox :: The outline's exact bounding box. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* If the font is tricky and the glyph has been loaded with */
+ /* @FT_LOAD_NO_SCALE, the resulting BBox is meaningless. To get */
+ /* reasonable values for the BBox it is necessary to load the glyph */
+ /* at a large ppem value (so that the hinting instructions can */
+ /* properly shift and scale the subglyphs), then extracting the BBox */
+ /* which can be eventually converted back to font units. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Outline_Get_BBox( FT_Outline* outline,
+ FT_BBox *abbox );
+
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTBBOX_H__ */
+
+
+/* END */
+
+
+/* Local Variables: */
+/* coding: utf-8 */
+/* End: */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftbdf.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftbdf.h
new file mode 100644
index 0000000000..c4721bcd4e
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftbdf.h
@@ -0,0 +1,209 @@
+/***************************************************************************/
+/* */
+/* ftbdf.h */
+/* */
+/* FreeType API for accessing BDF-specific strings (specification). */
+/* */
+/* Copyright 2002, 2003, 2004, 2006, 2009 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTBDF_H__
+#define __FTBDF_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* bdf_fonts */
+ /* */
+ /* <Title> */
+ /* BDF and PCF Files */
+ /* */
+ /* <Abstract> */
+ /* BDF and PCF specific API. */
+ /* */
+ /* <Description> */
+ /* This section contains the declaration of functions specific to BDF */
+ /* and PCF fonts. */
+ /* */
+ /*************************************************************************/
+
+
+ /**********************************************************************
+ *
+ * @enum:
+ * FT_PropertyType
+ *
+ * @description:
+ * A list of BDF property types.
+ *
+ * @values:
+ * BDF_PROPERTY_TYPE_NONE ::
+ * Value~0 is used to indicate a missing property.
+ *
+ * BDF_PROPERTY_TYPE_ATOM ::
+ * Property is a string atom.
+ *
+ * BDF_PROPERTY_TYPE_INTEGER ::
+ * Property is a 32-bit signed integer.
+ *
+ * BDF_PROPERTY_TYPE_CARDINAL ::
+ * Property is a 32-bit unsigned integer.
+ */
+ typedef enum BDF_PropertyType_
+ {
+ BDF_PROPERTY_TYPE_NONE = 0,
+ BDF_PROPERTY_TYPE_ATOM = 1,
+ BDF_PROPERTY_TYPE_INTEGER = 2,
+ BDF_PROPERTY_TYPE_CARDINAL = 3
+
+ } BDF_PropertyType;
+
+
+ /**********************************************************************
+ *
+ * @type:
+ * BDF_Property
+ *
+ * @description:
+ * A handle to a @BDF_PropertyRec structure to model a given
+ * BDF/PCF property.
+ */
+ typedef struct BDF_PropertyRec_* BDF_Property;
+
+
+ /**********************************************************************
+ *
+ * @struct:
+ * BDF_PropertyRec
+ *
+ * @description:
+ * This structure models a given BDF/PCF property.
+ *
+ * @fields:
+ * type ::
+ * The property type.
+ *
+ * u.atom ::
+ * The atom string, if type is @BDF_PROPERTY_TYPE_ATOM.
+ *
+ * u.integer ::
+ * A signed integer, if type is @BDF_PROPERTY_TYPE_INTEGER.
+ *
+ * u.cardinal ::
+ * An unsigned integer, if type is @BDF_PROPERTY_TYPE_CARDINAL.
+ */
+ typedef struct BDF_PropertyRec_
+ {
+ BDF_PropertyType type;
+ union {
+ const char* atom;
+ FT_Int32 integer;
+ FT_UInt32 cardinal;
+
+ } u;
+
+ } BDF_PropertyRec;
+
+
+ /**********************************************************************
+ *
+ * @function:
+ * FT_Get_BDF_Charset_ID
+ *
+ * @description:
+ * Retrieve a BDF font character set identity, according to
+ * the BDF specification.
+ *
+ * @input:
+ * face ::
+ * A handle to the input face.
+ *
+ * @output:
+ * acharset_encoding ::
+ * Charset encoding, as a C~string, owned by the face.
+ *
+ * acharset_registry ::
+ * Charset registry, as a C~string, owned by the face.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * This function only works with BDF faces, returning an error otherwise.
+ */
+ FT_EXPORT( FT_Error )
+ FT_Get_BDF_Charset_ID( FT_Face face,
+ const char* *acharset_encoding,
+ const char* *acharset_registry );
+
+
+ /**********************************************************************
+ *
+ * @function:
+ * FT_Get_BDF_Property
+ *
+ * @description:
+ * Retrieve a BDF property from a BDF or PCF font file.
+ *
+ * @input:
+ * face :: A handle to the input face.
+ *
+ * name :: The property name.
+ *
+ * @output:
+ * aproperty :: The property.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * This function works with BDF _and_ PCF fonts. It returns an error
+ * otherwise. It also returns an error if the property is not in the
+ * font.
+ *
+ * A `property' is a either key-value pair within the STARTPROPERTIES
+ * ... ENDPROPERTIES block of a BDF font or a key-value pair from the
+ * `info->props' array within a `FontRec' structure of a PCF font.
+ *
+ * Integer properties are always stored as `signed' within PCF fonts;
+ * consequently, @BDF_PROPERTY_TYPE_CARDINAL is a possible return value
+ * for BDF fonts only.
+ *
+ * In case of error, `aproperty->type' is always set to
+ * @BDF_PROPERTY_TYPE_NONE.
+ */
+ FT_EXPORT( FT_Error )
+ FT_Get_BDF_Property( FT_Face face,
+ const char* prop_name,
+ BDF_PropertyRec *aproperty );
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __FTBDF_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftbitmap.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftbitmap.h
new file mode 100644
index 0000000000..9640790925
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftbitmap.h
@@ -0,0 +1,227 @@
+/***************************************************************************/
+/* */
+/* ftbitmap.h */
+/* */
+/* FreeType utility functions for bitmaps (specification). */
+/* */
+/* Copyright 2004-2006, 2008, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTBITMAP_H__
+#define __FTBITMAP_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* bitmap_handling */
+ /* */
+ /* <Title> */
+ /* Bitmap Handling */
+ /* */
+ /* <Abstract> */
+ /* Handling FT_Bitmap objects. */
+ /* */
+ /* <Description> */
+ /* This section contains functions for converting FT_Bitmap objects. */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Bitmap_New */
+ /* */
+ /* <Description> */
+ /* Initialize a pointer to an @FT_Bitmap structure. */
+ /* */
+ /* <InOut> */
+ /* abitmap :: A pointer to the bitmap structure. */
+ /* */
+ FT_EXPORT( void )
+ FT_Bitmap_New( FT_Bitmap *abitmap );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Bitmap_Copy */
+ /* */
+ /* <Description> */
+ /* Copy a bitmap into another one. */
+ /* */
+ /* <Input> */
+ /* library :: A handle to a library object. */
+ /* */
+ /* source :: A handle to the source bitmap. */
+ /* */
+ /* <Output> */
+ /* target :: A handle to the target bitmap. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Bitmap_Copy( FT_Library library,
+ const FT_Bitmap *source,
+ FT_Bitmap *target);
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Bitmap_Embolden */
+ /* */
+ /* <Description> */
+ /* Embolden a bitmap. The new bitmap will be about `xStrength' */
+ /* pixels wider and `yStrength' pixels higher. The left and bottom */
+ /* borders are kept unchanged. */
+ /* */
+ /* <Input> */
+ /* library :: A handle to a library object. */
+ /* */
+ /* xStrength :: How strong the glyph is emboldened horizontally. */
+ /* Expressed in 26.6 pixel format. */
+ /* */
+ /* yStrength :: How strong the glyph is emboldened vertically. */
+ /* Expressed in 26.6 pixel format. */
+ /* */
+ /* <InOut> */
+ /* bitmap :: A handle to the target bitmap. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* The current implementation restricts `xStrength' to be less than */
+ /* or equal to~8 if bitmap is of pixel_mode @FT_PIXEL_MODE_MONO. */
+ /* */
+ /* If you want to embolden the bitmap owned by a @FT_GlyphSlotRec, */
+ /* you should call @FT_GlyphSlot_Own_Bitmap on the slot first. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Bitmap_Embolden( FT_Library library,
+ FT_Bitmap* bitmap,
+ FT_Pos xStrength,
+ FT_Pos yStrength );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Bitmap_Convert */
+ /* */
+ /* <Description> */
+ /* Convert a bitmap object with depth 1bpp, 2bpp, 4bpp, 8bpp or 32bpp */
+ /* to a bitmap object with depth 8bpp, making the number of used */
+ /* bytes line (a.k.a. the `pitch') a multiple of `alignment'. */
+ /* */
+ /* <Input> */
+ /* library :: A handle to a library object. */
+ /* */
+ /* source :: The source bitmap. */
+ /* */
+ /* alignment :: The pitch of the bitmap is a multiple of this */
+ /* parameter. Common values are 1, 2, or 4. */
+ /* */
+ /* <Output> */
+ /* target :: The target bitmap. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* It is possible to call @FT_Bitmap_Convert multiple times without */
+ /* calling @FT_Bitmap_Done (the memory is simply reallocated). */
+ /* */
+ /* Use @FT_Bitmap_Done to finally remove the bitmap object. */
+ /* */
+ /* The `library' argument is taken to have access to FreeType's */
+ /* memory handling functions. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Bitmap_Convert( FT_Library library,
+ const FT_Bitmap *source,
+ FT_Bitmap *target,
+ FT_Int alignment );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_GlyphSlot_Own_Bitmap */
+ /* */
+ /* <Description> */
+ /* Make sure that a glyph slot owns `slot->bitmap'. */
+ /* */
+ /* <Input> */
+ /* slot :: The glyph slot. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* This function is to be used in combination with */
+ /* @FT_Bitmap_Embolden. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_GlyphSlot_Own_Bitmap( FT_GlyphSlot slot );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Bitmap_Done */
+ /* */
+ /* <Description> */
+ /* Destroy a bitmap object created with @FT_Bitmap_New. */
+ /* */
+ /* <Input> */
+ /* library :: A handle to a library object. */
+ /* */
+ /* bitmap :: The bitmap object to be freed. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* The `library' argument is taken to have access to FreeType's */
+ /* memory handling functions. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Bitmap_Done( FT_Library library,
+ FT_Bitmap *bitmap );
+
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTBITMAP_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftbzip2.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftbzip2.h
new file mode 100644
index 0000000000..654b222346
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftbzip2.h
@@ -0,0 +1,102 @@
+/***************************************************************************/
+/* */
+/* ftbzip2.h */
+/* */
+/* Bzip2-compressed stream support. */
+/* */
+/* Copyright 2010 by */
+/* Joel Klinghed. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTBZIP2_H__
+#define __FTBZIP2_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* bzip2 */
+ /* */
+ /* <Title> */
+ /* BZIP2 Streams */
+ /* */
+ /* <Abstract> */
+ /* Using bzip2-compressed font files. */
+ /* */
+ /* <Description> */
+ /* This section contains the declaration of Bzip2-specific functions. */
+ /* */
+ /*************************************************************************/
+
+
+ /************************************************************************
+ *
+ * @function:
+ * FT_Stream_OpenBzip2
+ *
+ * @description:
+ * Open a new stream to parse bzip2-compressed font files. This is
+ * mainly used to support the compressed `*.pcf.bz2' fonts that come
+ * with XFree86.
+ *
+ * @input:
+ * stream ::
+ * The target embedding stream.
+ *
+ * source ::
+ * The source stream.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * The source stream must be opened _before_ calling this function.
+ *
+ * Calling the internal function `FT_Stream_Close' on the new stream will
+ * *not* call `FT_Stream_Close' on the source stream. None of the stream
+ * objects will be released to the heap.
+ *
+ * The stream implementation is very basic and resets the decompression
+ * process each time seeking backwards is needed within the stream.
+ *
+ * In certain builds of the library, bzip2 compression recognition is
+ * automatically handled when calling @FT_New_Face or @FT_Open_Face.
+ * This means that if no font driver is capable of handling the raw
+ * compressed file, the library will try to open a bzip2 compressed stream
+ * from it and re-open the face with it.
+ *
+ * This function may return `FT_Err_Unimplemented_Feature' if your build
+ * of FreeType was not compiled with bzip2 support.
+ */
+ FT_EXPORT( FT_Error )
+ FT_Stream_OpenBzip2( FT_Stream stream,
+ FT_Stream source );
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTBZIP2_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftcache.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftcache.h
new file mode 100644
index 0000000000..404b0faf8e
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftcache.h
@@ -0,0 +1,1057 @@
+/***************************************************************************/
+/* */
+/* ftcache.h */
+/* */
+/* FreeType Cache subsystem (specification). */
+/* */
+/* Copyright 1996-2008, 2010, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTCACHE_H__
+#define __FTCACHE_H__
+
+
+#include "../ft2build.h"
+#include "ftglyph.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************
+ *
+ * <Section>
+ * cache_subsystem
+ *
+ * <Title>
+ * Cache Sub-System
+ *
+ * <Abstract>
+ * How to cache face, size, and glyph data with FreeType~2.
+ *
+ * <Description>
+ * This section describes the FreeType~2 cache sub-system, which is used
+ * to limit the number of concurrently opened @FT_Face and @FT_Size
+ * objects, as well as caching information like character maps and glyph
+ * images while limiting their maximum memory usage.
+ *
+ * Note that all types and functions begin with the `FTC_' prefix.
+ *
+ * The cache is highly portable and thus doesn't know anything about the
+ * fonts installed on your system, or how to access them. This implies
+ * the following scheme:
+ *
+ * First, available or installed font faces are uniquely identified by
+ * @FTC_FaceID values, provided to the cache by the client. Note that
+ * the cache only stores and compares these values, and doesn't try to
+ * interpret them in any way.
+ *
+ * Second, the cache calls, only when needed, a client-provided function
+ * to convert an @FTC_FaceID into a new @FT_Face object. The latter is
+ * then completely managed by the cache, including its termination
+ * through @FT_Done_Face. To monitor termination of face objects, the
+ * finalizer callback in the `generic' field of the @FT_Face object can
+ * be used, which might also be used to store the @FTC_FaceID of the
+ * face.
+ *
+ * Clients are free to map face IDs to anything else. The most simple
+ * usage is to associate them to a (pathname,face_index) pair that is
+ * used to call @FT_New_Face. However, more complex schemes are also
+ * possible.
+ *
+ * Note that for the cache to work correctly, the face ID values must be
+ * *persistent*, which means that the contents they point to should not
+ * change at runtime, or that their value should not become invalid.
+ *
+ * If this is unavoidable (e.g., when a font is uninstalled at runtime),
+ * you should call @FTC_Manager_RemoveFaceID as soon as possible, to let
+ * the cache get rid of any references to the old @FTC_FaceID it may
+ * keep internally. Failure to do so will lead to incorrect behaviour
+ * or even crashes.
+ *
+ * To use the cache, start with calling @FTC_Manager_New to create a new
+ * @FTC_Manager object, which models a single cache instance. You can
+ * then look up @FT_Face and @FT_Size objects with
+ * @FTC_Manager_LookupFace and @FTC_Manager_LookupSize, respectively.
+ *
+ * If you want to use the charmap caching, call @FTC_CMapCache_New, then
+ * later use @FTC_CMapCache_Lookup to perform the equivalent of
+ * @FT_Get_Char_Index, only much faster.
+ *
+ * If you want to use the @FT_Glyph caching, call @FTC_ImageCache, then
+ * later use @FTC_ImageCache_Lookup to retrieve the corresponding
+ * @FT_Glyph objects from the cache.
+ *
+ * If you need lots of small bitmaps, it is much more memory efficient
+ * to call @FTC_SBitCache_New followed by @FTC_SBitCache_Lookup. This
+ * returns @FTC_SBitRec structures, which are used to store small
+ * bitmaps directly. (A small bitmap is one whose metrics and
+ * dimensions all fit into 8-bit integers).
+ *
+ * We hope to also provide a kerning cache in the near future.
+ *
+ *
+ * <Order>
+ * FTC_Manager
+ * FTC_FaceID
+ * FTC_Face_Requester
+ *
+ * FTC_Manager_New
+ * FTC_Manager_Reset
+ * FTC_Manager_Done
+ * FTC_Manager_LookupFace
+ * FTC_Manager_LookupSize
+ * FTC_Manager_RemoveFaceID
+ *
+ * FTC_Node
+ * FTC_Node_Unref
+ *
+ * FTC_ImageCache
+ * FTC_ImageCache_New
+ * FTC_ImageCache_Lookup
+ *
+ * FTC_SBit
+ * FTC_SBitCache
+ * FTC_SBitCache_New
+ * FTC_SBitCache_Lookup
+ *
+ * FTC_CMapCache
+ * FTC_CMapCache_New
+ * FTC_CMapCache_Lookup
+ *
+ *************************************************************************/
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** BASIC TYPE DEFINITIONS *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************
+ *
+ * @type: FTC_FaceID
+ *
+ * @description:
+ * An opaque pointer type that is used to identity face objects. The
+ * contents of such objects is application-dependent.
+ *
+ * These pointers are typically used to point to a user-defined
+ * structure containing a font file path, and face index.
+ *
+ * @note:
+ * Never use NULL as a valid @FTC_FaceID.
+ *
+ * Face IDs are passed by the client to the cache manager, which calls,
+ * when needed, the @FTC_Face_Requester to translate them into new
+ * @FT_Face objects.
+ *
+ * If the content of a given face ID changes at runtime, or if the value
+ * becomes invalid (e.g., when uninstalling a font), you should
+ * immediately call @FTC_Manager_RemoveFaceID before any other cache
+ * function.
+ *
+ * Failure to do so will result in incorrect behaviour or even
+ * memory leaks and crashes.
+ */
+ typedef FT_Pointer FTC_FaceID;
+
+
+ /************************************************************************
+ *
+ * @functype:
+ * FTC_Face_Requester
+ *
+ * @description:
+ * A callback function provided by client applications. It is used by
+ * the cache manager to translate a given @FTC_FaceID into a new valid
+ * @FT_Face object, on demand.
+ *
+ * <Input>
+ * face_id ::
+ * The face ID to resolve.
+ *
+ * library ::
+ * A handle to a FreeType library object.
+ *
+ * req_data ::
+ * Application-provided request data (see note below).
+ *
+ * <Output>
+ * aface ::
+ * A new @FT_Face handle.
+ *
+ * <Return>
+ * FreeType error code. 0~means success.
+ *
+ * <Note>
+ * The third parameter `req_data' is the same as the one passed by the
+ * client when @FTC_Manager_New is called.
+ *
+ * The face requester should not perform funny things on the returned
+ * face object, like creating a new @FT_Size for it, or setting a
+ * transformation through @FT_Set_Transform!
+ */
+ typedef FT_Error
+ (*FTC_Face_Requester)( FTC_FaceID face_id,
+ FT_Library library,
+ FT_Pointer request_data,
+ FT_Face* aface );
+
+ /* */
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** CACHE MANAGER OBJECT *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FTC_Manager */
+ /* */
+ /* <Description> */
+ /* This object corresponds to one instance of the cache-subsystem. */
+ /* It is used to cache one or more @FT_Face objects, along with */
+ /* corresponding @FT_Size objects. */
+ /* */
+ /* The manager intentionally limits the total number of opened */
+ /* @FT_Face and @FT_Size objects to control memory usage. See the */
+ /* `max_faces' and `max_sizes' parameters of @FTC_Manager_New. */
+ /* */
+ /* The manager is also used to cache `nodes' of various types while */
+ /* limiting their total memory usage. */
+ /* */
+ /* All limitations are enforced by keeping lists of managed objects */
+ /* in most-recently-used order, and flushing old nodes to make room */
+ /* for new ones. */
+ /* */
+ typedef struct FTC_ManagerRec_* FTC_Manager;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FTC_Node */
+ /* */
+ /* <Description> */
+ /* An opaque handle to a cache node object. Each cache node is */
+ /* reference-counted. A node with a count of~0 might be flushed */
+ /* out of a full cache whenever a lookup request is performed. */
+ /* */
+ /* If you look up nodes, you have the ability to `acquire' them, */
+ /* i.e., to increment their reference count. This will prevent the */
+ /* node from being flushed out of the cache until you explicitly */
+ /* `release' it (see @FTC_Node_Unref). */
+ /* */
+ /* See also @FTC_SBitCache_Lookup and @FTC_ImageCache_Lookup. */
+ /* */
+ typedef struct FTC_NodeRec_* FTC_Node;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FTC_Manager_New */
+ /* */
+ /* <Description> */
+ /* Create a new cache manager. */
+ /* */
+ /* <Input> */
+ /* library :: The parent FreeType library handle to use. */
+ /* */
+ /* max_faces :: Maximum number of opened @FT_Face objects managed by */
+ /* this cache instance. Use~0 for defaults. */
+ /* */
+ /* max_sizes :: Maximum number of opened @FT_Size objects managed by */
+ /* this cache instance. Use~0 for defaults. */
+ /* */
+ /* max_bytes :: Maximum number of bytes to use for cached data nodes. */
+ /* Use~0 for defaults. Note that this value does not */
+ /* account for managed @FT_Face and @FT_Size objects. */
+ /* */
+ /* requester :: An application-provided callback used to translate */
+ /* face IDs into real @FT_Face objects. */
+ /* */
+ /* req_data :: A generic pointer that is passed to the requester */
+ /* each time it is called (see @FTC_Face_Requester). */
+ /* */
+ /* <Output> */
+ /* amanager :: A handle to a new manager object. 0~in case of */
+ /* failure. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FTC_Manager_New( FT_Library library,
+ FT_UInt max_faces,
+ FT_UInt max_sizes,
+ FT_ULong max_bytes,
+ FTC_Face_Requester requester,
+ FT_Pointer req_data,
+ FTC_Manager *amanager );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FTC_Manager_Reset */
+ /* */
+ /* <Description> */
+ /* Empty a given cache manager. This simply gets rid of all the */
+ /* currently cached @FT_Face and @FT_Size objects within the manager. */
+ /* */
+ /* <InOut> */
+ /* manager :: A handle to the manager. */
+ /* */
+ FT_EXPORT( void )
+ FTC_Manager_Reset( FTC_Manager manager );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FTC_Manager_Done */
+ /* */
+ /* <Description> */
+ /* Destroy a given manager after emptying it. */
+ /* */
+ /* <Input> */
+ /* manager :: A handle to the target cache manager object. */
+ /* */
+ FT_EXPORT( void )
+ FTC_Manager_Done( FTC_Manager manager );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FTC_Manager_LookupFace */
+ /* */
+ /* <Description> */
+ /* Retrieve the @FT_Face object that corresponds to a given face ID */
+ /* through a cache manager. */
+ /* */
+ /* <Input> */
+ /* manager :: A handle to the cache manager. */
+ /* */
+ /* face_id :: The ID of the face object. */
+ /* */
+ /* <Output> */
+ /* aface :: A handle to the face object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* The returned @FT_Face object is always owned by the manager. You */
+ /* should never try to discard it yourself. */
+ /* */
+ /* The @FT_Face object doesn't necessarily have a current size object */
+ /* (i.e., face->size can be~0). If you need a specific `font size', */
+ /* use @FTC_Manager_LookupSize instead. */
+ /* */
+ /* Never change the face's transformation matrix (i.e., never call */
+ /* the @FT_Set_Transform function) on a returned face! If you need */
+ /* to transform glyphs, do it yourself after glyph loading. */
+ /* */
+ /* When you perform a lookup, out-of-memory errors are detected */
+ /* _within_ the lookup and force incremental flushes of the cache */
+ /* until enough memory is released for the lookup to succeed. */
+ /* */
+ /* If a lookup fails with `FT_Err_Out_Of_Memory' the cache has */
+ /* already been completely flushed, and still no memory was available */
+ /* for the operation. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FTC_Manager_LookupFace( FTC_Manager manager,
+ FTC_FaceID face_id,
+ FT_Face *aface );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FTC_ScalerRec */
+ /* */
+ /* <Description> */
+ /* A structure used to describe a given character size in either */
+ /* pixels or points to the cache manager. See */
+ /* @FTC_Manager_LookupSize. */
+ /* */
+ /* <Fields> */
+ /* face_id :: The source face ID. */
+ /* */
+ /* width :: The character width. */
+ /* */
+ /* height :: The character height. */
+ /* */
+ /* pixel :: A Boolean. If 1, the `width' and `height' fields are */
+ /* interpreted as integer pixel character sizes. */
+ /* Otherwise, they are expressed as 1/64th of points. */
+ /* */
+ /* x_res :: Only used when `pixel' is value~0 to indicate the */
+ /* horizontal resolution in dpi. */
+ /* */
+ /* y_res :: Only used when `pixel' is value~0 to indicate the */
+ /* vertical resolution in dpi. */
+ /* */
+ /* <Note> */
+ /* This type is mainly used to retrieve @FT_Size objects through the */
+ /* cache manager. */
+ /* */
+ typedef struct FTC_ScalerRec_
+ {
+ FTC_FaceID face_id;
+ FT_UInt width;
+ FT_UInt height;
+ FT_Int pixel;
+ FT_UInt x_res;
+ FT_UInt y_res;
+
+ } FTC_ScalerRec;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FTC_Scaler */
+ /* */
+ /* <Description> */
+ /* A handle to an @FTC_ScalerRec structure. */
+ /* */
+ typedef struct FTC_ScalerRec_* FTC_Scaler;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FTC_Manager_LookupSize */
+ /* */
+ /* <Description> */
+ /* Retrieve the @FT_Size object that corresponds to a given */
+ /* @FTC_ScalerRec pointer through a cache manager. */
+ /* */
+ /* <Input> */
+ /* manager :: A handle to the cache manager. */
+ /* */
+ /* scaler :: A scaler handle. */
+ /* */
+ /* <Output> */
+ /* asize :: A handle to the size object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* The returned @FT_Size object is always owned by the manager. You */
+ /* should never try to discard it by yourself. */
+ /* */
+ /* You can access the parent @FT_Face object simply as `size->face' */
+ /* if you need it. Note that this object is also owned by the */
+ /* manager. */
+ /* */
+ /* <Note> */
+ /* When you perform a lookup, out-of-memory errors are detected */
+ /* _within_ the lookup and force incremental flushes of the cache */
+ /* until enough memory is released for the lookup to succeed. */
+ /* */
+ /* If a lookup fails with `FT_Err_Out_Of_Memory' the cache has */
+ /* already been completely flushed, and still no memory is available */
+ /* for the operation. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FTC_Manager_LookupSize( FTC_Manager manager,
+ FTC_Scaler scaler,
+ FT_Size *asize );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FTC_Node_Unref */
+ /* */
+ /* <Description> */
+ /* Decrement a cache node's internal reference count. When the count */
+ /* reaches 0, it is not destroyed but becomes eligible for subsequent */
+ /* cache flushes. */
+ /* */
+ /* <Input> */
+ /* node :: The cache node handle. */
+ /* */
+ /* manager :: The cache manager handle. */
+ /* */
+ FT_EXPORT( void )
+ FTC_Node_Unref( FTC_Node node,
+ FTC_Manager manager );
+
+
+ /*************************************************************************
+ *
+ * @function:
+ * FTC_Manager_RemoveFaceID
+ *
+ * @description:
+ * A special function used to indicate to the cache manager that
+ * a given @FTC_FaceID is no longer valid, either because its
+ * content changed, or because it was deallocated or uninstalled.
+ *
+ * @input:
+ * manager ::
+ * The cache manager handle.
+ *
+ * face_id ::
+ * The @FTC_FaceID to be removed.
+ *
+ * @note:
+ * This function flushes all nodes from the cache corresponding to this
+ * `face_id', with the exception of nodes with a non-null reference
+ * count.
+ *
+ * Such nodes are however modified internally so as to never appear
+ * in later lookups with the same `face_id' value, and to be immediately
+ * destroyed when released by all their users.
+ *
+ */
+ FT_EXPORT( void )
+ FTC_Manager_RemoveFaceID( FTC_Manager manager,
+ FTC_FaceID face_id );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* cache_subsystem */
+ /* */
+ /*************************************************************************/
+
+ /*************************************************************************
+ *
+ * @type:
+ * FTC_CMapCache
+ *
+ * @description:
+ * An opaque handle used to model a charmap cache. This cache is to
+ * hold character codes -> glyph indices mappings.
+ *
+ */
+ typedef struct FTC_CMapCacheRec_* FTC_CMapCache;
+
+
+ /*************************************************************************
+ *
+ * @function:
+ * FTC_CMapCache_New
+ *
+ * @description:
+ * Create a new charmap cache.
+ *
+ * @input:
+ * manager ::
+ * A handle to the cache manager.
+ *
+ * @output:
+ * acache ::
+ * A new cache handle. NULL in case of error.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * Like all other caches, this one will be destroyed with the cache
+ * manager.
+ *
+ */
+ FT_EXPORT( FT_Error )
+ FTC_CMapCache_New( FTC_Manager manager,
+ FTC_CMapCache *acache );
+
+
+ /************************************************************************
+ *
+ * @function:
+ * FTC_CMapCache_Lookup
+ *
+ * @description:
+ * Translate a character code into a glyph index, using the charmap
+ * cache.
+ *
+ * @input:
+ * cache ::
+ * A charmap cache handle.
+ *
+ * face_id ::
+ * The source face ID.
+ *
+ * cmap_index ::
+ * The index of the charmap in the source face. Any negative value
+ * means to use the cache @FT_Face's default charmap.
+ *
+ * char_code ::
+ * The character code (in the corresponding charmap).
+ *
+ * @return:
+ * Glyph index. 0~means `no glyph'.
+ *
+ */
+ FT_EXPORT( FT_UInt )
+ FTC_CMapCache_Lookup( FTC_CMapCache cache,
+ FTC_FaceID face_id,
+ FT_Int cmap_index,
+ FT_UInt32 char_code );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* cache_subsystem */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** IMAGE CACHE OBJECT *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************
+ *
+ * @struct:
+ * FTC_ImageTypeRec
+ *
+ * @description:
+ * A structure used to model the type of images in a glyph cache.
+ *
+ * @fields:
+ * face_id ::
+ * The face ID.
+ *
+ * width ::
+ * The width in pixels.
+ *
+ * height ::
+ * The height in pixels.
+ *
+ * flags ::
+ * The load flags, as in @FT_Load_Glyph.
+ *
+ */
+ typedef struct FTC_ImageTypeRec_
+ {
+ FTC_FaceID face_id;
+ FT_Int width;
+ FT_Int height;
+ FT_Int32 flags;
+
+ } FTC_ImageTypeRec;
+
+
+ /*************************************************************************
+ *
+ * @type:
+ * FTC_ImageType
+ *
+ * @description:
+ * A handle to an @FTC_ImageTypeRec structure.
+ *
+ */
+ typedef struct FTC_ImageTypeRec_* FTC_ImageType;
+
+
+ /* */
+
+
+#define FTC_IMAGE_TYPE_COMPARE( d1, d2 ) \
+ ( (d1)->face_id == (d2)->face_id && \
+ (d1)->width == (d2)->width && \
+ (d1)->flags == (d2)->flags )
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FTC_ImageCache */
+ /* */
+ /* <Description> */
+ /* A handle to a glyph image cache object. They are designed to */
+ /* hold many distinct glyph images while not exceeding a certain */
+ /* memory threshold. */
+ /* */
+ typedef struct FTC_ImageCacheRec_* FTC_ImageCache;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FTC_ImageCache_New */
+ /* */
+ /* <Description> */
+ /* Create a new glyph image cache. */
+ /* */
+ /* <Input> */
+ /* manager :: The parent manager for the image cache. */
+ /* */
+ /* <Output> */
+ /* acache :: A handle to the new glyph image cache object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FTC_ImageCache_New( FTC_Manager manager,
+ FTC_ImageCache *acache );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FTC_ImageCache_Lookup */
+ /* */
+ /* <Description> */
+ /* Retrieve a given glyph image from a glyph image cache. */
+ /* */
+ /* <Input> */
+ /* cache :: A handle to the source glyph image cache. */
+ /* */
+ /* type :: A pointer to a glyph image type descriptor. */
+ /* */
+ /* gindex :: The glyph index to retrieve. */
+ /* */
+ /* <Output> */
+ /* aglyph :: The corresponding @FT_Glyph object. 0~in case of */
+ /* failure. */
+ /* */
+ /* anode :: Used to return the address of of the corresponding cache */
+ /* node after incrementing its reference count (see note */
+ /* below). */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* The returned glyph is owned and managed by the glyph image cache. */
+ /* Never try to transform or discard it manually! You can however */
+ /* create a copy with @FT_Glyph_Copy and modify the new one. */
+ /* */
+ /* If `anode' is _not_ NULL, it receives the address of the cache */
+ /* node containing the glyph image, after increasing its reference */
+ /* count. This ensures that the node (as well as the @FT_Glyph) will */
+ /* always be kept in the cache until you call @FTC_Node_Unref to */
+ /* `release' it. */
+ /* */
+ /* If `anode' is NULL, the cache node is left unchanged, which means */
+ /* that the @FT_Glyph could be flushed out of the cache on the next */
+ /* call to one of the caching sub-system APIs. Don't assume that it */
+ /* is persistent! */
+ /* */
+ FT_EXPORT( FT_Error )
+ FTC_ImageCache_Lookup( FTC_ImageCache cache,
+ FTC_ImageType type,
+ FT_UInt gindex,
+ FT_Glyph *aglyph,
+ FTC_Node *anode );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FTC_ImageCache_LookupScaler */
+ /* */
+ /* <Description> */
+ /* A variant of @FTC_ImageCache_Lookup that uses an @FTC_ScalerRec */
+ /* to specify the face ID and its size. */
+ /* */
+ /* <Input> */
+ /* cache :: A handle to the source glyph image cache. */
+ /* */
+ /* scaler :: A pointer to a scaler descriptor. */
+ /* */
+ /* load_flags :: The corresponding load flags. */
+ /* */
+ /* gindex :: The glyph index to retrieve. */
+ /* */
+ /* <Output> */
+ /* aglyph :: The corresponding @FT_Glyph object. 0~in case of */
+ /* failure. */
+ /* */
+ /* anode :: Used to return the address of of the corresponding */
+ /* cache node after incrementing its reference count */
+ /* (see note below). */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* The returned glyph is owned and managed by the glyph image cache. */
+ /* Never try to transform or discard it manually! You can however */
+ /* create a copy with @FT_Glyph_Copy and modify the new one. */
+ /* */
+ /* If `anode' is _not_ NULL, it receives the address of the cache */
+ /* node containing the glyph image, after increasing its reference */
+ /* count. This ensures that the node (as well as the @FT_Glyph) will */
+ /* always be kept in the cache until you call @FTC_Node_Unref to */
+ /* `release' it. */
+ /* */
+ /* If `anode' is NULL, the cache node is left unchanged, which means */
+ /* that the @FT_Glyph could be flushed out of the cache on the next */
+ /* call to one of the caching sub-system APIs. Don't assume that it */
+ /* is persistent! */
+ /* */
+ /* Calls to @FT_Set_Char_Size and friends have no effect on cached */
+ /* glyphs; you should always use the FreeType cache API instead. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FTC_ImageCache_LookupScaler( FTC_ImageCache cache,
+ FTC_Scaler scaler,
+ FT_ULong load_flags,
+ FT_UInt gindex,
+ FT_Glyph *aglyph,
+ FTC_Node *anode );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FTC_SBit */
+ /* */
+ /* <Description> */
+ /* A handle to a small bitmap descriptor. See the @FTC_SBitRec */
+ /* structure for details. */
+ /* */
+ typedef struct FTC_SBitRec_* FTC_SBit;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FTC_SBitRec */
+ /* */
+ /* <Description> */
+ /* A very compact structure used to describe a small glyph bitmap. */
+ /* */
+ /* <Fields> */
+ /* width :: The bitmap width in pixels. */
+ /* */
+ /* height :: The bitmap height in pixels. */
+ /* */
+ /* left :: The horizontal distance from the pen position to the */
+ /* left bitmap border (a.k.a. `left side bearing', or */
+ /* `lsb'). */
+ /* */
+ /* top :: The vertical distance from the pen position (on the */
+ /* baseline) to the upper bitmap border (a.k.a. `top */
+ /* side bearing'). The distance is positive for upwards */
+ /* y~coordinates. */
+ /* */
+ /* format :: The format of the glyph bitmap (monochrome or gray). */
+ /* */
+ /* max_grays :: Maximum gray level value (in the range 1 to~255). */
+ /* */
+ /* pitch :: The number of bytes per bitmap line. May be positive */
+ /* or negative. */
+ /* */
+ /* xadvance :: The horizontal advance width in pixels. */
+ /* */
+ /* yadvance :: The vertical advance height in pixels. */
+ /* */
+ /* buffer :: A pointer to the bitmap pixels. */
+ /* */
+ typedef struct FTC_SBitRec_
+ {
+ FT_Byte width;
+ FT_Byte height;
+ FT_Char left;
+ FT_Char top;
+
+ FT_Byte format;
+ FT_Byte max_grays;
+ FT_Short pitch;
+ FT_Char xadvance;
+ FT_Char yadvance;
+
+ FT_Byte* buffer;
+
+ } FTC_SBitRec;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FTC_SBitCache */
+ /* */
+ /* <Description> */
+ /* A handle to a small bitmap cache. These are special cache objects */
+ /* used to store small glyph bitmaps (and anti-aliased pixmaps) in a */
+ /* much more efficient way than the traditional glyph image cache */
+ /* implemented by @FTC_ImageCache. */
+ /* */
+ typedef struct FTC_SBitCacheRec_* FTC_SBitCache;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FTC_SBitCache_New */
+ /* */
+ /* <Description> */
+ /* Create a new cache to store small glyph bitmaps. */
+ /* */
+ /* <Input> */
+ /* manager :: A handle to the source cache manager. */
+ /* */
+ /* <Output> */
+ /* acache :: A handle to the new sbit cache. NULL in case of error. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FTC_SBitCache_New( FTC_Manager manager,
+ FTC_SBitCache *acache );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FTC_SBitCache_Lookup */
+ /* */
+ /* <Description> */
+ /* Look up a given small glyph bitmap in a given sbit cache and */
+ /* `lock' it to prevent its flushing from the cache until needed. */
+ /* */
+ /* <Input> */
+ /* cache :: A handle to the source sbit cache. */
+ /* */
+ /* type :: A pointer to the glyph image type descriptor. */
+ /* */
+ /* gindex :: The glyph index. */
+ /* */
+ /* <Output> */
+ /* sbit :: A handle to a small bitmap descriptor. */
+ /* */
+ /* anode :: Used to return the address of of the corresponding cache */
+ /* node after incrementing its reference count (see note */
+ /* below). */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* The small bitmap descriptor and its bit buffer are owned by the */
+ /* cache and should never be freed by the application. They might */
+ /* as well disappear from memory on the next cache lookup, so don't */
+ /* treat them as persistent data. */
+ /* */
+ /* The descriptor's `buffer' field is set to~0 to indicate a missing */
+ /* glyph bitmap. */
+ /* */
+ /* If `anode' is _not_ NULL, it receives the address of the cache */
+ /* node containing the bitmap, after increasing its reference count. */
+ /* This ensures that the node (as well as the image) will always be */
+ /* kept in the cache until you call @FTC_Node_Unref to `release' it. */
+ /* */
+ /* If `anode' is NULL, the cache node is left unchanged, which means */
+ /* that the bitmap could be flushed out of the cache on the next */
+ /* call to one of the caching sub-system APIs. Don't assume that it */
+ /* is persistent! */
+ /* */
+ FT_EXPORT( FT_Error )
+ FTC_SBitCache_Lookup( FTC_SBitCache cache,
+ FTC_ImageType type,
+ FT_UInt gindex,
+ FTC_SBit *sbit,
+ FTC_Node *anode );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FTC_SBitCache_LookupScaler */
+ /* */
+ /* <Description> */
+ /* A variant of @FTC_SBitCache_Lookup that uses an @FTC_ScalerRec */
+ /* to specify the face ID and its size. */
+ /* */
+ /* <Input> */
+ /* cache :: A handle to the source sbit cache. */
+ /* */
+ /* scaler :: A pointer to the scaler descriptor. */
+ /* */
+ /* load_flags :: The corresponding load flags. */
+ /* */
+ /* gindex :: The glyph index. */
+ /* */
+ /* <Output> */
+ /* sbit :: A handle to a small bitmap descriptor. */
+ /* */
+ /* anode :: Used to return the address of of the corresponding */
+ /* cache node after incrementing its reference count */
+ /* (see note below). */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* The small bitmap descriptor and its bit buffer are owned by the */
+ /* cache and should never be freed by the application. They might */
+ /* as well disappear from memory on the next cache lookup, so don't */
+ /* treat them as persistent data. */
+ /* */
+ /* The descriptor's `buffer' field is set to~0 to indicate a missing */
+ /* glyph bitmap. */
+ /* */
+ /* If `anode' is _not_ NULL, it receives the address of the cache */
+ /* node containing the bitmap, after increasing its reference count. */
+ /* This ensures that the node (as well as the image) will always be */
+ /* kept in the cache until you call @FTC_Node_Unref to `release' it. */
+ /* */
+ /* If `anode' is NULL, the cache node is left unchanged, which means */
+ /* that the bitmap could be flushed out of the cache on the next */
+ /* call to one of the caching sub-system APIs. Don't assume that it */
+ /* is persistent! */
+ /* */
+ FT_EXPORT( FT_Error )
+ FTC_SBitCache_LookupScaler( FTC_SBitCache cache,
+ FTC_Scaler scaler,
+ FT_ULong load_flags,
+ FT_UInt gindex,
+ FTC_SBit *sbit,
+ FTC_Node *anode );
+
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __FTCACHE_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftcffdrv.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftcffdrv.h
new file mode 100644
index 0000000000..3a377950d9
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftcffdrv.h
@@ -0,0 +1,151 @@
+/***************************************************************************/
+/* */
+/* ftcffdrv.h */
+/* */
+/* FreeType API for controlling the CFF driver (specification only). */
+/* */
+/* Copyright 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTCFFDRV_H__
+#define __FTCFFDRV_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /**************************************************************************
+ *
+ * @section:
+ * cff_driver
+ *
+ * @title:
+ * The CFF driver
+ *
+ * @abstract:
+ * Controlling the CFF driver module.
+ *
+ * @description:
+ * While FreeType's CFF driver doesn't expose API functions by itself,
+ * it is possible to control its behaviour with @FT_Property_Set and
+ * @FT_Property_Get. The following lists the available properties
+ * together with the necessary macros and structures.
+ *
+ * The CFF driver's module name is `cff'.
+ *
+ */
+
+
+ /**************************************************************************
+ *
+ * @property:
+ * hinting-engine
+ *
+ * @description:
+ * Thanks to Adobe, which contributed a new hinting (and parsing)
+ * engine, an application can select between `freetype' and `adobe' if
+ * compiled with CFF_CONFIG_OPTION_OLD_ENGINE. If this configuration
+ * macro isn't defined, `hinting-engine' does nothing.
+ *
+ * The default engine is `freetype' if CFF_CONFIG_OPTION_OLD_ENGINE is
+ * defined, and `adobe' otherwise.
+ *
+ * The following example code demonstrates how to select Adobe's hinting
+ * engine (omitting the error handling).
+ *
+ * {
+ * FT_Library library;
+ * FT_Face face;
+ * FT_UInt hinting_engine = FT_CFF_HINTING_ADOBE;
+ *
+ *
+ * FT_Init_FreeType( &library );
+ *
+ * FT_Property_Set( library, "cff",
+ * "hinting-engine", &hinting_engine );
+ * }
+ *
+ * @note:
+ * This property can be used with @FT_Property_Get also.
+ *
+ */
+
+
+ /**************************************************************************
+ *
+ * @enum:
+ * FT_CFF_HINTING_XXX
+ *
+ * @description:
+ * A list of constants used for the @hinting-engine property to select
+ * the hinting engine for CFF fonts.
+ *
+ * @values:
+ * FT_CFF_HINTING_FREETYPE ::
+ * Use the old FreeType hinting engine.
+ *
+ * FT_CFF_HINTING_ADOBE ::
+ * Use the hinting engine contributed by Adobe.
+ *
+ */
+#define FT_CFF_HINTING_FREETYPE 0
+#define FT_CFF_HINTING_ADOBE 1
+
+
+ /**************************************************************************
+ *
+ * @property:
+ * no-stem-darkening
+ *
+ * @description:
+ * By default, the Adobe CFF engine darkens stems at smaller sizes,
+ * regardless of hinting, to enhance contrast. Setting this property,
+ * stem darkening gets switched off.
+ *
+ * Note that stem darkening is never applied if @FT_LOAD_NO_SCALE is set.
+ *
+ * {
+ * FT_Library library;
+ * FT_Face face;
+ * FT_Bool no_stem_darkening = TRUE;
+ *
+ *
+ * FT_Init_FreeType( &library );
+ *
+ * FT_Property_Set( library, "cff",
+ * "no-stem-darkening", &no_stem_darkening );
+ * }
+ *
+ * @note:
+ * This property can be used with @FT_Property_Get also.
+ *
+ */
+
+
+ /* */
+
+FT_END_HEADER
+
+
+#endif /* __FTCFFDRV_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftchapters.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftchapters.h
new file mode 100644
index 0000000000..c55670d1d2
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftchapters.h
@@ -0,0 +1,120 @@
+/***************************************************************************/
+/* */
+/* This file defines the structure of the FreeType reference. */
+/* It is used by the python script which generates the HTML files. */
+/* */
+/***************************************************************************/
+
+
+/***************************************************************************/
+/* */
+/* <Chapter> */
+/* general_remarks */
+/* */
+/* <Title> */
+/* General Remarks */
+/* */
+/* <Sections> */
+/* user_allocation */
+/* */
+/***************************************************************************/
+
+
+/***************************************************************************/
+/* */
+/* <Chapter> */
+/* core_api */
+/* */
+/* <Title> */
+/* Core API */
+/* */
+/* <Sections> */
+/* version */
+/* basic_types */
+/* base_interface */
+/* glyph_variants */
+/* glyph_management */
+/* mac_specific */
+/* sizes_management */
+/* header_file_macros */
+/* */
+/***************************************************************************/
+
+
+/***************************************************************************/
+/* */
+/* <Chapter> */
+/* format_specific */
+/* */
+/* <Title> */
+/* Format-Specific API */
+/* */
+/* <Sections> */
+/* multiple_masters */
+/* truetype_tables */
+/* type1_tables */
+/* sfnt_names */
+/* bdf_fonts */
+/* cid_fonts */
+/* pfr_fonts */
+/* winfnt_fonts */
+/* font_formats */
+/* gasp_table */
+/* */
+/***************************************************************************/
+
+
+/***************************************************************************/
+/* */
+/* <Chapter> */
+/* module_specific */
+/* */
+/* <Title> */
+/* Controlling FreeType Modules */
+/* */
+/* <Sections> */
+/* auto_hinter */
+/* cff_driver */
+/* tt_driver */
+/* */
+/***************************************************************************/
+
+
+/***************************************************************************/
+/* */
+/* <Chapter> */
+/* cache_subsystem */
+/* */
+/* <Title> */
+/* Cache Sub-System */
+/* */
+/* <Sections> */
+/* cache_subsystem */
+/* */
+/***************************************************************************/
+
+
+/***************************************************************************/
+/* */
+/* <Chapter> */
+/* support_api */
+/* */
+/* <Title> */
+/* Support API */
+/* */
+/* <Sections> */
+/* computations */
+/* list_processing */
+/* outline_processing */
+/* quick_advance */
+/* bitmap_handling */
+/* raster */
+/* glyph_stroker */
+/* system_interface */
+/* module_management */
+/* gzip */
+/* lzw */
+/* bzip2 */
+/* lcd_filtering */
+/* */
+/***************************************************************************/
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftcid.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftcid.h
new file mode 100644
index 0000000000..f59597574b
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftcid.h
@@ -0,0 +1,166 @@
+/***************************************************************************/
+/* */
+/* ftcid.h */
+/* */
+/* FreeType API for accessing CID font information (specification). */
+/* */
+/* Copyright 2007, 2009 by Dereg Clegg, Michael Toftdal. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTCID_H__
+#define __FTCID_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* cid_fonts */
+ /* */
+ /* <Title> */
+ /* CID Fonts */
+ /* */
+ /* <Abstract> */
+ /* CID-keyed font specific API. */
+ /* */
+ /* <Description> */
+ /* This section contains the declaration of CID-keyed font specific */
+ /* functions. */
+ /* */
+ /*************************************************************************/
+
+
+ /**********************************************************************
+ *
+ * @function:
+ * FT_Get_CID_Registry_Ordering_Supplement
+ *
+ * @description:
+ * Retrieve the Registry/Ordering/Supplement triple (also known as the
+ * "R/O/S") from a CID-keyed font.
+ *
+ * @input:
+ * face ::
+ * A handle to the input face.
+ *
+ * @output:
+ * registry ::
+ * The registry, as a C~string, owned by the face.
+ *
+ * ordering ::
+ * The ordering, as a C~string, owned by the face.
+ *
+ * supplement ::
+ * The supplement.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * This function only works with CID faces, returning an error
+ * otherwise.
+ *
+ * @since:
+ * 2.3.6
+ */
+ FT_EXPORT( FT_Error )
+ FT_Get_CID_Registry_Ordering_Supplement( FT_Face face,
+ const char* *registry,
+ const char* *ordering,
+ FT_Int *supplement);
+
+
+ /**********************************************************************
+ *
+ * @function:
+ * FT_Get_CID_Is_Internally_CID_Keyed
+ *
+ * @description:
+ * Retrieve the type of the input face, CID keyed or not. In
+ * constrast to the @FT_IS_CID_KEYED macro this function returns
+ * successfully also for CID-keyed fonts in an SNFT wrapper.
+ *
+ * @input:
+ * face ::
+ * A handle to the input face.
+ *
+ * @output:
+ * is_cid ::
+ * The type of the face as an @FT_Bool.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * This function only works with CID faces and OpenType fonts,
+ * returning an error otherwise.
+ *
+ * @since:
+ * 2.3.9
+ */
+ FT_EXPORT( FT_Error )
+ FT_Get_CID_Is_Internally_CID_Keyed( FT_Face face,
+ FT_Bool *is_cid );
+
+
+ /**********************************************************************
+ *
+ * @function:
+ * FT_Get_CID_From_Glyph_Index
+ *
+ * @description:
+ * Retrieve the CID of the input glyph index.
+ *
+ * @input:
+ * face ::
+ * A handle to the input face.
+ *
+ * glyph_index ::
+ * The input glyph index.
+ *
+ * @output:
+ * cid ::
+ * The CID as an @FT_UInt.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * This function only works with CID faces and OpenType fonts,
+ * returning an error otherwise.
+ *
+ * @since:
+ * 2.3.9
+ */
+ FT_EXPORT( FT_Error )
+ FT_Get_CID_From_Glyph_Index( FT_Face face,
+ FT_UInt glyph_index,
+ FT_UInt *cid );
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __FTCID_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/fterrdef.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/fterrdef.h
new file mode 100644
index 0000000000..76c7b9e36f
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/fterrdef.h
@@ -0,0 +1,249 @@
+/***************************************************************************/
+/* */
+/* fterrdef.h */
+/* */
+/* FreeType error codes (specification). */
+/* */
+/* Copyright 2002, 2004, 2006, 2007, 2010-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*******************************************************************/
+ /*******************************************************************/
+ /***** *****/
+ /***** LIST OF ERROR CODES/MESSAGES *****/
+ /***** *****/
+ /*******************************************************************/
+ /*******************************************************************/
+
+
+ /* You need to define both FT_ERRORDEF_ and FT_NOERRORDEF_ before */
+ /* including this file. */
+
+
+ /* generic errors */
+
+ FT_NOERRORDEF_( Ok, 0x00, \
+ "no error" )
+
+ FT_ERRORDEF_( Cannot_Open_Resource, 0x01, \
+ "cannot open resource" )
+ FT_ERRORDEF_( Unknown_File_Format, 0x02, \
+ "unknown file format" )
+ FT_ERRORDEF_( Invalid_File_Format, 0x03, \
+ "broken file" )
+ FT_ERRORDEF_( Invalid_Version, 0x04, \
+ "invalid FreeType version" )
+ FT_ERRORDEF_( Lower_Module_Version, 0x05, \
+ "module version is too low" )
+ FT_ERRORDEF_( Invalid_Argument, 0x06, \
+ "invalid argument" )
+ FT_ERRORDEF_( Unimplemented_Feature, 0x07, \
+ "unimplemented feature" )
+ FT_ERRORDEF_( Invalid_Table, 0x08, \
+ "broken table" )
+ FT_ERRORDEF_( Invalid_Offset, 0x09, \
+ "broken offset within table" )
+ FT_ERRORDEF_( Array_Too_Large, 0x0A, \
+ "array allocation size too large" )
+ FT_ERRORDEF_( Missing_Module, 0x0B, \
+ "missing module" )
+ FT_ERRORDEF_( Missing_Property, 0x0C, \
+ "missing property" )
+
+ /* glyph/character errors */
+
+ FT_ERRORDEF_( Invalid_Glyph_Index, 0x10, \
+ "invalid glyph index" )
+ FT_ERRORDEF_( Invalid_Character_Code, 0x11, \
+ "invalid character code" )
+ FT_ERRORDEF_( Invalid_Glyph_Format, 0x12, \
+ "unsupported glyph image format" )
+ FT_ERRORDEF_( Cannot_Render_Glyph, 0x13, \
+ "cannot render this glyph format" )
+ FT_ERRORDEF_( Invalid_Outline, 0x14, \
+ "invalid outline" )
+ FT_ERRORDEF_( Invalid_Composite, 0x15, \
+ "invalid composite glyph" )
+ FT_ERRORDEF_( Too_Many_Hints, 0x16, \
+ "too many hints" )
+ FT_ERRORDEF_( Invalid_Pixel_Size, 0x17, \
+ "invalid pixel size" )
+
+ /* handle errors */
+
+ FT_ERRORDEF_( Invalid_Handle, 0x20, \
+ "invalid object handle" )
+ FT_ERRORDEF_( Invalid_Library_Handle, 0x21, \
+ "invalid library handle" )
+ FT_ERRORDEF_( Invalid_Driver_Handle, 0x22, \
+ "invalid module handle" )
+ FT_ERRORDEF_( Invalid_Face_Handle, 0x23, \
+ "invalid face handle" )
+ FT_ERRORDEF_( Invalid_Size_Handle, 0x24, \
+ "invalid size handle" )
+ FT_ERRORDEF_( Invalid_Slot_Handle, 0x25, \
+ "invalid glyph slot handle" )
+ FT_ERRORDEF_( Invalid_CharMap_Handle, 0x26, \
+ "invalid charmap handle" )
+ FT_ERRORDEF_( Invalid_Cache_Handle, 0x27, \
+ "invalid cache manager handle" )
+ FT_ERRORDEF_( Invalid_Stream_Handle, 0x28, \
+ "invalid stream handle" )
+
+ /* driver errors */
+
+ FT_ERRORDEF_( Too_Many_Drivers, 0x30, \
+ "too many modules" )
+ FT_ERRORDEF_( Too_Many_Extensions, 0x31, \
+ "too many extensions" )
+
+ /* memory errors */
+
+ FT_ERRORDEF_( Out_Of_Memory, 0x40, \
+ "out of memory" )
+ FT_ERRORDEF_( Unlisted_Object, 0x41, \
+ "unlisted object" )
+
+ /* stream errors */
+
+ FT_ERRORDEF_( Cannot_Open_Stream, 0x51, \
+ "cannot open stream" )
+ FT_ERRORDEF_( Invalid_Stream_Seek, 0x52, \
+ "invalid stream seek" )
+ FT_ERRORDEF_( Invalid_Stream_Skip, 0x53, \
+ "invalid stream skip" )
+ FT_ERRORDEF_( Invalid_Stream_Read, 0x54, \
+ "invalid stream read" )
+ FT_ERRORDEF_( Invalid_Stream_Operation, 0x55, \
+ "invalid stream operation" )
+ FT_ERRORDEF_( Invalid_Frame_Operation, 0x56, \
+ "invalid frame operation" )
+ FT_ERRORDEF_( Nested_Frame_Access, 0x57, \
+ "nested frame access" )
+ FT_ERRORDEF_( Invalid_Frame_Read, 0x58, \
+ "invalid frame read" )
+
+ /* raster errors */
+
+ FT_ERRORDEF_( Raster_Uninitialized, 0x60, \
+ "raster uninitialized" )
+ FT_ERRORDEF_( Raster_Corrupted, 0x61, \
+ "raster corrupted" )
+ FT_ERRORDEF_( Raster_Overflow, 0x62, \
+ "raster overflow" )
+ FT_ERRORDEF_( Raster_Negative_Height, 0x63, \
+ "negative height while rastering" )
+
+ /* cache errors */
+
+ FT_ERRORDEF_( Too_Many_Caches, 0x70, \
+ "too many registered caches" )
+
+ /* TrueType and SFNT errors */
+
+ FT_ERRORDEF_( Invalid_Opcode, 0x80, \
+ "invalid opcode" )
+ FT_ERRORDEF_( Too_Few_Arguments, 0x81, \
+ "too few arguments" )
+ FT_ERRORDEF_( Stack_Overflow, 0x82, \
+ "stack overflow" )
+ FT_ERRORDEF_( Code_Overflow, 0x83, \
+ "code overflow" )
+ FT_ERRORDEF_( Bad_Argument, 0x84, \
+ "bad argument" )
+ FT_ERRORDEF_( Divide_By_Zero, 0x85, \
+ "division by zero" )
+ FT_ERRORDEF_( Invalid_Reference, 0x86, \
+ "invalid reference" )
+ FT_ERRORDEF_( Debug_OpCode, 0x87, \
+ "found debug opcode" )
+ FT_ERRORDEF_( ENDF_In_Exec_Stream, 0x88, \
+ "found ENDF opcode in execution stream" )
+ FT_ERRORDEF_( Nested_DEFS, 0x89, \
+ "nested DEFS" )
+ FT_ERRORDEF_( Invalid_CodeRange, 0x8A, \
+ "invalid code range" )
+ FT_ERRORDEF_( Execution_Too_Long, 0x8B, \
+ "execution context too long" )
+ FT_ERRORDEF_( Too_Many_Function_Defs, 0x8C, \
+ "too many function definitions" )
+ FT_ERRORDEF_( Too_Many_Instruction_Defs, 0x8D, \
+ "too many instruction definitions" )
+ FT_ERRORDEF_( Table_Missing, 0x8E, \
+ "SFNT font table missing" )
+ FT_ERRORDEF_( Horiz_Header_Missing, 0x8F, \
+ "horizontal header (hhea) table missing" )
+ FT_ERRORDEF_( Locations_Missing, 0x90, \
+ "locations (loca) table missing" )
+ FT_ERRORDEF_( Name_Table_Missing, 0x91, \
+ "name table missing" )
+ FT_ERRORDEF_( CMap_Table_Missing, 0x92, \
+ "character map (cmap) table missing" )
+ FT_ERRORDEF_( Hmtx_Table_Missing, 0x93, \
+ "horizontal metrics (hmtx) table missing" )
+ FT_ERRORDEF_( Post_Table_Missing, 0x94, \
+ "PostScript (post) table missing" )
+ FT_ERRORDEF_( Invalid_Horiz_Metrics, 0x95, \
+ "invalid horizontal metrics" )
+ FT_ERRORDEF_( Invalid_CharMap_Format, 0x96, \
+ "invalid character map (cmap) format" )
+ FT_ERRORDEF_( Invalid_PPem, 0x97, \
+ "invalid ppem value" )
+ FT_ERRORDEF_( Invalid_Vert_Metrics, 0x98, \
+ "invalid vertical metrics" )
+ FT_ERRORDEF_( Could_Not_Find_Context, 0x99, \
+ "could not find context" )
+ FT_ERRORDEF_( Invalid_Post_Table_Format, 0x9A, \
+ "invalid PostScript (post) table format" )
+ FT_ERRORDEF_( Invalid_Post_Table, 0x9B, \
+ "invalid PostScript (post) table" )
+
+ /* CFF, CID, and Type 1 errors */
+
+ FT_ERRORDEF_( Syntax_Error, 0xA0, \
+ "opcode syntax error" )
+ FT_ERRORDEF_( Stack_Underflow, 0xA1, \
+ "argument stack underflow" )
+ FT_ERRORDEF_( Ignore, 0xA2, \
+ "ignore" )
+ FT_ERRORDEF_( No_Unicode_Glyph_Name, 0xA3, \
+ "no Unicode glyph name found" )
+ FT_ERRORDEF_( Glyph_Too_Big, 0xA4, \
+ "glyph to big for hinting" )
+
+ /* BDF errors */
+
+ FT_ERRORDEF_( Missing_Startfont_Field, 0xB0, \
+ "`STARTFONT' field missing" )
+ FT_ERRORDEF_( Missing_Font_Field, 0xB1, \
+ "`FONT' field missing" )
+ FT_ERRORDEF_( Missing_Size_Field, 0xB2, \
+ "`SIZE' field missing" )
+ FT_ERRORDEF_( Missing_Fontboundingbox_Field, 0xB3, \
+ "`FONTBOUNDINGBOX' field missing" )
+ FT_ERRORDEF_( Missing_Chars_Field, 0xB4, \
+ "`CHARS' field missing" )
+ FT_ERRORDEF_( Missing_Startchar_Field, 0xB5, \
+ "`STARTCHAR' field missing" )
+ FT_ERRORDEF_( Missing_Encoding_Field, 0xB6, \
+ "`ENCODING' field missing" )
+ FT_ERRORDEF_( Missing_Bbx_Field, 0xB7, \
+ "`BBX' field missing" )
+ FT_ERRORDEF_( Bbx_Too_Big, 0xB8, \
+ "`BBX' too big" )
+ FT_ERRORDEF_( Corrupted_Font_Header, 0xB9, \
+ "Font header corrupted or missing fields" )
+ FT_ERRORDEF_( Corrupted_Font_Glyphs, 0xBA, \
+ "Font glyphs corrupted or missing fields" )
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/fterrors.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/fterrors.h
new file mode 100644
index 0000000000..bd69d0f5e1
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/fterrors.h
@@ -0,0 +1,198 @@
+/***************************************************************************/
+/* */
+/* fterrors.h */
+/* */
+/* FreeType error code handling (specification). */
+/* */
+/* Copyright 1996-2002, 2004, 2007, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* This special header file is used to define the handling of FT2 */
+ /* enumeration constants. It can also be used to generate error message */
+ /* strings with a small macro trick explained below. */
+ /* */
+ /* I - Error Formats */
+ /* ----------------- */
+ /* */
+ /* The configuration macro FT_CONFIG_OPTION_USE_MODULE_ERRORS can be */
+ /* defined in ftoption.h in order to make the higher byte indicate */
+ /* the module where the error has happened (this is not compatible */
+ /* with standard builds of FreeType 2). See the file `ftmoderr.h' for */
+ /* more details. */
+ /* */
+ /* */
+ /* II - Error Message strings */
+ /* -------------------------- */
+ /* */
+ /* The error definitions below are made through special macros that */
+ /* allow client applications to build a table of error message strings */
+ /* if they need it. The strings are not included in a normal build of */
+ /* FreeType 2 to save space (most client applications do not use */
+ /* them). */
+ /* */
+ /* To do so, you have to define the following macros before including */
+ /* this file: */
+ /* */
+ /* FT_ERROR_START_LIST :: */
+ /* This macro is called before anything else to define the start of */
+ /* the error list. It is followed by several FT_ERROR_DEF calls */
+ /* (see below). */
+ /* */
+ /* FT_ERROR_DEF( e, v, s ) :: */
+ /* This macro is called to define one single error. */
+ /* `e' is the error code identifier (e.g. FT_Err_Invalid_Argument). */
+ /* `v' is the error numerical value. */
+ /* `s' is the corresponding error string. */
+ /* */
+ /* FT_ERROR_END_LIST :: */
+ /* This macro ends the list. */
+ /* */
+ /* Additionally, you have to undefine __FTERRORS_H__ before #including */
+ /* this file. */
+ /* */
+ /* Here is a simple example: */
+ /* */
+ /* { */
+ /* #undef __FTERRORS_H__ */
+ /* #define FT_ERRORDEF( e, v, s ) { e, s }, */
+ /* #define FT_ERROR_START_LIST { */
+ /* #define FT_ERROR_END_LIST { 0, 0 } }; */
+ /* */
+ /* const struct */
+ /* { */
+ /* int err_code; */
+ /* const char* err_msg; */
+ /* } ft_errors[] = */
+ /* */
+ /* #include "fterrors.h" */
+ /* } */
+ /* */
+ /*************************************************************************/
+
+
+#ifndef __FTERRORS_H__
+#define __FTERRORS_H__
+
+
+ /* include module base error codes */
+#include "ftmoderr.h"
+
+
+ /*******************************************************************/
+ /*******************************************************************/
+ /***** *****/
+ /***** SETUP MACROS *****/
+ /***** *****/
+ /*******************************************************************/
+ /*******************************************************************/
+
+
+#undef FT_NEED_EXTERN_C
+
+
+ /* FT_ERR_PREFIX is used as a prefix for error identifiers. */
+ /* By default, we use `FT_Err_'. */
+ /* */
+#ifndef FT_ERR_PREFIX
+#define FT_ERR_PREFIX FT_Err_
+#endif
+
+
+ /* FT_ERR_BASE is used as the base for module-specific errors. */
+ /* */
+#ifdef FT_CONFIG_OPTION_USE_MODULE_ERRORS
+
+#ifndef FT_ERR_BASE
+#define FT_ERR_BASE FT_Mod_Err_Base
+#endif
+
+#else
+
+#undef FT_ERR_BASE
+#define FT_ERR_BASE 0
+
+#endif /* FT_CONFIG_OPTION_USE_MODULE_ERRORS */
+
+
+ /* If FT_ERRORDEF is not defined, we need to define a simple */
+ /* enumeration type. */
+ /* */
+#ifndef FT_ERRORDEF
+
+#define FT_ERRORDEF( e, v, s ) e = v,
+#define FT_ERROR_START_LIST enum {
+#define FT_ERROR_END_LIST FT_ERR_CAT( FT_ERR_PREFIX, Max ) };
+
+#ifdef __cplusplus
+#define FT_NEED_EXTERN_C
+ extern "C" {
+#endif
+
+#endif /* !FT_ERRORDEF */
+
+
+ /* this macro is used to define an error */
+#define FT_ERRORDEF_( e, v, s ) \
+ FT_ERRORDEF( FT_ERR_CAT( FT_ERR_PREFIX, e ), v + FT_ERR_BASE, s )
+
+ /* this is only used for <module>_Err_Ok, which must be 0! */
+#define FT_NOERRORDEF_( e, v, s ) \
+ FT_ERRORDEF( FT_ERR_CAT( FT_ERR_PREFIX, e ), v, s )
+
+
+#ifdef FT_ERROR_START_LIST
+ FT_ERROR_START_LIST
+#endif
+
+
+ /* now include the error codes */
+#include "fterrdef.h"
+
+
+#ifdef FT_ERROR_END_LIST
+ FT_ERROR_END_LIST
+#endif
+
+
+ /*******************************************************************/
+ /*******************************************************************/
+ /***** *****/
+ /***** SIMPLE CLEANUP *****/
+ /***** *****/
+ /*******************************************************************/
+ /*******************************************************************/
+
+#ifdef FT_NEED_EXTERN_C
+ }
+#endif
+
+#undef FT_ERROR_START_LIST
+#undef FT_ERROR_END_LIST
+
+#undef FT_ERRORDEF
+#undef FT_ERRORDEF_
+#undef FT_NOERRORDEF_
+
+#undef FT_NEED_EXTERN_C
+#undef FT_ERR_BASE
+
+ /* FT_ERR_PREFIX is needed internally */
+#ifndef FT2_BUILD_LIBRARY
+#undef FT_ERR_PREFIX
+#endif
+
+#endif /* __FTERRORS_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftgasp.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftgasp.h
new file mode 100644
index 0000000000..ff0a34acc6
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftgasp.h
@@ -0,0 +1,128 @@
+/***************************************************************************/
+/* */
+/* ftgasp.h */
+/* */
+/* Access of TrueType's `gasp' table (specification). */
+/* */
+/* Copyright 2007, 2008, 2011 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef _FT_GASP_H_
+#define _FT_GASP_H_
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+ /***************************************************************************
+ *
+ * @section:
+ * gasp_table
+ *
+ * @title:
+ * Gasp Table
+ *
+ * @abstract:
+ * Retrieving TrueType `gasp' table entries.
+ *
+ * @description:
+ * The function @FT_Get_Gasp can be used to query a TrueType or OpenType
+ * font for specific entries in its `gasp' table, if any. This is
+ * mainly useful when implementing native TrueType hinting with the
+ * bytecode interpreter to duplicate the Windows text rendering results.
+ */
+
+ /*************************************************************************
+ *
+ * @enum:
+ * FT_GASP_XXX
+ *
+ * @description:
+ * A list of values and/or bit-flags returned by the @FT_Get_Gasp
+ * function.
+ *
+ * @values:
+ * FT_GASP_NO_TABLE ::
+ * This special value means that there is no GASP table in this face.
+ * It is up to the client to decide what to do.
+ *
+ * FT_GASP_DO_GRIDFIT ::
+ * Grid-fitting and hinting should be performed at the specified ppem.
+ * This *really* means TrueType bytecode interpretation. If this bit
+ * is not set, no hinting gets applied.
+ *
+ * FT_GASP_DO_GRAY ::
+ * Anti-aliased rendering should be performed at the specified ppem.
+ * If not set, do monochrome rendering.
+ *
+ * FT_GASP_SYMMETRIC_SMOOTHING ::
+ * If set, smoothing along multiple axes must be used with ClearType.
+ *
+ * FT_GASP_SYMMETRIC_GRIDFIT ::
+ * Grid-fitting must be used with ClearType's symmetric smoothing.
+ *
+ * @note:
+ * The bit-flags `FT_GASP_DO_GRIDFIT' and `FT_GASP_DO_GRAY' are to be
+ * used for standard font rasterization only. Independently of that,
+ * `FT_GASP_SYMMETRIC_SMOOTHING' and `FT_GASP_SYMMETRIC_GRIDFIT' are to
+ * be used if ClearType is enabled (and `FT_GASP_DO_GRIDFIT' and
+ * `FT_GASP_DO_GRAY' are consequently ignored).
+ *
+ * `ClearType' is Microsoft's implementation of LCD rendering, partly
+ * protected by patents.
+ *
+ * @since:
+ * 2.3.0
+ */
+#define FT_GASP_NO_TABLE -1
+#define FT_GASP_DO_GRIDFIT 0x01
+#define FT_GASP_DO_GRAY 0x02
+#define FT_GASP_SYMMETRIC_SMOOTHING 0x08
+#define FT_GASP_SYMMETRIC_GRIDFIT 0x10
+
+
+ /*************************************************************************
+ *
+ * @func:
+ * FT_Get_Gasp
+ *
+ * @description:
+ * Read the `gasp' table from a TrueType or OpenType font file and
+ * return the entry corresponding to a given character pixel size.
+ *
+ * @input:
+ * face :: The source face handle.
+ * ppem :: The vertical character pixel size.
+ *
+ * @return:
+ * Bit flags (see @FT_GASP_XXX), or @FT_GASP_NO_TABLE if there is no
+ * `gasp' table in the face.
+ *
+ * @since:
+ * 2.3.0
+ */
+ FT_EXPORT( FT_Int )
+ FT_Get_Gasp( FT_Face face,
+ FT_UInt ppem );
+
+/* */
+
+#endif /* _FT_GASP_H_ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftglyph.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftglyph.h
new file mode 100644
index 0000000000..ec2d9d89c1
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftglyph.h
@@ -0,0 +1,620 @@
+/***************************************************************************/
+/* */
+/* ftglyph.h */
+/* */
+/* FreeType convenience functions to handle glyphs (specification). */
+/* */
+/* Copyright 1996-2003, 2006, 2008, 2009, 2011 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* This file contains the definition of several convenience functions */
+ /* that can be used by client applications to easily retrieve glyph */
+ /* bitmaps and outlines from a given face. */
+ /* */
+ /* These functions should be optional if you are writing a font server */
+ /* or text layout engine on top of FreeType. However, they are pretty */
+ /* handy for many other simple uses of the library. */
+ /* */
+ /*************************************************************************/
+
+
+#ifndef __FTGLYPH_H__
+#define __FTGLYPH_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* glyph_management */
+ /* */
+ /* <Title> */
+ /* Glyph Management */
+ /* */
+ /* <Abstract> */
+ /* Generic interface to manage individual glyph data. */
+ /* */
+ /* <Description> */
+ /* This section contains definitions used to manage glyph data */
+ /* through generic FT_Glyph objects. Each of them can contain a */
+ /* bitmap, a vector outline, or even images in other formats. */
+ /* */
+ /*************************************************************************/
+
+
+ /* forward declaration to a private type */
+ typedef struct FT_Glyph_Class_ FT_Glyph_Class;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Glyph */
+ /* */
+ /* <Description> */
+ /* Handle to an object used to model generic glyph images. It is a */
+ /* pointer to the @FT_GlyphRec structure and can contain a glyph */
+ /* bitmap or pointer. */
+ /* */
+ /* <Note> */
+ /* Glyph objects are not owned by the library. You must thus release */
+ /* them manually (through @FT_Done_Glyph) _before_ calling */
+ /* @FT_Done_FreeType. */
+ /* */
+ typedef struct FT_GlyphRec_* FT_Glyph;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_GlyphRec */
+ /* */
+ /* <Description> */
+ /* The root glyph structure contains a given glyph image plus its */
+ /* advance width in 16.16 fixed-point format. */
+ /* */
+ /* <Fields> */
+ /* library :: A handle to the FreeType library object. */
+ /* */
+ /* clazz :: A pointer to the glyph's class. Private. */
+ /* */
+ /* format :: The format of the glyph's image. */
+ /* */
+ /* advance :: A 16.16 vector that gives the glyph's advance width. */
+ /* */
+ typedef struct FT_GlyphRec_
+ {
+ FT_Library library;
+ const FT_Glyph_Class* clazz;
+ FT_Glyph_Format format;
+ FT_Vector advance;
+
+ } FT_GlyphRec;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_BitmapGlyph */
+ /* */
+ /* <Description> */
+ /* A handle to an object used to model a bitmap glyph image. This is */
+ /* a sub-class of @FT_Glyph, and a pointer to @FT_BitmapGlyphRec. */
+ /* */
+ typedef struct FT_BitmapGlyphRec_* FT_BitmapGlyph;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_BitmapGlyphRec */
+ /* */
+ /* <Description> */
+ /* A structure used for bitmap glyph images. This really is a */
+ /* `sub-class' of @FT_GlyphRec. */
+ /* */
+ /* <Fields> */
+ /* root :: The root @FT_Glyph fields. */
+ /* */
+ /* left :: The left-side bearing, i.e., the horizontal distance */
+ /* from the current pen position to the left border of the */
+ /* glyph bitmap. */
+ /* */
+ /* top :: The top-side bearing, i.e., the vertical distance from */
+ /* the current pen position to the top border of the glyph */
+ /* bitmap. This distance is positive for upwards~y! */
+ /* */
+ /* bitmap :: A descriptor for the bitmap. */
+ /* */
+ /* <Note> */
+ /* You can typecast an @FT_Glyph to @FT_BitmapGlyph if you have */
+ /* `glyph->format == FT_GLYPH_FORMAT_BITMAP'. This lets you access */
+ /* the bitmap's contents easily. */
+ /* */
+ /* The corresponding pixel buffer is always owned by @FT_BitmapGlyph */
+ /* and is thus created and destroyed with it. */
+ /* */
+ typedef struct FT_BitmapGlyphRec_
+ {
+ FT_GlyphRec root;
+ FT_Int left;
+ FT_Int top;
+ FT_Bitmap bitmap;
+
+ } FT_BitmapGlyphRec;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_OutlineGlyph */
+ /* */
+ /* <Description> */
+ /* A handle to an object used to model an outline glyph image. This */
+ /* is a sub-class of @FT_Glyph, and a pointer to @FT_OutlineGlyphRec. */
+ /* */
+ typedef struct FT_OutlineGlyphRec_* FT_OutlineGlyph;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_OutlineGlyphRec */
+ /* */
+ /* <Description> */
+ /* A structure used for outline (vectorial) glyph images. This */
+ /* really is a `sub-class' of @FT_GlyphRec. */
+ /* */
+ /* <Fields> */
+ /* root :: The root @FT_Glyph fields. */
+ /* */
+ /* outline :: A descriptor for the outline. */
+ /* */
+ /* <Note> */
+ /* You can typecast an @FT_Glyph to @FT_OutlineGlyph if you have */
+ /* `glyph->format == FT_GLYPH_FORMAT_OUTLINE'. This lets you access */
+ /* the outline's content easily. */
+ /* */
+ /* As the outline is extracted from a glyph slot, its coordinates are */
+ /* expressed normally in 26.6 pixels, unless the flag */
+ /* @FT_LOAD_NO_SCALE was used in @FT_Load_Glyph() or @FT_Load_Char(). */
+ /* */
+ /* The outline's tables are always owned by the object and are */
+ /* destroyed with it. */
+ /* */
+ typedef struct FT_OutlineGlyphRec_
+ {
+ FT_GlyphRec root;
+ FT_Outline outline;
+
+ } FT_OutlineGlyphRec;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_Glyph */
+ /* */
+ /* <Description> */
+ /* A function used to extract a glyph image from a slot. Note that */
+ /* the created @FT_Glyph object must be released with @FT_Done_Glyph. */
+ /* */
+ /* <Input> */
+ /* slot :: A handle to the source glyph slot. */
+ /* */
+ /* <Output> */
+ /* aglyph :: A handle to the glyph object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Get_Glyph( FT_GlyphSlot slot,
+ FT_Glyph *aglyph );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Glyph_Copy */
+ /* */
+ /* <Description> */
+ /* A function used to copy a glyph image. Note that the created */
+ /* @FT_Glyph object must be released with @FT_Done_Glyph. */
+ /* */
+ /* <Input> */
+ /* source :: A handle to the source glyph object. */
+ /* */
+ /* <Output> */
+ /* target :: A handle to the target glyph object. 0~in case of */
+ /* error. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Glyph_Copy( FT_Glyph source,
+ FT_Glyph *target );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Glyph_Transform */
+ /* */
+ /* <Description> */
+ /* Transform a glyph image if its format is scalable. */
+ /* */
+ /* <InOut> */
+ /* glyph :: A handle to the target glyph object. */
+ /* */
+ /* <Input> */
+ /* matrix :: A pointer to a 2x2 matrix to apply. */
+ /* */
+ /* delta :: A pointer to a 2d vector to apply. Coordinates are */
+ /* expressed in 1/64th of a pixel. */
+ /* */
+ /* <Return> */
+ /* FreeType error code (if not 0, the glyph format is not scalable). */
+ /* */
+ /* <Note> */
+ /* The 2x2 transformation matrix is also applied to the glyph's */
+ /* advance vector. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Glyph_Transform( FT_Glyph glyph,
+ FT_Matrix* matrix,
+ FT_Vector* delta );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Enum> */
+ /* FT_Glyph_BBox_Mode */
+ /* */
+ /* <Description> */
+ /* The mode how the values of @FT_Glyph_Get_CBox are returned. */
+ /* */
+ /* <Values> */
+ /* FT_GLYPH_BBOX_UNSCALED :: */
+ /* Return unscaled font units. */
+ /* */
+ /* FT_GLYPH_BBOX_SUBPIXELS :: */
+ /* Return unfitted 26.6 coordinates. */
+ /* */
+ /* FT_GLYPH_BBOX_GRIDFIT :: */
+ /* Return grid-fitted 26.6 coordinates. */
+ /* */
+ /* FT_GLYPH_BBOX_TRUNCATE :: */
+ /* Return coordinates in integer pixels. */
+ /* */
+ /* FT_GLYPH_BBOX_PIXELS :: */
+ /* Return grid-fitted pixel coordinates. */
+ /* */
+ typedef enum FT_Glyph_BBox_Mode_
+ {
+ FT_GLYPH_BBOX_UNSCALED = 0,
+ FT_GLYPH_BBOX_SUBPIXELS = 0,
+ FT_GLYPH_BBOX_GRIDFIT = 1,
+ FT_GLYPH_BBOX_TRUNCATE = 2,
+ FT_GLYPH_BBOX_PIXELS = 3
+
+ } FT_Glyph_BBox_Mode;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Enum> */
+ /* ft_glyph_bbox_xxx */
+ /* */
+ /* <Description> */
+ /* These constants are deprecated. Use the corresponding */
+ /* @FT_Glyph_BBox_Mode values instead. */
+ /* */
+ /* <Values> */
+ /* ft_glyph_bbox_unscaled :: See @FT_GLYPH_BBOX_UNSCALED. */
+ /* ft_glyph_bbox_subpixels :: See @FT_GLYPH_BBOX_SUBPIXELS. */
+ /* ft_glyph_bbox_gridfit :: See @FT_GLYPH_BBOX_GRIDFIT. */
+ /* ft_glyph_bbox_truncate :: See @FT_GLYPH_BBOX_TRUNCATE. */
+ /* ft_glyph_bbox_pixels :: See @FT_GLYPH_BBOX_PIXELS. */
+ /* */
+#define ft_glyph_bbox_unscaled FT_GLYPH_BBOX_UNSCALED
+#define ft_glyph_bbox_subpixels FT_GLYPH_BBOX_SUBPIXELS
+#define ft_glyph_bbox_gridfit FT_GLYPH_BBOX_GRIDFIT
+#define ft_glyph_bbox_truncate FT_GLYPH_BBOX_TRUNCATE
+#define ft_glyph_bbox_pixels FT_GLYPH_BBOX_PIXELS
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Glyph_Get_CBox */
+ /* */
+ /* <Description> */
+ /* Return a glyph's `control box'. The control box encloses all the */
+ /* outline's points, including Bézier control points. Though it */
+ /* coincides with the exact bounding box for most glyphs, it can be */
+ /* slightly larger in some situations (like when rotating an outline */
+ /* which contains Bézier outside arcs). */
+ /* */
+ /* Computing the control box is very fast, while getting the bounding */
+ /* box can take much more time as it needs to walk over all segments */
+ /* and arcs in the outline. To get the latter, you can use the */
+ /* `ftbbox' component which is dedicated to this single task. */
+ /* */
+ /* <Input> */
+ /* glyph :: A handle to the source glyph object. */
+ /* */
+ /* mode :: The mode which indicates how to interpret the returned */
+ /* bounding box values. */
+ /* */
+ /* <Output> */
+ /* acbox :: The glyph coordinate bounding box. Coordinates are */
+ /* expressed in 1/64th of pixels if it is grid-fitted. */
+ /* */
+ /* <Note> */
+ /* Coordinates are relative to the glyph origin, using the y~upwards */
+ /* convention. */
+ /* */
+ /* If the glyph has been loaded with @FT_LOAD_NO_SCALE, `bbox_mode' */
+ /* must be set to @FT_GLYPH_BBOX_UNSCALED to get unscaled font */
+ /* units in 26.6 pixel format. The value @FT_GLYPH_BBOX_SUBPIXELS */
+ /* is another name for this constant. */
+ /* */
+ /* If the font is tricky and the glyph has been loaded with */
+ /* @FT_LOAD_NO_SCALE, the resulting CBox is meaningless. To get */
+ /* reasonable values for the CBox it is necessary to load the glyph */
+ /* at a large ppem value (so that the hinting instructions can */
+ /* properly shift and scale the subglyphs), then extracting the CBox */
+ /* which can be eventually converted back to font units. */
+ /* */
+ /* Note that the maximum coordinates are exclusive, which means that */
+ /* one can compute the width and height of the glyph image (be it in */
+ /* integer or 26.6 pixels) as: */
+ /* */
+ /* { */
+ /* width = bbox.xMax - bbox.xMin; */
+ /* height = bbox.yMax - bbox.yMin; */
+ /* } */
+ /* */
+ /* Note also that for 26.6 coordinates, if `bbox_mode' is set to */
+ /* @FT_GLYPH_BBOX_GRIDFIT, the coordinates will also be grid-fitted, */
+ /* which corresponds to: */
+ /* */
+ /* { */
+ /* bbox.xMin = FLOOR(bbox.xMin); */
+ /* bbox.yMin = FLOOR(bbox.yMin); */
+ /* bbox.xMax = CEILING(bbox.xMax); */
+ /* bbox.yMax = CEILING(bbox.yMax); */
+ /* } */
+ /* */
+ /* To get the bbox in pixel coordinates, set `bbox_mode' to */
+ /* @FT_GLYPH_BBOX_TRUNCATE. */
+ /* */
+ /* To get the bbox in grid-fitted pixel coordinates, set `bbox_mode' */
+ /* to @FT_GLYPH_BBOX_PIXELS. */
+ /* */
+ FT_EXPORT( void )
+ FT_Glyph_Get_CBox( FT_Glyph glyph,
+ FT_UInt bbox_mode,
+ FT_BBox *acbox );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Glyph_To_Bitmap */
+ /* */
+ /* <Description> */
+ /* Convert a given glyph object to a bitmap glyph object. */
+ /* */
+ /* <InOut> */
+ /* the_glyph :: A pointer to a handle to the target glyph. */
+ /* */
+ /* <Input> */
+ /* render_mode :: An enumeration that describes how the data is */
+ /* rendered. */
+ /* */
+ /* origin :: A pointer to a vector used to translate the glyph */
+ /* image before rendering. Can be~0 (if no */
+ /* translation). The origin is expressed in */
+ /* 26.6 pixels. */
+ /* */
+ /* destroy :: A boolean that indicates that the original glyph */
+ /* image should be destroyed by this function. It is */
+ /* never destroyed in case of error. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* This function does nothing if the glyph format isn't scalable. */
+ /* */
+ /* The glyph image is translated with the `origin' vector before */
+ /* rendering. */
+ /* */
+ /* The first parameter is a pointer to an @FT_Glyph handle, that will */
+ /* be _replaced_ by this function (with newly allocated data). */
+ /* Typically, you would use (omitting error handling): */
+ /* */
+ /* */
+ /* { */
+ /* FT_Glyph glyph; */
+ /* FT_BitmapGlyph glyph_bitmap; */
+ /* */
+ /* */
+ /* // load glyph */
+ /* error = FT_Load_Char( face, glyph_index, FT_LOAD_DEFAUT ); */
+ /* */
+ /* // extract glyph image */
+ /* error = FT_Get_Glyph( face->glyph, &glyph ); */
+ /* */
+ /* // convert to a bitmap (default render mode + destroying old) */
+ /* if ( glyph->format != FT_GLYPH_FORMAT_BITMAP ) */
+ /* { */
+ /* error = FT_Glyph_To_Bitmap( &glyph, FT_RENDER_MODE_NORMAL, */
+ /* 0, 1 ); */
+ /* if ( error ) // `glyph' unchanged */
+ /* ... */
+ /* } */
+ /* */
+ /* // access bitmap content by typecasting */
+ /* glyph_bitmap = (FT_BitmapGlyph)glyph; */
+ /* */
+ /* // do funny stuff with it, like blitting/drawing */
+ /* ... */
+ /* */
+ /* // discard glyph image (bitmap or not) */
+ /* FT_Done_Glyph( glyph ); */
+ /* } */
+ /* */
+ /* */
+ /* Here another example, again without error handling: */
+ /* */
+ /* */
+ /* { */
+ /* FT_Glyph glyphs[MAX_GLYPHS] */
+ /* */
+ /* */
+ /* ... */
+ /* */
+ /* for ( idx = 0; i < MAX_GLYPHS; i++ ) */
+ /* error = FT_Load_Glyph( face, idx, FT_LOAD_DEFAULT ) || */
+ /* FT_Get_Glyph ( face->glyph, &glyph[idx] ); */
+ /* */
+ /* ... */
+ /* */
+ /* for ( idx = 0; i < MAX_GLYPHS; i++ ) */
+ /* { */
+ /* FT_Glyph bitmap = glyphs[idx]; */
+ /* */
+ /* */
+ /* ... */
+ /* */
+ /* // after this call, `bitmap' no longer points into */
+ /* // the `glyphs' array (and the old value isn't destroyed) */
+ /* FT_Glyph_To_Bitmap( &bitmap, FT_RENDER_MODE_MONO, 0, 0 ); */
+ /* */
+ /* ... */
+ /* */
+ /* FT_Done_Glyph( bitmap ); */
+ /* } */
+ /* */
+ /* ... */
+ /* */
+ /* for ( idx = 0; i < MAX_GLYPHS; i++ ) */
+ /* FT_Done_Glyph( glyphs[idx] ); */
+ /* } */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Glyph_To_Bitmap( FT_Glyph* the_glyph,
+ FT_Render_Mode render_mode,
+ FT_Vector* origin,
+ FT_Bool destroy );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Done_Glyph */
+ /* */
+ /* <Description> */
+ /* Destroy a given glyph. */
+ /* */
+ /* <Input> */
+ /* glyph :: A handle to the target glyph object. */
+ /* */
+ FT_EXPORT( void )
+ FT_Done_Glyph( FT_Glyph glyph );
+
+ /* */
+
+
+ /* other helpful functions */
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* computations */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Matrix_Multiply */
+ /* */
+ /* <Description> */
+ /* Perform the matrix operation `b = a*b'. */
+ /* */
+ /* <Input> */
+ /* a :: A pointer to matrix `a'. */
+ /* */
+ /* <InOut> */
+ /* b :: A pointer to matrix `b'. */
+ /* */
+ /* <Note> */
+ /* The result is undefined if either `a' or `b' is zero. */
+ /* */
+ FT_EXPORT( void )
+ FT_Matrix_Multiply( const FT_Matrix* a,
+ FT_Matrix* b );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Matrix_Invert */
+ /* */
+ /* <Description> */
+ /* Invert a 2x2 matrix. Return an error if it can't be inverted. */
+ /* */
+ /* <InOut> */
+ /* matrix :: A pointer to the target matrix. Remains untouched in */
+ /* case of error. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Matrix_Invert( FT_Matrix* matrix );
+
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTGLYPH_H__ */
+
+
+/* END */
+
+
+/* Local Variables: */
+/* coding: utf-8 */
+/* End: */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftgxval.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftgxval.h
new file mode 100644
index 0000000000..763652a012
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftgxval.h
@@ -0,0 +1,358 @@
+/***************************************************************************/
+/* */
+/* ftgxval.h */
+/* */
+/* FreeType API for validating TrueTypeGX/AAT tables (specification). */
+/* */
+/* Copyright 2004, 2005, 2006 by */
+/* Masatake YAMATO, Redhat K.K, */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+/***************************************************************************/
+/* */
+/* gxvalid is derived from both gxlayout module and otvalid module. */
+/* Development of gxlayout is supported by the Information-technology */
+/* Promotion Agency(IPA), Japan. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTGXVAL_H__
+#define __FTGXVAL_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* gx_validation */
+ /* */
+ /* <Title> */
+ /* TrueTypeGX/AAT Validation */
+ /* */
+ /* <Abstract> */
+ /* An API to validate TrueTypeGX/AAT tables. */
+ /* */
+ /* <Description> */
+ /* This section contains the declaration of functions to validate */
+ /* some TrueTypeGX tables (feat, mort, morx, bsln, just, kern, opbd, */
+ /* trak, prop, lcar). */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* */
+ /* Warning: Use FT_VALIDATE_XXX to validate a table. */
+ /* Following definitions are for gxvalid developers. */
+ /* */
+ /* */
+ /*************************************************************************/
+
+#define FT_VALIDATE_feat_INDEX 0
+#define FT_VALIDATE_mort_INDEX 1
+#define FT_VALIDATE_morx_INDEX 2
+#define FT_VALIDATE_bsln_INDEX 3
+#define FT_VALIDATE_just_INDEX 4
+#define FT_VALIDATE_kern_INDEX 5
+#define FT_VALIDATE_opbd_INDEX 6
+#define FT_VALIDATE_trak_INDEX 7
+#define FT_VALIDATE_prop_INDEX 8
+#define FT_VALIDATE_lcar_INDEX 9
+#define FT_VALIDATE_GX_LAST_INDEX FT_VALIDATE_lcar_INDEX
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_VALIDATE_GX_LENGTH
+ *
+ * @description:
+ * The number of tables checked in this module. Use it as a parameter
+ * for the `table-length' argument of function @FT_TrueTypeGX_Validate.
+ */
+#define FT_VALIDATE_GX_LENGTH (FT_VALIDATE_GX_LAST_INDEX + 1)
+
+ /* */
+
+ /* Up to 0x1000 is used by otvalid.
+ Ox2xxx is reserved for feature OT extension. */
+#define FT_VALIDATE_GX_START 0x4000
+#define FT_VALIDATE_GX_BITFIELD( tag ) \
+ ( FT_VALIDATE_GX_START << FT_VALIDATE_##tag##_INDEX )
+
+
+ /**********************************************************************
+ *
+ * @enum:
+ * FT_VALIDATE_GXXXX
+ *
+ * @description:
+ * A list of bit-field constants used with @FT_TrueTypeGX_Validate to
+ * indicate which TrueTypeGX/AAT Type tables should be validated.
+ *
+ * @values:
+ * FT_VALIDATE_feat ::
+ * Validate `feat' table.
+ *
+ * FT_VALIDATE_mort ::
+ * Validate `mort' table.
+ *
+ * FT_VALIDATE_morx ::
+ * Validate `morx' table.
+ *
+ * FT_VALIDATE_bsln ::
+ * Validate `bsln' table.
+ *
+ * FT_VALIDATE_just ::
+ * Validate `just' table.
+ *
+ * FT_VALIDATE_kern ::
+ * Validate `kern' table.
+ *
+ * FT_VALIDATE_opbd ::
+ * Validate `opbd' table.
+ *
+ * FT_VALIDATE_trak ::
+ * Validate `trak' table.
+ *
+ * FT_VALIDATE_prop ::
+ * Validate `prop' table.
+ *
+ * FT_VALIDATE_lcar ::
+ * Validate `lcar' table.
+ *
+ * FT_VALIDATE_GX ::
+ * Validate all TrueTypeGX tables (feat, mort, morx, bsln, just, kern,
+ * opbd, trak, prop and lcar).
+ *
+ */
+
+#define FT_VALIDATE_feat FT_VALIDATE_GX_BITFIELD( feat )
+#define FT_VALIDATE_mort FT_VALIDATE_GX_BITFIELD( mort )
+#define FT_VALIDATE_morx FT_VALIDATE_GX_BITFIELD( morx )
+#define FT_VALIDATE_bsln FT_VALIDATE_GX_BITFIELD( bsln )
+#define FT_VALIDATE_just FT_VALIDATE_GX_BITFIELD( just )
+#define FT_VALIDATE_kern FT_VALIDATE_GX_BITFIELD( kern )
+#define FT_VALIDATE_opbd FT_VALIDATE_GX_BITFIELD( opbd )
+#define FT_VALIDATE_trak FT_VALIDATE_GX_BITFIELD( trak )
+#define FT_VALIDATE_prop FT_VALIDATE_GX_BITFIELD( prop )
+#define FT_VALIDATE_lcar FT_VALIDATE_GX_BITFIELD( lcar )
+
+#define FT_VALIDATE_GX ( FT_VALIDATE_feat | \
+ FT_VALIDATE_mort | \
+ FT_VALIDATE_morx | \
+ FT_VALIDATE_bsln | \
+ FT_VALIDATE_just | \
+ FT_VALIDATE_kern | \
+ FT_VALIDATE_opbd | \
+ FT_VALIDATE_trak | \
+ FT_VALIDATE_prop | \
+ FT_VALIDATE_lcar )
+
+
+ /* */
+
+ /**********************************************************************
+ *
+ * @function:
+ * FT_TrueTypeGX_Validate
+ *
+ * @description:
+ * Validate various TrueTypeGX tables to assure that all offsets and
+ * indices are valid. The idea is that a higher-level library which
+ * actually does the text layout can access those tables without
+ * error checking (which can be quite time consuming).
+ *
+ * @input:
+ * face ::
+ * A handle to the input face.
+ *
+ * validation_flags ::
+ * A bit field which specifies the tables to be validated. See
+ * @FT_VALIDATE_GXXXX for possible values.
+ *
+ * table_length ::
+ * The size of the `tables' array. Normally, @FT_VALIDATE_GX_LENGTH
+ * should be passed.
+ *
+ * @output:
+ * tables ::
+ * The array where all validated sfnt tables are stored.
+ * The array itself must be allocated by a client.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * This function only works with TrueTypeGX fonts, returning an error
+ * otherwise.
+ *
+ * After use, the application should deallocate the buffers pointed to by
+ * each `tables' element, by calling @FT_TrueTypeGX_Free. A NULL value
+ * indicates that the table either doesn't exist in the font, the
+ * application hasn't asked for validation, or the validator doesn't have
+ * the ability to validate the sfnt table.
+ */
+ FT_EXPORT( FT_Error )
+ FT_TrueTypeGX_Validate( FT_Face face,
+ FT_UInt validation_flags,
+ FT_Bytes tables[FT_VALIDATE_GX_LENGTH],
+ FT_UInt table_length );
+
+
+ /* */
+
+ /**********************************************************************
+ *
+ * @function:
+ * FT_TrueTypeGX_Free
+ *
+ * @description:
+ * Free the buffer allocated by TrueTypeGX validator.
+ *
+ * @input:
+ * face ::
+ * A handle to the input face.
+ *
+ * table ::
+ * The pointer to the buffer allocated by
+ * @FT_TrueTypeGX_Validate.
+ *
+ * @note:
+ * This function must be used to free the buffer allocated by
+ * @FT_TrueTypeGX_Validate only.
+ */
+ FT_EXPORT( void )
+ FT_TrueTypeGX_Free( FT_Face face,
+ FT_Bytes table );
+
+
+ /* */
+
+ /**********************************************************************
+ *
+ * @enum:
+ * FT_VALIDATE_CKERNXXX
+ *
+ * @description:
+ * A list of bit-field constants used with @FT_ClassicKern_Validate
+ * to indicate the classic kern dialect or dialects. If the selected
+ * type doesn't fit, @FT_ClassicKern_Validate regards the table as
+ * invalid.
+ *
+ * @values:
+ * FT_VALIDATE_MS ::
+ * Handle the `kern' table as a classic Microsoft kern table.
+ *
+ * FT_VALIDATE_APPLE ::
+ * Handle the `kern' table as a classic Apple kern table.
+ *
+ * FT_VALIDATE_CKERN ::
+ * Handle the `kern' as either classic Apple or Microsoft kern table.
+ */
+#define FT_VALIDATE_MS ( FT_VALIDATE_GX_START << 0 )
+#define FT_VALIDATE_APPLE ( FT_VALIDATE_GX_START << 1 )
+
+#define FT_VALIDATE_CKERN ( FT_VALIDATE_MS | FT_VALIDATE_APPLE )
+
+
+ /* */
+
+ /**********************************************************************
+ *
+ * @function:
+ * FT_ClassicKern_Validate
+ *
+ * @description:
+ * Validate classic (16-bit format) kern table to assure that the offsets
+ * and indices are valid. The idea is that a higher-level library which
+ * actually does the text layout can access those tables without error
+ * checking (which can be quite time consuming).
+ *
+ * The `kern' table validator in @FT_TrueTypeGX_Validate deals with both
+ * the new 32-bit format and the classic 16-bit format, while
+ * FT_ClassicKern_Validate only supports the classic 16-bit format.
+ *
+ * @input:
+ * face ::
+ * A handle to the input face.
+ *
+ * validation_flags ::
+ * A bit field which specifies the dialect to be validated. See
+ * @FT_VALIDATE_CKERNXXX for possible values.
+ *
+ * @output:
+ * ckern_table ::
+ * A pointer to the kern table.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * After use, the application should deallocate the buffers pointed to by
+ * `ckern_table', by calling @FT_ClassicKern_Free. A NULL value
+ * indicates that the table doesn't exist in the font.
+ */
+ FT_EXPORT( FT_Error )
+ FT_ClassicKern_Validate( FT_Face face,
+ FT_UInt validation_flags,
+ FT_Bytes *ckern_table );
+
+
+ /* */
+
+ /**********************************************************************
+ *
+ * @function:
+ * FT_ClassicKern_Free
+ *
+ * @description:
+ * Free the buffer allocated by classic Kern validator.
+ *
+ * @input:
+ * face ::
+ * A handle to the input face.
+ *
+ * table ::
+ * The pointer to the buffer that is allocated by
+ * @FT_ClassicKern_Validate.
+ *
+ * @note:
+ * This function must be used to free the buffer allocated by
+ * @FT_ClassicKern_Validate only.
+ */
+ FT_EXPORT( void )
+ FT_ClassicKern_Free( FT_Face face,
+ FT_Bytes table );
+
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTGXVAL_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftgzip.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftgzip.h
new file mode 100644
index 0000000000..87155a41bf
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftgzip.h
@@ -0,0 +1,102 @@
+/***************************************************************************/
+/* */
+/* ftgzip.h */
+/* */
+/* Gzip-compressed stream support. */
+/* */
+/* Copyright 2002, 2003, 2004, 2006 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTGZIP_H__
+#define __FTGZIP_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* gzip */
+ /* */
+ /* <Title> */
+ /* GZIP Streams */
+ /* */
+ /* <Abstract> */
+ /* Using gzip-compressed font files. */
+ /* */
+ /* <Description> */
+ /* This section contains the declaration of Gzip-specific functions. */
+ /* */
+ /*************************************************************************/
+
+
+ /************************************************************************
+ *
+ * @function:
+ * FT_Stream_OpenGzip
+ *
+ * @description:
+ * Open a new stream to parse gzip-compressed font files. This is
+ * mainly used to support the compressed `*.pcf.gz' fonts that come
+ * with XFree86.
+ *
+ * @input:
+ * stream ::
+ * The target embedding stream.
+ *
+ * source ::
+ * The source stream.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * The source stream must be opened _before_ calling this function.
+ *
+ * Calling the internal function `FT_Stream_Close' on the new stream will
+ * *not* call `FT_Stream_Close' on the source stream. None of the stream
+ * objects will be released to the heap.
+ *
+ * The stream implementation is very basic and resets the decompression
+ * process each time seeking backwards is needed within the stream.
+ *
+ * In certain builds of the library, gzip compression recognition is
+ * automatically handled when calling @FT_New_Face or @FT_Open_Face.
+ * This means that if no font driver is capable of handling the raw
+ * compressed file, the library will try to open a gzipped stream from
+ * it and re-open the face with it.
+ *
+ * This function may return `FT_Err_Unimplemented_Feature' if your build
+ * of FreeType was not compiled with zlib support.
+ */
+ FT_EXPORT( FT_Error )
+ FT_Stream_OpenGzip( FT_Stream stream,
+ FT_Stream source );
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTGZIP_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftimage.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftimage.h
new file mode 100644
index 0000000000..401cb38633
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftimage.h
@@ -0,0 +1,1322 @@
+/***************************************************************************/
+/* */
+/* ftimage.h */
+/* */
+/* FreeType glyph image formats and default raster interface */
+/* (specification). */
+/* */
+/* Copyright 1996-2010, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* Note: A `raster' is simply a scan-line converter, used to render */
+ /* FT_Outlines into FT_Bitmaps. */
+ /* */
+ /*************************************************************************/
+
+
+#ifndef __FTIMAGE_H__
+#define __FTIMAGE_H__
+
+
+ /* _STANDALONE_ is from ftgrays.c */
+#ifndef _STANDALONE_
+#include "../ft2build.h"
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* basic_types */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Pos */
+ /* */
+ /* <Description> */
+ /* The type FT_Pos is used to store vectorial coordinates. Depending */
+ /* on the context, these can represent distances in integer font */
+ /* units, or 16.16, or 26.6 fixed-point pixel coordinates. */
+ /* */
+ typedef signed long FT_Pos;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Vector */
+ /* */
+ /* <Description> */
+ /* A simple structure used to store a 2D vector; coordinates are of */
+ /* the FT_Pos type. */
+ /* */
+ /* <Fields> */
+ /* x :: The horizontal coordinate. */
+ /* y :: The vertical coordinate. */
+ /* */
+ typedef struct FT_Vector_
+ {
+ FT_Pos x;
+ FT_Pos y;
+
+ } FT_Vector;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_BBox */
+ /* */
+ /* <Description> */
+ /* A structure used to hold an outline's bounding box, i.e., the */
+ /* coordinates of its extrema in the horizontal and vertical */
+ /* directions. */
+ /* */
+ /* <Fields> */
+ /* xMin :: The horizontal minimum (left-most). */
+ /* */
+ /* yMin :: The vertical minimum (bottom-most). */
+ /* */
+ /* xMax :: The horizontal maximum (right-most). */
+ /* */
+ /* yMax :: The vertical maximum (top-most). */
+ /* */
+ /* <Note> */
+ /* The bounding box is specified with the coordinates of the lower */
+ /* left and the upper right corner. In PostScript, those values are */
+ /* often called (llx,lly) and (urx,ury), respectively. */
+ /* */
+ /* If `yMin' is negative, this value gives the glyph's descender. */
+ /* Otherwise, the glyph doesn't descend below the baseline. */
+ /* Similarly, if `ymax' is positive, this value gives the glyph's */
+ /* ascender. */
+ /* */
+ /* `xMin' gives the horizontal distance from the glyph's origin to */
+ /* the left edge of the glyph's bounding box. If `xMin' is negative, */
+ /* the glyph extends to the left of the origin. */
+ /* */
+ typedef struct FT_BBox_
+ {
+ FT_Pos xMin, yMin;
+ FT_Pos xMax, yMax;
+
+ } FT_BBox;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Enum> */
+ /* FT_Pixel_Mode */
+ /* */
+ /* <Description> */
+ /* An enumeration type used to describe the format of pixels in a */
+ /* given bitmap. Note that additional formats may be added in the */
+ /* future. */
+ /* */
+ /* <Values> */
+ /* FT_PIXEL_MODE_NONE :: */
+ /* Value~0 is reserved. */
+ /* */
+ /* FT_PIXEL_MODE_MONO :: */
+ /* A monochrome bitmap, using 1~bit per pixel. Note that pixels */
+ /* are stored in most-significant order (MSB), which means that */
+ /* the left-most pixel in a byte has value 128. */
+ /* */
+ /* FT_PIXEL_MODE_GRAY :: */
+ /* An 8-bit bitmap, generally used to represent anti-aliased glyph */
+ /* images. Each pixel is stored in one byte. Note that the number */
+ /* of `gray' levels is stored in the `num_grays' field of the */
+ /* @FT_Bitmap structure (it generally is 256). */
+ /* */
+ /* FT_PIXEL_MODE_GRAY2 :: */
+ /* A 2-bit per pixel bitmap, used to represent embedded */
+ /* anti-aliased bitmaps in font files according to the OpenType */
+ /* specification. We haven't found a single font using this */
+ /* format, however. */
+ /* */
+ /* FT_PIXEL_MODE_GRAY4 :: */
+ /* A 4-bit per pixel bitmap, representing embedded anti-aliased */
+ /* bitmaps in font files according to the OpenType specification. */
+ /* We haven't found a single font using this format, however. */
+ /* */
+ /* FT_PIXEL_MODE_LCD :: */
+ /* An 8-bit bitmap, representing RGB or BGR decimated glyph images */
+ /* used for display on LCD displays; the bitmap is three times */
+ /* wider than the original glyph image. See also */
+ /* @FT_RENDER_MODE_LCD. */
+ /* */
+ /* FT_PIXEL_MODE_LCD_V :: */
+ /* An 8-bit bitmap, representing RGB or BGR decimated glyph images */
+ /* used for display on rotated LCD displays; the bitmap is three */
+ /* times taller than the original glyph image. See also */
+ /* @FT_RENDER_MODE_LCD_V. */
+ /* */
+ /* FT_PIXEL_MODE_BGRA :: */
+ /* An image with four 8-bit channels per pixel, representing a */
+ /* color image (such as emoticons) with alpha channel. For each */
+ /* pixel, the format is BGRA, which means, the blue channel comes */
+ /* first in memory. The color channels are pre-multiplied and in */
+ /* the sRGB colorspace. For example, full red at half-translucent */
+ /* opacity will be represented as `00,00,80,80', not `00,00,FF,80'. */
+ /* See also @FT_LOAD_COLOR. */
+ /* */
+ typedef enum FT_Pixel_Mode_
+ {
+ FT_PIXEL_MODE_NONE = 0,
+ FT_PIXEL_MODE_MONO,
+ FT_PIXEL_MODE_GRAY,
+ FT_PIXEL_MODE_GRAY2,
+ FT_PIXEL_MODE_GRAY4,
+ FT_PIXEL_MODE_LCD,
+ FT_PIXEL_MODE_LCD_V,
+ FT_PIXEL_MODE_BGRA,
+
+ FT_PIXEL_MODE_MAX /* do not remove */
+
+ } FT_Pixel_Mode;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Enum> */
+ /* ft_pixel_mode_xxx */
+ /* */
+ /* <Description> */
+ /* A list of deprecated constants. Use the corresponding */
+ /* @FT_Pixel_Mode values instead. */
+ /* */
+ /* <Values> */
+ /* ft_pixel_mode_none :: See @FT_PIXEL_MODE_NONE. */
+ /* ft_pixel_mode_mono :: See @FT_PIXEL_MODE_MONO. */
+ /* ft_pixel_mode_grays :: See @FT_PIXEL_MODE_GRAY. */
+ /* ft_pixel_mode_pal2 :: See @FT_PIXEL_MODE_GRAY2. */
+ /* ft_pixel_mode_pal4 :: See @FT_PIXEL_MODE_GRAY4. */
+ /* */
+#define ft_pixel_mode_none FT_PIXEL_MODE_NONE
+#define ft_pixel_mode_mono FT_PIXEL_MODE_MONO
+#define ft_pixel_mode_grays FT_PIXEL_MODE_GRAY
+#define ft_pixel_mode_pal2 FT_PIXEL_MODE_GRAY2
+#define ft_pixel_mode_pal4 FT_PIXEL_MODE_GRAY4
+
+ /* */
+
+#if 0
+
+ /*************************************************************************/
+ /* */
+ /* <Enum> */
+ /* FT_Palette_Mode */
+ /* */
+ /* <Description> */
+ /* THIS TYPE IS DEPRECATED. DO NOT USE IT! */
+ /* */
+ /* An enumeration type to describe the format of a bitmap palette, */
+ /* used with ft_pixel_mode_pal4 and ft_pixel_mode_pal8. */
+ /* */
+ /* <Values> */
+ /* ft_palette_mode_rgb :: The palette is an array of 3-byte RGB */
+ /* records. */
+ /* */
+ /* ft_palette_mode_rgba :: The palette is an array of 4-byte RGBA */
+ /* records. */
+ /* */
+ /* <Note> */
+ /* As ft_pixel_mode_pal2, pal4 and pal8 are currently unused by */
+ /* FreeType, these types are not handled by the library itself. */
+ /* */
+ typedef enum FT_Palette_Mode_
+ {
+ ft_palette_mode_rgb = 0,
+ ft_palette_mode_rgba,
+
+ ft_palette_mode_max /* do not remove */
+
+ } FT_Palette_Mode;
+
+ /* */
+
+#endif
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Bitmap */
+ /* */
+ /* <Description> */
+ /* A structure used to describe a bitmap or pixmap to the raster. */
+ /* Note that we now manage pixmaps of various depths through the */
+ /* `pixel_mode' field. */
+ /* */
+ /* <Fields> */
+ /* rows :: The number of bitmap rows. */
+ /* */
+ /* width :: The number of pixels in bitmap row. */
+ /* */
+ /* pitch :: The pitch's absolute value is the number of bytes */
+ /* taken by one bitmap row, including padding. */
+ /* However, the pitch is positive when the bitmap has */
+ /* a `down' flow, and negative when it has an `up' */
+ /* flow. In all cases, the pitch is an offset to add */
+ /* to a bitmap pointer in order to go down one row. */
+ /* */
+ /* Note that `padding' means the alignment of a */
+ /* bitmap to a byte border, and FreeType functions */
+ /* normally align to the smallest possible integer */
+ /* value. */
+ /* */
+ /* For the B/W rasterizer, `pitch' is always an even */
+ /* number. */
+ /* */
+ /* To change the pitch of a bitmap (say, to make it a */
+ /* multiple of 4), use @FT_Bitmap_Convert. */
+ /* Alternatively, you might use callback functions to */
+ /* directly render to the application's surface; see */
+ /* the file `example2.cpp' in the tutorial for a */
+ /* demonstration. */
+ /* */
+ /* buffer :: A typeless pointer to the bitmap buffer. This */
+ /* value should be aligned on 32-bit boundaries in */
+ /* most cases. */
+ /* */
+ /* num_grays :: This field is only used with */
+ /* @FT_PIXEL_MODE_GRAY; it gives the number of gray */
+ /* levels used in the bitmap. */
+ /* */
+ /* pixel_mode :: The pixel mode, i.e., how pixel bits are stored. */
+ /* See @FT_Pixel_Mode for possible values. */
+ /* */
+ /* palette_mode :: This field is intended for paletted pixel modes; */
+ /* it indicates how the palette is stored. Not */
+ /* used currently. */
+ /* */
+ /* palette :: A typeless pointer to the bitmap palette; this */
+ /* field is intended for paletted pixel modes. Not */
+ /* used currently. */
+ /* */
+ /* <Note> */
+ /* For now, the only pixel modes supported by FreeType are mono and */
+ /* grays. However, drivers might be added in the future to support */
+ /* more `colorful' options. */
+ /* */
+ typedef struct FT_Bitmap_
+ {
+ int rows;
+ int width;
+ int pitch;
+ unsigned char* buffer;
+ short num_grays;
+ char pixel_mode;
+ char palette_mode;
+ void* palette;
+
+ } FT_Bitmap;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* outline_processing */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Outline */
+ /* */
+ /* <Description> */
+ /* This structure is used to describe an outline to the scan-line */
+ /* converter. */
+ /* */
+ /* <Fields> */
+ /* n_contours :: The number of contours in the outline. */
+ /* */
+ /* n_points :: The number of points in the outline. */
+ /* */
+ /* points :: A pointer to an array of `n_points' @FT_Vector */
+ /* elements, giving the outline's point coordinates. */
+ /* */
+ /* tags :: A pointer to an array of `n_points' chars, giving */
+ /* each outline point's type. */
+ /* */
+ /* If bit~0 is unset, the point is `off' the curve, */
+ /* i.e., a Bézier control point, while it is `on' if */
+ /* set. */
+ /* */
+ /* Bit~1 is meaningful for `off' points only. If set, */
+ /* it indicates a third-order Bézier arc control point; */
+ /* and a second-order control point if unset. */
+ /* */
+ /* If bit~2 is set, bits 5-7 contain the drop-out mode */
+ /* (as defined in the OpenType specification; the value */
+ /* is the same as the argument to the SCANMODE */
+ /* instruction). */
+ /* */
+ /* Bits 3 and~4 are reserved for internal purposes. */
+ /* */
+ /* contours :: An array of `n_contours' shorts, giving the end */
+ /* point of each contour within the outline. For */
+ /* example, the first contour is defined by the points */
+ /* `0' to `contours[0]', the second one is defined by */
+ /* the points `contours[0]+1' to `contours[1]', etc. */
+ /* */
+ /* flags :: A set of bit flags used to characterize the outline */
+ /* and give hints to the scan-converter and hinter on */
+ /* how to convert/grid-fit it. See @FT_OUTLINE_FLAGS. */
+ /* */
+ /* <Note> */
+ /* The B/W rasterizer only checks bit~2 in the `tags' array for the */
+ /* first point of each contour. The drop-out mode as given with */
+ /* @FT_OUTLINE_IGNORE_DROPOUTS, @FT_OUTLINE_SMART_DROPOUTS, and */
+ /* @FT_OUTLINE_INCLUDE_STUBS in `flags' is then overridden. */
+ /* */
+ typedef struct FT_Outline_
+ {
+ short n_contours; /* number of contours in glyph */
+ short n_points; /* number of points in the glyph */
+
+ FT_Vector* points; /* the outline's points */
+ char* tags; /* the points flags */
+ short* contours; /* the contour end points */
+
+ int flags; /* outline masks */
+
+ } FT_Outline;
+
+ /* Following limits must be consistent with */
+ /* FT_Outline.{n_contours,n_points} */
+#define FT_OUTLINE_CONTOURS_MAX SHRT_MAX
+#define FT_OUTLINE_POINTS_MAX SHRT_MAX
+
+
+ /*************************************************************************/
+ /* */
+ /* <Enum> */
+ /* FT_OUTLINE_FLAGS */
+ /* */
+ /* <Description> */
+ /* A list of bit-field constants use for the flags in an outline's */
+ /* `flags' field. */
+ /* */
+ /* <Values> */
+ /* FT_OUTLINE_NONE :: */
+ /* Value~0 is reserved. */
+ /* */
+ /* FT_OUTLINE_OWNER :: */
+ /* If set, this flag indicates that the outline's field arrays */
+ /* (i.e., `points', `flags', and `contours') are `owned' by the */
+ /* outline object, and should thus be freed when it is destroyed. */
+ /* */
+ /* FT_OUTLINE_EVEN_ODD_FILL :: */
+ /* By default, outlines are filled using the non-zero winding rule. */
+ /* If set to 1, the outline will be filled using the even-odd fill */
+ /* rule (only works with the smooth rasterizer). */
+ /* */
+ /* FT_OUTLINE_REVERSE_FILL :: */
+ /* By default, outside contours of an outline are oriented in */
+ /* clock-wise direction, as defined in the TrueType specification. */
+ /* This flag is set if the outline uses the opposite direction */
+ /* (typically for Type~1 fonts). This flag is ignored by the scan */
+ /* converter. */
+ /* */
+ /* FT_OUTLINE_IGNORE_DROPOUTS :: */
+ /* By default, the scan converter will try to detect drop-outs in */
+ /* an outline and correct the glyph bitmap to ensure consistent */
+ /* shape continuity. If set, this flag hints the scan-line */
+ /* converter to ignore such cases. See below for more information. */
+ /* */
+ /* FT_OUTLINE_SMART_DROPOUTS :: */
+ /* Select smart dropout control. If unset, use simple dropout */
+ /* control. Ignored if @FT_OUTLINE_IGNORE_DROPOUTS is set. See */
+ /* below for more information. */
+ /* */
+ /* FT_OUTLINE_INCLUDE_STUBS :: */
+ /* If set, turn pixels on for `stubs', otherwise exclude them. */
+ /* Ignored if @FT_OUTLINE_IGNORE_DROPOUTS is set. See below for */
+ /* more information. */
+ /* */
+ /* FT_OUTLINE_HIGH_PRECISION :: */
+ /* This flag indicates that the scan-line converter should try to */
+ /* convert this outline to bitmaps with the highest possible */
+ /* quality. It is typically set for small character sizes. Note */
+ /* that this is only a hint that might be completely ignored by a */
+ /* given scan-converter. */
+ /* */
+ /* FT_OUTLINE_SINGLE_PASS :: */
+ /* This flag is set to force a given scan-converter to only use a */
+ /* single pass over the outline to render a bitmap glyph image. */
+ /* Normally, it is set for very large character sizes. It is only */
+ /* a hint that might be completely ignored by a given */
+ /* scan-converter. */
+ /* */
+ /* <Note> */
+ /* The flags @FT_OUTLINE_IGNORE_DROPOUTS, @FT_OUTLINE_SMART_DROPOUTS, */
+ /* and @FT_OUTLINE_INCLUDE_STUBS are ignored by the smooth */
+ /* rasterizer. */
+ /* */
+ /* There exists a second mechanism to pass the drop-out mode to the */
+ /* B/W rasterizer; see the `tags' field in @FT_Outline. */
+ /* */
+ /* Please refer to the description of the `SCANTYPE' instruction in */
+ /* the OpenType specification (in file `ttinst1.doc') how simple */
+ /* drop-outs, smart drop-outs, and stubs are defined. */
+ /* */
+#define FT_OUTLINE_NONE 0x0
+#define FT_OUTLINE_OWNER 0x1
+#define FT_OUTLINE_EVEN_ODD_FILL 0x2
+#define FT_OUTLINE_REVERSE_FILL 0x4
+#define FT_OUTLINE_IGNORE_DROPOUTS 0x8
+#define FT_OUTLINE_SMART_DROPOUTS 0x10
+#define FT_OUTLINE_INCLUDE_STUBS 0x20
+
+#define FT_OUTLINE_HIGH_PRECISION 0x100
+#define FT_OUTLINE_SINGLE_PASS 0x200
+
+
+ /*************************************************************************
+ *
+ * @enum:
+ * ft_outline_flags
+ *
+ * @description:
+ * These constants are deprecated. Please use the corresponding
+ * @FT_OUTLINE_FLAGS values.
+ *
+ * @values:
+ * ft_outline_none :: See @FT_OUTLINE_NONE.
+ * ft_outline_owner :: See @FT_OUTLINE_OWNER.
+ * ft_outline_even_odd_fill :: See @FT_OUTLINE_EVEN_ODD_FILL.
+ * ft_outline_reverse_fill :: See @FT_OUTLINE_REVERSE_FILL.
+ * ft_outline_ignore_dropouts :: See @FT_OUTLINE_IGNORE_DROPOUTS.
+ * ft_outline_high_precision :: See @FT_OUTLINE_HIGH_PRECISION.
+ * ft_outline_single_pass :: See @FT_OUTLINE_SINGLE_PASS.
+ */
+#define ft_outline_none FT_OUTLINE_NONE
+#define ft_outline_owner FT_OUTLINE_OWNER
+#define ft_outline_even_odd_fill FT_OUTLINE_EVEN_ODD_FILL
+#define ft_outline_reverse_fill FT_OUTLINE_REVERSE_FILL
+#define ft_outline_ignore_dropouts FT_OUTLINE_IGNORE_DROPOUTS
+#define ft_outline_high_precision FT_OUTLINE_HIGH_PRECISION
+#define ft_outline_single_pass FT_OUTLINE_SINGLE_PASS
+
+ /* */
+
+#define FT_CURVE_TAG( flag ) ( flag & 3 )
+
+#define FT_CURVE_TAG_ON 1
+#define FT_CURVE_TAG_CONIC 0
+#define FT_CURVE_TAG_CUBIC 2
+
+#define FT_CURVE_TAG_HAS_SCANMODE 4
+
+#define FT_CURVE_TAG_TOUCH_X 8 /* reserved for the TrueType hinter */
+#define FT_CURVE_TAG_TOUCH_Y 16 /* reserved for the TrueType hinter */
+
+#define FT_CURVE_TAG_TOUCH_BOTH ( FT_CURVE_TAG_TOUCH_X | \
+ FT_CURVE_TAG_TOUCH_Y )
+
+#define FT_Curve_Tag_On FT_CURVE_TAG_ON
+#define FT_Curve_Tag_Conic FT_CURVE_TAG_CONIC
+#define FT_Curve_Tag_Cubic FT_CURVE_TAG_CUBIC
+#define FT_Curve_Tag_Touch_X FT_CURVE_TAG_TOUCH_X
+#define FT_Curve_Tag_Touch_Y FT_CURVE_TAG_TOUCH_Y
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_Outline_MoveToFunc */
+ /* */
+ /* <Description> */
+ /* A function pointer type used to describe the signature of a `move */
+ /* to' function during outline walking/decomposition. */
+ /* */
+ /* A `move to' is emitted to start a new contour in an outline. */
+ /* */
+ /* <Input> */
+ /* to :: A pointer to the target point of the `move to'. */
+ /* */
+ /* user :: A typeless pointer which is passed from the caller of the */
+ /* decomposition function. */
+ /* */
+ /* <Return> */
+ /* Error code. 0~means success. */
+ /* */
+ typedef int
+ (*FT_Outline_MoveToFunc)( const FT_Vector* to,
+ void* user );
+
+#define FT_Outline_MoveTo_Func FT_Outline_MoveToFunc
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_Outline_LineToFunc */
+ /* */
+ /* <Description> */
+ /* A function pointer type used to describe the signature of a `line */
+ /* to' function during outline walking/decomposition. */
+ /* */
+ /* A `line to' is emitted to indicate a segment in the outline. */
+ /* */
+ /* <Input> */
+ /* to :: A pointer to the target point of the `line to'. */
+ /* */
+ /* user :: A typeless pointer which is passed from the caller of the */
+ /* decomposition function. */
+ /* */
+ /* <Return> */
+ /* Error code. 0~means success. */
+ /* */
+ typedef int
+ (*FT_Outline_LineToFunc)( const FT_Vector* to,
+ void* user );
+
+#define FT_Outline_LineTo_Func FT_Outline_LineToFunc
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_Outline_ConicToFunc */
+ /* */
+ /* <Description> */
+ /* A function pointer type used to describe the signature of a `conic */
+ /* to' function during outline walking or decomposition. */
+ /* */
+ /* A `conic to' is emitted to indicate a second-order Bézier arc in */
+ /* the outline. */
+ /* */
+ /* <Input> */
+ /* control :: An intermediate control point between the last position */
+ /* and the new target in `to'. */
+ /* */
+ /* to :: A pointer to the target end point of the conic arc. */
+ /* */
+ /* user :: A typeless pointer which is passed from the caller of */
+ /* the decomposition function. */
+ /* */
+ /* <Return> */
+ /* Error code. 0~means success. */
+ /* */
+ typedef int
+ (*FT_Outline_ConicToFunc)( const FT_Vector* control,
+ const FT_Vector* to,
+ void* user );
+
+#define FT_Outline_ConicTo_Func FT_Outline_ConicToFunc
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_Outline_CubicToFunc */
+ /* */
+ /* <Description> */
+ /* A function pointer type used to describe the signature of a `cubic */
+ /* to' function during outline walking or decomposition. */
+ /* */
+ /* A `cubic to' is emitted to indicate a third-order Bézier arc. */
+ /* */
+ /* <Input> */
+ /* control1 :: A pointer to the first Bézier control point. */
+ /* */
+ /* control2 :: A pointer to the second Bézier control point. */
+ /* */
+ /* to :: A pointer to the target end point. */
+ /* */
+ /* user :: A typeless pointer which is passed from the caller of */
+ /* the decomposition function. */
+ /* */
+ /* <Return> */
+ /* Error code. 0~means success. */
+ /* */
+ typedef int
+ (*FT_Outline_CubicToFunc)( const FT_Vector* control1,
+ const FT_Vector* control2,
+ const FT_Vector* to,
+ void* user );
+
+#define FT_Outline_CubicTo_Func FT_Outline_CubicToFunc
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Outline_Funcs */
+ /* */
+ /* <Description> */
+ /* A structure to hold various function pointers used during outline */
+ /* decomposition in order to emit segments, conic, and cubic Béziers. */
+ /* */
+ /* <Fields> */
+ /* move_to :: The `move to' emitter. */
+ /* */
+ /* line_to :: The segment emitter. */
+ /* */
+ /* conic_to :: The second-order Bézier arc emitter. */
+ /* */
+ /* cubic_to :: The third-order Bézier arc emitter. */
+ /* */
+ /* shift :: The shift that is applied to coordinates before they */
+ /* are sent to the emitter. */
+ /* */
+ /* delta :: The delta that is applied to coordinates before they */
+ /* are sent to the emitter, but after the shift. */
+ /* */
+ /* <Note> */
+ /* The point coordinates sent to the emitters are the transformed */
+ /* version of the original coordinates (this is important for high */
+ /* accuracy during scan-conversion). The transformation is simple: */
+ /* */
+ /* { */
+ /* x' = (x << shift) - delta */
+ /* y' = (x << shift) - delta */
+ /* } */
+ /* */
+ /* Set the values of `shift' and `delta' to~0 to get the original */
+ /* point coordinates. */
+ /* */
+ typedef struct FT_Outline_Funcs_
+ {
+ FT_Outline_MoveToFunc move_to;
+ FT_Outline_LineToFunc line_to;
+ FT_Outline_ConicToFunc conic_to;
+ FT_Outline_CubicToFunc cubic_to;
+
+ int shift;
+ FT_Pos delta;
+
+ } FT_Outline_Funcs;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* basic_types */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Macro> */
+ /* FT_IMAGE_TAG */
+ /* */
+ /* <Description> */
+ /* This macro converts four-letter tags to an unsigned long type. */
+ /* */
+ /* <Note> */
+ /* Since many 16-bit compilers don't like 32-bit enumerations, you */
+ /* should redefine this macro in case of problems to something like */
+ /* this: */
+ /* */
+ /* { */
+ /* #define FT_IMAGE_TAG( value, _x1, _x2, _x3, _x4 ) value */
+ /* } */
+ /* */
+ /* to get a simple enumeration without assigning special numbers. */
+ /* */
+#ifndef FT_IMAGE_TAG
+#define FT_IMAGE_TAG( value, _x1, _x2, _x3, _x4 ) \
+ value = ( ( (unsigned long)_x1 << 24 ) | \
+ ( (unsigned long)_x2 << 16 ) | \
+ ( (unsigned long)_x3 << 8 ) | \
+ (unsigned long)_x4 )
+#endif /* FT_IMAGE_TAG */
+
+
+ /*************************************************************************/
+ /* */
+ /* <Enum> */
+ /* FT_Glyph_Format */
+ /* */
+ /* <Description> */
+ /* An enumeration type used to describe the format of a given glyph */
+ /* image. Note that this version of FreeType only supports two image */
+ /* formats, even though future font drivers will be able to register */
+ /* their own format. */
+ /* */
+ /* <Values> */
+ /* FT_GLYPH_FORMAT_NONE :: */
+ /* The value~0 is reserved. */
+ /* */
+ /* FT_GLYPH_FORMAT_COMPOSITE :: */
+ /* The glyph image is a composite of several other images. This */
+ /* format is _only_ used with @FT_LOAD_NO_RECURSE, and is used to */
+ /* report compound glyphs (like accented characters). */
+ /* */
+ /* FT_GLYPH_FORMAT_BITMAP :: */
+ /* The glyph image is a bitmap, and can be described as an */
+ /* @FT_Bitmap. You generally need to access the `bitmap' field of */
+ /* the @FT_GlyphSlotRec structure to read it. */
+ /* */
+ /* FT_GLYPH_FORMAT_OUTLINE :: */
+ /* The glyph image is a vectorial outline made of line segments */
+ /* and Bézier arcs; it can be described as an @FT_Outline; you */
+ /* generally want to access the `outline' field of the */
+ /* @FT_GlyphSlotRec structure to read it. */
+ /* */
+ /* FT_GLYPH_FORMAT_PLOTTER :: */
+ /* The glyph image is a vectorial path with no inside and outside */
+ /* contours. Some Type~1 fonts, like those in the Hershey family, */
+ /* contain glyphs in this format. These are described as */
+ /* @FT_Outline, but FreeType isn't currently capable of rendering */
+ /* them correctly. */
+ /* */
+ typedef enum FT_Glyph_Format_
+ {
+ FT_IMAGE_TAG( FT_GLYPH_FORMAT_NONE, 0, 0, 0, 0 ),
+
+ FT_IMAGE_TAG( FT_GLYPH_FORMAT_COMPOSITE, 'c', 'o', 'm', 'p' ),
+ FT_IMAGE_TAG( FT_GLYPH_FORMAT_BITMAP, 'b', 'i', 't', 's' ),
+ FT_IMAGE_TAG( FT_GLYPH_FORMAT_OUTLINE, 'o', 'u', 't', 'l' ),
+ FT_IMAGE_TAG( FT_GLYPH_FORMAT_PLOTTER, 'p', 'l', 'o', 't' )
+
+ } FT_Glyph_Format;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Enum> */
+ /* ft_glyph_format_xxx */
+ /* */
+ /* <Description> */
+ /* A list of deprecated constants. Use the corresponding */
+ /* @FT_Glyph_Format values instead. */
+ /* */
+ /* <Values> */
+ /* ft_glyph_format_none :: See @FT_GLYPH_FORMAT_NONE. */
+ /* ft_glyph_format_composite :: See @FT_GLYPH_FORMAT_COMPOSITE. */
+ /* ft_glyph_format_bitmap :: See @FT_GLYPH_FORMAT_BITMAP. */
+ /* ft_glyph_format_outline :: See @FT_GLYPH_FORMAT_OUTLINE. */
+ /* ft_glyph_format_plotter :: See @FT_GLYPH_FORMAT_PLOTTER. */
+ /* */
+#define ft_glyph_format_none FT_GLYPH_FORMAT_NONE
+#define ft_glyph_format_composite FT_GLYPH_FORMAT_COMPOSITE
+#define ft_glyph_format_bitmap FT_GLYPH_FORMAT_BITMAP
+#define ft_glyph_format_outline FT_GLYPH_FORMAT_OUTLINE
+#define ft_glyph_format_plotter FT_GLYPH_FORMAT_PLOTTER
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** R A S T E R D E F I N I T I O N S *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* A raster is a scan converter, in charge of rendering an outline into */
+ /* a a bitmap. This section contains the public API for rasters. */
+ /* */
+ /* Note that in FreeType 2, all rasters are now encapsulated within */
+ /* specific modules called `renderers'. See `freetype/ftrender.h' for */
+ /* more details on renderers. */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* raster */
+ /* */
+ /* <Title> */
+ /* Scanline Converter */
+ /* */
+ /* <Abstract> */
+ /* How vectorial outlines are converted into bitmaps and pixmaps. */
+ /* */
+ /* <Description> */
+ /* This section contains technical definitions. */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Raster */
+ /* */
+ /* <Description> */
+ /* A handle (pointer) to a raster object. Each object can be used */
+ /* independently to convert an outline into a bitmap or pixmap. */
+ /* */
+ typedef struct FT_RasterRec_* FT_Raster;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Span */
+ /* */
+ /* <Description> */
+ /* A structure used to model a single span of gray (or black) pixels */
+ /* when rendering a monochrome or anti-aliased bitmap. */
+ /* */
+ /* <Fields> */
+ /* x :: The span's horizontal start position. */
+ /* */
+ /* len :: The span's length in pixels. */
+ /* */
+ /* coverage :: The span color/coverage, ranging from 0 (background) */
+ /* to 255 (foreground). Only used for anti-aliased */
+ /* rendering. */
+ /* */
+ /* <Note> */
+ /* This structure is used by the span drawing callback type named */
+ /* @FT_SpanFunc which takes the y~coordinate of the span as a */
+ /* a parameter. */
+ /* */
+ /* The coverage value is always between 0 and 255. If you want less */
+ /* gray values, the callback function has to reduce them. */
+ /* */
+ typedef struct FT_Span_
+ {
+ short x;
+ unsigned short len;
+ unsigned char coverage;
+
+ } FT_Span;
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_SpanFunc */
+ /* */
+ /* <Description> */
+ /* A function used as a call-back by the anti-aliased renderer in */
+ /* order to let client applications draw themselves the gray pixel */
+ /* spans on each scan line. */
+ /* */
+ /* <Input> */
+ /* y :: The scanline's y~coordinate. */
+ /* */
+ /* count :: The number of spans to draw on this scanline. */
+ /* */
+ /* spans :: A table of `count' spans to draw on the scanline. */
+ /* */
+ /* user :: User-supplied data that is passed to the callback. */
+ /* */
+ /* <Note> */
+ /* This callback allows client applications to directly render the */
+ /* gray spans of the anti-aliased bitmap to any kind of surfaces. */
+ /* */
+ /* This can be used to write anti-aliased outlines directly to a */
+ /* given background bitmap, and even perform translucency. */
+ /* */
+ /* Note that the `count' field cannot be greater than a fixed value */
+ /* defined by the `FT_MAX_GRAY_SPANS' configuration macro in */
+ /* `ftoption.h'. By default, this value is set to~32, which means */
+ /* that if there are more than 32~spans on a given scanline, the */
+ /* callback is called several times with the same `y' parameter in */
+ /* order to draw all callbacks. */
+ /* */
+ /* Otherwise, the callback is only called once per scan-line, and */
+ /* only for those scanlines that do have `gray' pixels on them. */
+ /* */
+ typedef void
+ (*FT_SpanFunc)( int y,
+ int count,
+ const FT_Span* spans,
+ void* user );
+
+#define FT_Raster_Span_Func FT_SpanFunc
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_Raster_BitTest_Func */
+ /* */
+ /* <Description> */
+ /* THIS TYPE IS DEPRECATED. DO NOT USE IT. */
+ /* */
+ /* A function used as a call-back by the monochrome scan-converter */
+ /* to test whether a given target pixel is already set to the drawing */
+ /* `color'. These tests are crucial to implement drop-out control */
+ /* per-se the TrueType spec. */
+ /* */
+ /* <Input> */
+ /* y :: The pixel's y~coordinate. */
+ /* */
+ /* x :: The pixel's x~coordinate. */
+ /* */
+ /* user :: User-supplied data that is passed to the callback. */
+ /* */
+ /* <Return> */
+ /* 1~if the pixel is `set', 0~otherwise. */
+ /* */
+ typedef int
+ (*FT_Raster_BitTest_Func)( int y,
+ int x,
+ void* user );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_Raster_BitSet_Func */
+ /* */
+ /* <Description> */
+ /* THIS TYPE IS DEPRECATED. DO NOT USE IT. */
+ /* */
+ /* A function used as a call-back by the monochrome scan-converter */
+ /* to set an individual target pixel. This is crucial to implement */
+ /* drop-out control according to the TrueType specification. */
+ /* */
+ /* <Input> */
+ /* y :: The pixel's y~coordinate. */
+ /* */
+ /* x :: The pixel's x~coordinate. */
+ /* */
+ /* user :: User-supplied data that is passed to the callback. */
+ /* */
+ /* <Return> */
+ /* 1~if the pixel is `set', 0~otherwise. */
+ /* */
+ typedef void
+ (*FT_Raster_BitSet_Func)( int y,
+ int x,
+ void* user );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Enum> */
+ /* FT_RASTER_FLAG_XXX */
+ /* */
+ /* <Description> */
+ /* A list of bit flag constants as used in the `flags' field of a */
+ /* @FT_Raster_Params structure. */
+ /* */
+ /* <Values> */
+ /* FT_RASTER_FLAG_DEFAULT :: This value is 0. */
+ /* */
+ /* FT_RASTER_FLAG_AA :: This flag is set to indicate that an */
+ /* anti-aliased glyph image should be */
+ /* generated. Otherwise, it will be */
+ /* monochrome (1-bit). */
+ /* */
+ /* FT_RASTER_FLAG_DIRECT :: This flag is set to indicate direct */
+ /* rendering. In this mode, client */
+ /* applications must provide their own span */
+ /* callback. This lets them directly */
+ /* draw or compose over an existing bitmap. */
+ /* If this bit is not set, the target */
+ /* pixmap's buffer _must_ be zeroed before */
+ /* rendering. */
+ /* */
+ /* Note that for now, direct rendering is */
+ /* only possible with anti-aliased glyphs. */
+ /* */
+ /* FT_RASTER_FLAG_CLIP :: This flag is only used in direct */
+ /* rendering mode. If set, the output will */
+ /* be clipped to a box specified in the */
+ /* `clip_box' field of the */
+ /* @FT_Raster_Params structure. */
+ /* */
+ /* Note that by default, the glyph bitmap */
+ /* is clipped to the target pixmap, except */
+ /* in direct rendering mode where all spans */
+ /* are generated if no clipping box is set. */
+ /* */
+#define FT_RASTER_FLAG_DEFAULT 0x0
+#define FT_RASTER_FLAG_AA 0x1
+#define FT_RASTER_FLAG_DIRECT 0x2
+#define FT_RASTER_FLAG_CLIP 0x4
+
+ /* deprecated */
+#define ft_raster_flag_default FT_RASTER_FLAG_DEFAULT
+#define ft_raster_flag_aa FT_RASTER_FLAG_AA
+#define ft_raster_flag_direct FT_RASTER_FLAG_DIRECT
+#define ft_raster_flag_clip FT_RASTER_FLAG_CLIP
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Raster_Params */
+ /* */
+ /* <Description> */
+ /* A structure to hold the arguments used by a raster's render */
+ /* function. */
+ /* */
+ /* <Fields> */
+ /* target :: The target bitmap. */
+ /* */
+ /* source :: A pointer to the source glyph image (e.g., an */
+ /* @FT_Outline). */
+ /* */
+ /* flags :: The rendering flags. */
+ /* */
+ /* gray_spans :: The gray span drawing callback. */
+ /* */
+ /* black_spans :: The black span drawing callback. UNIMPLEMENTED! */
+ /* */
+ /* bit_test :: The bit test callback. UNIMPLEMENTED! */
+ /* */
+ /* bit_set :: The bit set callback. UNIMPLEMENTED! */
+ /* */
+ /* user :: User-supplied data that is passed to each drawing */
+ /* callback. */
+ /* */
+ /* clip_box :: An optional clipping box. It is only used in */
+ /* direct rendering mode. Note that coordinates here */
+ /* should be expressed in _integer_ pixels (and not in */
+ /* 26.6 fixed-point units). */
+ /* */
+ /* <Note> */
+ /* An anti-aliased glyph bitmap is drawn if the @FT_RASTER_FLAG_AA */
+ /* bit flag is set in the `flags' field, otherwise a monochrome */
+ /* bitmap is generated. */
+ /* */
+ /* If the @FT_RASTER_FLAG_DIRECT bit flag is set in `flags', the */
+ /* raster will call the `gray_spans' callback to draw gray pixel */
+ /* spans, in the case of an aa glyph bitmap, it will call */
+ /* `black_spans', and `bit_test' and `bit_set' in the case of a */
+ /* monochrome bitmap. This allows direct composition over a */
+ /* pre-existing bitmap through user-provided callbacks to perform the */
+ /* span drawing/composition. */
+ /* */
+ /* Note that the `bit_test' and `bit_set' callbacks are required when */
+ /* rendering a monochrome bitmap, as they are crucial to implement */
+ /* correct drop-out control as defined in the TrueType specification. */
+ /* */
+ typedef struct FT_Raster_Params_
+ {
+ const FT_Bitmap* target;
+ const void* source;
+ int flags;
+ FT_SpanFunc gray_spans;
+ FT_SpanFunc black_spans; /* doesn't work! */
+ FT_Raster_BitTest_Func bit_test; /* doesn't work! */
+ FT_Raster_BitSet_Func bit_set; /* doesn't work! */
+ void* user;
+ FT_BBox clip_box;
+
+ } FT_Raster_Params;
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_Raster_NewFunc */
+ /* */
+ /* <Description> */
+ /* A function used to create a new raster object. */
+ /* */
+ /* <Input> */
+ /* memory :: A handle to the memory allocator. */
+ /* */
+ /* <Output> */
+ /* raster :: A handle to the new raster object. */
+ /* */
+ /* <Return> */
+ /* Error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* The `memory' parameter is a typeless pointer in order to avoid */
+ /* un-wanted dependencies on the rest of the FreeType code. In */
+ /* practice, it is an @FT_Memory object, i.e., a handle to the */
+ /* standard FreeType memory allocator. However, this field can be */
+ /* completely ignored by a given raster implementation. */
+ /* */
+ typedef int
+ (*FT_Raster_NewFunc)( void* memory,
+ FT_Raster* raster );
+
+#define FT_Raster_New_Func FT_Raster_NewFunc
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_Raster_DoneFunc */
+ /* */
+ /* <Description> */
+ /* A function used to destroy a given raster object. */
+ /* */
+ /* <Input> */
+ /* raster :: A handle to the raster object. */
+ /* */
+ typedef void
+ (*FT_Raster_DoneFunc)( FT_Raster raster );
+
+#define FT_Raster_Done_Func FT_Raster_DoneFunc
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_Raster_ResetFunc */
+ /* */
+ /* <Description> */
+ /* FreeType provides an area of memory called the `render pool', */
+ /* available to all registered rasters. This pool can be freely used */
+ /* during a given scan-conversion but is shared by all rasters. Its */
+ /* content is thus transient. */
+ /* */
+ /* This function is called each time the render pool changes, or just */
+ /* after a new raster object is created. */
+ /* */
+ /* <Input> */
+ /* raster :: A handle to the new raster object. */
+ /* */
+ /* pool_base :: The address in memory of the render pool. */
+ /* */
+ /* pool_size :: The size in bytes of the render pool. */
+ /* */
+ /* <Note> */
+ /* Rasters can ignore the render pool and rely on dynamic memory */
+ /* allocation if they want to (a handle to the memory allocator is */
+ /* passed to the raster constructor). However, this is not */
+ /* recommended for efficiency purposes. */
+ /* */
+ typedef void
+ (*FT_Raster_ResetFunc)( FT_Raster raster,
+ unsigned char* pool_base,
+ unsigned long pool_size );
+
+#define FT_Raster_Reset_Func FT_Raster_ResetFunc
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_Raster_SetModeFunc */
+ /* */
+ /* <Description> */
+ /* This function is a generic facility to change modes or attributes */
+ /* in a given raster. This can be used for debugging purposes, or */
+ /* simply to allow implementation-specific `features' in a given */
+ /* raster module. */
+ /* */
+ /* <Input> */
+ /* raster :: A handle to the new raster object. */
+ /* */
+ /* mode :: A 4-byte tag used to name the mode or property. */
+ /* */
+ /* args :: A pointer to the new mode/property to use. */
+ /* */
+ typedef int
+ (*FT_Raster_SetModeFunc)( FT_Raster raster,
+ unsigned long mode,
+ void* args );
+
+#define FT_Raster_Set_Mode_Func FT_Raster_SetModeFunc
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_Raster_RenderFunc */
+ /* */
+ /* <Description> */
+ /* Invoke a given raster to scan-convert a given glyph image into a */
+ /* target bitmap. */
+ /* */
+ /* <Input> */
+ /* raster :: A handle to the raster object. */
+ /* */
+ /* params :: A pointer to an @FT_Raster_Params structure used to */
+ /* store the rendering parameters. */
+ /* */
+ /* <Return> */
+ /* Error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* The exact format of the source image depends on the raster's glyph */
+ /* format defined in its @FT_Raster_Funcs structure. It can be an */
+ /* @FT_Outline or anything else in order to support a large array of */
+ /* glyph formats. */
+ /* */
+ /* Note also that the render function can fail and return a */
+ /* `FT_Err_Unimplemented_Feature' error code if the raster used does */
+ /* not support direct composition. */
+ /* */
+ /* XXX: For now, the standard raster doesn't support direct */
+ /* composition but this should change for the final release (see */
+ /* the files `demos/src/ftgrays.c' and `demos/src/ftgrays2.c' */
+ /* for examples of distinct implementations which support direct */
+ /* composition). */
+ /* */
+ typedef int
+ (*FT_Raster_RenderFunc)( FT_Raster raster,
+ const FT_Raster_Params* params );
+
+#define FT_Raster_Render_Func FT_Raster_RenderFunc
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Raster_Funcs */
+ /* */
+ /* <Description> */
+ /* A structure used to describe a given raster class to the library. */
+ /* */
+ /* <Fields> */
+ /* glyph_format :: The supported glyph format for this raster. */
+ /* */
+ /* raster_new :: The raster constructor. */
+ /* */
+ /* raster_reset :: Used to reset the render pool within the raster. */
+ /* */
+ /* raster_render :: A function to render a glyph into a given bitmap. */
+ /* */
+ /* raster_done :: The raster destructor. */
+ /* */
+ typedef struct FT_Raster_Funcs_
+ {
+ FT_Glyph_Format glyph_format;
+ FT_Raster_NewFunc raster_new;
+ FT_Raster_ResetFunc raster_reset;
+ FT_Raster_SetModeFunc raster_set_mode;
+ FT_Raster_RenderFunc raster_render;
+ FT_Raster_DoneFunc raster_done;
+
+ } FT_Raster_Funcs;
+
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTIMAGE_H__ */
+
+
+/* END */
+
+
+/* Local Variables: */
+/* coding: utf-8 */
+/* End: */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftincrem.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftincrem.h
new file mode 100644
index 0000000000..3a3015edc6
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftincrem.h
@@ -0,0 +1,353 @@
+/***************************************************************************/
+/* */
+/* ftincrem.h */
+/* */
+/* FreeType incremental loading (specification). */
+/* */
+/* Copyright 2002, 2003, 2006, 2007, 2008, 2010 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTINCREM_H__
+#define __FTINCREM_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+ /***************************************************************************
+ *
+ * @section:
+ * incremental
+ *
+ * @title:
+ * Incremental Loading
+ *
+ * @abstract:
+ * Custom Glyph Loading.
+ *
+ * @description:
+ * This section contains various functions used to perform so-called
+ * `incremental' glyph loading. This is a mode where all glyphs loaded
+ * from a given @FT_Face are provided by the client application,
+ *
+ * Apart from that, all other tables are loaded normally from the font
+ * file. This mode is useful when FreeType is used within another
+ * engine, e.g., a PostScript Imaging Processor.
+ *
+ * To enable this mode, you must use @FT_Open_Face, passing an
+ * @FT_Parameter with the @FT_PARAM_TAG_INCREMENTAL tag and an
+ * @FT_Incremental_Interface value. See the comments for
+ * @FT_Incremental_InterfaceRec for an example.
+ *
+ */
+
+
+ /***************************************************************************
+ *
+ * @type:
+ * FT_Incremental
+ *
+ * @description:
+ * An opaque type describing a user-provided object used to implement
+ * `incremental' glyph loading within FreeType. This is used to support
+ * embedded fonts in certain environments (e.g., PostScript interpreters),
+ * where the glyph data isn't in the font file, or must be overridden by
+ * different values.
+ *
+ * @note:
+ * It is up to client applications to create and implement @FT_Incremental
+ * objects, as long as they provide implementations for the methods
+ * @FT_Incremental_GetGlyphDataFunc, @FT_Incremental_FreeGlyphDataFunc
+ * and @FT_Incremental_GetGlyphMetricsFunc.
+ *
+ * See the description of @FT_Incremental_InterfaceRec to understand how
+ * to use incremental objects with FreeType.
+ *
+ */
+ typedef struct FT_IncrementalRec_* FT_Incremental;
+
+
+ /***************************************************************************
+ *
+ * @struct:
+ * FT_Incremental_MetricsRec
+ *
+ * @description:
+ * A small structure used to contain the basic glyph metrics returned
+ * by the @FT_Incremental_GetGlyphMetricsFunc method.
+ *
+ * @fields:
+ * bearing_x ::
+ * Left bearing, in font units.
+ *
+ * bearing_y ::
+ * Top bearing, in font units.
+ *
+ * advance ::
+ * Horizontal component of glyph advance, in font units.
+ *
+ * advance_v ::
+ * Vertical component of glyph advance, in font units.
+ *
+ * @note:
+ * These correspond to horizontal or vertical metrics depending on the
+ * value of the `vertical' argument to the function
+ * @FT_Incremental_GetGlyphMetricsFunc.
+ *
+ */
+ typedef struct FT_Incremental_MetricsRec_
+ {
+ FT_Long bearing_x;
+ FT_Long bearing_y;
+ FT_Long advance;
+ FT_Long advance_v; /* since 2.3.12 */
+
+ } FT_Incremental_MetricsRec;
+
+
+ /***************************************************************************
+ *
+ * @struct:
+ * FT_Incremental_Metrics
+ *
+ * @description:
+ * A handle to an @FT_Incremental_MetricsRec structure.
+ *
+ */
+ typedef struct FT_Incremental_MetricsRec_* FT_Incremental_Metrics;
+
+
+ /***************************************************************************
+ *
+ * @type:
+ * FT_Incremental_GetGlyphDataFunc
+ *
+ * @description:
+ * A function called by FreeType to access a given glyph's data bytes
+ * during @FT_Load_Glyph or @FT_Load_Char if incremental loading is
+ * enabled.
+ *
+ * Note that the format of the glyph's data bytes depends on the font
+ * file format. For TrueType, it must correspond to the raw bytes within
+ * the `glyf' table. For PostScript formats, it must correspond to the
+ * *unencrypted* charstring bytes, without any `lenIV' header. It is
+ * undefined for any other format.
+ *
+ * @input:
+ * incremental ::
+ * Handle to an opaque @FT_Incremental handle provided by the client
+ * application.
+ *
+ * glyph_index ::
+ * Index of relevant glyph.
+ *
+ * @output:
+ * adata ::
+ * A structure describing the returned glyph data bytes (which will be
+ * accessed as a read-only byte block).
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * If this function returns successfully the method
+ * @FT_Incremental_FreeGlyphDataFunc will be called later to release
+ * the data bytes.
+ *
+ * Nested calls to @FT_Incremental_GetGlyphDataFunc can happen for
+ * compound glyphs.
+ *
+ */
+ typedef FT_Error
+ (*FT_Incremental_GetGlyphDataFunc)( FT_Incremental incremental,
+ FT_UInt glyph_index,
+ FT_Data* adata );
+
+
+ /***************************************************************************
+ *
+ * @type:
+ * FT_Incremental_FreeGlyphDataFunc
+ *
+ * @description:
+ * A function used to release the glyph data bytes returned by a
+ * successful call to @FT_Incremental_GetGlyphDataFunc.
+ *
+ * @input:
+ * incremental ::
+ * A handle to an opaque @FT_Incremental handle provided by the client
+ * application.
+ *
+ * data ::
+ * A structure describing the glyph data bytes (which will be accessed
+ * as a read-only byte block).
+ *
+ */
+ typedef void
+ (*FT_Incremental_FreeGlyphDataFunc)( FT_Incremental incremental,
+ FT_Data* data );
+
+
+ /***************************************************************************
+ *
+ * @type:
+ * FT_Incremental_GetGlyphMetricsFunc
+ *
+ * @description:
+ * A function used to retrieve the basic metrics of a given glyph index
+ * before accessing its data. This is necessary because, in certain
+ * formats like TrueType, the metrics are stored in a different place from
+ * the glyph images proper.
+ *
+ * @input:
+ * incremental ::
+ * A handle to an opaque @FT_Incremental handle provided by the client
+ * application.
+ *
+ * glyph_index ::
+ * Index of relevant glyph.
+ *
+ * vertical ::
+ * If true, return vertical metrics.
+ *
+ * ametrics ::
+ * This parameter is used for both input and output.
+ * The original glyph metrics, if any, in font units. If metrics are
+ * not available all the values must be set to zero.
+ *
+ * @output:
+ * ametrics ::
+ * The replacement glyph metrics in font units.
+ *
+ */
+ typedef FT_Error
+ (*FT_Incremental_GetGlyphMetricsFunc)
+ ( FT_Incremental incremental,
+ FT_UInt glyph_index,
+ FT_Bool vertical,
+ FT_Incremental_MetricsRec *ametrics );
+
+
+ /**************************************************************************
+ *
+ * @struct:
+ * FT_Incremental_FuncsRec
+ *
+ * @description:
+ * A table of functions for accessing fonts that load data
+ * incrementally. Used in @FT_Incremental_InterfaceRec.
+ *
+ * @fields:
+ * get_glyph_data ::
+ * The function to get glyph data. Must not be null.
+ *
+ * free_glyph_data ::
+ * The function to release glyph data. Must not be null.
+ *
+ * get_glyph_metrics ::
+ * The function to get glyph metrics. May be null if the font does
+ * not provide overriding glyph metrics.
+ *
+ */
+ typedef struct FT_Incremental_FuncsRec_
+ {
+ FT_Incremental_GetGlyphDataFunc get_glyph_data;
+ FT_Incremental_FreeGlyphDataFunc free_glyph_data;
+ FT_Incremental_GetGlyphMetricsFunc get_glyph_metrics;
+
+ } FT_Incremental_FuncsRec;
+
+
+ /***************************************************************************
+ *
+ * @struct:
+ * FT_Incremental_InterfaceRec
+ *
+ * @description:
+ * A structure to be used with @FT_Open_Face to indicate that the user
+ * wants to support incremental glyph loading. You should use it with
+ * @FT_PARAM_TAG_INCREMENTAL as in the following example:
+ *
+ * {
+ * FT_Incremental_InterfaceRec inc_int;
+ * FT_Parameter parameter;
+ * FT_Open_Args open_args;
+ *
+ *
+ * // set up incremental descriptor
+ * inc_int.funcs = my_funcs;
+ * inc_int.object = my_object;
+ *
+ * // set up optional parameter
+ * parameter.tag = FT_PARAM_TAG_INCREMENTAL;
+ * parameter.data = &inc_int;
+ *
+ * // set up FT_Open_Args structure
+ * open_args.flags = FT_OPEN_PATHNAME | FT_OPEN_PARAMS;
+ * open_args.pathname = my_font_pathname;
+ * open_args.num_params = 1;
+ * open_args.params = &parameter; // we use one optional argument
+ *
+ * // open the font
+ * error = FT_Open_Face( library, &open_args, index, &face );
+ * ...
+ * }
+ *
+ */
+ typedef struct FT_Incremental_InterfaceRec_
+ {
+ const FT_Incremental_FuncsRec* funcs;
+ FT_Incremental object;
+
+ } FT_Incremental_InterfaceRec;
+
+
+ /***************************************************************************
+ *
+ * @type:
+ * FT_Incremental_Interface
+ *
+ * @description:
+ * A pointer to an @FT_Incremental_InterfaceRec structure.
+ *
+ */
+ typedef FT_Incremental_InterfaceRec* FT_Incremental_Interface;
+
+
+ /***************************************************************************
+ *
+ * @constant:
+ * FT_PARAM_TAG_INCREMENTAL
+ *
+ * @description:
+ * A constant used as the tag of @FT_Parameter structures to indicate
+ * an incremental loading object to be used by FreeType.
+ *
+ */
+#define FT_PARAM_TAG_INCREMENTAL FT_MAKE_TAG( 'i', 'n', 'c', 'r' )
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __FTINCREM_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftlcdfil.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftlcdfil.h
new file mode 100644
index 0000000000..042f98396e
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftlcdfil.h
@@ -0,0 +1,251 @@
+/***************************************************************************/
+/* */
+/* ftlcdfil.h */
+/* */
+/* FreeType API for color filtering of subpixel bitmap glyphs */
+/* (specification). */
+/* */
+/* Copyright 2006, 2007, 2008, 2010 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FT_LCD_FILTER_H__
+#define __FT_LCD_FILTER_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+ /***************************************************************************
+ *
+ * @section:
+ * lcd_filtering
+ *
+ * @title:
+ * LCD Filtering
+ *
+ * @abstract:
+ * Reduce color fringes of LCD-optimized bitmaps.
+ *
+ * @description:
+ * The @FT_Library_SetLcdFilter API can be used to specify a low-pass
+ * filter which is then applied to LCD-optimized bitmaps generated
+ * through @FT_Render_Glyph. This is useful to reduce color fringes
+ * which would occur with unfiltered rendering.
+ *
+ * Note that no filter is active by default, and that this function is
+ * *not* implemented in default builds of the library. You need to
+ * #define FT_CONFIG_OPTION_SUBPIXEL_RENDERING in your `ftoption.h' file
+ * in order to activate it.
+ *
+ * FreeType generates alpha coverage maps, which are linear by nature.
+ * For instance, the value 0x80 in bitmap representation means that
+ * (within numerical precision) 0x80/0xff fraction of that pixel is
+ * covered by the glyph's outline. The blending function for placing
+ * text over a background is
+ *
+ * {
+ * dst = alpha * src + (1 - alpha) * dst ,
+ * }
+ *
+ * which is known as OVER. However, when calculating the output of the
+ * OVER operator, the source colors should first be transformed to a
+ * linear color space, then alpha blended in that space, and transformed
+ * back to the output color space.
+ *
+ * When linear light blending is used, the default FIR5 filtering
+ * weights (as given by FT_LCD_FILTER_DEFAULT) are no longer optimal, as
+ * they have been designed for black on white rendering while lacking
+ * gamma correction. To preserve color neutrality, weights for a FIR5
+ * filter should be chosen according to two free parameters `a' and `c',
+ * and the FIR weights should be
+ *
+ * {
+ * [a - c, a + c, 2 * a, a + c, a - c] .
+ * }
+ *
+ * This formula generates equal weights for all the color primaries
+ * across the filter kernel, which makes it colorless. One suggested
+ * set of weights is
+ *
+ * {
+ * [0x10, 0x50, 0x60, 0x50, 0x10] ,
+ * }
+ *
+ * where `a' has value 0x30 and `b' value 0x20. The weights in filter
+ * may have a sum larger than 0x100, which increases coloration slightly
+ * but also improves contrast.
+ */
+
+
+ /****************************************************************************
+ *
+ * @enum:
+ * FT_LcdFilter
+ *
+ * @description:
+ * A list of values to identify various types of LCD filters.
+ *
+ * @values:
+ * FT_LCD_FILTER_NONE ::
+ * Do not perform filtering. When used with subpixel rendering, this
+ * results in sometimes severe color fringes.
+ *
+ * FT_LCD_FILTER_DEFAULT ::
+ * The default filter reduces color fringes considerably, at the cost
+ * of a slight blurriness in the output.
+ *
+ * FT_LCD_FILTER_LIGHT ::
+ * The light filter is a variant that produces less blurriness at the
+ * cost of slightly more color fringes than the default one. It might
+ * be better, depending on taste, your monitor, or your personal vision.
+ *
+ * FT_LCD_FILTER_LEGACY ::
+ * This filter corresponds to the original libXft color filter. It
+ * provides high contrast output but can exhibit really bad color
+ * fringes if glyphs are not extremely well hinted to the pixel grid.
+ * In other words, it only works well if the TrueType bytecode
+ * interpreter is enabled *and* high-quality hinted fonts are used.
+ *
+ * This filter is only provided for comparison purposes, and might be
+ * disabled or stay unsupported in the future.
+ *
+ * @since:
+ * 2.3.0
+ */
+ typedef enum FT_LcdFilter_
+ {
+ FT_LCD_FILTER_NONE = 0,
+ FT_LCD_FILTER_DEFAULT = 1,
+ FT_LCD_FILTER_LIGHT = 2,
+ FT_LCD_FILTER_LEGACY = 16,
+
+ FT_LCD_FILTER_MAX /* do not remove */
+
+ } FT_LcdFilter;
+
+
+ /**************************************************************************
+ *
+ * @func:
+ * FT_Library_SetLcdFilter
+ *
+ * @description:
+ * This function is used to apply color filtering to LCD decimated
+ * bitmaps, like the ones used when calling @FT_Render_Glyph with
+ * @FT_RENDER_MODE_LCD or @FT_RENDER_MODE_LCD_V.
+ *
+ * @input:
+ * library ::
+ * A handle to the target library instance.
+ *
+ * filter ::
+ * The filter type.
+ *
+ * You can use @FT_LCD_FILTER_NONE here to disable this feature, or
+ * @FT_LCD_FILTER_DEFAULT to use a default filter that should work
+ * well on most LCD screens.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * This feature is always disabled by default. Clients must make an
+ * explicit call to this function with a `filter' value other than
+ * @FT_LCD_FILTER_NONE in order to enable it.
+ *
+ * Due to *PATENTS* covering subpixel rendering, this function doesn't
+ * do anything except returning `FT_Err_Unimplemented_Feature' if the
+ * configuration macro FT_CONFIG_OPTION_SUBPIXEL_RENDERING is not
+ * defined in your build of the library, which should correspond to all
+ * default builds of FreeType.
+ *
+ * The filter affects glyph bitmaps rendered through @FT_Render_Glyph,
+ * @FT_Outline_Get_Bitmap, @FT_Load_Glyph, and @FT_Load_Char.
+ *
+ * It does _not_ affect the output of @FT_Outline_Render and
+ * @FT_Outline_Get_Bitmap.
+ *
+ * If this feature is activated, the dimensions of LCD glyph bitmaps are
+ * either larger or taller than the dimensions of the corresponding
+ * outline with regards to the pixel grid. For example, for
+ * @FT_RENDER_MODE_LCD, the filter adds up to 3~pixels to the left, and
+ * up to 3~pixels to the right.
+ *
+ * The bitmap offset values are adjusted correctly, so clients shouldn't
+ * need to modify their layout and glyph positioning code when enabling
+ * the filter.
+ *
+ * @since:
+ * 2.3.0
+ */
+ FT_EXPORT( FT_Error )
+ FT_Library_SetLcdFilter( FT_Library library,
+ FT_LcdFilter filter );
+
+
+ /**************************************************************************
+ *
+ * @func:
+ * FT_Library_SetLcdFilterWeights
+ *
+ * @description:
+ * Use this function to override the filter weights selected by
+ * @FT_Library_SetLcdFilter. By default, FreeType uses the quintuple
+ * (0x00, 0x55, 0x56, 0x55, 0x00) for FT_LCD_FILTER_LIGHT, and (0x10,
+ * 0x40, 0x70, 0x40, 0x10) for FT_LCD_FILTER_DEFAULT and
+ * FT_LCD_FILTER_LEGACY.
+ *
+ * @input:
+ * library ::
+ * A handle to the target library instance.
+ *
+ * weights ::
+ * A pointer to an array; the function copies the first five bytes and
+ * uses them to specify the filter weights.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * Due to *PATENTS* covering subpixel rendering, this function doesn't
+ * do anything except returning `FT_Err_Unimplemented_Feature' if the
+ * configuration macro FT_CONFIG_OPTION_SUBPIXEL_RENDERING is not
+ * defined in your build of the library, which should correspond to all
+ * default builds of FreeType.
+ *
+ * This function must be called after @FT_Library_SetLcdFilter to have
+ * any effect.
+ *
+ * @since:
+ * 2.4.0
+ */
+ FT_EXPORT( FT_Error )
+ FT_Library_SetLcdFilterWeights( FT_Library library,
+ unsigned char *weights );
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FT_LCD_FILTER_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftlist.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftlist.h
new file mode 100644
index 0000000000..8b18978bcd
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftlist.h
@@ -0,0 +1,277 @@
+/***************************************************************************/
+/* */
+/* ftlist.h */
+/* */
+/* Generic list support for FreeType (specification). */
+/* */
+/* Copyright 1996-2001, 2003, 2007, 2010 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* This file implements functions relative to list processing. Its */
+ /* data structures are defined in `freetype.h'. */
+ /* */
+ /*************************************************************************/
+
+
+#ifndef __FTLIST_H__
+#define __FTLIST_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* list_processing */
+ /* */
+ /* <Title> */
+ /* List Processing */
+ /* */
+ /* <Abstract> */
+ /* Simple management of lists. */
+ /* */
+ /* <Description> */
+ /* This section contains various definitions related to list */
+ /* processing using doubly-linked nodes. */
+ /* */
+ /* <Order> */
+ /* FT_List */
+ /* FT_ListNode */
+ /* FT_ListRec */
+ /* FT_ListNodeRec */
+ /* */
+ /* FT_List_Add */
+ /* FT_List_Insert */
+ /* FT_List_Find */
+ /* FT_List_Remove */
+ /* FT_List_Up */
+ /* FT_List_Iterate */
+ /* FT_List_Iterator */
+ /* FT_List_Finalize */
+ /* FT_List_Destructor */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_List_Find */
+ /* */
+ /* <Description> */
+ /* Find the list node for a given listed object. */
+ /* */
+ /* <Input> */
+ /* list :: A pointer to the parent list. */
+ /* data :: The address of the listed object. */
+ /* */
+ /* <Return> */
+ /* List node. NULL if it wasn't found. */
+ /* */
+ FT_EXPORT( FT_ListNode )
+ FT_List_Find( FT_List list,
+ void* data );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_List_Add */
+ /* */
+ /* <Description> */
+ /* Append an element to the end of a list. */
+ /* */
+ /* <InOut> */
+ /* list :: A pointer to the parent list. */
+ /* node :: The node to append. */
+ /* */
+ FT_EXPORT( void )
+ FT_List_Add( FT_List list,
+ FT_ListNode node );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_List_Insert */
+ /* */
+ /* <Description> */
+ /* Insert an element at the head of a list. */
+ /* */
+ /* <InOut> */
+ /* list :: A pointer to parent list. */
+ /* node :: The node to insert. */
+ /* */
+ FT_EXPORT( void )
+ FT_List_Insert( FT_List list,
+ FT_ListNode node );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_List_Remove */
+ /* */
+ /* <Description> */
+ /* Remove a node from a list. This function doesn't check whether */
+ /* the node is in the list! */
+ /* */
+ /* <Input> */
+ /* node :: The node to remove. */
+ /* */
+ /* <InOut> */
+ /* list :: A pointer to the parent list. */
+ /* */
+ FT_EXPORT( void )
+ FT_List_Remove( FT_List list,
+ FT_ListNode node );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_List_Up */
+ /* */
+ /* <Description> */
+ /* Move a node to the head/top of a list. Used to maintain LRU */
+ /* lists. */
+ /* */
+ /* <InOut> */
+ /* list :: A pointer to the parent list. */
+ /* node :: The node to move. */
+ /* */
+ FT_EXPORT( void )
+ FT_List_Up( FT_List list,
+ FT_ListNode node );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_List_Iterator */
+ /* */
+ /* <Description> */
+ /* An FT_List iterator function which is called during a list parse */
+ /* by @FT_List_Iterate. */
+ /* */
+ /* <Input> */
+ /* node :: The current iteration list node. */
+ /* */
+ /* user :: A typeless pointer passed to @FT_List_Iterate. */
+ /* Can be used to point to the iteration's state. */
+ /* */
+ typedef FT_Error
+ (*FT_List_Iterator)( FT_ListNode node,
+ void* user );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_List_Iterate */
+ /* */
+ /* <Description> */
+ /* Parse a list and calls a given iterator function on each element. */
+ /* Note that parsing is stopped as soon as one of the iterator calls */
+ /* returns a non-zero value. */
+ /* */
+ /* <Input> */
+ /* list :: A handle to the list. */
+ /* iterator :: An iterator function, called on each node of the list. */
+ /* user :: A user-supplied field which is passed as the second */
+ /* argument to the iterator. */
+ /* */
+ /* <Return> */
+ /* The result (a FreeType error code) of the last iterator call. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_List_Iterate( FT_List list,
+ FT_List_Iterator iterator,
+ void* user );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_List_Destructor */
+ /* */
+ /* <Description> */
+ /* An @FT_List iterator function which is called during a list */
+ /* finalization by @FT_List_Finalize to destroy all elements in a */
+ /* given list. */
+ /* */
+ /* <Input> */
+ /* system :: The current system object. */
+ /* */
+ /* data :: The current object to destroy. */
+ /* */
+ /* user :: A typeless pointer passed to @FT_List_Iterate. It can */
+ /* be used to point to the iteration's state. */
+ /* */
+ typedef void
+ (*FT_List_Destructor)( FT_Memory memory,
+ void* data,
+ void* user );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_List_Finalize */
+ /* */
+ /* <Description> */
+ /* Destroy all elements in the list as well as the list itself. */
+ /* */
+ /* <Input> */
+ /* list :: A handle to the list. */
+ /* */
+ /* destroy :: A list destructor that will be applied to each element */
+ /* of the list. */
+ /* */
+ /* memory :: The current memory object which handles deallocation. */
+ /* */
+ /* user :: A user-supplied field which is passed as the last */
+ /* argument to the destructor. */
+ /* */
+ /* <Note> */
+ /* This function expects that all nodes added by @FT_List_Add or */
+ /* @FT_List_Insert have been dynamically allocated. */
+ /* */
+ FT_EXPORT( void )
+ FT_List_Finalize( FT_List list,
+ FT_List_Destructor destroy,
+ FT_Memory memory,
+ void* user );
+
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTLIST_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftlzw.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftlzw.h
new file mode 100644
index 0000000000..5bb4a82247
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftlzw.h
@@ -0,0 +1,99 @@
+/***************************************************************************/
+/* */
+/* ftlzw.h */
+/* */
+/* LZW-compressed stream support. */
+/* */
+/* Copyright 2004, 2006 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTLZW_H__
+#define __FTLZW_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* lzw */
+ /* */
+ /* <Title> */
+ /* LZW Streams */
+ /* */
+ /* <Abstract> */
+ /* Using LZW-compressed font files. */
+ /* */
+ /* <Description> */
+ /* This section contains the declaration of LZW-specific functions. */
+ /* */
+ /*************************************************************************/
+
+ /************************************************************************
+ *
+ * @function:
+ * FT_Stream_OpenLZW
+ *
+ * @description:
+ * Open a new stream to parse LZW-compressed font files. This is
+ * mainly used to support the compressed `*.pcf.Z' fonts that come
+ * with XFree86.
+ *
+ * @input:
+ * stream :: The target embedding stream.
+ *
+ * source :: The source stream.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * The source stream must be opened _before_ calling this function.
+ *
+ * Calling the internal function `FT_Stream_Close' on the new stream will
+ * *not* call `FT_Stream_Close' on the source stream. None of the stream
+ * objects will be released to the heap.
+ *
+ * The stream implementation is very basic and resets the decompression
+ * process each time seeking backwards is needed within the stream
+ *
+ * In certain builds of the library, LZW compression recognition is
+ * automatically handled when calling @FT_New_Face or @FT_Open_Face.
+ * This means that if no font driver is capable of handling the raw
+ * compressed file, the library will try to open a LZW stream from it
+ * and re-open the face with it.
+ *
+ * This function may return `FT_Err_Unimplemented_Feature' if your build
+ * of FreeType was not compiled with LZW support.
+ */
+ FT_EXPORT( FT_Error )
+ FT_Stream_OpenLZW( FT_Stream stream,
+ FT_Stream source );
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTLZW_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftmac.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftmac.h
new file mode 100644
index 0000000000..f40f3fb9ee
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftmac.h
@@ -0,0 +1,274 @@
+/***************************************************************************/
+/* */
+/* ftmac.h */
+/* */
+/* Additional Mac-specific API. */
+/* */
+/* Copyright 1996-2001, 2004, 2006, 2007 by */
+/* Just van Rossum, David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+/***************************************************************************/
+/* */
+/* NOTE: Include this file after <freetype/freetype.h> and after any */
+/* Mac-specific headers (because this header uses Mac types such as */
+/* Handle, FSSpec, FSRef, etc.) */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTMAC_H__
+#define __FTMAC_H__
+
+
+#include "../ft2build.h"
+
+
+FT_BEGIN_HEADER
+
+
+/* gcc-3.4.1 and later can warn about functions tagged as deprecated */
+#ifndef FT_DEPRECATED_ATTRIBUTE
+#if defined(__GNUC__) && \
+ ((__GNUC__ >= 4) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 1)))
+#define FT_DEPRECATED_ATTRIBUTE __attribute__((deprecated))
+#else
+#define FT_DEPRECATED_ATTRIBUTE
+#endif
+#endif
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* mac_specific */
+ /* */
+ /* <Title> */
+ /* Mac Specific Interface */
+ /* */
+ /* <Abstract> */
+ /* Only available on the Macintosh. */
+ /* */
+ /* <Description> */
+ /* The following definitions are only available if FreeType is */
+ /* compiled on a Macintosh. */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_New_Face_From_FOND */
+ /* */
+ /* <Description> */
+ /* Create a new face object from a FOND resource. */
+ /* */
+ /* <InOut> */
+ /* library :: A handle to the library resource. */
+ /* */
+ /* <Input> */
+ /* fond :: A FOND resource. */
+ /* */
+ /* face_index :: Only supported for the -1 `sanity check' special */
+ /* case. */
+ /* */
+ /* <Output> */
+ /* aface :: A handle to a new face object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Notes> */
+ /* This function can be used to create @FT_Face objects from fonts */
+ /* that are installed in the system as follows. */
+ /* */
+ /* { */
+ /* fond = GetResource( 'FOND', fontName ); */
+ /* error = FT_New_Face_From_FOND( library, fond, 0, &face ); */
+ /* } */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_New_Face_From_FOND( FT_Library library,
+ Handle fond,
+ FT_Long face_index,
+ FT_Face *aface )
+ FT_DEPRECATED_ATTRIBUTE;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_GetFile_From_Mac_Name */
+ /* */
+ /* <Description> */
+ /* Return an FSSpec for the disk file containing the named font. */
+ /* */
+ /* <Input> */
+ /* fontName :: Mac OS name of the font (e.g., Times New Roman */
+ /* Bold). */
+ /* */
+ /* <Output> */
+ /* pathSpec :: FSSpec to the file. For passing to */
+ /* @FT_New_Face_From_FSSpec. */
+ /* */
+ /* face_index :: Index of the face. For passing to */
+ /* @FT_New_Face_From_FSSpec. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_GetFile_From_Mac_Name( const char* fontName,
+ FSSpec* pathSpec,
+ FT_Long* face_index )
+ FT_DEPRECATED_ATTRIBUTE;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_GetFile_From_Mac_ATS_Name */
+ /* */
+ /* <Description> */
+ /* Return an FSSpec for the disk file containing the named font. */
+ /* */
+ /* <Input> */
+ /* fontName :: Mac OS name of the font in ATS framework. */
+ /* */
+ /* <Output> */
+ /* pathSpec :: FSSpec to the file. For passing to */
+ /* @FT_New_Face_From_FSSpec. */
+ /* */
+ /* face_index :: Index of the face. For passing to */
+ /* @FT_New_Face_From_FSSpec. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_GetFile_From_Mac_ATS_Name( const char* fontName,
+ FSSpec* pathSpec,
+ FT_Long* face_index )
+ FT_DEPRECATED_ATTRIBUTE;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_GetFilePath_From_Mac_ATS_Name */
+ /* */
+ /* <Description> */
+ /* Return a pathname of the disk file and face index for given font */
+ /* name which is handled by ATS framework. */
+ /* */
+ /* <Input> */
+ /* fontName :: Mac OS name of the font in ATS framework. */
+ /* */
+ /* <Output> */
+ /* path :: Buffer to store pathname of the file. For passing */
+ /* to @FT_New_Face. The client must allocate this */
+ /* buffer before calling this function. */
+ /* */
+ /* maxPathSize :: Lengths of the buffer `path' that client allocated. */
+ /* */
+ /* face_index :: Index of the face. For passing to @FT_New_Face. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_GetFilePath_From_Mac_ATS_Name( const char* fontName,
+ UInt8* path,
+ UInt32 maxPathSize,
+ FT_Long* face_index )
+ FT_DEPRECATED_ATTRIBUTE;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_New_Face_From_FSSpec */
+ /* */
+ /* <Description> */
+ /* Create a new face object from a given resource and typeface index */
+ /* using an FSSpec to the font file. */
+ /* */
+ /* <InOut> */
+ /* library :: A handle to the library resource. */
+ /* */
+ /* <Input> */
+ /* spec :: FSSpec to the font file. */
+ /* */
+ /* face_index :: The index of the face within the resource. The */
+ /* first face has index~0. */
+ /* <Output> */
+ /* aface :: A handle to a new face object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* @FT_New_Face_From_FSSpec is identical to @FT_New_Face except */
+ /* it accepts an FSSpec instead of a path. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_New_Face_From_FSSpec( FT_Library library,
+ const FSSpec *spec,
+ FT_Long face_index,
+ FT_Face *aface )
+ FT_DEPRECATED_ATTRIBUTE;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_New_Face_From_FSRef */
+ /* */
+ /* <Description> */
+ /* Create a new face object from a given resource and typeface index */
+ /* using an FSRef to the font file. */
+ /* */
+ /* <InOut> */
+ /* library :: A handle to the library resource. */
+ /* */
+ /* <Input> */
+ /* spec :: FSRef to the font file. */
+ /* */
+ /* face_index :: The index of the face within the resource. The */
+ /* first face has index~0. */
+ /* <Output> */
+ /* aface :: A handle to a new face object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* @FT_New_Face_From_FSRef is identical to @FT_New_Face except */
+ /* it accepts an FSRef instead of a path. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_New_Face_From_FSRef( FT_Library library,
+ const FSRef *ref,
+ FT_Long face_index,
+ FT_Face *aface )
+ FT_DEPRECATED_ATTRIBUTE;
+
+ /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __FTMAC_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftmm.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftmm.h
new file mode 100644
index 0000000000..52aaf44375
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftmm.h
@@ -0,0 +1,378 @@
+/***************************************************************************/
+/* */
+/* ftmm.h */
+/* */
+/* FreeType Multiple Master font interface (specification). */
+/* */
+/* Copyright 1996-2001, 2003, 2004, 2006, 2009 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTMM_H__
+#define __FTMM_H__
+
+
+#include "../ft2build.h"
+#include "t1tables.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* multiple_masters */
+ /* */
+ /* <Title> */
+ /* Multiple Masters */
+ /* */
+ /* <Abstract> */
+ /* How to manage Multiple Masters fonts. */
+ /* */
+ /* <Description> */
+ /* The following types and functions are used to manage Multiple */
+ /* Master fonts, i.e., the selection of specific design instances by */
+ /* setting design axis coordinates. */
+ /* */
+ /* George Williams has extended this interface to make it work with */
+ /* both Type~1 Multiple Masters fonts and GX distortable (var) */
+ /* fonts. Some of these routines only work with MM fonts, others */
+ /* will work with both types. They are similar enough that a */
+ /* consistent interface makes sense. */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_MM_Axis */
+ /* */
+ /* <Description> */
+ /* A simple structure used to model a given axis in design space for */
+ /* Multiple Masters fonts. */
+ /* */
+ /* This structure can't be used for GX var fonts. */
+ /* */
+ /* <Fields> */
+ /* name :: The axis's name. */
+ /* */
+ /* minimum :: The axis's minimum design coordinate. */
+ /* */
+ /* maximum :: The axis's maximum design coordinate. */
+ /* */
+ typedef struct FT_MM_Axis_
+ {
+ FT_String* name;
+ FT_Long minimum;
+ FT_Long maximum;
+
+ } FT_MM_Axis;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Multi_Master */
+ /* */
+ /* <Description> */
+ /* A structure used to model the axes and space of a Multiple Masters */
+ /* font. */
+ /* */
+ /* This structure can't be used for GX var fonts. */
+ /* */
+ /* <Fields> */
+ /* num_axis :: Number of axes. Cannot exceed~4. */
+ /* */
+ /* num_designs :: Number of designs; should be normally 2^num_axis */
+ /* even though the Type~1 specification strangely */
+ /* allows for intermediate designs to be present. This */
+ /* number cannot exceed~16. */
+ /* */
+ /* axis :: A table of axis descriptors. */
+ /* */
+ typedef struct FT_Multi_Master_
+ {
+ FT_UInt num_axis;
+ FT_UInt num_designs;
+ FT_MM_Axis axis[T1_MAX_MM_AXIS];
+
+ } FT_Multi_Master;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Var_Axis */
+ /* */
+ /* <Description> */
+ /* A simple structure used to model a given axis in design space for */
+ /* Multiple Masters and GX var fonts. */
+ /* */
+ /* <Fields> */
+ /* name :: The axis's name. */
+ /* Not always meaningful for GX. */
+ /* */
+ /* minimum :: The axis's minimum design coordinate. */
+ /* */
+ /* def :: The axis's default design coordinate. */
+ /* FreeType computes meaningful default values for MM; it */
+ /* is then an integer value, not in 16.16 format. */
+ /* */
+ /* maximum :: The axis's maximum design coordinate. */
+ /* */
+ /* tag :: The axis's tag (the GX equivalent to `name'). */
+ /* FreeType provides default values for MM if possible. */
+ /* */
+ /* strid :: The entry in `name' table (another GX version of */
+ /* `name'). */
+ /* Not meaningful for MM. */
+ /* */
+ typedef struct FT_Var_Axis_
+ {
+ FT_String* name;
+
+ FT_Fixed minimum;
+ FT_Fixed def;
+ FT_Fixed maximum;
+
+ FT_ULong tag;
+ FT_UInt strid;
+
+ } FT_Var_Axis;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Var_Named_Style */
+ /* */
+ /* <Description> */
+ /* A simple structure used to model a named style in a GX var font. */
+ /* */
+ /* This structure can't be used for MM fonts. */
+ /* */
+ /* <Fields> */
+ /* coords :: The design coordinates for this style. */
+ /* This is an array with one entry for each axis. */
+ /* */
+ /* strid :: The entry in `name' table identifying this style. */
+ /* */
+ typedef struct FT_Var_Named_Style_
+ {
+ FT_Fixed* coords;
+ FT_UInt strid;
+
+ } FT_Var_Named_Style;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_MM_Var */
+ /* */
+ /* <Description> */
+ /* A structure used to model the axes and space of a Multiple Masters */
+ /* or GX var distortable font. */
+ /* */
+ /* Some fields are specific to one format and not to the other. */
+ /* */
+ /* <Fields> */
+ /* num_axis :: The number of axes. The maximum value is~4 for */
+ /* MM; no limit in GX. */
+ /* */
+ /* num_designs :: The number of designs; should be normally */
+ /* 2^num_axis for MM fonts. Not meaningful for GX */
+ /* (where every glyph could have a different */
+ /* number of designs). */
+ /* */
+ /* num_namedstyles :: The number of named styles; only meaningful for */
+ /* GX which allows certain design coordinates to */
+ /* have a string ID (in the `name' table) */
+ /* associated with them. The font can tell the */
+ /* user that, for example, Weight=1.5 is `Bold'. */
+ /* */
+ /* axis :: A table of axis descriptors. */
+ /* GX fonts contain slightly more data than MM. */
+ /* */
+ /* namedstyles :: A table of named styles. */
+ /* Only meaningful with GX. */
+ /* */
+ typedef struct FT_MM_Var_
+ {
+ FT_UInt num_axis;
+ FT_UInt num_designs;
+ FT_UInt num_namedstyles;
+ FT_Var_Axis* axis;
+ FT_Var_Named_Style* namedstyle;
+
+ } FT_MM_Var;
+
+
+ /* */
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_Multi_Master */
+ /* */
+ /* <Description> */
+ /* Retrieve the Multiple Master descriptor of a given font. */
+ /* */
+ /* This function can't be used with GX fonts. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the source face. */
+ /* */
+ /* <Output> */
+ /* amaster :: The Multiple Masters descriptor. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Get_Multi_Master( FT_Face face,
+ FT_Multi_Master *amaster );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_MM_Var */
+ /* */
+ /* <Description> */
+ /* Retrieve the Multiple Master/GX var descriptor of a given font. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the source face. */
+ /* */
+ /* <Output> */
+ /* amaster :: The Multiple Masters/GX var descriptor. */
+ /* Allocates a data structure, which the user must free */
+ /* (a single call to FT_FREE will do it). */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Get_MM_Var( FT_Face face,
+ FT_MM_Var* *amaster );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Set_MM_Design_Coordinates */
+ /* */
+ /* <Description> */
+ /* For Multiple Masters fonts, choose an interpolated font design */
+ /* through design coordinates. */
+ /* */
+ /* This function can't be used with GX fonts. */
+ /* */
+ /* <InOut> */
+ /* face :: A handle to the source face. */
+ /* */
+ /* <Input> */
+ /* num_coords :: The number of design coordinates (must be equal to */
+ /* the number of axes in the font). */
+ /* */
+ /* coords :: An array of design coordinates. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Set_MM_Design_Coordinates( FT_Face face,
+ FT_UInt num_coords,
+ FT_Long* coords );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Set_Var_Design_Coordinates */
+ /* */
+ /* <Description> */
+ /* For Multiple Master or GX Var fonts, choose an interpolated font */
+ /* design through design coordinates. */
+ /* */
+ /* <InOut> */
+ /* face :: A handle to the source face. */
+ /* */
+ /* <Input> */
+ /* num_coords :: The number of design coordinates (must be equal to */
+ /* the number of axes in the font). */
+ /* */
+ /* coords :: An array of design coordinates. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Set_Var_Design_Coordinates( FT_Face face,
+ FT_UInt num_coords,
+ FT_Fixed* coords );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Set_MM_Blend_Coordinates */
+ /* */
+ /* <Description> */
+ /* For Multiple Masters and GX var fonts, choose an interpolated font */
+ /* design through normalized blend coordinates. */
+ /* */
+ /* <InOut> */
+ /* face :: A handle to the source face. */
+ /* */
+ /* <Input> */
+ /* num_coords :: The number of design coordinates (must be equal to */
+ /* the number of axes in the font). */
+ /* */
+ /* coords :: The design coordinates array (each element must be */
+ /* between 0 and 1.0). */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Set_MM_Blend_Coordinates( FT_Face face,
+ FT_UInt num_coords,
+ FT_Fixed* coords );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Set_Var_Blend_Coordinates */
+ /* */
+ /* <Description> */
+ /* This is another name of @FT_Set_MM_Blend_Coordinates. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Set_Var_Blend_Coordinates( FT_Face face,
+ FT_UInt num_coords,
+ FT_Fixed* coords );
+
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTMM_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftmodapi.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftmodapi.h
new file mode 100644
index 0000000000..f12c0a933f
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftmodapi.h
@@ -0,0 +1,641 @@
+/***************************************************************************/
+/* */
+/* ftmodapi.h */
+/* */
+/* FreeType modules public interface (specification). */
+/* */
+/* Copyright 1996-2003, 2006, 2008-2010, 2012, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTMODAPI_H__
+#define __FTMODAPI_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* module_management */
+ /* */
+ /* <Title> */
+ /* Module Management */
+ /* */
+ /* <Abstract> */
+ /* How to add, upgrade, remove, and control modules from FreeType. */
+ /* */
+ /* <Description> */
+ /* The definitions below are used to manage modules within FreeType. */
+ /* Modules can be added, upgraded, and removed at runtime. */
+ /* Additionally, some module properties can be controlled also. */
+ /* */
+ /* Here is a list of possible values of the `module_name' field in */
+ /* the @FT_Module_Class structure. */
+ /* */
+ /* { */
+ /* autofitter */
+ /* bdf */
+ /* cff */
+ /* gxvalid */
+ /* otvalid */
+ /* pcf */
+ /* pfr */
+ /* psaux */
+ /* pshinter */
+ /* psnames */
+ /* raster1, raster5 */
+ /* sfnt */
+ /* smooth, smooth-lcd, smooth-lcdv */
+ /* truetype */
+ /* type1 */
+ /* type42 */
+ /* t1cid */
+ /* winfonts */
+ /* } */
+ /* */
+ /* Note that the FreeType Cache sub-system is not a FreeType module. */
+ /* */
+ /*************************************************************************/
+
+
+ /* module bit flags */
+#define FT_MODULE_FONT_DRIVER 1 /* this module is a font driver */
+#define FT_MODULE_RENDERER 2 /* this module is a renderer */
+#define FT_MODULE_HINTER 4 /* this module is a glyph hinter */
+#define FT_MODULE_STYLER 8 /* this module is a styler */
+
+#define FT_MODULE_DRIVER_SCALABLE 0x100 /* the driver supports */
+ /* scalable fonts */
+#define FT_MODULE_DRIVER_NO_OUTLINES 0x200 /* the driver does not */
+ /* support vector outlines */
+#define FT_MODULE_DRIVER_HAS_HINTER 0x400 /* the driver provides its */
+ /* own hinter */
+
+
+ /* deprecated values */
+#define ft_module_font_driver FT_MODULE_FONT_DRIVER
+#define ft_module_renderer FT_MODULE_RENDERER
+#define ft_module_hinter FT_MODULE_HINTER
+#define ft_module_styler FT_MODULE_STYLER
+
+#define ft_module_driver_scalable FT_MODULE_DRIVER_SCALABLE
+#define ft_module_driver_no_outlines FT_MODULE_DRIVER_NO_OUTLINES
+#define ft_module_driver_has_hinter FT_MODULE_DRIVER_HAS_HINTER
+
+
+ typedef FT_Pointer FT_Module_Interface;
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_Module_Constructor */
+ /* */
+ /* <Description> */
+ /* A function used to initialize (not create) a new module object. */
+ /* */
+ /* <Input> */
+ /* module :: The module to initialize. */
+ /* */
+ typedef FT_Error
+ (*FT_Module_Constructor)( FT_Module module );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_Module_Destructor */
+ /* */
+ /* <Description> */
+ /* A function used to finalize (not destroy) a given module object. */
+ /* */
+ /* <Input> */
+ /* module :: The module to finalize. */
+ /* */
+ typedef void
+ (*FT_Module_Destructor)( FT_Module module );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_Module_Requester */
+ /* */
+ /* <Description> */
+ /* A function used to query a given module for a specific interface. */
+ /* */
+ /* <Input> */
+ /* module :: The module to be searched. */
+ /* */
+ /* name :: The name of the interface in the module. */
+ /* */
+ typedef FT_Module_Interface
+ (*FT_Module_Requester)( FT_Module module,
+ const char* name );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Module_Class */
+ /* */
+ /* <Description> */
+ /* The module class descriptor. */
+ /* */
+ /* <Fields> */
+ /* module_flags :: Bit flags describing the module. */
+ /* */
+ /* module_size :: The size of one module object/instance in */
+ /* bytes. */
+ /* */
+ /* module_name :: The name of the module. */
+ /* */
+ /* module_version :: The version, as a 16.16 fixed number */
+ /* (major.minor). */
+ /* */
+ /* module_requires :: The version of FreeType this module requires, */
+ /* as a 16.16 fixed number (major.minor). Starts */
+ /* at version 2.0, i.e., 0x20000. */
+ /* */
+ /* module_init :: The initializing function. */
+ /* */
+ /* module_done :: The finalizing function. */
+ /* */
+ /* get_interface :: The interface requesting function. */
+ /* */
+ typedef struct FT_Module_Class_
+ {
+ FT_ULong module_flags;
+ FT_Long module_size;
+ const FT_String* module_name;
+ FT_Fixed module_version;
+ FT_Fixed module_requires;
+
+ const void* module_interface;
+
+ FT_Module_Constructor module_init;
+ FT_Module_Destructor module_done;
+ FT_Module_Requester get_interface;
+
+ } FT_Module_Class;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Add_Module */
+ /* */
+ /* <Description> */
+ /* Add a new module to a given library instance. */
+ /* */
+ /* <InOut> */
+ /* library :: A handle to the library object. */
+ /* */
+ /* <Input> */
+ /* clazz :: A pointer to class descriptor for the module. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* An error will be returned if a module already exists by that name, */
+ /* or if the module requires a version of FreeType that is too great. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Add_Module( FT_Library library,
+ const FT_Module_Class* clazz );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_Module */
+ /* */
+ /* <Description> */
+ /* Find a module by its name. */
+ /* */
+ /* <Input> */
+ /* library :: A handle to the library object. */
+ /* */
+ /* module_name :: The module's name (as an ASCII string). */
+ /* */
+ /* <Return> */
+ /* A module handle. 0~if none was found. */
+ /* */
+ /* <Note> */
+ /* FreeType's internal modules aren't documented very well, and you */
+ /* should look up the source code for details. */
+ /* */
+ FT_EXPORT( FT_Module )
+ FT_Get_Module( FT_Library library,
+ const char* module_name );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Remove_Module */
+ /* */
+ /* <Description> */
+ /* Remove a given module from a library instance. */
+ /* */
+ /* <InOut> */
+ /* library :: A handle to a library object. */
+ /* */
+ /* <Input> */
+ /* module :: A handle to a module object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* The module object is destroyed by the function in case of success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Remove_Module( FT_Library library,
+ FT_Module module );
+
+
+ /**********************************************************************
+ *
+ * @function:
+ * FT_Property_Set
+ *
+ * @description:
+ * Set a property for a given module.
+ *
+ * @input:
+ * library ::
+ * A handle to the library the module is part of.
+ *
+ * module_name ::
+ * The module name.
+ *
+ * property_name ::
+ * The property name. Properties are described in the `Synopsis'
+ * subsection of the module's documentation.
+ *
+ * Note that only a few modules have properties.
+ *
+ * value ::
+ * A generic pointer to a variable or structure which gives the new
+ * value of the property. The exact definition of `value' is
+ * dependent on the property; see the `Synopsis' subsection of the
+ * module's documentation.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * If `module_name' isn't a valid module name, or `property_name'
+ * doesn't specify a valid property, or if `value' doesn't represent a
+ * valid value for the given property, an error is returned.
+ *
+ * The following example sets property `bar' (a simple integer) in
+ * module `foo' to value~1.
+ *
+ * {
+ * FT_UInt bar;
+ *
+ *
+ * bar = 1;
+ * FT_Property_Set( library, "foo", "bar", &bar );
+ * }
+ *
+ * Note that the FreeType Cache sub-system doesn't recognize module
+ * property changes. To avoid glyph lookup confusion within the cache
+ * you should call @FTC_Manager_Reset to completely flush the cache if
+ * a module property gets changed after @FTC_Manager_New has been
+ * called.
+ *
+ * It is not possible to set properties of the FreeType Cache
+ * sub-system itself with FT_Property_Set; use @FTC_Property_Set
+ * instead.
+ *
+ * @since:
+ * 2.4.11
+ *
+ */
+ FT_EXPORT( FT_Error )
+ FT_Property_Set( FT_Library library,
+ const FT_String* module_name,
+ const FT_String* property_name,
+ const void* value );
+
+
+ /**********************************************************************
+ *
+ * @function:
+ * FT_Property_Get
+ *
+ * @description:
+ * Get a module's property value.
+ *
+ * @input:
+ * library ::
+ * A handle to the library the module is part of.
+ *
+ * module_name ::
+ * The module name.
+ *
+ * property_name ::
+ * The property name. Properties are described in the `Synopsis'
+ * subsection of the module's documentation.
+ *
+ * @inout:
+ * value ::
+ * A generic pointer to a variable or structure which gives the
+ * value of the property. The exact definition of `value' is
+ * dependent on the property; see the `Synopsis' subsection of the
+ * module's documentation.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * If `module_name' isn't a valid module name, or `property_name'
+ * doesn't specify a valid property, or if `value' doesn't represent a
+ * valid value for the given property, an error is returned.
+ *
+ * The following example gets property `baz' (a range) in module `foo'.
+ *
+ * {
+ * typedef range_
+ * {
+ * FT_Int32 min;
+ * FT_Int32 max;
+ *
+ * } range;
+ *
+ * range baz;
+ *
+ *
+ * FT_Property_Get( library, "foo", "baz", &baz );
+ * }
+ *
+ * It is not possible to retrieve properties of the FreeType Cache
+ * sub-system with FT_Property_Get; use @FTC_Property_Get instead.
+ *
+ * @since:
+ * 2.4.11
+ *
+ */
+ FT_EXPORT( FT_Error )
+ FT_Property_Get( FT_Library library,
+ const FT_String* module_name,
+ const FT_String* property_name,
+ void* value );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Reference_Library */
+ /* */
+ /* <Description> */
+ /* A counter gets initialized to~1 at the time an @FT_Library */
+ /* structure is created. This function increments the counter. */
+ /* @FT_Done_Library then only destroys a library if the counter is~1, */
+ /* otherwise it simply decrements the counter. */
+ /* */
+ /* This function helps in managing life-cycles of structures which */
+ /* reference @FT_Library objects. */
+ /* */
+ /* <Input> */
+ /* library :: A handle to a target library object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Since> */
+ /* 2.4.2 */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Reference_Library( FT_Library library );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_New_Library */
+ /* */
+ /* <Description> */
+ /* This function is used to create a new FreeType library instance */
+ /* from a given memory object. It is thus possible to use libraries */
+ /* with distinct memory allocators within the same program. */
+ /* */
+ /* Normally, you would call this function (followed by a call to */
+ /* @FT_Add_Default_Modules or a series of calls to @FT_Add_Module) */
+ /* instead of @FT_Init_FreeType to initialize the FreeType library. */
+ /* */
+ /* Don't use @FT_Done_FreeType but @FT_Done_Library to destroy a */
+ /* library instance. */
+ /* */
+ /* <Input> */
+ /* memory :: A handle to the original memory object. */
+ /* */
+ /* <Output> */
+ /* alibrary :: A pointer to handle of a new library object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* See the discussion of reference counters in the description of */
+ /* @FT_Reference_Library. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_New_Library( FT_Memory memory,
+ FT_Library *alibrary );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Done_Library */
+ /* */
+ /* <Description> */
+ /* Discard a given library object. This closes all drivers and */
+ /* discards all resource objects. */
+ /* */
+ /* <Input> */
+ /* library :: A handle to the target library. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* See the discussion of reference counters in the description of */
+ /* @FT_Reference_Library. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Done_Library( FT_Library library );
+
+/* */
+
+ typedef void
+ (*FT_DebugHook_Func)( void* arg );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Set_Debug_Hook */
+ /* */
+ /* <Description> */
+ /* Set a debug hook function for debugging the interpreter of a font */
+ /* format. */
+ /* */
+ /* <InOut> */
+ /* library :: A handle to the library object. */
+ /* */
+ /* <Input> */
+ /* hook_index :: The index of the debug hook. You should use the */
+ /* values defined in `ftobjs.h', e.g., */
+ /* `FT_DEBUG_HOOK_TRUETYPE'. */
+ /* */
+ /* debug_hook :: The function used to debug the interpreter. */
+ /* */
+ /* <Note> */
+ /* Currently, four debug hook slots are available, but only two (for */
+ /* the TrueType and the Type~1 interpreter) are defined. */
+ /* */
+ /* Since the internal headers of FreeType are no longer installed, */
+ /* the symbol `FT_DEBUG_HOOK_TRUETYPE' isn't available publicly. */
+ /* This is a bug and will be fixed in a forthcoming release. */
+ /* */
+ FT_EXPORT( void )
+ FT_Set_Debug_Hook( FT_Library library,
+ FT_UInt hook_index,
+ FT_DebugHook_Func debug_hook );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Add_Default_Modules */
+ /* */
+ /* <Description> */
+ /* Add the set of default drivers to a given library object. */
+ /* This is only useful when you create a library object with */
+ /* @FT_New_Library (usually to plug a custom memory manager). */
+ /* */
+ /* <InOut> */
+ /* library :: A handle to a new library object. */
+ /* */
+ FT_EXPORT( void )
+ FT_Add_Default_Modules( FT_Library library );
+
+
+
+ /**************************************************************************
+ *
+ * @section:
+ * truetype_engine
+ *
+ * @title:
+ * The TrueType Engine
+ *
+ * @abstract:
+ * TrueType bytecode support.
+ *
+ * @description:
+ * This section contains a function used to query the level of TrueType
+ * bytecode support compiled in this version of the library.
+ *
+ */
+
+
+ /**************************************************************************
+ *
+ * @enum:
+ * FT_TrueTypeEngineType
+ *
+ * @description:
+ * A list of values describing which kind of TrueType bytecode
+ * engine is implemented in a given FT_Library instance. It is used
+ * by the @FT_Get_TrueType_Engine_Type function.
+ *
+ * @values:
+ * FT_TRUETYPE_ENGINE_TYPE_NONE ::
+ * The library doesn't implement any kind of bytecode interpreter.
+ *
+ * FT_TRUETYPE_ENGINE_TYPE_UNPATENTED ::
+ * The library implements a bytecode interpreter that doesn't
+ * support the patented operations of the TrueType virtual machine.
+ *
+ * Its main use is to load certain Asian fonts which position and
+ * scale glyph components with bytecode instructions. It produces
+ * bad output for most other fonts.
+ *
+ * FT_TRUETYPE_ENGINE_TYPE_PATENTED ::
+ * The library implements a bytecode interpreter that covers
+ * the full instruction set of the TrueType virtual machine (this
+ * was governed by patents until May 2010, hence the name).
+ *
+ * @since:
+ * 2.2
+ *
+ */
+ typedef enum FT_TrueTypeEngineType_
+ {
+ FT_TRUETYPE_ENGINE_TYPE_NONE = 0,
+ FT_TRUETYPE_ENGINE_TYPE_UNPATENTED,
+ FT_TRUETYPE_ENGINE_TYPE_PATENTED
+
+ } FT_TrueTypeEngineType;
+
+
+ /**************************************************************************
+ *
+ * @func:
+ * FT_Get_TrueType_Engine_Type
+ *
+ * @description:
+ * Return an @FT_TrueTypeEngineType value to indicate which level of
+ * the TrueType virtual machine a given library instance supports.
+ *
+ * @input:
+ * library ::
+ * A library instance.
+ *
+ * @return:
+ * A value indicating which level is supported.
+ *
+ * @since:
+ * 2.2
+ *
+ */
+ FT_EXPORT( FT_TrueTypeEngineType )
+ FT_Get_TrueType_Engine_Type( FT_Library library );
+
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTMODAPI_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftmoderr.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftmoderr.h
new file mode 100644
index 0000000000..4ca851ed98
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftmoderr.h
@@ -0,0 +1,194 @@
+/***************************************************************************/
+/* */
+/* ftmoderr.h */
+/* */
+/* FreeType module error offsets (specification). */
+/* */
+/* Copyright 2001-2005, 2010, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* This file is used to define the FreeType module error codes. */
+ /* */
+ /* If the macro FT_CONFIG_OPTION_USE_MODULE_ERRORS in `ftoption.h' is */
+ /* set, the lower byte of an error value identifies the error code as */
+ /* usual. In addition, the higher byte identifies the module. For */
+ /* example, the error `FT_Err_Invalid_File_Format' has value 0x0003, the */
+ /* error `TT_Err_Invalid_File_Format' has value 0x1303, the error */
+ /* `T1_Err_Invalid_File_Format' has value 0x1403, etc. */
+ /* */
+ /* Note that `FT_Err_Ok', `TT_Err_Ok', etc. are always equal to zero, */
+ /* including the high byte. */
+ /* */
+ /* If FT_CONFIG_OPTION_USE_MODULE_ERRORS isn't set, the higher byte of */
+ /* an error value is set to zero. */
+ /* */
+ /* To hide the various `XXX_Err_' prefixes in the source code, FreeType */
+ /* provides some macros in `fttypes.h'. */
+ /* */
+ /* FT_ERR( err ) */
+ /* Add current error module prefix (as defined with the */
+ /* `FT_ERR_PREFIX' macro) to `err'. For example, in the BDF module */
+ /* the line */
+ /* */
+ /* error = FT_ERR( Invalid_Outline ); */
+ /* */
+ /* expands to */
+ /* */
+ /* error = BDF_Err_Invalid_Outline; */
+ /* */
+ /* For simplicity, you can always use `FT_Err_Ok' directly instead */
+ /* of `FT_ERR( Ok )'. */
+ /* */
+ /* FT_ERR_EQ( errcode, err ) */
+ /* FT_ERR_NEQ( errcode, err ) */
+ /* Compare error code `errcode' with the error `err' for equality */
+ /* and inequality, respectively. Example: */
+ /* */
+ /* if ( FT_ERR_EQ( error, Invalid_Outline ) ) */
+ /* ... */
+ /* */
+ /* Using this macro you don't have to think about error prefixes. */
+ /* Of course, if module errors are not active, the above example is */
+ /* the same as */
+ /* */
+ /* if ( error == FT_Err_Invalid_Outline ) */
+ /* ... */
+ /* */
+ /* FT_ERROR_BASE( errcode ) */
+ /* FT_ERROR_MODULE( errcode ) */
+ /* Get base error and module error code, respectively. */
+ /* */
+ /* */
+ /* It can also be used to create a module error message table easily */
+ /* with something like */
+ /* */
+ /* { */
+ /* #undef __FTMODERR_H__ */
+ /* #define FT_MODERRDEF( e, v, s ) { FT_Mod_Err_ ## e, s }, */
+ /* #define FT_MODERR_START_LIST { */
+ /* #define FT_MODERR_END_LIST { 0, 0 } }; */
+ /* */
+ /* const struct */
+ /* { */
+ /* int mod_err_offset; */
+ /* const char* mod_err_msg */
+ /* } ft_mod_errors[] = */
+ /* */
+ /* #include "ftmoderr.h" */
+ /* } */
+ /* */
+ /*************************************************************************/
+
+
+#ifndef __FTMODERR_H__
+#define __FTMODERR_H__
+
+
+ /*******************************************************************/
+ /*******************************************************************/
+ /***** *****/
+ /***** SETUP MACROS *****/
+ /***** *****/
+ /*******************************************************************/
+ /*******************************************************************/
+
+
+#undef FT_NEED_EXTERN_C
+
+#ifndef FT_MODERRDEF
+
+#ifdef FT_CONFIG_OPTION_USE_MODULE_ERRORS
+#define FT_MODERRDEF( e, v, s ) FT_Mod_Err_ ## e = v,
+#else
+#define FT_MODERRDEF( e, v, s ) FT_Mod_Err_ ## e = 0,
+#endif
+
+#define FT_MODERR_START_LIST enum {
+#define FT_MODERR_END_LIST FT_Mod_Err_Max };
+
+#ifdef __cplusplus
+#define FT_NEED_EXTERN_C
+ extern "C" {
+#endif
+
+#endif /* !FT_MODERRDEF */
+
+
+ /*******************************************************************/
+ /*******************************************************************/
+ /***** *****/
+ /***** LIST MODULE ERROR BASES *****/
+ /***** *****/
+ /*******************************************************************/
+ /*******************************************************************/
+
+
+#ifdef FT_MODERR_START_LIST
+ FT_MODERR_START_LIST
+#endif
+
+
+ FT_MODERRDEF( Base, 0x000, "base module" )
+ FT_MODERRDEF( Autofit, 0x100, "autofitter module" )
+ FT_MODERRDEF( BDF, 0x200, "BDF module" )
+ FT_MODERRDEF( Bzip2, 0x300, "Bzip2 module" )
+ FT_MODERRDEF( Cache, 0x400, "cache module" )
+ FT_MODERRDEF( CFF, 0x500, "CFF module" )
+ FT_MODERRDEF( CID, 0x600, "CID module" )
+ FT_MODERRDEF( Gzip, 0x700, "Gzip module" )
+ FT_MODERRDEF( LZW, 0x800, "LZW module" )
+ FT_MODERRDEF( OTvalid, 0x900, "OpenType validation module" )
+ FT_MODERRDEF( PCF, 0xA00, "PCF module" )
+ FT_MODERRDEF( PFR, 0xB00, "PFR module" )
+ FT_MODERRDEF( PSaux, 0xC00, "PS auxiliary module" )
+ FT_MODERRDEF( PShinter, 0xD00, "PS hinter module" )
+ FT_MODERRDEF( PSnames, 0xE00, "PS names module" )
+ FT_MODERRDEF( Raster, 0xF00, "raster module" )
+ FT_MODERRDEF( SFNT, 0x1000, "SFNT module" )
+ FT_MODERRDEF( Smooth, 0x1100, "smooth raster module" )
+ FT_MODERRDEF( TrueType, 0x1200, "TrueType module" )
+ FT_MODERRDEF( Type1, 0x1300, "Type 1 module" )
+ FT_MODERRDEF( Type42, 0x1400, "Type 42 module" )
+ FT_MODERRDEF( Winfonts, 0x1500, "Windows FON/FNT module" )
+ FT_MODERRDEF( GXvalid, 0x1600, "GX validation module" )
+
+
+#ifdef FT_MODERR_END_LIST
+ FT_MODERR_END_LIST
+#endif
+
+
+ /*******************************************************************/
+ /*******************************************************************/
+ /***** *****/
+ /***** CLEANUP *****/
+ /***** *****/
+ /*******************************************************************/
+ /*******************************************************************/
+
+
+#ifdef FT_NEED_EXTERN_C
+ }
+#endif
+
+#undef FT_MODERR_START_LIST
+#undef FT_MODERR_END_LIST
+#undef FT_MODERRDEF
+#undef FT_NEED_EXTERN_C
+
+
+#endif /* __FTMODERR_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftotval.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftotval.h
new file mode 100644
index 0000000000..e33e307c15
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftotval.h
@@ -0,0 +1,203 @@
+/***************************************************************************/
+/* */
+/* ftotval.h */
+/* */
+/* FreeType API for validating OpenType tables (specification). */
+/* */
+/* Copyright 2004, 2005, 2006, 2007 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+/***************************************************************************/
+/* */
+/* */
+/* Warning: This module might be moved to a different library in the */
+/* future to avoid a tight dependency between FreeType and the */
+/* OpenType specification. */
+/* */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTOTVAL_H__
+#define __FTOTVAL_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* ot_validation */
+ /* */
+ /* <Title> */
+ /* OpenType Validation */
+ /* */
+ /* <Abstract> */
+ /* An API to validate OpenType tables. */
+ /* */
+ /* <Description> */
+ /* This section contains the declaration of functions to validate */
+ /* some OpenType tables (BASE, GDEF, GPOS, GSUB, JSTF, MATH). */
+ /* */
+ /*************************************************************************/
+
+
+ /**********************************************************************
+ *
+ * @enum:
+ * FT_VALIDATE_OTXXX
+ *
+ * @description:
+ * A list of bit-field constants used with @FT_OpenType_Validate to
+ * indicate which OpenType tables should be validated.
+ *
+ * @values:
+ * FT_VALIDATE_BASE ::
+ * Validate BASE table.
+ *
+ * FT_VALIDATE_GDEF ::
+ * Validate GDEF table.
+ *
+ * FT_VALIDATE_GPOS ::
+ * Validate GPOS table.
+ *
+ * FT_VALIDATE_GSUB ::
+ * Validate GSUB table.
+ *
+ * FT_VALIDATE_JSTF ::
+ * Validate JSTF table.
+ *
+ * FT_VALIDATE_MATH ::
+ * Validate MATH table.
+ *
+ * FT_VALIDATE_OT ::
+ * Validate all OpenType tables (BASE, GDEF, GPOS, GSUB, JSTF, MATH).
+ *
+ */
+#define FT_VALIDATE_BASE 0x0100
+#define FT_VALIDATE_GDEF 0x0200
+#define FT_VALIDATE_GPOS 0x0400
+#define FT_VALIDATE_GSUB 0x0800
+#define FT_VALIDATE_JSTF 0x1000
+#define FT_VALIDATE_MATH 0x2000
+
+#define FT_VALIDATE_OT FT_VALIDATE_BASE | \
+ FT_VALIDATE_GDEF | \
+ FT_VALIDATE_GPOS | \
+ FT_VALIDATE_GSUB | \
+ FT_VALIDATE_JSTF | \
+ FT_VALIDATE_MATH
+
+ /* */
+
+ /**********************************************************************
+ *
+ * @function:
+ * FT_OpenType_Validate
+ *
+ * @description:
+ * Validate various OpenType tables to assure that all offsets and
+ * indices are valid. The idea is that a higher-level library which
+ * actually does the text layout can access those tables without
+ * error checking (which can be quite time consuming).
+ *
+ * @input:
+ * face ::
+ * A handle to the input face.
+ *
+ * validation_flags ::
+ * A bit field which specifies the tables to be validated. See
+ * @FT_VALIDATE_OTXXX for possible values.
+ *
+ * @output:
+ * BASE_table ::
+ * A pointer to the BASE table.
+ *
+ * GDEF_table ::
+ * A pointer to the GDEF table.
+ *
+ * GPOS_table ::
+ * A pointer to the GPOS table.
+ *
+ * GSUB_table ::
+ * A pointer to the GSUB table.
+ *
+ * JSTF_table ::
+ * A pointer to the JSTF table.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * This function only works with OpenType fonts, returning an error
+ * otherwise.
+ *
+ * After use, the application should deallocate the five tables with
+ * @FT_OpenType_Free. A NULL value indicates that the table either
+ * doesn't exist in the font, or the application hasn't asked for
+ * validation.
+ */
+ FT_EXPORT( FT_Error )
+ FT_OpenType_Validate( FT_Face face,
+ FT_UInt validation_flags,
+ FT_Bytes *BASE_table,
+ FT_Bytes *GDEF_table,
+ FT_Bytes *GPOS_table,
+ FT_Bytes *GSUB_table,
+ FT_Bytes *JSTF_table );
+
+ /* */
+
+ /**********************************************************************
+ *
+ * @function:
+ * FT_OpenType_Free
+ *
+ * @description:
+ * Free the buffer allocated by OpenType validator.
+ *
+ * @input:
+ * face ::
+ * A handle to the input face.
+ *
+ * table ::
+ * The pointer to the buffer that is allocated by
+ * @FT_OpenType_Validate.
+ *
+ * @note:
+ * This function must be used to free the buffer allocated by
+ * @FT_OpenType_Validate only.
+ */
+ FT_EXPORT( void )
+ FT_OpenType_Free( FT_Face face,
+ FT_Bytes table );
+
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTOTVAL_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftoutln.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftoutln.h
new file mode 100644
index 0000000000..ca94947af5
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftoutln.h
@@ -0,0 +1,560 @@
+/***************************************************************************/
+/* */
+/* ftoutln.h */
+/* */
+/* Support for the FT_Outline type used to store glyph shapes of */
+/* most scalable font formats (specification). */
+/* */
+/* Copyright 1996-2003, 2005-2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTOUTLN_H__
+#define __FTOUTLN_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* outline_processing */
+ /* */
+ /* <Title> */
+ /* Outline Processing */
+ /* */
+ /* <Abstract> */
+ /* Functions to create, transform, and render vectorial glyph images. */
+ /* */
+ /* <Description> */
+ /* This section contains routines used to create and destroy scalable */
+ /* glyph images known as `outlines'. These can also be measured, */
+ /* transformed, and converted into bitmaps and pixmaps. */
+ /* */
+ /* <Order> */
+ /* FT_Outline */
+ /* FT_OUTLINE_FLAGS */
+ /* FT_Outline_New */
+ /* FT_Outline_Done */
+ /* FT_Outline_Copy */
+ /* FT_Outline_Translate */
+ /* FT_Outline_Transform */
+ /* FT_Outline_Embolden */
+ /* FT_Outline_EmboldenXY */
+ /* FT_Outline_Reverse */
+ /* FT_Outline_Check */
+ /* */
+ /* FT_Outline_Get_CBox */
+ /* FT_Outline_Get_BBox */
+ /* */
+ /* FT_Outline_Get_Bitmap */
+ /* FT_Outline_Render */
+ /* */
+ /* FT_Outline_Decompose */
+ /* FT_Outline_Funcs */
+ /* FT_Outline_MoveTo_Func */
+ /* FT_Outline_LineTo_Func */
+ /* FT_Outline_ConicTo_Func */
+ /* FT_Outline_CubicTo_Func */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Outline_Decompose */
+ /* */
+ /* <Description> */
+ /* Walk over an outline's structure to decompose it into individual */
+ /* segments and Bézier arcs. This function also emits `move to' */
+ /* operations to indicate the start of new contours in the outline. */
+ /* */
+ /* <Input> */
+ /* outline :: A pointer to the source target. */
+ /* */
+ /* func_interface :: A table of `emitters', i.e., function pointers */
+ /* called during decomposition to indicate path */
+ /* operations. */
+ /* */
+ /* <InOut> */
+ /* user :: A typeless pointer which is passed to each */
+ /* emitter during the decomposition. It can be */
+ /* used to store the state during the */
+ /* decomposition. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Outline_Decompose( FT_Outline* outline,
+ const FT_Outline_Funcs* func_interface,
+ void* user );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Outline_New */
+ /* */
+ /* <Description> */
+ /* Create a new outline of a given size. */
+ /* */
+ /* <Input> */
+ /* library :: A handle to the library object from where the */
+ /* outline is allocated. Note however that the new */
+ /* outline will *not* necessarily be *freed*, when */
+ /* destroying the library, by @FT_Done_FreeType. */
+ /* */
+ /* numPoints :: The maximum number of points within the outline. */
+ /* Must be smaller than or equal to 0xFFFF (65535). */
+ /* */
+ /* numContours :: The maximum number of contours within the outline. */
+ /* This value must be in the range 0 to `numPoints'. */
+ /* */
+ /* <Output> */
+ /* anoutline :: A handle to the new outline. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* The reason why this function takes a `library' parameter is simply */
+ /* to use the library's memory allocator. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Outline_New( FT_Library library,
+ FT_UInt numPoints,
+ FT_Int numContours,
+ FT_Outline *anoutline );
+
+
+ FT_EXPORT( FT_Error )
+ FT_Outline_New_Internal( FT_Memory memory,
+ FT_UInt numPoints,
+ FT_Int numContours,
+ FT_Outline *anoutline );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Outline_Done */
+ /* */
+ /* <Description> */
+ /* Destroy an outline created with @FT_Outline_New. */
+ /* */
+ /* <Input> */
+ /* library :: A handle of the library object used to allocate the */
+ /* outline. */
+ /* */
+ /* outline :: A pointer to the outline object to be discarded. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* If the outline's `owner' field is not set, only the outline */
+ /* descriptor will be released. */
+ /* */
+ /* The reason why this function takes an `library' parameter is */
+ /* simply to use ft_mem_free(). */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Outline_Done( FT_Library library,
+ FT_Outline* outline );
+
+
+ FT_EXPORT( FT_Error )
+ FT_Outline_Done_Internal( FT_Memory memory,
+ FT_Outline* outline );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Outline_Check */
+ /* */
+ /* <Description> */
+ /* Check the contents of an outline descriptor. */
+ /* */
+ /* <Input> */
+ /* outline :: A handle to a source outline. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Outline_Check( FT_Outline* outline );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Outline_Get_CBox */
+ /* */
+ /* <Description> */
+ /* Return an outline's `control box'. The control box encloses all */
+ /* the outline's points, including Bézier control points. Though it */
+ /* coincides with the exact bounding box for most glyphs, it can be */
+ /* slightly larger in some situations (like when rotating an outline */
+ /* which contains Bézier outside arcs). */
+ /* */
+ /* Computing the control box is very fast, while getting the bounding */
+ /* box can take much more time as it needs to walk over all segments */
+ /* and arcs in the outline. To get the latter, you can use the */
+ /* `ftbbox' component which is dedicated to this single task. */
+ /* */
+ /* <Input> */
+ /* outline :: A pointer to the source outline descriptor. */
+ /* */
+ /* <Output> */
+ /* acbox :: The outline's control box. */
+ /* */
+ /* <Note> */
+ /* See @FT_Glyph_Get_CBox for a discussion of tricky fonts. */
+ /* */
+ FT_EXPORT( void )
+ FT_Outline_Get_CBox( const FT_Outline* outline,
+ FT_BBox *acbox );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Outline_Translate */
+ /* */
+ /* <Description> */
+ /* Apply a simple translation to the points of an outline. */
+ /* */
+ /* <InOut> */
+ /* outline :: A pointer to the target outline descriptor. */
+ /* */
+ /* <Input> */
+ /* xOffset :: The horizontal offset. */
+ /* */
+ /* yOffset :: The vertical offset. */
+ /* */
+ FT_EXPORT( void )
+ FT_Outline_Translate( const FT_Outline* outline,
+ FT_Pos xOffset,
+ FT_Pos yOffset );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Outline_Copy */
+ /* */
+ /* <Description> */
+ /* Copy an outline into another one. Both objects must have the */
+ /* same sizes (number of points & number of contours) when this */
+ /* function is called. */
+ /* */
+ /* <Input> */
+ /* source :: A handle to the source outline. */
+ /* */
+ /* <Output> */
+ /* target :: A handle to the target outline. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Outline_Copy( const FT_Outline* source,
+ FT_Outline *target );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Outline_Transform */
+ /* */
+ /* <Description> */
+ /* Apply a simple 2x2 matrix to all of an outline's points. Useful */
+ /* for applying rotations, slanting, flipping, etc. */
+ /* */
+ /* <InOut> */
+ /* outline :: A pointer to the target outline descriptor. */
+ /* */
+ /* <Input> */
+ /* matrix :: A pointer to the transformation matrix. */
+ /* */
+ /* <Note> */
+ /* You can use @FT_Outline_Translate if you need to translate the */
+ /* outline's points. */
+ /* */
+ FT_EXPORT( void )
+ FT_Outline_Transform( const FT_Outline* outline,
+ const FT_Matrix* matrix );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Outline_Embolden */
+ /* */
+ /* <Description> */
+ /* Embolden an outline. The new outline will be at most 4~times */
+ /* `strength' pixels wider and higher. You may think of the left and */
+ /* bottom borders as unchanged. */
+ /* */
+ /* Negative `strength' values to reduce the outline thickness are */
+ /* possible also. */
+ /* */
+ /* <InOut> */
+ /* outline :: A handle to the target outline. */
+ /* */
+ /* <Input> */
+ /* strength :: How strong the glyph is emboldened. Expressed in */
+ /* 26.6 pixel format. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* The used algorithm to increase or decrease the thickness of the */
+ /* glyph doesn't change the number of points; this means that certain */
+ /* situations like acute angles or intersections are sometimes */
+ /* handled incorrectly. */
+ /* */
+ /* If you need `better' metrics values you should call */
+ /* @FT_Outline_Get_CBox or @FT_Outline_Get_BBox. */
+ /* */
+ /* Example call: */
+ /* */
+ /* { */
+ /* FT_Load_Glyph( face, index, FT_LOAD_DEFAULT ); */
+ /* if ( face->slot->format == FT_GLYPH_FORMAT_OUTLINE ) */
+ /* FT_Outline_Embolden( &face->slot->outline, strength ); */
+ /* } */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Outline_Embolden( FT_Outline* outline,
+ FT_Pos strength );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Outline_EmboldenXY */
+ /* */
+ /* <Description> */
+ /* Embolden an outline. The new outline will be `xstrength' pixels */
+ /* wider and `ystrength' pixels higher. Otherwise, it is similar to */
+ /* @FT_Outline_Embolden, which uses the same strength in both */
+ /* directions. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Outline_EmboldenXY( FT_Outline* outline,
+ FT_Pos xstrength,
+ FT_Pos ystrength );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Outline_Reverse */
+ /* */
+ /* <Description> */
+ /* Reverse the drawing direction of an outline. This is used to */
+ /* ensure consistent fill conventions for mirrored glyphs. */
+ /* */
+ /* <InOut> */
+ /* outline :: A pointer to the target outline descriptor. */
+ /* */
+ /* <Note> */
+ /* This function toggles the bit flag @FT_OUTLINE_REVERSE_FILL in */
+ /* the outline's `flags' field. */
+ /* */
+ /* It shouldn't be used by a normal client application, unless it */
+ /* knows what it is doing. */
+ /* */
+ FT_EXPORT( void )
+ FT_Outline_Reverse( FT_Outline* outline );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Outline_Get_Bitmap */
+ /* */
+ /* <Description> */
+ /* Render an outline within a bitmap. The outline's image is simply */
+ /* OR-ed to the target bitmap. */
+ /* */
+ /* <Input> */
+ /* library :: A handle to a FreeType library object. */
+ /* */
+ /* outline :: A pointer to the source outline descriptor. */
+ /* */
+ /* <InOut> */
+ /* abitmap :: A pointer to the target bitmap descriptor. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* This function does NOT CREATE the bitmap, it only renders an */
+ /* outline image within the one you pass to it! Consequently, the */
+ /* various fields in `abitmap' should be set accordingly. */
+ /* */
+ /* It will use the raster corresponding to the default glyph format. */
+ /* */
+ /* The value of the `num_grays' field in `abitmap' is ignored. If */
+ /* you select the gray-level rasterizer, and you want less than 256 */
+ /* gray levels, you have to use @FT_Outline_Render directly. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Outline_Get_Bitmap( FT_Library library,
+ FT_Outline* outline,
+ const FT_Bitmap *abitmap );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Outline_Render */
+ /* */
+ /* <Description> */
+ /* Render an outline within a bitmap using the current scan-convert. */
+ /* This function uses an @FT_Raster_Params structure as an argument, */
+ /* allowing advanced features like direct composition, translucency, */
+ /* etc. */
+ /* */
+ /* <Input> */
+ /* library :: A handle to a FreeType library object. */
+ /* */
+ /* outline :: A pointer to the source outline descriptor. */
+ /* */
+ /* <InOut> */
+ /* params :: A pointer to an @FT_Raster_Params structure used to */
+ /* describe the rendering operation. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* You should know what you are doing and how @FT_Raster_Params works */
+ /* to use this function. */
+ /* */
+ /* The field `params.source' will be set to `outline' before the scan */
+ /* converter is called, which means that the value you give to it is */
+ /* actually ignored. */
+ /* */
+ /* The gray-level rasterizer always uses 256 gray levels. If you */
+ /* want less gray levels, you have to provide your own span callback. */
+ /* See the @FT_RASTER_FLAG_DIRECT value of the `flags' field in the */
+ /* @FT_Raster_Params structure for more details. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Outline_Render( FT_Library library,
+ FT_Outline* outline,
+ FT_Raster_Params* params );
+
+
+ /**************************************************************************
+ *
+ * @enum:
+ * FT_Orientation
+ *
+ * @description:
+ * A list of values used to describe an outline's contour orientation.
+ *
+ * The TrueType and PostScript specifications use different conventions
+ * to determine whether outline contours should be filled or unfilled.
+ *
+ * @values:
+ * FT_ORIENTATION_TRUETYPE ::
+ * According to the TrueType specification, clockwise contours must
+ * be filled, and counter-clockwise ones must be unfilled.
+ *
+ * FT_ORIENTATION_POSTSCRIPT ::
+ * According to the PostScript specification, counter-clockwise contours
+ * must be filled, and clockwise ones must be unfilled.
+ *
+ * FT_ORIENTATION_FILL_RIGHT ::
+ * This is identical to @FT_ORIENTATION_TRUETYPE, but is used to
+ * remember that in TrueType, everything that is to the right of
+ * the drawing direction of a contour must be filled.
+ *
+ * FT_ORIENTATION_FILL_LEFT ::
+ * This is identical to @FT_ORIENTATION_POSTSCRIPT, but is used to
+ * remember that in PostScript, everything that is to the left of
+ * the drawing direction of a contour must be filled.
+ *
+ * FT_ORIENTATION_NONE ::
+ * The orientation cannot be determined. That is, different parts of
+ * the glyph have different orientation.
+ *
+ */
+ typedef enum FT_Orientation_
+ {
+ FT_ORIENTATION_TRUETYPE = 0,
+ FT_ORIENTATION_POSTSCRIPT = 1,
+ FT_ORIENTATION_FILL_RIGHT = FT_ORIENTATION_TRUETYPE,
+ FT_ORIENTATION_FILL_LEFT = FT_ORIENTATION_POSTSCRIPT,
+ FT_ORIENTATION_NONE
+
+ } FT_Orientation;
+
+
+ /**************************************************************************
+ *
+ * @function:
+ * FT_Outline_Get_Orientation
+ *
+ * @description:
+ * This function analyzes a glyph outline and tries to compute its
+ * fill orientation (see @FT_Orientation). This is done by computing
+ * the direction of each global horizontal and/or vertical extrema
+ * within the outline.
+ *
+ * Note that this will return @FT_ORIENTATION_TRUETYPE for empty
+ * outlines.
+ *
+ * @input:
+ * outline ::
+ * A handle to the source outline.
+ *
+ * @return:
+ * The orientation.
+ *
+ */
+ FT_EXPORT( FT_Orientation )
+ FT_Outline_Get_Orientation( FT_Outline* outline );
+
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTOUTLN_H__ */
+
+
+/* END */
+
+
+/* Local Variables: */
+/* coding: utf-8 */
+/* End: */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftpfr.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftpfr.h
new file mode 100644
index 0000000000..62cd67e876
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftpfr.h
@@ -0,0 +1,172 @@
+/***************************************************************************/
+/* */
+/* ftpfr.h */
+/* */
+/* FreeType API for accessing PFR-specific data (specification only). */
+/* */
+/* Copyright 2002, 2003, 2004, 2006, 2008, 2009 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTPFR_H__
+#define __FTPFR_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* pfr_fonts */
+ /* */
+ /* <Title> */
+ /* PFR Fonts */
+ /* */
+ /* <Abstract> */
+ /* PFR/TrueDoc specific API. */
+ /* */
+ /* <Description> */
+ /* This section contains the declaration of PFR-specific functions. */
+ /* */
+ /*************************************************************************/
+
+
+ /**********************************************************************
+ *
+ * @function:
+ * FT_Get_PFR_Metrics
+ *
+ * @description:
+ * Return the outline and metrics resolutions of a given PFR face.
+ *
+ * @input:
+ * face :: Handle to the input face. It can be a non-PFR face.
+ *
+ * @output:
+ * aoutline_resolution ::
+ * Outline resolution. This is equivalent to `face->units_per_EM'
+ * for non-PFR fonts. Optional (parameter can be NULL).
+ *
+ * ametrics_resolution ::
+ * Metrics resolution. This is equivalent to `outline_resolution'
+ * for non-PFR fonts. Optional (parameter can be NULL).
+ *
+ * ametrics_x_scale ::
+ * A 16.16 fixed-point number used to scale distance expressed
+ * in metrics units to device sub-pixels. This is equivalent to
+ * `face->size->x_scale', but for metrics only. Optional (parameter
+ * can be NULL).
+ *
+ * ametrics_y_scale ::
+ * Same as `ametrics_x_scale' but for the vertical direction.
+ * optional (parameter can be NULL).
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * If the input face is not a PFR, this function will return an error.
+ * However, in all cases, it will return valid values.
+ */
+ FT_EXPORT( FT_Error )
+ FT_Get_PFR_Metrics( FT_Face face,
+ FT_UInt *aoutline_resolution,
+ FT_UInt *ametrics_resolution,
+ FT_Fixed *ametrics_x_scale,
+ FT_Fixed *ametrics_y_scale );
+
+
+ /**********************************************************************
+ *
+ * @function:
+ * FT_Get_PFR_Kerning
+ *
+ * @description:
+ * Return the kerning pair corresponding to two glyphs in a PFR face.
+ * The distance is expressed in metrics units, unlike the result of
+ * @FT_Get_Kerning.
+ *
+ * @input:
+ * face :: A handle to the input face.
+ *
+ * left :: Index of the left glyph.
+ *
+ * right :: Index of the right glyph.
+ *
+ * @output:
+ * avector :: A kerning vector.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * This function always return distances in original PFR metrics
+ * units. This is unlike @FT_Get_Kerning with the @FT_KERNING_UNSCALED
+ * mode, which always returns distances converted to outline units.
+ *
+ * You can use the value of the `x_scale' and `y_scale' parameters
+ * returned by @FT_Get_PFR_Metrics to scale these to device sub-pixels.
+ */
+ FT_EXPORT( FT_Error )
+ FT_Get_PFR_Kerning( FT_Face face,
+ FT_UInt left,
+ FT_UInt right,
+ FT_Vector *avector );
+
+
+ /**********************************************************************
+ *
+ * @function:
+ * FT_Get_PFR_Advance
+ *
+ * @description:
+ * Return a given glyph advance, expressed in original metrics units,
+ * from a PFR font.
+ *
+ * @input:
+ * face :: A handle to the input face.
+ *
+ * gindex :: The glyph index.
+ *
+ * @output:
+ * aadvance :: The glyph advance in metrics units.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * You can use the `x_scale' or `y_scale' results of @FT_Get_PFR_Metrics
+ * to convert the advance to device sub-pixels (i.e., 1/64th of pixels).
+ */
+ FT_EXPORT( FT_Error )
+ FT_Get_PFR_Advance( FT_Face face,
+ FT_UInt gindex,
+ FT_Pos *aadvance );
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTPFR_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftrender.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftrender.h
new file mode 100644
index 0000000000..b1437df76f
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftrender.h
@@ -0,0 +1,238 @@
+/***************************************************************************/
+/* */
+/* ftrender.h */
+/* */
+/* FreeType renderer modules public interface (specification). */
+/* */
+/* Copyright 1996-2001, 2005, 2006, 2010 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTRENDER_H__
+#define __FTRENDER_H__
+
+
+#include "../ft2build.h"
+#include "ftmodapi.h"
+#include "ftglyph.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* module_management */
+ /* */
+ /*************************************************************************/
+
+
+ /* create a new glyph object */
+ typedef FT_Error
+ (*FT_Glyph_InitFunc)( FT_Glyph glyph,
+ FT_GlyphSlot slot );
+
+ /* destroys a given glyph object */
+ typedef void
+ (*FT_Glyph_DoneFunc)( FT_Glyph glyph );
+
+ typedef void
+ (*FT_Glyph_TransformFunc)( FT_Glyph glyph,
+ const FT_Matrix* matrix,
+ const FT_Vector* delta );
+
+ typedef void
+ (*FT_Glyph_GetBBoxFunc)( FT_Glyph glyph,
+ FT_BBox* abbox );
+
+ typedef FT_Error
+ (*FT_Glyph_CopyFunc)( FT_Glyph source,
+ FT_Glyph target );
+
+ typedef FT_Error
+ (*FT_Glyph_PrepareFunc)( FT_Glyph glyph,
+ FT_GlyphSlot slot );
+
+/* deprecated */
+#define FT_Glyph_Init_Func FT_Glyph_InitFunc
+#define FT_Glyph_Done_Func FT_Glyph_DoneFunc
+#define FT_Glyph_Transform_Func FT_Glyph_TransformFunc
+#define FT_Glyph_BBox_Func FT_Glyph_GetBBoxFunc
+#define FT_Glyph_Copy_Func FT_Glyph_CopyFunc
+#define FT_Glyph_Prepare_Func FT_Glyph_PrepareFunc
+
+
+ struct FT_Glyph_Class_
+ {
+ FT_Long glyph_size;
+ FT_Glyph_Format glyph_format;
+ FT_Glyph_InitFunc glyph_init;
+ FT_Glyph_DoneFunc glyph_done;
+ FT_Glyph_CopyFunc glyph_copy;
+ FT_Glyph_TransformFunc glyph_transform;
+ FT_Glyph_GetBBoxFunc glyph_bbox;
+ FT_Glyph_PrepareFunc glyph_prepare;
+ };
+
+
+ typedef FT_Error
+ (*FT_Renderer_RenderFunc)( FT_Renderer renderer,
+ FT_GlyphSlot slot,
+ FT_UInt mode,
+ const FT_Vector* origin );
+
+ typedef FT_Error
+ (*FT_Renderer_TransformFunc)( FT_Renderer renderer,
+ FT_GlyphSlot slot,
+ const FT_Matrix* matrix,
+ const FT_Vector* delta );
+
+
+ typedef void
+ (*FT_Renderer_GetCBoxFunc)( FT_Renderer renderer,
+ FT_GlyphSlot slot,
+ FT_BBox* cbox );
+
+
+ typedef FT_Error
+ (*FT_Renderer_SetModeFunc)( FT_Renderer renderer,
+ FT_ULong mode_tag,
+ FT_Pointer mode_ptr );
+
+/* deprecated identifiers */
+#define FTRenderer_render FT_Renderer_RenderFunc
+#define FTRenderer_transform FT_Renderer_TransformFunc
+#define FTRenderer_getCBox FT_Renderer_GetCBoxFunc
+#define FTRenderer_setMode FT_Renderer_SetModeFunc
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Renderer_Class */
+ /* */
+ /* <Description> */
+ /* The renderer module class descriptor. */
+ /* */
+ /* <Fields> */
+ /* root :: The root @FT_Module_Class fields. */
+ /* */
+ /* glyph_format :: The glyph image format this renderer handles. */
+ /* */
+ /* render_glyph :: A method used to render the image that is in a */
+ /* given glyph slot into a bitmap. */
+ /* */
+ /* transform_glyph :: A method used to transform the image that is in */
+ /* a given glyph slot. */
+ /* */
+ /* get_glyph_cbox :: A method used to access the glyph's cbox. */
+ /* */
+ /* set_mode :: A method used to pass additional parameters. */
+ /* */
+ /* raster_class :: For @FT_GLYPH_FORMAT_OUTLINE renderers only. */
+ /* This is a pointer to its raster's class. */
+ /* */
+ typedef struct FT_Renderer_Class_
+ {
+ FT_Module_Class root;
+
+ FT_Glyph_Format glyph_format;
+
+ FT_Renderer_RenderFunc render_glyph;
+ FT_Renderer_TransformFunc transform_glyph;
+ FT_Renderer_GetCBoxFunc get_glyph_cbox;
+ FT_Renderer_SetModeFunc set_mode;
+
+ FT_Raster_Funcs* raster_class;
+
+ } FT_Renderer_Class;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_Renderer */
+ /* */
+ /* <Description> */
+ /* Retrieve the current renderer for a given glyph format. */
+ /* */
+ /* <Input> */
+ /* library :: A handle to the library object. */
+ /* */
+ /* format :: The glyph format. */
+ /* */
+ /* <Return> */
+ /* A renderer handle. 0~if none found. */
+ /* */
+ /* <Note> */
+ /* An error will be returned if a module already exists by that name, */
+ /* or if the module requires a version of FreeType that is too great. */
+ /* */
+ /* To add a new renderer, simply use @FT_Add_Module. To retrieve a */
+ /* renderer by its name, use @FT_Get_Module. */
+ /* */
+ FT_EXPORT( FT_Renderer )
+ FT_Get_Renderer( FT_Library library,
+ FT_Glyph_Format format );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Set_Renderer */
+ /* */
+ /* <Description> */
+ /* Set the current renderer to use, and set additional mode. */
+ /* */
+ /* <InOut> */
+ /* library :: A handle to the library object. */
+ /* */
+ /* <Input> */
+ /* renderer :: A handle to the renderer object. */
+ /* */
+ /* num_params :: The number of additional parameters. */
+ /* */
+ /* parameters :: Additional parameters. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* In case of success, the renderer will be used to convert glyph */
+ /* images in the renderer's known format into bitmaps. */
+ /* */
+ /* This doesn't change the current renderer for other formats. */
+ /* */
+ /* Currently, only the B/W renderer, if compiled with */
+ /* FT_RASTER_OPTION_ANTI_ALIASING (providing a 5-levels */
+ /* anti-aliasing mode; this option must be set directly in */
+ /* `ftraster.c' and is undefined by default) accepts a single tag */
+ /* `pal5' to set its gray palette as a character string with */
+ /* 5~elements. Consequently, the third and fourth argument are zero */
+ /* normally. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Set_Renderer( FT_Library library,
+ FT_Renderer renderer,
+ FT_UInt num_params,
+ FT_Parameter* parameters );
+
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTRENDER_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftsizes.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftsizes.h
new file mode 100644
index 0000000000..a4b449bcdb
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftsizes.h
@@ -0,0 +1,159 @@
+/***************************************************************************/
+/* */
+/* ftsizes.h */
+/* */
+/* FreeType size objects management (specification). */
+/* */
+/* Copyright 1996-2001, 2003, 2004, 2006, 2009 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* Typical application would normally not need to use these functions. */
+ /* However, they have been placed in a public API for the rare cases */
+ /* where they are needed. */
+ /* */
+ /*************************************************************************/
+
+
+#ifndef __FTSIZES_H__
+#define __FTSIZES_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* sizes_management */
+ /* */
+ /* <Title> */
+ /* Size Management */
+ /* */
+ /* <Abstract> */
+ /* Managing multiple sizes per face. */
+ /* */
+ /* <Description> */
+ /* When creating a new face object (e.g., with @FT_New_Face), an */
+ /* @FT_Size object is automatically created and used to store all */
+ /* pixel-size dependent information, available in the `face->size' */
+ /* field. */
+ /* */
+ /* It is however possible to create more sizes for a given face, */
+ /* mostly in order to manage several character pixel sizes of the */
+ /* same font family and style. See @FT_New_Size and @FT_Done_Size. */
+ /* */
+ /* Note that @FT_Set_Pixel_Sizes and @FT_Set_Char_Size only */
+ /* modify the contents of the current `active' size; you thus need */
+ /* to use @FT_Activate_Size to change it. */
+ /* */
+ /* 99% of applications won't need the functions provided here, */
+ /* especially if they use the caching sub-system, so be cautious */
+ /* when using these. */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_New_Size */
+ /* */
+ /* <Description> */
+ /* Create a new size object from a given face object. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to a parent face object. */
+ /* */
+ /* <Output> */
+ /* asize :: A handle to a new size object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* You need to call @FT_Activate_Size in order to select the new size */
+ /* for upcoming calls to @FT_Set_Pixel_Sizes, @FT_Set_Char_Size, */
+ /* @FT_Load_Glyph, @FT_Load_Char, etc. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_New_Size( FT_Face face,
+ FT_Size* size );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Done_Size */
+ /* */
+ /* <Description> */
+ /* Discard a given size object. Note that @FT_Done_Face */
+ /* automatically discards all size objects allocated with */
+ /* @FT_New_Size. */
+ /* */
+ /* <Input> */
+ /* size :: A handle to a target size object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Done_Size( FT_Size size );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Activate_Size */
+ /* */
+ /* <Description> */
+ /* Even though it is possible to create several size objects for a */
+ /* given face (see @FT_New_Size for details), functions like */
+ /* @FT_Load_Glyph or @FT_Load_Char only use the one which has been */
+ /* activated last to determine the `current character pixel size'. */
+ /* */
+ /* This function can be used to `activate' a previously created size */
+ /* object. */
+ /* */
+ /* <Input> */
+ /* size :: A handle to a target size object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* If `face' is the size's parent face object, this function changes */
+ /* the value of `face->size' to the input size handle. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Activate_Size( FT_Size size );
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTSIZES_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftsnames.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftsnames.h
new file mode 100644
index 0000000000..a13db81187
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftsnames.h
@@ -0,0 +1,200 @@
+/***************************************************************************/
+/* */
+/* ftsnames.h */
+/* */
+/* Simple interface to access SFNT name tables (which are used */
+/* to hold font names, copyright info, notices, etc.) (specification). */
+/* */
+/* This is _not_ used to retrieve glyph names! */
+/* */
+/* Copyright 1996-2001, 2002, 2003, 2006, 2009, 2010 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FT_SFNT_NAMES_H__
+#define __FT_SFNT_NAMES_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* sfnt_names */
+ /* */
+ /* <Title> */
+ /* SFNT Names */
+ /* */
+ /* <Abstract> */
+ /* Access the names embedded in TrueType and OpenType files. */
+ /* */
+ /* <Description> */
+ /* The TrueType and OpenType specifications allow the inclusion of */
+ /* a special `names table' in font files. This table contains */
+ /* textual (and internationalized) information regarding the font, */
+ /* like family name, copyright, version, etc. */
+ /* */
+ /* The definitions below are used to access them if available. */
+ /* */
+ /* Note that this has nothing to do with glyph names! */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_SfntName */
+ /* */
+ /* <Description> */
+ /* A structure used to model an SFNT `name' table entry. */
+ /* */
+ /* <Fields> */
+ /* platform_id :: The platform ID for `string'. */
+ /* */
+ /* encoding_id :: The encoding ID for `string'. */
+ /* */
+ /* language_id :: The language ID for `string'. */
+ /* */
+ /* name_id :: An identifier for `string'. */
+ /* */
+ /* string :: The `name' string. Note that its format differs */
+ /* depending on the (platform,encoding) pair. It can */
+ /* be a Pascal String, a UTF-16 one, etc. */
+ /* */
+ /* Generally speaking, the string is not */
+ /* zero-terminated. Please refer to the TrueType */
+ /* specification for details. */
+ /* */
+ /* string_len :: The length of `string' in bytes. */
+ /* */
+ /* <Note> */
+ /* Possible values for `platform_id', `encoding_id', `language_id', */
+ /* and `name_id' are given in the file `ttnameid.h'. For details */
+ /* please refer to the TrueType or OpenType specification. */
+ /* */
+ /* See also @TT_PLATFORM_XXX, @TT_APPLE_ID_XXX, @TT_MAC_ID_XXX, */
+ /* @TT_ISO_ID_XXX, and @TT_MS_ID_XXX. */
+ /* */
+ typedef struct FT_SfntName_
+ {
+ FT_UShort platform_id;
+ FT_UShort encoding_id;
+ FT_UShort language_id;
+ FT_UShort name_id;
+
+ FT_Byte* string; /* this string is *not* null-terminated! */
+ FT_UInt string_len; /* in bytes */
+
+ } FT_SfntName;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_Sfnt_Name_Count */
+ /* */
+ /* <Description> */
+ /* Retrieve the number of name strings in the SFNT `name' table. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the source face. */
+ /* */
+ /* <Return> */
+ /* The number of strings in the `name' table. */
+ /* */
+ FT_EXPORT( FT_UInt )
+ FT_Get_Sfnt_Name_Count( FT_Face face );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_Sfnt_Name */
+ /* */
+ /* <Description> */
+ /* Retrieve a string of the SFNT `name' table for a given index. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the source face. */
+ /* */
+ /* idx :: The index of the `name' string. */
+ /* */
+ /* <Output> */
+ /* aname :: The indexed @FT_SfntName structure. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0~means success. */
+ /* */
+ /* <Note> */
+ /* The `string' array returned in the `aname' structure is not */
+ /* null-terminated. The application should deallocate it if it is no */
+ /* longer in use. */
+ /* */
+ /* Use @FT_Get_Sfnt_Name_Count to get the total number of available */
+ /* `name' table entries, then do a loop until you get the right */
+ /* platform, encoding, and name ID. */
+ /* */
+ FT_EXPORT( FT_Error )
+ FT_Get_Sfnt_Name( FT_Face face,
+ FT_UInt idx,
+ FT_SfntName *aname );
+
+
+ /***************************************************************************
+ *
+ * @constant:
+ * FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY
+ *
+ * @description:
+ * A constant used as the tag of @FT_Parameter structures to make
+ * FT_Open_Face() ignore preferred family subfamily names in `name'
+ * table since OpenType version 1.4. For backwards compatibility with
+ * legacy systems which has 4-face-per-family restriction.
+ *
+ */
+#define FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY FT_MAKE_TAG( 'i', 'g', 'p', 'f' )
+
+
+ /***************************************************************************
+ *
+ * @constant:
+ * FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY
+ *
+ * @description:
+ * A constant used as the tag of @FT_Parameter structures to make
+ * FT_Open_Face() ignore preferred subfamily names in `name' table since
+ * OpenType version 1.4. For backwards compatibility with legacy
+ * systems which has 4-face-per-family restriction.
+ *
+ */
+#define FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY FT_MAKE_TAG( 'i', 'g', 'p', 's' )
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FT_SFNT_NAMES_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftstroke.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftstroke.h
new file mode 100644
index 0000000000..05f9a132f6
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftstroke.h
@@ -0,0 +1,751 @@
+/***************************************************************************/
+/* */
+/* ftstroke.h */
+/* */
+/* FreeType path stroker (specification). */
+/* */
+/* Copyright 2002-2006, 2008, 2009, 2011-2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FT_STROKE_H__
+#define __FT_STROKE_H__
+
+#include "../ft2build.h"
+#include "ftoutln.h"
+#include "ftglyph.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /************************************************************************
+ *
+ * @section:
+ * glyph_stroker
+ *
+ * @title:
+ * Glyph Stroker
+ *
+ * @abstract:
+ * Generating bordered and stroked glyphs.
+ *
+ * @description:
+ * This component generates stroked outlines of a given vectorial
+ * glyph. It also allows you to retrieve the `outside' and/or the
+ * `inside' borders of the stroke.
+ *
+ * This can be useful to generate `bordered' glyph, i.e., glyphs
+ * displayed with a coloured (and anti-aliased) border around their
+ * shape.
+ */
+
+
+ /**************************************************************
+ *
+ * @type:
+ * FT_Stroker
+ *
+ * @description:
+ * Opaque handler to a path stroker object.
+ */
+ typedef struct FT_StrokerRec_* FT_Stroker;
+
+
+ /**************************************************************
+ *
+ * @enum:
+ * FT_Stroker_LineJoin
+ *
+ * @description:
+ * These values determine how two joining lines are rendered
+ * in a stroker.
+ *
+ * @values:
+ * FT_STROKER_LINEJOIN_ROUND ::
+ * Used to render rounded line joins. Circular arcs are used
+ * to join two lines smoothly.
+ *
+ * FT_STROKER_LINEJOIN_BEVEL ::
+ * Used to render beveled line joins. The outer corner of
+ * the joined lines is filled by enclosing the triangular
+ * region of the corner with a straight line between the
+ * outer corners of each stroke.
+ *
+ * FT_STROKER_LINEJOIN_MITER_FIXED ::
+ * Used to render mitered line joins, with fixed bevels if the
+ * miter limit is exceeded. The outer edges of the strokes
+ * for the two segments are extended until they meet at an
+ * angle. If the segments meet at too sharp an angle (such
+ * that the miter would extend from the intersection of the
+ * segments a distance greater than the product of the miter
+ * limit value and the border radius), then a bevel join (see
+ * above) is used instead. This prevents long spikes being
+ * created. FT_STROKER_LINEJOIN_MITER_FIXED generates a miter
+ * line join as used in PostScript and PDF.
+ *
+ * FT_STROKER_LINEJOIN_MITER_VARIABLE ::
+ * FT_STROKER_LINEJOIN_MITER ::
+ * Used to render mitered line joins, with variable bevels if
+ * the miter limit is exceeded. The intersection of the
+ * strokes is clipped at a line perpendicular to the bisector
+ * of the angle between the strokes, at the distance from the
+ * intersection of the segments equal to the product of the
+ * miter limit value and the border radius. This prevents
+ * long spikes being created.
+ * FT_STROKER_LINEJOIN_MITER_VARIABLE generates a mitered line
+ * join as used in XPS. FT_STROKER_LINEJOIN_MITER is an alias
+ * for FT_STROKER_LINEJOIN_MITER_VARIABLE, retained for
+ * backwards compatibility.
+ */
+ typedef enum FT_Stroker_LineJoin_
+ {
+ FT_STROKER_LINEJOIN_ROUND = 0,
+ FT_STROKER_LINEJOIN_BEVEL = 1,
+ FT_STROKER_LINEJOIN_MITER_VARIABLE = 2,
+ FT_STROKER_LINEJOIN_MITER = FT_STROKER_LINEJOIN_MITER_VARIABLE,
+ FT_STROKER_LINEJOIN_MITER_FIXED = 3
+
+ } FT_Stroker_LineJoin;
+
+
+ /**************************************************************
+ *
+ * @enum:
+ * FT_Stroker_LineCap
+ *
+ * @description:
+ * These values determine how the end of opened sub-paths are
+ * rendered in a stroke.
+ *
+ * @values:
+ * FT_STROKER_LINECAP_BUTT ::
+ * The end of lines is rendered as a full stop on the last
+ * point itself.
+ *
+ * FT_STROKER_LINECAP_ROUND ::
+ * The end of lines is rendered as a half-circle around the
+ * last point.
+ *
+ * FT_STROKER_LINECAP_SQUARE ::
+ * The end of lines is rendered as a square around the
+ * last point.
+ */
+ typedef enum FT_Stroker_LineCap_
+ {
+ FT_STROKER_LINECAP_BUTT = 0,
+ FT_STROKER_LINECAP_ROUND,
+ FT_STROKER_LINECAP_SQUARE
+
+ } FT_Stroker_LineCap;
+
+
+ /**************************************************************
+ *
+ * @enum:
+ * FT_StrokerBorder
+ *
+ * @description:
+ * These values are used to select a given stroke border
+ * in @FT_Stroker_GetBorderCounts and @FT_Stroker_ExportBorder.
+ *
+ * @values:
+ * FT_STROKER_BORDER_LEFT ::
+ * Select the left border, relative to the drawing direction.
+ *
+ * FT_STROKER_BORDER_RIGHT ::
+ * Select the right border, relative to the drawing direction.
+ *
+ * @note:
+ * Applications are generally interested in the `inside' and `outside'
+ * borders. However, there is no direct mapping between these and the
+ * `left' and `right' ones, since this really depends on the glyph's
+ * drawing orientation, which varies between font formats.
+ *
+ * You can however use @FT_Outline_GetInsideBorder and
+ * @FT_Outline_GetOutsideBorder to get these.
+ */
+ typedef enum FT_StrokerBorder_
+ {
+ FT_STROKER_BORDER_LEFT = 0,
+ FT_STROKER_BORDER_RIGHT
+
+ } FT_StrokerBorder;
+
+
+ /**************************************************************
+ *
+ * @function:
+ * FT_Outline_GetInsideBorder
+ *
+ * @description:
+ * Retrieve the @FT_StrokerBorder value corresponding to the
+ * `inside' borders of a given outline.
+ *
+ * @input:
+ * outline ::
+ * The source outline handle.
+ *
+ * @return:
+ * The border index. @FT_STROKER_BORDER_RIGHT for empty or invalid
+ * outlines.
+ */
+ FT_EXPORT( FT_StrokerBorder )
+ FT_Outline_GetInsideBorder( FT_Outline* outline );
+
+
+ /**************************************************************
+ *
+ * @function:
+ * FT_Outline_GetOutsideBorder
+ *
+ * @description:
+ * Retrieve the @FT_StrokerBorder value corresponding to the
+ * `outside' borders of a given outline.
+ *
+ * @input:
+ * outline ::
+ * The source outline handle.
+ *
+ * @return:
+ * The border index. @FT_STROKER_BORDER_LEFT for empty or invalid
+ * outlines.
+ */
+ FT_EXPORT( FT_StrokerBorder )
+ FT_Outline_GetOutsideBorder( FT_Outline* outline );
+
+
+ /**************************************************************
+ *
+ * @function:
+ * FT_Stroker_New
+ *
+ * @description:
+ * Create a new stroker object.
+ *
+ * @input:
+ * library ::
+ * FreeType library handle.
+ *
+ * @output:
+ * astroker ::
+ * A new stroker object handle. NULL in case of error.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ */
+ FT_EXPORT( FT_Error )
+ FT_Stroker_New( FT_Library library,
+ FT_Stroker *astroker );
+
+
+ /**************************************************************
+ *
+ * @function:
+ * FT_Stroker_Set
+ *
+ * @description:
+ * Reset a stroker object's attributes.
+ *
+ * @input:
+ * stroker ::
+ * The target stroker handle.
+ *
+ * radius ::
+ * The border radius.
+ *
+ * line_cap ::
+ * The line cap style.
+ *
+ * line_join ::
+ * The line join style.
+ *
+ * miter_limit ::
+ * The miter limit for the FT_STROKER_LINEJOIN_MITER_FIXED and
+ * FT_STROKER_LINEJOIN_MITER_VARIABLE line join styles,
+ * expressed as 16.16 fixed-point value.
+ *
+ * @note:
+ * The radius is expressed in the same units as the outline
+ * coordinates.
+ */
+ FT_EXPORT( void )
+ FT_Stroker_Set( FT_Stroker stroker,
+ FT_Fixed radius,
+ FT_Stroker_LineCap line_cap,
+ FT_Stroker_LineJoin line_join,
+ FT_Fixed miter_limit );
+
+
+ /**************************************************************
+ *
+ * @function:
+ * FT_Stroker_Rewind
+ *
+ * @description:
+ * Reset a stroker object without changing its attributes.
+ * You should call this function before beginning a new
+ * series of calls to @FT_Stroker_BeginSubPath or
+ * @FT_Stroker_EndSubPath.
+ *
+ * @input:
+ * stroker ::
+ * The target stroker handle.
+ */
+ FT_EXPORT( void )
+ FT_Stroker_Rewind( FT_Stroker stroker );
+
+
+ /**************************************************************
+ *
+ * @function:
+ * FT_Stroker_ParseOutline
+ *
+ * @description:
+ * A convenience function used to parse a whole outline with
+ * the stroker. The resulting outline(s) can be retrieved
+ * later by functions like @FT_Stroker_GetCounts and @FT_Stroker_Export.
+ *
+ * @input:
+ * stroker ::
+ * The target stroker handle.
+ *
+ * outline ::
+ * The source outline.
+ *
+ * opened ::
+ * A boolean. If~1, the outline is treated as an open path instead
+ * of a closed one.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * If `opened' is~0 (the default), the outline is treated as a closed
+ * path, and the stroker generates two distinct `border' outlines.
+ *
+ * If `opened' is~1, the outline is processed as an open path, and the
+ * stroker generates a single `stroke' outline.
+ *
+ * This function calls @FT_Stroker_Rewind automatically.
+ */
+ FT_EXPORT( FT_Error )
+ FT_Stroker_ParseOutline( FT_Stroker stroker,
+ FT_Outline* outline,
+ FT_Bool opened );
+
+
+ /**************************************************************
+ *
+ * @function:
+ * FT_Stroker_BeginSubPath
+ *
+ * @description:
+ * Start a new sub-path in the stroker.
+ *
+ * @input:
+ * stroker ::
+ * The target stroker handle.
+ *
+ * to ::
+ * A pointer to the start vector.
+ *
+ * open ::
+ * A boolean. If~1, the sub-path is treated as an open one.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * This function is useful when you need to stroke a path that is
+ * not stored as an @FT_Outline object.
+ */
+ FT_EXPORT( FT_Error )
+ FT_Stroker_BeginSubPath( FT_Stroker stroker,
+ FT_Vector* to,
+ FT_Bool open );
+
+
+ /**************************************************************
+ *
+ * @function:
+ * FT_Stroker_EndSubPath
+ *
+ * @description:
+ * Close the current sub-path in the stroker.
+ *
+ * @input:
+ * stroker ::
+ * The target stroker handle.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * You should call this function after @FT_Stroker_BeginSubPath.
+ * If the subpath was not `opened', this function `draws' a
+ * single line segment to the start position when needed.
+ */
+ FT_EXPORT( FT_Error )
+ FT_Stroker_EndSubPath( FT_Stroker stroker );
+
+
+ /**************************************************************
+ *
+ * @function:
+ * FT_Stroker_LineTo
+ *
+ * @description:
+ * `Draw' a single line segment in the stroker's current sub-path,
+ * from the last position.
+ *
+ * @input:
+ * stroker ::
+ * The target stroker handle.
+ *
+ * to ::
+ * A pointer to the destination point.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * You should call this function between @FT_Stroker_BeginSubPath and
+ * @FT_Stroker_EndSubPath.
+ */
+ FT_EXPORT( FT_Error )
+ FT_Stroker_LineTo( FT_Stroker stroker,
+ FT_Vector* to );
+
+
+ /**************************************************************
+ *
+ * @function:
+ * FT_Stroker_ConicTo
+ *
+ * @description:
+ * `Draw' a single quadratic Bézier in the stroker's current sub-path,
+ * from the last position.
+ *
+ * @input:
+ * stroker ::
+ * The target stroker handle.
+ *
+ * control ::
+ * A pointer to a Bézier control point.
+ *
+ * to ::
+ * A pointer to the destination point.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * You should call this function between @FT_Stroker_BeginSubPath and
+ * @FT_Stroker_EndSubPath.
+ */
+ FT_EXPORT( FT_Error )
+ FT_Stroker_ConicTo( FT_Stroker stroker,
+ FT_Vector* control,
+ FT_Vector* to );
+
+
+ /**************************************************************
+ *
+ * @function:
+ * FT_Stroker_CubicTo
+ *
+ * @description:
+ * `Draw' a single cubic Bézier in the stroker's current sub-path,
+ * from the last position.
+ *
+ * @input:
+ * stroker ::
+ * The target stroker handle.
+ *
+ * control1 ::
+ * A pointer to the first Bézier control point.
+ *
+ * control2 ::
+ * A pointer to second Bézier control point.
+ *
+ * to ::
+ * A pointer to the destination point.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * You should call this function between @FT_Stroker_BeginSubPath and
+ * @FT_Stroker_EndSubPath.
+ */
+ FT_EXPORT( FT_Error )
+ FT_Stroker_CubicTo( FT_Stroker stroker,
+ FT_Vector* control1,
+ FT_Vector* control2,
+ FT_Vector* to );
+
+
+ /**************************************************************
+ *
+ * @function:
+ * FT_Stroker_GetBorderCounts
+ *
+ * @description:
+ * Call this function once you have finished parsing your paths
+ * with the stroker. It returns the number of points and
+ * contours necessary to export one of the `border' or `stroke'
+ * outlines generated by the stroker.
+ *
+ * @input:
+ * stroker ::
+ * The target stroker handle.
+ *
+ * border ::
+ * The border index.
+ *
+ * @output:
+ * anum_points ::
+ * The number of points.
+ *
+ * anum_contours ::
+ * The number of contours.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * When an outline, or a sub-path, is `closed', the stroker generates
+ * two independent `border' outlines, named `left' and `right'.
+ *
+ * When the outline, or a sub-path, is `opened', the stroker merges
+ * the `border' outlines with caps. The `left' border receives all
+ * points, while the `right' border becomes empty.
+ *
+ * Use the function @FT_Stroker_GetCounts instead if you want to
+ * retrieve the counts associated to both borders.
+ */
+ FT_EXPORT( FT_Error )
+ FT_Stroker_GetBorderCounts( FT_Stroker stroker,
+ FT_StrokerBorder border,
+ FT_UInt *anum_points,
+ FT_UInt *anum_contours );
+
+
+ /**************************************************************
+ *
+ * @function:
+ * FT_Stroker_ExportBorder
+ *
+ * @description:
+ * Call this function after @FT_Stroker_GetBorderCounts to
+ * export the corresponding border to your own @FT_Outline
+ * structure.
+ *
+ * Note that this function appends the border points and
+ * contours to your outline, but does not try to resize its
+ * arrays.
+ *
+ * @input:
+ * stroker ::
+ * The target stroker handle.
+ *
+ * border ::
+ * The border index.
+ *
+ * outline ::
+ * The target outline handle.
+ *
+ * @note:
+ * Always call this function after @FT_Stroker_GetBorderCounts to
+ * get sure that there is enough room in your @FT_Outline object to
+ * receive all new data.
+ *
+ * When an outline, or a sub-path, is `closed', the stroker generates
+ * two independent `border' outlines, named `left' and `right'
+ *
+ * When the outline, or a sub-path, is `opened', the stroker merges
+ * the `border' outlines with caps. The `left' border receives all
+ * points, while the `right' border becomes empty.
+ *
+ * Use the function @FT_Stroker_Export instead if you want to
+ * retrieve all borders at once.
+ */
+ FT_EXPORT( void )
+ FT_Stroker_ExportBorder( FT_Stroker stroker,
+ FT_StrokerBorder border,
+ FT_Outline* outline );
+
+
+ /**************************************************************
+ *
+ * @function:
+ * FT_Stroker_GetCounts
+ *
+ * @description:
+ * Call this function once you have finished parsing your paths
+ * with the stroker. It returns the number of points and
+ * contours necessary to export all points/borders from the stroked
+ * outline/path.
+ *
+ * @input:
+ * stroker ::
+ * The target stroker handle.
+ *
+ * @output:
+ * anum_points ::
+ * The number of points.
+ *
+ * anum_contours ::
+ * The number of contours.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ */
+ FT_EXPORT( FT_Error )
+ FT_Stroker_GetCounts( FT_Stroker stroker,
+ FT_UInt *anum_points,
+ FT_UInt *anum_contours );
+
+
+ /**************************************************************
+ *
+ * @function:
+ * FT_Stroker_Export
+ *
+ * @description:
+ * Call this function after @FT_Stroker_GetBorderCounts to
+ * export all borders to your own @FT_Outline structure.
+ *
+ * Note that this function appends the border points and
+ * contours to your outline, but does not try to resize its
+ * arrays.
+ *
+ * @input:
+ * stroker ::
+ * The target stroker handle.
+ *
+ * outline ::
+ * The target outline handle.
+ */
+ FT_EXPORT( void )
+ FT_Stroker_Export( FT_Stroker stroker,
+ FT_Outline* outline );
+
+
+ /**************************************************************
+ *
+ * @function:
+ * FT_Stroker_Done
+ *
+ * @description:
+ * Destroy a stroker object.
+ *
+ * @input:
+ * stroker ::
+ * A stroker handle. Can be NULL.
+ */
+ FT_EXPORT( void )
+ FT_Stroker_Done( FT_Stroker stroker );
+
+
+ /**************************************************************
+ *
+ * @function:
+ * FT_Glyph_Stroke
+ *
+ * @description:
+ * Stroke a given outline glyph object with a given stroker.
+ *
+ * @inout:
+ * pglyph ::
+ * Source glyph handle on input, new glyph handle on output.
+ *
+ * @input:
+ * stroker ::
+ * A stroker handle.
+ *
+ * destroy ::
+ * A Boolean. If~1, the source glyph object is destroyed
+ * on success.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * The source glyph is untouched in case of error.
+ *
+ * Adding stroke may yield a significantly wider and taller glyph
+ * depending on how large of a radius was used to stroke the glyph. You
+ * may need to manually adjust horizontal and vertical advance amounts
+ * to account for this added size.
+ */
+ FT_EXPORT( FT_Error )
+ FT_Glyph_Stroke( FT_Glyph *pglyph,
+ FT_Stroker stroker,
+ FT_Bool destroy );
+
+
+ /**************************************************************
+ *
+ * @function:
+ * FT_Glyph_StrokeBorder
+ *
+ * @description:
+ * Stroke a given outline glyph object with a given stroker, but
+ * only return either its inside or outside border.
+ *
+ * @inout:
+ * pglyph ::
+ * Source glyph handle on input, new glyph handle on output.
+ *
+ * @input:
+ * stroker ::
+ * A stroker handle.
+ *
+ * inside ::
+ * A Boolean. If~1, return the inside border, otherwise
+ * the outside border.
+ *
+ * destroy ::
+ * A Boolean. If~1, the source glyph object is destroyed
+ * on success.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * The source glyph is untouched in case of error.
+ *
+ * Adding stroke may yield a significantly wider and taller glyph
+ * depending on how large of a radius was used to stroke the glyph. You
+ * may need to manually adjust horizontal and vertical advance amounts
+ * to account for this added size.
+ */
+ FT_EXPORT( FT_Error )
+ FT_Glyph_StrokeBorder( FT_Glyph *pglyph,
+ FT_Stroker stroker,
+ FT_Bool inside,
+ FT_Bool destroy );
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __FT_STROKE_H__ */
+
+
+/* END */
+
+
+/* Local Variables: */
+/* coding: utf-8 */
+/* End: */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftsynth.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftsynth.h
new file mode 100644
index 0000000000..55f32d6956
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftsynth.h
@@ -0,0 +1,81 @@
+/***************************************************************************/
+/* */
+/* ftsynth.h */
+/* */
+/* FreeType synthesizing code for emboldening and slanting */
+/* (specification). */
+/* */
+/* Copyright 2000-2001, 2003, 2006, 2008, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /********* *********/
+ /********* WARNING, THIS IS ALPHA CODE! THIS API *********/
+ /********* IS DUE TO CHANGE UNTIL STRICTLY NOTIFIED BY THE *********/
+ /********* FREETYPE DEVELOPMENT TEAM *********/
+ /********* *********/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /* Main reason for not lifting the functions in this module to a */
+ /* `standard' API is that the used parameters for emboldening and */
+ /* slanting are not configurable. Consider the functions as a */
+ /* code resource which should be copied into the application and */
+ /* adapted to the particular needs. */
+
+
+#ifndef __FTSYNTH_H__
+#define __FTSYNTH_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+ /* Embolden a glyph by a `reasonable' value (which is highly a matter of */
+ /* taste). This function is actually a convenience function, providing */
+ /* a wrapper for @FT_Outline_Embolden and @FT_Bitmap_Embolden. */
+ /* */
+ /* For emboldened outlines the height, width, and advance metrics are */
+ /* increased by the strength of the emboldening. You can also call */
+ /* @FT_Outline_Get_CBox to get precise values. */
+ FT_EXPORT( void )
+ FT_GlyphSlot_Embolden( FT_GlyphSlot slot );
+
+ /* Slant an outline glyph to the right by about 12 degrees. */
+ FT_EXPORT( void )
+ FT_GlyphSlot_Oblique( FT_GlyphSlot slot );
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __FTSYNTH_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftsystem.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftsystem.h
new file mode 100644
index 0000000000..1e92390aca
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftsystem.h
@@ -0,0 +1,354 @@
+/***************************************************************************/
+/* */
+/* ftsystem.h */
+/* */
+/* FreeType low-level system interface definition (specification). */
+/* */
+/* Copyright 1996-2001, 2002, 2005, 2010 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTSYSTEM_H__
+#define __FTSYSTEM_H__
+
+
+#include "../ft2build.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* system_interface */
+ /* */
+ /* <Title> */
+ /* System Interface */
+ /* */
+ /* <Abstract> */
+ /* How FreeType manages memory and i/o. */
+ /* */
+ /* <Description> */
+ /* This section contains various definitions related to memory */
+ /* management and i/o access. You need to understand this */
+ /* information if you want to use a custom memory manager or you own */
+ /* i/o streams. */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* M E M O R Y M A N A G E M E N T */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************
+ *
+ * @type:
+ * FT_Memory
+ *
+ * @description:
+ * A handle to a given memory manager object, defined with an
+ * @FT_MemoryRec structure.
+ *
+ */
+ typedef struct FT_MemoryRec_* FT_Memory;
+
+
+ /*************************************************************************
+ *
+ * @functype:
+ * FT_Alloc_Func
+ *
+ * @description:
+ * A function used to allocate `size' bytes from `memory'.
+ *
+ * @input:
+ * memory ::
+ * A handle to the source memory manager.
+ *
+ * size ::
+ * The size in bytes to allocate.
+ *
+ * @return:
+ * Address of new memory block. 0~in case of failure.
+ *
+ */
+ typedef void*
+ (*FT_Alloc_Func)( FT_Memory memory,
+ long size );
+
+ /* Sunliang.Liu 20100915 sync 221's revison. */
+ typedef void*
+ (*FT_AllocDebug_Func)( FT_Memory memory,
+ long size, const char* filename, int line);
+
+
+
+ /*************************************************************************
+ *
+ * @functype:
+ * FT_Free_Func
+ *
+ * @description:
+ * A function used to release a given block of memory.
+ *
+ * @input:
+ * memory ::
+ * A handle to the source memory manager.
+ *
+ * block ::
+ * The address of the target memory block.
+ *
+ */
+ typedef void
+ (*FT_Free_Func)( FT_Memory memory,
+ void* block );
+
+
+ /*************************************************************************
+ *
+ * @functype:
+ * FT_Realloc_Func
+ *
+ * @description:
+ * A function used to re-allocate a given block of memory.
+ *
+ * @input:
+ * memory ::
+ * A handle to the source memory manager.
+ *
+ * cur_size ::
+ * The block's current size in bytes.
+ *
+ * new_size ::
+ * The block's requested new size.
+ *
+ * block ::
+ * The block's current address.
+ *
+ * @return:
+ * New block address. 0~in case of memory shortage.
+ *
+ * @note:
+ * In case of error, the old block must still be available.
+ *
+ */
+ typedef void*
+ (*FT_Realloc_Func)( FT_Memory memory,
+ long cur_size,
+ long new_size,
+ void* block );
+
+
+ /*************************************************************************
+ *
+ * @struct:
+ * FT_MemoryRec
+ *
+ * @description:
+ * A structure used to describe a given memory manager to FreeType~2.
+ *
+ * @fields:
+ * user ::
+ * A generic typeless pointer for user data.
+ *
+ * alloc ::
+ * A pointer type to an allocation function.
+ *
+ * free ::
+ * A pointer type to an memory freeing function.
+ *
+ * realloc ::
+ * A pointer type to a reallocation function.
+ *
+ */
+ struct FT_MemoryRec_
+ {
+ void* user;
+ FT_Alloc_Func alloc;
+ FT_AllocDebug_Func allocdebug; /* Sunliang.Liu 20100915 sync 221's revison. */
+ FT_Free_Func free;
+ FT_Realloc_Func realloc;
+ };
+
+
+ /*************************************************************************/
+ /* */
+ /* I / O M A N A G E M E N T */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************
+ *
+ * @type:
+ * FT_Stream
+ *
+ * @description:
+ * A handle to an input stream.
+ *
+ */
+ typedef struct FT_StreamRec_* FT_Stream;
+
+
+ /*************************************************************************
+ *
+ * @struct:
+ * FT_StreamDesc
+ *
+ * @description:
+ * A union type used to store either a long or a pointer. This is used
+ * to store a file descriptor or a `FILE*' in an input stream.
+ *
+ */
+ typedef union FT_StreamDesc_
+ {
+ long value;
+ void* pointer;
+
+ } FT_StreamDesc;
+
+
+ /*************************************************************************
+ *
+ * @functype:
+ * FT_Stream_IoFunc
+ *
+ * @description:
+ * A function used to seek and read data from a given input stream.
+ *
+ * @input:
+ * stream ::
+ * A handle to the source stream.
+ *
+ * offset ::
+ * The offset of read in stream (always from start).
+ *
+ * buffer ::
+ * The address of the read buffer.
+ *
+ * count ::
+ * The number of bytes to read from the stream.
+ *
+ * @return:
+ * The number of bytes effectively read by the stream.
+ *
+ * @note:
+ * This function might be called to perform a seek or skip operation
+ * with a `count' of~0. A non-zero return value then indicates an
+ * error.
+ *
+ */
+ typedef unsigned long
+ (*FT_Stream_IoFunc)( FT_Stream stream,
+ unsigned long offset,
+ unsigned char* buffer,
+ unsigned long count );
+
+
+ /*************************************************************************
+ *
+ * @functype:
+ * FT_Stream_CloseFunc
+ *
+ * @description:
+ * A function used to close a given input stream.
+ *
+ * @input:
+ * stream ::
+ * A handle to the target stream.
+ *
+ */
+ typedef void
+ (*FT_Stream_CloseFunc)( FT_Stream stream );
+
+
+ /*************************************************************************
+ *
+ * @struct:
+ * FT_StreamRec
+ *
+ * @description:
+ * A structure used to describe an input stream.
+ *
+ * @input:
+ * base ::
+ * For memory-based streams, this is the address of the first stream
+ * byte in memory. This field should always be set to NULL for
+ * disk-based streams.
+ *
+ * size ::
+ * The stream size in bytes.
+ *
+ * pos ::
+ * The current position within the stream.
+ *
+ * descriptor ::
+ * This field is a union that can hold an integer or a pointer. It is
+ * used by stream implementations to store file descriptors or `FILE*'
+ * pointers.
+ *
+ * pathname ::
+ * This field is completely ignored by FreeType. However, it is often
+ * useful during debugging to use it to store the stream's filename
+ * (where available).
+ *
+ * read ::
+ * The stream's input function.
+ *
+ * close ::
+ * The stream's close function.
+ *
+ * memory ::
+ * The memory manager to use to preload frames. This is set
+ * internally by FreeType and shouldn't be touched by stream
+ * implementations.
+ *
+ * cursor ::
+ * This field is set and used internally by FreeType when parsing
+ * frames.
+ *
+ * limit ::
+ * This field is set and used internally by FreeType when parsing
+ * frames.
+ *
+ */
+ typedef struct FT_StreamRec_
+ {
+ unsigned char* base;
+ unsigned long size;
+ unsigned long pos;
+
+ FT_StreamDesc descriptor;
+ FT_StreamDesc pathname;
+ FT_Stream_IoFunc read;
+ FT_Stream_CloseFunc close;
+
+ FT_Memory memory;
+ unsigned char* cursor;
+ unsigned char* limit;
+
+ } FT_StreamRec;
+
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTSYSTEM_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/fttrigon.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/fttrigon.h
new file mode 100644
index 0000000000..111c63edef
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/fttrigon.h
@@ -0,0 +1,350 @@
+/***************************************************************************/
+/* */
+/* fttrigon.h */
+/* */
+/* FreeType trigonometric functions (specification). */
+/* */
+/* Copyright 2001, 2003, 2005, 2007, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTTRIGON_H__
+#define __FTTRIGON_H__
+
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* computations */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************
+ *
+ * @type:
+ * FT_Angle
+ *
+ * @description:
+ * This type is used to model angle values in FreeType. Note that the
+ * angle is a 16.16 fixed-point value expressed in degrees.
+ *
+ */
+ typedef FT_Fixed FT_Angle;
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_ANGLE_PI
+ *
+ * @description:
+ * The angle pi expressed in @FT_Angle units.
+ *
+ */
+#define FT_ANGLE_PI ( 180L << 16 )
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_ANGLE_2PI
+ *
+ * @description:
+ * The angle 2*pi expressed in @FT_Angle units.
+ *
+ */
+#define FT_ANGLE_2PI ( FT_ANGLE_PI * 2 )
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_ANGLE_PI2
+ *
+ * @description:
+ * The angle pi/2 expressed in @FT_Angle units.
+ *
+ */
+#define FT_ANGLE_PI2 ( FT_ANGLE_PI / 2 )
+
+
+ /*************************************************************************
+ *
+ * @macro:
+ * FT_ANGLE_PI4
+ *
+ * @description:
+ * The angle pi/4 expressed in @FT_Angle units.
+ *
+ */
+#define FT_ANGLE_PI4 ( FT_ANGLE_PI / 4 )
+
+
+ /*************************************************************************
+ *
+ * @function:
+ * FT_Sin
+ *
+ * @description:
+ * Return the sinus of a given angle in fixed-point format.
+ *
+ * @input:
+ * angle ::
+ * The input angle.
+ *
+ * @return:
+ * The sinus value.
+ *
+ * @note:
+ * If you need both the sinus and cosinus for a given angle, use the
+ * function @FT_Vector_Unit.
+ *
+ */
+ FT_EXPORT( FT_Fixed )
+ FT_Sin( FT_Angle angle );
+
+
+ /*************************************************************************
+ *
+ * @function:
+ * FT_Cos
+ *
+ * @description:
+ * Return the cosinus of a given angle in fixed-point format.
+ *
+ * @input:
+ * angle ::
+ * The input angle.
+ *
+ * @return:
+ * The cosinus value.
+ *
+ * @note:
+ * If you need both the sinus and cosinus for a given angle, use the
+ * function @FT_Vector_Unit.
+ *
+ */
+ FT_EXPORT( FT_Fixed )
+ FT_Cos( FT_Angle angle );
+
+
+ /*************************************************************************
+ *
+ * @function:
+ * FT_Tan
+ *
+ * @description:
+ * Return the tangent of a given angle in fixed-point format.
+ *
+ * @input:
+ * angle ::
+ * The input angle.
+ *
+ * @return:
+ * The tangent value.
+ *
+ */
+ FT_EXPORT( FT_Fixed )
+ FT_Tan( FT_Angle angle );
+
+
+ /*************************************************************************
+ *
+ * @function:
+ * FT_Atan2
+ *
+ * @description:
+ * Return the arc-tangent corresponding to a given vector (x,y) in
+ * the 2d plane.
+ *
+ * @input:
+ * x ::
+ * The horizontal vector coordinate.
+ *
+ * y ::
+ * The vertical vector coordinate.
+ *
+ * @return:
+ * The arc-tangent value (i.e. angle).
+ *
+ */
+ FT_EXPORT( FT_Angle )
+ FT_Atan2( FT_Fixed x,
+ FT_Fixed y );
+
+
+ /*************************************************************************
+ *
+ * @function:
+ * FT_Angle_Diff
+ *
+ * @description:
+ * Return the difference between two angles. The result is always
+ * constrained to the ]-PI..PI] interval.
+ *
+ * @input:
+ * angle1 ::
+ * First angle.
+ *
+ * angle2 ::
+ * Second angle.
+ *
+ * @return:
+ * Constrained value of `value2-value1'.
+ *
+ */
+ FT_EXPORT( FT_Angle )
+ FT_Angle_Diff( FT_Angle angle1,
+ FT_Angle angle2 );
+
+
+ /*************************************************************************
+ *
+ * @function:
+ * FT_Vector_Unit
+ *
+ * @description:
+ * Return the unit vector corresponding to a given angle. After the
+ * call, the value of `vec.x' will be `sin(angle)', and the value of
+ * `vec.y' will be `cos(angle)'.
+ *
+ * This function is useful to retrieve both the sinus and cosinus of a
+ * given angle quickly.
+ *
+ * @output:
+ * vec ::
+ * The address of target vector.
+ *
+ * @input:
+ * angle ::
+ * The address of angle.
+ *
+ */
+ FT_EXPORT( void )
+ FT_Vector_Unit( FT_Vector* vec,
+ FT_Angle angle );
+
+
+ /*************************************************************************
+ *
+ * @function:
+ * FT_Vector_Rotate
+ *
+ * @description:
+ * Rotate a vector by a given angle.
+ *
+ * @inout:
+ * vec ::
+ * The address of target vector.
+ *
+ * @input:
+ * angle ::
+ * The address of angle.
+ *
+ */
+ FT_EXPORT( void )
+ FT_Vector_Rotate( FT_Vector* vec,
+ FT_Angle angle );
+
+
+ /*************************************************************************
+ *
+ * @function:
+ * FT_Vector_Length
+ *
+ * @description:
+ * Return the length of a given vector.
+ *
+ * @input:
+ * vec ::
+ * The address of target vector.
+ *
+ * @return:
+ * The vector length, expressed in the same units that the original
+ * vector coordinates.
+ *
+ */
+ FT_EXPORT( FT_Fixed )
+ FT_Vector_Length( FT_Vector* vec );
+
+
+ /*************************************************************************
+ *
+ * @function:
+ * FT_Vector_Polarize
+ *
+ * @description:
+ * Compute both the length and angle of a given vector.
+ *
+ * @input:
+ * vec ::
+ * The address of source vector.
+ *
+ * @output:
+ * length ::
+ * The vector length.
+ *
+ * angle ::
+ * The vector angle.
+ *
+ */
+ FT_EXPORT( void )
+ FT_Vector_Polarize( FT_Vector* vec,
+ FT_Fixed *length,
+ FT_Angle *angle );
+
+
+ /*************************************************************************
+ *
+ * @function:
+ * FT_Vector_From_Polar
+ *
+ * @description:
+ * Compute vector coordinates from a length and angle.
+ *
+ * @output:
+ * vec ::
+ * The address of source vector.
+ *
+ * @input:
+ * length ::
+ * The vector length.
+ *
+ * angle ::
+ * The vector angle.
+ *
+ */
+ FT_EXPORT( void )
+ FT_Vector_From_Polar( FT_Vector* vec,
+ FT_Fixed length,
+ FT_Angle angle );
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTTRIGON_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftttdrv.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftttdrv.h
new file mode 100644
index 0000000000..01b25a4808
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftttdrv.h
@@ -0,0 +1,150 @@
+/***************************************************************************/
+/* */
+/* ftttdrv.h */
+/* */
+/* FreeType API for controlling the TrueType driver */
+/* (specification only). */
+/* */
+/* Copyright 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTTTDRV_H__
+#define __FTTTDRV_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /**************************************************************************
+ *
+ * @section:
+ * tt_driver
+ *
+ * @title:
+ * The TrueType driver
+ *
+ * @abstract:
+ * Controlling the TrueType driver module.
+ *
+ * @description:
+ * While FreeType's TrueType driver doesn't expose API functions by
+ * itself, it is possible to control its behaviour with @FT_Property_Set
+ * and @FT_Property_Get. The following lists the available properties
+ * together with the necessary macros and structures.
+ *
+ * The TrueType driver's module name is `truetype'.
+ *
+ */
+
+
+ /**************************************************************************
+ *
+ * @property:
+ * interpreter-version
+ *
+ * @description:
+ * Currently, two versions are available which represent the bytecode
+ * interpreter with and without subpixel hinting support,
+ * respectively. The default is subpixel support if
+ * TT_CONFIG_OPTION_SUBPIXEL_HINTING is defined, and no subpixel
+ * support otherwise (since it isn't available then).
+ *
+ * If subpixel hinting is on, many TrueType bytecode instructions
+ * behave differently compared to B/W or grayscale rendering. The
+ * main idea is to render at a much increased horizontal resolution,
+ * then sampling down the created output to subpixel precision.
+ * However, many older fonts are not suited to this and must be
+ * specially taken care of by applying (hardcoded) font-specific
+ * tweaks.
+ *
+ * Details on subpixel hinting and some of the necessary tweaks can be
+ * found in Greg Hitchcock's whitepaper at
+ * `http://www.microsoft.com/typography/cleartype/truetypecleartype.aspx'.
+ *
+ * The following example code demonstrates how to activate subpixel
+ * hinting (omitting the error handling).
+ *
+ * {
+ * FT_Library library;
+ * FT_Face face;
+ * FT_UInt interpreter_version = TT_INTERPRETER_VERSION_38;
+ *
+ *
+ * FT_Init_FreeType( &library );
+ *
+ * FT_Property_Set( library, "truetype",
+ * "interpreter-version",
+ * &interpreter_version );
+ * }
+ *
+ * @note:
+ * This property can be used with @FT_Property_Get also.
+ *
+ */
+
+
+ /**************************************************************************
+ *
+ * @enum:
+ * TT_INTERPRETER_VERSION_XXX
+ *
+ * @description:
+ * A list of constants used for the @interpreter-version property to
+ * select the hinting engine for Truetype fonts.
+ *
+ * The numeric value in the constant names represents the version
+ * number as returned by the `GETINFO' bytecode instruction.
+ *
+ * @values:
+ * TT_INTERPRETER_VERSION_35 ::
+ * Version~35 corresponds to MS rasterizer v.1.7 as used e.g. in
+ * Windows~98; only grayscale and B/W rasterizing is supported.
+ *
+ * TT_INTERPRETER_VERSION_38 ::
+ * Version~38 corresponds to MS rasterizer v.1.9; it is roughly
+ * equivalent to the hinting provided by DirectWrite ClearType (as
+ * can be found, for example, in the Internet Explorer~9 running on
+ * Windows~7).
+ *
+ * @note:
+ * This property controls the behaviour of the bytecode interpreter
+ * and thus how outlines get hinted. It does *not* control how glyph
+ * get rasterized! In particular, it does not control subpixel color
+ * filtering.
+ *
+ * If FreeType has not been compiled with configuration option
+ * FT_CONFIG_OPTION_SUBPIXEL_HINTING, selecting version~38 causes an
+ * `FT_Err_Unimplemented_Feature' error.
+ *
+ */
+#define TT_INTERPRETER_VERSION_35 35
+#define TT_INTERPRETER_VERSION_38 38
+
+
+ /* */
+
+FT_END_HEADER
+
+
+#endif /* __FTTTDRV_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/fttypes.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/fttypes.h
new file mode 100644
index 0000000000..4d11bed469
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/fttypes.h
@@ -0,0 +1,598 @@
+/***************************************************************************/
+/* */
+/* fttypes.h */
+/* */
+/* FreeType simple types definitions (specification only). */
+/* */
+/* Copyright 1996-2002, 2004, 2006-2009, 2012, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTTYPES_H__
+#define __FTTYPES_H__
+
+
+#include "../ft2build.h"
+#include "config/ftconfig.h"
+#include "ftsystem.h"
+#include "ftimage.h"
+
+#include <stddef.h>
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* basic_types */
+ /* */
+ /* <Title> */
+ /* Basic Data Types */
+ /* */
+ /* <Abstract> */
+ /* The basic data types defined by the library. */
+ /* */
+ /* <Description> */
+ /* This section contains the basic data types defined by FreeType~2, */
+ /* ranging from simple scalar types to bitmap descriptors. More */
+ /* font-specific structures are defined in a different section. */
+ /* */
+ /* <Order> */
+ /* FT_Byte */
+ /* FT_Bytes */
+ /* FT_Char */
+ /* FT_Int */
+ /* FT_UInt */
+ /* FT_Int16 */
+ /* FT_UInt16 */
+ /* FT_Int32 */
+ /* FT_UInt32 */
+ /* FT_Short */
+ /* FT_UShort */
+ /* FT_Long */
+ /* FT_ULong */
+ /* FT_Bool */
+ /* FT_Offset */
+ /* FT_PtrDist */
+ /* FT_String */
+ /* FT_Tag */
+ /* FT_Error */
+ /* FT_Fixed */
+ /* FT_Pointer */
+ /* FT_Pos */
+ /* FT_Vector */
+ /* FT_BBox */
+ /* FT_Matrix */
+ /* FT_FWord */
+ /* FT_UFWord */
+ /* FT_F2Dot14 */
+ /* FT_UnitVector */
+ /* FT_F26Dot6 */
+ /* */
+ /* */
+ /* FT_Generic */
+ /* FT_Generic_Finalizer */
+ /* */
+ /* FT_Bitmap */
+ /* FT_Pixel_Mode */
+ /* FT_Palette_Mode */
+ /* FT_Glyph_Format */
+ /* FT_IMAGE_TAG */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Bool */
+ /* */
+ /* <Description> */
+ /* A typedef of unsigned char, used for simple booleans. As usual, */
+ /* values 1 and~0 represent true and false, respectively. */
+ /* */
+ typedef unsigned char FT_Bool;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_FWord */
+ /* */
+ /* <Description> */
+ /* A signed 16-bit integer used to store a distance in original font */
+ /* units. */
+ /* */
+ typedef signed short FT_FWord; /* distance in FUnits */
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_UFWord */
+ /* */
+ /* <Description> */
+ /* An unsigned 16-bit integer used to store a distance in original */
+ /* font units. */
+ /* */
+ typedef unsigned short FT_UFWord; /* unsigned distance */
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Char */
+ /* */
+ /* <Description> */
+ /* A simple typedef for the _signed_ char type. */
+ /* */
+ typedef signed char FT_Char;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Byte */
+ /* */
+ /* <Description> */
+ /* A simple typedef for the _unsigned_ char type. */
+ /* */
+ typedef unsigned char FT_Byte;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Bytes */
+ /* */
+ /* <Description> */
+ /* A typedef for constant memory areas. */
+ /* */
+ typedef const FT_Byte* FT_Bytes;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Tag */
+ /* */
+ /* <Description> */
+ /* A typedef for 32-bit tags (as used in the SFNT format). */
+ /* */
+ typedef FT_UInt32 FT_Tag;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_String */
+ /* */
+ /* <Description> */
+ /* A simple typedef for the char type, usually used for strings. */
+ /* */
+ typedef char FT_String;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Short */
+ /* */
+ /* <Description> */
+ /* A typedef for signed short. */
+ /* */
+ typedef signed short FT_Short;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_UShort */
+ /* */
+ /* <Description> */
+ /* A typedef for unsigned short. */
+ /* */
+ typedef unsigned short FT_UShort;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Int */
+ /* */
+ /* <Description> */
+ /* A typedef for the int type. */
+ /* */
+ typedef signed int FT_Int;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_UInt */
+ /* */
+ /* <Description> */
+ /* A typedef for the unsigned int type. */
+ /* */
+ typedef unsigned int FT_UInt;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Long */
+ /* */
+ /* <Description> */
+ /* A typedef for signed long. */
+ /* */
+ typedef signed long FT_Long;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_ULong */
+ /* */
+ /* <Description> */
+ /* A typedef for unsigned long. */
+ /* */
+ typedef unsigned long FT_ULong;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_F2Dot14 */
+ /* */
+ /* <Description> */
+ /* A signed 2.14 fixed-point type used for unit vectors. */
+ /* */
+ typedef signed short FT_F2Dot14;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_F26Dot6 */
+ /* */
+ /* <Description> */
+ /* A signed 26.6 fixed-point type used for vectorial pixel */
+ /* coordinates. */
+ /* */
+ typedef signed long FT_F26Dot6;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Fixed */
+ /* */
+ /* <Description> */
+ /* This type is used to store 16.16 fixed-point values, like scaling */
+ /* values or matrix coefficients. */
+ /* */
+ typedef signed long FT_Fixed;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Error */
+ /* */
+ /* <Description> */
+ /* The FreeType error code type. A value of~0 is always interpreted */
+ /* as a successful operation. */
+ /* */
+ typedef int FT_Error;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Pointer */
+ /* */
+ /* <Description> */
+ /* A simple typedef for a typeless pointer. */
+ /* */
+ typedef void* FT_Pointer;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_Offset */
+ /* */
+ /* <Description> */
+ /* This is equivalent to the ANSI~C `size_t' type, i.e., the largest */
+ /* _unsigned_ integer type used to express a file size or position, */
+ /* or a memory block size. */
+ /* */
+ typedef size_t FT_Offset;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_PtrDist */
+ /* */
+ /* <Description> */
+ /* This is equivalent to the ANSI~C `ptrdiff_t' type, i.e., the */
+ /* largest _signed_ integer type used to express the distance */
+ /* between two pointers. */
+ /* */
+ typedef ft_ptrdiff_t FT_PtrDist;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_UnitVector */
+ /* */
+ /* <Description> */
+ /* A simple structure used to store a 2D vector unit vector. Uses */
+ /* FT_F2Dot14 types. */
+ /* */
+ /* <Fields> */
+ /* x :: Horizontal coordinate. */
+ /* */
+ /* y :: Vertical coordinate. */
+ /* */
+ typedef struct FT_UnitVector_
+ {
+ FT_F2Dot14 x;
+ FT_F2Dot14 y;
+
+ } FT_UnitVector;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Matrix */
+ /* */
+ /* <Description> */
+ /* A simple structure used to store a 2x2 matrix. Coefficients are */
+ /* in 16.16 fixed-point format. The computation performed is: */
+ /* */
+ /* { */
+ /* x' = x*xx + y*xy */
+ /* y' = x*yx + y*yy */
+ /* } */
+ /* */
+ /* <Fields> */
+ /* xx :: Matrix coefficient. */
+ /* */
+ /* xy :: Matrix coefficient. */
+ /* */
+ /* yx :: Matrix coefficient. */
+ /* */
+ /* yy :: Matrix coefficient. */
+ /* */
+ typedef struct FT_Matrix_
+ {
+ FT_Fixed xx, xy;
+ FT_Fixed yx, yy;
+
+ } FT_Matrix;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Data */
+ /* */
+ /* <Description> */
+ /* Read-only binary data represented as a pointer and a length. */
+ /* */
+ /* <Fields> */
+ /* pointer :: The data. */
+ /* */
+ /* length :: The length of the data in bytes. */
+ /* */
+ typedef struct FT_Data_
+ {
+ const FT_Byte* pointer;
+ FT_Int length;
+
+ } FT_Data;
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_Generic_Finalizer */
+ /* */
+ /* <Description> */
+ /* Describe a function used to destroy the `client' data of any */
+ /* FreeType object. See the description of the @FT_Generic type for */
+ /* details of usage. */
+ /* */
+ /* <Input> */
+ /* The address of the FreeType object which is under finalization. */
+ /* Its client data is accessed through its `generic' field. */
+ /* */
+ typedef void (*FT_Generic_Finalizer)(void* object);
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Generic */
+ /* */
+ /* <Description> */
+ /* Client applications often need to associate their own data to a */
+ /* variety of FreeType core objects. For example, a text layout API */
+ /* might want to associate a glyph cache to a given size object. */
+ /* */
+ /* Some FreeType object contains a `generic' field, of type */
+ /* FT_Generic, which usage is left to client applications and font */
+ /* servers. */
+ /* */
+ /* It can be used to store a pointer to client-specific data, as well */
+ /* as the address of a `finalizer' function, which will be called by */
+ /* FreeType when the object is destroyed (for example, the previous */
+ /* client example would put the address of the glyph cache destructor */
+ /* in the `finalizer' field). */
+ /* */
+ /* <Fields> */
+ /* data :: A typeless pointer to any client-specified data. This */
+ /* field is completely ignored by the FreeType library. */
+ /* */
+ /* finalizer :: A pointer to a `generic finalizer' function, which */
+ /* will be called when the object is destroyed. If this */
+ /* field is set to NULL, no code will be called. */
+ /* */
+ typedef struct FT_Generic_
+ {
+ void* data;
+ FT_Generic_Finalizer finalizer;
+
+ } FT_Generic;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Macro> */
+ /* FT_MAKE_TAG */
+ /* */
+ /* <Description> */
+ /* This macro converts four-letter tags which are used to label */
+ /* TrueType tables into an unsigned long to be used within FreeType. */
+ /* */
+ /* <Note> */
+ /* The produced values *must* be 32-bit integers. Don't redefine */
+ /* this macro. */
+ /* */
+#define FT_MAKE_TAG( _x1, _x2, _x3, _x4 ) \
+ (FT_Tag) \
+ ( ( (FT_ULong)_x1 << 24 ) | \
+ ( (FT_ULong)_x2 << 16 ) | \
+ ( (FT_ULong)_x3 << 8 ) | \
+ (FT_ULong)_x4 )
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /* */
+ /* L I S T M A N A G E M E N T */
+ /* */
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* list_processing */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_ListNode */
+ /* */
+ /* <Description> */
+ /* Many elements and objects in FreeType are listed through an */
+ /* @FT_List record (see @FT_ListRec). As its name suggests, an */
+ /* FT_ListNode is a handle to a single list element. */
+ /* */
+ typedef struct FT_ListNodeRec_* FT_ListNode;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* FT_List */
+ /* */
+ /* <Description> */
+ /* A handle to a list record (see @FT_ListRec). */
+ /* */
+ typedef struct FT_ListRec_* FT_List;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_ListNodeRec */
+ /* */
+ /* <Description> */
+ /* A structure used to hold a single list element. */
+ /* */
+ /* <Fields> */
+ /* prev :: The previous element in the list. NULL if first. */
+ /* */
+ /* next :: The next element in the list. NULL if last. */
+ /* */
+ /* data :: A typeless pointer to the listed object. */
+ /* */
+ typedef struct FT_ListNodeRec_
+ {
+ FT_ListNode prev;
+ FT_ListNode next;
+ void* data;
+
+ } FT_ListNodeRec;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_ListRec */
+ /* */
+ /* <Description> */
+ /* A structure used to hold a simple doubly-linked list. These are */
+ /* used in many parts of FreeType. */
+ /* */
+ /* <Fields> */
+ /* head :: The head (first element) of doubly-linked list. */
+ /* */
+ /* tail :: The tail (last element) of doubly-linked list. */
+ /* */
+ typedef struct FT_ListRec_
+ {
+ FT_ListNode head;
+ FT_ListNode tail;
+
+ } FT_ListRec;
+
+
+ /* */
+
+#define FT_IS_EMPTY( list ) ( (list).head == 0 )
+#define FT_BOOL( x ) ( (FT_Bool)( x ) )
+
+ /* concatenate C tokens */
+#define FT_ERR_XCAT( x, y ) x ## y
+#define FT_ERR_CAT( x, y ) FT_ERR_XCAT( x, y )
+
+ /* see `ftmoderr.h' for descriptions of the following macros */
+
+#define FT_ERR( e ) FT_ERR_CAT( FT_ERR_PREFIX, e )
+
+#define FT_ERROR_BASE( x ) ( (x) & 0xFF )
+#define FT_ERROR_MODULE( x ) ( (x) & 0xFF00U )
+
+#define FT_ERR_EQ( x, e ) \
+ ( FT_ERROR_BASE( x ) == FT_ERROR_BASE( FT_ERR( e ) ) )
+#define FT_ERR_NEQ( x, e ) \
+ ( FT_ERROR_BASE( x ) != FT_ERROR_BASE( FT_ERR( e ) ) )
+
+
+FT_END_HEADER
+
+#endif /* __FTTYPES_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftwinfnt.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftwinfnt.h
new file mode 100644
index 0000000000..af4334e200
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftwinfnt.h
@@ -0,0 +1,274 @@
+/***************************************************************************/
+/* */
+/* ftwinfnt.h */
+/* */
+/* FreeType API for accessing Windows fnt-specific data. */
+/* */
+/* Copyright 2003, 2004, 2008 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTWINFNT_H__
+#define __FTWINFNT_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* winfnt_fonts */
+ /* */
+ /* <Title> */
+ /* Window FNT Files */
+ /* */
+ /* <Abstract> */
+ /* Windows FNT specific API. */
+ /* */
+ /* <Description> */
+ /* This section contains the declaration of Windows FNT specific */
+ /* functions. */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************
+ *
+ * @enum:
+ * FT_WinFNT_ID_XXX
+ *
+ * @description:
+ * A list of valid values for the `charset' byte in
+ * @FT_WinFNT_HeaderRec. Exact mapping tables for the various cpXXXX
+ * encodings (except for cp1361) can be found at ftp://ftp.unicode.org
+ * in the MAPPINGS/VENDORS/MICSFT/WINDOWS subdirectory. cp1361 is
+ * roughly a superset of MAPPINGS/OBSOLETE/EASTASIA/KSC/JOHAB.TXT.
+ *
+ * @values:
+ * FT_WinFNT_ID_DEFAULT ::
+ * This is used for font enumeration and font creation as a
+ * `don't care' value. Valid font files don't contain this value.
+ * When querying for information about the character set of the font
+ * that is currently selected into a specified device context, this
+ * return value (of the related Windows API) simply denotes failure.
+ *
+ * FT_WinFNT_ID_SYMBOL ::
+ * There is no known mapping table available.
+ *
+ * FT_WinFNT_ID_MAC ::
+ * Mac Roman encoding.
+ *
+ * FT_WinFNT_ID_OEM ::
+ * From Michael Pöttgen <michael@poettgen.de>:
+ *
+ * The `Windows Font Mapping' article says that FT_WinFNT_ID_OEM
+ * is used for the charset of vector fonts, like `modern.fon',
+ * `roman.fon', and `script.fon' on Windows.
+ *
+ * The `CreateFont' documentation says: The FT_WinFNT_ID_OEM value
+ * specifies a character set that is operating-system dependent.
+ *
+ * The `IFIMETRICS' documentation from the `Windows Driver
+ * Development Kit' says: This font supports an OEM-specific
+ * character set. The OEM character set is system dependent.
+ *
+ * In general OEM, as opposed to ANSI (i.e., cp1252), denotes the
+ * second default codepage that most international versions of
+ * Windows have. It is one of the OEM codepages from
+ *
+ * http://www.microsoft.com/globaldev/reference/cphome.mspx,
+ *
+ * and is used for the `DOS boxes', to support legacy applications.
+ * A German Windows version for example usually uses ANSI codepage
+ * 1252 and OEM codepage 850.
+ *
+ * FT_WinFNT_ID_CP874 ::
+ * A superset of Thai TIS 620 and ISO 8859-11.
+ *
+ * FT_WinFNT_ID_CP932 ::
+ * A superset of Japanese Shift-JIS (with minor deviations).
+ *
+ * FT_WinFNT_ID_CP936 ::
+ * A superset of simplified Chinese GB 2312-1980 (with different
+ * ordering and minor deviations).
+ *
+ * FT_WinFNT_ID_CP949 ::
+ * A superset of Korean Hangul KS~C 5601-1987 (with different
+ * ordering and minor deviations).
+ *
+ * FT_WinFNT_ID_CP950 ::
+ * A superset of traditional Chinese Big~5 ETen (with different
+ * ordering and minor deviations).
+ *
+ * FT_WinFNT_ID_CP1250 ::
+ * A superset of East European ISO 8859-2 (with slightly different
+ * ordering).
+ *
+ * FT_WinFNT_ID_CP1251 ::
+ * A superset of Russian ISO 8859-5 (with different ordering).
+ *
+ * FT_WinFNT_ID_CP1252 ::
+ * ANSI encoding. A superset of ISO 8859-1.
+ *
+ * FT_WinFNT_ID_CP1253 ::
+ * A superset of Greek ISO 8859-7 (with minor modifications).
+ *
+ * FT_WinFNT_ID_CP1254 ::
+ * A superset of Turkish ISO 8859-9.
+ *
+ * FT_WinFNT_ID_CP1255 ::
+ * A superset of Hebrew ISO 8859-8 (with some modifications).
+ *
+ * FT_WinFNT_ID_CP1256 ::
+ * A superset of Arabic ISO 8859-6 (with different ordering).
+ *
+ * FT_WinFNT_ID_CP1257 ::
+ * A superset of Baltic ISO 8859-13 (with some deviations).
+ *
+ * FT_WinFNT_ID_CP1258 ::
+ * For Vietnamese. This encoding doesn't cover all necessary
+ * characters.
+ *
+ * FT_WinFNT_ID_CP1361 ::
+ * Korean (Johab).
+ */
+
+#define FT_WinFNT_ID_CP1252 0
+#define FT_WinFNT_ID_DEFAULT 1
+#define FT_WinFNT_ID_SYMBOL 2
+#define FT_WinFNT_ID_MAC 77
+#define FT_WinFNT_ID_CP932 128
+#define FT_WinFNT_ID_CP949 129
+#define FT_WinFNT_ID_CP1361 130
+#define FT_WinFNT_ID_CP936 134
+#define FT_WinFNT_ID_CP950 136
+#define FT_WinFNT_ID_CP1253 161
+#define FT_WinFNT_ID_CP1254 162
+#define FT_WinFNT_ID_CP1258 163
+#define FT_WinFNT_ID_CP1255 177
+#define FT_WinFNT_ID_CP1256 178
+#define FT_WinFNT_ID_CP1257 186
+#define FT_WinFNT_ID_CP1251 204
+#define FT_WinFNT_ID_CP874 222
+#define FT_WinFNT_ID_CP1250 238
+#define FT_WinFNT_ID_OEM 255
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_WinFNT_HeaderRec */
+ /* */
+ /* <Description> */
+ /* Windows FNT Header info. */
+ /* */
+ typedef struct FT_WinFNT_HeaderRec_
+ {
+ FT_UShort version;
+ FT_ULong file_size;
+ FT_Byte copyright[60];
+ FT_UShort file_type;
+ FT_UShort nominal_point_size;
+ FT_UShort vertical_resolution;
+ FT_UShort horizontal_resolution;
+ FT_UShort ascent;
+ FT_UShort internal_leading;
+ FT_UShort external_leading;
+ FT_Byte italic;
+ FT_Byte underline;
+ FT_Byte strike_out;
+ FT_UShort weight;
+ FT_Byte charset;
+ FT_UShort pixel_width;
+ FT_UShort pixel_height;
+ FT_Byte pitch_and_family;
+ FT_UShort avg_width;
+ FT_UShort max_width;
+ FT_Byte first_char;
+ FT_Byte last_char;
+ FT_Byte default_char;
+ FT_Byte break_char;
+ FT_UShort bytes_per_row;
+ FT_ULong device_offset;
+ FT_ULong face_name_offset;
+ FT_ULong bits_pointer;
+ FT_ULong bits_offset;
+ FT_Byte reserved;
+ FT_ULong flags;
+ FT_UShort A_space;
+ FT_UShort B_space;
+ FT_UShort C_space;
+ FT_UShort color_table_offset;
+ FT_ULong reserved1[4];
+
+ } FT_WinFNT_HeaderRec;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_WinFNT_Header */
+ /* */
+ /* <Description> */
+ /* A handle to an @FT_WinFNT_HeaderRec structure. */
+ /* */
+ typedef struct FT_WinFNT_HeaderRec_* FT_WinFNT_Header;
+
+
+ /**********************************************************************
+ *
+ * @function:
+ * FT_Get_WinFNT_Header
+ *
+ * @description:
+ * Retrieve a Windows FNT font info header.
+ *
+ * @input:
+ * face :: A handle to the input face.
+ *
+ * @output:
+ * aheader :: The WinFNT header.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * This function only works with Windows FNT faces, returning an error
+ * otherwise.
+ */
+ FT_EXPORT( FT_Error )
+ FT_Get_WinFNT_Header( FT_Face face,
+ FT_WinFNT_HeaderRec *aheader );
+
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __FTWINFNT_H__ */
+
+
+/* END */
+
+
+/* Local Variables: */
+/* coding: utf-8 */
+/* End: */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftxf86.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftxf86.h
new file mode 100644
index 0000000000..d7e2dabc4c
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ftxf86.h
@@ -0,0 +1,83 @@
+/***************************************************************************/
+/* */
+/* ftxf86.h */
+/* */
+/* Support functions for X11. */
+/* */
+/* Copyright 2002, 2003, 2004, 2006, 2007 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTXF86_H__
+#define __FTXF86_H__
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* font_formats */
+ /* */
+ /* <Title> */
+ /* Font Formats */
+ /* */
+ /* <Abstract> */
+ /* Getting the font format. */
+ /* */
+ /* <Description> */
+ /* The single function in this section can be used to get the font */
+ /* format. Note that this information is not needed normally; */
+ /* however, there are special cases (like in PDF devices) where it is */
+ /* important to differentiate, in spite of FreeType's uniform API. */
+ /* */
+ /* This function is in the X11/xf86 namespace for historical reasons */
+ /* and in no way depends on that windowing system. */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_X11_Font_Format */
+ /* */
+ /* <Description> */
+ /* Return a string describing the format of a given face, using values */
+ /* which can be used as an X11 FONT_PROPERTY. Possible values are */
+ /* `TrueType', `Type~1', `BDF', `PCF', `Type~42', `CID~Type~1', `CFF', */
+ /* `PFR', and `Windows~FNT'. */
+ /* */
+ /* <Input> */
+ /* face :: */
+ /* Input face handle. */
+ /* */
+ /* <Return> */
+ /* Font format string. NULL in case of error. */
+ /* */
+ FT_EXPORT( const char* )
+ FT_Get_X11_Font_Format( FT_Face face );
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __FTXF86_H__ */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/autohint.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/autohint.h
new file mode 100644
index 0000000000..f07646d469
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/autohint.h
@@ -0,0 +1,244 @@
+/***************************************************************************/
+/* */
+/* autohint.h */
+/* */
+/* High-level `autohint' module-specific interface (specification). */
+/* */
+/* Copyright 1996-2002, 2007, 2009, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* The auto-hinter is used to load and automatically hint glyphs if a */
+ /* format-specific hinter isn't available. */
+ /* */
+ /*************************************************************************/
+
+
+#ifndef __AUTOHINT_H__
+#define __AUTOHINT_H__
+
+
+ /*************************************************************************/
+ /* */
+ /* A small technical note regarding automatic hinting in order to */
+ /* clarify this module interface. */
+ /* */
+ /* An automatic hinter might compute two kinds of data for a given face: */
+ /* */
+ /* - global hints: Usually some metrics that describe global properties */
+ /* of the face. It is computed by scanning more or less */
+ /* aggressively the glyphs in the face, and thus can be */
+ /* very slow to compute (even if the size of global */
+ /* hints is really small). */
+ /* */
+ /* - glyph hints: These describe some important features of the glyph */
+ /* outline, as well as how to align them. They are */
+ /* generally much faster to compute than global hints. */
+ /* */
+ /* The current FreeType auto-hinter does a pretty good job while */
+ /* performing fast computations for both global and glyph hints. */
+ /* However, we might be interested in introducing more complex and */
+ /* powerful algorithms in the future, like the one described in the John */
+ /* D. Hobby paper, which unfortunately requires a lot more horsepower. */
+ /* */
+ /* Because a sufficiently sophisticated font management system would */
+ /* typically implement an LRU cache of opened face objects to reduce */
+ /* memory usage, it is a good idea to be able to avoid recomputing */
+ /* global hints every time the same face is re-opened. */
+ /* */
+ /* We thus provide the ability to cache global hints outside of the face */
+ /* object, in order to speed up font re-opening time. Of course, this */
+ /* feature is purely optional, so most client programs won't even notice */
+ /* it. */
+ /* */
+ /* I initially thought that it would be a good idea to cache the glyph */
+ /* hints too. However, my general idea now is that if you really need */
+ /* to cache these too, you are simply in need of a new font format, */
+ /* where all this information could be stored within the font file and */
+ /* decoded on the fly. */
+ /* */
+ /*************************************************************************/
+
+
+#include "../../ft2build.h"
+#include "../freetype.h"
+
+
+FT_BEGIN_HEADER
+
+
+ typedef struct FT_AutoHinterRec_ *FT_AutoHinter;
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_AutoHinter_GlobalGetFunc */
+ /* */
+ /* <Description> */
+ /* Retrieve the global hints computed for a given face object. The */
+ /* resulting data is dissociated from the face and will survive a */
+ /* call to FT_Done_Face(). It must be discarded through the API */
+ /* FT_AutoHinter_GlobalDoneFunc(). */
+ /* */
+ /* <Input> */
+ /* hinter :: A handle to the source auto-hinter. */
+ /* */
+ /* face :: A handle to the source face object. */
+ /* */
+ /* <Output> */
+ /* global_hints :: A typeless pointer to the global hints. */
+ /* */
+ /* global_len :: The size in bytes of the global hints. */
+ /* */
+ typedef void
+ (*FT_AutoHinter_GlobalGetFunc)( FT_AutoHinter hinter,
+ FT_Face face,
+ void** global_hints,
+ long* global_len );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_AutoHinter_GlobalDoneFunc */
+ /* */
+ /* <Description> */
+ /* Discard the global hints retrieved through */
+ /* FT_AutoHinter_GlobalGetFunc(). This is the only way these hints */
+ /* are freed from memory. */
+ /* */
+ /* <Input> */
+ /* hinter :: A handle to the auto-hinter module. */
+ /* */
+ /* global :: A pointer to retrieved global hints to discard. */
+ /* */
+ typedef void
+ (*FT_AutoHinter_GlobalDoneFunc)( FT_AutoHinter hinter,
+ void* global );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_AutoHinter_GlobalResetFunc */
+ /* */
+ /* <Description> */
+ /* This function is used to recompute the global metrics in a given */
+ /* font. This is useful when global font data changes (e.g. Multiple */
+ /* Masters fonts where blend coordinates change). */
+ /* */
+ /* <Input> */
+ /* hinter :: A handle to the source auto-hinter. */
+ /* */
+ /* face :: A handle to the face. */
+ /* */
+ typedef void
+ (*FT_AutoHinter_GlobalResetFunc)( FT_AutoHinter hinter,
+ FT_Face face );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_AutoHinter_GlyphLoadFunc */
+ /* */
+ /* <Description> */
+ /* This function is used to load, scale, and automatically hint a */
+ /* glyph from a given face. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the face. */
+ /* */
+ /* glyph_index :: The glyph index. */
+ /* */
+ /* load_flags :: The load flags. */
+ /* */
+ /* <Note> */
+ /* This function is capable of loading composite glyphs by hinting */
+ /* each sub-glyph independently (which improves quality). */
+ /* */
+ /* It will call the font driver with @FT_Load_Glyph, with */
+ /* @FT_LOAD_NO_SCALE set. */
+ /* */
+ typedef FT_Error
+ (*FT_AutoHinter_GlyphLoadFunc)( FT_AutoHinter hinter,
+ FT_GlyphSlot slot,
+ FT_Size size,
+ FT_UInt glyph_index,
+ FT_Int32 load_flags );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_AutoHinter_InterfaceRec */
+ /* */
+ /* <Description> */
+ /* The auto-hinter module's interface. */
+ /* */
+ typedef struct FT_AutoHinter_InterfaceRec_
+ {
+ FT_AutoHinter_GlobalResetFunc reset_face;
+ FT_AutoHinter_GlobalGetFunc get_global_hints;
+ FT_AutoHinter_GlobalDoneFunc done_global_hints;
+ FT_AutoHinter_GlyphLoadFunc load_glyph;
+
+ } FT_AutoHinter_InterfaceRec, *FT_AutoHinter_Interface;
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_AUTOHINTER_INTERFACE( \
+ class_, \
+ reset_face_, \
+ get_global_hints_, \
+ done_global_hints_, \
+ load_glyph_ ) \
+ FT_CALLBACK_TABLE_DEF \
+ const FT_AutoHinter_InterfaceRec class_ = \
+ { \
+ reset_face_, \
+ get_global_hints_, \
+ done_global_hints_, \
+ load_glyph_ \
+ };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_AUTOHINTER_INTERFACE( \
+ class_, \
+ reset_face_, \
+ get_global_hints_, \
+ done_global_hints_, \
+ load_glyph_ ) \
+ void \
+ FT_Init_Class_ ## class_( FT_Library library, \
+ FT_AutoHinter_InterfaceRec* clazz ) \
+ { \
+ FT_UNUSED( library ); \
+ \
+ clazz->reset_face = reset_face_; \
+ clazz->get_global_hints = get_global_hints_; \
+ clazz->done_global_hints = done_global_hints_; \
+ clazz->load_glyph = load_glyph_; \
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+FT_END_HEADER
+
+#endif /* __AUTOHINT_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftcalc.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftcalc.h
new file mode 100644
index 0000000000..1f2462dcec
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftcalc.h
@@ -0,0 +1,167 @@
+/***************************************************************************/
+/* */
+/* ftcalc.h */
+/* */
+/* Arithmetic computations (specification). */
+/* */
+/* Copyright 1996-2006, 2008, 2009, 2012-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTCALC_H__
+#define __FTCALC_H__
+
+
+#include "../../ft2build.h"
+#include "../freetype.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_FixedSqrt */
+ /* */
+ /* <Description> */
+ /* Computes the square root of a 16.16 fixed-point value. */
+ /* */
+ /* <Input> */
+ /* x :: The value to compute the root for. */
+ /* */
+ /* <Return> */
+ /* The result of `sqrt(x)'. */
+ /* */
+ /* <Note> */
+ /* This function is not very fast. */
+ /* */
+ FT_BASE( FT_Int32 )
+ FT_SqrtFixed( FT_Int32 x );
+
+
+ /*************************************************************************/
+ /* */
+ /* FT_MulDiv() and FT_MulFix() are declared in freetype.h. */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_MulDiv_No_Round */
+ /* */
+ /* <Description> */
+ /* A very simple function used to perform the computation `(a*b)/c' */
+ /* (without rounding) with maximum accuracy (it uses a 64-bit */
+ /* intermediate integer whenever necessary). */
+ /* */
+ /* This function isn't necessarily as fast as some processor specific */
+ /* operations, but is at least completely portable. */
+ /* */
+ /* <Input> */
+ /* a :: The first multiplier. */
+ /* b :: The second multiplier. */
+ /* c :: The divisor. */
+ /* */
+ /* <Return> */
+ /* The result of `(a*b)/c'. This function never traps when trying to */
+ /* divide by zero; it simply returns `MaxInt' or `MinInt' depending */
+ /* on the signs of `a' and `b'. */
+ /* */
+ FT_BASE( FT_Long )
+ FT_MulDiv_No_Round( FT_Long a,
+ FT_Long b,
+ FT_Long c );
+
+
+ /*
+ * A variant of FT_Matrix_Multiply which scales its result afterwards.
+ * The idea is that both `a' and `b' are scaled by factors of 10 so that
+ * the values are as precise as possible to get a correct result during
+ * the 64bit multiplication. Let `sa' and `sb' be the scaling factors of
+ * `a' and `b', respectively, then the scaling factor of the result is
+ * `sa*sb'.
+ */
+ FT_BASE( void )
+ FT_Matrix_Multiply_Scaled( const FT_Matrix* a,
+ FT_Matrix *b,
+ FT_Long scaling );
+
+
+ /*
+ * A variant of FT_Vector_Transform. See comments for
+ * FT_Matrix_Multiply_Scaled.
+ */
+ FT_BASE( void )
+ FT_Vector_Transform_Scaled( FT_Vector* vector,
+ const FT_Matrix* matrix,
+ FT_Long scaling );
+
+
+ /*
+ * Return -1, 0, or +1, depending on the orientation of a given corner.
+ * We use the Cartesian coordinate system, with positive vertical values
+ * going upwards. The function returns +1 if the corner turns to the
+ * left, -1 to the right, and 0 for undecidable cases.
+ */
+ FT_BASE( FT_Int )
+ ft_corner_orientation( FT_Pos in_x,
+ FT_Pos in_y,
+ FT_Pos out_x,
+ FT_Pos out_y );
+
+ /*
+ * Return TRUE if a corner is flat or nearly flat. This is equivalent to
+ * saying that the angle difference between the `in' and `out' vectors is
+ * very small.
+ */
+ FT_BASE( FT_Int )
+ ft_corner_is_flat( FT_Pos in_x,
+ FT_Pos in_y,
+ FT_Pos out_x,
+ FT_Pos out_y );
+
+
+ /*
+ * Return the most significant bit index.
+ */
+ FT_BASE( FT_Int )
+ FT_MSB( FT_UInt32 z );
+
+
+ /*
+ * Return sqrt(x*x+y*y), which is the same as `FT_Vector_Length' but uses
+ * two fixed-point arguments instead.
+ */
+ FT_BASE( FT_Fixed )
+ FT_Hypot( FT_Fixed x,
+ FT_Fixed y );
+
+
+#define INT_TO_F26DOT6( x ) ( (FT_Long)(x) << 6 )
+#define INT_TO_F2DOT14( x ) ( (FT_Long)(x) << 14 )
+#define INT_TO_FIXED( x ) ( (FT_Long)(x) << 16 )
+#define F2DOT14_TO_FIXED( x ) ( (FT_Long)(x) << 2 )
+#define FLOAT_TO_FIXED( x ) ( (FT_Long)( x * 65536.0 ) )
+#define FIXED_TO_INT( x ) ( FT_RoundFix( x ) >> 16 )
+
+#define ROUND_F26DOT6( x ) ( x >= 0 ? ( ( (x) + 32 ) & -64 ) \
+ : ( -( ( 32 - (x) ) & -64 ) ) )
+
+
+FT_END_HEADER
+
+#endif /* __FTCALC_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftdebug.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftdebug.h
new file mode 100644
index 0000000000..e7b14191af
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftdebug.h
@@ -0,0 +1,255 @@
+/***************************************************************************/
+/* */
+/* ftdebug.h */
+/* */
+/* Debugging and logging component (specification). */
+/* */
+/* Copyright 1996-2002, 2004, 2006-2009, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/* */
+/* IMPORTANT: A description of FreeType's debugging support can be */
+/* found in `docs/DEBUG.TXT'. Read it if you need to use or */
+/* understand this code. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTDEBUG_H__
+#define __FTDEBUG_H__
+
+
+#include "../../ft2build.h"
+#include "../config/ftconfig.h"
+#include "../freetype.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /* force the definition of FT_DEBUG_LEVEL_ERROR if FT_DEBUG_LEVEL_TRACE */
+ /* is already defined; this simplifies the following #ifdefs */
+ /* */
+#ifdef FT_DEBUG_LEVEL_TRACE
+#undef FT_DEBUG_LEVEL_ERROR
+#define FT_DEBUG_LEVEL_ERROR
+#endif
+
+
+ /*************************************************************************/
+ /* */
+ /* Define the trace enums as well as the trace levels array when they */
+ /* are needed. */
+ /* */
+ /*************************************************************************/
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+
+#define FT_TRACE_DEF( x ) trace_ ## x ,
+
+ /* defining the enumeration */
+ typedef enum FT_Trace_
+ {
+#include "fttrace.h"
+ trace_count
+
+ } FT_Trace;
+
+
+ /* defining the array of trace levels, provided by `src/base/ftdebug.c' */
+ extern int ft_trace_levels[trace_count];
+
+#undef FT_TRACE_DEF
+
+#endif /* FT_DEBUG_LEVEL_TRACE */
+
+
+ /*************************************************************************/
+ /* */
+ /* Define the FT_TRACE macro */
+ /* */
+ /* IMPORTANT! */
+ /* */
+ /* Each component must define the macro FT_COMPONENT to a valid FT_Trace */
+ /* value before using any TRACE macro. */
+ /* */
+ /*************************************************************************/
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+
+#define FT_TRACE( level, varformat ) \
+ do \
+ { \
+ if ( ft_trace_levels[FT_COMPONENT] >= level ) \
+ FT_Message varformat; \
+ } while ( 0 )
+
+#else /* !FT_DEBUG_LEVEL_TRACE */
+
+#define FT_TRACE( level, varformat ) do { } while ( 0 ) /* nothing */
+
+#endif /* !FT_DEBUG_LEVEL_TRACE */
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Trace_Get_Count */
+ /* */
+ /* <Description> */
+ /* Return the number of available trace components. */
+ /* */
+ /* <Return> */
+ /* The number of trace components. 0 if FreeType 2 is not built with */
+ /* FT_DEBUG_LEVEL_TRACE definition. */
+ /* */
+ /* <Note> */
+ /* This function may be useful if you want to access elements of */
+ /* the internal `ft_trace_levels' array by an index. */
+ /* */
+ FT_BASE( FT_Int )
+ FT_Trace_Get_Count( void );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Trace_Get_Name */
+ /* */
+ /* <Description> */
+ /* Return the name of a trace component. */
+ /* */
+ /* <Input> */
+ /* The index of the trace component. */
+ /* */
+ /* <Return> */
+ /* The name of the trace component. This is a statically allocated */
+ /* C string, so do not free it after use. NULL if FreeType 2 is not */
+ /* built with FT_DEBUG_LEVEL_TRACE definition. */
+ /* */
+ /* <Note> */
+ /* Use @FT_Trace_Get_Count to get the number of available trace */
+ /* components. */
+ /* */
+ /* This function may be useful if you want to control FreeType 2's */
+ /* debug level in your application. */
+ /* */
+ FT_BASE( const char * )
+ FT_Trace_Get_Name( FT_Int idx );
+
+
+ /*************************************************************************/
+ /* */
+ /* You need two opening and closing parentheses! */
+ /* */
+ /* Example: FT_TRACE0(( "Value is %i", foo )) */
+ /* */
+ /* Output of the FT_TRACEX macros is sent to stderr. */
+ /* */
+ /*************************************************************************/
+
+#define FT_TRACE0( varformat ) FT_TRACE( 0, varformat )
+#define FT_TRACE1( varformat ) FT_TRACE( 1, varformat )
+#define FT_TRACE2( varformat ) FT_TRACE( 2, varformat )
+#define FT_TRACE3( varformat ) FT_TRACE( 3, varformat )
+#define FT_TRACE4( varformat ) FT_TRACE( 4, varformat )
+#define FT_TRACE5( varformat ) FT_TRACE( 5, varformat )
+#define FT_TRACE6( varformat ) FT_TRACE( 6, varformat )
+#define FT_TRACE7( varformat ) FT_TRACE( 7, varformat )
+
+
+ /*************************************************************************/
+ /* */
+ /* Define the FT_ERROR macro. */
+ /* */
+ /* Output of this macro is sent to stderr. */
+ /* */
+ /*************************************************************************/
+
+#ifdef FT_DEBUG_LEVEL_ERROR
+
+#define FT_ERROR( varformat ) FT_Message varformat
+
+#else /* !FT_DEBUG_LEVEL_ERROR */
+
+#define FT_ERROR( varformat ) do { } while ( 0 ) /* nothing */
+
+#endif /* !FT_DEBUG_LEVEL_ERROR */
+
+
+ /*************************************************************************/
+ /* */
+ /* Define the FT_ASSERT and FT_THROW macros. The call to `FT_Throw' */
+ /* makes it possible to easily set a breakpoint at this function. */
+ /* */
+ /*************************************************************************/
+
+#ifdef FT_DEBUG_LEVEL_ERROR
+
+#define FT_ASSERT( condition ) \
+ do \
+ { \
+ if ( !( condition ) ) \
+ FT_Panic( "assertion failed on line %d of file %s\n", \
+ __LINE__, __FILE__ ); \
+ } while ( 0 )
+
+#define FT_THROW( e ) \
+ ( FT_Throw( FT_ERR_CAT( FT_ERR_PREFIX, e ), \
+ __LINE__, \
+ __FILE__ ) | \
+ FT_ERR_CAT( FT_ERR_PREFIX, e ) )
+
+#else /* !FT_DEBUG_LEVEL_ERROR */
+
+#define FT_ASSERT( condition ) do { } while ( 0 )
+
+#define FT_THROW( e ) FT_ERR_CAT( FT_ERR_PREFIX, e )
+
+#endif /* !FT_DEBUG_LEVEL_ERROR */
+
+
+ /*************************************************************************/
+ /* */
+ /* Define `FT_Message' and `FT_Panic' when needed. */
+ /* */
+ /*************************************************************************/
+
+#ifdef FT_DEBUG_LEVEL_ERROR
+
+#include "stdio.h" /* for vfprintf() */
+
+ /* print a message */
+ FT_BASE( void )
+ FT_Message( const char* fmt,
+ ... );
+
+ /* print a message and exit */
+ FT_BASE( void )
+ FT_Panic( const char* fmt,
+ ... );
+
+ /* report file name and line number of an error */
+ FT_BASE( int )
+ FT_Throw( FT_Error error,
+ int line,
+ const char* file );
+
+#endif /* FT_DEBUG_LEVEL_ERROR */
+
+
+ FT_BASE( void )
+ ft_debug_init( void );
+
+FT_END_HEADER
+
+#endif /* __FTDEBUG_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftdriver.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftdriver.h
new file mode 100644
index 0000000000..5b0e863053
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftdriver.h
@@ -0,0 +1,409 @@
+/***************************************************************************/
+/* */
+/* ftdriver.h */
+/* */
+/* FreeType font driver interface (specification). */
+/* */
+/* Copyright 1996-2003, 2006, 2008, 2011-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTDRIVER_H__
+#define __FTDRIVER_H__
+
+
+#include "../../ft2build.h"
+#include "../ftmodapi.h"
+
+
+FT_BEGIN_HEADER
+
+
+ typedef FT_Error
+ (*FT_Face_InitFunc)( FT_Stream stream,
+ FT_Face face,
+ FT_Int typeface_index,
+ FT_Int num_params,
+ FT_Parameter* parameters );
+
+ typedef void
+ (*FT_Face_DoneFunc)( FT_Face face );
+
+
+ typedef FT_Error
+ (*FT_Size_InitFunc)( FT_Size size );
+
+ typedef void
+ (*FT_Size_DoneFunc)( FT_Size size );
+
+
+ typedef FT_Error
+ (*FT_Slot_InitFunc)( FT_GlyphSlot slot );
+
+ typedef void
+ (*FT_Slot_DoneFunc)( FT_GlyphSlot slot );
+
+
+ typedef FT_Error
+ (*FT_Size_RequestFunc)( FT_Size size,
+ FT_Size_Request req );
+
+ typedef FT_Error
+ (*FT_Size_SelectFunc)( FT_Size size,
+ FT_ULong size_index );
+
+ typedef FT_Error
+ (*FT_Slot_LoadFunc)( FT_GlyphSlot slot,
+ FT_Size size,
+ FT_UInt glyph_index,
+ FT_Int32 load_flags );
+
+
+ typedef FT_UInt
+ (*FT_CharMap_CharIndexFunc)( FT_CharMap charmap,
+ FT_Long charcode );
+
+ typedef FT_Long
+ (*FT_CharMap_CharNextFunc)( FT_CharMap charmap,
+ FT_Long charcode );
+
+
+ typedef FT_Error
+ (*FT_Face_GetKerningFunc)( FT_Face face,
+ FT_UInt left_glyph,
+ FT_UInt right_glyph,
+ FT_Vector* kerning );
+
+
+ typedef FT_Error
+ (*FT_Face_AttachFunc)( FT_Face face,
+ FT_Stream stream );
+
+
+ typedef FT_Error
+ (*FT_Face_GetAdvancesFunc)( FT_Face face,
+ FT_UInt first,
+ FT_UInt count,
+ FT_Int32 flags,
+ FT_Fixed* advances );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Driver_ClassRec */
+ /* */
+ /* <Description> */
+ /* The font driver class. This structure mostly contains pointers to */
+ /* driver methods. */
+ /* */
+ /* <Fields> */
+ /* root :: The parent module. */
+ /* */
+ /* face_object_size :: The size of a face object in bytes. */
+ /* */
+ /* size_object_size :: The size of a size object in bytes. */
+ /* */
+ /* slot_object_size :: The size of a glyph object in bytes. */
+ /* */
+ /* init_face :: The format-specific face constructor. */
+ /* */
+ /* done_face :: The format-specific face destructor. */
+ /* */
+ /* init_size :: The format-specific size constructor. */
+ /* */
+ /* done_size :: The format-specific size destructor. */
+ /* */
+ /* init_slot :: The format-specific slot constructor. */
+ /* */
+ /* done_slot :: The format-specific slot destructor. */
+ /* */
+ /* */
+ /* load_glyph :: A function handle to load a glyph to a slot. */
+ /* This field is mandatory! */
+ /* */
+ /* get_kerning :: A function handle to return the unscaled */
+ /* kerning for a given pair of glyphs. Can be */
+ /* set to 0 if the format doesn't support */
+ /* kerning. */
+ /* */
+ /* attach_file :: This function handle is used to read */
+ /* additional data for a face from another */
+ /* file/stream. For example, this can be used to */
+ /* add data from AFM or PFM files on a Type 1 */
+ /* face, or a CIDMap on a CID-keyed face. */
+ /* */
+ /* get_advances :: A function handle used to return advance */
+ /* widths of `count' glyphs (in font units), */
+ /* starting at `first'. The `vertical' flag must */
+ /* be set to get vertical advance heights. The */
+ /* `advances' buffer is caller-allocated. */
+ /* The idea of this function is to be able to */
+ /* perform device-independent text layout without */
+ /* loading a single glyph image. */
+ /* */
+ /* request_size :: A handle to a function used to request the new */
+ /* character size. Can be set to 0 if the */
+ /* scaling done in the base layer suffices. */
+ /* */
+ /* select_size :: A handle to a function used to select a new */
+ /* fixed size. It is used only if */
+ /* @FT_FACE_FLAG_FIXED_SIZES is set. Can be set */
+ /* to 0 if the scaling done in the base layer */
+ /* suffices. */
+ /* <Note> */
+ /* Most function pointers, with the exception of `load_glyph', can be */
+ /* set to 0 to indicate a default behaviour. */
+ /* */
+ typedef struct FT_Driver_ClassRec_
+ {
+ FT_Module_Class root;
+
+ FT_Long face_object_size;
+ FT_Long size_object_size;
+ FT_Long slot_object_size;
+
+ FT_Face_InitFunc init_face;
+ FT_Face_DoneFunc done_face;
+
+ FT_Size_InitFunc init_size;
+ FT_Size_DoneFunc done_size;
+
+ FT_Slot_InitFunc init_slot;
+ FT_Slot_DoneFunc done_slot;
+
+ FT_Slot_LoadFunc load_glyph;
+
+ FT_Face_GetKerningFunc get_kerning;
+ FT_Face_AttachFunc attach_file;
+ FT_Face_GetAdvancesFunc get_advances;
+
+ /* since version 2.2 */
+ FT_Size_RequestFunc request_size;
+ FT_Size_SelectFunc select_size;
+
+ } FT_Driver_ClassRec, *FT_Driver_Class;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Macro> */
+ /* FT_DECLARE_DRIVER */
+ /* */
+ /* <Description> */
+ /* Used to create a forward declaration of an FT_Driver_ClassRec */
+ /* struct instance. */
+ /* */
+ /* <Macro> */
+ /* FT_DEFINE_DRIVER */
+ /* */
+ /* <Description> */
+ /* Used to initialize an instance of FT_Driver_ClassRec struct. */
+ /* */
+ /* When FT_CONFIG_OPTION_PIC is defined a `create' function has to be */
+ /* called with a pointer where the allocated structure is returned. */
+ /* And when it is no longer needed a `destroy' function needs to be */
+ /* called to release that allocation. */
+ /* */
+ /* `fcinit.c' (ft_create_default_module_classes) already contains a */
+ /* mechanism to call these functions for the default modules */
+ /* described in `ftmodule.h'. */
+ /* */
+ /* Notice that the created `create' and `destroy' functions call */
+ /* `pic_init' and `pic_free' to allow you to manually allocate and */
+ /* initialize any additional global data, like a module specific */
+ /* interface, and put them in the global pic container defined in */
+ /* `ftpic.h'. If you don't need them just implement the functions as */
+ /* empty to resolve the link error. Also the `pic_init' and */
+ /* `pic_free' functions should be declared in `pic.h', to be referred */
+ /* by driver definition calling `FT_DEFINE_DRIVER' in following. */
+ /* */
+ /* When FT_CONFIG_OPTION_PIC is not defined the struct will be */
+ /* allocated in the global scope (or the scope where the macro is */
+ /* used). */
+ /* */
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DECLARE_DRIVER( class_ ) \
+ FT_CALLBACK_TABLE \
+ const FT_Driver_ClassRec class_;
+
+#define FT_DEFINE_DRIVER( \
+ class_, \
+ flags_, \
+ size_, \
+ name_, \
+ version_, \
+ requires_, \
+ interface_, \
+ init_, \
+ done_, \
+ get_interface_, \
+ face_object_size_, \
+ size_object_size_, \
+ slot_object_size_, \
+ init_face_, \
+ done_face_, \
+ init_size_, \
+ done_size_, \
+ init_slot_, \
+ done_slot_, \
+ load_glyph_, \
+ get_kerning_, \
+ attach_file_, \
+ get_advances_, \
+ request_size_, \
+ select_size_ ) \
+ FT_CALLBACK_TABLE_DEF \
+ const FT_Driver_ClassRec class_ = \
+ { \
+ FT_DEFINE_ROOT_MODULE( flags_, \
+ size_, \
+ name_, \
+ version_, \
+ requires_, \
+ interface_, \
+ init_, \
+ done_, \
+ get_interface_ ) \
+ \
+ face_object_size_, \
+ size_object_size_, \
+ slot_object_size_, \
+ \
+ init_face_, \
+ done_face_, \
+ \
+ init_size_, \
+ done_size_, \
+ \
+ init_slot_, \
+ done_slot_, \
+ \
+ load_glyph_, \
+ \
+ get_kerning_, \
+ attach_file_, \
+ get_advances_, \
+ \
+ request_size_, \
+ select_size_ \
+ };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DECLARE_DRIVER( class_ ) FT_DECLARE_MODULE( class_ )
+
+#define FT_DEFINE_DRIVER( \
+ class_, \
+ flags_, \
+ size_, \
+ name_, \
+ version_, \
+ requires_, \
+ interface_, \
+ init_, \
+ done_, \
+ get_interface_, \
+ face_object_size_, \
+ size_object_size_, \
+ slot_object_size_, \
+ init_face_, \
+ done_face_, \
+ init_size_, \
+ done_size_, \
+ init_slot_, \
+ done_slot_, \
+ load_glyph_, \
+ get_kerning_, \
+ attach_file_, \
+ get_advances_, \
+ request_size_, \
+ select_size_ ) \
+ void \
+ FT_Destroy_Class_ ## class_( FT_Library library, \
+ FT_Module_Class* clazz ) \
+ { \
+ FT_Memory memory = library->memory; \
+ FT_Driver_Class dclazz = (FT_Driver_Class)clazz; \
+ \
+ \
+ class_ ## _pic_free( library ); \
+ if ( dclazz ) \
+ FT_FREE( dclazz ); \
+ } \
+ \
+ \
+ FT_Error \
+ FT_Create_Class_ ## class_( FT_Library library, \
+ FT_Module_Class** output_class ) \
+ { \
+ FT_Driver_Class clazz = NULL; \
+ FT_Error error; \
+ FT_Memory memory = library->memory; \
+ \
+ \
+ if ( FT_ALLOC( clazz, sizeof ( *clazz ) ) ) \
+ return error; \
+ \
+ error = class_ ## _pic_init( library ); \
+ if ( error ) \
+ { \
+ FT_FREE( clazz ); \
+ return error; \
+ } \
+ \
+ FT_DEFINE_ROOT_MODULE( flags_, \
+ size_, \
+ name_, \
+ version_, \
+ requires_, \
+ interface_, \
+ init_, \
+ done_, \
+ get_interface_ ) \
+ \
+ clazz->face_object_size = face_object_size_; \
+ clazz->size_object_size = size_object_size_; \
+ clazz->slot_object_size = slot_object_size_; \
+ \
+ clazz->init_face = init_face_; \
+ clazz->done_face = done_face_; \
+ \
+ clazz->init_size = init_size_; \
+ clazz->done_size = done_size_; \
+ \
+ clazz->init_slot = init_slot_; \
+ clazz->done_slot = done_slot_; \
+ \
+ clazz->load_glyph = load_glyph_; \
+ \
+ clazz->get_kerning = get_kerning_; \
+ clazz->attach_file = attach_file_; \
+ clazz->get_advances = get_advances_; \
+ \
+ clazz->request_size = request_size_; \
+ clazz->select_size = select_size_; \
+ \
+ *output_class = (FT_Module_Class*)clazz; \
+ \
+ return FT_Err_Ok; \
+ }
+
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+FT_END_HEADER
+
+#endif /* __FTDRIVER_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftgloadr.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftgloadr.h
new file mode 100644
index 0000000000..76e5a7ee58
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftgloadr.h
@@ -0,0 +1,168 @@
+/***************************************************************************/
+/* */
+/* ftgloadr.h */
+/* */
+/* The FreeType glyph loader (specification). */
+/* */
+/* Copyright 2002, 2003, 2005, 2006 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTGLOADR_H__
+#define __FTGLOADR_H__
+
+
+#include "../../ft2build.h"
+#include "../freetype.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_GlyphLoader */
+ /* */
+ /* <Description> */
+ /* The glyph loader is an internal object used to load several glyphs */
+ /* together (for example, in the case of composites). */
+ /* */
+ /* <Note> */
+ /* The glyph loader implementation is not part of the high-level API, */
+ /* hence the forward structure declaration. */
+ /* */
+ typedef struct FT_GlyphLoaderRec_* FT_GlyphLoader ;
+
+
+#if 0 /* moved to freetype.h in version 2.2 */
+#define FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS 1
+#define FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES 2
+#define FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID 4
+#define FT_SUBGLYPH_FLAG_SCALE 8
+#define FT_SUBGLYPH_FLAG_XY_SCALE 0x40
+#define FT_SUBGLYPH_FLAG_2X2 0x80
+#define FT_SUBGLYPH_FLAG_USE_MY_METRICS 0x200
+#endif
+
+
+ typedef struct FT_SubGlyphRec_
+ {
+ FT_Int index;
+ FT_UShort flags;
+ FT_Int arg1;
+ FT_Int arg2;
+ FT_Matrix transform;
+
+ } FT_SubGlyphRec;
+
+
+ typedef struct FT_GlyphLoadRec_
+ {
+ FT_Outline outline; /* outline */
+ FT_Vector* extra_points; /* extra points table */
+ FT_Vector* extra_points2; /* second extra points table */
+ FT_UInt num_subglyphs; /* number of subglyphs */
+ FT_SubGlyph subglyphs; /* subglyphs */
+
+ } FT_GlyphLoadRec, *FT_GlyphLoad;
+
+
+ typedef struct FT_GlyphLoaderRec_
+ {
+ FT_Memory memory;
+ FT_UInt max_points;
+ FT_UInt max_contours;
+ FT_UInt max_subglyphs;
+ FT_Bool use_extra;
+
+ FT_GlyphLoadRec base;
+ FT_GlyphLoadRec current;
+
+ void* other; /* for possible future extension? */
+
+ } FT_GlyphLoaderRec;
+
+
+ /* create new empty glyph loader */
+ FT_BASE( FT_Error )
+ FT_GlyphLoader_New( FT_Memory memory,
+ FT_GlyphLoader *aloader );
+
+ /* add an extra points table to a glyph loader */
+ FT_BASE( FT_Error )
+ FT_GlyphLoader_CreateExtra( FT_GlyphLoader loader );
+
+ /* destroy a glyph loader */
+ FT_BASE( void )
+ FT_GlyphLoader_Done( FT_GlyphLoader loader );
+
+ /* reset a glyph loader (frees everything int it) */
+ FT_BASE( void )
+ FT_GlyphLoader_Reset( FT_GlyphLoader loader );
+
+ /* rewind a glyph loader */
+ FT_BASE( void )
+ FT_GlyphLoader_Rewind( FT_GlyphLoader loader );
+
+ /* check that there is enough space to add `n_points' and `n_contours' */
+ /* to the glyph loader */
+ FT_BASE( FT_Error )
+ FT_GlyphLoader_CheckPoints( FT_GlyphLoader loader,
+ FT_UInt n_points,
+ FT_UInt n_contours );
+
+
+#define FT_GLYPHLOADER_CHECK_P( _loader, _count ) \
+ ( (_count) == 0 || ((_loader)->base.outline.n_points + \
+ (_loader)->current.outline.n_points + \
+ (unsigned long)(_count)) <= (_loader)->max_points )
+
+#define FT_GLYPHLOADER_CHECK_C( _loader, _count ) \
+ ( (_count) == 0 || ((_loader)->base.outline.n_contours + \
+ (_loader)->current.outline.n_contours + \
+ (unsigned long)(_count)) <= (_loader)->max_contours )
+
+#define FT_GLYPHLOADER_CHECK_POINTS( _loader, _points,_contours ) \
+ ( ( FT_GLYPHLOADER_CHECK_P( _loader, _points ) && \
+ FT_GLYPHLOADER_CHECK_C( _loader, _contours ) ) \
+ ? 0 \
+ : FT_GlyphLoader_CheckPoints( (_loader), (_points), (_contours) ) )
+
+
+ /* check that there is enough space to add `n_subs' sub-glyphs to */
+ /* a glyph loader */
+ FT_BASE( FT_Error )
+ FT_GlyphLoader_CheckSubGlyphs( FT_GlyphLoader loader,
+ FT_UInt n_subs );
+
+ /* prepare a glyph loader, i.e. empty the current glyph */
+ FT_BASE( void )
+ FT_GlyphLoader_Prepare( FT_GlyphLoader loader );
+
+ /* add the current glyph to the base glyph */
+ FT_BASE( void )
+ FT_GlyphLoader_Add( FT_GlyphLoader loader );
+
+ /* copy points from one glyph loader to another */
+ FT_BASE( FT_Error )
+ FT_GlyphLoader_CopyPoints( FT_GlyphLoader target,
+ FT_GlyphLoader source );
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTGLOADR_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftmemory.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftmemory.h
new file mode 100644
index 0000000000..432a9ba6d8
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftmemory.h
@@ -0,0 +1,459 @@
+/***************************************************************************/
+/* */
+/* ftmemory.h */
+/* */
+/* The FreeType memory management macros (specification). */
+/* */
+/* Copyright 1996-2002, 2004-2007, 2010, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTMEMORY_H__
+#define __FTMEMORY_H__
+
+
+#include "../../ft2build.h"
+#include "../config/ftconfig.h"
+#include "../fttypes.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Macro> */
+ /* FT_SET_ERROR */
+ /* */
+ /* <Description> */
+ /* This macro is used to set an implicit `error' variable to a given */
+ /* expression's value (usually a function call), and convert it to a */
+ /* boolean which is set whenever the value is != 0. */
+ /* */
+#undef FT_SET_ERROR
+#define FT_SET_ERROR( expression ) \
+ ( ( error = (expression) ) != 0 )
+
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** ****/
+ /**** M E M O R Y ****/
+ /**** ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*
+ * C++ refuses to handle statements like p = (void*)anything, with `p' a
+ * typed pointer. Since we don't have a `typeof' operator in standard
+ * C++, we have to use a template to emulate it.
+ */
+
+#ifdef __cplusplus
+
+ extern "C++"
+ template <typename T> inline T*
+ cplusplus_typeof( T*,
+ void *v )
+ {
+ return static_cast <T*> ( v );
+ }
+
+#define FT_ASSIGNP( p, val ) (p) = cplusplus_typeof( (p), (val) )
+
+#else
+
+#define FT_ASSIGNP( p, val ) (p) = (val)
+
+#endif
+
+
+
+#ifdef FT_DEBUG_MEMORY
+
+ FT_BASE( const char* ) _ft_debug_file;
+ FT_BASE( long ) _ft_debug_lineno;
+
+#define FT_DEBUG_INNER( exp ) ( _ft_debug_file = __FILE__, \
+ _ft_debug_lineno = __LINE__, \
+ (exp) )
+
+#define FT_ASSIGNP_INNER( p, exp ) ( _ft_debug_file = __FILE__, \
+ _ft_debug_lineno = __LINE__, \
+ FT_ASSIGNP( p, exp ) )
+
+#else /* !FT_DEBUG_MEMORY */
+
+#define FT_DEBUG_INNER( exp ) (exp)
+#define FT_ASSIGNP_INNER( p, exp ) FT_ASSIGNP( p, exp )
+
+#endif /* !FT_DEBUG_MEMORY */
+
+
+ /*
+ * The allocation functions return a pointer, and the error code
+ * is written to through the `p_error' parameter. See below for
+ * for documentation.
+ */
+
+ FT_BASE( FT_Pointer )
+ ft_mem_alloc( FT_Memory memory,
+ FT_Long size,
+ FT_Error *p_error );
+
+ FT_BASE( FT_Pointer )
+ ft_mem_qalloc( FT_Memory memory,
+ FT_Long size,
+ FT_Error *p_error );
+
+ FT_BASE( FT_Pointer )
+ ft_mem_realloc( FT_Memory memory,
+ FT_Long item_size,
+ FT_Long cur_count,
+ FT_Long new_count,
+ void* block,
+ FT_Error *p_error );
+
+ FT_BASE( FT_Pointer )
+ ft_mem_qrealloc( FT_Memory memory,
+ FT_Long item_size,
+ FT_Long cur_count,
+ FT_Long new_count,
+ void* block,
+ FT_Error *p_error );
+#ifdef _DEBUG
+//#define _XYQ_MEM_DEBUG
+#endif
+
+#ifdef _XYQ_MEM_DEBUG /* XYQ */
+ FT_BASE( FT_Pointer )
+ ft_mem_allocdebug( FT_Memory memory,
+ FT_Long size, const char* filename, int line,
+ FT_Error *p_error );
+
+ FT_BASE( FT_Pointer )
+ ft_mem_qallocdebug( FT_Memory memory,
+ FT_Long size, const char* filename, int line,
+ FT_Error *p_error );
+
+ FT_BASE( FT_Pointer )
+ ft_mem_reallocdebug( FT_Memory memory,
+ FT_Long item_size,
+ FT_Long cur_count,
+ FT_Long new_count,
+ void* block, const char* filename, int line,
+ FT_Error *p_error );
+
+ FT_BASE( FT_Pointer )
+ ft_mem_qreallocdebug( FT_Memory memory,
+ FT_Long item_size,
+ FT_Long cur_count,
+ FT_Long new_count,
+ void* block, const char* filename, int line,
+ FT_Error *p_error );
+#endif
+
+
+ FT_BASE( void )
+ ft_mem_free( FT_Memory memory,
+ const void* P );
+
+
+#define FT_MEM_FREE( ptr ) \
+ FT_BEGIN_STMNT \
+ ft_mem_free( memory, (ptr) ); \
+ (ptr) = NULL; \
+ FT_END_STMNT
+#ifndef _XYQ_MEM_DEBUG
+#define FT_MEM_ALLOC( ptr, size ) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_alloc( memory, (size), &error ) )
+
+
+#define FT_MEM_REALLOC( ptr, cursz, newsz ) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, \
+ 1, \
+ (FT_Long)(cursz), \
+ (FT_Long)(newsz), \
+ (ptr), \
+ &error ) )
+
+#define FT_MEM_QALLOC( ptr, size ) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_qalloc( memory, \
+ (FT_Long)(size), \
+ &error ) )
+
+#define FT_MEM_QREALLOC( ptr, cursz, newsz ) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, \
+ 1, \
+ (FT_Long)(cursz), \
+ (FT_Long)(newsz), \
+ (ptr), \
+ &error ) )
+
+#define FT_MEM_ALLOC_MULT( ptr, count, item_size ) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, \
+ (FT_Long)(item_size), \
+ 0, \
+ (FT_Long)(count), \
+ NULL, \
+ &error ) )
+
+#define FT_MEM_REALLOC_MULT( ptr, oldcnt, newcnt, itmsz ) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, \
+ (FT_Long)(itmsz), \
+ (FT_Long)(oldcnt), \
+ (FT_Long)(newcnt), \
+ (ptr), \
+ &error ) )
+
+#define FT_MEM_QALLOC_MULT( ptr, count, item_size ) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, \
+ (FT_Long)(item_size), \
+ 0, \
+ (FT_Long)(count), \
+ NULL, \
+ &error ) )
+
+#define FT_MEM_QREALLOC_MULT( ptr, oldcnt, newcnt, itmsz) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, \
+ (FT_Long)(itmsz), \
+ (FT_Long)(oldcnt), \
+ (FT_Long)(newcnt), \
+ (ptr), \
+ &error ) )
+#define FT_MEM_NEW_ARRAY( ptr, count ) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, sizeof ( *(ptr) ), \
+ 0, (count), \
+ NULL, &error ) )
+
+#define FT_MEM_RENEW_ARRAY( ptr, cursz, newsz ) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, sizeof ( *(ptr) ), \
+ (cursz), (newsz), \
+ (ptr), &error ) )
+
+#define FT_MEM_QNEW_ARRAY( ptr, count ) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, sizeof ( *(ptr) ), \
+ 0, (count), \
+ NULL, &error ) )
+
+#define FT_MEM_QRENEW_ARRAY( ptr, cursz, newsz ) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, sizeof ( *(ptr) ), \
+ (cursz), (newsz), \
+ (ptr), &error ) )
+
+#else
+#define FT_MEM_ALLOC( ptr, size ) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_allocdebug( memory, (size), __FILE__, __LINE__, &error ) )
+
+#define FT_MEM_REALLOC( ptr, cursz, newsz ) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_reallocdebug( memory, 1, \
+ (cursz), (newsz), \
+ (ptr), __FILE__, __LINE__, &error ) )
+
+#define FT_MEM_QALLOC( ptr, size ) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_qallocdebug( memory, (size), __FILE__, __LINE__, &error ) )
+
+#define FT_MEM_QREALLOC( ptr, cursz, newsz ) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_qreallocdebug( memory, 1, \
+ (cursz), (newsz), \
+ (ptr), __FILE__, __LINE__, &error ) )
+
+#define FT_MEM_ALLOC_MULT( ptr, count, item_size ) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_reallocdebug( memory, (item_size), \
+ 0, (count), \
+ NULL, __FILE__, __LINE__, &error ) )
+
+#define FT_MEM_REALLOC_MULT( ptr, oldcnt, newcnt, itmsz ) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_reallocdebug( memory, (itmsz), \
+ (oldcnt), (newcnt), \
+ (ptr), __FILE__, __LINE__, &error ) )
+
+#define FT_MEM_QALLOC_MULT( ptr, count, item_size ) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_qreallocdebug( memory, (item_size), \
+ 0, (count), \
+ NULL, __FILE__, __LINE__, &error ) )
+
+#define FT_MEM_QREALLOC_MULT( ptr, oldcnt, newcnt, itmsz) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_qreallocdebug( memory, (itmsz), \
+ (oldcnt), (newcnt), \
+ (ptr), __FILE__, __LINE__, &error ) )
+ /*************************************************************************/
+ /* */
+ /* The following functions macros expect that their pointer argument is */
+ /* _typed_ in order to automatically compute array element sizes. */
+ /* */
+
+#define FT_MEM_NEW_ARRAY( ptr, count ) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_reallocdebug( memory, sizeof ( *(ptr) ), \
+ 0, (count), \
+ NULL, __FILE__, __LINE__, &error ) )
+
+#define FT_MEM_RENEW_ARRAY( ptr, cursz, newsz ) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_reallocdebug( memory, sizeof ( *(ptr) ), \
+ (cursz), (newsz), \
+ (ptr), __FILE__, __LINE__, &error ) )
+
+#define FT_MEM_QNEW_ARRAY( ptr, count ) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_qreallocdebug( memory, sizeof ( *(ptr) ), \
+ 0, (count), \
+ NULL, __FILE__, __LINE__, &error ) )
+
+#define FT_MEM_QRENEW_ARRAY( ptr, cursz, newsz ) \
+ FT_ASSIGNP_INNER( ptr, ft_mem_qreallocdebug( memory, sizeof ( *(ptr) ), \
+ (cursz), (newsz), \
+ (ptr), __FILE__, __LINE__, &error ) )
+
+#endif
+
+#define FT_MEM_NEW( ptr ) \
+ FT_MEM_ALLOC( ptr, sizeof ( *(ptr) ) )
+
+#define FT_MEM_QNEW( ptr ) \
+ FT_MEM_QALLOC( ptr, sizeof ( *(ptr) ) )
+
+#define FT_MEM_SET_ERROR( cond ) ( (cond), error != 0 )
+
+
+#define FT_MEM_SET( dest, byte, count ) ft_memset( dest, byte, count )
+
+#define FT_MEM_COPY( dest, source, count ) ft_memcpy( dest, source, count )
+
+#define FT_MEM_MOVE( dest, source, count ) ft_memmove( dest, source, count )
+
+
+#define FT_MEM_ZERO( dest, count ) FT_MEM_SET( dest, 0, count )
+
+#define FT_ZERO( p ) FT_MEM_ZERO( p, sizeof ( *(p) ) )
+
+
+#define FT_ARRAY_ZERO( dest, count ) \
+ FT_MEM_ZERO( dest, (count) * sizeof ( *(dest) ) )
+
+#define FT_ARRAY_COPY( dest, source, count ) \
+ FT_MEM_COPY( dest, source, (count) * sizeof ( *(dest) ) )
+
+#define FT_ARRAY_MOVE( dest, source, count ) \
+ FT_MEM_MOVE( dest, source, (count) * sizeof ( *(dest) ) )
+
+
+ /*
+ * Return the maximum number of addressable elements in an array.
+ * We limit ourselves to INT_MAX, rather than UINT_MAX, to avoid
+ * any problems.
+ */
+#define FT_ARRAY_MAX( ptr ) ( FT_INT_MAX / sizeof ( *(ptr) ) )
+
+#define FT_ARRAY_CHECK( ptr, count ) ( (count) <= FT_ARRAY_MAX( ptr ) )
+
+
+ /*************************************************************************/
+ /* */
+ /* The following functions macros expect that their pointer argument is */
+ /* _typed_ in order to automatically compute array element sizes. */
+ /* */
+
+#define FT_ALLOC( ptr, size ) \
+ FT_MEM_SET_ERROR( FT_MEM_ALLOC( ptr, size ) )
+
+#define FT_REALLOC( ptr, cursz, newsz ) \
+ FT_MEM_SET_ERROR( FT_MEM_REALLOC( ptr, cursz, newsz ) )
+
+#define FT_ALLOC_MULT( ptr, count, item_size ) \
+ FT_MEM_SET_ERROR( FT_MEM_ALLOC_MULT( ptr, count, item_size ) )
+
+#define FT_REALLOC_MULT( ptr, oldcnt, newcnt, itmsz ) \
+ FT_MEM_SET_ERROR( FT_MEM_REALLOC_MULT( ptr, oldcnt, \
+ newcnt, itmsz ) )
+
+#define FT_QALLOC( ptr, size ) \
+ FT_MEM_SET_ERROR( FT_MEM_QALLOC( ptr, size ) )
+
+#define FT_QREALLOC( ptr, cursz, newsz ) \
+ FT_MEM_SET_ERROR( FT_MEM_QREALLOC( ptr, cursz, newsz ) )
+
+#define FT_QALLOC_MULT( ptr, count, item_size ) \
+ FT_MEM_SET_ERROR( FT_MEM_QALLOC_MULT( ptr, count, item_size ) )
+
+#define FT_QREALLOC_MULT( ptr, oldcnt, newcnt, itmsz ) \
+ FT_MEM_SET_ERROR( FT_MEM_QREALLOC_MULT( ptr, oldcnt, \
+ newcnt, itmsz ) )
+
+#define FT_FREE( ptr ) FT_MEM_FREE( ptr )
+
+#define FT_NEW( ptr ) FT_MEM_SET_ERROR( FT_MEM_NEW( ptr ) )
+
+#define FT_NEW_ARRAY( ptr, count ) \
+ FT_MEM_SET_ERROR( FT_MEM_NEW_ARRAY( ptr, count ) )
+
+#define FT_RENEW_ARRAY( ptr, curcnt, newcnt ) \
+ FT_MEM_SET_ERROR( FT_MEM_RENEW_ARRAY( ptr, curcnt, newcnt ) )
+
+#define FT_QNEW( ptr ) \
+ FT_MEM_SET_ERROR( FT_MEM_QNEW( ptr ) )
+
+#define FT_QNEW_ARRAY( ptr, count ) \
+ FT_MEM_SET_ERROR( FT_MEM_NEW_ARRAY( ptr, count ) )
+
+#define FT_QRENEW_ARRAY( ptr, curcnt, newcnt ) \
+ FT_MEM_SET_ERROR( FT_MEM_RENEW_ARRAY( ptr, curcnt, newcnt ) )
+
+
+ FT_BASE( FT_Pointer )
+ ft_mem_strdup( FT_Memory memory,
+ const char* str,
+ FT_Error *p_error );
+
+ FT_BASE( FT_Pointer )
+ ft_mem_dup( FT_Memory memory,
+ const void* address,
+ FT_ULong size,
+ FT_Error *p_error );
+
+
+#define FT_MEM_STRDUP( dst, str ) \
+ (dst) = (char*)ft_mem_strdup( memory, (const char*)(str), &error )
+
+#define FT_STRDUP( dst, str ) \
+ FT_MEM_SET_ERROR( FT_MEM_STRDUP( dst, str ) )
+
+#define FT_MEM_DUP( dst, address, size ) \
+ (dst) = ft_mem_dup( memory, (address), (FT_ULong)(size), &error )
+
+#define FT_DUP( dst, address, size ) \
+ FT_MEM_SET_ERROR( FT_MEM_DUP( dst, address, size ) )
+
+
+ /* Return >= 1 if a truncation occurs. */
+ /* Return 0 if the source string fits the buffer. */
+ /* This is *not* the same as strlcpy(). */
+ FT_BASE( FT_Int )
+ ft_mem_strcpyn( char* dst,
+ const char* src,
+ FT_ULong size );
+
+#define FT_STRCPYN( dst, src, size ) \
+ ft_mem_strcpyn( (char*)dst, (const char*)(src), (FT_ULong)(size) )
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTMEMORY_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftobjs.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftobjs.h
new file mode 100644
index 0000000000..d6f7de3dc9
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftobjs.h
@@ -0,0 +1,1569 @@
+/***************************************************************************/
+/* */
+/* ftobjs.h */
+/* */
+/* The FreeType private base classes (specification). */
+/* */
+/* Copyright 1996-2006, 2008, 2010, 2012-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* This file contains the definition of all internal FreeType classes. */
+ /* */
+ /*************************************************************************/
+
+
+#ifndef __FTOBJS_H__
+#define __FTOBJS_H__
+
+#include "../../ft2build.h"
+#include "../ftrender.h"
+#include "../ftsizes.h"
+#include "../ftlcdfil.h"
+#include "ftmemory.h"
+#include "ftgloadr.h"
+#include "ftdriver.h"
+#include "autohint.h"
+#include "ftserv.h"
+#include "ftpic.h"
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+#include "../ftincrem.h"
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* Some generic definitions. */
+ /* */
+#ifndef TRUE
+#define TRUE 1
+#endif
+
+#ifndef FALSE
+#define FALSE 0
+#endif
+
+#ifndef NULL
+#define NULL (void*)0
+#endif
+
+
+ /*************************************************************************/
+ /* */
+ /* The min and max functions missing in C. As usual, be careful not to */
+ /* write things like FT_MIN( a++, b++ ) to avoid side effects. */
+ /* */
+#define FT_MIN( a, b ) ( (a) < (b) ? (a) : (b) )
+#define FT_MAX( a, b ) ( (a) > (b) ? (a) : (b) )
+
+#define FT_ABS( a ) ( (a) < 0 ? -(a) : (a) )
+
+
+#define FT_PAD_FLOOR( x, n ) ( (x) & ~((n)-1) )
+#define FT_PAD_ROUND( x, n ) FT_PAD_FLOOR( (x) + ((n)/2), n )
+#define FT_PAD_CEIL( x, n ) FT_PAD_FLOOR( (x) + ((n)-1), n )
+
+#define FT_PIX_FLOOR( x ) ( (x) & ~63 )
+#define FT_PIX_ROUND( x ) FT_PIX_FLOOR( (x) + 32 )
+#define FT_PIX_CEIL( x ) FT_PIX_FLOOR( (x) + 63 )
+
+
+ /*
+ * Return the highest power of 2 that is <= value; this correspond to
+ * the highest bit in a given 32-bit value.
+ */
+ FT_BASE( FT_UInt32 )
+ ft_highpow2( FT_UInt32 value );
+
+
+ /*
+ * character classification functions -- since these are used to parse
+ * font files, we must not use those in <ctypes.h> which are
+ * locale-dependent
+ */
+#define ft_isdigit( x ) ( ( (unsigned)(x) - '0' ) < 10U )
+
+#define ft_isxdigit( x ) ( ( (unsigned)(x) - '0' ) < 10U || \
+ ( (unsigned)(x) - 'a' ) < 6U || \
+ ( (unsigned)(x) - 'A' ) < 6U )
+
+ /* the next two macros assume ASCII representation */
+#define ft_isupper( x ) ( ( (unsigned)(x) - 'A' ) < 26U )
+#define ft_islower( x ) ( ( (unsigned)(x) - 'a' ) < 26U )
+
+#define ft_isalpha( x ) ( ft_isupper( x ) || ft_islower( x ) )
+#define ft_isalnum( x ) ( ft_isdigit( x ) || ft_isalpha( x ) )
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** ****/
+ /**** C H A R M A P S ****/
+ /**** ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /* handle to internal charmap object */
+ typedef struct FT_CMapRec_* FT_CMap;
+
+ /* handle to charmap class structure */
+ typedef const struct FT_CMap_ClassRec_* FT_CMap_Class;
+
+ /* internal charmap object structure */
+ typedef struct FT_CMapRec_
+ {
+ FT_CharMapRec charmap;
+ FT_CMap_Class clazz;
+
+ } FT_CMapRec;
+
+ /* typecase any pointer to a charmap handle */
+#define FT_CMAP( x ) ((FT_CMap)( x ))
+
+ /* obvious macros */
+#define FT_CMAP_PLATFORM_ID( x ) FT_CMAP( x )->charmap.platform_id
+#define FT_CMAP_ENCODING_ID( x ) FT_CMAP( x )->charmap.encoding_id
+#define FT_CMAP_ENCODING( x ) FT_CMAP( x )->charmap.encoding
+#define FT_CMAP_FACE( x ) FT_CMAP( x )->charmap.face
+
+
+ /* class method definitions */
+ typedef FT_Error
+ (*FT_CMap_InitFunc)( FT_CMap cmap,
+ FT_Pointer init_data );
+
+ typedef void
+ (*FT_CMap_DoneFunc)( FT_CMap cmap );
+
+ typedef FT_UInt
+ (*FT_CMap_CharIndexFunc)( FT_CMap cmap,
+ FT_UInt32 char_code );
+
+ typedef FT_UInt
+ (*FT_CMap_CharNextFunc)( FT_CMap cmap,
+ FT_UInt32 *achar_code );
+
+ typedef FT_UInt
+ (*FT_CMap_CharVarIndexFunc)( FT_CMap cmap,
+ FT_CMap unicode_cmap,
+ FT_UInt32 char_code,
+ FT_UInt32 variant_selector );
+
+ typedef FT_Bool
+ (*FT_CMap_CharVarIsDefaultFunc)( FT_CMap cmap,
+ FT_UInt32 char_code,
+ FT_UInt32 variant_selector );
+
+ typedef FT_UInt32 *
+ (*FT_CMap_VariantListFunc)( FT_CMap cmap,
+ FT_Memory mem );
+
+ typedef FT_UInt32 *
+ (*FT_CMap_CharVariantListFunc)( FT_CMap cmap,
+ FT_Memory mem,
+ FT_UInt32 char_code );
+
+ typedef FT_UInt32 *
+ (*FT_CMap_VariantCharListFunc)( FT_CMap cmap,
+ FT_Memory mem,
+ FT_UInt32 variant_selector );
+
+
+ typedef struct FT_CMap_ClassRec_
+ {
+ FT_ULong size;
+ FT_CMap_InitFunc init;
+ FT_CMap_DoneFunc done;
+ FT_CMap_CharIndexFunc char_index;
+ FT_CMap_CharNextFunc char_next;
+
+ /* Subsequent entries are special ones for format 14 -- the variant */
+ /* selector subtable which behaves like no other */
+
+ FT_CMap_CharVarIndexFunc char_var_index;
+ FT_CMap_CharVarIsDefaultFunc char_var_default;
+ FT_CMap_VariantListFunc variant_list;
+ FT_CMap_CharVariantListFunc charvariant_list;
+ FT_CMap_VariantCharListFunc variantchar_list;
+
+ } FT_CMap_ClassRec;
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DECLARE_CMAP_CLASS( class_ ) \
+ FT_CALLBACK_TABLE const FT_CMap_ClassRec class_;
+
+#define FT_DEFINE_CMAP_CLASS( \
+ class_, \
+ size_, \
+ init_, \
+ done_, \
+ char_index_, \
+ char_next_, \
+ char_var_index_, \
+ char_var_default_, \
+ variant_list_, \
+ charvariant_list_, \
+ variantchar_list_ ) \
+ FT_CALLBACK_TABLE_DEF \
+ const FT_CMap_ClassRec class_ = \
+ { \
+ size_, \
+ init_, \
+ done_, \
+ char_index_, \
+ char_next_, \
+ char_var_index_, \
+ char_var_default_, \
+ variant_list_, \
+ charvariant_list_, \
+ variantchar_list_ \
+ };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DECLARE_CMAP_CLASS( class_ ) \
+ void \
+ FT_Init_Class_ ## class_( FT_Library library, \
+ FT_CMap_ClassRec* clazz );
+
+#define FT_DEFINE_CMAP_CLASS( \
+ class_, \
+ size_, \
+ init_, \
+ done_, \
+ char_index_, \
+ char_next_, \
+ char_var_index_, \
+ char_var_default_, \
+ variant_list_, \
+ charvariant_list_, \
+ variantchar_list_ ) \
+ void \
+ FT_Init_Class_ ## class_( FT_Library library, \
+ FT_CMap_ClassRec* clazz ) \
+ { \
+ FT_UNUSED( library ); \
+ \
+ clazz->size = size_; \
+ clazz->init = init_; \
+ clazz->done = done_; \
+ clazz->char_index = char_index_; \
+ clazz->char_next = char_next_; \
+ clazz->char_var_index = char_var_index_; \
+ clazz->char_var_default = char_var_default_; \
+ clazz->variant_list = variant_list_; \
+ clazz->charvariant_list = charvariant_list_; \
+ clazz->variantchar_list = variantchar_list_; \
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+ /* create a new charmap and add it to charmap->face */
+ FT_BASE( FT_Error )
+ FT_CMap_New( FT_CMap_Class clazz,
+ FT_Pointer init_data,
+ FT_CharMap charmap,
+ FT_CMap *acmap );
+
+ /* destroy a charmap and remove it from face's list */
+ FT_BASE( void )
+ FT_CMap_Done( FT_CMap cmap );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Face_InternalRec */
+ /* */
+ /* <Description> */
+ /* This structure contains the internal fields of each FT_Face */
+ /* object. These fields may change between different releases of */
+ /* FreeType. */
+ /* */
+ /* <Fields> */
+ /* max_points :: */
+ /* The maximum number of points used to store the vectorial outline */
+ /* of any glyph in this face. If this value cannot be known in */
+ /* advance, or if the face isn't scalable, this should be set to 0. */
+ /* Only relevant for scalable formats. */
+ /* */
+ /* max_contours :: */
+ /* The maximum number of contours used to store the vectorial */
+ /* outline of any glyph in this face. If this value cannot be */
+ /* known in advance, or if the face isn't scalable, this should be */
+ /* set to 0. Only relevant for scalable formats. */
+ /* */
+ /* transform_matrix :: */
+ /* A 2x2 matrix of 16.16 coefficients used to transform glyph */
+ /* outlines after they are loaded from the font. Only used by the */
+ /* convenience functions. */
+ /* */
+ /* transform_delta :: */
+ /* A translation vector used to transform glyph outlines after they */
+ /* are loaded from the font. Only used by the convenience */
+ /* functions. */
+ /* */
+ /* transform_flags :: */
+ /* Some flags used to classify the transform. Only used by the */
+ /* convenience functions. */
+ /* */
+ /* services :: */
+ /* A cache for frequently used services. It should be only */
+ /* accessed with the macro `FT_FACE_LOOKUP_SERVICE'. */
+ /* */
+ /* incremental_interface :: */
+ /* If non-null, the interface through which glyph data and metrics */
+ /* are loaded incrementally for faces that do not provide all of */
+ /* this data when first opened. This field exists only if */
+ /* @FT_CONFIG_OPTION_INCREMENTAL is defined. */
+ /* */
+ /* ignore_unpatented_hinter :: */
+ /* This boolean flag instructs the glyph loader to ignore the */
+ /* native font hinter, if one is found. This is exclusively used */
+ /* in the case when the unpatented hinter is compiled within the */
+ /* library. */
+ /* */
+ /* refcount :: */
+ /* A counter initialized to~1 at the time an @FT_Face structure is */
+ /* created. @FT_Reference_Face increments this counter, and */
+ /* @FT_Done_Face only destroys a face if the counter is~1, */
+ /* otherwise it simply decrements it. */
+ /* */
+ typedef struct FT_Face_InternalRec_
+ {
+ FT_Matrix transform_matrix;
+ FT_Vector transform_delta;
+ FT_Int transform_flags;
+
+ FT_ServiceCacheRec services;
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+ FT_Incremental_InterfaceRec* incremental_interface;
+#endif
+
+ FT_Bool ignore_unpatented_hinter;
+ FT_Int refcount;
+
+ } FT_Face_InternalRec;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Slot_InternalRec */
+ /* */
+ /* <Description> */
+ /* This structure contains the internal fields of each FT_GlyphSlot */
+ /* object. These fields may change between different releases of */
+ /* FreeType. */
+ /* */
+ /* <Fields> */
+ /* loader :: The glyph loader object used to load outlines */
+ /* into the glyph slot. */
+ /* */
+ /* flags :: Possible values are zero or */
+ /* FT_GLYPH_OWN_BITMAP. The latter indicates */
+ /* that the FT_GlyphSlot structure owns the */
+ /* bitmap buffer. */
+ /* */
+ /* glyph_transformed :: Boolean. Set to TRUE when the loaded glyph */
+ /* must be transformed through a specific */
+ /* font transformation. This is _not_ the same */
+ /* as the face transform set through */
+ /* FT_Set_Transform(). */
+ /* */
+ /* glyph_matrix :: The 2x2 matrix corresponding to the glyph */
+ /* transformation, if necessary. */
+ /* */
+ /* glyph_delta :: The 2d translation vector corresponding to */
+ /* the glyph transformation, if necessary. */
+ /* */
+ /* glyph_hints :: Format-specific glyph hints management. */
+ /* */
+
+#define FT_GLYPH_OWN_BITMAP 0x1
+
+ typedef struct FT_Slot_InternalRec_
+ {
+ FT_GlyphLoader loader;
+ FT_UInt flags;
+ FT_Bool glyph_transformed;
+ FT_Matrix glyph_matrix;
+ FT_Vector glyph_delta;
+ void* glyph_hints;
+
+ } FT_GlyphSlot_InternalRec;
+
+
+#if 0
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_Size_InternalRec */
+ /* */
+ /* <Description> */
+ /* This structure contains the internal fields of each FT_Size */
+ /* object. Currently, it's empty. */
+ /* */
+ /*************************************************************************/
+
+ typedef struct FT_Size_InternalRec_
+ {
+ /* empty */
+
+ } FT_Size_InternalRec;
+
+#endif
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** ****/
+ /**** M O D U L E S ****/
+ /**** ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_ModuleRec */
+ /* */
+ /* <Description> */
+ /* A module object instance. */
+ /* */
+ /* <Fields> */
+ /* clazz :: A pointer to the module's class. */
+ /* */
+ /* library :: A handle to the parent library object. */
+ /* */
+ /* memory :: A handle to the memory manager. */
+ /* */
+ typedef struct FT_ModuleRec_
+ {
+ FT_Module_Class* clazz;
+ FT_Library library;
+ FT_Memory memory;
+
+ } FT_ModuleRec;
+
+
+ /* typecast an object to an FT_Module */
+#define FT_MODULE( x ) ((FT_Module)( x ))
+#define FT_MODULE_CLASS( x ) FT_MODULE( x )->clazz
+#define FT_MODULE_LIBRARY( x ) FT_MODULE( x )->library
+#define FT_MODULE_MEMORY( x ) FT_MODULE( x )->memory
+
+
+#define FT_MODULE_IS_DRIVER( x ) ( FT_MODULE_CLASS( x )->module_flags & \
+ FT_MODULE_FONT_DRIVER )
+
+#define FT_MODULE_IS_RENDERER( x ) ( FT_MODULE_CLASS( x )->module_flags & \
+ FT_MODULE_RENDERER )
+
+#define FT_MODULE_IS_HINTER( x ) ( FT_MODULE_CLASS( x )->module_flags & \
+ FT_MODULE_HINTER )
+
+#define FT_MODULE_IS_STYLER( x ) ( FT_MODULE_CLASS( x )->module_flags & \
+ FT_MODULE_STYLER )
+
+#define FT_DRIVER_IS_SCALABLE( x ) ( FT_MODULE_CLASS( x )->module_flags & \
+ FT_MODULE_DRIVER_SCALABLE )
+
+#define FT_DRIVER_USES_OUTLINES( x ) !( FT_MODULE_CLASS( x )->module_flags & \
+ FT_MODULE_DRIVER_NO_OUTLINES )
+
+#define FT_DRIVER_HAS_HINTER( x ) ( FT_MODULE_CLASS( x )->module_flags & \
+ FT_MODULE_DRIVER_HAS_HINTER )
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_Module_Interface */
+ /* */
+ /* <Description> */
+ /* Finds a module and returns its specific interface as a typeless */
+ /* pointer. */
+ /* */
+ /* <Input> */
+ /* library :: A handle to the library object. */
+ /* */
+ /* module_name :: The module's name (as an ASCII string). */
+ /* */
+ /* <Return> */
+ /* A module-specific interface if available, 0 otherwise. */
+ /* */
+ /* <Note> */
+ /* You should better be familiar with FreeType internals to know */
+ /* which module to look for, and what its interface is :-) */
+ /* */
+ FT_BASE( const void* )
+ FT_Get_Module_Interface( FT_Library library,
+ const char* mod_name );
+
+ FT_BASE( FT_Pointer )
+ ft_module_get_service( FT_Module module,
+ const char* service_id );
+
+ /* */
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** ****/
+ /**** F A C E, S I Z E & G L Y P H S L O T O B J E C T S ****/
+ /**** ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /* a few macros used to perform easy typecasts with minimal brain damage */
+
+#define FT_FACE( x ) ((FT_Face)(x))
+#define FT_SIZE( x ) ((FT_Size)(x))
+#define FT_SLOT( x ) ((FT_GlyphSlot)(x))
+
+#define FT_FACE_DRIVER( x ) FT_FACE( x )->driver
+#define FT_FACE_LIBRARY( x ) FT_FACE_DRIVER( x )->root.library
+#define FT_FACE_MEMORY( x ) FT_FACE( x )->memory
+#define FT_FACE_STREAM( x ) FT_FACE( x )->stream
+
+#define FT_SIZE_FACE( x ) FT_SIZE( x )->face
+#define FT_SLOT_FACE( x ) FT_SLOT( x )->face
+
+#define FT_FACE_SLOT( x ) FT_FACE( x )->glyph
+#define FT_FACE_SIZE( x ) FT_FACE( x )->size
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_New_GlyphSlot */
+ /* */
+ /* <Description> */
+ /* It is sometimes useful to have more than one glyph slot for a */
+ /* given face object. This function is used to create additional */
+ /* slots. All of them are automatically discarded when the face is */
+ /* destroyed. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to a parent face object. */
+ /* */
+ /* <Output> */
+ /* aslot :: A handle to a new glyph slot object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_BASE( FT_Error )
+ FT_New_GlyphSlot( FT_Face face,
+ FT_GlyphSlot *aslot );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Done_GlyphSlot */
+ /* */
+ /* <Description> */
+ /* Destroys a given glyph slot. Remember however that all slots are */
+ /* automatically destroyed with its parent. Using this function is */
+ /* not always mandatory. */
+ /* */
+ /* <Input> */
+ /* slot :: A handle to a target glyph slot. */
+ /* */
+ FT_BASE( void )
+ FT_Done_GlyphSlot( FT_GlyphSlot slot );
+
+ /* */
+
+#define FT_REQUEST_WIDTH( req ) \
+ ( (req)->horiResolution \
+ ? (FT_Pos)( (req)->width * (req)->horiResolution + 36 ) / 72 \
+ : (req)->width )
+
+#define FT_REQUEST_HEIGHT( req ) \
+ ( (req)->vertResolution \
+ ? (FT_Pos)( (req)->height * (req)->vertResolution + 36 ) / 72 \
+ : (req)->height )
+
+
+ /* Set the metrics according to a bitmap strike. */
+ FT_BASE( void )
+ FT_Select_Metrics( FT_Face face,
+ FT_ULong strike_index );
+
+
+ /* Set the metrics according to a size request. */
+ FT_BASE( void )
+ FT_Request_Metrics( FT_Face face,
+ FT_Size_Request req );
+
+
+ /* Match a size request against `available_sizes'. */
+ FT_BASE( FT_Error )
+ FT_Match_Size( FT_Face face,
+ FT_Size_Request req,
+ FT_Bool ignore_width,
+ FT_ULong* size_index );
+
+
+ /* Use the horizontal metrics to synthesize the vertical metrics. */
+ /* If `advance' is zero, it is also synthesized. */
+ FT_BASE( void )
+ ft_synthesize_vertical_metrics( FT_Glyph_Metrics* metrics,
+ FT_Pos advance );
+
+
+ /* Free the bitmap of a given glyphslot when needed (i.e., only when it */
+ /* was allocated with ft_glyphslot_alloc_bitmap). */
+ FT_BASE( void )
+ ft_glyphslot_free_bitmap( FT_GlyphSlot slot );
+
+
+ /* Allocate a new bitmap buffer in a glyph slot. */
+ FT_BASE( FT_Error )
+ ft_glyphslot_alloc_bitmap( FT_GlyphSlot slot,
+ FT_ULong size );
+
+
+ /* Set the bitmap buffer in a glyph slot to a given pointer. The buffer */
+ /* will not be freed by a later call to ft_glyphslot_free_bitmap. */
+ FT_BASE( void )
+ ft_glyphslot_set_bitmap( FT_GlyphSlot slot,
+ FT_Byte* buffer );
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** ****/
+ /**** R E N D E R E R S ****/
+ /**** ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+#define FT_RENDERER( x ) ((FT_Renderer)( x ))
+#define FT_GLYPH( x ) ((FT_Glyph)( x ))
+#define FT_BITMAP_GLYPH( x ) ((FT_BitmapGlyph)( x ))
+#define FT_OUTLINE_GLYPH( x ) ((FT_OutlineGlyph)( x ))
+
+
+ typedef struct FT_RendererRec_
+ {
+ FT_ModuleRec root;
+ FT_Renderer_Class* clazz;
+ FT_Glyph_Format glyph_format;
+ FT_Glyph_Class glyph_class;
+
+ FT_Raster raster;
+ FT_Raster_Render_Func raster_render;
+ FT_Renderer_RenderFunc render;
+
+ } FT_RendererRec;
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** ****/
+ /**** F O N T D R I V E R S ****/
+ /**** ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /* typecast a module into a driver easily */
+#define FT_DRIVER( x ) ((FT_Driver)(x))
+
+ /* typecast a module as a driver, and get its driver class */
+#define FT_DRIVER_CLASS( x ) FT_DRIVER( x )->clazz
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_DriverRec */
+ /* */
+ /* <Description> */
+ /* The root font driver class. A font driver is responsible for */
+ /* managing and loading font files of a given format. */
+ /* */
+ /* <Fields> */
+ /* root :: Contains the fields of the root module class. */
+ /* */
+ /* clazz :: A pointer to the font driver's class. Note that */
+ /* this is NOT root.clazz. `class' wasn't used */
+ /* as it is a reserved word in C++. */
+ /* */
+ /* faces_list :: The list of faces currently opened by this */
+ /* driver. */
+ /* */
+ /* glyph_loader :: The glyph loader for all faces managed by this */
+ /* driver. This object isn't defined for unscalable */
+ /* formats. */
+ /* */
+ typedef struct FT_DriverRec_
+ {
+ FT_ModuleRec root;
+ FT_Driver_Class clazz;
+ FT_ListRec faces_list;
+ FT_GlyphLoader glyph_loader;
+
+ } FT_DriverRec;
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** ****/
+ /**** L I B R A R I E S ****/
+ /**** ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /* This hook is used by the TrueType debugger. It must be set to an */
+ /* alternate truetype bytecode interpreter function. */
+#define FT_DEBUG_HOOK_TRUETYPE 0
+
+
+ /* Set this debug hook to a non-null pointer to force unpatented hinting */
+ /* for all faces when both TT_USE_BYTECODE_INTERPRETER and */
+ /* TT_CONFIG_OPTION_UNPATENTED_HINTING are defined. This is only used */
+ /* during debugging. */
+#define FT_DEBUG_HOOK_UNPATENTED_HINTING 1
+
+
+ typedef void (*FT_Bitmap_LcdFilterFunc)( FT_Bitmap* bitmap,
+ FT_Render_Mode render_mode,
+ FT_Library library );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* FT_LibraryRec */
+ /* */
+ /* <Description> */
+ /* The FreeType library class. This is the root of all FreeType */
+ /* data. Use FT_New_Library() to create a library object, and */
+ /* FT_Done_Library() to discard it and all child objects. */
+ /* */
+ /* <Fields> */
+ /* memory :: The library's memory object. Manages memory */
+ /* allocation. */
+ /* */
+ /* version_major :: The major version number of the library. */
+ /* */
+ /* version_minor :: The minor version number of the library. */
+ /* */
+ /* version_patch :: The current patch level of the library. */
+ /* */
+ /* num_modules :: The number of modules currently registered */
+ /* within this library. This is set to 0 for new */
+ /* libraries. New modules are added through the */
+ /* FT_Add_Module() API function. */
+ /* */
+ /* modules :: A table used to store handles to the currently */
+ /* registered modules. Note that each font driver */
+ /* contains a list of its opened faces. */
+ /* */
+ /* renderers :: The list of renderers currently registered */
+ /* within the library. */
+ /* */
+ /* cur_renderer :: The current outline renderer. This is a */
+ /* shortcut used to avoid parsing the list on */
+ /* each call to FT_Outline_Render(). It is a */
+ /* handle to the current renderer for the */
+ /* FT_GLYPH_FORMAT_OUTLINE format. */
+ /* */
+ /* auto_hinter :: XXX */
+ /* */
+ /* raster_pool :: The raster object's render pool. This can */
+ /* ideally be changed dynamically at run-time. */
+ /* */
+ /* raster_pool_size :: The size of the render pool in bytes. */
+ /* */
+ /* debug_hooks :: XXX */
+ /* */
+ /* lcd_filter :: If subpixel rendering is activated, the */
+ /* selected LCD filter mode. */
+ /* */
+ /* lcd_extra :: If subpixel rendering is activated, the number */
+ /* of extra pixels needed for the LCD filter. */
+ /* */
+ /* lcd_weights :: If subpixel rendering is activated, the LCD */
+ /* filter weights, if any. */
+ /* */
+ /* lcd_filter_func :: If subpixel rendering is activated, the LCD */
+ /* filtering callback function. */
+ /* */
+ /* pic_container :: Contains global structs and tables, instead */
+ /* of defining them globallly. */
+ /* */
+ /* refcount :: A counter initialized to~1 at the time an */
+ /* @FT_Library structure is created. */
+ /* @FT_Reference_Library increments this counter, */
+ /* and @FT_Done_Library only destroys a library */
+ /* if the counter is~1, otherwise it simply */
+ /* decrements it. */
+ /* */
+ typedef struct FT_LibraryRec_
+ {
+ FT_Memory memory; /* library's memory manager */
+
+ FT_Int version_major;
+ FT_Int version_minor;
+ FT_Int version_patch;
+
+ FT_UInt num_modules;
+ FT_Module modules[FT_MAX_MODULES]; /* module objects */
+
+ FT_ListRec renderers; /* list of renderers */
+ FT_Renderer cur_renderer; /* current outline renderer */
+ FT_Module auto_hinter;
+
+ FT_Byte* raster_pool; /* scan-line conversion */
+ /* render pool */
+ FT_ULong raster_pool_size; /* size of render pool in bytes */
+
+ FT_DebugHook_Func debug_hooks[4];
+
+#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
+ FT_LcdFilter lcd_filter;
+ FT_Int lcd_extra; /* number of extra pixels */
+ FT_Byte lcd_weights[7]; /* filter weights, if any */
+ FT_Bitmap_LcdFilterFunc lcd_filter_func; /* filtering callback */
+#endif
+
+#ifdef FT_CONFIG_OPTION_PIC
+ FT_PIC_Container pic_container;
+#endif
+
+ FT_Int refcount;
+
+ } FT_LibraryRec;
+
+
+ FT_BASE( FT_Renderer )
+ FT_Lookup_Renderer( FT_Library library,
+ FT_Glyph_Format format,
+ FT_ListNode* node );
+
+ FT_BASE( FT_Error )
+ FT_Render_Glyph_Internal( FT_Library library,
+ FT_GlyphSlot slot,
+ FT_Render_Mode render_mode );
+
+ typedef const char*
+ (*FT_Face_GetPostscriptNameFunc)( FT_Face face );
+
+ typedef FT_Error
+ (*FT_Face_GetGlyphNameFunc)( FT_Face face,
+ FT_UInt glyph_index,
+ FT_Pointer buffer,
+ FT_UInt buffer_max );
+
+ typedef FT_UInt
+ (*FT_Face_GetGlyphNameIndexFunc)( FT_Face face,
+ FT_String* glyph_name );
+
+
+#ifndef FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_New_Memory */
+ /* */
+ /* <Description> */
+ /* Creates a new memory object. */
+ /* */
+ /* <Return> */
+ /* A pointer to the new memory object. 0 in case of error. */
+ /* */
+ FT_BASE( FT_Memory )
+ FT_New_Memory( void );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Done_Memory */
+ /* */
+ /* <Description> */
+ /* Discards memory manager. */
+ /* */
+ /* <Input> */
+ /* memory :: A handle to the memory manager. */
+ /* */
+ FT_BASE( void )
+ FT_Done_Memory( FT_Memory memory );
+
+#endif /* !FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM */
+
+
+ /* Define default raster's interface. The default raster is located in */
+ /* `src/base/ftraster.c'. */
+ /* */
+ /* Client applications can register new rasters through the */
+ /* FT_Set_Raster() API. */
+
+#ifndef FT_NO_DEFAULT_RASTER
+ FT_EXPORT_VAR( FT_Raster_Funcs ) ft_default_raster;
+#endif
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** ****/
+ /**** P I C S U P P O R T ****/
+ /**** ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /* PIC support macros for ftimage.h */
+
+
+ /*************************************************************************/
+ /* */
+ /* <Macro> */
+ /* FT_DEFINE_OUTLINE_FUNCS */
+ /* */
+ /* <Description> */
+ /* Used to initialize an instance of FT_Outline_Funcs struct. */
+ /* When FT_CONFIG_OPTION_PIC is defined an init funtion will need to */
+ /* be called with a pre-allocated structure to be filled. */
+ /* When FT_CONFIG_OPTION_PIC is not defined the struct will be */
+ /* allocated in the global scope (or the scope where the macro */
+ /* is used). */
+ /* */
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_OUTLINE_FUNCS( \
+ class_, \
+ move_to_, \
+ line_to_, \
+ conic_to_, \
+ cubic_to_, \
+ shift_, \
+ delta_ ) \
+ static const FT_Outline_Funcs class_ = \
+ { \
+ move_to_, \
+ line_to_, \
+ conic_to_, \
+ cubic_to_, \
+ shift_, \
+ delta_ \
+ };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_OUTLINE_FUNCS( \
+ class_, \
+ move_to_, \
+ line_to_, \
+ conic_to_, \
+ cubic_to_, \
+ shift_, \
+ delta_ ) \
+ static FT_Error \
+ Init_Class_ ## class_( FT_Outline_Funcs* clazz ) \
+ { \
+ clazz->move_to = move_to_; \
+ clazz->line_to = line_to_; \
+ clazz->conic_to = conic_to_; \
+ clazz->cubic_to = cubic_to_; \
+ clazz->shift = shift_; \
+ clazz->delta = delta_; \
+ \
+ return FT_Err_Ok; \
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+ /*************************************************************************/
+ /* */
+ /* <Macro> */
+ /* FT_DEFINE_RASTER_FUNCS */
+ /* */
+ /* <Description> */
+ /* Used to initialize an instance of FT_Raster_Funcs struct. */
+ /* When FT_CONFIG_OPTION_PIC is defined an init funtion will need to */
+ /* be called with a pre-allocated structure to be filled. */
+ /* When FT_CONFIG_OPTION_PIC is not defined the struct will be */
+ /* allocated in the global scope (or the scope where the macro */
+ /* is used). */
+ /* */
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_RASTER_FUNCS( \
+ class_, \
+ glyph_format_, \
+ raster_new_, \
+ raster_reset_, \
+ raster_set_mode_, \
+ raster_render_, \
+ raster_done_ ) \
+ const FT_Raster_Funcs class_ = \
+ { \
+ glyph_format_, \
+ raster_new_, \
+ raster_reset_, \
+ raster_set_mode_, \
+ raster_render_, \
+ raster_done_ \
+ };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_RASTER_FUNCS( \
+ class_, \
+ glyph_format_, \
+ raster_new_, \
+ raster_reset_, \
+ raster_set_mode_, \
+ raster_render_, \
+ raster_done_ ) \
+ void \
+ FT_Init_Class_ ## class_( FT_Raster_Funcs* clazz ) \
+ { \
+ clazz->glyph_format = glyph_format_; \
+ clazz->raster_new = raster_new_; \
+ clazz->raster_reset = raster_reset_; \
+ clazz->raster_set_mode = raster_set_mode_; \
+ clazz->raster_render = raster_render_; \
+ clazz->raster_done = raster_done_; \
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+ /* PIC support macros for ftrender.h */
+
+
+ /*************************************************************************/
+ /* */
+ /* <Macro> */
+ /* FT_DEFINE_GLYPH */
+ /* */
+ /* <Description> */
+ /* Used to initialize an instance of FT_Glyph_Class struct. */
+ /* When FT_CONFIG_OPTION_PIC is defined an init funtion will need to */
+ /* be called with a pre-allocated stcture to be filled. */
+ /* When FT_CONFIG_OPTION_PIC is not defined the struct will be */
+ /* allocated in the global scope (or the scope where the macro */
+ /* is used). */
+ /* */
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_GLYPH( \
+ class_, \
+ size_, \
+ format_, \
+ init_, \
+ done_, \
+ copy_, \
+ transform_, \
+ bbox_, \
+ prepare_ ) \
+ FT_CALLBACK_TABLE_DEF \
+ const FT_Glyph_Class class_ = \
+ { \
+ size_, \
+ format_, \
+ init_, \
+ done_, \
+ copy_, \
+ transform_, \
+ bbox_, \
+ prepare_ \
+ };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_GLYPH( \
+ class_, \
+ size_, \
+ format_, \
+ init_, \
+ done_, \
+ copy_, \
+ transform_, \
+ bbox_, \
+ prepare_ ) \
+ void \
+ FT_Init_Class_ ## class_( FT_Glyph_Class* clazz ) \
+ { \
+ clazz->glyph_size = size_; \
+ clazz->glyph_format = format_; \
+ clazz->glyph_init = init_; \
+ clazz->glyph_done = done_; \
+ clazz->glyph_copy = copy_; \
+ clazz->glyph_transform = transform_; \
+ clazz->glyph_bbox = bbox_; \
+ clazz->glyph_prepare = prepare_; \
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+ /*************************************************************************/
+ /* */
+ /* <Macro> */
+ /* FT_DECLARE_RENDERER */
+ /* */
+ /* <Description> */
+ /* Used to create a forward declaration of a */
+ /* FT_Renderer_Class struct instance. */
+ /* */
+ /* <Macro> */
+ /* FT_DEFINE_RENDERER */
+ /* */
+ /* <Description> */
+ /* Used to initialize an instance of FT_Renderer_Class struct. */
+ /* */
+ /* When FT_CONFIG_OPTION_PIC is defined a `create' funtion will need */
+ /* to be called with a pointer where the allocated structure is */
+ /* returned. And when it is no longer needed a `destroy' function */
+ /* needs to be called to release that allocation. */
+ /* `fcinit.c' (ft_create_default_module_classes) already contains */
+ /* a mechanism to call these functions for the default modules */
+ /* described in `ftmodule.h'. */
+ /* */
+ /* Notice that the created `create' and `destroy' functions call */
+ /* `pic_init' and `pic_free' to allow you to manually allocate and */
+ /* initialize any additional global data, like a module specific */
+ /* interface, and put them in the global pic container defined in */
+ /* `ftpic.h'. If you don't need them just implement the functions as */
+ /* empty to resolve the link error. Also the `pic_init' and */
+ /* `pic_free' functions should be declared in `pic.h', to be referred */
+ /* by the renderer definition calling `FT_DEFINE_RENDERER' in the */
+ /* following. */
+ /* */
+ /* When FT_CONFIG_OPTION_PIC is not defined the struct will be */
+ /* allocated in the global scope (or the scope where the macro */
+ /* is used). */
+ /* */
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DECLARE_RENDERER( class_ ) \
+ FT_EXPORT_VAR( const FT_Renderer_Class ) class_;
+
+#define FT_DEFINE_RENDERER( \
+ class_, \
+ flags_, \
+ size_, \
+ name_, \
+ version_, \
+ requires_, \
+ interface_, \
+ init_, \
+ done_, \
+ get_interface_, \
+ glyph_format_, \
+ render_glyph_, \
+ transform_glyph_, \
+ get_glyph_cbox_, \
+ set_mode_, \
+ raster_class_ ) \
+ FT_CALLBACK_TABLE_DEF \
+ const FT_Renderer_Class class_ = \
+ { \
+ FT_DEFINE_ROOT_MODULE( flags_, \
+ size_, \
+ name_, \
+ version_, \
+ requires_, \
+ interface_, \
+ init_, \
+ done_, \
+ get_interface_ ) \
+ glyph_format_, \
+ \
+ render_glyph_, \
+ transform_glyph_, \
+ get_glyph_cbox_, \
+ set_mode_, \
+ \
+ raster_class_ \
+ };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DECLARE_RENDERER( class_ ) FT_DECLARE_MODULE( class_ )
+
+#define FT_DEFINE_RENDERER( \
+ class_, \
+ flags_, \
+ size_, \
+ name_, \
+ version_, \
+ requires_, \
+ interface_, \
+ init_, \
+ done_, \
+ get_interface_, \
+ glyph_format_, \
+ render_glyph_, \
+ transform_glyph_, \
+ get_glyph_cbox_, \
+ set_mode_, \
+ raster_class_ ) \
+ void \
+ FT_Destroy_Class_ ## class_( FT_Library library, \
+ FT_Module_Class* clazz ) \
+ { \
+ FT_Renderer_Class* rclazz = (FT_Renderer_Class*)clazz; \
+ FT_Memory memory = library->memory; \
+ \
+ \
+ class_ ## _pic_free( library ); \
+ if ( rclazz ) \
+ FT_FREE( rclazz ); \
+ } \
+ \
+ \
+ FT_Error \
+ FT_Create_Class_ ## class_( FT_Library library, \
+ FT_Module_Class** output_class ) \
+ { \
+ FT_Renderer_Class* clazz = NULL; \
+ FT_Error error; \
+ FT_Memory memory = library->memory; \
+ \
+ \
+ if ( FT_ALLOC( clazz, sizeof ( *clazz ) ) ) \
+ return error; \
+ \
+ error = class_ ## _pic_init( library ); \
+ if ( error ) \
+ { \
+ FT_FREE( clazz ); \
+ return error; \
+ } \
+ \
+ FT_DEFINE_ROOT_MODULE( flags_, \
+ size_, \
+ name_, \
+ version_, \
+ requires_, \
+ interface_, \
+ init_, \
+ done_, \
+ get_interface_ ) \
+ \
+ clazz->glyph_format = glyph_format_; \
+ \
+ clazz->render_glyph = render_glyph_; \
+ clazz->transform_glyph = transform_glyph_; \
+ clazz->get_glyph_cbox = get_glyph_cbox_; \
+ clazz->set_mode = set_mode_; \
+ \
+ clazz->raster_class = raster_class_; \
+ \
+ *output_class = (FT_Module_Class*)clazz; \
+ \
+ return FT_Err_Ok; \
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+ /* PIC support macros for ftmodapi.h **/
+
+
+#ifdef FT_CONFIG_OPTION_PIC
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_Module_Creator */
+ /* */
+ /* <Description> */
+ /* A function used to create (allocate) a new module class object. */
+ /* The object's members are initialized, but the module itself is */
+ /* not. */
+ /* */
+ /* <Input> */
+ /* memory :: A handle to the memory manager. */
+ /* output_class :: Initialized with the newly allocated class. */
+ /* */
+ typedef FT_Error
+ (*FT_Module_Creator)( FT_Memory memory,
+ FT_Module_Class** output_class );
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* FT_Module_Destroyer */
+ /* */
+ /* <Description> */
+ /* A function used to destroy (deallocate) a module class object. */
+ /* */
+ /* <Input> */
+ /* memory :: A handle to the memory manager. */
+ /* clazz :: Module class to destroy. */
+ /* */
+ typedef void
+ (*FT_Module_Destroyer)( FT_Memory memory,
+ FT_Module_Class* clazz );
+
+#endif
+
+
+ /*************************************************************************/
+ /* */
+ /* <Macro> */
+ /* FT_DECLARE_MODULE */
+ /* */
+ /* <Description> */
+ /* Used to create a forward declaration of a */
+ /* FT_Module_Class struct instance. */
+ /* */
+ /* <Macro> */
+ /* FT_DEFINE_MODULE */
+ /* */
+ /* <Description> */
+ /* Used to initialize an instance of an FT_Module_Class struct. */
+ /* */
+ /* When FT_CONFIG_OPTION_PIC is defined a `create' funtion needs to */
+ /* be called with a pointer where the allocated structure is */
+ /* returned. And when it is no longer needed a `destroy' function */
+ /* needs to be called to release that allocation. */
+ /* `fcinit.c' (ft_create_default_module_classes) already contains */
+ /* a mechanism to call these functions for the default modules */
+ /* described in `ftmodule.h'. */
+ /* */
+ /* Notice that the created `create' and `destroy' functions call */
+ /* `pic_init' and `pic_free' to allow you to manually allocate and */
+ /* initialize any additional global data, like a module specific */
+ /* interface, and put them in the global pic container defined in */
+ /* `ftpic.h'. If you don't need them just implement the functions as */
+ /* empty to resolve the link error. Also the `pic_init' and */
+ /* `pic_free' functions should be declared in `pic.h', to be referred */
+ /* by the module definition calling `FT_DEFINE_MODULE' in the */
+ /* following. */
+ /* */
+ /* When FT_CONFIG_OPTION_PIC is not defined the struct will be */
+ /* allocated in the global scope (or the scope where the macro */
+ /* is used). */
+ /* */
+ /* <Macro> */
+ /* FT_DEFINE_ROOT_MODULE */
+ /* */
+ /* <Description> */
+ /* Used to initialize an instance of an FT_Module_Class struct inside */
+ /* another struct that contains it or in a function that initializes */
+ /* that containing struct. */
+ /* */
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DECLARE_MODULE( class_ ) \
+ FT_CALLBACK_TABLE \
+ const FT_Module_Class class_;
+
+#define FT_DEFINE_ROOT_MODULE( \
+ flags_, \
+ size_, \
+ name_, \
+ version_, \
+ requires_, \
+ interface_, \
+ init_, \
+ done_, \
+ get_interface_ ) \
+ { \
+ flags_, \
+ size_, \
+ \
+ name_, \
+ version_, \
+ requires_, \
+ \
+ interface_, \
+ \
+ init_, \
+ done_, \
+ get_interface_, \
+ },
+
+#define FT_DEFINE_MODULE( \
+ class_, \
+ flags_, \
+ size_, \
+ name_, \
+ version_, \
+ requires_, \
+ interface_, \
+ init_, \
+ done_, \
+ get_interface_ ) \
+ FT_CALLBACK_TABLE_DEF \
+ const FT_Module_Class class_ = \
+ { \
+ flags_, \
+ size_, \
+ \
+ name_, \
+ version_, \
+ requires_, \
+ \
+ interface_, \
+ \
+ init_, \
+ done_, \
+ get_interface_, \
+ };
+
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DECLARE_MODULE( class_ ) \
+ FT_Error \
+ FT_Create_Class_ ## class_( FT_Library library, \
+ FT_Module_Class** output_class ); \
+ void \
+ FT_Destroy_Class_ ## class_( FT_Library library, \
+ FT_Module_Class* clazz );
+
+#define FT_DEFINE_ROOT_MODULE( \
+ flags_, \
+ size_, \
+ name_, \
+ version_, \
+ requires_, \
+ interface_, \
+ init_, \
+ done_, \
+ get_interface_ ) \
+ clazz->root.module_flags = flags_; \
+ clazz->root.module_size = size_; \
+ clazz->root.module_name = name_; \
+ clazz->root.module_version = version_; \
+ clazz->root.module_requires = requires_; \
+ \
+ clazz->root.module_interface = interface_; \
+ \
+ clazz->root.module_init = init_; \
+ clazz->root.module_done = done_; \
+ clazz->root.get_interface = get_interface_;
+
+#define FT_DEFINE_MODULE( \
+ class_, \
+ flags_, \
+ size_, \
+ name_, \
+ version_, \
+ requires_, \
+ interface_, \
+ init_, \
+ done_, \
+ get_interface_ ) \
+ void \
+ FT_Destroy_Class_ ## class_( FT_Library library, \
+ FT_Module_Class* clazz ) \
+ { \
+ FT_Memory memory = library->memory; \
+ \
+ \
+ class_ ## _pic_free( library ); \
+ if ( clazz ) \
+ FT_FREE( clazz ); \
+ } \
+ \
+ \
+ FT_Error \
+ FT_Create_Class_ ## class_( FT_Library library, \
+ FT_Module_Class** output_class ) \
+ { \
+ FT_Memory memory = library->memory; \
+ FT_Module_Class* clazz = NULL; \
+ FT_Error error; \
+ \
+ \
+ if ( FT_ALLOC( clazz, sizeof ( *clazz ) ) ) \
+ return error; \
+ error = class_ ## _pic_init( library ); \
+ if ( error ) \
+ { \
+ FT_FREE( clazz ); \
+ return error; \
+ } \
+ \
+ clazz->module_flags = flags_; \
+ clazz->module_size = size_; \
+ clazz->module_name = name_; \
+ clazz->module_version = version_; \
+ clazz->module_requires = requires_; \
+ \
+ clazz->module_interface = interface_; \
+ \
+ clazz->module_init = init_; \
+ clazz->module_done = done_; \
+ clazz->get_interface = get_interface_; \
+ \
+ *output_class = clazz; \
+ \
+ return FT_Err_Ok; \
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+FT_END_HEADER
+
+#endif /* __FTOBJS_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftpic.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftpic.h
new file mode 100644
index 0000000000..485ce7a24e
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftpic.h
@@ -0,0 +1,71 @@
+/***************************************************************************/
+/* */
+/* ftpic.h */
+/* */
+/* The FreeType position independent code services (declaration). */
+/* */
+/* Copyright 2009, 2012 by */
+/* Oran Agra and Mickey Gabel. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* Modules that ordinarily have const global data that need address */
+ /* can instead define pointers here. */
+ /* */
+ /*************************************************************************/
+
+
+#ifndef __FTPIC_H__
+#define __FTPIC_H__
+
+
+FT_BEGIN_HEADER
+
+#ifdef FT_CONFIG_OPTION_PIC
+
+ typedef struct FT_PIC_Container_
+ {
+ /* pic containers for base */
+ void* base;
+
+ /* pic containers for modules */
+ void* autofit;
+ void* cff;
+ void* pshinter;
+ void* psnames;
+ void* raster;
+ void* sfnt;
+ void* smooth;
+ void* truetype;
+
+ } FT_PIC_Container;
+
+
+ /* Initialize the various function tables, structs, etc. */
+ /* stored in the container. */
+ FT_BASE( FT_Error )
+ ft_pic_container_init( FT_Library library );
+
+
+ /* Destroy the contents of the container. */
+ FT_BASE( void )
+ ft_pic_container_destroy( FT_Library library );
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __FTPIC_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftrfork.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftrfork.h
new file mode 100644
index 0000000000..061124b130
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftrfork.h
@@ -0,0 +1,258 @@
+/***************************************************************************/
+/* */
+/* ftrfork.h */
+/* */
+/* Embedded resource forks accessor (specification). */
+/* */
+/* Copyright 2004, 2006, 2007, 2012 by */
+/* Masatake YAMATO and Redhat K.K. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+/***************************************************************************/
+/* Development of the code in this file is support of */
+/* Information-technology Promotion Agency, Japan. */
+/***************************************************************************/
+
+
+#ifndef __FTRFORK_H__
+#define __FTRFORK_H__
+
+
+#include "../../ft2build.h"
+#include "ftobjs.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /* Number of guessing rules supported in `FT_Raccess_Guess'. */
+ /* Don't forget to increment the number if you add a new guessing rule. */
+#define FT_RACCESS_N_RULES 9
+
+
+ /* A structure to describe a reference in a resource by its resource ID */
+ /* and internal offset. The `POST' resource expects to be concatenated */
+ /* by the order of resource IDs instead of its appearance in the file. */
+
+ typedef struct FT_RFork_Ref_
+ {
+ FT_UShort res_id;
+ FT_ULong offset;
+
+ } FT_RFork_Ref;
+
+#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK
+ typedef FT_Error
+ (*ft_raccess_guess_func)( FT_Library library,
+ FT_Stream stream,
+ char *base_file_name,
+ char **result_file_name,
+ FT_Long *result_offset );
+
+ typedef enum FT_RFork_Rule_ {
+ FT_RFork_Rule_invalid = -2,
+ FT_RFork_Rule_uknown, /* -1 */
+ FT_RFork_Rule_apple_double,
+ FT_RFork_Rule_apple_single,
+ FT_RFork_Rule_darwin_ufs_export,
+ FT_RFork_Rule_darwin_newvfs,
+ FT_RFork_Rule_darwin_hfsplus,
+ FT_RFork_Rule_vfat,
+ FT_RFork_Rule_linux_cap,
+ FT_RFork_Rule_linux_double,
+ FT_RFork_Rule_linux_netatalk
+ } FT_RFork_Rule;
+
+ /* For fast translation between rule index and rule type,
+ * the macros FT_RFORK_xxx should be kept consistent with
+ * the raccess_guess_funcs table
+ */
+ typedef struct ft_raccess_guess_rec_ {
+ ft_raccess_guess_func func;
+ FT_RFork_Rule type;
+ } ft_raccess_guess_rec;
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+ /* this array is a storage in non-PIC mode, so ; is needed in END */
+#define CONST_FT_RFORK_RULE_ARRAY_BEGIN( name, type ) \
+ const type name[] = {
+#define CONST_FT_RFORK_RULE_ARRAY_ENTRY( func_suffix, type_suffix ) \
+ { raccess_guess_ ## func_suffix, \
+ FT_RFork_Rule_ ## type_suffix },
+#define CONST_FT_RFORK_RULE_ARRAY_END };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+ /* this array is a function in PIC mode, so no ; is needed in END */
+#define CONST_FT_RFORK_RULE_ARRAY_BEGIN( name, type ) \
+ void \
+ FT_Init_ ## name( type* storage ) \
+ { \
+ type* local = storage; \
+ \
+ \
+ int i = 0;
+#define CONST_FT_RFORK_RULE_ARRAY_ENTRY( func_suffix, type_suffix ) \
+ local[i].func = raccess_guess_ ## func_suffix; \
+ local[i].type = FT_RFork_Rule_ ## type_suffix; \
+ i++;
+#define CONST_FT_RFORK_RULE_ARRAY_END }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+#endif /* FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK */
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Raccess_Guess */
+ /* */
+ /* <Description> */
+ /* Guess a file name and offset where the actual resource fork is */
+ /* stored. The macro FT_RACCESS_N_RULES holds the number of */
+ /* guessing rules; the guessed result for the Nth rule is */
+ /* represented as a triplet: a new file name (new_names[N]), a file */
+ /* offset (offsets[N]), and an error code (errors[N]). */
+ /* */
+ /* <Input> */
+ /* library :: */
+ /* A FreeType library instance. */
+ /* */
+ /* stream :: */
+ /* A file stream containing the resource fork. */
+ /* */
+ /* base_name :: */
+ /* The (base) file name of the resource fork used for some */
+ /* guessing rules. */
+ /* */
+ /* <Output> */
+ /* new_names :: */
+ /* An array of guessed file names in which the resource forks may */
+ /* exist. If `new_names[N]' is NULL, the guessed file name is */
+ /* equal to `base_name'. */
+ /* */
+ /* offsets :: */
+ /* An array of guessed file offsets. `offsets[N]' holds the file */
+ /* offset of the possible start of the resource fork in file */
+ /* `new_names[N]'. */
+ /* */
+ /* errors :: */
+ /* An array of FreeType error codes. `errors[N]' is the error */
+ /* code of Nth guessing rule function. If `errors[N]' is not */
+ /* FT_Err_Ok, `new_names[N]' and `offsets[N]' are meaningless. */
+ /* */
+ FT_BASE( void )
+ FT_Raccess_Guess( FT_Library library,
+ FT_Stream stream,
+ char* base_name,
+ char** new_names,
+ FT_Long* offsets,
+ FT_Error* errors );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Raccess_Get_HeaderInfo */
+ /* */
+ /* <Description> */
+ /* Get the information from the header of resource fork. The */
+ /* information includes the file offset where the resource map */
+ /* starts, and the file offset where the resource data starts. */
+ /* `FT_Raccess_Get_DataOffsets' requires these two data. */
+ /* */
+ /* <Input> */
+ /* library :: */
+ /* A FreeType library instance. */
+ /* */
+ /* stream :: */
+ /* A file stream containing the resource fork. */
+ /* */
+ /* rfork_offset :: */
+ /* The file offset where the resource fork starts. */
+ /* */
+ /* <Output> */
+ /* map_offset :: */
+ /* The file offset where the resource map starts. */
+ /* */
+ /* rdata_pos :: */
+ /* The file offset where the resource data starts. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. FT_Err_Ok means success. */
+ /* */
+ FT_BASE( FT_Error )
+ FT_Raccess_Get_HeaderInfo( FT_Library library,
+ FT_Stream stream,
+ FT_Long rfork_offset,
+ FT_Long *map_offset,
+ FT_Long *rdata_pos );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Raccess_Get_DataOffsets */
+ /* */
+ /* <Description> */
+ /* Get the data offsets for a tag in a resource fork. Offsets are */
+ /* stored in an array because, in some cases, resources in a resource */
+ /* fork have the same tag. */
+ /* */
+ /* <Input> */
+ /* library :: */
+ /* A FreeType library instance. */
+ /* */
+ /* stream :: */
+ /* A file stream containing the resource fork. */
+ /* */
+ /* map_offset :: */
+ /* The file offset where the resource map starts. */
+ /* */
+ /* rdata_pos :: */
+ /* The file offset where the resource data starts. */
+ /* */
+ /* tag :: */
+ /* The resource tag. */
+ /* */
+ /* <Output> */
+ /* offsets :: */
+ /* The stream offsets for the resource data specified by `tag'. */
+ /* This array is allocated by the function, so you have to call */
+ /* @ft_mem_free after use. */
+ /* */
+ /* count :: */
+ /* The length of offsets array. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. FT_Err_Ok means success. */
+ /* */
+ /* <Note> */
+ /* Normally you should use `FT_Raccess_Get_HeaderInfo' to get the */
+ /* value for `map_offset' and `rdata_pos'. */
+ /* */
+ FT_BASE( FT_Error )
+ FT_Raccess_Get_DataOffsets( FT_Library library,
+ FT_Stream stream,
+ FT_Long map_offset,
+ FT_Long rdata_pos,
+ FT_Long tag,
+ FT_Long **offsets,
+ FT_Long *count );
+
+
+FT_END_HEADER
+
+#endif /* __FTRFORK_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftserv.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftserv.h
new file mode 100644
index 0000000000..cd5fbd0fac
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftserv.h
@@ -0,0 +1,763 @@
+/***************************************************************************/
+/* */
+/* ftserv.h */
+/* */
+/* The FreeType services (specification only). */
+/* */
+/* Copyright 2003-2007, 2009, 2012, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* Each module can export one or more `services'. Each service is */
+ /* identified by a constant string and modeled by a pointer; the latter */
+ /* generally corresponds to a structure containing function pointers. */
+ /* */
+ /* Note that a service's data cannot be a mere function pointer because */
+ /* in C it is possible that function pointers might be implemented */
+ /* differently than data pointers (e.g. 48 bits instead of 32). */
+ /* */
+ /*************************************************************************/
+
+
+#ifndef __FTSERV_H__
+#define __FTSERV_H__
+
+
+FT_BEGIN_HEADER
+
+ /*
+ * @macro:
+ * FT_FACE_FIND_SERVICE
+ *
+ * @description:
+ * This macro is used to look up a service from a face's driver module.
+ *
+ * @input:
+ * face ::
+ * The source face handle.
+ *
+ * id ::
+ * A string describing the service as defined in the service's
+ * header files (e.g. FT_SERVICE_ID_MULTI_MASTERS which expands to
+ * `multi-masters'). It is automatically prefixed with
+ * `FT_SERVICE_ID_'.
+ *
+ * @output:
+ * ptr ::
+ * A variable that receives the service pointer. Will be NULL
+ * if not found.
+ */
+#ifdef __cplusplus
+
+#define FT_FACE_FIND_SERVICE( face, ptr, id ) \
+ FT_BEGIN_STMNT \
+ FT_Module module = FT_MODULE( FT_FACE( face )->driver ); \
+ FT_Pointer _tmp_ = NULL; \
+ FT_Pointer* _pptr_ = (FT_Pointer*)&(ptr); \
+ \
+ \
+ if ( module->clazz->get_interface ) \
+ _tmp_ = module->clazz->get_interface( module, FT_SERVICE_ID_ ## id ); \
+ *_pptr_ = _tmp_; \
+ FT_END_STMNT
+
+#else /* !C++ */
+
+#define FT_FACE_FIND_SERVICE( face, ptr, id ) \
+ FT_BEGIN_STMNT \
+ FT_Module module = FT_MODULE( FT_FACE( face )->driver ); \
+ FT_Pointer _tmp_ = NULL; \
+ \
+ if ( module->clazz->get_interface ) \
+ _tmp_ = module->clazz->get_interface( module, FT_SERVICE_ID_ ## id ); \
+ ptr = _tmp_; \
+ FT_END_STMNT
+
+#endif /* !C++ */
+
+
+ /*
+ * @macro:
+ * FT_FACE_FIND_GLOBAL_SERVICE
+ *
+ * @description:
+ * This macro is used to look up a service from all modules.
+ *
+ * @input:
+ * face ::
+ * The source face handle.
+ *
+ * id ::
+ * A string describing the service as defined in the service's
+ * header files (e.g. FT_SERVICE_ID_MULTI_MASTERS which expands to
+ * `multi-masters'). It is automatically prefixed with
+ * `FT_SERVICE_ID_'.
+ *
+ * @output:
+ * ptr ::
+ * A variable that receives the service pointer. Will be NULL
+ * if not found.
+ */
+#ifdef __cplusplus
+
+#define FT_FACE_FIND_GLOBAL_SERVICE( face, ptr, id ) \
+ FT_BEGIN_STMNT \
+ FT_Module module = FT_MODULE( FT_FACE( face )->driver ); \
+ FT_Pointer _tmp_; \
+ FT_Pointer* _pptr_ = (FT_Pointer*)&(ptr); \
+ \
+ \
+ _tmp_ = ft_module_get_service( module, FT_SERVICE_ID_ ## id ); \
+ *_pptr_ = _tmp_; \
+ FT_END_STMNT
+
+#else /* !C++ */
+
+#define FT_FACE_FIND_GLOBAL_SERVICE( face, ptr, id ) \
+ FT_BEGIN_STMNT \
+ FT_Module module = FT_MODULE( FT_FACE( face )->driver ); \
+ FT_Pointer _tmp_; \
+ \
+ \
+ _tmp_ = ft_module_get_service( module, FT_SERVICE_ID_ ## id ); \
+ ptr = _tmp_; \
+ FT_END_STMNT
+
+#endif /* !C++ */
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** S E R V I C E D E S C R I P T O R S *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /*
+ * The following structure is used to _describe_ a given service
+ * to the library. This is useful to build simple static service lists.
+ */
+ typedef struct FT_ServiceDescRec_
+ {
+ const char* serv_id; /* service name */
+ const void* serv_data; /* service pointer/data */
+
+ } FT_ServiceDescRec;
+
+ typedef const FT_ServiceDescRec* FT_ServiceDesc;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Macro> */
+ /* FT_DEFINE_SERVICEDESCREC1 */
+ /* FT_DEFINE_SERVICEDESCREC2 */
+ /* FT_DEFINE_SERVICEDESCREC3 */
+ /* FT_DEFINE_SERVICEDESCREC4 */
+ /* FT_DEFINE_SERVICEDESCREC5 */
+ /* FT_DEFINE_SERVICEDESCREC6 */
+ /* FT_DEFINE_SERVICEDESCREC7 */
+ /* */
+ /* <Description> */
+ /* Used to initialize an array of FT_ServiceDescRec structures. */
+ /* */
+ /* When FT_CONFIG_OPTION_PIC is defined a `create' function needs to */
+ /* be called with a pointer to return an allocated array. As soon as */
+ /* it is no longer needed, a `destroy' function needs to be called to */
+ /* release that allocation. */
+ /* */
+ /* These functions should be manually called from the `pic_init' and */
+ /* `pic_free' functions of your module (see FT_DEFINE_MODULE). */
+ /* */
+ /* When FT_CONFIG_OPTION_PIC is not defined the array will be */
+ /* allocated in the global scope (or the scope where the macro is */
+ /* used). */
+ /* */
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICEDESCREC1( class_, \
+ serv_id_1, serv_data_1 ) \
+ static const FT_ServiceDescRec class_[] = \
+ { \
+ { serv_id_1, serv_data_1 }, \
+ { NULL, NULL } \
+ };
+
+#define FT_DEFINE_SERVICEDESCREC2( class_, \
+ serv_id_1, serv_data_1, \
+ serv_id_2, serv_data_2 ) \
+ static const FT_ServiceDescRec class_[] = \
+ { \
+ { serv_id_1, serv_data_1 }, \
+ { serv_id_2, serv_data_2 }, \
+ { NULL, NULL } \
+ };
+
+#define FT_DEFINE_SERVICEDESCREC3( class_, \
+ serv_id_1, serv_data_1, \
+ serv_id_2, serv_data_2, \
+ serv_id_3, serv_data_3 ) \
+ static const FT_ServiceDescRec class_[] = \
+ { \
+ { serv_id_1, serv_data_1 }, \
+ { serv_id_2, serv_data_2 }, \
+ { serv_id_3, serv_data_3 }, \
+ { NULL, NULL } \
+ };
+
+#define FT_DEFINE_SERVICEDESCREC4( class_, \
+ serv_id_1, serv_data_1, \
+ serv_id_2, serv_data_2, \
+ serv_id_3, serv_data_3, \
+ serv_id_4, serv_data_4 ) \
+ static const FT_ServiceDescRec class_[] = \
+ { \
+ { serv_id_1, serv_data_1 }, \
+ { serv_id_2, serv_data_2 }, \
+ { serv_id_3, serv_data_3 }, \
+ { serv_id_4, serv_data_4 }, \
+ { NULL, NULL } \
+ };
+
+#define FT_DEFINE_SERVICEDESCREC5( class_, \
+ serv_id_1, serv_data_1, \
+ serv_id_2, serv_data_2, \
+ serv_id_3, serv_data_3, \
+ serv_id_4, serv_data_4, \
+ serv_id_5, serv_data_5 ) \
+ static const FT_ServiceDescRec class_[] = \
+ { \
+ { serv_id_1, serv_data_1 }, \
+ { serv_id_2, serv_data_2 }, \
+ { serv_id_3, serv_data_3 }, \
+ { serv_id_4, serv_data_4 }, \
+ { serv_id_5, serv_data_5 }, \
+ { NULL, NULL } \
+ };
+
+#define FT_DEFINE_SERVICEDESCREC6( class_, \
+ serv_id_1, serv_data_1, \
+ serv_id_2, serv_data_2, \
+ serv_id_3, serv_data_3, \
+ serv_id_4, serv_data_4, \
+ serv_id_5, serv_data_5, \
+ serv_id_6, serv_data_6 ) \
+ static const FT_ServiceDescRec class_[] = \
+ { \
+ { serv_id_1, serv_data_1 }, \
+ { serv_id_2, serv_data_2 }, \
+ { serv_id_3, serv_data_3 }, \
+ { serv_id_4, serv_data_4 }, \
+ { serv_id_5, serv_data_5 }, \
+ { serv_id_6, serv_data_6 }, \
+ { NULL, NULL } \
+ };
+
+#define FT_DEFINE_SERVICEDESCREC7( class_, \
+ serv_id_1, serv_data_1, \
+ serv_id_2, serv_data_2, \
+ serv_id_3, serv_data_3, \
+ serv_id_4, serv_data_4, \
+ serv_id_5, serv_data_5, \
+ serv_id_6, serv_data_6, \
+ serv_id_7, serv_data_7 ) \
+ static const FT_ServiceDescRec class_[] = \
+ { \
+ { serv_id_1, serv_data_1 }, \
+ { serv_id_2, serv_data_2 }, \
+ { serv_id_3, serv_data_3 }, \
+ { serv_id_4, serv_data_4 }, \
+ { serv_id_5, serv_data_5 }, \
+ { serv_id_6, serv_data_6 }, \
+ { serv_id_7, serv_data_7 }, \
+ { NULL, NULL } \
+ };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICEDESCREC1( class_, \
+ serv_id_1, serv_data_1 ) \
+ void \
+ FT_Destroy_Class_ ## class_( FT_Library library, \
+ FT_ServiceDescRec* clazz ) \
+ { \
+ FT_Memory memory = library->memory; \
+ \
+ \
+ if ( clazz ) \
+ FT_FREE( clazz ); \
+ } \
+ \
+ FT_Error \
+ FT_Create_Class_ ## class_( FT_Library library, \
+ FT_ServiceDescRec** output_class ) \
+ { \
+ FT_ServiceDescRec* clazz = NULL; \
+ FT_Error error; \
+ FT_Memory memory = library->memory; \
+ \
+ \
+ if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 2 ) ) \
+ return error; \
+ \
+ clazz[0].serv_id = serv_id_1; \
+ clazz[0].serv_data = serv_data_1; \
+ clazz[1].serv_id = NULL; \
+ clazz[1].serv_data = NULL; \
+ \
+ *output_class = clazz; \
+ \
+ return FT_Err_Ok; \
+ }
+
+#define FT_DEFINE_SERVICEDESCREC2( class_, \
+ serv_id_1, serv_data_1, \
+ serv_id_2, serv_data_2 ) \
+ void \
+ FT_Destroy_Class_ ## class_( FT_Library library, \
+ FT_ServiceDescRec* clazz ) \
+ { \
+ FT_Memory memory = library->memory; \
+ \
+ \
+ if ( clazz ) \
+ FT_FREE( clazz ); \
+ } \
+ \
+ FT_Error \
+ FT_Create_Class_ ## class_( FT_Library library, \
+ FT_ServiceDescRec** output_class ) \
+ { \
+ FT_ServiceDescRec* clazz = NULL; \
+ FT_Error error; \
+ FT_Memory memory = library->memory; \
+ \
+ \
+ if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 3 ) ) \
+ return error; \
+ \
+ clazz[0].serv_id = serv_id_1; \
+ clazz[0].serv_data = serv_data_1; \
+ clazz[1].serv_id = serv_id_2; \
+ clazz[1].serv_data = serv_data_2; \
+ clazz[2].serv_id = NULL; \
+ clazz[2].serv_data = NULL; \
+ \
+ *output_class = clazz; \
+ \
+ return FT_Err_Ok; \
+ }
+
+#define FT_DEFINE_SERVICEDESCREC3( class_, \
+ serv_id_1, serv_data_1, \
+ serv_id_2, serv_data_2, \
+ serv_id_3, serv_data_3 ) \
+ void \
+ FT_Destroy_Class_ ## class_( FT_Library library, \
+ FT_ServiceDescRec* clazz ) \
+ { \
+ FT_Memory memory = library->memory; \
+ \
+ \
+ if ( clazz ) \
+ FT_FREE( clazz ); \
+ } \
+ \
+ FT_Error \
+ FT_Create_Class_ ## class_( FT_Library library, \
+ FT_ServiceDescRec** output_class ) \
+ { \
+ FT_ServiceDescRec* clazz = NULL; \
+ FT_Error error; \
+ FT_Memory memory = library->memory; \
+ \
+ \
+ if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 4 ) ) \
+ return error; \
+ \
+ clazz[0].serv_id = serv_id_1; \
+ clazz[0].serv_data = serv_data_1; \
+ clazz[1].serv_id = serv_id_2; \
+ clazz[1].serv_data = serv_data_2; \
+ clazz[2].serv_id = serv_id_3; \
+ clazz[2].serv_data = serv_data_3; \
+ clazz[3].serv_id = NULL; \
+ clazz[3].serv_data = NULL; \
+ \
+ *output_class = clazz; \
+ \
+ return FT_Err_Ok; \
+ }
+
+#define FT_DEFINE_SERVICEDESCREC4( class_, \
+ serv_id_1, serv_data_1, \
+ serv_id_2, serv_data_2, \
+ serv_id_3, serv_data_3, \
+ serv_id_4, serv_data_4 ) \
+ void \
+ FT_Destroy_Class_ ## class_( FT_Library library, \
+ FT_ServiceDescRec* clazz ) \
+ { \
+ FT_Memory memory = library->memory; \
+ \
+ \
+ if ( clazz ) \
+ FT_FREE( clazz ); \
+ } \
+ \
+ FT_Error \
+ FT_Create_Class_ ## class_( FT_Library library, \
+ FT_ServiceDescRec** output_class ) \
+ { \
+ FT_ServiceDescRec* clazz = NULL; \
+ FT_Error error; \
+ FT_Memory memory = library->memory; \
+ \
+ \
+ if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 5 ) ) \
+ return error; \
+ \
+ clazz[0].serv_id = serv_id_1; \
+ clazz[0].serv_data = serv_data_1; \
+ clazz[1].serv_id = serv_id_2; \
+ clazz[1].serv_data = serv_data_2; \
+ clazz[2].serv_id = serv_id_3; \
+ clazz[2].serv_data = serv_data_3; \
+ clazz[3].serv_id = serv_id_4; \
+ clazz[3].serv_data = serv_data_4; \
+ clazz[4].serv_id = NULL; \
+ clazz[4].serv_data = NULL; \
+ \
+ *output_class = clazz; \
+ \
+ return FT_Err_Ok; \
+ }
+
+#define FT_DEFINE_SERVICEDESCREC5( class_, \
+ serv_id_1, serv_data_1, \
+ serv_id_2, serv_data_2, \
+ serv_id_3, serv_data_3, \
+ serv_id_4, serv_data_4, \
+ serv_id_5, serv_data_5 ) \
+ void \
+ FT_Destroy_Class_ ## class_( FT_Library library, \
+ FT_ServiceDescRec* clazz ) \
+ { \
+ FT_Memory memory = library->memory; \
+ \
+ \
+ if ( clazz ) \
+ FT_FREE( clazz ); \
+ } \
+ \
+ FT_Error \
+ FT_Create_Class_ ## class_( FT_Library library, \
+ FT_ServiceDescRec** output_class ) \
+ { \
+ FT_ServiceDescRec* clazz = NULL; \
+ FT_Error error; \
+ FT_Memory memory = library->memory; \
+ \
+ \
+ if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 6 ) ) \
+ return error; \
+ \
+ clazz[0].serv_id = serv_id_1; \
+ clazz[0].serv_data = serv_data_1; \
+ clazz[1].serv_id = serv_id_2; \
+ clazz[1].serv_data = serv_data_2; \
+ clazz[2].serv_id = serv_id_3; \
+ clazz[2].serv_data = serv_data_3; \
+ clazz[3].serv_id = serv_id_4; \
+ clazz[3].serv_data = serv_data_4; \
+ clazz[4].serv_id = serv_id_5; \
+ clazz[4].serv_data = serv_data_5; \
+ clazz[5].serv_id = NULL; \
+ clazz[5].serv_data = NULL; \
+ \
+ *output_class = clazz; \
+ \
+ return FT_Err_Ok; \
+ }
+
+#define FT_DEFINE_SERVICEDESCREC6( class_, \
+ serv_id_1, serv_data_1, \
+ serv_id_2, serv_data_2, \
+ serv_id_3, serv_data_3, \
+ serv_id_4, serv_data_4, \
+ serv_id_5, serv_data_5, \
+ serv_id_6, serv_data_6 ) \
+ void \
+ FT_Destroy_Class_ ## class_( FT_Library library, \
+ FT_ServiceDescRec* clazz ) \
+ { \
+ FT_Memory memory = library->memory; \
+ \
+ \
+ if ( clazz ) \
+ FT_FREE( clazz ); \
+ } \
+ \
+ FT_Error \
+ FT_Create_Class_ ## class_( FT_Library library, \
+ FT_ServiceDescRec** output_class) \
+ { \
+ FT_ServiceDescRec* clazz = NULL; \
+ FT_Error error; \
+ FT_Memory memory = library->memory; \
+ \
+ \
+ if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 7 ) ) \
+ return error; \
+ \
+ clazz[0].serv_id = serv_id_1; \
+ clazz[0].serv_data = serv_data_1; \
+ clazz[1].serv_id = serv_id_2; \
+ clazz[1].serv_data = serv_data_2; \
+ clazz[2].serv_id = serv_id_3; \
+ clazz[2].serv_data = serv_data_3; \
+ clazz[3].serv_id = serv_id_4; \
+ clazz[3].serv_data = serv_data_4; \
+ clazz[4].serv_id = serv_id_5; \
+ clazz[4].serv_data = serv_data_5; \
+ clazz[5].serv_id = serv_id_6; \
+ clazz[5].serv_data = serv_data_6; \
+ clazz[6].serv_id = NULL; \
+ clazz[6].serv_data = NULL; \
+ \
+ *output_class = clazz; \
+ \
+ return FT_Err_Ok; \
+ }
+
+#define FT_DEFINE_SERVICEDESCREC7( class_, \
+ serv_id_1, serv_data_1, \
+ serv_id_2, serv_data_2, \
+ serv_id_3, serv_data_3, \
+ serv_id_4, serv_data_4, \
+ serv_id_5, serv_data_5, \
+ serv_id_6, serv_data_6, \
+ serv_id_7, serv_data_7 ) \
+ void \
+ FT_Destroy_Class_ ## class_( FT_Library library, \
+ FT_ServiceDescRec* clazz ) \
+ { \
+ FT_Memory memory = library->memory; \
+ \
+ \
+ if ( clazz ) \
+ FT_FREE( clazz ); \
+ } \
+ \
+ FT_Error \
+ FT_Create_Class_ ## class_( FT_Library library, \
+ FT_ServiceDescRec** output_class) \
+ { \
+ FT_ServiceDescRec* clazz = NULL; \
+ FT_Error error; \
+ FT_Memory memory = library->memory; \
+ \
+ \
+ if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 8 ) ) \
+ return error; \
+ \
+ clazz[0].serv_id = serv_id_1; \
+ clazz[0].serv_data = serv_data_1; \
+ clazz[1].serv_id = serv_id_2; \
+ clazz[1].serv_data = serv_data_2; \
+ clazz[2].serv_id = serv_id_3; \
+ clazz[2].serv_data = serv_data_3; \
+ clazz[3].serv_id = serv_id_4; \
+ clazz[3].serv_data = serv_data_4; \
+ clazz[4].serv_id = serv_id_5; \
+ clazz[4].serv_data = serv_data_5; \
+ clazz[5].serv_id = serv_id_6; \
+ clazz[5].serv_data = serv_data_6; \
+ clazz[6].serv_id = serv_id_7; \
+ clazz[6].serv_data = serv_data_7; \
+ clazz[7].serv_id = NULL; \
+ clazz[7].serv_data = NULL; \
+ \
+ *output_class = clazz; \
+ \
+ return FT_Err_Ok; \
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+ /*
+ * Parse a list of FT_ServiceDescRec descriptors and look for
+ * a specific service by ID. Note that the last element in the
+ * array must be { NULL, NULL }, and that the function should
+ * return NULL if the service isn't available.
+ *
+ * This function can be used by modules to implement their
+ * `get_service' method.
+ */
+ FT_BASE( FT_Pointer )
+ ft_service_list_lookup( FT_ServiceDesc service_descriptors,
+ const char* service_id );
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** S E R V I C E S C A C H E *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /*
+ * This structure is used to store a cache for several frequently used
+ * services. It is the type of `face->internal->services'. You
+ * should only use FT_FACE_LOOKUP_SERVICE to access it.
+ *
+ * All fields should have the type FT_Pointer to relax compilation
+ * dependencies. We assume the developer isn't completely stupid.
+ *
+ * Each field must be named `service_XXXX' where `XXX' corresponds to
+ * the correct FT_SERVICE_ID_XXXX macro. See the definition of
+ * FT_FACE_LOOKUP_SERVICE below how this is implemented.
+ *
+ */
+ typedef struct FT_ServiceCacheRec_
+ {
+ FT_Pointer service_POSTSCRIPT_FONT_NAME;
+ FT_Pointer service_MULTI_MASTERS;
+ FT_Pointer service_GLYPH_DICT;
+ FT_Pointer service_PFR_METRICS;
+ FT_Pointer service_WINFNT;
+
+ } FT_ServiceCacheRec, *FT_ServiceCache;
+
+
+ /*
+ * A magic number used within the services cache.
+ */
+
+ /* ensure that value `1' has the same width as a pointer */
+#define FT_SERVICE_UNAVAILABLE ((FT_Pointer)~(FT_PtrDist)1)
+
+
+ /*
+ * @macro:
+ * FT_FACE_LOOKUP_SERVICE
+ *
+ * @description:
+ * This macro is used to lookup a service from a face's driver module
+ * using its cache.
+ *
+ * @input:
+ * face::
+ * The source face handle containing the cache.
+ *
+ * field ::
+ * The field name in the cache.
+ *
+ * id ::
+ * The service ID.
+ *
+ * @output:
+ * ptr ::
+ * A variable receiving the service data. NULL if not available.
+ */
+#ifdef __cplusplus
+
+#define FT_FACE_LOOKUP_SERVICE( face, ptr, id ) \
+ FT_BEGIN_STMNT \
+ FT_Pointer svc; \
+ FT_Pointer* Pptr = (FT_Pointer*)&(ptr); \
+ \
+ \
+ svc = FT_FACE( face )->internal->services. service_ ## id; \
+ if ( svc == FT_SERVICE_UNAVAILABLE ) \
+ svc = NULL; \
+ else if ( svc == NULL ) \
+ { \
+ FT_FACE_FIND_SERVICE( face, svc, id ); \
+ \
+ FT_FACE( face )->internal->services. service_ ## id = \
+ (FT_Pointer)( svc != NULL ? svc \
+ : FT_SERVICE_UNAVAILABLE ); \
+ } \
+ *Pptr = svc; \
+ FT_END_STMNT
+
+#else /* !C++ */
+
+#define FT_FACE_LOOKUP_SERVICE( face, ptr, id ) \
+ FT_BEGIN_STMNT \
+ FT_Pointer svc; \
+ \
+ \
+ svc = FT_FACE( face )->internal->services. service_ ## id; \
+ if ( svc == FT_SERVICE_UNAVAILABLE ) \
+ svc = NULL; \
+ else if ( svc == NULL ) \
+ { \
+ FT_FACE_FIND_SERVICE( face, svc, id ); \
+ \
+ FT_FACE( face )->internal->services. service_ ## id = \
+ (FT_Pointer)( svc != NULL ? svc \
+ : FT_SERVICE_UNAVAILABLE ); \
+ } \
+ ptr = svc; \
+ FT_END_STMNT
+
+#endif /* !C++ */
+
+ /*
+ * A macro used to define new service structure types.
+ */
+
+#define FT_DEFINE_SERVICE( name ) \
+ typedef struct FT_Service_ ## name ## Rec_ \
+ FT_Service_ ## name ## Rec ; \
+ typedef struct FT_Service_ ## name ## Rec_ \
+ const * FT_Service_ ## name ; \
+ struct FT_Service_ ## name ## Rec_
+
+ /* */
+
+ /*
+ * The header files containing the services.
+ */
+
+#define FT_SERVICE_BDF_H <freetype/internal/services/svbdf.h>
+#define FT_SERVICE_CID_H <freetype/internal/services/svcid.h>
+#define FT_SERVICE_GLYPH_DICT_H <freetype/internal/services/svgldict.h>
+#define FT_SERVICE_GX_VALIDATE_H <freetype/internal/services/svgxval.h>
+#define FT_SERVICE_KERNING_H <freetype/internal/services/svkern.h>
+#define FT_SERVICE_MULTIPLE_MASTERS_H <freetype/internal/services/svmm.h>
+#define FT_SERVICE_OPENTYPE_VALIDATE_H <freetype/internal/services/svotval.h>
+#define FT_SERVICE_PFR_H <freetype/internal/services/svpfr.h>
+#define FT_SERVICE_POSTSCRIPT_CMAPS_H <freetype/internal/services/svpscmap.h>
+#define FT_SERVICE_POSTSCRIPT_INFO_H <freetype/internal/services/svpsinfo.h>
+#define FT_SERVICE_POSTSCRIPT_NAME_H <freetype/internal/services/svpostnm.h>
+#define FT_SERVICE_PROPERTIES_H <freetype/internal/services/svprop.h>
+#define FT_SERVICE_SFNT_H <freetype/internal/services/svsfnt.h>
+#define FT_SERVICE_TRUETYPE_ENGINE_H <freetype/internal/services/svtteng.h>
+#define FT_SERVICE_TT_CMAP_H <freetype/internal/services/svttcmap.h>
+#define FT_SERVICE_WINFNT_H <freetype/internal/services/svwinfnt.h>
+#define FT_SERVICE_XFREE86_NAME_H <freetype/internal/services/svxf86nm.h>
+#define FT_SERVICE_TRUETYPE_GLYF_H <freetype/internal/services/svttglyf.h>
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __FTSERV_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftstream.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftstream.h
new file mode 100644
index 0000000000..c1a265431a
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftstream.h
@@ -0,0 +1,536 @@
+/***************************************************************************/
+/* */
+/* ftstream.h */
+/* */
+/* Stream handling (specification). */
+/* */
+/* Copyright 1996-2002, 2004-2006, 2011, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTSTREAM_H__
+#define __FTSTREAM_H__
+
+
+#include "../../ft2build.h"
+#include "../ftsystem.h"
+#include "ftobjs.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /* format of an 8-bit frame_op value: */
+ /* */
+ /* bit 76543210 */
+ /* xxxxxxes */
+ /* */
+ /* s is set to 1 if the value is signed. */
+ /* e is set to 1 if the value is little-endian. */
+ /* xxx is a command. */
+
+#define FT_FRAME_OP_SHIFT 2
+#define FT_FRAME_OP_SIGNED 1
+#define FT_FRAME_OP_LITTLE 2
+#define FT_FRAME_OP_COMMAND( x ) ( x >> FT_FRAME_OP_SHIFT )
+
+#define FT_MAKE_FRAME_OP( command, little, sign ) \
+ ( ( command << FT_FRAME_OP_SHIFT ) | ( little << 1 ) | sign )
+
+#define FT_FRAME_OP_END 0
+#define FT_FRAME_OP_START 1 /* start a new frame */
+#define FT_FRAME_OP_BYTE 2 /* read 1-byte value */
+#define FT_FRAME_OP_SHORT 3 /* read 2-byte value */
+#define FT_FRAME_OP_LONG 4 /* read 4-byte value */
+#define FT_FRAME_OP_OFF3 5 /* read 3-byte value */
+#define FT_FRAME_OP_BYTES 6 /* read a bytes sequence */
+
+
+ typedef enum FT_Frame_Op_
+ {
+ ft_frame_end = 0,
+ ft_frame_start = FT_MAKE_FRAME_OP( FT_FRAME_OP_START, 0, 0 ),
+
+ ft_frame_byte = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTE, 0, 0 ),
+ ft_frame_schar = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTE, 0, 1 ),
+
+ ft_frame_ushort_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 0, 0 ),
+ ft_frame_short_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 0, 1 ),
+ ft_frame_ushort_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 1, 0 ),
+ ft_frame_short_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 1, 1 ),
+
+ ft_frame_ulong_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 0, 0 ),
+ ft_frame_long_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 0, 1 ),
+ ft_frame_ulong_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 1, 0 ),
+ ft_frame_long_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 1, 1 ),
+
+ ft_frame_uoff3_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 0, 0 ),
+ ft_frame_off3_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 0, 1 ),
+ ft_frame_uoff3_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 1, 0 ),
+ ft_frame_off3_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 1, 1 ),
+
+ ft_frame_bytes = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTES, 0, 0 ),
+ ft_frame_skip = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTES, 0, 1 )
+
+ } FT_Frame_Op;
+
+
+ typedef struct FT_Frame_Field_
+ {
+ FT_Byte value;
+ FT_Byte size;
+ FT_UShort offset;
+
+ } FT_Frame_Field;
+
+
+ /* Construct an FT_Frame_Field out of a structure type and a field name. */
+ /* The structure type must be set in the FT_STRUCTURE macro before */
+ /* calling the FT_FRAME_START() macro. */
+ /* */
+#define FT_FIELD_SIZE( f ) \
+ (FT_Byte)sizeof ( ((FT_STRUCTURE*)0)->f )
+
+#define FT_FIELD_SIZE_DELTA( f ) \
+ (FT_Byte)sizeof ( ((FT_STRUCTURE*)0)->f[0] )
+
+#define FT_FIELD_OFFSET( f ) \
+ (FT_UShort)( offsetof( FT_STRUCTURE, f ) )
+
+#define FT_FRAME_FIELD( frame_op, field ) \
+ { \
+ frame_op, \
+ FT_FIELD_SIZE( field ), \
+ FT_FIELD_OFFSET( field ) \
+ }
+
+#define FT_MAKE_EMPTY_FIELD( frame_op ) { frame_op, 0, 0 }
+
+#define FT_FRAME_START( size ) { ft_frame_start, 0, size }
+#define FT_FRAME_END { ft_frame_end, 0, 0 }
+
+#define FT_FRAME_LONG( f ) FT_FRAME_FIELD( ft_frame_long_be, f )
+#define FT_FRAME_ULONG( f ) FT_FRAME_FIELD( ft_frame_ulong_be, f )
+#define FT_FRAME_SHORT( f ) FT_FRAME_FIELD( ft_frame_short_be, f )
+#define FT_FRAME_USHORT( f ) FT_FRAME_FIELD( ft_frame_ushort_be, f )
+#define FT_FRAME_OFF3( f ) FT_FRAME_FIELD( ft_frame_off3_be, f )
+#define FT_FRAME_UOFF3( f ) FT_FRAME_FIELD( ft_frame_uoff3_be, f )
+#define FT_FRAME_BYTE( f ) FT_FRAME_FIELD( ft_frame_byte, f )
+#define FT_FRAME_CHAR( f ) FT_FRAME_FIELD( ft_frame_schar, f )
+
+#define FT_FRAME_LONG_LE( f ) FT_FRAME_FIELD( ft_frame_long_le, f )
+#define FT_FRAME_ULONG_LE( f ) FT_FRAME_FIELD( ft_frame_ulong_le, f )
+#define FT_FRAME_SHORT_LE( f ) FT_FRAME_FIELD( ft_frame_short_le, f )
+#define FT_FRAME_USHORT_LE( f ) FT_FRAME_FIELD( ft_frame_ushort_le, f )
+#define FT_FRAME_OFF3_LE( f ) FT_FRAME_FIELD( ft_frame_off3_le, f )
+#define FT_FRAME_UOFF3_LE( f ) FT_FRAME_FIELD( ft_frame_uoff3_le, f )
+
+#define FT_FRAME_SKIP_LONG { ft_frame_long_be, 0, 0 }
+#define FT_FRAME_SKIP_SHORT { ft_frame_short_be, 0, 0 }
+#define FT_FRAME_SKIP_BYTE { ft_frame_byte, 0, 0 }
+
+#define FT_FRAME_BYTES( field, count ) \
+ { \
+ ft_frame_bytes, \
+ count, \
+ FT_FIELD_OFFSET( field ) \
+ }
+
+#define FT_FRAME_SKIP_BYTES( count ) { ft_frame_skip, count, 0 }
+
+
+ /*************************************************************************/
+ /* */
+ /* Integer extraction macros -- the `buffer' parameter must ALWAYS be of */
+ /* type `char*' or equivalent (1-byte elements). */
+ /* */
+
+#define FT_BYTE_( p, i ) ( ((const FT_Byte*)(p))[(i)] )
+
+#define FT_INT16( x ) ( (FT_Int16)(x) )
+#define FT_UINT16( x ) ( (FT_UInt16)(x) )
+#define FT_INT32( x ) ( (FT_Int32)(x) )
+#define FT_UINT32( x ) ( (FT_UInt32)(x) )
+
+
+#define FT_BYTE_U16( p, i, s ) ( FT_UINT16( FT_BYTE_( p, i ) ) << (s) )
+#define FT_BYTE_U32( p, i, s ) ( FT_UINT32( FT_BYTE_( p, i ) ) << (s) )
+
+
+#define FT_PEEK_SHORT( p ) FT_INT16( FT_BYTE_U16( p, 0, 8) | \
+ FT_BYTE_U16( p, 1, 0) )
+
+#define FT_PEEK_USHORT( p ) FT_UINT16( FT_BYTE_U16( p, 0, 8 ) | \
+ FT_BYTE_U16( p, 1, 0 ) )
+
+#define FT_PEEK_LONG( p ) FT_INT32( FT_BYTE_U32( p, 0, 24 ) | \
+ FT_BYTE_U32( p, 1, 16 ) | \
+ FT_BYTE_U32( p, 2, 8 ) | \
+ FT_BYTE_U32( p, 3, 0 ) )
+
+#define FT_PEEK_ULONG( p ) FT_UINT32( FT_BYTE_U32( p, 0, 24 ) | \
+ FT_BYTE_U32( p, 1, 16 ) | \
+ FT_BYTE_U32( p, 2, 8 ) | \
+ FT_BYTE_U32( p, 3, 0 ) )
+
+#define FT_PEEK_OFF3( p ) FT_INT32( FT_BYTE_U32( p, 0, 16 ) | \
+ FT_BYTE_U32( p, 1, 8 ) | \
+ FT_BYTE_U32( p, 2, 0 ) )
+
+#define FT_PEEK_UOFF3( p ) FT_UINT32( FT_BYTE_U32( p, 0, 16 ) | \
+ FT_BYTE_U32( p, 1, 8 ) | \
+ FT_BYTE_U32( p, 2, 0 ) )
+
+#define FT_PEEK_SHORT_LE( p ) FT_INT16( FT_BYTE_U16( p, 1, 8 ) | \
+ FT_BYTE_U16( p, 0, 0 ) )
+
+#define FT_PEEK_USHORT_LE( p ) FT_UINT16( FT_BYTE_U16( p, 1, 8 ) | \
+ FT_BYTE_U16( p, 0, 0 ) )
+
+#define FT_PEEK_LONG_LE( p ) FT_INT32( FT_BYTE_U32( p, 3, 24 ) | \
+ FT_BYTE_U32( p, 2, 16 ) | \
+ FT_BYTE_U32( p, 1, 8 ) | \
+ FT_BYTE_U32( p, 0, 0 ) )
+
+#define FT_PEEK_ULONG_LE( p ) FT_UINT32( FT_BYTE_U32( p, 3, 24 ) | \
+ FT_BYTE_U32( p, 2, 16 ) | \
+ FT_BYTE_U32( p, 1, 8 ) | \
+ FT_BYTE_U32( p, 0, 0 ) )
+
+#define FT_PEEK_OFF3_LE( p ) FT_INT32( FT_BYTE_U32( p, 2, 16 ) | \
+ FT_BYTE_U32( p, 1, 8 ) | \
+ FT_BYTE_U32( p, 0, 0 ) )
+
+#define FT_PEEK_UOFF3_LE( p ) FT_UINT32( FT_BYTE_U32( p, 2, 16 ) | \
+ FT_BYTE_U32( p, 1, 8 ) | \
+ FT_BYTE_U32( p, 0, 0 ) )
+
+
+#define FT_NEXT_CHAR( buffer ) \
+ ( (signed char)*buffer++ )
+
+#define FT_NEXT_BYTE( buffer ) \
+ ( (unsigned char)*buffer++ )
+
+#define FT_NEXT_SHORT( buffer ) \
+ ( (short)( buffer += 2, FT_PEEK_SHORT( buffer - 2 ) ) )
+
+#define FT_NEXT_USHORT( buffer ) \
+ ( (unsigned short)( buffer += 2, FT_PEEK_USHORT( buffer - 2 ) ) )
+
+#define FT_NEXT_OFF3( buffer ) \
+ ( (long)( buffer += 3, FT_PEEK_OFF3( buffer - 3 ) ) )
+
+#define FT_NEXT_UOFF3( buffer ) \
+ ( (unsigned long)( buffer += 3, FT_PEEK_UOFF3( buffer - 3 ) ) )
+
+#define FT_NEXT_LONG( buffer ) \
+ ( (long)( buffer += 4, FT_PEEK_LONG( buffer - 4 ) ) )
+
+#define FT_NEXT_ULONG( buffer ) \
+ ( (unsigned long)( buffer += 4, FT_PEEK_ULONG( buffer - 4 ) ) )
+
+
+#define FT_NEXT_SHORT_LE( buffer ) \
+ ( (short)( buffer += 2, FT_PEEK_SHORT_LE( buffer - 2 ) ) )
+
+#define FT_NEXT_USHORT_LE( buffer ) \
+ ( (unsigned short)( buffer += 2, FT_PEEK_USHORT_LE( buffer - 2 ) ) )
+
+#define FT_NEXT_OFF3_LE( buffer ) \
+ ( (long)( buffer += 3, FT_PEEK_OFF3_LE( buffer - 3 ) ) )
+
+#define FT_NEXT_UOFF3_LE( buffer ) \
+ ( (unsigned long)( buffer += 3, FT_PEEK_UOFF3_LE( buffer - 3 ) ) )
+
+#define FT_NEXT_LONG_LE( buffer ) \
+ ( (long)( buffer += 4, FT_PEEK_LONG_LE( buffer - 4 ) ) )
+
+#define FT_NEXT_ULONG_LE( buffer ) \
+ ( (unsigned long)( buffer += 4, FT_PEEK_ULONG_LE( buffer - 4 ) ) )
+
+
+ /*************************************************************************/
+ /* */
+ /* Each GET_xxxx() macro uses an implicit `stream' variable. */
+ /* */
+#if 0
+#define FT_GET_MACRO( type ) FT_NEXT_ ## type ( stream->cursor )
+
+#define FT_GET_CHAR() FT_GET_MACRO( CHAR )
+#define FT_GET_BYTE() FT_GET_MACRO( BYTE )
+#define FT_GET_SHORT() FT_GET_MACRO( SHORT )
+#define FT_GET_USHORT() FT_GET_MACRO( USHORT )
+#define FT_GET_OFF3() FT_GET_MACRO( OFF3 )
+#define FT_GET_UOFF3() FT_GET_MACRO( UOFF3 )
+#define FT_GET_LONG() FT_GET_MACRO( LONG )
+#define FT_GET_ULONG() FT_GET_MACRO( ULONG )
+#define FT_GET_TAG4() FT_GET_MACRO( ULONG )
+
+#define FT_GET_SHORT_LE() FT_GET_MACRO( SHORT_LE )
+#define FT_GET_USHORT_LE() FT_GET_MACRO( USHORT_LE )
+#define FT_GET_LONG_LE() FT_GET_MACRO( LONG_LE )
+#define FT_GET_ULONG_LE() FT_GET_MACRO( ULONG_LE )
+
+#else
+#define FT_GET_MACRO( func, type ) ( (type)func( stream ) )
+
+#define FT_GET_CHAR() FT_GET_MACRO( FT_Stream_GetChar, FT_Char )
+#define FT_GET_BYTE() FT_GET_MACRO( FT_Stream_GetChar, FT_Byte )
+#define FT_GET_SHORT() FT_GET_MACRO( FT_Stream_GetUShort, FT_Short )
+#define FT_GET_USHORT() FT_GET_MACRO( FT_Stream_GetUShort, FT_UShort )
+#define FT_GET_OFF3() FT_GET_MACRO( FT_Stream_GetUOffset, FT_Long )
+#define FT_GET_UOFF3() FT_GET_MACRO( FT_Stream_GetUOffset, FT_ULong )
+#define FT_GET_LONG() FT_GET_MACRO( FT_Stream_GetULong, FT_Long )
+#define FT_GET_ULONG() FT_GET_MACRO( FT_Stream_GetULong, FT_ULong )
+#define FT_GET_TAG4() FT_GET_MACRO( FT_Stream_GetULong, FT_ULong )
+
+#define FT_GET_SHORT_LE() FT_GET_MACRO( FT_Stream_GetUShortLE, FT_Short )
+#define FT_GET_USHORT_LE() FT_GET_MACRO( FT_Stream_GetUShortLE, FT_UShort )
+#define FT_GET_LONG_LE() FT_GET_MACRO( FT_Stream_GetULongLE, FT_Long )
+#define FT_GET_ULONG_LE() FT_GET_MACRO( FT_Stream_GetULongLE, FT_ULong )
+#endif
+
+#define FT_READ_MACRO( func, type, var ) \
+ ( var = (type)func( stream, &error ), \
+ error != FT_Err_Ok )
+
+#define FT_READ_BYTE( var ) FT_READ_MACRO( FT_Stream_ReadChar, FT_Byte, var )
+#define FT_READ_CHAR( var ) FT_READ_MACRO( FT_Stream_ReadChar, FT_Char, var )
+#define FT_READ_SHORT( var ) FT_READ_MACRO( FT_Stream_ReadUShort, FT_Short, var )
+#define FT_READ_USHORT( var ) FT_READ_MACRO( FT_Stream_ReadUShort, FT_UShort, var )
+#define FT_READ_OFF3( var ) FT_READ_MACRO( FT_Stream_ReadUOffset, FT_Long, var )
+#define FT_READ_UOFF3( var ) FT_READ_MACRO( FT_Stream_ReadUOffset, FT_ULong, var )
+#define FT_READ_LONG( var ) FT_READ_MACRO( FT_Stream_ReadULong, FT_Long, var )
+#define FT_READ_ULONG( var ) FT_READ_MACRO( FT_Stream_ReadULong, FT_ULong, var )
+
+#define FT_READ_SHORT_LE( var ) FT_READ_MACRO( FT_Stream_ReadUShortLE, FT_Short, var )
+#define FT_READ_USHORT_LE( var ) FT_READ_MACRO( FT_Stream_ReadUShortLE, FT_UShort, var )
+#define FT_READ_LONG_LE( var ) FT_READ_MACRO( FT_Stream_ReadULongLE, FT_Long, var )
+#define FT_READ_ULONG_LE( var ) FT_READ_MACRO( FT_Stream_ReadULongLE, FT_ULong, var )
+
+
+#ifndef FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM
+
+ /* initialize a stream for reading a regular system stream */
+ FT_BASE( FT_Error )
+ FT_Stream_Open( FT_Stream stream,
+ const char* filepathname );
+
+#endif /* FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM */
+
+
+ /* create a new (input) stream from an FT_Open_Args structure */
+ FT_BASE( FT_Error )
+ FT_Stream_New( FT_Library library,
+ const FT_Open_Args* args,
+ FT_Stream *astream );
+
+ /* free a stream */
+ FT_BASE( void )
+ FT_Stream_Free( FT_Stream stream,
+ FT_Int external );
+
+ /* initialize a stream for reading in-memory data */
+ FT_BASE( void )
+ FT_Stream_OpenMemory( FT_Stream stream,
+ const FT_Byte* base,
+ FT_ULong size );
+
+ /* close a stream (does not destroy the stream structure) */
+ FT_BASE( void )
+ FT_Stream_Close( FT_Stream stream );
+
+
+ /* seek within a stream. position is relative to start of stream */
+ FT_BASE( FT_Error )
+ FT_Stream_Seek( FT_Stream stream,
+ FT_ULong pos );
+
+ /* skip bytes in a stream */
+ FT_BASE( FT_Error )
+ FT_Stream_Skip( FT_Stream stream,
+ FT_Long distance );
+
+ /* return current stream position */
+ FT_BASE( FT_Long )
+ FT_Stream_Pos( FT_Stream stream );
+
+ /* read bytes from a stream into a user-allocated buffer, returns an */
+ /* error if not all bytes could be read. */
+ FT_BASE( FT_Error )
+ FT_Stream_Read( FT_Stream stream,
+ FT_Byte* buffer,
+ FT_ULong count );
+
+ /* read bytes from a stream at a given position */
+ FT_BASE( FT_Error )
+ FT_Stream_ReadAt( FT_Stream stream,
+ FT_ULong pos,
+ FT_Byte* buffer,
+ FT_ULong count );
+
+ /* try to read bytes at the end of a stream; return number of bytes */
+ /* really available */
+ FT_BASE( FT_ULong )
+ FT_Stream_TryRead( FT_Stream stream,
+ FT_Byte* buffer,
+ FT_ULong count );
+
+ /* Enter a frame of `count' consecutive bytes in a stream. Returns an */
+ /* error if the frame could not be read/accessed. The caller can use */
+ /* the FT_Stream_Get_XXX functions to retrieve frame data without */
+ /* error checks. */
+ /* */
+ /* You must _always_ call FT_Stream_ExitFrame() once you have entered */
+ /* a stream frame! */
+ /* */
+ FT_BASE( FT_Error )
+ FT_Stream_EnterFrame( FT_Stream stream,
+ FT_ULong count );
+
+ /* exit a stream frame */
+ FT_BASE( void )
+ FT_Stream_ExitFrame( FT_Stream stream );
+
+ /* Extract a stream frame. If the stream is disk-based, a heap block */
+ /* is allocated and the frame bytes are read into it. If the stream */
+ /* is memory-based, this function simply set a pointer to the data. */
+ /* */
+ /* Useful to optimize access to memory-based streams transparently. */
+ /* */
+ /* All extracted frames must be `freed' with a call to the function */
+ /* FT_Stream_ReleaseFrame(). */
+ /* */
+ FT_BASE( FT_Error )
+ FT_Stream_ExtractFrame( FT_Stream stream,
+ FT_ULong count,
+ FT_Byte** pbytes );
+
+ /* release an extract frame (see FT_Stream_ExtractFrame) */
+ FT_BASE( void )
+ FT_Stream_ReleaseFrame( FT_Stream stream,
+ FT_Byte** pbytes );
+
+ /* read a byte from an entered frame */
+ FT_BASE( FT_Char )
+ FT_Stream_GetChar( FT_Stream stream );
+
+ /* read a 16-bit big-endian unsigned integer from an entered frame */
+ FT_BASE( FT_UShort )
+ FT_Stream_GetUShort( FT_Stream stream );
+
+ /* read a 24-bit big-endian unsigned integer from an entered frame */
+ FT_BASE( FT_ULong )
+ FT_Stream_GetUOffset( FT_Stream stream );
+
+ /* read a 32-bit big-endian unsigned integer from an entered frame */
+ FT_BASE( FT_ULong )
+ FT_Stream_GetULong( FT_Stream stream );
+
+ /* read a 16-bit little-endian unsigned integer from an entered frame */
+ FT_BASE( FT_UShort )
+ FT_Stream_GetUShortLE( FT_Stream stream );
+
+ /* read a 32-bit little-endian unsigned integer from an entered frame */
+ FT_BASE( FT_ULong )
+ FT_Stream_GetULongLE( FT_Stream stream );
+
+
+ /* read a byte from a stream */
+ FT_BASE( FT_Char )
+ FT_Stream_ReadChar( FT_Stream stream,
+ FT_Error* error );
+
+ /* read a 16-bit big-endian unsigned integer from a stream */
+ FT_BASE( FT_UShort )
+ FT_Stream_ReadUShort( FT_Stream stream,
+ FT_Error* error );
+
+ /* read a 24-bit big-endian unsigned integer from a stream */
+ FT_BASE( FT_ULong )
+ FT_Stream_ReadUOffset( FT_Stream stream,
+ FT_Error* error );
+
+ /* read a 32-bit big-endian integer from a stream */
+ FT_BASE( FT_ULong )
+ FT_Stream_ReadULong( FT_Stream stream,
+ FT_Error* error );
+
+ /* read a 16-bit little-endian unsigned integer from a stream */
+ FT_BASE( FT_UShort )
+ FT_Stream_ReadUShortLE( FT_Stream stream,
+ FT_Error* error );
+
+ /* read a 32-bit little-endian unsigned integer from a stream */
+ FT_BASE( FT_ULong )
+ FT_Stream_ReadULongLE( FT_Stream stream,
+ FT_Error* error );
+
+ /* Read a structure from a stream. The structure must be described */
+ /* by an array of FT_Frame_Field records. */
+ FT_BASE( FT_Error )
+ FT_Stream_ReadFields( FT_Stream stream,
+ const FT_Frame_Field* fields,
+ void* structure );
+
+
+#define FT_STREAM_POS() \
+ FT_Stream_Pos( stream )
+
+#define FT_STREAM_SEEK( position ) \
+ FT_SET_ERROR( FT_Stream_Seek( stream, \
+ (FT_ULong)(position) ) )
+
+#define FT_STREAM_SKIP( distance ) \
+ FT_SET_ERROR( FT_Stream_Skip( stream, \
+ (FT_Long)(distance) ) )
+
+#define FT_STREAM_READ( buffer, count ) \
+ FT_SET_ERROR( FT_Stream_Read( stream, \
+ (FT_Byte*)(buffer), \
+ (FT_ULong)(count) ) )
+
+#define FT_STREAM_READ_AT( position, buffer, count ) \
+ FT_SET_ERROR( FT_Stream_ReadAt( stream, \
+ (FT_ULong)(position), \
+ (FT_Byte*)buffer, \
+ (FT_ULong)(count) ) )
+
+#define FT_STREAM_READ_FIELDS( fields, object ) \
+ FT_SET_ERROR( FT_Stream_ReadFields( stream, fields, object ) )
+
+
+#define FT_FRAME_ENTER( size ) \
+ FT_SET_ERROR( \
+ FT_DEBUG_INNER( FT_Stream_EnterFrame( stream, \
+ (FT_ULong)(size) ) ) )
+
+#define FT_FRAME_EXIT() \
+ FT_DEBUG_INNER( FT_Stream_ExitFrame( stream ) )
+
+#define FT_FRAME_EXTRACT( size, bytes ) \
+ FT_SET_ERROR( \
+ FT_DEBUG_INNER( FT_Stream_ExtractFrame( stream, \
+ (FT_ULong)(size), \
+ (FT_Byte**)&(bytes) ) ) )
+
+#define FT_FRAME_RELEASE( bytes ) \
+ FT_DEBUG_INNER( FT_Stream_ReleaseFrame( stream, \
+ (FT_Byte**)&(bytes) ) )
+
+
+FT_END_HEADER
+
+#endif /* __FTSTREAM_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/fttrace.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/fttrace.h
new file mode 100644
index 0000000000..a9d98b60aa
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/fttrace.h
@@ -0,0 +1,152 @@
+/***************************************************************************/
+/* */
+/* fttrace.h */
+/* */
+/* Tracing handling (specification only). */
+/* */
+/* Copyright 2002, 2004-2007, 2009, 2011-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /* definitions of trace levels for FreeType 2 */
+
+ /* the first level must always be `trace_any' */
+FT_TRACE_DEF( any )
+
+ /* base components */
+FT_TRACE_DEF( calc ) /* calculations (ftcalc.c) */
+FT_TRACE_DEF( memory ) /* memory manager (ftobjs.c) */
+FT_TRACE_DEF( stream ) /* stream manager (ftstream.c) */
+FT_TRACE_DEF( io ) /* i/o interface (ftsystem.c) */
+FT_TRACE_DEF( list ) /* list management (ftlist.c) */
+FT_TRACE_DEF( init ) /* initialization (ftinit.c) */
+FT_TRACE_DEF( objs ) /* base objects (ftobjs.c) */
+FT_TRACE_DEF( outline ) /* outline management (ftoutln.c) */
+FT_TRACE_DEF( glyph ) /* glyph management (ftglyph.c) */
+FT_TRACE_DEF( gloader ) /* glyph loader (ftgloadr.c) */
+
+FT_TRACE_DEF( raster ) /* monochrome rasterizer (ftraster.c) */
+FT_TRACE_DEF( smooth ) /* anti-aliasing raster (ftgrays.c) */
+FT_TRACE_DEF( mm ) /* MM interface (ftmm.c) */
+FT_TRACE_DEF( raccess ) /* resource fork accessor (ftrfork.c) */
+FT_TRACE_DEF( synth ) /* bold/slant synthesizer (ftsynth.c) */
+FT_TRACE_DEF( bitmap ) /* bitmap checksum (ftobjs.c) */
+
+ /* Cache sub-system */
+FT_TRACE_DEF( cache ) /* cache sub-system (ftcache.c, etc.) */
+
+ /* SFNT driver components */
+FT_TRACE_DEF( sfdriver ) /* SFNT font driver (sfdriver.c) */
+FT_TRACE_DEF( sfobjs ) /* SFNT object handler (sfobjs.c) */
+FT_TRACE_DEF( ttcmap ) /* charmap handler (ttcmap.c) */
+FT_TRACE_DEF( ttkern ) /* kerning handler (ttkern.c) */
+FT_TRACE_DEF( ttload ) /* basic TrueType tables (ttload.c) */
+FT_TRACE_DEF( ttmtx ) /* metrics-related tables (ttmtx.c) */
+FT_TRACE_DEF( ttpost ) /* PS table processing (ttpost.c) */
+FT_TRACE_DEF( ttsbit ) /* TrueType sbit handling (ttsbit.c) */
+FT_TRACE_DEF( ttbdf ) /* TrueType embedded BDF (ttbdf.c) */
+
+ /* TrueType driver components */
+FT_TRACE_DEF( ttdriver ) /* TT font driver (ttdriver.c) */
+FT_TRACE_DEF( ttgload ) /* TT glyph loader (ttgload.c) */
+FT_TRACE_DEF( ttinterp ) /* bytecode interpreter (ttinterp.c) */
+FT_TRACE_DEF( ttobjs ) /* TT objects manager (ttobjs.c) */
+FT_TRACE_DEF( ttpload ) /* TT data/program loader (ttpload.c) */
+FT_TRACE_DEF( ttgxvar ) /* TrueType GX var handler (ttgxvar.c) */
+
+ /* Type 1 driver components */
+FT_TRACE_DEF( t1afm )
+FT_TRACE_DEF( t1driver )
+FT_TRACE_DEF( t1gload )
+FT_TRACE_DEF( t1hint )
+FT_TRACE_DEF( t1load )
+FT_TRACE_DEF( t1objs )
+FT_TRACE_DEF( t1parse )
+
+ /* PostScript helper module `psaux' */
+FT_TRACE_DEF( t1decode )
+FT_TRACE_DEF( psobjs )
+FT_TRACE_DEF( psconv )
+
+ /* PostScript hinting module `pshinter' */
+FT_TRACE_DEF( pshrec )
+FT_TRACE_DEF( pshalgo1 )
+FT_TRACE_DEF( pshalgo2 )
+
+ /* Type 2 driver components */
+FT_TRACE_DEF( cffdriver )
+FT_TRACE_DEF( cffgload )
+FT_TRACE_DEF( cffload )
+FT_TRACE_DEF( cffobjs )
+FT_TRACE_DEF( cffparse )
+
+FT_TRACE_DEF( cf2blues )
+FT_TRACE_DEF( cf2hints )
+FT_TRACE_DEF( cf2interp )
+
+ /* Type 42 driver component */
+FT_TRACE_DEF( t42 )
+
+ /* CID driver components */
+FT_TRACE_DEF( cidafm )
+FT_TRACE_DEF( ciddriver )
+FT_TRACE_DEF( cidgload )
+FT_TRACE_DEF( cidload )
+FT_TRACE_DEF( cidobjs )
+FT_TRACE_DEF( cidparse )
+
+ /* Windows font component */
+FT_TRACE_DEF( winfnt )
+
+ /* PCF font components */
+FT_TRACE_DEF( pcfdriver )
+FT_TRACE_DEF( pcfread )
+
+ /* BDF font components */
+FT_TRACE_DEF( bdfdriver )
+FT_TRACE_DEF( bdflib )
+
+ /* PFR font component */
+FT_TRACE_DEF( pfr )
+
+ /* OpenType validation components */
+FT_TRACE_DEF( otvmodule )
+FT_TRACE_DEF( otvcommon )
+FT_TRACE_DEF( otvbase )
+FT_TRACE_DEF( otvgdef )
+FT_TRACE_DEF( otvgpos )
+FT_TRACE_DEF( otvgsub )
+FT_TRACE_DEF( otvjstf )
+FT_TRACE_DEF( otvmath )
+
+ /* TrueTypeGX/AAT validation components */
+FT_TRACE_DEF( gxvmodule )
+FT_TRACE_DEF( gxvcommon )
+FT_TRACE_DEF( gxvfeat )
+FT_TRACE_DEF( gxvmort )
+FT_TRACE_DEF( gxvmorx )
+FT_TRACE_DEF( gxvbsln )
+FT_TRACE_DEF( gxvjust )
+FT_TRACE_DEF( gxvkern )
+FT_TRACE_DEF( gxvopbd )
+FT_TRACE_DEF( gxvtrak )
+FT_TRACE_DEF( gxvprop )
+FT_TRACE_DEF( gxvlcar )
+
+ /* autofit components */
+FT_TRACE_DEF( afmodule )
+FT_TRACE_DEF( afhints )
+FT_TRACE_DEF( afcjk )
+FT_TRACE_DEF( aflatin )
+FT_TRACE_DEF( aflatin2 )
+FT_TRACE_DEF( afwarp )
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftvalid.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftvalid.h
new file mode 100644
index 0000000000..444261317d
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/ftvalid.h
@@ -0,0 +1,161 @@
+/***************************************************************************/
+/* */
+/* ftvalid.h */
+/* */
+/* FreeType validation support (specification). */
+/* */
+/* Copyright 2004, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTVALID_H__
+#define __FTVALID_H__
+
+#include "../../ft2build.h"
+#include "../config/ftstdlib.h" /* for ft_setjmp and ft_longjmp */
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** ****/
+ /**** V A L I D A T I O N ****/
+ /**** ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /* handle to a validation object */
+ typedef struct FT_ValidatorRec_ volatile* FT_Validator;
+
+
+ /*************************************************************************/
+ /* */
+ /* There are three distinct validation levels defined here: */
+ /* */
+ /* FT_VALIDATE_DEFAULT :: */
+ /* A table that passes this validation level can be used reliably by */
+ /* FreeType. It generally means that all offsets have been checked to */
+ /* prevent out-of-bound reads, that array counts are correct, etc. */
+ /* */
+ /* FT_VALIDATE_TIGHT :: */
+ /* A table that passes this validation level can be used reliably and */
+ /* doesn't contain invalid data. For example, a charmap table that */
+ /* returns invalid glyph indices will not pass, even though it can */
+ /* be used with FreeType in default mode (the library will simply */
+ /* return an error later when trying to load the glyph). */
+ /* */
+ /* It also checks that fields which must be a multiple of 2, 4, or 8, */
+ /* don't have incorrect values, etc. */
+ /* */
+ /* FT_VALIDATE_PARANOID :: */
+ /* Only for font debugging. Checks that a table follows the */
+ /* specification by 100%. Very few fonts will be able to pass this */
+ /* level anyway but it can be useful for certain tools like font */
+ /* editors/converters. */
+ /* */
+ typedef enum FT_ValidationLevel_
+ {
+ FT_VALIDATE_DEFAULT = 0,
+ FT_VALIDATE_TIGHT,
+ FT_VALIDATE_PARANOID
+
+ } FT_ValidationLevel;
+
+
+#if defined( _MSC_VER ) /* Visual C++ (and Intel C++) */
+ /* We disable the warning `structure was padded due to */
+ /* __declspec(align())' in order to compile cleanly with */
+ /* the maximum level of warnings. */
+#pragma warning( push )
+#pragma warning( disable : 4324 )
+#endif /* _MSC_VER */
+
+ /* validator structure */
+ typedef struct FT_ValidatorRec_
+ {
+ const FT_Byte* base; /* address of table in memory */
+ const FT_Byte* limit; /* `base' + sizeof(table) in memory */
+ FT_ValidationLevel level; /* validation level */
+ FT_Error error; /* error returned. 0 means success */
+
+ ft_jmp_buf jump_buffer; /* used for exception handling */
+
+ } FT_ValidatorRec;
+
+#if defined( _MSC_VER )
+#pragma warning( pop )
+#endif
+
+#define FT_VALIDATOR( x ) ( (FT_Validator)( x ) )
+
+
+ FT_BASE( void )
+ ft_validator_init( FT_Validator valid,
+ const FT_Byte* base,
+ const FT_Byte* limit,
+ FT_ValidationLevel level );
+
+ /* Do not use this. It's broken and will cause your validator to crash */
+ /* if you run it on an invalid font. */
+ FT_BASE( FT_Int )
+ ft_validator_run( FT_Validator valid );
+
+ /* Sets the error field in a validator, then calls `longjmp' to return */
+ /* to high-level caller. Using `setjmp/longjmp' avoids many stupid */
+ /* error checks within the validation routines. */
+ /* */
+ FT_BASE( void )
+ ft_validator_error( FT_Validator valid,
+ FT_Error error );
+
+
+ /* Calls ft_validate_error. Assumes that the `valid' local variable */
+ /* holds a pointer to the current validator object. */
+ /* */
+ /* Use preprocessor prescan to pass FT_ERR_PREFIX. */
+ /* */
+#define FT_INVALID( _prefix, _error ) FT_INVALID_( _prefix, _error )
+#define FT_INVALID_( _prefix, _error ) \
+ ft_validator_error( valid, _prefix ## _error )
+
+ /* called when a broken table is detected */
+#define FT_INVALID_TOO_SHORT \
+ FT_INVALID( FT_ERR_PREFIX, Invalid_Table )
+
+ /* called when an invalid offset is detected */
+#define FT_INVALID_OFFSET \
+ FT_INVALID( FT_ERR_PREFIX, Invalid_Offset )
+
+ /* called when an invalid format/value is detected */
+#define FT_INVALID_FORMAT \
+ FT_INVALID( FT_ERR_PREFIX, Invalid_Table )
+
+ /* called when an invalid glyph index is detected */
+#define FT_INVALID_GLYPH_ID \
+ FT_INVALID( FT_ERR_PREFIX, Invalid_Glyph_Index )
+
+ /* called when an invalid field value is detected */
+#define FT_INVALID_DATA \
+ FT_INVALID( FT_ERR_PREFIX, Invalid_Table )
+
+
+FT_END_HEADER
+
+#endif /* __FTVALID_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/internal.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/internal.h
new file mode 100644
index 0000000000..262afcfa8a
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/internal.h
@@ -0,0 +1,63 @@
+/***************************************************************************/
+/* */
+/* internal.h */
+/* */
+/* Internal header files (specification only). */
+/* */
+/* Copyright 1996-2004, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* This file is automatically included by `ft2build.h'. */
+ /* Do not include it manually! */
+ /* */
+ /*************************************************************************/
+
+
+#define FT_INTERNAL_OBJECTS_H <freetype/internal/ftobjs.h>
+#define FT_INTERNAL_PIC_H <freetype/internal/ftpic.h>
+#define FT_INTERNAL_STREAM_H <freetype/internal/ftstream.h>
+#define FT_INTERNAL_MEMORY_H <freetype/internal/ftmemory.h>
+#define FT_INTERNAL_DEBUG_H <freetype/internal/ftdebug.h>
+#define FT_INTERNAL_CALC_H <freetype/internal/ftcalc.h>
+#define FT_INTERNAL_DRIVER_H <freetype/internal/ftdriver.h>
+#define FT_INTERNAL_TRACE_H <freetype/internal/fttrace.h>
+#define FT_INTERNAL_GLYPH_LOADER_H <freetype/internal/ftgloadr.h>
+#define FT_INTERNAL_SFNT_H <freetype/internal/sfnt.h>
+#define FT_INTERNAL_SERVICE_H <freetype/internal/ftserv.h>
+#define FT_INTERNAL_RFORK_H <freetype/internal/ftrfork.h>
+#define FT_INTERNAL_VALIDATE_H <freetype/internal/ftvalid.h>
+
+#define FT_INTERNAL_TRUETYPE_TYPES_H <freetype/internal/tttypes.h>
+#define FT_INTERNAL_TYPE1_TYPES_H <freetype/internal/t1types.h>
+
+#define FT_INTERNAL_POSTSCRIPT_AUX_H <freetype/internal/psaux.h>
+#define FT_INTERNAL_POSTSCRIPT_HINTS_H <freetype/internal/pshints.h>
+#define FT_INTERNAL_POSTSCRIPT_GLOBALS_H <freetype/internal/psglobal.h>
+
+#define FT_INTERNAL_AUTOHINT_H <freetype/internal/autohint.h>
+
+
+#if defined( _MSC_VER ) /* Visual C++ (and Intel C++) */
+
+ /* We disable the warning `conditional expression is constant' here */
+ /* in order to compile cleanly with the maximum level of warnings. */
+ /* In particular, the warning complains about stuff like `while(0)' */
+ /* which is very useful in macro definitions. There is no benefit */
+ /* in having it enabled. */
+#pragma warning( disable : 4127 )
+
+#endif /* _MSC_VER */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/psaux.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/psaux.h
new file mode 100644
index 0000000000..3128ea4cb7
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/psaux.h
@@ -0,0 +1,877 @@
+/***************************************************************************/
+/* */
+/* psaux.h */
+/* */
+/* Auxiliary functions and data structures related to PostScript fonts */
+/* (specification). */
+/* */
+/* Copyright 1996-2004, 2006, 2008, 2009, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __PSAUX_H__
+#define __PSAUX_H__
+
+
+#include "../../ft2build.h"
+#include "ftobjs.h"
+#include "t1types.h"
+#include "services/svpscmap.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** T1_TABLE *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ typedef struct PS_TableRec_* PS_Table;
+ typedef const struct PS_Table_FuncsRec_* PS_Table_Funcs;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* PS_Table_FuncsRec */
+ /* */
+ /* <Description> */
+ /* A set of function pointers to manage PS_Table objects. */
+ /* */
+ /* <Fields> */
+ /* table_init :: Used to initialize a table. */
+ /* */
+ /* table_done :: Finalizes resp. destroy a given table. */
+ /* */
+ /* table_add :: Adds a new object to a table. */
+ /* */
+ /* table_release :: Releases table data, then finalizes it. */
+ /* */
+ typedef struct PS_Table_FuncsRec_
+ {
+ FT_Error
+ (*init)( PS_Table table,
+ FT_Int count,
+ FT_Memory memory );
+
+ void
+ (*done)( PS_Table table );
+
+ FT_Error
+ (*add)( PS_Table table,
+ FT_Int idx,
+ void* object,
+ FT_PtrDist length );
+
+ void
+ (*release)( PS_Table table );
+
+ } PS_Table_FuncsRec;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* PS_TableRec */
+ /* */
+ /* <Description> */
+ /* A PS_Table is a simple object used to store an array of objects in */
+ /* a single memory block. */
+ /* */
+ /* <Fields> */
+ /* block :: The address in memory of the growheap's block. This */
+ /* can change between two object adds, due to */
+ /* reallocation. */
+ /* */
+ /* cursor :: The current top of the grow heap within its block. */
+ /* */
+ /* capacity :: The current size of the heap block. Increments by */
+ /* 1kByte chunks. */
+ /* */
+ /* init :: Set to 0xDEADBEEF if `elements' and `lengths' have */
+ /* been allocated. */
+ /* */
+ /* max_elems :: The maximum number of elements in table. */
+ /* */
+ /* num_elems :: The current number of elements in table. */
+ /* */
+ /* elements :: A table of element addresses within the block. */
+ /* */
+ /* lengths :: A table of element sizes within the block. */
+ /* */
+ /* memory :: The object used for memory operations */
+ /* (alloc/realloc). */
+ /* */
+ /* funcs :: A table of method pointers for this object. */
+ /* */
+ typedef struct PS_TableRec_
+ {
+ FT_Byte* block; /* current memory block */
+ FT_Offset cursor; /* current cursor in memory block */
+ FT_Offset capacity; /* current size of memory block */
+ FT_Long init;
+
+ FT_Int max_elems;
+ FT_Int num_elems;
+ FT_Byte** elements; /* addresses of table elements */
+ FT_PtrDist* lengths; /* lengths of table elements */
+
+ FT_Memory memory;
+ PS_Table_FuncsRec funcs;
+
+ } PS_TableRec;
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** T1 FIELDS & TOKENS *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ typedef struct PS_ParserRec_* PS_Parser;
+
+ typedef struct T1_TokenRec_* T1_Token;
+
+ typedef struct T1_FieldRec_* T1_Field;
+
+
+ /* simple enumeration type used to identify token types */
+ typedef enum T1_TokenType_
+ {
+ T1_TOKEN_TYPE_NONE = 0,
+ T1_TOKEN_TYPE_ANY,
+ T1_TOKEN_TYPE_STRING,
+ T1_TOKEN_TYPE_ARRAY,
+ T1_TOKEN_TYPE_KEY, /* aka `name' */
+
+ /* do not remove */
+ T1_TOKEN_TYPE_MAX
+
+ } T1_TokenType;
+
+
+ /* a simple structure used to identify tokens */
+ typedef struct T1_TokenRec_
+ {
+ FT_Byte* start; /* first character of token in input stream */
+ FT_Byte* limit; /* first character after the token */
+ T1_TokenType type; /* type of token */
+
+ } T1_TokenRec;
+
+
+ /* enumeration type used to identify object fields */
+ typedef enum T1_FieldType_
+ {
+ T1_FIELD_TYPE_NONE = 0,
+ T1_FIELD_TYPE_BOOL,
+ T1_FIELD_TYPE_INTEGER,
+ T1_FIELD_TYPE_FIXED,
+ T1_FIELD_TYPE_FIXED_1000,
+ T1_FIELD_TYPE_STRING,
+ T1_FIELD_TYPE_KEY,
+ T1_FIELD_TYPE_BBOX,
+ T1_FIELD_TYPE_MM_BBOX,
+ T1_FIELD_TYPE_INTEGER_ARRAY,
+ T1_FIELD_TYPE_FIXED_ARRAY,
+ T1_FIELD_TYPE_CALLBACK,
+
+ /* do not remove */
+ T1_FIELD_TYPE_MAX
+
+ } T1_FieldType;
+
+
+ typedef enum T1_FieldLocation_
+ {
+ T1_FIELD_LOCATION_CID_INFO,
+ T1_FIELD_LOCATION_FONT_DICT,
+ T1_FIELD_LOCATION_FONT_EXTRA,
+ T1_FIELD_LOCATION_FONT_INFO,
+ T1_FIELD_LOCATION_PRIVATE,
+ T1_FIELD_LOCATION_BBOX,
+ T1_FIELD_LOCATION_LOADER,
+ T1_FIELD_LOCATION_FACE,
+ T1_FIELD_LOCATION_BLEND,
+
+ /* do not remove */
+ T1_FIELD_LOCATION_MAX
+
+ } T1_FieldLocation;
+
+
+ typedef void
+ (*T1_Field_ParseFunc)( FT_Face face,
+ FT_Pointer parser );
+
+
+ /* structure type used to model object fields */
+ typedef struct T1_FieldRec_
+ {
+ const char* ident; /* field identifier */
+ T1_FieldLocation location;
+ T1_FieldType type; /* type of field */
+ T1_Field_ParseFunc reader;
+ FT_UInt offset; /* offset of field in object */
+ FT_Byte size; /* size of field in bytes */
+ FT_UInt array_max; /* maximum number of elements for */
+ /* array */
+ FT_UInt count_offset; /* offset of element count for */
+ /* arrays; must not be zero if in */
+ /* use -- in other words, a */
+ /* `num_FOO' element must not */
+ /* start the used structure if we */
+ /* parse a `FOO' array */
+ FT_UInt dict; /* where we expect it */
+ } T1_FieldRec;
+
+#define T1_FIELD_DICT_FONTDICT ( 1 << 0 ) /* also FontInfo and FDArray */
+#define T1_FIELD_DICT_PRIVATE ( 1 << 1 )
+
+
+
+#define T1_NEW_SIMPLE_FIELD( _ident, _type, _fname, _dict ) \
+ { \
+ _ident, T1CODE, _type, \
+ 0, \
+ FT_FIELD_OFFSET( _fname ), \
+ FT_FIELD_SIZE( _fname ), \
+ 0, 0, \
+ _dict \
+ },
+
+#define T1_NEW_CALLBACK_FIELD( _ident, _reader, _dict ) \
+ { \
+ _ident, T1CODE, T1_FIELD_TYPE_CALLBACK, \
+ (T1_Field_ParseFunc)_reader, \
+ 0, 0, \
+ 0, 0, \
+ _dict \
+ },
+
+#define T1_NEW_TABLE_FIELD( _ident, _type, _fname, _max, _dict ) \
+ { \
+ _ident, T1CODE, _type, \
+ 0, \
+ FT_FIELD_OFFSET( _fname ), \
+ FT_FIELD_SIZE_DELTA( _fname ), \
+ _max, \
+ FT_FIELD_OFFSET( num_ ## _fname ), \
+ _dict \
+ },
+
+#define T1_NEW_TABLE_FIELD2( _ident, _type, _fname, _max, _dict ) \
+ { \
+ _ident, T1CODE, _type, \
+ 0, \
+ FT_FIELD_OFFSET( _fname ), \
+ FT_FIELD_SIZE_DELTA( _fname ), \
+ _max, 0, \
+ _dict \
+ },
+
+
+#define T1_FIELD_BOOL( _ident, _fname, _dict ) \
+ T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_BOOL, _fname, _dict )
+
+#define T1_FIELD_NUM( _ident, _fname, _dict ) \
+ T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_INTEGER, _fname, _dict )
+
+#define T1_FIELD_FIXED( _ident, _fname, _dict ) \
+ T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_FIXED, _fname, _dict )
+
+#define T1_FIELD_FIXED_1000( _ident, _fname, _dict ) \
+ T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_FIXED_1000, _fname, \
+ _dict )
+
+#define T1_FIELD_STRING( _ident, _fname, _dict ) \
+ T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_STRING, _fname, _dict )
+
+#define T1_FIELD_KEY( _ident, _fname, _dict ) \
+ T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_KEY, _fname, _dict )
+
+#define T1_FIELD_BBOX( _ident, _fname, _dict ) \
+ T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_BBOX, _fname, _dict )
+
+
+#define T1_FIELD_NUM_TABLE( _ident, _fname, _fmax, _dict ) \
+ T1_NEW_TABLE_FIELD( _ident, T1_FIELD_TYPE_INTEGER_ARRAY, \
+ _fname, _fmax, _dict )
+
+#define T1_FIELD_FIXED_TABLE( _ident, _fname, _fmax, _dict ) \
+ T1_NEW_TABLE_FIELD( _ident, T1_FIELD_TYPE_FIXED_ARRAY, \
+ _fname, _fmax, _dict )
+
+#define T1_FIELD_NUM_TABLE2( _ident, _fname, _fmax, _dict ) \
+ T1_NEW_TABLE_FIELD2( _ident, T1_FIELD_TYPE_INTEGER_ARRAY, \
+ _fname, _fmax, _dict )
+
+#define T1_FIELD_FIXED_TABLE2( _ident, _fname, _fmax, _dict ) \
+ T1_NEW_TABLE_FIELD2( _ident, T1_FIELD_TYPE_FIXED_ARRAY, \
+ _fname, _fmax, _dict )
+
+#define T1_FIELD_CALLBACK( _ident, _name, _dict ) \
+ T1_NEW_CALLBACK_FIELD( _ident, _name, _dict )
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** T1 PARSER *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ typedef const struct PS_Parser_FuncsRec_* PS_Parser_Funcs;
+
+ typedef struct PS_Parser_FuncsRec_
+ {
+ void
+ (*init)( PS_Parser parser,
+ FT_Byte* base,
+ FT_Byte* limit,
+ FT_Memory memory );
+
+ void
+ (*done)( PS_Parser parser );
+
+ void
+ (*skip_spaces)( PS_Parser parser );
+ void
+ (*skip_PS_token)( PS_Parser parser );
+
+ FT_Long
+ (*to_int)( PS_Parser parser );
+ FT_Fixed
+ (*to_fixed)( PS_Parser parser,
+ FT_Int power_ten );
+
+ FT_Error
+ (*to_bytes)( PS_Parser parser,
+ FT_Byte* bytes,
+ FT_Offset max_bytes,
+ FT_Long* pnum_bytes,
+ FT_Bool delimiters );
+
+ FT_Int
+ (*to_coord_array)( PS_Parser parser,
+ FT_Int max_coords,
+ FT_Short* coords );
+ FT_Int
+ (*to_fixed_array)( PS_Parser parser,
+ FT_Int max_values,
+ FT_Fixed* values,
+ FT_Int power_ten );
+
+ void
+ (*to_token)( PS_Parser parser,
+ T1_Token token );
+ void
+ (*to_token_array)( PS_Parser parser,
+ T1_Token tokens,
+ FT_UInt max_tokens,
+ FT_Int* pnum_tokens );
+
+ FT_Error
+ (*load_field)( PS_Parser parser,
+ const T1_Field field,
+ void** objects,
+ FT_UInt max_objects,
+ FT_ULong* pflags );
+
+ FT_Error
+ (*load_field_table)( PS_Parser parser,
+ const T1_Field field,
+ void** objects,
+ FT_UInt max_objects,
+ FT_ULong* pflags );
+
+ } PS_Parser_FuncsRec;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* PS_ParserRec */
+ /* */
+ /* <Description> */
+ /* A PS_Parser is an object used to parse a Type 1 font very quickly. */
+ /* */
+ /* <Fields> */
+ /* cursor :: The current position in the text. */
+ /* */
+ /* base :: Start of the processed text. */
+ /* */
+ /* limit :: End of the processed text. */
+ /* */
+ /* error :: The last error returned. */
+ /* */
+ /* memory :: The object used for memory operations (alloc/realloc). */
+ /* */
+ /* funcs :: A table of functions for the parser. */
+ /* */
+ typedef struct PS_ParserRec_
+ {
+ FT_Byte* cursor;
+ FT_Byte* base;
+ FT_Byte* limit;
+ FT_Error error;
+ FT_Memory memory;
+
+ PS_Parser_FuncsRec funcs;
+
+ } PS_ParserRec;
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** T1 BUILDER *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ typedef struct T1_BuilderRec_* T1_Builder;
+
+
+ typedef FT_Error
+ (*T1_Builder_Check_Points_Func)( T1_Builder builder,
+ FT_Int count );
+
+ typedef void
+ (*T1_Builder_Add_Point_Func)( T1_Builder builder,
+ FT_Pos x,
+ FT_Pos y,
+ FT_Byte flag );
+
+ typedef FT_Error
+ (*T1_Builder_Add_Point1_Func)( T1_Builder builder,
+ FT_Pos x,
+ FT_Pos y );
+
+ typedef FT_Error
+ (*T1_Builder_Add_Contour_Func)( T1_Builder builder );
+
+ typedef FT_Error
+ (*T1_Builder_Start_Point_Func)( T1_Builder builder,
+ FT_Pos x,
+ FT_Pos y );
+
+ typedef void
+ (*T1_Builder_Close_Contour_Func)( T1_Builder builder );
+
+
+ typedef const struct T1_Builder_FuncsRec_* T1_Builder_Funcs;
+
+ typedef struct T1_Builder_FuncsRec_
+ {
+ void
+ (*init)( T1_Builder builder,
+ FT_Face face,
+ FT_Size size,
+ FT_GlyphSlot slot,
+ FT_Bool hinting );
+
+ void
+ (*done)( T1_Builder builder );
+
+ T1_Builder_Check_Points_Func check_points;
+ T1_Builder_Add_Point_Func add_point;
+ T1_Builder_Add_Point1_Func add_point1;
+ T1_Builder_Add_Contour_Func add_contour;
+ T1_Builder_Start_Point_Func start_point;
+ T1_Builder_Close_Contour_Func close_contour;
+
+ } T1_Builder_FuncsRec;
+
+
+ /* an enumeration type to handle charstring parsing states */
+ typedef enum T1_ParseState_
+ {
+ T1_Parse_Start,
+ T1_Parse_Have_Width,
+ T1_Parse_Have_Moveto,
+ T1_Parse_Have_Path
+
+ } T1_ParseState;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Structure> */
+ /* T1_BuilderRec */
+ /* */
+ /* <Description> */
+ /* A structure used during glyph loading to store its outline. */
+ /* */
+ /* <Fields> */
+ /* memory :: The current memory object. */
+ /* */
+ /* face :: The current face object. */
+ /* */
+ /* glyph :: The current glyph slot. */
+ /* */
+ /* loader :: XXX */
+ /* */
+ /* base :: The base glyph outline. */
+ /* */
+ /* current :: The current glyph outline. */
+ /* */
+ /* max_points :: maximum points in builder outline */
+ /* */
+ /* max_contours :: Maximum number of contours in builder outline. */
+ /* */
+ /* pos_x :: The horizontal translation (if composite glyph). */
+ /* */
+ /* pos_y :: The vertical translation (if composite glyph). */
+ /* */
+ /* left_bearing :: The left side bearing point. */
+ /* */
+ /* advance :: The horizontal advance vector. */
+ /* */
+ /* bbox :: Unused. */
+ /* */
+ /* parse_state :: An enumeration which controls the charstring */
+ /* parsing state. */
+ /* */
+ /* load_points :: If this flag is not set, no points are loaded. */
+ /* */
+ /* no_recurse :: Set but not used. */
+ /* */
+ /* metrics_only :: A boolean indicating that we only want to compute */
+ /* the metrics of a given glyph, not load all of its */
+ /* points. */
+ /* */
+ /* funcs :: An array of function pointers for the builder. */
+ /* */
+ typedef struct T1_BuilderRec_
+ {
+ FT_Memory memory;
+ FT_Face face;
+ FT_GlyphSlot glyph;
+ FT_GlyphLoader loader;
+ FT_Outline* base;
+ FT_Outline* current;
+
+ FT_Pos pos_x;
+ FT_Pos pos_y;
+
+ FT_Vector left_bearing;
+ FT_Vector advance;
+
+ FT_BBox bbox; /* bounding box */
+ T1_ParseState parse_state;
+ FT_Bool load_points;
+ FT_Bool no_recurse;
+
+ FT_Bool metrics_only;
+
+ void* hints_funcs; /* hinter-specific */
+ void* hints_globals; /* hinter-specific */
+
+ T1_Builder_FuncsRec funcs;
+
+ } T1_BuilderRec;
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** T1 DECODER *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+#if 0
+
+ /*************************************************************************/
+ /* */
+ /* T1_MAX_SUBRS_CALLS details the maximum number of nested sub-routine */
+ /* calls during glyph loading. */
+ /* */
+#define T1_MAX_SUBRS_CALLS 8
+
+
+ /*************************************************************************/
+ /* */
+ /* T1_MAX_CHARSTRING_OPERANDS is the charstring stack's capacity. A */
+ /* minimum of 16 is required. */
+ /* */
+#define T1_MAX_CHARSTRINGS_OPERANDS 32
+
+#endif /* 0 */
+
+
+ typedef struct T1_Decoder_ZoneRec_
+ {
+ FT_Byte* cursor;
+ FT_Byte* base;
+ FT_Byte* limit;
+
+ } T1_Decoder_ZoneRec, *T1_Decoder_Zone;
+
+
+ typedef struct T1_DecoderRec_* T1_Decoder;
+ typedef const struct T1_Decoder_FuncsRec_* T1_Decoder_Funcs;
+
+
+ typedef FT_Error
+ (*T1_Decoder_Callback)( T1_Decoder decoder,
+ FT_UInt glyph_index );
+
+
+ typedef struct T1_Decoder_FuncsRec_
+ {
+ FT_Error
+ (*init)( T1_Decoder decoder,
+ FT_Face face,
+ FT_Size size,
+ FT_GlyphSlot slot,
+ FT_Byte** glyph_names,
+ PS_Blend blend,
+ FT_Bool hinting,
+ FT_Render_Mode hint_mode,
+ T1_Decoder_Callback callback );
+
+ void
+ (*done)( T1_Decoder decoder );
+
+ FT_Error
+ (*parse_charstrings)( T1_Decoder decoder,
+ FT_Byte* base,
+ FT_UInt len );
+
+ } T1_Decoder_FuncsRec;
+
+
+ typedef struct T1_DecoderRec_
+ {
+ T1_BuilderRec builder;
+
+ FT_Long stack[T1_MAX_CHARSTRINGS_OPERANDS];
+ FT_Long* top;
+
+ T1_Decoder_ZoneRec zones[T1_MAX_SUBRS_CALLS + 1];
+ T1_Decoder_Zone zone;
+
+ FT_Service_PsCMaps psnames; /* for seac */
+ FT_UInt num_glyphs;
+ FT_Byte** glyph_names;
+
+ FT_Int lenIV; /* internal for sub routine calls */
+ FT_UInt num_subrs;
+ FT_Byte** subrs;
+ FT_PtrDist* subrs_len; /* array of subrs length (optional) */
+
+ FT_Matrix font_matrix;
+ FT_Vector font_offset;
+
+ FT_Int flex_state;
+ FT_Int num_flex_vectors;
+ FT_Vector flex_vectors[7];
+
+ PS_Blend blend; /* for multiple master support */
+
+ FT_Render_Mode hint_mode;
+
+ T1_Decoder_Callback parse_callback;
+ T1_Decoder_FuncsRec funcs;
+
+ FT_Long* buildchar;
+ FT_UInt len_buildchar;
+
+ FT_Bool seac;
+
+ } T1_DecoderRec;
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** AFM PARSER *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ typedef struct AFM_ParserRec_* AFM_Parser;
+
+ typedef struct AFM_Parser_FuncsRec_
+ {
+ FT_Error
+ (*init)( AFM_Parser parser,
+ FT_Memory memory,
+ FT_Byte* base,
+ FT_Byte* limit );
+
+ void
+ (*done)( AFM_Parser parser );
+
+ FT_Error
+ (*parse)( AFM_Parser parser );
+
+ } AFM_Parser_FuncsRec;
+
+
+ typedef struct AFM_StreamRec_* AFM_Stream;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* AFM_ParserRec */
+ /* */
+ /* <Description> */
+ /* An AFM_Parser is a parser for the AFM files. */
+ /* */
+ /* <Fields> */
+ /* memory :: The object used for memory operations (alloc and */
+ /* realloc). */
+ /* */
+ /* stream :: This is an opaque object. */
+ /* */
+ /* FontInfo :: The result will be stored here. */
+ /* */
+ /* get_index :: A user provided function to get a glyph index by its */
+ /* name. */
+ /* */
+ typedef struct AFM_ParserRec_
+ {
+ FT_Memory memory;
+ AFM_Stream stream;
+
+ AFM_FontInfo FontInfo;
+
+ FT_Int
+ (*get_index)( const char* name,
+ FT_Offset len,
+ void* user_data );
+
+ void* user_data;
+
+ } AFM_ParserRec;
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** TYPE1 CHARMAPS *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ typedef const struct T1_CMap_ClassesRec_* T1_CMap_Classes;
+
+ typedef struct T1_CMap_ClassesRec_
+ {
+ FT_CMap_Class standard;
+ FT_CMap_Class expert;
+ FT_CMap_Class custom;
+ FT_CMap_Class unicode;
+
+ } T1_CMap_ClassesRec;
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** PSAux Module Interface *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ typedef struct PSAux_ServiceRec_
+ {
+ /* don't use `PS_Table_Funcs' and friends to avoid compiler warnings */
+ const PS_Table_FuncsRec* ps_table_funcs;
+ const PS_Parser_FuncsRec* ps_parser_funcs;
+ const T1_Builder_FuncsRec* t1_builder_funcs;
+ const T1_Decoder_FuncsRec* t1_decoder_funcs;
+
+ void
+ (*t1_decrypt)( FT_Byte* buffer,
+ FT_Offset length,
+ FT_UShort seed );
+
+ T1_CMap_Classes t1_cmap_classes;
+
+ /* fields after this comment line were added after version 2.1.10 */
+ const AFM_Parser_FuncsRec* afm_parser_funcs;
+
+ } PSAux_ServiceRec, *PSAux_Service;
+
+ /* backwards-compatible type definition */
+ typedef PSAux_ServiceRec PSAux_Interface;
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** Some convenience functions *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+#define IS_PS_NEWLINE( ch ) \
+ ( (ch) == '\r' || \
+ (ch) == '\n' )
+
+#define IS_PS_SPACE( ch ) \
+ ( (ch) == ' ' || \
+ IS_PS_NEWLINE( ch ) || \
+ (ch) == '\t' || \
+ (ch) == '\f' || \
+ (ch) == '\0' )
+
+#define IS_PS_SPECIAL( ch ) \
+ ( (ch) == '/' || \
+ (ch) == '(' || (ch) == ')' || \
+ (ch) == '<' || (ch) == '>' || \
+ (ch) == '[' || (ch) == ']' || \
+ (ch) == '{' || (ch) == '}' || \
+ (ch) == '%' )
+
+#define IS_PS_DELIM( ch ) \
+ ( IS_PS_SPACE( ch ) || \
+ IS_PS_SPECIAL( ch ) )
+
+#define IS_PS_DIGIT( ch ) \
+ ( (ch) >= '0' && (ch) <= '9' )
+
+#define IS_PS_XDIGIT( ch ) \
+ ( IS_PS_DIGIT( ch ) || \
+ ( (ch) >= 'A' && (ch) <= 'F' ) || \
+ ( (ch) >= 'a' && (ch) <= 'f' ) )
+
+#define IS_PS_BASE85( ch ) \
+ ( (ch) >= '!' && (ch) <= 'u' )
+
+#define IS_PS_TOKEN( cur, limit, token ) \
+ ( (char)(cur)[0] == (token)[0] && \
+ ( (cur) + sizeof ( (token) ) == (limit) || \
+ ( (cur) + sizeof( (token) ) < (limit) && \
+ IS_PS_DELIM( (cur)[sizeof ( (token) ) - 1] ) ) ) && \
+ ft_strncmp( (char*)(cur), (token), sizeof ( (token) ) - 1 ) == 0 )
+
+
+FT_END_HEADER
+
+#endif /* __PSAUX_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/pshints.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/pshints.h
new file mode 100644
index 0000000000..f9b594079a
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/pshints.h
@@ -0,0 +1,722 @@
+/***************************************************************************/
+/* */
+/* pshints.h */
+/* */
+/* Interface to Postscript-specific (Type 1 and Type 2) hints */
+/* recorders (specification only). These are used to support native */
+/* T1/T2 hints in the `type1', `cid', and `cff' font drivers. */
+/* */
+/* Copyright 2001-2003, 2005-2007, 2009, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __PSHINTS_H__
+#define __PSHINTS_H__
+
+
+#include "../../ft2build.h"
+#include "../freetype.h"
+#include "../t1tables.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** INTERNAL REPRESENTATION OF GLOBALS *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ typedef struct PSH_GlobalsRec_* PSH_Globals;
+
+ typedef FT_Error
+ (*PSH_Globals_NewFunc)( FT_Memory memory,
+ T1_Private* private_dict,
+ PSH_Globals* aglobals );
+
+ typedef FT_Error
+ (*PSH_Globals_SetScaleFunc)( PSH_Globals globals,
+ FT_Fixed x_scale,
+ FT_Fixed y_scale,
+ FT_Fixed x_delta,
+ FT_Fixed y_delta );
+
+ typedef void
+ (*PSH_Globals_DestroyFunc)( PSH_Globals globals );
+
+
+ typedef struct PSH_Globals_FuncsRec_
+ {
+ PSH_Globals_NewFunc create;
+ PSH_Globals_SetScaleFunc set_scale;
+ PSH_Globals_DestroyFunc destroy;
+
+ } PSH_Globals_FuncsRec, *PSH_Globals_Funcs;
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** PUBLIC TYPE 1 HINTS RECORDER *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /*************************************************************************
+ *
+ * @type:
+ * T1_Hints
+ *
+ * @description:
+ * This is a handle to an opaque structure used to record glyph hints
+ * from a Type 1 character glyph character string.
+ *
+ * The methods used to operate on this object are defined by the
+ * @T1_Hints_FuncsRec structure. Recording glyph hints is normally
+ * achieved through the following scheme:
+ *
+ * - Open a new hint recording session by calling the `open' method.
+ * This rewinds the recorder and prepare it for new input.
+ *
+ * - For each hint found in the glyph charstring, call the corresponding
+ * method (`stem', `stem3', or `reset'). Note that these functions do
+ * not return an error code.
+ *
+ * - Close the recording session by calling the `close' method. It
+ * returns an error code if the hints were invalid or something
+ * strange happened (e.g., memory shortage).
+ *
+ * The hints accumulated in the object can later be used by the
+ * PostScript hinter.
+ *
+ */
+ typedef struct T1_HintsRec_* T1_Hints;
+
+
+ /*************************************************************************
+ *
+ * @type:
+ * T1_Hints_Funcs
+ *
+ * @description:
+ * A pointer to the @T1_Hints_FuncsRec structure that defines the API of
+ * a given @T1_Hints object.
+ *
+ */
+ typedef const struct T1_Hints_FuncsRec_* T1_Hints_Funcs;
+
+
+ /*************************************************************************
+ *
+ * @functype:
+ * T1_Hints_OpenFunc
+ *
+ * @description:
+ * A method of the @T1_Hints class used to prepare it for a new Type 1
+ * hints recording session.
+ *
+ * @input:
+ * hints ::
+ * A handle to the Type 1 hints recorder.
+ *
+ * @note:
+ * You should always call the @T1_Hints_CloseFunc method in order to
+ * close an opened recording session.
+ *
+ */
+ typedef void
+ (*T1_Hints_OpenFunc)( T1_Hints hints );
+
+
+ /*************************************************************************
+ *
+ * @functype:
+ * T1_Hints_SetStemFunc
+ *
+ * @description:
+ * A method of the @T1_Hints class used to record a new horizontal or
+ * vertical stem. This corresponds to the Type 1 `hstem' and `vstem'
+ * operators.
+ *
+ * @input:
+ * hints ::
+ * A handle to the Type 1 hints recorder.
+ *
+ * dimension ::
+ * 0 for horizontal stems (hstem), 1 for vertical ones (vstem).
+ *
+ * coords ::
+ * Array of 2 coordinates in 16.16 format, used as (position,length)
+ * stem descriptor.
+ *
+ * @note:
+ * Use vertical coordinates (y) for horizontal stems (dim=0). Use
+ * horizontal coordinates (x) for vertical stems (dim=1).
+ *
+ * `coords[0]' is the absolute stem position (lowest coordinate);
+ * `coords[1]' is the length.
+ *
+ * The length can be negative, in which case it must be either -20 or
+ * -21. It is interpreted as a `ghost' stem, according to the Type 1
+ * specification.
+ *
+ * If the length is -21 (corresponding to a bottom ghost stem), then
+ * the real stem position is `coords[0]+coords[1]'.
+ *
+ */
+ typedef void
+ (*T1_Hints_SetStemFunc)( T1_Hints hints,
+ FT_UInt dimension,
+ FT_Fixed* coords );
+
+
+ /*************************************************************************
+ *
+ * @functype:
+ * T1_Hints_SetStem3Func
+ *
+ * @description:
+ * A method of the @T1_Hints class used to record three
+ * counter-controlled horizontal or vertical stems at once.
+ *
+ * @input:
+ * hints ::
+ * A handle to the Type 1 hints recorder.
+ *
+ * dimension ::
+ * 0 for horizontal stems, 1 for vertical ones.
+ *
+ * coords ::
+ * An array of 6 values in 16.16 format, holding 3 (position,length)
+ * pairs for the counter-controlled stems.
+ *
+ * @note:
+ * Use vertical coordinates (y) for horizontal stems (dim=0). Use
+ * horizontal coordinates (x) for vertical stems (dim=1).
+ *
+ * The lengths cannot be negative (ghost stems are never
+ * counter-controlled).
+ *
+ */
+ typedef void
+ (*T1_Hints_SetStem3Func)( T1_Hints hints,
+ FT_UInt dimension,
+ FT_Fixed* coords );
+
+
+ /*************************************************************************
+ *
+ * @functype:
+ * T1_Hints_ResetFunc
+ *
+ * @description:
+ * A method of the @T1_Hints class used to reset the stems hints in a
+ * recording session.
+ *
+ * @input:
+ * hints ::
+ * A handle to the Type 1 hints recorder.
+ *
+ * end_point ::
+ * The index of the last point in the input glyph in which the
+ * previously defined hints apply.
+ *
+ */
+ typedef void
+ (*T1_Hints_ResetFunc)( T1_Hints hints,
+ FT_UInt end_point );
+
+
+ /*************************************************************************
+ *
+ * @functype:
+ * T1_Hints_CloseFunc
+ *
+ * @description:
+ * A method of the @T1_Hints class used to close a hint recording
+ * session.
+ *
+ * @input:
+ * hints ::
+ * A handle to the Type 1 hints recorder.
+ *
+ * end_point ::
+ * The index of the last point in the input glyph.
+ *
+ * @return:
+ * FreeType error code. 0 means success.
+ *
+ * @note:
+ * The error code is set to indicate that an error occurred during the
+ * recording session.
+ *
+ */
+ typedef FT_Error
+ (*T1_Hints_CloseFunc)( T1_Hints hints,
+ FT_UInt end_point );
+
+
+ /*************************************************************************
+ *
+ * @functype:
+ * T1_Hints_ApplyFunc
+ *
+ * @description:
+ * A method of the @T1_Hints class used to apply hints to the
+ * corresponding glyph outline. Must be called once all hints have been
+ * recorded.
+ *
+ * @input:
+ * hints ::
+ * A handle to the Type 1 hints recorder.
+ *
+ * outline ::
+ * A pointer to the target outline descriptor.
+ *
+ * globals ::
+ * The hinter globals for this font.
+ *
+ * hint_mode ::
+ * Hinting information.
+ *
+ * @return:
+ * FreeType error code. 0 means success.
+ *
+ * @note:
+ * On input, all points within the outline are in font coordinates. On
+ * output, they are in 1/64th of pixels.
+ *
+ * The scaling transformation is taken from the `globals' object which
+ * must correspond to the same font as the glyph.
+ *
+ */
+ typedef FT_Error
+ (*T1_Hints_ApplyFunc)( T1_Hints hints,
+ FT_Outline* outline,
+ PSH_Globals globals,
+ FT_Render_Mode hint_mode );
+
+
+ /*************************************************************************
+ *
+ * @struct:
+ * T1_Hints_FuncsRec
+ *
+ * @description:
+ * The structure used to provide the API to @T1_Hints objects.
+ *
+ * @fields:
+ * hints ::
+ * A handle to the T1 Hints recorder.
+ *
+ * open ::
+ * The function to open a recording session.
+ *
+ * close ::
+ * The function to close a recording session.
+ *
+ * stem ::
+ * The function to set a simple stem.
+ *
+ * stem3 ::
+ * The function to set counter-controlled stems.
+ *
+ * reset ::
+ * The function to reset stem hints.
+ *
+ * apply ::
+ * The function to apply the hints to the corresponding glyph outline.
+ *
+ */
+ typedef struct T1_Hints_FuncsRec_
+ {
+ T1_Hints hints;
+ T1_Hints_OpenFunc open;
+ T1_Hints_CloseFunc close;
+ T1_Hints_SetStemFunc stem;
+ T1_Hints_SetStem3Func stem3;
+ T1_Hints_ResetFunc reset;
+ T1_Hints_ApplyFunc apply;
+
+ } T1_Hints_FuncsRec;
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** PUBLIC TYPE 2 HINTS RECORDER *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /*************************************************************************
+ *
+ * @type:
+ * T2_Hints
+ *
+ * @description:
+ * This is a handle to an opaque structure used to record glyph hints
+ * from a Type 2 character glyph character string.
+ *
+ * The methods used to operate on this object are defined by the
+ * @T2_Hints_FuncsRec structure. Recording glyph hints is normally
+ * achieved through the following scheme:
+ *
+ * - Open a new hint recording session by calling the `open' method.
+ * This rewinds the recorder and prepare it for new input.
+ *
+ * - For each hint found in the glyph charstring, call the corresponding
+ * method (`stems', `hintmask', `counters'). Note that these
+ * functions do not return an error code.
+ *
+ * - Close the recording session by calling the `close' method. It
+ * returns an error code if the hints were invalid or something
+ * strange happened (e.g., memory shortage).
+ *
+ * The hints accumulated in the object can later be used by the
+ * Postscript hinter.
+ *
+ */
+ typedef struct T2_HintsRec_* T2_Hints;
+
+
+ /*************************************************************************
+ *
+ * @type:
+ * T2_Hints_Funcs
+ *
+ * @description:
+ * A pointer to the @T2_Hints_FuncsRec structure that defines the API of
+ * a given @T2_Hints object.
+ *
+ */
+ typedef const struct T2_Hints_FuncsRec_* T2_Hints_Funcs;
+
+
+ /*************************************************************************
+ *
+ * @functype:
+ * T2_Hints_OpenFunc
+ *
+ * @description:
+ * A method of the @T2_Hints class used to prepare it for a new Type 2
+ * hints recording session.
+ *
+ * @input:
+ * hints ::
+ * A handle to the Type 2 hints recorder.
+ *
+ * @note:
+ * You should always call the @T2_Hints_CloseFunc method in order to
+ * close an opened recording session.
+ *
+ */
+ typedef void
+ (*T2_Hints_OpenFunc)( T2_Hints hints );
+
+
+ /*************************************************************************
+ *
+ * @functype:
+ * T2_Hints_StemsFunc
+ *
+ * @description:
+ * A method of the @T2_Hints class used to set the table of stems in
+ * either the vertical or horizontal dimension. Equivalent to the
+ * `hstem', `vstem', `hstemhm', and `vstemhm' Type 2 operators.
+ *
+ * @input:
+ * hints ::
+ * A handle to the Type 2 hints recorder.
+ *
+ * dimension ::
+ * 0 for horizontal stems (hstem), 1 for vertical ones (vstem).
+ *
+ * count ::
+ * The number of stems.
+ *
+ * coords ::
+ * An array of `count' (position,length) pairs in 16.16 format.
+ *
+ * @note:
+ * Use vertical coordinates (y) for horizontal stems (dim=0). Use
+ * horizontal coordinates (x) for vertical stems (dim=1).
+ *
+ * There are `2*count' elements in the `coords' array. Each even
+ * element is an absolute position in font units, each odd element is a
+ * length in font units.
+ *
+ * A length can be negative, in which case it must be either -20 or
+ * -21. It is interpreted as a `ghost' stem, according to the Type 1
+ * specification.
+ *
+ */
+ typedef void
+ (*T2_Hints_StemsFunc)( T2_Hints hints,
+ FT_UInt dimension,
+ FT_UInt count,
+ FT_Fixed* coordinates );
+
+
+ /*************************************************************************
+ *
+ * @functype:
+ * T2_Hints_MaskFunc
+ *
+ * @description:
+ * A method of the @T2_Hints class used to set a given hintmask (this
+ * corresponds to the `hintmask' Type 2 operator).
+ *
+ * @input:
+ * hints ::
+ * A handle to the Type 2 hints recorder.
+ *
+ * end_point ::
+ * The glyph index of the last point to which the previously defined
+ * or activated hints apply.
+ *
+ * bit_count ::
+ * The number of bits in the hint mask.
+ *
+ * bytes ::
+ * An array of bytes modelling the hint mask.
+ *
+ * @note:
+ * If the hintmask starts the charstring (before any glyph point
+ * definition), the value of `end_point' should be 0.
+ *
+ * `bit_count' is the number of meaningful bits in the `bytes' array; it
+ * must be equal to the total number of hints defined so far (i.e.,
+ * horizontal+verticals).
+ *
+ * The `bytes' array can come directly from the Type 2 charstring and
+ * respects the same format.
+ *
+ */
+ typedef void
+ (*T2_Hints_MaskFunc)( T2_Hints hints,
+ FT_UInt end_point,
+ FT_UInt bit_count,
+ const FT_Byte* bytes );
+
+
+ /*************************************************************************
+ *
+ * @functype:
+ * T2_Hints_CounterFunc
+ *
+ * @description:
+ * A method of the @T2_Hints class used to set a given counter mask
+ * (this corresponds to the `hintmask' Type 2 operator).
+ *
+ * @input:
+ * hints ::
+ * A handle to the Type 2 hints recorder.
+ *
+ * end_point ::
+ * A glyph index of the last point to which the previously defined or
+ * active hints apply.
+ *
+ * bit_count ::
+ * The number of bits in the hint mask.
+ *
+ * bytes ::
+ * An array of bytes modelling the hint mask.
+ *
+ * @note:
+ * If the hintmask starts the charstring (before any glyph point
+ * definition), the value of `end_point' should be 0.
+ *
+ * `bit_count' is the number of meaningful bits in the `bytes' array; it
+ * must be equal to the total number of hints defined so far (i.e.,
+ * horizontal+verticals).
+ *
+ * The `bytes' array can come directly from the Type 2 charstring and
+ * respects the same format.
+ *
+ */
+ typedef void
+ (*T2_Hints_CounterFunc)( T2_Hints hints,
+ FT_UInt bit_count,
+ const FT_Byte* bytes );
+
+
+ /*************************************************************************
+ *
+ * @functype:
+ * T2_Hints_CloseFunc
+ *
+ * @description:
+ * A method of the @T2_Hints class used to close a hint recording
+ * session.
+ *
+ * @input:
+ * hints ::
+ * A handle to the Type 2 hints recorder.
+ *
+ * end_point ::
+ * The index of the last point in the input glyph.
+ *
+ * @return:
+ * FreeType error code. 0 means success.
+ *
+ * @note:
+ * The error code is set to indicate that an error occurred during the
+ * recording session.
+ *
+ */
+ typedef FT_Error
+ (*T2_Hints_CloseFunc)( T2_Hints hints,
+ FT_UInt end_point );
+
+
+ /*************************************************************************
+ *
+ * @functype:
+ * T2_Hints_ApplyFunc
+ *
+ * @description:
+ * A method of the @T2_Hints class used to apply hints to the
+ * corresponding glyph outline. Must be called after the `close'
+ * method.
+ *
+ * @input:
+ * hints ::
+ * A handle to the Type 2 hints recorder.
+ *
+ * outline ::
+ * A pointer to the target outline descriptor.
+ *
+ * globals ::
+ * The hinter globals for this font.
+ *
+ * hint_mode ::
+ * Hinting information.
+ *
+ * @return:
+ * FreeType error code. 0 means success.
+ *
+ * @note:
+ * On input, all points within the outline are in font coordinates. On
+ * output, they are in 1/64th of pixels.
+ *
+ * The scaling transformation is taken from the `globals' object which
+ * must correspond to the same font than the glyph.
+ *
+ */
+ typedef FT_Error
+ (*T2_Hints_ApplyFunc)( T2_Hints hints,
+ FT_Outline* outline,
+ PSH_Globals globals,
+ FT_Render_Mode hint_mode );
+
+
+ /*************************************************************************
+ *
+ * @struct:
+ * T2_Hints_FuncsRec
+ *
+ * @description:
+ * The structure used to provide the API to @T2_Hints objects.
+ *
+ * @fields:
+ * hints ::
+ * A handle to the T2 hints recorder object.
+ *
+ * open ::
+ * The function to open a recording session.
+ *
+ * close ::
+ * The function to close a recording session.
+ *
+ * stems ::
+ * The function to set the dimension's stems table.
+ *
+ * hintmask ::
+ * The function to set hint masks.
+ *
+ * counter ::
+ * The function to set counter masks.
+ *
+ * apply ::
+ * The function to apply the hints on the corresponding glyph outline.
+ *
+ */
+ typedef struct T2_Hints_FuncsRec_
+ {
+ T2_Hints hints;
+ T2_Hints_OpenFunc open;
+ T2_Hints_CloseFunc close;
+ T2_Hints_StemsFunc stems;
+ T2_Hints_MaskFunc hintmask;
+ T2_Hints_CounterFunc counter;
+ T2_Hints_ApplyFunc apply;
+
+ } T2_Hints_FuncsRec;
+
+
+ /* */
+
+
+ typedef struct PSHinter_Interface_
+ {
+ PSH_Globals_Funcs (*get_globals_funcs)( FT_Module module );
+ T1_Hints_Funcs (*get_t1_funcs) ( FT_Module module );
+ T2_Hints_Funcs (*get_t2_funcs) ( FT_Module module );
+
+ } PSHinter_Interface;
+
+ typedef PSHinter_Interface* PSHinter_Service;
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_PSHINTER_INTERFACE( \
+ class_, \
+ get_globals_funcs_, \
+ get_t1_funcs_, \
+ get_t2_funcs_ ) \
+ static const PSHinter_Interface class_ = \
+ { \
+ get_globals_funcs_, \
+ get_t1_funcs_, \
+ get_t2_funcs_ \
+ };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_PSHINTER_INTERFACE( \
+ class_, \
+ get_globals_funcs_, \
+ get_t1_funcs_, \
+ get_t2_funcs_ ) \
+ void \
+ FT_Init_Class_ ## class_( FT_Library library, \
+ PSHinter_Interface* clazz ) \
+ { \
+ FT_UNUSED( library ); \
+ \
+ clazz->get_globals_funcs = get_globals_funcs_; \
+ clazz->get_t1_funcs = get_t1_funcs_; \
+ clazz->get_t2_funcs = get_t2_funcs_; \
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+FT_END_HEADER
+
+#endif /* __PSHINTS_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svbdf.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svbdf.h
new file mode 100644
index 0000000000..508bd1566f
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svbdf.h
@@ -0,0 +1,82 @@
+/***************************************************************************/
+/* */
+/* svbdf.h */
+/* */
+/* The FreeType BDF services (specification). */
+/* */
+/* Copyright 2003, 2009, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __SVBDF_H__
+#define __SVBDF_H__
+
+#include "../../ftbdf.h"
+#include "../ftserv.h"
+
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_BDF "bdf"
+
+ typedef FT_Error
+ (*FT_BDF_GetCharsetIdFunc)( FT_Face face,
+ const char* *acharset_encoding,
+ const char* *acharset_registry );
+
+ typedef FT_Error
+ (*FT_BDF_GetPropertyFunc)( FT_Face face,
+ const char* prop_name,
+ BDF_PropertyRec *aproperty );
+
+
+ FT_DEFINE_SERVICE( BDF )
+ {
+ FT_BDF_GetCharsetIdFunc get_charset_id;
+ FT_BDF_GetPropertyFunc get_property;
+ };
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_BDFRec( class_, \
+ get_charset_id_, \
+ get_property_ ) \
+ static const FT_Service_BDFRec class_ = \
+ { \
+ get_charset_id_, get_property_ \
+ };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_BDFRec( class_, \
+ get_charset_id_, \
+ get_property_ ) \
+ void \
+ FT_Init_Class_ ## class_( FT_Service_BDFRec* clazz ) \
+ { \
+ clazz->get_charset_id = get_charset_id_; \
+ clazz->get_property = get_property_; \
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVBDF_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svcid.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svcid.h
new file mode 100644
index 0000000000..fe33c74242
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svcid.h
@@ -0,0 +1,89 @@
+/***************************************************************************/
+/* */
+/* svcid.h */
+/* */
+/* The FreeType CID font services (specification). */
+/* */
+/* Copyright 2007, 2009, 2012 by Derek Clegg, Michael Toftdal. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __SVCID_H__
+#define __SVCID_H__
+
+#include "../ftserv.h"
+
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_CID "CID"
+
+ typedef FT_Error
+ (*FT_CID_GetRegistryOrderingSupplementFunc)( FT_Face face,
+ const char* *registry,
+ const char* *ordering,
+ FT_Int *supplement );
+ typedef FT_Error
+ (*FT_CID_GetIsInternallyCIDKeyedFunc)( FT_Face face,
+ FT_Bool *is_cid );
+ typedef FT_Error
+ (*FT_CID_GetCIDFromGlyphIndexFunc)( FT_Face face,
+ FT_UInt glyph_index,
+ FT_UInt *cid );
+
+ FT_DEFINE_SERVICE( CID )
+ {
+ FT_CID_GetRegistryOrderingSupplementFunc get_ros;
+ FT_CID_GetIsInternallyCIDKeyedFunc get_is_cid;
+ FT_CID_GetCIDFromGlyphIndexFunc get_cid_from_glyph_index;
+ };
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_CIDREC( class_, \
+ get_ros_, \
+ get_is_cid_, \
+ get_cid_from_glyph_index_ ) \
+ static const FT_Service_CIDRec class_ = \
+ { \
+ get_ros_, get_is_cid_, get_cid_from_glyph_index_ \
+ };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_CIDREC( class_, \
+ get_ros_, \
+ get_is_cid_, \
+ get_cid_from_glyph_index_ ) \
+ void \
+ FT_Init_Class_ ## class_( FT_Library library, \
+ FT_Service_CIDRec* clazz ) \
+ { \
+ FT_UNUSED( library ); \
+ \
+ clazz->get_ros = get_ros_; \
+ clazz->get_is_cid = get_is_cid_; \
+ clazz->get_cid_from_glyph_index = get_cid_from_glyph_index_; \
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVCID_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svgldict.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svgldict.h
new file mode 100644
index 0000000000..9956f74455
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svgldict.h
@@ -0,0 +1,88 @@
+/***************************************************************************/
+/* */
+/* svgldict.h */
+/* */
+/* The FreeType glyph dictionary services (specification). */
+/* */
+/* Copyright 2003, 2009, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __SVGLDICT_H__
+#define __SVGLDICT_H__
+
+#include "../ftserv.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*
+ * A service used to retrieve glyph names, as well as to find the
+ * index of a given glyph name in a font.
+ *
+ */
+
+#define FT_SERVICE_ID_GLYPH_DICT "glyph-dict"
+
+
+ typedef FT_Error
+ (*FT_GlyphDict_GetNameFunc)( FT_Face face,
+ FT_UInt glyph_index,
+ FT_Pointer buffer,
+ FT_UInt buffer_max );
+
+ typedef FT_UInt
+ (*FT_GlyphDict_NameIndexFunc)( FT_Face face,
+ FT_String* glyph_name );
+
+
+ FT_DEFINE_SERVICE( GlyphDict )
+ {
+ FT_GlyphDict_GetNameFunc get_name;
+ FT_GlyphDict_NameIndexFunc name_index; /* optional */
+ };
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_GLYPHDICTREC( class_, \
+ get_name_, \
+ name_index_) \
+ static const FT_Service_GlyphDictRec class_ = \
+ { \
+ get_name_, name_index_ \
+ };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_GLYPHDICTREC( class_, \
+ get_name_, \
+ name_index_) \
+ void \
+ FT_Init_Class_ ## class_( FT_Library library, \
+ FT_Service_GlyphDictRec* clazz ) \
+ { \
+ FT_UNUSED( library ); \
+ \
+ clazz->get_name = get_name_; \
+ clazz->name_index = name_index_; \
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVGLDICT_H__ */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svgxval.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svgxval.h
new file mode 100644
index 0000000000..277b6a9931
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svgxval.h
@@ -0,0 +1,72 @@
+/***************************************************************************/
+/* */
+/* svgxval.h */
+/* */
+/* FreeType API for validating TrueTypeGX/AAT tables (specification). */
+/* */
+/* Copyright 2004, 2005 by */
+/* Masatake YAMATO, Red Hat K.K., */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+/***************************************************************************/
+/* */
+/* gxvalid is derived from both gxlayout module and otvalid module. */
+/* Development of gxlayout is supported by the Information-technology */
+/* Promotion Agency(IPA), Japan. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __SVGXVAL_H__
+#define __SVGXVAL_H__
+
+#include "../../ftgxval.h"
+#include "../ftvalid.h"
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_GX_VALIDATE "truetypegx-validate"
+#define FT_SERVICE_ID_CLASSICKERN_VALIDATE "classickern-validate"
+
+ typedef FT_Error
+ (*gxv_validate_func)( FT_Face face,
+ FT_UInt gx_flags,
+ FT_Bytes tables[FT_VALIDATE_GX_LENGTH],
+ FT_UInt table_length );
+
+
+ typedef FT_Error
+ (*ckern_validate_func)( FT_Face face,
+ FT_UInt ckern_flags,
+ FT_Bytes *ckern_table );
+
+
+ FT_DEFINE_SERVICE( GXvalidate )
+ {
+ gxv_validate_func validate;
+ };
+
+ FT_DEFINE_SERVICE( CKERNvalidate )
+ {
+ ckern_validate_func validate;
+ };
+
+ /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVGXVAL_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svkern.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svkern.h
new file mode 100644
index 0000000000..da03fef614
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svkern.h
@@ -0,0 +1,51 @@
+/***************************************************************************/
+/* */
+/* svkern.h */
+/* */
+/* The FreeType Kerning service (specification). */
+/* */
+/* Copyright 2006 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __SVKERN_H__
+#define __SVKERN_H__
+
+#include "../ftserv.h"
+#include "../../tttables.h"
+
+
+FT_BEGIN_HEADER
+
+#define FT_SERVICE_ID_KERNING "kerning"
+
+
+ typedef FT_Error
+ (*FT_Kerning_TrackGetFunc)( FT_Face face,
+ FT_Fixed point_size,
+ FT_Int degree,
+ FT_Fixed* akerning );
+
+ FT_DEFINE_SERVICE( Kerning )
+ {
+ FT_Kerning_TrackGetFunc get_track;
+ };
+
+ /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVKERN_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svmm.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svmm.h
new file mode 100644
index 0000000000..100ff8703a
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svmm.h
@@ -0,0 +1,113 @@
+/***************************************************************************/
+/* */
+/* svmm.h */
+/* */
+/* The FreeType Multiple Masters and GX var services (specification). */
+/* */
+/* Copyright 2003, 2004, 2009, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __SVMM_H__
+#define __SVMM_H__
+
+#include "../ftserv.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*
+ * A service used to manage multiple-masters data in a given face.
+ *
+ * See the related APIs in `ftmm.h' (FT_MULTIPLE_MASTERS_H).
+ *
+ */
+
+#define FT_SERVICE_ID_MULTI_MASTERS "multi-masters"
+
+
+ typedef FT_Error
+ (*FT_Get_MM_Func)( FT_Face face,
+ FT_Multi_Master* master );
+
+ typedef FT_Error
+ (*FT_Get_MM_Var_Func)( FT_Face face,
+ FT_MM_Var* *master );
+
+ typedef FT_Error
+ (*FT_Set_MM_Design_Func)( FT_Face face,
+ FT_UInt num_coords,
+ FT_Long* coords );
+
+ typedef FT_Error
+ (*FT_Set_Var_Design_Func)( FT_Face face,
+ FT_UInt num_coords,
+ FT_Fixed* coords );
+
+ typedef FT_Error
+ (*FT_Set_MM_Blend_Func)( FT_Face face,
+ FT_UInt num_coords,
+ FT_Long* coords );
+
+
+ FT_DEFINE_SERVICE( MultiMasters )
+ {
+ FT_Get_MM_Func get_mm;
+ FT_Set_MM_Design_Func set_mm_design;
+ FT_Set_MM_Blend_Func set_mm_blend;
+ FT_Get_MM_Var_Func get_mm_var;
+ FT_Set_Var_Design_Func set_var_design;
+ };
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_MULTIMASTERSREC( class_, \
+ get_mm_, \
+ set_mm_design_, \
+ set_mm_blend_, \
+ get_mm_var_, \
+ set_var_design_ ) \
+ static const FT_Service_MultiMastersRec class_ = \
+ { \
+ get_mm_, set_mm_design_, set_mm_blend_, get_mm_var_, set_var_design_ \
+ };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_MULTIMASTERSREC( class_, \
+ get_mm_, \
+ set_mm_design_, \
+ set_mm_blend_, \
+ get_mm_var_, \
+ set_var_design_ ) \
+ void \
+ FT_Init_Class_ ## class_( FT_Service_MultiMastersRec* clazz ) \
+ { \
+ clazz->get_mm = get_mm_; \
+ clazz->set_mm_design = set_mm_design_; \
+ clazz->set_mm_blend = set_mm_blend_; \
+ clazz->get_mm_var = get_mm_var_; \
+ clazz->set_var_design = set_var_design_; \
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __SVMM_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svotval.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svotval.h
new file mode 100644
index 0000000000..37cd34f298
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svotval.h
@@ -0,0 +1,55 @@
+/***************************************************************************/
+/* */
+/* svotval.h */
+/* */
+/* The FreeType OpenType validation service (specification). */
+/* */
+/* Copyright 2004, 2006 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __SVOTVAL_H__
+#define __SVOTVAL_H__
+
+#include "../../ftotval.h"
+#include "../ftvalid.h"
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_OPENTYPE_VALIDATE "opentype-validate"
+
+
+ typedef FT_Error
+ (*otv_validate_func)( FT_Face volatile face,
+ FT_UInt ot_flags,
+ FT_Bytes *base,
+ FT_Bytes *gdef,
+ FT_Bytes *gpos,
+ FT_Bytes *gsub,
+ FT_Bytes *jstf );
+
+
+ FT_DEFINE_SERVICE( OTvalidate )
+ {
+ otv_validate_func validate;
+ };
+
+ /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVOTVAL_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svpfr.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svpfr.h
new file mode 100644
index 0000000000..21a00d3750
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svpfr.h
@@ -0,0 +1,66 @@
+/***************************************************************************/
+/* */
+/* svpfr.h */
+/* */
+/* Internal PFR service functions (specification). */
+/* */
+/* Copyright 2003, 2006 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __SVPFR_H__
+#define __SVPFR_H__
+
+#include "../../ftpfr.h"
+#include "../ftserv.h"
+
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_PFR_METRICS "pfr-metrics"
+
+
+ typedef FT_Error
+ (*FT_PFR_GetMetricsFunc)( FT_Face face,
+ FT_UInt *aoutline,
+ FT_UInt *ametrics,
+ FT_Fixed *ax_scale,
+ FT_Fixed *ay_scale );
+
+ typedef FT_Error
+ (*FT_PFR_GetKerningFunc)( FT_Face face,
+ FT_UInt left,
+ FT_UInt right,
+ FT_Vector *avector );
+
+ typedef FT_Error
+ (*FT_PFR_GetAdvanceFunc)( FT_Face face,
+ FT_UInt gindex,
+ FT_Pos *aadvance );
+
+
+ FT_DEFINE_SERVICE( PfrMetrics )
+ {
+ FT_PFR_GetMetricsFunc get_metrics;
+ FT_PFR_GetKerningFunc get_kerning;
+ FT_PFR_GetAdvanceFunc get_advance;
+
+ };
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __SVPFR_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svpostnm.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svpostnm.h
new file mode 100644
index 0000000000..7fe8603db2
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svpostnm.h
@@ -0,0 +1,81 @@
+/***************************************************************************/
+/* */
+/* svpostnm.h */
+/* */
+/* The FreeType PostScript name services (specification). */
+/* */
+/* Copyright 2003, 2007, 2009, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __SVPOSTNM_H__
+#define __SVPOSTNM_H__
+
+#include "../ftserv.h"
+
+
+FT_BEGIN_HEADER
+
+ /*
+ * A trivial service used to retrieve the PostScript name of a given
+ * font when available. The `get_name' field should never be NULL.
+ *
+ * The corresponding function can return NULL to indicate that the
+ * PostScript name is not available.
+ *
+ * The name is owned by the face and will be destroyed with it.
+ */
+
+#define FT_SERVICE_ID_POSTSCRIPT_FONT_NAME "postscript-font-name"
+
+
+ typedef const char*
+ (*FT_PsName_GetFunc)( FT_Face face );
+
+
+ FT_DEFINE_SERVICE( PsFontName )
+ {
+ FT_PsName_GetFunc get_ps_font_name;
+ };
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_PSFONTNAMEREC( class_, get_ps_font_name_ ) \
+ static const FT_Service_PsFontNameRec class_ = \
+ { \
+ get_ps_font_name_ \
+ };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_PSFONTNAMEREC( class_, get_ps_font_name_ ) \
+ void \
+ FT_Init_Class_ ## class_( FT_Library library, \
+ FT_Service_PsFontNameRec* clazz ) \
+ { \
+ FT_UNUSED( library ); \
+ \
+ clazz->get_ps_font_name = get_ps_font_name_; \
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVPOSTNM_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svprop.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svprop.h
new file mode 100644
index 0000000000..22da0bbc69
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svprop.h
@@ -0,0 +1,81 @@
+/***************************************************************************/
+/* */
+/* svprop.h */
+/* */
+/* The FreeType property service (specification). */
+/* */
+/* Copyright 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __SVPROP_H__
+#define __SVPROP_H__
+
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_PROPERTIES "properties"
+
+
+ typedef FT_Error
+ (*FT_Properties_SetFunc)( FT_Module module,
+ const char* property_name,
+ const void* value );
+
+ typedef FT_Error
+ (*FT_Properties_GetFunc)( FT_Module module,
+ const char* property_name,
+ void* value );
+
+
+ FT_DEFINE_SERVICE( Properties )
+ {
+ FT_Properties_SetFunc set_property;
+ FT_Properties_GetFunc get_property;
+ };
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_PROPERTIESREC( class_, \
+ set_property_, \
+ get_property_ ) \
+ static const FT_Service_PropertiesRec class_ = \
+ { \
+ set_property_, \
+ get_property_ \
+ };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_PROPERTIESREC( class_, \
+ set_property_, \
+ get_property_ ) \
+ void \
+ FT_Init_Class_ ## class_( FT_Service_PropertiesRec* clazz ) \
+ { \
+ clazz->set_property = set_property_; \
+ clazz->get_property = get_property_; \
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVPROP_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svpscmap.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svpscmap.h
new file mode 100644
index 0000000000..592d14ff00
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svpscmap.h
@@ -0,0 +1,177 @@
+/***************************************************************************/
+/* */
+/* svpscmap.h */
+/* */
+/* The FreeType PostScript charmap service (specification). */
+/* */
+/* Copyright 2003, 2006, 2009, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __SVPSCMAP_H__
+#define __SVPSCMAP_H__
+
+#include "../ftobjs.h"
+
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_POSTSCRIPT_CMAPS "postscript-cmaps"
+
+
+ /*
+ * Adobe glyph name to unicode value.
+ */
+ typedef FT_UInt32
+ (*PS_Unicode_ValueFunc)( const char* glyph_name );
+
+ /*
+ * Macintosh name id to glyph name. NULL if invalid index.
+ */
+ typedef const char*
+ (*PS_Macintosh_NameFunc)( FT_UInt name_index );
+
+ /*
+ * Adobe standard string ID to glyph name. NULL if invalid index.
+ */
+ typedef const char*
+ (*PS_Adobe_Std_StringsFunc)( FT_UInt string_index );
+
+
+ /*
+ * Simple unicode -> glyph index charmap built from font glyph names
+ * table.
+ */
+ typedef struct PS_UniMap_
+ {
+ FT_UInt32 unicode; /* bit 31 set: is glyph variant */
+ FT_UInt glyph_index;
+
+ } PS_UniMap;
+
+
+ typedef struct PS_UnicodesRec_* PS_Unicodes;
+
+ typedef struct PS_UnicodesRec_
+ {
+ FT_CMapRec cmap;
+ FT_UInt num_maps;
+ PS_UniMap* maps;
+
+ } PS_UnicodesRec;
+
+
+ /*
+ * A function which returns a glyph name for a given index. Returns
+ * NULL if invalid index.
+ */
+ typedef const char*
+ (*PS_GetGlyphNameFunc)( FT_Pointer data,
+ FT_UInt string_index );
+
+ /*
+ * A function used to release the glyph name returned by
+ * PS_GetGlyphNameFunc, when needed
+ */
+ typedef void
+ (*PS_FreeGlyphNameFunc)( FT_Pointer data,
+ const char* name );
+
+ typedef FT_Error
+ (*PS_Unicodes_InitFunc)( FT_Memory memory,
+ PS_Unicodes unicodes,
+ FT_UInt num_glyphs,
+ PS_GetGlyphNameFunc get_glyph_name,
+ PS_FreeGlyphNameFunc free_glyph_name,
+ FT_Pointer glyph_data );
+
+ typedef FT_UInt
+ (*PS_Unicodes_CharIndexFunc)( PS_Unicodes unicodes,
+ FT_UInt32 unicode );
+
+ typedef FT_UInt32
+ (*PS_Unicodes_CharNextFunc)( PS_Unicodes unicodes,
+ FT_UInt32 *unicode );
+
+
+ FT_DEFINE_SERVICE( PsCMaps )
+ {
+ PS_Unicode_ValueFunc unicode_value;
+
+ PS_Unicodes_InitFunc unicodes_init;
+ PS_Unicodes_CharIndexFunc unicodes_char_index;
+ PS_Unicodes_CharNextFunc unicodes_char_next;
+
+ PS_Macintosh_NameFunc macintosh_name;
+ PS_Adobe_Std_StringsFunc adobe_std_strings;
+ const unsigned short* adobe_std_encoding;
+ const unsigned short* adobe_expert_encoding;
+ };
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_PSCMAPSREC( class_, \
+ unicode_value_, \
+ unicodes_init_, \
+ unicodes_char_index_, \
+ unicodes_char_next_, \
+ macintosh_name_, \
+ adobe_std_strings_, \
+ adobe_std_encoding_, \
+ adobe_expert_encoding_ ) \
+ static const FT_Service_PsCMapsRec class_ = \
+ { \
+ unicode_value_, unicodes_init_, \
+ unicodes_char_index_, unicodes_char_next_, macintosh_name_, \
+ adobe_std_strings_, adobe_std_encoding_, adobe_expert_encoding_ \
+ };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_PSCMAPSREC( class_, \
+ unicode_value_, \
+ unicodes_init_, \
+ unicodes_char_index_, \
+ unicodes_char_next_, \
+ macintosh_name_, \
+ adobe_std_strings_, \
+ adobe_std_encoding_, \
+ adobe_expert_encoding_ ) \
+ void \
+ FT_Init_Class_ ## class_( FT_Library library, \
+ FT_Service_PsCMapsRec* clazz ) \
+ { \
+ FT_UNUSED( library ); \
+ \
+ clazz->unicode_value = unicode_value_; \
+ clazz->unicodes_init = unicodes_init_; \
+ clazz->unicodes_char_index = unicodes_char_index_; \
+ clazz->unicodes_char_next = unicodes_char_next_; \
+ clazz->macintosh_name = macintosh_name_; \
+ clazz->adobe_std_strings = adobe_std_strings_; \
+ clazz->adobe_std_encoding = adobe_std_encoding_; \
+ clazz->adobe_expert_encoding = adobe_expert_encoding_; \
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVPSCMAP_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svpsinfo.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svpsinfo.h
new file mode 100644
index 0000000000..fa3b30317a
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svpsinfo.h
@@ -0,0 +1,111 @@
+/***************************************************************************/
+/* */
+/* svpsinfo.h */
+/* */
+/* The FreeType PostScript info service (specification). */
+/* */
+/* Copyright 2003, 2004, 2009, 2011, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __SVPSINFO_H__
+#define __SVPSINFO_H__
+
+#include "../ftserv.h"
+#include "../t1types.h"
+
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_POSTSCRIPT_INFO "postscript-info"
+
+
+ typedef FT_Error
+ (*PS_GetFontInfoFunc)( FT_Face face,
+ PS_FontInfoRec* afont_info );
+
+ typedef FT_Error
+ (*PS_GetFontExtraFunc)( FT_Face face,
+ PS_FontExtraRec* afont_extra );
+
+ typedef FT_Int
+ (*PS_HasGlyphNamesFunc)( FT_Face face );
+
+ typedef FT_Error
+ (*PS_GetFontPrivateFunc)( FT_Face face,
+ PS_PrivateRec* afont_private );
+
+ typedef FT_Long
+ (*PS_GetFontValueFunc)( FT_Face face,
+ PS_Dict_Keys key,
+ FT_UInt idx,
+ void *value,
+ FT_Long value_len );
+
+
+ FT_DEFINE_SERVICE( PsInfo )
+ {
+ PS_GetFontInfoFunc ps_get_font_info;
+ PS_GetFontExtraFunc ps_get_font_extra;
+ PS_HasGlyphNamesFunc ps_has_glyph_names;
+ PS_GetFontPrivateFunc ps_get_font_private;
+ PS_GetFontValueFunc ps_get_font_value;
+ };
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_PSINFOREC( class_, \
+ get_font_info_, \
+ ps_get_font_extra_, \
+ has_glyph_names_, \
+ get_font_private_, \
+ get_font_value_ ) \
+ static const FT_Service_PsInfoRec class_ = \
+ { \
+ get_font_info_, ps_get_font_extra_, has_glyph_names_, \
+ get_font_private_, get_font_value_ \
+ };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_PSINFOREC( class_, \
+ get_font_info_, \
+ ps_get_font_extra_, \
+ has_glyph_names_, \
+ get_font_private_, \
+ get_font_value_ ) \
+ void \
+ FT_Init_Class_ ## class_( FT_Library library, \
+ FT_Service_PsInfoRec* clazz ) \
+ { \
+ FT_UNUSED( library ); \
+ \
+ clazz->ps_get_font_info = get_font_info_; \
+ clazz->ps_get_font_extra = ps_get_font_extra_; \
+ clazz->ps_has_glyph_names = has_glyph_names_; \
+ clazz->ps_get_font_private = get_font_private_; \
+ clazz->ps_get_font_value = get_font_value_; \
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVPSINFO_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svsfnt.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svsfnt.h
new file mode 100644
index 0000000000..3425042910
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svsfnt.h
@@ -0,0 +1,103 @@
+/***************************************************************************/
+/* */
+/* svsfnt.h */
+/* */
+/* The FreeType SFNT table loading service (specification). */
+/* */
+/* Copyright 2003, 2004, 2009, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __SVSFNT_H__
+#define __SVSFNT_H__
+
+#include "../ftserv.h"
+#include "../../tttables.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*
+ * SFNT table loading service.
+ */
+
+#define FT_SERVICE_ID_SFNT_TABLE "sfnt-table"
+
+
+ /*
+ * Used to implement FT_Load_Sfnt_Table().
+ */
+ typedef FT_Error
+ (*FT_SFNT_TableLoadFunc)( FT_Face face,
+ FT_ULong tag,
+ FT_Long offset,
+ FT_Byte* buffer,
+ FT_ULong* length );
+
+ /*
+ * Used to implement FT_Get_Sfnt_Table().
+ */
+ typedef void*
+ (*FT_SFNT_TableGetFunc)( FT_Face face,
+ FT_Sfnt_Tag tag );
+
+
+ /*
+ * Used to implement FT_Sfnt_Table_Info().
+ */
+ typedef FT_Error
+ (*FT_SFNT_TableInfoFunc)( FT_Face face,
+ FT_UInt idx,
+ FT_ULong *tag,
+ FT_ULong *offset,
+ FT_ULong *length );
+
+
+ FT_DEFINE_SERVICE( SFNT_Table )
+ {
+ FT_SFNT_TableLoadFunc load_table;
+ FT_SFNT_TableGetFunc get_table;
+ FT_SFNT_TableInfoFunc table_info;
+ };
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_SFNT_TABLEREC( class_, load_, get_, info_ ) \
+ static const FT_Service_SFNT_TableRec class_ = \
+ { \
+ load_, get_, info_ \
+ };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_SFNT_TABLEREC( class_, load_, get_, info_ ) \
+ void \
+ FT_Init_Class_ ## class_( FT_Service_SFNT_TableRec* clazz ) \
+ { \
+ clazz->load_table = load_; \
+ clazz->get_table = get_; \
+ clazz->table_info = info_; \
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVSFNT_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svttcmap.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svttcmap.h
new file mode 100644
index 0000000000..02542ab83f
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svttcmap.h
@@ -0,0 +1,107 @@
+/***************************************************************************/
+/* */
+/* svttcmap.h */
+/* */
+/* The FreeType TrueType/sfnt cmap extra information service. */
+/* */
+/* Copyright 2003 by */
+/* Masatake YAMATO, Redhat K.K. */
+/* */
+/* Copyright 2003, 2008, 2009, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+/* Development of this service is support of
+ Information-technology Promotion Agency, Japan. */
+
+#ifndef __SVTTCMAP_H__
+#define __SVTTCMAP_H__
+
+#include "../ftserv.h"
+#include "../../tttables.h"
+
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_TT_CMAP "tt-cmaps"
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_CMapInfo */
+ /* */
+ /* <Description> */
+ /* A structure used to store TrueType/sfnt specific cmap information */
+ /* which is not covered by the generic @FT_CharMap structure. This */
+ /* structure can be accessed with the @FT_Get_TT_CMap_Info function. */
+ /* */
+ /* <Fields> */
+ /* language :: */
+ /* The language ID used in Mac fonts. Definitions of values are in */
+ /* freetype/ttnameid.h. */
+ /* */
+ /* format :: */
+ /* The cmap format. OpenType 1.5 defines the formats 0 (byte */
+ /* encoding table), 2~(high-byte mapping through table), 4~(segment */
+ /* mapping to delta values), 6~(trimmed table mapping), 8~(mixed */
+ /* 16-bit and 32-bit coverage), 10~(trimmed array), 12~(segmented */
+ /* coverage), and 14 (Unicode Variation Sequences). */
+ /* */
+ typedef struct TT_CMapInfo_
+ {
+ FT_ULong language;
+ FT_Long format;
+
+ } TT_CMapInfo;
+
+
+ typedef FT_Error
+ (*TT_CMap_Info_GetFunc)( FT_CharMap charmap,
+ TT_CMapInfo *cmap_info );
+
+
+ FT_DEFINE_SERVICE( TTCMaps )
+ {
+ TT_CMap_Info_GetFunc get_cmap_info;
+ };
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_TTCMAPSREC( class_, get_cmap_info_ ) \
+ static const FT_Service_TTCMapsRec class_ = \
+ { \
+ get_cmap_info_ \
+ };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_TTCMAPSREC( class_, get_cmap_info_ ) \
+ void \
+ FT_Init_Class_ ## class_( FT_Library library, \
+ FT_Service_TTCMapsRec* clazz ) \
+ { \
+ FT_UNUSED( library ); \
+ \
+ clazz->get_cmap_info = get_cmap_info_; \
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __SVTTCMAP_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svtteng.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svtteng.h
new file mode 100644
index 0000000000..e567efbee5
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svtteng.h
@@ -0,0 +1,53 @@
+/***************************************************************************/
+/* */
+/* svtteng.h */
+/* */
+/* The FreeType TrueType engine query service (specification). */
+/* */
+/* Copyright 2006 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __SVTTENG_H__
+#define __SVTTENG_H__
+
+#include "../ftserv.h"
+#include "../../ftmodapi.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*
+ * SFNT table loading service.
+ */
+
+#define FT_SERVICE_ID_TRUETYPE_ENGINE "truetype-engine"
+
+ /*
+ * Used to implement FT_Get_TrueType_Engine_Type
+ */
+
+ FT_DEFINE_SERVICE( TrueTypeEngine )
+ {
+ FT_TrueTypeEngineType engine_type;
+ };
+
+ /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVTTENG_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svttglyf.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svttglyf.h
new file mode 100644
index 0000000000..d8824fb25b
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svttglyf.h
@@ -0,0 +1,68 @@
+/***************************************************************************/
+/* */
+/* svttglyf.h */
+/* */
+/* The FreeType TrueType glyph service. */
+/* */
+/* Copyright 2007, 2009, 2012 by David Turner. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+#ifndef __SVTTGLYF_H__
+#define __SVTTGLYF_H__
+
+#include "../ftserv.h"
+#include "../../tttables.h"
+
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_TT_GLYF "tt-glyf"
+
+
+ typedef FT_ULong
+ (*TT_Glyf_GetLocationFunc)( FT_Face face,
+ FT_UInt gindex,
+ FT_ULong *psize );
+
+ FT_DEFINE_SERVICE( TTGlyf )
+ {
+ TT_Glyf_GetLocationFunc get_location;
+ };
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_TTGLYFREC( class_, get_location_ ) \
+ static const FT_Service_TTGlyfRec class_ = \
+ { \
+ get_location_ \
+ };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_TTGLYFREC( class_, get_location_ ) \
+ void \
+ FT_Init_Class_ ## class_( FT_Service_TTGlyfRec* clazz ) \
+ { \
+ clazz->get_location = get_location_; \
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __SVTTGLYF_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svwinfnt.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svwinfnt.h
new file mode 100644
index 0000000000..013a991683
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svwinfnt.h
@@ -0,0 +1,50 @@
+/***************************************************************************/
+/* */
+/* svwinfnt.h */
+/* */
+/* The FreeType Windows FNT/FONT service (specification). */
+/* */
+/* Copyright 2003 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __SVWINFNT_H__
+#define __SVWINFNT_H__
+
+#include "../ftserv.h"
+#include "../../ftwinfnt.h"
+
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_WINFNT "winfonts"
+
+ typedef FT_Error
+ (*FT_WinFnt_GetHeaderFunc)( FT_Face face,
+ FT_WinFNT_HeaderRec *aheader );
+
+
+ FT_DEFINE_SERVICE( WinFnt )
+ {
+ FT_WinFnt_GetHeaderFunc get_header;
+ };
+
+ /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVWINFNT_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svxf86nm.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svxf86nm.h
new file mode 100644
index 0000000000..571f63d917
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/services/svxf86nm.h
@@ -0,0 +1,55 @@
+/***************************************************************************/
+/* */
+/* svxf86nm.h */
+/* */
+/* The FreeType XFree86 services (specification only). */
+/* */
+/* Copyright 2003 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __SVXF86NM_H__
+#define __SVXF86NM_H__
+
+#include "../ftserv.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*
+ * A trivial service used to return the name of a face's font driver,
+ * according to the XFree86 nomenclature. Note that the service data
+ * is a simple constant string pointer.
+ */
+
+#define FT_SERVICE_ID_XF86_NAME "xf86-driver-name"
+
+#define FT_XF86_FORMAT_TRUETYPE "TrueType"
+#define FT_XF86_FORMAT_TYPE_1 "Type 1"
+#define FT_XF86_FORMAT_BDF "BDF"
+#define FT_XF86_FORMAT_PCF "PCF"
+#define FT_XF86_FORMAT_TYPE_42 "Type 42"
+#define FT_XF86_FORMAT_CID "CID Type 1"
+#define FT_XF86_FORMAT_CFF "CFF"
+#define FT_XF86_FORMAT_PFR "PFR"
+#define FT_XF86_FORMAT_WINFNT "Windows FNT"
+
+ /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVXF86NM_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/sfnt.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/sfnt.h
new file mode 100644
index 0000000000..2759ba3a96
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/sfnt.h
@@ -0,0 +1,707 @@
+/***************************************************************************/
+/* */
+/* sfnt.h */
+/* */
+/* High-level `sfnt' driver interface (specification). */
+/* */
+/* Copyright 1996-2006, 2009, 2012-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __SFNT_H__
+#define __SFNT_H__
+
+
+#include "../../ft2build.h"
+#include "ftdriver.h"
+#include "tttypes.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* TT_Init_Face_Func */
+ /* */
+ /* <Description> */
+ /* First part of the SFNT face object initialization. This finds */
+ /* the face in a SFNT file or collection, and load its format tag in */
+ /* face->format_tag. */
+ /* */
+ /* <Input> */
+ /* stream :: The input stream. */
+ /* */
+ /* face :: A handle to the target face object. */
+ /* */
+ /* face_index :: The index of the TrueType font, if we are opening a */
+ /* collection. */
+ /* */
+ /* num_params :: The number of additional parameters. */
+ /* */
+ /* params :: Optional additional parameters. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ /* <Note> */
+ /* The stream cursor must be at the font file's origin. */
+ /* */
+ /* This function recognizes fonts embedded in a `TrueType */
+ /* collection'. */
+ /* */
+ /* Once the format tag has been validated by the font driver, it */
+ /* should then call the TT_Load_Face_Func() callback to read the rest */
+ /* of the SFNT tables in the object. */
+ /* */
+ typedef FT_Error
+ (*TT_Init_Face_Func)( FT_Stream stream,
+ TT_Face face,
+ FT_Int face_index,
+ FT_Int num_params,
+ FT_Parameter* params );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* TT_Load_Face_Func */
+ /* */
+ /* <Description> */
+ /* Second part of the SFNT face object initialization. This loads */
+ /* the common SFNT tables (head, OS/2, maxp, metrics, etc.) in the */
+ /* face object. */
+ /* */
+ /* <Input> */
+ /* stream :: The input stream. */
+ /* */
+ /* face :: A handle to the target face object. */
+ /* */
+ /* face_index :: The index of the TrueType font, if we are opening a */
+ /* collection. */
+ /* */
+ /* num_params :: The number of additional parameters. */
+ /* */
+ /* params :: Optional additional parameters. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ /* <Note> */
+ /* This function must be called after TT_Init_Face_Func(). */
+ /* */
+ typedef FT_Error
+ (*TT_Load_Face_Func)( FT_Stream stream,
+ TT_Face face,
+ FT_Int face_index,
+ FT_Int num_params,
+ FT_Parameter* params );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* TT_Done_Face_Func */
+ /* */
+ /* <Description> */
+ /* A callback used to delete the common SFNT data from a face. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the target face object. */
+ /* */
+ /* <Note> */
+ /* This function does NOT destroy the face object. */
+ /* */
+ typedef void
+ (*TT_Done_Face_Func)( TT_Face face );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* TT_Load_Any_Func */
+ /* */
+ /* <Description> */
+ /* Load any font table into client memory. */
+ /* */
+ /* <Input> */
+ /* face :: The face object to look for. */
+ /* */
+ /* tag :: The tag of table to load. Use the value 0 if you want */
+ /* to access the whole font file, else set this parameter */
+ /* to a valid TrueType table tag that you can forge with */
+ /* the MAKE_TT_TAG macro. */
+ /* */
+ /* offset :: The starting offset in the table (or the file if */
+ /* tag == 0). */
+ /* */
+ /* length :: The address of the decision variable: */
+ /* */
+ /* If length == NULL: */
+ /* Loads the whole table. Returns an error if */
+ /* `offset' == 0! */
+ /* */
+ /* If *length == 0: */
+ /* Exits immediately; returning the length of the given */
+ /* table or of the font file, depending on the value of */
+ /* `tag'. */
+ /* */
+ /* If *length != 0: */
+ /* Loads the next `length' bytes of table or font, */
+ /* starting at offset `offset' (in table or font too). */
+ /* */
+ /* <Output> */
+ /* buffer :: The address of target buffer. */
+ /* */
+ /* <Return> */
+ /* TrueType error code. 0 means success. */
+ /* */
+ typedef FT_Error
+ (*TT_Load_Any_Func)( TT_Face face,
+ FT_ULong tag,
+ FT_Long offset,
+ FT_Byte *buffer,
+ FT_ULong* length );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* TT_Find_SBit_Image_Func */
+ /* */
+ /* <Description> */
+ /* Check whether an embedded bitmap (an `sbit') exists for a given */
+ /* glyph, at a given strike. */
+ /* */
+ /* <Input> */
+ /* face :: The target face object. */
+ /* */
+ /* glyph_index :: The glyph index. */
+ /* */
+ /* strike_index :: The current strike index. */
+ /* */
+ /* <Output> */
+ /* arange :: The SBit range containing the glyph index. */
+ /* */
+ /* astrike :: The SBit strike containing the glyph index. */
+ /* */
+ /* aglyph_offset :: The offset of the glyph data in `EBDT' table. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. Returns */
+ /* SFNT_Err_Invalid_Argument if no sbit exists for the requested */
+ /* glyph. */
+ /* */
+ typedef FT_Error
+ (*TT_Find_SBit_Image_Func)( TT_Face face,
+ FT_UInt glyph_index,
+ FT_ULong strike_index,
+ TT_SBit_Range *arange,
+ TT_SBit_Strike *astrike,
+ FT_ULong *aglyph_offset );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* TT_Load_SBit_Metrics_Func */
+ /* */
+ /* <Description> */
+ /* Get the big metrics for a given embedded bitmap. */
+ /* */
+ /* <Input> */
+ /* stream :: The input stream. */
+ /* */
+ /* range :: The SBit range containing the glyph. */
+ /* */
+ /* <Output> */
+ /* big_metrics :: A big SBit metrics structure for the glyph. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ /* <Note> */
+ /* The stream cursor must be positioned at the glyph's offset within */
+ /* the `EBDT' table before the call. */
+ /* */
+ /* If the image format uses variable metrics, the stream cursor is */
+ /* positioned just after the metrics header in the `EBDT' table on */
+ /* function exit. */
+ /* */
+ typedef FT_Error
+ (*TT_Load_SBit_Metrics_Func)( FT_Stream stream,
+ TT_SBit_Range range,
+ TT_SBit_Metrics metrics );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* TT_Load_SBit_Image_Func */
+ /* */
+ /* <Description> */
+ /* Load a given glyph sbit image from the font resource. This also */
+ /* returns its metrics. */
+ /* */
+ /* <Input> */
+ /* face :: */
+ /* The target face object. */
+ /* */
+ /* strike_index :: */
+ /* The strike index. */
+ /* */
+ /* glyph_index :: */
+ /* The current glyph index. */
+ /* */
+ /* load_flags :: */
+ /* The current load flags. */
+ /* */
+ /* stream :: */
+ /* The input stream. */
+ /* */
+ /* <Output> */
+ /* amap :: */
+ /* The target pixmap. */
+ /* */
+ /* ametrics :: */
+ /* A big sbit metrics structure for the glyph image. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. Returns an error if no */
+ /* glyph sbit exists for the index. */
+ /* */
+ /* <Note> */
+ /* The `map.buffer' field is always freed before the glyph is loaded. */
+ /* */
+ typedef FT_Error
+ (*TT_Load_SBit_Image_Func)( TT_Face face,
+ FT_ULong strike_index,
+ FT_UInt glyph_index,
+ FT_UInt load_flags,
+ FT_Stream stream,
+ FT_Bitmap *amap,
+ TT_SBit_MetricsRec *ametrics );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* TT_Set_SBit_Strike_Func */
+ /* */
+ /* <Description> */
+ /* Select an sbit strike for a given size request. */
+ /* */
+ /* <Input> */
+ /* face :: The target face object. */
+ /* */
+ /* req :: The size request. */
+ /* */
+ /* <Output> */
+ /* astrike_index :: The index of the sbit strike. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. Returns an error if no */
+ /* sbit strike exists for the selected ppem values. */
+ /* */
+ typedef FT_Error
+ (*TT_Set_SBit_Strike_Func)( TT_Face face,
+ FT_Size_Request req,
+ FT_ULong* astrike_index );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* TT_Load_Strike_Metrics_Func */
+ /* */
+ /* <Description> */
+ /* Load the metrics of a given strike. */
+ /* */
+ /* <Input> */
+ /* face :: The target face object. */
+ /* */
+ /* strike_index :: The strike index. */
+ /* */
+ /* <Output> */
+ /* metrics :: the metrics of the strike. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. Returns an error if no */
+ /* such sbit strike exists. */
+ /* */
+ typedef FT_Error
+ (*TT_Load_Strike_Metrics_Func)( TT_Face face,
+ FT_ULong strike_index,
+ FT_Size_Metrics* metrics );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* TT_Get_PS_Name_Func */
+ /* */
+ /* <Description> */
+ /* Get the PostScript glyph name of a glyph. */
+ /* */
+ /* <Input> */
+ /* idx :: The glyph index. */
+ /* */
+ /* PSname :: The address of a string pointer. Will be NULL in case */
+ /* of error, otherwise it is a pointer to the glyph name. */
+ /* */
+ /* You must not modify the returned string! */
+ /* */
+ /* <Output> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ typedef FT_Error
+ (*TT_Get_PS_Name_Func)( TT_Face face,
+ FT_UInt idx,
+ FT_String** PSname );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* TT_Load_Metrics_Func */
+ /* */
+ /* <Description> */
+ /* Load a metrics table, which is a table with a horizontal and a */
+ /* vertical version. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the target face object. */
+ /* */
+ /* stream :: The input stream. */
+ /* */
+ /* vertical :: A boolean flag. If set, load the vertical one. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ typedef FT_Error
+ (*TT_Load_Metrics_Func)( TT_Face face,
+ FT_Stream stream,
+ FT_Bool vertical );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* TT_Get_Metrics_Func */
+ /* */
+ /* <Description> */
+ /* Load the horizontal or vertical header in a face object. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the target face object. */
+ /* */
+ /* stream :: The input stream. */
+ /* */
+ /* vertical :: A boolean flag. If set, load vertical metrics. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ typedef FT_Error
+ (*TT_Get_Metrics_Func)( TT_Face face,
+ FT_Bool vertical,
+ FT_UInt gindex,
+ FT_Short* abearing,
+ FT_UShort* aadvance );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* TT_Load_Table_Func */
+ /* */
+ /* <Description> */
+ /* Load a given TrueType table. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the target face object. */
+ /* */
+ /* stream :: The input stream. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ /* <Note> */
+ /* The function uses `face->goto_table' to seek the stream to the */
+ /* start of the table, except while loading the font directory. */
+ /* */
+ typedef FT_Error
+ (*TT_Load_Table_Func)( TT_Face face,
+ FT_Stream stream );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* TT_Free_Table_Func */
+ /* */
+ /* <Description> */
+ /* Free a given TrueType table. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the target face object. */
+ /* */
+ typedef void
+ (*TT_Free_Table_Func)( TT_Face face );
+
+
+ /*
+ * @functype:
+ * TT_Face_GetKerningFunc
+ *
+ * @description:
+ * Return the horizontal kerning value between two glyphs.
+ *
+ * @input:
+ * face :: A handle to the source face object.
+ * left_glyph :: The left glyph index.
+ * right_glyph :: The right glyph index.
+ *
+ * @return:
+ * The kerning value in font units.
+ */
+ typedef FT_Int
+ (*TT_Face_GetKerningFunc)( TT_Face face,
+ FT_UInt left_glyph,
+ FT_UInt right_glyph );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* SFNT_Interface */
+ /* */
+ /* <Description> */
+ /* This structure holds pointers to the functions used to load and */
+ /* free the basic tables that are required in a `sfnt' font file. */
+ /* */
+ /* <Fields> */
+ /* Check the various xxx_Func() descriptions for details. */
+ /* */
+ typedef struct SFNT_Interface_
+ {
+ TT_Loader_GotoTableFunc goto_table;
+
+ TT_Init_Face_Func init_face;
+ TT_Load_Face_Func load_face;
+ TT_Done_Face_Func done_face;
+ FT_Module_Requester get_interface;
+
+ TT_Load_Any_Func load_any;
+
+ /* these functions are called by `load_face' but they can also */
+ /* be called from external modules, if there is a need to do so */
+ TT_Load_Table_Func load_head;
+ TT_Load_Metrics_Func load_hhea;
+ TT_Load_Table_Func load_cmap;
+ TT_Load_Table_Func load_maxp;
+ TT_Load_Table_Func load_os2;
+ TT_Load_Table_Func load_post;
+
+ TT_Load_Table_Func load_name;
+ TT_Free_Table_Func free_name;
+
+ /* this field was called `load_kerning' up to version 2.1.10 */
+ TT_Load_Table_Func load_kern;
+
+ TT_Load_Table_Func load_gasp;
+ TT_Load_Table_Func load_pclt;
+
+ /* see `ttload.h'; this field was called `load_bitmap_header' up to */
+ /* version 2.1.10 */
+ TT_Load_Table_Func load_bhed;
+
+ TT_Load_SBit_Image_Func load_sbit_image;
+
+ /* see `ttpost.h' */
+ TT_Get_PS_Name_Func get_psname;
+ TT_Free_Table_Func free_psnames;
+
+ /* starting here, the structure differs from version 2.1.7 */
+
+ /* this field was introduced in version 2.1.8, named `get_psname' */
+ TT_Face_GetKerningFunc get_kerning;
+
+ /* new elements introduced after version 2.1.10 */
+
+ /* load the font directory, i.e., the offset table and */
+ /* the table directory */
+ TT_Load_Table_Func load_font_dir;
+ TT_Load_Metrics_Func load_hmtx;
+
+ TT_Load_Table_Func load_eblc;
+ TT_Free_Table_Func free_eblc;
+
+ TT_Set_SBit_Strike_Func set_sbit_strike;
+ TT_Load_Strike_Metrics_Func load_strike_metrics;
+
+ TT_Get_Metrics_Func get_metrics;
+
+ } SFNT_Interface;
+
+
+ /* transitional */
+ typedef SFNT_Interface* SFNT_Service;
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SFNT_INTERFACE( \
+ class_, \
+ goto_table_, \
+ init_face_, \
+ load_face_, \
+ done_face_, \
+ get_interface_, \
+ load_any_, \
+ load_head_, \
+ load_hhea_, \
+ load_cmap_, \
+ load_maxp_, \
+ load_os2_, \
+ load_post_, \
+ load_name_, \
+ free_name_, \
+ load_kern_, \
+ load_gasp_, \
+ load_pclt_, \
+ load_bhed_, \
+ load_sbit_image_, \
+ get_psname_, \
+ free_psnames_, \
+ get_kerning_, \
+ load_font_dir_, \
+ load_hmtx_, \
+ load_eblc_, \
+ free_eblc_, \
+ set_sbit_strike_, \
+ load_strike_metrics_, \
+ get_metrics_ ) \
+ static const SFNT_Interface class_ = \
+ { \
+ goto_table_, \
+ init_face_, \
+ load_face_, \
+ done_face_, \
+ get_interface_, \
+ load_any_, \
+ load_head_, \
+ load_hhea_, \
+ load_cmap_, \
+ load_maxp_, \
+ load_os2_, \
+ load_post_, \
+ load_name_, \
+ free_name_, \
+ load_kern_, \
+ load_gasp_, \
+ load_pclt_, \
+ load_bhed_, \
+ load_sbit_image_, \
+ get_psname_, \
+ free_psnames_, \
+ get_kerning_, \
+ load_font_dir_, \
+ load_hmtx_, \
+ load_eblc_, \
+ free_eblc_, \
+ set_sbit_strike_, \
+ load_strike_metrics_, \
+ get_metrics_, \
+ };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_INTERNAL( a, a_ ) \
+ clazz->a = a_;
+
+#define FT_DEFINE_SFNT_INTERFACE( \
+ class_, \
+ goto_table_, \
+ init_face_, \
+ load_face_, \
+ done_face_, \
+ get_interface_, \
+ load_any_, \
+ load_head_, \
+ load_hhea_, \
+ load_cmap_, \
+ load_maxp_, \
+ load_os2_, \
+ load_post_, \
+ load_name_, \
+ free_name_, \
+ load_kern_, \
+ load_gasp_, \
+ load_pclt_, \
+ load_bhed_, \
+ load_sbit_image_, \
+ get_psname_, \
+ free_psnames_, \
+ get_kerning_, \
+ load_font_dir_, \
+ load_hmtx_, \
+ load_eblc_, \
+ free_eblc_, \
+ set_sbit_strike_, \
+ load_strike_metrics_, \
+ get_metrics_ ) \
+ void \
+ FT_Init_Class_ ## class_( FT_Library library, \
+ SFNT_Interface* clazz ) \
+ { \
+ FT_UNUSED( library ); \
+ \
+ clazz->goto_table = goto_table_; \
+ clazz->init_face = init_face_; \
+ clazz->load_face = load_face_; \
+ clazz->done_face = done_face_; \
+ clazz->get_interface = get_interface_; \
+ clazz->load_any = load_any_; \
+ clazz->load_head = load_head_; \
+ clazz->load_hhea = load_hhea_; \
+ clazz->load_cmap = load_cmap_; \
+ clazz->load_maxp = load_maxp_; \
+ clazz->load_os2 = load_os2_; \
+ clazz->load_post = load_post_; \
+ clazz->load_name = load_name_; \
+ clazz->free_name = free_name_; \
+ clazz->load_kern = load_kern_; \
+ clazz->load_gasp = load_gasp_; \
+ clazz->load_pclt = load_pclt_; \
+ clazz->load_bhed = load_bhed_; \
+ clazz->load_sbit_image = load_sbit_image_; \
+ clazz->get_psname = get_psname_; \
+ clazz->free_psnames = free_psnames_; \
+ clazz->get_kerning = get_kerning_; \
+ clazz->load_font_dir = load_font_dir_; \
+ clazz->load_hmtx = load_hmtx_; \
+ clazz->load_eblc = load_eblc_; \
+ clazz->free_eblc = free_eblc_; \
+ clazz->set_sbit_strike = set_sbit_strike_; \
+ clazz->load_strike_metrics = load_strike_metrics_; \
+ clazz->get_metrics = get_metrics_; \
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+FT_END_HEADER
+
+#endif /* __SFNT_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/t1types.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/t1types.h
new file mode 100644
index 0000000000..36deec80d0
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/t1types.h
@@ -0,0 +1,255 @@
+/***************************************************************************/
+/* */
+/* t1types.h */
+/* */
+/* Basic Type1/Type2 type definitions and interface (specification */
+/* only). */
+/* */
+/* Copyright 1996-2004, 2006, 2008, 2009, 2011, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __T1TYPES_H__
+#define __T1TYPES_H__
+
+
+#include "../../ft2build.h"
+#include "../t1tables.h"
+#include "pshints.h"
+#include "ftserv.h"
+#include "services/svpscmap.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*** ***/
+ /*** ***/
+ /*** REQUIRED TYPE1/TYPE2 TABLES DEFINITIONS ***/
+ /*** ***/
+ /*** ***/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* T1_EncodingRec */
+ /* */
+ /* <Description> */
+ /* A structure modeling a custom encoding. */
+ /* */
+ /* <Fields> */
+ /* num_chars :: The number of character codes in the encoding. */
+ /* Usually 256. */
+ /* */
+ /* code_first :: The lowest valid character code in the encoding. */
+ /* */
+ /* code_last :: The highest valid character code in the encoding */
+ /* + 1. When equal to code_first there are no valid */
+ /* character codes. */
+ /* */
+ /* char_index :: An array of corresponding glyph indices. */
+ /* */
+ /* char_name :: An array of corresponding glyph names. */
+ /* */
+ typedef struct T1_EncodingRecRec_
+ {
+ FT_Int num_chars;
+ FT_Int code_first;
+ FT_Int code_last;
+
+ FT_UShort* char_index;
+ FT_String** char_name;
+
+ } T1_EncodingRec, *T1_Encoding;
+
+
+ /* used to hold extra data of PS_FontInfoRec that
+ * cannot be stored in the publicly defined structure.
+ *
+ * Note these can't be blended with multiple-masters.
+ */
+ typedef struct PS_FontExtraRec_
+ {
+ FT_UShort fs_type;
+
+ } PS_FontExtraRec;
+
+
+ typedef struct T1_FontRec_
+ {
+ PS_FontInfoRec font_info; /* font info dictionary */
+ PS_FontExtraRec font_extra; /* font info extra fields */
+ PS_PrivateRec private_dict; /* private dictionary */
+ FT_String* font_name; /* top-level dictionary */
+
+ T1_EncodingType encoding_type;
+ T1_EncodingRec encoding;
+
+ FT_Byte* subrs_block;
+ FT_Byte* charstrings_block;
+ FT_Byte* glyph_names_block;
+
+ FT_Int num_subrs;
+ FT_Byte** subrs;
+ FT_PtrDist* subrs_len;
+
+ FT_Int num_glyphs;
+ FT_String** glyph_names; /* array of glyph names */
+ FT_Byte** charstrings; /* array of glyph charstrings */
+ FT_PtrDist* charstrings_len;
+
+ FT_Byte paint_type;
+ FT_Byte font_type;
+ FT_Matrix font_matrix;
+ FT_Vector font_offset;
+ FT_BBox font_bbox;
+ FT_Long font_id;
+
+ FT_Fixed stroke_width;
+
+ } T1_FontRec, *T1_Font;
+
+
+ typedef struct CID_SubrsRec_
+ {
+ FT_UInt num_subrs;
+ FT_Byte** code;
+
+ } CID_SubrsRec, *CID_Subrs;
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*** ***/
+ /*** ***/
+ /*** AFM FONT INFORMATION STRUCTURES ***/
+ /*** ***/
+ /*** ***/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ typedef struct AFM_TrackKernRec_
+ {
+ FT_Int degree;
+ FT_Fixed min_ptsize;
+ FT_Fixed min_kern;
+ FT_Fixed max_ptsize;
+ FT_Fixed max_kern;
+
+ } AFM_TrackKernRec, *AFM_TrackKern;
+
+ typedef struct AFM_KernPairRec_
+ {
+ FT_Int index1;
+ FT_Int index2;
+ FT_Int x;
+ FT_Int y;
+
+ } AFM_KernPairRec, *AFM_KernPair;
+
+ typedef struct AFM_FontInfoRec_
+ {
+ FT_Bool IsCIDFont;
+ FT_BBox FontBBox;
+ FT_Fixed Ascender;
+ FT_Fixed Descender;
+ AFM_TrackKern TrackKerns; /* free if non-NULL */
+ FT_Int NumTrackKern;
+ AFM_KernPair KernPairs; /* free if non-NULL */
+ FT_Int NumKernPair;
+
+ } AFM_FontInfoRec, *AFM_FontInfo;
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*** ***/
+ /*** ***/
+ /*** ORIGINAL T1_FACE CLASS DEFINITION ***/
+ /*** ***/
+ /*** ***/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ typedef struct T1_FaceRec_* T1_Face;
+ typedef struct CID_FaceRec_* CID_Face;
+
+
+ typedef struct T1_FaceRec_
+ {
+ FT_FaceRec root;
+ T1_FontRec type1;
+ const void* psnames;
+ const void* psaux;
+ const void* afm_data;
+ FT_CharMapRec charmaprecs[2];
+ FT_CharMap charmaps[2];
+
+ /* support for Multiple Masters fonts */
+ PS_Blend blend;
+
+ /* undocumented, optional: indices of subroutines that express */
+ /* the NormalizeDesignVector and the ConvertDesignVector procedure, */
+ /* respectively, as Type 2 charstrings; -1 if keywords not present */
+ FT_Int ndv_idx;
+ FT_Int cdv_idx;
+
+ /* undocumented, optional: has the same meaning as len_buildchar */
+ /* for Type 2 fonts; manipulated by othersubrs 19, 24, and 25 */
+ FT_UInt len_buildchar;
+ FT_Long* buildchar;
+
+ /* since version 2.1 - interface to PostScript hinter */
+ const void* pshinter;
+
+ } T1_FaceRec;
+
+
+ typedef struct CID_FaceRec_
+ {
+ FT_FaceRec root;
+ void* psnames;
+ void* psaux;
+ CID_FaceInfoRec cid;
+ PS_FontExtraRec font_extra;
+#if 0
+ void* afm_data;
+#endif
+ CID_Subrs subrs;
+
+ /* since version 2.1 - interface to PostScript hinter */
+ void* pshinter;
+
+ /* since version 2.1.8, but was originally positioned after `afm_data' */
+ FT_Byte* binary_data; /* used if hex data has been converted */
+ FT_Stream cid_stream;
+
+ } CID_FaceRec;
+
+
+FT_END_HEADER
+
+#endif /* __T1TYPES_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/tttypes.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/tttypes.h
new file mode 100644
index 0000000000..d6c1d62852
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/internal/tttypes.h
@@ -0,0 +1,1440 @@
+/***************************************************************************/
+/* */
+/* tttypes.h */
+/* */
+/* Basic SFNT/TrueType type definitions and interface (specification */
+/* only). */
+/* */
+/* Copyright 1996-2002, 2004-2008, 2012-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __TTTYPES_H__
+#define __TTTYPES_H__
+
+
+#include "../../ft2build.h"
+#include "../tttables.h"
+#include "ftobjs.h"
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+#include "../ftmm.h"
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*** ***/
+ /*** ***/
+ /*** REQUIRED TRUETYPE/OPENTYPE TABLES DEFINITIONS ***/
+ /*** ***/
+ /*** ***/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TTC_HeaderRec */
+ /* */
+ /* <Description> */
+ /* TrueType collection header. This table contains the offsets of */
+ /* the font headers of each distinct TrueType face in the file. */
+ /* */
+ /* <Fields> */
+ /* tag :: Must be `ttc ' to indicate a TrueType collection. */
+ /* */
+ /* version :: The version number. */
+ /* */
+ /* count :: The number of faces in the collection. The */
+ /* specification says this should be an unsigned long, but */
+ /* we use a signed long since we need the value -1 for */
+ /* specific purposes. */
+ /* */
+ /* offsets :: The offsets of the font headers, one per face. */
+ /* */
+ typedef struct TTC_HeaderRec_
+ {
+ FT_ULong tag;
+ FT_Fixed version;
+ FT_Long count;
+ FT_ULong* offsets;
+
+ } TTC_HeaderRec;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* SFNT_HeaderRec */
+ /* */
+ /* <Description> */
+ /* SFNT file format header. */
+ /* */
+ /* <Fields> */
+ /* format_tag :: The font format tag. */
+ /* */
+ /* num_tables :: The number of tables in file. */
+ /* */
+ /* search_range :: Must be `16 * (max power of 2 <= num_tables)'. */
+ /* */
+ /* entry_selector :: Must be log2 of `search_range / 16'. */
+ /* */
+ /* range_shift :: Must be `num_tables * 16 - search_range'. */
+ /* */
+ typedef struct SFNT_HeaderRec_
+ {
+ FT_ULong format_tag;
+ FT_UShort num_tables;
+ FT_UShort search_range;
+ FT_UShort entry_selector;
+ FT_UShort range_shift;
+
+ FT_ULong offset; /* not in file */
+
+ } SFNT_HeaderRec, *SFNT_Header;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_TableRec */
+ /* */
+ /* <Description> */
+ /* This structure describes a given table of a TrueType font. */
+ /* */
+ /* <Fields> */
+ /* Tag :: A four-bytes tag describing the table. */
+ /* */
+ /* CheckSum :: The table checksum. This value can be ignored. */
+ /* */
+ /* Offset :: The offset of the table from the start of the TrueType */
+ /* font in its resource. */
+ /* */
+ /* Length :: The table length (in bytes). */
+ /* */
+ typedef struct TT_TableRec_
+ {
+ FT_ULong Tag; /* table type */
+ FT_ULong CheckSum; /* table checksum */
+ FT_ULong Offset; /* table file offset */
+ FT_ULong Length; /* table length */
+
+ } TT_TableRec, *TT_Table;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_LongMetricsRec */
+ /* */
+ /* <Description> */
+ /* A structure modeling the long metrics of the `hmtx' and `vmtx' */
+ /* TrueType tables. The values are expressed in font units. */
+ /* */
+ /* <Fields> */
+ /* advance :: The advance width or height for the glyph. */
+ /* */
+ /* bearing :: The left-side or top-side bearing for the glyph. */
+ /* */
+ typedef struct TT_LongMetricsRec_
+ {
+ FT_UShort advance;
+ FT_Short bearing;
+
+ } TT_LongMetricsRec, *TT_LongMetrics;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* TT_ShortMetrics */
+ /* */
+ /* <Description> */
+ /* A simple type to model the short metrics of the `hmtx' and `vmtx' */
+ /* tables. */
+ /* */
+ typedef FT_Short TT_ShortMetrics;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_NameEntryRec */
+ /* */
+ /* <Description> */
+ /* A structure modeling TrueType name records. Name records are used */
+ /* to store important strings like family name, style name, */
+ /* copyright, etc. in _localized_ versions (i.e., language, encoding, */
+ /* etc). */
+ /* */
+ /* <Fields> */
+ /* platformID :: The ID of the name's encoding platform. */
+ /* */
+ /* encodingID :: The platform-specific ID for the name's encoding. */
+ /* */
+ /* languageID :: The platform-specific ID for the name's language. */
+ /* */
+ /* nameID :: The ID specifying what kind of name this is. */
+ /* */
+ /* stringLength :: The length of the string in bytes. */
+ /* */
+ /* stringOffset :: The offset to the string in the `name' table. */
+ /* */
+ /* string :: A pointer to the string's bytes. Note that these */
+ /* are usually UTF-16 encoded characters. */
+ /* */
+ typedef struct TT_NameEntryRec_
+ {
+ FT_UShort platformID;
+ FT_UShort encodingID;
+ FT_UShort languageID;
+ FT_UShort nameID;
+ FT_UShort stringLength;
+ FT_ULong stringOffset;
+
+ /* this last field is not defined in the spec */
+ /* but used by the FreeType engine */
+
+ FT_Byte* string;
+
+ } TT_NameEntryRec, *TT_NameEntry;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_NameTableRec */
+ /* */
+ /* <Description> */
+ /* A structure modeling the TrueType name table. */
+ /* */
+ /* <Fields> */
+ /* format :: The format of the name table. */
+ /* */
+ /* numNameRecords :: The number of names in table. */
+ /* */
+ /* storageOffset :: The offset of the name table in the `name' */
+ /* TrueType table. */
+ /* */
+ /* names :: An array of name records. */
+ /* */
+ /* stream :: the file's input stream. */
+ /* */
+ typedef struct TT_NameTableRec_
+ {
+ FT_UShort format;
+ FT_UInt numNameRecords;
+ FT_UInt storageOffset;
+ TT_NameEntryRec* names;
+ FT_Stream stream;
+
+ } TT_NameTableRec, *TT_NameTable;
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*** ***/
+ /*** ***/
+ /*** OPTIONAL TRUETYPE/OPENTYPE TABLES DEFINITIONS ***/
+ /*** ***/
+ /*** ***/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_GaspRangeRec */
+ /* */
+ /* <Description> */
+ /* A tiny structure used to model a gasp range according to the */
+ /* TrueType specification. */
+ /* */
+ /* <Fields> */
+ /* maxPPEM :: The maximum ppem value to which `gaspFlag' applies. */
+ /* */
+ /* gaspFlag :: A flag describing the grid-fitting and anti-aliasing */
+ /* modes to be used. */
+ /* */
+ typedef struct TT_GaspRangeRec_
+ {
+ FT_UShort maxPPEM;
+ FT_UShort gaspFlag;
+
+ } TT_GaspRangeRec, *TT_GaspRange;
+
+
+#define TT_GASP_GRIDFIT 0x01
+#define TT_GASP_DOGRAY 0x02
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_GaspRec */
+ /* */
+ /* <Description> */
+ /* A structure modeling the TrueType `gasp' table used to specify */
+ /* grid-fitting and anti-aliasing behaviour. */
+ /* */
+ /* <Fields> */
+ /* version :: The version number. */
+ /* */
+ /* numRanges :: The number of gasp ranges in table. */
+ /* */
+ /* gaspRanges :: An array of gasp ranges. */
+ /* */
+ typedef struct TT_Gasp_
+ {
+ FT_UShort version;
+ FT_UShort numRanges;
+ TT_GaspRange gaspRanges;
+
+ } TT_GaspRec;
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*** ***/
+ /*** ***/
+ /*** EMBEDDED BITMAPS SUPPORT ***/
+ /*** ***/
+ /*** ***/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_SBit_MetricsRec */
+ /* */
+ /* <Description> */
+ /* A structure used to hold the big metrics of a given glyph bitmap */
+ /* in a TrueType or OpenType font. These are usually found in the */
+ /* `EBDT' (Microsoft) or `bloc' (Apple) table. */
+ /* */
+ /* <Fields> */
+ /* height :: The glyph height in pixels. */
+ /* */
+ /* width :: The glyph width in pixels. */
+ /* */
+ /* horiBearingX :: The horizontal left bearing. */
+ /* */
+ /* horiBearingY :: The horizontal top bearing. */
+ /* */
+ /* horiAdvance :: The horizontal advance. */
+ /* */
+ /* vertBearingX :: The vertical left bearing. */
+ /* */
+ /* vertBearingY :: The vertical top bearing. */
+ /* */
+ /* vertAdvance :: The vertical advance. */
+ /* */
+ typedef struct TT_SBit_MetricsRec_
+ {
+ FT_Byte height;
+ FT_Byte width;
+
+ FT_Char horiBearingX;
+ FT_Char horiBearingY;
+ FT_Byte horiAdvance;
+
+ FT_Char vertBearingX;
+ FT_Char vertBearingY;
+ FT_Byte vertAdvance;
+
+ } TT_SBit_MetricsRec, *TT_SBit_Metrics;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_SBit_SmallMetricsRec */
+ /* */
+ /* <Description> */
+ /* A structure used to hold the small metrics of a given glyph bitmap */
+ /* in a TrueType or OpenType font. These are usually found in the */
+ /* `EBDT' (Microsoft) or the `bdat' (Apple) table. */
+ /* */
+ /* <Fields> */
+ /* height :: The glyph height in pixels. */
+ /* */
+ /* width :: The glyph width in pixels. */
+ /* */
+ /* bearingX :: The left-side bearing. */
+ /* */
+ /* bearingY :: The top-side bearing. */
+ /* */
+ /* advance :: The advance width or height. */
+ /* */
+ typedef struct TT_SBit_Small_Metrics_
+ {
+ FT_Byte height;
+ FT_Byte width;
+
+ FT_Char bearingX;
+ FT_Char bearingY;
+ FT_Byte advance;
+
+ } TT_SBit_SmallMetricsRec, *TT_SBit_SmallMetrics;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_SBit_LineMetricsRec */
+ /* */
+ /* <Description> */
+ /* A structure used to describe the text line metrics of a given */
+ /* bitmap strike, for either a horizontal or vertical layout. */
+ /* */
+ /* <Fields> */
+ /* ascender :: The ascender in pixels. */
+ /* */
+ /* descender :: The descender in pixels. */
+ /* */
+ /* max_width :: The maximum glyph width in pixels. */
+ /* */
+ /* caret_slope_enumerator :: Rise of the caret slope, typically set */
+ /* to 1 for non-italic fonts. */
+ /* */
+ /* caret_slope_denominator :: Rise of the caret slope, typically set */
+ /* to 0 for non-italic fonts. */
+ /* */
+ /* caret_offset :: Offset in pixels to move the caret for */
+ /* proper positioning. */
+ /* */
+ /* min_origin_SB :: Minimum of horiBearingX (resp. */
+ /* vertBearingY). */
+ /* min_advance_SB :: Minimum of */
+ /* */
+ /* horizontal advance - */
+ /* ( horiBearingX + width ) */
+ /* */
+ /* resp. */
+ /* */
+ /* vertical advance - */
+ /* ( vertBearingY + height ) */
+ /* */
+ /* max_before_BL :: Maximum of horiBearingY (resp. */
+ /* vertBearingY). */
+ /* */
+ /* min_after_BL :: Minimum of */
+ /* */
+ /* horiBearingY - height */
+ /* */
+ /* resp. */
+ /* */
+ /* vertBearingX - width */
+ /* */
+ /* pads :: Unused (to make the size of the record */
+ /* a multiple of 32 bits. */
+ /* */
+ typedef struct TT_SBit_LineMetricsRec_
+ {
+ FT_Char ascender;
+ FT_Char descender;
+ FT_Byte max_width;
+ FT_Char caret_slope_numerator;
+ FT_Char caret_slope_denominator;
+ FT_Char caret_offset;
+ FT_Char min_origin_SB;
+ FT_Char min_advance_SB;
+ FT_Char max_before_BL;
+ FT_Char min_after_BL;
+ FT_Char pads[2];
+
+ } TT_SBit_LineMetricsRec, *TT_SBit_LineMetrics;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_SBit_RangeRec */
+ /* */
+ /* <Description> */
+ /* A TrueType/OpenType subIndexTable as defined in the `EBLC' */
+ /* (Microsoft) or `bloc' (Apple) tables. */
+ /* */
+ /* <Fields> */
+ /* first_glyph :: The first glyph index in the range. */
+ /* */
+ /* last_glyph :: The last glyph index in the range. */
+ /* */
+ /* index_format :: The format of index table. Valid values are 1 */
+ /* to 5. */
+ /* */
+ /* image_format :: The format of `EBDT' image data. */
+ /* */
+ /* image_offset :: The offset to image data in `EBDT'. */
+ /* */
+ /* image_size :: For index formats 2 and 5. This is the size in */
+ /* bytes of each glyph bitmap. */
+ /* */
+ /* big_metrics :: For index formats 2 and 5. This is the big */
+ /* metrics for each glyph bitmap. */
+ /* */
+ /* num_glyphs :: For index formats 4 and 5. This is the number of */
+ /* glyphs in the code array. */
+ /* */
+ /* glyph_offsets :: For index formats 1 and 3. */
+ /* */
+ /* glyph_codes :: For index formats 4 and 5. */
+ /* */
+ /* table_offset :: The offset of the index table in the `EBLC' */
+ /* table. Only used during strike loading. */
+ /* */
+ typedef struct TT_SBit_RangeRec_
+ {
+ FT_UShort first_glyph;
+ FT_UShort last_glyph;
+
+ FT_UShort index_format;
+ FT_UShort image_format;
+ FT_ULong image_offset;
+
+ FT_ULong image_size;
+ TT_SBit_MetricsRec metrics;
+ FT_ULong num_glyphs;
+
+ FT_ULong* glyph_offsets;
+ FT_UShort* glyph_codes;
+
+ FT_ULong table_offset;
+
+ } TT_SBit_RangeRec, *TT_SBit_Range;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_SBit_StrikeRec */
+ /* */
+ /* <Description> */
+ /* A structure used describe a given bitmap strike in the `EBLC' */
+ /* (Microsoft) or `bloc' (Apple) tables. */
+ /* */
+ /* <Fields> */
+ /* num_index_ranges :: The number of index ranges. */
+ /* */
+ /* index_ranges :: An array of glyph index ranges. */
+ /* */
+ /* color_ref :: Unused. `color_ref' is put in for future */
+ /* enhancements, but these fields are already */
+ /* in use by other platforms (e.g. Newton). */
+ /* For details, please see */
+ /* */
+ /* http://fonts.apple.com/ */
+ /* TTRefMan/RM06/Chap6bloc.html */
+ /* */
+ /* hori :: The line metrics for horizontal layouts. */
+ /* */
+ /* vert :: The line metrics for vertical layouts. */
+ /* */
+ /* start_glyph :: The lowest glyph index for this strike. */
+ /* */
+ /* end_glyph :: The highest glyph index for this strike. */
+ /* */
+ /* x_ppem :: The number of horizontal pixels per EM. */
+ /* */
+ /* y_ppem :: The number of vertical pixels per EM. */
+ /* */
+ /* bit_depth :: The bit depth. Valid values are 1, 2, 4, */
+ /* and 8. */
+ /* */
+ /* flags :: Is this a vertical or horizontal strike? For */
+ /* details, please see */
+ /* */
+ /* http://fonts.apple.com/ */
+ /* TTRefMan/RM06/Chap6bloc.html */
+ /* */
+ typedef struct TT_SBit_StrikeRec_
+ {
+ FT_Int num_ranges;
+ TT_SBit_Range sbit_ranges;
+ FT_ULong ranges_offset;
+
+ FT_ULong color_ref;
+
+ TT_SBit_LineMetricsRec hori;
+ TT_SBit_LineMetricsRec vert;
+
+ FT_UShort start_glyph;
+ FT_UShort end_glyph;
+
+ FT_Byte x_ppem;
+ FT_Byte y_ppem;
+
+ FT_Byte bit_depth;
+ FT_Char flags;
+
+ } TT_SBit_StrikeRec, *TT_SBit_Strike;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_SBit_ComponentRec */
+ /* */
+ /* <Description> */
+ /* A simple structure to describe a compound sbit element. */
+ /* */
+ /* <Fields> */
+ /* glyph_code :: The element's glyph index. */
+ /* */
+ /* x_offset :: The element's left bearing. */
+ /* */
+ /* y_offset :: The element's top bearing. */
+ /* */
+ typedef struct TT_SBit_ComponentRec_
+ {
+ FT_UShort glyph_code;
+ FT_Char x_offset;
+ FT_Char y_offset;
+
+ } TT_SBit_ComponentRec, *TT_SBit_Component;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_SBit_ScaleRec */
+ /* */
+ /* <Description> */
+ /* A structure used describe a given bitmap scaling table, as defined */
+ /* in the `EBSC' table. */
+ /* */
+ /* <Fields> */
+ /* hori :: The horizontal line metrics. */
+ /* */
+ /* vert :: The vertical line metrics. */
+ /* */
+ /* x_ppem :: The number of horizontal pixels per EM. */
+ /* */
+ /* y_ppem :: The number of vertical pixels per EM. */
+ /* */
+ /* x_ppem_substitute :: Substitution x_ppem value. */
+ /* */
+ /* y_ppem_substitute :: Substitution y_ppem value. */
+ /* */
+ typedef struct TT_SBit_ScaleRec_
+ {
+ TT_SBit_LineMetricsRec hori;
+ TT_SBit_LineMetricsRec vert;
+
+ FT_Byte x_ppem;
+ FT_Byte y_ppem;
+
+ FT_Byte x_ppem_substitute;
+ FT_Byte y_ppem_substitute;
+
+ } TT_SBit_ScaleRec, *TT_SBit_Scale;
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*** ***/
+ /*** ***/
+ /*** POSTSCRIPT GLYPH NAMES SUPPORT ***/
+ /*** ***/
+ /*** ***/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_Post_20Rec */
+ /* */
+ /* <Description> */
+ /* Postscript names sub-table, format 2.0. Stores the PS name of */
+ /* each glyph in the font face. */
+ /* */
+ /* <Fields> */
+ /* num_glyphs :: The number of named glyphs in the table. */
+ /* */
+ /* num_names :: The number of PS names stored in the table. */
+ /* */
+ /* glyph_indices :: The indices of the glyphs in the names arrays. */
+ /* */
+ /* glyph_names :: The PS names not in Mac Encoding. */
+ /* */
+ typedef struct TT_Post_20Rec_
+ {
+ FT_UShort num_glyphs;
+ FT_UShort num_names;
+ FT_UShort* glyph_indices;
+ FT_Char** glyph_names;
+
+ } TT_Post_20Rec, *TT_Post_20;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_Post_25Rec */
+ /* */
+ /* <Description> */
+ /* Postscript names sub-table, format 2.5. Stores the PS name of */
+ /* each glyph in the font face. */
+ /* */
+ /* <Fields> */
+ /* num_glyphs :: The number of glyphs in the table. */
+ /* */
+ /* offsets :: An array of signed offsets in a normal Mac */
+ /* Postscript name encoding. */
+ /* */
+ typedef struct TT_Post_25_
+ {
+ FT_UShort num_glyphs;
+ FT_Char* offsets;
+
+ } TT_Post_25Rec, *TT_Post_25;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_Post_NamesRec */
+ /* */
+ /* <Description> */
+ /* Postscript names table, either format 2.0 or 2.5. */
+ /* */
+ /* <Fields> */
+ /* loaded :: A flag to indicate whether the PS names are loaded. */
+ /* */
+ /* format_20 :: The sub-table used for format 2.0. */
+ /* */
+ /* format_25 :: The sub-table used for format 2.5. */
+ /* */
+ typedef struct TT_Post_NamesRec_
+ {
+ FT_Bool loaded;
+
+ union
+ {
+ TT_Post_20Rec format_20;
+ TT_Post_25Rec format_25;
+
+ } names;
+
+ } TT_Post_NamesRec, *TT_Post_Names;
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*** ***/
+ /*** ***/
+ /*** GX VARIATION TABLE SUPPORT ***/
+ /*** ***/
+ /*** ***/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+ typedef struct GX_BlendRec_ *GX_Blend;
+#endif
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*** ***/
+ /*** ***/
+ /*** EMBEDDED BDF PROPERTIES TABLE SUPPORT ***/
+ /*** ***/
+ /*** ***/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /*
+ * These types are used to support a `BDF ' table that isn't part of the
+ * official TrueType specification. It is mainly used in SFNT-based
+ * bitmap fonts that were generated from a set of BDF fonts.
+ *
+ * The format of the table is as follows.
+ *
+ * USHORT version `BDF ' table version number, should be 0x0001.
+ * USHORT strikeCount Number of strikes (bitmap sizes) in this table.
+ * ULONG stringTable Offset (from start of BDF table) to string
+ * table.
+ *
+ * This is followed by an array of `strikeCount' descriptors, having the
+ * following format.
+ *
+ * USHORT ppem Vertical pixels per EM for this strike.
+ * USHORT numItems Number of items for this strike (properties and
+ * atoms). Maximum is 255.
+ *
+ * This array in turn is followed by `strikeCount' value sets. Each
+ * `value set' is an array of `numItems' items with the following format.
+ *
+ * ULONG item_name Offset in string table to item name.
+ * USHORT item_type The item type. Possible values are
+ * 0 => string (e.g., COMMENT)
+ * 1 => atom (e.g., FONT or even SIZE)
+ * 2 => int32
+ * 3 => uint32
+ * 0x10 => A flag to indicate a properties. This
+ * is ORed with the above values.
+ * ULONG item_value For strings => Offset into string table without
+ * the corresponding double quotes.
+ * For atoms => Offset into string table.
+ * For integers => Direct value.
+ *
+ * All strings in the string table consist of bytes and are
+ * zero-terminated.
+ *
+ */
+
+#ifdef TT_CONFIG_OPTION_BDF
+
+ typedef struct TT_BDFRec_
+ {
+ FT_Byte* table;
+ FT_Byte* table_end;
+ FT_Byte* strings;
+ FT_ULong strings_size;
+ FT_UInt num_strikes;
+ FT_Bool loaded;
+
+ } TT_BDFRec, *TT_BDF;
+
+#endif /* TT_CONFIG_OPTION_BDF */
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*** ***/
+ /*** ***/
+ /*** ORIGINAL TT_FACE CLASS DEFINITION ***/
+ /*** ***/
+ /*** ***/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* This structure/class is defined here because it is common to the */
+ /* following formats: TTF, OpenType-TT, and OpenType-CFF. */
+ /* */
+ /* Note, however, that the classes TT_Size and TT_GlyphSlot are not */
+ /* shared between font drivers, and are thus defined in `ttobjs.h'. */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* TT_Face */
+ /* */
+ /* <Description> */
+ /* A handle to a TrueType face/font object. A TT_Face encapsulates */
+ /* the resolution and scaling independent parts of a TrueType font */
+ /* resource. */
+ /* */
+ /* <Note> */
+ /* The TT_Face structure is also used as a `parent class' for the */
+ /* OpenType-CFF class (T2_Face). */
+ /* */
+ typedef struct TT_FaceRec_* TT_Face;
+
+
+ /* a function type used for the truetype bytecode interpreter hooks */
+ typedef FT_Error
+ (*TT_Interpreter)( void* exec_context );
+
+ /* forward declaration */
+ typedef struct TT_LoaderRec_* TT_Loader;
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* TT_Loader_GotoTableFunc */
+ /* */
+ /* <Description> */
+ /* Seeks a stream to the start of a given TrueType table. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the target face object. */
+ /* */
+ /* tag :: A 4-byte tag used to name the table. */
+ /* */
+ /* stream :: The input stream. */
+ /* */
+ /* <Output> */
+ /* length :: The length of the table in bytes. Set to 0 if not */
+ /* needed. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ /* <Note> */
+ /* The stream cursor must be at the font file's origin. */
+ /* */
+ typedef FT_Error
+ (*TT_Loader_GotoTableFunc)( TT_Face face,
+ FT_ULong tag,
+ FT_Stream stream,
+ FT_ULong* length );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* TT_Loader_StartGlyphFunc */
+ /* */
+ /* <Description> */
+ /* Seeks a stream to the start of a given glyph element, and opens a */
+ /* frame for it. */
+ /* */
+ /* <Input> */
+ /* loader :: The current TrueType glyph loader object. */
+ /* */
+ /* glyph index :: The index of the glyph to access. */
+ /* */
+ /* offset :: The offset of the glyph according to the */
+ /* `locations' table. */
+ /* */
+ /* byte_count :: The size of the frame in bytes. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ /* <Note> */
+ /* This function is normally equivalent to FT_STREAM_SEEK(offset) */
+ /* followed by FT_FRAME_ENTER(byte_count) with the loader's stream, */
+ /* but alternative formats (e.g. compressed ones) might use something */
+ /* different. */
+ /* */
+ typedef FT_Error
+ (*TT_Loader_StartGlyphFunc)( TT_Loader loader,
+ FT_UInt glyph_index,
+ FT_ULong offset,
+ FT_UInt byte_count );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* TT_Loader_ReadGlyphFunc */
+ /* */
+ /* <Description> */
+ /* Reads one glyph element (its header, a simple glyph, or a */
+ /* composite) from the loader's current stream frame. */
+ /* */
+ /* <Input> */
+ /* loader :: The current TrueType glyph loader object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ typedef FT_Error
+ (*TT_Loader_ReadGlyphFunc)( TT_Loader loader );
+
+
+ /*************************************************************************/
+ /* */
+ /* <FuncType> */
+ /* TT_Loader_EndGlyphFunc */
+ /* */
+ /* <Description> */
+ /* Closes the current loader stream frame for the glyph. */
+ /* */
+ /* <Input> */
+ /* loader :: The current TrueType glyph loader object. */
+ /* */
+ typedef void
+ (*TT_Loader_EndGlyphFunc)( TT_Loader loader );
+
+
+ /*************************************************************************/
+ /* */
+ /* TrueType Face Type */
+ /* */
+ /* <Struct> */
+ /* TT_Face */
+ /* */
+ /* <Description> */
+ /* The TrueType face class. These objects model the resolution and */
+ /* point-size independent data found in a TrueType font file. */
+ /* */
+ /* <Fields> */
+ /* root :: The base FT_Face structure, managed by the */
+ /* base layer. */
+ /* */
+ /* ttc_header :: The TrueType collection header, used when */
+ /* the file is a `ttc' rather than a `ttf'. */
+ /* For ordinary font files, the field */
+ /* `ttc_header.count' is set to 0. */
+ /* */
+ /* format_tag :: The font format tag. */
+ /* */
+ /* num_tables :: The number of TrueType tables in this font */
+ /* file. */
+ /* */
+ /* dir_tables :: The directory of TrueType tables for this */
+ /* font file. */
+ /* */
+ /* header :: The font's font header (`head' table). */
+ /* Read on font opening. */
+ /* */
+ /* horizontal :: The font's horizontal header (`hhea' */
+ /* table). This field also contains the */
+ /* associated horizontal metrics table */
+ /* (`hmtx'). */
+ /* */
+ /* max_profile :: The font's maximum profile table. Read on */
+ /* font opening. Note that some maximum */
+ /* values cannot be taken directly from this */
+ /* table. We thus define additional fields */
+ /* below to hold the computed maxima. */
+ /* */
+ /* vertical_info :: A boolean which is set when the font file */
+ /* contains vertical metrics. If not, the */
+ /* value of the `vertical' field is */
+ /* undefined. */
+ /* */
+ /* vertical :: The font's vertical header (`vhea' table). */
+ /* This field also contains the associated */
+ /* vertical metrics table (`vmtx'), if found. */
+ /* IMPORTANT: The contents of this field is */
+ /* undefined if the `verticalInfo' field is */
+ /* unset. */
+ /* */
+ /* num_names :: The number of name records within this */
+ /* TrueType font. */
+ /* */
+ /* name_table :: The table of name records (`name'). */
+ /* */
+ /* os2 :: The font's OS/2 table (`OS/2'). */
+ /* */
+ /* postscript :: The font's PostScript table (`post' */
+ /* table). The PostScript glyph names are */
+ /* not loaded by the driver on face opening. */
+ /* See the `ttpost' module for more details. */
+ /* */
+ /* cmap_table :: Address of the face's `cmap' SFNT table */
+ /* in memory (it's an extracted frame). */
+ /* */
+ /* cmap_size :: The size in bytes of the `cmap_table' */
+ /* described above. */
+ /* */
+ /* goto_table :: A function called by each TrueType table */
+ /* loader to position a stream's cursor to */
+ /* the start of a given table according to */
+ /* its tag. It defaults to TT_Goto_Face but */
+ /* can be different for strange formats (e.g. */
+ /* Type 42). */
+ /* */
+ /* access_glyph_frame :: A function used to access the frame of a */
+ /* given glyph within the face's font file. */
+ /* */
+ /* forget_glyph_frame :: A function used to forget the frame of a */
+ /* given glyph when all data has been loaded. */
+ /* */
+ /* read_glyph_header :: A function used to read a glyph header. */
+ /* It must be called between an `access' and */
+ /* `forget'. */
+ /* */
+ /* read_simple_glyph :: A function used to read a simple glyph. */
+ /* It must be called after the header was */
+ /* read, and before the `forget'. */
+ /* */
+ /* read_composite_glyph :: A function used to read a composite glyph. */
+ /* It must be called after the header was */
+ /* read, and before the `forget'. */
+ /* */
+ /* sfnt :: A pointer to the SFNT service. */
+ /* */
+ /* psnames :: A pointer to the PostScript names service. */
+ /* */
+ /* hdmx :: The face's horizontal device metrics */
+ /* (`hdmx' table). This table is optional in */
+ /* TrueType/OpenType fonts. */
+ /* */
+ /* gasp :: The grid-fitting and scaling properties */
+ /* table (`gasp'). This table is optional in */
+ /* TrueType/OpenType fonts. */
+ /* */
+ /* pclt :: The `pclt' SFNT table. */
+ /* */
+ /* num_sbit_strikes :: The number of sbit strikes, i.e., bitmap */
+ /* sizes, embedded in this font. */
+ /* */
+ /* sbit_strikes :: An array of sbit strikes embedded in this */
+ /* font. This table is optional in a */
+ /* TrueType/OpenType font. */
+ /* */
+ /* num_sbit_scales :: The number of sbit scales for this font. */
+ /* */
+ /* sbit_scales :: Array of sbit scales embedded in this */
+ /* font. This table is optional in a */
+ /* TrueType/OpenType font. */
+ /* */
+ /* postscript_names :: A table used to store the Postscript names */
+ /* of the glyphs for this font. See the */
+ /* file `ttconfig.h' for comments on the */
+ /* TT_CONFIG_OPTION_POSTSCRIPT_NAMES option. */
+ /* */
+ /* num_locations :: The number of glyph locations in this */
+ /* TrueType file. This should be */
+ /* identical to the number of glyphs. */
+ /* Ignored for Type 2 fonts. */
+ /* */
+ /* glyph_locations :: An array of longs. These are offsets to */
+ /* glyph data within the `glyf' table. */
+ /* Ignored for Type 2 font faces. */
+ /* */
+ /* glyf_len :: The length of the `glyf' table. Needed */
+ /* for malformed `loca' tables. */
+ /* */
+ /* font_program_size :: Size in bytecodes of the face's font */
+ /* program. 0 if none defined. Ignored for */
+ /* Type 2 fonts. */
+ /* */
+ /* font_program :: The face's font program (bytecode stream) */
+ /* executed at load time, also used during */
+ /* glyph rendering. Comes from the `fpgm' */
+ /* table. Ignored for Type 2 font fonts. */
+ /* */
+ /* cvt_program_size :: The size in bytecodes of the face's cvt */
+ /* program. Ignored for Type 2 fonts. */
+ /* */
+ /* cvt_program :: The face's cvt program (bytecode stream) */
+ /* executed each time an instance/size is */
+ /* changed/reset. Comes from the `prep' */
+ /* table. Ignored for Type 2 fonts. */
+ /* */
+ /* cvt_size :: Size of the control value table (in */
+ /* entries). Ignored for Type 2 fonts. */
+ /* */
+ /* cvt :: The face's original control value table. */
+ /* Coordinates are expressed in unscaled font */
+ /* units. Comes from the `cvt ' table. */
+ /* Ignored for Type 2 fonts. */
+ /* */
+ /* num_kern_pairs :: The number of kerning pairs present in the */
+ /* font file. The engine only loads the */
+ /* first horizontal format 0 kern table it */
+ /* finds in the font file. Ignored for */
+ /* Type 2 fonts. */
+ /* */
+ /* kern_table_index :: The index of the kerning table in the font */
+ /* kerning directory. Ignored for Type 2 */
+ /* fonts. */
+ /* */
+ /* interpreter :: A pointer to the TrueType bytecode */
+ /* interpreters field is also used to hook */
+ /* the debugger in `ttdebug'. */
+ /* */
+ /* unpatented_hinting :: If true, use only unpatented methods in */
+ /* the bytecode interpreter. */
+ /* */
+ /* doblend :: A boolean which is set if the font should */
+ /* be blended (this is for GX var). */
+ /* */
+ /* blend :: Contains the data needed to control GX */
+ /* variation tables (rather like Multiple */
+ /* Master data). */
+ /* */
+ /* extra :: Reserved for third-party font drivers. */
+ /* */
+ /* postscript_name :: The PS name of the font. Used by the */
+ /* postscript name service. */
+ /* */
+ typedef struct TT_FaceRec_
+ {
+ FT_FaceRec root;
+
+ TTC_HeaderRec ttc_header;
+
+ FT_ULong format_tag;
+ FT_UShort num_tables;
+ TT_Table dir_tables;
+
+ TT_Header header; /* TrueType header table */
+ TT_HoriHeader horizontal; /* TrueType horizontal header */
+
+ TT_MaxProfile max_profile;
+
+ FT_Bool vertical_info;
+ TT_VertHeader vertical; /* TT Vertical header, if present */
+
+ FT_UShort num_names; /* number of name records */
+ TT_NameTableRec name_table; /* name table */
+
+ TT_OS2 os2; /* TrueType OS/2 table */
+ TT_Postscript postscript; /* TrueType Postscript table */
+
+ FT_Byte* cmap_table; /* extracted `cmap' table */
+ FT_ULong cmap_size;
+
+ TT_Loader_GotoTableFunc goto_table;
+
+ TT_Loader_StartGlyphFunc access_glyph_frame;
+ TT_Loader_EndGlyphFunc forget_glyph_frame;
+ TT_Loader_ReadGlyphFunc read_glyph_header;
+ TT_Loader_ReadGlyphFunc read_simple_glyph;
+ TT_Loader_ReadGlyphFunc read_composite_glyph;
+
+ /* a typeless pointer to the SFNT_Interface table used to load */
+ /* the basic TrueType tables in the face object */
+ void* sfnt;
+
+ /* a typeless pointer to the FT_Service_PsCMapsRec table used to */
+ /* handle glyph names <-> unicode & Mac values */
+ void* psnames;
+
+
+ /***********************************************************************/
+ /* */
+ /* Optional TrueType/OpenType tables */
+ /* */
+ /***********************************************************************/
+
+ /* grid-fitting and scaling table */
+ TT_GaspRec gasp; /* the `gasp' table */
+
+ /* PCL 5 table */
+ TT_PCLT pclt;
+
+ /* embedded bitmaps support */
+ FT_ULong num_sbit_scales;
+ TT_SBit_Scale sbit_scales;
+
+ /* postscript names table */
+ TT_Post_NamesRec postscript_names;
+
+
+ /***********************************************************************/
+ /* */
+ /* TrueType-specific fields (ignored by the OTF-Type2 driver) */
+ /* */
+ /***********************************************************************/
+
+ /* the font program, if any */
+ FT_ULong font_program_size;
+ FT_Byte* font_program;
+
+ /* the cvt program, if any */
+ FT_ULong cvt_program_size;
+ FT_Byte* cvt_program;
+
+ /* the original, unscaled, control value table */
+ FT_ULong cvt_size;
+ FT_Short* cvt;
+
+ /* A pointer to the bytecode interpreter to use. This is also */
+ /* used to hook the debugger for the `ttdebug' utility. */
+ TT_Interpreter interpreter;
+
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+ /* Use unpatented hinting only. */
+ FT_Bool unpatented_hinting;
+#endif
+
+ /***********************************************************************/
+ /* */
+ /* Other tables or fields. This is used by derivative formats like */
+ /* OpenType. */
+ /* */
+ /***********************************************************************/
+
+ FT_Generic extra;
+
+ const char* postscript_name;
+
+ FT_ULong glyf_len;
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+ FT_Bool doblend;
+ GX_Blend blend;
+#endif
+
+ /* since version 2.2 */
+
+ FT_Byte* horz_metrics;
+ FT_ULong horz_metrics_size;
+
+ FT_Byte* vert_metrics;
+ FT_ULong vert_metrics_size;
+
+ FT_ULong num_locations; /* in broken TTF, gid > 0xFFFF */
+ FT_Byte* glyph_locations;
+
+ FT_Byte* hdmx_table;
+ FT_ULong hdmx_table_size;
+ FT_UInt hdmx_record_count;
+ FT_ULong hdmx_record_size;
+ FT_Byte* hdmx_record_sizes;
+
+ FT_Byte* sbit_table;
+ FT_ULong sbit_table_size;
+ FT_UInt sbit_num_strikes;
+
+ FT_Byte* kern_table;
+ FT_ULong kern_table_size;
+ FT_UInt num_kern_tables;
+ FT_UInt32 kern_avail_bits;
+ FT_UInt32 kern_order_bits;
+
+#ifdef TT_CONFIG_OPTION_BDF
+ TT_BDFRec bdf;
+#endif /* TT_CONFIG_OPTION_BDF */
+
+ /* since 2.3.0 */
+ FT_ULong horz_metrics_offset;
+ FT_ULong vert_metrics_offset;
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ /* since 2.4.12 */
+ FT_ULong sph_found_func_flags; /* special functions found */
+ /* for this face */
+ FT_Bool sph_compatibility_mode;
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+ } TT_FaceRec;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_GlyphZoneRec */
+ /* */
+ /* <Description> */
+ /* A glyph zone is used to load, scale and hint glyph outline */
+ /* coordinates. */
+ /* */
+ /* <Fields> */
+ /* memory :: A handle to the memory manager. */
+ /* */
+ /* max_points :: The maximum size in points of the zone. */
+ /* */
+ /* max_contours :: Max size in links contours of the zone. */
+ /* */
+ /* n_points :: The current number of points in the zone. */
+ /* */
+ /* n_contours :: The current number of contours in the zone. */
+ /* */
+ /* org :: The original glyph coordinates (font */
+ /* units/scaled). */
+ /* */
+ /* cur :: The current glyph coordinates (scaled/hinted). */
+ /* */
+ /* tags :: The point control tags. */
+ /* */
+ /* contours :: The contours end points. */
+ /* */
+ /* first_point :: Offset of the current subglyph's first point. */
+ /* */
+ typedef struct TT_GlyphZoneRec_
+ {
+ FT_Memory memory;
+ FT_UShort max_points;
+ FT_UShort max_contours;
+ FT_UShort n_points; /* number of points in zone */
+ FT_Short n_contours; /* number of contours */
+
+ FT_Vector* org; /* original point coordinates */
+ FT_Vector* cur; /* current point coordinates */
+ FT_Vector* orus; /* original (unscaled) point coordinates */
+
+ FT_Byte* tags; /* current touch flags */
+ FT_UShort* contours; /* contour end points */
+
+ FT_UShort first_point; /* offset of first (#0) point */
+
+ } TT_GlyphZoneRec, *TT_GlyphZone;
+
+
+ /* handle to execution context */
+ typedef struct TT_ExecContextRec_* TT_ExecContext;
+
+ /* glyph loader structure */
+ typedef struct TT_LoaderRec_
+ {
+ FT_Face face;
+ FT_Size size;
+ FT_GlyphSlot glyph;
+ FT_GlyphLoader gloader;
+
+ FT_ULong load_flags;
+ FT_UInt glyph_index;
+
+ FT_Stream stream;
+ FT_Int byte_len;
+
+ FT_Short n_contours;
+ FT_BBox bbox;
+ FT_Int left_bearing;
+ FT_Int advance;
+ FT_Int linear;
+ FT_Bool linear_def;
+ FT_Bool preserve_pps;
+ FT_Vector pp1;
+ FT_Vector pp2;
+
+ FT_ULong glyf_offset;
+
+ /* the zone where we load our glyphs */
+ TT_GlyphZoneRec base;
+ TT_GlyphZoneRec zone;
+
+ TT_ExecContext exec;
+ FT_Byte* instructions;
+ FT_ULong ins_pos;
+
+ /* for possible extensibility in other formats */
+ void* other;
+
+ /* since version 2.1.8 */
+ FT_Int top_bearing;
+ FT_Int vadvance;
+ FT_Vector pp3;
+ FT_Vector pp4;
+
+ /* since version 2.2.1 */
+ FT_Byte* cursor;
+ FT_Byte* limit;
+
+ } TT_LoaderRec;
+
+
+FT_END_HEADER
+
+#endif /* __TTTYPES_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/t1tables.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/t1tables.h
new file mode 100644
index 0000000000..6530094d81
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/t1tables.h
@@ -0,0 +1,662 @@
+/***************************************************************************/
+/* */
+/* t1tables.h */
+/* */
+/* Basic Type 1/Type 2 tables definitions and interface (specification */
+/* only). */
+/* */
+/* Copyright 1996-2004, 2006, 2008, 2009, 2011 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __T1TABLES_H__
+#define __T1TABLES_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* type1_tables */
+ /* */
+ /* <Title> */
+ /* Type 1 Tables */
+ /* */
+ /* <Abstract> */
+ /* Type~1 (PostScript) specific font tables. */
+ /* */
+ /* <Description> */
+ /* This section contains the definition of Type 1-specific tables, */
+ /* including structures related to other PostScript font formats. */
+ /* */
+ /*************************************************************************/
+
+
+ /* Note that we separate font data in PS_FontInfoRec and PS_PrivateRec */
+ /* structures in order to support Multiple Master fonts. */
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* PS_FontInfoRec */
+ /* */
+ /* <Description> */
+ /* A structure used to model a Type~1 or Type~2 FontInfo dictionary. */
+ /* Note that for Multiple Master fonts, each instance has its own */
+ /* FontInfo dictionary. */
+ /* */
+ typedef struct PS_FontInfoRec_
+ {
+ FT_String* version;
+ FT_String* notice;
+ FT_String* full_name;
+ FT_String* family_name;
+ FT_String* weight;
+ FT_Long italic_angle;
+ FT_Bool is_fixed_pitch;
+ FT_Short underline_position;
+ FT_UShort underline_thickness;
+
+ } PS_FontInfoRec;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* PS_FontInfo */
+ /* */
+ /* <Description> */
+ /* A handle to a @PS_FontInfoRec structure. */
+ /* */
+ typedef struct PS_FontInfoRec_* PS_FontInfo;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* T1_FontInfo */
+ /* */
+ /* <Description> */
+ /* This type is equivalent to @PS_FontInfoRec. It is deprecated but */
+ /* kept to maintain source compatibility between various versions of */
+ /* FreeType. */
+ /* */
+ typedef PS_FontInfoRec T1_FontInfo;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* PS_PrivateRec */
+ /* */
+ /* <Description> */
+ /* A structure used to model a Type~1 or Type~2 private dictionary. */
+ /* Note that for Multiple Master fonts, each instance has its own */
+ /* Private dictionary. */
+ /* */
+ typedef struct PS_PrivateRec_
+ {
+ FT_Int unique_id;
+ FT_Int lenIV;
+
+ FT_Byte num_blue_values;
+ FT_Byte num_other_blues;
+ FT_Byte num_family_blues;
+ FT_Byte num_family_other_blues;
+
+ FT_Short blue_values[14];
+ FT_Short other_blues[10];
+
+ FT_Short family_blues [14];
+ FT_Short family_other_blues[10];
+
+ FT_Fixed blue_scale;
+ FT_Int blue_shift;
+ FT_Int blue_fuzz;
+
+ FT_UShort standard_width[1];
+ FT_UShort standard_height[1];
+
+ FT_Byte num_snap_widths;
+ FT_Byte num_snap_heights;
+ FT_Bool force_bold;
+ FT_Bool round_stem_up;
+
+ FT_Short snap_widths [13]; /* including std width */
+ FT_Short snap_heights[13]; /* including std height */
+
+ FT_Fixed expansion_factor;
+
+ FT_Long language_group;
+ FT_Long password;
+
+ FT_Short min_feature[2];
+
+ } PS_PrivateRec;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* PS_Private */
+ /* */
+ /* <Description> */
+ /* A handle to a @PS_PrivateRec structure. */
+ /* */
+ typedef struct PS_PrivateRec_* PS_Private;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* T1_Private */
+ /* */
+ /* <Description> */
+ /* This type is equivalent to @PS_PrivateRec. It is deprecated but */
+ /* kept to maintain source compatibility between various versions of */
+ /* FreeType. */
+ /* */
+ typedef PS_PrivateRec T1_Private;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Enum> */
+ /* T1_Blend_Flags */
+ /* */
+ /* <Description> */
+ /* A set of flags used to indicate which fields are present in a */
+ /* given blend dictionary (font info or private). Used to support */
+ /* Multiple Masters fonts. */
+ /* */
+ typedef enum T1_Blend_Flags_
+ {
+ /*# required fields in a FontInfo blend dictionary */
+ T1_BLEND_UNDERLINE_POSITION = 0,
+ T1_BLEND_UNDERLINE_THICKNESS,
+ T1_BLEND_ITALIC_ANGLE,
+
+ /*# required fields in a Private blend dictionary */
+ T1_BLEND_BLUE_VALUES,
+ T1_BLEND_OTHER_BLUES,
+ T1_BLEND_STANDARD_WIDTH,
+ T1_BLEND_STANDARD_HEIGHT,
+ T1_BLEND_STEM_SNAP_WIDTHS,
+ T1_BLEND_STEM_SNAP_HEIGHTS,
+ T1_BLEND_BLUE_SCALE,
+ T1_BLEND_BLUE_SHIFT,
+ T1_BLEND_FAMILY_BLUES,
+ T1_BLEND_FAMILY_OTHER_BLUES,
+ T1_BLEND_FORCE_BOLD,
+
+ /*# never remove */
+ T1_BLEND_MAX
+
+ } T1_Blend_Flags;
+
+ /* */
+
+
+ /*# backwards compatible definitions */
+#define t1_blend_underline_position T1_BLEND_UNDERLINE_POSITION
+#define t1_blend_underline_thickness T1_BLEND_UNDERLINE_THICKNESS
+#define t1_blend_italic_angle T1_BLEND_ITALIC_ANGLE
+#define t1_blend_blue_values T1_BLEND_BLUE_VALUES
+#define t1_blend_other_blues T1_BLEND_OTHER_BLUES
+#define t1_blend_standard_widths T1_BLEND_STANDARD_WIDTH
+#define t1_blend_standard_height T1_BLEND_STANDARD_HEIGHT
+#define t1_blend_stem_snap_widths T1_BLEND_STEM_SNAP_WIDTHS
+#define t1_blend_stem_snap_heights T1_BLEND_STEM_SNAP_HEIGHTS
+#define t1_blend_blue_scale T1_BLEND_BLUE_SCALE
+#define t1_blend_blue_shift T1_BLEND_BLUE_SHIFT
+#define t1_blend_family_blues T1_BLEND_FAMILY_BLUES
+#define t1_blend_family_other_blues T1_BLEND_FAMILY_OTHER_BLUES
+#define t1_blend_force_bold T1_BLEND_FORCE_BOLD
+#define t1_blend_max T1_BLEND_MAX
+
+
+ /* maximum number of Multiple Masters designs, as defined in the spec */
+#define T1_MAX_MM_DESIGNS 16
+
+ /* maximum number of Multiple Masters axes, as defined in the spec */
+#define T1_MAX_MM_AXIS 4
+
+ /* maximum number of elements in a design map */
+#define T1_MAX_MM_MAP_POINTS 20
+
+
+ /* this structure is used to store the BlendDesignMap entry for an axis */
+ typedef struct PS_DesignMap_
+ {
+ FT_Byte num_points;
+ FT_Long* design_points;
+ FT_Fixed* blend_points;
+
+ } PS_DesignMapRec, *PS_DesignMap;
+
+ /* backwards-compatible definition */
+ typedef PS_DesignMapRec T1_DesignMap;
+
+
+ typedef struct PS_BlendRec_
+ {
+ FT_UInt num_designs;
+ FT_UInt num_axis;
+
+ FT_String* axis_names[T1_MAX_MM_AXIS];
+ FT_Fixed* design_pos[T1_MAX_MM_DESIGNS];
+ PS_DesignMapRec design_map[T1_MAX_MM_AXIS];
+
+ FT_Fixed* weight_vector;
+ FT_Fixed* default_weight_vector;
+
+ PS_FontInfo font_infos[T1_MAX_MM_DESIGNS + 1];
+ PS_Private privates [T1_MAX_MM_DESIGNS + 1];
+
+ FT_ULong blend_bitflags;
+
+ FT_BBox* bboxes [T1_MAX_MM_DESIGNS + 1];
+
+ /* since 2.3.0 */
+
+ /* undocumented, optional: the default design instance; */
+ /* corresponds to default_weight_vector -- */
+ /* num_default_design_vector == 0 means it is not present */
+ /* in the font and associated metrics files */
+ FT_UInt default_design_vector[T1_MAX_MM_DESIGNS];
+ FT_UInt num_default_design_vector;
+
+ } PS_BlendRec, *PS_Blend;
+
+
+ /* backwards-compatible definition */
+ typedef PS_BlendRec T1_Blend;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* CID_FaceDictRec */
+ /* */
+ /* <Description> */
+ /* A structure used to represent data in a CID top-level dictionary. */
+ /* */
+ typedef struct CID_FaceDictRec_
+ {
+ PS_PrivateRec private_dict;
+
+ FT_UInt len_buildchar;
+ FT_Fixed forcebold_threshold;
+ FT_Pos stroke_width;
+ FT_Fixed expansion_factor;
+
+ FT_Byte paint_type;
+ FT_Byte font_type;
+ FT_Matrix font_matrix;
+ FT_Vector font_offset;
+
+ FT_UInt num_subrs;
+ FT_ULong subrmap_offset;
+ FT_Int sd_bytes;
+
+ } CID_FaceDictRec;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* CID_FaceDict */
+ /* */
+ /* <Description> */
+ /* A handle to a @CID_FaceDictRec structure. */
+ /* */
+ typedef struct CID_FaceDictRec_* CID_FaceDict;
+
+ /* */
+
+
+ /* backwards-compatible definition */
+ typedef CID_FaceDictRec CID_FontDict;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* CID_FaceInfoRec */
+ /* */
+ /* <Description> */
+ /* A structure used to represent CID Face information. */
+ /* */
+ typedef struct CID_FaceInfoRec_
+ {
+ FT_String* cid_font_name;
+ FT_Fixed cid_version;
+ FT_Int cid_font_type;
+
+ FT_String* registry;
+ FT_String* ordering;
+ FT_Int supplement;
+
+ PS_FontInfoRec font_info;
+ FT_BBox font_bbox;
+ FT_ULong uid_base;
+
+ FT_Int num_xuid;
+ FT_ULong xuid[16];
+
+ FT_ULong cidmap_offset;
+ FT_Int fd_bytes;
+ FT_Int gd_bytes;
+ FT_ULong cid_count;
+
+ FT_Int num_dicts;
+ CID_FaceDict font_dicts;
+
+ FT_ULong data_offset;
+
+ } CID_FaceInfoRec;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* CID_FaceInfo */
+ /* */
+ /* <Description> */
+ /* A handle to a @CID_FaceInfoRec structure. */
+ /* */
+ typedef struct CID_FaceInfoRec_* CID_FaceInfo;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* CID_Info */
+ /* */
+ /* <Description> */
+ /* This type is equivalent to @CID_FaceInfoRec. It is deprecated but */
+ /* kept to maintain source compatibility between various versions of */
+ /* FreeType. */
+ /* */
+ typedef CID_FaceInfoRec CID_Info;
+
+
+ /************************************************************************
+ *
+ * @function:
+ * FT_Has_PS_Glyph_Names
+ *
+ * @description:
+ * Return true if a given face provides reliable PostScript glyph
+ * names. This is similar to using the @FT_HAS_GLYPH_NAMES macro,
+ * except that certain fonts (mostly TrueType) contain incorrect
+ * glyph name tables.
+ *
+ * When this function returns true, the caller is sure that the glyph
+ * names returned by @FT_Get_Glyph_Name are reliable.
+ *
+ * @input:
+ * face ::
+ * face handle
+ *
+ * @return:
+ * Boolean. True if glyph names are reliable.
+ *
+ */
+ FT_EXPORT( FT_Int )
+ FT_Has_PS_Glyph_Names( FT_Face face );
+
+
+ /************************************************************************
+ *
+ * @function:
+ * FT_Get_PS_Font_Info
+ *
+ * @description:
+ * Retrieve the @PS_FontInfoRec structure corresponding to a given
+ * PostScript font.
+ *
+ * @input:
+ * face ::
+ * PostScript face handle.
+ *
+ * @output:
+ * afont_info ::
+ * Output font info structure pointer.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * The string pointers within the font info structure are owned by
+ * the face and don't need to be freed by the caller.
+ *
+ * If the font's format is not PostScript-based, this function will
+ * return the `FT_Err_Invalid_Argument' error code.
+ *
+ */
+ FT_EXPORT( FT_Error )
+ FT_Get_PS_Font_Info( FT_Face face,
+ PS_FontInfo afont_info );
+
+
+ /************************************************************************
+ *
+ * @function:
+ * FT_Get_PS_Font_Private
+ *
+ * @description:
+ * Retrieve the @PS_PrivateRec structure corresponding to a given
+ * PostScript font.
+ *
+ * @input:
+ * face ::
+ * PostScript face handle.
+ *
+ * @output:
+ * afont_private ::
+ * Output private dictionary structure pointer.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * The string pointers within the @PS_PrivateRec structure are owned by
+ * the face and don't need to be freed by the caller.
+ *
+ * If the font's format is not PostScript-based, this function returns
+ * the `FT_Err_Invalid_Argument' error code.
+ *
+ */
+ FT_EXPORT( FT_Error )
+ FT_Get_PS_Font_Private( FT_Face face,
+ PS_Private afont_private );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Enum> */
+ /* T1_EncodingType */
+ /* */
+ /* <Description> */
+ /* An enumeration describing the `Encoding' entry in a Type 1 */
+ /* dictionary. */
+ /* */
+ typedef enum T1_EncodingType_
+ {
+ T1_ENCODING_TYPE_NONE = 0,
+ T1_ENCODING_TYPE_ARRAY,
+ T1_ENCODING_TYPE_STANDARD,
+ T1_ENCODING_TYPE_ISOLATIN1,
+ T1_ENCODING_TYPE_EXPERT
+
+ } T1_EncodingType;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Enum> */
+ /* PS_Dict_Keys */
+ /* */
+ /* <Description> */
+ /* An enumeration used in calls to @FT_Get_PS_Font_Value to identify */
+ /* the Type~1 dictionary entry to retrieve. */
+ /* */
+ typedef enum PS_Dict_Keys_
+ {
+ /* conventionally in the font dictionary */
+ PS_DICT_FONT_TYPE, /* FT_Byte */
+ PS_DICT_FONT_MATRIX, /* FT_Fixed */
+ PS_DICT_FONT_BBOX, /* FT_Fixed */
+ PS_DICT_PAINT_TYPE, /* FT_Byte */
+ PS_DICT_FONT_NAME, /* FT_String* */
+ PS_DICT_UNIQUE_ID, /* FT_Int */
+ PS_DICT_NUM_CHAR_STRINGS, /* FT_Int */
+ PS_DICT_CHAR_STRING_KEY, /* FT_String* */
+ PS_DICT_CHAR_STRING, /* FT_String* */
+ PS_DICT_ENCODING_TYPE, /* T1_EncodingType */
+ PS_DICT_ENCODING_ENTRY, /* FT_String* */
+
+ /* conventionally in the font Private dictionary */
+ PS_DICT_NUM_SUBRS, /* FT_Int */
+ PS_DICT_SUBR, /* FT_String* */
+ PS_DICT_STD_HW, /* FT_UShort */
+ PS_DICT_STD_VW, /* FT_UShort */
+ PS_DICT_NUM_BLUE_VALUES, /* FT_Byte */
+ PS_DICT_BLUE_VALUE, /* FT_Short */
+ PS_DICT_BLUE_FUZZ, /* FT_Int */
+ PS_DICT_NUM_OTHER_BLUES, /* FT_Byte */
+ PS_DICT_OTHER_BLUE, /* FT_Short */
+ PS_DICT_NUM_FAMILY_BLUES, /* FT_Byte */
+ PS_DICT_FAMILY_BLUE, /* FT_Short */
+ PS_DICT_NUM_FAMILY_OTHER_BLUES, /* FT_Byte */
+ PS_DICT_FAMILY_OTHER_BLUE, /* FT_Short */
+ PS_DICT_BLUE_SCALE, /* FT_Fixed */
+ PS_DICT_BLUE_SHIFT, /* FT_Int */
+ PS_DICT_NUM_STEM_SNAP_H, /* FT_Byte */
+ PS_DICT_STEM_SNAP_H, /* FT_Short */
+ PS_DICT_NUM_STEM_SNAP_V, /* FT_Byte */
+ PS_DICT_STEM_SNAP_V, /* FT_Short */
+ PS_DICT_FORCE_BOLD, /* FT_Bool */
+ PS_DICT_RND_STEM_UP, /* FT_Bool */
+ PS_DICT_MIN_FEATURE, /* FT_Short */
+ PS_DICT_LEN_IV, /* FT_Int */
+ PS_DICT_PASSWORD, /* FT_Long */
+ PS_DICT_LANGUAGE_GROUP, /* FT_Long */
+
+ /* conventionally in the font FontInfo dictionary */
+ PS_DICT_VERSION, /* FT_String* */
+ PS_DICT_NOTICE, /* FT_String* */
+ PS_DICT_FULL_NAME, /* FT_String* */
+ PS_DICT_FAMILY_NAME, /* FT_String* */
+ PS_DICT_WEIGHT, /* FT_String* */
+ PS_DICT_IS_FIXED_PITCH, /* FT_Bool */
+ PS_DICT_UNDERLINE_POSITION, /* FT_Short */
+ PS_DICT_UNDERLINE_THICKNESS, /* FT_UShort */
+ PS_DICT_FS_TYPE, /* FT_UShort */
+ PS_DICT_ITALIC_ANGLE, /* FT_Long */
+
+ PS_DICT_MAX = PS_DICT_ITALIC_ANGLE
+
+ } PS_Dict_Keys;
+
+
+ /************************************************************************
+ *
+ * @function:
+ * FT_Get_PS_Font_Value
+ *
+ * @description:
+ * Retrieve the value for the supplied key from a PostScript font.
+ *
+ * @input:
+ * face ::
+ * PostScript face handle.
+ *
+ * key ::
+ * An enumeration value representing the dictionary key to retrieve.
+ *
+ * idx ::
+ * For array values, this specifies the index to be returned.
+ *
+ * value ::
+ * A pointer to memory into which to write the value.
+ *
+ * valen_len ::
+ * The size, in bytes, of the memory supplied for the value.
+ *
+ * @output:
+ * value ::
+ * The value matching the above key, if it exists.
+ *
+ * @return:
+ * The amount of memory (in bytes) required to hold the requested
+ * value (if it exists, -1 otherwise).
+ *
+ * @note:
+ * The values returned are not pointers into the internal structures of
+ * the face, but are `fresh' copies, so that the memory containing them
+ * belongs to the calling application. This also enforces the
+ * `read-only' nature of these values, i.e., this function cannot be
+ * used to manipulate the face.
+ *
+ * `value' is a void pointer because the values returned can be of
+ * various types.
+ *
+ * If either `value' is NULL or `value_len' is too small, just the
+ * required memory size for the requested entry is returned.
+ *
+ * The `idx' parameter is used, not only to retrieve elements of, for
+ * example, the FontMatrix or FontBBox, but also to retrieve name keys
+ * from the CharStrings dictionary, and the charstrings themselves. It
+ * is ignored for atomic values.
+ *
+ * PS_DICT_BLUE_SCALE returns a value that is scaled up by 1000. To
+ * get the value as in the font stream, you need to divide by
+ * 65536000.0 (to remove the FT_Fixed scale, and the x1000 scale).
+ *
+ * IMPORTANT: Only key/value pairs read by the FreeType interpreter can
+ * be retrieved. So, for example, PostScript procedures such as NP,
+ * ND, and RD are not available. Arbitrary keys are, obviously, not be
+ * available either.
+ *
+ * If the font's format is not PostScript-based, this function returns
+ * the `FT_Err_Invalid_Argument' error code.
+ *
+ */
+ FT_EXPORT( FT_Long )
+ FT_Get_PS_Font_Value( FT_Face face,
+ PS_Dict_Keys key,
+ FT_UInt idx,
+ void *value,
+ FT_Long value_len );
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __T1TABLES_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ttnameid.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ttnameid.h
new file mode 100644
index 0000000000..862bf927c2
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ttnameid.h
@@ -0,0 +1,1237 @@
+/***************************************************************************/
+/* */
+/* ttnameid.h */
+/* */
+/* TrueType name ID definitions (specification only). */
+/* */
+/* Copyright 1996-2004, 2006-2008, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __TTNAMEID_H__
+#define __TTNAMEID_H__
+
+
+#include "../ft2build.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* truetype_tables */
+ /* */
+
+
+ /*************************************************************************/
+ /* */
+ /* Possible values for the `platform' identifier code in the name */
+ /* records of the TTF `name' table. */
+ /* */
+ /*************************************************************************/
+
+
+ /***********************************************************************
+ *
+ * @enum:
+ * TT_PLATFORM_XXX
+ *
+ * @description:
+ * A list of valid values for the `platform_id' identifier code in
+ * @FT_CharMapRec and @FT_SfntName structures.
+ *
+ * @values:
+ * TT_PLATFORM_APPLE_UNICODE ::
+ * Used by Apple to indicate a Unicode character map and/or name entry.
+ * See @TT_APPLE_ID_XXX for corresponding `encoding_id' values. Note
+ * that name entries in this format are coded as big-endian UCS-2
+ * character codes _only_.
+ *
+ * TT_PLATFORM_MACINTOSH ::
+ * Used by Apple to indicate a MacOS-specific charmap and/or name entry.
+ * See @TT_MAC_ID_XXX for corresponding `encoding_id' values. Note that
+ * most TrueType fonts contain an Apple roman charmap to be usable on
+ * MacOS systems (even if they contain a Microsoft charmap as well).
+ *
+ * TT_PLATFORM_ISO ::
+ * This value was used to specify ISO/IEC 10646 charmaps. It is however
+ * now deprecated. See @TT_ISO_ID_XXX for a list of corresponding
+ * `encoding_id' values.
+ *
+ * TT_PLATFORM_MICROSOFT ::
+ * Used by Microsoft to indicate Windows-specific charmaps. See
+ * @TT_MS_ID_XXX for a list of corresponding `encoding_id' values.
+ * Note that most fonts contain a Unicode charmap using
+ * (TT_PLATFORM_MICROSOFT, @TT_MS_ID_UNICODE_CS).
+ *
+ * TT_PLATFORM_CUSTOM ::
+ * Used to indicate application-specific charmaps.
+ *
+ * TT_PLATFORM_ADOBE ::
+ * This value isn't part of any font format specification, but is used
+ * by FreeType to report Adobe-specific charmaps in an @FT_CharMapRec
+ * structure. See @TT_ADOBE_ID_XXX.
+ */
+
+#define TT_PLATFORM_APPLE_UNICODE 0
+#define TT_PLATFORM_MACINTOSH 1
+#define TT_PLATFORM_ISO 2 /* deprecated */
+#define TT_PLATFORM_MICROSOFT 3
+#define TT_PLATFORM_CUSTOM 4
+#define TT_PLATFORM_ADOBE 7 /* artificial */
+
+
+ /***********************************************************************
+ *
+ * @enum:
+ * TT_APPLE_ID_XXX
+ *
+ * @description:
+ * A list of valid values for the `encoding_id' for
+ * @TT_PLATFORM_APPLE_UNICODE charmaps and name entries.
+ *
+ * @values:
+ * TT_APPLE_ID_DEFAULT ::
+ * Unicode version 1.0.
+ *
+ * TT_APPLE_ID_UNICODE_1_1 ::
+ * Unicode 1.1; specifies Hangul characters starting at U+34xx.
+ *
+ * TT_APPLE_ID_ISO_10646 ::
+ * Deprecated (identical to preceding).
+ *
+ * TT_APPLE_ID_UNICODE_2_0 ::
+ * Unicode 2.0 and beyond (UTF-16 BMP only).
+ *
+ * TT_APPLE_ID_UNICODE_32 ::
+ * Unicode 3.1 and beyond, using UTF-32.
+ *
+ * TT_APPLE_ID_VARIANT_SELECTOR ::
+ * From Adobe, not Apple. Not a normal cmap. Specifies variations
+ * on a real cmap.
+ */
+
+#define TT_APPLE_ID_DEFAULT 0 /* Unicode 1.0 */
+#define TT_APPLE_ID_UNICODE_1_1 1 /* specify Hangul at U+34xx */
+#define TT_APPLE_ID_ISO_10646 2 /* deprecated */
+#define TT_APPLE_ID_UNICODE_2_0 3 /* or later */
+#define TT_APPLE_ID_UNICODE_32 4 /* 2.0 or later, full repertoire */
+#define TT_APPLE_ID_VARIANT_SELECTOR 5 /* variation selector data */
+
+
+ /***********************************************************************
+ *
+ * @enum:
+ * TT_MAC_ID_XXX
+ *
+ * @description:
+ * A list of valid values for the `encoding_id' for
+ * @TT_PLATFORM_MACINTOSH charmaps and name entries.
+ *
+ * @values:
+ * TT_MAC_ID_ROMAN ::
+ * TT_MAC_ID_JAPANESE ::
+ * TT_MAC_ID_TRADITIONAL_CHINESE ::
+ * TT_MAC_ID_KOREAN ::
+ * TT_MAC_ID_ARABIC ::
+ * TT_MAC_ID_HEBREW ::
+ * TT_MAC_ID_GREEK ::
+ * TT_MAC_ID_RUSSIAN ::
+ * TT_MAC_ID_RSYMBOL ::
+ * TT_MAC_ID_DEVANAGARI ::
+ * TT_MAC_ID_GURMUKHI ::
+ * TT_MAC_ID_GUJARATI ::
+ * TT_MAC_ID_ORIYA ::
+ * TT_MAC_ID_BENGALI ::
+ * TT_MAC_ID_TAMIL ::
+ * TT_MAC_ID_TELUGU ::
+ * TT_MAC_ID_KANNADA ::
+ * TT_MAC_ID_MALAYALAM ::
+ * TT_MAC_ID_SINHALESE ::
+ * TT_MAC_ID_BURMESE ::
+ * TT_MAC_ID_KHMER ::
+ * TT_MAC_ID_THAI ::
+ * TT_MAC_ID_LAOTIAN ::
+ * TT_MAC_ID_GEORGIAN ::
+ * TT_MAC_ID_ARMENIAN ::
+ * TT_MAC_ID_MALDIVIAN ::
+ * TT_MAC_ID_SIMPLIFIED_CHINESE ::
+ * TT_MAC_ID_TIBETAN ::
+ * TT_MAC_ID_MONGOLIAN ::
+ * TT_MAC_ID_GEEZ ::
+ * TT_MAC_ID_SLAVIC ::
+ * TT_MAC_ID_VIETNAMESE ::
+ * TT_MAC_ID_SINDHI ::
+ * TT_MAC_ID_UNINTERP ::
+ */
+
+#define TT_MAC_ID_ROMAN 0
+#define TT_MAC_ID_JAPANESE 1
+#define TT_MAC_ID_TRADITIONAL_CHINESE 2
+#define TT_MAC_ID_KOREAN 3
+#define TT_MAC_ID_ARABIC 4
+#define TT_MAC_ID_HEBREW 5
+#define TT_MAC_ID_GREEK 6
+#define TT_MAC_ID_RUSSIAN 7
+#define TT_MAC_ID_RSYMBOL 8
+#define TT_MAC_ID_DEVANAGARI 9
+#define TT_MAC_ID_GURMUKHI 10
+#define TT_MAC_ID_GUJARATI 11
+#define TT_MAC_ID_ORIYA 12
+#define TT_MAC_ID_BENGALI 13
+#define TT_MAC_ID_TAMIL 14
+#define TT_MAC_ID_TELUGU 15
+#define TT_MAC_ID_KANNADA 16
+#define TT_MAC_ID_MALAYALAM 17
+#define TT_MAC_ID_SINHALESE 18
+#define TT_MAC_ID_BURMESE 19
+#define TT_MAC_ID_KHMER 20
+#define TT_MAC_ID_THAI 21
+#define TT_MAC_ID_LAOTIAN 22
+#define TT_MAC_ID_GEORGIAN 23
+#define TT_MAC_ID_ARMENIAN 24
+#define TT_MAC_ID_MALDIVIAN 25
+#define TT_MAC_ID_SIMPLIFIED_CHINESE 25
+#define TT_MAC_ID_TIBETAN 26
+#define TT_MAC_ID_MONGOLIAN 27
+#define TT_MAC_ID_GEEZ 28
+#define TT_MAC_ID_SLAVIC 29
+#define TT_MAC_ID_VIETNAMESE 30
+#define TT_MAC_ID_SINDHI 31
+#define TT_MAC_ID_UNINTERP 32
+
+
+ /***********************************************************************
+ *
+ * @enum:
+ * TT_ISO_ID_XXX
+ *
+ * @description:
+ * A list of valid values for the `encoding_id' for
+ * @TT_PLATFORM_ISO charmaps and name entries.
+ *
+ * Their use is now deprecated.
+ *
+ * @values:
+ * TT_ISO_ID_7BIT_ASCII ::
+ * ASCII.
+ * TT_ISO_ID_10646 ::
+ * ISO/10646.
+ * TT_ISO_ID_8859_1 ::
+ * Also known as Latin-1.
+ */
+
+#define TT_ISO_ID_7BIT_ASCII 0
+#define TT_ISO_ID_10646 1
+#define TT_ISO_ID_8859_1 2
+
+
+ /***********************************************************************
+ *
+ * @enum:
+ * TT_MS_ID_XXX
+ *
+ * @description:
+ * A list of valid values for the `encoding_id' for
+ * @TT_PLATFORM_MICROSOFT charmaps and name entries.
+ *
+ * @values:
+ * TT_MS_ID_SYMBOL_CS ::
+ * Corresponds to Microsoft symbol encoding. See
+ * @FT_ENCODING_MS_SYMBOL.
+ *
+ * TT_MS_ID_UNICODE_CS ::
+ * Corresponds to a Microsoft WGL4 charmap, matching Unicode. See
+ * @FT_ENCODING_UNICODE.
+ *
+ * TT_MS_ID_SJIS ::
+ * Corresponds to SJIS Japanese encoding. See @FT_ENCODING_SJIS.
+ *
+ * TT_MS_ID_GB2312 ::
+ * Corresponds to Simplified Chinese as used in Mainland China. See
+ * @FT_ENCODING_GB2312.
+ *
+ * TT_MS_ID_BIG_5 ::
+ * Corresponds to Traditional Chinese as used in Taiwan and Hong Kong.
+ * See @FT_ENCODING_BIG5.
+ *
+ * TT_MS_ID_WANSUNG ::
+ * Corresponds to Korean Wansung encoding. See @FT_ENCODING_WANSUNG.
+ *
+ * TT_MS_ID_JOHAB ::
+ * Corresponds to Johab encoding. See @FT_ENCODING_JOHAB.
+ *
+ * TT_MS_ID_UCS_4 ::
+ * Corresponds to UCS-4 or UTF-32 charmaps. This has been added to
+ * the OpenType specification version 1.4 (mid-2001.)
+ */
+
+#define TT_MS_ID_SYMBOL_CS 0
+#define TT_MS_ID_UNICODE_CS 1
+#define TT_MS_ID_SJIS 2
+#define TT_MS_ID_GB2312 3
+#define TT_MS_ID_BIG_5 4
+#define TT_MS_ID_WANSUNG 5
+#define TT_MS_ID_JOHAB 6
+#define TT_MS_ID_UCS_4 10
+
+
+ /***********************************************************************
+ *
+ * @enum:
+ * TT_ADOBE_ID_XXX
+ *
+ * @description:
+ * A list of valid values for the `encoding_id' for
+ * @TT_PLATFORM_ADOBE charmaps. This is a FreeType-specific extension!
+ *
+ * @values:
+ * TT_ADOBE_ID_STANDARD ::
+ * Adobe standard encoding.
+ * TT_ADOBE_ID_EXPERT ::
+ * Adobe expert encoding.
+ * TT_ADOBE_ID_CUSTOM ::
+ * Adobe custom encoding.
+ * TT_ADOBE_ID_LATIN_1 ::
+ * Adobe Latin~1 encoding.
+ */
+
+#define TT_ADOBE_ID_STANDARD 0
+#define TT_ADOBE_ID_EXPERT 1
+#define TT_ADOBE_ID_CUSTOM 2
+#define TT_ADOBE_ID_LATIN_1 3
+
+
+ /*************************************************************************/
+ /* */
+ /* Possible values of the language identifier field in the name records */
+ /* of the TTF `name' table if the `platform' identifier code is */
+ /* TT_PLATFORM_MACINTOSH. These values are also used as return values */
+ /* for function @FT_Get_CMap_Language_ID. */
+ /* */
+ /* The canonical source for the Apple assigned Language ID's is at */
+ /* */
+ /* https://developer.apple.com/fonts/TTRefMan/RM06/Chap6name.html */
+ /* */
+#define TT_MAC_LANGID_ENGLISH 0
+#define TT_MAC_LANGID_FRENCH 1
+#define TT_MAC_LANGID_GERMAN 2
+#define TT_MAC_LANGID_ITALIAN 3
+#define TT_MAC_LANGID_DUTCH 4
+#define TT_MAC_LANGID_SWEDISH 5
+#define TT_MAC_LANGID_SPANISH 6
+#define TT_MAC_LANGID_DANISH 7
+#define TT_MAC_LANGID_PORTUGUESE 8
+#define TT_MAC_LANGID_NORWEGIAN 9
+#define TT_MAC_LANGID_HEBREW 10
+#define TT_MAC_LANGID_JAPANESE 11
+#define TT_MAC_LANGID_ARABIC 12
+#define TT_MAC_LANGID_FINNISH 13
+#define TT_MAC_LANGID_GREEK 14
+#define TT_MAC_LANGID_ICELANDIC 15
+#define TT_MAC_LANGID_MALTESE 16
+#define TT_MAC_LANGID_TURKISH 17
+#define TT_MAC_LANGID_CROATIAN 18
+#define TT_MAC_LANGID_CHINESE_TRADITIONAL 19
+#define TT_MAC_LANGID_URDU 20
+#define TT_MAC_LANGID_HINDI 21
+#define TT_MAC_LANGID_THAI 22
+#define TT_MAC_LANGID_KOREAN 23
+#define TT_MAC_LANGID_LITHUANIAN 24
+#define TT_MAC_LANGID_POLISH 25
+#define TT_MAC_LANGID_HUNGARIAN 26
+#define TT_MAC_LANGID_ESTONIAN 27
+#define TT_MAC_LANGID_LETTISH 28
+#define TT_MAC_LANGID_SAAMISK 29
+#define TT_MAC_LANGID_FAEROESE 30
+#define TT_MAC_LANGID_FARSI 31
+#define TT_MAC_LANGID_RUSSIAN 32
+#define TT_MAC_LANGID_CHINESE_SIMPLIFIED 33
+#define TT_MAC_LANGID_FLEMISH 34
+#define TT_MAC_LANGID_IRISH 35
+#define TT_MAC_LANGID_ALBANIAN 36
+#define TT_MAC_LANGID_ROMANIAN 37
+#define TT_MAC_LANGID_CZECH 38
+#define TT_MAC_LANGID_SLOVAK 39
+#define TT_MAC_LANGID_SLOVENIAN 40
+#define TT_MAC_LANGID_YIDDISH 41
+#define TT_MAC_LANGID_SERBIAN 42
+#define TT_MAC_LANGID_MACEDONIAN 43
+#define TT_MAC_LANGID_BULGARIAN 44
+#define TT_MAC_LANGID_UKRAINIAN 45
+#define TT_MAC_LANGID_BYELORUSSIAN 46
+#define TT_MAC_LANGID_UZBEK 47
+#define TT_MAC_LANGID_KAZAKH 48
+#define TT_MAC_LANGID_AZERBAIJANI 49
+#define TT_MAC_LANGID_AZERBAIJANI_CYRILLIC_SCRIPT 49
+#define TT_MAC_LANGID_AZERBAIJANI_ARABIC_SCRIPT 50
+#define TT_MAC_LANGID_ARMENIAN 51
+#define TT_MAC_LANGID_GEORGIAN 52
+#define TT_MAC_LANGID_MOLDAVIAN 53
+#define TT_MAC_LANGID_KIRGHIZ 54
+#define TT_MAC_LANGID_TAJIKI 55
+#define TT_MAC_LANGID_TURKMEN 56
+#define TT_MAC_LANGID_MONGOLIAN 57
+#define TT_MAC_LANGID_MONGOLIAN_MONGOLIAN_SCRIPT 57
+#define TT_MAC_LANGID_MONGOLIAN_CYRILLIC_SCRIPT 58
+#define TT_MAC_LANGID_PASHTO 59
+#define TT_MAC_LANGID_KURDISH 60
+#define TT_MAC_LANGID_KASHMIRI 61
+#define TT_MAC_LANGID_SINDHI 62
+#define TT_MAC_LANGID_TIBETAN 63
+#define TT_MAC_LANGID_NEPALI 64
+#define TT_MAC_LANGID_SANSKRIT 65
+#define TT_MAC_LANGID_MARATHI 66
+#define TT_MAC_LANGID_BENGALI 67
+#define TT_MAC_LANGID_ASSAMESE 68
+#define TT_MAC_LANGID_GUJARATI 69
+#define TT_MAC_LANGID_PUNJABI 70
+#define TT_MAC_LANGID_ORIYA 71
+#define TT_MAC_LANGID_MALAYALAM 72
+#define TT_MAC_LANGID_KANNADA 73
+#define TT_MAC_LANGID_TAMIL 74
+#define TT_MAC_LANGID_TELUGU 75
+#define TT_MAC_LANGID_SINHALESE 76
+#define TT_MAC_LANGID_BURMESE 77
+#define TT_MAC_LANGID_KHMER 78
+#define TT_MAC_LANGID_LAO 79
+#define TT_MAC_LANGID_VIETNAMESE 80
+#define TT_MAC_LANGID_INDONESIAN 81
+#define TT_MAC_LANGID_TAGALOG 82
+#define TT_MAC_LANGID_MALAY_ROMAN_SCRIPT 83
+#define TT_MAC_LANGID_MALAY_ARABIC_SCRIPT 84
+#define TT_MAC_LANGID_AMHARIC 85
+#define TT_MAC_LANGID_TIGRINYA 86
+#define TT_MAC_LANGID_GALLA 87
+#define TT_MAC_LANGID_SOMALI 88
+#define TT_MAC_LANGID_SWAHILI 89
+#define TT_MAC_LANGID_RUANDA 90
+#define TT_MAC_LANGID_RUNDI 91
+#define TT_MAC_LANGID_CHEWA 92
+#define TT_MAC_LANGID_MALAGASY 93
+#define TT_MAC_LANGID_ESPERANTO 94
+#define TT_MAC_LANGID_WELSH 128
+#define TT_MAC_LANGID_BASQUE 129
+#define TT_MAC_LANGID_CATALAN 130
+#define TT_MAC_LANGID_LATIN 131
+#define TT_MAC_LANGID_QUECHUA 132
+#define TT_MAC_LANGID_GUARANI 133
+#define TT_MAC_LANGID_AYMARA 134
+#define TT_MAC_LANGID_TATAR 135
+#define TT_MAC_LANGID_UIGHUR 136
+#define TT_MAC_LANGID_DZONGKHA 137
+#define TT_MAC_LANGID_JAVANESE 138
+#define TT_MAC_LANGID_SUNDANESE 139
+
+
+#if 0 /* these seem to be errors that have been dropped */
+
+#define TT_MAC_LANGID_SCOTTISH_GAELIC 140
+#define TT_MAC_LANGID_IRISH_GAELIC 141
+
+#endif
+
+
+ /* The following codes are new as of 2000-03-10 */
+#define TT_MAC_LANGID_GALICIAN 140
+#define TT_MAC_LANGID_AFRIKAANS 141
+#define TT_MAC_LANGID_BRETON 142
+#define TT_MAC_LANGID_INUKTITUT 143
+#define TT_MAC_LANGID_SCOTTISH_GAELIC 144
+#define TT_MAC_LANGID_MANX_GAELIC 145
+#define TT_MAC_LANGID_IRISH_GAELIC 146
+#define TT_MAC_LANGID_TONGAN 147
+#define TT_MAC_LANGID_GREEK_POLYTONIC 148
+#define TT_MAC_LANGID_GREELANDIC 149
+#define TT_MAC_LANGID_AZERBAIJANI_ROMAN_SCRIPT 150
+
+
+ /*************************************************************************/
+ /* */
+ /* Possible values of the language identifier field in the name records */
+ /* of the TTF `name' table if the `platform' identifier code is */
+ /* TT_PLATFORM_MICROSOFT. */
+ /* */
+ /* The canonical source for the MS assigned LCIDs is */
+ /* */
+ /* http://www.microsoft.com/globaldev/reference/lcid-all.mspx */
+ /* */
+
+#define TT_MS_LANGID_ARABIC_GENERAL 0x0001
+#define TT_MS_LANGID_ARABIC_SAUDI_ARABIA 0x0401
+#define TT_MS_LANGID_ARABIC_IRAQ 0x0801
+#define TT_MS_LANGID_ARABIC_EGYPT 0x0c01
+#define TT_MS_LANGID_ARABIC_LIBYA 0x1001
+#define TT_MS_LANGID_ARABIC_ALGERIA 0x1401
+#define TT_MS_LANGID_ARABIC_MOROCCO 0x1801
+#define TT_MS_LANGID_ARABIC_TUNISIA 0x1c01
+#define TT_MS_LANGID_ARABIC_OMAN 0x2001
+#define TT_MS_LANGID_ARABIC_YEMEN 0x2401
+#define TT_MS_LANGID_ARABIC_SYRIA 0x2801
+#define TT_MS_LANGID_ARABIC_JORDAN 0x2c01
+#define TT_MS_LANGID_ARABIC_LEBANON 0x3001
+#define TT_MS_LANGID_ARABIC_KUWAIT 0x3401
+#define TT_MS_LANGID_ARABIC_UAE 0x3801
+#define TT_MS_LANGID_ARABIC_BAHRAIN 0x3c01
+#define TT_MS_LANGID_ARABIC_QATAR 0x4001
+#define TT_MS_LANGID_BULGARIAN_BULGARIA 0x0402
+#define TT_MS_LANGID_CATALAN_SPAIN 0x0403
+#define TT_MS_LANGID_CHINESE_GENERAL 0x0004
+#define TT_MS_LANGID_CHINESE_TAIWAN 0x0404
+#define TT_MS_LANGID_CHINESE_PRC 0x0804
+#define TT_MS_LANGID_CHINESE_HONG_KONG 0x0c04
+#define TT_MS_LANGID_CHINESE_SINGAPORE 0x1004
+
+#if 1 /* this looks like the correct value */
+#define TT_MS_LANGID_CHINESE_MACAU 0x1404
+#else /* but beware, Microsoft may change its mind...
+ the most recent Word reference has the following: */
+#define TT_MS_LANGID_CHINESE_MACAU TT_MS_LANGID_CHINESE_HONG_KONG
+#endif
+
+#if 0 /* used only with .NET `cultures'; commented out */
+#define TT_MS_LANGID_CHINESE_TRADITIONAL 0x7C04
+#endif
+
+#define TT_MS_LANGID_CZECH_CZECH_REPUBLIC 0x0405
+#define TT_MS_LANGID_DANISH_DENMARK 0x0406
+#define TT_MS_LANGID_GERMAN_GERMANY 0x0407
+#define TT_MS_LANGID_GERMAN_SWITZERLAND 0x0807
+#define TT_MS_LANGID_GERMAN_AUSTRIA 0x0c07
+#define TT_MS_LANGID_GERMAN_LUXEMBOURG 0x1007
+#define TT_MS_LANGID_GERMAN_LIECHTENSTEI 0x1407
+#define TT_MS_LANGID_GREEK_GREECE 0x0408
+
+ /* don't ask what this one means... It is commented out currently. */
+#if 0
+#define TT_MS_LANGID_GREEK_GREECE2 0x2008
+#endif
+
+#define TT_MS_LANGID_ENGLISH_GENERAL 0x0009
+#define TT_MS_LANGID_ENGLISH_UNITED_STATES 0x0409
+#define TT_MS_LANGID_ENGLISH_UNITED_KINGDOM 0x0809
+#define TT_MS_LANGID_ENGLISH_AUSTRALIA 0x0c09
+#define TT_MS_LANGID_ENGLISH_CANADA 0x1009
+#define TT_MS_LANGID_ENGLISH_NEW_ZEALAND 0x1409
+#define TT_MS_LANGID_ENGLISH_IRELAND 0x1809
+#define TT_MS_LANGID_ENGLISH_SOUTH_AFRICA 0x1c09
+#define TT_MS_LANGID_ENGLISH_JAMAICA 0x2009
+#define TT_MS_LANGID_ENGLISH_CARIBBEAN 0x2409
+#define TT_MS_LANGID_ENGLISH_BELIZE 0x2809
+#define TT_MS_LANGID_ENGLISH_TRINIDAD 0x2c09
+#define TT_MS_LANGID_ENGLISH_ZIMBABWE 0x3009
+#define TT_MS_LANGID_ENGLISH_PHILIPPINES 0x3409
+#define TT_MS_LANGID_ENGLISH_INDONESIA 0x3809
+#define TT_MS_LANGID_ENGLISH_HONG_KONG 0x3c09
+#define TT_MS_LANGID_ENGLISH_INDIA 0x4009
+#define TT_MS_LANGID_ENGLISH_MALAYSIA 0x4409
+#define TT_MS_LANGID_ENGLISH_SINGAPORE 0x4809
+#define TT_MS_LANGID_SPANISH_SPAIN_TRADITIONAL_SORT 0x040a
+#define TT_MS_LANGID_SPANISH_MEXICO 0x080a
+#define TT_MS_LANGID_SPANISH_SPAIN_INTERNATIONAL_SORT 0x0c0a
+#define TT_MS_LANGID_SPANISH_GUATEMALA 0x100a
+#define TT_MS_LANGID_SPANISH_COSTA_RICA 0x140a
+#define TT_MS_LANGID_SPANISH_PANAMA 0x180a
+#define TT_MS_LANGID_SPANISH_DOMINICAN_REPUBLIC 0x1c0a
+#define TT_MS_LANGID_SPANISH_VENEZUELA 0x200a
+#define TT_MS_LANGID_SPANISH_COLOMBIA 0x240a
+#define TT_MS_LANGID_SPANISH_PERU 0x280a
+#define TT_MS_LANGID_SPANISH_ARGENTINA 0x2c0a
+#define TT_MS_LANGID_SPANISH_ECUADOR 0x300a
+#define TT_MS_LANGID_SPANISH_CHILE 0x340a
+#define TT_MS_LANGID_SPANISH_URUGUAY 0x380a
+#define TT_MS_LANGID_SPANISH_PARAGUAY 0x3c0a
+#define TT_MS_LANGID_SPANISH_BOLIVIA 0x400a
+#define TT_MS_LANGID_SPANISH_EL_SALVADOR 0x440a
+#define TT_MS_LANGID_SPANISH_HONDURAS 0x480a
+#define TT_MS_LANGID_SPANISH_NICARAGUA 0x4c0a
+#define TT_MS_LANGID_SPANISH_PUERTO_RICO 0x500a
+#define TT_MS_LANGID_SPANISH_UNITED_STATES 0x540a
+ /* The following ID blatantly violate MS specs by using a */
+ /* sublanguage > 0x1F. */
+#define TT_MS_LANGID_SPANISH_LATIN_AMERICA 0xE40aU
+#define TT_MS_LANGID_FINNISH_FINLAND 0x040b
+#define TT_MS_LANGID_FRENCH_FRANCE 0x040c
+#define TT_MS_LANGID_FRENCH_BELGIUM 0x080c
+#define TT_MS_LANGID_FRENCH_CANADA 0x0c0c
+#define TT_MS_LANGID_FRENCH_SWITZERLAND 0x100c
+#define TT_MS_LANGID_FRENCH_LUXEMBOURG 0x140c
+#define TT_MS_LANGID_FRENCH_MONACO 0x180c
+#define TT_MS_LANGID_FRENCH_WEST_INDIES 0x1c0c
+#define TT_MS_LANGID_FRENCH_REUNION 0x200c
+#define TT_MS_LANGID_FRENCH_CONGO 0x240c
+ /* which was formerly: */
+#define TT_MS_LANGID_FRENCH_ZAIRE TT_MS_LANGID_FRENCH_CONGO
+#define TT_MS_LANGID_FRENCH_SENEGAL 0x280c
+#define TT_MS_LANGID_FRENCH_CAMEROON 0x2c0c
+#define TT_MS_LANGID_FRENCH_COTE_D_IVOIRE 0x300c
+#define TT_MS_LANGID_FRENCH_MALI 0x340c
+#define TT_MS_LANGID_FRENCH_MOROCCO 0x380c
+#define TT_MS_LANGID_FRENCH_HAITI 0x3c0c
+ /* and another violation of the spec (see 0xE40aU) */
+#define TT_MS_LANGID_FRENCH_NORTH_AFRICA 0xE40cU
+#define TT_MS_LANGID_HEBREW_ISRAEL 0x040d
+#define TT_MS_LANGID_HUNGARIAN_HUNGARY 0x040e
+#define TT_MS_LANGID_ICELANDIC_ICELAND 0x040f
+#define TT_MS_LANGID_ITALIAN_ITALY 0x0410
+#define TT_MS_LANGID_ITALIAN_SWITZERLAND 0x0810
+#define TT_MS_LANGID_JAPANESE_JAPAN 0x0411
+#define TT_MS_LANGID_KOREAN_EXTENDED_WANSUNG_KOREA 0x0412
+#define TT_MS_LANGID_KOREAN_JOHAB_KOREA 0x0812
+#define TT_MS_LANGID_DUTCH_NETHERLANDS 0x0413
+#define TT_MS_LANGID_DUTCH_BELGIUM 0x0813
+#define TT_MS_LANGID_NORWEGIAN_NORWAY_BOKMAL 0x0414
+#define TT_MS_LANGID_NORWEGIAN_NORWAY_NYNORSK 0x0814
+#define TT_MS_LANGID_POLISH_POLAND 0x0415
+#define TT_MS_LANGID_PORTUGUESE_BRAZIL 0x0416
+#define TT_MS_LANGID_PORTUGUESE_PORTUGAL 0x0816
+#define TT_MS_LANGID_RHAETO_ROMANIC_SWITZERLAND 0x0417
+#define TT_MS_LANGID_ROMANIAN_ROMANIA 0x0418
+#define TT_MS_LANGID_MOLDAVIAN_MOLDAVIA 0x0818
+#define TT_MS_LANGID_RUSSIAN_RUSSIA 0x0419
+#define TT_MS_LANGID_RUSSIAN_MOLDAVIA 0x0819
+#define TT_MS_LANGID_CROATIAN_CROATIA 0x041a
+#define TT_MS_LANGID_SERBIAN_SERBIA_LATIN 0x081a
+#define TT_MS_LANGID_SERBIAN_SERBIA_CYRILLIC 0x0c1a
+
+#if 0 /* this used to be this value, but it looks like we were wrong */
+#define TT_MS_LANGID_BOSNIAN_BOSNIA_HERZEGOVINA 0x101a
+#else /* current sources say */
+#define TT_MS_LANGID_CROATIAN_BOSNIA_HERZEGOVINA 0x101a
+#define TT_MS_LANGID_BOSNIAN_BOSNIA_HERZEGOVINA 0x141a
+ /* and XPsp2 Platform SDK added (2004-07-26) */
+ /* Names are shortened to be significant within 40 chars. */
+#define TT_MS_LANGID_SERBIAN_BOSNIA_HERZ_LATIN 0x181a
+#define TT_MS_LANGID_SERBIAN_BOSNIA_HERZ_CYRILLIC 0x181a
+#endif
+
+#define TT_MS_LANGID_SLOVAK_SLOVAKIA 0x041b
+#define TT_MS_LANGID_ALBANIAN_ALBANIA 0x041c
+#define TT_MS_LANGID_SWEDISH_SWEDEN 0x041d
+#define TT_MS_LANGID_SWEDISH_FINLAND 0x081d
+#define TT_MS_LANGID_THAI_THAILAND 0x041e
+#define TT_MS_LANGID_TURKISH_TURKEY 0x041f
+#define TT_MS_LANGID_URDU_PAKISTAN 0x0420
+#define TT_MS_LANGID_URDU_INDIA 0x0820
+#define TT_MS_LANGID_INDONESIAN_INDONESIA 0x0421
+#define TT_MS_LANGID_UKRAINIAN_UKRAINE 0x0422
+#define TT_MS_LANGID_BELARUSIAN_BELARUS 0x0423
+#define TT_MS_LANGID_SLOVENE_SLOVENIA 0x0424
+#define TT_MS_LANGID_ESTONIAN_ESTONIA 0x0425
+#define TT_MS_LANGID_LATVIAN_LATVIA 0x0426
+#define TT_MS_LANGID_LITHUANIAN_LITHUANIA 0x0427
+#define TT_MS_LANGID_CLASSIC_LITHUANIAN_LITHUANIA 0x0827
+#define TT_MS_LANGID_TAJIK_TAJIKISTAN 0x0428
+#define TT_MS_LANGID_FARSI_IRAN 0x0429
+#define TT_MS_LANGID_VIETNAMESE_VIET_NAM 0x042a
+#define TT_MS_LANGID_ARMENIAN_ARMENIA 0x042b
+#define TT_MS_LANGID_AZERI_AZERBAIJAN_LATIN 0x042c
+#define TT_MS_LANGID_AZERI_AZERBAIJAN_CYRILLIC 0x082c
+#define TT_MS_LANGID_BASQUE_SPAIN 0x042d
+#define TT_MS_LANGID_SORBIAN_GERMANY 0x042e
+#define TT_MS_LANGID_MACEDONIAN_MACEDONIA 0x042f
+#define TT_MS_LANGID_SUTU_SOUTH_AFRICA 0x0430
+#define TT_MS_LANGID_TSONGA_SOUTH_AFRICA 0x0431
+#define TT_MS_LANGID_TSWANA_SOUTH_AFRICA 0x0432
+#define TT_MS_LANGID_VENDA_SOUTH_AFRICA 0x0433
+#define TT_MS_LANGID_XHOSA_SOUTH_AFRICA 0x0434
+#define TT_MS_LANGID_ZULU_SOUTH_AFRICA 0x0435
+#define TT_MS_LANGID_AFRIKAANS_SOUTH_AFRICA 0x0436
+#define TT_MS_LANGID_GEORGIAN_GEORGIA 0x0437
+#define TT_MS_LANGID_FAEROESE_FAEROE_ISLANDS 0x0438
+#define TT_MS_LANGID_HINDI_INDIA 0x0439
+#define TT_MS_LANGID_MALTESE_MALTA 0x043a
+ /* Added by XPsp2 Platform SDK (2004-07-26) */
+#define TT_MS_LANGID_SAMI_NORTHERN_NORWAY 0x043b
+#define TT_MS_LANGID_SAMI_NORTHERN_SWEDEN 0x083b
+#define TT_MS_LANGID_SAMI_NORTHERN_FINLAND 0x0C3b
+#define TT_MS_LANGID_SAMI_LULE_NORWAY 0x103b
+#define TT_MS_LANGID_SAMI_LULE_SWEDEN 0x143b
+#define TT_MS_LANGID_SAMI_SOUTHERN_NORWAY 0x183b
+#define TT_MS_LANGID_SAMI_SOUTHERN_SWEDEN 0x1C3b
+#define TT_MS_LANGID_SAMI_SKOLT_FINLAND 0x203b
+#define TT_MS_LANGID_SAMI_INARI_FINLAND 0x243b
+ /* ... and we also keep our old identifier... */
+#define TT_MS_LANGID_SAAMI_LAPONIA 0x043b
+
+#if 0 /* this seems to be a previous inversion */
+#define TT_MS_LANGID_IRISH_GAELIC_IRELAND 0x043c
+#define TT_MS_LANGID_SCOTTISH_GAELIC_UNITED_KINGDOM 0x083c
+#else
+#define TT_MS_LANGID_SCOTTISH_GAELIC_UNITED_KINGDOM 0x083c
+#define TT_MS_LANGID_IRISH_GAELIC_IRELAND 0x043c
+#endif
+
+#define TT_MS_LANGID_YIDDISH_GERMANY 0x043d
+#define TT_MS_LANGID_MALAY_MALAYSIA 0x043e
+#define TT_MS_LANGID_MALAY_BRUNEI_DARUSSALAM 0x083e
+#define TT_MS_LANGID_KAZAK_KAZAKSTAN 0x043f
+#define TT_MS_LANGID_KIRGHIZ_KIRGHIZSTAN /* Cyrillic*/ 0x0440
+ /* alias declared in Windows 2000 */
+#define TT_MS_LANGID_KIRGHIZ_KIRGHIZ_REPUBLIC \
+ TT_MS_LANGID_KIRGHIZ_KIRGHIZSTAN
+
+#define TT_MS_LANGID_SWAHILI_KENYA 0x0441
+#define TT_MS_LANGID_TURKMEN_TURKMENISTAN 0x0442
+#define TT_MS_LANGID_UZBEK_UZBEKISTAN_LATIN 0x0443
+#define TT_MS_LANGID_UZBEK_UZBEKISTAN_CYRILLIC 0x0843
+#define TT_MS_LANGID_TATAR_TATARSTAN 0x0444
+#define TT_MS_LANGID_BENGALI_INDIA 0x0445
+#define TT_MS_LANGID_BENGALI_BANGLADESH 0x0845
+#define TT_MS_LANGID_PUNJABI_INDIA 0x0446
+#define TT_MS_LANGID_PUNJABI_ARABIC_PAKISTAN 0x0846
+#define TT_MS_LANGID_GUJARATI_INDIA 0x0447
+#define TT_MS_LANGID_ORIYA_INDIA 0x0448
+#define TT_MS_LANGID_TAMIL_INDIA 0x0449
+#define TT_MS_LANGID_TELUGU_INDIA 0x044a
+#define TT_MS_LANGID_KANNADA_INDIA 0x044b
+#define TT_MS_LANGID_MALAYALAM_INDIA 0x044c
+#define TT_MS_LANGID_ASSAMESE_INDIA 0x044d
+#define TT_MS_LANGID_MARATHI_INDIA 0x044e
+#define TT_MS_LANGID_SANSKRIT_INDIA 0x044f
+#define TT_MS_LANGID_MONGOLIAN_MONGOLIA /* Cyrillic */ 0x0450
+#define TT_MS_LANGID_MONGOLIAN_MONGOLIA_MONGOLIAN 0x0850
+#define TT_MS_LANGID_TIBETAN_CHINA 0x0451
+ /* Don't use the next constant! It has */
+ /* (1) the wrong spelling (Dzonghka) */
+ /* (2) Microsoft doesn't officially define it -- */
+ /* at least it is not in the List of Local */
+ /* ID Values. */
+ /* (3) Dzongkha is not the same language as */
+ /* Tibetan, so merging it is wrong anyway. */
+ /* */
+ /* TT_MS_LANGID_TIBETAN_BHUTAN is correct, BTW. */
+#define TT_MS_LANGID_DZONGHKA_BHUTAN 0x0851
+
+#if 0
+ /* the following used to be defined */
+#define TT_MS_LANGID_TIBETAN_BHUTAN 0x0451
+ /* ... but it was changed; */
+#else
+ /* So we will continue to #define it, but with the correct value */
+#define TT_MS_LANGID_TIBETAN_BHUTAN TT_MS_LANGID_DZONGHKA_BHUTAN
+#endif
+
+#define TT_MS_LANGID_WELSH_WALES 0x0452
+#define TT_MS_LANGID_KHMER_CAMBODIA 0x0453
+#define TT_MS_LANGID_LAO_LAOS 0x0454
+#define TT_MS_LANGID_BURMESE_MYANMAR 0x0455
+#define TT_MS_LANGID_GALICIAN_SPAIN 0x0456
+#define TT_MS_LANGID_KONKANI_INDIA 0x0457
+#define TT_MS_LANGID_MANIPURI_INDIA /* Bengali */ 0x0458
+#define TT_MS_LANGID_SINDHI_INDIA /* Arabic */ 0x0459
+#define TT_MS_LANGID_SINDHI_PAKISTAN 0x0859
+ /* Missing a LCID for Sindhi in Devanagari script */
+#define TT_MS_LANGID_SYRIAC_SYRIA 0x045a
+#define TT_MS_LANGID_SINHALESE_SRI_LANKA 0x045b
+#define TT_MS_LANGID_CHEROKEE_UNITED_STATES 0x045c
+#define TT_MS_LANGID_INUKTITUT_CANADA 0x045d
+#define TT_MS_LANGID_AMHARIC_ETHIOPIA 0x045e
+#define TT_MS_LANGID_TAMAZIGHT_MOROCCO /* Arabic */ 0x045f
+#define TT_MS_LANGID_TAMAZIGHT_MOROCCO_LATIN 0x085f
+ /* Missing a LCID for Tifinagh script */
+#define TT_MS_LANGID_KASHMIRI_PAKISTAN /* Arabic */ 0x0460
+ /* Spelled this way by XPsp2 Platform SDK (2004-07-26) */
+ /* script is yet unclear... might be Arabic, Nagari or Sharada */
+#define TT_MS_LANGID_KASHMIRI_SASIA 0x0860
+ /* ... and aliased (by MS) for compatibility reasons. */
+#define TT_MS_LANGID_KASHMIRI_INDIA TT_MS_LANGID_KASHMIRI_SASIA
+#define TT_MS_LANGID_NEPALI_NEPAL 0x0461
+#define TT_MS_LANGID_NEPALI_INDIA 0x0861
+#define TT_MS_LANGID_FRISIAN_NETHERLANDS 0x0462
+#define TT_MS_LANGID_PASHTO_AFGHANISTAN 0x0463
+#define TT_MS_LANGID_FILIPINO_PHILIPPINES 0x0464
+#define TT_MS_LANGID_DHIVEHI_MALDIVES 0x0465
+ /* alias declared in Windows 2000 */
+#define TT_MS_LANGID_DIVEHI_MALDIVES TT_MS_LANGID_DHIVEHI_MALDIVES
+#define TT_MS_LANGID_EDO_NIGERIA 0x0466
+#define TT_MS_LANGID_FULFULDE_NIGERIA 0x0467
+#define TT_MS_LANGID_HAUSA_NIGERIA 0x0468
+#define TT_MS_LANGID_IBIBIO_NIGERIA 0x0469
+#define TT_MS_LANGID_YORUBA_NIGERIA 0x046a
+#define TT_MS_LANGID_QUECHUA_BOLIVIA 0x046b
+#define TT_MS_LANGID_QUECHUA_ECUADOR 0x086b
+#define TT_MS_LANGID_QUECHUA_PERU 0x0c6b
+#define TT_MS_LANGID_SEPEDI_SOUTH_AFRICA 0x046c
+ /* Also spelled by XPsp2 Platform SDK (2004-07-26) */
+#define TT_MS_LANGID_SOTHO_SOUTHERN_SOUTH_AFRICA \
+ TT_MS_LANGID_SEPEDI_SOUTH_AFRICA
+ /* language codes 0x046d, 0x046e and 0x046f are (still) unknown. */
+#define TT_MS_LANGID_IGBO_NIGERIA 0x0470
+#define TT_MS_LANGID_KANURI_NIGERIA 0x0471
+#define TT_MS_LANGID_OROMO_ETHIOPIA 0x0472
+#define TT_MS_LANGID_TIGRIGNA_ETHIOPIA 0x0473
+#define TT_MS_LANGID_TIGRIGNA_ERYTHREA 0x0873
+ /* also spelled in the `Passport SDK' list as: */
+#define TT_MS_LANGID_TIGRIGNA_ERYTREA TT_MS_LANGID_TIGRIGNA_ERYTHREA
+#define TT_MS_LANGID_GUARANI_PARAGUAY 0x0474
+#define TT_MS_LANGID_HAWAIIAN_UNITED_STATES 0x0475
+#define TT_MS_LANGID_LATIN 0x0476
+#define TT_MS_LANGID_SOMALI_SOMALIA 0x0477
+ /* Note: Yi does not have a (proper) ISO 639-2 code, since it is mostly */
+ /* not written (but OTOH the peculiar writing system is worth */
+ /* studying). */
+#define TT_MS_LANGID_YI_CHINA 0x0478
+#define TT_MS_LANGID_PAPIAMENTU_NETHERLANDS_ANTILLES 0x0479
+ /* language codes from 0x047a to 0x047f are (still) unknown. */
+#define TT_MS_LANGID_UIGHUR_CHINA 0x0480
+#define TT_MS_LANGID_MAORI_NEW_ZEALAND 0x0481
+
+#if 0 /* not deemed useful for fonts */
+#define TT_MS_LANGID_HUMAN_INTERFACE_DEVICE 0x04ff
+#endif
+
+
+ /*************************************************************************/
+ /* */
+ /* Possible values of the `name' identifier field in the name records of */
+ /* the TTF `name' table. These values are platform independent. */
+ /* */
+#define TT_NAME_ID_COPYRIGHT 0
+#define TT_NAME_ID_FONT_FAMILY 1
+#define TT_NAME_ID_FONT_SUBFAMILY 2
+#define TT_NAME_ID_UNIQUE_ID 3
+#define TT_NAME_ID_FULL_NAME 4
+#define TT_NAME_ID_VERSION_STRING 5
+#define TT_NAME_ID_PS_NAME 6
+#define TT_NAME_ID_TRADEMARK 7
+
+ /* the following values are from the OpenType spec */
+#define TT_NAME_ID_MANUFACTURER 8
+#define TT_NAME_ID_DESIGNER 9
+#define TT_NAME_ID_DESCRIPTION 10
+#define TT_NAME_ID_VENDOR_URL 11
+#define TT_NAME_ID_DESIGNER_URL 12
+#define TT_NAME_ID_LICENSE 13
+#define TT_NAME_ID_LICENSE_URL 14
+ /* number 15 is reserved */
+#define TT_NAME_ID_PREFERRED_FAMILY 16
+#define TT_NAME_ID_PREFERRED_SUBFAMILY 17
+#define TT_NAME_ID_MAC_FULL_NAME 18
+
+ /* The following code is new as of 2000-01-21 */
+#define TT_NAME_ID_SAMPLE_TEXT 19
+
+ /* This is new in OpenType 1.3 */
+#define TT_NAME_ID_CID_FINDFONT_NAME 20
+
+ /* This is new in OpenType 1.5 */
+#define TT_NAME_ID_WWS_FAMILY 21
+#define TT_NAME_ID_WWS_SUBFAMILY 22
+
+
+ /*************************************************************************/
+ /* */
+ /* Bit mask values for the Unicode Ranges from the TTF `OS2 ' table. */
+ /* */
+ /* Updated 08-Nov-2008. */
+ /* */
+
+ /* Bit 0 Basic Latin */
+#define TT_UCR_BASIC_LATIN (1L << 0) /* U+0020-U+007E */
+ /* Bit 1 C1 Controls and Latin-1 Supplement */
+#define TT_UCR_LATIN1_SUPPLEMENT (1L << 1) /* U+0080-U+00FF */
+ /* Bit 2 Latin Extended-A */
+#define TT_UCR_LATIN_EXTENDED_A (1L << 2) /* U+0100-U+017F */
+ /* Bit 3 Latin Extended-B */
+#define TT_UCR_LATIN_EXTENDED_B (1L << 3) /* U+0180-U+024F */
+ /* Bit 4 IPA Extensions */
+ /* Phonetic Extensions */
+ /* Phonetic Extensions Supplement */
+#define TT_UCR_IPA_EXTENSIONS (1L << 4) /* U+0250-U+02AF */
+ /* U+1D00-U+1D7F */
+ /* U+1D80-U+1DBF */
+ /* Bit 5 Spacing Modifier Letters */
+ /* Modifier Tone Letters */
+#define TT_UCR_SPACING_MODIFIER (1L << 5) /* U+02B0-U+02FF */
+ /* U+A700-U+A71F */
+ /* Bit 6 Combining Diacritical Marks */
+ /* Combining Diacritical Marks Supplement */
+#define TT_UCR_COMBINING_DIACRITICS (1L << 6) /* U+0300-U+036F */
+ /* U+1DC0-U+1DFF */
+ /* Bit 7 Greek and Coptic */
+#define TT_UCR_GREEK (1L << 7) /* U+0370-U+03FF */
+ /* Bit 8 Coptic */
+#define TT_UCR_COPTIC (1L << 8) /* U+2C80-U+2CFF */
+ /* Bit 9 Cyrillic */
+ /* Cyrillic Supplement */
+ /* Cyrillic Extended-A */
+ /* Cyrillic Extended-B */
+#define TT_UCR_CYRILLIC (1L << 9) /* U+0400-U+04FF */
+ /* U+0500-U+052F */
+ /* U+2DE0-U+2DFF */
+ /* U+A640-U+A69F */
+ /* Bit 10 Armenian */
+#define TT_UCR_ARMENIAN (1L << 10) /* U+0530-U+058F */
+ /* Bit 11 Hebrew */
+#define TT_UCR_HEBREW (1L << 11) /* U+0590-U+05FF */
+ /* Bit 12 Vai */
+#define TT_UCR_VAI (1L << 12) /* U+A500-U+A63F */
+ /* Bit 13 Arabic */
+ /* Arabic Supplement */
+#define TT_UCR_ARABIC (1L << 13) /* U+0600-U+06FF */
+ /* U+0750-U+077F */
+ /* Bit 14 NKo */
+#define TT_UCR_NKO (1L << 14) /* U+07C0-U+07FF */
+ /* Bit 15 Devanagari */
+#define TT_UCR_DEVANAGARI (1L << 15) /* U+0900-U+097F */
+ /* Bit 16 Bengali */
+#define TT_UCR_BENGALI (1L << 16) /* U+0980-U+09FF */
+ /* Bit 17 Gurmukhi */
+#define TT_UCR_GURMUKHI (1L << 17) /* U+0A00-U+0A7F */
+ /* Bit 18 Gujarati */
+#define TT_UCR_GUJARATI (1L << 18) /* U+0A80-U+0AFF */
+ /* Bit 19 Oriya */
+#define TT_UCR_ORIYA (1L << 19) /* U+0B00-U+0B7F */
+ /* Bit 20 Tamil */
+#define TT_UCR_TAMIL (1L << 20) /* U+0B80-U+0BFF */
+ /* Bit 21 Telugu */
+#define TT_UCR_TELUGU (1L << 21) /* U+0C00-U+0C7F */
+ /* Bit 22 Kannada */
+#define TT_UCR_KANNADA (1L << 22) /* U+0C80-U+0CFF */
+ /* Bit 23 Malayalam */
+#define TT_UCR_MALAYALAM (1L << 23) /* U+0D00-U+0D7F */
+ /* Bit 24 Thai */
+#define TT_UCR_THAI (1L << 24) /* U+0E00-U+0E7F */
+ /* Bit 25 Lao */
+#define TT_UCR_LAO (1L << 25) /* U+0E80-U+0EFF */
+ /* Bit 26 Georgian */
+ /* Georgian Supplement */
+#define TT_UCR_GEORGIAN (1L << 26) /* U+10A0-U+10FF */
+ /* U+2D00-U+2D2F */
+ /* Bit 27 Balinese */
+#define TT_UCR_BALINESE (1L << 27) /* U+1B00-U+1B7F */
+ /* Bit 28 Hangul Jamo */
+#define TT_UCR_HANGUL_JAMO (1L << 28) /* U+1100-U+11FF */
+ /* Bit 29 Latin Extended Additional */
+ /* Latin Extended-C */
+ /* Latin Extended-D */
+#define TT_UCR_LATIN_EXTENDED_ADDITIONAL (1L << 29) /* U+1E00-U+1EFF */
+ /* U+2C60-U+2C7F */
+ /* U+A720-U+A7FF */
+ /* Bit 30 Greek Extended */
+#define TT_UCR_GREEK_EXTENDED (1L << 30) /* U+1F00-U+1FFF */
+ /* Bit 31 General Punctuation */
+ /* Supplemental Punctuation */
+#define TT_UCR_GENERAL_PUNCTUATION (1L << 31) /* U+2000-U+206F */
+ /* U+2E00-U+2E7F */
+ /* Bit 32 Superscripts And Subscripts */
+#define TT_UCR_SUPERSCRIPTS_SUBSCRIPTS (1L << 0) /* U+2070-U+209F */
+ /* Bit 33 Currency Symbols */
+#define TT_UCR_CURRENCY_SYMBOLS (1L << 1) /* U+20A0-U+20CF */
+ /* Bit 34 Combining Diacritical Marks For Symbols */
+#define TT_UCR_COMBINING_DIACRITICS_SYMB (1L << 2) /* U+20D0-U+20FF */
+ /* Bit 35 Letterlike Symbols */
+#define TT_UCR_LETTERLIKE_SYMBOLS (1L << 3) /* U+2100-U+214F */
+ /* Bit 36 Number Forms */
+#define TT_UCR_NUMBER_FORMS (1L << 4) /* U+2150-U+218F */
+ /* Bit 37 Arrows */
+ /* Supplemental Arrows-A */
+ /* Supplemental Arrows-B */
+ /* Miscellaneous Symbols and Arrows */
+#define TT_UCR_ARROWS (1L << 5) /* U+2190-U+21FF */
+ /* U+27F0-U+27FF */
+ /* U+2900-U+297F */
+ /* U+2B00-U+2BFF */
+ /* Bit 38 Mathematical Operators */
+ /* Supplemental Mathematical Operators */
+ /* Miscellaneous Mathematical Symbols-A */
+ /* Miscellaneous Mathematical Symbols-B */
+#define TT_UCR_MATHEMATICAL_OPERATORS (1L << 6) /* U+2200-U+22FF */
+ /* U+2A00-U+2AFF */
+ /* U+27C0-U+27EF */
+ /* U+2980-U+29FF */
+ /* Bit 39 Miscellaneous Technical */
+#define TT_UCR_MISCELLANEOUS_TECHNICAL (1L << 7) /* U+2300-U+23FF */
+ /* Bit 40 Control Pictures */
+#define TT_UCR_CONTROL_PICTURES (1L << 8) /* U+2400-U+243F */
+ /* Bit 41 Optical Character Recognition */
+#define TT_UCR_OCR (1L << 9) /* U+2440-U+245F */
+ /* Bit 42 Enclosed Alphanumerics */
+#define TT_UCR_ENCLOSED_ALPHANUMERICS (1L << 10) /* U+2460-U+24FF */
+ /* Bit 43 Box Drawing */
+#define TT_UCR_BOX_DRAWING (1L << 11) /* U+2500-U+257F */
+ /* Bit 44 Block Elements */
+#define TT_UCR_BLOCK_ELEMENTS (1L << 12) /* U+2580-U+259F */
+ /* Bit 45 Geometric Shapes */
+#define TT_UCR_GEOMETRIC_SHAPES (1L << 13) /* U+25A0-U+25FF */
+ /* Bit 46 Miscellaneous Symbols */
+#define TT_UCR_MISCELLANEOUS_SYMBOLS (1L << 14) /* U+2600-U+26FF */
+ /* Bit 47 Dingbats */
+#define TT_UCR_DINGBATS (1L << 15) /* U+2700-U+27BF */
+ /* Bit 48 CJK Symbols and Punctuation */
+#define TT_UCR_CJK_SYMBOLS (1L << 16) /* U+3000-U+303F */
+ /* Bit 49 Hiragana */
+#define TT_UCR_HIRAGANA (1L << 17) /* U+3040-U+309F */
+ /* Bit 50 Katakana */
+ /* Katakana Phonetic Extensions */
+#define TT_UCR_KATAKANA (1L << 18) /* U+30A0-U+30FF */
+ /* U+31F0-U+31FF */
+ /* Bit 51 Bopomofo */
+ /* Bopomofo Extended */
+#define TT_UCR_BOPOMOFO (1L << 19) /* U+3100-U+312F */
+ /* U+31A0-U+31BF */
+ /* Bit 52 Hangul Compatibility Jamo */
+#define TT_UCR_HANGUL_COMPATIBILITY_JAMO (1L << 20) /* U+3130-U+318F */
+ /* Bit 53 Phags-Pa */
+#define TT_UCR_CJK_MISC (1L << 21) /* U+A840-U+A87F */
+#define TT_UCR_KANBUN TT_UCR_CJK_MISC /* deprecated */
+#define TT_UCR_PHAGSPA
+ /* Bit 54 Enclosed CJK Letters and Months */
+#define TT_UCR_ENCLOSED_CJK_LETTERS_MONTHS (1L << 22) /* U+3200-U+32FF */
+ /* Bit 55 CJK Compatibility */
+#define TT_UCR_CJK_COMPATIBILITY (1L << 23) /* U+3300-U+33FF */
+ /* Bit 56 Hangul Syllables */
+#define TT_UCR_HANGUL (1L << 24) /* U+AC00-U+D7A3 */
+ /* Bit 57 High Surrogates */
+ /* High Private Use Surrogates */
+ /* Low Surrogates */
+ /* */
+ /* According to OpenType specs v.1.3+, */
+ /* setting bit 57 implies that there is */
+ /* at least one codepoint beyond the */
+ /* Basic Multilingual Plane that is */
+ /* supported by this font. So it really */
+ /* means >= U+10000 */
+#define TT_UCR_SURROGATES (1L << 25) /* U+D800-U+DB7F */
+ /* U+DB80-U+DBFF */
+ /* U+DC00-U+DFFF */
+#define TT_UCR_NON_PLANE_0 TT_UCR_SURROGATES
+ /* Bit 58 Phoenician */
+#define TT_UCR_PHOENICIAN (1L << 26) /*U+10900-U+1091F*/
+ /* Bit 59 CJK Unified Ideographs */
+ /* CJK Radicals Supplement */
+ /* Kangxi Radicals */
+ /* Ideographic Description Characters */
+ /* CJK Unified Ideographs Extension A */
+ /* CJK Unified Ideographs Extension B */
+ /* Kanbun */
+#define TT_UCR_CJK_UNIFIED_IDEOGRAPHS (1L << 27) /* U+4E00-U+9FFF */
+ /* U+2E80-U+2EFF */
+ /* U+2F00-U+2FDF */
+ /* U+2FF0-U+2FFF */
+ /* U+3400-U+4DB5 */
+ /*U+20000-U+2A6DF*/
+ /* U+3190-U+319F */
+ /* Bit 60 Private Use */
+#define TT_UCR_PRIVATE_USE (1L << 28) /* U+E000-U+F8FF */
+ /* Bit 61 CJK Strokes */
+ /* CJK Compatibility Ideographs */
+ /* CJK Compatibility Ideographs Supplement */
+#define TT_UCR_CJK_COMPATIBILITY_IDEOGRAPHS (1L << 29) /* U+31C0-U+31EF */
+ /* U+F900-U+FAFF */
+ /*U+2F800-U+2FA1F*/
+ /* Bit 62 Alphabetic Presentation Forms */
+#define TT_UCR_ALPHABETIC_PRESENTATION_FORMS (1L << 30) /* U+FB00-U+FB4F */
+ /* Bit 63 Arabic Presentation Forms-A */
+#define TT_UCR_ARABIC_PRESENTATIONS_A (1L << 31) /* U+FB50-U+FDFF */
+ /* Bit 64 Combining Half Marks */
+#define TT_UCR_COMBINING_HALF_MARKS (1L << 0) /* U+FE20-U+FE2F */
+ /* Bit 65 Vertical forms */
+ /* CJK Compatibility Forms */
+#define TT_UCR_CJK_COMPATIBILITY_FORMS (1L << 1) /* U+FE10-U+FE1F */
+ /* U+FE30-U+FE4F */
+ /* Bit 66 Small Form Variants */
+#define TT_UCR_SMALL_FORM_VARIANTS (1L << 2) /* U+FE50-U+FE6F */
+ /* Bit 67 Arabic Presentation Forms-B */
+#define TT_UCR_ARABIC_PRESENTATIONS_B (1L << 3) /* U+FE70-U+FEFE */
+ /* Bit 68 Halfwidth and Fullwidth Forms */
+#define TT_UCR_HALFWIDTH_FULLWIDTH_FORMS (1L << 4) /* U+FF00-U+FFEF */
+ /* Bit 69 Specials */
+#define TT_UCR_SPECIALS (1L << 5) /* U+FFF0-U+FFFD */
+ /* Bit 70 Tibetan */
+#define TT_UCR_TIBETAN (1L << 6) /* U+0F00-U+0FFF */
+ /* Bit 71 Syriac */
+#define TT_UCR_SYRIAC (1L << 7) /* U+0700-U+074F */
+ /* Bit 72 Thaana */
+#define TT_UCR_THAANA (1L << 8) /* U+0780-U+07BF */
+ /* Bit 73 Sinhala */
+#define TT_UCR_SINHALA (1L << 9) /* U+0D80-U+0DFF */
+ /* Bit 74 Myanmar */
+#define TT_UCR_MYANMAR (1L << 10) /* U+1000-U+109F */
+ /* Bit 75 Ethiopic */
+ /* Ethiopic Supplement */
+ /* Ethiopic Extended */
+#define TT_UCR_ETHIOPIC (1L << 11) /* U+1200-U+137F */
+ /* U+1380-U+139F */
+ /* U+2D80-U+2DDF */
+ /* Bit 76 Cherokee */
+#define TT_UCR_CHEROKEE (1L << 12) /* U+13A0-U+13FF */
+ /* Bit 77 Unified Canadian Aboriginal Syllabics */
+#define TT_UCR_CANADIAN_ABORIGINAL_SYLLABICS (1L << 13) /* U+1400-U+167F */
+ /* Bit 78 Ogham */
+#define TT_UCR_OGHAM (1L << 14) /* U+1680-U+169F */
+ /* Bit 79 Runic */
+#define TT_UCR_RUNIC (1L << 15) /* U+16A0-U+16FF */
+ /* Bit 80 Khmer */
+ /* Khmer Symbols */
+#define TT_UCR_KHMER (1L << 16) /* U+1780-U+17FF */
+ /* U+19E0-U+19FF */
+ /* Bit 81 Mongolian */
+#define TT_UCR_MONGOLIAN (1L << 17) /* U+1800-U+18AF */
+ /* Bit 82 Braille Patterns */
+#define TT_UCR_BRAILLE (1L << 18) /* U+2800-U+28FF */
+ /* Bit 83 Yi Syllables */
+ /* Yi Radicals */
+#define TT_UCR_YI (1L << 19) /* U+A000-U+A48F */
+ /* U+A490-U+A4CF */
+ /* Bit 84 Tagalog */
+ /* Hanunoo */
+ /* Buhid */
+ /* Tagbanwa */
+#define TT_UCR_PHILIPPINE (1L << 20) /* U+1700-U+171F */
+ /* U+1720-U+173F */
+ /* U+1740-U+175F */
+ /* U+1760-U+177F */
+ /* Bit 85 Old Italic */
+#define TT_UCR_OLD_ITALIC (1L << 21) /*U+10300-U+1032F*/
+ /* Bit 86 Gothic */
+#define TT_UCR_GOTHIC (1L << 22) /*U+10330-U+1034F*/
+ /* Bit 87 Deseret */
+#define TT_UCR_DESERET (1L << 23) /*U+10400-U+1044F*/
+ /* Bit 88 Byzantine Musical Symbols */
+ /* Musical Symbols */
+ /* Ancient Greek Musical Notation */
+#define TT_UCR_MUSICAL_SYMBOLS (1L << 24) /*U+1D000-U+1D0FF*/
+ /*U+1D100-U+1D1FF*/
+ /*U+1D200-U+1D24F*/
+ /* Bit 89 Mathematical Alphanumeric Symbols */
+#define TT_UCR_MATH_ALPHANUMERIC_SYMBOLS (1L << 25) /*U+1D400-U+1D7FF*/
+ /* Bit 90 Private Use (plane 15) */
+ /* Private Use (plane 16) */
+#define TT_UCR_PRIVATE_USE_SUPPLEMENTARY (1L << 26) /*U+F0000-U+FFFFD*/
+ /*U+100000-U+10FFFD*/
+ /* Bit 91 Variation Selectors */
+ /* Variation Selectors Supplement */
+#define TT_UCR_VARIATION_SELECTORS (1L << 27) /* U+FE00-U+FE0F */
+ /*U+E0100-U+E01EF*/
+ /* Bit 92 Tags */
+#define TT_UCR_TAGS (1L << 28) /*U+E0000-U+E007F*/
+ /* Bit 93 Limbu */
+#define TT_UCR_LIMBU (1L << 29) /* U+1900-U+194F */
+ /* Bit 94 Tai Le */
+#define TT_UCR_TAI_LE (1L << 30) /* U+1950-U+197F */
+ /* Bit 95 New Tai Lue */
+#define TT_UCR_NEW_TAI_LUE (1L << 31) /* U+1980-U+19DF */
+ /* Bit 96 Buginese */
+#define TT_UCR_BUGINESE (1L << 0) /* U+1A00-U+1A1F */
+ /* Bit 97 Glagolitic */
+#define TT_UCR_GLAGOLITIC (1L << 1) /* U+2C00-U+2C5F */
+ /* Bit 98 Tifinagh */
+#define TT_UCR_TIFINAGH (1L << 2) /* U+2D30-U+2D7F */
+ /* Bit 99 Yijing Hexagram Symbols */
+#define TT_UCR_YIJING (1L << 3) /* U+4DC0-U+4DFF */
+ /* Bit 100 Syloti Nagri */
+#define TT_UCR_SYLOTI_NAGRI (1L << 4) /* U+A800-U+A82F */
+ /* Bit 101 Linear B Syllabary */
+ /* Linear B Ideograms */
+ /* Aegean Numbers */
+#define TT_UCR_LINEAR_B (1L << 5) /*U+10000-U+1007F*/
+ /*U+10080-U+100FF*/
+ /*U+10100-U+1013F*/
+ /* Bit 102 Ancient Greek Numbers */
+#define TT_UCR_ANCIENT_GREEK_NUMBERS (1L << 6) /*U+10140-U+1018F*/
+ /* Bit 103 Ugaritic */
+#define TT_UCR_UGARITIC (1L << 7) /*U+10380-U+1039F*/
+ /* Bit 104 Old Persian */
+#define TT_UCR_OLD_PERSIAN (1L << 8) /*U+103A0-U+103DF*/
+ /* Bit 105 Shavian */
+#define TT_UCR_SHAVIAN (1L << 9) /*U+10450-U+1047F*/
+ /* Bit 106 Osmanya */
+#define TT_UCR_OSMANYA (1L << 10) /*U+10480-U+104AF*/
+ /* Bit 107 Cypriot Syllabary */
+#define TT_UCR_CYPRIOT_SYLLABARY (1L << 11) /*U+10800-U+1083F*/
+ /* Bit 108 Kharoshthi */
+#define TT_UCR_KHAROSHTHI (1L << 12) /*U+10A00-U+10A5F*/
+ /* Bit 109 Tai Xuan Jing Symbols */
+#define TT_UCR_TAI_XUAN_JING (1L << 13) /*U+1D300-U+1D35F*/
+ /* Bit 110 Cuneiform */
+ /* Cuneiform Numbers and Punctuation */
+#define TT_UCR_CUNEIFORM (1L << 14) /*U+12000-U+123FF*/
+ /*U+12400-U+1247F*/
+ /* Bit 111 Counting Rod Numerals */
+#define TT_UCR_COUNTING_ROD_NUMERALS (1L << 15) /*U+1D360-U+1D37F*/
+ /* Bit 112 Sundanese */
+#define TT_UCR_SUNDANESE (1L << 16) /* U+1B80-U+1BBF */
+ /* Bit 113 Lepcha */
+#define TT_UCR_LEPCHA (1L << 17) /* U+1C00-U+1C4F */
+ /* Bit 114 Ol Chiki */
+#define TT_UCR_OL_CHIKI (1L << 18) /* U+1C50-U+1C7F */
+ /* Bit 115 Saurashtra */
+#define TT_UCR_SAURASHTRA (1L << 19) /* U+A880-U+A8DF */
+ /* Bit 116 Kayah Li */
+#define TT_UCR_KAYAH_LI (1L << 20) /* U+A900-U+A92F */
+ /* Bit 117 Rejang */
+#define TT_UCR_REJANG (1L << 21) /* U+A930-U+A95F */
+ /* Bit 118 Cham */
+#define TT_UCR_CHAM (1L << 22) /* U+AA00-U+AA5F */
+ /* Bit 119 Ancient Symbols */
+#define TT_UCR_ANCIENT_SYMBOLS (1L << 23) /*U+10190-U+101CF*/
+ /* Bit 120 Phaistos Disc */
+#define TT_UCR_PHAISTOS_DISC (1L << 24) /*U+101D0-U+101FF*/
+ /* Bit 121 Carian */
+ /* Lycian */
+ /* Lydian */
+#define TT_UCR_OLD_ANATOLIAN (1L << 25) /*U+102A0-U+102DF*/
+ /*U+10280-U+1029F*/
+ /*U+10920-U+1093F*/
+ /* Bit 122 Domino Tiles */
+ /* Mahjong Tiles */
+#define TT_UCR_GAME_TILES (1L << 26) /*U+1F030-U+1F09F*/
+ /*U+1F000-U+1F02F*/
+ /* Bit 123-127 Reserved for process-internal usage */
+
+
+ /*************************************************************************/
+ /* */
+ /* Some compilers have a very limited length of identifiers. */
+ /* */
+#if defined( __TURBOC__ ) && __TURBOC__ < 0x0410 || defined( __PACIFIC__ )
+#define HAVE_LIMIT_ON_IDENTS
+#endif
+
+
+#ifndef HAVE_LIMIT_ON_IDENTS
+
+
+ /*************************************************************************/
+ /* */
+ /* Here some alias #defines in order to be clearer. */
+ /* */
+ /* These are not always #defined to stay within the 31~character limit */
+ /* which some compilers have. */
+ /* */
+ /* Credits go to Dave Hoo <dhoo@flash.net> for pointing out that modern */
+ /* Borland compilers (read: from BC++ 3.1 on) can increase this limit. */
+ /* If you get a warning with such a compiler, use the -i40 switch. */
+ /* */
+#define TT_UCR_ARABIC_PRESENTATION_FORMS_A \
+ TT_UCR_ARABIC_PRESENTATIONS_A
+#define TT_UCR_ARABIC_PRESENTATION_FORMS_B \
+ TT_UCR_ARABIC_PRESENTATIONS_B
+
+#define TT_UCR_COMBINING_DIACRITICAL_MARKS \
+ TT_UCR_COMBINING_DIACRITICS
+#define TT_UCR_COMBINING_DIACRITICAL_MARKS_SYMB \
+ TT_UCR_COMBINING_DIACRITICS_SYMB
+
+
+#endif /* !HAVE_LIMIT_ON_IDENTS */
+
+
+FT_END_HEADER
+
+#endif /* __TTNAMEID_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/tttables.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/tttables.h
new file mode 100644
index 0000000000..c620550254
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/tttables.h
@@ -0,0 +1,777 @@
+/***************************************************************************/
+/* */
+/* tttables.h */
+/* */
+/* Basic SFNT/TrueType tables definitions and interface */
+/* (specification only). */
+/* */
+/* Copyright 1996-2005, 2008-2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __TTTABLES_H__
+#define __TTTABLES_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+ /*************************************************************************/
+ /* */
+ /* <Section> */
+ /* truetype_tables */
+ /* */
+ /* <Title> */
+ /* TrueType Tables */
+ /* */
+ /* <Abstract> */
+ /* TrueType specific table types and functions. */
+ /* */
+ /* <Description> */
+ /* This section contains the definition of TrueType-specific tables */
+ /* as well as some routines used to access and process them. */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_Header */
+ /* */
+ /* <Description> */
+ /* A structure used to model a TrueType font header table. All */
+ /* fields follow the TrueType specification. */
+ /* */
+ typedef struct TT_Header_
+ {
+ FT_Fixed Table_Version;
+ FT_Fixed Font_Revision;
+
+ FT_Long CheckSum_Adjust;
+ FT_Long Magic_Number;
+
+ FT_UShort Flags;
+ FT_UShort Units_Per_EM;
+
+ FT_Long Created [2];
+ FT_Long Modified[2];
+
+ FT_Short xMin;
+ FT_Short yMin;
+ FT_Short xMax;
+ FT_Short yMax;
+
+ FT_UShort Mac_Style;
+ FT_UShort Lowest_Rec_PPEM;
+
+ FT_Short Font_Direction;
+ FT_Short Index_To_Loc_Format;
+ FT_Short Glyph_Data_Format;
+
+ } TT_Header;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_HoriHeader */
+ /* */
+ /* <Description> */
+ /* A structure used to model a TrueType horizontal header, the `hhea' */
+ /* table, as well as the corresponding horizontal metrics table, */
+ /* i.e., the `hmtx' table. */
+ /* */
+ /* <Fields> */
+ /* Version :: The table version. */
+ /* */
+ /* Ascender :: The font's ascender, i.e., the distance */
+ /* from the baseline to the top-most of all */
+ /* glyph points found in the font. */
+ /* */
+ /* This value is invalid in many fonts, as */
+ /* it is usually set by the font designer, */
+ /* and often reflects only a portion of the */
+ /* glyphs found in the font (maybe ASCII). */
+ /* */
+ /* You should use the `sTypoAscender' field */
+ /* of the OS/2 table instead if you want */
+ /* the correct one. */
+ /* */
+ /* Descender :: The font's descender, i.e., the distance */
+ /* from the baseline to the bottom-most of */
+ /* all glyph points found in the font. It */
+ /* is negative. */
+ /* */
+ /* This value is invalid in many fonts, as */
+ /* it is usually set by the font designer, */
+ /* and often reflects only a portion of the */
+ /* glyphs found in the font (maybe ASCII). */
+ /* */
+ /* You should use the `sTypoDescender' */
+ /* field of the OS/2 table instead if you */
+ /* want the correct one. */
+ /* */
+ /* Line_Gap :: The font's line gap, i.e., the distance */
+ /* to add to the ascender and descender to */
+ /* get the BTB, i.e., the */
+ /* baseline-to-baseline distance for the */
+ /* font. */
+ /* */
+ /* advance_Width_Max :: This field is the maximum of all advance */
+ /* widths found in the font. It can be */
+ /* used to compute the maximum width of an */
+ /* arbitrary string of text. */
+ /* */
+ /* min_Left_Side_Bearing :: The minimum left side bearing of all */
+ /* glyphs within the font. */
+ /* */
+ /* min_Right_Side_Bearing :: The minimum right side bearing of all */
+ /* glyphs within the font. */
+ /* */
+ /* xMax_Extent :: The maximum horizontal extent (i.e., the */
+ /* `width' of a glyph's bounding box) for */
+ /* all glyphs in the font. */
+ /* */
+ /* caret_Slope_Rise :: The rise coefficient of the cursor's */
+ /* slope of the cursor (slope=rise/run). */
+ /* */
+ /* caret_Slope_Run :: The run coefficient of the cursor's */
+ /* slope. */
+ /* */
+ /* Reserved :: 8~reserved bytes. */
+ /* */
+ /* metric_Data_Format :: Always~0. */
+ /* */
+ /* number_Of_HMetrics :: Number of HMetrics entries in the `hmtx' */
+ /* table -- this value can be smaller than */
+ /* the total number of glyphs in the font. */
+ /* */
+ /* long_metrics :: A pointer into the `hmtx' table. */
+ /* */
+ /* short_metrics :: A pointer into the `hmtx' table. */
+ /* */
+ /* <Note> */
+ /* IMPORTANT: The TT_HoriHeader and TT_VertHeader structures should */
+ /* be identical except for the names of their fields which */
+ /* are different. */
+ /* */
+ /* This ensures that a single function in the `ttload' */
+ /* module is able to read both the horizontal and vertical */
+ /* headers. */
+ /* */
+ typedef struct TT_HoriHeader_
+ {
+ FT_Fixed Version;
+ FT_Short Ascender;
+ FT_Short Descender;
+ FT_Short Line_Gap;
+
+ FT_UShort advance_Width_Max; /* advance width maximum */
+
+ FT_Short min_Left_Side_Bearing; /* minimum left-sb */
+ FT_Short min_Right_Side_Bearing; /* minimum right-sb */
+ FT_Short xMax_Extent; /* xmax extents */
+ FT_Short caret_Slope_Rise;
+ FT_Short caret_Slope_Run;
+ FT_Short caret_Offset;
+
+ FT_Short Reserved[4];
+
+ FT_Short metric_Data_Format;
+ FT_UShort number_Of_HMetrics;
+
+ /* The following fields are not defined by the TrueType specification */
+ /* but they are used to connect the metrics header to the relevant */
+ /* `HMTX' table. */
+
+ void* long_metrics;
+ void* short_metrics;
+
+ } TT_HoriHeader;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_VertHeader */
+ /* */
+ /* <Description> */
+ /* A structure used to model a TrueType vertical header, the `vhea' */
+ /* table, as well as the corresponding vertical metrics table, i.e., */
+ /* the `vmtx' table. */
+ /* */
+ /* <Fields> */
+ /* Version :: The table version. */
+ /* */
+ /* Ascender :: The font's ascender, i.e., the distance */
+ /* from the baseline to the top-most of */
+ /* all glyph points found in the font. */
+ /* */
+ /* This value is invalid in many fonts, as */
+ /* it is usually set by the font designer, */
+ /* and often reflects only a portion of */
+ /* the glyphs found in the font (maybe */
+ /* ASCII). */
+ /* */
+ /* You should use the `sTypoAscender' */
+ /* field of the OS/2 table instead if you */
+ /* want the correct one. */
+ /* */
+ /* Descender :: The font's descender, i.e., the */
+ /* distance from the baseline to the */
+ /* bottom-most of all glyph points found */
+ /* in the font. It is negative. */
+ /* */
+ /* This value is invalid in many fonts, as */
+ /* it is usually set by the font designer, */
+ /* and often reflects only a portion of */
+ /* the glyphs found in the font (maybe */
+ /* ASCII). */
+ /* */
+ /* You should use the `sTypoDescender' */
+ /* field of the OS/2 table instead if you */
+ /* want the correct one. */
+ /* */
+ /* Line_Gap :: The font's line gap, i.e., the distance */
+ /* to add to the ascender and descender to */
+ /* get the BTB, i.e., the */
+ /* baseline-to-baseline distance for the */
+ /* font. */
+ /* */
+ /* advance_Height_Max :: This field is the maximum of all */
+ /* advance heights found in the font. It */
+ /* can be used to compute the maximum */
+ /* height of an arbitrary string of text. */
+ /* */
+ /* min_Top_Side_Bearing :: The minimum top side bearing of all */
+ /* glyphs within the font. */
+ /* */
+ /* min_Bottom_Side_Bearing :: The minimum bottom side bearing of all */
+ /* glyphs within the font. */
+ /* */
+ /* yMax_Extent :: The maximum vertical extent (i.e., the */
+ /* `height' of a glyph's bounding box) for */
+ /* all glyphs in the font. */
+ /* */
+ /* caret_Slope_Rise :: The rise coefficient of the cursor's */
+ /* slope of the cursor (slope=rise/run). */
+ /* */
+ /* caret_Slope_Run :: The run coefficient of the cursor's */
+ /* slope. */
+ /* */
+ /* caret_Offset :: The cursor's offset for slanted fonts. */
+ /* This value is `reserved' in vmtx */
+ /* version 1.0. */
+ /* */
+ /* Reserved :: 8~reserved bytes. */
+ /* */
+ /* metric_Data_Format :: Always~0. */
+ /* */
+ /* number_Of_HMetrics :: Number of VMetrics entries in the */
+ /* `vmtx' table -- this value can be */
+ /* smaller than the total number of glyphs */
+ /* in the font. */
+ /* */
+ /* long_metrics :: A pointer into the `vmtx' table. */
+ /* */
+ /* short_metrics :: A pointer into the `vmtx' table. */
+ /* */
+ /* <Note> */
+ /* IMPORTANT: The TT_HoriHeader and TT_VertHeader structures should */
+ /* be identical except for the names of their fields which */
+ /* are different. */
+ /* */
+ /* This ensures that a single function in the `ttload' */
+ /* module is able to read both the horizontal and vertical */
+ /* headers. */
+ /* */
+ typedef struct TT_VertHeader_
+ {
+ FT_Fixed Version;
+ FT_Short Ascender;
+ FT_Short Descender;
+ FT_Short Line_Gap;
+
+ FT_UShort advance_Height_Max; /* advance height maximum */
+
+ FT_Short min_Top_Side_Bearing; /* minimum left-sb or top-sb */
+ FT_Short min_Bottom_Side_Bearing; /* minimum right-sb or bottom-sb */
+ FT_Short yMax_Extent; /* xmax or ymax extents */
+ FT_Short caret_Slope_Rise;
+ FT_Short caret_Slope_Run;
+ FT_Short caret_Offset;
+
+ FT_Short Reserved[4];
+
+ FT_Short metric_Data_Format;
+ FT_UShort number_Of_VMetrics;
+
+ /* The following fields are not defined by the TrueType specification */
+ /* but they're used to connect the metrics header to the relevant */
+ /* `HMTX' or `VMTX' table. */
+
+ void* long_metrics;
+ void* short_metrics;
+
+ } TT_VertHeader;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_OS2 */
+ /* */
+ /* <Description> */
+ /* A structure used to model a TrueType OS/2 table. This is the long */
+ /* table version. All fields comply to the TrueType specification. */
+ /* */
+ /* Note that we now support old Mac fonts which do not include an */
+ /* OS/2 table. In this case, the `version' field is always set to */
+ /* 0xFFFF. */
+ /* */
+ typedef struct TT_OS2_
+ {
+ FT_UShort version; /* 0x0001 - more or 0xFFFF */
+ FT_Short xAvgCharWidth;
+ FT_UShort usWeightClass;
+ FT_UShort usWidthClass;
+ FT_Short fsType;
+ FT_Short ySubscriptXSize;
+ FT_Short ySubscriptYSize;
+ FT_Short ySubscriptXOffset;
+ FT_Short ySubscriptYOffset;
+ FT_Short ySuperscriptXSize;
+ FT_Short ySuperscriptYSize;
+ FT_Short ySuperscriptXOffset;
+ FT_Short ySuperscriptYOffset;
+ FT_Short yStrikeoutSize;
+ FT_Short yStrikeoutPosition;
+ FT_Short sFamilyClass;
+
+ FT_Byte panose[10];
+
+ FT_ULong ulUnicodeRange1; /* Bits 0-31 */
+ FT_ULong ulUnicodeRange2; /* Bits 32-63 */
+ FT_ULong ulUnicodeRange3; /* Bits 64-95 */
+ FT_ULong ulUnicodeRange4; /* Bits 96-127 */
+
+ FT_Char achVendID[4];
+
+ FT_UShort fsSelection;
+ FT_UShort usFirstCharIndex;
+ FT_UShort usLastCharIndex;
+ FT_Short sTypoAscender;
+ FT_Short sTypoDescender;
+ FT_Short sTypoLineGap;
+ FT_UShort usWinAscent;
+ FT_UShort usWinDescent;
+
+ /* only version 1 tables: */
+
+ FT_ULong ulCodePageRange1; /* Bits 0-31 */
+ FT_ULong ulCodePageRange2; /* Bits 32-63 */
+
+ /* only version 2 tables: */
+
+ FT_Short sxHeight;
+ FT_Short sCapHeight;
+ FT_UShort usDefaultChar;
+ FT_UShort usBreakChar;
+ FT_UShort usMaxContext;
+
+ } TT_OS2;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_Postscript */
+ /* */
+ /* <Description> */
+ /* A structure used to model a TrueType PostScript table. All fields */
+ /* comply to the TrueType specification. This structure does not */
+ /* reference the PostScript glyph names, which can be nevertheless */
+ /* accessed with the `ttpost' module. */
+ /* */
+ typedef struct TT_Postscript_
+ {
+ FT_Fixed FormatType;
+ FT_Fixed italicAngle;
+ FT_Short underlinePosition;
+ FT_Short underlineThickness;
+ FT_ULong isFixedPitch;
+ FT_ULong minMemType42;
+ FT_ULong maxMemType42;
+ FT_ULong minMemType1;
+ FT_ULong maxMemType1;
+
+ /* Glyph names follow in the file, but we don't */
+ /* load them by default. See the ttpost.c file. */
+
+ } TT_Postscript;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_PCLT */
+ /* */
+ /* <Description> */
+ /* A structure used to model a TrueType PCLT table. All fields */
+ /* comply to the TrueType specification. */
+ /* */
+ typedef struct TT_PCLT_
+ {
+ FT_Fixed Version;
+ FT_ULong FontNumber;
+ FT_UShort Pitch;
+ FT_UShort xHeight;
+ FT_UShort Style;
+ FT_UShort TypeFamily;
+ FT_UShort CapHeight;
+ FT_UShort SymbolSet;
+ FT_Char TypeFace[16];
+ FT_Char CharacterComplement[8];
+ FT_Char FileName[6];
+ FT_Char StrokeWeight;
+ FT_Char WidthType;
+ FT_Byte SerifStyle;
+ FT_Byte Reserved;
+
+ } TT_PCLT;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_MaxProfile */
+ /* */
+ /* <Description> */
+ /* The maximum profile is a table containing many max values which */
+ /* can be used to pre-allocate arrays. This ensures that no memory */
+ /* allocation occurs during a glyph load. */
+ /* */
+ /* <Fields> */
+ /* version :: The version number. */
+ /* */
+ /* numGlyphs :: The number of glyphs in this TrueType */
+ /* font. */
+ /* */
+ /* maxPoints :: The maximum number of points in a */
+ /* non-composite TrueType glyph. See also */
+ /* the structure element */
+ /* `maxCompositePoints'. */
+ /* */
+ /* maxContours :: The maximum number of contours in a */
+ /* non-composite TrueType glyph. See also */
+ /* the structure element */
+ /* `maxCompositeContours'. */
+ /* */
+ /* maxCompositePoints :: The maximum number of points in a */
+ /* composite TrueType glyph. See also the */
+ /* structure element `maxPoints'. */
+ /* */
+ /* maxCompositeContours :: The maximum number of contours in a */
+ /* composite TrueType glyph. See also the */
+ /* structure element `maxContours'. */
+ /* */
+ /* maxZones :: The maximum number of zones used for */
+ /* glyph hinting. */
+ /* */
+ /* maxTwilightPoints :: The maximum number of points in the */
+ /* twilight zone used for glyph hinting. */
+ /* */
+ /* maxStorage :: The maximum number of elements in the */
+ /* storage area used for glyph hinting. */
+ /* */
+ /* maxFunctionDefs :: The maximum number of function */
+ /* definitions in the TrueType bytecode for */
+ /* this font. */
+ /* */
+ /* maxInstructionDefs :: The maximum number of instruction */
+ /* definitions in the TrueType bytecode for */
+ /* this font. */
+ /* */
+ /* maxStackElements :: The maximum number of stack elements used */
+ /* during bytecode interpretation. */
+ /* */
+ /* maxSizeOfInstructions :: The maximum number of TrueType opcodes */
+ /* used for glyph hinting. */
+ /* */
+ /* maxComponentElements :: The maximum number of simple (i.e., non- */
+ /* composite) glyphs in a composite glyph. */
+ /* */
+ /* maxComponentDepth :: The maximum nesting depth of composite */
+ /* glyphs. */
+ /* */
+ /* <Note> */
+ /* This structure is only used during font loading. */
+ /* */
+ typedef struct TT_MaxProfile_
+ {
+ FT_Fixed version;
+ FT_UShort numGlyphs;
+ FT_UShort maxPoints;
+ FT_UShort maxContours;
+ FT_UShort maxCompositePoints;
+ FT_UShort maxCompositeContours;
+ FT_UShort maxZones;
+ FT_UShort maxTwilightPoints;
+ FT_UShort maxStorage;
+ FT_UShort maxFunctionDefs;
+ FT_UShort maxInstructionDefs;
+ FT_UShort maxStackElements;
+ FT_UShort maxSizeOfInstructions;
+ FT_UShort maxComponentElements;
+ FT_UShort maxComponentDepth;
+
+ } TT_MaxProfile;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Enum> */
+ /* FT_Sfnt_Tag */
+ /* */
+ /* <Description> */
+ /* An enumeration used to specify the index of an SFNT table. */
+ /* Used in the @FT_Get_Sfnt_Table API function. */
+ /* */
+ typedef enum FT_Sfnt_Tag_
+ {
+ ft_sfnt_head = 0, /* TT_Header */
+ ft_sfnt_maxp = 1, /* TT_MaxProfile */
+ ft_sfnt_os2 = 2, /* TT_OS2 */
+ ft_sfnt_hhea = 3, /* TT_HoriHeader */
+ ft_sfnt_vhea = 4, /* TT_VertHeader */
+ ft_sfnt_post = 5, /* TT_Postscript */
+ ft_sfnt_pclt = 6, /* TT_PCLT */
+
+ sfnt_max /* internal end mark */
+
+ } FT_Sfnt_Tag;
+
+ /* */
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_Sfnt_Table */
+ /* */
+ /* <Description> */
+ /* Return a pointer to a given SFNT table within a face. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the source. */
+ /* */
+ /* tag :: The index of the SFNT table. */
+ /* */
+ /* <Return> */
+ /* A type-less pointer to the table. This will be~0 in case of */
+ /* error, or if the corresponding table was not found *OR* loaded */
+ /* from the file. */
+ /* */
+ /* Use a typecast according to `tag' to access the structure */
+ /* elements. */
+ /* */
+ /* <Note> */
+ /* The table is owned by the face object and disappears with it. */
+ /* */
+ /* This function is only useful to access SFNT tables that are loaded */
+ /* by the sfnt, truetype, and opentype drivers. See @FT_Sfnt_Tag for */
+ /* a list. */
+ /* */
+ /* Here an example how to access the `vhea' table: */
+ /* */
+ /* { */
+ /* TT_VertHeader* vert_header; */
+ /* */
+ /* */
+ /* vert_header = */
+ /* (TT_VertHeader*)FT_Get_Sfnt_Table( face, ft_sfnt_vhea ); */
+ /* } */
+ /* */
+ FT_EXPORT( void* )
+ FT_Get_Sfnt_Table( FT_Face face,
+ FT_Sfnt_Tag tag );
+
+
+ /**************************************************************************
+ *
+ * @function:
+ * FT_Load_Sfnt_Table
+ *
+ * @description:
+ * Load any font table into client memory.
+ *
+ * @input:
+ * face ::
+ * A handle to the source face.
+ *
+ * tag ::
+ * The four-byte tag of the table to load. Use the value~0 if you want
+ * to access the whole font file. Otherwise, you can use one of the
+ * definitions found in the @FT_TRUETYPE_TAGS_H file, or forge a new
+ * one with @FT_MAKE_TAG.
+ *
+ * offset ::
+ * The starting offset in the table (or file if tag == 0).
+ *
+ * @output:
+ * buffer ::
+ * The target buffer address. The client must ensure that the memory
+ * array is big enough to hold the data.
+ *
+ * @inout:
+ * length ::
+ * If the `length' parameter is NULL, then try to load the whole table.
+ * Return an error code if it fails.
+ *
+ * Else, if `*length' is~0, exit immediately while returning the
+ * table's (or file) full size in it.
+ *
+ * Else the number of bytes to read from the table or file, from the
+ * starting offset.
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * If you need to determine the table's length you should first call this
+ * function with `*length' set to~0, as in the following example:
+ *
+ * {
+ * FT_ULong length = 0;
+ *
+ *
+ * error = FT_Load_Sfnt_Table( face, tag, 0, NULL, &length );
+ * if ( error ) { ... table does not exist ... }
+ *
+ * buffer = malloc( length );
+ * if ( buffer == NULL ) { ... not enough memory ... }
+ *
+ * error = FT_Load_Sfnt_Table( face, tag, 0, buffer, &length );
+ * if ( error ) { ... could not load table ... }
+ * }
+ */
+ FT_EXPORT( FT_Error )
+ FT_Load_Sfnt_Table( FT_Face face,
+ FT_ULong tag,
+ FT_Long offset,
+ FT_Byte* buffer,
+ FT_ULong* length );
+
+
+ /**************************************************************************
+ *
+ * @function:
+ * FT_Sfnt_Table_Info
+ *
+ * @description:
+ * Return information on an SFNT table.
+ *
+ * @input:
+ * face ::
+ * A handle to the source face.
+ *
+ * table_index ::
+ * The index of an SFNT table. The function returns
+ * FT_Err_Table_Missing for an invalid value.
+ *
+ * @inout:
+ * tag ::
+ * The name tag of the SFNT table. If the value is NULL, `table_index'
+ * is ignored, and `length' returns the number of SFNT tables in the
+ * font.
+ *
+ * @output:
+ * length ::
+ * The length of the SFNT table (or the number of SFNT tables, depending
+ * on `tag').
+ *
+ * @return:
+ * FreeType error code. 0~means success.
+ *
+ * @note:
+ * While parsing fonts, FreeType handles SFNT tables with length zero as
+ * missing.
+ *
+ */
+ FT_EXPORT( FT_Error )
+ FT_Sfnt_Table_Info( FT_Face face,
+ FT_UInt table_index,
+ FT_ULong *tag,
+ FT_ULong *length );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_CMap_Language_ID */
+ /* */
+ /* <Description> */
+ /* Return TrueType/sfnt specific cmap language ID. Definitions of */
+ /* language ID values are in `freetype/ttnameid.h'. */
+ /* */
+ /* <Input> */
+ /* charmap :: */
+ /* The target charmap. */
+ /* */
+ /* <Return> */
+ /* The language ID of `charmap'. If `charmap' doesn't belong to a */
+ /* TrueType/sfnt face, just return~0 as the default value. */
+ /* */
+ /* For a format~14 cmap (to access Unicode IVS), the return value is */
+ /* 0xFFFFFFFF. */
+ /* */
+ FT_EXPORT( FT_ULong )
+ FT_Get_CMap_Language_ID( FT_CharMap charmap );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Get_CMap_Format */
+ /* */
+ /* <Description> */
+ /* Return TrueType/sfnt specific cmap format. */
+ /* */
+ /* <Input> */
+ /* charmap :: */
+ /* The target charmap. */
+ /* */
+ /* <Return> */
+ /* The format of `charmap'. If `charmap' doesn't belong to a */
+ /* TrueType/sfnt face, return -1. */
+ /* */
+ FT_EXPORT( FT_Long )
+ FT_Get_CMap_Format( FT_CharMap charmap );
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __TTTABLES_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/tttags.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/tttags.h
new file mode 100644
index 0000000000..ac7de2ad79
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/tttags.h
@@ -0,0 +1,109 @@
+/***************************************************************************/
+/* */
+/* tttags.h */
+/* */
+/* Tags for TrueType and OpenType tables (specification only). */
+/* */
+/* Copyright 1996-2001, 2004, 2005, 2007, 2008, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __TTAGS_H__
+#define __TTAGS_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+#define TTAG_avar FT_MAKE_TAG( 'a', 'v', 'a', 'r' )
+#define TTAG_BASE FT_MAKE_TAG( 'B', 'A', 'S', 'E' )
+#define TTAG_bdat FT_MAKE_TAG( 'b', 'd', 'a', 't' )
+#define TTAG_BDF FT_MAKE_TAG( 'B', 'D', 'F', ' ' )
+#define TTAG_bhed FT_MAKE_TAG( 'b', 'h', 'e', 'd' )
+#define TTAG_bloc FT_MAKE_TAG( 'b', 'l', 'o', 'c' )
+#define TTAG_bsln FT_MAKE_TAG( 'b', 's', 'l', 'n' )
+#define TTAG_CBDT FT_MAKE_TAG( 'C', 'B', 'D', 'T' )
+#define TTAG_CBLC FT_MAKE_TAG( 'C', 'B', 'L', 'C' )
+#define TTAG_CFF FT_MAKE_TAG( 'C', 'F', 'F', ' ' )
+#define TTAG_CID FT_MAKE_TAG( 'C', 'I', 'D', ' ' )
+#define TTAG_cmap FT_MAKE_TAG( 'c', 'm', 'a', 'p' )
+#define TTAG_cvar FT_MAKE_TAG( 'c', 'v', 'a', 'r' )
+#define TTAG_cvt FT_MAKE_TAG( 'c', 'v', 't', ' ' )
+#define TTAG_DSIG FT_MAKE_TAG( 'D', 'S', 'I', 'G' )
+#define TTAG_EBDT FT_MAKE_TAG( 'E', 'B', 'D', 'T' )
+#define TTAG_EBLC FT_MAKE_TAG( 'E', 'B', 'L', 'C' )
+#define TTAG_EBSC FT_MAKE_TAG( 'E', 'B', 'S', 'C' )
+#define TTAG_feat FT_MAKE_TAG( 'f', 'e', 'a', 't' )
+#define TTAG_FOND FT_MAKE_TAG( 'F', 'O', 'N', 'D' )
+#define TTAG_fpgm FT_MAKE_TAG( 'f', 'p', 'g', 'm' )
+#define TTAG_fvar FT_MAKE_TAG( 'f', 'v', 'a', 'r' )
+#define TTAG_gasp FT_MAKE_TAG( 'g', 'a', 's', 'p' )
+#define TTAG_GDEF FT_MAKE_TAG( 'G', 'D', 'E', 'F' )
+#define TTAG_glyf FT_MAKE_TAG( 'g', 'l', 'y', 'f' )
+#define TTAG_GPOS FT_MAKE_TAG( 'G', 'P', 'O', 'S' )
+#define TTAG_GSUB FT_MAKE_TAG( 'G', 'S', 'U', 'B' )
+#define TTAG_gvar FT_MAKE_TAG( 'g', 'v', 'a', 'r' )
+#define TTAG_hdmx FT_MAKE_TAG( 'h', 'd', 'm', 'x' )
+#define TTAG_head FT_MAKE_TAG( 'h', 'e', 'a', 'd' )
+#define TTAG_hhea FT_MAKE_TAG( 'h', 'h', 'e', 'a' )
+#define TTAG_hmtx FT_MAKE_TAG( 'h', 'm', 't', 'x' )
+#define TTAG_JSTF FT_MAKE_TAG( 'J', 'S', 'T', 'F' )
+#define TTAG_just FT_MAKE_TAG( 'j', 'u', 's', 't' )
+#define TTAG_kern FT_MAKE_TAG( 'k', 'e', 'r', 'n' )
+#define TTAG_lcar FT_MAKE_TAG( 'l', 'c', 'a', 'r' )
+#define TTAG_loca FT_MAKE_TAG( 'l', 'o', 'c', 'a' )
+#define TTAG_LTSH FT_MAKE_TAG( 'L', 'T', 'S', 'H' )
+#define TTAG_LWFN FT_MAKE_TAG( 'L', 'W', 'F', 'N' )
+#define TTAG_MATH FT_MAKE_TAG( 'M', 'A', 'T', 'H' )
+#define TTAG_maxp FT_MAKE_TAG( 'm', 'a', 'x', 'p' )
+#define TTAG_META FT_MAKE_TAG( 'M', 'E', 'T', 'A' )
+#define TTAG_MMFX FT_MAKE_TAG( 'M', 'M', 'F', 'X' )
+#define TTAG_MMSD FT_MAKE_TAG( 'M', 'M', 'S', 'D' )
+#define TTAG_mort FT_MAKE_TAG( 'm', 'o', 'r', 't' )
+#define TTAG_morx FT_MAKE_TAG( 'm', 'o', 'r', 'x' )
+#define TTAG_name FT_MAKE_TAG( 'n', 'a', 'm', 'e' )
+#define TTAG_opbd FT_MAKE_TAG( 'o', 'p', 'b', 'd' )
+#define TTAG_OS2 FT_MAKE_TAG( 'O', 'S', '/', '2' )
+#define TTAG_OTTO FT_MAKE_TAG( 'O', 'T', 'T', 'O' )
+#define TTAG_PCLT FT_MAKE_TAG( 'P', 'C', 'L', 'T' )
+#define TTAG_POST FT_MAKE_TAG( 'P', 'O', 'S', 'T' )
+#define TTAG_post FT_MAKE_TAG( 'p', 'o', 's', 't' )
+#define TTAG_prep FT_MAKE_TAG( 'p', 'r', 'e', 'p' )
+#define TTAG_prop FT_MAKE_TAG( 'p', 'r', 'o', 'p' )
+#define TTAG_sfnt FT_MAKE_TAG( 's', 'f', 'n', 't' )
+#define TTAG_SING FT_MAKE_TAG( 'S', 'I', 'N', 'G' )
+#define TTAG_trak FT_MAKE_TAG( 't', 'r', 'a', 'k' )
+#define TTAG_true FT_MAKE_TAG( 't', 'r', 'u', 'e' )
+#define TTAG_ttc FT_MAKE_TAG( 't', 't', 'c', ' ' )
+#define TTAG_ttcf FT_MAKE_TAG( 't', 't', 'c', 'f' )
+#define TTAG_TYP1 FT_MAKE_TAG( 'T', 'Y', 'P', '1' )
+#define TTAG_typ1 FT_MAKE_TAG( 't', 'y', 'p', '1' )
+#define TTAG_VDMX FT_MAKE_TAG( 'V', 'D', 'M', 'X' )
+#define TTAG_vhea FT_MAKE_TAG( 'v', 'h', 'e', 'a' )
+#define TTAG_vmtx FT_MAKE_TAG( 'v', 'm', 't', 'x' )
+
+
+FT_END_HEADER
+
+#endif /* __TTAGS_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ttunpat.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ttunpat.h
new file mode 100644
index 0000000000..08e27599fa
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/freetype/ttunpat.h
@@ -0,0 +1,59 @@
+/***************************************************************************/
+/* */
+/* ttunpat.h */
+/* */
+/* Definitions for the unpatented TrueType hinting system */
+/* */
+/* Copyright 2003, 2006 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* Written by Graham Asher <graham.asher@btinternet.com> */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __TTUNPAT_H__
+#define __TTUNPAT_H__
+
+
+#include "../ft2build.h"
+#include "freetype.h"
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /***************************************************************************
+ *
+ * @constant:
+ * FT_PARAM_TAG_UNPATENTED_HINTING
+ *
+ * @description:
+ * A constant used as the tag of an @FT_Parameter structure to indicate
+ * that unpatented methods only should be used by the TrueType bytecode
+ * interpreter for a typeface opened by @FT_Open_Face.
+ *
+ */
+#define FT_PARAM_TAG_UNPATENTED_HINTING FT_MAKE_TAG( 'u', 'n', 'p', 'a' )
+
+ /* */
+
+FT_END_HEADER
+
+
+#endif /* __TTUNPAT_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/include/ft2build.h b/core/src/fxge/fx_freetype/fxft2.5.01/include/ft2build.h
new file mode 100644
index 0000000000..1fc812153f
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/include/ft2build.h
@@ -0,0 +1,40 @@
+/***************************************************************************/
+/* */
+/* ft2build.h */
+/* */
+/* FreeType 2 build and setup macros. */
+/* (Generic version) */
+/* */
+/* Copyright 1996-2001, 2006 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* This file corresponds to the default `ft2build.h' file for */
+ /* FreeType 2. It uses the `freetype' include root. */
+ /* */
+ /* Note that specific platforms might use a different configuration. */
+ /* See builds/unix/ft2unix.h for an example. */
+ /* */
+ /*************************************************************************/
+
+
+#ifndef __FT2_BUILD_GENERIC_H__
+#define __FT2_BUILD_GENERIC_H__
+
+#include "foxitnames.h"
+#include "freetype/config/ftheader.h"
+
+#endif /* __FT2_BUILD_GENERIC_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/Jamfile b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/Jamfile
new file mode 100644
index 0000000000..832e8b8424
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/Jamfile
@@ -0,0 +1,60 @@
+# FreeType 2 src/base Jamfile
+#
+# Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT. By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+SubDir FT2_TOP $(FT2_SRC_DIR) base ;
+
+
+{
+ local _sources ;
+
+ if $(FT2_MULTI)
+ {
+ _sources = ftadvanc ftcalc ftdbgmem ftgloadr
+ ftobjs ftoutln ftrfork ftsnames
+ ftstream fttrigon ftutil
+ basepic ftpic
+ ;
+ }
+ else
+ {
+ _sources = ftbase ;
+ }
+
+ Library $(FT2_LIB) : $(_sources).c ;
+}
+
+# Add the optional/replaceable files.
+#
+{
+ local _sources = bbox bdf bitmap debug gasp
+ glyph gxval init lcdfil mm
+ otval pfr stroke synth system
+ type1 winfnt xf86 patent
+ ;
+
+ Library $(FT2_LIB) : ft$(_sources).c ;
+}
+
+# Add Macintosh-specific file to the library when necessary.
+#
+if $(MAC)
+{
+ Library $(FT2_LIB) : ftmac.c ;
+}
+else if $(OS) = MACOSX
+{
+ if $(FT2_MULTI)
+ {
+ Library $(FT2_LIB) : ftmac.c ;
+ }
+}
+
+# end of src/base Jamfile
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/basepic.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/basepic.c
new file mode 100644
index 0000000000..d6fc01cce8
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/basepic.c
@@ -0,0 +1,108 @@
+/***************************************************************************/
+/* */
+/* basepic.c */
+/* */
+/* The FreeType position independent code services for base. */
+/* */
+/* Copyright 2009, 2012 by */
+/* Oran Agra and Mickey Gabel. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/freetype.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "basepic.h"
+
+
+#ifdef FT_CONFIG_OPTION_PIC
+
+ /* forward declaration of PIC init functions from ftglyph.c */
+ void
+ FT_Init_Class_ft_outline_glyph_class( FT_Glyph_Class* clazz );
+
+ void
+ FT_Init_Class_ft_bitmap_glyph_class( FT_Glyph_Class* clazz );
+
+#ifdef FT_CONFIG_OPTION_MAC_FONTS
+ /* forward declaration of PIC init function from ftrfork.c */
+ /* (not modularized) */
+ void
+ FT_Init_Table_raccess_guess_table( ft_raccess_guess_rec* record );
+#endif
+
+ /* forward declaration of PIC init functions from ftinit.c */
+ FT_Error
+ ft_create_default_module_classes( FT_Library library );
+
+ void
+ ft_destroy_default_module_classes( FT_Library library );
+
+
+ void
+ ft_base_pic_free( FT_Library library )
+ {
+ FT_PIC_Container* pic_container = &library->pic_container;
+ FT_Memory memory = library->memory;
+
+
+ if ( pic_container->base )
+ {
+ /* destroy default module classes */
+ /* (in case FT_Add_Default_Modules was used) */
+ ft_destroy_default_module_classes( library );
+
+ FT_FREE( pic_container->base );
+ pic_container->base = NULL;
+ }
+ }
+
+
+ FT_Error
+ ft_base_pic_init( FT_Library library )
+ {
+ FT_PIC_Container* pic_container = &library->pic_container;
+ FT_Error error = FT_Err_Ok;
+ BasePIC* container = NULL;
+ FT_Memory memory = library->memory;
+
+
+ /* allocate pointer, clear and set global container pointer */
+ if ( FT_ALLOC( container, sizeof ( *container ) ) )
+ return error;
+ FT_MEM_SET( container, 0, sizeof ( *container ) );
+ pic_container->base = container;
+
+ /* initialize default modules list and pointers */
+ error = ft_create_default_module_classes( library );
+ if ( error )
+ goto Exit;
+
+ /* initialize pointer table - */
+ /* this is how the module usually expects this data */
+ FT_Init_Class_ft_outline_glyph_class(
+ &container->ft_outline_glyph_class );
+ FT_Init_Class_ft_bitmap_glyph_class(
+ &container->ft_bitmap_glyph_class );
+#ifdef FT_CONFIG_OPTION_MAC_FONTS
+ FT_Init_Table_raccess_guess_table(
+ (ft_raccess_guess_rec*)&container->ft_raccess_guess_table );
+#endif
+
+ Exit:
+ if ( error )
+ ft_base_pic_free( library );
+ return error;
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/basepic.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/basepic.h
new file mode 100644
index 0000000000..e2308cad26
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/basepic.h
@@ -0,0 +1,90 @@
+/***************************************************************************/
+/* */
+/* basepic.h */
+/* */
+/* The FreeType position independent code services for base. */
+/* */
+/* Copyright 2009 by */
+/* Oran Agra and Mickey Gabel. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __BASEPIC_H__
+#define __BASEPIC_H__
+
+
+FT_BEGIN_HEADER
+
+#include "../../include/freetype/internal/ftpic.h"
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_OUTLINE_GLYPH_CLASS_GET &ft_outline_glyph_class
+#define FT_BITMAP_GLYPH_CLASS_GET &ft_bitmap_glyph_class
+#define FT_DEFAULT_MODULES_GET ft_default_modules
+
+#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK
+#define FT_RACCESS_GUESS_TABLE_GET ft_raccess_guess_table
+#endif
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#include "../../include/freetype/ftglyph.h"
+
+#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK
+#include "../../include/freetype/internal/ftrfork.h"
+#endif
+
+
+ typedef struct BasePIC_
+ {
+ FT_Module_Class** default_module_classes;
+ FT_Glyph_Class ft_outline_glyph_class;
+ FT_Glyph_Class ft_bitmap_glyph_class;
+
+#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK
+ ft_raccess_guess_rec ft_raccess_guess_table[FT_RACCESS_N_RULES];
+#endif
+
+ } BasePIC;
+
+
+#define GET_PIC( lib ) ( (BasePIC*)( (lib)->pic_container.base ) )
+
+#define FT_OUTLINE_GLYPH_CLASS_GET \
+ ( &GET_PIC( library )->ft_outline_glyph_class )
+#define FT_BITMAP_GLYPH_CLASS_GET \
+ ( &GET_PIC( library )->ft_bitmap_glyph_class )
+#define FT_DEFAULT_MODULES_GET \
+ ( GET_PIC( library )->default_module_classes )
+
+#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK
+#define FT_RACCESS_GUESS_TABLE_GET \
+ ( GET_PIC( library )->ft_raccess_guess_table )
+#endif
+
+
+ /* see basepic.c for the implementation */
+ void
+ ft_base_pic_free( FT_Library library );
+
+ FT_Error
+ ft_base_pic_init( FT_Library library );
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __BASEPIC_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftadvanc.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftadvanc.c
new file mode 100644
index 0000000000..652e51b1ed
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftadvanc.c
@@ -0,0 +1,162 @@
+/***************************************************************************/
+/* */
+/* ftadvanc.c */
+/* */
+/* Quick computation of advance widths (body). */
+/* */
+/* Copyright 2008, 2009, 2011, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+
+#include "../../include/freetype/ftadvanc.h"
+#include "../../include/freetype/internal/ftobjs.h"
+
+
+ static FT_Error
+ _ft_face_scale_advances( FT_Face face,
+ FT_Fixed* advances,
+ FT_UInt count,
+ FT_Int32 flags )
+ {
+ FT_Fixed scale;
+ FT_UInt nn;
+
+
+ if ( flags & FT_LOAD_NO_SCALE )
+ return FT_Err_Ok;
+
+ if ( face->size == NULL )
+ return FT_THROW( Invalid_Size_Handle );
+
+ if ( flags & FT_LOAD_VERTICAL_LAYOUT )
+ scale = face->size->metrics.y_scale;
+ else
+ scale = face->size->metrics.x_scale;
+
+ /* this must be the same scaling as to get linear{Hori,Vert}Advance */
+ /* (see `FT_Load_Glyph' implementation in src/base/ftobjs.c) */
+
+ for ( nn = 0; nn < count; nn++ )
+ advances[nn] = FT_MulDiv( advances[nn], scale, 64 );
+
+ return FT_Err_Ok;
+ }
+
+
+ /* at the moment, we can perform fast advance retrieval only in */
+ /* the following cases: */
+ /* */
+ /* - unscaled load */
+ /* - unhinted load */
+ /* - light-hinted load */
+
+#define LOAD_ADVANCE_FAST_CHECK( flags ) \
+ ( flags & ( FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING ) || \
+ FT_LOAD_TARGET_MODE( flags ) == FT_RENDER_MODE_LIGHT )
+
+
+ /* documentation is in ftadvanc.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Get_Advance( FT_Face face,
+ FT_UInt gindex,
+ FT_Int32 flags,
+ FT_Fixed *padvance )
+ {
+ FT_Face_GetAdvancesFunc func;
+
+
+ if ( !face )
+ return FT_THROW( Invalid_Face_Handle );
+
+ if ( gindex >= (FT_UInt)face->num_glyphs )
+ return FT_THROW( Invalid_Glyph_Index );
+
+ func = face->driver->clazz->get_advances;
+ if ( func && LOAD_ADVANCE_FAST_CHECK( flags ) )
+ {
+ FT_Error error;
+
+
+ error = func( face, gindex, 1, flags, padvance );
+ if ( !error )
+ return _ft_face_scale_advances( face, padvance, 1, flags );
+
+ if ( FT_ERR_NEQ( error, Unimplemented_Feature ) )
+ return error;
+ }
+
+ return FT_Get_Advances( face, gindex, 1, flags, padvance );
+ }
+
+
+ /* documentation is in ftadvanc.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Get_Advances( FT_Face face,
+ FT_UInt start,
+ FT_UInt count,
+ FT_Int32 flags,
+ FT_Fixed *padvances )
+ {
+ FT_Face_GetAdvancesFunc func;
+ FT_UInt num, end, nn;
+ FT_Error error = FT_Err_Ok;
+
+
+ if ( !face )
+ return FT_THROW( Invalid_Face_Handle );
+
+ num = (FT_UInt)face->num_glyphs;
+ end = start + count;
+ if ( start >= num || end < start || end > num )
+ return FT_THROW( Invalid_Glyph_Index );
+
+ if ( count == 0 )
+ return FT_Err_Ok;
+
+ func = face->driver->clazz->get_advances;
+ if ( func && LOAD_ADVANCE_FAST_CHECK( flags ) )
+ {
+ error = func( face, start, count, flags, padvances );
+ if ( !error )
+ return _ft_face_scale_advances( face, padvances, count, flags );
+
+ if ( FT_ERR_NEQ( error, Unimplemented_Feature ) )
+ return error;
+ }
+
+ error = FT_Err_Ok;
+
+ if ( flags & FT_ADVANCE_FLAG_FAST_ONLY )
+ return FT_THROW( Unimplemented_Feature );
+
+ flags |= (FT_UInt32)FT_LOAD_ADVANCE_ONLY;
+ for ( nn = 0; nn < count; nn++ )
+ {
+ error = FT_Load_Glyph( face, start + nn, flags );
+ if ( error )
+ break;
+
+ /* scale from 26.6 to 16.16 */
+ padvances[nn] = ( flags & FT_LOAD_VERTICAL_LAYOUT )
+ ? face->glyph->advance.y << 10
+ : face->glyph->advance.x << 10;
+ }
+
+ return error;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftapi.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftapi.c
new file mode 100644
index 0000000000..9ab64628d1
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftapi.c
@@ -0,0 +1,121 @@
+/***************************************************************************/
+/* */
+/* ftapi.c */
+/* */
+/* The FreeType compatibility functions (body). */
+/* */
+/* Copyright 2002 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/ftlist.h"
+#include "../../include/freetype/ftoutln.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/tttables.h"
+#include "../../include/freetype/ftoutln.h"
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** ****/
+ /**** C O M P A T I B I L I T Y ****/
+ /**** ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /* backwards compatibility API */
+
+ FT_BASE_DEF( void )
+ FT_New_Memory_Stream( FT_Library library,
+ FT_Byte* base,
+ FT_ULong size,
+ FT_Stream stream )
+ {
+ FT_UNUSED( library );
+
+ FT_Stream_OpenMemory( stream, base, size );
+ }
+
+
+ FT_BASE_DEF( FT_Error )
+ FT_Seek_Stream( FT_Stream stream,
+ FT_ULong pos )
+ {
+ return FT_Stream_Seek( stream, pos );
+ }
+
+
+ FT_BASE_DEF( FT_Error )
+ FT_Skip_Stream( FT_Stream stream,
+ FT_Long distance )
+ {
+ return FT_Stream_Skip( stream, distance );
+ }
+
+
+ FT_BASE_DEF( FT_Error )
+ FT_Read_Stream( FT_Stream stream,
+ FT_Byte* buffer,
+ FT_ULong count )
+ {
+ return FT_Stream_Read( stream, buffer, count );
+ }
+
+
+ FT_BASE_DEF( FT_Error )
+ FT_Read_Stream_At( FT_Stream stream,
+ FT_ULong pos,
+ FT_Byte* buffer,
+ FT_ULong count )
+ {
+ return FT_Stream_ReadAt( stream, pos, buffer, count );
+ }
+
+
+ FT_BASE_DEF( FT_Error )
+ FT_Extract_Frame( FT_Stream stream,
+ FT_ULong count,
+ FT_Byte** pbytes )
+ {
+ return FT_Stream_ExtractFrame( stream, count, pbytes );
+ }
+
+
+ FT_BASE_DEF( void )
+ FT_Release_Frame( FT_Stream stream,
+ FT_Byte** pbytes )
+ {
+ FT_Stream_ReleaseFrame( stream, pbytes );
+ }
+
+ FT_BASE_DEF( FT_Error )
+ FT_Access_Frame( FT_Stream stream,
+ FT_ULong count )
+ {
+ return FT_Stream_EnterFrame( stream, count );
+ }
+
+
+ FT_BASE_DEF( void )
+ FT_Forget_Frame( FT_Stream stream )
+ {
+ FT_Stream_ExitFrame( stream );
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftbase.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftbase.h
new file mode 100644
index 0000000000..dced300f76
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftbase.h
@@ -0,0 +1,69 @@
+/***************************************************************************/
+/* */
+/* ftbase.h */
+/* */
+/* The FreeType private functions used in base module (specification). */
+/* */
+/* Copyright 2008, 2010 by */
+/* David Turner, Robert Wilhelm, Werner Lemberg, and suzuki toshiya. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTBASE_H__
+#define __FTBASE_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftobjs.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /* Assume the stream is sfnt-wrapped PS Type1 or sfnt-wrapped CID-keyed */
+ /* font, and try to load a face specified by the face_index. */
+ FT_LOCAL( FT_Error )
+ open_face_PS_from_sfnt_stream( FT_Library library,
+ FT_Stream stream,
+ FT_Long face_index,
+ FT_Int num_params,
+ FT_Parameter *params,
+ FT_Face *aface );
+
+
+ /* Create a new FT_Face given a buffer and a driver name. */
+ /* From ftmac.c. */
+ FT_LOCAL( FT_Error )
+ open_face_from_buffer( FT_Library library,
+ FT_Byte* base,
+ FT_ULong size,
+ FT_Long face_index,
+ const char* driver_name,
+ FT_Face *aface );
+
+
+#if defined( FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK ) && \
+ !defined( FT_MACINTOSH )
+ /* Mac OS X/Darwin kernel often changes recommended method to access */
+ /* the resource fork and older methods makes the kernel issue the */
+ /* warning of deprecated method. To calm it down, the methods based */
+ /* on Darwin VFS should be grouped and skip the rest methods after */
+ /* the case the resource is opened but found to lack a font in it. */
+ FT_LOCAL( FT_Bool )
+ ft_raccess_rule_by_darwin_vfs( FT_Library library, FT_UInt rule_index );
+#endif
+
+
+FT_END_HEADER
+
+#endif /* __FTBASE_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftbbox.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftbbox.c
new file mode 100644
index 0000000000..a5862c5b91
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftbbox.c
@@ -0,0 +1,649 @@
+/***************************************************************************/
+/* */
+/* ftbbox.c */
+/* */
+/* FreeType bbox computation (body). */
+/* */
+/* Copyright 1996-2002, 2004, 2006, 2010, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used */
+/* modified and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* This component has a _single_ role: to compute exact outline bounding */
+ /* boxes. */
+ /* */
+ /*************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+
+#include "../../include/freetype/ftbbox.h"
+#include "../../include/freetype/ftimage.h"
+#include "../../include/freetype/ftoutln.h"
+#include "../../include/freetype/internal/ftcalc.h"
+#include "../../include/freetype/internal/ftobjs.h"
+
+
+ typedef struct TBBox_Rec_
+ {
+ FT_Vector last;
+ FT_BBox bbox;
+
+ } TBBox_Rec;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* BBox_Move_To */
+ /* */
+ /* <Description> */
+ /* This function is used as a `move_to' and `line_to' emitter during */
+ /* FT_Outline_Decompose(). It simply records the destination point */
+ /* in `user->last'; no further computations are necessary since we */
+ /* use the cbox as the starting bbox which must be refined. */
+ /* */
+ /* <Input> */
+ /* to :: A pointer to the destination vector. */
+ /* */
+ /* <InOut> */
+ /* user :: A pointer to the current walk context. */
+ /* */
+ /* <Return> */
+ /* Always 0. Needed for the interface only. */
+ /* */
+ static int
+ BBox_Move_To( FT_Vector* to,
+ TBBox_Rec* user )
+ {
+ user->last = *to;
+
+ return 0;
+ }
+
+
+#define CHECK_X( p, bbox ) \
+ ( p->x < bbox.xMin || p->x > bbox.xMax )
+
+#define CHECK_Y( p, bbox ) \
+ ( p->y < bbox.yMin || p->y > bbox.yMax )
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* BBox_Conic_Check */
+ /* */
+ /* <Description> */
+ /* Finds the extrema of a 1-dimensional conic Bezier curve and update */
+ /* a bounding range. This version uses direct computation, as it */
+ /* doesn't need square roots. */
+ /* */
+ /* <Input> */
+ /* y1 :: The start coordinate. */
+ /* */
+ /* y2 :: The coordinate of the control point. */
+ /* */
+ /* y3 :: The end coordinate. */
+ /* */
+ /* <InOut> */
+ /* min :: The address of the current minimum. */
+ /* */
+ /* max :: The address of the current maximum. */
+ /* */
+ static void
+ BBox_Conic_Check( FT_Pos y1,
+ FT_Pos y2,
+ FT_Pos y3,
+ FT_Pos* min,
+ FT_Pos* max )
+ {
+ if ( y1 <= y3 && y2 == y1 ) /* flat arc */
+ goto Suite;
+
+ if ( y1 < y3 )
+ {
+ if ( y2 >= y1 && y2 <= y3 ) /* ascending arc */
+ goto Suite;
+ }
+ else
+ {
+ if ( y2 >= y3 && y2 <= y1 ) /* descending arc */
+ {
+ y2 = y1;
+ y1 = y3;
+ y3 = y2;
+ goto Suite;
+ }
+ }
+
+ y1 = y3 = y1 - FT_MulDiv( y2 - y1, y2 - y1, y1 - 2*y2 + y3 );
+
+ Suite:
+ if ( y1 < *min ) *min = y1;
+ if ( y3 > *max ) *max = y3;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* BBox_Conic_To */
+ /* */
+ /* <Description> */
+ /* This function is used as a `conic_to' emitter during */
+ /* FT_Outline_Decompose(). It checks a conic Bezier curve with the */
+ /* current bounding box, and computes its extrema if necessary to */
+ /* update it. */
+ /* */
+ /* <Input> */
+ /* control :: A pointer to a control point. */
+ /* */
+ /* to :: A pointer to the destination vector. */
+ /* */
+ /* <InOut> */
+ /* user :: The address of the current walk context. */
+ /* */
+ /* <Return> */
+ /* Always 0. Needed for the interface only. */
+ /* */
+ /* <Note> */
+ /* In the case of a non-monotonous arc, we compute directly the */
+ /* extremum coordinates, as it is sufficiently fast. */
+ /* */
+ static int
+ BBox_Conic_To( FT_Vector* control,
+ FT_Vector* to,
+ TBBox_Rec* user )
+ {
+ /* we don't need to check `to' since it is always an `on' point, thus */
+ /* within the bbox */
+
+ if ( CHECK_X( control, user->bbox ) )
+ BBox_Conic_Check( user->last.x,
+ control->x,
+ to->x,
+ &user->bbox.xMin,
+ &user->bbox.xMax );
+
+ if ( CHECK_Y( control, user->bbox ) )
+ BBox_Conic_Check( user->last.y,
+ control->y,
+ to->y,
+ &user->bbox.yMin,
+ &user->bbox.yMax );
+
+ user->last = *to;
+
+ return 0;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* BBox_Cubic_Check */
+ /* */
+ /* <Description> */
+ /* Finds the extrema of a 1-dimensional cubic Bezier curve and */
+ /* updates a bounding range. This version uses splitting because we */
+ /* don't want to use square roots and extra accuracy. */
+ /* */
+ /* <Input> */
+ /* p1 :: The start coordinate. */
+ /* */
+ /* p2 :: The coordinate of the first control point. */
+ /* */
+ /* p3 :: The coordinate of the second control point. */
+ /* */
+ /* p4 :: The end coordinate. */
+ /* */
+ /* <InOut> */
+ /* min :: The address of the current minimum. */
+ /* */
+ /* max :: The address of the current maximum. */
+ /* */
+
+#if 0
+
+ static void
+ BBox_Cubic_Check( FT_Pos p1,
+ FT_Pos p2,
+ FT_Pos p3,
+ FT_Pos p4,
+ FT_Pos* min,
+ FT_Pos* max )
+ {
+ FT_Pos q1, q2, q3, q4;
+
+
+ q1 = p1;
+ q2 = p2;
+ q3 = p3;
+ q4 = p4;
+
+ /* for a conic segment to possibly reach new maximum */
+ /* one of its off-points must be above the current value */
+ while ( q2 > *max || q3 > *max )
+ {
+ /* determine which half contains the maximum and split */
+ if ( q1 + q2 > q3 + q4 ) /* first half */
+ {
+ q4 = q4 + q3;
+ q3 = q3 + q2;
+ q2 = q2 + q1;
+ q4 = q4 + q3;
+ q3 = q3 + q2;
+ q4 = ( q4 + q3 ) / 8;
+ q3 = q3 / 4;
+ q2 = q2 / 2;
+ }
+ else /* second half */
+ {
+ q1 = q1 + q2;
+ q2 = q2 + q3;
+ q3 = q3 + q4;
+ q1 = q1 + q2;
+ q2 = q2 + q3;
+ q1 = ( q1 + q2 ) / 8;
+ q2 = q2 / 4;
+ q3 = q3 / 2;
+ }
+
+ /* check if either end reached the maximum */
+ if ( q1 == q2 && q1 >= q3 )
+ {
+ *max = q1;
+ break;
+ }
+ if ( q3 == q4 && q2 <= q4 )
+ {
+ *max = q4;
+ break;
+ }
+ }
+
+ q1 = p1;
+ q2 = p2;
+ q3 = p3;
+ q4 = p4;
+
+ /* for a conic segment to possibly reach new minimum */
+ /* one of its off-points must be below the current value */
+ while ( q2 < *min || q3 < *min )
+ {
+ /* determine which half contains the minimum and split */
+ if ( q1 + q2 < q3 + q4 ) /* first half */
+ {
+ q4 = q4 + q3;
+ q3 = q3 + q2;
+ q2 = q2 + q1;
+ q4 = q4 + q3;
+ q3 = q3 + q2;
+ q4 = ( q4 + q3 ) / 8;
+ q3 = q3 / 4;
+ q2 = q2 / 2;
+ }
+ else /* second half */
+ {
+ q1 = q1 + q2;
+ q2 = q2 + q3;
+ q3 = q3 + q4;
+ q1 = q1 + q2;
+ q2 = q2 + q3;
+ q1 = ( q1 + q2 ) / 8;
+ q2 = q2 / 4;
+ q3 = q3 / 2;
+ }
+
+ /* check if either end reached the minimum */
+ if ( q1 == q2 && q1 <= q3 )
+ {
+ *min = q1;
+ break;
+ }
+ if ( q3 == q4 && q2 >= q4 )
+ {
+ *min = q4;
+ break;
+ }
+ }
+ }
+
+#else
+
+ static void
+ test_cubic_extrema( FT_Pos y1,
+ FT_Pos y2,
+ FT_Pos y3,
+ FT_Pos y4,
+ FT_Fixed u,
+ FT_Pos* min,
+ FT_Pos* max )
+ {
+ /* FT_Pos a = y4 - 3*y3 + 3*y2 - y1; */
+ FT_Pos b = y3 - 2*y2 + y1;
+ FT_Pos c = y2 - y1;
+ FT_Pos d = y1;
+ FT_Pos y;
+ FT_Fixed uu;
+
+ FT_UNUSED ( y4 );
+
+
+ /* The polynomial is */
+ /* */
+ /* P(x) = a*x^3 + 3b*x^2 + 3c*x + d , */
+ /* */
+ /* dP/dx = 3a*x^2 + 6b*x + 3c . */
+ /* */
+ /* However, we also have */
+ /* */
+ /* dP/dx(u) = 0 , */
+ /* */
+ /* which implies by subtraction that */
+ /* */
+ /* P(u) = b*u^2 + 2c*u + d . */
+
+ if ( u > 0 && u < 0x10000L )
+ {
+ uu = FT_MulFix( u, u );
+ y = d + FT_MulFix( c, 2*u ) + FT_MulFix( b, uu );
+
+ if ( y < *min ) *min = y;
+ if ( y > *max ) *max = y;
+ }
+ }
+
+
+ static void
+ BBox_Cubic_Check( FT_Pos y1,
+ FT_Pos y2,
+ FT_Pos y3,
+ FT_Pos y4,
+ FT_Pos* min,
+ FT_Pos* max )
+ {
+ /* always compare first and last points */
+ if ( y1 < *min ) *min = y1;
+ else if ( y1 > *max ) *max = y1;
+
+ if ( y4 < *min ) *min = y4;
+ else if ( y4 > *max ) *max = y4;
+
+ /* now, try to see if there are split points here */
+ if ( y1 <= y4 )
+ {
+ /* flat or ascending arc test */
+ if ( y1 <= y2 && y2 <= y4 && y1 <= y3 && y3 <= y4 )
+ return;
+ }
+ else /* y1 > y4 */
+ {
+ /* descending arc test */
+ if ( y1 >= y2 && y2 >= y4 && y1 >= y3 && y3 >= y4 )
+ return;
+ }
+
+ /* There are some split points. Find them. */
+ /* We already made sure that a, b, and c below cannot be all zero. */
+ {
+ FT_Pos a = y4 - 3*y3 + 3*y2 - y1;
+ FT_Pos b = y3 - 2*y2 + y1;
+ FT_Pos c = y2 - y1;
+ FT_Pos d;
+ FT_Fixed t;
+ FT_Int shift;
+
+
+ /* We need to solve `ax^2+2bx+c' here, without floating points! */
+ /* The trick is to normalize to a different representation in order */
+ /* to use our 16.16 fixed-point routines. */
+ /* */
+ /* We compute FT_MulFix(b,b) and FT_MulFix(a,c) after normalization. */
+ /* These values must fit into a single 16.16 value. */
+ /* */
+ /* We normalize a, b, and c to `8.16' fixed-point values to ensure */
+ /* that their product is held in a `16.16' value including the sign. */
+ /* Necessarily, we need to shift `a', `b', and `c' so that the most */
+ /* significant bit of their absolute values is at position 22. */
+ /* */
+ /* This also means that we are using 23 bits of precision to compute */
+ /* the zeros, independently of the range of the original polynomial */
+ /* coefficients. */
+ /* */
+ /* This algorithm should ensure reasonably accurate values for the */
+ /* zeros. Note that they are only expressed with 16 bits when */
+ /* computing the extrema (the zeros need to be in 0..1 exclusive */
+ /* to be considered part of the arc). */
+
+ shift = FT_MSB( FT_ABS( a ) | FT_ABS( b ) | FT_ABS( c ) );
+
+ if ( shift > 22 )
+ {
+ shift -= 22;
+
+ /* this loses some bits of precision, but we use 23 of them */
+ /* for the computation anyway */
+ a >>= shift;
+ b >>= shift;
+ c >>= shift;
+ }
+ else
+ {
+ shift = 22 - shift;
+
+ a <<= shift;
+ b <<= shift;
+ c <<= shift;
+ }
+
+ /* handle a == 0 */
+ if ( a == 0 )
+ {
+ if ( b != 0 )
+ {
+ t = - FT_DivFix( c, b ) / 2;
+ test_cubic_extrema( y1, y2, y3, y4, t, min, max );
+ }
+ }
+ else
+ {
+ /* solve the equation now */
+ d = FT_MulFix( b, b ) - FT_MulFix( a, c );
+ if ( d < 0 )
+ return;
+
+ if ( d == 0 )
+ {
+ /* there is a single split point at -b/a */
+ t = - FT_DivFix( b, a );
+ test_cubic_extrema( y1, y2, y3, y4, t, min, max );
+ }
+ else
+ {
+ /* there are two solutions; we need to filter them */
+ d = FT_SqrtFixed( (FT_Int32)d );
+ t = - FT_DivFix( b - d, a );
+ test_cubic_extrema( y1, y2, y3, y4, t, min, max );
+
+ t = - FT_DivFix( b + d, a );
+ test_cubic_extrema( y1, y2, y3, y4, t, min, max );
+ }
+ }
+ }
+ }
+
+#endif
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* BBox_Cubic_To */
+ /* */
+ /* <Description> */
+ /* This function is used as a `cubic_to' emitter during */
+ /* FT_Outline_Decompose(). It checks a cubic Bezier curve with the */
+ /* current bounding box, and computes its extrema if necessary to */
+ /* update it. */
+ /* */
+ /* <Input> */
+ /* control1 :: A pointer to the first control point. */
+ /* */
+ /* control2 :: A pointer to the second control point. */
+ /* */
+ /* to :: A pointer to the destination vector. */
+ /* */
+ /* <InOut> */
+ /* user :: The address of the current walk context. */
+ /* */
+ /* <Return> */
+ /* Always 0. Needed for the interface only. */
+ /* */
+ /* <Note> */
+ /* In the case of a non-monotonous arc, we don't compute directly */
+ /* extremum coordinates, we subdivide instead. */
+ /* */
+ static int
+ BBox_Cubic_To( FT_Vector* control1,
+ FT_Vector* control2,
+ FT_Vector* to,
+ TBBox_Rec* user )
+ {
+ /* we don't need to check `to' since it is always an `on' point, thus */
+ /* within the bbox */
+
+ if ( CHECK_X( control1, user->bbox ) ||
+ CHECK_X( control2, user->bbox ) )
+ BBox_Cubic_Check( user->last.x,
+ control1->x,
+ control2->x,
+ to->x,
+ &user->bbox.xMin,
+ &user->bbox.xMax );
+
+ if ( CHECK_Y( control1, user->bbox ) ||
+ CHECK_Y( control2, user->bbox ) )
+ BBox_Cubic_Check( user->last.y,
+ control1->y,
+ control2->y,
+ to->y,
+ &user->bbox.yMin,
+ &user->bbox.yMax );
+
+ user->last = *to;
+
+ return 0;
+ }
+
+FT_DEFINE_OUTLINE_FUNCS(bbox_interface,
+ (FT_Outline_MoveTo_Func) BBox_Move_To,
+ (FT_Outline_LineTo_Func) BBox_Move_To,
+ (FT_Outline_ConicTo_Func)BBox_Conic_To,
+ (FT_Outline_CubicTo_Func)BBox_Cubic_To,
+ 0, 0
+ )
+
+ /* documentation is in ftbbox.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Outline_Get_BBox( FT_Outline* outline,
+ FT_BBox *abbox )
+ {
+ FT_BBox cbox;
+ FT_BBox bbox;
+ FT_Vector* vec;
+ FT_UShort n;
+
+
+ if ( !abbox )
+ return FT_THROW( Invalid_Argument );
+
+ if ( !outline )
+ return FT_THROW( Invalid_Outline );
+
+ /* if outline is empty, return (0,0,0,0) */
+ if ( outline->n_points == 0 || outline->n_contours <= 0 )
+ {
+ abbox->xMin = abbox->xMax = 0;
+ abbox->yMin = abbox->yMax = 0;
+ return 0;
+ }
+
+ /* We compute the control box as well as the bounding box of */
+ /* all `on' points in the outline. Then, if the two boxes */
+ /* coincide, we exit immediately. */
+
+ vec = outline->points;
+ bbox.xMin = bbox.xMax = cbox.xMin = cbox.xMax = vec->x;
+ bbox.yMin = bbox.yMax = cbox.yMin = cbox.yMax = vec->y;
+ vec++;
+
+ for ( n = 1; n < outline->n_points; n++ )
+ {
+ FT_Pos x = vec->x;
+ FT_Pos y = vec->y;
+
+
+ /* update control box */
+ if ( x < cbox.xMin ) cbox.xMin = x;
+ if ( x > cbox.xMax ) cbox.xMax = x;
+
+ if ( y < cbox.yMin ) cbox.yMin = y;
+ if ( y > cbox.yMax ) cbox.yMax = y;
+
+ if ( FT_CURVE_TAG( outline->tags[n] ) == FT_CURVE_TAG_ON )
+ {
+ /* update bbox for `on' points only */
+ if ( x < bbox.xMin ) bbox.xMin = x;
+ if ( x > bbox.xMax ) bbox.xMax = x;
+
+ if ( y < bbox.yMin ) bbox.yMin = y;
+ if ( y > bbox.yMax ) bbox.yMax = y;
+ }
+
+ vec++;
+ }
+
+ /* test two boxes for equality */
+ if ( cbox.xMin < bbox.xMin || cbox.xMax > bbox.xMax ||
+ cbox.yMin < bbox.yMin || cbox.yMax > bbox.yMax )
+ {
+ /* the two boxes are different, now walk over the outline to */
+ /* get the Bezier arc extrema. */
+
+ FT_Error error;
+ TBBox_Rec user;
+
+#ifdef FT_CONFIG_OPTION_PIC
+ FT_Outline_Funcs bbox_interface;
+ Init_Class_bbox_interface(&bbox_interface);
+#endif
+
+ user.bbox = bbox;
+
+ error = FT_Outline_Decompose( outline, &bbox_interface, &user );
+ if ( error )
+ return error;
+
+ *abbox = user.bbox;
+ }
+ else
+ *abbox = bbox;
+
+ return FT_Err_Ok;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftbdf.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftbdf.c
new file mode 100644
index 0000000000..60bc5fc2eb
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftbdf.c
@@ -0,0 +1,88 @@
+/***************************************************************************/
+/* */
+/* ftbdf.c */
+/* */
+/* FreeType API for accessing BDF-specific strings (body). */
+/* */
+/* Copyright 2002-2004, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/services/svbdf.h"
+
+
+ /* documentation is in ftbdf.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Get_BDF_Charset_ID( FT_Face face,
+ const char* *acharset_encoding,
+ const char* *acharset_registry )
+ {
+ FT_Error error;
+ const char* encoding = NULL;
+ const char* registry = NULL;
+
+
+ error = FT_ERR( Invalid_Argument );
+
+ if ( face )
+ {
+ FT_Service_BDF service;
+
+
+ FT_FACE_FIND_SERVICE( face, service, BDF );
+
+ if ( service && service->get_charset_id )
+ error = service->get_charset_id( face, &encoding, &registry );
+ }
+
+ if ( acharset_encoding )
+ *acharset_encoding = encoding;
+
+ if ( acharset_registry )
+ *acharset_registry = registry;
+
+ return error;
+ }
+
+
+ /* documentation is in ftbdf.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Get_BDF_Property( FT_Face face,
+ const char* prop_name,
+ BDF_PropertyRec *aproperty )
+ {
+ FT_Error error;
+
+
+ error = FT_ERR( Invalid_Argument );
+
+ aproperty->type = BDF_PROPERTY_TYPE_NONE;
+
+ if ( face )
+ {
+ FT_Service_BDF service;
+
+
+ FT_FACE_FIND_SERVICE( face, service, BDF );
+
+ if ( service && service->get_property )
+ error = service->get_property( face, prop_name, aproperty );
+ }
+
+ return error;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftcalc.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftcalc.c
new file mode 100644
index 0000000000..0c773cfd27
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftcalc.c
@@ -0,0 +1,972 @@
+/***************************************************************************/
+/* */
+/* ftcalc.c */
+/* */
+/* Arithmetic computations (body). */
+/* */
+/* Copyright 1996-2006, 2008, 2012-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* Support for 1-complement arithmetic has been totally dropped in this */
+ /* release. You can still write your own code if you need it. */
+ /* */
+ /*************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* Implementing basic computation routines. */
+ /* */
+ /* FT_MulDiv(), FT_MulFix(), FT_DivFix(), FT_RoundFix(), FT_CeilFix(), */
+ /* and FT_FloorFix() are declared in freetype.h. */
+ /* */
+ /*************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/ftglyph.h"
+#include "../../include/freetype/fttrigon.h"
+#include "../../include/freetype/internal/ftcalc.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftobjs.h"
+
+
+/* we need to emulate a 64-bit data type if a real one isn't available */
+
+#ifndef FT_LONG64
+
+ typedef struct FT_Int64_
+ {
+ FT_UInt32 lo;
+ FT_UInt32 hi;
+
+ } FT_Int64;
+
+#endif /* !FT_LONG64 */
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_calc
+
+
+ /* The following three functions are available regardless of whether */
+ /* FT_LONG64 is defined. */
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_Fixed )
+ FT_RoundFix( FT_Fixed a )
+ {
+ return ( a >= 0 ) ? ( a + 0x8000L ) & ~0xFFFFL
+ : -((-a + 0x8000L ) & ~0xFFFFL );
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_Fixed )
+ FT_CeilFix( FT_Fixed a )
+ {
+ return ( a >= 0 ) ? ( a + 0xFFFFL ) & ~0xFFFFL
+ : -((-a + 0xFFFFL ) & ~0xFFFFL );
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_Fixed )
+ FT_FloorFix( FT_Fixed a )
+ {
+ return ( a >= 0 ) ? a & ~0xFFFFL
+ : -((-a) & ~0xFFFFL );
+ }
+
+
+ FT_BASE_DEF ( FT_Int )
+ FT_MSB( FT_UInt32 z )
+ {
+ FT_Int shift = 0;
+
+ /* determine msb bit index in `shift' */
+ if ( z >= ( 1L << 16 ) )
+ {
+ z >>= 16;
+ shift += 16;
+ }
+ if ( z >= ( 1L << 8 ) )
+ {
+ z >>= 8;
+ shift += 8;
+ }
+ if ( z >= ( 1L << 4 ) )
+ {
+ z >>= 4;
+ shift += 4;
+ }
+ if ( z >= ( 1L << 2 ) )
+ {
+ z >>= 2;
+ shift += 2;
+ }
+ if ( z >= ( 1L << 1 ) )
+ {
+ z >>= 1;
+ shift += 1;
+ }
+
+ return shift;
+ }
+
+
+ /* documentation is in ftcalc.h */
+
+ FT_BASE_DEF( FT_Fixed )
+ FT_Hypot( FT_Fixed x,
+ FT_Fixed y )
+ {
+ FT_Vector v;
+
+
+ v.x = x;
+ v.y = y;
+
+ return FT_Vector_Length( &v );
+ }
+
+
+#ifdef FT_LONG64
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_Long )
+ FT_MulDiv( FT_Long a,
+ FT_Long b,
+ FT_Long c )
+ {
+ FT_Int s;
+ FT_Long d;
+
+
+ s = 1;
+ if ( a < 0 ) { a = -a; s = -1; }
+ if ( b < 0 ) { b = -b; s = -s; }
+ if ( c < 0 ) { c = -c; s = -s; }
+
+ d = (FT_Long)( c > 0 ? ( (FT_Int64)a * b + ( c >> 1 ) ) / c
+ : 0x7FFFFFFFL );
+
+ return ( s > 0 ) ? d : -d;
+ }
+
+
+ /* documentation is in ftcalc.h */
+
+ FT_BASE_DEF( FT_Long )
+ FT_MulDiv_No_Round( FT_Long a,
+ FT_Long b,
+ FT_Long c )
+ {
+ FT_Int s;
+ FT_Long d;
+
+
+ s = 1;
+ if ( a < 0 ) { a = -a; s = -1; }
+ if ( b < 0 ) { b = -b; s = -s; }
+ if ( c < 0 ) { c = -c; s = -s; }
+
+ d = (FT_Long)( c > 0 ? (FT_Int64)a * b / c
+ : 0x7FFFFFFFL );
+
+ return ( s > 0 ) ? d : -d;
+ }
+
+
+ /* documentation is in freetype.h */
+ /* if defined FT_MULFIX_INLINED, use the inline FT_MULFIX_ASSEMBLER function. */
+#ifndef FT_MULFIX_INLINED
+ FT_EXPORT_DEF( FT_Long )
+ FT_MulFix( FT_Long a,
+ FT_Long b )
+ {
+#ifdef FT_MULFIX_ASSEMBLER
+
+ return FT_MULFIX_ASSEMBLER( a, b );
+
+#else
+
+ FT_Int s = 1;
+ FT_Long c;
+
+
+ if ( a < 0 )
+ {
+ a = -a;
+ s = -1;
+ }
+
+ if ( b < 0 )
+ {
+ b = -b;
+ s = -s;
+ }
+
+ c = (FT_Long)( ( (FT_Int64)a * b + 0x8000L ) >> 16 );
+
+ return ( s > 0 ) ? c : -c;
+
+#endif /* FT_MULFIX_ASSEMBLER */
+ }
+ #endif/* FT_MULFIX_INLINED */
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_Long )
+ FT_DivFix( FT_Long a,
+ FT_Long b )
+ {
+ FT_Int32 s;
+ FT_UInt32 q;
+
+
+ s = 1;
+ if ( a < 0 )
+ {
+ a = -a;
+ s = -1;
+ }
+ if ( b < 0 )
+ {
+ b = -b;
+ s = -s;
+ }
+
+ if ( b == 0 )
+ /* check for division by 0 */
+ q = 0x7FFFFFFFL;
+ else
+ /* compute result directly */
+ q = (FT_UInt32)( ( ( (FT_UInt64)a << 16 ) + ( b >> 1 ) ) / b );
+
+ return ( s < 0 ? -(FT_Long)q : (FT_Long)q );
+ }
+
+
+#else /* !FT_LONG64 */
+
+
+ static void
+ ft_multo64( FT_UInt32 x,
+ FT_UInt32 y,
+ FT_Int64 *z )
+ {
+ FT_UInt32 lo1, hi1, lo2, hi2, lo, hi, i1, i2;
+
+
+ lo1 = x & 0x0000FFFFU; hi1 = x >> 16;
+ lo2 = y & 0x0000FFFFU; hi2 = y >> 16;
+
+ lo = lo1 * lo2;
+ i1 = lo1 * hi2;
+ i2 = lo2 * hi1;
+ hi = hi1 * hi2;
+
+ /* Check carry overflow of i1 + i2 */
+ i1 += i2;
+ hi += (FT_UInt32)( i1 < i2 ) << 16;
+
+ hi += i1 >> 16;
+ i1 = i1 << 16;
+
+ /* Check carry overflow of i1 + lo */
+ lo += i1;
+ hi += ( lo < i1 );
+
+ z->lo = lo;
+ z->hi = hi;
+ }
+
+
+ static FT_UInt32
+ ft_div64by32( FT_UInt32 hi,
+ FT_UInt32 lo,
+ FT_UInt32 y )
+ {
+ FT_UInt32 r, q;
+ FT_Int i;
+
+
+ q = 0;
+ r = hi;
+
+ if ( r >= y )
+ return (FT_UInt32)0x7FFFFFFFL;
+
+ i = 32;
+ do
+ {
+ r <<= 1;
+ q <<= 1;
+ r |= lo >> 31;
+
+ if ( r >= y )
+ {
+ r -= y;
+ q |= 1;
+ }
+ lo <<= 1;
+ } while ( --i );
+
+ return q;
+ }
+
+
+ static void
+ FT_Add64( FT_Int64* x,
+ FT_Int64* y,
+ FT_Int64 *z )
+ {
+ register FT_UInt32 lo, hi;
+
+
+ lo = x->lo + y->lo;
+ hi = x->hi + y->hi + ( lo < x->lo );
+
+ z->lo = lo;
+ z->hi = hi;
+ }
+
+
+ /* documentation is in freetype.h */
+
+ /* The FT_MulDiv function has been optimized thanks to ideas from */
+ /* Graham Asher. The trick is to optimize computation when everything */
+ /* fits within 32-bits (a rather common case). */
+ /* */
+ /* we compute 'a*b+c/2', then divide it by 'c'. (positive values) */
+ /* */
+ /* 46340 is FLOOR(SQRT(2^31-1)). */
+ /* */
+ /* if ( a <= 46340 && b <= 46340 ) then ( a*b <= 0x7FFEA810 ) */
+ /* */
+ /* 0x7FFFFFFF - 0x7FFEA810 = 0x157F0 */
+ /* */
+ /* if ( c < 0x157F0*2 ) then ( a*b+c/2 <= 0x7FFFFFFF ) */
+ /* */
+ /* and 2*0x157F0 = 176096 */
+ /* */
+
+ FT_EXPORT_DEF( FT_Long )
+ FT_MulDiv( FT_Long a,
+ FT_Long b,
+ FT_Long c )
+ {
+ long s;
+
+
+ /* XXX: this function does not allow 64-bit arguments */
+ if ( a == 0 || b == c )
+ return a;
+
+ s = a; a = FT_ABS( a );
+ s ^= b; b = FT_ABS( b );
+ s ^= c; c = FT_ABS( c );
+
+ if ( a <= 46340L && b <= 46340L && c <= 176095L && c > 0 )
+ a = ( a * b + ( c >> 1 ) ) / c;
+
+ else if ( (FT_Int32)c > 0 )
+ {
+ FT_Int64 temp, temp2;
+
+
+ ft_multo64( (FT_Int32)a, (FT_Int32)b, &temp );
+
+ temp2.hi = 0;
+ temp2.lo = (FT_UInt32)(c >> 1);
+ FT_Add64( &temp, &temp2, &temp );
+ a = ft_div64by32( temp.hi, temp.lo, (FT_Int32)c );
+ }
+ else
+ a = 0x7FFFFFFFL;
+
+ return ( s < 0 ? -a : a );
+ }
+
+
+ FT_BASE_DEF( FT_Long )
+ FT_MulDiv_No_Round( FT_Long a,
+ FT_Long b,
+ FT_Long c )
+ {
+ long s;
+
+
+ if ( a == 0 || b == c )
+ return a;
+
+ s = a; a = FT_ABS( a );
+ s ^= b; b = FT_ABS( b );
+ s ^= c; c = FT_ABS( c );
+
+ if ( a <= 46340L && b <= 46340L && c > 0 )
+ a = a * b / c;
+
+ else if ( (FT_Int32)c > 0 )
+ {
+ FT_Int64 temp;
+
+
+ ft_multo64( (FT_Int32)a, (FT_Int32)b, &temp );
+ a = ft_div64by32( temp.hi, temp.lo, (FT_Int32)c );
+ }
+ else
+ a = 0x7FFFFFFFL;
+
+ return ( s < 0 ? -a : a );
+ }
+
+
+ /* documentation is in freetype.h */
+ #ifndef FT_MULFIX_INLINED
+ FT_EXPORT_DEF( FT_Long )
+ FT_MulFix( FT_Long a,
+ FT_Long b )
+ {
+#ifdef FT_MULFIX_ASSEMBLER
+
+ return FT_MULFIX_ASSEMBLER( a, b );
+
+#elif 0
+
+ /*
+ * This code is nonportable. See comment below.
+ *
+ * However, on a platform where right-shift of a signed quantity fills
+ * the leftmost bits by copying the sign bit, it might be faster.
+ */
+
+ FT_Long sa, sb;
+ FT_ULong ua, ub;
+
+
+ if ( a == 0 || b == 0x10000L )
+ return a;
+
+ /*
+ * This is a clever way of converting a signed number `a' into its
+ * absolute value (stored back into `a') and its sign. The sign is
+ * stored in `sa'; 0 means `a' was positive or zero, and -1 means `a'
+ * was negative. (Similarly for `b' and `sb').
+ *
+ * Unfortunately, it doesn't work (at least not portably).
+ *
+ * It makes the assumption that right-shift on a negative signed value
+ * fills the leftmost bits by copying the sign bit. This is wrong.
+ * According to K&R 2nd ed, section `A7.8 Shift Operators' on page 206,
+ * the result of right-shift of a negative signed value is
+ * implementation-defined. At least one implementation fills the
+ * leftmost bits with 0s (i.e., it is exactly the same as an unsigned
+ * right shift). This means that when `a' is negative, `sa' ends up
+ * with the value 1 rather than -1. After that, everything else goes
+ * wrong.
+ */
+ sa = ( a >> ( sizeof ( a ) * 8 - 1 ) );
+ a = ( a ^ sa ) - sa;
+ sb = ( b >> ( sizeof ( b ) * 8 - 1 ) );
+ b = ( b ^ sb ) - sb;
+
+ ua = (FT_ULong)a;
+ ub = (FT_ULong)b;
+
+ if ( ua <= 2048 && ub <= 1048576L )
+ ua = ( ua * ub + 0x8000U ) >> 16;
+ else
+ {
+ FT_ULong al = ua & 0xFFFFU;
+
+
+ ua = ( ua >> 16 ) * ub + al * ( ub >> 16 ) +
+ ( ( al * ( ub & 0xFFFFU ) + 0x8000U ) >> 16 );
+ }
+
+ sa ^= sb,
+ ua = (FT_ULong)(( ua ^ sa ) - sa);
+
+ return (FT_Long)ua;
+
+#else /* 0 */
+
+ FT_Long s;
+ FT_ULong ua, ub;
+
+
+ if ( a == 0 || b == 0x10000L )
+ return a;
+
+ s = a; a = FT_ABS( a );
+ s ^= b; b = FT_ABS( b );
+
+ ua = (FT_ULong)a;
+ ub = (FT_ULong)b;
+
+ if ( ua <= 2048 && ub <= 1048576L )
+ ua = ( ua * ub + 0x8000UL ) >> 16;
+ else
+ {
+ FT_ULong al = ua & 0xFFFFUL;
+
+
+ ua = ( ua >> 16 ) * ub + al * ( ub >> 16 ) +
+ ( ( al * ( ub & 0xFFFFUL ) + 0x8000UL ) >> 16 );
+ }
+
+ return ( s < 0 ? -(FT_Long)ua : (FT_Long)ua );
+
+#endif /* 0 */
+
+ }
+#endif
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_Long )
+ FT_DivFix( FT_Long a,
+ FT_Long b )
+ {
+ FT_Int32 s;
+ FT_UInt32 q;
+
+
+ /* XXX: this function does not allow 64-bit arguments */
+ s = (FT_Int32)a; a = FT_ABS( a );
+ s ^= (FT_Int32)b; b = FT_ABS( b );
+
+ if ( (FT_UInt32)b == 0 )
+ {
+ /* check for division by 0 */
+ q = (FT_UInt32)0x7FFFFFFFL;
+ }
+ else if ( ( a >> 16 ) == 0 )
+ {
+ /* compute result directly */
+ q = (FT_UInt32)( ( (FT_ULong)a << 16 ) + ( b >> 1 ) ) / (FT_UInt32)b;
+ }
+ else
+ {
+ /* we need more bits; we have to do it by hand */
+ FT_Int64 temp, temp2;
+
+
+ temp.hi = (FT_Int32)( a >> 16 );
+ temp.lo = (FT_UInt32)a << 16;
+ temp2.hi = 0;
+ temp2.lo = (FT_UInt32)( b >> 1 );
+ FT_Add64( &temp, &temp2, &temp );
+ q = ft_div64by32( temp.hi, temp.lo, (FT_Int32)b );
+ }
+
+ return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q );
+ }
+
+
+#if 0
+
+ /* documentation is in ftcalc.h */
+
+ FT_EXPORT_DEF( void )
+ FT_MulTo64( FT_Int32 x,
+ FT_Int32 y,
+ FT_Int64 *z )
+ {
+ FT_Int32 s;
+
+
+ s = x; x = FT_ABS( x );
+ s ^= y; y = FT_ABS( y );
+
+ ft_multo64( x, y, z );
+
+ if ( s < 0 )
+ {
+ z->lo = (FT_UInt32)-(FT_Int32)z->lo;
+ z->hi = ~z->hi + !( z->lo );
+ }
+ }
+
+
+ /* apparently, the second version of this code is not compiled correctly */
+ /* on Mac machines with the MPW C compiler.. tsk, tsk, tsk... */
+
+#if 1
+
+ FT_EXPORT_DEF( FT_Int32 )
+ FT_Div64by32( FT_Int64* x,
+ FT_Int32 y )
+ {
+ FT_Int32 s;
+ FT_UInt32 q, r, i, lo;
+
+
+ s = x->hi;
+ if ( s < 0 )
+ {
+ x->lo = (FT_UInt32)-(FT_Int32)x->lo;
+ x->hi = ~x->hi + !x->lo;
+ }
+ s ^= y; y = FT_ABS( y );
+
+ /* Shortcut */
+ if ( x->hi == 0 )
+ {
+ if ( y > 0 )
+ q = x->lo / y;
+ else
+ q = 0x7FFFFFFFL;
+
+ return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q );
+ }
+
+ r = x->hi;
+ lo = x->lo;
+
+ if ( r >= (FT_UInt32)y ) /* we know y is to be treated as unsigned here */
+ return ( s < 0 ? 0x80000001UL : 0x7FFFFFFFUL );
+ /* Return Max/Min Int32 if division overflow. */
+ /* This includes division by zero! */
+ q = 0;
+ for ( i = 0; i < 32; i++ )
+ {
+ r <<= 1;
+ q <<= 1;
+ r |= lo >> 31;
+
+ if ( r >= (FT_UInt32)y )
+ {
+ r -= y;
+ q |= 1;
+ }
+ lo <<= 1;
+ }
+
+ return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q );
+ }
+
+#else /* 0 */
+
+ FT_EXPORT_DEF( FT_Int32 )
+ FT_Div64by32( FT_Int64* x,
+ FT_Int32 y )
+ {
+ FT_Int32 s;
+ FT_UInt32 q;
+
+
+ s = x->hi;
+ if ( s < 0 )
+ {
+ x->lo = (FT_UInt32)-(FT_Int32)x->lo;
+ x->hi = ~x->hi + !x->lo;
+ }
+ s ^= y; y = FT_ABS( y );
+
+ /* Shortcut */
+ if ( x->hi == 0 )
+ {
+ if ( y > 0 )
+ q = ( x->lo + ( y >> 1 ) ) / y;
+ else
+ q = 0x7FFFFFFFL;
+
+ return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q );
+ }
+
+ q = ft_div64by32( x->hi, x->lo, y );
+
+ return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q );
+ }
+
+#endif /* 0 */
+
+#endif /* 0 */
+
+
+#endif /* FT_LONG64 */
+
+
+ /* documentation is in ftglyph.h */
+
+ FT_EXPORT_DEF( void )
+ FT_Matrix_Multiply( const FT_Matrix* a,
+ FT_Matrix *b )
+ {
+ FT_Fixed xx, xy, yx, yy;
+
+
+ if ( !a || !b )
+ return;
+
+ xx = FT_MulFix( a->xx, b->xx ) + FT_MulFix( a->xy, b->yx );
+ xy = FT_MulFix( a->xx, b->xy ) + FT_MulFix( a->xy, b->yy );
+ yx = FT_MulFix( a->yx, b->xx ) + FT_MulFix( a->yy, b->yx );
+ yy = FT_MulFix( a->yx, b->xy ) + FT_MulFix( a->yy, b->yy );
+
+ b->xx = xx; b->xy = xy;
+ b->yx = yx; b->yy = yy;
+ }
+
+
+ /* documentation is in ftglyph.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Matrix_Invert( FT_Matrix* matrix )
+ {
+ FT_Pos delta, xx, yy;
+
+
+ if ( !matrix )
+ return FT_THROW( Invalid_Argument );
+
+ /* compute discriminant */
+ delta = FT_MulFix( matrix->xx, matrix->yy ) -
+ FT_MulFix( matrix->xy, matrix->yx );
+
+ if ( !delta )
+ return FT_THROW( Invalid_Argument ); /* matrix can't be inverted */
+
+ matrix->xy = - FT_DivFix( matrix->xy, delta );
+ matrix->yx = - FT_DivFix( matrix->yx, delta );
+
+ xx = matrix->xx;
+ yy = matrix->yy;
+
+ matrix->xx = FT_DivFix( yy, delta );
+ matrix->yy = FT_DivFix( xx, delta );
+
+ return FT_Err_Ok;
+ }
+
+
+ /* documentation is in ftcalc.h */
+
+ FT_BASE_DEF( void )
+ FT_Matrix_Multiply_Scaled( const FT_Matrix* a,
+ FT_Matrix *b,
+ FT_Long scaling )
+ {
+ FT_Fixed xx, xy, yx, yy;
+
+ FT_Long val = 0x10000L * scaling;
+
+
+ if ( !a || !b )
+ return;
+
+ xx = FT_MulDiv( a->xx, b->xx, val ) + FT_MulDiv( a->xy, b->yx, val );
+ xy = FT_MulDiv( a->xx, b->xy, val ) + FT_MulDiv( a->xy, b->yy, val );
+ yx = FT_MulDiv( a->yx, b->xx, val ) + FT_MulDiv( a->yy, b->yx, val );
+ yy = FT_MulDiv( a->yx, b->xy, val ) + FT_MulDiv( a->yy, b->yy, val );
+
+ b->xx = xx; b->xy = xy;
+ b->yx = yx; b->yy = yy;
+ }
+
+
+ /* documentation is in ftcalc.h */
+
+ FT_BASE_DEF( void )
+ FT_Vector_Transform_Scaled( FT_Vector* vector,
+ const FT_Matrix* matrix,
+ FT_Long scaling )
+ {
+ FT_Pos xz, yz;
+
+ FT_Long val = 0x10000L * scaling;
+
+
+ if ( !vector || !matrix )
+ return;
+
+ xz = FT_MulDiv( vector->x, matrix->xx, val ) +
+ FT_MulDiv( vector->y, matrix->xy, val );
+
+ yz = FT_MulDiv( vector->x, matrix->yx, val ) +
+ FT_MulDiv( vector->y, matrix->yy, val );
+
+ vector->x = xz;
+ vector->y = yz;
+ }
+
+
+ /* documentation is in ftcalc.h */
+
+ FT_BASE_DEF( FT_Int32 )
+ FT_SqrtFixed( FT_Int32 x )
+ {
+ FT_UInt32 root, rem_hi, rem_lo, test_div;
+ FT_Int count;
+
+
+ root = 0;
+
+ if ( x > 0 )
+ {
+ rem_hi = 0;
+ rem_lo = x;
+ count = 24;
+ do
+ {
+ rem_hi = ( rem_hi << 2 ) | ( rem_lo >> 30 );
+ rem_lo <<= 2;
+ root <<= 1;
+ test_div = ( root << 1 ) + 1;
+
+ if ( rem_hi >= test_div )
+ {
+ rem_hi -= test_div;
+ root += 1;
+ }
+ } while ( --count );
+ }
+
+ return (FT_Int32)root;
+ }
+
+
+ /* documentation is in ftcalc.h */
+
+ FT_BASE_DEF( FT_Int )
+ ft_corner_orientation( FT_Pos in_x,
+ FT_Pos in_y,
+ FT_Pos out_x,
+ FT_Pos out_y )
+ {
+ FT_Long result; /* avoid overflow on 16-bit system */
+
+
+ /* deal with the trivial cases quickly */
+ if ( in_y == 0 )
+ {
+ if ( in_x >= 0 )
+ result = out_y;
+ else
+ result = -out_y;
+ }
+ else if ( in_x == 0 )
+ {
+ if ( in_y >= 0 )
+ result = -out_x;
+ else
+ result = out_x;
+ }
+ else if ( out_y == 0 )
+ {
+ if ( out_x >= 0 )
+ result = in_y;
+ else
+ result = -in_y;
+ }
+ else if ( out_x == 0 )
+ {
+ if ( out_y >= 0 )
+ result = -in_x;
+ else
+ result = in_x;
+ }
+ else /* general case */
+ {
+#ifdef FT_LONG64
+
+ FT_Int64 delta = (FT_Int64)in_x * out_y - (FT_Int64)in_y * out_x;
+
+
+ if ( delta == 0 )
+ result = 0;
+ else
+ result = 1 - 2 * ( delta < 0 );
+
+#else
+
+ FT_Int64 z1, z2;
+
+
+ /* XXX: this function does not allow 64-bit arguments */
+ ft_multo64( (FT_Int32)in_x, (FT_Int32)out_y, &z1 );
+ ft_multo64( (FT_Int32)in_y, (FT_Int32)out_x, &z2 );
+
+ if ( z1.hi > z2.hi )
+ result = +1;
+ else if ( z1.hi < z2.hi )
+ result = -1;
+ else if ( z1.lo > z2.lo )
+ result = +1;
+ else if ( z1.lo < z2.lo )
+ result = -1;
+ else
+ result = 0;
+
+#endif
+ }
+
+ /* XXX: only the sign of return value, +1/0/-1 must be used */
+ return (FT_Int)result;
+ }
+
+
+ /* documentation is in ftcalc.h */
+
+ FT_BASE_DEF( FT_Int )
+ ft_corner_is_flat( FT_Pos in_x,
+ FT_Pos in_y,
+ FT_Pos out_x,
+ FT_Pos out_y )
+ {
+ FT_Pos ax = in_x;
+ FT_Pos ay = in_y;
+
+ FT_Pos d_in, d_out, d_corner;
+
+
+ if ( ax < 0 )
+ ax = -ax;
+ if ( ay < 0 )
+ ay = -ay;
+ d_in = ax + ay;
+
+ ax = out_x;
+ if ( ax < 0 )
+ ax = -ax;
+ ay = out_y;
+ if ( ay < 0 )
+ ay = -ay;
+ d_out = ax + ay;
+
+ ax = out_x + in_x;
+ if ( ax < 0 )
+ ax = -ax;
+ ay = out_y + in_y;
+ if ( ay < 0 )
+ ay = -ay;
+ d_corner = ax + ay;
+
+ return ( d_in + d_out - d_corner ) < ( d_corner >> 4 );
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftcid.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftcid.c
new file mode 100644
index 0000000000..d9817a499a
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftcid.c
@@ -0,0 +1,117 @@
+/***************************************************************************/
+/* */
+/* ftcid.c */
+/* */
+/* FreeType API for accessing CID font information. */
+/* */
+/* Copyright 2007, 2009, 2013 by Derek Clegg, Michael Toftdal. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/ftcid.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/services/svcid.h"
+
+
+ /* documentation is in ftcid.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Get_CID_Registry_Ordering_Supplement( FT_Face face,
+ const char* *registry,
+ const char* *ordering,
+ FT_Int *supplement)
+ {
+ FT_Error error;
+ const char* r = NULL;
+ const char* o = NULL;
+ FT_Int s = 0;
+
+
+ error = FT_ERR( Invalid_Argument );
+
+ if ( face )
+ {
+ FT_Service_CID service;
+
+
+ FT_FACE_FIND_SERVICE( face, service, CID );
+
+ if ( service && service->get_ros )
+ error = service->get_ros( face, &r, &o, &s );
+ }
+
+ if ( registry )
+ *registry = r;
+
+ if ( ordering )
+ *ordering = o;
+
+ if ( supplement )
+ *supplement = s;
+
+ return error;
+ }
+
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Get_CID_Is_Internally_CID_Keyed( FT_Face face,
+ FT_Bool *is_cid )
+ {
+ FT_Error error = FT_ERR( Invalid_Argument );
+ FT_Bool ic = 0;
+
+
+ if ( face )
+ {
+ FT_Service_CID service;
+
+
+ FT_FACE_FIND_SERVICE( face, service, CID );
+
+ if ( service && service->get_is_cid )
+ error = service->get_is_cid( face, &ic);
+ }
+
+ if ( is_cid )
+ *is_cid = ic;
+
+ return error;
+ }
+
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Get_CID_From_Glyph_Index( FT_Face face,
+ FT_UInt glyph_index,
+ FT_UInt *cid )
+ {
+ FT_Error error = FT_ERR( Invalid_Argument );
+ FT_UInt c = 0;
+
+
+ if ( face )
+ {
+ FT_Service_CID service;
+
+
+ FT_FACE_FIND_SERVICE( face, service, CID );
+
+ if ( service && service->get_cid_from_glyph_index )
+ error = service->get_cid_from_glyph_index( face, glyph_index, &c);
+ }
+
+ if ( cid )
+ *cid = c;
+
+ return error;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftdbgmem.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftdbgmem.c
new file mode 100644
index 0000000000..55f59372d8
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftdbgmem.c
@@ -0,0 +1,992 @@
+/***************************************************************************/
+/* */
+/* ftdbgmem.c */
+/* */
+/* Memory debugger (body). */
+/* */
+/* Copyright 2001-2006, 2009, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/config/ftconfig.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftmemory.h"
+#include "../../include/freetype/ftsystem.h"
+#include "../../include/freetype/fterrors.h"
+#include "../../include/freetype/fttypes.h"
+
+
+#ifdef FT_DEBUG_MEMORY
+
+#define KEEPALIVE /* `Keep alive' means that freed blocks aren't released
+ * to the heap. This is useful to detect double-frees
+ * or weird heap corruption, but it uses large amounts of
+ * memory, however.
+ */
+
+#include "../../include/freetype/config/ftstdlib.h"
+
+ FT_BASE_DEF( const char* ) _ft_debug_file = 0;
+ FT_BASE_DEF( long ) _ft_debug_lineno = 0;
+
+ extern void
+ FT_DumpMemory( FT_Memory memory );
+
+
+ typedef struct FT_MemSourceRec_* FT_MemSource;
+ typedef struct FT_MemNodeRec_* FT_MemNode;
+ typedef struct FT_MemTableRec_* FT_MemTable;
+
+
+#define FT_MEM_VAL( addr ) ((FT_PtrDist)(FT_Pointer)( addr ))
+
+ /*
+ * This structure holds statistics for a single allocation/release
+ * site. This is useful to know where memory operations happen the
+ * most.
+ */
+ typedef struct FT_MemSourceRec_
+ {
+ const char* file_name;
+ long line_no;
+
+ FT_Long cur_blocks; /* current number of allocated blocks */
+ FT_Long max_blocks; /* max. number of allocated blocks */
+ FT_Long all_blocks; /* total number of blocks allocated */
+
+ FT_Long cur_size; /* current cumulative allocated size */
+ FT_Long max_size; /* maximum cumulative allocated size */
+ FT_Long all_size; /* total cumulative allocated size */
+
+ FT_Long cur_max; /* current maximum allocated size */
+
+ FT_UInt32 hash;
+ FT_MemSource link;
+
+ } FT_MemSourceRec;
+
+
+ /*
+ * We don't need a resizable array for the memory sources, because
+ * their number is pretty limited within FreeType.
+ */
+#define FT_MEM_SOURCE_BUCKETS 128
+
+ /*
+ * This structure holds information related to a single allocated
+ * memory block. If KEEPALIVE is defined, blocks that are freed by
+ * FreeType are never released to the system. Instead, their `size'
+ * field is set to -size. This is mainly useful to detect double frees,
+ * at the price of large memory footprint during execution.
+ */
+ typedef struct FT_MemNodeRec_
+ {
+ FT_Byte* address;
+ FT_Long size; /* < 0 if the block was freed */
+
+ FT_MemSource source;
+
+#ifdef KEEPALIVE
+ const char* free_file_name;
+ FT_Long free_line_no;
+#endif
+
+ FT_MemNode link;
+
+ } FT_MemNodeRec;
+
+
+ /*
+ * The global structure, containing compound statistics and all hash
+ * tables.
+ */
+ typedef struct FT_MemTableRec_
+ {
+ FT_ULong size;
+ FT_ULong nodes;
+ FT_MemNode* buckets;
+
+ FT_ULong alloc_total;
+ FT_ULong alloc_current;
+ FT_ULong alloc_max;
+ FT_ULong alloc_count;
+
+ FT_Bool bound_total;
+ FT_ULong alloc_total_max;
+
+ FT_Bool bound_count;
+ FT_ULong alloc_count_max;
+
+ FT_MemSource sources[FT_MEM_SOURCE_BUCKETS];
+
+ FT_Bool keep_alive;
+
+ FT_Memory memory;
+ FT_Pointer memory_user;
+ FT_Alloc_Func alloc;
+ FT_Free_Func free;
+ FT_Realloc_Func realloc;
+
+ } FT_MemTableRec;
+
+
+#define FT_MEM_SIZE_MIN 7
+#define FT_MEM_SIZE_MAX 13845163
+
+#define FT_FILENAME( x ) ((x) ? (x) : "unknown file")
+
+
+ /*
+ * Prime numbers are ugly to handle. It would be better to implement
+ * L-Hashing, which is 10% faster and doesn't require divisions.
+ */
+ static const FT_UInt ft_mem_primes[] =
+ {
+ 7,
+ 11,
+ 19,
+ 37,
+ 73,
+ 109,
+ 163,
+ 251,
+ 367,
+ 557,
+ 823,
+ 1237,
+ 1861,
+ 2777,
+ 4177,
+ 6247,
+ 9371,
+ 14057,
+ 21089,
+ 31627,
+ 47431,
+ 71143,
+ 106721,
+ 160073,
+ 240101,
+ 360163,
+ 540217,
+ 810343,
+ 1215497,
+ 1823231,
+ 2734867,
+ 4102283,
+ 6153409,
+ 9230113,
+ 13845163,
+ };
+
+
+ static FT_ULong
+ ft_mem_closest_prime( FT_ULong num )
+ {
+ FT_UInt i;
+
+
+ for ( i = 0;
+ i < sizeof ( ft_mem_primes ) / sizeof ( ft_mem_primes[0] ); i++ )
+ if ( ft_mem_primes[i] > num )
+ return ft_mem_primes[i];
+
+ return FT_MEM_SIZE_MAX;
+ }
+
+
+ extern void
+ ft_mem_debug_panic( const char* fmt,
+ ... )
+ {
+ va_list ap;
+
+
+ printf( "FreeType.Debug: " );
+
+ va_start( ap, fmt );
+ vprintf( fmt, ap );
+ va_end( ap );
+
+ printf( "\n" );
+ exit( EXIT_FAILURE );
+ }
+
+
+ static FT_Pointer
+ ft_mem_table_alloc( FT_MemTable table,
+ FT_Long size )
+ {
+ FT_Memory memory = table->memory;
+ FT_Pointer block;
+
+
+ memory->user = table->memory_user;
+ block = table->alloc( memory, size );
+ memory->user = table;
+
+ return block;
+ }
+
+
+ static void
+ ft_mem_table_free( FT_MemTable table,
+ FT_Pointer block )
+ {
+ FT_Memory memory = table->memory;
+
+
+ memory->user = table->memory_user;
+ table->free( memory, block );
+ memory->user = table;
+ }
+
+
+ static void
+ ft_mem_table_resize( FT_MemTable table )
+ {
+ FT_ULong new_size;
+
+
+ new_size = ft_mem_closest_prime( table->nodes );
+ if ( new_size != table->size )
+ {
+ FT_MemNode* new_buckets;
+ FT_ULong i;
+
+
+ new_buckets = (FT_MemNode *)
+ ft_mem_table_alloc( table,
+ new_size * sizeof ( FT_MemNode ) );
+ if ( new_buckets == NULL )
+ return;
+
+ FT_ARRAY_ZERO( new_buckets, new_size );
+
+ for ( i = 0; i < table->size; i++ )
+ {
+ FT_MemNode node, next, *pnode;
+ FT_PtrDist hash;
+
+
+ node = table->buckets[i];
+ while ( node )
+ {
+ next = node->link;
+ hash = FT_MEM_VAL( node->address ) % new_size;
+ pnode = new_buckets + hash;
+
+ node->link = pnode[0];
+ pnode[0] = node;
+
+ node = next;
+ }
+ }
+
+ if ( table->buckets )
+ ft_mem_table_free( table, table->buckets );
+
+ table->buckets = new_buckets;
+ table->size = new_size;
+ }
+ }
+
+
+ static FT_MemTable
+ ft_mem_table_new( FT_Memory memory )
+ {
+ FT_MemTable table;
+
+
+ table = (FT_MemTable)memory->alloc( memory, sizeof ( *table ) );
+ if ( table == NULL )
+ goto Exit;
+
+ FT_ZERO( table );
+
+ table->size = FT_MEM_SIZE_MIN;
+ table->nodes = 0;
+
+ table->memory = memory;
+
+ table->memory_user = memory->user;
+
+ table->alloc = memory->alloc;
+ table->realloc = memory->realloc;
+ table->free = memory->free;
+
+ table->buckets = (FT_MemNode *)
+ memory->alloc( memory,
+ table->size * sizeof ( FT_MemNode ) );
+ if ( table->buckets )
+ FT_ARRAY_ZERO( table->buckets, table->size );
+ else
+ {
+ memory->free( memory, table );
+ table = NULL;
+ }
+
+ Exit:
+ return table;
+ }
+
+
+ static void
+ ft_mem_table_destroy( FT_MemTable table )
+ {
+ FT_ULong i;
+ FT_Long leak_count = 0;
+ FT_ULong leaks = 0;
+
+
+ FT_DumpMemory( table->memory );
+
+ /* remove all blocks from the table, revealing leaked ones */
+ for ( i = 0; i < table->size; i++ )
+ {
+ FT_MemNode *pnode = table->buckets + i, next, node = *pnode;
+
+
+ while ( node )
+ {
+ next = node->link;
+ node->link = 0;
+
+ if ( node->size > 0 )
+ {
+ printf(
+ "leaked memory block at address %p, size %8ld in (%s:%ld)\n",
+ node->address, node->size,
+ FT_FILENAME( node->source->file_name ),
+ node->source->line_no );
+
+ leak_count++;
+ leaks += node->size;
+
+ ft_mem_table_free( table, node->address );
+ }
+
+ node->address = NULL;
+ node->size = 0;
+
+ ft_mem_table_free( table, node );
+ node = next;
+ }
+ table->buckets[i] = 0;
+ }
+
+ ft_mem_table_free( table, table->buckets );
+ table->buckets = NULL;
+
+ table->size = 0;
+ table->nodes = 0;
+
+ /* remove all sources */
+ for ( i = 0; i < FT_MEM_SOURCE_BUCKETS; i++ )
+ {
+ FT_MemSource source, next;
+
+
+ for ( source = table->sources[i]; source != NULL; source = next )
+ {
+ next = source->link;
+ ft_mem_table_free( table, source );
+ }
+
+ table->sources[i] = NULL;
+ }
+
+ printf( "FreeType: total memory allocations = %ld\n",
+ table->alloc_total );
+ printf( "FreeType: maximum memory footprint = %ld\n",
+ table->alloc_max );
+
+ ft_mem_table_free( table, table );
+
+ if ( leak_count > 0 )
+ ft_mem_debug_panic(
+ "FreeType: %ld bytes of memory leaked in %ld blocks\n",
+ leaks, leak_count );
+
+ printf( "FreeType: no memory leaks detected\n" );
+ }
+
+
+ static FT_MemNode*
+ ft_mem_table_get_nodep( FT_MemTable table,
+ FT_Byte* address )
+ {
+ FT_PtrDist hash;
+ FT_MemNode *pnode, node;
+
+
+ hash = FT_MEM_VAL( address );
+ pnode = table->buckets + ( hash % table->size );
+
+ for (;;)
+ {
+ node = pnode[0];
+ if ( !node )
+ break;
+
+ if ( node->address == address )
+ break;
+
+ pnode = &node->link;
+ }
+ return pnode;
+ }
+
+
+ static FT_MemSource
+ ft_mem_table_get_source( FT_MemTable table )
+ {
+ FT_UInt32 hash;
+ FT_MemSource node, *pnode;
+
+
+ /* cast to FT_PtrDist first since void* can be larger */
+ /* than FT_UInt32 and GCC 4.1.1 emits a warning */
+ hash = (FT_UInt32)(FT_PtrDist)(void*)_ft_debug_file +
+ (FT_UInt32)( 5 * _ft_debug_lineno );
+ pnode = &table->sources[hash % FT_MEM_SOURCE_BUCKETS];
+
+ for ( ;; )
+ {
+ node = *pnode;
+ if ( node == NULL )
+ break;
+
+ if ( node->file_name == _ft_debug_file &&
+ node->line_no == _ft_debug_lineno )
+ goto Exit;
+
+ pnode = &node->link;
+ }
+
+ node = (FT_MemSource)ft_mem_table_alloc( table, sizeof ( *node ) );
+ if ( node == NULL )
+ ft_mem_debug_panic(
+ "not enough memory to perform memory debugging\n" );
+
+ node->file_name = _ft_debug_file;
+ node->line_no = _ft_debug_lineno;
+
+ node->cur_blocks = 0;
+ node->max_blocks = 0;
+ node->all_blocks = 0;
+
+ node->cur_size = 0;
+ node->max_size = 0;
+ node->all_size = 0;
+
+ node->cur_max = 0;
+
+ node->link = NULL;
+ node->hash = hash;
+ *pnode = node;
+
+ Exit:
+ return node;
+ }
+
+
+ static void
+ ft_mem_table_set( FT_MemTable table,
+ FT_Byte* address,
+ FT_ULong size,
+ FT_Long delta )
+ {
+ FT_MemNode *pnode, node;
+
+
+ if ( table )
+ {
+ FT_MemSource source;
+
+
+ pnode = ft_mem_table_get_nodep( table, address );
+ node = *pnode;
+ if ( node )
+ {
+ if ( node->size < 0 )
+ {
+ /* This block was already freed. Our memory is now completely */
+ /* corrupted! */
+ /* This can only happen in keep-alive mode. */
+ ft_mem_debug_panic(
+ "memory heap corrupted (allocating freed block)" );
+ }
+ else
+ {
+ /* This block was already allocated. This means that our memory */
+ /* is also corrupted! */
+ ft_mem_debug_panic(
+ "memory heap corrupted (re-allocating allocated block at"
+ " %p, of size %ld)\n"
+ "org=%s:%d new=%s:%d\n",
+ node->address, node->size,
+ FT_FILENAME( node->source->file_name ), node->source->line_no,
+ FT_FILENAME( _ft_debug_file ), _ft_debug_lineno );
+ }
+ }
+
+ /* we need to create a new node in this table */
+ node = (FT_MemNode)ft_mem_table_alloc( table, sizeof ( *node ) );
+ if ( node == NULL )
+ ft_mem_debug_panic( "not enough memory to run memory tests" );
+
+ node->address = address;
+ node->size = size;
+ node->source = source = ft_mem_table_get_source( table );
+
+ if ( delta == 0 )
+ {
+ /* this is an allocation */
+ source->all_blocks++;
+ source->cur_blocks++;
+ if ( source->cur_blocks > source->max_blocks )
+ source->max_blocks = source->cur_blocks;
+ }
+
+ if ( size > (FT_ULong)source->cur_max )
+ source->cur_max = size;
+
+ if ( delta != 0 )
+ {
+ /* we are growing or shrinking a reallocated block */
+ source->cur_size += delta;
+ table->alloc_current += delta;
+ }
+ else
+ {
+ /* we are allocating a new block */
+ source->cur_size += size;
+ table->alloc_current += size;
+ }
+
+ source->all_size += size;
+
+ if ( source->cur_size > source->max_size )
+ source->max_size = source->cur_size;
+
+ node->free_file_name = NULL;
+ node->free_line_no = 0;
+
+ node->link = pnode[0];
+
+ pnode[0] = node;
+ table->nodes++;
+
+ table->alloc_total += size;
+
+ if ( table->alloc_current > table->alloc_max )
+ table->alloc_max = table->alloc_current;
+
+ if ( table->nodes * 3 < table->size ||
+ table->size * 3 < table->nodes )
+ ft_mem_table_resize( table );
+ }
+ }
+
+
+ static void
+ ft_mem_table_remove( FT_MemTable table,
+ FT_Byte* address,
+ FT_Long delta )
+ {
+ if ( table )
+ {
+ FT_MemNode *pnode, node;
+
+
+ pnode = ft_mem_table_get_nodep( table, address );
+ node = *pnode;
+ if ( node )
+ {
+ FT_MemSource source;
+
+
+ if ( node->size < 0 )
+ ft_mem_debug_panic(
+ "freeing memory block at %p more than once at (%s:%ld)\n"
+ "block allocated at (%s:%ld) and released at (%s:%ld)",
+ address,
+ FT_FILENAME( _ft_debug_file ), _ft_debug_lineno,
+ FT_FILENAME( node->source->file_name ), node->source->line_no,
+ FT_FILENAME( node->free_file_name ), node->free_line_no );
+
+ /* scramble the node's content for additional safety */
+ FT_MEM_SET( address, 0xF3, node->size );
+
+ if ( delta == 0 )
+ {
+ source = node->source;
+
+ source->cur_blocks--;
+ source->cur_size -= node->size;
+
+ table->alloc_current -= node->size;
+ }
+
+ if ( table->keep_alive )
+ {
+ /* we simply invert the node's size to indicate that the node */
+ /* was freed. */
+ node->size = -node->size;
+ node->free_file_name = _ft_debug_file;
+ node->free_line_no = _ft_debug_lineno;
+ }
+ else
+ {
+ table->nodes--;
+
+ *pnode = node->link;
+
+ node->size = 0;
+ node->source = NULL;
+
+ ft_mem_table_free( table, node );
+
+ if ( table->nodes * 3 < table->size ||
+ table->size * 3 < table->nodes )
+ ft_mem_table_resize( table );
+ }
+ }
+ else
+ ft_mem_debug_panic(
+ "trying to free unknown block at %p in (%s:%ld)\n",
+ address,
+ FT_FILENAME( _ft_debug_file ), _ft_debug_lineno );
+ }
+ }
+
+
+ extern FT_Pointer
+ ft_mem_debug_alloc( FT_Memory memory,
+ FT_Long size )
+ {
+ FT_MemTable table = (FT_MemTable)memory->user;
+ FT_Byte* block;
+
+
+ if ( size <= 0 )
+ ft_mem_debug_panic( "negative block size allocation (%ld)", size );
+
+ /* return NULL if the maximum number of allocations was reached */
+ if ( table->bound_count &&
+ table->alloc_count >= table->alloc_count_max )
+ return NULL;
+
+ /* return NULL if this allocation would overflow the maximum heap size */
+ if ( table->bound_total &&
+ table->alloc_total_max - table->alloc_current > (FT_ULong)size )
+ return NULL;
+
+ block = (FT_Byte *)ft_mem_table_alloc( table, size );
+ if ( block )
+ {
+ ft_mem_table_set( table, block, (FT_ULong)size, 0 );
+
+ table->alloc_count++;
+ }
+
+ _ft_debug_file = "<unknown>";
+ _ft_debug_lineno = 0;
+
+ return (FT_Pointer)block;
+ }
+
+
+ extern void
+ ft_mem_debug_free( FT_Memory memory,
+ FT_Pointer block )
+ {
+ FT_MemTable table = (FT_MemTable)memory->user;
+
+
+ if ( block == NULL )
+ ft_mem_debug_panic( "trying to free NULL in (%s:%ld)",
+ FT_FILENAME( _ft_debug_file ),
+ _ft_debug_lineno );
+
+ ft_mem_table_remove( table, (FT_Byte*)block, 0 );
+
+ if ( !table->keep_alive )
+ ft_mem_table_free( table, block );
+
+ table->alloc_count--;
+
+ _ft_debug_file = "<unknown>";
+ _ft_debug_lineno = 0;
+ }
+
+
+ extern FT_Pointer
+ ft_mem_debug_realloc( FT_Memory memory,
+ FT_Long cur_size,
+ FT_Long new_size,
+ FT_Pointer block )
+ {
+ FT_MemTable table = (FT_MemTable)memory->user;
+ FT_MemNode node, *pnode;
+ FT_Pointer new_block;
+ FT_Long delta;
+
+ const char* file_name = FT_FILENAME( _ft_debug_file );
+ FT_Long line_no = _ft_debug_lineno;
+
+
+ /* unlikely, but possible */
+ if ( new_size == cur_size )
+ return block;
+
+ /* the following is valid according to ANSI C */
+#if 0
+ if ( block == NULL || cur_size == 0 )
+ ft_mem_debug_panic( "trying to reallocate NULL in (%s:%ld)",
+ file_name, line_no );
+#endif
+
+ /* while the following is allowed in ANSI C also, we abort since */
+ /* such case should be handled by FreeType. */
+ if ( new_size <= 0 )
+ ft_mem_debug_panic(
+ "trying to reallocate %p to size 0 (current is %ld) in (%s:%ld)",
+ block, cur_size, file_name, line_no );
+
+ /* check `cur_size' value */
+ pnode = ft_mem_table_get_nodep( table, (FT_Byte*)block );
+ node = *pnode;
+ if ( !node )
+ ft_mem_debug_panic(
+ "trying to reallocate unknown block at %p in (%s:%ld)",
+ block, file_name, line_no );
+
+ if ( node->size <= 0 )
+ ft_mem_debug_panic(
+ "trying to reallocate freed block at %p in (%s:%ld)",
+ block, file_name, line_no );
+
+ if ( node->size != cur_size )
+ ft_mem_debug_panic( "invalid ft_realloc request for %p. cur_size is "
+ "%ld instead of %ld in (%s:%ld)",
+ block, cur_size, node->size, file_name, line_no );
+
+ /* return NULL if the maximum number of allocations was reached */
+ if ( table->bound_count &&
+ table->alloc_count >= table->alloc_count_max )
+ return NULL;
+
+ delta = (FT_Long)( new_size - cur_size );
+
+ /* return NULL if this allocation would overflow the maximum heap size */
+ if ( delta > 0 &&
+ table->bound_total &&
+ table->alloc_current + (FT_ULong)delta > table->alloc_total_max )
+ return NULL;
+
+ new_block = (FT_Byte *)ft_mem_table_alloc( table, new_size );
+ if ( new_block == NULL )
+ return NULL;
+
+ ft_mem_table_set( table, (FT_Byte*)new_block, new_size, delta );
+
+ ft_memcpy( new_block, block, cur_size < new_size ? cur_size : new_size );
+
+ ft_mem_table_remove( table, (FT_Byte*)block, delta );
+
+ _ft_debug_file = "<unknown>";
+ _ft_debug_lineno = 0;
+
+ if ( !table->keep_alive )
+ ft_mem_table_free( table, block );
+
+ return new_block;
+ }
+
+
+ extern FT_Int
+ ft_mem_debug_init( FT_Memory memory )
+ {
+ FT_MemTable table;
+ FT_Int result = 0;
+
+
+ if (1)/* XYQ: always enable ( getenv( "FT2_DEBUG_MEMORY" ) ) */
+ {
+ table = ft_mem_table_new( memory );
+ if ( table )
+ {
+ const char* p;
+
+
+ memory->user = table;
+ memory->alloc = ft_mem_debug_alloc;
+ memory->realloc = ft_mem_debug_realloc;
+ memory->free = ft_mem_debug_free;
+
+ p = getenv( "FT2_ALLOC_TOTAL_MAX" );
+ if ( p != NULL )
+ {
+ FT_Long total_max = ft_atol( p );
+
+
+ if ( total_max > 0 )
+ {
+ table->bound_total = 1;
+ table->alloc_total_max = (FT_ULong)total_max;
+ }
+ }
+
+ p = getenv( "FT2_ALLOC_COUNT_MAX" );
+ if ( p != NULL )
+ {
+ FT_Long total_count = ft_atol( p );
+
+
+ if ( total_count > 0 )
+ {
+ table->bound_count = 1;
+ table->alloc_count_max = (FT_ULong)total_count;
+ }
+ }
+
+ p = getenv( "FT2_KEEP_ALIVE" );
+ if ( p != NULL )
+ {
+ FT_Long keep_alive = ft_atol( p );
+
+
+ if ( keep_alive > 0 )
+ table->keep_alive = 1;
+ }
+
+ result = 1;
+ }
+ }
+ return result;
+ }
+
+
+ extern void
+ ft_mem_debug_done( FT_Memory memory )
+ {
+ FT_MemTable table = (FT_MemTable)memory->user;
+
+
+ if ( table )
+ {
+ memory->free = table->free;
+ memory->realloc = table->realloc;
+ memory->alloc = table->alloc;
+
+ ft_mem_table_destroy( table );
+ memory->user = NULL;
+ }
+ }
+
+
+
+ static int
+ ft_mem_source_compare( const void* p1,
+ const void* p2 )
+ {
+ FT_MemSource s1 = *(FT_MemSource*)p1;
+ FT_MemSource s2 = *(FT_MemSource*)p2;
+
+
+ if ( s2->max_size > s1->max_size )
+ return 1;
+ else if ( s2->max_size < s1->max_size )
+ return -1;
+ else
+ return 0;
+ }
+
+
+ extern void
+ FT_DumpMemory( FT_Memory memory )
+ {
+ FT_MemTable table = (FT_MemTable)memory->user;
+
+
+ if ( table )
+ {
+ FT_MemSource* bucket = table->sources;
+ FT_MemSource* limit = bucket + FT_MEM_SOURCE_BUCKETS;
+ FT_MemSource* sources;
+ FT_UInt nn, count;
+ const char* fmt;
+
+
+ count = 0;
+ for ( ; bucket < limit; bucket++ )
+ {
+ FT_MemSource source = *bucket;
+
+
+ for ( ; source; source = source->link )
+ count++;
+ }
+
+ sources = (FT_MemSource*)ft_mem_table_alloc(
+ table, sizeof ( *sources ) * count );
+
+ count = 0;
+ for ( bucket = table->sources; bucket < limit; bucket++ )
+ {
+ FT_MemSource source = *bucket;
+
+
+ for ( ; source; source = source->link )
+ sources[count++] = source;
+ }
+
+ ft_qsort( sources, count, sizeof ( *sources ), ft_mem_source_compare );
+
+ printf( "FreeType Memory Dump: "
+ "current=%ld max=%ld total=%ld count=%ld\n",
+ table->alloc_current, table->alloc_max,
+ table->alloc_total, table->alloc_count );
+ printf( " block block sizes sizes sizes source\n" );
+ printf( " count high sum highsum max location\n" );
+ printf( "-------------------------------------------------\n" );
+
+ fmt = "%6ld %6ld %8ld %8ld %8ld %s:%d\n";
+
+ for ( nn = 0; nn < count; nn++ )
+ {
+ FT_MemSource source = sources[nn];
+
+
+ printf( fmt,
+ source->cur_blocks, source->max_blocks,
+ source->cur_size, source->max_size, source->cur_max,
+ FT_FILENAME( source->file_name ),
+ source->line_no );
+ }
+ printf( "------------------------------------------------\n" );
+
+ ft_mem_table_free( table, sources );
+ }
+ }
+
+#else /* !FT_DEBUG_MEMORY */
+
+ /* ANSI C doesn't like empty source files */
+ typedef int _debug_mem_dummy;
+
+#endif /* !FT_DEBUG_MEMORY */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftdebug.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftdebug.c
new file mode 100644
index 0000000000..4b98cf0881
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftdebug.c
@@ -0,0 +1,266 @@
+/***************************************************************************/
+/* */
+/* ftdebug.c */
+/* */
+/* Debugging and logging component (body). */
+/* */
+/* Copyright 1996-2001, 2002, 2004, 2008, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* This component contains various macros and functions used to ease the */
+ /* debugging of the FreeType engine. Its main purpose is in assertion */
+ /* checking, tracing, and error detection. */
+ /* */
+ /* There are now three debugging modes: */
+ /* */
+ /* - trace mode */
+ /* */
+ /* Error and trace messages are sent to the log file (which can be the */
+ /* standard error output). */
+ /* */
+ /* - error mode */
+ /* */
+ /* Only error messages are generated. */
+ /* */
+ /* - release mode: */
+ /* */
+ /* No error message is sent or generated. The code is free from any */
+ /* debugging parts. */
+ /* */
+ /*************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/freetype.h"
+#include "../../include/freetype/internal/ftdebug.h"
+
+
+#ifdef FT_DEBUG_LEVEL_ERROR
+
+ /* documentation is in ftdebug.h */
+
+ FT_BASE_DEF( void )
+ FT_Message( const char* fmt,
+ ... )
+ {
+ va_list ap;
+
+
+ va_start( ap, fmt );
+ vfprintf( stderr, fmt, ap );
+ va_end( ap );
+ }
+
+
+ /* documentation is in ftdebug.h */
+
+ FT_BASE_DEF( void )
+ FT_Panic( const char* fmt,
+ ... )
+ {
+ va_list ap;
+
+
+ va_start( ap, fmt );
+ vfprintf( stderr, fmt, ap );
+ va_end( ap );
+
+ exit( EXIT_FAILURE );
+ }
+
+
+ /* documentation is in ftdebug.h */
+
+ FT_BASE_DEF( int )
+ FT_Throw( FT_Error error,
+ int line,
+ const char* file )
+ {
+ FT_UNUSED( error );
+ FT_UNUSED( line );
+ FT_UNUSED( file );
+
+ return 0;
+ }
+
+#endif /* FT_DEBUG_LEVEL_ERROR */
+
+
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+
+ /* array of trace levels, initialized to 0 */
+ int ft_trace_levels[trace_count];
+
+
+ /* define array of trace toggle names */
+#define FT_TRACE_DEF( x ) #x ,
+
+ static const char* ft_trace_toggles[trace_count + 1] =
+ {
+#include "../../include/freetype/internal/fttrace.h"
+ NULL
+ };
+
+#undef FT_TRACE_DEF
+
+
+ /* documentation is in ftdebug.h */
+
+ FT_BASE_DEF( FT_Int )
+ FT_Trace_Get_Count( void )
+ {
+ return trace_count;
+ }
+
+
+ /* documentation is in ftdebug.h */
+
+ FT_BASE_DEF( const char * )
+ FT_Trace_Get_Name( FT_Int idx )
+ {
+ int max = FT_Trace_Get_Count();
+
+
+ if ( idx < max )
+ return ft_trace_toggles[idx];
+ else
+ return NULL;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* Initialize the tracing sub-system. This is done by retrieving the */
+ /* value of the `FT2_DEBUG' environment variable. It must be a list of */
+ /* toggles, separated by spaces, `;', or `,'. Example: */
+ /* */
+ /* export FT2_DEBUG="any:3 memory:7 stream:5" */
+ /* */
+ /* This requests that all levels be set to 3, except the trace level for */
+ /* the memory and stream components which are set to 7 and 5, */
+ /* respectively. */
+ /* */
+ /* See the file <include/freetype/internal/fttrace.h> for details of the */
+ /* available toggle names. */
+ /* */
+ /* The level must be between 0 and 7; 0 means quiet (except for serious */
+ /* runtime errors), and 7 means _very_ verbose. */
+ /* */
+ FT_BASE_DEF( void )
+ ft_debug_init( void )
+ {
+ const char* ft2_debug = getenv( "FT2_DEBUG" );
+
+
+ if ( ft2_debug )
+ {
+ const char* p = ft2_debug;
+ const char* q;
+
+
+ for ( ; *p; p++ )
+ {
+ /* skip leading whitespace and separators */
+ if ( *p == ' ' || *p == '\t' || *p == ',' || *p == ';' || *p == '=' )
+ continue;
+
+ /* read toggle name, followed by ':' */
+ q = p;
+ while ( *p && *p != ':' )
+ p++;
+
+ if ( !*p )
+ break;
+
+ if ( *p == ':' && p > q )
+ {
+ FT_Int n, i, len = (FT_Int)( p - q );
+ FT_Int level = -1, found = -1;
+
+
+ for ( n = 0; n < trace_count; n++ )
+ {
+ const char* toggle = ft_trace_toggles[n];
+
+
+ for ( i = 0; i < len; i++ )
+ {
+ if ( toggle[i] != q[i] )
+ break;
+ }
+
+ if ( i == len && toggle[i] == 0 )
+ {
+ found = n;
+ break;
+ }
+ }
+
+ /* read level */
+ p++;
+ if ( *p )
+ {
+ level = *p - '0';
+ if ( level < 0 || level > 7 )
+ level = -1;
+ }
+
+ if ( found >= 0 && level >= 0 )
+ {
+ if ( found == trace_any )
+ {
+ /* special case for `any' */
+ for ( n = 0; n < trace_count; n++ )
+ ft_trace_levels[n] = level;
+ }
+ else
+ ft_trace_levels[found] = level;
+ }
+ }
+ }
+ }
+ }
+
+
+#else /* !FT_DEBUG_LEVEL_TRACE */
+
+
+ FT_BASE_DEF( void )
+ ft_debug_init( void )
+ {
+ /* nothing */
+ }
+
+
+ FT_BASE_DEF( FT_Int )
+ FT_Trace_Get_Count( void )
+ {
+ return 0;
+ }
+
+
+ FT_BASE_DEF( const char * )
+ FT_Trace_Get_Name( FT_Int idx )
+ {
+ FT_UNUSED( idx );
+
+ return NULL;
+ }
+
+
+#endif /* !FT_DEBUG_LEVEL_TRACE */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftfstype.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftfstype.c
new file mode 100644
index 0000000000..948263a64f
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftfstype.c
@@ -0,0 +1,62 @@
+/***************************************************************************/
+/* */
+/* ftfstype.c */
+/* */
+/* FreeType utility file to access FSType data (body). */
+/* */
+/* Copyright 2008, 2009 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/t1tables.h"
+#include "../../include/freetype/tttables.h"
+#include "../../include/freetype/internal/ftserv.h"
+#include "../../include/freetype/internal/services/svpsinfo.h"
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_UShort )
+ FT_Get_FSType_Flags( FT_Face face )
+ {
+ TT_OS2* os2;
+
+
+ /* first, try to get the fs_type directly from the font */
+ if ( face )
+ {
+ FT_Service_PsInfo service = NULL;
+
+
+ FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO );
+
+ if ( service && service->ps_get_font_extra )
+ {
+ PS_FontExtraRec extra;
+
+
+ if ( !service->ps_get_font_extra( face, &extra ) &&
+ extra.fs_type != 0 )
+ return extra.fs_type;
+ }
+ }
+
+ /* look at FSType before fsType for Type42 */
+
+ if ( ( os2 = (TT_OS2*)FT_Get_Sfnt_Table( face, ft_sfnt_os2 ) ) != NULL &&
+ os2->version != 0xFFFFU )
+ return os2->fsType;
+
+ return 0;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftgasp.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftgasp.c
new file mode 100644
index 0000000000..3187d96a11
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftgasp.c
@@ -0,0 +1,61 @@
+/***************************************************************************/
+/* */
+/* ftgasp.c */
+/* */
+/* Access of TrueType's `gasp' table (body). */
+/* */
+/* Copyright 2007 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/ftgasp.h"
+#include "../../include/freetype/internal/tttypes.h"
+
+
+ FT_EXPORT_DEF( FT_Int )
+ FT_Get_Gasp( FT_Face face,
+ FT_UInt ppem )
+ {
+ FT_Int result = FT_GASP_NO_TABLE;
+
+
+ if ( face && FT_IS_SFNT( face ) )
+ {
+ TT_Face ttface = (TT_Face)face;
+
+
+ if ( ttface->gasp.numRanges > 0 )
+ {
+ TT_GaspRange range = ttface->gasp.gaspRanges;
+ TT_GaspRange range_end = range + ttface->gasp.numRanges;
+
+
+ while ( ppem > range->maxPPEM )
+ {
+ range++;
+ if ( range >= range_end )
+ goto Exit;
+ }
+
+ result = range->gaspFlag;
+
+ /* ensure that we don't have spurious bits */
+ if ( ttface->gasp.version == 0 )
+ result &= 3;
+ }
+ }
+ Exit:
+ return result;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftgloadr.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftgloadr.c
new file mode 100644
index 0000000000..a0dd86c2ad
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftgloadr.c
@@ -0,0 +1,405 @@
+/***************************************************************************/
+/* */
+/* ftgloadr.c */
+/* */
+/* The FreeType glyph loader (body). */
+/* */
+/* Copyright 2002-2006, 2010, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftgloadr.h"
+#include "../../include/freetype/internal/ftmemory.h"
+#include "../../include/freetype/internal/ftobjs.h"
+
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_gloader
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** *****/
+ /***** G L Y P H L O A D E R *****/
+ /***** *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* The glyph loader is a simple object which is used to load a set of */
+ /* glyphs easily. It is critical for the correct loading of composites. */
+ /* */
+ /* Ideally, one can see it as a stack of abstract `glyph' objects. */
+ /* */
+ /* loader.base Is really the bottom of the stack. It describes a */
+ /* single glyph image made of the juxtaposition of */
+ /* several glyphs (those `in the stack'). */
+ /* */
+ /* loader.current Describes the top of the stack, on which a new */
+ /* glyph can be loaded. */
+ /* */
+ /* Rewind Clears the stack. */
+ /* Prepare Set up `loader.current' for addition of a new glyph */
+ /* image. */
+ /* Add Add the `current' glyph image to the `base' one, */
+ /* and prepare for another one. */
+ /* */
+ /* The glyph loader is now a base object. Each driver used to */
+ /* re-implement it in one way or the other, which wasted code and */
+ /* energy. */
+ /* */
+ /*************************************************************************/
+
+
+ /* create a new glyph loader */
+ FT_BASE_DEF( FT_Error )
+ FT_GlyphLoader_New( FT_Memory memory,
+ FT_GlyphLoader *aloader )
+ {
+ FT_GlyphLoader loader = NULL;
+ FT_Error error;
+
+
+ if ( !FT_NEW( loader ) )
+ {
+ loader->memory = memory;
+ *aloader = loader;
+ }
+ return error;
+ }
+
+
+ /* rewind the glyph loader - reset counters to 0 */
+ FT_BASE_DEF( void )
+ FT_GlyphLoader_Rewind( FT_GlyphLoader loader )
+ {
+ FT_GlyphLoad base = &loader->base;
+ FT_GlyphLoad current = &loader->current;
+
+
+ base->outline.n_points = 0;
+ base->outline.n_contours = 0;
+ base->num_subglyphs = 0;
+
+ *current = *base;
+ }
+
+
+ /* reset the glyph loader, frees all allocated tables */
+ /* and starts from zero */
+ FT_BASE_DEF( void )
+ FT_GlyphLoader_Reset( FT_GlyphLoader loader )
+ {
+ FT_Memory memory = loader->memory;
+
+
+ FT_FREE( loader->base.outline.points );
+ FT_FREE( loader->base.outline.tags );
+ FT_FREE( loader->base.outline.contours );
+ FT_FREE( loader->base.extra_points );
+ FT_FREE( loader->base.subglyphs );
+
+ loader->base.extra_points2 = NULL;
+
+ loader->max_points = 0;
+ loader->max_contours = 0;
+ loader->max_subglyphs = 0;
+
+ FT_GlyphLoader_Rewind( loader );
+ }
+
+
+ /* delete a glyph loader */
+ FT_BASE_DEF( void )
+ FT_GlyphLoader_Done( FT_GlyphLoader loader )
+ {
+ if ( loader )
+ {
+ FT_Memory memory = loader->memory;
+
+
+ FT_GlyphLoader_Reset( loader );
+ FT_FREE( loader );
+ }
+ }
+
+
+ /* re-adjust the `current' outline fields */
+ static void
+ FT_GlyphLoader_Adjust_Points( FT_GlyphLoader loader )
+ {
+ FT_Outline* base = &loader->base.outline;
+ FT_Outline* current = &loader->current.outline;
+
+
+ current->points = base->points + base->n_points;
+ current->tags = base->tags + base->n_points;
+ current->contours = base->contours + base->n_contours;
+
+ /* handle extra points table - if any */
+ if ( loader->use_extra )
+ {
+ loader->current.extra_points = loader->base.extra_points +
+ base->n_points;
+
+ loader->current.extra_points2 = loader->base.extra_points2 +
+ base->n_points;
+ }
+ }
+
+
+ FT_BASE_DEF( FT_Error )
+ FT_GlyphLoader_CreateExtra( FT_GlyphLoader loader )
+ {
+ FT_Error error;
+ FT_Memory memory = loader->memory;
+
+
+ if ( !FT_NEW_ARRAY( loader->base.extra_points, 2 * loader->max_points ) )
+ {
+ loader->use_extra = 1;
+ loader->base.extra_points2 = loader->base.extra_points +
+ loader->max_points;
+
+ FT_GlyphLoader_Adjust_Points( loader );
+ }
+ return error;
+ }
+
+
+ /* re-adjust the `current' subglyphs field */
+ static void
+ FT_GlyphLoader_Adjust_Subglyphs( FT_GlyphLoader loader )
+ {
+ FT_GlyphLoad base = &loader->base;
+ FT_GlyphLoad current = &loader->current;
+
+
+ current->subglyphs = base->subglyphs + base->num_subglyphs;
+ }
+
+
+ /* Ensure that we can add `n_points' and `n_contours' to our glyph. */
+ /* This function reallocates its outline tables if necessary. Note that */
+ /* it DOESN'T change the number of points within the loader! */
+ /* */
+ FT_BASE_DEF( FT_Error )
+ FT_GlyphLoader_CheckPoints( FT_GlyphLoader loader,
+ FT_UInt n_points,
+ FT_UInt n_contours )
+ {
+ FT_Memory memory = loader->memory;
+ FT_Error error = FT_Err_Ok;
+ FT_Outline* base = &loader->base.outline;
+ FT_Outline* current = &loader->current.outline;
+ FT_Bool adjust = 0;
+
+ FT_UInt new_max, old_max;
+
+
+ /* check points & tags */
+ new_max = base->n_points + current->n_points + n_points;
+ old_max = loader->max_points;
+
+ if ( new_max > old_max )
+ {
+ new_max = FT_PAD_CEIL( new_max, 8 );
+
+ if ( new_max > FT_OUTLINE_POINTS_MAX )
+ return FT_THROW( Array_Too_Large );
+
+ if ( FT_RENEW_ARRAY( base->points, old_max, new_max ) ||
+ FT_RENEW_ARRAY( base->tags, old_max, new_max ) )
+ goto Exit;
+
+ if ( loader->use_extra )
+ {
+ if ( FT_RENEW_ARRAY( loader->base.extra_points,
+ old_max * 2, new_max * 2 ) )
+ goto Exit;
+
+ FT_ARRAY_MOVE( loader->base.extra_points + new_max,
+ loader->base.extra_points + old_max,
+ old_max );
+
+ loader->base.extra_points2 = loader->base.extra_points + new_max;
+ }
+
+ adjust = 1;
+ loader->max_points = new_max;
+ }
+
+ /* check contours */
+ old_max = loader->max_contours;
+ new_max = base->n_contours + current->n_contours +
+ n_contours;
+ if ( new_max > old_max )
+ {
+ new_max = FT_PAD_CEIL( new_max, 4 );
+
+ if ( new_max > FT_OUTLINE_CONTOURS_MAX )
+ return FT_THROW( Array_Too_Large );
+
+ if ( FT_RENEW_ARRAY( base->contours, old_max, new_max ) )
+ goto Exit;
+
+ adjust = 1;
+ loader->max_contours = new_max;
+ }
+
+ if ( adjust )
+ FT_GlyphLoader_Adjust_Points( loader );
+
+ Exit:
+ if ( error )
+ FT_GlyphLoader_Reset( loader );
+
+ return error;
+ }
+
+
+ /* Ensure that we can add `n_subglyphs' to our glyph. this function */
+ /* reallocates its subglyphs table if necessary. Note that it DOES */
+ /* NOT change the number of subglyphs within the loader! */
+ /* */
+ FT_BASE_DEF( FT_Error )
+ FT_GlyphLoader_CheckSubGlyphs( FT_GlyphLoader loader,
+ FT_UInt n_subs )
+ {
+ FT_Memory memory = loader->memory;
+ FT_Error error = FT_Err_Ok;
+ FT_UInt new_max, old_max;
+
+ FT_GlyphLoad base = &loader->base;
+ FT_GlyphLoad current = &loader->current;
+
+
+ new_max = base->num_subglyphs + current->num_subglyphs + n_subs;
+ old_max = loader->max_subglyphs;
+ if ( new_max > old_max )
+ {
+ new_max = FT_PAD_CEIL( new_max, 2 );
+ if ( FT_RENEW_ARRAY( base->subglyphs, old_max, new_max ) )
+ goto Exit;
+
+ loader->max_subglyphs = new_max;
+
+ FT_GlyphLoader_Adjust_Subglyphs( loader );
+ }
+
+ Exit:
+ return error;
+ }
+
+
+ /* prepare loader for the addition of a new glyph on top of the base one */
+ FT_BASE_DEF( void )
+ FT_GlyphLoader_Prepare( FT_GlyphLoader loader )
+ {
+ FT_GlyphLoad current = &loader->current;
+
+
+ current->outline.n_points = 0;
+ current->outline.n_contours = 0;
+ current->num_subglyphs = 0;
+
+ FT_GlyphLoader_Adjust_Points ( loader );
+ FT_GlyphLoader_Adjust_Subglyphs( loader );
+ }
+
+
+ /* add current glyph to the base image -- and prepare for another */
+ FT_BASE_DEF( void )
+ FT_GlyphLoader_Add( FT_GlyphLoader loader )
+ {
+ FT_GlyphLoad base;
+ FT_GlyphLoad current;
+
+ FT_UInt n_curr_contours;
+ FT_UInt n_base_points;
+ FT_UInt n;
+
+
+ if ( !loader )
+ return;
+
+ base = &loader->base;
+ current = &loader->current;
+
+ n_curr_contours = current->outline.n_contours;
+ n_base_points = base->outline.n_points;
+
+ base->outline.n_points =
+ (short)( base->outline.n_points + current->outline.n_points );
+ base->outline.n_contours =
+ (short)( base->outline.n_contours + current->outline.n_contours );
+
+ base->num_subglyphs += current->num_subglyphs;
+
+ /* adjust contours count in newest outline */
+ for ( n = 0; n < n_curr_contours; n++ )
+ current->outline.contours[n] =
+ (short)( current->outline.contours[n] + n_base_points );
+
+ /* prepare for another new glyph image */
+ FT_GlyphLoader_Prepare( loader );
+ }
+
+
+ FT_BASE_DEF( FT_Error )
+ FT_GlyphLoader_CopyPoints( FT_GlyphLoader target,
+ FT_GlyphLoader source )
+ {
+ FT_Error error;
+ FT_UInt num_points = source->base.outline.n_points;
+ FT_UInt num_contours = source->base.outline.n_contours;
+
+
+ error = FT_GlyphLoader_CheckPoints( target, num_points, num_contours );
+ if ( !error )
+ {
+ FT_Outline* out = &target->base.outline;
+ FT_Outline* in = &source->base.outline;
+
+
+ FT_ARRAY_COPY( out->points, in->points,
+ num_points );
+ FT_ARRAY_COPY( out->tags, in->tags,
+ num_points );
+ FT_ARRAY_COPY( out->contours, in->contours,
+ num_contours );
+
+ /* do we need to copy the extra points? */
+ if ( target->use_extra && source->use_extra )
+ {
+ FT_ARRAY_COPY( target->base.extra_points, source->base.extra_points,
+ num_points );
+ FT_ARRAY_COPY( target->base.extra_points2, source->base.extra_points2,
+ num_points );
+ }
+
+ out->n_points = (short)num_points;
+ out->n_contours = (short)num_contours;
+
+ FT_GlyphLoader_Adjust_Points( target );
+ }
+
+ return error;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftgxval.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftgxval.c
new file mode 100644
index 0000000000..3b5884ec92
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftgxval.c
@@ -0,0 +1,142 @@
+/***************************************************************************/
+/* */
+/* ftgxval.c */
+/* */
+/* FreeType API for validating TrueTyepGX/AAT tables (body). */
+/* */
+/* Copyright 2004-2006, 2010, 2013 by */
+/* Masatake YAMATO, Redhat K.K, */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+/***************************************************************************/
+/* */
+/* gxvalid is derived from both gxlayout module and otvalid module. */
+/* Development of gxlayout is supported by the Information-technology */
+/* Promotion Agency(IPA), Japan. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/services/svgxval.h"
+
+
+ /* documentation is in ftgxval.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_TrueTypeGX_Validate( FT_Face face,
+ FT_UInt validation_flags,
+ FT_Bytes tables[FT_VALIDATE_GX_LENGTH],
+ FT_UInt table_length )
+ {
+ FT_Service_GXvalidate service;
+ FT_Error error;
+
+
+ if ( !face )
+ {
+ error = FT_THROW( Invalid_Face_Handle );
+ goto Exit;
+ }
+
+ if ( tables == NULL )
+ {
+ error = FT_THROW( Invalid_Argument );
+ goto Exit;
+ }
+
+ FT_FACE_FIND_GLOBAL_SERVICE( face, service, GX_VALIDATE );
+
+ if ( service )
+ error = service->validate( face,
+ validation_flags,
+ tables,
+ table_length );
+ else
+ error = FT_THROW( Unimplemented_Feature );
+
+ Exit:
+ return error;
+ }
+
+
+ FT_EXPORT_DEF( void )
+ FT_TrueTypeGX_Free( FT_Face face,
+ FT_Bytes table )
+ {
+ FT_Memory memory;
+
+
+ if ( !face )
+ return;
+
+ memory = FT_FACE_MEMORY( face );
+
+ FT_FREE( table );
+ }
+
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_ClassicKern_Validate( FT_Face face,
+ FT_UInt validation_flags,
+ FT_Bytes *ckern_table )
+ {
+ FT_Service_CKERNvalidate service;
+ FT_Error error;
+
+
+ if ( !face )
+ {
+ error = FT_THROW( Invalid_Face_Handle );
+ goto Exit;
+ }
+
+ if ( ckern_table == NULL )
+ {
+ error = FT_THROW( Invalid_Argument );
+ goto Exit;
+ }
+
+ FT_FACE_FIND_GLOBAL_SERVICE( face, service, CLASSICKERN_VALIDATE );
+
+ if ( service )
+ error = service->validate( face,
+ validation_flags,
+ ckern_table );
+ else
+ error = FT_THROW( Unimplemented_Feature );
+
+ Exit:
+ return error;
+ }
+
+
+ FT_EXPORT_DEF( void )
+ FT_ClassicKern_Free( FT_Face face,
+ FT_Bytes table )
+ {
+ FT_Memory memory;
+
+
+ if ( !face )
+ return;
+
+ memory = FT_FACE_MEMORY( face );
+
+
+ FT_FREE( table );
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftmac.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftmac.c
new file mode 100644
index 0000000000..76361d92cd
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftmac.c
@@ -0,0 +1,1061 @@
+/***************************************************************************/
+/* */
+/* ftmac.c */
+/* */
+/* Mac FOND support. Written by just@letterror.com. */
+/* Heavily modified by mpsuzuki, George Williams, and Sean McBride. */
+/* */
+/* This file is for Mac OS X only; see builds/mac/ftoldmac.c for */
+/* classic platforms built by MPW. */
+/* */
+/* Copyright 1996-2009, 2013 by */
+/* Just van Rossum, David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*
+ Notes
+
+ Mac suitcase files can (and often do!) contain multiple fonts. To
+ support this I use the face_index argument of FT_(Open|New)_Face()
+ functions, and pretend the suitcase file is a collection.
+
+ Warning: fbit and NFNT bitmap resources are not supported yet. In old
+ sfnt fonts, bitmap glyph data for each size is stored in each `NFNT'
+ resources instead of the `bdat' table in the sfnt resource. Therefore,
+ face->num_fixed_sizes is set to 0, because bitmap data in `NFNT'
+ resource is unavailable at present.
+
+ The Mac FOND support works roughly like this:
+
+ - Check whether the offered stream points to a Mac suitcase file. This
+ is done by checking the file type: it has to be 'FFIL' or 'tfil'. The
+ stream that gets passed to our init_face() routine is a stdio stream,
+ which isn't usable for us, since the FOND resources live in the
+ resource fork. So we just grab the stream->pathname field.
+
+ - Read the FOND resource into memory, then check whether there is a
+ TrueType font and/or(!) a Type 1 font available.
+
+ - If there is a Type 1 font available (as a separate `LWFN' file), read
+ its data into memory, massage it slightly so it becomes PFB data, wrap
+ it into a memory stream, load the Type 1 driver and delegate the rest
+ of the work to it by calling FT_Open_Face(). (XXX TODO: after this
+ has been done, the kerning data from the FOND resource should be
+ appended to the face: On the Mac there are usually no AFM files
+ available. However, this is tricky since we need to map Mac char
+ codes to ps glyph names to glyph ID's...)
+
+ - If there is a TrueType font (an `sfnt' resource), read it into memory,
+ wrap it into a memory stream, load the TrueType driver and delegate
+ the rest of the work to it, by calling FT_Open_Face().
+
+ - Some suitcase fonts (notably Onyx) might point the `LWFN' file to
+ itself, even though it doesn't contains `POST' resources. To handle
+ this special case without opening the file an extra time, we just
+ ignore errors from the `LWFN' and fallback to the `sfnt' if both are
+ available.
+ */
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/freetype.h"
+#include "../../include/freetype/tttags.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "ftbase.h"
+
+ /* This is for Mac OS X. Without redefinition, OS_INLINE */
+ /* expands to `static inline' which doesn't survive the */
+ /* -ansi compilation flag of GCC. */
+#if !HAVE_ANSI_OS_INLINE
+#undef OS_INLINE
+#define OS_INLINE static __inline__
+#endif
+
+ /* `configure' checks the availability of `ResourceIndex' strictly */
+ /* and sets HAVE_TYPE_RESOURCE_INDEX 1 or 0 always. If it is */
+ /* not set (e.g., a build without `configure'), the availability */
+ /* is guessed from the SDK version. */
+#ifndef HAVE_TYPE_RESOURCE_INDEX
+#if !defined( MAC_OS_X_VERSION_10_5 ) || \
+ ( MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_5 )
+#define HAVE_TYPE_RESOURCE_INDEX 0
+#else
+#define HAVE_TYPE_RESOURCE_INDEX 1
+#endif
+#endif /* !HAVE_TYPE_RESOURCE_INDEX */
+
+#if ( HAVE_TYPE_RESOURCE_INDEX == 0 )
+ typedef short ResourceIndex;
+#endif
+
+#include <CoreServices/CoreServices.h>
+#include <ApplicationServices/ApplicationServices.h>
+#include <sys/syslimits.h> /* PATH_MAX */
+
+ /* Don't want warnings about our own use of deprecated functions. */
+#define FT_DEPRECATED_ATTRIBUTE
+
+#include "../../include/freetype/ftmac.h"
+
+#ifndef kATSOptionFlagsUnRestrictedScope /* since Mac OS X 10.1 */
+#define kATSOptionFlagsUnRestrictedScope kATSOptionFlagsDefault
+#endif
+
+
+ /* Set PREFER_LWFN to 1 if LWFN (Type 1) is preferred over
+ TrueType in case *both* are available (this is not common,
+ but it *is* possible). */
+#ifndef PREFER_LWFN
+#define PREFER_LWFN 1
+#endif
+
+
+#ifdef FT_MACINTOSH
+
+ /* This function is deprecated because FSSpec is deprecated in Mac OS X */
+ FT_EXPORT_DEF( FT_Error )
+ FT_GetFile_From_Mac_Name( const char* fontName,
+ FSSpec* pathSpec,
+ FT_Long* face_index )
+ {
+ FT_UNUSED( fontName );
+ FT_UNUSED( pathSpec );
+ FT_UNUSED( face_index );
+
+ return FT_THROW( Unimplemented_Feature );
+ }
+
+
+ /* Private function. */
+ /* The FSSpec type has been discouraged for a long time, */
+ /* unfortunately an FSRef replacement API for */
+ /* ATSFontGetFileSpecification() is only available in */
+ /* Mac OS X 10.5 and later. */
+ static OSStatus
+ FT_ATSFontGetFileReference( ATSFontRef ats_font_id,
+ FSRef* ats_font_ref )
+ {
+#if defined( MAC_OS_X_VERSION_10_5 ) && \
+ ( MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 )
+
+ OSStatus err;
+
+ err = ATSFontGetFileReference( ats_font_id, ats_font_ref );
+
+ return err;
+#elif __LP64__ /* No 64bit Carbon API on legacy platforms */
+ FT_UNUSED( ats_font_id );
+ FT_UNUSED( ats_font_ref );
+
+
+ return fnfErr;
+#else /* 32bit Carbon API on legacy platforms */
+ OSStatus err;
+ FSSpec spec;
+
+
+ err = ATSFontGetFileSpecification( ats_font_id, &spec );
+ if ( noErr == err )
+ err = FSpMakeFSRef( &spec, ats_font_ref );
+
+ return err;
+#endif
+ }
+
+
+ static FT_Error
+ FT_GetFileRef_From_Mac_ATS_Name( const char* fontName,
+ FSRef* ats_font_ref,
+ FT_Long* face_index )
+ {
+ CFStringRef cf_fontName;
+ ATSFontRef ats_font_id;
+
+
+ *face_index = 0;
+
+ cf_fontName = CFStringCreateWithCString( NULL, fontName,
+ kCFStringEncodingMacRoman );
+ ats_font_id = ATSFontFindFromName( cf_fontName,
+ kATSOptionFlagsUnRestrictedScope );
+ CFRelease( cf_fontName );
+
+ if ( ats_font_id == 0 || ats_font_id == 0xFFFFFFFFUL )
+ return FT_THROW( Unknown_File_Format );
+
+ if ( noErr != FT_ATSFontGetFileReference( ats_font_id, ats_font_ref ) )
+ return FT_THROW( Unknown_File_Format );
+
+ /* face_index calculation by searching preceding fontIDs */
+ /* with same FSRef */
+ {
+ ATSFontRef id2 = ats_font_id - 1;
+ FSRef ref2;
+
+
+ while ( id2 > 0 )
+ {
+ if ( noErr != FT_ATSFontGetFileReference( id2, &ref2 ) )
+ break;
+ if ( noErr != FSCompareFSRefs( ats_font_ref, &ref2 ) )
+ break;
+
+ id2 --;
+ }
+ *face_index = ats_font_id - ( id2 + 1 );
+ }
+
+ return FT_Err_Ok;
+ }
+
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_GetFilePath_From_Mac_ATS_Name( const char* fontName,
+ UInt8* path,
+ UInt32 maxPathSize,
+ FT_Long* face_index )
+ {
+ FSRef ref;
+ FT_Error err;
+
+
+ err = FT_GetFileRef_From_Mac_ATS_Name( fontName, &ref, face_index );
+ if ( err )
+ return err;
+
+ if ( noErr != FSRefMakePath( &ref, path, maxPathSize ) )
+ return FT_THROW( Unknown_File_Format );
+
+ return FT_Err_Ok;
+ }
+
+
+ /* This function is deprecated because FSSpec is deprecated in Mac OS X */
+ FT_EXPORT_DEF( FT_Error )
+ FT_GetFile_From_Mac_ATS_Name( const char* fontName,
+ FSSpec* pathSpec,
+ FT_Long* face_index )
+ {
+#if ( __LP64__ ) || ( defined( MAC_OS_X_VERSION_10_5 ) && \
+ ( MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 ) )
+ FT_UNUSED( fontName );
+ FT_UNUSED( pathSpec );
+ FT_UNUSED( face_index );
+
+ return FT_THROW( Unimplemented_Feature );
+#else
+ FSRef ref;
+ FT_Error err;
+
+
+ err = FT_GetFileRef_From_Mac_ATS_Name( fontName, &ref, face_index );
+ if ( err )
+ return err;
+
+ if ( noErr != FSGetCatalogInfo( &ref, kFSCatInfoNone, NULL, NULL,
+ pathSpec, NULL ) )
+ return FT_THROW( Unknown_File_Format );
+
+ return FT_Err_Ok;
+#endif
+ }
+
+
+ static OSErr
+ FT_FSPathMakeRes( const UInt8* pathname,
+ ResFileRefNum* res )
+ {
+ OSErr err;
+ FSRef ref;
+
+
+ if ( noErr != FSPathMakeRef( pathname, &ref, FALSE ) )
+ return FT_THROW( Cannot_Open_Resource );
+
+ /* at present, no support for dfont format */
+ err = FSOpenResourceFile( &ref, 0, NULL, fsRdPerm, res );
+ if ( noErr == err )
+ return err;
+
+ /* fallback to original resource-fork font */
+ *res = FSOpenResFile( &ref, fsRdPerm );
+ err = ResError();
+
+ return err;
+ }
+
+
+ /* Return the file type for given pathname */
+ static OSType
+ get_file_type_from_path( const UInt8* pathname )
+ {
+ FSRef ref;
+ FSCatalogInfo info;
+
+
+ if ( noErr != FSPathMakeRef( pathname, &ref, FALSE ) )
+ return ( OSType ) 0;
+
+ if ( noErr != FSGetCatalogInfo( &ref, kFSCatInfoFinderInfo, &info,
+ NULL, NULL, NULL ) )
+ return ( OSType ) 0;
+
+ return ((FInfo *)(info.finderInfo))->fdType;
+ }
+
+
+ /* Given a PostScript font name, create the Macintosh LWFN file name. */
+ static void
+ create_lwfn_name( char* ps_name,
+ Str255 lwfn_file_name )
+ {
+ int max = 5, count = 0;
+ FT_Byte* p = lwfn_file_name;
+ FT_Byte* q = (FT_Byte*)ps_name;
+
+
+ lwfn_file_name[0] = 0;
+
+ while ( *q )
+ {
+ if ( ft_isupper( *q ) )
+ {
+ if ( count )
+ max = 3;
+ count = 0;
+ }
+ if ( count < max && ( ft_isalnum( *q ) || *q == '_' ) )
+ {
+ *++p = *q;
+ lwfn_file_name[0]++;
+ count++;
+ }
+ q++;
+ }
+ }
+
+
+ static short
+ count_faces_sfnt( char* fond_data )
+ {
+ /* The count is 1 greater than the value in the FOND. */
+ /* Isn't that cute? :-) */
+
+ return EndianS16_BtoN( *( (short*)( fond_data +
+ sizeof ( FamRec ) ) ) ) + 1;
+ }
+
+
+ static short
+ count_faces_scalable( char* fond_data )
+ {
+ AsscEntry* assoc;
+ short i, face, face_all;
+
+
+ face_all = EndianS16_BtoN( *( (short *)( fond_data +
+ sizeof ( FamRec ) ) ) ) + 1;
+ assoc = (AsscEntry*)( fond_data + sizeof ( FamRec ) + 2 );
+ face = 0;
+
+ for ( i = 0; i < face_all; i++ )
+ {
+ if ( 0 == EndianS16_BtoN( assoc[i].fontSize ) )
+ face++;
+ }
+ return face;
+ }
+
+
+ /* Look inside the FOND data, answer whether there should be an SFNT
+ resource, and answer the name of a possible LWFN Type 1 file.
+
+ Thanks to Paul Miller (paulm@profoundeffects.com) for the fix
+ to load a face OTHER than the first one in the FOND!
+ */
+
+
+ static void
+ parse_fond( char* fond_data,
+ short* have_sfnt,
+ ResID* sfnt_id,
+ Str255 lwfn_file_name,
+ short face_index )
+ {
+ AsscEntry* assoc;
+ AsscEntry* base_assoc;
+ FamRec* fond;
+
+
+ *sfnt_id = 0;
+ *have_sfnt = 0;
+ lwfn_file_name[0] = 0;
+
+ fond = (FamRec*)fond_data;
+ assoc = (AsscEntry*)( fond_data + sizeof ( FamRec ) + 2 );
+ base_assoc = assoc;
+
+ /* the maximum faces in a FOND is 48, size of StyleTable.indexes[] */
+ if ( 47 < face_index )
+ return;
+
+ /* Let's do a little range checking before we get too excited here */
+ if ( face_index < count_faces_sfnt( fond_data ) )
+ {
+ assoc += face_index; /* add on the face_index! */
+
+ /* if the face at this index is not scalable,
+ fall back to the first one (old behavior) */
+ if ( EndianS16_BtoN( assoc->fontSize ) == 0 )
+ {
+ *have_sfnt = 1;
+ *sfnt_id = EndianS16_BtoN( assoc->fontID );
+ }
+ else if ( base_assoc->fontSize == 0 )
+ {
+ *have_sfnt = 1;
+ *sfnt_id = EndianS16_BtoN( base_assoc->fontID );
+ }
+ }
+
+ if ( EndianS32_BtoN( fond->ffStylOff ) )
+ {
+ unsigned char* p = (unsigned char*)fond_data;
+ StyleTable* style;
+ unsigned short string_count;
+ char ps_name[256];
+ unsigned char* names[64];
+ int i;
+
+
+ p += EndianS32_BtoN( fond->ffStylOff );
+ style = (StyleTable*)p;
+ p += sizeof ( StyleTable );
+ string_count = EndianS16_BtoN( *(short*)(p) );
+ p += sizeof ( short );
+
+ for ( i = 0; i < string_count && i < 64; i++ )
+ {
+ names[i] = p;
+ p += names[i][0];
+ p++;
+ }
+
+ {
+ size_t ps_name_len = (size_t)names[0][0];
+
+
+ if ( ps_name_len != 0 )
+ {
+ ft_memcpy(ps_name, names[0] + 1, ps_name_len);
+ ps_name[ps_name_len] = 0;
+ }
+ if ( style->indexes[face_index] > 1 &&
+ style->indexes[face_index] <= FT_MIN( string_count, 64 ) )
+ {
+ unsigned char* suffixes = names[style->indexes[face_index] - 1];
+
+
+ for ( i = 1; i <= suffixes[0]; i++ )
+ {
+ unsigned char* s;
+ size_t j = suffixes[i] - 1;
+
+
+ if ( j < string_count && ( s = names[j] ) != NULL )
+ {
+ size_t s_len = (size_t)s[0];
+
+
+ if ( s_len != 0 && ps_name_len + s_len < sizeof ( ps_name ) )
+ {
+ ft_memcpy( ps_name + ps_name_len, s + 1, s_len );
+ ps_name_len += s_len;
+ ps_name[ps_name_len] = 0;
+ }
+ }
+ }
+ }
+ }
+
+ create_lwfn_name( ps_name, lwfn_file_name );
+ }
+ }
+
+
+ static FT_Error
+ lookup_lwfn_by_fond( const UInt8* path_fond,
+ ConstStr255Param base_lwfn,
+ UInt8* path_lwfn,
+ size_t path_size )
+ {
+ FSRef ref, par_ref;
+ size_t dirname_len;
+
+
+ /* Pathname for FSRef can be in various formats: HFS, HFS+, and POSIX. */
+ /* We should not extract parent directory by string manipulation. */
+
+ if ( noErr != FSPathMakeRef( path_fond, &ref, FALSE ) )
+ return FT_THROW( Invalid_Argument );
+
+ if ( noErr != FSGetCatalogInfo( &ref, kFSCatInfoNone,
+ NULL, NULL, NULL, &par_ref ) )
+ return FT_THROW( Invalid_Argument );
+
+ if ( noErr != FSRefMakePath( &par_ref, path_lwfn, path_size ) )
+ return FT_THROW( Invalid_Argument );
+
+ if ( ft_strlen( (char *)path_lwfn ) + 1 + base_lwfn[0] > path_size )
+ return FT_THROW( Invalid_Argument );
+
+ /* now we have absolute dirname in path_lwfn */
+ ft_strcat( (char *)path_lwfn, "/" );
+ dirname_len = ft_strlen( (char *)path_lwfn );
+ ft_strcat( (char *)path_lwfn, (char *)base_lwfn + 1 );
+ path_lwfn[dirname_len + base_lwfn[0]] = '\0';
+
+ if ( noErr != FSPathMakeRef( path_lwfn, &ref, FALSE ) )
+ return FT_THROW( Cannot_Open_Resource );
+
+ if ( noErr != FSGetCatalogInfo( &ref, kFSCatInfoNone,
+ NULL, NULL, NULL, NULL ) )
+ return FT_THROW( Cannot_Open_Resource );
+
+ return FT_Err_Ok;
+ }
+
+
+ static short
+ count_faces( Handle fond,
+ const UInt8* pathname )
+ {
+ ResID sfnt_id;
+ short have_sfnt, have_lwfn;
+ Str255 lwfn_file_name;
+ UInt8 buff[PATH_MAX];
+ FT_Error err;
+ short num_faces;
+
+
+ have_sfnt = have_lwfn = 0;
+
+ parse_fond( *fond, &have_sfnt, &sfnt_id, lwfn_file_name, 0 );
+
+ if ( lwfn_file_name[0] )
+ {
+ err = lookup_lwfn_by_fond( pathname, lwfn_file_name,
+ buff, sizeof ( buff ) );
+ if ( !err )
+ have_lwfn = 1;
+ }
+
+ if ( have_lwfn && ( !have_sfnt || PREFER_LWFN ) )
+ num_faces = 1;
+ else
+ num_faces = count_faces_scalable( *fond );
+
+ return num_faces;
+ }
+
+
+ /* Read Type 1 data from the POST resources inside the LWFN file,
+ return a PFB buffer. This is somewhat convoluted because the FT2
+ PFB parser wants the ASCII header as one chunk, and the LWFN
+ chunks are often not organized that way, so we glue chunks
+ of the same type together. */
+ static FT_Error
+ read_lwfn( FT_Memory memory,
+ ResFileRefNum res,
+ FT_Byte** pfb_data,
+ FT_ULong* size )
+ {
+ FT_Error error = FT_Err_Ok;
+ ResID res_id;
+ unsigned char *buffer, *p, *size_p = NULL;
+ FT_ULong total_size = 0;
+ FT_ULong old_total_size = 0;
+ FT_ULong post_size, pfb_chunk_size;
+ Handle post_data;
+ char code, last_code;
+
+
+ UseResFile( res );
+
+ /* First pass: load all POST resources, and determine the size of */
+ /* the output buffer. */
+ res_id = 501;
+ last_code = -1;
+
+ for (;;)
+ {
+ post_data = Get1Resource( TTAG_POST, res_id++ );
+ if ( post_data == NULL )
+ break; /* we are done */
+
+ code = (*post_data)[0];
+
+ if ( code != last_code )
+ {
+ if ( code == 5 )
+ total_size += 2; /* just the end code */
+ else
+ total_size += 6; /* code + 4 bytes chunk length */
+ }
+
+ total_size += GetHandleSize( post_data ) - 2;
+ last_code = code;
+
+ /* detect integer overflows */
+ if ( total_size < old_total_size )
+ {
+ error = FT_THROW( Array_Too_Large );
+ goto Error;
+ }
+
+ old_total_size = total_size;
+ }
+
+ if ( FT_ALLOC( buffer, (FT_Long)total_size ) )
+ goto Error;
+
+ /* Second pass: append all POST data to the buffer, add PFB fields. */
+ /* Glue all consecutive chunks of the same type together. */
+ p = buffer;
+ res_id = 501;
+ last_code = -1;
+ pfb_chunk_size = 0;
+
+ for (;;)
+ {
+ post_data = Get1Resource( TTAG_POST, res_id++ );
+ if ( post_data == NULL )
+ break; /* we are done */
+
+ post_size = (FT_ULong)GetHandleSize( post_data ) - 2;
+ code = (*post_data)[0];
+
+ if ( code != last_code )
+ {
+ if ( last_code != -1 )
+ {
+ /* we are done adding a chunk, fill in the size field */
+ if ( size_p != NULL )
+ {
+ *size_p++ = (FT_Byte)( pfb_chunk_size & 0xFF );
+ *size_p++ = (FT_Byte)( ( pfb_chunk_size >> 8 ) & 0xFF );
+ *size_p++ = (FT_Byte)( ( pfb_chunk_size >> 16 ) & 0xFF );
+ *size_p++ = (FT_Byte)( ( pfb_chunk_size >> 24 ) & 0xFF );
+ }
+ pfb_chunk_size = 0;
+ }
+
+ *p++ = 0x80;
+ if ( code == 5 )
+ *p++ = 0x03; /* the end */
+ else if ( code == 2 )
+ *p++ = 0x02; /* binary segment */
+ else
+ *p++ = 0x01; /* ASCII segment */
+
+ if ( code != 5 )
+ {
+ size_p = p; /* save for later */
+ p += 4; /* make space for size field */
+ }
+ }
+
+ ft_memcpy( p, *post_data + 2, post_size );
+ pfb_chunk_size += post_size;
+ p += post_size;
+ last_code = code;
+ }
+
+ *pfb_data = buffer;
+ *size = total_size;
+
+ Error:
+ CloseResFile( res );
+ return error;
+ }
+
+
+ /* Create a new FT_Face from a file path to an LWFN file. */
+ static FT_Error
+ FT_New_Face_From_LWFN( FT_Library library,
+ const UInt8* pathname,
+ FT_Long face_index,
+ FT_Face* aface )
+ {
+ FT_Byte* pfb_data;
+ FT_ULong pfb_size;
+ FT_Error error;
+ ResFileRefNum res;
+
+
+ if ( noErr != FT_FSPathMakeRes( pathname, &res ) )
+ return FT_THROW( Cannot_Open_Resource );
+
+ pfb_data = NULL;
+ pfb_size = 0;
+ error = read_lwfn( library->memory, res, &pfb_data, &pfb_size );
+ CloseResFile( res ); /* PFB is already loaded, useless anymore */
+ if ( error )
+ return error;
+
+ return open_face_from_buffer( library,
+ pfb_data,
+ pfb_size,
+ face_index,
+ "type1",
+ aface );
+ }
+
+
+ /* Create a new FT_Face from an SFNT resource, specified by res ID. */
+ static FT_Error
+ FT_New_Face_From_SFNT( FT_Library library,
+ ResID sfnt_id,
+ FT_Long face_index,
+ FT_Face* aface )
+ {
+ Handle sfnt = NULL;
+ FT_Byte* sfnt_data;
+ size_t sfnt_size;
+ FT_Error error = FT_Err_Ok;
+ FT_Memory memory = library->memory;
+ int is_cff, is_sfnt_ps;
+
+
+ sfnt = GetResource( TTAG_sfnt, sfnt_id );
+ if ( sfnt == NULL )
+ return FT_THROW( Invalid_Handle );
+
+ sfnt_size = (FT_ULong)GetHandleSize( sfnt );
+ if ( FT_ALLOC( sfnt_data, (FT_Long)sfnt_size ) )
+ {
+ ReleaseResource( sfnt );
+ return error;
+ }
+
+ ft_memcpy( sfnt_data, *sfnt, sfnt_size );
+ ReleaseResource( sfnt );
+
+ is_cff = sfnt_size > 4 && !ft_memcmp( sfnt_data, "OTTO", 4 );
+ is_sfnt_ps = sfnt_size > 4 && !ft_memcmp( sfnt_data, "typ1", 4 );
+
+ if ( is_sfnt_ps )
+ {
+ FT_Stream stream;
+
+
+ if ( FT_NEW( stream ) )
+ goto Try_OpenType;
+
+ FT_Stream_OpenMemory( stream, sfnt_data, sfnt_size );
+ if ( !open_face_PS_from_sfnt_stream( library,
+ stream,
+ face_index,
+ 0, NULL,
+ aface ) )
+ {
+ FT_Stream_Close( stream );
+ FT_FREE( stream );
+ FT_FREE( sfnt_data );
+ goto Exit;
+ }
+
+ FT_FREE( stream );
+ }
+ Try_OpenType:
+ error = open_face_from_buffer( library,
+ sfnt_data,
+ sfnt_size,
+ face_index,
+ is_cff ? "cff" : "truetype",
+ aface );
+ Exit:
+ return error;
+ }
+
+
+ /* Create a new FT_Face from a file path to a suitcase file. */
+ static FT_Error
+ FT_New_Face_From_Suitcase( FT_Library library,
+ const UInt8* pathname,
+ FT_Long face_index,
+ FT_Face* aface )
+ {
+ FT_Error error = FT_ERR( Cannot_Open_Resource );
+ ResFileRefNum res_ref;
+ ResourceIndex res_index;
+ Handle fond;
+ short num_faces_in_res;
+
+
+ if ( noErr != FT_FSPathMakeRes( pathname, &res_ref ) )
+ return FT_THROW( Cannot_Open_Resource );
+
+ UseResFile( res_ref );
+ if ( ResError() )
+ return FT_THROW( Cannot_Open_Resource );
+
+ num_faces_in_res = 0;
+ for ( res_index = 1; ; ++res_index )
+ {
+ short num_faces_in_fond;
+
+
+ fond = Get1IndResource( TTAG_FOND, res_index );
+ if ( ResError() )
+ break;
+
+ num_faces_in_fond = count_faces( fond, pathname );
+ num_faces_in_res += num_faces_in_fond;
+
+ if ( 0 <= face_index && face_index < num_faces_in_fond && error )
+ error = FT_New_Face_From_FOND( library, fond, face_index, aface );
+
+ face_index -= num_faces_in_fond;
+ }
+
+ CloseResFile( res_ref );
+ if ( !error && aface && *aface )
+ (*aface)->num_faces = num_faces_in_res;
+ return error;
+ }
+
+
+ /* documentation is in ftmac.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_New_Face_From_FOND( FT_Library library,
+ Handle fond,
+ FT_Long face_index,
+ FT_Face* aface )
+ {
+ short have_sfnt, have_lwfn = 0;
+ ResID sfnt_id, fond_id;
+ OSType fond_type;
+ Str255 fond_name;
+ Str255 lwfn_file_name;
+ UInt8 path_lwfn[PATH_MAX];
+ OSErr err;
+ FT_Error error = FT_Err_Ok;
+
+
+ GetResInfo( fond, &fond_id, &fond_type, fond_name );
+ if ( ResError() != noErr || fond_type != TTAG_FOND )
+ return FT_THROW( Invalid_File_Format );
+
+ parse_fond( *fond, &have_sfnt, &sfnt_id, lwfn_file_name, face_index );
+
+ if ( lwfn_file_name[0] )
+ {
+ ResFileRefNum res;
+
+
+ res = HomeResFile( fond );
+ if ( noErr != ResError() )
+ goto found_no_lwfn_file;
+
+ {
+ UInt8 path_fond[PATH_MAX];
+ FSRef ref;
+
+
+ err = FSGetForkCBInfo( res, kFSInvalidVolumeRefNum,
+ NULL, NULL, NULL, &ref, NULL );
+ if ( noErr != err )
+ goto found_no_lwfn_file;
+
+ err = FSRefMakePath( &ref, path_fond, sizeof ( path_fond ) );
+ if ( noErr != err )
+ goto found_no_lwfn_file;
+
+ error = lookup_lwfn_by_fond( path_fond, lwfn_file_name,
+ path_lwfn, sizeof ( path_lwfn ) );
+ if ( !error )
+ have_lwfn = 1;
+ }
+ }
+
+ if ( have_lwfn && ( !have_sfnt || PREFER_LWFN ) )
+ error = FT_New_Face_From_LWFN( library,
+ path_lwfn,
+ face_index,
+ aface );
+ else
+ error = FT_THROW( Unknown_File_Format );
+
+ found_no_lwfn_file:
+ if ( have_sfnt && error )
+ error = FT_New_Face_From_SFNT( library,
+ sfnt_id,
+ face_index,
+ aface );
+
+ return error;
+ }
+
+
+ /* Common function to load a new FT_Face from a resource file. */
+ static FT_Error
+ FT_New_Face_From_Resource( FT_Library library,
+ const UInt8* pathname,
+ FT_Long face_index,
+ FT_Face* aface )
+ {
+ OSType file_type;
+ FT_Error error;
+
+
+ /* LWFN is a (very) specific file format, check for it explicitly */
+ file_type = get_file_type_from_path( pathname );
+ if ( file_type == TTAG_LWFN )
+ return FT_New_Face_From_LWFN( library, pathname, face_index, aface );
+
+ /* Otherwise the file type doesn't matter (there are more than */
+ /* `FFIL' and `tfil'). Just try opening it as a font suitcase; */
+ /* if it works, fine. */
+
+ error = FT_New_Face_From_Suitcase( library, pathname, face_index, aface );
+ if ( error == 0 )
+ return error;
+
+ /* let it fall through to normal loader (.ttf, .otf, etc.); */
+ /* we signal this by returning no error and no FT_Face */
+ *aface = NULL;
+ return 0;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_New_Face */
+ /* */
+ /* <Description> */
+ /* This is the Mac-specific implementation of FT_New_Face. In */
+ /* addition to the standard FT_New_Face() functionality, it also */
+ /* accepts pathnames to Mac suitcase files. For further */
+ /* documentation see the original FT_New_Face() in freetype.h. */
+ /* */
+ FT_EXPORT_DEF( FT_Error )
+ FT_New_Face( FT_Library library,
+ const char* pathname,
+ FT_Long face_index,
+ FT_Face* aface )
+ {
+ FT_Open_Args args;
+ FT_Error error;
+
+
+ /* test for valid `library' and `aface' delayed to FT_Open_Face() */
+ if ( !pathname )
+ return FT_THROW( Invalid_Argument );
+
+ error = FT_Err_Ok;
+ *aface = NULL;
+
+ /* try resourcefork based font: LWFN, FFIL */
+ error = FT_New_Face_From_Resource( library, (UInt8 *)pathname,
+ face_index, aface );
+ if ( error != 0 || *aface != NULL )
+ return error;
+
+ /* let it fall through to normal loader (.ttf, .otf, etc.) */
+ args.flags = FT_OPEN_PATHNAME;
+ args.pathname = (char*)pathname;
+ return FT_Open_Face( library, &args, face_index, aface );
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_New_Face_From_FSRef */
+ /* */
+ /* <Description> */
+ /* FT_New_Face_From_FSRef is identical to FT_New_Face except it */
+ /* accepts an FSRef instead of a path. */
+ /* */
+ /* This function is deprecated because Carbon data types (FSRef) */
+ /* are not cross-platform, and thus not suitable for the freetype API. */
+ FT_EXPORT_DEF( FT_Error )
+ FT_New_Face_From_FSRef( FT_Library library,
+ const FSRef* ref,
+ FT_Long face_index,
+ FT_Face* aface )
+ {
+ FT_Error error;
+ FT_Open_Args args;
+ OSErr err;
+ UInt8 pathname[PATH_MAX];
+
+
+ if ( !ref )
+ return FT_THROW( Invalid_Argument );
+
+ err = FSRefMakePath( ref, pathname, sizeof ( pathname ) );
+ if ( err )
+ error = FT_THROW( Cannot_Open_Resource );
+
+ error = FT_New_Face_From_Resource( library, pathname, face_index, aface );
+ if ( error != 0 || *aface != NULL )
+ return error;
+
+ /* fallback to datafork font */
+ args.flags = FT_OPEN_PATHNAME;
+ args.pathname = (char*)pathname;
+ return FT_Open_Face( library, &args, face_index, aface );
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_New_Face_From_FSSpec */
+ /* */
+ /* <Description> */
+ /* FT_New_Face_From_FSSpec is identical to FT_New_Face except it */
+ /* accepts an FSSpec instead of a path. */
+ /* */
+ /* This function is deprecated because FSSpec is deprecated in Mac OS X */
+ FT_EXPORT_DEF( FT_Error )
+ FT_New_Face_From_FSSpec( FT_Library library,
+ const FSSpec* spec,
+ FT_Long face_index,
+ FT_Face* aface )
+ {
+#if ( __LP64__ ) || ( defined( MAC_OS_X_VERSION_10_5 ) && \
+ ( MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 ) )
+ FT_UNUSED( library );
+ FT_UNUSED( spec );
+ FT_UNUSED( face_index );
+ FT_UNUSED( aface );
+
+ return FT_THROW( Unimplemented_Feature );
+#else
+ FSRef ref;
+
+
+ if ( !spec || FSpMakeFSRef( spec, &ref ) != noErr )
+ return FT_THROW( Invalid_Argument );
+ else
+ return FT_New_Face_From_FSRef( library, &ref, face_index, aface );
+#endif
+ }
+
+#endif /* FT_MACINTOSH */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftobjs.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftobjs.c
new file mode 100644
index 0000000000..96d460d596
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftobjs.c
@@ -0,0 +1,4867 @@
+/***************************************************************************/
+/* */
+/* ftobjs.c */
+/* */
+/* The FreeType private base classes (body). */
+/* */
+/* Copyright 1996-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/ftlist.h"
+#include "../../include/freetype/ftoutln.h"
+#include "../../include/freetype/internal/ftvalid.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftrfork.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/internal/sfnt.h" /* for SFNT_Load_Table_Func */
+#include "../../include/freetype/tttables.h"
+#include "../../include/freetype/tttags.h"
+#include "../../include/freetype/ttnameid.h"
+
+#include "../../include/freetype/internal/services/svprop.h"
+#include "../../include/freetype/internal/services/svsfnt.h"
+#include "../../include/freetype/internal/services/svpostnm.h"
+#include "../../include/freetype/internal/services/svgldict.h"
+#include "../../include/freetype/internal/services/svttcmap.h"
+#include "../../include/freetype/internal/services/svkern.h"
+#include "../../include/freetype/internal/services/svtteng.h"
+
+#ifdef FT_CONFIG_OPTION_MAC_FONTS
+#include "ftbase.h"
+#endif
+
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+
+#include "../../include/freetype/ftbitmap.h"
+
+#if defined( _MSC_VER ) /* Visual C++ (and Intel C++) */
+ /* We disable the warning `conversion from XXX to YYY, */
+ /* possible loss of data' in order to compile cleanly with */
+ /* the maximum level of warnings: `md5.c' is non-FreeType */
+ /* code, and it gets used during development builds only. */
+#pragma warning( push )
+#pragma warning( disable : 4244 )
+#endif /* _MSC_VER */
+
+ /* it's easiest to include `md5.c' directly */
+#define free md5_free /* suppress a shadow warning */
+#include "md5.c"
+#undef free
+
+#if defined( _MSC_VER )
+#pragma warning( pop )
+#endif
+
+#endif /* FT_DEBUG_LEVEL_TRACE */
+
+
+#define GRID_FIT_METRICS
+
+
+ FT_BASE_DEF( FT_Pointer )
+ ft_service_list_lookup( FT_ServiceDesc service_descriptors,
+ const char* service_id )
+ {
+ FT_Pointer result = NULL;
+ FT_ServiceDesc desc = service_descriptors;
+
+
+ if ( desc && service_id )
+ {
+ for ( ; desc->serv_id != NULL; desc++ )
+ {
+ if ( ft_strcmp( desc->serv_id, service_id ) == 0 )
+ {
+ result = (FT_Pointer)desc->serv_data;
+ break;
+ }
+ }
+ }
+
+ return result;
+ }
+
+
+ FT_BASE_DEF( void )
+ ft_validator_init( FT_Validator valid,
+ const FT_Byte* base,
+ const FT_Byte* limit,
+ FT_ValidationLevel level )
+ {
+ valid->base = base;
+ valid->limit = limit;
+ valid->level = level;
+ valid->error = FT_Err_Ok;
+ }
+
+
+ FT_BASE_DEF( FT_Int )
+ ft_validator_run( FT_Validator valid )
+ {
+ /* This function doesn't work! None should call it. */
+ FT_UNUSED( valid );
+
+ return -1;
+ }
+
+
+ FT_BASE_DEF( void )
+ ft_validator_error( FT_Validator valid,
+ FT_Error error )
+ {
+ /* since the cast below also disables the compiler's */
+ /* type check, we introduce a dummy variable, which */
+ /* will be optimized away */
+ volatile ft_jmp_buf* jump_buffer = &valid->jump_buffer;
+
+
+ valid->error = error;
+
+ /* throw away volatileness; use `jump_buffer' or the */
+ /* compiler may warn about an unused local variable */
+ ft_longjmp( *(ft_jmp_buf*) jump_buffer, 1 );
+ }
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** ****/
+ /**** S T R E A M ****/
+ /**** ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /* create a new input stream from an FT_Open_Args structure */
+ /* */
+ FT_BASE_DEF( FT_Error )
+ FT_Stream_New( FT_Library library,
+ const FT_Open_Args* args,
+ FT_Stream *astream )
+ {
+ FT_Error error;
+ FT_Memory memory;
+ FT_Stream stream = NULL;
+
+
+ *astream = 0;
+
+ if ( !library )
+ return FT_THROW( Invalid_Library_Handle );
+
+ if ( !args )
+ return FT_THROW( Invalid_Argument );
+
+ memory = library->memory;
+
+ if ( FT_NEW( stream ) )
+ goto Exit;
+
+ stream->memory = memory;
+
+ if ( args->flags & FT_OPEN_MEMORY )
+ {
+ /* create a memory-based stream */
+ FT_Stream_OpenMemory( stream,
+ (const FT_Byte*)args->memory_base,
+ args->memory_size );
+ }
+
+#ifndef FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT
+
+ else if ( args->flags & FT_OPEN_PATHNAME )
+ {
+ /* create a normal system stream */
+ error = FT_Stream_Open( stream, args->pathname );
+ stream->pathname.pointer = args->pathname;
+ }
+ else if ( ( args->flags & FT_OPEN_STREAM ) && args->stream )
+ {
+ /* use an existing, user-provided stream */
+
+ /* in this case, we do not need to allocate a new stream object */
+ /* since the caller is responsible for closing it himself */
+ FT_FREE( stream );
+ stream = args->stream;
+ }
+
+#endif
+
+ else
+ error = FT_THROW( Invalid_Argument );
+
+ if ( error )
+ FT_FREE( stream );
+ else
+ stream->memory = memory; /* just to be certain */
+
+ *astream = stream;
+
+ Exit:
+ return error;
+ }
+
+
+ FT_BASE_DEF( void )
+ FT_Stream_Free( FT_Stream stream,
+ FT_Int external )
+ {
+ if ( stream )
+ {
+ FT_Memory memory = stream->memory;
+
+
+ FT_Stream_Close( stream );
+
+ if ( !external )
+ FT_FREE( stream );
+ }
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_objs
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** ****/
+ /**** FACE, SIZE & GLYPH SLOT OBJECTS ****/
+ /**** ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ static FT_Error
+ ft_glyphslot_init( FT_GlyphSlot slot )
+ {
+ FT_Driver driver = slot->face->driver;
+ FT_Driver_Class clazz = driver->clazz;
+ FT_Memory memory = driver->root.memory;
+ FT_Error error = FT_Err_Ok;
+ FT_Slot_Internal internal = NULL;
+
+
+ slot->library = driver->root.library;
+
+ if ( FT_NEW( internal ) )
+ goto Exit;
+
+ slot->internal = internal;
+
+ if ( FT_DRIVER_USES_OUTLINES( driver ) )
+ error = FT_GlyphLoader_New( memory, &internal->loader );
+
+ if ( !error && clazz->init_slot )
+ error = clazz->init_slot( slot );
+
+ Exit:
+ return error;
+ }
+
+
+ FT_BASE_DEF( void )
+ ft_glyphslot_free_bitmap( FT_GlyphSlot slot )
+ {
+ if ( slot->internal && ( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) )
+ {
+ FT_Memory memory = FT_FACE_MEMORY( slot->face );
+
+
+ FT_FREE( slot->bitmap.buffer );
+ slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP;
+ }
+ else
+ {
+ /* assume that the bitmap buffer was stolen or not */
+ /* allocated from the heap */
+ slot->bitmap.buffer = NULL;
+ }
+ }
+
+
+ FT_BASE_DEF( void )
+ ft_glyphslot_set_bitmap( FT_GlyphSlot slot,
+ FT_Byte* buffer )
+ {
+ ft_glyphslot_free_bitmap( slot );
+
+ slot->bitmap.buffer = buffer;
+
+ FT_ASSERT( (slot->internal->flags & FT_GLYPH_OWN_BITMAP) == 0 );
+ }
+
+
+ FT_BASE_DEF( FT_Error )
+ ft_glyphslot_alloc_bitmap( FT_GlyphSlot slot,
+ FT_ULong size )
+ {
+ FT_Memory memory = FT_FACE_MEMORY( slot->face );
+ FT_Error error;
+
+
+ if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP )
+ FT_FREE( slot->bitmap.buffer );
+ else
+ slot->internal->flags |= FT_GLYPH_OWN_BITMAP;
+
+ (void)FT_ALLOC( slot->bitmap.buffer, size );
+ return error;
+ }
+
+
+ static void
+ ft_glyphslot_clear( FT_GlyphSlot slot )
+ {
+ /* free bitmap if needed */
+ ft_glyphslot_free_bitmap( slot );
+
+ /* clear all public fields in the glyph slot */
+ FT_ZERO( &slot->metrics );
+ FT_ZERO( &slot->outline );
+
+ slot->bitmap.width = 0;
+ slot->bitmap.rows = 0;
+ slot->bitmap.pitch = 0;
+ slot->bitmap.pixel_mode = 0;
+ /* `slot->bitmap.buffer' has been handled by ft_glyphslot_free_bitmap */
+
+ slot->bitmap_left = 0;
+ slot->bitmap_top = 0;
+ slot->num_subglyphs = 0;
+ slot->subglyphs = 0;
+ slot->control_data = 0;
+ slot->control_len = 0;
+ slot->other = 0;
+ slot->format = FT_GLYPH_FORMAT_NONE;
+
+ slot->linearHoriAdvance = 0;
+ slot->linearVertAdvance = 0;
+ slot->lsb_delta = 0;
+ slot->rsb_delta = 0;
+ }
+
+
+ static void
+ ft_glyphslot_done( FT_GlyphSlot slot )
+ {
+ FT_Driver driver = slot->face->driver;
+ FT_Driver_Class clazz = driver->clazz;
+ FT_Memory memory = driver->root.memory;
+
+
+ if ( clazz->done_slot )
+ clazz->done_slot( slot );
+
+ /* free bitmap buffer if needed */
+ ft_glyphslot_free_bitmap( slot );
+
+ /* slot->internal might be NULL in out-of-memory situations */
+ if ( slot->internal )
+ {
+ /* free glyph loader */
+ if ( FT_DRIVER_USES_OUTLINES( driver ) )
+ {
+ FT_GlyphLoader_Done( slot->internal->loader );
+ slot->internal->loader = 0;
+ }
+
+ FT_FREE( slot->internal );
+ }
+ }
+
+
+ /* documentation is in ftobjs.h */
+
+ FT_BASE_DEF( FT_Error )
+ FT_New_GlyphSlot( FT_Face face,
+ FT_GlyphSlot *aslot )
+ {
+ FT_Error error;
+ FT_Driver driver;
+ FT_Driver_Class clazz;
+ FT_Memory memory;
+ FT_GlyphSlot slot = NULL;
+
+
+ if ( !face || !face->driver )
+ return FT_THROW( Invalid_Argument );
+
+ driver = face->driver;
+ clazz = driver->clazz;
+ memory = driver->root.memory;
+
+ FT_TRACE4(( "FT_New_GlyphSlot: Creating new slot object\n" ));
+ if ( !FT_ALLOC( slot, clazz->slot_object_size ) )
+ {
+ slot->face = face;
+
+ error = ft_glyphslot_init( slot );
+ if ( error )
+ {
+ ft_glyphslot_done( slot );
+ FT_FREE( slot );
+ goto Exit;
+ }
+
+ slot->next = face->glyph;
+ face->glyph = slot;
+
+ if ( aslot )
+ *aslot = slot;
+ }
+ else if ( aslot )
+ *aslot = 0;
+
+
+ Exit:
+ FT_TRACE4(( "FT_New_GlyphSlot: Return %d\n", error ));
+ return error;
+ }
+
+
+ /* documentation is in ftobjs.h */
+
+ FT_BASE_DEF( void )
+ FT_Done_GlyphSlot( FT_GlyphSlot slot )
+ {
+ if ( slot )
+ {
+ FT_Driver driver = slot->face->driver;
+ FT_Memory memory = driver->root.memory;
+ FT_GlyphSlot prev;
+ FT_GlyphSlot cur;
+
+
+ /* Remove slot from its parent face's list */
+ prev = NULL;
+ cur = slot->face->glyph;
+
+ while ( cur )
+ {
+ if ( cur == slot )
+ {
+ if ( !prev )
+ slot->face->glyph = cur->next;
+ else
+ prev->next = cur->next;
+
+ /* finalize client-specific data */
+ if ( slot->generic.finalizer )
+ slot->generic.finalizer( slot );
+
+ ft_glyphslot_done( slot );
+ FT_FREE( slot );
+ break;
+ }
+ prev = cur;
+ cur = cur->next;
+ }
+ }
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( void )
+ FT_Set_Transform( FT_Face face,
+ FT_Matrix* matrix,
+ FT_Vector* delta )
+ {
+ FT_Face_Internal internal;
+
+
+ if ( !face )
+ return;
+
+ internal = face->internal;
+
+ internal->transform_flags = 0;
+
+ if ( !matrix )
+ {
+ internal->transform_matrix.xx = 0x10000L;
+ internal->transform_matrix.xy = 0;
+ internal->transform_matrix.yx = 0;
+ internal->transform_matrix.yy = 0x10000L;
+ matrix = &internal->transform_matrix;
+ }
+ else
+ internal->transform_matrix = *matrix;
+
+ /* set transform_flags bit flag 0 if `matrix' isn't the identity */
+ if ( ( matrix->xy | matrix->yx ) ||
+ matrix->xx != 0x10000L ||
+ matrix->yy != 0x10000L )
+ internal->transform_flags |= 1;
+
+ if ( !delta )
+ {
+ internal->transform_delta.x = 0;
+ internal->transform_delta.y = 0;
+ delta = &internal->transform_delta;
+ }
+ else
+ internal->transform_delta = *delta;
+
+ /* set transform_flags bit flag 1 if `delta' isn't the null vector */
+ if ( delta->x | delta->y )
+ internal->transform_flags |= 2;
+ }
+
+
+ static FT_Renderer
+ ft_lookup_glyph_renderer( FT_GlyphSlot slot );
+
+
+#ifdef GRID_FIT_METRICS
+ static void
+ ft_glyphslot_grid_fit_metrics( FT_GlyphSlot slot,
+ FT_Bool vertical )
+ {
+ FT_Glyph_Metrics* metrics = &slot->metrics;
+ FT_Pos right, bottom;
+
+
+ if ( vertical )
+ {
+ metrics->horiBearingX = FT_PIX_FLOOR( metrics->horiBearingX );
+ metrics->horiBearingY = FT_PIX_CEIL ( metrics->horiBearingY );
+
+ right = FT_PIX_CEIL( metrics->vertBearingX + metrics->width );
+ bottom = FT_PIX_CEIL( metrics->vertBearingY + metrics->height );
+
+ metrics->vertBearingX = FT_PIX_FLOOR( metrics->vertBearingX );
+ metrics->vertBearingY = FT_PIX_FLOOR( metrics->vertBearingY );
+
+ metrics->width = right - metrics->vertBearingX;
+ metrics->height = bottom - metrics->vertBearingY;
+ }
+ else
+ {
+ metrics->vertBearingX = FT_PIX_FLOOR( metrics->vertBearingX );
+ metrics->vertBearingY = FT_PIX_FLOOR( metrics->vertBearingY );
+
+ right = FT_PIX_CEIL ( metrics->horiBearingX + metrics->width );
+ bottom = FT_PIX_FLOOR( metrics->horiBearingY - metrics->height );
+
+ metrics->horiBearingX = FT_PIX_FLOOR( metrics->horiBearingX );
+ metrics->horiBearingY = FT_PIX_CEIL ( metrics->horiBearingY );
+
+ metrics->width = right - metrics->horiBearingX;
+ metrics->height = metrics->horiBearingY - bottom;
+ }
+
+ metrics->horiAdvance = FT_PIX_ROUND( metrics->horiAdvance );
+ metrics->vertAdvance = FT_PIX_ROUND( metrics->vertAdvance );
+ }
+#endif /* GRID_FIT_METRICS */
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Load_Glyph( FT_Face face,
+ FT_UInt glyph_index,
+ FT_Int32 load_flags )
+ {
+ FT_Error error;
+ FT_Driver driver;
+ FT_GlyphSlot slot;
+ FT_Library library;
+ FT_Bool autohint = FALSE;
+ FT_Module hinter;
+ TT_Face ttface = (TT_Face)face;
+
+
+ if ( !face || !face->size || !face->glyph )
+ return FT_THROW( Invalid_Face_Handle );
+
+ /* The validity test for `glyph_index' is performed by the */
+ /* font drivers. */
+
+ slot = face->glyph;
+ ft_glyphslot_clear( slot );
+
+ driver = face->driver;
+ library = driver->root.library;
+ hinter = library->auto_hinter;
+
+ /* resolve load flags dependencies */
+
+ if ( load_flags & FT_LOAD_NO_RECURSE )
+ load_flags |= FT_LOAD_NO_SCALE |
+ FT_LOAD_IGNORE_TRANSFORM;
+
+ if ( load_flags & FT_LOAD_NO_SCALE )
+ {
+ load_flags |= FT_LOAD_NO_HINTING |
+ FT_LOAD_NO_BITMAP;
+
+ load_flags &= ~FT_LOAD_RENDER;
+ }
+
+ /*
+ * Determine whether we need to auto-hint or not.
+ * The general rules are:
+ *
+ * - Do only auto-hinting if we have a hinter module, a scalable font
+ * format dealing with outlines, and no transforms except simple
+ * slants and/or rotations by integer multiples of 90 degrees.
+ *
+ * - Then, auto-hint if FT_LOAD_FORCE_AUTOHINT is set or if we don't
+ * have a native font hinter.
+ *
+ * - Otherwise, auto-hint for LIGHT hinting mode or if there isn't
+ * any hinting bytecode in the TrueType/OpenType font.
+ *
+ * - Exception: The font is `tricky' and requires the native hinter to
+ * load properly.
+ */
+
+ if ( hinter &&
+ !( load_flags & FT_LOAD_NO_HINTING ) &&
+ !( load_flags & FT_LOAD_NO_AUTOHINT ) &&
+ FT_DRIVER_IS_SCALABLE( driver ) &&
+ FT_DRIVER_USES_OUTLINES( driver ) &&
+ !FT_IS_TRICKY( face ) &&
+ ( ( load_flags & FT_LOAD_IGNORE_TRANSFORM ) ||
+ ( face->internal->transform_matrix.yx == 0 &&
+ face->internal->transform_matrix.xx != 0 ) ||
+ ( face->internal->transform_matrix.xx == 0 &&
+ face->internal->transform_matrix.yx != 0 ) ) )
+ {
+ if ( ( load_flags & FT_LOAD_FORCE_AUTOHINT ) ||
+ !FT_DRIVER_HAS_HINTER( driver ) )
+ autohint = TRUE;
+ else
+ {
+ FT_Render_Mode mode = FT_LOAD_TARGET_MODE( load_flags );
+
+
+ /* the check for `num_locations' assures that we actually */
+ /* test for instructions in a TTF and not in a CFF-based OTF */
+ if ( mode == FT_RENDER_MODE_LIGHT ||
+ face->internal->ignore_unpatented_hinter ||
+ ( FT_IS_SFNT( face ) &&
+ ttface->num_locations &&
+ ttface->max_profile.maxSizeOfInstructions == 0 ) )
+ autohint = TRUE;
+ }
+ }
+
+ if ( autohint )
+ {
+ FT_AutoHinter_Interface hinting;
+
+
+ /* try to load embedded bitmaps first if available */
+ /* */
+ /* XXX: This is really a temporary hack that should disappear */
+ /* promptly with FreeType 2.1! */
+ /* */
+ if ( FT_HAS_FIXED_SIZES( face ) &&
+ ( load_flags & FT_LOAD_NO_BITMAP ) == 0 )
+ {
+ error = driver->clazz->load_glyph( slot, face->size,
+ glyph_index,
+ load_flags | FT_LOAD_SBITS_ONLY );
+
+ if ( !error && slot->format == FT_GLYPH_FORMAT_BITMAP )
+ goto Load_Ok;
+ }
+
+ {
+ FT_Face_Internal internal = face->internal;
+ FT_Int transform_flags = internal->transform_flags;
+
+
+ /* since the auto-hinter calls FT_Load_Glyph by itself, */
+ /* make sure that glyphs aren't transformed */
+ internal->transform_flags = 0;
+
+ /* load auto-hinted outline */
+ hinting = (FT_AutoHinter_Interface)hinter->clazz->module_interface;
+
+ error = hinting->load_glyph( (FT_AutoHinter)hinter,
+ slot, face->size,
+ glyph_index, load_flags );
+
+ internal->transform_flags = transform_flags;
+ }
+ }
+ else
+ {
+ error = driver->clazz->load_glyph( slot,
+ face->size,
+ glyph_index,
+ load_flags );
+ if ( error )
+ goto Exit;
+
+ if ( slot->format == FT_GLYPH_FORMAT_OUTLINE )
+ {
+ /* check that the loaded outline is correct */
+ error = FT_Outline_Check( &slot->outline );
+ if ( error )
+ goto Exit;
+
+#ifdef GRID_FIT_METRICS
+ if ( !( load_flags & FT_LOAD_NO_HINTING ) )
+ ft_glyphslot_grid_fit_metrics( slot,
+ FT_BOOL( load_flags & FT_LOAD_VERTICAL_LAYOUT ) );
+#endif
+ }
+ }
+
+ Load_Ok:
+ /* compute the advance */
+ if ( load_flags & FT_LOAD_VERTICAL_LAYOUT )
+ {
+ slot->advance.x = 0;
+ slot->advance.y = slot->metrics.vertAdvance;
+ }
+ else
+ {
+ slot->advance.x = slot->metrics.horiAdvance;
+ slot->advance.y = 0;
+ }
+
+ /* compute the linear advance in 16.16 pixels */
+ if ( ( load_flags & FT_LOAD_LINEAR_DESIGN ) == 0 &&
+ ( FT_IS_SCALABLE( face ) ) )
+ {
+ FT_Size_Metrics* metrics = &face->size->metrics;
+
+
+ /* it's tricky! */
+ slot->linearHoriAdvance = FT_MulDiv( slot->linearHoriAdvance,
+ metrics->x_scale, 64 );
+
+ slot->linearVertAdvance = FT_MulDiv( slot->linearVertAdvance,
+ metrics->y_scale, 64 );
+ }
+
+ if ( ( load_flags & FT_LOAD_IGNORE_TRANSFORM ) == 0 )
+ {
+ FT_Face_Internal internal = face->internal;
+
+
+ /* now, transform the glyph image if needed */
+ if ( internal->transform_flags )
+ {
+ /* get renderer */
+ FT_Renderer renderer = ft_lookup_glyph_renderer( slot );
+
+
+ if ( renderer )
+ error = renderer->clazz->transform_glyph(
+ renderer, slot,
+ &internal->transform_matrix,
+ &internal->transform_delta );
+ else if ( slot->format == FT_GLYPH_FORMAT_OUTLINE )
+ {
+ /* apply `standard' transformation if no renderer is available */
+ if ( internal->transform_flags & 1 )
+ FT_Outline_Transform( &slot->outline,
+ &internal->transform_matrix );
+
+ if ( internal->transform_flags & 2 )
+ FT_Outline_Translate( &slot->outline,
+ internal->transform_delta.x,
+ internal->transform_delta.y );
+ }
+
+ /* transform advance */
+ FT_Vector_Transform( &slot->advance, &internal->transform_matrix );
+ }
+ }
+
+ FT_TRACE5(( " x advance: %d\n" , slot->advance.x ));
+ FT_TRACE5(( " y advance: %d\n" , slot->advance.y ));
+
+ FT_TRACE5(( " linear x advance: %d\n" , slot->linearHoriAdvance ));
+ FT_TRACE5(( " linear y advance: %d\n" , slot->linearVertAdvance ));
+
+ /* do we need to render the image now? */
+ if ( !error &&
+ slot->format != FT_GLYPH_FORMAT_BITMAP &&
+ slot->format != FT_GLYPH_FORMAT_COMPOSITE &&
+ load_flags & FT_LOAD_RENDER )
+ {
+ FT_Render_Mode mode = FT_LOAD_TARGET_MODE( load_flags );
+
+
+ if ( mode == FT_RENDER_MODE_NORMAL &&
+ (load_flags & FT_LOAD_MONOCHROME ) )
+ mode = FT_RENDER_MODE_MONO;
+
+ error = FT_Render_Glyph( slot, mode );
+ }
+
+ Exit:
+ return error;
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Load_Char( FT_Face face,
+ FT_ULong char_code,
+ FT_Int32 load_flags )
+ {
+ FT_UInt glyph_index;
+
+
+ if ( !face )
+ return FT_THROW( Invalid_Face_Handle );
+
+ glyph_index = (FT_UInt)char_code;
+ if ( face->charmap )
+ glyph_index = FT_Get_Char_Index( face, char_code );
+
+ return FT_Load_Glyph( face, glyph_index, load_flags );
+ }
+
+
+ /* destructor for sizes list */
+ static void
+ destroy_size( FT_Memory memory,
+ FT_Size size,
+ FT_Driver driver )
+ {
+ /* finalize client-specific data */
+ if ( size->generic.finalizer )
+ size->generic.finalizer( size );
+
+ /* finalize format-specific stuff */
+ if ( driver->clazz->done_size )
+ driver->clazz->done_size( size );
+
+ FT_FREE( size->internal );
+ FT_FREE( size );
+ }
+
+
+ static void
+ ft_cmap_done_internal( FT_CMap cmap );
+
+
+ static void
+ destroy_charmaps( FT_Face face,
+ FT_Memory memory )
+ {
+ FT_Int n;
+
+
+ if ( !face )
+ return;
+
+ for ( n = 0; n < face->num_charmaps; n++ )
+ {
+ FT_CMap cmap = FT_CMAP( face->charmaps[n] );
+
+
+ ft_cmap_done_internal( cmap );
+
+ face->charmaps[n] = NULL;
+ }
+
+ FT_FREE( face->charmaps );
+ face->num_charmaps = 0;
+ }
+
+
+ /* destructor for faces list */
+ static void
+ destroy_face( FT_Memory memory,
+ FT_Face face,
+ FT_Driver driver )
+ {
+ FT_Driver_Class clazz = driver->clazz;
+
+
+ /* discard auto-hinting data */
+ if ( face->autohint.finalizer )
+ face->autohint.finalizer( face->autohint.data );
+
+ /* Discard glyph slots for this face. */
+ /* Beware! FT_Done_GlyphSlot() changes the field `face->glyph' */
+ while ( face->glyph )
+ FT_Done_GlyphSlot( face->glyph );
+
+ /* discard all sizes for this face */
+ FT_List_Finalize( &face->sizes_list,
+ (FT_List_Destructor)destroy_size,
+ memory,
+ driver );
+ face->size = 0;
+
+ /* now discard client data */
+ if ( face->generic.finalizer )
+ face->generic.finalizer( face );
+
+ /* discard charmaps */
+ destroy_charmaps( face, memory );
+
+ /* finalize format-specific stuff */
+ if ( clazz->done_face )
+ clazz->done_face( face );
+
+ /* close the stream for this face if needed */
+ FT_Stream_Free(
+ face->stream,
+ ( face->face_flags & FT_FACE_FLAG_EXTERNAL_STREAM ) != 0 );
+
+ face->stream = 0;
+
+ /* get rid of it */
+ if ( face->internal )
+ {
+ FT_FREE( face->internal );
+ }
+ FT_FREE( face );
+ }
+
+
+ static void
+ Destroy_Driver( FT_Driver driver )
+ {
+ FT_List_Finalize( &driver->faces_list,
+ (FT_List_Destructor)destroy_face,
+ driver->root.memory,
+ driver );
+
+ /* check whether we need to drop the driver's glyph loader */
+ if ( FT_DRIVER_USES_OUTLINES( driver ) )
+ FT_GlyphLoader_Done( driver->glyph_loader );
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* find_unicode_charmap */
+ /* */
+ /* <Description> */
+ /* This function finds a Unicode charmap, if there is one. */
+ /* And if there is more than one, it tries to favour the more */
+ /* extensive one, i.e., one that supports UCS-4 against those which */
+ /* are limited to the BMP (said UCS-2 encoding.) */
+ /* */
+ /* This function is called from open_face() (just below), and also */
+ /* from FT_Select_Charmap( ..., FT_ENCODING_UNICODE ). */
+ /* */
+ static FT_Error
+ find_unicode_charmap( FT_Face face )
+ {
+ FT_CharMap* first;
+ FT_CharMap* cur;
+
+
+ /* caller should have already checked that `face' is valid */
+ FT_ASSERT( face );
+
+ first = face->charmaps;
+
+ if ( !first )
+ return FT_THROW( Invalid_CharMap_Handle );
+
+ /*
+ * The original TrueType specification(s) only specified charmap
+ * formats that are capable of mapping 8 or 16 bit character codes to
+ * glyph indices.
+ *
+ * However, recent updates to the Apple and OpenType specifications
+ * introduced new formats that are capable of mapping 32-bit character
+ * codes as well. And these are already used on some fonts, mainly to
+ * map non-BMP Asian ideographs as defined in Unicode.
+ *
+ * For compatibility purposes, these fonts generally come with
+ * *several* Unicode charmaps:
+ *
+ * - One of them in the "old" 16-bit format, that cannot access
+ * all glyphs in the font.
+ *
+ * - Another one in the "new" 32-bit format, that can access all
+ * the glyphs.
+ *
+ * This function has been written to always favor a 32-bit charmap
+ * when found. Otherwise, a 16-bit one is returned when found.
+ */
+
+ /* Since the `interesting' table, with IDs (3,10), is normally the */
+ /* last one, we loop backwards. This loses with type1 fonts with */
+ /* non-BMP characters (<.0001%), this wins with .ttf with non-BMP */
+ /* chars (.01% ?), and this is the same about 99.99% of the time! */
+
+ cur = first + face->num_charmaps; /* points after the last one */
+
+ for ( ; --cur >= first; )
+ {
+ if ( cur[0]->encoding == FT_ENCODING_UNICODE )
+ {
+ /* XXX If some new encodings to represent UCS-4 are added, */
+ /* they should be added here. */
+ if ( ( cur[0]->platform_id == TT_PLATFORM_MICROSOFT &&
+ cur[0]->encoding_id == TT_MS_ID_UCS_4 ) ||
+ ( cur[0]->platform_id == TT_PLATFORM_APPLE_UNICODE &&
+ cur[0]->encoding_id == TT_APPLE_ID_UNICODE_32 ) )
+ {
+#ifdef FT_MAX_CHARMAP_CACHEABLE
+ if ( cur - first > FT_MAX_CHARMAP_CACHEABLE )
+ {
+ FT_ERROR(( "find_unicode_charmap: UCS-4 cmap is found "
+ "at too late position (%d)\n", cur - first ));
+ continue;
+ }
+#endif
+ face->charmap = cur[0];
+ return FT_Err_Ok;
+ }
+ }
+ }
+
+ /* We do not have any UCS-4 charmap. */
+ /* Do the loop again and search for UCS-2 charmaps. */
+ cur = first + face->num_charmaps;
+
+ for ( ; --cur >= first; )
+ {
+ if ( cur[0]->encoding == FT_ENCODING_UNICODE )
+ {
+#ifdef FT_MAX_CHARMAP_CACHEABLE
+ if ( cur - first > FT_MAX_CHARMAP_CACHEABLE )
+ {
+ FT_ERROR(( "find_unicode_charmap: UCS-2 cmap is found "
+ "at too late position (%d)\n", cur - first ));
+ continue;
+ }
+#endif
+ face->charmap = cur[0];
+ return FT_Err_Ok;
+ }
+ }
+
+ return FT_THROW( Invalid_CharMap_Handle );
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* find_variant_selector_charmap */
+ /* */
+ /* <Description> */
+ /* This function finds the variant selector charmap, if there is one. */
+ /* There can only be one (platform=0, specific=5, format=14). */
+ /* */
+ static FT_CharMap
+ find_variant_selector_charmap( FT_Face face )
+ {
+ FT_CharMap* first;
+ FT_CharMap* end;
+ FT_CharMap* cur;
+
+
+ /* caller should have already checked that `face' is valid */
+ FT_ASSERT( face );
+
+ first = face->charmaps;
+
+ if ( !first )
+ return NULL;
+
+ end = first + face->num_charmaps; /* points after the last one */
+
+ for ( cur = first; cur < end; ++cur )
+ {
+ if ( cur[0]->platform_id == TT_PLATFORM_APPLE_UNICODE &&
+ cur[0]->encoding_id == TT_APPLE_ID_VARIANT_SELECTOR &&
+ FT_Get_CMap_Format( cur[0] ) == 14 )
+ {
+#ifdef FT_MAX_CHARMAP_CACHEABLE
+ if ( cur - first > FT_MAX_CHARMAP_CACHEABLE )
+ {
+ FT_ERROR(( "find_unicode_charmap: UVS cmap is found "
+ "at too late position (%d)\n", cur - first ));
+ continue;
+ }
+#endif
+ return cur[0];
+ }
+ }
+
+ return NULL;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* open_face */
+ /* */
+ /* <Description> */
+ /* This function does some work for FT_Open_Face(). */
+ /* */
+ static FT_Error
+ open_face( FT_Driver driver,
+ FT_Stream stream,
+ FT_Long face_index,
+ FT_Int num_params,
+ FT_Parameter* params,
+ FT_Face *aface )
+ {
+ FT_Memory memory;
+ FT_Driver_Class clazz;
+ FT_Face face = 0;
+ FT_Error error, error2;
+ FT_Face_Internal internal = NULL;
+
+
+ clazz = driver->clazz;
+ memory = driver->root.memory;
+
+ /* allocate the face object and perform basic initialization */
+ if ( FT_ALLOC( face, clazz->face_object_size ) )
+ goto Fail;
+
+ face->driver = driver;
+ face->memory = memory;
+ face->stream = stream;
+
+ if ( FT_NEW( internal ) )
+ goto Fail;
+
+ face->internal = internal;
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+ {
+ int i;
+
+
+ face->internal->incremental_interface = 0;
+ for ( i = 0; i < num_params && !face->internal->incremental_interface;
+ i++ )
+ if ( params[i].tag == FT_PARAM_TAG_INCREMENTAL )
+ face->internal->incremental_interface =
+ (FT_Incremental_Interface)params[i].data;
+ }
+#endif
+
+ if ( clazz->init_face )
+ error = clazz->init_face( stream,
+ face,
+ (FT_Int)face_index,
+ num_params,
+ params );
+ if ( error )
+ goto Fail;
+
+ /* select Unicode charmap by default */
+ error2 = find_unicode_charmap( face );
+
+ /* if no Unicode charmap can be found, FT_Err_Invalid_CharMap_Handle */
+ /* is returned. */
+
+ /* no error should happen, but we want to play safe */
+ if ( error2 && FT_ERR_NEQ( error2, Invalid_CharMap_Handle ) )
+ {
+ error = error2;
+ goto Fail;
+ }
+
+ *aface = face;
+
+ Fail:
+ if ( error )
+ {
+ destroy_charmaps( face, memory );
+ if ( clazz->done_face )
+ clazz->done_face( face );
+ FT_FREE( internal );
+ FT_FREE( face );
+ *aface = 0;
+ }
+
+ return error;
+ }
+
+
+ /* there's a Mac-specific extended implementation of FT_New_Face() */
+ /* in src/base/ftmac.c */
+
+//#ifndef FT_MACINTOSH
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_New_Face( FT_Library library,
+ const char* pathname,
+ FT_Long face_index,
+ FT_Face *aface )
+ {
+ FT_Open_Args args;
+
+
+ /* test for valid `library' and `aface' delayed to FT_Open_Face() */
+ if ( !pathname )
+ return FT_THROW( Invalid_Argument );
+
+ args.flags = FT_OPEN_PATHNAME;
+ args.pathname = (char*)pathname;
+ args.stream = NULL;
+
+ return FT_Open_Face( library, &args, face_index, aface );
+ }
+
+//#endif
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_New_Memory_Face( FT_Library library,
+ const FT_Byte* file_base,
+ FT_Long file_size,
+ FT_Long face_index,
+ FT_Face *aface )
+ {
+ FT_Open_Args args;
+
+
+ /* test for valid `library' and `face' delayed to FT_Open_Face() */
+ if ( !file_base )
+ return FT_THROW( Invalid_Argument );
+
+ args.flags = FT_OPEN_MEMORY;
+ args.memory_base = file_base;
+ args.memory_size = file_size;
+ args.stream = NULL;
+
+ return FT_Open_Face( library, &args, face_index, aface );
+ }
+
+
+#ifdef FT_CONFIG_OPTION_MAC_FONTS
+
+ /* The behavior here is very similar to that in base/ftmac.c, but it */
+ /* is designed to work on non-mac systems, so no mac specific calls. */
+ /* */
+ /* We look at the file and determine if it is a mac dfont file or a mac */
+ /* resource file, or a macbinary file containing a mac resource file. */
+ /* */
+ /* Unlike ftmac I'm not going to look at a `FOND'. I don't really see */
+ /* the point, especially since there may be multiple `FOND' resources. */
+ /* Instead I'll just look for `sfnt' and `POST' resources, ordered as */
+ /* they occur in the file. */
+ /* */
+ /* Note that multiple `POST' resources do not mean multiple postscript */
+ /* fonts; they all get jammed together to make what is essentially a */
+ /* pfb file. */
+ /* */
+ /* We aren't interested in `NFNT' or `FONT' bitmap resources. */
+ /* */
+ /* As soon as we get an `sfnt' load it into memory and pass it off to */
+ /* FT_Open_Face. */
+ /* */
+ /* If we have a (set of) `POST' resources, massage them into a (memory) */
+ /* pfb file and pass that to FT_Open_Face. (As with ftmac.c I'm not */
+ /* going to try to save the kerning info. After all that lives in the */
+ /* `FOND' which isn't in the file containing the `POST' resources so */
+ /* we don't really have access to it. */
+
+
+ /* Finalizer for a memory stream; gets called by FT_Done_Face(). */
+ /* It frees the memory it uses. */
+ /* From ftmac.c. */
+ static void
+ memory_stream_close( FT_Stream stream )
+ {
+ FT_Memory memory = stream->memory;
+
+
+ FT_FREE( stream->base );
+
+ stream->size = 0;
+ stream->base = 0;
+ stream->close = 0;
+ }
+
+
+ /* Create a new memory stream from a buffer and a size. */
+ /* From ftmac.c. */
+ static FT_Error
+ new_memory_stream( FT_Library library,
+ FT_Byte* base,
+ FT_ULong size,
+ FT_Stream_CloseFunc close,
+ FT_Stream *astream )
+ {
+ FT_Error error;
+ FT_Memory memory;
+ FT_Stream stream = NULL;
+
+
+ if ( !library )
+ return FT_THROW( Invalid_Library_Handle );
+
+ if ( !base )
+ return FT_THROW( Invalid_Argument );
+
+ *astream = 0;
+ memory = library->memory;
+ if ( FT_NEW( stream ) )
+ goto Exit;
+
+ FT_Stream_OpenMemory( stream, base, size );
+
+ stream->close = close;
+
+ *astream = stream;
+
+ Exit:
+ return error;
+ }
+
+
+ /* Create a new FT_Face given a buffer and a driver name. */
+ /* from ftmac.c */
+ FT_LOCAL_DEF( FT_Error )
+ open_face_from_buffer( FT_Library library,
+ FT_Byte* base,
+ FT_ULong size,
+ FT_Long face_index,
+ const char* driver_name,
+ FT_Face *aface )
+ {
+ FT_Open_Args args;
+ FT_Error error;
+ FT_Stream stream = NULL;
+ FT_Memory memory = library->memory;
+
+
+ error = new_memory_stream( library,
+ base,
+ size,
+ memory_stream_close,
+ &stream );
+ if ( error )
+ {
+ FT_FREE( base );
+ return error;
+ }
+
+ args.flags = FT_OPEN_STREAM;
+ args.stream = stream;
+ if ( driver_name )
+ {
+ args.flags = args.flags | FT_OPEN_DRIVER;
+ args.driver = FT_Get_Module( library, driver_name );
+ }
+
+#ifdef FT_MACINTOSH
+ /* At this point, face_index has served its purpose; */
+ /* whoever calls this function has already used it to */
+ /* locate the correct font data. We should not propagate */
+ /* this index to FT_Open_Face() (unless it is negative). */
+
+ if ( face_index > 0 )
+ face_index = 0;
+#endif
+
+ error = FT_Open_Face( library, &args, face_index, aface );
+
+ if ( error == FT_Err_Ok )
+ (*aface)->face_flags &= ~FT_FACE_FLAG_EXTERNAL_STREAM;
+ else
+#ifdef FT_MACINTOSH
+ FT_Stream_Free( stream, 0 );
+#else
+ {
+ FT_Stream_Close( stream );
+ FT_FREE( stream );
+ }
+#endif
+
+ return error;
+ }
+
+
+ /* Look up `TYP1' or `CID ' table from sfnt table directory. */
+ /* `offset' and `length' must exclude the binary header in tables. */
+
+ /* Type 1 and CID-keyed font drivers should recognize sfnt-wrapped */
+ /* format too. Here, since we can't expect that the TrueType font */
+ /* driver is loaded unconditially, we must parse the font by */
+ /* ourselves. We are only interested in the name of the table and */
+ /* the offset. */
+
+ static FT_Error
+ ft_lookup_PS_in_sfnt_stream( FT_Stream stream,
+ FT_Long face_index,
+ FT_ULong* offset,
+ FT_ULong* length,
+ FT_Bool* is_sfnt_cid )
+ {
+ FT_Error error;
+ FT_UShort numTables;
+ FT_Long pstable_index;
+ FT_ULong tag;
+ int i;
+
+
+ *offset = 0;
+ *length = 0;
+ *is_sfnt_cid = FALSE;
+
+ /* TODO: support for sfnt-wrapped PS/CID in TTC format */
+
+ /* version check for 'typ1' (should be ignored?) */
+ if ( FT_READ_ULONG( tag ) )
+ return error;
+ if ( tag != TTAG_typ1 )
+ return FT_THROW( Unknown_File_Format );
+
+ if ( FT_READ_USHORT( numTables ) )
+ return error;
+ if ( FT_STREAM_SKIP( 2 * 3 ) ) /* skip binary search header */
+ return error;
+
+ pstable_index = -1;
+ *is_sfnt_cid = FALSE;
+
+ for ( i = 0; i < numTables; i++ )
+ {
+ if ( FT_READ_ULONG( tag ) || FT_STREAM_SKIP( 4 ) ||
+ FT_READ_ULONG( *offset ) || FT_READ_ULONG( *length ) )
+ return error;
+
+ if ( tag == TTAG_CID )
+ {
+ pstable_index++;
+ *offset += 22;
+ *length -= 22;
+ *is_sfnt_cid = TRUE;
+ if ( face_index < 0 )
+ return FT_Err_Ok;
+ }
+ else if ( tag == TTAG_TYP1 )
+ {
+ pstable_index++;
+ *offset += 24;
+ *length -= 24;
+ *is_sfnt_cid = FALSE;
+ if ( face_index < 0 )
+ return FT_Err_Ok;
+ }
+ if ( face_index >= 0 && pstable_index == face_index )
+ return FT_Err_Ok;
+ }
+ return FT_THROW( Table_Missing );
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ open_face_PS_from_sfnt_stream( FT_Library library,
+ FT_Stream stream,
+ FT_Long face_index,
+ FT_Int num_params,
+ FT_Parameter *params,
+ FT_Face *aface )
+ {
+ FT_Error error;
+ FT_Memory memory = library->memory;
+ FT_ULong offset, length;
+ FT_Long pos;
+ FT_Bool is_sfnt_cid;
+ FT_Byte* sfnt_ps = NULL;
+
+ FT_UNUSED( num_params );
+ FT_UNUSED( params );
+
+
+ pos = FT_Stream_Pos( stream );
+
+ error = ft_lookup_PS_in_sfnt_stream( stream,
+ face_index,
+ &offset,
+ &length,
+ &is_sfnt_cid );
+ if ( error )
+ goto Exit;
+
+ if ( FT_Stream_Seek( stream, pos + offset ) )
+ goto Exit;
+
+ if ( FT_ALLOC( sfnt_ps, (FT_Long)length ) )
+ goto Exit;
+
+ error = FT_Stream_Read( stream, (FT_Byte *)sfnt_ps, length );
+ if ( error )
+ goto Exit;
+
+ error = open_face_from_buffer( library,
+ sfnt_ps,
+ length,
+ FT_MIN( face_index, 0 ),
+ is_sfnt_cid ? "cid" : "type1",
+ aface );
+ Exit:
+ {
+ FT_Error error1;
+
+
+ if ( FT_ERR_EQ( error, Unknown_File_Format ) )
+ {
+ error1 = FT_Stream_Seek( stream, pos );
+ if ( error1 )
+ return error1;
+ }
+
+ return error;
+ }
+ }
+
+
+#ifndef FT_MACINTOSH
+
+ /* The resource header says we've got resource_cnt `POST' (type1) */
+ /* resources in this file. They all need to be coalesced into */
+ /* one lump which gets passed on to the type1 driver. */
+ /* Here can be only one PostScript font in a file so face_index */
+ /* must be 0 (or -1). */
+ /* */
+ static FT_Error
+ Mac_Read_POST_Resource( FT_Library library,
+ FT_Stream stream,
+ FT_Long *offsets,
+ FT_Long resource_cnt,
+ FT_Long face_index,
+ FT_Face *aface )
+ {
+ FT_Error error = FT_ERR( Cannot_Open_Resource );
+ FT_Memory memory = library->memory;
+ FT_Byte* pfb_data = NULL;
+ int i, type, flags;
+ FT_Long len;
+ FT_Long pfb_len, pfb_pos, pfb_lenpos;
+ FT_Long rlen, temp;
+
+
+ if ( face_index == -1 )
+ face_index = 0;
+ if ( face_index != 0 )
+ return error;
+
+ /* Find the length of all the POST resources, concatenated. Assume */
+ /* worst case (each resource in its own section). */
+ pfb_len = 0;
+ for ( i = 0; i < resource_cnt; ++i )
+ {
+ error = FT_Stream_Seek( stream, offsets[i] );
+ if ( error )
+ goto Exit;
+ if ( FT_READ_LONG( temp ) )
+ goto Exit;
+ pfb_len += temp + 6;
+ }
+
+ if ( FT_ALLOC( pfb_data, (FT_Long)pfb_len + 2 ) )
+ goto Exit;
+
+ pfb_data[0] = 0x80;
+ pfb_data[1] = 1; /* Ascii section */
+ pfb_data[2] = 0; /* 4-byte length, fill in later */
+ pfb_data[3] = 0;
+ pfb_data[4] = 0;
+ pfb_data[5] = 0;
+ pfb_pos = 6;
+ pfb_lenpos = 2;
+
+ len = 0;
+ type = 1;
+ for ( i = 0; i < resource_cnt; ++i )
+ {
+ error = FT_Stream_Seek( stream, offsets[i] );
+ if ( error )
+ goto Exit2;
+ if ( FT_READ_LONG( rlen ) )
+ goto Exit;
+ if ( FT_READ_USHORT( flags ) )
+ goto Exit;
+ FT_TRACE3(( "POST fragment[%d]: offsets=0x%08x, rlen=0x%08x, flags=0x%04x\n",
+ i, offsets[i], rlen, flags ));
+
+ /* postpone the check of rlen longer than buffer until FT_Stream_Read() */
+ if ( ( flags >> 8 ) == 0 ) /* Comment, should not be loaded */
+ continue;
+
+ /* the flags are part of the resource, so rlen >= 2. */
+ /* but some fonts declare rlen = 0 for empty fragment */
+ if ( rlen > 2 )
+ rlen -= 2;
+ else
+ rlen = 0;
+
+ if ( ( flags >> 8 ) == type )
+ len += rlen;
+ else
+ {
+ if ( pfb_lenpos + 3 > pfb_len + 2 )
+ goto Exit2;
+ pfb_data[pfb_lenpos ] = (FT_Byte)( len );
+ pfb_data[pfb_lenpos + 1] = (FT_Byte)( len >> 8 );
+ pfb_data[pfb_lenpos + 2] = (FT_Byte)( len >> 16 );
+ pfb_data[pfb_lenpos + 3] = (FT_Byte)( len >> 24 );
+
+ if ( ( flags >> 8 ) == 5 ) /* End of font mark */
+ break;
+
+ if ( pfb_pos + 6 > pfb_len + 2 )
+ goto Exit2;
+ pfb_data[pfb_pos++] = 0x80;
+
+ type = flags >> 8;
+ len = rlen;
+
+ pfb_data[pfb_pos++] = (FT_Byte)type;
+ pfb_lenpos = pfb_pos;
+ pfb_data[pfb_pos++] = 0; /* 4-byte length, fill in later */
+ pfb_data[pfb_pos++] = 0;
+ pfb_data[pfb_pos++] = 0;
+ pfb_data[pfb_pos++] = 0;
+ }
+
+ error = FT_ERR( Cannot_Open_Resource );
+ if ( pfb_pos > pfb_len || pfb_pos + rlen > pfb_len )
+ goto Exit2;
+
+ error = FT_Stream_Read( stream, (FT_Byte *)pfb_data + pfb_pos, rlen );
+ if ( error )
+ goto Exit2;
+ pfb_pos += rlen;
+ }
+
+ if ( pfb_pos + 2 > pfb_len + 2 )
+ goto Exit2;
+ pfb_data[pfb_pos++] = 0x80;
+ pfb_data[pfb_pos++] = 3;
+
+ if ( pfb_lenpos + 3 > pfb_len + 2 )
+ goto Exit2;
+ pfb_data[pfb_lenpos ] = (FT_Byte)( len );
+ pfb_data[pfb_lenpos + 1] = (FT_Byte)( len >> 8 );
+ pfb_data[pfb_lenpos + 2] = (FT_Byte)( len >> 16 );
+ pfb_data[pfb_lenpos + 3] = (FT_Byte)( len >> 24 );
+
+ return open_face_from_buffer( library,
+ pfb_data,
+ pfb_pos,
+ face_index,
+ "type1",
+ aface );
+
+ Exit2:
+ FT_FREE( pfb_data );
+
+ Exit:
+ return error;
+ }
+
+
+ /* The resource header says we've got resource_cnt `sfnt' */
+ /* (TrueType/OpenType) resources in this file. Look through */
+ /* them for the one indicated by face_index, load it into mem, */
+ /* pass it on the the truetype driver and return it. */
+ /* */
+ static FT_Error
+ Mac_Read_sfnt_Resource( FT_Library library,
+ FT_Stream stream,
+ FT_Long *offsets,
+ FT_Long resource_cnt,
+ FT_Long face_index,
+ FT_Face *aface )
+ {
+ FT_Memory memory = library->memory;
+ FT_Byte* sfnt_data = NULL;
+ FT_Error error;
+ FT_Long flag_offset;
+ FT_Long rlen;
+ int is_cff;
+ FT_Long face_index_in_resource = 0;
+
+
+ if ( face_index == -1 )
+ face_index = 0;
+ if ( face_index >= resource_cnt )
+ return FT_THROW( Cannot_Open_Resource );
+
+ flag_offset = offsets[face_index];
+ error = FT_Stream_Seek( stream, flag_offset );
+ if ( error )
+ goto Exit;
+
+ if ( FT_READ_LONG( rlen ) )
+ goto Exit;
+ if ( rlen == -1 )
+ return FT_THROW( Cannot_Open_Resource );
+
+ error = open_face_PS_from_sfnt_stream( library,
+ stream,
+ face_index,
+ 0, NULL,
+ aface );
+ if ( !error )
+ goto Exit;
+
+ /* rewind sfnt stream before open_face_PS_from_sfnt_stream() */
+ if ( FT_Stream_Seek( stream, flag_offset + 4 ) )
+ goto Exit;
+
+ if ( FT_ALLOC( sfnt_data, (FT_Long)rlen ) )
+ return error;
+ error = FT_Stream_Read( stream, (FT_Byte *)sfnt_data, rlen );
+ if ( error )
+ goto Exit;
+
+ is_cff = rlen > 4 && !ft_memcmp( sfnt_data, "OTTO", 4 );
+ error = open_face_from_buffer( library,
+ sfnt_data,
+ rlen,
+ face_index_in_resource,
+ is_cff ? "cff" : "truetype",
+ aface );
+
+ Exit:
+ return error;
+ }
+
+
+ /* Check for a valid resource fork header, or a valid dfont */
+ /* header. In a resource fork the first 16 bytes are repeated */
+ /* at the location specified by bytes 4-7. In a dfont bytes */
+ /* 4-7 point to 16 bytes of zeroes instead. */
+ /* */
+ static FT_Error
+ IsMacResource( FT_Library library,
+ FT_Stream stream,
+ FT_Long resource_offset,
+ FT_Long face_index,
+ FT_Face *aface )
+ {
+ FT_Memory memory = library->memory;
+ FT_Error error;
+ FT_Long map_offset, rdara_pos;
+ FT_Long *data_offsets;
+ FT_Long count;
+
+
+ error = FT_Raccess_Get_HeaderInfo( library, stream, resource_offset,
+ &map_offset, &rdara_pos );
+ if ( error )
+ return error;
+
+ error = FT_Raccess_Get_DataOffsets( library, stream,
+ map_offset, rdara_pos,
+ TTAG_POST,
+ &data_offsets, &count );
+ if ( !error )
+ {
+ error = Mac_Read_POST_Resource( library, stream, data_offsets, count,
+ face_index, aface );
+ FT_FREE( data_offsets );
+ /* POST exists in an LWFN providing a single face */
+ if ( !error )
+ (*aface)->num_faces = 1;
+ return error;
+ }
+
+ error = FT_Raccess_Get_DataOffsets( library, stream,
+ map_offset, rdara_pos,
+ TTAG_sfnt,
+ &data_offsets, &count );
+ if ( !error )
+ {
+ FT_Long face_index_internal = face_index % count;
+
+
+ error = Mac_Read_sfnt_Resource( library, stream, data_offsets, count,
+ face_index_internal, aface );
+ FT_FREE( data_offsets );
+ if ( !error )
+ (*aface)->num_faces = count;
+ }
+
+ return error;
+ }
+
+
+ /* Check for a valid macbinary header, and if we find one */
+ /* check that the (flattened) resource fork in it is valid. */
+ /* */
+ static FT_Error
+ IsMacBinary( FT_Library library,
+ FT_Stream stream,
+ FT_Long face_index,
+ FT_Face *aface )
+ {
+ unsigned char header[128];
+ FT_Error error;
+ FT_Long dlen, offset;
+
+
+ if ( NULL == stream )
+ return FT_THROW( Invalid_Stream_Operation );
+
+ error = FT_Stream_Seek( stream, 0 );
+ if ( error )
+ goto Exit;
+
+ error = FT_Stream_Read( stream, (FT_Byte*)header, 128 );
+ if ( error )
+ goto Exit;
+
+ if ( header[ 0] != 0 ||
+ header[74] != 0 ||
+ header[82] != 0 ||
+ header[ 1] == 0 ||
+ header[ 1] > 33 ||
+ header[63] != 0 ||
+ header[2 + header[1]] != 0 )
+ return FT_THROW( Unknown_File_Format );
+
+ dlen = ( header[0x53] << 24 ) |
+ ( header[0x54] << 16 ) |
+ ( header[0x55] << 8 ) |
+ header[0x56];
+#if 0
+ rlen = ( header[0x57] << 24 ) |
+ ( header[0x58] << 16 ) |
+ ( header[0x59] << 8 ) |
+ header[0x5a];
+#endif /* 0 */
+ offset = 128 + ( ( dlen + 127 ) & ~127 );
+
+ return IsMacResource( library, stream, offset, face_index, aface );
+
+ Exit:
+ return error;
+ }
+
+
+ static FT_Error
+ load_face_in_embedded_rfork( FT_Library library,
+ FT_Stream stream,
+ FT_Long face_index,
+ FT_Face *aface,
+ const FT_Open_Args *args )
+ {
+
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_raccess
+
+ FT_Memory memory = library->memory;
+ FT_Error error = FT_ERR( Unknown_File_Format );
+ int i;
+
+ char * file_names[FT_RACCESS_N_RULES];
+ FT_Long offsets[FT_RACCESS_N_RULES];
+ FT_Error errors[FT_RACCESS_N_RULES];
+ FT_Bool is_darwin_vfs, vfs_rfork_has_no_font = FALSE; /* not tested */
+
+ FT_Open_Args args2;
+ FT_Stream stream2 = 0;
+
+
+ FT_Raccess_Guess( library, stream,
+ args->pathname, file_names, offsets, errors );
+
+ for ( i = 0; i < FT_RACCESS_N_RULES; i++ )
+ {
+ is_darwin_vfs = ft_raccess_rule_by_darwin_vfs( library, i );
+ if ( is_darwin_vfs && vfs_rfork_has_no_font )
+ {
+ FT_TRACE3(( "Skip rule %d: darwin vfs resource fork"
+ " is already checked and"
+ " no font is found\n", i ));
+ continue;
+ }
+
+ if ( errors[i] )
+ {
+ FT_TRACE3(( "Error[%d] has occurred in rule %d\n", errors[i], i ));
+ continue;
+ }
+
+ args2.flags = FT_OPEN_PATHNAME;
+ args2.pathname = file_names[i] ? file_names[i] : args->pathname;
+
+ FT_TRACE3(( "Try rule %d: %s (offset=%d) ...",
+ i, args2.pathname, offsets[i] ));
+
+ error = FT_Stream_New( library, &args2, &stream2 );
+ if ( is_darwin_vfs && FT_ERR_EQ( error, Cannot_Open_Stream ) )
+ vfs_rfork_has_no_font = TRUE;
+
+ if ( error )
+ {
+ FT_TRACE3(( "failed\n" ));
+ continue;
+ }
+
+ error = IsMacResource( library, stream2, offsets[i],
+ face_index, aface );
+ FT_Stream_Free( stream2, 0 );
+
+ FT_TRACE3(( "%s\n", error ? "failed": "successful" ));
+
+ if ( !error )
+ break;
+ else if ( is_darwin_vfs )
+ vfs_rfork_has_no_font = TRUE;
+ }
+
+ for (i = 0; i < FT_RACCESS_N_RULES; i++)
+ {
+ if ( file_names[i] )
+ FT_FREE( file_names[i] );
+ }
+
+ /* Caller (load_mac_face) requires FT_Err_Unknown_File_Format. */
+ if ( error )
+ error = FT_ERR( Unknown_File_Format );
+
+ return error;
+
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_objs
+
+ }
+
+
+ /* Check for some macintosh formats without Carbon framework. */
+ /* Is this a macbinary file? If so look at the resource fork. */
+ /* Is this a mac dfont file? */
+ /* Is this an old style resource fork? (in data) */
+ /* Else call load_face_in_embedded_rfork to try extra rules */
+ /* (defined in `ftrfork.c'). */
+ /* */
+ static FT_Error
+ load_mac_face( FT_Library library,
+ FT_Stream stream,
+ FT_Long face_index,
+ FT_Face *aface,
+ const FT_Open_Args *args )
+ {
+ FT_Error error;
+ FT_UNUSED( args );
+
+
+ error = IsMacBinary( library, stream, face_index, aface );
+ if ( FT_ERR_EQ( error, Unknown_File_Format ) )
+ {
+
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_raccess
+
+ FT_TRACE3(( "Try as dfont: %s ...", args->pathname ));
+
+ error = IsMacResource( library, stream, 0, face_index, aface );
+
+ FT_TRACE3(( "%s\n", error ? "failed" : "successful" ));
+
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_objs
+
+ }
+
+ if ( ( FT_ERR_EQ( error, Unknown_File_Format ) ||
+ FT_ERR_EQ( error, Invalid_Stream_Operation ) ) &&
+ ( args->flags & FT_OPEN_PATHNAME ) )
+ error = load_face_in_embedded_rfork( library, stream,
+ face_index, aface, args );
+ return error;
+ }
+#endif
+
+#endif /* !FT_MACINTOSH && FT_CONFIG_OPTION_MAC_FONTS */
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Open_Face( FT_Library library,
+ const FT_Open_Args* args,
+ FT_Long face_index,
+ FT_Face *aface )
+ {
+ FT_Error error;
+ FT_Driver driver = NULL;
+ FT_Memory memory = NULL;
+ FT_Stream stream = NULL;
+ FT_Face face = NULL;
+ FT_ListNode node = NULL;
+ FT_Bool external_stream;
+ FT_Module* cur;
+ FT_Module* limit;
+
+
+ /* test for valid `library' delayed to */
+ /* FT_Stream_New() */
+
+ if ( ( !aface && face_index >= 0 ) || !args )
+ return FT_THROW( Invalid_Argument );
+
+ external_stream = FT_BOOL( ( args->flags & FT_OPEN_STREAM ) &&
+ args->stream );
+
+ /* create input stream */
+ error = FT_Stream_New( library, args, &stream );
+ if ( error )
+ goto Fail3;
+
+ memory = library->memory;
+
+ /* If the font driver is specified in the `args' structure, use */
+ /* it. Otherwise, we scan the list of registered drivers. */
+ if ( ( args->flags & FT_OPEN_DRIVER ) && args->driver )
+ {
+ driver = FT_DRIVER( args->driver );
+
+ /* not all modules are drivers, so check... */
+ if ( FT_MODULE_IS_DRIVER( driver ) )
+ {
+ FT_Int num_params = 0;
+ FT_Parameter* params = 0;
+
+
+ if ( args->flags & FT_OPEN_PARAMS )
+ {
+ num_params = args->num_params;
+ params = args->params;
+ }
+
+ error = open_face( driver, stream, face_index,
+ num_params, params, &face );
+ if ( !error )
+ goto Success;
+ }
+ else
+ error = FT_THROW( Invalid_Handle );
+
+ FT_Stream_Free( stream, external_stream );
+ goto Fail;
+ }
+ else
+ {
+ error = FT_ERR( Missing_Module );
+
+ /* check each font driver for an appropriate format */
+ cur = library->modules;
+ limit = cur + library->num_modules;
+
+ for ( ; cur < limit; cur++ )
+ {
+ /* not all modules are font drivers, so check... */
+ if ( FT_MODULE_IS_DRIVER( cur[0] ) )
+ {
+ FT_Int num_params = 0;
+ FT_Parameter* params = 0;
+
+
+ driver = FT_DRIVER( cur[0] );
+
+ if ( args->flags & FT_OPEN_PARAMS )
+ {
+ num_params = args->num_params;
+ params = args->params;
+ }
+
+ error = open_face( driver, stream, face_index,
+ num_params, params, &face );
+ if ( !error )
+ goto Success;
+
+#ifdef FT_CONFIG_OPTION_MAC_FONTS
+ if ( ft_strcmp( cur[0]->clazz->module_name, "truetype" ) == 0 &&
+ FT_ERR_EQ( error, Table_Missing ) )
+ {
+ /* TrueType but essential tables are missing */
+ if ( FT_Stream_Seek( stream, 0 ) )
+ break;
+
+ error = open_face_PS_from_sfnt_stream( library,
+ stream,
+ face_index,
+ num_params,
+ params,
+ aface );
+ if ( !error )
+ {
+ FT_Stream_Free( stream, external_stream );
+ return error;
+ }
+ }
+#endif
+
+ if ( FT_ERR_NEQ( error, Unknown_File_Format ) )
+ goto Fail3;
+ }
+ }
+
+ Fail3:
+ /* If we are on the mac, and we get an */
+ /* FT_Err_Invalid_Stream_Operation it may be because we have an */
+ /* empty data fork, so we need to check the resource fork. */
+ if ( FT_ERR_NEQ( error, Cannot_Open_Stream ) &&
+ FT_ERR_NEQ( error, Unknown_File_Format ) &&
+ FT_ERR_NEQ( error, Invalid_Stream_Operation ) )
+ goto Fail2;
+
+#if !defined( FT_MACINTOSH ) && defined( FT_CONFIG_OPTION_MAC_FONTS )
+ error = load_mac_face( library, stream, face_index, aface, args );
+ if ( !error )
+ {
+ /* We don't want to go to Success here. We've already done that. */
+ /* On the other hand, if we succeeded we still need to close this */
+ /* stream (we opened a different stream which extracted the */
+ /* interesting information out of this stream here. That stream */
+ /* will still be open and the face will point to it). */
+ FT_Stream_Free( stream, external_stream );
+ return error;
+ }
+
+ if ( FT_ERR_NEQ( error, Unknown_File_Format ) )
+ goto Fail2;
+#endif /* !FT_MACINTOSH && FT_CONFIG_OPTION_MAC_FONTS */
+
+ /* no driver is able to handle this format */
+ error = FT_THROW( Unknown_File_Format );
+
+ Fail2:
+ FT_Stream_Free( stream, external_stream );
+ goto Fail;
+ }
+
+ Success:
+ FT_TRACE4(( "FT_Open_Face: New face object, adding to list\n" ));
+
+ /* set the FT_FACE_FLAG_EXTERNAL_STREAM bit for FT_Done_Face */
+ if ( external_stream )
+ face->face_flags |= FT_FACE_FLAG_EXTERNAL_STREAM;
+
+ /* add the face object to its driver's list */
+ if ( FT_NEW( node ) )
+ goto Fail;
+
+ node->data = face;
+ /* don't assume driver is the same as face->driver, so use */
+ /* face->driver instead. */
+ FT_List_Add( &face->driver->faces_list, node );
+
+ /* now allocate a glyph slot object for the face */
+ FT_TRACE4(( "FT_Open_Face: Creating glyph slot\n" ));
+
+ if ( face_index >= 0 )
+ {
+ error = FT_New_GlyphSlot( face, NULL );
+ if ( error )
+ goto Fail;
+
+ /* finally, allocate a size object for the face */
+ {
+ FT_Size size;
+
+
+ FT_TRACE4(( "FT_Open_Face: Creating size object\n" ));
+
+ error = FT_New_Size( face, &size );
+ if ( error )
+ goto Fail;
+
+ face->size = size;
+ }
+ }
+
+ /* some checks */
+
+ if ( FT_IS_SCALABLE( face ) )
+ {
+ if ( face->height < 0 )
+ face->height = (FT_Short)-face->height;
+
+ if ( !FT_HAS_VERTICAL( face ) )
+ face->max_advance_height = (FT_Short)face->height;
+ }
+
+ if ( FT_HAS_FIXED_SIZES( face ) )
+ {
+ FT_Int i;
+
+
+ for ( i = 0; i < face->num_fixed_sizes; i++ )
+ {
+ FT_Bitmap_Size* bsize = face->available_sizes + i;
+
+
+ if ( bsize->height < 0 )
+ bsize->height = (FT_Short)-bsize->height;
+ if ( bsize->x_ppem < 0 )
+ bsize->x_ppem = (FT_Short)-bsize->x_ppem;
+ if ( bsize->y_ppem < 0 )
+ bsize->y_ppem = -bsize->y_ppem;
+ }
+ }
+
+ /* initialize internal face data */
+ {
+ FT_Face_Internal internal = face->internal;
+
+
+ internal->transform_matrix.xx = 0x10000L;
+ internal->transform_matrix.xy = 0;
+ internal->transform_matrix.yx = 0;
+ internal->transform_matrix.yy = 0x10000L;
+
+ internal->transform_delta.x = 0;
+ internal->transform_delta.y = 0;
+
+ internal->refcount = 1;
+ }
+
+ if ( aface )
+ *aface = face;
+ else
+ FT_Done_Face( face );
+
+ goto Exit;
+
+ Fail:
+ if ( node )
+ FT_Done_Face( face ); /* face must be in the driver's list */
+ else if ( face )
+ destroy_face( memory, face, driver );
+
+ Exit:
+ FT_TRACE4(( "FT_Open_Face: Return %d\n", error ));
+
+ return error;
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Attach_File( FT_Face face,
+ const char* filepathname )
+ {
+ FT_Open_Args open;
+
+
+ /* test for valid `face' delayed to FT_Attach_Stream() */
+
+ if ( !filepathname )
+ return FT_THROW( Invalid_Argument );
+
+ open.stream = NULL;
+ open.flags = FT_OPEN_PATHNAME;
+ open.pathname = (char*)filepathname;
+
+ return FT_Attach_Stream( face, &open );
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Attach_Stream( FT_Face face,
+ FT_Open_Args* parameters )
+ {
+ FT_Stream stream;
+ FT_Error error;
+ FT_Driver driver;
+
+ FT_Driver_Class clazz;
+
+
+ /* test for valid `parameters' delayed to FT_Stream_New() */
+
+ if ( !face )
+ return FT_THROW( Invalid_Face_Handle );
+
+ driver = face->driver;
+ if ( !driver )
+ return FT_THROW( Invalid_Driver_Handle );
+
+ error = FT_Stream_New( driver->root.library, parameters, &stream );
+ if ( error )
+ goto Exit;
+
+ /* we implement FT_Attach_Stream in each driver through the */
+ /* `attach_file' interface */
+
+ error = FT_ERR( Unimplemented_Feature );
+ clazz = driver->clazz;
+ if ( clazz->attach_file )
+ error = clazz->attach_file( face, stream );
+
+ /* close the attached stream */
+ FT_Stream_Free( stream,
+ (FT_Bool)( parameters->stream &&
+ ( parameters->flags & FT_OPEN_STREAM ) ) );
+
+ Exit:
+ return error;
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Reference_Face( FT_Face face )
+ {
+ face->internal->refcount++;
+
+ return FT_Err_Ok;
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Done_Face( FT_Face face )
+ {
+ FT_Error error;
+ FT_Driver driver;
+ FT_Memory memory;
+ FT_ListNode node;
+
+
+ error = FT_ERR( Invalid_Face_Handle );
+ if ( face && face->driver )
+ {
+ face->internal->refcount--;
+ if ( face->internal->refcount > 0 )
+ error = FT_Err_Ok;
+ else
+ {
+ driver = face->driver;
+ memory = driver->root.memory;
+
+ /* find face in driver's list */
+ node = FT_List_Find( &driver->faces_list, face );
+ if ( node )
+ {
+ /* remove face object from the driver's list */
+ FT_List_Remove( &driver->faces_list, node );
+ FT_FREE( node );
+
+ /* now destroy the object proper */
+ destroy_face( memory, face, driver );
+ error = FT_Err_Ok;
+ }
+ }
+ }
+
+ return error;
+ }
+
+
+ /* documentation is in ftobjs.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_New_Size( FT_Face face,
+ FT_Size *asize )
+ {
+ FT_Error error;
+ FT_Memory memory;
+ FT_Driver driver;
+ FT_Driver_Class clazz;
+
+ FT_Size size = 0;
+ FT_ListNode node = 0;
+
+
+ if ( !face )
+ return FT_THROW( Invalid_Face_Handle );
+
+ if ( !asize )
+ return FT_THROW( Invalid_Size_Handle );
+
+ if ( !face->driver )
+ return FT_THROW( Invalid_Driver_Handle );
+
+ *asize = 0;
+
+ driver = face->driver;
+ clazz = driver->clazz;
+ memory = face->memory;
+
+ /* Allocate new size object and perform basic initialisation */
+ if ( FT_ALLOC( size, clazz->size_object_size ) || FT_NEW( node ) )
+ goto Exit;
+
+ size->face = face;
+
+ /* for now, do not use any internal fields in size objects */
+ size->internal = 0;
+
+ if ( clazz->init_size )
+ error = clazz->init_size( size );
+
+ /* in case of success, add to the face's list */
+ if ( !error )
+ {
+ *asize = size;
+ node->data = size;
+ FT_List_Add( &face->sizes_list, node );
+ }
+
+ Exit:
+ if ( error )
+ {
+ FT_FREE( node );
+ FT_FREE( size );
+ }
+
+ return error;
+ }
+
+
+ /* documentation is in ftobjs.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Done_Size( FT_Size size )
+ {
+ FT_Error error;
+ FT_Driver driver;
+ FT_Memory memory;
+ FT_Face face;
+ FT_ListNode node;
+
+
+ if ( !size )
+ return FT_THROW( Invalid_Size_Handle );
+
+ face = size->face;
+ if ( !face )
+ return FT_THROW( Invalid_Face_Handle );
+
+ driver = face->driver;
+ if ( !driver )
+ return FT_THROW( Invalid_Driver_Handle );
+
+ memory = driver->root.memory;
+
+ error = FT_Err_Ok;
+ node = FT_List_Find( &face->sizes_list, size );
+ if ( node )
+ {
+ FT_List_Remove( &face->sizes_list, node );
+ FT_FREE( node );
+
+ if ( face->size == size )
+ {
+ face->size = 0;
+ if ( face->sizes_list.head )
+ face->size = (FT_Size)(face->sizes_list.head->data);
+ }
+
+ destroy_size( memory, size, driver );
+ }
+ else
+ error = FT_THROW( Invalid_Size_Handle );
+
+ return error;
+ }
+
+
+ /* documentation is in ftobjs.h */
+
+ FT_BASE_DEF( FT_Error )
+ FT_Match_Size( FT_Face face,
+ FT_Size_Request req,
+ FT_Bool ignore_width,
+ FT_ULong* size_index )
+ {
+ FT_Int i;
+ FT_Long w, h;
+
+
+ if ( !FT_HAS_FIXED_SIZES( face ) )
+ return FT_THROW( Invalid_Face_Handle );
+
+ /* FT_Bitmap_Size doesn't provide enough info... */
+ if ( req->type != FT_SIZE_REQUEST_TYPE_NOMINAL )
+ return FT_THROW( Unimplemented_Feature );
+
+ w = FT_REQUEST_WIDTH ( req );
+ h = FT_REQUEST_HEIGHT( req );
+
+ if ( req->width && !req->height )
+ h = w;
+ else if ( !req->width && req->height )
+ w = h;
+
+ w = FT_PIX_ROUND( w );
+ h = FT_PIX_ROUND( h );
+
+ for ( i = 0; i < face->num_fixed_sizes; i++ )
+ {
+ FT_Bitmap_Size* bsize = face->available_sizes + i;
+
+
+ if ( h != FT_PIX_ROUND( bsize->y_ppem ) )
+ continue;
+
+ if ( w == FT_PIX_ROUND( bsize->x_ppem ) || ignore_width )
+ {
+ FT_TRACE3(( "FT_Match_Size: bitmap strike %d matches\n", i ));
+
+ if ( size_index )
+ *size_index = (FT_ULong)i;
+
+ return FT_Err_Ok;
+ }
+ }
+
+ return FT_THROW( Invalid_Pixel_Size );
+ }
+
+
+ /* documentation is in ftobjs.h */
+
+ FT_BASE_DEF( void )
+ ft_synthesize_vertical_metrics( FT_Glyph_Metrics* metrics,
+ FT_Pos advance )
+ {
+ FT_Pos height = metrics->height;
+
+
+ /* compensate for glyph with bbox above/below the baseline */
+ if ( metrics->horiBearingY < 0 )
+ {
+ if ( height < metrics->horiBearingY )
+ height = metrics->horiBearingY;
+ }
+ else if ( metrics->horiBearingY > 0 )
+ height -= metrics->horiBearingY;
+
+ /* the factor 1.2 is a heuristical value */
+ if ( !advance )
+ advance = height * 12 / 10;
+
+ metrics->vertBearingX = metrics->horiBearingX - metrics->horiAdvance / 2;
+ metrics->vertBearingY = ( advance - height ) / 2;
+ metrics->vertAdvance = advance;
+ }
+
+
+ static void
+ ft_recompute_scaled_metrics( FT_Face face,
+ FT_Size_Metrics* metrics )
+ {
+ /* Compute root ascender, descender, test height, and max_advance */
+
+#ifdef GRID_FIT_METRICS
+ metrics->ascender = FT_PIX_CEIL( FT_MulFix( face->ascender,
+ metrics->y_scale ) );
+
+ metrics->descender = FT_PIX_FLOOR( FT_MulFix( face->descender,
+ metrics->y_scale ) );
+
+ metrics->height = FT_PIX_ROUND( FT_MulFix( face->height,
+ metrics->y_scale ) );
+
+ metrics->max_advance = FT_PIX_ROUND( FT_MulFix( face->max_advance_width,
+ metrics->x_scale ) );
+#else /* !GRID_FIT_METRICS */
+ metrics->ascender = FT_MulFix( face->ascender,
+ metrics->y_scale );
+
+ metrics->descender = FT_MulFix( face->descender,
+ metrics->y_scale );
+
+ metrics->height = FT_MulFix( face->height,
+ metrics->y_scale );
+
+ metrics->max_advance = FT_MulFix( face->max_advance_width,
+ metrics->x_scale );
+#endif /* !GRID_FIT_METRICS */
+ }
+
+
+ FT_BASE_DEF( void )
+ FT_Select_Metrics( FT_Face face,
+ FT_ULong strike_index )
+ {
+ FT_Size_Metrics* metrics;
+ FT_Bitmap_Size* bsize;
+
+
+ metrics = &face->size->metrics;
+ bsize = face->available_sizes + strike_index;
+
+ metrics->x_ppem = (FT_UShort)( ( bsize->x_ppem + 32 ) >> 6 );
+ metrics->y_ppem = (FT_UShort)( ( bsize->y_ppem + 32 ) >> 6 );
+
+ if ( FT_IS_SCALABLE( face ) )
+ {
+ metrics->x_scale = FT_DivFix( bsize->x_ppem,
+ face->units_per_EM );
+ metrics->y_scale = FT_DivFix( bsize->y_ppem,
+ face->units_per_EM );
+
+ ft_recompute_scaled_metrics( face, metrics );
+ }
+ else
+ {
+ metrics->x_scale = 1L << 16;
+ metrics->y_scale = 1L << 16;
+ metrics->ascender = bsize->y_ppem;
+ metrics->descender = 0;
+ metrics->height = bsize->height << 6;
+ metrics->max_advance = bsize->x_ppem;
+ }
+
+ FT_TRACE5(( "FT_Select_Metrics:\n" ));
+ FT_TRACE5(( " x scale: %d (%f)\n",
+ metrics->x_scale, metrics->x_scale / 65536.0 ));
+ FT_TRACE5(( " y scale: %d (%f)\n",
+ metrics->y_scale, metrics->y_scale / 65536.0 ));
+ FT_TRACE5(( " ascender: %f\n", metrics->ascender / 64.0 ));
+ FT_TRACE5(( " descender: %f\n", metrics->descender / 64.0 ));
+ FT_TRACE5(( " height: %f\n", metrics->height / 64.0 ));
+ FT_TRACE5(( " max advance: %f\n", metrics->max_advance / 64.0 ));
+ FT_TRACE5(( " x ppem: %d\n", metrics->x_ppem ));
+ FT_TRACE5(( " y ppem: %d\n", metrics->y_ppem ));
+ }
+
+
+ FT_BASE_DEF( void )
+ FT_Request_Metrics( FT_Face face,
+ FT_Size_Request req )
+ {
+ FT_Size_Metrics* metrics;
+
+
+ metrics = &face->size->metrics;
+
+ if ( FT_IS_SCALABLE( face ) )
+ {
+ FT_Long w = 0, h = 0, scaled_w = 0, scaled_h = 0;
+
+
+ switch ( req->type )
+ {
+ case FT_SIZE_REQUEST_TYPE_NOMINAL:
+ w = h = face->units_per_EM;
+ break;
+
+ case FT_SIZE_REQUEST_TYPE_REAL_DIM:
+ w = h = face->ascender - face->descender;
+ break;
+
+ case FT_SIZE_REQUEST_TYPE_BBOX:
+ w = face->bbox.xMax - face->bbox.xMin;
+ h = face->bbox.yMax - face->bbox.yMin;
+ break;
+
+ case FT_SIZE_REQUEST_TYPE_CELL:
+ w = face->max_advance_width;
+ h = face->ascender - face->descender;
+ break;
+
+ case FT_SIZE_REQUEST_TYPE_SCALES:
+ metrics->x_scale = (FT_Fixed)req->width;
+ metrics->y_scale = (FT_Fixed)req->height;
+ if ( !metrics->x_scale )
+ metrics->x_scale = metrics->y_scale;
+ else if ( !metrics->y_scale )
+ metrics->y_scale = metrics->x_scale;
+ goto Calculate_Ppem;
+
+ case FT_SIZE_REQUEST_TYPE_MAX:
+ break;
+ }
+
+ /* to be on the safe side */
+ if ( w < 0 )
+ w = -w;
+
+ if ( h < 0 )
+ h = -h;
+
+ scaled_w = FT_REQUEST_WIDTH ( req );
+ scaled_h = FT_REQUEST_HEIGHT( req );
+
+ /* determine scales */
+ if ( req->width )
+ {
+ metrics->x_scale = FT_DivFix( scaled_w, w );
+
+ if ( req->height )
+ {
+ metrics->y_scale = FT_DivFix( scaled_h, h );
+
+ if ( req->type == FT_SIZE_REQUEST_TYPE_CELL )
+ {
+ if ( metrics->y_scale > metrics->x_scale )
+ metrics->y_scale = metrics->x_scale;
+ else
+ metrics->x_scale = metrics->y_scale;
+ }
+ }
+ else
+ {
+ metrics->y_scale = metrics->x_scale;
+ scaled_h = FT_MulDiv( scaled_w, h, w );
+ }
+ }
+ else
+ {
+ metrics->x_scale = metrics->y_scale = FT_DivFix( scaled_h, h );
+ scaled_w = FT_MulDiv( scaled_h, w, h );
+ }
+
+ Calculate_Ppem:
+ /* calculate the ppems */
+ if ( req->type != FT_SIZE_REQUEST_TYPE_NOMINAL )
+ {
+ scaled_w = FT_MulFix( face->units_per_EM, metrics->x_scale );
+ scaled_h = FT_MulFix( face->units_per_EM, metrics->y_scale );
+ }
+
+ metrics->x_ppem = (FT_UShort)( ( scaled_w + 32 ) >> 6 );
+ metrics->y_ppem = (FT_UShort)( ( scaled_h + 32 ) >> 6 );
+
+ ft_recompute_scaled_metrics( face, metrics );
+ }
+ else
+ {
+ FT_ZERO( metrics );
+ metrics->x_scale = 1L << 16;
+ metrics->y_scale = 1L << 16;
+ }
+
+ FT_TRACE5(( "FT_Request_Metrics:\n" ));
+ FT_TRACE5(( " x scale: %d (%f)\n",
+ metrics->x_scale, metrics->x_scale / 65536.0 ));
+ FT_TRACE5(( " y scale: %d (%f)\n",
+ metrics->y_scale, metrics->y_scale / 65536.0 ));
+ FT_TRACE5(( " ascender: %f\n", metrics->ascender / 64.0 ));
+ FT_TRACE5(( " descender: %f\n", metrics->descender / 64.0 ));
+ FT_TRACE5(( " height: %f\n", metrics->height / 64.0 ));
+ FT_TRACE5(( " max advance: %f\n", metrics->max_advance / 64.0 ));
+ FT_TRACE5(( " x ppem: %d\n", metrics->x_ppem ));
+ FT_TRACE5(( " y ppem: %d\n", metrics->y_ppem ));
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Select_Size( FT_Face face,
+ FT_Int strike_index )
+ {
+ FT_Driver_Class clazz;
+
+
+ if ( !face || !FT_HAS_FIXED_SIZES( face ) )
+ return FT_THROW( Invalid_Face_Handle );
+
+ if ( strike_index < 0 || strike_index >= face->num_fixed_sizes )
+ return FT_THROW( Invalid_Argument );
+
+ clazz = face->driver->clazz;
+
+ if ( clazz->select_size )
+ {
+ FT_Error error;
+
+
+ error = clazz->select_size( face->size, (FT_ULong)strike_index );
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+ {
+ FT_Size_Metrics* metrics = &face->size->metrics;
+
+
+ FT_TRACE5(( "FT_Select_Size (font driver's `select_size'):\n" ));
+ FT_TRACE5(( " x scale: %d (%f)\n",
+ metrics->x_scale, metrics->x_scale / 65536.0 ));
+ FT_TRACE5(( " y scale: %d (%f)\n",
+ metrics->y_scale, metrics->y_scale / 65536.0 ));
+ FT_TRACE5(( " ascender: %f\n", metrics->ascender / 64.0 ));
+ FT_TRACE5(( " descender: %f\n", metrics->descender / 64.0 ));
+ FT_TRACE5(( " height: %f\n", metrics->height / 64.0 ));
+ FT_TRACE5(( " max advance: %f\n", metrics->max_advance / 64.0 ));
+ FT_TRACE5(( " x ppem: %d\n", metrics->x_ppem ));
+ FT_TRACE5(( " y ppem: %d\n", metrics->y_ppem ));
+ }
+#endif
+
+ return error;
+ }
+
+ FT_Select_Metrics( face, (FT_ULong)strike_index );
+
+ return FT_Err_Ok;
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Request_Size( FT_Face face,
+ FT_Size_Request req )
+ {
+ FT_Driver_Class clazz;
+ FT_ULong strike_index;
+
+
+ if ( !face )
+ return FT_THROW( Invalid_Face_Handle );
+
+ if ( !req || req->width < 0 || req->height < 0 ||
+ req->type >= FT_SIZE_REQUEST_TYPE_MAX )
+ return FT_THROW( Invalid_Argument );
+
+ clazz = face->driver->clazz;
+
+ if ( clazz->request_size )
+ {
+ FT_Error error;
+
+
+ error = clazz->request_size( face->size, req );
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+ {
+ FT_Size_Metrics* metrics = &face->size->metrics;
+
+
+ FT_TRACE5(( "FT_Request_Size (font driver's `request_size'):\n" ));
+ FT_TRACE5(( " x scale: %d (%f)\n",
+ metrics->x_scale, metrics->x_scale / 65536.0 ));
+ FT_TRACE5(( " y scale: %d (%f)\n",
+ metrics->y_scale, metrics->y_scale / 65536.0 ));
+ FT_TRACE5(( " ascender: %f\n", metrics->ascender / 64.0 ));
+ FT_TRACE5(( " descender: %f\n", metrics->descender / 64.0 ));
+ FT_TRACE5(( " height: %f\n", metrics->height / 64.0 ));
+ FT_TRACE5(( " max advance: %f\n", metrics->max_advance / 64.0 ));
+ FT_TRACE5(( " x ppem: %d\n", metrics->x_ppem ));
+ FT_TRACE5(( " y ppem: %d\n", metrics->y_ppem ));
+ }
+#endif
+
+ return error;
+ }
+
+ /*
+ * The reason that a driver doesn't have `request_size' defined is
+ * either that the scaling here suffices or that the supported formats
+ * are bitmap-only and size matching is not implemented.
+ *
+ * In the latter case, a simple size matching is done.
+ */
+ if ( !FT_IS_SCALABLE( face ) && FT_HAS_FIXED_SIZES( face ) )
+ {
+ FT_Error error;
+
+
+ error = FT_Match_Size( face, req, 0, &strike_index );
+ if ( error )
+ return error;
+
+ return FT_Select_Size( face, (FT_Int)strike_index );
+ }
+
+ FT_Request_Metrics( face, req );
+
+ return FT_Err_Ok;
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Set_Char_Size( FT_Face face,
+ FT_F26Dot6 char_width,
+ FT_F26Dot6 char_height,
+ FT_UInt horz_resolution,
+ FT_UInt vert_resolution )
+ {
+ FT_Size_RequestRec req;
+
+
+ if ( !char_width )
+ char_width = char_height;
+ else if ( !char_height )
+ char_height = char_width;
+
+ if ( !horz_resolution )
+ horz_resolution = vert_resolution;
+ else if ( !vert_resolution )
+ vert_resolution = horz_resolution;
+
+ if ( char_width < 1 * 64 )
+ char_width = 1 * 64;
+ if ( char_height < 1 * 64 )
+ char_height = 1 * 64;
+
+ if ( !horz_resolution )
+ horz_resolution = vert_resolution = 72;
+
+ req.type = FT_SIZE_REQUEST_TYPE_NOMINAL;
+ req.width = char_width;
+ req.height = char_height;
+ req.horiResolution = horz_resolution;
+ req.vertResolution = vert_resolution;
+
+ return FT_Request_Size( face, &req );
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Set_Pixel_Sizes( FT_Face face,
+ FT_UInt pixel_width,
+ FT_UInt pixel_height )
+ {
+ FT_Size_RequestRec req;
+
+
+ if ( pixel_width == 0 )
+ pixel_width = pixel_height;
+ else if ( pixel_height == 0 )
+ pixel_height = pixel_width;
+
+ if ( pixel_width < 1 )
+ pixel_width = 1;
+ if ( pixel_height < 1 )
+ pixel_height = 1;
+
+ /* use `>=' to avoid potential compiler warning on 16bit platforms */
+ if ( pixel_width >= 0xFFFFU )
+ pixel_width = 0xFFFFU;
+ if ( pixel_height >= 0xFFFFU )
+ pixel_height = 0xFFFFU;
+
+ req.type = FT_SIZE_REQUEST_TYPE_NOMINAL;
+ req.width = pixel_width << 6;
+ req.height = pixel_height << 6;
+ req.horiResolution = 0;
+ req.vertResolution = 0;
+
+ return FT_Request_Size( face, &req );
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Get_Kerning( FT_Face face,
+ FT_UInt left_glyph,
+ FT_UInt right_glyph,
+ FT_UInt kern_mode,
+ FT_Vector *akerning )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_Driver driver;
+
+
+ if ( !face )
+ return FT_THROW( Invalid_Face_Handle );
+
+ if ( !akerning )
+ return FT_THROW( Invalid_Argument );
+
+ driver = face->driver;
+
+ akerning->x = 0;
+ akerning->y = 0;
+
+ if ( driver->clazz->get_kerning )
+ {
+ error = driver->clazz->get_kerning( face,
+ left_glyph,
+ right_glyph,
+ akerning );
+ if ( !error )
+ {
+ if ( kern_mode != FT_KERNING_UNSCALED )
+ {
+ akerning->x = FT_MulFix( akerning->x, face->size->metrics.x_scale );
+ akerning->y = FT_MulFix( akerning->y, face->size->metrics.y_scale );
+
+ if ( kern_mode != FT_KERNING_UNFITTED )
+ {
+ /* we scale down kerning values for small ppem values */
+ /* to avoid that rounding makes them too big. */
+ /* `25' has been determined heuristically. */
+ if ( face->size->metrics.x_ppem < 25 )
+ akerning->x = FT_MulDiv( akerning->x,
+ face->size->metrics.x_ppem, 25 );
+ if ( face->size->metrics.y_ppem < 25 )
+ akerning->y = FT_MulDiv( akerning->y,
+ face->size->metrics.y_ppem, 25 );
+
+ akerning->x = FT_PIX_ROUND( akerning->x );
+ akerning->y = FT_PIX_ROUND( akerning->y );
+ }
+ }
+ }
+ }
+
+ return error;
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Get_Track_Kerning( FT_Face face,
+ FT_Fixed point_size,
+ FT_Int degree,
+ FT_Fixed* akerning )
+ {
+ FT_Service_Kerning service;
+ FT_Error error = FT_Err_Ok;
+
+
+ if ( !face )
+ return FT_THROW( Invalid_Face_Handle );
+
+ if ( !akerning )
+ return FT_THROW( Invalid_Argument );
+
+ FT_FACE_FIND_SERVICE( face, service, KERNING );
+ if ( !service )
+ return FT_THROW( Unimplemented_Feature );
+
+ error = service->get_track( face,
+ point_size,
+ degree,
+ akerning );
+
+ return error;
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Select_Charmap( FT_Face face,
+ FT_Encoding encoding )
+ {
+ FT_CharMap* cur;
+ FT_CharMap* limit;
+
+
+ if ( !face )
+ return FT_THROW( Invalid_Face_Handle );
+
+ if ( encoding == FT_ENCODING_NONE )
+ return FT_THROW( Invalid_Argument );
+
+ /* FT_ENCODING_UNICODE is special. We try to find the `best' Unicode */
+ /* charmap available, i.e., one with UCS-4 characters, if possible. */
+ /* */
+ /* This is done by find_unicode_charmap() above, to share code. */
+ if ( encoding == FT_ENCODING_UNICODE )
+ return find_unicode_charmap( face );
+
+ cur = face->charmaps;
+ if ( !cur )
+ return FT_THROW( Invalid_CharMap_Handle );
+
+ limit = cur + face->num_charmaps;
+
+ for ( ; cur < limit; cur++ )
+ {
+ if ( cur[0]->encoding == encoding )
+ {
+#ifdef FT_MAX_CHARMAP_CACHEABLE
+ if ( cur - face->charmaps > FT_MAX_CHARMAP_CACHEABLE )
+ {
+ FT_ERROR(( "FT_Select_Charmap: requested charmap is found (%d), "
+ "but in too late position to cache\n",
+ cur - face->charmaps ));
+ continue;
+ }
+#endif
+ face->charmap = cur[0];
+ return 0;
+ }
+ }
+
+ return FT_THROW( Invalid_Argument );
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Set_Charmap( FT_Face face,
+ FT_CharMap charmap )
+ {
+ FT_CharMap* cur;
+ FT_CharMap* limit;
+
+
+ if ( !face )
+ return FT_THROW( Invalid_Face_Handle );
+
+ cur = face->charmaps;
+ if ( !cur )
+ return FT_THROW( Invalid_CharMap_Handle );
+ if ( FT_Get_CMap_Format( charmap ) == 14 )
+ return FT_THROW( Invalid_Argument );
+
+ limit = cur + face->num_charmaps;
+
+ for ( ; cur < limit; cur++ )
+ {
+ if ( cur[0] == charmap )
+ {
+#ifdef FT_MAX_CHARMAP_CACHEABLE
+ if ( cur - face->charmaps > FT_MAX_CHARMAP_CACHEABLE )
+ {
+ FT_ERROR(( "FT_Set_Charmap: requested charmap is found (%d), "
+ "but in too late position to cache\n",
+ cur - face->charmaps ));
+ continue;
+ }
+#endif
+ face->charmap = cur[0];
+ return 0;
+ }
+ }
+ return FT_THROW( Invalid_Argument );
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_Int )
+ FT_Get_Charmap_Index( FT_CharMap charmap )
+ {
+ FT_Int i;
+
+
+ if ( !charmap || !charmap->face )
+ return -1;
+
+ for ( i = 0; i < charmap->face->num_charmaps; i++ )
+ if ( charmap->face->charmaps[i] == charmap )
+ break;
+
+ FT_ASSERT( i < charmap->face->num_charmaps );
+
+#ifdef FT_MAX_CHARMAP_CACHEABLE
+ if ( i > FT_MAX_CHARMAP_CACHEABLE )
+ {
+ FT_ERROR(( "FT_Get_Charmap_Index: requested charmap is found (%d), "
+ "but in too late position to cache\n",
+ i ));
+ return -i;
+ }
+#endif
+ return i;
+ }
+
+
+ static void
+ ft_cmap_done_internal( FT_CMap cmap )
+ {
+ FT_CMap_Class clazz = cmap->clazz;
+ FT_Face face = cmap->charmap.face;
+ FT_Memory memory = FT_FACE_MEMORY( face );
+
+
+ if ( clazz->done )
+ clazz->done( cmap );
+
+ FT_FREE( cmap );
+ }
+
+
+ FT_BASE_DEF( void )
+ FT_CMap_Done( FT_CMap cmap )
+ {
+ if ( cmap )
+ {
+ FT_Face face = cmap->charmap.face;
+ FT_Memory memory = FT_FACE_MEMORY( face );
+ FT_Error error;
+ FT_Int i, j;
+
+
+ for ( i = 0; i < face->num_charmaps; i++ )
+ {
+ if ( (FT_CMap)face->charmaps[i] == cmap )
+ {
+ FT_CharMap last_charmap = face->charmaps[face->num_charmaps - 1];
+
+
+ if ( FT_RENEW_ARRAY( face->charmaps,
+ face->num_charmaps,
+ face->num_charmaps - 1 ) )
+ return;
+
+ /* remove it from our list of charmaps */
+ for ( j = i + 1; j < face->num_charmaps; j++ )
+ {
+ if ( j == face->num_charmaps - 1 )
+ face->charmaps[j - 1] = last_charmap;
+ else
+ face->charmaps[j - 1] = face->charmaps[j];
+ }
+
+ face->num_charmaps--;
+
+ if ( (FT_CMap)face->charmap == cmap )
+ face->charmap = NULL;
+
+ ft_cmap_done_internal( cmap );
+
+ break;
+ }
+ }
+ }
+ }
+
+
+ FT_BASE_DEF( FT_Error )
+ FT_CMap_New( FT_CMap_Class clazz,
+ FT_Pointer init_data,
+ FT_CharMap charmap,
+ FT_CMap *acmap )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_Face face;
+ FT_Memory memory;
+ FT_CMap cmap = NULL;
+
+
+ if ( clazz == NULL || charmap == NULL || charmap->face == NULL )
+ return FT_THROW( Invalid_Argument );
+
+ face = charmap->face;
+ memory = FT_FACE_MEMORY( face );
+
+ if ( !FT_ALLOC( cmap, clazz->size ) )
+ {
+ cmap->charmap = *charmap;
+ cmap->clazz = clazz;
+
+ if ( clazz->init )
+ {
+ error = clazz->init( cmap, init_data );
+ if ( error )
+ goto Fail;
+ }
+
+ /* add it to our list of charmaps */
+ if ( FT_RENEW_ARRAY( face->charmaps,
+ face->num_charmaps,
+ face->num_charmaps + 1 ) )
+ goto Fail;
+
+ face->charmaps[face->num_charmaps++] = (FT_CharMap)cmap;
+ }
+
+ Exit:
+ if ( acmap )
+ *acmap = cmap;
+
+ return error;
+
+ Fail:
+ ft_cmap_done_internal( cmap );
+ cmap = NULL;
+ goto Exit;
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_UInt )
+ FT_Get_Char_Index( FT_Face face,
+ FT_ULong charcode )
+ {
+ FT_UInt result = 0;
+
+
+ if ( face && face->charmap )
+ {
+ FT_CMap cmap = FT_CMAP( face->charmap );
+
+
+ if ( charcode > 0xFFFFFFFFUL )
+ {
+ FT_TRACE1(( "FT_Get_Char_Index: too large charcode" ));
+ FT_TRACE1(( " 0x%x is truncated\n", charcode ));
+ }
+ result = cmap->clazz->char_index( cmap, (FT_UInt32)charcode );
+ }
+ return result;
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_ULong )
+ FT_Get_First_Char( FT_Face face,
+ FT_UInt *agindex )
+ {
+ FT_ULong result = 0;
+ FT_UInt gindex = 0;
+
+
+ if ( face && face->charmap && face->num_glyphs )
+ {
+ gindex = FT_Get_Char_Index( face, 0 );
+ if ( gindex == 0 || gindex >= (FT_UInt)face->num_glyphs )
+ result = FT_Get_Next_Char( face, 0, &gindex );
+ }
+
+ if ( agindex )
+ *agindex = gindex;
+
+ return result;
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_ULong )
+ FT_Get_Next_Char( FT_Face face,
+ FT_ULong charcode,
+ FT_UInt *agindex )
+ {
+ FT_ULong result = 0;
+ FT_UInt gindex = 0;
+
+
+ if ( face && face->charmap && face->num_glyphs )
+ {
+ FT_UInt32 code = (FT_UInt32)charcode;
+ FT_CMap cmap = FT_CMAP( face->charmap );
+
+
+ do {
+ gindex = cmap->clazz->char_next( cmap, &code );
+ } while ( gindex >= (FT_UInt)face->num_glyphs );
+
+ result = ( gindex == 0 ) ? 0 : code;
+ }
+
+ if ( agindex )
+ *agindex = gindex;
+
+ return result;
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_UInt )
+ FT_Face_GetCharVariantIndex( FT_Face face,
+ FT_ULong charcode,
+ FT_ULong variantSelector )
+ {
+ FT_UInt result = 0;
+
+
+ if ( face && face->charmap &&
+ face->charmap->encoding == FT_ENCODING_UNICODE )
+ {
+ FT_CharMap charmap = find_variant_selector_charmap( face );
+ FT_CMap ucmap = FT_CMAP( face->charmap );
+
+
+ if ( charmap != NULL )
+ {
+ FT_CMap vcmap = FT_CMAP( charmap );
+
+
+ if ( charcode > 0xFFFFFFFFUL )
+ {
+ FT_TRACE1(( "FT_Get_Char_Index: too large charcode" ));
+ FT_TRACE1(( " 0x%x is truncated\n", charcode ));
+ }
+ if ( variantSelector > 0xFFFFFFFFUL )
+ {
+ FT_TRACE1(( "FT_Get_Char_Index: too large variantSelector" ));
+ FT_TRACE1(( " 0x%x is truncated\n", variantSelector ));
+ }
+
+ result = vcmap->clazz->char_var_index( vcmap, ucmap,
+ (FT_UInt32)charcode,
+ (FT_UInt32)variantSelector );
+ }
+ }
+
+ return result;
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_Int )
+ FT_Face_GetCharVariantIsDefault( FT_Face face,
+ FT_ULong charcode,
+ FT_ULong variantSelector )
+ {
+ FT_Int result = -1;
+
+
+ if ( face )
+ {
+ FT_CharMap charmap = find_variant_selector_charmap( face );
+
+
+ if ( charmap != NULL )
+ {
+ FT_CMap vcmap = FT_CMAP( charmap );
+
+
+ if ( charcode > 0xFFFFFFFFUL )
+ {
+ FT_TRACE1(( "FT_Get_Char_Index: too large charcode" ));
+ FT_TRACE1(( " 0x%x is truncated\n", charcode ));
+ }
+ if ( variantSelector > 0xFFFFFFFFUL )
+ {
+ FT_TRACE1(( "FT_Get_Char_Index: too large variantSelector" ));
+ FT_TRACE1(( " 0x%x is truncated\n", variantSelector ));
+ }
+
+ result = vcmap->clazz->char_var_default( vcmap,
+ (FT_UInt32)charcode,
+ (FT_UInt32)variantSelector );
+ }
+ }
+
+ return result;
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_UInt32* )
+ FT_Face_GetVariantSelectors( FT_Face face )
+ {
+ FT_UInt32 *result = NULL;
+
+
+ if ( face )
+ {
+ FT_CharMap charmap = find_variant_selector_charmap( face );
+
+
+ if ( charmap != NULL )
+ {
+ FT_CMap vcmap = FT_CMAP( charmap );
+ FT_Memory memory = FT_FACE_MEMORY( face );
+
+
+ result = vcmap->clazz->variant_list( vcmap, memory );
+ }
+ }
+
+ return result;
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_UInt32* )
+ FT_Face_GetVariantsOfChar( FT_Face face,
+ FT_ULong charcode )
+ {
+ FT_UInt32 *result = NULL;
+
+
+ if ( face )
+ {
+ FT_CharMap charmap = find_variant_selector_charmap( face );
+
+
+ if ( charmap != NULL )
+ {
+ FT_CMap vcmap = FT_CMAP( charmap );
+ FT_Memory memory = FT_FACE_MEMORY( face );
+
+
+ if ( charcode > 0xFFFFFFFFUL )
+ {
+ FT_TRACE1(( "FT_Get_Char_Index: too large charcode" ));
+ FT_TRACE1(( " 0x%x is truncated\n", charcode ));
+ }
+
+ result = vcmap->clazz->charvariant_list( vcmap, memory,
+ (FT_UInt32)charcode );
+ }
+ }
+ return result;
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_UInt32* )
+ FT_Face_GetCharsOfVariant( FT_Face face,
+ FT_ULong variantSelector )
+ {
+ FT_UInt32 *result = NULL;
+
+
+ if ( face )
+ {
+ FT_CharMap charmap = find_variant_selector_charmap( face );
+
+
+ if ( charmap != NULL )
+ {
+ FT_CMap vcmap = FT_CMAP( charmap );
+ FT_Memory memory = FT_FACE_MEMORY( face );
+
+
+ if ( variantSelector > 0xFFFFFFFFUL )
+ {
+ FT_TRACE1(( "FT_Get_Char_Index: too large variantSelector" ));
+ FT_TRACE1(( " 0x%x is truncated\n", variantSelector ));
+ }
+
+ result = vcmap->clazz->variantchar_list( vcmap, memory,
+ (FT_UInt32)variantSelector );
+ }
+ }
+
+ return result;
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_UInt )
+ FT_Get_Name_Index( FT_Face face,
+ FT_String* glyph_name )
+ {
+ FT_UInt result = 0;
+
+
+ if ( face && FT_HAS_GLYPH_NAMES( face ) )
+ {
+ FT_Service_GlyphDict service;
+
+
+ FT_FACE_LOOKUP_SERVICE( face,
+ service,
+ GLYPH_DICT );
+
+ if ( service && service->name_index )
+ result = service->name_index( face, glyph_name );
+ }
+
+ return result;
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Get_Glyph_Name( FT_Face face,
+ FT_UInt glyph_index,
+ FT_Pointer buffer,
+ FT_UInt buffer_max )
+ {
+ FT_Error error = FT_ERR( Invalid_Argument );
+
+
+ /* clean up buffer */
+ if ( buffer && buffer_max > 0 )
+ ((FT_Byte*)buffer)[0] = 0;
+
+ if ( face &&
+ (FT_Long)glyph_index <= face->num_glyphs &&
+ FT_HAS_GLYPH_NAMES( face ) )
+ {
+ FT_Service_GlyphDict service;
+
+
+ FT_FACE_LOOKUP_SERVICE( face,
+ service,
+ GLYPH_DICT );
+
+ if ( service && service->get_name )
+ error = service->get_name( face, glyph_index, buffer, buffer_max );
+ }
+
+ return error;
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( const char* )
+ FT_Get_Postscript_Name( FT_Face face )
+ {
+ const char* result = NULL;
+
+
+ if ( !face )
+ goto Exit;
+
+ if ( !result )
+ {
+ FT_Service_PsFontName service;
+
+
+ FT_FACE_LOOKUP_SERVICE( face,
+ service,
+ POSTSCRIPT_FONT_NAME );
+
+ if ( service && service->get_ps_font_name )
+ result = service->get_ps_font_name( face );
+ }
+
+ Exit:
+ return result;
+ }
+
+
+ /* documentation is in tttables.h */
+
+ FT_EXPORT_DEF( void* )
+ FT_Get_Sfnt_Table( FT_Face face,
+ FT_Sfnt_Tag tag )
+ {
+ void* table = 0;
+ FT_Service_SFNT_Table service;
+
+
+ if ( face && FT_IS_SFNT( face ) )
+ {
+ FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE );
+ if ( service != NULL )
+ table = service->get_table( face, tag );
+ }
+
+ return table;
+ }
+
+
+ /* documentation is in tttables.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Load_Sfnt_Table( FT_Face face,
+ FT_ULong tag,
+ FT_Long offset,
+ FT_Byte* buffer,
+ FT_ULong* length )
+ {
+ FT_Service_SFNT_Table service;
+
+
+ if ( !face || !FT_IS_SFNT( face ) )
+ return FT_THROW( Invalid_Face_Handle );
+
+ FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE );
+ if ( service == NULL )
+ return FT_THROW( Unimplemented_Feature );
+
+ return service->load_table( face, tag, offset, buffer, length );
+ }
+
+
+ /* documentation is in tttables.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Sfnt_Table_Info( FT_Face face,
+ FT_UInt table_index,
+ FT_ULong *tag,
+ FT_ULong *length )
+ {
+ FT_Service_SFNT_Table service;
+ FT_ULong offset;
+
+
+ if ( !face || !FT_IS_SFNT( face ) )
+ return FT_THROW( Invalid_Face_Handle );
+
+ FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE );
+ if ( service == NULL )
+ return FT_THROW( Unimplemented_Feature );
+
+ return service->table_info( face, table_index, tag, &offset, length );
+ }
+
+
+ /* documentation is in tttables.h */
+
+ FT_EXPORT_DEF( FT_ULong )
+ FT_Get_CMap_Language_ID( FT_CharMap charmap )
+ {
+ FT_Service_TTCMaps service;
+ FT_Face face;
+ TT_CMapInfo cmap_info;
+
+
+ if ( !charmap || !charmap->face )
+ return 0;
+
+ face = charmap->face;
+ FT_FACE_FIND_SERVICE( face, service, TT_CMAP );
+ if ( service == NULL )
+ return 0;
+ if ( service->get_cmap_info( charmap, &cmap_info ))
+ return 0;
+
+ return cmap_info.language;
+ }
+
+
+ /* documentation is in tttables.h */
+
+ FT_EXPORT_DEF( FT_Long )
+ FT_Get_CMap_Format( FT_CharMap charmap )
+ {
+ FT_Service_TTCMaps service;
+ FT_Face face;
+ TT_CMapInfo cmap_info;
+
+
+ if ( !charmap || !charmap->face )
+ return -1;
+
+ face = charmap->face;
+ FT_FACE_FIND_SERVICE( face, service, TT_CMAP );
+ if ( service == NULL )
+ return -1;
+ if ( service->get_cmap_info( charmap, &cmap_info ))
+ return -1;
+
+ return cmap_info.format;
+ }
+
+
+ /* documentation is in ftsizes.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Activate_Size( FT_Size size )
+ {
+ FT_Face face;
+
+
+ if ( size == NULL )
+ return FT_THROW( Invalid_Argument );
+
+ face = size->face;
+ if ( face == NULL || face->driver == NULL )
+ return FT_THROW( Invalid_Argument );
+
+ /* we don't need anything more complex than that; all size objects */
+ /* are already listed by the face */
+ face->size = size;
+
+ return FT_Err_Ok;
+ }
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** ****/
+ /**** R E N D E R E R S ****/
+ /**** ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /* lookup a renderer by glyph format in the library's list */
+ FT_BASE_DEF( FT_Renderer )
+ FT_Lookup_Renderer( FT_Library library,
+ FT_Glyph_Format format,
+ FT_ListNode* node )
+ {
+ FT_ListNode cur;
+ FT_Renderer result = 0;
+
+
+ if ( !library )
+ goto Exit;
+
+ cur = library->renderers.head;
+
+ if ( node )
+ {
+ if ( *node )
+ cur = (*node)->next;
+ *node = 0;
+ }
+
+ while ( cur )
+ {
+ FT_Renderer renderer = FT_RENDERER( cur->data );
+
+
+ if ( renderer->glyph_format == format )
+ {
+ if ( node )
+ *node = cur;
+
+ result = renderer;
+ break;
+ }
+ cur = cur->next;
+ }
+
+ Exit:
+ return result;
+ }
+
+
+ static FT_Renderer
+ ft_lookup_glyph_renderer( FT_GlyphSlot slot )
+ {
+ FT_Face face = slot->face;
+ FT_Library library = FT_FACE_LIBRARY( face );
+ FT_Renderer result = library->cur_renderer;
+
+
+ if ( !result || result->glyph_format != slot->format )
+ result = FT_Lookup_Renderer( library, slot->format, 0 );
+
+ return result;
+ }
+
+
+ static void
+ ft_set_current_renderer( FT_Library library )
+ {
+ FT_Renderer renderer;
+
+
+ renderer = FT_Lookup_Renderer( library, FT_GLYPH_FORMAT_OUTLINE, 0 );
+ library->cur_renderer = renderer;
+ }
+
+
+ static FT_Error
+ ft_add_renderer( FT_Module module )
+ {
+ FT_Library library = module->library;
+ FT_Memory memory = library->memory;
+ FT_Error error;
+ FT_ListNode node = NULL;
+
+
+ if ( FT_NEW( node ) )
+ goto Exit;
+
+ {
+ FT_Renderer render = FT_RENDERER( module );
+ FT_Renderer_Class* clazz = (FT_Renderer_Class*)module->clazz;
+
+
+ render->clazz = clazz;
+ render->glyph_format = clazz->glyph_format;
+
+ /* allocate raster object if needed */
+ if ( clazz->glyph_format == FT_GLYPH_FORMAT_OUTLINE &&
+ clazz->raster_class->raster_new )
+ {
+ error = clazz->raster_class->raster_new( memory, &render->raster );
+ if ( error )
+ goto Fail;
+
+ render->raster_render = clazz->raster_class->raster_render;
+ render->render = clazz->render_glyph;
+ }
+
+ /* add to list */
+ node->data = module;
+ FT_List_Add( &library->renderers, node );
+
+ ft_set_current_renderer( library );
+ }
+
+ Fail:
+ if ( error )
+ FT_FREE( node );
+
+ Exit:
+ return error;
+ }
+
+
+ static void
+ ft_remove_renderer( FT_Module module )
+ {
+ FT_Library library = module->library;
+ FT_Memory memory = library->memory;
+ FT_ListNode node;
+
+
+ node = FT_List_Find( &library->renderers, module );
+ if ( node )
+ {
+ FT_Renderer render = FT_RENDERER( module );
+
+
+ /* release raster object, if any */
+ if ( render->clazz->glyph_format == FT_GLYPH_FORMAT_OUTLINE &&
+ render->raster )
+ render->clazz->raster_class->raster_done( render->raster );
+
+ /* remove from list */
+ FT_List_Remove( &library->renderers, node );
+ FT_FREE( node );
+
+ ft_set_current_renderer( library );
+ }
+ }
+
+
+ /* documentation is in ftrender.h */
+
+ FT_EXPORT_DEF( FT_Renderer )
+ FT_Get_Renderer( FT_Library library,
+ FT_Glyph_Format format )
+ {
+ /* test for valid `library' delayed to FT_Lookup_Renderer() */
+
+ return FT_Lookup_Renderer( library, format, 0 );
+ }
+
+
+ /* documentation is in ftrender.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Set_Renderer( FT_Library library,
+ FT_Renderer renderer,
+ FT_UInt num_params,
+ FT_Parameter* parameters )
+ {
+ FT_ListNode node;
+ FT_Error error = FT_Err_Ok;
+
+
+ if ( !library )
+ return FT_THROW( Invalid_Library_Handle );
+
+ if ( !renderer )
+ return FT_THROW( Invalid_Argument );
+
+ node = FT_List_Find( &library->renderers, renderer );
+ if ( !node )
+ {
+ error = FT_THROW( Invalid_Argument );
+ goto Exit;
+ }
+
+ FT_List_Up( &library->renderers, node );
+
+ if ( renderer->glyph_format == FT_GLYPH_FORMAT_OUTLINE )
+ library->cur_renderer = renderer;
+
+ if ( num_params > 0 )
+ {
+ FT_Renderer_SetModeFunc set_mode = renderer->clazz->set_mode;
+
+
+ for ( ; num_params > 0; num_params-- )
+ {
+ error = set_mode( renderer, parameters->tag, parameters->data );
+ if ( error )
+ break;
+ parameters++;
+ }
+ }
+
+ Exit:
+ return error;
+ }
+
+
+ FT_BASE_DEF( FT_Error )
+ FT_Render_Glyph_Internal( FT_Library library,
+ FT_GlyphSlot slot,
+ FT_Render_Mode render_mode )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_Renderer renderer;
+
+
+ /* if it is already a bitmap, no need to do anything */
+ switch ( slot->format )
+ {
+ case FT_GLYPH_FORMAT_BITMAP: /* already a bitmap, don't do anything */
+ break;
+
+ default:
+ {
+ FT_ListNode node = 0;
+ FT_Bool update = 0;
+
+
+ /* small shortcut for the very common case */
+ if ( slot->format == FT_GLYPH_FORMAT_OUTLINE )
+ {
+ renderer = library->cur_renderer;
+ node = library->renderers.head;
+ }
+ else
+ renderer = FT_Lookup_Renderer( library, slot->format, &node );
+
+ error = FT_ERR( Unimplemented_Feature );
+ while ( renderer )
+ {
+ error = renderer->render( renderer, slot, render_mode, NULL );
+ if ( !error ||
+ FT_ERR_NEQ( error, Cannot_Render_Glyph ) )
+ break;
+
+ /* FT_Err_Cannot_Render_Glyph is returned if the render mode */
+ /* is unsupported by the current renderer for this glyph image */
+ /* format. */
+
+ /* now, look for another renderer that supports the same */
+ /* format. */
+ renderer = FT_Lookup_Renderer( library, slot->format, &node );
+ update = 1;
+ }
+
+ /* if we changed the current renderer for the glyph image format */
+ /* we need to select it as the next current one */
+ if ( !error && update && renderer )
+ FT_Set_Renderer( library, renderer, 0, 0 );
+ }
+ }
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_bitmap
+
+ /* we convert to a single bitmap format for computing the checksum */
+ {
+ FT_Bitmap bitmap;
+ FT_Error err;
+
+
+ FT_Bitmap_New( &bitmap );
+
+ err = FT_Bitmap_Convert( library, &slot->bitmap, &bitmap, 1 );
+ if ( !err )
+ {
+ MD5_CTX ctx;
+ unsigned char md5[16];
+ int i;
+
+
+ MD5_Init( &ctx);
+ MD5_Update( &ctx, bitmap.buffer, bitmap.rows * bitmap.pitch );
+ MD5_Final( md5, &ctx );
+
+ FT_TRACE3(( "MD5 checksum for %dx%d bitmap:\n"
+ " ",
+ bitmap.rows, bitmap.pitch ));
+ for ( i = 0; i < 16; i++ )
+ FT_TRACE3(( "%02X", md5[i] ));
+ FT_TRACE3(( "\n" ));
+ }
+
+ FT_Bitmap_Done( library, &bitmap );
+ }
+
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_objs
+
+#endif /* FT_DEBUG_LEVEL_TRACE */
+
+ return error;
+ }
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Render_Glyph( FT_GlyphSlot slot,
+ FT_Render_Mode render_mode )
+ {
+ FT_Library library;
+
+ if ( !slot || !slot->face )
+ return FT_THROW( Invalid_Argument );
+
+ library = FT_FACE_LIBRARY( slot->face );
+
+ return FT_Render_Glyph_Internal( library, slot, render_mode );
+ }
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** ****/
+ /**** M O D U L E S ****/
+ /**** ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Destroy_Module */
+ /* */
+ /* <Description> */
+ /* Destroys a given module object. For drivers, this also destroys */
+ /* all child faces. */
+ /* */
+ /* <InOut> */
+ /* module :: A handle to the target driver object. */
+ /* */
+ /* <Note> */
+ /* The driver _must_ be LOCKED! */
+ /* */
+ static void
+ Destroy_Module( FT_Module module )
+ {
+ FT_Memory memory = module->memory;
+ FT_Module_Class* clazz = module->clazz;
+ FT_Library library = module->library;
+
+
+ if ( library && library->auto_hinter == module )
+ library->auto_hinter = 0;
+
+ /* if the module is a renderer */
+ if ( FT_MODULE_IS_RENDERER( module ) )
+ ft_remove_renderer( module );
+
+ /* if the module is a font driver, add some steps */
+ if ( FT_MODULE_IS_DRIVER( module ) )
+ Destroy_Driver( FT_DRIVER( module ) );
+
+ /* finalize the module object */
+ if ( clazz->module_done )
+ clazz->module_done( module );
+
+ /* discard it */
+ FT_FREE( module );
+ }
+
+
+ /* documentation is in ftmodapi.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Add_Module( FT_Library library,
+ const FT_Module_Class* clazz )
+ {
+ FT_Error error;
+ FT_Memory memory;
+ FT_Module module;
+ FT_UInt nn;
+
+
+#define FREETYPE_VER_FIXED ( ( (FT_Long)FREETYPE_MAJOR << 16 ) | \
+ FREETYPE_MINOR )
+
+ if ( !library )
+ return FT_THROW( Invalid_Library_Handle );
+
+ if ( !clazz )
+ return FT_THROW( Invalid_Argument );
+
+ /* check freetype version */
+ if ( clazz->module_requires > FREETYPE_VER_FIXED )
+ return FT_THROW( Invalid_Version );
+
+ /* look for a module with the same name in the library's table */
+ for ( nn = 0; nn < library->num_modules; nn++ )
+ {
+ module = library->modules[nn];
+ if ( ft_strcmp( module->clazz->module_name, clazz->module_name ) == 0 )
+ {
+ /* this installed module has the same name, compare their versions */
+ if ( clazz->module_version <= module->clazz->module_version )
+ return FT_THROW( Lower_Module_Version );
+
+ /* remove the module from our list, then exit the loop to replace */
+ /* it by our new version.. */
+ FT_Remove_Module( library, module );
+ break;
+ }
+ }
+
+ memory = library->memory;
+ error = FT_Err_Ok;
+
+ if ( library->num_modules >= FT_MAX_MODULES )
+ {
+ error = FT_THROW( Too_Many_Drivers );
+ goto Exit;
+ }
+
+ /* allocate module object */
+ if ( FT_ALLOC( module, clazz->module_size ) )
+ goto Exit;
+
+ /* base initialization */
+ module->library = library;
+ module->memory = memory;
+ module->clazz = (FT_Module_Class*)clazz;
+
+ /* check whether the module is a renderer - this must be performed */
+ /* before the normal module initialization */
+ if ( FT_MODULE_IS_RENDERER( module ) )
+ {
+ /* add to the renderers list */
+ error = ft_add_renderer( module );
+ if ( error )
+ goto Fail;
+ }
+
+ /* is the module a auto-hinter? */
+ if ( FT_MODULE_IS_HINTER( module ) )
+ library->auto_hinter = module;
+
+ /* if the module is a font driver */
+ if ( FT_MODULE_IS_DRIVER( module ) )
+ {
+ /* allocate glyph loader if needed */
+ FT_Driver driver = FT_DRIVER( module );
+
+
+ driver->clazz = (FT_Driver_Class)module->clazz;
+ if ( FT_DRIVER_USES_OUTLINES( driver ) )
+ {
+ error = FT_GlyphLoader_New( memory, &driver->glyph_loader );
+ if ( error )
+ goto Fail;
+ }
+ }
+
+ if ( clazz->module_init )
+ {
+ error = clazz->module_init( module );
+ if ( error )
+ goto Fail;
+ }
+
+ /* add module to the library's table */
+ library->modules[library->num_modules++] = module;
+
+ Exit:
+ return error;
+
+ Fail:
+ if ( FT_MODULE_IS_DRIVER( module ) )
+ {
+ FT_Driver driver = FT_DRIVER( module );
+
+
+ if ( FT_DRIVER_USES_OUTLINES( driver ) )
+ FT_GlyphLoader_Done( driver->glyph_loader );
+ }
+
+ if ( FT_MODULE_IS_RENDERER( module ) )
+ {
+ FT_Renderer renderer = FT_RENDERER( module );
+
+
+ if ( renderer->clazz &&
+ renderer->clazz->glyph_format == FT_GLYPH_FORMAT_OUTLINE &&
+ renderer->raster )
+ renderer->clazz->raster_class->raster_done( renderer->raster );
+ }
+
+ FT_FREE( module );
+ goto Exit;
+ }
+
+
+ /* documentation is in ftmodapi.h */
+
+ FT_EXPORT_DEF( FT_Module )
+ FT_Get_Module( FT_Library library,
+ const char* module_name )
+ {
+ FT_Module result = 0;
+ FT_Module* cur;
+ FT_Module* limit;
+
+
+ if ( !library || !module_name )
+ return result;
+
+ cur = library->modules;
+ limit = cur + library->num_modules;
+
+ for ( ; cur < limit; cur++ )
+ if ( ft_strcmp( cur[0]->clazz->module_name, module_name ) == 0 )
+ {
+ result = cur[0];
+ break;
+ }
+
+ return result;
+ }
+
+
+ /* documentation is in ftobjs.h */
+
+ FT_BASE_DEF( const void* )
+ FT_Get_Module_Interface( FT_Library library,
+ const char* mod_name )
+ {
+ FT_Module module;
+
+
+ /* test for valid `library' delayed to FT_Get_Module() */
+
+ module = FT_Get_Module( library, mod_name );
+
+ return module ? module->clazz->module_interface : 0;
+ }
+
+
+ FT_BASE_DEF( FT_Pointer )
+ ft_module_get_service( FT_Module module,
+ const char* service_id )
+ {
+ FT_Pointer result = NULL;
+
+
+ if ( module )
+ {
+ FT_ASSERT( module->clazz && module->clazz->get_interface );
+
+ /* first, look for the service in the module */
+ if ( module->clazz->get_interface )
+ result = module->clazz->get_interface( module, service_id );
+
+ if ( result == NULL )
+ {
+ /* we didn't find it, look in all other modules then */
+ FT_Library library = module->library;
+ FT_Module* cur = library->modules;
+ FT_Module* limit = cur + library->num_modules;
+
+
+ for ( ; cur < limit; cur++ )
+ {
+ if ( cur[0] != module )
+ {
+ FT_ASSERT( cur[0]->clazz );
+
+ if ( cur[0]->clazz->get_interface )
+ {
+ result = cur[0]->clazz->get_interface( cur[0], service_id );
+ if ( result != NULL )
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ return result;
+ }
+
+
+ /* documentation is in ftmodapi.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Remove_Module( FT_Library library,
+ FT_Module module )
+ {
+ /* try to find the module from the table, then remove it from there */
+
+ if ( !library )
+ return FT_THROW( Invalid_Library_Handle );
+
+ if ( module )
+ {
+ FT_Module* cur = library->modules;
+ FT_Module* limit = cur + library->num_modules;
+
+
+ for ( ; cur < limit; cur++ )
+ {
+ if ( cur[0] == module )
+ {
+ /* remove it from the table */
+ library->num_modules--;
+ limit--;
+ while ( cur < limit )
+ {
+ cur[0] = cur[1];
+ cur++;
+ }
+ limit[0] = 0;
+
+ /* destroy the module */
+ Destroy_Module( module );
+
+ return FT_Err_Ok;
+ }
+ }
+ }
+ return FT_THROW( Invalid_Driver_Handle );
+ }
+
+
+ FT_Error
+ ft_property_do( FT_Library library,
+ const FT_String* module_name,
+ const FT_String* property_name,
+ void* value,
+ FT_Bool set )
+ {
+ FT_Module* cur;
+ FT_Module* limit;
+ FT_Module_Interface interface1;
+ FT_Service_Properties service;
+
+#ifdef FT_DEBUG_LEVEL_ERROR
+ const FT_String* set_name = "FT_Property_Set";
+ const FT_String* get_name = "FT_Property_Get";
+ const FT_String* func_name = set ? set_name : get_name;
+#endif
+
+ FT_Bool missing_func;
+
+
+ if ( !library )
+ return FT_THROW( Invalid_Library_Handle );
+
+ if ( !module_name || !property_name || !value )
+ return FT_THROW( Invalid_Argument );
+
+ cur = library->modules;
+ limit = cur + library->num_modules;
+
+ /* search module */
+ for ( ; cur < limit; cur++ )
+ if ( !ft_strcmp( cur[0]->clazz->module_name, module_name ) )
+ break;
+
+ if ( cur == limit )
+ {
+ FT_ERROR(( "%s: can't find module `%s'\n",
+ func_name, module_name ));
+ return FT_THROW( Missing_Module );
+ }
+
+ /* check whether we have a service interface */
+ if ( !cur[0]->clazz->get_interface )
+ {
+ FT_ERROR(( "%s: module `%s' doesn't support properties\n",
+ func_name, module_name ));
+ return FT_THROW( Unimplemented_Feature );
+ }
+
+ /* search property service */
+ interface1 = cur[0]->clazz->get_interface( cur[0],
+ FT_SERVICE_ID_PROPERTIES );
+ if ( !interface1 )
+ {
+ FT_ERROR(( "%s: module `%s' doesn't support properties\n",
+ func_name, module_name ));
+ return FT_THROW( Unimplemented_Feature );
+ }
+
+ service = (FT_Service_Properties)interface1;
+
+ if ( set )
+ missing_func = (FT_Bool)( !service->set_property );
+ else
+ missing_func = (FT_Bool)( !service->get_property );
+
+ if ( missing_func )
+ {
+ FT_ERROR(( "%s: property service of module `%s' is broken\n",
+ func_name, module_name ));
+ return FT_THROW( Unimplemented_Feature );
+ }
+
+ return set ? service->set_property( cur[0], property_name, value )
+ : service->get_property( cur[0], property_name, value );
+ }
+
+
+ /* documentation is in ftmodapi.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Property_Set( FT_Library library,
+ const FT_String* module_name,
+ const FT_String* property_name,
+ const void* value )
+ {
+ return ft_property_do( library,
+ module_name,
+ property_name,
+ (void*)value,
+ TRUE );
+ }
+
+
+ /* documentation is in ftmodapi.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Property_Get( FT_Library library,
+ const FT_String* module_name,
+ const FT_String* property_name,
+ void* value )
+ {
+ return ft_property_do( library,
+ module_name,
+ property_name,
+ value,
+ FALSE );
+ }
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** ****/
+ /**** L I B R A R Y ****/
+ /**** ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /* documentation is in ftmodapi.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Reference_Library( FT_Library library )
+ {
+ library->refcount++;
+
+ return FT_Err_Ok;
+ }
+
+
+ /* documentation is in ftmodapi.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_New_Library( FT_Memory memory,
+ FT_Library *alibrary )
+ {
+ FT_Library library = NULL;
+ FT_Error error;
+
+
+ if ( !memory )
+ return FT_THROW( Invalid_Argument );
+
+#ifdef FT_DEBUG_LEVEL_ERROR
+ /* init debugging support */
+ ft_debug_init();
+#endif
+
+ /* first of all, allocate the library object */
+ if ( FT_NEW( library ) )
+ return error;
+
+ library->memory = memory;
+
+#ifdef FT_CONFIG_OPTION_PIC
+ /* initialize position independent code containers */
+ error = ft_pic_container_init( library );
+ if ( error )
+ goto Fail;
+#endif
+
+ /* allocate the render pool */
+ library->raster_pool_size = FT_RENDER_POOL_SIZE;
+#if FT_RENDER_POOL_SIZE > 0
+ if ( FT_ALLOC( library->raster_pool, FT_RENDER_POOL_SIZE ) )
+ goto Fail;
+#endif
+
+ library->version_major = FREETYPE_MAJOR;
+ library->version_minor = FREETYPE_MINOR;
+ library->version_patch = FREETYPE_PATCH;
+
+ library->refcount = 1;
+
+ /* That's ok now */
+ *alibrary = library;
+
+ return FT_Err_Ok;
+
+ Fail:
+#ifdef FT_CONFIG_OPTION_PIC
+ ft_pic_container_destroy( library );
+#endif
+ FT_FREE( library );
+ return error;
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( void )
+ FT_Library_Version( FT_Library library,
+ FT_Int *amajor,
+ FT_Int *aminor,
+ FT_Int *apatch )
+ {
+ FT_Int major = 0;
+ FT_Int minor = 0;
+ FT_Int patch = 0;
+
+
+ if ( library )
+ {
+ major = library->version_major;
+ minor = library->version_minor;
+ patch = library->version_patch;
+ }
+
+ if ( amajor )
+ *amajor = major;
+
+ if ( aminor )
+ *aminor = minor;
+
+ if ( apatch )
+ *apatch = patch;
+ }
+
+
+ /* documentation is in ftmodapi.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Done_Library( FT_Library library )
+ {
+ FT_Memory memory;
+
+
+ if ( !library )
+ return FT_THROW( Invalid_Library_Handle );
+
+ library->refcount--;
+ if ( library->refcount > 0 )
+ goto Exit;
+
+ memory = library->memory;
+
+ /*
+ * Close all faces in the library. If we don't do this, we can have
+ * some subtle memory leaks.
+ *
+ * Example:
+ *
+ * - the cff font driver uses the pshinter module in cff_size_done
+ * - if the pshinter module is destroyed before the cff font driver,
+ * opened FT_Face objects managed by the driver are not properly
+ * destroyed, resulting in a memory leak
+ *
+ * Some faces are dependent on other faces, like Type42 faces that
+ * depend on TrueType faces synthesized internally.
+ *
+ * The order of drivers should be specified in driver_name[].
+ */
+ {
+ FT_UInt m, n;
+ const char* driver_name[] = { "type42", NULL };
+
+
+ for ( m = 0;
+ m < sizeof ( driver_name ) / sizeof ( driver_name[0] );
+ m++ )
+ {
+ for ( n = 0; n < library->num_modules; n++ )
+ {
+ FT_Module module = library->modules[n];
+ const char* module_name = module->clazz->module_name;
+ FT_List faces;
+
+
+ if ( driver_name[m] &&
+ ft_strcmp( module_name, driver_name[m] ) != 0 )
+ continue;
+
+ if ( ( module->clazz->module_flags & FT_MODULE_FONT_DRIVER ) == 0 )
+ continue;
+
+ FT_TRACE7(( "FT_Done_Library: close faces for %s\n", module_name ));
+
+ faces = &FT_DRIVER( module )->faces_list;
+ while ( faces->head )
+ {
+ FT_Done_Face( FT_FACE( faces->head->data ) );
+ if ( faces->head )
+ FT_TRACE0(( "FT_Done_Library: failed to free some faces\n" ));
+ }
+ }
+ }
+ }
+
+ /* Close all other modules in the library */
+#if 1
+ /* XXX Modules are removed in the reversed order so that */
+ /* type42 module is removed before truetype module. This */
+ /* avoids double free in some occasions. It is a hack. */
+ while ( library->num_modules > 0 )
+ FT_Remove_Module( library,
+ library->modules[library->num_modules - 1] );
+#else
+ {
+ FT_UInt n;
+
+
+ for ( n = 0; n < library->num_modules; n++ )
+ {
+ FT_Module module = library->modules[n];
+
+
+ if ( module )
+ {
+ Destroy_Module( module );
+ library->modules[n] = 0;
+ }
+ }
+ }
+#endif
+
+ /* Destroy raster objects */
+ FT_FREE( library->raster_pool );
+ library->raster_pool_size = 0;
+
+#ifdef FT_CONFIG_OPTION_PIC
+ /* Destroy pic container contents */
+ ft_pic_container_destroy( library );
+#endif
+
+ FT_FREE( library );
+
+ Exit:
+ return FT_Err_Ok;
+ }
+
+
+ /* documentation is in ftmodapi.h */
+
+ FT_EXPORT_DEF( void )
+ FT_Set_Debug_Hook( FT_Library library,
+ FT_UInt hook_index,
+ FT_DebugHook_Func debug_hook )
+ {
+ if ( library && debug_hook &&
+ hook_index <
+ ( sizeof ( library->debug_hooks ) / sizeof ( void* ) ) )
+ library->debug_hooks[hook_index] = debug_hook;
+ }
+
+
+ /* documentation is in ftmodapi.h */
+
+ FT_EXPORT_DEF( FT_TrueTypeEngineType )
+ FT_Get_TrueType_Engine_Type( FT_Library library )
+ {
+ FT_TrueTypeEngineType result = FT_TRUETYPE_ENGINE_TYPE_NONE;
+
+
+ if ( library )
+ {
+ FT_Module module = FT_Get_Module( library, "truetype" );
+
+
+ if ( module )
+ {
+ FT_Service_TrueTypeEngine service;
+
+
+ service = (FT_Service_TrueTypeEngine)
+ ft_module_get_service( module,
+ FT_SERVICE_ID_TRUETYPE_ENGINE );
+ if ( service )
+ result = service->engine_type;
+ }
+ }
+
+ return result;
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Get_SubGlyph_Info( FT_GlyphSlot glyph,
+ FT_UInt sub_index,
+ FT_Int *p_index,
+ FT_UInt *p_flags,
+ FT_Int *p_arg1,
+ FT_Int *p_arg2,
+ FT_Matrix *p_transform )
+ {
+ FT_Error error = FT_ERR( Invalid_Argument );
+
+
+ if ( glyph &&
+ glyph->subglyphs &&
+ glyph->format == FT_GLYPH_FORMAT_COMPOSITE &&
+ sub_index < glyph->num_subglyphs )
+ {
+ FT_SubGlyph subg = glyph->subglyphs + sub_index;
+
+
+ *p_index = subg->index;
+ *p_flags = subg->flags;
+ *p_arg1 = subg->arg1;
+ *p_arg2 = subg->arg2;
+ *p_transform = subg->transform;
+ }
+
+ return error;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftotval.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftotval.c
new file mode 100644
index 0000000000..898fd19ede
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftotval.c
@@ -0,0 +1,91 @@
+/***************************************************************************/
+/* */
+/* ftotval.c */
+/* */
+/* FreeType API for validating OpenType tables (body). */
+/* */
+/* Copyright 2004, 2006, 2008, 2010, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/services/svotval.h"
+#include "../../include/freetype/ftotval.h"
+
+
+ /* documentation is in ftotval.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_OpenType_Validate( FT_Face face,
+ FT_UInt validation_flags,
+ FT_Bytes *BASE_table,
+ FT_Bytes *GDEF_table,
+ FT_Bytes *GPOS_table,
+ FT_Bytes *GSUB_table,
+ FT_Bytes *JSTF_table )
+ {
+ FT_Service_OTvalidate service;
+ FT_Error error;
+
+
+ if ( !face )
+ {
+ error = FT_THROW( Invalid_Face_Handle );
+ goto Exit;
+ }
+
+ if ( !( BASE_table &&
+ GDEF_table &&
+ GPOS_table &&
+ GSUB_table &&
+ JSTF_table ) )
+ {
+ error = FT_THROW( Invalid_Argument );
+ goto Exit;
+ }
+
+ FT_FACE_FIND_GLOBAL_SERVICE( face, service, OPENTYPE_VALIDATE );
+
+ if ( service )
+ error = service->validate( face,
+ validation_flags,
+ BASE_table,
+ GDEF_table,
+ GPOS_table,
+ GSUB_table,
+ JSTF_table );
+ else
+ error = FT_THROW( Unimplemented_Feature );
+
+ Exit:
+ return error;
+ }
+
+
+ FT_EXPORT_DEF( void )
+ FT_OpenType_Free( FT_Face face,
+ FT_Bytes table )
+ {
+ FT_Memory memory;
+
+
+ if ( !face )
+ return;
+
+ memory = FT_FACE_MEMORY( face );
+
+ FT_FREE( table );
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftoutln.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftoutln.c
new file mode 100644
index 0000000000..61127707a3
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftoutln.c
@@ -0,0 +1,1081 @@
+/***************************************************************************/
+/* */
+/* ftoutln.c */
+/* */
+/* FreeType outline management (body). */
+/* */
+/* Copyright 1996-2008, 2010, 2012-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* All functions are declared in freetype.h. */
+ /* */
+ /*************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/ftoutln.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/ftcalc.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/fttrigon.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_outline
+
+
+ static
+ const FT_Outline null_outline = { 0, 0, 0, 0, 0, 0 };
+
+
+ /* documentation is in ftoutln.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Outline_Decompose( FT_Outline* outline,
+ const FT_Outline_Funcs* func_interface,
+ void* user )
+ {
+#undef SCALED
+#define SCALED( x ) ( ( (x) << shift ) - delta )
+
+ FT_Vector v_last;
+ FT_Vector v_control;
+ FT_Vector v_start;
+
+ FT_Vector* point;
+ FT_Vector* limit;
+ char* tags;
+
+ FT_Error error;
+
+ FT_Int n; /* index of contour in outline */
+ FT_UInt first; /* index of first point in contour */
+ FT_Int tag; /* current point's state */
+
+ FT_Int shift;
+ FT_Pos delta;
+
+
+ if ( !outline || !func_interface )
+ return FT_THROW( Invalid_Argument );
+
+ shift = func_interface->shift;
+ delta = func_interface->delta;
+ first = 0;
+
+ for ( n = 0; n < outline->n_contours; n++ )
+ {
+ FT_Int last; /* index of last point in contour */
+
+
+ FT_TRACE5(( "FT_Outline_Decompose: Outline %d\n", n ));
+
+ last = outline->contours[n];
+ if ( last < 0 )
+ goto Invalid_Outline;
+ limit = outline->points + last;
+
+ v_start = outline->points[first];
+ v_start.x = SCALED( v_start.x );
+ v_start.y = SCALED( v_start.y );
+
+ v_last = outline->points[last];
+ v_last.x = SCALED( v_last.x );
+ v_last.y = SCALED( v_last.y );
+
+ v_control = v_start;
+
+ point = outline->points + first;
+ tags = outline->tags + first;
+ tag = FT_CURVE_TAG( tags[0] );
+
+ /* A contour cannot start with a cubic control point! */
+ if ( tag == FT_CURVE_TAG_CUBIC )
+ goto Invalid_Outline;
+
+ /* check first point to determine origin */
+ if ( tag == FT_CURVE_TAG_CONIC )
+ {
+ /* first point is conic control. Yes, this happens. */
+ if ( FT_CURVE_TAG( outline->tags[last] ) == FT_CURVE_TAG_ON )
+ {
+ /* start at last point if it is on the curve */
+ v_start = v_last;
+ limit--;
+ }
+ else
+ {
+ /* if both first and last points are conic, */
+ /* start at their middle and record its position */
+ /* for closure */
+ v_start.x = ( v_start.x + v_last.x ) / 2;
+ v_start.y = ( v_start.y + v_last.y ) / 2;
+
+ v_last = v_start;
+ }
+ point--;
+ tags--;
+ }
+
+ FT_TRACE5(( " move to (%.2f, %.2f)\n",
+ v_start.x / 64.0, v_start.y / 64.0 ));
+ error = func_interface->move_to( &v_start, user );
+ if ( error )
+ goto Exit;
+
+ while ( point < limit )
+ {
+ point++;
+ tags++;
+
+ tag = FT_CURVE_TAG( tags[0] );
+ switch ( tag )
+ {
+ case FT_CURVE_TAG_ON: /* emit a single line_to */
+ {
+ FT_Vector vec;
+
+
+ vec.x = SCALED( point->x );
+ vec.y = SCALED( point->y );
+
+ FT_TRACE5(( " line to (%.2f, %.2f)\n",
+ vec.x / 64.0, vec.y / 64.0 ));
+ error = func_interface->line_to( &vec, user );
+ if ( error )
+ goto Exit;
+ continue;
+ }
+
+ case FT_CURVE_TAG_CONIC: /* consume conic arcs */
+ v_control.x = SCALED( point->x );
+ v_control.y = SCALED( point->y );
+
+ Do_Conic:
+ if ( point < limit )
+ {
+ FT_Vector vec;
+ FT_Vector v_middle;
+
+
+ point++;
+ tags++;
+ tag = FT_CURVE_TAG( tags[0] );
+
+ vec.x = SCALED( point->x );
+ vec.y = SCALED( point->y );
+
+ if ( tag == FT_CURVE_TAG_ON )
+ {
+ FT_TRACE5(( " conic to (%.2f, %.2f)"
+ " with control (%.2f, %.2f)\n",
+ vec.x / 64.0, vec.y / 64.0,
+ v_control.x / 64.0, v_control.y / 64.0 ));
+ error = func_interface->conic_to( &v_control, &vec, user );
+ if ( error )
+ goto Exit;
+ continue;
+ }
+
+ if ( tag != FT_CURVE_TAG_CONIC )
+ goto Invalid_Outline;
+
+ v_middle.x = ( v_control.x + vec.x ) / 2;
+ v_middle.y = ( v_control.y + vec.y ) / 2;
+
+ FT_TRACE5(( " conic to (%.2f, %.2f)"
+ " with control (%.2f, %.2f)\n",
+ v_middle.x / 64.0, v_middle.y / 64.0,
+ v_control.x / 64.0, v_control.y / 64.0 ));
+ error = func_interface->conic_to( &v_control, &v_middle, user );
+ if ( error )
+ goto Exit;
+
+ v_control = vec;
+ goto Do_Conic;
+ }
+
+ FT_TRACE5(( " conic to (%.2f, %.2f)"
+ " with control (%.2f, %.2f)\n",
+ v_start.x / 64.0, v_start.y / 64.0,
+ v_control.x / 64.0, v_control.y / 64.0 ));
+ error = func_interface->conic_to( &v_control, &v_start, user );
+ goto Close;
+
+ default: /* FT_CURVE_TAG_CUBIC */
+ {
+ FT_Vector vec1, vec2;
+
+
+ if ( point + 1 > limit ||
+ FT_CURVE_TAG( tags[1] ) != FT_CURVE_TAG_CUBIC )
+ goto Invalid_Outline;
+
+ point += 2;
+ tags += 2;
+
+ vec1.x = SCALED( point[-2].x );
+ vec1.y = SCALED( point[-2].y );
+
+ vec2.x = SCALED( point[-1].x );
+ vec2.y = SCALED( point[-1].y );
+
+ if ( point <= limit )
+ {
+ FT_Vector vec;
+
+
+ vec.x = SCALED( point->x );
+ vec.y = SCALED( point->y );
+
+ FT_TRACE5(( " cubic to (%.2f, %.2f)"
+ " with controls (%.2f, %.2f) and (%.2f, %.2f)\n",
+ vec.x / 64.0, vec.y / 64.0,
+ vec1.x / 64.0, vec1.y / 64.0,
+ vec2.x / 64.0, vec2.y / 64.0 ));
+ error = func_interface->cubic_to( &vec1, &vec2, &vec, user );
+ if ( error )
+ goto Exit;
+ continue;
+ }
+
+ FT_TRACE5(( " cubic to (%.2f, %.2f)"
+ " with controls (%.2f, %.2f) and (%.2f, %.2f)\n",
+ v_start.x / 64.0, v_start.y / 64.0,
+ vec1.x / 64.0, vec1.y / 64.0,
+ vec2.x / 64.0, vec2.y / 64.0 ));
+ error = func_interface->cubic_to( &vec1, &vec2, &v_start, user );
+ goto Close;
+ }
+ }
+ }
+
+ /* close the contour with a line segment */
+ FT_TRACE5(( " line to (%.2f, %.2f)\n",
+ v_start.x / 64.0, v_start.y / 64.0 ));
+ error = func_interface->line_to( &v_start, user );
+
+ Close:
+ if ( error )
+ goto Exit;
+
+ first = last + 1;
+ }
+
+ FT_TRACE5(( "FT_Outline_Decompose: Done\n", n ));
+ return FT_Err_Ok;
+
+ Exit:
+ FT_TRACE5(( "FT_Outline_Decompose: Error %d\n", error ));
+ return error;
+
+ Invalid_Outline:
+ return FT_THROW( Invalid_Outline );
+ }
+
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Outline_New_Internal( FT_Memory memory,
+ FT_UInt numPoints,
+ FT_Int numContours,
+ FT_Outline *anoutline )
+ {
+ FT_Error error;
+
+
+ if ( !anoutline || !memory )
+ return FT_THROW( Invalid_Argument );
+
+ *anoutline = null_outline;
+
+ if ( numContours < 0 ||
+ (FT_UInt)numContours > numPoints )
+ return FT_THROW( Invalid_Argument );
+
+ if ( numPoints > FT_OUTLINE_POINTS_MAX )
+ return FT_THROW( Array_Too_Large );
+
+ if ( FT_NEW_ARRAY( anoutline->points, numPoints ) ||
+ FT_NEW_ARRAY( anoutline->tags, numPoints ) ||
+ FT_NEW_ARRAY( anoutline->contours, numContours ) )
+ goto Fail;
+
+ anoutline->n_points = (FT_UShort)numPoints;
+ anoutline->n_contours = (FT_Short)numContours;
+ anoutline->flags |= FT_OUTLINE_OWNER;
+
+ return FT_Err_Ok;
+
+ Fail:
+ anoutline->flags |= FT_OUTLINE_OWNER;
+ FT_Outline_Done_Internal( memory, anoutline );
+
+ return error;
+ }
+
+
+ /* documentation is in ftoutln.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Outline_New( FT_Library library,
+ FT_UInt numPoints,
+ FT_Int numContours,
+ FT_Outline *anoutline )
+ {
+ if ( !library )
+ return FT_THROW( Invalid_Library_Handle );
+
+ return FT_Outline_New_Internal( library->memory, numPoints,
+ numContours, anoutline );
+ }
+
+
+ /* documentation is in ftoutln.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Outline_Check( FT_Outline* outline )
+ {
+ if ( outline )
+ {
+ FT_Int n_points = outline->n_points;
+ FT_Int n_contours = outline->n_contours;
+ FT_Int end0, end;
+ FT_Int n;
+
+
+ /* empty glyph? */
+ if ( n_points == 0 && n_contours == 0 )
+ return 0;
+
+ /* check point and contour counts */
+ if ( n_points <= 0 || n_contours <= 0 )
+ goto Bad;
+
+ end0 = end = -1;
+ for ( n = 0; n < n_contours; n++ )
+ {
+ end = outline->contours[n];
+
+ /* note that we don't accept empty contours */
+ if ( end <= end0 || end >= n_points )
+ goto Bad;
+
+ end0 = end;
+ }
+
+ if ( end != n_points - 1 )
+ goto Bad;
+
+ /* XXX: check the tags array */
+ return 0;
+ }
+
+ Bad:
+ return FT_THROW( Invalid_Argument );
+ }
+
+
+ /* documentation is in ftoutln.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Outline_Copy( const FT_Outline* source,
+ FT_Outline *target )
+ {
+ FT_Int is_owner;
+
+
+ if ( !source || !target ||
+ source->n_points != target->n_points ||
+ source->n_contours != target->n_contours )
+ return FT_THROW( Invalid_Argument );
+
+ if ( source == target )
+ return FT_Err_Ok;
+
+ FT_ARRAY_COPY( target->points, source->points, source->n_points );
+
+ FT_ARRAY_COPY( target->tags, source->tags, source->n_points );
+
+ FT_ARRAY_COPY( target->contours, source->contours, source->n_contours );
+
+ /* copy all flags, except the `FT_OUTLINE_OWNER' one */
+ is_owner = target->flags & FT_OUTLINE_OWNER;
+ target->flags = source->flags;
+
+ target->flags &= ~FT_OUTLINE_OWNER;
+ target->flags |= is_owner;
+
+ return FT_Err_Ok;
+ }
+
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Outline_Done_Internal( FT_Memory memory,
+ FT_Outline* outline )
+ {
+ if ( memory && outline )
+ {
+ if ( outline->flags & FT_OUTLINE_OWNER )
+ {
+ FT_FREE( outline->points );
+ FT_FREE( outline->tags );
+ FT_FREE( outline->contours );
+ }
+ *outline = null_outline;
+
+ return FT_Err_Ok;
+ }
+ else
+ return FT_THROW( Invalid_Argument );
+ }
+
+
+ /* documentation is in ftoutln.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Outline_Done( FT_Library library,
+ FT_Outline* outline )
+ {
+ /* check for valid `outline' in FT_Outline_Done_Internal() */
+
+ if ( !library )
+ return FT_THROW( Invalid_Library_Handle );
+
+ return FT_Outline_Done_Internal( library->memory, outline );
+ }
+
+
+ /* documentation is in ftoutln.h */
+
+ FT_EXPORT_DEF( void )
+ FT_Outline_Get_CBox( const FT_Outline* outline,
+ FT_BBox *acbox )
+ {
+ FT_Pos xMin, yMin, xMax, yMax;
+
+
+ if ( outline && acbox )
+ {
+ if ( outline->n_points == 0 )
+ {
+ xMin = 0;
+ yMin = 0;
+ xMax = 0;
+ yMax = 0;
+ }
+ else
+ {
+ FT_Vector* vec = outline->points;
+ FT_Vector* limit = vec + outline->n_points;
+
+
+ xMin = xMax = vec->x;
+ yMin = yMax = vec->y;
+ vec++;
+
+ for ( ; vec < limit; vec++ )
+ {
+ FT_Pos x, y;
+
+
+ x = vec->x;
+ if ( x < xMin ) xMin = x;
+ if ( x > xMax ) xMax = x;
+
+ y = vec->y;
+ if ( y < yMin ) yMin = y;
+ if ( y > yMax ) yMax = y;
+ }
+ }
+ acbox->xMin = xMin;
+ acbox->xMax = xMax;
+ acbox->yMin = yMin;
+ acbox->yMax = yMax;
+ }
+ }
+
+
+ /* documentation is in ftoutln.h */
+
+ FT_EXPORT_DEF( void )
+ FT_Outline_Translate( const FT_Outline* outline,
+ FT_Pos xOffset,
+ FT_Pos yOffset )
+ {
+ FT_UShort n;
+ FT_Vector* vec;
+
+
+ if ( !outline )
+ return;
+
+ vec = outline->points;
+
+ for ( n = 0; n < outline->n_points; n++ )
+ {
+ vec->x += xOffset;
+ vec->y += yOffset;
+ vec++;
+ }
+ }
+
+
+ /* documentation is in ftoutln.h */
+
+ FT_EXPORT_DEF( void )
+ FT_Outline_Reverse( FT_Outline* outline )
+ {
+ FT_UShort n;
+ FT_Int first, last;
+
+
+ if ( !outline )
+ return;
+
+ first = 0;
+
+ for ( n = 0; n < outline->n_contours; n++ )
+ {
+ last = outline->contours[n];
+
+ /* reverse point table */
+ {
+ FT_Vector* p = outline->points + first;
+ FT_Vector* q = outline->points + last;
+ FT_Vector swap;
+
+
+ while ( p < q )
+ {
+ swap = *p;
+ *p = *q;
+ *q = swap;
+ p++;
+ q--;
+ }
+ }
+
+ /* reverse tags table */
+ {
+ char* p = outline->tags + first;
+ char* q = outline->tags + last;
+ char swap;
+
+
+ while ( p < q )
+ {
+ swap = *p;
+ *p = *q;
+ *q = swap;
+ p++;
+ q--;
+ }
+ }
+
+ first = last + 1;
+ }
+
+ outline->flags ^= FT_OUTLINE_REVERSE_FILL;
+ }
+
+
+ /* documentation is in ftoutln.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Outline_Render( FT_Library library,
+ FT_Outline* outline,
+ FT_Raster_Params* params )
+ {
+ FT_Error error;
+ FT_Bool update = FALSE;
+ FT_Renderer renderer;
+ FT_ListNode node;
+
+
+ if ( !library )
+ return FT_THROW( Invalid_Library_Handle );
+
+ if ( !outline || !params )
+ return FT_THROW( Invalid_Argument );
+
+ renderer = library->cur_renderer;
+ node = library->renderers.head;
+
+ params->source = (void*)outline;
+
+ error = FT_ERR( Cannot_Render_Glyph );
+ while ( renderer )
+ {
+ error = renderer->raster_render( renderer->raster, params );
+ if ( !error || FT_ERR_NEQ( error, Cannot_Render_Glyph ) )
+ break;
+
+ /* FT_Err_Cannot_Render_Glyph is returned if the render mode */
+ /* is unsupported by the current renderer for this glyph image */
+ /* format */
+
+ /* now, look for another renderer that supports the same */
+ /* format */
+ renderer = FT_Lookup_Renderer( library, FT_GLYPH_FORMAT_OUTLINE,
+ &node );
+ update = TRUE;
+ }
+
+ /* if we changed the current renderer for the glyph image format */
+ /* we need to select it as the next current one */
+ if ( !error && update && renderer )
+ FT_Set_Renderer( library, renderer, 0, 0 );
+
+ return error;
+ }
+
+
+ /* documentation is in ftoutln.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Outline_Get_Bitmap( FT_Library library,
+ FT_Outline* outline,
+ const FT_Bitmap *abitmap )
+ {
+ FT_Raster_Params params;
+
+
+ if ( !abitmap )
+ return FT_THROW( Invalid_Argument );
+
+ /* other checks are delayed to FT_Outline_Render() */
+
+ params.target = abitmap;
+ params.flags = 0;
+
+ if ( abitmap->pixel_mode == FT_PIXEL_MODE_GRAY ||
+ abitmap->pixel_mode == FT_PIXEL_MODE_LCD ||
+ abitmap->pixel_mode == FT_PIXEL_MODE_LCD_V )
+ params.flags |= FT_RASTER_FLAG_AA;
+
+ return FT_Outline_Render( library, outline, &params );
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( void )
+ FT_Vector_Transform( FT_Vector* vector,
+ const FT_Matrix* matrix )
+ {
+ FT_Pos xz, yz;
+
+
+ if ( !vector || !matrix )
+ return;
+
+ xz = FT_MulFix( vector->x, matrix->xx ) +
+ FT_MulFix( vector->y, matrix->xy );
+
+ yz = FT_MulFix( vector->x, matrix->yx ) +
+ FT_MulFix( vector->y, matrix->yy );
+
+ vector->x = xz;
+ vector->y = yz;
+ }
+
+
+ /* documentation is in ftoutln.h */
+
+ FT_EXPORT_DEF( void )
+ FT_Outline_Transform( const FT_Outline* outline,
+ const FT_Matrix* matrix )
+ {
+ FT_Vector* vec;
+ FT_Vector* limit;
+
+
+ if ( !outline || !matrix )
+ return;
+
+ vec = outline->points;
+ limit = vec + outline->n_points;
+
+ for ( ; vec < limit; vec++ )
+ FT_Vector_Transform( vec, matrix );
+ }
+
+
+#if 0
+
+#define FT_OUTLINE_GET_CONTOUR( outline, c, first, last ) \
+ do { \
+ (first) = ( c > 0 ) ? (outline)->points + \
+ (outline)->contours[c - 1] + 1 \
+ : (outline)->points; \
+ (last) = (outline)->points + (outline)->contours[c]; \
+ } while ( 0 )
+
+
+ /* Is a point in some contour? */
+ /* */
+ /* We treat every point of the contour as if it */
+ /* it were ON. That is, we allow false positives, */
+ /* but disallow false negatives. (XXX really?) */
+ static FT_Bool
+ ft_contour_has( FT_Outline* outline,
+ FT_Short c,
+ FT_Vector* point )
+ {
+ FT_Vector* first;
+ FT_Vector* last;
+ FT_Vector* a;
+ FT_Vector* b;
+ FT_UInt n = 0;
+
+
+ FT_OUTLINE_GET_CONTOUR( outline, c, first, last );
+
+ for ( a = first; a <= last; a++ )
+ {
+ FT_Pos x;
+ FT_Int intersect;
+
+
+ b = ( a == last ) ? first : a + 1;
+
+ intersect = ( a->y - point->y ) ^ ( b->y - point->y );
+
+ /* a and b are on the same side */
+ if ( intersect >= 0 )
+ {
+ if ( intersect == 0 && a->y == point->y )
+ {
+ if ( ( a->x <= point->x && b->x >= point->x ) ||
+ ( a->x >= point->x && b->x <= point->x ) )
+ return 1;
+ }
+
+ continue;
+ }
+
+ x = a->x + ( b->x - a->x ) * (point->y - a->y ) / ( b->y - a->y );
+
+ if ( x < point->x )
+ n++;
+ else if ( x == point->x )
+ return 1;
+ }
+
+ return n & 1;
+ }
+
+
+ static FT_Bool
+ ft_contour_enclosed( FT_Outline* outline,
+ FT_UShort c )
+ {
+ FT_Vector* first;
+ FT_Vector* last;
+ FT_Short i;
+
+
+ FT_OUTLINE_GET_CONTOUR( outline, c, first, last );
+
+ for ( i = 0; i < outline->n_contours; i++ )
+ {
+ if ( i != c && ft_contour_has( outline, i, first ) )
+ {
+ FT_Vector* pt;
+
+
+ for ( pt = first + 1; pt <= last; pt++ )
+ if ( !ft_contour_has( outline, i, pt ) )
+ return 0;
+
+ return 1;
+ }
+ }
+
+ return 0;
+ }
+
+
+ /* This version differs from the public one in that each */
+ /* part (contour not enclosed in another contour) of the */
+ /* outline is checked for orientation. This is */
+ /* necessary for some buggy CJK fonts. */
+ static FT_Orientation
+ ft_outline_get_orientation( FT_Outline* outline )
+ {
+ FT_Short i;
+ FT_Vector* first;
+ FT_Vector* last;
+ FT_Orientation orient = FT_ORIENTATION_NONE;
+
+
+ first = outline->points;
+ for ( i = 0; i < outline->n_contours; i++, first = last + 1 )
+ {
+ FT_Vector* point;
+ FT_Vector* xmin_point;
+ FT_Pos xmin;
+
+
+ last = outline->points + outline->contours[i];
+
+ /* skip degenerate contours */
+ if ( last < first + 2 )
+ continue;
+
+ if ( ft_contour_enclosed( outline, i ) )
+ continue;
+
+ xmin = first->x;
+ xmin_point = first;
+
+ for ( point = first + 1; point <= last; point++ )
+ {
+ if ( point->x < xmin )
+ {
+ xmin = point->x;
+ xmin_point = point;
+ }
+ }
+
+ /* check the orientation of the contour */
+ {
+ FT_Vector* prev;
+ FT_Vector* next;
+ FT_Orientation o;
+
+
+ prev = ( xmin_point == first ) ? last : xmin_point - 1;
+ next = ( xmin_point == last ) ? first : xmin_point + 1;
+
+ if ( FT_Atan2( prev->x - xmin_point->x, prev->y - xmin_point->y ) >
+ FT_Atan2( next->x - xmin_point->x, next->y - xmin_point->y ) )
+ o = FT_ORIENTATION_POSTSCRIPT;
+ else
+ o = FT_ORIENTATION_TRUETYPE;
+
+ if ( orient == FT_ORIENTATION_NONE )
+ orient = o;
+ else if ( orient != o )
+ return FT_ORIENTATION_NONE;
+ }
+ }
+
+ return orient;
+ }
+
+#endif /* 0 */
+
+
+ /* documentation is in ftoutln.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Outline_Embolden( FT_Outline* outline,
+ FT_Pos strength )
+ {
+ return FT_Outline_EmboldenXY( outline, strength, strength );
+ }
+
+
+ /* documentation is in ftoutln.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Outline_EmboldenXY( FT_Outline* outline,
+ FT_Pos xstrength,
+ FT_Pos ystrength )
+ {
+ FT_Vector* points;
+ FT_Vector v_prev, v_first, v_next, v_cur;
+ FT_Int c, n, first;
+ FT_Int orientation;
+
+
+ if ( !outline )
+ return FT_THROW( Invalid_Argument );
+
+ xstrength /= 2;
+ ystrength /= 2;
+ if ( xstrength == 0 && ystrength == 0 )
+ return FT_Err_Ok;
+
+ orientation = FT_Outline_Get_Orientation( outline );
+ if ( orientation == FT_ORIENTATION_NONE )
+ {
+ if ( outline->n_contours )
+ return FT_THROW( Invalid_Argument );
+ else
+ return FT_Err_Ok;
+ }
+
+ points = outline->points;
+
+ first = 0;
+ for ( c = 0; c < outline->n_contours; c++ )
+ {
+ FT_Vector in, out, shift;
+ FT_Fixed l_in, l_out, l, q, d;
+ int last = outline->contours[c];
+
+
+ v_first = points[first];
+ v_prev = points[last];
+ v_cur = v_first;
+
+ /* compute incoming normalized vector */
+ in.x = v_cur.x - v_prev.x;
+ in.y = v_cur.y - v_prev.y;
+ l_in = FT_Vector_Length( &in );
+ if ( l_in )
+ {
+ in.x = FT_DivFix( in.x, l_in );
+ in.y = FT_DivFix( in.y, l_in );
+ }
+
+ for ( n = first; n <= last; n++ )
+ {
+ if ( n < last )
+ v_next = points[n + 1];
+ else
+ v_next = v_first;
+
+ /* compute outgoing normalized vector */
+ out.x = v_next.x - v_cur.x;
+ out.y = v_next.y - v_cur.y;
+ l_out = FT_Vector_Length( &out );
+ if ( l_out )
+ {
+ out.x = FT_DivFix( out.x, l_out );
+ out.y = FT_DivFix( out.y, l_out );
+ }
+
+ d = FT_MulFix( in.x, out.x ) + FT_MulFix( in.y, out.y );
+
+ /* shift only if turn is less than ~160 degrees */
+ if ( d > -0xF000L )
+ {
+ d = d + 0x10000L;
+
+ /* shift components are aligned along lateral bisector */
+ /* and directed according to the outline orientation. */
+ shift.x = in.y + out.y;
+ shift.y = in.x + out.x;
+
+ if ( orientation == FT_ORIENTATION_TRUETYPE )
+ shift.x = -shift.x;
+ else
+ shift.y = -shift.y;
+
+ /* restrict shift magnitude to better handle collapsing segments */
+ q = FT_MulFix( out.x, in.y ) - FT_MulFix( out.y, in.x );
+ if ( orientation == FT_ORIENTATION_TRUETYPE )
+ q = -q;
+
+ l = FT_MIN( l_in, l_out );
+
+ /* non-strict inequalities avoid divide-by-zero when q == l == 0 */
+ if ( FT_MulFix( xstrength, q ) <= FT_MulFix( d, l ) )
+ shift.x = FT_MulDiv( shift.x, xstrength, d );
+ else
+ shift.x = FT_MulDiv( shift.x, l, q );
+
+
+ if ( FT_MulFix( ystrength, q ) <= FT_MulFix( d, l ) )
+ shift.y = FT_MulDiv( shift.y, ystrength, d );
+ else
+ shift.y = FT_MulDiv( shift.y, l, q );
+ }
+ else
+ shift.x = shift.y = 0;
+
+ outline->points[n].x = v_cur.x + xstrength + shift.x;
+ outline->points[n].y = v_cur.y + ystrength + shift.y;
+
+ in = out;
+ l_in = l_out;
+ v_cur = v_next;
+ }
+
+ first = last + 1;
+ }
+
+ return FT_Err_Ok;
+ }
+
+
+ /* documentation is in ftoutln.h */
+
+ FT_EXPORT_DEF( FT_Orientation )
+ FT_Outline_Get_Orientation( FT_Outline* outline )
+ {
+ FT_BBox cbox;
+ FT_Int xshift, yshift;
+ FT_Vector* points;
+ FT_Vector v_prev, v_cur;
+ FT_Int c, n, first;
+ FT_Pos area = 0;
+
+
+ if ( !outline || outline->n_points <= 0 )
+ return FT_ORIENTATION_TRUETYPE;
+
+ /* We use the nonzero winding rule to find the orientation. */
+ /* Since glyph outlines behave much more `regular' than arbitrary */
+ /* cubic or quadratic curves, this test deals with the polygon */
+ /* only which is spanned up by the control points. */
+
+ FT_Outline_Get_CBox( outline, &cbox );
+
+ xshift = FT_MSB( FT_ABS( cbox.xMax ) | FT_ABS( cbox.xMin ) ) - 14;
+ xshift = FT_MAX( xshift, 0 );
+
+ yshift = FT_MSB( cbox.yMax - cbox.yMin ) - 14;
+ yshift = FT_MAX( yshift, 0 );
+
+ points = outline->points;
+
+ first = 0;
+ for ( c = 0; c < outline->n_contours; c++ )
+ {
+ FT_Int last = outline->contours[c];
+
+
+ v_prev = points[last];
+
+ for ( n = first; n <= last; n++ )
+ {
+ v_cur = points[n];
+ area += ( ( v_cur.y - v_prev.y ) >> yshift ) *
+ ( ( v_cur.x + v_prev.x ) >> xshift );
+ v_prev = v_cur;
+ }
+
+ first = last + 1;
+ }
+
+ if ( area > 0 )
+ return FT_ORIENTATION_POSTSCRIPT;
+ else if ( area < 0 )
+ return FT_ORIENTATION_TRUETYPE;
+ else
+ return FT_ORIENTATION_NONE;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftpatent.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftpatent.c
new file mode 100644
index 0000000000..589119c3bb
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftpatent.c
@@ -0,0 +1,286 @@
+/***************************************************************************/
+/* */
+/* ftpatent.c */
+/* */
+/* FreeType API for checking patented TrueType bytecode instructions */
+/* (body). */
+/* */
+/* Copyright 2007, 2008, 2010 by David Turner. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/freetype.h"
+#include "../../include/freetype/tttags.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/internal/services/svsfnt.h"
+#include "../../include/freetype/internal/services/svttglyf.h"
+
+
+ static FT_Bool
+ _tt_check_patents_in_range( FT_Stream stream,
+ FT_ULong size )
+ {
+ FT_Bool result = FALSE;
+ FT_Error error;
+ FT_Bytes p, end;
+
+
+ if ( FT_FRAME_ENTER( size ) )
+ return 0;
+
+ p = stream->cursor;
+ end = p + size;
+
+ while ( p < end )
+ {
+ switch (p[0])
+ {
+ case 0x06: /* SPvTL // */
+ case 0x07: /* SPvTL + */
+ case 0x08: /* SFvTL // */
+ case 0x09: /* SFvTL + */
+ case 0x0A: /* SPvFS */
+ case 0x0B: /* SFvFS */
+ result = TRUE;
+ goto Exit;
+
+ case 0x40:
+ if ( p + 1 >= end )
+ goto Exit;
+
+ p += p[1] + 2;
+ break;
+
+ case 0x41:
+ if ( p + 1 >= end )
+ goto Exit;
+
+ p += p[1] * 2 + 2;
+ break;
+
+ case 0x71: /* DELTAP2 */
+ case 0x72: /* DELTAP3 */
+ case 0x73: /* DELTAC0 */
+ case 0x74: /* DELTAC1 */
+ case 0x75: /* DELTAC2 */
+ result = TRUE;
+ goto Exit;
+
+ case 0xB0:
+ case 0xB1:
+ case 0xB2:
+ case 0xB3:
+ case 0xB4:
+ case 0xB5:
+ case 0xB6:
+ case 0xB7:
+ p += ( p[0] - 0xB0 ) + 2;
+ break;
+
+ case 0xB8:
+ case 0xB9:
+ case 0xBA:
+ case 0xBB:
+ case 0xBC:
+ case 0xBD:
+ case 0xBE:
+ case 0xBF:
+ p += ( p[0] - 0xB8 ) * 2 + 3;
+ break;
+
+ default:
+ p += 1;
+ break;
+ }
+ }
+
+ Exit:
+ FT_UNUSED( error );
+ FT_FRAME_EXIT();
+ return result;
+ }
+
+
+ static FT_Bool
+ _tt_check_patents_in_table( FT_Face face,
+ FT_ULong tag )
+ {
+ FT_Stream stream = face->stream;
+ FT_Error error = FT_Err_Ok;
+ FT_Service_SFNT_Table service;
+ FT_Bool result = FALSE;
+
+
+ FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE );
+
+ if ( service )
+ {
+ FT_UInt i = 0;
+ FT_ULong tag_i = 0, offset_i = 0, length_i = 0;
+
+
+ for ( i = 0; !error && tag_i != tag ; i++ )
+ error = service->table_info( face, i,
+ &tag_i, &offset_i, &length_i );
+
+ if ( error ||
+ FT_STREAM_SEEK( offset_i ) )
+ goto Exit;
+
+ result = _tt_check_patents_in_range( stream, length_i );
+ }
+
+ Exit:
+ return result;
+ }
+
+
+ static FT_Bool
+ _tt_face_check_patents( FT_Face face )
+ {
+ FT_Stream stream = face->stream;
+ FT_UInt gindex;
+ FT_Error error;
+ FT_Bool result;
+
+ FT_Service_TTGlyf service;
+
+
+ result = _tt_check_patents_in_table( face, TTAG_fpgm );
+ if ( result )
+ goto Exit;
+
+ result = _tt_check_patents_in_table( face, TTAG_prep );
+ if ( result )
+ goto Exit;
+
+ FT_FACE_FIND_SERVICE( face, service, TT_GLYF );
+ if ( service == NULL )
+ goto Exit;
+
+ for ( gindex = 0; gindex < (FT_UInt)face->num_glyphs; gindex++ )
+ {
+ FT_ULong offset, num_ins, size;
+ FT_Int num_contours;
+
+
+ offset = service->get_location( face, gindex, &size );
+ if ( size == 0 )
+ continue;
+
+ if ( FT_STREAM_SEEK( offset ) ||
+ FT_READ_SHORT( num_contours ) )
+ continue;
+
+ if ( num_contours >= 0 ) /* simple glyph */
+ {
+ if ( FT_STREAM_SKIP( 8 + num_contours * 2 ) )
+ continue;
+ }
+ else /* compound glyph */
+ {
+ FT_Bool has_instr = 0;
+
+
+ if ( FT_STREAM_SKIP( 8 ) )
+ continue;
+
+ /* now read each component */
+ for (;;)
+ {
+ FT_UInt flags, toskip;
+
+
+ if( FT_READ_USHORT( flags ) )
+ break;
+
+ toskip = 2 + 1 + 1;
+
+ if ( ( flags & ( 1 << 0 ) ) != 0 ) /* ARGS_ARE_WORDS */
+ toskip += 2;
+
+ if ( ( flags & ( 1 << 3 ) ) != 0 ) /* WE_HAVE_A_SCALE */
+ toskip += 2;
+ else if ( ( flags & ( 1 << 6 ) ) != 0 ) /* WE_HAVE_X_Y_SCALE */
+ toskip += 4;
+ else if ( ( flags & ( 1 << 7 ) ) != 0 ) /* WE_HAVE_A_2x2 */
+ toskip += 8;
+
+ if ( ( flags & ( 1 << 8 ) ) != 0 ) /* WE_HAVE_INSTRUCTIONS */
+ has_instr = 1;
+
+ if ( FT_STREAM_SKIP( toskip ) )
+ goto NextGlyph;
+
+ if ( ( flags & ( 1 << 5 ) ) == 0 ) /* MORE_COMPONENTS */
+ break;
+ }
+
+ if ( !has_instr )
+ goto NextGlyph;
+ }
+
+ if ( FT_READ_USHORT( num_ins ) )
+ continue;
+
+ result = _tt_check_patents_in_range( stream, num_ins );
+ if ( result )
+ goto Exit;
+
+ NextGlyph:
+ ;
+ }
+
+ Exit:
+ return result;
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_Bool )
+ FT_Face_CheckTrueTypePatents( FT_Face face )
+ {
+ FT_Bool result = FALSE;
+
+
+ if ( face && FT_IS_SFNT( face ) )
+ result = _tt_face_check_patents( face );
+
+ return result;
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_Bool )
+ FT_Face_SetUnpatentedHinting( FT_Face face,
+ FT_Bool value )
+ {
+ FT_Bool result = FALSE;
+
+
+#if defined( TT_CONFIG_OPTION_UNPATENTED_HINTING ) && \
+ !defined( TT_CONFIG_OPTION_BYTECODE_INTERPRETER )
+ if ( face && FT_IS_SFNT( face ) )
+ {
+ result = !face->internal->ignore_unpatented_hinter;
+ face->internal->ignore_unpatented_hinter = !value;
+ }
+#else
+ FT_UNUSED( face );
+ FT_UNUSED( value );
+#endif
+
+ return result;
+ }
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftpfr.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftpfr.c
new file mode 100644
index 0000000000..1ea6888efa
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftpfr.c
@@ -0,0 +1,146 @@
+/***************************************************************************/
+/* */
+/* ftpfr.c */
+/* */
+/* FreeType API for accessing PFR-specific data (body). */
+/* */
+/* Copyright 2002-2004, 2008, 2010, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/services/svpfr.h"
+
+
+ /* check the format */
+ static FT_Service_PfrMetrics
+ ft_pfr_check( FT_Face face )
+ {
+ FT_Service_PfrMetrics service = NULL;
+
+
+ if ( face )
+ FT_FACE_LOOKUP_SERVICE( face, service, PFR_METRICS );
+
+ return service;
+ }
+
+
+ /* documentation is in ftpfr.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Get_PFR_Metrics( FT_Face face,
+ FT_UInt *aoutline_resolution,
+ FT_UInt *ametrics_resolution,
+ FT_Fixed *ametrics_x_scale,
+ FT_Fixed *ametrics_y_scale )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_Service_PfrMetrics service;
+
+
+ if ( !face )
+ return FT_THROW( Invalid_Argument );
+
+ service = ft_pfr_check( face );
+ if ( service )
+ {
+ error = service->get_metrics( face,
+ aoutline_resolution,
+ ametrics_resolution,
+ ametrics_x_scale,
+ ametrics_y_scale );
+ }
+ else
+ {
+ FT_Fixed x_scale, y_scale;
+
+
+ /* this is not a PFR font */
+ if ( aoutline_resolution )
+ *aoutline_resolution = face->units_per_EM;
+
+ if ( ametrics_resolution )
+ *ametrics_resolution = face->units_per_EM;
+
+ x_scale = y_scale = 0x10000L;
+ if ( face->size )
+ {
+ x_scale = face->size->metrics.x_scale;
+ y_scale = face->size->metrics.y_scale;
+ }
+
+ if ( ametrics_x_scale )
+ *ametrics_x_scale = x_scale;
+
+ if ( ametrics_y_scale )
+ *ametrics_y_scale = y_scale;
+
+ error = FT_THROW( Unknown_File_Format );
+ }
+
+ return error;
+ }
+
+
+ /* documentation is in ftpfr.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Get_PFR_Kerning( FT_Face face,
+ FT_UInt left,
+ FT_UInt right,
+ FT_Vector *avector )
+ {
+ FT_Error error;
+ FT_Service_PfrMetrics service;
+
+
+ if ( !face )
+ return FT_THROW( Invalid_Argument );
+
+ service = ft_pfr_check( face );
+ if ( service )
+ error = service->get_kerning( face, left, right, avector );
+ else
+ error = FT_Get_Kerning( face, left, right,
+ FT_KERNING_UNSCALED, avector );
+
+ return error;
+ }
+
+
+ /* documentation is in ftpfr.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Get_PFR_Advance( FT_Face face,
+ FT_UInt gindex,
+ FT_Pos *aadvance )
+ {
+ FT_Error error;
+ FT_Service_PfrMetrics service;
+
+
+ service = ft_pfr_check( face );
+ if ( service )
+ {
+ error = service->get_advance( face, gindex, aadvance );
+ }
+ else
+ /* XXX: TODO: PROVIDE ADVANCE-LOADING METHOD TO ALL FONT DRIVERS */
+ error = FT_THROW( Invalid_Argument );
+
+ return error;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftpic.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftpic.c
new file mode 100644
index 0000000000..45c9ad20f1
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftpic.c
@@ -0,0 +1,55 @@
+/***************************************************************************/
+/* */
+/* ftpic.c */
+/* */
+/* The FreeType position independent code services (body). */
+/* */
+/* Copyright 2009 by */
+/* Oran Agra and Mickey Gabel. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/freetype.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "basepic.h"
+
+#ifdef FT_CONFIG_OPTION_PIC
+
+ /* documentation is in ftpic.h */
+
+ FT_BASE_DEF( FT_Error )
+ ft_pic_container_init( FT_Library library )
+ {
+ FT_PIC_Container* pic_container = &library->pic_container;
+ FT_Error error = FT_Err_Ok;
+
+
+ FT_MEM_SET( pic_container, 0, sizeof ( *pic_container ) );
+
+ error = ft_base_pic_init( library );
+ if ( error )
+ return error;
+
+ return FT_Err_Ok;
+ }
+
+
+ /* Destroy the contents of the container. */
+ FT_BASE_DEF( void )
+ ft_pic_container_destroy( FT_Library library )
+ {
+ ft_base_pic_free( library );
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftrfork.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftrfork.c
new file mode 100644
index 0000000000..8ab830ea27
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftrfork.c
@@ -0,0 +1,849 @@
+/***************************************************************************/
+/* */
+/* ftrfork.c */
+/* */
+/* Embedded resource forks accessor (body). */
+/* */
+/* Copyright 2004-2010, 2013 by */
+/* Masatake YAMATO and Redhat K.K. */
+/* */
+/* FT_Raccess_Get_HeaderInfo() and raccess_guess_darwin_hfsplus() are */
+/* derived from ftobjs.c. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+/***************************************************************************/
+/* Development of the code in this file is support of */
+/* Information-technology Promotion Agency, Japan. */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/internal/ftrfork.h"
+#include "basepic.h"
+
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_raccess
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** ****/
+ /**** Resource fork directory access ****/
+ /**** ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ FT_BASE_DEF( FT_Error )
+ FT_Raccess_Get_HeaderInfo( FT_Library library,
+ FT_Stream stream,
+ FT_Long rfork_offset,
+ FT_Long *map_offset,
+ FT_Long *rdata_pos )
+ {
+ FT_Error error;
+ unsigned char head[16], head2[16];
+ FT_Long map_pos, rdata_len;
+ int allzeros, allmatch, i;
+ FT_Long type_list;
+
+ FT_UNUSED( library );
+
+
+ error = FT_Stream_Seek( stream, rfork_offset );
+ if ( error )
+ return error;
+
+ error = FT_Stream_Read( stream, (FT_Byte *)head, 16 );
+ if ( error )
+ return error;
+
+ *rdata_pos = rfork_offset + ( ( head[0] << 24 ) |
+ ( head[1] << 16 ) |
+ ( head[2] << 8 ) |
+ head[3] );
+ map_pos = rfork_offset + ( ( head[4] << 24 ) |
+ ( head[5] << 16 ) |
+ ( head[6] << 8 ) |
+ head[7] );
+ rdata_len = ( head[ 8] << 24 ) |
+ ( head[ 9] << 16 ) |
+ ( head[10] << 8 ) |
+ head[11];
+
+ /* map_len = head[12] .. head[15] */
+
+ if ( *rdata_pos + rdata_len != map_pos || map_pos == rfork_offset )
+ return FT_THROW( Unknown_File_Format );
+
+ error = FT_Stream_Seek( stream, map_pos );
+ if ( error )
+ return error;
+
+ head2[15] = (FT_Byte)( head[15] + 1 ); /* make it be different */
+
+ error = FT_Stream_Read( stream, (FT_Byte*)head2, 16 );
+ if ( error )
+ return error;
+
+ allzeros = 1;
+ allmatch = 1;
+ for ( i = 0; i < 16; ++i )
+ {
+ if ( head2[i] != 0 )
+ allzeros = 0;
+ if ( head2[i] != head[i] )
+ allmatch = 0;
+ }
+ if ( !allzeros && !allmatch )
+ return FT_THROW( Unknown_File_Format );
+
+ /* If we have reached this point then it is probably a mac resource */
+ /* file. Now, does it contain any interesting resources? */
+ /* Skip handle to next resource map, the file resource number, and */
+ /* attributes. */
+ (void)FT_STREAM_SKIP( 4 /* skip handle to next resource map */
+ + 2 /* skip file resource number */
+ + 2 ); /* skip attributes */
+
+ if ( FT_READ_USHORT( type_list ) )
+ return error;
+ if ( type_list == -1 )
+ return FT_THROW( Unknown_File_Format );
+
+ error = FT_Stream_Seek( stream, map_pos + type_list );
+ if ( error )
+ return error;
+
+ *map_offset = map_pos + type_list;
+ return FT_Err_Ok;
+ }
+
+
+ static int
+ ft_raccess_sort_ref_by_id( FT_RFork_Ref* a,
+ FT_RFork_Ref* b )
+ {
+ if ( a->res_id < b->res_id )
+ return -1;
+ else if ( a->res_id > b->res_id )
+ return 1;
+ else
+ return 0;
+ }
+
+
+ FT_BASE_DEF( FT_Error )
+ FT_Raccess_Get_DataOffsets( FT_Library library,
+ FT_Stream stream,
+ FT_Long map_offset,
+ FT_Long rdata_pos,
+ FT_Long tag,
+ FT_Long **offsets,
+ FT_Long *count )
+ {
+ FT_Error error;
+ int i, j, cnt, subcnt;
+ FT_Long tag_internal, rpos;
+ FT_Memory memory = library->memory;
+ FT_Long temp;
+ FT_Long *offsets_internal = NULL;
+ FT_RFork_Ref *ref = NULL;
+
+
+ error = FT_Stream_Seek( stream, map_offset );
+ if ( error )
+ return error;
+
+ if ( FT_READ_USHORT( cnt ) )
+ return error;
+ cnt++;
+
+ for ( i = 0; i < cnt; ++i )
+ {
+ if ( FT_READ_LONG( tag_internal ) ||
+ FT_READ_USHORT( subcnt ) ||
+ FT_READ_USHORT( rpos ) )
+ return error;
+
+ FT_TRACE2(( "Resource tags: %c%c%c%c\n",
+ (char)( 0xff & ( tag_internal >> 24 ) ),
+ (char)( 0xff & ( tag_internal >> 16 ) ),
+ (char)( 0xff & ( tag_internal >> 8 ) ),
+ (char)( 0xff & ( tag_internal >> 0 ) ) ));
+
+ if ( tag_internal == tag )
+ {
+ *count = subcnt + 1;
+ rpos += map_offset;
+
+ error = FT_Stream_Seek( stream, rpos );
+ if ( error )
+ return error;
+
+ if ( FT_NEW_ARRAY( ref, *count ) )
+ return error;
+
+ for ( j = 0; j < *count; ++j )
+ {
+ if ( FT_READ_USHORT( ref[j].res_id ) )
+ goto Exit;
+ if ( FT_STREAM_SKIP( 2 ) ) /* resource name */
+ goto Exit;
+ if ( FT_READ_LONG( temp ) )
+ goto Exit;
+ if ( FT_STREAM_SKIP( 4 ) ) /* mbz */
+ goto Exit;
+
+ ref[j].offset = temp & 0xFFFFFFL;
+ }
+
+ ft_qsort( ref, *count, sizeof ( FT_RFork_Ref ),
+ ( int(*)(const void*, const void*) )
+ ft_raccess_sort_ref_by_id );
+
+ if ( FT_NEW_ARRAY( offsets_internal, *count ) )
+ goto Exit;
+
+ /* XXX: duplicated reference ID,
+ * gap between reference IDs are acceptable?
+ * further investigation on Apple implementation is needed.
+ */
+ for ( j = 0; j < *count; ++j )
+ offsets_internal[j] = rdata_pos + ref[j].offset;
+
+ *offsets = offsets_internal;
+ error = FT_Err_Ok;
+
+ Exit:
+ FT_FREE( ref );
+ return error;
+ }
+ }
+
+ return FT_THROW( Cannot_Open_Resource );
+ }
+
+
+#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** ****/
+ /**** Guessing functions ****/
+ /**** ****/
+ /**** When you add a new guessing function, ****/
+ /**** update FT_RACCESS_N_RULES in ftrfork.h. ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ static FT_Error
+ raccess_guess_apple_double( FT_Library library,
+ FT_Stream stream,
+ char *base_file_name,
+ char **result_file_name,
+ FT_Long *result_offset );
+
+ static FT_Error
+ raccess_guess_apple_single( FT_Library library,
+ FT_Stream stream,
+ char *base_file_name,
+ char **result_file_name,
+ FT_Long *result_offset );
+
+ static FT_Error
+ raccess_guess_darwin_ufs_export( FT_Library library,
+ FT_Stream stream,
+ char *base_file_name,
+ char **result_file_name,
+ FT_Long *result_offset );
+
+ static FT_Error
+ raccess_guess_darwin_newvfs( FT_Library library,
+ FT_Stream stream,
+ char *base_file_name,
+ char **result_file_name,
+ FT_Long *result_offset );
+
+ static FT_Error
+ raccess_guess_darwin_hfsplus( FT_Library library,
+ FT_Stream stream,
+ char *base_file_name,
+ char **result_file_name,
+ FT_Long *result_offset );
+
+ static FT_Error
+ raccess_guess_vfat( FT_Library library,
+ FT_Stream stream,
+ char *base_file_name,
+ char **result_file_name,
+ FT_Long *result_offset );
+
+ static FT_Error
+ raccess_guess_linux_cap( FT_Library library,
+ FT_Stream stream,
+ char *base_file_name,
+ char **result_file_name,
+ FT_Long *result_offset );
+
+ static FT_Error
+ raccess_guess_linux_double( FT_Library library,
+ FT_Stream stream,
+ char *base_file_name,
+ char **result_file_name,
+ FT_Long *result_offset );
+
+ static FT_Error
+ raccess_guess_linux_netatalk( FT_Library library,
+ FT_Stream stream,
+ char *base_file_name,
+ char **result_file_name,
+ FT_Long *result_offset );
+
+
+ CONST_FT_RFORK_RULE_ARRAY_BEGIN(ft_raccess_guess_table,
+ ft_raccess_guess_rec)
+ CONST_FT_RFORK_RULE_ARRAY_ENTRY(apple_double, apple_double)
+ CONST_FT_RFORK_RULE_ARRAY_ENTRY(apple_single, apple_single)
+ CONST_FT_RFORK_RULE_ARRAY_ENTRY(darwin_ufs_export, darwin_ufs_export)
+ CONST_FT_RFORK_RULE_ARRAY_ENTRY(darwin_newvfs, darwin_newvfs)
+ CONST_FT_RFORK_RULE_ARRAY_ENTRY(darwin_hfsplus, darwin_hfsplus)
+ CONST_FT_RFORK_RULE_ARRAY_ENTRY(vfat, vfat)
+ CONST_FT_RFORK_RULE_ARRAY_ENTRY(linux_cap, linux_cap)
+ CONST_FT_RFORK_RULE_ARRAY_ENTRY(linux_double, linux_double)
+ CONST_FT_RFORK_RULE_ARRAY_ENTRY(linux_netatalk, linux_netatalk)
+ CONST_FT_RFORK_RULE_ARRAY_END
+
+
+ /*************************************************************************/
+ /**** ****/
+ /**** Helper functions ****/
+ /**** ****/
+ /*************************************************************************/
+
+ static FT_Error
+ raccess_guess_apple_generic( FT_Library library,
+ FT_Stream stream,
+ char *base_file_name,
+ FT_Int32 magic,
+ FT_Long *result_offset );
+
+ static FT_Error
+ raccess_guess_linux_double_from_file_name( FT_Library library,
+ char * file_name,
+ FT_Long *result_offset );
+
+ static char *
+ raccess_make_file_name( FT_Memory memory,
+ const char *original_name,
+ const char *insertion );
+
+ FT_BASE_DEF( void )
+ FT_Raccess_Guess( FT_Library library,
+ FT_Stream stream,
+ char* base_name,
+ char **new_names,
+ FT_Long *offsets,
+ FT_Error *errors )
+ {
+ FT_Int i;
+
+
+ for ( i = 0; i < FT_RACCESS_N_RULES; i++ )
+ {
+ new_names[i] = NULL;
+ if ( NULL != stream )
+ errors[i] = FT_Stream_Seek( stream, 0 );
+ else
+ errors[i] = FT_Err_Ok;
+
+ if ( errors[i] )
+ continue ;
+
+ errors[i] = (FT_RACCESS_GUESS_TABLE_GET[i].func)( library,
+ stream, base_name,
+ &(new_names[i]),
+ &(offsets[i]) );
+ }
+
+ return;
+ }
+
+
+#ifndef FT_MACINTOSH
+ static FT_RFork_Rule
+ raccess_get_rule_type_from_rule_index( FT_Library library,
+ FT_UInt rule_index )
+ {
+ FT_UNUSED( library );
+
+ if ( rule_index >= FT_RACCESS_N_RULES )
+ return FT_RFork_Rule_invalid;
+
+ return FT_RACCESS_GUESS_TABLE_GET[rule_index].type;
+ }
+
+
+ /*
+ * For this function, refer ftbase.h.
+ */
+ FT_LOCAL_DEF( FT_Bool )
+ ft_raccess_rule_by_darwin_vfs( FT_Library library,
+ FT_UInt rule_index )
+ {
+ switch( raccess_get_rule_type_from_rule_index( library, rule_index ) )
+ {
+ case FT_RFork_Rule_darwin_newvfs:
+ case FT_RFork_Rule_darwin_hfsplus:
+ return TRUE;
+
+ default:
+ return FALSE;
+ }
+ }
+#endif
+
+
+ static FT_Error
+ raccess_guess_apple_double( FT_Library library,
+ FT_Stream stream,
+ char *base_file_name,
+ char **result_file_name,
+ FT_Long *result_offset )
+ {
+ FT_Int32 magic = ( 0x00 << 24 ) |
+ ( 0x05 << 16 ) |
+ ( 0x16 << 8 ) |
+ 0x07;
+
+
+ *result_file_name = NULL;
+ if ( NULL == stream )
+ return FT_THROW( Cannot_Open_Stream );
+
+ return raccess_guess_apple_generic( library, stream, base_file_name,
+ magic, result_offset );
+ }
+
+
+ static FT_Error
+ raccess_guess_apple_single( FT_Library library,
+ FT_Stream stream,
+ char *base_file_name,
+ char **result_file_name,
+ FT_Long *result_offset )
+ {
+ FT_Int32 magic = ( 0x00 << 24 ) |
+ ( 0x05 << 16 ) |
+ ( 0x16 << 8 ) |
+ 0x00;
+
+
+ *result_file_name = NULL;
+ if ( NULL == stream )
+ return FT_THROW( Cannot_Open_Stream );
+
+ return raccess_guess_apple_generic( library, stream, base_file_name,
+ magic, result_offset );
+ }
+
+
+ static FT_Error
+ raccess_guess_darwin_ufs_export( FT_Library library,
+ FT_Stream stream,
+ char *base_file_name,
+ char **result_file_name,
+ FT_Long *result_offset )
+ {
+ char* newpath;
+ FT_Error error;
+ FT_Memory memory;
+
+ FT_UNUSED( stream );
+
+
+ memory = library->memory;
+ newpath = raccess_make_file_name( memory, base_file_name, "._" );
+ if ( !newpath )
+ return FT_THROW( Out_Of_Memory );
+
+ error = raccess_guess_linux_double_from_file_name( library, newpath,
+ result_offset );
+ if ( !error )
+ *result_file_name = newpath;
+ else
+ FT_FREE( newpath );
+
+ return error;
+ }
+
+
+ static FT_Error
+ raccess_guess_darwin_hfsplus( FT_Library library,
+ FT_Stream stream,
+ char *base_file_name,
+ char **result_file_name,
+ FT_Long *result_offset )
+ {
+ /*
+ Only meaningful on systems with hfs+ drivers (or Macs).
+ */
+ FT_Error error;
+ char* newpath = NULL;
+ FT_Memory memory;
+ FT_Long base_file_len = (FT_Long)ft_strlen( base_file_name );
+
+ FT_UNUSED( stream );
+
+
+ memory = library->memory;
+
+ if ( base_file_len + 6 > FT_INT_MAX )
+ return FT_THROW( Array_Too_Large );
+
+ if ( FT_ALLOC( newpath, base_file_len + 6 ) )
+ return error;
+
+ FT_MEM_COPY( newpath, base_file_name, base_file_len );
+ FT_MEM_COPY( newpath + base_file_len, "/rsrc", 6 );
+
+ *result_file_name = newpath;
+ *result_offset = 0;
+
+ return FT_Err_Ok;
+ }
+
+
+ static FT_Error
+ raccess_guess_darwin_newvfs( FT_Library library,
+ FT_Stream stream,
+ char *base_file_name,
+ char **result_file_name,
+ FT_Long *result_offset )
+ {
+ /*
+ Only meaningful on systems with Mac OS X (> 10.1).
+ */
+ FT_Error error;
+ char* newpath = NULL;
+ FT_Memory memory;
+ FT_Long base_file_len = (FT_Long)ft_strlen( base_file_name );
+
+ FT_UNUSED( stream );
+
+
+ memory = library->memory;
+
+ if ( base_file_len + 18 > FT_INT_MAX )
+ return FT_THROW( Array_Too_Large );
+
+ if ( FT_ALLOC( newpath, base_file_len + 18 ) )
+ return error;
+
+ FT_MEM_COPY( newpath, base_file_name, base_file_len );
+ FT_MEM_COPY( newpath + base_file_len, "/..namedfork/rsrc", 18 );
+
+ *result_file_name = newpath;
+ *result_offset = 0;
+
+ return FT_Err_Ok;
+ }
+
+
+ static FT_Error
+ raccess_guess_vfat( FT_Library library,
+ FT_Stream stream,
+ char *base_file_name,
+ char **result_file_name,
+ FT_Long *result_offset )
+ {
+ char* newpath;
+ FT_Memory memory;
+
+ FT_UNUSED( stream );
+
+
+ memory = library->memory;
+
+ newpath = raccess_make_file_name( memory, base_file_name,
+ "resource.frk/" );
+ if ( !newpath )
+ return FT_THROW( Out_Of_Memory );
+
+ *result_file_name = newpath;
+ *result_offset = 0;
+
+ return FT_Err_Ok;
+ }
+
+
+ static FT_Error
+ raccess_guess_linux_cap( FT_Library library,
+ FT_Stream stream,
+ char *base_file_name,
+ char **result_file_name,
+ FT_Long *result_offset )
+ {
+ char* newpath;
+ FT_Memory memory;
+
+ FT_UNUSED( stream );
+
+
+ memory = library->memory;
+
+ newpath = raccess_make_file_name( memory, base_file_name, ".resource/" );
+ if ( !newpath )
+ return FT_THROW( Out_Of_Memory );
+
+ *result_file_name = newpath;
+ *result_offset = 0;
+
+ return FT_Err_Ok;
+ }
+
+
+ static FT_Error
+ raccess_guess_linux_double( FT_Library library,
+ FT_Stream stream,
+ char *base_file_name,
+ char **result_file_name,
+ FT_Long *result_offset )
+ {
+ char* newpath;
+ FT_Error error;
+ FT_Memory memory;
+
+ FT_UNUSED( stream );
+
+
+ memory = library->memory;
+
+ newpath = raccess_make_file_name( memory, base_file_name, "%" );
+ if ( !newpath )
+ return FT_THROW( Out_Of_Memory );
+
+ error = raccess_guess_linux_double_from_file_name( library, newpath,
+ result_offset );
+ if ( !error )
+ *result_file_name = newpath;
+ else
+ FT_FREE( newpath );
+
+ return error;
+ }
+
+
+ static FT_Error
+ raccess_guess_linux_netatalk( FT_Library library,
+ FT_Stream stream,
+ char *base_file_name,
+ char **result_file_name,
+ FT_Long *result_offset )
+ {
+ char* newpath;
+ FT_Error error;
+ FT_Memory memory;
+
+ FT_UNUSED( stream );
+
+
+ memory = library->memory;
+
+ newpath = raccess_make_file_name( memory, base_file_name,
+ ".AppleDouble/" );
+ if ( !newpath )
+ return FT_THROW( Out_Of_Memory );
+
+ error = raccess_guess_linux_double_from_file_name( library, newpath,
+ result_offset );
+ if ( !error )
+ *result_file_name = newpath;
+ else
+ FT_FREE( newpath );
+
+ return error;
+ }
+
+
+ static FT_Error
+ raccess_guess_apple_generic( FT_Library library,
+ FT_Stream stream,
+ char *base_file_name,
+ FT_Int32 magic,
+ FT_Long *result_offset )
+ {
+ FT_Int32 magic_from_stream;
+ FT_Error error;
+ FT_Int32 version_number = 0;
+ FT_UShort n_of_entries;
+
+ int i;
+ FT_UInt32 entry_id, entry_offset, entry_length = 0;
+
+ const FT_UInt32 resource_fork_entry_id = 0x2;
+
+ FT_UNUSED( library );
+ FT_UNUSED( base_file_name );
+ FT_UNUSED( version_number );
+ FT_UNUSED( entry_length );
+
+
+ if ( FT_READ_LONG( magic_from_stream ) )
+ return error;
+ if ( magic_from_stream != magic )
+ return FT_THROW( Unknown_File_Format );
+
+ if ( FT_READ_LONG( version_number ) )
+ return error;
+
+ /* filler */
+ error = FT_Stream_Skip( stream, 16 );
+ if ( error )
+ return error;
+
+ if ( FT_READ_USHORT( n_of_entries ) )
+ return error;
+ if ( n_of_entries == 0 )
+ return FT_THROW( Unknown_File_Format );
+
+ for ( i = 0; i < n_of_entries; i++ )
+ {
+ if ( FT_READ_LONG( entry_id ) )
+ return error;
+ if ( entry_id == resource_fork_entry_id )
+ {
+ if ( FT_READ_LONG( entry_offset ) ||
+ FT_READ_LONG( entry_length ) )
+ continue;
+ *result_offset = entry_offset;
+
+ return FT_Err_Ok;
+ }
+ else
+ {
+ error = FT_Stream_Skip( stream, 4 + 4 ); /* offset + length */
+ if ( error )
+ return error;
+ }
+ }
+
+ return FT_THROW( Unknown_File_Format );
+ }
+
+
+ static FT_Error
+ raccess_guess_linux_double_from_file_name( FT_Library library,
+ char *file_name,
+ FT_Long *result_offset )
+ {
+ FT_Open_Args args2;
+ FT_Stream stream2;
+ char * nouse = NULL;
+ FT_Error error;
+
+
+ args2.flags = FT_OPEN_PATHNAME;
+ args2.pathname = file_name;
+ error = FT_Stream_New( library, &args2, &stream2 );
+ if ( error )
+ return error;
+
+ error = raccess_guess_apple_double( library, stream2, file_name,
+ &nouse, result_offset );
+
+ FT_Stream_Free( stream2, 0 );
+
+ return error;
+ }
+
+
+ static char*
+ raccess_make_file_name( FT_Memory memory,
+ const char *original_name,
+ const char *insertion )
+ {
+ char* new_name = NULL;
+ const char* tmp;
+ const char* slash;
+ size_t new_length;
+ FT_Error error = FT_Err_Ok;
+
+ FT_UNUSED( error );
+
+
+ new_length = ft_strlen( original_name ) + ft_strlen( insertion );
+ if ( FT_ALLOC( new_name, new_length + 1 ) )
+ return NULL;
+
+ tmp = ft_strrchr( original_name, '/' );
+ if ( tmp )
+ {
+ ft_strncpy( new_name, original_name, tmp - original_name + 1 );
+ new_name[tmp - original_name + 1] = '\0';
+ slash = tmp + 1;
+ }
+ else
+ {
+ slash = original_name;
+ new_name[0] = '\0';
+ }
+
+ ft_strcat( new_name, insertion );
+ ft_strcat( new_name, slash );
+
+ return new_name;
+ }
+
+
+#else /* !FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK */
+
+
+ /*************************************************************************/
+ /* Dummy function; just sets errors */
+ /*************************************************************************/
+
+ FT_BASE_DEF( void )
+ FT_Raccess_Guess( FT_Library library,
+ FT_Stream stream,
+ char *base_name,
+ char **new_names,
+ FT_Long *offsets,
+ FT_Error *errors )
+ {
+ FT_Int i;
+
+ FT_UNUSED( library );
+ FT_UNUSED( stream );
+ FT_UNUSED( base_name );
+
+
+ for ( i = 0; i < FT_RACCESS_N_RULES; i++ )
+ {
+ new_names[i] = NULL;
+ offsets[i] = 0;
+ errors[i] = FT_ERR( Unimplemented_Feature );
+ }
+ }
+
+
+#endif /* !FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftsnames.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftsnames.c
new file mode 100644
index 0000000000..b4e08ef4e3
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftsnames.c
@@ -0,0 +1,94 @@
+/***************************************************************************/
+/* */
+/* ftsnames.c */
+/* */
+/* Simple interface to access SFNT name tables (which are used */
+/* to hold font names, copyright info, notices, etc.) (body). */
+/* */
+/* This is _not_ used to retrieve glyph names! */
+/* */
+/* Copyright 1996-2001, 2002, 2009 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/ftsnames.h"
+#include "../../include/freetype/internal/tttypes.h"
+#include "../../include/freetype/internal/ftstream.h"
+
+
+#ifdef TT_CONFIG_OPTION_SFNT_NAMES
+
+
+ /* documentation is in ftsnames.h */
+
+ FT_EXPORT_DEF( FT_UInt )
+ FT_Get_Sfnt_Name_Count( FT_Face face )
+ {
+ return ( face && FT_IS_SFNT( face ) ) ? ((TT_Face)face)->num_names : 0;
+ }
+
+
+ /* documentation is in ftsnames.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Get_Sfnt_Name( FT_Face face,
+ FT_UInt idx,
+ FT_SfntName *aname )
+ {
+ FT_Error error = FT_ERR( Invalid_Argument );
+
+
+ if ( aname && face && FT_IS_SFNT( face ) )
+ {
+ TT_Face ttface = (TT_Face)face;
+
+
+ if ( idx < (FT_UInt)ttface->num_names )
+ {
+ TT_NameEntryRec* entry = ttface->name_table.names + idx;
+
+
+ /* load name on demand */
+ if ( entry->stringLength > 0 && entry->string == NULL )
+ {
+ FT_Memory memory = face->memory;
+ FT_Stream stream = face->stream;
+
+
+ if ( FT_NEW_ARRAY ( entry->string, entry->stringLength ) ||
+ FT_STREAM_SEEK( entry->stringOffset ) ||
+ FT_STREAM_READ( entry->string, entry->stringLength ) )
+ {
+ FT_FREE( entry->string );
+ entry->stringLength = 0;
+ }
+ }
+
+ aname->platform_id = entry->platformID;
+ aname->encoding_id = entry->encodingID;
+ aname->language_id = entry->languageID;
+ aname->name_id = entry->nameID;
+ aname->string = (FT_Byte*)entry->string;
+ aname->string_len = entry->stringLength;
+
+ error = FT_Err_Ok;
+ }
+ }
+
+ return error;
+ }
+
+
+#endif /* TT_CONFIG_OPTION_SFNT_NAMES */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftstream.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftstream.c
new file mode 100644
index 0000000000..8037506fa3
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftstream.c
@@ -0,0 +1,865 @@
+/***************************************************************************/
+/* */
+/* ftstream.c */
+/* */
+/* I/O stream support (body). */
+/* */
+/* Copyright 2000-2002, 2004-2006, 2008-2011, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/internal/ftdebug.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_stream
+
+
+ FT_BASE_DEF( void )
+ FT_Stream_OpenMemory( FT_Stream stream,
+ const FT_Byte* base,
+ FT_ULong size )
+ {
+ stream->base = (FT_Byte*) base;
+ stream->size = size;
+ stream->pos = 0;
+ stream->cursor = 0;
+ stream->read = 0;
+ stream->close = 0;
+ }
+
+
+ FT_BASE_DEF( void )
+ FT_Stream_Close( FT_Stream stream )
+ {
+ if ( stream && stream->close )
+ stream->close( stream );
+ }
+
+
+ FT_BASE_DEF( FT_Error )
+ FT_Stream_Seek( FT_Stream stream,
+ FT_ULong pos )
+ {
+ FT_Error error = FT_Err_Ok;
+
+
+ if ( stream->read )
+ {
+ if ( stream->read( stream, pos, 0, 0 ) )
+ {
+ FT_ERROR(( "FT_Stream_Seek:"
+ " invalid i/o; pos = 0x%lx, size = 0x%lx\n",
+ pos, stream->size ));
+
+ error = FT_THROW( Invalid_Stream_Operation );
+ }
+ }
+ /* note that seeking to the first position after the file is valid */
+ else if ( pos > stream->size )
+ {
+ FT_ERROR(( "FT_Stream_Seek:"
+ " invalid i/o; pos = 0x%lx, size = 0x%lx\n",
+ pos, stream->size ));
+
+ error = FT_THROW( Invalid_Stream_Operation );
+ }
+
+ if ( !error )
+ stream->pos = pos;
+
+ return error;
+ }
+
+
+ FT_BASE_DEF( FT_Error )
+ FT_Stream_Skip( FT_Stream stream,
+ FT_Long distance )
+ {
+ if ( distance < 0 )
+ return FT_THROW( Invalid_Stream_Operation );
+
+ return FT_Stream_Seek( stream, (FT_ULong)( stream->pos + distance ) );
+ }
+
+
+ FT_BASE_DEF( FT_Long )
+ FT_Stream_Pos( FT_Stream stream )
+ {
+ return stream->pos;
+ }
+
+
+ FT_BASE_DEF( FT_Error )
+ FT_Stream_Read( FT_Stream stream,
+ FT_Byte* buffer,
+ FT_ULong count )
+ {
+ return FT_Stream_ReadAt( stream, stream->pos, buffer, count );
+ }
+
+
+ FT_BASE_DEF( FT_Error )
+ FT_Stream_ReadAt( FT_Stream stream,
+ FT_ULong pos,
+ FT_Byte* buffer,
+ FT_ULong count )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_ULong read_bytes;
+
+
+ if ( pos >= stream->size )
+ {
+ FT_ERROR(( "FT_Stream_ReadAt:"
+ " invalid i/o; pos = 0x%lx, size = 0x%lx\n",
+ pos, stream->size ));
+
+ return FT_THROW( Invalid_Stream_Operation );
+ }
+
+ if ( stream->read )
+ read_bytes = stream->read( stream, pos, buffer, count );
+ else
+ {
+ read_bytes = stream->size - pos;
+ if ( read_bytes > count )
+ read_bytes = count;
+
+ FT_MEM_COPY( buffer, stream->base + pos, read_bytes );
+ }
+
+ stream->pos = pos + read_bytes;
+
+ if ( read_bytes < count )
+ {
+ FT_ERROR(( "FT_Stream_ReadAt:"
+ " invalid read; expected %lu bytes, got %lu\n",
+ count, read_bytes ));
+
+ error = FT_THROW( Invalid_Stream_Operation );
+ }
+
+ return error;
+ }
+
+
+ FT_BASE_DEF( FT_ULong )
+ FT_Stream_TryRead( FT_Stream stream,
+ FT_Byte* buffer,
+ FT_ULong count )
+ {
+ FT_ULong read_bytes = 0;
+
+
+ if ( stream->pos >= stream->size )
+ goto Exit;
+
+ if ( stream->read )
+ read_bytes = stream->read( stream, stream->pos, buffer, count );
+ else
+ {
+ read_bytes = stream->size - stream->pos;
+ if ( read_bytes > count )
+ read_bytes = count;
+
+ FT_MEM_COPY( buffer, stream->base + stream->pos, read_bytes );
+ }
+
+ stream->pos += read_bytes;
+
+ Exit:
+ return read_bytes;
+ }
+
+
+ FT_BASE_DEF( FT_Error )
+ FT_Stream_ExtractFrame( FT_Stream stream,
+ FT_ULong count,
+ FT_Byte** pbytes )
+ {
+ FT_Error error;
+
+
+ error = FT_Stream_EnterFrame( stream, count );
+ if ( !error )
+ {
+ *pbytes = (FT_Byte*)stream->cursor;
+
+ /* equivalent to FT_Stream_ExitFrame(), with no memory block release */
+ stream->cursor = 0;
+ stream->limit = 0;
+ }
+
+ return error;
+ }
+
+
+ FT_BASE_DEF( void )
+ FT_Stream_ReleaseFrame( FT_Stream stream,
+ FT_Byte** pbytes )
+ {
+ if ( stream && stream->read )
+ {
+ FT_Memory memory = stream->memory;
+
+#ifdef FT_DEBUG_MEMORY
+ ft_mem_free( memory, *pbytes );
+ *pbytes = NULL;
+#else
+ FT_FREE( *pbytes );
+#endif
+ }
+ *pbytes = 0;
+ }
+
+
+ FT_BASE_DEF( FT_Error )
+ FT_Stream_EnterFrame( FT_Stream stream,
+ FT_ULong count )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_ULong read_bytes;
+
+
+ /* check for nested frame access */
+ FT_ASSERT( stream && stream->cursor == 0 );
+
+ if ( stream->read )
+ {
+ /* allocate the frame in memory */
+ FT_Memory memory = stream->memory;
+
+
+ /* simple sanity check */
+ if ( count > stream->size )
+ {
+ FT_ERROR(( "FT_Stream_EnterFrame:"
+ " frame size (%lu) larger than stream size (%lu)\n",
+ count, stream->size ));
+
+ error = FT_THROW( Invalid_Stream_Operation );
+ goto Exit;
+ }
+
+#ifdef FT_DEBUG_MEMORY
+ /* assume _ft_debug_file and _ft_debug_lineno are already set */
+ stream->base = (unsigned char*)ft_mem_qalloc( memory, count, &error );
+ if ( error )
+ goto Exit;
+#else
+ if ( FT_QALLOC( stream->base, count ) )
+ goto Exit;
+#endif
+ /* read it */
+ read_bytes = stream->read( stream, stream->pos,
+ stream->base, count );
+ if ( read_bytes < count )
+ {
+ FT_ERROR(( "FT_Stream_EnterFrame:"
+ " invalid read; expected %lu bytes, got %lu\n",
+ count, read_bytes ));
+
+ FT_FREE( stream->base );
+ error = FT_THROW( Invalid_Stream_Operation );
+ }
+ stream->cursor = stream->base;
+ stream->limit = stream->cursor + count;
+ stream->pos += read_bytes;
+ }
+ else
+ {
+ /* check current and new position */
+ if ( stream->pos >= stream->size ||
+ stream->size - stream->pos < count )
+ {
+ FT_ERROR(( "FT_Stream_EnterFrame:"
+ " invalid i/o; pos = 0x%lx, count = %lu, size = 0x%lx\n",
+ stream->pos, count, stream->size ));
+
+ error = FT_THROW( Invalid_Stream_Operation );
+ goto Exit;
+ }
+
+ /* set cursor */
+ stream->cursor = stream->base + stream->pos;
+ stream->limit = stream->cursor + count;
+ stream->pos += count;
+ }
+
+ Exit:
+ return error;
+ }
+
+
+ FT_BASE_DEF( void )
+ FT_Stream_ExitFrame( FT_Stream stream )
+ {
+ /* IMPORTANT: The assertion stream->cursor != 0 was removed, given */
+ /* that it is possible to access a frame of length 0 in */
+ /* some weird fonts (usually, when accessing an array of */
+ /* 0 records, like in some strange kern tables). */
+ /* */
+ /* In this case, the loader code handles the 0-length table */
+ /* gracefully; however, stream.cursor is really set to 0 by the */
+ /* FT_Stream_EnterFrame() call, and this is not an error. */
+ /* */
+ FT_ASSERT( stream );
+
+ if ( stream->read )
+ {
+ FT_Memory memory = stream->memory;
+
+#ifdef FT_DEBUG_MEMORY
+ ft_mem_free( memory, stream->base );
+ stream->base = NULL;
+#else
+ FT_FREE( stream->base );
+#endif
+ }
+ stream->cursor = 0;
+ stream->limit = 0;
+ }
+
+
+ FT_BASE_DEF( FT_Char )
+ FT_Stream_GetChar( FT_Stream stream )
+ {
+ FT_Char result;
+
+
+ FT_ASSERT( stream && stream->cursor );
+
+ result = 0;
+ if ( stream->cursor < stream->limit )
+ result = *stream->cursor++;
+
+ return result;
+ }
+
+
+ FT_BASE_DEF( FT_UShort )
+ FT_Stream_GetUShort( FT_Stream stream )
+ {
+ FT_Byte* p;
+ FT_Short result;
+
+
+ FT_ASSERT( stream && stream->cursor );
+
+ result = 0;
+ p = stream->cursor;
+ if ( p + 1 < stream->limit )
+ result = FT_NEXT_USHORT( p );
+ stream->cursor = p;
+
+ return result;
+ }
+
+
+ FT_BASE_DEF( FT_UShort )
+ FT_Stream_GetUShortLE( FT_Stream stream )
+ {
+ FT_Byte* p;
+ FT_Short result;
+
+
+ FT_ASSERT( stream && stream->cursor );
+
+ result = 0;
+ p = stream->cursor;
+ if ( p + 1 < stream->limit )
+ result = FT_NEXT_USHORT_LE( p );
+ stream->cursor = p;
+
+ return result;
+ }
+
+
+ FT_BASE_DEF( FT_ULong )
+ FT_Stream_GetUOffset( FT_Stream stream )
+ {
+ FT_Byte* p;
+ FT_Long result;
+
+
+ FT_ASSERT( stream && stream->cursor );
+
+ result = 0;
+ p = stream->cursor;
+ if ( p + 2 < stream->limit )
+ result = FT_NEXT_UOFF3( p );
+ stream->cursor = p;
+ return result;
+ }
+
+
+ FT_BASE_DEF( FT_ULong )
+ FT_Stream_GetULong( FT_Stream stream )
+ {
+ FT_Byte* p;
+ FT_Long result;
+
+
+ FT_ASSERT( stream && stream->cursor );
+
+ result = 0;
+ p = stream->cursor;
+ if ( p + 3 < stream->limit )
+ result = FT_NEXT_ULONG( p );
+ stream->cursor = p;
+ return result;
+ }
+
+
+ FT_BASE_DEF( FT_ULong )
+ FT_Stream_GetULongLE( FT_Stream stream )
+ {
+ FT_Byte* p;
+ FT_Long result;
+
+
+ FT_ASSERT( stream && stream->cursor );
+
+ result = 0;
+ p = stream->cursor;
+ if ( p + 3 < stream->limit )
+ result = FT_NEXT_ULONG_LE( p );
+ stream->cursor = p;
+ return result;
+ }
+
+
+ FT_BASE_DEF( FT_Char )
+ FT_Stream_ReadChar( FT_Stream stream,
+ FT_Error* error )
+ {
+ FT_Byte result = 0;
+
+
+ FT_ASSERT( stream );
+
+ *error = FT_Err_Ok;
+
+ if ( stream->read )
+ {
+ if ( stream->read( stream, stream->pos, &result, 1L ) != 1L )
+ goto Fail;
+ }
+ else
+ {
+ if ( stream->pos < stream->size )
+ result = stream->base[stream->pos];
+ else
+ goto Fail;
+ }
+ stream->pos++;
+
+ return result;
+
+ Fail:
+ *error = FT_THROW( Invalid_Stream_Operation );
+ FT_ERROR(( "FT_Stream_ReadChar:"
+ " invalid i/o; pos = 0x%lx, size = 0x%lx\n",
+ stream->pos, stream->size ));
+
+ return 0;
+ }
+
+
+ FT_BASE_DEF( FT_UShort )
+ FT_Stream_ReadUShort( FT_Stream stream,
+ FT_Error* error )
+ {
+ FT_Byte reads[2];
+ FT_Byte* p = 0;
+ FT_Short result = 0;
+
+
+ FT_ASSERT( stream );
+
+ *error = FT_Err_Ok;
+
+ if ( stream->pos + 1 < stream->size )
+ {
+ if ( stream->read )
+ {
+ if ( stream->read( stream, stream->pos, reads, 2L ) != 2L )
+ goto Fail;
+
+ p = reads;
+ }
+ else
+ {
+ p = stream->base + stream->pos;
+ }
+
+ if ( p )
+ result = FT_NEXT_USHORT( p );
+ }
+ else
+ goto Fail;
+
+ stream->pos += 2;
+
+ return result;
+
+ Fail:
+ *error = FT_THROW( Invalid_Stream_Operation );
+ FT_ERROR(( "FT_Stream_ReadUShort:"
+ " invalid i/o; pos = 0x%lx, size = 0x%lx\n",
+ stream->pos, stream->size ));
+
+ return 0;
+ }
+
+
+ FT_BASE_DEF( FT_UShort )
+ FT_Stream_ReadUShortLE( FT_Stream stream,
+ FT_Error* error )
+ {
+ FT_Byte reads[2];
+ FT_Byte* p = 0;
+ FT_Short result = 0;
+
+
+ FT_ASSERT( stream );
+
+ *error = FT_Err_Ok;
+
+ if ( stream->pos + 1 < stream->size )
+ {
+ if ( stream->read )
+ {
+ if ( stream->read( stream, stream->pos, reads, 2L ) != 2L )
+ goto Fail;
+
+ p = reads;
+ }
+ else
+ {
+ p = stream->base + stream->pos;
+ }
+
+ if ( p )
+ result = FT_NEXT_USHORT_LE( p );
+ }
+ else
+ goto Fail;
+
+ stream->pos += 2;
+
+ return result;
+
+ Fail:
+ *error = FT_THROW( Invalid_Stream_Operation );
+ FT_ERROR(( "FT_Stream_ReadUShortLE:"
+ " invalid i/o; pos = 0x%lx, size = 0x%lx\n",
+ stream->pos, stream->size ));
+
+ return 0;
+ }
+
+
+ FT_BASE_DEF( FT_ULong )
+ FT_Stream_ReadUOffset( FT_Stream stream,
+ FT_Error* error )
+ {
+ FT_Byte reads[3];
+ FT_Byte* p = 0;
+ FT_Long result = 0;
+
+
+ FT_ASSERT( stream );
+
+ *error = FT_Err_Ok;
+
+ if ( stream->pos + 2 < stream->size )
+ {
+ if ( stream->read )
+ {
+ if (stream->read( stream, stream->pos, reads, 3L ) != 3L )
+ goto Fail;
+
+ p = reads;
+ }
+ else
+ {
+ p = stream->base + stream->pos;
+ }
+
+ if ( p )
+ result = FT_NEXT_UOFF3( p );
+ }
+ else
+ goto Fail;
+
+ stream->pos += 3;
+
+ return result;
+
+ Fail:
+ *error = FT_THROW( Invalid_Stream_Operation );
+ FT_ERROR(( "FT_Stream_ReadUOffset:"
+ " invalid i/o; pos = 0x%lx, size = 0x%lx\n",
+ stream->pos, stream->size ));
+
+ return 0;
+ }
+
+
+ FT_BASE_DEF( FT_ULong )
+ FT_Stream_ReadULong( FT_Stream stream,
+ FT_Error* error )
+ {
+ FT_Byte reads[4];
+ FT_Byte* p = 0;
+ FT_Long result = 0;
+
+
+ FT_ASSERT( stream );
+
+ *error = FT_Err_Ok;
+
+ if ( stream->pos + 3 < stream->size )
+ {
+ if ( stream->read )
+ {
+ if ( stream->read( stream, stream->pos, reads, 4L ) != 4L )
+ goto Fail;
+
+ p = reads;
+ }
+ else
+ {
+ p = stream->base + stream->pos;
+ }
+
+ if ( p )
+ result = FT_NEXT_ULONG( p );
+ }
+ else
+ goto Fail;
+
+ stream->pos += 4;
+
+ return result;
+
+ Fail:
+ *error = FT_THROW( Invalid_Stream_Operation );
+ FT_ERROR(( "FT_Stream_ReadULong:"
+ " invalid i/o; pos = 0x%lx, size = 0x%lx\n",
+ stream->pos, stream->size ));
+
+ return 0;
+ }
+
+
+ FT_BASE_DEF( FT_ULong )
+ FT_Stream_ReadULongLE( FT_Stream stream,
+ FT_Error* error )
+ {
+ FT_Byte reads[4];
+ FT_Byte* p = 0;
+ FT_Long result = 0;
+
+
+ FT_ASSERT( stream );
+
+ *error = FT_Err_Ok;
+
+ if ( stream->pos + 3 < stream->size )
+ {
+ if ( stream->read )
+ {
+ if ( stream->read( stream, stream->pos, reads, 4L ) != 4L )
+ goto Fail;
+
+ p = reads;
+ }
+ else
+ {
+ p = stream->base + stream->pos;
+ }
+
+ if ( p )
+ result = FT_NEXT_ULONG_LE( p );
+ }
+ else
+ goto Fail;
+
+ stream->pos += 4;
+
+ return result;
+
+ Fail:
+ *error = FT_THROW( Invalid_Stream_Operation );
+ FT_ERROR(( "FT_Stream_ReadULongLE:"
+ " invalid i/o; pos = 0x%lx, size = 0x%lx\n",
+ stream->pos, stream->size ));
+
+ return 0;
+ }
+
+
+ FT_BASE_DEF( FT_Error )
+ FT_Stream_ReadFields( FT_Stream stream,
+ const FT_Frame_Field* fields,
+ void* structure )
+ {
+ FT_Error error;
+ FT_Bool frame_accessed = 0;
+ FT_Byte* cursor;
+
+
+ if ( !fields || !stream )
+ return FT_THROW( Invalid_Argument );
+
+ cursor = stream->cursor;
+
+ error = FT_Err_Ok;
+ do
+ {
+ FT_ULong value;
+ FT_Int sign_shift;
+ FT_Byte* p;
+
+
+ switch ( fields->value )
+ {
+ case ft_frame_start: /* access a new frame */
+ error = FT_Stream_EnterFrame( stream, fields->offset );
+ if ( error )
+ goto Exit;
+
+ frame_accessed = 1;
+ cursor = stream->cursor;
+ fields++;
+ continue; /* loop! */
+
+ case ft_frame_bytes: /* read a byte sequence */
+ case ft_frame_skip: /* skip some bytes */
+ {
+ FT_UInt len = fields->size;
+
+
+ if ( cursor + len > stream->limit )
+ {
+ error = FT_THROW( Invalid_Stream_Operation );
+ goto Exit;
+ }
+
+ if ( fields->value == ft_frame_bytes )
+ {
+ p = (FT_Byte*)structure + fields->offset;
+ FT_MEM_COPY( p, cursor, len );
+ }
+ cursor += len;
+ fields++;
+ continue;
+ }
+
+ case ft_frame_byte:
+ case ft_frame_schar: /* read a single byte */
+ value = FT_NEXT_BYTE( cursor );
+ sign_shift = 24;
+ break;
+
+ case ft_frame_short_be:
+ case ft_frame_ushort_be: /* read a 2-byte big-endian short */
+ value = FT_NEXT_USHORT( cursor) ;
+ sign_shift = 16;
+ break;
+
+ case ft_frame_short_le:
+ case ft_frame_ushort_le: /* read a 2-byte little-endian short */
+ value = FT_NEXT_USHORT_LE( cursor );
+ sign_shift = 16;
+ break;
+
+ case ft_frame_long_be:
+ case ft_frame_ulong_be: /* read a 4-byte big-endian long */
+ value = FT_NEXT_ULONG( cursor );
+ sign_shift = 0;
+ break;
+
+ case ft_frame_long_le:
+ case ft_frame_ulong_le: /* read a 4-byte little-endian long */
+ value = FT_NEXT_ULONG_LE( cursor );
+ sign_shift = 0;
+ break;
+
+ case ft_frame_off3_be:
+ case ft_frame_uoff3_be: /* read a 3-byte big-endian long */
+ value = FT_NEXT_UOFF3( cursor );
+ sign_shift = 8;
+ break;
+
+ case ft_frame_off3_le:
+ case ft_frame_uoff3_le: /* read a 3-byte little-endian long */
+ value = FT_NEXT_UOFF3_LE( cursor );
+ sign_shift = 8;
+ break;
+
+ default:
+ /* otherwise, exit the loop */
+ stream->cursor = cursor;
+ goto Exit;
+ }
+
+ /* now, compute the signed value is necessary */
+ if ( fields->value & FT_FRAME_OP_SIGNED )
+ value = (FT_ULong)( (FT_Int32)( value << sign_shift ) >> sign_shift );
+
+ /* finally, store the value in the object */
+
+ p = (FT_Byte*)structure + fields->offset;
+ switch ( fields->size )
+ {
+ case ( 8 / FT_CHAR_BIT ):
+ *(FT_Byte*)p = (FT_Byte)value;
+ break;
+
+ case ( 16 / FT_CHAR_BIT ):
+ *(FT_UShort*)p = (FT_UShort)value;
+ break;
+
+ case ( 32 / FT_CHAR_BIT ):
+ *(FT_UInt32*)p = (FT_UInt32)value;
+ break;
+
+ default: /* for 64-bit systems */
+ *(FT_ULong*)p = (FT_ULong)value;
+ }
+
+ /* go to next field */
+ fields++;
+ }
+ while ( 1 );
+
+ Exit:
+ /* close the frame if it was opened by this read */
+ if ( frame_accessed )
+ FT_Stream_ExitFrame( stream );
+
+ return error;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftstroke.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftstroke.c
new file mode 100644
index 0000000000..c15aaafef6
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftstroke.c
@@ -0,0 +1,2418 @@
+/***************************************************************************/
+/* */
+/* ftstroke.c */
+/* */
+/* FreeType path stroker (body). */
+/* */
+/* Copyright 2002-2006, 2008-2011, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/ftstroke.h"
+#include "../../include/freetype/fttrigon.h"
+#include "../../include/freetype/ftoutln.h"
+#include "../../include/freetype/internal/ftmemory.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftobjs.h"
+
+
+ /* documentation is in ftstroke.h */
+
+ FT_EXPORT_DEF( FT_StrokerBorder )
+ FT_Outline_GetInsideBorder( FT_Outline* outline )
+ {
+ FT_Orientation o = FT_Outline_Get_Orientation( outline );
+
+
+ return o == FT_ORIENTATION_TRUETYPE ? FT_STROKER_BORDER_RIGHT
+ : FT_STROKER_BORDER_LEFT;
+ }
+
+
+ /* documentation is in ftstroke.h */
+
+ FT_EXPORT_DEF( FT_StrokerBorder )
+ FT_Outline_GetOutsideBorder( FT_Outline* outline )
+ {
+ FT_Orientation o = FT_Outline_Get_Orientation( outline );
+
+
+ return o == FT_ORIENTATION_TRUETYPE ? FT_STROKER_BORDER_LEFT
+ : FT_STROKER_BORDER_RIGHT;
+ }
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** BEZIER COMPUTATIONS *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+#define FT_SMALL_CONIC_THRESHOLD ( FT_ANGLE_PI / 6 )
+#define FT_SMALL_CUBIC_THRESHOLD ( FT_ANGLE_PI / 8 )
+
+#define FT_EPSILON 2
+
+#define FT_IS_SMALL( x ) ( (x) > -FT_EPSILON && (x) < FT_EPSILON )
+
+
+ static FT_Pos
+ ft_pos_abs( FT_Pos x )
+ {
+ return x >= 0 ? x : -x;
+ }
+
+
+ static void
+ ft_conic_split( FT_Vector* base )
+ {
+ FT_Pos a, b;
+
+
+ base[4].x = base[2].x;
+ b = base[1].x;
+ a = base[3].x = ( base[2].x + b ) / 2;
+ b = base[1].x = ( base[0].x + b ) / 2;
+ base[2].x = ( a + b ) / 2;
+
+ base[4].y = base[2].y;
+ b = base[1].y;
+ a = base[3].y = ( base[2].y + b ) / 2;
+ b = base[1].y = ( base[0].y + b ) / 2;
+ base[2].y = ( a + b ) / 2;
+ }
+
+
+ static FT_Bool
+ ft_conic_is_small_enough( FT_Vector* base,
+ FT_Angle *angle_in,
+ FT_Angle *angle_out )
+ {
+ FT_Vector d1, d2;
+ FT_Angle theta;
+ FT_Int close1, close2;
+
+
+ d1.x = base[1].x - base[2].x;
+ d1.y = base[1].y - base[2].y;
+ d2.x = base[0].x - base[1].x;
+ d2.y = base[0].y - base[1].y;
+
+ close1 = FT_IS_SMALL( d1.x ) && FT_IS_SMALL( d1.y );
+ close2 = FT_IS_SMALL( d2.x ) && FT_IS_SMALL( d2.y );
+
+ if ( close1 )
+ {
+ if ( close2 )
+ {
+ /* basically a point; */
+ /* do nothing to retain original direction */
+ }
+ else
+ {
+ *angle_in =
+ *angle_out = FT_Atan2( d2.x, d2.y );
+ }
+ }
+ else /* !close1 */
+ {
+ if ( close2 )
+ {
+ *angle_in =
+ *angle_out = FT_Atan2( d1.x, d1.y );
+ }
+ else
+ {
+ *angle_in = FT_Atan2( d1.x, d1.y );
+ *angle_out = FT_Atan2( d2.x, d2.y );
+ }
+ }
+
+ theta = ft_pos_abs( FT_Angle_Diff( *angle_in, *angle_out ) );
+
+ return FT_BOOL( theta < FT_SMALL_CONIC_THRESHOLD );
+ }
+
+
+ static void
+ ft_cubic_split( FT_Vector* base )
+ {
+ FT_Pos a, b, c, d;
+
+
+ base[6].x = base[3].x;
+ c = base[1].x;
+ d = base[2].x;
+ base[1].x = a = ( base[0].x + c ) / 2;
+ base[5].x = b = ( base[3].x + d ) / 2;
+ c = ( c + d ) / 2;
+ base[2].x = a = ( a + c ) / 2;
+ base[4].x = b = ( b + c ) / 2;
+ base[3].x = ( a + b ) / 2;
+
+ base[6].y = base[3].y;
+ c = base[1].y;
+ d = base[2].y;
+ base[1].y = a = ( base[0].y + c ) / 2;
+ base[5].y = b = ( base[3].y + d ) / 2;
+ c = ( c + d ) / 2;
+ base[2].y = a = ( a + c ) / 2;
+ base[4].y = b = ( b + c ) / 2;
+ base[3].y = ( a + b ) / 2;
+ }
+
+
+ /* Return the average of `angle1' and `angle2'. */
+ /* This gives correct result even if `angle1' and `angle2' */
+ /* have opposite signs. */
+ static FT_Angle
+ ft_angle_mean( FT_Angle angle1,
+ FT_Angle angle2 )
+ {
+ return angle1 + FT_Angle_Diff( angle1, angle2 ) / 2;
+ }
+
+
+ static FT_Bool
+ ft_cubic_is_small_enough( FT_Vector* base,
+ FT_Angle *angle_in,
+ FT_Angle *angle_mid,
+ FT_Angle *angle_out )
+ {
+ FT_Vector d1, d2, d3;
+ FT_Angle theta1, theta2;
+ FT_Int close1, close2, close3;
+
+
+ d1.x = base[2].x - base[3].x;
+ d1.y = base[2].y - base[3].y;
+ d2.x = base[1].x - base[2].x;
+ d2.y = base[1].y - base[2].y;
+ d3.x = base[0].x - base[1].x;
+ d3.y = base[0].y - base[1].y;
+
+ close1 = FT_IS_SMALL( d1.x ) && FT_IS_SMALL( d1.y );
+ close2 = FT_IS_SMALL( d2.x ) && FT_IS_SMALL( d2.y );
+ close3 = FT_IS_SMALL( d3.x ) && FT_IS_SMALL( d3.y );
+
+ if ( close1 )
+ {
+ if ( close2 )
+ {
+ if ( close3 )
+ {
+ /* basically a point; */
+ /* do nothing to retain original direction */
+ }
+ else /* !close3 */
+ {
+ *angle_in =
+ *angle_mid =
+ *angle_out = FT_Atan2( d3.x, d3.y );
+ }
+ }
+ else /* !close2 */
+ {
+ if ( close3 )
+ {
+ *angle_in =
+ *angle_mid =
+ *angle_out = FT_Atan2( d2.x, d2.y );
+ }
+ else /* !close3 */
+ {
+ *angle_in =
+ *angle_mid = FT_Atan2( d2.x, d2.y );
+ *angle_out = FT_Atan2( d3.x, d3.y );
+ }
+ }
+ }
+ else /* !close1 */
+ {
+ if ( close2 )
+ {
+ if ( close3 )
+ {
+ *angle_in =
+ *angle_mid =
+ *angle_out = FT_Atan2( d1.x, d1.y );
+ }
+ else /* !close3 */
+ {
+ *angle_in = FT_Atan2( d1.x, d1.y );
+ *angle_out = FT_Atan2( d3.x, d3.y );
+ *angle_mid = ft_angle_mean( *angle_in, *angle_out );
+ }
+ }
+ else /* !close2 */
+ {
+ if ( close3 )
+ {
+ *angle_in = FT_Atan2( d1.x, d1.y );
+ *angle_mid =
+ *angle_out = FT_Atan2( d2.x, d2.y );
+ }
+ else /* !close3 */
+ {
+ *angle_in = FT_Atan2( d1.x, d1.y );
+ *angle_mid = FT_Atan2( d2.x, d2.y );
+ *angle_out = FT_Atan2( d3.x, d3.y );
+ }
+ }
+ }
+
+ theta1 = ft_pos_abs( FT_Angle_Diff( *angle_in, *angle_mid ) );
+ theta2 = ft_pos_abs( FT_Angle_Diff( *angle_mid, *angle_out ) );
+
+ return FT_BOOL( theta1 < FT_SMALL_CUBIC_THRESHOLD &&
+ theta2 < FT_SMALL_CUBIC_THRESHOLD );
+ }
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** STROKE BORDERS *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ typedef enum FT_StrokeTags_
+ {
+ FT_STROKE_TAG_ON = 1, /* on-curve point */
+ FT_STROKE_TAG_CUBIC = 2, /* cubic off-point */
+ FT_STROKE_TAG_BEGIN = 4, /* sub-path start */
+ FT_STROKE_TAG_END = 8 /* sub-path end */
+
+ } FT_StrokeTags;
+
+#define FT_STROKE_TAG_BEGIN_END ( FT_STROKE_TAG_BEGIN | FT_STROKE_TAG_END )
+
+ typedef struct FT_StrokeBorderRec_
+ {
+ FT_UInt num_points;
+ FT_UInt max_points;
+ FT_Vector* points;
+ FT_Byte* tags;
+ FT_Bool movable; /* TRUE for ends of lineto borders */
+ FT_Int start; /* index of current sub-path start point */
+ FT_Memory memory;
+ FT_Bool valid;
+
+ } FT_StrokeBorderRec, *FT_StrokeBorder;
+
+
+ static FT_Error
+ ft_stroke_border_grow( FT_StrokeBorder border,
+ FT_UInt new_points )
+ {
+ FT_UInt old_max = border->max_points;
+ FT_UInt new_max = border->num_points + new_points;
+ FT_Error error = FT_Err_Ok;
+
+
+ if ( new_max > old_max )
+ {
+ FT_UInt cur_max = old_max;
+ FT_Memory memory = border->memory;
+
+
+ while ( cur_max < new_max )
+ cur_max += ( cur_max >> 1 ) + 16;
+
+ if ( FT_RENEW_ARRAY( border->points, old_max, cur_max ) ||
+ FT_RENEW_ARRAY( border->tags, old_max, cur_max ) )
+ goto Exit;
+
+ border->max_points = cur_max;
+ }
+
+ Exit:
+ return error;
+ }
+
+
+ static void
+ ft_stroke_border_close( FT_StrokeBorder border,
+ FT_Bool reverse )
+ {
+ FT_UInt start = border->start;
+ FT_UInt count = border->num_points;
+
+
+ FT_ASSERT( border->start >= 0 );
+
+ /* don't record empty paths! */
+ if ( count <= start + 1U )
+ border->num_points = start;
+ else
+ {
+ /* copy the last point to the start of this sub-path, since */
+ /* it contains the `adjusted' starting coordinates */
+ border->num_points = --count;
+ border->points[start] = border->points[count];
+
+ if ( reverse )
+ {
+ /* reverse the points */
+ {
+ FT_Vector* vec1 = border->points + start + 1;
+ FT_Vector* vec2 = border->points + count - 1;
+
+
+ for ( ; vec1 < vec2; vec1++, vec2-- )
+ {
+ FT_Vector tmp;
+
+
+ tmp = *vec1;
+ *vec1 = *vec2;
+ *vec2 = tmp;
+ }
+ }
+
+ /* then the tags */
+ {
+ FT_Byte* tag1 = border->tags + start + 1;
+ FT_Byte* tag2 = border->tags + count - 1;
+
+
+ for ( ; tag1 < tag2; tag1++, tag2-- )
+ {
+ FT_Byte tmp;
+
+
+ tmp = *tag1;
+ *tag1 = *tag2;
+ *tag2 = tmp;
+ }
+ }
+ }
+
+ border->tags[start ] |= FT_STROKE_TAG_BEGIN;
+ border->tags[count - 1] |= FT_STROKE_TAG_END;
+ }
+
+ border->start = -1;
+ border->movable = FALSE;
+ }
+
+
+ static FT_Error
+ ft_stroke_border_lineto( FT_StrokeBorder border,
+ FT_Vector* to,
+ FT_Bool movable )
+ {
+ FT_Error error = FT_Err_Ok;
+
+
+ FT_ASSERT( border->start >= 0 );
+
+ if ( border->movable )
+ {
+ /* move last point */
+ border->points[border->num_points - 1] = *to;
+ }
+ else
+ {
+ /* don't add zero-length lineto */
+ if ( border->num_points > 0 &&
+ FT_IS_SMALL( border->points[border->num_points - 1].x - to->x ) &&
+ FT_IS_SMALL( border->points[border->num_points - 1].y - to->y ) )
+ return error;
+
+ /* add one point */
+ error = ft_stroke_border_grow( border, 1 );
+ if ( !error )
+ {
+ FT_Vector* vec = border->points + border->num_points;
+ FT_Byte* tag = border->tags + border->num_points;
+
+
+ vec[0] = *to;
+ tag[0] = FT_STROKE_TAG_ON;
+
+ border->num_points += 1;
+ }
+ }
+ border->movable = movable;
+ return error;
+ }
+
+
+ static FT_Error
+ ft_stroke_border_conicto( FT_StrokeBorder border,
+ FT_Vector* control,
+ FT_Vector* to )
+ {
+ FT_Error error;
+
+
+ FT_ASSERT( border->start >= 0 );
+
+ error = ft_stroke_border_grow( border, 2 );
+ if ( !error )
+ {
+ FT_Vector* vec = border->points + border->num_points;
+ FT_Byte* tag = border->tags + border->num_points;
+
+
+ vec[0] = *control;
+ vec[1] = *to;
+
+ tag[0] = 0;
+ tag[1] = FT_STROKE_TAG_ON;
+
+ border->num_points += 2;
+ }
+
+ border->movable = FALSE;
+
+ return error;
+ }
+
+
+ static FT_Error
+ ft_stroke_border_cubicto( FT_StrokeBorder border,
+ FT_Vector* control1,
+ FT_Vector* control2,
+ FT_Vector* to )
+ {
+ FT_Error error;
+
+
+ FT_ASSERT( border->start >= 0 );
+
+ error = ft_stroke_border_grow( border, 3 );
+ if ( !error )
+ {
+ FT_Vector* vec = border->points + border->num_points;
+ FT_Byte* tag = border->tags + border->num_points;
+
+
+ vec[0] = *control1;
+ vec[1] = *control2;
+ vec[2] = *to;
+
+ tag[0] = FT_STROKE_TAG_CUBIC;
+ tag[1] = FT_STROKE_TAG_CUBIC;
+ tag[2] = FT_STROKE_TAG_ON;
+
+ border->num_points += 3;
+ }
+
+ border->movable = FALSE;
+
+ return error;
+ }
+
+
+#define FT_ARC_CUBIC_ANGLE ( FT_ANGLE_PI / 2 )
+
+
+ static FT_Error
+ ft_stroke_border_arcto( FT_StrokeBorder border,
+ FT_Vector* center,
+ FT_Fixed radius,
+ FT_Angle angle_start,
+ FT_Angle angle_diff )
+ {
+ FT_Angle total, angle, step, rotate, next, theta;
+ FT_Vector a, b, a2, b2;
+ FT_Fixed length;
+ FT_Error error = FT_Err_Ok;
+
+
+ /* compute start point */
+ FT_Vector_From_Polar( &a, radius, angle_start );
+ a.x += center->x;
+ a.y += center->y;
+
+ total = angle_diff;
+ angle = angle_start;
+ rotate = ( angle_diff >= 0 ) ? FT_ANGLE_PI2 : -FT_ANGLE_PI2;
+
+ while ( total != 0 )
+ {
+ step = total;
+ if ( step > FT_ARC_CUBIC_ANGLE )
+ step = FT_ARC_CUBIC_ANGLE;
+
+ else if ( step < -FT_ARC_CUBIC_ANGLE )
+ step = -FT_ARC_CUBIC_ANGLE;
+
+ next = angle + step;
+ theta = step;
+ if ( theta < 0 )
+ theta = -theta;
+
+ theta >>= 1;
+
+ /* compute end point */
+ FT_Vector_From_Polar( &b, radius, next );
+ b.x += center->x;
+ b.y += center->y;
+
+ /* compute first and second control points */
+ length = FT_MulDiv( radius, FT_Sin( theta ) * 4,
+ ( 0x10000L + FT_Cos( theta ) ) * 3 );
+
+ FT_Vector_From_Polar( &a2, length, angle + rotate );
+ a2.x += a.x;
+ a2.y += a.y;
+
+ FT_Vector_From_Polar( &b2, length, next - rotate );
+ b2.x += b.x;
+ b2.y += b.y;
+
+ /* add cubic arc */
+ error = ft_stroke_border_cubicto( border, &a2, &b2, &b );
+ if ( error )
+ break;
+
+ /* process the rest of the arc ?? */
+ a = b;
+ total -= step;
+ angle = next;
+ }
+
+ return error;
+ }
+
+
+ static FT_Error
+ ft_stroke_border_moveto( FT_StrokeBorder border,
+ FT_Vector* to )
+ {
+ /* close current open path if any ? */
+ if ( border->start >= 0 )
+ ft_stroke_border_close( border, FALSE );
+
+ border->start = border->num_points;
+ border->movable = FALSE;
+
+ return ft_stroke_border_lineto( border, to, FALSE );
+ }
+
+
+ static void
+ ft_stroke_border_init( FT_StrokeBorder border,
+ FT_Memory memory )
+ {
+ border->memory = memory;
+ border->points = NULL;
+ border->tags = NULL;
+
+ border->num_points = 0;
+ border->max_points = 0;
+ border->start = -1;
+ border->valid = FALSE;
+ }
+
+
+ static void
+ ft_stroke_border_reset( FT_StrokeBorder border )
+ {
+ border->num_points = 0;
+ border->start = -1;
+ border->valid = FALSE;
+ }
+
+
+ static void
+ ft_stroke_border_done( FT_StrokeBorder border )
+ {
+ FT_Memory memory = border->memory;
+
+
+ FT_FREE( border->points );
+ FT_FREE( border->tags );
+
+ border->num_points = 0;
+ border->max_points = 0;
+ border->start = -1;
+ border->valid = FALSE;
+ }
+
+
+ static FT_Error
+ ft_stroke_border_get_counts( FT_StrokeBorder border,
+ FT_UInt *anum_points,
+ FT_UInt *anum_contours )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_UInt num_points = 0;
+ FT_UInt num_contours = 0;
+
+ FT_UInt count = border->num_points;
+ FT_Vector* point = border->points;
+ FT_Byte* tags = border->tags;
+ FT_Int in_contour = 0;
+
+
+ for ( ; count > 0; count--, num_points++, point++, tags++ )
+ {
+ if ( tags[0] & FT_STROKE_TAG_BEGIN )
+ {
+ if ( in_contour != 0 )
+ goto Fail;
+
+ in_contour = 1;
+ }
+ else if ( in_contour == 0 )
+ goto Fail;
+
+ if ( tags[0] & FT_STROKE_TAG_END )
+ {
+ in_contour = 0;
+ num_contours++;
+ }
+ }
+
+ if ( in_contour != 0 )
+ goto Fail;
+
+ border->valid = TRUE;
+
+ Exit:
+ *anum_points = num_points;
+ *anum_contours = num_contours;
+ return error;
+
+ Fail:
+ num_points = 0;
+ num_contours = 0;
+ goto Exit;
+ }
+
+
+ static void
+ ft_stroke_border_export( FT_StrokeBorder border,
+ FT_Outline* outline )
+ {
+ /* copy point locations */
+ FT_ARRAY_COPY( outline->points + outline->n_points,
+ border->points,
+ border->num_points );
+
+ /* copy tags */
+ {
+ FT_UInt count = border->num_points;
+ FT_Byte* read = border->tags;
+ FT_Byte* write = (FT_Byte*)outline->tags + outline->n_points;
+
+
+ for ( ; count > 0; count--, read++, write++ )
+ {
+ if ( *read & FT_STROKE_TAG_ON )
+ *write = FT_CURVE_TAG_ON;
+ else if ( *read & FT_STROKE_TAG_CUBIC )
+ *write = FT_CURVE_TAG_CUBIC;
+ else
+ *write = FT_CURVE_TAG_CONIC;
+ }
+ }
+
+ /* copy contours */
+ {
+ FT_UInt count = border->num_points;
+ FT_Byte* tags = border->tags;
+ FT_Short* write = outline->contours + outline->n_contours;
+ FT_Short idx = (FT_Short)outline->n_points;
+
+
+ for ( ; count > 0; count--, tags++, idx++ )
+ {
+ if ( *tags & FT_STROKE_TAG_END )
+ {
+ *write++ = idx;
+ outline->n_contours++;
+ }
+ }
+ }
+
+ outline->n_points = (short)( outline->n_points + border->num_points );
+
+ FT_ASSERT( FT_Outline_Check( outline ) == 0 );
+ }
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** STROKER *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+#define FT_SIDE_TO_ROTATE( s ) ( FT_ANGLE_PI2 - (s) * FT_ANGLE_PI )
+
+ typedef struct FT_StrokerRec_
+ {
+ FT_Angle angle_in; /* direction into curr join */
+ FT_Angle angle_out; /* direction out of join */
+ FT_Vector center; /* current position */
+ FT_Fixed line_length; /* length of last lineto */
+ FT_Bool first_point; /* is this the start? */
+ FT_Bool subpath_open; /* is the subpath open? */
+ FT_Angle subpath_angle; /* subpath start direction */
+ FT_Vector subpath_start; /* subpath start position */
+ FT_Fixed subpath_line_length; /* subpath start lineto len */
+ FT_Bool handle_wide_strokes; /* use wide strokes logic? */
+
+ FT_Stroker_LineCap line_cap;
+ FT_Stroker_LineJoin line_join;
+ FT_Stroker_LineJoin line_join_saved;
+ FT_Fixed miter_limit;
+ FT_Fixed radius;
+
+ FT_StrokeBorderRec borders[2];
+ FT_Library library;
+
+ } FT_StrokerRec;
+
+
+ /* documentation is in ftstroke.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Stroker_New( FT_Library library,
+ FT_Stroker *astroker )
+ {
+ FT_Error error; /* assigned in FT_NEW */
+ FT_Memory memory;
+ FT_Stroker stroker = NULL;
+
+
+ if ( !library )
+ return FT_THROW( Invalid_Argument );
+
+ memory = library->memory;
+
+ if ( !FT_NEW( stroker ) )
+ {
+ stroker->library = library;
+
+ ft_stroke_border_init( &stroker->borders[0], memory );
+ ft_stroke_border_init( &stroker->borders[1], memory );
+ }
+
+ *astroker = stroker;
+
+ return error;
+ }
+
+
+ /* documentation is in ftstroke.h */
+
+ FT_EXPORT_DEF( void )
+ FT_Stroker_Set( FT_Stroker stroker,
+ FT_Fixed radius,
+ FT_Stroker_LineCap line_cap,
+ FT_Stroker_LineJoin line_join,
+ FT_Fixed miter_limit )
+ {
+ stroker->radius = radius;
+ stroker->line_cap = line_cap;
+ stroker->line_join = line_join;
+ stroker->miter_limit = miter_limit;
+
+ /* ensure miter limit has sensible value */
+ if ( stroker->miter_limit < 0x10000 )
+ stroker->miter_limit = 0x10000;
+
+ /* save line join style: */
+ /* line join style can be temporarily changed when stroking curves */
+ stroker->line_join_saved = line_join;
+
+ FT_Stroker_Rewind( stroker );
+ }
+
+
+ /* documentation is in ftstroke.h */
+
+ FT_EXPORT_DEF( void )
+ FT_Stroker_Rewind( FT_Stroker stroker )
+ {
+ if ( stroker )
+ {
+ ft_stroke_border_reset( &stroker->borders[0] );
+ ft_stroke_border_reset( &stroker->borders[1] );
+ }
+ }
+
+
+ /* documentation is in ftstroke.h */
+
+ FT_EXPORT_DEF( void )
+ FT_Stroker_Done( FT_Stroker stroker )
+ {
+ if ( stroker )
+ {
+ FT_Memory memory = stroker->library->memory;
+
+
+ ft_stroke_border_done( &stroker->borders[0] );
+ ft_stroke_border_done( &stroker->borders[1] );
+
+ stroker->library = NULL;
+ FT_FREE( stroker );
+ }
+ }
+
+
+ /* create a circular arc at a corner or cap */
+ static FT_Error
+ ft_stroker_arcto( FT_Stroker stroker,
+ FT_Int side )
+ {
+ FT_Angle total, rotate;
+ FT_Fixed radius = stroker->radius;
+ FT_Error error = FT_Err_Ok;
+ FT_StrokeBorder border = stroker->borders + side;
+
+
+ rotate = FT_SIDE_TO_ROTATE( side );
+
+ total = FT_Angle_Diff( stroker->angle_in, stroker->angle_out );
+ if ( total == FT_ANGLE_PI )
+ total = -rotate * 2;
+
+ error = ft_stroke_border_arcto( border,
+ &stroker->center,
+ radius,
+ stroker->angle_in + rotate,
+ total );
+ border->movable = FALSE;
+ return error;
+ }
+
+
+ /* add a cap at the end of an opened path */
+ static FT_Error
+ ft_stroker_cap( FT_Stroker stroker,
+ FT_Angle angle,
+ FT_Int side )
+ {
+ FT_Error error = FT_Err_Ok;
+
+
+ if ( stroker->line_cap == FT_STROKER_LINECAP_ROUND )
+ {
+ /* add a round cap */
+ stroker->angle_in = angle;
+ stroker->angle_out = angle + FT_ANGLE_PI;
+
+ error = ft_stroker_arcto( stroker, side );
+ }
+ else if ( stroker->line_cap == FT_STROKER_LINECAP_SQUARE )
+ {
+ /* add a square cap */
+ FT_Vector delta, delta2;
+ FT_Angle rotate = FT_SIDE_TO_ROTATE( side );
+ FT_Fixed radius = stroker->radius;
+ FT_StrokeBorder border = stroker->borders + side;
+
+
+ FT_Vector_From_Polar( &delta2, radius, angle + rotate );
+ FT_Vector_From_Polar( &delta, radius, angle );
+
+ delta.x += stroker->center.x + delta2.x;
+ delta.y += stroker->center.y + delta2.y;
+
+ error = ft_stroke_border_lineto( border, &delta, FALSE );
+ if ( error )
+ goto Exit;
+
+ FT_Vector_From_Polar( &delta2, radius, angle - rotate );
+ FT_Vector_From_Polar( &delta, radius, angle );
+
+ delta.x += delta2.x + stroker->center.x;
+ delta.y += delta2.y + stroker->center.y;
+
+ error = ft_stroke_border_lineto( border, &delta, FALSE );
+ }
+ else if ( stroker->line_cap == FT_STROKER_LINECAP_BUTT )
+ {
+ /* add a butt ending */
+ FT_Vector delta;
+ FT_Angle rotate = FT_SIDE_TO_ROTATE( side );
+ FT_Fixed radius = stroker->radius;
+ FT_StrokeBorder border = stroker->borders + side;
+
+
+ FT_Vector_From_Polar( &delta, radius, angle + rotate );
+
+ delta.x += stroker->center.x;
+ delta.y += stroker->center.y;
+
+ error = ft_stroke_border_lineto( border, &delta, FALSE );
+ if ( error )
+ goto Exit;
+
+ FT_Vector_From_Polar( &delta, radius, angle - rotate );
+
+ delta.x += stroker->center.x;
+ delta.y += stroker->center.y;
+
+ error = ft_stroke_border_lineto( border, &delta, FALSE );
+ }
+
+ Exit:
+ return error;
+ }
+
+
+ /* process an inside corner, i.e. compute intersection */
+ static FT_Error
+ ft_stroker_inside( FT_Stroker stroker,
+ FT_Int side,
+ FT_Fixed line_length )
+ {
+ FT_StrokeBorder border = stroker->borders + side;
+ FT_Angle phi, theta, rotate;
+ FT_Fixed length, thcos;
+ FT_Vector delta;
+ FT_Error error = FT_Err_Ok;
+ FT_Bool intersect; /* use intersection of lines? */
+
+
+ rotate = FT_SIDE_TO_ROTATE( side );
+
+ theta = FT_Angle_Diff( stroker->angle_in, stroker->angle_out ) / 2;
+
+ /* Only intersect borders if between two lineto's and both */
+ /* lines are long enough (line_length is zero for curves). */
+ if ( !border->movable || line_length == 0 )
+ intersect = FALSE;
+ else
+ {
+ /* compute minimum required length of lines */
+ FT_Fixed min_length = ft_pos_abs( FT_MulFix( stroker->radius,
+ FT_Tan( theta ) ) );
+
+
+ intersect = FT_BOOL( stroker->line_length >= min_length &&
+ line_length >= min_length );
+ }
+
+ if ( !intersect )
+ {
+ FT_Vector_From_Polar( &delta, stroker->radius,
+ stroker->angle_out + rotate );
+ delta.x += stroker->center.x;
+ delta.y += stroker->center.y;
+
+ border->movable = FALSE;
+ }
+ else
+ {
+ /* compute median angle */
+ phi = stroker->angle_in + theta;
+
+ thcos = FT_Cos( theta );
+
+ length = FT_DivFix( stroker->radius, thcos );
+
+ FT_Vector_From_Polar( &delta, length, phi + rotate );
+ delta.x += stroker->center.x;
+ delta.y += stroker->center.y;
+ }
+
+ error = ft_stroke_border_lineto( border, &delta, FALSE );
+
+ return error;
+ }
+
+
+ /* process an outside corner, i.e. compute bevel/miter/round */
+ static FT_Error
+ ft_stroker_outside( FT_Stroker stroker,
+ FT_Int side,
+ FT_Fixed line_length )
+ {
+ FT_StrokeBorder border = stroker->borders + side;
+ FT_Error error;
+ FT_Angle rotate;
+
+
+ if ( stroker->line_join == FT_STROKER_LINEJOIN_ROUND )
+ error = ft_stroker_arcto( stroker, side );
+ else
+ {
+ /* this is a mitered (pointed) or beveled (truncated) corner */
+ FT_Fixed sigma = 0, radius = stroker->radius;
+ FT_Angle theta = 0, phi = 0;
+ FT_Fixed thcos = 0;
+ FT_Bool bevel, fixed_bevel;
+
+
+ rotate = FT_SIDE_TO_ROTATE( side );
+
+ bevel =
+ FT_BOOL( stroker->line_join == FT_STROKER_LINEJOIN_BEVEL );
+
+ fixed_bevel =
+ FT_BOOL( stroker->line_join != FT_STROKER_LINEJOIN_MITER_VARIABLE );
+
+ if ( !bevel )
+ {
+ theta = FT_Angle_Diff( stroker->angle_in, stroker->angle_out );
+
+ if ( theta == FT_ANGLE_PI )
+ {
+ theta = rotate;
+ phi = stroker->angle_in;
+ }
+ else
+ {
+ theta /= 2;
+ phi = stroker->angle_in + theta + rotate;
+ }
+
+ thcos = FT_Cos( theta );
+ sigma = FT_MulFix( stroker->miter_limit, thcos );
+
+ /* is miter limit exceeded? */
+ if ( sigma < 0x10000L )
+ {
+ /* don't create variable bevels for very small deviations; */
+ /* FT_Sin(x) = 0 for x <= 57 */
+ if ( fixed_bevel || ft_pos_abs( theta ) > 57 )
+ bevel = TRUE;
+ }
+ }
+
+ if ( bevel ) /* this is a bevel (broken angle) */
+ {
+ if ( fixed_bevel )
+ {
+ /* the outer corners are simply joined together */
+ FT_Vector delta;
+
+
+ /* add bevel */
+ FT_Vector_From_Polar( &delta,
+ radius,
+ stroker->angle_out + rotate );
+ delta.x += stroker->center.x;
+ delta.y += stroker->center.y;
+
+ border->movable = FALSE;
+ error = ft_stroke_border_lineto( border, &delta, FALSE );
+ }
+ else /* variable bevel */
+ {
+ /* the miter is truncated */
+ FT_Vector middle, delta;
+ FT_Fixed length;
+
+
+ /* compute middle point */
+ FT_Vector_From_Polar( &middle,
+ FT_MulFix( radius, stroker->miter_limit ),
+ phi );
+ middle.x += stroker->center.x;
+ middle.y += stroker->center.y;
+
+ /* compute first angle point */
+ length = FT_MulDiv( radius, 0x10000L - sigma,
+ ft_pos_abs( FT_Sin( theta ) ) );
+
+ FT_Vector_From_Polar( &delta, length, phi + rotate );
+ delta.x += middle.x;
+ delta.y += middle.y;
+
+ error = ft_stroke_border_lineto( border, &delta, FALSE );
+ if ( error )
+ goto Exit;
+
+ /* compute second angle point */
+ FT_Vector_From_Polar( &delta, length, phi - rotate );
+ delta.x += middle.x;
+ delta.y += middle.y;
+
+ error = ft_stroke_border_lineto( border, &delta, FALSE );
+ if ( error )
+ goto Exit;
+
+ /* finally, add an end point; only needed if not lineto */
+ /* (line_length is zero for curves) */
+ if ( line_length == 0 )
+ {
+ FT_Vector_From_Polar( &delta,
+ radius,
+ stroker->angle_out + rotate );
+
+ delta.x += stroker->center.x;
+ delta.y += stroker->center.y;
+
+ error = ft_stroke_border_lineto( border, &delta, FALSE );
+ }
+ }
+ }
+ else /* this is a miter (intersection) */
+ {
+ FT_Fixed length;
+ FT_Vector delta;
+
+
+ length = FT_DivFix( stroker->radius, thcos );
+
+ FT_Vector_From_Polar( &delta, length, phi );
+ delta.x += stroker->center.x;
+ delta.y += stroker->center.y;
+
+ error = ft_stroke_border_lineto( border, &delta, FALSE );
+ if ( error )
+ goto Exit;
+
+ /* now add an end point; only needed if not lineto */
+ /* (line_length is zero for curves) */
+ if ( line_length == 0 )
+ {
+ FT_Vector_From_Polar( &delta,
+ stroker->radius,
+ stroker->angle_out + rotate );
+ delta.x += stroker->center.x;
+ delta.y += stroker->center.y;
+
+ error = ft_stroke_border_lineto( border, &delta, FALSE );
+ }
+ }
+ }
+
+ Exit:
+ return error;
+ }
+
+
+ static FT_Error
+ ft_stroker_process_corner( FT_Stroker stroker,
+ FT_Fixed line_length )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_Angle turn;
+ FT_Int inside_side;
+
+
+ turn = FT_Angle_Diff( stroker->angle_in, stroker->angle_out );
+
+ /* no specific corner processing is required if the turn is 0 */
+ if ( turn == 0 )
+ goto Exit;
+
+ /* when we turn to the right, the inside side is 0 */
+ inside_side = 0;
+
+ /* otherwise, the inside side is 1 */
+ if ( turn < 0 )
+ inside_side = 1;
+
+ /* process the inside side */
+ error = ft_stroker_inside( stroker, inside_side, line_length );
+ if ( error )
+ goto Exit;
+
+ /* process the outside side */
+ error = ft_stroker_outside( stroker, 1 - inside_side, line_length );
+
+ Exit:
+ return error;
+ }
+
+
+ /* add two points to the left and right borders corresponding to the */
+ /* start of the subpath */
+ static FT_Error
+ ft_stroker_subpath_start( FT_Stroker stroker,
+ FT_Angle start_angle,
+ FT_Fixed line_length )
+ {
+ FT_Vector delta;
+ FT_Vector point;
+ FT_Error error;
+ FT_StrokeBorder border;
+
+
+ FT_Vector_From_Polar( &delta, stroker->radius,
+ start_angle + FT_ANGLE_PI2 );
+
+ point.x = stroker->center.x + delta.x;
+ point.y = stroker->center.y + delta.y;
+
+ border = stroker->borders;
+ error = ft_stroke_border_moveto( border, &point );
+ if ( error )
+ goto Exit;
+
+ point.x = stroker->center.x - delta.x;
+ point.y = stroker->center.y - delta.y;
+
+ border++;
+ error = ft_stroke_border_moveto( border, &point );
+
+ /* save angle, position, and line length for last join */
+ /* (line_length is zero for curves) */
+ stroker->subpath_angle = start_angle;
+ stroker->first_point = FALSE;
+ stroker->subpath_line_length = line_length;
+
+ Exit:
+ return error;
+ }
+
+
+ /* documentation is in ftstroke.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Stroker_LineTo( FT_Stroker stroker,
+ FT_Vector* to )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_StrokeBorder border;
+ FT_Vector delta;
+ FT_Angle angle;
+ FT_Int side;
+ FT_Fixed line_length;
+
+
+ delta.x = to->x - stroker->center.x;
+ delta.y = to->y - stroker->center.y;
+
+ /* a zero-length lineto is a no-op; avoid creating a spurious corner */
+ if ( delta.x == 0 && delta.y == 0 )
+ goto Exit;
+
+ /* compute length of line */
+ line_length = FT_Vector_Length( &delta );
+
+ angle = FT_Atan2( delta.x, delta.y );
+ FT_Vector_From_Polar( &delta, stroker->radius, angle + FT_ANGLE_PI2 );
+
+ /* process corner if necessary */
+ if ( stroker->first_point )
+ {
+ /* This is the first segment of a subpath. We need to */
+ /* add a point to each border at their respective starting */
+ /* point locations. */
+ error = ft_stroker_subpath_start( stroker, angle, line_length );
+ if ( error )
+ goto Exit;
+ }
+ else
+ {
+ /* process the current corner */
+ stroker->angle_out = angle;
+ error = ft_stroker_process_corner( stroker, line_length );
+ if ( error )
+ goto Exit;
+ }
+
+ /* now add a line segment to both the `inside' and `outside' paths */
+ for ( border = stroker->borders, side = 1; side >= 0; side--, border++ )
+ {
+ FT_Vector point;
+
+
+ point.x = to->x + delta.x;
+ point.y = to->y + delta.y;
+
+ /* the ends of lineto borders are movable */
+ error = ft_stroke_border_lineto( border, &point, TRUE );
+ if ( error )
+ goto Exit;
+
+ delta.x = -delta.x;
+ delta.y = -delta.y;
+ }
+
+ stroker->angle_in = angle;
+ stroker->center = *to;
+ stroker->line_length = line_length;
+
+ Exit:
+ return error;
+ }
+
+
+ /* documentation is in ftstroke.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Stroker_ConicTo( FT_Stroker stroker,
+ FT_Vector* control,
+ FT_Vector* to )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_Vector bez_stack[34];
+ FT_Vector* arc;
+ FT_Vector* limit = bez_stack + 30;
+ FT_Bool first_arc = TRUE;
+
+
+ /* if all control points are coincident, this is a no-op; */
+ /* avoid creating a spurious corner */
+ if ( FT_IS_SMALL( stroker->center.x - control->x ) &&
+ FT_IS_SMALL( stroker->center.y - control->y ) &&
+ FT_IS_SMALL( control->x - to->x ) &&
+ FT_IS_SMALL( control->y - to->y ) )
+ {
+ stroker->center = *to;
+ goto Exit;
+ }
+
+ arc = bez_stack;
+ arc[0] = *to;
+ arc[1] = *control;
+ arc[2] = stroker->center;
+
+ while ( arc >= bez_stack )
+ {
+ FT_Angle angle_in, angle_out;
+
+
+ /* initialize with current direction */
+ angle_in = angle_out = stroker->angle_in;
+
+ if ( arc < limit &&
+ !ft_conic_is_small_enough( arc, &angle_in, &angle_out ) )
+ {
+ if ( stroker->first_point )
+ stroker->angle_in = angle_in;
+
+ ft_conic_split( arc );
+ arc += 2;
+ continue;
+ }
+
+ if ( first_arc )
+ {
+ first_arc = FALSE;
+
+ /* process corner if necessary */
+ if ( stroker->first_point )
+ error = ft_stroker_subpath_start( stroker, angle_in, 0 );
+ else
+ {
+ stroker->angle_out = angle_in;
+ error = ft_stroker_process_corner( stroker, 0 );
+ }
+ }
+ else if ( ft_pos_abs( FT_Angle_Diff( stroker->angle_in, angle_in ) ) >
+ FT_SMALL_CONIC_THRESHOLD / 4 )
+ {
+ /* if the deviation from one arc to the next is too great, */
+ /* add a round corner */
+ stroker->center = arc[2];
+ stroker->angle_out = angle_in;
+ stroker->line_join = FT_STROKER_LINEJOIN_ROUND;
+
+ error = ft_stroker_process_corner( stroker, 0 );
+
+ /* reinstate line join style */
+ stroker->line_join = stroker->line_join_saved;
+ }
+
+ if ( error )
+ goto Exit;
+
+ /* the arc's angle is small enough; we can add it directly to each */
+ /* border */
+ {
+ FT_Vector ctrl, end;
+ FT_Angle theta, phi, rotate, alpha0 = 0;
+ FT_Fixed length;
+ FT_StrokeBorder border;
+ FT_Int side;
+
+
+ theta = FT_Angle_Diff( angle_in, angle_out ) / 2;
+ phi = angle_in + theta;
+ length = FT_DivFix( stroker->radius, FT_Cos( theta ) );
+
+ /* compute direction of original arc */
+ if ( stroker->handle_wide_strokes )
+ alpha0 = FT_Atan2( arc[0].x - arc[2].x, arc[0].y - arc[2].y );
+
+ for ( border = stroker->borders, side = 0;
+ side <= 1;
+ side++, border++ )
+ {
+ rotate = FT_SIDE_TO_ROTATE( side );
+
+ /* compute control point */
+ FT_Vector_From_Polar( &ctrl, length, phi + rotate );
+ ctrl.x += arc[1].x;
+ ctrl.y += arc[1].y;
+
+ /* compute end point */
+ FT_Vector_From_Polar( &end, stroker->radius, angle_out + rotate );
+ end.x += arc[0].x;
+ end.y += arc[0].y;
+
+ if ( stroker->handle_wide_strokes )
+ {
+ FT_Vector start;
+ FT_Angle alpha1;
+
+
+ /* determine whether the border radius is greater than the */
+ /* radius of curvature of the original arc */
+ start = border->points[border->num_points - 1];
+
+ alpha1 = FT_Atan2( end.x - start.x, end.y - start.y );
+
+ /* is the direction of the border arc opposite to */
+ /* that of the original arc? */
+ if ( ft_pos_abs( FT_Angle_Diff( alpha0, alpha1 ) ) >
+ FT_ANGLE_PI / 2 )
+ {
+ FT_Angle beta, gamma;
+ FT_Vector bvec, delta;
+ FT_Fixed blen, sinA, sinB, alen;
+
+
+ /* use the sine rule to find the intersection point */
+ beta = FT_Atan2( arc[2].x - start.x, arc[2].y - start.y );
+ gamma = FT_Atan2( arc[0].x - end.x, arc[0].y - end.y );
+
+ bvec.x = end.x - start.x;
+ bvec.y = end.y - start.y;
+
+ blen = FT_Vector_Length( &bvec );
+
+ sinA = ft_pos_abs( FT_Sin( alpha1 - gamma ) );
+ sinB = ft_pos_abs( FT_Sin( beta - gamma ) );
+
+ alen = FT_MulDiv( blen, sinA, sinB );
+
+ FT_Vector_From_Polar( &delta, alen, beta );
+ delta.x += start.x;
+ delta.y += start.y;
+
+ /* circumnavigate the negative sector backwards */
+ border->movable = FALSE;
+ error = ft_stroke_border_lineto( border, &delta, FALSE );
+ if ( error )
+ goto Exit;
+ error = ft_stroke_border_lineto( border, &end, FALSE );
+ if ( error )
+ goto Exit;
+ error = ft_stroke_border_conicto( border, &ctrl, &start );
+ if ( error )
+ goto Exit;
+ /* and then move to the endpoint */
+ error = ft_stroke_border_lineto( border, &end, FALSE );
+ if ( error )
+ goto Exit;
+
+ continue;
+ }
+
+ /* else fall through */
+ }
+
+ /* simply add an arc */
+ error = ft_stroke_border_conicto( border, &ctrl, &end );
+ if ( error )
+ goto Exit;
+ }
+ }
+
+ arc -= 2;
+
+ stroker->angle_in = angle_out;
+ }
+
+ stroker->center = *to;
+
+ Exit:
+ return error;
+ }
+
+
+ /* documentation is in ftstroke.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Stroker_CubicTo( FT_Stroker stroker,
+ FT_Vector* control1,
+ FT_Vector* control2,
+ FT_Vector* to )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_Vector bez_stack[37];
+ FT_Vector* arc;
+ FT_Vector* limit = bez_stack + 32;
+ FT_Bool first_arc = TRUE;
+
+
+ /* if all control points are coincident, this is a no-op; */
+ /* avoid creating a spurious corner */
+ if ( FT_IS_SMALL( stroker->center.x - control1->x ) &&
+ FT_IS_SMALL( stroker->center.y - control1->y ) &&
+ FT_IS_SMALL( control1->x - control2->x ) &&
+ FT_IS_SMALL( control1->y - control2->y ) &&
+ FT_IS_SMALL( control2->x - to->x ) &&
+ FT_IS_SMALL( control2->y - to->y ) )
+ {
+ stroker->center = *to;
+ goto Exit;
+ }
+
+ arc = bez_stack;
+ arc[0] = *to;
+ arc[1] = *control2;
+ arc[2] = *control1;
+ arc[3] = stroker->center;
+
+ while ( arc >= bez_stack )
+ {
+ FT_Angle angle_in, angle_mid, angle_out;
+
+
+ /* initialize with current direction */
+ angle_in = angle_out = angle_mid = stroker->angle_in;
+
+ if ( arc < limit &&
+ !ft_cubic_is_small_enough( arc, &angle_in,
+ &angle_mid, &angle_out ) )
+ {
+ if ( stroker->first_point )
+ stroker->angle_in = angle_in;
+
+ ft_cubic_split( arc );
+ arc += 3;
+ continue;
+ }
+
+ if ( first_arc )
+ {
+ first_arc = FALSE;
+
+ /* process corner if necessary */
+ if ( stroker->first_point )
+ error = ft_stroker_subpath_start( stroker, angle_in, 0 );
+ else
+ {
+ stroker->angle_out = angle_in;
+ error = ft_stroker_process_corner( stroker, 0 );
+ }
+ }
+ else if ( ft_pos_abs( FT_Angle_Diff( stroker->angle_in, angle_in ) ) >
+ FT_SMALL_CUBIC_THRESHOLD / 4 )
+ {
+ /* if the deviation from one arc to the next is too great, */
+ /* add a round corner */
+ stroker->center = arc[3];
+ stroker->angle_out = angle_in;
+ stroker->line_join = FT_STROKER_LINEJOIN_ROUND;
+
+ error = ft_stroker_process_corner( stroker, 0 );
+
+ /* reinstate line join style */
+ stroker->line_join = stroker->line_join_saved;
+ }
+
+ if ( error )
+ goto Exit;
+
+ /* the arc's angle is small enough; we can add it directly to each */
+ /* border */
+ {
+ FT_Vector ctrl1, ctrl2, end;
+ FT_Angle theta1, phi1, theta2, phi2, rotate, alpha0 = 0;
+ FT_Fixed length1, length2;
+ FT_StrokeBorder border;
+ FT_Int side;
+
+
+ theta1 = FT_Angle_Diff( angle_in, angle_mid ) / 2;
+ theta2 = FT_Angle_Diff( angle_mid, angle_out ) / 2;
+ phi1 = ft_angle_mean( angle_in, angle_mid );
+ phi2 = ft_angle_mean( angle_mid, angle_out );
+ length1 = FT_DivFix( stroker->radius, FT_Cos( theta1 ) );
+ length2 = FT_DivFix( stroker->radius, FT_Cos( theta2 ) );
+
+ /* compute direction of original arc */
+ if ( stroker->handle_wide_strokes )
+ alpha0 = FT_Atan2( arc[0].x - arc[3].x, arc[0].y - arc[3].y );
+
+ for ( border = stroker->borders, side = 0;
+ side <= 1;
+ side++, border++ )
+ {
+ rotate = FT_SIDE_TO_ROTATE( side );
+
+ /* compute control points */
+ FT_Vector_From_Polar( &ctrl1, length1, phi1 + rotate );
+ ctrl1.x += arc[2].x;
+ ctrl1.y += arc[2].y;
+
+ FT_Vector_From_Polar( &ctrl2, length2, phi2 + rotate );
+ ctrl2.x += arc[1].x;
+ ctrl2.y += arc[1].y;
+
+ /* compute end point */
+ FT_Vector_From_Polar( &end, stroker->radius, angle_out + rotate );
+ end.x += arc[0].x;
+ end.y += arc[0].y;
+
+ if ( stroker->handle_wide_strokes )
+ {
+ FT_Vector start;
+ FT_Angle alpha1;
+
+
+ /* determine whether the border radius is greater than the */
+ /* radius of curvature of the original arc */
+ start = border->points[border->num_points - 1];
+
+ alpha1 = FT_Atan2( end.x - start.x, end.y - start.y );
+
+ /* is the direction of the border arc opposite to */
+ /* that of the original arc? */
+ if ( ft_pos_abs( FT_Angle_Diff( alpha0, alpha1 ) ) >
+ FT_ANGLE_PI / 2 )
+ {
+ FT_Angle beta, gamma;
+ FT_Vector bvec, delta;
+ FT_Fixed blen, sinA, sinB, alen;
+
+
+ /* use the sine rule to find the intersection point */
+ beta = FT_Atan2( arc[3].x - start.x, arc[3].y - start.y );
+ gamma = FT_Atan2( arc[0].x - end.x, arc[0].y - end.y );
+
+ bvec.x = end.x - start.x;
+ bvec.y = end.y - start.y;
+
+ blen = FT_Vector_Length( &bvec );
+
+ sinA = ft_pos_abs( FT_Sin( alpha1 - gamma ) );
+ sinB = ft_pos_abs( FT_Sin( beta - gamma ) );
+
+ alen = FT_MulDiv( blen, sinA, sinB );
+
+ FT_Vector_From_Polar( &delta, alen, beta );
+ delta.x += start.x;
+ delta.y += start.y;
+
+ /* circumnavigate the negative sector backwards */
+ border->movable = FALSE;
+ error = ft_stroke_border_lineto( border, &delta, FALSE );
+ if ( error )
+ goto Exit;
+ error = ft_stroke_border_lineto( border, &end, FALSE );
+ if ( error )
+ goto Exit;
+ error = ft_stroke_border_cubicto( border,
+ &ctrl2,
+ &ctrl1,
+ &start );
+ if ( error )
+ goto Exit;
+ /* and then move to the endpoint */
+ error = ft_stroke_border_lineto( border, &end, FALSE );
+ if ( error )
+ goto Exit;
+
+ continue;
+ }
+
+ /* else fall through */
+ }
+
+ /* simply add an arc */
+ error = ft_stroke_border_cubicto( border, &ctrl1, &ctrl2, &end );
+ if ( error )
+ goto Exit;
+ }
+ }
+
+ arc -= 3;
+
+ stroker->angle_in = angle_out;
+ }
+
+ stroker->center = *to;
+
+ Exit:
+ return error;
+ }
+
+
+ /* documentation is in ftstroke.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Stroker_BeginSubPath( FT_Stroker stroker,
+ FT_Vector* to,
+ FT_Bool open )
+ {
+ /* We cannot process the first point, because there is not enough */
+ /* information regarding its corner/cap. The latter will be processed */
+ /* in the `FT_Stroker_EndSubPath' routine. */
+ /* */
+ stroker->first_point = TRUE;
+ stroker->center = *to;
+ stroker->subpath_open = open;
+
+ /* Determine if we need to check whether the border radius is greater */
+ /* than the radius of curvature of a curve, to handle this case */
+ /* specially. This is only required if bevel joins or butt caps may */
+ /* be created, because round & miter joins and round & square caps */
+ /* cover the negative sector created with wide strokes. */
+ stroker->handle_wide_strokes =
+ FT_BOOL( stroker->line_join != FT_STROKER_LINEJOIN_ROUND ||
+ ( stroker->subpath_open &&
+ stroker->line_cap == FT_STROKER_LINECAP_BUTT ) );
+
+ /* record the subpath start point for each border */
+ stroker->subpath_start = *to;
+
+ stroker->angle_in = 0;
+
+ return FT_Err_Ok;
+ }
+
+
+ static FT_Error
+ ft_stroker_add_reverse_left( FT_Stroker stroker,
+ FT_Bool open )
+ {
+ FT_StrokeBorder right = stroker->borders + 0;
+ FT_StrokeBorder left = stroker->borders + 1;
+ FT_Int new_points;
+ FT_Error error = FT_Err_Ok;
+
+
+ FT_ASSERT( left->start >= 0 );
+
+ new_points = left->num_points - left->start;
+ if ( new_points > 0 )
+ {
+ error = ft_stroke_border_grow( right, (FT_UInt)new_points );
+ if ( error )
+ goto Exit;
+
+ {
+ FT_Vector* dst_point = right->points + right->num_points;
+ FT_Byte* dst_tag = right->tags + right->num_points;
+ FT_Vector* src_point = left->points + left->num_points - 1;
+ FT_Byte* src_tag = left->tags + left->num_points - 1;
+
+
+ while ( src_point >= left->points + left->start )
+ {
+ *dst_point = *src_point;
+ *dst_tag = *src_tag;
+
+ if ( open )
+ dst_tag[0] &= ~FT_STROKE_TAG_BEGIN_END;
+ else
+ {
+ FT_Byte ttag =
+ (FT_Byte)( dst_tag[0] & FT_STROKE_TAG_BEGIN_END );
+
+
+ /* switch begin/end tags if necessary */
+ if ( ttag == FT_STROKE_TAG_BEGIN ||
+ ttag == FT_STROKE_TAG_END )
+ dst_tag[0] ^= FT_STROKE_TAG_BEGIN_END;
+ }
+
+ src_point--;
+ src_tag--;
+ dst_point++;
+ dst_tag++;
+ }
+ }
+
+ left->num_points = left->start;
+ right->num_points += new_points;
+
+ right->movable = FALSE;
+ left->movable = FALSE;
+ }
+
+ Exit:
+ return error;
+ }
+
+
+ /* documentation is in ftstroke.h */
+
+ /* there's a lot of magic in this function! */
+ FT_EXPORT_DEF( FT_Error )
+ FT_Stroker_EndSubPath( FT_Stroker stroker )
+ {
+ FT_Error error = FT_Err_Ok;
+
+
+ if ( stroker->subpath_open )
+ {
+ FT_StrokeBorder right = stroker->borders;
+
+
+ /* All right, this is an opened path, we need to add a cap between */
+ /* right & left, add the reverse of left, then add a final cap */
+ /* between left & right. */
+ error = ft_stroker_cap( stroker, stroker->angle_in, 0 );
+ if ( error )
+ goto Exit;
+
+ /* add reversed points from `left' to `right' */
+ error = ft_stroker_add_reverse_left( stroker, TRUE );
+ if ( error )
+ goto Exit;
+
+ /* now add the final cap */
+ stroker->center = stroker->subpath_start;
+ error = ft_stroker_cap( stroker,
+ stroker->subpath_angle + FT_ANGLE_PI, 0 );
+ if ( error )
+ goto Exit;
+
+ /* Now end the right subpath accordingly. The left one is */
+ /* rewind and doesn't need further processing. */
+ ft_stroke_border_close( right, FALSE );
+ }
+ else
+ {
+ FT_Angle turn;
+ FT_Int inside_side;
+
+
+ /* close the path if needed */
+ if ( stroker->center.x != stroker->subpath_start.x ||
+ stroker->center.y != stroker->subpath_start.y )
+ {
+ error = FT_Stroker_LineTo( stroker, &stroker->subpath_start );
+ if ( error )
+ goto Exit;
+ }
+
+ /* process the corner */
+ stroker->angle_out = stroker->subpath_angle;
+ turn = FT_Angle_Diff( stroker->angle_in,
+ stroker->angle_out );
+
+ /* no specific corner processing is required if the turn is 0 */
+ if ( turn != 0 )
+ {
+ /* when we turn to the right, the inside side is 0 */
+ inside_side = 0;
+
+ /* otherwise, the inside side is 1 */
+ if ( turn < 0 )
+ inside_side = 1;
+
+ error = ft_stroker_inside( stroker,
+ inside_side,
+ stroker->subpath_line_length );
+ if ( error )
+ goto Exit;
+
+ /* process the outside side */
+ error = ft_stroker_outside( stroker,
+ 1 - inside_side,
+ stroker->subpath_line_length );
+ if ( error )
+ goto Exit;
+ }
+
+ /* then end our two subpaths */
+ ft_stroke_border_close( stroker->borders + 0, FALSE );
+ ft_stroke_border_close( stroker->borders + 1, TRUE );
+ }
+
+ Exit:
+ return error;
+ }
+
+
+ /* documentation is in ftstroke.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Stroker_GetBorderCounts( FT_Stroker stroker,
+ FT_StrokerBorder border,
+ FT_UInt *anum_points,
+ FT_UInt *anum_contours )
+ {
+ FT_UInt num_points = 0, num_contours = 0;
+ FT_Error error;
+
+
+ if ( !stroker || border > 1 )
+ {
+ error = FT_THROW( Invalid_Argument );
+ goto Exit;
+ }
+
+ error = ft_stroke_border_get_counts( stroker->borders + border,
+ &num_points, &num_contours );
+ Exit:
+ if ( anum_points )
+ *anum_points = num_points;
+
+ if ( anum_contours )
+ *anum_contours = num_contours;
+
+ return error;
+ }
+
+
+ /* documentation is in ftstroke.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Stroker_GetCounts( FT_Stroker stroker,
+ FT_UInt *anum_points,
+ FT_UInt *anum_contours )
+ {
+ FT_UInt count1, count2, num_points = 0;
+ FT_UInt count3, count4, num_contours = 0;
+ FT_Error error;
+
+
+ error = ft_stroke_border_get_counts( stroker->borders + 0,
+ &count1, &count2 );
+ if ( error )
+ goto Exit;
+
+ error = ft_stroke_border_get_counts( stroker->borders + 1,
+ &count3, &count4 );
+ if ( error )
+ goto Exit;
+
+ num_points = count1 + count3;
+ num_contours = count2 + count4;
+
+ Exit:
+ *anum_points = num_points;
+ *anum_contours = num_contours;
+ return error;
+ }
+
+
+ /* documentation is in ftstroke.h */
+
+ FT_EXPORT_DEF( void )
+ FT_Stroker_ExportBorder( FT_Stroker stroker,
+ FT_StrokerBorder border,
+ FT_Outline* outline )
+ {
+ if ( border == FT_STROKER_BORDER_LEFT ||
+ border == FT_STROKER_BORDER_RIGHT )
+ {
+ FT_StrokeBorder sborder = & stroker->borders[border];
+
+
+ if ( sborder->valid )
+ ft_stroke_border_export( sborder, outline );
+ }
+ }
+
+
+ /* documentation is in ftstroke.h */
+
+ FT_EXPORT_DEF( void )
+ FT_Stroker_Export( FT_Stroker stroker,
+ FT_Outline* outline )
+ {
+ FT_Stroker_ExportBorder( stroker, FT_STROKER_BORDER_LEFT, outline );
+ FT_Stroker_ExportBorder( stroker, FT_STROKER_BORDER_RIGHT, outline );
+ }
+
+
+ /* documentation is in ftstroke.h */
+
+ /*
+ * The following is very similar to FT_Outline_Decompose, except
+ * that we do support opened paths, and do not scale the outline.
+ */
+ FT_EXPORT_DEF( FT_Error )
+ FT_Stroker_ParseOutline( FT_Stroker stroker,
+ FT_Outline* outline,
+ FT_Bool opened )
+ {
+ FT_Vector v_last;
+ FT_Vector v_control;
+ FT_Vector v_start;
+
+ FT_Vector* point;
+ FT_Vector* limit;
+ char* tags;
+
+ FT_Error error;
+
+ FT_Int n; /* index of contour in outline */
+ FT_UInt first; /* index of first point in contour */
+ FT_Int tag; /* current point's state */
+
+
+ if ( !outline || !stroker )
+ return FT_THROW( Invalid_Argument );
+
+ FT_Stroker_Rewind( stroker );
+
+ first = 0;
+
+ for ( n = 0; n < outline->n_contours; n++ )
+ {
+ FT_UInt last; /* index of last point in contour */
+
+
+ last = outline->contours[n];
+ limit = outline->points + last;
+
+ /* skip empty points; we don't stroke these */
+ if ( last <= first )
+ {
+ first = last + 1;
+ continue;
+ }
+
+ v_start = outline->points[first];
+ v_last = outline->points[last];
+
+ v_control = v_start;
+
+ point = outline->points + first;
+ tags = outline->tags + first;
+ tag = FT_CURVE_TAG( tags[0] );
+
+ /* A contour cannot start with a cubic control point! */
+ if ( tag == FT_CURVE_TAG_CUBIC )
+ goto Invalid_Outline;
+
+ /* check first point to determine origin */
+ if ( tag == FT_CURVE_TAG_CONIC )
+ {
+ /* First point is conic control. Yes, this happens. */
+ if ( FT_CURVE_TAG( outline->tags[last] ) == FT_CURVE_TAG_ON )
+ {
+ /* start at last point if it is on the curve */
+ v_start = v_last;
+ limit--;
+ }
+ else
+ {
+ /* if both first and last points are conic, */
+ /* start at their middle */
+ v_start.x = ( v_start.x + v_last.x ) / 2;
+ v_start.y = ( v_start.y + v_last.y ) / 2;
+ }
+ point--;
+ tags--;
+ }
+
+ error = FT_Stroker_BeginSubPath( stroker, &v_start, opened );
+ if ( error )
+ goto Exit;
+
+ while ( point < limit )
+ {
+ point++;
+ tags++;
+
+ tag = FT_CURVE_TAG( tags[0] );
+ switch ( tag )
+ {
+ case FT_CURVE_TAG_ON: /* emit a single line_to */
+ {
+ FT_Vector vec;
+
+
+ vec.x = point->x;
+ vec.y = point->y;
+
+ error = FT_Stroker_LineTo( stroker, &vec );
+ if ( error )
+ goto Exit;
+ continue;
+ }
+
+ case FT_CURVE_TAG_CONIC: /* consume conic arcs */
+ v_control.x = point->x;
+ v_control.y = point->y;
+
+ Do_Conic:
+ if ( point < limit )
+ {
+ FT_Vector vec;
+ FT_Vector v_middle;
+
+
+ point++;
+ tags++;
+ tag = FT_CURVE_TAG( tags[0] );
+
+ vec = point[0];
+
+ if ( tag == FT_CURVE_TAG_ON )
+ {
+ error = FT_Stroker_ConicTo( stroker, &v_control, &vec );
+ if ( error )
+ goto Exit;
+ continue;
+ }
+
+ if ( tag != FT_CURVE_TAG_CONIC )
+ goto Invalid_Outline;
+
+ v_middle.x = ( v_control.x + vec.x ) / 2;
+ v_middle.y = ( v_control.y + vec.y ) / 2;
+
+ error = FT_Stroker_ConicTo( stroker, &v_control, &v_middle );
+ if ( error )
+ goto Exit;
+
+ v_control = vec;
+ goto Do_Conic;
+ }
+
+ error = FT_Stroker_ConicTo( stroker, &v_control, &v_start );
+ goto Close;
+
+ default: /* FT_CURVE_TAG_CUBIC */
+ {
+ FT_Vector vec1, vec2;
+
+
+ if ( point + 1 > limit ||
+ FT_CURVE_TAG( tags[1] ) != FT_CURVE_TAG_CUBIC )
+ goto Invalid_Outline;
+
+ point += 2;
+ tags += 2;
+
+ vec1 = point[-2];
+ vec2 = point[-1];
+
+ if ( point <= limit )
+ {
+ FT_Vector vec;
+
+
+ vec = point[0];
+
+ error = FT_Stroker_CubicTo( stroker, &vec1, &vec2, &vec );
+ if ( error )
+ goto Exit;
+ continue;
+ }
+
+ error = FT_Stroker_CubicTo( stroker, &vec1, &vec2, &v_start );
+ goto Close;
+ }
+ }
+ }
+
+ Close:
+ if ( error )
+ goto Exit;
+
+ /* don't try to end the path if no segments have been generated */
+ if ( !stroker->first_point )
+ {
+ error = FT_Stroker_EndSubPath( stroker );
+ if ( error )
+ goto Exit;
+ }
+
+ first = last + 1;
+ }
+
+ return FT_Err_Ok;
+
+ Exit:
+ return error;
+
+ Invalid_Outline:
+ return FT_THROW( Invalid_Outline );
+ }
+
+
+ /* declare an extern to access `ft_outline_glyph_class' globally */
+ /* allocated in `ftglyph.c', and use the FT_OUTLINE_GLYPH_CLASS_GET */
+ /* macro to access it when FT_CONFIG_OPTION_PIC is defined */
+#ifndef FT_CONFIG_OPTION_PIC
+ extern const FT_Glyph_Class ft_outline_glyph_class;
+#endif
+#include "basepic.h"
+
+
+ /* documentation is in ftstroke.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Glyph_Stroke( FT_Glyph *pglyph,
+ FT_Stroker stroker,
+ FT_Bool destroy )
+ {
+ FT_Error error = FT_ERR( Invalid_Argument );
+ FT_Glyph glyph = NULL;
+ FT_Library library = stroker->library;
+
+ FT_UNUSED( library );
+
+
+ if ( pglyph == NULL )
+ goto Exit;
+
+ glyph = *pglyph;
+ if ( glyph == NULL || glyph->clazz != FT_OUTLINE_GLYPH_CLASS_GET )
+ goto Exit;
+
+ {
+ FT_Glyph copy;
+
+
+ error = FT_Glyph_Copy( glyph, &copy );
+ if ( error )
+ goto Exit;
+
+ glyph = copy;
+ }
+
+ {
+ FT_OutlineGlyph oglyph = (FT_OutlineGlyph)glyph;
+ FT_Outline* outline = &oglyph->outline;
+ FT_UInt num_points, num_contours;
+
+
+ error = FT_Stroker_ParseOutline( stroker, outline, FALSE );
+ if ( error )
+ goto Fail;
+
+ (void)FT_Stroker_GetCounts( stroker, &num_points, &num_contours );
+
+ FT_Outline_Done( glyph->library, outline );
+
+ error = FT_Outline_New( glyph->library,
+ num_points, num_contours, outline );
+ if ( error )
+ goto Fail;
+
+ outline->n_points = 0;
+ outline->n_contours = 0;
+
+ FT_Stroker_Export( stroker, outline );
+ }
+
+ if ( destroy )
+ FT_Done_Glyph( *pglyph );
+
+ *pglyph = glyph;
+ goto Exit;
+
+ Fail:
+ FT_Done_Glyph( glyph );
+ glyph = NULL;
+
+ if ( !destroy )
+ *pglyph = NULL;
+
+ Exit:
+ return error;
+ }
+
+
+ /* documentation is in ftstroke.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Glyph_StrokeBorder( FT_Glyph *pglyph,
+ FT_Stroker stroker,
+ FT_Bool inside,
+ FT_Bool destroy )
+ {
+ FT_Error error = FT_ERR( Invalid_Argument );
+ FT_Glyph glyph = NULL;
+ FT_Library library = stroker->library;
+
+ FT_UNUSED( library );
+
+
+ if ( pglyph == NULL )
+ goto Exit;
+
+ glyph = *pglyph;
+ if ( glyph == NULL || glyph->clazz != FT_OUTLINE_GLYPH_CLASS_GET )
+ goto Exit;
+
+ {
+ FT_Glyph copy;
+
+
+ error = FT_Glyph_Copy( glyph, &copy );
+ if ( error )
+ goto Exit;
+
+ glyph = copy;
+ }
+
+ {
+ FT_OutlineGlyph oglyph = (FT_OutlineGlyph)glyph;
+ FT_StrokerBorder border;
+ FT_Outline* outline = &oglyph->outline;
+ FT_UInt num_points, num_contours;
+
+
+ border = FT_Outline_GetOutsideBorder( outline );
+ if ( inside )
+ {
+ if ( border == FT_STROKER_BORDER_LEFT )
+ border = FT_STROKER_BORDER_RIGHT;
+ else
+ border = FT_STROKER_BORDER_LEFT;
+ }
+
+ error = FT_Stroker_ParseOutline( stroker, outline, FALSE );
+ if ( error )
+ goto Fail;
+
+ (void)FT_Stroker_GetBorderCounts( stroker, border,
+ &num_points, &num_contours );
+
+ FT_Outline_Done( glyph->library, outline );
+
+ error = FT_Outline_New( glyph->library,
+ num_points,
+ num_contours,
+ outline );
+ if ( error )
+ goto Fail;
+
+ outline->n_points = 0;
+ outline->n_contours = 0;
+
+ FT_Stroker_ExportBorder( stroker, border, outline );
+ }
+
+ if ( destroy )
+ FT_Done_Glyph( *pglyph );
+
+ *pglyph = glyph;
+ goto Exit;
+
+ Fail:
+ FT_Done_Glyph( glyph );
+ glyph = NULL;
+
+ if ( !destroy )
+ *pglyph = NULL;
+
+ Exit:
+ return error;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftsynth.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftsynth.c
new file mode 100644
index 0000000000..2142261bf3
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftsynth.c
@@ -0,0 +1,153 @@
+/***************************************************************************/
+/* */
+/* ftsynth.c */
+/* */
+/* FreeType synthesizing code for emboldening and slanting (body). */
+/* */
+/* Copyright 2000-2006, 2010, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/ftsynth.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/ftoutln.h"
+#include "../../include/freetype/ftbitmap.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_synth
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** EXPERIMENTAL OBLIQUING SUPPORT ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /* documentation is in ftsynth.h */
+
+ FT_EXPORT_DEF( void )
+ FT_GlyphSlot_Oblique( FT_GlyphSlot slot )
+ {
+ FT_Matrix transform;
+ FT_Outline* outline = &slot->outline;
+
+
+ /* only oblique outline glyphs */
+ if ( slot->format != FT_GLYPH_FORMAT_OUTLINE )
+ return;
+
+ /* we don't touch the advance width */
+
+ /* For italic, simply apply a shear transform, with an angle */
+ /* of about 12 degrees. */
+
+ transform.xx = 0x10000L;
+ transform.yx = 0x00000L;
+
+ transform.xy = 0x0366AL;
+ transform.yy = 0x10000L;
+
+ FT_Outline_Transform( outline, &transform );
+ }
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** EXPERIMENTAL EMBOLDENING SUPPORT ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /* documentation is in ftsynth.h */
+
+ FT_EXPORT_DEF( void )
+ FT_GlyphSlot_Embolden( FT_GlyphSlot slot )
+ {
+ FT_Library library = slot->library;
+ FT_Face face = slot->face;
+ FT_Error error;
+ FT_Pos xstr, ystr;
+
+
+ if ( slot->format != FT_GLYPH_FORMAT_OUTLINE &&
+ slot->format != FT_GLYPH_FORMAT_BITMAP )
+ return;
+
+ /* some reasonable strength */
+ xstr = FT_MulFix( face->units_per_EM,
+ face->size->metrics.y_scale ) / 24;
+ ystr = xstr;
+
+ if ( slot->format == FT_GLYPH_FORMAT_OUTLINE )
+ {
+ /* ignore error */
+ (void)FT_Outline_EmboldenXY( &slot->outline, xstr, ystr );
+ }
+ else /* slot->format == FT_GLYPH_FORMAT_BITMAP */
+ {
+ /* round to full pixels */
+ xstr &= ~63;
+ if ( xstr == 0 )
+ xstr = 1 << 6;
+ ystr &= ~63;
+
+ /*
+ * XXX: overflow check for 16-bit system, for compatibility
+ * with FT_GlyphSlot_Embolden() since freetype-2.1.10.
+ * unfortunately, this function return no informations
+ * about the cause of error.
+ */
+ if ( ( ystr >> 6 ) > FT_INT_MAX || ( ystr >> 6 ) < FT_INT_MIN )
+ {
+ FT_TRACE1(( "FT_GlyphSlot_Embolden:" ));
+ FT_TRACE1(( "too strong embolding parameter ystr=%d\n", ystr ));
+ return;
+ }
+ error = FT_GlyphSlot_Own_Bitmap( slot );
+ if ( error )
+ return;
+
+ error = FT_Bitmap_Embolden( library, &slot->bitmap, xstr, ystr );
+ if ( error )
+ return;
+ }
+
+ if ( slot->advance.x )
+ slot->advance.x += xstr;
+
+ if ( slot->advance.y )
+ slot->advance.y += ystr;
+
+ slot->metrics.width += xstr;
+ slot->metrics.height += ystr;
+ slot->metrics.horiAdvance += xstr;
+ slot->metrics.vertAdvance += ystr;
+
+ /* XXX: 16-bit overflow case must be excluded before here */
+ if ( slot->format == FT_GLYPH_FORMAT_BITMAP )
+ slot->bitmap_top += (FT_Int)( ystr >> 6 );
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fttrigon.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fttrigon.c
new file mode 100644
index 0000000000..aae71f7087
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fttrigon.c
@@ -0,0 +1,492 @@
+/***************************************************************************/
+/* */
+/* fttrigon.c */
+/* */
+/* FreeType trigonometric functions (body). */
+/* */
+/* Copyright 2001-2005, 2012-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* This is a fixed-point CORDIC implementation of trigonometric */
+ /* functions as well as transformations between Cartesian and polar */
+ /* coordinates. The angles are represented as 16.16 fixed-point values */
+ /* in degrees, i.e., the angular resolution is 2^-16 degrees. Note that */
+ /* only vectors longer than 2^16*180/pi (or at least 22 bits) on a */
+ /* discrete Cartesian grid can have the same or better angular */
+ /* resolution. Therefore, to maintain this precision, some functions */
+ /* require an interim upscaling of the vectors, whereas others operate */
+ /* with 24-bit long vectors directly. */
+ /* */
+ /*************************************************************************/
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/ftcalc.h"
+#include "../../include/freetype/fttrigon.h"
+
+
+ /* the Cordic shrink factor 0.858785336480436 * 2^32 */
+#define FT_TRIG_SCALE 0xDBD95B16UL
+
+ /* the highest bit in overflow-safe vector components, */
+ /* MSB of 0.858785336480436 * sqrt(0.5) * 2^30 */
+#define FT_TRIG_SAFE_MSB 29
+
+ /* this table was generated for FT_PI = 180L << 16, i.e. degrees */
+#define FT_TRIG_MAX_ITERS 23
+
+ static const FT_Fixed
+ ft_trig_arctan_table[] =
+ {
+ 1740967L, 919879L, 466945L, 234379L, 117304L, 58666L, 29335L,
+ 14668L, 7334L, 3667L, 1833L, 917L, 458L, 229L, 115L,
+ 57L, 29L, 14L, 7L, 4L, 2L, 1L
+ };
+
+
+#ifdef FT_LONG64
+
+ /* multiply a given value by the CORDIC shrink factor */
+ static FT_Fixed
+ ft_trig_downscale( FT_Fixed val )
+ {
+ FT_Fixed s;
+ FT_Int64 v;
+
+
+ s = val;
+ val = FT_ABS( val );
+
+ v = ( val * (FT_Int64)FT_TRIG_SCALE ) + 0x100000000UL;
+ val = (FT_Fixed)( v >> 32 );
+
+ return ( s >= 0 ) ? val : -val;
+ }
+
+#else /* !FT_LONG64 */
+
+ /* multiply a given value by the CORDIC shrink factor */
+ static FT_Fixed
+ ft_trig_downscale( FT_Fixed val )
+ {
+ FT_Fixed s;
+ FT_UInt32 v1, v2, k1, k2, hi, lo1, lo2, lo3;
+
+
+ s = val;
+ val = FT_ABS( val );
+
+ v1 = (FT_UInt32)val >> 16;
+ v2 = (FT_UInt32)( val & 0xFFFFL );
+
+ k1 = (FT_UInt32)FT_TRIG_SCALE >> 16; /* constant */
+ k2 = (FT_UInt32)( FT_TRIG_SCALE & 0xFFFFL ); /* constant */
+
+ hi = k1 * v1;
+ lo1 = k1 * v2 + k2 * v1; /* can't overflow */
+
+ lo2 = ( k2 * v2 ) >> 16;
+ lo3 = FT_MAX( lo1, lo2 );
+ lo1 += lo2;
+
+ hi += lo1 >> 16;
+ if ( lo1 < lo3 )
+ hi += (FT_UInt32)0x10000UL;
+
+ val = (FT_Fixed)hi;
+
+ return ( s >= 0 ) ? val : -val;
+ }
+
+#endif /* !FT_LONG64 */
+
+
+ static FT_Int
+ ft_trig_prenorm( FT_Vector* vec )
+ {
+ FT_Pos x, y;
+ FT_Int shift;
+
+
+ x = vec->x;
+ y = vec->y;
+
+ shift = FT_MSB( FT_ABS( x ) | FT_ABS( y ) );
+
+ if ( shift <= FT_TRIG_SAFE_MSB )
+ {
+ shift = FT_TRIG_SAFE_MSB - shift;
+ vec->x = (FT_Pos)( (FT_ULong)x << shift );
+ vec->y = (FT_Pos)( (FT_ULong)y << shift );
+ }
+ else
+ {
+ shift -= FT_TRIG_SAFE_MSB;
+ vec->x = x >> shift;
+ vec->y = y >> shift;
+ shift = -shift;
+ }
+
+ return shift;
+ }
+
+
+ static void
+ ft_trig_pseudo_rotate( FT_Vector* vec,
+ FT_Angle theta )
+ {
+ FT_Int i;
+ FT_Fixed x, y, xtemp, b;
+ const FT_Fixed *arctanptr;
+
+
+ x = vec->x;
+ y = vec->y;
+
+ /* Rotate inside [-PI/4,PI/4] sector */
+ while ( theta < -FT_ANGLE_PI4 )
+ {
+ xtemp = y;
+ y = -x;
+ x = xtemp;
+ theta += FT_ANGLE_PI2;
+ }
+
+ while ( theta > FT_ANGLE_PI4 )
+ {
+ xtemp = -y;
+ y = x;
+ x = xtemp;
+ theta -= FT_ANGLE_PI2;
+ }
+
+ arctanptr = ft_trig_arctan_table;
+
+ /* Pseudorotations, with right shifts */
+ for ( i = 1, b = 1; i < FT_TRIG_MAX_ITERS; b <<= 1, i++ )
+ {
+ if ( theta < 0 )
+ {
+ xtemp = x + ( ( y + b ) >> i );
+ y = y - ( ( x + b ) >> i );
+ x = xtemp;
+ theta += *arctanptr++;
+ }
+ else
+ {
+ xtemp = x - ( ( y + b ) >> i );
+ y = y + ( ( x + b ) >> i );
+ x = xtemp;
+ theta -= *arctanptr++;
+ }
+ }
+
+ vec->x = x;
+ vec->y = y;
+ }
+
+
+ static void
+ ft_trig_pseudo_polarize( FT_Vector* vec )
+ {
+ FT_Angle theta;
+ FT_Int i;
+ FT_Fixed x, y, xtemp, b;
+ const FT_Fixed *arctanptr;
+
+
+ x = vec->x;
+ y = vec->y;
+
+ /* Get the vector into [-PI/4,PI/4] sector */
+ if ( y > x )
+ {
+ if ( y > -x )
+ {
+ theta = FT_ANGLE_PI2;
+ xtemp = y;
+ y = -x;
+ x = xtemp;
+ }
+ else
+ {
+ theta = y > 0 ? FT_ANGLE_PI : -FT_ANGLE_PI;
+ x = -x;
+ y = -y;
+ }
+ }
+ else
+ {
+ if ( y < -x )
+ {
+ theta = -FT_ANGLE_PI2;
+ xtemp = -y;
+ y = x;
+ x = xtemp;
+ }
+ else
+ {
+ theta = 0;
+ }
+ }
+
+ arctanptr = ft_trig_arctan_table;
+
+ /* Pseudorotations, with right shifts */
+ for ( i = 1, b = 1; i < FT_TRIG_MAX_ITERS; b <<= 1, i++ )
+ {
+ if ( y > 0 )
+ {
+ xtemp = x + ( ( y + b ) >> i );
+ y = y - ( ( x + b ) >> i );
+ x = xtemp;
+ theta += *arctanptr++;
+ }
+ else
+ {
+ xtemp = x - ( ( y + b ) >> i );
+ y = y + ( ( x + b ) >> i );
+ x = xtemp;
+ theta -= *arctanptr++;
+ }
+ }
+
+ /* round theta */
+ if ( theta >= 0 )
+ theta = FT_PAD_ROUND( theta, 32 );
+ else
+ theta = -FT_PAD_ROUND( -theta, 32 );
+
+ vec->x = x;
+ vec->y = theta;
+ }
+
+
+ /* documentation is in fttrigon.h */
+
+ FT_EXPORT_DEF( FT_Fixed )
+ FT_Cos( FT_Angle angle )
+ {
+ FT_Vector v;
+
+
+ v.x = FT_TRIG_SCALE >> 8;
+ v.y = 0;
+ ft_trig_pseudo_rotate( &v, angle );
+
+ return ( v.x + 0x80L ) >> 8;
+ }
+
+
+ /* documentation is in fttrigon.h */
+
+ FT_EXPORT_DEF( FT_Fixed )
+ FT_Sin( FT_Angle angle )
+ {
+ return FT_Cos( FT_ANGLE_PI2 - angle );
+ }
+
+
+ /* documentation is in fttrigon.h */
+
+ FT_EXPORT_DEF( FT_Fixed )
+ FT_Tan( FT_Angle angle )
+ {
+ FT_Vector v;
+
+
+ v.x = FT_TRIG_SCALE >> 8;
+ v.y = 0;
+ ft_trig_pseudo_rotate( &v, angle );
+
+ return FT_DivFix( v.y, v.x );
+ }
+
+
+ /* documentation is in fttrigon.h */
+
+ FT_EXPORT_DEF( FT_Angle )
+ FT_Atan2( FT_Fixed dx,
+ FT_Fixed dy )
+ {
+ FT_Vector v;
+
+
+ if ( dx == 0 && dy == 0 )
+ return 0;
+
+ v.x = dx;
+ v.y = dy;
+ ft_trig_prenorm( &v );
+ ft_trig_pseudo_polarize( &v );
+
+ return v.y;
+ }
+
+
+ /* documentation is in fttrigon.h */
+
+ FT_EXPORT_DEF( void )
+ FT_Vector_Unit( FT_Vector* vec,
+ FT_Angle angle )
+ {
+ vec->x = FT_TRIG_SCALE >> 8;
+ vec->y = 0;
+ ft_trig_pseudo_rotate( vec, angle );
+ vec->x = ( vec->x + 0x80L ) >> 8;
+ vec->y = ( vec->y + 0x80L ) >> 8;
+ }
+
+
+ /* these macros return 0 for positive numbers,
+ and -1 for negative ones */
+#define FT_SIGN_LONG( x ) ( (x) >> ( FT_SIZEOF_LONG * 8 - 1 ) )
+#define FT_SIGN_INT( x ) ( (x) >> ( FT_SIZEOF_INT * 8 - 1 ) )
+#define FT_SIGN_INT32( x ) ( (x) >> 31 )
+#define FT_SIGN_INT16( x ) ( (x) >> 15 )
+
+
+ /* documentation is in fttrigon.h */
+
+ FT_EXPORT_DEF( void )
+ FT_Vector_Rotate( FT_Vector* vec,
+ FT_Angle angle )
+ {
+ FT_Int shift;
+ FT_Vector v;
+
+
+ v.x = vec->x;
+ v.y = vec->y;
+
+ if ( angle && ( v.x != 0 || v.y != 0 ) )
+ {
+ shift = ft_trig_prenorm( &v );
+ ft_trig_pseudo_rotate( &v, angle );
+ v.x = ft_trig_downscale( v.x );
+ v.y = ft_trig_downscale( v.y );
+
+ if ( shift > 0 )
+ {
+ FT_Int32 half = (FT_Int32)1L << ( shift - 1 );
+
+
+ vec->x = ( v.x + half + FT_SIGN_LONG( v.x ) ) >> shift;
+ vec->y = ( v.y + half + FT_SIGN_LONG( v.y ) ) >> shift;
+ }
+ else
+ {
+ shift = -shift;
+ vec->x = (FT_Pos)( (FT_ULong)v.x << shift );
+ vec->y = (FT_Pos)( (FT_ULong)v.y << shift );
+ }
+ }
+ }
+
+
+ /* documentation is in fttrigon.h */
+
+ FT_EXPORT_DEF( FT_Fixed )
+ FT_Vector_Length( FT_Vector* vec )
+ {
+ FT_Int shift;
+ FT_Vector v;
+
+
+ v = *vec;
+
+ /* handle trivial cases */
+ if ( v.x == 0 )
+ {
+ return FT_ABS( v.y );
+ }
+ else if ( v.y == 0 )
+ {
+ return FT_ABS( v.x );
+ }
+
+ /* general case */
+ shift = ft_trig_prenorm( &v );
+ ft_trig_pseudo_polarize( &v );
+
+ v.x = ft_trig_downscale( v.x );
+
+ if ( shift > 0 )
+ return ( v.x + ( 1 << ( shift - 1 ) ) ) >> shift;
+
+ return (FT_Fixed)( (FT_UInt32)v.x << -shift );
+ }
+
+
+ /* documentation is in fttrigon.h */
+
+ FT_EXPORT_DEF( void )
+ FT_Vector_Polarize( FT_Vector* vec,
+ FT_Fixed *length,
+ FT_Angle *angle )
+ {
+ FT_Int shift;
+ FT_Vector v;
+
+
+ v = *vec;
+
+ if ( v.x == 0 && v.y == 0 )
+ return;
+
+ shift = ft_trig_prenorm( &v );
+ ft_trig_pseudo_polarize( &v );
+
+ v.x = ft_trig_downscale( v.x );
+
+ *length = ( shift >= 0 ) ? ( v.x >> shift )
+ : (FT_Fixed)( (FT_UInt32)v.x << -shift );
+ *angle = v.y;
+ }
+
+
+ /* documentation is in fttrigon.h */
+
+ FT_EXPORT_DEF( void )
+ FT_Vector_From_Polar( FT_Vector* vec,
+ FT_Fixed length,
+ FT_Angle angle )
+ {
+ vec->x = length;
+ vec->y = 0;
+
+ FT_Vector_Rotate( vec, angle );
+ }
+
+
+ /* documentation is in fttrigon.h */
+
+ FT_EXPORT_DEF( FT_Angle )
+ FT_Angle_Diff( FT_Angle angle1,
+ FT_Angle angle2 )
+ {
+ FT_Angle delta = angle2 - angle1;
+
+
+ delta %= FT_ANGLE_2PI;
+ if ( delta < 0 )
+ delta += FT_ANGLE_2PI;
+
+ if ( delta > FT_ANGLE_PI )
+ delta -= FT_ANGLE_2PI;
+
+ return delta;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fttype1.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fttype1.c
new file mode 100644
index 0000000000..b7167b75b5
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fttype1.c
@@ -0,0 +1,120 @@
+/***************************************************************************/
+/* */
+/* fttype1.c */
+/* */
+/* FreeType utility file for PS names support (body). */
+/* */
+/* Copyright 2002-2004, 2011 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/ftserv.h"
+#include "../../include/freetype/internal/services/svpsinfo.h"
+
+
+ /* documentation is in t1tables.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Get_PS_Font_Info( FT_Face face,
+ PS_FontInfoRec* afont_info )
+ {
+ FT_Error error = FT_ERR( Invalid_Argument );
+
+
+ if ( face )
+ {
+ FT_Service_PsInfo service = NULL;
+
+
+ FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO );
+
+ if ( service && service->ps_get_font_info )
+ error = service->ps_get_font_info( face, afont_info );
+ }
+
+ return error;
+ }
+
+
+ /* documentation is in t1tables.h */
+
+ FT_EXPORT_DEF( FT_Int )
+ FT_Has_PS_Glyph_Names( FT_Face face )
+ {
+ FT_Int result = 0;
+ FT_Service_PsInfo service = NULL;
+
+
+ if ( face )
+ {
+ FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO );
+
+ if ( service && service->ps_has_glyph_names )
+ result = service->ps_has_glyph_names( face );
+ }
+
+ return result;
+ }
+
+
+ /* documentation is in t1tables.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Get_PS_Font_Private( FT_Face face,
+ PS_PrivateRec* afont_private )
+ {
+ FT_Error error = FT_ERR( Invalid_Argument );
+
+
+ if ( face )
+ {
+ FT_Service_PsInfo service = NULL;
+
+
+ FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO );
+
+ if ( service && service->ps_get_font_private )
+ error = service->ps_get_font_private( face, afont_private );
+ }
+
+ return error;
+ }
+
+
+ /* documentation is in t1tables.h */
+
+ FT_EXPORT_DEF( FT_Long )
+ FT_Get_PS_Font_Value( FT_Face face,
+ PS_Dict_Keys key,
+ FT_UInt idx,
+ void *value,
+ FT_Long value_len )
+ {
+ FT_Int result = 0;
+ FT_Service_PsInfo service = NULL;
+
+
+ if ( face )
+ {
+ FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO );
+
+ if ( service && service->ps_get_font_value )
+ result = service->ps_get_font_value( face, key, idx,
+ value, value_len );
+ }
+
+ return result;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftutil.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftutil.c
new file mode 100644
index 0000000000..4c0b916fe1
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftutil.c
@@ -0,0 +1,548 @@
+/***************************************************************************/
+/* */
+/* ftutil.c */
+/* */
+/* FreeType utility file for memory and list management (body). */
+/* */
+/* Copyright 2002, 2004-2007, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftmemory.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/ftlist.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_memory
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** *****/
+ /***** M E M O R Y M A N A G E M E N T *****/
+ /***** *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ FT_BASE_DEF( FT_Pointer )
+ ft_mem_alloc( FT_Memory memory,
+ FT_Long size,
+ FT_Error *p_error )
+ {
+ FT_Error error;
+ FT_Pointer block = ft_mem_qalloc( memory, size, &error );
+
+ if ( !error && size > 0 )
+ FT_MEM_ZERO( block, size );
+
+ *p_error = error;
+ return block;
+ }
+
+
+ FT_BASE_DEF( FT_Pointer )
+ ft_mem_qalloc( FT_Memory memory,
+ FT_Long size,
+ FT_Error *p_error )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_Pointer block = NULL;
+
+
+ if ( size > 0 )
+ {
+ block = memory->alloc( memory, size );
+ if ( block == NULL )
+ error = FT_THROW( Out_Of_Memory );
+ }
+ else if ( size < 0 )
+ {
+ /* may help catch/prevent security issues */
+ error = FT_THROW( Invalid_Argument );
+ }
+
+ *p_error = error;
+ return block;
+ }
+
+
+ FT_BASE_DEF( FT_Pointer )
+ ft_mem_realloc( FT_Memory memory,
+ FT_Long item_size,
+ FT_Long cur_count,
+ FT_Long new_count,
+ void* block,
+ FT_Error *p_error )
+ {
+ FT_Error error = FT_Err_Ok;
+
+
+ block = ft_mem_qrealloc( memory, item_size,
+ cur_count, new_count, block, &error );
+ if ( !error && new_count > cur_count )
+ FT_MEM_ZERO( (char*)block + cur_count * item_size,
+ ( new_count - cur_count ) * item_size );
+
+ *p_error = error;
+ return block;
+ }
+
+
+ FT_BASE_DEF( FT_Pointer )
+ ft_mem_qrealloc( FT_Memory memory,
+ FT_Long item_size,
+ FT_Long cur_count,
+ FT_Long new_count,
+ void* block,
+ FT_Error *p_error )
+ {
+ FT_Error error = FT_Err_Ok;
+
+
+ /* Note that we now accept `item_size == 0' as a valid parameter, in
+ * order to cover very weird cases where an ALLOC_MULT macro would be
+ * called.
+ */
+ if ( cur_count < 0 || new_count < 0 || item_size < 0 )
+ {
+ /* may help catch/prevent nasty security issues */
+ error = FT_THROW( Invalid_Argument );
+ }
+ else if ( new_count == 0 || item_size == 0 )
+ {
+ ft_mem_free( memory, block );
+ block = NULL;
+ }
+ else if ( new_count > FT_INT_MAX/item_size )
+ {
+ error = FT_THROW( Array_Too_Large );
+ }
+ else if ( cur_count == 0 )
+ {
+ FT_ASSERT( block == NULL );
+
+ block = ft_mem_alloc( memory, new_count*item_size, &error );
+ }
+ else
+ {
+ FT_Pointer block2;
+ FT_Long cur_size = cur_count*item_size;
+ FT_Long new_size = new_count*item_size;
+
+
+ block2 = memory->realloc( memory, cur_size, new_size, block );
+ if ( block2 == NULL )
+ error = FT_THROW( Out_Of_Memory );
+ else
+ block = block2;
+ }
+
+ *p_error = error;
+ return block;
+ }
+
+ #ifdef _XYQ_MEM_DEBUG /** XYQ 2006-10-12 */
+ FT_BASE_DEF( FT_Pointer )
+ ft_mem_allocdebug( FT_Memory memory,
+ FT_Long size, const char* file, int line,
+ FT_Error *p_error )
+ {
+ FT_Error error;
+ FT_Pointer block = ft_mem_qallocdebug( memory, size, file, line, &error );
+
+ if ( !error && size > 0 )
+ FT_MEM_ZERO( block, size );
+
+ *p_error = error;
+ return block;
+ }
+
+
+ FT_BASE_DEF( FT_Pointer )
+ ft_mem_qallocdebug( FT_Memory memory,
+ FT_Long size, const char* file, int line,
+ FT_Error *p_error )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_Pointer block = NULL;
+
+
+ if ( size > 0 )
+ {
+ block = memory->allocdebug( memory, size, file, line );
+ if ( block == NULL )
+ error = FT_Err_Out_Of_Memory;
+ }
+ else if ( size < 0 )
+ {
+ /* may help catch/prevent security issues */
+ error = FT_Err_Invalid_Argument;
+ }
+
+ *p_error = error;
+ return block;
+ }
+
+
+ FT_BASE_DEF( FT_Pointer )
+ ft_mem_reallocdebug( FT_Memory memory,
+ FT_Long item_size,
+ FT_Long cur_count,
+ FT_Long new_count,
+ void* block, const char* file, int line,
+ FT_Error *p_error )
+ {
+ FT_Error error = FT_Err_Ok;
+
+ block = ft_mem_qreallocdebug( memory, item_size,
+ cur_count, new_count, block, file, line, &error );
+ if ( !error && new_count > cur_count )
+ FT_MEM_ZERO( (char*)block + cur_count * item_size,
+ ( new_count - cur_count ) * item_size );
+
+ *p_error = error;
+ return block;
+ }
+
+
+ FT_BASE_DEF( FT_Pointer )
+ ft_mem_qreallocdebug( FT_Memory memory,
+ FT_Long item_size,
+ FT_Long cur_count,
+ FT_Long new_count,
+ void* block, const char* file, int line,
+ FT_Error *p_error )
+ {
+ FT_Error error = FT_Err_Ok;
+
+
+ if ( cur_count < 0 || new_count < 0 || item_size <= 0 )
+ {
+ /* may help catch/prevent nasty security issues */
+ error = FT_Err_Invalid_Argument;
+ }
+ else if ( new_count == 0 )
+ {
+ ft_mem_free( memory, block );
+ block = NULL;
+ }
+ else if ( new_count > FT_INT_MAX/item_size )
+ {
+ error = FT_Err_Array_Too_Large;
+ }
+ else if ( cur_count == 0 )
+ {
+ FT_ASSERT( block == NULL );
+
+ block = ft_mem_allocdebug( memory, new_count*item_size, file, line, &error );
+ }
+ else
+ {
+ FT_Pointer block2;
+ FT_Long cur_size = cur_count*item_size;
+ FT_Long new_size = new_count*item_size;
+
+
+ block2 = memory->realloc( memory, cur_size, new_size, block );
+ if ( block2 == NULL )
+ error = FT_Err_Out_Of_Memory;
+ else
+ block = block2;
+ }
+
+ *p_error = error;
+ return block;
+ }
+#endif
+ FT_BASE_DEF( void )
+ ft_mem_free( FT_Memory memory,
+ const void *P )
+ {
+ if ( P )
+ memory->free( memory, (void*)P );
+ }
+
+
+ FT_BASE_DEF( FT_Pointer )
+ ft_mem_dup( FT_Memory memory,
+ const void* address,
+ FT_ULong size,
+ FT_Error *p_error )
+ {
+ FT_Error error;
+ FT_Pointer p = ft_mem_qalloc( memory, size, &error );
+
+
+ if ( !error && address )
+ ft_memcpy( p, address, size );
+
+ *p_error = error;
+ return p;
+ }
+
+
+ FT_BASE_DEF( FT_Pointer )
+ ft_mem_strdup( FT_Memory memory,
+ const char* str,
+ FT_Error *p_error )
+ {
+ FT_ULong len = str ? (FT_ULong)ft_strlen( str ) + 1
+ : 0;
+
+
+ return ft_mem_dup( memory, str, len, p_error );
+ }
+
+
+ FT_BASE_DEF( FT_Int )
+ ft_mem_strcpyn( char* dst,
+ const char* src,
+ FT_ULong size )
+ {
+ while ( size > 1 && *src != 0 )
+ {
+ *dst++ = *src++;
+ size--;
+ }
+
+ *dst = 0; /* always zero-terminate */
+
+ return *src != 0;
+ }
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** *****/
+ /***** D O U B L Y L I N K E D L I S T S *****/
+ /***** *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_list
+
+ /* documentation is in ftlist.h */
+
+ FT_EXPORT_DEF( FT_ListNode )
+ FT_List_Find( FT_List list,
+ void* data )
+ {
+ FT_ListNode cur;
+
+
+ cur = list->head;
+ while ( cur )
+ {
+ if ( cur->data == data )
+ return cur;
+
+ cur = cur->next;
+ }
+
+ return (FT_ListNode)0;
+ }
+
+
+ /* documentation is in ftlist.h */
+
+ FT_EXPORT_DEF( void )
+ FT_List_Add( FT_List list,
+ FT_ListNode node )
+ {
+ FT_ListNode before = list->tail;
+
+
+ node->next = 0;
+ node->prev = before;
+
+ if ( before )
+ before->next = node;
+ else
+ list->head = node;
+
+ list->tail = node;
+ }
+
+
+ /* documentation is in ftlist.h */
+
+ FT_EXPORT_DEF( void )
+ FT_List_Insert( FT_List list,
+ FT_ListNode node )
+ {
+ FT_ListNode after = list->head;
+
+
+ node->next = after;
+ node->prev = 0;
+
+ if ( !after )
+ list->tail = node;
+ else
+ after->prev = node;
+
+ list->head = node;
+ }
+
+
+ /* documentation is in ftlist.h */
+
+ FT_EXPORT_DEF( void )
+ FT_List_Remove( FT_List list,
+ FT_ListNode node )
+ {
+ FT_ListNode before, after;
+
+
+ before = node->prev;
+ after = node->next;
+
+ if ( before )
+ before->next = after;
+ else
+ list->head = after;
+
+ if ( after )
+ after->prev = before;
+ else
+ list->tail = before;
+ }
+
+
+ /* documentation is in ftlist.h */
+
+ FT_EXPORT_DEF( void )
+ FT_List_Up( FT_List list,
+ FT_ListNode node )
+ {
+ FT_ListNode before, after;
+
+
+ before = node->prev;
+ after = node->next;
+
+ /* check whether we are already on top of the list */
+ if ( !before )
+ return;
+
+ before->next = after;
+
+ if ( after )
+ after->prev = before;
+ else
+ list->tail = before;
+
+ node->prev = 0;
+ node->next = list->head;
+ list->head->prev = node;
+ list->head = node;
+ }
+
+
+ /* documentation is in ftlist.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_List_Iterate( FT_List list,
+ FT_List_Iterator iterator,
+ void* user )
+ {
+ FT_ListNode cur = list->head;
+ FT_Error error = FT_Err_Ok;
+
+
+ while ( cur )
+ {
+ FT_ListNode next = cur->next;
+
+
+ error = iterator( cur, user );
+ if ( error )
+ break;
+
+ cur = next;
+ }
+
+ return error;
+ }
+
+
+ /* documentation is in ftlist.h */
+
+ FT_EXPORT_DEF( void )
+ FT_List_Finalize( FT_List list,
+ FT_List_Destructor destroy,
+ FT_Memory memory,
+ void* user )
+ {
+ FT_ListNode cur;
+
+
+ cur = list->head;
+ while ( cur )
+ {
+ FT_ListNode next = cur->next;
+ void* data = cur->data;
+
+
+ if ( destroy )
+ destroy( memory, data, user );
+
+ FT_FREE( cur );
+ cur = next;
+ }
+
+ list->head = 0;
+ list->tail = 0;
+ }
+
+
+ FT_BASE_DEF( FT_UInt32 )
+ ft_highpow2( FT_UInt32 value )
+ {
+ FT_UInt32 value2;
+
+
+ /*
+ * We simply clear the lowest bit in each iteration. When
+ * we reach 0, we know that the previous value was our result.
+ */
+ for ( ;; )
+ {
+ value2 = value & (value - 1); /* clear lowest bit */
+ if ( value2 == 0 )
+ break;
+
+ value = value2;
+ }
+ return value;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftwinfnt.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftwinfnt.c
new file mode 100644
index 0000000000..d5b81baf97
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftwinfnt.c
@@ -0,0 +1,51 @@
+/***************************************************************************/
+/* */
+/* ftwinfnt.c */
+/* */
+/* FreeType API for accessing Windows FNT specific info (body). */
+/* */
+/* Copyright 2003, 2004 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/ftwinfnt.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/services/svwinfnt.h"
+
+
+ /* documentation is in ftwinfnt.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Get_WinFNT_Header( FT_Face face,
+ FT_WinFNT_HeaderRec *header )
+ {
+ FT_Service_WinFnt service;
+ FT_Error error;
+
+
+ error = FT_ERR( Invalid_Argument );
+
+ if ( face != NULL )
+ {
+ FT_FACE_LOOKUP_SERVICE( face, service, WINFNT );
+
+ if ( service != NULL )
+ {
+ error = service->get_header( face, header );
+ }
+ }
+
+ return error;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftxf86.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftxf86.c
new file mode 100644
index 0000000000..229f29b559
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/ftxf86.c
@@ -0,0 +1,40 @@
+/***************************************************************************/
+/* */
+/* ftxf86.c */
+/* */
+/* FreeType utility file for X11 support (body). */
+/* */
+/* Copyright 2002, 2003, 2004 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/ftxf86.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/services/svxf86nm.h"
+
+
+ /* documentation is in ftxf86.h */
+
+ FT_EXPORT_DEF( const char* )
+ FT_Get_X11_Font_Format( FT_Face face )
+ {
+ const char* result = NULL;
+
+
+ if ( face )
+ FT_FACE_FIND_SERVICE( face, result, XF86_NAME );
+
+ return result;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftbase.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftbase.c
new file mode 100644
index 0000000000..239223a717
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftbase.c
@@ -0,0 +1,44 @@
+#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501
+/***************************************************************************/
+/* */
+/* ftbase.c */
+/* */
+/* Single object library component (body only). */
+/* */
+/* Copyright 1996-2001, 2002, 2003, 2004, 2006, 2007, 2008, 2009 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+#define FT2_BUILD_LIBRARY
+#include "../../include/ft2build.h"
+
+#define FT_MAKE_OPTION_SINGLE_OBJECT
+
+#include "ftpic.c"
+#include "basepic.c"
+#include "ftadvanc.c"
+#include "ftcalc.c"
+#include "ftdbgmem.c"
+#include "ftgloadr.c"
+#include "ftobjs.c"
+#include "ftoutln.c"
+#include "ftrfork.c"
+#include "ftsnames.c"
+#include "ftstream.c"
+#include "fttrigon.c"
+#include "ftutil.c"
+#include "ftxf86.c"
+
+#if defined( FT_MACINTOSH ) && !defined ( DARWIN_NO_CARBON )
+/*#include "ftmac.c"*/
+#endif
+
+/* END */
+#endif
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftbitmap.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftbitmap.c
new file mode 100644
index 0000000000..7f1ef189dc
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftbitmap.c
@@ -0,0 +1,760 @@
+#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501
+/***************************************************************************/
+/* */
+/* ftbitmap.c */
+/* */
+/* FreeType utility functions for bitmaps (body). */
+/* */
+/* Copyright 2004-2009, 2011, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+#define FT2_BUILD_LIBRARY
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/ftbitmap.h"
+#include "../../include/freetype/ftimage.h"
+#include "../../include/freetype/internal/ftobjs.h"
+
+
+ static
+ const FT_Bitmap null_bitmap = { 0, 0, 0, 0, 0, 0, 0, 0 };
+
+
+ /* documentation is in ftbitmap.h */
+
+ FT_EXPORT_DEF( void )
+ FT_Bitmap_New( FT_Bitmap *abitmap )
+ {
+ *abitmap = null_bitmap;
+ }
+
+
+ /* documentation is in ftbitmap.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Bitmap_Copy( FT_Library library,
+ const FT_Bitmap *source,
+ FT_Bitmap *target)
+ {
+ FT_Memory memory = library->memory;
+ FT_Error error = FT_Err_Ok;
+ FT_Int pitch = source->pitch;
+ FT_ULong size;
+
+
+ if ( source == target )
+ return FT_Err_Ok;
+
+ if ( source->buffer == NULL )
+ {
+ *target = *source;
+
+ return FT_Err_Ok;
+ }
+
+ if ( pitch < 0 )
+ pitch = -pitch;
+ size = (FT_ULong)( pitch * source->rows );
+
+ if ( target->buffer )
+ {
+ FT_Int target_pitch = target->pitch;
+ FT_ULong target_size;
+
+
+ if ( target_pitch < 0 )
+ target_pitch = -target_pitch;
+ target_size = (FT_ULong)( target_pitch * target->rows );
+
+ if ( target_size != size )
+ (void)FT_QREALLOC( target->buffer, target_size, size );
+ }
+ else
+ (void)FT_QALLOC( target->buffer, size );
+
+ if ( !error )
+ {
+ unsigned char *p;
+
+
+ p = target->buffer;
+ *target = *source;
+ target->buffer = p;
+
+ FT_MEM_COPY( target->buffer, source->buffer, size );
+ }
+
+ return error;
+ }
+
+
+ static FT_Error
+ ft_bitmap_assure_buffer( FT_Memory memory,
+ FT_Bitmap* bitmap,
+ FT_UInt xpixels,
+ FT_UInt ypixels )
+ {
+ FT_Error error;
+ int pitch;
+ int new_pitch;
+ FT_UInt bpp;
+ FT_Int i, width, height;
+ unsigned char* buffer = NULL;
+
+
+ width = bitmap->width;
+ height = bitmap->rows;
+ pitch = bitmap->pitch;
+ if ( pitch < 0 )
+ pitch = -pitch;
+
+ switch ( bitmap->pixel_mode )
+ {
+ case FT_PIXEL_MODE_MONO:
+ bpp = 1;
+ new_pitch = ( width + xpixels + 7 ) >> 3;
+ break;
+ case FT_PIXEL_MODE_GRAY2:
+ bpp = 2;
+ new_pitch = ( width + xpixels + 3 ) >> 2;
+ break;
+ case FT_PIXEL_MODE_GRAY4:
+ bpp = 4;
+ new_pitch = ( width + xpixels + 1 ) >> 1;
+ break;
+ case FT_PIXEL_MODE_GRAY:
+ case FT_PIXEL_MODE_LCD:
+ case FT_PIXEL_MODE_LCD_V:
+ bpp = 8;
+ new_pitch = ( width + xpixels );
+ break;
+ default:
+ return FT_THROW( Invalid_Glyph_Format );
+ }
+
+ /* if no need to allocate memory */
+ if ( ypixels == 0 && new_pitch <= pitch )
+ {
+ /* zero the padding */
+ FT_Int bit_width = pitch * 8;
+ FT_Int bit_last = ( width + xpixels ) * bpp;
+
+
+ if ( bit_last < bit_width )
+ {
+ FT_Byte* line = bitmap->buffer + ( bit_last >> 3 );
+ FT_Byte* end = bitmap->buffer + pitch;
+ FT_Int shift = bit_last & 7;
+ FT_UInt mask = 0xFF00U >> shift;
+ FT_Int count = height;
+
+
+ for ( ; count > 0; count--, line += pitch, end += pitch )
+ {
+ FT_Byte* write = line;
+
+
+ if ( shift > 0 )
+ {
+ write[0] = (FT_Byte)( write[0] & mask );
+ write++;
+ }
+ if ( write < end )
+ FT_MEM_ZERO( write, end-write );
+ }
+ }
+
+ return FT_Err_Ok;
+ }
+
+ if ( FT_QALLOC_MULT( buffer, new_pitch, bitmap->rows + ypixels ) )
+ return error;
+
+ if ( bitmap->pitch > 0 )
+ {
+ FT_Int len = ( width * bpp + 7 ) >> 3;
+
+
+ for ( i = 0; i < bitmap->rows; i++ )
+ FT_MEM_COPY( buffer + new_pitch * ( ypixels + i ),
+ bitmap->buffer + pitch * i, len );
+ }
+ else
+ {
+ FT_Int len = ( width * bpp + 7 ) >> 3;
+
+
+ for ( i = 0; i < bitmap->rows; i++ )
+ FT_MEM_COPY( buffer + new_pitch * i,
+ bitmap->buffer + pitch * i, len );
+ }
+
+ FT_FREE( bitmap->buffer );
+ bitmap->buffer = buffer;
+
+ if ( bitmap->pitch < 0 )
+ new_pitch = -new_pitch;
+
+ /* set pitch only, width and height are left untouched */
+ bitmap->pitch = new_pitch;
+
+ return FT_Err_Ok;
+ }
+
+
+ /* documentation is in ftbitmap.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Bitmap_Embolden( FT_Library library,
+ FT_Bitmap* bitmap,
+ FT_Pos xStrength,
+ FT_Pos yStrength )
+ {
+ FT_Error error;
+ unsigned char* p;
+ FT_Int i, x, y, pitch;
+ FT_Int xstr, ystr;
+
+
+ if ( !library )
+ return FT_THROW( Invalid_Library_Handle );
+
+ if ( !bitmap || !bitmap->buffer )
+ return FT_THROW( Invalid_Argument );
+
+ if ( ( ( FT_PIX_ROUND( xStrength ) >> 6 ) > FT_INT_MAX ) ||
+ ( ( FT_PIX_ROUND( yStrength ) >> 6 ) > FT_INT_MAX ) )
+ return FT_THROW( Invalid_Argument );
+
+ xstr = (FT_Int)FT_PIX_ROUND( xStrength ) >> 6;
+ ystr = (FT_Int)FT_PIX_ROUND( yStrength ) >> 6;
+
+ if ( xstr == 0 && ystr == 0 )
+ return FT_Err_Ok;
+ else if ( xstr < 0 || ystr < 0 )
+ return FT_THROW( Invalid_Argument );
+
+ switch ( bitmap->pixel_mode )
+ {
+ case FT_PIXEL_MODE_GRAY2:
+ case FT_PIXEL_MODE_GRAY4:
+ {
+ FT_Bitmap tmp;
+ FT_Int align;
+
+
+ if ( bitmap->pixel_mode == FT_PIXEL_MODE_GRAY2 )
+ align = ( bitmap->width + xstr + 3 ) / 4;
+ else
+ align = ( bitmap->width + xstr + 1 ) / 2;
+
+ FT_Bitmap_New( &tmp );
+
+ error = FT_Bitmap_Convert( library, bitmap, &tmp, align );
+ if ( error )
+ return error;
+
+ FT_Bitmap_Done( library, bitmap );
+ *bitmap = tmp;
+ }
+ break;
+
+ case FT_PIXEL_MODE_MONO:
+ if ( xstr > 8 )
+ xstr = 8;
+ break;
+
+ case FT_PIXEL_MODE_LCD:
+ xstr *= 3;
+ break;
+
+ case FT_PIXEL_MODE_LCD_V:
+ ystr *= 3;
+ break;
+
+ case FT_PIXEL_MODE_BGRA:
+ /* We don't embolden color glyphs. */
+ return FT_Err_Ok;
+ }
+
+ error = ft_bitmap_assure_buffer( library->memory, bitmap, xstr, ystr );
+ if ( error )
+ return error;
+
+ pitch = bitmap->pitch;
+ if ( pitch > 0 )
+ p = bitmap->buffer + pitch * ystr;
+ else
+ {
+ pitch = -pitch;
+ p = bitmap->buffer + pitch * ( bitmap->rows - 1 );
+ }
+
+ /* for each row */
+ for ( y = 0; y < bitmap->rows ; y++ )
+ {
+ /*
+ * Horizontally:
+ *
+ * From the last pixel on, make each pixel or'ed with the
+ * `xstr' pixels before it.
+ */
+ for ( x = pitch - 1; x >= 0; x-- )
+ {
+ unsigned char tmp;
+
+
+ tmp = p[x];
+ for ( i = 1; i <= xstr; i++ )
+ {
+ if ( bitmap->pixel_mode == FT_PIXEL_MODE_MONO )
+ {
+ p[x] |= tmp >> i;
+
+ /* the maximum value of 8 for `xstr' comes from here */
+ if ( x > 0 )
+ p[x] |= p[x - 1] << ( 8 - i );
+
+#if 0
+ if ( p[x] == 0xff )
+ break;
+#endif
+ }
+ else
+ {
+ if ( x - i >= 0 )
+ {
+ if ( p[x] + p[x - i] > bitmap->num_grays - 1 )
+ {
+ p[x] = (unsigned char)(bitmap->num_grays - 1);
+ break;
+ }
+ else
+ {
+ p[x] = (unsigned char)(p[x] + p[x-i]);
+ if ( p[x] == bitmap->num_grays - 1 )
+ break;
+ }
+ }
+ else
+ break;
+ }
+ }
+ }
+
+ /*
+ * Vertically:
+ *
+ * Make the above `ystr' rows or'ed with it.
+ */
+ for ( x = 1; x <= ystr; x++ )
+ {
+ unsigned char* q;
+
+
+ q = p - bitmap->pitch * x;
+ for ( i = 0; i < pitch; i++ )
+ q[i] |= p[i];
+ }
+
+ p += bitmap->pitch;
+ }
+
+ bitmap->width += xstr;
+ bitmap->rows += ystr;
+
+ return FT_Err_Ok;
+ }
+
+
+ FT_Byte
+ ft_gray_for_premultiplied_srgb_bgra( const FT_Byte* bgra )
+ {
+ FT_Long a = bgra[3];
+ FT_Long b = bgra[0];
+ FT_Long g = bgra[1];
+ FT_Long r = bgra[2];
+ FT_Long l;
+
+
+ /*
+ * Luminosity for sRGB is defined using ~0.2126,0.7152,0.0722
+ * coefficients for RGB channels *on the linear colors*.
+ * A gamma of 2.2 is fair to assume. And then, we need to
+ * undo the premultiplication too.
+ *
+ * http://accessibility.kde.org/hsl-adjusted.php
+ *
+ * We do the computation with integers only.
+ */
+
+ /* Undo premultification, get the number in a 16.16 form. */
+ b = FT_MulDiv( b, 65536, a );
+ g = FT_MulDiv( g, 65536, a );
+ r = FT_MulDiv( r, 65536, a );
+ a = a * 256;
+
+ /* Apply gamma of 2.0 instead of 2.2. */
+ b = FT_MulFix( b, b );
+ g = FT_MulFix( g, g );
+ r = FT_MulFix( r, r );
+
+ /* Apply coefficients. */
+ b = FT_MulFix( b, 4731 /* 0.0722 * 65536 */ );
+ g = FT_MulFix( g, 46871 /* 0.7152 * 65536 */ );
+ r = FT_MulFix( r, 13933 /* 0.2126 * 65536 */ );
+
+ l = r + g + b;
+
+ /*
+ * Final transparency can be determined this way:
+ *
+ * - If alpha is zero, we want 0.
+ * - If alpha is zero and luminosity is zero, we want 255.
+ * - If alpha is zero and luminosity is one, we want 0.
+ *
+ * So the formula is a * (1 - l).
+ */
+
+ return (FT_Byte)( FT_MulFix( 65535 - l, a ) >> 8 );
+ }
+
+
+ /* documentation is in ftbitmap.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Bitmap_Convert( FT_Library library,
+ const FT_Bitmap *source,
+ FT_Bitmap *target,
+ FT_Int alignment )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_Memory memory;
+
+
+ if ( !library )
+ return FT_THROW( Invalid_Library_Handle );
+
+ memory = library->memory;
+
+ switch ( source->pixel_mode )
+ {
+ case FT_PIXEL_MODE_MONO:
+ case FT_PIXEL_MODE_GRAY:
+ case FT_PIXEL_MODE_GRAY2:
+ case FT_PIXEL_MODE_GRAY4:
+ case FT_PIXEL_MODE_LCD:
+ case FT_PIXEL_MODE_LCD_V:
+ case FT_PIXEL_MODE_BGRA:
+ {
+ FT_Int pad;
+ FT_Long old_size;
+
+
+ old_size = target->rows * target->pitch;
+ if ( old_size < 0 )
+ old_size = -old_size;
+
+ target->pixel_mode = FT_PIXEL_MODE_GRAY;
+ target->rows = source->rows;
+ target->width = source->width;
+
+ pad = 0;
+ if ( alignment > 0 )
+ {
+ pad = source->width % alignment;
+ if ( pad != 0 )
+ pad = alignment - pad;
+ }
+
+ target->pitch = source->width + pad;
+
+ if ( target->pitch > 0 &&
+ (FT_ULong)target->rows > FT_ULONG_MAX / target->pitch )
+ return FT_THROW( Invalid_Argument );
+
+ if ( target->rows * target->pitch > old_size &&
+ FT_QREALLOC( target->buffer,
+ old_size, target->rows * target->pitch ) )
+ return error;
+ }
+ break;
+
+ default:
+ error = FT_THROW( Invalid_Argument );
+ }
+
+ switch ( source->pixel_mode )
+ {
+ case FT_PIXEL_MODE_MONO:
+ {
+ FT_Byte* s = source->buffer;
+ FT_Byte* t = target->buffer;
+ FT_Int i;
+
+
+ target->num_grays = 2;
+
+ for ( i = source->rows; i > 0; i-- )
+ {
+ FT_Byte* ss = s;
+ FT_Byte* tt = t;
+ FT_Int j;
+
+
+ /* get the full bytes */
+ for ( j = source->width >> 3; j > 0; j-- )
+ {
+ FT_Int val = ss[0]; /* avoid a byte->int cast on each line */
+
+
+ tt[0] = (FT_Byte)( ( val & 0x80 ) >> 7 );
+ tt[1] = (FT_Byte)( ( val & 0x40 ) >> 6 );
+ tt[2] = (FT_Byte)( ( val & 0x20 ) >> 5 );
+ tt[3] = (FT_Byte)( ( val & 0x10 ) >> 4 );
+ tt[4] = (FT_Byte)( ( val & 0x08 ) >> 3 );
+ tt[5] = (FT_Byte)( ( val & 0x04 ) >> 2 );
+ tt[6] = (FT_Byte)( ( val & 0x02 ) >> 1 );
+ tt[7] = (FT_Byte)( val & 0x01 );
+
+ tt += 8;
+ ss += 1;
+ }
+
+ /* get remaining pixels (if any) */
+ j = source->width & 7;
+ if ( j > 0 )
+ {
+ FT_Int val = *ss;
+
+
+ for ( ; j > 0; j-- )
+ {
+ tt[0] = (FT_Byte)( ( val & 0x80 ) >> 7);
+ val <<= 1;
+ tt += 1;
+ }
+ }
+
+ s += source->pitch;
+ t += target->pitch;
+ }
+ }
+ break;
+
+
+ case FT_PIXEL_MODE_GRAY:
+ case FT_PIXEL_MODE_LCD:
+ case FT_PIXEL_MODE_LCD_V:
+ {
+ FT_Int width = source->width;
+ FT_Byte* s = source->buffer;
+ FT_Byte* t = target->buffer;
+ FT_Int s_pitch = source->pitch;
+ FT_Int t_pitch = target->pitch;
+ FT_Int i;
+
+
+ target->num_grays = 256;
+
+ for ( i = source->rows; i > 0; i-- )
+ {
+ FT_ARRAY_COPY( t, s, width );
+
+ s += s_pitch;
+ t += t_pitch;
+ }
+ }
+ break;
+
+
+ case FT_PIXEL_MODE_GRAY2:
+ {
+ FT_Byte* s = source->buffer;
+ FT_Byte* t = target->buffer;
+ FT_Int i;
+
+
+ target->num_grays = 4;
+
+ for ( i = source->rows; i > 0; i-- )
+ {
+ FT_Byte* ss = s;
+ FT_Byte* tt = t;
+ FT_Int j;
+
+
+ /* get the full bytes */
+ for ( j = source->width >> 2; j > 0; j-- )
+ {
+ FT_Int val = ss[0];
+
+
+ tt[0] = (FT_Byte)( ( val & 0xC0 ) >> 6 );
+ tt[1] = (FT_Byte)( ( val & 0x30 ) >> 4 );
+ tt[2] = (FT_Byte)( ( val & 0x0C ) >> 2 );
+ tt[3] = (FT_Byte)( ( val & 0x03 ) );
+
+ ss += 1;
+ tt += 4;
+ }
+
+ j = source->width & 3;
+ if ( j > 0 )
+ {
+ FT_Int val = ss[0];
+
+
+ for ( ; j > 0; j-- )
+ {
+ tt[0] = (FT_Byte)( ( val & 0xC0 ) >> 6 );
+ val <<= 2;
+ tt += 1;
+ }
+ }
+
+ s += source->pitch;
+ t += target->pitch;
+ }
+ }
+ break;
+
+
+ case FT_PIXEL_MODE_GRAY4:
+ {
+ FT_Byte* s = source->buffer;
+ FT_Byte* t = target->buffer;
+ FT_Int i;
+
+
+ target->num_grays = 16;
+
+ for ( i = source->rows; i > 0; i-- )
+ {
+ FT_Byte* ss = s;
+ FT_Byte* tt = t;
+ FT_Int j;
+
+
+ /* get the full bytes */
+ for ( j = source->width >> 1; j > 0; j-- )
+ {
+ FT_Int val = ss[0];
+
+
+ tt[0] = (FT_Byte)( ( val & 0xF0 ) >> 4 );
+ tt[1] = (FT_Byte)( ( val & 0x0F ) );
+
+ ss += 1;
+ tt += 2;
+ }
+
+ if ( source->width & 1 )
+ tt[0] = (FT_Byte)( ( ss[0] & 0xF0 ) >> 4 );
+
+ s += source->pitch;
+ t += target->pitch;
+ }
+ }
+ break;
+
+ case FT_PIXEL_MODE_BGRA:
+ {
+ FT_Byte* s = source->buffer;
+ FT_Byte* t = target->buffer;
+ FT_Int s_pitch = source->pitch;
+ FT_Int t_pitch = target->pitch;
+ FT_Int i;
+
+
+ target->num_grays = 256;
+
+ for ( i = source->rows; i > 0; i-- )
+ {
+ FT_Byte* ss = s;
+ FT_Byte* tt = t;
+ FT_Int j;
+
+
+ for ( j = source->width; j > 0; j-- )
+ {
+ tt[0] = ft_gray_for_premultiplied_srgb_bgra( ss );
+
+ ss += 4;
+ tt += 1;
+ }
+
+ s += s_pitch;
+ t += t_pitch;
+ }
+ }
+ break;
+
+ default:
+ ;
+ }
+
+ return error;
+ }
+
+
+ /* documentation is in ftbitmap.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_GlyphSlot_Own_Bitmap( FT_GlyphSlot slot )
+ {
+ if ( slot && slot->format == FT_GLYPH_FORMAT_BITMAP &&
+ !( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) )
+ {
+ FT_Bitmap bitmap;
+ FT_Error error;
+
+
+ FT_Bitmap_New( &bitmap );
+ error = FT_Bitmap_Copy( slot->library, &slot->bitmap, &bitmap );
+ if ( error )
+ return error;
+
+ slot->bitmap = bitmap;
+ slot->internal->flags |= FT_GLYPH_OWN_BITMAP;
+ }
+
+ return FT_Err_Ok;
+ }
+
+
+ /* documentation is in ftbitmap.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Bitmap_Done( FT_Library library,
+ FT_Bitmap *bitmap )
+ {
+ FT_Memory memory;
+
+
+ if ( !library )
+ return FT_THROW( Invalid_Library_Handle );
+
+ if ( !bitmap )
+ return FT_THROW( Invalid_Argument );
+
+ memory = library->memory;
+
+ FT_FREE( bitmap->buffer );
+ *bitmap = null_bitmap;
+
+ return FT_Err_Ok;
+ }
+
+
+/* END */
+#endif
+
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftglyph.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftglyph.c
new file mode 100644
index 0000000000..9ed83d21eb
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftglyph.c
@@ -0,0 +1,631 @@
+#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501
+/***************************************************************************/
+/* */
+/* ftglyph.c */
+/* */
+/* FreeType convenience functions to handle glyphs (body). */
+/* */
+/* Copyright 1996-2005, 2007, 2008, 2010, 2012, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* This file contains the definition of several convenience functions */
+ /* that can be used by client applications to easily retrieve glyph */
+ /* bitmaps and outlines from a given face. */
+ /* */
+ /* These functions should be optional if you are writing a font server */
+ /* or text layout engine on top of FreeType. However, they are pretty */
+ /* handy for many other simple uses of the library. */
+ /* */
+ /*************************************************************************/
+
+#define FT2_BUILD_LIBRARY
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/ftglyph.h"
+#include "../../include/freetype/ftoutln.h"
+#include "../../include/freetype/ftbitmap.h"
+#include "../../include/freetype/internal/ftobjs.h"
+
+#include "basepic.h"
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_glyph
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** FT_BitmapGlyph support ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ FT_CALLBACK_DEF( FT_Error )
+ ft_bitmap_glyph_init( FT_Glyph bitmap_glyph,
+ FT_GlyphSlot slot )
+ {
+ FT_BitmapGlyph glyph = (FT_BitmapGlyph)bitmap_glyph;
+ FT_Error error = FT_Err_Ok;
+ FT_Library library = FT_GLYPH( glyph )->library;
+
+
+ if ( slot->format != FT_GLYPH_FORMAT_BITMAP )
+ {
+ error = FT_THROW( Invalid_Glyph_Format );
+ goto Exit;
+ }
+
+ glyph->left = slot->bitmap_left;
+ glyph->top = slot->bitmap_top;
+
+ /* do lazy copying whenever possible */
+ if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP )
+ {
+ glyph->bitmap = slot->bitmap;
+ slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP;
+ }
+ else
+ {
+ FT_Bitmap_New( &glyph->bitmap );
+ error = FT_Bitmap_Copy( library, &slot->bitmap, &glyph->bitmap );
+ }
+
+ Exit:
+ return error;
+ }
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ ft_bitmap_glyph_copy( FT_Glyph bitmap_source,
+ FT_Glyph bitmap_target )
+ {
+ FT_Library library = bitmap_source->library;
+ FT_BitmapGlyph source = (FT_BitmapGlyph)bitmap_source;
+ FT_BitmapGlyph target = (FT_BitmapGlyph)bitmap_target;
+
+
+ target->left = source->left;
+ target->top = source->top;
+
+ return FT_Bitmap_Copy( library, &source->bitmap, &target->bitmap );
+ }
+
+
+ FT_CALLBACK_DEF( void )
+ ft_bitmap_glyph_done( FT_Glyph bitmap_glyph )
+ {
+ FT_BitmapGlyph glyph = (FT_BitmapGlyph)bitmap_glyph;
+ FT_Library library = FT_GLYPH( glyph )->library;
+
+
+ FT_Bitmap_Done( library, &glyph->bitmap );
+ }
+
+
+ FT_CALLBACK_DEF( void )
+ ft_bitmap_glyph_bbox( FT_Glyph bitmap_glyph,
+ FT_BBox* cbox )
+ {
+ FT_BitmapGlyph glyph = (FT_BitmapGlyph)bitmap_glyph;
+
+
+ cbox->xMin = glyph->left << 6;
+ cbox->xMax = cbox->xMin + ( glyph->bitmap.width << 6 );
+ cbox->yMax = glyph->top << 6;
+ cbox->yMin = cbox->yMax - ( glyph->bitmap.rows << 6 );
+ }
+
+
+ FT_DEFINE_GLYPH(ft_bitmap_glyph_class,
+ sizeof ( FT_BitmapGlyphRec ),
+ FT_GLYPH_FORMAT_BITMAP,
+
+ ft_bitmap_glyph_init,
+ ft_bitmap_glyph_done,
+ ft_bitmap_glyph_copy,
+ 0, /* FT_Glyph_TransformFunc */
+ ft_bitmap_glyph_bbox,
+ 0 /* FT_Glyph_PrepareFunc */
+ )
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** FT_OutlineGlyph support ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ ft_outline_glyph_init( FT_Glyph outline_glyph,
+ FT_GlyphSlot slot )
+ {
+ FT_OutlineGlyph glyph = (FT_OutlineGlyph)outline_glyph;
+ FT_Error error = FT_Err_Ok;
+ FT_Library library = FT_GLYPH( glyph )->library;
+ FT_Outline* source = &slot->outline;
+ FT_Outline* target = &glyph->outline;
+
+
+ /* check format in glyph slot */
+ if ( slot->format != FT_GLYPH_FORMAT_OUTLINE )
+ {
+ error = FT_THROW( Invalid_Glyph_Format );
+ goto Exit;
+ }
+
+ /* allocate new outline */
+ error = FT_Outline_New( library, source->n_points, source->n_contours,
+ &glyph->outline );
+ if ( error )
+ goto Exit;
+
+ FT_Outline_Copy( source, target );
+
+ Exit:
+ return error;
+ }
+
+
+ FT_CALLBACK_DEF( void )
+ ft_outline_glyph_done( FT_Glyph outline_glyph )
+ {
+ FT_OutlineGlyph glyph = (FT_OutlineGlyph)outline_glyph;
+
+
+ FT_Outline_Done( FT_GLYPH( glyph )->library, &glyph->outline );
+ }
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ ft_outline_glyph_copy( FT_Glyph outline_source,
+ FT_Glyph outline_target )
+ {
+ FT_OutlineGlyph source = (FT_OutlineGlyph)outline_source;
+ FT_OutlineGlyph target = (FT_OutlineGlyph)outline_target;
+ FT_Error error;
+ FT_Library library = FT_GLYPH( source )->library;
+
+
+ error = FT_Outline_New( library, source->outline.n_points,
+ source->outline.n_contours, &target->outline );
+ if ( !error )
+ FT_Outline_Copy( &source->outline, &target->outline );
+
+ return error;
+ }
+
+
+ FT_CALLBACK_DEF( void )
+ ft_outline_glyph_transform( FT_Glyph outline_glyph,
+ const FT_Matrix* matrix,
+ const FT_Vector* delta )
+ {
+ FT_OutlineGlyph glyph = (FT_OutlineGlyph)outline_glyph;
+
+
+ if ( matrix )
+ FT_Outline_Transform( &glyph->outline, matrix );
+
+ if ( delta )
+ FT_Outline_Translate( &glyph->outline, delta->x, delta->y );
+ }
+
+
+ FT_CALLBACK_DEF( void )
+ ft_outline_glyph_bbox( FT_Glyph outline_glyph,
+ FT_BBox* bbox )
+ {
+ FT_OutlineGlyph glyph = (FT_OutlineGlyph)outline_glyph;
+
+
+ FT_Outline_Get_CBox( &glyph->outline, bbox );
+ }
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ ft_outline_glyph_prepare( FT_Glyph outline_glyph,
+ FT_GlyphSlot slot )
+ {
+ FT_OutlineGlyph glyph = (FT_OutlineGlyph)outline_glyph;
+
+
+ slot->format = FT_GLYPH_FORMAT_OUTLINE;
+ slot->outline = glyph->outline;
+ slot->outline.flags &= ~FT_OUTLINE_OWNER;
+
+ return FT_Err_Ok;
+ }
+
+
+ FT_DEFINE_GLYPH( ft_outline_glyph_class,
+ sizeof ( FT_OutlineGlyphRec ),
+ FT_GLYPH_FORMAT_OUTLINE,
+
+ ft_outline_glyph_init,
+ ft_outline_glyph_done,
+ ft_outline_glyph_copy,
+ ft_outline_glyph_transform,
+ ft_outline_glyph_bbox,
+ ft_outline_glyph_prepare
+ )
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** FT_Glyph class and API ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ static FT_Error
+ ft_new_glyph( FT_Library library,
+ const FT_Glyph_Class* clazz,
+ FT_Glyph* aglyph )
+ {
+ FT_Memory memory = library->memory;
+ FT_Error error;
+ FT_Glyph glyph = NULL;
+
+
+ *aglyph = 0;
+
+ if ( !FT_ALLOC( glyph, clazz->glyph_size ) )
+ {
+ glyph->library = library;
+ glyph->clazz = clazz;
+ glyph->format = clazz->glyph_format;
+
+ *aglyph = glyph;
+ }
+
+ return error;
+ }
+
+
+ /* documentation is in ftglyph.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Glyph_Copy( FT_Glyph source,
+ FT_Glyph *target )
+ {
+ FT_Glyph copy;
+ FT_Error error;
+ const FT_Glyph_Class* clazz;
+
+
+ /* check arguments */
+ if ( !target )
+ {
+ error = FT_THROW( Invalid_Argument );
+ goto Exit;
+ }
+
+ *target = 0;
+
+ if ( !source || !source->clazz )
+ {
+ error = FT_THROW( Invalid_Argument );
+ goto Exit;
+ }
+
+ clazz = source->clazz;
+ error = ft_new_glyph( source->library, clazz, &copy );
+ if ( error )
+ goto Exit;
+
+ copy->advance = source->advance;
+ copy->format = source->format;
+
+ if ( clazz->glyph_copy )
+ error = clazz->glyph_copy( source, copy );
+
+ if ( error )
+ FT_Done_Glyph( copy );
+ else
+ *target = copy;
+
+ Exit:
+ return error;
+ }
+
+
+ /* documentation is in ftglyph.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Get_Glyph( FT_GlyphSlot slot,
+ FT_Glyph *aglyph )
+ {
+ FT_Library library;
+ FT_Error error;
+ FT_Glyph glyph;
+
+ const FT_Glyph_Class* clazz = 0;
+
+
+ if ( !slot )
+ return FT_THROW( Invalid_Slot_Handle );
+
+ library = slot->library;
+
+ if ( !aglyph )
+ return FT_THROW( Invalid_Argument );
+
+ /* if it is a bitmap, that's easy :-) */
+ if ( slot->format == FT_GLYPH_FORMAT_BITMAP )
+ clazz = FT_BITMAP_GLYPH_CLASS_GET;
+
+ /* if it is an outline */
+ else if ( slot->format == FT_GLYPH_FORMAT_OUTLINE )
+ clazz = FT_OUTLINE_GLYPH_CLASS_GET;
+
+ else
+ {
+ /* try to find a renderer that supports the glyph image format */
+ FT_Renderer render = FT_Lookup_Renderer( library, slot->format, 0 );
+
+
+ if ( render )
+ clazz = &render->glyph_class;
+ }
+
+ if ( !clazz )
+ {
+ error = FT_THROW( Invalid_Glyph_Format );
+ goto Exit;
+ }
+
+ /* create FT_Glyph object */
+ error = ft_new_glyph( library, clazz, &glyph );
+ if ( error )
+ goto Exit;
+
+ /* copy advance while converting it to 16.16 format */
+ glyph->advance.x = slot->advance.x << 10;
+ glyph->advance.y = slot->advance.y << 10;
+
+ /* now import the image from the glyph slot */
+ error = clazz->glyph_init( glyph, slot );
+
+ /* if an error occurred, destroy the glyph */
+ if ( error )
+ FT_Done_Glyph( glyph );
+ else
+ *aglyph = glyph;
+
+ Exit:
+ return error;
+ }
+
+
+ /* documentation is in ftglyph.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Glyph_Transform( FT_Glyph glyph,
+ FT_Matrix* matrix,
+ FT_Vector* delta )
+ {
+ const FT_Glyph_Class* clazz;
+ FT_Error error = FT_Err_Ok;
+
+
+ if ( !glyph || !glyph->clazz )
+ error = FT_THROW( Invalid_Argument );
+ else
+ {
+ clazz = glyph->clazz;
+ if ( clazz->glyph_transform )
+ {
+ /* transform glyph image */
+ clazz->glyph_transform( glyph, matrix, delta );
+
+ /* transform advance vector */
+ if ( matrix )
+ FT_Vector_Transform( &glyph->advance, matrix );
+ }
+ else
+ error = FT_THROW( Invalid_Glyph_Format );
+ }
+ return error;
+ }
+
+
+ /* documentation is in ftglyph.h */
+
+ FT_EXPORT_DEF( void )
+ FT_Glyph_Get_CBox( FT_Glyph glyph,
+ FT_UInt bbox_mode,
+ FT_BBox *acbox )
+ {
+ const FT_Glyph_Class* clazz;
+
+
+ if ( !acbox )
+ return;
+
+ acbox->xMin = acbox->yMin = acbox->xMax = acbox->yMax = 0;
+
+ if ( !glyph || !glyph->clazz )
+ return;
+ else
+ {
+ clazz = glyph->clazz;
+ if ( !clazz->glyph_bbox )
+ return;
+ else
+ {
+ /* retrieve bbox in 26.6 coordinates */
+ clazz->glyph_bbox( glyph, acbox );
+
+ /* perform grid fitting if needed */
+ if ( bbox_mode == FT_GLYPH_BBOX_GRIDFIT ||
+ bbox_mode == FT_GLYPH_BBOX_PIXELS )
+ {
+ acbox->xMin = FT_PIX_FLOOR( acbox->xMin );
+ acbox->yMin = FT_PIX_FLOOR( acbox->yMin );
+ acbox->xMax = FT_PIX_CEIL( acbox->xMax );
+ acbox->yMax = FT_PIX_CEIL( acbox->yMax );
+ }
+
+ /* convert to integer pixels if needed */
+ if ( bbox_mode == FT_GLYPH_BBOX_TRUNCATE ||
+ bbox_mode == FT_GLYPH_BBOX_PIXELS )
+ {
+ acbox->xMin >>= 6;
+ acbox->yMin >>= 6;
+ acbox->xMax >>= 6;
+ acbox->yMax >>= 6;
+ }
+ }
+ }
+ return;
+ }
+
+
+ /* documentation is in ftglyph.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Glyph_To_Bitmap( FT_Glyph* the_glyph,
+ FT_Render_Mode render_mode,
+ FT_Vector* origin,
+ FT_Bool destroy )
+ {
+ FT_GlyphSlotRec dummy;
+ FT_GlyphSlot_InternalRec dummy_internal;
+ FT_Error error = FT_Err_Ok;
+ FT_Glyph b, glyph;
+ FT_BitmapGlyph bitmap = NULL;
+ const FT_Glyph_Class* clazz;
+
+ /* FT_BITMAP_GLYPH_CLASS_GET derefers `library' in PIC mode */
+ FT_Library library;
+
+
+ /* check argument */
+ if ( !the_glyph )
+ goto Bad;
+ glyph = *the_glyph;
+ if ( !glyph )
+ goto Bad;
+
+ clazz = glyph->clazz;
+ library = glyph->library;
+ if ( !library || !clazz )
+ goto Bad;
+
+ /* when called with a bitmap glyph, do nothing and return successfully */
+ if ( clazz == FT_BITMAP_GLYPH_CLASS_GET )
+ goto Exit;
+
+ if ( !clazz->glyph_prepare )
+ goto Bad;
+
+ /* we render the glyph into a glyph bitmap using a `dummy' glyph slot */
+ /* then calling FT_Render_Glyph_Internal() */
+
+ FT_MEM_ZERO( &dummy, sizeof ( dummy ) );
+ FT_MEM_ZERO( &dummy_internal, sizeof ( dummy_internal ) );
+ dummy.internal = &dummy_internal;
+ dummy.library = library;
+ dummy.format = clazz->glyph_format;
+
+ /* create result bitmap glyph */
+ error = ft_new_glyph( library, FT_BITMAP_GLYPH_CLASS_GET, &b );
+ if ( error )
+ goto Exit;
+ bitmap = (FT_BitmapGlyph)b;
+
+#if 1
+ /* if `origin' is set, translate the glyph image */
+ if ( origin )
+ FT_Glyph_Transform( glyph, 0, origin );
+#else
+ FT_UNUSED( origin );
+#endif
+
+ /* prepare dummy slot for rendering */
+ error = clazz->glyph_prepare( glyph, &dummy );
+ if ( !error )
+ error = FT_Render_Glyph_Internal( glyph->library, &dummy, render_mode );
+
+#if 1
+ if ( !destroy && origin )
+ {
+ FT_Vector v;
+
+
+ v.x = -origin->x;
+ v.y = -origin->y;
+ FT_Glyph_Transform( glyph, 0, &v );
+ }
+#endif
+
+ if ( error )
+ goto Exit;
+
+ /* in case of success, copy the bitmap to the glyph bitmap */
+ error = ft_bitmap_glyph_init( (FT_Glyph)bitmap, &dummy );
+ if ( error )
+ goto Exit;
+
+ /* copy advance */
+ bitmap->root.advance = glyph->advance;
+
+ if ( destroy )
+ FT_Done_Glyph( glyph );
+
+ *the_glyph = FT_GLYPH( bitmap );
+
+ Exit:
+ if ( error && bitmap )
+ FT_Done_Glyph( FT_GLYPH( bitmap ) );
+
+ return error;
+
+ Bad:
+ error = FT_THROW( Invalid_Argument );
+ goto Exit;
+ }
+
+
+ /* documentation is in ftglyph.h */
+
+ FT_EXPORT_DEF( void )
+ FT_Done_Glyph( FT_Glyph glyph )
+ {
+ if ( glyph )
+ {
+ FT_Memory memory = glyph->library->memory;
+ const FT_Glyph_Class* clazz = glyph->clazz;
+
+
+ if ( clazz->glyph_done )
+ clazz->glyph_done( glyph );
+
+ FT_FREE( glyph );
+ }
+ }
+
+
+/* END */
+#endif
+
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftinit.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftinit.c
new file mode 100644
index 0000000000..c7bf1f9537
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftinit.c
@@ -0,0 +1,285 @@
+#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501
+/***************************************************************************/
+/* */
+/* ftinit.c */
+/* */
+/* FreeType initialization layer (body). */
+/* */
+/* Copyright 1996-2002, 2005, 2007, 2009, 2012, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* The purpose of this file is to implement the following two */
+ /* functions: */
+ /* */
+ /* FT_Add_Default_Modules(): */
+ /* This function is used to add the set of default modules to a */
+ /* fresh new library object. The set is taken from the header file */
+ /* `freetype/config/ftmodule.h'. See the document `FreeType 2.0 */
+ /* Build System' for more information. */
+ /* */
+ /* FT_Init_FreeType(): */
+ /* This function creates a system object for the current platform, */
+ /* builds a library out of it, then calls FT_Default_Drivers(). */
+ /* */
+ /* Note that even if FT_Init_FreeType() uses the implementation of the */
+ /* system object defined at build time, client applications are still */
+ /* able to provide their own `ftsystem.c'. */
+ /* */
+ /*************************************************************************/
+
+#define FT2_BUILD_LIBRARY
+#include "../../include/ft2build.h"
+#include "../../include/freetype/config/ftconfig.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/ftmodapi.h"
+#include "basepic.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_init
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+
+#undef FT_USE_MODULE
+#ifdef __cplusplus
+#define FT_USE_MODULE( type, x ) extern "C" const type x;
+#else
+#define FT_USE_MODULE( type, x ) extern const type x;
+#endif
+
+#include "../../include/freetype/config/ftmodule.h"
+
+#undef FT_USE_MODULE
+#define FT_USE_MODULE( type, x ) (const FT_Module_Class*)&(x),
+
+ static
+ const FT_Module_Class* const ft_default_modules[] =
+ {
+#include "../../include/freetype/config/ftmodule.h"
+ 0
+ };
+
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+
+#ifdef __cplusplus
+#define FT_EXTERNC extern "C"
+#else
+#define FT_EXTERNC extern
+#endif
+
+ /* declare the module's class creation/destruction functions */
+#undef FT_USE_MODULE
+#define FT_USE_MODULE( type, x ) \
+ FT_EXTERNC FT_Error \
+ FT_Create_Class_ ## x( FT_Library library, \
+ FT_Module_Class* *output_class ); \
+ FT_EXTERNC void \
+ FT_Destroy_Class_ ## x( FT_Library library, \
+ FT_Module_Class* clazz );
+
+#include "../../include/freetype/config/ftmodule.h"
+
+ /* count all module classes */
+#undef FT_USE_MODULE
+#define FT_USE_MODULE( type, x ) MODULE_CLASS_ ## x,
+
+ enum
+ {
+#include "../../include/freetype/config/ftmodule.h"
+ FT_NUM_MODULE_CLASSES
+ };
+
+ /* destroy all module classes */
+#undef FT_USE_MODULE
+#define FT_USE_MODULE( type, x ) \
+ if ( classes[i] ) \
+ { \
+ FT_Destroy_Class_ ## x( library, classes[i] ); \
+ } \
+ i++;
+
+
+ FT_BASE_DEF( void )
+ ft_destroy_default_module_classes( FT_Library library )
+ {
+ FT_Module_Class* *classes;
+ FT_Memory memory;
+ FT_UInt i;
+ BasePIC* pic_container = (BasePIC*)library->pic_container.base;
+
+
+ if ( !pic_container->default_module_classes )
+ return;
+
+ memory = library->memory;
+ classes = pic_container->default_module_classes;
+ i = 0;
+
+#include "../../include/freetype/config/ftmodule.h"
+
+ FT_FREE( classes );
+ pic_container->default_module_classes = 0;
+ }
+
+
+ /* initialize all module classes and the pointer table */
+#undef FT_USE_MODULE
+#define FT_USE_MODULE( type, x ) \
+ error = FT_Create_Class_ ## x( library, &clazz ); \
+ if ( error ) \
+ goto Exit; \
+ classes[i++] = clazz;
+
+
+ FT_BASE_DEF( FT_Error )
+ ft_create_default_module_classes( FT_Library library )
+ {
+ FT_Error error;
+ FT_Memory memory;
+ FT_Module_Class* *classes = NULL;
+ FT_Module_Class* clazz;
+ FT_UInt i;
+ BasePIC* pic_container = (BasePIC*)library->pic_container.base;
+
+
+ memory = library->memory;
+
+ pic_container->default_module_classes = 0;
+
+ if ( FT_ALLOC( classes, sizeof ( FT_Module_Class* ) *
+ ( FT_NUM_MODULE_CLASSES + 1 ) ) )
+ return error;
+
+ /* initialize all pointers to 0, especially the last one */
+ for ( i = 0; i < FT_NUM_MODULE_CLASSES; i++ )
+ classes[i] = 0;
+ classes[FT_NUM_MODULE_CLASSES] = 0;
+
+ i = 0;
+
+#include "../../include/freetype/config/ftmodule.h"
+
+ Exit:
+ if ( error )
+ ft_destroy_default_module_classes( library );
+ else
+ pic_container->default_module_classes = classes;
+
+ return error;
+ }
+
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+ /* documentation is in ftmodapi.h */
+
+ FT_EXPORT_DEF( void )
+ FT_Add_Default_Modules( FT_Library library )
+ {
+ FT_Error error;
+ const FT_Module_Class* const* cur;
+
+
+ /* FT_DEFAULT_MODULES_GET dereferences `library' in PIC mode */
+#ifdef FT_CONFIG_OPTION_PIC
+ if ( !library )
+ return;
+#endif
+
+ /* GCC 4.6 warns the type difference:
+ * FT_Module_Class** != const FT_Module_Class* const*
+ */
+ cur = (const FT_Module_Class* const*)FT_DEFAULT_MODULES_GET;
+
+ /* test for valid `library' delayed to FT_Add_Module() */
+ while ( *cur )
+ {
+ error = FT_Add_Module( library, *cur );
+ /* notify errors, but don't stop */
+ if ( error )
+ FT_TRACE0(( "FT_Add_Default_Module:"
+ " Cannot install `%s', error = 0x%x\n",
+ (*cur)->module_name, error ));
+ cur++;
+ }
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Init_FreeType( FT_Library *alibrary )
+ {
+ FT_Error error;
+ FT_Memory memory;
+
+
+ /* First of all, allocate a new system object -- this function is part */
+ /* of the system-specific component, i.e. `ftsystem.c'. */
+
+ memory = FT_New_Memory();
+ if ( !memory )
+ {
+ FT_ERROR(( "FT_Init_FreeType: cannot find memory manager\n" ));
+ return FT_THROW( Unimplemented_Feature );
+ }
+
+ /* build a library out of it, then fill it with the set of */
+ /* default drivers. */
+
+ error = FT_New_Library( memory, alibrary );
+ if ( error )
+ FT_Done_Memory( memory );
+ else
+ FT_Add_Default_Modules( *alibrary );
+
+ return error;
+ }
+
+
+ /* documentation is in freetype.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Done_FreeType( FT_Library library )
+ {
+ if ( library )
+ {
+ FT_Memory memory = library->memory;
+
+
+ /* Discard the library object */
+ FT_Done_Library( library );
+
+ /* discard memory manager */
+ FT_Done_Memory( memory );
+ }
+
+ return FT_Err_Ok;
+ }
+
+
+/* END */
+#endif
+
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftlcdfil.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftlcdfil.c
new file mode 100644
index 0000000000..66676de916
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftlcdfil.c
@@ -0,0 +1,381 @@
+#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501
+/***************************************************************************/
+/* */
+/* ftlcdfil.c */
+/* */
+/* FreeType API for color filtering of subpixel bitmap glyphs (body). */
+/* */
+/* Copyright 2006, 2008-2010, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+#define FT2_BUILD_LIBRARY
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+
+#include "../../include/freetype/ftlcdfil.h"
+#include "../../include/freetype/ftimage.h"
+#include "../../include/freetype/internal/ftobjs.h"
+
+
+#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
+
+/* define USE_LEGACY to implement the legacy filter */
+#define USE_LEGACY
+
+ /* FIR filter used by the default and light filters */
+ static void
+ _ft_lcd_filter_fir( FT_Bitmap* bitmap,
+ FT_Render_Mode mode,
+ FT_Library library )
+ {
+ FT_Byte* weights = library->lcd_weights;
+ FT_UInt width = (FT_UInt)bitmap->width;
+ FT_UInt height = (FT_UInt)bitmap->rows;
+
+
+ /* horizontal in-place FIR filter */
+ if ( mode == FT_RENDER_MODE_LCD && width >= 4 )
+ {
+ FT_Byte* line = bitmap->buffer;
+
+
+ for ( ; height > 0; height--, line += bitmap->pitch )
+ {
+ FT_UInt fir[5];
+ FT_UInt val1, xx;
+
+
+ val1 = line[0];
+ fir[0] = weights[2] * val1;
+ fir[1] = weights[3] * val1;
+ fir[2] = weights[4] * val1;
+ fir[3] = 0;
+ fir[4] = 0;
+
+ val1 = line[1];
+ fir[0] += weights[1] * val1;
+ fir[1] += weights[2] * val1;
+ fir[2] += weights[3] * val1;
+ fir[3] += weights[4] * val1;
+
+ for ( xx = 2; xx < width; xx++ )
+ {
+ FT_UInt val, pix;
+
+
+ val = line[xx];
+ pix = fir[0] + weights[0] * val;
+ fir[0] = fir[1] + weights[1] * val;
+ fir[1] = fir[2] + weights[2] * val;
+ fir[2] = fir[3] + weights[3] * val;
+ fir[3] = weights[4] * val;
+
+ pix >>= 8;
+ pix |= (FT_UInt)-(FT_Int)( pix >> 8 );
+ line[xx - 2] = (FT_Byte)pix;
+ }
+
+ {
+ FT_UInt pix;
+
+
+ pix = fir[0] >> 8;
+ pix |= (FT_UInt)-(FT_Int)( pix >> 8 );
+ line[xx - 2] = (FT_Byte)pix;
+
+ pix = fir[1] >> 8;
+ pix |= (FT_UInt)-(FT_Int)( pix >> 8 );
+ line[xx - 1] = (FT_Byte)pix;
+ }
+ }
+ }
+
+ /* vertical in-place FIR filter */
+ else if ( mode == FT_RENDER_MODE_LCD_V && height >= 4 )
+ {
+ FT_Byte* column = bitmap->buffer;
+ FT_Int pitch = bitmap->pitch;
+
+
+ for ( ; width > 0; width--, column++ )
+ {
+ FT_Byte* col = column;
+ FT_UInt fir[5];
+ FT_UInt val1, yy;
+
+
+ val1 = col[0];
+ fir[0] = weights[2] * val1;
+ fir[1] = weights[3] * val1;
+ fir[2] = weights[4] * val1;
+ fir[3] = 0;
+ fir[4] = 0;
+ col += pitch;
+
+ val1 = col[0];
+ fir[0] += weights[1] * val1;
+ fir[1] += weights[2] * val1;
+ fir[2] += weights[3] * val1;
+ fir[3] += weights[4] * val1;
+ col += pitch;
+
+ for ( yy = 2; yy < height; yy++ )
+ {
+ FT_UInt val, pix;
+
+
+ val = col[0];
+ pix = fir[0] + weights[0] * val;
+ fir[0] = fir[1] + weights[1] * val;
+ fir[1] = fir[2] + weights[2] * val;
+ fir[2] = fir[3] + weights[3] * val;
+ fir[3] = weights[4] * val;
+
+ pix >>= 8;
+ pix |= (FT_UInt)-(FT_Int)( pix >> 8 );
+ col[-2 * pitch] = (FT_Byte)pix;
+ col += pitch;
+ }
+
+ {
+ FT_UInt pix;
+
+
+ pix = fir[0] >> 8;
+ pix |= (FT_UInt)-(FT_Int)( pix >> 8 );
+ col[-2 * pitch] = (FT_Byte)pix;
+
+ pix = fir[1] >> 8;
+ pix |= (FT_UInt)-(FT_Int)( pix >> 8 );
+ col[-pitch] = (FT_Byte)pix;
+ }
+ }
+ }
+ }
+
+
+#ifdef USE_LEGACY
+
+ /* intra-pixel filter used by the legacy filter */
+ static void
+ _ft_lcd_filter_legacy( FT_Bitmap* bitmap,
+ FT_Render_Mode mode,
+ FT_Library library )
+ {
+ FT_UInt width = (FT_UInt)bitmap->width;
+ FT_UInt height = (FT_UInt)bitmap->rows;
+ FT_Int pitch = bitmap->pitch;
+
+ static const int filters[3][3] =
+ {
+ { 65538 * 9/13, 65538 * 1/6, 65538 * 1/13 },
+ { 65538 * 3/13, 65538 * 4/6, 65538 * 3/13 },
+ { 65538 * 1/13, 65538 * 1/6, 65538 * 9/13 }
+ };
+
+ FT_UNUSED( library );
+
+
+ /* horizontal in-place intra-pixel filter */
+ if ( mode == FT_RENDER_MODE_LCD && width >= 3 )
+ {
+ FT_Byte* line = bitmap->buffer;
+
+
+ for ( ; height > 0; height--, line += pitch )
+ {
+ FT_UInt xx;
+
+
+ for ( xx = 0; xx < width; xx += 3 )
+ {
+ FT_UInt r = 0;
+ FT_UInt g = 0;
+ FT_UInt b = 0;
+ FT_UInt p;
+
+
+ p = line[xx];
+ r += filters[0][0] * p;
+ g += filters[0][1] * p;
+ b += filters[0][2] * p;
+
+ p = line[xx + 1];
+ r += filters[1][0] * p;
+ g += filters[1][1] * p;
+ b += filters[1][2] * p;
+
+ p = line[xx + 2];
+ r += filters[2][0] * p;
+ g += filters[2][1] * p;
+ b += filters[2][2] * p;
+
+ line[xx] = (FT_Byte)( r / 65536 );
+ line[xx + 1] = (FT_Byte)( g / 65536 );
+ line[xx + 2] = (FT_Byte)( b / 65536 );
+ }
+ }
+ }
+ else if ( mode == FT_RENDER_MODE_LCD_V && height >= 3 )
+ {
+ FT_Byte* column = bitmap->buffer;
+
+
+ for ( ; width > 0; width--, column++ )
+ {
+ FT_Byte* col = column;
+ FT_Byte* col_end = col + height * pitch;
+
+
+ for ( ; col < col_end; col += 3 * pitch )
+ {
+ FT_UInt r = 0;
+ FT_UInt g = 0;
+ FT_UInt b = 0;
+ FT_UInt p;
+
+
+ p = col[0];
+ r += filters[0][0] * p;
+ g += filters[0][1] * p;
+ b += filters[0][2] * p;
+
+ p = col[pitch];
+ r += filters[1][0] * p;
+ g += filters[1][1] * p;
+ b += filters[1][2] * p;
+
+ p = col[pitch * 2];
+ r += filters[2][0] * p;
+ g += filters[2][1] * p;
+ b += filters[2][2] * p;
+
+ col[0] = (FT_Byte)( r / 65536 );
+ col[pitch] = (FT_Byte)( g / 65536 );
+ col[2 * pitch] = (FT_Byte)( b / 65536 );
+ }
+ }
+ }
+ }
+
+#endif /* USE_LEGACY */
+
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Library_SetLcdFilterWeights( FT_Library library,
+ unsigned char *weights )
+ {
+ if ( !library || !weights )
+ return FT_THROW( Invalid_Argument );
+
+ ft_memcpy( library->lcd_weights, weights, 5 );
+
+ return FT_Err_Ok;
+ }
+
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Library_SetLcdFilter( FT_Library library,
+ FT_LcdFilter filter )
+ {
+ static const FT_Byte light_filter[5] =
+ { 0x00, 0x55, 0x56, 0x55, 0x00 };
+ /* the values here sum up to a value larger than 256, */
+ /* providing a cheap gamma correction */
+ static const FT_Byte default_filter[5] =
+ { 0x10, 0x40, 0x70, 0x40, 0x10 };
+
+
+ if ( !library )
+ return FT_THROW( Invalid_Argument );
+
+ switch ( filter )
+ {
+ case FT_LCD_FILTER_NONE:
+ library->lcd_filter_func = NULL;
+ library->lcd_extra = 0;
+ break;
+
+ case FT_LCD_FILTER_DEFAULT:
+#if defined( FT_FORCE_LEGACY_LCD_FILTER )
+
+ library->lcd_filter_func = _ft_lcd_filter_legacy;
+ library->lcd_extra = 0;
+
+#elif defined( FT_FORCE_LIGHT_LCD_FILTER )
+
+ ft_memcpy( library->lcd_weights, light_filter, 5 );
+ library->lcd_filter_func = _ft_lcd_filter_fir;
+ library->lcd_extra = 2;
+
+#else
+
+ ft_memcpy( library->lcd_weights, default_filter, 5 );
+ library->lcd_filter_func = _ft_lcd_filter_fir;
+ library->lcd_extra = 2;
+
+#endif
+
+ break;
+
+ case FT_LCD_FILTER_LIGHT:
+ ft_memcpy( library->lcd_weights, light_filter, 5 );
+ library->lcd_filter_func = _ft_lcd_filter_fir;
+ library->lcd_extra = 2;
+ break;
+
+#ifdef USE_LEGACY
+
+ case FT_LCD_FILTER_LEGACY:
+ library->lcd_filter_func = _ft_lcd_filter_legacy;
+ library->lcd_extra = 0;
+ break;
+
+#endif
+
+ default:
+ return FT_THROW( Invalid_Argument );
+ }
+
+ library->lcd_filter = filter;
+
+ return FT_Err_Ok;
+ }
+
+#else /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Library_SetLcdFilterWeights( FT_Library library,
+ unsigned char *weights )
+ {
+ FT_UNUSED( library );
+ FT_UNUSED( weights );
+
+ return FT_THROW( Unimplemented_Feature );
+ }
+
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Library_SetLcdFilter( FT_Library library,
+ FT_LcdFilter filter )
+ {
+ FT_UNUSED( library );
+ FT_UNUSED( filter );
+
+ return FT_THROW( Unimplemented_Feature );
+ }
+
+#endif /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */
+
+
+/* END */
+#endif
+
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftmm.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftmm.c
new file mode 100644
index 0000000000..2f320d524c
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftmm.c
@@ -0,0 +1,206 @@
+#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501
+/***************************************************************************/
+/* */
+/* ftmm.c */
+/* */
+/* Multiple Master font support (body). */
+/* */
+/* Copyright 1996-2001, 2003, 2004, 2009, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+#define FT2_BUILD_LIBRARY
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/ftmm.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/services/svmm.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_mm
+
+
+ static FT_Error
+ ft_face_get_mm_service( FT_Face face,
+ FT_Service_MultiMasters *aservice )
+ {
+ FT_Error error;
+
+
+ *aservice = NULL;
+
+ if ( !face )
+ return FT_THROW( Invalid_Face_Handle );
+
+ error = FT_ERR( Invalid_Argument );
+
+ if ( FT_HAS_MULTIPLE_MASTERS( face ) )
+ {
+ FT_FACE_LOOKUP_SERVICE( face,
+ *aservice,
+ MULTI_MASTERS );
+
+ if ( *aservice )
+ error = FT_Err_Ok;
+ }
+
+ return error;
+ }
+
+
+ /* documentation is in ftmm.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Get_Multi_Master( FT_Face face,
+ FT_Multi_Master *amaster )
+ {
+ FT_Error error;
+ FT_Service_MultiMasters service;
+
+
+ error = ft_face_get_mm_service( face, &service );
+ if ( !error )
+ {
+ error = FT_ERR( Invalid_Argument );
+ if ( service->get_mm )
+ error = service->get_mm( face, amaster );
+ }
+
+ return error;
+ }
+
+
+ /* documentation is in ftmm.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Get_MM_Var( FT_Face face,
+ FT_MM_Var* *amaster )
+ {
+ FT_Error error;
+ FT_Service_MultiMasters service;
+
+
+ error = ft_face_get_mm_service( face, &service );
+ if ( !error )
+ {
+ error = FT_ERR( Invalid_Argument );
+ if ( service->get_mm_var )
+ error = service->get_mm_var( face, amaster );
+ }
+
+ return error;
+ }
+
+
+ /* documentation is in ftmm.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Set_MM_Design_Coordinates( FT_Face face,
+ FT_UInt num_coords,
+ FT_Long* coords )
+ {
+ FT_Error error;
+ FT_Service_MultiMasters service;
+
+
+ error = ft_face_get_mm_service( face, &service );
+ if ( !error )
+ {
+ error = FT_ERR( Invalid_Argument );
+ if ( service->set_mm_design )
+ error = service->set_mm_design( face, num_coords, coords );
+ }
+
+ return error;
+ }
+
+
+ /* documentation is in ftmm.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Set_Var_Design_Coordinates( FT_Face face,
+ FT_UInt num_coords,
+ FT_Fixed* coords )
+ {
+ FT_Error error;
+ FT_Service_MultiMasters service;
+
+
+ error = ft_face_get_mm_service( face, &service );
+ if ( !error )
+ {
+ error = FT_ERR( Invalid_Argument );
+ if ( service->set_var_design )
+ error = service->set_var_design( face, num_coords, coords );
+ }
+
+ return error;
+ }
+
+
+ /* documentation is in ftmm.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Set_MM_Blend_Coordinates( FT_Face face,
+ FT_UInt num_coords,
+ FT_Fixed* coords )
+ {
+ FT_Error error;
+ FT_Service_MultiMasters service;
+
+
+ error = ft_face_get_mm_service( face, &service );
+ if ( !error )
+ {
+ error = FT_ERR( Invalid_Argument );
+ if ( service->set_mm_blend )
+ error = service->set_mm_blend( face, num_coords, coords );
+ }
+
+ return error;
+ }
+
+
+ /* documentation is in ftmm.h */
+
+ /* This is exactly the same as the previous function. It exists for */
+ /* orthogonality. */
+
+ FT_EXPORT_DEF( FT_Error )
+ FT_Set_Var_Blend_Coordinates( FT_Face face,
+ FT_UInt num_coords,
+ FT_Fixed* coords )
+ {
+ FT_Error error;
+ FT_Service_MultiMasters service;
+
+
+ error = ft_face_get_mm_service( face, &service );
+ if ( !error )
+ {
+ error = FT_ERR( Invalid_Argument );
+ if ( service->set_mm_blend )
+ error = service->set_mm_blend( face, num_coords, coords );
+ }
+
+ return error;
+ }
+
+
+/* END */
+#endif
+
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftsystem.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftsystem.c
new file mode 100644
index 0000000000..ff7137fc1f
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/fxft_ftsystem.c
@@ -0,0 +1,375 @@
+#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501
+/***************************************************************************/
+/* */
+/* ftsystem.c */
+/* */
+/* ANSI-specific FreeType low-level system interface (body). */
+/* */
+/* Copyright 1996-2002, 2006, 2008-2011, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* This file contains the default interface used by FreeType to access */
+ /* low-level, i.e. memory management, i/o access as well as thread */
+ /* synchronisation. It can be replaced by user-specific routines if */
+ /* necessary. */
+ /* */
+ /*************************************************************************/
+
+#define FT2_BUILD_LIBRARY
+#include "../../include/ft2build.h"
+#include "../../include/freetype/config/ftconfig.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/ftsystem.h"
+#include "../../include/freetype/fterrors.h"
+#include "../../include/freetype/fttypes.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* MEMORY MANAGEMENT INTERFACE */
+ /* */
+ /*************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* It is not necessary to do any error checking for the */
+ /* allocation-related functions. This will be done by the higher level */
+ /* routines like ft_mem_alloc() or ft_mem_realloc(). */
+ /* */
+ /*************************************************************************/
+
+#define _FOXIT_MEM_MANAGER_
+
+#if defined(_FX_MANAGED_CODE_) && defined(__cplusplus)
+extern "C" {
+#endif
+
+/** Allocate number of bytes */
+void* FXMEM_DefaultAlloc(int byte_size, int flags);
+
+/** Allocate with debug information */
+void* FXMEM_DefaultAllocDebug(int size, int flags, const char* file, int line);
+
+void* FXMEM_DefaultRealloc(void* pointer, int new_size, int flags);
+
+/** Free previously allocated memory */
+void FXMEM_DefaultFree(void* pointer, int flags);
+
+#if defined(_FX_MANAGED_CODE_) && defined(__cplusplus)
+}
+#endif
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* ft_alloc */
+ /* */
+ /* <Description> */
+ /* The memory allocation function. */
+ /* */
+ /* <Input> */
+ /* memory :: A pointer to the memory object. */
+ /* */
+ /* size :: The requested size in bytes. */
+ /* */
+ /* <Return> */
+ /* The address of newly allocated block. */
+ /* */
+ FT_CALLBACK_DEF( void* )
+ ft_alloc( FT_Memory memory,
+ long size )
+ {
+ FT_UNUSED( memory );
+ #ifdef _FOXIT_MEM_MANAGER_
+ return FXMEM_DefaultAlloc(size, 0);
+#else
+ return ft_smalloc( size );
+#endif
+ }
+
+ /* XYQ 2006-10-12 */
+#ifdef _XYQ_MEM_DEBUG
+ FT_CALLBACK_DEF( void* )
+ ft_allocdebug( FT_Memory memory,
+ long size, const char* filename, int line)
+ {
+ FT_UNUSED( memory );
+
+ return FXMEM_DefaultAllocDebug( size, 0, filename, line );
+ }
+#endif
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* ft_realloc */
+ /* */
+ /* <Description> */
+ /* The memory reallocation function. */
+ /* */
+ /* <Input> */
+ /* memory :: A pointer to the memory object. */
+ /* */
+ /* cur_size :: The current size of the allocated memory block. */
+ /* */
+ /* new_size :: The newly requested size in bytes. */
+ /* */
+ /* block :: The current address of the block in memory. */
+ /* */
+ /* <Return> */
+ /* The address of the reallocated memory block. */
+ /* */
+ FT_CALLBACK_DEF( void* )
+ ft_realloc( FT_Memory memory,
+ long cur_size,
+ long new_size,
+ void* block )
+ {
+ FT_UNUSED( memory );
+ FT_UNUSED( cur_size );
+
+#ifdef _FOXIT_MEM_MANAGER_
+ return FXMEM_DefaultRealloc(block, new_size, 0);
+#else
+ return ft_srealloc( block, new_size );
+#endif
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* ft_free */
+ /* */
+ /* <Description> */
+ /* The memory release function. */
+ /* */
+ /* <Input> */
+ /* memory :: A pointer to the memory object. */
+ /* */
+ /* block :: The address of block in memory to be freed. */
+ /* */
+ FT_CALLBACK_DEF( void )
+ ft_free( FT_Memory memory,
+ void* block )
+ {
+ FT_UNUSED( memory );
+
+#ifdef _FOXIT_MEM_MANAGER_
+ FXMEM_DefaultFree(block, 0);
+#else
+ ft_sfree( block );
+#endif
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* RESOURCE MANAGEMENT INTERFACE */
+ /* */
+ /*************************************************************************/
+
+#ifndef FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_io
+
+ /* We use the macro STREAM_FILE for convenience to extract the */
+ /* system-specific stream handle from a given FreeType stream object */
+#define STREAM_FILE( stream ) ( (FT_FILE*)stream->descriptor.pointer )
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* ft_ansi_stream_close */
+ /* */
+ /* <Description> */
+ /* The function to close a stream. */
+ /* */
+ /* <Input> */
+ /* stream :: A pointer to the stream object. */
+ /* */
+ FT_CALLBACK_DEF( void )
+ ft_ansi_stream_close( FT_Stream stream )
+ {
+//#if _FX_COMPILER_ != _FX_IARCC_ && _FX_OS_ != _FX_PALMOS_
+ ft_fclose( STREAM_FILE( stream ) );
+
+ stream->descriptor.pointer = NULL;
+ stream->size = 0;
+ stream->base = 0;
+//#endif
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* ft_ansi_stream_io */
+ /* */
+ /* <Description> */
+ /* The function to open a stream. */
+ /* */
+ /* <Input> */
+ /* stream :: A pointer to the stream object. */
+ /* */
+ /* offset :: The position in the data stream to start reading. */
+ /* */
+ /* buffer :: The address of buffer to store the read data. */
+ /* */
+ /* count :: The number of bytes to read from the stream. */
+ /* */
+ /* <Return> */
+ /* The number of bytes actually read. If `count' is zero (this is, */
+ /* the function is used for seeking), a non-zero return value */
+ /* indicates an error. */
+ /* */
+ FT_CALLBACK_DEF( unsigned long )
+ ft_ansi_stream_io( FT_Stream stream,
+ unsigned long offset,
+ unsigned char* buffer,
+ unsigned long count )
+ {
+//#if _FX_COMPILER_ != _FX_IARCC_ && _FX_OS_ != _FX_PALMOS_
+ FT_FILE* file;
+
+
+ if ( !count && offset > stream->size )
+ return 1;
+
+ file = STREAM_FILE( stream );
+
+ if ( stream->pos != offset )
+ ft_fseek( file, offset, SEEK_SET );
+
+ return (unsigned long)ft_fread( buffer, 1, count, file );
+//#else
+// return 0;
+//#endif
+ }
+
+
+ /* documentation is in ftstream.h */
+
+ FT_BASE_DEF( FT_Error )
+ FT_Stream_Open( FT_Stream stream,
+ const char* filepathname )
+ {
+//#if _FX_COMPILER_ != _FX_IARCC_ && _FX_OS_ != _FX_PALMOS_
+ FT_FILE* file;
+
+
+ if ( !stream )
+ return FT_THROW( Invalid_Stream_Handle );
+
+ stream->descriptor.pointer = NULL;
+ stream->pathname.pointer = (char*)filepathname;
+ stream->base = 0;
+ stream->pos = 0;
+ stream->read = NULL;
+ stream->close = NULL;
+
+ file = ft_fopen( filepathname, "rb" );
+ if ( !file )
+ {
+ FT_ERROR(( "FT_Stream_Open:"
+ " could not open `%s'\n", filepathname ));
+
+ return FT_THROW( Cannot_Open_Resource );
+ }
+
+ ft_fseek( file, 0, FXSYS_SEEK_END );
+ stream->size = ft_ftell( file );
+ if ( !stream->size )
+ {
+ FT_ERROR(( "FT_Stream_Open:" ));
+ FT_ERROR(( " opened `%s' but zero-sized\n", filepathname ));
+ ft_fclose( file );
+ return FT_THROW( Cannot_Open_Stream );
+ }
+ ft_fseek( file, 0, FXSYS_SEEK_SET );
+
+ stream->descriptor.pointer = file;
+ stream->read = ft_ansi_stream_io;
+ stream->close = ft_ansi_stream_close;
+
+ FT_TRACE1(( "FT_Stream_Open:" ));
+ FT_TRACE1(( " opened `%s' (%d bytes) successfully\n",
+ filepathname, stream->size ));
+//#endif
+
+ return FT_Err_Ok;
+ }
+
+#endif /* !FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT */
+
+#ifdef FT_DEBUG_MEMORY
+
+ extern FT_Int
+ ft_mem_debug_init( FT_Memory memory );
+
+ extern void
+ ft_mem_debug_done( FT_Memory memory );
+
+#endif
+
+
+ /* documentation is in ftobjs.h */
+
+ FT_BASE_DEF( FT_Memory )
+ FT_New_Memory( void )
+ {
+ FT_Memory memory;
+
+
+ memory = (FT_Memory)FXMEM_DefaultAlloc( sizeof ( *memory ), 0 );
+ if ( memory )
+ {
+ memory->user = 0;
+ memory->alloc = ft_alloc;
+#ifdef _XYQ_MEM_DEBUG
+ memory->allocdebug = ft_allocdebug;
+#endif
+ memory->realloc = ft_realloc;
+ memory->free = ft_free;
+#ifdef FT_DEBUG_MEMORY
+ ft_mem_debug_init( memory );
+#endif
+ }
+
+ return memory;
+ }
+
+
+ /* documentation is in ftobjs.h */
+
+ FT_BASE_DEF( void )
+ FT_Done_Memory( FT_Memory memory )
+ {
+#ifdef FT_DEBUG_MEMORY
+ ft_mem_debug_done( memory );
+#endif
+ FXMEM_DefaultFree( memory, 0 );
+ }
+
+
+/* END */
+#endif
+
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/md5.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/md5.c
new file mode 100644
index 0000000000..2f01c9302c
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/md5.c
@@ -0,0 +1,295 @@
+/*
+ * This is an OpenSSL-compatible implementation of the RSA Data Security, Inc.
+ * MD5 Message-Digest Algorithm (RFC 1321).
+ *
+ * Homepage:
+ * http://openwall.info/wiki/people/solar/software/public-domain-source-code/md5
+ *
+ * Author:
+ * Alexander Peslyak, better known as Solar Designer <solar at openwall.com>
+ *
+ * This software was written by Alexander Peslyak in 2001. No copyright is
+ * claimed, and the software is hereby placed in the public domain.
+ * In case this attempt to disclaim copyright and place the software in the
+ * public domain is deemed null and void, then the software is
+ * Copyright (c) 2001 Alexander Peslyak and it is hereby released to the
+ * general public under the following terms:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted.
+ *
+ * There's ABSOLUTELY NO WARRANTY, express or implied.
+ *
+ * (This is a heavily cut-down "BSD license".)
+ *
+ * This differs from Colin Plumb's older public domain implementation in that
+ * no exactly 32-bit integer data type is required (any 32-bit or wider
+ * unsigned integer data type will do), there's no compile-time endianness
+ * configuration, and the function prototypes match OpenSSL's. No code from
+ * Colin Plumb's implementation has been reused; this comment merely compares
+ * the properties of the two independent implementations.
+ *
+ * The primary goals of this implementation are portability and ease of use.
+ * It is meant to be fast, but not as fast as possible. Some known
+ * optimizations are not included to reduce source code size and avoid
+ * compile-time configuration.
+ */
+
+#ifndef HAVE_OPENSSL
+
+#include <string.h>
+
+#include "md5.h"
+
+/*
+ * The basic MD5 functions.
+ *
+ * F and G are optimized compared to their RFC 1321 definitions for
+ * architectures that lack an AND-NOT instruction, just like in Colin Plumb's
+ * implementation.
+ */
+#define F(x, y, z) ((z) ^ ((x) & ((y) ^ (z))))
+#define G(x, y, z) ((y) ^ ((z) & ((x) ^ (y))))
+#define H(x, y, z) ((x) ^ (y) ^ (z))
+#define I(x, y, z) ((y) ^ ((x) | ~(z)))
+
+/*
+ * The MD5 transformation for all four rounds.
+ */
+#define STEP(f, a, b, c, d, x, t, s) \
+ (a) += f((b), (c), (d)) + (x) + (t); \
+ (a) = (((a) << (s)) | (((a) & 0xffffffff) >> (32 - (s)))); \
+ (a) += (b);
+
+/*
+ * SET reads 4 input bytes in little-endian byte order and stores them
+ * in a properly aligned word in host byte order.
+ *
+ * The check for little-endian architectures that tolerate unaligned
+ * memory accesses is just an optimization. Nothing will break if it
+ * doesn't work.
+ */
+#if defined(__i386__) || defined(__x86_64__) || defined(__vax__)
+#define SET(n) \
+ (*(MD5_u32plus *)&ptr[(n) * 4])
+#define GET(n) \
+ SET(n)
+#else
+#define SET(n) \
+ (ctx->block[(n)] = \
+ (MD5_u32plus)ptr[(n) * 4] | \
+ ((MD5_u32plus)ptr[(n) * 4 + 1] << 8) | \
+ ((MD5_u32plus)ptr[(n) * 4 + 2] << 16) | \
+ ((MD5_u32plus)ptr[(n) * 4 + 3] << 24))
+#define GET(n) \
+ (ctx->block[(n)])
+#endif
+
+/*
+ * This processes one or more 64-byte data blocks, but does NOT update
+ * the bit counters. There are no alignment requirements.
+ */
+static void *body(MD5_CTX *ctx, void *data, unsigned long size)
+{
+ unsigned char *ptr;
+ MD5_u32plus a, b, c, d;
+ MD5_u32plus saved_a, saved_b, saved_c, saved_d;
+
+ ptr = (unsigned char *)data;
+
+ a = ctx->a;
+ b = ctx->b;
+ c = ctx->c;
+ d = ctx->d;
+
+ do {
+ saved_a = a;
+ saved_b = b;
+ saved_c = c;
+ saved_d = d;
+
+/* Round 1 */
+ STEP(F, a, b, c, d, SET(0), 0xd76aa478, 7)
+ STEP(F, d, a, b, c, SET(1), 0xe8c7b756, 12)
+ STEP(F, c, d, a, b, SET(2), 0x242070db, 17)
+ STEP(F, b, c, d, a, SET(3), 0xc1bdceee, 22)
+ STEP(F, a, b, c, d, SET(4), 0xf57c0faf, 7)
+ STEP(F, d, a, b, c, SET(5), 0x4787c62a, 12)
+ STEP(F, c, d, a, b, SET(6), 0xa8304613, 17)
+ STEP(F, b, c, d, a, SET(7), 0xfd469501, 22)
+ STEP(F, a, b, c, d, SET(8), 0x698098d8, 7)
+ STEP(F, d, a, b, c, SET(9), 0x8b44f7af, 12)
+ STEP(F, c, d, a, b, SET(10), 0xffff5bb1, 17)
+ STEP(F, b, c, d, a, SET(11), 0x895cd7be, 22)
+ STEP(F, a, b, c, d, SET(12), 0x6b901122, 7)
+ STEP(F, d, a, b, c, SET(13), 0xfd987193, 12)
+ STEP(F, c, d, a, b, SET(14), 0xa679438e, 17)
+ STEP(F, b, c, d, a, SET(15), 0x49b40821, 22)
+
+/* Round 2 */
+ STEP(G, a, b, c, d, GET(1), 0xf61e2562, 5)
+ STEP(G, d, a, b, c, GET(6), 0xc040b340, 9)
+ STEP(G, c, d, a, b, GET(11), 0x265e5a51, 14)
+ STEP(G, b, c, d, a, GET(0), 0xe9b6c7aa, 20)
+ STEP(G, a, b, c, d, GET(5), 0xd62f105d, 5)
+ STEP(G, d, a, b, c, GET(10), 0x02441453, 9)
+ STEP(G, c, d, a, b, GET(15), 0xd8a1e681, 14)
+ STEP(G, b, c, d, a, GET(4), 0xe7d3fbc8, 20)
+ STEP(G, a, b, c, d, GET(9), 0x21e1cde6, 5)
+ STEP(G, d, a, b, c, GET(14), 0xc33707d6, 9)
+ STEP(G, c, d, a, b, GET(3), 0xf4d50d87, 14)
+ STEP(G, b, c, d, a, GET(8), 0x455a14ed, 20)
+ STEP(G, a, b, c, d, GET(13), 0xa9e3e905, 5)
+ STEP(G, d, a, b, c, GET(2), 0xfcefa3f8, 9)
+ STEP(G, c, d, a, b, GET(7), 0x676f02d9, 14)
+ STEP(G, b, c, d, a, GET(12), 0x8d2a4c8a, 20)
+
+/* Round 3 */
+ STEP(H, a, b, c, d, GET(5), 0xfffa3942, 4)
+ STEP(H, d, a, b, c, GET(8), 0x8771f681, 11)
+ STEP(H, c, d, a, b, GET(11), 0x6d9d6122, 16)
+ STEP(H, b, c, d, a, GET(14), 0xfde5380c, 23)
+ STEP(H, a, b, c, d, GET(1), 0xa4beea44, 4)
+ STEP(H, d, a, b, c, GET(4), 0x4bdecfa9, 11)
+ STEP(H, c, d, a, b, GET(7), 0xf6bb4b60, 16)
+ STEP(H, b, c, d, a, GET(10), 0xbebfbc70, 23)
+ STEP(H, a, b, c, d, GET(13), 0x289b7ec6, 4)
+ STEP(H, d, a, b, c, GET(0), 0xeaa127fa, 11)
+ STEP(H, c, d, a, b, GET(3), 0xd4ef3085, 16)
+ STEP(H, b, c, d, a, GET(6), 0x04881d05, 23)
+ STEP(H, a, b, c, d, GET(9), 0xd9d4d039, 4)
+ STEP(H, d, a, b, c, GET(12), 0xe6db99e5, 11)
+ STEP(H, c, d, a, b, GET(15), 0x1fa27cf8, 16)
+ STEP(H, b, c, d, a, GET(2), 0xc4ac5665, 23)
+
+/* Round 4 */
+ STEP(I, a, b, c, d, GET(0), 0xf4292244, 6)
+ STEP(I, d, a, b, c, GET(7), 0x432aff97, 10)
+ STEP(I, c, d, a, b, GET(14), 0xab9423a7, 15)
+ STEP(I, b, c, d, a, GET(5), 0xfc93a039, 21)
+ STEP(I, a, b, c, d, GET(12), 0x655b59c3, 6)
+ STEP(I, d, a, b, c, GET(3), 0x8f0ccc92, 10)
+ STEP(I, c, d, a, b, GET(10), 0xffeff47d, 15)
+ STEP(I, b, c, d, a, GET(1), 0x85845dd1, 21)
+ STEP(I, a, b, c, d, GET(8), 0x6fa87e4f, 6)
+ STEP(I, d, a, b, c, GET(15), 0xfe2ce6e0, 10)
+ STEP(I, c, d, a, b, GET(6), 0xa3014314, 15)
+ STEP(I, b, c, d, a, GET(13), 0x4e0811a1, 21)
+ STEP(I, a, b, c, d, GET(4), 0xf7537e82, 6)
+ STEP(I, d, a, b, c, GET(11), 0xbd3af235, 10)
+ STEP(I, c, d, a, b, GET(2), 0x2ad7d2bb, 15)
+ STEP(I, b, c, d, a, GET(9), 0xeb86d391, 21)
+
+ a += saved_a;
+ b += saved_b;
+ c += saved_c;
+ d += saved_d;
+
+ ptr += 64;
+ } while (size -= 64);
+
+ ctx->a = a;
+ ctx->b = b;
+ ctx->c = c;
+ ctx->d = d;
+
+ return ptr;
+}
+
+void MD5_Init(MD5_CTX *ctx)
+{
+ ctx->a = 0x67452301;
+ ctx->b = 0xefcdab89;
+ ctx->c = 0x98badcfe;
+ ctx->d = 0x10325476;
+
+ ctx->lo = 0;
+ ctx->hi = 0;
+}
+
+void MD5_Update(MD5_CTX *ctx, void *data, unsigned long size)
+{
+ MD5_u32plus saved_lo;
+ unsigned long used, free;
+
+ saved_lo = ctx->lo;
+ if ((ctx->lo = (saved_lo + size) & 0x1fffffff) < saved_lo)
+ ctx->hi++;
+ ctx->hi += size >> 29;
+
+ used = saved_lo & 0x3f;
+
+ if (used) {
+ free = 64 - used;
+
+ if (size < free) {
+ memcpy(&ctx->buffer[used], data, size);
+ return;
+ }
+
+ memcpy(&ctx->buffer[used], data, free);
+ data = (unsigned char *)data + free;
+ size -= free;
+ body(ctx, ctx->buffer, 64);
+ }
+
+ if (size >= 64) {
+ data = body(ctx, data, size & ~(unsigned long)0x3f);
+ size &= 0x3f;
+ }
+
+ memcpy(ctx->buffer, data, size);
+}
+
+void MD5_Final(unsigned char *result, MD5_CTX *ctx)
+{
+ unsigned long used, free;
+
+ used = ctx->lo & 0x3f;
+
+ ctx->buffer[used++] = 0x80;
+
+ free = 64 - used;
+
+ if (free < 8) {
+ memset(&ctx->buffer[used], 0, free);
+ body(ctx, ctx->buffer, 64);
+ used = 0;
+ free = 64;
+ }
+
+ memset(&ctx->buffer[used], 0, free - 8);
+
+ ctx->lo <<= 3;
+ ctx->buffer[56] = ctx->lo;
+ ctx->buffer[57] = ctx->lo >> 8;
+ ctx->buffer[58] = ctx->lo >> 16;
+ ctx->buffer[59] = ctx->lo >> 24;
+ ctx->buffer[60] = ctx->hi;
+ ctx->buffer[61] = ctx->hi >> 8;
+ ctx->buffer[62] = ctx->hi >> 16;
+ ctx->buffer[63] = ctx->hi >> 24;
+
+ body(ctx, ctx->buffer, 64);
+
+ result[0] = ctx->a;
+ result[1] = ctx->a >> 8;
+ result[2] = ctx->a >> 16;
+ result[3] = ctx->a >> 24;
+ result[4] = ctx->b;
+ result[5] = ctx->b >> 8;
+ result[6] = ctx->b >> 16;
+ result[7] = ctx->b >> 24;
+ result[8] = ctx->c;
+ result[9] = ctx->c >> 8;
+ result[10] = ctx->c >> 16;
+ result[11] = ctx->c >> 24;
+ result[12] = ctx->d;
+ result[13] = ctx->d >> 8;
+ result[14] = ctx->d >> 16;
+ result[15] = ctx->d >> 24;
+
+ memset(ctx, 0, sizeof(*ctx));
+}
+
+#endif
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/md5.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/md5.h
new file mode 100644
index 0000000000..f1a6857640
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/md5.h
@@ -0,0 +1,45 @@
+/*
+ * This is an OpenSSL-compatible implementation of the RSA Data Security, Inc.
+ * MD5 Message-Digest Algorithm (RFC 1321).
+ *
+ * Homepage:
+ * http://openwall.info/wiki/people/solar/software/public-domain-source-code/md5
+ *
+ * Author:
+ * Alexander Peslyak, better known as Solar Designer <solar at openwall.com>
+ *
+ * This software was written by Alexander Peslyak in 2001. No copyright is
+ * claimed, and the software is hereby placed in the public domain.
+ * In case this attempt to disclaim copyright and place the software in the
+ * public domain is deemed null and void, then the software is
+ * Copyright (c) 2001 Alexander Peslyak and it is hereby released to the
+ * general public under the following terms:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted.
+ *
+ * There's ABSOLUTELY NO WARRANTY, express or implied.
+ *
+ * See md5.c for more information.
+ */
+
+#ifdef HAVE_OPENSSL
+#include <openssl/md5.h>
+#elif !defined(_MD5_H)
+#define _MD5_H
+
+/* Any 32-bit or wider unsigned integer data type will do */
+typedef unsigned int MD5_u32plus;
+
+typedef struct {
+ MD5_u32plus lo, hi;
+ MD5_u32plus a, b, c, d;
+ unsigned char buffer[64];
+ MD5_u32plus block[16];
+} MD5_CTX;
+
+extern void MD5_Init(MD5_CTX *ctx);
+extern void MD5_Update(MD5_CTX *ctx, void *data, unsigned long size);
+extern void MD5_Final(unsigned char *result, MD5_CTX *ctx);
+
+#endif
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/base/rules.mk b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/rules.mk
new file mode 100644
index 0000000000..e932191157
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/base/rules.mk
@@ -0,0 +1,99 @@
+#
+# FreeType 2 base layer configuration rules
+#
+
+
+# Copyright 1996-2000, 2002-2009, 2013 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT. By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+
+# It sets the following variables which are used by the master Makefile
+# after the call:
+#
+# BASE_OBJ_S: The single-object base layer.
+# BASE_OBJ_M: A list of all objects for a multiple-objects build.
+# BASE_EXT_OBJ: A list of base layer extensions, i.e., components found
+# in `freetype/src/base' which are not compiled within the
+# base layer proper.
+
+
+BASE_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(SRC_DIR)/base)
+
+
+# Base layer sources
+#
+# ftsystem, ftinit, and ftdebug are handled by freetype.mk
+#
+# All files listed here should be included in `ftbase.c' (for a `single'
+# build).
+#
+BASE_SRC := $(BASE_DIR)/ftadvanc.c \
+ $(BASE_DIR)/ftcalc.c \
+ $(BASE_DIR)/ftdbgmem.c \
+ $(BASE_DIR)/ftgloadr.c \
+ $(BASE_DIR)/ftobjs.c \
+ $(BASE_DIR)/ftoutln.c \
+ $(BASE_DIR)/ftrfork.c \
+ $(BASE_DIR)/ftsnames.c \
+ $(BASE_DIR)/ftstream.c \
+ $(BASE_DIR)/fttrigon.c \
+ $(BASE_DIR)/ftutil.c
+
+
+ifneq ($(ftmac_c),)
+ BASE_SRC += $(BASE_DIR)/$(ftmac_c)
+endif
+
+# for simplicity, we also handle `md5.c' (which gets included by `ftobjs.h')
+BASE_H := $(BASE_DIR)/ftbase.h \
+ $(BASE_DIR)/md5.c \
+ $(BASE_DIR)/md5.h
+
+# Base layer `extensions' sources
+#
+# An extension is added to the library file as a separate object. It is
+# then linked to the final executable only if one of its symbols is used by
+# the application.
+#
+BASE_EXT_SRC := $(patsubst %,$(BASE_DIR)/%,$(BASE_EXTENSIONS))
+
+# Default extensions objects
+#
+BASE_EXT_OBJ := $(BASE_EXT_SRC:$(BASE_DIR)/%.c=$(OBJ_DIR)/%.$O)
+
+
+# Base layer object(s)
+#
+# BASE_OBJ_M is used during `multi' builds (each base source file compiles
+# to a single object file).
+#
+# BASE_OBJ_S is used during `single' builds (the whole base layer is
+# compiled as a single object file using ftbase.c).
+#
+BASE_OBJ_M := $(BASE_SRC:$(BASE_DIR)/%.c=$(OBJ_DIR)/%.$O)
+BASE_OBJ_S := $(OBJ_DIR)/ftbase.$O
+
+# Base layer root source file for single build
+#
+BASE_SRC_S := $(BASE_DIR)/ftbase.c
+
+
+# Base layer - single object build
+#
+$(BASE_OBJ_S): $(BASE_SRC_S) $(BASE_SRC) $(FREETYPE_H) $(BASE_H)
+ $(BASE_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(BASE_SRC_S))
+
+
+# Multiple objects build + extensions
+#
+$(OBJ_DIR)/%.$O: $(BASE_DIR)/%.c $(FREETYPE_H) $(BASE_H)
+ $(BASE_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)
+
+
+# EOF
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/Jamfile b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/Jamfile
new file mode 100644
index 0000000000..6705d3cfdb
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/Jamfile
@@ -0,0 +1,29 @@
+# FreeType 2 src/cff Jamfile
+#
+# Copyright 2001, 2002 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT. By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+SubDir FT2_TOP $(FT2_SRC_DIR) cff ;
+
+{
+ local _sources ;
+
+ if $(FT2_MULTI)
+ {
+ _sources = cffdrivr cffgload cffload cffobjs cffparse cffcmap cffpic ;
+ }
+ else
+ {
+ _sources = cff ;
+ }
+
+ Library $(FT2_LIB) : $(_sources).c ;
+}
+
+# end of src/cff Jamfile
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2arrst.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2arrst.c
new file mode 100644
index 0000000000..fa967ebd97
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2arrst.c
@@ -0,0 +1,241 @@
+/***************************************************************************/
+/* */
+/* cf2arrst.c */
+/* */
+/* Adobe's code for Array Stacks (body). */
+/* */
+/* Copyright 2007-2013 Adobe Systems Incorporated. */
+/* */
+/* This software, and all works of authorship, whether in source or */
+/* object code form as indicated by the copyright notice(s) included */
+/* herein (collectively, the "Work") is made available, and may only be */
+/* used, modified, and distributed under the FreeType Project License, */
+/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */
+/* FreeType Project License, each contributor to the Work hereby grants */
+/* to any individual or legal entity exercising permissions granted by */
+/* the FreeType Project License and this section (hereafter, "You" or */
+/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */
+/* royalty-free, irrevocable (except as stated in this section) patent */
+/* license to make, have made, use, offer to sell, sell, import, and */
+/* otherwise transfer the Work, where such license applies only to those */
+/* patent claims licensable by such contributor that are necessarily */
+/* infringed by their contribution(s) alone or by combination of their */
+/* contribution(s) with the Work to which such contribution(s) was */
+/* submitted. If You institute patent litigation against any entity */
+/* (including a cross-claim or counterclaim in a lawsuit) alleging that */
+/* the Work or a contribution incorporated within the Work constitutes */
+/* direct or contributory patent infringement, then any patent licenses */
+/* granted to You under this License for that Work shall terminate as of */
+/* the date such litigation is filed. */
+/* */
+/* By using, modifying, or distributing the Work you indicate that you */
+/* have read and understood the terms and conditions of the */
+/* FreeType Project License as well as those provided in this section, */
+/* and you accept them fully. */
+/* */
+/***************************************************************************/
+
+
+#include "cf2ft.h"
+#include "../../include/freetype/internal/ftdebug.h"
+
+#include "cf2glue.h"
+#include "cf2arrst.h"
+
+#include "cf2error.h"
+
+
+ /*
+ * CF2_ArrStack uses an error pointer, to enable shared errors.
+ * Shared errors are necessary when multiple objects allow the program
+ * to continue after detecting errors. Only the first error should be
+ * recorded.
+ */
+
+ FT_LOCAL_DEF( void )
+ cf2_arrstack_init( CF2_ArrStack arrstack,
+ FT_Memory memory,
+ FT_Error* error,
+ size_t sizeItem )
+ {
+ FT_ASSERT( arrstack != NULL );
+
+ /* initialize the structure */
+ arrstack->memory = memory;
+ arrstack->error = error;
+ arrstack->sizeItem = sizeItem;
+ arrstack->allocated = 0;
+ arrstack->chunk = 10; /* chunks of 10 items */
+ arrstack->count = 0;
+ arrstack->totalSize = 0;
+ arrstack->ptr = NULL;
+ }
+
+
+ FT_LOCAL_DEF( void )
+ cf2_arrstack_finalize( CF2_ArrStack arrstack )
+ {
+ FT_Memory memory = arrstack->memory; /* for FT_FREE */
+
+
+ FT_ASSERT( arrstack != NULL );
+
+ arrstack->allocated = 0;
+ arrstack->count = 0;
+ arrstack->totalSize = 0;
+
+ /* free the data buffer */
+ FT_FREE( arrstack->ptr );
+ }
+
+
+ /* allocate or reallocate the buffer size; */
+ /* return false on memory error */
+ static FT_Bool
+ cf2_arrstack_setNumElements( CF2_ArrStack arrstack,
+ size_t numElements )
+ {
+ FT_ASSERT( arrstack != NULL );
+
+ {
+ FT_Error error = FT_Err_Ok; /* for FT_REALLOC */
+ FT_Memory memory = arrstack->memory; /* for FT_REALLOC */
+
+ FT_Long newSize = (FT_Long)( numElements * arrstack->sizeItem );
+
+
+ if ( numElements > LONG_MAX / arrstack->sizeItem )
+ goto exit;
+
+
+ FT_ASSERT( newSize > 0 ); /* avoid realloc with zero size */
+
+ if ( !FT_REALLOC( arrstack->ptr, arrstack->totalSize, newSize ) )
+ {
+ arrstack->allocated = numElements;
+ arrstack->totalSize = newSize;
+
+ if ( arrstack->count > numElements )
+ {
+ /* we truncated the list! */
+ CF2_SET_ERROR( arrstack->error, Stack_Overflow );
+ arrstack->count = numElements;
+ return FALSE;
+ }
+
+ return TRUE; /* success */
+ }
+ }
+
+ exit:
+ /* if there's not already an error, store this one */
+ CF2_SET_ERROR( arrstack->error, Out_Of_Memory );
+
+ return FALSE;
+ }
+
+
+ /* set the count, ensuring allocation is sufficient */
+ FT_LOCAL_DEF( void )
+ cf2_arrstack_setCount( CF2_ArrStack arrstack,
+ size_t numElements )
+ {
+ FT_ASSERT( arrstack != NULL );
+
+ if ( numElements > arrstack->allocated )
+ {
+ /* expand the allocation first */
+ if ( !cf2_arrstack_setNumElements( arrstack, numElements ) )
+ return;
+ }
+
+ arrstack->count = numElements;
+ }
+
+
+ /* clear the count */
+ FT_LOCAL_DEF( void )
+ cf2_arrstack_clear( CF2_ArrStack arrstack )
+ {
+ FT_ASSERT( arrstack != NULL );
+
+ arrstack->count = 0;
+ }
+
+
+ /* current number of items */
+ FT_LOCAL_DEF( size_t )
+ cf2_arrstack_size( const CF2_ArrStack arrstack )
+ {
+ FT_ASSERT( arrstack != NULL );
+
+ return arrstack->count;
+ }
+
+
+ FT_LOCAL_DEF( void* )
+ cf2_arrstack_getBuffer( const CF2_ArrStack arrstack )
+ {
+ FT_ASSERT( arrstack != NULL );
+
+ return arrstack->ptr;
+ }
+
+
+ /* return pointer to the given element */
+ FT_LOCAL_DEF( void* )
+ cf2_arrstack_getPointer( const CF2_ArrStack arrstack,
+ size_t idx )
+ {
+ void* newPtr;
+
+
+ FT_ASSERT( arrstack != NULL );
+
+ if ( idx >= arrstack->count )
+ {
+ /* overflow */
+ CF2_SET_ERROR( arrstack->error, Stack_Overflow );
+ idx = 0; /* choose safe default */
+ }
+
+ newPtr = (FT_Byte*)arrstack->ptr + idx * arrstack->sizeItem;
+
+ return newPtr;
+ }
+
+
+ /* push (append) an element at the end of the list; */
+ /* return false on memory error */
+ /* TODO: should there be a length param for extra checking? */
+ FT_LOCAL_DEF( void )
+ cf2_arrstack_push( CF2_ArrStack arrstack,
+ const void* ptr )
+ {
+ FT_ASSERT( arrstack != NULL );
+
+ if ( arrstack->count == arrstack->allocated )
+ {
+ /* grow the buffer by one chunk */
+ if ( !cf2_arrstack_setNumElements(
+ arrstack, arrstack->allocated + arrstack->chunk ) )
+ {
+ /* on error, ignore the push */
+ return;
+ }
+ }
+
+ FT_ASSERT( ptr != NULL );
+
+ {
+ size_t offset = arrstack->count * arrstack->sizeItem;
+ void* newPtr = (FT_Byte*)arrstack->ptr + offset;
+
+
+ FT_MEM_COPY( newPtr, ptr, arrstack->sizeItem );
+ arrstack->count += 1;
+ }
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2arrst.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2arrst.h
new file mode 100644
index 0000000000..ff5ad8b126
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2arrst.h
@@ -0,0 +1,100 @@
+/***************************************************************************/
+/* */
+/* cf2arrst.h */
+/* */
+/* Adobe's code for Array Stacks (specification). */
+/* */
+/* Copyright 2007-2013 Adobe Systems Incorporated. */
+/* */
+/* This software, and all works of authorship, whether in source or */
+/* object code form as indicated by the copyright notice(s) included */
+/* herein (collectively, the "Work") is made available, and may only be */
+/* used, modified, and distributed under the FreeType Project License, */
+/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */
+/* FreeType Project License, each contributor to the Work hereby grants */
+/* to any individual or legal entity exercising permissions granted by */
+/* the FreeType Project License and this section (hereafter, "You" or */
+/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */
+/* royalty-free, irrevocable (except as stated in this section) patent */
+/* license to make, have made, use, offer to sell, sell, import, and */
+/* otherwise transfer the Work, where such license applies only to those */
+/* patent claims licensable by such contributor that are necessarily */
+/* infringed by their contribution(s) alone or by combination of their */
+/* contribution(s) with the Work to which such contribution(s) was */
+/* submitted. If You institute patent litigation against any entity */
+/* (including a cross-claim or counterclaim in a lawsuit) alleging that */
+/* the Work or a contribution incorporated within the Work constitutes */
+/* direct or contributory patent infringement, then any patent licenses */
+/* granted to You under this License for that Work shall terminate as of */
+/* the date such litigation is filed. */
+/* */
+/* By using, modifying, or distributing the Work you indicate that you */
+/* have read and understood the terms and conditions of the */
+/* FreeType Project License as well as those provided in this section, */
+/* and you accept them fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __CF2ARRST_H__
+#define __CF2ARRST_H__
+
+
+#include "cf2error.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /* need to define the struct here (not opaque) so it can be allocated by */
+ /* clients */
+ typedef struct CF2_ArrStackRec_
+ {
+ FT_Memory memory;
+ FT_Error* error;
+
+ size_t sizeItem; /* bytes per element */
+ size_t allocated; /* items allocated */
+ size_t chunk; /* allocation increment in items */
+ size_t count; /* number of elements allocated */
+ size_t totalSize; /* total bytes allocated */
+
+ void* ptr; /* ptr to data */
+
+ } CF2_ArrStackRec, *CF2_ArrStack;
+
+
+ FT_LOCAL( void )
+ cf2_arrstack_init( CF2_ArrStack arrstack,
+ FT_Memory memory,
+ FT_Error* error,
+ size_t sizeItem );
+ FT_LOCAL( void )
+ cf2_arrstack_finalize( CF2_ArrStack arrstack );
+
+ FT_LOCAL( void )
+ cf2_arrstack_setCount( CF2_ArrStack arrstack,
+ size_t numElements );
+ FT_LOCAL( void )
+ cf2_arrstack_clear( CF2_ArrStack arrstack );
+ FT_LOCAL( size_t )
+ cf2_arrstack_size( const CF2_ArrStack arrstack );
+
+ FT_LOCAL( void* )
+ cf2_arrstack_getBuffer( const CF2_ArrStack arrstack );
+ FT_LOCAL( void* )
+ cf2_arrstack_getPointer( const CF2_ArrStack arrstack,
+ size_t idx );
+
+ FT_LOCAL( void )
+ cf2_arrstack_push( CF2_ArrStack arrstack,
+ const void* ptr );
+
+
+FT_END_HEADER
+
+
+#endif /* __CF2ARRST_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2blues.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2blues.c
new file mode 100644
index 0000000000..82943428e4
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2blues.c
@@ -0,0 +1,578 @@
+/***************************************************************************/
+/* */
+/* cf2blues.c */
+/* */
+/* Adobe's code for handling Blue Zones (body). */
+/* */
+/* Copyright 2009-2013 Adobe Systems Incorporated. */
+/* */
+/* This software, and all works of authorship, whether in source or */
+/* object code form as indicated by the copyright notice(s) included */
+/* herein (collectively, the "Work") is made available, and may only be */
+/* used, modified, and distributed under the FreeType Project License, */
+/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */
+/* FreeType Project License, each contributor to the Work hereby grants */
+/* to any individual or legal entity exercising permissions granted by */
+/* the FreeType Project License and this section (hereafter, "You" or */
+/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */
+/* royalty-free, irrevocable (except as stated in this section) patent */
+/* license to make, have made, use, offer to sell, sell, import, and */
+/* otherwise transfer the Work, where such license applies only to those */
+/* patent claims licensable by such contributor that are necessarily */
+/* infringed by their contribution(s) alone or by combination of their */
+/* contribution(s) with the Work to which such contribution(s) was */
+/* submitted. If You institute patent litigation against any entity */
+/* (including a cross-claim or counterclaim in a lawsuit) alleging that */
+/* the Work or a contribution incorporated within the Work constitutes */
+/* direct or contributory patent infringement, then any patent licenses */
+/* granted to You under this License for that Work shall terminate as of */
+/* the date such litigation is filed. */
+/* */
+/* By using, modifying, or distributing the Work you indicate that you */
+/* have read and understood the terms and conditions of the */
+/* FreeType Project License as well as those provided in this section, */
+/* and you accept them fully. */
+/* */
+/***************************************************************************/
+
+
+#include "cf2ft.h"
+#include "../../include/freetype/internal/ftdebug.h"
+
+#include "cf2blues.h"
+#include "cf2hints.h"
+#include "cf2font.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_cf2blues
+
+
+ /*
+ * For blue values, the FreeType parser produces an array of integers,
+ * while the Adobe CFF engine produces an array of fixed.
+ * Define a macro to convert FreeType to fixed.
+ */
+#define cf2_blueToFixed( x ) cf2_intToFixed( x )
+
+
+ FT_LOCAL_DEF( void )
+ cf2_blues_init( CF2_Blues blues,
+ CF2_Font font )
+ {
+ /* pointer to parsed font object */
+ CFF_Decoder* decoder = font->decoder;
+
+ CF2_Fixed zoneHeight;
+ CF2_Fixed maxZoneHeight = 0;
+ CF2_Fixed csUnitsPerPixel;
+
+ size_t numBlueValues;
+ size_t numOtherBlues;
+ size_t numFamilyBlues;
+ size_t numFamilyOtherBlues;
+
+ FT_Pos* blueValues;
+ FT_Pos* otherBlues;
+ FT_Pos* familyBlues;
+ FT_Pos* familyOtherBlues;
+
+ size_t i;
+ CF2_Fixed emBoxBottom, emBoxTop;
+
+ CF2_Int unitsPerEm = font->unitsPerEm;
+
+
+ if ( unitsPerEm == 0 )
+ unitsPerEm = 1000;
+
+ FT_ZERO( blues );
+ blues->scale = font->innerTransform.d;
+
+ cf2_getBlueMetrics( decoder,
+ &blues->blueScale,
+ &blues->blueShift,
+ &blues->blueFuzz );
+
+ cf2_getBlueValues( decoder, &numBlueValues, &blueValues );
+ cf2_getOtherBlues( decoder, &numOtherBlues, &otherBlues );
+ cf2_getFamilyBlues( decoder, &numFamilyBlues, &familyBlues );
+ cf2_getFamilyOtherBlues( decoder, &numFamilyOtherBlues, &familyOtherBlues );
+
+ /*
+ * synthetic em box hint heuristic
+ *
+ * Apply this when ideographic dictionary (LanguageGroup 1) has no
+ * real alignment zones. Adobe tools generate dummy zones at -250 and
+ * 1100 for a 1000 unit em. Fonts with ICF-based alignment zones
+ * should not enable the heuristic. When the heuristic is enabled,
+ * the font's blue zones are ignored.
+ *
+ */
+
+ /* get em box from OS/2 typoAscender/Descender */
+ /* TODO: FreeType does not parse these metrics. Skip them for now. */
+#if 0
+ FCM_getHorizontalLineMetrics( &e,
+ font->font,
+ &ascender,
+ &descender,
+ &linegap );
+ if ( ascender - descender == unitsPerEm )
+ {
+ emBoxBottom = cf2_intToFixed( descender );
+ emBoxTop = cf2_intToFixed( ascender );
+ }
+ else
+#endif
+ {
+ emBoxBottom = CF2_ICF_Bottom;
+ emBoxTop = CF2_ICF_Top;
+ }
+
+ if ( cf2_getLanguageGroup( decoder ) == 1 &&
+ ( numBlueValues == 0 ||
+ ( numBlueValues == 4 &&
+ cf2_blueToFixed( blueValues[0] ) < emBoxBottom &&
+ cf2_blueToFixed( blueValues[1] ) < emBoxBottom &&
+ cf2_blueToFixed( blueValues[2] ) > emBoxTop &&
+ cf2_blueToFixed( blueValues[3] ) > emBoxTop ) ) )
+ {
+ /*
+ * Construct hint edges suitable for synthetic ghost hints at top
+ * and bottom of em box. +-CF2_MIN_COUNTER allows for unhinted
+ * features above or below the last hinted edge. This also gives a
+ * net 1 pixel boost to the height of ideographic glyphs.
+ *
+ * Note: Adjust synthetic hints outward by epsilon (0x.0001) to
+ * avoid interference. E.g., some fonts have real hints at
+ * 880 and -120.
+ */
+
+ blues->emBoxBottomEdge.csCoord = emBoxBottom - CF2_FIXED_EPSILON;
+ blues->emBoxBottomEdge.dsCoord = cf2_fixedRound(
+ FT_MulFix(
+ blues->emBoxBottomEdge.csCoord,
+ blues->scale ) ) -
+ CF2_MIN_COUNTER;
+ blues->emBoxBottomEdge.scale = blues->scale;
+ blues->emBoxBottomEdge.flags = CF2_GhostBottom |
+ CF2_Locked |
+ CF2_Synthetic;
+
+ blues->emBoxTopEdge.csCoord = emBoxTop + CF2_FIXED_EPSILON +
+ 2 * font->darkenY;
+ blues->emBoxTopEdge.dsCoord = cf2_fixedRound(
+ FT_MulFix(
+ blues->emBoxTopEdge.csCoord,
+ blues->scale ) ) +
+ CF2_MIN_COUNTER;
+ blues->emBoxTopEdge.scale = blues->scale;
+ blues->emBoxTopEdge.flags = CF2_GhostTop |
+ CF2_Locked |
+ CF2_Synthetic;
+
+ blues->doEmBoxHints = TRUE; /* enable the heuristic */
+
+ return;
+ }
+
+ /* copy `BlueValues' and `OtherBlues' to a combined array of top and */
+ /* bottom zones */
+ for ( i = 0; i < numBlueValues; i += 2 )
+ {
+ blues->zone[blues->count].csBottomEdge =
+ cf2_blueToFixed( blueValues[i] );
+ blues->zone[blues->count].csTopEdge =
+ cf2_blueToFixed( blueValues[i + 1] );
+
+ zoneHeight = blues->zone[blues->count].csTopEdge -
+ blues->zone[blues->count].csBottomEdge;
+
+ if ( zoneHeight < 0 )
+ {
+ FT_TRACE4(( "cf2_blues_init: ignoring negative zone height\n" ));
+ continue; /* reject this zone */
+ }
+
+ if ( zoneHeight > maxZoneHeight )
+ {
+ /* take maximum before darkening adjustment */
+ /* so overshoot suppression point doesn't change */
+ maxZoneHeight = zoneHeight;
+ }
+
+ /* adjust both edges of top zone upward by twice darkening amount */
+ if ( i != 0 )
+ {
+ blues->zone[blues->count].csTopEdge += 2 * font->darkenY;
+ blues->zone[blues->count].csBottomEdge += 2 * font->darkenY;
+ }
+
+ /* first `BlueValue' is bottom zone; others are top */
+ if ( i == 0 )
+ {
+ blues->zone[blues->count].bottomZone =
+ TRUE;
+ blues->zone[blues->count].csFlatEdge =
+ blues->zone[blues->count].csTopEdge;
+ }
+ else
+ {
+ blues->zone[blues->count].bottomZone =
+ FALSE;
+ blues->zone[blues->count].csFlatEdge =
+ blues->zone[blues->count].csBottomEdge;
+ }
+
+ blues->count += 1;
+ }
+
+ for ( i = 0; i < numOtherBlues; i += 2 )
+ {
+ blues->zone[blues->count].csBottomEdge =
+ cf2_blueToFixed( otherBlues[i] );
+ blues->zone[blues->count].csTopEdge =
+ cf2_blueToFixed( otherBlues[i + 1] );
+
+ zoneHeight = blues->zone[blues->count].csTopEdge -
+ blues->zone[blues->count].csBottomEdge;
+
+ if ( zoneHeight < 0 )
+ {
+ FT_TRACE4(( "cf2_blues_init: ignoring negative zone height\n" ));
+ continue; /* reject this zone */
+ }
+
+ if ( zoneHeight > maxZoneHeight )
+ {
+ /* take maximum before darkening adjustment */
+ /* so overshoot suppression point doesn't change */
+ maxZoneHeight = zoneHeight;
+ }
+
+ /* Note: bottom zones are not adjusted for darkening amount */
+
+ /* all OtherBlues are bottom zone */
+ blues->zone[blues->count].bottomZone =
+ TRUE;
+ blues->zone[blues->count].csFlatEdge =
+ blues->zone[blues->count].csTopEdge;
+
+ blues->count += 1;
+ }
+
+ /* Adjust for FamilyBlues */
+
+ /* Search for the nearest flat edge in `FamilyBlues' or */
+ /* `FamilyOtherBlues'. According to the Black Book, any matching edge */
+ /* must be within one device pixel */
+
+ csUnitsPerPixel = FT_DivFix( cf2_intToFixed( 1 ), blues->scale );
+
+ /* loop on all zones in this font */
+ for ( i = 0; i < blues->count; i++ )
+ {
+ size_t j;
+ CF2_Fixed minDiff;
+ CF2_Fixed flatFamilyEdge, diff;
+ /* value for this font */
+ CF2_Fixed flatEdge = blues->zone[i].csFlatEdge;
+
+
+ if ( blues->zone[i].bottomZone )
+ {
+ /* In a bottom zone, the top edge is the flat edge. */
+ /* Search `FamilyOtherBlues' for bottom zones; look for closest */
+ /* Family edge that is within the one pixel threshold. */
+
+ minDiff = CF2_FIXED_MAX;
+
+ for ( j = 0; j < numFamilyOtherBlues; j += 2 )
+ {
+ /* top edge */
+ flatFamilyEdge = cf2_blueToFixed( familyOtherBlues[j + 1] );
+
+ diff = cf2_fixedAbs( flatEdge - flatFamilyEdge );
+
+ if ( diff < minDiff && diff < csUnitsPerPixel )
+ {
+ blues->zone[i].csFlatEdge = flatFamilyEdge;
+ minDiff = diff;
+
+ if ( diff == 0 )
+ break;
+ }
+ }
+
+ /* check the first member of FamilyBlues, which is a bottom zone */
+ if ( numFamilyBlues >= 2 )
+ {
+ /* top edge */
+ flatFamilyEdge = cf2_blueToFixed( familyBlues[1] );
+
+ diff = cf2_fixedAbs( flatEdge - flatFamilyEdge );
+
+ if ( diff < minDiff && diff < csUnitsPerPixel )
+ blues->zone[i].csFlatEdge = flatFamilyEdge;
+ }
+ }
+ else
+ {
+ /* In a top zone, the bottom edge is the flat edge. */
+ /* Search `FamilyBlues' for top zones; skip first zone, which is a */
+ /* bottom zone; look for closest Family edge that is within the */
+ /* one pixel threshold */
+
+ minDiff = CF2_FIXED_MAX;
+
+ for ( j = 2; j < numFamilyBlues; j += 2 )
+ {
+ /* bottom edge */
+ flatFamilyEdge = cf2_blueToFixed( familyBlues[j] );
+
+ /* adjust edges of top zone upward by twice darkening amount */
+ flatFamilyEdge += 2 * font->darkenY; /* bottom edge */
+
+ diff = cf2_fixedAbs( flatEdge - flatFamilyEdge );
+
+ if ( diff < minDiff && diff < csUnitsPerPixel )
+ {
+ blues->zone[i].csFlatEdge = flatFamilyEdge;
+ minDiff = diff;
+
+ if ( diff == 0 )
+ break;
+ }
+ }
+ }
+ }
+
+ /* TODO: enforce separation of zones, including BlueFuzz */
+
+ /* Adjust BlueScale; similar to AdjustBlueScale() in coretype */
+ /* `bcsetup.c'. */
+
+ if ( maxZoneHeight > 0 )
+ {
+ if ( blues->blueScale > FT_DivFix( cf2_intToFixed( 1 ),
+ maxZoneHeight ) )
+ {
+ /* clamp at maximum scale */
+ blues->blueScale = FT_DivFix( cf2_intToFixed( 1 ),
+ maxZoneHeight );
+ }
+
+ /*
+ * TODO: Revisit the bug fix for 613448. The minimum scale
+ * requirement catches a number of library fonts. For
+ * example, with default BlueScale (.039625) and 0.4 minimum,
+ * the test below catches any font with maxZoneHeight < 10.1.
+ * There are library fonts ranging from 2 to 10 that get
+ * caught, including e.g., Eurostile LT Std Medium with
+ * maxZoneHeight of 6.
+ *
+ */
+#if 0
+ if ( blueScale < .4 / maxZoneHeight )
+ {
+ tetraphilia_assert( 0 );
+ /* clamp at minimum scale, per bug 0613448 fix */
+ blueScale = .4 / maxZoneHeight;
+ }
+#endif
+
+ }
+
+ /*
+ * Suppress overshoot and boost blue zones at small sizes. Boost
+ * amount varies linearly from 0.5 pixel near 0 to 0 pixel at
+ * blueScale cutoff.
+ * Note: This boost amount is different from the coretype heuristic.
+ *
+ */
+
+ if ( blues->scale < blues->blueScale )
+ {
+ blues->suppressOvershoot = TRUE;
+
+ /* Change rounding threshold for `dsFlatEdge'. */
+ /* Note: constant changed from 0.5 to 0.6 to avoid a problem with */
+ /* 10ppem Arial */
+
+ blues->boost = FT_MulFix(
+ cf2_floatToFixed( .6 ),
+ ( cf2_intToFixed( 1 ) -
+ FT_DivFix( blues->scale,
+ blues->blueScale ) ) );
+ if ( blues->boost > 0x7FFF )
+ {
+ /* boost must remain less than 0.5, or baseline could go negative */
+ blues->boost = 0x7FFF;
+ }
+ }
+
+ /* boost and darkening have similar effects; don't do both */
+ if ( font->stemDarkened )
+ blues->boost = 0;
+
+ /* set device space alignment for each zone; */
+ /* apply boost amount before rounding flat edge */
+
+ for ( i = 0; i < blues->count; i++ )
+ {
+ if ( blues->zone[i].bottomZone )
+ blues->zone[i].dsFlatEdge = cf2_fixedRound(
+ FT_MulFix(
+ blues->zone[i].csFlatEdge,
+ blues->scale ) -
+ blues->boost );
+ else
+ blues->zone[i].dsFlatEdge = cf2_fixedRound(
+ FT_MulFix(
+ blues->zone[i].csFlatEdge,
+ blues->scale ) +
+ blues->boost );
+ }
+ }
+
+
+ /*
+ * Check whether `stemHint' is captured by one of the blue zones.
+ *
+ * Zero, one or both edges may be valid; only valid edges can be
+ * captured. For compatibility with CoolType, search top and bottom
+ * zones in the same pass (see `BlueLock'). If a hint is captured,
+ * return true and position the edge(s) in one of 3 ways:
+ *
+ * 1) If `BlueScale' suppresses overshoot, position the captured edge
+ * at the flat edge of the zone.
+ * 2) If overshoot is not suppressed and `BlueShift' requires
+ * overshoot, position the captured edge a minimum of 1 device pixel
+ * from the flat edge.
+ * 3) If overshoot is not suppressed or required, position the captured
+ * edge at the nearest device pixel.
+ *
+ */
+ FT_LOCAL_DEF( FT_Bool )
+ cf2_blues_capture( const CF2_Blues blues,
+ CF2_Hint bottomHintEdge,
+ CF2_Hint topHintEdge )
+ {
+ /* TODO: validate? */
+ CF2_Fixed csFuzz = blues->blueFuzz;
+
+ /* new position of captured edge */
+ CF2_Fixed dsNew;
+
+ /* amount that hint is moved when positioned */
+ CF2_Fixed dsMove = 0;
+
+ FT_Bool captured = FALSE;
+ CF2_UInt i;
+
+
+ /* assert edge flags are consistent */
+ FT_ASSERT( !cf2_hint_isTop( bottomHintEdge ) &&
+ !cf2_hint_isBottom( topHintEdge ) );
+
+ /* TODO: search once without blue fuzz for compatibility with coretype? */
+ for ( i = 0; i < blues->count; i++ )
+ {
+ if ( blues->zone[i].bottomZone &&
+ cf2_hint_isBottom( bottomHintEdge ) )
+ {
+ if ( ( blues->zone[i].csBottomEdge - csFuzz ) <=
+ bottomHintEdge->csCoord &&
+ bottomHintEdge->csCoord <=
+ ( blues->zone[i].csTopEdge + csFuzz ) )
+ {
+ /* bottom edge captured by bottom zone */
+
+ if ( blues->suppressOvershoot )
+ dsNew = blues->zone[i].dsFlatEdge;
+
+ else if ( ( blues->zone[i].csTopEdge - bottomHintEdge->csCoord ) >=
+ blues->blueShift )
+ {
+ /* guarantee minimum of 1 pixel overshoot */
+ dsNew = FT_MIN(
+ cf2_fixedRound( bottomHintEdge->dsCoord ),
+ blues->zone[i].dsFlatEdge - cf2_intToFixed( 1 ) );
+ }
+
+ else
+ {
+ /* simply round captured edge */
+ dsNew = cf2_fixedRound( bottomHintEdge->dsCoord );
+ }
+
+ dsMove = dsNew - bottomHintEdge->dsCoord;
+ captured = TRUE;
+
+ break;
+ }
+ }
+
+ if ( !blues->zone[i].bottomZone && cf2_hint_isTop( topHintEdge ) )
+ {
+ if ( ( blues->zone[i].csBottomEdge - csFuzz ) <=
+ topHintEdge->csCoord &&
+ topHintEdge->csCoord <=
+ ( blues->zone[i].csTopEdge + csFuzz ) )
+ {
+ /* top edge captured by top zone */
+
+ if ( blues->suppressOvershoot )
+ dsNew = blues->zone[i].dsFlatEdge;
+
+ else if ( ( topHintEdge->csCoord - blues->zone[i].csBottomEdge ) >=
+ blues->blueShift )
+ {
+ /* guarantee minimum of 1 pixel overshoot */
+ dsNew = FT_MAX(
+ cf2_fixedRound( topHintEdge->dsCoord ),
+ blues->zone[i].dsFlatEdge + cf2_intToFixed( 1 ) );
+ }
+
+ else
+ {
+ /* simply round captured edge */
+ dsNew = cf2_fixedRound( topHintEdge->dsCoord );
+ }
+
+ dsMove = dsNew - topHintEdge->dsCoord;
+ captured = TRUE;
+
+ break;
+ }
+ }
+ }
+
+ if ( captured )
+ {
+ /* move both edges and flag them `locked' */
+ if ( cf2_hint_isValid( bottomHintEdge ) )
+ {
+ bottomHintEdge->dsCoord += dsMove;
+ cf2_hint_lock( bottomHintEdge );
+ }
+
+ if ( cf2_hint_isValid( topHintEdge ) )
+ {
+ topHintEdge->dsCoord += dsMove;
+ cf2_hint_lock( topHintEdge );
+ }
+ }
+
+ return captured;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2blues.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2blues.h
new file mode 100644
index 0000000000..2f38fcad8f
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2blues.h
@@ -0,0 +1,185 @@
+/***************************************************************************/
+/* */
+/* cf2blues.h */
+/* */
+/* Adobe's code for handling Blue Zones (specification). */
+/* */
+/* Copyright 2009-2013 Adobe Systems Incorporated. */
+/* */
+/* This software, and all works of authorship, whether in source or */
+/* object code form as indicated by the copyright notice(s) included */
+/* herein (collectively, the "Work") is made available, and may only be */
+/* used, modified, and distributed under the FreeType Project License, */
+/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */
+/* FreeType Project License, each contributor to the Work hereby grants */
+/* to any individual or legal entity exercising permissions granted by */
+/* the FreeType Project License and this section (hereafter, "You" or */
+/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */
+/* royalty-free, irrevocable (except as stated in this section) patent */
+/* license to make, have made, use, offer to sell, sell, import, and */
+/* otherwise transfer the Work, where such license applies only to those */
+/* patent claims licensable by such contributor that are necessarily */
+/* infringed by their contribution(s) alone or by combination of their */
+/* contribution(s) with the Work to which such contribution(s) was */
+/* submitted. If You institute patent litigation against any entity */
+/* (including a cross-claim or counterclaim in a lawsuit) alleging that */
+/* the Work or a contribution incorporated within the Work constitutes */
+/* direct or contributory patent infringement, then any patent licenses */
+/* granted to You under this License for that Work shall terminate as of */
+/* the date such litigation is filed. */
+/* */
+/* By using, modifying, or distributing the Work you indicate that you */
+/* have read and understood the terms and conditions of the */
+/* FreeType Project License as well as those provided in this section, */
+/* and you accept them fully. */
+/* */
+/***************************************************************************/
+
+
+ /*
+ * A `CF2_Blues' object stores the blue zones (horizontal alignment
+ * zones) of a font. These are specified in the CFF private dictionary
+ * by `BlueValues', `OtherBlues', `FamilyBlues', and `FamilyOtherBlues'.
+ * Each zone is defined by a top and bottom edge in character space.
+ * Further, each zone is either a top zone or a bottom zone, as recorded
+ * by `bottomZone'.
+ *
+ * The maximum number of `BlueValues' and `FamilyBlues' is 7 each.
+ * However, these are combined to produce a total of 7 zones.
+ * Similarly, the maximum number of `OtherBlues' and `FamilyOtherBlues'
+ * is 5 and these are combined to produce an additional 5 zones.
+ *
+ * Blue zones are used to `capture' hints and force them to a common
+ * alignment point. This alignment is recorded in device space in
+ * `dsFlatEdge'. Except for this value, a `CF2_Blues' object could be
+ * constructed independently of scaling. Construction may occur once
+ * the matrix is known. Other features implemented in the Capture
+ * method are overshoot suppression, overshoot enforcement, and Blue
+ * Boost.
+ *
+ * Capture is determined by `BlueValues' and `OtherBlues', but the
+ * alignment point may be adjusted to the scaled flat edge of
+ * `FamilyBlues' or `FamilyOtherBlues'. No alignment is done to the
+ * curved edge of a zone.
+ *
+ */
+
+
+#ifndef __CF2BLUES_H__
+#define __CF2BLUES_H__
+
+
+#include "cf2glue.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*
+ * `CF2_Hint' is shared by `cf2hints.h' and
+ * `cf2blues.h', but `cf2blues.h' depends on
+ * `cf2hints.h', so define it here. Note: The typedef is in
+ * `cf2glue.h'.
+ *
+ */
+ enum
+ {
+ CF2_GhostBottom = 0x1, /* a single bottom edge */
+ CF2_GhostTop = 0x2, /* a single top edge */
+ CF2_PairBottom = 0x4, /* the bottom edge of a stem hint */
+ CF2_PairTop = 0x8, /* the top edge of a stem hint */
+ CF2_Locked = 0x10, /* this edge has been aligned */
+ /* by a blue zone */
+ CF2_Synthetic = 0x20 /* this edge was synthesized */
+ };
+
+
+ /*
+ * Default value for OS/2 typoAscender/Descender when their difference
+ * is not equal to `unitsPerEm'. The default is based on -250 and 1100
+ * in `CF2_Blues', assuming 1000 units per em here.
+ *
+ */
+ enum
+ {
+ CF2_ICF_Top = cf2_intToFixed( 880 ),
+ CF2_ICF_Bottom = cf2_intToFixed( -120 )
+ };
+
+
+ /*
+ * Constant used for hint adjustment and for synthetic em box hint
+ * placement.
+ */
+#define CF2_MIN_COUNTER cf2_floatToFixed( 0.5 )
+
+
+ /* shared typedef is in cf2glue.h */
+ struct CF2_HintRec_
+ {
+ CF2_UInt flags; /* attributes of the edge */
+ size_t index; /* index in original stem hint array */
+ /* (if not synthetic) */
+ CF2_Fixed csCoord;
+ CF2_Fixed dsCoord;
+ CF2_Fixed scale;
+ };
+
+
+ typedef struct CF2_BlueRec_
+ {
+ CF2_Fixed csBottomEdge;
+ CF2_Fixed csTopEdge;
+ CF2_Fixed csFlatEdge; /* may be from either local or Family zones */
+ CF2_Fixed dsFlatEdge; /* top edge of bottom zone or bottom edge */
+ /* of top zone (rounded) */
+ FT_Bool bottomZone;
+
+ } CF2_BlueRec;
+
+
+ /* max total blue zones is 12 */
+ enum
+ {
+ CF2_MAX_BLUES = 7,
+ CF2_MAX_OTHERBLUES = 5
+ };
+
+
+ typedef struct CF2_BluesRec_
+ {
+ CF2_Fixed scale;
+ CF2_UInt count;
+ FT_Bool suppressOvershoot;
+ FT_Bool doEmBoxHints;
+
+ CF2_Fixed blueScale;
+ CF2_Fixed blueShift;
+ CF2_Fixed blueFuzz;
+
+ CF2_Fixed boost;
+
+ CF2_HintRec emBoxTopEdge;
+ CF2_HintRec emBoxBottomEdge;
+
+ CF2_BlueRec zone[CF2_MAX_BLUES + CF2_MAX_OTHERBLUES];
+
+ } CF2_BluesRec, *CF2_Blues;
+
+
+ FT_LOCAL( void )
+ cf2_blues_init( CF2_Blues blues,
+ CF2_Font font );
+ FT_LOCAL( FT_Bool )
+ cf2_blues_capture( const CF2_Blues blues,
+ CF2_Hint bottomHintEdge,
+ CF2_Hint topHintEdge );
+
+
+FT_END_HEADER
+
+
+#endif /* __CF2BLUES_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2error.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2error.c
new file mode 100644
index 0000000000..b5595a3d1f
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2error.c
@@ -0,0 +1,52 @@
+/***************************************************************************/
+/* */
+/* cf2error.c */
+/* */
+/* Adobe's code for error handling (body). */
+/* */
+/* Copyright 2006-2013 Adobe Systems Incorporated. */
+/* */
+/* This software, and all works of authorship, whether in source or */
+/* object code form as indicated by the copyright notice(s) included */
+/* herein (collectively, the "Work") is made available, and may only be */
+/* used, modified, and distributed under the FreeType Project License, */
+/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */
+/* FreeType Project License, each contributor to the Work hereby grants */
+/* to any individual or legal entity exercising permissions granted by */
+/* the FreeType Project License and this section (hereafter, "You" or */
+/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */
+/* royalty-free, irrevocable (except as stated in this section) patent */
+/* license to make, have made, use, offer to sell, sell, import, and */
+/* otherwise transfer the Work, where such license applies only to those */
+/* patent claims licensable by such contributor that are necessarily */
+/* infringed by their contribution(s) alone or by combination of their */
+/* contribution(s) with the Work to which such contribution(s) was */
+/* submitted. If You institute patent litigation against any entity */
+/* (including a cross-claim or counterclaim in a lawsuit) alleging that */
+/* the Work or a contribution incorporated within the Work constitutes */
+/* direct or contributory patent infringement, then any patent licenses */
+/* granted to You under this License for that Work shall terminate as of */
+/* the date such litigation is filed. */
+/* */
+/* By using, modifying, or distributing the Work you indicate that you */
+/* have read and understood the terms and conditions of the */
+/* FreeType Project License as well as those provided in this section, */
+/* and you accept them fully. */
+/* */
+/***************************************************************************/
+
+
+#include "cf2ft.h"
+#include "cf2error.h"
+
+
+ FT_LOCAL_DEF( void )
+ cf2_setError( FT_Error* error,
+ FT_Error value )
+ {
+ if ( error && *error == 0 )
+ *error = value;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2error.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2error.h
new file mode 100644
index 0000000000..428775c162
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2error.h
@@ -0,0 +1,119 @@
+/***************************************************************************/
+/* */
+/* cf2error.h */
+/* */
+/* Adobe's code for error handling (specification). */
+/* */
+/* Copyright 2006-2013 Adobe Systems Incorporated. */
+/* */
+/* This software, and all works of authorship, whether in source or */
+/* object code form as indicated by the copyright notice(s) included */
+/* herein (collectively, the "Work") is made available, and may only be */
+/* used, modified, and distributed under the FreeType Project License, */
+/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */
+/* FreeType Project License, each contributor to the Work hereby grants */
+/* to any individual or legal entity exercising permissions granted by */
+/* the FreeType Project License and this section (hereafter, "You" or */
+/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */
+/* royalty-free, irrevocable (except as stated in this section) patent */
+/* license to make, have made, use, offer to sell, sell, import, and */
+/* otherwise transfer the Work, where such license applies only to those */
+/* patent claims licensable by such contributor that are necessarily */
+/* infringed by their contribution(s) alone or by combination of their */
+/* contribution(s) with the Work to which such contribution(s) was */
+/* submitted. If You institute patent litigation against any entity */
+/* (including a cross-claim or counterclaim in a lawsuit) alleging that */
+/* the Work or a contribution incorporated within the Work constitutes */
+/* direct or contributory patent infringement, then any patent licenses */
+/* granted to You under this License for that Work shall terminate as of */
+/* the date such litigation is filed. */
+/* */
+/* By using, modifying, or distributing the Work you indicate that you */
+/* have read and understood the terms and conditions of the */
+/* FreeType Project License as well as those provided in this section, */
+/* and you accept them fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __CF2ERROR_H__
+#define __CF2ERROR_H__
+
+
+#include "../../include/freetype/ftmoderr.h"
+
+#undef __FTERRORS_H__
+
+#undef FT_ERR_PREFIX
+#define FT_ERR_PREFIX CF2_Err_
+#define FT_ERR_BASE FT_Mod_Err_CF2
+
+
+#include "../../include/freetype/fterrors.h"
+#include "cf2ft.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*
+ * A poor-man error facility.
+ *
+ * This code being written in vanilla C, doesn't have the luxury of a
+ * language-supported exception mechanism such as the one available in
+ * Java. Instead, we are stuck with using error codes that must be
+ * carefully managed and preserved. However, it is convenient for us to
+ * model our error mechanism on a Java-like exception mechanism.
+ * When we assign an error code we are thus `throwing' an error.
+ *
+ * The perservation of an error code is done by coding convention.
+ * Upon a function call if the error code is anything other than
+ * `FT_Err_Ok', which is guaranteed to be zero, we
+ * will return without altering that error. This will allow the
+ * error to propogate and be handled at the appropriate location in
+ * the code.
+ *
+ * This allows a style of code where the error code is initialized
+ * up front and a block of calls are made with the error code only
+ * being checked after the block. If a new error occurs, the original
+ * error will be preserved and a functional no-op should result in any
+ * subsequent function that has an initial error code not equal to
+ * `FT_Err_Ok'.
+ *
+ * Errors are encoded by calling the `FT_THROW' macro. For example,
+ *
+ * {
+ * FT_Error e;
+ *
+ *
+ * ...
+ * e = FT_THROW( Out_Of_Memory );
+ * }
+ *
+ */
+
+
+ /* Set error code to a particular value. */
+ FT_LOCAL( void )
+ cf2_setError( FT_Error* error,
+ FT_Error value );
+
+
+ /*
+ * A macro that conditionally sets an error code.
+ *
+ * This macro will first check whether `error' is set;
+ * if not, it will set it to `e'.
+ *
+ */
+#define CF2_SET_ERROR( error, e ) \
+ cf2_setError( error, FT_THROW( e ) )
+
+
+FT_END_HEADER
+
+
+#endif /* __CF2ERROR_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2fixed.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2fixed.h
new file mode 100644
index 0000000000..ed1452a7da
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2fixed.h
@@ -0,0 +1,95 @@
+/***************************************************************************/
+/* */
+/* cf2fixed.h */
+/* */
+/* Adobe's code for Fixed Point Mathematics (specification only). */
+/* */
+/* Copyright 2007-2013 Adobe Systems Incorporated. */
+/* */
+/* This software, and all works of authorship, whether in source or */
+/* object code form as indicated by the copyright notice(s) included */
+/* herein (collectively, the "Work") is made available, and may only be */
+/* used, modified, and distributed under the FreeType Project License, */
+/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */
+/* FreeType Project License, each contributor to the Work hereby grants */
+/* to any individual or legal entity exercising permissions granted by */
+/* the FreeType Project License and this section (hereafter, "You" or */
+/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */
+/* royalty-free, irrevocable (except as stated in this section) patent */
+/* license to make, have made, use, offer to sell, sell, import, and */
+/* otherwise transfer the Work, where such license applies only to those */
+/* patent claims licensable by such contributor that are necessarily */
+/* infringed by their contribution(s) alone or by combination of their */
+/* contribution(s) with the Work to which such contribution(s) was */
+/* submitted. If You institute patent litigation against any entity */
+/* (including a cross-claim or counterclaim in a lawsuit) alleging that */
+/* the Work or a contribution incorporated within the Work constitutes */
+/* direct or contributory patent infringement, then any patent licenses */
+/* granted to You under this License for that Work shall terminate as of */
+/* the date such litigation is filed. */
+/* */
+/* By using, modifying, or distributing the Work you indicate that you */
+/* have read and understood the terms and conditions of the */
+/* FreeType Project License as well as those provided in this section, */
+/* and you accept them fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __CF2FIXED_H__
+#define __CF2FIXED_H__
+
+
+FT_BEGIN_HEADER
+
+
+ /* rasterizer integer and fixed point arithmetic must be 32-bit */
+
+#define CF2_Fixed CF2_F16Dot16
+ typedef FT_Int32 CF2_Frac; /* 2.30 fixed point */
+
+
+#define CF2_FIXED_MAX ( (CF2_Fixed)0x7FFFFFFFL )
+#define CF2_FIXED_MIN ( (CF2_Fixed)0x80000000L )
+#define CF2_FIXED_ONE 0x10000L
+#define CF2_FIXED_EPSILON 0x0001
+
+ /* in C 89, left and right shift of negative numbers is */
+ /* implementation specific behaviour in the general case */
+
+#define cf2_intToFixed( i ) \
+ ( (CF2_Fixed)( (FT_UInt32)(i) << 16 ) )
+#define cf2_fixedToInt( x ) \
+ ( (FT_Short)( ( (FT_UInt32)(x) + 0x8000U ) >> 16 ) )
+#define cf2_fixedRound( x ) \
+ ( (CF2_Fixed)( ( (x) + 0x8000 ) & 0xFFFF0000L ) )
+#define cf2_floatToFixed( f ) \
+ ( (CF2_Fixed)( (f) * 65536.0 + 0.5 ) )
+#define cf2_fixedAbs( x ) \
+ ( (x) < 0 ? -(x) : (x) )
+#define cf2_fixedFloor( x ) \
+ ( (CF2_Fixed)( (x) & 0xFFFF0000L ) )
+#define cf2_fixedFraction( x ) \
+ ( (x) - cf2_fixedFloor( x ) )
+#define cf2_fracToFixed( x ) \
+ ( (x) < 0 ? -( ( -(x) + 0x2000 ) >> 14 ) \
+ : ( ( (x) + 0x2000 ) >> 14 ) )
+
+
+ /* signed numeric types */
+ typedef enum CF2_NumberType_
+ {
+ CF2_NumberFixed, /* 16.16 */
+ CF2_NumberFrac, /* 2.30 */
+ CF2_NumberInt /* 32.0 */
+
+ } CF2_NumberType;
+
+
+FT_END_HEADER
+
+
+#endif /* __CF2FIXED_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2font.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2font.c
new file mode 100644
index 0000000000..c1eeec289a
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2font.c
@@ -0,0 +1,404 @@
+/***************************************************************************/
+/* */
+/* cf2font.c */
+/* */
+/* Adobe's code for font instances (body). */
+/* */
+/* Copyright 2007-2013 Adobe Systems Incorporated. */
+/* */
+/* This software, and all works of authorship, whether in source or */
+/* object code form as indicated by the copyright notice(s) included */
+/* herein (collectively, the "Work") is made available, and may only be */
+/* used, modified, and distributed under the FreeType Project License, */
+/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */
+/* FreeType Project License, each contributor to the Work hereby grants */
+/* to any individual or legal entity exercising permissions granted by */
+/* the FreeType Project License and this section (hereafter, "You" or */
+/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */
+/* royalty-free, irrevocable (except as stated in this section) patent */
+/* license to make, have made, use, offer to sell, sell, import, and */
+/* otherwise transfer the Work, where such license applies only to those */
+/* patent claims licensable by such contributor that are necessarily */
+/* infringed by their contribution(s) alone or by combination of their */
+/* contribution(s) with the Work to which such contribution(s) was */
+/* submitted. If You institute patent litigation against any entity */
+/* (including a cross-claim or counterclaim in a lawsuit) alleging that */
+/* the Work or a contribution incorporated within the Work constitutes */
+/* direct or contributory patent infringement, then any patent licenses */
+/* granted to You under this License for that Work shall terminate as of */
+/* the date such litigation is filed. */
+/* */
+/* By using, modifying, or distributing the Work you indicate that you */
+/* have read and understood the terms and conditions of the */
+/* FreeType Project License as well as those provided in this section, */
+/* and you accept them fully. */
+/* */
+/***************************************************************************/
+
+
+#include "cf2ft.h"
+
+#include "cf2glue.h"
+#include "cf2font.h"
+#include "cf2error.h"
+#include "cf2intrp.h"
+
+
+ /* Compute a stem darkening amount in character space. */
+ static void
+ cf2_computeDarkening( CF2_Fixed emRatio,
+ CF2_Fixed ppem,
+ CF2_Fixed stemWidth,
+ CF2_Fixed* darkenAmount,
+ CF2_Fixed boldenAmount,
+ FT_Bool stemDarkened )
+ {
+ /* Internal calculations are done in units per thousand for */
+ /* convenience. */
+ CF2_Fixed stemWidthPer1000, scaledStem;
+
+
+ *darkenAmount = 0;
+
+ if ( boldenAmount == 0 && !stemDarkened )
+ return;
+
+ /* protect against range problems and divide by zero */
+ if ( emRatio < cf2_floatToFixed( .01 ) )
+ return;
+
+ if ( stemDarkened )
+ {
+ /* convert from true character space to 1000 unit character space; */
+ /* add synthetic emboldening effect */
+
+ /* we have to assure that the computation of `scaledStem' */
+ /* and `stemWidthPer1000' don't overflow */
+
+ stemWidthPer1000 = FT_MulFix( stemWidth + boldenAmount, emRatio );
+
+ if ( emRatio > CF2_FIXED_ONE &&
+ stemWidthPer1000 <= ( stemWidth + boldenAmount ) )
+ {
+ stemWidthPer1000 = 0; /* to pacify compiler */
+ scaledStem = cf2_intToFixed( 2333 );
+ }
+ else
+ {
+ scaledStem = FT_MulFix( stemWidthPer1000, ppem );
+
+ if ( ppem > CF2_FIXED_ONE &&
+ scaledStem <= stemWidthPer1000 )
+ scaledStem = cf2_intToFixed( 2333 );
+ }
+
+ /*
+ * Total darkening amount is computed in 1000 unit character space
+ * using the modified 5 part curve as Avalon rasterizer.
+ * The darkening amount is smaller for thicker stems.
+ * It becomes zero when the stem is thicker than 2.333 pixels.
+ *
+ * In Avalon rasterizer,
+ *
+ * darkenAmount = 0.5 pixels if scaledStem <= 0.5 pixels,
+ * darkenAmount = 0.333 pixels if 1 <= scaledStem <= 1.667 pixels,
+ * darkenAmount = 0 pixel if scaledStem >= 2.333 pixels,
+ *
+ * and piecewise linear in-between.
+ *
+ */
+ if ( scaledStem < cf2_intToFixed( 500 ) )
+ *darkenAmount = FT_DivFix( cf2_intToFixed( 400 ), ppem );
+
+ else if ( scaledStem < cf2_intToFixed( 1000 ) )
+ *darkenAmount = FT_DivFix( cf2_intToFixed( 525 ), ppem ) -
+ FT_MulFix( stemWidthPer1000,
+ cf2_floatToFixed( .25 ) );
+
+ else if ( scaledStem < cf2_intToFixed( 1667 ) )
+ *darkenAmount = FT_DivFix( cf2_intToFixed( 275 ), ppem );
+
+ else if ( scaledStem < cf2_intToFixed( 2333 ) )
+ *darkenAmount = FT_DivFix( cf2_intToFixed( 963 ), ppem ) -
+ FT_MulFix( stemWidthPer1000,
+ cf2_floatToFixed( .413 ) );
+
+ /* use half the amount on each side and convert back to true */
+ /* character space */
+ *darkenAmount = FT_DivFix( *darkenAmount, 2 * emRatio );
+ }
+
+ /* add synthetic emboldening effect in character space */
+ *darkenAmount += boldenAmount / 2;
+ }
+
+
+ /* set up values for the current FontDict and matrix */
+
+ /* caller's transform is adjusted for subpixel positioning */
+ static void
+ cf2_font_setup( CF2_Font font,
+ const CF2_Matrix* transform )
+ {
+ /* pointer to parsed font object */
+ CFF_Decoder* decoder = font->decoder;
+
+ FT_Bool needExtraSetup;
+
+ /* character space units */
+ CF2_Fixed boldenX = font->syntheticEmboldeningAmountX;
+ CF2_Fixed boldenY = font->syntheticEmboldeningAmountY;
+
+ CF2_Fixed ppem;
+
+
+ /* clear previous error */
+ font->error = FT_Err_Ok;
+
+ /* if a CID fontDict has changed, we need to recompute some cached */
+ /* data */
+ needExtraSetup =
+ (FT_Bool)( font->lastSubfont != cf2_getSubfont( decoder ) );
+
+ /* if ppem has changed, we need to recompute some cached data */
+ /* note: because of CID font matrix concatenation, ppem and transform */
+ /* do not necessarily track. */
+ ppem = cf2_getPpemY( decoder );
+ if ( font->ppem != ppem )
+ {
+ font->ppem = ppem;
+ needExtraSetup = TRUE;
+ }
+
+ /* copy hinted flag on each call */
+ font->hinted = (FT_Bool)( font->renderingFlags & CF2_FlagsHinted );
+
+ /* determine if transform has changed; */
+ /* include Fontmatrix but ignore translation */
+ if ( ft_memcmp( transform,
+ &font->currentTransform,
+ 4 * sizeof ( CF2_Fixed ) ) != 0 )
+ {
+ /* save `key' information for `cache of one' matrix data; */
+ /* save client transform, without the translation */
+ font->currentTransform = *transform;
+ font->currentTransform.tx =
+ font->currentTransform.ty = cf2_intToFixed( 0 );
+
+ /* TODO: FreeType transform is simple scalar; for now, use identity */
+ /* for outer */
+ font->innerTransform = *transform;
+ font->outerTransform.a =
+ font->outerTransform.d = cf2_intToFixed( 1 );
+ font->outerTransform.b =
+ font->outerTransform.c = cf2_intToFixed( 0 );
+
+ needExtraSetup = TRUE;
+ }
+
+ /*
+ * font->darkened is set to true if there is a stem darkening request or
+ * the font is synthetic emboldened.
+ * font->darkened controls whether to adjust blue zones, winding order,
+ * and hinting.
+ *
+ */
+ if ( font->stemDarkened != ( font->renderingFlags & CF2_FlagsDarkened ) )
+ {
+ font->stemDarkened =
+ (FT_Bool)( font->renderingFlags & CF2_FlagsDarkened );
+
+ /* blue zones depend on darkened flag */
+ needExtraSetup = TRUE;
+ }
+
+ /* recompute variables that are dependent on transform or FontDict or */
+ /* darken flag */
+ if ( needExtraSetup )
+ {
+ /* StdVW is found in the private dictionary; */
+ /* recompute darkening amounts whenever private dictionary or */
+ /* transform change */
+ /* Note: a rendering flag turns darkening on or off, so we want to */
+ /* store the `on' amounts; */
+ /* darkening amount is computed in character space */
+ /* TODO: testing size-dependent darkening here; */
+ /* what to do for rotations? */
+
+ CF2_Fixed emRatio;
+ CF2_Fixed stdHW;
+ CF2_Int unitsPerEm = font->unitsPerEm;
+
+
+ if ( unitsPerEm == 0 )
+ unitsPerEm = 1000;
+
+ ppem = FT_MAX( cf2_intToFixed( 4 ),
+ font->ppem ); /* use minimum ppem of 4 */
+
+#if 0
+ /* since vstem is measured in the x-direction, we use the `a' member */
+ /* of the fontMatrix */
+ emRatio = cf2_fixedFracMul( cf2_intToFixed( 1000 ), fontMatrix->a );
+#endif
+
+ /* Freetype does not preserve the fontMatrix when parsing; use */
+ /* unitsPerEm instead. */
+ /* TODO: check precision of this */
+ emRatio = cf2_intToFixed( 1000 ) / unitsPerEm;
+ font->stdVW = cf2_getStdVW( decoder );
+
+ if ( font->stdVW <= 0 )
+ font->stdVW = FT_DivFix( cf2_intToFixed( 75 ), emRatio );
+
+ if ( boldenX > 0 )
+ {
+ /* Ensure that boldenX is at least 1 pixel for synthetic bold font */
+ /* (similar to what Avalon does) */
+ boldenX = FT_MAX( boldenX,
+ FT_DivFix( cf2_intToFixed( unitsPerEm ), ppem ) );
+
+ /* Synthetic emboldening adds at least 1 pixel to darkenX, while */
+ /* stem darkening adds at most half pixel. Since the purpose of */
+ /* stem darkening (readability at small sizes) is met with */
+ /* synthetic emboldening, no need to add stem darkening for a */
+ /* synthetic bold font. */
+ cf2_computeDarkening( emRatio,
+ ppem,
+ font->stdVW,
+ &font->darkenX,
+ boldenX,
+ FALSE );
+ }
+ else
+ cf2_computeDarkening( emRatio,
+ ppem,
+ font->stdVW,
+ &font->darkenX,
+ 0,
+ font->stemDarkened );
+
+#if 0
+ /* since hstem is measured in the y-direction, we use the `d' member */
+ /* of the fontMatrix */
+ /* TODO: use the same units per em as above; check this */
+ emRatio = cf2_fixedFracMul( cf2_intToFixed( 1000 ), fontMatrix->d );
+#endif
+
+ /* set the default stem width, because it must be the same for all */
+ /* family members; */
+ /* choose a constant for StdHW that depends on font contrast */
+ stdHW = cf2_getStdHW( decoder );
+
+ if ( stdHW > 0 && font->stdVW > 2 * stdHW )
+ font->stdHW = FT_DivFix( cf2_intToFixed( 75 ), emRatio );
+ else
+ {
+ /* low contrast font gets less hstem darkening */
+ font->stdHW = FT_DivFix( cf2_intToFixed( 110 ), emRatio );
+ }
+
+ cf2_computeDarkening( emRatio,
+ ppem,
+ font->stdHW,
+ &font->darkenY,
+ boldenY,
+ font->stemDarkened );
+
+ if ( font->darkenX != 0 || font->darkenY != 0 )
+ font->darkened = TRUE;
+ else
+ font->darkened = FALSE;
+
+ font->reverseWinding = FALSE; /* initial expectation is CCW */
+
+ /* compute blue zones for this instance */
+ cf2_blues_init( &font->blues, font );
+ }
+ }
+
+
+ /* equivalent to AdobeGetOutline */
+ FT_LOCAL_DEF( FT_Error )
+ cf2_getGlyphOutline( CF2_Font font,
+ CF2_Buffer charstring,
+ const CF2_Matrix* transform,
+ CF2_F16Dot16* glyphWidth )
+ {
+ FT_Error lastError = FT_Err_Ok;
+
+ FT_Vector translation;
+ int refCount = 0;
+
+#if 0
+ FT_Vector advancePoint;
+#endif
+
+ CF2_Fixed advWidth = 0;
+ FT_Bool needWinding;
+
+
+ /* Note: use both integer and fraction for outlines. This allows bbox */
+ /* to come out directly. */
+
+ translation.x = transform->tx;
+ translation.y = transform->ty;
+
+ /* set up values based on transform */
+ cf2_font_setup( font, transform );
+ if ( font->error )
+ goto exit; /* setup encountered an error */
+
+ /* reset darken direction */
+ font->reverseWinding = FALSE;
+
+ /* winding order only affects darkening */
+ needWinding = font->darkened;
+
+ while ( refCount++ < 1024)
+ {
+ /* reset output buffer */
+ cf2_outline_reset( &font->outline );
+
+ /* build the outline, passing the full translation */
+ cf2_interpT2CharString( font,
+ charstring,
+ (CF2_OutlineCallbacks)&font->outline,
+ &translation,
+ FALSE,
+ 0,
+ 0,
+ &advWidth );
+
+ if ( font->error )
+ goto exit;
+
+ if ( !needWinding )
+ break;
+
+ /* check winding order */
+ if ( font->outline.root.windingMomentum >= 0 ) /* CFF is CCW */
+ break;
+
+ /* invert darkening and render again */
+ /* TODO: this should be a parameter to getOutline-computeOffset */
+ font->reverseWinding = TRUE;
+
+ needWinding = FALSE; /* exit after next iteration */
+ }
+
+ /* finish storing client outline */
+ cf2_outline_close( &font->outline );
+
+ exit:
+ /* FreeType just wants the advance width; there is no translation */
+ *glyphWidth = advWidth;
+
+ /* free resources and collect errors from objects we've used */
+ cf2_setError( &font->error, lastError );
+
+ return font->error;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2font.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2font.h
new file mode 100644
index 0000000000..f9dd1bbd40
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2font.h
@@ -0,0 +1,114 @@
+/***************************************************************************/
+/* */
+/* cf2font.h */
+/* */
+/* Adobe's code for font instances (specification). */
+/* */
+/* Copyright 2007-2013 Adobe Systems Incorporated. */
+/* */
+/* This software, and all works of authorship, whether in source or */
+/* object code form as indicated by the copyright notice(s) included */
+/* herein (collectively, the "Work") is made available, and may only be */
+/* used, modified, and distributed under the FreeType Project License, */
+/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */
+/* FreeType Project License, each contributor to the Work hereby grants */
+/* to any individual or legal entity exercising permissions granted by */
+/* the FreeType Project License and this section (hereafter, "You" or */
+/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */
+/* royalty-free, irrevocable (except as stated in this section) patent */
+/* license to make, have made, use, offer to sell, sell, import, and */
+/* otherwise transfer the Work, where such license applies only to those */
+/* patent claims licensable by such contributor that are necessarily */
+/* infringed by their contribution(s) alone or by combination of their */
+/* contribution(s) with the Work to which such contribution(s) was */
+/* submitted. If You institute patent litigation against any entity */
+/* (including a cross-claim or counterclaim in a lawsuit) alleging that */
+/* the Work or a contribution incorporated within the Work constitutes */
+/* direct or contributory patent infringement, then any patent licenses */
+/* granted to You under this License for that Work shall terminate as of */
+/* the date such litigation is filed. */
+/* */
+/* By using, modifying, or distributing the Work you indicate that you */
+/* have read and understood the terms and conditions of the */
+/* FreeType Project License as well as those provided in this section, */
+/* and you accept them fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __CF2FONT_H__
+#define __CF2FONT_H__
+
+
+#include "cf2ft.h"
+#include "cf2blues.h"
+
+
+FT_BEGIN_HEADER
+
+
+#define CF2_OPERAND_STACK_SIZE 48
+#define CF2_MAX_SUBR 10 /* maximum subroutine nesting */
+
+
+ /* typedef is in `cf2glue.h' */
+ struct CF2_FontRec_
+ {
+ FT_Memory memory;
+ FT_Error error; /* shared error for this instance */
+
+ CF2_RenderingFlags renderingFlags;
+
+ /* variables that depend on Transform: */
+ /* the following have zero translation; */
+ /* inner * outer = font * original */
+
+ CF2_Matrix currentTransform; /* original client matrix */
+ CF2_Matrix innerTransform; /* for hinting; erect, scaled */
+ CF2_Matrix outerTransform; /* post hinting; includes rotations */
+ CF2_Fixed ppem; /* transform-dependent */
+
+ CF2_Int unitsPerEm;
+
+ CF2_Fixed syntheticEmboldeningAmountX; /* character space units */
+ CF2_Fixed syntheticEmboldeningAmountY; /* character space units */
+
+ /* FreeType related members */
+ CF2_OutlineRec outline; /* freetype glyph outline functions */
+ CFF_Decoder* decoder;
+ CFF_SubFont lastSubfont; /* FreeType parsed data; */
+ /* top font or subfont */
+
+ /* these flags can vary from one call to the next */
+ FT_Bool hinted;
+ FT_Bool darkened; /* true if stemDarkened or synthetic bold */
+ /* i.e. darkenX != 0 || darkenY != 0 */
+ FT_Bool stemDarkened;
+
+ /* variables that depend on both FontDict and Transform */
+ CF2_Fixed stdVW; /* in character space; depends on dict entry */
+ CF2_Fixed stdHW; /* in character space; depends on dict entry */
+ CF2_Fixed darkenX; /* character space units */
+ CF2_Fixed darkenY; /* depends on transform */
+ /* and private dict (StdVW) */
+ FT_Bool reverseWinding; /* darken assuming */
+ /* counterclockwise winding */
+
+ CF2_BluesRec blues; /* computed zone data */
+ };
+
+
+ FT_LOCAL( FT_Error )
+ cf2_getGlyphOutline( CF2_Font font,
+ CF2_Buffer charstring,
+ const CF2_Matrix* transform,
+ CF2_F16Dot16* glyphWidth );
+
+
+FT_END_HEADER
+
+
+#endif /* __CF2FONT_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2ft.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2ft.c
new file mode 100644
index 0000000000..4311d10756
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2ft.c
@@ -0,0 +1,639 @@
+/***************************************************************************/
+/* */
+/* cf2ft.c */
+/* */
+/* FreeType Glue Component to Adobe's Interpreter (body). */
+/* */
+/* Copyright 2013 Adobe Systems Incorporated. */
+/* */
+/* This software, and all works of authorship, whether in source or */
+/* object code form as indicated by the copyright notice(s) included */
+/* herein (collectively, the "Work") is made available, and may only be */
+/* used, modified, and distributed under the FreeType Project License, */
+/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */
+/* FreeType Project License, each contributor to the Work hereby grants */
+/* to any individual or legal entity exercising permissions granted by */
+/* the FreeType Project License and this section (hereafter, "You" or */
+/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */
+/* royalty-free, irrevocable (except as stated in this section) patent */
+/* license to make, have made, use, offer to sell, sell, import, and */
+/* otherwise transfer the Work, where such license applies only to those */
+/* patent claims licensable by such contributor that are necessarily */
+/* infringed by their contribution(s) alone or by combination of their */
+/* contribution(s) with the Work to which such contribution(s) was */
+/* submitted. If You institute patent litigation against any entity */
+/* (including a cross-claim or counterclaim in a lawsuit) alleging that */
+/* the Work or a contribution incorporated within the Work constitutes */
+/* direct or contributory patent infringement, then any patent licenses */
+/* granted to You under this License for that Work shall terminate as of */
+/* the date such litigation is filed. */
+/* */
+/* By using, modifying, or distributing the Work you indicate that you */
+/* have read and understood the terms and conditions of the */
+/* FreeType Project License as well as those provided in this section, */
+/* and you accept them fully. */
+/* */
+/***************************************************************************/
+
+
+#include "cf2ft.h"
+#include "../../include/freetype/internal/ftdebug.h"
+
+#include "cf2font.h"
+#include "cf2error.h"
+
+
+#define CF2_MAX_SIZE cf2_intToFixed( 2000 ) /* max ppem */
+
+
+ /*
+ * This check should avoid most internal overflow cases. Clients should
+ * generally respond to `Glyph_Too_Big' by getting a glyph outline
+ * at EM size, scaling it and filling it as a graphics operation.
+ *
+ */
+ static FT_Error
+ cf2_checkTransform( const CF2_Matrix* transform,
+ CF2_Int unitsPerEm )
+ {
+ CF2_Fixed maxScale;
+
+
+ FT_ASSERT( unitsPerEm > 0 );
+
+ FT_ASSERT( transform->a > 0 && transform->d > 0 );
+ FT_ASSERT( transform->b == 0 && transform->c == 0 );
+ FT_ASSERT( transform->tx == 0 && transform->ty == 0 );
+
+ if ( unitsPerEm > 0x7FFF )
+ return FT_THROW( Glyph_Too_Big );
+
+ maxScale = FT_DivFix( CF2_MAX_SIZE, cf2_intToFixed( unitsPerEm ) );
+
+ if ( transform->a > maxScale || transform->d > maxScale )
+ return FT_THROW( Glyph_Too_Big );
+
+ return FT_Err_Ok;
+ }
+
+
+ static void
+ cf2_setGlyphWidth( CF2_Outline outline,
+ CF2_Fixed width )
+ {
+ CFF_Decoder* decoder = outline->decoder;
+
+
+ FT_ASSERT( decoder );
+
+ decoder->glyph_width = cf2_fixedToInt( width );
+ }
+
+
+ /* Clean up font instance. */
+ static void
+ cf2_free_instance( void* ptr )
+ {
+ CF2_Font font = (CF2_Font)ptr;
+
+
+ if ( font )
+ {
+ FT_Memory memory = font->memory;
+
+
+ (void)memory;
+ }
+ }
+
+
+ /********************************************/
+ /* */
+ /* functions for handling client outline; */
+ /* FreeType uses coordinates in 26.6 format */
+ /* */
+ /********************************************/
+
+ static void
+ cf2_builder_moveTo( CF2_OutlineCallbacks callbacks,
+ const CF2_CallbackParams params )
+ {
+ /* downcast the object pointer */
+ CF2_Outline outline = (CF2_Outline)callbacks;
+ CFF_Builder* builder;
+
+ (void)params; /* only used in debug mode */
+
+
+ FT_ASSERT( outline && outline->decoder );
+ FT_ASSERT( params->op == CF2_PathOpMoveTo );
+
+ builder = &outline->decoder->builder;
+
+ /* note: two successive moves simply close the contour twice */
+ cff_builder_close_contour( builder );
+ builder->path_begun = 0;
+ }
+
+
+ static void
+ cf2_builder_lineTo( CF2_OutlineCallbacks callbacks,
+ const CF2_CallbackParams params )
+ {
+ /* downcast the object pointer */
+ CF2_Outline outline = (CF2_Outline)callbacks;
+ CFF_Builder* builder;
+
+
+ FT_ASSERT( outline && outline->decoder );
+ FT_ASSERT( params->op == CF2_PathOpLineTo );
+
+ builder = &outline->decoder->builder;
+
+ if ( !builder->path_begun )
+ {
+ /* record the move before the line; also check points and set */
+ /* `path_begun' */
+ cff_builder_start_point( builder,
+ params->pt0.x,
+ params->pt0.y );
+ }
+
+ /* `cff_builder_add_point1' includes a check_points call for one point */
+ cff_builder_add_point1( builder,
+ params->pt1.x,
+ params->pt1.y );
+ }
+
+
+ static void
+ cf2_builder_cubeTo( CF2_OutlineCallbacks callbacks,
+ const CF2_CallbackParams params )
+ {
+ /* downcast the object pointer */
+ CF2_Outline outline = (CF2_Outline)callbacks;
+ CFF_Builder* builder;
+
+
+ FT_ASSERT( outline && outline->decoder );
+ FT_ASSERT( params->op == CF2_PathOpCubeTo );
+
+ builder = &outline->decoder->builder;
+
+ if ( !builder->path_begun )
+ {
+ /* record the move before the line; also check points and set */
+ /* `path_begun' */
+ cff_builder_start_point( builder,
+ params->pt0.x,
+ params->pt0.y );
+ }
+
+ /* prepare room for 3 points: 2 off-curve, 1 on-curve */
+ cff_check_points( builder, 3 );
+
+ cff_builder_add_point( builder,
+ params->pt1.x,
+ params->pt1.y, 0 );
+ cff_builder_add_point( builder,
+ params->pt2.x,
+ params->pt2.y, 0 );
+ cff_builder_add_point( builder,
+ params->pt3.x,
+ params->pt3.y, 1 );
+ }
+
+
+ static void
+ cf2_outline_init( CF2_Outline outline,
+ FT_Memory memory,
+ FT_Error* error )
+ {
+ FT_MEM_ZERO( outline, sizeof ( CF2_OutlineRec ) );
+
+ outline->root.memory = memory;
+ outline->root.error = error;
+
+ outline->root.moveTo = cf2_builder_moveTo;
+ outline->root.lineTo = cf2_builder_lineTo;
+ outline->root.cubeTo = cf2_builder_cubeTo;
+ }
+
+
+ /* get scaling and hint flag from GlyphSlot */
+ static void
+ cf2_getScaleAndHintFlag( CFF_Decoder* decoder,
+ CF2_Fixed* x_scale,
+ CF2_Fixed* y_scale,
+ FT_Bool* hinted,
+ FT_Bool* scaled )
+ {
+ FT_ASSERT( decoder && decoder->builder.glyph );
+
+ /* note: FreeType scale includes a factor of 64 */
+ *hinted = decoder->builder.glyph->hint;
+ *scaled = decoder->builder.glyph->scaled;
+
+ if ( *hinted )
+ {
+ *x_scale = FT_DivFix( decoder->builder.glyph->x_scale,
+ cf2_intToFixed( 64 ) );
+ *y_scale = FT_DivFix( decoder->builder.glyph->y_scale,
+ cf2_intToFixed( 64 ) );
+ }
+ else
+ {
+ /* for unhinted outlines, `cff_slot_load' does the scaling, */
+ /* thus render at `unity' scale */
+
+ *x_scale = 0x0400; /* 1/64 as 16.16 */
+ *y_scale = 0x0400;
+ }
+ }
+
+
+ /* get units per em from `FT_Face' */
+ /* TODO: should handle font matrix concatenation? */
+ static FT_UShort
+ cf2_getUnitsPerEm( CFF_Decoder* decoder )
+ {
+ FT_ASSERT( decoder && decoder->builder.face );
+ FT_ASSERT( decoder->builder.face->root.units_per_EM );
+
+ return decoder->builder.face->root.units_per_EM;
+ }
+
+
+ /* Main entry point: Render one glyph. */
+ FT_LOCAL_DEF( FT_Error )
+ cf2_decoder_parse_charstrings( CFF_Decoder* decoder,
+ FT_Byte* charstring_base,
+ FT_ULong charstring_len )
+ {
+ FT_Memory memory;
+ FT_Error error = FT_Err_Ok;
+ CF2_Font font;
+
+
+ FT_ASSERT( decoder && decoder->cff );
+
+ memory = decoder->builder.memory;
+
+ /* CF2 data is saved here across glyphs */
+ font = (CF2_Font)decoder->cff->cf2_instance.data;
+
+ /* on first glyph, allocate instance structure */
+ if ( decoder->cff->cf2_instance.data == NULL )
+ {
+ decoder->cff->cf2_instance.finalizer =
+ (FT_Generic_Finalizer)cf2_free_instance;
+
+ if ( FT_ALLOC( decoder->cff->cf2_instance.data,
+ sizeof ( CF2_FontRec ) ) )
+ return FT_THROW( Out_Of_Memory );
+
+ font = (CF2_Font)decoder->cff->cf2_instance.data;
+
+ font->memory = memory;
+
+ /* initialize a client outline, to be shared by each glyph rendered */
+ cf2_outline_init( &font->outline, font->memory, &font->error );
+ }
+
+ /* save decoder; it is a stack variable and will be different on each */
+ /* call */
+ font->decoder = decoder;
+ font->outline.decoder = decoder;
+
+ {
+ /* build parameters for Adobe engine */
+
+ CFF_Builder* builder = &decoder->builder;
+ CFF_Driver driver = (CFF_Driver)FT_FACE_DRIVER( builder->face );
+
+ /* local error */
+ FT_Error error2 = FT_Err_Ok;
+ CF2_BufferRec buf;
+ CF2_Matrix transform;
+ CF2_F16Dot16 glyphWidth;
+
+ FT_Bool hinted;
+ FT_Bool scaled;
+
+
+ /* FreeType has already looked up the GID; convert to */
+ /* `RegionBuffer', assuming that the input has been validated */
+ FT_ASSERT( charstring_base + charstring_len >= charstring_base );
+
+ FT_ZERO( &buf );
+ buf.start =
+ buf.ptr = charstring_base;
+ buf.end = charstring_base + charstring_len;
+
+ FT_ZERO( &transform );
+
+ cf2_getScaleAndHintFlag( decoder,
+ &transform.a,
+ &transform.d,
+ &hinted,
+ &scaled );
+
+ font->renderingFlags = 0;
+ if ( hinted )
+ font->renderingFlags |= CF2_FlagsHinted;
+ if ( scaled && !driver->no_stem_darkening )
+ font->renderingFlags |= CF2_FlagsDarkened;
+
+ /* now get an outline for this glyph; */
+ /* also get units per em to validate scale */
+ font->unitsPerEm = (CF2_Int)cf2_getUnitsPerEm( decoder );
+
+ error2 = cf2_checkTransform( &transform, font->unitsPerEm );
+ if ( error2 )
+ return error2;
+
+ error2 = cf2_getGlyphOutline( font, &buf, &transform, &glyphWidth );
+ if ( error2 )
+ return FT_ERR( Invalid_File_Format );
+
+ cf2_setGlyphWidth( &font->outline, glyphWidth );
+
+ return FT_Err_Ok;
+ }
+ }
+
+
+ /* get pointer to current FreeType subfont (based on current glyphID) */
+ FT_LOCAL_DEF( CFF_SubFont )
+ cf2_getSubfont( CFF_Decoder* decoder )
+ {
+ FT_ASSERT( decoder && decoder->current_subfont );
+
+ return decoder->current_subfont;
+ }
+
+
+ /* get `y_ppem' from `CFF_Size' */
+ FT_LOCAL_DEF( CF2_Fixed )
+ cf2_getPpemY( CFF_Decoder* decoder )
+ {
+ FT_ASSERT( decoder &&
+ decoder->builder.face &&
+ decoder->builder.face->root.size );
+ FT_ASSERT( decoder->builder.face->root.size->metrics.y_ppem );
+
+ return cf2_intToFixed(
+ decoder->builder.face->root.size->metrics.y_ppem );
+ }
+
+
+ /* get standard stem widths for the current subfont; */
+ /* FreeType stores these as integer font units */
+ /* (note: variable names seem swapped) */
+ FT_LOCAL_DEF( CF2_Fixed )
+ cf2_getStdVW( CFF_Decoder* decoder )
+ {
+ FT_ASSERT( decoder && decoder->current_subfont );
+
+ return cf2_intToFixed(
+ decoder->current_subfont->private_dict.standard_height );
+ }
+
+
+ FT_LOCAL_DEF( CF2_Fixed )
+ cf2_getStdHW( CFF_Decoder* decoder )
+ {
+ FT_ASSERT( decoder && decoder->current_subfont );
+
+ return cf2_intToFixed(
+ decoder->current_subfont->private_dict.standard_width );
+ }
+
+
+ /* note: FreeType stores 1000 times the actual value for `BlueScale' */
+ FT_LOCAL_DEF( void )
+ cf2_getBlueMetrics( CFF_Decoder* decoder,
+ CF2_Fixed* blueScale,
+ CF2_Fixed* blueShift,
+ CF2_Fixed* blueFuzz )
+ {
+ FT_ASSERT( decoder && decoder->current_subfont );
+
+ *blueScale = FT_DivFix(
+ decoder->current_subfont->private_dict.blue_scale,
+ cf2_intToFixed( 1000 ) );
+ *blueShift = cf2_intToFixed(
+ decoder->current_subfont->private_dict.blue_shift );
+ *blueFuzz = cf2_intToFixed(
+ decoder->current_subfont->private_dict.blue_fuzz );
+ }
+
+
+ /* get blue values counts and arrays; the FreeType parser has validated */
+ /* the counts and verified that each is an even number */
+ FT_LOCAL_DEF( void )
+ cf2_getBlueValues( CFF_Decoder* decoder,
+ size_t* count,
+ FT_Pos* *data )
+ {
+ FT_ASSERT( decoder && decoder->current_subfont );
+
+ *count = decoder->current_subfont->private_dict.num_blue_values;
+ *data = (FT_Pos*)
+ &decoder->current_subfont->private_dict.blue_values;
+ }
+
+
+ FT_LOCAL_DEF( void )
+ cf2_getOtherBlues( CFF_Decoder* decoder,
+ size_t* count,
+ FT_Pos* *data )
+ {
+ FT_ASSERT( decoder && decoder->current_subfont );
+
+ *count = decoder->current_subfont->private_dict.num_other_blues;
+ *data = (FT_Pos*)
+ &decoder->current_subfont->private_dict.other_blues;
+ }
+
+
+ FT_LOCAL_DEF( void )
+ cf2_getFamilyBlues( CFF_Decoder* decoder,
+ size_t* count,
+ FT_Pos* *data )
+ {
+ FT_ASSERT( decoder && decoder->current_subfont );
+
+ *count = decoder->current_subfont->private_dict.num_family_blues;
+ *data = (FT_Pos*)
+ &decoder->current_subfont->private_dict.family_blues;
+ }
+
+
+ FT_LOCAL_DEF( void )
+ cf2_getFamilyOtherBlues( CFF_Decoder* decoder,
+ size_t* count,
+ FT_Pos* *data )
+ {
+ FT_ASSERT( decoder && decoder->current_subfont );
+
+ *count = decoder->current_subfont->private_dict.num_family_other_blues;
+ *data = (FT_Pos*)
+ &decoder->current_subfont->private_dict.family_other_blues;
+ }
+
+
+ FT_LOCAL_DEF( CF2_Int )
+ cf2_getLanguageGroup( CFF_Decoder* decoder )
+ {
+ FT_ASSERT( decoder && decoder->current_subfont );
+
+ return decoder->current_subfont->private_dict.language_group;
+ }
+
+
+ /* convert unbiased subroutine index to `CF2_Buffer' and */
+ /* return 0 on success */
+ FT_LOCAL_DEF( CF2_Int )
+ cf2_initGlobalRegionBuffer( CFF_Decoder* decoder,
+ CF2_UInt idx,
+ CF2_Buffer buf )
+ {
+ FT_ASSERT( decoder && decoder->globals );
+
+ FT_ZERO( buf );
+
+ idx += decoder->globals_bias;
+ if ( idx >= decoder->num_globals )
+ return TRUE; /* error */
+
+ buf->start =
+ buf->ptr = decoder->globals[idx];
+ buf->end = decoder->globals[idx + 1];
+
+ return FALSE; /* success */
+ }
+
+
+ /* convert AdobeStandardEncoding code to CF2_Buffer; */
+ /* used for seac component */
+ FT_LOCAL_DEF( FT_Error )
+ cf2_getSeacComponent( CFF_Decoder* decoder,
+ CF2_UInt code,
+ CF2_Buffer buf )
+ {
+ CF2_Int gid;
+ FT_Byte* charstring;
+ FT_ULong len;
+ FT_Error error;
+
+
+ FT_ASSERT( decoder );
+
+ FT_ZERO( buf );
+
+ gid = cff_lookup_glyph_by_stdcharcode( decoder->cff, code );
+ if ( gid < 0 )
+ return FT_THROW( Invalid_Glyph_Format );
+
+ error = cff_get_glyph_data( decoder->builder.face,
+ gid,
+ &charstring,
+ &len );
+ /* TODO: for now, just pass the FreeType error through */
+ if ( error )
+ return error;
+
+ /* assume input has been validated */
+ FT_ASSERT( charstring + len >= charstring );
+
+ buf->start = charstring;
+ buf->end = charstring + len;
+ buf->ptr = buf->start;
+
+ return FT_Err_Ok;
+ }
+
+
+ FT_LOCAL_DEF( void )
+ cf2_freeSeacComponent( CFF_Decoder* decoder,
+ CF2_Buffer buf )
+ {
+ FT_ASSERT( decoder );
+
+ cff_free_glyph_data( decoder->builder.face,
+ (FT_Byte**)&buf->start,
+ (FT_ULong)( buf->end - buf->start ) );
+ }
+
+
+ FT_LOCAL_DEF( CF2_Int )
+ cf2_initLocalRegionBuffer( CFF_Decoder* decoder,
+ CF2_UInt idx,
+ CF2_Buffer buf )
+ {
+ FT_ASSERT( decoder && decoder->locals );
+
+ FT_ZERO( buf );
+
+ idx += decoder->locals_bias;
+ if ( idx >= decoder->num_locals )
+ return TRUE; /* error */
+
+ buf->start =
+ buf->ptr = decoder->locals[idx];
+ buf->end = decoder->locals[idx + 1];
+
+ return FALSE; /* success */
+ }
+
+
+ FT_LOCAL_DEF( CF2_Fixed )
+ cf2_getDefaultWidthX( CFF_Decoder* decoder )
+ {
+ FT_ASSERT( decoder && decoder->current_subfont );
+
+ return cf2_intToFixed(
+ decoder->current_subfont->private_dict.default_width );
+ }
+
+
+ FT_LOCAL_DEF( CF2_Fixed )
+ cf2_getNominalWidthX( CFF_Decoder* decoder )
+ {
+ FT_ASSERT( decoder && decoder->current_subfont );
+
+ return cf2_intToFixed(
+ decoder->current_subfont->private_dict.nominal_width );
+ }
+
+
+ FT_LOCAL_DEF( void )
+ cf2_outline_reset( CF2_Outline outline )
+ {
+ CFF_Decoder* decoder = outline->decoder;
+
+
+ FT_ASSERT( decoder );
+
+ outline->root.windingMomentum = 0;
+
+ FT_GlyphLoader_Rewind( decoder->builder.loader );
+ }
+
+
+ FT_LOCAL_DEF( void )
+ cf2_outline_close( CF2_Outline outline )
+ {
+ CFF_Decoder* decoder = outline->decoder;
+
+
+ FT_ASSERT( decoder );
+
+ cff_builder_close_contour( &decoder->builder );
+
+ FT_GlyphLoader_Add( decoder->builder.loader );
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2ft.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2ft.h
new file mode 100644
index 0000000000..70a0ed4db4
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2ft.h
@@ -0,0 +1,147 @@
+/***************************************************************************/
+/* */
+/* cf2ft.h */
+/* */
+/* FreeType Glue Component to Adobe's Interpreter (specification). */
+/* */
+/* Copyright 2013 Adobe Systems Incorporated. */
+/* */
+/* This software, and all works of authorship, whether in source or */
+/* object code form as indicated by the copyright notice(s) included */
+/* herein (collectively, the "Work") is made available, and may only be */
+/* used, modified, and distributed under the FreeType Project License, */
+/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */
+/* FreeType Project License, each contributor to the Work hereby grants */
+/* to any individual or legal entity exercising permissions granted by */
+/* the FreeType Project License and this section (hereafter, "You" or */
+/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */
+/* royalty-free, irrevocable (except as stated in this section) patent */
+/* license to make, have made, use, offer to sell, sell, import, and */
+/* otherwise transfer the Work, where such license applies only to those */
+/* patent claims licensable by such contributor that are necessarily */
+/* infringed by their contribution(s) alone or by combination of their */
+/* contribution(s) with the Work to which such contribution(s) was */
+/* submitted. If You institute patent litigation against any entity */
+/* (including a cross-claim or counterclaim in a lawsuit) alleging that */
+/* the Work or a contribution incorporated within the Work constitutes */
+/* direct or contributory patent infringement, then any patent licenses */
+/* granted to You under this License for that Work shall terminate as of */
+/* the date such litigation is filed. */
+/* */
+/* By using, modifying, or distributing the Work you indicate that you */
+/* have read and understood the terms and conditions of the */
+/* FreeType Project License as well as those provided in this section, */
+/* and you accept them fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __CF2FT_H__
+#define __CF2FT_H__
+
+
+#include "cf2types.h"
+
+
+ /* TODO: disable asserts for now */
+#define CF2_NDEBUG
+
+
+#include "../../include/freetype/ftsystem.h"
+
+#include "cf2glue.h"
+#include "cffgload.h" /* for CFF_Decoder */
+
+
+FT_BEGIN_HEADER
+
+
+ FT_LOCAL( FT_Error )
+ cf2_decoder_parse_charstrings( CFF_Decoder* decoder,
+ FT_Byte* charstring_base,
+ FT_ULong charstring_len );
+
+ FT_LOCAL( CFF_SubFont )
+ cf2_getSubfont( CFF_Decoder* decoder );
+
+
+ FT_LOCAL( CF2_Fixed )
+ cf2_getPpemY( CFF_Decoder* decoder );
+ FT_LOCAL( CF2_Fixed )
+ cf2_getStdVW( CFF_Decoder* decoder );
+ FT_LOCAL( CF2_Fixed )
+ cf2_getStdHW( CFF_Decoder* decoder );
+
+ FT_LOCAL( void )
+ cf2_getBlueMetrics( CFF_Decoder* decoder,
+ CF2_Fixed* blueScale,
+ CF2_Fixed* blueShift,
+ CF2_Fixed* blueFuzz );
+ FT_LOCAL( void )
+ cf2_getBlueValues( CFF_Decoder* decoder,
+ size_t* count,
+ FT_Pos* *data );
+ FT_LOCAL( void )
+ cf2_getOtherBlues( CFF_Decoder* decoder,
+ size_t* count,
+ FT_Pos* *data );
+ FT_LOCAL( void )
+ cf2_getFamilyBlues( CFF_Decoder* decoder,
+ size_t* count,
+ FT_Pos* *data );
+ FT_LOCAL( void )
+ cf2_getFamilyOtherBlues( CFF_Decoder* decoder,
+ size_t* count,
+ FT_Pos* *data );
+
+ FT_LOCAL( CF2_Int )
+ cf2_getLanguageGroup( CFF_Decoder* decoder );
+
+ FT_LOCAL( CF2_Int )
+ cf2_initGlobalRegionBuffer( CFF_Decoder* decoder,
+ CF2_UInt idx,
+ CF2_Buffer buf );
+ FT_LOCAL( FT_Error )
+ cf2_getSeacComponent( CFF_Decoder* decoder,
+ CF2_UInt code,
+ CF2_Buffer buf );
+ FT_LOCAL( void )
+ cf2_freeSeacComponent( CFF_Decoder* decoder,
+ CF2_Buffer buf );
+ FT_LOCAL( CF2_Int )
+ cf2_initLocalRegionBuffer( CFF_Decoder* decoder,
+ CF2_UInt idx,
+ CF2_Buffer buf );
+
+ FT_LOCAL( CF2_Fixed )
+ cf2_getDefaultWidthX( CFF_Decoder* decoder );
+ FT_LOCAL( CF2_Fixed )
+ cf2_getNominalWidthX( CFF_Decoder* decoder );
+
+
+ /*
+ * FreeType client outline
+ *
+ * process output from the charstring interpreter
+ */
+ typedef struct CF2_OutlineRec_
+ {
+ CF2_OutlineCallbacksRec root; /* base class must be first */
+ CFF_Decoder* decoder;
+
+ } CF2_OutlineRec, *CF2_Outline;
+
+
+ FT_LOCAL( void )
+ cf2_outline_reset( CF2_Outline outline );
+ FT_LOCAL( void )
+ cf2_outline_close( CF2_Outline outline );
+
+
+FT_END_HEADER
+
+
+#endif /* __CF2FT_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2glue.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2glue.h
new file mode 100644
index 0000000000..a24da39e93
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2glue.h
@@ -0,0 +1,144 @@
+/***************************************************************************/
+/* */
+/* cf2glue.h */
+/* */
+/* Adobe's code for shared stuff (specification only). */
+/* */
+/* Copyright 2007-2013 Adobe Systems Incorporated. */
+/* */
+/* This software, and all works of authorship, whether in source or */
+/* object code form as indicated by the copyright notice(s) included */
+/* herein (collectively, the "Work") is made available, and may only be */
+/* used, modified, and distributed under the FreeType Project License, */
+/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */
+/* FreeType Project License, each contributor to the Work hereby grants */
+/* to any individual or legal entity exercising permissions granted by */
+/* the FreeType Project License and this section (hereafter, "You" or */
+/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */
+/* royalty-free, irrevocable (except as stated in this section) patent */
+/* license to make, have made, use, offer to sell, sell, import, and */
+/* otherwise transfer the Work, where such license applies only to those */
+/* patent claims licensable by such contributor that are necessarily */
+/* infringed by their contribution(s) alone or by combination of their */
+/* contribution(s) with the Work to which such contribution(s) was */
+/* submitted. If You institute patent litigation against any entity */
+/* (including a cross-claim or counterclaim in a lawsuit) alleging that */
+/* the Work or a contribution incorporated within the Work constitutes */
+/* direct or contributory patent infringement, then any patent licenses */
+/* granted to You under this License for that Work shall terminate as of */
+/* the date such litigation is filed. */
+/* */
+/* By using, modifying, or distributing the Work you indicate that you */
+/* have read and understood the terms and conditions of the */
+/* FreeType Project License as well as those provided in this section, */
+/* and you accept them fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __CF2GLUE_H__
+#define __CF2GLUE_H__
+
+
+/* common includes for other modules */
+#include "cf2error.h"
+#include "cf2fixed.h"
+#include "cf2arrst.h"
+#include "cf2read.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /* rendering parameters */
+
+ /* apply hints to rendered glyphs */
+#define CF2_FlagsHinted 1
+ /* for testing */
+#define CF2_FlagsDarkened 2
+
+ /* type for holding the flags */
+ typedef CF2_Int CF2_RenderingFlags;
+
+
+ /* elements of a glyph outline */
+ typedef enum CF2_PathOp_
+ {
+ CF2_PathOpMoveTo = 1, /* change the current point */
+ CF2_PathOpLineTo = 2, /* line */
+ CF2_PathOpQuadTo = 3, /* quadratic curve */
+ CF2_PathOpCubeTo = 4 /* cubic curve */
+
+ } CF2_PathOp;
+
+
+ /* a matrix of fixed point values */
+ typedef struct CF2_Matrix_
+ {
+ CF2_F16Dot16 a;
+ CF2_F16Dot16 b;
+ CF2_F16Dot16 c;
+ CF2_F16Dot16 d;
+ CF2_F16Dot16 tx;
+ CF2_F16Dot16 ty;
+
+ } CF2_Matrix;
+
+
+ /* these typedefs are needed by more than one header file */
+ /* and gcc compiler doesn't allow redefinition */
+ typedef struct CF2_FontRec_ CF2_FontRec, *CF2_Font;
+ typedef struct CF2_HintRec_ CF2_HintRec, *CF2_Hint;
+
+
+ /* A common structure for all callback parameters. */
+ /* */
+ /* Some members may be unused. For example, `pt0' is not used for */
+ /* `moveTo' and `pt3' is not used for `quadTo'. The initial point `pt0' */
+ /* is included for each path element for generality; curve conversions */
+ /* need it. The `op' parameter allows one function to handle multiple */
+ /* element types. */
+
+ typedef struct CF2_CallbackParamsRec_
+ {
+ FT_Vector pt0;
+ FT_Vector pt1;
+ FT_Vector pt2;
+ FT_Vector pt3;
+
+ CF2_Int op;
+
+ } CF2_CallbackParamsRec, *CF2_CallbackParams;
+
+
+ /* forward reference */
+ typedef struct CF2_OutlineCallbacksRec_ CF2_OutlineCallbacksRec,
+ *CF2_OutlineCallbacks;
+
+ /* callback function pointers */
+ typedef void
+ (*CF2_Callback_Type)( CF2_OutlineCallbacks callbacks,
+ const CF2_CallbackParams params );
+
+
+ struct CF2_OutlineCallbacksRec_
+ {
+ CF2_Callback_Type moveTo;
+ CF2_Callback_Type lineTo;
+ CF2_Callback_Type quadTo;
+ CF2_Callback_Type cubeTo;
+
+ CF2_Int windingMomentum; /* for winding order detection */
+
+ FT_Memory memory;
+ FT_Error* error;
+ };
+
+
+FT_END_HEADER
+
+
+#endif /* __CF2GLUE_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2hints.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2hints.c
new file mode 100644
index 0000000000..b3f6a04fca
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2hints.c
@@ -0,0 +1,1747 @@
+/***************************************************************************/
+/* */
+/* cf2hints.c */
+/* */
+/* Adobe's code for handling CFF hints (body). */
+/* */
+/* Copyright 2007-2013 Adobe Systems Incorporated. */
+/* */
+/* This software, and all works of authorship, whether in source or */
+/* object code form as indicated by the copyright notice(s) included */
+/* herein (collectively, the "Work") is made available, and may only be */
+/* used, modified, and distributed under the FreeType Project License, */
+/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */
+/* FreeType Project License, each contributor to the Work hereby grants */
+/* to any individual or legal entity exercising permissions granted by */
+/* the FreeType Project License and this section (hereafter, "You" or */
+/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */
+/* royalty-free, irrevocable (except as stated in this section) patent */
+/* license to make, have made, use, offer to sell, sell, import, and */
+/* otherwise transfer the Work, where such license applies only to those */
+/* patent claims licensable by such contributor that are necessarily */
+/* infringed by their contribution(s) alone or by combination of their */
+/* contribution(s) with the Work to which such contribution(s) was */
+/* submitted. If You institute patent litigation against any entity */
+/* (including a cross-claim or counterclaim in a lawsuit) alleging that */
+/* the Work or a contribution incorporated within the Work constitutes */
+/* direct or contributory patent infringement, then any patent licenses */
+/* granted to You under this License for that Work shall terminate as of */
+/* the date such litigation is filed. */
+/* */
+/* By using, modifying, or distributing the Work you indicate that you */
+/* have read and understood the terms and conditions of the */
+/* FreeType Project License as well as those provided in this section, */
+/* and you accept them fully. */
+/* */
+/***************************************************************************/
+
+
+#include "cf2ft.h"
+#include "../../include/freetype/internal/ftdebug.h"
+
+#include "cf2glue.h"
+#include "cf2font.h"
+#include "cf2hints.h"
+#include "cf2intrp.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_cf2hints
+
+
+ typedef struct CF2_HintMoveRec_
+ {
+ size_t j; /* index of upper hint map edge */
+ CF2_Fixed moveUp; /* adjustment to optimum position */
+
+ } CF2_HintMoveRec, *CF2_HintMove;
+
+
+ /* Compute angular momentum for winding order detection. It is called */
+ /* for all lines and curves, but not necessarily in element order. */
+ static CF2_Int
+ cf2_getWindingMomentum( CF2_Fixed x1,
+ CF2_Fixed y1,
+ CF2_Fixed x2,
+ CF2_Fixed y2 )
+ {
+ /* cross product of pt1 position from origin with pt2 position from */
+ /* pt1; we reduce the precision so that the result fits into 32 bits */
+
+ return ( x1 >> 16 ) * ( ( y2 - y1 ) >> 16 ) -
+ ( y1 >> 16 ) * ( ( x2 - x1 ) >> 16 );
+ }
+
+
+ /*
+ * Construct from a StemHint; this is used as a parameter to
+ * `cf2_blues_capture'.
+ * `hintOrigin' is the character space displacement of a seac accent.
+ * Adjust stem hint for darkening here.
+ *
+ */
+ static void
+ cf2_hint_init( CF2_Hint hint,
+ const CF2_ArrStack stemHintArray,
+ size_t indexStemHint,
+ const CF2_Font font,
+ CF2_Fixed hintOrigin,
+ CF2_Fixed scale,
+ FT_Bool bottom )
+ {
+ CF2_Fixed width;
+ const CF2_StemHintRec* stemHint;
+
+
+ FT_ZERO( hint );
+
+ stemHint = (const CF2_StemHintRec*)cf2_arrstack_getPointer(
+ stemHintArray,
+ indexStemHint );
+
+ width = stemHint->max - stemHint->min;
+
+ if ( width == cf2_intToFixed( -21 ) )
+ {
+ /* ghost bottom */
+
+ if ( bottom )
+ {
+ hint->csCoord = stemHint->max;
+ hint->flags = CF2_GhostBottom;
+ }
+ else
+ hint->flags = 0;
+ }
+
+ else if ( width == cf2_intToFixed( -20 ) )
+ {
+ /* ghost top */
+
+ if ( bottom )
+ hint->flags = 0;
+ else
+ {
+ hint->csCoord = stemHint->min;
+ hint->flags = CF2_GhostTop;
+ }
+ }
+
+ else if ( width < 0 )
+ {
+ /* inverted pair */
+
+ /*
+ * Hints with negative widths were produced by an early version of a
+ * non-Adobe font tool. The Type 2 spec allows edge (ghost) hints
+ * with negative widths, but says
+ *
+ * All other negative widths have undefined meaning.
+ *
+ * CoolType has a silent workaround that negates the hint width; for
+ * permissive mode, we do the same here.
+ *
+ * Note: Such fonts cannot use ghost hints, but should otherwise work.
+ * Note: Some poor hints in our faux fonts can produce negative
+ * widths at some blends. For example, see a light weight of
+ * `u' in ASerifMM.
+ *
+ */
+ if ( bottom )
+ {
+ hint->csCoord = stemHint->max;
+ hint->flags = CF2_PairBottom;
+ }
+ else
+ {
+ hint->csCoord = stemHint->min;
+ hint->flags = CF2_PairTop;
+ }
+ }
+
+ else
+ {
+ /* normal pair */
+
+ if ( bottom )
+ {
+ hint->csCoord = stemHint->min;
+ hint->flags = CF2_PairBottom;
+ }
+ else
+ {
+ hint->csCoord = stemHint->max;
+ hint->flags = CF2_PairTop;
+ }
+ }
+
+ /* Now that ghost hints have been detected, adjust this edge for */
+ /* darkening. Bottoms are not changed; tops are incremented by twice */
+ /* `darkenY'. */
+ if ( cf2_hint_isTop( hint ) )
+ hint->csCoord += 2 * font->darkenY;
+
+ hint->csCoord += hintOrigin;
+ hint->scale = scale;
+ hint->index = indexStemHint; /* index in original stem hint array */
+
+ /* if original stem hint has been used, use the same position */
+ if ( hint->flags != 0 && stemHint->used )
+ {
+ if ( cf2_hint_isTop( hint ) )
+ hint->dsCoord = stemHint->maxDS;
+ else
+ hint->dsCoord = stemHint->minDS;
+
+ cf2_hint_lock( hint );
+ }
+ else
+ hint->dsCoord = FT_MulFix( hint->csCoord, scale );
+ }
+
+
+ /* initialize an invalid hint map element */
+ static void
+ cf2_hint_initZero( CF2_Hint hint )
+ {
+ FT_ZERO( hint );
+ }
+
+
+ FT_LOCAL_DEF( FT_Bool )
+ cf2_hint_isValid( const CF2_Hint hint )
+ {
+ return (FT_Bool)( hint->flags != 0 );
+ }
+
+
+ static FT_Bool
+ cf2_hint_isPair( const CF2_Hint hint )
+ {
+ return (FT_Bool)( ( hint->flags &
+ ( CF2_PairBottom | CF2_PairTop ) ) != 0 );
+ }
+
+
+ static FT_Bool
+ cf2_hint_isPairTop( const CF2_Hint hint )
+ {
+ return (FT_Bool)( ( hint->flags & CF2_PairTop ) != 0 );
+ }
+
+
+ FT_LOCAL_DEF( FT_Bool )
+ cf2_hint_isTop( const CF2_Hint hint )
+ {
+ return (FT_Bool)( ( hint->flags &
+ ( CF2_PairTop | CF2_GhostTop ) ) != 0 );
+ }
+
+
+ FT_LOCAL_DEF( FT_Bool )
+ cf2_hint_isBottom( const CF2_Hint hint )
+ {
+ return (FT_Bool)( ( hint->flags &
+ ( CF2_PairBottom | CF2_GhostBottom ) ) != 0 );
+ }
+
+
+ static FT_Bool
+ cf2_hint_isLocked( const CF2_Hint hint )
+ {
+ return (FT_Bool)( ( hint->flags & CF2_Locked ) != 0 );
+ }
+
+
+ static FT_Bool
+ cf2_hint_isSynthetic( const CF2_Hint hint )
+ {
+ return (FT_Bool)( ( hint->flags & CF2_Synthetic ) != 0 );
+ }
+
+
+ FT_LOCAL_DEF( void )
+ cf2_hint_lock( CF2_Hint hint )
+ {
+ hint->flags |= CF2_Locked;
+ }
+
+
+ FT_LOCAL_DEF( void )
+ cf2_hintmap_init( CF2_HintMap hintmap,
+ CF2_Font font,
+ CF2_HintMap initialMap,
+ CF2_ArrStack hintMoves,
+ CF2_Fixed scale )
+ {
+ FT_ZERO( hintmap );
+
+ /* copy parameters from font instance */
+ hintmap->hinted = font->hinted;
+ hintmap->scale = scale;
+ hintmap->font = font;
+ hintmap->initialHintMap = initialMap;
+ /* will clear in `cf2_hintmap_adjustHints' */
+ hintmap->hintMoves = hintMoves;
+ }
+
+
+ static FT_Bool
+ cf2_hintmap_isValid( const CF2_HintMap hintmap )
+ {
+ return hintmap->isValid;
+ }
+
+
+ /* transform character space coordinate to device space using hint map */
+ static CF2_Fixed
+ cf2_hintmap_map( CF2_HintMap hintmap,
+ CF2_Fixed csCoord )
+ {
+ FT_ASSERT( hintmap->isValid ); /* must call Build before Map */
+ FT_ASSERT( hintmap->lastIndex < CF2_MAX_HINT_EDGES );
+
+ if ( hintmap->count == 0 || ! hintmap->hinted )
+ {
+ /* there are no hints; use uniform scale and zero offset */
+ return FT_MulFix( csCoord, hintmap->scale );
+ }
+ else
+ {
+ /* start linear search from last hit */
+ CF2_UInt i = hintmap->lastIndex;
+
+
+ /* search up */
+ while ( i < hintmap->count - 1 &&
+ csCoord >= hintmap->edge[i + 1].csCoord )
+ i += 1;
+
+ /* search down */
+ while ( i > 0 && csCoord < hintmap->edge[i].csCoord )
+ i -= 1;
+
+ hintmap->lastIndex = i;
+
+ if ( i == 0 && csCoord < hintmap->edge[0].csCoord )
+ {
+ /* special case for points below first edge: use uniform scale */
+ return FT_MulFix( csCoord - hintmap->edge[0].csCoord,
+ hintmap->scale ) +
+ hintmap->edge[0].dsCoord;
+ }
+ else
+ {
+ /*
+ * Note: entries with duplicate csCoord are allowed.
+ * Use edge[i], the highest entry where csCoord >= entry[i].csCoord
+ */
+ return FT_MulFix( csCoord - hintmap->edge[i].csCoord,
+ hintmap->edge[i].scale ) +
+ hintmap->edge[i].dsCoord;
+ }
+ }
+ }
+
+
+ /*
+ * This hinting policy moves a hint pair in device space so that one of
+ * its two edges is on a device pixel boundary (its fractional part is
+ * zero). `cf2_hintmap_insertHint' guarantees no overlap in CS
+ * space. Ensure here that there is no overlap in DS.
+ *
+ * In the first pass, edges are adjusted relative to adjacent hints.
+ * Those that are below have already been adjusted. Those that are
+ * above have not yet been adjusted. If a hint above blocks an
+ * adjustment to an optimal position, we will try again in a second
+ * pass. The second pass is top-down.
+ *
+ */
+
+ static void
+ cf2_hintmap_adjustHints( CF2_HintMap hintmap )
+ {
+ size_t i, j;
+
+
+ cf2_arrstack_clear( hintmap->hintMoves ); /* working storage */
+
+ /*
+ * First pass is bottom-up (font hint order) without look-ahead.
+ * Locked edges are already adjusted.
+ * Unlocked edges begin with dsCoord from `initialHintMap'.
+ * Save edges that are not optimally adjusted in `hintMoves' array,
+ * and process them in second pass.
+ */
+
+ for ( i = 0; i < hintmap->count; i++ )
+ {
+ FT_Bool isPair = cf2_hint_isPair( &hintmap->edge[i] );
+
+
+ /* index of upper edge (same value for ghost hint) */
+ j = isPair ? i + 1 : i;
+
+ FT_ASSERT( j < hintmap->count );
+ FT_ASSERT( cf2_hint_isValid( &hintmap->edge[i] ) );
+ FT_ASSERT( cf2_hint_isValid( &hintmap->edge[j] ) );
+ FT_ASSERT( cf2_hint_isLocked( &hintmap->edge[i] ) ==
+ cf2_hint_isLocked( &hintmap->edge[j] ) );
+
+ if ( !cf2_hint_isLocked( &hintmap->edge[i] ) )
+ {
+ /* hint edge is not locked, we can adjust it */
+ CF2_Fixed fracDown = cf2_fixedFraction( hintmap->edge[i].dsCoord );
+ CF2_Fixed fracUp = cf2_fixedFraction( hintmap->edge[j].dsCoord );
+
+ /* calculate all four possibilities; moves down are negative */
+ CF2_Fixed downMoveDown = 0 - fracDown;
+ CF2_Fixed upMoveDown = 0 - fracUp;
+ CF2_Fixed downMoveUp = fracDown == 0
+ ? 0
+ : cf2_intToFixed( 1 ) - fracDown;
+ CF2_Fixed upMoveUp = fracUp == 0
+ ? 0
+ : cf2_intToFixed( 1 ) - fracUp;
+
+ /* smallest move up */
+ CF2_Fixed moveUp = FT_MIN( downMoveUp, upMoveUp );
+ /* smallest move down */
+ CF2_Fixed moveDown = FT_MAX( downMoveDown, upMoveDown );
+
+ /* final amount to move edge or edge pair */
+ CF2_Fixed move;
+
+ CF2_Fixed downMinCounter = CF2_MIN_COUNTER;
+ CF2_Fixed upMinCounter = CF2_MIN_COUNTER;
+ FT_Bool saveEdge = FALSE;
+
+
+ /* minimum counter constraint doesn't apply when adjacent edges */
+ /* are synthetic */
+ /* TODO: doesn't seem a big effect; for now, reduce the code */
+#if 0
+ if ( i == 0 ||
+ cf2_hint_isSynthetic( &hintmap->edge[i - 1] ) )
+ downMinCounter = 0;
+
+ if ( j >= hintmap->count - 1 ||
+ cf2_hint_isSynthetic( &hintmap->edge[j + 1] ) )
+ upMinCounter = 0;
+#endif
+
+ /* is there room to move up? */
+ /* there is if we are at top of array or the next edge is at or */
+ /* beyond proposed move up? */
+ if ( j >= hintmap->count - 1 ||
+ hintmap->edge[j + 1].dsCoord >=
+ hintmap->edge[j].dsCoord + moveUp + upMinCounter )
+ {
+ /* there is room to move up; is there also room to move down? */
+ if ( i == 0 ||
+ hintmap->edge[i - 1].dsCoord <=
+ hintmap->edge[i].dsCoord + moveDown - downMinCounter )
+ {
+ /* move smaller absolute amount */
+ move = ( -moveDown < moveUp ) ? moveDown : moveUp; /* optimum */
+ }
+ else
+ move = moveUp;
+ }
+ else
+ {
+ /* is there room to move down? */
+ if ( i == 0 ||
+ hintmap->edge[i - 1].dsCoord <=
+ hintmap->edge[i].dsCoord + moveDown - downMinCounter )
+ {
+ move = moveDown;
+ /* true if non-optimum move */
+ saveEdge = (FT_Bool)( moveUp < -moveDown );
+ }
+ else
+ {
+ /* no room to move either way without overlapping or reducing */
+ /* the counter too much */
+ move = 0;
+ saveEdge = TRUE;
+ }
+ }
+
+ /* Identify non-moves and moves down that aren't optimal, and save */
+ /* them for second pass. */
+ /* Do this only if there is an unlocked edge above (which could */
+ /* possibly move). */
+ if ( saveEdge &&
+ j < hintmap->count - 1 &&
+ !cf2_hint_isLocked( &hintmap->edge[j + 1] ) )
+ {
+ CF2_HintMoveRec savedMove;
+
+
+ savedMove.j = j;
+ /* desired adjustment in second pass */
+ savedMove.moveUp = moveUp - move;
+
+ cf2_arrstack_push( hintmap->hintMoves, &savedMove );
+ }
+
+ /* move the edge(s) */
+ hintmap->edge[i].dsCoord += move;
+ if ( isPair )
+ hintmap->edge[j].dsCoord += move;
+ }
+
+ /* assert there are no overlaps in device space */
+ FT_ASSERT( i == 0 ||
+ hintmap->edge[i - 1].dsCoord <= hintmap->edge[i].dsCoord );
+ FT_ASSERT( i < j ||
+ hintmap->edge[i].dsCoord <= hintmap->edge[j].dsCoord );
+
+ /* adjust the scales, avoiding divide by zero */
+ if ( i > 0 )
+ {
+ if ( hintmap->edge[i].csCoord != hintmap->edge[i - 1].csCoord )
+ hintmap->edge[i - 1].scale =
+ FT_DivFix(
+ hintmap->edge[i].dsCoord - hintmap->edge[i - 1].dsCoord,
+ hintmap->edge[i].csCoord - hintmap->edge[i - 1].csCoord );
+ }
+
+ if ( isPair )
+ {
+ if ( hintmap->edge[j].csCoord != hintmap->edge[j - 1].csCoord )
+ hintmap->edge[j - 1].scale =
+ FT_DivFix(
+ hintmap->edge[j].dsCoord - hintmap->edge[j - 1].dsCoord,
+ hintmap->edge[j].csCoord - hintmap->edge[j - 1].csCoord );
+
+ i += 1; /* skip upper edge on next loop */
+ }
+ }
+
+ /* second pass tries to move non-optimal hints up, in case there is */
+ /* room now */
+ for ( i = cf2_arrstack_size( hintmap->hintMoves ); i > 0; i-- )
+ {
+ CF2_HintMove hintMove = (CF2_HintMove)
+ cf2_arrstack_getPointer( hintmap->hintMoves, i - 1 );
+
+
+ j = hintMove->j;
+
+ /* this was tested before the push, above */
+ FT_ASSERT( j < hintmap->count - 1 );
+
+ /* is there room to move up? */
+ if ( hintmap->edge[j + 1].dsCoord >=
+ hintmap->edge[j].dsCoord + hintMove->moveUp + CF2_MIN_COUNTER )
+ {
+ /* there is more room now, move edge up */
+ hintmap->edge[j].dsCoord += hintMove->moveUp;
+
+ if ( cf2_hint_isPair( &hintmap->edge[j] ) )
+ {
+ FT_ASSERT( j > 0 );
+ hintmap->edge[j - 1].dsCoord += hintMove->moveUp;
+ }
+ }
+ }
+ }
+
+
+ /* insert hint edges into map, sorted by csCoord */
+ static void
+ cf2_hintmap_insertHint( CF2_HintMap hintmap,
+ CF2_Hint bottomHintEdge,
+ CF2_Hint topHintEdge )
+ {
+ CF2_UInt indexInsert;
+
+ /* set default values, then check for edge hints */
+ FT_Bool isPair = TRUE;
+ CF2_Hint firstHintEdge = bottomHintEdge;
+ CF2_Hint secondHintEdge = topHintEdge;
+
+
+ /* one or none of the input params may be invalid when dealing with */
+ /* edge hints; at least one edge must be valid */
+ FT_ASSERT( cf2_hint_isValid( bottomHintEdge ) ||
+ cf2_hint_isValid( topHintEdge ) );
+
+ /* determine how many and which edges to insert */
+ if ( !cf2_hint_isValid( bottomHintEdge ) )
+ {
+ /* insert only the top edge */
+ firstHintEdge = topHintEdge;
+ isPair = FALSE;
+ }
+ else if ( !cf2_hint_isValid( topHintEdge ) )
+ {
+ /* insert only the bottom edge */
+ isPair = FALSE;
+ }
+
+ /* paired edges must be in proper order */
+ FT_ASSERT( !isPair ||
+ topHintEdge->csCoord >= bottomHintEdge->csCoord );
+
+ /* linear search to find index value of insertion point */
+ indexInsert = 0;
+ for ( ; indexInsert < hintmap->count; indexInsert++ )
+ {
+ if ( hintmap->edge[indexInsert].csCoord > firstHintEdge->csCoord )
+ break;
+ }
+
+ /*
+ * Discard any hints that overlap in character space. Most often,
+ * this is while building the initial map, but in theory, it can also
+ * occur because of darkening.
+ *
+ */
+ if ( indexInsert < hintmap->count )
+ {
+ /* we are inserting before an existing edge: */
+ /* verify that a new pair does not straddle the next edge */
+ if ( isPair &&
+ hintmap->edge[indexInsert].csCoord < secondHintEdge->csCoord )
+ return; /* ignore overlapping stem hint */
+
+ /* verify that we are not inserting between paired edges */
+ if ( cf2_hint_isPairTop( &hintmap->edge[indexInsert] ) )
+ return; /* ignore overlapping stem hint */
+ }
+
+ /* recompute device space locations using initial hint map */
+ if ( cf2_hintmap_isValid( hintmap->initialHintMap ) &&
+ !cf2_hint_isLocked( firstHintEdge ) )
+ {
+ if ( isPair )
+ {
+ /* Use hint map to position the center of stem, and nominal scale */
+ /* to position the two edges. This preserves the stem width. */
+ CF2_Fixed midpoint = cf2_hintmap_map(
+ hintmap->initialHintMap,
+ ( secondHintEdge->csCoord +
+ firstHintEdge->csCoord ) / 2 );
+ CF2_Fixed halfWidth = FT_MulFix(
+ ( secondHintEdge->csCoord -
+ firstHintEdge->csCoord ) / 2,
+ hintmap->scale );
+
+
+ firstHintEdge->dsCoord = midpoint - halfWidth;
+ secondHintEdge->dsCoord = midpoint + halfWidth;
+ }
+ else
+ firstHintEdge->dsCoord = cf2_hintmap_map( hintmap->initialHintMap,
+ firstHintEdge->csCoord );
+ }
+
+ /* discard any hints that overlap in device space; this can occur */
+ /* because locked hints have been moved to align with blue zones */
+ if ( indexInsert > 0 )
+ {
+ /* we are inserting after an existing edge */
+ if ( firstHintEdge->dsCoord < hintmap->edge[indexInsert - 1].dsCoord )
+ return;
+ }
+
+ if ( indexInsert < hintmap->count )
+ {
+ /* we are inserting before an existing edge */
+ if ( isPair )
+ {
+ if ( secondHintEdge->dsCoord > hintmap->edge[indexInsert].dsCoord )
+ return;
+ }
+ else
+ {
+ if ( firstHintEdge->dsCoord > hintmap->edge[indexInsert].dsCoord )
+ return;
+ }
+ }
+
+ /* make room to insert */
+ {
+ CF2_Int iSrc = hintmap->count - 1;
+ CF2_Int iDst = isPair ? hintmap->count + 1 : hintmap->count;
+
+ CF2_Int count = hintmap->count - indexInsert;
+
+
+ if ( iDst >= CF2_MAX_HINT_EDGES )
+ {
+ FT_TRACE4(( "cf2_hintmap_insertHint: too many hintmaps\n" ));
+ return;
+ }
+
+ while ( count-- )
+ hintmap->edge[iDst--] = hintmap->edge[iSrc--];
+
+ /* insert first edge */
+ hintmap->edge[indexInsert] = *firstHintEdge; /* copy struct */
+ hintmap->count += 1;
+
+ if ( isPair )
+ {
+ /* insert second edge */
+ hintmap->edge[indexInsert + 1] = *secondHintEdge; /* copy struct */
+ hintmap->count += 1;
+ }
+ }
+
+ return;
+ }
+
+
+ /*
+ * Build a map from hints and mask.
+ *
+ * This function may recur one level if `hintmap->initialHintMap' is not yet
+ * valid.
+ * If `initialMap' is true, simply build initial map.
+ *
+ * Synthetic hints are used in two ways. A hint at zero is inserted, if
+ * needed, in the initial hint map, to prevent translations from
+ * propagating across the origin. If synthetic em box hints are enabled
+ * for ideographic dictionaries, then they are inserted in all hint
+ * maps, including the initial one.
+ *
+ */
+ FT_LOCAL_DEF( void )
+ cf2_hintmap_build( CF2_HintMap hintmap,
+ CF2_ArrStack hStemHintArray,
+ CF2_ArrStack vStemHintArray,
+ CF2_HintMask hintMask,
+ CF2_Fixed hintOrigin,
+ FT_Bool initialMap )
+ {
+ FT_Byte* maskPtr;
+ FT_Byte* maskEndPtr; // add by Xiaochuan_Liu
+
+ CF2_Font font = hintmap->font;
+ CF2_HintMaskRec tempHintMask;
+
+ size_t bitCount, i;
+ FT_Byte maskByte;
+
+
+ /* check whether initial map is constructed */
+ if ( !initialMap && !cf2_hintmap_isValid( hintmap->initialHintMap ) )
+ {
+ /* make recursive call with initialHintMap and temporary mask; */
+ /* temporary mask will get all bits set, below */
+ cf2_hintmask_init( &tempHintMask, hintMask->error );
+ cf2_hintmap_build( hintmap->initialHintMap,
+ hStemHintArray,
+ vStemHintArray,
+ &tempHintMask,
+ hintOrigin,
+ TRUE );
+ }
+
+ if ( !cf2_hintmask_isValid( hintMask ) )
+ {
+ /* without a hint mask, assume all hints are active */
+ cf2_hintmask_setAll( hintMask,
+ cf2_arrstack_size( hStemHintArray ) +
+ cf2_arrstack_size( vStemHintArray ) );
+ }
+
+ /* begin by clearing the map */
+ hintmap->count = 0;
+ hintmap->lastIndex = 0;
+
+ /* make a copy of the hint mask so we can modify it */
+ tempHintMask = *hintMask;
+ maskPtr = cf2_hintmask_getMaskPtr( &tempHintMask );
+ maskEndPtr = maskPtr + ( CF2_MAX_HINTS + 7 ) / 8;
+
+
+ /* use the hStem hints only, which are first in the mask */
+ /* TODO: compare this to cffhintmaskGetBitCount */
+ bitCount = cf2_arrstack_size( hStemHintArray );
+
+ /* synthetic embox hints get highest priority */
+ if ( font->blues.doEmBoxHints )
+ {
+ CF2_HintRec dummy;
+
+
+ cf2_hint_initZero( &dummy ); /* invalid hint map element */
+
+ /* ghost bottom */
+ cf2_hintmap_insertHint( hintmap,
+ &font->blues.emBoxBottomEdge,
+ &dummy );
+ /* ghost top */
+ cf2_hintmap_insertHint( hintmap,
+ &dummy,
+ &font->blues.emBoxTopEdge );
+ }
+
+ /* insert hints captured by a blue zone or already locked (higher */
+ /* priority) */
+ for ( i = 0, maskByte = 0x80; i < bitCount; i++ )
+ {
+ if ( maskByte & *maskPtr )
+ {
+ /* expand StemHint into two `CF2_Hint' elements */
+ CF2_HintRec bottomHintEdge, topHintEdge;
+
+
+ cf2_hint_init( &bottomHintEdge,
+ hStemHintArray,
+ i,
+ font,
+ hintOrigin,
+ hintmap->scale,
+ TRUE /* bottom */ );
+ cf2_hint_init( &topHintEdge,
+ hStemHintArray,
+ i,
+ font,
+ hintOrigin,
+ hintmap->scale,
+ FALSE /* top */ );
+
+ if ( cf2_hint_isLocked( &bottomHintEdge ) ||
+ cf2_hint_isLocked( &topHintEdge ) ||
+ cf2_blues_capture( &font->blues,
+ &bottomHintEdge,
+ &topHintEdge ) )
+ {
+ /* insert captured hint into map */
+ cf2_hintmap_insertHint( hintmap, &bottomHintEdge, &topHintEdge );
+
+ *maskPtr &= ~maskByte; /* turn off the bit for this hint */
+ }
+ }
+
+ if ( ( i & 7 ) == 7 )
+ {
+ /* move to next mask byte */
+ maskPtr++;
+ if (maskEndPtr >= maskEndPtr)
+ {
+ break;
+ }
+
+ maskByte = 0x80;
+ }
+ else
+ maskByte >>= 1;
+ }
+
+ /* initial hint map includes only captured hints plus maybe one at 0 */
+
+ /*
+ * TODO: There is a problem here because we are trying to build a
+ * single hint map containing all captured hints. It is
+ * possible for there to be conflicts between captured hints,
+ * either because of darkening or because the hints are in
+ * separate hint zones (we are ignoring hint zones for the
+ * initial map). An example of the latter is MinionPro-Regular
+ * v2.030 glyph 883 (Greek Capital Alpha with Psili) at 15ppem.
+ * A stem hint for the psili conflicts with the top edge hint
+ * for the base character. The stem hint gets priority because
+ * of its sort order. In glyph 884 (Greek Capital Alpha with
+ * Psili and Oxia), the top of the base character gets a stem
+ * hint, and the psili does not. This creates different initial
+ * maps for the two glyphs resulting in different renderings of
+ * the base character. Will probably defer this either as not
+ * worth the cost or as a font bug. I don't think there is any
+ * good reason for an accent to be captured by an alignment
+ * zone. -darnold 2/12/10
+ */
+
+ if ( initialMap )
+ {
+ /* Apply a heuristic that inserts a point for (0,0), unless it's */
+ /* already covered by a mapping. This locks the baseline for glyphs */
+ /* that have no baseline hints. */
+
+ if ( hintmap->count == 0 ||
+ hintmap->edge[0].csCoord > 0 ||
+ hintmap->edge[hintmap->count - 1].csCoord < 0 )
+ {
+ /* all edges are above 0 or all edges are below 0; */
+ /* construct a locked edge hint at 0 */
+
+ CF2_HintRec edge, invalid;
+
+
+ cf2_hint_initZero( &edge );
+
+ edge.flags = CF2_GhostBottom |
+ CF2_Locked |
+ CF2_Synthetic;
+ edge.scale = hintmap->scale;
+
+ cf2_hint_initZero( &invalid );
+ cf2_hintmap_insertHint( hintmap, &edge, &invalid );
+ }
+ }
+ else
+ {
+ /* insert remaining hints */
+
+ maskPtr = cf2_hintmask_getMaskPtr( &tempHintMask );
+ maskEndPtr = maskPtr + ( CF2_MAX_HINTS + 7 ) / 8;
+
+ for ( i = 0, maskByte = 0x80; i < bitCount; i++ )
+ {
+ if ( maskByte & *maskPtr )
+ {
+ CF2_HintRec bottomHintEdge, topHintEdge;
+
+
+ cf2_hint_init( &bottomHintEdge,
+ hStemHintArray,
+ i,
+ font,
+ hintOrigin,
+ hintmap->scale,
+ TRUE /* bottom */ );
+ cf2_hint_init( &topHintEdge,
+ hStemHintArray,
+ i,
+ font,
+ hintOrigin,
+ hintmap->scale,
+ FALSE /* top */ );
+
+ cf2_hintmap_insertHint( hintmap, &bottomHintEdge, &topHintEdge );
+ }
+
+ if ( ( i & 7 ) == 7 )
+ {
+ /* move to next mask byte */
+ maskPtr++;
+ if (maskPtr >= maskEndPtr)
+ {
+ break;
+ }
+ maskByte = 0x80;
+ }
+ else
+ maskByte >>= 1;
+ }
+ }
+
+ /*
+ * Note: The following line is a convenient place to break when
+ * debugging hinting. Examine `hintmap->edge' for the list of
+ * enabled hints, then step over the call to see the effect of
+ * adjustment. We stop here first on the recursive call that
+ * creates the initial map, and then on each counter group and
+ * hint zone.
+ */
+
+ /* adjust positions of hint edges that are not locked to blue zones */
+ cf2_hintmap_adjustHints( hintmap );
+
+ /* save the position of all hints that were used in this hint map; */
+ /* if we use them again, we'll locate them in the same position */
+ if ( !initialMap )
+ {
+ for ( i = 0; i < hintmap->count; i++ )
+ {
+ if ( !cf2_hint_isSynthetic( &hintmap->edge[i] ) )
+ {
+ /* Note: include both valid and invalid edges */
+ /* Note: top and bottom edges are copied back separately */
+ CF2_StemHint stemhint = (CF2_StemHint)
+ cf2_arrstack_getPointer( hStemHintArray,
+ hintmap->edge[i].index );
+
+
+ if ( cf2_hint_isTop( &hintmap->edge[i] ) )
+ stemhint->maxDS = hintmap->edge[i].dsCoord;
+ else
+ stemhint->minDS = hintmap->edge[i].dsCoord;
+
+ stemhint->used = TRUE;
+ }
+ }
+ }
+
+ /* hint map is ready to use */
+ hintmap->isValid = TRUE;
+
+ /* remember this mask has been used */
+ cf2_hintmask_setNew( hintMask, FALSE );
+ }
+
+
+ FT_LOCAL_DEF( void )
+ cf2_glyphpath_init( CF2_GlyphPath glyphpath,
+ CF2_Font font,
+ CF2_OutlineCallbacks callbacks,
+ CF2_Fixed scaleY,
+ /* CF2_Fixed hShift, */
+ CF2_ArrStack hStemHintArray,
+ CF2_ArrStack vStemHintArray,
+ CF2_HintMask hintMask,
+ CF2_Fixed hintOriginY,
+ const CF2_Blues blues,
+ const FT_Vector* fractionalTranslation )
+ {
+ FT_ZERO( glyphpath );
+
+ glyphpath->font = font;
+ glyphpath->callbacks = callbacks;
+
+ cf2_arrstack_init( &glyphpath->hintMoves,
+ font->memory,
+ &font->error,
+ sizeof ( CF2_HintMoveRec ) );
+
+ cf2_hintmap_init( &glyphpath->initialHintMap,
+ font,
+ &glyphpath->initialHintMap,
+ &glyphpath->hintMoves,
+ scaleY );
+ cf2_hintmap_init( &glyphpath->firstHintMap,
+ font,
+ &glyphpath->initialHintMap,
+ &glyphpath->hintMoves,
+ scaleY );
+ cf2_hintmap_init( &glyphpath->hintMap,
+ font,
+ &glyphpath->initialHintMap,
+ &glyphpath->hintMoves,
+ scaleY );
+
+ glyphpath->scaleX = font->innerTransform.a;
+ glyphpath->scaleC = font->innerTransform.c;
+ glyphpath->scaleY = font->innerTransform.d;
+
+ glyphpath->fractionalTranslation = *fractionalTranslation;
+
+#if 0
+ glyphpath->hShift = hShift; /* for fauxing */
+#endif
+
+ glyphpath->hStemHintArray = hStemHintArray;
+ glyphpath->vStemHintArray = vStemHintArray;
+ glyphpath->hintMask = hintMask; /* ptr to current mask */
+ glyphpath->hintOriginY = hintOriginY;
+ glyphpath->blues = blues;
+ glyphpath->darken = font->darkened; /* TODO: should we make copies? */
+ glyphpath->xOffset = font->darkenX;
+ glyphpath->yOffset = font->darkenY;
+ glyphpath->miterLimit = 2 * FT_MAX(
+ cf2_fixedAbs( glyphpath->xOffset ),
+ cf2_fixedAbs( glyphpath->yOffset ) );
+
+ /* .1 character space unit */
+ glyphpath->snapThreshold = cf2_floatToFixed( 0.1f );
+
+ glyphpath->moveIsPending = TRUE;
+ glyphpath->pathIsOpen = FALSE;
+ glyphpath->elemIsQueued = FALSE;
+ }
+
+
+ FT_LOCAL_DEF( void )
+ cf2_glyphpath_finalize( CF2_GlyphPath glyphpath )
+ {
+ cf2_arrstack_finalize( &glyphpath->hintMoves );
+ }
+
+
+ /*
+ * Hint point in y-direction and apply outerTransform.
+ * Input `current' hint map (which is actually delayed by one element).
+ * Input x,y point in Character Space.
+ * Output x,y point in Device Space, including translation.
+ */
+ static void
+ cf2_glyphpath_hintPoint( CF2_GlyphPath glyphpath,
+ CF2_HintMap hintmap,
+ FT_Vector* ppt,
+ CF2_Fixed x,
+ CF2_Fixed y )
+ {
+ FT_Vector pt; /* hinted point in upright DS */
+
+
+ pt.x = FT_MulFix( glyphpath->scaleX, x ) +
+ FT_MulFix( glyphpath->scaleC, y );
+ pt.y = cf2_hintmap_map( hintmap, y );
+
+ ppt->x = FT_MulFix( glyphpath->font->outerTransform.a, pt.x ) +
+ FT_MulFix( glyphpath->font->outerTransform.c, pt.y ) +
+ glyphpath->fractionalTranslation.x;
+ ppt->y = FT_MulFix( glyphpath->font->outerTransform.b, pt.x ) +
+ FT_MulFix( glyphpath->font->outerTransform.d, pt.y ) +
+ glyphpath->fractionalTranslation.y;
+ }
+
+
+ /*
+ * From two line segments, (u1,u2) and (v1,v2), compute a point of
+ * intersection on the corresponding lines.
+ * Return false if no intersection is found, or if the intersection is
+ * too far away from the ends of the line segments, u2 and v1.
+ *
+ */
+ static FT_Bool
+ cf2_glyphpath_computeIntersection( CF2_GlyphPath glyphpath,
+ const FT_Vector* u1,
+ const FT_Vector* u2,
+ const FT_Vector* v1,
+ const FT_Vector* v2,
+ FT_Vector* intersection )
+ {
+ /*
+ * Let `u' be a zero-based vector from the first segment, `v' from the
+ * second segment.
+ * Let `w 'be the zero-based vector from `u1' to `v1'.
+ * `perp' is the `perpendicular dot product'; see
+ * http://mathworld.wolfram.com/PerpDotProduct.html.
+ * `s' is the parameter for the parametric line for the first segment
+ * (`u').
+ *
+ * See notation in
+ * http://softsurfer.com/Archive/algorithm_0104/algorithm_0104B.htm.
+ * Calculations are done in 16.16, but must handle the squaring of
+ * line lengths in character space. We scale all vectors by 1/32 to
+ * avoid overflow. This allows values up to 4095 to be squared. The
+ * scale factor cancels in the divide.
+ *
+ * TODO: the scale factor could be computed from UnitsPerEm.
+ *
+ */
+
+#define cf2_perp( a, b ) \
+ ( FT_MulFix( a.x, b.y ) - FT_MulFix( a.y, b.x ) )
+
+ /* round and divide by 32 */
+#define CF2_CS_SCALE( x ) \
+ ( ( (x) + 0x10 ) >> 5 )
+
+ FT_Vector u, v, w; /* scaled vectors */
+ CF2_Fixed denominator, s;
+
+
+ u.x = CF2_CS_SCALE( u2->x - u1->x );
+ u.y = CF2_CS_SCALE( u2->y - u1->y );
+ v.x = CF2_CS_SCALE( v2->x - v1->x );
+ v.y = CF2_CS_SCALE( v2->y - v1->y );
+ w.x = CF2_CS_SCALE( v1->x - u1->x );
+ w.y = CF2_CS_SCALE( v1->y - u1->y );
+
+ denominator = cf2_perp( u, v );
+
+ if ( denominator == 0 )
+ return FALSE; /* parallel or coincident lines */
+
+ s = FT_DivFix( cf2_perp( w, v ), denominator );
+
+ intersection->x = u1->x + FT_MulFix( s, u2->x - u1->x );
+ intersection->y = u1->y + FT_MulFix( s, u2->y - u1->y );
+
+ /*
+ * Special case snapping for horizontal and vertical lines.
+ * This cleans up intersections and reduces problems with winding
+ * order detection.
+ * Sample case is sbc cd KozGoPr6N-Medium.otf 20 16685.
+ * Note: these calculations are in character space.
+ *
+ */
+
+ if ( u1->x == u2->x &&
+ cf2_fixedAbs( intersection->x - u1->x ) < glyphpath->snapThreshold )
+ intersection->x = u1->x;
+ if ( u1->y == u2->y &&
+ cf2_fixedAbs( intersection->y - u1->y ) < glyphpath->snapThreshold )
+ intersection->y = u1->y;
+
+ if ( v1->x == v2->x &&
+ cf2_fixedAbs( intersection->x - v1->x ) < glyphpath->snapThreshold )
+ intersection->x = v1->x;
+ if ( v1->y == v2->y &&
+ cf2_fixedAbs( intersection->y - v1->y ) < glyphpath->snapThreshold )
+ intersection->y = v1->y;
+
+ /* limit the intersection distance from midpoint of u2 and v1 */
+ if ( cf2_fixedAbs( intersection->x - ( u2->x + v1->x ) / 2 ) >
+ glyphpath->miterLimit ||
+ cf2_fixedAbs( intersection->y - ( u2->y + v1->y ) / 2 ) >
+ glyphpath->miterLimit )
+ return FALSE;
+
+ return TRUE;
+ }
+
+
+ /*
+ * Push the cached element (glyphpath->prevElem*) to the outline
+ * consumer. When a darkening offset is used, the end point of the
+ * cached element may be adjusted to an intersection point or it may be
+ * connected by a line to the current element. This calculation must
+ * use a HintMap that was valid at the time the element was saved. For
+ * the first point in a subpath, that is a saved HintMap. For most
+ * elements, it just means the caller has delayed building a HintMap
+ * from the current HintMask.
+ *
+ * Transform each point with outerTransform and call the outline
+ * callbacks. This is a general 3x3 transform:
+ *
+ * x' = a*x + c*y + tx, y' = b*x + d*y + ty
+ *
+ * but it uses 4 elements from CF2_Font and the translation part
+ * from CF2_GlyphPath.
+ *
+ */
+ static void
+ cf2_glyphpath_pushPrevElem( CF2_GlyphPath glyphpath,
+ CF2_HintMap hintmap,
+ FT_Vector* nextP0,
+ FT_Vector nextP1,
+ FT_Bool close )
+ {
+ CF2_CallbackParamsRec params;
+
+ FT_Vector* prevP0;
+ FT_Vector* prevP1;
+
+ FT_Vector intersection = { 0, 0 };
+ FT_Bool useIntersection = FALSE;
+
+
+ FT_ASSERT( glyphpath->prevElemOp == CF2_PathOpLineTo ||
+ glyphpath->prevElemOp == CF2_PathOpCubeTo );
+
+ if ( glyphpath->prevElemOp == CF2_PathOpLineTo )
+ {
+ prevP0 = &glyphpath->prevElemP0;
+ prevP1 = &glyphpath->prevElemP1;
+ }
+ else
+ {
+ prevP0 = &glyphpath->prevElemP2;
+ prevP1 = &glyphpath->prevElemP3;
+ }
+
+ /* optimization: if previous and next elements are offset by the same */
+ /* amount, then there will be no gap, and no need to compute an */
+ /* intersection. */
+ if ( prevP1->x != nextP0->x || prevP1->y != nextP0->y )
+ {
+ /* previous element does not join next element: */
+ /* adjust end point of previous element to the intersection */
+ useIntersection = cf2_glyphpath_computeIntersection( glyphpath,
+ prevP0,
+ prevP1,
+ nextP0,
+ &nextP1,
+ &intersection );
+ if ( useIntersection )
+ {
+ /* modify the last point of the cached element (either line or */
+ /* curve) */
+ *prevP1 = intersection;
+ }
+ }
+
+ params.pt0 = glyphpath->currentDS;
+
+ switch( glyphpath->prevElemOp )
+ {
+ case CF2_PathOpLineTo:
+ params.op = CF2_PathOpLineTo;
+
+ /* note: pt2 and pt3 are unused */
+ cf2_glyphpath_hintPoint( glyphpath,
+ hintmap,
+ &params.pt1,
+ glyphpath->prevElemP1.x,
+ glyphpath->prevElemP1.y );
+
+ glyphpath->callbacks->lineTo( glyphpath->callbacks, &params );
+
+ glyphpath->currentDS = params.pt1;
+
+ break;
+
+ case CF2_PathOpCubeTo:
+ params.op = CF2_PathOpCubeTo;
+
+ /* TODO: should we intersect the interior joins (p1-p2 and p2-p3)? */
+ cf2_glyphpath_hintPoint( glyphpath,
+ hintmap,
+ &params.pt1,
+ glyphpath->prevElemP1.x,
+ glyphpath->prevElemP1.y );
+ cf2_glyphpath_hintPoint( glyphpath,
+ hintmap,
+ &params.pt2,
+ glyphpath->prevElemP2.x,
+ glyphpath->prevElemP2.y );
+ cf2_glyphpath_hintPoint( glyphpath,
+ hintmap,
+ &params.pt3,
+ glyphpath->prevElemP3.x,
+ glyphpath->prevElemP3.y );
+
+ glyphpath->callbacks->cubeTo( glyphpath->callbacks, &params );
+
+ glyphpath->currentDS = params.pt3;
+
+ break;
+ }
+
+ if ( !useIntersection || close )
+ {
+ /* insert connecting line between end of previous element and start */
+ /* of current one */
+ /* note: at the end of a subpath, we might do both, so use `nextP0' */
+ /* before we change it, below */
+
+ cf2_glyphpath_hintPoint( glyphpath,
+ hintmap,
+ &params.pt1,
+ nextP0->x,
+ nextP0->y );
+
+ if ( params.pt1.x != glyphpath->currentDS.x ||
+ params.pt1.y != glyphpath->currentDS.y )
+ {
+ /* length is nonzero */
+ params.op = CF2_PathOpLineTo;
+ params.pt0 = glyphpath->currentDS;
+
+ /* note: pt2 and pt3 are unused */
+ glyphpath->callbacks->lineTo( glyphpath->callbacks, &params );
+
+ glyphpath->currentDS = params.pt1;
+ }
+ }
+
+ if ( useIntersection )
+ {
+ /* return intersection point to caller */
+ *nextP0 = intersection;
+ }
+ }
+
+
+ /* push a MoveTo element based on current point and offset of current */
+ /* element */
+ static void
+ cf2_glyphpath_pushMove( CF2_GlyphPath glyphpath,
+ FT_Vector start )
+ {
+ CF2_CallbackParamsRec params;
+
+
+ params.op = CF2_PathOpMoveTo;
+ params.pt0 = glyphpath->currentDS;
+
+ /* Test if move has really happened yet; it would have called */
+ /* `cf2_hintmap_build' to set `isValid'. */
+ if ( !cf2_hintmap_isValid( &glyphpath->hintMap ) )
+ {
+ /* we are here iff first subpath is missing a moveto operator: */
+ /* synthesize first moveTo to finish initialization of hintMap */
+ cf2_glyphpath_moveTo( glyphpath,
+ glyphpath->start.x,
+ glyphpath->start.y );
+ }
+
+ cf2_glyphpath_hintPoint( glyphpath,
+ &glyphpath->hintMap,
+ &params.pt1,
+ start.x,
+ start.y );
+
+ /* note: pt2 and pt3 are unused */
+ glyphpath->callbacks->moveTo( glyphpath->callbacks, &params );
+
+ glyphpath->currentDS = params.pt1;
+ glyphpath->offsetStart0 = start;
+ }
+
+
+ /*
+ * All coordinates are in character space.
+ * On input, (x1, y1) and (x2, y2) give line segment.
+ * On output, (x, y) give offset vector.
+ * We use a piecewise approximation to trig functions.
+ *
+ * TODO: Offset true perpendicular and proper length
+ * supply the y-translation for hinting here, too,
+ * that adds yOffset unconditionally to *y.
+ */
+ static void
+ cf2_glyphpath_computeOffset( CF2_GlyphPath glyphpath,
+ CF2_Fixed x1,
+ CF2_Fixed y1,
+ CF2_Fixed x2,
+ CF2_Fixed y2,
+ CF2_Fixed* x,
+ CF2_Fixed* y )
+ {
+ CF2_Fixed dx = x2 - x1;
+ CF2_Fixed dy = y2 - y1;
+
+
+ /* note: negative offsets don't work here; negate deltas to change */
+ /* quadrants, below */
+ if ( glyphpath->font->reverseWinding )
+ {
+ dx = -dx;
+ dy = -dy;
+ }
+
+ *x = *y = 0;
+
+ if ( !glyphpath->darken )
+ return;
+
+ /* add momentum for this path element */
+ glyphpath->callbacks->windingMomentum +=
+ cf2_getWindingMomentum( x1, y1, x2, y2 );
+
+ /* note: allow mixed integer and fixed multiplication here */
+ if ( dx >= 0 )
+ {
+ if ( dy >= 0 )
+ {
+ /* first quadrant, +x +y */
+
+ if ( dx > 2 * dy )
+ {
+ /* +x */
+ *x = 0;
+ *y = 0;
+ }
+ else if ( dy > 2 * dx )
+ {
+ /* +y */
+ *x = glyphpath->xOffset;
+ *y = glyphpath->yOffset;
+ }
+ else
+ {
+ /* +x +y */
+ *x = FT_MulFix( cf2_floatToFixed( 0.7 ),
+ glyphpath->xOffset );
+ *y = FT_MulFix( cf2_floatToFixed( 1.0 - 0.7 ),
+ glyphpath->yOffset );
+ }
+ }
+ else
+ {
+ /* fourth quadrant, +x -y */
+
+ if ( dx > -2 * dy )
+ {
+ /* +x */
+ *x = 0;
+ *y = 0;
+ }
+ else if ( -dy > 2 * dx )
+ {
+ /* -y */
+ *x = -glyphpath->xOffset;
+ *y = glyphpath->yOffset;
+ }
+ else
+ {
+ /* +x -y */
+ *x = FT_MulFix( cf2_floatToFixed( -0.7 ),
+ glyphpath->xOffset );
+ *y = FT_MulFix( cf2_floatToFixed( 1.0 - 0.7 ),
+ glyphpath->yOffset );
+ }
+ }
+ }
+ else
+ {
+ if ( dy >= 0 )
+ {
+ /* second quadrant, -x +y */
+
+ if ( -dx > 2 * dy )
+ {
+ /* -x */
+ *x = 0;
+ *y = 2 * glyphpath->yOffset;
+ }
+ else if ( dy > -2 * dx )
+ {
+ /* +y */
+ *x = glyphpath->xOffset;
+ *y = glyphpath->yOffset;
+ }
+ else
+ {
+ /* -x +y */
+ *x = FT_MulFix( cf2_floatToFixed( 0.7 ),
+ glyphpath->xOffset );
+ *y = FT_MulFix( cf2_floatToFixed( 1.0 + 0.7 ),
+ glyphpath->yOffset );
+ }
+ }
+ else
+ {
+ /* third quadrant, -x -y */
+
+ if ( -dx > -2 * dy )
+ {
+ /* -x */
+ *x = 0;
+ *y = 2 * glyphpath->yOffset;
+ }
+ else if ( -dy > -2 * dx )
+ {
+ /* -y */
+ *x = -glyphpath->xOffset;
+ *y = glyphpath->xOffset;
+ }
+ else
+ {
+ /* -x -y */
+ *x = FT_MulFix( cf2_floatToFixed( -0.7 ),
+ glyphpath->xOffset );
+ *y = FT_MulFix( cf2_floatToFixed( 1.0 + 0.7 ),
+ glyphpath->yOffset );
+ }
+ }
+ }
+ }
+
+
+ FT_LOCAL_DEF( void )
+ cf2_glyphpath_moveTo( CF2_GlyphPath glyphpath,
+ CF2_Fixed x,
+ CF2_Fixed y )
+ {
+ cf2_glyphpath_closeOpenPath( glyphpath );
+
+ /* save the parameters of the move for later, when we'll know how to */
+ /* offset it; */
+ /* also save last move point */
+ glyphpath->currentCS.x = glyphpath->start.x = x;
+ glyphpath->currentCS.y = glyphpath->start.y = y;
+
+ glyphpath->moveIsPending = TRUE;
+
+ /* ensure we have a valid map with current mask */
+ if ( !cf2_hintmap_isValid( &glyphpath->hintMap ) ||
+ cf2_hintmask_isNew( glyphpath->hintMask ) )
+ cf2_hintmap_build( &glyphpath->hintMap,
+ glyphpath->hStemHintArray,
+ glyphpath->vStemHintArray,
+ glyphpath->hintMask,
+ glyphpath->hintOriginY,
+ FALSE );
+
+ /* save a copy of current HintMap to use when drawing initial point */
+ glyphpath->firstHintMap = glyphpath->hintMap; /* structure copy */
+ }
+
+
+ FT_LOCAL_DEF( void )
+ cf2_glyphpath_lineTo( CF2_GlyphPath glyphpath,
+ CF2_Fixed x,
+ CF2_Fixed y )
+ {
+ CF2_Fixed xOffset, yOffset;
+ FT_Vector P0, P1;
+
+
+ /* can't compute offset of zero length line, so ignore them */
+ if ( glyphpath->currentCS.x == x && glyphpath->currentCS.y == y )
+ return;
+
+ cf2_glyphpath_computeOffset( glyphpath,
+ glyphpath->currentCS.x,
+ glyphpath->currentCS.y,
+ x,
+ y,
+ &xOffset,
+ &yOffset );
+
+ /* construct offset points */
+ P0.x = glyphpath->currentCS.x + xOffset;
+ P0.y = glyphpath->currentCS.y + yOffset;
+ P1.x = x + xOffset;
+ P1.y = y + yOffset;
+
+ if ( glyphpath->moveIsPending )
+ {
+ /* emit offset 1st point as MoveTo */
+ cf2_glyphpath_pushMove( glyphpath, P0 );
+
+ glyphpath->moveIsPending = FALSE; /* adjust state machine */
+ glyphpath->pathIsOpen = TRUE;
+
+ glyphpath->offsetStart1 = P1; /* record second point */
+ }
+
+ if ( glyphpath->elemIsQueued )
+ {
+ FT_ASSERT( cf2_hintmap_isValid( &glyphpath->hintMap ) );
+
+ cf2_glyphpath_pushPrevElem( glyphpath,
+ &glyphpath->hintMap,
+ &P0,
+ P1,
+ FALSE );
+ }
+
+ /* queue the current element with offset points */
+ glyphpath->elemIsQueued = TRUE;
+ glyphpath->prevElemOp = CF2_PathOpLineTo;
+ glyphpath->prevElemP0 = P0;
+ glyphpath->prevElemP1 = P1;
+
+ /* update current map */
+ if ( cf2_hintmask_isNew( glyphpath->hintMask ) )
+ cf2_hintmap_build( &glyphpath->hintMap,
+ glyphpath->hStemHintArray,
+ glyphpath->vStemHintArray,
+ glyphpath->hintMask,
+ glyphpath->hintOriginY,
+ FALSE );
+
+ glyphpath->currentCS.x = x; /* pre-offset current point */
+ glyphpath->currentCS.y = y;
+ }
+
+
+ FT_LOCAL_DEF( void )
+ cf2_glyphpath_curveTo( CF2_GlyphPath glyphpath,
+ CF2_Fixed x1,
+ CF2_Fixed y1,
+ CF2_Fixed x2,
+ CF2_Fixed y2,
+ CF2_Fixed x3,
+ CF2_Fixed y3 )
+ {
+ CF2_Fixed xOffset1, yOffset1, xOffset3, yOffset3;
+ FT_Vector P0, P1, P2, P3;
+
+
+ /* TODO: ignore zero length portions of curve?? */
+ cf2_glyphpath_computeOffset( glyphpath,
+ glyphpath->currentCS.x,
+ glyphpath->currentCS.y,
+ x1,
+ y1,
+ &xOffset1,
+ &yOffset1 );
+ cf2_glyphpath_computeOffset( glyphpath,
+ x2,
+ y2,
+ x3,
+ y3,
+ &xOffset3,
+ &yOffset3 );
+
+ /* add momentum from the middle segment */
+ glyphpath->callbacks->windingMomentum +=
+ cf2_getWindingMomentum( x1, y1, x2, y2 );
+
+ /* construct offset points */
+ P0.x = glyphpath->currentCS.x + xOffset1;
+ P0.y = glyphpath->currentCS.y + yOffset1;
+ P1.x = x1 + xOffset1;
+ P1.y = y1 + yOffset1;
+ /* note: preserve angle of final segment by using offset3 at both ends */
+ P2.x = x2 + xOffset3;
+ P2.y = y2 + yOffset3;
+ P3.x = x3 + xOffset3;
+ P3.y = y3 + yOffset3;
+
+ if ( glyphpath->moveIsPending )
+ {
+ /* emit offset 1st point as MoveTo */
+ cf2_glyphpath_pushMove( glyphpath, P0 );
+
+ glyphpath->moveIsPending = FALSE;
+ glyphpath->pathIsOpen = TRUE;
+
+ glyphpath->offsetStart1 = P1; /* record second point */
+ }
+
+ if ( glyphpath->elemIsQueued )
+ {
+ FT_ASSERT( cf2_hintmap_isValid( &glyphpath->hintMap ) );
+
+ cf2_glyphpath_pushPrevElem( glyphpath,
+ &glyphpath->hintMap,
+ &P0,
+ P1,
+ FALSE );
+ }
+
+ /* queue the current element with offset points */
+ glyphpath->elemIsQueued = TRUE;
+ glyphpath->prevElemOp = CF2_PathOpCubeTo;
+ glyphpath->prevElemP0 = P0;
+ glyphpath->prevElemP1 = P1;
+ glyphpath->prevElemP2 = P2;
+ glyphpath->prevElemP3 = P3;
+
+ /* update current map */
+ if ( cf2_hintmask_isNew( glyphpath->hintMask ) )
+ cf2_hintmap_build( &glyphpath->hintMap,
+ glyphpath->hStemHintArray,
+ glyphpath->vStemHintArray,
+ glyphpath->hintMask,
+ glyphpath->hintOriginY,
+ FALSE );
+
+ glyphpath->currentCS.x = x3; /* pre-offset current point */
+ glyphpath->currentCS.y = y3;
+ }
+
+
+ FT_LOCAL_DEF( void )
+ cf2_glyphpath_closeOpenPath( CF2_GlyphPath glyphpath )
+ {
+ if ( glyphpath->pathIsOpen )
+ {
+ FT_ASSERT( cf2_hintmap_isValid( &glyphpath->firstHintMap ) );
+
+ /* since we need to apply an offset to the implicit lineto, we make */
+ /* it explicit here */
+ cf2_glyphpath_lineTo( glyphpath,
+ glyphpath->start.x,
+ glyphpath->start.y );
+
+ /* Draw previous element (the explicit LineTo we just created, */
+ /* above) and connect it to the start point, but with the offset we */
+ /* saved from the first element. */
+ /* Use the saved HintMap, too. */
+ FT_ASSERT( glyphpath->elemIsQueued );
+
+ cf2_glyphpath_pushPrevElem( glyphpath,
+ &glyphpath->firstHintMap,
+ &glyphpath->offsetStart0,
+ glyphpath->offsetStart1,
+ TRUE );
+
+ /* reset state machine */
+ glyphpath->moveIsPending = TRUE;
+ glyphpath->pathIsOpen = FALSE;
+ glyphpath->elemIsQueued = FALSE;
+ }
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2hints.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2hints.h
new file mode 100644
index 0000000000..c4fa922a39
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2hints.h
@@ -0,0 +1,287 @@
+/***************************************************************************/
+/* */
+/* cf2hints.h */
+/* */
+/* Adobe's code for handling CFF hints (body). */
+/* */
+/* Copyright 2007-2013 Adobe Systems Incorporated. */
+/* */
+/* This software, and all works of authorship, whether in source or */
+/* object code form as indicated by the copyright notice(s) included */
+/* herein (collectively, the "Work") is made available, and may only be */
+/* used, modified, and distributed under the FreeType Project License, */
+/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */
+/* FreeType Project License, each contributor to the Work hereby grants */
+/* to any individual or legal entity exercising permissions granted by */
+/* the FreeType Project License and this section (hereafter, "You" or */
+/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */
+/* royalty-free, irrevocable (except as stated in this section) patent */
+/* license to make, have made, use, offer to sell, sell, import, and */
+/* otherwise transfer the Work, where such license applies only to those */
+/* patent claims licensable by such contributor that are necessarily */
+/* infringed by their contribution(s) alone or by combination of their */
+/* contribution(s) with the Work to which such contribution(s) was */
+/* submitted. If You institute patent litigation against any entity */
+/* (including a cross-claim or counterclaim in a lawsuit) alleging that */
+/* the Work or a contribution incorporated within the Work constitutes */
+/* direct or contributory patent infringement, then any patent licenses */
+/* granted to You under this License for that Work shall terminate as of */
+/* the date such litigation is filed. */
+/* */
+/* By using, modifying, or distributing the Work you indicate that you */
+/* have read and understood the terms and conditions of the */
+/* FreeType Project License as well as those provided in this section, */
+/* and you accept them fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __CF2HINTS_H__
+#define __CF2HINTS_H__
+
+
+FT_BEGIN_HEADER
+
+
+ enum
+ {
+ CF2_MAX_HINTS = 96 /* maximum # of hints */
+ };
+
+
+ /*
+ * A HintMask object stores a bit mask that specifies which hints in the
+ * charstring are active at a given time. Hints in CFF must be declared
+ * at the start, before any drawing operators, with horizontal hints
+ * preceding vertical hints. The HintMask is ordered the same way, with
+ * horizontal hints immediately followed by vertical hints. Clients are
+ * responsible for knowing how many of each type are present.
+ *
+ * The maximum total number of hints is 96, as specified by the CFF
+ * specification.
+ *
+ * A HintMask is built 0 or more times while interpreting a charstring, by
+ * the HintMask operator. There is only one HintMask, but it is built or
+ * rebuilt each time there is a hint substitution (HintMask operator) in
+ * the charstring. A default HintMask with all bits set is built if there
+ * has been no HintMask operator prior to the first drawing operator.
+ *
+ */
+
+ typedef struct CF2_HintMaskRec_
+ {
+ FT_Error* error;
+
+ FT_Bool isValid;
+ FT_Bool isNew;
+
+ size_t bitCount;
+ size_t byteCount;
+
+ FT_Byte mask[( CF2_MAX_HINTS + 7 ) / 8];
+
+ } CF2_HintMaskRec, *CF2_HintMask;
+
+
+ typedef struct CF2_StemHintRec_
+ {
+ FT_Bool used; /* DS positions are valid */
+
+ CF2_Fixed min; /* original character space value */
+ CF2_Fixed max;
+
+ CF2_Fixed minDS; /* DS position after first use */
+ CF2_Fixed maxDS;
+
+ } CF2_StemHintRec, *CF2_StemHint;
+
+
+ /*
+ * A HintMap object stores a piecewise linear function for mapping
+ * y-coordinates from character space to device space, providing
+ * appropriate pixel alignment to stem edges.
+ *
+ * The map is implemented as an array of `CF2_Hint' elements, each
+ * representing an edge. When edges are paired, as from stem hints, the
+ * bottom edge must immediately precede the top edge in the array.
+ * Element character space AND device space positions must both increase
+ * monotonically in the array. `CF2_Hint' elements are also used as
+ * parameters to `cf2_blues_capture'.
+ *
+ * The `cf2_hintmap_build' method must be called before any drawing
+ * operation (beginning with a Move operator) and at each hint
+ * substitution (HintMask operator).
+ *
+ * The `cf2_hintmap_map' method is called to transform y-coordinates at
+ * each drawing operation (move, line, curve).
+ *
+ */
+
+ /* TODO: make this a CF2_ArrStack and add a deep copy method */
+ enum
+ {
+ CF2_MAX_HINT_EDGES = CF2_MAX_HINTS * 2
+ };
+
+
+ typedef struct CF2_HintMapRec_
+ {
+ CF2_Font font;
+
+ /* initial map based on blue zones */
+ struct CF2_HintMapRec_* initialHintMap;
+
+ /* working storage for 2nd pass adjustHints */
+ CF2_ArrStack hintMoves;
+
+ FT_Bool isValid;
+ FT_Bool hinted;
+
+ CF2_Fixed scale;
+ CF2_UInt count;
+
+ /* start search from this index */
+ CF2_UInt lastIndex;
+
+ CF2_HintRec edge[CF2_MAX_HINT_EDGES]; /* 192 */
+
+ } CF2_HintMapRec, *CF2_HintMap;
+
+
+ FT_LOCAL( FT_Bool )
+ cf2_hint_isValid( const CF2_Hint hint );
+ FT_LOCAL( FT_Bool )
+ cf2_hint_isTop( const CF2_Hint hint );
+ FT_LOCAL( FT_Bool )
+ cf2_hint_isBottom( const CF2_Hint hint );
+ FT_LOCAL( void )
+ cf2_hint_lock( CF2_Hint hint );
+
+
+ FT_LOCAL( void )
+ cf2_hintmap_init( CF2_HintMap hintmap,
+ CF2_Font font,
+ CF2_HintMap initialMap,
+ CF2_ArrStack hintMoves,
+ CF2_Fixed scale );
+ FT_LOCAL( void )
+ cf2_hintmap_build( CF2_HintMap hintmap,
+ CF2_ArrStack hStemHintArray,
+ CF2_ArrStack vStemHintArray,
+ CF2_HintMask hintMask,
+ CF2_Fixed hintOrigin,
+ FT_Bool initialMap );
+
+
+ /*
+ * GlyphPath is a wrapper for drawing operations that scales the
+ * coordinates according to the render matrix and HintMap. It also tracks
+ * open paths to control ClosePath and to insert MoveTo for broken fonts.
+ *
+ */
+ typedef struct CF2_GlyphPathRec_
+ {
+ /* TODO: gather some of these into a hinting context */
+
+ CF2_Font font; /* font instance */
+ CF2_OutlineCallbacks callbacks; /* outline consumer */
+
+
+ CF2_HintMapRec hintMap; /* current hint map */
+ CF2_HintMapRec firstHintMap; /* saved copy */
+ CF2_HintMapRec initialHintMap; /* based on all captured hints */
+
+ CF2_ArrStackRec hintMoves; /* list of hint moves for 2nd pass */
+
+ CF2_Fixed scaleX; /* matrix a */
+ CF2_Fixed scaleC; /* matrix c */
+ CF2_Fixed scaleY; /* matrix d */
+
+ FT_Vector fractionalTranslation; /* including deviceXScale */
+#if 0
+ CF2_Fixed hShift; /* character space horizontal shift */
+ /* (for fauxing) */
+#endif
+
+ FT_Bool pathIsOpen; /* true after MoveTo */
+ FT_Bool darken; /* true if stem darkening */
+ FT_Bool moveIsPending; /* true between MoveTo and offset MoveTo */
+
+ /* references used to call `cf2_hintmap_build', if necessary */
+ CF2_ArrStack hStemHintArray;
+ CF2_ArrStack vStemHintArray;
+ CF2_HintMask hintMask; /* ptr to the current mask */
+ CF2_Fixed hintOriginY; /* copy of current origin */
+ const CF2_BluesRec* blues;
+
+ CF2_Fixed xOffset; /* character space offsets */
+ CF2_Fixed yOffset;
+
+ /* character space miter limit threshold */
+ CF2_Fixed miterLimit;
+ /* vertical/horzizontal snap distance in character space */
+ CF2_Fixed snapThreshold;
+
+ FT_Vector offsetStart0; /* first and second points of first */
+ FT_Vector offsetStart1; /* element with offset applied */
+
+ /* current point, character space, before offset */
+ FT_Vector currentCS;
+ /* current point, device space */
+ FT_Vector currentDS;
+ FT_Vector start; /* start point of subpath */
+
+ /* the following members constitute the `queue' of one element */
+ FT_Bool elemIsQueued;
+ CF2_Int prevElemOp;
+
+ FT_Vector prevElemP0;
+ FT_Vector prevElemP1;
+ FT_Vector prevElemP2;
+ FT_Vector prevElemP3;
+
+ } CF2_GlyphPathRec, *CF2_GlyphPath;
+
+
+ FT_LOCAL( void )
+ cf2_glyphpath_init( CF2_GlyphPath glyphpath,
+ CF2_Font font,
+ CF2_OutlineCallbacks callbacks,
+ CF2_Fixed scaleY,
+ /* CF2_Fixed hShift, */
+ CF2_ArrStack hStemHintArray,
+ CF2_ArrStack vStemHintArray,
+ CF2_HintMask hintMask,
+ CF2_Fixed hintOrigin,
+ const CF2_Blues blues,
+ const FT_Vector* fractionalTranslation );
+ FT_LOCAL( void )
+ cf2_glyphpath_finalize( CF2_GlyphPath glyphpath );
+
+ FT_LOCAL( void )
+ cf2_glyphpath_moveTo( CF2_GlyphPath glyphpath,
+ CF2_Fixed x,
+ CF2_Fixed y );
+ FT_LOCAL( void )
+ cf2_glyphpath_lineTo( CF2_GlyphPath glyphpath,
+ CF2_Fixed x,
+ CF2_Fixed y );
+ FT_LOCAL( void )
+ cf2_glyphpath_curveTo( CF2_GlyphPath glyphpath,
+ CF2_Fixed x1,
+ CF2_Fixed y1,
+ CF2_Fixed x2,
+ CF2_Fixed y2,
+ CF2_Fixed x3,
+ CF2_Fixed y3 );
+ FT_LOCAL( void )
+ cf2_glyphpath_closeOpenPath( CF2_GlyphPath glyphpath );
+
+
+FT_END_HEADER
+
+
+#endif /* __CF2HINTS_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2intrp.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2intrp.c
new file mode 100644
index 0000000000..12f5dd79e7
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2intrp.c
@@ -0,0 +1,1540 @@
+/***************************************************************************/
+/* */
+/* cf2intrp.c */
+/* */
+/* Adobe's CFF Interpreter (body). */
+/* */
+/* Copyright 2007-2013 Adobe Systems Incorporated. */
+/* */
+/* This software, and all works of authorship, whether in source or */
+/* object code form as indicated by the copyright notice(s) included */
+/* herein (collectively, the "Work") is made available, and may only be */
+/* used, modified, and distributed under the FreeType Project License, */
+/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */
+/* FreeType Project License, each contributor to the Work hereby grants */
+/* to any individual or legal entity exercising permissions granted by */
+/* the FreeType Project License and this section (hereafter, "You" or */
+/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */
+/* royalty-free, irrevocable (except as stated in this section) patent */
+/* license to make, have made, use, offer to sell, sell, import, and */
+/* otherwise transfer the Work, where such license applies only to those */
+/* patent claims licensable by such contributor that are necessarily */
+/* infringed by their contribution(s) alone or by combination of their */
+/* contribution(s) with the Work to which such contribution(s) was */
+/* submitted. If You institute patent litigation against any entity */
+/* (including a cross-claim or counterclaim in a lawsuit) alleging that */
+/* the Work or a contribution incorporated within the Work constitutes */
+/* direct or contributory patent infringement, then any patent licenses */
+/* granted to You under this License for that Work shall terminate as of */
+/* the date such litigation is filed. */
+/* */
+/* By using, modifying, or distributing the Work you indicate that you */
+/* have read and understood the terms and conditions of the */
+/* FreeType Project License as well as those provided in this section, */
+/* and you accept them fully. */
+/* */
+/***************************************************************************/
+
+
+#include "cf2ft.h"
+#include "../../include/freetype/internal/ftdebug.h"
+
+#include "cf2glue.h"
+#include "cf2font.h"
+#include "cf2stack.h"
+#include "cf2hints.h"
+
+#include "cf2error.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_cf2interp
+
+
+ /* some operators are not implemented yet */
+#define CF2_FIXME FT_TRACE4(( "cf2_interpT2CharString:" \
+ " operator not implemented yet\n" ))
+
+
+
+ FT_LOCAL_DEF( void )
+ cf2_hintmask_init( CF2_HintMask hintmask,
+ FT_Error* error )
+ {
+ FT_ZERO( hintmask );
+
+ hintmask->error = error;
+ }
+
+
+ FT_LOCAL_DEF( FT_Bool )
+ cf2_hintmask_isValid( const CF2_HintMask hintmask )
+ {
+ return hintmask->isValid;
+ }
+
+
+ FT_LOCAL_DEF( FT_Bool )
+ cf2_hintmask_isNew( const CF2_HintMask hintmask )
+ {
+ return hintmask->isNew;
+ }
+
+
+ FT_LOCAL_DEF( void )
+ cf2_hintmask_setNew( CF2_HintMask hintmask,
+ FT_Bool val )
+ {
+ hintmask->isNew = val;
+ }
+
+
+ /* clients call `getMaskPtr' in order to iterate */
+ /* through hint mask */
+
+ FT_LOCAL_DEF( FT_Byte* )
+ cf2_hintmask_getMaskPtr( CF2_HintMask hintmask )
+ {
+ return hintmask->mask;
+ }
+
+
+ static size_t
+ cf2_hintmask_setCounts( CF2_HintMask hintmask,
+ size_t bitCount )
+ {
+ if ( bitCount > CF2_MAX_HINTS )
+ {
+ /* total of h and v stems must be <= 96 */
+ CF2_SET_ERROR( hintmask->error, Invalid_Glyph_Format );
+ return 0;
+ }
+
+ hintmask->bitCount = bitCount;
+ hintmask->byteCount = ( hintmask->bitCount + 7 ) / 8;
+
+ hintmask->isValid = TRUE;
+ hintmask->isNew = TRUE;
+
+ return bitCount;
+ }
+
+
+ /* consume the hintmask bytes from the charstring, advancing the src */
+ /* pointer */
+ static void
+ cf2_hintmask_read( CF2_HintMask hintmask,
+ CF2_Buffer charstring,
+ size_t bitCount )
+ {
+ size_t i;
+
+#ifndef CF2_NDEBUG
+ /* these are the bits in the final mask byte that should be zero */
+ /* Note: this variable is only used in an assert expression below */
+ /* and then only if CF2_NDEBUG is not defined */
+ CF2_UInt mask = ( 1 << ( -(CF2_Int)bitCount & 7 ) ) - 1;
+#endif
+
+
+ /* initialize counts and isValid */
+ if ( cf2_hintmask_setCounts( hintmask, bitCount ) == 0 )
+ return;
+
+ FT_ASSERT( hintmask->byteCount > 0 );
+
+ FT_TRACE4(( " (maskbytes:" ));
+
+ /* set mask and advance interpreter's charstring pointer */
+ for ( i = 0; i < hintmask->byteCount; i++ )
+ {
+ hintmask->mask[i] = (FT_Byte)cf2_buf_readByte( charstring );
+ FT_TRACE4(( " 0x%02X", hintmask->mask[i] ));
+ }
+
+ FT_TRACE4(( ")\n" ));
+
+ /* assert any unused bits in last byte are zero unless there's a prior */
+ /* error */
+ /* bitCount -> mask, 0 -> 0, 1 -> 7f, 2 -> 3f, ... 6 -> 3, 7 -> 1 */
+#ifndef CF2_NDEBUG
+ FT_ASSERT( ( hintmask->mask[hintmask->byteCount - 1] & mask ) == 0 ||
+ *hintmask->error );
+#endif
+ }
+
+
+ FT_LOCAL_DEF( void )
+ cf2_hintmask_setAll( CF2_HintMask hintmask,
+ size_t bitCount )
+ {
+ size_t i;
+ CF2_UInt mask = ( 1 << ( -(CF2_Int)bitCount & 7 ) ) - 1;
+
+
+ /* initialize counts and isValid */
+ if ( cf2_hintmask_setCounts( hintmask, bitCount ) == 0 )
+ return;
+
+ FT_ASSERT( hintmask->byteCount > 0 );
+ FT_ASSERT( hintmask->byteCount <
+ sizeof ( hintmask->mask ) / sizeof ( hintmask->mask[0] ) );
+
+ /* set mask to all ones */
+ for ( i = 0; i < hintmask->byteCount; i++ )
+ hintmask->mask[i] = 0xFF;
+
+ /* clear unused bits */
+ /* bitCount -> mask, 0 -> 0, 1 -> 7f, 2 -> 3f, ... 6 -> 3, 7 -> 1 */
+ hintmask->mask[hintmask->byteCount - 1] &= ~mask;
+ }
+
+
+ /* Type2 charstring opcodes */
+ enum
+ {
+ cf2_cmdRESERVED_0, /* 0 */
+ cf2_cmdHSTEM, /* 1 */
+ cf2_cmdRESERVED_2, /* 2 */
+ cf2_cmdVSTEM, /* 3 */
+ cf2_cmdVMOVETO, /* 4 */
+ cf2_cmdRLINETO, /* 5 */
+ cf2_cmdHLINETO, /* 6 */
+ cf2_cmdVLINETO, /* 7 */
+ cf2_cmdRRCURVETO, /* 8 */
+ cf2_cmdRESERVED_9, /* 9 */
+ cf2_cmdCALLSUBR, /* 10 */
+ cf2_cmdRETURN, /* 11 */
+ cf2_cmdESC, /* 12 */
+ cf2_cmdRESERVED_13, /* 13 */
+ cf2_cmdENDCHAR, /* 14 */
+ cf2_cmdRESERVED_15, /* 15 */
+ cf2_cmdRESERVED_16, /* 16 */
+ cf2_cmdRESERVED_17, /* 17 */
+ cf2_cmdHSTEMHM, /* 18 */
+ cf2_cmdHINTMASK, /* 19 */
+ cf2_cmdCNTRMASK, /* 20 */
+ cf2_cmdRMOVETO, /* 21 */
+ cf2_cmdHMOVETO, /* 22 */
+ cf2_cmdVSTEMHM, /* 23 */
+ cf2_cmdRCURVELINE, /* 24 */
+ cf2_cmdRLINECURVE, /* 25 */
+ cf2_cmdVVCURVETO, /* 26 */
+ cf2_cmdHHCURVETO, /* 27 */
+ cf2_cmdEXTENDEDNMBR, /* 28 */
+ cf2_cmdCALLGSUBR, /* 29 */
+ cf2_cmdVHCURVETO, /* 30 */
+ cf2_cmdHVCURVETO /* 31 */
+ };
+
+ enum
+ {
+ cf2_escDOTSECTION, /* 0 */
+ cf2_escRESERVED_1, /* 1 */
+ cf2_escRESERVED_2, /* 2 */
+ cf2_escAND, /* 3 */
+ cf2_escOR, /* 4 */
+ cf2_escNOT, /* 5 */
+ cf2_escRESERVED_6, /* 6 */
+ cf2_escRESERVED_7, /* 7 */
+ cf2_escRESERVED_8, /* 8 */
+ cf2_escABS, /* 9 */
+ cf2_escADD, /* 10 like otherADD */
+ cf2_escSUB, /* 11 like otherSUB */
+ cf2_escDIV, /* 12 */
+ cf2_escRESERVED_13, /* 13 */
+ cf2_escNEG, /* 14 */
+ cf2_escEQ, /* 15 */
+ cf2_escRESERVED_16, /* 16 */
+ cf2_escRESERVED_17, /* 17 */
+ cf2_escDROP, /* 18 */
+ cf2_escRESERVED_19, /* 19 */
+ cf2_escPUT, /* 20 like otherPUT */
+ cf2_escGET, /* 21 like otherGET */
+ cf2_escIFELSE, /* 22 like otherIFELSE */
+ cf2_escRANDOM, /* 23 like otherRANDOM */
+ cf2_escMUL, /* 24 like otherMUL */
+ cf2_escRESERVED_25, /* 25 */
+ cf2_escSQRT, /* 26 */
+ cf2_escDUP, /* 27 like otherDUP */
+ cf2_escEXCH, /* 28 like otherEXCH */
+ cf2_escINDEX, /* 29 */
+ cf2_escROLL, /* 30 */
+ cf2_escRESERVED_31, /* 31 */
+ cf2_escRESERVED_32, /* 32 */
+ cf2_escRESERVED_33, /* 33 */
+ cf2_escHFLEX, /* 34 */
+ cf2_escFLEX, /* 35 */
+ cf2_escHFLEX1, /* 36 */
+ cf2_escFLEX1 /* 37 */
+ };
+
+
+ /* `stemHintArray' does not change once we start drawing the outline. */
+ static void
+ cf2_doStems( const CF2_Font font,
+ CF2_Stack opStack,
+ CF2_ArrStack stemHintArray,
+ CF2_Fixed* width,
+ FT_Bool* haveWidth,
+ CF2_Fixed hintOffset )
+ {
+ CF2_UInt i;
+ CF2_UInt count = cf2_stack_count( opStack );
+ FT_Bool hasWidthArg = (FT_Bool)( count & 1 );
+
+ /* variable accumulates delta values from operand stack */
+ CF2_Fixed position = hintOffset;
+
+ if ( hasWidthArg && ! *haveWidth )
+ *width = cf2_stack_getReal( opStack, 0 ) +
+ cf2_getNominalWidthX( font->decoder );
+
+ if ( font->decoder->width_only )
+ goto exit;
+
+ for ( i = hasWidthArg ? 1 : 0; i < count; i += 2 )
+ {
+ /* construct a CF2_StemHint and push it onto the list */
+ CF2_StemHintRec stemhint;
+
+
+ stemhint.min =
+ position += cf2_stack_getReal( opStack, i );
+ stemhint.max =
+ position += cf2_stack_getReal( opStack, i + 1 );
+
+ stemhint.used = FALSE;
+ stemhint.maxDS =
+ stemhint.minDS = 0;
+
+ cf2_arrstack_push( stemHintArray, &stemhint ); /* defer error check */
+ }
+
+ cf2_stack_clear( opStack );
+
+ exit:
+ /* cf2_doStems must define a width (may be default) */
+ *haveWidth = TRUE;
+ }
+
+
+ static void
+ cf2_doFlex( CF2_Stack opStack,
+ CF2_Fixed* curX,
+ CF2_Fixed* curY,
+ CF2_GlyphPath glyphPath,
+ const FT_Bool* readFromStack,
+ FT_Bool doConditionalLastRead )
+ {
+ CF2_Fixed vals[14];
+ CF2_UInt index;
+ FT_Bool isHFlex;
+ CF2_Int top, i, j;
+
+
+ vals[0] = *curX;
+ vals[1] = *curY;
+ index = 0;
+ isHFlex = readFromStack[9] == FALSE;
+ top = isHFlex ? 9 : 10;
+
+ for ( i = 0; i < top; i++ )
+ {
+ vals[i + 2] = vals[i];
+ if ( readFromStack[i] )
+ vals[i + 2] += cf2_stack_getReal( opStack, index++ );
+ }
+
+ if ( isHFlex )
+ vals[9 + 2] = *curY;
+
+ if ( doConditionalLastRead )
+ {
+ FT_Bool lastIsX = (FT_Bool)( cf2_fixedAbs( vals[10] - *curX ) >
+ cf2_fixedAbs( vals[11] - *curY ) );
+ CF2_Fixed lastVal = cf2_stack_getReal( opStack, index );
+
+
+ if ( lastIsX )
+ {
+ vals[12] = vals[10] + lastVal;
+ vals[13] = *curY;
+ }
+ else
+ {
+ vals[12] = *curX;
+ vals[13] = vals[11] + lastVal;
+ }
+ }
+ else
+ {
+ if ( readFromStack[10] )
+ vals[12] = vals[10] + cf2_stack_getReal( opStack, index++ );
+ else
+ vals[12] = *curX;
+
+ if ( readFromStack[11] )
+ vals[13] = vals[11] + cf2_stack_getReal( opStack, index );
+ else
+ vals[13] = *curY;
+ }
+
+ for ( j = 0; j < 2; j++ )
+ cf2_glyphpath_curveTo( glyphPath, vals[j * 6 + 2],
+ vals[j * 6 + 3],
+ vals[j * 6 + 4],
+ vals[j * 6 + 5],
+ vals[j * 6 + 6],
+ vals[j * 6 + 7] );
+
+ cf2_stack_clear( opStack );
+
+ *curX = vals[12];
+ *curY = vals[13];
+ }
+
+
+ /*
+ * `error' is a shared error code used by many objects in this
+ * routine. Before the code continues from an error, it must check and
+ * record the error in `*error'. The idea is that this shared
+ * error code will record the first error encountered. If testing
+ * for an error anyway, the cost of `goto exit' is small, so we do it,
+ * even if continuing would be safe. In this case, `lastError' is
+ * set, so the testing and storing can be done in one place, at `exit'.
+ *
+ * Continuing after an error is intended for objects which do their own
+ * testing of `*error', e.g., array stack functions. This allows us to
+ * avoid an extra test after the call.
+ *
+ * Unimplemented opcodes are ignored.
+ *
+ */
+ FT_LOCAL_DEF( void )
+ cf2_interpT2CharString( CF2_Font font,
+ CF2_Buffer buf,
+ CF2_OutlineCallbacks callbacks,
+ const FT_Vector* translation,
+ FT_Bool doingSeac,
+ CF2_Fixed curX,
+ CF2_Fixed curY,
+ CF2_Fixed* width )
+ {
+ /* lastError is used for errors that are immediately tested */
+ FT_Error lastError = FT_Err_Ok;
+
+ /* pointer to parsed font object */
+ CFF_Decoder* decoder = font->decoder;
+
+ FT_Error* error = &font->error;
+ FT_Memory memory = font->memory;
+
+ CF2_Fixed scaleY = font->innerTransform.d;
+ CF2_Fixed nominalWidthX = cf2_getNominalWidthX( decoder );
+
+ /* save this for hinting seac accents */
+ CF2_Fixed hintOriginY = curY;
+
+ CF2_Stack opStack = NULL;
+ FT_Byte op1; /* first opcode byte */
+
+ /* instruction limit; 20,000,000 matches Avalon */
+ FT_UInt32 instructionLimit = 20000000UL;
+
+ CF2_ArrStackRec subrStack;
+
+ FT_Bool haveWidth;
+ CF2_Buffer charstring = NULL;
+
+ CF2_Int charstringIndex = -1; /* initialize to empty */
+
+ /* TODO: placeholders for hint structures */
+
+ /* objects used for hinting */
+ CF2_ArrStackRec hStemHintArray;
+ CF2_ArrStackRec vStemHintArray;
+
+ CF2_HintMaskRec hintMask;
+ CF2_GlyphPathRec glyphPath;
+
+ int refCount = 0;
+
+
+ /* initialize the remaining objects */
+ cf2_arrstack_init( &subrStack,
+ memory,
+ error,
+ sizeof ( CF2_BufferRec ) );
+ cf2_arrstack_init( &hStemHintArray,
+ memory,
+ error,
+ sizeof ( CF2_StemHintRec ) );
+ cf2_arrstack_init( &vStemHintArray,
+ memory,
+ error,
+ sizeof ( CF2_StemHintRec ) );
+
+ /* initialize CF2_StemHint arrays */
+ cf2_hintmask_init( &hintMask, error );
+
+ /* initialize path map to manage drawing operations */
+
+ /* Note: last 4 params are used to handle `MoveToPermissive', which */
+ /* may need to call `hintMap.Build' */
+ /* TODO: MoveToPermissive is gone; are these still needed? */
+ cf2_glyphpath_init( &glyphPath,
+ font,
+ callbacks,
+ scaleY,
+ /* hShift, */
+ &hStemHintArray,
+ &vStemHintArray,
+ &hintMask,
+ hintOriginY,
+ &font->blues,
+ translation );
+
+ /*
+ * Initialize state for width parsing. From the CFF Spec:
+ *
+ * The first stack-clearing operator, which must be one of hstem,
+ * hstemhm, vstem, vstemhm, cntrmask, hintmask, hmoveto, vmoveto,
+ * rmoveto, or endchar, takes an additional argument - the width (as
+ * described earlier), which may be expressed as zero or one numeric
+ * argument.
+ *
+ * What we implement here uses the first validly specified width, but
+ * does not detect errors for specifying more than one width.
+ *
+ * If one of the above operators occurs without explicitly specifying
+ * a width, we assume the default width.
+ *
+ */
+ haveWidth = FALSE;
+ *width = cf2_getDefaultWidthX( decoder );
+
+ /*
+ * Note: at this point, all pointers to resources must be NULL
+ * and all local objects must be initialized.
+ * There must be no branches to exit: above this point.
+ *
+ */
+
+ /* allocate an operand stack */
+ opStack = cf2_stack_init( memory, error );
+ if ( !opStack )
+ {
+ lastError = FT_THROW( Out_Of_Memory );
+ goto exit;
+ }
+
+ /* initialize subroutine stack by placing top level charstring as */
+ /* first element (max depth plus one for the charstring) */
+ /* Note: Caller owns and must finalize the first charstring. */
+ /* Our copy of it does not change that requirement. */
+ cf2_arrstack_setCount( &subrStack, CF2_MAX_SUBR + 1 );
+
+ charstring = (CF2_Buffer)cf2_arrstack_getBuffer( &subrStack );
+ *charstring = *buf; /* structure copy */
+
+ charstringIndex = 0; /* entry is valid now */
+
+ /* catch errors so far */
+ if ( *error )
+ goto exit;
+
+ /* main interpreter loop */
+ while ( refCount++ < 10240 )
+ {
+ if ( cf2_buf_isEnd( charstring ) )
+ {
+ /* If we've reached the end of the charstring, simulate a */
+ /* cf2_cmdRETURN or cf2_cmdENDCHAR. */
+ if ( charstringIndex )
+ op1 = cf2_cmdRETURN; /* end of buffer for subroutine */
+ else
+ op1 = cf2_cmdENDCHAR; /* end of buffer for top level charstring */
+ }
+ else
+ op1 = (FT_Byte)cf2_buf_readByte( charstring );
+
+ /* check for errors once per loop */
+ if ( *error )
+ goto exit;
+
+ instructionLimit--;
+ if ( instructionLimit == 0 )
+ {
+ lastError = FT_THROW( Invalid_Glyph_Format );
+ goto exit;
+ }
+
+ switch( op1 )
+ {
+ case cf2_cmdRESERVED_0:
+ case cf2_cmdRESERVED_2:
+ case cf2_cmdRESERVED_9:
+ case cf2_cmdRESERVED_13:
+ case cf2_cmdRESERVED_15:
+ case cf2_cmdRESERVED_16:
+ case cf2_cmdRESERVED_17:
+ /* we may get here if we have a prior error */
+ FT_TRACE4(( " unknown op (%d)\n", op1 ));
+ break;
+
+ case cf2_cmdHSTEMHM:
+ case cf2_cmdHSTEM:
+ FT_TRACE4(( op1 == cf2_cmdHSTEMHM ? " hstemhm\n" : " hstem\n" ));
+
+ /* never add hints after the mask is computed */
+ if ( cf2_hintmask_isValid( &hintMask ) )
+ FT_TRACE4(( "cf2_interpT2CharString:"
+ " invalid horizontal hint mask\n" ));
+
+ cf2_doStems( font,
+ opStack,
+ &hStemHintArray,
+ width,
+ &haveWidth,
+ 0 );
+
+ if ( font->decoder->width_only )
+ goto exit;
+
+ break;
+
+ case cf2_cmdVSTEMHM:
+ case cf2_cmdVSTEM:
+ FT_TRACE4(( op1 == cf2_cmdVSTEMHM ? " vstemhm\n" : " vstem\n" ));
+
+ /* never add hints after the mask is computed */
+ if ( cf2_hintmask_isValid( &hintMask ) )
+ FT_TRACE4(( "cf2_interpT2CharString:"
+ " invalid vertical hint mask\n" ));
+
+ cf2_doStems( font,
+ opStack,
+ &vStemHintArray,
+ width,
+ &haveWidth,
+ 0 );
+
+ if ( font->decoder->width_only )
+ goto exit;
+
+ break;
+
+ case cf2_cmdVMOVETO:
+ FT_TRACE4(( " vmoveto\n" ));
+
+ if ( cf2_stack_count( opStack ) > 1 && !haveWidth )
+ *width = cf2_stack_getReal( opStack, 0 ) + nominalWidthX;
+
+ /* width is defined or default after this */
+ haveWidth = TRUE;
+
+ if ( font->decoder->width_only )
+ goto exit;
+
+ curY += cf2_stack_popFixed( opStack );
+
+ cf2_glyphpath_moveTo( &glyphPath, curX, curY );
+
+ break;
+
+ case cf2_cmdRLINETO:
+ {
+ CF2_UInt index;
+ CF2_UInt count = cf2_stack_count( opStack );
+
+
+ FT_TRACE4(( " rlineto\n" ));
+
+ for ( index = 0; index < count; index += 2 )
+ {
+ curX += cf2_stack_getReal( opStack, index + 0 );
+ curY += cf2_stack_getReal( opStack, index + 1 );
+
+ cf2_glyphpath_lineTo( &glyphPath, curX, curY );
+ }
+
+ cf2_stack_clear( opStack );
+ }
+ continue; /* no need to clear stack again */
+
+ case cf2_cmdHLINETO:
+ case cf2_cmdVLINETO:
+ {
+ CF2_UInt index;
+ CF2_UInt count = cf2_stack_count( opStack );
+
+ FT_Bool isX = op1 == cf2_cmdHLINETO;
+
+
+ FT_TRACE4(( isX ? " hlineto\n" : " vlineto\n" ));
+
+ for ( index = 0; index < count; index++ )
+ {
+ CF2_Fixed v = cf2_stack_getReal( opStack, index );
+
+
+ if ( isX )
+ curX += v;
+ else
+ curY += v;
+
+ isX = !isX;
+
+ cf2_glyphpath_lineTo( &glyphPath, curX, curY );
+ }
+
+ cf2_stack_clear( opStack );
+ }
+ continue;
+
+ case cf2_cmdRCURVELINE:
+ case cf2_cmdRRCURVETO:
+ {
+ CF2_UInt count = cf2_stack_count( opStack );
+ CF2_UInt index = 0;
+
+
+ FT_TRACE4(( op1 == cf2_cmdRCURVELINE ? " rcurveline\n"
+ : " rrcurveto\n" ));
+
+ while ( index + 6 <= count )
+ {
+ CF2_Fixed x1 = cf2_stack_getReal( opStack, index + 0 ) + curX;
+ CF2_Fixed y1 = cf2_stack_getReal( opStack, index + 1 ) + curY;
+ CF2_Fixed x2 = cf2_stack_getReal( opStack, index + 2 ) + x1;
+ CF2_Fixed y2 = cf2_stack_getReal( opStack, index + 3 ) + y1;
+ CF2_Fixed x3 = cf2_stack_getReal( opStack, index + 4 ) + x2;
+ CF2_Fixed y3 = cf2_stack_getReal( opStack, index + 5 ) + y2;
+
+
+ cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 );
+
+ curX = x3;
+ curY = y3;
+ index += 6;
+ }
+
+ if ( op1 == cf2_cmdRCURVELINE )
+ {
+ curX += cf2_stack_getReal( opStack, index + 0 );
+ curY += cf2_stack_getReal( opStack, index + 1 );
+
+ cf2_glyphpath_lineTo( &glyphPath, curX, curY );
+ }
+
+ cf2_stack_clear( opStack );
+ }
+ continue; /* no need to clear stack again */
+
+ case cf2_cmdCALLGSUBR:
+ case cf2_cmdCALLSUBR:
+ {
+ CF2_UInt subrIndex;
+
+
+ FT_TRACE4(( op1 == cf2_cmdCALLGSUBR ? " callgsubr"
+ : " callsubr" ));
+
+ if ( charstringIndex > CF2_MAX_SUBR )
+ {
+ /* max subr plus one for charstring */
+ lastError = FT_THROW( Invalid_Glyph_Format );
+ goto exit; /* overflow of stack */
+ }
+
+ /* push our current CFF charstring region on subrStack */
+ charstring = (CF2_Buffer)
+ cf2_arrstack_getPointer( &subrStack,
+ charstringIndex + 1 );
+
+ /* set up the new CFF region and pointer */
+ subrIndex = cf2_stack_popInt( opStack );
+
+ switch ( op1 )
+ {
+ case cf2_cmdCALLGSUBR:
+ FT_TRACE4(( "(%d)\n", subrIndex + decoder->globals_bias ));
+
+ if ( cf2_initGlobalRegionBuffer( decoder,
+ subrIndex,
+ charstring ) )
+ {
+ lastError = FT_THROW( Invalid_Glyph_Format );
+ goto exit; /* subroutine lookup or stream error */
+ }
+ break;
+
+ default:
+ /* cf2_cmdCALLSUBR */
+ FT_TRACE4(( "(%d)\n", subrIndex + decoder->locals_bias ));
+
+ if ( cf2_initLocalRegionBuffer( decoder,
+ subrIndex,
+ charstring ) )
+ {
+ lastError = FT_THROW( Invalid_Glyph_Format );
+ goto exit; /* subroutine lookup or stream error */
+ }
+ }
+
+ charstringIndex += 1; /* entry is valid now */
+ }
+ continue; /* do not clear the stack */
+
+ case cf2_cmdRETURN:
+ FT_TRACE4(( " return\n" ));
+
+ if ( charstringIndex < 1 )
+ {
+ /* Note: cannot return from top charstring */
+ lastError = FT_THROW( Invalid_Glyph_Format );
+ goto exit; /* underflow of stack */
+ }
+
+ /* restore position in previous charstring */
+ charstring = (CF2_Buffer)
+ cf2_arrstack_getPointer( &subrStack,
+ --charstringIndex );
+ continue; /* do not clear the stack */
+
+ case cf2_cmdESC:
+ {
+ FT_Byte op2 = (FT_Byte)cf2_buf_readByte( charstring );
+
+
+ switch ( op2 )
+ {
+ case cf2_escDOTSECTION:
+ /* something about `flip type of locking' -- ignore it */
+ FT_TRACE4(( " dotsection\n" ));
+
+ break;
+
+ /* TODO: should these operators be supported? */
+ case cf2_escAND: /* in spec */
+ FT_TRACE4(( " and\n" ));
+
+ CF2_FIXME;
+ break;
+
+ case cf2_escOR: /* in spec */
+ FT_TRACE4(( " or\n" ));
+
+ CF2_FIXME;
+ break;
+
+ case cf2_escNOT: /* in spec */
+ FT_TRACE4(( " not\n" ));
+
+ CF2_FIXME;
+ break;
+
+ case cf2_escABS: /* in spec */
+ FT_TRACE4(( " abs\n" ));
+
+ CF2_FIXME;
+ break;
+
+ case cf2_escADD: /* in spec */
+ FT_TRACE4(( " add\n" ));
+
+ CF2_FIXME;
+ break;
+
+ case cf2_escSUB: /* in spec */
+ FT_TRACE4(( " sub\n" ));
+
+ CF2_FIXME;
+ break;
+
+ case cf2_escDIV: /* in spec */
+ FT_TRACE4(( " div\n" ));
+
+ CF2_FIXME;
+ break;
+
+ case cf2_escNEG: /* in spec */
+ FT_TRACE4(( " neg\n" ));
+
+ CF2_FIXME;
+ break;
+
+ case cf2_escEQ: /* in spec */
+ FT_TRACE4(( " eq\n" ));
+
+ CF2_FIXME;
+ break;
+
+ case cf2_escDROP: /* in spec */
+ FT_TRACE4(( " drop\n" ));
+
+ CF2_FIXME;
+ break;
+
+ case cf2_escPUT: /* in spec */
+ FT_TRACE4(( " put\n" ));
+
+ CF2_FIXME;
+ break;
+
+ case cf2_escGET: /* in spec */
+ FT_TRACE4(( " get\n" ));
+
+ CF2_FIXME;
+ break;
+
+ case cf2_escIFELSE: /* in spec */
+ FT_TRACE4(( " ifelse\n" ));
+
+ CF2_FIXME;
+ break;
+
+ case cf2_escRANDOM: /* in spec */
+ FT_TRACE4(( " random\n" ));
+
+ CF2_FIXME;
+ break;
+
+ case cf2_escMUL: /* in spec */
+ FT_TRACE4(( " mul\n" ));
+
+ CF2_FIXME;
+ break;
+
+ case cf2_escSQRT: /* in spec */
+ FT_TRACE4(( " sqrt\n" ));
+
+ CF2_FIXME;
+ break;
+
+ case cf2_escDUP: /* in spec */
+ FT_TRACE4(( " dup\n" ));
+
+ CF2_FIXME;
+ break;
+
+ case cf2_escEXCH: /* in spec */
+ FT_TRACE4(( " exch\n" ));
+
+ CF2_FIXME;
+ break;
+
+ case cf2_escINDEX: /* in spec */
+ FT_TRACE4(( " index\n" ));
+
+ CF2_FIXME;
+ break;
+
+ case cf2_escROLL: /* in spec */
+ FT_TRACE4(( " roll\n" ));
+
+ CF2_FIXME;
+ break;
+
+ case cf2_escHFLEX:
+ {
+ static const FT_Bool readFromStack[12] =
+ {
+ TRUE /* dx1 */, FALSE /* dy1 */,
+ TRUE /* dx2 */, TRUE /* dy2 */,
+ TRUE /* dx3 */, FALSE /* dy3 */,
+ TRUE /* dx4 */, FALSE /* dy4 */,
+ TRUE /* dx5 */, FALSE /* dy5 */,
+ TRUE /* dx6 */, FALSE /* dy6 */
+ };
+
+
+ FT_TRACE4(( " hflex\n" ));
+
+ cf2_doFlex( opStack,
+ &curX,
+ &curY,
+ &glyphPath,
+ readFromStack,
+ FALSE /* doConditionalLastRead */ );
+ }
+ continue;
+
+ case cf2_escFLEX:
+ {
+ static const FT_Bool readFromStack[12] =
+ {
+ TRUE /* dx1 */, TRUE /* dy1 */,
+ TRUE /* dx2 */, TRUE /* dy2 */,
+ TRUE /* dx3 */, TRUE /* dy3 */,
+ TRUE /* dx4 */, TRUE /* dy4 */,
+ TRUE /* dx5 */, TRUE /* dy5 */,
+ TRUE /* dx6 */, TRUE /* dy6 */
+ };
+
+
+ FT_TRACE4(( " flex\n" ));
+
+ cf2_doFlex( opStack,
+ &curX,
+ &curY,
+ &glyphPath,
+ readFromStack,
+ FALSE /* doConditionalLastRead */ );
+ }
+ break; /* TODO: why is this not a continue? */
+
+ case cf2_escHFLEX1:
+ {
+ static const FT_Bool readFromStack[12] =
+ {
+ TRUE /* dx1 */, TRUE /* dy1 */,
+ TRUE /* dx2 */, TRUE /* dy2 */,
+ TRUE /* dx3 */, FALSE /* dy3 */,
+ TRUE /* dx4 */, FALSE /* dy4 */,
+ TRUE /* dx5 */, TRUE /* dy5 */,
+ TRUE /* dx6 */, FALSE /* dy6 */
+ };
+
+
+ FT_TRACE4(( " hflex1\n" ));
+
+ cf2_doFlex( opStack,
+ &curX,
+ &curY,
+ &glyphPath,
+ readFromStack,
+ FALSE /* doConditionalLastRead */ );
+ }
+ continue;
+
+ case cf2_escFLEX1:
+ {
+ static const FT_Bool readFromStack[12] =
+ {
+ TRUE /* dx1 */, TRUE /* dy1 */,
+ TRUE /* dx2 */, TRUE /* dy2 */,
+ TRUE /* dx3 */, TRUE /* dy3 */,
+ TRUE /* dx4 */, TRUE /* dy4 */,
+ TRUE /* dx5 */, TRUE /* dy5 */,
+ FALSE /* dx6 */, FALSE /* dy6 */
+ };
+
+
+ FT_TRACE4(( " flex1\n" ));
+
+ cf2_doFlex( opStack,
+ &curX,
+ &curY,
+ &glyphPath,
+ readFromStack,
+ TRUE /* doConditionalLastRead */ );
+ }
+ continue;
+
+ case cf2_escRESERVED_1:
+ case cf2_escRESERVED_2:
+ case cf2_escRESERVED_6:
+ case cf2_escRESERVED_7:
+ case cf2_escRESERVED_8:
+ case cf2_escRESERVED_13:
+ case cf2_escRESERVED_16:
+ case cf2_escRESERVED_17:
+ case cf2_escRESERVED_19:
+ case cf2_escRESERVED_25:
+ case cf2_escRESERVED_31:
+ case cf2_escRESERVED_32:
+ case cf2_escRESERVED_33:
+ default:
+ FT_TRACE4(( " unknown op (12, %d)\n", op2 ));
+
+ }; /* end of switch statement checking `op2' */
+
+ } /* case cf2_cmdESC */
+ break;
+
+ case cf2_cmdENDCHAR:
+ FT_TRACE4(( " endchar\n" ));
+
+ if ( cf2_stack_count( opStack ) == 1 ||
+ cf2_stack_count( opStack ) == 5 )
+ {
+ if ( !haveWidth )
+ *width = cf2_stack_getReal( opStack, 0 ) + nominalWidthX;
+ }
+
+ /* width is defined or default after this */
+ haveWidth = TRUE;
+
+ if ( font->decoder->width_only )
+ goto exit;
+
+ /* close path if still open */
+ cf2_glyphpath_closeOpenPath( &glyphPath );
+
+ if ( cf2_stack_count( opStack ) > 1 )
+ {
+ /* must be either 4 or 5 -- */
+ /* this is a (deprecated) implied `seac' operator */
+
+ CF2_UInt achar;
+ CF2_UInt bchar;
+ CF2_BufferRec component;
+ CF2_Fixed dummyWidth; /* ignore component width */
+ FT_Error error2;
+
+
+ if ( doingSeac )
+ {
+ lastError = FT_THROW( Invalid_Glyph_Format );
+ goto exit; /* nested seac */
+ }
+
+ achar = cf2_stack_popInt( opStack );
+ bchar = cf2_stack_popInt( opStack );
+
+ curY = cf2_stack_popFixed( opStack );
+ curX = cf2_stack_popFixed( opStack );
+
+ error2 = cf2_getSeacComponent( decoder, achar, &component );
+ if ( error2 )
+ {
+ lastError = error2; /* pass FreeType error through */
+ goto exit;
+ }
+ cf2_interpT2CharString( font,
+ &component,
+ callbacks,
+ translation,
+ TRUE,
+ curX,
+ curY,
+ &dummyWidth );
+ cf2_freeSeacComponent( decoder, &component );
+
+ error2 = cf2_getSeacComponent( decoder, bchar, &component );
+ if ( error2 )
+ {
+ lastError = error2; /* pass FreeType error through */
+ goto exit;
+ }
+ cf2_interpT2CharString( font,
+ &component,
+ callbacks,
+ translation,
+ TRUE,
+ 0,
+ 0,
+ &dummyWidth );
+ cf2_freeSeacComponent( decoder, &component );
+ }
+ goto exit;
+
+ case cf2_cmdCNTRMASK:
+ case cf2_cmdHINTMASK:
+ /* the final \n in the tracing message gets added in */
+ /* `cf2_hintmask_read' (which also traces the mask bytes) */
+ FT_TRACE4(( op1 == cf2_cmdCNTRMASK ? " cntrmask" : " hintmask" ));
+
+ /* if there are arguments on the stack, there this is an */
+ /* implied cf2_cmdVSTEMHM */
+ if ( cf2_stack_count( opStack ) != 0 )
+ {
+ /* never add hints after the mask is computed */
+ if ( cf2_hintmask_isValid( &hintMask ) )
+ FT_TRACE4(( "cf2_interpT2CharString: invalid hint mask\n" ));
+ }
+
+ cf2_doStems( font,
+ opStack,
+ &vStemHintArray,
+ width,
+ &haveWidth,
+ 0 );
+
+ if ( font->decoder->width_only )
+ goto exit;
+
+ if ( op1 == cf2_cmdHINTMASK )
+ {
+ /* consume the hint mask bytes which follow the operator */
+ cf2_hintmask_read( &hintMask,
+ charstring,
+ cf2_arrstack_size( &hStemHintArray ) +
+ cf2_arrstack_size( &vStemHintArray ) );
+ }
+ else
+ {
+ /*
+ * Consume the counter mask bytes which follow the operator:
+ * Build a temporary hint map, just to place and lock those
+ * stems participating in the counter mask. These are most
+ * likely the dominant hstems, and are grouped together in a
+ * few counter groups, not necessarily in correspondence
+ * with the hint groups. This reduces the chances of
+ * conflicts between hstems that are initially placed in
+ * separate hint groups and then brought together. The
+ * positions are copied back to `hStemHintArray', so we can
+ * discard `counterMask' and `counterHintMap'.
+ *
+ */
+ CF2_HintMapRec counterHintMap;
+ CF2_HintMaskRec counterMask;
+
+
+ cf2_hintmap_init( &counterHintMap,
+ font,
+ &glyphPath.initialHintMap,
+ &glyphPath.hintMoves,
+ scaleY );
+ cf2_hintmask_init( &counterMask, error );
+
+ cf2_hintmask_read( &counterMask,
+ charstring,
+ cf2_arrstack_size( &hStemHintArray ) +
+ cf2_arrstack_size( &vStemHintArray ) );
+ cf2_hintmap_build( &counterHintMap,
+ &hStemHintArray,
+ &vStemHintArray,
+ &counterMask,
+ 0,
+ FALSE );
+ }
+ break;
+
+ case cf2_cmdRMOVETO:
+ FT_TRACE4(( " rmoveto\n" ));
+
+ if ( cf2_stack_count( opStack ) > 2 && !haveWidth )
+ *width = cf2_stack_getReal( opStack, 0 ) + nominalWidthX;
+
+ /* width is defined or default after this */
+ haveWidth = TRUE;
+
+ if ( font->decoder->width_only )
+ goto exit;
+
+ curY += cf2_stack_popFixed( opStack );
+ curX += cf2_stack_popFixed( opStack );
+
+ cf2_glyphpath_moveTo( &glyphPath, curX, curY );
+
+ break;
+
+ case cf2_cmdHMOVETO:
+ FT_TRACE4(( " hmoveto\n" ));
+
+ if ( cf2_stack_count( opStack ) > 1 && !haveWidth )
+ *width = cf2_stack_getReal( opStack, 0 ) + nominalWidthX;
+
+ /* width is defined or default after this */
+ haveWidth = TRUE;
+
+ if ( font->decoder->width_only )
+ goto exit;
+
+ curX += cf2_stack_popFixed( opStack );
+
+ cf2_glyphpath_moveTo( &glyphPath, curX, curY );
+
+ break;
+
+ case cf2_cmdRLINECURVE:
+ {
+ CF2_UInt count = cf2_stack_count( opStack );
+ CF2_UInt index = 0;
+
+
+ FT_TRACE4(( " rlinecurve\n" ));
+
+ while ( index + 6 < count )
+ {
+ curX += cf2_stack_getReal( opStack, index + 0 );
+ curY += cf2_stack_getReal( opStack, index + 1 );
+
+ cf2_glyphpath_lineTo( &glyphPath, curX, curY );
+ index += 2;
+ }
+
+ while ( index < count )
+ {
+ CF2_Fixed x1 = cf2_stack_getReal( opStack, index + 0 ) + curX;
+ CF2_Fixed y1 = cf2_stack_getReal( opStack, index + 1 ) + curY;
+ CF2_Fixed x2 = cf2_stack_getReal( opStack, index + 2 ) + x1;
+ CF2_Fixed y2 = cf2_stack_getReal( opStack, index + 3 ) + y1;
+ CF2_Fixed x3 = cf2_stack_getReal( opStack, index + 4 ) + x2;
+ CF2_Fixed y3 = cf2_stack_getReal( opStack, index + 5 ) + y2;
+
+
+ cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 );
+
+ curX = x3;
+ curY = y3;
+ index += 6;
+ }
+
+ cf2_stack_clear( opStack );
+ }
+ continue; /* no need to clear stack again */
+
+ case cf2_cmdVVCURVETO:
+ {
+ CF2_UInt count = cf2_stack_count( opStack );
+ CF2_UInt index = 0;
+
+
+ FT_TRACE4(( " vvcurveto\n" ));
+
+ while ( index < count )
+ {
+ CF2_Fixed x1, y1, x2, y2, x3, y3;
+
+
+ if ( ( count - index ) & 1 )
+ {
+ x1 = cf2_stack_getReal( opStack, index ) + curX;
+
+ ++index;
+ }
+ else
+ x1 = curX;
+
+ y1 = cf2_stack_getReal( opStack, index + 0 ) + curY;
+ x2 = cf2_stack_getReal( opStack, index + 1 ) + x1;
+ y2 = cf2_stack_getReal( opStack, index + 2 ) + y1;
+ x3 = x2;
+ y3 = cf2_stack_getReal( opStack, index + 3 ) + y2;
+
+ cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 );
+
+ curX = x3;
+ curY = y3;
+ index += 4;
+ }
+
+ cf2_stack_clear( opStack );
+ }
+ continue; /* no need to clear stack again */
+
+ case cf2_cmdHHCURVETO:
+ {
+ CF2_UInt count = cf2_stack_count( opStack );
+ CF2_UInt index = 0;
+
+
+ FT_TRACE4(( " hhcurveto\n" ));
+
+ while ( index < count )
+ {
+ CF2_Fixed x1, y1, x2, y2, x3, y3;
+
+
+ if ( ( count - index ) & 1 )
+ {
+ y1 = cf2_stack_getReal( opStack, index ) + curY;
+
+ ++index;
+ }
+ else
+ y1 = curY;
+
+ x1 = cf2_stack_getReal( opStack, index + 0 ) + curX;
+ x2 = cf2_stack_getReal( opStack, index + 1 ) + x1;
+ y2 = cf2_stack_getReal( opStack, index + 2 ) + y1;
+ x3 = cf2_stack_getReal( opStack, index + 3 ) + x2;
+ y3 = y2;
+
+ cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 );
+
+ curX = x3;
+ curY = y3;
+ index += 4;
+ }
+
+ cf2_stack_clear( opStack );
+ }
+ continue; /* no need to clear stack again */
+
+ case cf2_cmdVHCURVETO:
+ case cf2_cmdHVCURVETO:
+ {
+ CF2_UInt count = cf2_stack_count( opStack );
+ CF2_UInt index = 0;
+
+ FT_Bool alternate = op1 == cf2_cmdHVCURVETO;
+
+
+ FT_TRACE4(( alternate ? " hvcurveto\n" : " vhcurveto\n" ));
+
+ while ( index < count )
+ {
+ CF2_Fixed x1, x2, x3, y1, y2, y3;
+
+
+ if ( alternate )
+ {
+ x1 = cf2_stack_getReal( opStack, index + 0 ) + curX;
+ y1 = curY;
+ x2 = cf2_stack_getReal( opStack, index + 1 ) + x1;
+ y2 = cf2_stack_getReal( opStack, index + 2 ) + y1;
+ y3 = cf2_stack_getReal( opStack, index + 3 ) + y2;
+
+ if ( count - index == 5 )
+ {
+ x3 = cf2_stack_getReal( opStack, index + 4 ) + x2;
+
+ ++index;
+ }
+ else
+ x3 = x2;
+
+ alternate = FALSE;
+ }
+ else
+ {
+ x1 = curX;
+ y1 = cf2_stack_getReal( opStack, index + 0 ) + curY;
+ x2 = cf2_stack_getReal( opStack, index + 1 ) + x1;
+ y2 = cf2_stack_getReal( opStack, index + 2 ) + y1;
+ x3 = cf2_stack_getReal( opStack, index + 3 ) + x2;
+
+ if ( count - index == 5 )
+ {
+ y3 = cf2_stack_getReal( opStack, index + 4 ) + y2;
+
+ ++index;
+ }
+ else
+ y3 = y2;
+
+ alternate = TRUE;
+ }
+
+ cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 );
+
+ curX = x3;
+ curY = y3;
+ index += 4;
+ }
+
+ cf2_stack_clear( opStack );
+ }
+ continue; /* no need to clear stack again */
+
+ case cf2_cmdEXTENDEDNMBR:
+ {
+ CF2_Int v;
+
+
+ v = (FT_Short)( ( cf2_buf_readByte( charstring ) << 8 ) |
+ cf2_buf_readByte( charstring ) );
+
+ FT_TRACE4(( " %d", v ));
+
+ cf2_stack_pushInt( opStack, v );
+ }
+ continue;
+
+ default:
+ /* numbers */
+ {
+ if ( /* op1 >= 32 && */ op1 <= 246 )
+ {
+ CF2_Int v;
+
+
+ v = op1 - 139;
+
+ FT_TRACE4(( " %d", v ));
+
+ /* -107 .. 107 */
+ cf2_stack_pushInt( opStack, v );
+ }
+
+ else if ( /* op1 >= 247 && */ op1 <= 250 )
+ {
+ CF2_Int v;
+
+
+ v = op1;
+ v -= 247;
+ v *= 256;
+ v += cf2_buf_readByte( charstring );
+ v += 108;
+
+ FT_TRACE4(( " %d", v ));
+
+ /* 108 .. 1131 */
+ cf2_stack_pushInt( opStack, v );
+ }
+
+ else if ( /* op1 >= 251 && */ op1 <= 254 )
+ {
+ CF2_Int v;
+
+
+ v = op1;
+ v -= 251;
+ v *= 256;
+ v += cf2_buf_readByte( charstring );
+ v = -v - 108;
+
+ FT_TRACE4(( " %d", v ));
+
+ /* -1131 .. -108 */
+ cf2_stack_pushInt( opStack, v );
+ }
+
+ else /* op1 == 255 */
+ {
+ CF2_Fixed v;
+
+
+ v = (CF2_Fixed)
+ ( ( (FT_UInt32)cf2_buf_readByte( charstring ) << 24 ) |
+ ( (FT_UInt32)cf2_buf_readByte( charstring ) << 16 ) |
+ ( (FT_UInt32)cf2_buf_readByte( charstring ) << 8 ) |
+ (FT_UInt32)cf2_buf_readByte( charstring ) );
+
+ FT_TRACE4(( " %.2f", v / 65536.0 ));
+
+ cf2_stack_pushFixed( opStack, v );
+ }
+ }
+ continue; /* don't clear stack */
+
+ } /* end of switch statement checking `op1' */
+
+ cf2_stack_clear( opStack );
+
+ } /* end of main interpreter loop */
+
+ /* we get here if the charstring ends without cf2_cmdENDCHAR */
+ FT_TRACE4(( "cf2_interpT2CharString:"
+ " charstring ends without ENDCHAR\n" ));
+
+ exit:
+ /* check whether last error seen is also the first one */
+ cf2_setError( error, lastError );
+
+ /* free resources from objects we've used */
+ cf2_glyphpath_finalize( &glyphPath );
+ cf2_arrstack_finalize( &vStemHintArray );
+ cf2_arrstack_finalize( &hStemHintArray );
+ cf2_arrstack_finalize( &subrStack );
+ cf2_stack_free( opStack );
+
+ FT_TRACE4(( "\n" ));
+
+ return;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2intrp.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2intrp.h
new file mode 100644
index 0000000000..b5d8947838
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2intrp.h
@@ -0,0 +1,83 @@
+/***************************************************************************/
+/* */
+/* cf2font.h */
+/* */
+/* Adobe's CFF Interpreter (specification). */
+/* */
+/* Copyright 2007-2013 Adobe Systems Incorporated. */
+/* */
+/* This software, and all works of authorship, whether in source or */
+/* object code form as indicated by the copyright notice(s) included */
+/* herein (collectively, the "Work") is made available, and may only be */
+/* used, modified, and distributed under the FreeType Project License, */
+/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */
+/* FreeType Project License, each contributor to the Work hereby grants */
+/* to any individual or legal entity exercising permissions granted by */
+/* the FreeType Project License and this section (hereafter, "You" or */
+/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */
+/* royalty-free, irrevocable (except as stated in this section) patent */
+/* license to make, have made, use, offer to sell, sell, import, and */
+/* otherwise transfer the Work, where such license applies only to those */
+/* patent claims licensable by such contributor that are necessarily */
+/* infringed by their contribution(s) alone or by combination of their */
+/* contribution(s) with the Work to which such contribution(s) was */
+/* submitted. If You institute patent litigation against any entity */
+/* (including a cross-claim or counterclaim in a lawsuit) alleging that */
+/* the Work or a contribution incorporated within the Work constitutes */
+/* direct or contributory patent infringement, then any patent licenses */
+/* granted to You under this License for that Work shall terminate as of */
+/* the date such litigation is filed. */
+/* */
+/* By using, modifying, or distributing the Work you indicate that you */
+/* have read and understood the terms and conditions of the */
+/* FreeType Project License as well as those provided in this section, */
+/* and you accept them fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __CF2INTRP_H__
+#define __CF2INTRP_H__
+
+
+#include "cf2ft.h"
+#include "cf2hints.h"
+
+
+FT_BEGIN_HEADER
+
+
+ FT_LOCAL( void )
+ cf2_hintmask_init( CF2_HintMask hintmask,
+ FT_Error* error );
+ FT_LOCAL( FT_Bool )
+ cf2_hintmask_isValid( const CF2_HintMask hintmask );
+ FT_LOCAL( FT_Bool )
+ cf2_hintmask_isNew( const CF2_HintMask hintmask );
+ FT_LOCAL( void )
+ cf2_hintmask_setNew( CF2_HintMask hintmask,
+ FT_Bool val );
+ FT_LOCAL( FT_Byte* )
+ cf2_hintmask_getMaskPtr( CF2_HintMask hintmask );
+ FT_LOCAL( void )
+ cf2_hintmask_setAll( CF2_HintMask hintmask,
+ size_t bitCount );
+
+ FT_LOCAL( void )
+ cf2_interpT2CharString( CF2_Font font,
+ CF2_Buffer charstring,
+ CF2_OutlineCallbacks callbacks,
+ const FT_Vector* translation,
+ FT_Bool doingSeac,
+ CF2_Fixed curX,
+ CF2_Fixed curY,
+ CF2_Fixed* width );
+
+
+FT_END_HEADER
+
+
+#endif /* __CF2INTRP_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2read.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2read.c
new file mode 100644
index 0000000000..20e9294940
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2read.c
@@ -0,0 +1,112 @@
+/***************************************************************************/
+/* */
+/* cf2read.c */
+/* */
+/* Adobe's code for stream handling (body). */
+/* */
+/* Copyright 2007-2013 Adobe Systems Incorporated. */
+/* */
+/* This software, and all works of authorship, whether in source or */
+/* object code form as indicated by the copyright notice(s) included */
+/* herein (collectively, the "Work") is made available, and may only be */
+/* used, modified, and distributed under the FreeType Project License, */
+/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */
+/* FreeType Project License, each contributor to the Work hereby grants */
+/* to any individual or legal entity exercising permissions granted by */
+/* the FreeType Project License and this section (hereafter, "You" or */
+/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */
+/* royalty-free, irrevocable (except as stated in this section) patent */
+/* license to make, have made, use, offer to sell, sell, import, and */
+/* otherwise transfer the Work, where such license applies only to those */
+/* patent claims licensable by such contributor that are necessarily */
+/* infringed by their contribution(s) alone or by combination of their */
+/* contribution(s) with the Work to which such contribution(s) was */
+/* submitted. If You institute patent litigation against any entity */
+/* (including a cross-claim or counterclaim in a lawsuit) alleging that */
+/* the Work or a contribution incorporated within the Work constitutes */
+/* direct or contributory patent infringement, then any patent licenses */
+/* granted to You under this License for that Work shall terminate as of */
+/* the date such litigation is filed. */
+/* */
+/* By using, modifying, or distributing the Work you indicate that you */
+/* have read and understood the terms and conditions of the */
+/* FreeType Project License as well as those provided in this section, */
+/* and you accept them fully. */
+/* */
+/***************************************************************************/
+
+
+#include "cf2ft.h"
+#include "../../include/freetype/internal/ftdebug.h"
+
+#include "cf2glue.h"
+
+#include "cf2error.h"
+
+
+ /* Define CF2_IO_FAIL as 1 to enable random errors and random */
+ /* value errors in I/O. */
+#define CF2_IO_FAIL 0
+
+
+#if CF2_IO_FAIL
+
+ /* set the .00 value to a nonzero probability */
+ static int
+ randomError2( void )
+ {
+ /* for region buffer ReadByte (interp) function */
+ return (double)rand() / RAND_MAX < .00;
+ }
+
+ /* set the .00 value to a nonzero probability */
+ static CF2_Int
+ randomValue()
+ {
+ return (double)rand() / RAND_MAX < .00 ? rand() : 0;
+ }
+
+#endif /* CF2_IO_FAIL */
+
+
+ /* Region Buffer */
+ /* */
+ /* Can be constructed from a copied buffer managed by */
+ /* `FCM_getDatablock'. */
+ /* Reads bytes with check for end of buffer. */
+
+ /* reading past the end of the buffer sets error and returns zero */
+ FT_LOCAL_DEF( CF2_Int )
+ cf2_buf_readByte( CF2_Buffer buf )
+ {
+ if ( buf->ptr < buf->end )
+ {
+#if CF2_IO_FAIL
+ if ( randomError2() )
+ {
+ CF2_SET_ERROR( buf->error, Invalid_Stream_Operation );
+ return 0;
+ }
+
+ return *(buf->ptr)++ + randomValue();
+#else
+ return *(buf->ptr)++;
+#endif
+ }
+ else
+ {
+ CF2_SET_ERROR( buf->error, Invalid_Stream_Operation );
+ return 0;
+ }
+ }
+
+
+ /* note: end condition can occur without error */
+ FT_LOCAL_DEF( FT_Bool )
+ cf2_buf_isEnd( CF2_Buffer buf )
+ {
+ return (FT_Bool)( buf->ptr >= buf->end );
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2read.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2read.h
new file mode 100644
index 0000000000..7ef7c8c149
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2read.h
@@ -0,0 +1,68 @@
+/***************************************************************************/
+/* */
+/* cf2read.h */
+/* */
+/* Adobe's code for stream handling (specification). */
+/* */
+/* Copyright 2007-2013 Adobe Systems Incorporated. */
+/* */
+/* This software, and all works of authorship, whether in source or */
+/* object code form as indicated by the copyright notice(s) included */
+/* herein (collectively, the "Work") is made available, and may only be */
+/* used, modified, and distributed under the FreeType Project License, */
+/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */
+/* FreeType Project License, each contributor to the Work hereby grants */
+/* to any individual or legal entity exercising permissions granted by */
+/* the FreeType Project License and this section (hereafter, "You" or */
+/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */
+/* royalty-free, irrevocable (except as stated in this section) patent */
+/* license to make, have made, use, offer to sell, sell, import, and */
+/* otherwise transfer the Work, where such license applies only to those */
+/* patent claims licensable by such contributor that are necessarily */
+/* infringed by their contribution(s) alone or by combination of their */
+/* contribution(s) with the Work to which such contribution(s) was */
+/* submitted. If You institute patent litigation against any entity */
+/* (including a cross-claim or counterclaim in a lawsuit) alleging that */
+/* the Work or a contribution incorporated within the Work constitutes */
+/* direct or contributory patent infringement, then any patent licenses */
+/* granted to You under this License for that Work shall terminate as of */
+/* the date such litigation is filed. */
+/* */
+/* By using, modifying, or distributing the Work you indicate that you */
+/* have read and understood the terms and conditions of the */
+/* FreeType Project License as well as those provided in this section, */
+/* and you accept them fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __CF2READ_H__
+#define __CF2READ_H__
+
+
+FT_BEGIN_HEADER
+
+
+ typedef struct CF2_BufferRec_
+ {
+ FT_Error* error;
+ const FT_Byte* start;
+ const FT_Byte* end;
+ const FT_Byte* ptr;
+
+ } CF2_BufferRec, *CF2_Buffer;
+
+
+ FT_LOCAL( CF2_Int )
+ cf2_buf_readByte( CF2_Buffer buf );
+ FT_LOCAL( FT_Bool )
+ cf2_buf_isEnd( CF2_Buffer buf );
+
+
+FT_END_HEADER
+
+
+#endif /* __CF2READ_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2stack.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2stack.c
new file mode 100644
index 0000000000..7930a22cfe
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2stack.c
@@ -0,0 +1,205 @@
+/***************************************************************************/
+/* */
+/* cf2stack.c */
+/* */
+/* Adobe's code for emulating a CFF stack (body). */
+/* */
+/* Copyright 2007-2013 Adobe Systems Incorporated. */
+/* */
+/* This software, and all works of authorship, whether in source or */
+/* object code form as indicated by the copyright notice(s) included */
+/* herein (collectively, the "Work") is made available, and may only be */
+/* used, modified, and distributed under the FreeType Project License, */
+/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */
+/* FreeType Project License, each contributor to the Work hereby grants */
+/* to any individual or legal entity exercising permissions granted by */
+/* the FreeType Project License and this section (hereafter, "You" or */
+/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */
+/* royalty-free, irrevocable (except as stated in this section) patent */
+/* license to make, have made, use, offer to sell, sell, import, and */
+/* otherwise transfer the Work, where such license applies only to those */
+/* patent claims licensable by such contributor that are necessarily */
+/* infringed by their contribution(s) alone or by combination of their */
+/* contribution(s) with the Work to which such contribution(s) was */
+/* submitted. If You institute patent litigation against any entity */
+/* (including a cross-claim or counterclaim in a lawsuit) alleging that */
+/* the Work or a contribution incorporated within the Work constitutes */
+/* direct or contributory patent infringement, then any patent licenses */
+/* granted to You under this License for that Work shall terminate as of */
+/* the date such litigation is filed. */
+/* */
+/* By using, modifying, or distributing the Work you indicate that you */
+/* have read and understood the terms and conditions of the */
+/* FreeType Project License as well as those provided in this section, */
+/* and you accept them fully. */
+/* */
+/***************************************************************************/
+
+
+#include "cf2ft.h"
+#include "../../include/freetype/internal/ftdebug.h"
+
+#include "cf2glue.h"
+#include "cf2font.h"
+#include "cf2stack.h"
+
+#include "cf2error.h"
+
+
+ /* Allocate and initialize an instance of CF2_Stack. */
+ /* Note: This function returns NULL on error (does not set */
+ /* `error'). */
+ FT_LOCAL_DEF( CF2_Stack )
+ cf2_stack_init( FT_Memory memory,
+ FT_Error* e )
+ {
+ FT_Error error = FT_Err_Ok; /* for FT_QNEW */
+
+ CF2_Stack stack = NULL;
+
+
+ if ( !FT_QNEW( stack ) )
+ {
+ /* initialize the structure; FT_QNEW zeroes it */
+ stack->memory = memory;
+ stack->error = e;
+ stack->top = &stack->buffer[0]; /* empty stack */
+ }
+
+ return stack;
+ }
+
+
+ FT_LOCAL_DEF( void )
+ cf2_stack_free( CF2_Stack stack )
+ {
+ if ( stack )
+ {
+ FT_Memory memory = stack->memory;
+
+
+ /* free the main structure */
+ FT_FREE( stack );
+ }
+ }
+
+
+ FT_LOCAL_DEF( CF2_UInt )
+ cf2_stack_count( CF2_Stack stack )
+ {
+ return (CF2_UInt)( stack->top - &stack->buffer[0] );
+ }
+
+
+ FT_LOCAL_DEF( void )
+ cf2_stack_pushInt( CF2_Stack stack,
+ CF2_Int val )
+ {
+ if ( stack->top == &stack->buffer[CF2_OPERAND_STACK_SIZE] )
+ {
+ CF2_SET_ERROR( stack->error, Stack_Overflow );
+ return; /* stack overflow */
+ }
+
+ stack->top->u.i = val;
+ stack->top->type = CF2_NumberInt;
+ ++stack->top;
+ }
+
+
+ FT_LOCAL_DEF( void )
+ cf2_stack_pushFixed( CF2_Stack stack,
+ CF2_Fixed val )
+ {
+ if ( stack->top == &stack->buffer[CF2_OPERAND_STACK_SIZE] )
+ {
+ CF2_SET_ERROR( stack->error, Stack_Overflow );
+ return; /* stack overflow */
+ }
+
+ stack->top->u.r = val;
+ stack->top->type = CF2_NumberFixed;
+ ++stack->top;
+ }
+
+
+ /* this function is only allowed to pop an integer type */
+ FT_LOCAL_DEF( CF2_Int )
+ cf2_stack_popInt( CF2_Stack stack )
+ {
+ if ( stack->top == &stack->buffer[0] )
+ {
+ CF2_SET_ERROR( stack->error, Stack_Underflow );
+ return 0; /* underflow */
+ }
+ if ( stack->top[-1].type != CF2_NumberInt )
+ {
+ CF2_SET_ERROR( stack->error, Syntax_Error );
+ return 0; /* type mismatch */
+ }
+
+ --stack->top;
+
+ return stack->top->u.i;
+ }
+
+
+ /* Note: type mismatch is silently cast */
+ /* TODO: check this */
+ FT_LOCAL_DEF( CF2_Fixed )
+ cf2_stack_popFixed( CF2_Stack stack )
+ {
+ if ( stack->top == &stack->buffer[0] )
+ {
+ CF2_SET_ERROR( stack->error, Stack_Underflow );
+ return cf2_intToFixed( 0 ); /* underflow */
+ }
+
+ --stack->top;
+
+ switch ( stack->top->type )
+ {
+ case CF2_NumberInt:
+ return cf2_intToFixed( stack->top->u.i );
+ case CF2_NumberFrac:
+ return cf2_fracToFixed( stack->top->u.f );
+ default:
+ return stack->top->u.r;
+ }
+ }
+
+
+ /* Note: type mismatch is silently cast */
+ /* TODO: check this */
+ FT_LOCAL_DEF( CF2_Fixed )
+ cf2_stack_getReal( CF2_Stack stack,
+ CF2_UInt idx )
+ {
+ FT_ASSERT( cf2_stack_count( stack ) <= CF2_OPERAND_STACK_SIZE );
+
+ if ( idx >= cf2_stack_count( stack ) )
+ {
+ CF2_SET_ERROR( stack->error, Stack_Overflow );
+ return cf2_intToFixed( 0 ); /* bounds error */
+ }
+
+ switch ( stack->buffer[idx].type )
+ {
+ case CF2_NumberInt:
+ return cf2_intToFixed( stack->buffer[idx].u.i );
+ case CF2_NumberFrac:
+ return cf2_fracToFixed( stack->buffer[idx].u.f );
+ default:
+ return stack->buffer[idx].u.r;
+ }
+ }
+
+
+ FT_LOCAL_DEF( void )
+ cf2_stack_clear( CF2_Stack stack )
+ {
+ stack->top = &stack->buffer[0];
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2stack.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2stack.h
new file mode 100644
index 0000000000..7d6d1961fe
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2stack.h
@@ -0,0 +1,106 @@
+/***************************************************************************/
+/* */
+/* cf2stack.h */
+/* */
+/* Adobe's code for emulating a CFF stack (specification). */
+/* */
+/* Copyright 2007-2013 Adobe Systems Incorporated. */
+/* */
+/* This software, and all works of authorship, whether in source or */
+/* object code form as indicated by the copyright notice(s) included */
+/* herein (collectively, the "Work") is made available, and may only be */
+/* used, modified, and distributed under the FreeType Project License, */
+/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */
+/* FreeType Project License, each contributor to the Work hereby grants */
+/* to any individual or legal entity exercising permissions granted by */
+/* the FreeType Project License and this section (hereafter, "You" or */
+/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */
+/* royalty-free, irrevocable (except as stated in this section) patent */
+/* license to make, have made, use, offer to sell, sell, import, and */
+/* otherwise transfer the Work, where such license applies only to those */
+/* patent claims licensable by such contributor that are necessarily */
+/* infringed by their contribution(s) alone or by combination of their */
+/* contribution(s) with the Work to which such contribution(s) was */
+/* submitted. If You institute patent litigation against any entity */
+/* (including a cross-claim or counterclaim in a lawsuit) alleging that */
+/* the Work or a contribution incorporated within the Work constitutes */
+/* direct or contributory patent infringement, then any patent licenses */
+/* granted to You under this License for that Work shall terminate as of */
+/* the date such litigation is filed. */
+/* */
+/* By using, modifying, or distributing the Work you indicate that you */
+/* have read and understood the terms and conditions of the */
+/* FreeType Project License as well as those provided in this section, */
+/* and you accept them fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __CF2STACK_H__
+#define __CF2STACK_H__
+
+
+FT_BEGIN_HEADER
+
+
+ /* CFF operand stack; specified maximum of 48 or 192 values */
+ typedef struct CF2_StackNumber_
+ {
+ union
+ {
+ CF2_Fixed r; /* 16.16 fixed point */
+ CF2_Frac f; /* 2.30 fixed point (for font matrix) */
+ CF2_Int i;
+ } u;
+
+ CF2_NumberType type;
+
+ } CF2_StackNumber;
+
+
+ typedef struct CF2_StackRec_
+ {
+ FT_Memory memory;
+ FT_Error* error;
+ CF2_StackNumber buffer[CF2_OPERAND_STACK_SIZE];
+ CF2_StackNumber* top;
+
+ } CF2_StackRec, *CF2_Stack;
+
+
+ FT_LOCAL( CF2_Stack )
+ cf2_stack_init( FT_Memory memory,
+ FT_Error* error );
+ FT_LOCAL( void )
+ cf2_stack_free( CF2_Stack stack );
+
+ FT_LOCAL( CF2_UInt )
+ cf2_stack_count( CF2_Stack stack );
+
+ FT_LOCAL( void )
+ cf2_stack_pushInt( CF2_Stack stack,
+ CF2_Int val );
+ FT_LOCAL( void )
+ cf2_stack_pushFixed( CF2_Stack stack,
+ CF2_Fixed val );
+
+ FT_LOCAL( CF2_Int )
+ cf2_stack_popInt( CF2_Stack stack );
+ FT_LOCAL( CF2_Fixed )
+ cf2_stack_popFixed( CF2_Stack stack );
+
+ FT_LOCAL( CF2_Fixed )
+ cf2_stack_getReal( CF2_Stack stack,
+ CF2_UInt idx );
+
+ FT_LOCAL( void )
+ cf2_stack_clear( CF2_Stack stack );
+
+
+FT_END_HEADER
+
+
+#endif /* __CF2STACK_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2types.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2types.h
new file mode 100644
index 0000000000..cbbef712ff
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cf2types.h
@@ -0,0 +1,78 @@
+/***************************************************************************/
+/* */
+/* cf2types.h */
+/* */
+/* Adobe's code for defining data types (specification only). */
+/* */
+/* Copyright 2011-2013 Adobe Systems Incorporated. */
+/* */
+/* This software, and all works of authorship, whether in source or */
+/* object code form as indicated by the copyright notice(s) included */
+/* herein (collectively, the "Work") is made available, and may only be */
+/* used, modified, and distributed under the FreeType Project License, */
+/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */
+/* FreeType Project License, each contributor to the Work hereby grants */
+/* to any individual or legal entity exercising permissions granted by */
+/* the FreeType Project License and this section (hereafter, "You" or */
+/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */
+/* royalty-free, irrevocable (except as stated in this section) patent */
+/* license to make, have made, use, offer to sell, sell, import, and */
+/* otherwise transfer the Work, where such license applies only to those */
+/* patent claims licensable by such contributor that are necessarily */
+/* infringed by their contribution(s) alone or by combination of their */
+/* contribution(s) with the Work to which such contribution(s) was */
+/* submitted. If You institute patent litigation against any entity */
+/* (including a cross-claim or counterclaim in a lawsuit) alleging that */
+/* the Work or a contribution incorporated within the Work constitutes */
+/* direct or contributory patent infringement, then any patent licenses */
+/* granted to You under this License for that Work shall terminate as of */
+/* the date such litigation is filed. */
+/* */
+/* By using, modifying, or distributing the Work you indicate that you */
+/* have read and understood the terms and conditions of the */
+/* FreeType Project License as well as those provided in this section, */
+/* and you accept them fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __CF2TYPES_H__
+#define __CF2TYPES_H__
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/freetype.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*
+ * The data models that we expect to support are as follows:
+ *
+ * name char short int long long-long pointer example
+ * -----------------------------------------------------
+ * ILP32 8 16 32 32 64* 32 32-bit MacOS, x86
+ * LLP64 8 16 32 32 64 64 x64
+ * LP64 8 16 32 64 64 64 64-bit MacOS
+ *
+ * *) type may be supported by emulation on a 32-bit architecture
+ *
+ */
+
+
+ /* integers at least 32 bits wide */
+#define CF2_UInt FT_UFast
+#define CF2_Int FT_Fast
+
+
+ /* fixed-float numbers */
+ typedef FT_Int32 CF2_F16Dot16;
+
+
+FT_END_HEADER
+
+
+#endif /* __CF2TYPES_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffcmap.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffcmap.c
new file mode 100644
index 0000000000..4aebe4682a
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffcmap.c
@@ -0,0 +1,210 @@
+/***************************************************************************/
+/* */
+/* cffcmap.c */
+/* */
+/* CFF character mapping table (cmap) support (body). */
+/* */
+/* Copyright 2002-2007, 2010, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "cffcmap.h"
+#include "cffload.h"
+
+#include "cfferrs.h"
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** CFF STANDARD (AND EXPERT) ENCODING CMAPS *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ FT_CALLBACK_DEF( FT_Error )
+ cff_cmap_encoding_init( CFF_CMapStd cmap )
+ {
+ TT_Face face = (TT_Face)FT_CMAP_FACE( cmap );
+ CFF_Font cff = (CFF_Font)face->extra.data;
+ CFF_Encoding encoding = &cff->encoding;
+
+
+ cmap->gids = encoding->codes;
+
+ return 0;
+ }
+
+
+ FT_CALLBACK_DEF( void )
+ cff_cmap_encoding_done( CFF_CMapStd cmap )
+ {
+ cmap->gids = NULL;
+ }
+
+
+ FT_CALLBACK_DEF( FT_UInt )
+ cff_cmap_encoding_char_index( CFF_CMapStd cmap,
+ FT_UInt32 char_code )
+ {
+ FT_UInt result = 0;
+
+
+ if ( char_code < 256 )
+ result = cmap->gids[char_code];
+
+ return result;
+ }
+
+
+ FT_CALLBACK_DEF( FT_UInt32 )
+ cff_cmap_encoding_char_next( CFF_CMapStd cmap,
+ FT_UInt32 *pchar_code )
+ {
+ FT_UInt result = 0;
+ FT_UInt32 char_code = *pchar_code;
+
+
+ *pchar_code = 0;
+
+ if ( char_code < 255 )
+ {
+ FT_UInt code = (FT_UInt)(char_code + 1);
+
+
+ for (;;)
+ {
+ if ( code >= 256 )
+ break;
+
+ result = cmap->gids[code];
+ if ( result != 0 )
+ {
+ *pchar_code = code;
+ break;
+ }
+
+ code++;
+ }
+ }
+ return result;
+ }
+
+
+ FT_DEFINE_CMAP_CLASS(cff_cmap_encoding_class_rec,
+ sizeof ( CFF_CMapStdRec ),
+
+ (FT_CMap_InitFunc) cff_cmap_encoding_init,
+ (FT_CMap_DoneFunc) cff_cmap_encoding_done,
+ (FT_CMap_CharIndexFunc)cff_cmap_encoding_char_index,
+ (FT_CMap_CharNextFunc) cff_cmap_encoding_char_next,
+
+ NULL, NULL, NULL, NULL, NULL
+ )
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** CFF SYNTHETIC UNICODE ENCODING CMAP *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ FT_CALLBACK_DEF( const char* )
+ cff_sid_to_glyph_name( TT_Face face,
+ FT_UInt idx )
+ {
+ CFF_Font cff = (CFF_Font)face->extra.data;
+ CFF_Charset charset = &cff->charset;
+ FT_UInt sid = charset->sids[idx];
+
+
+ return cff_index_get_sid_string( cff, sid );
+ }
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ cff_cmap_unicode_init( PS_Unicodes unicodes )
+ {
+ TT_Face face = (TT_Face)FT_CMAP_FACE( unicodes );
+ FT_Memory memory = FT_FACE_MEMORY( face );
+ CFF_Font cff = (CFF_Font)face->extra.data;
+ CFF_Charset charset = &cff->charset;
+ FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)cff->psnames;
+
+
+ /* can't build Unicode map for CID-keyed font */
+ /* because we don't know glyph names. */
+ if ( !charset->sids )
+ return FT_THROW( No_Unicode_Glyph_Name );
+
+ return psnames->unicodes_init( memory,
+ unicodes,
+ cff->num_glyphs,
+ (PS_GetGlyphNameFunc)&cff_sid_to_glyph_name,
+ (PS_FreeGlyphNameFunc)NULL,
+ (FT_Pointer)face );
+ }
+
+
+ FT_CALLBACK_DEF( void )
+ cff_cmap_unicode_done( PS_Unicodes unicodes )
+ {
+ FT_Face face = FT_CMAP_FACE( unicodes );
+ FT_Memory memory = FT_FACE_MEMORY( face );
+
+
+ FT_FREE( unicodes->maps );
+ unicodes->num_maps = 0;
+ }
+
+
+ FT_CALLBACK_DEF( FT_UInt )
+ cff_cmap_unicode_char_index( PS_Unicodes unicodes,
+ FT_UInt32 char_code )
+ {
+ TT_Face face = (TT_Face)FT_CMAP_FACE( unicodes );
+ CFF_Font cff = (CFF_Font)face->extra.data;
+ FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)cff->psnames;
+
+
+ return psnames->unicodes_char_index( unicodes, char_code );
+ }
+
+
+ FT_CALLBACK_DEF( FT_UInt32 )
+ cff_cmap_unicode_char_next( PS_Unicodes unicodes,
+ FT_UInt32 *pchar_code )
+ {
+ TT_Face face = (TT_Face)FT_CMAP_FACE( unicodes );
+ CFF_Font cff = (CFF_Font)face->extra.data;
+ FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)cff->psnames;
+
+
+ return psnames->unicodes_char_next( unicodes, pchar_code );
+ }
+
+
+ FT_DEFINE_CMAP_CLASS(cff_cmap_unicode_class_rec,
+ sizeof ( PS_UnicodesRec ),
+
+ (FT_CMap_InitFunc) cff_cmap_unicode_init,
+ (FT_CMap_DoneFunc) cff_cmap_unicode_done,
+ (FT_CMap_CharIndexFunc)cff_cmap_unicode_char_index,
+ (FT_CMap_CharNextFunc) cff_cmap_unicode_char_next,
+
+ NULL, NULL, NULL, NULL, NULL
+ )
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffcmap.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffcmap.h
new file mode 100644
index 0000000000..3f7f67bbe0
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffcmap.h
@@ -0,0 +1,67 @@
+/***************************************************************************/
+/* */
+/* cffcmap.h */
+/* */
+/* CFF character mapping table (cmap) support (specification). */
+/* */
+/* Copyright 2002, 2003, 2006 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __CFFCMAP_H__
+#define __CFFCMAP_H__
+
+#include "cffobjs.h"
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** TYPE1 STANDARD (AND EXPERT) ENCODING CMAPS *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /* standard (and expert) encoding cmaps */
+ typedef struct CFF_CMapStdRec_* CFF_CMapStd;
+
+ typedef struct CFF_CMapStdRec_
+ {
+ FT_CMapRec cmap;
+ FT_UShort* gids; /* up to 256 elements */
+
+ } CFF_CMapStdRec;
+
+
+ FT_DECLARE_CMAP_CLASS(cff_cmap_encoding_class_rec)
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** CFF SYNTHETIC UNICODE ENCODING CMAP *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /* unicode (synthetic) cmaps */
+
+ FT_DECLARE_CMAP_CLASS(cff_cmap_unicode_class_rec)
+
+
+FT_END_HEADER
+
+#endif /* __CFFCMAP_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffdrivr.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffdrivr.c
new file mode 100644
index 0000000000..84f305c90a
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffdrivr.c
@@ -0,0 +1,787 @@
+/***************************************************************************/
+/* */
+/* cffdrivr.c */
+/* */
+/* OpenType font driver implementation (body). */
+/* */
+/* Copyright 1996-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/freetype.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/internal/sfnt.h"
+#include "../../include/freetype/internal/services/svcid.h"
+#include "../../include/freetype/internal/services/svpsinfo.h"
+#include "../../include/freetype/internal/services/svpostnm.h"
+#include "../../include/freetype/internal/services/svttcmap.h"
+
+#include "cffdrivr.h"
+#include "cffgload.h"
+#include "cffload.h"
+#include "cffcmap.h"
+#include "cffparse.h"
+
+#include "cfferrs.h"
+#include "cffpic.h"
+
+#include "../../include/freetype/internal/services/svxf86nm.h"
+#include "../../include/freetype/internal/services/svgldict.h"
+#include "../../include/freetype/internal/services/svprop.h"
+#include "../../include/freetype/ftcffdrv.h"
+
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_cffdriver
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** ****/
+ /**** F A C E S ****/
+ /**** ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+#undef PAIR_TAG
+#define PAIR_TAG( left, right ) ( ( (FT_ULong)left << 16 ) | \
+ (FT_ULong)right )
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* cff_get_kerning */
+ /* */
+ /* <Description> */
+ /* A driver method used to return the kerning vector between two */
+ /* glyphs of the same face. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the source face object. */
+ /* */
+ /* left_glyph :: The index of the left glyph in the kern pair. */
+ /* */
+ /* right_glyph :: The index of the right glyph in the kern pair. */
+ /* */
+ /* <Output> */
+ /* kerning :: The kerning vector. This is in font units for */
+ /* scalable formats, and in pixels for fixed-sizes */
+ /* formats. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ /* <Note> */
+ /* Only horizontal layouts (left-to-right & right-to-left) are */
+ /* supported by this function. Other layouts, or more sophisticated */
+ /* kernings, are out of scope of this method (the basic driver */
+ /* interface is meant to be simple). */
+ /* */
+ /* They can be implemented by format-specific interfaces. */
+ /* */
+ FT_CALLBACK_DEF( FT_Error )
+ cff_get_kerning( FT_Face ttface, /* TT_Face */
+ FT_UInt left_glyph,
+ FT_UInt right_glyph,
+ FT_Vector* kerning )
+ {
+ TT_Face face = (TT_Face)ttface;
+ SFNT_Service sfnt = (SFNT_Service)face->sfnt;
+
+
+ kerning->x = 0;
+ kerning->y = 0;
+
+ if ( sfnt )
+ kerning->x = sfnt->get_kerning( face, left_glyph, right_glyph );
+
+ return FT_Err_Ok;
+ }
+
+
+#undef PAIR_TAG
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* cff_glyph_load */
+ /* */
+ /* <Description> */
+ /* A driver method used to load a glyph within a given glyph slot. */
+ /* */
+ /* <Input> */
+ /* slot :: A handle to the target slot object where the glyph */
+ /* will be loaded. */
+ /* */
+ /* size :: A handle to the source face size at which the glyph */
+ /* must be scaled, loaded, etc. */
+ /* */
+ /* glyph_index :: The index of the glyph in the font file. */
+ /* */
+ /* load_flags :: A flag indicating what to load for this glyph. The */
+ /* FT_LOAD_??? constants can be used to control the */
+ /* glyph loading process (e.g., whether the outline */
+ /* should be scaled, whether to load bitmaps or not, */
+ /* whether to hint the outline, etc). */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_CALLBACK_DEF( FT_Error )
+ cff_glyph_load( FT_GlyphSlot cffslot, /* CFF_GlyphSlot */
+ FT_Size cffsize, /* CFF_Size */
+ FT_UInt glyph_index,
+ FT_Int32 load_flags )
+ {
+ FT_Error error;
+ CFF_GlyphSlot slot = (CFF_GlyphSlot)cffslot;
+ CFF_Size size = (CFF_Size)cffsize;
+
+
+ if ( !slot )
+ return FT_THROW( Invalid_Slot_Handle );
+
+ /* check whether we want a scaled outline or bitmap */
+ if ( !size )
+ load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING;
+
+ /* reset the size object if necessary */
+ if ( load_flags & FT_LOAD_NO_SCALE )
+ size = NULL;
+
+ if ( size )
+ {
+ /* these two objects must have the same parent */
+ if ( cffsize->face != cffslot->face )
+ return FT_THROW( Invalid_Face_Handle );
+ }
+
+ /* now load the glyph outline if necessary */
+ error = cff_slot_load( slot, size, glyph_index, load_flags );
+
+ /* force drop-out mode to 2 - irrelevant now */
+ /* slot->outline.dropout_mode = 2; */
+
+ return error;
+ }
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ cff_get_advances( FT_Face face,
+ FT_UInt start,
+ FT_UInt count,
+ FT_Int32 flags,
+ FT_Fixed* advances )
+ {
+ FT_UInt nn;
+ FT_Error error = FT_Err_Ok;
+ FT_GlyphSlot slot = face->glyph;
+
+
+ flags |= (FT_UInt32)FT_LOAD_ADVANCE_ONLY;
+
+ for ( nn = 0; nn < count; nn++ )
+ {
+ error = cff_glyph_load( slot, face->size, start + nn, flags );
+ if ( error )
+ break;
+
+ advances[nn] = ( flags & FT_LOAD_VERTICAL_LAYOUT )
+ ? slot->linearVertAdvance
+ : slot->linearHoriAdvance;
+ }
+
+ return error;
+ }
+
+
+ /*
+ * GLYPH DICT SERVICE
+ *
+ */
+
+ static FT_Error
+ cff_get_glyph_name( CFF_Face face,
+ FT_UInt glyph_index,
+ FT_Pointer buffer,
+ FT_UInt buffer_max )
+ {
+ CFF_Font font = (CFF_Font)face->extra.data;
+ FT_String* gname;
+ FT_UShort sid;
+ FT_Error error;
+
+
+ if ( !font->psnames )
+ {
+ FT_ERROR(( "cff_get_glyph_name:"
+ " cannot get glyph name from CFF & CEF fonts\n"
+ " "
+ " without the `PSNames' module\n" ));
+ error = FT_THROW( Missing_Module );
+ goto Exit;
+ }
+
+ /* first, locate the sid in the charset table */
+ sid = font->charset.sids[glyph_index];
+
+ /* now, lookup the name itself */
+ gname = cff_index_get_sid_string( font, sid );
+
+ if ( gname )
+ FT_STRCPYN( buffer, gname, buffer_max );
+
+ error = FT_Err_Ok;
+
+ Exit:
+ return error;
+ }
+
+
+ static FT_UInt
+ cff_get_name_index( CFF_Face face,
+ FT_String* glyph_name )
+ {
+ CFF_Font cff;
+ CFF_Charset charset;
+ FT_Service_PsCMaps psnames;
+ FT_String* name;
+ FT_UShort sid;
+ FT_UInt i;
+
+
+ cff = (CFF_FontRec *)face->extra.data;
+ charset = &cff->charset;
+
+ FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS );
+ if ( !psnames )
+ return 0;
+
+ for ( i = 0; i < cff->num_glyphs; i++ )
+ {
+ sid = charset->sids[i];
+
+ if ( sid > 390 )
+ name = cff_index_get_string( cff, sid - 391 );
+ else
+ name = (FT_String *)psnames->adobe_std_strings( sid );
+
+ if ( !name )
+ continue;
+
+ if ( !ft_strcmp( glyph_name, name ) )
+ return i;
+ }
+
+ return 0;
+ }
+
+
+ FT_DEFINE_SERVICE_GLYPHDICTREC(
+ cff_service_glyph_dict,
+ (FT_GlyphDict_GetNameFunc) cff_get_glyph_name,
+ (FT_GlyphDict_NameIndexFunc)cff_get_name_index
+ )
+
+
+ /*
+ * POSTSCRIPT INFO SERVICE
+ *
+ */
+
+ static FT_Int
+ cff_ps_has_glyph_names( FT_Face face )
+ {
+ return ( face->face_flags & FT_FACE_FLAG_GLYPH_NAMES ) > 0;
+ }
+
+
+ static FT_Error
+ cff_ps_get_font_info( CFF_Face face,
+ PS_FontInfoRec* afont_info )
+ {
+ CFF_Font cff = (CFF_Font)face->extra.data;
+ FT_Error error = FT_Err_Ok;
+
+
+ if ( cff && cff->font_info == NULL )
+ {
+ CFF_FontRecDict dict = &cff->top_font.font_dict;
+ PS_FontInfoRec *font_info = NULL;
+ FT_Memory memory = face->root.memory;
+
+
+ if ( FT_ALLOC( font_info, sizeof ( *font_info ) ) )
+ goto Fail;
+
+ font_info->version = cff_index_get_sid_string( cff,
+ dict->version );
+ font_info->notice = cff_index_get_sid_string( cff,
+ dict->notice );
+ font_info->full_name = cff_index_get_sid_string( cff,
+ dict->full_name );
+ font_info->family_name = cff_index_get_sid_string( cff,
+ dict->family_name );
+ font_info->weight = cff_index_get_sid_string( cff,
+ dict->weight );
+ font_info->italic_angle = dict->italic_angle;
+ font_info->is_fixed_pitch = dict->is_fixed_pitch;
+ font_info->underline_position = (FT_Short)dict->underline_position;
+ font_info->underline_thickness = (FT_Short)dict->underline_thickness;
+
+ cff->font_info = font_info;
+ }
+
+ if ( cff )
+ *afont_info = *cff->font_info;
+
+ Fail:
+ return error;
+ }
+
+
+ FT_DEFINE_SERVICE_PSINFOREC(
+ cff_service_ps_info,
+ (PS_GetFontInfoFunc) cff_ps_get_font_info,
+ (PS_GetFontExtraFunc) NULL,
+ (PS_HasGlyphNamesFunc) cff_ps_has_glyph_names,
+ (PS_GetFontPrivateFunc)NULL, /* unsupported with CFF fonts */
+ (PS_GetFontValueFunc) NULL /* not implemented */
+ )
+
+
+ /*
+ * POSTSCRIPT NAME SERVICE
+ *
+ */
+
+ static const char*
+ cff_get_ps_name( CFF_Face face )
+ {
+ CFF_Font cff = (CFF_Font)face->extra.data;
+
+
+ return (const char*)cff->font_name;
+ }
+
+
+ FT_DEFINE_SERVICE_PSFONTNAMEREC(
+ cff_service_ps_name,
+ (FT_PsName_GetFunc)cff_get_ps_name
+ )
+
+
+ /*
+ * TT CMAP INFO
+ *
+ * If the charmap is a synthetic Unicode encoding cmap or
+ * a Type 1 standard (or expert) encoding cmap, hide TT CMAP INFO
+ * service defined in SFNT module.
+ *
+ * Otherwise call the service function in the sfnt module.
+ *
+ */
+ static FT_Error
+ cff_get_cmap_info( FT_CharMap charmap,
+ TT_CMapInfo *cmap_info )
+ {
+ FT_CMap cmap = FT_CMAP( charmap );
+ FT_Error error = FT_Err_Ok;
+
+ FT_Face face = FT_CMAP_FACE( cmap );
+ FT_Library library = FT_FACE_LIBRARY( face );
+
+
+ cmap_info->language = 0;
+ cmap_info->format = 0;
+
+ if ( cmap->clazz != &CFF_CMAP_ENCODING_CLASS_REC_GET &&
+ cmap->clazz != &CFF_CMAP_UNICODE_CLASS_REC_GET )
+ {
+ FT_Module sfnt = FT_Get_Module( library, "sfnt" );
+ FT_Service_TTCMaps service =
+ (FT_Service_TTCMaps)ft_module_get_service( sfnt,
+ FT_SERVICE_ID_TT_CMAP );
+
+
+ if ( service && service->get_cmap_info )
+ error = service->get_cmap_info( charmap, cmap_info );
+ }
+
+ return error;
+ }
+
+
+ FT_DEFINE_SERVICE_TTCMAPSREC(
+ cff_service_get_cmap_info,
+ (TT_CMap_Info_GetFunc)cff_get_cmap_info
+ )
+
+
+ /*
+ * CID INFO SERVICE
+ *
+ */
+ static FT_Error
+ cff_get_ros( CFF_Face face,
+ const char* *registry,
+ const char* *ordering,
+ FT_Int *supplement )
+ {
+ FT_Error error = FT_Err_Ok;
+ CFF_Font cff = (CFF_Font)face->extra.data;
+
+
+ if ( cff )
+ {
+ CFF_FontRecDict dict = &cff->top_font.font_dict;
+
+
+ if ( dict->cid_registry == 0xFFFFU )
+ {
+ error = FT_THROW( Invalid_Argument );
+ goto Fail;
+ }
+
+ if ( registry )
+ {
+ if ( cff->registry == NULL )
+ cff->registry = cff_index_get_sid_string( cff,
+ dict->cid_registry );
+ *registry = cff->registry;
+ }
+
+ if ( ordering )
+ {
+ if ( cff->ordering == NULL )
+ cff->ordering = cff_index_get_sid_string( cff,
+ dict->cid_ordering );
+ *ordering = cff->ordering;
+ }
+
+ /*
+ * XXX: According to Adobe TechNote #5176, the supplement in CFF
+ * can be a real number. We truncate it to fit public API
+ * since freetype-2.3.6.
+ */
+ if ( supplement )
+ {
+ if ( dict->cid_supplement < FT_INT_MIN ||
+ dict->cid_supplement > FT_INT_MAX )
+ FT_TRACE1(( "cff_get_ros: too large supplement %d is truncated\n",
+ dict->cid_supplement ));
+ *supplement = (FT_Int)dict->cid_supplement;
+ }
+ }
+
+ Fail:
+ return error;
+ }
+
+
+ static FT_Error
+ cff_get_is_cid( CFF_Face face,
+ FT_Bool *is_cid )
+ {
+ FT_Error error = FT_Err_Ok;
+ CFF_Font cff = (CFF_Font)face->extra.data;
+
+
+ *is_cid = 0;
+
+ if ( cff )
+ {
+ CFF_FontRecDict dict = &cff->top_font.font_dict;
+
+
+ if ( dict->cid_registry != 0xFFFFU )
+ *is_cid = 1;
+ }
+
+ return error;
+ }
+
+
+ static FT_Error
+ cff_get_cid_from_glyph_index( CFF_Face face,
+ FT_UInt glyph_index,
+ FT_UInt *cid )
+ {
+ FT_Error error = FT_Err_Ok;
+ CFF_Font cff;
+
+
+ cff = (CFF_Font)face->extra.data;
+
+ if ( cff )
+ {
+ FT_UInt c;
+ CFF_FontRecDict dict = &cff->top_font.font_dict;
+
+
+ if ( dict->cid_registry == 0xFFFFU )
+ {
+ error = FT_THROW( Invalid_Argument );
+ goto Fail;
+ }
+
+ if ( glyph_index > cff->num_glyphs )
+ {
+ error = FT_THROW( Invalid_Argument );
+ goto Fail;
+ }
+
+ c = cff->charset.sids[glyph_index];
+
+ if ( cid )
+ *cid = c;
+ }
+
+ Fail:
+ return error;
+ }
+
+
+ FT_DEFINE_SERVICE_CIDREC(
+ cff_service_cid_info,
+ (FT_CID_GetRegistryOrderingSupplementFunc)cff_get_ros,
+ (FT_CID_GetIsInternallyCIDKeyedFunc) cff_get_is_cid,
+ (FT_CID_GetCIDFromGlyphIndexFunc) cff_get_cid_from_glyph_index
+ )
+
+
+ /*
+ * PROPERTY SERVICE
+ *
+ */
+ static FT_Error
+ cff_property_set( FT_Module module, /* CFF_Driver */
+ const char* property_name,
+ const void* value )
+ {
+ FT_Error error = FT_Err_Ok;
+ CFF_Driver driver = (CFF_Driver)module;
+
+
+ if ( !ft_strcmp( property_name, "hinting-engine" ) )
+ {
+ FT_UInt* hinting_engine = (FT_UInt*)value;
+
+
+#ifndef CFF_CONFIG_OPTION_OLD_ENGINE
+ if ( *hinting_engine != FT_CFF_HINTING_ADOBE )
+ error = FT_ERR( Unimplemented_Feature );
+ else
+#endif
+ driver->hinting_engine = *hinting_engine;
+
+ return error;
+ }
+ else if ( !ft_strcmp( property_name, "no-stem-darkening" ) )
+ {
+ FT_Bool* no_stem_darkening = (FT_Bool*)value;
+
+
+ driver->no_stem_darkening = *no_stem_darkening;
+
+ return error;
+ }
+
+ FT_TRACE0(( "cff_property_set: missing property `%s'\n",
+ property_name ));
+ return FT_THROW( Missing_Property );
+ }
+
+
+ static FT_Error
+ cff_property_get( FT_Module module, /* CFF_Driver */
+ const char* property_name,
+ const void* value )
+ {
+ FT_Error error = FT_Err_Ok;
+ CFF_Driver driver = (CFF_Driver)module;
+
+ FT_UInt hinting_engine = driver->hinting_engine;
+ FT_Bool no_stem_darkening = driver->no_stem_darkening;
+
+
+ if ( !ft_strcmp( property_name, "hinting-engine" ) )
+ {
+ FT_UInt* val = (FT_UInt*)value;
+
+
+ *val = hinting_engine;
+
+ return error;
+ }
+ else if ( !ft_strcmp( property_name, "no-stem-darkening" ) )
+ {
+ FT_Bool* val = (FT_Bool*)value;
+
+
+ *val = no_stem_darkening;
+
+ return error;
+ }
+
+ FT_TRACE0(( "cff_property_get: missing property `%s'\n",
+ property_name ));
+ return FT_THROW( Missing_Property );
+ }
+
+
+ FT_DEFINE_SERVICE_PROPERTIESREC(
+ cff_service_properties,
+ (FT_Properties_SetFunc)cff_property_set,
+ (FT_Properties_GetFunc)cff_property_get )
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** ****/
+ /**** D R I V E R I N T E R F A C E ****/
+ /**** ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+#ifndef FT_CONFIG_OPTION_NO_GLYPH_NAMES
+ FT_DEFINE_SERVICEDESCREC7(
+ cff_services,
+ FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_CFF,
+ FT_SERVICE_ID_POSTSCRIPT_INFO, &CFF_SERVICE_PS_INFO_GET,
+ FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &CFF_SERVICE_PS_NAME_GET,
+ FT_SERVICE_ID_GLYPH_DICT, &CFF_SERVICE_GLYPH_DICT_GET,
+ FT_SERVICE_ID_TT_CMAP, &CFF_SERVICE_GET_CMAP_INFO_GET,
+ FT_SERVICE_ID_CID, &CFF_SERVICE_CID_INFO_GET,
+ FT_SERVICE_ID_PROPERTIES, &CFF_SERVICE_PROPERTIES_GET
+ )
+#else
+ FT_DEFINE_SERVICEDESCREC6(
+ cff_services,
+ FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_CFF,
+ FT_SERVICE_ID_POSTSCRIPT_INFO, &CFF_SERVICE_PS_INFO_GET,
+ FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &CFF_SERVICE_PS_NAME_GET,
+ FT_SERVICE_ID_TT_CMAP, &CFF_SERVICE_GET_CMAP_INFO_GET,
+ FT_SERVICE_ID_CID, &CFF_SERVICE_CID_INFO_GET,
+ FT_SERVICE_ID_PROPERTIES, &CFF_SERVICE_PROPERTIES_GET
+ )
+#endif
+
+
+ FT_CALLBACK_DEF( FT_Module_Interface )
+ cff_get_interface( FT_Module driver, /* CFF_Driver */
+ const char* module_interface )
+ {
+ FT_Library library;
+ FT_Module sfnt;
+ FT_Module_Interface result;
+
+
+ /* CFF_SERVICES_GET derefers `library' in PIC mode */
+#ifdef FT_CONFIG_OPTION_PIC
+ if ( !driver )
+ return NULL;
+ library = driver->library;
+ if ( !library )
+ return NULL;
+#endif
+
+ result = ft_service_list_lookup( CFF_SERVICES_GET, module_interface );
+ if ( result != NULL )
+ return result;
+
+ /* `driver' is not yet evaluated in non-PIC mode */
+#ifndef FT_CONFIG_OPTION_PIC
+ if ( !driver )
+ return NULL;
+ library = driver->library;
+ if ( !library )
+ return NULL;
+#endif
+
+ /* we pass our request to the `sfnt' module */
+ sfnt = FT_Get_Module( library, "sfnt" );
+
+ return sfnt ? sfnt->clazz->get_interface( sfnt, module_interface ) : 0;
+ }
+
+
+ /* The FT_DriverInterface structure is defined in ftdriver.h. */
+
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+#define CFF_SIZE_SELECT cff_size_select
+#else
+#define CFF_SIZE_SELECT 0
+#endif
+
+ FT_DEFINE_DRIVER(
+ cff_driver_class,
+
+ FT_MODULE_FONT_DRIVER |
+ FT_MODULE_DRIVER_SCALABLE |
+ FT_MODULE_DRIVER_HAS_HINTER,
+
+ sizeof ( CFF_DriverRec ),
+ "cff",
+ 0x10000L,
+ 0x20000L,
+
+ 0, /* module-specific interface */
+
+ cff_driver_init,
+ cff_driver_done,
+ cff_get_interface,
+
+ /* now the specific driver fields */
+ sizeof ( TT_FaceRec ),
+ sizeof ( CFF_SizeRec ),
+ sizeof ( CFF_GlyphSlotRec ),
+
+ cff_face_init,
+ cff_face_done,
+ cff_size_init,
+ cff_size_done,
+ cff_slot_init,
+ cff_slot_done,
+
+ cff_glyph_load,
+
+ cff_get_kerning,
+ 0, /* FT_Face_AttachFunc */
+ cff_get_advances,
+
+ cff_size_request,
+
+ CFF_SIZE_SELECT
+ )
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffdrivr.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffdrivr.h
new file mode 100644
index 0000000000..cd41f57e9d
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffdrivr.h
@@ -0,0 +1,38 @@
+/***************************************************************************/
+/* */
+/* cffdrivr.h */
+/* */
+/* High-level OpenType driver interface (specification). */
+/* */
+/* Copyright 1996-2001, 2002 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __CFFDRIVER_H__
+#define __CFFDRIVER_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdriver.h"
+
+
+FT_BEGIN_HEADER
+
+
+ FT_DECLARE_DRIVER( cff_driver_class )
+
+
+FT_END_HEADER
+
+#endif /* __CFFDRIVER_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cfferrs.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cfferrs.h
new file mode 100644
index 0000000000..47e755c8a5
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cfferrs.h
@@ -0,0 +1,42 @@
+/***************************************************************************/
+/* */
+/* cfferrs.h */
+/* */
+/* CFF error codes (specification only). */
+/* */
+/* Copyright 2001, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* This file is used to define the CFF error enumeration constants. */
+ /* */
+ /*************************************************************************/
+
+#ifndef __CFFERRS_H__
+#define __CFFERRS_H__
+
+#include "../../include/freetype/ftmoderr.h"
+
+#undef __FTERRORS_H__
+
+#undef FT_ERR_PREFIX
+#define FT_ERR_PREFIX CFF_Err_
+#define FT_ERR_BASE FT_Mod_Err_CFF
+
+
+#include "../../include/freetype/fterrors.h"
+
+#endif /* __CFFERRS_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffgload.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffgload.c
new file mode 100644
index 0000000000..bbb75ab924
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffgload.c
@@ -0,0 +1,3072 @@
+/***************************************************************************/
+/* */
+/* cffgload.c */
+/* */
+/* OpenType Glyph Loader (body). */
+/* */
+/* Copyright 1996-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/internal/sfnt.h"
+#include "../../include/freetype/ftoutln.h"
+#include "../../include/freetype/ftcffdrv.h"
+
+#include "cffobjs.h"
+#include "cffload.h"
+#include "cffgload.h"
+#include "cf2ft.h" /* for cf2_decoder_parse_charstrings */
+
+#include "cfferrs.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_cffgload
+
+
+#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
+
+ typedef enum CFF_Operator_
+ {
+ cff_op_unknown = 0,
+
+ cff_op_rmoveto,
+ cff_op_hmoveto,
+ cff_op_vmoveto,
+
+ cff_op_rlineto,
+ cff_op_hlineto,
+ cff_op_vlineto,
+
+ cff_op_rrcurveto,
+ cff_op_hhcurveto,
+ cff_op_hvcurveto,
+ cff_op_rcurveline,
+ cff_op_rlinecurve,
+ cff_op_vhcurveto,
+ cff_op_vvcurveto,
+
+ cff_op_flex,
+ cff_op_hflex,
+ cff_op_hflex1,
+ cff_op_flex1,
+
+ cff_op_endchar,
+
+ cff_op_hstem,
+ cff_op_vstem,
+ cff_op_hstemhm,
+ cff_op_vstemhm,
+
+ cff_op_hintmask,
+ cff_op_cntrmask,
+ cff_op_dotsection, /* deprecated, acts as no-op */
+
+ cff_op_abs,
+ cff_op_add,
+ cff_op_sub,
+ cff_op_div,
+ cff_op_neg,
+ cff_op_random,
+ cff_op_mul,
+ cff_op_sqrt,
+
+ cff_op_blend,
+
+ cff_op_drop,
+ cff_op_exch,
+ cff_op_index,
+ cff_op_roll,
+ cff_op_dup,
+
+ cff_op_put,
+ cff_op_get,
+ cff_op_store,
+ cff_op_load,
+
+ cff_op_and,
+ cff_op_or,
+ cff_op_not,
+ cff_op_eq,
+ cff_op_ifelse,
+
+ cff_op_callsubr,
+ cff_op_callgsubr,
+ cff_op_return,
+
+ /* Type 1 opcodes: invalid but seen in real life */
+ cff_op_hsbw,
+ cff_op_closepath,
+ cff_op_callothersubr,
+ cff_op_pop,
+ cff_op_seac,
+ cff_op_sbw,
+ cff_op_setcurrentpoint,
+
+ /* do not remove */
+ cff_op_max
+
+ } CFF_Operator;
+
+
+#define CFF_COUNT_CHECK_WIDTH 0x80
+#define CFF_COUNT_EXACT 0x40
+#define CFF_COUNT_CLEAR_STACK 0x20
+
+ /* count values which have the `CFF_COUNT_CHECK_WIDTH' flag set are */
+ /* used for checking the width and requested numbers of arguments */
+ /* only; they are set to zero afterwards */
+
+ /* the other two flags are informative only and unused currently */
+
+ static const FT_Byte cff_argument_counts[] =
+ {
+ 0, /* unknown */
+
+ 2 | CFF_COUNT_CHECK_WIDTH | CFF_COUNT_EXACT, /* rmoveto */
+ 1 | CFF_COUNT_CHECK_WIDTH | CFF_COUNT_EXACT,
+ 1 | CFF_COUNT_CHECK_WIDTH | CFF_COUNT_EXACT,
+
+ 0 | CFF_COUNT_CLEAR_STACK, /* rlineto */
+ 0 | CFF_COUNT_CLEAR_STACK,
+ 0 | CFF_COUNT_CLEAR_STACK,
+
+ 0 | CFF_COUNT_CLEAR_STACK, /* rrcurveto */
+ 0 | CFF_COUNT_CLEAR_STACK,
+ 0 | CFF_COUNT_CLEAR_STACK,
+ 0 | CFF_COUNT_CLEAR_STACK,
+ 0 | CFF_COUNT_CLEAR_STACK,
+ 0 | CFF_COUNT_CLEAR_STACK,
+ 0 | CFF_COUNT_CLEAR_STACK,
+
+ 13, /* flex */
+ 7,
+ 9,
+ 11,
+
+ 0 | CFF_COUNT_CHECK_WIDTH, /* endchar */
+
+ 2 | CFF_COUNT_CHECK_WIDTH, /* hstem */
+ 2 | CFF_COUNT_CHECK_WIDTH,
+ 2 | CFF_COUNT_CHECK_WIDTH,
+ 2 | CFF_COUNT_CHECK_WIDTH,
+
+ 0 | CFF_COUNT_CHECK_WIDTH, /* hintmask */
+ 0 | CFF_COUNT_CHECK_WIDTH, /* cntrmask */
+ 0, /* dotsection */
+
+ 1, /* abs */
+ 2,
+ 2,
+ 2,
+ 1,
+ 0,
+ 2,
+ 1,
+
+ 1, /* blend */
+
+ 1, /* drop */
+ 2,
+ 1,
+ 2,
+ 1,
+
+ 2, /* put */
+ 1,
+ 4,
+ 3,
+
+ 2, /* and */
+ 2,
+ 1,
+ 2,
+ 4,
+
+ 1, /* callsubr */
+ 1,
+ 0,
+
+ 2, /* hsbw */
+ 0,
+ 0,
+ 0,
+ 5, /* seac */
+ 4, /* sbw */
+ 2 /* setcurrentpoint */
+ };
+
+#endif /* CFF_CONFIG_OPTION_OLD_ENGINE */
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /********** *********/
+ /********** *********/
+ /********** GENERIC CHARSTRING PARSING *********/
+ /********** *********/
+ /********** *********/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* cff_builder_init */
+ /* */
+ /* <Description> */
+ /* Initializes a given glyph builder. */
+ /* */
+ /* <InOut> */
+ /* builder :: A pointer to the glyph builder to initialize. */
+ /* */
+ /* <Input> */
+ /* face :: The current face object. */
+ /* */
+ /* size :: The current size object. */
+ /* */
+ /* glyph :: The current glyph object. */
+ /* */
+ /* hinting :: Whether hinting is active. */
+ /* */
+ static void
+ cff_builder_init( CFF_Builder* builder,
+ TT_Face face,
+ CFF_Size size,
+ CFF_GlyphSlot glyph,
+ FT_Bool hinting )
+ {
+ builder->path_begun = 0;
+ builder->load_points = 1;
+
+ builder->face = face;
+ builder->glyph = glyph;
+ builder->memory = face->root.memory;
+
+ if ( glyph )
+ {
+ FT_GlyphLoader loader = glyph->root.internal->loader;
+
+
+ builder->loader = loader;
+ builder->base = &loader->base.outline;
+ builder->current = &loader->current.outline;
+ FT_GlyphLoader_Rewind( loader );
+
+ builder->hints_globals = 0;
+ builder->hints_funcs = 0;
+
+ if ( hinting && size )
+ {
+ CFF_Internal internal = (CFF_Internal)size->root.internal;
+
+
+ builder->hints_globals = (void *)internal->topfont;
+ builder->hints_funcs = glyph->root.internal->glyph_hints;
+ }
+ }
+
+ builder->pos_x = 0;
+ builder->pos_y = 0;
+
+ builder->left_bearing.x = 0;
+ builder->left_bearing.y = 0;
+ builder->advance.x = 0;
+ builder->advance.y = 0;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* cff_builder_done */
+ /* */
+ /* <Description> */
+ /* Finalizes a given glyph builder. Its contents can still be used */
+ /* after the call, but the function saves important information */
+ /* within the corresponding glyph slot. */
+ /* */
+ /* <Input> */
+ /* builder :: A pointer to the glyph builder to finalize. */
+ /* */
+ static void
+ cff_builder_done( CFF_Builder* builder )
+ {
+ CFF_GlyphSlot glyph = builder->glyph;
+
+
+ if ( glyph )
+ glyph->root.outline = *builder->base;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* cff_compute_bias */
+ /* */
+ /* <Description> */
+ /* Computes the bias value in dependence of the number of glyph */
+ /* subroutines. */
+ /* */
+ /* <Input> */
+ /* in_charstring_type :: The `CharstringType' value of the top DICT */
+ /* dictionary. */
+ /* */
+ /* num_subrs :: The number of glyph subroutines. */
+ /* */
+ /* <Return> */
+ /* The bias value. */
+ static FT_Int
+ cff_compute_bias( FT_Int in_charstring_type,
+ FT_UInt num_subrs )
+ {
+ FT_Int result;
+
+
+ if ( in_charstring_type == 1 )
+ result = 0;
+ else if ( num_subrs < 1240 )
+ result = 107;
+ else if ( num_subrs < 33900U )
+ result = 1131;
+ else
+ result = 32768U;
+
+ return result;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* cff_decoder_init */
+ /* */
+ /* <Description> */
+ /* Initializes a given glyph decoder. */
+ /* */
+ /* <InOut> */
+ /* decoder :: A pointer to the glyph builder to initialize. */
+ /* */
+ /* <Input> */
+ /* face :: The current face object. */
+ /* */
+ /* size :: The current size object. */
+ /* */
+ /* slot :: The current glyph object. */
+ /* */
+ /* hinting :: Whether hinting is active. */
+ /* */
+ /* hint_mode :: The hinting mode. */
+ /* */
+ FT_LOCAL_DEF( void )
+ cff_decoder_init( CFF_Decoder* decoder,
+ TT_Face face,
+ CFF_Size size,
+ CFF_GlyphSlot slot,
+ FT_Bool hinting,
+ FT_Render_Mode hint_mode )
+ {
+ CFF_Font cff = (CFF_Font)face->extra.data;
+
+
+ /* clear everything */
+ FT_MEM_ZERO( decoder, sizeof ( *decoder ) );
+
+ /* initialize builder */
+ cff_builder_init( &decoder->builder, face, size, slot, hinting );
+
+ /* initialize Type2 decoder */
+ decoder->cff = cff;
+ decoder->num_globals = cff->global_subrs_index.count;
+ decoder->globals = cff->global_subrs;
+ decoder->globals_bias = cff_compute_bias(
+ cff->top_font.font_dict.charstring_type,
+ decoder->num_globals );
+
+ decoder->hint_mode = hint_mode;
+ }
+
+
+ /* this function is used to select the subfont */
+ /* and the locals subrs array */
+ FT_LOCAL_DEF( FT_Error )
+ cff_decoder_prepare( CFF_Decoder* decoder,
+ CFF_Size size,
+ FT_UInt glyph_index )
+ {
+ CFF_Builder *builder = &decoder->builder;
+ CFF_Font cff = (CFF_Font)builder->face->extra.data;
+ CFF_SubFont sub = &cff->top_font;
+ FT_Error error = FT_Err_Ok;
+
+
+ /* manage CID fonts */
+ if ( cff->num_subfonts )
+ {
+ FT_Byte fd_index = cff_fd_select_get( &cff->fd_select, glyph_index );
+
+
+ if ( fd_index >= cff->num_subfonts )
+ {
+ FT_TRACE4(( "cff_decoder_prepare: invalid CID subfont index\n" ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+ FT_TRACE3(( "glyph index %d (subfont %d):\n", glyph_index, fd_index ));
+
+ sub = cff->subfonts[fd_index];
+
+ if ( builder->hints_funcs && size )
+ {
+ CFF_Internal internal = (CFF_Internal)size->root.internal;
+
+
+ /* for CFFs without subfonts, this value has already been set */
+ builder->hints_globals = (void *)internal->subfonts[fd_index];
+ }
+ }
+#ifdef FT_DEBUG_LEVEL_TRACE
+ else
+ FT_TRACE3(( "glyph index %d:\n", glyph_index ));
+#endif
+
+ decoder->num_locals = sub->local_subrs_index.count;
+ decoder->locals = sub->local_subrs;
+ decoder->locals_bias = cff_compute_bias(
+ decoder->cff->top_font.font_dict.charstring_type,
+ decoder->num_locals );
+
+ decoder->glyph_width = sub->private_dict.default_width;
+ decoder->nominal_width = sub->private_dict.nominal_width;
+
+ decoder->current_subfont = sub; /* for Adobe's CFF handler */
+
+ Exit:
+ return error;
+ }
+
+
+ /* check that there is enough space for `count' more points */
+ FT_LOCAL_DEF( FT_Error )
+ cff_check_points( CFF_Builder* builder,
+ FT_Int count )
+ {
+ return FT_GLYPHLOADER_CHECK_POINTS( builder->loader, count, 0 );
+ }
+
+
+ /* add a new point, do not check space */
+ FT_LOCAL_DEF( void )
+ cff_builder_add_point( CFF_Builder* builder,
+ FT_Pos x,
+ FT_Pos y,
+ FT_Byte flag )
+ {
+ FT_Outline* outline = builder->current;
+
+
+ if ( builder->load_points )
+ {
+ FT_Vector* point = outline->points + outline->n_points;
+ FT_Byte* control = (FT_Byte*)outline->tags + outline->n_points;
+
+#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
+ CFF_Driver driver = (CFF_Driver)FT_FACE_DRIVER( builder->face );
+
+
+ if ( driver->hinting_engine == FT_CFF_HINTING_FREETYPE )
+ {
+ point->x = x >> 16;
+ point->y = y >> 16;
+ }
+ else
+#endif
+ {
+ /* cf2_decoder_parse_charstrings uses 16.16 coordinates */
+ point->x = x >> 10;
+ point->y = y >> 10;
+ }
+ *control = (FT_Byte)( flag ? FT_CURVE_TAG_ON : FT_CURVE_TAG_CUBIC );
+ }
+
+ outline->n_points++;
+ }
+
+
+ /* check space for a new on-curve point, then add it */
+ FT_LOCAL_DEF( FT_Error )
+ cff_builder_add_point1( CFF_Builder* builder,
+ FT_Pos x,
+ FT_Pos y )
+ {
+ FT_Error error;
+
+
+ error = cff_check_points( builder, 1 );
+ if ( !error )
+ cff_builder_add_point( builder, x, y, 1 );
+
+ return error;
+ }
+
+
+ /* check space for a new contour, then add it */
+ static FT_Error
+ cff_builder_add_contour( CFF_Builder* builder )
+ {
+ FT_Outline* outline = builder->current;
+ FT_Error error;
+
+
+ if ( !builder->load_points )
+ {
+ outline->n_contours++;
+ return FT_Err_Ok;
+ }
+
+ error = FT_GLYPHLOADER_CHECK_POINTS( builder->loader, 0, 1 );
+ if ( !error )
+ {
+ if ( outline->n_contours > 0 )
+ outline->contours[outline->n_contours - 1] =
+ (short)( outline->n_points - 1 );
+
+ outline->n_contours++;
+ }
+
+ return error;
+ }
+
+
+ /* if a path was begun, add its first on-curve point */
+ FT_LOCAL_DEF( FT_Error )
+ cff_builder_start_point( CFF_Builder* builder,
+ FT_Pos x,
+ FT_Pos y )
+ {
+ FT_Error error = FT_Err_Ok;
+
+
+ /* test whether we are building a new contour */
+ if ( !builder->path_begun )
+ {
+ builder->path_begun = 1;
+ error = cff_builder_add_contour( builder );
+ if ( !error )
+ error = cff_builder_add_point1( builder, x, y );
+ }
+
+ return error;
+ }
+
+
+ /* close the current contour */
+ FT_LOCAL_DEF( void )
+ cff_builder_close_contour( CFF_Builder* builder )
+ {
+ FT_Outline* outline = builder->current;
+ FT_Int first;
+
+
+ if ( !outline )
+ return;
+
+ first = outline->n_contours <= 1
+ ? 0 : outline->contours[outline->n_contours - 2] + 1;
+
+ /* We must not include the last point in the path if it */
+ /* is located on the first point. */
+ if ( outline->n_points > 1 )
+ {
+ FT_Vector* p1 = outline->points + first;
+ FT_Vector* p2 = outline->points + outline->n_points - 1;
+ FT_Byte* control = (FT_Byte*)outline->tags + outline->n_points - 1;
+
+
+ /* `delete' last point only if it coincides with the first */
+ /* point and if it is not a control point (which can happen). */
+ if ( p1->x == p2->x && p1->y == p2->y )
+ if ( *control == FT_CURVE_TAG_ON )
+ outline->n_points--;
+ }
+
+ if ( outline->n_contours > 0 )
+ {
+ /* Don't add contours only consisting of one point, i.e., */
+ /* check whether begin point and last point are the same. */
+ if ( first == outline->n_points - 1 )
+ {
+ outline->n_contours--;
+ outline->n_points--;
+ }
+ else
+ outline->contours[outline->n_contours - 1] =
+ (short)( outline->n_points - 1 );
+ }
+ }
+
+
+ FT_LOCAL_DEF( FT_Int )
+ cff_lookup_glyph_by_stdcharcode( CFF_Font cff,
+ FT_Int charcode )
+ {
+ FT_UInt n;
+ FT_UShort glyph_sid;
+
+
+ /* CID-keyed fonts don't have glyph names */
+ if ( !cff->charset.sids )
+ return -1;
+
+ /* check range of standard char code */
+ if ( charcode < 0 || charcode > 255 )
+ return -1;
+
+ /* Get code to SID mapping from `cff_standard_encoding'. */
+ glyph_sid = cff_get_standard_encoding( (FT_UInt)charcode );
+
+ for ( n = 0; n < cff->num_glyphs; n++ )
+ {
+ if ( cff->charset.sids[n] == glyph_sid )
+ return n;
+ }
+
+ return -1;
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ cff_get_glyph_data( TT_Face face,
+ FT_UInt glyph_index,
+ FT_Byte** pointer,
+ FT_ULong* length )
+ {
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+ /* For incremental fonts get the character data using the */
+ /* callback function. */
+ if ( face->root.internal->incremental_interface )
+ {
+ FT_Data data;
+ FT_Error error =
+ face->root.internal->incremental_interface->funcs->get_glyph_data(
+ face->root.internal->incremental_interface->object,
+ glyph_index, &data );
+
+
+ *pointer = (FT_Byte*)data.pointer;
+ *length = data.length;
+
+ return error;
+ }
+ else
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
+
+ {
+ CFF_Font cff = (CFF_Font)(face->extra.data);
+
+
+ return cff_index_access_element( &cff->charstrings_index, glyph_index,
+ pointer, length );
+ }
+ }
+
+
+ FT_LOCAL_DEF( void )
+ cff_free_glyph_data( TT_Face face,
+ FT_Byte** pointer,
+ FT_ULong length )
+ {
+#ifndef FT_CONFIG_OPTION_INCREMENTAL
+ FT_UNUSED( length );
+#endif
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+ /* For incremental fonts get the character data using the */
+ /* callback function. */
+ if ( face->root.internal->incremental_interface )
+ {
+ FT_Data data;
+
+
+ data.pointer = *pointer;
+ data.length = length;
+
+ face->root.internal->incremental_interface->funcs->free_glyph_data(
+ face->root.internal->incremental_interface->object, &data );
+ }
+ else
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
+
+ {
+ CFF_Font cff = (CFF_Font)(face->extra.data);
+
+
+ cff_index_forget_element( &cff->charstrings_index, pointer );
+ }
+ }
+
+
+#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
+
+ static FT_Error
+ cff_operator_seac( CFF_Decoder* decoder,
+ FT_Pos asb,
+ FT_Pos adx,
+ FT_Pos ady,
+ FT_Int bchar,
+ FT_Int achar )
+ {
+ FT_Error error;
+ CFF_Builder* builder = &decoder->builder;
+ FT_Int bchar_index, achar_index;
+ TT_Face face = decoder->builder.face;
+ FT_Vector left_bearing, advance;
+ FT_Byte* charstring;
+ FT_ULong charstring_len;
+ FT_Pos glyph_width;
+
+
+ if ( decoder->seac )
+ {
+ FT_ERROR(( "cff_operator_seac: invalid nested seac\n" ));
+ return FT_THROW( Syntax_Error );
+ }
+
+ adx += decoder->builder.left_bearing.x;
+ ady += decoder->builder.left_bearing.y;
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+ /* Incremental fonts don't necessarily have valid charsets. */
+ /* They use the character code, not the glyph index, in this case. */
+ if ( face->root.internal->incremental_interface )
+ {
+ bchar_index = bchar;
+ achar_index = achar;
+ }
+ else
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
+ {
+ CFF_Font cff = (CFF_Font)(face->extra.data);
+
+
+ bchar_index = cff_lookup_glyph_by_stdcharcode( cff, bchar );
+ achar_index = cff_lookup_glyph_by_stdcharcode( cff, achar );
+ }
+
+ if ( bchar_index < 0 || achar_index < 0 )
+ {
+ FT_ERROR(( "cff_operator_seac:"
+ " invalid seac character code arguments\n" ));
+ return FT_THROW( Syntax_Error );
+ }
+
+ /* If we are trying to load a composite glyph, do not load the */
+ /* accent character and return the array of subglyphs. */
+ if ( builder->no_recurse )
+ {
+ FT_GlyphSlot glyph = (FT_GlyphSlot)builder->glyph;
+ FT_GlyphLoader loader = glyph->internal->loader;
+ FT_SubGlyph subg;
+
+
+ /* reallocate subglyph array if necessary */
+ error = FT_GlyphLoader_CheckSubGlyphs( loader, 2 );
+ if ( error )
+ goto Exit;
+
+ subg = loader->current.subglyphs;
+
+ /* subglyph 0 = base character */
+ subg->index = bchar_index;
+ subg->flags = FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES |
+ FT_SUBGLYPH_FLAG_USE_MY_METRICS;
+ subg->arg1 = 0;
+ subg->arg2 = 0;
+ subg++;
+
+ /* subglyph 1 = accent character */
+ subg->index = achar_index;
+ subg->flags = FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES;
+ subg->arg1 = (FT_Int)( adx >> 16 );
+ subg->arg2 = (FT_Int)( ady >> 16 );
+
+ /* set up remaining glyph fields */
+ glyph->num_subglyphs = 2;
+ glyph->subglyphs = loader->base.subglyphs;
+ glyph->format = FT_GLYPH_FORMAT_COMPOSITE;
+
+ loader->current.num_subglyphs = 2;
+ }
+
+ FT_GlyphLoader_Prepare( builder->loader );
+
+ /* First load `bchar' in builder */
+ error = cff_get_glyph_data( face, bchar_index,
+ &charstring, &charstring_len );
+ if ( !error )
+ {
+ /* the seac operator must not be nested */
+ decoder->seac = TRUE;
+ error = cff_decoder_parse_charstrings( decoder, charstring,
+ charstring_len );
+ decoder->seac = FALSE;
+
+ cff_free_glyph_data( face, &charstring, charstring_len );
+
+ if ( error )
+ goto Exit;
+ }
+
+ /* Save the left bearing, advance and glyph width of the base */
+ /* character as they will be erased by the next load. */
+
+ left_bearing = builder->left_bearing;
+ advance = builder->advance;
+ glyph_width = decoder->glyph_width;
+
+ builder->left_bearing.x = 0;
+ builder->left_bearing.y = 0;
+
+ builder->pos_x = adx - asb;
+ builder->pos_y = ady;
+
+ /* Now load `achar' on top of the base outline. */
+ error = cff_get_glyph_data( face, achar_index,
+ &charstring, &charstring_len );
+ if ( !error )
+ {
+ /* the seac operator must not be nested */
+ decoder->seac = TRUE;
+ error = cff_decoder_parse_charstrings( decoder, charstring,
+ charstring_len );
+ decoder->seac = FALSE;
+
+ cff_free_glyph_data( face, &charstring, charstring_len );
+
+ if ( error )
+ goto Exit;
+ }
+
+ /* Restore the left side bearing, advance and glyph width */
+ /* of the base character. */
+ builder->left_bearing = left_bearing;
+ builder->advance = advance;
+ decoder->glyph_width = glyph_width;
+
+ builder->pos_x = 0;
+ builder->pos_y = 0;
+
+ Exit:
+ return error;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* cff_decoder_parse_charstrings */
+ /* */
+ /* <Description> */
+ /* Parses a given Type 2 charstrings program. */
+ /* */
+ /* <InOut> */
+ /* decoder :: The current Type 1 decoder. */
+ /* */
+ /* <Input> */
+ /* charstring_base :: The base of the charstring stream. */
+ /* */
+ /* charstring_len :: The length in bytes of the charstring stream. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ cff_decoder_parse_charstrings( CFF_Decoder* decoder,
+ FT_Byte* charstring_base,
+ FT_ULong charstring_len )
+ {
+ FT_Error error;
+ CFF_Decoder_Zone* zone;
+ FT_Byte* ip;
+ FT_Byte* limit;
+ CFF_Builder* builder = &decoder->builder;
+ FT_Pos x, y;
+ FT_Fixed seed;
+ FT_Fixed* stack;
+ FT_Int charstring_type =
+ decoder->cff->top_font.font_dict.charstring_type;
+
+ T2_Hints_Funcs hinter;
+
+
+ /* set default width */
+ decoder->num_hints = 0;
+ decoder->read_width = 1;
+
+ /* compute random seed from stack address of parameter */
+ seed = (FT_Fixed)( ( (FT_PtrDist)(char*)&seed ^
+ (FT_PtrDist)(char*)&decoder ^
+ (FT_PtrDist)(char*)&charstring_base ) &
+ FT_ULONG_MAX ) ;
+ seed = ( seed ^ ( seed >> 10 ) ^ ( seed >> 20 ) ) & 0xFFFFL;
+ if ( seed == 0 )
+ seed = 0x7384;
+
+ /* initialize the decoder */
+ decoder->top = decoder->stack;
+ decoder->zone = decoder->zones;
+ zone = decoder->zones;
+ stack = decoder->top;
+
+ hinter = (T2_Hints_Funcs)builder->hints_funcs;
+
+ builder->path_begun = 0;
+
+ zone->base = charstring_base;
+ limit = zone->limit = charstring_base + charstring_len;
+ ip = zone->cursor = zone->base;
+
+ error = FT_Err_Ok;
+
+ x = builder->pos_x;
+ y = builder->pos_y;
+
+ /* begin hints recording session, if any */
+ if ( hinter )
+ hinter->open( hinter->hints );
+
+ /* now execute loop */
+ while ( ip < limit )
+ {
+ CFF_Operator op;
+ FT_Byte v;
+
+
+ /********************************************************************/
+ /* */
+ /* Decode operator or operand */
+ /* */
+ v = *ip++;
+ if ( v >= 32 || v == 28 )
+ {
+ FT_Int shift = 16;
+ FT_Int32 val;
+
+
+ /* this is an operand, push it on the stack */
+
+ /* if we use shifts, all computations are done with unsigned */
+ /* values; the conversion to a signed value is the last step */
+ if ( v == 28 )
+ {
+ if ( ip + 1 >= limit )
+ goto Syntax_Error;
+ val = (FT_Short)( ( (FT_UShort)ip[0] << 8 ) | ip[1] );
+ ip += 2;
+ }
+ else if ( v < 247 )
+ val = (FT_Int32)v - 139;
+ else if ( v < 251 )
+ {
+ if ( ip >= limit )
+ goto Syntax_Error;
+ val = ( (FT_Int32)v - 247 ) * 256 + *ip++ + 108;
+ }
+ else if ( v < 255 )
+ {
+ if ( ip >= limit )
+ goto Syntax_Error;
+ val = -( (FT_Int32)v - 251 ) * 256 - *ip++ - 108;
+ }
+ else
+ {
+ if ( ip + 3 >= limit )
+ goto Syntax_Error;
+ val = (FT_Int32)( ( (FT_UInt32)ip[0] << 24 ) |
+ ( (FT_UInt32)ip[1] << 16 ) |
+ ( (FT_UInt32)ip[2] << 8 ) |
+ (FT_UInt32)ip[3] );
+ ip += 4;
+ if ( charstring_type == 2 )
+ shift = 0;
+ }
+ if ( decoder->top - stack >= CFF_MAX_OPERANDS )
+ goto Stack_Overflow;
+
+ val = (FT_Int32)( (FT_UInt32)val << shift );
+ *decoder->top++ = val;
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+ if ( !( val & 0xFFFFL ) )
+ FT_TRACE4(( " %hd", (FT_Short)( (FT_UInt32)val >> 16 ) ));
+ else
+ FT_TRACE4(( " %.2f", val / 65536.0 ));
+#endif
+
+ }
+ else
+ {
+ /* The specification says that normally arguments are to be taken */
+ /* from the bottom of the stack. However, this seems not to be */
+ /* correct, at least for Acroread 7.0.8 on GNU/Linux: It pops the */
+ /* arguments similar to a PS interpreter. */
+
+ FT_Fixed* args = decoder->top;
+ FT_Int num_args = (FT_Int)( args - decoder->stack );
+ FT_Int req_args;
+
+
+ /* find operator */
+ op = cff_op_unknown;
+
+ switch ( v )
+ {
+ case 1:
+ op = cff_op_hstem;
+ break;
+ case 3:
+ op = cff_op_vstem;
+ break;
+ case 4:
+ op = cff_op_vmoveto;
+ break;
+ case 5:
+ op = cff_op_rlineto;
+ break;
+ case 6:
+ op = cff_op_hlineto;
+ break;
+ case 7:
+ op = cff_op_vlineto;
+ break;
+ case 8:
+ op = cff_op_rrcurveto;
+ break;
+ case 9:
+ op = cff_op_closepath;
+ break;
+ case 10:
+ op = cff_op_callsubr;
+ break;
+ case 11:
+ op = cff_op_return;
+ break;
+ case 12:
+ {
+ if ( ip >= limit )
+ goto Syntax_Error;
+ v = *ip++;
+
+ switch ( v )
+ {
+ case 0:
+ op = cff_op_dotsection;
+ break;
+ case 1: /* this is actually the Type1 vstem3 operator */
+ op = cff_op_vstem;
+ break;
+ case 2: /* this is actually the Type1 hstem3 operator */
+ op = cff_op_hstem;
+ break;
+ case 3:
+ op = cff_op_and;
+ break;
+ case 4:
+ op = cff_op_or;
+ break;
+ case 5:
+ op = cff_op_not;
+ break;
+ case 6:
+ op = cff_op_seac;
+ break;
+ case 7:
+ op = cff_op_sbw;
+ break;
+ case 8:
+ op = cff_op_store;
+ break;
+ case 9:
+ op = cff_op_abs;
+ break;
+ case 10:
+ op = cff_op_add;
+ break;
+ case 11:
+ op = cff_op_sub;
+ break;
+ case 12:
+ op = cff_op_div;
+ break;
+ case 13:
+ op = cff_op_load;
+ break;
+ case 14:
+ op = cff_op_neg;
+ break;
+ case 15:
+ op = cff_op_eq;
+ break;
+ case 16:
+ op = cff_op_callothersubr;
+ break;
+ case 17:
+ op = cff_op_pop;
+ break;
+ case 18:
+ op = cff_op_drop;
+ break;
+ case 20:
+ op = cff_op_put;
+ break;
+ case 21:
+ op = cff_op_get;
+ break;
+ case 22:
+ op = cff_op_ifelse;
+ break;
+ case 23:
+ op = cff_op_random;
+ break;
+ case 24:
+ op = cff_op_mul;
+ break;
+ case 26:
+ op = cff_op_sqrt;
+ break;
+ case 27:
+ op = cff_op_dup;
+ break;
+ case 28:
+ op = cff_op_exch;
+ break;
+ case 29:
+ op = cff_op_index;
+ break;
+ case 30:
+ op = cff_op_roll;
+ break;
+ case 33:
+ op = cff_op_setcurrentpoint;
+ break;
+ case 34:
+ op = cff_op_hflex;
+ break;
+ case 35:
+ op = cff_op_flex;
+ break;
+ case 36:
+ op = cff_op_hflex1;
+ break;
+ case 37:
+ op = cff_op_flex1;
+ break;
+ /*default: */ /* XYQ 2007-9-6: we can't just quit if we see some reserved op */
+ /* decrement ip for syntax error message */
+ /* ip--;*/
+ }
+ }
+ break;
+ case 13:
+ op = cff_op_hsbw;
+ break;
+ case 14:
+ op = cff_op_endchar;
+ break;
+ case 16:
+ op = cff_op_blend;
+ break;
+ case 18:
+ op = cff_op_hstemhm;
+ break;
+ case 19:
+ op = cff_op_hintmask;
+ break;
+ case 20:
+ op = cff_op_cntrmask;
+ break;
+ case 21:
+ op = cff_op_rmoveto;
+ break;
+ case 22:
+ op = cff_op_hmoveto;
+ break;
+ case 23:
+ op = cff_op_vstemhm;
+ break;
+ case 24:
+ op = cff_op_rcurveline;
+ break;
+ case 25:
+ op = cff_op_rlinecurve;
+ break;
+ case 26:
+ op = cff_op_vvcurveto;
+ break;
+ case 27:
+ op = cff_op_hhcurveto;
+ break;
+ case 29:
+ op = cff_op_callgsubr;
+ break;
+ case 30:
+ op = cff_op_vhcurveto;
+ break;
+ case 31:
+ op = cff_op_hvcurveto;
+ break;
+ default:
+ FT_TRACE4(( " unknown op (%d)\n", v ));
+ break;
+ }
+
+ if ( op == cff_op_unknown )
+ continue;
+
+ /* check arguments */
+ req_args = cff_argument_counts[op];
+ if ( req_args & CFF_COUNT_CHECK_WIDTH )
+ {
+ if ( num_args > 0 && decoder->read_width )
+ {
+ /* If `nominal_width' is non-zero, the number is really a */
+ /* difference against `nominal_width'. Else, the number here */
+ /* is truly a width, not a difference against `nominal_width'. */
+ /* If the font does not set `nominal_width', then */
+ /* `nominal_width' defaults to zero, and so we can set */
+ /* `glyph_width' to `nominal_width' plus number on the stack */
+ /* -- for either case. */
+
+ FT_Int set_width_ok;
+
+
+ switch ( op )
+ {
+ case cff_op_hmoveto:
+ case cff_op_vmoveto:
+ set_width_ok = num_args & 2;
+ break;
+
+ case cff_op_hstem:
+ case cff_op_vstem:
+ case cff_op_hstemhm:
+ case cff_op_vstemhm:
+ case cff_op_rmoveto:
+ case cff_op_hintmask:
+ case cff_op_cntrmask:
+ set_width_ok = num_args & 1;
+ break;
+
+ case cff_op_endchar:
+ /* If there is a width specified for endchar, we either have */
+ /* 1 argument or 5 arguments. We like to argue. */
+ set_width_ok = ( num_args == 5 ) || ( num_args == 1 );
+ break;
+
+ default:
+ set_width_ok = 0;
+ break;
+ }
+
+ if ( set_width_ok )
+ {
+ decoder->glyph_width = decoder->nominal_width +
+ ( stack[0] >> 16 );
+
+ if ( decoder->width_only )
+ {
+ /* we only want the advance width; stop here */
+ break;
+ }
+
+ /* Consumed an argument. */
+ num_args--;
+ }
+ }
+
+ decoder->read_width = 0;
+ req_args = 0;
+ }
+
+ req_args &= 0x000F;
+ if ( num_args < req_args )
+ goto Stack_Underflow;
+ args -= req_args;
+ num_args -= req_args;
+
+ /* Sunliang.Liu sync 221's revison. */
+ if (args > decoder->stack + CFF_MAX_OPERANDS)
+ goto Stack_Overflow;
+
+ /* At this point, `args' points to the first argument of the */
+ /* operand in case `req_args' isn't zero. Otherwise, we have */
+ /* to adjust `args' manually. */
+
+ /* Note that we only pop arguments from the stack which we */
+ /* really need and can digest so that we can continue in case */
+ /* of superfluous stack elements. */
+
+ switch ( op )
+ {
+ case cff_op_hstem:
+ case cff_op_vstem:
+ case cff_op_hstemhm:
+ case cff_op_vstemhm:
+ /* the number of arguments is always even here */
+ FT_TRACE4((
+ op == cff_op_hstem ? " hstem\n" :
+ ( op == cff_op_vstem ? " vstem\n" :
+ ( op == cff_op_hstemhm ? " hstemhm\n" : " vstemhm\n" ) ) ));
+
+ if ( hinter )
+ hinter->stems( hinter->hints,
+ ( op == cff_op_hstem || op == cff_op_hstemhm ),
+ num_args / 2,
+ args - ( num_args & ~1 ) );
+
+ decoder->num_hints += num_args / 2;
+ args = stack;
+ break;
+
+ case cff_op_hintmask:
+ case cff_op_cntrmask:
+ FT_TRACE4(( op == cff_op_hintmask ? " hintmask" : " cntrmask" ));
+
+ /* implement vstem when needed -- */
+ /* the specification doesn't say it, but this also works */
+ /* with the 'cntrmask' operator */
+ /* */
+ if ( num_args > 0 )
+ {
+ if ( hinter )
+ hinter->stems( hinter->hints,
+ 0,
+ num_args / 2,
+ args - ( num_args & ~1 ) );
+
+ decoder->num_hints += num_args / 2;
+ }
+
+ /* In a valid charstring there must be at least one byte */
+ /* after `hintmask' or `cntrmask' (e.g., for a `return' */
+ /* instruction). Additionally, there must be space for */
+ /* `num_hints' bits. */
+
+ if ( ( ip + ( ( decoder->num_hints + 7 ) >> 3 ) ) >= limit )
+ goto Syntax_Error;
+
+ if ( hinter )
+ {
+ if ( op == cff_op_hintmask )
+ hinter->hintmask( hinter->hints,
+ builder->current->n_points,
+ decoder->num_hints,
+ ip );
+ else
+ hinter->counter( hinter->hints,
+ decoder->num_hints,
+ ip );
+ }
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+ {
+ FT_UInt maskbyte;
+
+
+ FT_TRACE4(( " (maskbytes:" ));
+
+ for ( maskbyte = 0;
+ maskbyte < (FT_UInt)( ( decoder->num_hints + 7 ) >> 3 );
+ maskbyte++, ip++ )
+ FT_TRACE4(( " 0x%02X", *ip ));
+
+ FT_TRACE4(( ")\n" ));
+ }
+#else
+ ip += ( decoder->num_hints + 7 ) >> 3;
+#endif
+ args = stack;
+ break;
+
+ case cff_op_rmoveto:
+ FT_TRACE4(( " rmoveto\n" ));
+
+ cff_builder_close_contour( builder );
+ builder->path_begun = 0;
+ x += args[-2];
+ y += args[-1];
+ args = stack;
+ break;
+
+ case cff_op_vmoveto:
+ FT_TRACE4(( " vmoveto\n" ));
+
+ cff_builder_close_contour( builder );
+ builder->path_begun = 0;
+ y += args[-1];
+ args = stack;
+ break;
+
+ case cff_op_hmoveto:
+ FT_TRACE4(( " hmoveto\n" ));
+
+ cff_builder_close_contour( builder );
+ builder->path_begun = 0;
+ x += args[-1];
+ args = stack;
+ break;
+
+ case cff_op_rlineto:
+ FT_TRACE4(( " rlineto\n" ));
+
+ if ( cff_builder_start_point( builder, x, y ) ||
+ cff_check_points( builder, num_args / 2 ) )
+ goto Fail;
+
+ if ( num_args < 2 )
+ goto Stack_Underflow;
+
+ args -= num_args & ~1;
+ while ( args < decoder->top )
+ {
+ x += args[0];
+ y += args[1];
+ cff_builder_add_point( builder, x, y, 1 );
+ args += 2;
+ }
+ args = stack;
+ break;
+
+ case cff_op_hlineto:
+ case cff_op_vlineto:
+ {
+ FT_Int phase = ( op == cff_op_hlineto );
+
+
+ FT_TRACE4(( op == cff_op_hlineto ? " hlineto\n"
+ : " vlineto\n" ));
+
+ if ( num_args < 0 )
+ goto Stack_Underflow;
+
+ /* there exist subsetted fonts (found in PDFs) */
+ /* which call `hlineto' without arguments */
+ if ( num_args == 0 )
+ break;
+
+ if ( cff_builder_start_point( builder, x, y ) ||
+ cff_check_points( builder, num_args ) )
+ goto Fail;
+
+ args = stack;
+ while ( args < decoder->top )
+ {
+ if ( phase )
+ x += args[0];
+ else
+ y += args[0];
+
+ if ( cff_builder_add_point1( builder, x, y ) )
+ goto Fail;
+
+ args++;
+ phase ^= 1;
+ }
+ args = stack;
+ }
+ break;
+
+ case cff_op_rrcurveto:
+ {
+ FT_Int nargs;
+
+
+ FT_TRACE4(( " rrcurveto\n" ));
+
+ if ( num_args < 6 )
+ goto Stack_Underflow;
+
+ nargs = num_args - num_args % 6;
+
+ if ( cff_builder_start_point( builder, x, y ) ||
+ cff_check_points( builder, nargs / 2 ) )
+ goto Fail;
+
+ args -= nargs;
+ while ( args < decoder->top )
+ {
+ x += args[0];
+ y += args[1];
+ cff_builder_add_point( builder, x, y, 0 );
+ x += args[2];
+ y += args[3];
+ cff_builder_add_point( builder, x, y, 0 );
+ x += args[4];
+ y += args[5];
+ cff_builder_add_point( builder, x, y, 1 );
+ args += 6;
+ }
+ args = stack;
+ }
+ break;
+
+ case cff_op_vvcurveto:
+ {
+ FT_Int nargs;
+
+
+ FT_TRACE4(( " vvcurveto\n" ));
+
+ if ( num_args < 4 )
+ goto Stack_Underflow;
+
+ /* if num_args isn't of the form 4n or 4n+1, */
+ /* we enforce it by clearing the second bit */
+
+ nargs = num_args & ~2;
+
+ if ( cff_builder_start_point( builder, x, y ) )
+ goto Fail;
+
+ args -= nargs;
+
+ if ( nargs & 1 )
+ {
+ x += args[0];
+ args++;
+ nargs--;
+ }
+
+ if ( cff_check_points( builder, 3 * ( nargs / 4 ) ) )
+ goto Fail;
+
+ while ( args < decoder->top )
+ {
+ y += args[0];
+ cff_builder_add_point( builder, x, y, 0 );
+ x += args[1];
+ y += args[2];
+ cff_builder_add_point( builder, x, y, 0 );
+ y += args[3];
+ cff_builder_add_point( builder, x, y, 1 );
+ args += 4;
+ }
+ args = stack;
+ }
+ break;
+
+ case cff_op_hhcurveto:
+ {
+ FT_Int nargs;
+
+
+ FT_TRACE4(( " hhcurveto\n" ));
+
+ if ( num_args < 4 )
+ goto Stack_Underflow;
+
+ /* if num_args isn't of the form 4n or 4n+1, */
+ /* we enforce it by clearing the second bit */
+
+ nargs = num_args & ~2;
+
+ if ( cff_builder_start_point( builder, x, y ) )
+ goto Fail;
+
+ args -= nargs;
+ if ( nargs & 1 )
+ {
+ y += args[0];
+ args++;
+ nargs--;
+ }
+
+ if ( cff_check_points( builder, 3 * ( nargs / 4 ) ) )
+ goto Fail;
+
+ while ( args < decoder->top )
+ {
+ x += args[0];
+ cff_builder_add_point( builder, x, y, 0 );
+ x += args[1];
+ y += args[2];
+ cff_builder_add_point( builder, x, y, 0 );
+ x += args[3];
+ cff_builder_add_point( builder, x, y, 1 );
+ args += 4;
+ }
+ args = stack;
+ }
+ break;
+
+ case cff_op_vhcurveto:
+ case cff_op_hvcurveto:
+ {
+ FT_Int phase;
+ FT_Int nargs;
+
+
+ FT_TRACE4(( op == cff_op_vhcurveto ? " vhcurveto\n"
+ : " hvcurveto\n" ));
+
+ if ( cff_builder_start_point( builder, x, y ) )
+ goto Fail;
+
+ if ( num_args < 4 )
+ goto Stack_Underflow;
+
+ /* if num_args isn't of the form 8n, 8n+1, 8n+4, or 8n+5, */
+ /* we enforce it by clearing the second bit */
+
+ nargs = num_args & ~2;
+
+ args -= nargs;
+ if ( cff_check_points( builder, ( nargs / 4 ) * 3 ) )
+ goto Stack_Underflow;
+
+ phase = ( op == cff_op_hvcurveto );
+
+ while ( nargs >= 4 )
+ {
+ nargs -= 4;
+ if ( phase )
+ {
+ x += args[0];
+ cff_builder_add_point( builder, x, y, 0 );
+ x += args[1];
+ y += args[2];
+ cff_builder_add_point( builder, x, y, 0 );
+ y += args[3];
+ if ( nargs == 1 )
+ x += args[4];
+ cff_builder_add_point( builder, x, y, 1 );
+ }
+ else
+ {
+ y += args[0];
+ cff_builder_add_point( builder, x, y, 0 );
+ x += args[1];
+ y += args[2];
+ cff_builder_add_point( builder, x, y, 0 );
+ x += args[3];
+ if ( nargs == 1 )
+ y += args[4];
+ cff_builder_add_point( builder, x, y, 1 );
+ }
+ args += 4;
+ phase ^= 1;
+ }
+ args = stack;
+ }
+ break;
+
+ case cff_op_rlinecurve:
+ {
+ FT_Int num_lines;
+ FT_Int nargs;
+
+
+ FT_TRACE4(( " rlinecurve\n" ));
+
+ if ( num_args < 8 )
+ goto Stack_Underflow;
+
+ nargs = num_args & ~1;
+ num_lines = ( nargs - 6 ) / 2;
+
+ if ( cff_builder_start_point( builder, x, y ) ||
+ cff_check_points( builder, num_lines + 3 ) )
+ goto Fail;
+
+ args -= nargs;
+
+ /* first, add the line segments */
+ while ( num_lines > 0 )
+ {
+ x += args[0];
+ y += args[1];
+ cff_builder_add_point( builder, x, y, 1 );
+ args += 2;
+ num_lines--;
+ }
+
+ /* then the curve */
+ x += args[0];
+ y += args[1];
+ cff_builder_add_point( builder, x, y, 0 );
+ x += args[2];
+ y += args[3];
+ cff_builder_add_point( builder, x, y, 0 );
+ x += args[4];
+ y += args[5];
+ cff_builder_add_point( builder, x, y, 1 );
+ args = stack;
+ }
+ break;
+
+ case cff_op_rcurveline:
+ {
+ FT_Int num_curves;
+ FT_Int nargs;
+
+
+ FT_TRACE4(( " rcurveline\n" ));
+
+ if ( num_args < 8 )
+ goto Stack_Underflow;
+
+ nargs = num_args - 2;
+ nargs = nargs - nargs % 6 + 2;
+ num_curves = ( nargs - 2 ) / 6;
+
+ if ( cff_builder_start_point( builder, x, y ) ||
+ cff_check_points( builder, num_curves * 3 + 2 ) )
+ goto Fail;
+
+ args -= nargs;
+
+ /* first, add the curves */
+ while ( num_curves > 0 )
+ {
+ x += args[0];
+ y += args[1];
+ cff_builder_add_point( builder, x, y, 0 );
+ x += args[2];
+ y += args[3];
+ cff_builder_add_point( builder, x, y, 0 );
+ x += args[4];
+ y += args[5];
+ cff_builder_add_point( builder, x, y, 1 );
+ args += 6;
+ num_curves--;
+ }
+
+ /* then the final line */
+ x += args[0];
+ y += args[1];
+ cff_builder_add_point( builder, x, y, 1 );
+ args = stack;
+ }
+ break;
+
+ case cff_op_hflex1:
+ {
+ FT_Pos start_y;
+
+
+ FT_TRACE4(( " hflex1\n" ));
+
+ /* adding five more points: 4 control points, 1 on-curve point */
+ /* -- make sure we have enough space for the start point if it */
+ /* needs to be added */
+ if ( cff_builder_start_point( builder, x, y ) ||
+ cff_check_points( builder, 6 ) )
+ goto Fail;
+
+ /* record the starting point's y position for later use */
+ start_y = y;
+
+ /* first control point */
+ x += args[0];
+ y += args[1];
+ cff_builder_add_point( builder, x, y, 0 );
+
+ /* second control point */
+ x += args[2];
+ y += args[3];
+ cff_builder_add_point( builder, x, y, 0 );
+
+ /* join point; on curve, with y-value the same as the last */
+ /* control point's y-value */
+ x += args[4];
+ cff_builder_add_point( builder, x, y, 1 );
+
+ /* third control point, with y-value the same as the join */
+ /* point's y-value */
+ x += args[5];
+ cff_builder_add_point( builder, x, y, 0 );
+
+ /* fourth control point */
+ x += args[6];
+ y += args[7];
+ cff_builder_add_point( builder, x, y, 0 );
+
+ /* ending point, with y-value the same as the start */
+ x += args[8];
+ y = start_y;
+ cff_builder_add_point( builder, x, y, 1 );
+
+ args = stack;
+ break;
+ }
+
+ case cff_op_hflex:
+ {
+ FT_Pos start_y;
+
+
+ FT_TRACE4(( " hflex\n" ));
+
+ /* adding six more points; 4 control points, 2 on-curve points */
+ if ( cff_builder_start_point( builder, x, y ) ||
+ cff_check_points( builder, 6 ) )
+ goto Fail;
+
+ /* record the starting point's y-position for later use */
+ start_y = y;
+
+ /* first control point */
+ x += args[0];
+ cff_builder_add_point( builder, x, y, 0 );
+
+ /* second control point */
+ x += args[1];
+ y += args[2];
+ cff_builder_add_point( builder, x, y, 0 );
+
+ /* join point; on curve, with y-value the same as the last */
+ /* control point's y-value */
+ x += args[3];
+ cff_builder_add_point( builder, x, y, 1 );
+
+ /* third control point, with y-value the same as the join */
+ /* point's y-value */
+ x += args[4];
+ cff_builder_add_point( builder, x, y, 0 );
+
+ /* fourth control point */
+ x += args[5];
+ y = start_y;
+ cff_builder_add_point( builder, x, y, 0 );
+
+ /* ending point, with y-value the same as the start point's */
+ /* y-value -- we don't add this point, though */
+ x += args[6];
+ cff_builder_add_point( builder, x, y, 1 );
+
+ args = stack;
+ break;
+ }
+
+ case cff_op_flex1:
+ {
+ FT_Pos start_x, start_y; /* record start x, y values for */
+ /* alter use */
+ FT_Fixed dx = 0, dy = 0; /* used in horizontal/vertical */
+ /* algorithm below */
+ FT_Int horizontal, count;
+ FT_Fixed* temp;
+
+
+ FT_TRACE4(( " flex1\n" ));
+
+ /* adding six more points; 4 control points, 2 on-curve points */
+ if ( cff_builder_start_point( builder, x, y ) ||
+ cff_check_points( builder, 6 ) )
+ goto Fail;
+
+ /* record the starting point's x, y position for later use */
+ start_x = x;
+ start_y = y;
+
+ /* XXX: figure out whether this is supposed to be a horizontal */
+ /* or vertical flex; the Type 2 specification is vague... */
+
+ temp = args;
+
+ /* grab up to the last argument */
+ for ( count = 5; count > 0; count-- )
+ {
+ dx += temp[0];
+ dy += temp[1];
+ temp += 2;
+ }
+
+ if ( dx < 0 )
+ dx = -dx;
+ if ( dy < 0 )
+ dy = -dy;
+
+ /* strange test, but here it is... */
+ horizontal = ( dx > dy );
+
+ for ( count = 5; count > 0; count-- )
+ {
+ x += args[0];
+ y += args[1];
+ cff_builder_add_point( builder, x, y,
+ (FT_Bool)( count == 3 ) );
+ args += 2;
+ }
+
+ /* is last operand an x- or y-delta? */
+ if ( horizontal )
+ {
+ x += args[0];
+ y = start_y;
+ }
+ else
+ {
+ x = start_x;
+ y += args[0];
+ }
+
+ cff_builder_add_point( builder, x, y, 1 );
+
+ args = stack;
+ break;
+ }
+
+ case cff_op_flex:
+ {
+ FT_UInt count;
+
+
+ FT_TRACE4(( " flex\n" ));
+
+ if ( cff_builder_start_point( builder, x, y ) ||
+ cff_check_points( builder, 6 ) )
+ goto Fail;
+
+ for ( count = 6; count > 0; count-- )
+ {
+ x += args[0];
+ y += args[1];
+ cff_builder_add_point( builder, x, y,
+ (FT_Bool)( count == 4 || count == 1 ) );
+ args += 2;
+ }
+
+ args = stack;
+ }
+ break;
+
+ case cff_op_seac:
+ FT_TRACE4(( " seac\n" ));
+
+ error = cff_operator_seac( decoder,
+ args[0], args[1], args[2],
+ (FT_Int)( args[3] >> 16 ),
+ (FT_Int)( args[4] >> 16 ) );
+
+ /* add current outline to the glyph slot */
+ FT_GlyphLoader_Add( builder->loader );
+
+ /* return now! */
+ FT_TRACE4(( "\n" ));
+ return error;
+
+ case cff_op_endchar:
+ FT_TRACE4(( " endchar\n" ));
+
+ /* We are going to emulate the seac operator. */
+ if ( num_args >= 4 )
+ {
+ /* Save glyph width so that the subglyphs don't overwrite it. */
+ FT_Pos glyph_width = decoder->glyph_width;
+
+
+ error = cff_operator_seac( decoder,
+ 0L, args[-4], args[-3],
+ (FT_Int)( args[-2] >> 16 ),
+ (FT_Int)( args[-1] >> 16 ) );
+
+ decoder->glyph_width = glyph_width;
+ }
+ else
+ {
+ if ( !error )
+ error = FT_Err_Ok;
+
+ cff_builder_close_contour( builder );
+
+ /* close hints recording session */
+ if ( hinter )
+ {
+ if ( hinter->close( hinter->hints,
+ builder->current->n_points ) )
+ goto Syntax_Error;
+
+ /* apply hints to the loaded glyph outline now */
+ hinter->apply( hinter->hints,
+ builder->current,
+ (PSH_Globals)builder->hints_globals,
+ decoder->hint_mode );
+ }
+
+ /* add current outline to the glyph slot */
+ FT_GlyphLoader_Add( builder->loader );
+ }
+
+ /* return now! */
+ FT_TRACE4(( "\n" ));
+ return error;
+
+ case cff_op_abs:
+ FT_TRACE4(( " abs\n" ));
+
+ if ( args[0] < 0 )
+ args[0] = -args[0];
+ args++;
+ break;
+
+ case cff_op_add:
+ FT_TRACE4(( " add\n" ));
+
+ args[0] += args[1];
+ args++;
+ break;
+
+ case cff_op_sub:
+ FT_TRACE4(( " sub\n" ));
+
+ args[0] -= args[1];
+ args++;
+ break;
+
+ case cff_op_div:
+ FT_TRACE4(( " div\n" ));
+
+ args[0] = FT_DivFix( args[0], args[1] );
+ args++;
+ break;
+
+ case cff_op_neg:
+ FT_TRACE4(( " neg\n" ));
+
+ args[0] = -args[0];
+ args++;
+ break;
+
+ case cff_op_random:
+ {
+ FT_Fixed Rand;
+
+
+ FT_TRACE4(( " rand\n" ));
+
+ Rand = seed;
+ if ( Rand >= 0x8000L )
+ Rand++;
+
+ args[0] = Rand;
+ seed = FT_MulFix( seed, 0x10000L - seed );
+ if ( seed == 0 )
+ seed += 0x2873;
+ args++;
+ }
+ break;
+
+ case cff_op_mul:
+ FT_TRACE4(( " mul\n" ));
+
+ args[0] = FT_MulFix( args[0], args[1] );
+ args++;
+ break;
+
+ case cff_op_sqrt:
+ FT_TRACE4(( " sqrt\n" ));
+
+ if ( args[0] > 0 )
+ {
+ FT_Int count = 9;
+ FT_Fixed root = args[0];
+ FT_Fixed new_root;
+
+
+ for (;;)
+ {
+ new_root = ( root + FT_DivFix( args[0], root ) + 1 ) >> 1;
+ if ( new_root == root || count <= 0 )
+ break;
+ root = new_root;
+ }
+ args[0] = new_root;
+ }
+ else
+ args[0] = 0;
+ args++;
+ break;
+
+ case cff_op_drop:
+ /* nothing */
+ FT_TRACE4(( " drop\n" ));
+
+ break;
+
+ case cff_op_exch:
+ {
+ FT_Fixed tmp;
+
+
+ FT_TRACE4(( " exch\n" ));
+
+ tmp = args[0];
+ args[0] = args[1];
+ args[1] = tmp;
+ args += 2;
+ }
+ break;
+
+ case cff_op_index:
+ {
+ FT_Int idx = (FT_Int)( args[0] >> 16 );
+
+
+ FT_TRACE4(( " index\n" ));
+
+ if ( idx < 0 )
+ idx = 0;
+ else if ( idx > num_args - 2 )
+ idx = num_args - 2;
+ args[0] = args[-( idx + 1 )];
+ args++;
+ }
+ break;
+
+ case cff_op_roll:
+ {
+ FT_Int count = (FT_Int)( args[0] >> 16 );
+ FT_Int idx = (FT_Int)( args[1] >> 16 );
+
+
+ FT_TRACE4(( " roll\n" ));
+
+ if ( count <= 0 )
+ count = 1;
+
+ args -= count;
+ if ( args < stack )
+ goto Stack_Underflow;
+
+ if ( idx >= 0 )
+ {
+ while ( idx > 0 )
+ {
+ FT_Fixed tmp = args[count - 1];
+ FT_Int i;
+
+
+ for ( i = count - 2; i >= 0; i-- )
+ args[i + 1] = args[i];
+ args[0] = tmp;
+ idx--;
+ }
+ }
+ else
+ {
+ while ( idx < 0 )
+ {
+ FT_Fixed tmp = args[0];
+ FT_Int i;
+
+
+ for ( i = 0; i < count - 1; i++ )
+ args[i] = args[i + 1];
+ args[count - 1] = tmp;
+ idx++;
+ }
+ }
+ args += count;
+ }
+ break;
+
+ case cff_op_dup:
+ FT_TRACE4(( " dup\n" ));
+
+ args[1] = args[0];
+ args += 2;
+ break;
+
+ case cff_op_put:
+ {
+ FT_Fixed val = args[0];
+ FT_Int idx = (FT_Int)( args[1] >> 16 );
+
+
+ FT_TRACE4(( " put\n" ));
+
+ if ( idx >= 0 && idx < CFF_MAX_TRANS_ELEMENTS )
+ decoder->buildchar[idx] = val;
+ }
+ break;
+
+ case cff_op_get:
+ {
+ FT_Int idx = (FT_Int)( args[0] >> 16 );
+ FT_Fixed val = 0;
+
+
+ FT_TRACE4(( " get\n" ));
+
+ if ( idx >= 0 && idx < CFF_MAX_TRANS_ELEMENTS )
+ val = decoder->buildchar[idx];
+
+ args[0] = val;
+ args++;
+ }
+ break;
+
+ case cff_op_store:
+ FT_TRACE4(( " store\n"));
+
+ goto Unimplemented;
+
+ case cff_op_load:
+ FT_TRACE4(( " load\n" ));
+
+ goto Unimplemented;
+
+ case cff_op_dotsection:
+ /* this operator is deprecated and ignored by the parser */
+ FT_TRACE4(( " dotsection\n" ));
+ break;
+
+ case cff_op_closepath:
+ /* this is an invalid Type 2 operator; however, there */
+ /* exist fonts which are incorrectly converted from probably */
+ /* Type 1 to CFF, and some parsers seem to accept it */
+
+ FT_TRACE4(( " closepath (invalid op)\n" ));
+
+ args = stack;
+ break;
+
+ case cff_op_hsbw:
+ /* this is an invalid Type 2 operator; however, there */
+ /* exist fonts which are incorrectly converted from probably */
+ /* Type 1 to CFF, and some parsers seem to accept it */
+
+ FT_TRACE4(( " hsbw (invalid op)\n" ));
+
+ decoder->glyph_width = decoder->nominal_width + ( args[1] >> 16 );
+
+ decoder->builder.left_bearing.x = args[0];
+ decoder->builder.left_bearing.y = 0;
+
+ x = decoder->builder.pos_x + args[0];
+ y = decoder->builder.pos_y;
+ args = stack;
+ break;
+
+ case cff_op_sbw:
+ /* this is an invalid Type 2 operator; however, there */
+ /* exist fonts which are incorrectly converted from probably */
+ /* Type 1 to CFF, and some parsers seem to accept it */
+
+ FT_TRACE4(( " sbw (invalid op)\n" ));
+
+ decoder->glyph_width = decoder->nominal_width + ( args[2] >> 16 );
+
+ decoder->builder.left_bearing.x = args[0];
+ decoder->builder.left_bearing.y = args[1];
+
+ x = decoder->builder.pos_x + args[0];
+ y = decoder->builder.pos_y + args[1];
+ args = stack;
+ break;
+
+ case cff_op_setcurrentpoint:
+ /* this is an invalid Type 2 operator; however, there */
+ /* exist fonts which are incorrectly converted from probably */
+ /* Type 1 to CFF, and some parsers seem to accept it */
+
+ FT_TRACE4(( " setcurrentpoint (invalid op)\n" ));
+
+ x = decoder->builder.pos_x + args[0];
+ y = decoder->builder.pos_y + args[1];
+ args = stack;
+ break;
+
+ case cff_op_callothersubr:
+ /* this is an invalid Type 2 operator; however, there */
+ /* exist fonts which are incorrectly converted from probably */
+ /* Type 1 to CFF, and some parsers seem to accept it */
+
+ FT_TRACE4(( " callothersubr (invalid op)\n" ));
+
+ /* subsequent `pop' operands should add the arguments, */
+ /* this is the implementation described for `unknown' other */
+ /* subroutines in the Type1 spec. */
+ /* */
+ /* XXX Fix return arguments (see discussion below). */
+ args -= 2 + ( args[-2] >> 16 );
+ if ( args < stack )
+ goto Stack_Underflow;
+ break;
+
+ case cff_op_pop:
+ /* this is an invalid Type 2 operator; however, there */
+ /* exist fonts which are incorrectly converted from probably */
+ /* Type 1 to CFF, and some parsers seem to accept it */
+
+ FT_TRACE4(( " pop (invalid op)\n" ));
+
+ /* XXX Increasing `args' is wrong: After a certain number of */
+ /* `pop's we get a stack overflow. Reason for doing it is */
+ /* code like this (actually found in a CFF font): */
+ /* */
+ /* 17 1 3 callothersubr */
+ /* pop */
+ /* callsubr */
+ /* */
+ /* Since we handle `callothersubr' as a no-op, and */
+ /* `callsubr' needs at least one argument, `pop' can't be a */
+ /* no-op too as it basically should be. */
+ /* */
+ /* The right solution would be to provide real support for */
+ /* `callothersubr' as done in `t1decode.c', however, given */
+ /* the fact that CFF fonts with `pop' are invalid, it is */
+ /* questionable whether it is worth the time. */
+ args++;
+ break;
+
+ case cff_op_and:
+ {
+ FT_Fixed cond = args[0] && args[1];
+
+
+ FT_TRACE4(( " and\n" ));
+
+ args[0] = cond ? 0x10000L : 0;
+ args++;
+ }
+ break;
+
+ case cff_op_or:
+ {
+ FT_Fixed cond = args[0] || args[1];
+
+
+ FT_TRACE4(( " or\n" ));
+
+ args[0] = cond ? 0x10000L : 0;
+ args++;
+ }
+ break;
+
+ case cff_op_eq:
+ {
+ FT_Fixed cond = !args[0];
+
+
+ FT_TRACE4(( " eq\n" ));
+
+ args[0] = cond ? 0x10000L : 0;
+ args++;
+ }
+ break;
+
+ case cff_op_ifelse:
+ {
+ FT_Fixed cond = ( args[2] <= args[3] );
+
+
+ FT_TRACE4(( " ifelse\n" ));
+
+ if ( !cond )
+ args[0] = args[1];
+ args++;
+ }
+ break;
+
+ case cff_op_callsubr:
+ {
+ FT_UInt idx = (FT_UInt)( ( args[0] >> 16 ) +
+ decoder->locals_bias );
+
+
+ FT_TRACE4(( " callsubr(%d)\n", idx ));
+
+ if ( idx >= decoder->num_locals )
+ {
+ FT_ERROR(( "cff_decoder_parse_charstrings:"
+ " invalid local subr index\n" ));
+ goto Syntax_Error;
+ }
+
+ if ( zone - decoder->zones >= CFF_MAX_SUBRS_CALLS )
+ {
+ FT_ERROR(( "cff_decoder_parse_charstrings:"
+ " too many nested subrs\n" ));
+ goto Syntax_Error;
+ }
+
+ zone->cursor = ip; /* save current instruction pointer */
+
+ zone++;
+ zone->base = decoder->locals[idx];
+ zone->limit = decoder->locals[idx + 1];
+ zone->cursor = zone->base;
+
+ if ( !zone->base || zone->limit == zone->base )
+ {
+ FT_ERROR(( "cff_decoder_parse_charstrings:"
+ " invoking empty subrs\n" ));
+ goto Syntax_Error;
+ }
+
+ decoder->zone = zone;
+ ip = zone->base;
+ limit = zone->limit;
+ }
+ break;
+
+ case cff_op_callgsubr:
+ {
+ FT_UInt idx = (FT_UInt)( ( args[0] >> 16 ) +
+ decoder->globals_bias );
+
+
+ FT_TRACE4(( " callgsubr(%d)\n", idx ));
+
+ if ( idx >= decoder->num_globals )
+ {
+ FT_ERROR(( "cff_decoder_parse_charstrings:"
+ " invalid global subr index\n" ));
+ goto Syntax_Error;
+ }
+
+ if ( zone - decoder->zones >= CFF_MAX_SUBRS_CALLS )
+ {
+ FT_ERROR(( "cff_decoder_parse_charstrings:"
+ " too many nested subrs\n" ));
+ goto Syntax_Error;
+ }
+
+ zone->cursor = ip; /* save current instruction pointer */
+
+ zone++;
+ zone->base = decoder->globals[idx];
+ zone->limit = decoder->globals[idx + 1];
+ zone->cursor = zone->base;
+
+ if ( !zone->base || zone->limit == zone->base )
+ {
+ FT_ERROR(( "cff_decoder_parse_charstrings:"
+ " invoking empty subrs\n" ));
+ goto Syntax_Error;
+ }
+
+ decoder->zone = zone;
+ ip = zone->base;
+ limit = zone->limit;
+ }
+ break;
+
+ case cff_op_return:
+ FT_TRACE4(( " return\n" ));
+
+ if ( decoder->zone <= decoder->zones )
+ {
+ FT_ERROR(( "cff_decoder_parse_charstrings:"
+ " unexpected return\n" ));
+ goto Syntax_Error;
+ }
+
+ decoder->zone--;
+ zone = decoder->zone;
+ ip = zone->cursor;
+ limit = zone->limit;
+ break;
+
+ default:
+ Unimplemented:
+ FT_ERROR(( "Unimplemented opcode: %d", ip[-1] ));
+
+ if ( ip[-1] == 12 )
+ FT_ERROR(( " %d", ip[0] ));
+ FT_ERROR(( "\n" ));
+
+ return FT_THROW( Unimplemented_Feature );
+ }
+
+ decoder->top = args;
+
+ if ( decoder->top - stack >= CFF_MAX_OPERANDS )
+ goto Stack_Overflow;
+
+ } /* general operator processing */
+
+ } /* while ip < limit */
+
+ FT_TRACE4(( "..end..\n\n" ));
+
+ Fail:
+ return error;
+
+ Syntax_Error:
+ FT_TRACE4(( "cff_decoder_parse_charstrings: syntax error\n" ));
+ return FT_THROW( Invalid_File_Format );
+
+ Stack_Underflow:
+ FT_TRACE4(( "cff_decoder_parse_charstrings: stack underflow\n" ));
+ return FT_THROW( Too_Few_Arguments );
+
+ Stack_Overflow:
+ FT_TRACE4(( "cff_decoder_parse_charstrings: stack overflow\n" ));
+ return FT_THROW( Stack_Overflow );
+ }
+
+#endif /* CFF_CONFIG_OPTION_OLD_ENGINE */
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /********** *********/
+ /********** *********/
+ /********** COMPUTE THE MAXIMUM ADVANCE WIDTH *********/
+ /********** *********/
+ /********** The following code is in charge of computing *********/
+ /********** the maximum advance width of the font. It *********/
+ /********** quickly processes each glyph charstring to *********/
+ /********** extract the value from either a `sbw' or `seac' *********/
+ /********** operator. *********/
+ /********** *********/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+#if 0 /* unused until we support pure CFF fonts */
+
+
+ FT_LOCAL_DEF( FT_Error )
+ cff_compute_max_advance( TT_Face face,
+ FT_Int* max_advance )
+ {
+ FT_Error error = FT_Err_Ok;
+ CFF_Decoder decoder;
+ FT_Int glyph_index;
+ CFF_Font cff = (CFF_Font)face->other;
+
+
+ *max_advance = 0;
+
+ /* Initialize load decoder */
+ cff_decoder_init( &decoder, face, 0, 0, 0, 0 );
+
+ decoder.builder.metrics_only = 1;
+ decoder.builder.load_points = 0;
+
+ /* For each glyph, parse the glyph charstring and extract */
+ /* the advance width. */
+ for ( glyph_index = 0; glyph_index < face->root.num_glyphs;
+ glyph_index++ )
+ {
+ FT_Byte* charstring;
+ FT_ULong charstring_len;
+
+
+ /* now get load the unscaled outline */
+ error = cff_get_glyph_data( face, glyph_index,
+ &charstring, &charstring_len );
+ if ( !error )
+ {
+ error = cff_decoder_prepare( &decoder, size, glyph_index );
+ if ( !error )
+ error = cff_decoder_parse_charstrings( &decoder,
+ charstring,
+ charstring_len );
+
+ cff_free_glyph_data( face, &charstring, &charstring_len );
+ }
+
+ /* ignore the error if one has occurred -- skip to next glyph */
+ error = FT_Err_Ok;
+ }
+
+ *max_advance = decoder.builder.advance.x;
+
+ return FT_Err_Ok;
+ }
+
+
+#endif /* 0 */
+
+
+ FT_LOCAL_DEF( FT_Error )
+ cff_slot_load( CFF_GlyphSlot glyph,
+ CFF_Size size,
+ FT_UInt glyph_index,
+ FT_Int32 load_flags )
+ {
+ FT_Error error;
+ CFF_Decoder decoder;
+ TT_Face face = (TT_Face)glyph->root.face;
+ FT_Bool hinting, scaled, force_scaling;
+ CFF_Font cff = (CFF_Font)face->extra.data;
+
+ FT_Matrix font_matrix;
+ FT_Vector font_offset;
+
+
+ force_scaling = FALSE;
+
+ /* in a CID-keyed font, consider `glyph_index' as a CID and map */
+ /* it immediately to the real glyph_index -- if it isn't a */
+ /* subsetted font, glyph_indices and CIDs are identical, though */
+ if ( cff->top_font.font_dict.cid_registry != 0xFFFFU &&
+ cff->charset.cids )
+ {
+ /* don't handle CID 0 (.notdef) which is directly mapped to GID 0 */
+ if ( glyph_index != 0 )
+ {
+ glyph_index = cff_charset_cid_to_gindex( &cff->charset,
+ glyph_index );
+ if ( glyph_index == 0 )
+ return FT_THROW( Invalid_Argument );
+ }
+ }
+ else if ( glyph_index >= cff->num_glyphs )
+ return FT_THROW( Invalid_Argument );
+
+ if ( load_flags & FT_LOAD_NO_RECURSE )
+ load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING;
+
+ glyph->x_scale = 0x10000L;
+ glyph->y_scale = 0x10000L;
+ if ( size )
+ {
+ glyph->x_scale = size->root.metrics.x_scale;
+ glyph->y_scale = size->root.metrics.y_scale;
+ }
+
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+
+ /* try to load embedded bitmap if any */
+ /* */
+ /* XXX: The convention should be emphasized in */
+ /* the documents because it can be confusing. */
+ if ( size )
+ {
+ CFF_Face cff_face = (CFF_Face)size->root.face;
+ SFNT_Service sfnt = (SFNT_Service)cff_face->sfnt;
+ FT_Stream stream = cff_face->root.stream;
+
+
+ if ( size->strike_index != 0xFFFFFFFFUL &&
+ sfnt->load_eblc &&
+ ( load_flags & FT_LOAD_NO_BITMAP ) == 0 )
+ {
+ TT_SBit_MetricsRec metrics;
+
+
+ error = sfnt->load_sbit_image( face,
+ size->strike_index,
+ glyph_index,
+ (FT_Int)load_flags,
+ stream,
+ &glyph->root.bitmap,
+ &metrics );
+
+ if ( !error )
+ {
+ FT_Bool has_vertical_info;
+ FT_UShort advance;
+ FT_Short dummy;
+
+
+ glyph->root.outline.n_points = 0;
+ glyph->root.outline.n_contours = 0;
+
+ glyph->root.metrics.width = (FT_Pos)metrics.width << 6;
+ glyph->root.metrics.height = (FT_Pos)metrics.height << 6;
+
+ glyph->root.metrics.horiBearingX = (FT_Pos)metrics.horiBearingX << 6;
+ glyph->root.metrics.horiBearingY = (FT_Pos)metrics.horiBearingY << 6;
+ glyph->root.metrics.horiAdvance = (FT_Pos)metrics.horiAdvance << 6;
+
+ glyph->root.metrics.vertBearingX = (FT_Pos)metrics.vertBearingX << 6;
+ glyph->root.metrics.vertBearingY = (FT_Pos)metrics.vertBearingY << 6;
+ glyph->root.metrics.vertAdvance = (FT_Pos)metrics.vertAdvance << 6;
+
+ glyph->root.format = FT_GLYPH_FORMAT_BITMAP;
+
+ if ( load_flags & FT_LOAD_VERTICAL_LAYOUT )
+ {
+ glyph->root.bitmap_left = metrics.vertBearingX;
+ glyph->root.bitmap_top = metrics.vertBearingY;
+ }
+ else
+ {
+ glyph->root.bitmap_left = metrics.horiBearingX;
+ glyph->root.bitmap_top = metrics.horiBearingY;
+ }
+
+ /* compute linear advance widths */
+
+ ( (SFNT_Service)face->sfnt )->get_metrics( face, 0,
+ glyph_index,
+ &dummy,
+ &advance );
+ glyph->root.linearHoriAdvance = advance;
+
+ has_vertical_info = FT_BOOL(
+ face->vertical_info &&
+ face->vertical.number_Of_VMetrics > 0 );
+
+ /* get the vertical metrics from the vtmx table if we have one */
+ if ( has_vertical_info )
+ {
+ ( (SFNT_Service)face->sfnt )->get_metrics( face, 1,
+ glyph_index,
+ &dummy,
+ &advance );
+ glyph->root.linearVertAdvance = advance;
+ }
+ else
+ {
+ /* make up vertical ones */
+ if ( face->os2.version != 0xFFFFU )
+ glyph->root.linearVertAdvance = (FT_Pos)
+ ( face->os2.sTypoAscender - face->os2.sTypoDescender );
+ else
+ glyph->root.linearVertAdvance = (FT_Pos)
+ ( face->horizontal.Ascender - face->horizontal.Descender );
+ }
+
+ return error;
+ }
+ }
+ }
+
+#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
+
+ /* return immediately if we only want the embedded bitmaps */
+ if ( load_flags & FT_LOAD_SBITS_ONLY )
+ return FT_THROW( Invalid_Argument );
+
+ /* if we have a CID subfont, use its matrix (which has already */
+ /* been multiplied with the root matrix) */
+
+ /* this scaling is only relevant if the PS hinter isn't active */
+ if ( cff->num_subfonts )
+ {
+ FT_ULong top_upm, sub_upm;
+ FT_Byte fd_index = cff_fd_select_get( &cff->fd_select,
+ glyph_index );
+
+
+ if ( fd_index >= cff->num_subfonts )
+ fd_index = (FT_Byte)( cff->num_subfonts - 1 );
+
+ top_upm = cff->top_font.font_dict.units_per_em;
+ sub_upm = cff->subfonts[fd_index]->font_dict.units_per_em;
+
+
+ font_matrix = cff->subfonts[fd_index]->font_dict.font_matrix;
+ font_offset = cff->subfonts[fd_index]->font_dict.font_offset;
+
+ if ( top_upm != sub_upm )
+ {
+ glyph->x_scale = FT_MulDiv( glyph->x_scale, top_upm, sub_upm );
+ glyph->y_scale = FT_MulDiv( glyph->y_scale, top_upm, sub_upm );
+
+ force_scaling = TRUE;
+ }
+ }
+ else
+ {
+ font_matrix = cff->top_font.font_dict.font_matrix;
+ font_offset = cff->top_font.font_dict.font_offset;
+ }
+
+ glyph->root.outline.n_points = 0;
+ glyph->root.outline.n_contours = 0;
+
+ /* top-level code ensures that FT_LOAD_NO_HINTING is set */
+ /* if FT_LOAD_NO_SCALE is active */
+ hinting = FT_BOOL( ( load_flags & FT_LOAD_NO_HINTING ) == 0 );
+ scaled = FT_BOOL( ( load_flags & FT_LOAD_NO_SCALE ) == 0 );
+
+ glyph->hint = hinting;
+ glyph->scaled = scaled;
+ glyph->root.format = FT_GLYPH_FORMAT_OUTLINE; /* by default */
+
+ {
+#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
+ CFF_Driver driver = (CFF_Driver)FT_FACE_DRIVER( face );
+#endif
+
+
+ FT_Byte* charstring;
+ FT_ULong charstring_len;
+
+
+ cff_decoder_init( &decoder, face, size, glyph, hinting,
+ FT_LOAD_TARGET_MODE( load_flags ) );
+
+ if ( load_flags & FT_LOAD_ADVANCE_ONLY )
+ decoder.width_only = TRUE;
+
+ decoder.builder.no_recurse =
+ (FT_Bool)( load_flags & FT_LOAD_NO_RECURSE );
+
+ /* now load the unscaled outline */
+ error = cff_get_glyph_data( face, glyph_index,
+ &charstring, &charstring_len );
+ if ( error )
+ goto Glyph_Build_Finished;
+
+ error = cff_decoder_prepare( &decoder, size, glyph_index );
+ if ( error )
+ goto Glyph_Build_Finished;
+
+#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
+ /* choose which CFF renderer to use */
+ if ( driver->hinting_engine == FT_CFF_HINTING_FREETYPE )
+ error = cff_decoder_parse_charstrings( &decoder,
+ charstring,
+ charstring_len );
+ else
+#endif
+ {
+ error = cf2_decoder_parse_charstrings( &decoder,
+ charstring,
+ charstring_len );
+
+ /* Adobe's engine uses 16.16 numbers everywhere; */
+ /* as a consequence, glyphs larger than 2000ppem get rejected */
+ if ( FT_ERR_EQ( error, Glyph_Too_Big ) )
+ {
+ /* this time, we retry unhinted and scale up the glyph later on */
+ /* (the engine uses and sets the hardcoded value 0x10000 / 64 = */
+ /* 0x400 for both `x_scale' and `y_scale' in this case) */
+ hinting = FALSE;
+ force_scaling = TRUE;
+ glyph->hint = hinting;
+
+ error = cf2_decoder_parse_charstrings( &decoder,
+ charstring,
+ charstring_len );
+ }
+ }
+
+ cff_free_glyph_data( face, &charstring, charstring_len );
+
+ if ( error )
+ goto Glyph_Build_Finished;
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+ /* Control data and length may not be available for incremental */
+ /* fonts. */
+ if ( face->root.internal->incremental_interface )
+ {
+ glyph->root.control_data = 0;
+ glyph->root.control_len = 0;
+ }
+ else
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
+
+ /* We set control_data and control_len if charstrings is loaded. */
+ /* See how charstring loads at cff_index_access_element() in */
+ /* cffload.c. */
+ {
+ CFF_Index csindex = &cff->charstrings_index;
+
+
+ if ( csindex->offsets )
+ {
+ glyph->root.control_data = csindex->bytes +
+ csindex->offsets[glyph_index] - 1;
+ glyph->root.control_len = charstring_len;
+ }
+ }
+
+ Glyph_Build_Finished:
+ /* save new glyph tables, if no error */
+ if ( !error )
+ cff_builder_done( &decoder.builder );
+ /* XXX: anything to do for broken glyph entry? */
+ }
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+
+ /* Incremental fonts can optionally override the metrics. */
+ if ( !error &&
+ face->root.internal->incremental_interface &&
+ face->root.internal->incremental_interface->funcs->get_glyph_metrics )
+ {
+ FT_Incremental_MetricsRec metrics;
+
+
+ metrics.bearing_x = decoder.builder.left_bearing.x;
+ metrics.bearing_y = 0;
+ metrics.advance = decoder.builder.advance.x;
+ metrics.advance_v = decoder.builder.advance.y;
+
+ error = face->root.internal->incremental_interface->funcs->get_glyph_metrics(
+ face->root.internal->incremental_interface->object,
+ glyph_index, FALSE, &metrics );
+
+ decoder.builder.left_bearing.x = metrics.bearing_x;
+ decoder.builder.advance.x = metrics.advance;
+ decoder.builder.advance.y = metrics.advance_v;
+ }
+
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
+
+ if ( !error )
+ {
+ /* Now, set the metrics -- this is rather simple, as */
+ /* the left side bearing is the xMin, and the top side */
+ /* bearing the yMax. */
+
+ /* For composite glyphs, return only left side bearing and */
+ /* advance width. */
+ if ( load_flags & FT_LOAD_NO_RECURSE )
+ {
+ FT_Slot_Internal internal = glyph->root.internal;
+
+
+ glyph->root.metrics.horiBearingX = decoder.builder.left_bearing.x;
+ glyph->root.metrics.horiAdvance = decoder.glyph_width;
+ internal->glyph_matrix = font_matrix;
+ internal->glyph_delta = font_offset;
+ internal->glyph_transformed = 1;
+ }
+ else
+ {
+ FT_BBox cbox;
+ FT_Glyph_Metrics* metrics = &glyph->root.metrics;
+ FT_Vector advance;
+ FT_Bool has_vertical_info;
+
+
+ /* copy the _unscaled_ advance width */
+ metrics->horiAdvance = decoder.glyph_width;
+ glyph->root.linearHoriAdvance = decoder.glyph_width;
+ glyph->root.internal->glyph_transformed = 0;
+
+ has_vertical_info = FT_BOOL( face->vertical_info &&
+ face->vertical.number_Of_VMetrics > 0 );
+
+ /* get the vertical metrics from the vtmx table if we have one */
+ if ( has_vertical_info )
+ {
+ FT_Short vertBearingY = 0;
+ FT_UShort vertAdvance = 0;
+
+
+ ( (SFNT_Service)face->sfnt )->get_metrics( face, 1,
+ glyph_index,
+ &vertBearingY,
+ &vertAdvance );
+ metrics->vertBearingY = vertBearingY;
+ metrics->vertAdvance = vertAdvance;
+ }
+ else
+ {
+ /* make up vertical ones */
+ if ( face->os2.version != 0xFFFFU )
+ metrics->vertAdvance = (FT_Pos)( face->os2.sTypoAscender -
+ face->os2.sTypoDescender );
+ else
+ metrics->vertAdvance = (FT_Pos)( face->horizontal.Ascender -
+ face->horizontal.Descender );
+ }
+
+ glyph->root.linearVertAdvance = metrics->vertAdvance;
+
+ glyph->root.format = FT_GLYPH_FORMAT_OUTLINE;
+
+ glyph->root.outline.flags = 0;
+ if ( size && size->root.metrics.y_ppem < 24 )
+ glyph->root.outline.flags |= FT_OUTLINE_HIGH_PRECISION;
+
+ glyph->root.outline.flags |= FT_OUTLINE_REVERSE_FILL;
+
+ if ( !( font_matrix.xx == 0x10000L &&
+ font_matrix.yy == 0x10000L &&
+ font_matrix.xy == 0 &&
+ font_matrix.yx == 0 ) )
+ FT_Outline_Transform( &glyph->root.outline, &font_matrix );
+
+ if ( !( font_offset.x == 0 &&
+ font_offset.y == 0 ) )
+ FT_Outline_Translate( &glyph->root.outline,
+ font_offset.x, font_offset.y );
+
+ advance.x = metrics->horiAdvance;
+ advance.y = 0;
+ FT_Vector_Transform( &advance, &font_matrix );
+ metrics->horiAdvance = advance.x + font_offset.x;
+
+ advance.x = 0;
+ advance.y = metrics->vertAdvance;
+ FT_Vector_Transform( &advance, &font_matrix );
+ metrics->vertAdvance = advance.y + font_offset.y;
+
+ if ( ( load_flags & FT_LOAD_NO_SCALE ) == 0 || force_scaling )
+ {
+ /* scale the outline and the metrics */
+ FT_Int n;
+ FT_Outline* cur = &glyph->root.outline;
+ FT_Vector* vec = cur->points;
+ FT_Fixed x_scale = glyph->x_scale;
+ FT_Fixed y_scale = glyph->y_scale;
+
+
+ /* First of all, scale the points */
+ if ( !hinting || !decoder.builder.hints_funcs )
+ for ( n = cur->n_points; n > 0; n--, vec++ )
+ {
+ vec->x = FT_MulFix( vec->x, x_scale );
+ vec->y = FT_MulFix( vec->y, y_scale );
+ }
+
+ /* Then scale the metrics */
+ metrics->horiAdvance = FT_MulFix( metrics->horiAdvance, x_scale );
+ metrics->vertAdvance = FT_MulFix( metrics->vertAdvance, y_scale );
+ }
+
+ /* compute the other metrics */
+ FT_Outline_Get_CBox( &glyph->root.outline, &cbox );
+
+ metrics->width = cbox.xMax - cbox.xMin;
+ metrics->height = cbox.yMax - cbox.yMin;
+
+ metrics->horiBearingX = cbox.xMin;
+ metrics->horiBearingY = cbox.yMax;
+
+ if ( has_vertical_info )
+ metrics->vertBearingX = metrics->horiBearingX -
+ metrics->horiAdvance / 2;
+ else
+ {
+ if ( load_flags & FT_LOAD_VERTICAL_LAYOUT )
+ ft_synthesize_vertical_metrics( metrics,
+ metrics->vertAdvance );
+ }
+ }
+ }
+
+ return error;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffgload.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffgload.h
new file mode 100644
index 0000000000..986bba114d
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffgload.h
@@ -0,0 +1,240 @@
+/***************************************************************************/
+/* */
+/* cffgload.h */
+/* */
+/* OpenType Glyph Loader (specification). */
+/* */
+/* Copyright 1996-2004, 2006-2009, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __CFFGLOAD_H__
+#define __CFFGLOAD_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/freetype.h"
+#include "cffobjs.h"
+
+
+FT_BEGIN_HEADER
+
+
+#define CFF_MAX_OPERANDS 48
+#define CFF_MAX_SUBRS_CALLS 32
+#define CFF_MAX_TRANS_ELEMENTS 32
+
+
+ /*************************************************************************/
+ /* */
+ /* <Structure> */
+ /* CFF_Builder */
+ /* */
+ /* <Description> */
+ /* A structure used during glyph loading to store its outline. */
+ /* */
+ /* <Fields> */
+ /* memory :: The current memory object. */
+ /* */
+ /* face :: The current face object. */
+ /* */
+ /* glyph :: The current glyph slot. */
+ /* */
+ /* loader :: The current glyph loader. */
+ /* */
+ /* base :: The base glyph outline. */
+ /* */
+ /* current :: The current glyph outline. */
+ /* */
+ /* pos_x :: The horizontal translation (if composite glyph). */
+ /* */
+ /* pos_y :: The vertical translation (if composite glyph). */
+ /* */
+ /* left_bearing :: The left side bearing point. */
+ /* */
+ /* advance :: The horizontal advance vector. */
+ /* */
+ /* bbox :: Unused. */
+ /* */
+ /* path_begun :: A flag which indicates that a new path has begun. */
+ /* */
+ /* load_points :: If this flag is not set, no points are loaded. */
+ /* */
+ /* no_recurse :: Set but not used. */
+ /* */
+ /* metrics_only :: A boolean indicating that we only want to compute */
+ /* the metrics of a given glyph, not load all of its */
+ /* points. */
+ /* */
+ /* hints_funcs :: Auxiliary pointer for hinting. */
+ /* */
+ /* hints_globals :: Auxiliary pointer for hinting. */
+ /* */
+ typedef struct CFF_Builder_
+ {
+ FT_Memory memory;
+ TT_Face face;
+ CFF_GlyphSlot glyph;
+ FT_GlyphLoader loader;
+ FT_Outline* base;
+ FT_Outline* current;
+
+ FT_Pos pos_x;
+ FT_Pos pos_y;
+
+ FT_Vector left_bearing;
+ FT_Vector advance;
+
+ FT_BBox bbox; /* bounding box */
+ FT_Bool path_begun;
+ FT_Bool load_points;
+ FT_Bool no_recurse;
+
+ FT_Bool metrics_only;
+
+ void* hints_funcs; /* hinter-specific */
+ void* hints_globals; /* hinter-specific */
+
+ } CFF_Builder;
+
+
+ FT_LOCAL( FT_Error )
+ cff_check_points( CFF_Builder* builder,
+ FT_Int count );
+
+ FT_LOCAL( void )
+ cff_builder_add_point( CFF_Builder* builder,
+ FT_Pos x,
+ FT_Pos y,
+ FT_Byte flag );
+ FT_LOCAL( FT_Error )
+ cff_builder_add_point1( CFF_Builder* builder,
+ FT_Pos x,
+ FT_Pos y );
+ FT_LOCAL( FT_Error )
+ cff_builder_start_point( CFF_Builder* builder,
+ FT_Pos x,
+ FT_Pos y );
+ FT_LOCAL( void )
+ cff_builder_close_contour( CFF_Builder* builder );
+
+
+ FT_LOCAL( FT_Int )
+ cff_lookup_glyph_by_stdcharcode( CFF_Font cff,
+ FT_Int charcode );
+ FT_LOCAL( FT_Error )
+ cff_get_glyph_data( TT_Face face,
+ FT_UInt glyph_index,
+ FT_Byte** pointer,
+ FT_ULong* length );
+ FT_LOCAL( void )
+ cff_free_glyph_data( TT_Face face,
+ FT_Byte** pointer,
+ FT_ULong length );
+
+
+ /* execution context charstring zone */
+
+ typedef struct CFF_Decoder_Zone_
+ {
+ FT_Byte* base;
+ FT_Byte* limit;
+ FT_Byte* cursor;
+
+ } CFF_Decoder_Zone;
+
+
+ typedef struct CFF_Decoder_
+ {
+ CFF_Builder builder;
+ CFF_Font cff;
+
+ FT_Fixed stack[CFF_MAX_OPERANDS + 1];
+ FT_Fixed* top;
+
+ CFF_Decoder_Zone zones[CFF_MAX_SUBRS_CALLS + 1];
+ CFF_Decoder_Zone* zone;
+
+ FT_Int flex_state;
+ FT_Int num_flex_vectors;
+ FT_Vector flex_vectors[7];
+
+ FT_Pos glyph_width;
+ FT_Pos nominal_width;
+
+ FT_Bool read_width;
+ FT_Bool width_only;
+ FT_Int num_hints;
+ FT_Fixed buildchar[CFF_MAX_TRANS_ELEMENTS];
+
+ FT_UInt num_locals;
+ FT_UInt num_globals;
+
+ FT_Int locals_bias;
+ FT_Int globals_bias;
+
+ FT_Byte** locals;
+ FT_Byte** globals;
+
+ FT_Byte** glyph_names; /* for pure CFF fonts only */
+ FT_UInt num_glyphs; /* number of glyphs in font */
+
+ FT_Render_Mode hint_mode;
+
+ FT_Bool seac;
+
+ CFF_SubFont current_subfont; /* for current glyph_index */
+
+ } CFF_Decoder;
+
+
+ FT_LOCAL( void )
+ cff_decoder_init( CFF_Decoder* decoder,
+ TT_Face face,
+ CFF_Size size,
+ CFF_GlyphSlot slot,
+ FT_Bool hinting,
+ FT_Render_Mode hint_mode );
+
+ FT_LOCAL( FT_Error )
+ cff_decoder_prepare( CFF_Decoder* decoder,
+ CFF_Size size,
+ FT_UInt glyph_index );
+
+#if 0 /* unused until we support pure CFF fonts */
+
+ /* Compute the maximum advance width of a font through quick parsing */
+ FT_LOCAL( FT_Error )
+ cff_compute_max_advance( TT_Face face,
+ FT_Int* max_advance );
+
+#endif /* 0 */
+
+#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
+ FT_LOCAL( FT_Error )
+ cff_decoder_parse_charstrings( CFF_Decoder* decoder,
+ FT_Byte* charstring_base,
+ FT_ULong charstring_len );
+#endif
+
+ FT_LOCAL( FT_Error )
+ cff_slot_load( CFF_GlyphSlot glyph,
+ CFF_Size size,
+ FT_UInt glyph_index,
+ FT_Int32 load_flags );
+
+
+FT_END_HEADER
+
+#endif /* __CFFGLOAD_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffload.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffload.c
new file mode 100644
index 0000000000..2e5cd9de46
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffload.c
@@ -0,0 +1,1696 @@
+/***************************************************************************/
+/* */
+/* cffload.c */
+/* */
+/* OpenType and CFF data/program tables loader (body). */
+/* */
+/* Copyright 1996-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/tttags.h"
+#include "../../include/freetype/t1tables.h"
+
+#include "cffload.h"
+#include "cffparse.h"
+
+#include "cfferrs.h"
+
+
+#if 1
+
+ static const FT_UShort cff_isoadobe_charset[229] =
+ {
+ 0, 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,
+ 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, 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
+ };
+
+ static const FT_UShort cff_expert_charset[166] =
+ {
+ 0, 1, 229, 230, 231, 232, 233, 234,
+ 235, 236, 237, 238, 13, 14, 15, 99,
+ 239, 240, 241, 242, 243, 244, 245, 246,
+ 247, 248, 27, 28, 249, 250, 251, 252,
+ 253, 254, 255, 256, 257, 258, 259, 260,
+ 261, 262, 263, 264, 265, 266, 109, 110,
+ 267, 268, 269, 270, 271, 272, 273, 274,
+ 275, 276, 277, 278, 279, 280, 281, 282,
+ 283, 284, 285, 286, 287, 288, 289, 290,
+ 291, 292, 293, 294, 295, 296, 297, 298,
+ 299, 300, 301, 302, 303, 304, 305, 306,
+ 307, 308, 309, 310, 311, 312, 313, 314,
+ 315, 316, 317, 318, 158, 155, 163, 319,
+ 320, 321, 322, 323, 324, 325, 326, 150,
+ 164, 169, 327, 328, 329, 330, 331, 332,
+ 333, 334, 335, 336, 337, 338, 339, 340,
+ 341, 342, 343, 344, 345, 346, 347, 348,
+ 349, 350, 351, 352, 353, 354, 355, 356,
+ 357, 358, 359, 360, 361, 362, 363, 364,
+ 365, 366, 367, 368, 369, 370, 371, 372,
+ 373, 374, 375, 376, 377, 378
+ };
+
+ static const FT_UShort cff_expertsubset_charset[87] =
+ {
+ 0, 1, 231, 232, 235, 236, 237, 238,
+ 13, 14, 15, 99, 239, 240, 241, 242,
+ 243, 244, 245, 246, 247, 248, 27, 28,
+ 249, 250, 251, 253, 254, 255, 256, 257,
+ 258, 259, 260, 261, 262, 263, 264, 265,
+ 266, 109, 110, 267, 268, 269, 270, 272,
+ 300, 301, 302, 305, 314, 315, 158, 155,
+ 163, 320, 321, 322, 323, 324, 325, 326,
+ 150, 164, 169, 327, 328, 329, 330, 331,
+ 332, 333, 334, 335, 336, 337, 338, 339,
+ 340, 341, 342, 343, 344, 345, 346
+ };
+
+ static const FT_UShort cff_standard_encoding[256] =
+ {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 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, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 96, 97, 98, 99, 100, 101, 102,
+ 103, 104, 105, 106, 107, 108, 109, 110,
+ 0, 111, 112, 113, 114, 0, 115, 116,
+ 117, 118, 119, 120, 121, 122, 0, 123,
+ 0, 124, 125, 126, 127, 128, 129, 130,
+ 131, 0, 132, 133, 0, 134, 135, 136,
+ 137, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 138, 0, 139, 0, 0, 0, 0,
+ 140, 141, 142, 143, 0, 0, 0, 0,
+ 0, 144, 0, 0, 0, 145, 0, 0,
+ 146, 147, 148, 149, 0, 0, 0, 0
+ };
+
+ static const FT_UShort cff_expert_encoding[256] =
+ {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 229, 230, 0, 231, 232, 233, 234,
+ 235, 236, 237, 238, 13, 14, 15, 99,
+ 239, 240, 241, 242, 243, 244, 245, 246,
+ 247, 248, 27, 28, 249, 250, 251, 252,
+ 0, 253, 254, 255, 256, 257, 0, 0,
+ 0, 258, 0, 0, 259, 260, 261, 262,
+ 0, 0, 263, 264, 265, 0, 266, 109,
+ 110, 267, 268, 269, 0, 270, 271, 272,
+ 273, 274, 275, 276, 277, 278, 279, 280,
+ 281, 282, 283, 284, 285, 286, 287, 288,
+ 289, 290, 291, 292, 293, 294, 295, 296,
+ 297, 298, 299, 300, 301, 302, 303, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 304, 305, 306, 0, 0, 307, 308,
+ 309, 310, 311, 0, 312, 0, 0, 312,
+ 0, 0, 314, 315, 0, 0, 316, 317,
+ 318, 0, 0, 0, 158, 155, 163, 319,
+ 320, 321, 322, 323, 324, 325, 0, 0,
+ 326, 150, 164, 169, 327, 328, 329, 330,
+ 331, 332, 333, 334, 335, 336, 337, 338,
+ 339, 340, 341, 342, 343, 344, 345, 346,
+ 347, 348, 349, 350, 351, 352, 353, 354,
+ 355, 356, 357, 358, 359, 360, 361, 362,
+ 363, 364, 365, 366, 367, 368, 369, 370,
+ 371, 372, 373, 374, 375, 376, 377, 378
+ };
+
+#endif /* 1 */
+
+
+ FT_LOCAL_DEF( FT_UShort )
+ cff_get_standard_encoding( FT_UInt charcode )
+ {
+ return (FT_UShort)( charcode < 256 ? cff_standard_encoding[charcode]
+ : 0 );
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_cffload
+
+
+ /* read an offset from the index's stream current position */
+ static FT_ULong
+ cff_index_read_offset( CFF_Index idx,
+ FT_Error *errorp )
+ {
+ FT_Error error;
+ FT_Stream stream = idx->stream;
+ FT_Byte tmp[4];
+ FT_ULong result = 0;
+
+
+ if ( !FT_STREAM_READ( tmp, idx->off_size ) )
+ {
+ FT_Int nn;
+
+
+ for ( nn = 0; nn < idx->off_size; nn++ )
+ result = ( result << 8 ) | tmp[nn];
+ }
+
+ *errorp = error;
+ return result;
+ }
+
+
+ static FT_Error
+ cff_index_init( CFF_Index idx,
+ FT_Stream stream,
+ FT_Bool load )
+ {
+ FT_Error error;
+ FT_Memory memory = stream->memory;
+ FT_UShort count;
+
+
+ FT_MEM_ZERO( idx, sizeof ( *idx ) );
+
+ idx->stream = stream;
+ idx->start = FT_STREAM_POS();
+ if ( !FT_READ_USHORT( count ) &&
+ count > 0 )
+ {
+ FT_Byte offsize;
+ FT_ULong size;
+
+
+ /* there is at least one element; read the offset size, */
+ /* then access the offset table to compute the index's total size */
+ if ( FT_READ_BYTE( offsize ) )
+ goto Exit;
+
+ if ( offsize < 1 || offsize > 4 )
+ {
+ error = FT_THROW( Invalid_Table );
+ goto Exit;
+ }
+
+ idx->count = count;
+ idx->off_size = offsize;
+ size = (FT_ULong)( count + 1 ) * offsize;
+
+ idx->data_offset = idx->start + 3 + size;
+
+ if ( FT_STREAM_SKIP( size - offsize ) )
+ goto Exit;
+
+ size = cff_index_read_offset( idx, &error );
+ if ( error )
+ goto Exit;
+
+ if ( size == 0 )
+ {
+ error = FT_THROW( Invalid_Table );
+ goto Exit;
+ }
+
+ idx->data_size = --size;
+
+ if ( load )
+ {
+ /* load the data */
+ if ( FT_FRAME_EXTRACT( size, idx->bytes ) )
+ goto Exit;
+ }
+ else
+ {
+ /* skip the data */
+ if ( FT_STREAM_SKIP( size ) )
+ goto Exit;
+ }
+ }
+
+ Exit:
+ if ( error )
+ FT_FREE( idx->offsets );
+
+ return error;
+ }
+
+
+ static void
+ cff_index_done( CFF_Index idx )
+ {
+ if ( idx->stream )
+ {
+ FT_Stream stream = idx->stream;
+ FT_Memory memory = stream->memory;
+
+
+ if ( idx->bytes )
+ FT_FRAME_RELEASE( idx->bytes );
+
+ FT_FREE( idx->offsets );
+ FT_MEM_ZERO( idx, sizeof ( *idx ) );
+ }
+ }
+
+
+ static FT_Error
+ cff_index_load_offsets( CFF_Index idx )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_Stream stream = idx->stream;
+ FT_Memory memory = stream->memory;
+
+
+ if ( idx->count > 0 && idx->offsets == NULL )
+ {
+ FT_Byte offsize = idx->off_size;
+ FT_ULong data_size;
+ FT_Byte* p;
+ FT_Byte* p_end;
+ FT_ULong* poff;
+
+
+ data_size = (FT_ULong)( idx->count + 1 ) * offsize;
+
+ if ( FT_NEW_ARRAY( idx->offsets, idx->count + 1 ) ||
+ FT_STREAM_SEEK( idx->start + 3 ) ||
+ FT_FRAME_ENTER( data_size ) )
+ goto Exit;
+
+ poff = idx->offsets;
+ p = (FT_Byte*)stream->cursor;
+ p_end = p + data_size;
+
+ switch ( offsize )
+ {
+ case 1:
+ for ( ; p < p_end; p++, poff++ )
+ poff[0] = p[0];
+ break;
+
+ case 2:
+ for ( ; p < p_end; p += 2, poff++ )
+ poff[0] = FT_PEEK_USHORT( p );
+ break;
+
+ case 3:
+ for ( ; p < p_end; p += 3, poff++ )
+ poff[0] = FT_PEEK_OFF3( p );
+ break;
+
+ default:
+ for ( ; p < p_end; p += 4, poff++ )
+ poff[0] = FT_PEEK_ULONG( p );
+ }
+
+ FT_FRAME_EXIT();
+ }
+
+ Exit:
+ if ( error )
+ FT_FREE( idx->offsets );
+
+ return error;
+ }
+
+
+ /* Allocate a table containing pointers to an index's elements. */
+ /* The `pool' argument makes this function convert the index */
+ /* entries to C-style strings (this is, NULL-terminated). */
+ static FT_Error
+ cff_index_get_pointers( CFF_Index idx,
+ FT_Byte*** table,
+ FT_Byte** pool )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_Memory memory = idx->stream->memory;
+
+ FT_Byte** t = NULL;
+ FT_Byte* new_bytes = NULL;
+
+
+ *table = NULL;
+
+ if ( idx->offsets == NULL )
+ {
+ error = cff_index_load_offsets( idx );
+ if ( error )
+ goto Exit;
+ }
+
+ if ( idx->count > 0 &&
+ !FT_NEW_ARRAY( t, idx->count + 1 ) &&
+ ( !pool || !FT_ALLOC( new_bytes,
+ idx->data_size + idx->count ) ) )
+ {
+ FT_ULong n, cur_offset;
+ FT_ULong extra = 0;
+ FT_Byte* org_bytes = idx->bytes;
+
+
+ /* at this point, `idx->offsets' can't be NULL */
+ cur_offset = idx->offsets[0] - 1;
+
+ /* sanity check */
+ if ( cur_offset >= idx->data_size )
+ {
+ FT_TRACE0(( "cff_index_get_pointers:"
+ " invalid first offset value %d set to zero\n",
+ cur_offset ));
+ cur_offset = 0;
+ }
+
+ if ( !pool )
+ t[0] = org_bytes + cur_offset;
+ else
+ t[0] = new_bytes + cur_offset;
+
+ for ( n = 1; n <= idx->count; n++ )
+ {
+ FT_ULong next_offset = idx->offsets[n] - 1;
+
+
+ /* empty slot + two sanity checks for invalid offset tables */
+ if ( next_offset == 0 ||
+ next_offset < cur_offset ||
+ ( next_offset >= idx->data_size && n < idx->count ) )
+ next_offset = cur_offset;
+
+ if ( !pool )
+ t[n] = org_bytes + next_offset;
+ else
+ {
+ t[n] = new_bytes + next_offset + extra;
+
+ if ( next_offset != cur_offset )
+ {
+ FT_MEM_COPY( t[n - 1], org_bytes + cur_offset, t[n] - t[n - 1] );
+ t[n][0] = '\0';
+ t[n] += 1;
+ extra++;
+ }
+ }
+
+ cur_offset = next_offset;
+ }
+ *table = t;
+
+ if ( pool )
+ *pool = new_bytes;
+ }
+
+ Exit:
+ return error;
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ cff_index_access_element( CFF_Index idx,
+ FT_UInt element,
+ FT_Byte** pbytes,
+ FT_ULong* pbyte_len )
+ {
+ FT_Error error = FT_Err_Ok;
+
+
+ if ( idx && idx->count > element )
+ {
+ /* compute start and end offsets */
+ FT_Stream stream = idx->stream;
+ FT_ULong off1, off2 = 0;
+
+
+ /* load offsets from file or the offset table */
+ if ( !idx->offsets )
+ {
+ FT_ULong pos = element * idx->off_size;
+
+
+ if ( FT_STREAM_SEEK( idx->start + 3 + pos ) )
+ goto Exit;
+
+ off1 = cff_index_read_offset( idx, &error );
+ if ( error )
+ goto Exit;
+
+ if ( off1 != 0 )
+ {
+ do
+ {
+ element++;
+ off2 = cff_index_read_offset( idx, &error );
+ }
+ while ( off2 == 0 && element < idx->count );
+ }
+ }
+ else /* use offsets table */
+ {
+ off1 = idx->offsets[element];
+ if ( off1 )
+ {
+ do
+ {
+ element++;
+ off2 = idx->offsets[element];
+
+ } while ( off2 == 0 && element < idx->count );
+ }
+ }
+
+ /* XXX: should check off2 does not exceed the end of this entry; */
+ /* at present, only truncate off2 at the end of this stream */
+ if ( off2 > stream->size + 1 ||
+ idx->data_offset > stream->size - off2 + 1 )
+ {
+ FT_ERROR(( "cff_index_access_element:"
+ " offset to next entry (%d)"
+ " exceeds the end of stream (%d)\n",
+ off2, stream->size - idx->data_offset + 1 ));
+ off2 = stream->size - idx->data_offset + 1;
+ }
+
+ /* access element */
+ if ( off1 && off2 > off1 )
+ {
+ *pbyte_len = off2 - off1;
+
+ if ( idx->bytes )
+ {
+ /* this index was completely loaded in memory, that's easy */
+ *pbytes = idx->bytes + off1 - 1;
+ }
+ else
+ {
+ /* this index is still on disk/file, access it through a frame */
+ if ( FT_STREAM_SEEK( idx->data_offset + off1 - 1 ) ||
+ FT_FRAME_EXTRACT( off2 - off1, *pbytes ) )
+ goto Exit;
+ }
+ }
+ else
+ {
+ /* empty index element */
+ *pbytes = 0;
+ *pbyte_len = 0;
+ }
+ }
+ else
+ error = FT_THROW( Invalid_Argument );
+
+ Exit:
+ return error;
+ }
+
+
+ FT_LOCAL_DEF( void )
+ cff_index_forget_element( CFF_Index idx,
+ FT_Byte** pbytes )
+ {
+ if ( idx->bytes == 0 )
+ {
+ FT_Stream stream = idx->stream;
+
+
+ FT_FRAME_RELEASE( *pbytes );
+ }
+ }
+
+
+ /* get an entry from Name INDEX */
+ FT_LOCAL_DEF( FT_String* )
+ cff_index_get_name( CFF_Font font,
+ FT_UInt element )
+ {
+ CFF_Index idx = &font->name_index;
+ FT_Memory memory = idx->stream->memory;
+ FT_Byte* bytes;
+ FT_ULong byte_len;
+ FT_Error error;
+ FT_String* name = 0;
+
+
+ error = cff_index_access_element( idx, element, &bytes, &byte_len );
+ if ( error )
+ goto Exit;
+
+ if ( !FT_ALLOC( name, byte_len + 1 ) )
+ {
+ FT_MEM_COPY( name, bytes, byte_len );
+ name[byte_len] = 0;
+ }
+ cff_index_forget_element( idx, &bytes );
+
+ Exit:
+ return name;
+ }
+
+
+ /* get an entry from String INDEX */
+ FT_LOCAL_DEF( FT_String* )
+ cff_index_get_string( CFF_Font font,
+ FT_UInt element )
+ {
+ return ( element < font->num_strings )
+ ? (FT_String*)font->strings[element]
+ : NULL;
+ }
+
+
+ FT_LOCAL_DEF( FT_String* )
+ cff_index_get_sid_string( CFF_Font font,
+ FT_UInt sid )
+ {
+ /* value 0xFFFFU indicates a missing dictionary entry */
+ if ( sid == 0xFFFFU )
+ return NULL;
+
+ /* if it is not a standard string, return it */
+ if ( sid > 390 )
+ return cff_index_get_string( font, sid - 391 );
+
+ /* CID-keyed CFF fonts don't have glyph names */
+ if ( !font->psnames )
+ return NULL;
+
+ /* this is a standard string */
+ return (FT_String *)font->psnames->adobe_std_strings( sid );
+ }
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*** ***/
+ /*** FD Select table support ***/
+ /*** ***/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ static void
+ CFF_Done_FD_Select( CFF_FDSelect fdselect,
+ FT_Stream stream )
+ {
+ if ( fdselect->data )
+ FT_FRAME_RELEASE( fdselect->data );
+
+ fdselect->data_size = 0;
+ fdselect->format = 0;
+ fdselect->range_count = 0;
+ }
+
+
+ static FT_Error
+ CFF_Load_FD_Select( CFF_FDSelect fdselect,
+ FT_UInt num_glyphs,
+ FT_Stream stream,
+ FT_ULong offset )
+ {
+ FT_Error error;
+ FT_Byte format;
+ FT_UInt num_ranges;
+
+
+ /* read format */
+ if ( FT_STREAM_SEEK( offset ) || FT_READ_BYTE( format ) )
+ goto Exit;
+
+ fdselect->format = format;
+ fdselect->cache_count = 0; /* clear cache */
+
+ switch ( format )
+ {
+ case 0: /* format 0, that's simple */
+ fdselect->data_size = num_glyphs;
+ goto Load_Data;
+
+ case 3: /* format 3, a tad more complex */
+ if ( FT_READ_USHORT( num_ranges ) )
+ goto Exit;
+
+ fdselect->data_size = num_ranges * 3 + 2;
+
+ Load_Data:
+ if ( FT_FRAME_EXTRACT( fdselect->data_size, fdselect->data ) )
+ goto Exit;
+ break;
+
+ default: /* hmm... that's wrong */
+ error = FT_THROW( Invalid_File_Format );
+ }
+
+ Exit:
+ return error;
+ }
+
+
+ FT_LOCAL_DEF( FT_Byte )
+ cff_fd_select_get( CFF_FDSelect fdselect,
+ FT_UInt glyph_index )
+ {
+ FT_Byte fd = 0;
+
+
+ switch ( fdselect->format )
+ {
+ case 0:
+ fd = fdselect->data[glyph_index];
+ break;
+
+ case 3:
+ /* first, compare to cache */
+ if ( (FT_UInt)( glyph_index - fdselect->cache_first ) <
+ fdselect->cache_count )
+ {
+ fd = fdselect->cache_fd;
+ break;
+ }
+
+ /* then, lookup the ranges array */
+ {
+ FT_Byte* p = fdselect->data;
+ FT_Byte* p_limit = p + fdselect->data_size;
+ FT_Byte fd2;
+ FT_UInt first, limit;
+
+
+ first = FT_NEXT_USHORT( p );
+ do
+ {
+ if ( glyph_index < first )
+ break;
+
+ fd2 = *p++;
+ limit = FT_NEXT_USHORT( p );
+
+ if ( glyph_index < limit )
+ {
+ fd = fd2;
+
+ /* update cache */
+ fdselect->cache_first = first;
+ fdselect->cache_count = limit-first;
+ fdselect->cache_fd = fd2;
+ break;
+ }
+ first = limit;
+
+ } while ( p < p_limit );
+ }
+ break;
+
+ default:
+ ;
+ }
+
+ return fd;
+ }
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*** ***/
+ /*** CFF font support ***/
+ /*** ***/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ static FT_Error
+ cff_charset_compute_cids( CFF_Charset charset,
+ FT_UInt num_glyphs,
+ FT_Memory memory )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_UInt i;
+ FT_Long j;
+ FT_UShort max_cid = 0;
+
+
+ if ( charset->max_cid > 0 )
+ goto Exit;
+
+ for ( i = 0; i < num_glyphs; i++ )
+ {
+ if ( charset->sids[i] > max_cid )
+ max_cid = charset->sids[i];
+ }
+
+ if ( FT_NEW_ARRAY( charset->cids, (FT_ULong)max_cid + 1 ) )
+ goto Exit;
+
+ /* When multiple GIDs map to the same CID, we choose the lowest */
+ /* GID. This is not described in any spec, but it matches the */
+ /* behaviour of recent Acroread versions. */
+ for ( j = num_glyphs - 1; j >= 0 ; j-- )
+ charset->cids[charset->sids[j]] = (FT_UShort)j;
+
+ charset->max_cid = max_cid;
+ charset->num_glyphs = num_glyphs;
+
+ Exit:
+ return error;
+ }
+
+
+ FT_LOCAL_DEF( FT_UInt )
+ cff_charset_cid_to_gindex( CFF_Charset charset,
+ FT_UInt cid )
+ {
+ FT_UInt result = 0;
+
+
+ if ( cid <= charset->max_cid )
+ result = charset->cids[cid];
+
+ return result;
+ }
+
+
+ static void
+ cff_charset_free_cids( CFF_Charset charset,
+ FT_Memory memory )
+ {
+ FT_FREE( charset->cids );
+ charset->max_cid = 0;
+ }
+
+
+ static void
+ cff_charset_done( CFF_Charset charset,
+ FT_Stream stream )
+ {
+ FT_Memory memory = stream->memory;
+
+
+ cff_charset_free_cids( charset, memory );
+
+ FT_FREE( charset->sids );
+ charset->format = 0;
+ charset->offset = 0;
+ }
+
+
+ static FT_Error
+ cff_charset_load( CFF_Charset charset,
+ FT_UInt num_glyphs,
+ FT_Stream stream,
+ FT_ULong base_offset,
+ FT_ULong offset,
+ FT_Bool invert )
+ {
+ FT_Memory memory = stream->memory;
+ FT_Error error = FT_Err_Ok;
+ FT_UShort glyph_sid;
+
+
+ /* If the the offset is greater than 2, we have to parse the */
+ /* charset table. */
+ if ( offset > 2 )
+ {
+ FT_UInt j;
+
+
+ charset->offset = base_offset + offset;
+
+ /* Get the format of the table. */
+ if ( FT_STREAM_SEEK( charset->offset ) ||
+ FT_READ_BYTE( charset->format ) )
+ goto Exit;
+
+ /* Allocate memory for sids. */
+ if ( FT_NEW_ARRAY( charset->sids, num_glyphs ) )
+ goto Exit;
+
+ /* assign the .notdef glyph */
+ charset->sids[0] = 0;
+
+ switch ( charset->format )
+ {
+ case 0:
+ if ( num_glyphs > 0 )
+ {
+ if ( FT_FRAME_ENTER( ( num_glyphs - 1 ) * 2 ) )
+ goto Exit;
+
+ for ( j = 1; j < num_glyphs; j++ )
+ charset->sids[j] = FT_GET_USHORT();
+
+ FT_FRAME_EXIT();
+ }
+ break;
+
+ case 1:
+ case 2:
+ {
+ FT_UInt nleft;
+ FT_UInt i;
+
+
+ j = 1;
+
+ while ( j < num_glyphs )
+ {
+ /* Read the first glyph sid of the range. */
+ if ( FT_READ_USHORT( glyph_sid ) )
+ goto Exit;
+
+ /* Read the number of glyphs in the range. */
+ if ( charset->format == 2 )
+ {
+ if ( FT_READ_USHORT( nleft ) )
+ goto Exit;
+ }
+ else
+ {
+ if ( FT_READ_BYTE( nleft ) )
+ goto Exit;
+ }
+
+ /* try to rescue some of the SIDs if `nleft' is too large */
+ if ( glyph_sid > 0xFFFFL - nleft )
+ {
+ FT_ERROR(( "cff_charset_load: invalid SID range trimmed"
+ " nleft=%d -> %d\n", nleft, 0xFFFFL - glyph_sid ));
+ nleft = ( FT_UInt )( 0xFFFFL - glyph_sid );
+ }
+
+ /* Fill in the range of sids -- `nleft + 1' glyphs. */
+ for ( i = 0; j < num_glyphs && i <= nleft; i++, j++, glyph_sid++ )
+ charset->sids[j] = glyph_sid;
+ }
+ }
+ break;
+
+ default:
+ FT_ERROR(( "cff_charset_load: invalid table format\n" ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+ }
+ else
+ {
+ /* Parse default tables corresponding to offset == 0, 1, or 2. */
+ /* CFF specification intimates the following: */
+ /* */
+ /* In order to use a predefined charset, the following must be */
+ /* true: The charset constructed for the glyphs in the font's */
+ /* charstrings dictionary must match the predefined charset in */
+ /* the first num_glyphs. */
+
+ charset->offset = offset; /* record charset type */
+
+ switch ( (FT_UInt)offset )
+ {
+ case 0:
+ if ( num_glyphs > 229 )
+ {
+ FT_ERROR(( "cff_charset_load: implicit charset larger than\n"
+ "predefined charset (Adobe ISO-Latin)\n" ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+ /* Allocate memory for sids. */
+ if ( FT_NEW_ARRAY( charset->sids, num_glyphs ) )
+ goto Exit;
+
+ /* Copy the predefined charset into the allocated memory. */
+ FT_ARRAY_COPY( charset->sids, cff_isoadobe_charset, num_glyphs );
+
+ break;
+
+ case 1:
+ if ( num_glyphs > 166 )
+ {
+ FT_ERROR(( "cff_charset_load: implicit charset larger than\n"
+ "predefined charset (Adobe Expert)\n" ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+ /* Allocate memory for sids. */
+ if ( FT_NEW_ARRAY( charset->sids, num_glyphs ) )
+ goto Exit;
+
+ /* Copy the predefined charset into the allocated memory. */
+ FT_ARRAY_COPY( charset->sids, cff_expert_charset, num_glyphs );
+
+ break;
+
+ case 2:
+ if ( num_glyphs > 87 )
+ {
+ FT_ERROR(( "cff_charset_load: implicit charset larger than\n"
+ "predefined charset (Adobe Expert Subset)\n" ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+ /* Allocate memory for sids. */
+ if ( FT_NEW_ARRAY( charset->sids, num_glyphs ) )
+ goto Exit;
+
+ /* Copy the predefined charset into the allocated memory. */
+ FT_ARRAY_COPY( charset->sids, cff_expertsubset_charset, num_glyphs );
+
+ break;
+
+ default:
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+ }
+
+ /* we have to invert the `sids' array for subsetted CID-keyed fonts */
+ if ( invert )
+ error = cff_charset_compute_cids( charset, num_glyphs, memory );
+
+ Exit:
+ /* Clean up if there was an error. */
+ if ( error )
+ {
+ FT_FREE( charset->sids );
+ FT_FREE( charset->cids );
+ charset->format = 0;
+ charset->offset = 0;
+ charset->sids = 0;
+ }
+
+ return error;
+ }
+
+
+ static void
+ cff_encoding_done( CFF_Encoding encoding )
+ {
+ encoding->format = 0;
+ encoding->offset = 0;
+ encoding->count = 0;
+ }
+
+
+ static FT_Error
+ cff_encoding_load( CFF_Encoding encoding,
+ CFF_Charset charset,
+ FT_UInt num_glyphs,
+ FT_Stream stream,
+ FT_ULong base_offset,
+ FT_ULong offset )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_UInt count;
+ FT_UInt j;
+ FT_UShort glyph_sid;
+ FT_UInt glyph_code;
+
+
+ /* Check for charset->sids. If we do not have this, we fail. */
+ if ( !charset->sids )
+ {
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+ /* Zero out the code to gid/sid mappings. */
+ for ( j = 0; j < 256; j++ )
+ {
+ encoding->sids [j] = 0;
+ encoding->codes[j] = 0;
+ }
+
+ /* Note: The encoding table in a CFF font is indexed by glyph index; */
+ /* the first encoded glyph index is 1. Hence, we read the character */
+ /* code (`glyph_code') at index j and make the assignment: */
+ /* */
+ /* encoding->codes[glyph_code] = j + 1 */
+ /* */
+ /* We also make the assignment: */
+ /* */
+ /* encoding->sids[glyph_code] = charset->sids[j + 1] */
+ /* */
+ /* This gives us both a code to GID and a code to SID mapping. */
+
+ if ( offset > 1 )
+ {
+ encoding->offset = base_offset + offset;
+
+ /* we need to parse the table to determine its size */
+ if ( FT_STREAM_SEEK( encoding->offset ) ||
+ FT_READ_BYTE( encoding->format ) ||
+ FT_READ_BYTE( count ) )
+ goto Exit;
+
+ switch ( encoding->format & 0x7F )
+ {
+ case 0:
+ {
+ FT_Byte* p;
+
+
+ /* By convention, GID 0 is always ".notdef" and is never */
+ /* coded in the font. Hence, the number of codes found */
+ /* in the table is `count+1'. */
+ /* */
+ encoding->count = count + 1;
+
+ if ( FT_FRAME_ENTER( count ) )
+ goto Exit;
+
+ p = (FT_Byte*)stream->cursor;
+
+ for ( j = 1; j <= count; j++ )
+ {
+ glyph_code = *p++;
+
+ /* Make sure j is not too big. */
+ if ( j < num_glyphs )
+ {
+ /* Assign code to GID mapping. */
+ encoding->codes[glyph_code] = (FT_UShort)j;
+
+ /* Assign code to SID mapping. */
+ encoding->sids[glyph_code] = charset->sids[j];
+ }
+ }
+
+ FT_FRAME_EXIT();
+ }
+ break;
+
+ case 1:
+ {
+ FT_UInt nleft;
+ FT_UInt i = 1;
+ FT_UInt k;
+
+
+ encoding->count = 0;
+
+ /* Parse the Format1 ranges. */
+ for ( j = 0; j < count; j++, i += nleft )
+ {
+ /* Read the first glyph code of the range. */
+ if ( FT_READ_BYTE( glyph_code ) )
+ goto Exit;
+
+ /* Read the number of codes in the range. */
+ if ( FT_READ_BYTE( nleft ) )
+ goto Exit;
+
+ /* Increment nleft, so we read `nleft + 1' codes/sids. */
+ nleft++;
+
+ /* compute max number of character codes */
+ if ( (FT_UInt)nleft > encoding->count )
+ encoding->count = nleft;
+
+ /* Fill in the range of codes/sids. */
+ for ( k = i; k < nleft + i; k++, glyph_code++ )
+ {
+ /* Make sure k is not too big. */
+ if ( k < num_glyphs && glyph_code < 256 )
+ {
+ /* Assign code to GID mapping. */
+ encoding->codes[glyph_code] = (FT_UShort)k;
+
+ /* Assign code to SID mapping. */
+ encoding->sids[glyph_code] = charset->sids[k];
+ }
+ }
+ }
+
+ /* simple check; one never knows what can be found in a font */
+ if ( encoding->count > 256 )
+ encoding->count = 256;
+ }
+ break;
+
+ default:
+ FT_ERROR(( "cff_encoding_load: invalid table format\n" ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+ /* Parse supplemental encodings, if any. */
+ if ( encoding->format & 0x80 )
+ {
+ FT_UInt gindex;
+
+
+ /* count supplements */
+ if ( FT_READ_BYTE( count ) )
+ goto Exit;
+
+ for ( j = 0; j < count; j++ )
+ {
+ /* Read supplemental glyph code. */
+ if ( FT_READ_BYTE( glyph_code ) )
+ goto Exit;
+
+ /* Read the SID associated with this glyph code. */
+ if ( FT_READ_USHORT( glyph_sid ) )
+ goto Exit;
+
+ /* Assign code to SID mapping. */
+ encoding->sids[glyph_code] = glyph_sid;
+
+ /* First, look up GID which has been assigned to */
+ /* SID glyph_sid. */
+ for ( gindex = 0; gindex < num_glyphs; gindex++ )
+ {
+ if ( charset->sids[gindex] == glyph_sid )
+ {
+ encoding->codes[glyph_code] = (FT_UShort)gindex;
+ break;
+ }
+ }
+ }
+ }
+ }
+ else
+ {
+ /* We take into account the fact a CFF font can use a predefined */
+ /* encoding without containing all of the glyphs encoded by this */
+ /* encoding (see the note at the end of section 12 in the CFF */
+ /* specification). */
+
+ switch ( (FT_UInt)offset )
+ {
+ case 0:
+ /* First, copy the code to SID mapping. */
+ FT_ARRAY_COPY( encoding->sids, cff_standard_encoding, 256 );
+ goto Populate;
+
+ case 1:
+ /* First, copy the code to SID mapping. */
+ FT_ARRAY_COPY( encoding->sids, cff_expert_encoding, 256 );
+
+ Populate:
+ /* Construct code to GID mapping from code to SID mapping */
+ /* and charset. */
+
+ encoding->count = 0;
+
+ error = cff_charset_compute_cids( charset, num_glyphs,
+ stream->memory );
+ if ( error )
+ goto Exit;
+
+ for ( j = 0; j < 256; j++ )
+ {
+ FT_UInt sid = encoding->sids[j];
+ FT_UInt gid = 0;
+
+
+ if ( sid )
+ gid = cff_charset_cid_to_gindex( charset, sid );
+
+ if ( gid != 0 )
+ {
+ encoding->codes[j] = (FT_UShort)gid;
+ encoding->count = j + 1;
+ }
+ else
+ {
+ encoding->codes[j] = 0;
+ encoding->sids [j] = 0;
+ }
+ }
+ break;
+
+ default:
+ FT_ERROR(( "cff_encoding_load: invalid table format\n" ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+ }
+
+ Exit:
+
+ /* Clean up if there was an error. */
+ return error;
+ }
+
+
+ static FT_Error
+ cff_subfont_load( CFF_SubFont font,
+ CFF_Index idx,
+ FT_UInt font_index,
+ FT_Stream stream,
+ FT_ULong base_offset,
+ FT_Library library )
+ {
+ FT_Error error;
+ CFF_ParserRec parser;
+ FT_Byte* dict = NULL;
+ FT_ULong dict_len;
+ CFF_FontRecDict top = &font->font_dict;
+ CFF_Private priv = &font->private_dict;
+
+
+ cff_parser_init( &parser, CFF_CODE_TOPDICT, &font->font_dict, library );
+
+ /* set defaults */
+ FT_MEM_ZERO( top, sizeof ( *top ) );
+
+ top->underline_position = -( 100L << 16 );
+ top->underline_thickness = 50L << 16;
+ top->charstring_type = 2;
+ top->font_matrix.xx = 0x10000L;
+ top->font_matrix.yy = 0x10000L;
+ top->cid_count = 8720;
+
+ /* we use the implementation specific SID value 0xFFFF to indicate */
+ /* missing entries */
+ top->version = 0xFFFFU;
+ top->notice = 0xFFFFU;
+ top->copyright = 0xFFFFU;
+ top->full_name = 0xFFFFU;
+ top->family_name = 0xFFFFU;
+ top->weight = 0xFFFFU;
+ top->embedded_postscript = 0xFFFFU;
+
+ top->cid_registry = 0xFFFFU;
+ top->cid_ordering = 0xFFFFU;
+ top->cid_font_name = 0xFFFFU;
+
+ error = cff_index_access_element( idx, font_index, &dict, &dict_len );
+ if ( !error )
+ {
+ FT_TRACE4(( " top dictionary:\n" ));
+ error = cff_parser_run( &parser, dict, dict + dict_len );
+ }
+
+ cff_index_forget_element( idx, &dict );
+
+ if ( error )
+ goto Exit;
+
+ /* if it is a CID font, we stop there */
+ if ( top->cid_registry != 0xFFFFU )
+ goto Exit;
+
+ /* parse the private dictionary, if any */
+ if ( top->private_offset && top->private_size )
+ {
+ /* set defaults */
+ FT_MEM_ZERO( priv, sizeof ( *priv ) );
+
+ priv->blue_shift = 7;
+ priv->blue_fuzz = 1;
+ priv->lenIV = -1;
+ priv->expansion_factor = (FT_Fixed)( 0.06 * 0x10000L );
+ priv->blue_scale = (FT_Fixed)( 0.039625 * 0x10000L * 1000 );
+
+ cff_parser_init( &parser, CFF_CODE_PRIVATE, priv, library );
+
+ if ( FT_STREAM_SEEK( base_offset + font->font_dict.private_offset ) ||
+ FT_FRAME_ENTER( font->font_dict.private_size ) )
+ goto Exit;
+
+ FT_TRACE4(( " private dictionary:\n" ));
+ error = cff_parser_run( &parser,
+ (FT_Byte*)stream->cursor,
+ (FT_Byte*)stream->limit );
+ FT_FRAME_EXIT();
+ if ( error )
+ goto Exit;
+
+ /* ensure that `num_blue_values' is even */
+ priv->num_blue_values &= ~1;
+ }
+
+ /* read the local subrs, if any */
+ if ( priv->local_subrs_offset )
+ {
+ if ( FT_STREAM_SEEK( base_offset + top->private_offset +
+ priv->local_subrs_offset ) )
+ goto Exit;
+
+ error = cff_index_init( &font->local_subrs_index, stream, 1 );
+ if ( error )
+ goto Exit;
+
+ error = cff_index_get_pointers( &font->local_subrs_index,
+ &font->local_subrs, NULL );
+ if ( error )
+ goto Exit;
+ }
+
+ Exit:
+ return error;
+ }
+
+
+ static void
+ cff_subfont_done( FT_Memory memory,
+ CFF_SubFont subfont )
+ {
+ if ( subfont )
+ {
+ cff_index_done( &subfont->local_subrs_index );
+ FT_FREE( subfont->local_subrs );
+ }
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ cff_font_load( FT_Library library,
+ FT_Stream stream,
+ FT_Int face_index,
+ CFF_Font font,
+ FT_Bool pure_cff )
+ {
+ static const FT_Frame_Field cff_header_fields[] =
+ {
+#undef FT_STRUCTURE
+#define FT_STRUCTURE CFF_FontRec
+
+ FT_FRAME_START( 4 ),
+ FT_FRAME_BYTE( version_major ),
+ FT_FRAME_BYTE( version_minor ),
+ FT_FRAME_BYTE( header_size ),
+ FT_FRAME_BYTE( absolute_offsize ),
+ FT_FRAME_END
+ };
+
+ FT_Error error;
+ FT_Memory memory = stream->memory;
+ FT_ULong base_offset;
+ CFF_FontRecDict dict;
+ CFF_IndexRec string_index;
+ FT_Int subfont_index;
+
+
+ FT_ZERO( font );
+ FT_ZERO( &string_index );
+
+ font->stream = stream;
+ font->memory = memory;
+ dict = &font->top_font.font_dict;
+ base_offset = FT_STREAM_POS();
+
+ /* read CFF font header */
+ if ( FT_STREAM_READ_FIELDS( cff_header_fields, font ) )
+ goto Exit;
+
+ /* check format */
+ if ( font->version_major != 1 ||
+ font->header_size < 4 ||
+ font->absolute_offsize > 4 )
+ {
+ FT_TRACE2(( " not a CFF font header\n" ));
+ error = FT_THROW( Unknown_File_Format );
+ goto Exit;
+ }
+
+ /* skip the rest of the header */
+ if ( FT_STREAM_SKIP( font->header_size - 4 ) )
+ goto Exit;
+
+ /* read the name, top dict, string and global subrs index */
+ if ( FT_SET_ERROR( cff_index_init( &font->name_index,
+ stream, 0 ) ) ||
+ FT_SET_ERROR( cff_index_init( &font->font_dict_index,
+ stream, 0 ) ) ||
+ FT_SET_ERROR( cff_index_init( &string_index,
+ stream, 1 ) ) ||
+ FT_SET_ERROR( cff_index_init( &font->global_subrs_index,
+ stream, 1 ) ) ||
+ FT_SET_ERROR( cff_index_get_pointers( &string_index,
+ &font->strings,
+ &font->string_pool ) ) )
+ goto Exit;
+
+ font->num_strings = string_index.count;
+
+ if ( pure_cff )
+ {
+ /* well, we don't really forget the `disabled' fonts... */
+ subfont_index = face_index;
+
+ if ( subfont_index >= (FT_Int)font->name_index.count )
+ {
+ FT_ERROR(( "cff_font_load:"
+ " invalid subfont index for pure CFF font (%d)\n",
+ subfont_index ));
+ error = FT_THROW( Invalid_Argument );
+ goto Exit;
+ }
+
+ font->num_faces = font->name_index.count;
+ }
+ else
+ {
+ subfont_index = 0;
+
+ if ( font->name_index.count > 1 )
+ {
+ FT_ERROR(( "cff_font_load:"
+ " invalid CFF font with multiple subfonts\n"
+ " "
+ " in SFNT wrapper\n" ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+ }
+
+ /* in case of a font format check, simply exit now */
+ if ( face_index < 0 )
+ goto Exit;
+
+ /* now, parse the top-level font dictionary */
+ FT_TRACE4(( "parsing top-level\n" ));
+ error = cff_subfont_load( &font->top_font,
+ &font->font_dict_index,
+ subfont_index,
+ stream,
+ base_offset,
+ library );
+ if ( error )
+ goto Exit;
+
+ if ( FT_STREAM_SEEK( base_offset + dict->charstrings_offset ) )
+ goto Exit;
+
+ error = cff_index_init( &font->charstrings_index, stream, 0 );
+ if ( error )
+ goto Exit;
+
+ /* now, check for a CID font */
+ if ( dict->cid_registry != 0xFFFFU )
+ {
+ CFF_IndexRec fd_index;
+ CFF_SubFont sub = NULL;
+ FT_UInt idx;
+
+
+ /* this is a CID-keyed font, we must now allocate a table of */
+ /* sub-fonts, then load each of them separately */
+ if ( FT_STREAM_SEEK( base_offset + dict->cid_fd_array_offset ) )
+ goto Exit;
+
+ error = cff_index_init( &fd_index, stream, 0 );
+ if ( error )
+ goto Exit;
+
+ if ( fd_index.count > CFF_MAX_CID_FONTS )
+ {
+ FT_TRACE0(( "cff_font_load: FD array too large in CID font\n" ));
+ goto Fail_CID;
+ }
+
+ /* allocate & read each font dict independently */
+ font->num_subfonts = fd_index.count;
+ if ( FT_NEW_ARRAY( sub, fd_index.count ) )
+ goto Fail_CID;
+
+ /* set up pointer table */
+ for ( idx = 0; idx < fd_index.count; idx++ )
+ font->subfonts[idx] = sub + idx;
+
+ /* now load each subfont independently */
+ for ( idx = 0; idx < fd_index.count; idx++ )
+ {
+ sub = font->subfonts[idx];
+ FT_TRACE4(( "parsing subfont %u\n", idx ));
+ error = cff_subfont_load( sub, &fd_index, idx,
+ stream, base_offset, library );
+ if ( error )
+ goto Fail_CID;
+ }
+
+ /* now load the FD Select array */
+ error = CFF_Load_FD_Select( &font->fd_select,
+ font->charstrings_index.count,
+ stream,
+ base_offset + dict->cid_fd_select_offset );
+
+ Fail_CID:
+ cff_index_done( &fd_index );
+
+ if ( error )
+ goto Exit;
+ }
+ else
+ font->num_subfonts = 0;
+
+ /* read the charstrings index now */
+ if ( dict->charstrings_offset == 0 )
+ {
+ FT_ERROR(( "cff_font_load: no charstrings offset\n" ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+ font->num_glyphs = font->charstrings_index.count;
+
+ error = cff_index_get_pointers( &font->global_subrs_index,
+ &font->global_subrs, NULL );
+
+ if ( error )
+ goto Exit;
+
+ /* read the Charset and Encoding tables if available */
+ if ( font->num_glyphs > 0 )
+ {
+ FT_Bool invert = FT_BOOL( dict->cid_registry != 0xFFFFU && pure_cff );
+
+
+ error = cff_charset_load( &font->charset, font->num_glyphs, stream,
+ base_offset, dict->charset_offset, invert );
+ if ( error )
+ goto Exit;
+
+ /* CID-keyed CFFs don't have an encoding */
+ if ( dict->cid_registry == 0xFFFFU )
+ {
+ error = cff_encoding_load( &font->encoding,
+ &font->charset,
+ font->num_glyphs,
+ stream,
+ base_offset,
+ dict->encoding_offset );
+ if ( error )
+ goto Exit;
+ }
+ }
+
+ /* get the font name (/CIDFontName for CID-keyed fonts, */
+ /* /FontName otherwise) */
+ font->font_name = cff_index_get_name( font, subfont_index );
+
+ Exit:
+ cff_index_done( &string_index );
+
+ return error;
+ }
+
+
+ FT_LOCAL_DEF( void )
+ cff_font_done( CFF_Font font )
+ {
+ FT_Memory memory = font->memory;
+ FT_UInt idx;
+
+
+ cff_index_done( &font->global_subrs_index );
+ cff_index_done( &font->font_dict_index );
+ cff_index_done( &font->name_index );
+ cff_index_done( &font->charstrings_index );
+
+ /* release font dictionaries, but only if working with */
+ /* a CID keyed CFF font */
+ if ( font->num_subfonts > 0 )
+ {
+ for ( idx = 0; idx < font->num_subfonts; idx++ )
+ cff_subfont_done( memory, font->subfonts[idx] );
+
+ /* the subfonts array has been allocated as a single block */
+ FT_FREE( font->subfonts[0] );
+ }
+
+ cff_encoding_done( &font->encoding );
+ cff_charset_done( &font->charset, font->stream );
+
+ cff_subfont_done( memory, &font->top_font );
+
+ CFF_Done_FD_Select( &font->fd_select, font->stream );
+
+ FT_FREE( font->font_info );
+
+ FT_FREE( font->font_name );
+ FT_FREE( font->global_subrs );
+ FT_FREE( font->strings );
+ FT_FREE( font->string_pool );
+
+ if ( font->cf2_instance.finalizer )
+ {
+ font->cf2_instance.finalizer( font->cf2_instance.data );
+ FT_FREE( font->cf2_instance.data );
+ }
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffload.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffload.h
new file mode 100644
index 0000000000..50d8017250
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffload.h
@@ -0,0 +1,83 @@
+/***************************************************************************/
+/* */
+/* cffload.h */
+/* */
+/* OpenType & CFF data/program tables loader (specification). */
+/* */
+/* Copyright 1996-2001, 2002, 2003, 2007, 2008, 2010 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __CFFLOAD_H__
+#define __CFFLOAD_H__
+
+
+#include "../../include/ft2build.h"
+#include "cfftypes.h"
+
+
+FT_BEGIN_HEADER
+
+ FT_LOCAL( FT_UShort )
+ cff_get_standard_encoding( FT_UInt charcode );
+
+
+ FT_LOCAL( FT_String* )
+ cff_index_get_string( CFF_Font font,
+ FT_UInt element );
+
+ FT_LOCAL( FT_String* )
+ cff_index_get_sid_string( CFF_Font font,
+ FT_UInt sid );
+
+
+ FT_LOCAL( FT_Error )
+ cff_index_access_element( CFF_Index idx,
+ FT_UInt element,
+ FT_Byte** pbytes,
+ FT_ULong* pbyte_len );
+
+ FT_LOCAL( void )
+ cff_index_forget_element( CFF_Index idx,
+ FT_Byte** pbytes );
+
+ FT_LOCAL( FT_String* )
+ cff_index_get_name( CFF_Font font,
+ FT_UInt element );
+
+
+ FT_LOCAL( FT_UInt )
+ cff_charset_cid_to_gindex( CFF_Charset charset,
+ FT_UInt cid );
+
+
+ FT_LOCAL( FT_Error )
+ cff_font_load( FT_Library library,
+ FT_Stream stream,
+ FT_Int face_index,
+ CFF_Font font,
+ FT_Bool pure_cff );
+
+ FT_LOCAL( void )
+ cff_font_done( CFF_Font font );
+
+
+ FT_LOCAL( FT_Byte )
+ cff_fd_select_get( CFF_FDSelect fdselect,
+ FT_UInt glyph_index );
+
+
+FT_END_HEADER
+
+#endif /* __CFFLOAD_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffobjs.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffobjs.c
new file mode 100644
index 0000000000..b0ec7423b8
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffobjs.c
@@ -0,0 +1,1082 @@
+/***************************************************************************/
+/* */
+/* cffobjs.c */
+/* */
+/* OpenType objects manager (body). */
+/* */
+/* Copyright 1996-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftcalc.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/fterrors.h"
+#include "../../include/freetype/ttnameid.h"
+#include "../../include/freetype/tttags.h"
+#include "../../include/freetype/internal/sfnt.h"
+#include "../../include/freetype/ftcffdrv.h"
+
+#include "cffobjs.h"
+#include "cffload.h"
+#include "cffcmap.h"
+#include "cffpic.h"
+
+#include "cfferrs.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_cffobjs
+
+
+ /*************************************************************************/
+ /* */
+ /* SIZE FUNCTIONS */
+ /* */
+ /* Note that we store the global hints in the size's `internal' root */
+ /* field. */
+ /* */
+ /*************************************************************************/
+
+
+ static PSH_Globals_Funcs
+ cff_size_get_globals_funcs( CFF_Size size )
+ {
+ CFF_Face face = (CFF_Face)size->root.face;
+ CFF_Font font = (CFF_Font)face->extra.data;
+ PSHinter_Service pshinter = font->pshinter;
+ FT_Module module;
+
+
+ module = FT_Get_Module( size->root.face->driver->root.library,
+ "pshinter" );
+ return ( module && pshinter && pshinter->get_globals_funcs )
+ ? pshinter->get_globals_funcs( module )
+ : 0;
+ }
+
+
+ FT_LOCAL_DEF( void )
+ cff_size_done( FT_Size cffsize ) /* CFF_Size */
+ {
+ CFF_Size size = (CFF_Size)cffsize;
+ CFF_Face face = (CFF_Face)size->root.face;
+ CFF_Font font = (CFF_Font)face->extra.data;
+ CFF_Internal internal = (CFF_Internal)cffsize->internal;
+
+
+ if ( internal )
+ {
+ PSH_Globals_Funcs funcs;
+
+
+ funcs = cff_size_get_globals_funcs( size );
+ if ( funcs )
+ {
+ FT_UInt i;
+
+
+ funcs->destroy( internal->topfont );
+
+ for ( i = font->num_subfonts; i > 0; i-- )
+ funcs->destroy( internal->subfonts[i - 1] );
+ }
+
+ /* `internal' is freed by destroy_size (in ftobjs.c) */
+ }
+ }
+
+
+ /* CFF and Type 1 private dictionaries have slightly different */
+ /* structures; we need to synthesize a Type 1 dictionary on the fly */
+
+ static void
+ cff_make_private_dict( CFF_SubFont subfont,
+ PS_Private priv )
+ {
+ CFF_Private cpriv = &subfont->private_dict;
+ FT_UInt n, count;
+
+
+ FT_MEM_ZERO( priv, sizeof ( *priv ) );
+
+ count = priv->num_blue_values = cpriv->num_blue_values;
+ for ( n = 0; n < count; n++ )
+ priv->blue_values[n] = (FT_Short)cpriv->blue_values[n];
+
+ count = priv->num_other_blues = cpriv->num_other_blues;
+ for ( n = 0; n < count; n++ )
+ priv->other_blues[n] = (FT_Short)cpriv->other_blues[n];
+
+ count = priv->num_family_blues = cpriv->num_family_blues;
+ for ( n = 0; n < count; n++ )
+ priv->family_blues[n] = (FT_Short)cpriv->family_blues[n];
+
+ count = priv->num_family_other_blues = cpriv->num_family_other_blues;
+ for ( n = 0; n < count; n++ )
+ priv->family_other_blues[n] = (FT_Short)cpriv->family_other_blues[n];
+
+ priv->blue_scale = cpriv->blue_scale;
+ priv->blue_shift = (FT_Int)cpriv->blue_shift;
+ priv->blue_fuzz = (FT_Int)cpriv->blue_fuzz;
+
+ priv->standard_width[0] = (FT_UShort)cpriv->standard_width;
+ priv->standard_height[0] = (FT_UShort)cpriv->standard_height;
+
+ count = priv->num_snap_widths = cpriv->num_snap_widths;
+ for ( n = 0; n < count; n++ )
+ priv->snap_widths[n] = (FT_Short)cpriv->snap_widths[n];
+
+ count = priv->num_snap_heights = cpriv->num_snap_heights;
+ for ( n = 0; n < count; n++ )
+ priv->snap_heights[n] = (FT_Short)cpriv->snap_heights[n];
+
+ priv->force_bold = cpriv->force_bold;
+ priv->language_group = cpriv->language_group;
+ priv->lenIV = cpriv->lenIV;
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ cff_size_init( FT_Size cffsize ) /* CFF_Size */
+ {
+ CFF_Size size = (CFF_Size)cffsize;
+ FT_Error error = FT_Err_Ok;
+ PSH_Globals_Funcs funcs = cff_size_get_globals_funcs( size );
+
+
+ if ( funcs )
+ {
+ CFF_Face face = (CFF_Face)cffsize->face;
+ CFF_Font font = (CFF_Font)face->extra.data;
+ CFF_Internal internal = NULL;
+
+ PS_PrivateRec priv;
+ FT_Memory memory = cffsize->face->memory;
+
+ FT_UInt i;
+
+
+ if ( FT_NEW( internal ) )
+ goto Exit;
+
+ cff_make_private_dict( &font->top_font, &priv );
+ error = funcs->create( cffsize->face->memory, &priv,
+ &internal->topfont );
+ if ( error )
+ goto Exit;
+
+ for ( i = font->num_subfonts; i > 0; i-- )
+ {
+ CFF_SubFont sub = font->subfonts[i - 1];
+
+
+ cff_make_private_dict( sub, &priv );
+ error = funcs->create( cffsize->face->memory, &priv,
+ &internal->subfonts[i - 1] );
+ if ( error )
+ goto Exit;
+ }
+
+ cffsize->internal = (FT_Size_Internal)(void*)internal;
+ }
+
+ size->strike_index = 0xFFFFFFFFUL;
+
+ Exit:
+ return error;
+ }
+
+
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+
+ FT_LOCAL_DEF( FT_Error )
+ cff_size_select( FT_Size size,
+ FT_ULong strike_index )
+ {
+ CFF_Size cffsize = (CFF_Size)size;
+ PSH_Globals_Funcs funcs;
+
+
+ cffsize->strike_index = strike_index;
+
+ FT_Select_Metrics( size->face, strike_index );
+
+ funcs = cff_size_get_globals_funcs( cffsize );
+
+ if ( funcs )
+ {
+ CFF_Face face = (CFF_Face)size->face;
+ CFF_Font font = (CFF_Font)face->extra.data;
+ CFF_Internal internal = (CFF_Internal)size->internal;
+
+ FT_ULong top_upm = font->top_font.font_dict.units_per_em;
+ FT_UInt i;
+
+
+ funcs->set_scale( internal->topfont,
+ size->metrics.x_scale, size->metrics.y_scale,
+ 0, 0 );
+
+ for ( i = font->num_subfonts; i > 0; i-- )
+ {
+ CFF_SubFont sub = font->subfonts[i - 1];
+ FT_ULong sub_upm = sub->font_dict.units_per_em;
+ FT_Pos x_scale, y_scale;
+
+
+ if ( top_upm != sub_upm )
+ {
+ x_scale = FT_MulDiv( size->metrics.x_scale, top_upm, sub_upm );
+ y_scale = FT_MulDiv( size->metrics.y_scale, top_upm, sub_upm );
+ }
+ else
+ {
+ x_scale = size->metrics.x_scale;
+ y_scale = size->metrics.y_scale;
+ }
+
+ funcs->set_scale( internal->subfonts[i - 1],
+ x_scale, y_scale, 0, 0 );
+ }
+ }
+
+ return FT_Err_Ok;
+ }
+
+#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
+
+
+ FT_LOCAL_DEF( FT_Error )
+ cff_size_request( FT_Size size,
+ FT_Size_Request req )
+ {
+ CFF_Size cffsize = (CFF_Size)size;
+ PSH_Globals_Funcs funcs;
+
+
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+
+ if ( FT_HAS_FIXED_SIZES( size->face ) )
+ {
+ CFF_Face cffface = (CFF_Face)size->face;
+ SFNT_Service sfnt = (SFNT_Service)cffface->sfnt;
+ FT_ULong strike_index;
+
+
+ if ( sfnt->set_sbit_strike( cffface, req, &strike_index ) )
+ cffsize->strike_index = 0xFFFFFFFFUL;
+ else
+ return cff_size_select( size, strike_index );
+ }
+
+#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
+
+ FT_Request_Metrics( size->face, req );
+
+ funcs = cff_size_get_globals_funcs( cffsize );
+
+ if ( funcs )
+ {
+ CFF_Face cffface = (CFF_Face)size->face;
+ CFF_Font font = (CFF_Font)cffface->extra.data;
+ CFF_Internal internal = (CFF_Internal)size->internal;
+
+ FT_ULong top_upm = font->top_font.font_dict.units_per_em;
+ FT_UInt i;
+
+
+ funcs->set_scale( internal->topfont,
+ size->metrics.x_scale, size->metrics.y_scale,
+ 0, 0 );
+
+ for ( i = font->num_subfonts; i > 0; i-- )
+ {
+ CFF_SubFont sub = font->subfonts[i - 1];
+ FT_ULong sub_upm = sub->font_dict.units_per_em;
+ FT_Pos x_scale, y_scale;
+
+
+ if ( top_upm != sub_upm )
+ {
+ x_scale = FT_MulDiv( size->metrics.x_scale, top_upm, sub_upm );
+ y_scale = FT_MulDiv( size->metrics.y_scale, top_upm, sub_upm );
+ }
+ else
+ {
+ x_scale = size->metrics.x_scale;
+ y_scale = size->metrics.y_scale;
+ }
+
+ funcs->set_scale( internal->subfonts[i - 1],
+ x_scale, y_scale, 0, 0 );
+ }
+ }
+
+ return FT_Err_Ok;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SLOT FUNCTIONS */
+ /* */
+ /*************************************************************************/
+
+ FT_LOCAL_DEF( void )
+ cff_slot_done( FT_GlyphSlot slot )
+ {
+ slot->internal->glyph_hints = 0;
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ cff_slot_init( FT_GlyphSlot slot )
+ {
+ CFF_Face face = (CFF_Face)slot->face;
+ CFF_Font font = (CFF_Font)face->extra.data;
+ PSHinter_Service pshinter = font->pshinter;
+
+
+ if ( pshinter )
+ {
+ FT_Module module;
+
+
+ module = FT_Get_Module( slot->face->driver->root.library,
+ "pshinter" );
+ if ( module )
+ {
+ T2_Hints_Funcs funcs;
+
+
+ funcs = pshinter->get_t2_funcs( module );
+ slot->internal->glyph_hints = (void*)funcs;
+ }
+ }
+
+ return FT_Err_Ok;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* FACE FUNCTIONS */
+ /* */
+ /*************************************************************************/
+
+ static FT_String*
+ cff_strcpy( FT_Memory memory,
+ const FT_String* source )
+ {
+ FT_Error error;
+ FT_String* result;
+
+
+ (void)FT_STRDUP( result, source );
+
+ FT_UNUSED( error );
+
+ return result;
+ }
+
+
+ /* Strip all subset prefixes of the form `ABCDEF+'. Usually, there */
+ /* is only one, but font names like `APCOOG+JFABTD+FuturaBQ-Bold' */
+ /* have been seen in the wild. */
+
+ static void
+ remove_subset_prefix( FT_String* name )
+ {
+ FT_Int32 idx = 0;
+ FT_Int32 length = (FT_Int32)strlen( name ) + 1;
+ FT_Bool continue_search = 1;
+
+
+ while ( continue_search )
+ {
+ if ( length >= 7 && name[6] == '+' )
+ {
+ for ( idx = 0; idx < 6; idx++ )
+ {
+ /* ASCII uppercase letters */
+ if ( !( 'A' <= name[idx] && name[idx] <= 'Z' ) )
+ continue_search = 0;
+ }
+
+ if ( continue_search )
+ {
+ for ( idx = 7; idx < length; idx++ )
+ name[idx - 7] = name[idx];
+ length -= 7;
+ }
+ }
+ else
+ continue_search = 0;
+ }
+ }
+
+
+ /* Remove the style part from the family name (if present). */
+
+ static void
+ remove_style( FT_String* family_name,
+ const FT_String* style_name )
+ {
+ FT_Int32 family_name_length, style_name_length;
+
+
+ family_name_length = (FT_Int32)strlen( family_name );
+ style_name_length = (FT_Int32)strlen( style_name );
+
+ if ( family_name_length > style_name_length )
+ {
+ FT_Int idx;
+
+
+ for ( idx = 1; idx <= style_name_length; ++idx )
+ {
+ if ( family_name[family_name_length - idx] !=
+ style_name[style_name_length - idx] )
+ break;
+ }
+
+ if ( idx > style_name_length )
+ {
+ /* family_name ends with style_name; remove it */
+ idx = family_name_length - style_name_length - 1;
+
+ /* also remove special characters */
+ /* between real family name and style */
+ while ( idx > 0 &&
+ ( family_name[idx] == '-' ||
+ family_name[idx] == ' ' ||
+ family_name[idx] == '_' ||
+ family_name[idx] == '+' ) )
+ --idx;
+
+ if ( idx > 0 )
+ family_name[idx + 1] = '\0';
+ }
+ }
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ cff_face_init( FT_Stream stream,
+ FT_Face cffface, /* CFF_Face */
+ FT_Int face_index,
+ FT_Int num_params,
+ FT_Parameter* params )
+ {
+ CFF_Face face = (CFF_Face)cffface;
+ FT_Error error;
+ SFNT_Service sfnt;
+ FT_Service_PsCMaps psnames;
+ PSHinter_Service pshinter;
+ FT_Bool pure_cff = 1;
+ FT_Bool sfnt_format = 0;
+ FT_Library library = cffface->driver->root.library;
+
+
+ sfnt = (SFNT_Service)FT_Get_Module_Interface(
+ library, "sfnt" );
+ if ( !sfnt )
+ {
+ FT_ERROR(( "cff_face_init: cannot access `sfnt' module\n" ));
+ error = FT_THROW( Missing_Module );
+ goto Exit;
+ }
+
+ FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS );
+
+ pshinter = (PSHinter_Service)FT_Get_Module_Interface(
+ library, "pshinter" );
+
+ FT_TRACE2(( "CFF driver\n" ));
+
+ /* create input stream from resource */
+ if ( FT_STREAM_SEEK( 0 ) )
+ goto Exit;
+
+ /* check whether we have a valid OpenType file */
+ error = sfnt->init_face( stream, face, face_index, num_params, params );
+ if ( !error )
+ {
+ if ( face->format_tag != TTAG_OTTO &&
+ face->format_tag != 0x00010000UL ) /* `OTTO'; OpenType/CFF font */
+ {
+ FT_TRACE2(( " not an OpenType/CFF font\n" ));
+ error = FT_THROW( Unknown_File_Format );
+ goto Exit;
+ }
+
+ /* if we are performing a simple font format check, exit immediately */
+ if ( face_index < 0 )
+ return FT_Err_Ok;
+
+ sfnt_format = 1;
+
+ /* now, the font can be either an OpenType/CFF font, or an SVG CEF */
+ /* font; in the latter case it doesn't have a `head' table */
+ error = face->goto_table( face, TTAG_head, stream, 0 );
+ if ( !error )
+ {
+ pure_cff = 0;
+
+ /* load font directory */
+ error = sfnt->load_face( stream, face, face_index,
+ num_params, params );
+ if ( error )
+ goto Exit;
+ }
+ else
+ {
+ /* load the `cmap' table explicitly */
+ error = sfnt->load_cmap( face, stream );
+ if ( error )
+ goto Exit;
+ }
+
+ /* now load the CFF part of the file */
+ error = face->goto_table( face, TTAG_CFF, stream, 0 );
+ if ( error )
+ goto Exit;
+ }
+ else
+ {
+ /* rewind to start of file; we are going to load a pure-CFF font */
+ if ( FT_STREAM_SEEK( 0 ) )
+ goto Exit;
+ error = FT_Err_Ok;
+ }
+
+ /* now load and parse the CFF table in the file */
+ {
+ CFF_Font cff = NULL;
+ CFF_FontRecDict dict;
+ FT_Memory memory = cffface->memory;
+ FT_Int32 flags;
+ FT_UInt i;
+
+
+ if ( FT_NEW( cff ) )
+ goto Exit;
+
+ face->extra.data = cff;
+ error = cff_font_load( library, stream, face_index, cff, pure_cff );
+ if ( error )
+ goto Exit;
+
+ cff->pshinter = pshinter;
+ cff->psnames = psnames;
+
+ cffface->face_index = face_index;
+
+ /* Complement the root flags with some interesting information. */
+ /* Note that this is only necessary for pure CFF and CEF fonts; */
+ /* SFNT based fonts use the `name' table instead. */
+
+ cffface->num_glyphs = cff->num_glyphs;
+
+ dict = &cff->top_font.font_dict;
+
+ /* we need the `PSNames' module for CFF and CEF formats */
+ /* which aren't CID-keyed */
+ if ( dict->cid_registry == 0xFFFFU && !psnames )
+ {
+ FT_ERROR(( "cff_face_init:"
+ " cannot open CFF & CEF fonts\n"
+ " "
+ " without the `PSNames' module\n" ));
+ error = FT_THROW( Missing_Module );
+ goto Exit;
+ }
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+ {
+ FT_UInt idx;
+ FT_String* s;
+
+
+ FT_TRACE4(( "SIDs\n" ));
+
+ /* dump string index, including default strings for convenience */
+ for ( idx = 0; idx < cff->num_strings + 390; idx++ )
+ {
+ s = cff_index_get_sid_string( cff, idx );
+ if ( s )
+ FT_TRACE4((" %5d %s\n", idx, s ));
+ }
+ }
+#endif /* FT_DEBUG_LEVEL_TRACE */
+
+ if ( !dict->has_font_matrix )
+ dict->units_per_em = pure_cff ? 1000 : face->root.units_per_EM;
+
+ /* Normalize the font matrix so that `matrix->xx' is 1; the */
+ /* scaling is done with `units_per_em' then (at this point, */
+ /* it already contains the scaling factor, but without */
+ /* normalization of the matrix). */
+ /* */
+ /* Note that the offsets must be expressed in integer font */
+ /* units. */
+
+ {
+ FT_Matrix* matrix = &dict->font_matrix;
+ FT_Vector* offset = &dict->font_offset;
+ FT_ULong* upm = &dict->units_per_em;
+ FT_Fixed temp = FT_ABS( matrix->yy );
+
+
+ if ( temp != 0x10000L )
+ {
+ *upm = FT_DivFix( *upm, temp );
+
+ matrix->xx = FT_DivFix( matrix->xx, temp );
+ matrix->yx = FT_DivFix( matrix->yx, temp );
+ matrix->xy = FT_DivFix( matrix->xy, temp );
+ matrix->yy = FT_DivFix( matrix->yy, temp );
+ offset->x = FT_DivFix( offset->x, temp );
+ offset->y = FT_DivFix( offset->y, temp );
+ }
+
+ offset->x >>= 16;
+ offset->y >>= 16;
+ }
+
+ for ( i = cff->num_subfonts; i > 0; i-- )
+ {
+ CFF_FontRecDict sub = &cff->subfonts[i - 1]->font_dict;
+ CFF_FontRecDict top = &cff->top_font.font_dict;
+
+ FT_Matrix* matrix;
+ FT_Vector* offset;
+ FT_ULong* upm;
+ FT_Fixed temp;
+
+
+ if ( sub->has_font_matrix )
+ {
+ FT_Long scaling;
+
+
+ /* if we have a top-level matrix, */
+ /* concatenate the subfont matrix */
+
+ if ( top->has_font_matrix )
+ {
+ if ( top->units_per_em > 1 && sub->units_per_em > 1 )
+ scaling = FT_MIN( top->units_per_em, sub->units_per_em );
+ else
+ scaling = 1;
+
+ FT_Matrix_Multiply_Scaled( &top->font_matrix,
+ &sub->font_matrix,
+ scaling );
+ FT_Vector_Transform_Scaled( &sub->font_offset,
+ &top->font_matrix,
+ scaling );
+
+ sub->units_per_em = FT_MulDiv( sub->units_per_em,
+ top->units_per_em,
+ scaling );
+ }
+ }
+ else
+ {
+ sub->font_matrix = top->font_matrix;
+ sub->font_offset = top->font_offset;
+
+ sub->units_per_em = top->units_per_em;
+ }
+
+ matrix = &sub->font_matrix;
+ offset = &sub->font_offset;
+ upm = &sub->units_per_em;
+ temp = FT_ABS( matrix->yy );
+
+ if ( temp != 0x10000L )
+ {
+ *upm = FT_DivFix( *upm, temp );
+
+ matrix->xx = FT_DivFix( matrix->xx, temp );
+ matrix->yx = FT_DivFix( matrix->yx, temp );
+ matrix->xy = FT_DivFix( matrix->xy, temp );
+ matrix->yy = FT_DivFix( matrix->yy, temp );
+ offset->x = FT_DivFix( offset->x, temp );
+ offset->y = FT_DivFix( offset->y, temp );
+ }
+
+ offset->x >>= 16;
+ offset->y >>= 16;
+ }
+
+ if ( pure_cff )
+ {
+ char* style_name = NULL;
+
+
+ /* set up num_faces */
+ cffface->num_faces = cff->num_faces;
+
+ /* compute number of glyphs */
+ if ( dict->cid_registry != 0xFFFFU )
+ cffface->num_glyphs = cff->charset.max_cid + 1;
+ else
+ cffface->num_glyphs = cff->charstrings_index.count;
+
+ /* set global bbox, as well as EM size */
+ cffface->bbox.xMin = dict->font_bbox.xMin >> 16;
+ cffface->bbox.yMin = dict->font_bbox.yMin >> 16;
+ /* no `U' suffix here to 0xFFFF! */
+ cffface->bbox.xMax = ( dict->font_bbox.xMax + 0xFFFF ) >> 16;
+ cffface->bbox.yMax = ( dict->font_bbox.yMax + 0xFFFF ) >> 16;
+
+ cffface->units_per_EM = (FT_UShort)( dict->units_per_em );
+
+ cffface->ascender = (FT_Short)( cffface->bbox.yMax );
+ cffface->descender = (FT_Short)( cffface->bbox.yMin );
+
+ cffface->height = (FT_Short)( ( cffface->units_per_EM * 12 ) / 10 );
+ if ( cffface->height < cffface->ascender - cffface->descender )
+ cffface->height = (FT_Short)( cffface->ascender - cffface->descender );
+
+ cffface->underline_position =
+ (FT_Short)( dict->underline_position >> 16 );
+ cffface->underline_thickness =
+ (FT_Short)( dict->underline_thickness >> 16 );
+
+ /* retrieve font family & style name */
+ cffface->family_name = cff_index_get_name( cff, face_index );
+ if ( cffface->family_name )
+ {
+ char* full = cff_index_get_sid_string( cff,
+ dict->full_name );
+ char* fullp = full;
+ char* family = cffface->family_name;
+ char* family_name = NULL;
+
+
+ remove_subset_prefix( cffface->family_name );
+
+ if ( dict->family_name )
+ {
+ family_name = cff_index_get_sid_string( cff,
+ dict->family_name );
+ if ( family_name )
+ family = family_name;
+ }
+
+ /* We try to extract the style name from the full name. */
+ /* We need to ignore spaces and dashes during the search. */
+ if ( full && family )
+ {
+ while ( *fullp )
+ {
+ /* skip common characters at the start of both strings */
+ if ( *fullp == *family )
+ {
+ family++;
+ fullp++;
+ continue;
+ }
+
+ /* ignore spaces and dashes in full name during comparison */
+ if ( *fullp == ' ' || *fullp == '-' )
+ {
+ fullp++;
+ continue;
+ }
+
+ /* ignore spaces and dashes in family name during comparison */
+ if ( *family == ' ' || *family == '-' )
+ {
+ family++;
+ continue;
+ }
+
+ if ( !*family && *fullp )
+ {
+ /* The full name begins with the same characters as the */
+ /* family name, with spaces and dashes removed. In this */
+ /* case, the remaining string in `fullp' will be used as */
+ /* the style name. */
+ style_name = cff_strcpy( memory, fullp );
+
+ /* remove the style part from the family name (if present) */
+ remove_style( cffface->family_name, style_name );
+ }
+ break;
+ }
+ }
+ }
+ else
+ {
+ char *cid_font_name =
+ cff_index_get_sid_string( cff,
+ dict->cid_font_name );
+
+
+ /* do we have a `/FontName' for a CID-keyed font? */
+ if ( cid_font_name )
+ cffface->family_name = cff_strcpy( memory, cid_font_name );
+ }
+
+ if ( style_name )
+ cffface->style_name = style_name;
+ else
+ /* assume "Regular" style if we don't know better */
+ cffface->style_name = cff_strcpy( memory, (char *)"Regular" );
+
+ /*******************************************************************/
+ /* */
+ /* Compute face flags. */
+ /* */
+ flags = FT_FACE_FLAG_SCALABLE | /* scalable outlines */
+ FT_FACE_FLAG_HORIZONTAL | /* horizontal data */
+ FT_FACE_FLAG_HINTER; /* has native hinter */
+
+ if ( sfnt_format )
+ flags |= FT_FACE_FLAG_SFNT;
+
+ /* fixed width font? */
+ if ( dict->is_fixed_pitch )
+ flags |= FT_FACE_FLAG_FIXED_WIDTH;
+
+ /* XXX: WE DO NOT SUPPORT KERNING METRICS IN THE GPOS TABLE FOR NOW */
+#if 0
+ /* kerning available? */
+ if ( face->kern_pairs )
+ flags |= FT_FACE_FLAG_KERNING;
+#endif
+
+ cffface->face_flags = flags;
+
+ /*******************************************************************/
+ /* */
+ /* Compute style flags. */
+ /* */
+ flags = 0;
+
+ if ( dict->italic_angle )
+ flags |= FT_STYLE_FLAG_ITALIC;
+
+ {
+ char *weight = cff_index_get_sid_string( cff,
+ dict->weight );
+
+
+ if ( weight )
+ if ( !ft_strcmp( weight, "Bold" ) ||
+ !ft_strcmp( weight, "Black" ) )
+ flags |= FT_STYLE_FLAG_BOLD;
+ }
+
+ /* double check */
+ if ( !(flags & FT_STYLE_FLAG_BOLD) && cffface->style_name )
+ if ( !ft_strncmp( cffface->style_name, "Bold", 4 ) ||
+ !ft_strncmp( cffface->style_name, "Black", 5 ) )
+ flags |= FT_STYLE_FLAG_BOLD;
+
+ if ( !(flags & FT_STYLE_FLAG_ITALIC) && cffface->style_name )
+ if ( !ft_strncmp( cffface->style_name, "Italic", 6 ) )
+ flags |= FT_STYLE_FLAG_ITALIC;
+
+ cffface->style_flags = flags;
+ }
+
+
+#ifndef FT_CONFIG_OPTION_NO_GLYPH_NAMES
+ /* CID-keyed CFF fonts don't have glyph names -- the SFNT loader */
+ /* has unset this flag because of the 3.0 `post' table. */
+ if ( dict->cid_registry == 0xFFFFU )
+ cffface->face_flags |= FT_FACE_FLAG_GLYPH_NAMES;
+#endif
+
+ if ( dict->cid_registry != 0xFFFFU && pure_cff )
+ cffface->face_flags |= FT_FACE_FLAG_CID_KEYED;
+
+
+ /*******************************************************************/
+ /* */
+ /* Compute char maps. */
+ /* */
+
+ /* Try to synthesize a Unicode charmap if there is none available */
+ /* already. If an OpenType font contains a Unicode "cmap", we */
+ /* will use it, whatever be in the CFF part of the file. */
+ {
+ FT_CharMapRec cmaprec;
+ FT_CharMap cmap;
+ FT_UInt nn;
+ CFF_Encoding encoding = &cff->encoding;
+
+
+ for ( nn = 0; nn < (FT_UInt)cffface->num_charmaps; nn++ )
+ {
+ cmap = cffface->charmaps[nn];
+
+ /* Windows Unicode? */
+ if ( cmap->platform_id == TT_PLATFORM_MICROSOFT &&
+ cmap->encoding_id == TT_MS_ID_UNICODE_CS )
+ goto Skip_Unicode;
+
+ /* Apple Unicode platform id? */
+ if ( cmap->platform_id == TT_PLATFORM_APPLE_UNICODE )
+ goto Skip_Unicode; /* Apple Unicode */
+ }
+
+ /* since CID-keyed fonts don't contain glyph names, we can't */
+ /* construct a cmap */
+ if ( pure_cff && cff->top_font.font_dict.cid_registry != 0xFFFFU )
+ goto Exit;
+
+#ifdef FT_MAX_CHARMAP_CACHEABLE
+ if ( nn + 1 > FT_MAX_CHARMAP_CACHEABLE )
+ {
+ FT_ERROR(( "cff_face_init: no Unicode cmap is found, "
+ "and too many subtables (%d) to add synthesized cmap\n",
+ nn ));
+ goto Exit;
+ }
+#endif
+
+ /* we didn't find a Unicode charmap -- synthesize one */
+ cmaprec.face = cffface;
+ cmaprec.platform_id = TT_PLATFORM_MICROSOFT;
+ cmaprec.encoding_id = TT_MS_ID_UNICODE_CS;
+ cmaprec.encoding = FT_ENCODING_UNICODE;
+
+ nn = (FT_UInt)cffface->num_charmaps;
+
+ error = FT_CMap_New( &CFF_CMAP_UNICODE_CLASS_REC_GET, NULL,
+ &cmaprec, NULL );
+ if ( error &&
+ FT_ERR_NEQ( error, No_Unicode_Glyph_Name ) )
+ goto Exit;
+ error = FT_Err_Ok;
+
+ /* if no Unicode charmap was previously selected, select this one */
+ if ( cffface->charmap == NULL && nn != (FT_UInt)cffface->num_charmaps )
+ cffface->charmap = cffface->charmaps[nn];
+
+ Skip_Unicode:
+#ifdef FT_MAX_CHARMAP_CACHEABLE
+ if ( nn > FT_MAX_CHARMAP_CACHEABLE )
+ {
+ FT_ERROR(( "cff_face_init: Unicode cmap is found, "
+ "but too many preceding subtables (%d) to access\n",
+ nn - 1 ));
+ goto Exit;
+ }
+#endif
+ if ( encoding->count > 0 )
+ {
+ FT_CMap_Class clazz;
+
+
+ cmaprec.face = cffface;
+ cmaprec.platform_id = TT_PLATFORM_ADOBE; /* Adobe platform id */
+
+ if ( encoding->offset == 0 )
+ {
+ cmaprec.encoding_id = TT_ADOBE_ID_STANDARD;
+ cmaprec.encoding = FT_ENCODING_ADOBE_STANDARD;
+ clazz = &CFF_CMAP_ENCODING_CLASS_REC_GET;
+ }
+ else if ( encoding->offset == 1 )
+ {
+ cmaprec.encoding_id = TT_ADOBE_ID_EXPERT;
+ cmaprec.encoding = FT_ENCODING_ADOBE_EXPERT;
+ clazz = &CFF_CMAP_ENCODING_CLASS_REC_GET;
+ }
+ else
+ {
+ cmaprec.encoding_id = TT_ADOBE_ID_CUSTOM;
+ cmaprec.encoding = FT_ENCODING_ADOBE_CUSTOM;
+ clazz = &CFF_CMAP_ENCODING_CLASS_REC_GET;
+ }
+
+ error = FT_CMap_New( clazz, NULL, &cmaprec, NULL );
+ }
+ }
+ }
+
+ Exit:
+ return error;
+ }
+
+
+ FT_LOCAL_DEF( void )
+ cff_face_done( FT_Face cffface ) /* CFF_Face */
+ {
+ CFF_Face face = (CFF_Face)cffface;
+ FT_Memory memory;
+ SFNT_Service sfnt;
+
+
+ if ( !face )
+ return;
+
+ memory = cffface->memory;
+ sfnt = (SFNT_Service)face->sfnt;
+
+ if ( sfnt )
+ sfnt->done_face( face );
+
+ {
+ CFF_Font cff = (CFF_Font)face->extra.data;
+
+
+ if ( cff )
+ {
+ cff_font_done( cff );
+ FT_FREE( face->extra.data );
+ }
+ }
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ cff_driver_init( FT_Module module ) /* CFF_Driver */
+ {
+ CFF_Driver driver = (CFF_Driver)module;
+
+
+ /* set default property values */
+#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
+ driver->hinting_engine = FT_CFF_HINTING_FREETYPE;
+#else
+ driver->hinting_engine = FT_CFF_HINTING_ADOBE;
+#endif
+ driver->no_stem_darkening = FALSE;
+
+ return FT_Err_Ok;
+ }
+
+
+ FT_LOCAL_DEF( void )
+ cff_driver_done( FT_Module module ) /* CFF_Driver */
+ {
+ FT_UNUSED( module );
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffobjs.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffobjs.h
new file mode 100644
index 0000000000..a10232f864
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffobjs.h
@@ -0,0 +1,183 @@
+/***************************************************************************/
+/* */
+/* cffobjs.h */
+/* */
+/* OpenType objects manager (specification). */
+/* */
+/* Copyright 1996-2004, 2006-2008, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __CFFOBJS_H__
+#define __CFFOBJS_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "cfftypes.h"
+#include "../../include/freetype/internal/tttypes.h"
+#include "../../include/freetype/internal/services/svpscmap.h"
+#include "../../include/freetype/internal/pshints.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* CFF_Driver */
+ /* */
+ /* <Description> */
+ /* A handle to an OpenType driver object. */
+ /* */
+ typedef struct CFF_DriverRec_* CFF_Driver;
+
+ typedef TT_Face CFF_Face;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* CFF_Size */
+ /* */
+ /* <Description> */
+ /* A handle to an OpenType size object. */
+ /* */
+ typedef struct CFF_SizeRec_
+ {
+ FT_SizeRec root;
+ FT_ULong strike_index; /* 0xFFFFFFFF to indicate invalid */
+
+ } CFF_SizeRec, *CFF_Size;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* CFF_GlyphSlot */
+ /* */
+ /* <Description> */
+ /* A handle to an OpenType glyph slot object. */
+ /* */
+ typedef struct CFF_GlyphSlotRec_
+ {
+ FT_GlyphSlotRec root;
+
+ FT_Bool hint;
+ FT_Bool scaled;
+
+ FT_Fixed x_scale;
+ FT_Fixed y_scale;
+
+ } CFF_GlyphSlotRec, *CFF_GlyphSlot;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* CFF_Internal */
+ /* */
+ /* <Description> */
+ /* The interface to the `internal' field of `FT_Size'. */
+ /* */
+ typedef struct CFF_InternalRec_
+ {
+ PSH_Globals topfont;
+ PSH_Globals subfonts[CFF_MAX_CID_FONTS];
+
+ } CFF_InternalRec, *CFF_Internal;
+
+
+ /*************************************************************************/
+ /* */
+ /* Subglyph transformation record. */
+ /* */
+ typedef struct CFF_Transform_
+ {
+ FT_Fixed xx, xy; /* transformation matrix coefficients */
+ FT_Fixed yx, yy;
+ FT_F26Dot6 ox, oy; /* offsets */
+
+ } CFF_Transform;
+
+
+ /***********************************************************************/
+ /* */
+ /* CFF driver class. */
+ /* */
+ typedef struct CFF_DriverRec_
+ {
+ FT_DriverRec root;
+
+ FT_UInt hinting_engine;
+ FT_Bool no_stem_darkening;
+
+ } CFF_DriverRec;
+
+
+ FT_LOCAL( FT_Error )
+ cff_size_init( FT_Size size ); /* CFF_Size */
+
+ FT_LOCAL( void )
+ cff_size_done( FT_Size size ); /* CFF_Size */
+
+ FT_LOCAL( FT_Error )
+ cff_size_request( FT_Size size,
+ FT_Size_Request req );
+
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+
+ FT_LOCAL( FT_Error )
+ cff_size_select( FT_Size size,
+ FT_ULong strike_index );
+
+#endif
+
+ FT_LOCAL( void )
+ cff_slot_done( FT_GlyphSlot slot );
+
+ FT_LOCAL( FT_Error )
+ cff_slot_init( FT_GlyphSlot slot );
+
+
+ /*************************************************************************/
+ /* */
+ /* Face functions */
+ /* */
+ FT_LOCAL( FT_Error )
+ cff_face_init( FT_Stream stream,
+ FT_Face face, /* CFF_Face */
+ FT_Int face_index,
+ FT_Int num_params,
+ FT_Parameter* params );
+
+ FT_LOCAL( void )
+ cff_face_done( FT_Face face ); /* CFF_Face */
+
+
+ /*************************************************************************/
+ /* */
+ /* Driver functions */
+ /* */
+ FT_LOCAL( FT_Error )
+ cff_driver_init( FT_Module module ); /* CFF_Driver */
+
+ FT_LOCAL( void )
+ cff_driver_done( FT_Module module ); /* CFF_Driver */
+
+
+FT_END_HEADER
+
+#endif /* __CFFOBJS_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffparse.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffparse.c
new file mode 100644
index 0000000000..b2d8553956
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffparse.c
@@ -0,0 +1,1177 @@
+/***************************************************************************/
+/* */
+/* cffparse.c */
+/* */
+/* CFF token stream parser (body) */
+/* */
+/* Copyright 1996-2004, 2007-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "cffparse.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/internal/ftdebug.h"
+
+#include "cfferrs.h"
+#include "cffpic.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_cffparse
+
+
+ FT_LOCAL_DEF( void )
+ cff_parser_init( CFF_Parser parser,
+ FT_UInt code,
+ void* object,
+ FT_Library library)
+ {
+ FT_MEM_ZERO( parser, sizeof ( *parser ) );
+
+ parser->top = parser->stack;
+ parser->object_code = code;
+ parser->object = object;
+ parser->library = library;
+ }
+
+
+ /* read an integer */
+ static FT_Long
+ cff_parse_integer( FT_Byte* start,
+ FT_Byte* limit )
+ {
+ FT_Byte* p = start;
+ FT_Int v = *p++;
+ FT_Long val = 0;
+
+
+ if ( v == 28 )
+ {
+ if ( p + 2 > limit )
+ goto Bad;
+
+ val = (FT_Short)( ( (FT_UShort)p[0] << 8 ) | p[1] );
+ p += 2;
+ }
+ else if ( v == 29 )
+ {
+ if ( p + 4 > limit )
+ goto Bad;
+
+ val = (FT_Long)( ( (FT_ULong)p[0] << 24 ) |
+ ( (FT_ULong)p[1] << 16 ) |
+ ( (FT_ULong)p[2] << 8 ) |
+ (FT_ULong)p[3] );
+ p += 4;
+ }
+ else if ( v < 247 )
+ {
+ val = v - 139;
+ }
+ else if ( v < 251 )
+ {
+ if ( p + 1 > limit )
+ goto Bad;
+
+ val = ( v - 247 ) * 256 + p[0] + 108;
+ p++;
+ }
+ else
+ {
+ if ( p + 1 > limit )
+ goto Bad;
+
+ val = -( v - 251 ) * 256 - p[0] - 108;
+ p++;
+ }
+
+ Exit:
+ return val;
+
+ Bad:
+ val = 0;
+ FT_TRACE4(( "!!!END OF DATA:!!!" ));
+ goto Exit;
+ }
+
+
+ static const FT_Long power_tens[] =
+ {
+ 1L,
+ 10L,
+ 100L,
+ 1000L,
+ 10000L,
+ 100000L,
+ 1000000L,
+ 10000000L,
+ 100000000L,
+ 1000000000L
+ };
+
+
+ /* read a real */
+ static FT_Fixed
+ cff_parse_real( FT_Byte* start,
+ FT_Byte* limit,
+ FT_Long power_ten,
+ FT_Long* scaling )
+ {
+ FT_Byte* p = start;
+ FT_UInt nib;
+ FT_UInt phase;
+
+ FT_Long result, number, exponent;
+ FT_Int sign = 0, exponent_sign = 0, have_overflow = 0;
+ FT_Long exponent_add, integer_length, fraction_length;
+
+
+ if ( scaling )
+ *scaling = 0;
+
+ result = 0;
+
+ number = 0;
+ exponent = 0;
+
+ exponent_add = 0;
+ integer_length = 0;
+ fraction_length = 0;
+
+ /* First of all, read the integer part. */
+ phase = 4;
+
+ for (;;)
+ {
+ /* If we entered this iteration with phase == 4, we need to */
+ /* read a new byte. This also skips past the initial 0x1E. */
+ if ( phase )
+ {
+ p++;
+
+ /* Make sure we don't read past the end. */
+ if ( p >= limit )
+ goto Bad;
+ }
+
+ /* Get the nibble. */
+ nib = ( p[0] >> phase ) & 0xF;
+ phase = 4 - phase;
+
+ if ( nib == 0xE )
+ sign = 1;
+ else if ( nib > 9 )
+ break;
+ else
+ {
+ /* Increase exponent if we can't add the digit. */
+ if ( number >= 0xCCCCCCCL )
+ exponent_add++;
+ /* Skip leading zeros. */
+ else if ( nib || number )
+ {
+ integer_length++;
+ number = number * 10 + nib;
+ }
+ }
+ }
+
+ /* Read fraction part, if any. */
+ if ( nib == 0xa )
+ for (;;)
+ {
+ /* If we entered this iteration with phase == 4, we need */
+ /* to read a new byte. */
+ if ( phase )
+ {
+ p++;
+
+ /* Make sure we don't read past the end. */
+ if ( p >= limit )
+ goto Bad;
+ }
+
+ /* Get the nibble. */
+ nib = ( p[0] >> phase ) & 0xF;
+ phase = 4 - phase;
+ if ( nib >= 10 )
+ break;
+
+ /* Skip leading zeros if possible. */
+ if ( !nib && !number )
+ exponent_add--;
+ /* Only add digit if we don't overflow. */
+ else if ( number < 0xCCCCCCCL && fraction_length < 9 )
+ {
+ fraction_length++;
+ number = number * 10 + nib;
+ }
+ }
+
+ /* Read exponent, if any. */
+ if ( nib == 12 )
+ {
+ exponent_sign = 1;
+ nib = 11;
+ }
+
+ if ( nib == 11 )
+ {
+ for (;;)
+ {
+ /* If we entered this iteration with phase == 4, */
+ /* we need to read a new byte. */
+ if ( phase )
+ {
+ p++;
+
+ /* Make sure we don't read past the end. */
+ if ( p >= limit )
+ goto Bad;
+ }
+
+ /* Get the nibble. */
+ nib = ( p[0] >> phase ) & 0xF;
+ phase = 4 - phase;
+ if ( nib >= 10 )
+ break;
+
+ /* Arbitrarily limit exponent. */
+ if ( exponent > 1000 )
+ have_overflow = 1;
+ else
+ exponent = exponent * 10 + nib;
+ }
+
+ if ( exponent_sign )
+ exponent = -exponent;
+ }
+
+ if ( !number )
+ goto Exit;
+
+ if ( have_overflow )
+ {
+ if ( exponent_sign )
+ goto Underflow;
+ else
+ goto Overflow;
+ }
+
+ /* We don't check `power_ten' and `exponent_add'. */
+ exponent += power_ten + exponent_add;
+
+ if ( scaling )
+ {
+ /* Only use `fraction_length'. */
+ fraction_length += integer_length;
+ exponent += integer_length;
+
+ if ( fraction_length <= 5 )
+ {
+ if ( number > 0x7FFFL )
+ {
+ result = FT_DivFix( number, 10 );
+ *scaling = exponent - fraction_length + 1;
+ }
+ else
+ {
+ if ( exponent > 0 )
+ {
+ FT_Long new_fraction_length, shift;
+
+
+ /* Make `scaling' as small as possible. */
+ new_fraction_length = FT_MIN( exponent, 5 );
+ shift = new_fraction_length - fraction_length;
+
+ if ( shift > 0 )
+ {
+ exponent -= new_fraction_length;
+ number *= power_tens[shift];
+ if ( number > 0x7FFFL )
+ {
+ number /= 10;
+ exponent += 1;
+ }
+ }
+ else
+ exponent -= fraction_length;
+ }
+ else
+ exponent -= fraction_length;
+
+ result = (FT_Long)( (FT_ULong)number << 16 );
+ *scaling = exponent;
+ }
+ }
+ else
+ {
+ if ( ( number / power_tens[fraction_length - 5] ) > 0x7FFFL )
+ {
+ result = FT_DivFix( number, power_tens[fraction_length - 4] );
+ *scaling = exponent - 4;
+ }
+ else
+ {
+ result = FT_DivFix( number, power_tens[fraction_length - 5] );
+ *scaling = exponent - 5;
+ }
+ }
+ }
+ else
+ {
+ integer_length += exponent;
+ fraction_length -= exponent;
+
+ if ( integer_length > 5 )
+ goto Overflow;
+ if ( integer_length < -5 )
+ goto Underflow;
+
+ /* Remove non-significant digits. */
+ if ( integer_length < 0 )
+ {
+ number /= power_tens[-integer_length];
+ fraction_length += integer_length;
+ }
+
+ /* this can only happen if exponent was non-zero */
+ if ( fraction_length == 10 )
+ {
+ number /= 10;
+ fraction_length -= 1;
+ }
+
+ /* Convert into 16.16 format. */
+ if ( fraction_length > 0 )
+ {
+ if ( ( number / power_tens[fraction_length] ) > 0x7FFFL )
+ goto Exit;
+
+ result = FT_DivFix( number, power_tens[fraction_length] );
+ }
+ else
+ {
+ number *= power_tens[-fraction_length];
+
+ if ( number > 0x7FFFL )
+ goto Overflow;
+
+ result = (FT_Long)( (FT_ULong)number << 16 );
+ }
+ }
+
+ Exit:
+ if ( sign )
+ result = -result;
+
+ return result;
+
+ Overflow:
+ result = 0x7FFFFFFFL;
+ FT_TRACE4(( "!!!OVERFLOW:!!!" ));
+ goto Exit;
+
+ Underflow:
+ result = 0;
+ FT_TRACE4(( "!!!UNDERFLOW:!!!" ));
+ goto Exit;
+
+ Bad:
+ result = 0;
+ FT_TRACE4(( "!!!END OF DATA:!!!" ));
+ goto Exit;
+ }
+
+
+ /* read a number, either integer or real */
+ static FT_Long
+ cff_parse_num( FT_Byte** d )
+ {
+ return **d == 30 ? ( cff_parse_real( d[0], d[1], 0, NULL ) >> 16 )
+ : cff_parse_integer( d[0], d[1] );
+ }
+
+
+ /* read a floating point number, either integer or real */
+ static FT_Fixed
+ do_fixed( FT_Byte** d,
+ FT_Long scaling )
+ {
+ if ( **d == 30 )
+ return cff_parse_real( d[0], d[1], scaling, NULL );
+ else
+ {
+ FT_Long val = cff_parse_integer( d[0], d[1] );
+
+
+ if ( scaling )
+ val *= power_tens[scaling];
+
+ if ( val > 0x7FFF )
+ {
+ val = 0x7FFFFFFFL;
+ goto Overflow;
+ }
+ else if ( val < -0x7FFF )
+ {
+ val = -0x7FFFFFFFL;
+ goto Overflow;
+ }
+
+ return (FT_Long)( (FT_ULong)val << 16 );
+
+ Overflow:
+ FT_TRACE4(( "!!!OVERFLOW:!!!" ));
+ return val;
+ }
+ }
+
+
+ /* read a floating point number, either integer or real */
+ static FT_Fixed
+ cff_parse_fixed( FT_Byte** d )
+ {
+ return do_fixed( d, 0 );
+ }
+
+
+ /* read a floating point number, either integer or real, */
+ /* but return `10^scaling' times the number read in */
+ static FT_Fixed
+ cff_parse_fixed_scaled( FT_Byte** d,
+ FT_Long scaling )
+ {
+ return do_fixed( d, scaling );
+ }
+
+
+ /* read a floating point number, either integer or real, */
+ /* and return it as precise as possible -- `scaling' returns */
+ /* the scaling factor (as a power of 10) */
+ static FT_Fixed
+ cff_parse_fixed_dynamic( FT_Byte** d,
+ FT_Long* scaling )
+ {
+ FT_ASSERT( scaling );
+
+ if ( **d == 30 )
+ return cff_parse_real( d[0], d[1], 0, scaling );
+ else
+ {
+ FT_Long number;
+ FT_Int integer_length;
+
+
+ number = cff_parse_integer( d[0], d[1] );
+
+ if ( number > 0x7FFFL )
+ {
+ for ( integer_length = 5; integer_length < 10; integer_length++ )
+ if ( number < power_tens[integer_length] )
+ break;
+
+ if ( ( number / power_tens[integer_length - 5] ) > 0x7FFFL )
+ {
+ *scaling = integer_length - 4;
+ return FT_DivFix( number, power_tens[integer_length - 4] );
+ }
+ else
+ {
+ *scaling = integer_length - 5;
+ return FT_DivFix( number, power_tens[integer_length - 5] );
+ }
+ }
+ else
+ {
+ *scaling = 0;
+ return (FT_Long)( (FT_ULong)number << 16 );
+ }
+ }
+ }
+
+
+ static FT_Error
+ cff_parse_font_matrix( CFF_Parser parser )
+ {
+ CFF_FontRecDict dict = (CFF_FontRecDict)parser->object;
+ FT_Matrix* matrix = &dict->font_matrix;
+ FT_Vector* offset = &dict->font_offset;
+ FT_ULong* upm = &dict->units_per_em;
+ FT_Byte** data = parser->stack;
+ FT_Error error = FT_ERR( Stack_Underflow );
+
+
+ if ( parser->top >= parser->stack + 6 )
+ {
+ FT_Long scaling;
+
+
+ error = FT_Err_Ok;
+
+ dict->has_font_matrix = TRUE;
+
+ /* We expect a well-formed font matrix, this is, the matrix elements */
+ /* `xx' and `yy' are of approximately the same magnitude. To avoid */
+ /* loss of precision, we use the magnitude of element `xx' to scale */
+ /* all other elements. The scaling factor is then contained in the */
+ /* `units_per_em' value. */
+
+ matrix->xx = cff_parse_fixed_dynamic( data++, &scaling );
+
+ scaling = -scaling;
+
+ if ( scaling < 0 || scaling > 9 )
+ {
+ /* Return default matrix in case of unlikely values. */
+
+ FT_TRACE1(( "cff_parse_font_matrix:"
+ " strange scaling value for xx element (%d),\n"
+ " "
+ " using default matrix\n", scaling ));
+
+ matrix->xx = 0x10000L;
+ matrix->yx = 0;
+ matrix->xy = 0;
+ matrix->yy = 0x10000L;
+ offset->x = 0;
+ offset->y = 0;
+ *upm = 1;
+
+ goto Exit;
+ }
+
+ matrix->yx = cff_parse_fixed_scaled( data++, scaling );
+ matrix->xy = cff_parse_fixed_scaled( data++, scaling );
+ matrix->yy = cff_parse_fixed_scaled( data++, scaling );
+ offset->x = cff_parse_fixed_scaled( data++, scaling );
+ offset->y = cff_parse_fixed_scaled( data, scaling );
+
+ *upm = power_tens[scaling];
+
+ FT_TRACE4(( " [%f %f %f %f %f %f]\n",
+ (double)matrix->xx / *upm / 65536,
+ (double)matrix->xy / *upm / 65536,
+ (double)matrix->yx / *upm / 65536,
+ (double)matrix->yy / *upm / 65536,
+ (double)offset->x / *upm / 65536,
+ (double)offset->y / *upm / 65536 ));
+ }
+
+ Exit:
+ return error;
+ }
+
+
+ static FT_Error
+ cff_parse_font_bbox( CFF_Parser parser )
+ {
+ CFF_FontRecDict dict = (CFF_FontRecDict)parser->object;
+ FT_BBox* bbox = &dict->font_bbox;
+ FT_Byte** data = parser->stack;
+ FT_Error error;
+
+
+ error = FT_ERR( Stack_Underflow );
+
+ if ( parser->top >= parser->stack + 4 )
+ {
+ bbox->xMin = FT_RoundFix( cff_parse_fixed( data++ ) );
+ bbox->yMin = FT_RoundFix( cff_parse_fixed( data++ ) );
+ bbox->xMax = FT_RoundFix( cff_parse_fixed( data++ ) );
+ bbox->yMax = FT_RoundFix( cff_parse_fixed( data ) );
+ error = FT_Err_Ok;
+
+ FT_TRACE4(( " [%d %d %d %d]\n",
+ bbox->xMin / 65536,
+ bbox->yMin / 65536,
+ bbox->xMax / 65536,
+ bbox->yMax / 65536 ));
+ }
+
+ return error;
+ }
+
+
+ static FT_Error
+ cff_parse_private_dict( CFF_Parser parser )
+ {
+ CFF_FontRecDict dict = (CFF_FontRecDict)parser->object;
+ FT_Byte** data = parser->stack;
+ FT_Error error;
+
+
+ error = FT_ERR( Stack_Underflow );
+
+ if ( parser->top >= parser->stack + 2 )
+ {
+ dict->private_size = cff_parse_num( data++ );
+ dict->private_offset = cff_parse_num( data );
+ FT_TRACE4(( " %lu %lu\n",
+ dict->private_size, dict->private_offset ));
+
+ error = FT_Err_Ok;
+ }
+
+ return error;
+ }
+
+
+ static FT_Error
+ cff_parse_cid_ros( CFF_Parser parser )
+ {
+ CFF_FontRecDict dict = (CFF_FontRecDict)parser->object;
+ FT_Byte** data = parser->stack;
+ FT_Error error;
+
+
+ error = FT_ERR( Stack_Underflow );
+
+ if ( parser->top >= parser->stack + 3 )
+ {
+ dict->cid_registry = (FT_UInt)cff_parse_num( data++ );
+ dict->cid_ordering = (FT_UInt)cff_parse_num( data++ );
+ if ( **data == 30 )
+ FT_TRACE1(( "cff_parse_cid_ros: real supplement is rounded\n" ));
+ dict->cid_supplement = cff_parse_num( data );
+ if ( dict->cid_supplement < 0 )
+ FT_TRACE1(( "cff_parse_cid_ros: negative supplement %d is found\n",
+ dict->cid_supplement ));
+ error = FT_Err_Ok;
+
+ FT_TRACE4(( " %d %d %d\n",
+ dict->cid_registry,
+ dict->cid_ordering,
+ dict->cid_supplement ));
+ }
+
+ return error;
+ }
+
+
+#define CFF_FIELD_NUM( code, name, id ) \
+ CFF_FIELD( code, name, id, cff_kind_num )
+#define CFF_FIELD_FIXED( code, name, id ) \
+ CFF_FIELD( code, name, id, cff_kind_fixed )
+#define CFF_FIELD_FIXED_1000( code, name, id ) \
+ CFF_FIELD( code, name, id, cff_kind_fixed_thousand )
+#define CFF_FIELD_STRING( code, name, id ) \
+ CFF_FIELD( code, name, id, cff_kind_string )
+#define CFF_FIELD_BOOL( code, name, id ) \
+ CFF_FIELD( code, name, id, cff_kind_bool )
+
+#define CFFCODE_TOPDICT 0x1000
+#define CFFCODE_PRIVATE 0x2000
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+
+#undef CFF_FIELD
+#undef CFF_FIELD_DELTA
+
+
+#ifndef FT_DEBUG_LEVEL_TRACE
+
+
+#define CFF_FIELD_CALLBACK( code, name, id ) \
+ { \
+ cff_kind_callback, \
+ code | CFFCODE, \
+ 0, 0, \
+ cff_parse_ ## name, \
+ 0, 0 \
+ },
+
+#define CFF_FIELD( code, name, id, kind ) \
+ { \
+ kind, \
+ code | CFFCODE, \
+ FT_FIELD_OFFSET( name ), \
+ FT_FIELD_SIZE( name ), \
+ 0, 0, 0 \
+ },
+
+#define CFF_FIELD_DELTA( code, name, max, id ) \
+ { \
+ cff_kind_delta, \
+ code | CFFCODE, \
+ FT_FIELD_OFFSET( name ), \
+ FT_FIELD_SIZE_DELTA( name ), \
+ 0, \
+ max, \
+ FT_FIELD_OFFSET( num_ ## name ) \
+ },
+
+ static const CFF_Field_Handler cff_field_handlers[] =
+ {
+
+#include "cfftoken.h"
+
+ { 0, 0, 0, 0, 0, 0, 0 }
+ };
+
+
+#else /* FT_DEBUG_LEVEL_TRACE */
+
+
+
+#define CFF_FIELD_CALLBACK( code, name, id ) \
+ { \
+ cff_kind_callback, \
+ code | CFFCODE, \
+ 0, 0, \
+ cff_parse_ ## name, \
+ 0, 0, \
+ id \
+ },
+
+#define CFF_FIELD( code, name, id, kind ) \
+ { \
+ kind, \
+ code | CFFCODE, \
+ FT_FIELD_OFFSET( name ), \
+ FT_FIELD_SIZE( name ), \
+ 0, 0, 0, \
+ id \
+ },
+
+#define CFF_FIELD_DELTA( code, name, max, id ) \
+ { \
+ cff_kind_delta, \
+ code | CFFCODE, \
+ FT_FIELD_OFFSET( name ), \
+ FT_FIELD_SIZE_DELTA( name ), \
+ 0, \
+ max, \
+ FT_FIELD_OFFSET( num_ ## name ), \
+ id \
+ },
+
+ static const CFF_Field_Handler cff_field_handlers[] =
+ {
+
+#include "cfftoken.h"
+
+ { 0, 0, 0, 0, 0, 0, 0, 0 }
+ };
+
+
+#endif /* FT_DEBUG_LEVEL_TRACE */
+
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+
+ void
+ FT_Destroy_Class_cff_field_handlers( FT_Library library,
+ CFF_Field_Handler* clazz )
+ {
+ FT_Memory memory = library->memory;
+
+
+ if ( clazz )
+ FT_FREE( clazz );
+ }
+
+
+ FT_Error
+ FT_Create_Class_cff_field_handlers( FT_Library library,
+ CFF_Field_Handler** output_class )
+ {
+ CFF_Field_Handler* clazz = NULL;
+ FT_Error error;
+ FT_Memory memory = library->memory;
+
+ int i = 0;
+
+
+#undef CFF_FIELD
+#define CFF_FIELD( code, name, id, kind ) i++;
+#undef CFF_FIELD_DELTA
+#define CFF_FIELD_DELTA( code, name, max, id ) i++;
+#undef CFF_FIELD_CALLBACK
+#define CFF_FIELD_CALLBACK( code, name, id ) i++;
+
+#include "cfftoken.h"
+
+ i++; /* { 0, 0, 0, 0, 0, 0, 0 } */
+
+ if ( FT_ALLOC( clazz, sizeof ( CFF_Field_Handler ) * i ) )
+ return error;
+
+ i = 0;
+
+
+#ifndef FT_DEBUG_LEVEL_TRACE
+
+
+#undef CFF_FIELD_CALLBACK
+#define CFF_FIELD_CALLBACK( code_, name_, id_ ) \
+ clazz[i].kind = cff_kind_callback; \
+ clazz[i].code = code_ | CFFCODE; \
+ clazz[i].offset = 0; \
+ clazz[i].size = 0; \
+ clazz[i].reader = cff_parse_ ## name_; \
+ clazz[i].array_max = 0; \
+ clazz[i].count_offset = 0; \
+ i++;
+
+#undef CFF_FIELD
+#define CFF_FIELD( code_, name_, id_, kind_ ) \
+ clazz[i].kind = kind_; \
+ clazz[i].code = code_ | CFFCODE; \
+ clazz[i].offset = FT_FIELD_OFFSET( name_ ); \
+ clazz[i].size = FT_FIELD_SIZE( name_ ); \
+ clazz[i].reader = 0; \
+ clazz[i].array_max = 0; \
+ clazz[i].count_offset = 0; \
+ i++; \
+
+#undef CFF_FIELD_DELTA
+#define CFF_FIELD_DELTA( code_, name_, max_, id_ ) \
+ clazz[i].kind = cff_kind_delta; \
+ clazz[i].code = code_ | CFFCODE; \
+ clazz[i].offset = FT_FIELD_OFFSET( name_ ); \
+ clazz[i].size = FT_FIELD_SIZE_DELTA( name_ ); \
+ clazz[i].reader = 0; \
+ clazz[i].array_max = max_; \
+ clazz[i].count_offset = FT_FIELD_OFFSET( num_ ## name_ ); \
+ i++;
+
+#include "cfftoken.h"
+
+ clazz[i].kind = 0;
+ clazz[i].code = 0;
+ clazz[i].offset = 0;
+ clazz[i].size = 0;
+ clazz[i].reader = 0;
+ clazz[i].array_max = 0;
+ clazz[i].count_offset = 0;
+
+
+#else /* FT_DEBUG_LEVEL_TRACE */
+
+
+#undef CFF_FIELD_CALLBACK
+#define CFF_FIELD_CALLBACK( code_, name_, id_ ) \
+ clazz[i].kind = cff_kind_callback; \
+ clazz[i].code = code_ | CFFCODE; \
+ clazz[i].offset = 0; \
+ clazz[i].size = 0; \
+ clazz[i].reader = cff_parse_ ## name_; \
+ clazz[i].array_max = 0; \
+ clazz[i].count_offset = 0; \
+ clazz[i].id = id_; \
+ i++;
+
+#undef CFF_FIELD
+#define CFF_FIELD( code_, name_, id_, kind_ ) \
+ clazz[i].kind = kind_; \
+ clazz[i].code = code_ | CFFCODE; \
+ clazz[i].offset = FT_FIELD_OFFSET( name_ ); \
+ clazz[i].size = FT_FIELD_SIZE( name_ ); \
+ clazz[i].reader = 0; \
+ clazz[i].array_max = 0; \
+ clazz[i].count_offset = 0; \
+ clazz[i].id = id_; \
+ i++; \
+
+#undef CFF_FIELD_DELTA
+#define CFF_FIELD_DELTA( code_, name_, max_, id_ ) \
+ clazz[i].kind = cff_kind_delta; \
+ clazz[i].code = code_ | CFFCODE; \
+ clazz[i].offset = FT_FIELD_OFFSET( name_ ); \
+ clazz[i].size = FT_FIELD_SIZE_DELTA( name_ ); \
+ clazz[i].reader = 0; \
+ clazz[i].array_max = max_; \
+ clazz[i].count_offset = FT_FIELD_OFFSET( num_ ## name_ ); \
+ clazz[i].id = id_; \
+ i++;
+
+#include "cfftoken.h"
+
+ clazz[i].kind = 0;
+ clazz[i].code = 0;
+ clazz[i].offset = 0;
+ clazz[i].size = 0;
+ clazz[i].reader = 0;
+ clazz[i].array_max = 0;
+ clazz[i].count_offset = 0;
+ clazz[i].id = 0;
+
+
+#endif /* FT_DEBUG_LEVEL_TRACE */
+
+
+ *output_class = clazz;
+
+ return FT_Err_Ok;
+ }
+
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+ FT_LOCAL_DEF( FT_Error )
+ cff_parser_run( CFF_Parser parser,
+ FT_Byte* start,
+ FT_Byte* limit )
+ {
+ FT_Byte* p = start;
+ FT_Error error = FT_Err_Ok;
+ FT_Library library = parser->library;
+ FT_UNUSED( library );
+
+
+ parser->top = parser->stack;
+ parser->start = start;
+ parser->limit = limit;
+ parser->cursor = start;
+
+ while ( p < limit )
+ {
+ FT_UInt v = *p;
+
+
+ if ( v >= 27 && v != 31 )
+ {
+ /* it's a number; we will push its position on the stack */
+ if ( parser->top - parser->stack >= CFF_MAX_STACK_DEPTH )
+ goto Stack_Overflow;
+
+ *parser->top ++ = p;
+
+ /* now, skip it */
+ if ( v == 30 )
+ {
+ /* skip real number */
+ p++;
+ for (;;)
+ {
+ /* An unterminated floating point number at the */
+ /* end of a dictionary is invalid but harmless. */
+ if ( p >= limit )
+ goto Exit;
+ v = p[0] >> 4;
+ if ( v == 15 )
+ break;
+ v = p[0] & 0xF;
+ if ( v == 15 )
+ break;
+ p++;
+ }
+ }
+ else if ( v == 28 )
+ p += 2;
+ else if ( v == 29 )
+ p += 4;
+ else if ( v > 246 )
+ p += 1;
+ }
+ else
+ {
+ /* This is not a number, hence it's an operator. Compute its code */
+ /* and look for it in our current list. */
+
+ FT_UInt code;
+ FT_UInt num_args = (FT_UInt)
+ ( parser->top - parser->stack );
+ const CFF_Field_Handler* field;
+
+
+ *parser->top = p;
+ code = v;
+ if ( v == 12 )
+ {
+ /* two byte operator */
+ p++;
+ if ( p >= limit )
+ goto Syntax_Error;
+
+ code = 0x100 | p[0];
+ }
+ code = code | parser->object_code;
+
+ for ( field = CFF_FIELD_HANDLERS_GET; field->kind; field++ )
+ {
+ if ( field->code == (FT_Int)code )
+ {
+ /* we found our field's handler; read it */
+ FT_Long val;
+ FT_Byte* q = (FT_Byte*)parser->object + field->offset;
+
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+ FT_TRACE4(( " %s", field->id ));
+#endif
+
+ /* check that we have enough arguments -- except for */
+ /* delta encoded arrays, which can be empty */
+ if ( field->kind != cff_kind_delta && num_args < 1 )
+ goto Stack_Underflow;
+
+ switch ( field->kind )
+ {
+ case cff_kind_bool:
+ case cff_kind_string:
+ case cff_kind_num:
+ val = cff_parse_num( parser->stack );
+ goto Store_Number;
+
+ case cff_kind_fixed:
+ val = cff_parse_fixed( parser->stack );
+ goto Store_Number;
+
+ case cff_kind_fixed_thousand:
+ val = cff_parse_fixed_scaled( parser->stack, 3 );
+
+ Store_Number:
+ switch ( field->size )
+ {
+ case (8 / FT_CHAR_BIT):
+ *(FT_Byte*)q = (FT_Byte)val;
+ break;
+
+ case (16 / FT_CHAR_BIT):
+ *(FT_Short*)q = (FT_Short)val;
+ break;
+
+ case (32 / FT_CHAR_BIT):
+ *(FT_Int32*)q = (FT_Int)val;
+ break;
+
+ default: /* for 64-bit systems */
+ *(FT_Long*)q = val;
+ }
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+ switch ( field->kind )
+ {
+ case cff_kind_bool:
+ FT_TRACE4(( " %s\n", val ? "true" : "false" ));
+ break;
+
+ case cff_kind_string:
+ FT_TRACE4(( " %ld (SID)\n", val ));
+ break;
+
+ case cff_kind_num:
+ FT_TRACE4(( " %ld\n", val ));
+ break;
+
+ case cff_kind_fixed:
+ FT_TRACE4(( " %f\n", (double)val / 65536 ));
+ break;
+
+ case cff_kind_fixed_thousand:
+ FT_TRACE4(( " %f\n", (double)val / 65536 / 1000 ));
+
+ default:
+ ; /* never reached */
+ }
+#endif
+
+ break;
+
+ case cff_kind_delta:
+ {
+ FT_Byte* qcount = (FT_Byte*)parser->object +
+ field->count_offset;
+
+ FT_Byte** data = parser->stack;
+
+
+ if ( num_args > field->array_max )
+ num_args = field->array_max;
+
+ FT_TRACE4(( " [" ));
+
+ /* store count */
+ *qcount = (FT_Byte)num_args;
+
+ val = 0;
+ while ( num_args > 0 )
+ {
+ val += cff_parse_num( data++ );
+ switch ( field->size )
+ {
+ case (8 / FT_CHAR_BIT):
+ *(FT_Byte*)q = (FT_Byte)val;
+ break;
+
+ case (16 / FT_CHAR_BIT):
+ *(FT_Short*)q = (FT_Short)val;
+ break;
+
+ case (32 / FT_CHAR_BIT):
+ *(FT_Int32*)q = (FT_Int)val;
+ break;
+
+ default: /* for 64-bit systems */
+ *(FT_Long*)q = val;
+ }
+
+ FT_TRACE4(( " %ld", val ));
+
+ q += field->size;
+ num_args--;
+ }
+
+ FT_TRACE4(( "]\n" ));
+ }
+ break;
+
+ default: /* callback */
+ error = field->reader( parser );
+ if ( error )
+ goto Exit;
+ }
+ goto Found;
+ }
+ }
+
+ /* this is an unknown operator, or it is unsupported; */
+ /* we will ignore it for now. */
+
+ Found:
+ /* clear stack */
+ parser->top = parser->stack;
+ }
+ p++;
+ }
+
+ Exit:
+ return error;
+
+ Stack_Overflow:
+ error = FT_THROW( Invalid_Argument );
+ goto Exit;
+
+ Stack_Underflow:
+ error = FT_THROW( Invalid_Argument );
+ goto Exit;
+
+ Syntax_Error:
+ error = FT_THROW( Invalid_Argument );
+ goto Exit;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffparse.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffparse.h
new file mode 100644
index 0000000000..3371fd0e76
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffparse.h
@@ -0,0 +1,106 @@
+/***************************************************************************/
+/* */
+/* cffparse.h */
+/* */
+/* CFF token stream parser (specification) */
+/* */
+/* Copyright 1996-2003, 2011 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __CFF_PARSE_H__
+#define __CFF_PARSE_H__
+
+
+#include "../../include/ft2build.h"
+#include "cfftypes.h"
+#include "../../include/freetype/internal/ftobjs.h"
+
+
+FT_BEGIN_HEADER
+
+
+#define CFF_MAX_STACK_DEPTH 96
+
+#define CFF_CODE_TOPDICT 0x1000
+#define CFF_CODE_PRIVATE 0x2000
+
+
+ typedef struct CFF_ParserRec_
+ {
+ FT_Library library;
+ FT_Byte* start;
+ FT_Byte* limit;
+ FT_Byte* cursor;
+
+ FT_Byte* stack[CFF_MAX_STACK_DEPTH + 1];
+ FT_Byte** top;
+
+ FT_UInt object_code;
+ void* object;
+
+ } CFF_ParserRec, *CFF_Parser;
+
+
+ FT_LOCAL( void )
+ cff_parser_init( CFF_Parser parser,
+ FT_UInt code,
+ void* object,
+ FT_Library library);
+
+ FT_LOCAL( FT_Error )
+ cff_parser_run( CFF_Parser parser,
+ FT_Byte* start,
+ FT_Byte* limit );
+
+
+ enum
+ {
+ cff_kind_none = 0,
+ cff_kind_num,
+ cff_kind_fixed,
+ cff_kind_fixed_thousand,
+ cff_kind_string,
+ cff_kind_bool,
+ cff_kind_delta,
+ cff_kind_callback,
+
+ cff_kind_max /* do not remove */
+ };
+
+
+ /* now generate handlers for the most simple fields */
+ typedef FT_Error (*CFF_Field_Reader)( CFF_Parser parser );
+
+ typedef struct CFF_Field_Handler_
+ {
+ int kind;
+ int code;
+ FT_UInt offset;
+ FT_Byte size;
+ CFF_Field_Reader reader;
+ FT_UInt array_max;
+ FT_UInt count_offset;
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+ const char* id;
+#endif
+
+ } CFF_Field_Handler;
+
+
+FT_END_HEADER
+
+
+#endif /* __CFF_PARSE_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffpic.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffpic.c
new file mode 100644
index 0000000000..5675e73155
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffpic.c
@@ -0,0 +1,138 @@
+/***************************************************************************/
+/* */
+/* cffpic.c */
+/* */
+/* The FreeType position independent code services for cff module. */
+/* */
+/* Copyright 2009, 2010, 2012, 2013 by */
+/* Oran Agra and Mickey Gabel. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/freetype.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "cffcmap.h"
+#include "cffpic.h"
+#include "cfferrs.h"
+
+
+#ifdef FT_CONFIG_OPTION_PIC
+
+ /* forward declaration of PIC init functions from cffdrivr.c */
+ FT_Error
+ FT_Create_Class_cff_services( FT_Library library,
+ FT_ServiceDescRec** output_class );
+ void
+ FT_Destroy_Class_cff_services( FT_Library library,
+ FT_ServiceDescRec* clazz );
+ void
+ FT_Init_Class_cff_service_ps_info( FT_Library library,
+ FT_Service_PsInfoRec* clazz );
+ void
+ FT_Init_Class_cff_service_glyph_dict( FT_Library library,
+ FT_Service_GlyphDictRec* clazz );
+ void
+ FT_Init_Class_cff_service_ps_name( FT_Library library,
+ FT_Service_PsFontNameRec* clazz );
+ void
+ FT_Init_Class_cff_service_get_cmap_info( FT_Library library,
+ FT_Service_TTCMapsRec* clazz );
+ void
+ FT_Init_Class_cff_service_cid_info( FT_Library library,
+ FT_Service_CIDRec* clazz );
+
+ /* forward declaration of PIC init functions from cffparse.c */
+ FT_Error
+ FT_Create_Class_cff_field_handlers( FT_Library library,
+ CFF_Field_Handler** output_class );
+ void
+ FT_Destroy_Class_cff_field_handlers( FT_Library library,
+ CFF_Field_Handler* clazz );
+
+
+ void
+ cff_driver_class_pic_free( FT_Library library )
+ {
+ FT_PIC_Container* pic_container = &library->pic_container;
+ FT_Memory memory = library->memory;
+
+
+ if ( pic_container->cff )
+ {
+ CffModulePIC* container = (CffModulePIC*)pic_container->cff;
+
+
+ if ( container->cff_services )
+ FT_Destroy_Class_cff_services( library,
+ container->cff_services );
+ container->cff_services = NULL;
+ if ( container->cff_field_handlers )
+ FT_Destroy_Class_cff_field_handlers(
+ library, container->cff_field_handlers );
+ container->cff_field_handlers = NULL;
+ FT_FREE( container );
+ pic_container->cff = NULL;
+ }
+ }
+
+
+ FT_Error
+ cff_driver_class_pic_init( FT_Library library )
+ {
+ FT_PIC_Container* pic_container = &library->pic_container;
+ FT_Error error = FT_Err_Ok;
+ CffModulePIC* container = NULL;
+ FT_Memory memory = library->memory;
+
+
+ /* allocate pointer, clear and set global container pointer */
+ if ( FT_ALLOC ( container, sizeof ( *container ) ) )
+ return error;
+ FT_MEM_SET( container, 0, sizeof ( *container ) );
+ pic_container->cff = container;
+
+ /* initialize pointer table - */
+ /* this is how the module usually expects this data */
+ error = FT_Create_Class_cff_services( library,
+ &container->cff_services );
+ if ( error )
+ goto Exit;
+
+ error = FT_Create_Class_cff_field_handlers(
+ library, &container->cff_field_handlers );
+ if ( error )
+ goto Exit;
+
+ FT_Init_Class_cff_service_ps_info(
+ library, &container->cff_service_ps_info );
+ FT_Init_Class_cff_service_glyph_dict(
+ library, &container->cff_service_glyph_dict );
+ FT_Init_Class_cff_service_ps_name(
+ library, &container->cff_service_ps_name );
+ FT_Init_Class_cff_service_get_cmap_info(
+ library, &container->cff_service_get_cmap_info );
+ FT_Init_Class_cff_service_cid_info(
+ library, &container->cff_service_cid_info );
+ FT_Init_Class_cff_cmap_encoding_class_rec(
+ library, &container->cff_cmap_encoding_class_rec );
+ FT_Init_Class_cff_cmap_unicode_class_rec(
+ library, &container->cff_cmap_unicode_class_rec );
+
+ Exit:
+ if ( error )
+ cff_driver_class_pic_free( library );
+ return error;
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffpic.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffpic.h
new file mode 100644
index 0000000000..7fb76e5937
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cffpic.h
@@ -0,0 +1,108 @@
+/***************************************************************************/
+/* */
+/* cffpic.h */
+/* */
+/* The FreeType position independent code services for cff module. */
+/* */
+/* Copyright 2009, 2012, 2013 by */
+/* Oran Agra and Mickey Gabel. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __CFFPIC_H__
+#define __CFFPIC_H__
+
+
+FT_BEGIN_HEADER
+
+#include "../../include/freetype/internal/ftpic.h"
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define CFF_SERVICE_PS_INFO_GET cff_service_ps_info
+#define CFF_SERVICE_GLYPH_DICT_GET cff_service_glyph_dict
+#define CFF_SERVICE_PS_NAME_GET cff_service_ps_name
+#define CFF_SERVICE_GET_CMAP_INFO_GET cff_service_get_cmap_info
+#define CFF_SERVICE_CID_INFO_GET cff_service_cid_info
+#define CFF_SERVICE_PROPERTIES_GET cff_service_properties
+#define CFF_SERVICES_GET cff_services
+#define CFF_CMAP_ENCODING_CLASS_REC_GET cff_cmap_encoding_class_rec
+#define CFF_CMAP_UNICODE_CLASS_REC_GET cff_cmap_unicode_class_rec
+#define CFF_FIELD_HANDLERS_GET cff_field_handlers
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#include "../../include/freetype/internal/services/svgldict.h"
+#include "cffparse.h"
+#include "../../include/freetype/internal/services/svpsinfo.h"
+#include "../../include/freetype/internal/services/svpostnm.h"
+#include "../../include/freetype/internal/services/svttcmap.h"
+#include "../../include/freetype/internal/services/svcid.h"
+#include "../../include/freetype/internal/services/svprop.h"
+
+
+ typedef struct CffModulePIC_
+ {
+ FT_ServiceDescRec* cff_services;
+ CFF_Field_Handler* cff_field_handlers;
+ FT_Service_PsInfoRec cff_service_ps_info;
+ FT_Service_GlyphDictRec cff_service_glyph_dict;
+ FT_Service_PsFontNameRec cff_service_ps_name;
+ FT_Service_TTCMapsRec cff_service_get_cmap_info;
+ FT_Service_CIDRec cff_service_cid_info;
+ FT_Service_PropertiesRec cff_service_properties;
+ FT_CMap_ClassRec cff_cmap_encoding_class_rec;
+ FT_CMap_ClassRec cff_cmap_unicode_class_rec;
+
+ } CffModulePIC;
+
+
+#define GET_PIC( lib ) \
+ ( (CffModulePIC*)( (lib)->pic_container.cff ) )
+
+#define CFF_SERVICE_PS_INFO_GET \
+ ( GET_PIC( library )->cff_service_ps_info )
+#define CFF_SERVICE_GLYPH_DICT_GET \
+ ( GET_PIC( library )->cff_service_glyph_dict )
+#define CFF_SERVICE_PS_NAME_GET \
+ ( GET_PIC( library )->cff_service_ps_name )
+#define CFF_SERVICE_GET_CMAP_INFO_GET \
+ ( GET_PIC( library )->cff_service_get_cmap_info )
+#define CFF_SERVICE_CID_INFO_GET \
+ ( GET_PIC( library )->cff_service_cid_info )
+#define CFF_SERVICE_PROPERTIES_GET \
+ ( GET_PIC( library )->cff_service_properties )
+#define CFF_SERVICES_GET \
+ ( GET_PIC( library )->cff_services )
+#define CFF_CMAP_ENCODING_CLASS_REC_GET \
+ ( GET_PIC( library )->cff_cmap_encoding_class_rec )
+#define CFF_CMAP_UNICODE_CLASS_REC_GET \
+ ( GET_PIC( library )->cff_cmap_unicode_class_rec )
+#define CFF_FIELD_HANDLERS_GET \
+ ( GET_PIC( library )->cff_field_handlers )
+
+ /* see cffpic.c for the implementation */
+ void
+ cff_driver_class_pic_free( FT_Library library );
+
+ FT_Error
+ cff_driver_class_pic_init( FT_Library library );
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __CFFPIC_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cfftoken.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cfftoken.h
new file mode 100644
index 0000000000..bcb4276a78
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cfftoken.h
@@ -0,0 +1,97 @@
+/***************************************************************************/
+/* */
+/* cfftoken.h */
+/* */
+/* CFF token definitions (specification only). */
+/* */
+/* Copyright 1996-2003, 2011 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#undef FT_STRUCTURE
+#define FT_STRUCTURE CFF_FontRecDictRec
+
+#undef CFFCODE
+#define CFFCODE CFFCODE_TOPDICT
+
+ CFF_FIELD_STRING ( 0, version, "Version" )
+ CFF_FIELD_STRING ( 1, notice, "Notice" )
+ CFF_FIELD_STRING ( 0x100, copyright, "Copyright" )
+ CFF_FIELD_STRING ( 2, full_name, "FullName" )
+ CFF_FIELD_STRING ( 3, family_name, "FamilyName" )
+ CFF_FIELD_STRING ( 4, weight, "Weight" )
+ CFF_FIELD_BOOL ( 0x101, is_fixed_pitch, "isFixedPitch" )
+ CFF_FIELD_FIXED ( 0x102, italic_angle, "ItalicAngle" )
+ CFF_FIELD_FIXED ( 0x103, underline_position, "UnderlinePosition" )
+ CFF_FIELD_FIXED ( 0x104, underline_thickness, "UnderlineThickness" )
+ CFF_FIELD_NUM ( 0x105, paint_type, "PaintType" )
+ CFF_FIELD_NUM ( 0x106, charstring_type, "CharstringType" )
+ CFF_FIELD_CALLBACK( 0x107, font_matrix, "FontMatrix" )
+ CFF_FIELD_NUM ( 13, unique_id, "UniqueID" )
+ CFF_FIELD_CALLBACK( 5, font_bbox, "FontBBox" )
+ CFF_FIELD_NUM ( 0x108, stroke_width, "StrokeWidth" )
+ CFF_FIELD_NUM ( 15, charset_offset, "charset" )
+ CFF_FIELD_NUM ( 16, encoding_offset, "Encoding" )
+ CFF_FIELD_NUM ( 17, charstrings_offset, "CharStrings" )
+ CFF_FIELD_CALLBACK( 18, private_dict, "Private" )
+ CFF_FIELD_NUM ( 0x114, synthetic_base, "SyntheticBase" )
+ CFF_FIELD_STRING ( 0x115, embedded_postscript, "PostScript" )
+
+#if 0
+ CFF_FIELD_STRING ( 0x116, base_font_name, "BaseFontName" )
+ CFF_FIELD_DELTA ( 0x117, base_font_blend, 16, "BaseFontBlend" )
+ CFF_FIELD_CALLBACK( 0x118, multiple_master, "MultipleMaster" )
+ CFF_FIELD_CALLBACK( 0x119, blend_axis_types, "BlendAxisTypes" )
+#endif
+
+ CFF_FIELD_CALLBACK( 0x11E, cid_ros, "ROS" )
+ CFF_FIELD_NUM ( 0x11F, cid_font_version, "CIDFontVersion" )
+ CFF_FIELD_NUM ( 0x120, cid_font_revision, "CIDFontRevision" )
+ CFF_FIELD_NUM ( 0x121, cid_font_type, "CIDFontType" )
+ CFF_FIELD_NUM ( 0x122, cid_count, "CIDCount" )
+ CFF_FIELD_NUM ( 0x123, cid_uid_base, "UIDBase" )
+ CFF_FIELD_NUM ( 0x124, cid_fd_array_offset, "FDArray" )
+ CFF_FIELD_NUM ( 0x125, cid_fd_select_offset, "FDSelect" )
+ CFF_FIELD_STRING ( 0x126, cid_font_name, "FontName" )
+
+#if 0
+ CFF_FIELD_NUM ( 0x127, chameleon, "Chameleon" )
+#endif
+
+
+#undef FT_STRUCTURE
+#define FT_STRUCTURE CFF_PrivateRec
+#undef CFFCODE
+#define CFFCODE CFFCODE_PRIVATE
+
+ CFF_FIELD_DELTA ( 6, blue_values, 14, "BlueValues" )
+ CFF_FIELD_DELTA ( 7, other_blues, 10, "OtherBlues" )
+ CFF_FIELD_DELTA ( 8, family_blues, 14, "FamilyBlues" )
+ CFF_FIELD_DELTA ( 9, family_other_blues, 10, "FamilyOtherBlues" )
+ CFF_FIELD_FIXED_1000( 0x109, blue_scale, "BlueScale" )
+ CFF_FIELD_NUM ( 0x10A, blue_shift, "BlueShift" )
+ CFF_FIELD_NUM ( 0x10B, blue_fuzz, "BlueFuzz" )
+ CFF_FIELD_NUM ( 10, standard_width, "StdHW" )
+ CFF_FIELD_NUM ( 11, standard_height, "StdVW" )
+ CFF_FIELD_DELTA ( 0x10C, snap_widths, 13, "StemSnapH" )
+ CFF_FIELD_DELTA ( 0x10D, snap_heights, 13, "StemSnapV" )
+ CFF_FIELD_BOOL ( 0x10E, force_bold, "ForceBold" )
+ CFF_FIELD_FIXED ( 0x10F, force_bold_threshold, "ForceBoldThreshold" )
+ CFF_FIELD_NUM ( 0x110, lenIV, "lenIV" )
+ CFF_FIELD_NUM ( 0x111, language_group, "LanguageGroup" )
+ CFF_FIELD_FIXED ( 0x112, expansion_factor, "ExpansionFactor" )
+ CFF_FIELD_NUM ( 0x113, initial_random_seed, "initialRandomSeed" )
+ CFF_FIELD_NUM ( 19, local_subrs_offset, "Subrs" )
+ CFF_FIELD_NUM ( 20, default_width, "defaultWidthX" )
+ CFF_FIELD_NUM ( 21, nominal_width, "nominalWidthX" )
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cfftypes.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cfftypes.h
new file mode 100644
index 0000000000..f08e064fb3
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/cfftypes.h
@@ -0,0 +1,284 @@
+/***************************************************************************/
+/* */
+/* cfftypes.h */
+/* */
+/* Basic OpenType/CFF type definitions and interface (specification */
+/* only). */
+/* */
+/* Copyright 1996-2003, 2006-2008, 2010-2011, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __CFFTYPES_H__
+#define __CFFTYPES_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/freetype.h"
+#include "../../include/freetype/t1tables.h"
+#include "../../include/freetype/internal/ftserv.h"
+#include "../../include/freetype/internal/services/svpscmap.h"
+#include "../../include/freetype/internal/pshints.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* CFF_IndexRec */
+ /* */
+ /* <Description> */
+ /* A structure used to model a CFF Index table. */
+ /* */
+ /* <Fields> */
+ /* stream :: The source input stream. */
+ /* */
+ /* start :: The position of the first index byte in the */
+ /* input stream. */
+ /* */
+ /* count :: The number of elements in the index. */
+ /* */
+ /* off_size :: The size in bytes of object offsets in index. */
+ /* */
+ /* data_offset :: The position of first data byte in the index's */
+ /* bytes. */
+ /* */
+ /* data_size :: The size of the data table in this index. */
+ /* */
+ /* offsets :: A table of element offsets in the index. Must be */
+ /* loaded explicitly. */
+ /* */
+ /* bytes :: If the index is loaded in memory, its bytes. */
+ /* */
+ typedef struct CFF_IndexRec_
+ {
+ FT_Stream stream;
+ FT_ULong start;
+ FT_UInt count;
+ FT_Byte off_size;
+ FT_ULong data_offset;
+ FT_ULong data_size;
+
+ FT_ULong* offsets;
+ FT_Byte* bytes;
+
+ } CFF_IndexRec, *CFF_Index;
+
+
+ typedef struct CFF_EncodingRec_
+ {
+ FT_UInt format;
+ FT_ULong offset;
+
+ FT_UInt count;
+ FT_UShort sids [256]; /* avoid dynamic allocations */
+ FT_UShort codes[256];
+
+ } CFF_EncodingRec, *CFF_Encoding;
+
+
+ typedef struct CFF_CharsetRec_
+ {
+
+ FT_UInt format;
+ FT_ULong offset;
+
+ FT_UShort* sids;
+ FT_UShort* cids; /* the inverse mapping of `sids'; only needed */
+ /* for CID-keyed fonts */
+ FT_UInt max_cid;
+ FT_UInt num_glyphs;
+
+ } CFF_CharsetRec, *CFF_Charset;
+
+
+ typedef struct CFF_FontRecDictRec_
+ {
+ FT_UInt version;
+ FT_UInt notice;
+ FT_UInt copyright;
+ FT_UInt full_name;
+ FT_UInt family_name;
+ FT_UInt weight;
+ FT_Bool is_fixed_pitch;
+ FT_Fixed italic_angle;
+ FT_Fixed underline_position;
+ FT_Fixed underline_thickness;
+ FT_Int paint_type;
+ FT_Int charstring_type;
+ FT_Matrix font_matrix;
+ FT_Bool has_font_matrix;
+ FT_ULong units_per_em; /* temporarily used as scaling value also */
+ FT_Vector font_offset;
+ FT_ULong unique_id;
+ FT_BBox font_bbox;
+ FT_Pos stroke_width;
+ FT_ULong charset_offset;
+ FT_ULong encoding_offset;
+ FT_ULong charstrings_offset;
+ FT_ULong private_offset;
+ FT_ULong private_size;
+ FT_Long synthetic_base;
+ FT_UInt embedded_postscript;
+
+ /* these should only be used for the top-level font dictionary */
+ FT_UInt cid_registry;
+ FT_UInt cid_ordering;
+ FT_Long cid_supplement;
+
+ FT_Long cid_font_version;
+ FT_Long cid_font_revision;
+ FT_Long cid_font_type;
+ FT_ULong cid_count;
+ FT_ULong cid_uid_base;
+ FT_ULong cid_fd_array_offset;
+ FT_ULong cid_fd_select_offset;
+ FT_UInt cid_font_name;
+
+ } CFF_FontRecDictRec, *CFF_FontRecDict;
+
+
+ typedef struct CFF_PrivateRec_
+ {
+ FT_Byte num_blue_values;
+ FT_Byte num_other_blues;
+ FT_Byte num_family_blues;
+ FT_Byte num_family_other_blues;
+
+ FT_Pos blue_values[14];
+ FT_Pos other_blues[10];
+ FT_Pos family_blues[14];
+ FT_Pos family_other_blues[10];
+
+ FT_Fixed blue_scale;
+ FT_Pos blue_shift;
+ FT_Pos blue_fuzz;
+ FT_Pos standard_width;
+ FT_Pos standard_height;
+
+ FT_Byte num_snap_widths;
+ FT_Byte num_snap_heights;
+ FT_Pos snap_widths[13];
+ FT_Pos snap_heights[13];
+ FT_Bool force_bold;
+ FT_Fixed force_bold_threshold;
+ FT_Int lenIV;
+ FT_Int language_group;
+ FT_Fixed expansion_factor;
+ FT_Long initial_random_seed;
+ FT_ULong local_subrs_offset;
+ FT_Pos default_width;
+ FT_Pos nominal_width;
+
+ } CFF_PrivateRec, *CFF_Private;
+
+
+ typedef struct CFF_FDSelectRec_
+ {
+ FT_Byte format;
+ FT_UInt range_count;
+
+ /* that's the table, taken from the file `as is' */
+ FT_Byte* data;
+ FT_UInt data_size;
+
+ /* small cache for format 3 only */
+ FT_UInt cache_first;
+ FT_UInt cache_count;
+ FT_Byte cache_fd;
+
+ } CFF_FDSelectRec, *CFF_FDSelect;
+
+
+ /* A SubFont packs a font dict and a private dict together. They are */
+ /* needed to support CID-keyed CFF fonts. */
+ typedef struct CFF_SubFontRec_
+ {
+ CFF_FontRecDictRec font_dict;
+ CFF_PrivateRec private_dict;
+
+ CFF_IndexRec local_subrs_index;
+ FT_Byte** local_subrs; /* array of pointers into Local Subrs INDEX data */
+
+ } CFF_SubFontRec, *CFF_SubFont;
+
+
+#define CFF_MAX_CID_FONTS 256
+
+
+ typedef struct CFF_FontRec_
+ {
+ FT_Stream stream;
+ FT_Memory memory;
+ FT_UInt num_faces;
+ FT_UInt num_glyphs;
+
+ FT_Byte version_major;
+ FT_Byte version_minor;
+ FT_Byte header_size;
+ FT_Byte absolute_offsize;
+
+
+ CFF_IndexRec name_index;
+ CFF_IndexRec top_dict_index;
+ CFF_IndexRec global_subrs_index;
+
+ CFF_EncodingRec encoding;
+ CFF_CharsetRec charset;
+
+ CFF_IndexRec charstrings_index;
+ CFF_IndexRec font_dict_index;
+ CFF_IndexRec private_index;
+ CFF_IndexRec local_subrs_index;
+
+ FT_String* font_name;
+
+ /* array of pointers into Global Subrs INDEX data */
+ FT_Byte** global_subrs;
+
+ /* array of pointers into String INDEX data stored at string_pool */
+ FT_UInt num_strings;
+ FT_Byte** strings;
+ FT_Byte* string_pool;
+
+ CFF_SubFontRec top_font;
+ FT_UInt num_subfonts;
+ CFF_SubFont subfonts[CFF_MAX_CID_FONTS];
+
+ CFF_FDSelectRec fd_select;
+
+ /* interface to PostScript hinter */
+ PSHinter_Service pshinter;
+
+ /* interface to Postscript Names service */
+ FT_Service_PsCMaps psnames;
+
+ /* since version 2.3.0 */
+ PS_FontInfoRec* font_info; /* font info dictionary */
+
+ /* since version 2.3.6 */
+ FT_String* registry;
+ FT_String* ordering;
+
+ /* since version 2.4.12 */
+ FT_Generic cf2_instance;
+
+ } CFF_FontRec, *CFF_Font;
+
+
+FT_END_HEADER
+
+#endif /* __CFFTYPES_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/fxft_cff.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/fxft_cff.c
new file mode 100644
index 0000000000..34dbabb91f
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/fxft_cff.c
@@ -0,0 +1,45 @@
+#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501
+/***************************************************************************/
+/* */
+/* cff.c */
+/* */
+/* FreeType OpenType driver component (body only). */
+/* */
+/* Copyright 1996-2001, 2002, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#define FT_MAKE_OPTION_SINGLE_OBJECT
+#define FT2_BUILD_LIBRARY
+
+#include "../../include/ft2build.h"
+
+#include "cffpic.c"
+#include "cffdrivr.c"
+#include "cffparse.c"
+#include "cffload.c"
+#include "cffobjs.c"
+#include "cffgload.c"
+#include "cffcmap.c"
+
+#include "cf2arrst.c"
+#include "cf2blues.c"
+#include "cf2error.c"
+#include "cf2font.c"
+#include "cf2ft.c"
+#include "cf2hints.c"
+#include "cf2intrp.c"
+#include "cf2read.c"
+#include "cf2stack.c"
+
+/* END */
+#endif
+
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/module.mk b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/module.mk
new file mode 100644
index 0000000000..ef1391c279
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/module.mk
@@ -0,0 +1,23 @@
+#
+# FreeType 2 CFF module definition
+#
+
+
+# Copyright 1996-2000, 2006 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT. By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+
+FTMODULE_H_COMMANDS += CFF_DRIVER
+
+define CFF_DRIVER
+$(OPEN_DRIVER) FT_Driver_ClassRec, cff_driver_class $(CLOSE_DRIVER)
+$(ECHO_DRIVER)cff $(ECHO_DRIVER_DESC)OpenType fonts with extension *.otf$(ECHO_DRIVER_DONE)
+endef
+
+# EOF
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/rules.mk b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/rules.mk
new file mode 100644
index 0000000000..13115c2550
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cff/rules.mk
@@ -0,0 +1,86 @@
+#
+# FreeType 2 OpenType/CFF driver configuration rules
+#
+
+
+# Copyright 1996-2001, 2003, 2011, 2013 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT. By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+
+# OpenType driver directory
+#
+CFF_DIR := $(SRC_DIR)/cff
+
+
+CFF_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(CFF_DIR))
+
+
+# CFF driver sources (i.e., C files)
+#
+CFF_DRV_SRC := $(CFF_DIR)/cffcmap.c \
+ $(CFF_DIR)/cffdrivr.c \
+ $(CFF_DIR)/cffgload.c \
+ $(CFF_DIR)/cffload.c \
+ $(CFF_DIR)/cffobjs.c \
+ $(CFF_DIR)/cffparse.c \
+ $(CFF_DIR)/cffpic.c \
+ $(CFF_DIR)/cf2arrst.c \
+ $(CFF_DIR)/cf2blues.c \
+ $(CFF_DIR)/cf2error.c \
+ $(CFF_DIR)/cf2font.c \
+ $(CFF_DIR)/cf2ft.c \
+ $(CFF_DIR)/cf2hints.c \
+ $(CFF_DIR)/cf2intrp.c \
+ $(CFF_DIR)/cf2read.c \
+ $(CFF_DIR)/cf2stack.c
+
+
+# CFF driver headers
+#
+CFF_DRV_H := $(CFF_DRV_SRC:%.c=%.h) \
+ $(CFF_DIR)/cfferrs.h \
+ $(CFF_DIR)/cfftoken.h \
+ $(CFF_DIR)/cfftypes.h \
+ $(CFF_DIR)/cf2fixed.h \
+ $(CFF_DIR)/cf2glue.h \
+ $(CFF_DIR)/cf2types.h
+
+
+# CFF driver object(s)
+#
+# CFF_DRV_OBJ_M is used during `multi' builds
+# CFF_DRV_OBJ_S is used during `single' builds
+#
+CFF_DRV_OBJ_M := $(CFF_DRV_SRC:$(CFF_DIR)/%.c=$(OBJ_DIR)/%.$O)
+CFF_DRV_OBJ_S := $(OBJ_DIR)/cff.$O
+
+# CFF driver source file for single build
+#
+CFF_DRV_SRC_S := $(CFF_DIR)/cff.c
+
+
+# CFF driver - single object
+#
+$(CFF_DRV_OBJ_S): $(CFF_DRV_SRC_S) $(CFF_DRV_SRC) $(FREETYPE_H) $(CFF_DRV_H)
+ $(CFF_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(CFF_DRV_SRC_S))
+
+
+# CFF driver - multiple objects
+#
+$(OBJ_DIR)/%.$O: $(CFF_DIR)/%.c $(FREETYPE_H) $(CFF_DRV_H)
+ $(CFF_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)
+
+
+# update main driver object lists
+#
+DRV_OBJS_S += $(CFF_DRV_OBJ_S)
+DRV_OBJS_M += $(CFF_DRV_OBJ_M)
+
+
+# EOF
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/Jamfile b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/Jamfile
new file mode 100644
index 0000000000..ebeaed54ea
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/Jamfile
@@ -0,0 +1,29 @@
+# FreeType 2 src/cid Jamfile
+#
+# Copyright 2001 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT. By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+SubDir FT2_TOP $(FT2_SRC_DIR) cid ;
+
+{
+ local _sources ;
+
+ if $(FT2_MULTI)
+ {
+ _sources = cidobjs cidload cidgload cidriver cidparse ;
+ }
+ else
+ {
+ _sources = type1cid ;
+ }
+
+ Library $(FT2_LIB) : $(_sources).c ;
+}
+
+# end of src/cid Jamfile
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/ciderrs.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/ciderrs.h
new file mode 100644
index 0000000000..1fdc24f168
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/ciderrs.h
@@ -0,0 +1,41 @@
+/***************************************************************************/
+/* */
+/* ciderrs.h */
+/* */
+/* CID error codes (specification only). */
+/* */
+/* Copyright 2001, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* This file is used to define the CID error enumeration constants. */
+ /* */
+ /*************************************************************************/
+
+#ifndef __CIDERRS_H__
+#define __CIDERRS_H__
+
+#include "../../include/freetype/ftmoderr.h"
+
+#undef __FTERRORS_H__
+
+#undef FT_ERR_PREFIX
+#define FT_ERR_PREFIX CID_Err_
+#define FT_ERR_BASE FT_Mod_Err_CID
+
+#include "../../include/freetype/fterrors.h"
+
+#endif /* __CIDERRS_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidgload.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidgload.c
new file mode 100644
index 0000000000..bb04ed4a21
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidgload.c
@@ -0,0 +1,442 @@
+/***************************************************************************/
+/* */
+/* cidgload.c */
+/* */
+/* CID-keyed Type1 Glyph Loader (body). */
+/* */
+/* Copyright 1996-2007, 2009, 2010, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "cidload.h"
+#include "cidgload.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/ftoutln.h"
+#include "../../include/freetype/internal/ftcalc.h"
+
+#include "ciderrs.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_cidgload
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ cid_load_glyph( T1_Decoder decoder,
+ FT_UInt glyph_index )
+ {
+ CID_Face face = (CID_Face)decoder->builder.face;
+ CID_FaceInfo cid = &face->cid;
+ FT_Byte* p;
+ FT_UInt fd_select;
+ FT_Stream stream = face->cid_stream;
+ FT_Error error = FT_Err_Ok;
+ FT_Byte* charstring = 0;
+ FT_Memory memory = face->root.memory;
+ FT_ULong glyph_length = 0;
+ PSAux_Service psaux = (PSAux_Service)face->psaux;
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+ FT_Incremental_InterfaceRec *inc =
+ face->root.internal->incremental_interface;
+#endif
+
+
+ FT_TRACE4(( "cid_load_glyph: glyph index %d\n", glyph_index ));
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+
+ /* For incremental fonts get the character data using */
+ /* the callback function. */
+ if ( inc )
+ {
+ FT_Data glyph_data;
+
+
+ error = inc->funcs->get_glyph_data( inc->object,
+ glyph_index, &glyph_data );
+ if ( error )
+ goto Exit;
+
+ p = (FT_Byte*)glyph_data.pointer;
+ fd_select = (FT_UInt)cid_get_offset( &p, (FT_Byte)cid->fd_bytes );
+
+ if ( glyph_data.length != 0 )
+ {
+ glyph_length = glyph_data.length - cid->fd_bytes;
+ (void)FT_ALLOC( charstring, glyph_length );
+ if ( !error )
+ ft_memcpy( charstring, glyph_data.pointer + cid->fd_bytes,
+ glyph_length );
+ }
+
+ inc->funcs->free_glyph_data( inc->object, &glyph_data );
+
+ if ( error )
+ goto Exit;
+ }
+
+ else
+
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
+
+ /* For ordinary fonts read the CID font dictionary index */
+ /* and charstring offset from the CIDMap. */
+ {
+ FT_UInt entry_len = cid->fd_bytes + cid->gd_bytes;
+ FT_ULong off1;
+
+
+ if ( FT_STREAM_SEEK( cid->data_offset + cid->cidmap_offset +
+ glyph_index * entry_len ) ||
+ FT_FRAME_ENTER( 2 * entry_len ) )
+ goto Exit;
+
+ p = (FT_Byte*)stream->cursor;
+ fd_select = (FT_UInt) cid_get_offset( &p, (FT_Byte)cid->fd_bytes );
+ off1 = (FT_ULong)cid_get_offset( &p, (FT_Byte)cid->gd_bytes );
+ p += cid->fd_bytes;
+ glyph_length = cid_get_offset( &p, (FT_Byte)cid->gd_bytes ) - off1;
+ FT_FRAME_EXIT();
+
+ if ( fd_select >= (FT_UInt)cid->num_dicts )
+ {
+ error = FT_THROW( Invalid_Offset );
+ goto Exit;
+ }
+ if ( glyph_length == 0 )
+ goto Exit;
+ if ( FT_ALLOC( charstring, glyph_length ) )
+ goto Exit;
+ if ( FT_STREAM_READ_AT( cid->data_offset + off1,
+ charstring, glyph_length ) )
+ goto Exit;
+ }
+
+ /* Now set up the subrs array and parse the charstrings. */
+ {
+ CID_FaceDict dict;
+ CID_Subrs cid_subrs = face->subrs + fd_select;
+ FT_Int cs_offset;
+
+
+ /* Set up subrs */
+ decoder->num_subrs = cid_subrs->num_subrs;
+ decoder->subrs = cid_subrs->code;
+ decoder->subrs_len = 0;
+
+ /* Set up font matrix */
+ dict = cid->font_dicts + fd_select;
+
+ decoder->font_matrix = dict->font_matrix;
+ decoder->font_offset = dict->font_offset;
+ decoder->lenIV = dict->private_dict.lenIV;
+
+ /* Decode the charstring. */
+
+ /* Adjustment for seed bytes. */
+ cs_offset = ( decoder->lenIV >= 0 ? decoder->lenIV : 0 );
+
+ /* Decrypt only if lenIV >= 0. */
+ if ( decoder->lenIV >= 0 )
+ psaux->t1_decrypt( charstring, glyph_length, 4330 );
+
+ error = decoder->funcs.parse_charstrings(
+ decoder, charstring + cs_offset,
+ (FT_Int)glyph_length - cs_offset );
+ }
+
+ FT_FREE( charstring );
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+
+ /* Incremental fonts can optionally override the metrics. */
+ if ( !error && inc && inc->funcs->get_glyph_metrics )
+ {
+ FT_Incremental_MetricsRec metrics;
+
+
+ metrics.bearing_x = FIXED_TO_INT( decoder->builder.left_bearing.x );
+ metrics.bearing_y = 0;
+ metrics.advance = FIXED_TO_INT( decoder->builder.advance.x );
+ metrics.advance_v = FIXED_TO_INT( decoder->builder.advance.y );
+
+ error = inc->funcs->get_glyph_metrics( inc->object,
+ glyph_index, FALSE, &metrics );
+
+ decoder->builder.left_bearing.x = INT_TO_FIXED( metrics.bearing_x );
+ decoder->builder.advance.x = INT_TO_FIXED( metrics.advance );
+ decoder->builder.advance.y = INT_TO_FIXED( metrics.advance_v );
+ }
+
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
+
+ Exit:
+ return error;
+ }
+
+
+#if 0
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /********** *********/
+ /********** *********/
+ /********** COMPUTE THE MAXIMUM ADVANCE WIDTH *********/
+ /********** *********/
+ /********** The following code is in charge of computing *********/
+ /********** the maximum advance width of the font. It *********/
+ /********** quickly processes each glyph charstring to *********/
+ /********** extract the value from either a `sbw' or `seac' *********/
+ /********** operator. *********/
+ /********** *********/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ FT_LOCAL_DEF( FT_Error )
+ cid_face_compute_max_advance( CID_Face face,
+ FT_Int* max_advance )
+ {
+ FT_Error error;
+ T1_DecoderRec decoder;
+ FT_Int glyph_index;
+
+ PSAux_Service psaux = (PSAux_Service)face->psaux;
+
+
+ *max_advance = 0;
+
+ /* Initialize load decoder */
+ error = psaux->t1_decoder_funcs->init( &decoder,
+ (FT_Face)face,
+ 0, /* size */
+ 0, /* glyph slot */
+ 0, /* glyph names! XXX */
+ 0, /* blend == 0 */
+ 0, /* hinting == 0 */
+ cid_load_glyph );
+ if ( error )
+ return error;
+
+ /* TODO: initialize decoder.len_buildchar and decoder.buildchar */
+ /* if we ever support CID-keyed multiple master fonts */
+
+ decoder.builder.metrics_only = 1;
+ decoder.builder.load_points = 0;
+
+ /* for each glyph, parse the glyph charstring and extract */
+ /* the advance width */
+ for ( glyph_index = 0; glyph_index < face->root.num_glyphs;
+ glyph_index++ )
+ {
+ /* now get load the unscaled outline */
+ error = cid_load_glyph( &decoder, glyph_index );
+ /* ignore the error if one occurred - skip to next glyph */
+ }
+
+ *max_advance = FIXED_TO_INT( decoder.builder.advance.x );
+
+ psaux->t1_decoder_funcs->done( &decoder );
+
+ return FT_Err_Ok;
+ }
+
+
+#endif /* 0 */
+
+
+ FT_LOCAL_DEF( FT_Error )
+ cid_slot_load_glyph( FT_GlyphSlot cidglyph, /* CID_GlyphSlot */
+ FT_Size cidsize, /* CID_Size */
+ FT_UInt glyph_index,
+ FT_Int32 load_flags )
+ {
+ CID_GlyphSlot glyph = (CID_GlyphSlot)cidglyph;
+ FT_Error error;
+ T1_DecoderRec decoder;
+ CID_Face face = (CID_Face)cidglyph->face;
+ FT_Bool hinting;
+
+ PSAux_Service psaux = (PSAux_Service)face->psaux;
+ FT_Matrix font_matrix;
+ FT_Vector font_offset;
+
+
+ if ( glyph_index >= (FT_UInt)face->root.num_glyphs )
+ {
+ error = FT_THROW( Invalid_Argument );
+ goto Exit;
+ }
+
+ if ( load_flags & FT_LOAD_NO_RECURSE )
+ load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING;
+
+ glyph->x_scale = cidsize->metrics.x_scale;
+ glyph->y_scale = cidsize->metrics.y_scale;
+
+ cidglyph->outline.n_points = 0;
+ cidglyph->outline.n_contours = 0;
+
+ hinting = FT_BOOL( ( load_flags & FT_LOAD_NO_SCALE ) == 0 &&
+ ( load_flags & FT_LOAD_NO_HINTING ) == 0 );
+
+ cidglyph->format = FT_GLYPH_FORMAT_OUTLINE;
+
+ error = psaux->t1_decoder_funcs->init( &decoder,
+ cidglyph->face,
+ cidsize,
+ cidglyph,
+ 0, /* glyph names -- XXX */
+ 0, /* blend == 0 */
+ hinting,
+ FT_LOAD_TARGET_MODE( load_flags ),
+ cid_load_glyph );
+ if ( error )
+ goto Exit;
+
+ /* TODO: initialize decoder.len_buildchar and decoder.buildchar */
+ /* if we ever support CID-keyed multiple master fonts */
+
+ /* set up the decoder */
+ decoder.builder.no_recurse = FT_BOOL(
+ ( ( load_flags & FT_LOAD_NO_RECURSE ) != 0 ) );
+
+ error = cid_load_glyph( &decoder, glyph_index );
+ if ( error )
+ goto Exit;
+
+ font_matrix = decoder.font_matrix;
+ font_offset = decoder.font_offset;
+
+ /* save new glyph tables */
+ psaux->t1_decoder_funcs->done( &decoder );
+
+ /* now set the metrics -- this is rather simple, as */
+ /* the left side bearing is the xMin, and the top side */
+ /* bearing the yMax */
+ cidglyph->outline.flags &= FT_OUTLINE_OWNER;
+ cidglyph->outline.flags |= FT_OUTLINE_REVERSE_FILL;
+
+ /* for composite glyphs, return only left side bearing and */
+ /* advance width */
+ if ( load_flags & FT_LOAD_NO_RECURSE )
+ {
+ FT_Slot_Internal internal = cidglyph->internal;
+
+
+ cidglyph->metrics.horiBearingX =
+ FIXED_TO_INT( decoder.builder.left_bearing.x );
+ cidglyph->metrics.horiAdvance =
+ FIXED_TO_INT( decoder.builder.advance.x );
+
+ internal->glyph_matrix = font_matrix;
+ internal->glyph_delta = font_offset;
+ internal->glyph_transformed = 1;
+ }
+ else
+ {
+ FT_BBox cbox;
+ FT_Glyph_Metrics* metrics = &cidglyph->metrics;
+ FT_Vector advance;
+
+
+ /* copy the _unscaled_ advance width */
+ metrics->horiAdvance =
+ FIXED_TO_INT( decoder.builder.advance.x );
+ cidglyph->linearHoriAdvance =
+ FIXED_TO_INT( decoder.builder.advance.x );
+ cidglyph->internal->glyph_transformed = 0;
+
+ /* make up vertical ones */
+ metrics->vertAdvance = ( face->cid.font_bbox.yMax -
+ face->cid.font_bbox.yMin ) >> 16;
+ cidglyph->linearVertAdvance = metrics->vertAdvance;
+
+ cidglyph->format = FT_GLYPH_FORMAT_OUTLINE;
+
+ if ( cidsize->metrics.y_ppem < 24 )
+ cidglyph->outline.flags |= FT_OUTLINE_HIGH_PRECISION;
+
+ /* apply the font matrix */
+ FT_Outline_Transform( &cidglyph->outline, &font_matrix );
+
+ FT_Outline_Translate( &cidglyph->outline,
+ font_offset.x,
+ font_offset.y );
+
+ advance.x = metrics->horiAdvance;
+ advance.y = 0;
+ FT_Vector_Transform( &advance, &font_matrix );
+ metrics->horiAdvance = advance.x + font_offset.x;
+
+ advance.x = 0;
+ advance.y = metrics->vertAdvance;
+ FT_Vector_Transform( &advance, &font_matrix );
+ metrics->vertAdvance = advance.y + font_offset.y;
+
+ if ( ( load_flags & FT_LOAD_NO_SCALE ) == 0 )
+ {
+ /* scale the outline and the metrics */
+ FT_Int n;
+ FT_Outline* cur = decoder.builder.base;
+ FT_Vector* vec = cur->points;
+ FT_Fixed x_scale = glyph->x_scale;
+ FT_Fixed y_scale = glyph->y_scale;
+
+
+ /* First of all, scale the points */
+ if ( !hinting || !decoder.builder.hints_funcs )
+ for ( n = cur->n_points; n > 0; n--, vec++ )
+ {
+ vec->x = FT_MulFix( vec->x, x_scale );
+ vec->y = FT_MulFix( vec->y, y_scale );
+ }
+
+ /* Then scale the metrics */
+ metrics->horiAdvance = FT_MulFix( metrics->horiAdvance, x_scale );
+ metrics->vertAdvance = FT_MulFix( metrics->vertAdvance, y_scale );
+ }
+
+ /* compute the other metrics */
+ FT_Outline_Get_CBox( &cidglyph->outline, &cbox );
+
+ metrics->width = cbox.xMax - cbox.xMin;
+ metrics->height = cbox.yMax - cbox.yMin;
+
+ metrics->horiBearingX = cbox.xMin;
+ metrics->horiBearingY = cbox.yMax;
+
+ if ( load_flags & FT_LOAD_VERTICAL_LAYOUT )
+ {
+ /* make up vertical ones */
+ ft_synthesize_vertical_metrics( metrics,
+ metrics->vertAdvance );
+ }
+ }
+
+ Exit:
+ return error;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidgload.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidgload.h
new file mode 100644
index 0000000000..e701793e19
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidgload.h
@@ -0,0 +1,51 @@
+/***************************************************************************/
+/* */
+/* cidgload.h */
+/* */
+/* OpenType Glyph Loader (specification). */
+/* */
+/* Copyright 1996-2001, 2002, 2004 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __CIDGLOAD_H__
+#define __CIDGLOAD_H__
+
+
+#include "../../include/ft2build.h"
+#include "cidobjs.h"
+
+
+FT_BEGIN_HEADER
+
+
+#if 0
+
+ /* Compute the maximum advance width of a font through quick parsing */
+ FT_LOCAL( FT_Error )
+ cid_face_compute_max_advance( CID_Face face,
+ FT_Int* max_advance );
+
+#endif /* 0 */
+
+ FT_LOCAL( FT_Error )
+ cid_slot_load_glyph( FT_GlyphSlot glyph, /* CID_Glyph_Slot */
+ FT_Size size, /* CID_Size */
+ FT_UInt glyph_index,
+ FT_Int32 load_flags );
+
+
+FT_END_HEADER
+
+#endif /* __CIDGLOAD_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidload.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidload.c
new file mode 100644
index 0000000000..bfb25dc37d
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidload.c
@@ -0,0 +1,690 @@
+/***************************************************************************/
+/* */
+/* cidload.c */
+/* */
+/* CID-keyed Type1 font loader (body). */
+/* */
+/* Copyright 1996-2006, 2009, 2011-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/config/ftconfig.h"
+#include "../../include/freetype/ftmm.h"
+#include "../../include/freetype/internal/t1types.h"
+
+#include "cidload.h"
+
+#include "ciderrs.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_cidload
+
+
+ /* read a single offset */
+ FT_LOCAL_DEF( FT_Long )
+ cid_get_offset( FT_Byte* *start,
+ FT_Byte offsize )
+ {
+ FT_ULong result;
+ FT_Byte* p = *start;
+
+
+ for ( result = 0; offsize > 0; offsize-- )
+ {
+ result <<= 8;
+ result |= *p++;
+ }
+
+ *start = p;
+ return (FT_Long)result;
+ }
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** TYPE 1 SYMBOL PARSING *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ static FT_Error
+ cid_load_keyword( CID_Face face,
+ CID_Loader* loader,
+ const T1_Field keyword )
+ {
+ FT_Error error;
+ CID_Parser* parser = &loader->parser;
+ FT_Byte* object;
+ void* dummy_object;
+ CID_FaceInfo cid = &face->cid;
+
+
+ /* if the keyword has a dedicated callback, call it */
+ if ( keyword->type == T1_FIELD_TYPE_CALLBACK )
+ {
+ keyword->reader( (FT_Face)face, parser );
+ error = parser->root.error;
+ goto Exit;
+ }
+
+ /* we must now compute the address of our target object */
+ switch ( keyword->location )
+ {
+ case T1_FIELD_LOCATION_CID_INFO:
+ object = (FT_Byte*)cid;
+ break;
+
+ case T1_FIELD_LOCATION_FONT_INFO:
+ object = (FT_Byte*)&cid->font_info;
+ break;
+
+ case T1_FIELD_LOCATION_FONT_EXTRA:
+ object = (FT_Byte*)&face->font_extra;
+ break;
+
+ case T1_FIELD_LOCATION_BBOX:
+ object = (FT_Byte*)&cid->font_bbox;
+ break;
+
+ default:
+ {
+ CID_FaceDict dict;
+
+
+ if ( parser->num_dict < 0 || parser->num_dict >= cid->num_dicts )
+ {
+ FT_ERROR(( "cid_load_keyword: invalid use of `%s'\n",
+ keyword->ident ));
+ error = FT_THROW( Syntax_Error );
+ goto Exit;
+ }
+
+ dict = cid->font_dicts + parser->num_dict;
+ switch ( keyword->location )
+ {
+ case T1_FIELD_LOCATION_PRIVATE:
+ object = (FT_Byte*)&dict->private_dict;
+ break;
+
+ default:
+ object = (FT_Byte*)dict;
+ }
+ }
+ }
+
+ dummy_object = object;
+
+ /* now, load the keyword data in the object's field(s) */
+ if ( keyword->type == T1_FIELD_TYPE_INTEGER_ARRAY ||
+ keyword->type == T1_FIELD_TYPE_FIXED_ARRAY )
+ error = cid_parser_load_field_table( &loader->parser, keyword,
+ &dummy_object );
+ else
+ error = cid_parser_load_field( &loader->parser,
+ keyword, &dummy_object );
+ Exit:
+ return error;
+ }
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ cid_parse_font_matrix( CID_Face face,
+ CID_Parser* parser )
+ {
+ FT_Matrix* matrix;
+ FT_Vector* offset;
+ CID_FaceDict dict;
+ FT_Face root = (FT_Face)&face->root;
+ FT_Fixed temp[6];
+ FT_Fixed temp_scale;
+
+
+ if ( parser->num_dict >= 0 && parser->num_dict < face->cid.num_dicts )
+ {
+ dict = face->cid.font_dicts + parser->num_dict;
+ matrix = &dict->font_matrix;
+ offset = &dict->font_offset;
+
+ (void)cid_parser_to_fixed_array( parser, 6, temp, 3 );
+
+ temp_scale = FT_ABS( temp[3] );
+
+ /* Set Units per EM based on FontMatrix values. We set the value to */
+ /* 1000 / temp_scale, because temp_scale was already multiplied by */
+ /* 1000 (in t1_tofixed, from psobjs.c). */
+
+ root->units_per_EM = (FT_UShort)FT_DivFix( 1000, temp_scale );
+
+ /* we need to scale the values by 1.0/temp[3] */
+ if ( temp_scale != 0x10000L )
+ {
+ temp[0] = FT_DivFix( temp[0], temp_scale );
+ temp[1] = FT_DivFix( temp[1], temp_scale );
+ temp[2] = FT_DivFix( temp[2], temp_scale );
+ temp[4] = FT_DivFix( temp[4], temp_scale );
+ temp[5] = FT_DivFix( temp[5], temp_scale );
+ temp[3] = 0x10000L;
+ }
+
+ matrix->xx = temp[0];
+ matrix->yx = temp[1];
+ matrix->xy = temp[2];
+ matrix->yy = temp[3];
+
+ /* note that the font offsets are expressed in integer font units */
+ offset->x = temp[4] >> 16;
+ offset->y = temp[5] >> 16;
+ }
+
+ return FT_Err_Ok; /* this is a callback function; */
+ /* we must return an error code */
+ }
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ parse_fd_array( CID_Face face,
+ CID_Parser* parser )
+ {
+ CID_FaceInfo cid = &face->cid;
+ FT_Memory memory = face->root.memory;
+ FT_Error error = FT_Err_Ok;
+ FT_Long num_dicts;
+
+
+ num_dicts = cid_parser_to_int( parser );
+
+ if ( !cid->font_dicts )
+ {
+ FT_Int n;
+
+
+ if ( FT_NEW_ARRAY( cid->font_dicts, num_dicts ) )
+ goto Exit;
+
+ cid->num_dicts = (FT_UInt)num_dicts;
+
+ /* don't forget to set a few defaults */
+ for ( n = 0; n < cid->num_dicts; n++ )
+ {
+ CID_FaceDict dict = cid->font_dicts + n;
+
+
+ /* default value for lenIV */
+ dict->private_dict.lenIV = 4;
+ }
+ }
+
+ Exit:
+ return error;
+ }
+
+
+ /* by mistake, `expansion_factor' appears both in PS_PrivateRec */
+ /* and CID_FaceDictRec (both are public header files and can't */
+ /* changed); we simply copy the value */
+
+ FT_CALLBACK_DEF( FT_Error )
+ parse_expansion_factor( CID_Face face,
+ CID_Parser* parser )
+ {
+ CID_FaceDict dict;
+
+
+ if ( parser->num_dict >= 0 && parser->num_dict < face->cid.num_dicts )
+ {
+ dict = face->cid.font_dicts + parser->num_dict;
+
+ dict->expansion_factor = cid_parser_to_fixed( parser, 0 );
+ dict->private_dict.expansion_factor = dict->expansion_factor;
+ }
+
+ return FT_Err_Ok;
+ }
+
+
+ static
+ const T1_FieldRec cid_field_records[] =
+ {
+
+#include "cidtoken.h"
+
+ T1_FIELD_CALLBACK( "FDArray", parse_fd_array, 0 )
+ T1_FIELD_CALLBACK( "FontMatrix", cid_parse_font_matrix, 0 )
+ T1_FIELD_CALLBACK( "ExpansionFactor", parse_expansion_factor, 0 )
+
+ { 0, T1_FIELD_LOCATION_CID_INFO, T1_FIELD_TYPE_NONE, 0, 0, 0, 0, 0, 0 }
+ };
+
+
+ static FT_Error
+ cid_parse_dict( CID_Face face,
+ CID_Loader* loader,
+ FT_Byte* base,
+ FT_Long size )
+ {
+ CID_Parser* parser = &loader->parser;
+
+
+ parser->root.cursor = base;
+ parser->root.limit = base + size;
+ parser->root.error = FT_Err_Ok;
+
+ {
+ FT_Byte* cur = base;
+ FT_Byte* limit = cur + size;
+
+
+ for (;;)
+ {
+ FT_Byte* newlimit;
+
+
+ parser->root.cursor = cur;
+ cid_parser_skip_spaces( parser );
+
+ if ( parser->root.cursor >= limit )
+ newlimit = limit - 1 - 17;
+ else
+ newlimit = parser->root.cursor - 17;
+
+ /* look for `%ADOBeginFontDict' */
+ for ( ; cur < newlimit; cur++ )
+ {
+ if ( *cur == '%' &&
+ ft_strncmp( (char*)cur, "%ADOBeginFontDict", 17 ) == 0 )
+ {
+ /* if /FDArray was found, then cid->num_dicts is > 0, and */
+ /* we can start increasing parser->num_dict */
+ if ( face->cid.num_dicts > 0 )
+ parser->num_dict++;
+ }
+ }
+
+ cur = parser->root.cursor;
+ /* no error can occur in cid_parser_skip_spaces */
+ if ( cur >= limit )
+ break;
+
+ cid_parser_skip_PS_token( parser );
+ if ( parser->root.cursor >= limit || parser->root.error )
+ break;
+
+ /* look for immediates */
+ if ( *cur == '/' && cur + 2 < limit )
+ {
+ FT_PtrDist len;
+
+
+ cur++;
+ len = parser->root.cursor - cur;
+
+ if ( len > 0 && len < 22 )
+ {
+ /* now compare the immediate name to the keyword table */
+ T1_Field keyword = (T1_Field)cid_field_records;
+
+
+ for (;;)
+ {
+ FT_Byte* name;
+
+
+ name = (FT_Byte*)keyword->ident;
+ if ( !name )
+ break;
+
+ if ( cur[0] == name[0] &&
+ len == (FT_PtrDist)ft_strlen( (const char*)name ) )
+ {
+ FT_PtrDist n;
+
+
+ for ( n = 1; n < len; n++ )
+ if ( cur[n] != name[n] )
+ break;
+
+ if ( n >= len )
+ {
+ /* we found it - run the parsing callback */
+ parser->root.error = cid_load_keyword( face,
+ loader,
+ keyword );
+ if ( parser->root.error )
+ return parser->root.error;
+ break;
+ }
+ }
+ keyword++;
+ }
+ }
+ }
+
+ cur = parser->root.cursor;
+ }
+ }
+ return parser->root.error;
+ }
+
+
+ /* read the subrmap and the subrs of each font dict */
+ static FT_Error
+ cid_read_subrs( CID_Face face )
+ {
+ CID_FaceInfo cid = &face->cid;
+ FT_Memory memory = face->root.memory;
+ FT_Stream stream = face->cid_stream;
+ FT_Error error;
+ FT_Int n;
+ CID_Subrs subr;
+ FT_UInt max_offsets = 0;
+ FT_ULong* offsets = 0;
+ PSAux_Service psaux = (PSAux_Service)face->psaux;
+
+
+ if ( FT_NEW_ARRAY( face->subrs, cid->num_dicts ) )
+ goto Exit;
+
+ subr = face->subrs;
+ for ( n = 0; n < cid->num_dicts; n++, subr++ )
+ {
+ CID_FaceDict dict = cid->font_dicts + n;
+ FT_Int lenIV = dict->private_dict.lenIV;
+ FT_UInt count, num_subrs = dict->num_subrs;
+ FT_ULong data_len;
+ FT_Byte* p;
+
+
+ /* Check for possible overflow. */
+ if ( num_subrs == FT_UINT_MAX )
+ {
+ error = FT_THROW( Syntax_Error );
+ goto Fail;
+ }
+
+ /* reallocate offsets array if needed */
+ if ( num_subrs + 1 > max_offsets )
+ {
+ FT_UInt new_max = FT_PAD_CEIL( num_subrs + 1, 4 );
+
+
+ if ( new_max <= max_offsets )
+ {
+ error = FT_THROW( Syntax_Error );
+ goto Fail;
+ }
+
+ if ( FT_RENEW_ARRAY( offsets, max_offsets, new_max ) )
+ goto Fail;
+
+ max_offsets = new_max;
+ }
+
+ /* read the subrmap's offsets */
+ if ( FT_STREAM_SEEK( cid->data_offset + dict->subrmap_offset ) ||
+ FT_FRAME_ENTER( ( num_subrs + 1 ) * dict->sd_bytes ) )
+ goto Fail;
+
+ p = (FT_Byte*)stream->cursor;
+ for ( count = 0; count <= num_subrs; count++ )
+ offsets[count] = cid_get_offset( &p, (FT_Byte)dict->sd_bytes );
+
+ FT_FRAME_EXIT();
+
+ /* offsets must be ordered */
+ for ( count = 1; count <= num_subrs; count++ )
+ if ( offsets[count - 1] > offsets[count] )
+ goto Fail;
+
+ /* now, compute the size of subrs charstrings, */
+ /* allocate, and read them */
+ data_len = offsets[num_subrs] - offsets[0];
+
+ if ( FT_NEW_ARRAY( subr->code, num_subrs + 1 ) ||
+ FT_ALLOC( subr->code[0], data_len ) )
+ goto Fail;
+
+ if ( FT_STREAM_SEEK( cid->data_offset + offsets[0] ) ||
+ FT_STREAM_READ( subr->code[0], data_len ) )
+ goto Fail;
+
+ /* set up pointers */
+ for ( count = 1; count <= num_subrs; count++ )
+ {
+ FT_ULong len;
+
+
+ len = offsets[count] - offsets[count - 1];
+ subr->code[count] = subr->code[count - 1] + len;
+ }
+
+ /* decrypt subroutines, but only if lenIV >= 0 */
+ if ( lenIV >= 0 )
+ {
+ for ( count = 0; count < num_subrs; count++ )
+ {
+ FT_ULong len;
+
+
+ len = offsets[count + 1] - offsets[count];
+ psaux->t1_decrypt( subr->code[count], len, 4330 );
+ }
+ }
+
+ subr->num_subrs = num_subrs;
+ }
+
+ Exit:
+ FT_FREE( offsets );
+ return error;
+
+ Fail:
+ if ( face->subrs )
+ {
+ for ( n = 0; n < cid->num_dicts; n++ )
+ {
+ if ( face->subrs[n].code )
+ FT_FREE( face->subrs[n].code[0] );
+
+ FT_FREE( face->subrs[n].code );
+ }
+ FT_FREE( face->subrs );
+ }
+ goto Exit;
+ }
+
+
+ static void
+ cid_init_loader( CID_Loader* loader,
+ CID_Face face )
+ {
+ FT_UNUSED( face );
+
+ FT_MEM_ZERO( loader, sizeof ( *loader ) );
+ }
+
+
+ static void
+ cid_done_loader( CID_Loader* loader )
+ {
+ CID_Parser* parser = &loader->parser;
+
+
+ /* finalize parser */
+ cid_parser_done( parser );
+ }
+
+
+ static FT_Error
+ cid_hex_to_binary( FT_Byte* data,
+ FT_Long data_len,
+ FT_ULong offset,
+ CID_Face face )
+ {
+ FT_Stream stream = face->root.stream;
+ FT_Error error;
+
+ FT_Byte buffer[256];
+ FT_Byte *p, *plimit;
+ FT_Byte *d, *dlimit;
+ FT_Byte val;
+
+ FT_Bool upper_nibble, done;
+
+
+ if ( FT_STREAM_SEEK( offset ) )
+ goto Exit;
+
+ d = data;
+ dlimit = d + data_len;
+ p = buffer;
+ plimit = p;
+
+ upper_nibble = 1;
+ done = 0;
+
+ while ( d < dlimit )
+ {
+ if ( p >= plimit )
+ {
+ FT_ULong oldpos = FT_STREAM_POS();
+ FT_ULong size = stream->size - oldpos;
+
+
+ if ( size == 0 )
+ {
+ error = FT_THROW( Syntax_Error );
+ goto Exit;
+ }
+
+ if ( FT_STREAM_READ( buffer, 256 > size ? size : 256 ) )
+ goto Exit;
+ p = buffer;
+ plimit = p + FT_STREAM_POS() - oldpos;
+ }
+
+ if ( ft_isdigit( *p ) )
+ val = (FT_Byte)( *p - '0' );
+ else if ( *p >= 'a' && *p <= 'f' )
+ val = (FT_Byte)( *p - 'a' );
+ else if ( *p >= 'A' && *p <= 'F' )
+ val = (FT_Byte)( *p - 'A' + 10 );
+ else if ( *p == ' ' ||
+ *p == '\t' ||
+ *p == '\r' ||
+ *p == '\n' ||
+ *p == '\f' ||
+ *p == '\0' )
+ {
+ p++;
+ continue;
+ }
+ else if ( *p == '>' )
+ {
+ val = 0;
+ done = 1;
+ }
+ else
+ {
+ error = FT_THROW( Syntax_Error );
+ goto Exit;
+ }
+
+ if ( upper_nibble )
+ *d = (FT_Byte)( val << 4 );
+ else
+ {
+ *d = (FT_Byte)( *d + val );
+ d++;
+ }
+
+ upper_nibble = (FT_Byte)( 1 - upper_nibble );
+
+ if ( done )
+ break;
+
+ p++;
+ }
+
+ error = FT_Err_Ok;
+
+ Exit:
+ return error;
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ cid_face_open( CID_Face face,
+ FT_Int face_index )
+ {
+ CID_Loader loader;
+ CID_Parser* parser;
+ FT_Memory memory = face->root.memory;
+ FT_Error error;
+
+
+ cid_init_loader( &loader, face );
+
+ parser = &loader.parser;
+ error = cid_parser_new( parser, face->root.stream, face->root.memory,
+ (PSAux_Service)face->psaux );
+ if ( error )
+ goto Exit;
+
+ error = cid_parse_dict( face, &loader,
+ parser->postscript,
+ parser->postscript_len );
+ if ( error )
+ goto Exit;
+
+ if ( face_index < 0 )
+ goto Exit;
+
+ if ( FT_NEW( face->cid_stream ) )
+ goto Exit;
+
+ if ( parser->binary_length )
+ {
+ /* we must convert the data section from hexadecimal to binary */
+ if ( FT_ALLOC( face->binary_data, parser->binary_length ) ||
+ cid_hex_to_binary( face->binary_data, parser->binary_length,
+ parser->data_offset, face ) )
+ goto Exit;
+
+ FT_Stream_OpenMemory( face->cid_stream,
+ face->binary_data, parser->binary_length );
+ face->cid.data_offset = 0;
+ }
+ else
+ {
+ *face->cid_stream = *face->root.stream;
+ face->cid.data_offset = loader.parser.data_offset;
+ }
+
+ error = cid_read_subrs( face );
+
+ Exit:
+ cid_done_loader( &loader );
+ return error;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidload.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidload.h
new file mode 100644
index 0000000000..523f7ee92b
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidload.h
@@ -0,0 +1,53 @@
+/***************************************************************************/
+/* */
+/* cidload.h */
+/* */
+/* CID-keyed Type1 font loader (specification). */
+/* */
+/* Copyright 1996-2001, 2002, 2003, 2004 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __CIDLOAD_H__
+#define __CIDLOAD_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "cidparse.h"
+
+
+FT_BEGIN_HEADER
+
+
+ typedef struct CID_Loader_
+ {
+ CID_Parser parser; /* parser used to read the stream */
+ FT_Int num_chars; /* number of characters in encoding */
+
+ } CID_Loader;
+
+
+ FT_LOCAL( FT_Long )
+ cid_get_offset( FT_Byte** start,
+ FT_Byte offsize );
+
+ FT_LOCAL( FT_Error )
+ cid_face_open( CID_Face face,
+ FT_Int face_index );
+
+
+FT_END_HEADER
+
+#endif /* __CIDLOAD_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidobjs.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidobjs.c
new file mode 100644
index 0000000000..7708600d1c
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidobjs.c
@@ -0,0 +1,491 @@
+/***************************************************************************/
+/* */
+/* cidobjs.c */
+/* */
+/* CID objects manager (body). */
+/* */
+/* Copyright 1996-2006, 2008, 2010-2011, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftstream.h"
+
+#include "cidgload.h"
+#include "cidload.h"
+
+#include "../../include/freetype/internal/services/svpscmap.h"
+#include "../../include/freetype/internal/psaux.h"
+#include "../../include/freetype/internal/pshints.h"
+
+#include "ciderrs.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_cidobjs
+
+
+ /*************************************************************************/
+ /* */
+ /* SLOT FUNCTIONS */
+ /* */
+ /*************************************************************************/
+
+ FT_LOCAL_DEF( void )
+ cid_slot_done( FT_GlyphSlot slot )
+ {
+ slot->internal->glyph_hints = 0;
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ cid_slot_init( FT_GlyphSlot slot )
+ {
+ CID_Face face;
+ PSHinter_Service pshinter;
+
+
+ face = (CID_Face)slot->face;
+ pshinter = (PSHinter_Service)face->pshinter;
+
+ if ( pshinter )
+ {
+ FT_Module module;
+
+
+ module = FT_Get_Module( slot->face->driver->root.library,
+ "pshinter" );
+ if ( module )
+ {
+ T1_Hints_Funcs funcs;
+
+
+ funcs = pshinter->get_t1_funcs( module );
+ slot->internal->glyph_hints = (void*)funcs;
+ }
+ }
+
+ return 0;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SIZE FUNCTIONS */
+ /* */
+ /*************************************************************************/
+
+
+ static PSH_Globals_Funcs
+ cid_size_get_globals_funcs( CID_Size size )
+ {
+ CID_Face face = (CID_Face)size->root.face;
+ PSHinter_Service pshinter = (PSHinter_Service)face->pshinter;
+ FT_Module module;
+
+
+ module = FT_Get_Module( size->root.face->driver->root.library,
+ "pshinter" );
+ return ( module && pshinter && pshinter->get_globals_funcs )
+ ? pshinter->get_globals_funcs( module )
+ : 0;
+ }
+
+
+ FT_LOCAL_DEF( void )
+ cid_size_done( FT_Size cidsize ) /* CID_Size */
+ {
+ CID_Size size = (CID_Size)cidsize;
+
+
+ if ( cidsize->internal )
+ {
+ PSH_Globals_Funcs funcs;
+
+
+ funcs = cid_size_get_globals_funcs( size );
+ if ( funcs )
+ funcs->destroy( (PSH_Globals)cidsize->internal );
+
+ cidsize->internal = 0;
+ }
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ cid_size_init( FT_Size cidsize ) /* CID_Size */
+ {
+ CID_Size size = (CID_Size)cidsize;
+ FT_Error error = FT_Err_Ok;
+ PSH_Globals_Funcs funcs = cid_size_get_globals_funcs( size );
+
+
+ if ( funcs )
+ {
+ PSH_Globals globals;
+ CID_Face face = (CID_Face)cidsize->face;
+ CID_FaceDict dict = face->cid.font_dicts + face->root.face_index;
+ PS_Private priv = &dict->private_dict;
+
+
+ error = funcs->create( cidsize->face->memory, priv, &globals );
+ if ( !error )
+ cidsize->internal = (FT_Size_Internal)(void*)globals;
+ }
+
+ return error;
+ }
+
+
+ FT_LOCAL( FT_Error )
+ cid_size_request( FT_Size size,
+ FT_Size_Request req )
+ {
+ PSH_Globals_Funcs funcs;
+
+
+ FT_Request_Metrics( size->face, req );
+
+ funcs = cid_size_get_globals_funcs( (CID_Size)size );
+
+ if ( funcs )
+ funcs->set_scale( (PSH_Globals)size->internal,
+ size->metrics.x_scale,
+ size->metrics.y_scale,
+ 0, 0 );
+
+ return FT_Err_Ok;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* FACE FUNCTIONS */
+ /* */
+ /*************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* cid_face_done */
+ /* */
+ /* <Description> */
+ /* Finalizes a given face object. */
+ /* */
+ /* <Input> */
+ /* face :: A pointer to the face object to destroy. */
+ /* */
+ FT_LOCAL_DEF( void )
+ cid_face_done( FT_Face cidface ) /* CID_Face */
+ {
+ CID_Face face = (CID_Face)cidface;
+ FT_Memory memory;
+ CID_FaceInfo cid;
+ PS_FontInfo info;
+
+
+ if ( !face )
+ return;
+
+ cid = &face->cid;
+ info = &cid->font_info;
+ memory = cidface->memory;
+
+ /* release subrs */
+ if ( face->subrs )
+ {
+ FT_Int n;
+
+
+ for ( n = 0; n < cid->num_dicts; n++ )
+ {
+ CID_Subrs subr = face->subrs + n;
+
+
+ if ( subr->code )
+ {
+ FT_FREE( subr->code[0] );
+ FT_FREE( subr->code );
+ }
+ }
+
+ FT_FREE( face->subrs );
+ }
+
+ /* release FontInfo strings */
+ FT_FREE( info->version );
+ FT_FREE( info->notice );
+ FT_FREE( info->full_name );
+ FT_FREE( info->family_name );
+ FT_FREE( info->weight );
+
+ /* release font dictionaries */
+ FT_FREE( cid->font_dicts );
+ cid->num_dicts = 0;
+
+ /* release other strings */
+ FT_FREE( cid->cid_font_name );
+ FT_FREE( cid->registry );
+ FT_FREE( cid->ordering );
+
+ cidface->family_name = 0;
+ cidface->style_name = 0;
+
+ FT_FREE( face->binary_data );
+ FT_FREE( face->cid_stream );
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* cid_face_init */
+ /* */
+ /* <Description> */
+ /* Initializes a given CID face object. */
+ /* */
+ /* <Input> */
+ /* stream :: The source font stream. */
+ /* */
+ /* face_index :: The index of the font face in the resource. */
+ /* */
+ /* num_params :: Number of additional generic parameters. Ignored. */
+ /* */
+ /* params :: Additional generic parameters. Ignored. */
+ /* */
+ /* <InOut> */
+ /* face :: The newly built face object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ cid_face_init( FT_Stream stream,
+ FT_Face cidface, /* CID_Face */
+ FT_Int face_index,
+ FT_Int num_params,
+ FT_Parameter* params )
+ {
+ CID_Face face = (CID_Face)cidface;
+ FT_Error error;
+ PSAux_Service psaux;
+ PSHinter_Service pshinter;
+
+ FT_UNUSED( num_params );
+ FT_UNUSED( params );
+ FT_UNUSED( stream );
+
+
+ cidface->num_faces = 1;
+
+ psaux = (PSAux_Service)face->psaux;
+ if ( !psaux )
+ {
+ psaux = (PSAux_Service)FT_Get_Module_Interface(
+ FT_FACE_LIBRARY( face ), "psaux" );
+
+ if ( !psaux )
+ {
+ FT_ERROR(( "cid_face_init: cannot access `psaux' module\n" ));
+ error = FT_THROW( Missing_Module );
+ goto Exit;
+ }
+
+ face->psaux = psaux;
+ }
+
+ pshinter = (PSHinter_Service)face->pshinter;
+ if ( !pshinter )
+ {
+ pshinter = (PSHinter_Service)FT_Get_Module_Interface(
+ FT_FACE_LIBRARY( face ), "pshinter" );
+
+ face->pshinter = pshinter;
+ }
+
+ FT_TRACE2(( "CID driver\n" ));
+
+ /* open the tokenizer; this will also check the font format */
+ if ( FT_STREAM_SEEK( 0 ) )
+ goto Exit;
+
+ error = cid_face_open( face, face_index );
+ if ( error )
+ goto Exit;
+
+ /* if we just wanted to check the format, leave successfully now */
+ if ( face_index < 0 )
+ goto Exit;
+
+ /* check the face index */
+ /* XXX: handle CID fonts with more than a single face */
+ if ( face_index != 0 )
+ {
+ FT_ERROR(( "cid_face_init: invalid face index\n" ));
+ error = FT_THROW( Invalid_Argument );
+ goto Exit;
+ }
+
+ /* now load the font program into the face object */
+
+ /* initialize the face object fields */
+
+ /* set up root face fields */
+ {
+ CID_FaceInfo cid = &face->cid;
+ PS_FontInfo info = &cid->font_info;
+
+
+ cidface->num_glyphs = cid->cid_count;
+ cidface->num_charmaps = 0;
+
+ cidface->face_index = face_index;
+ cidface->face_flags = FT_FACE_FLAG_SCALABLE | /* scalable outlines */
+ FT_FACE_FLAG_HORIZONTAL | /* horizontal data */
+ FT_FACE_FLAG_HINTER; /* has native hinter */
+
+ if ( info->is_fixed_pitch )
+ cidface->face_flags |= FT_FACE_FLAG_FIXED_WIDTH;
+
+ /* XXX: TODO: add kerning with .afm support */
+
+ /* get style name -- be careful, some broken fonts only */
+ /* have a /FontName dictionary entry! */
+ cidface->family_name = info->family_name;
+ /* assume "Regular" style if we don't know better */
+ cidface->style_name = (char *)"Regular";
+ if ( cidface->family_name )
+ {
+ char* full = info->full_name;
+ char* family = cidface->family_name;
+
+
+ if ( full )
+ {
+ while ( *full )
+ {
+ if ( *full == *family )
+ {
+ family++;
+ full++;
+ }
+ else
+ {
+ if ( *full == ' ' || *full == '-' )
+ full++;
+ else if ( *family == ' ' || *family == '-' )
+ family++;
+ else
+ {
+ if ( !*family )
+ cidface->style_name = full;
+ break;
+ }
+ }
+ }
+ }
+ }
+ else
+ {
+ /* do we have a `/FontName'? */
+ if ( cid->cid_font_name )
+ cidface->family_name = cid->cid_font_name;
+ }
+
+ /* compute style flags */
+ cidface->style_flags = 0;
+ if ( info->italic_angle )
+ cidface->style_flags |= FT_STYLE_FLAG_ITALIC;
+ if ( info->weight )
+ {
+ if ( !ft_strcmp( info->weight, "Bold" ) ||
+ !ft_strcmp( info->weight, "Black" ) )
+ cidface->style_flags |= FT_STYLE_FLAG_BOLD;
+ }
+
+ /* no embedded bitmap support */
+ cidface->num_fixed_sizes = 0;
+ cidface->available_sizes = 0;
+
+ cidface->bbox.xMin = cid->font_bbox.xMin >> 16;
+ cidface->bbox.yMin = cid->font_bbox.yMin >> 16;
+ /* no `U' suffix here to 0xFFFF! */
+ cidface->bbox.xMax = ( cid->font_bbox.xMax + 0xFFFF ) >> 16;
+ cidface->bbox.yMax = ( cid->font_bbox.yMax + 0xFFFF ) >> 16;
+
+ if ( !cidface->units_per_EM )
+ cidface->units_per_EM = 1000;
+
+ cidface->ascender = (FT_Short)( cidface->bbox.yMax );
+ cidface->descender = (FT_Short)( cidface->bbox.yMin );
+
+ cidface->height = (FT_Short)( ( cidface->units_per_EM * 12 ) / 10 );
+ if ( cidface->height < cidface->ascender - cidface->descender )
+ cidface->height = (FT_Short)( cidface->ascender - cidface->descender );
+
+ cidface->underline_position = (FT_Short)info->underline_position;
+ cidface->underline_thickness = (FT_Short)info->underline_thickness;
+ }
+
+ Exit:
+ return error;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* cid_driver_init */
+ /* */
+ /* <Description> */
+ /* Initializes a given CID driver object. */
+ /* */
+ /* <Input> */
+ /* driver :: A handle to the target driver object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ cid_driver_init( FT_Module driver )
+ {
+ FT_UNUSED( driver );
+
+ return FT_Err_Ok;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* cid_driver_done */
+ /* */
+ /* <Description> */
+ /* Finalizes a given CID driver. */
+ /* */
+ /* <Input> */
+ /* driver :: A handle to the target CID driver. */
+ /* */
+ FT_LOCAL_DEF( void )
+ cid_driver_done( FT_Module driver )
+ {
+ FT_UNUSED( driver );
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidobjs.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidobjs.h
new file mode 100644
index 0000000000..53c4c392f6
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidobjs.h
@@ -0,0 +1,154 @@
+/***************************************************************************/
+/* */
+/* cidobjs.h */
+/* */
+/* CID objects manager (specification). */
+/* */
+/* Copyright 1996-2001, 2002, 2004, 2006 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __CIDOBJS_H__
+#define __CIDOBJS_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/config/ftconfig.h"
+#include "../../include/freetype/internal/t1types.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /* The following structures must be defined by the hinter */
+ typedef struct CID_Size_Hints_ CID_Size_Hints;
+ typedef struct CID_Glyph_Hints_ CID_Glyph_Hints;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* CID_Driver */
+ /* */
+ /* <Description> */
+ /* A handle to a Type 1 driver object. */
+ /* */
+ typedef struct CID_DriverRec_* CID_Driver;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* CID_Size */
+ /* */
+ /* <Description> */
+ /* A handle to a Type 1 size object. */
+ /* */
+ typedef struct CID_SizeRec_* CID_Size;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* CID_GlyphSlot */
+ /* */
+ /* <Description> */
+ /* A handle to a Type 1 glyph slot object. */
+ /* */
+ typedef struct CID_GlyphSlotRec_* CID_GlyphSlot;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* CID_CharMap */
+ /* */
+ /* <Description> */
+ /* A handle to a Type 1 character mapping object. */
+ /* */
+ /* <Note> */
+ /* The Type 1 format doesn't use a charmap but an encoding table. */
+ /* The driver is responsible for making up charmap objects */
+ /* corresponding to these tables. */
+ /* */
+ typedef struct CID_CharMapRec_* CID_CharMap;
+
+
+ /*************************************************************************/
+ /* */
+ /* HERE BEGINS THE TYPE 1 SPECIFIC STUFF */
+ /* */
+ /*************************************************************************/
+
+
+ typedef struct CID_SizeRec_
+ {
+ FT_SizeRec root;
+ FT_Bool valid;
+
+ } CID_SizeRec;
+
+
+ typedef struct CID_GlyphSlotRec_
+ {
+ FT_GlyphSlotRec root;
+
+ FT_Bool hint;
+ FT_Bool scaled;
+
+ FT_Fixed x_scale;
+ FT_Fixed y_scale;
+
+ } CID_GlyphSlotRec;
+
+
+ FT_LOCAL( void )
+ cid_slot_done( FT_GlyphSlot slot );
+
+ FT_LOCAL( FT_Error )
+ cid_slot_init( FT_GlyphSlot slot );
+
+
+ FT_LOCAL( void )
+ cid_size_done( FT_Size size ); /* CID_Size */
+
+ FT_LOCAL( FT_Error )
+ cid_size_init( FT_Size size ); /* CID_Size */
+
+ FT_LOCAL( FT_Error )
+ cid_size_request( FT_Size size, /* CID_Size */
+ FT_Size_Request req );
+
+ FT_LOCAL( FT_Error )
+ cid_face_init( FT_Stream stream,
+ FT_Face face, /* CID_Face */
+ FT_Int face_index,
+ FT_Int num_params,
+ FT_Parameter* params );
+
+ FT_LOCAL( void )
+ cid_face_done( FT_Face face ); /* CID_Face */
+
+
+ FT_LOCAL( FT_Error )
+ cid_driver_init( FT_Module driver );
+
+ FT_LOCAL( void )
+ cid_driver_done( FT_Module driver );
+
+
+FT_END_HEADER
+
+#endif /* __CIDOBJS_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidparse.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidparse.c
new file mode 100644
index 0000000000..dccc4db7f8
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidparse.c
@@ -0,0 +1,225 @@
+/***************************************************************************/
+/* */
+/* cidparse.c */
+/* */
+/* CID-keyed Type1 parser (body). */
+/* */
+/* Copyright 1996-2007, 2009, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/ftstream.h"
+
+#include "cidparse.h"
+
+#include "ciderrs.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_cidparse
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** INPUT STREAM PARSER *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ FT_LOCAL_DEF( FT_Error )
+ cid_parser_new( CID_Parser* parser,
+ FT_Stream stream,
+ FT_Memory memory,
+ PSAux_Service psaux )
+ {
+ FT_Error error;
+ FT_ULong base_offset, offset, ps_len;
+ FT_Byte *cur, *limit;
+ FT_Byte *arg1, *arg2;
+
+
+ FT_MEM_ZERO( parser, sizeof ( *parser ) );
+ psaux->ps_parser_funcs->init( &parser->root, 0, 0, memory );
+
+ parser->stream = stream;
+
+ base_offset = FT_STREAM_POS();
+
+ /* first of all, check the font format in the header */
+ if ( FT_FRAME_ENTER( 31 ) )
+ goto Exit;
+
+ if ( ft_strncmp( (char *)stream->cursor,
+ "%!PS-Adobe-3.0 Resource-CIDFont", 31 ) )
+ {
+ FT_TRACE2(( " not a CID-keyed font\n" ));
+ error = FT_THROW( Unknown_File_Format );
+ }
+
+ FT_FRAME_EXIT();
+ if ( error )
+ goto Exit;
+
+ Again:
+ /* now, read the rest of the file until we find */
+ /* `StartData' or `/sfnts' */
+ {
+ FT_Byte buffer[256 + 10];
+ FT_Long read_len = 256 + 10; /* same as signed FT_Stream->size */
+ FT_Byte* p = buffer;
+
+
+ for ( offset = FT_STREAM_POS(); ; offset += 256 )
+ {
+ FT_Long stream_len; /* same as signed FT_Stream->size */
+
+
+ stream_len = stream->size - FT_STREAM_POS();
+ if ( stream_len == 0 )
+ {
+ FT_TRACE2(( "cid_parser_new: no `StartData' keyword found\n" ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+ read_len = FT_MIN( read_len, stream_len );
+ if ( FT_STREAM_READ( p, read_len ) )
+ goto Exit;
+
+ if ( read_len < 256 )
+ p[read_len] = '\0';
+
+ limit = p + read_len - 10;
+
+ for ( p = buffer; p < limit; p++ )
+ {
+ if ( p[0] == 'S' && ft_strncmp( (char*)p, "StartData", 9 ) == 0 )
+ {
+ /* save offset of binary data after `StartData' */
+ offset += (FT_ULong)( p - buffer + 10 );
+ goto Found;
+ }
+ else if ( p[1] == 's' && ft_strncmp( (char*)p, "/sfnts", 6 ) == 0 )
+ {
+ offset += (FT_ULong)( p - buffer + 7 );
+ goto Found;
+ }
+ }
+
+ FT_MEM_MOVE( buffer, p, 10 );
+ read_len = 256;
+ p = buffer + 10;
+ }
+ }
+
+ Found:
+ /* We have found the start of the binary data or the `/sfnts' token. */
+ /* Now rewind and extract the frame corresponding to this PostScript */
+ /* section. */
+
+ ps_len = offset - base_offset;
+ if ( FT_STREAM_SEEK( base_offset ) ||
+ FT_FRAME_EXTRACT( ps_len, parser->postscript ) )
+ goto Exit;
+
+ parser->data_offset = offset;
+ parser->postscript_len = ps_len;
+ parser->root.base = parser->postscript;
+ parser->root.cursor = parser->postscript;
+ parser->root.limit = parser->root.cursor + ps_len;
+ parser->num_dict = -1;
+
+ /* Finally, we check whether `StartData' or `/sfnts' was real -- */
+ /* it could be in a comment or string. We also get the arguments */
+ /* of `StartData' to find out whether the data is represented in */
+ /* binary or hex format. */
+
+ arg1 = parser->root.cursor;
+ cid_parser_skip_PS_token( parser );
+ cid_parser_skip_spaces ( parser );
+ arg2 = parser->root.cursor;
+ cid_parser_skip_PS_token( parser );
+ cid_parser_skip_spaces ( parser );
+
+ limit = parser->root.limit;
+ cur = parser->root.cursor;
+
+ while ( cur < limit )
+ {
+ if ( parser->root.error )
+ {
+ error = parser->root.error;
+ goto Exit;
+ }
+
+ if ( cur[0] == 'S' && ft_strncmp( (char*)cur, "StartData", 9 ) == 0 )
+ {
+ if ( ft_strncmp( (char*)arg1, "(Hex)", 5 ) == 0 )
+ parser->binary_length = ft_atol( (const char *)arg2 );
+
+ limit = parser->root.limit;
+ cur = parser->root.cursor;
+ goto Exit;
+ }
+ else if ( cur[1] == 's' && ft_strncmp( (char*)cur, "/sfnts", 6 ) == 0 )
+ {
+ FT_TRACE2(( "cid_parser_new: cannot handle Type 11 fonts\n" ));
+ error = FT_THROW( Unknown_File_Format );
+ goto Exit;
+ }
+
+ cid_parser_skip_PS_token( parser );
+ cid_parser_skip_spaces ( parser );
+ arg1 = arg2;
+ arg2 = cur;
+ cur = parser->root.cursor;
+ }
+
+ /* we haven't found the correct `StartData'; go back and continue */
+ /* searching */
+ FT_FRAME_RELEASE( parser->postscript );
+ if ( !FT_STREAM_SEEK( offset ) )
+ goto Again;
+
+ Exit:
+ return error;
+ }
+
+
+ FT_LOCAL_DEF( void )
+ cid_parser_done( CID_Parser* parser )
+ {
+ /* always free the private dictionary */
+ if ( parser->postscript )
+ {
+ FT_Stream stream = parser->stream;
+
+
+ FT_FRAME_RELEASE( parser->postscript );
+ }
+ parser->root.funcs.done( &parser->root );
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidparse.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidparse.h
new file mode 100644
index 0000000000..46284d2380
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidparse.h
@@ -0,0 +1,123 @@
+/***************************************************************************/
+/* */
+/* cidparse.h */
+/* */
+/* CID-keyed Type1 parser (specification). */
+/* */
+/* Copyright 1996-2001, 2002, 2003, 2004 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __CIDPARSE_H__
+#define __CIDPARSE_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/t1types.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/internal/psaux.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* CID_Parser */
+ /* */
+ /* <Description> */
+ /* A CID_Parser is an object used to parse a Type 1 fonts very */
+ /* quickly. */
+ /* */
+ /* <Fields> */
+ /* root :: The root PS_ParserRec fields. */
+ /* */
+ /* stream :: The current input stream. */
+ /* */
+ /* postscript :: A pointer to the data to be parsed. */
+ /* */
+ /* postscript_len :: The length of the data to be parsed. */
+ /* */
+ /* data_offset :: The start position of the binary data (i.e., the */
+ /* end of the data to be parsed. */
+ /* */
+ /* binary_length :: The length of the data after the `StartData' */
+ /* command if the data format is hexadecimal. */
+ /* */
+ /* cid :: A structure which holds the information about */
+ /* the current font. */
+ /* */
+ /* num_dict :: The number of font dictionaries. */
+ /* */
+ typedef struct CID_Parser_
+ {
+ PS_ParserRec root;
+ FT_Stream stream;
+
+ FT_Byte* postscript;
+ FT_Long postscript_len;
+
+ FT_ULong data_offset;
+
+ FT_Long binary_length;
+
+ CID_FaceInfo cid;
+ FT_Int num_dict;
+
+ } CID_Parser;
+
+
+ FT_LOCAL( FT_Error )
+ cid_parser_new( CID_Parser* parser,
+ FT_Stream stream,
+ FT_Memory memory,
+ PSAux_Service psaux );
+
+ FT_LOCAL( void )
+ cid_parser_done( CID_Parser* parser );
+
+
+ /*************************************************************************/
+ /* */
+ /* PARSING ROUTINES */
+ /* */
+ /*************************************************************************/
+
+#define cid_parser_skip_spaces( p ) \
+ (p)->root.funcs.skip_spaces( &(p)->root )
+#define cid_parser_skip_PS_token( p ) \
+ (p)->root.funcs.skip_PS_token( &(p)->root )
+
+#define cid_parser_to_int( p ) (p)->root.funcs.to_int( &(p)->root )
+#define cid_parser_to_fixed( p, t ) (p)->root.funcs.to_fixed( &(p)->root, t )
+
+#define cid_parser_to_coord_array( p, m, c ) \
+ (p)->root.funcs.to_coord_array( &(p)->root, m, c )
+#define cid_parser_to_fixed_array( p, m, f, t ) \
+ (p)->root.funcs.to_fixed_array( &(p)->root, m, f, t )
+#define cid_parser_to_token( p, t ) \
+ (p)->root.funcs.to_token( &(p)->root, t )
+#define cid_parser_to_token_array( p, t, m, c ) \
+ (p)->root.funcs.to_token_array( &(p)->root, t, m, c )
+
+#define cid_parser_load_field( p, f, o ) \
+ (p)->root.funcs.load_field( &(p)->root, f, o, 0, 0 )
+#define cid_parser_load_field_table( p, f, o ) \
+ (p)->root.funcs.load_field_table( &(p)->root, f, o, 0, 0 )
+
+
+FT_END_HEADER
+
+#endif /* __CIDPARSE_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidriver.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidriver.c
new file mode 100644
index 0000000000..37d251fb80
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidriver.c
@@ -0,0 +1,236 @@
+/***************************************************************************/
+/* */
+/* cidriver.c */
+/* */
+/* CID driver interface (body). */
+/* */
+/* Copyright 1996-2004, 2006, 2008, 2009, 2011, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "cidriver.h"
+#include "cidgload.h"
+#include "../../include/freetype/internal/ftdebug.h"
+
+#include "ciderrs.h"
+
+#include "../../include/freetype/internal/services/svpostnm.h"
+#include "../../include/freetype/internal/services/svxf86nm.h"
+#include "../../include/freetype/internal/services/svpsinfo.h"
+#include "../../include/freetype/internal/services/svcid.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_ciddriver
+
+
+ /*
+ * POSTSCRIPT NAME SERVICE
+ *
+ */
+
+ static const char*
+ cid_get_postscript_name( CID_Face face )
+ {
+ const char* result = face->cid.cid_font_name;
+
+
+ if ( result && result[0] == '/' )
+ result++;
+
+ return result;
+ }
+
+
+ static const FT_Service_PsFontNameRec cid_service_ps_name =
+ {
+ (FT_PsName_GetFunc) cid_get_postscript_name
+ };
+
+
+ /*
+ * POSTSCRIPT INFO SERVICE
+ *
+ */
+
+ static FT_Error
+ cid_ps_get_font_info( FT_Face face,
+ PS_FontInfoRec* afont_info )
+ {
+ *afont_info = ((CID_Face)face)->cid.font_info;
+
+ return FT_Err_Ok;
+ }
+
+ static FT_Error
+ cid_ps_get_font_extra( FT_Face face,
+ PS_FontExtraRec* afont_extra )
+ {
+ *afont_extra = ((CID_Face)face)->font_extra;
+
+ return FT_Err_Ok;
+ }
+
+ static const FT_Service_PsInfoRec cid_service_ps_info =
+ {
+ (PS_GetFontInfoFunc) cid_ps_get_font_info,
+ (PS_GetFontExtraFunc) cid_ps_get_font_extra,
+ (PS_HasGlyphNamesFunc) NULL, /* unsupported with CID fonts */
+ (PS_GetFontPrivateFunc)NULL, /* unsupported */
+ (PS_GetFontValueFunc) NULL /* not implemented */
+ };
+
+
+ /*
+ * CID INFO SERVICE
+ *
+ */
+ static FT_Error
+ cid_get_ros( CID_Face face,
+ const char* *registry,
+ const char* *ordering,
+ FT_Int *supplement )
+ {
+ CID_FaceInfo cid = &face->cid;
+
+
+ if ( registry )
+ *registry = cid->registry;
+
+ if ( ordering )
+ *ordering = cid->ordering;
+
+ if ( supplement )
+ *supplement = cid->supplement;
+
+ return FT_Err_Ok;
+ }
+
+
+ static FT_Error
+ cid_get_is_cid( CID_Face face,
+ FT_Bool *is_cid )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_UNUSED( face );
+
+
+ if ( is_cid )
+ *is_cid = 1; /* cid driver is only used for CID keyed fonts */
+
+ return error;
+ }
+
+
+ static FT_Error
+ cid_get_cid_from_glyph_index( CID_Face face,
+ FT_UInt glyph_index,
+ FT_UInt *cid )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_UNUSED( face );
+
+
+ if ( cid )
+ *cid = glyph_index; /* identity mapping */
+
+ return error;
+ }
+
+
+ static const FT_Service_CIDRec cid_service_cid_info =
+ {
+ (FT_CID_GetRegistryOrderingSupplementFunc)cid_get_ros,
+ (FT_CID_GetIsInternallyCIDKeyedFunc) cid_get_is_cid,
+ (FT_CID_GetCIDFromGlyphIndexFunc) cid_get_cid_from_glyph_index
+ };
+
+
+ /*
+ * SERVICE LIST
+ *
+ */
+
+ static const FT_ServiceDescRec cid_services[] =
+ {
+ { FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_CID },
+ { FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &cid_service_ps_name },
+ { FT_SERVICE_ID_POSTSCRIPT_INFO, &cid_service_ps_info },
+ { FT_SERVICE_ID_CID, &cid_service_cid_info },
+ { NULL, NULL }
+ };
+
+
+ FT_CALLBACK_DEF( FT_Module_Interface )
+ cid_get_interface( FT_Module module,
+ const char* cid_interface )
+ {
+ FT_UNUSED( module );
+
+ return ft_service_list_lookup( cid_services, cid_interface );
+ }
+
+
+
+ FT_CALLBACK_TABLE_DEF
+ const FT_Driver_ClassRec t1cid_driver_class =
+ {
+ /* first of all, the FT_Module_Class fields */
+ {
+ FT_MODULE_FONT_DRIVER |
+ FT_MODULE_DRIVER_SCALABLE |
+ FT_MODULE_DRIVER_HAS_HINTER,
+
+ sizeof ( FT_DriverRec ),
+ "t1cid", /* module name */
+ 0x10000L, /* version 1.0 of driver */
+ 0x20000L, /* requires FreeType 2.0 */
+
+ 0,
+
+ cid_driver_init,
+ cid_driver_done,
+ cid_get_interface
+ },
+
+ /* then the other font drivers fields */
+ sizeof ( CID_FaceRec ),
+ sizeof ( CID_SizeRec ),
+ sizeof ( CID_GlyphSlotRec ),
+
+ cid_face_init,
+ cid_face_done,
+
+ cid_size_init,
+ cid_size_done,
+ cid_slot_init,
+ cid_slot_done,
+
+ cid_slot_load_glyph,
+
+ 0, /* FT_Face_GetKerningFunc */
+ 0, /* FT_Face_AttachFunc */
+
+ 0, /* FT_Face_GetAdvancesFunc */
+
+ cid_size_request,
+ 0 /* FT_Size_SelectFunc */
+ };
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidriver.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidriver.h
new file mode 100644
index 0000000000..fe98bf34e9
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidriver.h
@@ -0,0 +1,43 @@
+/***************************************************************************/
+/* */
+/* cidriver.h */
+/* */
+/* High-level CID driver interface (specification). */
+/* */
+/* Copyright 1996-2001, 2002 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __CIDRIVER_H__
+#define __CIDRIVER_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdriver.h"
+
+
+FT_BEGIN_HEADER
+
+#ifdef FT_CONFIG_OPTION_PIC
+#error "this module does not support PIC yet"
+#endif
+
+
+ FT_CALLBACK_TABLE
+ const FT_Driver_ClassRec t1cid_driver_class;
+
+
+FT_END_HEADER
+
+#endif /* __CIDRIVER_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidtoken.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidtoken.h
new file mode 100644
index 0000000000..904cb09cf4
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/cidtoken.h
@@ -0,0 +1,112 @@
+/***************************************************************************/
+/* */
+/* cidtoken.h */
+/* */
+/* CID token definitions (specification only). */
+/* */
+/* Copyright 1996-2001, 2002, 2003, 2006, 2008, 2009 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#undef FT_STRUCTURE
+#define FT_STRUCTURE CID_FaceInfoRec
+#undef T1CODE
+#define T1CODE T1_FIELD_LOCATION_CID_INFO
+
+ T1_FIELD_KEY ( "CIDFontName", cid_font_name, 0 )
+ T1_FIELD_FIXED ( "CIDFontVersion", cid_version, 0 )
+ T1_FIELD_NUM ( "CIDFontType", cid_font_type, 0 )
+ T1_FIELD_STRING( "Registry", registry, 0 )
+ T1_FIELD_STRING( "Ordering", ordering, 0 )
+ T1_FIELD_NUM ( "Supplement", supplement, 0 )
+ T1_FIELD_NUM ( "UIDBase", uid_base, 0 )
+ T1_FIELD_NUM ( "CIDMapOffset", cidmap_offset, 0 )
+ T1_FIELD_NUM ( "FDBytes", fd_bytes, 0 )
+ T1_FIELD_NUM ( "GDBytes", gd_bytes, 0 )
+ T1_FIELD_NUM ( "CIDCount", cid_count, 0 )
+
+
+#undef FT_STRUCTURE
+#define FT_STRUCTURE PS_FontInfoRec
+#undef T1CODE
+#define T1CODE T1_FIELD_LOCATION_FONT_INFO
+
+ T1_FIELD_STRING( "version", version, 0 )
+ T1_FIELD_STRING( "Notice", notice, 0 )
+ T1_FIELD_STRING( "FullName", full_name, 0 )
+ T1_FIELD_STRING( "FamilyName", family_name, 0 )
+ T1_FIELD_STRING( "Weight", weight, 0 )
+ T1_FIELD_NUM ( "ItalicAngle", italic_angle, 0 )
+ T1_FIELD_BOOL ( "isFixedPitch", is_fixed_pitch, 0 )
+ T1_FIELD_NUM ( "UnderlinePosition", underline_position, 0 )
+ T1_FIELD_NUM ( "UnderlineThickness", underline_thickness, 0 )
+
+#undef FT_STRUCTURE
+#define FT_STRUCTURE PS_FontExtraRec
+#undef T1CODE
+#define T1CODE T1_FIELD_LOCATION_FONT_EXTRA
+
+ T1_FIELD_NUM ( "FSType", fs_type, 0 )
+
+
+#undef FT_STRUCTURE
+#define FT_STRUCTURE CID_FaceDictRec
+#undef T1CODE
+#define T1CODE T1_FIELD_LOCATION_FONT_DICT
+
+ T1_FIELD_NUM ( "PaintType", paint_type, 0 )
+ T1_FIELD_NUM ( "FontType", font_type, 0 )
+ T1_FIELD_NUM ( "SubrMapOffset", subrmap_offset, 0 )
+ T1_FIELD_NUM ( "SDBytes", sd_bytes, 0 )
+ T1_FIELD_NUM ( "SubrCount", num_subrs, 0 )
+ T1_FIELD_NUM ( "lenBuildCharArray", len_buildchar, 0 )
+ T1_FIELD_FIXED( "ForceBoldThreshold", forcebold_threshold, 0 )
+ T1_FIELD_FIXED( "StrokeWidth", stroke_width, 0 )
+
+
+#undef FT_STRUCTURE
+#define FT_STRUCTURE PS_PrivateRec
+#undef T1CODE
+#define T1CODE T1_FIELD_LOCATION_PRIVATE
+
+ T1_FIELD_NUM ( "UniqueID", unique_id, 0 )
+ T1_FIELD_NUM ( "lenIV", lenIV, 0 )
+ T1_FIELD_NUM ( "LanguageGroup", language_group, 0 )
+ T1_FIELD_NUM ( "password", password, 0 )
+
+ T1_FIELD_FIXED_1000( "BlueScale", blue_scale, 0 )
+ T1_FIELD_NUM ( "BlueShift", blue_shift, 0 )
+ T1_FIELD_NUM ( "BlueFuzz", blue_fuzz, 0 )
+
+ T1_FIELD_NUM_TABLE ( "BlueValues", blue_values, 14, 0 )
+ T1_FIELD_NUM_TABLE ( "OtherBlues", other_blues, 10, 0 )
+ T1_FIELD_NUM_TABLE ( "FamilyBlues", family_blues, 14, 0 )
+ T1_FIELD_NUM_TABLE ( "FamilyOtherBlues", family_other_blues, 10, 0 )
+
+ T1_FIELD_NUM_TABLE2( "StdHW", standard_width, 1, 0 )
+ T1_FIELD_NUM_TABLE2( "StdVW", standard_height, 1, 0 )
+ T1_FIELD_NUM_TABLE2( "MinFeature", min_feature, 2, 0 )
+
+ T1_FIELD_NUM_TABLE ( "StemSnapH", snap_widths, 12, 0 )
+ T1_FIELD_NUM_TABLE ( "StemSnapV", snap_heights, 12, 0 )
+
+ T1_FIELD_BOOL ( "ForceBold", force_bold, 0 )
+
+
+#undef FT_STRUCTURE
+#define FT_STRUCTURE FT_BBox
+#undef T1CODE
+#define T1CODE T1_FIELD_LOCATION_BBOX
+
+ T1_FIELD_BBOX( "FontBBox", xMin, 0 )
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/fxft_type1cid.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/fxft_type1cid.c
new file mode 100644
index 0000000000..fe755718c7
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/fxft_type1cid.c
@@ -0,0 +1,33 @@
+#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501
+/***************************************************************************/
+/* */
+/* type1cid.c */
+/* */
+/* FreeType OpenType driver component (body only). */
+/* */
+/* Copyright 1996-2001 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#define FT_MAKE_OPTION_SINGLE_OBJECT
+#define FT2_BUILD_LIBRARY
+
+#include "../../include/ft2build.h"
+#include "cidparse.c"
+#include "cidload.c"
+#include "cidobjs.c"
+#include "cidriver.c"
+#include "cidgload.c"
+
+
+/* END */
+#endif
+
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/module.mk b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/module.mk
new file mode 100644
index 0000000000..ce30bfd7ae
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/module.mk
@@ -0,0 +1,23 @@
+#
+# FreeType 2 CID module definition
+#
+
+
+# Copyright 1996-2000, 2006 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT. By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+
+FTMODULE_H_COMMANDS += TYPE1CID_DRIVER
+
+define TYPE1CID_DRIVER
+$(OPEN_DRIVER) FT_Driver_ClassRec, t1cid_driver_class $(CLOSE_DRIVER)
+$(ECHO_DRIVER)cid $(ECHO_DRIVER_DESC)Postscript CID-keyed fonts, no known extension$(ECHO_DRIVER_DONE)
+endef
+
+# EOF
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/rules.mk b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/rules.mk
new file mode 100644
index 0000000000..f362744612
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/cid/rules.mk
@@ -0,0 +1,70 @@
+#
+# FreeType 2 CID driver configuration rules
+#
+
+
+# Copyright 1996-2000, 2001, 2003 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT. By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+
+# CID driver directory
+#
+CID_DIR := $(SRC_DIR)/cid
+
+
+CID_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(CID_DIR))
+
+
+# CID driver sources (i.e., C files)
+#
+CID_DRV_SRC := $(CID_DIR)/cidparse.c \
+ $(CID_DIR)/cidload.c \
+ $(CID_DIR)/cidriver.c \
+ $(CID_DIR)/cidgload.c \
+ $(CID_DIR)/cidobjs.c
+
+# CID driver headers
+#
+CID_DRV_H := $(CID_DRV_SRC:%.c=%.h) \
+ $(CID_DIR)/cidtoken.h \
+ $(CID_DIR)/ciderrs.h
+
+
+# CID driver object(s)
+#
+# CID_DRV_OBJ_M is used during `multi' builds
+# CID_DRV_OBJ_S is used during `single' builds
+#
+CID_DRV_OBJ_M := $(CID_DRV_SRC:$(CID_DIR)/%.c=$(OBJ_DIR)/%.$O)
+CID_DRV_OBJ_S := $(OBJ_DIR)/type1cid.$O
+
+# CID driver source file for single build
+#
+CID_DRV_SRC_S := $(CID_DIR)/type1cid.c
+
+
+# CID driver - single object
+#
+$(CID_DRV_OBJ_S): $(CID_DRV_SRC_S) $(CID_DRV_SRC) $(FREETYPE_H) $(CID_DRV_H)
+ $(CID_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(CID_DRV_SRC_S))
+
+
+# CID driver - multiple objects
+#
+$(OBJ_DIR)/%.$O: $(CID_DIR)/%.c $(FREETYPE_H) $(CID_DRV_H)
+ $(CID_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)
+
+
+# update main driver object lists
+#
+DRV_OBJS_S += $(CID_DRV_OBJ_S)
+DRV_OBJS_M += $(CID_DRV_OBJ_M)
+
+
+# EOF
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/Jamfile b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/Jamfile
new file mode 100644
index 0000000000..faeded9044
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/Jamfile
@@ -0,0 +1,31 @@
+# FreeType 2 src/psaux Jamfile
+#
+# Copyright 2001, 2002 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT. By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+SubDir FT2_TOP $(FT2_SRC_DIR) psaux ;
+
+{
+ local _sources ;
+
+ if $(FT2_MULTI)
+ {
+ _sources = psauxmod psobjs t1decode t1cmap
+ psconv afmparse
+ ;
+ }
+ else
+ {
+ _sources = psaux ;
+ }
+
+ Library $(FT2_LIB) : $(_sources).c ;
+}
+
+# end of src/psaux Jamfile
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/afmparse.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/afmparse.c
new file mode 100644
index 0000000000..9a1cd3d6c1
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/afmparse.c
@@ -0,0 +1,964 @@
+/***************************************************************************/
+/* */
+/* afmparse.c */
+/* */
+/* AFM parser (body). */
+/* */
+/* Copyright 2006-2010, 2012, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/freetype.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/psaux.h"
+
+#include "afmparse.h"
+#include "psconv.h"
+
+#include "psauxerr.h"
+
+
+/***************************************************************************/
+/* */
+/* AFM_Stream */
+/* */
+/* The use of AFM_Stream is largely inspired by parseAFM.[ch] from t1lib. */
+/* */
+/* */
+
+ enum
+ {
+ AFM_STREAM_STATUS_NORMAL,
+ AFM_STREAM_STATUS_EOC,
+ AFM_STREAM_STATUS_EOL,
+ AFM_STREAM_STATUS_EOF
+ };
+
+
+ typedef struct AFM_StreamRec_
+ {
+ FT_Byte* cursor;
+ FT_Byte* base;
+ FT_Byte* limit;
+
+ FT_Int status;
+
+ } AFM_StreamRec;
+
+
+#ifndef EOF
+#define EOF -1
+#endif
+
+
+ /* this works because empty lines are ignored */
+#define AFM_IS_NEWLINE( ch ) ( (ch) == '\r' || (ch) == '\n' )
+
+#define AFM_IS_EOF( ch ) ( (ch) == EOF || (ch) == '\x1a' )
+#define AFM_IS_SPACE( ch ) ( (ch) == ' ' || (ch) == '\t' )
+
+ /* column separator; there is no `column' in the spec actually */
+#define AFM_IS_SEP( ch ) ( (ch) == ';' )
+
+#define AFM_GETC() \
+ ( ( (stream)->cursor < (stream)->limit ) ? *(stream)->cursor++ \
+ : EOF )
+
+#define AFM_STREAM_KEY_BEGIN( stream ) \
+ (char*)( (stream)->cursor - 1 )
+
+#define AFM_STREAM_KEY_LEN( stream, key ) \
+ ( (char*)(stream)->cursor - key - 1 )
+
+#define AFM_STATUS_EOC( stream ) \
+ ( (stream)->status >= AFM_STREAM_STATUS_EOC )
+
+#define AFM_STATUS_EOL( stream ) \
+ ( (stream)->status >= AFM_STREAM_STATUS_EOL )
+
+#define AFM_STATUS_EOF( stream ) \
+ ( (stream)->status >= AFM_STREAM_STATUS_EOF )
+
+
+ static int
+ afm_stream_skip_spaces( AFM_Stream stream )
+ {
+ int ch = 0; /* make stupid compiler happy */
+
+
+ if ( AFM_STATUS_EOC( stream ) )
+ return ';';
+
+ while ( 1 )
+ {
+ ch = AFM_GETC();
+ if ( !AFM_IS_SPACE( ch ) )
+ break;
+ }
+
+ if ( AFM_IS_NEWLINE( ch ) )
+ stream->status = AFM_STREAM_STATUS_EOL;
+ else if ( AFM_IS_SEP( ch ) )
+ stream->status = AFM_STREAM_STATUS_EOC;
+ else if ( AFM_IS_EOF( ch ) )
+ stream->status = AFM_STREAM_STATUS_EOF;
+
+ return ch;
+ }
+
+
+ /* read a key or value in current column */
+ static char*
+ afm_stream_read_one( AFM_Stream stream )
+ {
+ char* str;
+
+
+ afm_stream_skip_spaces( stream );
+ if ( AFM_STATUS_EOC( stream ) )
+ return NULL;
+
+ str = AFM_STREAM_KEY_BEGIN( stream );
+
+ while ( 1 )
+ {
+ int ch = AFM_GETC();
+
+
+ if ( AFM_IS_SPACE( ch ) )
+ break;
+ else if ( AFM_IS_NEWLINE( ch ) )
+ {
+ stream->status = AFM_STREAM_STATUS_EOL;
+ break;
+ }
+ else if ( AFM_IS_SEP( ch ) )
+ {
+ stream->status = AFM_STREAM_STATUS_EOC;
+ break;
+ }
+ else if ( AFM_IS_EOF( ch ) )
+ {
+ stream->status = AFM_STREAM_STATUS_EOF;
+ break;
+ }
+ }
+
+ return str;
+ }
+
+
+ /* read a string (i.e., read to EOL) */
+ static char*
+ afm_stream_read_string( AFM_Stream stream )
+ {
+ char* str;
+
+
+ afm_stream_skip_spaces( stream );
+ if ( AFM_STATUS_EOL( stream ) )
+ return NULL;
+
+ str = AFM_STREAM_KEY_BEGIN( stream );
+
+ /* scan to eol */
+ while ( 1 )
+ {
+ int ch = AFM_GETC();
+
+
+ if ( AFM_IS_NEWLINE( ch ) )
+ {
+ stream->status = AFM_STREAM_STATUS_EOL;
+ break;
+ }
+ else if ( AFM_IS_EOF( ch ) )
+ {
+ stream->status = AFM_STREAM_STATUS_EOF;
+ break;
+ }
+ }
+
+ return str;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* AFM_Parser */
+ /* */
+ /* */
+
+ /* all keys defined in Ch. 7-10 of 5004.AFM_Spec.pdf */
+ typedef enum AFM_Token_
+ {
+ AFM_TOKEN_ASCENDER,
+ AFM_TOKEN_AXISLABEL,
+ AFM_TOKEN_AXISTYPE,
+ AFM_TOKEN_B,
+ AFM_TOKEN_BLENDAXISTYPES,
+ AFM_TOKEN_BLENDDESIGNMAP,
+ AFM_TOKEN_BLENDDESIGNPOSITIONS,
+ AFM_TOKEN_C,
+ AFM_TOKEN_CC,
+ AFM_TOKEN_CH,
+ AFM_TOKEN_CAPHEIGHT,
+ AFM_TOKEN_CHARWIDTH,
+ AFM_TOKEN_CHARACTERSET,
+ AFM_TOKEN_CHARACTERS,
+ AFM_TOKEN_DESCENDER,
+ AFM_TOKEN_ENCODINGSCHEME,
+ AFM_TOKEN_ENDAXIS,
+ AFM_TOKEN_ENDCHARMETRICS,
+ AFM_TOKEN_ENDCOMPOSITES,
+ AFM_TOKEN_ENDDIRECTION,
+ AFM_TOKEN_ENDFONTMETRICS,
+ AFM_TOKEN_ENDKERNDATA,
+ AFM_TOKEN_ENDKERNPAIRS,
+ AFM_TOKEN_ENDTRACKKERN,
+ AFM_TOKEN_ESCCHAR,
+ AFM_TOKEN_FAMILYNAME,
+ AFM_TOKEN_FONTBBOX,
+ AFM_TOKEN_FONTNAME,
+ AFM_TOKEN_FULLNAME,
+ AFM_TOKEN_ISBASEFONT,
+ AFM_TOKEN_ISCIDFONT,
+ AFM_TOKEN_ISFIXEDPITCH,
+ AFM_TOKEN_ISFIXEDV,
+ AFM_TOKEN_ITALICANGLE,
+ AFM_TOKEN_KP,
+ AFM_TOKEN_KPH,
+ AFM_TOKEN_KPX,
+ AFM_TOKEN_KPY,
+ AFM_TOKEN_L,
+ AFM_TOKEN_MAPPINGSCHEME,
+ AFM_TOKEN_METRICSSETS,
+ AFM_TOKEN_N,
+ AFM_TOKEN_NOTICE,
+ AFM_TOKEN_PCC,
+ AFM_TOKEN_STARTAXIS,
+ AFM_TOKEN_STARTCHARMETRICS,
+ AFM_TOKEN_STARTCOMPOSITES,
+ AFM_TOKEN_STARTDIRECTION,
+ AFM_TOKEN_STARTFONTMETRICS,
+ AFM_TOKEN_STARTKERNDATA,
+ AFM_TOKEN_STARTKERNPAIRS,
+ AFM_TOKEN_STARTKERNPAIRS0,
+ AFM_TOKEN_STARTKERNPAIRS1,
+ AFM_TOKEN_STARTTRACKKERN,
+ AFM_TOKEN_STDHW,
+ AFM_TOKEN_STDVW,
+ AFM_TOKEN_TRACKKERN,
+ AFM_TOKEN_UNDERLINEPOSITION,
+ AFM_TOKEN_UNDERLINETHICKNESS,
+ AFM_TOKEN_VV,
+ AFM_TOKEN_VVECTOR,
+ AFM_TOKEN_VERSION,
+ AFM_TOKEN_W,
+ AFM_TOKEN_W0,
+ AFM_TOKEN_W0X,
+ AFM_TOKEN_W0Y,
+ AFM_TOKEN_W1,
+ AFM_TOKEN_W1X,
+ AFM_TOKEN_W1Y,
+ AFM_TOKEN_WX,
+ AFM_TOKEN_WY,
+ AFM_TOKEN_WEIGHT,
+ AFM_TOKEN_WEIGHTVECTOR,
+ AFM_TOKEN_XHEIGHT,
+ N_AFM_TOKENS,
+ AFM_TOKEN_UNKNOWN
+
+ } AFM_Token;
+
+
+ static const char* const afm_key_table[N_AFM_TOKENS] =
+ {
+ "Ascender",
+ "AxisLabel",
+ "AxisType",
+ "B",
+ "BlendAxisTypes",
+ "BlendDesignMap",
+ "BlendDesignPositions",
+ "C",
+ "CC",
+ "CH",
+ "CapHeight",
+ "CharWidth",
+ "CharacterSet",
+ "Characters",
+ "Descender",
+ "EncodingScheme",
+ "EndAxis",
+ "EndCharMetrics",
+ "EndComposites",
+ "EndDirection",
+ "EndFontMetrics",
+ "EndKernData",
+ "EndKernPairs",
+ "EndTrackKern",
+ "EscChar",
+ "FamilyName",
+ "FontBBox",
+ "FontName",
+ "FullName",
+ "IsBaseFont",
+ "IsCIDFont",
+ "IsFixedPitch",
+ "IsFixedV",
+ "ItalicAngle",
+ "KP",
+ "KPH",
+ "KPX",
+ "KPY",
+ "L",
+ "MappingScheme",
+ "MetricsSets",
+ "N",
+ "Notice",
+ "PCC",
+ "StartAxis",
+ "StartCharMetrics",
+ "StartComposites",
+ "StartDirection",
+ "StartFontMetrics",
+ "StartKernData",
+ "StartKernPairs",
+ "StartKernPairs0",
+ "StartKernPairs1",
+ "StartTrackKern",
+ "StdHW",
+ "StdVW",
+ "TrackKern",
+ "UnderlinePosition",
+ "UnderlineThickness",
+ "VV",
+ "VVector",
+ "Version",
+ "W",
+ "W0",
+ "W0X",
+ "W0Y",
+ "W1",
+ "W1X",
+ "W1Y",
+ "WX",
+ "WY",
+ "Weight",
+ "WeightVector",
+ "XHeight"
+ };
+
+
+ /*
+ * `afm_parser_read_vals' and `afm_parser_next_key' provide
+ * high-level operations to an AFM_Stream. The rest of the
+ * parser functions should use them without accessing the
+ * AFM_Stream directly.
+ */
+
+ FT_LOCAL_DEF( FT_Int )
+ afm_parser_read_vals( AFM_Parser parser,
+ AFM_Value vals,
+ FT_UInt n )
+ {
+ AFM_Stream stream = parser->stream;
+ char* str;
+ FT_UInt i;
+
+
+ if ( n > AFM_MAX_ARGUMENTS )
+ return 0;
+
+ for ( i = 0; i < n; i++ )
+ {
+ FT_Offset len;
+ AFM_Value val = vals + i;
+
+
+ if ( val->type == AFM_VALUE_TYPE_STRING )
+ str = afm_stream_read_string( stream );
+ else
+ str = afm_stream_read_one( stream );
+
+ if ( !str )
+ break;
+
+ len = AFM_STREAM_KEY_LEN( stream, str );
+
+ switch ( val->type )
+ {
+ case AFM_VALUE_TYPE_STRING:
+ case AFM_VALUE_TYPE_NAME:
+ {
+ FT_Memory memory = parser->memory;
+ FT_Error error;
+
+
+ if ( !FT_QALLOC( val->u.s, len + 1 ) )
+ {
+ ft_memcpy( val->u.s, str, len );
+ val->u.s[len] = '\0';
+ }
+ }
+ break;
+
+ case AFM_VALUE_TYPE_FIXED:
+ val->u.f = PS_Conv_ToFixed( (FT_Byte**)(void*)&str,
+ (FT_Byte*)str + len, 0 );
+ break;
+
+ case AFM_VALUE_TYPE_INTEGER:
+ val->u.i = PS_Conv_ToInt( (FT_Byte**)(void*)&str,
+ (FT_Byte*)str + len );
+ break;
+
+ case AFM_VALUE_TYPE_BOOL:
+ val->u.b = FT_BOOL( len == 4 &&
+ !ft_strncmp( str, "true", 4 ) );
+ break;
+
+ case AFM_VALUE_TYPE_INDEX:
+ if ( parser->get_index )
+ val->u.i = parser->get_index( str, len, parser->user_data );
+ else
+ val->u.i = 0;
+ break;
+ }
+ }
+
+ return i;
+ }
+
+
+ FT_LOCAL_DEF( char* )
+ afm_parser_next_key( AFM_Parser parser,
+ FT_Bool line,
+ FT_Offset* len )
+ {
+ AFM_Stream stream = parser->stream;
+ char* key = 0; /* make stupid compiler happy */
+
+
+ if ( line )
+ {
+ while ( 1 )
+ {
+ /* skip current line */
+ if ( !AFM_STATUS_EOL( stream ) )
+ afm_stream_read_string( stream );
+
+ stream->status = AFM_STREAM_STATUS_NORMAL;
+ key = afm_stream_read_one( stream );
+
+ /* skip empty line */
+ if ( !key &&
+ !AFM_STATUS_EOF( stream ) &&
+ AFM_STATUS_EOL( stream ) )
+ continue;
+
+ break;
+ }
+ }
+ else
+ {
+ while ( 1 )
+ {
+ /* skip current column */
+ while ( !AFM_STATUS_EOC( stream ) )
+ afm_stream_read_one( stream );
+
+ stream->status = AFM_STREAM_STATUS_NORMAL;
+ key = afm_stream_read_one( stream );
+
+ /* skip empty column */
+ if ( !key &&
+ !AFM_STATUS_EOF( stream ) &&
+ AFM_STATUS_EOC( stream ) )
+ continue;
+
+ break;
+ }
+ }
+
+ if ( len )
+ *len = ( key ) ? (FT_Offset)AFM_STREAM_KEY_LEN( stream, key )
+ : 0;
+
+ return key;
+ }
+
+
+ static AFM_Token
+ afm_tokenize( const char* key,
+ FT_Offset len )
+ {
+ int n;
+
+
+ for ( n = 0; n < N_AFM_TOKENS; n++ )
+ {
+ if ( *( afm_key_table[n] ) == *key )
+ {
+ for ( ; n < N_AFM_TOKENS; n++ )
+ {
+ if ( *( afm_key_table[n] ) != *key )
+ return AFM_TOKEN_UNKNOWN;
+
+ if ( ft_strncmp( afm_key_table[n], key, len ) == 0 )
+ return (AFM_Token) n;
+ }
+ }
+ }
+
+ return AFM_TOKEN_UNKNOWN;
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ afm_parser_init( AFM_Parser parser,
+ FT_Memory memory,
+ FT_Byte* base,
+ FT_Byte* limit )
+ {
+ AFM_Stream stream = NULL;
+ FT_Error error;
+
+
+ if ( FT_NEW( stream ) )
+ return error;
+
+ stream->cursor = stream->base = base;
+ stream->limit = limit;
+
+ /* don't skip the first line during the first call */
+ stream->status = AFM_STREAM_STATUS_EOL;
+
+ parser->memory = memory;
+ parser->stream = stream;
+ parser->FontInfo = NULL;
+ parser->get_index = NULL;
+
+ return FT_Err_Ok;
+ }
+
+
+ FT_LOCAL( void )
+ afm_parser_done( AFM_Parser parser )
+ {
+ FT_Memory memory = parser->memory;
+
+
+ FT_FREE( parser->stream );
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ afm_parser_read_int( AFM_Parser parser,
+ FT_Int* aint )
+ {
+ AFM_ValueRec val;
+
+
+ val.type = AFM_VALUE_TYPE_INTEGER;
+
+ if ( afm_parser_read_vals( parser, &val, 1 ) == 1 )
+ {
+ *aint = val.u.i;
+
+ return FT_Err_Ok;
+ }
+ else
+ return FT_THROW( Syntax_Error );
+ }
+
+
+ static FT_Error
+ afm_parse_track_kern( AFM_Parser parser )
+ {
+ AFM_FontInfo fi = parser->FontInfo;
+ AFM_TrackKern tk;
+ char* key;
+ FT_Offset len;
+ int n = -1;
+
+
+ if ( afm_parser_read_int( parser, &fi->NumTrackKern ) )
+ goto Fail;
+
+ if ( fi->NumTrackKern )
+ {
+ FT_Memory memory = parser->memory;
+ FT_Error error;
+
+
+ if ( FT_QNEW_ARRAY( fi->TrackKerns, fi->NumTrackKern ) )
+ return error;
+ }
+
+ while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 )
+ {
+ AFM_ValueRec shared_vals[5];
+
+
+ switch ( afm_tokenize( key, len ) )
+ {
+ case AFM_TOKEN_TRACKKERN:
+ n++;
+
+ if ( n >= fi->NumTrackKern )
+ goto Fail;
+
+ tk = fi->TrackKerns + n;
+
+ shared_vals[0].type = AFM_VALUE_TYPE_INTEGER;
+ shared_vals[1].type = AFM_VALUE_TYPE_FIXED;
+ shared_vals[2].type = AFM_VALUE_TYPE_FIXED;
+ shared_vals[3].type = AFM_VALUE_TYPE_FIXED;
+ shared_vals[4].type = AFM_VALUE_TYPE_FIXED;
+ if ( afm_parser_read_vals( parser, shared_vals, 5 ) != 5 )
+ goto Fail;
+
+ tk->degree = shared_vals[0].u.i;
+ tk->min_ptsize = shared_vals[1].u.f;
+ tk->min_kern = shared_vals[2].u.f;
+ tk->max_ptsize = shared_vals[3].u.f;
+ tk->max_kern = shared_vals[4].u.f;
+
+ break;
+
+ case AFM_TOKEN_ENDTRACKKERN:
+ case AFM_TOKEN_ENDKERNDATA:
+ case AFM_TOKEN_ENDFONTMETRICS:
+ fi->NumTrackKern = n + 1;
+ return FT_Err_Ok;
+
+ case AFM_TOKEN_UNKNOWN:
+ break;
+
+ default:
+ goto Fail;
+ }
+ }
+
+ Fail:
+ return FT_THROW( Syntax_Error );
+ }
+
+
+#undef KERN_INDEX
+#define KERN_INDEX( g1, g2 ) ( ( (FT_ULong)g1 << 16 ) | g2 )
+
+
+ /* compare two kerning pairs */
+ FT_CALLBACK_DEF( int )
+ afm_compare_kern_pairs( const void* a,
+ const void* b )
+ {
+ AFM_KernPair kp1 = (AFM_KernPair)a;
+ AFM_KernPair kp2 = (AFM_KernPair)b;
+
+ FT_ULong index1 = KERN_INDEX( kp1->index1, kp1->index2 );
+ FT_ULong index2 = KERN_INDEX( kp2->index1, kp2->index2 );
+
+
+ if ( index1 > index2 )
+ return 1;
+ else if ( index1 < index2 )
+ return -1;
+ else
+ return 0;
+ }
+
+
+ static FT_Error
+ afm_parse_kern_pairs( AFM_Parser parser )
+ {
+ AFM_FontInfo fi = parser->FontInfo;
+ AFM_KernPair kp;
+ char* key;
+ FT_Offset len;
+ int n = -1;
+
+
+ if ( afm_parser_read_int( parser, &fi->NumKernPair ) )
+ goto Fail;
+
+ if ( fi->NumKernPair )
+ {
+ FT_Memory memory = parser->memory;
+ FT_Error error;
+
+
+ if ( FT_QNEW_ARRAY( fi->KernPairs, fi->NumKernPair ) )
+ return error;
+ }
+
+ while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 )
+ {
+ AFM_Token token = afm_tokenize( key, len );
+
+
+ switch ( token )
+ {
+ case AFM_TOKEN_KP:
+ case AFM_TOKEN_KPX:
+ case AFM_TOKEN_KPY:
+ {
+ FT_Int r;
+ AFM_ValueRec shared_vals[4];
+
+
+ n++;
+
+ if ( n >= fi->NumKernPair )
+ goto Fail;
+
+ kp = fi->KernPairs + n;
+
+ shared_vals[0].type = AFM_VALUE_TYPE_INDEX;
+ shared_vals[1].type = AFM_VALUE_TYPE_INDEX;
+ shared_vals[2].type = AFM_VALUE_TYPE_INTEGER;
+ shared_vals[3].type = AFM_VALUE_TYPE_INTEGER;
+ r = afm_parser_read_vals( parser, shared_vals, 4 );
+ if ( r < 3 )
+ goto Fail;
+
+ kp->index1 = shared_vals[0].u.i;
+ kp->index2 = shared_vals[1].u.i;
+ if ( token == AFM_TOKEN_KPY )
+ {
+ kp->x = 0;
+ kp->y = shared_vals[2].u.i;
+ }
+ else
+ {
+ kp->x = shared_vals[2].u.i;
+ kp->y = ( token == AFM_TOKEN_KP && r == 4 )
+ ? shared_vals[3].u.i : 0;
+ }
+ }
+ break;
+
+ case AFM_TOKEN_ENDKERNPAIRS:
+ case AFM_TOKEN_ENDKERNDATA:
+ case AFM_TOKEN_ENDFONTMETRICS:
+ fi->NumKernPair = n + 1;
+ ft_qsort( fi->KernPairs, fi->NumKernPair,
+ sizeof ( AFM_KernPairRec ),
+ afm_compare_kern_pairs );
+ return FT_Err_Ok;
+
+ case AFM_TOKEN_UNKNOWN:
+ break;
+
+ default:
+ goto Fail;
+ }
+ }
+
+ Fail:
+ return FT_THROW( Syntax_Error );
+ }
+
+
+ static FT_Error
+ afm_parse_kern_data( AFM_Parser parser )
+ {
+ FT_Error error;
+ char* key;
+ FT_Offset len;
+
+
+ while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 )
+ {
+ switch ( afm_tokenize( key, len ) )
+ {
+ case AFM_TOKEN_STARTTRACKKERN:
+ error = afm_parse_track_kern( parser );
+ if ( error )
+ return error;
+ break;
+
+ case AFM_TOKEN_STARTKERNPAIRS:
+ case AFM_TOKEN_STARTKERNPAIRS0:
+ error = afm_parse_kern_pairs( parser );
+ if ( error )
+ return error;
+ break;
+
+ case AFM_TOKEN_ENDKERNDATA:
+ case AFM_TOKEN_ENDFONTMETRICS:
+ return FT_Err_Ok;
+
+ case AFM_TOKEN_UNKNOWN:
+ break;
+
+ default:
+ goto Fail;
+ }
+ }
+
+ Fail:
+ return FT_THROW( Syntax_Error );
+ }
+
+
+ static FT_Error
+ afm_parser_skip_section( AFM_Parser parser,
+ FT_UInt n,
+ AFM_Token end_section )
+ {
+ char* key;
+ FT_Offset len;
+
+
+ while ( n-- > 0 )
+ {
+ key = afm_parser_next_key( parser, 1, NULL );
+ if ( !key )
+ goto Fail;
+ }
+
+ while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 )
+ {
+ AFM_Token token = afm_tokenize( key, len );
+
+
+ if ( token == end_section || token == AFM_TOKEN_ENDFONTMETRICS )
+ return FT_Err_Ok;
+ }
+
+ Fail:
+ return FT_THROW( Syntax_Error );
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ afm_parser_parse( AFM_Parser parser )
+ {
+ FT_Memory memory = parser->memory;
+ AFM_FontInfo fi = parser->FontInfo;
+ FT_Error error = FT_ERR( Syntax_Error );
+ char* key;
+ FT_Offset len;
+ FT_Int metrics_sets = 0;
+
+
+ if ( !fi )
+ return FT_THROW( Invalid_Argument );
+
+ key = afm_parser_next_key( parser, 1, &len );
+ if ( !key || len != 16 ||
+ ft_strncmp( key, "StartFontMetrics", 16 ) != 0 )
+ return FT_THROW( Unknown_File_Format );
+
+ while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 )
+ {
+ AFM_ValueRec shared_vals[4];
+
+
+ switch ( afm_tokenize( key, len ) )
+ {
+ case AFM_TOKEN_METRICSSETS:
+ if ( afm_parser_read_int( parser, &metrics_sets ) )
+ goto Fail;
+
+ if ( metrics_sets != 0 && metrics_sets != 2 )
+ {
+ error = FT_THROW( Unimplemented_Feature );
+
+ goto Fail;
+ }
+ break;
+
+ case AFM_TOKEN_ISCIDFONT:
+ shared_vals[0].type = AFM_VALUE_TYPE_BOOL;
+ if ( afm_parser_read_vals( parser, shared_vals, 1 ) != 1 )
+ goto Fail;
+
+ fi->IsCIDFont = shared_vals[0].u.b;
+ break;
+
+ case AFM_TOKEN_FONTBBOX:
+ shared_vals[0].type = AFM_VALUE_TYPE_FIXED;
+ shared_vals[1].type = AFM_VALUE_TYPE_FIXED;
+ shared_vals[2].type = AFM_VALUE_TYPE_FIXED;
+ shared_vals[3].type = AFM_VALUE_TYPE_FIXED;
+ if ( afm_parser_read_vals( parser, shared_vals, 4 ) != 4 )
+ goto Fail;
+
+ fi->FontBBox.xMin = shared_vals[0].u.f;
+ fi->FontBBox.yMin = shared_vals[1].u.f;
+ fi->FontBBox.xMax = shared_vals[2].u.f;
+ fi->FontBBox.yMax = shared_vals[3].u.f;
+ break;
+
+ case AFM_TOKEN_ASCENDER:
+ shared_vals[0].type = AFM_VALUE_TYPE_FIXED;
+ if ( afm_parser_read_vals( parser, shared_vals, 1 ) != 1 )
+ goto Fail;
+
+ fi->Ascender = shared_vals[0].u.f;
+ break;
+
+ case AFM_TOKEN_DESCENDER:
+ shared_vals[0].type = AFM_VALUE_TYPE_FIXED;
+ if ( afm_parser_read_vals( parser, shared_vals, 1 ) != 1 )
+ goto Fail;
+
+ fi->Descender = shared_vals[0].u.f;
+ break;
+
+ case AFM_TOKEN_STARTCHARMETRICS:
+ {
+ FT_Int n = 0;
+
+
+ if ( afm_parser_read_int( parser, &n ) )
+ goto Fail;
+
+ error = afm_parser_skip_section( parser, n,
+ AFM_TOKEN_ENDCHARMETRICS );
+ if ( error )
+ return error;
+ }
+ break;
+
+ case AFM_TOKEN_STARTKERNDATA:
+ error = afm_parse_kern_data( parser );
+ if ( error )
+ goto Fail;
+ /* fall through since we only support kern data */
+
+ case AFM_TOKEN_ENDFONTMETRICS:
+ return FT_Err_Ok;
+
+ default:
+ break;
+ }
+ }
+
+ Fail:
+ FT_FREE( fi->TrackKerns );
+ fi->NumTrackKern = 0;
+
+ FT_FREE( fi->KernPairs );
+ fi->NumKernPair = 0;
+
+ fi->IsCIDFont = 0;
+
+ return error;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/afmparse.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/afmparse.h
new file mode 100644
index 0000000000..ffa60d4aab
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/afmparse.h
@@ -0,0 +1,88 @@
+/***************************************************************************/
+/* */
+/* afmparse.h */
+/* */
+/* AFM parser (specification). */
+/* */
+/* Copyright 2006 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __AFMPARSE_H__
+#define __AFMPARSE_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/psaux.h"
+
+
+FT_BEGIN_HEADER
+
+
+ FT_LOCAL( FT_Error )
+ afm_parser_init( AFM_Parser parser,
+ FT_Memory memory,
+ FT_Byte* base,
+ FT_Byte* limit );
+
+
+ FT_LOCAL( void )
+ afm_parser_done( AFM_Parser parser );
+
+
+ FT_LOCAL( FT_Error )
+ afm_parser_parse( AFM_Parser parser );
+
+
+ enum AFM_ValueType_
+ {
+ AFM_VALUE_TYPE_STRING,
+ AFM_VALUE_TYPE_NAME,
+ AFM_VALUE_TYPE_FIXED, /* real number */
+ AFM_VALUE_TYPE_INTEGER,
+ AFM_VALUE_TYPE_BOOL,
+ AFM_VALUE_TYPE_INDEX /* glyph index */
+ };
+
+
+ typedef struct AFM_ValueRec_
+ {
+ enum AFM_ValueType_ type;
+ union
+ {
+ char* s;
+ FT_Fixed f;
+ FT_Int i;
+ FT_Bool b;
+
+ } u;
+
+ } AFM_ValueRec, *AFM_Value;
+
+#define AFM_MAX_ARGUMENTS 5
+
+ FT_LOCAL( FT_Int )
+ afm_parser_read_vals( AFM_Parser parser,
+ AFM_Value vals,
+ FT_UInt n );
+
+ /* read the next key from the next line or column */
+ FT_LOCAL( char* )
+ afm_parser_next_key( AFM_Parser parser,
+ FT_Bool line,
+ FT_Offset* len );
+
+FT_END_HEADER
+
+#endif /* __AFMPARSE_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/fxft_psaux.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/fxft_psaux.c
new file mode 100644
index 0000000000..59aad0483f
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/fxft_psaux.c
@@ -0,0 +1,38 @@
+#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501
+/***************************************************************************/
+/* */
+/* psaux.c */
+/* */
+/* FreeType auxiliary PostScript driver component (body only). */
+/* */
+/* Copyright 1996-2001, 2002, 2006 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#define FT_MAKE_OPTION_SINGLE_OBJECT
+#define FT2_BUILD_LIBRARY
+
+#include "../../include/ft2build.h"
+#include "psobjs.c"
+#include "psauxmod.c"
+#include "t1decode.c"
+#include "t1cmap.c"
+
+#ifndef T1_CONFIG_OPTION_NO_AFM
+#include "afmparse.c"
+#endif
+
+#include "psconv.c"
+
+
+/* END */
+#endif
+
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/module.mk b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/module.mk
new file mode 100644
index 0000000000..42bf6f5199
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/module.mk
@@ -0,0 +1,23 @@
+#
+# FreeType 2 PSaux module definition
+#
+
+
+# Copyright 1996-2000, 2006 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT. By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+
+FTMODULE_H_COMMANDS += PSAUX_MODULE
+
+define PSAUX_MODULE
+$(OPEN_DRIVER) FT_Module_Class, psaux_module_class $(CLOSE_DRIVER)
+$(ECHO_DRIVER)psaux $(ECHO_DRIVER_DESC)Postscript Type 1 & Type 2 helper module$(ECHO_DRIVER_DONE)
+endef
+
+# EOF
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psauxerr.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psauxerr.h
new file mode 100644
index 0000000000..257f17a32d
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psauxerr.h
@@ -0,0 +1,42 @@
+/***************************************************************************/
+/* */
+/* psauxerr.h */
+/* */
+/* PS auxiliary module error codes (specification only). */
+/* */
+/* Copyright 2001, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* This file is used to define the PS auxiliary module error enumeration */
+ /* constants. */
+ /* */
+ /*************************************************************************/
+
+#ifndef __PSAUXERR_H__
+#define __PSAUXERR_H__
+
+#include "../../include/freetype/ftmoderr.h"
+
+#undef __FTERRORS_H__
+
+#undef FT_ERR_PREFIX
+#define FT_ERR_PREFIX PSaux_Err_
+#define FT_ERR_BASE FT_Mod_Err_PSaux
+
+#include "../../include/freetype/fterrors.h"
+
+#endif /* __PSAUXERR_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psauxmod.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psauxmod.c
new file mode 100644
index 0000000000..f8d886651e
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psauxmod.c
@@ -0,0 +1,139 @@
+/***************************************************************************/
+/* */
+/* psauxmod.c */
+/* */
+/* FreeType auxiliary PostScript module implementation (body). */
+/* */
+/* Copyright 2000-2001, 2002, 2003, 2006 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "psauxmod.h"
+#include "psobjs.h"
+#include "t1decode.h"
+#include "t1cmap.h"
+
+#ifndef T1_CONFIG_OPTION_NO_AFM
+#include "afmparse.h"
+#endif
+
+
+ FT_CALLBACK_TABLE_DEF
+ const PS_Table_FuncsRec ps_table_funcs =
+ {
+ ps_table_new,
+ ps_table_done,
+ ps_table_add,
+ ps_table_release
+ };
+
+
+ FT_CALLBACK_TABLE_DEF
+ const PS_Parser_FuncsRec ps_parser_funcs =
+ {
+ ps_parser_init,
+ ps_parser_done,
+ ps_parser_skip_spaces,
+ ps_parser_skip_PS_token,
+ ps_parser_to_int,
+ ps_parser_to_fixed,
+ ps_parser_to_bytes,
+ ps_parser_to_coord_array,
+ ps_parser_to_fixed_array,
+ ps_parser_to_token,
+ ps_parser_to_token_array,
+ ps_parser_load_field,
+ ps_parser_load_field_table
+ };
+
+
+ FT_CALLBACK_TABLE_DEF
+ const T1_Builder_FuncsRec t1_builder_funcs =
+ {
+ t1_builder_init,
+ t1_builder_done,
+ t1_builder_check_points,
+ t1_builder_add_point,
+ t1_builder_add_point1,
+ t1_builder_add_contour,
+ t1_builder_start_point,
+ t1_builder_close_contour
+ };
+
+
+ FT_CALLBACK_TABLE_DEF
+ const T1_Decoder_FuncsRec t1_decoder_funcs =
+ {
+ t1_decoder_init,
+ t1_decoder_done,
+ t1_decoder_parse_charstrings
+ };
+
+
+#ifndef T1_CONFIG_OPTION_NO_AFM
+ FT_CALLBACK_TABLE_DEF
+ const AFM_Parser_FuncsRec afm_parser_funcs =
+ {
+ afm_parser_init,
+ afm_parser_done,
+ afm_parser_parse
+ };
+#endif
+
+
+ FT_CALLBACK_TABLE_DEF
+ const T1_CMap_ClassesRec t1_cmap_classes =
+ {
+ &t1_cmap_standard_class_rec,
+ &t1_cmap_expert_class_rec,
+ &t1_cmap_custom_class_rec,
+ &t1_cmap_unicode_class_rec
+ };
+
+
+ static
+ const PSAux_Interface psaux_interface =
+ {
+ &ps_table_funcs,
+ &ps_parser_funcs,
+ &t1_builder_funcs,
+ &t1_decoder_funcs,
+ t1_decrypt,
+
+ (const T1_CMap_ClassesRec*) &t1_cmap_classes,
+
+#ifndef T1_CONFIG_OPTION_NO_AFM
+ &afm_parser_funcs,
+#else
+ 0,
+#endif
+ };
+
+
+ FT_CALLBACK_TABLE_DEF
+ const FT_Module_Class psaux_module_class =
+ {
+ 0,
+ sizeof ( FT_ModuleRec ),
+ "psaux",
+ 0x20000L,
+ 0x20000L,
+
+ &psaux_interface, /* module-specific interface */
+
+ (FT_Module_Constructor)0,
+ (FT_Module_Destructor) 0,
+ (FT_Module_Requester) 0
+ };
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psauxmod.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psauxmod.h
new file mode 100644
index 0000000000..cf677ed8b4
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psauxmod.h
@@ -0,0 +1,42 @@
+/***************************************************************************/
+/* */
+/* psauxmod.h */
+/* */
+/* FreeType auxiliary PostScript module implementation (specification). */
+/* */
+/* Copyright 2000-2001 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __PSAUXMOD_H__
+#define __PSAUXMOD_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/ftmodapi.h"
+
+
+FT_BEGIN_HEADER
+
+#ifdef FT_CONFIG_OPTION_PIC
+#error "this module does not support PIC yet"
+#endif
+
+
+ FT_EXPORT_VAR( const FT_Module_Class ) psaux_driver_class;
+
+
+FT_END_HEADER
+
+#endif /* __PSAUXMOD_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psconv.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psconv.c
new file mode 100644
index 0000000000..22e2f7d9ba
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psconv.c
@@ -0,0 +1,641 @@
+/***************************************************************************/
+/* */
+/* psconv.c */
+/* */
+/* Some convenience conversions (body). */
+/* */
+/* Copyright 2006, 2008, 2009, 2012-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/psaux.h"
+#include "../../include/freetype/internal/ftdebug.h"
+
+#include "psconv.h"
+#include "psauxerr.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_psconv
+
+
+ /* The following array is used by various functions to quickly convert */
+ /* digits (both decimal and non-decimal) into numbers. */
+
+#if 'A' == 65
+ /* ASCII */
+
+ static const FT_Char ft_char_table[128] =
+ {
+ /* 0x00 */
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1,
+ -1, 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, -1, -1, -1, -1, -1,
+ -1, 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, -1, -1, -1, -1, -1,
+ };
+
+ /* no character >= 0x80 can represent a valid number */
+#define OP >=
+
+#endif /* 'A' == 65 */
+
+#if 'A' == 193
+ /* EBCDIC */
+
+ static const FT_Char ft_char_table[128] =
+ {
+ /* 0x80 */
+ -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, -1, -1, -1, -1, -1, -1,
+ -1, 19, 20, 21, 22, 23, 24, 25, 26, 27, -1, -1, -1, -1, -1, -1,
+ -1, -1, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, -1, -1, -1, -1, -1, -1,
+ -1, 19, 20, 21, 22, 23, 24, 25, 26, 27, -1, -1, -1, -1, -1, -1,
+ -1, -1, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, -1,
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1,
+ };
+
+ /* no character < 0x80 can represent a valid number */
+#define OP <
+
+#endif /* 'A' == 193 */
+
+
+ FT_LOCAL_DEF( FT_Long )
+ PS_Conv_Strtol( FT_Byte** cursor,
+ FT_Byte* limit,
+ FT_Long base )
+ {
+ FT_Byte* p = *cursor;
+
+ FT_Long num = 0;
+ FT_Bool sign = 0;
+ FT_Bool have_overflow = 0;
+
+ FT_Long num_limit;
+ FT_Char c_limit;
+
+
+ if ( p >= limit )
+ goto Bad;
+
+ if ( base < 2 || base > 36 )
+ {
+ FT_TRACE4(( "!!!INVALID BASE:!!!" ));
+ return 0;
+ }
+
+ if ( *p == '-' || *p == '+' )
+ {
+ sign = FT_BOOL( *p == '-' );
+
+ p++;
+ if ( p == limit )
+ goto Bad;
+ }
+
+ num_limit = 0x7FFFFFFFL / base;
+ c_limit = (FT_Char)( 0x7FFFFFFFL % base );
+
+ for ( ; p < limit; p++ )
+ {
+ FT_Char c;
+
+
+ if ( IS_PS_SPACE( *p ) || *p OP 0x80 )
+ break;
+
+ c = ft_char_table[*p & 0x7f];
+
+ if ( c < 0 || c >= base )
+ break;
+
+ if ( num > num_limit || ( num == num_limit && c > c_limit ) )
+ have_overflow = 1;
+ else
+ num = num * base + c;
+ }
+
+ *cursor = p;
+
+ if ( have_overflow )
+ {
+ num = 0x7FFFFFFFL;
+ FT_TRACE4(( "!!!OVERFLOW:!!!" ));
+ }
+
+ if ( sign )
+ num = -num;
+
+ return num;
+
+ Bad:
+ FT_TRACE4(( "!!!END OF DATA:!!!" ));
+ return 0;
+ }
+
+
+ FT_LOCAL_DEF( FT_Long )
+ PS_Conv_ToInt( FT_Byte** cursor,
+ FT_Byte* limit )
+
+ {
+ FT_Byte* p = *cursor;
+ FT_Byte* curp;
+
+ FT_Long num;
+
+
+ curp = p;
+ num = PS_Conv_Strtol( &p, limit, 10 );
+
+ if ( p == curp )
+ return 0;
+
+ if ( p < limit && *p == '#' )
+ {
+ p++;
+
+ curp = p;
+ num = PS_Conv_Strtol( &p, limit, num );
+
+ if ( p == curp )
+ return 0;
+ }
+
+ *cursor = p;
+
+ return num;
+ }
+
+
+ FT_LOCAL_DEF( FT_Fixed )
+ PS_Conv_ToFixed( FT_Byte** cursor,
+ FT_Byte* limit,
+ FT_Long power_ten )
+ {
+ FT_Byte* p = *cursor;
+ FT_Byte* curp;
+ // Fix the Vulnerability Report FoxIT Reader - MSVR-10-0077.
+ // We must use 64-bit integer to avoid overflow. If there is some 64-bit integer support.
+ // Since some platform doesn't support 64-bit integer, then use integer instead.
+#if defined(FT_INT64)
+ FT_INT64 integral = 0;
+ FT_INT64 decimal = 0;
+#else
+ FT_Long integral;
+ FT_Long decimal = 0;
+ FT_Int temp0 = 65536;
+ FT_Int temp1 = power_ten;
+#endif
+ FT_Long divider = 1;
+
+ FT_Bool sign = 0;
+ FT_Bool have_overflow = 0;
+ FT_Bool have_underflow = 0;
+
+ if ( p >= limit )
+ goto Bad;
+
+ if ( *p == '-' || *p == '+' )
+ {
+ sign = FT_BOOL( *p == '-' );
+
+ p++;
+ if ( p == limit )
+ goto Bad;
+ }
+
+ /* read the integer part */
+ if ( *p != '.' )
+ {
+ curp = p;
+
+ // Fix the Vulnerability Report FoxIT Reader - MSVR-10-0077.
+ // Limited to the fix-point mechanism, we have no choice now to crop the value domain.
+ // Do accurate overflow check if FT_INT64 supported, otherwise vague check.
+#if defined(FT_INT64)
+ integral = ((FT_INT64)PS_Conv_ToInt( &p, limit )) << 16;
+#else
+ // We use 'power_ten' and 2^16 to compute the coefficient.
+ //while ( temp1 > 0 ) { temp0 *= 10; temp1 --; }
+ //while ( temp1 < 0 ) { temp0 /= 10; temp1 ++; }
+
+ integral = PS_Conv_ToInt( &p, limit );
+ if ( p == curp )
+ return 0;
+ if ( integral > 0x7FFF )
+ have_overflow = 1;
+ else
+ integral = integral << 16;
+#endif
+ }
+
+ /* read the decimal part */
+ if ( p < limit && *p == '.' )
+ {
+ p++;
+
+ for ( ; p < limit; p++ )
+ {
+ FT_Char c;
+
+
+ if ( IS_PS_SPACE( *p ) || *p OP 0x80 )
+ break;
+
+ c = ft_char_table[*p & 0x7f];
+
+ if ( c < 0 || c >= 10 )
+ break;
+
+ if ( decimal < 0xCCCCCCCL )
+ {
+ decimal = decimal * 10 + c;
+
+ if ( !integral && power_ten > 0 )
+ power_ten--;
+ else
+ divider *= 10;
+ }
+ }
+ }
+
+ /* read exponent, if any */
+ if ( p + 1 < limit && ( *p == 'e' || *p == 'E' ) )
+ {
+ FT_Long exponent;
+
+
+ p++;
+
+ curp = p;
+ exponent = PS_Conv_ToInt( &p, limit );
+
+ if ( curp == p )
+ return 0;
+
+ /* arbitrarily limit exponent */
+ if ( exponent > 1000 )
+ have_overflow = 1;
+ else if ( exponent < -1000 )
+ have_underflow = 1;
+ else
+ power_ten += exponent;
+ }
+
+ *cursor = p;
+
+ if ( !integral && !decimal )
+ return 0;
+
+ if ( have_overflow )
+ goto Overflow;
+ if ( have_underflow )
+ goto Underflow;
+
+ while ( power_ten > 0 )
+ {
+ if ( integral >= 0xCCCCCCCL )
+ goto Overflow;
+ integral *= 10;
+
+ if ( decimal >= 0xCCCCCCCL )
+ {
+ if ( divider == 1 )
+ goto Overflow;
+ divider /= 10;
+ }
+ else
+ decimal *= 10;
+
+ power_ten--;
+ }
+
+ while ( power_ten < 0 )
+ {
+ integral /= 10;
+ if ( divider < 0xCCCCCCCL )
+ divider *= 10;
+ else
+ decimal /= 10;
+
+ if ( !integral && !decimal )
+ goto Underflow;
+
+ power_ten++;
+ }
+
+// Fix the Vulnerability Report FoxIT Reader - MSVR-10-0077.
+ // Limited to the fix-point mechanism, we have no choice now to crop the value domain.
+ // Do accurate overflow check if FT_INT64 supported, otherwise ignore the check at this moment.
+ // Since there is also a check using divider < 10000000L.
+#if defined(FT_INT64)
+ if ( decimal ) {
+ integral += FT_DivFix( (FT_Long)decimal, divider );
+ }
+ if ( integral > 2147483647) integral = 2147483647;
+#else
+ if ( decimal ) {
+ integral += FT_DivFix( decimal, divider );
+ }
+#endif
+
+
+ Exit:
+ if ( sign )
+ integral = -integral;
+
+ return (FT_Long)integral;
+
+ Bad:
+ FT_TRACE4(( "!!!END OF DATA:!!!" ));
+ return 0;
+
+ Overflow:
+ integral = 0x7FFFFFFFL;
+ FT_TRACE4(( "!!!OVERFLOW:!!!" ));
+ goto Exit;
+
+ Underflow:
+ FT_TRACE4(( "!!!UNDERFLOW:!!!" ));
+ return 0;
+ }
+
+
+#if 0
+ FT_LOCAL_DEF( FT_UInt )
+ PS_Conv_StringDecode( FT_Byte** cursor,
+ FT_Byte* limit,
+ FT_Byte* buffer,
+ FT_Offset n )
+ {
+ FT_Byte* p;
+ FT_UInt r = 0;
+
+
+ for ( p = *cursor; r < n && p < limit; p++ )
+ {
+ FT_Byte b;
+
+
+ if ( *p != '\\' )
+ {
+ buffer[r++] = *p;
+
+ continue;
+ }
+
+ p++;
+
+ switch ( *p )
+ {
+ case 'n':
+ b = '\n';
+ break;
+ case 'r':
+ b = '\r';
+ break;
+ case 't':
+ b = '\t';
+ break;
+ case 'b':
+ b = '\b';
+ break;
+ case 'f':
+ b = '\f';
+ break;
+ case '\r':
+ p++;
+ if ( *p != '\n' )
+ {
+ b = *p;
+
+ break;
+ }
+ /* no break */
+ case '\n':
+ continue;
+ break;
+ default:
+ if ( IS_PS_DIGIT( *p ) )
+ {
+ b = *p - '0';
+
+ p++;
+
+ if ( IS_PS_DIGIT( *p ) )
+ {
+ b = b * 8 + *p - '0';
+
+ p++;
+
+ if ( IS_PS_DIGIT( *p ) )
+ b = b * 8 + *p - '0';
+ else
+ {
+ buffer[r++] = b;
+ b = *p;
+ }
+ }
+ else
+ {
+ buffer[r++] = b;
+ b = *p;
+ }
+ }
+ else
+ b = *p;
+ break;
+ }
+
+ buffer[r++] = b;
+ }
+
+ *cursor = p;
+
+ return r;
+ }
+#endif /* 0 */
+
+
+ FT_LOCAL_DEF( FT_UInt )
+ PS_Conv_ASCIIHexDecode( FT_Byte** cursor,
+ FT_Byte* limit,
+ FT_Byte* buffer,
+ FT_Offset n )
+ {
+ FT_Byte* p;
+ FT_UInt r = 0;
+ FT_UInt w = 0;
+ FT_UInt pad = 0x01;
+
+
+ n *= 2;
+
+#if 1
+
+ p = *cursor;
+
+ if ( p >= limit )
+ return 0;
+
+ if ( n > (FT_UInt)( limit - p ) )
+ n = (FT_UInt)( limit - p );
+
+ /* we try to process two nibbles at a time to be as fast as possible */
+ for ( ; r < n; r++ )
+ {
+ FT_UInt c = p[r];
+
+
+ if ( IS_PS_SPACE( c ) )
+ continue;
+
+ if ( c OP 0x80 )
+ break;
+
+ c = ft_char_table[c & 0x7F];
+ if ( (unsigned)c >= 16 )
+ break;
+
+ pad = ( pad << 4 ) | c;
+ if ( pad & 0x100 )
+ {
+ buffer[w++] = (FT_Byte)pad;
+ pad = 0x01;
+ }
+ }
+
+ if ( pad != 0x01 )
+ buffer[w++] = (FT_Byte)( pad << 4 );
+
+ *cursor = p + r;
+
+ return w;
+
+#else /* 0 */
+
+ for ( r = 0; r < n; r++ )
+ {
+ FT_Char c;
+
+
+ if ( IS_PS_SPACE( *p ) )
+ continue;
+
+ if ( *p OP 0x80 )
+ break;
+
+ c = ft_char_table[*p & 0x7f];
+
+ if ( (unsigned)c >= 16 )
+ break;
+
+ if ( r & 1 )
+ {
+ *buffer = (FT_Byte)(*buffer + c);
+ buffer++;
+ }
+ else
+ *buffer = (FT_Byte)(c << 4);
+
+ r++;
+ }
+
+ *cursor = p;
+
+ return ( r + 1 ) / 2;
+
+#endif /* 0 */
+
+ }
+
+
+ FT_LOCAL_DEF( FT_UInt )
+ PS_Conv_EexecDecode( FT_Byte** cursor,
+ FT_Byte* limit,
+ FT_Byte* buffer,
+ FT_Offset n,
+ FT_UShort* seed )
+ {
+ FT_Byte* p;
+ FT_UInt r;
+ FT_UInt s = *seed;
+
+
+#if 1
+
+ p = *cursor;
+
+ if ( p >= limit )
+ return 0;
+
+ if ( n > (FT_UInt)(limit - p) )
+ n = (FT_UInt)(limit - p);
+
+ for ( r = 0; r < n; r++ )
+ {
+ FT_UInt val = p[r];
+ FT_UInt b = ( val ^ ( s >> 8 ) );
+
+
+ s = ( (val + s)*52845U + 22719 ) & 0xFFFFU;
+ buffer[r] = (FT_Byte) b;
+ }
+
+ *cursor = p + n;
+ *seed = (FT_UShort)s;
+
+#else /* 0 */
+
+ for ( r = 0, p = *cursor; r < n && p < limit; r++, p++ )
+ {
+ FT_Byte b = (FT_Byte)( *p ^ ( s >> 8 ) );
+
+
+ s = (FT_UShort)( ( *p + s ) * 52845U + 22719 );
+ *buffer++ = b;
+ }
+ *cursor = p;
+ *seed = s;
+
+#endif /* 0 */
+
+ return r;
+ }
+
+FT_LOCAL_DEF( FT_Bool )
+ xyq_PS_Conv_ToInt( FT_Byte** cursor,
+ FT_Byte* limit, FT_Long* val )
+
+ {
+ FT_Byte first_char = **cursor;
+ if (first_char == '+' || first_char == '-' || (first_char >= '0' && first_char <= '9')) {
+ *val = PS_Conv_ToInt(cursor, limit);
+ return 1;
+ }
+ return 0;
+ }
+
+/* END */
+
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psconv.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psconv.h
new file mode 100644
index 0000000000..7fa77278ae
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psconv.h
@@ -0,0 +1,74 @@
+/***************************************************************************/
+/* */
+/* psconv.h */
+/* */
+/* Some convenience conversions (specification). */
+/* */
+/* Copyright 2006, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __PSCONV_H__
+#define __PSCONV_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/psaux.h"
+
+FT_BEGIN_HEADER
+
+
+ FT_LOCAL( FT_Long )
+ PS_Conv_Strtol( FT_Byte** cursor,
+ FT_Byte* limit,
+ FT_Long base );
+
+
+ FT_LOCAL( FT_Long )
+ PS_Conv_ToInt( FT_Byte** cursor,
+ FT_Byte* limit );
+ FT_LOCAL( FT_Bool )
+ xyq_PS_Conv_ToInt( FT_Byte** cursor,
+ FT_Byte* limit, FT_Long* val ); /* XYQ 2007-10-10: we add return value indicating whether it's actually a number */
+
+ FT_LOCAL( FT_Fixed )
+ PS_Conv_ToFixed( FT_Byte** cursor,
+ FT_Byte* limit,
+ FT_Long power_ten );
+
+#if 0
+ FT_LOCAL( FT_UInt )
+ PS_Conv_StringDecode( FT_Byte** cursor,
+ FT_Byte* limit,
+ FT_Byte* buffer,
+ FT_Offset n );
+#endif
+
+ FT_LOCAL( FT_UInt )
+ PS_Conv_ASCIIHexDecode( FT_Byte** cursor,
+ FT_Byte* limit,
+ FT_Byte* buffer,
+ FT_Offset n );
+
+ FT_LOCAL( FT_UInt )
+ PS_Conv_EexecDecode( FT_Byte** cursor,
+ FT_Byte* limit,
+ FT_Byte* buffer,
+ FT_Offset n,
+ FT_UShort* seed );
+
+
+FT_END_HEADER
+
+#endif /* __PSCONV_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psobjs.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psobjs.c
new file mode 100644
index 0000000000..2cd90039d0
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psobjs.c
@@ -0,0 +1,1767 @@
+/***************************************************************************/
+/* */
+/* psobjs.c */
+/* */
+/* Auxiliary functions for PostScript fonts (body). */
+/* */
+/* Copyright 1996-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/psaux.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftcalc.h"
+
+#include "psobjs.h"
+#include "psconv.h"
+
+#include "psauxerr.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_psobjs
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** PS_TABLE *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* ps_table_new */
+ /* */
+ /* <Description> */
+ /* Initializes a PS_Table. */
+ /* */
+ /* <InOut> */
+ /* table :: The address of the target table. */
+ /* */
+ /* <Input> */
+ /* count :: The table size = the maximum number of elements. */
+ /* */
+ /* memory :: The memory object to use for all subsequent */
+ /* reallocations. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ ps_table_new( PS_Table table,
+ FT_Int count,
+ FT_Memory memory )
+ {
+ FT_Error error;
+
+
+ table->memory = memory;
+ if ( FT_NEW_ARRAY( table->elements, count ) ||
+ FT_NEW_ARRAY( table->lengths, count ) )
+ goto Exit;
+
+ table->max_elems = count;
+ table->init = 0xDEADBEEFUL;
+ table->num_elems = 0;
+ table->block = 0;
+ table->capacity = 0;
+ table->cursor = 0;
+
+ *(PS_Table_FuncsRec*)&table->funcs = ps_table_funcs;
+
+ Exit:
+ if ( error )
+ FT_FREE( table->elements );
+
+ return error;
+ }
+
+
+ static void
+ shift_elements( PS_Table table,
+ FT_Byte* old_base )
+ {
+ FT_PtrDist delta = table->block - old_base;
+ FT_Byte** offset = table->elements;
+ FT_Byte** limit = offset + table->max_elems;
+
+
+ for ( ; offset < limit; offset++ )
+ {
+ if ( offset[0] )
+ offset[0] += delta;
+ }
+ }
+
+
+ static FT_Error
+ reallocate_t1_table( PS_Table table,
+ FT_Offset new_size )
+ {
+ FT_Memory memory = table->memory;
+ FT_Byte* old_base = table->block;
+ FT_Error error;
+
+
+ /* allocate new base block */
+ if ( FT_ALLOC( table->block, new_size ) )
+ {
+ table->block = old_base;
+ return error;
+ }
+
+ /* copy elements and shift offsets */
+ if ( old_base )
+ {
+ FT_MEM_COPY( table->block, old_base, table->capacity );
+ shift_elements( table, old_base );
+ FT_FREE( old_base );
+ }
+
+ table->capacity = new_size;
+
+ return FT_Err_Ok;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* ps_table_add */
+ /* */
+ /* <Description> */
+ /* Adds an object to a PS_Table, possibly growing its memory block. */
+ /* */
+ /* <InOut> */
+ /* table :: The target table. */
+ /* */
+ /* <Input> */
+ /* idx :: The index of the object in the table. */
+ /* */
+ /* object :: The address of the object to copy in memory. */
+ /* */
+ /* length :: The length in bytes of the source object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. An error is returned if a */
+ /* reallocation fails. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ ps_table_add( PS_Table table,
+ FT_Int idx,
+ void* object,
+ FT_PtrDist length )
+ {
+ if ( idx < 0 || idx >= table->max_elems )
+ {
+ FT_ERROR(( "ps_table_add: invalid index\n" ));
+ return FT_THROW( Invalid_Argument );
+ }
+
+ if ( length < 0 )
+ {
+ FT_ERROR(( "ps_table_add: invalid length\n" ));
+ return FT_THROW( Invalid_Argument );
+ }
+
+ /* grow the base block if needed */
+ if ( table->cursor + length > table->capacity )
+ {
+ FT_Error error;
+ FT_Offset new_size = table->capacity;
+ FT_PtrDist in_offset;
+
+
+ in_offset = (FT_Byte*)object - table->block;
+ if ( in_offset < 0 || (FT_Offset)in_offset >= table->capacity )
+ in_offset = -1;
+
+ while ( new_size < table->cursor + length )
+ {
+ /* increase size by 25% and round up to the nearest multiple
+ of 1024 */
+ new_size += ( new_size >> 2 ) + 1;
+ new_size = FT_PAD_CEIL( new_size, 1024 );
+ }
+
+ error = reallocate_t1_table( table, new_size );
+ if ( error )
+ return error;
+
+ if ( in_offset >= 0 )
+ object = table->block + in_offset;
+ }
+
+ /* add the object to the base block and adjust offset */
+ table->elements[idx] = table->block + table->cursor;
+ table->lengths [idx] = length;
+ FT_MEM_COPY( table->block + table->cursor, object, length );
+
+ table->cursor += length;
+ return FT_Err_Ok;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* ps_table_done */
+ /* */
+ /* <Description> */
+ /* Finalizes a PS_TableRec (i.e., reallocate it to its current */
+ /* cursor). */
+ /* */
+ /* <InOut> */
+ /* table :: The target table. */
+ /* */
+ /* <Note> */
+ /* This function does NOT release the heap's memory block. It is up */
+ /* to the caller to clean it, or reference it in its own structures. */
+ /* */
+ FT_LOCAL_DEF( void )
+ ps_table_done( PS_Table table )
+ {
+ FT_Memory memory = table->memory;
+ FT_Error error;
+ FT_Byte* old_base = table->block;
+
+
+ /* should never fail, because rec.cursor <= rec.size */
+ if ( !old_base )
+ return;
+
+ if ( FT_ALLOC( table->block, table->cursor ) )
+ return;
+ FT_MEM_COPY( table->block, old_base, table->cursor );
+ shift_elements( table, old_base );
+
+ table->capacity = table->cursor;
+ FT_FREE( old_base );
+
+ FT_UNUSED( error );
+ }
+
+
+ FT_LOCAL_DEF( void )
+ ps_table_release( PS_Table table )
+ {
+ FT_Memory memory = table->memory;
+
+
+ if ( (FT_ULong)table->init == 0xDEADBEEFUL )
+ {
+ FT_FREE( table->block );
+ FT_FREE( table->elements );
+ FT_FREE( table->lengths );
+ table->init = 0;
+ }
+ }
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** T1 PARSER *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /* first character must be already part of the comment */
+
+ static void
+ skip_comment( FT_Byte* *acur,
+ FT_Byte* limit )
+ {
+ FT_Byte* cur = *acur;
+
+
+ while ( cur < limit )
+ {
+ if ( IS_PS_NEWLINE( *cur ) )
+ break;
+ cur++;
+ }
+
+ *acur = cur;
+ }
+
+
+ static void
+ skip_spaces( FT_Byte* *acur,
+ FT_Byte* limit )
+ {
+ FT_Byte* cur = *acur;
+
+
+ while ( cur < limit )
+ {
+ if ( !IS_PS_SPACE( *cur ) )
+ {
+ if ( *cur == '%' )
+ /* According to the PLRM, a comment is equal to a space. */
+ skip_comment( &cur, limit );
+ else
+ break;
+ }
+ cur++;
+ }
+
+ *acur = cur;
+ }
+
+
+#define IS_OCTAL_DIGIT( c ) ( '0' <= (c) && (c) <= '7' )
+
+
+ /* first character must be `('; */
+ /* *acur is positioned at the character after the closing `)' */
+
+ static FT_Error
+ skip_literal_string( FT_Byte* *acur,
+ FT_Byte* limit )
+ {
+ FT_Byte* cur = *acur;
+ FT_Int embed = 0;
+ FT_Error error = FT_ERR( Invalid_File_Format );
+ unsigned int i;
+
+
+ while ( cur < limit )
+ {
+ FT_Byte c = *cur;
+
+
+ ++cur;
+
+ if ( c == '\\' )
+ {
+ /* Red Book 3rd ed., section `Literal Text Strings', p. 29: */
+ /* A backslash can introduce three different types */
+ /* of escape sequences: */
+ /* - a special escaped char like \r, \n, etc. */
+ /* - a one-, two-, or three-digit octal number */
+ /* - none of the above in which case the backslash is ignored */
+
+ if ( cur == limit )
+ /* error (or to be ignored?) */
+ break;
+
+ switch ( *cur )
+ {
+ /* skip `special' escape */
+ case 'n':
+ case 'r':
+ case 't':
+ case 'b':
+ case 'f':
+ case '\\':
+ case '(':
+ case ')':
+ ++cur;
+ break;
+
+ default:
+ /* skip octal escape or ignore backslash */
+ for ( i = 0; i < 3 && cur < limit; ++i )
+ {
+ if ( !IS_OCTAL_DIGIT( *cur ) )
+ break;
+
+ ++cur;
+ }
+ }
+ }
+ else if ( c == '(' )
+ embed++;
+ else if ( c == ')' )
+ {
+ embed--;
+ if ( embed == 0 )
+ {
+ error = FT_Err_Ok;
+ break;
+ }
+ }
+ }
+
+ *acur = cur;
+
+ return error;
+ }
+
+
+ /* first character must be `<' */
+
+ static FT_Error
+ skip_string( FT_Byte* *acur,
+ FT_Byte* limit )
+ {
+ FT_Byte* cur = *acur;
+ FT_Error err = FT_Err_Ok;
+
+
+ while ( ++cur < limit )
+ {
+ /* All whitespace characters are ignored. */
+ skip_spaces( &cur, limit );
+ if ( cur >= limit )
+ break;
+
+ if ( !IS_PS_XDIGIT( *cur ) )
+ break;
+ }
+
+ if ( cur < limit && *cur != '>' )
+ {
+ FT_ERROR(( "skip_string: missing closing delimiter `>'\n" ));
+ err = FT_THROW( Invalid_File_Format );
+ }
+ else
+ cur++;
+
+ *acur = cur;
+ return err;
+ }
+
+
+ /* first character must be the opening brace that */
+ /* starts the procedure */
+
+ /* NB: [ and ] need not match: */
+ /* `/foo {[} def' is a valid PostScript fragment, */
+ /* even within a Type1 font */
+
+ static FT_Error
+ skip_procedure( FT_Byte* *acur,
+ FT_Byte* limit )
+ {
+ FT_Byte* cur;
+ FT_Int embed = 0;
+ FT_Error error = FT_Err_Ok;
+
+
+ FT_ASSERT( **acur == '{' );
+
+ for ( cur = *acur; cur < limit && error == FT_Err_Ok; ++cur )
+ {
+ switch ( *cur )
+ {
+ case '{':
+ ++embed;
+ break;
+
+ case '}':
+ --embed;
+ if ( embed == 0 )
+ {
+ ++cur;
+ goto end;
+ }
+ break;
+
+ case '(':
+ error = skip_literal_string( &cur, limit );
+ break;
+
+ case '<':
+ error = skip_string( &cur, limit );
+ break;
+
+ case '%':
+ skip_comment( &cur, limit );
+ break;
+ }
+ }
+
+ end:
+ if ( embed != 0 )
+ error = FT_THROW( Invalid_File_Format );
+
+ *acur = cur;
+
+ return error;
+ }
+
+
+ /***********************************************************************/
+ /* */
+ /* All exported parsing routines handle leading whitespace and stop at */
+ /* the first character which isn't part of the just handled token. */
+ /* */
+ /***********************************************************************/
+
+
+ FT_LOCAL_DEF( void )
+ ps_parser_skip_PS_token( PS_Parser parser )
+ {
+ /* Note: PostScript allows any non-delimiting, non-whitespace */
+ /* character in a name (PS Ref Manual, 3rd ed, p31). */
+ /* PostScript delimiters are (, ), <, >, [, ], {, }, /, and %. */
+
+ FT_Byte* cur = parser->cursor;
+ FT_Byte* limit = parser->limit;
+ FT_Error error = FT_Err_Ok;
+
+
+ skip_spaces( &cur, limit ); /* this also skips comments */
+ if ( cur >= limit )
+ goto Exit;
+
+ /* self-delimiting, single-character tokens */
+ if ( *cur == '[' || *cur == ']' )
+ {
+ cur++;
+ goto Exit;
+ }
+
+ /* skip balanced expressions (procedures and strings) */
+
+ if ( *cur == '{' ) /* {...} */
+ {
+ error = skip_procedure( &cur, limit );
+ goto Exit;
+ }
+
+ if ( *cur == '(' ) /* (...) */
+ {
+ error = skip_literal_string( &cur, limit );
+ goto Exit;
+ }
+
+ if ( *cur == '<' ) /* <...> */
+ {
+ if ( cur + 1 < limit && *(cur + 1) == '<' ) /* << */
+ {
+ cur++;
+ cur++;
+ }
+ else
+ error = skip_string( &cur, limit );
+
+ goto Exit;
+ }
+
+ if ( *cur == '>' )
+ {
+ cur++;
+ if ( cur >= limit || *cur != '>' ) /* >> */
+ {
+ FT_ERROR(( "ps_parser_skip_PS_token:"
+ " unexpected closing delimiter `>'\n" ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+ cur++;
+ goto Exit;
+ }
+
+ if ( *cur == '/' )
+ cur++;
+
+ /* anything else */
+ while ( cur < limit )
+ {
+ /* *cur might be invalid (e.g., ')' or '}'), but this */
+ /* is handled by the test `cur == parser->cursor' below */
+ if ( IS_PS_DELIM( *cur ) )
+ break;
+
+ cur++;
+ }
+
+ Exit:
+ if ( cur < limit && cur == parser->cursor )
+ {
+ FT_ERROR(( "ps_parser_skip_PS_token:"
+ " current token is `%c' which is self-delimiting\n"
+ " "
+ " but invalid at this point\n",
+ *cur ));
+
+ error = FT_THROW( Invalid_File_Format );
+ }
+
+ parser->error = error;
+ parser->cursor = cur;
+ }
+
+
+ FT_LOCAL_DEF( void )
+ ps_parser_skip_spaces( PS_Parser parser )
+ {
+ skip_spaces( &parser->cursor, parser->limit );
+ }
+
+
+ /* `token' here means either something between balanced delimiters */
+ /* or the next token; the delimiters are not removed. */
+
+ FT_LOCAL_DEF( void )
+ ps_parser_to_token( PS_Parser parser,
+ T1_Token token )
+ {
+ FT_Byte* cur;
+ FT_Byte* limit;
+ FT_Int embed;
+
+
+ token->type = T1_TOKEN_TYPE_NONE;
+ token->start = 0;
+ token->limit = 0;
+
+ /* first of all, skip leading whitespace */
+ ps_parser_skip_spaces( parser );
+
+ cur = parser->cursor;
+ limit = parser->limit;
+
+ if ( cur >= limit )
+ return;
+
+ switch ( *cur )
+ {
+ /************* check for literal string *****************/
+ case '(':
+ token->type = T1_TOKEN_TYPE_STRING;
+ token->start = cur;
+
+ if ( skip_literal_string( &cur, limit ) == FT_Err_Ok )
+ token->limit = cur;
+ break;
+
+ /************* check for programs/array *****************/
+ case '{':
+ token->type = T1_TOKEN_TYPE_ARRAY;
+ token->start = cur;
+
+ if ( skip_procedure( &cur, limit ) == FT_Err_Ok )
+ token->limit = cur;
+ break;
+
+ /************* check for table/array ********************/
+ /* XXX: in theory we should also look for "<<" */
+ /* since this is semantically equivalent to "["; */
+ /* in practice it doesn't matter (?) */
+ case '[':
+ token->type = T1_TOKEN_TYPE_ARRAY;
+ embed = 1;
+ token->start = cur++;
+
+ /* we need this to catch `[ ]' */
+ parser->cursor = cur;
+ ps_parser_skip_spaces( parser );
+ cur = parser->cursor;
+
+ while ( cur < limit && !parser->error )
+ {
+ /* XXX: this is wrong because it does not */
+ /* skip comments, procedures, and strings */
+ if ( *cur == '[' )
+ embed++;
+ else if ( *cur == ']' )
+ {
+ embed--;
+ if ( embed <= 0 )
+ {
+ token->limit = ++cur;
+ break;
+ }
+ }
+
+ parser->cursor = cur;
+ ps_parser_skip_PS_token( parser );
+ /* we need this to catch `[XXX ]' */
+ ps_parser_skip_spaces ( parser );
+ cur = parser->cursor;
+ }
+ break;
+
+ /* ************ otherwise, it is any token **************/
+ default:
+ token->start = cur;
+ token->type = ( *cur == '/' ? T1_TOKEN_TYPE_KEY : T1_TOKEN_TYPE_ANY );
+ ps_parser_skip_PS_token( parser );
+ cur = parser->cursor;
+ if ( !parser->error )
+ token->limit = cur;
+ }
+
+ if ( !token->limit )
+ {
+ token->start = 0;
+ token->type = T1_TOKEN_TYPE_NONE;
+ }
+
+ parser->cursor = cur;
+ }
+
+
+ /* NB: `tokens' can be NULL if we only want to count */
+ /* the number of array elements */
+
+ FT_LOCAL_DEF( void )
+ ps_parser_to_token_array( PS_Parser parser,
+ T1_Token tokens,
+ FT_UInt max_tokens,
+ FT_Int* pnum_tokens )
+ {
+ T1_TokenRec master;
+
+
+ *pnum_tokens = -1;
+
+ /* this also handles leading whitespace */
+ ps_parser_to_token( parser, &master );
+
+ if ( master.type == T1_TOKEN_TYPE_ARRAY )
+ {
+ FT_Byte* old_cursor = parser->cursor;
+ FT_Byte* old_limit = parser->limit;
+ T1_Token cur = tokens;
+ T1_Token limit = cur + max_tokens;
+
+
+ /* don't include outermost delimiters */
+ parser->cursor = master.start + 1;
+ parser->limit = master.limit - 1;
+
+ while ( parser->cursor < parser->limit )
+ {
+ T1_TokenRec token;
+
+
+ ps_parser_to_token( parser, &token );
+ if ( !token.type )
+ break;
+
+ if ( tokens != NULL && cur < limit )
+ *cur = token;
+
+ cur++;
+ }
+
+ *pnum_tokens = (FT_Int)( cur - tokens );
+
+ parser->cursor = old_cursor;
+ parser->limit = old_limit;
+ }
+ }
+
+
+ /* first character must be a delimiter or a part of a number */
+ /* NB: `coords' can be NULL if we just want to skip the */
+ /* array; in this case we ignore `max_coords' */
+
+ static FT_Int
+ ps_tocoordarray( FT_Byte* *acur,
+ FT_Byte* limit,
+ FT_Int max_coords,
+ FT_Short* coords )
+ {
+ FT_Byte* cur = *acur;
+ FT_Int count = 0;
+ FT_Byte c, ender;
+
+
+ if ( cur >= limit )
+ goto Exit;
+
+ /* check for the beginning of an array; otherwise, only one number */
+ /* will be read */
+ c = *cur;
+ ender = 0;
+
+ if ( c == '[' )
+ ender = ']';
+ else if ( c == '{' )
+ ender = '}';
+
+ if ( ender )
+ cur++;
+
+ /* now, read the coordinates */
+ while ( cur < limit )
+ {
+ FT_Short dummy;
+ FT_Byte* old_cur;
+
+
+ /* skip whitespace in front of data */
+ skip_spaces( &cur, limit );
+ if ( cur >= limit )
+ goto Exit;
+
+ if ( *cur == ender )
+ {
+ cur++;
+ break;
+ }
+
+ old_cur = cur;
+
+ if ( coords != NULL && count >= max_coords )
+ break;
+
+ /* call PS_Conv_ToFixed() even if coords == NULL */
+ /* to properly parse number at `cur' */
+ *( coords != NULL ? &coords[count] : &dummy ) =
+ (FT_Short)( PS_Conv_ToFixed( &cur, limit, 0 ) >> 16 );
+
+ if ( old_cur == cur )
+ {
+ count = -1;
+ goto Exit;
+ }
+ else
+ count++;
+
+ if ( !ender )
+ break;
+ }
+
+ Exit:
+ *acur = cur;
+ return count;
+ }
+
+
+ /* first character must be a delimiter or a part of a number */
+ /* NB: `values' can be NULL if we just want to skip the */
+ /* array; in this case we ignore `max_values' */
+
+ static FT_Int
+ ps_tofixedarray( FT_Byte* *acur,
+ FT_Byte* limit,
+ FT_Int max_values,
+ FT_Fixed* values,
+ FT_Int power_ten )
+ {
+ FT_Byte* cur = *acur;
+ FT_Int count = 0;
+ FT_Byte c, ender;
+
+
+ if ( cur >= limit )
+ goto Exit;
+
+ /* Check for the beginning of an array. Otherwise, only one number */
+ /* will be read. */
+ c = *cur;
+ ender = 0;
+
+ if ( c == '[' )
+ ender = ']';
+ else if ( c == '{' )
+ ender = '}';
+
+ if ( ender )
+ cur++;
+
+ /* now, read the values */
+ while ( cur < limit )
+ {
+ FT_Fixed dummy;
+ FT_Byte* old_cur;
+
+
+ /* skip whitespace in front of data */
+ skip_spaces( &cur, limit );
+ if ( cur >= limit )
+ goto Exit;
+
+ if ( *cur == ender )
+ {
+ cur++;
+ break;
+ }
+
+ old_cur = cur;
+
+ if ( values != NULL && count >= max_values )
+ break;
+
+ /* call PS_Conv_ToFixed() even if coords == NULL */
+ /* to properly parse number at `cur' */
+ *( values != NULL ? &values[count] : &dummy ) =
+ PS_Conv_ToFixed( &cur, limit, power_ten );
+
+ if ( old_cur == cur )
+ {
+ count = -1;
+ goto Exit;
+ }
+ else
+ count++;
+
+ if ( !ender )
+ break;
+ }
+
+ Exit:
+ *acur = cur;
+ return count;
+ }
+
+
+#if 0
+
+ static FT_String*
+ ps_tostring( FT_Byte** cursor,
+ FT_Byte* limit,
+ FT_Memory memory )
+ {
+ FT_Byte* cur = *cursor;
+ FT_PtrDist len = 0;
+ FT_Int count;
+ FT_String* result;
+ FT_Error error;
+
+
+ /* XXX: some stupid fonts have a `Notice' or `Copyright' string */
+ /* that simply doesn't begin with an opening parenthesis, even */
+ /* though they have a closing one! E.g. "amuncial.pfb" */
+ /* */
+ /* We must deal with these ill-fated cases there. Note that */
+ /* these fonts didn't work with the old Type 1 driver as the */
+ /* notice/copyright was not recognized as a valid string token */
+ /* and made the old token parser commit errors. */
+
+ while ( cur < limit && ( *cur == ' ' || *cur == '\t' ) )
+ cur++;
+ if ( cur + 1 >= limit )
+ return 0;
+
+ if ( *cur == '(' )
+ cur++; /* skip the opening parenthesis, if there is one */
+
+ *cursor = cur;
+ count = 0;
+
+ /* then, count its length */
+ for ( ; cur < limit; cur++ )
+ {
+ if ( *cur == '(' )
+ count++;
+
+ else if ( *cur == ')' )
+ {
+ count--;
+ if ( count < 0 )
+ break;
+ }
+ }
+
+ len = cur - *cursor;
+ if ( cur >= limit || FT_ALLOC( result, len + 1 ) )
+ return 0;
+
+ /* now copy the string */
+ FT_MEM_COPY( result, *cursor, len );
+ result[len] = '\0';
+ *cursor = cur;
+ return result;
+ }
+
+#endif /* 0 */
+
+
+ static int
+ ps_tobool( FT_Byte* *acur,
+ FT_Byte* limit )
+ {
+ FT_Byte* cur = *acur;
+ FT_Bool result = 0;
+
+
+ /* return 1 if we find `true', 0 otherwise */
+ if ( cur + 3 < limit &&
+ cur[0] == 't' &&
+ cur[1] == 'r' &&
+ cur[2] == 'u' &&
+ cur[3] == 'e' )
+ {
+ result = 1;
+ cur += 5;
+ }
+ else if ( cur + 4 < limit &&
+ cur[0] == 'f' &&
+ cur[1] == 'a' &&
+ cur[2] == 'l' &&
+ cur[3] == 's' &&
+ cur[4] == 'e' )
+ {
+ result = 0;
+ cur += 6;
+ }
+
+ *acur = cur;
+ return result;
+ }
+
+
+ /* load a simple field (i.e. non-table) into the current list of objects */
+
+ FT_LOCAL_DEF( FT_Error )
+ ps_parser_load_field( PS_Parser parser,
+ const T1_Field field,
+ void** objects,
+ FT_UInt max_objects,
+ FT_ULong* pflags )
+ {
+ T1_TokenRec token;
+ FT_Byte* cur;
+ FT_Byte* limit;
+ FT_UInt count;
+ FT_UInt idx;
+ FT_Error error;
+ T1_FieldType type;
+
+
+ /* this also skips leading whitespace */
+ ps_parser_to_token( parser, &token );
+ if ( !token.type )
+ goto Fail;
+
+ count = 1;
+ idx = 0;
+ cur = token.start;
+ limit = token.limit;
+
+ type = field->type;
+
+ /* we must detect arrays in /FontBBox */
+ if ( type == T1_FIELD_TYPE_BBOX )
+ {
+ T1_TokenRec token2;
+ FT_Byte* old_cur = parser->cursor;
+ FT_Byte* old_limit = parser->limit;
+
+
+ /* don't include delimiters */
+ parser->cursor = token.start + 1;
+ parser->limit = token.limit - 1;
+
+ ps_parser_to_token( parser, &token2 );
+ parser->cursor = old_cur;
+ parser->limit = old_limit;
+
+ if ( token2.type == T1_TOKEN_TYPE_ARRAY )
+ {
+ type = T1_FIELD_TYPE_MM_BBOX;
+ goto FieldArray;
+ }
+ }
+ else if ( token.type == T1_TOKEN_TYPE_ARRAY )
+ {
+ count = max_objects;
+
+ FieldArray:
+ /* if this is an array and we have no blend, an error occurs */
+ if ( max_objects == 0 )
+ goto Fail;
+
+ idx = 1;
+
+ /* don't include delimiters */
+ cur++;
+ limit--;
+ }
+
+ for ( ; count > 0; count--, idx++ )
+ {
+ FT_Byte* q = (FT_Byte*)objects[idx] + field->offset;
+ FT_Long val;
+ FT_String* string;
+
+
+ skip_spaces( &cur, limit );
+
+ switch ( type )
+ {
+ case T1_FIELD_TYPE_BOOL:
+ val = ps_tobool( &cur, limit );
+ goto Store_Integer;
+
+ case T1_FIELD_TYPE_FIXED:
+ val = PS_Conv_ToFixed( &cur, limit, 0 );
+ goto Store_Integer;
+
+ case T1_FIELD_TYPE_FIXED_1000:
+ val = PS_Conv_ToFixed( &cur, limit, 3 );
+ goto Store_Integer;
+
+ case T1_FIELD_TYPE_INTEGER:
+ { FT_Bool ret = xyq_PS_Conv_ToInt( &cur, limit, &val ); /* XYQ 2007-10-10: abort if not a number*/
+ if (!ret) break; }
+ /* fall through */
+
+ Store_Integer:
+ switch ( field->size )
+ {
+ case (8 / FT_CHAR_BIT):
+ *(FT_Byte*)q = (FT_Byte)val;
+ break;
+
+ case (16 / FT_CHAR_BIT):
+ *(FT_UShort*)q = (FT_UShort)val;
+ break;
+
+ case (32 / FT_CHAR_BIT):
+ *(FT_UInt32*)q = (FT_UInt32)val;
+ break;
+
+ default: /* for 64-bit systems */
+ *(FT_Long*)q = val;
+ }
+ break;
+
+ case T1_FIELD_TYPE_STRING:
+ case T1_FIELD_TYPE_KEY:
+ {
+ FT_Memory memory = parser->memory;
+ FT_UInt len = (FT_UInt)( limit - cur );
+
+
+ if ( cur >= limit )
+ break;
+
+ /* we allow both a string or a name */
+ /* for cases like /FontName (foo) def */
+ if ( token.type == T1_TOKEN_TYPE_KEY )
+ {
+ /* don't include leading `/' */
+ len--;
+ cur++;
+ }
+ else if ( token.type == T1_TOKEN_TYPE_STRING )
+ {
+ /* don't include delimiting parentheses */
+ /* XXX we don't handle <<...>> here */
+ /* XXX should we convert octal escapes? */
+ /* if so, what encoding should we use? */
+ cur++;
+ len -= 2;
+ }
+ else
+ {
+ FT_ERROR(( "ps_parser_load_field:"
+ " expected a name or string\n"
+ " "
+ " but found token of type %d instead\n",
+ token.type ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+ /* for this to work (FT_String**)q must have been */
+ /* initialized to NULL */
+ if ( *(FT_String**)q != NULL )
+ {
+ FT_TRACE0(( "ps_parser_load_field: overwriting field %s\n",
+ field->ident ));
+ FT_FREE( *(FT_String**)q );
+ *(FT_String**)q = NULL;
+ }
+
+ if ( FT_ALLOC( string, len + 1 ) )
+ goto Exit;
+
+ FT_MEM_COPY( string, cur, len );
+ string[len] = 0;
+
+ *(FT_String**)q = string;
+ }
+ break;
+
+ case T1_FIELD_TYPE_BBOX:
+ {
+ // Add by Johnson, fix a Error #1: UNINITIALIZED READ. #testdoc 1282.pdf
+ FT_Fixed temp[4] = {0,0,0,0};
+ FT_BBox* bbox = (FT_BBox*)q;
+ FT_Int result;
+
+
+ result = ps_tofixedarray( &cur, limit, 4, temp, 0 );
+
+ if ( result < 0 )
+ {
+ FT_ERROR(( "ps_parser_load_field:"
+ " expected four integers in bounding box\n" ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+ bbox->xMin = FT_RoundFix( temp[0] );
+ bbox->yMin = FT_RoundFix( temp[1] );
+ bbox->xMax = FT_RoundFix( temp[2] );
+ bbox->yMax = FT_RoundFix( temp[3] );
+ }
+ break;
+
+ case T1_FIELD_TYPE_MM_BBOX:
+ {
+ FT_Memory memory = parser->memory;
+ FT_Fixed* temp;
+ FT_Int result;
+ FT_UInt i;
+
+
+ if ( FT_NEW_ARRAY( temp, max_objects * 4 ) )
+ goto Exit;
+
+ for ( i = 0; i < 4; i++ )
+ {
+ result = ps_tofixedarray( &cur, limit, max_objects,
+ temp + i * max_objects, 0 );
+ if ( result < 0 )
+ {
+ FT_ERROR(( "ps_parser_load_field:"
+ " expected %d integers in the %s subarray\n"
+ " "
+ " of /FontBBox in the /Blend dictionary\n",
+ max_objects,
+ i == 0 ? "first"
+ : ( i == 1 ? "second"
+ : ( i == 2 ? "third"
+ : "fourth" ) ) ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+ skip_spaces( &cur, limit );
+ }
+
+ for ( i = 0; i < max_objects; i++ )
+ {
+ FT_BBox* bbox = (FT_BBox*)objects[i];
+
+
+ bbox->xMin = FT_RoundFix( temp[i ] );
+ bbox->yMin = FT_RoundFix( temp[i + max_objects] );
+ bbox->xMax = FT_RoundFix( temp[i + 2 * max_objects] );
+ bbox->yMax = FT_RoundFix( temp[i + 3 * max_objects] );
+ }
+
+ FT_FREE( temp );
+ }
+ break;
+
+ default:
+ /* an error occurred */
+ goto Fail;
+ }
+ }
+
+#if 0 /* obsolete -- keep for reference */
+ if ( pflags )
+ *pflags |= 1L << field->flag_bit;
+#else
+ FT_UNUSED( pflags );
+#endif
+
+ error = FT_Err_Ok;
+
+ Exit:
+ return error;
+
+ Fail:
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+
+#define T1_MAX_TABLE_ELEMENTS 32
+
+
+ FT_LOCAL_DEF( FT_Error )
+ ps_parser_load_field_table( PS_Parser parser,
+ const T1_Field field,
+ void** objects,
+ FT_UInt max_objects,
+ FT_ULong* pflags )
+ {
+ T1_TokenRec elements[T1_MAX_TABLE_ELEMENTS];
+ T1_Token token;
+ FT_Int num_elements;
+ FT_Error error = FT_Err_Ok;
+ FT_Byte* old_cursor;
+ FT_Byte* old_limit;
+ T1_FieldRec fieldrec = *(T1_Field)field;
+
+
+ fieldrec.type = T1_FIELD_TYPE_INTEGER;
+ if ( field->type == T1_FIELD_TYPE_FIXED_ARRAY ||
+ field->type == T1_FIELD_TYPE_BBOX )
+ fieldrec.type = T1_FIELD_TYPE_FIXED;
+
+ ps_parser_to_token_array( parser, elements,
+ T1_MAX_TABLE_ELEMENTS, &num_elements );
+ if ( num_elements < 0 )
+ {
+ error = FT_ERR( Ignore );
+ goto Exit;
+ }
+ if ( (FT_UInt)num_elements > field->array_max )
+ num_elements = field->array_max;
+
+ old_cursor = parser->cursor;
+ old_limit = parser->limit;
+
+ /* we store the elements count if necessary; */
+ /* we further assume that `count_offset' can't be zero */
+ if ( field->type != T1_FIELD_TYPE_BBOX && field->count_offset != 0 )
+ *(FT_Byte*)( (FT_Byte*)objects[0] + field->count_offset ) =
+ (FT_Byte)num_elements;
+
+ /* we now load each element, adjusting the field.offset on each one */
+ token = elements;
+ for ( ; num_elements > 0; num_elements--, token++ )
+ {
+ parser->cursor = token->start;
+ parser->limit = token->limit;
+ ps_parser_load_field( parser, &fieldrec, objects, max_objects, 0 );
+ fieldrec.offset += fieldrec.size;
+ }
+
+#if 0 /* obsolete -- keep for reference */
+ if ( pflags )
+ *pflags |= 1L << field->flag_bit;
+#else
+ FT_UNUSED( pflags );
+#endif
+
+ parser->cursor = old_cursor;
+ parser->limit = old_limit;
+
+ Exit:
+ return error;
+ }
+
+
+ FT_LOCAL_DEF( FT_Long )
+ ps_parser_to_int( PS_Parser parser )
+ {
+ ps_parser_skip_spaces( parser );
+ return PS_Conv_ToInt( &parser->cursor, parser->limit );
+ }
+
+
+ /* first character must be `<' if `delimiters' is non-zero */
+
+ FT_LOCAL_DEF( FT_Error )
+ ps_parser_to_bytes( PS_Parser parser,
+ FT_Byte* bytes,
+ FT_Offset max_bytes,
+ FT_Long* pnum_bytes,
+ FT_Bool delimiters )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_Byte* cur;
+
+
+ ps_parser_skip_spaces( parser );
+ cur = parser->cursor;
+
+ if ( cur >= parser->limit )
+ goto Exit;
+
+ if ( delimiters )
+ {
+ if ( *cur != '<' )
+ {
+ FT_ERROR(( "ps_parser_to_bytes: Missing starting delimiter `<'\n" ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+ cur++;
+ }
+
+ *pnum_bytes = PS_Conv_ASCIIHexDecode( &cur,
+ parser->limit,
+ bytes,
+ max_bytes );
+
+ if ( delimiters )
+ {
+ if ( cur < parser->limit && *cur != '>' )
+ {
+ FT_ERROR(( "ps_parser_to_bytes: Missing closing delimiter `>'\n" ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+ cur++;
+ }
+
+ parser->cursor = cur;
+
+ Exit:
+ return error;
+ }
+
+
+ FT_LOCAL_DEF( FT_Fixed )
+ ps_parser_to_fixed( PS_Parser parser,
+ FT_Int power_ten )
+ {
+ ps_parser_skip_spaces( parser );
+ return PS_Conv_ToFixed( &parser->cursor, parser->limit, power_ten );
+ }
+
+
+ FT_LOCAL_DEF( FT_Int )
+ ps_parser_to_coord_array( PS_Parser parser,
+ FT_Int max_coords,
+ FT_Short* coords )
+ {
+ ps_parser_skip_spaces( parser );
+ return ps_tocoordarray( &parser->cursor, parser->limit,
+ max_coords, coords );
+ }
+
+
+ FT_LOCAL_DEF( FT_Int )
+ ps_parser_to_fixed_array( PS_Parser parser,
+ FT_Int max_values,
+ FT_Fixed* values,
+ FT_Int power_ten )
+ {
+ ps_parser_skip_spaces( parser );
+ return ps_tofixedarray( &parser->cursor, parser->limit,
+ max_values, values, power_ten );
+ }
+
+
+#if 0
+
+ FT_LOCAL_DEF( FT_String* )
+ T1_ToString( PS_Parser parser )
+ {
+ return ps_tostring( &parser->cursor, parser->limit, parser->memory );
+ }
+
+
+ FT_LOCAL_DEF( FT_Bool )
+ T1_ToBool( PS_Parser parser )
+ {
+ return ps_tobool( &parser->cursor, parser->limit );
+ }
+
+#endif /* 0 */
+
+
+ FT_LOCAL_DEF( void )
+ ps_parser_init( PS_Parser parser,
+ FT_Byte* base,
+ FT_Byte* limit,
+ FT_Memory memory )
+ {
+ parser->error = FT_Err_Ok;
+ parser->base = base;
+ parser->limit = limit;
+ parser->cursor = base;
+ parser->memory = memory;
+ parser->funcs = ps_parser_funcs;
+ }
+
+
+ FT_LOCAL_DEF( void )
+ ps_parser_done( PS_Parser parser )
+ {
+ FT_UNUSED( parser );
+ }
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** T1 BUILDER *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* t1_builder_init */
+ /* */
+ /* <Description> */
+ /* Initializes a given glyph builder. */
+ /* */
+ /* <InOut> */
+ /* builder :: A pointer to the glyph builder to initialize. */
+ /* */
+ /* <Input> */
+ /* face :: The current face object. */
+ /* */
+ /* size :: The current size object. */
+ /* */
+ /* glyph :: The current glyph object. */
+ /* */
+ /* hinting :: Whether hinting should be applied. */
+ /* */
+ FT_LOCAL_DEF( void )
+ t1_builder_init( T1_Builder builder,
+ FT_Face face,
+ FT_Size size,
+ FT_GlyphSlot glyph,
+ FT_Bool hinting )
+ {
+ builder->parse_state = T1_Parse_Start;
+ builder->load_points = 1;
+
+ builder->face = face;
+ builder->glyph = glyph;
+ builder->memory = face->memory;
+
+ if ( glyph )
+ {
+ FT_GlyphLoader loader = glyph->internal->loader;
+
+
+ builder->loader = loader;
+ builder->base = &loader->base.outline;
+ builder->current = &loader->current.outline;
+ FT_GlyphLoader_Rewind( loader );
+
+ builder->hints_globals = size->internal;
+ builder->hints_funcs = 0;
+
+ if ( hinting )
+ builder->hints_funcs = glyph->internal->glyph_hints;
+ }
+
+ builder->pos_x = 0;
+ builder->pos_y = 0;
+
+ builder->left_bearing.x = 0;
+ builder->left_bearing.y = 0;
+ builder->advance.x = 0;
+ builder->advance.y = 0;
+
+ builder->funcs = t1_builder_funcs;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* t1_builder_done */
+ /* */
+ /* <Description> */
+ /* Finalizes a given glyph builder. Its contents can still be used */
+ /* after the call, but the function saves important information */
+ /* within the corresponding glyph slot. */
+ /* */
+ /* <Input> */
+ /* builder :: A pointer to the glyph builder to finalize. */
+ /* */
+ FT_LOCAL_DEF( void )
+ t1_builder_done( T1_Builder builder )
+ {
+ FT_GlyphSlot glyph = builder->glyph;
+
+
+ if ( glyph )
+ glyph->outline = *builder->base;
+ }
+
+
+ /* check that there is enough space for `count' more points */
+ FT_LOCAL_DEF( FT_Error )
+ t1_builder_check_points( T1_Builder builder,
+ FT_Int count )
+ {
+ return FT_GLYPHLOADER_CHECK_POINTS( builder->loader, count, 0 );
+ }
+
+
+ /* add a new point, do not check space */
+ FT_LOCAL_DEF( void )
+ t1_builder_add_point( T1_Builder builder,
+ FT_Pos x,
+ FT_Pos y,
+ FT_Byte flag )
+ {
+ FT_Outline* outline = builder->current;
+
+
+ if ( builder->load_points )
+ {
+ FT_Vector* point = outline->points + outline->n_points;
+ FT_Byte* control = (FT_Byte*)outline->tags + outline->n_points;
+
+
+ point->x = FIXED_TO_INT( x );
+ point->y = FIXED_TO_INT( y );
+ *control = (FT_Byte)( flag ? FT_CURVE_TAG_ON : FT_CURVE_TAG_CUBIC );
+ }
+ outline->n_points++;
+ }
+
+
+ /* check space for a new on-curve point, then add it */
+ FT_LOCAL_DEF( FT_Error )
+ t1_builder_add_point1( T1_Builder builder,
+ FT_Pos x,
+ FT_Pos y )
+ {
+ FT_Error error;
+
+
+ error = t1_builder_check_points( builder, 1 );
+ if ( !error )
+ t1_builder_add_point( builder, x, y, 1 );
+
+ return error;
+ }
+
+
+ /* check space for a new contour, then add it */
+ FT_LOCAL_DEF( FT_Error )
+ t1_builder_add_contour( T1_Builder builder )
+ {
+ FT_Outline* outline = builder->current;
+ FT_Error error;
+
+
+ /* this might happen in invalid fonts */
+ if ( !outline )
+ {
+ FT_ERROR(( "t1_builder_add_contour: no outline to add points to\n" ));
+ return FT_THROW( Invalid_File_Format );
+ }
+
+ if ( !builder->load_points )
+ {
+ outline->n_contours++;
+ return FT_Err_Ok;
+ }
+
+ error = FT_GLYPHLOADER_CHECK_POINTS( builder->loader, 0, 1 );
+ if ( !error )
+ {
+ if ( outline->n_contours > 0 )
+ outline->contours[outline->n_contours - 1] =
+ (short)( outline->n_points - 1 );
+
+ outline->n_contours++;
+ }
+
+ return error;
+ }
+
+
+ /* if a path was begun, add its first on-curve point */
+ FT_LOCAL_DEF( FT_Error )
+ t1_builder_start_point( T1_Builder builder,
+ FT_Pos x,
+ FT_Pos y )
+ {
+ FT_Error error = FT_ERR( Invalid_File_Format );
+
+
+ /* test whether we are building a new contour */
+
+ if ( builder->parse_state == T1_Parse_Have_Path )
+ error = FT_Err_Ok;
+ else
+ {
+ builder->parse_state = T1_Parse_Have_Path;
+ error = t1_builder_add_contour( builder );
+ if ( !error )
+ error = t1_builder_add_point1( builder, x, y );
+ }
+
+ return error;
+ }
+
+
+ /* close the current contour */
+ FT_LOCAL_DEF( void )
+ t1_builder_close_contour( T1_Builder builder )
+ {
+ FT_Outline* outline = builder->current;
+ FT_Int first;
+
+
+ if ( !outline )
+ return;
+
+ first = outline->n_contours <= 1
+ ? 0 : outline->contours[outline->n_contours - 2] + 1;
+
+ /* We must not include the last point in the path if it */
+ /* is located on the first point. */
+ if ( outline->n_points > 1 )
+ {
+ FT_Vector* p1 = outline->points + first;
+ FT_Vector* p2 = outline->points + outline->n_points - 1;
+ FT_Byte* control = (FT_Byte*)outline->tags + outline->n_points - 1;
+
+
+ /* `delete' last point only if it coincides with the first */
+ /* point and it is not a control point (which can happen). */
+ if ( p1->x == p2->x && p1->y == p2->y )
+ if ( *control == FT_CURVE_TAG_ON )
+ outline->n_points--;
+ }
+
+ if ( outline->n_contours > 0 )
+ {
+ /* Don't add contours only consisting of one point, i.e., */
+ /* check whether the first and the last point is the same. */
+ if ( first == outline->n_points - 1 )
+ {
+ outline->n_contours--;
+ outline->n_points--;
+ }
+ else
+ outline->contours[outline->n_contours - 1] =
+ (short)( outline->n_points - 1 );
+ }
+ }
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** OTHER *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ FT_LOCAL_DEF( void )
+ t1_decrypt( FT_Byte* buffer,
+ FT_Offset length,
+ FT_UShort seed )
+ {
+ PS_Conv_EexecDecode( &buffer,
+ buffer + length,
+ buffer,
+ length,
+ &seed );
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psobjs.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psobjs.h
new file mode 100644
index 0000000000..cbb05ec9ad
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/psobjs.h
@@ -0,0 +1,212 @@
+/***************************************************************************/
+/* */
+/* psobjs.h */
+/* */
+/* Auxiliary functions for PostScript fonts (specification). */
+/* */
+/* Copyright 1996-2001, 2002, 2003 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __PSOBJS_H__
+#define __PSOBJS_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/psaux.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** T1_TABLE *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ FT_CALLBACK_TABLE
+ const PS_Table_FuncsRec ps_table_funcs;
+
+ FT_CALLBACK_TABLE
+ const PS_Parser_FuncsRec ps_parser_funcs;
+
+ FT_CALLBACK_TABLE
+ const T1_Builder_FuncsRec t1_builder_funcs;
+
+
+ FT_LOCAL( FT_Error )
+ ps_table_new( PS_Table table,
+ FT_Int count,
+ FT_Memory memory );
+
+ FT_LOCAL( FT_Error )
+ ps_table_add( PS_Table table,
+ FT_Int idx,
+ void* object,
+ FT_PtrDist length );
+
+ FT_LOCAL( void )
+ ps_table_done( PS_Table table );
+
+
+ FT_LOCAL( void )
+ ps_table_release( PS_Table table );
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** T1 PARSER *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ FT_LOCAL( void )
+ ps_parser_skip_spaces( PS_Parser parser );
+
+ FT_LOCAL( void )
+ ps_parser_skip_PS_token( PS_Parser parser );
+
+ FT_LOCAL( void )
+ ps_parser_to_token( PS_Parser parser,
+ T1_Token token );
+
+ FT_LOCAL( void )
+ ps_parser_to_token_array( PS_Parser parser,
+ T1_Token tokens,
+ FT_UInt max_tokens,
+ FT_Int* pnum_tokens );
+
+ FT_LOCAL( FT_Error )
+ ps_parser_load_field( PS_Parser parser,
+ const T1_Field field,
+ void** objects,
+ FT_UInt max_objects,
+ FT_ULong* pflags );
+
+ FT_LOCAL( FT_Error )
+ ps_parser_load_field_table( PS_Parser parser,
+ const T1_Field field,
+ void** objects,
+ FT_UInt max_objects,
+ FT_ULong* pflags );
+
+ FT_LOCAL( FT_Long )
+ ps_parser_to_int( PS_Parser parser );
+
+
+ FT_LOCAL( FT_Error )
+ ps_parser_to_bytes( PS_Parser parser,
+ FT_Byte* bytes,
+ FT_Offset max_bytes,
+ FT_Long* pnum_bytes,
+ FT_Bool delimiters );
+
+
+ FT_LOCAL( FT_Fixed )
+ ps_parser_to_fixed( PS_Parser parser,
+ FT_Int power_ten );
+
+
+ FT_LOCAL( FT_Int )
+ ps_parser_to_coord_array( PS_Parser parser,
+ FT_Int max_coords,
+ FT_Short* coords );
+
+ FT_LOCAL( FT_Int )
+ ps_parser_to_fixed_array( PS_Parser parser,
+ FT_Int max_values,
+ FT_Fixed* values,
+ FT_Int power_ten );
+
+
+ FT_LOCAL( void )
+ ps_parser_init( PS_Parser parser,
+ FT_Byte* base,
+ FT_Byte* limit,
+ FT_Memory memory );
+
+ FT_LOCAL( void )
+ ps_parser_done( PS_Parser parser );
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** T1 BUILDER *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ FT_LOCAL( void )
+ t1_builder_init( T1_Builder builder,
+ FT_Face face,
+ FT_Size size,
+ FT_GlyphSlot glyph,
+ FT_Bool hinting );
+
+ FT_LOCAL( void )
+ t1_builder_done( T1_Builder builder );
+
+ FT_LOCAL( FT_Error )
+ t1_builder_check_points( T1_Builder builder,
+ FT_Int count );
+
+ FT_LOCAL( void )
+ t1_builder_add_point( T1_Builder builder,
+ FT_Pos x,
+ FT_Pos y,
+ FT_Byte flag );
+
+ FT_LOCAL( FT_Error )
+ t1_builder_add_point1( T1_Builder builder,
+ FT_Pos x,
+ FT_Pos y );
+
+ FT_LOCAL( FT_Error )
+ t1_builder_add_contour( T1_Builder builder );
+
+
+ FT_LOCAL( FT_Error )
+ t1_builder_start_point( T1_Builder builder,
+ FT_Pos x,
+ FT_Pos y );
+
+
+ FT_LOCAL( void )
+ t1_builder_close_contour( T1_Builder builder );
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** OTHER *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ FT_LOCAL( void )
+ t1_decrypt( FT_Byte* buffer,
+ FT_Offset length,
+ FT_UShort seed );
+
+
+FT_END_HEADER
+
+#endif /* __PSOBJS_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/rules.mk b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/rules.mk
new file mode 100644
index 0000000000..7a1be37b69
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/rules.mk
@@ -0,0 +1,73 @@
+#
+# FreeType 2 PSaux driver configuration rules
+#
+
+
+# Copyright 1996-2000, 2002, 2003, 2006 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT. By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+
+# PSAUX driver directory
+#
+PSAUX_DIR := $(SRC_DIR)/psaux
+
+
+# compilation flags for the driver
+#
+PSAUX_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(PSAUX_DIR))
+
+
+# PSAUX driver sources (i.e., C files)
+#
+PSAUX_DRV_SRC := $(PSAUX_DIR)/psobjs.c \
+ $(PSAUX_DIR)/t1decode.c \
+ $(PSAUX_DIR)/t1cmap.c \
+ $(PSAUX_DIR)/afmparse.c \
+ $(PSAUX_DIR)/psconv.c \
+ $(PSAUX_DIR)/psauxmod.c
+
+# PSAUX driver headers
+#
+PSAUX_DRV_H := $(PSAUX_DRV_SRC:%c=%h) \
+ $(PSAUX_DIR)/psauxerr.h
+
+
+# PSAUX driver object(s)
+#
+# PSAUX_DRV_OBJ_M is used during `multi' builds.
+# PSAUX_DRV_OBJ_S is used during `single' builds.
+#
+PSAUX_DRV_OBJ_M := $(PSAUX_DRV_SRC:$(PSAUX_DIR)/%.c=$(OBJ_DIR)/%.$O)
+PSAUX_DRV_OBJ_S := $(OBJ_DIR)/psaux.$O
+
+# PSAUX driver source file for single build
+#
+PSAUX_DRV_SRC_S := $(PSAUX_DIR)/psaux.c
+
+
+# PSAUX driver - single object
+#
+$(PSAUX_DRV_OBJ_S): $(PSAUX_DRV_SRC_S) $(PSAUX_DRV_SRC) \
+ $(FREETYPE_H) $(PSAUX_DRV_H)
+ $(PSAUX_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(PSAUX_DRV_SRC_S))
+
+
+# PSAUX driver - multiple objects
+#
+$(OBJ_DIR)/%.$O: $(PSAUX_DIR)/%.c $(FREETYPE_H) $(PSAUX_DRV_H)
+ $(PSAUX_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)
+
+
+# update main driver object lists
+#
+DRV_OBJS_S += $(PSAUX_DRV_OBJ_S)
+DRV_OBJS_M += $(PSAUX_DRV_OBJ_M)
+
+
+# EOF
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/t1cmap.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/t1cmap.c
new file mode 100644
index 0000000000..4070306c52
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/t1cmap.c
@@ -0,0 +1,341 @@
+/***************************************************************************/
+/* */
+/* t1cmap.c */
+/* */
+/* Type 1 character map support (body). */
+/* */
+/* Copyright 2002, 2003, 2006, 2007, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "t1cmap.h"
+
+#include "../../include/freetype/internal/ftdebug.h"
+
+#include "psauxerr.h"
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** TYPE1 STANDARD (AND EXPERT) ENCODING CMAPS *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ static void
+ t1_cmap_std_init( T1_CMapStd cmap,
+ FT_Int is_expert )
+ {
+ T1_Face face = (T1_Face)FT_CMAP_FACE( cmap );
+ FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)face->psnames;
+
+
+ cmap->num_glyphs = face->type1.num_glyphs;
+ cmap->glyph_names = (const char* const*)face->type1.glyph_names;
+ cmap->sid_to_string = psnames->adobe_std_strings;
+ cmap->code_to_sid = is_expert ? psnames->adobe_expert_encoding
+ : psnames->adobe_std_encoding;
+
+ FT_ASSERT( cmap->code_to_sid != NULL );
+ }
+
+
+ FT_CALLBACK_DEF( void )
+ t1_cmap_std_done( T1_CMapStd cmap )
+ {
+ cmap->num_glyphs = 0;
+ cmap->glyph_names = NULL;
+ cmap->sid_to_string = NULL;
+ cmap->code_to_sid = NULL;
+ }
+
+
+ FT_CALLBACK_DEF( FT_UInt )
+ t1_cmap_std_char_index( T1_CMapStd cmap,
+ FT_UInt32 char_code )
+ {
+ FT_UInt result = 0;
+
+
+ if ( char_code < 256 )
+ {
+ FT_UInt code, n;
+ const char* glyph_name;
+
+
+ /* convert character code to Adobe SID string */
+ code = cmap->code_to_sid[char_code];
+ glyph_name = cmap->sid_to_string( code );
+
+ /* look for the corresponding glyph name */
+ for ( n = 0; n < cmap->num_glyphs; n++ )
+ {
+ const char* gname = cmap->glyph_names[n];
+
+
+ if ( gname && gname[0] == glyph_name[0] &&
+ ft_strcmp( gname, glyph_name ) == 0 )
+ {
+ result = n;
+ break;
+ }
+ }
+ }
+
+ return result;
+ }
+
+
+ FT_CALLBACK_DEF( FT_UInt32 )
+ t1_cmap_std_char_next( T1_CMapStd cmap,
+ FT_UInt32 *pchar_code )
+ {
+ FT_UInt result = 0;
+ FT_UInt32 char_code = *pchar_code + 1;
+
+
+ while ( char_code < 256 )
+ {
+ result = t1_cmap_std_char_index( cmap, char_code );
+ if ( result != 0 )
+ goto Exit;
+
+ char_code++;
+ }
+ char_code = 0;
+
+ Exit:
+ *pchar_code = char_code;
+ return result;
+ }
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ t1_cmap_standard_init( T1_CMapStd cmap )
+ {
+ t1_cmap_std_init( cmap, 0 );
+ return 0;
+ }
+
+
+ FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec
+ t1_cmap_standard_class_rec =
+ {
+ sizeof ( T1_CMapStdRec ),
+
+ (FT_CMap_InitFunc) t1_cmap_standard_init,
+ (FT_CMap_DoneFunc) t1_cmap_std_done,
+ (FT_CMap_CharIndexFunc)t1_cmap_std_char_index,
+ (FT_CMap_CharNextFunc) t1_cmap_std_char_next,
+
+ NULL, NULL, NULL, NULL, NULL
+ };
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ t1_cmap_expert_init( T1_CMapStd cmap )
+ {
+ t1_cmap_std_init( cmap, 1 );
+ return 0;
+ }
+
+ FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec
+ t1_cmap_expert_class_rec =
+ {
+ sizeof ( T1_CMapStdRec ),
+
+ (FT_CMap_InitFunc) t1_cmap_expert_init,
+ (FT_CMap_DoneFunc) t1_cmap_std_done,
+ (FT_CMap_CharIndexFunc)t1_cmap_std_char_index,
+ (FT_CMap_CharNextFunc) t1_cmap_std_char_next,
+
+ NULL, NULL, NULL, NULL, NULL
+ };
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** TYPE1 CUSTOM ENCODING CMAP *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ t1_cmap_custom_init( T1_CMapCustom cmap )
+ {
+ T1_Face face = (T1_Face)FT_CMAP_FACE( cmap );
+ T1_Encoding encoding = &face->type1.encoding;
+
+
+ cmap->first = encoding->code_first;
+ cmap->count = (FT_UInt)( encoding->code_last - cmap->first );
+ cmap->indices = encoding->char_index;
+
+ FT_ASSERT( cmap->indices != NULL );
+ FT_ASSERT( encoding->code_first <= encoding->code_last );
+
+ return 0;
+ }
+
+
+ FT_CALLBACK_DEF( void )
+ t1_cmap_custom_done( T1_CMapCustom cmap )
+ {
+ cmap->indices = NULL;
+ cmap->first = 0;
+ cmap->count = 0;
+ }
+
+
+ FT_CALLBACK_DEF( FT_UInt )
+ t1_cmap_custom_char_index( T1_CMapCustom cmap,
+ FT_UInt32 char_code )
+ {
+ FT_UInt result = 0;
+
+
+ if ( ( char_code >= cmap->first ) &&
+ ( char_code < ( cmap->first + cmap->count ) ) )
+ result = cmap->indices[char_code];
+
+ return result;
+ }
+
+
+ FT_CALLBACK_DEF( FT_UInt32 )
+ t1_cmap_custom_char_next( T1_CMapCustom cmap,
+ FT_UInt32 *pchar_code )
+ {
+ FT_UInt result = 0;
+ FT_UInt32 char_code = *pchar_code;
+
+
+ ++char_code;
+
+ if ( char_code < cmap->first )
+ char_code = cmap->first;
+
+ for ( ; char_code < ( cmap->first + cmap->count ); char_code++ )
+ {
+ result = cmap->indices[char_code];
+ if ( result != 0 )
+ goto Exit;
+ }
+
+ char_code = 0;
+
+ Exit:
+ *pchar_code = char_code;
+ return result;
+ }
+
+
+ FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec
+ t1_cmap_custom_class_rec =
+ {
+ sizeof ( T1_CMapCustomRec ),
+
+ (FT_CMap_InitFunc) t1_cmap_custom_init,
+ (FT_CMap_DoneFunc) t1_cmap_custom_done,
+ (FT_CMap_CharIndexFunc)t1_cmap_custom_char_index,
+ (FT_CMap_CharNextFunc) t1_cmap_custom_char_next,
+
+ NULL, NULL, NULL, NULL, NULL
+ };
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** TYPE1 SYNTHETIC UNICODE ENCODING CMAP *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ FT_CALLBACK_DEF( const char * )
+ psaux_get_glyph_name( T1_Face face,
+ FT_UInt idx )
+ {
+ return face->type1.glyph_names[idx];
+ }
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ t1_cmap_unicode_init( PS_Unicodes unicodes )
+ {
+ T1_Face face = (T1_Face)FT_CMAP_FACE( unicodes );
+ FT_Memory memory = FT_FACE_MEMORY( face );
+ FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)face->psnames;
+
+
+ return psnames->unicodes_init( memory,
+ unicodes,
+ face->type1.num_glyphs,
+ (PS_GetGlyphNameFunc)&psaux_get_glyph_name,
+ (PS_FreeGlyphNameFunc)NULL,
+ (FT_Pointer)face );
+ }
+
+
+ FT_CALLBACK_DEF( void )
+ t1_cmap_unicode_done( PS_Unicodes unicodes )
+ {
+ FT_Face face = FT_CMAP_FACE( unicodes );
+ FT_Memory memory = FT_FACE_MEMORY( face );
+
+
+ FT_FREE( unicodes->maps );
+ unicodes->num_maps = 0;
+ }
+
+
+ FT_CALLBACK_DEF( FT_UInt )
+ t1_cmap_unicode_char_index( PS_Unicodes unicodes,
+ FT_UInt32 char_code )
+ {
+ T1_Face face = (T1_Face)FT_CMAP_FACE( unicodes );
+ FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)face->psnames;
+
+
+ return psnames->unicodes_char_index( unicodes, char_code );
+ }
+
+
+ FT_CALLBACK_DEF( FT_UInt32 )
+ t1_cmap_unicode_char_next( PS_Unicodes unicodes,
+ FT_UInt32 *pchar_code )
+ {
+ T1_Face face = (T1_Face)FT_CMAP_FACE( unicodes );
+ FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)face->psnames;
+
+
+ return psnames->unicodes_char_next( unicodes, pchar_code );
+ }
+
+
+ FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec
+ t1_cmap_unicode_class_rec =
+ {
+ sizeof ( PS_UnicodesRec ),
+
+ (FT_CMap_InitFunc) t1_cmap_unicode_init,
+ (FT_CMap_DoneFunc) t1_cmap_unicode_done,
+ (FT_CMap_CharIndexFunc)t1_cmap_unicode_char_index,
+ (FT_CMap_CharNextFunc) t1_cmap_unicode_char_next,
+
+ NULL, NULL, NULL, NULL, NULL
+ };
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/t1cmap.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/t1cmap.h
new file mode 100644
index 0000000000..c32e0eb197
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/t1cmap.h
@@ -0,0 +1,105 @@
+/***************************************************************************/
+/* */
+/* t1cmap.h */
+/* */
+/* Type 1 character map support (specification). */
+/* */
+/* Copyright 2002, 2003, 2006 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __T1CMAP_H__
+#define __T1CMAP_H__
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/t1types.h"
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** TYPE1 STANDARD (AND EXPERT) ENCODING CMAPS *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /* standard (and expert) encoding cmaps */
+ typedef struct T1_CMapStdRec_* T1_CMapStd;
+
+ typedef struct T1_CMapStdRec_
+ {
+ FT_CMapRec cmap;
+
+ const FT_UShort* code_to_sid;
+ PS_Adobe_Std_StringsFunc sid_to_string;
+
+ FT_UInt num_glyphs;
+ const char* const* glyph_names;
+
+ } T1_CMapStdRec;
+
+
+ FT_CALLBACK_TABLE const FT_CMap_ClassRec
+ t1_cmap_standard_class_rec;
+
+ FT_CALLBACK_TABLE const FT_CMap_ClassRec
+ t1_cmap_expert_class_rec;
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** TYPE1 CUSTOM ENCODING CMAP *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ typedef struct T1_CMapCustomRec_* T1_CMapCustom;
+
+ typedef struct T1_CMapCustomRec_
+ {
+ FT_CMapRec cmap;
+ FT_UInt first;
+ FT_UInt count;
+ FT_UShort* indices;
+
+ } T1_CMapCustomRec;
+
+
+ FT_CALLBACK_TABLE const FT_CMap_ClassRec
+ t1_cmap_custom_class_rec;
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** TYPE1 SYNTHETIC UNICODE ENCODING CMAP *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /* unicode (synthetic) cmaps */
+
+ FT_CALLBACK_TABLE const FT_CMap_ClassRec
+ t1_cmap_unicode_class_rec;
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __T1CMAP_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/t1decode.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/t1decode.c
new file mode 100644
index 0000000000..abf1d74151
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/t1decode.c
@@ -0,0 +1,1620 @@
+/***************************************************************************/
+/* */
+/* t1decode.c */
+/* */
+/* PostScript Type 1 decoding routines (body). */
+/* */
+/* Copyright 2000-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftcalc.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/pshints.h"
+#include "../../include/freetype/ftoutln.h"
+
+#include "t1decode.h"
+#include "psobjs.h"
+
+#include "psauxerr.h"
+
+/* ensure proper sign extension */
+#define Fix2Int( f ) ( (FT_Int)(FT_Short)( (f) >> 16 ) )
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_t1decode
+
+
+ typedef enum T1_Operator_
+ {
+ op_none = 0,
+ op_endchar,
+ op_hsbw,
+ op_seac,
+ op_sbw,
+ op_closepath,
+ op_hlineto,
+ op_hmoveto,
+ op_hvcurveto,
+ op_rlineto,
+ op_rmoveto,
+ op_rrcurveto,
+ op_vhcurveto,
+ op_vlineto,
+ op_vmoveto,
+ op_dotsection,
+ op_hstem,
+ op_hstem3,
+ op_vstem,
+ op_vstem3,
+ op_div,
+ op_callothersubr,
+ op_callsubr,
+ op_pop,
+ op_return,
+ op_setcurrentpoint,
+ op_unknown15,
+
+ op_max /* never remove this one */
+
+ } T1_Operator;
+
+
+ static
+ const FT_Int t1_args_count[op_max] =
+ {
+ 0, /* none */
+ 0, /* endchar */
+ 2, /* hsbw */
+ 5, /* seac */
+ 4, /* sbw */
+ 0, /* closepath */
+ 1, /* hlineto */
+ 1, /* hmoveto */
+ 4, /* hvcurveto */
+ 2, /* rlineto */
+ 2, /* rmoveto */
+ 6, /* rrcurveto */
+ 4, /* vhcurveto */
+ 1, /* vlineto */
+ 1, /* vmoveto */
+ 0, /* dotsection */
+ 2, /* hstem */
+ 6, /* hstem3 */
+ 2, /* vstem */
+ 6, /* vstem3 */
+ 2, /* div */
+ -1, /* callothersubr */
+ 1, /* callsubr */
+ 0, /* pop */
+ 0, /* return */
+ 2, /* setcurrentpoint */
+ 2 /* opcode 15 (undocumented and obsolete) */
+ };
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* t1_lookup_glyph_by_stdcharcode */
+ /* */
+ /* <Description> */
+ /* Looks up a given glyph by its StandardEncoding charcode. Used to */
+ /* implement the SEAC Type 1 operator. */
+ /* */
+ /* <Input> */
+ /* face :: The current face object. */
+ /* */
+ /* charcode :: The character code to look for. */
+ /* */
+ /* <Return> */
+ /* A glyph index in the font face. Returns -1 if the corresponding */
+ /* glyph wasn't found. */
+ /* */
+ static FT_Int
+ t1_lookup_glyph_by_stdcharcode( T1_Decoder decoder,
+ FT_Int charcode )
+ {
+ FT_UInt n;
+ const FT_String* glyph_name;
+ FT_Service_PsCMaps psnames = decoder->psnames;
+
+
+ /* check range of standard char code */
+ if ( charcode < 0 || charcode > 255 )
+ return -1;
+
+ glyph_name = psnames->adobe_std_strings(
+ psnames->adobe_std_encoding[charcode]);
+
+ for ( n = 0; n < decoder->num_glyphs; n++ )
+ {
+ FT_String* name = (FT_String*)decoder->glyph_names[n];
+
+
+ if ( name &&
+ name[0] == glyph_name[0] &&
+ ft_strcmp( name, glyph_name ) == 0 )
+ return n;
+ }
+
+ return -1;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* t1operator_seac */
+ /* */
+ /* <Description> */
+ /* Implements the `seac' Type 1 operator for a Type 1 decoder. */
+ /* */
+ /* <Input> */
+ /* decoder :: The current CID decoder. */
+ /* */
+ /* asb :: The accent's side bearing. */
+ /* */
+ /* adx :: The horizontal offset of the accent. */
+ /* */
+ /* ady :: The vertical offset of the accent. */
+ /* */
+ /* bchar :: The base character's StandardEncoding charcode. */
+ /* */
+ /* achar :: The accent character's StandardEncoding charcode. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ static FT_Error
+ t1operator_seac( T1_Decoder decoder,
+ FT_Pos asb,
+ FT_Pos adx,
+ FT_Pos ady,
+ FT_Int bchar,
+ FT_Int achar )
+ {
+ FT_Error error;
+ FT_Int bchar_index, achar_index;
+#if 0
+ FT_Int n_base_points;
+ FT_Outline* base = decoder->builder.base;
+#endif
+ FT_Vector left_bearing, advance;
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+ T1_Face face = (T1_Face)decoder->builder.face;
+#endif
+
+
+ if ( decoder->seac )
+ {
+ FT_ERROR(( "t1operator_seac: invalid nested seac\n" ));
+ return FT_THROW( Syntax_Error );
+ }
+
+ if ( decoder->builder.metrics_only )
+ {
+ FT_ERROR(( "t1operator_seac: unexpected seac\n" ));
+ return FT_THROW( Syntax_Error );
+ }
+
+ /* seac weirdness */
+ adx += decoder->builder.left_bearing.x;
+
+ /* `glyph_names' is set to 0 for CID fonts which do not */
+ /* include an encoding. How can we deal with these? */
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+ if ( decoder->glyph_names == 0 &&
+ !face->root.internal->incremental_interface )
+#else
+ if ( decoder->glyph_names == 0 )
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
+ {
+ FT_ERROR(( "t1operator_seac:"
+ " glyph names table not available in this font\n" ));
+ return FT_THROW( Syntax_Error );
+ }
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+ if ( face->root.internal->incremental_interface )
+ {
+ /* the caller must handle the font encoding also */
+ bchar_index = bchar;
+ achar_index = achar;
+ }
+ else
+#endif
+ {
+ bchar_index = t1_lookup_glyph_by_stdcharcode( decoder, bchar );
+ achar_index = t1_lookup_glyph_by_stdcharcode( decoder, achar );
+ }
+
+ if ( bchar_index < 0 || achar_index < 0 )
+ {
+ FT_ERROR(( "t1operator_seac:"
+ " invalid seac character code arguments\n" ));
+ return FT_THROW( Syntax_Error );
+ }
+
+ /* if we are trying to load a composite glyph, do not load the */
+ /* accent character and return the array of subglyphs. */
+ if ( decoder->builder.no_recurse )
+ {
+ FT_GlyphSlot glyph = (FT_GlyphSlot)decoder->builder.glyph;
+ FT_GlyphLoader loader = glyph->internal->loader;
+ FT_SubGlyph subg;
+
+
+ /* reallocate subglyph array if necessary */
+ error = FT_GlyphLoader_CheckSubGlyphs( loader, 2 );
+ if ( error )
+ goto Exit;
+
+ subg = loader->current.subglyphs;
+
+ /* subglyph 0 = base character */
+ subg->index = bchar_index;
+ subg->flags = FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES |
+ FT_SUBGLYPH_FLAG_USE_MY_METRICS;
+ subg->arg1 = 0;
+ subg->arg2 = 0;
+ subg++;
+
+ /* subglyph 1 = accent character */
+ subg->index = achar_index;
+ subg->flags = FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES;
+ subg->arg1 = (FT_Int)FIXED_TO_INT( adx - asb );
+ subg->arg2 = (FT_Int)FIXED_TO_INT( ady );
+
+ /* set up remaining glyph fields */
+ glyph->num_subglyphs = 2;
+ glyph->subglyphs = loader->base.subglyphs;
+ glyph->format = FT_GLYPH_FORMAT_COMPOSITE;
+
+ loader->current.num_subglyphs = 2;
+ goto Exit;
+ }
+
+ /* First load `bchar' in builder */
+ /* now load the unscaled outline */
+
+ FT_GlyphLoader_Prepare( decoder->builder.loader ); /* prepare loader */
+
+ /* the seac operator must not be nested */
+ decoder->seac = TRUE;
+ error = t1_decoder_parse_glyph( decoder, bchar_index );
+ decoder->seac = FALSE;
+ if ( error )
+ goto Exit;
+
+ /* save the left bearing and width of the base character */
+ /* as they will be erased by the next load. */
+
+ left_bearing = decoder->builder.left_bearing;
+ advance = decoder->builder.advance;
+
+ decoder->builder.left_bearing.x = 0;
+ decoder->builder.left_bearing.y = 0;
+
+ decoder->builder.pos_x = adx - asb;
+ decoder->builder.pos_y = ady;
+
+ /* Now load `achar' on top of */
+ /* the base outline */
+
+ /* the seac operator must not be nested */
+ decoder->seac = TRUE;
+ error = t1_decoder_parse_glyph( decoder, achar_index );
+ decoder->seac = FALSE;
+ if ( error )
+ goto Exit;
+
+ /* restore the left side bearing and */
+ /* advance width of the base character */
+
+ decoder->builder.left_bearing = left_bearing;
+ decoder->builder.advance = advance;
+
+ decoder->builder.pos_x = 0;
+ decoder->builder.pos_y = 0;
+
+ Exit:
+ return error;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* t1_decoder_parse_charstrings */
+ /* */
+ /* <Description> */
+ /* Parses a given Type 1 charstrings program. */
+ /* */
+ /* <Input> */
+ /* decoder :: The current Type 1 decoder. */
+ /* */
+ /* charstring_base :: The base address of the charstring stream. */
+ /* */
+ /* charstring_len :: The length in bytes of the charstring stream. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ t1_decoder_parse_charstrings( T1_Decoder decoder,
+ FT_Byte* charstring_base,
+ FT_UInt charstring_len )
+ {
+ FT_Error error;
+ T1_Decoder_Zone zone;
+ FT_Byte* ip;
+ FT_Byte* limit;
+ T1_Builder builder = &decoder->builder;
+ FT_Pos x, y, orig_x, orig_y;
+ FT_Int known_othersubr_result_cnt = 0;
+ FT_Int unknown_othersubr_result_cnt = 0;
+ FT_Bool large_int;
+ FT_Fixed seed;
+
+ T1_Hints_Funcs hinter;
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+ FT_Bool bol = TRUE;
+#endif
+
+
+ /* compute random seed from stack address of parameter */
+ seed = (FT_Fixed)( ( (FT_PtrDist)(char*)&seed ^
+ (FT_PtrDist)(char*)&decoder ^
+ (FT_PtrDist)(char*)&charstring_base ) &
+ FT_ULONG_MAX ) ;
+ seed = ( seed ^ ( seed >> 10 ) ^ ( seed >> 20 ) ) & 0xFFFFL;
+ if ( seed == 0 )
+ seed = 0x7384;
+
+ /* First of all, initialize the decoder */
+ decoder->top = decoder->stack;
+ decoder->zone = decoder->zones;
+ zone = decoder->zones;
+
+ builder->parse_state = T1_Parse_Start;
+
+ hinter = (T1_Hints_Funcs)builder->hints_funcs;
+
+ /* a font that reads BuildCharArray without setting */
+ /* its values first is buggy, but ... */
+ FT_ASSERT( ( decoder->len_buildchar == 0 ) ==
+ ( decoder->buildchar == NULL ) );
+
+ if ( decoder->buildchar && decoder->len_buildchar > 0 )
+ ft_memset( &decoder->buildchar[0],
+ 0,
+ sizeof ( decoder->buildchar[0] ) * decoder->len_buildchar );
+
+ FT_TRACE4(( "\n"
+ "Start charstring\n" ));
+
+ zone->base = charstring_base;
+ limit = zone->limit = charstring_base + charstring_len;
+ ip = zone->cursor = zone->base;
+
+ error = FT_Err_Ok;
+
+ x = orig_x = builder->pos_x;
+ y = orig_y = builder->pos_y;
+
+ /* begin hints recording session, if any */
+ if ( hinter )
+ hinter->open( hinter->hints );
+
+ large_int = FALSE;
+
+ /* now, execute loop */
+ while ( ip < limit )
+ {
+ FT_Long* top = decoder->top;
+ T1_Operator op = op_none;
+ FT_Int32 value = 0;
+
+
+ FT_ASSERT( known_othersubr_result_cnt == 0 ||
+ unknown_othersubr_result_cnt == 0 );
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+ if ( bol )
+ {
+ FT_TRACE5(( " (%d)", decoder->top - decoder->stack ));
+ bol = FALSE;
+ }
+#endif
+
+ /*********************************************************************/
+ /* */
+ /* Decode operator or operand */
+ /* */
+ /* */
+
+ /* first of all, decompress operator or value */
+ switch ( *ip++ )
+ {
+ case 1:
+ op = op_hstem;
+ break;
+
+ case 3:
+ op = op_vstem;
+ break;
+ case 4:
+ op = op_vmoveto;
+ break;
+ case 5:
+ op = op_rlineto;
+ break;
+ case 6:
+ op = op_hlineto;
+ break;
+ case 7:
+ op = op_vlineto;
+ break;
+ case 8:
+ op = op_rrcurveto;
+ break;
+ case 9:
+ op = op_closepath;
+ break;
+ case 10:
+ op = op_callsubr;
+ break;
+ case 11:
+ op = op_return;
+ break;
+
+ case 13:
+ op = op_hsbw;
+ break;
+ case 14:
+ op = op_endchar;
+ break;
+
+ case 15: /* undocumented, obsolete operator */
+ op = op_unknown15;
+ break;
+
+ case 21:
+ op = op_rmoveto;
+ break;
+ case 22:
+ op = op_hmoveto;
+ break;
+
+ case 30:
+ op = op_vhcurveto;
+ break;
+ case 31:
+ op = op_hvcurveto;
+ break;
+
+ case 12:
+ if ( ip > limit )
+ {
+ FT_ERROR(( "t1_decoder_parse_charstrings:"
+ " invalid escape (12+EOF)\n" ));
+ goto Syntax_Error;
+ }
+
+ switch ( *ip++ )
+ {
+ case 0:
+ op = op_dotsection;
+ break;
+ case 1:
+ op = op_vstem3;
+ break;
+ case 2:
+ op = op_hstem3;
+ break;
+ case 6:
+ op = op_seac;
+ break;
+ case 7:
+ op = op_sbw;
+ break;
+ case 12:
+ op = op_div;
+ break;
+ case 16:
+ op = op_callothersubr;
+ break;
+ case 17:
+ op = op_pop;
+ break;
+ case 33:
+ op = op_setcurrentpoint;
+ break;
+
+ default:
+ FT_ERROR(( "t1_decoder_parse_charstrings:"
+ " invalid escape (12+%d)\n",
+ ip[-1] ));
+ goto Syntax_Error;
+ }
+ break;
+
+ case 255: /* four bytes integer */
+ if ( ip + 4 > limit )
+ {
+ FT_ERROR(( "t1_decoder_parse_charstrings:"
+ " unexpected EOF in integer\n" ));
+ goto Syntax_Error;
+ }
+
+ value = (FT_Int32)( ( (FT_UInt32)ip[0] << 24 ) |
+ ( (FT_UInt32)ip[1] << 16 ) |
+ ( (FT_UInt32)ip[2] << 8 ) |
+ (FT_UInt32)ip[3] );
+ ip += 4;
+
+ /* According to the specification, values > 32000 or < -32000 must */
+ /* be followed by a `div' operator to make the result be in the */
+ /* range [-32000;32000]. We expect that the second argument of */
+ /* `div' is not a large number. Additionally, we don't handle */
+ /* stuff like `<large1> <large2> <num> div <num> div' or */
+ /* <large1> <large2> <num> div div'. This is probably not allowed */
+ /* anyway. */
+ if ( value > 32000 || value < -32000 )
+ {
+ if ( large_int )
+ {
+ FT_ERROR(( "t1_decoder_parse_charstrings:"
+ " no `div' after large integer\n" ));
+ }
+ else
+ large_int = TRUE;
+ }
+ else
+ {
+ if ( !large_int )
+ value = (FT_Int32)( (FT_UInt32)value << 16 );
+ }
+
+ break;
+
+ default:
+ if ( ip[-1] >= 32 )
+ {
+ if ( ip[-1] < 247 )
+ value = (FT_Int32)ip[-1] - 139;
+ else
+ {
+ if ( ++ip > limit )
+ {
+ FT_ERROR(( "t1_decoder_parse_charstrings:"
+ " unexpected EOF in integer\n" ));
+ goto Syntax_Error;
+ }
+
+ if ( ip[-2] < 251 )
+ value = ( ( ip[-2] - 247 ) * 256 ) + ip[-1] + 108;
+ else
+ value = -( ( ( ip[-2] - 251 ) * 256 ) + ip[-1] + 108 );
+ }
+
+ if ( !large_int )
+ value = (FT_Int32)( (FT_UInt32)value << 16 );
+ }
+ else
+ {
+ FT_ERROR(( "t1_decoder_parse_charstrings:"
+ " invalid byte (%d)\n", ip[-1] ));
+ goto Syntax_Error;
+ }
+ }
+
+ if ( unknown_othersubr_result_cnt > 0 )
+ {
+ switch ( op )
+ {
+ case op_callsubr:
+ case op_return:
+ case op_none:
+ case op_pop:
+ break;
+
+ default:
+ /* all operands have been transferred by previous pops */
+ unknown_othersubr_result_cnt = 0;
+ break;
+ }
+ }
+
+ if ( large_int && !( op == op_none || op == op_div ) )
+ {
+ FT_ERROR(( "t1_decoder_parse_charstrings:"
+ " no `div' after large integer\n" ));
+
+ large_int = FALSE;
+ }
+
+ /*********************************************************************/
+ /* */
+ /* Push value on stack, or process operator */
+ /* */
+ /* */
+ if ( op == op_none )
+ {
+ if ( top - decoder->stack >= T1_MAX_CHARSTRINGS_OPERANDS )
+ {
+ FT_ERROR(( "t1_decoder_parse_charstrings: stack overflow\n" ));
+ goto Syntax_Error;
+ }
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+ if ( large_int )
+ FT_TRACE4(( " %ld", value ));
+ else
+ FT_TRACE4(( " %ld", Fix2Int( value ) ));
+#endif
+
+ *top++ = value;
+ decoder->top = top;
+ }
+ else if ( op == op_callothersubr ) /* callothersubr */
+ {
+ FT_Int subr_no;
+ FT_Int arg_cnt;
+
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+ FT_TRACE4(( " callothersubr\n" ));
+ bol = TRUE;
+#endif
+
+ if ( top - decoder->stack < 2 )
+ goto Stack_Underflow;
+
+ top -= 2;
+
+ subr_no = Fix2Int( top[1] );
+ arg_cnt = Fix2Int( top[0] );
+
+ /***********************************************************/
+ /* */
+ /* remove all operands to callothersubr from the stack */
+ /* */
+ /* for handled othersubrs, where we know the number of */
+ /* arguments, we increase the stack by the value of */
+ /* known_othersubr_result_cnt */
+ /* */
+ /* for unhandled othersubrs the following pops adjust the */
+ /* stack pointer as necessary */
+
+ if ( arg_cnt > top - decoder->stack )
+ goto Stack_Underflow;
+
+ top -= arg_cnt;
+
+ known_othersubr_result_cnt = 0;
+ unknown_othersubr_result_cnt = 0;
+
+ /* XXX TODO: The checks to `arg_count == <whatever>' */
+ /* might not be correct; an othersubr expects a certain */
+ /* number of operands on the PostScript stack (as opposed */
+ /* to the T1 stack) but it doesn't have to put them there */
+ /* by itself; previous othersubrs might have left the */
+ /* operands there if they were not followed by an */
+ /* appropriate number of pops */
+ /* */
+ /* On the other hand, Adobe Reader 7.0.8 for Linux doesn't */
+ /* accept a font that contains charstrings like */
+ /* */
+ /* 100 200 2 20 callothersubr */
+ /* 300 1 20 callothersubr pop */
+ /* */
+ /* Perhaps this is the reason why BuildCharArray exists. */
+
+ switch ( subr_no )
+ {
+ case 0: /* end flex feature */
+ if ( arg_cnt != 3 )
+ goto Unexpected_OtherSubr;
+
+ if ( decoder->flex_state == 0 ||
+ decoder->num_flex_vectors != 7 )
+ {
+ FT_ERROR(( "t1_decoder_parse_charstrings:"
+ " unexpected flex end\n" ));
+ goto Syntax_Error;
+ }
+
+ /* the two `results' are popped by the following setcurrentpoint */
+ top[0] = x;
+ top[1] = y;
+ known_othersubr_result_cnt = 2;
+ break;
+
+ case 1: /* start flex feature */
+ if ( arg_cnt != 0 )
+ goto Unexpected_OtherSubr;
+
+ decoder->flex_state = 1;
+ decoder->num_flex_vectors = 0;
+ if ( ( error = t1_builder_start_point( builder, x, y ) )
+ != FT_Err_Ok ||
+ ( error = t1_builder_check_points( builder, 6 ) )
+ != FT_Err_Ok )
+ goto Fail;
+ break;
+
+ case 2: /* add flex vectors */
+ {
+ FT_Int idx;
+
+
+ if ( arg_cnt != 0 )
+ goto Unexpected_OtherSubr;
+
+ if ( decoder->flex_state == 0 )
+ {
+ FT_ERROR(( "t1_decoder_parse_charstrings:"
+ " missing flex start\n" ));
+ goto Syntax_Error;
+ }
+
+ /* note that we should not add a point for index 0; */
+ /* this will move our current position to the flex */
+ /* point without adding any point to the outline */
+ idx = decoder->num_flex_vectors++;
+ if ( idx > 0 && idx < 7 )
+ t1_builder_add_point( builder,
+ x,
+ y,
+ (FT_Byte)( idx == 3 || idx == 6 ) );
+ }
+ break;
+
+ case 3: /* change hints */
+ if ( arg_cnt != 1 )
+ goto Unexpected_OtherSubr;
+
+ known_othersubr_result_cnt = 1;
+
+ if ( hinter )
+ hinter->reset( hinter->hints, builder->current->n_points );
+ break;
+
+ case 12:
+ case 13:
+ /* counter control hints, clear stack */
+ top = decoder->stack;
+ break;
+
+ case 14:
+ case 15:
+ case 16:
+ case 17:
+ case 18: /* multiple masters */
+ {
+ PS_Blend blend = decoder->blend;
+ FT_UInt num_points, nn, mm;
+ FT_Long* delta;
+ FT_Long* values;
+
+
+ if ( !blend )
+ {
+ FT_ERROR(( "t1_decoder_parse_charstrings:"
+ " unexpected multiple masters operator\n" ));
+ goto Syntax_Error;
+ }
+
+ num_points = (FT_UInt)subr_no - 13 + ( subr_no == 18 );
+ if ( arg_cnt != (FT_Int)( num_points * blend->num_designs ) )
+ {
+ FT_ERROR(( "t1_decoder_parse_charstrings:"
+ " incorrect number of multiple masters arguments\n" ));
+ goto Syntax_Error;
+ }
+
+ /* We want to compute */
+ /* */
+ /* a0*w0 + a1*w1 + ... + ak*wk */
+ /* */
+ /* but we only have a0, a1-a0, a2-a0, ..., ak-a0. */
+ /* */
+ /* However, given that w0 + w1 + ... + wk == 1, we can */
+ /* rewrite it easily as */
+ /* */
+ /* a0 + (a1-a0)*w1 + (a2-a0)*w2 + ... + (ak-a0)*wk */
+ /* */
+ /* where k == num_designs-1. */
+ /* */
+ /* I guess that's why it's written in this `compact' */
+ /* form. */
+ /* */
+ delta = top + num_points;
+ values = top;
+ for ( nn = 0; nn < num_points; nn++ )
+ {
+ FT_Long tmp = values[0];
+
+
+ for ( mm = 1; mm < blend->num_designs; mm++ )
+ tmp += FT_MulFix( *delta++, blend->weight_vector[mm] );
+
+ *values++ = tmp;
+ }
+
+ known_othersubr_result_cnt = num_points;
+ break;
+ }
+
+ case 19:
+ /* <idx> 1 19 callothersubr */
+ /* => replace elements starting from index cvi( <idx> ) */
+ /* of BuildCharArray with WeightVector */
+ {
+ FT_Int idx;
+ PS_Blend blend = decoder->blend;
+
+
+ if ( arg_cnt != 1 || blend == NULL )
+ goto Unexpected_OtherSubr;
+
+ idx = Fix2Int( top[0] );
+
+ if ( idx < 0 ||
+ idx + blend->num_designs > decoder->len_buildchar )
+ goto Unexpected_OtherSubr;
+
+ ft_memcpy( &decoder->buildchar[idx],
+ blend->weight_vector,
+ blend->num_designs *
+ sizeof ( blend->weight_vector[0] ) );
+ }
+ break;
+
+ case 20:
+ /* <arg1> <arg2> 2 20 callothersubr pop */
+ /* ==> push <arg1> + <arg2> onto T1 stack */
+ if ( arg_cnt != 2 )
+ goto Unexpected_OtherSubr;
+
+ top[0] += top[1]; /* XXX (over|under)flow */
+
+ known_othersubr_result_cnt = 1;
+ break;
+
+ case 21:
+ /* <arg1> <arg2> 2 21 callothersubr pop */
+ /* ==> push <arg1> - <arg2> onto T1 stack */
+ if ( arg_cnt != 2 )
+ goto Unexpected_OtherSubr;
+
+ top[0] -= top[1]; /* XXX (over|under)flow */
+
+ known_othersubr_result_cnt = 1;
+ break;
+
+ case 22:
+ /* <arg1> <arg2> 2 22 callothersubr pop */
+ /* ==> push <arg1> * <arg2> onto T1 stack */
+ if ( arg_cnt != 2 )
+ goto Unexpected_OtherSubr;
+
+ top[0] = FT_MulFix( top[0], top[1] );
+
+ known_othersubr_result_cnt = 1;
+ break;
+
+ case 23:
+ /* <arg1> <arg2> 2 23 callothersubr pop */
+ /* ==> push <arg1> / <arg2> onto T1 stack */
+ if ( arg_cnt != 2 || top[1] == 0 )
+ goto Unexpected_OtherSubr;
+
+ top[0] = FT_DivFix( top[0], top[1] );
+
+ known_othersubr_result_cnt = 1;
+ break;
+
+ case 24:
+ /* <val> <idx> 2 24 callothersubr */
+ /* ==> set BuildCharArray[cvi( <idx> )] = <val> */
+ {
+ FT_Int idx;
+ PS_Blend blend = decoder->blend;
+
+
+ if ( arg_cnt != 2 || blend == NULL )
+ goto Unexpected_OtherSubr;
+
+ idx = Fix2Int( top[1] );
+
+ if ( idx < 0 || (FT_UInt) idx >= decoder->len_buildchar )
+ goto Unexpected_OtherSubr;
+
+ decoder->buildchar[idx] = top[0];
+ }
+ break;
+
+ case 25:
+ /* <idx> 1 25 callothersubr pop */
+ /* ==> push BuildCharArray[cvi( idx )] */
+ /* onto T1 stack */
+ {
+ FT_Int idx;
+ PS_Blend blend = decoder->blend;
+
+
+ if ( arg_cnt != 1 || blend == NULL )
+ goto Unexpected_OtherSubr;
+
+ idx = Fix2Int( top[0] );
+
+ if ( idx < 0 || (FT_UInt) idx >= decoder->len_buildchar )
+ goto Unexpected_OtherSubr;
+
+ top[0] = decoder->buildchar[idx];
+ }
+
+ known_othersubr_result_cnt = 1;
+ break;
+
+#if 0
+ case 26:
+ /* <val> mark <idx> ==> set BuildCharArray[cvi( <idx> )] = <val>, */
+ /* leave mark on T1 stack */
+ /* <val> <idx> ==> set BuildCharArray[cvi( <idx> )] = <val> */
+ XXX which routine has left its mark on the (PostScript) stack?;
+ break;
+#endif
+
+ case 27:
+ /* <res1> <res2> <val1> <val2> 4 27 callothersubr pop */
+ /* ==> push <res1> onto T1 stack if <val1> <= <val2>, */
+ /* otherwise push <res2> */
+ if ( arg_cnt != 4 )
+ goto Unexpected_OtherSubr;
+
+ if ( top[2] > top[3] )
+ top[0] = top[1];
+
+ known_othersubr_result_cnt = 1;
+ break;
+
+ case 28:
+ /* 0 28 callothersubr pop */
+ /* => push random value from interval [0, 1) onto stack */
+ if ( arg_cnt != 0 )
+ goto Unexpected_OtherSubr;
+
+ {
+ FT_Fixed Rand;
+
+
+ Rand = seed;
+ if ( Rand >= 0x8000L )
+ Rand++;
+
+ top[0] = Rand;
+
+ seed = FT_MulFix( seed, 0x10000L - seed );
+ if ( seed == 0 )
+ seed += 0x2873;
+ }
+
+ known_othersubr_result_cnt = 1;
+ break;
+
+ default:
+ if ( arg_cnt >= 0 && subr_no >= 0 )
+ {
+ FT_ERROR(( "t1_decoder_parse_charstrings:"
+ " unknown othersubr [%d %d], wish me luck\n",
+ arg_cnt, subr_no ));
+ unknown_othersubr_result_cnt = arg_cnt;
+ break;
+ }
+ /* fall through */
+
+ Unexpected_OtherSubr:
+ FT_ERROR(( "t1_decoder_parse_charstrings:"
+ " invalid othersubr [%d %d]\n", arg_cnt, subr_no ));
+ goto Syntax_Error;
+ }
+
+ top += known_othersubr_result_cnt;
+
+ decoder->top = top;
+ }
+ else /* general operator */
+ {
+ FT_Int num_args = t1_args_count[op];
+
+
+ FT_ASSERT( num_args >= 0 );
+
+ if ( top - decoder->stack < num_args )
+ goto Stack_Underflow;
+
+ /* XXX Operators usually take their operands from the */
+ /* bottom of the stack, i.e., the operands are */
+ /* decoder->stack[0], ..., decoder->stack[num_args - 1]; */
+ /* only div, callsubr, and callothersubr are different. */
+ /* In practice it doesn't matter (?). */
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+
+ switch ( op )
+ {
+ case op_callsubr:
+ case op_div:
+ case op_callothersubr:
+ case op_pop:
+ case op_return:
+ break;
+
+ default:
+ if ( top - decoder->stack != num_args )
+ FT_TRACE0(( "t1_decoder_parse_charstrings:"
+ " too much operands on the stack"
+ " (seen %d, expected %d)\n",
+ top - decoder->stack, num_args ));
+ break;
+ }
+
+#endif /* FT_DEBUG_LEVEL_TRACE */
+
+ top -= num_args;
+
+ switch ( op )
+ {
+ case op_endchar:
+ FT_TRACE4(( " endchar\n" ));
+
+ t1_builder_close_contour( builder );
+
+ /* close hints recording session */
+ if ( hinter )
+ {
+ if ( hinter->close( hinter->hints, builder->current->n_points ) )
+ goto Syntax_Error;
+
+ /* apply hints to the loaded glyph outline now */
+ hinter->apply( hinter->hints,
+ builder->current,
+ (PSH_Globals)builder->hints_globals,
+ decoder->hint_mode );
+ }
+
+ /* add current outline to the glyph slot */
+ FT_GlyphLoader_Add( builder->loader );
+
+ /* the compiler should optimize away this empty loop but ... */
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+
+ if ( decoder->len_buildchar > 0 )
+ {
+ FT_UInt i;
+
+
+ FT_TRACE4(( "BuildCharArray = [ " ));
+
+ for ( i = 0; i < decoder->len_buildchar; ++i )
+ FT_TRACE4(( "%d ", decoder->buildchar[i] ));
+
+ FT_TRACE4(( "]\n" ));
+ }
+
+#endif /* FT_DEBUG_LEVEL_TRACE */
+
+ FT_TRACE4(( "\n" ));
+
+ /* return now! */
+ return FT_Err_Ok;
+
+ case op_hsbw:
+ FT_TRACE4(( " hsbw" ));
+
+ builder->parse_state = T1_Parse_Have_Width;
+
+ builder->left_bearing.x += top[0];
+ builder->advance.x = top[1];
+ builder->advance.y = 0;
+
+ orig_x = x = builder->pos_x + top[0];
+ orig_y = y = builder->pos_y;
+
+ FT_UNUSED( orig_y );
+
+ /* the `metrics_only' indicates that we only want to compute */
+ /* the glyph's metrics (lsb + advance width), not load the */
+ /* rest of it; so exit immediately */
+ if ( builder->metrics_only )
+ return FT_Err_Ok;
+
+ break;
+
+ case op_seac:
+ return t1operator_seac( decoder,
+ top[0],
+ top[1],
+ top[2],
+ Fix2Int( top[3] ),
+ Fix2Int( top[4] ) );
+
+ case op_sbw:
+ FT_TRACE4(( " sbw" ));
+
+ builder->parse_state = T1_Parse_Have_Width;
+
+ builder->left_bearing.x += top[0];
+ builder->left_bearing.y += top[1];
+ builder->advance.x = top[2];
+ builder->advance.y = top[3];
+
+ x = builder->pos_x + top[0];
+ y = builder->pos_y + top[1];
+
+ /* the `metrics_only' indicates that we only want to compute */
+ /* the glyph's metrics (lsb + advance width), not load the */
+ /* rest of it; so exit immediately */
+ if ( builder->metrics_only )
+ return FT_Err_Ok;
+
+ break;
+
+ case op_closepath:
+ FT_TRACE4(( " closepath" ));
+
+ /* if there is no path, `closepath' is a no-op */
+ if ( builder->parse_state == T1_Parse_Have_Path ||
+ builder->parse_state == T1_Parse_Have_Moveto )
+ t1_builder_close_contour( builder );
+
+ builder->parse_state = T1_Parse_Have_Width;
+ break;
+
+ case op_hlineto:
+ FT_TRACE4(( " hlineto" ));
+
+ if ( ( error = t1_builder_start_point( builder, x, y ) )
+ != FT_Err_Ok )
+ goto Fail;
+
+ x += top[0];
+ goto Add_Line;
+
+ case op_hmoveto:
+ FT_TRACE4(( " hmoveto" ));
+
+ x += top[0];
+ if ( !decoder->flex_state )
+ {
+ if ( builder->parse_state == T1_Parse_Start )
+ goto Syntax_Error;
+ builder->parse_state = T1_Parse_Have_Moveto;
+ }
+ break;
+
+ case op_hvcurveto:
+ FT_TRACE4(( " hvcurveto" ));
+
+ if ( ( error = t1_builder_start_point( builder, x, y ) )
+ != FT_Err_Ok ||
+ ( error = t1_builder_check_points( builder, 3 ) )
+ != FT_Err_Ok )
+ goto Fail;
+
+ x += top[0];
+ t1_builder_add_point( builder, x, y, 0 );
+ x += top[1];
+ y += top[2];
+ t1_builder_add_point( builder, x, y, 0 );
+ y += top[3];
+ t1_builder_add_point( builder, x, y, 1 );
+ break;
+
+ case op_rlineto:
+ FT_TRACE4(( " rlineto" ));
+
+ if ( ( error = t1_builder_start_point( builder, x, y ) )
+ != FT_Err_Ok )
+ goto Fail;
+
+ x += top[0];
+ y += top[1];
+
+ Add_Line:
+ if ( ( error = t1_builder_add_point1( builder, x, y ) )
+ != FT_Err_Ok )
+ goto Fail;
+ break;
+
+ case op_rmoveto:
+ FT_TRACE4(( " rmoveto" ));
+
+ x += top[0];
+ y += top[1];
+ if ( !decoder->flex_state )
+ {
+ if ( builder->parse_state == T1_Parse_Start )
+ goto Syntax_Error;
+ builder->parse_state = T1_Parse_Have_Moveto;
+ }
+ break;
+
+ case op_rrcurveto:
+ FT_TRACE4(( " rrcurveto" ));
+
+ if ( ( error = t1_builder_start_point( builder, x, y ) )
+ != FT_Err_Ok ||
+ ( error = t1_builder_check_points( builder, 3 ) )
+ != FT_Err_Ok )
+ goto Fail;
+
+ x += top[0];
+ y += top[1];
+ t1_builder_add_point( builder, x, y, 0 );
+
+ x += top[2];
+ y += top[3];
+ t1_builder_add_point( builder, x, y, 0 );
+
+ x += top[4];
+ y += top[5];
+ t1_builder_add_point( builder, x, y, 1 );
+ break;
+
+ case op_vhcurveto:
+ FT_TRACE4(( " vhcurveto" ));
+
+ if ( ( error = t1_builder_start_point( builder, x, y ) )
+ != FT_Err_Ok ||
+ ( error = t1_builder_check_points( builder, 3 ) )
+ != FT_Err_Ok )
+ goto Fail;
+
+ y += top[0];
+ t1_builder_add_point( builder, x, y, 0 );
+ x += top[1];
+ y += top[2];
+ t1_builder_add_point( builder, x, y, 0 );
+ x += top[3];
+ t1_builder_add_point( builder, x, y, 1 );
+ break;
+
+ case op_vlineto:
+ FT_TRACE4(( " vlineto" ));
+
+ if ( ( error = t1_builder_start_point( builder, x, y ) )
+ != FT_Err_Ok )
+ goto Fail;
+
+ y += top[0];
+ goto Add_Line;
+
+ case op_vmoveto:
+ FT_TRACE4(( " vmoveto" ));
+
+ y += top[0];
+ if ( !decoder->flex_state )
+ {
+ if ( builder->parse_state == T1_Parse_Start )
+ goto Syntax_Error;
+ builder->parse_state = T1_Parse_Have_Moveto;
+ }
+ break;
+
+ case op_div:
+ FT_TRACE4(( " div" ));
+
+ /* if `large_int' is set, we divide unscaled numbers; */
+ /* otherwise, we divide numbers in 16.16 format -- */
+ /* in both cases, it is the same operation */
+ *top = FT_DivFix( top[0], top[1] );
+ ++top;
+
+ large_int = FALSE;
+ break;
+
+ case op_callsubr:
+ {
+ FT_Int idx;
+
+
+ FT_TRACE4(( " callsubr" ));
+
+ idx = Fix2Int( top[0] );
+ if ( idx < 0 || idx >= (FT_Int)decoder->num_subrs )
+ {
+ FT_ERROR(( "t1_decoder_parse_charstrings:"
+ " invalid subrs index\n" ));
+ goto Syntax_Error;
+ }
+
+ if ( zone - decoder->zones >= T1_MAX_SUBRS_CALLS )
+ {
+ FT_ERROR(( "t1_decoder_parse_charstrings:"
+ " too many nested subrs\n" ));
+ goto Syntax_Error;
+ }
+
+ zone->cursor = ip; /* save current instruction pointer */
+
+ zone++;
+
+ /* The Type 1 driver stores subroutines without the seed bytes. */
+ /* The CID driver stores subroutines with seed bytes. This */
+ /* case is taken care of when decoder->subrs_len == 0. */
+ zone->base = decoder->subrs[idx];
+
+ if ( decoder->subrs_len )
+ zone->limit = zone->base + decoder->subrs_len[idx];
+ else
+ {
+ /* We are using subroutines from a CID font. We must adjust */
+ /* for the seed bytes. */
+ zone->base += ( decoder->lenIV >= 0 ? decoder->lenIV : 0 );
+ zone->limit = decoder->subrs[idx + 1];
+ }
+
+ zone->cursor = zone->base;
+
+ if ( !zone->base )
+ {
+ FT_ERROR(( "t1_decoder_parse_charstrings:"
+ " invoking empty subrs\n" ));
+ goto Syntax_Error;
+ }
+
+ decoder->zone = zone;
+ ip = zone->base;
+ limit = zone->limit;
+ break;
+ }
+
+ case op_pop:
+ FT_TRACE4(( " pop" ));
+
+ if ( known_othersubr_result_cnt > 0 )
+ {
+ known_othersubr_result_cnt--;
+ /* ignore, we pushed the operands ourselves */
+ break;
+ }
+
+ if ( unknown_othersubr_result_cnt == 0 )
+ {
+ FT_ERROR(( "t1_decoder_parse_charstrings:"
+ " no more operands for othersubr\n" ));
+ goto Syntax_Error;
+ }
+
+ unknown_othersubr_result_cnt--;
+ top++; /* `push' the operand to callothersubr onto the stack */
+ break;
+
+ case op_return:
+ FT_TRACE4(( " return" ));
+
+ if ( zone <= decoder->zones )
+ {
+ FT_ERROR(( "t1_decoder_parse_charstrings:"
+ " unexpected return\n" ));
+ goto Syntax_Error;
+ }
+
+ zone--;
+ ip = zone->cursor;
+ limit = zone->limit;
+ decoder->zone = zone;
+ break;
+
+ case op_dotsection:
+ FT_TRACE4(( " dotsection" ));
+
+ break;
+
+ case op_hstem:
+ FT_TRACE4(( " hstem" ));
+
+ /* record horizontal hint */
+ if ( hinter )
+ {
+ /* top[0] += builder->left_bearing.y; */
+ hinter->stem( hinter->hints, 1, top );
+ }
+ break;
+
+ case op_hstem3:
+ FT_TRACE4(( " hstem3" ));
+
+ /* record horizontal counter-controlled hints */
+ if ( hinter )
+ hinter->stem3( hinter->hints, 1, top );
+ break;
+
+ case op_vstem:
+ FT_TRACE4(( " vstem" ));
+
+ /* record vertical hint */
+ if ( hinter )
+ {
+ top[0] += orig_x;
+ hinter->stem( hinter->hints, 0, top );
+ }
+ break;
+
+ case op_vstem3:
+ FT_TRACE4(( " vstem3" ));
+
+ /* record vertical counter-controlled hints */
+ if ( hinter )
+ {
+ FT_Pos dx = orig_x;
+
+
+ top[0] += dx;
+ top[2] += dx;
+ top[4] += dx;
+ hinter->stem3( hinter->hints, 0, top );
+ }
+ break;
+
+ case op_setcurrentpoint:
+ FT_TRACE4(( " setcurrentpoint" ));
+
+ /* From the T1 specification, section 6.4: */
+ /* */
+ /* The setcurrentpoint command is used only in */
+ /* conjunction with results from OtherSubrs procedures. */
+
+ /* known_othersubr_result_cnt != 0 is already handled */
+ /* above. */
+
+ /* Note, however, that both Ghostscript and Adobe */
+ /* Distiller handle this situation by silently ignoring */
+ /* the inappropriate `setcurrentpoint' instruction. So */
+ /* we do the same. */
+#if 0
+
+ if ( decoder->flex_state != 1 )
+ {
+ FT_ERROR(( "t1_decoder_parse_charstrings:"
+ " unexpected `setcurrentpoint'\n" ));
+ goto Syntax_Error;
+ }
+ else
+ ...
+#endif
+
+ x = top[0];
+ y = top[1];
+ decoder->flex_state = 0;
+ break;
+
+ case op_unknown15:
+ FT_TRACE4(( " opcode_15" ));
+ /* nothing to do except to pop the two arguments */
+ break;
+
+ default:
+ FT_ERROR(( "t1_decoder_parse_charstrings:"
+ " unhandled opcode %d\n", op ));
+ goto Syntax_Error;
+ }
+
+ /* XXX Operators usually clear the operand stack; */
+ /* only div, callsubr, callothersubr, pop, and */
+ /* return are different. */
+ /* In practice it doesn't matter (?). */
+
+ decoder->top = top;
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+ FT_TRACE4(( "\n" ));
+ bol = TRUE;
+#endif
+
+ } /* general operator processing */
+
+ } /* while ip < limit */
+
+ FT_TRACE4(( "..end..\n\n" ));
+
+ Fail:
+ return error;
+
+ Syntax_Error:
+ return FT_THROW( Syntax_Error );
+
+ Stack_Underflow:
+ return FT_THROW( Stack_Underflow );
+ }
+
+
+ /* parse a single Type 1 glyph */
+ FT_LOCAL_DEF( FT_Error )
+ t1_decoder_parse_glyph( T1_Decoder decoder,
+ FT_UInt glyph )
+ {
+ return decoder->parse_callback( decoder, glyph );
+ }
+
+
+ /* initialize T1 decoder */
+ FT_LOCAL_DEF( FT_Error )
+ t1_decoder_init( T1_Decoder decoder,
+ FT_Face face,
+ FT_Size size,
+ FT_GlyphSlot slot,
+ FT_Byte** glyph_names,
+ PS_Blend blend,
+ FT_Bool hinting,
+ FT_Render_Mode hint_mode,
+ T1_Decoder_Callback parse_callback )
+ {
+ FT_MEM_ZERO( decoder, sizeof ( *decoder ) );
+
+ /* retrieve PSNames interface from list of current modules */
+ {
+ FT_Service_PsCMaps psnames = 0;
+
+
+ FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS );
+ if ( !psnames )
+ {
+ FT_ERROR(( "t1_decoder_init:"
+ " the `psnames' module is not available\n" ));
+ return FT_THROW( Unimplemented_Feature );
+ }
+
+ decoder->psnames = psnames;
+ }
+
+ t1_builder_init( &decoder->builder, face, size, slot, hinting );
+
+ /* decoder->buildchar and decoder->len_buildchar have to be */
+ /* initialized by the caller since we cannot know the length */
+ /* of the BuildCharArray */
+
+ decoder->num_glyphs = (FT_UInt)face->num_glyphs;
+ decoder->glyph_names = glyph_names;
+ decoder->hint_mode = hint_mode;
+ decoder->blend = blend;
+ decoder->parse_callback = parse_callback;
+
+ decoder->funcs = t1_decoder_funcs;
+
+ return FT_Err_Ok;
+ }
+
+
+ /* finalize T1 decoder */
+ FT_LOCAL_DEF( void )
+ t1_decoder_done( T1_Decoder decoder )
+ {
+ t1_builder_done( &decoder->builder );
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/t1decode.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/t1decode.h
new file mode 100644
index 0000000000..23bd99fa63
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psaux/t1decode.h
@@ -0,0 +1,64 @@
+/***************************************************************************/
+/* */
+/* t1decode.h */
+/* */
+/* PostScript Type 1 decoding routines (specification). */
+/* */
+/* Copyright 2000-2001, 2002, 2003 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __T1DECODE_H__
+#define __T1DECODE_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/psaux.h"
+#include "../../include/freetype/internal/t1types.h"
+
+
+FT_BEGIN_HEADER
+
+
+ FT_CALLBACK_TABLE
+ const T1_Decoder_FuncsRec t1_decoder_funcs;
+
+
+ FT_LOCAL( FT_Error )
+ t1_decoder_parse_glyph( T1_Decoder decoder,
+ FT_UInt glyph_index );
+
+ FT_LOCAL( FT_Error )
+ t1_decoder_parse_charstrings( T1_Decoder decoder,
+ FT_Byte* base,
+ FT_UInt len );
+
+ FT_LOCAL( FT_Error )
+ t1_decoder_init( T1_Decoder decoder,
+ FT_Face face,
+ FT_Size size,
+ FT_GlyphSlot slot,
+ FT_Byte** glyph_names,
+ PS_Blend blend,
+ FT_Bool hinting,
+ FT_Render_Mode hint_mode,
+ T1_Decoder_Callback parse_glyph );
+
+ FT_LOCAL( void )
+ t1_decoder_done( T1_Decoder decoder );
+
+
+FT_END_HEADER
+
+#endif /* __T1DECODE_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/Jamfile b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/Jamfile
new file mode 100644
index 0000000000..779f1b0b82
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/Jamfile
@@ -0,0 +1,29 @@
+# FreeType 2 src/pshinter Jamfile
+#
+# Copyright 2001, 2003 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT. By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+SubDir FT2_TOP $(FT2_SRC_DIR) pshinter ;
+
+{
+ local _sources ;
+
+ if $(FT2_MULTI)
+ {
+ _sources = pshrec pshglob pshalgo pshmod pshpic ;
+ }
+ else
+ {
+ _sources = pshinter ;
+ }
+
+ Library $(FT2_LIB) : $(_sources).c ;
+}
+
+# end of src/pshinter Jamfile
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/fxft_pshinter.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/fxft_pshinter.c
new file mode 100644
index 0000000000..27cf308a76
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/fxft_pshinter.c
@@ -0,0 +1,33 @@
+#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501
+/***************************************************************************/
+/* */
+/* pshinter.c */
+/* */
+/* FreeType PostScript Hinting module */
+/* */
+/* Copyright 2001, 2003 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#define FT_MAKE_OPTION_SINGLE_OBJECT
+#define FT2_BUILD_LIBRARY
+
+#include "../../include/ft2build.h"
+#include "pshpic.c"
+#include "pshrec.c"
+#include "pshglob.c"
+#include "pshalgo.c"
+#include "pshmod.c"
+
+
+/* END */
+#endif
+
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/module.mk b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/module.mk
new file mode 100644
index 0000000000..ed24eb7fa8
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/module.mk
@@ -0,0 +1,23 @@
+#
+# FreeType 2 PSHinter module definition
+#
+
+
+# Copyright 1996-2001, 2006 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT. By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+
+FTMODULE_H_COMMANDS += PSHINTER_MODULE
+
+define PSHINTER_MODULE
+$(OPEN_DRIVER) FT_Module_Class, pshinter_module_class $(CLOSE_DRIVER)
+$(ECHO_DRIVER)pshinter $(ECHO_DRIVER_DESC)Postscript hinter module$(ECHO_DRIVER_DONE)
+endef
+
+# EOF
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshalgo.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshalgo.c
new file mode 100644
index 0000000000..96f2cd502d
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshalgo.c
@@ -0,0 +1,2305 @@
+/***************************************************************************/
+/* */
+/* pshalgo.c */
+/* */
+/* PostScript hinting algorithm (body). */
+/* */
+/* Copyright 2001-2010, 2012, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used */
+/* modified and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftcalc.h"
+#include "pshalgo.h"
+
+#include "pshnterr.h"
+
+
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_pshalgo2
+
+
+#ifdef DEBUG_HINTER
+ PSH_Hint_Table ps_debug_hint_table = 0;
+ PSH_HintFunc ps_debug_hint_func = 0;
+ PSH_Glyph ps_debug_glyph = 0;
+#endif
+
+
+#define COMPUTE_INFLEXS /* compute inflection points to optimize `S' */
+ /* and similar glyphs */
+#define STRONGER /* slightly increase the contrast of smooth */
+ /* hinting */
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** BASIC HINTS RECORDINGS *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /* return true if two stem hints overlap */
+ static FT_Int
+ psh_hint_overlap( PSH_Hint hint1,
+ PSH_Hint hint2 )
+ {
+ return hint1->org_pos + hint1->org_len >= hint2->org_pos &&
+ hint2->org_pos + hint2->org_len >= hint1->org_pos;
+ }
+
+
+ /* destroy hints table */
+ static void
+ psh_hint_table_done( PSH_Hint_Table table,
+ FT_Memory memory )
+ {
+ FT_FREE( table->zones );
+ table->num_zones = 0;
+ table->zone = 0;
+
+ FT_FREE( table->sort );
+ FT_FREE( table->hints );
+ table->num_hints = 0;
+ table->max_hints = 0;
+ table->sort_global = 0;
+ }
+
+
+ /* deactivate all hints in a table */
+ static void
+ psh_hint_table_deactivate( PSH_Hint_Table table )
+ {
+ FT_UInt count = table->max_hints;
+ PSH_Hint hint = table->hints;
+
+
+ for ( ; count > 0; count--, hint++ )
+ {
+ psh_hint_deactivate( hint );
+ hint->order = -1;
+ }
+ }
+
+
+ /* internal function to record a new hint */
+ static void
+ psh_hint_table_record( PSH_Hint_Table table,
+ FT_UInt idx )
+ {
+ PSH_Hint hint = table->hints + idx;
+
+
+ if ( idx >= table->max_hints )
+ {
+ FT_TRACE0(( "psh_hint_table_record: invalid hint index %d\n", idx ));
+ return;
+ }
+
+ /* ignore active hints */
+ if ( psh_hint_is_active( hint ) )
+ return;
+
+ psh_hint_activate( hint );
+
+ /* now scan the current active hint set to check */
+ /* whether `hint' overlaps with another hint */
+ {
+ PSH_Hint* sorted = table->sort_global;
+ FT_UInt count = table->num_hints;
+ PSH_Hint hint2;
+
+
+ hint->parent = 0;
+ for ( ; count > 0; count--, sorted++ )
+ {
+ hint2 = sorted[0];
+
+ if ( psh_hint_overlap( hint, hint2 ) )
+ {
+ hint->parent = hint2;
+ break;
+ }
+ }
+ }
+
+ if ( table->num_hints < table->max_hints )
+ table->sort_global[table->num_hints++] = hint;
+ else
+ FT_TRACE0(( "psh_hint_table_record: too many sorted hints! BUG!\n" ));
+ }
+
+
+ static void
+ psh_hint_table_record_mask( PSH_Hint_Table table,
+ PS_Mask hint_mask )
+ {
+ FT_Int mask = 0, val = 0;
+ FT_Byte* cursor = hint_mask->bytes;
+ FT_UInt idx, limit;
+
+
+ limit = hint_mask->num_bits;
+
+ for ( idx = 0; idx < limit; idx++ )
+ {
+ if ( mask == 0 )
+ {
+ val = *cursor++;
+ mask = 0x80;
+ }
+
+ if ( val & mask )
+ psh_hint_table_record( table, idx );
+
+ mask >>= 1;
+ }
+ }
+
+
+ /* create hints table */
+ static FT_Error
+ psh_hint_table_init( PSH_Hint_Table table,
+ PS_Hint_Table hints,
+ PS_Mask_Table hint_masks,
+ PS_Mask_Table counter_masks,
+ FT_Memory memory )
+ {
+ FT_UInt count;
+ FT_Error error;
+
+ FT_UNUSED( counter_masks );
+
+
+ count = hints->num_hints;
+
+ /* allocate our tables */
+ if ( FT_NEW_ARRAY( table->sort, 2 * count ) ||
+ FT_NEW_ARRAY( table->hints, count ) ||
+ FT_NEW_ARRAY( table->zones, 2 * count + 1 ) )
+ goto Exit;
+
+ table->max_hints = count;
+ table->sort_global = table->sort + count;
+ table->num_hints = 0;
+ table->num_zones = 0;
+ table->zone = 0;
+
+ /* initialize the `table->hints' array */
+ {
+ PSH_Hint write = table->hints;
+ PS_Hint read = hints->hints;
+
+
+ for ( ; count > 0; count--, write++, read++ )
+ {
+ write->org_pos = read->pos;
+ write->org_len = read->len;
+ write->flags = read->flags;
+ }
+ }
+
+ /* we now need to determine the initial `parent' stems; first */
+ /* activate the hints that are given by the initial hint masks */
+ if ( hint_masks )
+ {
+ PS_Mask mask = hint_masks->masks;
+
+
+ count = hint_masks->num_masks;
+ table->hint_masks = hint_masks;
+
+ for ( ; count > 0; count--, mask++ )
+ psh_hint_table_record_mask( table, mask );
+ }
+
+ /* finally, do a linear parse in case some hints were left alone */
+ if ( table->num_hints != table->max_hints )
+ {
+ FT_UInt idx;
+
+
+ FT_TRACE0(( "psh_hint_table_init: missing/incorrect hint masks\n" ));
+
+ count = table->max_hints;
+ for ( idx = 0; idx < count; idx++ )
+ psh_hint_table_record( table, idx );
+ }
+
+ Exit:
+ return error;
+ }
+
+
+ static void
+ psh_hint_table_activate_mask( PSH_Hint_Table table,
+ PS_Mask hint_mask )
+ {
+ FT_Int mask = 0, val = 0;
+ FT_Byte* cursor = hint_mask->bytes;
+ FT_UInt idx, limit, count;
+
+
+ limit = hint_mask->num_bits;
+ count = 0;
+
+ psh_hint_table_deactivate( table );
+
+ for ( idx = 0; idx < limit; idx++ )
+ {
+ if ( mask == 0 )
+ {
+ val = *cursor++;
+ mask = 0x80;
+ }
+
+ if ( val & mask )
+ {
+ PSH_Hint hint = &table->hints[idx];
+
+
+ if ( !psh_hint_is_active( hint ) )
+ {
+ FT_UInt count2;
+
+#if 0
+ PSH_Hint* sort = table->sort;
+ PSH_Hint hint2;
+
+
+ for ( count2 = count; count2 > 0; count2--, sort++ )
+ {
+ hint2 = sort[0];
+ if ( psh_hint_overlap( hint, hint2 ) )
+ FT_TRACE0(( "psh_hint_table_activate_mask:"
+ " found overlapping hints\n" ))
+ }
+#else
+ count2 = 0;
+#endif
+
+ if ( count2 == 0 )
+ {
+ psh_hint_activate( hint );
+ if ( count < table->max_hints )
+ table->sort[count++] = hint;
+ else
+ FT_TRACE0(( "psh_hint_tableactivate_mask:"
+ " too many active hints\n" ));
+ }
+ }
+ }
+
+ mask >>= 1;
+ }
+ table->num_hints = count;
+
+ /* now, sort the hints; they are guaranteed to not overlap */
+ /* so we can compare their "org_pos" field directly */
+ {
+ FT_Int i1, i2;
+ PSH_Hint hint1, hint2;
+ PSH_Hint* sort = table->sort;
+
+
+ /* a simple bubble sort will do, since in 99% of cases, the hints */
+ /* will be already sorted -- and the sort will be linear */
+ for ( i1 = 1; i1 < (FT_Int)count; i1++ )
+ {
+ hint1 = sort[i1];
+ for ( i2 = i1 - 1; i2 >= 0; i2-- )
+ {
+ hint2 = sort[i2];
+
+ if ( hint2->org_pos < hint1->org_pos )
+ break;
+
+ sort[i2 + 1] = hint2;
+ sort[i2] = hint1;
+ }
+ }
+ }
+ }
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** HINTS GRID-FITTING AND OPTIMIZATION *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+#if 1
+ static FT_Pos
+ psh_dimension_quantize_len( PSH_Dimension dim,
+ FT_Pos len,
+ FT_Bool do_snapping )
+ {
+ if ( len <= 64 )
+ len = 64;
+ else
+ {
+ FT_Pos delta = len - dim->stdw.widths[0].cur;
+
+
+ if ( delta < 0 )
+ delta = -delta;
+
+ if ( delta < 40 )
+ {
+ len = dim->stdw.widths[0].cur;
+ if ( len < 48 )
+ len = 48;
+ }
+
+ if ( len < 3 * 64 )
+ {
+ delta = ( len & 63 );
+ len &= -64;
+
+ if ( delta < 10 )
+ len += delta;
+
+ else if ( delta < 32 )
+ len += 10;
+
+ else if ( delta < 54 )
+ len += 54;
+
+ else
+ len += delta;
+ }
+ else
+ len = FT_PIX_ROUND( len );
+ }
+
+ if ( do_snapping )
+ len = FT_PIX_ROUND( len );
+
+ return len;
+ }
+#endif /* 0 */
+
+
+#ifdef DEBUG_HINTER
+
+ static void
+ ps_simple_scale( PSH_Hint_Table table,
+ FT_Fixed scale,
+ FT_Fixed delta,
+ FT_Int dimension )
+ {
+ FT_UInt count;
+
+
+ for ( count = 0; count < table->max_hints; count++ )
+ {
+ PSH_Hint hint = table->hints + count;
+
+
+ hint->cur_pos = FT_MulFix( hint->org_pos, scale ) + delta;
+ hint->cur_len = FT_MulFix( hint->org_len, scale );
+
+ if ( ps_debug_hint_func )
+ ps_debug_hint_func( hint, dimension );
+ }
+ }
+
+#endif /* DEBUG_HINTER */
+
+
+ static FT_Fixed
+ psh_hint_snap_stem_side_delta( FT_Fixed pos,
+ FT_Fixed len )
+ {
+ FT_Fixed delta1 = FT_PIX_ROUND( pos ) - pos;
+ FT_Fixed delta2 = FT_PIX_ROUND( pos + len ) - pos - len;
+
+
+ if ( FT_ABS( delta1 ) <= FT_ABS( delta2 ) )
+ return delta1;
+ else
+ return delta2;
+ }
+
+
+ static void
+ psh_hint_align( PSH_Hint hint,
+ PSH_Globals globals,
+ FT_Int dimension,
+ PSH_Glyph glyph )
+ {
+ PSH_Dimension dim = &globals->dimension[dimension];
+ FT_Fixed scale = dim->scale_mult;
+ FT_Fixed delta = dim->scale_delta;
+
+
+ if ( !psh_hint_is_fitted( hint ) )
+ {
+ FT_Pos pos = FT_MulFix( hint->org_pos, scale ) + delta;
+ FT_Pos len = FT_MulFix( hint->org_len, scale );
+
+ FT_Int do_snapping;
+ FT_Pos fit_len;
+ PSH_AlignmentRec align;
+
+
+ /* ignore stem alignments when requested through the hint flags */
+ if ( ( dimension == 0 && !glyph->do_horz_hints ) ||
+ ( dimension == 1 && !glyph->do_vert_hints ) )
+ {
+ hint->cur_pos = pos;
+ hint->cur_len = len;
+
+ psh_hint_set_fitted( hint );
+ return;
+ }
+
+ /* perform stem snapping when requested - this is necessary
+ * for monochrome and LCD hinting modes only
+ */
+ do_snapping = ( dimension == 0 && glyph->do_horz_snapping ) ||
+ ( dimension == 1 && glyph->do_vert_snapping );
+
+ hint->cur_len = fit_len = len;
+
+ /* check blue zones for horizontal stems */
+ align.align = PSH_BLUE_ALIGN_NONE;
+ align.align_bot = align.align_top = 0;
+
+ if ( dimension == 1 )
+ psh_blues_snap_stem( &globals->blues,
+ hint->org_pos + hint->org_len,
+ hint->org_pos,
+ &align );
+
+ switch ( align.align )
+ {
+ case PSH_BLUE_ALIGN_TOP:
+ /* the top of the stem is aligned against a blue zone */
+ hint->cur_pos = align.align_top - fit_len;
+ break;
+
+ case PSH_BLUE_ALIGN_BOT:
+ /* the bottom of the stem is aligned against a blue zone */
+ hint->cur_pos = align.align_bot;
+ break;
+
+ case PSH_BLUE_ALIGN_TOP | PSH_BLUE_ALIGN_BOT:
+ /* both edges of the stem are aligned against blue zones */
+ hint->cur_pos = align.align_bot;
+ hint->cur_len = align.align_top - align.align_bot;
+ break;
+
+ default:
+ {
+ PSH_Hint parent = hint->parent;
+
+
+ if ( parent )
+ {
+ FT_Pos par_org_center, par_cur_center;
+ FT_Pos cur_org_center, cur_delta;
+
+
+ /* ensure that parent is already fitted */
+ if ( !psh_hint_is_fitted( parent ) )
+ psh_hint_align( parent, globals, dimension, glyph );
+
+ /* keep original relation between hints, this is, use the */
+ /* scaled distance between the centers of the hints to */
+ /* compute the new position */
+ par_org_center = parent->org_pos + ( parent->org_len >> 1 );
+ par_cur_center = parent->cur_pos + ( parent->cur_len >> 1 );
+ cur_org_center = hint->org_pos + ( hint->org_len >> 1 );
+
+ cur_delta = FT_MulFix( cur_org_center - par_org_center, scale );
+ pos = par_cur_center + cur_delta - ( len >> 1 );
+ }
+
+ hint->cur_pos = pos;
+ hint->cur_len = fit_len;
+
+ /* Stem adjustment tries to snap stem widths to standard
+ * ones. This is important to prevent unpleasant rounding
+ * artefacts.
+ */
+ if ( glyph->do_stem_adjust )
+ {
+ if ( len <= 64 )
+ {
+ /* the stem is less than one pixel; we will center it
+ * around the nearest pixel center
+ */
+ if ( len >= 32 )
+ {
+ /* This is a special case where we also widen the stem
+ * and align it to the pixel grid.
+ *
+ * stem_center = pos + (len/2)
+ * nearest_pixel_center = FT_ROUND(stem_center-32)+32
+ * new_pos = nearest_pixel_center-32
+ * = FT_ROUND(stem_center-32)
+ * = FT_FLOOR(stem_center-32+32)
+ * = FT_FLOOR(stem_center)
+ * new_len = 64
+ */
+ pos = FT_PIX_FLOOR( pos + ( len >> 1 ) );
+ len = 64;
+ }
+ else if ( len > 0 )
+ {
+ /* This is a very small stem; we simply align it to the
+ * pixel grid, trying to find the minimum displacement.
+ *
+ * left = pos
+ * right = pos + len
+ * left_nearest_edge = ROUND(pos)
+ * right_nearest_edge = ROUND(right)
+ *
+ * if ( ABS(left_nearest_edge - left) <=
+ * ABS(right_nearest_edge - right) )
+ * new_pos = left
+ * else
+ * new_pos = right
+ */
+ FT_Pos left_nearest = FT_PIX_ROUND( pos );
+ FT_Pos right_nearest = FT_PIX_ROUND( pos + len );
+ FT_Pos left_disp = left_nearest - pos;
+ FT_Pos right_disp = right_nearest - ( pos + len );
+
+
+ if ( left_disp < 0 )
+ left_disp = -left_disp;
+ if ( right_disp < 0 )
+ right_disp = -right_disp;
+ if ( left_disp <= right_disp )
+ pos = left_nearest;
+ else
+ pos = right_nearest;
+ }
+ else
+ {
+ /* this is a ghost stem; we simply round it */
+ pos = FT_PIX_ROUND( pos );
+ }
+ }
+ else
+ {
+ len = psh_dimension_quantize_len( dim, len, 0 );
+ }
+ }
+
+ /* now that we have a good hinted stem width, try to position */
+ /* the stem along a pixel grid integer coordinate */
+ hint->cur_pos = pos + psh_hint_snap_stem_side_delta( pos, len );
+ hint->cur_len = len;
+ }
+ }
+
+ if ( do_snapping )
+ {
+ pos = hint->cur_pos;
+ len = hint->cur_len;
+
+ if ( len < 64 )
+ len = 64;
+ else
+ len = FT_PIX_ROUND( len );
+
+ switch ( align.align )
+ {
+ case PSH_BLUE_ALIGN_TOP:
+ hint->cur_pos = align.align_top - len;
+ hint->cur_len = len;
+ break;
+
+ case PSH_BLUE_ALIGN_BOT:
+ hint->cur_len = len;
+ break;
+
+ case PSH_BLUE_ALIGN_BOT | PSH_BLUE_ALIGN_TOP:
+ /* don't touch */
+ break;
+
+
+ default:
+ hint->cur_len = len;
+ if ( len & 64 )
+ pos = FT_PIX_FLOOR( pos + ( len >> 1 ) ) + 32;
+ else
+ pos = FT_PIX_ROUND( pos + ( len >> 1 ) );
+
+ hint->cur_pos = pos - ( len >> 1 );
+ hint->cur_len = len;
+ }
+ }
+
+ psh_hint_set_fitted( hint );
+
+#ifdef DEBUG_HINTER
+ if ( ps_debug_hint_func )
+ ps_debug_hint_func( hint, dimension );
+#endif
+ }
+ }
+
+
+#if 0 /* not used for now, experimental */
+
+ /*
+ * A variant to perform "light" hinting (i.e. FT_RENDER_MODE_LIGHT)
+ * of stems
+ */
+ static void
+ psh_hint_align_light( PSH_Hint hint,
+ PSH_Globals globals,
+ FT_Int dimension,
+ PSH_Glyph glyph )
+ {
+ PSH_Dimension dim = &globals->dimension[dimension];
+ FT_Fixed scale = dim->scale_mult;
+ FT_Fixed delta = dim->scale_delta;
+
+
+ if ( !psh_hint_is_fitted( hint ) )
+ {
+ FT_Pos pos = FT_MulFix( hint->org_pos, scale ) + delta;
+ FT_Pos len = FT_MulFix( hint->org_len, scale );
+
+ FT_Pos fit_len;
+
+ PSH_AlignmentRec align;
+
+
+ /* ignore stem alignments when requested through the hint flags */
+ if ( ( dimension == 0 && !glyph->do_horz_hints ) ||
+ ( dimension == 1 && !glyph->do_vert_hints ) )
+ {
+ hint->cur_pos = pos;
+ hint->cur_len = len;
+
+ psh_hint_set_fitted( hint );
+ return;
+ }
+
+ fit_len = len;
+
+ hint->cur_len = fit_len;
+
+ /* check blue zones for horizontal stems */
+ align.align = PSH_BLUE_ALIGN_NONE;
+ align.align_bot = align.align_top = 0;
+
+ if ( dimension == 1 )
+ psh_blues_snap_stem( &globals->blues,
+ hint->org_pos + hint->org_len,
+ hint->org_pos,
+ &align );
+
+ switch ( align.align )
+ {
+ case PSH_BLUE_ALIGN_TOP:
+ /* the top of the stem is aligned against a blue zone */
+ hint->cur_pos = align.align_top - fit_len;
+ break;
+
+ case PSH_BLUE_ALIGN_BOT:
+ /* the bottom of the stem is aligned against a blue zone */
+ hint->cur_pos = align.align_bot;
+ break;
+
+ case PSH_BLUE_ALIGN_TOP | PSH_BLUE_ALIGN_BOT:
+ /* both edges of the stem are aligned against blue zones */
+ hint->cur_pos = align.align_bot;
+ hint->cur_len = align.align_top - align.align_bot;
+ break;
+
+ default:
+ {
+ PSH_Hint parent = hint->parent;
+
+
+ if ( parent )
+ {
+ FT_Pos par_org_center, par_cur_center;
+ FT_Pos cur_org_center, cur_delta;
+
+
+ /* ensure that parent is already fitted */
+ if ( !psh_hint_is_fitted( parent ) )
+ psh_hint_align_light( parent, globals, dimension, glyph );
+
+ par_org_center = parent->org_pos + ( parent->org_len / 2 );
+ par_cur_center = parent->cur_pos + ( parent->cur_len / 2 );
+ cur_org_center = hint->org_pos + ( hint->org_len / 2 );
+
+ cur_delta = FT_MulFix( cur_org_center - par_org_center, scale );
+ pos = par_cur_center + cur_delta - ( len >> 1 );
+ }
+
+ /* Stems less than one pixel wide are easy -- we want to
+ * make them as dark as possible, so they must fall within
+ * one pixel. If the stem is split between two pixels
+ * then snap the edge that is nearer to the pixel boundary
+ * to the pixel boundary.
+ */
+ if ( len <= 64 )
+ {
+ if ( ( pos + len + 63 ) / 64 != pos / 64 + 1 )
+ pos += psh_hint_snap_stem_side_delta ( pos, len );
+ }
+
+ /* Position stems other to minimize the amount of mid-grays.
+ * There are, in general, two positions that do this,
+ * illustrated as A) and B) below.
+ *
+ * + + + +
+ *
+ * A) |--------------------------------|
+ * B) |--------------------------------|
+ * C) |--------------------------------|
+ *
+ * Position A) (split the excess stem equally) should be better
+ * for stems of width N + f where f < 0.5.
+ *
+ * Position B) (split the deficiency equally) should be better
+ * for stems of width N + f where f > 0.5.
+ *
+ * It turns out though that minimizing the total number of lit
+ * pixels is also important, so position C), with one edge
+ * aligned with a pixel boundary is actually preferable
+ * to A). There are also more possibile positions for C) than
+ * for A) or B), so it involves less distortion of the overall
+ * character shape.
+ */
+ else /* len > 64 */
+ {
+ FT_Fixed frac_len = len & 63;
+ FT_Fixed center = pos + ( len >> 1 );
+ FT_Fixed delta_a, delta_b;
+
+
+ if ( ( len / 64 ) & 1 )
+ {
+ delta_a = FT_PIX_FLOOR( center ) + 32 - center;
+ delta_b = FT_PIX_ROUND( center ) - center;
+ }
+ else
+ {
+ delta_a = FT_PIX_ROUND( center ) - center;
+ delta_b = FT_PIX_FLOOR( center ) + 32 - center;
+ }
+
+ /* We choose between B) and C) above based on the amount
+ * of fractinal stem width; for small amounts, choose
+ * C) always, for large amounts, B) always, and inbetween,
+ * pick whichever one involves less stem movement.
+ */
+ if ( frac_len < 32 )
+ {
+ pos += psh_hint_snap_stem_side_delta ( pos, len );
+ }
+ else if ( frac_len < 48 )
+ {
+ FT_Fixed side_delta = psh_hint_snap_stem_side_delta ( pos,
+ len );
+
+ if ( FT_ABS( side_delta ) < FT_ABS( delta_b ) )
+ pos += side_delta;
+ else
+ pos += delta_b;
+ }
+ else
+ {
+ pos += delta_b;
+ }
+ }
+
+ hint->cur_pos = pos;
+ }
+ } /* switch */
+
+ psh_hint_set_fitted( hint );
+
+#ifdef DEBUG_HINTER
+ if ( ps_debug_hint_func )
+ ps_debug_hint_func( hint, dimension );
+#endif
+ }
+ }
+
+#endif /* 0 */
+
+
+ static void
+ psh_hint_table_align_hints( PSH_Hint_Table table,
+ PSH_Globals globals,
+ FT_Int dimension,
+ PSH_Glyph glyph )
+ {
+ PSH_Hint hint;
+ FT_UInt count;
+
+#ifdef DEBUG_HINTER
+
+ PSH_Dimension dim = &globals->dimension[dimension];
+ FT_Fixed scale = dim->scale_mult;
+ FT_Fixed delta = dim->scale_delta;
+
+
+ if ( ps_debug_no_vert_hints && dimension == 0 )
+ {
+ ps_simple_scale( table, scale, delta, dimension );
+ return;
+ }
+
+ if ( ps_debug_no_horz_hints && dimension == 1 )
+ {
+ ps_simple_scale( table, scale, delta, dimension );
+ return;
+ }
+
+#endif /* DEBUG_HINTER*/
+
+ hint = table->hints;
+ count = table->max_hints;
+
+ for ( ; count > 0; count--, hint++ )
+ psh_hint_align( hint, globals, dimension, glyph );
+ }
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** POINTS INTERPOLATION ROUTINES *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+#define PSH_ZONE_MIN -3200000L
+#define PSH_ZONE_MAX +3200000L
+
+#define xxDEBUG_ZONES
+
+
+#ifdef DEBUG_ZONES
+
+#include "../../include/freetype/config/ftstdlib.h"
+
+ static void
+ psh_print_zone( PSH_Zone zone )
+ {
+ printf( "zone [scale,delta,min,max] = [%.3f,%.3f,%d,%d]\n",
+ zone->scale / 65536.0,
+ zone->delta / 64.0,
+ zone->min,
+ zone->max );
+ }
+
+#else
+
+#define psh_print_zone( x ) do { } while ( 0 )
+
+#endif /* DEBUG_ZONES */
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** HINTER GLYPH MANAGEMENT *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+#if 1
+
+#define psh_corner_is_flat ft_corner_is_flat
+#define psh_corner_orientation ft_corner_orientation
+
+#else
+
+ FT_LOCAL_DEF( FT_Int )
+ psh_corner_is_flat( FT_Pos x_in,
+ FT_Pos y_in,
+ FT_Pos x_out,
+ FT_Pos y_out )
+ {
+ FT_Pos ax = x_in;
+ FT_Pos ay = y_in;
+
+ FT_Pos d_in, d_out, d_corner;
+
+
+ if ( ax < 0 )
+ ax = -ax;
+ if ( ay < 0 )
+ ay = -ay;
+ d_in = ax + ay;
+
+ ax = x_out;
+ if ( ax < 0 )
+ ax = -ax;
+ ay = y_out;
+ if ( ay < 0 )
+ ay = -ay;
+ d_out = ax + ay;
+
+ ax = x_out + x_in;
+ if ( ax < 0 )
+ ax = -ax;
+ ay = y_out + y_in;
+ if ( ay < 0 )
+ ay = -ay;
+ d_corner = ax + ay;
+
+ return ( d_in + d_out - d_corner ) < ( d_corner >> 4 );
+ }
+
+ static FT_Int
+ psh_corner_orientation( FT_Pos in_x,
+ FT_Pos in_y,
+ FT_Pos out_x,
+ FT_Pos out_y )
+ {
+ FT_Int result;
+
+
+ /* deal with the trivial cases quickly */
+ if ( in_y == 0 )
+ {
+ if ( in_x >= 0 )
+ result = out_y;
+ else
+ result = -out_y;
+ }
+ else if ( in_x == 0 )
+ {
+ if ( in_y >= 0 )
+ result = -out_x;
+ else
+ result = out_x;
+ }
+ else if ( out_y == 0 )
+ {
+ if ( out_x >= 0 )
+ result = in_y;
+ else
+ result = -in_y;
+ }
+ else if ( out_x == 0 )
+ {
+ if ( out_y >= 0 )
+ result = -in_x;
+ else
+ result = in_x;
+ }
+ else /* general case */
+ {
+ long long delta = (long long)in_x * out_y - (long long)in_y * out_x;
+
+ if ( delta == 0 )
+ result = 0;
+ else
+ result = 1 - 2 * ( delta < 0 );
+ }
+
+ return result;
+ }
+
+#endif /* !1 */
+
+
+#ifdef COMPUTE_INFLEXS
+
+ /* compute all inflex points in a given glyph */
+ static void
+ psh_glyph_compute_inflections( PSH_Glyph glyph )
+ {
+ FT_UInt n;
+
+
+ for ( n = 0; n < glyph->num_contours; n++ )
+ {
+ PSH_Point first, start, end, before, after;
+ FT_Pos in_x, in_y, out_x, out_y;
+ FT_Int orient_prev, orient_cur;
+ FT_Int finished = 0;
+
+
+ /* we need at least 4 points to create an inflection point */
+ if ( glyph->contours[n].count < 4 )
+ continue;
+
+ /* compute first segment in contour */
+ first = glyph->contours[n].start;
+
+ start = end = first;
+ do
+ {
+ end = end->next;
+ if ( end == first )
+ goto Skip;
+
+ in_x = end->org_u - start->org_u;
+ in_y = end->org_v - start->org_v;
+
+ } while ( in_x == 0 && in_y == 0 );
+
+ /* extend the segment start whenever possible */
+ before = start;
+ do
+ {
+ do
+ {
+ start = before;
+ before = before->prev;
+ if ( before == first )
+ goto Skip;
+
+ out_x = start->org_u - before->org_u;
+ out_y = start->org_v - before->org_v;
+
+ } while ( out_x == 0 && out_y == 0 );
+
+ orient_prev = psh_corner_orientation( in_x, in_y, out_x, out_y );
+
+ } while ( orient_prev == 0 );
+
+ first = start;
+ in_x = out_x;
+ in_y = out_y;
+
+ /* now, process all segments in the contour */
+ do
+ {
+ /* first, extend current segment's end whenever possible */
+ after = end;
+ do
+ {
+ do
+ {
+ end = after;
+ after = after->next;
+ if ( after == first )
+ finished = 1;
+
+ out_x = after->org_u - end->org_u;
+ out_y = after->org_v - end->org_v;
+
+ } while ( out_x == 0 && out_y == 0 );
+
+ orient_cur = psh_corner_orientation( in_x, in_y, out_x, out_y );
+
+ } while ( orient_cur == 0 );
+
+ if ( ( orient_cur ^ orient_prev ) < 0 )
+ {
+ do
+ {
+ psh_point_set_inflex( start );
+ start = start->next;
+ }
+ while ( start != end );
+
+ psh_point_set_inflex( start );
+ }
+
+ start = end;
+ end = after;
+ orient_prev = orient_cur;
+ in_x = out_x;
+ in_y = out_y;
+
+ } while ( !finished );
+
+ Skip:
+ ;
+ }
+ }
+
+#endif /* COMPUTE_INFLEXS */
+
+
+ static void
+ psh_glyph_done( PSH_Glyph glyph )
+ {
+ FT_Memory memory = glyph->memory;
+
+
+ psh_hint_table_done( &glyph->hint_tables[1], memory );
+ psh_hint_table_done( &glyph->hint_tables[0], memory );
+
+ FT_FREE( glyph->points );
+ FT_FREE( glyph->contours );
+
+ glyph->num_points = 0;
+ glyph->num_contours = 0;
+
+ glyph->memory = 0;
+ }
+
+
+ static int
+ psh_compute_dir( FT_Pos dx,
+ FT_Pos dy )
+ {
+ FT_Pos ax, ay;
+ int result = PSH_DIR_NONE;
+
+
+ ax = FT_ABS( dx );
+ ay = FT_ABS( dy );
+
+ if ( ay * 12 < ax )
+ {
+ /* |dy| <<< |dx| means a near-horizontal segment */
+ result = ( dx >= 0 ) ? PSH_DIR_RIGHT : PSH_DIR_LEFT;
+ }
+ else if ( ax * 12 < ay )
+ {
+ /* |dx| <<< |dy| means a near-vertical segment */
+ result = ( dy >= 0 ) ? PSH_DIR_UP : PSH_DIR_DOWN;
+ }
+
+ return result;
+ }
+
+
+ /* load outline point coordinates into hinter glyph */
+ static void
+ psh_glyph_load_points( PSH_Glyph glyph,
+ FT_Int dimension )
+ {
+ FT_Vector* vec = glyph->outline->points;
+ PSH_Point point = glyph->points;
+ FT_UInt count = glyph->num_points;
+
+
+ for ( ; count > 0; count--, point++, vec++ )
+ {
+ point->flags2 = 0;
+ point->hint = NULL;
+ if ( dimension == 0 )
+ {
+ point->org_u = vec->x;
+ point->org_v = vec->y;
+ }
+ else
+ {
+ point->org_u = vec->y;
+ point->org_v = vec->x;
+ }
+
+#ifdef DEBUG_HINTER
+ point->org_x = vec->x;
+ point->org_y = vec->y;
+#endif
+
+ }
+ }
+
+
+ /* save hinted point coordinates back to outline */
+ static void
+ psh_glyph_save_points( PSH_Glyph glyph,
+ FT_Int dimension )
+ {
+ FT_UInt n;
+ PSH_Point point = glyph->points;
+ FT_Vector* vec = glyph->outline->points;
+ char* tags = glyph->outline->tags;
+
+
+ for ( n = 0; n < glyph->num_points; n++ )
+ {
+ if ( dimension == 0 )
+ vec[n].x = point->cur_u;
+ else
+ vec[n].y = point->cur_u;
+
+ if ( psh_point_is_strong( point ) )
+ tags[n] |= (char)( ( dimension == 0 ) ? 32 : 64 );
+
+#ifdef DEBUG_HINTER
+
+ if ( dimension == 0 )
+ {
+ point->cur_x = point->cur_u;
+ point->flags_x = point->flags2 | point->flags;
+ }
+ else
+ {
+ point->cur_y = point->cur_u;
+ point->flags_y = point->flags2 | point->flags;
+ }
+
+#endif
+
+ point++;
+ }
+ }
+
+
+ static FT_Error
+ psh_glyph_init( PSH_Glyph glyph,
+ FT_Outline* outline,
+ PS_Hints ps_hints,
+ PSH_Globals globals )
+ {
+ FT_Error error;
+ FT_Memory memory;
+
+
+ /* clear all fields */
+ FT_MEM_ZERO( glyph, sizeof ( *glyph ) );
+
+ memory = glyph->memory = globals->memory;
+
+ /* allocate and setup points + contours arrays */
+ if ( FT_NEW_ARRAY( glyph->points, outline->n_points ) ||
+ FT_NEW_ARRAY( glyph->contours, outline->n_contours ) )
+ goto Exit;
+
+ glyph->num_points = outline->n_points;
+ glyph->num_contours = outline->n_contours;
+
+ {
+ FT_UInt first = 0, next, n;
+ PSH_Point points = glyph->points;
+ PSH_Contour contour = glyph->contours;
+
+
+ for ( n = 0; n < glyph->num_contours; n++ )
+ {
+ FT_Int count;
+ PSH_Point point;
+
+
+ next = outline->contours[n] + 1;
+ count = next - first;
+
+ contour->start = points + first;
+ contour->count = (FT_UInt)count;
+
+ if ( count > 0 )
+ {
+ point = points + first;
+
+ point->prev = points + next - 1;
+ point->contour = contour;
+
+ for ( ; count > 1; count-- )
+ {
+ point[0].next = point + 1;
+ point[1].prev = point;
+ point++;
+ point->contour = contour;
+ }
+ point->next = points + first;
+ }
+
+ contour++;
+ first = next;
+ }
+ }
+
+ {
+ PSH_Point points = glyph->points;
+ PSH_Point point = points;
+ FT_Vector* vec = outline->points;
+ FT_UInt n;
+
+
+ for ( n = 0; n < glyph->num_points; n++, point++ )
+ {
+ FT_Int n_prev = (FT_Int)( point->prev - points );
+ FT_Int n_next = (FT_Int)( point->next - points );
+ FT_Pos dxi, dyi, dxo, dyo;
+
+
+ if ( !( outline->tags[n] & FT_CURVE_TAG_ON ) )
+ point->flags = PSH_POINT_OFF;
+
+ dxi = vec[n].x - vec[n_prev].x;
+ dyi = vec[n].y - vec[n_prev].y;
+
+ point->dir_in = (FT_Char)psh_compute_dir( dxi, dyi );
+
+ dxo = vec[n_next].x - vec[n].x;
+ dyo = vec[n_next].y - vec[n].y;
+
+ point->dir_out = (FT_Char)psh_compute_dir( dxo, dyo );
+
+ /* detect smooth points */
+ if ( point->flags & PSH_POINT_OFF )
+ point->flags |= PSH_POINT_SMOOTH;
+
+ else if ( point->dir_in == point->dir_out )
+ {
+ if ( point->dir_out != PSH_DIR_NONE ||
+ psh_corner_is_flat( dxi, dyi, dxo, dyo ) )
+ point->flags |= PSH_POINT_SMOOTH;
+ }
+ }
+ }
+
+ glyph->outline = outline;
+ glyph->globals = globals;
+
+#ifdef COMPUTE_INFLEXS
+ psh_glyph_load_points( glyph, 0 );
+ psh_glyph_compute_inflections( glyph );
+#endif /* COMPUTE_INFLEXS */
+
+ /* now deal with hints tables */
+ error = psh_hint_table_init( &glyph->hint_tables [0],
+ &ps_hints->dimension[0].hints,
+ &ps_hints->dimension[0].masks,
+ &ps_hints->dimension[0].counters,
+ memory );
+ if ( error )
+ goto Exit;
+
+ error = psh_hint_table_init( &glyph->hint_tables [1],
+ &ps_hints->dimension[1].hints,
+ &ps_hints->dimension[1].masks,
+ &ps_hints->dimension[1].counters,
+ memory );
+ if ( error )
+ goto Exit;
+
+ Exit:
+ return error;
+ }
+
+
+ /* compute all extrema in a glyph for a given dimension */
+ static void
+ psh_glyph_compute_extrema( PSH_Glyph glyph )
+ {
+ FT_UInt n;
+
+
+ /* first of all, compute all local extrema */
+ for ( n = 0; n < glyph->num_contours; n++ )
+ {
+ PSH_Point first = glyph->contours[n].start;
+ PSH_Point point, before, after;
+
+
+ if ( glyph->contours[n].count == 0 )
+ continue;
+
+ point = first;
+ before = point;
+ after = point;
+
+ do
+ {
+ before = before->prev;
+ if ( before == first )
+ goto Skip;
+
+ } while ( before->org_u == point->org_u );
+
+ first = point = before->next;
+
+ for (;;)
+ {
+ after = point;
+ do
+ {
+ after = after->next;
+ if ( after == first )
+ goto Next;
+
+ } while ( after->org_u == point->org_u );
+
+ if ( before->org_u < point->org_u )
+ {
+ if ( after->org_u < point->org_u )
+ {
+ /* local maximum */
+ goto Extremum;
+ }
+ }
+ else /* before->org_u > point->org_u */
+ {
+ if ( after->org_u > point->org_u )
+ {
+ /* local minimum */
+ Extremum:
+ do
+ {
+ psh_point_set_extremum( point );
+ point = point->next;
+
+ } while ( point != after );
+ }
+ }
+
+ before = after->prev;
+ point = after;
+
+ } /* for */
+
+ Next:
+ ;
+ }
+
+ /* for each extremum, determine its direction along the */
+ /* orthogonal axis */
+ for ( n = 0; n < glyph->num_points; n++ )
+ {
+ PSH_Point point, before, after;
+
+
+ point = &glyph->points[n];
+ before = point;
+ after = point;
+
+ if ( psh_point_is_extremum( point ) )
+ {
+ do
+ {
+ before = before->prev;
+ if ( before == point )
+ goto Skip;
+
+ } while ( before->org_v == point->org_v );
+
+ do
+ {
+ after = after->next;
+ if ( after == point )
+ goto Skip;
+
+ } while ( after->org_v == point->org_v );
+ }
+
+ if ( before->org_v < point->org_v &&
+ after->org_v > point->org_v )
+ {
+ psh_point_set_positive( point );
+ }
+ else if ( before->org_v > point->org_v &&
+ after->org_v < point->org_v )
+ {
+ psh_point_set_negative( point );
+ }
+
+ Skip:
+ ;
+ }
+ }
+
+
+ /* major_dir is the direction for points on the bottom/left of the stem; */
+ /* Points on the top/right of the stem will have a direction of */
+ /* -major_dir. */
+
+ static void
+ psh_hint_table_find_strong_points( PSH_Hint_Table table,
+ PSH_Point point,
+ FT_UInt count,
+ FT_Int threshold,
+ FT_Int major_dir )
+ {
+ PSH_Hint* sort = table->sort;
+ FT_UInt num_hints = table->num_hints;
+
+
+ for ( ; count > 0; count--, point++ )
+ {
+ FT_Int point_dir = 0;
+ FT_Pos org_u = point->org_u;
+
+
+ if ( psh_point_is_strong( point ) )
+ continue;
+
+ if ( PSH_DIR_COMPARE( point->dir_in, major_dir ) )
+ point_dir = point->dir_in;
+
+ else if ( PSH_DIR_COMPARE( point->dir_out, major_dir ) )
+ point_dir = point->dir_out;
+
+ if ( point_dir )
+ {
+ if ( point_dir == major_dir )
+ {
+ FT_UInt nn;
+
+
+ for ( nn = 0; nn < num_hints; nn++ )
+ {
+ PSH_Hint hint = sort[nn];
+ FT_Pos d = org_u - hint->org_pos;
+
+
+ if ( d < threshold && -d < threshold )
+ {
+ psh_point_set_strong( point );
+ point->flags2 |= PSH_POINT_EDGE_MIN;
+ point->hint = hint;
+ break;
+ }
+ }
+ }
+ else if ( point_dir == -major_dir )
+ {
+ FT_UInt nn;
+
+
+ for ( nn = 0; nn < num_hints; nn++ )
+ {
+ PSH_Hint hint = sort[nn];
+ FT_Pos d = org_u - hint->org_pos - hint->org_len;
+
+
+ if ( d < threshold && -d < threshold )
+ {
+ psh_point_set_strong( point );
+ point->flags2 |= PSH_POINT_EDGE_MAX;
+ point->hint = hint;
+ break;
+ }
+ }
+ }
+ }
+
+#if 1
+ else if ( psh_point_is_extremum( point ) )
+ {
+ /* treat extrema as special cases for stem edge alignment */
+ FT_UInt nn, min_flag, max_flag;
+
+
+ if ( major_dir == PSH_DIR_HORIZONTAL )
+ {
+ min_flag = PSH_POINT_POSITIVE;
+ max_flag = PSH_POINT_NEGATIVE;
+ }
+ else
+ {
+ min_flag = PSH_POINT_NEGATIVE;
+ max_flag = PSH_POINT_POSITIVE;
+ }
+
+ if ( point->flags2 & min_flag )
+ {
+ for ( nn = 0; nn < num_hints; nn++ )
+ {
+ PSH_Hint hint = sort[nn];
+ FT_Pos d = org_u - hint->org_pos;
+
+
+ if ( d < threshold && -d < threshold )
+ {
+ point->flags2 |= PSH_POINT_EDGE_MIN;
+ point->hint = hint;
+ psh_point_set_strong( point );
+ break;
+ }
+ }
+ }
+ else if ( point->flags2 & max_flag )
+ {
+ for ( nn = 0; nn < num_hints; nn++ )
+ {
+ PSH_Hint hint = sort[nn];
+ FT_Pos d = org_u - hint->org_pos - hint->org_len;
+
+
+ if ( d < threshold && -d < threshold )
+ {
+ point->flags2 |= PSH_POINT_EDGE_MAX;
+ point->hint = hint;
+ psh_point_set_strong( point );
+ break;
+ }
+ }
+ }
+
+ if ( point->hint == NULL )
+ {
+ for ( nn = 0; nn < num_hints; nn++ )
+ {
+ PSH_Hint hint = sort[nn];
+
+
+ if ( org_u >= hint->org_pos &&
+ org_u <= hint->org_pos + hint->org_len )
+ {
+ point->hint = hint;
+ break;
+ }
+ }
+ }
+ }
+
+#endif /* 1 */
+ }
+ }
+
+
+ /* the accepted shift for strong points in fractional pixels */
+#define PSH_STRONG_THRESHOLD 32
+
+ /* the maximum shift value in font units */
+#define PSH_STRONG_THRESHOLD_MAXIMUM 30
+
+
+ /* find strong points in a glyph */
+ static void
+ psh_glyph_find_strong_points( PSH_Glyph glyph,
+ FT_Int dimension )
+ {
+ /* a point is `strong' if it is located on a stem edge and */
+ /* has an `in' or `out' tangent parallel to the hint's direction */
+
+ PSH_Hint_Table table = &glyph->hint_tables[dimension];
+ PS_Mask mask = table->hint_masks->masks;
+ FT_UInt num_masks = table->hint_masks->num_masks;
+ FT_UInt first = 0;
+ FT_Int major_dir = dimension == 0 ? PSH_DIR_VERTICAL
+ : PSH_DIR_HORIZONTAL;
+ PSH_Dimension dim = &glyph->globals->dimension[dimension];
+ FT_Fixed scale = dim->scale_mult;
+ FT_Int threshold;
+
+
+ threshold = (FT_Int)FT_DivFix( PSH_STRONG_THRESHOLD, scale );
+ if ( threshold > PSH_STRONG_THRESHOLD_MAXIMUM )
+ threshold = PSH_STRONG_THRESHOLD_MAXIMUM;
+
+ /* process secondary hints to `selected' points */
+ if ( num_masks > 1 && glyph->num_points > 0 )
+ {
+ /* the `endchar' op can reduce the number of points */
+ first = mask->end_point > glyph->num_points
+ ? glyph->num_points
+ : mask->end_point;
+ mask++;
+ for ( ; num_masks > 1; num_masks--, mask++ )
+ {
+ FT_UInt next;
+ FT_Int count;
+
+
+ next = mask->end_point > glyph->num_points
+ ? glyph->num_points
+ : mask->end_point;
+ count = next - first;
+ if ( count > 0 )
+ {
+ PSH_Point point = glyph->points + first;
+
+
+ psh_hint_table_activate_mask( table, mask );
+
+ psh_hint_table_find_strong_points( table, point, count,
+ threshold, major_dir );
+ }
+ first = next;
+ }
+ }
+
+ /* process primary hints for all points */
+ if ( num_masks == 1 )
+ {
+ FT_UInt count = glyph->num_points;
+ PSH_Point point = glyph->points;
+
+
+ psh_hint_table_activate_mask( table, table->hint_masks->masks );
+
+ psh_hint_table_find_strong_points( table, point, count,
+ threshold, major_dir );
+ }
+
+ /* now, certain points may have been attached to a hint and */
+ /* not marked as strong; update their flags then */
+ {
+ FT_UInt count = glyph->num_points;
+ PSH_Point point = glyph->points;
+
+
+ for ( ; count > 0; count--, point++ )
+ if ( point->hint && !psh_point_is_strong( point ) )
+ psh_point_set_strong( point );
+ }
+ }
+
+
+ /* find points in a glyph which are in a blue zone and have `in' or */
+ /* `out' tangents parallel to the horizontal axis */
+ static void
+ psh_glyph_find_blue_points( PSH_Blues blues,
+ PSH_Glyph glyph )
+ {
+ PSH_Blue_Table table;
+ PSH_Blue_Zone zone;
+ FT_UInt glyph_count = glyph->num_points;
+ FT_UInt blue_count;
+ PSH_Point point = glyph->points;
+
+
+ for ( ; glyph_count > 0; glyph_count--, point++ )
+ {
+ FT_Pos y;
+
+
+ /* check tangents */
+ if ( !PSH_DIR_COMPARE( point->dir_in, PSH_DIR_HORIZONTAL ) &&
+ !PSH_DIR_COMPARE( point->dir_out, PSH_DIR_HORIZONTAL ) )
+ continue;
+
+ /* skip strong points */
+ if ( psh_point_is_strong( point ) )
+ continue;
+
+ y = point->org_u;
+
+ /* look up top zones */
+ table = &blues->normal_top;
+ blue_count = table->count;
+ zone = table->zones;
+
+ for ( ; blue_count > 0; blue_count--, zone++ )
+ {
+ FT_Pos delta = y - zone->org_bottom;
+
+
+ if ( delta < -blues->blue_fuzz )
+ break;
+
+ if ( y <= zone->org_top + blues->blue_fuzz )
+ if ( blues->no_overshoots || delta <= blues->blue_threshold )
+ {
+ point->cur_u = zone->cur_bottom;
+ psh_point_set_strong( point );
+ psh_point_set_fitted( point );
+ }
+ }
+
+ /* look up bottom zones */
+ table = &blues->normal_bottom;
+ blue_count = table->count;
+ zone = table->zones + blue_count - 1;
+
+ for ( ; blue_count > 0; blue_count--, zone-- )
+ {
+ FT_Pos delta = zone->org_top - y;
+
+
+ if ( delta < -blues->blue_fuzz )
+ break;
+
+ if ( y >= zone->org_bottom - blues->blue_fuzz )
+ if ( blues->no_overshoots || delta < blues->blue_threshold )
+ {
+ point->cur_u = zone->cur_top;
+ psh_point_set_strong( point );
+ psh_point_set_fitted( point );
+ }
+ }
+ }
+ }
+
+
+ /* interpolate strong points with the help of hinted coordinates */
+ static void
+ psh_glyph_interpolate_strong_points( PSH_Glyph glyph,
+ FT_Int dimension )
+ {
+ PSH_Dimension dim = &glyph->globals->dimension[dimension];
+ FT_Fixed scale = dim->scale_mult;
+
+ FT_UInt count = glyph->num_points;
+ PSH_Point point = glyph->points;
+
+
+ for ( ; count > 0; count--, point++ )
+ {
+ PSH_Hint hint = point->hint;
+
+
+ if ( hint )
+ {
+ FT_Pos delta;
+
+
+ if ( psh_point_is_edge_min( point ) )
+ point->cur_u = hint->cur_pos;
+
+ else if ( psh_point_is_edge_max( point ) )
+ point->cur_u = hint->cur_pos + hint->cur_len;
+
+ else
+ {
+ delta = point->org_u - hint->org_pos;
+
+ if ( delta <= 0 )
+ point->cur_u = hint->cur_pos + FT_MulFix( delta, scale );
+
+ else if ( delta >= hint->org_len )
+ point->cur_u = hint->cur_pos + hint->cur_len +
+ FT_MulFix( delta - hint->org_len, scale );
+
+ else /* hint->org_len > 0 */
+ point->cur_u = hint->cur_pos +
+ FT_MulDiv( delta, hint->cur_len,
+ hint->org_len );
+ }
+ psh_point_set_fitted( point );
+ }
+ }
+ }
+
+
+#define PSH_MAX_STRONG_INTERNAL 16
+
+ static void
+ psh_glyph_interpolate_normal_points( PSH_Glyph glyph,
+ FT_Int dimension )
+ {
+
+#if 1
+ /* first technique: a point is strong if it is a local extremum */
+
+ PSH_Dimension dim = &glyph->globals->dimension[dimension];
+ FT_Fixed scale = dim->scale_mult;
+ FT_Memory memory = glyph->memory;
+
+ PSH_Point* strongs = NULL;
+ PSH_Point strongs_0[PSH_MAX_STRONG_INTERNAL];
+ FT_UInt num_strongs = 0;
+
+ PSH_Point points = glyph->points;
+ PSH_Point points_end = points + glyph->num_points;
+ PSH_Point point;
+
+
+ /* first count the number of strong points */
+ for ( point = points; point < points_end; point++ )
+ {
+ if ( psh_point_is_strong( point ) )
+ num_strongs++;
+ }
+
+ if ( num_strongs == 0 ) /* nothing to do here */
+ return;
+
+ /* allocate an array to store a list of points, */
+ /* stored in increasing org_u order */
+ if ( num_strongs <= PSH_MAX_STRONG_INTERNAL )
+ strongs = strongs_0;
+ else
+ {
+ FT_Error error;
+
+
+ if ( FT_NEW_ARRAY( strongs, num_strongs ) )
+ return;
+ }
+
+ num_strongs = 0;
+ for ( point = points; point < points_end; point++ )
+ {
+ PSH_Point* insert;
+
+
+ if ( !psh_point_is_strong( point ) )
+ continue;
+
+ for ( insert = strongs + num_strongs; insert > strongs; insert-- )
+ {
+ if ( insert[-1]->org_u <= point->org_u )
+ break;
+
+ insert[0] = insert[-1];
+ }
+ insert[0] = point;
+ num_strongs++;
+ }
+
+ /* now try to interpolate all normal points */
+ for ( point = points; point < points_end; point++ )
+ {
+ if ( psh_point_is_strong( point ) )
+ continue;
+
+ /* sometimes, some local extrema are smooth points */
+ if ( psh_point_is_smooth( point ) )
+ {
+ if ( point->dir_in == PSH_DIR_NONE ||
+ point->dir_in != point->dir_out )
+ continue;
+
+ if ( !psh_point_is_extremum( point ) &&
+ !psh_point_is_inflex( point ) )
+ continue;
+
+ point->flags &= ~PSH_POINT_SMOOTH;
+ }
+
+ /* find best enclosing point coordinates then interpolate */
+ {
+ PSH_Point before, after;
+ FT_UInt nn;
+
+
+ for ( nn = 0; nn < num_strongs; nn++ )
+ if ( strongs[nn]->org_u > point->org_u )
+ break;
+
+ if ( nn == 0 ) /* point before the first strong point */
+ {
+ after = strongs[0];
+
+ point->cur_u = after->cur_u +
+ FT_MulFix( point->org_u - after->org_u,
+ scale );
+ }
+ else
+ {
+ before = strongs[nn - 1];
+
+ for ( nn = num_strongs; nn > 0; nn-- )
+ if ( strongs[nn - 1]->org_u < point->org_u )
+ break;
+
+ if ( nn == num_strongs ) /* point is after last strong point */
+ {
+ before = strongs[nn - 1];
+
+ point->cur_u = before->cur_u +
+ FT_MulFix( point->org_u - before->org_u,
+ scale );
+ }
+ else
+ {
+ FT_Pos u;
+
+
+ after = strongs[nn];
+
+ /* now interpolate point between before and after */
+ u = point->org_u;
+
+ if ( u == before->org_u )
+ point->cur_u = before->cur_u;
+
+ else if ( u == after->org_u )
+ point->cur_u = after->cur_u;
+
+ else
+ point->cur_u = before->cur_u +
+ FT_MulDiv( u - before->org_u,
+ after->cur_u - before->cur_u,
+ after->org_u - before->org_u );
+ }
+ }
+ psh_point_set_fitted( point );
+ }
+ }
+
+ if ( strongs != strongs_0 )
+ FT_FREE( strongs );
+
+#endif /* 1 */
+
+ }
+
+
+ /* interpolate other points */
+ static void
+ psh_glyph_interpolate_other_points( PSH_Glyph glyph,
+ FT_Int dimension )
+ {
+ PSH_Dimension dim = &glyph->globals->dimension[dimension];
+ FT_Fixed scale = dim->scale_mult;
+ FT_Fixed delta = dim->scale_delta;
+ PSH_Contour contour = glyph->contours;
+ FT_UInt num_contours = glyph->num_contours;
+
+
+ for ( ; num_contours > 0; num_contours--, contour++ )
+ {
+ PSH_Point start = contour->start;
+ PSH_Point first, next, point;
+ FT_UInt fit_count;
+
+
+ /* count the number of strong points in this contour */
+ next = start + contour->count;
+ fit_count = 0;
+ first = 0;
+
+ for ( point = start; point < next; point++ )
+ if ( psh_point_is_fitted( point ) )
+ {
+ if ( !first )
+ first = point;
+
+ fit_count++;
+ }
+
+ /* if there are less than 2 fitted points in the contour, we */
+ /* simply scale and eventually translate the contour points */
+ if ( fit_count < 2 )
+ {
+ if ( fit_count == 1 )
+ delta = first->cur_u - FT_MulFix( first->org_u, scale );
+
+ for ( point = start; point < next; point++ )
+ if ( point != first )
+ point->cur_u = FT_MulFix( point->org_u, scale ) + delta;
+
+ goto Next_Contour;
+ }
+
+ /* there are more than 2 strong points in this contour; we */
+ /* need to interpolate weak points between them */
+ start = first;
+ do
+ {
+ point = first;
+
+ /* skip consecutive fitted points */
+ for (;;)
+ {
+ next = first->next;
+ if ( next == start )
+ goto Next_Contour;
+
+ if ( !psh_point_is_fitted( next ) )
+ break;
+
+ first = next;
+ }
+
+ /* find next fitted point after unfitted one */
+ for (;;)
+ {
+ next = next->next;
+ if ( psh_point_is_fitted( next ) )
+ break;
+ }
+
+ /* now interpolate between them */
+ {
+ FT_Pos org_a, org_ab, cur_a, cur_ab;
+ FT_Pos org_c, org_ac, cur_c;
+ FT_Fixed scale_ab;
+
+
+ if ( first->org_u <= next->org_u )
+ {
+ org_a = first->org_u;
+ cur_a = first->cur_u;
+ org_ab = next->org_u - org_a;
+ cur_ab = next->cur_u - cur_a;
+ }
+ else
+ {
+ org_a = next->org_u;
+ cur_a = next->cur_u;
+ org_ab = first->org_u - org_a;
+ cur_ab = first->cur_u - cur_a;
+ }
+
+ scale_ab = 0x10000L;
+ if ( org_ab > 0 )
+ scale_ab = FT_DivFix( cur_ab, org_ab );
+
+ point = first->next;
+ do
+ {
+ org_c = point->org_u;
+ org_ac = org_c - org_a;
+
+ if ( org_ac <= 0 )
+ {
+ /* on the left of the interpolation zone */
+ cur_c = cur_a + FT_MulFix( org_ac, scale );
+ }
+ else if ( org_ac >= org_ab )
+ {
+ /* on the right on the interpolation zone */
+ cur_c = cur_a + cur_ab + FT_MulFix( org_ac - org_ab, scale );
+ }
+ else
+ {
+ /* within the interpolation zone */
+ cur_c = cur_a + FT_MulFix( org_ac, scale_ab );
+ }
+
+ point->cur_u = cur_c;
+
+ point = point->next;
+
+ } while ( point != next );
+ }
+
+ /* keep going until all points in the contours have been processed */
+ first = next;
+
+ } while ( first != start );
+
+ Next_Contour:
+ ;
+ }
+ }
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** HIGH-LEVEL INTERFACE *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ FT_Error
+ ps_hints_apply( PS_Hints ps_hints,
+ FT_Outline* outline,
+ PSH_Globals globals,
+ FT_Render_Mode hint_mode )
+ {
+ PSH_GlyphRec glyphrec;
+ PSH_Glyph glyph = &glyphrec;
+ FT_Error error;
+#ifdef DEBUG_HINTER
+ FT_Memory memory;
+#endif
+ FT_Int dimension;
+
+
+ /* something to do? */
+ if ( outline->n_points == 0 || outline->n_contours == 0 )
+ return FT_Err_Ok;
+
+#ifdef DEBUG_HINTER
+
+ memory = globals->memory;
+
+ if ( ps_debug_glyph )
+ {
+ psh_glyph_done( ps_debug_glyph );
+ FT_FREE( ps_debug_glyph );
+ }
+
+ if ( FT_NEW( glyph ) )
+ return error;
+
+ ps_debug_glyph = glyph;
+
+#endif /* DEBUG_HINTER */
+
+ error = psh_glyph_init( glyph, outline, ps_hints, globals );
+ if ( error )
+ goto Exit;
+
+ /* try to optimize the y_scale so that the top of non-capital letters
+ * is aligned on a pixel boundary whenever possible
+ */
+ {
+ PSH_Dimension dim_x = &glyph->globals->dimension[0];
+ PSH_Dimension dim_y = &glyph->globals->dimension[1];
+
+ FT_Fixed x_scale = dim_x->scale_mult;
+ FT_Fixed y_scale = dim_y->scale_mult;
+
+ FT_Fixed old_x_scale = x_scale;
+ FT_Fixed old_y_scale = y_scale;
+
+ FT_Fixed scaled;
+ FT_Fixed fitted;
+
+ FT_Bool rescale = FALSE;
+
+
+ scaled = FT_MulFix( globals->blues.normal_top.zones->org_ref, y_scale );
+ fitted = FT_PIX_ROUND( scaled );
+
+ if ( fitted != 0 && scaled != fitted )
+ {
+ rescale = TRUE;
+
+ y_scale = FT_MulDiv( y_scale, fitted, scaled );
+
+ if ( fitted < scaled )
+ x_scale -= x_scale / 50;
+
+ psh_globals_set_scale( glyph->globals, x_scale, y_scale, 0, 0 );
+ }
+
+ glyph->do_horz_hints = 1;
+ glyph->do_vert_hints = 1;
+
+ glyph->do_horz_snapping = FT_BOOL( hint_mode == FT_RENDER_MODE_MONO ||
+ hint_mode == FT_RENDER_MODE_LCD );
+
+ glyph->do_vert_snapping = FT_BOOL( hint_mode == FT_RENDER_MODE_MONO ||
+ hint_mode == FT_RENDER_MODE_LCD_V );
+
+ glyph->do_stem_adjust = FT_BOOL( hint_mode != FT_RENDER_MODE_LIGHT );
+
+ for ( dimension = 0; dimension < 2; dimension++ )
+ {
+ /* load outline coordinates into glyph */
+ psh_glyph_load_points( glyph, dimension );
+
+ /* compute local extrema */
+ psh_glyph_compute_extrema( glyph );
+
+ /* compute aligned stem/hints positions */
+ psh_hint_table_align_hints( &glyph->hint_tables[dimension],
+ glyph->globals,
+ dimension,
+ glyph );
+
+ /* find strong points, align them, then interpolate others */
+ psh_glyph_find_strong_points( glyph, dimension );
+ if ( dimension == 1 )
+ psh_glyph_find_blue_points( &globals->blues, glyph );
+ psh_glyph_interpolate_strong_points( glyph, dimension );
+ psh_glyph_interpolate_normal_points( glyph, dimension );
+ psh_glyph_interpolate_other_points( glyph, dimension );
+
+ /* save hinted coordinates back to outline */
+ psh_glyph_save_points( glyph, dimension );
+
+ if ( rescale )
+ psh_globals_set_scale( glyph->globals,
+ old_x_scale, old_y_scale, 0, 0 );
+ }
+ }
+
+ Exit:
+
+#ifndef DEBUG_HINTER
+ psh_glyph_done( glyph );
+#endif
+
+ return error;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshalgo.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshalgo.h
new file mode 100644
index 0000000000..c70f31ea94
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshalgo.h
@@ -0,0 +1,246 @@
+/***************************************************************************/
+/* */
+/* pshalgo.h */
+/* */
+/* PostScript hinting algorithm (specification). */
+/* */
+/* Copyright 2001-2003, 2008, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __PSHALGO_H__
+#define __PSHALGO_H__
+
+
+#include "pshrec.h"
+#include "pshglob.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /* handle to Hint structure */
+ typedef struct PSH_HintRec_* PSH_Hint;
+
+ /* hint bit-flags */
+ typedef enum PSH_Hint_Flags_
+ {
+ PSH_HINT_GHOST = PS_HINT_FLAG_GHOST,
+ PSH_HINT_BOTTOM = PS_HINT_FLAG_BOTTOM,
+ PSH_HINT_ACTIVE = 4,
+ PSH_HINT_FITTED = 8
+
+ } PSH_Hint_Flags;
+
+
+#define psh_hint_is_active( x ) ( ( (x)->flags & PSH_HINT_ACTIVE ) != 0 )
+#define psh_hint_is_ghost( x ) ( ( (x)->flags & PSH_HINT_GHOST ) != 0 )
+#define psh_hint_is_fitted( x ) ( ( (x)->flags & PSH_HINT_FITTED ) != 0 )
+
+#define psh_hint_activate( x ) (x)->flags |= PSH_HINT_ACTIVE
+#define psh_hint_deactivate( x ) (x)->flags &= ~PSH_HINT_ACTIVE
+#define psh_hint_set_fitted( x ) (x)->flags |= PSH_HINT_FITTED
+
+ /* hint structure */
+ typedef struct PSH_HintRec_
+ {
+ FT_Int org_pos;
+ FT_Int org_len;
+ FT_Pos cur_pos;
+ FT_Pos cur_len;
+ FT_UInt flags;
+ PSH_Hint parent;
+ FT_Int order;
+
+ } PSH_HintRec;
+
+
+ /* this is an interpolation zone used for strong points; */
+ /* weak points are interpolated according to their strong */
+ /* neighbours */
+ typedef struct PSH_ZoneRec_
+ {
+ FT_Fixed scale;
+ FT_Fixed delta;
+ FT_Pos min;
+ FT_Pos max;
+
+ } PSH_ZoneRec, *PSH_Zone;
+
+
+ typedef struct PSH_Hint_TableRec_
+ {
+ FT_UInt max_hints;
+ FT_UInt num_hints;
+ PSH_Hint hints;
+ PSH_Hint* sort;
+ PSH_Hint* sort_global;
+ FT_UInt num_zones;
+ PSH_ZoneRec* zones;
+ PSH_Zone zone;
+ PS_Mask_Table hint_masks;
+ PS_Mask_Table counter_masks;
+
+ } PSH_Hint_TableRec, *PSH_Hint_Table;
+
+
+ typedef struct PSH_PointRec_* PSH_Point;
+ typedef struct PSH_ContourRec_* PSH_Contour;
+
+ enum
+ {
+ PSH_DIR_NONE = 4,
+ PSH_DIR_UP = -1,
+ PSH_DIR_DOWN = 1,
+ PSH_DIR_LEFT = -2,
+ PSH_DIR_RIGHT = 2
+ };
+
+#define PSH_DIR_HORIZONTAL 2
+#define PSH_DIR_VERTICAL 1
+
+#define PSH_DIR_COMPARE( d1, d2 ) ( (d1) == (d2) || (d1) == -(d2) )
+#define PSH_DIR_IS_HORIZONTAL( d ) PSH_DIR_COMPARE( d, PSH_DIR_HORIZONTAL )
+#define PSH_DIR_IS_VERTICAL( d ) PSH_DIR_COMPARE( d, PSH_DIR_VERTICAL )
+
+
+ /* the following bit-flags are computed once by the glyph */
+ /* analyzer, for both dimensions */
+ enum
+ {
+ PSH_POINT_OFF = 1, /* point is off the curve */
+ PSH_POINT_SMOOTH = 2, /* point is smooth */
+ PSH_POINT_INFLEX = 4 /* point is inflection */
+ };
+
+#define psh_point_is_smooth( p ) ( (p)->flags & PSH_POINT_SMOOTH )
+#define psh_point_is_off( p ) ( (p)->flags & PSH_POINT_OFF )
+#define psh_point_is_inflex( p ) ( (p)->flags & PSH_POINT_INFLEX )
+
+#define psh_point_set_smooth( p ) (p)->flags |= PSH_POINT_SMOOTH
+#define psh_point_set_off( p ) (p)->flags |= PSH_POINT_OFF
+#define psh_point_set_inflex( p ) (p)->flags |= PSH_POINT_INFLEX
+
+ /* the following bit-flags are re-computed for each dimension */
+ enum
+ {
+ PSH_POINT_STRONG = 16, /* point is strong */
+ PSH_POINT_FITTED = 32, /* point is already fitted */
+ PSH_POINT_EXTREMUM = 64, /* point is local extremum */
+ PSH_POINT_POSITIVE = 128, /* extremum has positive contour flow */
+ PSH_POINT_NEGATIVE = 256, /* extremum has negative contour flow */
+ PSH_POINT_EDGE_MIN = 512, /* point is aligned to left/bottom stem edge */
+ PSH_POINT_EDGE_MAX = 1024 /* point is aligned to top/right stem edge */
+ };
+
+#define psh_point_is_strong( p ) ( (p)->flags2 & PSH_POINT_STRONG )
+#define psh_point_is_fitted( p ) ( (p)->flags2 & PSH_POINT_FITTED )
+#define psh_point_is_extremum( p ) ( (p)->flags2 & PSH_POINT_EXTREMUM )
+#define psh_point_is_positive( p ) ( (p)->flags2 & PSH_POINT_POSITIVE )
+#define psh_point_is_negative( p ) ( (p)->flags2 & PSH_POINT_NEGATIVE )
+#define psh_point_is_edge_min( p ) ( (p)->flags2 & PSH_POINT_EDGE_MIN )
+#define psh_point_is_edge_max( p ) ( (p)->flags2 & PSH_POINT_EDGE_MAX )
+
+#define psh_point_set_strong( p ) (p)->flags2 |= PSH_POINT_STRONG
+#define psh_point_set_fitted( p ) (p)->flags2 |= PSH_POINT_FITTED
+#define psh_point_set_extremum( p ) (p)->flags2 |= PSH_POINT_EXTREMUM
+#define psh_point_set_positive( p ) (p)->flags2 |= PSH_POINT_POSITIVE
+#define psh_point_set_negative( p ) (p)->flags2 |= PSH_POINT_NEGATIVE
+#define psh_point_set_edge_min( p ) (p)->flags2 |= PSH_POINT_EDGE_MIN
+#define psh_point_set_edge_max( p ) (p)->flags2 |= PSH_POINT_EDGE_MAX
+
+
+ typedef struct PSH_PointRec_
+ {
+ PSH_Point prev;
+ PSH_Point next;
+ PSH_Contour contour;
+ FT_UInt flags;
+ FT_UInt flags2;
+ FT_Char dir_in;
+ FT_Char dir_out;
+ PSH_Hint hint;
+ FT_Pos org_u;
+ FT_Pos org_v;
+ FT_Pos cur_u;
+#ifdef DEBUG_HINTER
+ FT_Pos org_x;
+ FT_Pos cur_x;
+ FT_Pos org_y;
+ FT_Pos cur_y;
+ FT_UInt flags_x;
+ FT_UInt flags_y;
+#endif
+
+ } PSH_PointRec;
+
+
+ typedef struct PSH_ContourRec_
+ {
+ PSH_Point start;
+ FT_UInt count;
+
+ } PSH_ContourRec;
+
+
+ typedef struct PSH_GlyphRec_
+ {
+ FT_UInt num_points;
+ FT_UInt num_contours;
+
+ PSH_Point points;
+ PSH_Contour contours;
+
+ FT_Memory memory;
+ FT_Outline* outline;
+ PSH_Globals globals;
+ PSH_Hint_TableRec hint_tables[2];
+
+ FT_Bool vertical;
+ FT_Int major_dir;
+ FT_Int minor_dir;
+
+ FT_Bool do_horz_hints;
+ FT_Bool do_vert_hints;
+ FT_Bool do_horz_snapping;
+ FT_Bool do_vert_snapping;
+ FT_Bool do_stem_adjust;
+
+ } PSH_GlyphRec, *PSH_Glyph;
+
+
+#ifdef DEBUG_HINTER
+ extern PSH_Hint_Table ps_debug_hint_table;
+
+ typedef void
+ (*PSH_HintFunc)( PSH_Hint hint,
+ FT_Bool vertical );
+
+ extern PSH_HintFunc ps_debug_hint_func;
+
+ extern PSH_Glyph ps_debug_glyph;
+#endif
+
+
+ extern FT_Error
+ ps_hints_apply( PS_Hints ps_hints,
+ FT_Outline* outline,
+ PSH_Globals globals,
+ FT_Render_Mode hint_mode );
+
+
+FT_END_HEADER
+
+
+#endif /* __PSHALGO_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshglob.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshglob.c
new file mode 100644
index 0000000000..9e086dca41
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshglob.c
@@ -0,0 +1,805 @@
+/***************************************************************************/
+/* */
+/* pshglob.c */
+/* */
+/* PostScript hinter global hinting management (body). */
+/* Inspired by the new auto-hinter module. */
+/* */
+/* Copyright 2001-2004, 2006, 2010, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used */
+/* modified and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/freetype.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "pshglob.h"
+
+#ifdef DEBUG_HINTER
+ PSH_Globals ps_debug_globals = 0;
+#endif
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** STANDARD WIDTHS *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /* scale the widths/heights table */
+ static void
+ psh_globals_scale_widths( PSH_Globals globals,
+ FT_UInt direction )
+ {
+ PSH_Dimension dim = &globals->dimension[direction];
+ PSH_Widths stdw = &dim->stdw;
+ FT_UInt count = stdw->count;
+ PSH_Width width = stdw->widths;
+ PSH_Width stand = width; /* standard width/height */
+ FT_Fixed scale = dim->scale_mult;
+
+
+ if ( count > 0 )
+ {
+ width->cur = FT_MulFix( width->org, scale );
+ width->fit = FT_PIX_ROUND( width->cur );
+
+ width++;
+ count--;
+
+ for ( ; count > 0; count--, width++ )
+ {
+ FT_Pos w, dist;
+
+
+ w = FT_MulFix( width->org, scale );
+ dist = w - stand->cur;
+
+ if ( dist < 0 )
+ dist = -dist;
+
+ if ( dist < 128 )
+ w = stand->cur;
+
+ width->cur = w;
+ width->fit = FT_PIX_ROUND( w );
+ }
+ }
+ }
+
+
+#if 0
+
+ /* org_width is is font units, result in device pixels, 26.6 format */
+ FT_LOCAL_DEF( FT_Pos )
+ psh_dimension_snap_width( PSH_Dimension dimension,
+ FT_Int org_width )
+ {
+ FT_UInt n;
+ FT_Pos width = FT_MulFix( org_width, dimension->scale_mult );
+ FT_Pos best = 64 + 32 + 2;
+ FT_Pos reference = width;
+
+
+ for ( n = 0; n < dimension->stdw.count; n++ )
+ {
+ FT_Pos w;
+ FT_Pos dist;
+
+
+ w = dimension->stdw.widths[n].cur;
+ dist = width - w;
+ if ( dist < 0 )
+ dist = -dist;
+ if ( dist < best )
+ {
+ best = dist;
+ reference = w;
+ }
+ }
+
+ if ( width >= reference )
+ {
+ width -= 0x21;
+ if ( width < reference )
+ width = reference;
+ }
+ else
+ {
+ width += 0x21;
+ if ( width > reference )
+ width = reference;
+ }
+
+ return width;
+ }
+
+#endif /* 0 */
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** BLUE ZONES *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ static void
+ psh_blues_set_zones_0( PSH_Blues target,
+ FT_Bool is_others,
+ FT_UInt read_count,
+ FT_Short* read,
+ PSH_Blue_Table top_table,
+ PSH_Blue_Table bot_table )
+ {
+ FT_UInt count_top = top_table->count;
+ FT_UInt count_bot = bot_table->count;
+ FT_Bool first = 1;
+
+ FT_UNUSED( target );
+
+
+ for ( ; read_count > 1; read_count -= 2 )
+ {
+ FT_Int reference, delta;
+ FT_UInt count;
+ PSH_Blue_Zone zones, zone;
+ FT_Bool top;
+
+
+ /* read blue zone entry, and select target top/bottom zone */
+ top = 0;
+ if ( first || is_others )
+ {
+ reference = read[1];
+ delta = read[0] - reference;
+
+ zones = bot_table->zones;
+ count = count_bot;
+ first = 0;
+ }
+ else
+ {
+ reference = read[0];
+ delta = read[1] - reference;
+
+ zones = top_table->zones;
+ count = count_top;
+ top = 1;
+ }
+
+ /* insert into sorted table */
+ zone = zones;
+ for ( ; count > 0; count--, zone++ )
+ {
+ if ( reference < zone->org_ref )
+ break;
+
+ if ( reference == zone->org_ref )
+ {
+ FT_Int delta0 = zone->org_delta;
+
+
+ /* we have two zones on the same reference position -- */
+ /* only keep the largest one */
+ if ( delta < 0 )
+ {
+ if ( delta < delta0 )
+ zone->org_delta = delta;
+ }
+ else
+ {
+ if ( delta > delta0 )
+ zone->org_delta = delta;
+ }
+ goto Skip;
+ }
+ }
+
+ for ( ; count > 0; count-- )
+ zone[count] = zone[count-1];
+
+ zone->org_ref = reference;
+ zone->org_delta = delta;
+
+ if ( top )
+ count_top++;
+ else
+ count_bot++;
+
+ Skip:
+ read += 2;
+ }
+
+ top_table->count = count_top;
+ bot_table->count = count_bot;
+ }
+
+
+ /* Re-read blue zones from the original fonts and store them into out */
+ /* private structure. This function re-orders, sanitizes and */
+ /* fuzz-expands the zones as well. */
+ static void
+ psh_blues_set_zones( PSH_Blues target,
+ FT_UInt count,
+ FT_Short* blues,
+ FT_UInt count_others,
+ FT_Short* other_blues,
+ FT_Int fuzz,
+ FT_Int family )
+ {
+ PSH_Blue_Table top_table, bot_table;
+ FT_Int count_top, count_bot;
+
+
+ if ( family )
+ {
+ top_table = &target->family_top;
+ bot_table = &target->family_bottom;
+ }
+ else
+ {
+ top_table = &target->normal_top;
+ bot_table = &target->normal_bottom;
+ }
+
+ /* read the input blue zones, and build two sorted tables */
+ /* (one for the top zones, the other for the bottom zones) */
+ top_table->count = 0;
+ bot_table->count = 0;
+
+ /* first, the blues */
+ psh_blues_set_zones_0( target, 0,
+ count, blues, top_table, bot_table );
+ psh_blues_set_zones_0( target, 1,
+ count_others, other_blues, top_table, bot_table );
+
+ count_top = top_table->count;
+ count_bot = bot_table->count;
+
+ /* sanitize top table */
+ if ( count_top > 0 )
+ {
+ PSH_Blue_Zone zone = top_table->zones;
+
+
+ for ( count = count_top; count > 0; count--, zone++ )
+ {
+ FT_Int delta;
+
+
+ if ( count > 1 )
+ {
+ delta = zone[1].org_ref - zone[0].org_ref;
+ if ( zone->org_delta > delta )
+ zone->org_delta = delta;
+ }
+
+ zone->org_bottom = zone->org_ref;
+ zone->org_top = zone->org_delta + zone->org_ref;
+ }
+ }
+
+ /* sanitize bottom table */
+ if ( count_bot > 0 )
+ {
+ PSH_Blue_Zone zone = bot_table->zones;
+
+
+ for ( count = count_bot; count > 0; count--, zone++ )
+ {
+ FT_Int delta;
+
+
+ if ( count > 1 )
+ {
+ delta = zone[0].org_ref - zone[1].org_ref;
+ if ( zone->org_delta < delta )
+ zone->org_delta = delta;
+ }
+
+ zone->org_top = zone->org_ref;
+ zone->org_bottom = zone->org_delta + zone->org_ref;
+ // XYQ 2006-3-11: FT PS hinter doesn't process wide zone well (all points shrinked to one horizontal line)
+ // therefore, we have to do some nasty thing here, because some fonts do give wide bottom zones.
+ // Our principle is to preserve the bottom line
+ // TEST DOC: bug#395 csl.pdf letters "y", "j", etc.
+ if (zone->org_top - zone->org_bottom > 10) {
+ zone->org_top = zone->org_bottom;
+ zone->org_delta = 0;
+ }
+ }
+ }
+
+ /* expand top and bottom tables with blue fuzz */
+ {
+ FT_Int dim, top, bot, delta;
+ PSH_Blue_Zone zone;
+
+
+ zone = top_table->zones;
+ count = count_top;
+
+ for ( dim = 1; dim >= 0; dim-- )
+ {
+ if ( count > 0 )
+ {
+ /* expand the bottom of the lowest zone normally */
+ zone->org_bottom -= fuzz;
+
+ /* expand the top and bottom of intermediate zones; */
+ /* checking that the interval is smaller than the fuzz */
+ top = zone->org_top;
+
+ for ( count--; count > 0; count-- )
+ {
+ bot = zone[1].org_bottom;
+ delta = bot - top;
+
+ if ( delta < 2 * fuzz )
+ zone[0].org_top = zone[1].org_bottom = top + delta / 2;
+ else
+ {
+ zone[0].org_top = top + fuzz;
+ zone[1].org_bottom = bot - fuzz;
+ }
+
+ zone++;
+ top = zone->org_top;
+ }
+
+ /* expand the top of the highest zone normally */
+ zone->org_top = top + fuzz;
+ }
+ zone = bot_table->zones;
+ count = count_bot;
+ }
+ }
+ }
+
+
+ /* reset the blues table when the device transform changes */
+ static void
+ psh_blues_scale_zones( PSH_Blues blues,
+ FT_Fixed scale,
+ FT_Pos delta )
+ {
+ FT_UInt count;
+ FT_UInt num;
+ PSH_Blue_Table table = 0;
+
+ /* */
+ /* Determine whether we need to suppress overshoots or */
+ /* not. We simply need to compare the vertical scale */
+ /* parameter to the raw bluescale value. Here is why: */
+ /* */
+ /* We need to suppress overshoots for all pointsizes. */
+ /* At 300dpi that satisfies: */
+ /* */
+ /* pointsize < 240*bluescale + 0.49 */
+ /* */
+ /* This corresponds to: */
+ /* */
+ /* pixelsize < 1000*bluescale + 49/24 */
+ /* */
+ /* scale*EM_Size < 1000*bluescale + 49/24 */
+ /* */
+ /* However, for normal Type 1 fonts, EM_Size is 1000! */
+ /* We thus only check: */
+ /* */
+ /* scale < bluescale + 49/24000 */
+ /* */
+ /* which we shorten to */
+ /* */
+ /* "scale < bluescale" */
+ /* */
+ /* Note that `blue_scale' is stored 1000 times its real */
+ /* value, and that `scale' converts from font units to */
+ /* fractional pixels. */
+ /* */
+
+ /* 1000 / 64 = 125 / 8 */
+ if ( scale >= 0x20C49BAL )
+ blues->no_overshoots = FT_BOOL( scale < blues->blue_scale * 8 / 125 );
+ else
+ blues->no_overshoots = FT_BOOL( scale * 125 < blues->blue_scale * 8 );
+
+ /* */
+ /* The blue threshold is the font units distance under */
+ /* which overshoots are suppressed due to the BlueShift */
+ /* even if the scale is greater than BlueScale. */
+ /* */
+ /* It is the smallest distance such that */
+ /* */
+ /* dist <= BlueShift && dist*scale <= 0.5 pixels */
+ /* */
+ {
+ FT_Int threshold = blues->blue_shift;
+
+
+ while ( threshold > 0 && FT_MulFix( threshold, scale ) > 32 )
+ threshold--;
+
+ blues->blue_threshold = threshold;
+ }
+
+ for ( num = 0; num < 4; num++ )
+ {
+ PSH_Blue_Zone zone;
+
+
+ switch ( num )
+ {
+ case 0:
+ table = &blues->normal_top;
+ break;
+ case 1:
+ table = &blues->normal_bottom;
+ break;
+ case 2:
+ table = &blues->family_top;
+ break;
+ default:
+ table = &blues->family_bottom;
+ break;
+ }
+
+ zone = table->zones;
+ count = table->count;
+ for ( ; count > 0; count--, zone++ )
+ {
+ zone->cur_top = FT_MulFix( zone->org_top, scale ) + delta;
+ zone->cur_bottom = FT_MulFix( zone->org_bottom, scale ) + delta;
+ zone->cur_ref = FT_MulFix( zone->org_ref, scale ) + delta;
+ zone->cur_delta = FT_MulFix( zone->org_delta, scale );
+
+ /* round scaled reference position */
+ zone->cur_ref = FT_PIX_ROUND( zone->cur_ref );
+
+#if 0
+ if ( zone->cur_ref > zone->cur_top )
+ zone->cur_ref -= 64;
+ else if ( zone->cur_ref < zone->cur_bottom )
+ zone->cur_ref += 64;
+#endif
+ }
+ }
+
+ /* process the families now */
+
+ for ( num = 0; num < 2; num++ )
+ {
+ PSH_Blue_Zone zone1, zone2;
+ FT_UInt count1, count2;
+ PSH_Blue_Table normal, family;
+
+
+ switch ( num )
+ {
+ case 0:
+ normal = &blues->normal_top;
+ family = &blues->family_top;
+ break;
+
+ default:
+ normal = &blues->normal_bottom;
+ family = &blues->family_bottom;
+ }
+
+ zone1 = normal->zones;
+ count1 = normal->count;
+
+ for ( ; count1 > 0; count1--, zone1++ )
+ {
+ /* try to find a family zone whose reference position is less */
+ /* than 1 pixel far from the current zone */
+ zone2 = family->zones;
+ count2 = family->count;
+
+ for ( ; count2 > 0; count2--, zone2++ )
+ {
+ FT_Pos Delta;
+
+
+ Delta = zone1->org_ref - zone2->org_ref;
+ if ( Delta < 0 )
+ Delta = -Delta;
+
+ if ( FT_MulFix( Delta, scale ) < 64 )
+ {
+ zone1->cur_top = zone2->cur_top;
+ zone1->cur_bottom = zone2->cur_bottom;
+ zone1->cur_ref = zone2->cur_ref;
+ zone1->cur_delta = zone2->cur_delta;
+ break;
+ }
+ }
+ }
+ }
+ }
+
+
+ /* calculate the maximum height of given blue zones */
+ static FT_Short
+ psh_calc_max_height( FT_UInt num,
+ const FT_Short* values,
+ FT_Short cur_max )
+ {
+ FT_UInt count;
+
+
+ for ( count = 0; count < num; count += 2 )
+ {
+ FT_Short cur_height = values[count + 1] - values[count];
+
+
+ if ( cur_height > cur_max )
+ cur_max = cur_height;
+ }
+
+ return cur_max;
+ }
+
+
+ FT_LOCAL_DEF( void )
+ psh_blues_snap_stem( PSH_Blues blues,
+ FT_Int stem_top,
+ FT_Int stem_bot,
+ PSH_Alignment alignment )
+ {
+ PSH_Blue_Table table;
+ FT_UInt count;
+ FT_Pos delta;
+ PSH_Blue_Zone zone;
+ FT_Int no_shoots;
+
+
+ alignment->align = PSH_BLUE_ALIGN_NONE;
+
+ no_shoots = blues->no_overshoots;
+
+ /* look up stem top in top zones table */
+ table = &blues->normal_top;
+ count = table->count;
+ zone = table->zones;
+
+ for ( ; count > 0; count--, zone++ )
+ {
+ delta = stem_top - zone->org_bottom;
+ if ( delta < -blues->blue_fuzz )
+ break;
+
+ if ( stem_top <= zone->org_top + blues->blue_fuzz )
+ {
+ if ( no_shoots || delta <= blues->blue_threshold )
+ {
+ alignment->align |= PSH_BLUE_ALIGN_TOP;
+ alignment->align_top = zone->cur_ref;
+ }
+ break;
+ }
+ }
+
+ /* look up stem bottom in bottom zones table */
+ table = &blues->normal_bottom;
+ count = table->count;
+ zone = table->zones + count-1;
+
+ for ( ; count > 0; count--, zone-- )
+ {
+ delta = zone->org_top - stem_bot;
+ if ( delta < -blues->blue_fuzz )
+ break;
+
+ if ( stem_bot >= zone->org_bottom - blues->blue_fuzz )
+ {
+ if ( no_shoots || delta < blues->blue_threshold )
+ {
+ alignment->align |= PSH_BLUE_ALIGN_BOT;
+ alignment->align_bot = zone->cur_ref;
+ }
+ break;
+ }
+ }
+ }
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** GLOBAL HINTS *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ static void
+ psh_globals_destroy( PSH_Globals globals )
+ {
+ if ( globals )
+ {
+ FT_Memory memory;
+
+
+ memory = globals->memory;
+ globals->dimension[0].stdw.count = 0;
+ globals->dimension[1].stdw.count = 0;
+
+ globals->blues.normal_top.count = 0;
+ globals->blues.normal_bottom.count = 0;
+ globals->blues.family_top.count = 0;
+ globals->blues.family_bottom.count = 0;
+
+ FT_FREE( globals );
+
+#ifdef DEBUG_HINTER
+ ps_debug_globals = 0;
+#endif
+ }
+ }
+
+
+ static FT_Error
+ psh_globals_new( FT_Memory memory,
+ T1_Private* priv,
+ PSH_Globals *aglobals )
+ {
+ PSH_Globals globals = NULL;
+ FT_Error error;
+
+
+ if ( !FT_NEW( globals ) )
+ {
+ FT_UInt count;
+ FT_Short* read;
+
+
+ globals->memory = memory;
+
+ /* copy standard widths */
+ {
+ PSH_Dimension dim = &globals->dimension[1];
+ PSH_Width write = dim->stdw.widths;
+
+
+ write->org = priv->standard_width[0];
+ write++;
+
+ read = priv->snap_widths;
+ for ( count = priv->num_snap_widths; count > 0; count-- )
+ {
+ write->org = *read;
+ write++;
+ read++;
+ }
+
+ dim->stdw.count = priv->num_snap_widths + 1;
+ }
+
+ /* copy standard heights */
+ {
+ PSH_Dimension dim = &globals->dimension[0];
+ PSH_Width write = dim->stdw.widths;
+
+
+ write->org = priv->standard_height[0];
+ write++;
+ read = priv->snap_heights;
+ for ( count = priv->num_snap_heights; count > 0; count-- )
+ {
+ write->org = *read;
+ write++;
+ read++;
+ }
+
+ dim->stdw.count = priv->num_snap_heights + 1;
+ }
+
+ /* copy blue zones */
+ psh_blues_set_zones( &globals->blues, priv->num_blue_values,
+ priv->blue_values, priv->num_other_blues,
+ priv->other_blues, priv->blue_fuzz, 0 );
+
+ psh_blues_set_zones( &globals->blues, priv->num_family_blues,
+ priv->family_blues, priv->num_family_other_blues,
+ priv->family_other_blues, priv->blue_fuzz, 1 );
+
+ /* limit the BlueScale value to `1 / max_of_blue_zone_heights' */
+ {
+ FT_Fixed max_scale;
+ FT_Short max_height = 1;
+
+
+ max_height = psh_calc_max_height( priv->num_blue_values,
+ priv->blue_values,
+ max_height );
+ max_height = psh_calc_max_height( priv->num_other_blues,
+ priv->other_blues,
+ max_height );
+ max_height = psh_calc_max_height( priv->num_family_blues,
+ priv->family_blues,
+ max_height );
+ max_height = psh_calc_max_height( priv->num_family_other_blues,
+ priv->family_other_blues,
+ max_height );
+
+ /* BlueScale is scaled 1000 times */
+ max_scale = FT_DivFix( 1000, max_height );
+ globals->blues.blue_scale = priv->blue_scale < max_scale
+ ? priv->blue_scale
+ : max_scale;
+ }
+
+ globals->blues.blue_shift = priv->blue_shift;
+ globals->blues.blue_fuzz = priv->blue_fuzz;
+
+ globals->dimension[0].scale_mult = 0;
+ globals->dimension[0].scale_delta = 0;
+ globals->dimension[1].scale_mult = 0;
+ globals->dimension[1].scale_delta = 0;
+
+#ifdef DEBUG_HINTER
+ ps_debug_globals = globals;
+#endif
+ }
+
+ *aglobals = globals;
+ return error;
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ psh_globals_set_scale( PSH_Globals globals,
+ FT_Fixed x_scale,
+ FT_Fixed y_scale,
+ FT_Fixed x_delta,
+ FT_Fixed y_delta )
+ {
+ PSH_Dimension dim = &globals->dimension[0];
+
+
+ dim = &globals->dimension[0];
+ if ( x_scale != dim->scale_mult ||
+ x_delta != dim->scale_delta )
+ {
+ dim->scale_mult = x_scale;
+ dim->scale_delta = x_delta;
+
+ psh_globals_scale_widths( globals, 0 );
+ }
+
+ dim = &globals->dimension[1];
+ if ( y_scale != dim->scale_mult ||
+ y_delta != dim->scale_delta )
+ {
+ dim->scale_mult = y_scale;
+ dim->scale_delta = y_delta;
+
+ psh_globals_scale_widths( globals, 1 );
+ psh_blues_scale_zones( &globals->blues, y_scale, y_delta );
+ }
+
+ return 0;
+ }
+
+
+ FT_LOCAL_DEF( void )
+ psh_globals_funcs_init( PSH_Globals_FuncsRec* funcs )
+ {
+ funcs->create = psh_globals_new;
+ funcs->set_scale = psh_globals_set_scale;
+ funcs->destroy = psh_globals_destroy;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshglob.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshglob.h
new file mode 100644
index 0000000000..cfc2001d2d
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshglob.h
@@ -0,0 +1,196 @@
+/***************************************************************************/
+/* */
+/* pshglob.h */
+/* */
+/* PostScript hinter global hinting management. */
+/* */
+/* Copyright 2001, 2002, 2003 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __PSHGLOB_H__
+#define __PSHGLOB_H__
+
+
+#include "../../include/freetype/freetype.h"
+#include "../../include/freetype/internal/pshints.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** GLOBAL HINTS INTERNALS *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* @constant: */
+ /* PS_GLOBALS_MAX_BLUE_ZONES */
+ /* */
+ /* @description: */
+ /* The maximum number of blue zones in a font global hints structure. */
+ /* See @PS_Globals_BluesRec. */
+ /* */
+#define PS_GLOBALS_MAX_BLUE_ZONES 16
+
+
+ /*************************************************************************/
+ /* */
+ /* @constant: */
+ /* PS_GLOBALS_MAX_STD_WIDTHS */
+ /* */
+ /* @description: */
+ /* The maximum number of standard and snap widths in either the */
+ /* horizontal or vertical direction. See @PS_Globals_WidthsRec. */
+ /* */
+#define PS_GLOBALS_MAX_STD_WIDTHS 16
+
+
+ /* standard and snap width */
+ typedef struct PSH_WidthRec_
+ {
+ FT_Int org;
+ FT_Pos cur;
+ FT_Pos fit;
+
+ } PSH_WidthRec, *PSH_Width;
+
+
+ /* standard and snap widths table */
+ typedef struct PSH_WidthsRec_
+ {
+ FT_UInt count;
+ PSH_WidthRec widths[PS_GLOBALS_MAX_STD_WIDTHS];
+
+ } PSH_WidthsRec, *PSH_Widths;
+
+
+ typedef struct PSH_DimensionRec_
+ {
+ PSH_WidthsRec stdw;
+ FT_Fixed scale_mult;
+ FT_Fixed scale_delta;
+
+ } PSH_DimensionRec, *PSH_Dimension;
+
+
+ /* blue zone descriptor */
+ typedef struct PSH_Blue_ZoneRec_
+ {
+ FT_Int org_ref;
+ FT_Int org_delta;
+ FT_Int org_top;
+ FT_Int org_bottom;
+
+ FT_Pos cur_ref;
+ FT_Pos cur_delta;
+ FT_Pos cur_bottom;
+ FT_Pos cur_top;
+
+ } PSH_Blue_ZoneRec, *PSH_Blue_Zone;
+
+
+ typedef struct PSH_Blue_TableRec_
+ {
+ FT_UInt count;
+ PSH_Blue_ZoneRec zones[PS_GLOBALS_MAX_BLUE_ZONES];
+
+ } PSH_Blue_TableRec, *PSH_Blue_Table;
+
+
+ /* blue zones table */
+ typedef struct PSH_BluesRec_
+ {
+ PSH_Blue_TableRec normal_top;
+ PSH_Blue_TableRec normal_bottom;
+ PSH_Blue_TableRec family_top;
+ PSH_Blue_TableRec family_bottom;
+
+ FT_Fixed blue_scale;
+ FT_Int blue_shift;
+ FT_Int blue_threshold;
+ FT_Int blue_fuzz;
+ FT_Bool no_overshoots;
+
+ } PSH_BluesRec, *PSH_Blues;
+
+
+ /* font globals. */
+ /* dimension 0 => X coordinates + vertical hints/stems */
+ /* dimension 1 => Y coordinates + horizontal hints/stems */
+ typedef struct PSH_GlobalsRec_
+ {
+ FT_Memory memory;
+ PSH_DimensionRec dimension[2];
+ PSH_BluesRec blues;
+
+ } PSH_GlobalsRec;
+
+
+#define PSH_BLUE_ALIGN_NONE 0
+#define PSH_BLUE_ALIGN_TOP 1
+#define PSH_BLUE_ALIGN_BOT 2
+
+
+ typedef struct PSH_AlignmentRec_
+ {
+ int align;
+ FT_Pos align_top;
+ FT_Pos align_bot;
+
+ } PSH_AlignmentRec, *PSH_Alignment;
+
+
+ FT_LOCAL( void )
+ psh_globals_funcs_init( PSH_Globals_FuncsRec* funcs );
+
+
+#if 0
+ /* snap a stem width to fitter coordinates. `org_width' is in font */
+ /* units. The result is in device pixels (26.6 format). */
+ FT_LOCAL( FT_Pos )
+ psh_dimension_snap_width( PSH_Dimension dimension,
+ FT_Int org_width );
+#endif
+
+ FT_LOCAL( FT_Error )
+ psh_globals_set_scale( PSH_Globals globals,
+ FT_Fixed x_scale,
+ FT_Fixed y_scale,
+ FT_Fixed x_delta,
+ FT_Fixed y_delta );
+
+ /* snap a stem to one or two blue zones */
+ FT_LOCAL( void )
+ psh_blues_snap_stem( PSH_Blues blues,
+ FT_Int stem_top,
+ FT_Int stem_bot,
+ PSH_Alignment alignment );
+ /* */
+
+#ifdef DEBUG_HINTER
+ extern PSH_Globals ps_debug_globals;
+#endif
+
+
+FT_END_HEADER
+
+
+#endif /* __PSHGLOB_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshmod.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshmod.c
new file mode 100644
index 0000000000..80edad8ecb
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshmod.c
@@ -0,0 +1,119 @@
+/***************************************************************************/
+/* */
+/* pshmod.c */
+/* */
+/* FreeType PostScript hinter module implementation (body). */
+/* */
+/* Copyright 2001, 2002, 2007, 2009, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "pshrec.h"
+#include "pshalgo.h"
+#include "pshpic.h"
+
+
+ /* the Postscript Hinter module structure */
+ typedef struct PS_Hinter_Module_Rec_
+ {
+ FT_ModuleRec root;
+ PS_HintsRec ps_hints;
+
+ PSH_Globals_FuncsRec globals_funcs;
+ T1_Hints_FuncsRec t1_funcs;
+ T2_Hints_FuncsRec t2_funcs;
+
+ } PS_Hinter_ModuleRec, *PS_Hinter_Module;
+
+
+ /* finalize module */
+ FT_CALLBACK_DEF( void )
+ ps_hinter_done( PS_Hinter_Module module )
+ {
+ module->t1_funcs.hints = NULL;
+ module->t2_funcs.hints = NULL;
+
+ ps_hints_done( &module->ps_hints );
+ }
+
+
+ /* initialize module, create hints recorder and the interface */
+ FT_CALLBACK_DEF( FT_Error )
+ ps_hinter_init( PS_Hinter_Module module )
+ {
+ FT_Memory memory = module->root.memory;
+ void* ph = &module->ps_hints;
+
+
+ ps_hints_init( &module->ps_hints, memory );
+
+ psh_globals_funcs_init( &module->globals_funcs );
+
+ t1_hints_funcs_init( &module->t1_funcs );
+ module->t1_funcs.hints = (T1_Hints)ph;
+
+ t2_hints_funcs_init( &module->t2_funcs );
+ module->t2_funcs.hints = (T2_Hints)ph;
+
+ return 0;
+ }
+
+
+ /* returns global hints interface */
+ FT_CALLBACK_DEF( PSH_Globals_Funcs )
+ pshinter_get_globals_funcs( FT_Module module )
+ {
+ return &((PS_Hinter_Module)module)->globals_funcs;
+ }
+
+
+ /* return Type 1 hints interface */
+ FT_CALLBACK_DEF( T1_Hints_Funcs )
+ pshinter_get_t1_funcs( FT_Module module )
+ {
+ return &((PS_Hinter_Module)module)->t1_funcs;
+ }
+
+
+ /* return Type 2 hints interface */
+ FT_CALLBACK_DEF( T2_Hints_Funcs )
+ pshinter_get_t2_funcs( FT_Module module )
+ {
+ return &((PS_Hinter_Module)module)->t2_funcs;
+ }
+
+
+ FT_DEFINE_PSHINTER_INTERFACE(
+ pshinter_interface,
+ pshinter_get_globals_funcs,
+ pshinter_get_t1_funcs,
+ pshinter_get_t2_funcs )
+
+
+ FT_DEFINE_MODULE(
+ pshinter_module_class,
+
+ 0,
+ sizeof ( PS_Hinter_ModuleRec ),
+ "pshinter",
+ 0x10000L,
+ 0x20000L,
+
+ &PSHINTER_INTERFACE_GET, /* module-specific interface */
+
+ (FT_Module_Constructor)ps_hinter_init,
+ (FT_Module_Destructor) ps_hinter_done,
+ (FT_Module_Requester) NULL ) /* no additional interface for now */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshmod.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshmod.h
new file mode 100644
index 0000000000..c2143ac405
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshmod.h
@@ -0,0 +1,39 @@
+/***************************************************************************/
+/* */
+/* pshmod.h */
+/* */
+/* PostScript hinter module interface (specification). */
+/* */
+/* Copyright 2001 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __PSHMOD_H__
+#define __PSHMOD_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/ftmodapi.h"
+
+
+FT_BEGIN_HEADER
+
+
+ FT_DECLARE_MODULE( pshinter_module_class )
+
+
+FT_END_HEADER
+
+
+#endif /* __PSHMOD_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshnterr.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshnterr.h
new file mode 100644
index 0000000000..472fdbf339
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshnterr.h
@@ -0,0 +1,41 @@
+/***************************************************************************/
+/* */
+/* pshnterr.h */
+/* */
+/* PS Hinter error codes (specification only). */
+/* */
+/* Copyright 2003, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* This file is used to define the PSHinter error enumeration constants. */
+ /* */
+ /*************************************************************************/
+
+#ifndef __PSHNTERR_H__
+#define __PSHNTERR_H__
+
+#include "../../include/freetype/ftmoderr.h"
+
+#undef __FTERRORS_H__
+
+#undef FT_ERR_PREFIX
+#define FT_ERR_PREFIX PSH_Err_
+#define FT_ERR_BASE FT_Mod_Err_PShinter
+
+#include "../../include/freetype/fterrors.h"
+
+#endif /* __PSHNTERR_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshpic.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshpic.c
new file mode 100644
index 0000000000..a35c99e701
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshpic.c
@@ -0,0 +1,76 @@
+/***************************************************************************/
+/* */
+/* pshpic.c */
+/* */
+/* The FreeType position independent code services for pshinter module. */
+/* */
+/* Copyright 2009, 2010, 2012, 2013 by */
+/* Oran Agra and Mickey Gabel. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/freetype.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "pshpic.h"
+#include "pshnterr.h"
+
+
+#ifdef FT_CONFIG_OPTION_PIC
+
+ /* forward declaration of PIC init functions from pshmod.c */
+ void
+ FT_Init_Class_pshinter_interface( FT_Library library,
+ PSHinter_Interface* clazz );
+
+ void
+ pshinter_module_class_pic_free( FT_Library library )
+ {
+ FT_PIC_Container* pic_container = &library->pic_container;
+ FT_Memory memory = library->memory;
+
+
+ if ( pic_container->pshinter )
+ {
+ FT_FREE( pic_container->pshinter );
+ pic_container->pshinter = NULL;
+ }
+ }
+
+
+ FT_Error
+ pshinter_module_class_pic_init( FT_Library library )
+ {
+ FT_PIC_Container* pic_container = &library->pic_container;
+ FT_Error error = FT_Err_Ok;
+ PSHinterPIC* container = NULL;
+ FT_Memory memory = library->memory;
+
+
+ /* allocate pointer, clear and set global container pointer */
+ if ( FT_ALLOC( container, sizeof ( *container ) ) )
+ return error;
+ FT_MEM_SET( container, 0, sizeof ( *container ) );
+ pic_container->pshinter = container;
+
+ /* add call to initialization function when you add new scripts */
+ FT_Init_Class_pshinter_interface(
+ library, &container->pshinter_interface );
+
+ if ( error )
+ pshinter_module_class_pic_free( library );
+
+ return error;
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshpic.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshpic.h
new file mode 100644
index 0000000000..8721aaa953
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshpic.h
@@ -0,0 +1,63 @@
+/***************************************************************************/
+/* */
+/* pshpic.h */
+/* */
+/* The FreeType position independent code services for pshinter module. */
+/* */
+/* Copyright 2009, 2012, 2013 by */
+/* Oran Agra and Mickey Gabel. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __PSHPIC_H__
+#define __PSHPIC_H__
+
+
+FT_BEGIN_HEADER
+
+#include "../../include/freetype/internal/ftpic.h"
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define PSHINTER_INTERFACE_GET pshinter_interface
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#include "../../include/freetype/internal/pshints.h"
+
+ typedef struct PSHinterPIC_
+ {
+ PSHinter_Interface pshinter_interface;
+
+ } PSHinterPIC;
+
+
+#define GET_PIC( lib ) ( (PSHinterPIC*)( (lib)->pic_container.pshinter ) )
+
+#define PSHINTER_INTERFACE_GET ( GET_PIC( library )->pshinter_interface )
+
+ /* see pshpic.c for the implementation */
+ void
+ pshinter_module_class_pic_free( FT_Library library );
+
+ FT_Error
+ pshinter_module_class_pic_init( FT_Library library );
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __PSHPIC_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshrec.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshrec.c
new file mode 100644
index 0000000000..8fc9a302d7
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshrec.c
@@ -0,0 +1,1225 @@
+/***************************************************************************/
+/* */
+/* pshrec.c */
+/* */
+/* FreeType PostScript hints recorder (body). */
+/* */
+/* Copyright 2001-2004, 2007, 2009, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/freetype.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftcalc.h"
+
+#include "pshrec.h"
+#include "pshalgo.h"
+
+#include "pshnterr.h"
+
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_pshrec
+
+#ifdef DEBUG_HINTER
+ PS_Hints ps_debug_hints = 0;
+ int ps_debug_no_horz_hints = 0;
+ int ps_debug_no_vert_hints = 0;
+#endif
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** PS_HINT MANAGEMENT *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /* destroy hints table */
+ static void
+ ps_hint_table_done( PS_Hint_Table table,
+ FT_Memory memory )
+ {
+ FT_FREE( table->hints );
+ table->num_hints = 0;
+ table->max_hints = 0;
+ }
+
+
+ /* ensure that a table can contain "count" elements */
+ static FT_Error
+ ps_hint_table_ensure( PS_Hint_Table table,
+ FT_UInt count,
+ FT_Memory memory )
+ {
+ FT_UInt old_max = table->max_hints;
+ FT_UInt new_max = count;
+ FT_Error error = FT_Err_Ok;
+
+
+ if ( new_max > old_max )
+ {
+ /* try to grow the table */
+ new_max = FT_PAD_CEIL( new_max, 8 );
+ if ( !FT_RENEW_ARRAY( table->hints, old_max, new_max ) )
+ table->max_hints = new_max;
+ }
+ return error;
+ }
+
+
+ static FT_Error
+ ps_hint_table_alloc( PS_Hint_Table table,
+ FT_Memory memory,
+ PS_Hint *ahint )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_UInt count;
+ PS_Hint hint = 0;
+
+
+ count = table->num_hints;
+ count++;
+
+ if ( count >= table->max_hints )
+ {
+ error = ps_hint_table_ensure( table, count, memory );
+ if ( error )
+ goto Exit;
+ }
+
+ hint = table->hints + count - 1;
+ hint->pos = 0;
+ hint->len = 0;
+ hint->flags = 0;
+
+ table->num_hints = count;
+
+ Exit:
+ *ahint = hint;
+ return error;
+ }
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** PS_MASK MANAGEMENT *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /* destroy mask */
+ static void
+ ps_mask_done( PS_Mask mask,
+ FT_Memory memory )
+ {
+ FT_FREE( mask->bytes );
+ mask->num_bits = 0;
+ mask->max_bits = 0;
+ mask->end_point = 0;
+ }
+
+
+ /* ensure that a mask can contain "count" bits */
+ static FT_Error
+ ps_mask_ensure( PS_Mask mask,
+ FT_UInt count,
+ FT_Memory memory )
+ {
+ FT_UInt old_max = ( mask->max_bits + 7 ) >> 3;
+ FT_UInt new_max = ( count + 7 ) >> 3;
+ FT_Error error = FT_Err_Ok;
+
+
+ if ( new_max > old_max )
+ {
+ new_max = FT_PAD_CEIL( new_max, 8 );
+ if ( !FT_RENEW_ARRAY( mask->bytes, old_max, new_max ) )
+ mask->max_bits = new_max * 8;
+ }
+ return error;
+ }
+
+
+ /* test a bit value in a given mask */
+ static FT_Int
+ ps_mask_test_bit( PS_Mask mask,
+ FT_Int idx )
+ {
+ if ( (FT_UInt)idx >= mask->num_bits )
+ return 0;
+
+ return mask->bytes[idx >> 3] & ( 0x80 >> ( idx & 7 ) );
+ }
+
+
+ /* clear a given bit */
+ static void
+ ps_mask_clear_bit( PS_Mask mask,
+ FT_Int idx )
+ {
+ FT_Byte* p;
+
+
+ if ( (FT_UInt)idx >= mask->num_bits )
+ return;
+
+ p = mask->bytes + ( idx >> 3 );
+ p[0] = (FT_Byte)( p[0] & ~( 0x80 >> ( idx & 7 ) ) );
+ }
+
+
+ /* set a given bit, possibly grow the mask */
+ static FT_Error
+ ps_mask_set_bit( PS_Mask mask,
+ FT_Int idx,
+ FT_Memory memory )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_Byte* p;
+
+
+ if ( idx < 0 )
+ goto Exit;
+
+ if ( (FT_UInt)idx >= mask->num_bits )
+ {
+ error = ps_mask_ensure( mask, idx + 1, memory );
+ if ( error )
+ goto Exit;
+
+ mask->num_bits = idx + 1;
+ }
+
+ p = mask->bytes + ( idx >> 3 );
+ p[0] = (FT_Byte)( p[0] | ( 0x80 >> ( idx & 7 ) ) );
+
+ Exit:
+ return error;
+ }
+
+
+ /* destroy mask table */
+ static void
+ ps_mask_table_done( PS_Mask_Table table,
+ FT_Memory memory )
+ {
+ FT_UInt count = table->max_masks;
+ PS_Mask mask = table->masks;
+
+
+ for ( ; count > 0; count--, mask++ )
+ ps_mask_done( mask, memory );
+
+ FT_FREE( table->masks );
+ table->num_masks = 0;
+ table->max_masks = 0;
+ }
+
+
+ /* ensure that a mask table can contain "count" masks */
+ static FT_Error
+ ps_mask_table_ensure( PS_Mask_Table table,
+ FT_UInt count,
+ FT_Memory memory )
+ {
+ FT_UInt old_max = table->max_masks;
+ FT_UInt new_max = count;
+ FT_Error error = FT_Err_Ok;
+
+
+ if ( new_max > old_max )
+ {
+ new_max = FT_PAD_CEIL( new_max, 8 );
+ if ( !FT_RENEW_ARRAY( table->masks, old_max, new_max ) )
+ table->max_masks = new_max;
+ }
+ return error;
+ }
+
+
+ /* allocate a new mask in a table */
+ static FT_Error
+ ps_mask_table_alloc( PS_Mask_Table table,
+ FT_Memory memory,
+ PS_Mask *amask )
+ {
+ FT_UInt count;
+ FT_Error error = FT_Err_Ok;
+ PS_Mask mask = 0;
+
+
+ count = table->num_masks;
+ count++;
+
+ if ( count > table->max_masks )
+ {
+ error = ps_mask_table_ensure( table, count, memory );
+ if ( error )
+ goto Exit;
+ }
+
+ mask = table->masks + count - 1;
+ mask->num_bits = 0;
+ mask->end_point = 0;
+ table->num_masks = count;
+
+ Exit:
+ *amask = mask;
+ return error;
+ }
+
+
+ /* return last hint mask in a table, create one if the table is empty */
+ static FT_Error
+ ps_mask_table_last( PS_Mask_Table table,
+ FT_Memory memory,
+ PS_Mask *amask )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_UInt count;
+ PS_Mask mask;
+
+
+ count = table->num_masks;
+ if ( count == 0 )
+ {
+ error = ps_mask_table_alloc( table, memory, &mask );
+ if ( error )
+ goto Exit;
+ }
+ else
+ mask = table->masks + count - 1;
+
+ Exit:
+ *amask = mask;
+ return error;
+ }
+
+
+ /* set a new mask to a given bit range */
+ static FT_Error
+ ps_mask_table_set_bits( PS_Mask_Table table,
+ const FT_Byte* source,
+ FT_UInt bit_pos,
+ FT_UInt bit_count,
+ FT_Memory memory )
+ {
+ FT_Error error;
+ PS_Mask mask;
+
+
+ error = ps_mask_table_last( table, memory, &mask );
+ if ( error )
+ goto Exit;
+
+ error = ps_mask_ensure( mask, bit_count, memory );
+ if ( error )
+ goto Exit;
+
+ mask->num_bits = bit_count;
+
+ /* now, copy bits */
+ {
+ FT_Byte* read = (FT_Byte*)source + ( bit_pos >> 3 );
+ FT_Int rmask = 0x80 >> ( bit_pos & 7 );
+ FT_Byte* write = mask->bytes;
+ FT_Int wmask = 0x80;
+ FT_Int val;
+
+
+ for ( ; bit_count > 0; bit_count-- )
+ {
+ val = write[0] & ~wmask;
+
+ if ( read[0] & rmask )
+ val |= wmask;
+
+ write[0] = (FT_Byte)val;
+
+ rmask >>= 1;
+ if ( rmask == 0 )
+ {
+ read++;
+ rmask = 0x80;
+ }
+
+ wmask >>= 1;
+ if ( wmask == 0 )
+ {
+ write++;
+ wmask = 0x80;
+ }
+ }
+ }
+
+ Exit:
+ return error;
+ }
+
+
+ /* test whether two masks in a table intersect */
+ static FT_Int
+ ps_mask_table_test_intersect( PS_Mask_Table table,
+ FT_Int index1,
+ FT_Int index2 )
+ {
+ PS_Mask mask1 = table->masks + index1;
+ PS_Mask mask2 = table->masks + index2;
+ FT_Byte* p1 = mask1->bytes;
+ FT_Byte* p2 = mask2->bytes;
+ FT_UInt count1 = mask1->num_bits;
+ FT_UInt count2 = mask2->num_bits;
+ FT_UInt count;
+
+
+ count = FT_MIN( count1, count2 );
+ for ( ; count >= 8; count -= 8 )
+ {
+ if ( p1[0] & p2[0] )
+ return 1;
+
+ p1++;
+ p2++;
+ }
+
+ if ( count == 0 )
+ return 0;
+
+ return ( p1[0] & p2[0] ) & ~( 0xFF >> count );
+ }
+
+
+ /* merge two masks, used by ps_mask_table_merge_all */
+ static FT_Error
+ ps_mask_table_merge( PS_Mask_Table table,
+ FT_Int index1,
+ FT_Int index2,
+ FT_Memory memory )
+ {
+ FT_UInt temp;
+ FT_Error error = FT_Err_Ok;
+
+
+ /* swap index1 and index2 so that index1 < index2 */
+ if ( index1 > index2 )
+ {
+ temp = index1;
+ index1 = index2;
+ index2 = temp;
+ }
+
+ if ( index1 < index2 && index1 >= 0 && index2 < (FT_Int)table->num_masks )
+ {
+ /* we need to merge the bitsets of index1 and index2 with a */
+ /* simple union */
+ PS_Mask mask1 = table->masks + index1;
+ PS_Mask mask2 = table->masks + index2;
+ FT_UInt count1 = mask1->num_bits;
+ FT_UInt count2 = mask2->num_bits;
+ FT_Int delta;
+
+
+ if ( count2 > 0 )
+ {
+ FT_UInt pos;
+ FT_Byte* read;
+ FT_Byte* write;
+
+
+ /* if "count2" is greater than "count1", we need to grow the */
+ /* first bitset, and clear the highest bits */
+ if ( count2 > count1 )
+ {
+ error = ps_mask_ensure( mask1, count2, memory );
+ if ( error )
+ goto Exit;
+
+ for ( pos = count1; pos < count2; pos++ )
+ ps_mask_clear_bit( mask1, pos );
+ }
+
+ /* merge (unite) the bitsets */
+ read = mask2->bytes;
+ write = mask1->bytes;
+ pos = (FT_UInt)( ( count2 + 7 ) >> 3 );
+
+ for ( ; pos > 0; pos-- )
+ {
+ write[0] = (FT_Byte)( write[0] | read[0] );
+ write++;
+ read++;
+ }
+ }
+
+ /* Now, remove "mask2" from the list. We need to keep the masks */
+ /* sorted in order of importance, so move table elements. */
+ mask2->num_bits = 0;
+ mask2->end_point = 0;
+
+ delta = table->num_masks - 1 - index2; /* number of masks to move */
+ if ( delta > 0 )
+ {
+ /* move to end of table for reuse */
+ PS_MaskRec dummy = *mask2;
+
+
+ ft_memmove( mask2, mask2 + 1, delta * sizeof ( PS_MaskRec ) );
+
+ mask2[delta] = dummy;
+ }
+
+ table->num_masks--;
+ }
+ else
+ FT_TRACE0(( "ps_mask_table_merge: ignoring invalid indices (%d,%d)\n",
+ index1, index2 ));
+
+ Exit:
+ return error;
+ }
+
+
+ /* Try to merge all masks in a given table. This is used to merge */
+ /* all counter masks into independent counter "paths". */
+ /* */
+ static FT_Error
+ ps_mask_table_merge_all( PS_Mask_Table table,
+ FT_Memory memory )
+ {
+ FT_Int index1, index2;
+ FT_Error error = FT_Err_Ok;
+
+
+ for ( index1 = table->num_masks - 1; index1 > 0; index1-- )
+ {
+ for ( index2 = index1 - 1; index2 >= 0; index2-- )
+ {
+ if ( ps_mask_table_test_intersect( table, index1, index2 ) )
+ {
+ error = ps_mask_table_merge( table, index2, index1, memory );
+ if ( error )
+ goto Exit;
+
+ break;
+ }
+ }
+ }
+
+ Exit:
+ return error;
+ }
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** PS_DIMENSION MANAGEMENT *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /* finalize a given dimension */
+ static void
+ ps_dimension_done( PS_Dimension dimension,
+ FT_Memory memory )
+ {
+ ps_mask_table_done( &dimension->counters, memory );
+ ps_mask_table_done( &dimension->masks, memory );
+ ps_hint_table_done( &dimension->hints, memory );
+ }
+
+
+ /* initialize a given dimension */
+ static void
+ ps_dimension_init( PS_Dimension dimension )
+ {
+ dimension->hints.num_hints = 0;
+ dimension->masks.num_masks = 0;
+ dimension->counters.num_masks = 0;
+ }
+
+
+#if 0
+
+ /* set a bit at a given index in the current hint mask */
+ static FT_Error
+ ps_dimension_set_mask_bit( PS_Dimension dim,
+ FT_UInt idx,
+ FT_Memory memory )
+ {
+ PS_Mask mask;
+ FT_Error error = FT_Err_Ok;
+
+
+ /* get last hint mask */
+ error = ps_mask_table_last( &dim->masks, memory, &mask );
+ if ( error )
+ goto Exit;
+
+ error = ps_mask_set_bit( mask, idx, memory );
+
+ Exit:
+ return error;
+ }
+
+#endif
+
+ /* set the end point in a mask, called from "End" & "Reset" methods */
+ static void
+ ps_dimension_end_mask( PS_Dimension dim,
+ FT_UInt end_point )
+ {
+ FT_UInt count = dim->masks.num_masks;
+
+
+ if ( count > 0 )
+ {
+ PS_Mask mask = dim->masks.masks + count - 1;
+
+
+ mask->end_point = end_point;
+ }
+ }
+
+
+ /* set the end point in the current mask, then create a new empty one */
+ /* (called by "Reset" method) */
+ static FT_Error
+ ps_dimension_reset_mask( PS_Dimension dim,
+ FT_UInt end_point,
+ FT_Memory memory )
+ {
+ PS_Mask mask;
+
+
+ /* end current mask */
+ ps_dimension_end_mask( dim, end_point );
+
+ /* allocate new one */
+ return ps_mask_table_alloc( &dim->masks, memory, &mask );
+ }
+
+
+ /* set a new mask, called from the "T2Stem" method */
+ static FT_Error
+ ps_dimension_set_mask_bits( PS_Dimension dim,
+ const FT_Byte* source,
+ FT_UInt source_pos,
+ FT_UInt source_bits,
+ FT_UInt end_point,
+ FT_Memory memory )
+ {
+ FT_Error error;
+
+
+ /* reset current mask, if any */
+ error = ps_dimension_reset_mask( dim, end_point, memory );
+ if ( error )
+ goto Exit;
+
+ /* set bits in new mask */
+ error = ps_mask_table_set_bits( &dim->masks, source,
+ source_pos, source_bits, memory );
+
+ Exit:
+ return error;
+ }
+
+
+ /* add a new single stem (called from "T1Stem" method) */
+ static FT_Error
+ ps_dimension_add_t1stem( PS_Dimension dim,
+ FT_Int pos,
+ FT_Int len,
+ FT_Memory memory,
+ FT_Int *aindex )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_UInt flags = 0;
+
+
+ /* detect ghost stem */
+ if ( len < 0 )
+ {
+ flags |= PS_HINT_FLAG_GHOST;
+ if ( len == -21 )
+ {
+ flags |= PS_HINT_FLAG_BOTTOM;
+ pos += len;
+ }
+ len = 0;
+ }
+
+ if ( aindex )
+ *aindex = -1;
+
+ /* now, lookup stem in the current hints table */
+ {
+ PS_Mask mask;
+ FT_UInt idx;
+ FT_UInt max = dim->hints.num_hints;
+ PS_Hint hint = dim->hints.hints;
+
+
+ for ( idx = 0; idx < max; idx++, hint++ )
+ {
+ if ( hint->pos == pos && hint->len == len )
+ break;
+ }
+
+ /* we need to create a new hint in the table */
+ if ( idx >= max )
+ {
+ error = ps_hint_table_alloc( &dim->hints, memory, &hint );
+ if ( error )
+ goto Exit;
+
+ hint->pos = pos;
+ hint->len = len;
+ hint->flags = flags;
+ }
+
+ /* now, store the hint in the current mask */
+ error = ps_mask_table_last( &dim->masks, memory, &mask );
+ if ( error )
+ goto Exit;
+
+ error = ps_mask_set_bit( mask, idx, memory );
+ if ( error )
+ goto Exit;
+
+ if ( aindex )
+ *aindex = (FT_Int)idx;
+ }
+
+ Exit:
+ return error;
+ }
+
+
+ /* add a "hstem3/vstem3" counter to our dimension table */
+ static FT_Error
+ ps_dimension_add_counter( PS_Dimension dim,
+ FT_Int hint1,
+ FT_Int hint2,
+ FT_Int hint3,
+ FT_Memory memory )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_UInt count = dim->counters.num_masks;
+ PS_Mask counter = dim->counters.masks;
+
+
+ /* try to find an existing counter mask that already uses */
+ /* one of these stems here */
+ for ( ; count > 0; count--, counter++ )
+ {
+ if ( ps_mask_test_bit( counter, hint1 ) ||
+ ps_mask_test_bit( counter, hint2 ) ||
+ ps_mask_test_bit( counter, hint3 ) )
+ break;
+ }
+
+ /* create a new counter when needed */
+ if ( count == 0 )
+ {
+ error = ps_mask_table_alloc( &dim->counters, memory, &counter );
+ if ( error )
+ goto Exit;
+ }
+
+ /* now, set the bits for our hints in the counter mask */
+ error = ps_mask_set_bit( counter, hint1, memory );
+ if ( error )
+ goto Exit;
+
+ error = ps_mask_set_bit( counter, hint2, memory );
+ if ( error )
+ goto Exit;
+
+ error = ps_mask_set_bit( counter, hint3, memory );
+ if ( error )
+ goto Exit;
+
+ Exit:
+ return error;
+ }
+
+
+ /* end of recording session for a given dimension */
+ static FT_Error
+ ps_dimension_end( PS_Dimension dim,
+ FT_UInt end_point,
+ FT_Memory memory )
+ {
+ /* end hint mask table */
+ ps_dimension_end_mask( dim, end_point );
+
+ /* merge all counter masks into independent "paths" */
+ return ps_mask_table_merge_all( &dim->counters, memory );
+ }
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** PS_RECORDER MANAGEMENT *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /* destroy hints */
+ FT_LOCAL( void )
+ ps_hints_done( PS_Hints hints )
+ {
+ FT_Memory memory = hints->memory;
+
+
+ ps_dimension_done( &hints->dimension[0], memory );
+ ps_dimension_done( &hints->dimension[1], memory );
+
+ hints->error = FT_Err_Ok;
+ hints->memory = 0;
+ }
+
+
+ FT_LOCAL( FT_Error )
+ ps_hints_init( PS_Hints hints,
+ FT_Memory memory )
+ {
+ FT_MEM_ZERO( hints, sizeof ( *hints ) );
+ hints->memory = memory;
+ return FT_Err_Ok;
+ }
+
+
+ /* initialize a hints for a new session */
+ static void
+ ps_hints_open( PS_Hints hints,
+ PS_Hint_Type hint_type )
+ {
+ switch ( hint_type )
+ {
+ case PS_HINT_TYPE_1:
+ case PS_HINT_TYPE_2:
+ hints->error = FT_Err_Ok;
+ hints->hint_type = hint_type;
+
+ ps_dimension_init( &hints->dimension[0] );
+ ps_dimension_init( &hints->dimension[1] );
+ break;
+
+ default:
+ hints->error = FT_THROW( Invalid_Argument );
+ hints->hint_type = hint_type;
+
+ FT_TRACE0(( "ps_hints_open: invalid charstring type\n" ));
+ break;
+ }
+ }
+
+
+ /* add one or more stems to the current hints table */
+ static void
+ ps_hints_stem( PS_Hints hints,
+ FT_Int dimension,
+ FT_UInt count,
+ FT_Long* stems )
+ {
+ if ( !hints->error )
+ {
+ /* limit "dimension" to 0..1 */
+ if ( dimension < 0 || dimension > 1 )
+ {
+ FT_TRACE0(( "ps_hints_stem: invalid dimension (%d) used\n",
+ dimension ));
+ dimension = ( dimension != 0 );
+ }
+
+ /* record the stems in the current hints/masks table */
+ switch ( hints->hint_type )
+ {
+ case PS_HINT_TYPE_1: /* Type 1 "hstem" or "vstem" operator */
+ case PS_HINT_TYPE_2: /* Type 2 "hstem" or "vstem" operator */
+ {
+ PS_Dimension dim = &hints->dimension[dimension];
+
+
+ for ( ; count > 0; count--, stems += 2 )
+ {
+ FT_Error error;
+ FT_Memory memory = hints->memory;
+
+
+ error = ps_dimension_add_t1stem(
+ dim, (FT_Int)stems[0], (FT_Int)stems[1],
+ memory, NULL );
+ if ( error )
+ {
+ FT_ERROR(( "ps_hints_stem: could not add stem"
+ " (%d,%d) to hints table\n", stems[0], stems[1] ));
+
+ hints->error = error;
+ return;
+ }
+ }
+ break;
+ }
+
+ default:
+ FT_TRACE0(( "ps_hints_stem: called with invalid hint type (%d)\n",
+ hints->hint_type ));
+ break;
+ }
+ }
+ }
+
+
+ /* add one Type1 counter stem to the current hints table */
+ static void
+ ps_hints_t1stem3( PS_Hints hints,
+ FT_Int dimension,
+ FT_Fixed* stems )
+ {
+ FT_Error error = FT_Err_Ok;
+
+
+ if ( !hints->error )
+ {
+ PS_Dimension dim;
+ FT_Memory memory = hints->memory;
+ FT_Int count;
+ FT_Int idx[3];
+
+
+ /* limit "dimension" to 0..1 */
+ if ( dimension < 0 || dimension > 1 )
+ {
+ FT_TRACE0(( "ps_hints_t1stem3: invalid dimension (%d) used\n",
+ dimension ));
+ dimension = ( dimension != 0 );
+ }
+
+ dim = &hints->dimension[dimension];
+
+ /* there must be 6 elements in the 'stem' array */
+ if ( hints->hint_type == PS_HINT_TYPE_1 )
+ {
+ /* add the three stems to our hints/masks table */
+ for ( count = 0; count < 3; count++, stems += 2 )
+ {
+ error = ps_dimension_add_t1stem( dim,
+ (FT_Int)FIXED_TO_INT( stems[0] ),
+ (FT_Int)FIXED_TO_INT( stems[1] ),
+ memory, &idx[count] );
+ if ( error )
+ goto Fail;
+ }
+
+ /* now, add the hints to the counters table */
+ error = ps_dimension_add_counter( dim, idx[0], idx[1], idx[2],
+ memory );
+ if ( error )
+ goto Fail;
+ }
+ else
+ {
+ FT_ERROR(( "ps_hints_t1stem3: called with invalid hint type\n" ));
+ error = FT_THROW( Invalid_Argument );
+ goto Fail;
+ }
+ }
+
+ return;
+
+ Fail:
+ FT_ERROR(( "ps_hints_t1stem3: could not add counter stems to table\n" ));
+ hints->error = error;
+ }
+
+
+ /* reset hints (only with Type 1 hints) */
+ static void
+ ps_hints_t1reset( PS_Hints hints,
+ FT_UInt end_point )
+ {
+ FT_Error error = FT_Err_Ok;
+
+
+ if ( !hints->error )
+ {
+ FT_Memory memory = hints->memory;
+
+
+ if ( hints->hint_type == PS_HINT_TYPE_1 )
+ {
+ error = ps_dimension_reset_mask( &hints->dimension[0],
+ end_point, memory );
+ if ( error )
+ goto Fail;
+
+ error = ps_dimension_reset_mask( &hints->dimension[1],
+ end_point, memory );
+ if ( error )
+ goto Fail;
+ }
+ else
+ {
+ /* invalid hint type */
+ error = FT_THROW( Invalid_Argument );
+ goto Fail;
+ }
+ }
+ return;
+
+ Fail:
+ hints->error = error;
+ }
+
+
+ /* Type2 "hintmask" operator, add a new hintmask to each direction */
+ static void
+ ps_hints_t2mask( PS_Hints hints,
+ FT_UInt end_point,
+ FT_UInt bit_count,
+ const FT_Byte* bytes )
+ {
+ FT_Error error;
+
+
+ if ( !hints->error )
+ {
+ PS_Dimension dim = hints->dimension;
+ FT_Memory memory = hints->memory;
+ FT_UInt count1 = dim[0].hints.num_hints;
+ FT_UInt count2 = dim[1].hints.num_hints;
+
+
+ /* check bit count; must be equal to current total hint count */
+ if ( bit_count != count1 + count2 )
+ {
+ FT_TRACE0(( "ps_hints_t2mask:"
+ " called with invalid bitcount %d (instead of %d)\n",
+ bit_count, count1 + count2 ));
+
+ /* simply ignore the operator */
+ return;
+ }
+
+ /* set-up new horizontal and vertical hint mask now */
+ error = ps_dimension_set_mask_bits( &dim[0], bytes, count2, count1,
+ end_point, memory );
+ if ( error )
+ goto Fail;
+
+ error = ps_dimension_set_mask_bits( &dim[1], bytes, 0, count2,
+ end_point, memory );
+ if ( error )
+ goto Fail;
+ }
+ return;
+
+ Fail:
+ hints->error = error;
+ }
+
+
+ static void
+ ps_hints_t2counter( PS_Hints hints,
+ FT_UInt bit_count,
+ const FT_Byte* bytes )
+ {
+ FT_Error error;
+
+
+ if ( !hints->error )
+ {
+ PS_Dimension dim = hints->dimension;
+ FT_Memory memory = hints->memory;
+ FT_UInt count1 = dim[0].hints.num_hints;
+ FT_UInt count2 = dim[1].hints.num_hints;
+
+
+ /* check bit count, must be equal to current total hint count */
+ if ( bit_count != count1 + count2 )
+ {
+ FT_TRACE0(( "ps_hints_t2counter:"
+ " called with invalid bitcount %d (instead of %d)\n",
+ bit_count, count1 + count2 ));
+
+ /* simply ignore the operator */
+ return;
+ }
+
+ /* set-up new horizontal and vertical hint mask now */
+ error = ps_dimension_set_mask_bits( &dim[0], bytes, 0, count1,
+ 0, memory );
+ if ( error )
+ goto Fail;
+
+ error = ps_dimension_set_mask_bits( &dim[1], bytes, count1, count2,
+ 0, memory );
+ if ( error )
+ goto Fail;
+ }
+ return;
+
+ Fail:
+ hints->error = error;
+ }
+
+
+ /* end recording session */
+ static FT_Error
+ ps_hints_close( PS_Hints hints,
+ FT_UInt end_point )
+ {
+ FT_Error error;
+
+
+ error = hints->error;
+ if ( !error )
+ {
+ FT_Memory memory = hints->memory;
+ PS_Dimension dim = hints->dimension;
+
+
+ error = ps_dimension_end( &dim[0], end_point, memory );
+ if ( !error )
+ {
+ error = ps_dimension_end( &dim[1], end_point, memory );
+ }
+ }
+
+#ifdef DEBUG_HINTER
+ if ( !error )
+ ps_debug_hints = hints;
+#endif
+ return error;
+ }
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** TYPE 1 HINTS RECORDING INTERFACE *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ static void
+ t1_hints_open( T1_Hints hints )
+ {
+ ps_hints_open( (PS_Hints)hints, PS_HINT_TYPE_1 );
+ }
+
+ static void
+ t1_hints_stem( T1_Hints hints,
+ FT_Int dimension,
+ FT_Fixed* coords )
+ {
+ FT_Pos stems[2];
+
+
+ stems[0] = FIXED_TO_INT( coords[0] );
+ stems[1] = FIXED_TO_INT( coords[1] );
+
+ ps_hints_stem( (PS_Hints)hints, dimension, 1, stems );
+ }
+
+
+ FT_LOCAL_DEF( void )
+ t1_hints_funcs_init( T1_Hints_FuncsRec* funcs )
+ {
+ FT_MEM_ZERO( (char*)funcs, sizeof ( *funcs ) );
+
+ funcs->open = (T1_Hints_OpenFunc) t1_hints_open;
+ funcs->close = (T1_Hints_CloseFunc) ps_hints_close;
+ funcs->stem = (T1_Hints_SetStemFunc) t1_hints_stem;
+ funcs->stem3 = (T1_Hints_SetStem3Func)ps_hints_t1stem3;
+ funcs->reset = (T1_Hints_ResetFunc) ps_hints_t1reset;
+ funcs->apply = (T1_Hints_ApplyFunc) ps_hints_apply;
+ }
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** TYPE 2 HINTS RECORDING INTERFACE *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ static void
+ t2_hints_open( T2_Hints hints )
+ {
+ ps_hints_open( (PS_Hints)hints, PS_HINT_TYPE_2 );
+ }
+
+
+ static void
+ t2_hints_stems( T2_Hints hints,
+ FT_Int dimension,
+ FT_Int count,
+ FT_Fixed* coords )
+ {
+ FT_Pos stems[32], y, n;
+ FT_Int total = count;
+
+
+ y = 0;
+ while ( total > 0 )
+ {
+ /* determine number of stems to write */
+ count = total;
+ if ( count > 16 )
+ count = 16;
+
+ /* compute integer stem positions in font units */
+ for ( n = 0; n < count * 2; n++ )
+ {
+ y += coords[n];
+ stems[n] = FIXED_TO_INT( y );
+ }
+
+ /* compute lengths */
+ for ( n = 0; n < count * 2; n += 2 )
+ stems[n + 1] = stems[n + 1] - stems[n];
+
+ /* add them to the current dimension */
+ ps_hints_stem( (PS_Hints)hints, dimension, count, stems );
+
+ total -= count;
+ }
+ }
+
+
+ FT_LOCAL_DEF( void )
+ t2_hints_funcs_init( T2_Hints_FuncsRec* funcs )
+ {
+ FT_MEM_ZERO( funcs, sizeof ( *funcs ) );
+
+ funcs->open = (T2_Hints_OpenFunc) t2_hints_open;
+ funcs->close = (T2_Hints_CloseFunc) ps_hints_close;
+ funcs->stems = (T2_Hints_StemsFunc) t2_hints_stems;
+ funcs->hintmask= (T2_Hints_MaskFunc) ps_hints_t2mask;
+ funcs->counter = (T2_Hints_CounterFunc)ps_hints_t2counter;
+ funcs->apply = (T2_Hints_ApplyFunc) ps_hints_apply;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshrec.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshrec.h
new file mode 100644
index 0000000000..91825db89d
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/pshrec.h
@@ -0,0 +1,176 @@
+/***************************************************************************/
+/* */
+/* pshrec.h */
+/* */
+/* Postscript (Type1/Type2) hints recorder (specification). */
+/* */
+/* Copyright 2001, 2002, 2003, 2006, 2008 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /**************************************************************************/
+ /* */
+ /* The functions defined here are called from the Type 1, CID and CFF */
+ /* font drivers to record the hints of a given character/glyph. */
+ /* */
+ /* The hints are recorded in a unified format, and are later processed */
+ /* by the `optimizer' and `fitter' to adjust the outlines to the pixel */
+ /* grid. */
+ /* */
+ /**************************************************************************/
+
+
+#ifndef __PSHREC_H__
+#define __PSHREC_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/pshints.h"
+#include "pshglob.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** GLYPH HINTS RECORDER INTERNALS *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /* handle to hint record */
+ typedef struct PS_HintRec_* PS_Hint;
+
+ /* hint types */
+ typedef enum PS_Hint_Type_
+ {
+ PS_HINT_TYPE_1 = 1,
+ PS_HINT_TYPE_2 = 2
+
+ } PS_Hint_Type;
+
+
+ /* hint flags */
+ typedef enum PS_Hint_Flags_
+ {
+ PS_HINT_FLAG_GHOST = 1,
+ PS_HINT_FLAG_BOTTOM = 2
+
+ } PS_Hint_Flags;
+
+
+ /* hint descriptor */
+ typedef struct PS_HintRec_
+ {
+ FT_Int pos;
+ FT_Int len;
+ FT_UInt flags;
+
+ } PS_HintRec;
+
+
+#define ps_hint_is_active( x ) ( (x)->flags & PS_HINT_FLAG_ACTIVE )
+#define ps_hint_is_ghost( x ) ( (x)->flags & PS_HINT_FLAG_GHOST )
+#define ps_hint_is_bottom( x ) ( (x)->flags & PS_HINT_FLAG_BOTTOM )
+
+
+ /* hints table descriptor */
+ typedef struct PS_Hint_TableRec_
+ {
+ FT_UInt num_hints;
+ FT_UInt max_hints;
+ PS_Hint hints;
+
+ } PS_Hint_TableRec, *PS_Hint_Table;
+
+
+ /* hint and counter mask descriptor */
+ typedef struct PS_MaskRec_
+ {
+ FT_UInt num_bits;
+ FT_UInt max_bits;
+ FT_Byte* bytes;
+ FT_UInt end_point;
+
+ } PS_MaskRec, *PS_Mask;
+
+
+ /* masks and counters table descriptor */
+ typedef struct PS_Mask_TableRec_
+ {
+ FT_UInt num_masks;
+ FT_UInt max_masks;
+ PS_Mask masks;
+
+ } PS_Mask_TableRec, *PS_Mask_Table;
+
+
+ /* dimension-specific hints descriptor */
+ typedef struct PS_DimensionRec_
+ {
+ PS_Hint_TableRec hints;
+ PS_Mask_TableRec masks;
+ PS_Mask_TableRec counters;
+
+ } PS_DimensionRec, *PS_Dimension;
+
+
+ /* glyph hints descriptor */
+ /* dimension 0 => X coordinates + vertical hints/stems */
+ /* dimension 1 => Y coordinates + horizontal hints/stems */
+ typedef struct PS_HintsRec_
+ {
+ FT_Memory memory;
+ FT_Error error;
+ FT_UInt32 magic;
+ PS_Hint_Type hint_type;
+ PS_DimensionRec dimension[2];
+
+ } PS_HintsRec, *PS_Hints;
+
+ /* */
+
+ /* initialize hints recorder */
+ FT_LOCAL( FT_Error )
+ ps_hints_init( PS_Hints hints,
+ FT_Memory memory );
+
+ /* finalize hints recorder */
+ FT_LOCAL( void )
+ ps_hints_done( PS_Hints hints );
+
+ /* initialize Type1 hints recorder interface */
+ FT_LOCAL( void )
+ t1_hints_funcs_init( T1_Hints_FuncsRec* funcs );
+
+ /* initialize Type2 hints recorder interface */
+ FT_LOCAL( void )
+ t2_hints_funcs_init( T2_Hints_FuncsRec* funcs );
+
+
+#ifdef DEBUG_HINTER
+ extern PS_Hints ps_debug_hints;
+ extern int ps_debug_no_horz_hints;
+ extern int ps_debug_no_vert_hints;
+#endif
+
+ /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __PS_HINTER_RECORD_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/rules.mk b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/rules.mk
new file mode 100644
index 0000000000..888ece1058
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/pshinter/rules.mk
@@ -0,0 +1,73 @@
+#
+# FreeType 2 PSHinter driver configuration rules
+#
+
+
+# Copyright 2001, 2003, 2011 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT. By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+
+# PSHINTER driver directory
+#
+PSHINTER_DIR := $(SRC_DIR)/pshinter
+
+
+# compilation flags for the driver
+#
+PSHINTER_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(PSHINTER_DIR))
+
+
+# PSHINTER driver sources (i.e., C files)
+#
+PSHINTER_DRV_SRC := $(PSHINTER_DIR)/pshalgo.c \
+ $(PSHINTER_DIR)/pshglob.c \
+ $(PSHINTER_DIR)/pshmod.c \
+ $(PSHINTER_DIR)/pshpic.c \
+ $(PSHINTER_DIR)/pshrec.c
+
+
+# PSHINTER driver headers
+#
+PSHINTER_DRV_H := $(PSHINTER_DRV_SRC:%c=%h) \
+ $(PSHINTER_DIR)/pshnterr.h
+
+
+# PSHINTER driver object(s)
+#
+# PSHINTER_DRV_OBJ_M is used during `multi' builds.
+# PSHINTER_DRV_OBJ_S is used during `single' builds.
+#
+PSHINTER_DRV_OBJ_M := $(PSHINTER_DRV_SRC:$(PSHINTER_DIR)/%.c=$(OBJ_DIR)/%.$O)
+PSHINTER_DRV_OBJ_S := $(OBJ_DIR)/pshinter.$O
+
+# PSHINTER driver source file for single build
+#
+PSHINTER_DRV_SRC_S := $(PSHINTER_DIR)/pshinter.c
+
+
+# PSHINTER driver - single object
+#
+$(PSHINTER_DRV_OBJ_S): $(PSHINTER_DRV_SRC_S) $(PSHINTER_DRV_SRC) \
+ $(FREETYPE_H) $(PSHINTER_DRV_H)
+ $(PSHINTER_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(PSHINTER_DRV_SRC_S))
+
+
+# PSHINTER driver - multiple objects
+#
+$(OBJ_DIR)/%.$O: $(PSHINTER_DIR)/%.c $(FREETYPE_H) $(PSHINTER_DRV_H)
+ $(PSHINTER_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)
+
+
+# update main driver object lists
+#
+DRV_OBJS_S += $(PSHINTER_DRV_OBJ_S)
+DRV_OBJS_M += $(PSHINTER_DRV_OBJ_M)
+
+
+# EOF
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/Jamfile b/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/Jamfile
new file mode 100644
index 0000000000..06c0dda66f
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/Jamfile
@@ -0,0 +1,29 @@
+# FreeType 2 src/psnames Jamfile
+#
+# Copyright 2001 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT. By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+SubDir FT2_TOP $(FT2_SRC_DIR) psnames ;
+
+{
+ local _sources ;
+
+ if $(FT2_MULTI)
+ {
+ _sources = psmodule pspic ;
+ }
+ else
+ {
+ _sources = psnames ;
+ }
+
+ Library $(FT2_LIB) : $(_sources).c ;
+}
+
+# end of src/psnames Jamfile
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/fxft_psmodule.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/fxft_psmodule.c
new file mode 100644
index 0000000000..595aa87671
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/fxft_psmodule.c
@@ -0,0 +1,670 @@
+#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501
+/***************************************************************************/
+/* */
+/* psmodule.c */
+/* */
+/* PSNames module implementation (body). */
+/* */
+/* Copyright 1996-2003, 2005-2008, 2012, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+#define FT2_BUILD_LIBRARY
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/services/svpscmap.h"
+
+#include "psmodule.h"
+#include "pstables.h"
+
+#include "psnamerr.h"
+#include "pspic.h"
+
+
+#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES
+
+
+#ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST
+
+
+#define VARIANT_BIT 0x80000000UL
+#define BASE_GLYPH( code ) ( (FT_UInt32)( (code) & ~VARIANT_BIT ) )
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+ /* Return the Unicode value corresponding to a given glyph. Note that */
+ /* we do deal with glyph variants by detecting a non-initial dot in */
+ /* the name, as in `A.swash' or `e.final'; in this case, the */
+ /* VARIANT_BIT is set in the return value. */
+ /* */
+int FXFT_unicode_from_adobe_name( const char* glyph_name )
+ {
+ /* If the name begins with `uni', then the glyph name may be a */
+ /* hard-coded unicode character code. */
+ if ( glyph_name[0] == 'u' &&
+ glyph_name[1] == 'n' &&
+ glyph_name[2] == 'i' )
+ {
+ /* determine whether the next four characters following are */
+ /* hexadecimal. */
+
+ /* XXX: Add code to deal with ligatures, i.e. glyph names like */
+ /* `uniXXXXYYYYZZZZ'... */
+
+ FT_Int count;
+ FT_UInt32 value = 0;
+ const char* p = glyph_name + 3;
+
+
+ for ( count = 4; count > 0; count--, p++ )
+ {
+ char c = *p;
+ unsigned int d;
+
+
+ d = (unsigned char)c - '0';
+ if ( d >= 10 )
+ {
+ d = (unsigned char)c - 'A';
+ if ( d >= 6 )
+ d = 16;
+ else
+ d += 10;
+ }
+
+ /* Exit if a non-uppercase hexadecimal character was found */
+ /* -- this also catches character codes below `0' since such */
+ /* negative numbers cast to `unsigned int' are far too big. */
+ if ( d >= 16 )
+ break;
+
+ value = ( value << 4 ) + d;
+ }
+
+ /* there must be exactly four hex digits */
+ if ( count == 0 )
+ {
+ if ( *p == '\0' )
+ return value;
+ if ( *p == '.' )
+ return (FT_UInt32)( value | VARIANT_BIT );
+ }
+ }
+
+ /* If the name begins with `u', followed by four to six uppercase */
+ /* hexadecimal digits, it is a hard-coded unicode character code. */
+ if ( glyph_name[0] == 'u' )
+ {
+ FT_Int count;
+ FT_UInt32 value = 0;
+ const char* p = glyph_name + 1;
+
+
+ for ( count = 6; count > 0; count--, p++ )
+ {
+ char c = *p;
+ unsigned int d;
+
+
+ d = (unsigned char)c - '0';
+ if ( d >= 10 )
+ {
+ d = (unsigned char)c - 'A';
+ if ( d >= 6 )
+ d = 16;
+ else
+ d += 10;
+ }
+
+ if ( d >= 16 )
+ break;
+
+ value = ( value << 4 ) + d;
+ }
+
+ if ( count <= 2 )
+ {
+ if ( *p == '\0' )
+ return value;
+ if ( *p == '.' )
+ return (FT_UInt32)( value | VARIANT_BIT );
+ }
+ }
+
+ /* Look for a non-initial dot in the glyph name in order to */
+ /* find variants like `A.swash', `e.final', etc. */
+ {
+ const char* p = glyph_name;
+ const char* dot = NULL;
+
+
+ for ( ; *p; p++ )
+ {
+ if ( *p == '.' && p > glyph_name )
+ {
+ dot = p;
+ break;
+ }
+ }
+
+ /* now look up the glyph in the Adobe Glyph List */
+ if ( !dot )
+ return (FT_UInt32)ft_get_adobe_glyph_index( glyph_name, p );
+ else
+ return (FT_UInt32)( ft_get_adobe_glyph_index( glyph_name, dot ) |
+ VARIANT_BIT );
+ }
+ }
+ #ifdef __cplusplus
+}
+#endif
+
+#if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_)
+static int xyq_search_node(char* glyph_name, int name_offset, int table_offset, FT_UInt32 unicode)
+{
+ int i, count;
+
+ // copy letters
+ while (1) {
+ glyph_name[name_offset] = ft_adobe_glyph_list[table_offset] & 0x7f;
+ name_offset ++;
+ table_offset ++;
+ if (!(ft_adobe_glyph_list[table_offset-1] & 0x80)) break;
+ }
+ glyph_name[name_offset] = 0;
+
+ // get child count
+ count = ft_adobe_glyph_list[table_offset] & 0x7f;
+
+ // check if we have value for this node
+ if (ft_adobe_glyph_list[table_offset] & 0x80) {
+ unsigned short thiscode = ft_adobe_glyph_list[table_offset+1] * 256 + ft_adobe_glyph_list[table_offset+2];
+ if (thiscode == unicode) // found it!
+ return 1;
+ table_offset += 3;
+ } else
+ table_offset ++;
+
+ // now search in sub-nodes
+ if (count == 0) return 0;
+ for (i = 0; i < count; i ++) {
+ int child_offset = ft_adobe_glyph_list[table_offset+i*2] * 256 + ft_adobe_glyph_list[table_offset+i*2+1];
+ if (xyq_search_node(glyph_name, name_offset, child_offset, unicode))
+ // found in child
+ return 1;
+ }
+ return 0;
+}
+
+// XYQ: function for searching Unicode in the glyph list
+void FXFT_adobe_name_from_unicode(char* glyph_name, FT_UInt32 unicode)
+{
+ int i, count;
+
+ // start from top level node
+ count = ft_adobe_glyph_list[1];
+ for (i = 0; i < count; i ++) {
+ int child_offset = ft_adobe_glyph_list[i*2+2] * 256 + ft_adobe_glyph_list[i*2+3];
+ if (xyq_search_node(glyph_name, 0, child_offset, unicode))
+ return;
+ }
+
+ // failed, clear the buffer
+ glyph_name[0] = 0;
+}
+#endif
+
+ /* ft_qsort callback to sort the unicode map */
+ FT_CALLBACK_DEF( int )
+ compare_uni_maps( const void* a,
+ const void* b )
+ {
+ PS_UniMap* map1 = (PS_UniMap*)a;
+ PS_UniMap* map2 = (PS_UniMap*)b;
+ FT_UInt32 unicode1 = BASE_GLYPH( map1->unicode );
+ FT_UInt32 unicode2 = BASE_GLYPH( map2->unicode );
+
+
+ /* sort base glyphs before glyph variants */
+ if ( unicode1 == unicode2 )
+ {
+ if ( map1->unicode > map2->unicode )
+ return 1;
+ else if ( map1->unicode < map2->unicode )
+ return -1;
+ else
+ return 0;
+ }
+ else
+ {
+ if ( unicode1 > unicode2 )
+ return 1;
+ else if ( unicode1 < unicode2 )
+ return -1;
+ else
+ return 0;
+ }
+ }
+
+
+ /* support for extra glyphs not handled (well) in AGL; */
+ /* we add extra mappings for them if necessary */
+
+#define EXTRA_GLYPH_LIST_SIZE 10
+
+ static const FT_UInt32 ft_extra_glyph_unicodes[EXTRA_GLYPH_LIST_SIZE] =
+ {
+ /* WGL 4 */
+ 0x0394,
+ 0x03A9,
+ 0x2215,
+ 0x00AD,
+ 0x02C9,
+ 0x03BC,
+ 0x2219,
+ 0x00A0,
+ /* Romanian */
+ 0x021A,
+ 0x021B
+ };
+
+ static const char ft_extra_glyph_names[] =
+ {
+ 'D','e','l','t','a',0,
+ 'O','m','e','g','a',0,
+ 'f','r','a','c','t','i','o','n',0,
+ 'h','y','p','h','e','n',0,
+ 'm','a','c','r','o','n',0,
+ 'm','u',0,
+ 'p','e','r','i','o','d','c','e','n','t','e','r','e','d',0,
+ 's','p','a','c','e',0,
+ 'T','c','o','m','m','a','a','c','c','e','n','t',0,
+ 't','c','o','m','m','a','a','c','c','e','n','t',0
+ };
+
+ static const FT_Int
+ ft_extra_glyph_name_offsets[EXTRA_GLYPH_LIST_SIZE] =
+ {
+ 0,
+ 6,
+ 12,
+ 21,
+ 28,
+ 35,
+ 38,
+ 53,
+ 59,
+ 72
+ };
+
+
+ static void
+ ps_check_extra_glyph_name( const char* gname,
+ FT_UInt glyph,
+ FT_UInt* extra_glyphs,
+ FT_UInt *states )
+ {
+ FT_UInt n;
+
+
+ for ( n = 0; n < EXTRA_GLYPH_LIST_SIZE; n++ )
+ {
+ if ( ft_strcmp( ft_extra_glyph_names +
+ ft_extra_glyph_name_offsets[n], gname ) == 0 )
+ {
+ if ( states[n] == 0 )
+ {
+ /* mark this extra glyph as a candidate for the cmap */
+ states[n] = 1;
+ extra_glyphs[n] = glyph;
+ }
+
+ return;
+ }
+ }
+ }
+
+
+ static void
+ ps_check_extra_glyph_unicode( FT_UInt32 uni_char,
+ FT_UInt *states )
+ {
+ FT_UInt n;
+
+
+ for ( n = 0; n < EXTRA_GLYPH_LIST_SIZE; n++ )
+ {
+ if ( uni_char == ft_extra_glyph_unicodes[n] )
+ {
+ /* disable this extra glyph from being added to the cmap */
+ states[n] = 2;
+
+ return;
+ }
+ }
+ }
+
+
+ /* Build a table that maps Unicode values to glyph indices. */
+ static FT_Error
+ ps_unicodes_init( FT_Memory memory,
+ PS_Unicodes table,
+ FT_UInt num_glyphs,
+ PS_GetGlyphNameFunc get_glyph_name,
+ PS_FreeGlyphNameFunc free_glyph_name,
+ FT_Pointer glyph_data )
+ {
+ FT_Error error;
+
+ FT_UInt extra_glyph_list_states[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+ FT_UInt extra_glyphs[EXTRA_GLYPH_LIST_SIZE];
+
+
+ /* we first allocate the table */
+ table->num_maps = 0;
+ table->maps = 0;
+
+ if ( !FT_NEW_ARRAY( table->maps, num_glyphs + EXTRA_GLYPH_LIST_SIZE ) )
+ {
+ FT_UInt n;
+ FT_UInt count;
+ PS_UniMap* map;
+ FT_UInt32 uni_char;
+
+
+ map = table->maps;
+
+ for ( n = 0; n < num_glyphs; n++ )
+ {
+ const char* gname = get_glyph_name( glyph_data, n );
+
+
+ if ( gname )
+ {
+ ps_check_extra_glyph_name( gname, n,
+ extra_glyphs, extra_glyph_list_states );
+ uni_char = FXFT_unicode_from_adobe_name( gname );
+
+ if ( BASE_GLYPH( uni_char ) != 0 )
+ {
+ ps_check_extra_glyph_unicode( uni_char,
+ extra_glyph_list_states );
+ map->unicode = uni_char;
+ map->glyph_index = n;
+ map++;
+ }
+
+ if ( free_glyph_name )
+ free_glyph_name( glyph_data, gname );
+ }
+ }
+
+ for ( n = 0; n < EXTRA_GLYPH_LIST_SIZE; n++ )
+ {
+ if ( extra_glyph_list_states[n] == 1 )
+ {
+ /* This glyph name has an additional representation. */
+ /* Add it to the cmap. */
+
+ map->unicode = ft_extra_glyph_unicodes[n];
+ map->glyph_index = extra_glyphs[n];
+ map++;
+ }
+ }
+
+ /* now compress the table a bit */
+ count = (FT_UInt)( map - table->maps );
+
+ if ( count == 0 )
+ {
+ /* No unicode chars here! */
+ FT_FREE( table->maps );
+ if ( !error )
+ error = FT_THROW( No_Unicode_Glyph_Name );
+ }
+ else
+ {
+ /* Reallocate if the number of used entries is much smaller. */
+ if ( count < num_glyphs / 2 )
+ {
+ (void)FT_RENEW_ARRAY( table->maps, num_glyphs, count );
+ error = FT_Err_Ok;
+ }
+
+ /* Sort the table in increasing order of unicode values, */
+ /* taking care of glyph variants. */
+ ft_qsort( table->maps, count, sizeof ( PS_UniMap ),
+ compare_uni_maps );
+ }
+
+ table->num_maps = count;
+ }
+
+ return error;
+ }
+
+
+ static FT_UInt
+ ps_unicodes_char_index( PS_Unicodes table,
+ FT_UInt32 unicode )
+ {
+ PS_UniMap *min, *max, *mid, *result = NULL;
+
+
+ /* Perform a binary search on the table. */
+
+ min = table->maps;
+ max = min + table->num_maps - 1;
+
+ while ( min <= max )
+ {
+ FT_UInt32 base_glyph;
+
+
+ mid = min + ( ( max - min ) >> 1 );
+
+ if ( mid->unicode == unicode )
+ {
+ result = mid;
+ break;
+ }
+
+ base_glyph = BASE_GLYPH( mid->unicode );
+
+ if ( base_glyph == unicode )
+ result = mid; /* remember match but continue search for base glyph */
+
+ if ( min == max )
+ break;
+
+ if ( base_glyph < unicode )
+ min = mid + 1;
+ else
+ max = mid - 1;
+ }
+
+ if ( result )
+ return result->glyph_index;
+ else
+ return 0;
+ }
+
+
+ static FT_UInt32
+ ps_unicodes_char_next( PS_Unicodes table,
+ FT_UInt32 *unicode )
+ {
+ FT_UInt result = 0;
+ FT_UInt32 char_code = *unicode + 1;
+
+
+ {
+ FT_UInt min = 0;
+ FT_UInt max = table->num_maps;
+ FT_UInt mid;
+ PS_UniMap* map;
+ FT_UInt32 base_glyph;
+
+
+ while ( min < max )
+ {
+ mid = min + ( ( max - min ) >> 1 );
+ map = table->maps + mid;
+
+ if ( map->unicode == char_code )
+ {
+ result = map->glyph_index;
+ goto Exit;
+ }
+
+ base_glyph = BASE_GLYPH( map->unicode );
+
+ if ( base_glyph == char_code )
+ result = map->glyph_index;
+
+ if ( base_glyph < char_code )
+ min = mid + 1;
+ else
+ max = mid;
+ }
+
+ if ( result )
+ goto Exit; /* we have a variant glyph */
+
+ /* we didn't find it; check whether we have a map just above it */
+ char_code = 0;
+
+ if ( min < table->num_maps )
+ {
+ map = table->maps + min;
+ result = map->glyph_index;
+ char_code = BASE_GLYPH( map->unicode );
+ }
+ }
+
+ Exit:
+ *unicode = char_code;
+ return result;
+ }
+
+
+#endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */
+
+
+ static const char*
+ ps_get_macintosh_name( FT_UInt name_index )
+ {
+ if ( name_index >= FT_NUM_MAC_NAMES )
+ name_index = 0;
+
+ return ft_standard_glyph_names + ft_mac_names[name_index];
+ }
+
+
+ static const char*
+ ps_get_standard_strings( FT_UInt sid )
+ {
+ if ( sid >= FT_NUM_SID_NAMES )
+ return 0;
+
+ return ft_standard_glyph_names + ft_sid_names[sid];
+ }
+
+
+#ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST
+
+ FT_DEFINE_SERVICE_PSCMAPSREC(
+ pscmaps_interface,
+ (PS_Unicode_ValueFunc) FXFT_unicode_from_adobe_name,
+ (PS_Unicodes_InitFunc) ps_unicodes_init,
+ (PS_Unicodes_CharIndexFunc)ps_unicodes_char_index,
+ (PS_Unicodes_CharNextFunc) ps_unicodes_char_next,
+
+ (PS_Macintosh_NameFunc) ps_get_macintosh_name,
+ (PS_Adobe_Std_StringsFunc) ps_get_standard_strings,
+
+ t1_standard_encoding,
+ t1_expert_encoding )
+
+#else
+
+ FT_DEFINE_SERVICE_PSCMAPSREC(
+ pscmaps_interface,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+
+ (PS_Macintosh_NameFunc) ps_get_macintosh_name,
+ (PS_Adobe_Std_StringsFunc) ps_get_standard_strings,
+
+ t1_standard_encoding,
+ t1_expert_encoding )
+
+#endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */
+
+
+ FT_DEFINE_SERVICEDESCREC1(
+ pscmaps_services,
+ FT_SERVICE_ID_POSTSCRIPT_CMAPS, &PSCMAPS_INTERFACE_GET )
+
+
+ static FT_Pointer
+ psnames_get_service( FT_Module module,
+ const char* service_id )
+ {
+ /* PSCMAPS_SERVICES_GET derefers `library' in PIC mode */
+#ifdef FT_CONFIG_OPTION_PIC
+ FT_Library library;
+
+
+ if ( !module )
+ return NULL;
+ library = module->library;
+ if ( !library )
+ return NULL;
+#else
+ FT_UNUSED( module );
+#endif
+
+ return ft_service_list_lookup( PSCMAPS_SERVICES_GET, service_id );
+ }
+
+#endif /* FT_CONFIG_OPTION_POSTSCRIPT_NAMES */
+
+
+#ifndef FT_CONFIG_OPTION_POSTSCRIPT_NAMES
+#define PUT_PS_NAMES_SERVICE( a ) NULL
+#else
+#define PUT_PS_NAMES_SERVICE( a ) a
+#endif
+
+ FT_DEFINE_MODULE(
+ psnames_module_class,
+
+ 0, /* this is not a font driver, nor a renderer */
+ sizeof ( FT_ModuleRec ),
+
+ "psnames", /* driver name */
+ 0x10000L, /* driver version */
+ 0x20000L, /* driver requires FreeType 2 or above */
+
+ PUT_PS_NAMES_SERVICE(
+ (void*)&PSCMAPS_INTERFACE_GET ), /* module specific interface */
+ (FT_Module_Constructor)NULL,
+ (FT_Module_Destructor) NULL,
+ (FT_Module_Requester) PUT_PS_NAMES_SERVICE( psnames_get_service ) )
+
+
+/* END */
+#endif
+
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/module.mk b/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/module.mk
new file mode 100644
index 0000000000..a6e908257c
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/module.mk
@@ -0,0 +1,23 @@
+#
+# FreeType 2 PSnames module definition
+#
+
+
+# Copyright 1996-2000, 2006 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT. By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+
+FTMODULE_H_COMMANDS += PSNAMES_MODULE
+
+define PSNAMES_MODULE
+$(OPEN_DRIVER) FT_Module_Class, psnames_module_class $(CLOSE_DRIVER)
+$(ECHO_DRIVER)psnames $(ECHO_DRIVER_DESC)Postscript & Unicode Glyph name handling$(ECHO_DRIVER_DONE)
+endef
+
+# EOF
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/psmodule.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/psmodule.h
new file mode 100644
index 0000000000..1f37a8b8a1
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/psmodule.h
@@ -0,0 +1,38 @@
+/***************************************************************************/
+/* */
+/* psmodule.h */
+/* */
+/* High-level PSNames module interface (specification). */
+/* */
+/* Copyright 1996-2001 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __PSMODULE_H__
+#define __PSMODULE_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/ftmodapi.h"
+
+
+FT_BEGIN_HEADER
+
+
+ FT_DECLARE_MODULE( psnames_module_class )
+
+
+FT_END_HEADER
+
+#endif /* __PSMODULE_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/psnamerr.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/psnamerr.h
new file mode 100644
index 0000000000..9cb6c7ebaf
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/psnamerr.h
@@ -0,0 +1,42 @@
+/***************************************************************************/
+/* */
+/* psnamerr.h */
+/* */
+/* PS names module error codes (specification only). */
+/* */
+/* Copyright 2001, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* This file is used to define the PS names module error enumeration */
+ /* constants. */
+ /* */
+ /*************************************************************************/
+
+#ifndef __PSNAMERR_H__
+#define __PSNAMERR_H__
+
+#include "../../include/freetype/ftmoderr.h"
+
+#undef __FTERRORS_H__
+
+#undef FT_ERR_PREFIX
+#define FT_ERR_PREFIX PSnames_Err_
+#define FT_ERR_BASE FT_Mod_Err_PSnames
+
+#include "../../include/freetype/fterrors.h"
+
+#endif /* __PSNAMERR_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/psnames.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/psnames.c
new file mode 100644
index 0000000000..efc9594e70
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/psnames.c
@@ -0,0 +1,26 @@
+/***************************************************************************/
+/* */
+/* psnames.c */
+/* */
+/* FreeType PSNames module component (body only). */
+/* */
+/* Copyright 1996-2001 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#define FT_MAKE_OPTION_SINGLE_OBJECT
+
+#include "../../include/ft2build.h"
+#include "pspic.c"
+#include "psmodule.c"
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/pspic.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/pspic.c
new file mode 100644
index 0000000000..70dfcd9def
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/pspic.c
@@ -0,0 +1,97 @@
+/***************************************************************************/
+/* */
+/* pspic.c */
+/* */
+/* The FreeType position independent code services for psnames module. */
+/* */
+/* Copyright 2009, 2010, 2012, 2013 by */
+/* Oran Agra and Mickey Gabel. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/freetype.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "pspic.h"
+#include "psnamerr.h"
+
+
+#ifdef FT_CONFIG_OPTION_PIC
+
+ /* forward declaration of PIC init functions from psmodule.c */
+ FT_Error
+ FT_Create_Class_pscmaps_services( FT_Library library,
+ FT_ServiceDescRec** output_class );
+ void
+ FT_Destroy_Class_pscmaps_services( FT_Library library,
+ FT_ServiceDescRec* clazz );
+
+ void
+ FT_Init_Class_pscmaps_interface( FT_Library library,
+ FT_Service_PsCMapsRec* clazz );
+
+
+ void
+ psnames_module_class_pic_free( FT_Library library )
+ {
+ FT_PIC_Container* pic_container = &library->pic_container;
+ FT_Memory memory = library->memory;
+
+
+ if ( pic_container->psnames )
+ {
+ PSModulePIC* container = (PSModulePIC*)pic_container->psnames;
+
+
+ if ( container->pscmaps_services )
+ FT_Destroy_Class_pscmaps_services( library,
+ container->pscmaps_services );
+ container->pscmaps_services = NULL;
+ FT_FREE( container );
+ pic_container->psnames = NULL;
+ }
+ }
+
+
+ FT_Error
+ psnames_module_class_pic_init( FT_Library library )
+ {
+ FT_PIC_Container* pic_container = &library->pic_container;
+ FT_Error error = FT_Err_Ok;
+ PSModulePIC* container = NULL;
+ FT_Memory memory = library->memory;
+
+
+ /* allocate pointer, clear and set global container pointer */
+ if ( FT_ALLOC( container, sizeof ( *container ) ) )
+ return error;
+ FT_MEM_SET( container, 0, sizeof ( *container ) );
+ pic_container->psnames = container;
+
+ /* initialize pointer table - */
+ /* this is how the module usually expects this data */
+ error = FT_Create_Class_pscmaps_services(
+ library, &container->pscmaps_services );
+ if ( error )
+ goto Exit;
+ FT_Init_Class_pscmaps_interface( library,
+ &container->pscmaps_interface );
+
+ Exit:
+ if ( error )
+ psnames_module_class_pic_free( library );
+ return error;
+ }
+
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/pspic.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/pspic.h
new file mode 100644
index 0000000000..f055e33511
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/pspic.h
@@ -0,0 +1,66 @@
+/***************************************************************************/
+/* */
+/* pspic.h */
+/* */
+/* The FreeType position independent code services for psnames module. */
+/* */
+/* Copyright 2009, 2012 by */
+/* Oran Agra and Mickey Gabel. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __PSPIC_H__
+#define __PSPIC_H__
+
+
+FT_BEGIN_HEADER
+
+#include "../../include/freetype/internal/ftpic.h"
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define PSCMAPS_SERVICES_GET pscmaps_services
+#define PSCMAPS_INTERFACE_GET pscmaps_interface
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#include "../../include/freetype/internal/services/svpscmap.h"
+
+ typedef struct PSModulePIC_
+ {
+ FT_ServiceDescRec* pscmaps_services;
+ FT_Service_PsCMapsRec pscmaps_interface;
+
+ } PSModulePIC;
+
+
+#define GET_PIC( lib ) \
+ ( (PSModulePIC*)((lib)->pic_container.psnames) )
+#define PSCMAPS_SERVICES_GET ( GET_PIC( library )->pscmaps_services )
+#define PSCMAPS_INTERFACE_GET ( GET_PIC( library )->pscmaps_interface )
+
+
+ /* see pspic.c for the implementation */
+ void
+ psnames_module_class_pic_free( FT_Library library );
+
+ FT_Error
+ psnames_module_class_pic_init( FT_Library library );
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __PSPIC_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/pstables.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/pstables.h
new file mode 100644
index 0000000000..66f039ec41
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/pstables.h
@@ -0,0 +1,4184 @@
+/***************************************************************************/
+/* */
+/* pstables.h */
+/* */
+/* PostScript glyph names. */
+/* */
+/* Copyright 2005, 2008, 2011 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /* This file has been generated automatically -- do not edit! */
+
+#ifdef _FX_MANAGED_CODE_
+__declspec(process)
+#endif
+ static const char ft_standard_glyph_names[3696] =
+ {
+ '.','n','u','l','l', 0,
+ 'n','o','n','m','a','r','k','i','n','g','r','e','t','u','r','n', 0,
+ 'n','o','t','e','q','u','a','l', 0,
+ 'i','n','f','i','n','i','t','y', 0,
+ 'l','e','s','s','e','q','u','a','l', 0,
+ 'g','r','e','a','t','e','r','e','q','u','a','l', 0,
+ 'p','a','r','t','i','a','l','d','i','f','f', 0,
+ 's','u','m','m','a','t','i','o','n', 0,
+ 'p','r','o','d','u','c','t', 0,
+ 'p','i', 0,
+ 'i','n','t','e','g','r','a','l', 0,
+ 'O','m','e','g','a', 0,
+ 'r','a','d','i','c','a','l', 0,
+ 'a','p','p','r','o','x','e','q','u','a','l', 0,
+ 'D','e','l','t','a', 0,
+ 'n','o','n','b','r','e','a','k','i','n','g','s','p','a','c','e', 0,
+ 'l','o','z','e','n','g','e', 0,
+ 'a','p','p','l','e', 0,
+ 'f','r','a','n','c', 0,
+ 'G','b','r','e','v','e', 0,
+ 'g','b','r','e','v','e', 0,
+ 'I','d','o','t','a','c','c','e','n','t', 0,
+ 'S','c','e','d','i','l','l','a', 0,
+ 's','c','e','d','i','l','l','a', 0,
+ 'C','a','c','u','t','e', 0,
+ 'c','a','c','u','t','e', 0,
+ 'C','c','a','r','o','n', 0,
+ 'c','c','a','r','o','n', 0,
+ 'd','c','r','o','a','t', 0,
+ '.','n','o','t','d','e','f', 0,
+ 's','p','a','c','e', 0,
+ 'e','x','c','l','a','m', 0,
+ 'q','u','o','t','e','d','b','l', 0,
+ 'n','u','m','b','e','r','s','i','g','n', 0,
+ 'd','o','l','l','a','r', 0,
+ 'p','e','r','c','e','n','t', 0,
+ 'a','m','p','e','r','s','a','n','d', 0,
+ 'q','u','o','t','e','r','i','g','h','t', 0,
+ 'p','a','r','e','n','l','e','f','t', 0,
+ 'p','a','r','e','n','r','i','g','h','t', 0,
+ 'a','s','t','e','r','i','s','k', 0,
+ 'p','l','u','s', 0,
+ 'c','o','m','m','a', 0,
+ 'h','y','p','h','e','n', 0,
+ 'p','e','r','i','o','d', 0,
+ 's','l','a','s','h', 0,
+ 'z','e','r','o', 0,
+ 'o','n','e', 0,
+ 't','w','o', 0,
+ 't','h','r','e','e', 0,
+ 'f','o','u','r', 0,
+ 'f','i','v','e', 0,
+ 's','i','x', 0,
+ 's','e','v','e','n', 0,
+ 'e','i','g','h','t', 0,
+ 'n','i','n','e', 0,
+ 'c','o','l','o','n', 0,
+ 's','e','m','i','c','o','l','o','n', 0,
+ 'l','e','s','s', 0,
+ 'e','q','u','a','l', 0,
+ 'g','r','e','a','t','e','r', 0,
+ 'q','u','e','s','t','i','o','n', 0,
+ 'a','t', 0,
+ 'A', 0,
+ 'B', 0,
+ 'C', 0,
+ 'D', 0,
+ 'E', 0,
+ 'F', 0,
+ 'G', 0,
+ 'H', 0,
+ 'I', 0,
+ 'J', 0,
+ 'K', 0,
+ 'L', 0,
+ 'M', 0,
+ 'N', 0,
+ 'O', 0,
+ 'P', 0,
+ 'Q', 0,
+ 'R', 0,
+ 'S', 0,
+ 'T', 0,
+ 'U', 0,
+ 'V', 0,
+ 'W', 0,
+ 'X', 0,
+ 'Y', 0,
+ 'Z', 0,
+ 'b','r','a','c','k','e','t','l','e','f','t', 0,
+ 'b','a','c','k','s','l','a','s','h', 0,
+ 'b','r','a','c','k','e','t','r','i','g','h','t', 0,
+ 'a','s','c','i','i','c','i','r','c','u','m', 0,
+ 'u','n','d','e','r','s','c','o','r','e', 0,
+ 'q','u','o','t','e','l','e','f','t', 0,
+ 'a', 0,
+ 'b', 0,
+ 'c', 0,
+ 'd', 0,
+ 'e', 0,
+ 'f', 0,
+ 'g', 0,
+ 'h', 0,
+ 'i', 0,
+ 'j', 0,
+ 'k', 0,
+ 'l', 0,
+ 'm', 0,
+ 'n', 0,
+ 'o', 0,
+ 'p', 0,
+ 'q', 0,
+ 'r', 0,
+ 's', 0,
+ 't', 0,
+ 'u', 0,
+ 'v', 0,
+ 'w', 0,
+ 'x', 0,
+ 'y', 0,
+ 'z', 0,
+ 'b','r','a','c','e','l','e','f','t', 0,
+ 'b','a','r', 0,
+ 'b','r','a','c','e','r','i','g','h','t', 0,
+ 'a','s','c','i','i','t','i','l','d','e', 0,
+ 'e','x','c','l','a','m','d','o','w','n', 0,
+ 'c','e','n','t', 0,
+ 's','t','e','r','l','i','n','g', 0,
+ 'f','r','a','c','t','i','o','n', 0,
+ 'y','e','n', 0,
+ 'f','l','o','r','i','n', 0,
+ 's','e','c','t','i','o','n', 0,
+ 'c','u','r','r','e','n','c','y', 0,
+ 'q','u','o','t','e','s','i','n','g','l','e', 0,
+ 'q','u','o','t','e','d','b','l','l','e','f','t', 0,
+ 'g','u','i','l','l','e','m','o','t','l','e','f','t', 0,
+ 'g','u','i','l','s','i','n','g','l','l','e','f','t', 0,
+ 'g','u','i','l','s','i','n','g','l','r','i','g','h','t', 0,
+ 'f','i', 0,
+ 'f','l', 0,
+ 'e','n','d','a','s','h', 0,
+ 'd','a','g','g','e','r', 0,
+ 'd','a','g','g','e','r','d','b','l', 0,
+ 'p','e','r','i','o','d','c','e','n','t','e','r','e','d', 0,
+ 'p','a','r','a','g','r','a','p','h', 0,
+ 'b','u','l','l','e','t', 0,
+ 'q','u','o','t','e','s','i','n','g','l','b','a','s','e', 0,
+ 'q','u','o','t','e','d','b','l','b','a','s','e', 0,
+ 'q','u','o','t','e','d','b','l','r','i','g','h','t', 0,
+ 'g','u','i','l','l','e','m','o','t','r','i','g','h','t', 0,
+ 'e','l','l','i','p','s','i','s', 0,
+ 'p','e','r','t','h','o','u','s','a','n','d', 0,
+ 'q','u','e','s','t','i','o','n','d','o','w','n', 0,
+ 'g','r','a','v','e', 0,
+ 'a','c','u','t','e', 0,
+ 'c','i','r','c','u','m','f','l','e','x', 0,
+ 't','i','l','d','e', 0,
+ 'm','a','c','r','o','n', 0,
+ 'b','r','e','v','e', 0,
+ 'd','o','t','a','c','c','e','n','t', 0,
+ 'd','i','e','r','e','s','i','s', 0,
+ 'r','i','n','g', 0,
+ 'c','e','d','i','l','l','a', 0,
+ 'h','u','n','g','a','r','u','m','l','a','u','t', 0,
+ 'o','g','o','n','e','k', 0,
+ 'c','a','r','o','n', 0,
+ 'e','m','d','a','s','h', 0,
+ 'A','E', 0,
+ 'o','r','d','f','e','m','i','n','i','n','e', 0,
+ 'L','s','l','a','s','h', 0,
+ 'O','s','l','a','s','h', 0,
+ 'O','E', 0,
+ 'o','r','d','m','a','s','c','u','l','i','n','e', 0,
+ 'a','e', 0,
+ 'd','o','t','l','e','s','s','i', 0,
+ 'l','s','l','a','s','h', 0,
+ 'o','s','l','a','s','h', 0,
+ 'o','e', 0,
+ 'g','e','r','m','a','n','d','b','l','s', 0,
+ 'o','n','e','s','u','p','e','r','i','o','r', 0,
+ 'l','o','g','i','c','a','l','n','o','t', 0,
+ 'm','u', 0,
+ 't','r','a','d','e','m','a','r','k', 0,
+ 'E','t','h', 0,
+ 'o','n','e','h','a','l','f', 0,
+ 'p','l','u','s','m','i','n','u','s', 0,
+ 'T','h','o','r','n', 0,
+ 'o','n','e','q','u','a','r','t','e','r', 0,
+ 'd','i','v','i','d','e', 0,
+ 'b','r','o','k','e','n','b','a','r', 0,
+ 'd','e','g','r','e','e', 0,
+ 't','h','o','r','n', 0,
+ 't','h','r','e','e','q','u','a','r','t','e','r','s', 0,
+ 't','w','o','s','u','p','e','r','i','o','r', 0,
+ 'r','e','g','i','s','t','e','r','e','d', 0,
+ 'm','i','n','u','s', 0,
+ 'e','t','h', 0,
+ 'm','u','l','t','i','p','l','y', 0,
+ 't','h','r','e','e','s','u','p','e','r','i','o','r', 0,
+ 'c','o','p','y','r','i','g','h','t', 0,
+ 'A','a','c','u','t','e', 0,
+ 'A','c','i','r','c','u','m','f','l','e','x', 0,
+ 'A','d','i','e','r','e','s','i','s', 0,
+ 'A','g','r','a','v','e', 0,
+ 'A','r','i','n','g', 0,
+ 'A','t','i','l','d','e', 0,
+ 'C','c','e','d','i','l','l','a', 0,
+ 'E','a','c','u','t','e', 0,
+ 'E','c','i','r','c','u','m','f','l','e','x', 0,
+ 'E','d','i','e','r','e','s','i','s', 0,
+ 'E','g','r','a','v','e', 0,
+ 'I','a','c','u','t','e', 0,
+ 'I','c','i','r','c','u','m','f','l','e','x', 0,
+ 'I','d','i','e','r','e','s','i','s', 0,
+ 'I','g','r','a','v','e', 0,
+ 'N','t','i','l','d','e', 0,
+ 'O','a','c','u','t','e', 0,
+ 'O','c','i','r','c','u','m','f','l','e','x', 0,
+ 'O','d','i','e','r','e','s','i','s', 0,
+ 'O','g','r','a','v','e', 0,
+ 'O','t','i','l','d','e', 0,
+ 'S','c','a','r','o','n', 0,
+ 'U','a','c','u','t','e', 0,
+ 'U','c','i','r','c','u','m','f','l','e','x', 0,
+ 'U','d','i','e','r','e','s','i','s', 0,
+ 'U','g','r','a','v','e', 0,
+ 'Y','a','c','u','t','e', 0,
+ 'Y','d','i','e','r','e','s','i','s', 0,
+ 'Z','c','a','r','o','n', 0,
+ 'a','a','c','u','t','e', 0,
+ 'a','c','i','r','c','u','m','f','l','e','x', 0,
+ 'a','d','i','e','r','e','s','i','s', 0,
+ 'a','g','r','a','v','e', 0,
+ 'a','r','i','n','g', 0,
+ 'a','t','i','l','d','e', 0,
+ 'c','c','e','d','i','l','l','a', 0,
+ 'e','a','c','u','t','e', 0,
+ 'e','c','i','r','c','u','m','f','l','e','x', 0,
+ 'e','d','i','e','r','e','s','i','s', 0,
+ 'e','g','r','a','v','e', 0,
+ 'i','a','c','u','t','e', 0,
+ 'i','c','i','r','c','u','m','f','l','e','x', 0,
+ 'i','d','i','e','r','e','s','i','s', 0,
+ 'i','g','r','a','v','e', 0,
+ 'n','t','i','l','d','e', 0,
+ 'o','a','c','u','t','e', 0,
+ 'o','c','i','r','c','u','m','f','l','e','x', 0,
+ 'o','d','i','e','r','e','s','i','s', 0,
+ 'o','g','r','a','v','e', 0,
+ 'o','t','i','l','d','e', 0,
+ 's','c','a','r','o','n', 0,
+ 'u','a','c','u','t','e', 0,
+ 'u','c','i','r','c','u','m','f','l','e','x', 0,
+ 'u','d','i','e','r','e','s','i','s', 0,
+ 'u','g','r','a','v','e', 0,
+ 'y','a','c','u','t','e', 0,
+ 'y','d','i','e','r','e','s','i','s', 0,
+ 'z','c','a','r','o','n', 0,
+ 'e','x','c','l','a','m','s','m','a','l','l', 0,
+ 'H','u','n','g','a','r','u','m','l','a','u','t','s','m','a','l','l', 0,
+ 'd','o','l','l','a','r','o','l','d','s','t','y','l','e', 0,
+ 'd','o','l','l','a','r','s','u','p','e','r','i','o','r', 0,
+ 'a','m','p','e','r','s','a','n','d','s','m','a','l','l', 0,
+ 'A','c','u','t','e','s','m','a','l','l', 0,
+ 'p','a','r','e','n','l','e','f','t','s','u','p','e','r','i','o','r', 0,
+ 'p','a','r','e','n','r','i','g','h','t','s','u','p','e','r','i','o','r', 0,
+ 't','w','o','d','o','t','e','n','l','e','a','d','e','r', 0,
+ 'o','n','e','d','o','t','e','n','l','e','a','d','e','r', 0,
+ 'z','e','r','o','o','l','d','s','t','y','l','e', 0,
+ 'o','n','e','o','l','d','s','t','y','l','e', 0,
+ 't','w','o','o','l','d','s','t','y','l','e', 0,
+ 't','h','r','e','e','o','l','d','s','t','y','l','e', 0,
+ 'f','o','u','r','o','l','d','s','t','y','l','e', 0,
+ 'f','i','v','e','o','l','d','s','t','y','l','e', 0,
+ 's','i','x','o','l','d','s','t','y','l','e', 0,
+ 's','e','v','e','n','o','l','d','s','t','y','l','e', 0,
+ 'e','i','g','h','t','o','l','d','s','t','y','l','e', 0,
+ 'n','i','n','e','o','l','d','s','t','y','l','e', 0,
+ 'c','o','m','m','a','s','u','p','e','r','i','o','r', 0,
+ 't','h','r','e','e','q','u','a','r','t','e','r','s','e','m','d','a','s','h', 0,
+ 'p','e','r','i','o','d','s','u','p','e','r','i','o','r', 0,
+ 'q','u','e','s','t','i','o','n','s','m','a','l','l', 0,
+ 'a','s','u','p','e','r','i','o','r', 0,
+ 'b','s','u','p','e','r','i','o','r', 0,
+ 'c','e','n','t','s','u','p','e','r','i','o','r', 0,
+ 'd','s','u','p','e','r','i','o','r', 0,
+ 'e','s','u','p','e','r','i','o','r', 0,
+ 'i','s','u','p','e','r','i','o','r', 0,
+ 'l','s','u','p','e','r','i','o','r', 0,
+ 'm','s','u','p','e','r','i','o','r', 0,
+ 'n','s','u','p','e','r','i','o','r', 0,
+ 'o','s','u','p','e','r','i','o','r', 0,
+ 'r','s','u','p','e','r','i','o','r', 0,
+ 's','s','u','p','e','r','i','o','r', 0,
+ 't','s','u','p','e','r','i','o','r', 0,
+ 'f','f', 0,
+ 'f','f','i', 0,
+ 'f','f','l', 0,
+ 'p','a','r','e','n','l','e','f','t','i','n','f','e','r','i','o','r', 0,
+ 'p','a','r','e','n','r','i','g','h','t','i','n','f','e','r','i','o','r', 0,
+ 'C','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0,
+ 'h','y','p','h','e','n','s','u','p','e','r','i','o','r', 0,
+ 'G','r','a','v','e','s','m','a','l','l', 0,
+ 'A','s','m','a','l','l', 0,
+ 'B','s','m','a','l','l', 0,
+ 'C','s','m','a','l','l', 0,
+ 'D','s','m','a','l','l', 0,
+ 'E','s','m','a','l','l', 0,
+ 'F','s','m','a','l','l', 0,
+ 'G','s','m','a','l','l', 0,
+ 'H','s','m','a','l','l', 0,
+ 'I','s','m','a','l','l', 0,
+ 'J','s','m','a','l','l', 0,
+ 'K','s','m','a','l','l', 0,
+ 'L','s','m','a','l','l', 0,
+ 'M','s','m','a','l','l', 0,
+ 'N','s','m','a','l','l', 0,
+ 'O','s','m','a','l','l', 0,
+ 'P','s','m','a','l','l', 0,
+ 'Q','s','m','a','l','l', 0,
+ 'R','s','m','a','l','l', 0,
+ 'S','s','m','a','l','l', 0,
+ 'T','s','m','a','l','l', 0,
+ 'U','s','m','a','l','l', 0,
+ 'V','s','m','a','l','l', 0,
+ 'W','s','m','a','l','l', 0,
+ 'X','s','m','a','l','l', 0,
+ 'Y','s','m','a','l','l', 0,
+ 'Z','s','m','a','l','l', 0,
+ 'c','o','l','o','n','m','o','n','e','t','a','r','y', 0,
+ 'o','n','e','f','i','t','t','e','d', 0,
+ 'r','u','p','i','a','h', 0,
+ 'T','i','l','d','e','s','m','a','l','l', 0,
+ 'e','x','c','l','a','m','d','o','w','n','s','m','a','l','l', 0,
+ 'c','e','n','t','o','l','d','s','t','y','l','e', 0,
+ 'L','s','l','a','s','h','s','m','a','l','l', 0,
+ 'S','c','a','r','o','n','s','m','a','l','l', 0,
+ 'Z','c','a','r','o','n','s','m','a','l','l', 0,
+ 'D','i','e','r','e','s','i','s','s','m','a','l','l', 0,
+ 'B','r','e','v','e','s','m','a','l','l', 0,
+ 'C','a','r','o','n','s','m','a','l','l', 0,
+ 'D','o','t','a','c','c','e','n','t','s','m','a','l','l', 0,
+ 'M','a','c','r','o','n','s','m','a','l','l', 0,
+ 'f','i','g','u','r','e','d','a','s','h', 0,
+ 'h','y','p','h','e','n','i','n','f','e','r','i','o','r', 0,
+ 'O','g','o','n','e','k','s','m','a','l','l', 0,
+ 'R','i','n','g','s','m','a','l','l', 0,
+ 'C','e','d','i','l','l','a','s','m','a','l','l', 0,
+ 'q','u','e','s','t','i','o','n','d','o','w','n','s','m','a','l','l', 0,
+ 'o','n','e','e','i','g','h','t','h', 0,
+ 't','h','r','e','e','e','i','g','h','t','h','s', 0,
+ 'f','i','v','e','e','i','g','h','t','h','s', 0,
+ 's','e','v','e','n','e','i','g','h','t','h','s', 0,
+ 'o','n','e','t','h','i','r','d', 0,
+ 't','w','o','t','h','i','r','d','s', 0,
+ 'z','e','r','o','s','u','p','e','r','i','o','r', 0,
+ 'f','o','u','r','s','u','p','e','r','i','o','r', 0,
+ 'f','i','v','e','s','u','p','e','r','i','o','r', 0,
+ 's','i','x','s','u','p','e','r','i','o','r', 0,
+ 's','e','v','e','n','s','u','p','e','r','i','o','r', 0,
+ 'e','i','g','h','t','s','u','p','e','r','i','o','r', 0,
+ 'n','i','n','e','s','u','p','e','r','i','o','r', 0,
+ 'z','e','r','o','i','n','f','e','r','i','o','r', 0,
+ 'o','n','e','i','n','f','e','r','i','o','r', 0,
+ 't','w','o','i','n','f','e','r','i','o','r', 0,
+ 't','h','r','e','e','i','n','f','e','r','i','o','r', 0,
+ 'f','o','u','r','i','n','f','e','r','i','o','r', 0,
+ 'f','i','v','e','i','n','f','e','r','i','o','r', 0,
+ 's','i','x','i','n','f','e','r','i','o','r', 0,
+ 's','e','v','e','n','i','n','f','e','r','i','o','r', 0,
+ 'e','i','g','h','t','i','n','f','e','r','i','o','r', 0,
+ 'n','i','n','e','i','n','f','e','r','i','o','r', 0,
+ 'c','e','n','t','i','n','f','e','r','i','o','r', 0,
+ 'd','o','l','l','a','r','i','n','f','e','r','i','o','r', 0,
+ 'p','e','r','i','o','d','i','n','f','e','r','i','o','r', 0,
+ 'c','o','m','m','a','i','n','f','e','r','i','o','r', 0,
+ 'A','g','r','a','v','e','s','m','a','l','l', 0,
+ 'A','a','c','u','t','e','s','m','a','l','l', 0,
+ 'A','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0,
+ 'A','t','i','l','d','e','s','m','a','l','l', 0,
+ 'A','d','i','e','r','e','s','i','s','s','m','a','l','l', 0,
+ 'A','r','i','n','g','s','m','a','l','l', 0,
+ 'A','E','s','m','a','l','l', 0,
+ 'C','c','e','d','i','l','l','a','s','m','a','l','l', 0,
+ 'E','g','r','a','v','e','s','m','a','l','l', 0,
+ 'E','a','c','u','t','e','s','m','a','l','l', 0,
+ 'E','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0,
+ 'E','d','i','e','r','e','s','i','s','s','m','a','l','l', 0,
+ 'I','g','r','a','v','e','s','m','a','l','l', 0,
+ 'I','a','c','u','t','e','s','m','a','l','l', 0,
+ 'I','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0,
+ 'I','d','i','e','r','e','s','i','s','s','m','a','l','l', 0,
+ 'E','t','h','s','m','a','l','l', 0,
+ 'N','t','i','l','d','e','s','m','a','l','l', 0,
+ 'O','g','r','a','v','e','s','m','a','l','l', 0,
+ 'O','a','c','u','t','e','s','m','a','l','l', 0,
+ 'O','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0,
+ 'O','t','i','l','d','e','s','m','a','l','l', 0,
+ 'O','d','i','e','r','e','s','i','s','s','m','a','l','l', 0,
+ 'O','E','s','m','a','l','l', 0,
+ 'O','s','l','a','s','h','s','m','a','l','l', 0,
+ 'U','g','r','a','v','e','s','m','a','l','l', 0,
+ 'U','a','c','u','t','e','s','m','a','l','l', 0,
+ 'U','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0,
+ 'U','d','i','e','r','e','s','i','s','s','m','a','l','l', 0,
+ 'Y','a','c','u','t','e','s','m','a','l','l', 0,
+ 'T','h','o','r','n','s','m','a','l','l', 0,
+ 'Y','d','i','e','r','e','s','i','s','s','m','a','l','l', 0,
+ '0','0','1','.','0','0','0', 0,
+ '0','0','1','.','0','0','1', 0,
+ '0','0','1','.','0','0','2', 0,
+ '0','0','1','.','0','0','3', 0,
+ 'B','l','a','c','k', 0,
+ 'B','o','l','d', 0,
+ 'B','o','o','k', 0,
+ 'L','i','g','h','t', 0,
+ 'M','e','d','i','u','m', 0,
+ 'R','e','g','u','l','a','r', 0,
+ 'R','o','m','a','n', 0,
+ 'S','e','m','i','b','o','l','d', 0,
+ };
+
+
+#define FT_NUM_MAC_NAMES 258
+
+ /* Values are offsets into the `ft_standard_glyph_names' table */
+#ifdef _FX_MANAGED_CODE_
+__declspec(process)
+#endif
+ static const short ft_mac_names[FT_NUM_MAC_NAMES] =
+ {
+ 253, 0, 6, 261, 267, 274, 283, 294, 301, 309, 758, 330, 340, 351,
+ 360, 365, 371, 378, 385, 391, 396, 400, 404, 410, 415, 420, 424, 430,
+ 436, 441, 447, 457, 462, 468, 476, 485, 488, 490, 492, 494, 496, 498,
+ 500, 502, 504, 506, 508, 510, 512, 514, 516, 518, 520, 522, 524, 526,
+ 528, 530, 532, 534, 536, 538, 540, 552, 562, 575, 587, 979, 608, 610,
+ 612, 614, 616, 618, 620, 622, 624, 626, 628, 630, 632, 634, 636, 638,
+ 640, 642, 644, 646, 648, 650, 652, 654, 656, 658, 660, 670, 674, 685,
+ 1375,1392,1405,1414,1486,1512,1562,1603,1632,1610,1622,1645,1639,1652,
+ 1661,1690,1668,1680,1697,1726,1704,1716,1733,1740,1769,1747,1759,1776,
+ 1790,1819,1797,1809, 839,1263, 707, 712, 741, 881, 871,1160,1302,1346,
+ 1197, 985,1031, 23,1086,1108, 32,1219, 41, 51, 730,1194, 64, 76,
+ 86, 94, 97,1089,1118, 106,1131,1150, 966, 696,1183, 112, 734, 120,
+ 132, 783, 930, 945, 138,1385,1398,1529,1115,1157, 832,1079, 770, 916,
+ 598, 319,1246, 155,1833,1586, 721, 749, 797, 811, 826, 829, 846, 856,
+ 888, 903, 954,1363,1421,1356,1433,1443,1450,1457,1469,1479,1493,1500,
+ 163,1522,1543,1550,1572,1134, 991,1002,1008,1015,1021,1040,1045,1053,
+ 1066,1073,1101,1143,1536,1783,1596,1843,1253,1207,1319,1579,1826,1229,
+ 1270,1313,1323,1171,1290,1332,1211,1235,1276, 169, 175, 182, 189, 200,
+ 209, 218, 225, 232, 239, 246
+ };
+
+
+#define FT_NUM_SID_NAMES 391
+
+ /* Values are offsets into the `ft_standard_glyph_names' table */
+#ifdef _FX_MANAGED_CODE_
+__declspec(process)
+#endif
+ static const short ft_sid_names[FT_NUM_SID_NAMES] =
+ {
+ 253, 261, 267, 274, 283, 294, 301, 309, 319, 330, 340, 351, 360, 365,
+ 371, 378, 385, 391, 396, 400, 404, 410, 415, 420, 424, 430, 436, 441,
+ 447, 457, 462, 468, 476, 485, 488, 490, 492, 494, 496, 498, 500, 502,
+ 504, 506, 508, 510, 512, 514, 516, 518, 520, 522, 524, 526, 528, 530,
+ 532, 534, 536, 538, 540, 552, 562, 575, 587, 598, 608, 610, 612, 614,
+ 616, 618, 620, 622, 624, 626, 628, 630, 632, 634, 636, 638, 640, 642,
+ 644, 646, 648, 650, 652, 654, 656, 658, 660, 670, 674, 685, 696, 707,
+ 712, 721, 730, 734, 741, 749, 758, 770, 783, 797, 811, 826, 829, 832,
+ 839, 846, 856, 871, 881, 888, 903, 916, 930, 945, 954, 966, 979, 985,
+ 991,1002,1008,1015,1021,1031,1040,1045,1053,1066,1073,1079,1086,1089,
+ 1101,1108,1115,1118,1131,1134,1143,1150,1157,1160,1171,1183,1194,1197,
+ 1207,1211,1219,1229,1235,1246,1253,1263,1270,1276,1290,1302,1313,1319,
+ 1323,1332,1346,1356,1363,1375,1385,1392,1398,1405,1414,1421,1433,1443,
+ 1450,1457,1469,1479,1486,1493,1500,1512,1522,1529,1536,1543,1550,1562,
+ 1572,1579,1586,1596,1603,1610,1622,1632,1639,1645,1652,1661,1668,1680,
+ 1690,1697,1704,1716,1726,1733,1740,1747,1759,1769,1776,1783,1790,1797,
+ 1809,1819,1826,1833,1843,1850,1862,1880,1895,1910,1925,1936,1954,1973,
+ 1988,2003,2016,2028,2040,2054,2067,2080,2092,2106,2120,2133,2147,2167,
+ 2182,2196,2206,2216,2229,2239,2249,2259,2269,2279,2289,2299,2309,2319,
+ 2329,2332,2336,2340,2358,2377,2393,2408,2419,2426,2433,2440,2447,2454,
+ 2461,2468,2475,2482,2489,2496,2503,2510,2517,2524,2531,2538,2545,2552,
+ 2559,2566,2573,2580,2587,2594,2601,2615,2625,2632,2643,2659,2672,2684,
+ 2696,2708,2722,2733,2744,2759,2771,2782,2797,2809,2819,2832,2850,2860,
+ 2873,2885,2898,2907,2917,2930,2943,2956,2968,2982,2996,3009,3022,3034,
+ 3046,3060,3073,3086,3098,3112,3126,3139,3152,3167,3182,3196,3208,3220,
+ 3237,3249,3264,3275,3283,3297,3309,3321,3338,3353,3365,3377,3394,3409,
+ 3418,3430,3442,3454,3471,3483,3498,3506,3518,3530,3542,3559,3574,3586,
+ 3597,3612,3620,3628,3636,3644,3650,3655,3660,3666,3673,3681,3687
+ };
+
+
+ /* the following are indices into the SID name table */
+#ifdef _FX_MANAGED_CODE_
+__declspec(process)
+#endif
+ static const unsigned short t1_standard_encoding[256] =
+ {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 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, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,
+ 0,111,112,113,114, 0,115,116,117,118,119,120,121,122, 0,123,
+ 0,124,125,126,127,128,129,130,131, 0,132,133, 0,134,135,136,
+ 137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,138, 0,139, 0, 0, 0, 0,140,141,142,143, 0, 0, 0, 0,
+ 0,144, 0, 0, 0,145, 0, 0,146,147,148,149, 0, 0, 0, 0
+ };
+
+
+ /* the following are indices into the SID name table */
+#ifdef _FX_MANAGED_CODE_
+__declspec(process)
+#endif
+ static const unsigned short t1_expert_encoding[256] =
+ {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1,229,230, 0,231,232,233,234,235,236,237,238, 13, 14, 15, 99,
+ 239,240,241,242,243,244,245,246,247,248, 27, 28,249,250,251,252,
+ 0,253,254,255,256,257, 0, 0, 0,258, 0, 0,259,260,261,262,
+ 0, 0,263,264,265, 0,266,109,110,267,268,269, 0,270,271,272,
+ 273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,
+ 289,290,291,292,293,294,295,296,297,298,299,300,301,302,303, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,304,305,306, 0, 0,307,308,309,310,311, 0,312, 0, 0,313,
+ 0, 0,314,315, 0, 0,316,317,318, 0, 0, 0,158,155,163,319,
+ 320,321,322,323,324,325, 0, 0,326,150,164,169,327,328,329,330,
+ 331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,
+ 347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,
+ 363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378
+ };
+
+
+ /*
+ * This table is a compressed version of the Adobe Glyph List (AGL),
+ * optimized for efficient searching. It has been generated by the
+ * `glnames.py' python script located in the `src/tools' directory.
+ *
+ * The lookup function to get the Unicode value for a given string
+ * is defined below the table.
+ */
+
+#ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST
+#ifdef _FX_MANAGED_CODE_
+__declspec(process)
+#endif
+ static const unsigned char ft_adobe_glyph_list[55997L] =
+ {
+ 0, 52, 0,106, 2,167, 3, 63, 4,220, 6,125, 9,143, 10, 23,
+ 11,137, 12,199, 14,246, 15, 87, 16,233, 17,219, 18,104, 19, 88,
+ 22,110, 23, 32, 23, 71, 24, 77, 27,156, 29, 73, 31,247, 32,107,
+ 32,222, 33, 55, 34,154, 35,218, 58, 10, 64,122, 72,188, 80,109,
+ 88,104, 93, 61, 98,168,106, 91,114,111,115,237,122,180,127,255,
+ 135,164,143,132,149,213,158,108,161,115,168,175,183,147,197,199,
+ 202, 25,204,166,208,209,209, 81,215, 26, 65,143, 0, 65, 0,140,
+ 0,175, 0,193, 1, 15, 1,147, 1,233, 1,251, 2, 7, 2, 40,
+ 2, 57, 2, 82, 2, 91, 2,128, 2,136, 2,154, 69,131, 0,198,
+ 0,150, 0,158, 0,167,225,227,245,244,101,128, 1,252,237,225,
+ 227,242,239,110,128, 1,226,243,237,225,236,108,128,247,230,225,
+ 227,245,244,101,129, 0,193, 0,185,243,237,225,236,108,128,247,
+ 225,226,242,229,246,101,134, 1, 2, 0,213, 0,221, 0,232, 0,
+ 243, 0,251, 1, 7,225,227,245,244,101,128, 30,174,227,249,242,
+ 233,236,236,233, 99,128, 4,208,228,239,244,226,229,236,239,119,
+ 128, 30,182,231,242,225,246,101,128, 30,176,232,239,239,235,225,
+ 226,239,246,101,128, 30,178,244,233,236,228,101,128, 30,180, 99,
+ 4, 1, 25, 1, 32, 1,121, 1,137,225,242,239,110,128, 1,205,
+ 233,242, 99, 2, 1, 40, 1, 45,236,101,128, 36,182,245,237,230,
+ 236,229,120,134, 0,194, 1, 66, 1, 74, 1, 85, 1, 93, 1,105,
+ 1,113,225,227,245,244,101,128, 30,164,228,239,244,226,229,236,
+ 239,119,128, 30,172,231,242,225,246,101,128, 30,166,232,239,239,
+ 235,225,226,239,246,101,128, 30,168,243,237,225,236,108,128,247,
+ 226,244,233,236,228,101,128, 30,170,245,244,101,129,246,201, 1,
+ 129,243,237,225,236,108,128,247,180,249,242,233,236,236,233, 99,
+ 128, 4, 16,100, 3, 1,155, 1,165, 1,209,226,236,231,242,225,
+ 246,101,128, 2, 0,233,229,242,229,243,233,115,131, 0,196, 1,
+ 181, 1,192, 1,201,227,249,242,233,236,236,233, 99,128, 4,210,
+ 237,225,227,242,239,110,128, 1,222,243,237,225,236,108,128,247,
+ 228,239,116, 2, 1,216, 1,224,226,229,236,239,119,128, 30,160,
+ 237,225,227,242,239,110,128, 1,224,231,242,225,246,101,129, 0,
+ 192, 1,243,243,237,225,236,108,128,247,224,232,239,239,235,225,
+ 226,239,246,101,128, 30,162,105, 2, 2, 13, 2, 25,229,227,249,
+ 242,233,236,236,233, 99,128, 4,212,238,246,229,242,244,229,228,
+ 226,242,229,246,101,128, 2, 2,236,240,232, 97,129, 3,145, 2,
+ 49,244,239,238,239,115,128, 3,134,109, 2, 2, 63, 2, 71,225,
+ 227,242,239,110,128, 1, 0,239,238,239,243,240,225,227,101,128,
+ 255, 33,239,231,239,238,229,107,128, 1, 4,242,233,238,103,131,
+ 0,197, 2,104, 2,112, 2,120,225,227,245,244,101,128, 1,250,
+ 226,229,236,239,119,128, 30, 0,243,237,225,236,108,128,247,229,
+ 243,237,225,236,108,128,247, 97,244,233,236,228,101,129, 0,195,
+ 2,146,243,237,225,236,108,128,247,227,249,226,225,242,237,229,
+ 238,233,225,110,128, 5, 49, 66,137, 0, 66, 2,189, 2,198, 2,
+ 223, 3, 3, 3, 10, 3, 22, 3, 34, 3, 46, 3, 54,227,233,242,
+ 227,236,101,128, 36,183,228,239,116, 2, 2,206, 2,215,225,227,
+ 227,229,238,116,128, 30, 2,226,229,236,239,119,128, 30, 4,101,
+ 3, 2,231, 2,242, 2,254,227,249,242,233,236,236,233, 99,128,
+ 4, 17,238,225,242,237,229,238,233,225,110,128, 5, 50,244, 97,
+ 128, 3,146,232,239,239,107,128, 1,129,236,233,238,229,226,229,
+ 236,239,119,128, 30, 6,237,239,238,239,243,240,225,227,101,128,
+ 255, 34,242,229,246,229,243,237,225,236,108,128,246,244,243,237,
+ 225,236,108,128,247, 98,244,239,240,226,225,114,128, 1,130, 67,
+ 137, 0, 67, 3, 85, 3,127, 3,193, 3,210, 3,224, 4,171, 4,
+ 188, 4,200, 4,212, 97, 3, 3, 93, 3,104, 3,111,225,242,237,
+ 229,238,233,225,110,128, 5, 62,227,245,244,101,128, 1, 6,242,
+ 239,110,129,246,202, 3,119,243,237,225,236,108,128,246,245, 99,
+ 3, 3,135, 3,142, 3,171,225,242,239,110,128, 1, 12,229,228,
+ 233,236,236, 97,130, 0,199, 3,155, 3,163,225,227,245,244,101,
+ 128, 30, 8,243,237,225,236,108,128,247,231,233,242, 99, 2, 3,
+ 179, 3,184,236,101,128, 36,184,245,237,230,236,229,120,128, 1,
+ 8,228,239,116,129, 1, 10, 3,201,225,227,227,229,238,116,128,
+ 1, 10,229,228,233,236,236,225,243,237,225,236,108,128,247,184,
+ 104, 4, 3,234, 3,246, 4,161, 4,165,225,225,242,237,229,238,
+ 233,225,110,128, 5, 73,101, 6, 4, 4, 4, 24, 4, 35, 4,103,
+ 4,115, 4,136,225,226,235,232,225,243,233,225,238,227,249,242,
+ 233,236,236,233, 99,128, 4,188,227,249,242,233,236,236,233, 99,
+ 128, 4, 39,100, 2, 4, 41, 4, 85,229,243,227,229,238,228,229,
+ 114, 2, 4, 54, 4, 74,225,226,235,232,225,243,233,225,238,227,
+ 249,242,233,236,236,233, 99,128, 4,190,227,249,242,233,236,236,
+ 233, 99,128, 4,182,233,229,242,229,243,233,243,227,249,242,233,
+ 236,236,233, 99,128, 4,244,232,225,242,237,229,238,233,225,110,
+ 128, 5, 67,235,232,225,235,225,243,243,233,225,238,227,249,242,
+ 233,236,236,233, 99,128, 4,203,246,229,242,244,233,227,225,236,
+ 243,244,242,239,235,229,227,249,242,233,236,236,233, 99,128, 4,
+ 184,105,128, 3,167,239,239,107,128, 1,135,233,242,227,245,237,
+ 230,236,229,248,243,237,225,236,108,128,246,246,237,239,238,239,
+ 243,240,225,227,101,128,255, 35,239,225,242,237,229,238,233,225,
+ 110,128, 5, 81,243,237,225,236,108,128,247, 99, 68,142, 0, 68,
+ 4,252, 5, 10, 5, 36, 5, 96, 5,121, 5,166, 5,173, 5,231,
+ 5,244, 6, 0, 6, 12, 6, 28, 6, 48, 6, 57, 90,129, 1,241,
+ 5, 2,227,225,242,239,110,128, 1,196, 97, 2, 5, 16, 5, 27,
+ 225,242,237,229,238,233,225,110,128, 5, 52,230,242,233,227,225,
+ 110,128, 1,137, 99, 4, 5, 46, 5, 53, 5, 62, 5, 89,225,242,
+ 239,110,128, 1, 14,229,228,233,236,236, 97,128, 30, 16,233,242,
+ 99, 2, 5, 70, 5, 75,236,101,128, 36,185,245,237,230,236,229,
+ 248,226,229,236,239,119,128, 30, 18,242,239,225,116,128, 1, 16,
+ 228,239,116, 2, 5,104, 5,113,225,227,227,229,238,116,128, 30,
+ 10,226,229,236,239,119,128, 30, 12,101, 3, 5,129, 5,140, 5,
+ 150,227,249,242,233,236,236,233, 99,128, 4, 20,233,227,239,240,
+ 244,233, 99,128, 3,238,236,244, 97,129, 34, 6, 5,158,231,242,
+ 229,229,107,128, 3,148,232,239,239,107,128, 1,138,105, 2, 5,
+ 179, 5,218,229,242,229,243,233,115,131,246,203, 5,194, 5,202,
+ 5,210,193,227,245,244,101,128,246,204,199,242,225,246,101,128,
+ 246,205,243,237,225,236,108,128,247,168,231,225,237,237,225,231,
+ 242,229,229,107,128, 3,220,234,229,227,249,242,233,236,236,233,
+ 99,128, 4, 2,236,233,238,229,226,229,236,239,119,128, 30, 14,
+ 237,239,238,239,243,240,225,227,101,128,255, 36,239,244,225,227,
+ 227,229,238,244,243,237,225,236,108,128,246,247,115, 2, 6, 34,
+ 6, 41,236,225,243,104,128, 1, 16,237,225,236,108,128,247,100,
+ 244,239,240,226,225,114,128, 1,139,122,131, 1,242, 6, 67, 6,
+ 75, 6,112,227,225,242,239,110,128, 1,197,101, 2, 6, 81, 6,
+ 101,225,226,235,232,225,243,233,225,238,227,249,242,233,236,236,
+ 233, 99,128, 4,224,227,249,242,233,236,236,233, 99,128, 4, 5,
+ 232,229,227,249,242,233,236,236,233, 99,128, 4, 15, 69,146, 0,
+ 69, 6,165, 6,183, 6,191, 7, 89, 7,153, 7,165, 7,183, 7,
+ 211, 8, 7, 8, 36, 8, 94, 8,169, 8,189, 8,208, 8,248, 9,
+ 44, 9,109, 9,115,225,227,245,244,101,129, 0,201, 6,175,243,
+ 237,225,236,108,128,247,233,226,242,229,246,101,128, 1, 20, 99,
+ 5, 6,203, 6,210, 6,224, 6,236, 7, 79,225,242,239,110,128,
+ 1, 26,229,228,233,236,236,225,226,242,229,246,101,128, 30, 28,
+ 232,225,242,237,229,238,233,225,110,128, 5, 53,233,242, 99, 2,
+ 6,244, 6,249,236,101,128, 36,186,245,237,230,236,229,120,135,
+ 0,202, 7, 16, 7, 24, 7, 32, 7, 43, 7, 51, 7, 63, 7, 71,
+ 225,227,245,244,101,128, 30,190,226,229,236,239,119,128, 30, 24,
+ 228,239,244,226,229,236,239,119,128, 30,198,231,242,225,246,101,
+ 128, 30,192,232,239,239,235,225,226,239,246,101,128, 30,194,243,
+ 237,225,236,108,128,247,234,244,233,236,228,101,128, 30,196,249,
+ 242,233,236,236,233, 99,128, 4, 4,100, 3, 7, 97, 7,107, 7,
+ 127,226,236,231,242,225,246,101,128, 2, 4,233,229,242,229,243,
+ 233,115,129, 0,203, 7,119,243,237,225,236,108,128,247,235,239,
+ 116,130, 1, 22, 7,136, 7,145,225,227,227,229,238,116,128, 1,
+ 22,226,229,236,239,119,128, 30,184,230,227,249,242,233,236,236,
+ 233, 99,128, 4, 36,231,242,225,246,101,129, 0,200, 7,175,243,
+ 237,225,236,108,128,247,232,104, 2, 7,189, 7,200,225,242,237,
+ 229,238,233,225,110,128, 5, 55,239,239,235,225,226,239,246,101,
+ 128, 30,186,105, 3, 7,219, 7,230, 7,245,231,232,244,242,239,
+ 237,225,110,128, 33,103,238,246,229,242,244,229,228,226,242,229,
+ 246,101,128, 2, 6,239,244,233,230,233,229,228,227,249,242,233,
+ 236,236,233, 99,128, 4,100,108, 2, 8, 13, 8, 24,227,249,242,
+ 233,236,236,233, 99,128, 4, 27,229,246,229,238,242,239,237,225,
+ 110,128, 33,106,109, 3, 8, 44, 8, 72, 8, 83,225,227,242,239,
+ 110,130, 1, 18, 8, 56, 8, 64,225,227,245,244,101,128, 30, 22,
+ 231,242,225,246,101,128, 30, 20,227,249,242,233,236,236,233, 99,
+ 128, 4, 28,239,238,239,243,240,225,227,101,128,255, 37,110, 4,
+ 8,104, 8,115, 8,135, 8,154,227,249,242,233,236,236,233, 99,
+ 128, 4, 29,228,229,243,227,229,238,228,229,242,227,249,242,233,
+ 236,236,233, 99,128, 4,162,103,129, 1, 74, 8,141,232,229,227,
+ 249,242,233,236,236,233, 99,128, 4,164,232,239,239,235,227,249,
+ 242,233,236,236,233, 99,128, 4,199,111, 2, 8,175, 8,183,231,
+ 239,238,229,107,128, 1, 24,240,229,110,128, 1,144,240,243,233,
+ 236,239,110,129, 3,149, 8,200,244,239,238,239,115,128, 3,136,
+ 114, 2, 8,214, 8,225,227,249,242,233,236,236,233, 99,128, 4,
+ 32,229,246,229,242,243,229,100,129, 1,142, 8,237,227,249,242,
+ 233,236,236,233, 99,128, 4, 45,115, 4, 9, 2, 9, 13, 9, 33,
+ 9, 37,227,249,242,233,236,236,233, 99,128, 4, 33,228,229,243,
+ 227,229,238,228,229,242,227,249,242,233,236,236,233, 99,128, 4,
+ 170,104,128, 1,169,237,225,236,108,128,247,101,116, 3, 9, 52,
+ 9, 78, 9, 92, 97,130, 3,151, 9, 60, 9, 70,242,237,229,238,
+ 233,225,110,128, 5, 56,244,239,238,239,115,128, 3,137,104,129,
+ 0,208, 9, 84,243,237,225,236,108,128,247,240,233,236,228,101,
+ 129, 30,188, 9,101,226,229,236,239,119,128, 30, 26,245,242,111,
+ 128, 32,172,250,104,130, 1,183, 9,124, 9,132,227,225,242,239,
+ 110,128, 1,238,242,229,246,229,242,243,229,100,128, 1,184, 70,
+ 136, 0, 70, 9,163, 9,172, 9,184, 9,212, 9,219, 9,248, 10,
+ 4, 10, 15,227,233,242,227,236,101,128, 36,187,228,239,244,225,
+ 227,227,229,238,116,128, 30, 30,101, 2, 9,190, 9,202,232,225,
+ 242,237,229,238,233,225,110,128, 5, 86,233,227,239,240,244,233,
+ 99,128, 3,228,232,239,239,107,128, 1,145,105, 2, 9,225, 9,
+ 238,244,225,227,249,242,233,236,236,233, 99,128, 4,114,246,229,
+ 242,239,237,225,110,128, 33,100,237,239,238,239,243,240,225,227,
+ 101,128,255, 38,239,245,242,242,239,237,225,110,128, 33, 99,243,
+ 237,225,236,108,128,247,102, 71,140, 0, 71, 10, 51, 10, 61, 10,
+ 107, 10,115, 10,176, 10,193, 10,205, 11, 39, 11, 52, 11, 65, 11,
+ 90, 11,107,194,243,241,245,225,242,101,128, 51,135, 97, 3, 10,
+ 69, 10, 76, 10, 94,227,245,244,101,128, 1,244,237,237, 97,129,
+ 3,147, 10, 84,225,230,242,233,227,225,110,128, 1,148,238,231,
+ 233,225,227,239,240,244,233, 99,128, 3,234,226,242,229,246,101,
+ 128, 1, 30, 99, 4, 10,125, 10,132, 10,141, 10,163,225,242,239,
+ 110,128, 1,230,229,228,233,236,236, 97,128, 1, 34,233,242, 99,
+ 2, 10,149, 10,154,236,101,128, 36,188,245,237,230,236,229,120,
+ 128, 1, 28,239,237,237,225,225,227,227,229,238,116,128, 1, 34,
+ 228,239,116,129, 1, 32, 10,184,225,227,227,229,238,116,128, 1,
+ 32,229,227,249,242,233,236,236,233, 99,128, 4, 19,104, 3, 10,
+ 213, 10,226, 11, 33,225,228,225,242,237,229,238,233,225,110,128,
+ 5, 66,101, 3, 10,234, 10,255, 11, 16,237,233,228,228,236,229,
+ 232,239,239,235,227,249,242,233,236,236,233, 99,128, 4,148,243,
+ 244,242,239,235,229,227,249,242,233,236,236,233, 99,128, 4,146,
+ 245,240,244,245,242,238,227,249,242,233,236,236,233, 99,128, 4,
+ 144,239,239,107,128, 1,147,233,237,225,242,237,229,238,233,225,
+ 110,128, 5, 51,234,229,227,249,242,233,236,236,233, 99,128, 4,
+ 3,109, 2, 11, 71, 11, 79,225,227,242,239,110,128, 30, 32,239,
+ 238,239,243,240,225,227,101,128,255, 39,242,225,246,101,129,246,
+ 206, 11, 99,243,237,225,236,108,128,247, 96,115, 2, 11,113, 11,
+ 129,237,225,236,108,129,247,103, 11,122,232,239,239,107,128, 2,
+ 155,244,242,239,235,101,128, 1,228, 72,140, 0, 72, 11,165, 11,
+ 190, 11,198, 11,208, 12, 17, 12, 40, 12, 77, 12,117, 12,129, 12,
+ 157, 12,165, 12,189,177,184, 53, 3, 11,175, 11,180, 11,185,179,
+ 51,128, 37,207,180, 51,128, 37,170,181, 49,128, 37,171,178,178,
+ 176,183, 51,128, 37,161,208,243,241,245,225,242,101,128, 51,203,
+ 97, 3, 11,216, 11,236, 12, 0,225,226,235,232,225,243,233,225,
+ 238,227,249,242,233,236,236,233, 99,128, 4,168,228,229,243,227,
+ 229,238,228,229,242,227,249,242,233,236,236,233, 99,128, 4,178,
+ 242,228,243,233,231,238,227,249,242,233,236,236,233, 99,128, 4,
+ 42, 98, 2, 12, 23, 12, 28,225,114,128, 1, 38,242,229,246,229,
+ 226,229,236,239,119,128, 30, 42, 99, 2, 12, 46, 12, 55,229,228,
+ 233,236,236, 97,128, 30, 40,233,242, 99, 2, 12, 63, 12, 68,236,
+ 101,128, 36,189,245,237,230,236,229,120,128, 1, 36,100, 2, 12,
+ 83, 12, 93,233,229,242,229,243,233,115,128, 30, 38,239,116, 2,
+ 12,100, 12,109,225,227,227,229,238,116,128, 30, 34,226,229,236,
+ 239,119,128, 30, 36,237,239,238,239,243,240,225,227,101,128,255,
+ 40,111, 2, 12,135, 12,146,225,242,237,229,238,233,225,110,128,
+ 5, 64,242,233,227,239,240,244,233, 99,128, 3,232,243,237,225,
+ 236,108,128,247,104,245,238,231,225,242,245,237,236,225,245,116,
+ 129,246,207, 12,181,243,237,225,236,108,128,246,248,250,243,241,
+ 245,225,242,101,128, 51,144, 73,146, 0, 73, 12,239, 12,251, 12,
+ 255, 13, 11, 13, 29, 13, 37, 13, 94, 13,181, 13,214, 13,224, 13,
+ 242, 13,254, 14, 48, 14, 86, 14, 99, 14,166, 14,187, 14,205,193,
+ 227,249,242,233,236,236,233, 99,128, 4, 47, 74,128, 1, 50,213,
+ 227,249,242,233,236,236,233, 99,128, 4, 46,225,227,245,244,101,
+ 129, 0,205, 13, 21,243,237,225,236,108,128,247,237,226,242,229,
+ 246,101,128, 1, 44, 99, 3, 13, 45, 13, 52, 13, 84,225,242,239,
+ 110,128, 1,207,233,242, 99, 2, 13, 60, 13, 65,236,101,128, 36,
+ 190,245,237,230,236,229,120,129, 0,206, 13, 76,243,237,225,236,
+ 108,128,247,238,249,242,233,236,236,233, 99,128, 4, 6,100, 3,
+ 13,102, 13,112, 13,155,226,236,231,242,225,246,101,128, 2, 8,
+ 233,229,242,229,243,233,115,131, 0,207, 13,128, 13,136, 13,147,
+ 225,227,245,244,101,128, 30, 46,227,249,242,233,236,236,233, 99,
+ 128, 4,228,243,237,225,236,108,128,247,239,239,116,130, 1, 48,
+ 13,164, 13,173,225,227,227,229,238,116,128, 1, 48,226,229,236,
+ 239,119,128, 30,202,101, 2, 13,187, 13,203,226,242,229,246,229,
+ 227,249,242,233,236,236,233, 99,128, 4,214,227,249,242,233,236,
+ 236,233, 99,128, 4, 21,230,242,225,235,244,245,114,128, 33, 17,
+ 231,242,225,246,101,129, 0,204, 13,234,243,237,225,236,108,128,
+ 247,236,232,239,239,235,225,226,239,246,101,128, 30,200,105, 3,
+ 14, 6, 14, 17, 14, 32,227,249,242,233,236,236,233, 99,128, 4,
+ 24,238,246,229,242,244,229,228,226,242,229,246,101,128, 2, 10,
+ 243,232,239,242,244,227,249,242,233,236,236,233, 99,128, 4, 25,
+ 109, 2, 14, 54, 14, 75,225,227,242,239,110,129, 1, 42, 14, 64,
+ 227,249,242,233,236,236,233, 99,128, 4,226,239,238,239,243,240,
+ 225,227,101,128,255, 41,238,233,225,242,237,229,238,233,225,110,
+ 128, 5, 59,111, 3, 14,107, 14,118, 14,126,227,249,242,233,236,
+ 236,233, 99,128, 4, 1,231,239,238,229,107,128, 1, 46,244, 97,
+ 131, 3,153, 14,137, 14,147, 14,158,225,230,242,233,227,225,110,
+ 128, 1,150,228,233,229,242,229,243,233,115,128, 3,170,244,239,
+ 238,239,115,128, 3,138,115, 2, 14,172, 14,179,237,225,236,108,
+ 128,247,105,244,242,239,235,101,128, 1,151,244,233,236,228,101,
+ 129, 1, 40, 14,197,226,229,236,239,119,128, 30, 44,250,232,233,
+ 244,243, 97, 2, 14,216, 14,227,227,249,242,233,236,236,233, 99,
+ 128, 4,116,228,226,236,231,242,225,246,229,227,249,242,233,236,
+ 236,233, 99,128, 4,118, 74,134, 0, 74, 15, 6, 15, 18, 15, 41,
+ 15, 53, 15, 67, 15, 79,225,225,242,237,229,238,233,225,110,128,
+ 5, 65,227,233,242, 99, 2, 15, 27, 15, 32,236,101,128, 36,191,
+ 245,237,230,236,229,120,128, 1, 52,229,227,249,242,233,236,236,
+ 233, 99,128, 4, 8,232,229,232,225,242,237,229,238,233,225,110,
+ 128, 5, 75,237,239,238,239,243,240,225,227,101,128,255, 42,243,
+ 237,225,236,108,128,247,106, 75,140, 0, 75, 15,115, 15,125, 15,
+ 135, 16, 18, 16, 65, 16, 76, 16,106, 16,143, 16,156, 16,168, 16,
+ 180, 16,208,194,243,241,245,225,242,101,128, 51,133,203,243,241,
+ 245,225,242,101,128, 51,205, 97, 7, 15,151, 15,169, 15,191, 15,
+ 211, 15,226, 15,232, 15,249,226,225,243,232,235,233,242,227,249,
+ 242,233,236,236,233, 99,128, 4,160, 99, 2, 15,175, 15,181,245,
+ 244,101,128, 30, 48,249,242,233,236,236,233, 99,128, 4, 26,228,
+ 229,243,227,229,238,228,229,242,227,249,242,233,236,236,233, 99,
+ 128, 4,154,232,239,239,235,227,249,242,233,236,236,233, 99,128,
+ 4,195,240,240, 97,128, 3,154,243,244,242,239,235,229,227,249,
+ 242,233,236,236,233, 99,128, 4,158,246,229,242,244,233,227,225,
+ 236,243,244,242,239,235,229,227,249,242,233,236,236,233, 99,128,
+ 4,156, 99, 4, 16, 28, 16, 35, 16, 44, 16, 52,225,242,239,110,
+ 128, 1,232,229,228,233,236,236, 97,128, 1, 54,233,242,227,236,
+ 101,128, 36,192,239,237,237,225,225,227,227,229,238,116,128, 1,
+ 54,228,239,244,226,229,236,239,119,128, 30, 50,101, 2, 16, 82,
+ 16, 94,232,225,242,237,229,238,233,225,110,128, 5, 84,238,225,
+ 242,237,229,238,233,225,110,128, 5, 63,104, 3, 16,114, 16,126,
+ 16,137,225,227,249,242,233,236,236,233, 99,128, 4, 37,229,233,
+ 227,239,240,244,233, 99,128, 3,230,239,239,107,128, 1,152,234,
+ 229,227,249,242,233,236,236,233, 99,128, 4, 12,236,233,238,229,
+ 226,229,236,239,119,128, 30, 52,237,239,238,239,243,240,225,227,
+ 101,128,255, 43,239,240,240, 97, 2, 16,189, 16,200,227,249,242,
+ 233,236,236,233, 99,128, 4,128,231,242,229,229,107,128, 3,222,
+ 115, 2, 16,214, 16,226,233,227,249,242,233,236,236,233, 99,128,
+ 4,110,237,225,236,108,128,247,107, 76,138, 0, 76, 17, 1, 17,
+ 5, 17, 9, 17, 29, 17, 95, 17,133, 17,147, 17,165, 17,177, 17,
+ 189, 74,128, 1,199, 76,128,246,191, 97, 2, 17, 15, 17, 22,227,
+ 245,244,101,128, 1, 57,237,226,228, 97,128, 3,155, 99, 4, 17,
+ 39, 17, 46, 17, 55, 17, 82,225,242,239,110,128, 1, 61,229,228,
+ 233,236,236, 97,128, 1, 59,233,242, 99, 2, 17, 63, 17, 68,236,
+ 101,128, 36,193,245,237,230,236,229,248,226,229,236,239,119,128,
+ 30, 60,239,237,237,225,225,227,227,229,238,116,128, 1, 59,228,
+ 239,116,130, 1, 63, 17,105, 17,114,225,227,227,229,238,116,128,
+ 1, 63,226,229,236,239,119,129, 30, 54, 17,124,237,225,227,242,
+ 239,110,128, 30, 56,233,247,238,225,242,237,229,238,233,225,110,
+ 128, 5, 60,106,129, 1,200, 17,153,229,227,249,242,233,236,236,
+ 233, 99,128, 4, 9,236,233,238,229,226,229,236,239,119,128, 30,
+ 58,237,239,238,239,243,240,225,227,101,128,255, 44,115, 2, 17,
+ 195, 17,212,236,225,243,104,129, 1, 65, 17,204,243,237,225,236,
+ 108,128,246,249,237,225,236,108,128,247,108, 77,137, 0, 77, 17,
+ 241, 17,251, 18, 24, 18, 33, 18, 58, 18, 71, 18, 83, 18, 91, 18,
+ 100,194,243,241,245,225,242,101,128, 51,134,225, 99, 2, 18, 2,
+ 18, 18,242,239,110,129,246,208, 18, 10,243,237,225,236,108,128,
+ 247,175,245,244,101,128, 30, 62,227,233,242,227,236,101,128, 36,
+ 194,228,239,116, 2, 18, 41, 18, 50,225,227,227,229,238,116,128,
+ 30, 64,226,229,236,239,119,128, 30, 66,229,238,225,242,237,229,
+ 238,233,225,110,128, 5, 68,237,239,238,239,243,240,225,227,101,
+ 128,255, 45,243,237,225,236,108,128,247,109,244,245,242,238,229,
+ 100,128, 1,156,117,128, 3,156, 78,141, 0, 78, 18,134, 18,138,
+ 18,146, 18,212, 18,237, 18,248, 19, 3, 19, 21, 19, 33, 19, 45,
+ 19, 58, 19, 66, 19, 84, 74,128, 1,202,225,227,245,244,101,128,
+ 1, 67, 99, 4, 18,156, 18,163, 18,172, 18,199,225,242,239,110,
+ 128, 1, 71,229,228,233,236,236, 97,128, 1, 69,233,242, 99, 2,
+ 18,180, 18,185,236,101,128, 36,195,245,237,230,236,229,248,226,
+ 229,236,239,119,128, 30, 74,239,237,237,225,225,227,227,229,238,
+ 116,128, 1, 69,228,239,116, 2, 18,220, 18,229,225,227,227,229,
+ 238,116,128, 30, 68,226,229,236,239,119,128, 30, 70,232,239,239,
+ 235,236,229,230,116,128, 1,157,233,238,229,242,239,237,225,110,
+ 128, 33,104,106,129, 1,203, 19, 9,229,227,249,242,233,236,236,
+ 233, 99,128, 4, 10,236,233,238,229,226,229,236,239,119,128, 30,
+ 72,237,239,238,239,243,240,225,227,101,128,255, 46,239,247,225,
+ 242,237,229,238,233,225,110,128, 5, 70,243,237,225,236,108,128,
+ 247,110,244,233,236,228,101,129, 0,209, 19, 76,243,237,225,236,
+ 108,128,247,241,117,128, 3,157, 79,141, 0, 79, 19,118, 19,132,
+ 19,150, 19,203, 20, 78, 20,152, 20,187, 21, 48, 21, 69, 21,213,
+ 21,223, 21,254, 22, 53, 69,129, 1, 82, 19,124,243,237,225,236,
+ 108,128,246,250,225,227,245,244,101,129, 0,211, 19,142,243,237,
+ 225,236,108,128,247,243, 98, 2, 19,156, 19,196,225,242,242,229,
+ 100, 2, 19,166, 19,177,227,249,242,233,236,236,233, 99,128, 4,
+ 232,228,233,229,242,229,243,233,243,227,249,242,233,236,236,233,
+ 99,128, 4,234,242,229,246,101,128, 1, 78, 99, 4, 19,213, 19,
+ 220, 19,235, 20, 68,225,242,239,110,128, 1,209,229,238,244,229,
+ 242,229,228,244,233,236,228,101,128, 1,159,233,242, 99, 2, 19,
+ 243, 19,248,236,101,128, 36,196,245,237,230,236,229,120,134, 0,
+ 212, 20, 13, 20, 21, 20, 32, 20, 40, 20, 52, 20, 60,225,227,245,
+ 244,101,128, 30,208,228,239,244,226,229,236,239,119,128, 30,216,
+ 231,242,225,246,101,128, 30,210,232,239,239,235,225,226,239,246,
+ 101,128, 30,212,243,237,225,236,108,128,247,244,244,233,236,228,
+ 101,128, 30,214,249,242,233,236,236,233, 99,128, 4, 30,100, 3,
+ 20, 86, 20,109, 20,142,226,108, 2, 20, 93, 20,101,225,227,245,
+ 244,101,128, 1, 80,231,242,225,246,101,128, 2, 12,233,229,242,
+ 229,243,233,115,130, 0,214, 20,123, 20,134,227,249,242,233,236,
+ 236,233, 99,128, 4,230,243,237,225,236,108,128,247,246,239,244,
+ 226,229,236,239,119,128, 30,204,103, 2, 20,158, 20,170,239,238,
+ 229,235,243,237,225,236,108,128,246,251,242,225,246,101,129, 0,
+ 210, 20,179,243,237,225,236,108,128,247,242,104, 4, 20,197, 20,
+ 208, 20,212, 21, 34,225,242,237,229,238,233,225,110,128, 5, 85,
+ 109,128, 33, 38,111, 2, 20,218, 20,228,239,235,225,226,239,246,
+ 101,128, 30,206,242,110,133, 1,160, 20,243, 20,251, 21, 6, 21,
+ 14, 21, 26,225,227,245,244,101,128, 30,218,228,239,244,226,229,
+ 236,239,119,128, 30,226,231,242,225,246,101,128, 30,220,232,239,
+ 239,235,225,226,239,246,101,128, 30,222,244,233,236,228,101,128,
+ 30,224,245,238,231,225,242,245,237,236,225,245,116,128, 1, 80,
+ 105,129, 1,162, 21, 54,238,246,229,242,244,229,228,226,242,229,
+ 246,101,128, 2, 14,109, 4, 21, 79, 21,107, 21,184, 21,202,225,
+ 227,242,239,110,130, 1, 76, 21, 91, 21, 99,225,227,245,244,101,
+ 128, 30, 82,231,242,225,246,101,128, 30, 80,229,231, 97,132, 33,
+ 38, 21,121, 21,132, 21,140, 21,156,227,249,242,233,236,236,233,
+ 99,128, 4, 96,231,242,229,229,107,128, 3,169,242,239,245,238,
+ 228,227,249,242,233,236,236,233, 99,128, 4,122,116, 2, 21,162,
+ 21,177,233,244,236,239,227,249,242,233,236,236,233, 99,128, 4,
+ 124,239,238,239,115,128, 3,143,233,227,242,239,110,129, 3,159,
+ 21,194,244,239,238,239,115,128, 3,140,239,238,239,243,240,225,
+ 227,101,128,255, 47,238,229,242,239,237,225,110,128, 33, 96,111,
+ 2, 21,229, 21,248,231,239,238,229,107,129, 1,234, 21,239,237,
+ 225,227,242,239,110,128, 1,236,240,229,110,128, 1,134,115, 3,
+ 22, 6, 22, 33, 22, 40,236,225,243,104,130, 0,216, 22, 17, 22,
+ 25,225,227,245,244,101,128, 1,254,243,237,225,236,108,128,247,
+ 248,237,225,236,108,128,247,111,244,242,239,235,229,225,227,245,
+ 244,101,128, 1,254,116, 2, 22, 59, 22, 70,227,249,242,233,236,
+ 236,233, 99,128, 4,126,233,236,228,101,131, 0,213, 22, 83, 22,
+ 91, 22,102,225,227,245,244,101,128, 30, 76,228,233,229,242,229,
+ 243,233,115,128, 30, 78,243,237,225,236,108,128,247,245, 80,136,
+ 0, 80, 22,130, 22,138, 22,147, 22,159, 22,211, 22,227, 22,246,
+ 23, 2,225,227,245,244,101,128, 30, 84,227,233,242,227,236,101,
+ 128, 36,197,228,239,244,225,227,227,229,238,116,128, 30, 86,101,
+ 3, 22,167, 22,178, 22,190,227,249,242,233,236,236,233, 99,128,
+ 4, 31,232,225,242,237,229,238,233,225,110,128, 5, 74,237,233,
+ 228,228,236,229,232,239,239,235,227,249,242,233,236,236,233, 99,
+ 128, 4,166,104, 2, 22,217, 22,221,105,128, 3,166,239,239,107,
+ 128, 1,164,105,129, 3,160, 22,233,247,242,225,242,237,229,238,
+ 233,225,110,128, 5, 83,237,239,238,239,243,240,225,227,101,128,
+ 255, 48,115, 2, 23, 8, 23, 25,105,129, 3,168, 23, 14,227,249,
+ 242,233,236,236,233, 99,128, 4,112,237,225,236,108,128,247,112,
+ 81,131, 0, 81, 23, 42, 23, 51, 23, 63,227,233,242,227,236,101,
+ 128, 36,198,237,239,238,239,243,240,225,227,101,128,255, 49,243,
+ 237,225,236,108,128,247,113, 82,138, 0, 82, 23, 95, 23,119, 23,
+ 166, 23,217, 23,230, 23,240, 23,245, 24, 19, 24, 31, 24, 43, 97,
+ 2, 23,101, 23,112,225,242,237,229,238,233,225,110,128, 5, 76,
+ 227,245,244,101,128, 1, 84, 99, 4, 23,129, 23,136, 23,145, 23,
+ 153,225,242,239,110,128, 1, 88,229,228,233,236,236, 97,128, 1,
+ 86,233,242,227,236,101,128, 36,199,239,237,237,225,225,227,227,
+ 229,238,116,128, 1, 86,100, 2, 23,172, 23,182,226,236,231,242,
+ 225,246,101,128, 2, 16,239,116, 2, 23,189, 23,198,225,227,227,
+ 229,238,116,128, 30, 88,226,229,236,239,119,129, 30, 90, 23,208,
+ 237,225,227,242,239,110,128, 30, 92,229,232,225,242,237,229,238,
+ 233,225,110,128, 5, 80,230,242,225,235,244,245,114,128, 33, 28,
+ 232,111,128, 3,161,233,110, 2, 23,252, 24, 5,231,243,237,225,
+ 236,108,128,246,252,246,229,242,244,229,228,226,242,229,246,101,
+ 128, 2, 18,236,233,238,229,226,229,236,239,119,128, 30, 94,237,
+ 239,238,239,243,240,225,227,101,128,255, 50,243,237,225,236,108,
+ 129,247,114, 24, 53,233,238,246,229,242,244,229,100,129, 2,129,
+ 24, 66,243,245,240,229,242,233,239,114,128, 2,182, 83,139, 0,
+ 83, 24,103, 26, 17, 26, 55, 26,182, 26,221, 26,250, 27, 84, 27,
+ 105, 27,117, 27,135, 27,143, 70, 6, 24,117, 24,209, 24,241, 25,
+ 77, 25,119, 25,221, 48, 9, 24,137, 24,145, 24,153, 24,161, 24,
+ 169, 24,177, 24,185, 24,193, 24,201,177,176,176,176, 48,128, 37,
+ 12,178,176,176,176, 48,128, 37, 20,179,176,176,176, 48,128, 37,
+ 16,180,176,176,176, 48,128, 37, 24,181,176,176,176, 48,128, 37,
+ 60,182,176,176,176, 48,128, 37, 44,183,176,176,176, 48,128, 37,
+ 52,184,176,176,176, 48,128, 37, 28,185,176,176,176, 48,128, 37,
+ 36, 49, 3, 24,217, 24,225, 24,233,176,176,176,176, 48,128, 37,
+ 0,177,176,176,176, 48,128, 37, 2,185,176,176,176, 48,128, 37,
+ 97, 50, 9, 25, 5, 25, 13, 25, 21, 25, 29, 25, 37, 25, 45, 25,
+ 53, 25, 61, 25, 69,176,176,176,176, 48,128, 37, 98,177,176,176,
+ 176, 48,128, 37, 86,178,176,176,176, 48,128, 37, 85,179,176,176,
+ 176, 48,128, 37, 99,180,176,176,176, 48,128, 37, 81,181,176,176,
+ 176, 48,128, 37, 87,182,176,176,176, 48,128, 37, 93,183,176,176,
+ 176, 48,128, 37, 92,184,176,176,176, 48,128, 37, 91, 51, 4, 25,
+ 87, 25, 95, 25,103, 25,111,182,176,176,176, 48,128, 37, 94,183,
+ 176,176,176, 48,128, 37, 95,184,176,176,176, 48,128, 37, 90,185,
+ 176,176,176, 48,128, 37, 84, 52, 10, 25,141, 25,149, 25,157, 25,
+ 165, 25,173, 25,181, 25,189, 25,197, 25,205, 25,213,176,176,176,
+ 176, 48,128, 37,105,177,176,176,176, 48,128, 37,102,178,176,176,
+ 176, 48,128, 37, 96,179,176,176,176, 48,128, 37, 80,180,176,176,
+ 176, 48,128, 37,108,181,176,176,176, 48,128, 37,103,182,176,176,
+ 176, 48,128, 37,104,183,176,176,176, 48,128, 37,100,184,176,176,
+ 176, 48,128, 37,101,185,176,176,176, 48,128, 37, 89, 53, 5, 25,
+ 233, 25,241, 25,249, 26, 1, 26, 9,176,176,176,176, 48,128, 37,
+ 88,177,176,176,176, 48,128, 37, 82,178,176,176,176, 48,128, 37,
+ 83,179,176,176,176, 48,128, 37,107,180,176,176,176, 48,128, 37,
+ 106, 97, 2, 26, 23, 26, 44,227,245,244,101,129, 1, 90, 26, 32,
+ 228,239,244,225,227,227,229,238,116,128, 30,100,237,240,233,231,
+ 242,229,229,107,128, 3,224, 99, 5, 26, 67, 26, 98, 26,107, 26,
+ 147, 26,169,225,242,239,110,130, 1, 96, 26, 78, 26, 90,228,239,
+ 244,225,227,227,229,238,116,128, 30,102,243,237,225,236,108,128,
+ 246,253,229,228,233,236,236, 97,128, 1, 94,232,247, 97,130, 1,
+ 143, 26,117, 26,128,227,249,242,233,236,236,233, 99,128, 4,216,
+ 228,233,229,242,229,243,233,243,227,249,242,233,236,236,233, 99,
+ 128, 4,218,233,242, 99, 2, 26,155, 26,160,236,101,128, 36,200,
+ 245,237,230,236,229,120,128, 1, 92,239,237,237,225,225,227,227,
+ 229,238,116,128, 2, 24,228,239,116, 2, 26,190, 26,199,225,227,
+ 227,229,238,116,128, 30, 96,226,229,236,239,119,129, 30, 98, 26,
+ 209,228,239,244,225,227,227,229,238,116,128, 30,104,101, 2, 26,
+ 227, 26,239,232,225,242,237,229,238,233,225,110,128, 5, 77,246,
+ 229,238,242,239,237,225,110,128, 33,102,104, 5, 27, 6, 27, 34,
+ 27, 48, 27, 59, 27, 72, 97, 2, 27, 12, 27, 23,225,242,237,229,
+ 238,233,225,110,128, 5, 71,227,249,242,233,236,236,233, 99,128,
+ 4, 40,227,232,225,227,249,242,233,236,236,233, 99,128, 4, 41,
+ 229,233,227,239,240,244,233, 99,128, 3,226,232,225,227,249,242,
+ 233,236,236,233, 99,128, 4,186,233,237,225,227,239,240,244,233,
+ 99,128, 3,236,105, 2, 27, 90, 27, 96,231,237, 97,128, 3,163,
+ 248,242,239,237,225,110,128, 33,101,237,239,238,239,243,240,225,
+ 227,101,128,255, 51,239,230,244,243,233,231,238,227,249,242,233,
+ 236,236,233, 99,128, 4, 44,243,237,225,236,108,128,247,115,244,
+ 233,231,237,225,231,242,229,229,107,128, 3,218, 84,141, 0, 84,
+ 27,186, 27,191, 27,197, 28, 7, 28, 32, 28, 96, 28,147, 28,177,
+ 28,189, 28,201, 28,246, 29, 6, 29, 46,225,117,128, 3,164,226,
+ 225,114,128, 1,102, 99, 4, 27,207, 27,214, 27,223, 27,250,225,
+ 242,239,110,128, 1,100,229,228,233,236,236, 97,128, 1, 98,233,
+ 242, 99, 2, 27,231, 27,236,236,101,128, 36,201,245,237,230,236,
+ 229,248,226,229,236,239,119,128, 30,112,239,237,237,225,225,227,
+ 227,229,238,116,128, 1, 98,228,239,116, 2, 28, 15, 28, 24,225,
+ 227,227,229,238,116,128, 30,106,226,229,236,239,119,128, 30,108,
+ 101, 4, 28, 42, 28, 53, 28, 73, 28, 82,227,249,242,233,236,236,
+ 233, 99,128, 4, 34,228,229,243,227,229,238,228,229,242,227,249,
+ 242,233,236,236,233, 99,128, 4,172,238,242,239,237,225,110,128,
+ 33,105,244,243,229,227,249,242,233,236,236,233, 99,128, 4,180,
+ 104, 3, 28,104, 28,110, 28,136,229,244, 97,128, 3,152,111, 2,
+ 28,116, 28,121,239,107,128, 1,172,242,110,129, 0,222, 28,128,
+ 243,237,225,236,108,128,247,254,242,229,229,242,239,237,225,110,
+ 128, 33, 98,105, 2, 28,153, 28,164,236,228,229,243,237,225,236,
+ 108,128,246,254,247,238,225,242,237,229,238,233,225,110,128, 5,
+ 79,236,233,238,229,226,229,236,239,119,128, 30,110,237,239,238,
+ 239,243,240,225,227,101,128,255, 52,111, 2, 28,207, 28,218,225,
+ 242,237,229,238,233,225,110,128, 5, 57,238,101, 3, 28,227, 28,
+ 234, 28,240,230,233,246,101,128, 1,188,243,233,120,128, 1,132,
+ 244,247,111,128, 1,167,242,229,244,242,239,230,236,229,248,232,
+ 239,239,107,128, 1,174,115, 3, 29, 14, 29, 26, 29, 39,229,227,
+ 249,242,233,236,236,233, 99,128, 4, 38,232,229,227,249,242,233,
+ 236,236,233, 99,128, 4, 11,237,225,236,108,128,247,116,119, 2,
+ 29, 52, 29, 64,229,236,246,229,242,239,237,225,110,128, 33,107,
+ 239,242,239,237,225,110,128, 33, 97, 85,142, 0, 85, 29,105, 29,
+ 123, 29,131, 29,198, 30, 69, 30, 87, 30,198, 30,214, 30,226, 31,
+ 21, 31, 30, 31,142, 31,149, 31,219,225,227,245,244,101,129, 0,
+ 218, 29,115,243,237,225,236,108,128,247,250,226,242,229,246,101,
+ 128, 1,108, 99, 3, 29,139, 29,146, 29,188,225,242,239,110,128,
+ 1,211,233,242, 99, 2, 29,154, 29,159,236,101,128, 36,202,245,
+ 237,230,236,229,120,130, 0,219, 29,172, 29,180,226,229,236,239,
+ 119,128, 30,118,243,237,225,236,108,128,247,251,249,242,233,236,
+ 236,233, 99,128, 4, 35,100, 3, 29,206, 29,229, 30, 59,226,108,
+ 2, 29,213, 29,221,225,227,245,244,101,128, 1,112,231,242,225,
+ 246,101,128, 2, 20,233,229,242,229,243,233,115,134, 0,220, 29,
+ 251, 30, 3, 30, 11, 30, 34, 30, 42, 30, 51,225,227,245,244,101,
+ 128, 1,215,226,229,236,239,119,128, 30,114, 99, 2, 30, 17, 30,
+ 24,225,242,239,110,128, 1,217,249,242,233,236,236,233, 99,128,
+ 4,240,231,242,225,246,101,128, 1,219,237,225,227,242,239,110,
+ 128, 1,213,243,237,225,236,108,128,247,252,239,244,226,229,236,
+ 239,119,128, 30,228,231,242,225,246,101,129, 0,217, 30, 79,243,
+ 237,225,236,108,128,247,249,104, 2, 30, 93, 30,171,111, 2, 30,
+ 99, 30,109,239,235,225,226,239,246,101,128, 30,230,242,110,133,
+ 1,175, 30,124, 30,132, 30,143, 30,151, 30,163,225,227,245,244,
+ 101,128, 30,232,228,239,244,226,229,236,239,119,128, 30,240,231,
+ 242,225,246,101,128, 30,234,232,239,239,235,225,226,239,246,101,
+ 128, 30,236,244,233,236,228,101,128, 30,238,245,238,231,225,242,
+ 245,237,236,225,245,116,129, 1,112, 30,187,227,249,242,233,236,
+ 236,233, 99,128, 4,242,233,238,246,229,242,244,229,228,226,242,
+ 229,246,101,128, 2, 22,235,227,249,242,233,236,236,233, 99,128,
+ 4,120,109, 2, 30,232, 31, 10,225,227,242,239,110,130, 1,106,
+ 30,244, 30,255,227,249,242,233,236,236,233, 99,128, 4,238,228,
+ 233,229,242,229,243,233,115,128, 30,122,239,238,239,243,240,225,
+ 227,101,128,255, 53,239,231,239,238,229,107,128, 1,114,240,243,
+ 233,236,239,110,133, 3,165, 31, 49, 31, 53, 31, 90, 31,121, 31,
+ 134, 49,128, 3,210, 97, 2, 31, 59, 31, 81,227,245,244,229,232,
+ 239,239,235,243,249,237,226,239,236,231,242,229,229,107,128, 3,
+ 211,230,242,233,227,225,110,128, 1,177,228,233,229,242,229,243,
+ 233,115,129, 3,171, 31,103,232,239,239,235,243,249,237,226,239,
+ 236,231,242,229,229,107,128, 3,212,232,239,239,235,243,249,237,
+ 226,239,108,128, 3,210,244,239,238,239,115,128, 3,142,242,233,
+ 238,103,128, 1,110,115, 3, 31,157, 31,172, 31,179,232,239,242,
+ 244,227,249,242,233,236,236,233, 99,128, 4, 14,237,225,236,108,
+ 128,247,117,244,242,225,233,231,232,116, 2, 31,191, 31,202,227,
+ 249,242,233,236,236,233, 99,128, 4,174,243,244,242,239,235,229,
+ 227,249,242,233,236,236,233, 99,128, 4,176,244,233,236,228,101,
+ 130, 1,104, 31,231, 31,239,225,227,245,244,101,128, 30,120,226,
+ 229,236,239,119,128, 30,116, 86,136, 0, 86, 32, 11, 32, 20, 32,
+ 31, 32, 60, 32, 67, 32, 79, 32, 91, 32, 99,227,233,242,227,236,
+ 101,128, 36,203,228,239,244,226,229,236,239,119,128, 30,126,101,
+ 2, 32, 37, 32, 48,227,249,242,233,236,236,233, 99,128, 4, 18,
+ 247,225,242,237,229,238,233,225,110,128, 5, 78,232,239,239,107,
+ 128, 1,178,237,239,238,239,243,240,225,227,101,128,255, 54,239,
+ 225,242,237,229,238,233,225,110,128, 5, 72,243,237,225,236,108,
+ 128,247,118,244,233,236,228,101,128, 30,124, 87,134, 0, 87, 32,
+ 123, 32,131, 32,154, 32,194, 32,202, 32,214,225,227,245,244,101,
+ 128, 30,130,227,233,242, 99, 2, 32,140, 32,145,236,101,128, 36,
+ 204,245,237,230,236,229,120,128, 1,116,100, 2, 32,160, 32,170,
+ 233,229,242,229,243,233,115,128, 30,132,239,116, 2, 32,177, 32,
+ 186,225,227,227,229,238,116,128, 30,134,226,229,236,239,119,128,
+ 30,136,231,242,225,246,101,128, 30,128,237,239,238,239,243,240,
+ 225,227,101,128,255, 55,243,237,225,236,108,128,247,119, 88,134,
+ 0, 88, 32,238, 32,247, 33, 18, 33, 31, 33, 35, 33, 47,227,233,
+ 242,227,236,101,128, 36,205,100, 2, 32,253, 33, 7,233,229,242,
+ 229,243,233,115,128, 30,140,239,244,225,227,227,229,238,116,128,
+ 30,138,229,232,225,242,237,229,238,233,225,110,128, 5, 61,105,
+ 128, 3,158,237,239,238,239,243,240,225,227,101,128,255, 56,243,
+ 237,225,236,108,128,247,120, 89,139, 0, 89, 33, 81, 33,116, 33,
+ 139, 33,189, 33,228, 33,236, 33,253, 34, 40, 34, 52, 34, 60, 34,
+ 68, 97, 2, 33, 87, 33,104,227,245,244,101,129, 0,221, 33, 96,
+ 243,237,225,236,108,128,247,253,244,227,249,242,233,236,236,233,
+ 99,128, 4, 98,227,233,242, 99, 2, 33,125, 33,130,236,101,128,
+ 36,206,245,237,230,236,229,120,128, 1,118,100, 2, 33,145, 33,
+ 165,233,229,242,229,243,233,115,129, 1,120, 33,157,243,237,225,
+ 236,108,128,247,255,239,116, 2, 33,172, 33,181,225,227,227,229,
+ 238,116,128, 30,142,226,229,236,239,119,128, 30,244,229,114, 2,
+ 33,196, 33,208,233,227,249,242,233,236,236,233, 99,128, 4, 43,
+ 245,228,233,229,242,229,243,233,243,227,249,242,233,236,236,233,
+ 99,128, 4,248,231,242,225,246,101,128, 30,242,232,239,239,107,
+ 129, 1,179, 33,245,225,226,239,246,101,128, 30,246,105, 3, 34,
+ 5, 34, 16, 34, 27,225,242,237,229,238,233,225,110,128, 5, 69,
+ 227,249,242,233,236,236,233, 99,128, 4, 7,247,238,225,242,237,
+ 229,238,233,225,110,128, 5, 82,237,239,238,239,243,240,225,227,
+ 101,128,255, 57,243,237,225,236,108,128,247,121,244,233,236,228,
+ 101,128, 30,248,245,115, 2, 34, 75, 34,113,226,233,103, 2, 34,
+ 83, 34, 94,227,249,242,233,236,236,233, 99,128, 4,106,233,239,
+ 244,233,230,233,229,228,227,249,242,233,236,236,233, 99,128, 4,
+ 108,236,233,244,244,236,101, 2, 34,124, 34,135,227,249,242,233,
+ 236,236,233, 99,128, 4,102,233,239,244,233,230,233,229,228,227,
+ 249,242,233,236,236,233, 99,128, 4,104, 90,136, 0, 90, 34,174,
+ 34,198, 34,243, 35, 14, 35, 81, 35,173, 35,185, 35,197, 97, 2,
+ 34,180, 34,191,225,242,237,229,238,233,225,110,128, 5, 54,227,
+ 245,244,101,128, 1,121, 99, 2, 34,204, 34,221,225,242,239,110,
+ 129, 1,125, 34,213,243,237,225,236,108,128,246,255,233,242, 99,
+ 2, 34,229, 34,234,236,101,128, 36,207,245,237,230,236,229,120,
+ 128, 30,144,228,239,116,130, 1,123, 34,253, 35, 6,225,227,227,
+ 229,238,116,128, 1,123,226,229,236,239,119,128, 30,146,101, 3,
+ 35, 22, 35, 33, 35, 76,227,249,242,233,236,236,233, 99,128, 4,
+ 23,100, 2, 35, 39, 35, 58,229,243,227,229,238,228,229,242,227,
+ 249,242,233,236,236,233, 99,128, 4,152,233,229,242,229,243,233,
+ 243,227,249,242,233,236,236,233, 99,128, 4,222,244, 97,128, 3,
+ 150,232,101, 4, 35, 92, 35,103, 35,119, 35,130,225,242,237,229,
+ 238,233,225,110,128, 5, 58,226,242,229,246,229,227,249,242,233,
+ 236,236,233, 99,128, 4,193,227,249,242,233,236,236,233, 99,128,
+ 4, 22,100, 2, 35,136, 35,155,229,243,227,229,238,228,229,242,
+ 227,249,242,233,236,236,233, 99,128, 4,150,233,229,242,229,243,
+ 233,243,227,249,242,233,236,236,233, 99,128, 4,220,236,233,238,
+ 229,226,229,236,239,119,128, 30,148,237,239,238,239,243,240,225,
+ 227,101,128,255, 58,115, 2, 35,203, 35,210,237,225,236,108,128,
+ 247,122,244,242,239,235,101,128, 1,181, 97,158, 0, 97, 36, 26,
+ 38,154, 39, 4, 39, 68, 39,132, 39,196, 40, 4, 40, 68, 40,126,
+ 40,190, 41, 70, 41,217, 42,137, 42,237, 43, 17, 49,192, 49,229,
+ 50, 0, 50,225, 51, 7, 52, 96, 52,168, 53,123, 53,132, 54, 5,
+ 56, 13, 57, 3, 57, 50, 57,201, 57,215, 49,138, 39, 1, 36, 50,
+ 36,114, 36,154, 36,218, 37, 26, 37, 90, 37,154, 37,218, 38, 26,
+ 38, 90, 48,138, 39, 33, 36, 74, 36, 78, 36, 82, 36, 86, 36, 90,
+ 36, 94, 36, 98, 36,102, 36,106, 36,110, 48,128, 39, 94, 49,128,
+ 39, 97, 50,128, 39, 98, 51,128, 39, 99, 52,128, 39,100, 53,128,
+ 39, 16, 54,128, 39,101, 55,128, 39,102, 56,128, 39,103, 57,128,
+ 38, 96, 49,134, 38, 27, 36,130, 36,134, 36,138, 36,142, 36,146,
+ 36,150, 48,128, 38,101, 49,128, 38,102, 50,128, 38, 99, 55,128,
+ 39, 9, 56,128, 39, 8, 57,128, 39, 7, 50,138, 38, 30, 36,178,
+ 36,182, 36,186, 36,190, 36,194, 36,198, 36,202, 36,206, 36,210,
+ 36,214, 48,128, 36, 96, 49,128, 36, 97, 50,128, 36, 98, 51,128,
+ 36, 99, 52,128, 36,100, 53,128, 36,101, 54,128, 36,102, 55,128,
+ 36,103, 56,128, 36,104, 57,128, 36,105, 51,138, 39, 12, 36,242,
+ 36,246, 36,250, 36,254, 37, 2, 37, 6, 37, 10, 37, 14, 37, 18,
+ 37, 22, 48,128, 39,118, 49,128, 39,119, 50,128, 39,120, 51,128,
+ 39,121, 52,128, 39,122, 53,128, 39,123, 54,128, 39,124, 55,128,
+ 39,125, 56,128, 39,126, 57,128, 39,127, 52,138, 39, 13, 37, 50,
+ 37, 54, 37, 58, 37, 62, 37, 66, 37, 70, 37, 74, 37, 78, 37, 82,
+ 37, 86, 48,128, 39,128, 49,128, 39,129, 50,128, 39,130, 51,128,
+ 39,131, 52,128, 39,132, 53,128, 39,133, 54,128, 39,134, 55,128,
+ 39,135, 56,128, 39,136, 57,128, 39,137, 53,138, 39, 14, 37,114,
+ 37,118, 37,122, 37,126, 37,130, 37,134, 37,138, 37,142, 37,146,
+ 37,150, 48,128, 39,138, 49,128, 39,139, 50,128, 39,140, 51,128,
+ 39,141, 52,128, 39,142, 53,128, 39,143, 54,128, 39,144, 55,128,
+ 39,145, 56,128, 39,146, 57,128, 39,147, 54,138, 39, 15, 37,178,
+ 37,182, 37,186, 37,190, 37,194, 37,198, 37,202, 37,206, 37,210,
+ 37,214, 48,128, 39,148, 49,128, 33,146, 50,128, 39,163, 51,128,
+ 33,148, 52,128, 33,149, 53,128, 39,153, 54,128, 39,155, 55,128,
+ 39,156, 56,128, 39,157, 57,128, 39,158, 55,138, 39, 17, 37,242,
+ 37,246, 37,250, 37,254, 38, 2, 38, 6, 38, 10, 38, 14, 38, 18,
+ 38, 22, 48,128, 39,159, 49,128, 39,160, 50,128, 39,161, 51,128,
+ 39,162, 52,128, 39,164, 53,128, 39,165, 54,128, 39,166, 55,128,
+ 39,167, 56,128, 39,168, 57,128, 39,169, 56,138, 39, 18, 38, 50,
+ 38, 54, 38, 58, 38, 62, 38, 66, 38, 70, 38, 74, 38, 78, 38, 82,
+ 38, 86, 48,128, 39,171, 49,128, 39,173, 50,128, 39,175, 51,128,
+ 39,178, 52,128, 39,179, 53,128, 39,181, 54,128, 39,184, 55,128,
+ 39,186, 56,128, 39,187, 57,128, 39,188, 57,138, 39, 19, 38,114,
+ 38,118, 38,122, 38,126, 38,130, 38,134, 38,138, 38,142, 38,146,
+ 38,150, 48,128, 39,189, 49,128, 39,190, 50,128, 39,154, 51,128,
+ 39,170, 52,128, 39,182, 53,128, 39,185, 54,128, 39,152, 55,128,
+ 39,180, 56,128, 39,183, 57,128, 39,172, 50,138, 39, 2, 38,178,
+ 38,224, 38,228, 38,232, 38,236, 38,240, 38,244, 38,248, 38,252,
+ 39, 0, 48,135, 39, 20, 38,196, 38,200, 38,204, 38,208, 38,212,
+ 38,216, 38,220, 48,128, 39,174, 49,128, 39,177, 50,128, 39, 3,
+ 51,128, 39, 80, 52,128, 39, 82, 53,128, 39,110, 54,128, 39,112,
+ 49,128, 39, 21, 50,128, 39, 22, 51,128, 39, 23, 52,128, 39, 24,
+ 53,128, 39, 25, 54,128, 39, 26, 55,128, 39, 27, 56,128, 39, 28,
+ 57,128, 39, 34, 51,138, 39, 4, 39, 28, 39, 32, 39, 36, 39, 40,
+ 39, 44, 39, 48, 39, 52, 39, 56, 39, 60, 39, 64, 48,128, 39, 35,
+ 49,128, 39, 36, 50,128, 39, 37, 51,128, 39, 38, 52,128, 39, 39,
+ 53,128, 38, 5, 54,128, 39, 41, 55,128, 39, 42, 56,128, 39, 43,
+ 57,128, 39, 44, 52,138, 38, 14, 39, 92, 39, 96, 39,100, 39,104,
+ 39,108, 39,112, 39,116, 39,120, 39,124, 39,128, 48,128, 39, 45,
+ 49,128, 39, 46, 50,128, 39, 47, 51,128, 39, 48, 52,128, 39, 49,
+ 53,128, 39, 50, 54,128, 39, 51, 55,128, 39, 52, 56,128, 39, 53,
+ 57,128, 39, 54, 53,138, 39, 6, 39,156, 39,160, 39,164, 39,168,
+ 39,172, 39,176, 39,180, 39,184, 39,188, 39,192, 48,128, 39, 55,
+ 49,128, 39, 56, 50,128, 39, 57, 51,128, 39, 58, 52,128, 39, 59,
+ 53,128, 39, 60, 54,128, 39, 61, 55,128, 39, 62, 56,128, 39, 63,
+ 57,128, 39, 64, 54,138, 39, 29, 39,220, 39,224, 39,228, 39,232,
+ 39,236, 39,240, 39,244, 39,248, 39,252, 40, 0, 48,128, 39, 65,
+ 49,128, 39, 66, 50,128, 39, 67, 51,128, 39, 68, 52,128, 39, 69,
+ 53,128, 39, 70, 54,128, 39, 71, 55,128, 39, 72, 56,128, 39, 73,
+ 57,128, 39, 74, 55,138, 39, 30, 40, 28, 40, 32, 40, 36, 40, 40,
+ 40, 44, 40, 48, 40, 52, 40, 56, 40, 60, 40, 64, 48,128, 39, 75,
+ 49,128, 37,207, 50,128, 39, 77, 51,128, 37,160, 52,128, 39, 79,
+ 53,128, 39, 81, 54,128, 37,178, 55,128, 37,188, 56,128, 37,198,
+ 57,128, 39, 86, 56,137, 39, 31, 40, 90, 40, 94, 40, 98, 40,102,
+ 40,106, 40,110, 40,114, 40,118, 40,122, 49,128, 37,215, 50,128,
+ 39, 88, 51,128, 39, 89, 52,128, 39, 90, 53,128, 39,111, 54,128,
+ 39,113, 55,128, 39,114, 56,128, 39,115, 57,128, 39,104, 57,138,
+ 39, 32, 40,150, 40,154, 40,158, 40,162, 40,166, 40,170, 40,174,
+ 40,178, 40,182, 40,186, 48,128, 39,105, 49,128, 39,108, 50,128,
+ 39,109, 51,128, 39,106, 52,128, 39,107, 53,128, 39,116, 54,128,
+ 39,117, 55,128, 39, 91, 56,128, 39, 92, 57,128, 39, 93, 97, 7,
+ 40,206, 40,216, 40,223, 40,230, 40,255, 41, 15, 41, 26,226,229,
+ 238,231,225,236,105,128, 9,134,227,245,244,101,128, 0,225,228,
+ 229,246, 97,128, 9, 6,231,117, 2, 40,237, 40,246,234,225,242,
+ 225,244,105,128, 10,134,242,237,245,235,232,105,128, 10, 6,237,
+ 225,244,242,225,231,245,242,237,245,235,232,105,128, 10, 62,242,
+ 245,243,241,245,225,242,101,128, 51, 3,246,239,247,229,236,243,
+ 233,231,110, 3, 41, 42, 41, 52, 41, 59,226,229,238,231,225,236,
+ 105,128, 9,190,228,229,246, 97,128, 9, 62,231,245,234,225,242,
+ 225,244,105,128, 10,190, 98, 4, 41, 80, 41,121, 41,130, 41,140,
+ 226,242,229,246,233,225,244,233,239,110, 2, 41, 95, 41,110,237,
+ 225,242,235,225,242,237,229,238,233,225,110,128, 5, 95,243,233,
+ 231,238,228,229,246, 97,128, 9,112,229,238,231,225,236,105,128,
+ 9,133,239,240,239,237,239,230,111,128, 49, 26,242,229,246,101,
+ 134, 1, 3, 41,159, 41,167, 41,178, 41,189, 41,197, 41,209,225,
+ 227,245,244,101,128, 30,175,227,249,242,233,236,236,233, 99,128,
+ 4,209,228,239,244,226,229,236,239,119,128, 30,183,231,242,225,
+ 246,101,128, 30,177,232,239,239,235,225,226,239,246,101,128, 30,
+ 179,244,233,236,228,101,128, 30,181, 99, 4, 41,227, 41,234, 42,
+ 57, 42,127,225,242,239,110,128, 1,206,233,242, 99, 2, 41,242,
+ 41,247,236,101,128, 36,208,245,237,230,236,229,120,133, 0,226,
+ 42, 10, 42, 18, 42, 29, 42, 37, 42, 49,225,227,245,244,101,128,
+ 30,165,228,239,244,226,229,236,239,119,128, 30,173,231,242,225,
+ 246,101,128, 30,167,232,239,239,235,225,226,239,246,101,128, 30,
+ 169,244,233,236,228,101,128, 30,171,245,244,101,133, 0,180, 42,
+ 73, 42, 84, 42,101, 42,108, 42,117,226,229,236,239,247,227,237,
+ 98,128, 3, 23, 99, 2, 42, 90, 42, 95,237, 98,128, 3, 1,239,
+ 237, 98,128, 3, 1,228,229,246, 97,128, 9, 84,236,239,247,237,
+ 239,100,128, 2,207,244,239,238,229,227,237, 98,128, 3, 65,249,
+ 242,233,236,236,233, 99,128, 4, 48,100, 5, 42,149, 42,159, 42,
+ 173, 42,179, 42,213,226,236,231,242,225,246,101,128, 2, 1,228,
+ 225,235,231,245,242,237,245,235,232,105,128, 10,113,229,246, 97,
+ 128, 9, 5,233,229,242,229,243,233,115,130, 0,228, 42,193, 42,
+ 204,227,249,242,233,236,236,233, 99,128, 4,211,237,225,227,242,
+ 239,110,128, 1,223,239,116, 2, 42,220, 42,228,226,229,236,239,
+ 119,128, 30,161,237,225,227,242,239,110,128, 1,225,101,131, 0,
+ 230, 42,247, 42,255, 43, 8,225,227,245,244,101,128, 1,253,235,
+ 239,242,229,225,110,128, 49, 80,237,225,227,242,239,110,128, 1,
+ 227,230,233,105, 6, 43, 33, 43, 53, 45,246, 45,252, 46, 11, 49,
+ 111, 48, 2, 43, 39, 43, 46,176,178,176, 56,128, 32, 21,184,185,
+ 180, 49,128, 32,164,177, 48, 3, 43, 62, 45, 86, 45,221, 48, 9,
+ 43, 82, 43,102, 43,164, 43,226, 44, 32, 44, 94, 44,156, 44,218,
+ 45, 24, 49, 3, 43, 90, 43, 94, 43, 98, 55,128, 4, 16, 56,128,
+ 4, 17, 57,128, 4, 18, 50, 10, 43,124, 43,128, 43,132, 43,136,
+ 43,140, 43,144, 43,148, 43,152, 43,156, 43,160, 48,128, 4, 19,
+ 49,128, 4, 20, 50,128, 4, 21, 51,128, 4, 1, 52,128, 4, 22,
+ 53,128, 4, 23, 54,128, 4, 24, 55,128, 4, 25, 56,128, 4, 26,
+ 57,128, 4, 27, 51, 10, 43,186, 43,190, 43,194, 43,198, 43,202,
+ 43,206, 43,210, 43,214, 43,218, 43,222, 48,128, 4, 28, 49,128,
+ 4, 29, 50,128, 4, 30, 51,128, 4, 31, 52,128, 4, 32, 53,128,
+ 4, 33, 54,128, 4, 34, 55,128, 4, 35, 56,128, 4, 36, 57,128,
+ 4, 37, 52, 10, 43,248, 43,252, 44, 0, 44, 4, 44, 8, 44, 12,
+ 44, 16, 44, 20, 44, 24, 44, 28, 48,128, 4, 38, 49,128, 4, 39,
+ 50,128, 4, 40, 51,128, 4, 41, 52,128, 4, 42, 53,128, 4, 43,
+ 54,128, 4, 44, 55,128, 4, 45, 56,128, 4, 46, 57,128, 4, 47,
+ 53, 10, 44, 54, 44, 58, 44, 62, 44, 66, 44, 70, 44, 74, 44, 78,
+ 44, 82, 44, 86, 44, 90, 48,128, 4,144, 49,128, 4, 2, 50,128,
+ 4, 3, 51,128, 4, 4, 52,128, 4, 5, 53,128, 4, 6, 54,128,
+ 4, 7, 55,128, 4, 8, 56,128, 4, 9, 57,128, 4, 10, 54, 10,
+ 44,116, 44,120, 44,124, 44,128, 44,132, 44,136, 44,140, 44,144,
+ 44,148, 44,152, 48,128, 4, 11, 49,128, 4, 12, 50,128, 4, 14,
+ 51,128,246,196, 52,128,246,197, 53,128, 4, 48, 54,128, 4, 49,
+ 55,128, 4, 50, 56,128, 4, 51, 57,128, 4, 52, 55, 10, 44,178,
+ 44,182, 44,186, 44,190, 44,194, 44,198, 44,202, 44,206, 44,210,
+ 44,214, 48,128, 4, 53, 49,128, 4, 81, 50,128, 4, 54, 51,128,
+ 4, 55, 52,128, 4, 56, 53,128, 4, 57, 54,128, 4, 58, 55,128,
+ 4, 59, 56,128, 4, 60, 57,128, 4, 61, 56, 10, 44,240, 44,244,
+ 44,248, 44,252, 45, 0, 45, 4, 45, 8, 45, 12, 45, 16, 45, 20,
+ 48,128, 4, 62, 49,128, 4, 63, 50,128, 4, 64, 51,128, 4, 65,
+ 52,128, 4, 66, 53,128, 4, 67, 54,128, 4, 68, 55,128, 4, 69,
+ 56,128, 4, 70, 57,128, 4, 71, 57, 10, 45, 46, 45, 50, 45, 54,
+ 45, 58, 45, 62, 45, 66, 45, 70, 45, 74, 45, 78, 45, 82, 48,128,
+ 4, 72, 49,128, 4, 73, 50,128, 4, 74, 51,128, 4, 75, 52,128,
+ 4, 76, 53,128, 4, 77, 54,128, 4, 78, 55,128, 4, 79, 56,128,
+ 4,145, 57,128, 4, 82, 49, 4, 45, 96, 45,158, 45,163, 45,189,
+ 48, 10, 45,118, 45,122, 45,126, 45,130, 45,134, 45,138, 45,142,
+ 45,146, 45,150, 45,154, 48,128, 4, 83, 49,128, 4, 84, 50,128,
+ 4, 85, 51,128, 4, 86, 52,128, 4, 87, 53,128, 4, 88, 54,128,
+ 4, 89, 55,128, 4, 90, 56,128, 4, 91, 57,128, 4, 92,177, 48,
+ 128, 4, 94, 52, 4, 45,173, 45,177, 45,181, 45,185, 53,128, 4,
+ 15, 54,128, 4, 98, 55,128, 4,114, 56,128, 4,116, 57, 5, 45,
+ 201, 45,205, 45,209, 45,213, 45,217, 50,128,246,198, 51,128, 4,
+ 95, 52,128, 4, 99, 53,128, 4,115, 54,128, 4,117, 56, 2, 45,
+ 227, 45,241, 51, 2, 45,233, 45,237, 49,128,246,199, 50,128,246,
+ 200,180, 54,128, 4,217,178,185, 57,128, 32, 14,179, 48, 2, 46,
+ 3, 46, 7, 48,128, 32, 15, 49,128, 32, 13,181, 55, 7, 46, 28,
+ 46, 98, 47,163, 47,240, 48,197, 49, 34, 49,105, 51, 2, 46, 34,
+ 46, 48, 56, 2, 46, 40, 46, 44, 49,128, 6,106, 56,128, 6, 12,
+ 57, 8, 46, 66, 46, 70, 46, 74, 46, 78, 46, 82, 46, 86, 46, 90,
+ 46, 94, 50,128, 6, 96, 51,128, 6, 97, 52,128, 6, 98, 53,128,
+ 6, 99, 54,128, 6,100, 55,128, 6,101, 56,128, 6,102, 57,128,
+ 6,103, 52, 7, 46,114, 46,146, 46,208, 47, 14, 47, 46, 47,102,
+ 47,158, 48, 5, 46,126, 46,130, 46,134, 46,138, 46,142, 48,128,
+ 6,104, 49,128, 6,105, 51,128, 6, 27, 55,128, 6, 31, 57,128,
+ 6, 33, 49, 10, 46,168, 46,172, 46,176, 46,180, 46,184, 46,188,
+ 46,192, 46,196, 46,200, 46,204, 48,128, 6, 34, 49,128, 6, 35,
+ 50,128, 6, 36, 51,128, 6, 37, 52,128, 6, 38, 53,128, 6, 39,
+ 54,128, 6, 40, 55,128, 6, 41, 56,128, 6, 42, 57,128, 6, 43,
+ 50, 10, 46,230, 46,234, 46,238, 46,242, 46,246, 46,250, 46,254,
+ 47, 2, 47, 6, 47, 10, 48,128, 6, 44, 49,128, 6, 45, 50,128,
+ 6, 46, 51,128, 6, 47, 52,128, 6, 48, 53,128, 6, 49, 54,128,
+ 6, 50, 55,128, 6, 51, 56,128, 6, 52, 57,128, 6, 53, 51, 5,
+ 47, 26, 47, 30, 47, 34, 47, 38, 47, 42, 48,128, 6, 54, 49,128,
+ 6, 55, 50,128, 6, 56, 51,128, 6, 57, 52,128, 6, 58, 52, 9,
+ 47, 66, 47, 70, 47, 74, 47, 78, 47, 82, 47, 86, 47, 90, 47, 94,
+ 47, 98, 48,128, 6, 64, 49,128, 6, 65, 50,128, 6, 66, 51,128,
+ 6, 67, 52,128, 6, 68, 53,128, 6, 69, 54,128, 6, 70, 56,128,
+ 6, 72, 57,128, 6, 73, 53, 9, 47,122, 47,126, 47,130, 47,134,
+ 47,138, 47,142, 47,146, 47,150, 47,154, 48,128, 6, 74, 49,128,
+ 6, 75, 50,128, 6, 76, 51,128, 6, 77, 52,128, 6, 78, 53,128,
+ 6, 79, 54,128, 6, 80, 55,128, 6, 81, 56,128, 6, 82,183, 48,
+ 128, 6, 71, 53, 3, 47,171, 47,203, 47,235, 48, 5, 47,183, 47,
+ 187, 47,191, 47,195, 47,199, 53,128, 6,164, 54,128, 6,126, 55,
+ 128, 6,134, 56,128, 6,152, 57,128, 6,175, 49, 5, 47,215, 47,
+ 219, 47,223, 47,227, 47,231, 49,128, 6,121, 50,128, 6,136, 51,
+ 128, 6,145, 52,128, 6,186, 57,128, 6,210,179, 52,128, 6,213,
+ 54, 7, 48, 0, 48, 5, 48, 10, 48, 15, 48, 53, 48,115, 48,177,
+ 179, 54,128, 32,170,180, 53,128, 5,190,181, 56,128, 5,195, 54,
+ 6, 48, 29, 48, 33, 48, 37, 48, 41, 48, 45, 48, 49, 52,128, 5,
+ 208, 53,128, 5,209, 54,128, 5,210, 55,128, 5,211, 56,128, 5,
+ 212, 57,128, 5,213, 55, 10, 48, 75, 48, 79, 48, 83, 48, 87, 48,
+ 91, 48, 95, 48, 99, 48,103, 48,107, 48,111, 48,128, 5,214, 49,
+ 128, 5,215, 50,128, 5,216, 51,128, 5,217, 52,128, 5,218, 53,
+ 128, 5,219, 54,128, 5,220, 55,128, 5,221, 56,128, 5,222, 57,
+ 128, 5,223, 56, 10, 48,137, 48,141, 48,145, 48,149, 48,153, 48,
+ 157, 48,161, 48,165, 48,169, 48,173, 48,128, 5,224, 49,128, 5,
+ 225, 50,128, 5,226, 51,128, 5,227, 52,128, 5,228, 53,128, 5,
+ 229, 54,128, 5,230, 55,128, 5,231, 56,128, 5,232, 57,128, 5,
+ 233, 57, 3, 48,185, 48,189, 48,193, 48,128, 5,234, 52,128,251,
+ 42, 53,128,251, 43, 55, 4, 48,207, 48,221, 48,241, 48,246, 48,
+ 2, 48,213, 48,217, 48,128,251, 75, 53,128,251, 31, 49, 3, 48,
+ 229, 48,233, 48,237, 54,128, 5,240, 55,128, 5,241, 56,128, 5,
+ 242,178, 51,128,251, 53, 57, 7, 49, 6, 49, 10, 49, 14, 49, 18,
+ 49, 22, 49, 26, 49, 30, 51,128, 5,180, 52,128, 5,181, 53,128,
+ 5,182, 54,128, 5,187, 55,128, 5,184, 56,128, 5,183, 57,128,
+ 5,176, 56, 3, 49, 42, 49, 86, 49, 91, 48, 7, 49, 58, 49, 62,
+ 49, 66, 49, 70, 49, 74, 49, 78, 49, 82, 48,128, 5,178, 49,128,
+ 5,177, 50,128, 5,179, 51,128, 5,194, 52,128, 5,193, 54,128,
+ 5,185, 55,128, 5,188,179, 57,128, 5,189, 52, 2, 49, 97, 49,
+ 101, 49,128, 5,191, 50,128, 5,192,185,178, 57,128, 2,188, 54,
+ 3, 49,119, 49,178, 49,185, 49, 4, 49,129, 49,145, 49,151, 49,
+ 172, 50, 2, 49,135, 49,140,180, 56,128, 33, 5,184, 57,128, 33,
+ 19,179,181, 50,128, 33, 22,181, 55, 3, 49,160, 49,164, 49,168,
+ 51,128, 32, 44, 52,128, 32, 45, 53,128, 32, 46,182,182, 52,128,
+ 32, 12,179,177,182, 55,128, 6,109,180,185,179, 55,128, 2,189,
+ 103, 2, 49,198, 49,205,242,225,246,101,128, 0,224,117, 2, 49,
+ 211, 49,220,234,225,242,225,244,105,128, 10,133,242,237,245,235,
+ 232,105,128, 10, 5,104, 2, 49,235, 49,245,233,242,225,231,225,
+ 238, 97,128, 48, 66,239,239,235,225,226,239,246,101,128, 30,163,
+ 105, 7, 50, 16, 50, 41, 50, 48, 50, 60, 50, 85, 50,101, 50,181,
+ 98, 2, 50, 22, 50, 31,229,238,231,225,236,105,128, 9,144,239,
+ 240,239,237,239,230,111,128, 49, 30,228,229,246, 97,128, 9, 16,
+ 229,227,249,242,233,236,236,233, 99,128, 4,213,231,117, 2, 50,
+ 67, 50, 76,234,225,242,225,244,105,128, 10,144,242,237,245,235,
+ 232,105,128, 10, 16,237,225,244,242,225,231,245,242,237,245,235,
+ 232,105,128, 10, 72,110, 5, 50,113, 50,122, 50,136, 50,152, 50,
+ 167,225,242,225,226,233, 99,128, 6, 57,230,233,238,225,236,225,
+ 242,225,226,233, 99,128,254,202,233,238,233,244,233,225,236,225,
+ 242,225,226,233, 99,128,254,203,237,229,228,233,225,236,225,242,
+ 225,226,233, 99,128,254,204,246,229,242,244,229,228,226,242,229,
+ 246,101,128, 2, 3,246,239,247,229,236,243,233,231,110, 3, 50,
+ 197, 50,207, 50,214,226,229,238,231,225,236,105,128, 9,200,228,
+ 229,246, 97,128, 9, 72,231,245,234,225,242,225,244,105,128, 10,
+ 200,107, 2, 50,231, 50,255,225,244,225,235,225,238, 97,129, 48,
+ 162, 50,243,232,225,236,230,247,233,228,244,104,128,255,113,239,
+ 242,229,225,110,128, 49, 79,108, 3, 51, 15, 52, 71, 52, 80,101,
+ 2, 51, 21, 52, 66,102,136, 5,208, 51, 41, 51, 50, 51, 65, 51,
+ 79, 51,168, 51,182, 52, 37, 52, 51,225,242,225,226,233, 99,128,
+ 6, 39,228,225,231,229,243,232,232,229,226,242,229,119,128,251,
+ 48,230,233,238,225,236,225,242,225,226,233, 99,128,254,142,104,
+ 2, 51, 85, 51,160,225,237,250, 97, 2, 51, 94, 51,127,225,226,
+ 239,246,101, 2, 51,104, 51,113,225,242,225,226,233, 99,128, 6,
+ 35,230,233,238,225,236,225,242,225,226,233, 99,128,254,132,226,
+ 229,236,239,119, 2, 51,137, 51,146,225,242,225,226,233, 99,128,
+ 6, 37,230,233,238,225,236,225,242,225,226,233, 99,128,254,136,
+ 229,226,242,229,119,128, 5,208,236,225,237,229,228,232,229,226,
+ 242,229,119,128,251, 79,237, 97, 2, 51,189, 51,225,228,228,225,
+ 225,226,239,246,101, 2, 51,202, 51,211,225,242,225,226,233, 99,
+ 128, 6, 34,230,233,238,225,236,225,242,225,226,233, 99,128,254,
+ 130,235,243,245,242, 97, 4, 51,239, 51,248, 52, 6, 52, 22,225,
+ 242,225,226,233, 99,128, 6, 73,230,233,238,225,236,225,242,225,
+ 226,233, 99,128,254,240,233,238,233,244,233,225,236,225,242,225,
+ 226,233, 99,128,254,243,237,229,228,233,225,236,225,242,225,226,
+ 233, 99,128,254,244,240,225,244,225,232,232,229,226,242,229,119,
+ 128,251, 46,241,225,237,225,244,243,232,229,226,242,229,119,128,
+ 251, 47,240,104,128, 33, 53,236,229,241,245,225,108,128, 34, 76,
+ 240,232, 97,129, 3,177, 52, 88,244,239,238,239,115,128, 3,172,
+ 109, 4, 52,106, 52,114, 52,125, 52,159,225,227,242,239,110,128,
+ 1, 1,239,238,239,243,240,225,227,101,128,255, 65,240,229,242,
+ 243,225,238,100,130, 0, 38, 52,139, 52,151,237,239,238,239,243,
+ 240,225,227,101,128,255, 6,243,237,225,236,108,128,247, 38,243,
+ 241,245,225,242,101,128, 51,194,110, 4, 52,178, 52,189, 53, 55,
+ 53, 65,226,239,240,239,237,239,230,111,128, 49, 34,103, 4, 52,
+ 199, 52,210, 52,224, 53, 47,226,239,240,239,237,239,230,111,128,
+ 49, 36,235,232,225,238,235,232,245,244,232,225,105,128, 14, 90,
+ 236,101,131, 34, 32, 52,235, 53, 32, 53, 39,226,242,225,227,235,
+ 229,116, 2, 52,247, 53, 11,236,229,230,116,129, 48, 8, 53, 0,
+ 246,229,242,244,233,227,225,108,128,254, 63,242,233,231,232,116,
+ 129, 48, 9, 53, 21,246,229,242,244,233,227,225,108,128,254, 64,
+ 236,229,230,116,128, 35, 41,242,233,231,232,116,128, 35, 42,243,
+ 244,242,239,109,128, 33, 43,239,244,229,236,229,233, 97,128, 3,
+ 135,117, 2, 53, 71, 53, 83,228,225,244,244,225,228,229,246, 97,
+ 128, 9, 82,243,246,225,242, 97, 3, 53, 95, 53,105, 53,112,226,
+ 229,238,231,225,236,105,128, 9,130,228,229,246, 97,128, 9, 2,
+ 231,245,234,225,242,225,244,105,128, 10,130,239,231,239,238,229,
+ 107,128, 1, 5,112, 3, 53,140, 53,164, 53,194, 97, 2, 53,146,
+ 53,158,225,244,239,243,241,245,225,242,101,128, 51, 0,242,229,
+ 110,128, 36,156,239,243,244,242,239,240,232,101, 2, 53,177, 53,
+ 188,225,242,237,229,238,233,225,110,128, 5, 90,237,239,100,128,
+ 2,188,112, 2, 53,200, 53,205,236,101,128,248,255,242,111, 2,
+ 53,212, 53,220,225,227,232,229,115,128, 34, 80,120, 2, 53,226,
+ 53,246,229,241,245,225,108,129, 34, 72, 53,236,239,242,233,237,
+ 225,231,101,128, 34, 82,233,237,225,244,229,236,249,229,241,245,
+ 225,108,128, 34, 69,114, 4, 54, 15, 54, 42, 54, 46, 54, 91,225,
+ 229, 97, 2, 54, 23, 54, 33,229,235,239,242,229,225,110,128, 49,
+ 142,235,239,242,229,225,110,128, 49,141, 99,128, 35, 18,105, 2,
+ 54, 52, 54, 66,231,232,244,232,225,236,230,242,233,238,103,128,
+ 30,154,238,103,130, 0,229, 54, 75, 54, 83,225,227,245,244,101,
+ 128, 1,251,226,229,236,239,119,128, 30, 1,242,239,119, 8, 54,
+ 111, 54,118, 54,247, 55, 57, 55,107, 55,162, 55,185, 56, 4,226,
+ 239,244,104,128, 33,148,100, 3, 54,126, 54,165, 54,212,225,243,
+ 104, 4, 54,138, 54,145, 54,152, 54,160,228,239,247,110,128, 33,
+ 227,236,229,230,116,128, 33,224,242,233,231,232,116,128, 33,226,
+ 245,112,128, 33,225,226,108, 5, 54,178, 54,185, 54,192, 54,199,
+ 54,207,226,239,244,104,128, 33,212,228,239,247,110,128, 33,211,
+ 236,229,230,116,128, 33,208,242,233,231,232,116,128, 33,210,245,
+ 112,128, 33,209,239,247,110,131, 33,147, 54,224, 54,231, 54,239,
+ 236,229,230,116,128, 33,153,242,233,231,232,116,128, 33,152,247,
+ 232,233,244,101,128, 33,233,104, 2, 54,253, 55, 48,229,225,100,
+ 4, 55, 9, 55, 19, 55, 29, 55, 40,228,239,247,238,237,239,100,
+ 128, 2,197,236,229,230,244,237,239,100,128, 2,194,242,233,231,
+ 232,244,237,239,100,128, 2,195,245,240,237,239,100,128, 2,196,
+ 239,242,233,250,229,120,128,248,231,236,229,230,116,131, 33,144,
+ 55, 70, 55, 87, 55, 99,228,226,108,129, 33,208, 55, 78,243,244,
+ 242,239,235,101,128, 33,205,239,246,229,242,242,233,231,232,116,
+ 128, 33,198,247,232,233,244,101,128, 33,230,242,233,231,232,116,
+ 132, 33,146, 55,123, 55,135, 55,143, 55,154,228,226,236,243,244,
+ 242,239,235,101,128, 33,207,232,229,225,246,121,128, 39,158,239,
+ 246,229,242,236,229,230,116,128, 33,196,247,232,233,244,101,128,
+ 33,232,244,225, 98, 2, 55,170, 55,177,236,229,230,116,128, 33,
+ 228,242,233,231,232,116,128, 33,229,245,112,132, 33,145, 55,198,
+ 55,226, 55,244, 55,252,100, 2, 55,204, 55,216,110,129, 33,149,
+ 55,210,226,243,101,128, 33,168,239,247,238,226,225,243,101,128,
+ 33,168,236,229,230,116,129, 33,150, 55,235,239,230,228,239,247,
+ 110,128, 33,197,242,233,231,232,116,128, 33,151,247,232,233,244,
+ 101,128, 33,231,246,229,242,244,229,120,128,248,230,115, 5, 56,
+ 25, 56,101, 56,146, 56,229, 56,239, 99, 2, 56, 31, 56, 83,233,
+ 105, 2, 56, 38, 56, 61,227,233,242,227,245,109,129, 0, 94, 56,
+ 49,237,239,238,239,243,240,225,227,101,128,255, 62,244,233,236,
+ 228,101,129, 0,126, 56, 71,237,239,238,239,243,240,225,227,101,
+ 128,255, 94,242,233,240,116,129, 2, 81, 56, 92,244,245,242,238,
+ 229,100,128, 2, 82,237,225,236,108, 2, 56,110, 56,121,232,233,
+ 242,225,231,225,238, 97,128, 48, 65,235,225,244,225,235,225,238,
+ 97,129, 48,161, 56,134,232,225,236,230,247,233,228,244,104,128,
+ 255,103,244,229,242,233,115, 2, 56,156, 56,225,107,131, 0, 42,
+ 56,166, 56,194, 56,217, 97, 2, 56,172, 56,186,236,244,239,238,
+ 229,225,242,225,226,233, 99,128, 6,109,242,225,226,233, 99,128,
+ 6,109,109, 2, 56,200, 56,206,225,244,104,128, 34, 23,239,238,
+ 239,243,240,225,227,101,128,255, 10,243,237,225,236,108,128,254,
+ 97,109,128, 32, 66,245,240,229,242,233,239,114,128,246,233,249,
+ 237,240,244,239,244,233,227,225,236,236,249,229,241,245,225,108,
+ 128, 34, 67,116,132, 0, 64, 57, 15, 57, 22, 57, 34, 57, 42,233,
+ 236,228,101,128, 0,227,237,239,238,239,243,240,225,227,101,128,
+ 255, 32,243,237,225,236,108,128,254,107,245,242,238,229,100,128,
+ 2, 80,117, 6, 57, 64, 57, 89, 57, 96, 57,121, 57,141, 57,157,
+ 98, 2, 57, 70, 57, 79,229,238,231,225,236,105,128, 9,148,239,
+ 240,239,237,239,230,111,128, 49, 32,228,229,246, 97,128, 9, 20,
+ 231,117, 2, 57,103, 57,112,234,225,242,225,244,105,128, 10,148,
+ 242,237,245,235,232,105,128, 10, 20,236,229,238,231,244,232,237,
+ 225,242,235,226,229,238,231,225,236,105,128, 9,215,237,225,244,
+ 242,225,231,245,242,237,245,235,232,105,128, 10, 76,246,239,247,
+ 229,236,243,233,231,110, 3, 57,173, 57,183, 57,190,226,229,238,
+ 231,225,236,105,128, 9,204,228,229,246, 97,128, 9, 76,231,245,
+ 234,225,242,225,244,105,128, 10,204,246,225,231,242,225,232,225,
+ 228,229,246, 97,128, 9, 61,121, 2, 57,221, 57,233,226,225,242,
+ 237,229,238,233,225,110,128, 5, 97,233,110,130, 5,226, 57,242,
+ 58, 1,225,236,244,239,238,229,232,229,226,242,229,119,128,251,
+ 32,232,229,226,242,229,119,128, 5,226, 98,144, 0, 98, 58, 46,
+ 58,181, 58,192, 58,201, 58,226, 60, 11, 60, 73, 60,146, 62, 72,
+ 62, 84, 62,127, 62,135, 62,145, 64, 15, 64, 39, 64, 48, 97, 7,
+ 58, 62, 58, 72, 58, 96, 58,103, 58,128, 58,152, 58,163,226,229,
+ 238,231,225,236,105,128, 9,172,227,235,243,236,225,243,104,129,
+ 0, 92, 58, 84,237,239,238,239,243,240,225,227,101,128,255, 60,
+ 228,229,246, 97,128, 9, 44,231,117, 2, 58,110, 58,119,234,225,
+ 242,225,244,105,128, 10,172,242,237,245,235,232,105,128, 10, 44,
+ 104, 2, 58,134, 58,144,233,242,225,231,225,238, 97,128, 48,112,
+ 244,244,232,225,105,128, 14, 63,235,225,244,225,235,225,238, 97,
+ 128, 48,208,114,129, 0,124, 58,169,237,239,238,239,243,240,225,
+ 227,101,128,255, 92,226,239,240,239,237,239,230,111,128, 49, 5,
+ 227,233,242,227,236,101,128, 36,209,228,239,116, 2, 58,209, 58,
+ 218,225,227,227,229,238,116,128, 30, 3,226,229,236,239,119,128,
+ 30, 5,101, 6, 58,240, 59, 5, 59, 28, 59,170, 59,181, 59,193,
+ 225,237,229,228,243,233,248,244,229,229,238,244,232,238,239,244,
+ 229,115,128, 38,108, 99, 2, 59, 11, 59, 18,225,245,243,101,128,
+ 34, 53,249,242,233,236,236,233, 99,128, 4, 49,104, 5, 59, 40,
+ 59, 49, 59, 63, 59, 93, 59,152,225,242,225,226,233, 99,128, 6,
+ 40,230,233,238,225,236,225,242,225,226,233, 99,128,254,144,105,
+ 2, 59, 69, 59, 84,238,233,244,233,225,236,225,242,225,226,233,
+ 99,128,254,145,242,225,231,225,238, 97,128, 48,121,237,101, 2,
+ 59,100, 59,113,228,233,225,236,225,242,225,226,233, 99,128,254,
+ 146,229,237,105, 2, 59,121, 59,136,238,233,244,233,225,236,225,
+ 242,225,226,233, 99,128,252,159,243,239,236,225,244,229,228,225,
+ 242,225,226,233, 99,128,252, 8,238,239,239,238,230,233,238,225,
+ 236,225,242,225,226,233, 99,128,252,109,235,225,244,225,235,225,
+ 238, 97,128, 48,217,238,225,242,237,229,238,233,225,110,128, 5,
+ 98,116,132, 5,209, 59,205, 59,225, 59,245, 59,254, 97,129, 3,
+ 178, 59,211,243,249,237,226,239,236,231,242,229,229,107,128, 3,
+ 208,228,225,231,229,243,104,129,251, 49, 59,236,232,229,226,242,
+ 229,119,128,251, 49,232,229,226,242,229,119,128, 5,209,242,225,
+ 230,229,232,229,226,242,229,119,128,251, 76,104, 2, 60, 17, 60,
+ 67, 97, 3, 60, 25, 60, 35, 60, 42,226,229,238,231,225,236,105,
+ 128, 9,173,228,229,246, 97,128, 9, 45,231,117, 2, 60, 49, 60,
+ 58,234,225,242,225,244,105,128, 10,173,242,237,245,235,232,105,
+ 128, 10, 45,239,239,107,128, 2, 83,105, 5, 60, 85, 60, 96, 60,
+ 107, 60,121, 60,135,232,233,242,225,231,225,238, 97,128, 48,115,
+ 235,225,244,225,235,225,238, 97,128, 48,211,236,225,226,233,225,
+ 236,227,236,233,227,107,128, 2,152,238,228,233,231,245,242,237,
+ 245,235,232,105,128, 10, 2,242,245,243,241,245,225,242,101,128,
+ 51, 49,108, 3, 60,154, 62, 55, 62, 66, 97, 2, 60,160, 62, 50,
+ 227,107, 6, 60,175, 60,184, 60,221, 61,114, 61,169, 61,221,227,
+ 233,242,227,236,101,128, 37,207,100, 2, 60,190, 60,199,233,225,
+ 237,239,238,100,128, 37,198,239,247,238,240,239,233,238,244,233,
+ 238,231,244,242,233,225,238,231,236,101,128, 37,188,108, 2, 60,
+ 227, 61, 74,101, 2, 60,233, 61, 13,230,244,240,239,233,238,244,
+ 233,238,103, 2, 60,248, 61, 2,240,239,233,238,244,229,114,128,
+ 37,196,244,242,233,225,238,231,236,101,128, 37,192,238,244,233,
+ 227,245,236,225,242,226,242,225,227,235,229,116, 2, 61, 33, 61,
+ 53,236,229,230,116,129, 48, 16, 61, 42,246,229,242,244,233,227,
+ 225,108,128,254, 59,242,233,231,232,116,129, 48, 17, 61, 63,246,
+ 229,242,244,233,227,225,108,128,254, 60,239,247,229,114, 2, 61,
+ 83, 61, 98,236,229,230,244,244,242,233,225,238,231,236,101,128,
+ 37,227,242,233,231,232,244,244,242,233,225,238,231,236,101,128,
+ 37,226,114, 2, 61,120, 61,131,229,227,244,225,238,231,236,101,
+ 128, 37,172,233,231,232,244,240,239,233,238,244,233,238,103, 2,
+ 61,148, 61,158,240,239,233,238,244,229,114,128, 37,186,244,242,
+ 233,225,238,231,236,101,128, 37,182,115, 3, 61,177, 61,207, 61,
+ 215,109, 2, 61,183, 61,195,225,236,236,243,241,245,225,242,101,
+ 128, 37,170,233,236,233,238,231,230,225,227,101,128, 38, 59,241,
+ 245,225,242,101,128, 37,160,244,225,114,128, 38, 5,245,240,112,
+ 2, 61,229, 62, 11,229,114, 2, 61,236, 61,251,236,229,230,244,
+ 244,242,233,225,238,231,236,101,128, 37,228,242,233,231,232,244,
+ 244,242,233,225,238,231,236,101,128, 37,229,239,233,238,244,233,
+ 238,103, 2, 62, 23, 62, 39,243,237,225,236,236,244,242,233,225,
+ 238,231,236,101,128, 37,180,244,242,233,225,238,231,236,101,128,
+ 37,178,238,107,128, 36, 35,233,238,229,226,229,236,239,119,128,
+ 30, 7,239,227,107,128, 37,136,237,239,238,239,243,240,225,227,
+ 101,128,255, 66,111, 3, 62, 92, 62,105, 62,116,226,225,233,237,
+ 225,233,244,232,225,105,128, 14, 26,232,233,242,225,231,225,238,
+ 97,128, 48,124,235,225,244,225,235,225,238, 97,128, 48,220,240,
+ 225,242,229,110,128, 36,157,241,243,241,245,225,242,101,128, 51,
+ 195,114, 4, 62,155, 63,149, 63,222, 64, 5,225, 99, 2, 62,162,
+ 63, 56,101, 3, 62,170, 62,175, 62,243,229,120,128,248,244,236,
+ 229,230,116,133, 0,123, 62,192, 62,197, 62,219, 62,227, 62,232,
+ 226,116,128,248,243,109, 2, 62,203, 62,208,233,100,128,248,242,
+ 239,238,239,243,240,225,227,101,128,255, 91,243,237,225,236,108,
+ 128,254, 91,244,112,128,248,241,246,229,242,244,233,227,225,108,
+ 128,254, 55,242,233,231,232,116,133, 0,125, 63, 5, 63, 10, 63,
+ 32, 63, 40, 63, 45,226,116,128,248,254,109, 2, 63, 16, 63, 21,
+ 233,100,128,248,253,239,238,239,243,240,225,227,101,128,255, 93,
+ 243,237,225,236,108,128,254, 92,244,112,128,248,252,246,229,242,
+ 244,233,227,225,108,128,254, 56,235,229,116, 2, 63, 64, 63,106,
+ 236,229,230,116,132, 0, 91, 63, 79, 63, 84, 63, 89, 63,101,226,
+ 116,128,248,240,229,120,128,248,239,237,239,238,239,243,240,225,
+ 227,101,128,255, 59,244,112,128,248,238,242,233,231,232,116,132,
+ 0, 93, 63,122, 63,127, 63,132, 63,144,226,116,128,248,251,229,
+ 120,128,248,250,237,239,238,239,243,240,225,227,101,128,255, 61,
+ 244,112,128,248,249,229,246,101,131, 2,216, 63,161, 63,172, 63,
+ 178,226,229,236,239,247,227,237, 98,128, 3, 46,227,237, 98,128,
+ 3, 6,233,238,246,229,242,244,229,100, 3, 63,193, 63,204, 63,
+ 210,226,229,236,239,247,227,237, 98,128, 3, 47,227,237, 98,128,
+ 3, 17,228,239,245,226,236,229,227,237, 98,128, 3, 97,233,228,
+ 231,101, 2, 63,231, 63,242,226,229,236,239,247,227,237, 98,128,
+ 3, 42,233,238,246,229,242,244,229,228,226,229,236,239,247,227,
+ 237, 98,128, 3, 58,239,235,229,238,226,225,114,128, 0,166,115,
+ 2, 64, 21, 64, 29,244,242,239,235,101,128, 1,128,245,240,229,
+ 242,233,239,114,128,246,234,244,239,240,226,225,114,128, 1,131,
+ 117, 3, 64, 56, 64, 67, 64, 78,232,233,242,225,231,225,238, 97,
+ 128, 48,118,235,225,244,225,235,225,238, 97,128, 48,214,236,108,
+ 2, 64, 85, 64,115,229,116,130, 32, 34, 64, 94, 64,104,233,238,
+ 246,229,242,243,101,128, 37,216,239,240,229,242,225,244,239,114,
+ 128, 34, 25,243,229,249,101,128, 37,206, 99,143, 0, 99, 64,156,
+ 65,105, 65,116, 65,180, 65,211, 66, 48, 67,215, 68,199, 69, 43,
+ 69, 92, 72, 84, 72, 92, 72,102, 72,114, 72,147, 97, 9, 64,176,
+ 64,187, 64,197, 64,204, 64,211, 64,236, 64,246, 65, 42, 65, 51,
+ 225,242,237,229,238,233,225,110,128, 5,110,226,229,238,231,225,
+ 236,105,128, 9,154,227,245,244,101,128, 1, 7,228,229,246, 97,
+ 128, 9, 26,231,117, 2, 64,218, 64,227,234,225,242,225,244,105,
+ 128, 10,154,242,237,245,235,232,105,128, 10, 26,236,243,241,245,
+ 225,242,101,128, 51,136,238,228,242,225,226,233,238,228,117, 4,
+ 65, 8, 65, 18, 65, 24, 65, 31,226,229,238,231,225,236,105,128,
+ 9,129,227,237, 98,128, 3, 16,228,229,246, 97,128, 9, 1,231,
+ 245,234,225,242,225,244,105,128, 10,129,240,243,236,239,227,107,
+ 128, 33,234,114, 3, 65, 59, 65, 65, 65, 91,229,239,102,128, 33,
+ 5,239,110,130, 2,199, 65, 74, 65, 85,226,229,236,239,247,227,
+ 237, 98,128, 3, 44,227,237, 98,128, 3, 12,242,233,225,231,229,
+ 242,229,244,245,242,110,128, 33,181,226,239,240,239,237,239,230,
+ 111,128, 49, 24, 99, 4, 65,126, 65,133, 65,152, 65,174,225,242,
+ 239,110,128, 1, 13,229,228,233,236,236, 97,129, 0,231, 65,144,
+ 225,227,245,244,101,128, 30, 9,233,242, 99, 2, 65,160, 65,165,
+ 236,101,128, 36,210,245,237,230,236,229,120,128, 1, 9,245,242,
+ 108,128, 2, 85,100, 2, 65,186, 65,202,239,116,129, 1, 11, 65,
+ 193,225,227,227,229,238,116,128, 1, 11,243,241,245,225,242,101,
+ 128, 51,197,101, 2, 65,217, 65,233,228,233,236,236, 97,129, 0,
+ 184, 65,227,227,237, 98,128, 3, 39,238,116,132, 0,162, 65,246,
+ 66, 14, 66, 26, 66, 37,105, 2, 65,252, 66, 4,231,242,225,228,
+ 101,128, 33, 3,238,230,229,242,233,239,114,128,246,223,237,239,
+ 238,239,243,240,225,227,101,128,255,224,239,236,228,243,244,249,
+ 236,101,128,247,162,243,245,240,229,242,233,239,114,128,246,224,
+ 104, 5, 66, 60, 66,123, 66,134, 67, 62, 67,154, 97, 4, 66, 70,
+ 66, 81, 66, 91, 66, 98,225,242,237,229,238,233,225,110,128, 5,
+ 121,226,229,238,231,225,236,105,128, 9,155,228,229,246, 97,128,
+ 9, 27,231,117, 2, 66,105, 66,114,234,225,242,225,244,105,128,
+ 10,155,242,237,245,235,232,105,128, 10, 27,226,239,240,239,237,
+ 239,230,111,128, 49, 20,101, 6, 66,148, 66,168, 66,192, 67, 4,
+ 67, 16, 67, 37,225,226,235,232,225,243,233,225,238,227,249,242,
+ 233,236,236,233, 99,128, 4,189, 99, 2, 66,174, 66,182,235,237,
+ 225,242,107,128, 39, 19,249,242,233,236,236,233, 99,128, 4, 71,
+ 100, 2, 66,198, 66,242,229,243,227,229,238,228,229,114, 2, 66,
+ 211, 66,231,225,226,235,232,225,243,233,225,238,227,249,242,233,
+ 236,236,233, 99,128, 4,191,227,249,242,233,236,236,233, 99,128,
+ 4,183,233,229,242,229,243,233,243,227,249,242,233,236,236,233,
+ 99,128, 4,245,232,225,242,237,229,238,233,225,110,128, 5,115,
+ 235,232,225,235,225,243,243,233,225,238,227,249,242,233,236,236,
+ 233, 99,128, 4,204,246,229,242,244,233,227,225,236,243,244,242,
+ 239,235,229,227,249,242,233,236,236,233, 99,128, 4,185,105,129,
+ 3,199, 67, 68,229,245,227,104, 4, 67, 81, 67,116, 67,131, 67,
+ 140, 97, 2, 67, 87, 67,102,227,233,242,227,236,229,235,239,242,
+ 229,225,110,128, 50,119,240,225,242,229,238,235,239,242,229,225,
+ 110,128, 50, 23,227,233,242,227,236,229,235,239,242,229,225,110,
+ 128, 50,105,235,239,242,229,225,110,128, 49, 74,240,225,242,229,
+ 238,235,239,242,229,225,110,128, 50, 9,111, 2, 67,160, 67,210,
+ 227,104, 3, 67,169, 67,191, 67,201,225,110, 2, 67,176, 67,184,
+ 231,244,232,225,105,128, 14, 10,244,232,225,105,128, 14, 8,233,
+ 238,231,244,232,225,105,128, 14, 9,239,229,244,232,225,105,128,
+ 14, 12,239,107,128, 1,136,105, 2, 67,221, 68, 67,229,245, 99,
+ 5, 67,235, 68, 14, 68, 29, 68, 38, 68, 52, 97, 2, 67,241, 68,
+ 0,227,233,242,227,236,229,235,239,242,229,225,110,128, 50,118,
+ 240,225,242,229,238,235,239,242,229,225,110,128, 50, 22,227,233,
+ 242,227,236,229,235,239,242,229,225,110,128, 50,104,235,239,242,
+ 229,225,110,128, 49, 72,240,225,242,229,238,235,239,242,229,225,
+ 110,128, 50, 8,245,240,225,242,229,238,235,239,242,229,225,110,
+ 128, 50, 28,242, 99, 2, 68, 74, 68,169,236,101,132, 37,203, 68,
+ 87, 68, 98, 68,103, 68,127,237,245,236,244,233,240,236,121,128,
+ 34,151,239,116,128, 34,153,112, 2, 68,109, 68,115,236,245,115,
+ 128, 34,149,239,243,244,225,236,237,225,242,107,128, 48, 54,247,
+ 233,244,104, 2, 68,136, 68,152,236,229,230,244,232,225,236,230,
+ 226,236,225,227,107,128, 37,208,242,233,231,232,244,232,225,236,
+ 230,226,236,225,227,107,128, 37,209,245,237,230,236,229,120,130,
+ 2,198, 68,182, 68,193,226,229,236,239,247,227,237, 98,128, 3,
+ 45,227,237, 98,128, 3, 2,108, 3, 68,207, 68,213, 69, 11,229,
+ 225,114,128, 35, 39,233,227,107, 4, 68,225, 68,236, 68,245, 68,
+ 255,225,236,246,229,239,236,225,114,128, 1,194,228,229,238,244,
+ 225,108,128, 1,192,236,225,244,229,242,225,108,128, 1,193,242,
+ 229,244,242,239,230,236,229,120,128, 1,195,245, 98,129, 38, 99,
+ 69, 18,243,245,233,116, 2, 69, 27, 69, 35,226,236,225,227,107,
+ 128, 38, 99,247,232,233,244,101,128, 38,103,109, 3, 69, 51, 69,
+ 65, 69, 76,227,245,226,229,228,243,241,245,225,242,101,128, 51,
+ 164,239,238,239,243,240,225,227,101,128,255, 67,243,241,245,225,
+ 242,229,228,243,241,245,225,242,101,128, 51,160,111, 8, 69,110,
+ 69,121, 69,208, 70,150, 71,179, 71,210, 72, 61, 72, 70,225,242,
+ 237,229,238,233,225,110,128, 5,129,236,239,110,131, 0, 58, 69,
+ 133, 69,158, 69,177,237,239,110, 2, 69,141, 69,149,229,244,225,
+ 242,121,128, 32,161,239,243,240,225,227,101,128,255, 26,115, 2,
+ 69,164, 69,170,233,231,110,128, 32,161,237,225,236,108,128,254,
+ 85,244,242,233,225,238,231,245,236,225,114, 2, 69,192, 69,202,
+ 232,225,236,230,237,239,100,128, 2,209,237,239,100,128, 2,208,
+ 109, 2, 69,214, 70,143,237, 97,134, 0, 44, 69,231, 70, 39, 70,
+ 50, 70, 62, 70, 92, 70,115, 97, 3, 69,239, 70, 9, 70, 17,226,
+ 239,246,101, 2, 69,248, 69,254,227,237, 98,128, 3, 19,242,233,
+ 231,232,244,227,237, 98,128, 3, 21,227,227,229,238,116,128,246,
+ 195,114, 2, 70, 23, 70, 30,225,226,233, 99,128, 6, 12,237,229,
+ 238,233,225,110,128, 5, 93,233,238,230,229,242,233,239,114,128,
+ 246,225,237,239,238,239,243,240,225,227,101,128,255, 12,242,229,
+ 246,229,242,243,229,100, 2, 70, 75, 70, 86,225,226,239,246,229,
+ 227,237, 98,128, 3, 20,237,239,100,128, 2,189,115, 2, 70, 98,
+ 70,105,237,225,236,108,128,254, 80,245,240,229,242,233,239,114,
+ 128,246,226,244,245,242,238,229,100, 2, 70,126, 70,137,225,226,
+ 239,246,229,227,237, 98,128, 3, 18,237,239,100,128, 2,187,240,
+ 225,243,115,128, 38, 60,110, 2, 70,156, 70,165,231,242,245,229,
+ 238,116,128, 34, 69,116, 2, 70,171, 70,185,239,245,242,233,238,
+ 244,229,231,242,225,108,128, 34, 46,242,239,108,142, 35, 3, 70,
+ 219, 70,225, 70,240, 70,255, 71, 43, 71, 88, 71,102, 71,107, 71,
+ 112, 71,117, 71,123, 71,128, 71,169, 71,174,193,195, 75,128, 0,
+ 6, 66, 2, 70,231, 70,236,197, 76,128, 0, 7, 83,128, 0, 8,
+ 67, 2, 70,246, 70,251,193, 78,128, 0, 24, 82,128, 0, 13, 68,
+ 3, 71, 7, 71, 33, 71, 38, 67, 4, 71, 17, 71, 21, 71, 25, 71,
+ 29, 49,128, 0, 17, 50,128, 0, 18, 51,128, 0, 19, 52,128, 0,
+ 20,197, 76,128, 0,127,204, 69,128, 0, 16, 69, 5, 71, 55, 71,
+ 59, 71, 64, 71, 69, 71, 74, 77,128, 0, 25,206, 81,128, 0, 5,
+ 207, 84,128, 0, 4,211, 67,128, 0, 27, 84, 2, 71, 80, 71, 84,
+ 66,128, 0, 23, 88,128, 0, 3, 70, 2, 71, 94, 71, 98, 70,128,
+ 0, 12, 83,128, 0, 28,199, 83,128, 0, 29,200, 84,128, 0, 9,
+ 204, 70,128, 0, 10,206,193, 75,128, 0, 21,210, 83,128, 0, 30,
+ 83, 5, 71,140, 71,144, 71,154, 71,159, 71,164, 73,128, 0, 15,
+ 79,129, 0, 14, 71,150, 84,128, 0, 2,212, 88,128, 0, 1,213,
+ 66,128, 0, 26,217, 78,128, 0, 22,213, 83,128, 0, 31,214, 84,
+ 128, 0, 11,240,249,242,233,231,232,116,129, 0,169, 71,191,115,
+ 2, 71,197, 71,203,225,238,115,128,248,233,229,242,233,102,128,
+ 246,217,114, 2, 71,216, 72, 44,238,229,242,226,242,225,227,235,
+ 229,116, 2, 71,231, 72, 9,236,229,230,116,130, 48, 12, 71,242,
+ 71,254,232,225,236,230,247,233,228,244,104,128,255, 98,246,229,
+ 242,244,233,227,225,108,128,254, 65,242,233,231,232,116,130, 48,
+ 13, 72, 21, 72, 33,232,225,236,230,247,233,228,244,104,128,255,
+ 99,246,229,242,244,233,227,225,108,128,254, 66,240,239,242,225,
+ 244,233,239,238,243,241,245,225,242,101,128, 51,127,243,241,245,
+ 225,242,101,128, 51,199,246,229,242,235,231,243,241,245,225,242,
+ 101,128, 51,198,240,225,242,229,110,128, 36,158,242,245,250,229,
+ 233,242,111,128, 32,162,243,244,242,229,244,227,232,229,100,128,
+ 2,151,245,114, 2, 72,121, 72,139,236,121, 2, 72,128, 72,134,
+ 225,238,100,128, 34,207,239,114,128, 34,206,242,229,238,227,121,
+ 128, 0,164,249,114, 4, 72,158, 72,166, 72,173, 72,181,194,242,
+ 229,246,101,128,246,209,198,236,229,120,128,246,210,226,242,229,
+ 246,101,128,246,212,230,236,229,120,128,246,213,100,146, 0,100,
+ 72,228, 74,110, 75,134, 75,194, 76,114, 77, 68, 77,130, 78, 59,
+ 78, 72, 78, 81, 78,107, 78,132, 78,141, 79,208, 79,216, 79,227,
+ 79,247, 80, 19, 97, 11, 72,252, 73, 7, 73, 17, 73, 89, 73,152,
+ 73,163, 73,174, 73,243, 74, 49, 74, 55, 74, 85,225,242,237,229,
+ 238,233,225,110,128, 5,100,226,229,238,231,225,236,105,128, 9,
+ 166,100, 5, 73, 29, 73, 38, 73, 44, 73, 58, 73, 74,225,242,225,
+ 226,233, 99,128, 6, 54,229,246, 97,128, 9, 38,230,233,238,225,
+ 236,225,242,225,226,233, 99,128,254,190,233,238,233,244,233,225,
+ 236,225,242,225,226,233, 99,128,254,191,237,229,228,233,225,236,
+ 225,242,225,226,233, 99,128,254,192,103, 3, 73, 97, 73,114, 73,
+ 128,229,243,104,129, 5,188, 73,105,232,229,226,242,229,119,128,
+ 5,188,231,229,114,129, 32, 32, 73,122,228,226,108,128, 32, 33,
+ 117, 2, 73,134, 73,143,234,225,242,225,244,105,128, 10,166,242,
+ 237,245,235,232,105,128, 10, 38,232,233,242,225,231,225,238, 97,
+ 128, 48, 96,235,225,244,225,235,225,238, 97,128, 48,192,108, 3,
+ 73,182, 73,191, 73,229,225,242,225,226,233, 99,128, 6, 47,229,
+ 116,130, 5,211, 73,200, 73,220,228,225,231,229,243,104,129,251,
+ 51, 73,211,232,229,226,242,229,119,128,251, 51,232,229,226,242,
+ 229,119,128, 5,211,230,233,238,225,236,225,242,225,226,233, 99,
+ 128,254,170,237,237, 97, 3, 73,253, 74, 6, 74, 18,225,242,225,
+ 226,233, 99,128, 6, 79,236,239,247,225,242,225,226,233, 99,128,
+ 6, 79,244,225,238, 97, 2, 74, 27, 74, 41,236,244,239,238,229,
+ 225,242,225,226,233, 99,128, 6, 76,242,225,226,233, 99,128, 6,
+ 76,238,228, 97,128, 9,100,242,231, 97, 2, 74, 63, 74, 72,232,
+ 229,226,242,229,119,128, 5,167,236,229,230,244,232,229,226,242,
+ 229,119,128, 5,167,243,233,225,240,238,229,245,237,225,244,225,
+ 227,249,242,233,236,236,233,227,227,237, 98,128, 4,133, 98, 3,
+ 74,118, 75,115, 75,125,108, 9, 74,138, 74,146, 75, 3, 75, 11,
+ 75, 27, 75, 38, 75, 56, 75, 70, 75, 81,199,242,225,246,101,128,
+ 246,211, 97, 2, 74,152, 74,209,238,231,236,229,226,242,225,227,
+ 235,229,116, 2, 74,168, 74,188,236,229,230,116,129, 48, 10, 74,
+ 177,246,229,242,244,233,227,225,108,128,254, 61,242,233,231,232,
+ 116,129, 48, 11, 74,198,246,229,242,244,233,227,225,108,128,254,
+ 62,114, 2, 74,215, 74,236,227,232,233,238,246,229,242,244,229,
+ 228,226,229,236,239,247,227,237, 98,128, 3, 43,242,239,119, 2,
+ 74,244, 74,251,236,229,230,116,128, 33,212,242,233,231,232,116,
+ 128, 33,210,228,225,238,228, 97,128, 9,101,231,242,225,246,101,
+ 129,246,214, 75, 21,227,237, 98,128, 3, 15,233,238,244,229,231,
+ 242,225,108,128, 34, 44,236,239,247,236,233,238,101,129, 32, 23,
+ 75, 50,227,237, 98,128, 3, 51,239,246,229,242,236,233,238,229,
+ 227,237, 98,128, 3, 63,240,242,233,237,229,237,239,100,128, 2,
+ 186,246,229,242,244,233,227,225,108, 2, 75, 94, 75,100,226,225,
+ 114,128, 32, 22,236,233,238,229,225,226,239,246,229,227,237, 98,
+ 128, 3, 14,239,240,239,237,239,230,111,128, 49, 9,243,241,245,
+ 225,242,101,128, 51,200, 99, 4, 75,144, 75,151, 75,160, 75,187,
+ 225,242,239,110,128, 1, 15,229,228,233,236,236, 97,128, 30, 17,
+ 233,242, 99, 2, 75,168, 75,173,236,101,128, 36,211,245,237,230,
+ 236,229,248,226,229,236,239,119,128, 30, 19,242,239,225,116,128,
+ 1, 17,100, 4, 75,204, 76, 29, 76, 39, 76, 90, 97, 4, 75,214,
+ 75,224, 75,231, 76, 0,226,229,238,231,225,236,105,128, 9,161,
+ 228,229,246, 97,128, 9, 33,231,117, 2, 75,238, 75,247,234,225,
+ 242,225,244,105,128, 10,161,242,237,245,235,232,105,128, 10, 33,
+ 108, 2, 76, 6, 76, 15,225,242,225,226,233, 99,128, 6,136,230,
+ 233,238,225,236,225,242,225,226,233, 99,128,251,137,228,232,225,
+ 228,229,246, 97,128, 9, 92,232, 97, 3, 76, 48, 76, 58, 76, 65,
+ 226,229,238,231,225,236,105,128, 9,162,228,229,246, 97,128, 9,
+ 34,231,117, 2, 76, 72, 76, 81,234,225,242,225,244,105,128, 10,
+ 162,242,237,245,235,232,105,128, 10, 34,239,116, 2, 76, 97, 76,
+ 106,225,227,227,229,238,116,128, 30, 11,226,229,236,239,119,128,
+ 30, 13,101, 8, 76,132, 76,185, 76,192, 76,217, 76,227, 76,238,
+ 77, 27, 77, 63, 99, 2, 76,138, 76,175,233,237,225,236,243,229,
+ 240,225,242,225,244,239,114, 2, 76,156, 76,165,225,242,225,226,
+ 233, 99,128, 6,107,240,229,242,243,233,225,110,128, 6,107,249,
+ 242,233,236,236,233, 99,128, 4, 52,231,242,229,101,128, 0,176,
+ 232,105, 2, 76,199, 76,208,232,229,226,242,229,119,128, 5,173,
+ 242,225,231,225,238, 97,128, 48,103,233,227,239,240,244,233, 99,
+ 128, 3,239,235,225,244,225,235,225,238, 97,128, 48,199,108, 2,
+ 76,244, 77, 11,229,244,101, 2, 76,252, 77, 3,236,229,230,116,
+ 128, 35, 43,242,233,231,232,116,128, 35, 38,244, 97,129, 3,180,
+ 77, 18,244,245,242,238,229,100,128, 1,141,238,239,237,233,238,
+ 225,244,239,242,237,233,238,245,243,239,238,229,238,245,237,229,
+ 242,225,244,239,242,226,229,238,231,225,236,105,128, 9,248,250,
+ 104,128, 2,164,104, 2, 77, 74, 77,124, 97, 3, 77, 82, 77, 92,
+ 77, 99,226,229,238,231,225,236,105,128, 9,167,228,229,246, 97,
+ 128, 9, 39,231,117, 2, 77,106, 77,115,234,225,242,225,244,105,
+ 128, 10,167,242,237,245,235,232,105,128, 10, 39,239,239,107,128,
+ 2, 87,105, 6, 77,144, 77,193, 77,253, 78, 8, 78, 19, 78, 29,
+ 97, 2, 77,150, 77,172,236,249,244,233,235,225,244,239,238,239,
+ 115,129, 3,133, 77,166,227,237, 98,128, 3, 68,237,239,238,100,
+ 129, 38,102, 77,181,243,245,233,244,247,232,233,244,101,128, 38,
+ 98,229,242,229,243,233,115,133, 0,168, 77,212, 77,220, 77,231,
+ 77,237, 77,245,225,227,245,244,101,128,246,215,226,229,236,239,
+ 247,227,237, 98,128, 3, 36,227,237, 98,128, 3, 8,231,242,225,
+ 246,101,128,246,216,244,239,238,239,115,128, 3,133,232,233,242,
+ 225,231,225,238, 97,128, 48, 98,235,225,244,225,235,225,238, 97,
+ 128, 48,194,244,244,239,237,225,242,107,128, 48, 3,246,105, 2,
+ 78, 36, 78, 47,228,101,129, 0,247, 78, 43,115,128, 34, 35,243,
+ 233,239,238,243,236,225,243,104,128, 34, 21,234,229,227,249,242,
+ 233,236,236,233, 99,128, 4, 82,235,243,232,225,228,101,128, 37,
+ 147,108, 2, 78, 87, 78, 98,233,238,229,226,229,236,239,119,128,
+ 30, 15,243,241,245,225,242,101,128, 51,151,109, 2, 78,113, 78,
+ 121,225,227,242,239,110,128, 1, 17,239,238,239,243,240,225,227,
+ 101,128,255, 68,238,226,236,239,227,107,128, 37,132,111, 10, 78,
+ 163, 78,175, 78,185, 78,196, 78,207, 79, 23, 79, 28, 79, 39, 79,
+ 154, 79,180,227,232,225,228,225,244,232,225,105,128, 14, 14,228,
+ 229,235,244,232,225,105,128, 14, 20,232,233,242,225,231,225,238,
+ 97,128, 48,105,235,225,244,225,235,225,238, 97,128, 48,201,236,
+ 236,225,114,132, 0, 36, 78,222, 78,233, 78,245, 79, 0,233,238,
+ 230,229,242,233,239,114,128,246,227,237,239,238,239,243,240,225,
+ 227,101,128,255, 4,239,236,228,243,244,249,236,101,128,247, 36,
+ 115, 2, 79, 6, 79, 13,237,225,236,108,128,254,105,245,240,229,
+ 242,233,239,114,128,246,228,238,103,128, 32,171,242,245,243,241,
+ 245,225,242,101,128, 51, 38,116, 6, 79, 53, 79, 70, 79, 92, 79,
+ 103, 79,135, 79,142,225,227,227,229,238,116,129, 2,217, 79, 64,
+ 227,237, 98,128, 3, 7,226,229,236,239,247, 99, 2, 79, 81, 79,
+ 86,237, 98,128, 3, 35,239,237, 98,128, 3, 35,235,225,244,225,
+ 235,225,238, 97,128, 48,251,236,229,243,115, 2, 79,112, 79,116,
+ 105,128, 1, 49,106,129,246,190, 79,122,243,244,242,239,235,229,
+ 232,239,239,107,128, 2,132,237,225,244,104,128, 34,197,244,229,
+ 228,227,233,242,227,236,101,128, 37,204,245,226,236,229,249,239,
+ 228,240,225,244,225,104,129,251, 31, 79,171,232,229,226,242,229,
+ 119,128,251, 31,247,238,244,225,227,107, 2, 79,191, 79,202,226,
+ 229,236,239,247,227,237, 98,128, 3, 30,237,239,100,128, 2,213,
+ 240,225,242,229,110,128, 36,159,243,245,240,229,242,233,239,114,
+ 128,246,235,116, 2, 79,233, 79,239,225,233,108,128, 2, 86,239,
+ 240,226,225,114,128, 1,140,117, 2, 79,253, 80, 8,232,233,242,
+ 225,231,225,238, 97,128, 48,101,235,225,244,225,235,225,238, 97,
+ 128, 48,197,122,132, 1,243, 80, 31, 80, 40, 80, 59, 80, 96,225,
+ 236,244,239,238,101,128, 2,163, 99, 2, 80, 46, 80, 53,225,242,
+ 239,110,128, 1,198,245,242,108,128, 2,165,101, 2, 80, 65, 80,
+ 85,225,226,235,232,225,243,233,225,238,227,249,242,233,236,236,
+ 233, 99,128, 4,225,227,249,242,233,236,236,233, 99,128, 4, 85,
+ 232,229,227,249,242,233,236,236,233, 99,128, 4, 95,101,151, 0,
+ 101, 80,159, 80,178, 80,212, 81,186, 81,248, 82, 25, 82, 37, 82,
+ 60, 82,113, 83,225, 84, 27, 84,129, 84,245, 85,124, 85,199, 85,
+ 230, 86, 36, 86, 89, 87, 24, 87,157, 87,177, 87,221, 88, 56, 97,
+ 2, 80,165, 80,172,227,245,244,101,128, 0,233,242,244,104,128,
+ 38, 65, 98, 3, 80,186, 80,195, 80,205,229,238,231,225,236,105,
+ 128, 9,143,239,240,239,237,239,230,111,128, 49, 28,242,229,246,
+ 101,128, 1, 21, 99, 5, 80,224, 81, 41, 81, 55, 81, 87, 81,176,
+ 97, 2, 80,230, 81, 35,238,228,242, 97, 3, 80,241, 80,248, 81,
+ 3,228,229,246, 97,128, 9, 13,231,245,234,225,242,225,244,105,
+ 128, 10,141,246,239,247,229,236,243,233,231,110, 2, 81, 17, 81,
+ 24,228,229,246, 97,128, 9, 69,231,245,234,225,242,225,244,105,
+ 128, 10,197,242,239,110,128, 1, 27,229,228,233,236,236,225,226,
+ 242,229,246,101,128, 30, 29,104, 2, 81, 61, 81, 72,225,242,237,
+ 229,238,233,225,110,128, 5,101,249,233,247,238,225,242,237,229,
+ 238,233,225,110,128, 5,135,233,242, 99, 2, 81, 95, 81,100,236,
+ 101,128, 36,212,245,237,230,236,229,120,134, 0,234, 81,121, 81,
+ 129, 81,137, 81,148, 81,156, 81,168,225,227,245,244,101,128, 30,
+ 191,226,229,236,239,119,128, 30, 25,228,239,244,226,229,236,239,
+ 119,128, 30,199,231,242,225,246,101,128, 30,193,232,239,239,235,
+ 225,226,239,246,101,128, 30,195,244,233,236,228,101,128, 30,197,
+ 249,242,233,236,236,233, 99,128, 4, 84,100, 4, 81,196, 81,206,
+ 81,212, 81,222,226,236,231,242,225,246,101,128, 2, 5,229,246,
+ 97,128, 9, 15,233,229,242,229,243,233,115,128, 0,235,239,116,
+ 130, 1, 23, 81,231, 81,240,225,227,227,229,238,116,128, 1, 23,
+ 226,229,236,239,119,128, 30,185,101, 2, 81,254, 82, 9,231,245,
+ 242,237,245,235,232,105,128, 10, 15,237,225,244,242,225,231,245,
+ 242,237,245,235,232,105,128, 10, 71,230,227,249,242,233,236,236,
+ 233, 99,128, 4, 68,103, 2, 82, 43, 82, 50,242,225,246,101,128,
+ 0,232,245,234,225,242,225,244,105,128, 10,143,104, 4, 82, 70,
+ 82, 81, 82, 92, 82,102,225,242,237,229,238,233,225,110,128, 5,
+ 103,226,239,240,239,237,239,230,111,128, 49, 29,233,242,225,231,
+ 225,238, 97,128, 48, 72,239,239,235,225,226,239,246,101,128, 30,
+ 187,105, 4, 82,123, 82,134, 83,192, 83,207,226,239,240,239,237,
+ 239,230,111,128, 49, 31,231,232,116,142, 0, 56, 82,168, 82,177,
+ 82,187, 82,217, 82,224, 83, 6, 83, 31, 83, 76, 83,110, 83,122,
+ 83,133, 83,166, 83,174, 83,185,225,242,225,226,233, 99,128, 6,
+ 104,226,229,238,231,225,236,105,128, 9,238,227,233,242,227,236,
+ 101,129, 36,103, 82,198,233,238,246,229,242,243,229,243,225,238,
+ 243,243,229,242,233,102,128, 39,145,228,229,246, 97,128, 9,110,
+ 229,229,110, 2, 82,232, 82,241,227,233,242,227,236,101,128, 36,
+ 113,112, 2, 82,247, 82,254,225,242,229,110,128, 36,133,229,242,
+ 233,239,100,128, 36,153,231,117, 2, 83, 13, 83, 22,234,225,242,
+ 225,244,105,128, 10,238,242,237,245,235,232,105,128, 10,110,104,
+ 2, 83, 37, 83, 63, 97, 2, 83, 43, 83, 54,227,235,225,242,225,
+ 226,233, 99,128, 6,104,238,231,250,232,239,117,128, 48, 40,238,
+ 239,244,229,226,229,225,237,229,100,128, 38,107,105, 2, 83, 82,
+ 83,100,228,229,239,231,242,225,240,232,233,227,240,225,242,229,
+ 110,128, 50, 39,238,230,229,242,233,239,114,128, 32,136,237,239,
+ 238,239,243,240,225,227,101,128,255, 24,239,236,228,243,244,249,
+ 236,101,128,247, 56,112, 2, 83,139, 83,146,225,242,229,110,128,
+ 36,123,229,114, 2, 83,153, 83,159,233,239,100,128, 36,143,243,
+ 233,225,110,128, 6,248,242,239,237,225,110,128, 33,119,243,245,
+ 240,229,242,233,239,114,128, 32,120,244,232,225,105,128, 14, 88,
+ 238,246,229,242,244,229,228,226,242,229,246,101,128, 2, 7,239,
+ 244,233,230,233,229,228,227,249,242,233,236,236,233, 99,128, 4,
+ 101,107, 2, 83,231, 83,255,225,244,225,235,225,238, 97,129, 48,
+ 168, 83,243,232,225,236,230,247,233,228,244,104,128,255,116,111,
+ 2, 84, 5, 84, 20,238,235,225,242,231,245,242,237,245,235,232,
+ 105,128, 10,116,242,229,225,110,128, 49, 84,108, 3, 84, 35, 84,
+ 46, 84,107,227,249,242,233,236,236,233, 99,128, 4, 59,101, 2,
+ 84, 52, 84, 59,237,229,238,116,128, 34, 8,246,229,110, 3, 84,
+ 69, 84, 78, 84, 99,227,233,242,227,236,101,128, 36,106,112, 2,
+ 84, 84, 84, 91,225,242,229,110,128, 36,126,229,242,233,239,100,
+ 128, 36,146,242,239,237,225,110,128, 33,122,236,233,240,243,233,
+ 115,129, 32, 38, 84,118,246,229,242,244,233,227,225,108,128, 34,
+ 238,109, 5, 84,141, 84,169, 84,180, 84,200, 84,211,225,227,242,
+ 239,110,130, 1, 19, 84,153, 84,161,225,227,245,244,101,128, 30,
+ 23,231,242,225,246,101,128, 30, 21,227,249,242,233,236,236,233,
+ 99,128, 4, 60,228,225,243,104,129, 32, 20, 84,189,246,229,242,
+ 244,233,227,225,108,128,254, 49,239,238,239,243,240,225,227,101,
+ 128,255, 69,112, 2, 84,217, 84,237,232,225,243,233,243,237,225,
+ 242,235,225,242,237,229,238,233,225,110,128, 5, 91,244,249,243,
+ 229,116,128, 34, 5,110, 6, 85, 3, 85, 14, 85, 25, 85, 69, 85,
+ 101, 85,116,226,239,240,239,237,239,230,111,128, 49, 35,227,249,
+ 242,233,236,236,233, 99,128, 4, 61,100, 2, 85, 31, 85, 50,225,
+ 243,104,129, 32, 19, 85, 39,246,229,242,244,233,227,225,108,128,
+ 254, 50,229,243,227,229,238,228,229,242,227,249,242,233,236,236,
+ 233, 99,128, 4,163,103,130, 1, 75, 85, 77, 85, 88,226,239,240,
+ 239,237,239,230,111,128, 49, 37,232,229,227,249,242,233,236,236,
+ 233, 99,128, 4,165,232,239,239,235,227,249,242,233,236,236,233,
+ 99,128, 4,200,243,240,225,227,101,128, 32, 2,111, 3, 85,132,
+ 85,140, 85,149,231,239,238,229,107,128, 1, 25,235,239,242,229,
+ 225,110,128, 49, 83,240,229,110,130, 2, 91, 85,159, 85,168,227,
+ 236,239,243,229,100,128, 2,154,242,229,246,229,242,243,229,100,
+ 130, 2, 92, 85,183, 85,192,227,236,239,243,229,100,128, 2, 94,
+ 232,239,239,107,128, 2, 93,112, 2, 85,205, 85,212,225,242,229,
+ 110,128, 36,160,243,233,236,239,110,129, 3,181, 85,222,244,239,
+ 238,239,115,128, 3,173,241,117, 2, 85,237, 86, 25,225,108,130,
+ 0, 61, 85,246, 86, 2,237,239,238,239,243,240,225,227,101,128,
+ 255, 29,115, 2, 86, 8, 86, 15,237,225,236,108,128,254,102,245,
+ 240,229,242,233,239,114,128, 32,124,233,246,225,236,229,238,227,
+ 101,128, 34, 97,114, 3, 86, 44, 86, 55, 86, 66,226,239,240,239,
+ 237,239,230,111,128, 49, 38,227,249,242,233,236,236,233, 99,128,
+ 4, 64,229,246,229,242,243,229,100,129, 2, 88, 86, 78,227,249,
+ 242,233,236,236,233, 99,128, 4, 77,115, 6, 86,103, 86,114, 86,
+ 134, 86,215, 87, 4, 87, 14,227,249,242,233,236,236,233, 99,128,
+ 4, 65,228,229,243,227,229,238,228,229,242,227,249,242,233,236,
+ 236,233, 99,128, 4,171,104,132, 2,131, 86,146, 86,153, 86,184,
+ 86,199,227,245,242,108,128, 2,134,239,242,116, 2, 86,161, 86,
+ 168,228,229,246, 97,128, 9, 14,246,239,247,229,236,243,233,231,
+ 238,228,229,246, 97,128, 9, 70,242,229,246,229,242,243,229,228,
+ 236,239,239,112,128, 1,170,243,241,245,225,244,242,229,246,229,
+ 242,243,229,100,128, 2,133,237,225,236,108, 2, 86,224, 86,235,
+ 232,233,242,225,231,225,238, 97,128, 48, 71,235,225,244,225,235,
+ 225,238, 97,129, 48,167, 86,248,232,225,236,230,247,233,228,244,
+ 104,128,255,106,244,233,237,225,244,229,100,128, 33, 46,245,240,
+ 229,242,233,239,114,128,246,236,116, 5, 87, 36, 87, 62, 87, 66,
+ 87, 83, 87,149, 97,130, 3,183, 87, 44, 87, 54,242,237,229,238,
+ 233,225,110,128, 5,104,244,239,238,239,115,128, 3,174,104,128,
+ 0,240,233,236,228,101,129, 30,189, 87, 75,226,229,236,239,119,
+ 128, 30, 27,238,225,232,244, 97, 3, 87, 95, 87,127, 87,136,230,
+ 239,245,235,104, 2, 87,105, 87,114,232,229,226,242,229,119,128,
+ 5,145,236,229,230,244,232,229,226,242,229,119,128, 5,145,232,
+ 229,226,242,229,119,128, 5,145,236,229,230,244,232,229,226,242,
+ 229,119,128, 5,145,245,242,238,229,100,128, 1,221,117, 2, 87,
+ 163, 87,172,235,239,242,229,225,110,128, 49, 97,242,111,128, 32,
+ 172,246,239,247,229,236,243,233,231,110, 3, 87,193, 87,203, 87,
+ 210,226,229,238,231,225,236,105,128, 9,199,228,229,246, 97,128,
+ 9, 71,231,245,234,225,242,225,244,105,128, 10,199,120, 2, 87,
+ 227, 88, 44,227,236,225,109,132, 0, 33, 87,242, 87,253, 88, 24,
+ 88, 36,225,242,237,229,238,233,225,110,128, 5, 92,100, 2, 88,
+ 3, 88, 8,226,108,128, 32, 60,239,247,110,129, 0,161, 88, 16,
+ 243,237,225,236,108,128,247,161,237,239,238,239,243,240,225,227,
+ 101,128,255, 1,243,237,225,236,108,128,247, 33,233,243,244,229,
+ 238,244,233,225,108,128, 34, 3,250,104,131, 2,146, 88, 67, 88,
+ 86, 88, 97, 99, 2, 88, 73, 88, 80,225,242,239,110,128, 1,239,
+ 245,242,108,128, 2,147,242,229,246,229,242,243,229,100,128, 1,
+ 185,244,225,233,108,128, 1,186,102,140, 0,102, 88,132, 88,214,
+ 88,225, 88,234, 88,246, 89, 93, 89,109, 91,117, 91,130, 91,156,
+ 93, 33, 93, 41, 97, 4, 88,142, 88,149, 88,160, 88,171,228,229,
+ 246, 97,128, 9, 94,231,245,242,237,245,235,232,105,128, 10, 94,
+ 232,242,229,238,232,229,233,116,128, 33, 9,244,232, 97, 3, 88,
+ 181, 88,190, 88,202,225,242,225,226,233, 99,128, 6, 78,236,239,
+ 247,225,242,225,226,233, 99,128, 6, 78,244,225,238,225,242,225,
+ 226,233, 99,128, 6, 75,226,239,240,239,237,239,230,111,128, 49,
+ 8,227,233,242,227,236,101,128, 36,213,228,239,244,225,227,227,
+ 229,238,116,128, 30, 31,101, 3, 88,254, 89, 76, 89, 86,104, 4,
+ 89, 8, 89, 31, 89, 45, 89, 61,225,114, 2, 89, 15, 89, 22,225,
+ 226,233, 99,128, 6, 65,237,229,238,233,225,110,128, 5,134,230,
+ 233,238,225,236,225,242,225,226,233, 99,128,254,210,233,238,233,
+ 244,233,225,236,225,242,225,226,233, 99,128,254,211,237,229,228,
+ 233,225,236,225,242,225,226,233, 99,128,254,212,233,227,239,240,
+ 244,233, 99,128, 3,229,237,225,236,101,128, 38, 64,102,130,251,
+ 0, 89,101, 89,105,105,128,251, 3,108,128,251, 4,105,136,251,
+ 1, 89,129, 89,169, 89,180, 89,202, 90, 68, 90, 85, 90, 93, 90,
+ 106,230,244,229,229,110, 2, 89,139, 89,148,227,233,242,227,236,
+ 101,128, 36,110,112, 2, 89,154, 89,161,225,242,229,110,128, 36,
+ 130,229,242,233,239,100,128, 36,150,231,245,242,229,228,225,243,
+ 104,128, 32, 18,236,236,229,100, 2, 89,189, 89,195,226,239,120,
+ 128, 37,160,242,229,227,116,128, 37,172,238,225,108, 5, 89,216,
+ 89,255, 90, 16, 90, 33, 90, 49,235,225,102,130, 5,218, 89,226,
+ 89,246,228,225,231,229,243,104,129,251, 58, 89,237,232,229,226,
+ 242,229,119,128,251, 58,232,229,226,242,229,119,128, 5,218,237,
+ 229,109,129, 5,221, 90, 7,232,229,226,242,229,119,128, 5,221,
+ 238,245,110,129, 5,223, 90, 24,232,229,226,242,229,119,128, 5,
+ 223,240,101,129, 5,227, 90, 40,232,229,226,242,229,119,128, 5,
+ 227,244,243,225,228,105,129, 5,229, 90, 59,232,229,226,242,229,
+ 119,128, 5,229,242,243,244,244,239,238,229,227,232,233,238,229,
+ 243,101,128, 2,201,243,232,229,249,101,128, 37,201,244,225,227,
+ 249,242,233,236,236,233, 99,128, 4,115,246,101,142, 0, 53, 90,
+ 139, 90,148, 90,158, 90,188, 90,195, 90,205, 90,230, 91, 1, 91,
+ 35, 91, 47, 91, 58, 91, 91, 91, 99, 91,110,225,242,225,226,233,
+ 99,128, 6,101,226,229,238,231,225,236,105,128, 9,235,227,233,
+ 242,227,236,101,129, 36,100, 90,169,233,238,246,229,242,243,229,
+ 243,225,238,243,243,229,242,233,102,128, 39,142,228,229,246, 97,
+ 128, 9,107,229,233,231,232,244,232,115,128, 33, 93,231,117, 2,
+ 90,212, 90,221,234,225,242,225,244,105,128, 10,235,242,237,245,
+ 235,232,105,128, 10,107,232, 97, 2, 90,237, 90,248,227,235,225,
+ 242,225,226,233, 99,128, 6,101,238,231,250,232,239,117,128, 48,
+ 37,105, 2, 91, 7, 91, 25,228,229,239,231,242,225,240,232,233,
+ 227,240,225,242,229,110,128, 50, 36,238,230,229,242,233,239,114,
+ 128, 32,133,237,239,238,239,243,240,225,227,101,128,255, 21,239,
+ 236,228,243,244,249,236,101,128,247, 53,112, 2, 91, 64, 91, 71,
+ 225,242,229,110,128, 36,120,229,114, 2, 91, 78, 91, 84,233,239,
+ 100,128, 36,140,243,233,225,110,128, 6,245,242,239,237,225,110,
+ 128, 33,116,243,245,240,229,242,233,239,114,128, 32,117,244,232,
+ 225,105,128, 14, 85,108,129,251, 2, 91,123,239,242,233,110,128,
+ 1,146,109, 2, 91,136, 91,147,239,238,239,243,240,225,227,101,
+ 128,255, 70,243,241,245,225,242,101,128, 51,153,111, 4, 91,166,
+ 91,188, 91,200, 91,207,230, 97, 2, 91,173, 91,181,238,244,232,
+ 225,105,128, 14, 31,244,232,225,105,128, 14, 29,238,231,237,225,
+ 238,244,232,225,105,128, 14, 79,242,225,236,108,128, 34, 0,245,
+ 114,142, 0, 52, 91,240, 91,249, 92, 3, 92, 33, 92, 40, 92, 65,
+ 92, 92, 92,126, 92,138, 92,157, 92,168, 92,201, 92,209, 92,220,
+ 225,242,225,226,233, 99,128, 6,100,226,229,238,231,225,236,105,
+ 128, 9,234,227,233,242,227,236,101,129, 36, 99, 92, 14,233,238,
+ 246,229,242,243,229,243,225,238,243,243,229,242,233,102,128, 39,
+ 141,228,229,246, 97,128, 9,106,231,117, 2, 92, 47, 92, 56,234,
+ 225,242,225,244,105,128, 10,234,242,237,245,235,232,105,128, 10,
+ 106,232, 97, 2, 92, 72, 92, 83,227,235,225,242,225,226,233, 99,
+ 128, 6,100,238,231,250,232,239,117,128, 48, 36,105, 2, 92, 98,
+ 92,116,228,229,239,231,242,225,240,232,233,227,240,225,242,229,
+ 110,128, 50, 35,238,230,229,242,233,239,114,128, 32,132,237,239,
+ 238,239,243,240,225,227,101,128,255, 20,238,245,237,229,242,225,
+ 244,239,242,226,229,238,231,225,236,105,128, 9,247,239,236,228,
+ 243,244,249,236,101,128,247, 52,112, 2, 92,174, 92,181,225,242,
+ 229,110,128, 36,119,229,114, 2, 92,188, 92,194,233,239,100,128,
+ 36,139,243,233,225,110,128, 6,244,242,239,237,225,110,128, 33,
+ 115,243,245,240,229,242,233,239,114,128, 32,116,116, 2, 92,226,
+ 93, 8,229,229,110, 2, 92,234, 92,243,227,233,242,227,236,101,
+ 128, 36,109,112, 2, 92,249, 93, 0,225,242,229,110,128, 36,129,
+ 229,242,233,239,100,128, 36,149,104, 2, 93, 14, 93, 19,225,105,
+ 128, 14, 84,244,239,238,229,227,232,233,238,229,243,101,128, 2,
+ 203,240,225,242,229,110,128, 36,161,242, 97, 2, 93, 48, 93, 56,
+ 227,244,233,239,110,128, 32, 68,238, 99,128, 32,163,103,144, 0,
+ 103, 93, 97, 94, 43, 94, 66, 94,127, 94,144, 95, 65, 96, 58, 96,
+ 143, 96,156, 97, 14, 97, 39, 97, 67, 97, 89, 98, 34, 98, 56, 98,
+ 158, 97, 9, 93,117, 93,127, 93,134, 93,141, 93,205, 93,230, 93,
+ 241, 93,252, 94, 30,226,229,238,231,225,236,105,128, 9,151,227,
+ 245,244,101,128, 1,245,228,229,246, 97,128, 9, 23,102, 4, 93,
+ 151, 93,160, 93,174, 93,190,225,242,225,226,233, 99,128, 6,175,
+ 230,233,238,225,236,225,242,225,226,233, 99,128,251,147,233,238,
+ 233,244,233,225,236,225,242,225,226,233, 99,128,251,148,237,229,
+ 228,233,225,236,225,242,225,226,233, 99,128,251,149,231,117, 2,
+ 93,212, 93,221,234,225,242,225,244,105,128, 10,151,242,237,245,
+ 235,232,105,128, 10, 23,232,233,242,225,231,225,238, 97,128, 48,
+ 76,235,225,244,225,235,225,238, 97,128, 48,172,237,237, 97,130,
+ 3,179, 94, 6, 94, 19,236,225,244,233,238,243,237,225,236,108,
+ 128, 2, 99,243,245,240,229,242,233,239,114,128, 2,224,238,231,
+ 233,225,227,239,240,244,233, 99,128, 3,235, 98, 2, 94, 49, 94,
+ 59,239,240,239,237,239,230,111,128, 49, 13,242,229,246,101,128,
+ 1, 31, 99, 4, 94, 76, 94, 83, 94, 92, 94,114,225,242,239,110,
+ 128, 1,231,229,228,233,236,236, 97,128, 1, 35,233,242, 99, 2,
+ 94,100, 94,105,236,101,128, 36,214,245,237,230,236,229,120,128,
+ 1, 29,239,237,237,225,225,227,227,229,238,116,128, 1, 35,228,
+ 239,116,129, 1, 33, 94,135,225,227,227,229,238,116,128, 1, 33,
+ 101, 6, 94,158, 94,169, 94,180, 94,191, 94,210, 95, 56,227,249,
+ 242,233,236,236,233, 99,128, 4, 51,232,233,242,225,231,225,238,
+ 97,128, 48, 82,235,225,244,225,235,225,238, 97,128, 48,178,239,
+ 237,229,244,242,233,227,225,236,236,249,229,241,245,225,108,128,
+ 34, 81,114, 3, 94,218, 95, 11, 95, 21,229,243,104, 3, 94,228,
+ 94,243, 94,252,225,227,227,229,238,244,232,229,226,242,229,119,
+ 128, 5,156,232,229,226,242,229,119,128, 5,243,237,245,241,228,
+ 225,237,232,229,226,242,229,119,128, 5,157,237,225,238,228,226,
+ 236,115,128, 0,223,243,232,225,249,233,109, 2, 95, 32, 95, 47,
+ 225,227,227,229,238,244,232,229,226,242,229,119,128, 5,158,232,
+ 229,226,242,229,119,128, 5,244,244,225,237,225,242,107,128, 48,
+ 19,104, 5, 95, 77, 95,210, 96, 17, 96, 42, 96, 48, 97, 4, 95,
+ 87, 95, 97, 95,120, 95,145,226,229,238,231,225,236,105,128, 9,
+ 152,100, 2, 95,103, 95,114,225,242,237,229,238,233,225,110,128,
+ 5,114,229,246, 97,128, 9, 24,231,117, 2, 95,127, 95,136,234,
+ 225,242,225,244,105,128, 10,152,242,237,245,235,232,105,128, 10,
+ 24,233,110, 4, 95,156, 95,165, 95,179, 95,195,225,242,225,226,
+ 233, 99,128, 6, 58,230,233,238,225,236,225,242,225,226,233, 99,
+ 128,254,206,233,238,233,244,233,225,236,225,242,225,226,233, 99,
+ 128,254,207,237,229,228,233,225,236,225,242,225,226,233, 99,128,
+ 254,208,101, 3, 95,218, 95,239, 96, 0,237,233,228,228,236,229,
+ 232,239,239,235,227,249,242,233,236,236,233, 99,128, 4,149,243,
+ 244,242,239,235,229,227,249,242,233,236,236,233, 99,128, 4,147,
+ 245,240,244,245,242,238,227,249,242,233,236,236,233, 99,128, 4,
+ 145,232, 97, 2, 96, 24, 96, 31,228,229,246, 97,128, 9, 90,231,
+ 245,242,237,245,235,232,105,128, 10, 90,239,239,107,128, 2, 96,
+ 250,243,241,245,225,242,101,128, 51,147,105, 3, 96, 66, 96, 77,
+ 96, 88,232,233,242,225,231,225,238, 97,128, 48, 78,235,225,244,
+ 225,235,225,238, 97,128, 48,174,109, 2, 96, 94, 96,105,225,242,
+ 237,229,238,233,225,110,128, 5, 99,229,108,130, 5,210, 96,114,
+ 96,134,228,225,231,229,243,104,129,251, 50, 96,125,232,229,226,
+ 242,229,119,128,251, 50,232,229,226,242,229,119,128, 5,210,234,
+ 229,227,249,242,233,236,236,233, 99,128, 4, 83,236,239,244,244,
+ 225,108, 2, 96,167, 96,184,233,238,246,229,242,244,229,228,243,
+ 244,242,239,235,101,128, 1,190,243,244,239,112,132, 2,148, 96,
+ 199, 96,210, 96,216, 96,248,233,238,246,229,242,244,229,100,128,
+ 2,150,237,239,100,128, 2,192,242,229,246,229,242,243,229,100,
+ 130, 2,149, 96,231, 96,237,237,239,100,128, 2,193,243,245,240,
+ 229,242,233,239,114,128, 2,228,243,244,242,239,235,101,129, 2,
+ 161, 97, 3,242,229,246,229,242,243,229,100,128, 2,162,109, 2,
+ 97, 20, 97, 28,225,227,242,239,110,128, 30, 33,239,238,239,243,
+ 240,225,227,101,128,255, 71,111, 2, 97, 45, 97, 56,232,233,242,
+ 225,231,225,238, 97,128, 48, 84,235,225,244,225,235,225,238, 97,
+ 128, 48,180,240, 97, 2, 97, 74, 97, 80,242,229,110,128, 36,162,
+ 243,241,245,225,242,101,128, 51,172,114, 2, 97, 95, 97,192, 97,
+ 2, 97,101, 97,109,228,233,229,238,116,128, 34, 7,246,101,134,
+ 0, 96, 97,126, 97,137, 97,154, 97,161, 97,170, 97,182,226,229,
+ 236,239,247,227,237, 98,128, 3, 22, 99, 2, 97,143, 97,148,237,
+ 98,128, 3, 0,239,237, 98,128, 3, 0,228,229,246, 97,128, 9,
+ 83,236,239,247,237,239,100,128, 2,206,237,239,238,239,243,240,
+ 225,227,101,128,255, 64,244,239,238,229,227,237, 98,128, 3, 64,
+ 229,225,244,229,114,132, 0, 62, 97,208, 97,227, 97,239, 98, 26,
+ 229,241,245,225,108,129, 34,101, 97,218,239,242,236,229,243,115,
+ 128, 34,219,237,239,238,239,243,240,225,227,101,128,255, 30,111,
+ 2, 97,245, 98, 15,114, 2, 97,251, 98, 8,229,241,245,233,246,
+ 225,236,229,238,116,128, 34,115,236,229,243,115,128, 34,119,246,
+ 229,242,229,241,245,225,108,128, 34,103,243,237,225,236,108,128,
+ 254,101,115, 2, 98, 40, 98, 48,227,242,233,240,116,128, 2, 97,
+ 244,242,239,235,101,128, 1,229,117, 4, 98, 66, 98, 77, 98,134,
+ 98,145,232,233,242,225,231,225,238, 97,128, 48, 80,233,108, 2,
+ 98, 84, 98,109,236,229,237,239,116, 2, 98, 94, 98,101,236,229,
+ 230,116,128, 0,171,242,233,231,232,116,128, 0,187,243,233,238,
+ 231,108, 2, 98,119, 98,126,236,229,230,116,128, 32, 57,242,233,
+ 231,232,116,128, 32, 58,235,225,244,225,235,225,238, 97,128, 48,
+ 176,242,225,237,245,243,241,245,225,242,101,128, 51, 24,249,243,
+ 241,245,225,242,101,128, 51,201,104,144, 0,104, 98,204,101, 90,
+ 101,125,101,162,101,202,103, 90,103,110,104, 75,104, 87,104, 99,
+ 105,167,105,175,105,186,105,195,106, 19,106, 23, 97, 13, 98,232,
+ 99, 15, 99, 25, 99, 55, 99, 80, 99,158, 99,170, 99,195, 99,210,
+ 99,239, 99,252,100, 54,100, 63, 97, 2, 98,238, 99, 1,226,235,
+ 232,225,243,233,225,238,227,249,242,233,236,236,233, 99,128, 4,
+ 169,236,244,239,238,229,225,242,225,226,233, 99,128, 6,193,226,
+ 229,238,231,225,236,105,128, 9,185,228,101, 2, 99, 32, 99, 50,
+ 243,227,229,238,228,229,242,227,249,242,233,236,236,233, 99,128,
+ 4,179,246, 97,128, 9, 57,231,117, 2, 99, 62, 99, 71,234,225,
+ 242,225,244,105,128, 10,185,242,237,245,235,232,105,128, 10, 57,
+ 104, 4, 99, 90, 99, 99, 99,113, 99,143,225,242,225,226,233, 99,
+ 128, 6, 45,230,233,238,225,236,225,242,225,226,233, 99,128,254,
+ 162,105, 2, 99,119, 99,134,238,233,244,233,225,236,225,242,225,
+ 226,233, 99,128,254,163,242,225,231,225,238, 97,128, 48,111,237,
+ 229,228,233,225,236,225,242,225,226,233, 99,128,254,164,233,244,
+ 245,243,241,245,225,242,101,128, 51, 42,235,225,244,225,235,225,
+ 238, 97,129, 48,207, 99,183,232,225,236,230,247,233,228,244,104,
+ 128,255,138,236,225,238,244,231,245,242,237,245,235,232,105,128,
+ 10, 77,237,250, 97, 2, 99,218, 99,227,225,242,225,226,233, 99,
+ 128, 6, 33,236,239,247,225,242,225,226,233, 99,128, 6, 33,238,
+ 231,245,236,230,233,236,236,229,114,128, 49,100,114, 2,100, 2,
+ 100, 18,228,243,233,231,238,227,249,242,233,236,236,233, 99,128,
+ 4, 74,240,239,239,110, 2,100, 27,100, 40,236,229,230,244,226,
+ 225,242,226,245,112,128, 33,188,242,233,231,232,244,226,225,242,
+ 226,245,112,128, 33,192,243,241,245,225,242,101,128, 51,202,244,
+ 225,102, 3,100, 73,100,165,101, 0,240,225,244,225,104,134, 5,
+ 178,100, 93,100, 98,100,112,100,121,100,136,100,152,177, 54,128,
+ 5,178, 50, 2,100,104,100,108, 51,128, 5,178,102,128, 5,178,
+ 232,229,226,242,229,119,128, 5,178,238,225,242,242,239,247,232,
+ 229,226,242,229,119,128, 5,178,241,245,225,242,244,229,242,232,
+ 229,226,242,229,119,128, 5,178,247,233,228,229,232,229,226,242,
+ 229,119,128, 5,178,241,225,237,225,244,115,135, 5,179,100,188,
+ 100,193,100,198,100,203,100,212,100,227,100,243,177, 98,128, 5,
+ 179,178, 56,128, 5,179,179, 52,128, 5,179,232,229,226,242,229,
+ 119,128, 5,179,238,225,242,242,239,247,232,229,226,242,229,119,
+ 128, 5,179,241,245,225,242,244,229,242,232,229,226,242,229,119,
+ 128, 5,179,247,233,228,229,232,229,226,242,229,119,128, 5,179,
+ 243,229,231,239,108,135, 5,177,101, 22,101, 27,101, 32,101, 37,
+ 101, 46,101, 61,101, 77,177, 55,128, 5,177,178, 52,128, 5,177,
+ 179, 48,128, 5,177,232,229,226,242,229,119,128, 5,177,238,225,
+ 242,242,239,247,232,229,226,242,229,119,128, 5,177,241,245,225,
+ 242,244,229,242,232,229,226,242,229,119,128, 5,177,247,233,228,
+ 229,232,229,226,242,229,119,128, 5,177, 98, 3,101, 98,101,103,
+ 101,113,225,114,128, 1, 39,239,240,239,237,239,230,111,128, 49,
+ 15,242,229,246,229,226,229,236,239,119,128, 30, 43, 99, 2,101,
+ 131,101,140,229,228,233,236,236, 97,128, 30, 41,233,242, 99, 2,
+ 101,148,101,153,236,101,128, 36,215,245,237,230,236,229,120,128,
+ 1, 37,100, 2,101,168,101,178,233,229,242,229,243,233,115,128,
+ 30, 39,239,116, 2,101,185,101,194,225,227,227,229,238,116,128,
+ 30, 35,226,229,236,239,119,128, 30, 37,101,136, 5,212,101,222,
+ 101,255,102, 19,102,248,103, 8,103, 53,103, 62,103, 75,225,242,
+ 116,129, 38,101,101,230,243,245,233,116, 2,101,239,101,247,226,
+ 236,225,227,107,128, 38,101,247,232,233,244,101,128, 38, 97,228,
+ 225,231,229,243,104,129,251, 52,102, 10,232,229,226,242,229,119,
+ 128,251, 52,104, 6,102, 33,102, 61,102, 69,102,119,102,165,102,
+ 214, 97, 2,102, 39,102, 53,236,244,239,238,229,225,242,225,226,
+ 233, 99,128, 6,193,242,225,226,233, 99,128, 6, 71,229,226,242,
+ 229,119,128, 5,212,230,233,238,225,236, 97, 2,102, 80,102,111,
+ 236,116, 2,102, 87,102, 99,239,238,229,225,242,225,226,233, 99,
+ 128,251,167,244,247,239,225,242,225,226,233, 99,128,254,234,242,
+ 225,226,233, 99,128,254,234,232,225,237,250,225,225,226,239,246,
+ 101, 2,102,134,102,148,230,233,238,225,236,225,242,225,226,233,
+ 99,128,251,165,233,243,239,236,225,244,229,228,225,242,225,226,
+ 233, 99,128,251,164,105, 2,102,171,102,205,238,233,244,233,225,
+ 236, 97, 2,102,183,102,197,236,244,239,238,229,225,242,225,226,
+ 233, 99,128,251,168,242,225,226,233, 99,128,254,235,242,225,231,
+ 225,238, 97,128, 48,120,237,229,228,233,225,236, 97, 2,102,226,
+ 102,240,236,244,239,238,229,225,242,225,226,233, 99,128,251,169,
+ 242,225,226,233, 99,128,254,236,233,243,229,233,229,242,225,243,
+ 241,245,225,242,101,128, 51,123,107, 2,103, 14,103, 38,225,244,
+ 225,235,225,238, 97,129, 48,216,103, 26,232,225,236,230,247,233,
+ 228,244,104,128,255,141,245,244,225,225,242,245,243,241,245,225,
+ 242,101,128, 51, 54,238,231,232,239,239,107,128, 2,103,242,245,
+ 244,245,243,241,245,225,242,101,128, 51, 57,116,129, 5,215,103,
+ 81,232,229,226,242,229,119,128, 5,215,232,239,239,107,129, 2,
+ 102,103, 99,243,245,240,229,242,233,239,114,128, 2,177,105, 4,
+ 103,120,103,205,103,216,103,241,229,245,104, 4,103,132,103,167,
+ 103,182,103,191, 97, 2,103,138,103,153,227,233,242,227,236,229,
+ 235,239,242,229,225,110,128, 50,123,240,225,242,229,238,235,239,
+ 242,229,225,110,128, 50, 27,227,233,242,227,236,229,235,239,242,
+ 229,225,110,128, 50,109,235,239,242,229,225,110,128, 49, 78,240,
+ 225,242,229,238,235,239,242,229,225,110,128, 50, 13,232,233,242,
+ 225,231,225,238, 97,128, 48,114,235,225,244,225,235,225,238, 97,
+ 129, 48,210,103,229,232,225,236,230,247,233,228,244,104,128,255,
+ 139,242,233,113,134, 5,180,104, 3,104, 8,104, 22,104, 31,104,
+ 46,104, 62,177, 52,128, 5,180, 50, 2,104, 14,104, 18, 49,128,
+ 5,180,100,128, 5,180,232,229,226,242,229,119,128, 5,180,238,
+ 225,242,242,239,247,232,229,226,242,229,119,128, 5,180,241,245,
+ 225,242,244,229,242,232,229,226,242,229,119,128, 5,180,247,233,
+ 228,229,232,229,226,242,229,119,128, 5,180,236,233,238,229,226,
+ 229,236,239,119,128, 30,150,237,239,238,239,243,240,225,227,101,
+ 128,255, 72,111, 9,104,119,104,130,104,154,104,179,105, 11,105,
+ 24,105,110,105,150,105,161,225,242,237,229,238,233,225,110,128,
+ 5,112,232,105, 2,104,137,104,145,240,244,232,225,105,128, 14,
+ 43,242,225,231,225,238, 97,128, 48,123,235,225,244,225,235,225,
+ 238, 97,129, 48,219,104,167,232,225,236,230,247,233,228,244,104,
+ 128,255,142,236,225,109,135, 5,185,104,199,104,204,104,209,104,
+ 214,104,223,104,238,104,254,177, 57,128, 5,185,178, 54,128, 5,
+ 185,179, 50,128, 5,185,232,229,226,242,229,119,128, 5,185,238,
+ 225,242,242,239,247,232,229,226,242,229,119,128, 5,185,241,245,
+ 225,242,244,229,242,232,229,226,242,229,119,128, 5,185,247,233,
+ 228,229,232,229,226,242,229,119,128, 5,185,238,239,235,232,245,
+ 235,244,232,225,105,128, 14, 46,111, 2,105, 30,105,100,107, 4,
+ 105, 40,105, 52,105, 58,105, 80,225,226,239,246,229,227,239,237,
+ 98,128, 3, 9,227,237, 98,128, 3, 9,240,225,236,225,244,225,
+ 236,233,250,229,228,226,229,236,239,247,227,237, 98,128, 3, 33,
+ 242,229,244,242,239,230,236,229,248,226,229,236,239,247,227,237,
+ 98,128, 3, 34,238,243,241,245,225,242,101,128, 51, 66,114, 2,
+ 105,116,105,143,105, 2,105,122,105,131,227,239,240,244,233, 99,
+ 128, 3,233,250,239,238,244,225,236,226,225,114,128, 32, 21,238,
+ 227,237, 98,128, 3, 27,244,243,240,242,233,238,231,115,128, 38,
+ 104,245,243,101,128, 35, 2,240,225,242,229,110,128, 36,163,243,
+ 245,240,229,242,233,239,114,128, 2,176,244,245,242,238,229,100,
+ 128, 2,101,117, 4,105,205,105,216,105,229,105,254,232,233,242,
+ 225,231,225,238, 97,128, 48,117,233,233,244,239,243,241,245,225,
+ 242,101,128, 51, 51,235,225,244,225,235,225,238, 97,129, 48,213,
+ 105,242,232,225,236,230,247,233,228,244,104,128,255,140,238,231,
+ 225,242,245,237,236,225,245,116,129, 2,221,106, 13,227,237, 98,
+ 128, 3, 11,118,128, 1,149,249,240,232,229,110,132, 0, 45,106,
+ 39,106, 50,106, 62,106, 85,233,238,230,229,242,233,239,114,128,
+ 246,229,237,239,238,239,243,240,225,227,101,128,255, 13,115, 2,
+ 106, 68,106, 75,237,225,236,108,128,254, 99,245,240,229,242,233,
+ 239,114,128,246,230,244,247,111,128, 32, 16,105,149, 0,105,106,
+ 137,106,160,106,194,106,241,110,123,110,243,111, 24,111, 51,111,
+ 213,111,217,111,255,112, 21,112,105,113, 14,113, 89,113, 97,113,
+ 110,113,197,113,254,114, 26,114, 70,225, 99, 2,106,144,106,150,
+ 245,244,101,128, 0,237,249,242,233,236,236,233, 99,128, 4, 79,
+ 98, 3,106,168,106,177,106,187,229,238,231,225,236,105,128, 9,
+ 135,239,240,239,237,239,230,111,128, 49, 39,242,229,246,101,128,
+ 1, 45, 99, 3,106,202,106,209,106,231,225,242,239,110,128, 1,
+ 208,233,242, 99, 2,106,217,106,222,236,101,128, 36,216,245,237,
+ 230,236,229,120,128, 0,238,249,242,233,236,236,233, 99,128, 4,
+ 86,100, 4,106,251,107, 5,110, 80,110,113,226,236,231,242,225,
+ 246,101,128, 2, 9,101, 2,107, 11,110, 75,239,231,242,225,240,
+ 104, 7,107, 32,107, 46,107, 59,109,244,110, 19,110, 32,110, 44,
+ 229,225,242,244,232,227,233,242,227,236,101,128, 50,143,230,233,
+ 242,229,227,233,242,227,236,101,128, 50,139,233, 99, 14,107, 90,
+ 107,106,107,205,108, 3,108, 69,108, 98,108,114,108,171,108,220,
+ 108,232,109, 3,109, 70,109,208,109,237,225,236,236,233,225,238,
+ 227,229,240,225,242,229,110,128, 50, 63, 99, 4,107,116,107,127,
+ 107,141,107,148,225,236,236,240,225,242,229,110,128, 50, 58,229,
+ 238,244,242,229,227,233,242,227,236,101,128, 50,165,236,239,243,
+ 101,128, 48, 6,111, 3,107,156,107,171,107,191,237,237, 97,129,
+ 48, 1,107,164,236,229,230,116,128,255,100,238,231,242,225,244,
+ 245,236,225,244,233,239,238,240,225,242,229,110,128, 50, 55,242,
+ 242,229,227,244,227,233,242,227,236,101,128, 50,163,101, 3,107,
+ 213,107,225,107,242,225,242,244,232,240,225,242,229,110,128, 50,
+ 47,238,244,229,242,240,242,233,243,229,240,225,242,229,110,128,
+ 50, 61,248,227,229,236,236,229,238,244,227,233,242,227,236,101,
+ 128, 50,157,102, 2,108, 9,108, 24,229,243,244,233,246,225,236,
+ 240,225,242,229,110,128, 50, 64,105, 2,108, 30,108, 59,238,225,
+ 238,227,233,225,108, 2,108, 42,108, 51,227,233,242,227,236,101,
+ 128, 50,150,240,225,242,229,110,128, 50, 54,242,229,240,225,242,
+ 229,110,128, 50, 43,104, 2,108, 75,108, 86,225,246,229,240,225,
+ 242,229,110,128, 50, 50,233,231,232,227,233,242,227,236,101,128,
+ 50,164,233,244,229,242,225,244,233,239,238,237,225,242,107,128,
+ 48, 5,108, 3,108,122,108,148,108,160,225,226,239,114, 2,108,
+ 131,108,140,227,233,242,227,236,101,128, 50,152,240,225,242,229,
+ 110,128, 50, 56,229,230,244,227,233,242,227,236,101,128, 50,167,
+ 239,247,227,233,242,227,236,101,128, 50,166,109, 2,108,177,108,
+ 209,101, 2,108,183,108,198,228,233,227,233,238,229,227,233,242,
+ 227,236,101,128, 50,169,244,225,236,240,225,242,229,110,128, 50,
+ 46,239,239,238,240,225,242,229,110,128, 50, 42,238,225,237,229,
+ 240,225,242,229,110,128, 50, 52,112, 2,108,238,108,246,229,242,
+ 233,239,100,128, 48, 2,242,233,238,244,227,233,242,227,236,101,
+ 128, 50,158,114, 2,109, 9,109, 57,101, 3,109, 17,109, 28,109,
+ 43,225,227,232,240,225,242,229,110,128, 50, 67,240,242,229,243,
+ 229,238,244,240,225,242,229,110,128, 50, 57,243,239,245,242,227,
+ 229,240,225,242,229,110,128, 50, 62,233,231,232,244,227,233,242,
+ 227,236,101,128, 50,168,115, 5,109, 82,109,111,109,125,109,150,
+ 109,178,101, 2,109, 88,109,101,227,242,229,244,227,233,242,227,
+ 236,101,128, 50,153,236,230,240,225,242,229,110,128, 50, 66,239,
+ 227,233,229,244,249,240,225,242,229,110,128, 50, 51,112, 2,109,
+ 131,109,137,225,227,101,128, 48, 0,229,227,233,225,236,240,225,
+ 242,229,110,128, 50, 53,116, 2,109,156,109,167,239,227,235,240,
+ 225,242,229,110,128, 50, 49,245,228,249,240,225,242,229,110,128,
+ 50, 59,117, 2,109,184,109,193,238,240,225,242,229,110,128, 50,
+ 48,240,229,242,246,233,243,229,240,225,242,229,110,128, 50, 60,
+ 119, 2,109,214,109,226,225,244,229,242,240,225,242,229,110,128,
+ 50, 44,239,239,228,240,225,242,229,110,128, 50, 45,250,229,242,
+ 111,128, 48, 7,109, 2,109,250,110, 7,229,244,225,236,227,233,
+ 242,227,236,101,128, 50,142,239,239,238,227,233,242,227,236,101,
+ 128, 50,138,238,225,237,229,227,233,242,227,236,101,128, 50,148,
+ 243,245,238,227,233,242,227,236,101,128, 50,144,119, 2,110, 50,
+ 110, 63,225,244,229,242,227,233,242,227,236,101,128, 50,140,239,
+ 239,228,227,233,242,227,236,101,128, 50,141,246, 97,128, 9, 7,
+ 233,229,242,229,243,233,115,130, 0,239,110, 94,110,102,225,227,
+ 245,244,101,128, 30, 47,227,249,242,233,236,236,233, 99,128, 4,
+ 229,239,244,226,229,236,239,119,128, 30,203,101, 3,110,131,110,
+ 147,110,158,226,242,229,246,229,227,249,242,233,236,236,233, 99,
+ 128, 4,215,227,249,242,233,236,236,233, 99,128, 4, 53,245,238,
+ 103, 4,110,170,110,205,110,220,110,229, 97, 2,110,176,110,191,
+ 227,233,242,227,236,229,235,239,242,229,225,110,128, 50,117,240,
+ 225,242,229,238,235,239,242,229,225,110,128, 50, 21,227,233,242,
+ 227,236,229,235,239,242,229,225,110,128, 50,103,235,239,242,229,
+ 225,110,128, 49, 71,240,225,242,229,238,235,239,242,229,225,110,
+ 128, 50, 7,103, 2,110,249,111, 0,242,225,246,101,128, 0,236,
+ 117, 2,111, 6,111, 15,234,225,242,225,244,105,128, 10,135,242,
+ 237,245,235,232,105,128, 10, 7,104, 2,111, 30,111, 40,233,242,
+ 225,231,225,238, 97,128, 48, 68,239,239,235,225,226,239,246,101,
+ 128, 30,201,105, 8,111, 69,111, 79,111, 90,111, 97,111,122,111,
+ 138,111,153,111,169,226,229,238,231,225,236,105,128, 9,136,227,
+ 249,242,233,236,236,233, 99,128, 4, 56,228,229,246, 97,128, 9,
+ 8,231,117, 2,111,104,111,113,234,225,242,225,244,105,128, 10,
+ 136,242,237,245,235,232,105,128, 10, 8,237,225,244,242,225,231,
+ 245,242,237,245,235,232,105,128, 10, 64,238,246,229,242,244,229,
+ 228,226,242,229,246,101,128, 2, 11,243,232,239,242,244,227,249,
+ 242,233,236,236,233, 99,128, 4, 57,246,239,247,229,236,243,233,
+ 231,110, 3,111,185,111,195,111,202,226,229,238,231,225,236,105,
+ 128, 9,192,228,229,246, 97,128, 9, 64,231,245,234,225,242,225,
+ 244,105,128, 10,192,106,128, 1, 51,107, 2,111,223,111,247,225,
+ 244,225,235,225,238, 97,129, 48,164,111,235,232,225,236,230,247,
+ 233,228,244,104,128,255,114,239,242,229,225,110,128, 49, 99,108,
+ 2,112, 5,112, 10,228,101,128, 2,220,245,249,232,229,226,242,
+ 229,119,128, 5,172,109, 2,112, 27,112, 94, 97, 3,112, 35,112,
+ 55,112, 80,227,242,239,110,129, 1, 43,112, 44,227,249,242,233,
+ 236,236,233, 99,128, 4,227,231,229,239,242,225,240,240,242,239,
+ 248,233,237,225,244,229,236,249,229,241,245,225,108,128, 34, 83,
+ 244,242,225,231,245,242,237,245,235,232,105,128, 10, 63,239,238,
+ 239,243,240,225,227,101,128,255, 73,110, 5,112,117,112,127,112,
+ 136,112,148,112,232,227,242,229,237,229,238,116,128, 34, 6,230,
+ 233,238,233,244,121,128, 34, 30,233,225,242,237,229,238,233,225,
+ 110,128, 5,107,116, 2,112,154,112,222,101, 2,112,160,112,211,
+ 231,242,225,108,131, 34, 43,112,173,112,191,112,196, 98, 2,112,
+ 179,112,187,239,244,244,239,109,128, 35, 33,116,128, 35, 33,229,
+ 120,128,248,245,116, 2,112,202,112,207,239,112,128, 35, 32,112,
+ 128, 35, 32,242,243,229,227,244,233,239,110,128, 34, 41,233,243,
+ 241,245,225,242,101,128, 51, 5,118, 3,112,240,112,249,113, 2,
+ 226,245,236,236,229,116,128, 37,216,227,233,242,227,236,101,128,
+ 37,217,243,237,233,236,229,230,225,227,101,128, 38, 59,111, 3,
+ 113, 22,113, 33,113, 41,227,249,242,233,236,236,233, 99,128, 4,
+ 81,231,239,238,229,107,128, 1, 47,244, 97,131, 3,185,113, 52,
+ 113, 73,113, 81,228,233,229,242,229,243,233,115,129, 3,202,113,
+ 65,244,239,238,239,115,128, 3,144,236,225,244,233,110,128, 2,
+ 105,244,239,238,239,115,128, 3,175,240,225,242,229,110,128, 36,
+ 164,242,233,231,245,242,237,245,235,232,105,128, 10,114,115, 4,
+ 113,120,113,165,113,179,113,187,237,225,236,108, 2,113,129,113,
+ 140,232,233,242,225,231,225,238, 97,128, 48, 67,235,225,244,225,
+ 235,225,238, 97,129, 48,163,113,153,232,225,236,230,247,233,228,
+ 244,104,128,255,104,243,232,225,242,226,229,238,231,225,236,105,
+ 128, 9,250,244,242,239,235,101,128, 2,104,245,240,229,242,233,
+ 239,114,128,246,237,116, 2,113,203,113,237,229,242,225,244,233,
+ 239,110, 2,113,215,113,226,232,233,242,225,231,225,238, 97,128,
+ 48,157,235,225,244,225,235,225,238, 97,128, 48,253,233,236,228,
+ 101,129, 1, 41,113,246,226,229,236,239,119,128, 30, 45,117, 2,
+ 114, 4,114, 15,226,239,240,239,237,239,230,111,128, 49, 41,227,
+ 249,242,233,236,236,233, 99,128, 4, 78,246,239,247,229,236,243,
+ 233,231,110, 3,114, 42,114, 52,114, 59,226,229,238,231,225,236,
+ 105,128, 9,191,228,229,246, 97,128, 9, 63,231,245,234,225,242,
+ 225,244,105,128, 10,191,250,232,233,244,243, 97, 2,114, 81,114,
+ 92,227,249,242,233,236,236,233, 99,128, 4,117,228,226,236,231,
+ 242,225,246,229,227,249,242,233,236,236,233, 99,128, 4,119,106,
+ 138, 0,106,114,135,114,198,114,209,115, 3,115, 19,115,132,115,
+ 201,115,206,115,218,115,226, 97, 4,114,145,114,156,114,166,114,
+ 173,225,242,237,229,238,233,225,110,128, 5,113,226,229,238,231,
+ 225,236,105,128, 9,156,228,229,246, 97,128, 9, 28,231,117, 2,
+ 114,180,114,189,234,225,242,225,244,105,128, 10,156,242,237,245,
+ 235,232,105,128, 10, 28,226,239,240,239,237,239,230,111,128, 49,
+ 16, 99, 3,114,217,114,224,114,246,225,242,239,110,128, 1,240,
+ 233,242, 99, 2,114,232,114,237,236,101,128, 36,217,245,237,230,
+ 236,229,120,128, 1, 53,242,239,243,243,229,228,244,225,233,108,
+ 128, 2,157,228,239,244,236,229,243,243,243,244,242,239,235,101,
+ 128, 2, 95,101, 3,115, 27,115, 38,115,103,227,249,242,233,236,
+ 236,233, 99,128, 4, 88,229,109, 4,115, 49,115, 58,115, 72,115,
+ 88,225,242,225,226,233, 99,128, 6, 44,230,233,238,225,236,225,
+ 242,225,226,233, 99,128,254,158,233,238,233,244,233,225,236,225,
+ 242,225,226,233, 99,128,254,159,237,229,228,233,225,236,225,242,
+ 225,226,233, 99,128,254,160,104, 2,115,109,115,118,225,242,225,
+ 226,233, 99,128, 6,152,230,233,238,225,236,225,242,225,226,233,
+ 99,128,251,139,104, 2,115,138,115,188, 97, 3,115,146,115,156,
+ 115,163,226,229,238,231,225,236,105,128, 9,157,228,229,246, 97,
+ 128, 9, 29,231,117, 2,115,170,115,179,234,225,242,225,244,105,
+ 128, 10,157,242,237,245,235,232,105,128, 10, 29,229,232,225,242,
+ 237,229,238,233,225,110,128, 5,123,233,115,128, 48, 4,237,239,
+ 238,239,243,240,225,227,101,128,255, 74,240,225,242,229,110,128,
+ 36,165,243,245,240,229,242,233,239,114,128, 2,178,107,146, 0,
+ 107,116, 21,118,110,118,121,118,183,118,194,119, 28,119, 42,120,
+ 150,121, 90,121,103,121,129,121,178,122, 60,122, 82,122, 95,122,
+ 118,122,160,122,170, 97, 12,116, 47,116, 79,116,101,116,131,116,
+ 245,117, 14,117, 44,117, 69,117,175,117,189,118, 56,118, 85, 98,
+ 2,116, 53,116, 70,225,243,232,235,233,242,227,249,242,233,236,
+ 236,233, 99,128, 4,161,229,238,231,225,236,105,128, 9,149, 99,
+ 2,116, 85,116, 91,245,244,101,128, 30, 49,249,242,233,236,236,
+ 233, 99,128, 4, 58,228,101, 2,116,108,116,126,243,227,229,238,
+ 228,229,242,227,249,242,233,236,236,233, 99,128, 4,155,246, 97,
+ 128, 9, 21,102,135, 5,219,116,149,116,158,116,178,116,192,116,
+ 201,116,217,116,232,225,242,225,226,233, 99,128, 6, 67,228,225,
+ 231,229,243,104,129,251, 59,116,169,232,229,226,242,229,119,128,
+ 251, 59,230,233,238,225,236,225,242,225,226,233, 99,128,254,218,
+ 232,229,226,242,229,119,128, 5,219,233,238,233,244,233,225,236,
+ 225,242,225,226,233, 99,128,254,219,237,229,228,233,225,236,225,
+ 242,225,226,233, 99,128,254,220,242,225,230,229,232,229,226,242,
+ 229,119,128,251, 77,231,117, 2,116,252,117, 5,234,225,242,225,
+ 244,105,128, 10,149,242,237,245,235,232,105,128, 10, 21,104, 2,
+ 117, 20,117, 30,233,242,225,231,225,238, 97,128, 48, 75,239,239,
+ 235,227,249,242,233,236,236,233, 99,128, 4,196,235,225,244,225,
+ 235,225,238, 97,129, 48,171,117, 57,232,225,236,230,247,233,228,
+ 244,104,128,255,118,112, 2,117, 75,117, 96,240, 97,129, 3,186,
+ 117, 82,243,249,237,226,239,236,231,242,229,229,107,128, 3,240,
+ 249,229,239,245,110, 3,117,108,117,122,117,156,237,233,229,245,
+ 237,235,239,242,229,225,110,128, 49,113,112, 2,117,128,117,143,
+ 232,233,229,245,240,232,235,239,242,229,225,110,128, 49,132,233,
+ 229,245,240,235,239,242,229,225,110,128, 49,120,243,243,225,238,
+ 231,240,233,229,245,240,235,239,242,229,225,110,128, 49,121,242,
+ 239,242,233,233,243,241,245,225,242,101,128, 51, 13,115, 5,117,
+ 201,117,245,118, 4,118, 12,118, 40,232,233,228,225,225,245,244,
+ 111, 2,117,214,117,223,225,242,225,226,233, 99,128, 6, 64,238,
+ 239,243,233,228,229,226,229,225,242,233,238,231,225,242,225,226,
+ 233, 99,128, 6, 64,237,225,236,236,235,225,244,225,235,225,238,
+ 97,128, 48,245,241,245,225,242,101,128, 51,132,242, 97, 2,118,
+ 19,118, 28,225,242,225,226,233, 99,128, 6, 80,244,225,238,225,
+ 242,225,226,233, 99,128, 6, 77,244,242,239,235,229,227,249,242,
+ 233,236,236,233, 99,128, 4,159,244,225,232,233,242,225,240,242,
+ 239,236,239,238,231,237,225,242,235,232,225,236,230,247,233,228,
+ 244,104,128,255,112,246,229,242,244,233,227,225,236,243,244,242,
+ 239,235,229,227,249,242,233,236,236,233, 99,128, 4,157,226,239,
+ 240,239,237,239,230,111,128, 49, 14, 99, 4,118,131,118,153,118,
+ 162,118,170, 97, 2,118,137,118,147,236,243,241,245,225,242,101,
+ 128, 51,137,242,239,110,128, 1,233,229,228,233,236,236, 97,128,
+ 1, 55,233,242,227,236,101,128, 36,218,239,237,237,225,225,227,
+ 227,229,238,116,128, 1, 55,228,239,244,226,229,236,239,119,128,
+ 30, 51,101, 4,118,204,118,231,119, 0,119, 12,104, 2,118,210,
+ 118,221,225,242,237,229,238,233,225,110,128, 5,132,233,242,225,
+ 231,225,238, 97,128, 48, 81,235,225,244,225,235,225,238, 97,129,
+ 48,177,118,244,232,225,236,230,247,233,228,244,104,128,255,121,
+ 238,225,242,237,229,238,233,225,110,128, 5,111,243,237,225,236,
+ 236,235,225,244,225,235,225,238, 97,128, 48,246,231,242,229,229,
+ 238,236,225,238,228,233, 99,128, 1, 56,104, 6,119, 56,119,185,
+ 119,196,119,221,120, 52,120,140, 97, 5,119, 68,119, 78,119, 89,
+ 119, 96,119,121,226,229,238,231,225,236,105,128, 9,150,227,249,
+ 242,233,236,236,233, 99,128, 4, 69,228,229,246, 97,128, 9, 22,
+ 231,117, 2,119,103,119,112,234,225,242,225,244,105,128, 10,150,
+ 242,237,245,235,232,105,128, 10, 22,104, 4,119,131,119,140,119,
+ 154,119,170,225,242,225,226,233, 99,128, 6, 46,230,233,238,225,
+ 236,225,242,225,226,233, 99,128,254,166,233,238,233,244,233,225,
+ 236,225,242,225,226,233, 99,128,254,167,237,229,228,233,225,236,
+ 225,242,225,226,233, 99,128,254,168,229,233,227,239,240,244,233,
+ 99,128, 3,231,232, 97, 2,119,203,119,210,228,229,246, 97,128,
+ 9, 89,231,245,242,237,245,235,232,105,128, 10, 89,233,229,245,
+ 235,104, 4,119,235,120, 14,120, 29,120, 38, 97, 2,119,241,120,
+ 0,227,233,242,227,236,229,235,239,242,229,225,110,128, 50,120,
+ 240,225,242,229,238,235,239,242,229,225,110,128, 50, 24,227,233,
+ 242,227,236,229,235,239,242,229,225,110,128, 50,106,235,239,242,
+ 229,225,110,128, 49, 75,240,225,242,229,238,235,239,242,229,225,
+ 110,128, 50, 10,111, 4,120, 62,120,111,120,121,120,126,235,104,
+ 4,120, 73,120, 82,120, 91,120,101,225,233,244,232,225,105,128,
+ 14, 2,239,238,244,232,225,105,128, 14, 5,245,225,244,244,232,
+ 225,105,128, 14, 3,247,225,233,244,232,225,105,128, 14, 4,237,
+ 245,244,244,232,225,105,128, 14, 91,239,107,128, 1,153,242,225,
+ 235,232,225,238,231,244,232,225,105,128, 14, 6,250,243,241,245,
+ 225,242,101,128, 51,145,105, 4,120,160,120,171,120,196,120,245,
+ 232,233,242,225,231,225,238, 97,128, 48, 77,235,225,244,225,235,
+ 225,238, 97,129, 48,173,120,184,232,225,236,230,247,233,228,244,
+ 104,128,255,119,242,111, 3,120,205,120,220,120,236,231,245,242,
+ 225,237,245,243,241,245,225,242,101,128, 51, 21,237,229,229,244,
+ 239,242,245,243,241,245,225,242,101,128, 51, 22,243,241,245,225,
+ 242,101,128, 51, 20,249,229,239,107, 5,121, 4,121, 39,121, 54,
+ 121, 63,121, 77, 97, 2,121, 10,121, 25,227,233,242,227,236,229,
+ 235,239,242,229,225,110,128, 50,110,240,225,242,229,238,235,239,
+ 242,229,225,110,128, 50, 14,227,233,242,227,236,229,235,239,242,
+ 229,225,110,128, 50, 96,235,239,242,229,225,110,128, 49, 49,240,
+ 225,242,229,238,235,239,242,229,225,110,128, 50, 0,243,233,239,
+ 243,235,239,242,229,225,110,128, 49, 51,234,229,227,249,242,233,
+ 236,236,233, 99,128, 4, 92,108, 2,121,109,121,120,233,238,229,
+ 226,229,236,239,119,128, 30, 53,243,241,245,225,242,101,128, 51,
+ 152,109, 3,121,137,121,151,121,162,227,245,226,229,228,243,241,
+ 245,225,242,101,128, 51,166,239,238,239,243,240,225,227,101,128,
+ 255, 75,243,241,245,225,242,229,228,243,241,245,225,242,101,128,
+ 51,162,111, 5,121,190,121,216,121,254,122, 10,122, 24,104, 2,
+ 121,196,121,206,233,242,225,231,225,238, 97,128, 48, 83,237,243,
+ 241,245,225,242,101,128, 51,192,235, 97, 2,121,223,121,231,233,
+ 244,232,225,105,128, 14, 1,244,225,235,225,238, 97,129, 48,179,
+ 121,242,232,225,236,230,247,233,228,244,104,128,255,122,239,240,
+ 239,243,241,245,225,242,101,128, 51, 30,240,240,225,227,249,242,
+ 233,236,236,233, 99,128, 4,129,114, 2,122, 30,122, 50,229,225,
+ 238,243,244,225,238,228,225,242,228,243,249,237,226,239,108,128,
+ 50,127,239,238,233,243,227,237, 98,128, 3, 67,240, 97, 2,122,
+ 67,122, 73,242,229,110,128, 36,166,243,241,245,225,242,101,128,
+ 51,170,243,233,227,249,242,233,236,236,233, 99,128, 4,111,116,
+ 2,122,101,122,110,243,241,245,225,242,101,128, 51,207,245,242,
+ 238,229,100,128, 2,158,117, 2,122,124,122,135,232,233,242,225,
+ 231,225,238, 97,128, 48, 79,235,225,244,225,235,225,238, 97,129,
+ 48,175,122,148,232,225,236,230,247,233,228,244,104,128,255,120,
+ 246,243,241,245,225,242,101,128, 51,184,247,243,241,245,225,242,
+ 101,128, 51,190,108,146, 0,108,122,220,124,247,125, 20,125, 86,
+ 125,124,126, 20,126, 29,126, 45,126, 69,126, 87,126,205,126,246,
+ 127,125,127,133,127,166,127,175,127,183,127,245, 97, 7,122,236,
+ 122,246,122,253,123, 4,123, 29,123, 45,124,235,226,229,238,231,
+ 225,236,105,128, 9,178,227,245,244,101,128, 1, 58,228,229,246,
+ 97,128, 9, 50,231,117, 2,123, 11,123, 20,234,225,242,225,244,
+ 105,128, 10,178,242,237,245,235,232,105,128, 10, 50,235,235,232,
+ 225,238,231,249,225,239,244,232,225,105,128, 14, 69,109, 10,123,
+ 67,124, 6,124, 23,124, 61,124, 75,124, 94,124,110,124,130,124,
+ 150,124,173, 97, 2,123, 73,123,254,236,229,102, 4,123, 85,123,
+ 99,123,191,123,208,230,233,238,225,236,225,242,225,226,233, 99,
+ 128,254,252,232,225,237,250, 97, 2,123,109,123,150,225,226,239,
+ 246,101, 2,123,119,123,133,230,233,238,225,236,225,242,225,226,
+ 233, 99,128,254,248,233,243,239,236,225,244,229,228,225,242,225,
+ 226,233, 99,128,254,247,226,229,236,239,119, 2,123,160,123,174,
+ 230,233,238,225,236,225,242,225,226,233, 99,128,254,250,233,243,
+ 239,236,225,244,229,228,225,242,225,226,233, 99,128,254,249,233,
+ 243,239,236,225,244,229,228,225,242,225,226,233, 99,128,254,251,
+ 237,225,228,228,225,225,226,239,246,101, 2,123,223,123,237,230,
+ 233,238,225,236,225,242,225,226,233, 99,128,254,246,233,243,239,
+ 236,225,244,229,228,225,242,225,226,233, 99,128,254,245,242,225,
+ 226,233, 99,128, 6, 68,226,228, 97,129, 3,187,124, 14,243,244,
+ 242,239,235,101,128, 1,155,229,100,130, 5,220,124, 32,124, 52,
+ 228,225,231,229,243,104,129,251, 60,124, 43,232,229,226,242,229,
+ 119,128,251, 60,232,229,226,242,229,119,128, 5,220,230,233,238,
+ 225,236,225,242,225,226,233, 99,128,254,222,232,225,232,233,238,
+ 233,244,233,225,236,225,242,225,226,233, 99,128,252,202,233,238,
+ 233,244,233,225,236,225,242,225,226,233, 99,128,254,223,234,229,
+ 229,237,233,238,233,244,233,225,236,225,242,225,226,233, 99,128,
+ 252,201,235,232,225,232,233,238,233,244,233,225,236,225,242,225,
+ 226,233, 99,128,252,203,236,225,237,232,229,232,233,243,239,236,
+ 225,244,229,228,225,242,225,226,233, 99,128,253,242,237,101, 2,
+ 124,180,124,193,228,233,225,236,225,242,225,226,233, 99,128,254,
+ 224,229,109, 2,124,200,124,219,232,225,232,233,238,233,244,233,
+ 225,236,225,242,225,226,233, 99,128,253,136,233,238,233,244,233,
+ 225,236,225,242,225,226,233, 99,128,252,204,242,231,229,227,233,
+ 242,227,236,101,128, 37,239, 98, 3,124,255,125, 4,125, 10,225,
+ 114,128, 1,154,229,236,116,128, 2,108,239,240,239,237,239,230,
+ 111,128, 49, 12, 99, 4,125, 30,125, 37,125, 46,125, 73,225,242,
+ 239,110,128, 1, 62,229,228,233,236,236, 97,128, 1, 60,233,242,
+ 99, 2,125, 54,125, 59,236,101,128, 36,219,245,237,230,236,229,
+ 248,226,229,236,239,119,128, 30, 61,239,237,237,225,225,227,227,
+ 229,238,116,128, 1, 60,228,239,116,130, 1, 64,125, 96,125,105,
+ 225,227,227,229,238,116,128, 1, 64,226,229,236,239,119,129, 30,
+ 55,125,115,237,225,227,242,239,110,128, 30, 57,101, 3,125,132,
+ 125,170,126, 15,230,116, 2,125,139,125,155,225,238,231,236,229,
+ 225,226,239,246,229,227,237, 98,128, 3, 26,244,225,227,235,226,
+ 229,236,239,247,227,237, 98,128, 3, 24,243,115,132, 0, 60,125,
+ 183,125,205,125,217,126, 7,229,241,245,225,108,129, 34,100,125,
+ 193,239,242,231,242,229,225,244,229,114,128, 34,218,237,239,238,
+ 239,243,240,225,227,101,128,255, 28,111, 2,125,223,125,252,114,
+ 2,125,229,125,242,229,241,245,233,246,225,236,229,238,116,128,
+ 34,114,231,242,229,225,244,229,114,128, 34,118,246,229,242,229,
+ 241,245,225,108,128, 34,102,243,237,225,236,108,128,254,100,250,
+ 104,128, 2,110,230,226,236,239,227,107,128, 37,140,232,239,239,
+ 235,242,229,244,242,239,230,236,229,120,128, 2,109,105, 2,126,
+ 51,126, 56,242, 97,128, 32,164,247,238,225,242,237,229,238,233,
+ 225,110,128, 5,108,106,129, 1,201,126, 75,229,227,249,242,233,
+ 236,236,233, 99,128, 4, 89,108,132,246,192,126, 99,126,123,126,
+ 134,126,143, 97, 2,126,105,126,112,228,229,246, 97,128, 9, 51,
+ 231,245,234,225,242,225,244,105,128, 10,179,233,238,229,226,229,
+ 236,239,119,128, 30, 59,236,225,228,229,246, 97,128, 9, 52,246,
+ 239,227,225,236,233, 99, 3,126,157,126,167,126,174,226,229,238,
+ 231,225,236,105,128, 9,225,228,229,246, 97,128, 9, 97,246,239,
+ 247,229,236,243,233,231,110, 2,126,188,126,198,226,229,238,231,
+ 225,236,105,128, 9,227,228,229,246, 97,128, 9, 99,109, 3,126,
+ 213,126,226,126,237,233,228,228,236,229,244,233,236,228,101,128,
+ 2,107,239,238,239,243,240,225,227,101,128,255, 76,243,241,245,
+ 225,242,101,128, 51,208,111, 6,127, 4,127, 16,127, 58,127, 69,
+ 127, 75,127,117,227,232,245,236,225,244,232,225,105,128, 14, 44,
+ 231,233,227,225,108, 3,127, 28,127, 34,127, 53,225,238,100,128,
+ 34, 39,238,239,116,129, 0,172,127, 42,242,229,246,229,242,243,
+ 229,100,128, 35, 16,239,114,128, 34, 40,236,233,238,231,244,232,
+ 225,105,128, 14, 37,238,231,115,128, 1,127,247,236,233,238,101,
+ 2,127, 85,127,108, 99, 2,127, 91,127,103,229,238,244,229,242,
+ 236,233,238,101,128,254, 78,237, 98,128, 3, 50,228,225,243,232,
+ 229,100,128,254, 77,250,229,238,231,101,128, 37,202,240,225,242,
+ 229,110,128, 36,167,115, 3,127,141,127,148,127,156,236,225,243,
+ 104,128, 1, 66,241,245,225,242,101,128, 33, 19,245,240,229,242,
+ 233,239,114,128,246,238,244,243,232,225,228,101,128, 37,145,245,
+ 244,232,225,105,128, 14, 38,246,239,227,225,236,233, 99, 3,127,
+ 197,127,207,127,214,226,229,238,231,225,236,105,128, 9,140,228,
+ 229,246, 97,128, 9, 12,246,239,247,229,236,243,233,231,110, 2,
+ 127,228,127,238,226,229,238,231,225,236,105,128, 9,226,228,229,
+ 246, 97,128, 9, 98,248,243,241,245,225,242,101,128, 51,211,109,
+ 144, 0,109,128, 35,130,144,130,169,130,196,130,221,132, 18,132,
+ 40,133, 95,133,125,133,174,134, 25,134, 47,134, 72,134, 81,135,
+ 108,135,136, 97, 12,128, 61,128, 71,128,135,128,142,128,167,128,
+ 215,130, 51,130, 76,130, 81,130, 95,130,107,130,112,226,229,238,
+ 231,225,236,105,128, 9,174, 99, 2,128, 77,128,129,242,239,110,
+ 132, 0,175,128, 91,128,102,128,108,128,117,226,229,236,239,247,
+ 227,237, 98,128, 3, 49,227,237, 98,128, 3, 4,236,239,247,237,
+ 239,100,128, 2,205,237,239,238,239,243,240,225,227,101,128,255,
+ 227,245,244,101,128, 30, 63,228,229,246, 97,128, 9, 46,231,117,
+ 2,128,149,128,158,234,225,242,225,244,105,128, 10,174,242,237,
+ 245,235,232,105,128, 10, 46,104, 2,128,173,128,205,225,240,225,
+ 235,104, 2,128,183,128,192,232,229,226,242,229,119,128, 5,164,
+ 236,229,230,244,232,229,226,242,229,119,128, 5,164,233,242,225,
+ 231,225,238, 97,128, 48,126,105, 5,128,227,129, 40,129,103,129,
+ 133,130, 39,227,232,225,244,244,225,247, 97, 3,128,242,129, 17,
+ 129, 24,236,239,119, 2,128,250,129, 5,236,229,230,244,244,232,
+ 225,105,128,248,149,242,233,231,232,244,244,232,225,105,128,248,
+ 148,244,232,225,105,128, 14, 75,245,240,240,229,242,236,229,230,
+ 244,244,232,225,105,128,248,147,229,107, 3,129, 49,129, 80,129,
+ 87,236,239,119, 2,129, 57,129, 68,236,229,230,244,244,232,225,
+ 105,128,248,140,242,233,231,232,244,244,232,225,105,128,248,139,
+ 244,232,225,105,128, 14, 72,245,240,240,229,242,236,229,230,244,
+ 244,232,225,105,128,248,138,232,225,238,225,235,225,116, 2,129,
+ 115,129,126,236,229,230,244,244,232,225,105,128,248,132,244,232,
+ 225,105,128, 14, 49,116, 3,129,141,129,169,129,232,225,233,235,
+ 232,117, 2,129,151,129,162,236,229,230,244,244,232,225,105,128,
+ 248,137,244,232,225,105,128, 14, 71,232,111, 3,129,178,129,209,
+ 129,216,236,239,119, 2,129,186,129,197,236,229,230,244,244,232,
+ 225,105,128,248,143,242,233,231,232,244,244,232,225,105,128,248,
+ 142,244,232,225,105,128, 14, 73,245,240,240,229,242,236,229,230,
+ 244,244,232,225,105,128,248,141,242,105, 3,129,241,130, 16,130,
+ 23,236,239,119, 2,129,249,130, 4,236,229,230,244,244,232,225,
+ 105,128,248,146,242,233,231,232,244,244,232,225,105,128,248,145,
+ 244,232,225,105,128, 14, 74,245,240,240,229,242,236,229,230,244,
+ 244,232,225,105,128,248,144,249,225,237,239,235,244,232,225,105,
+ 128, 14, 70,235,225,244,225,235,225,238, 97,129, 48,222,130, 64,
+ 232,225,236,230,247,233,228,244,104,128,255,143,236,101,128, 38,
+ 66,238,243,249,239,238,243,241,245,225,242,101,128, 51, 71,241,
+ 225,230,232,229,226,242,229,119,128, 5,190,242,115,128, 38, 66,
+ 115, 2,130,118,130,136,239,242,225,227,233,242,227,236,229,232,
+ 229,226,242,229,119,128, 5,175,241,245,225,242,101,128, 51,131,
+ 98, 2,130,150,130,160,239,240,239,237,239,230,111,128, 49, 7,
+ 243,241,245,225,242,101,128, 51,212, 99, 2,130,175,130,183,233,
+ 242,227,236,101,128, 36,220,245,226,229,228,243,241,245,225,242,
+ 101,128, 51,165,228,239,116, 2,130,204,130,213,225,227,227,229,
+ 238,116,128, 30, 65,226,229,236,239,119,128, 30, 67,101, 7,130,
+ 237,131,108,131,119,131,134,131,159,131,196,131,208,101, 2,130,
+ 243,131, 95,109, 4,130,253,131, 6,131, 20,131, 36,225,242,225,
+ 226,233, 99,128, 6, 69,230,233,238,225,236,225,242,225,226,233,
+ 99,128,254,226,233,238,233,244,233,225,236,225,242,225,226,233,
+ 99,128,254,227,237,101, 2,131, 43,131, 56,228,233,225,236,225,
+ 242,225,226,233, 99,128,254,228,229,237,105, 2,131, 64,131, 79,
+ 238,233,244,233,225,236,225,242,225,226,233, 99,128,252,209,243,
+ 239,236,225,244,229,228,225,242,225,226,233, 99,128,252, 72,244,
+ 239,242,245,243,241,245,225,242,101,128, 51, 77,232,233,242,225,
+ 231,225,238, 97,128, 48,129,233,250,233,229,242,225,243,241,245,
+ 225,242,101,128, 51,126,235,225,244,225,235,225,238, 97,129, 48,
+ 225,131,147,232,225,236,230,247,233,228,244,104,128,255,146,109,
+ 130, 5,222,131,167,131,187,228,225,231,229,243,104,129,251, 62,
+ 131,178,232,229,226,242,229,119,128,251, 62,232,229,226,242,229,
+ 119,128, 5,222,238,225,242,237,229,238,233,225,110,128, 5,116,
+ 242,235,232, 97, 3,131,219,131,228,132, 5,232,229,226,242,229,
+ 119,128, 5,165,235,229,230,245,236, 97, 2,131,239,131,248,232,
+ 229,226,242,229,119,128, 5,166,236,229,230,244,232,229,226,242,
+ 229,119,128, 5,166,236,229,230,244,232,229,226,242,229,119,128,
+ 5,165,104, 2,132, 24,132, 30,239,239,107,128, 2,113,250,243,
+ 241,245,225,242,101,128, 51,146,105, 6,132, 54,132, 91,132,228,
+ 132,239,133, 8,133, 65,228,100, 2,132, 61,132, 86,236,229,228,
+ 239,244,235,225,244,225,235,225,238,225,232,225,236,230,247,233,
+ 228,244,104,128,255,101,239,116,128, 0,183,229,245,109, 5,132,
+ 105,132,140,132,155,132,164,132,215, 97, 2,132,111,132,126,227,
+ 233,242,227,236,229,235,239,242,229,225,110,128, 50,114,240,225,
+ 242,229,238,235,239,242,229,225,110,128, 50, 18,227,233,242,227,
+ 236,229,235,239,242,229,225,110,128, 50,100,235,239,242,229,225,
+ 110,128, 49, 65,112, 2,132,170,132,202, 97, 2,132,176,132,190,
+ 238,243,233,239,243,235,239,242,229,225,110,128, 49,112,242,229,
+ 238,235,239,242,229,225,110,128, 50, 4,233,229,245,240,235,239,
+ 242,229,225,110,128, 49,110,243,233,239,243,235,239,242,229,225,
+ 110,128, 49,111,232,233,242,225,231,225,238, 97,128, 48,127,235,
+ 225,244,225,235,225,238, 97,129, 48,223,132,252,232,225,236,230,
+ 247,233,228,244,104,128,255,144,238,117, 2,133, 15,133, 60,115,
+ 132, 34, 18,133, 27,133, 38,133, 47,133, 53,226,229,236,239,247,
+ 227,237, 98,128, 3, 32,227,233,242,227,236,101,128, 34,150,237,
+ 239,100,128, 2,215,240,236,245,115,128, 34, 19,244,101,128, 32,
+ 50,242,105, 2,133, 72,133, 86,226,225,225,242,245,243,241,245,
+ 225,242,101,128, 51, 74,243,241,245,225,242,101,128, 51, 73,108,
+ 2,133,101,133,116,239,238,231,236,229,231,244,245,242,238,229,
+ 100,128, 2,112,243,241,245,225,242,101,128, 51,150,109, 3,133,
+ 133,133,147,133,158,227,245,226,229,228,243,241,245,225,242,101,
+ 128, 51,163,239,238,239,243,240,225,227,101,128,255, 77,243,241,
+ 245,225,242,229,228,243,241,245,225,242,101,128, 51,159,111, 5,
+ 133,186,133,212,133,237,133,247,134, 0,104, 2,133,192,133,202,
+ 233,242,225,231,225,238, 97,128, 48,130,237,243,241,245,225,242,
+ 101,128, 51,193,235,225,244,225,235,225,238, 97,129, 48,226,133,
+ 225,232,225,236,230,247,233,228,244,104,128,255,147,236,243,241,
+ 245,225,242,101,128, 51,214,237,225,244,232,225,105,128, 14, 33,
+ 246,229,242,243,243,241,245,225,242,101,129, 51,167,134, 15,228,
+ 243,241,245,225,242,101,128, 51,168,240, 97, 2,134, 32,134, 38,
+ 242,229,110,128, 36,168,243,241,245,225,242,101,128, 51,171,115,
+ 2,134, 53,134, 62,243,241,245,225,242,101,128, 51,179,245,240,
+ 229,242,233,239,114,128,246,239,244,245,242,238,229,100,128, 2,
+ 111,117,141, 0,181,134,111,134,115,134,125,134,149,134,159,134,
+ 181,134,192,134,217,134,240,134,250,135, 24,135, 88,135, 98, 49,
+ 128, 0,181,225,243,241,245,225,242,101,128, 51,130,227,104, 2,
+ 134,132,134,142,231,242,229,225,244,229,114,128, 34,107,236,229,
+ 243,115,128, 34,106,230,243,241,245,225,242,101,128, 51,140,103,
+ 2,134,165,134,172,242,229,229,107,128, 3,188,243,241,245,225,
+ 242,101,128, 51,141,232,233,242,225,231,225,238, 97,128, 48,128,
+ 235,225,244,225,235,225,238, 97,129, 48,224,134,205,232,225,236,
+ 230,247,233,228,244,104,128,255,145,108, 2,134,223,134,232,243,
+ 241,245,225,242,101,128, 51,149,244,233,240,236,121,128, 0,215,
+ 237,243,241,245,225,242,101,128, 51,155,238,225,104, 2,135, 2,
+ 135, 11,232,229,226,242,229,119,128, 5,163,236,229,230,244,232,
+ 229,226,242,229,119,128, 5,163,115, 2,135, 30,135, 79,233, 99,
+ 3,135, 39,135, 56,135, 67,225,236,238,239,244,101,129, 38,106,
+ 135, 50,228,226,108,128, 38,107,230,236,225,244,243,233,231,110,
+ 128, 38,109,243,232,225,242,240,243,233,231,110,128, 38,111,243,
+ 241,245,225,242,101,128, 51,178,246,243,241,245,225,242,101,128,
+ 51,182,247,243,241,245,225,242,101,128, 51,188,118, 2,135,114,
+ 135,127,237,229,231,225,243,241,245,225,242,101,128, 51,185,243,
+ 241,245,225,242,101,128, 51,183,119, 2,135,142,135,155,237,229,
+ 231,225,243,241,245,225,242,101,128, 51,191,243,241,245,225,242,
+ 101,128, 51,189,110,150, 0,110,135,212,136, 90,136,114,136,180,
+ 136,205,137, 7,137, 17,137, 84,137,127,139,161,139,179,139,204,
+ 139,235,140, 5,140, 70,142, 52,142, 60,142, 85,142, 93,143, 61,
+ 143, 71,143, 81, 97, 8,135,230,135,250,136, 1,136, 8,136, 33,
+ 136, 44,136, 69,136, 81, 98, 2,135,236,135,245,229,238,231,225,
+ 236,105,128, 9,168,236, 97,128, 34, 7,227,245,244,101,128, 1,
+ 68,228,229,246, 97,128, 9, 40,231,117, 2,136, 15,136, 24,234,
+ 225,242,225,244,105,128, 10,168,242,237,245,235,232,105,128, 10,
+ 40,232,233,242,225,231,225,238, 97,128, 48,106,235,225,244,225,
+ 235,225,238, 97,129, 48,202,136, 57,232,225,236,230,247,233,228,
+ 244,104,128,255,133,240,239,243,244,242,239,240,232,101,128, 1,
+ 73,243,241,245,225,242,101,128, 51,129, 98, 2,136, 96,136,106,
+ 239,240,239,237,239,230,111,128, 49, 11,243,240,225,227,101,128,
+ 0,160, 99, 4,136,124,136,131,136,140,136,167,225,242,239,110,
+ 128, 1, 72,229,228,233,236,236, 97,128, 1, 70,233,242, 99, 2,
+ 136,148,136,153,236,101,128, 36,221,245,237,230,236,229,248,226,
+ 229,236,239,119,128, 30, 75,239,237,237,225,225,227,227,229,238,
+ 116,128, 1, 70,228,239,116, 2,136,188,136,197,225,227,227,229,
+ 238,116,128, 30, 69,226,229,236,239,119,128, 30, 71,101, 3,136,
+ 213,136,224,136,249,232,233,242,225,231,225,238, 97,128, 48,109,
+ 235,225,244,225,235,225,238, 97,129, 48,205,136,237,232,225,236,
+ 230,247,233,228,244,104,128,255,136,247,243,232,229,241,229,236,
+ 243,233,231,110,128, 32,170,230,243,241,245,225,242,101,128, 51,
+ 139,103, 2,137, 23,137, 73, 97, 3,137, 31,137, 41,137, 48,226,
+ 229,238,231,225,236,105,128, 9,153,228,229,246, 97,128, 9, 25,
+ 231,117, 2,137, 55,137, 64,234,225,242,225,244,105,128, 10,153,
+ 242,237,245,235,232,105,128, 10, 25,239,238,231,245,244,232,225,
+ 105,128, 14, 7,104, 2,137, 90,137,100,233,242,225,231,225,238,
+ 97,128, 48,147,239,239,107, 2,137,108,137,115,236,229,230,116,
+ 128, 2,114,242,229,244,242,239,230,236,229,120,128, 2,115,105,
+ 4,137,137,138, 50,138, 61,138,119,229,245,110, 7,137,155,137,
+ 190,137,222,137,236,137,245,138, 22,138, 35, 97, 2,137,161,137,
+ 176,227,233,242,227,236,229,235,239,242,229,225,110,128, 50,111,
+ 240,225,242,229,238,235,239,242,229,225,110,128, 50, 15,227,105,
+ 2,137,197,137,209,229,245,227,235,239,242,229,225,110,128, 49,
+ 53,242,227,236,229,235,239,242,229,225,110,128, 50, 97,232,233,
+ 229,245,232,235,239,242,229,225,110,128, 49, 54,235,239,242,229,
+ 225,110,128, 49, 52,240, 97, 2,137,252,138, 10,238,243,233,239,
+ 243,235,239,242,229,225,110,128, 49,104,242,229,238,235,239,242,
+ 229,225,110,128, 50, 1,243,233,239,243,235,239,242,229,225,110,
+ 128, 49,103,244,233,235,229,245,244,235,239,242,229,225,110,128,
+ 49,102,232,233,242,225,231,225,238, 97,128, 48,107,107, 2,138,
+ 67,138, 91,225,244,225,235,225,238, 97,129, 48,203,138, 79,232,
+ 225,236,230,247,233,228,244,104,128,255,134,232,225,232,233,116,
+ 2,138,101,138,112,236,229,230,244,244,232,225,105,128,248,153,
+ 244,232,225,105,128, 14, 77,238,101,141, 0, 57,138,150,138,159,
+ 138,169,138,199,138,206,138,231,139, 2,139, 36,139, 48,139, 59,
+ 139, 92,139,100,139,111,225,242,225,226,233, 99,128, 6,105,226,
+ 229,238,231,225,236,105,128, 9,239,227,233,242,227,236,101,129,
+ 36,104,138,180,233,238,246,229,242,243,229,243,225,238,243,243,
+ 229,242,233,102,128, 39,146,228,229,246, 97,128, 9,111,231,117,
+ 2,138,213,138,222,234,225,242,225,244,105,128, 10,239,242,237,
+ 245,235,232,105,128, 10,111,232, 97, 2,138,238,138,249,227,235,
+ 225,242,225,226,233, 99,128, 6,105,238,231,250,232,239,117,128,
+ 48, 41,105, 2,139, 8,139, 26,228,229,239,231,242,225,240,232,
+ 233,227,240,225,242,229,110,128, 50, 40,238,230,229,242,233,239,
+ 114,128, 32,137,237,239,238,239,243,240,225,227,101,128,255, 25,
+ 239,236,228,243,244,249,236,101,128,247, 57,112, 2,139, 65,139,
+ 72,225,242,229,110,128, 36,124,229,114, 2,139, 79,139, 85,233,
+ 239,100,128, 36,144,243,233,225,110,128, 6,249,242,239,237,225,
+ 110,128, 33,120,243,245,240,229,242,233,239,114,128, 32,121,116,
+ 2,139,117,139,155,229,229,110, 2,139,125,139,134,227,233,242,
+ 227,236,101,128, 36,114,112, 2,139,140,139,147,225,242,229,110,
+ 128, 36,134,229,242,233,239,100,128, 36,154,232,225,105,128, 14,
+ 89,106,129, 1,204,139,167,229,227,249,242,233,236,236,233, 99,
+ 128, 4, 90,235,225,244,225,235,225,238, 97,129, 48,243,139,192,
+ 232,225,236,230,247,233,228,244,104,128,255,157,108, 2,139,210,
+ 139,224,229,231,242,233,231,232,244,236,239,238,103,128, 1,158,
+ 233,238,229,226,229,236,239,119,128, 30, 73,109, 2,139,241,139,
+ 252,239,238,239,243,240,225,227,101,128,255, 78,243,241,245,225,
+ 242,101,128, 51,154,110, 2,140, 11,140, 61, 97, 3,140, 19,140,
+ 29,140, 36,226,229,238,231,225,236,105,128, 9,163,228,229,246,
+ 97,128, 9, 35,231,117, 2,140, 43,140, 52,234,225,242,225,244,
+ 105,128, 10,163,242,237,245,235,232,105,128, 10, 35,238,225,228,
+ 229,246, 97,128, 9, 41,111, 6,140, 84,140, 95,140,120,140,161,
+ 141,113,142, 40,232,233,242,225,231,225,238, 97,128, 48,110,235,
+ 225,244,225,235,225,238, 97,129, 48,206,140,108,232,225,236,230,
+ 247,233,228,244,104,128,255,137,110, 3,140,128,140,144,140,153,
+ 226,242,229,225,235,233,238,231,243,240,225,227,101,128, 0,160,
+ 229,238,244,232,225,105,128, 14, 19,245,244,232,225,105,128, 14,
+ 25,239,110, 7,140,178,140,187,140,201,140,235,140,251,141, 36,
+ 141, 95,225,242,225,226,233, 99,128, 6, 70,230,233,238,225,236,
+ 225,242,225,226,233, 99,128,254,230,231,232,245,238,238, 97, 2,
+ 140,212,140,221,225,242,225,226,233, 99,128, 6,186,230,233,238,
+ 225,236,225,242,225,226,233, 99,128,251,159,233,238,233,244,233,
+ 225,236,225,242,225,226,233, 99,128,254,231,234,229,229,237,105,
+ 2,141, 5,141, 20,238,233,244,233,225,236,225,242,225,226,233,
+ 99,128,252,210,243,239,236,225,244,229,228,225,242,225,226,233,
+ 99,128,252, 75,237,101, 2,141, 43,141, 56,228,233,225,236,225,
+ 242,225,226,233, 99,128,254,232,229,237,105, 2,141, 64,141, 79,
+ 238,233,244,233,225,236,225,242,225,226,233, 99,128,252,213,243,
+ 239,236,225,244,229,228,225,242,225,226,233, 99,128,252, 78,238,
+ 239,239,238,230,233,238,225,236,225,242,225,226,233, 99,128,252,
+ 141,116, 7,141,129,141,140,141,169,141,204,141,216,141,236,142,
+ 6,227,239,238,244,225,233,238,115,128, 34, 12,101, 2,141,146,
+ 141,162,236,229,237,229,238,116,129, 34, 9,141,157,239,102,128,
+ 34, 9,241,245,225,108,128, 34, 96,231,242,229,225,244,229,114,
+ 129, 34,111,141,181,238,239,114, 2,141,189,141,197,229,241,245,
+ 225,108,128, 34,113,236,229,243,115,128, 34,121,233,228,229,238,
+ 244,233,227,225,108,128, 34, 98,236,229,243,115,129, 34,110,141,
+ 225,238,239,242,229,241,245,225,108,128, 34,112,112, 2,141,242,
+ 141,252,225,242,225,236,236,229,108,128, 34, 38,242,229,227,229,
+ 228,229,115,128, 34,128,243,117, 3,142, 15,142, 22,142, 31,226,
+ 243,229,116,128, 34,132,227,227,229,229,228,115,128, 34,129,240,
+ 229,242,243,229,116,128, 34,133,247,225,242,237,229,238,233,225,
+ 110,128, 5,118,240,225,242,229,110,128, 36,169,115, 2,142, 66,
+ 142, 75,243,241,245,225,242,101,128, 51,177,245,240,229,242,233,
+ 239,114,128, 32,127,244,233,236,228,101,128, 0,241,117,132, 3,
+ 189,142,105,142,116,142,197,143, 24,232,233,242,225,231,225,238,
+ 97,128, 48,108,107, 2,142,122,142,146,225,244,225,235,225,238,
+ 97,129, 48,204,142,134,232,225,236,230,247,233,228,244,104,128,
+ 255,135,244, 97, 3,142,155,142,165,142,172,226,229,238,231,225,
+ 236,105,128, 9,188,228,229,246, 97,128, 9, 60,231,117, 2,142,
+ 179,142,188,234,225,242,225,244,105,128, 10,188,242,237,245,235,
+ 232,105,128, 10, 60,109, 2,142,203,142,237,226,229,242,243,233,
+ 231,110,130, 0, 35,142,217,142,229,237,239,238,239,243,240,225,
+ 227,101,128,255, 3,243,237,225,236,108,128,254, 95,229,114, 2,
+ 142,244,143, 20,225,236,243,233,231,110, 2,142,255,143, 7,231,
+ 242,229,229,107,128, 3,116,236,239,247,229,242,231,242,229,229,
+ 107,128, 3,117,111,128, 33, 22,110,130, 5,224,143, 32,143, 52,
+ 228,225,231,229,243,104,129,251, 64,143, 43,232,229,226,242,229,
+ 119,128,251, 64,232,229,226,242,229,119,128, 5,224,246,243,241,
+ 245,225,242,101,128, 51,181,247,243,241,245,225,242,101,128, 51,
+ 187,249, 97, 3,143, 90,143,100,143,107,226,229,238,231,225,236,
+ 105,128, 9,158,228,229,246, 97,128, 9, 30,231,117, 2,143,114,
+ 143,123,234,225,242,225,244,105,128, 10,158,242,237,245,235,232,
+ 105,128, 10, 30,111,147, 0,111,143,174,143,196,144, 18,144,188,
+ 145, 4,145, 19,145, 59,145,182,145,203,145,241,145,252,146,174,
+ 148, 8,148, 72,148,105,148,151,149, 24,149, 71,149, 83, 97, 2,
+ 143,180,143,187,227,245,244,101,128, 0,243,238,231,244,232,225,
+ 105,128, 14, 45, 98, 4,143,206,143,248,144, 1,144, 11,225,242,
+ 242,229,100,130, 2,117,143,218,143,229,227,249,242,233,236,236,
+ 233, 99,128, 4,233,228,233,229,242,229,243,233,243,227,249,242,
+ 233,236,236,233, 99,128, 4,235,229,238,231,225,236,105,128, 9,
+ 147,239,240,239,237,239,230,111,128, 49, 27,242,229,246,101,128,
+ 1, 79, 99, 3,144, 26,144, 99,144,178, 97, 2,144, 32,144, 93,
+ 238,228,242, 97, 3,144, 43,144, 50,144, 61,228,229,246, 97,128,
+ 9, 17,231,245,234,225,242,225,244,105,128, 10,145,246,239,247,
+ 229,236,243,233,231,110, 2,144, 75,144, 82,228,229,246, 97,128,
+ 9, 73,231,245,234,225,242,225,244,105,128, 10,201,242,239,110,
+ 128, 1,210,233,242, 99, 2,144,107,144,112,236,101,128, 36,222,
+ 245,237,230,236,229,120,133, 0,244,144,131,144,139,144,150,144,
+ 158,144,170,225,227,245,244,101,128, 30,209,228,239,244,226,229,
+ 236,239,119,128, 30,217,231,242,225,246,101,128, 30,211,232,239,
+ 239,235,225,226,239,246,101,128, 30,213,244,233,236,228,101,128,
+ 30,215,249,242,233,236,236,233, 99,128, 4, 62,100, 4,144,198,
+ 144,221,144,227,144,250,226,108, 2,144,205,144,213,225,227,245,
+ 244,101,128, 1, 81,231,242,225,246,101,128, 2, 13,229,246, 97,
+ 128, 9, 19,233,229,242,229,243,233,115,129, 0,246,144,239,227,
+ 249,242,233,236,236,233, 99,128, 4,231,239,244,226,229,236,239,
+ 119,128, 30,205,101,129, 1, 83,145, 10,235,239,242,229,225,110,
+ 128, 49, 90,103, 3,145, 27,145, 42,145, 49,239,238,229,107,129,
+ 2,219,145, 36,227,237, 98,128, 3, 40,242,225,246,101,128, 0,
+ 242,245,234,225,242,225,244,105,128, 10,147,104, 4,145, 69,145,
+ 80,145, 90,145,168,225,242,237,229,238,233,225,110,128, 5,133,
+ 233,242,225,231,225,238, 97,128, 48, 74,111, 2,145, 96,145,106,
+ 239,235,225,226,239,246,101,128, 30,207,242,110,133, 1,161,145,
+ 121,145,129,145,140,145,148,145,160,225,227,245,244,101,128, 30,
+ 219,228,239,244,226,229,236,239,119,128, 30,227,231,242,225,246,
+ 101,128, 30,221,232,239,239,235,225,226,239,246,101,128, 30,223,
+ 244,233,236,228,101,128, 30,225,245,238,231,225,242,245,237,236,
+ 225,245,116,128, 1, 81,105,129, 1,163,145,188,238,246,229,242,
+ 244,229,228,226,242,229,246,101,128, 2, 15,107, 2,145,209,145,
+ 233,225,244,225,235,225,238, 97,129, 48,170,145,221,232,225,236,
+ 230,247,233,228,244,104,128,255,117,239,242,229,225,110,128, 49,
+ 87,236,229,232,229,226,242,229,119,128, 5,171,109, 6,146, 10,
+ 146, 38,146, 45,146,134,146,145,146,163,225,227,242,239,110,130,
+ 1, 77,146, 22,146, 30,225,227,245,244,101,128, 30, 83,231,242,
+ 225,246,101,128, 30, 81,228,229,246, 97,128, 9, 80,229,231, 97,
+ 133, 3,201,146, 61,146, 65,146, 76,146, 90,146,106, 49,128, 3,
+ 214,227,249,242,233,236,236,233, 99,128, 4, 97,236,225,244,233,
+ 238,227,236,239,243,229,100,128, 2,119,242,239,245,238,228,227,
+ 249,242,233,236,236,233, 99,128, 4,123,116, 2,146,112,146,127,
+ 233,244,236,239,227,249,242,233,236,236,233, 99,128, 4,125,239,
+ 238,239,115,128, 3,206,231,245,234,225,242,225,244,105,128, 10,
+ 208,233,227,242,239,110,129, 3,191,146,155,244,239,238,239,115,
+ 128, 3,204,239,238,239,243,240,225,227,101,128,255, 79,238,101,
+ 145, 0, 49,146,213,146,222,146,232,147, 6,147, 31,147, 40,147,
+ 49,147, 74,147,108,147,142,147,154,147,173,147,184,147,217,147,
+ 227,147,235,147,246,225,242,225,226,233, 99,128, 6, 97,226,229,
+ 238,231,225,236,105,128, 9,231,227,233,242,227,236,101,129, 36,
+ 96,146,243,233,238,246,229,242,243,229,243,225,238,243,243,229,
+ 242,233,102,128, 39,138,100, 2,147, 12,147, 18,229,246, 97,128,
+ 9,103,239,244,229,238,236,229,225,228,229,114,128, 32, 36,229,
+ 233,231,232,244,104,128, 33, 91,230,233,244,244,229,100,128,246,
+ 220,231,117, 2,147, 56,147, 65,234,225,242,225,244,105,128, 10,
+ 231,242,237,245,235,232,105,128, 10,103,232, 97, 3,147, 83,147,
+ 94,147, 99,227,235,225,242,225,226,233, 99,128, 6, 97,236,102,
+ 128, 0,189,238,231,250,232,239,117,128, 48, 33,105, 2,147,114,
+ 147,132,228,229,239,231,242,225,240,232,233,227,240,225,242,229,
+ 110,128, 50, 32,238,230,229,242,233,239,114,128, 32,129,237,239,
+ 238,239,243,240,225,227,101,128,255, 17,238,245,237,229,242,225,
+ 244,239,242,226,229,238,231,225,236,105,128, 9,244,239,236,228,
+ 243,244,249,236,101,128,247, 49,112, 2,147,190,147,197,225,242,
+ 229,110,128, 36,116,229,114, 2,147,204,147,210,233,239,100,128,
+ 36,136,243,233,225,110,128, 6,241,241,245,225,242,244,229,114,
+ 128, 0,188,242,239,237,225,110,128, 33,112,243,245,240,229,242,
+ 233,239,114,128, 0,185,244,104, 2,147,253,148, 2,225,105,128,
+ 14, 81,233,242,100,128, 33, 83,111, 3,148, 16,148, 50,148, 66,
+ 103, 2,148, 22,148, 40,239,238,229,107,129, 1,235,148, 31,237,
+ 225,227,242,239,110,128, 1,237,245,242,237,245,235,232,105,128,
+ 10, 19,237,225,244,242,225,231,245,242,237,245,235,232,105,128,
+ 10, 75,240,229,110,128, 2, 84,112, 3,148, 80,148, 87,148, 98,
+ 225,242,229,110,128, 36,170,229,238,226,245,236,236,229,116,128,
+ 37,230,244,233,239,110,128, 35, 37,114, 2,148,111,148,140,100,
+ 2,148,117,148,128,230,229,237,233,238,233,238,101,128, 0,170,
+ 237,225,243,227,245,236,233,238,101,128, 0,186,244,232,239,231,
+ 239,238,225,108,128, 34, 31,115, 5,148,163,148,195,148,212,149,
+ 1,149, 14,232,239,242,116, 2,148,172,148,179,228,229,246, 97,
+ 128, 9, 18,246,239,247,229,236,243,233,231,238,228,229,246, 97,
+ 128, 9, 74,236,225,243,104,129, 0,248,148,204,225,227,245,244,
+ 101,128, 1,255,237,225,236,108, 2,148,221,148,232,232,233,242,
+ 225,231,225,238, 97,128, 48, 73,235,225,244,225,235,225,238, 97,
+ 129, 48,169,148,245,232,225,236,230,247,233,228,244,104,128,255,
+ 107,244,242,239,235,229,225,227,245,244,101,128, 1,255,245,240,
+ 229,242,233,239,114,128,246,240,116, 2,149, 30,149, 41,227,249,
+ 242,233,236,236,233, 99,128, 4,127,233,236,228,101,130, 0,245,
+ 149, 52,149, 60,225,227,245,244,101,128, 30, 77,228,233,229,242,
+ 229,243,233,115,128, 30, 79,245,226,239,240,239,237,239,230,111,
+ 128, 49, 33,118, 2,149, 89,149,170,229,114, 2,149, 96,149,162,
+ 236,233,238,101,131, 32, 62,149,109,149,132,149,155, 99, 2,149,
+ 115,149,127,229,238,244,229,242,236,233,238,101,128,254, 74,237,
+ 98,128, 3, 5,100, 2,149,138,149,146,225,243,232,229,100,128,
+ 254, 73,226,236,247,225,246,121,128,254, 76,247,225,246,121,128,
+ 254, 75,243,227,239,242,101,128, 0,175,239,247,229,236,243,233,
+ 231,110, 3,149,185,149,195,149,202,226,229,238,231,225,236,105,
+ 128, 9,203,228,229,246, 97,128, 9, 75,231,245,234,225,242,225,
+ 244,105,128, 10,203,112,145, 0,112,149,251,152,123,152,134,152,
+ 143,152,155,154, 80,154, 90,155, 82,156,101,156,191,156,217,157,
+ 92,157,100,158, 2,158, 60,158, 88,158, 98, 97, 14,150, 25,150,
+ 57,150, 67,150, 74,150, 81,150,129,150,140,150,154,150,165,150,
+ 212,150,226,151,238,152, 21,152,111, 97, 2,150, 31,150, 43,237,
+ 240,243,243,241,245,225,242,101,128, 51,128,243,229,238,244,239,
+ 243,241,245,225,242,101,128, 51, 43,226,229,238,231,225,236,105,
+ 128, 9,170,227,245,244,101,128, 30, 85,228,229,246, 97,128, 9,
+ 42,103, 2,150, 87,150,105,101, 2,150, 93,150,100,228,239,247,
+ 110,128, 33,223,245,112,128, 33,222,117, 2,150,111,150,120,234,
+ 225,242,225,244,105,128, 10,170,242,237,245,235,232,105,128, 10,
+ 42,232,233,242,225,231,225,238, 97,128, 48,113,233,249,225,238,
+ 238,239,233,244,232,225,105,128, 14, 47,235,225,244,225,235,225,
+ 238, 97,128, 48,209,108, 2,150,171,150,196,225,244,225,236,233,
+ 250,225,244,233,239,238,227,249,242,233,236,236,233,227,227,237,
+ 98,128, 4,132,239,227,232,235,225,227,249,242,233,236,236,233,
+ 99,128, 4,192,238,243,233,239,243,235,239,242,229,225,110,128,
+ 49,127,114, 3,150,234,150,255,151,227, 97, 2,150,240,150,248,
+ 231,242,225,240,104,128, 0,182,236,236,229,108,128, 34, 37,229,
+ 110, 2,151, 6,151,116,236,229,230,116,136, 0, 40,151, 29,151,
+ 44,151, 49,151, 54,151, 65,151, 77,151,100,151,105,225,236,244,
+ 239,238,229,225,242,225,226,233, 99,128,253, 62,226,116,128,248,
+ 237,229,120,128,248,236,233,238,230,229,242,233,239,114,128, 32,
+ 141,237,239,238,239,243,240,225,227,101,128,255, 8,115, 2,151,
+ 83,151, 90,237,225,236,108,128,254, 89,245,240,229,242,233,239,
+ 114,128, 32,125,244,112,128,248,235,246,229,242,244,233,227,225,
+ 108,128,254, 53,242,233,231,232,116,136, 0, 41,151,140,151,155,
+ 151,160,151,165,151,176,151,188,151,211,151,216,225,236,244,239,
+ 238,229,225,242,225,226,233, 99,128,253, 63,226,116,128,248,248,
+ 229,120,128,248,247,233,238,230,229,242,233,239,114,128, 32,142,
+ 237,239,238,239,243,240,225,227,101,128,255, 9,115, 2,151,194,
+ 151,201,237,225,236,108,128,254, 90,245,240,229,242,233,239,114,
+ 128, 32,126,244,112,128,248,246,246,229,242,244,233,227,225,108,
+ 128,254, 54,244,233,225,236,228,233,230,102,128, 34, 2,115, 3,
+ 151,246,152, 1,152, 13,229,241,232,229,226,242,229,119,128, 5,
+ 192,232,244,225,232,229,226,242,229,119,128, 5,153,241,245,225,
+ 242,101,128, 51,169,244,225,104,134, 5,183,152, 39,152, 53,152,
+ 58,152, 67,152, 82,152, 98, 49, 2,152, 45,152, 49, 49,128, 5,
+ 183,100,128, 5,183,178, 97,128, 5,183,232,229,226,242,229,119,
+ 128, 5,183,238,225,242,242,239,247,232,229,226,242,229,119,128,
+ 5,183,241,245,225,242,244,229,242,232,229,226,242,229,119,128,
+ 5,183,247,233,228,229,232,229,226,242,229,119,128, 5,183,250,
+ 229,242,232,229,226,242,229,119,128, 5,161,226,239,240,239,237,
+ 239,230,111,128, 49, 6,227,233,242,227,236,101,128, 36,223,228,
+ 239,244,225,227,227,229,238,116,128, 30, 87,101,137, 5,228,152,
+ 177,152,188,152,208,152,220,152,240,153, 86,153, 97,153,118,154,
+ 73,227,249,242,233,236,236,233, 99,128, 4, 63,228,225,231,229,
+ 243,104,129,251, 68,152,199,232,229,226,242,229,119,128,251, 68,
+ 229,250,233,243,241,245,225,242,101,128, 51, 59,230,233,238,225,
+ 236,228,225,231,229,243,232,232,229,226,242,229,119,128,251, 67,
+ 104, 5,152,252,153, 19,153, 27,153, 41,153, 71,225,114, 2,153,
+ 3,153, 10,225,226,233, 99,128, 6,126,237,229,238,233,225,110,
+ 128, 5,122,229,226,242,229,119,128, 5,228,230,233,238,225,236,
+ 225,242,225,226,233, 99,128,251, 87,105, 2,153, 47,153, 62,238,
+ 233,244,233,225,236,225,242,225,226,233, 99,128,251, 88,242,225,
+ 231,225,238, 97,128, 48,122,237,229,228,233,225,236,225,242,225,
+ 226,233, 99,128,251, 89,235,225,244,225,235,225,238, 97,128, 48,
+ 218,237,233,228,228,236,229,232,239,239,235,227,249,242,233,236,
+ 236,233, 99,128, 4,167,114, 5,153,130,153,142,153,184,154, 49,
+ 154, 62,225,230,229,232,229,226,242,229,119,128,251, 78,227,229,
+ 238,116,131, 0, 37,153,155,153,164,153,176,225,242,225,226,233,
+ 99,128, 6,106,237,239,238,239,243,240,225,227,101,128,255, 5,
+ 243,237,225,236,108,128,254,106,105, 2,153,190,154, 31,239,100,
+ 134, 0, 46,153,207,153,218,153,229,153,241,153,252,154, 8,225,
+ 242,237,229,238,233,225,110,128, 5,137,227,229,238,244,229,242,
+ 229,100,128, 0,183,232,225,236,230,247,233,228,244,104,128,255,
+ 97,233,238,230,229,242,233,239,114,128,246,231,237,239,238,239,
+ 243,240,225,227,101,128,255, 14,115, 2,154, 14,154, 21,237,225,
+ 236,108,128,254, 82,245,240,229,242,233,239,114,128,246,232,243,
+ 240,239,237,229,238,233,231,242,229,229,235,227,237, 98,128, 3,
+ 66,240,229,238,228,233,227,245,236,225,114,128, 34,165,244,232,
+ 239,245,243,225,238,100,128, 32, 48,243,229,244, 97,128, 32,167,
+ 230,243,241,245,225,242,101,128, 51,138,104, 3,154, 98,154,148,
+ 155, 29, 97, 3,154,106,154,116,154,123,226,229,238,231,225,236,
+ 105,128, 9,171,228,229,246, 97,128, 9, 43,231,117, 2,154,130,
+ 154,139,234,225,242,225,244,105,128, 10,171,242,237,245,235,232,
+ 105,128, 10, 43,105,133, 3,198,154,162,154,166,154,252,155, 4,
+ 155, 15, 49,128, 3,213,229,245,240,104, 4,154,179,154,214,154,
+ 229,154,238, 97, 2,154,185,154,200,227,233,242,227,236,229,235,
+ 239,242,229,225,110,128, 50,122,240,225,242,229,238,235,239,242,
+ 229,225,110,128, 50, 26,227,233,242,227,236,229,235,239,242,229,
+ 225,110,128, 50,108,235,239,242,229,225,110,128, 49, 77,240,225,
+ 242,229,238,235,239,242,229,225,110,128, 50, 12,236,225,244,233,
+ 110,128, 2,120,238,244,232,245,244,232,225,105,128, 14, 58,243,
+ 249,237,226,239,236,231,242,229,229,107,128, 3,213,111, 3,155,
+ 37,155, 42,155, 68,239,107,128, 1,165,240,104, 2,155, 49,155,
+ 58,225,238,244,232,225,105,128, 14, 30,245,238,231,244,232,225,
+ 105,128, 14, 28,243,225,237,240,232,225,239,244,232,225,105,128,
+ 14, 32,105,133, 3,192,155, 96,156, 52,156, 63,156, 74,156, 88,
+ 229,245,112, 6,155,112,155,147,155,179,155,207,155,221,156, 17,
+ 97, 2,155,118,155,133,227,233,242,227,236,229,235,239,242,229,
+ 225,110,128, 50,115,240,225,242,229,238,235,239,242,229,225,110,
+ 128, 50, 19,227,105, 2,155,154,155,166,229,245,227,235,239,242,
+ 229,225,110,128, 49,118,242,227,236,229,235,239,242,229,225,110,
+ 128, 50,101,107, 2,155,185,155,199,233,249,229,239,235,235,239,
+ 242,229,225,110,128, 49,114,239,242,229,225,110,128, 49, 66,240,
+ 225,242,229,238,235,239,242,229,225,110,128, 50, 5,243,233,239,
+ 115, 2,155,230,156, 2,107, 2,155,236,155,250,233,249,229,239,
+ 235,235,239,242,229,225,110,128, 49,116,239,242,229,225,110,128,
+ 49, 68,244,233,235,229,245,244,235,239,242,229,225,110,128, 49,
+ 117,116, 2,156, 23,156, 38,232,233,229,245,244,232,235,239,242,
+ 229,225,110,128, 49,119,233,235,229,245,244,235,239,242,229,225,
+ 110,128, 49,115,232,233,242,225,231,225,238, 97,128, 48,116,235,
+ 225,244,225,235,225,238, 97,128, 48,212,243,249,237,226,239,236,
+ 231,242,229,229,107,128, 3,214,247,242,225,242,237,229,238,233,
+ 225,110,128, 5,131,236,245,115,132, 0, 43,156,115,156,126,156,
+ 135,156,168,226,229,236,239,247,227,237, 98,128, 3, 31,227,233,
+ 242,227,236,101,128, 34,149,109, 2,156,141,156,148,233,238,245,
+ 115,128, 0,177,111, 2,156,154,156,158,100,128, 2,214,238,239,
+ 243,240,225,227,101,128,255, 11,115, 2,156,174,156,181,237,225,
+ 236,108,128,254, 98,245,240,229,242,233,239,114,128, 32,122,109,
+ 2,156,197,156,208,239,238,239,243,240,225,227,101,128,255, 80,
+ 243,241,245,225,242,101,128, 51,216,111, 5,156,229,156,240,157,
+ 51,157, 62,157, 72,232,233,242,225,231,225,238, 97,128, 48,125,
+ 233,238,244,233,238,231,233,238,228,229,120, 4,157, 4,157, 16,
+ 157, 28,157, 41,228,239,247,238,247,232,233,244,101,128, 38, 31,
+ 236,229,230,244,247,232,233,244,101,128, 38, 28,242,233,231,232,
+ 244,247,232,233,244,101,128, 38, 30,245,240,247,232,233,244,101,
+ 128, 38, 29,235,225,244,225,235,225,238, 97,128, 48,221,240,236,
+ 225,244,232,225,105,128, 14, 27,243,244,225,236,237,225,242,107,
+ 129, 48, 18,157, 85,230,225,227,101,128, 48, 32,240,225,242,229,
+ 110,128, 36,171,114, 3,157,108,157,134,157,159,101, 2,157,114,
+ 157,122,227,229,228,229,115,128, 34,122,243,227,242,233,240,244,
+ 233,239,110,128, 33, 30,233,237,101, 2,157,142,157,148,237,239,
+ 100,128, 2,185,242,229,246,229,242,243,229,100,128, 32, 53,111,
+ 4,157,169,157,176,157,186,157,199,228,245,227,116,128, 34, 15,
+ 234,229,227,244,233,246,101,128, 35, 5,236,239,238,231,229,228,
+ 235,225,238, 97,128, 48,252,112, 2,157,205,157,242,101, 2,157,
+ 211,157,218,236,236,239,114,128, 35, 24,242,243,117, 2,157,226,
+ 157,233,226,243,229,116,128, 34,130,240,229,242,243,229,116,128,
+ 34,131,239,242,244,233,239,110,129, 34, 55,157,253,225,108,128,
+ 34, 29,115, 2,158, 8,158, 51,105,130, 3,200,158, 16,158, 27,
+ 227,249,242,233,236,236,233, 99,128, 4,113,236,233,240,238,229,
+ 245,237,225,244,225,227,249,242,233,236,236,233,227,227,237, 98,
+ 128, 4,134,243,241,245,225,242,101,128, 51,176,117, 2,158, 66,
+ 158, 77,232,233,242,225,231,225,238, 97,128, 48,119,235,225,244,
+ 225,235,225,238, 97,128, 48,215,246,243,241,245,225,242,101,128,
+ 51,180,247,243,241,245,225,242,101,128, 51,186,113,136, 0,113,
+ 158,128,159,177,159,188,159,197,159,204,159,216,159,254,160, 6,
+ 97, 4,158,138,158,161,158,225,159,160,100, 2,158,144,158,150,
+ 229,246, 97,128, 9, 88,237,225,232,229,226,242,229,119,128, 5,
+ 168,102, 4,158,171,158,180,158,194,158,210,225,242,225,226,233,
+ 99,128, 6, 66,230,233,238,225,236,225,242,225,226,233, 99,128,
+ 254,214,233,238,233,244,233,225,236,225,242,225,226,233, 99,128,
+ 254,215,237,229,228,233,225,236,225,242,225,226,233, 99,128,254,
+ 216,237,225,244,115,136, 5,184,158,248,159, 12,159, 26,159, 31,
+ 159, 36,159, 45,159, 60,159,147, 49, 3,159, 0,159, 4,159, 8,
+ 48,128, 5,184, 97,128, 5,184, 99,128, 5,184, 50, 2,159, 18,
+ 159, 22, 55,128, 5,184, 57,128, 5,184,179, 51,128, 5,184,228,
+ 101,128, 5,184,232,229,226,242,229,119,128, 5,184,238,225,242,
+ 242,239,247,232,229,226,242,229,119,128, 5,184,113, 2,159, 66,
+ 159,132,225,244,225,110, 4,159, 79,159, 88,159,103,159,119,232,
+ 229,226,242,229,119,128, 5,184,238,225,242,242,239,247,232,229,
+ 226,242,229,119,128, 5,184,241,245,225,242,244,229,242,232,229,
+ 226,242,229,119,128, 5,184,247,233,228,229,232,229,226,242,229,
+ 119,128, 5,184,245,225,242,244,229,242,232,229,226,242,229,119,
+ 128, 5,184,247,233,228,229,232,229,226,242,229,119,128, 5,184,
+ 242,238,229,249,240,225,242,225,232,229,226,242,229,119,128, 5,
+ 159,226,239,240,239,237,239,230,111,128, 49, 17,227,233,242,227,
+ 236,101,128, 36,224,232,239,239,107,128, 2,160,237,239,238,239,
+ 243,240,225,227,101,128,255, 81,239,102,130, 5,231,159,225,159,
+ 245,228,225,231,229,243,104,129,251, 71,159,236,232,229,226,242,
+ 229,119,128,251, 71,232,229,226,242,229,119,128, 5,231,240,225,
+ 242,229,110,128, 36,172,117, 4,160, 16,160, 28,160,117,160,204,
+ 225,242,244,229,242,238,239,244,101,128, 38,105,226,245,244,115,
+ 135, 5,187,160, 49,160, 54,160, 59,160, 64,160, 73,160, 88,160,
+ 104,177, 56,128, 5,187,178, 53,128, 5,187,179, 49,128, 5,187,
+ 232,229,226,242,229,119,128, 5,187,238,225,242,242,239,247,232,
+ 229,226,242,229,119,128, 5,187,241,245,225,242,244,229,242,232,
+ 229,226,242,229,119,128, 5,187,247,233,228,229,232,229,226,242,
+ 229,119,128, 5,187,229,243,244,233,239,110,133, 0, 63,160,136,
+ 160,159,160,176,160,184,160,196,225,114, 2,160,143,160,150,225,
+ 226,233, 99,128, 6, 31,237,229,238,233,225,110,128, 5, 94,228,
+ 239,247,110,129, 0,191,160,168,243,237,225,236,108,128,247,191,
+ 231,242,229,229,107,128, 3,126,237,239,238,239,243,240,225,227,
+ 101,128,255, 31,243,237,225,236,108,128,247, 63,239,244,101, 4,
+ 160,216,161, 31,161, 51,161, 80,228,226,108,133, 0, 34,160,232,
+ 160,239,160,246,161, 2,161, 23,226,225,243,101,128, 32, 30,236,
+ 229,230,116,128, 32, 28,237,239,238,239,243,240,225,227,101,128,
+ 255, 2,240,242,233,237,101,129, 48, 30,161, 12,242,229,246,229,
+ 242,243,229,100,128, 48, 29,242,233,231,232,116,128, 32, 29,236,
+ 229,230,116,129, 32, 24,161, 40,242,229,246,229,242,243,229,100,
+ 128, 32, 27,114, 2,161, 57,161, 67,229,246,229,242,243,229,100,
+ 128, 32, 27,233,231,232,116,129, 32, 25,161, 76,110,128, 1, 73,
+ 243,233,238,231,108, 2,161, 90,161, 97,226,225,243,101,128, 32,
+ 26,101,129, 0, 39,161,103,237,239,238,239,243,240,225,227,101,
+ 128,255, 7,114,145, 0,114,161,153,162,157,162,168,162,215,163,
+ 10,164, 27,164, 51,164,146,166,180,166,217,166,229,167, 27,167,
+ 35,167,197,167,208,167,243,168, 87, 97, 11,161,177,161,188,161,
+ 198,161,205,162, 14,162, 30,162, 55,162, 66,162, 91,162,114,162,
+ 151,225,242,237,229,238,233,225,110,128, 5,124,226,229,238,231,
+ 225,236,105,128, 9,176,227,245,244,101,128, 1, 85,100, 4,161,
+ 215,161,221,161,235,162, 5,229,246, 97,128, 9, 48,233,227,225,
+ 108,129, 34, 26,161,230,229,120,128,248,229,239,246,229,242,243,
+ 243,241,245,225,242,101,129, 51,174,161,251,228,243,241,245,225,
+ 242,101,128, 51,175,243,241,245,225,242,101,128, 51,173,230,101,
+ 129, 5,191,162, 21,232,229,226,242,229,119,128, 5,191,231,117,
+ 2,162, 37,162, 46,234,225,242,225,244,105,128, 10,176,242,237,
+ 245,235,232,105,128, 10, 48,232,233,242,225,231,225,238, 97,128,
+ 48,137,235,225,244,225,235,225,238, 97,129, 48,233,162, 79,232,
+ 225,236,230,247,233,228,244,104,128,255,151,236,239,247,229,242,
+ 228,233,225,231,239,238,225,236,226,229,238,231,225,236,105,128,
+ 9,241,109, 2,162,120,162,143,233,228,228,236,229,228,233,225,
+ 231,239,238,225,236,226,229,238,231,225,236,105,128, 9,240,243,
+ 232,239,242,110,128, 2,100,244,233,111,128, 34, 54,226,239,240,
+ 239,237,239,230,111,128, 49, 22, 99, 4,162,178,162,185,162,194,
+ 162,202,225,242,239,110,128, 1, 89,229,228,233,236,236, 97,128,
+ 1, 87,233,242,227,236,101,128, 36,225,239,237,237,225,225,227,
+ 227,229,238,116,128, 1, 87,100, 2,162,221,162,231,226,236,231,
+ 242,225,246,101,128, 2, 17,239,116, 2,162,238,162,247,225,227,
+ 227,229,238,116,128, 30, 89,226,229,236,239,119,129, 30, 91,163,
+ 1,237,225,227,242,239,110,128, 30, 93,101, 6,163, 24,163, 69,
+ 163,104,163,159,163,184,163,217,102, 2,163, 30,163, 43,229,242,
+ 229,238,227,229,237,225,242,107,128, 32, 59,236,229,248,243,117,
+ 2,163, 53,163, 60,226,243,229,116,128, 34,134,240,229,242,243,
+ 229,116,128, 34,135,231,233,243,244,229,114, 2,163, 80,163, 85,
+ 229,100,128, 0,174,115, 2,163, 91,163, 97,225,238,115,128,248,
+ 232,229,242,233,102,128,246,218,104, 3,163,112,163,135,163,149,
+ 225,114, 2,163,119,163,126,225,226,233, 99,128, 6, 49,237,229,
+ 238,233,225,110,128, 5,128,230,233,238,225,236,225,242,225,226,
+ 233, 99,128,254,174,233,242,225,231,225,238, 97,128, 48,140,235,
+ 225,244,225,235,225,238, 97,129, 48,236,163,172,232,225,236,230,
+ 247,233,228,244,104,128,255,154,243,104,130, 5,232,163,193,163,
+ 208,228,225,231,229,243,232,232,229,226,242,229,119,128,251, 72,
+ 232,229,226,242,229,119,128, 5,232,118, 3,163,225,163,238,164,
+ 14,229,242,243,229,228,244,233,236,228,101,128, 34, 61,233, 97,
+ 2,163,245,163,254,232,229,226,242,229,119,128, 5,151,237,245,
+ 231,242,225,243,232,232,229,226,242,229,119,128, 5,151,236,239,
+ 231,233,227,225,236,238,239,116,128, 35, 16,230,233,243,232,232,
+ 239,239,107,129, 2,126,164, 40,242,229,246,229,242,243,229,100,
+ 128, 2,127,104, 2,164, 57,164, 80, 97, 2,164, 63,164, 73,226,
+ 229,238,231,225,236,105,128, 9,221,228,229,246, 97,128, 9, 93,
+ 111,131, 3,193,164, 90,164,119,164,133,239,107,129, 2,125,164,
+ 97,244,245,242,238,229,100,129, 2,123,164,108,243,245,240,229,
+ 242,233,239,114,128, 2,181,243,249,237,226,239,236,231,242,229,
+ 229,107,128, 3,241,244,233,227,232,239,239,235,237,239,100,128,
+ 2,222,105, 6,164,160,165,204,165,250,166, 5,166, 30,166,166,
+ 229,245,108, 9,164,182,164,217,164,232,164,246,165, 36,165, 50,
+ 165,136,165,149,165,184, 97, 2,164,188,164,203,227,233,242,227,
+ 236,229,235,239,242,229,225,110,128, 50,113,240,225,242,229,238,
+ 235,239,242,229,225,110,128, 50, 17,227,233,242,227,236,229,235,
+ 239,242,229,225,110,128, 50, 99,232,233,229,245,232,235,239,242,
+ 229,225,110,128, 49, 64,107, 2,164,252,165, 28,233,249,229,239,
+ 107, 2,165, 6,165, 15,235,239,242,229,225,110,128, 49, 58,243,
+ 233,239,243,235,239,242,229,225,110,128, 49,105,239,242,229,225,
+ 110,128, 49, 57,237,233,229,245,237,235,239,242,229,225,110,128,
+ 49, 59,112, 3,165, 58,165, 90,165,105, 97, 2,165, 64,165, 78,
+ 238,243,233,239,243,235,239,242,229,225,110,128, 49,108,242,229,
+ 238,235,239,242,229,225,110,128, 50, 3,232,233,229,245,240,232,
+ 235,239,242,229,225,110,128, 49, 63,233,229,245,112, 2,165,114,
+ 165,123,235,239,242,229,225,110,128, 49, 60,243,233,239,243,235,
+ 239,242,229,225,110,128, 49,107,243,233,239,243,235,239,242,229,
+ 225,110,128, 49, 61,116, 2,165,155,165,170,232,233,229,245,244,
+ 232,235,239,242,229,225,110,128, 49, 62,233,235,229,245,244,235,
+ 239,242,229,225,110,128, 49,106,249,229,239,242,233,238,232,233,
+ 229,245,232,235,239,242,229,225,110,128, 49,109,231,232,116, 2,
+ 165,212,165,220,225,238,231,236,101,128, 34, 31,116, 2,165,226,
+ 165,240,225,227,235,226,229,236,239,247,227,237, 98,128, 3, 25,
+ 242,233,225,238,231,236,101,128, 34,191,232,233,242,225,231,225,
+ 238, 97,128, 48,138,235,225,244,225,235,225,238, 97,129, 48,234,
+ 166, 18,232,225,236,230,247,233,228,244,104,128,255,152,110, 2,
+ 166, 36,166,152,103,131, 2,218,166, 46,166, 57,166, 63,226,229,
+ 236,239,247,227,237, 98,128, 3, 37,227,237, 98,128, 3, 10,232,
+ 225,236,102, 2,166, 72,166,118,236,229,230,116,131, 2,191,166,
+ 85,166, 96,166,107,225,242,237,229,238,233,225,110,128, 5, 89,
+ 226,229,236,239,247,227,237, 98,128, 3, 28,227,229,238,244,229,
+ 242,229,100,128, 2,211,242,233,231,232,116,130, 2,190,166,130,
+ 166,141,226,229,236,239,247,227,237, 98,128, 3, 57,227,229,238,
+ 244,229,242,229,100,128, 2,210,246,229,242,244,229,228,226,242,
+ 229,246,101,128, 2, 19,244,244,239,242,245,243,241,245,225,242,
+ 101,128, 51, 81,108, 2,166,186,166,197,233,238,229,226,229,236,
+ 239,119,128, 30, 95,239,238,231,236,229,103,129, 2,124,166,208,
+ 244,245,242,238,229,100,128, 2,122,237,239,238,239,243,240,225,
+ 227,101,128,255, 82,111, 3,166,237,166,248,167, 17,232,233,242,
+ 225,231,225,238, 97,128, 48,141,235,225,244,225,235,225,238, 97,
+ 129, 48,237,167, 5,232,225,236,230,247,233,228,244,104,128,255,
+ 155,242,245,225,244,232,225,105,128, 14, 35,240,225,242,229,110,
+ 128, 36,173,114, 3,167, 43,167, 79,167,109, 97, 3,167, 51,167,
+ 61,167, 68,226,229,238,231,225,236,105,128, 9,220,228,229,246,
+ 97,128, 9, 49,231,245,242,237,245,235,232,105,128, 10, 92,229,
+ 104, 2,167, 86,167, 95,225,242,225,226,233, 99,128, 6,145,230,
+ 233,238,225,236,225,242,225,226,233, 99,128,251,141,246,239,227,
+ 225,236,233, 99, 4,167,125,167,135,167,142,167,153,226,229,238,
+ 231,225,236,105,128, 9,224,228,229,246, 97,128, 9, 96,231,245,
+ 234,225,242,225,244,105,128, 10,224,246,239,247,229,236,243,233,
+ 231,110, 3,167,169,167,179,167,186,226,229,238,231,225,236,105,
+ 128, 9,196,228,229,246, 97,128, 9, 68,231,245,234,225,242,225,
+ 244,105,128, 10,196,243,245,240,229,242,233,239,114,128,246,241,
+ 116, 2,167,214,167,222,226,236,239,227,107,128, 37,144,245,242,
+ 238,229,100,129, 2,121,167,232,243,245,240,229,242,233,239,114,
+ 128, 2,180,117, 4,167,253,168, 8,168, 33,168, 80,232,233,242,
+ 225,231,225,238, 97,128, 48,139,235,225,244,225,235,225,238, 97,
+ 129, 48,235,168, 21,232,225,236,230,247,233,228,244,104,128,255,
+ 153,112, 2,168, 39,168, 74,229,101, 2,168, 46,168, 60,237,225,
+ 242,235,226,229,238,231,225,236,105,128, 9,242,243,233,231,238,
+ 226,229,238,231,225,236,105,128, 9,243,233,225,104,128,246,221,
+ 244,232,225,105,128, 14, 36,246,239,227,225,236,233, 99, 4,168,
+ 103,168,113,168,120,168,131,226,229,238,231,225,236,105,128, 9,
+ 139,228,229,246, 97,128, 9, 11,231,245,234,225,242,225,244,105,
+ 128, 10,139,246,239,247,229,236,243,233,231,110, 3,168,147,168,
+ 157,168,164,226,229,238,231,225,236,105,128, 9,195,228,229,246,
+ 97,128, 9, 67,231,245,234,225,242,225,244,105,128, 10,195,115,
+ 147, 0,115,168,217,170,187,170,198,171, 68,171,107,174, 49,174,
+ 60,176,203,179, 85,179,131,179,158,180, 93,180,160,181,193,181,
+ 203,182,133,182,206,183,120,183,130, 97, 9,168,237,168,247,169,
+ 12,169, 84,169,109,169,120,169,145,169,177,169,217,226,229,238,
+ 231,225,236,105,128, 9,184,227,245,244,101,129, 1, 91,169, 0,
+ 228,239,244,225,227,227,229,238,116,128, 30,101,100, 5,169, 24,
+ 169, 33,169, 39,169, 53,169, 69,225,242,225,226,233, 99,128, 6,
+ 53,229,246, 97,128, 9, 56,230,233,238,225,236,225,242,225,226,
+ 233, 99,128,254,186,233,238,233,244,233,225,236,225,242,225,226,
+ 233, 99,128,254,187,237,229,228,233,225,236,225,242,225,226,233,
+ 99,128,254,188,231,117, 2,169, 91,169,100,234,225,242,225,244,
+ 105,128, 10,184,242,237,245,235,232,105,128, 10, 56,232,233,242,
+ 225,231,225,238, 97,128, 48, 85,235,225,244,225,235,225,238, 97,
+ 129, 48,181,169,133,232,225,236,230,247,233,228,244,104,128,255,
+ 123,236,236,225,236,236,225,232,239,245,225,236,225,249,232,229,
+ 247,225,243,225,236,236,225,237,225,242,225,226,233, 99,128,253,
+ 250,237,229,235,104,130, 5,225,169,188,169,208,228,225,231,229,
+ 243,104,129,251, 65,169,199,232,229,226,242,229,119,128,251, 65,
+ 232,229,226,242,229,119,128, 5,225,242, 97, 5,169,230,170, 48,
+ 170, 56,170,106,170,114, 97, 5,169,242,169,250,170, 2,170, 33,
+ 170, 41,225,244,232,225,105,128, 14, 50,229,244,232,225,105,128,
+ 14, 65,233,237,225,233,109, 2,170, 12,170, 23,225,236,225,233,
+ 244,232,225,105,128, 14, 68,245,225,238,244,232,225,105,128, 14,
+ 67,237,244,232,225,105,128, 14, 51,244,232,225,105,128, 14, 48,
+ 229,244,232,225,105,128, 14, 64,105, 3,170, 64,170, 88,170, 99,
+ 105, 2,170, 70,170, 81,236,229,230,244,244,232,225,105,128,248,
+ 134,244,232,225,105,128, 14, 53,236,229,230,244,244,232,225,105,
+ 128,248,133,244,232,225,105,128, 14, 52,239,244,232,225,105,128,
+ 14, 66,117, 3,170,122,170,172,170,179,101, 3,170,130,170,154,
+ 170,165,101, 2,170,136,170,147,236,229,230,244,244,232,225,105,
+ 128,248,136,244,232,225,105,128, 14, 55,236,229,230,244,244,232,
+ 225,105,128,248,135,244,232,225,105,128, 14, 54,244,232,225,105,
+ 128, 14, 56,245,244,232,225,105,128, 14, 57,226,239,240,239,237,
+ 239,230,111,128, 49, 25, 99, 5,170,210,170,231,170,240,171, 33,
+ 171, 55,225,242,239,110,129, 1, 97,170,219,228,239,244,225,227,
+ 227,229,238,116,128, 30,103,229,228,233,236,236, 97,128, 1, 95,
+ 232,247, 97,131, 2, 89,170,252,171, 7,171, 26,227,249,242,233,
+ 236,236,233, 99,128, 4,217,228,233,229,242,229,243,233,243,227,
+ 249,242,233,236,236,233, 99,128, 4,219,232,239,239,107,128, 2,
+ 90,233,242, 99, 2,171, 41,171, 46,236,101,128, 36,226,245,237,
+ 230,236,229,120,128, 1, 93,239,237,237,225,225,227,227,229,238,
+ 116,128, 2, 25,228,239,116, 2,171, 76,171, 85,225,227,227,229,
+ 238,116,128, 30, 97,226,229,236,239,119,129, 30, 99,171, 95,228,
+ 239,244,225,227,227,229,238,116,128, 30,105,101, 9,171,127,171,
+ 143,171,178,171,243,172, 90,172,117,172,142,172,223,172,250,225,
+ 231,245,236,236,226,229,236,239,247,227,237, 98,128, 3, 60, 99,
+ 2,171,149,171,171,239,238,100,129, 32, 51,171,157,244,239,238,
+ 229,227,232,233,238,229,243,101,128, 2,202,244,233,239,110,128,
+ 0,167,229,110, 4,171,189,171,198,171,212,171,228,225,242,225,
+ 226,233, 99,128, 6, 51,230,233,238,225,236,225,242,225,226,233,
+ 99,128,254,178,233,238,233,244,233,225,236,225,242,225,226,233,
+ 99,128,254,179,237,229,228,233,225,236,225,242,225,226,233, 99,
+ 128,254,180,231,239,108,135, 5,182,172, 7,172, 21,172, 26,172,
+ 35,172, 50,172, 66,172, 77, 49, 2,172, 13,172, 17, 51,128, 5,
+ 182,102,128, 5,182,178, 99,128, 5,182,232,229,226,242,229,119,
+ 128, 5,182,238,225,242,242,239,247,232,229,226,242,229,119,128,
+ 5,182,241,245,225,242,244,229,242,232,229,226,242,229,119,128,
+ 5,182,244,225,232,229,226,242,229,119,128, 5,146,247,233,228,
+ 229,232,229,226,242,229,119,128, 5,182,104, 2,172, 96,172,107,
+ 225,242,237,229,238,233,225,110,128, 5,125,233,242,225,231,225,
+ 238, 97,128, 48, 91,235,225,244,225,235,225,238, 97,129, 48,187,
+ 172,130,232,225,236,230,247,233,228,244,104,128,255,126,237,105,
+ 2,172,149,172,192,227,239,236,239,110,131, 0, 59,172,163,172,
+ 172,172,184,225,242,225,226,233, 99,128, 6, 27,237,239,238,239,
+ 243,240,225,227,101,128,255, 27,243,237,225,236,108,128,254, 84,
+ 246,239,233,227,229,228,237,225,242,235,235,225,238, 97,129, 48,
+ 156,172,211,232,225,236,230,247,233,228,244,104,128,255,159,238,
+ 116, 2,172,230,172,240,233,243,241,245,225,242,101,128, 51, 34,
+ 239,243,241,245,225,242,101,128, 51, 35,246,229,110,142, 0, 55,
+ 173, 28,173, 37,173, 47,173, 77,173, 84,173, 94,173,119,173,146,
+ 173,180,173,192,173,203,173,236,173,244,173,255,225,242,225,226,
+ 233, 99,128, 6,103,226,229,238,231,225,236,105,128, 9,237,227,
+ 233,242,227,236,101,129, 36,102,173, 58,233,238,246,229,242,243,
+ 229,243,225,238,243,243,229,242,233,102,128, 39,144,228,229,246,
+ 97,128, 9,109,229,233,231,232,244,232,115,128, 33, 94,231,117,
+ 2,173,101,173,110,234,225,242,225,244,105,128, 10,237,242,237,
+ 245,235,232,105,128, 10,109,232, 97, 2,173,126,173,137,227,235,
+ 225,242,225,226,233, 99,128, 6,103,238,231,250,232,239,117,128,
+ 48, 39,105, 2,173,152,173,170,228,229,239,231,242,225,240,232,
+ 233,227,240,225,242,229,110,128, 50, 38,238,230,229,242,233,239,
+ 114,128, 32,135,237,239,238,239,243,240,225,227,101,128,255, 23,
+ 239,236,228,243,244,249,236,101,128,247, 55,112, 2,173,209,173,
+ 216,225,242,229,110,128, 36,122,229,114, 2,173,223,173,229,233,
+ 239,100,128, 36,142,243,233,225,110,128, 6,247,242,239,237,225,
+ 110,128, 33,118,243,245,240,229,242,233,239,114,128, 32,119,116,
+ 2,174, 5,174, 43,229,229,110, 2,174, 13,174, 22,227,233,242,
+ 227,236,101,128, 36,112,112, 2,174, 28,174, 35,225,242,229,110,
+ 128, 36,132,229,242,233,239,100,128, 36,152,232,225,105,128, 14,
+ 87,230,244,232,249,240,232,229,110,128, 0,173,104, 7,174, 76,
+ 175, 50,175, 61,175, 75,176, 20,176, 33,176,197, 97, 6,174, 90,
+ 174,101,174,111,174,122,175, 9,175, 34,225,242,237,229,238,233,
+ 225,110,128, 5,119,226,229,238,231,225,236,105,128, 9,182,227,
+ 249,242,233,236,236,233, 99,128, 4, 72,100, 2,174,128,174,224,
+ 228, 97, 4,174,139,174,148,174,179,174,193,225,242,225,226,233,
+ 99,128, 6, 81,228,225,237,237, 97, 2,174,158,174,167,225,242,
+ 225,226,233, 99,128,252, 97,244,225,238,225,242,225,226,233, 99,
+ 128,252, 94,230,225,244,232,225,225,242,225,226,233, 99,128,252,
+ 96,235,225,243,242, 97, 2,174,203,174,212,225,242,225,226,233,
+ 99,128,252, 98,244,225,238,225,242,225,226,233, 99,128,252, 95,
+ 101,132, 37,146,174,236,174,243,174,251,175, 4,228,225,242,107,
+ 128, 37,147,236,233,231,232,116,128, 37,145,237,229,228,233,245,
+ 109,128, 37,146,246, 97,128, 9, 54,231,117, 2,175, 16,175, 25,
+ 234,225,242,225,244,105,128, 10,182,242,237,245,235,232,105,128,
+ 10, 54,236,243,232,229,236,229,244,232,229,226,242,229,119,128,
+ 5,147,226,239,240,239,237,239,230,111,128, 49, 21,227,232,225,
+ 227,249,242,233,236,236,233, 99,128, 4, 73,101, 4,175, 85,175,
+ 150,175,160,175,177,229,110, 4,175, 96,175,105,175,119,175,135,
+ 225,242,225,226,233, 99,128, 6, 52,230,233,238,225,236,225,242,
+ 225,226,233, 99,128,254,182,233,238,233,244,233,225,236,225,242,
+ 225,226,233, 99,128,254,183,237,229,228,233,225,236,225,242,225,
+ 226,233, 99,128,254,184,233,227,239,240,244,233, 99,128, 3,227,
+ 241,229,108,129, 32,170,175,168,232,229,226,242,229,119,128, 32,
+ 170,246, 97,134, 5,176,175,194,175,209,175,223,175,232,175,247,
+ 176, 7, 49, 2,175,200,175,205,177, 53,128, 5,176, 53,128, 5,
+ 176, 50, 2,175,215,175,219, 50,128, 5,176,101,128, 5,176,232,
+ 229,226,242,229,119,128, 5,176,238,225,242,242,239,247,232,229,
+ 226,242,229,119,128, 5,176,241,245,225,242,244,229,242,232,229,
+ 226,242,229,119,128, 5,176,247,233,228,229,232,229,226,242,229,
+ 119,128, 5,176,232,225,227,249,242,233,236,236,233, 99,128, 4,
+ 187,105, 2,176, 39,176, 50,237,225,227,239,240,244,233, 99,128,
+ 3,237,110,131, 5,233,176, 60,176,143,176,152,100, 2,176, 66,
+ 176,132,225,231,229,243,104,130,251, 73,176, 78,176, 87,232,229,
+ 226,242,229,119,128,251, 73,115, 2,176, 93,176,113,232,233,238,
+ 228,239,116,129,251, 44,176,104,232,229,226,242,229,119,128,251,
+ 44,233,238,228,239,116,129,251, 45,176,123,232,229,226,242,229,
+ 119,128,251, 45,239,244,232,229,226,242,229,119,128, 5,193,232,
+ 229,226,242,229,119,128, 5,233,115, 2,176,158,176,178,232,233,
+ 238,228,239,116,129,251, 42,176,169,232,229,226,242,229,119,128,
+ 251, 42,233,238,228,239,116,129,251, 43,176,188,232,229,226,242,
+ 229,119,128,251, 43,239,239,107,128, 2,130,105, 8,176,221,177,
+ 9,177, 20,177, 45,177, 75,177, 83,177, 96,178, 11,231,237, 97,
+ 131, 3,195,176,233,176,237,176,245, 49,128, 3,194,230,233,238,
+ 225,108,128, 3,194,236,245,238,225,244,229,243,249,237,226,239,
+ 236,231,242,229,229,107,128, 3,242,232,233,242,225,231,225,238,
+ 97,128, 48, 87,235,225,244,225,235,225,238, 97,129, 48,183,177,
+ 33,232,225,236,230,247,233,228,244,104,128,255,124,236,245,113,
+ 2,177, 53,177, 62,232,229,226,242,229,119,128, 5,189,236,229,
+ 230,244,232,229,226,242,229,119,128, 5,189,237,233,236,225,114,
+ 128, 34, 60,238,228,239,244,232,229,226,242,229,119,128, 5,194,
+ 239,115, 6,177,111,177,146,177,178,177,206,177,220,177,252, 97,
+ 2,177,117,177,132,227,233,242,227,236,229,235,239,242,229,225,
+ 110,128, 50,116,240,225,242,229,238,235,239,242,229,225,110,128,
+ 50, 20,227,105, 2,177,153,177,165,229,245,227,235,239,242,229,
+ 225,110,128, 49,126,242,227,236,229,235,239,242,229,225,110,128,
+ 50,102,107, 2,177,184,177,198,233,249,229,239,235,235,239,242,
+ 229,225,110,128, 49,122,239,242,229,225,110,128, 49, 69,238,233,
+ 229,245,238,235,239,242,229,225,110,128, 49,123,112, 2,177,226,
+ 177,239,225,242,229,238,235,239,242,229,225,110,128, 50, 6,233,
+ 229,245,240,235,239,242,229,225,110,128, 49,125,244,233,235,229,
+ 245,244,235,239,242,229,225,110,128, 49,124,120,141, 0, 54,178,
+ 41,178, 50,178, 60,178, 90,178, 97,178,122,178,149,178,183,178,
+ 195,178,206,178,239,178,247,179, 2,225,242,225,226,233, 99,128,
+ 6,102,226,229,238,231,225,236,105,128, 9,236,227,233,242,227,
+ 236,101,129, 36,101,178, 71,233,238,246,229,242,243,229,243,225,
+ 238,243,243,229,242,233,102,128, 39,143,228,229,246, 97,128, 9,
+ 108,231,117, 2,178,104,178,113,234,225,242,225,244,105,128, 10,
+ 236,242,237,245,235,232,105,128, 10,108,232, 97, 2,178,129,178,
+ 140,227,235,225,242,225,226,233, 99,128, 6,102,238,231,250,232,
+ 239,117,128, 48, 38,105, 2,178,155,178,173,228,229,239,231,242,
+ 225,240,232,233,227,240,225,242,229,110,128, 50, 37,238,230,229,
+ 242,233,239,114,128, 32,134,237,239,238,239,243,240,225,227,101,
+ 128,255, 22,239,236,228,243,244,249,236,101,128,247, 54,112, 2,
+ 178,212,178,219,225,242,229,110,128, 36,121,229,114, 2,178,226,
+ 178,232,233,239,100,128, 36,141,243,233,225,110,128, 6,246,242,
+ 239,237,225,110,128, 33,117,243,245,240,229,242,233,239,114,128,
+ 32,118,116, 2,179, 8,179, 79,229,229,110, 2,179, 16,179, 58,
+ 99, 2,179, 22,179, 30,233,242,227,236,101,128, 36,111,245,242,
+ 242,229,238,227,249,228,229,238,239,237,233,238,225,244,239,242,
+ 226,229,238,231,225,236,105,128, 9,249,112, 2,179, 64,179, 71,
+ 225,242,229,110,128, 36,131,229,242,233,239,100,128, 36,151,232,
+ 225,105,128, 14, 86,108, 2,179, 91,179,111,225,243,104,129, 0,
+ 47,179, 99,237,239,238,239,243,240,225,227,101,128,255, 15,239,
+ 238,103,129, 1,127,179,119,228,239,244,225,227,227,229,238,116,
+ 128, 30,155,109, 2,179,137,179,147,233,236,229,230,225,227,101,
+ 128, 38, 58,239,238,239,243,240,225,227,101,128,255, 83,111, 6,
+ 179,172,179,222,179,233,180, 2,180, 47,180, 58,102, 2,179,178,
+ 179,192,240,225,243,245,241,232,229,226,242,229,119,128, 5,195,
+ 116, 2,179,198,179,207,232,249,240,232,229,110,128, 0,173,243,
+ 233,231,238,227,249,242,233,236,236,233, 99,128, 4, 76,232,233,
+ 242,225,231,225,238, 97,128, 48, 93,235,225,244,225,235,225,238,
+ 97,129, 48,189,179,246,232,225,236,230,247,233,228,244,104,128,
+ 255,127,236,233,228,245,115, 2,180, 12,180, 29,236,239,238,231,
+ 239,246,229,242,236,225,249,227,237, 98,128, 3, 56,243,232,239,
+ 242,244,239,246,229,242,236,225,249,227,237, 98,128, 3, 55,242,
+ 245,243,233,244,232,225,105,128, 14, 41,115, 3,180, 66,180, 76,
+ 180, 84,225,236,225,244,232,225,105,128, 14, 40,239,244,232,225,
+ 105,128, 14, 11,245,225,244,232,225,105,128, 14, 42,240, 97, 3,
+ 180,102,180,122,180,154,227,101,129, 0, 32,180,109,232,225,227,
+ 235,225,242,225,226,233, 99,128, 0, 32,228,101,129, 38, 96,180,
+ 129,243,245,233,116, 2,180,138,180,146,226,236,225,227,107,128,
+ 38, 96,247,232,233,244,101,128, 38,100,242,229,110,128, 36,174,
+ 241,245,225,242,101, 11,180,188,180,199,180,213,180,238,180,255,
+ 181, 25,181, 40,181, 73,181,100,181,156,181,171,226,229,236,239,
+ 247,227,237, 98,128, 3, 59, 99, 2,180,205,180,209, 99,128, 51,
+ 196,109,128, 51,157,228,233,225,231,239,238,225,236,227,242,239,
+ 243,243,232,225,244,227,232,230,233,236,108,128, 37,169,232,239,
+ 242,233,250,239,238,244,225,236,230,233,236,108,128, 37,164,107,
+ 2,181, 5,181, 9,103,128, 51,143,109,129, 51,158,181, 15,227,
+ 225,240,233,244,225,108,128, 51,206,108, 2,181, 31,181, 35,110,
+ 128, 51,209,239,103,128, 51,210,109, 4,181, 50,181, 54,181, 59,
+ 181, 63,103,128, 51,142,233,108,128, 51,213,109,128, 51,156,243,
+ 241,245,225,242,229,100,128, 51,161,239,242,244,232,239,231,239,
+ 238,225,236,227,242,239,243,243,232,225,244,227,232,230,233,236,
+ 108,128, 37,166,245,240,240,229,114, 2,181,110,181,133,236,229,
+ 230,244,244,239,236,239,247,229,242,242,233,231,232,244,230,233,
+ 236,108,128, 37,167,242,233,231,232,244,244,239,236,239,247,229,
+ 242,236,229,230,244,230,233,236,108,128, 37,168,246,229,242,244,
+ 233,227,225,236,230,233,236,108,128, 37,165,247,232,233,244,229,
+ 247,233,244,232,243,237,225,236,236,226,236,225,227,107,128, 37,
+ 163,242,243,241,245,225,242,101,128, 51,219,115, 2,181,209,182,
+ 123, 97, 4,181,219,181,229,181,236,181,247,226,229,238,231,225,
+ 236,105,128, 9,183,228,229,246, 97,128, 9, 55,231,245,234,225,
+ 242,225,244,105,128, 10,183,238,103, 8,182, 10,182, 24,182, 38,
+ 182, 52,182, 67,182, 81,182, 95,182,108,227,233,229,245,227,235,
+ 239,242,229,225,110,128, 49, 73,232,233,229,245,232,235,239,242,
+ 229,225,110,128, 49,133,233,229,245,238,231,235,239,242,229,225,
+ 110,128, 49,128,235,233,249,229,239,235,235,239,242,229,225,110,
+ 128, 49, 50,238,233,229,245,238,235,239,242,229,225,110,128, 49,
+ 101,240,233,229,245,240,235,239,242,229,225,110,128, 49, 67,243,
+ 233,239,243,235,239,242,229,225,110,128, 49, 70,244,233,235,229,
+ 245,244,235,239,242,229,225,110,128, 49, 56,245,240,229,242,233,
+ 239,114,128,246,242,116, 2,182,139,182,162,229,242,236,233,238,
+ 103,129, 0,163,182,150,237,239,238,239,243,240,225,227,101,128,
+ 255,225,242,239,235,101, 2,182,171,182,188,236,239,238,231,239,
+ 246,229,242,236,225,249,227,237, 98,128, 3, 54,243,232,239,242,
+ 244,239,246,229,242,236,225,249,227,237, 98,128, 3, 53,117, 7,
+ 182,222,182,254,183, 20,183, 31,183, 72,183, 82,183, 86,226,243,
+ 229,116,130, 34,130,182,233,182,244,238,239,244,229,241,245,225,
+ 108,128, 34,138,239,242,229,241,245,225,108,128, 34,134, 99, 2,
+ 183, 4,183, 12,227,229,229,228,115,128, 34,123,232,244,232,225,
+ 116,128, 34, 11,232,233,242,225,231,225,238, 97,128, 48, 89,107,
+ 2,183, 37,183, 61,225,244,225,235,225,238, 97,129, 48,185,183,
+ 49,232,225,236,230,247,233,228,244,104,128,255,125,245,238,225,
+ 242,225,226,233, 99,128, 6, 82,237,237,225,244,233,239,110,128,
+ 34, 17,110,128, 38, 60,240,229,242,243,229,116,130, 34,131,183,
+ 99,183,110,238,239,244,229,241,245,225,108,128, 34,139,239,242,
+ 229,241,245,225,108,128, 34,135,246,243,241,245,225,242,101,128,
+ 51,220,249,239,245,247,225,229,242,225,243,241,245,225,242,101,
+ 128, 51,124,116,144, 0,116,183,183,184,192,184,213,185,100,185,
+ 140,187,188,191, 70,192,145,192,157,192,169,193,202,193,227,194,
+ 57,194,237,195,165,195,255, 97, 10,183,205,183,215,183,236,183,
+ 243,184, 12,184, 90,184,107,184,132,184,146,184,150,226,229,238,
+ 231,225,236,105,128, 9,164,227,107, 2,183,222,183,229,228,239,
+ 247,110,128, 34,164,236,229,230,116,128, 34,163,228,229,246, 97,
+ 128, 9, 36,231,117, 2,183,250,184, 3,234,225,242,225,244,105,
+ 128, 10,164,242,237,245,235,232,105,128, 10, 36,104, 4,184, 22,
+ 184, 31,184, 45,184, 75,225,242,225,226,233, 99,128, 6, 55,230,
+ 233,238,225,236,225,242,225,226,233, 99,128,254,194,105, 2,184,
+ 51,184, 66,238,233,244,233,225,236,225,242,225,226,233, 99,128,
+ 254,195,242,225,231,225,238, 97,128, 48, 95,237,229,228,233,225,
+ 236,225,242,225,226,233, 99,128,254,196,233,243,249,239,245,229,
+ 242,225,243,241,245,225,242,101,128, 51,125,235,225,244,225,235,
+ 225,238, 97,129, 48,191,184,120,232,225,236,230,247,233,228,244,
+ 104,128,255,128,244,247,229,229,236,225,242,225,226,233, 99,128,
+ 6, 64,117,128, 3,196,118,130, 5,234,184,158,184,183,228,225,
+ 231,229,115,129,251, 74,184,168,104,129,251, 74,184,174,232,229,
+ 226,242,229,119,128,251, 74,232,229,226,242,229,119,128, 5,234,
+ 98, 2,184,198,184,203,225,114,128, 1,103,239,240,239,237,239,
+ 230,111,128, 49, 10, 99, 6,184,227,184,234,184,241,184,250,185,
+ 60,185, 87,225,242,239,110,128, 1,101,227,245,242,108,128, 2,
+ 168,229,228,233,236,236, 97,128, 1, 99,232,229,104, 4,185, 6,
+ 185, 15,185, 29,185, 45,225,242,225,226,233, 99,128, 6,134,230,
+ 233,238,225,236,225,242,225,226,233, 99,128,251,123,233,238,233,
+ 244,233,225,236,225,242,225,226,233, 99,128,251,124,237,229,228,
+ 233,225,236,225,242,225,226,233, 99,128,251,125,233,242, 99, 2,
+ 185, 68,185, 73,236,101,128, 36,227,245,237,230,236,229,248,226,
+ 229,236,239,119,128, 30,113,239,237,237,225,225,227,227,229,238,
+ 116,128, 1, 99,100, 2,185,106,185,116,233,229,242,229,243,233,
+ 115,128, 30,151,239,116, 2,185,123,185,132,225,227,227,229,238,
+ 116,128, 30,107,226,229,236,239,119,128, 30,109,101, 9,185,160,
+ 185,171,185,191,186,201,186,226,187, 34,187,101,187,106,187,158,
+ 227,249,242,233,236,236,233, 99,128, 4, 66,228,229,243,227,229,
+ 238,228,229,242,227,249,242,233,236,236,233, 99,128, 4,173,104,
+ 7,185,207,185,216,185,230,186, 14,186, 44,186, 85,186,183,225,
+ 242,225,226,233, 99,128, 6, 42,230,233,238,225,236,225,242,225,
+ 226,233, 99,128,254,150,232,225,232,105, 2,185,239,185,254,238,
+ 233,244,233,225,236,225,242,225,226,233, 99,128,252,162,243,239,
+ 236,225,244,229,228,225,242,225,226,233, 99,128,252, 12,105, 2,
+ 186, 20,186, 35,238,233,244,233,225,236,225,242,225,226,233, 99,
+ 128,254,151,242,225,231,225,238, 97,128, 48,102,234,229,229,237,
+ 105, 2,186, 54,186, 69,238,233,244,233,225,236,225,242,225,226,
+ 233, 99,128,252,161,243,239,236,225,244,229,228,225,242,225,226,
+ 233, 99,128,252, 11,109, 2,186, 91,186,125,225,242,226,245,244,
+ 97, 2,186,102,186,111,225,242,225,226,233, 99,128, 6, 41,230,
+ 233,238,225,236,225,242,225,226,233, 99,128,254,148,101, 2,186,
+ 131,186,144,228,233,225,236,225,242,225,226,233, 99,128,254,152,
+ 229,237,105, 2,186,152,186,167,238,233,244,233,225,236,225,242,
+ 225,226,233, 99,128,252,164,243,239,236,225,244,229,228,225,242,
+ 225,226,233, 99,128,252, 14,238,239,239,238,230,233,238,225,236,
+ 225,242,225,226,233, 99,128,252,115,235,225,244,225,235,225,238,
+ 97,129, 48,198,186,214,232,225,236,230,247,233,228,244,104,128,
+ 255,131,108, 2,186,232,186,251,229,240,232,239,238,101,129, 33,
+ 33,186,243,226,236,225,227,107,128, 38, 14,233,243,232, 97, 2,
+ 187, 4,187, 19,231,229,228,239,236,225,232,229,226,242,229,119,
+ 128, 5,160,241,229,244,225,238,225,232,229,226,242,229,119,128,
+ 5,169,110, 4,187, 44,187, 53,187, 72,187, 93,227,233,242,227,
+ 236,101,128, 36,105,233,228,229,239,231,242,225,240,232,233,227,
+ 240,225,242,229,110,128, 50, 41,112, 2,187, 78,187, 85,225,242,
+ 229,110,128, 36,125,229,242,233,239,100,128, 36,145,242,239,237,
+ 225,110,128, 33,121,243,104,128, 2,167,116,131, 5,216,187,116,
+ 187,136,187,145,228,225,231,229,243,104,129,251, 56,187,127,232,
+ 229,226,242,229,119,128,251, 56,232,229,226,242,229,119,128, 5,
+ 216,243,229,227,249,242,233,236,236,233, 99,128, 4,181,246,233,
+ 114, 2,187,166,187,175,232,229,226,242,229,119,128, 5,155,236,
+ 229,230,244,232,229,226,242,229,119,128, 5,155,104, 6,187,202,
+ 188, 98,188,220,189, 96,190, 3,191, 60, 97, 5,187,214,187,224,
+ 187,231,188, 0,188, 29,226,229,238,231,225,236,105,128, 9,165,
+ 228,229,246, 97,128, 9, 37,231,117, 2,187,238,187,247,234,225,
+ 242,225,244,105,128, 10,165,242,237,245,235,232,105,128, 10, 37,
+ 108, 2,188, 6,188, 15,225,242,225,226,233, 99,128, 6, 48,230,
+ 233,238,225,236,225,242,225,226,233, 99,128,254,172,238,244,232,
+ 225,235,232,225,116, 3,188, 44,188, 75,188, 82,236,239,119, 2,
+ 188, 52,188, 63,236,229,230,244,244,232,225,105,128,248,152,242,
+ 233,231,232,244,244,232,225,105,128,248,151,244,232,225,105,128,
+ 14, 76,245,240,240,229,242,236,229,230,244,244,232,225,105,128,
+ 248,150,101, 3,188,106,188,170,188,193,104, 4,188,116,188,125,
+ 188,139,188,155,225,242,225,226,233, 99,128, 6, 43,230,233,238,
+ 225,236,225,242,225,226,233, 99,128,254,154,233,238,233,244,233,
+ 225,236,225,242,225,226,233, 99,128,254,155,237,229,228,233,225,
+ 236,225,242,225,226,233, 99,128,254,156,242,101, 2,188,177,188,
+ 186,229,248,233,243,244,115,128, 34, 3,230,239,242,101,128, 34,
+ 52,244, 97,130, 3,184,188,202,188,206, 49,128, 3,209,243,249,
+ 237,226,239,236,231,242,229,229,107,128, 3,209,105, 2,188,226,
+ 189, 56,229,245,244,104, 4,188,239,189, 18,189, 33,189, 42, 97,
+ 2,188,245,189, 4,227,233,242,227,236,229,235,239,242,229,225,
+ 110,128, 50,121,240,225,242,229,238,235,239,242,229,225,110,128,
+ 50, 25,227,233,242,227,236,229,235,239,242,229,225,110,128, 50,
+ 107,235,239,242,229,225,110,128, 49, 76,240,225,242,229,238,235,
+ 239,242,229,225,110,128, 50, 11,242,244,229,229,110, 2,189, 66,
+ 189, 75,227,233,242,227,236,101,128, 36,108,112, 2,189, 81,189,
+ 88,225,242,229,110,128, 36,128,229,242,233,239,100,128, 36,148,
+ 111, 6,189,110,189,127,189,132,189,146,189,151,189,204,238,225,
+ 238,231,237,239,238,244,232,239,244,232,225,105,128, 14, 17,239,
+ 107,128, 1,173,240,232,245,244,232,225,239,244,232,225,105,128,
+ 14, 18,242,110,128, 0,254,244,104, 3,189,160,189,184,189,194,
+ 97, 2,189,166,189,176,232,225,238,244,232,225,105,128, 14, 23,
+ 238,244,232,225,105,128, 14, 16,239,238,231,244,232,225,105,128,
+ 14, 24,245,238,231,244,232,225,105,128, 14, 22,245,243,225,238,
+ 100, 2,189,214,189,225,227,249,242,233,236,236,233, 99,128, 4,
+ 130,243,243,229,240,225,242,225,244,239,114, 2,189,240,189,249,
+ 225,242,225,226,233, 99,128, 6,108,240,229,242,243,233,225,110,
+ 128, 6,108,242,229,101,144, 0, 51,190, 41,190, 50,190, 60,190,
+ 90,190, 97,190,107,190,132,190,159,190,193,190,205,190,224,190,
+ 235,191, 12,191, 34,191, 42,191, 53,225,242,225,226,233, 99,128,
+ 6, 99,226,229,238,231,225,236,105,128, 9,233,227,233,242,227,
+ 236,101,129, 36, 98,190, 71,233,238,246,229,242,243,229,243,225,
+ 238,243,243,229,242,233,102,128, 39,140,228,229,246, 97,128, 9,
+ 105,229,233,231,232,244,232,115,128, 33, 92,231,117, 2,190,114,
+ 190,123,234,225,242,225,244,105,128, 10,233,242,237,245,235,232,
+ 105,128, 10,105,232, 97, 2,190,139,190,150,227,235,225,242,225,
+ 226,233, 99,128, 6, 99,238,231,250,232,239,117,128, 48, 35,105,
+ 2,190,165,190,183,228,229,239,231,242,225,240,232,233,227,240,
+ 225,242,229,110,128, 50, 34,238,230,229,242,233,239,114,128, 32,
+ 131,237,239,238,239,243,240,225,227,101,128,255, 19,238,245,237,
+ 229,242,225,244,239,242,226,229,238,231,225,236,105,128, 9,246,
+ 239,236,228,243,244,249,236,101,128,247, 51,112, 2,190,241,190,
+ 248,225,242,229,110,128, 36,118,229,114, 2,190,255,191, 5,233,
+ 239,100,128, 36,138,243,233,225,110,128, 6,243,241,245,225,242,
+ 244,229,242,115,129, 0,190,191, 25,229,237,228,225,243,104,128,
+ 246,222,242,239,237,225,110,128, 33,114,243,245,240,229,242,233,
+ 239,114,128, 0,179,244,232,225,105,128, 14, 83,250,243,241,245,
+ 225,242,101,128, 51,148,105, 7,191, 86,191, 97,191,212,192, 54,
+ 192, 66,192,115,192,132,232,233,242,225,231,225,238, 97,128, 48,
+ 97,107, 2,191,103,191,127,225,244,225,235,225,238, 97,129, 48,
+ 193,191,115,232,225,236,230,247,233,228,244,104,128,255,129,229,
+ 245,116, 4,191,139,191,174,191,189,191,198, 97, 2,191,145,191,
+ 160,227,233,242,227,236,229,235,239,242,229,225,110,128, 50,112,
+ 240,225,242,229,238,235,239,242,229,225,110,128, 50, 16,227,233,
+ 242,227,236,229,235,239,242,229,225,110,128, 50, 98,235,239,242,
+ 229,225,110,128, 49, 55,240,225,242,229,238,235,239,242,229,225,
+ 110,128, 50, 2,236,228,101,133, 2,220,191,228,191,239,192, 0,
+ 192, 12,192, 40,226,229,236,239,247,227,237, 98,128, 3, 48, 99,
+ 2,191,245,191,250,237, 98,128, 3, 3,239,237, 98,128, 3, 3,
+ 228,239,245,226,236,229,227,237, 98,128, 3, 96,111, 2,192, 18,
+ 192, 28,240,229,242,225,244,239,114,128, 34, 60,246,229,242,236,
+ 225,249,227,237, 98,128, 3, 52,246,229,242,244,233,227,225,236,
+ 227,237, 98,128, 3, 62,237,229,243,227,233,242,227,236,101,128,
+ 34,151,112, 2,192, 72,192,102,229,232, 97, 2,192, 80,192, 89,
+ 232,229,226,242,229,119,128, 5,150,236,229,230,244,232,229,226,
+ 242,229,119,128, 5,150,240,233,231,245,242,237,245,235,232,105,
+ 128, 10,112,244,236,239,227,249,242,233,236,236,233,227,227,237,
+ 98,128, 4,131,247,238,225,242,237,229,238,233,225,110,128, 5,
+ 127,236,233,238,229,226,229,236,239,119,128, 30,111,237,239,238,
+ 239,243,240,225,227,101,128,255, 84,111, 7,192,185,192,196,192,
+ 207,192,232,193, 96,193,108,193,192,225,242,237,229,238,233,225,
+ 110,128, 5,105,232,233,242,225,231,225,238, 97,128, 48,104,235,
+ 225,244,225,235,225,238, 97,129, 48,200,192,220,232,225,236,230,
+ 247,233,228,244,104,128,255,132,110, 3,192,240,193, 82,193, 87,
+ 101, 4,192,250,193, 63,193, 70,193, 76,226,225,114, 4,193, 6,
+ 193, 35,193, 45,193, 54,229,248,244,242, 97, 2,193, 16,193, 26,
+ 232,233,231,232,237,239,100,128, 2,229,236,239,247,237,239,100,
+ 128, 2,233,232,233,231,232,237,239,100,128, 2,230,236,239,247,
+ 237,239,100,128, 2,232,237,233,228,237,239,100,128, 2,231,230,
+ 233,246,101,128, 1,189,243,233,120,128, 1,133,244,247,111,128,
+ 1,168,239,115,128, 3,132,243,241,245,225,242,101,128, 51, 39,
+ 240,225,244,225,235,244,232,225,105,128, 14, 15,242,244,239,233,
+ 243,229,243,232,229,236,236,226,242,225,227,235,229,116, 2,193,
+ 131,193,161,236,229,230,116,130, 48, 20,193,142,193,150,243,237,
+ 225,236,108,128,254, 93,246,229,242,244,233,227,225,108,128,254,
+ 57,242,233,231,232,116,130, 48, 21,193,173,193,181,243,237,225,
+ 236,108,128,254, 94,246,229,242,244,233,227,225,108,128,254, 58,
+ 244,225,239,244,232,225,105,128, 14, 21,240, 97, 2,193,209,193,
+ 221,236,225,244,225,236,232,239,239,107,128, 1,171,242,229,110,
+ 128, 36,175,114, 3,193,235,194, 10,194, 25,225,228,229,237,225,
+ 242,107,129, 33, 34,193,247,115, 2,193,253,194, 3,225,238,115,
+ 128,248,234,229,242,233,102,128,246,219,229,244,242,239,230,236,
+ 229,248,232,239,239,107,128, 2,136,233,225,103, 4,194, 37,194,
+ 42,194, 47,194, 52,228,110,128, 37,188,236,102,128, 37,196,242,
+ 116,128, 37,186,245,112,128, 37,178,115,132, 2,166,194, 69,194,
+ 108,194,214,194,227,225,228,105,130, 5,230,194, 79,194, 99,228,
+ 225,231,229,243,104,129,251, 70,194, 90,232,229,226,242,229,119,
+ 128,251, 70,232,229,226,242,229,119,128, 5,230,101, 2,194,114,
+ 194,125,227,249,242,233,236,236,233, 99,128, 4, 70,242,101,134,
+ 5,181,194,142,194,156,194,161,194,170,194,185,194,201, 49, 2,
+ 194,148,194,152, 50,128, 5,181,101,128, 5,181,178, 98,128, 5,
+ 181,232,229,226,242,229,119,128, 5,181,238,225,242,242,239,247,
+ 232,229,226,242,229,119,128, 5,181,241,245,225,242,244,229,242,
+ 232,229,226,242,229,119,128, 5,181,247,233,228,229,232,229,226,
+ 242,229,119,128, 5,181,232,229,227,249,242,233,236,236,233, 99,
+ 128, 4, 91,245,240,229,242,233,239,114,128,246,243,116, 4,194,
+ 247,195, 41,195,106,195,157, 97, 3,194,255,195, 9,195, 16,226,
+ 229,238,231,225,236,105,128, 9,159,228,229,246, 97,128, 9, 31,
+ 231,117, 2,195, 23,195, 32,234,225,242,225,244,105,128, 10,159,
+ 242,237,245,235,232,105,128, 10, 31,229,104, 4,195, 52,195, 61,
+ 195, 75,195, 91,225,242,225,226,233, 99,128, 6,121,230,233,238,
+ 225,236,225,242,225,226,233, 99,128,251,103,233,238,233,244,233,
+ 225,236,225,242,225,226,233, 99,128,251,104,237,229,228,233,225,
+ 236,225,242,225,226,233, 99,128,251,105,232, 97, 3,195,115,195,
+ 125,195,132,226,229,238,231,225,236,105,128, 9,160,228,229,246,
+ 97,128, 9, 32,231,117, 2,195,139,195,148,234,225,242,225,244,
+ 105,128, 10,160,242,237,245,235,232,105,128, 10, 32,245,242,238,
+ 229,100,128, 2,135,117, 3,195,173,195,184,195,209,232,233,242,
+ 225,231,225,238, 97,128, 48,100,235,225,244,225,235,225,238, 97,
+ 129, 48,196,195,197,232,225,236,230,247,233,228,244,104,128,255,
+ 130,243,237,225,236,108, 2,195,219,195,230,232,233,242,225,231,
+ 225,238, 97,128, 48, 99,235,225,244,225,235,225,238, 97,129, 48,
+ 195,195,243,232,225,236,230,247,233,228,244,104,128,255,111,119,
+ 2,196, 5,196,110,101, 2,196, 11,196, 59,236,246,101, 3,196,
+ 21,196, 30,196, 51,227,233,242,227,236,101,128, 36,107,112, 2,
+ 196, 36,196, 43,225,242,229,110,128, 36,127,229,242,233,239,100,
+ 128, 36,147,242,239,237,225,110,128, 33,123,238,244,121, 3,196,
+ 69,196, 78,196, 89,227,233,242,227,236,101,128, 36,115,232,225,
+ 238,231,250,232,239,117,128, 83, 68,112, 2,196, 95,196,102,225,
+ 242,229,110,128, 36,135,229,242,233,239,100,128, 36,155,111,142,
+ 0, 50,196,142,196,151,196,161,196,191,196,243,197, 12,197, 39,
+ 197, 73,197, 85,197,104,197,115,197,148,197,156,197,180,225,242,
+ 225,226,233, 99,128, 6, 98,226,229,238,231,225,236,105,128, 9,
+ 232,227,233,242,227,236,101,129, 36, 97,196,172,233,238,246,229,
+ 242,243,229,243,225,238,243,243,229,242,233,102,128, 39,139,100,
+ 2,196,197,196,203,229,246, 97,128, 9,104,239,116, 2,196,210,
+ 196,221,229,238,236,229,225,228,229,114,128, 32, 37,236,229,225,
+ 228,229,114,129, 32, 37,196,232,246,229,242,244,233,227,225,108,
+ 128,254, 48,231,117, 2,196,250,197, 3,234,225,242,225,244,105,
+ 128, 10,232,242,237,245,235,232,105,128, 10,104,232, 97, 2,197,
+ 19,197, 30,227,235,225,242,225,226,233, 99,128, 6, 98,238,231,
+ 250,232,239,117,128, 48, 34,105, 2,197, 45,197, 63,228,229,239,
+ 231,242,225,240,232,233,227,240,225,242,229,110,128, 50, 33,238,
+ 230,229,242,233,239,114,128, 32,130,237,239,238,239,243,240,225,
+ 227,101,128,255, 18,238,245,237,229,242,225,244,239,242,226,229,
+ 238,231,225,236,105,128, 9,245,239,236,228,243,244,249,236,101,
+ 128,247, 50,112, 2,197,121,197,128,225,242,229,110,128, 36,117,
+ 229,114, 2,197,135,197,141,233,239,100,128, 36,137,243,233,225,
+ 110,128, 6,242,242,239,237,225,110,128, 33,113,115, 2,197,162,
+ 197,170,244,242,239,235,101,128, 1,187,245,240,229,242,233,239,
+ 114,128, 0,178,244,104, 2,197,187,197,192,225,105,128, 14, 82,
+ 233,242,228,115,128, 33, 84,117,145, 0,117,197,237,197,245,198,
+ 30,198, 87,198,225,199, 6,199,129,199,145,199,196,200, 10,200,
+ 91,200,100,200,219,200,243,201, 95,201,123,201,237,225,227,245,
+ 244,101,128, 0,250, 98, 4,197,255,198, 4,198, 13,198, 23,225,
+ 114,128, 2,137,229,238,231,225,236,105,128, 9,137,239,240,239,
+ 237,239,230,111,128, 49, 40,242,229,246,101,128, 1,109, 99, 3,
+ 198, 38,198, 45,198, 77,225,242,239,110,128, 1,212,233,242, 99,
+ 2,198, 53,198, 58,236,101,128, 36,228,245,237,230,236,229,120,
+ 129, 0,251,198, 69,226,229,236,239,119,128, 30,119,249,242,233,
+ 236,236,233, 99,128, 4, 67,100, 5,198, 99,198,110,198,133,198,
+ 139,198,215,225,244,244,225,228,229,246, 97,128, 9, 81,226,108,
+ 2,198,117,198,125,225,227,245,244,101,128, 1,113,231,242,225,
+ 246,101,128, 2, 21,229,246, 97,128, 9, 9,233,229,242,229,243,
+ 233,115,133, 0,252,198,159,198,167,198,175,198,198,198,206,225,
+ 227,245,244,101,128, 1,216,226,229,236,239,119,128, 30,115, 99,
+ 2,198,181,198,188,225,242,239,110,128, 1,218,249,242,233,236,
+ 236,233, 99,128, 4,241,231,242,225,246,101,128, 1,220,237,225,
+ 227,242,239,110,128, 1,214,239,244,226,229,236,239,119,128, 30,
+ 229,103, 2,198,231,198,238,242,225,246,101,128, 0,249,117, 2,
+ 198,244,198,253,234,225,242,225,244,105,128, 10,137,242,237,245,
+ 235,232,105,128, 10, 9,104, 3,199, 14,199, 24,199,102,233,242,
+ 225,231,225,238, 97,128, 48, 70,111, 2,199, 30,199, 40,239,235,
+ 225,226,239,246,101,128, 30,231,242,110,133, 1,176,199, 55,199,
+ 63,199, 74,199, 82,199, 94,225,227,245,244,101,128, 30,233,228,
+ 239,244,226,229,236,239,119,128, 30,241,231,242,225,246,101,128,
+ 30,235,232,239,239,235,225,226,239,246,101,128, 30,237,244,233,
+ 236,228,101,128, 30,239,245,238,231,225,242,245,237,236,225,245,
+ 116,129, 1,113,199,118,227,249,242,233,236,236,233, 99,128, 4,
+ 243,233,238,246,229,242,244,229,228,226,242,229,246,101,128, 2,
+ 23,107, 3,199,153,199,177,199,188,225,244,225,235,225,238, 97,
+ 129, 48,166,199,165,232,225,236,230,247,233,228,244,104,128,255,
+ 115,227,249,242,233,236,236,233, 99,128, 4,121,239,242,229,225,
+ 110,128, 49, 92,109, 2,199,202,199,255, 97, 2,199,208,199,241,
+ 227,242,239,110,130, 1,107,199,219,199,230,227,249,242,233,236,
+ 236,233, 99,128, 4,239,228,233,229,242,229,243,233,115,128, 30,
+ 123,244,242,225,231,245,242,237,245,235,232,105,128, 10, 65,239,
+ 238,239,243,240,225,227,101,128,255, 85,110, 2,200, 16,200, 71,
+ 228,229,242,243,227,239,242,101,132, 0, 95,200, 35,200, 41,200,
+ 53,200, 64,228,226,108,128, 32, 23,237,239,238,239,243,240,225,
+ 227,101,128,255, 63,246,229,242,244,233,227,225,108,128,254, 51,
+ 247,225,246,121,128,254, 79,105, 2,200, 77,200, 82,239,110,128,
+ 34, 42,246,229,242,243,225,108,128, 34, 0,239,231,239,238,229,
+ 107,128, 1,115,112, 5,200,112,200,119,200,127,200,142,200,193,
+ 225,242,229,110,128, 36,176,226,236,239,227,107,128, 37,128,240,
+ 229,242,228,239,244,232,229,226,242,229,119,128, 5,196,243,233,
+ 236,239,110,131, 3,197,200,156,200,177,200,185,228,233,229,242,
+ 229,243,233,115,129, 3,203,200,169,244,239,238,239,115,128, 3,
+ 176,236,225,244,233,110,128, 2,138,244,239,238,239,115,128, 3,
+ 205,244,225,227,107, 2,200,202,200,213,226,229,236,239,247,227,
+ 237, 98,128, 3, 29,237,239,100,128, 2,212,114, 2,200,225,200,
+ 237,225,231,245,242,237,245,235,232,105,128, 10,115,233,238,103,
+ 128, 1,111,115, 3,200,251,201, 10,201, 55,232,239,242,244,227,
+ 249,242,233,236,236,233, 99,128, 4, 94,237,225,236,108, 2,201,
+ 19,201, 30,232,233,242,225,231,225,238, 97,128, 48, 69,235,225,
+ 244,225,235,225,238, 97,129, 48,165,201, 43,232,225,236,230,247,
+ 233,228,244,104,128,255,105,244,242,225,233,231,232,116, 2,201,
+ 67,201, 78,227,249,242,233,236,236,233, 99,128, 4,175,243,244,
+ 242,239,235,229,227,249,242,233,236,236,233, 99,128, 4,177,244,
+ 233,236,228,101,130, 1,105,201,107,201,115,225,227,245,244,101,
+ 128, 30,121,226,229,236,239,119,128, 30,117,117, 5,201,135,201,
+ 145,201,152,201,177,201,193,226,229,238,231,225,236,105,128, 9,
+ 138,228,229,246, 97,128, 9, 10,231,117, 2,201,159,201,168,234,
+ 225,242,225,244,105,128, 10,138,242,237,245,235,232,105,128, 10,
+ 10,237,225,244,242,225,231,245,242,237,245,235,232,105,128, 10,
+ 66,246,239,247,229,236,243,233,231,110, 3,201,209,201,219,201,
+ 226,226,229,238,231,225,236,105,128, 9,194,228,229,246, 97,128,
+ 9, 66,231,245,234,225,242,225,244,105,128, 10,194,246,239,247,
+ 229,236,243,233,231,110, 3,201,253,202, 7,202, 14,226,229,238,
+ 231,225,236,105,128, 9,193,228,229,246, 97,128, 9, 65,231,245,
+ 234,225,242,225,244,105,128, 10,193,118,139, 0,118,202, 51,202,
+ 199,202,208,202,219,203,148,203,155,203,253,204, 9,204,109,204,
+ 117,204,138, 97, 4,202, 61,202, 68,202, 93,202,104,228,229,246,
+ 97,128, 9, 53,231,117, 2,202, 75,202, 84,234,225,242,225,244,
+ 105,128, 10,181,242,237,245,235,232,105,128, 10, 53,235,225,244,
+ 225,235,225,238, 97,128, 48,247,118,132, 5,213,202,116,202,143,
+ 202,175,202,187,228,225,231,229,243,104,130,251, 53,202,129,202,
+ 134,182, 53,128,251, 53,232,229,226,242,229,119,128,251, 53,104,
+ 2,202,149,202,157,229,226,242,229,119,128, 5,213,239,236,225,
+ 109,129,251, 75,202,166,232,229,226,242,229,119,128,251, 75,246,
+ 225,246,232,229,226,242,229,119,128, 5,240,249,239,228,232,229,
+ 226,242,229,119,128, 5,241,227,233,242,227,236,101,128, 36,229,
+ 228,239,244,226,229,236,239,119,128, 30,127,101, 6,202,233,202,
+ 244,203, 52,203, 63,203, 69,203,136,227,249,242,233,236,236,233,
+ 99,128, 4, 50,104, 4,202,254,203, 7,203, 21,203, 37,225,242,
+ 225,226,233, 99,128, 6,164,230,233,238,225,236,225,242,225,226,
+ 233, 99,128,251,107,233,238,233,244,233,225,236,225,242,225,226,
+ 233, 99,128,251,108,237,229,228,233,225,236,225,242,225,226,233,
+ 99,128,251,109,235,225,244,225,235,225,238, 97,128, 48,249,238,
+ 245,115,128, 38, 64,242,244,233,227,225,108, 2,203, 80,203, 86,
+ 226,225,114,128, 0,124,236,233,238,101, 4,203, 99,203,110,203,
+ 121,203,130,225,226,239,246,229,227,237, 98,128, 3, 13,226,229,
+ 236,239,247,227,237, 98,128, 3, 41,236,239,247,237,239,100,128,
+ 2,204,237,239,100,128, 2,200,247,225,242,237,229,238,233,225,
+ 110,128, 5,126,232,239,239,107,128, 2,139,105, 3,203,163,203,
+ 174,203,213,235,225,244,225,235,225,238, 97,128, 48,248,242,225,
+ 237, 97, 3,203,185,203,195,203,202,226,229,238,231,225,236,105,
+ 128, 9,205,228,229,246, 97,128, 9, 77,231,245,234,225,242,225,
+ 244,105,128, 10,205,243,225,242,231, 97, 3,203,225,203,235,203,
+ 242,226,229,238,231,225,236,105,128, 9,131,228,229,246, 97,128,
+ 9, 3,231,245,234,225,242,225,244,105,128, 10,131,237,239,238,
+ 239,243,240,225,227,101,128,255, 86,111, 3,204, 17,204, 28,204,
+ 98,225,242,237,229,238,233,225,110,128, 5,120,233,227,229,100,
+ 2,204, 37,204, 73,233,244,229,242,225,244,233,239,110, 2,204,
+ 51,204, 62,232,233,242,225,231,225,238, 97,128, 48,158,235,225,
+ 244,225,235,225,238, 97,128, 48,254,237,225,242,235,235,225,238,
+ 97,129, 48,155,204, 86,232,225,236,230,247,233,228,244,104,128,
+ 255,158,235,225,244,225,235,225,238, 97,128, 48,250,240,225,242,
+ 229,110,128, 36,177,116, 2,204,123,204,130,233,236,228,101,128,
+ 30,125,245,242,238,229,100,128, 2,140,117, 2,204,144,204,155,
+ 232,233,242,225,231,225,238, 97,128, 48,148,235,225,244,225,235,
+ 225,238, 97,128, 48,244,119,143, 0,119,204,200,205,177,205,187,
+ 205,210,205,250,206, 61,206, 69,208, 40,208, 81,208, 93,208,168,
+ 208,176,208,183,208,194,208,203, 97, 8,204,218,204,225,204,235,
+ 204,246,205, 28,205, 60,205, 72,205,108,227,245,244,101,128, 30,
+ 131,229,235,239,242,229,225,110,128, 49, 89,232,233,242,225,231,
+ 225,238, 97,128, 48,143,107, 2,204,252,205, 20,225,244,225,235,
+ 225,238, 97,129, 48,239,205, 8,232,225,236,230,247,233,228,244,
+ 104,128,255,156,239,242,229,225,110,128, 49, 88,243,237,225,236,
+ 108, 2,205, 38,205, 49,232,233,242,225,231,225,238, 97,128, 48,
+ 142,235,225,244,225,235,225,238, 97,128, 48,238,244,244,239,243,
+ 241,245,225,242,101,128, 51, 87,118, 2,205, 78,205, 86,229,228,
+ 225,243,104,128, 48, 28,249,245,238,228,229,242,243,227,239,242,
+ 229,246,229,242,244,233,227,225,108,128,254, 52,119, 3,205,116,
+ 205,125,205,139,225,242,225,226,233, 99,128, 6, 72,230,233,238,
+ 225,236,225,242,225,226,233, 99,128,254,238,232,225,237,250,225,
+ 225,226,239,246,101, 2,205,154,205,163,225,242,225,226,233, 99,
+ 128, 6, 36,230,233,238,225,236,225,242,225,226,233, 99,128,254,
+ 134,226,243,241,245,225,242,101,128, 51,221,227,233,242, 99, 2,
+ 205,196,205,201,236,101,128, 36,230,245,237,230,236,229,120,128,
+ 1,117,100, 2,205,216,205,226,233,229,242,229,243,233,115,128,
+ 30,133,239,116, 2,205,233,205,242,225,227,227,229,238,116,128,
+ 30,135,226,229,236,239,119,128, 30,137,101, 4,206, 4,206, 15,
+ 206, 27,206, 51,232,233,242,225,231,225,238, 97,128, 48,145,233,
+ 229,242,243,244,242,225,243,115,128, 33, 24,107, 2,206, 33,206,
+ 43,225,244,225,235,225,238, 97,128, 48,241,239,242,229,225,110,
+ 128, 49, 94,239,235,239,242,229,225,110,128, 49, 93,231,242,225,
+ 246,101,128, 30,129,232,233,244,101, 8,206, 90,206, 99,206,183,
+ 207, 17,207,101,207,146,207,198,207,254,226,245,236,236,229,116,
+ 128, 37,230, 99, 2,206,105,206,125,233,242,227,236,101,129, 37,
+ 203,206,115,233,238,246,229,242,243,101,128, 37,217,239,242,238,
+ 229,242,226,242,225,227,235,229,116, 2,206,142,206,162,236,229,
+ 230,116,129, 48, 14,206,151,246,229,242,244,233,227,225,108,128,
+ 254, 67,242,233,231,232,116,129, 48, 15,206,172,246,229,242,244,
+ 233,227,225,108,128,254, 68,100, 2,206,189,206,230,233,225,237,
+ 239,238,100,129, 37,199,206,200,227,239,238,244,225,233,238,233,
+ 238,231,226,236,225,227,235,243,237,225,236,236,228,233,225,237,
+ 239,238,100,128, 37,200,239,247,238,240,239,233,238,244,233,238,
+ 103, 2,206,246,207, 6,243,237,225,236,236,244,242,233,225,238,
+ 231,236,101,128, 37,191,244,242,233,225,238,231,236,101,128, 37,
+ 189,236,101, 2,207, 24,207, 66,230,244,240,239,233,238,244,233,
+ 238,103, 2,207, 39,207, 55,243,237,225,236,236,244,242,233,225,
+ 238,231,236,101,128, 37,195,244,242,233,225,238,231,236,101,128,
+ 37,193,238,244,233,227,245,236,225,242,226,242,225,227,235,229,
+ 116, 2,207, 86,207, 93,236,229,230,116,128, 48, 22,242,233,231,
+ 232,116,128, 48, 23,242,233,231,232,244,240,239,233,238,244,233,
+ 238,103, 2,207,119,207,135,243,237,225,236,236,244,242,233,225,
+ 238,231,236,101,128, 37,185,244,242,233,225,238,231,236,101,128,
+ 37,183,115, 3,207,154,207,184,207,192,109, 2,207,160,207,172,
+ 225,236,236,243,241,245,225,242,101,128, 37,171,233,236,233,238,
+ 231,230,225,227,101,128, 38, 58,241,245,225,242,101,128, 37,161,
+ 244,225,114,128, 38, 6,116, 2,207,204,207,215,229,236,229,240,
+ 232,239,238,101,128, 38, 15,239,242,244,239,233,243,229,243,232,
+ 229,236,236,226,242,225,227,235,229,116, 2,207,239,207,246,236,
+ 229,230,116,128, 48, 24,242,233,231,232,116,128, 48, 25,245,240,
+ 240,239,233,238,244,233,238,103, 2,208, 13,208, 29,243,237,225,
+ 236,236,244,242,233,225,238,231,236,101,128, 37,181,244,242,233,
+ 225,238,231,236,101,128, 37,179,105, 2,208, 46,208, 57,232,233,
+ 242,225,231,225,238, 97,128, 48,144,107, 2,208, 63,208, 73,225,
+ 244,225,235,225,238, 97,128, 48,240,239,242,229,225,110,128, 49,
+ 95,237,239,238,239,243,240,225,227,101,128,255, 87,111, 4,208,
+ 103,208,114,208,139,208,157,232,233,242,225,231,225,238, 97,128,
+ 48,146,235,225,244,225,235,225,238, 97,129, 48,242,208,127,232,
+ 225,236,230,247,233,228,244,104,128,255,102,110,129, 32,169,208,
+ 145,237,239,238,239,243,240,225,227,101,128,255,230,247,225,229,
+ 238,244,232,225,105,128, 14, 39,240,225,242,229,110,128, 36,178,
+ 242,233,238,103,128, 30,152,243,245,240,229,242,233,239,114,128,
+ 2,183,244,245,242,238,229,100,128, 2,141,249,238,110,128, 1,
+ 191,120,137, 0,120,208,231,208,242,208,253,209, 6,209, 33,209,
+ 46,209, 50,209, 62,209, 70,225,226,239,246,229,227,237, 98,128,
+ 3, 61,226,239,240,239,237,239,230,111,128, 49, 18,227,233,242,
+ 227,236,101,128, 36,231,100, 2,209, 12,209, 22,233,229,242,229,
+ 243,233,115,128, 30,141,239,244,225,227,227,229,238,116,128, 30,
+ 139,229,232,225,242,237,229,238,233,225,110,128, 5,109,105,128,
+ 3,190,237,239,238,239,243,240,225,227,101,128,255, 88,240,225,
+ 242,229,110,128, 36,179,243,245,240,229,242,233,239,114,128, 2,
+ 227,121,143, 0,121,209,115,210, 74,210, 97,210,137,212,103,212,
+ 111,212,128,212,192,212,204,213,201,213,241,213,253,214, 8,214,
+ 29,215, 2, 97, 11,209,139,209,151,209,161,209,168,209,175,209,
+ 185,209,210,209,221,210, 3,210, 16,210, 62,225,228,239,243,241,
+ 245,225,242,101,128, 51, 78,226,229,238,231,225,236,105,128, 9,
+ 175,227,245,244,101,128, 0,253,228,229,246, 97,128, 9, 47,229,
+ 235,239,242,229,225,110,128, 49, 82,231,117, 2,209,192,209,201,
+ 234,225,242,225,244,105,128, 10,175,242,237,245,235,232,105,128,
+ 10, 47,232,233,242,225,231,225,238, 97,128, 48,132,107, 2,209,
+ 227,209,251,225,244,225,235,225,238, 97,129, 48,228,209,239,232,
+ 225,236,230,247,233,228,244,104,128,255,148,239,242,229,225,110,
+ 128, 49, 81,237,225,235,235,225,238,244,232,225,105,128, 14, 78,
+ 243,237,225,236,108, 2,210, 26,210, 37,232,233,242,225,231,225,
+ 238, 97,128, 48,131,235,225,244,225,235,225,238, 97,129, 48,227,
+ 210, 50,232,225,236,230,247,233,228,244,104,128,255,108,244,227,
+ 249,242,233,236,236,233, 99,128, 4, 99,227,233,242, 99, 2,210,
+ 83,210, 88,236,101,128, 36,232,245,237,230,236,229,120,128, 1,
+ 119,100, 2,210,103,210,113,233,229,242,229,243,233,115,128, 0,
+ 255,239,116, 2,210,120,210,129,225,227,227,229,238,116,128, 30,
+ 143,226,229,236,239,119,128, 30,245,101, 7,210,153,211,161,211,
+ 170,211,188,211,220,212, 40,212, 91,104, 8,210,171,210,180,210,
+ 214,210,228,211, 45,211, 61,211,120,211,138,225,242,225,226,233,
+ 99,128, 6, 74,226,225,242,242,229,101, 2,210,191,210,200,225,
+ 242,225,226,233, 99,128, 6,210,230,233,238,225,236,225,242,225,
+ 226,233, 99,128,251,175,230,233,238,225,236,225,242,225,226,233,
+ 99,128,254,242,232,225,237,250,225,225,226,239,246,101, 4,210,
+ 247,211, 0,211, 14,211, 30,225,242,225,226,233, 99,128, 6, 38,
+ 230,233,238,225,236,225,242,225,226,233, 99,128,254,138,233,238,
+ 233,244,233,225,236,225,242,225,226,233, 99,128,254,139,237,229,
+ 228,233,225,236,225,242,225,226,233, 99,128,254,140,233,238,233,
+ 244,233,225,236,225,242,225,226,233, 99,128,254,243,237,101, 2,
+ 211, 68,211, 81,228,233,225,236,225,242,225,226,233, 99,128,254,
+ 244,229,237,105, 2,211, 89,211,104,238,233,244,233,225,236,225,
+ 242,225,226,233, 99,128,252,221,243,239,236,225,244,229,228,225,
+ 242,225,226,233, 99,128,252, 88,238,239,239,238,230,233,238,225,
+ 236,225,242,225,226,233, 99,128,252,148,244,232,242,229,229,228,
+ 239,244,243,226,229,236,239,247,225,242,225,226,233, 99,128, 6,
+ 209,235,239,242,229,225,110,128, 49, 86,110,129, 0,165,211,176,
+ 237,239,238,239,243,240,225,227,101,128,255,229,111, 2,211,194,
+ 211,203,235,239,242,229,225,110,128, 49, 85,242,233,238,232,233,
+ 229,245,232,235,239,242,229,225,110,128, 49,134,114, 3,211,228,
+ 212, 8,212, 20,225,232,226,229,238,249,239,237,111, 2,211,242,
+ 211,251,232,229,226,242,229,119,128, 5,170,236,229,230,244,232,
+ 229,226,242,229,119,128, 5,170,233,227,249,242,233,236,236,233,
+ 99,128, 4, 75,245,228,233,229,242,229,243,233,243,227,249,242,
+ 233,236,236,233, 99,128, 4,249,243,233,229,245,238,103, 3,212,
+ 53,212, 62,212, 78,235,239,242,229,225,110,128, 49,129,240,225,
+ 238,243,233,239,243,235,239,242,229,225,110,128, 49,131,243,233,
+ 239,243,235,239,242,229,225,110,128, 49,130,244,233,246,232,229,
+ 226,242,229,119,128, 5,154,231,242,225,246,101,128, 30,243,232,
+ 239,239,107,129, 1,180,212,120,225,226,239,246,101,128, 30,247,
+ 105, 5,212,140,212,151,212,162,212,171,212,179,225,242,237,229,
+ 238,233,225,110,128, 5,117,227,249,242,233,236,236,233, 99,128,
+ 4, 87,235,239,242,229,225,110,128, 49, 98,238,249,225,238,103,
+ 128, 38, 47,247,238,225,242,237,229,238,233,225,110,128, 5,130,
+ 237,239,238,239,243,240,225,227,101,128,255, 89,111, 7,212,220,
+ 213, 34,213, 45,213, 55,213, 93,213,139,213,148,100,131, 5,217,
+ 212,230,212,250,213, 3,228,225,231,229,243,104,129,251, 57,212,
+ 241,232,229,226,242,229,119,128,251, 57,232,229,226,242,229,119,
+ 128, 5,217,249,239,100, 2,213, 11,213, 20,232,229,226,242,229,
+ 119,128, 5,242,240,225,244,225,232,232,229,226,242,229,119,128,
+ 251, 31,232,233,242,225,231,225,238, 97,128, 48,136,233,235,239,
+ 242,229,225,110,128, 49,137,107, 2,213, 61,213, 85,225,244,225,
+ 235,225,238, 97,129, 48,232,213, 73,232,225,236,230,247,233,228,
+ 244,104,128,255,150,239,242,229,225,110,128, 49, 91,243,237,225,
+ 236,108, 2,213,103,213,114,232,233,242,225,231,225,238, 97,128,
+ 48,135,235,225,244,225,235,225,238, 97,129, 48,231,213,127,232,
+ 225,236,230,247,233,228,244,104,128,255,110,244,231,242,229,229,
+ 107,128, 3,243,121, 2,213,154,213,191, 97, 2,213,160,213,170,
+ 229,235,239,242,229,225,110,128, 49,136,107, 2,213,176,213,184,
+ 239,242,229,225,110,128, 49,135,244,232,225,105,128, 14, 34,233,
+ 238,231,244,232,225,105,128, 14, 13,112, 2,213,207,213,214,225,
+ 242,229,110,128, 36,180,239,231,229,231,242,225,237,237,229,238,
+ 105,129, 3,122,213,230,231,242,229,229,235,227,237, 98,128, 3,
+ 69,114,129, 1,166,213,247,233,238,103,128, 30,153,243,245,240,
+ 229,242,233,239,114,128, 2,184,116, 2,214, 14,214, 21,233,236,
+ 228,101,128, 30,249,245,242,238,229,100,128, 2,142,117, 5,214,
+ 41,214, 52,214, 62,214,100,214,232,232,233,242,225,231,225,238,
+ 97,128, 48,134,233,235,239,242,229,225,110,128, 49,140,107, 2,
+ 214, 68,214, 92,225,244,225,235,225,238, 97,129, 48,230,214, 80,
+ 232,225,236,230,247,233,228,244,104,128,255,149,239,242,229,225,
+ 110,128, 49, 96,115, 3,214,108,214,146,214,187,226,233,103, 2,
+ 214,116,214,127,227,249,242,233,236,236,233, 99,128, 4,107,233,
+ 239,244,233,230,233,229,228,227,249,242,233,236,236,233, 99,128,
+ 4,109,236,233,244,244,236,101, 2,214,157,214,168,227,249,242,
+ 233,236,236,233, 99,128, 4,103,233,239,244,233,230,233,229,228,
+ 227,249,242,233,236,236,233, 99,128, 4,105,237,225,236,108, 2,
+ 214,196,214,207,232,233,242,225,231,225,238, 97,128, 48,133,235,
+ 225,244,225,235,225,238, 97,129, 48,229,214,220,232,225,236,230,
+ 247,233,228,244,104,128,255,109,249,101, 2,214,239,214,248,235,
+ 239,242,229,225,110,128, 49,139,239,235,239,242,229,225,110,128,
+ 49,138,249, 97, 2,215, 9,215, 19,226,229,238,231,225,236,105,
+ 128, 9,223,228,229,246, 97,128, 9, 95,122,142, 0,122,215, 58,
+ 216, 66,216, 77,216,120,216,147,217,182,218, 34,218, 76,218, 88,
+ 218,100,218,128,218,136,218,152,218,161, 97, 10,215, 80,215, 91,
+ 215, 98,215,105,215,116,215,194,215,224,215,235,216, 15,216, 27,
+ 225,242,237,229,238,233,225,110,128, 5,102,227,245,244,101,128,
+ 1,122,228,229,246, 97,128, 9, 91,231,245,242,237,245,235,232,
+ 105,128, 10, 91,104, 4,215,126,215,135,215,149,215,179,225,242,
+ 225,226,233, 99,128, 6, 56,230,233,238,225,236,225,242,225,226,
+ 233, 99,128,254,198,105, 2,215,155,215,170,238,233,244,233,225,
+ 236,225,242,225,226,233, 99,128,254,199,242,225,231,225,238, 97,
+ 128, 48, 86,237,229,228,233,225,236,225,242,225,226,233, 99,128,
+ 254,200,233,110, 2,215,201,215,210,225,242,225,226,233, 99,128,
+ 6, 50,230,233,238,225,236,225,242,225,226,233, 99,128,254,176,
+ 235,225,244,225,235,225,238, 97,128, 48,182,241,229,102, 2,215,
+ 243,216, 1,231,225,228,239,236,232,229,226,242,229,119,128, 5,
+ 149,241,225,244,225,238,232,229,226,242,229,119,128, 5,148,242,
+ 241,225,232,229,226,242,229,119,128, 5,152,249,233,110,130, 5,
+ 214,216, 37,216, 57,228,225,231,229,243,104,129,251, 54,216, 48,
+ 232,229,226,242,229,119,128,251, 54,232,229,226,242,229,119,128,
+ 5,214,226,239,240,239,237,239,230,111,128, 49, 23, 99, 3,216,
+ 85,216, 92,216,114,225,242,239,110,128, 1,126,233,242, 99, 2,
+ 216,100,216,105,236,101,128, 36,233,245,237,230,236,229,120,128,
+ 30,145,245,242,108,128, 2,145,228,239,116,130, 1,124,216,130,
+ 216,139,225,227,227,229,238,116,128, 1,124,226,229,236,239,119,
+ 128, 30,147,101, 6,216,161,216,172,216,215,216,226,216,237,217,
+ 177,227,249,242,233,236,236,233, 99,128, 4, 55,100, 2,216,178,
+ 216,197,229,243,227,229,238,228,229,242,227,249,242,233,236,236,
+ 233, 99,128, 4,153,233,229,242,229,243,233,243,227,249,242,233,
+ 236,236,233, 99,128, 4,223,232,233,242,225,231,225,238, 97,128,
+ 48, 92,235,225,244,225,235,225,238, 97,128, 48,188,242,111,140,
+ 0, 48,217, 10,217, 19,217, 29,217, 36,217, 61,217, 74,217, 85,
+ 217, 97,217,108,217,118,217,129,217,136,225,242,225,226,233, 99,
+ 128, 6, 96,226,229,238,231,225,236,105,128, 9,230,228,229,246,
+ 97,128, 9,102,231,117, 2,217, 43,217, 52,234,225,242,225,244,
+ 105,128, 10,230,242,237,245,235,232,105,128, 10,102,232,225,227,
+ 235,225,242,225,226,233, 99,128, 6, 96,233,238,230,229,242,233,
+ 239,114,128, 32,128,237,239,238,239,243,240,225,227,101,128,255,
+ 16,239,236,228,243,244,249,236,101,128,247, 48,240,229,242,243,
+ 233,225,110,128, 6,240,243,245,240,229,242,233,239,114,128, 32,
+ 112,244,232,225,105,128, 14, 80,247,233,228,244,104, 3,217,148,
+ 217,157,217,169,234,239,233,238,229,114,128,254,255,238,239,238,
+ 234,239,233,238,229,114,128, 32, 12,243,240,225,227,101,128, 32,
+ 11,244, 97,128, 3,182,104, 2,217,188,217,199,226,239,240,239,
+ 237,239,230,111,128, 49, 19,101, 4,217,209,217,220,217,236,217,
+ 247,225,242,237,229,238,233,225,110,128, 5,106,226,242,229,246,
+ 229,227,249,242,233,236,236,233, 99,128, 4,194,227,249,242,233,
+ 236,236,233, 99,128, 4, 54,100, 2,217,253,218, 16,229,243,227,
+ 229,238,228,229,242,227,249,242,233,236,236,233, 99,128, 4,151,
+ 233,229,242,229,243,233,243,227,249,242,233,236,236,233, 99,128,
+ 4,221,105, 3,218, 42,218, 53,218, 64,232,233,242,225,231,225,
+ 238, 97,128, 48, 88,235,225,244,225,235,225,238, 97,128, 48,184,
+ 238,239,242,232,229,226,242,229,119,128, 5,174,236,233,238,229,
+ 226,229,236,239,119,128, 30,149,237,239,238,239,243,240,225,227,
+ 101,128,255, 90,111, 2,218,106,218,117,232,233,242,225,231,225,
+ 238, 97,128, 48, 94,235,225,244,225,235,225,238, 97,128, 48,190,
+ 240,225,242,229,110,128, 36,181,242,229,244,242,239,230,236,229,
+ 248,232,239,239,107,128, 2,144,243,244,242,239,235,101,128, 1,
+ 182,117, 2,218,167,218,178,232,233,242,225,231,225,238, 97,128,
+ 48, 90,235,225,244,225,235,225,238, 97,128, 48,186
+ };
+
+
+ /*
+ * This function searches the compressed table efficiently.
+ */
+ static unsigned long
+ ft_get_adobe_glyph_index( const char* name,
+ const char* limit )
+ {
+ int c = 0;
+ int count, min, max;
+ const unsigned char* p = ft_adobe_glyph_list;
+
+
+ if ( name == 0 || name >= limit )
+ goto NotFound;
+
+ c = *name++;
+ count = p[1];
+ p += 2;
+
+ min = 0;
+ max = count;
+
+ while ( min < max )
+ {
+ int mid = ( min + max ) >> 1;
+ const unsigned char* q = p + mid * 2;
+ int c2;
+
+
+ q = ft_adobe_glyph_list + ( ( (int)q[0] << 8 ) | q[1] );
+
+ c2 = q[0] & 127;
+ if ( c2 == c )
+ {
+ p = q;
+ goto Found;
+ }
+ if ( c2 < c )
+ min = mid + 1;
+ else
+ max = mid;
+ }
+ goto NotFound;
+
+ Found:
+ for (;;)
+ {
+ /* assert (*p & 127) == c */
+
+ if ( name >= limit )
+ {
+ if ( (p[0] & 128) == 0 &&
+ (p[1] & 128) != 0 )
+ return (unsigned long)( ( (int)p[2] << 8 ) | p[3] );
+
+ goto NotFound;
+ }
+ c = *name++;
+ if ( p[0] & 128 )
+ {
+ p++;
+ if ( c != (p[0] & 127) )
+ goto NotFound;
+
+ continue;
+ }
+
+ p++;
+ count = p[0] & 127;
+ if ( p[0] & 128 )
+ p += 2;
+
+ p++;
+
+ for ( ; count > 0; count--, p += 2 )
+ {
+ int offset = ( (int)p[0] << 8 ) | p[1];
+ const unsigned char* q = ft_adobe_glyph_list + offset;
+
+ if ( c == ( q[0] & 127 ) )
+ {
+ p = q;
+ goto NextIter;
+ }
+ }
+ goto NotFound;
+
+ NextIter:
+ ;
+ }
+
+ NotFound:
+ return 0;
+ }
+
+#endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/rules.mk b/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/rules.mk
new file mode 100644
index 0000000000..4cd39a8ccf
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/psnames/rules.mk
@@ -0,0 +1,71 @@
+#
+# FreeType 2 PSNames driver configuration rules
+#
+
+
+# Copyright 1996-2000, 2001, 2003, 2011 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT. By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+
+# PSNames driver directory
+#
+PSNAMES_DIR := $(SRC_DIR)/psnames
+
+
+# compilation flags for the driver
+#
+PSNAMES_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(PSNAMES_DIR))
+
+
+# PSNames driver sources (i.e., C files)
+#
+PSNAMES_DRV_SRC := $(PSNAMES_DIR)/psmodule.c \
+ $(PSNAMES_DIR)/pspic.c
+
+
+# PSNames driver headers
+#
+PSNAMES_DRV_H := $(PSNAMES_DRV_SRC:%.c=%.h) \
+ $(PSNAMES_DIR)/psnamerr.h \
+ $(PSNAMES_DIR)/pstables.h
+
+
+# PSNames driver object(s)
+#
+# PSNAMES_DRV_OBJ_M is used during `multi' builds
+# PSNAMES_DRV_OBJ_S is used during `single' builds
+#
+PSNAMES_DRV_OBJ_M := $(PSNAMES_DRV_SRC:$(PSNAMES_DIR)/%.c=$(OBJ_DIR)/%.$O)
+PSNAMES_DRV_OBJ_S := $(OBJ_DIR)/psnames.$O
+
+# PSNames driver source file for single build
+#
+PSNAMES_DRV_SRC_S := $(PSNAMES_DIR)/psmodule.c
+
+
+# PSNames driver - single object
+#
+$(PSNAMES_DRV_OBJ_S): $(PSNAMES_DRV_SRC_S) $(PSNAMES_DRV_SRC) \
+ $(FREETYPE_H) $(PSNAMES_DRV_H)
+ $(PSNAMES_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(PSNAMES_DRV_SRC_S))
+
+
+# PSNames driver - multiple objects
+#
+$(OBJ_DIR)/%.$O: $(PSNAMES_DIR)/%.c $(FREETYPE_H) $(PSNAMES_DRV_H)
+ $(PSNAMES_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)
+
+
+# update main driver object lists
+#
+DRV_OBJS_S += $(PSNAMES_DRV_OBJ_S)
+DRV_OBJS_M += $(PSNAMES_DRV_OBJ_M)
+
+
+# EOF
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/Jamfile b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/Jamfile
new file mode 100644
index 0000000000..4f60e87c78
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/Jamfile
@@ -0,0 +1,29 @@
+# FreeType 2 src/raster Jamfile
+#
+# Copyright 2001 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT. By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+SubDir FT2_TOP $(FT2_SRC_DIR) raster ;
+
+{
+ local _sources ;
+
+ if $(FT2_MULTI)
+ {
+ _sources = ftraster ftrend1 rastpic ;
+ }
+ else
+ {
+ _sources = raster ;
+ }
+
+ Library $(FT2_LIB) : $(_sources).c ;
+}
+
+# end of src/raster Jamfile
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/ftmisc.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/ftmisc.h
new file mode 100644
index 0000000000..c551e89c0f
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/ftmisc.h
@@ -0,0 +1,142 @@
+/***************************************************************************/
+/* */
+/* ftmisc.h */
+/* */
+/* Miscellaneous macros for stand-alone rasterizer (specification */
+/* only). */
+/* */
+/* Copyright 2005, 2009, 2010 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used */
+/* modified and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /***************************************************/
+ /* */
+ /* This file is *not* portable! You have to adapt */
+ /* its definitions to your platform. */
+ /* */
+ /***************************************************/
+
+#ifndef __FTMISC_H__
+#define __FTMISC_H__
+
+
+ /* memset */
+#include "../../include/freetype/config/ftstdlib.h"
+
+#define FT_BEGIN_HEADER
+#define FT_END_HEADER
+
+#define FT_LOCAL_DEF( x ) static x
+
+
+ /* from include/freetype2/fttypes.h */
+
+ typedef unsigned char FT_Byte;
+ typedef signed int FT_Int;
+ typedef unsigned int FT_UInt;
+ typedef signed long FT_Long;
+ typedef unsigned long FT_ULong;
+ typedef signed long FT_F26Dot6;
+ typedef int FT_Error;
+
+#define FT_MAKE_TAG( _x1, _x2, _x3, _x4 ) \
+ ( ( (FT_ULong)_x1 << 24 ) | \
+ ( (FT_ULong)_x2 << 16 ) | \
+ ( (FT_ULong)_x3 << 8 ) | \
+ (FT_ULong)_x4 )
+
+
+ /* from include/freetype2/ftsystem.h */
+
+ typedef struct FT_MemoryRec_* FT_Memory;
+
+ typedef void* (*FT_Alloc_Func)( FT_Memory memory,
+ long size );
+
+ typedef void (*FT_Free_Func)( FT_Memory memory,
+ void* block );
+
+ typedef void* (*FT_Realloc_Func)( FT_Memory memory,
+ long cur_size,
+ long new_size,
+ void* block );
+
+ typedef struct FT_MemoryRec_
+ {
+ void* user;
+
+ FT_Alloc_Func alloc;
+ FT_Free_Func free;
+ FT_Realloc_Func realloc;
+
+ } FT_MemoryRec;
+
+
+ /* from src/ftcalc.c */
+
+#if ( defined _WIN32 || defined _WIN64 )
+
+ typedef __int64 FT_Int64;
+
+#else
+
+#include "inttypes.h"
+
+ typedef int64_t FT_Int64;
+
+#endif
+
+
+ static FT_Long
+ FT_MulDiv( FT_Long a,
+ FT_Long b,
+ FT_Long c )
+ {
+ FT_Int s;
+ FT_Long d;
+
+
+ s = 1;
+ if ( a < 0 ) { a = -a; s = -1; }
+ if ( b < 0 ) { b = -b; s = -s; }
+ if ( c < 0 ) { c = -c; s = -s; }
+
+ d = (FT_Long)( c > 0 ? ( (FT_Int64)a * b + ( c >> 1 ) ) / c
+ : 0x7FFFFFFFL );
+
+ return ( s > 0 ) ? d : -d;
+ }
+
+
+ static FT_Long
+ FT_MulDiv_No_Round( FT_Long a,
+ FT_Long b,
+ FT_Long c )
+ {
+ FT_Int s;
+ FT_Long d;
+
+
+ s = 1;
+ if ( a < 0 ) { a = -a; s = -1; }
+ if ( b < 0 ) { b = -b; s = -s; }
+ if ( c < 0 ) { c = -c; s = -s; }
+
+ d = (FT_Long)( c > 0 ? (FT_Int64)a * b / c
+ : 0x7FFFFFFFL );
+
+ return ( s > 0 ) ? d : -d;
+ }
+
+#endif /* __FTMISC_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/ftraster.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/ftraster.c
new file mode 100644
index 0000000000..264f6b0957
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/ftraster.c
@@ -0,0 +1,3640 @@
+/***************************************************************************/
+/* */
+/* ftraster.c */
+/* */
+/* The FreeType glyph rasterizer (body). */
+/* */
+/* Copyright 1996-2003, 2005, 2007-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* This file can be compiled without the rest of the FreeType engine, by */
+ /* defining the _STANDALONE_ macro when compiling it. You also need to */
+ /* put the files `ftimage.h' and `ftmisc.h' into the $(incdir) */
+ /* directory. Typically, you should do something like */
+ /* */
+ /* - copy `src/raster/ftraster.c' (this file) to your current directory */
+ /* */
+ /* - copy `include/freetype/ftimage.h' and `src/raster/ftmisc.h' */
+ /* to your current directory */
+ /* */
+ /* - compile `ftraster' with the _STANDALONE_ macro defined, as in */
+ /* */
+ /* cc -c -D_STANDALONE_ ftraster.c */
+ /* */
+ /* The renderer can be initialized with a call to */
+ /* `ft_standard_raster.raster_new'; a bitmap can be generated */
+ /* with a call to `ft_standard_raster.raster_render'. */
+ /* */
+ /* See the comments and documentation in the file `ftimage.h' for more */
+ /* details on how the raster works. */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* This is a rewrite of the FreeType 1.x scan-line converter */
+ /* */
+ /*************************************************************************/
+
+#ifdef _STANDALONE_
+
+#define FT_CONFIG_STANDARD_LIBRARY_H <stdlib.h>
+
+#include <string.h> /* for memset */
+
+#include "ftmisc.h"
+#include "ftimage.h"
+
+#else /* !_STANDALONE_ */
+
+#include "../../include/ft2build.h"
+#include "ftraster.h"
+#include "../../include/freetype/internal/ftcalc.h" /* for FT_MulDiv and FT_MulDiv_No_Round */
+
+#include "rastpic.h"
+
+#endif /* !_STANDALONE_ */
+
+
+ /*************************************************************************/
+ /* */
+ /* A simple technical note on how the raster works */
+ /* ----------------------------------------------- */
+ /* */
+ /* Converting an outline into a bitmap is achieved in several steps: */
+ /* */
+ /* 1 - Decomposing the outline into successive `profiles'. Each */
+ /* profile is simply an array of scanline intersections on a given */
+ /* dimension. A profile's main attributes are */
+ /* */
+ /* o its scanline position boundaries, i.e. `Ymin' and `Ymax' */
+ /* */
+ /* o an array of intersection coordinates for each scanline */
+ /* between `Ymin' and `Ymax' */
+ /* */
+ /* o a direction, indicating whether it was built going `up' or */
+ /* `down', as this is very important for filling rules */
+ /* */
+ /* o its drop-out mode */
+ /* */
+ /* 2 - Sweeping the target map's scanlines in order to compute segment */
+ /* `spans' which are then filled. Additionally, this pass */
+ /* performs drop-out control. */
+ /* */
+ /* The outline data is parsed during step 1 only. The profiles are */
+ /* built from the bottom of the render pool, used as a stack. The */
+ /* following graphics shows the profile list under construction: */
+ /* */
+ /* __________________________________________________________ _ _ */
+ /* | | | | | */
+ /* | profile | coordinates for | profile | coordinates for |--> */
+ /* | 1 | profile 1 | 2 | profile 2 |--> */
+ /* |_________|_________________|_________|_________________|__ _ _ */
+ /* */
+ /* ^ ^ */
+ /* | | */
+ /* start of render pool top */
+ /* */
+ /* The top of the profile stack is kept in the `top' variable. */
+ /* */
+ /* As you can see, a profile record is pushed on top of the render */
+ /* pool, which is then followed by its coordinates/intersections. If */
+ /* a change of direction is detected in the outline, a new profile is */
+ /* generated until the end of the outline. */
+ /* */
+ /* Note that when all profiles have been generated, the function */
+ /* Finalize_Profile_Table() is used to record, for each profile, its */
+ /* bottom-most scanline as well as the scanline above its upmost */
+ /* boundary. These positions are called `y-turns' because they (sort */
+ /* of) correspond to local extrema. They are stored in a sorted list */
+ /* built from the top of the render pool as a downwards stack: */
+ /* */
+ /* _ _ _______________________________________ */
+ /* | | */
+ /* <--| sorted list of | */
+ /* <--| extrema scanlines | */
+ /* _ _ __________________|____________________| */
+ /* */
+ /* ^ ^ */
+ /* | | */
+ /* maxBuff sizeBuff = end of pool */
+ /* */
+ /* This list is later used during the sweep phase in order to */
+ /* optimize performance (see technical note on the sweep below). */
+ /* */
+ /* Of course, the raster detects whether the two stacks collide and */
+ /* handles the situation properly. */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /** **/
+ /** CONFIGURATION MACROS **/
+ /** **/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /* define DEBUG_RASTER if you want to compile a debugging version */
+/* #define DEBUG_RASTER */
+
+ /* define FT_RASTER_OPTION_ANTI_ALIASING if you want to support */
+ /* 5-levels anti-aliasing */
+/* #define FT_RASTER_OPTION_ANTI_ALIASING */
+
+ /* The size of the two-lines intermediate bitmap used */
+ /* for anti-aliasing, in bytes. */
+#define RASTER_GRAY_LINES 2048
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /** **/
+ /** OTHER MACROS (do not change) **/
+ /** **/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_raster
+
+
+#ifdef _STANDALONE_
+
+ /* Auxiliary macros for token concatenation. */
+#define FT_ERR_XCAT( x, y ) x ## y
+#define FT_ERR_CAT( x, y ) FT_ERR_XCAT( x, y )
+
+ /* This macro is used to indicate that a function parameter is unused. */
+ /* Its purpose is simply to reduce compiler warnings. Note also that */
+ /* simply defining it as `(void)x' doesn't avoid warnings with certain */
+ /* ANSI compilers (e.g. LCC). */
+#define FT_UNUSED( x ) (x) = (x)
+
+ /* Disable the tracing mechanism for simplicity -- developers can */
+ /* activate it easily by redefining these macros. */
+#ifndef FT_ERROR
+#define FT_ERROR( x ) do { } while ( 0 ) /* nothing */
+#endif
+
+#ifndef FT_TRACE
+#define FT_TRACE( x ) do { } while ( 0 ) /* nothing */
+#define FT_TRACE1( x ) do { } while ( 0 ) /* nothing */
+#define FT_TRACE6( x ) do { } while ( 0 ) /* nothing */
+#endif
+
+#ifndef FT_THROW
+#define FT_THROW( e ) FT_ERR_CAT( Raster_Err_, e )
+#endif
+
+#define Raster_Err_None 0
+#define Raster_Err_Not_Ini -1
+#define Raster_Err_Overflow -2
+#define Raster_Err_Neg_Height -3
+#define Raster_Err_Invalid -4
+#define Raster_Err_Unsupported -5
+
+#define ft_memset memset
+
+#define FT_DEFINE_RASTER_FUNCS( class_, glyph_format_, raster_new_, \
+ raster_reset_, raster_set_mode_, \
+ raster_render_, raster_done_ ) \
+ const FT_Raster_Funcs class_ = \
+ { \
+ glyph_format_, \
+ raster_new_, \
+ raster_reset_, \
+ raster_set_mode_, \
+ raster_render_, \
+ raster_done_ \
+ };
+
+#else /* !_STANDALONE_ */
+
+
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/ftdebug.h" /* for FT_TRACE, FT_ERROR, and FT_THROW */
+
+#include "rasterrs.h"
+
+#define Raster_Err_None FT_Err_Ok
+#define Raster_Err_Not_Ini Raster_Err_Raster_Uninitialized
+#define Raster_Err_Overflow Raster_Err_Raster_Overflow
+#define Raster_Err_Neg_Height Raster_Err_Raster_Negative_Height
+#define Raster_Err_Invalid Raster_Err_Invalid_Outline
+#define Raster_Err_Unsupported Raster_Err_Cannot_Render_Glyph
+
+
+#endif /* !_STANDALONE_ */
+
+
+#ifndef FT_MEM_SET
+#define FT_MEM_SET( d, s, c ) ft_memset( d, s, c )
+#endif
+
+#ifndef FT_MEM_ZERO
+#define FT_MEM_ZERO( dest, count ) FT_MEM_SET( dest, 0, count )
+#endif
+
+ /* FMulDiv means `Fast MulDiv'; it is used in case where `b' is */
+ /* typically a small value and the result of a*b is known to fit into */
+ /* 32 bits. */
+#define FMulDiv( a, b, c ) ( (a) * (b) / (c) )
+
+ /* On the other hand, SMulDiv means `Slow MulDiv', and is used typically */
+ /* for clipping computations. It simply uses the FT_MulDiv() function */
+ /* defined in `ftcalc.h'. */
+#define SMulDiv FT_MulDiv
+#define SMulDiv_No_Round FT_MulDiv_No_Round
+
+ /* The rasterizer is a very general purpose component; please leave */
+ /* the following redefinitions there (you never know your target */
+ /* environment). */
+
+#ifndef TRUE
+#define TRUE 1
+#endif
+
+#ifndef FALSE
+#define FALSE 0
+#endif
+
+#ifndef NULL
+#define NULL (void*)0
+#endif
+
+#ifndef SUCCESS
+#define SUCCESS 0
+#endif
+
+#ifndef FAILURE
+#define FAILURE 1
+#endif
+
+
+#define MaxBezier 32 /* The maximum number of stacked Bezier curves. */
+ /* Setting this constant to more than 32 is a */
+ /* pure waste of space. */
+
+#define Pixel_Bits 6 /* fractional bits of *input* coordinates */
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /** **/
+ /** SIMPLE TYPE DECLARATIONS **/
+ /** **/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ typedef int Int;
+ typedef unsigned int UInt;
+ typedef short Short;
+ typedef unsigned short UShort, *PUShort;
+ typedef long Long, *PLong;
+ typedef unsigned long ULong;
+
+ typedef unsigned char Byte, *PByte;
+ typedef char Bool;
+
+
+ typedef union Alignment_
+ {
+ long l;
+ void* p;
+ void (*f)(void);
+
+ } Alignment, *PAlignment;
+
+
+ typedef struct TPoint_
+ {
+ Long x;
+ Long y;
+
+ } TPoint;
+
+
+ /* values for the `flags' bit field */
+#define Flow_Up 0x8
+#define Overshoot_Top 0x10
+#define Overshoot_Bottom 0x20
+
+
+ /* States of each line, arc, and profile */
+ typedef enum TStates_
+ {
+ Unknown_State,
+ Ascending_State,
+ Descending_State,
+ Flat_State
+
+ } TStates;
+
+
+ typedef struct TProfile_ TProfile;
+ typedef TProfile* PProfile;
+
+ struct TProfile_
+ {
+ FT_F26Dot6 X; /* current coordinate during sweep */
+ PProfile link; /* link to next profile (various purposes) */
+ PLong offset; /* start of profile's data in render pool */
+ unsigned flags; /* Bit 0-2: drop-out mode */
+ /* Bit 3: profile orientation (up/down) */
+ /* Bit 4: is top profile? */
+ /* Bit 5: is bottom profile? */
+ long height; /* profile's height in scanlines */
+ long start; /* profile's starting scanline */
+
+ unsigned countL; /* number of lines to step before this */
+ /* profile becomes drawable */
+
+ PProfile next; /* next profile in same contour, used */
+ /* during drop-out control */
+ };
+
+ typedef PProfile TProfileList;
+ typedef PProfile* PProfileList;
+
+
+ /* Simple record used to implement a stack of bands, required */
+ /* by the sub-banding mechanism */
+ typedef struct black_TBand_
+ {
+ Short y_min; /* band's minimum */
+ Short y_max; /* band's maximum */
+
+ } black_TBand;
+
+
+#define AlignProfileSize \
+ ( ( sizeof ( TProfile ) + sizeof ( Alignment ) - 1 ) / sizeof ( long ) )
+
+
+#undef RAS_ARG
+#undef RAS_ARGS
+#undef RAS_VAR
+#undef RAS_VARS
+
+#ifdef FT_STATIC_RASTER
+
+
+#define RAS_ARGS /* void */
+#define RAS_ARG /* void */
+
+#define RAS_VARS /* void */
+#define RAS_VAR /* void */
+
+#define FT_UNUSED_RASTER do { } while ( 0 )
+
+
+#else /* !FT_STATIC_RASTER */
+
+
+#define RAS_ARGS black_PWorker worker,
+#define RAS_ARG black_PWorker worker
+
+#define RAS_VARS worker,
+#define RAS_VAR worker
+
+#define FT_UNUSED_RASTER FT_UNUSED( worker )
+
+
+#endif /* !FT_STATIC_RASTER */
+
+
+ typedef struct black_TWorker_ black_TWorker, *black_PWorker;
+
+
+ /* prototypes used for sweep function dispatch */
+ typedef void
+ Function_Sweep_Init( RAS_ARGS Short* min,
+ Short* max );
+
+ typedef void
+ Function_Sweep_Span( RAS_ARGS Short y,
+ FT_F26Dot6 x1,
+ FT_F26Dot6 x2,
+ PProfile left,
+ PProfile right );
+
+ typedef void
+ Function_Sweep_Step( RAS_ARG );
+
+
+ /* NOTE: These operations are only valid on 2's complement processors */
+#undef FLOOR
+#undef CEILING
+#undef TRUNC
+#undef SCALED
+
+#define FLOOR( x ) ( (x) & -ras.precision )
+#define CEILING( x ) ( ( (x) + ras.precision - 1 ) & -ras.precision )
+#define TRUNC( x ) ( (Long)(x) >> ras.precision_bits )
+#define FRAC( x ) ( (x) & ( ras.precision - 1 ) )
+#define SCALED( x ) ( ( (ULong)(x) << ras.scale_shift ) - ras.precision_half )
+
+#define IS_BOTTOM_OVERSHOOT( x ) \
+ (Bool)( CEILING( x ) - x >= ras.precision_half )
+#define IS_TOP_OVERSHOOT( x ) \
+ (Bool)( x - FLOOR( x ) >= ras.precision_half )
+
+ /* The most used variables are positioned at the top of the structure. */
+ /* Thus, their offset can be coded with less opcodes, resulting in a */
+ /* smaller executable. */
+
+ struct black_TWorker_
+ {
+ Int precision_bits; /* precision related variables */
+ Int precision;
+ Int precision_half;
+ Int precision_shift;
+ Int precision_step;
+ Int precision_jitter;
+
+ Int scale_shift; /* == precision_shift for bitmaps */
+ /* == precision_shift+1 for pixmaps */
+
+ PLong buff; /* The profiles buffer */
+ PLong sizeBuff; /* Render pool size */
+ PLong maxBuff; /* Profiles buffer size */
+ PLong top; /* Current cursor in buffer */
+
+ FT_Error error;
+
+ Int numTurns; /* number of Y-turns in outline */
+
+ TPoint* arc; /* current Bezier arc pointer */
+
+ UShort bWidth; /* target bitmap width */
+ PByte bTarget; /* target bitmap buffer */
+ PByte gTarget; /* target pixmap buffer */
+
+ Long lastX, lastY;
+ Long minY, maxY;
+
+ UShort num_Profs; /* current number of profiles */
+
+ Bool fresh; /* signals a fresh new profile which */
+ /* `start' field must be completed */
+ Bool joint; /* signals that the last arc ended */
+ /* exactly on a scanline. Allows */
+ /* removal of doublets */
+ PProfile cProfile; /* current profile */
+ PProfile fProfile; /* head of linked list of profiles */
+ PProfile gProfile; /* contour's first profile in case */
+ /* of impact */
+
+ TStates state; /* rendering state */
+
+ FT_Bitmap target; /* description of target bit/pixmap */
+ FT_Outline outline;
+
+ Long traceOfs; /* current offset in target bitmap */
+ Long traceG; /* current offset in target pixmap */
+
+ Short traceIncr; /* sweep's increment in target bitmap */
+
+ Short gray_min_x; /* current min x during gray rendering */
+ Short gray_max_x; /* current max x during gray rendering */
+
+ /* dispatch variables */
+
+ Function_Sweep_Init* Proc_Sweep_Init;
+ Function_Sweep_Span* Proc_Sweep_Span;
+ Function_Sweep_Span* Proc_Sweep_Drop;
+ Function_Sweep_Step* Proc_Sweep_Step;
+
+ Byte dropOutControl; /* current drop_out control method */
+
+ Bool second_pass; /* indicates whether a horizontal pass */
+ /* should be performed to control */
+ /* drop-out accurately when calling */
+ /* Render_Glyph. Note that there is */
+ /* no horizontal pass during gray */
+ /* rendering. */
+
+ TPoint arcs[3 * MaxBezier + 1]; /* The Bezier stack */
+
+ black_TBand band_stack[16]; /* band stack used for sub-banding */
+ Int band_top; /* band stack top */
+
+#ifdef FT_RASTER_OPTION_ANTI_ALIASING
+
+ Byte* grays;
+
+ Byte gray_lines[RASTER_GRAY_LINES];
+ /* Intermediate table used to render the */
+ /* graylevels pixmaps. */
+ /* gray_lines is a buffer holding two */
+ /* monochrome scanlines */
+
+ Short gray_width; /* width in bytes of one monochrome */
+ /* intermediate scanline of gray_lines. */
+ /* Each gray pixel takes 2 bits long there */
+
+ /* The gray_lines must hold 2 lines, thus with size */
+ /* in bytes of at least `gray_width*2'. */
+
+#endif /* FT_RASTER_ANTI_ALIASING */
+
+ };
+
+
+ typedef struct black_TRaster_
+ {
+ char* buffer;
+ long buffer_size;
+ void* memory;
+ black_PWorker worker;
+ Byte grays[5];
+ Short gray_width;
+
+ } black_TRaster, *black_PRaster;
+
+#ifdef FT_STATIC_RASTER
+
+ static black_TWorker cur_ras;
+#define ras cur_ras
+
+#else /* !FT_STATIC_RASTER */
+
+#define ras (*worker)
+
+#endif /* !FT_STATIC_RASTER */
+
+
+#ifdef FT_RASTER_OPTION_ANTI_ALIASING
+
+ /* A lookup table used to quickly count set bits in four gray 2x2 */
+ /* cells. The values of the table have been produced with the */
+ /* following code: */
+ /* */
+ /* for ( i = 0; i < 256; i++ ) */
+ /* { */
+ /* l = 0; */
+ /* j = i; */
+ /* */
+ /* for ( c = 0; c < 4; c++ ) */
+ /* { */
+ /* l <<= 4; */
+ /* */
+ /* if ( j & 0x80 ) l++; */
+ /* if ( j & 0x40 ) l++; */
+ /* */
+ /* j = ( j << 2 ) & 0xFF; */
+ /* } */
+ /* printf( "0x%04X", l ); */
+ /* } */
+ /* */
+
+ static const short count_table[256] =
+ {
+ 0x0000, 0x0001, 0x0001, 0x0002, 0x0010, 0x0011, 0x0011, 0x0012,
+ 0x0010, 0x0011, 0x0011, 0x0012, 0x0020, 0x0021, 0x0021, 0x0022,
+ 0x0100, 0x0101, 0x0101, 0x0102, 0x0110, 0x0111, 0x0111, 0x0112,
+ 0x0110, 0x0111, 0x0111, 0x0112, 0x0120, 0x0121, 0x0121, 0x0122,
+ 0x0100, 0x0101, 0x0101, 0x0102, 0x0110, 0x0111, 0x0111, 0x0112,
+ 0x0110, 0x0111, 0x0111, 0x0112, 0x0120, 0x0121, 0x0121, 0x0122,
+ 0x0200, 0x0201, 0x0201, 0x0202, 0x0210, 0x0211, 0x0211, 0x0212,
+ 0x0210, 0x0211, 0x0211, 0x0212, 0x0220, 0x0221, 0x0221, 0x0222,
+ 0x1000, 0x1001, 0x1001, 0x1002, 0x1010, 0x1011, 0x1011, 0x1012,
+ 0x1010, 0x1011, 0x1011, 0x1012, 0x1020, 0x1021, 0x1021, 0x1022,
+ 0x1100, 0x1101, 0x1101, 0x1102, 0x1110, 0x1111, 0x1111, 0x1112,
+ 0x1110, 0x1111, 0x1111, 0x1112, 0x1120, 0x1121, 0x1121, 0x1122,
+ 0x1100, 0x1101, 0x1101, 0x1102, 0x1110, 0x1111, 0x1111, 0x1112,
+ 0x1110, 0x1111, 0x1111, 0x1112, 0x1120, 0x1121, 0x1121, 0x1122,
+ 0x1200, 0x1201, 0x1201, 0x1202, 0x1210, 0x1211, 0x1211, 0x1212,
+ 0x1210, 0x1211, 0x1211, 0x1212, 0x1220, 0x1221, 0x1221, 0x1222,
+ 0x1000, 0x1001, 0x1001, 0x1002, 0x1010, 0x1011, 0x1011, 0x1012,
+ 0x1010, 0x1011, 0x1011, 0x1012, 0x1020, 0x1021, 0x1021, 0x1022,
+ 0x1100, 0x1101, 0x1101, 0x1102, 0x1110, 0x1111, 0x1111, 0x1112,
+ 0x1110, 0x1111, 0x1111, 0x1112, 0x1120, 0x1121, 0x1121, 0x1122,
+ 0x1100, 0x1101, 0x1101, 0x1102, 0x1110, 0x1111, 0x1111, 0x1112,
+ 0x1110, 0x1111, 0x1111, 0x1112, 0x1120, 0x1121, 0x1121, 0x1122,
+ 0x1200, 0x1201, 0x1201, 0x1202, 0x1210, 0x1211, 0x1211, 0x1212,
+ 0x1210, 0x1211, 0x1211, 0x1212, 0x1220, 0x1221, 0x1221, 0x1222,
+ 0x2000, 0x2001, 0x2001, 0x2002, 0x2010, 0x2011, 0x2011, 0x2012,
+ 0x2010, 0x2011, 0x2011, 0x2012, 0x2020, 0x2021, 0x2021, 0x2022,
+ 0x2100, 0x2101, 0x2101, 0x2102, 0x2110, 0x2111, 0x2111, 0x2112,
+ 0x2110, 0x2111, 0x2111, 0x2112, 0x2120, 0x2121, 0x2121, 0x2122,
+ 0x2100, 0x2101, 0x2101, 0x2102, 0x2110, 0x2111, 0x2111, 0x2112,
+ 0x2110, 0x2111, 0x2111, 0x2112, 0x2120, 0x2121, 0x2121, 0x2122,
+ 0x2200, 0x2201, 0x2201, 0x2202, 0x2210, 0x2211, 0x2211, 0x2212,
+ 0x2210, 0x2211, 0x2211, 0x2212, 0x2220, 0x2221, 0x2221, 0x2222
+ };
+
+#endif /* FT_RASTER_OPTION_ANTI_ALIASING */
+
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /** **/
+ /** PROFILES COMPUTATION **/
+ /** **/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Set_High_Precision */
+ /* */
+ /* <Description> */
+ /* Set precision variables according to param flag. */
+ /* */
+ /* <Input> */
+ /* High :: Set to True for high precision (typically for ppem < 24), */
+ /* false otherwise. */
+ /* */
+ static void
+ Set_High_Precision( RAS_ARGS Int High )
+ {
+ /*
+ * `precision_step' is used in `Bezier_Up' to decide when to split a
+ * given y-monotonous Bezier arc that crosses a scanline before
+ * approximating it as a straight segment. The default value of 32 (for
+ * low accuracy) corresponds to
+ *
+ * 32 / 64 == 0.5 pixels ,
+ *
+ * while for the high accuracy case we have
+ *
+ * 256/ (1 << 12) = 0.0625 pixels .
+ *
+ * `precision_jitter' is an epsilon threshold used in
+ * `Vertical_Sweep_Span' to deal with small imperfections in the Bezier
+ * decomposition (after all, we are working with approximations only);
+ * it avoids switching on additional pixels which would cause artifacts
+ * otherwise.
+ *
+ * The value of `precision_jitter' has been determined heuristically.
+ *
+ */
+
+ if ( High )
+ {
+ ras.precision_bits = 12;
+ ras.precision_step = 256;
+ ras.precision_jitter = 30;
+ }
+ else
+ {
+ ras.precision_bits = 6;
+ ras.precision_step = 32;
+ ras.precision_jitter = 2;
+ }
+
+ FT_TRACE6(( "Set_High_Precision(%s)\n", High ? "true" : "false" ));
+
+ ras.precision = 1 << ras.precision_bits;
+ ras.precision_half = ras.precision / 2;
+ ras.precision_shift = ras.precision_bits - Pixel_Bits;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* New_Profile */
+ /* */
+ /* <Description> */
+ /* Create a new profile in the render pool. */
+ /* */
+ /* <Input> */
+ /* aState :: The state/orientation of the new profile. */
+ /* */
+ /* overshoot :: Whether the profile's unrounded start position */
+ /* differs by at least a half pixel. */
+ /* */
+ /* <Return> */
+ /* SUCCESS on success. FAILURE in case of overflow or of incoherent */
+ /* profile. */
+ /* */
+ static Bool
+ New_Profile( RAS_ARGS TStates aState,
+ Bool overshoot )
+ {
+ if ( !ras.fProfile )
+ {
+ ras.cProfile = (PProfile)ras.top;
+ ras.fProfile = ras.cProfile;
+ ras.top += AlignProfileSize;
+ }
+
+ if ( ras.top >= ras.maxBuff )
+ {
+ ras.error = FT_THROW( Overflow );
+ return FAILURE;
+ }
+
+ ras.cProfile->flags = 0;
+ ras.cProfile->start = 0;
+ ras.cProfile->height = 0;
+ ras.cProfile->offset = ras.top;
+ ras.cProfile->link = (PProfile)0;
+ ras.cProfile->next = (PProfile)0;
+ ras.cProfile->flags = ras.dropOutControl;
+
+ switch ( aState )
+ {
+ case Ascending_State:
+ ras.cProfile->flags |= Flow_Up;
+ if ( overshoot )
+ ras.cProfile->flags |= Overshoot_Bottom;
+
+ FT_TRACE6(( "New ascending profile = %p\n", ras.cProfile ));
+ break;
+
+ case Descending_State:
+ if ( overshoot )
+ ras.cProfile->flags |= Overshoot_Top;
+ FT_TRACE6(( "New descending profile = %p\n", ras.cProfile ));
+ break;
+
+ default:
+ FT_ERROR(( "New_Profile: invalid profile direction\n" ));
+ ras.error = FT_THROW( Invalid );
+ return FAILURE;
+ }
+
+ if ( !ras.gProfile )
+ ras.gProfile = ras.cProfile;
+
+ ras.state = aState;
+ ras.fresh = TRUE;
+ ras.joint = FALSE;
+
+ return SUCCESS;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* End_Profile */
+ /* */
+ /* <Description> */
+ /* Finalize the current profile. */
+ /* */
+ /* <Input> */
+ /* overshoot :: Whether the profile's unrounded end position differs */
+ /* by at least a half pixel. */
+ /* */
+ /* <Return> */
+ /* SUCCESS on success. FAILURE in case of overflow or incoherency. */
+ /* */
+ static Bool
+ End_Profile( RAS_ARGS Bool overshoot )
+ {
+ Long h;
+
+
+ h = (Long)( ras.top - ras.cProfile->offset );
+
+ if ( h < 0 )
+ {
+ FT_ERROR(( "End_Profile: negative height encountered\n" ));
+ ras.error = FT_THROW( Neg_Height );
+ return FAILURE;
+ }
+
+ if ( h > 0 )
+ {
+ PProfile oldProfile;
+
+
+ FT_TRACE6(( "Ending profile %p, start = %ld, height = %ld\n",
+ ras.cProfile, ras.cProfile->start, h ));
+
+ ras.cProfile->height = h;
+ if ( overshoot )
+ {
+ if ( ras.cProfile->flags & Flow_Up )
+ ras.cProfile->flags |= Overshoot_Top;
+ else
+ ras.cProfile->flags |= Overshoot_Bottom;
+ }
+
+ oldProfile = ras.cProfile;
+ ras.cProfile = (PProfile)ras.top;
+
+ ras.top += AlignProfileSize;
+
+ ras.cProfile->height = 0;
+ ras.cProfile->offset = ras.top;
+
+ oldProfile->next = ras.cProfile;
+ ras.num_Profs++;
+ }
+
+ if ( ras.top >= ras.maxBuff )
+ {
+ FT_TRACE1(( "overflow in End_Profile\n" ));
+ ras.error = FT_THROW( Overflow );
+ return FAILURE;
+ }
+
+ ras.joint = FALSE;
+
+ return SUCCESS;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Insert_Y_Turn */
+ /* */
+ /* <Description> */
+ /* Insert a salient into the sorted list placed on top of the render */
+ /* pool. */
+ /* */
+ /* <Input> */
+ /* New y scanline position. */
+ /* */
+ /* <Return> */
+ /* SUCCESS on success. FAILURE in case of overflow. */
+ /* */
+ static Bool
+ Insert_Y_Turn( RAS_ARGS Int y )
+ {
+ PLong y_turns;
+ Int n;
+
+
+ n = ras.numTurns - 1;
+ y_turns = ras.sizeBuff - ras.numTurns;
+
+ /* look for first y value that is <= */
+ while ( n >= 0 && y < y_turns[n] )
+ n--;
+
+ /* if it is <, simply insert it, ignore if == */
+ if ( n >= 0 && y > y_turns[n] )
+ while ( n >= 0 )
+ {
+ Int y2 = (Int)y_turns[n];
+
+
+ y_turns[n] = y;
+ y = y2;
+ n--;
+ }
+
+ if ( n < 0 )
+ {
+ ras.maxBuff--;
+ if ( ras.maxBuff <= ras.top )
+ {
+ ras.error = FT_THROW( Overflow );
+ return FAILURE;
+ }
+ ras.numTurns++;
+ ras.sizeBuff[-ras.numTurns] = y;
+ }
+
+ return SUCCESS;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Finalize_Profile_Table */
+ /* */
+ /* <Description> */
+ /* Adjust all links in the profiles list. */
+ /* */
+ /* <Return> */
+ /* SUCCESS on success. FAILURE in case of overflow. */
+ /* */
+ static Bool
+ Finalize_Profile_Table( RAS_ARG )
+ {
+ UShort n;
+ PProfile p;
+
+
+ n = ras.num_Profs;
+ p = ras.fProfile;
+
+ if ( n > 1 && p )
+ {
+ while ( n > 0 )
+ {
+ Int bottom, top;
+
+
+ if ( n > 1 )
+ p->link = (PProfile)( p->offset + p->height );
+ else
+ p->link = NULL;
+
+ if ( p->flags & Flow_Up )
+ {
+ bottom = (Int)p->start;
+ top = (Int)( p->start + p->height - 1 );
+ }
+ else
+ {
+ bottom = (Int)( p->start - p->height + 1 );
+ top = (Int)p->start;
+ p->start = bottom;
+ p->offset += p->height - 1;
+ }
+
+ if ( Insert_Y_Turn( RAS_VARS bottom ) ||
+ Insert_Y_Turn( RAS_VARS top + 1 ) )
+ return FAILURE;
+
+ p = p->link;
+ n--;
+ }
+ }
+ else
+ ras.fProfile = NULL;
+
+ return SUCCESS;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Split_Conic */
+ /* */
+ /* <Description> */
+ /* Subdivide one conic Bezier into two joint sub-arcs in the Bezier */
+ /* stack. */
+ /* */
+ /* <Input> */
+ /* None (subdivided Bezier is taken from the top of the stack). */
+ /* */
+ /* <Note> */
+ /* This routine is the `beef' of this component. It is _the_ inner */
+ /* loop that should be optimized to hell to get the best performance. */
+ /* */
+ static void
+ Split_Conic( TPoint* base )
+ {
+ Long a, b;
+
+
+ base[4].x = base[2].x;
+ b = base[1].x;
+ a = base[3].x = ( base[2].x + b ) / 2;
+ b = base[1].x = ( base[0].x + b ) / 2;
+ base[2].x = ( a + b ) / 2;
+
+ base[4].y = base[2].y;
+ b = base[1].y;
+ a = base[3].y = ( base[2].y + b ) / 2;
+ b = base[1].y = ( base[0].y + b ) / 2;
+ base[2].y = ( a + b ) / 2;
+
+ /* hand optimized. gcc doesn't seem to be too good at common */
+ /* expression substitution and instruction scheduling ;-) */
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Split_Cubic */
+ /* */
+ /* <Description> */
+ /* Subdivide a third-order Bezier arc into two joint sub-arcs in the */
+ /* Bezier stack. */
+ /* */
+ /* <Note> */
+ /* This routine is the `beef' of the component. It is one of _the_ */
+ /* inner loops that should be optimized like hell to get the best */
+ /* performance. */
+ /* */
+ static void
+ Split_Cubic( TPoint* base )
+ {
+ Long a, b, c, d;
+
+
+ base[6].x = base[3].x;
+ c = base[1].x;
+ d = base[2].x;
+ base[1].x = a = ( base[0].x + c + 1 ) >> 1;
+ base[5].x = b = ( base[3].x + d + 1 ) >> 1;
+ c = ( c + d + 1 ) >> 1;
+ base[2].x = a = ( a + c + 1 ) >> 1;
+ base[4].x = b = ( b + c + 1 ) >> 1;
+ base[3].x = ( a + b + 1 ) >> 1;
+
+ base[6].y = base[3].y;
+ c = base[1].y;
+ d = base[2].y;
+ base[1].y = a = ( base[0].y + c + 1 ) >> 1;
+ base[5].y = b = ( base[3].y + d + 1 ) >> 1;
+ c = ( c + d + 1 ) >> 1;
+ base[2].y = a = ( a + c + 1 ) >> 1;
+ base[4].y = b = ( b + c + 1 ) >> 1;
+ base[3].y = ( a + b + 1 ) >> 1;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Line_Up */
+ /* */
+ /* <Description> */
+ /* Compute the x-coordinates of an ascending line segment and store */
+ /* them in the render pool. */
+ /* */
+ /* <Input> */
+ /* x1 :: The x-coordinate of the segment's start point. */
+ /* */
+ /* y1 :: The y-coordinate of the segment's start point. */
+ /* */
+ /* x2 :: The x-coordinate of the segment's end point. */
+ /* */
+ /* y2 :: The y-coordinate of the segment's end point. */
+ /* */
+ /* miny :: A lower vertical clipping bound value. */
+ /* */
+ /* maxy :: An upper vertical clipping bound value. */
+ /* */
+ /* <Return> */
+ /* SUCCESS on success, FAILURE on render pool overflow. */
+ /* */
+ static Bool
+ Line_Up( RAS_ARGS Long x1,
+ Long y1,
+ Long x2,
+ Long y2,
+ Long miny,
+ Long maxy )
+ {
+ Long Dx, Dy;
+ Int e1, e2, f1, f2, size; /* XXX: is `Short' sufficient? */
+ Long Ix, Rx, Ax;
+
+ PLong top;
+
+
+ Dx = x2 - x1;
+ Dy = y2 - y1;
+
+ if ( Dy <= 0 || y2 < miny || y1 > maxy )
+ return SUCCESS;
+
+ if ( y1 < miny )
+ {
+ /* Take care: miny-y1 can be a very large value; we use */
+ /* a slow MulDiv function to avoid clipping bugs */
+ x1 += SMulDiv( Dx, miny - y1, Dy );
+ e1 = (Int)TRUNC( miny );
+ f1 = 0;
+ }
+ else
+ {
+ e1 = (Int)TRUNC( y1 );
+ f1 = (Int)FRAC( y1 );
+ }
+
+ if ( y2 > maxy )
+ {
+ /* x2 += FMulDiv( Dx, maxy - y2, Dy ); UNNECESSARY */
+ e2 = (Int)TRUNC( maxy );
+ f2 = 0;
+ }
+ else
+ {
+ e2 = (Int)TRUNC( y2 );
+ f2 = (Int)FRAC( y2 );
+ }
+
+ if ( f1 > 0 )
+ {
+ if ( e1 == e2 )
+ return SUCCESS;
+ else
+ {
+ x1 += SMulDiv( Dx, ras.precision - f1, Dy );
+ e1 += 1;
+ }
+ }
+ else
+ if ( ras.joint )
+ {
+ ras.top--;
+ ras.joint = FALSE;
+ }
+
+ ras.joint = (char)( f2 == 0 );
+
+ if ( ras.fresh )
+ {
+ ras.cProfile->start = e1;
+ ras.fresh = FALSE;
+ }
+
+ size = e2 - e1 + 1;
+ if ( ras.top + size >= ras.maxBuff )
+ {
+ ras.error = FT_THROW( Overflow );
+ return FAILURE;
+ }
+
+ if ( Dx > 0 )
+ {
+ Ix = SMulDiv_No_Round( ras.precision, Dx, Dy );
+ Rx = ( ras.precision * Dx ) % Dy;
+ Dx = 1;
+ }
+ else
+ {
+ Ix = -SMulDiv_No_Round( ras.precision, -Dx, Dy );
+ Rx = ( ras.precision * -Dx ) % Dy;
+ Dx = -1;
+ }
+
+ Ax = -Dy;
+ top = ras.top;
+
+ while ( size > 0 )
+ {
+ *top++ = x1;
+
+ x1 += Ix;
+ Ax += Rx;
+ if ( Ax >= 0 )
+ {
+ Ax -= Dy;
+ x1 += Dx;
+ }
+ size--;
+ }
+
+ ras.top = top;
+ return SUCCESS;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Line_Down */
+ /* */
+ /* <Description> */
+ /* Compute the x-coordinates of an descending line segment and store */
+ /* them in the render pool. */
+ /* */
+ /* <Input> */
+ /* x1 :: The x-coordinate of the segment's start point. */
+ /* */
+ /* y1 :: The y-coordinate of the segment's start point. */
+ /* */
+ /* x2 :: The x-coordinate of the segment's end point. */
+ /* */
+ /* y2 :: The y-coordinate of the segment's end point. */
+ /* */
+ /* miny :: A lower vertical clipping bound value. */
+ /* */
+ /* maxy :: An upper vertical clipping bound value. */
+ /* */
+ /* <Return> */
+ /* SUCCESS on success, FAILURE on render pool overflow. */
+ /* */
+ static Bool
+ Line_Down( RAS_ARGS Long x1,
+ Long y1,
+ Long x2,
+ Long y2,
+ Long miny,
+ Long maxy )
+ {
+ Bool result, fresh;
+
+
+ fresh = ras.fresh;
+
+ result = Line_Up( RAS_VARS x1, -y1, x2, -y2, -maxy, -miny );
+
+ if ( fresh && !ras.fresh )
+ ras.cProfile->start = -ras.cProfile->start;
+
+ return result;
+ }
+
+
+ /* A function type describing the functions used to split Bezier arcs */
+ typedef void (*TSplitter)( TPoint* base );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Bezier_Up */
+ /* */
+ /* <Description> */
+ /* Compute the x-coordinates of an ascending Bezier arc and store */
+ /* them in the render pool. */
+ /* */
+ /* <Input> */
+ /* degree :: The degree of the Bezier arc (either 2 or 3). */
+ /* */
+ /* splitter :: The function to split Bezier arcs. */
+ /* */
+ /* miny :: A lower vertical clipping bound value. */
+ /* */
+ /* maxy :: An upper vertical clipping bound value. */
+ /* */
+ /* <Return> */
+ /* SUCCESS on success, FAILURE on render pool overflow. */
+ /* */
+ static Bool
+ Bezier_Up( RAS_ARGS Int degree,
+ TSplitter splitter,
+ Long miny,
+ Long maxy )
+ {
+ Long y1, y2, e, e2, e0;
+ Short f1;
+
+ TPoint* arc;
+ TPoint* start_arc;
+
+ PLong top;
+
+
+ arc = ras.arc;
+ y1 = arc[degree].y;
+ y2 = arc[0].y;
+ top = ras.top;
+
+ if ( y2 < miny || y1 > maxy )
+ goto Fin;
+
+ e2 = FLOOR( y2 );
+
+ if ( e2 > maxy )
+ e2 = maxy;
+
+ e0 = miny;
+
+ if ( y1 < miny )
+ e = miny;
+ else
+ {
+ e = CEILING( y1 );
+ f1 = (Short)( FRAC( y1 ) );
+ e0 = e;
+
+ if ( f1 == 0 )
+ {
+ if ( ras.joint )
+ {
+ top--;
+ ras.joint = FALSE;
+ }
+
+ *top++ = arc[degree].x;
+
+ e += ras.precision;
+ }
+ }
+
+ if ( ras.fresh )
+ {
+ ras.cProfile->start = TRUNC( e0 );
+ ras.fresh = FALSE;
+ }
+
+ if ( e2 < e )
+ goto Fin;
+
+ if ( ( top + TRUNC( e2 - e ) + 1 ) >= ras.maxBuff )
+ {
+ ras.top = top;
+ ras.error = FT_THROW( Overflow );
+ return FAILURE;
+ }
+
+ start_arc = arc;
+
+ while ( arc >= start_arc && e <= e2 )
+ {
+ ras.joint = FALSE;
+
+ y2 = arc[0].y;
+
+ if ( y2 > e )
+ {
+ y1 = arc[degree].y;
+ if ( y2 - y1 >= ras.precision_step )
+ {
+ splitter( arc );
+ arc += degree;
+ }
+ else
+ {
+ *top++ = arc[degree].x + FMulDiv( arc[0].x - arc[degree].x,
+ e - y1, y2 - y1 );
+ arc -= degree;
+ e += ras.precision;
+ }
+ }
+ else
+ {
+ if ( y2 == e )
+ {
+ ras.joint = TRUE;
+ *top++ = arc[0].x;
+
+ e += ras.precision;
+ }
+ arc -= degree;
+ }
+ }
+
+ Fin:
+ ras.top = top;
+ ras.arc -= degree;
+ return SUCCESS;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Bezier_Down */
+ /* */
+ /* <Description> */
+ /* Compute the x-coordinates of an descending Bezier arc and store */
+ /* them in the render pool. */
+ /* */
+ /* <Input> */
+ /* degree :: The degree of the Bezier arc (either 2 or 3). */
+ /* */
+ /* splitter :: The function to split Bezier arcs. */
+ /* */
+ /* miny :: A lower vertical clipping bound value. */
+ /* */
+ /* maxy :: An upper vertical clipping bound value. */
+ /* */
+ /* <Return> */
+ /* SUCCESS on success, FAILURE on render pool overflow. */
+ /* */
+ static Bool
+ Bezier_Down( RAS_ARGS Int degree,
+ TSplitter splitter,
+ Long miny,
+ Long maxy )
+ {
+ TPoint* arc = ras.arc;
+ Bool result, fresh;
+
+
+ arc[0].y = -arc[0].y;
+ arc[1].y = -arc[1].y;
+ arc[2].y = -arc[2].y;
+ if ( degree > 2 )
+ arc[3].y = -arc[3].y;
+
+ fresh = ras.fresh;
+
+ result = Bezier_Up( RAS_VARS degree, splitter, -maxy, -miny );
+
+ if ( fresh && !ras.fresh )
+ ras.cProfile->start = -ras.cProfile->start;
+
+ arc[0].y = -arc[0].y;
+ return result;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Line_To */
+ /* */
+ /* <Description> */
+ /* Inject a new line segment and adjust the Profiles list. */
+ /* */
+ /* <Input> */
+ /* x :: The x-coordinate of the segment's end point (its start point */
+ /* is stored in `lastX'). */
+ /* */
+ /* y :: The y-coordinate of the segment's end point (its start point */
+ /* is stored in `lastY'). */
+ /* */
+ /* <Return> */
+ /* SUCCESS on success, FAILURE on render pool overflow or incorrect */
+ /* profile. */
+ /* */
+ static Bool
+ Line_To( RAS_ARGS Long x,
+ Long y )
+ {
+ /* First, detect a change of direction */
+
+ switch ( ras.state )
+ {
+ case Unknown_State:
+ if ( y > ras.lastY )
+ {
+ if ( New_Profile( RAS_VARS Ascending_State,
+ IS_BOTTOM_OVERSHOOT( ras.lastY ) ) )
+ return FAILURE;
+ }
+ else
+ {
+ if ( y < ras.lastY )
+ if ( New_Profile( RAS_VARS Descending_State,
+ IS_TOP_OVERSHOOT( ras.lastY ) ) )
+ return FAILURE;
+ }
+ break;
+
+ case Ascending_State:
+ if ( y < ras.lastY )
+ {
+ if ( End_Profile( RAS_VARS IS_TOP_OVERSHOOT( ras.lastY ) ) ||
+ New_Profile( RAS_VARS Descending_State,
+ IS_TOP_OVERSHOOT( ras.lastY ) ) )
+ return FAILURE;
+ }
+ break;
+
+ case Descending_State:
+ if ( y > ras.lastY )
+ {
+ if ( End_Profile( RAS_VARS IS_BOTTOM_OVERSHOOT( ras.lastY ) ) ||
+ New_Profile( RAS_VARS Ascending_State,
+ IS_BOTTOM_OVERSHOOT( ras.lastY ) ) )
+ return FAILURE;
+ }
+ break;
+
+ default:
+ ;
+ }
+
+ /* Then compute the lines */
+
+ switch ( ras.state )
+ {
+ case Ascending_State:
+ if ( Line_Up( RAS_VARS ras.lastX, ras.lastY,
+ x, y, ras.minY, ras.maxY ) )
+ return FAILURE;
+ break;
+
+ case Descending_State:
+ if ( Line_Down( RAS_VARS ras.lastX, ras.lastY,
+ x, y, ras.minY, ras.maxY ) )
+ return FAILURE;
+ break;
+
+ default:
+ ;
+ }
+
+ ras.lastX = x;
+ ras.lastY = y;
+
+ return SUCCESS;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Conic_To */
+ /* */
+ /* <Description> */
+ /* Inject a new conic arc and adjust the profile list. */
+ /* */
+ /* <Input> */
+ /* cx :: The x-coordinate of the arc's new control point. */
+ /* */
+ /* cy :: The y-coordinate of the arc's new control point. */
+ /* */
+ /* x :: The x-coordinate of the arc's end point (its start point is */
+ /* stored in `lastX'). */
+ /* */
+ /* y :: The y-coordinate of the arc's end point (its start point is */
+ /* stored in `lastY'). */
+ /* */
+ /* <Return> */
+ /* SUCCESS on success, FAILURE on render pool overflow or incorrect */
+ /* profile. */
+ /* */
+ static Bool
+ Conic_To( RAS_ARGS Long cx,
+ Long cy,
+ Long x,
+ Long y )
+ {
+ Long y1, y2, y3, x3, ymin, ymax;
+ TStates state_bez;
+
+
+ ras.arc = ras.arcs;
+ ras.arc[2].x = ras.lastX;
+ ras.arc[2].y = ras.lastY;
+ ras.arc[1].x = cx;
+ ras.arc[1].y = cy;
+ ras.arc[0].x = x;
+ ras.arc[0].y = y;
+
+ do
+ {
+ y1 = ras.arc[2].y;
+ y2 = ras.arc[1].y;
+ y3 = ras.arc[0].y;
+ x3 = ras.arc[0].x;
+
+ /* first, categorize the Bezier arc */
+
+ if ( y1 <= y3 )
+ {
+ ymin = y1;
+ ymax = y3;
+ }
+ else
+ {
+ ymin = y3;
+ ymax = y1;
+ }
+
+ if ( y2 < ymin || y2 > ymax )
+ {
+ /* this arc has no given direction, split it! */
+ Split_Conic( ras.arc );
+ ras.arc += 2;
+ }
+ else if ( y1 == y3 )
+ {
+ /* this arc is flat, ignore it and pop it from the Bezier stack */
+ ras.arc -= 2;
+ }
+ else
+ {
+ /* the arc is y-monotonous, either ascending or descending */
+ /* detect a change of direction */
+ state_bez = y1 < y3 ? Ascending_State : Descending_State;
+ if ( ras.state != state_bez )
+ {
+ Bool o = state_bez == Ascending_State ? IS_BOTTOM_OVERSHOOT( y1 )
+ : IS_TOP_OVERSHOOT( y1 );
+
+
+ /* finalize current profile if any */
+ if ( ras.state != Unknown_State &&
+ End_Profile( RAS_VARS o ) )
+ goto Fail;
+
+ /* create a new profile */
+ if ( New_Profile( RAS_VARS state_bez, o ) )
+ goto Fail;
+ }
+
+ /* now call the appropriate routine */
+ if ( state_bez == Ascending_State )
+ {
+ if ( Bezier_Up( RAS_VARS 2, Split_Conic, ras.minY, ras.maxY ) )
+ goto Fail;
+ }
+ else
+ if ( Bezier_Down( RAS_VARS 2, Split_Conic, ras.minY, ras.maxY ) )
+ goto Fail;
+ }
+
+ } while ( ras.arc >= ras.arcs );
+
+ ras.lastX = x3;
+ ras.lastY = y3;
+
+ return SUCCESS;
+
+ Fail:
+ return FAILURE;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Cubic_To */
+ /* */
+ /* <Description> */
+ /* Inject a new cubic arc and adjust the profile list. */
+ /* */
+ /* <Input> */
+ /* cx1 :: The x-coordinate of the arc's first new control point. */
+ /* */
+ /* cy1 :: The y-coordinate of the arc's first new control point. */
+ /* */
+ /* cx2 :: The x-coordinate of the arc's second new control point. */
+ /* */
+ /* cy2 :: The y-coordinate of the arc's second new control point. */
+ /* */
+ /* x :: The x-coordinate of the arc's end point (its start point is */
+ /* stored in `lastX'). */
+ /* */
+ /* y :: The y-coordinate of the arc's end point (its start point is */
+ /* stored in `lastY'). */
+ /* */
+ /* <Return> */
+ /* SUCCESS on success, FAILURE on render pool overflow or incorrect */
+ /* profile. */
+ /* */
+ static Bool
+ Cubic_To( RAS_ARGS Long cx1,
+ Long cy1,
+ Long cx2,
+ Long cy2,
+ Long x,
+ Long y )
+ {
+ Long y1, y2, y3, y4, x4, ymin1, ymax1, ymin2, ymax2;
+ TStates state_bez;
+
+
+ ras.arc = ras.arcs;
+ ras.arc[3].x = ras.lastX;
+ ras.arc[3].y = ras.lastY;
+ ras.arc[2].x = cx1;
+ ras.arc[2].y = cy1;
+ ras.arc[1].x = cx2;
+ ras.arc[1].y = cy2;
+ ras.arc[0].x = x;
+ ras.arc[0].y = y;
+
+ do
+ {
+ y1 = ras.arc[3].y;
+ y2 = ras.arc[2].y;
+ y3 = ras.arc[1].y;
+ y4 = ras.arc[0].y;
+ x4 = ras.arc[0].x;
+
+ /* first, categorize the Bezier arc */
+
+ if ( y1 <= y4 )
+ {
+ ymin1 = y1;
+ ymax1 = y4;
+ }
+ else
+ {
+ ymin1 = y4;
+ ymax1 = y1;
+ }
+
+ if ( y2 <= y3 )
+ {
+ ymin2 = y2;
+ ymax2 = y3;
+ }
+ else
+ {
+ ymin2 = y3;
+ ymax2 = y2;
+ }
+
+ if ( ymin2 < ymin1 || ymax2 > ymax1 )
+ {
+ /* this arc has no given direction, split it! */
+ Split_Cubic( ras.arc );
+ ras.arc += 3;
+ }
+ else if ( y1 == y4 )
+ {
+ /* this arc is flat, ignore it and pop it from the Bezier stack */
+ ras.arc -= 3;
+ }
+ else
+ {
+ state_bez = ( y1 <= y4 ) ? Ascending_State : Descending_State;
+
+ /* detect a change of direction */
+ if ( ras.state != state_bez )
+ {
+ Bool o = state_bez == Ascending_State ? IS_BOTTOM_OVERSHOOT( y1 )
+ : IS_TOP_OVERSHOOT( y1 );
+
+
+ /* finalize current profile if any */
+ if ( ras.state != Unknown_State &&
+ End_Profile( RAS_VARS o ) )
+ goto Fail;
+
+ if ( New_Profile( RAS_VARS state_bez, o ) )
+ goto Fail;
+ }
+
+ /* compute intersections */
+ if ( state_bez == Ascending_State )
+ {
+ if ( Bezier_Up( RAS_VARS 3, Split_Cubic, ras.minY, ras.maxY ) )
+ goto Fail;
+ }
+ else
+ if ( Bezier_Down( RAS_VARS 3, Split_Cubic, ras.minY, ras.maxY ) )
+ goto Fail;
+ }
+
+ } while ( ras.arc >= ras.arcs );
+
+ ras.lastX = x4;
+ ras.lastY = y4;
+
+ return SUCCESS;
+
+ Fail:
+ return FAILURE;
+ }
+
+
+#undef SWAP_
+#define SWAP_( x, y ) do \
+ { \
+ Long swap = x; \
+ \
+ \
+ x = y; \
+ y = swap; \
+ } while ( 0 )
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Decompose_Curve */
+ /* */
+ /* <Description> */
+ /* Scan the outline arrays in order to emit individual segments and */
+ /* Beziers by calling Line_To() and Bezier_To(). It handles all */
+ /* weird cases, like when the first point is off the curve, or when */
+ /* there are simply no `on' points in the contour! */
+ /* */
+ /* <Input> */
+ /* first :: The index of the first point in the contour. */
+ /* */
+ /* last :: The index of the last point in the contour. */
+ /* */
+ /* flipped :: If set, flip the direction of the curve. */
+ /* */
+ /* <Return> */
+ /* SUCCESS on success, FAILURE on error. */
+ /* */
+ static Bool
+ Decompose_Curve( RAS_ARGS UShort first,
+ UShort last,
+ int flipped )
+ {
+ FT_Vector v_last;
+ FT_Vector v_control;
+ FT_Vector v_start;
+
+ FT_Vector* points;
+ FT_Vector* point;
+ FT_Vector* limit;
+ char* tags;
+
+ unsigned tag; /* current point's state */
+
+
+ points = ras.outline.points;
+ limit = points + last;
+
+ v_start.x = SCALED( points[first].x );
+ v_start.y = SCALED( points[first].y );
+ v_last.x = SCALED( points[last].x );
+ v_last.y = SCALED( points[last].y );
+
+ if ( flipped )
+ {
+ SWAP_( v_start.x, v_start.y );
+ SWAP_( v_last.x, v_last.y );
+ }
+
+ v_control = v_start;
+
+ point = points + first;
+ tags = ras.outline.tags + first;
+
+ /* set scan mode if necessary */
+ if ( tags[0] & FT_CURVE_TAG_HAS_SCANMODE )
+ ras.dropOutControl = (Byte)tags[0] >> 5;
+
+ tag = FT_CURVE_TAG( tags[0] );
+
+ /* A contour cannot start with a cubic control point! */
+ if ( tag == FT_CURVE_TAG_CUBIC )
+ goto Invalid_Outline;
+
+ /* check first point to determine origin */
+ if ( tag == FT_CURVE_TAG_CONIC )
+ {
+ /* first point is conic control. Yes, this happens. */
+ if ( FT_CURVE_TAG( ras.outline.tags[last] ) == FT_CURVE_TAG_ON )
+ {
+ /* start at last point if it is on the curve */
+ v_start = v_last;
+ limit--;
+ }
+ else
+ {
+ /* if both first and last points are conic, */
+ /* start at their middle and record its position */
+ /* for closure */
+ v_start.x = ( v_start.x + v_last.x ) / 2;
+ v_start.y = ( v_start.y + v_last.y ) / 2;
+
+ v_last = v_start;
+ }
+ point--;
+ tags--;
+ }
+
+ ras.lastX = v_start.x;
+ ras.lastY = v_start.y;
+
+ while ( point < limit )
+ {
+ point++;
+ tags++;
+
+ tag = FT_CURVE_TAG( tags[0] );
+
+ switch ( tag )
+ {
+ case FT_CURVE_TAG_ON: /* emit a single line_to */
+ {
+ Long x, y;
+
+
+ x = SCALED( point->x );
+ y = SCALED( point->y );
+ if ( flipped )
+ SWAP_( x, y );
+
+ if ( Line_To( RAS_VARS x, y ) )
+ goto Fail;
+ continue;
+ }
+
+ case FT_CURVE_TAG_CONIC: /* consume conic arcs */
+ v_control.x = SCALED( point[0].x );
+ v_control.y = SCALED( point[0].y );
+
+ if ( flipped )
+ SWAP_( v_control.x, v_control.y );
+
+ Do_Conic:
+ if ( point < limit )
+ {
+ FT_Vector v_middle;
+ Long x, y;
+
+
+ point++;
+ tags++;
+ tag = FT_CURVE_TAG( tags[0] );
+
+ x = SCALED( point[0].x );
+ y = SCALED( point[0].y );
+
+ if ( flipped )
+ SWAP_( x, y );
+
+ if ( tag == FT_CURVE_TAG_ON )
+ {
+ if ( Conic_To( RAS_VARS v_control.x, v_control.y, x, y ) )
+ goto Fail;
+ continue;
+ }
+
+ if ( tag != FT_CURVE_TAG_CONIC )
+ goto Invalid_Outline;
+
+ v_middle.x = ( v_control.x + x ) / 2;
+ v_middle.y = ( v_control.y + y ) / 2;
+
+ if ( Conic_To( RAS_VARS v_control.x, v_control.y,
+ v_middle.x, v_middle.y ) )
+ goto Fail;
+
+ v_control.x = x;
+ v_control.y = y;
+
+ goto Do_Conic;
+ }
+
+ if ( Conic_To( RAS_VARS v_control.x, v_control.y,
+ v_start.x, v_start.y ) )
+ goto Fail;
+
+ goto Close;
+
+ default: /* FT_CURVE_TAG_CUBIC */
+ {
+ Long x1, y1, x2, y2, x3, y3;
+
+
+ if ( point + 1 > limit ||
+ FT_CURVE_TAG( tags[1] ) != FT_CURVE_TAG_CUBIC )
+ goto Invalid_Outline;
+
+ point += 2;
+ tags += 2;
+
+ x1 = SCALED( point[-2].x );
+ y1 = SCALED( point[-2].y );
+ x2 = SCALED( point[-1].x );
+ y2 = SCALED( point[-1].y );
+
+ if ( flipped )
+ {
+ SWAP_( x1, y1 );
+ SWAP_( x2, y2 );
+ }
+
+ if ( point <= limit )
+ {
+ x3 = SCALED( point[0].x );
+ y3 = SCALED( point[0].y );
+
+ if ( flipped )
+ SWAP_( x3, y3 );
+
+ if ( Cubic_To( RAS_VARS x1, y1, x2, y2, x3, y3 ) )
+ goto Fail;
+ continue;
+ }
+
+ if ( Cubic_To( RAS_VARS x1, y1, x2, y2, v_start.x, v_start.y ) )
+ goto Fail;
+ goto Close;
+ }
+ }
+ }
+
+ /* close the contour with a line segment */
+ if ( Line_To( RAS_VARS v_start.x, v_start.y ) )
+ goto Fail;
+
+ Close:
+ return SUCCESS;
+
+ Invalid_Outline:
+ ras.error = FT_THROW( Invalid );
+
+ Fail:
+ return FAILURE;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Convert_Glyph */
+ /* */
+ /* <Description> */
+ /* Convert a glyph into a series of segments and arcs and make a */
+ /* profiles list with them. */
+ /* */
+ /* <Input> */
+ /* flipped :: If set, flip the direction of curve. */
+ /* */
+ /* <Return> */
+ /* SUCCESS on success, FAILURE if any error was encountered during */
+ /* rendering. */
+ /* */
+ static Bool
+ Convert_Glyph( RAS_ARGS int flipped )
+ {
+ int i;
+ unsigned start;
+
+
+ ras.fProfile = NULL;
+ ras.joint = FALSE;
+ ras.fresh = FALSE;
+
+ ras.maxBuff = ras.sizeBuff - AlignProfileSize;
+
+ ras.numTurns = 0;
+
+ ras.cProfile = (PProfile)ras.top;
+ ras.cProfile->offset = ras.top;
+ ras.num_Profs = 0;
+
+ start = 0;
+
+ for ( i = 0; i < ras.outline.n_contours; i++ )
+ {
+ PProfile lastProfile;
+ Bool o;
+
+
+ ras.state = Unknown_State;
+ ras.gProfile = NULL;
+
+ if ( Decompose_Curve( RAS_VARS (unsigned short)start,
+ ras.outline.contours[i],
+ flipped ) )
+ return FAILURE;
+
+ start = ras.outline.contours[i] + 1;
+
+ /* we must now check whether the extreme arcs join or not */
+ if ( FRAC( ras.lastY ) == 0 &&
+ ras.lastY >= ras.minY &&
+ ras.lastY <= ras.maxY )
+ if ( ras.gProfile &&
+ ( ras.gProfile->flags & Flow_Up ) ==
+ ( ras.cProfile->flags & Flow_Up ) )
+ ras.top--;
+ /* Note that ras.gProfile can be nil if the contour was too small */
+ /* to be drawn. */
+
+ lastProfile = ras.cProfile;
+ if ( ras.cProfile->flags & Flow_Up )
+ o = IS_TOP_OVERSHOOT( ras.lastY );
+ else
+ o = IS_BOTTOM_OVERSHOOT( ras.lastY );
+ if ( End_Profile( RAS_VARS o ) )
+ return FAILURE;
+
+ /* close the `next profile in contour' linked list */
+ if ( ras.gProfile )
+ lastProfile->next = ras.gProfile;
+ }
+
+ if ( Finalize_Profile_Table( RAS_VAR ) )
+ return FAILURE;
+
+ return (Bool)( ras.top < ras.maxBuff ? SUCCESS : FAILURE );
+ }
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /** **/
+ /** SCAN-LINE SWEEPS AND DRAWING **/
+ /** **/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* Init_Linked */
+ /* */
+ /* Initializes an empty linked list. */
+ /* */
+ static void
+ Init_Linked( TProfileList* l )
+ {
+ *l = NULL;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* InsNew */
+ /* */
+ /* Inserts a new profile in a linked list. */
+ /* */
+ static void
+ InsNew( PProfileList list,
+ PProfile profile )
+ {
+ PProfile *old, current;
+ Long x;
+
+
+ old = list;
+ current = *old;
+ x = profile->X;
+
+ while ( current )
+ {
+ if ( x < current->X )
+ break;
+ old = &current->link;
+ current = *old;
+ }
+
+ profile->link = current;
+ *old = profile;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* DelOld */
+ /* */
+ /* Removes an old profile from a linked list. */
+ /* */
+ static void
+ DelOld( PProfileList list,
+ PProfile profile )
+ {
+ PProfile *old, current;
+
+
+ old = list;
+ current = *old;
+
+ while ( current )
+ {
+ if ( current == profile )
+ {
+ *old = current->link;
+ return;
+ }
+
+ old = &current->link;
+ current = *old;
+ }
+
+ /* we should never get there, unless the profile was not part of */
+ /* the list. */
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* Sort */
+ /* */
+ /* Sorts a trace list. In 95%, the list is already sorted. We need */
+ /* an algorithm which is fast in this case. Bubble sort is enough */
+ /* and simple. */
+ /* */
+ static void
+ Sort( PProfileList list )
+ {
+ PProfile *old, current, next;
+
+
+ /* First, set the new X coordinate of each profile */
+ current = *list;
+ while ( current )
+ {
+ current->X = *current->offset;
+ current->offset += current->flags & Flow_Up ? 1 : -1;
+ current->height--;
+ current = current->link;
+ }
+
+ /* Then sort them */
+ old = list;
+ current = *old;
+
+ if ( !current )
+ return;
+
+ next = current->link;
+
+ while ( next )
+ {
+ if ( current->X <= next->X )
+ {
+ old = &current->link;
+ current = *old;
+
+ if ( !current )
+ return;
+ }
+ else
+ {
+ *old = next;
+ current->link = next->link;
+ next->link = current;
+
+ old = list;
+ current = *old;
+ }
+
+ next = current->link;
+ }
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* Vertical Sweep Procedure Set */
+ /* */
+ /* These four routines are used during the vertical black/white sweep */
+ /* phase by the generic Draw_Sweep() function. */
+ /* */
+ /*************************************************************************/
+
+ static void
+ Vertical_Sweep_Init( RAS_ARGS Short* min,
+ Short* max )
+ {
+ Long pitch = ras.target.pitch;
+
+ FT_UNUSED( max );
+
+
+ ras.traceIncr = (Short)-pitch;
+ ras.traceOfs = -*min * pitch;
+ if ( pitch > 0 )
+ ras.traceOfs += ( ras.target.rows - 1 ) * pitch;
+
+ ras.gray_min_x = 0;
+ ras.gray_max_x = 0;
+ }
+
+
+ static void
+ Vertical_Sweep_Span( RAS_ARGS Short y,
+ FT_F26Dot6 x1,
+ FT_F26Dot6 x2,
+ PProfile left,
+ PProfile right )
+ {
+ Long e1, e2;
+ Byte* target;
+
+ FT_UNUSED( y );
+ FT_UNUSED( left );
+ FT_UNUSED( right );
+
+
+ /* Drop-out control */
+
+ e1 = TRUNC( CEILING( x1 ) );
+
+ if ( x2 - x1 - ras.precision <= ras.precision_jitter )
+ e2 = e1;
+ else
+ e2 = TRUNC( FLOOR( x2 ) );
+
+ if ( e2 >= 0 && e1 < ras.bWidth )
+ {
+ int c1, c2;
+ Byte f1, f2;
+
+
+ if ( e1 < 0 )
+ e1 = 0;
+ if ( e2 >= ras.bWidth )
+ e2 = ras.bWidth - 1;
+
+ c1 = (Short)( e1 >> 3 );
+ c2 = (Short)( e2 >> 3 );
+
+ f1 = (Byte) ( 0xFF >> ( e1 & 7 ) );
+ f2 = (Byte) ~( 0x7F >> ( e2 & 7 ) );
+
+ if ( ras.gray_min_x > c1 )
+ ras.gray_min_x = (short)c1;
+ if ( ras.gray_max_x < c2 )
+ ras.gray_max_x = (short)c2;
+
+ target = ras.bTarget + ras.traceOfs + c1;
+ c2 -= c1;
+
+ if ( c2 > 0 )
+ {
+ target[0] |= f1;
+
+ /* memset() is slower than the following code on many platforms. */
+ /* This is due to the fact that, in the vast majority of cases, */
+ /* the span length in bytes is relatively small. */
+ c2--;
+ while ( c2 > 0 )
+ {
+ *(++target) = 0xFF;
+ c2--;
+ }
+ target[1] |= f2;
+ }
+ else
+ *target |= ( f1 & f2 );
+ }
+ }
+
+
+ static void
+ Vertical_Sweep_Drop( RAS_ARGS Short y,
+ FT_F26Dot6 x1,
+ FT_F26Dot6 x2,
+ PProfile left,
+ PProfile right )
+ {
+ Long e1, e2, pxl;
+ Short c1, f1;
+
+
+ /* Drop-out control */
+
+ /* e2 x2 x1 e1 */
+ /* */
+ /* ^ | */
+ /* | | */
+ /* +-------------+---------------------+------------+ */
+ /* | | */
+ /* | v */
+ /* */
+ /* pixel contour contour pixel */
+ /* center center */
+
+ /* drop-out mode scan conversion rules (as defined in OpenType) */
+ /* --------------------------------------------------------------- */
+ /* 0 1, 2, 3 */
+ /* 1 1, 2, 4 */
+ /* 2 1, 2 */
+ /* 3 same as mode 2 */
+ /* 4 1, 2, 5 */
+ /* 5 1, 2, 6 */
+ /* 6, 7 same as mode 2 */
+
+ e1 = CEILING( x1 );
+ e2 = FLOOR ( x2 );
+ pxl = e1;
+
+ if ( e1 > e2 )
+ {
+ Int dropOutControl = left->flags & 7;
+
+
+ if ( e1 == e2 + ras.precision )
+ {
+ switch ( dropOutControl )
+ {
+ case 0: /* simple drop-outs including stubs */
+ pxl = e2;
+ break;
+
+ case 4: /* smart drop-outs including stubs */
+ pxl = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half );
+ break;
+
+ case 1: /* simple drop-outs excluding stubs */
+ case 5: /* smart drop-outs excluding stubs */
+
+ /* Drop-out Control Rules #4 and #6 */
+
+ /* The specification neither provides an exact definition */
+ /* of a `stub' nor gives exact rules to exclude them. */
+ /* */
+ /* Here the constraints we use to recognize a stub. */
+ /* */
+ /* upper stub: */
+ /* */
+ /* - P_Left and P_Right are in the same contour */
+ /* - P_Right is the successor of P_Left in that contour */
+ /* - y is the top of P_Left and P_Right */
+ /* */
+ /* lower stub: */
+ /* */
+ /* - P_Left and P_Right are in the same contour */
+ /* - P_Left is the successor of P_Right in that contour */
+ /* - y is the bottom of P_Left */
+ /* */
+ /* We draw a stub if the following constraints are met. */
+ /* */
+ /* - for an upper or lower stub, there is top or bottom */
+ /* overshoot, respectively */
+ /* - the covered interval is greater or equal to a half */
+ /* pixel */
+
+ /* upper stub test */
+ if ( left->next == right &&
+ left->height <= 0 &&
+ !( left->flags & Overshoot_Top &&
+ x2 - x1 >= ras.precision_half ) )
+ return;
+
+ /* lower stub test */
+ if ( right->next == left &&
+ left->start == y &&
+ !( left->flags & Overshoot_Bottom &&
+ x2 - x1 >= ras.precision_half ) )
+ return;
+
+ if ( dropOutControl == 1 )
+ pxl = e2;
+ else
+ pxl = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half );
+ break;
+
+ default: /* modes 2, 3, 6, 7 */
+ return; /* no drop-out control */
+ }
+
+ /* undocumented but confirmed: If the drop-out would result in a */
+ /* pixel outside of the bounding box, use the pixel inside of the */
+ /* bounding box instead */
+ if ( pxl < 0 )
+ pxl = e1;
+ else if ( TRUNC( pxl ) >= ras.bWidth )
+ pxl = e2;
+
+ /* check that the other pixel isn't set */
+ e1 = pxl == e1 ? e2 : e1;
+
+ e1 = TRUNC( e1 );
+
+ c1 = (Short)( e1 >> 3 );
+ f1 = (Short)( e1 & 7 );
+
+ if ( e1 >= 0 && e1 < ras.bWidth &&
+ ras.bTarget[ras.traceOfs + c1] & ( 0x80 >> f1 ) )
+ return;
+ }
+ else
+ return;
+ }
+
+ e1 = TRUNC( pxl );
+
+ if ( e1 >= 0 && e1 < ras.bWidth )
+ {
+ c1 = (Short)( e1 >> 3 );
+ f1 = (Short)( e1 & 7 );
+
+ if ( ras.gray_min_x > c1 )
+ ras.gray_min_x = c1;
+ if ( ras.gray_max_x < c1 )
+ ras.gray_max_x = c1;
+
+ ras.bTarget[ras.traceOfs + c1] |= (char)( 0x80 >> f1 );
+ }
+ }
+
+
+ static void
+ Vertical_Sweep_Step( RAS_ARG )
+ {
+ ras.traceOfs += ras.traceIncr;
+ }
+
+
+ /***********************************************************************/
+ /* */
+ /* Horizontal Sweep Procedure Set */
+ /* */
+ /* These four routines are used during the horizontal black/white */
+ /* sweep phase by the generic Draw_Sweep() function. */
+ /* */
+ /***********************************************************************/
+
+ static void
+ Horizontal_Sweep_Init( RAS_ARGS Short* min,
+ Short* max )
+ {
+ /* nothing, really */
+ FT_UNUSED_RASTER;
+ FT_UNUSED( min );
+ FT_UNUSED( max );
+ }
+
+
+ static void
+ Horizontal_Sweep_Span( RAS_ARGS Short y,
+ FT_F26Dot6 x1,
+ FT_F26Dot6 x2,
+ PProfile left,
+ PProfile right )
+ {
+ FT_UNUSED( left );
+ FT_UNUSED( right );
+
+
+ if ( x2 - x1 < ras.precision )
+ {
+ Long e1, e2;
+
+
+ e1 = CEILING( x1 );
+ e2 = FLOOR ( x2 );
+
+ if ( e1 == e2 )
+ {
+ Byte f1;
+ PByte bits;
+
+
+ bits = ras.bTarget + ( y >> 3 );
+ f1 = (Byte)( 0x80 >> ( y & 7 ) );
+
+ e1 = TRUNC( e1 );
+
+ if ( e1 >= 0 && e1 < ras.target.rows )
+ {
+ PByte p;
+
+
+ p = bits - e1 * ras.target.pitch;
+ if ( ras.target.pitch > 0 )
+ p += ( ras.target.rows - 1 ) * ras.target.pitch;
+
+ p[0] |= f1;
+ }
+ }
+ }
+ }
+
+
+ static void
+ Horizontal_Sweep_Drop( RAS_ARGS Short y,
+ FT_F26Dot6 x1,
+ FT_F26Dot6 x2,
+ PProfile left,
+ PProfile right )
+ {
+ Long e1, e2, pxl;
+ PByte bits;
+ Byte f1;
+
+
+ /* During the horizontal sweep, we only take care of drop-outs */
+
+ /* e1 + <-- pixel center */
+ /* | */
+ /* x1 ---+--> <-- contour */
+ /* | */
+ /* | */
+ /* x2 <--+--- <-- contour */
+ /* | */
+ /* | */
+ /* e2 + <-- pixel center */
+
+ e1 = CEILING( x1 );
+ e2 = FLOOR ( x2 );
+ pxl = e1;
+
+ if ( e1 > e2 )
+ {
+ Int dropOutControl = left->flags & 7;
+
+
+ if ( e1 == e2 + ras.precision )
+ {
+ switch ( dropOutControl )
+ {
+ case 0: /* simple drop-outs including stubs */
+ pxl = e2;
+ break;
+
+ case 4: /* smart drop-outs including stubs */
+ pxl = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half );
+ break;
+
+ case 1: /* simple drop-outs excluding stubs */
+ case 5: /* smart drop-outs excluding stubs */
+ /* see Vertical_Sweep_Drop for details */
+
+ /* rightmost stub test */
+ if ( left->next == right &&
+ left->height <= 0 &&
+ !( left->flags & Overshoot_Top &&
+ x2 - x1 >= ras.precision_half ) )
+ return;
+
+ /* leftmost stub test */
+ if ( right->next == left &&
+ left->start == y &&
+ !( left->flags & Overshoot_Bottom &&
+ x2 - x1 >= ras.precision_half ) )
+ return;
+
+ if ( dropOutControl == 1 )
+ pxl = e2;
+ else
+ pxl = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half );
+ break;
+
+ default: /* modes 2, 3, 6, 7 */
+ return; /* no drop-out control */
+ }
+
+ /* undocumented but confirmed: If the drop-out would result in a */
+ /* pixel outside of the bounding box, use the pixel inside of the */
+ /* bounding box instead */
+ if ( pxl < 0 )
+ pxl = e1;
+ else if ( TRUNC( pxl ) >= ras.target.rows )
+ pxl = e2;
+
+ /* check that the other pixel isn't set */
+ e1 = pxl == e1 ? e2 : e1;
+
+ e1 = TRUNC( e1 );
+
+ bits = ras.bTarget + ( y >> 3 );
+ f1 = (Byte)( 0x80 >> ( y & 7 ) );
+
+ bits -= e1 * ras.target.pitch;
+ if ( ras.target.pitch > 0 )
+ bits += ( ras.target.rows - 1 ) * ras.target.pitch;
+
+ if ( e1 >= 0 &&
+ e1 < ras.target.rows &&
+ *bits & f1 )
+ return;
+ }
+ else
+ return;
+ }
+
+ bits = ras.bTarget + ( y >> 3 );
+ f1 = (Byte)( 0x80 >> ( y & 7 ) );
+
+ e1 = TRUNC( pxl );
+
+ if ( e1 >= 0 && e1 < ras.target.rows )
+ {
+ bits -= e1 * ras.target.pitch;
+ if ( ras.target.pitch > 0 )
+ bits += ( ras.target.rows - 1 ) * ras.target.pitch;
+
+ bits[0] |= f1;
+ }
+ }
+
+
+ static void
+ Horizontal_Sweep_Step( RAS_ARG )
+ {
+ /* Nothing, really */
+ FT_UNUSED_RASTER;
+ }
+
+
+#ifdef FT_RASTER_OPTION_ANTI_ALIASING
+
+
+ /*************************************************************************/
+ /* */
+ /* Vertical Gray Sweep Procedure Set */
+ /* */
+ /* These two routines are used during the vertical gray-levels sweep */
+ /* phase by the generic Draw_Sweep() function. */
+ /* */
+ /* NOTES */
+ /* */
+ /* - The target pixmap's width *must* be a multiple of 4. */
+ /* */
+ /* - You have to use the function Vertical_Sweep_Span() for the gray */
+ /* span call. */
+ /* */
+ /*************************************************************************/
+
+ static void
+ Vertical_Gray_Sweep_Init( RAS_ARGS Short* min,
+ Short* max )
+ {
+ Long pitch, byte_len;
+
+
+ *min = *min & -2;
+ *max = ( *max + 3 ) & -2;
+
+ ras.traceOfs = 0;
+ pitch = ras.target.pitch;
+ byte_len = -pitch;
+ ras.traceIncr = (Short)byte_len;
+ ras.traceG = ( *min / 2 ) * byte_len;
+
+ if ( pitch > 0 )
+ {
+ ras.traceG += ( ras.target.rows - 1 ) * pitch;
+ byte_len = -byte_len;
+ }
+
+ ras.gray_min_x = (Short)byte_len;
+ ras.gray_max_x = -(Short)byte_len;
+ }
+
+
+ static void
+ Vertical_Gray_Sweep_Step( RAS_ARG )
+ {
+ short* count = (short*)count_table;
+ Byte* grays;
+
+
+ ras.traceOfs += ras.gray_width;
+
+ if ( ras.traceOfs > ras.gray_width )
+ {
+ PByte pix;
+
+
+ pix = ras.gTarget + ras.traceG + ras.gray_min_x * 4;
+ grays = ras.grays;
+
+ if ( ras.gray_max_x >= 0 )
+ {
+ Long last_pixel = ras.target.width - 1;
+ Int last_cell = last_pixel >> 2;
+ Int last_bit = last_pixel & 3;
+ Bool over = 0;
+
+ Int c1, c2;
+ PByte bit, bit2;
+
+
+ if ( ras.gray_max_x >= last_cell && last_bit != 3 )
+ {
+ ras.gray_max_x = last_cell - 1;
+ over = 1;
+ }
+
+ if ( ras.gray_min_x < 0 )
+ ras.gray_min_x = 0;
+
+ bit = ras.bTarget + ras.gray_min_x;
+ bit2 = bit + ras.gray_width;
+
+ c1 = ras.gray_max_x - ras.gray_min_x;
+
+ while ( c1 >= 0 )
+ {
+ c2 = count[*bit] + count[*bit2];
+
+ if ( c2 )
+ {
+ pix[0] = grays[(c2 >> 12) & 0x000F];
+ pix[1] = grays[(c2 >> 8 ) & 0x000F];
+ pix[2] = grays[(c2 >> 4 ) & 0x000F];
+ pix[3] = grays[ c2 & 0x000F];
+
+ *bit = 0;
+ *bit2 = 0;
+ }
+
+ bit++;
+ bit2++;
+ pix += 4;
+ c1--;
+ }
+
+ if ( over )
+ {
+ c2 = count[*bit] + count[*bit2];
+ if ( c2 )
+ {
+ switch ( last_bit )
+ {
+ case 2:
+ pix[2] = grays[(c2 >> 4 ) & 0x000F];
+ case 1:
+ pix[1] = grays[(c2 >> 8 ) & 0x000F];
+ default:
+ pix[0] = grays[(c2 >> 12) & 0x000F];
+ }
+
+ *bit = 0;
+ *bit2 = 0;
+ }
+ }
+ }
+
+ ras.traceOfs = 0;
+ ras.traceG += ras.traceIncr;
+
+ ras.gray_min_x = 32000;
+ ras.gray_max_x = -32000;
+ }
+ }
+
+
+ static void
+ Horizontal_Gray_Sweep_Span( RAS_ARGS Short y,
+ FT_F26Dot6 x1,
+ FT_F26Dot6 x2,
+ PProfile left,
+ PProfile right )
+ {
+ /* nothing, really */
+ FT_UNUSED_RASTER;
+ FT_UNUSED( y );
+ FT_UNUSED( x1 );
+ FT_UNUSED( x2 );
+ FT_UNUSED( left );
+ FT_UNUSED( right );
+ }
+
+
+ static void
+ Horizontal_Gray_Sweep_Drop( RAS_ARGS Short y,
+ FT_F26Dot6 x1,
+ FT_F26Dot6 x2,
+ PProfile left,
+ PProfile right )
+ {
+ Long e1, e2;
+ PByte pixel;
+
+
+ /* During the horizontal sweep, we only take care of drop-outs */
+
+ e1 = CEILING( x1 );
+ e2 = FLOOR ( x2 );
+
+ if ( e1 > e2 )
+ {
+ Int dropOutControl = left->flags & 7;
+
+
+ if ( e1 == e2 + ras.precision )
+ {
+ switch ( dropOutControl )
+ {
+ case 0: /* simple drop-outs including stubs */
+ e1 = e2;
+ break;
+
+ case 4: /* smart drop-outs including stubs */
+ e1 = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half );
+ break;
+
+ case 1: /* simple drop-outs excluding stubs */
+ case 5: /* smart drop-outs excluding stubs */
+ /* see Vertical_Sweep_Drop for details */
+
+ /* rightmost stub test */
+ if ( left->next == right && left->height <= 0 )
+ return;
+
+ /* leftmost stub test */
+ if ( right->next == left && left->start == y )
+ return;
+
+ if ( dropOutControl == 1 )
+ e1 = e2;
+ else
+ e1 = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half );
+
+ break;
+
+ default: /* modes 2, 3, 6, 7 */
+ return; /* no drop-out control */
+ }
+ }
+ else
+ return;
+ }
+
+ if ( e1 >= 0 )
+ {
+ Byte color;
+
+
+ if ( x2 - x1 >= ras.precision_half )
+ color = ras.grays[2];
+ else
+ color = ras.grays[1];
+
+ e1 = TRUNC( e1 ) / 2;
+ if ( e1 < ras.target.rows )
+ {
+ pixel = ras.gTarget - e1 * ras.target.pitch + y / 2;
+ if ( ras.target.pitch > 0 )
+ pixel += ( ras.target.rows - 1 ) * ras.target.pitch;
+
+ if ( pixel[0] == ras.grays[0] )
+ pixel[0] = color;
+ }
+ }
+ }
+
+
+#endif /* FT_RASTER_OPTION_ANTI_ALIASING */
+
+
+ /*************************************************************************/
+ /* */
+ /* Generic Sweep Drawing routine */
+ /* */
+ /*************************************************************************/
+
+ static Bool
+ Draw_Sweep( RAS_ARG )
+ {
+ Short y, y_change, y_height;
+
+ PProfile P, Q, P_Left, P_Right;
+
+ Short min_Y, max_Y, top, bottom, dropouts;
+
+ Long x1, x2, xs, e1, e2;
+
+ TProfileList waiting;
+ TProfileList draw_left, draw_right;
+
+
+ /* initialize empty linked lists */
+
+ Init_Linked( &waiting );
+
+ Init_Linked( &draw_left );
+ Init_Linked( &draw_right );
+
+ /* first, compute min and max Y */
+
+ P = ras.fProfile;
+ max_Y = (Short)TRUNC( ras.minY );
+ min_Y = (Short)TRUNC( ras.maxY );
+
+ while ( P )
+ {
+ Q = P->link;
+
+ bottom = (Short)P->start;
+ top = (Short)( P->start + P->height - 1 );
+
+ if ( min_Y > bottom )
+ min_Y = bottom;
+ if ( max_Y < top )
+ max_Y = top;
+
+ P->X = 0;
+ InsNew( &waiting, P );
+
+ P = Q;
+ }
+
+ /* check the Y-turns */
+ if ( ras.numTurns == 0 )
+ {
+ ras.error = FT_THROW( Invalid );
+ return FAILURE;
+ }
+
+ /* now initialize the sweep */
+
+ ras.Proc_Sweep_Init( RAS_VARS &min_Y, &max_Y );
+
+ /* then compute the distance of each profile from min_Y */
+
+ P = waiting;
+
+ while ( P )
+ {
+ P->countL = (UShort)( P->start - min_Y );
+ P = P->link;
+ }
+
+ /* let's go */
+
+ y = min_Y;
+ y_height = 0;
+
+ if ( ras.numTurns > 0 &&
+ ras.sizeBuff[-ras.numTurns] == min_Y )
+ ras.numTurns--;
+
+ while ( ras.numTurns > 0 )
+ {
+ /* check waiting list for new activations */
+
+ P = waiting;
+
+ while ( P )
+ {
+ Q = P->link;
+ P->countL -= y_height;
+ if ( P->countL == 0 )
+ {
+ DelOld( &waiting, P );
+
+ if ( P->flags & Flow_Up )
+ InsNew( &draw_left, P );
+ else
+ InsNew( &draw_right, P );
+ }
+
+ P = Q;
+ }
+
+ /* sort the drawing lists */
+
+ Sort( &draw_left );
+ Sort( &draw_right );
+
+ y_change = (Short)ras.sizeBuff[-ras.numTurns--];
+ y_height = (Short)( y_change - y );
+
+ while ( y < y_change )
+ {
+ /* let's trace */
+
+ dropouts = 0;
+
+ P_Left = draw_left;
+ P_Right = draw_right;
+
+ while ( P_Left )
+ {
+ x1 = P_Left ->X;
+ x2 = P_Right->X;
+
+ if ( x1 > x2 )
+ {
+ xs = x1;
+ x1 = x2;
+ x2 = xs;
+ }
+
+ e1 = FLOOR( x1 );
+ e2 = CEILING( x2 );
+
+ if ( x2 - x1 <= ras.precision &&
+ e1 != x1 && e2 != x2 )
+ {
+ if ( e1 > e2 || e2 == e1 + ras.precision )
+ {
+ Int dropOutControl = P_Left->flags & 7;
+
+
+ if ( dropOutControl != 2 )
+ {
+ /* a drop-out was detected */
+
+ P_Left ->X = x1;
+ P_Right->X = x2;
+
+ /* mark profile for drop-out processing */
+ P_Left->countL = 1;
+ dropouts++;
+ }
+
+ goto Skip_To_Next;
+ }
+ }
+
+ ras.Proc_Sweep_Span( RAS_VARS y, x1, x2, P_Left, P_Right );
+
+ Skip_To_Next:
+
+ P_Left = P_Left->link;
+ P_Right = P_Right->link;
+ }
+
+ /* handle drop-outs _after_ the span drawing -- */
+ /* drop-out processing has been moved out of the loop */
+ /* for performance tuning */
+ if ( dropouts > 0 )
+ goto Scan_DropOuts;
+
+ Next_Line:
+
+ ras.Proc_Sweep_Step( RAS_VAR );
+
+ y++;
+
+ if ( y < y_change )
+ {
+ Sort( &draw_left );
+ Sort( &draw_right );
+ }
+ }
+
+ /* now finalize the profiles that need it */
+
+ P = draw_left;
+ while ( P )
+ {
+ Q = P->link;
+ if ( P->height == 0 )
+ DelOld( &draw_left, P );
+ P = Q;
+ }
+
+ P = draw_right;
+ while ( P )
+ {
+ Q = P->link;
+ if ( P->height == 0 )
+ DelOld( &draw_right, P );
+ P = Q;
+ }
+ }
+
+ /* for gray-scaling, flush the bitmap scanline cache */
+ while ( y <= max_Y )
+ {
+ ras.Proc_Sweep_Step( RAS_VAR );
+ y++;
+ }
+
+ return SUCCESS;
+
+ Scan_DropOuts:
+
+ P_Left = draw_left;
+ P_Right = draw_right;
+
+ while ( P_Left )
+ {
+ if ( P_Left->countL )
+ {
+ P_Left->countL = 0;
+#if 0
+ dropouts--; /* -- this is useful when debugging only */
+#endif
+ ras.Proc_Sweep_Drop( RAS_VARS y,
+ P_Left->X,
+ P_Right->X,
+ P_Left,
+ P_Right );
+ }
+
+ P_Left = P_Left->link;
+ P_Right = P_Right->link;
+ }
+
+ goto Next_Line;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Render_Single_Pass */
+ /* */
+ /* <Description> */
+ /* Perform one sweep with sub-banding. */
+ /* */
+ /* <Input> */
+ /* flipped :: If set, flip the direction of the outline. */
+ /* */
+ /* <Return> */
+ /* Renderer error code. */
+ /* */
+ static int
+ Render_Single_Pass( RAS_ARGS Bool flipped )
+ {
+ Short i, j, k;
+
+
+ while ( ras.band_top >= 0 )
+ {
+ ras.maxY = (Long)ras.band_stack[ras.band_top].y_max * ras.precision;
+ ras.minY = (Long)ras.band_stack[ras.band_top].y_min * ras.precision;
+
+ ras.top = ras.buff;
+
+ ras.error = Raster_Err_None;
+
+ if ( Convert_Glyph( RAS_VARS flipped ) )
+ {
+ if ( ras.error != Raster_Err_Overflow )
+ return FAILURE;
+
+ ras.error = Raster_Err_None;
+
+ /* sub-banding */
+
+#ifdef DEBUG_RASTER
+ ClearBand( RAS_VARS TRUNC( ras.minY ), TRUNC( ras.maxY ) );
+#endif
+
+ i = ras.band_stack[ras.band_top].y_min;
+ j = ras.band_stack[ras.band_top].y_max;
+
+ k = (Short)( ( i + j ) / 2 );
+
+ if ( ras.band_top >= 7 || k < i )
+ {
+ ras.band_top = 0;
+ ras.error = FT_THROW( Invalid );
+
+ return ras.error;
+ }
+
+ ras.band_stack[ras.band_top + 1].y_min = k;
+ ras.band_stack[ras.band_top + 1].y_max = j;
+
+ ras.band_stack[ras.band_top].y_max = (Short)( k - 1 );
+
+ ras.band_top++;
+ }
+ else
+ {
+ if ( ras.fProfile )
+ if ( Draw_Sweep( RAS_VAR ) )
+ return ras.error;
+ ras.band_top--;
+ }
+ }
+
+ return SUCCESS;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Render_Glyph */
+ /* */
+ /* <Description> */
+ /* Render a glyph in a bitmap. Sub-banding if needed. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ Render_Glyph( RAS_ARG )
+ {
+ FT_Error error;
+
+
+ Set_High_Precision( RAS_VARS ras.outline.flags &
+ FT_OUTLINE_HIGH_PRECISION );
+ ras.scale_shift = ras.precision_shift;
+
+ if ( ras.outline.flags & FT_OUTLINE_IGNORE_DROPOUTS )
+ ras.dropOutControl = 2;
+ else
+ {
+ if ( ras.outline.flags & FT_OUTLINE_SMART_DROPOUTS )
+ ras.dropOutControl = 4;
+ else
+ ras.dropOutControl = 0;
+
+ if ( !( ras.outline.flags & FT_OUTLINE_INCLUDE_STUBS ) )
+ ras.dropOutControl += 1;
+ }
+
+ ras.second_pass = (FT_Byte)( !( ras.outline.flags &
+ FT_OUTLINE_SINGLE_PASS ) );
+
+ /* Vertical Sweep */
+ ras.Proc_Sweep_Init = Vertical_Sweep_Init;
+ ras.Proc_Sweep_Span = Vertical_Sweep_Span;
+ ras.Proc_Sweep_Drop = Vertical_Sweep_Drop;
+ ras.Proc_Sweep_Step = Vertical_Sweep_Step;
+
+ ras.band_top = 0;
+ ras.band_stack[0].y_min = 0;
+ ras.band_stack[0].y_max = (short)( ras.target.rows - 1 );
+
+ ras.bWidth = (unsigned short)ras.target.width;
+ ras.bTarget = (Byte*)ras.target.buffer;
+
+ if ( ( error = Render_Single_Pass( RAS_VARS 0 ) ) != 0 )
+ return error;
+
+ /* Horizontal Sweep */
+ if ( ras.second_pass && ras.dropOutControl != 2 )
+ {
+ ras.Proc_Sweep_Init = Horizontal_Sweep_Init;
+ ras.Proc_Sweep_Span = Horizontal_Sweep_Span;
+ ras.Proc_Sweep_Drop = Horizontal_Sweep_Drop;
+ ras.Proc_Sweep_Step = Horizontal_Sweep_Step;
+
+ ras.band_top = 0;
+ ras.band_stack[0].y_min = 0;
+ ras.band_stack[0].y_max = (short)( ras.target.width - 1 );
+
+ if ( ( error = Render_Single_Pass( RAS_VARS 1 ) ) != 0 )
+ return error;
+ }
+
+ return Raster_Err_None;
+ }
+
+
+#ifdef FT_RASTER_OPTION_ANTI_ALIASING
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Render_Gray_Glyph */
+ /* */
+ /* <Description> */
+ /* Render a glyph with grayscaling. Sub-banding if needed. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ Render_Gray_Glyph( RAS_ARG )
+ {
+ Long pixel_width;
+ FT_Error error;
+
+
+ Set_High_Precision( RAS_VARS ras.outline.flags &
+ FT_OUTLINE_HIGH_PRECISION );
+ ras.scale_shift = ras.precision_shift + 1;
+
+ if ( ras.outline.flags & FT_OUTLINE_IGNORE_DROPOUTS )
+ ras.dropOutControl = 2;
+ else
+ {
+ if ( ras.outline.flags & FT_OUTLINE_SMART_DROPOUTS )
+ ras.dropOutControl = 4;
+ else
+ ras.dropOutControl = 0;
+
+ if ( !( ras.outline.flags & FT_OUTLINE_INCLUDE_STUBS ) )
+ ras.dropOutControl += 1;
+ }
+
+ ras.second_pass = !( ras.outline.flags & FT_OUTLINE_SINGLE_PASS );
+
+ /* Vertical Sweep */
+
+ ras.band_top = 0;
+ ras.band_stack[0].y_min = 0;
+ ras.band_stack[0].y_max = 2 * ras.target.rows - 1;
+
+ ras.bWidth = ras.gray_width;
+ pixel_width = 2 * ( ( ras.target.width + 3 ) >> 2 );
+
+ if ( ras.bWidth > pixel_width )
+ ras.bWidth = pixel_width;
+
+ ras.bWidth = ras.bWidth * 8;
+ ras.bTarget = (Byte*)ras.gray_lines;
+ ras.gTarget = (Byte*)ras.target.buffer;
+
+ ras.Proc_Sweep_Init = Vertical_Gray_Sweep_Init;
+ ras.Proc_Sweep_Span = Vertical_Sweep_Span;
+ ras.Proc_Sweep_Drop = Vertical_Sweep_Drop;
+ ras.Proc_Sweep_Step = Vertical_Gray_Sweep_Step;
+
+ error = Render_Single_Pass( RAS_VARS 0 );
+ if ( error )
+ return error;
+
+ /* Horizontal Sweep */
+ if ( ras.second_pass && ras.dropOutControl != 2 )
+ {
+ ras.Proc_Sweep_Init = Horizontal_Sweep_Init;
+ ras.Proc_Sweep_Span = Horizontal_Gray_Sweep_Span;
+ ras.Proc_Sweep_Drop = Horizontal_Gray_Sweep_Drop;
+ ras.Proc_Sweep_Step = Horizontal_Sweep_Step;
+
+ ras.band_top = 0;
+ ras.band_stack[0].y_min = 0;
+ ras.band_stack[0].y_max = ras.target.width * 2 - 1;
+
+ error = Render_Single_Pass( RAS_VARS 1 );
+ if ( error )
+ return error;
+ }
+
+ return Raster_Err_None;
+ }
+
+#else /* !FT_RASTER_OPTION_ANTI_ALIASING */
+
+ FT_LOCAL_DEF( FT_Error )
+ Render_Gray_Glyph( RAS_ARG )
+ {
+ FT_UNUSED_RASTER;
+
+ return FT_THROW( Unsupported );
+ }
+
+#endif /* !FT_RASTER_OPTION_ANTI_ALIASING */
+
+
+ static void
+ ft_black_init( black_PRaster raster )
+ {
+#ifdef FT_RASTER_OPTION_ANTI_ALIASING
+ FT_UInt n;
+
+
+ /* set default 5-levels gray palette */
+ for ( n = 0; n < 5; n++ )
+ raster->grays[n] = n * 255 / 4;
+
+ raster->gray_width = RASTER_GRAY_LINES / 2;
+#else
+ FT_UNUSED( raster );
+#endif
+ }
+
+
+ /**** RASTER OBJECT CREATION: In standalone mode, we simply use *****/
+ /**** a static object. *****/
+
+
+#ifdef _STANDALONE_
+
+
+ static int
+ ft_black_new( void* memory,
+ FT_Raster *araster )
+ {
+ static black_TRaster the_raster;
+ FT_UNUSED( memory );
+
+
+ *araster = (FT_Raster)&the_raster;
+ FT_MEM_ZERO( &the_raster, sizeof ( the_raster ) );
+ ft_black_init( &the_raster );
+
+ return 0;
+ }
+
+
+ static void
+ ft_black_done( FT_Raster raster )
+ {
+ /* nothing */
+ FT_UNUSED( raster );
+ }
+
+
+#else /* !_STANDALONE_ */
+
+
+ static int
+ ft_black_new( FT_Memory memory,
+ black_PRaster *araster )
+ {
+ FT_Error error;
+ black_PRaster raster = NULL;
+
+
+ *araster = 0;
+ if ( !FT_NEW( raster ) )
+ {
+ raster->memory = memory;
+ ft_black_init( raster );
+
+ *araster = raster;
+ }
+
+ return error;
+ }
+
+
+ static void
+ ft_black_done( black_PRaster raster )
+ {
+ FT_Memory memory = (FT_Memory)raster->memory;
+
+
+ FT_FREE( raster );
+ }
+
+
+#endif /* !_STANDALONE_ */
+
+
+ static void
+ ft_black_reset( black_PRaster raster,
+ char* pool_base,
+ long pool_size )
+ {
+ if ( raster )
+ {
+ if ( pool_base && pool_size >= (long)sizeof ( black_TWorker ) + 2048 )
+ {
+ black_PWorker worker = (black_PWorker)pool_base;
+
+
+ raster->buffer = pool_base + ( ( sizeof ( *worker ) + 7 ) & ~7 );
+ raster->buffer_size = (long)( pool_base + pool_size -
+ (char*)raster->buffer );
+ raster->worker = worker;
+ }
+ else
+ {
+ raster->buffer = NULL;
+ raster->buffer_size = 0;
+ raster->worker = NULL;
+ }
+ }
+ }
+
+
+ static void
+ ft_black_set_mode( black_PRaster raster,
+ unsigned long mode,
+ const char* palette )
+ {
+#ifdef FT_RASTER_OPTION_ANTI_ALIASING
+
+ if ( mode == FT_MAKE_TAG( 'p', 'a', 'l', '5' ) )
+ {
+ /* set 5-levels gray palette */
+ raster->grays[0] = palette[0];
+ raster->grays[1] = palette[1];
+ raster->grays[2] = palette[2];
+ raster->grays[3] = palette[3];
+ raster->grays[4] = palette[4];
+ }
+
+#else
+
+ FT_UNUSED( raster );
+ FT_UNUSED( mode );
+ FT_UNUSED( palette );
+
+#endif
+ }
+
+
+ static int
+ ft_black_render( black_PRaster raster,
+ const FT_Raster_Params* params )
+ {
+ const FT_Outline* outline = (const FT_Outline*)params->source;
+ const FT_Bitmap* target_map = params->target;
+ black_PWorker worker;
+
+
+ if ( !raster || !raster->buffer || !raster->buffer_size )
+ return FT_THROW( Not_Ini );
+
+ if ( !outline )
+ return FT_THROW( Invalid );
+
+ /* return immediately if the outline is empty */
+ if ( outline->n_points == 0 || outline->n_contours <= 0 )
+ return Raster_Err_None;
+
+ if ( !outline->contours || !outline->points )
+ return FT_THROW( Invalid );
+
+ if ( outline->n_points !=
+ outline->contours[outline->n_contours - 1] + 1 )
+ return FT_THROW( Invalid );
+
+ worker = raster->worker;
+
+ /* this version of the raster does not support direct rendering, sorry */
+ if ( params->flags & FT_RASTER_FLAG_DIRECT )
+ return FT_THROW( Unsupported );
+
+ if ( !target_map )
+ return FT_THROW( Invalid );
+
+ /* nothing to do */
+ if ( !target_map->width || !target_map->rows )
+ return Raster_Err_None;
+
+ if ( !target_map->buffer )
+ return FT_THROW( Invalid );
+
+ ras.outline = *outline;
+ ras.target = *target_map;
+
+ worker->buff = (PLong) raster->buffer;
+ worker->sizeBuff = worker->buff +
+ raster->buffer_size / sizeof ( Long );
+#ifdef FT_RASTER_OPTION_ANTI_ALIASING
+ worker->grays = raster->grays;
+ worker->gray_width = raster->gray_width;
+
+ FT_MEM_ZERO( worker->gray_lines, worker->gray_width * 2 );
+#endif
+
+ return ( params->flags & FT_RASTER_FLAG_AA )
+ ? Render_Gray_Glyph( RAS_VAR )
+ : Render_Glyph( RAS_VAR );
+ }
+
+
+ FT_DEFINE_RASTER_FUNCS( ft_standard_raster,
+ FT_GLYPH_FORMAT_OUTLINE,
+ (FT_Raster_New_Func) ft_black_new,
+ (FT_Raster_Reset_Func) ft_black_reset,
+ (FT_Raster_Set_Mode_Func)ft_black_set_mode,
+ (FT_Raster_Render_Func) ft_black_render,
+ (FT_Raster_Done_Func) ft_black_done
+ )
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/ftraster.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/ftraster.h
new file mode 100644
index 0000000000..b77260f7d2
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/ftraster.h
@@ -0,0 +1,46 @@
+/***************************************************************************/
+/* */
+/* ftraster.h */
+/* */
+/* The FreeType glyph rasterizer (specification). */
+/* */
+/* Copyright 1996-2001 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used */
+/* modified and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTRASTER_H__
+#define __FTRASTER_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/config/ftconfig.h"
+#include "../../include/freetype/ftimage.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* Uncomment the following line if you are using ftraster.c as a */
+ /* standalone module, fully independent of FreeType. */
+ /* */
+/* #define _STANDALONE_ */
+
+ FT_EXPORT_VAR( const FT_Raster_Funcs ) ft_standard_raster;
+
+
+FT_END_HEADER
+
+#endif /* __FTRASTER_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/ftrend1.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/ftrend1.c
new file mode 100644
index 0000000000..0f4ffabf97
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/ftrend1.c
@@ -0,0 +1,306 @@
+/***************************************************************************/
+/* */
+/* ftrend1.c */
+/* */
+/* The FreeType glyph rasterizer interface (body). */
+/* */
+/* Copyright 1996-2003, 2005, 2006, 2011, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/ftoutln.h"
+#include "ftrend1.h"
+#include "ftraster.h"
+#include "rastpic.h"
+
+#include "rasterrs.h"
+
+
+ /* initialize renderer -- init its raster */
+ static FT_Error
+ ft_raster1_init( FT_Renderer render )
+ {
+ FT_Library library = FT_MODULE_LIBRARY( render );
+
+
+ render->clazz->raster_class->raster_reset( render->raster,
+ library->raster_pool,
+ library->raster_pool_size );
+
+ return FT_Err_Ok;
+ }
+
+
+ /* set render-specific mode */
+ static FT_Error
+ ft_raster1_set_mode( FT_Renderer render,
+ FT_ULong mode_tag,
+ FT_Pointer data )
+ {
+ /* we simply pass it to the raster */
+ return render->clazz->raster_class->raster_set_mode( render->raster,
+ mode_tag,
+ data );
+ }
+
+
+ /* transform a given glyph image */
+ static FT_Error
+ ft_raster1_transform( FT_Renderer render,
+ FT_GlyphSlot slot,
+ const FT_Matrix* matrix,
+ const FT_Vector* delta )
+ {
+ FT_Error error = FT_Err_Ok;
+
+
+ if ( slot->format != render->glyph_format )
+ {
+ error = FT_THROW( Invalid_Argument );
+ goto Exit;
+ }
+
+ if ( matrix )
+ FT_Outline_Transform( &slot->outline, matrix );
+
+ if ( delta )
+ FT_Outline_Translate( &slot->outline, delta->x, delta->y );
+
+ Exit:
+ return error;
+ }
+
+
+ /* return the glyph's control box */
+ static void
+ ft_raster1_get_cbox( FT_Renderer render,
+ FT_GlyphSlot slot,
+ FT_BBox* cbox )
+ {
+ FT_MEM_ZERO( cbox, sizeof ( *cbox ) );
+
+ if ( slot->format == render->glyph_format )
+ FT_Outline_Get_CBox( &slot->outline, cbox );
+ }
+
+
+ /* convert a slot's glyph image into a bitmap */
+ static FT_Error
+ ft_raster1_render( FT_Renderer render,
+ FT_GlyphSlot slot,
+ FT_Render_Mode mode,
+ const FT_Vector* origin )
+ {
+ FT_Error error;
+ FT_Outline* outline;
+ FT_BBox cbox;
+ FT_UInt width, height, pitch;
+ FT_Bitmap* bitmap;
+ FT_Memory memory;
+
+ FT_Raster_Params params;
+
+
+ /* check glyph image format */
+ if ( slot->format != render->glyph_format )
+ {
+ error = FT_THROW( Invalid_Argument );
+ goto Exit;
+ }
+
+ /* check rendering mode */
+#ifndef FT_CONFIG_OPTION_PIC
+ if ( mode != FT_RENDER_MODE_MONO )
+ {
+ /* raster1 is only capable of producing monochrome bitmaps */
+ if ( render->clazz == &ft_raster1_renderer_class )
+ return FT_THROW( Cannot_Render_Glyph );
+ }
+ else
+ {
+ /* raster5 is only capable of producing 5-gray-levels bitmaps */
+ if ( render->clazz == &ft_raster5_renderer_class )
+ return FT_THROW( Cannot_Render_Glyph );
+ }
+#else /* FT_CONFIG_OPTION_PIC */
+ /* When PIC is enabled, we cannot get to the class object */
+ /* so instead we check the final character in the class name */
+ /* ("raster5" or "raster1"). Yes this is a hack. */
+ /* The "correct" thing to do is have different render function */
+ /* for each of the classes. */
+ if ( mode != FT_RENDER_MODE_MONO )
+ {
+ /* raster1 is only capable of producing monochrome bitmaps */
+ if ( render->clazz->root.module_name[6] == '1' )
+ return FT_THROW( Cannot_Render_Glyph );
+ }
+ else
+ {
+ /* raster5 is only capable of producing 5-gray-levels bitmaps */
+ if ( render->clazz->root.module_name[6] == '5' )
+ return FT_THROW( Cannot_Render_Glyph );
+ }
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ outline = &slot->outline;
+
+ /* translate the outline to the new origin if needed */
+ if ( origin )
+ FT_Outline_Translate( outline, origin->x, origin->y );
+
+ /* compute the control box, and grid fit it */
+ FT_Outline_Get_CBox( outline, &cbox );
+
+ /* undocumented but confirmed: bbox values get rounded */
+#if 1
+ cbox.xMin = FT_PIX_ROUND( cbox.xMin );
+ cbox.yMin = FT_PIX_ROUND( cbox.yMin );
+ cbox.xMax = FT_PIX_ROUND( cbox.xMax );
+ cbox.yMax = FT_PIX_ROUND( cbox.yMax );
+#else
+ cbox.xMin = FT_PIX_FLOOR( cbox.xMin );
+ cbox.yMin = FT_PIX_FLOOR( cbox.yMin );
+ cbox.xMax = FT_PIX_CEIL( cbox.xMax );
+ cbox.yMax = FT_PIX_CEIL( cbox.yMax );
+#endif
+
+ width = (FT_UInt)( ( cbox.xMax - cbox.xMin ) >> 6 );
+ height = (FT_UInt)( ( cbox.yMax - cbox.yMin ) >> 6 );
+
+ if ( width > FT_USHORT_MAX || height > FT_USHORT_MAX )
+ {
+ error = FT_THROW( Invalid_Argument );
+ goto Exit;
+ }
+
+ bitmap = &slot->bitmap;
+ memory = render->root.memory;
+
+ /* release old bitmap buffer */
+ if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP )
+ {
+ FT_FREE( bitmap->buffer );
+ slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP;
+ }
+
+ /* allocate new one, depends on pixel format */
+ if ( !( mode & FT_RENDER_MODE_MONO ) )
+ {
+ /* we pad to 32 bits, only for backwards compatibility with FT 1.x */
+ pitch = FT_PAD_CEIL( width, 4 );
+ bitmap->pixel_mode = FT_PIXEL_MODE_GRAY;
+ bitmap->num_grays = 256;
+ }
+ else
+ {
+ pitch = ( ( width + 15 ) >> 4 ) << 1;
+ bitmap->pixel_mode = FT_PIXEL_MODE_MONO;
+ }
+
+ bitmap->width = width;
+ bitmap->rows = height;
+ bitmap->pitch = pitch;
+
+ if ( FT_ALLOC_MULT( bitmap->buffer, pitch, height ) )
+ goto Exit;
+
+ slot->internal->flags |= FT_GLYPH_OWN_BITMAP;
+
+ /* translate outline to render it into the bitmap */
+ FT_Outline_Translate( outline, -cbox.xMin, -cbox.yMin );
+
+ /* set up parameters */
+ params.target = bitmap;
+ params.source = outline;
+ params.flags = 0;
+
+ if ( bitmap->pixel_mode == FT_PIXEL_MODE_GRAY )
+ params.flags |= FT_RASTER_FLAG_AA;
+
+ /* render outline into the bitmap */
+ error = render->raster_render( render->raster, &params );
+
+ FT_Outline_Translate( outline, cbox.xMin, cbox.yMin );
+
+ if ( error )
+ goto Exit;
+
+ slot->format = FT_GLYPH_FORMAT_BITMAP;
+ slot->bitmap_left = (FT_Int)( cbox.xMin >> 6 );
+ slot->bitmap_top = (FT_Int)( cbox.yMax >> 6 );
+
+ Exit:
+ return error;
+ }
+
+
+ FT_DEFINE_RENDERER( ft_raster1_renderer_class,
+
+ FT_MODULE_RENDERER,
+ sizeof ( FT_RendererRec ),
+
+ "raster1",
+ 0x10000L,
+ 0x20000L,
+
+ 0, /* module specific interface */
+
+ (FT_Module_Constructor)ft_raster1_init,
+ (FT_Module_Destructor) 0,
+ (FT_Module_Requester) 0
+ ,
+
+ FT_GLYPH_FORMAT_OUTLINE,
+
+ (FT_Renderer_RenderFunc) ft_raster1_render,
+ (FT_Renderer_TransformFunc)ft_raster1_transform,
+ (FT_Renderer_GetCBoxFunc) ft_raster1_get_cbox,
+ (FT_Renderer_SetModeFunc) ft_raster1_set_mode,
+
+ (FT_Raster_Funcs*) &FT_STANDARD_RASTER_GET
+ )
+
+
+ /* This renderer is _NOT_ part of the default modules; you will need */
+ /* to register it by hand in your application. It should only be */
+ /* used for backwards-compatibility with FT 1.x anyway. */
+ /* */
+ FT_DEFINE_RENDERER( ft_raster5_renderer_class,
+
+ FT_MODULE_RENDERER,
+ sizeof ( FT_RendererRec ),
+
+ "raster5",
+ 0x10000L,
+ 0x20000L,
+
+ 0, /* module specific interface */
+
+ (FT_Module_Constructor)ft_raster1_init,
+ (FT_Module_Destructor) 0,
+ (FT_Module_Requester) 0
+ ,
+
+ FT_GLYPH_FORMAT_OUTLINE,
+
+ (FT_Renderer_RenderFunc) ft_raster1_render,
+ (FT_Renderer_TransformFunc)ft_raster1_transform,
+ (FT_Renderer_GetCBoxFunc) ft_raster1_get_cbox,
+ (FT_Renderer_SetModeFunc) ft_raster1_set_mode,
+
+ (FT_Raster_Funcs*) &FT_STANDARD_RASTER_GET
+ )
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/ftrend1.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/ftrend1.h
new file mode 100644
index 0000000000..9767e120ad
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/ftrend1.h
@@ -0,0 +1,44 @@
+/***************************************************************************/
+/* */
+/* ftrend1.h */
+/* */
+/* The FreeType glyph rasterizer interface (specification). */
+/* */
+/* Copyright 1996-2001 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTREND1_H__
+#define __FTREND1_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/ftrender.h"
+
+
+FT_BEGIN_HEADER
+
+
+ FT_DECLARE_RENDERER( ft_raster1_renderer_class )
+
+ /* this renderer is _NOT_ part of the default modules, you'll need */
+ /* to register it by hand in your application. It should only be */
+ /* used for backwards-compatibility with FT 1.x anyway. */
+ /* */
+ FT_DECLARE_RENDERER( ft_raster5_renderer_class )
+
+
+FT_END_HEADER
+
+#endif /* __FTREND1_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/fxft_raster.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/fxft_raster.c
new file mode 100644
index 0000000000..231e12fe3c
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/fxft_raster.c
@@ -0,0 +1,35 @@
+#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501
+/***************************************************************************/
+/* */
+/* raster.c */
+/* */
+/* FreeType monochrome rasterer module component (body only). */
+/* */
+/* Copyright 1996-2001 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#define FT_MAKE_OPTION_SINGLE_OBJECT
+#define FT2_BUILD_LIBRARY
+
+#include "../../include/ft2build.h"
+#include "rastpic.c"
+#ifdef _FX_MANAGED_CODE_
+#define TWorker_ TWorker_raster
+#define TRaster_ TRaster_raster
+#endif
+#include "ftraster.c"
+#include "ftrend1.c"
+
+
+/* END */
+#endif
+
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/module.mk b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/module.mk
new file mode 100644
index 0000000000..cbff5df96e
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/module.mk
@@ -0,0 +1,23 @@
+#
+# FreeType 2 renderer module definition
+#
+
+
+# Copyright 1996-2000, 2006 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT. By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+
+FTMODULE_H_COMMANDS += RASTER_MODULE
+
+define RASTER_MODULE
+$(OPEN_DRIVER) FT_Renderer_Class, ft_raster1_renderer_class $(CLOSE_DRIVER)
+$(ECHO_DRIVER)raster $(ECHO_DRIVER_DESC)monochrome bitmap renderer$(ECHO_DRIVER_DONE)
+endef
+
+# EOF
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/rasterrs.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/rasterrs.h
new file mode 100644
index 0000000000..86d13d25cc
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/rasterrs.h
@@ -0,0 +1,42 @@
+/***************************************************************************/
+/* */
+/* rasterrs.h */
+/* */
+/* monochrome renderer error codes (specification only). */
+/* */
+/* Copyright 2001, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* This file is used to define the monochrome renderer error enumeration */
+ /* constants. */
+ /* */
+ /*************************************************************************/
+
+#ifndef __RASTERRS_H__
+#define __RASTERRS_H__
+
+#include "../../include/freetype/ftmoderr.h"
+
+#undef __FTERRORS_H__
+
+#undef FT_ERR_PREFIX
+#define FT_ERR_PREFIX Raster_Err_
+#define FT_ERR_BASE FT_Mod_Err_Raster
+
+#include "../../include/freetype/fterrors.h"
+
+#endif /* __RASTERRS_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/rastpic.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/rastpic.c
new file mode 100644
index 0000000000..a749b941e0
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/rastpic.c
@@ -0,0 +1,103 @@
+/***************************************************************************/
+/* */
+/* rastpic.c */
+/* */
+/* The FreeType position independent code services for raster module. */
+/* */
+/* Copyright 2009, 2010, 2012, 2013 by */
+/* Oran Agra and Mickey Gabel. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/freetype.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "rastpic.h"
+#include "rasterrs.h"
+
+
+#ifdef FT_CONFIG_OPTION_PIC
+
+ /* forward declaration of PIC init functions from ftraster.c */
+ void
+ FT_Init_Class_ft_standard_raster( FT_Raster_Funcs* funcs );
+
+
+ void
+ ft_raster1_renderer_class_pic_free( FT_Library library )
+ {
+ FT_PIC_Container* pic_container = &library->pic_container;
+ FT_Memory memory = library->memory;
+
+
+ if ( pic_container->raster )
+ {
+ RasterPIC* container = (RasterPIC*)pic_container->raster;
+
+
+ if ( --container->ref_count )
+ return;
+ FT_FREE( container );
+ pic_container->raster = NULL;
+ }
+ }
+
+
+ FT_Error
+ ft_raster1_renderer_class_pic_init( FT_Library library )
+ {
+ FT_PIC_Container* pic_container = &library->pic_container;
+ FT_Error error = FT_Err_Ok;
+ RasterPIC* container = NULL;
+ FT_Memory memory = library->memory;
+
+
+ /* since this function also serves raster5 renderer, */
+ /* it implements reference counting */
+ if ( pic_container->raster )
+ {
+ ((RasterPIC*)pic_container->raster)->ref_count++;
+ return error;
+ }
+
+ /* allocate pointer, clear and set global container pointer */
+ if ( FT_ALLOC( container, sizeof ( *container ) ) )
+ return error;
+ FT_MEM_SET( container, 0, sizeof ( *container ) );
+ pic_container->raster = container;
+
+ container->ref_count = 1;
+
+ /* initialize pointer table - */
+ /* this is how the module usually expects this data */
+ FT_Init_Class_ft_standard_raster( &container->ft_standard_raster );
+
+ return error;
+ }
+
+
+ /* re-route these init and free functions to the above functions */
+ FT_Error
+ ft_raster5_renderer_class_pic_init( FT_Library library )
+ {
+ return ft_raster1_renderer_class_pic_init( library );
+ }
+
+
+ void
+ ft_raster5_renderer_class_pic_free( FT_Library library )
+ {
+ ft_raster1_renderer_class_pic_free( library );
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/rastpic.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/rastpic.h
new file mode 100644
index 0000000000..bba362fa7b
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/rastpic.h
@@ -0,0 +1,69 @@
+/***************************************************************************/
+/* */
+/* rastpic.h */
+/* */
+/* The FreeType position independent code services for raster module. */
+/* */
+/* Copyright 2009 by */
+/* Oran Agra and Mickey Gabel. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __RASTPIC_H__
+#define __RASTPIC_H__
+
+
+FT_BEGIN_HEADER
+
+#include "../../include/freetype/internal/ftpic.h"
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_STANDARD_RASTER_GET ft_standard_raster
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+ typedef struct RasterPIC_
+ {
+ int ref_count;
+ FT_Raster_Funcs ft_standard_raster;
+
+ } RasterPIC;
+
+
+#define GET_PIC( lib ) \
+ ( (RasterPIC*)( (lib)->pic_container.raster ) )
+#define FT_STANDARD_RASTER_GET ( GET_PIC( library )->ft_standard_raster )
+
+
+ /* see rastpic.c for the implementation */
+ void
+ ft_raster1_renderer_class_pic_free( FT_Library library );
+
+ void
+ ft_raster5_renderer_class_pic_free( FT_Library library );
+
+ FT_Error
+ ft_raster1_renderer_class_pic_init( FT_Library library );
+
+ FT_Error
+ ft_raster5_renderer_class_pic_init( FT_Library library );
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __RASTPIC_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/rules.mk b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/rules.mk
new file mode 100644
index 0000000000..0e0b5e4ebd
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/raster/rules.mk
@@ -0,0 +1,70 @@
+#
+# FreeType 2 renderer module build rules
+#
+
+
+# Copyright 1996-2000, 2001, 2003, 2008, 2009, 2011 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT. By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+
+# raster driver directory
+#
+RASTER_DIR := $(SRC_DIR)/raster
+
+# compilation flags for the driver
+#
+RASTER_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(RASTER_DIR))
+
+
+# raster driver sources (i.e., C files)
+#
+RASTER_DRV_SRC := $(RASTER_DIR)/ftraster.c \
+ $(RASTER_DIR)/ftrend1.c \
+ $(RASTER_DIR)/rastpic.c
+
+
+# raster driver headers
+#
+RASTER_DRV_H := $(RASTER_DRV_SRC:%.c=%.h) \
+ $(RASTER_DIR)/rasterrs.h
+
+
+# raster driver object(s)
+#
+# RASTER_DRV_OBJ_M is used during `multi' builds.
+# RASTER_DRV_OBJ_S is used during `single' builds.
+#
+RASTER_DRV_OBJ_M := $(RASTER_DRV_SRC:$(RASTER_DIR)/%.c=$(OBJ_DIR)/%.$O)
+RASTER_DRV_OBJ_S := $(OBJ_DIR)/raster.$O
+
+# raster driver source file for single build
+#
+RASTER_DRV_SRC_S := $(RASTER_DIR)/raster.c
+
+
+# raster driver - single object
+#
+$(RASTER_DRV_OBJ_S): $(RASTER_DRV_SRC_S) $(RASTER_DRV_SRC) \
+ $(FREETYPE_H) $(RASTER_DRV_H)
+ $(RASTER_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(RASTER_DRV_SRC_S))
+
+
+# raster driver - multiple objects
+#
+$(OBJ_DIR)/%.$O: $(RASTER_DIR)/%.c $(FREETYPE_H) $(RASTER_DRV_H)
+ $(RASTER_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)
+
+
+# update main driver object lists
+#
+DRV_OBJS_S += $(RASTER_DRV_OBJ_S)
+DRV_OBJS_M += $(RASTER_DRV_OBJ_M)
+
+
+# EOF
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/Jamfile b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/Jamfile
new file mode 100644
index 0000000000..cb20b1b04b
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/Jamfile
@@ -0,0 +1,29 @@
+# FreeType 2 src/sfnt Jamfile
+#
+# Copyright 2001, 2002, 2004, 2005 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT. By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+SubDir FT2_TOP $(FT2_SRC_DIR) sfnt ;
+
+{
+ local _sources ;
+
+ if $(FT2_MULTI)
+ {
+ _sources = sfobjs sfdriver ttcmap ttmtx ttpost ttload ttsbit ttkern ttbdf sfntpic ;
+ }
+ else
+ {
+ _sources = sfnt ;
+ }
+
+ Library $(FT2_LIB) : $(_sources).c ;
+}
+
+# end of src/sfnt Jamfile
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/fxft_sfnt.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/fxft_sfnt.c
new file mode 100644
index 0000000000..d0c6ba4765
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/fxft_sfnt.c
@@ -0,0 +1,47 @@
+#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501
+/***************************************************************************/
+/* */
+/* sfnt.c */
+/* */
+/* Single object library component. */
+/* */
+/* Copyright 1996-2006, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#define FT_MAKE_OPTION_SINGLE_OBJECT
+#define FT2_BUILD_LIBRARY
+
+#include "../../include/ft2build.h"
+#include "sfntpic.c"
+#include "ttload.c"
+#include "ttmtx.c"
+#include "ttcmap.c"
+#include "ttkern.c"
+#include "sfobjs.c"
+#include "sfdriver.c"
+
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+#include "pngshim.c"
+#include "ttsbit.c"
+#endif
+
+#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES
+#include "ttpost.c"
+#endif
+
+#ifdef TT_CONFIG_OPTION_BDF
+#include "ttbdf.c"
+#endif
+
+/* END */
+#endif
+
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/module.mk b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/module.mk
new file mode 100644
index 0000000000..95fd6a3143
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/module.mk
@@ -0,0 +1,23 @@
+#
+# FreeType 2 SFNT module definition
+#
+
+
+# Copyright 1996-2000, 2006 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT. By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+
+FTMODULE_H_COMMANDS += SFNT_MODULE
+
+define SFNT_MODULE
+$(OPEN_DRIVER) FT_Module_Class, sfnt_module_class $(CLOSE_DRIVER)
+$(ECHO_DRIVER)sfnt $(ECHO_DRIVER_DESC)helper module for TrueType & OpenType formats$(ECHO_DRIVER_DONE)
+endef
+
+# EOF
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/pngshim.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/pngshim.c
new file mode 100644
index 0000000000..a1478c613e
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/pngshim.c
@@ -0,0 +1,336 @@
+/***************************************************************************/
+/* */
+/* pngshim.c */
+/* */
+/* PNG Bitmap glyph support. */
+/* */
+/* Copyright 2013 by Google, Inc. */
+/* Written by Stuart Gill and Behdad Esfahbod. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/tttags.h"
+#include "../../include/freetype/config/ftstdlib.h"
+
+
+#ifdef FT_CONFIG_OPTION_USE_PNG
+
+ /* We always include <stjmp.h>, so make libpng shut up! */
+#define PNG_SKIP_SETJMP_CHECK 1
+#include <png.h>
+#include "pngshim.h"
+
+#include "sferrors.h"
+
+
+ /* This code is freely based on cairo-png.c. There's so many ways */
+ /* to call libpng, and the way cairo does it is defacto standard. */
+
+ static int
+ multiply_alpha( int alpha,
+ int color )
+ {
+ int temp = ( alpha * color ) + 0x80;
+
+
+ return ( temp + ( temp >> 8 ) ) >> 8;
+ }
+
+
+ /* Premultiplies data and converts RGBA bytes => native endian. */
+ static void
+ premultiply_data( png_structp png,
+ png_row_infop row_info,
+ png_bytep data )
+ {
+ unsigned int i;
+
+ FT_UNUSED( png );
+
+
+ for ( i = 0; i < row_info->rowbytes; i += 4 )
+ {
+ unsigned char* base = &data[i];
+ unsigned int alpha = base[3];
+
+
+ if ( alpha == 0 )
+ base[0] = base[1] = base[2] = base[3] = 0;
+
+ else
+ {
+ unsigned int red = base[0];
+ unsigned int green = base[1];
+ unsigned int blue = base[2];
+
+
+ if ( alpha != 0xFF )
+ {
+ red = multiply_alpha( alpha, red );
+ green = multiply_alpha( alpha, green );
+ blue = multiply_alpha( alpha, blue );
+ }
+
+ base[0] = blue;
+ base[1] = green;
+ base[2] = red;
+ base[3] = alpha;
+ }
+ }
+ }
+
+
+ /* Converts RGBx bytes to BGRA. */
+ static void
+ convert_bytes_to_data( png_structp png,
+ png_row_infop row_info,
+ png_bytep data )
+ {
+ unsigned int i;
+
+ FT_UNUSED( png );
+
+
+ for ( i = 0; i < row_info->rowbytes; i += 4 )
+ {
+ unsigned char* base = &data[i];
+ unsigned int red = base[0];
+ unsigned int green = base[1];
+ unsigned int blue = base[2];
+
+
+ base[0] = blue;
+ base[1] = green;
+ base[2] = red;
+ base[3] = 0xFF;
+ }
+ }
+
+
+ /* Use error callback to avoid png writing to stderr. */
+ static void
+ error_callback( png_structp png,
+ png_const_charp error_msg )
+ {
+ FT_Error* error = png_get_error_ptr( png );
+
+ FT_UNUSED( error_msg );
+
+
+ *error = FT_THROW( Out_Of_Memory );
+#ifdef PNG_SETJMP_SUPPORTED
+ longjmp( png_jmpbuf( png ), 1 );
+#endif
+ /* if we get here, then we have no choice but to abort ... */
+ }
+
+
+ /* Use warning callback to avoid png writing to stderr. */
+ static void
+ warning_callback( png_structp png,
+ png_const_charp error_msg )
+ {
+ FT_UNUSED( png );
+ FT_UNUSED( error_msg );
+
+ /* Just ignore warnings. */
+ }
+
+
+ static void
+ read_data_from_FT_Stream( png_structp png,
+ png_bytep data,
+ png_size_t length )
+ {
+ FT_Error error;
+ png_voidp p = png_get_io_ptr( png );
+ FT_Stream stream = (FT_Stream)p;
+
+
+ if ( FT_FRAME_ENTER( length ) )
+ {
+ FT_Error* e = png_get_error_ptr( png );
+
+
+ *e = FT_THROW( Invalid_Stream_Read );
+ png_error( png, NULL );
+
+ return;
+ }
+
+ memcpy( data, stream->cursor, length );
+
+ FT_FRAME_EXIT();
+ }
+
+
+ static FT_Error
+ Load_SBit_Png( FT_Bitmap* map,
+ FT_Int x_offset,
+ FT_Int y_offset,
+ FT_Int pix_bits,
+ TT_SBit_Metrics metrics,
+ FT_Memory memory,
+ FT_Byte* data,
+ FT_UInt png_len )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_StreamRec stream;
+
+ png_structp png;
+ png_infop info;
+ png_uint_32 imgWidth, imgHeight;
+
+ int bitdepth, color_type, interlace;
+ FT_Int i;
+ png_byte* *rows;
+
+
+ if ( x_offset < 0 || x_offset + metrics->width > map->width ||
+ y_offset < 0 || y_offset + metrics->height > map->rows ||
+ pix_bits != 32 || map->pixel_mode != FT_PIXEL_MODE_BGRA )
+ {
+ error = FT_THROW( Invalid_Argument );
+ goto Exit;
+ }
+
+ FT_Stream_OpenMemory( &stream, data, png_len );
+
+ png = png_create_read_struct( PNG_LIBPNG_VER_STRING,
+ &error,
+ error_callback,
+ warning_callback );
+ if ( !png )
+ {
+ error = FT_THROW( Out_Of_Memory );
+ goto Exit;
+ }
+
+ info = png_create_info_struct( png );
+ if ( !info )
+ {
+ error = FT_THROW( Out_Of_Memory );
+ png_destroy_read_struct( &png, NULL, NULL );
+ goto Exit;
+ }
+
+ if ( ft_setjmp( png_jmpbuf( png ) ) )
+ {
+ error = FT_THROW( Invalid_File_Format );
+ goto DestroyExit;
+ }
+
+ png_set_read_fn( png, &stream, read_data_from_FT_Stream );
+
+ png_read_info( png, info );
+ png_get_IHDR( png, info,
+ &imgWidth, &imgHeight,
+ &bitdepth, &color_type, &interlace,
+ NULL, NULL );
+
+ if ( error != FT_Err_Ok ||
+ (FT_Int)imgWidth != metrics->width ||
+ (FT_Int)imgHeight != metrics->height )
+ goto DestroyExit;
+
+ /* convert palette/gray image to rgb */
+ if ( color_type == PNG_COLOR_TYPE_PALETTE )
+ png_set_palette_to_rgb( png );
+
+ /* expand gray bit depth if needed */
+ if ( color_type == PNG_COLOR_TYPE_GRAY )
+ {
+#if PNG_LIBPNG_VER >= 10209
+ png_set_expand_gray_1_2_4_to_8( png );
+#else
+ png_set_gray_1_2_4_to_8( png );
+#endif
+ }
+
+ /* transform transparency to alpha */
+ if ( png_get_valid(png, info, PNG_INFO_tRNS ) )
+ png_set_tRNS_to_alpha( png );
+
+ if ( bitdepth == 16 )
+ png_set_strip_16( png );
+
+ if ( bitdepth < 8 )
+ png_set_packing( png );
+
+ /* convert grayscale to RGB */
+ if ( color_type == PNG_COLOR_TYPE_GRAY ||
+ color_type == PNG_COLOR_TYPE_GRAY_ALPHA )
+ png_set_gray_to_rgb( png );
+
+ if ( interlace != PNG_INTERLACE_NONE )
+ png_set_interlace_handling( png );
+
+ png_set_filler( png, 0xFF, PNG_FILLER_AFTER );
+
+ /* recheck header after setting EXPAND options */
+ png_read_update_info(png, info );
+ png_get_IHDR( png, info,
+ &imgWidth, &imgHeight,
+ &bitdepth, &color_type, &interlace,
+ NULL, NULL );
+
+ if ( bitdepth != 8 ||
+ !( color_type == PNG_COLOR_TYPE_RGB ||
+ color_type == PNG_COLOR_TYPE_RGB_ALPHA ) )
+ {
+ error = FT_THROW( Invalid_File_Format );
+ goto DestroyExit;
+ }
+
+ switch ( color_type )
+ {
+ default:
+ /* Shouldn't happen, but fall through. */
+
+ case PNG_COLOR_TYPE_RGB_ALPHA:
+ png_set_read_user_transform_fn( png, premultiply_data );
+ break;
+
+ case PNG_COLOR_TYPE_RGB:
+ /* Humm, this smells. Carry on though. */
+ png_set_read_user_transform_fn( png, convert_bytes_to_data );
+ break;
+ }
+
+ if ( FT_NEW_ARRAY( rows, imgHeight ) )
+ {
+ error = FT_THROW( Out_Of_Memory );
+ goto DestroyExit;
+ }
+
+ for ( i = 0; i < (FT_Int)imgHeight; i++ )
+ rows[i] = map->buffer + ( y_offset + i ) * map->pitch + x_offset * 4;
+
+ png_read_image( png, rows );
+
+ FT_FREE( rows );
+
+ png_read_end( png, info );
+
+ DestroyExit:
+ png_destroy_read_struct( &png, &info, NULL );
+ FT_Stream_Close( &stream );
+
+ Exit:
+ return error;
+ }
+
+#endif /* FT_CONFIG_OPTION_USE_PNG */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/pngshim.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/pngshim.h
new file mode 100644
index 0000000000..a25086b157
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/pngshim.h
@@ -0,0 +1,48 @@
+/***************************************************************************/
+/* */
+/* pngshim.h */
+/* */
+/* PNG Bitmap glyph support. */
+/* */
+/* Copyright 2013 by Google, Inc. */
+/* Written by Stuart Gill and Behdad Esfahbod. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __PNGSHIM_H__
+#define __PNGSHIM_H__
+
+
+#include "../../include/ft2build.h"
+#include "ttload.h"
+
+
+FT_BEGIN_HEADER
+
+#ifdef FT_CONFIG_OPTION_USE_PNG
+
+ FT_LOCAL( FT_Error )
+ Load_SBit_Png( FT_Bitmap* map,
+ FT_Int x_offset,
+ FT_Int y_offset,
+ FT_Int pix_bits,
+ TT_SBit_Metrics metrics,
+ FT_Memory memory,
+ FT_Byte* data,
+ FT_UInt png_len );
+
+#endif
+
+FT_END_HEADER
+
+#endif /* __PNGSHIM_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/rules.mk b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/rules.mk
new file mode 100644
index 0000000000..a6c956ab65
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/rules.mk
@@ -0,0 +1,78 @@
+#
+# FreeType 2 SFNT driver configuration rules
+#
+
+
+# Copyright 1996-2000, 2002-2007, 2009, 2011, 2013 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT. By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+
+# SFNT driver directory
+#
+SFNT_DIR := $(SRC_DIR)/sfnt
+
+
+# compilation flags for the driver
+#
+SFNT_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(SFNT_DIR))
+
+
+# SFNT driver sources (i.e., C files)
+#
+SFNT_DRV_SRC := $(SFNT_DIR)/ttload.c \
+ $(SFNT_DIR)/ttmtx.c \
+ $(SFNT_DIR)/ttcmap.c \
+ $(SFNT_DIR)/ttsbit.c \
+ $(SFNT_DIR)/ttpost.c \
+ $(SFNT_DIR)/ttkern.c \
+ $(SFNT_DIR)/ttbdf.c \
+ $(SFNT_DIR)/sfobjs.c \
+ $(SFNT_DIR)/sfdriver.c \
+ $(SFNT_DIR)/sfntpic.c \
+ $(SFNT_DIR)/pngshim.c
+
+# SFNT driver headers
+#
+SFNT_DRV_H := $(SFNT_DRV_SRC:%c=%h) \
+ $(SFNT_DIR)/sferrors.h
+
+
+# SFNT driver object(s)
+#
+# SFNT_DRV_OBJ_M is used during `multi' builds.
+# SFNT_DRV_OBJ_S is used during `single' builds.
+#
+SFNT_DRV_OBJ_M := $(SFNT_DRV_SRC:$(SFNT_DIR)/%.c=$(OBJ_DIR)/%.$O)
+SFNT_DRV_OBJ_S := $(OBJ_DIR)/sfnt.$O
+
+# SFNT driver source file for single build
+#
+SFNT_DRV_SRC_S := $(SFNT_DIR)/sfnt.c
+
+
+# SFNT driver - single object
+#
+$(SFNT_DRV_OBJ_S): $(SFNT_DRV_SRC_S) $(SFNT_DRV_SRC) \
+ $(FREETYPE_H) $(SFNT_DRV_H)
+ $(SFNT_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(SFNT_DRV_SRC_S))
+
+
+# SFNT driver - multiple objects
+#
+$(OBJ_DIR)/%.$O: $(SFNT_DIR)/%.c $(FREETYPE_H) $(SFNT_DRV_H)
+ $(SFNT_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)
+
+
+# update main driver object lists
+#
+DRV_OBJS_S += $(SFNT_DRV_OBJ_S)
+DRV_OBJS_M += $(SFNT_DRV_OBJ_M)
+
+
+# EOF
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfdriver.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfdriver.c
new file mode 100644
index 0000000000..175838348d
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfdriver.c
@@ -0,0 +1,529 @@
+/***************************************************************************/
+/* */
+/* sfdriver.c */
+/* */
+/* High-level SFNT driver interface (body). */
+/* */
+/* Copyright 1996-2007, 2009-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/sfnt.h"
+#include "../../include/freetype/internal/ftobjs.h"
+
+#include "sfdriver.h"
+#include "ttload.h"
+#include "sfobjs.h"
+#include "sfntpic.h"
+
+#include "sferrors.h"
+
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+#include "ttsbit.h"
+#endif
+
+#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES
+#include "ttpost.h"
+#endif
+
+#ifdef TT_CONFIG_OPTION_BDF
+#include "ttbdf.h"
+#include "../../include/freetype/internal/services/svbdf.h"
+#endif
+
+#include "ttcmap.h"
+#include "ttkern.h"
+#include "ttmtx.h"
+
+#include "../../include/freetype/internal/services/svgldict.h"
+#include "../../include/freetype/internal/services/svpostnm.h"
+#include "../../include/freetype/internal/services/svsfnt.h"
+#include "../../include/freetype/internal/services/svttcmap.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_sfdriver
+
+
+ /*
+ * SFNT TABLE SERVICE
+ *
+ */
+
+ static void*
+ get_sfnt_table( TT_Face face,
+ FT_Sfnt_Tag tag )
+ {
+ void* table;
+
+
+ switch ( tag )
+ {
+ case ft_sfnt_head:
+ table = &face->header;
+ break;
+
+ case ft_sfnt_hhea:
+ table = &face->horizontal;
+ break;
+
+ case ft_sfnt_vhea:
+ table = face->vertical_info ? &face->vertical : 0;
+ break;
+
+ case ft_sfnt_os2:
+ table = face->os2.version == 0xFFFFU ? 0 : &face->os2;
+ break;
+
+ case ft_sfnt_post:
+ table = &face->postscript;
+ break;
+
+ case ft_sfnt_maxp:
+ table = &face->max_profile;
+ break;
+
+ case ft_sfnt_pclt:
+ table = face->pclt.Version ? &face->pclt : 0;
+ break;
+
+ default:
+ table = 0;
+ }
+
+ return table;
+ }
+
+
+ static FT_Error
+ sfnt_table_info( TT_Face face,
+ FT_UInt idx,
+ FT_ULong *tag,
+ FT_ULong *offset,
+ FT_ULong *length )
+ {
+ if ( !offset || !length )
+ return FT_THROW( Invalid_Argument );
+
+ if ( !tag )
+ *length = face->num_tables;
+ else
+ {
+ if ( idx >= face->num_tables )
+ return FT_THROW( Table_Missing );
+
+ *tag = face->dir_tables[idx].Tag;
+ *offset = face->dir_tables[idx].Offset;
+ *length = face->dir_tables[idx].Length;
+ }
+
+ return FT_Err_Ok;
+ }
+
+
+ FT_DEFINE_SERVICE_SFNT_TABLEREC(
+ sfnt_service_sfnt_table,
+ (FT_SFNT_TableLoadFunc)tt_face_load_any,
+ (FT_SFNT_TableGetFunc) get_sfnt_table,
+ (FT_SFNT_TableInfoFunc)sfnt_table_info )
+
+
+#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES
+
+ /*
+ * GLYPH DICT SERVICE
+ *
+ */
+
+ static FT_Error
+ sfnt_get_glyph_name( TT_Face face,
+ FT_UInt glyph_index,
+ FT_Pointer buffer,
+ FT_UInt buffer_max )
+ {
+ FT_String* gname;
+ FT_Error error;
+
+
+ error = tt_face_get_ps_name( face, glyph_index, &gname );
+ if ( !error )
+ FT_STRCPYN( buffer, gname, buffer_max );
+
+ return error;
+ }
+
+
+ static FT_UInt
+ sfnt_get_name_index( TT_Face face,
+ FT_String* glyph_name )
+ {
+ FT_Face root = &face->root;
+
+ FT_UInt i, max_gid = FT_UINT_MAX;
+
+
+ if ( root->num_glyphs < 0 )
+ return 0;
+ else if ( (FT_ULong)root->num_glyphs < FT_UINT_MAX )
+ max_gid = (FT_UInt)root->num_glyphs;
+ else
+ FT_TRACE0(( "Ignore glyph names for invalid GID 0x%08x - 0x%08x\n",
+ FT_UINT_MAX, root->num_glyphs ));
+
+ for ( i = 0; i < max_gid; i++ )
+ {
+ FT_String* gname;
+ FT_Error error = tt_face_get_ps_name( face, i, &gname );
+
+
+ if ( error )
+ continue;
+
+ if ( !ft_strcmp( glyph_name, gname ) )
+ return i;
+ }
+
+ return 0;
+ }
+
+
+ FT_DEFINE_SERVICE_GLYPHDICTREC(
+ sfnt_service_glyph_dict,
+ (FT_GlyphDict_GetNameFunc) sfnt_get_glyph_name,
+ (FT_GlyphDict_NameIndexFunc)sfnt_get_name_index )
+
+
+#endif /* TT_CONFIG_OPTION_POSTSCRIPT_NAMES */
+
+
+ /*
+ * POSTSCRIPT NAME SERVICE
+ *
+ */
+
+ static const char*
+ sfnt_get_ps_name( TT_Face face )
+ {
+ FT_Int n, found_win, found_apple;
+ const char* result = NULL;
+
+
+ /* shouldn't happen, but just in case to avoid memory leaks */
+ if ( face->postscript_name )
+ return face->postscript_name;
+
+ /* scan the name table to see whether we have a Postscript name here, */
+ /* either in Macintosh or Windows platform encodings */
+ found_win = -1;
+ found_apple = -1;
+
+ for ( n = 0; n < face->num_names; n++ )
+ {
+ TT_NameEntryRec* name = face->name_table.names + n;
+
+
+ if ( name->nameID == 6 && name->stringLength > 0 )
+ {
+ if ( name->platformID == 3 &&
+ name->encodingID == 1 &&
+ name->languageID == 0x409 )
+ found_win = n;
+
+ if ( name->platformID == 1 &&
+ name->encodingID == 0 &&
+ name->languageID == 0 )
+ found_apple = n;
+ }
+ }
+
+ if ( found_win != -1 )
+ {
+ FT_Memory memory = face->root.memory;
+ TT_NameEntryRec* name = face->name_table.names + found_win;
+ FT_UInt len = name->stringLength / 2;
+ FT_Error error = FT_Err_Ok;
+
+ FT_UNUSED( error );
+
+
+ if ( !FT_ALLOC( result, name->stringLength + 1 ) )
+ {
+ FT_Stream stream = face->name_table.stream;
+ FT_String* r = (FT_String*)result;
+ FT_Byte* p = (FT_Byte*)name->string;
+
+
+ if ( FT_STREAM_SEEK( name->stringOffset ) ||
+ FT_FRAME_ENTER( name->stringLength ) )
+ {
+ FT_FREE( result );
+ name->stringLength = 0;
+ name->stringOffset = 0;
+ FT_FREE( name->string );
+
+ goto Exit;
+ }
+
+ p = (FT_Byte*)stream->cursor;
+
+ for ( ; len > 0; len--, p += 2 )
+ {
+ if ( p[0] == 0 && p[1] >= 32 && p[1] < 128 )
+ *r++ = p[1];
+ }
+ *r = '\0';
+
+ FT_FRAME_EXIT();
+ }
+ goto Exit;
+ }
+
+ if ( found_apple != -1 )
+ {
+ FT_Memory memory = face->root.memory;
+ TT_NameEntryRec* name = face->name_table.names + found_apple;
+ FT_UInt len = name->stringLength;
+ FT_Error error = FT_Err_Ok;
+
+ FT_UNUSED( error );
+
+
+ if ( !FT_ALLOC( result, len + 1 ) )
+ {
+ FT_Stream stream = face->name_table.stream;
+
+
+ if ( FT_STREAM_SEEK( name->stringOffset ) ||
+ FT_STREAM_READ( result, len ) )
+ {
+ name->stringOffset = 0;
+ name->stringLength = 0;
+ FT_FREE( name->string );
+ FT_FREE( result );
+ goto Exit;
+ }
+ ((char*)result)[len] = '\0';
+ }
+ }
+
+ Exit:
+ face->postscript_name = result;
+ return result;
+ }
+
+
+ FT_DEFINE_SERVICE_PSFONTNAMEREC(
+ sfnt_service_ps_name,
+ (FT_PsName_GetFunc)sfnt_get_ps_name )
+
+
+ /*
+ * TT CMAP INFO
+ */
+ FT_DEFINE_SERVICE_TTCMAPSREC(
+ tt_service_get_cmap_info,
+ (TT_CMap_Info_GetFunc)tt_get_cmap_info )
+
+
+#ifdef TT_CONFIG_OPTION_BDF
+
+ static FT_Error
+ sfnt_get_charset_id( TT_Face face,
+ const char* *acharset_encoding,
+ const char* *acharset_registry )
+ {
+ BDF_PropertyRec encoding, registry;
+ FT_Error error;
+
+
+ /* XXX: I don't know whether this is correct, since
+ * tt_face_find_bdf_prop only returns something correct if we have
+ * previously selected a size that is listed in the BDF table.
+ * Should we change the BDF table format to include single offsets
+ * for `CHARSET_REGISTRY' and `CHARSET_ENCODING'?
+ */
+ error = tt_face_find_bdf_prop( face, "CHARSET_REGISTRY", &registry );
+ if ( !error )
+ {
+ error = tt_face_find_bdf_prop( face, "CHARSET_ENCODING", &encoding );
+ if ( !error )
+ {
+ if ( registry.type == BDF_PROPERTY_TYPE_ATOM &&
+ encoding.type == BDF_PROPERTY_TYPE_ATOM )
+ {
+ *acharset_encoding = encoding.u.atom;
+ *acharset_registry = registry.u.atom;
+ }
+ else
+ error = FT_THROW( Invalid_Argument );
+ }
+ }
+
+ return error;
+ }
+
+
+ FT_DEFINE_SERVICE_BDFRec(
+ sfnt_service_bdf,
+ (FT_BDF_GetCharsetIdFunc)sfnt_get_charset_id,
+ (FT_BDF_GetPropertyFunc) tt_face_find_bdf_prop )
+
+
+#endif /* TT_CONFIG_OPTION_BDF */
+
+
+ /*
+ * SERVICE LIST
+ */
+
+#if defined TT_CONFIG_OPTION_POSTSCRIPT_NAMES && defined TT_CONFIG_OPTION_BDF
+ FT_DEFINE_SERVICEDESCREC5(
+ sfnt_services,
+ FT_SERVICE_ID_SFNT_TABLE, &SFNT_SERVICE_SFNT_TABLE_GET,
+ FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &SFNT_SERVICE_PS_NAME_GET,
+ FT_SERVICE_ID_GLYPH_DICT, &SFNT_SERVICE_GLYPH_DICT_GET,
+ FT_SERVICE_ID_BDF, &SFNT_SERVICE_BDF_GET,
+ FT_SERVICE_ID_TT_CMAP, &TT_SERVICE_CMAP_INFO_GET )
+#elif defined TT_CONFIG_OPTION_POSTSCRIPT_NAMES
+ FT_DEFINE_SERVICEDESCREC4(
+ sfnt_services,
+ FT_SERVICE_ID_SFNT_TABLE, &SFNT_SERVICE_SFNT_TABLE_GET,
+ FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &SFNT_SERVICE_PS_NAME_GET,
+ FT_SERVICE_ID_GLYPH_DICT, &SFNT_SERVICE_GLYPH_DICT_GET,
+ FT_SERVICE_ID_TT_CMAP, &TT_SERVICE_CMAP_INFO_GET )
+#elif defined TT_CONFIG_OPTION_BDF
+ FT_DEFINE_SERVICEDESCREC4(
+ sfnt_services,
+ FT_SERVICE_ID_SFNT_TABLE, &SFNT_SERVICE_SFNT_TABLE_GET,
+ FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &SFNT_SERVICE_PS_NAME_GET,
+ FT_SERVICE_ID_BDF, &SFNT_SERVICE_BDF_GET,
+ FT_SERVICE_ID_TT_CMAP, &TT_SERVICE_CMAP_INFO_GET )
+#else
+ FT_DEFINE_SERVICEDESCREC3(
+ sfnt_services,
+ FT_SERVICE_ID_SFNT_TABLE, &SFNT_SERVICE_SFNT_TABLE_GET,
+ FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &SFNT_SERVICE_PS_NAME_GET,
+ FT_SERVICE_ID_TT_CMAP, &TT_SERVICE_CMAP_INFO_GET )
+#endif
+
+
+ FT_CALLBACK_DEF( FT_Module_Interface )
+ sfnt_get_interface( FT_Module module,
+ const char* module_interface )
+ {
+ /* SFNT_SERVICES_GET derefers `library' in PIC mode */
+#ifdef FT_CONFIG_OPTION_PIC
+ FT_Library library;
+
+
+ if ( !module )
+ return NULL;
+ library = module->library;
+ if ( !library )
+ return NULL;
+#else
+ FT_UNUSED( module );
+#endif
+
+ return ft_service_list_lookup( SFNT_SERVICES_GET, module_interface );
+ }
+
+
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+#define PUT_EMBEDDED_BITMAPS( a ) a
+#else
+#define PUT_EMBEDDED_BITMAPS( a ) NULL
+#endif
+
+#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES
+#define PUT_PS_NAMES( a ) a
+#else
+#define PUT_PS_NAMES( a ) NULL
+#endif
+
+ FT_DEFINE_SFNT_INTERFACE(
+ sfnt_interface,
+ tt_face_goto_table,
+
+ sfnt_init_face,
+ sfnt_load_face,
+ sfnt_done_face,
+ sfnt_get_interface,
+
+ tt_face_load_any,
+
+ tt_face_load_head,
+ tt_face_load_hhea,
+ tt_face_load_cmap,
+ tt_face_load_maxp,
+ tt_face_load_os2,
+ tt_face_load_post,
+
+ tt_face_load_name,
+ tt_face_free_name,
+
+ tt_face_load_kern,
+ tt_face_load_gasp,
+ tt_face_load_pclt,
+
+ /* see `ttload.h' */
+ PUT_EMBEDDED_BITMAPS( tt_face_load_bhed ),
+
+ PUT_EMBEDDED_BITMAPS( tt_face_load_sbit_image ),
+
+ /* see `ttpost.h' */
+ PUT_PS_NAMES( tt_face_get_ps_name ),
+ PUT_PS_NAMES( tt_face_free_ps_names ),
+
+ /* since version 2.1.8 */
+ tt_face_get_kerning,
+
+ /* since version 2.2 */
+ tt_face_load_font_dir,
+ tt_face_load_hmtx,
+
+ /* see `ttsbit.h' and `sfnt.h' */
+ PUT_EMBEDDED_BITMAPS( tt_face_load_eblc ),
+ PUT_EMBEDDED_BITMAPS( tt_face_free_eblc ),
+
+ PUT_EMBEDDED_BITMAPS( tt_face_set_sbit_strike ),
+ PUT_EMBEDDED_BITMAPS( tt_face_load_strike_metrics ),
+
+ tt_face_get_metrics
+ )
+
+
+ FT_DEFINE_MODULE(
+ sfnt_module_class,
+
+ 0, /* not a font driver or renderer */
+ sizeof ( FT_ModuleRec ),
+
+ "sfnt", /* driver name */
+ 0x10000L, /* driver version 1.0 */
+ 0x20000L, /* driver requires FreeType 2.0 or higher */
+
+ (const void*)&SFNT_INTERFACE_GET, /* module specific interface */
+
+ (FT_Module_Constructor)0,
+ (FT_Module_Destructor) 0,
+ (FT_Module_Requester) sfnt_get_interface )
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfdriver.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfdriver.h
new file mode 100644
index 0000000000..7c743f949f
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfdriver.h
@@ -0,0 +1,38 @@
+/***************************************************************************/
+/* */
+/* sfdriver.h */
+/* */
+/* High-level SFNT driver interface (specification). */
+/* */
+/* Copyright 1996-2001 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __SFDRIVER_H__
+#define __SFDRIVER_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/ftmodapi.h"
+
+
+FT_BEGIN_HEADER
+
+
+ FT_DECLARE_MODULE( sfnt_module_class )
+
+
+FT_END_HEADER
+
+#endif /* __SFDRIVER_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sferrors.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sferrors.h
new file mode 100644
index 0000000000..f313707fd2
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sferrors.h
@@ -0,0 +1,40 @@
+/***************************************************************************/
+/* */
+/* sferrors.h */
+/* */
+/* SFNT error codes (specification only). */
+/* */
+/* Copyright 2001, 2004, 2012, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* This file is used to define the SFNT error enumeration constants. */
+ /* */
+ /*************************************************************************/
+
+#ifndef __SFERRORS_H__
+#define __SFERRORS_H__
+
+#include "../../include/freetype/ftmoderr.h"
+
+#undef __FTERRORS_H__
+
+#undef FT_ERR_PREFIX
+#define FT_ERR_PREFIX SFNT_Err_
+#define FT_ERR_BASE FT_Mod_Err_SFNT
+
+#include "../../include/freetype/fterrors.h"
+
+#endif /* __SFERRORS_H__ */
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfntpic.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfntpic.c
new file mode 100644
index 0000000000..7d34eee25a
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfntpic.c
@@ -0,0 +1,143 @@
+/***************************************************************************/
+/* */
+/* sfntpic.c */
+/* */
+/* The FreeType position independent code services for sfnt module. */
+/* */
+/* Copyright 2009, 2010, 2012, 2013 by */
+/* Oran Agra and Mickey Gabel. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/freetype.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "sfntpic.h"
+#include "sferrors.h"
+
+
+#ifdef FT_CONFIG_OPTION_PIC
+
+ /* forward declaration of PIC init functions from sfdriver.c */
+ FT_Error
+ FT_Create_Class_sfnt_services( FT_Library library,
+ FT_ServiceDescRec** output_class );
+ void
+ FT_Destroy_Class_sfnt_services( FT_Library library,
+ FT_ServiceDescRec* clazz );
+ void
+ FT_Init_Class_sfnt_service_bdf( FT_Service_BDFRec* clazz );
+ void
+ FT_Init_Class_sfnt_interface( FT_Library library,
+ SFNT_Interface* clazz );
+ void
+ FT_Init_Class_sfnt_service_glyph_dict(
+ FT_Library library,
+ FT_Service_GlyphDictRec* clazz );
+ void
+ FT_Init_Class_sfnt_service_ps_name(
+ FT_Library library,
+ FT_Service_PsFontNameRec* clazz );
+ void
+ FT_Init_Class_tt_service_get_cmap_info(
+ FT_Library library,
+ FT_Service_TTCMapsRec* clazz );
+ void
+ FT_Init_Class_sfnt_service_sfnt_table(
+ FT_Service_SFNT_TableRec* clazz );
+
+
+ /* forward declaration of PIC init functions from ttcmap.c */
+ FT_Error
+ FT_Create_Class_tt_cmap_classes( FT_Library library,
+ TT_CMap_Class** output_class );
+ void
+ FT_Destroy_Class_tt_cmap_classes( FT_Library library,
+ TT_CMap_Class* clazz );
+
+
+ void
+ sfnt_module_class_pic_free( FT_Library library )
+ {
+ FT_PIC_Container* pic_container = &library->pic_container;
+ FT_Memory memory = library->memory;
+
+
+ if ( pic_container->sfnt )
+ {
+ sfntModulePIC* container = (sfntModulePIC*)pic_container->sfnt;
+
+
+ if ( container->sfnt_services )
+ FT_Destroy_Class_sfnt_services( library,
+ container->sfnt_services );
+ container->sfnt_services = NULL;
+
+ if ( container->tt_cmap_classes )
+ FT_Destroy_Class_tt_cmap_classes( library,
+ container->tt_cmap_classes );
+ container->tt_cmap_classes = NULL;
+
+ FT_FREE( container );
+ pic_container->sfnt = NULL;
+ }
+ }
+
+
+ FT_Error
+ sfnt_module_class_pic_init( FT_Library library )
+ {
+ FT_PIC_Container* pic_container = &library->pic_container;
+ FT_Error error = FT_Err_Ok;
+ sfntModulePIC* container = NULL;
+ FT_Memory memory = library->memory;
+
+
+ /* allocate pointer, clear and set global container pointer */
+ if ( FT_ALLOC( container, sizeof ( *container ) ) )
+ return error;
+ FT_MEM_SET( container, 0, sizeof ( *container ) );
+ pic_container->sfnt = container;
+
+ /* initialize pointer table - */
+ /* this is how the module usually expects this data */
+ error = FT_Create_Class_sfnt_services( library,
+ &container->sfnt_services );
+ if ( error )
+ goto Exit;
+
+ error = FT_Create_Class_tt_cmap_classes( library,
+ &container->tt_cmap_classes );
+ if ( error )
+ goto Exit;
+
+ FT_Init_Class_sfnt_service_glyph_dict(
+ library, &container->sfnt_service_glyph_dict );
+ FT_Init_Class_sfnt_service_ps_name(
+ library, &container->sfnt_service_ps_name );
+ FT_Init_Class_tt_service_get_cmap_info(
+ library, &container->tt_service_get_cmap_info );
+ FT_Init_Class_sfnt_service_sfnt_table(
+ &container->sfnt_service_sfnt_table );
+#ifdef TT_CONFIG_OPTION_BDF
+ FT_Init_Class_sfnt_service_bdf( &container->sfnt_service_bdf );
+#endif
+ FT_Init_Class_sfnt_interface( library, &container->sfnt_interface );
+
+ Exit:
+ if ( error )
+ sfnt_module_class_pic_free( library );
+ return error;
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfntpic.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfntpic.h
new file mode 100644
index 0000000000..470f2286c5
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfntpic.h
@@ -0,0 +1,114 @@
+/***************************************************************************/
+/* */
+/* sfntpic.h */
+/* */
+/* The FreeType position independent code services for sfnt module. */
+/* */
+/* Copyright 2009, 2012 by */
+/* Oran Agra and Mickey Gabel. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __SFNTPIC_H__
+#define __SFNTPIC_H__
+
+
+FT_BEGIN_HEADER
+
+#include "../../include/freetype/internal/ftpic.h"
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define SFNT_SERVICES_GET sfnt_services
+#define SFNT_SERVICE_GLYPH_DICT_GET sfnt_service_glyph_dict
+#define SFNT_SERVICE_PS_NAME_GET sfnt_service_ps_name
+#define TT_SERVICE_CMAP_INFO_GET tt_service_get_cmap_info
+#define SFNT_SERVICES_GET sfnt_services
+#define TT_CMAP_CLASSES_GET tt_cmap_classes
+#define SFNT_SERVICE_SFNT_TABLE_GET sfnt_service_sfnt_table
+#define SFNT_SERVICE_BDF_GET sfnt_service_bdf
+#define SFNT_INTERFACE_GET sfnt_interface
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+ /* some include files required for members of sfntModulePIC */
+#include "../../include/freetype/internal/services/svgldict.h"
+#include "../../include/freetype/internal/services/svpostnm.h"
+#include "../../include/freetype/internal/services/svsfnt.h"
+#include "../../include/freetype/internal/services/svttcmap.h"
+
+#ifdef TT_CONFIG_OPTION_BDF
+#include "ttbdf.h"
+#include "../../include/freetype/internal/services/svbdf.h"
+#endif
+
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/internal/sfnt.h"
+#include "ttcmap.h"
+
+
+ typedef struct sfntModulePIC_
+ {
+ FT_ServiceDescRec* sfnt_services;
+ FT_Service_GlyphDictRec sfnt_service_glyph_dict;
+ FT_Service_PsFontNameRec sfnt_service_ps_name;
+ FT_Service_TTCMapsRec tt_service_get_cmap_info;
+ TT_CMap_Class* tt_cmap_classes;
+ FT_Service_SFNT_TableRec sfnt_service_sfnt_table;
+#ifdef TT_CONFIG_OPTION_BDF
+ FT_Service_BDFRec sfnt_service_bdf;
+#endif
+ SFNT_Interface sfnt_interface;
+
+ } sfntModulePIC;
+
+
+#define GET_PIC( lib ) \
+ ( (sfntModulePIC*)( (lib)->pic_container.sfnt ) )
+
+#define SFNT_SERVICES_GET \
+ ( GET_PIC( library )->sfnt_services )
+#define SFNT_SERVICE_GLYPH_DICT_GET \
+ ( GET_PIC( library )->sfnt_service_glyph_dict )
+#define SFNT_SERVICE_PS_NAME_GET \
+ ( GET_PIC( library )->sfnt_service_ps_name )
+#define TT_SERVICE_CMAP_INFO_GET \
+ ( GET_PIC( library )->tt_service_get_cmap_info )
+#define SFNT_SERVICES_GET \
+ ( GET_PIC( library )->sfnt_services )
+#define TT_CMAP_CLASSES_GET \
+ ( GET_PIC( library )->tt_cmap_classes )
+#define SFNT_SERVICE_SFNT_TABLE_GET \
+ ( GET_PIC( library )->sfnt_service_sfnt_table )
+#define SFNT_SERVICE_BDF_GET \
+ ( GET_PIC( library )->sfnt_service_bdf )
+#define SFNT_INTERFACE_GET \
+ ( GET_PIC( library )->sfnt_interface )
+
+
+ /* see sfntpic.c for the implementation */
+ void
+ sfnt_module_class_pic_free( FT_Library library );
+
+ FT_Error
+ sfnt_module_class_pic_init( FT_Library library );
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __SFNTPIC_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfobjs.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfobjs.c
new file mode 100644
index 0000000000..2d5a388ca8
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfobjs.c
@@ -0,0 +1,1165 @@
+/***************************************************************************/
+/* */
+/* sfobjs.c */
+/* */
+/* SFNT object management (base). */
+/* */
+/* Copyright 1996-2008, 2010-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "sfobjs.h"
+#include "ttload.h"
+#include "ttcmap.h"
+#include "ttkern.h"
+#include "../../include/freetype/internal/sfnt.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/ttnameid.h"
+#include "../../include/freetype/tttags.h"
+#include "../../include/freetype/internal/services/svpscmap.h"
+#include "../../include/freetype/ftsnames.h"
+#include "sferrors.h"
+
+#ifdef TT_CONFIG_OPTION_BDF
+#include "ttbdf.h"
+#endif
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_sfobjs
+
+
+
+ /* convert a UTF-16 name entry to ASCII */
+ static FT_String*
+ tt_name_entry_ascii_from_utf16( TT_NameEntry entry,
+ FT_Memory memory )
+ {
+ FT_String* string = NULL;
+ FT_UInt len, code, n;
+ FT_Byte* read = (FT_Byte*)entry->string;
+ FT_Error error;
+
+
+ len = (FT_UInt)entry->stringLength / 2;
+
+ if ( FT_NEW_ARRAY( string, len + 1 ) )
+ return NULL;
+
+ for ( n = 0; n < len; n++ )
+ {
+ code = FT_NEXT_USHORT( read );
+
+ if ( code == 0 )
+ break;
+
+ if (code > 255) /*Johnson 2010-10-09, #TESTDOC:0000042_QUT20005_5.pdf.*/
+ code = code>>8&0x00ff;
+ if ( code < 32 || code > 127 )
+ code = '?';
+
+ string[n] = (char)code;
+ }
+
+ string[n] = 0;
+
+ return string;
+ }
+
+
+ /* convert an Apple Roman or symbol name entry to ASCII */
+ static FT_String*
+ tt_name_entry_ascii_from_other( TT_NameEntry entry,
+ FT_Memory memory )
+ {
+ FT_String* string = NULL;
+ FT_UInt len, code, n;
+ FT_Byte* read = (FT_Byte*)entry->string;
+ FT_Error error;
+
+
+ len = (FT_UInt)entry->stringLength;
+
+ if ( FT_NEW_ARRAY( string, len + 1 ) )
+ return NULL;
+
+ for ( n = 0; n < len; n++ )
+ {
+ code = *read++;
+
+ if ( code == 0 )
+ break;
+
+ if ( code < 32 || code > 127 )
+ code = '?';
+
+ string[n] = (char)code;
+ }
+
+ string[n] = 0;
+
+ return string;
+ }
+
+
+ typedef FT_String* (*TT_NameEntry_ConvertFunc)( TT_NameEntry entry,
+ FT_Memory memory );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_face_get_name */
+ /* */
+ /* <Description> */
+ /* Returns a given ENGLISH name record in ASCII. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the source face object. */
+ /* */
+ /* nameid :: The name id of the name record to return. */
+ /* */
+ /* <InOut> */
+ /* name :: The address of a string pointer. NULL if no name is */
+ /* present. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ static FT_Error
+ tt_face_get_name( TT_Face face,
+ FT_UShort nameid,
+ FT_String** name )
+ {
+ FT_Memory memory = face->root.memory;
+ FT_Error error = FT_Err_Ok;
+ FT_String* result = NULL;
+ FT_UShort n;
+ TT_NameEntryRec* rec;
+ FT_Int found_apple = -1;
+ FT_Int found_apple_roman = -1;
+ FT_Int found_apple_english = -1;
+ FT_Int found_win = -1;
+ FT_Int found_unicode = -1;
+
+ FT_Bool is_english = 0;
+
+ TT_NameEntry_ConvertFunc convert;
+
+
+ FT_ASSERT( name );
+
+ rec = face->name_table.names;
+ for ( n = 0; n < face->num_names; n++, rec++ )
+ {
+ /* According to the OpenType 1.3 specification, only Microsoft or */
+ /* Apple platform IDs might be used in the `name' table. The */
+ /* `Unicode' platform is reserved for the `cmap' table, and the */
+ /* `ISO' one is deprecated. */
+ /* */
+ /* However, the Apple TrueType specification doesn't say the same */
+ /* thing and goes to suggest that all Unicode `name' table entries */
+ /* should be coded in UTF-16 (in big-endian format I suppose). */
+ /* */
+ if ( rec->nameID == nameid && rec->stringLength > 0 )
+ {
+ switch ( rec->platformID )
+ {
+ case TT_PLATFORM_APPLE_UNICODE:
+ case TT_PLATFORM_ISO:
+ /* there is `languageID' to check there. We should use this */
+ /* field only as a last solution when nothing else is */
+ /* available. */
+ /* */
+ found_unicode = n;
+ break;
+
+ case TT_PLATFORM_MACINTOSH:
+ /* This is a bit special because some fonts will use either */
+ /* an English language id, or a Roman encoding id, to indicate */
+ /* the English version of its font name. */
+ /* */
+ if ( rec->languageID == TT_MAC_LANGID_ENGLISH )
+ found_apple_english = n;
+ else if ( rec->encodingID == TT_MAC_ID_ROMAN )
+ found_apple_roman = n;
+ break;
+
+ case TT_PLATFORM_MICROSOFT:
+ /* we only take a non-English name when there is nothing */
+ /* else available in the font */
+ /* */
+ if ( found_win == -1 || ( rec->languageID & 0x3FF ) == 0x009 )
+ {
+ switch ( rec->encodingID )
+ {
+ case TT_MS_ID_SYMBOL_CS:
+ case TT_MS_ID_UNICODE_CS:
+ case TT_MS_ID_UCS_4:
+ is_english = FT_BOOL( ( rec->languageID & 0x3FF ) == 0x009 );
+ found_win = n;
+ break;
+
+ default:
+ ;
+ }
+ }
+ break;
+
+ default:
+ ;
+ }
+ }
+ }
+
+ found_apple = found_apple_roman;
+ if ( found_apple_english >= 0 )
+ found_apple = found_apple_english;
+
+ /* some fonts contain invalid Unicode or Macintosh formatted entries; */
+ /* we will thus favor names encoded in Windows formats if available */
+ /* (provided it is an English name) */
+ /* */
+ convert = NULL;
+ if ( found_win >= 0 && !( found_apple >= 0 && !is_english ) )
+ {
+ rec = face->name_table.names + found_win;
+ switch ( rec->encodingID )
+ {
+ /* all Unicode strings are encoded using UTF-16BE */
+ case TT_MS_ID_UNICODE_CS:
+ case TT_MS_ID_SYMBOL_CS:
+ convert = tt_name_entry_ascii_from_utf16;
+ break;
+
+ case TT_MS_ID_UCS_4:
+ /* Apparently, if this value is found in a name table entry, it is */
+ /* documented as `full Unicode repertoire'. Experience with the */
+ /* MsGothic font shipped with Windows Vista shows that this really */
+ /* means UTF-16 encoded names (UCS-4 values are only used within */
+ /* charmaps). */
+ convert = tt_name_entry_ascii_from_utf16;
+ break;
+
+ default:
+ ;
+ }
+ }
+ else if ( found_apple >= 0 )
+ {
+ rec = face->name_table.names + found_apple;
+ convert = tt_name_entry_ascii_from_other;
+ }
+ else if ( found_unicode >= 0 )
+ {
+ rec = face->name_table.names + found_unicode;
+ convert = tt_name_entry_ascii_from_utf16;
+ }
+
+ if ( rec && convert )
+ {
+ if ( rec->string == NULL )
+ {
+ FT_Stream stream = face->name_table.stream;
+
+
+ if ( FT_QNEW_ARRAY ( rec->string, rec->stringLength ) ||
+ FT_STREAM_SEEK( rec->stringOffset ) ||
+ FT_STREAM_READ( rec->string, rec->stringLength ) )
+ {
+ FT_FREE( rec->string );
+ rec->stringLength = 0;
+ result = NULL;
+ goto Exit;
+ }
+ }
+
+ result = convert( rec, memory );
+ }
+
+ Exit:
+ *name = result;
+ return error;
+ }
+
+
+ static FT_Encoding
+ sfnt_find_encoding( int platform_id,
+ int encoding_id )
+ {
+ typedef struct TEncoding_
+ {
+ int platform_id;
+ int encoding_id;
+ FT_Encoding encoding;
+
+ } TEncoding;
+
+ static
+ const TEncoding tt_encodings[] =
+ {
+ { TT_PLATFORM_ISO, -1, FT_ENCODING_UNICODE },
+
+ { TT_PLATFORM_APPLE_UNICODE, -1, FT_ENCODING_UNICODE },
+
+ { TT_PLATFORM_MACINTOSH, TT_MAC_ID_ROMAN, FT_ENCODING_APPLE_ROMAN },
+
+ { TT_PLATFORM_MICROSOFT, TT_MS_ID_SYMBOL_CS, FT_ENCODING_MS_SYMBOL },
+ { TT_PLATFORM_MICROSOFT, TT_MS_ID_UCS_4, FT_ENCODING_UNICODE },
+ { TT_PLATFORM_MICROSOFT, TT_MS_ID_UNICODE_CS, FT_ENCODING_UNICODE },
+ { TT_PLATFORM_MICROSOFT, TT_MS_ID_SJIS, FT_ENCODING_SJIS },
+ { TT_PLATFORM_MICROSOFT, TT_MS_ID_GB2312, FT_ENCODING_GB2312 },
+ { TT_PLATFORM_MICROSOFT, TT_MS_ID_BIG_5, FT_ENCODING_BIG5 },
+ { TT_PLATFORM_MICROSOFT, TT_MS_ID_WANSUNG, FT_ENCODING_WANSUNG },
+ { TT_PLATFORM_MICROSOFT, TT_MS_ID_JOHAB, FT_ENCODING_JOHAB }
+ };
+
+ const TEncoding *cur, *limit;
+
+
+ cur = tt_encodings;
+ limit = cur + sizeof ( tt_encodings ) / sizeof ( tt_encodings[0] );
+
+ for ( ; cur < limit; cur++ )
+ {
+ if ( cur->platform_id == platform_id )
+ {
+ if ( cur->encoding_id == encoding_id ||
+ cur->encoding_id == -1 )
+ return cur->encoding;
+ }
+ }
+
+ return FT_ENCODING_NONE;
+ }
+
+
+ /* Fill in face->ttc_header. If the font is not a TTC, it is */
+ /* synthesized into a TTC with one offset table. */
+ static FT_Error
+ sfnt_open_font( FT_Stream stream,
+ TT_Face face )
+ {
+ FT_Memory memory = stream->memory;
+ FT_Error error;
+ FT_ULong tag, offset;
+
+ static const FT_Frame_Field ttc_header_fields[] =
+ {
+#undef FT_STRUCTURE
+#define FT_STRUCTURE TTC_HeaderRec
+
+ FT_FRAME_START( 8 ),
+ FT_FRAME_LONG( version ),
+ FT_FRAME_LONG( count ), /* this is ULong in the specs */
+ FT_FRAME_END
+ };
+
+
+ face->ttc_header.tag = 0;
+ face->ttc_header.version = 0;
+ face->ttc_header.count = 0;
+
+ offset = FT_STREAM_POS();
+
+ if ( FT_READ_ULONG( tag ) )
+ return error;
+
+ if ( tag != 0x00010000UL &&
+ tag != TTAG_ttcf &&
+ tag != TTAG_OTTO &&
+ tag != TTAG_true &&
+ tag != TTAG_typ1 &&
+ tag != 0x00020000UL )
+ {
+ FT_TRACE2(( " not a font using the SFNT container format\n" ));
+ return FT_THROW( Unknown_File_Format );
+ }
+
+ face->ttc_header.tag = TTAG_ttcf;
+
+ if ( tag == TTAG_ttcf )
+ {
+ FT_Int n;
+
+
+ FT_TRACE3(( "sfnt_open_font: file is a collection\n" ));
+
+ if ( FT_STREAM_READ_FIELDS( ttc_header_fields, &face->ttc_header ) )
+ return error;
+
+ if ( face->ttc_header.count == 0 )
+ return FT_THROW( Invalid_Table );
+
+ /* a rough size estimate: let's conservatively assume that there */
+ /* is just a single table info in each subfont header (12 + 16*1 = */
+ /* 28 bytes), thus we have (at least) `12 + 4*count' bytes for the */
+ /* size of the TTC header plus `28*count' bytes for all subfont */
+ /* headers */
+ if ( (FT_ULong)face->ttc_header.count > stream->size / ( 28 + 4 ) )
+ return FT_THROW( Array_Too_Large );
+
+ /* now read the offsets of each font in the file */
+ if ( FT_NEW_ARRAY( face->ttc_header.offsets, face->ttc_header.count ) )
+ return error;
+
+ if ( FT_FRAME_ENTER( face->ttc_header.count * 4L ) )
+ return error;
+
+ for ( n = 0; n < face->ttc_header.count; n++ )
+ face->ttc_header.offsets[n] = FT_GET_ULONG();
+
+ FT_FRAME_EXIT();
+ }
+ else
+ {
+ FT_TRACE3(( "sfnt_open_font: synthesize TTC\n" ));
+
+ face->ttc_header.version = 1 << 16;
+ face->ttc_header.count = 1;
+
+ if ( FT_NEW( face->ttc_header.offsets ) )
+ return error;
+
+ face->ttc_header.offsets[0] = offset;
+ }
+
+ return error;
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ sfnt_init_face( FT_Stream stream,
+ TT_Face face,
+ FT_Int face_index,
+ FT_Int num_params,
+ FT_Parameter* params )
+ {
+ FT_Error error;
+ FT_Library library = face->root.driver->root.library;
+ SFNT_Service sfnt;
+
+
+ /* for now, parameters are unused */
+ FT_UNUSED( num_params );
+ FT_UNUSED( params );
+
+
+ sfnt = (SFNT_Service)face->sfnt;
+ if ( !sfnt )
+ {
+ sfnt = (SFNT_Service)FT_Get_Module_Interface( library, "sfnt" );
+ if ( !sfnt )
+ {
+ FT_ERROR(( "sfnt_init_face: cannot access `sfnt' module\n" ));
+ return FT_THROW( Missing_Module );
+ }
+
+ face->sfnt = sfnt;
+ face->goto_table = sfnt->goto_table;
+ }
+
+ FT_FACE_FIND_GLOBAL_SERVICE( face, face->psnames, POSTSCRIPT_CMAPS );
+
+ FT_TRACE2(( "SFNT driver\n" ));
+
+ error = sfnt_open_font( stream, face );
+ if ( error )
+ return error;
+
+ FT_TRACE2(( "sfnt_init_face: %08p, %ld\n", face, face_index ));
+
+ if ( face_index < 0 )
+ face_index = 0;
+
+ if ( face_index >= face->ttc_header.count )
+ return FT_THROW( Invalid_Argument );
+
+ if ( FT_STREAM_SEEK( face->ttc_header.offsets[face_index] ) )
+ return error;
+
+ /* check that we have a valid TrueType file */
+ error = sfnt->load_font_dir( face, stream );
+ if ( error )
+ return error;
+
+ face->root.num_faces = face->ttc_header.count;
+ face->root.face_index = face_index;
+
+ return error;
+ }
+
+
+#define LOAD_( x ) \
+ do { \
+ FT_TRACE2(( "`" #x "' " )); \
+ FT_TRACE3(( "-->\n" )); \
+ \
+ error = sfnt->load_ ## x( face, stream ); \
+ \
+ FT_TRACE2(( "%s\n", ( !error ) \
+ ? "loaded" \
+ : FT_ERR_EQ( error, Table_Missing ) \
+ ? "missing" \
+ : "failed to load" )); \
+ FT_TRACE3(( "\n" )); \
+ } while ( 0 )
+
+#define LOADM_( x, vertical ) \
+ do { \
+ FT_TRACE2(( "`%s" #x "' ", \
+ vertical ? "vertical " : "" )); \
+ FT_TRACE3(( "-->\n" )); \
+ \
+ error = sfnt->load_ ## x( face, stream, vertical ); \
+ \
+ FT_TRACE2(( "%s\n", ( !error ) \
+ ? "loaded" \
+ : FT_ERR_EQ( error, Table_Missing ) \
+ ? "missing" \
+ : "failed to load" )); \
+ FT_TRACE3(( "\n" )); \
+ } while ( 0 )
+
+#define GET_NAME( id, field ) \
+ do { \
+ error = tt_face_get_name( face, TT_NAME_ID_ ## id, field ); \
+ if ( error ) \
+ goto Exit; \
+ } while ( 0 )
+
+
+ FT_LOCAL_DEF( FT_Error )
+ sfnt_load_face( FT_Stream stream,
+ TT_Face face,
+ FT_Int face_index,
+ FT_Int num_params,
+ FT_Parameter* params )
+ {
+ FT_Error error;
+#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES
+ FT_Error psnames_error;
+#endif
+ FT_Bool has_outline;
+ FT_Bool is_apple_sbit;
+ FT_Bool ignore_preferred_family = FALSE;
+ FT_Bool ignore_preferred_subfamily = FALSE;
+
+ SFNT_Service sfnt = (SFNT_Service)face->sfnt;
+
+ FT_UNUSED( face_index );
+
+
+ /* Check parameters */
+
+ {
+ FT_Int i;
+
+
+ for ( i = 0; i < num_params; i++ )
+ {
+ if ( params[i].tag == FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY )
+ ignore_preferred_family = TRUE;
+ else if ( params[i].tag == FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY )
+ ignore_preferred_subfamily = TRUE;
+ }
+ }
+
+ /* Load tables */
+
+ /* We now support two SFNT-based bitmapped font formats. They */
+ /* are recognized easily as they do not include a `glyf' */
+ /* table. */
+ /* */
+ /* The first format comes from Apple, and uses a table named */
+ /* `bhed' instead of `head' to store the font header (using */
+ /* the same format). It also doesn't include horizontal and */
+ /* vertical metrics tables (i.e. `hhea' and `vhea' tables are */
+ /* missing). */
+ /* */
+ /* The other format comes from Microsoft, and is used with */
+ /* WinCE/PocketPC. It looks like a standard TTF, except that */
+ /* it doesn't contain outlines. */
+ /* */
+
+ FT_TRACE2(( "sfnt_load_face: %08p\n\n", face ));
+
+ /* do we have outlines in there? */
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+ has_outline = FT_BOOL( face->root.internal->incremental_interface != 0 ||
+ tt_face_lookup_table( face, TTAG_glyf ) != 0 ||
+ tt_face_lookup_table( face, TTAG_CFF ) != 0 );
+#else
+ has_outline = FT_BOOL( tt_face_lookup_table( face, TTAG_glyf ) != 0 ||
+ tt_face_lookup_table( face, TTAG_CFF ) != 0 );
+#endif
+
+ is_apple_sbit = 0;
+
+ /* if this font doesn't contain outlines, we try to load */
+ /* a `bhed' table */
+ if ( !has_outline && sfnt->load_bhed )
+ {
+ LOAD_( bhed );
+ is_apple_sbit = FT_BOOL( !error );
+ }
+
+ /* load the font header (`head' table) if this isn't an Apple */
+ /* sbit font file */
+ if ( !is_apple_sbit )
+ {
+ LOAD_( head );
+ if ( error )
+ goto Exit;
+ }
+
+ if ( face->header.Units_Per_EM == 0 )
+ {
+ error = FT_THROW( Invalid_Table );
+
+ goto Exit;
+ }
+
+ /* the following tables are often not present in embedded TrueType */
+ /* fonts within PDF documents, so don't check for them. */
+ LOAD_( maxp );
+ LOAD_( cmap );
+
+ /* the following tables are optional in PCL fonts -- */
+ /* don't check for errors */
+ LOAD_( name );
+ LOAD_( post );
+
+#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES
+ psnames_error = error;
+#endif
+
+ /* do not load the metrics headers and tables if this is an Apple */
+ /* sbit font file */
+ if ( !is_apple_sbit )
+ {
+ /* load the `hhea' and `hmtx' tables */
+ LOADM_( hhea, 0 );
+ if ( !error )
+ {
+ LOADM_( hmtx, 0 );
+ if ( FT_ERR_EQ( error, Table_Missing ) )
+ {
+ error = FT_THROW( Hmtx_Table_Missing );
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+ /* If this is an incrementally loaded font and there are */
+ /* overriding metrics, tolerate a missing `hmtx' table. */
+ if ( face->root.internal->incremental_interface &&
+ face->root.internal->incremental_interface->funcs->
+ get_glyph_metrics )
+ {
+ face->horizontal.number_Of_HMetrics = 0;
+ error = FT_Err_Ok;
+ }
+#endif
+ }
+ }
+ else if ( FT_ERR_EQ( error, Table_Missing ) )
+ {
+ /* No `hhea' table necessary for SFNT Mac fonts. */
+ if ( face->format_tag == TTAG_true )
+ {
+ FT_TRACE2(( "This is an SFNT Mac font.\n" ));
+
+ has_outline = 0;
+ error = FT_Err_Ok;
+ }
+ else
+ {
+ error = FT_THROW( Horiz_Header_Missing );
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+ /* If this is an incrementally loaded font and there are */
+ /* overriding metrics, tolerate a missing `hhea' table. */
+ if ( face->root.internal->incremental_interface &&
+ face->root.internal->incremental_interface->funcs->
+ get_glyph_metrics )
+ {
+ face->horizontal.number_Of_HMetrics = 0;
+ error = FT_Err_Ok;
+ }
+#endif
+
+ }
+ }
+
+ if ( error )
+ goto Exit;
+
+ /* try to load the `vhea' and `vmtx' tables */
+ LOADM_( hhea, 1 );
+ if ( !error )
+ {
+ LOADM_( hmtx, 1 );
+ if ( !error )
+ face->vertical_info = 1;
+ }
+
+ if ( error && FT_ERR_NEQ( error, Table_Missing ) )
+ goto Exit;
+
+ LOAD_( os2 );
+ if ( error )
+ {
+ /* we treat the table as missing if there are any errors */
+ face->os2.version = 0xFFFFU;
+ }
+ }
+
+ /* the optional tables */
+
+ /* embedded bitmap support */
+ if ( sfnt->load_eblc )
+ {
+ LOAD_( eblc );
+ if ( error )
+ {
+ /* a font which contains neither bitmaps nor outlines is */
+ /* still valid (although rather useless in most cases); */
+ /* however, you can find such stripped fonts in PDFs */
+ if ( FT_ERR_EQ( error, Table_Missing ) )
+ error = FT_Err_Ok;
+ else
+ goto Exit;
+ }
+ }
+
+ LOAD_( pclt );
+ if ( error )
+ {
+ if ( FT_ERR_NEQ( error, Table_Missing ) )
+ goto Exit;
+
+ face->pclt.Version = 0;
+ }
+
+ /* consider the kerning and gasp tables as optional */
+ LOAD_( gasp );
+ LOAD_( kern );
+
+ face->root.num_glyphs = face->max_profile.numGlyphs;
+
+ /* Bit 8 of the `fsSelection' field in the `OS/2' table denotes */
+ /* a WWS-only font face. `WWS' stands for `weight', width', and */
+ /* `slope', a term used by Microsoft's Windows Presentation */
+ /* Foundation (WPF). This flag has been introduced in version */
+ /* 1.5 of the OpenType specification (May 2008). */
+
+ face->root.family_name = NULL;
+ face->root.style_name = NULL;
+ if ( face->os2.version != 0xFFFFU && face->os2.fsSelection & 256 )
+ {
+ if ( !ignore_preferred_family )
+ GET_NAME( PREFERRED_FAMILY, &face->root.family_name );
+ if ( !face->root.family_name )
+ GET_NAME( FONT_FAMILY, &face->root.family_name );
+
+ if ( !ignore_preferred_subfamily )
+ GET_NAME( PREFERRED_SUBFAMILY, &face->root.style_name );
+ if ( !face->root.style_name )
+ GET_NAME( FONT_SUBFAMILY, &face->root.style_name );
+ }
+ else
+ {
+ GET_NAME( WWS_FAMILY, &face->root.family_name );
+ if ( !face->root.family_name && !ignore_preferred_family )
+ GET_NAME( PREFERRED_FAMILY, &face->root.family_name );
+ if ( !face->root.family_name )
+ GET_NAME( FONT_FAMILY, &face->root.family_name );
+
+ GET_NAME( WWS_SUBFAMILY, &face->root.style_name );
+ if ( !face->root.style_name && !ignore_preferred_subfamily )
+ GET_NAME( PREFERRED_SUBFAMILY, &face->root.style_name );
+ if ( !face->root.style_name )
+ GET_NAME( FONT_SUBFAMILY, &face->root.style_name );
+ }
+
+ /* now set up root fields */
+ {
+ FT_Face root = &face->root;
+ FT_Long flags = root->face_flags;
+
+
+ /*********************************************************************/
+ /* */
+ /* Compute face flags. */
+ /* */
+ if ( has_outline == TRUE )
+ flags |= FT_FACE_FLAG_SCALABLE; /* scalable outlines */
+
+ /* The sfnt driver only supports bitmap fonts natively, thus we */
+ /* don't set FT_FACE_FLAG_HINTER. */
+ flags |= FT_FACE_FLAG_SFNT | /* SFNT file format */
+ FT_FACE_FLAG_HORIZONTAL; /* horizontal data */
+
+#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES
+ if ( !psnames_error &&
+ face->postscript.FormatType != 0x00030000L )
+ flags |= FT_FACE_FLAG_GLYPH_NAMES;
+#endif
+
+ /* fixed width font? */
+ if ( face->postscript.isFixedPitch )
+ flags |= FT_FACE_FLAG_FIXED_WIDTH;
+
+ /* vertical information? */
+ if ( face->vertical_info )
+ flags |= FT_FACE_FLAG_VERTICAL;
+
+ /* kerning available ? */
+ if ( TT_FACE_HAS_KERNING( face ) )
+ flags |= FT_FACE_FLAG_KERNING;
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+ /* Don't bother to load the tables unless somebody asks for them. */
+ /* No need to do work which will (probably) not be used. */
+ if ( tt_face_lookup_table( face, TTAG_glyf ) != 0 &&
+ tt_face_lookup_table( face, TTAG_fvar ) != 0 &&
+ tt_face_lookup_table( face, TTAG_gvar ) != 0 )
+ flags |= FT_FACE_FLAG_MULTIPLE_MASTERS;
+#endif
+
+ root->face_flags = flags;
+
+ /*********************************************************************/
+ /* */
+ /* Compute style flags. */
+ /* */
+
+ flags = 0;
+ if ( has_outline == TRUE && face->os2.version != 0xFFFFU )
+ {
+ /* We have an OS/2 table; use the `fsSelection' field. Bit 9 */
+ /* indicates an oblique font face. This flag has been */
+ /* introduced in version 1.5 of the OpenType specification. */
+
+ if ( face->os2.fsSelection & 512 ) /* bit 9 */
+ flags |= FT_STYLE_FLAG_ITALIC;
+ else if ( face->os2.fsSelection & 1 ) /* bit 0 */
+ flags |= FT_STYLE_FLAG_ITALIC;
+
+ if ( face->os2.fsSelection & 32 ) /* bit 5 */
+ flags |= FT_STYLE_FLAG_BOLD;
+ }
+ else
+ {
+ /* this is an old Mac font, use the header field */
+
+ if ( face->header.Mac_Style & 1 )
+ flags |= FT_STYLE_FLAG_BOLD;
+
+ if ( face->header.Mac_Style & 2 )
+ flags |= FT_STYLE_FLAG_ITALIC;
+ }
+
+ root->style_flags = flags;
+
+ /*********************************************************************/
+ /* */
+ /* Polish the charmaps. */
+ /* */
+ /* Try to set the charmap encoding according to the platform & */
+ /* encoding ID of each charmap. */
+ /* */
+
+ tt_face_build_cmaps( face ); /* ignore errors */
+
+
+ /* set the encoding fields */
+ {
+ FT_Int m;
+
+
+ for ( m = 0; m < root->num_charmaps; m++ )
+ {
+ FT_CharMap charmap = root->charmaps[m];
+
+
+ charmap->encoding = sfnt_find_encoding( charmap->platform_id,
+ charmap->encoding_id );
+
+#if 0
+ if ( root->charmap == NULL &&
+ charmap->encoding == FT_ENCODING_UNICODE )
+ {
+ /* set 'root->charmap' to the first Unicode encoding we find */
+ root->charmap = charmap;
+ }
+#endif
+ }
+ }
+
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+
+ /*
+ * Now allocate the root array of FT_Bitmap_Size records and
+ * populate them. Unfortunately, it isn't possible to indicate bit
+ * depths in the FT_Bitmap_Size record. This is a design error.
+ */
+ {
+ FT_UInt i, count;
+
+
+ count = face->sbit_num_strikes;
+
+ if ( count > 0 )
+ {
+ FT_Memory memory = face->root.stream->memory;
+ FT_UShort em_size = face->header.Units_Per_EM;
+ FT_Short avgwidth = face->os2.xAvgCharWidth;
+ FT_Size_Metrics metrics;
+
+
+ if ( em_size == 0 || face->os2.version == 0xFFFFU )
+ {
+ avgwidth = 0;
+ em_size = 1;
+ }
+
+ if ( FT_NEW_ARRAY( root->available_sizes, count ) )
+ goto Exit;
+
+ for ( i = 0; i < count; i++ )
+ {
+ FT_Bitmap_Size* bsize = root->available_sizes + i;
+
+
+ error = sfnt->load_strike_metrics( face, i, &metrics );
+ if ( error )
+ goto Exit;
+
+ bsize->height = (FT_Short)( metrics.height >> 6 );
+ bsize->width = (FT_Short)(
+ ( avgwidth * metrics.x_ppem + em_size / 2 ) / em_size );
+
+ bsize->x_ppem = metrics.x_ppem << 6;
+ bsize->y_ppem = metrics.y_ppem << 6;
+
+ /* assume 72dpi */
+ bsize->size = metrics.y_ppem << 6;
+ }
+
+ root->face_flags |= FT_FACE_FLAG_FIXED_SIZES;
+ root->num_fixed_sizes = (FT_Int)count;
+ }
+ }
+
+#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
+
+ /* a font with no bitmaps and no outlines is scalable; */
+ /* it has only empty glyphs then */
+ if ( !FT_HAS_FIXED_SIZES( root ) && !FT_IS_SCALABLE( root ) )
+ root->face_flags |= FT_FACE_FLAG_SCALABLE;
+
+
+ /*********************************************************************/
+ /* */
+ /* Set up metrics. */
+ /* */
+ if ( FT_IS_SCALABLE( root ) )
+ {
+ /* XXX What about if outline header is missing */
+ /* (e.g. sfnt wrapped bitmap)? */
+ root->bbox.xMin = face->header.xMin;
+ root->bbox.yMin = face->header.yMin;
+ root->bbox.xMax = face->header.xMax;
+ root->bbox.yMax = face->header.yMax;
+ root->units_per_EM = face->header.Units_Per_EM;
+
+
+ /* XXX: Computing the ascender/descender/height is very different */
+ /* from what the specification tells you. Apparently, we */
+ /* must be careful because */
+ /* */
+ /* - not all fonts have an OS/2 table; in this case, we take */
+ /* the values in the horizontal header. However, these */
+ /* values very often are not reliable. */
+ /* */
+ /* - otherwise, the correct typographic values are in the */
+ /* sTypoAscender, sTypoDescender & sTypoLineGap fields. */
+ /* */
+ /* However, certain fonts have these fields set to 0. */
+ /* Rather, they have usWinAscent & usWinDescent correctly */
+ /* set (but with different values). */
+ /* */
+ /* As an example, Arial Narrow is implemented through four */
+ /* files ARIALN.TTF, ARIALNI.TTF, ARIALNB.TTF & ARIALNBI.TTF */
+ /* */
+ /* Strangely, all fonts have the same values in their */
+ /* sTypoXXX fields, except ARIALNB which sets them to 0. */
+ /* */
+ /* On the other hand, they all have different */
+ /* usWinAscent/Descent values -- as a conclusion, the OS/2 */
+ /* table cannot be used to compute the text height reliably! */
+ /* */
+
+ /* The ascender and descender are taken from the `hhea' table. */
+ /* If zero, they are taken from the `OS/2' table. */
+
+ root->ascender = face->horizontal.Ascender;
+ root->descender = face->horizontal.Descender;
+
+ root->height = (FT_Short)( root->ascender - root->descender +
+ face->horizontal.Line_Gap );
+
+ if ( !( root->ascender || root->descender ) )
+ {
+ if ( face->os2.version != 0xFFFFU )
+ {
+ if ( face->os2.sTypoAscender || face->os2.sTypoDescender )
+ {
+ root->ascender = face->os2.sTypoAscender;
+ root->descender = face->os2.sTypoDescender;
+
+ root->height = (FT_Short)( root->ascender - root->descender +
+ face->os2.sTypoLineGap );
+ }
+ else
+ {
+ root->ascender = (FT_Short)face->os2.usWinAscent;
+ root->descender = -(FT_Short)face->os2.usWinDescent;
+
+ root->height = (FT_UShort)( root->ascender - root->descender );
+ }
+ }
+ }
+
+ root->max_advance_width = face->horizontal.advance_Width_Max;
+ root->max_advance_height = (FT_Short)( face->vertical_info
+ ? face->vertical.advance_Height_Max
+ : root->height );
+
+ /* See http://www.microsoft.com/OpenType/OTSpec/post.htm -- */
+ /* Adjust underline position from top edge to centre of */
+ /* stroke to convert TrueType meaning to FreeType meaning. */
+ root->underline_position = face->postscript.underlinePosition -
+ face->postscript.underlineThickness / 2;
+ root->underline_thickness = face->postscript.underlineThickness;
+ }
+
+ }
+
+ Exit:
+ FT_TRACE2(( "sfnt_load_face: done\n" ));
+
+ return error;
+ }
+
+
+#undef LOAD_
+#undef LOADM_
+#undef GET_NAME
+
+
+ FT_LOCAL_DEF( void )
+ sfnt_done_face( TT_Face face )
+ {
+ FT_Memory memory;
+ SFNT_Service sfnt;
+
+
+ if ( !face )
+ return;
+
+ memory = face->root.memory;
+ sfnt = (SFNT_Service)face->sfnt;
+
+ if ( sfnt )
+ {
+ /* destroy the postscript names table if it is loaded */
+ if ( sfnt->free_psnames )
+ sfnt->free_psnames( face );
+
+ /* destroy the embedded bitmaps table if it is loaded */
+ if ( sfnt->free_eblc )
+ sfnt->free_eblc( face );
+ }
+
+#ifdef TT_CONFIG_OPTION_BDF
+ /* freeing the embedded BDF properties */
+ tt_face_free_bdf_props( face );
+#endif
+
+ /* freeing the kerning table */
+ tt_face_done_kern( face );
+
+ /* freeing the collection table */
+ FT_FREE( face->ttc_header.offsets );
+ face->ttc_header.count = 0;
+
+ /* freeing table directory */
+ FT_FREE( face->dir_tables );
+ face->num_tables = 0;
+
+ {
+ FT_Stream stream = FT_FACE_STREAM( face );
+
+
+ /* simply release the 'cmap' table frame */
+ FT_FRAME_RELEASE( face->cmap_table );
+ face->cmap_size = 0;
+ }
+
+ /* freeing the horizontal metrics */
+ {
+ FT_Stream stream = FT_FACE_STREAM( face );
+
+
+ FT_FRAME_RELEASE( face->horz_metrics );
+ FT_FRAME_RELEASE( face->vert_metrics );
+ face->horz_metrics_size = 0;
+ face->vert_metrics_size = 0;
+ }
+
+ /* freeing the vertical ones, if any */
+ if ( face->vertical_info )
+ {
+ FT_FREE( face->vertical.long_metrics );
+ FT_FREE( face->vertical.short_metrics );
+ face->vertical_info = 0;
+ }
+
+ /* freeing the gasp table */
+ FT_FREE( face->gasp.gaspRanges );
+ face->gasp.numRanges = 0;
+
+ /* freeing the name table */
+ if ( sfnt )
+ sfnt->free_name( face );
+
+ /* freeing family and style name */
+ FT_FREE( face->root.family_name );
+ FT_FREE( face->root.style_name );
+
+ /* freeing sbit size table */
+ FT_FREE( face->root.available_sizes );
+ face->root.num_fixed_sizes = 0;
+
+ FT_FREE( face->postscript_name );
+
+ face->sfnt = 0;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfobjs.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfobjs.h
new file mode 100644
index 0000000000..10be62c5f6
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/sfobjs.h
@@ -0,0 +1,54 @@
+/***************************************************************************/
+/* */
+/* sfobjs.h */
+/* */
+/* SFNT object management (specification). */
+/* */
+/* Copyright 1996-2001, 2002 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __SFOBJS_H__
+#define __SFOBJS_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/sfnt.h"
+#include "../../include/freetype/internal/ftobjs.h"
+
+
+FT_BEGIN_HEADER
+
+
+ FT_LOCAL( FT_Error )
+ sfnt_init_face( FT_Stream stream,
+ TT_Face face,
+ FT_Int face_index,
+ FT_Int num_params,
+ FT_Parameter* params );
+
+ FT_LOCAL( FT_Error )
+ sfnt_load_face( FT_Stream stream,
+ TT_Face face,
+ FT_Int face_index,
+ FT_Int num_params,
+ FT_Parameter* params );
+
+ FT_LOCAL( void )
+ sfnt_done_face( TT_Face face );
+
+
+FT_END_HEADER
+
+#endif /* __SFDRIVER_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttbdf.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttbdf.c
new file mode 100644
index 0000000000..7fb6365a38
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttbdf.c
@@ -0,0 +1,250 @@
+/***************************************************************************/
+/* */
+/* ttbdf.c */
+/* */
+/* TrueType and OpenType embedded BDF properties (body). */
+/* */
+/* Copyright 2005, 2006, 2010, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/tttags.h"
+#include "ttbdf.h"
+
+#include "sferrors.h"
+
+
+#ifdef TT_CONFIG_OPTION_BDF
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_ttbdf
+
+
+ FT_LOCAL_DEF( void )
+ tt_face_free_bdf_props( TT_Face face )
+ {
+ TT_BDF bdf = &face->bdf;
+
+
+ if ( bdf->loaded )
+ {
+ FT_Stream stream = FT_FACE(face)->stream;
+
+
+ if ( bdf->table != NULL )
+ FT_FRAME_RELEASE( bdf->table );
+
+ bdf->table_end = NULL;
+ bdf->strings = NULL;
+ bdf->strings_size = 0;
+ }
+ }
+
+
+ static FT_Error
+ tt_face_load_bdf_props( TT_Face face,
+ FT_Stream stream )
+ {
+ TT_BDF bdf = &face->bdf;
+ FT_ULong length;
+ FT_Error error;
+
+
+ FT_ZERO( bdf );
+
+ error = tt_face_goto_table( face, TTAG_BDF, stream, &length );
+ if ( error ||
+ length < 8 ||
+ FT_FRAME_EXTRACT( length, bdf->table ) )
+ {
+ error = FT_THROW( Invalid_Table );
+ goto Exit;
+ }
+
+ bdf->table_end = bdf->table + length;
+
+ {
+ FT_Byte* p = bdf->table;
+ FT_UInt version = FT_NEXT_USHORT( p );
+ FT_UInt num_strikes = FT_NEXT_USHORT( p );
+ FT_ULong strings = FT_NEXT_ULONG ( p );
+ FT_UInt count;
+ FT_Byte* strike;
+
+
+ if ( version != 0x0001 ||
+ strings < 8 ||
+ ( strings - 8 ) / 4 < num_strikes ||
+ strings + 1 > length )
+ {
+ goto BadTable;
+ }
+
+ bdf->num_strikes = num_strikes;
+ bdf->strings = bdf->table + strings;
+ bdf->strings_size = length - strings;
+
+ count = bdf->num_strikes;
+ p = bdf->table + 8;
+ strike = p + count * 4;
+
+
+ for ( ; count > 0; count-- )
+ {
+ FT_UInt num_items = FT_PEEK_USHORT( p + 2 );
+
+ /*
+ * We don't need to check the value sets themselves, since this
+ * is done later.
+ */
+ strike += 10 * num_items;
+
+ p += 4;
+ }
+
+ if ( strike > bdf->strings )
+ goto BadTable;
+ }
+
+ bdf->loaded = 1;
+
+ Exit:
+ return error;
+
+ BadTable:
+ FT_FRAME_RELEASE( bdf->table );
+ FT_ZERO( bdf );
+ error = FT_THROW( Invalid_Table );
+ goto Exit;
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ tt_face_find_bdf_prop( TT_Face face,
+ const char* property_name,
+ BDF_PropertyRec *aprop )
+ {
+ TT_BDF bdf = &face->bdf;
+ FT_Size size = FT_FACE(face)->size;
+ FT_Error error = FT_Err_Ok;
+ FT_Byte* p;
+ FT_UInt count;
+ FT_Byte* strike;
+ FT_Offset property_len;
+
+
+ aprop->type = BDF_PROPERTY_TYPE_NONE;
+
+ if ( bdf->loaded == 0 )
+ {
+ error = tt_face_load_bdf_props( face, FT_FACE( face )->stream );
+ if ( error )
+ goto Exit;
+ }
+
+ count = bdf->num_strikes;
+ p = bdf->table + 8;
+ strike = p + 4 * count;
+
+ error = FT_ERR( Invalid_Argument );
+
+ if ( size == NULL || property_name == NULL )
+ goto Exit;
+
+ property_len = ft_strlen( property_name );
+ if ( property_len == 0 )
+ goto Exit;
+
+ for ( ; count > 0; count-- )
+ {
+ FT_UInt _ppem = FT_NEXT_USHORT( p );
+ FT_UInt _count = FT_NEXT_USHORT( p );
+
+ if ( _ppem == size->metrics.y_ppem )
+ {
+ count = _count;
+ goto FoundStrike;
+ }
+
+ strike += 10 * _count;
+ }
+ goto Exit;
+
+ FoundStrike:
+ p = strike;
+ for ( ; count > 0; count-- )
+ {
+ FT_UInt type = FT_PEEK_USHORT( p + 4 );
+
+ if ( ( type & 0x10 ) != 0 )
+ {
+ FT_UInt32 name_offset = FT_PEEK_ULONG( p );
+ FT_UInt32 value = FT_PEEK_ULONG( p + 6 );
+
+ /* be a bit paranoid for invalid entries here */
+ if ( name_offset < bdf->strings_size &&
+ property_len < bdf->strings_size - name_offset &&
+ ft_strncmp( property_name,
+ (const char*)bdf->strings + name_offset,
+ bdf->strings_size - name_offset ) == 0 )
+ {
+ switch ( type & 0x0F )
+ {
+ case 0x00: /* string */
+ case 0x01: /* atoms */
+ /* check that the content is really 0-terminated */
+ if ( value < bdf->strings_size &&
+ ft_memchr( bdf->strings + value, 0, bdf->strings_size ) )
+ {
+ aprop->type = BDF_PROPERTY_TYPE_ATOM;
+ aprop->u.atom = (const char*)bdf->strings + value;
+ error = FT_Err_Ok;
+ goto Exit;
+ }
+ break;
+
+ case 0x02:
+ aprop->type = BDF_PROPERTY_TYPE_INTEGER;
+ aprop->u.integer = (FT_Int32)value;
+ error = FT_Err_Ok;
+ goto Exit;
+
+ case 0x03:
+ aprop->type = BDF_PROPERTY_TYPE_CARDINAL;
+ aprop->u.cardinal = value;
+ error = FT_Err_Ok;
+ goto Exit;
+
+ default:
+ ;
+ }
+ }
+ }
+ p += 10;
+ }
+
+ Exit:
+ return error;
+ }
+
+#endif /* TT_CONFIG_OPTION_BDF */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttbdf.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttbdf.h
new file mode 100644
index 0000000000..f9d202274a
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttbdf.h
@@ -0,0 +1,46 @@
+/***************************************************************************/
+/* */
+/* ttbdf.h */
+/* */
+/* TrueType and OpenType embedded BDF properties (specification). */
+/* */
+/* Copyright 2005 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __TTBDF_H__
+#define __TTBDF_H__
+
+
+#include "../../include/ft2build.h"
+#include "ttload.h"
+#include "../../include/freetype/ftbdf.h"
+
+
+FT_BEGIN_HEADER
+
+
+ FT_LOCAL( void )
+ tt_face_free_bdf_props( TT_Face face );
+
+
+ FT_LOCAL( FT_Error )
+ tt_face_find_bdf_prop( TT_Face face,
+ const char* property_name,
+ BDF_PropertyRec *aprop );
+
+
+FT_END_HEADER
+
+#endif /* __TTBDF_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttcmap.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttcmap.c
new file mode 100644
index 0000000000..668ea7d0d5
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttcmap.c
@@ -0,0 +1,3560 @@
+/***************************************************************************/
+/* */
+/* ttcmap.c */
+/* */
+/* TrueType character mapping table (cmap) support (body). */
+/* */
+/* Copyright 2002-2010, 2012, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+
+#include "sferrors.h" /* must come before FT_INTERNAL_VALIDATE_H */
+
+#include "../../include/freetype/internal/ftvalid.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "ttload.h"
+#include "ttcmap.h"
+#include "sfntpic.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_ttcmap
+
+
+#define TT_PEEK_SHORT FT_PEEK_SHORT
+#define TT_PEEK_USHORT FT_PEEK_USHORT
+#define TT_PEEK_UINT24 FT_PEEK_UOFF3
+#define TT_PEEK_LONG FT_PEEK_LONG
+#define TT_PEEK_ULONG FT_PEEK_ULONG
+
+#define TT_NEXT_SHORT FT_NEXT_SHORT
+#define TT_NEXT_USHORT FT_NEXT_USHORT
+#define TT_NEXT_UINT24 FT_NEXT_UOFF3
+#define TT_NEXT_LONG FT_NEXT_LONG
+#define TT_NEXT_ULONG FT_NEXT_ULONG
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ tt_cmap_init( TT_CMap cmap,
+ FT_Byte* table )
+ {
+ cmap->data = table;
+ return FT_Err_Ok;
+ }
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** FORMAT 0 *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* TABLE OVERVIEW */
+ /* -------------- */
+ /* */
+ /* NAME OFFSET TYPE DESCRIPTION */
+ /* */
+ /* format 0 USHORT must be 0 */
+ /* length 2 USHORT table length in bytes */
+ /* language 4 USHORT Mac language code */
+ /* glyph_ids 6 BYTE[256] array of glyph indices */
+ /* 262 */
+ /* */
+
+#ifdef TT_CONFIG_CMAP_FORMAT_0
+
+ FT_CALLBACK_DEF( FT_Error )
+ tt_cmap0_validate( FT_Byte* table,
+ FT_Validator valid )
+ {
+ FT_Byte* p = table + 2;
+ FT_UInt length = TT_NEXT_USHORT( p );
+
+
+ if ( table + length > valid->limit || length < 262 )
+ FT_INVALID_TOO_SHORT;
+
+ /* check glyph indices whenever necessary */
+ if ( valid->level >= FT_VALIDATE_TIGHT )
+ {
+ FT_UInt n, idx;
+
+
+ p = table + 6;
+ for ( n = 0; n < 256; n++ )
+ {
+ idx = *p++;
+ if ( idx >= TT_VALID_GLYPH_COUNT( valid ) )
+ FT_INVALID_GLYPH_ID;
+ }
+ }
+
+ return FT_Err_Ok;
+ }
+
+
+ FT_CALLBACK_DEF( FT_UInt )
+ tt_cmap0_char_index( TT_CMap cmap,
+ FT_UInt32 char_code )
+ {
+ FT_Byte* table = cmap->data;
+
+
+ return char_code < 256 ? table[6 + char_code] : 0;
+ }
+
+
+ FT_CALLBACK_DEF( FT_UInt32 )
+ tt_cmap0_char_next( TT_CMap cmap,
+ FT_UInt32 *pchar_code )
+ {
+ FT_Byte* table = cmap->data;
+ FT_UInt32 charcode = *pchar_code;
+ FT_UInt32 result = 0;
+ FT_UInt gindex = 0;
+
+
+ table += 6; /* go to glyph IDs */
+ while ( ++charcode < 256 )
+ {
+ gindex = table[charcode];
+ if ( gindex != 0 )
+ {
+ result = charcode;
+ break;
+ }
+ }
+
+ *pchar_code = result;
+ return gindex;
+ }
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ tt_cmap0_get_info( TT_CMap cmap,
+ TT_CMapInfo *cmap_info )
+ {
+ FT_Byte* p = cmap->data + 4;
+
+
+ cmap_info->format = 0;
+ cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p );
+
+ return FT_Err_Ok;
+ }
+
+
+ FT_DEFINE_TT_CMAP(
+ tt_cmap0_class_rec,
+ sizeof ( TT_CMapRec ),
+
+ (FT_CMap_InitFunc) tt_cmap_init,
+ (FT_CMap_DoneFunc) NULL,
+ (FT_CMap_CharIndexFunc)tt_cmap0_char_index,
+ (FT_CMap_CharNextFunc) tt_cmap0_char_next,
+
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+
+ 0,
+ (TT_CMap_ValidateFunc)tt_cmap0_validate,
+ (TT_CMap_Info_GetFunc)tt_cmap0_get_info )
+
+#endif /* TT_CONFIG_CMAP_FORMAT_0 */
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** FORMAT 2 *****/
+ /***** *****/
+ /***** This is used for certain CJK encodings that encode text in a *****/
+ /***** mixed 8/16 bits encoding along the following lines: *****/
+ /***** *****/
+ /***** * Certain byte values correspond to an 8-bit character code *****/
+ /***** (typically in the range 0..127 for ASCII compatibility). *****/
+ /***** *****/
+ /***** * Certain byte values signal the first byte of a 2-byte *****/
+ /***** character code (but these values are also valid as the *****/
+ /***** second byte of a 2-byte character). *****/
+ /***** *****/
+ /***** The following charmap lookup and iteration functions all *****/
+ /***** assume that the value "charcode" correspond to following: *****/
+ /***** *****/
+ /***** - For one byte characters, "charcode" is simply the *****/
+ /***** character code. *****/
+ /***** *****/
+ /***** - For two byte characters, "charcode" is the 2-byte *****/
+ /***** character code in big endian format. More exactly: *****/
+ /***** *****/
+ /***** (charcode >> 8) is the first byte value *****/
+ /***** (charcode & 0xFF) is the second byte value *****/
+ /***** *****/
+ /***** Note that not all values of "charcode" are valid according *****/
+ /***** to these rules, and the function moderately check the *****/
+ /***** arguments. *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* TABLE OVERVIEW */
+ /* -------------- */
+ /* */
+ /* NAME OFFSET TYPE DESCRIPTION */
+ /* */
+ /* format 0 USHORT must be 2 */
+ /* length 2 USHORT table length in bytes */
+ /* language 4 USHORT Mac language code */
+ /* keys 6 USHORT[256] sub-header keys */
+ /* subs 518 SUBHEAD[NSUBS] sub-headers array */
+ /* glyph_ids 518+NSUB*8 USHORT[] glyph ID array */
+ /* */
+ /* The `keys' table is used to map charcode high-bytes to sub-headers. */
+ /* The value of `NSUBS' is the number of sub-headers defined in the */
+ /* table and is computed by finding the maximum of the `keys' table. */
+ /* */
+ /* Note that for any n, `keys[n]' is a byte offset within the `subs' */
+ /* table, i.e., it is the corresponding sub-header index multiplied */
+ /* by 8. */
+ /* */
+ /* Each sub-header has the following format: */
+ /* */
+ /* NAME OFFSET TYPE DESCRIPTION */
+ /* */
+ /* first 0 USHORT first valid low-byte */
+ /* count 2 USHORT number of valid low-bytes */
+ /* delta 4 SHORT see below */
+ /* offset 6 USHORT see below */
+ /* */
+ /* A sub-header defines, for each high-byte, the range of valid */
+ /* low-bytes within the charmap. Note that the range defined by `first' */
+ /* and `count' must be completely included in the interval [0..255] */
+ /* according to the specification. */
+ /* */
+ /* If a character code is contained within a given sub-header, then */
+ /* mapping it to a glyph index is done as follows: */
+ /* */
+ /* * The value of `offset' is read. This is a _byte_ distance from the */
+ /* location of the `offset' field itself into a slice of the */
+ /* `glyph_ids' table. Let's call it `slice' (it is a USHORT[] too). */
+ /* */
+ /* * The value `slice[char.lo - first]' is read. If it is 0, there is */
+ /* no glyph for the charcode. Otherwise, the value of `delta' is */
+ /* added to it (modulo 65536) to form a new glyph index. */
+ /* */
+ /* It is up to the validation routine to check that all offsets fall */
+ /* within the glyph IDs table (and not within the `subs' table itself or */
+ /* outside of the CMap). */
+ /* */
+
+#ifdef TT_CONFIG_CMAP_FORMAT_2
+
+ FT_CALLBACK_DEF( FT_Error )
+ tt_cmap2_validate( FT_Byte* table,
+ FT_Validator valid )
+ {
+ FT_Byte* p = table + 2; /* skip format */
+ FT_UInt length = TT_PEEK_USHORT( p );
+ FT_UInt n, max_subs;
+ FT_Byte* keys; /* keys table */
+ FT_Byte* subs; /* sub-headers */
+ FT_Byte* glyph_ids; /* glyph ID array */
+
+
+ if ( table + length > valid->limit || length < 6 + 512 )
+ FT_INVALID_TOO_SHORT;
+
+ keys = table + 6;
+
+ /* parse keys to compute sub-headers count */
+ p = keys;
+ max_subs = 0;
+ for ( n = 0; n < 256; n++ )
+ {
+ FT_UInt idx = TT_NEXT_USHORT( p );
+
+
+ /* value must be multiple of 8 */
+ if ( valid->level >= FT_VALIDATE_PARANOID && ( idx & 7 ) != 0 )
+ FT_INVALID_DATA;
+
+ idx >>= 3;
+
+ if ( idx > max_subs )
+ max_subs = idx;
+ }
+
+ FT_ASSERT( p == table + 518 );
+
+ subs = p;
+ glyph_ids = subs + (max_subs + 1) * 8;
+ if ( glyph_ids > valid->limit )
+ FT_INVALID_TOO_SHORT;
+
+ /* parse sub-headers */
+ for ( n = 0; n <= max_subs; n++ )
+ {
+ FT_UInt first_code, code_count, offset;
+ FT_Int delta;
+ FT_Byte* ids;
+
+
+ first_code = TT_NEXT_USHORT( p );
+ code_count = TT_NEXT_USHORT( p );
+ delta = TT_NEXT_SHORT( p );
+ offset = TT_NEXT_USHORT( p );
+
+ /* many Dynalab fonts have empty sub-headers */
+ if ( code_count == 0 )
+ continue;
+
+ /* check range within 0..255 */
+ if ( valid->level >= FT_VALIDATE_PARANOID )
+ {
+ if ( first_code >= 256 || first_code + code_count > 256 )
+ FT_INVALID_DATA;
+ }
+
+ /* check offset */
+ if ( offset != 0 )
+ {
+ ids = p - 2 + offset;
+ if ( ids < glyph_ids || ids + code_count*2 > table + length )
+ FT_INVALID_OFFSET;
+
+ /* check glyph IDs */
+ if ( valid->level >= FT_VALIDATE_TIGHT )
+ {
+ FT_Byte* limit = p + code_count * 2;
+ FT_UInt idx;
+
+
+ for ( ; p < limit; )
+ {
+ idx = TT_NEXT_USHORT( p );
+ if ( idx != 0 )
+ {
+ idx = ( idx + delta ) & 0xFFFFU;
+ if ( idx >= TT_VALID_GLYPH_COUNT( valid ) )
+ FT_INVALID_GLYPH_ID;
+ }
+ }
+ }
+ }
+ }
+
+ return FT_Err_Ok;
+ }
+
+
+ /* return sub header corresponding to a given character code */
+ /* NULL on invalid charcode */
+ static FT_Byte*
+ tt_cmap2_get_subheader( FT_Byte* table,
+ FT_UInt32 char_code )
+ {
+ FT_Byte* result = NULL;
+
+
+ if ( char_code < 0x10000UL )
+ {
+ FT_UInt char_lo = (FT_UInt)( char_code & 0xFF );
+ FT_UInt char_hi = (FT_UInt)( char_code >> 8 );
+ FT_Byte* p = table + 6; /* keys table */
+ FT_Byte* subs = table + 518; /* subheaders table */
+ FT_Byte* sub;
+
+
+ if ( char_hi == 0 )
+ {
+ /* an 8-bit character code -- we use subHeader 0 in this case */
+ /* to test whether the character code is in the charmap */
+ /* */
+ sub = subs; /* jump to first sub-header */
+
+ /* check that the sub-header for this byte is 0, which */
+ /* indicates that it is really a valid one-byte value */
+ /* Otherwise, return 0 */
+ /* */
+ p += char_lo * 2;
+ if ( TT_PEEK_USHORT( p ) != 0 )
+ goto Exit;
+ }
+ else
+ {
+ /* a 16-bit character code */
+
+ /* jump to key entry */
+ p += char_hi * 2;
+ /* jump to sub-header */
+ sub = subs + ( FT_PAD_FLOOR( TT_PEEK_USHORT( p ), 8 ) );
+
+ /* check that the high byte isn't a valid one-byte value */
+ if ( sub == subs )
+ goto Exit;
+ }
+ result = sub;
+ }
+ Exit:
+ return result;
+ }
+
+
+ FT_CALLBACK_DEF( FT_UInt )
+ tt_cmap2_char_index( TT_CMap cmap,
+ FT_UInt32 char_code )
+ {
+ FT_Byte* table = cmap->data;
+ FT_UInt result = 0;
+ FT_Byte* subheader;
+
+
+ subheader = tt_cmap2_get_subheader( table, char_code );
+ if ( subheader )
+ {
+ FT_Byte* p = subheader;
+ FT_UInt idx = (FT_UInt)(char_code & 0xFF);
+ FT_UInt start, count;
+ FT_Int delta;
+ FT_UInt offset;
+
+
+ start = TT_NEXT_USHORT( p );
+ count = TT_NEXT_USHORT( p );
+ delta = TT_NEXT_SHORT ( p );
+ offset = TT_PEEK_USHORT( p );
+
+ idx -= start;
+ if ( idx < count && offset != 0 )
+ {
+ p += offset + 2 * idx;
+ idx = TT_PEEK_USHORT( p );
+
+ if ( idx != 0 )
+ result = (FT_UInt)( idx + delta ) & 0xFFFFU;
+ }
+ }
+ return result;
+ }
+
+
+ FT_CALLBACK_DEF( FT_UInt32 )
+ tt_cmap2_char_next( TT_CMap cmap,
+ FT_UInt32 *pcharcode )
+ {
+ FT_Byte* table = cmap->data;
+ FT_UInt gindex = 0;
+ FT_UInt32 result = 0;
+ FT_UInt32 charcode = *pcharcode + 1;
+ FT_Byte* subheader;
+
+
+ while ( charcode < 0x10000UL )
+ {
+ subheader = tt_cmap2_get_subheader( table, charcode );
+ if ( subheader )
+ {
+ FT_Byte* p = subheader;
+ FT_UInt start = TT_NEXT_USHORT( p );
+ FT_UInt count = TT_NEXT_USHORT( p );
+ FT_Int delta = TT_NEXT_SHORT ( p );
+ FT_UInt offset = TT_PEEK_USHORT( p );
+ FT_UInt char_lo = (FT_UInt)( charcode & 0xFF );
+ FT_UInt pos, idx;
+
+
+ if ( offset == 0 )
+ goto Next_SubHeader;
+
+ if ( char_lo < start )
+ {
+ char_lo = start;
+ pos = 0;
+ }
+ else
+ pos = (FT_UInt)( char_lo - start );
+
+ p += offset + pos * 2;
+ charcode = FT_PAD_FLOOR( charcode, 256 ) + char_lo;
+
+ for ( ; pos < count; pos++, charcode++ )
+ {
+ idx = TT_NEXT_USHORT( p );
+
+ if ( idx != 0 )
+ {
+ gindex = ( idx + delta ) & 0xFFFFU;
+ if ( gindex != 0 )
+ {
+ result = charcode;
+ goto Exit;
+ }
+ }
+ }
+ }
+
+ /* jump to next sub-header, i.e. higher byte value */
+ Next_SubHeader:
+ charcode = FT_PAD_FLOOR( charcode, 256 ) + 256;
+ }
+
+ Exit:
+ *pcharcode = result;
+
+ return gindex;
+ }
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ tt_cmap2_get_info( TT_CMap cmap,
+ TT_CMapInfo *cmap_info )
+ {
+ FT_Byte* p = cmap->data + 4;
+
+
+ cmap_info->format = 2;
+ cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p );
+
+ return FT_Err_Ok;
+ }
+
+
+ FT_DEFINE_TT_CMAP(
+ tt_cmap2_class_rec,
+ sizeof ( TT_CMapRec ),
+
+ (FT_CMap_InitFunc) tt_cmap_init,
+ (FT_CMap_DoneFunc) NULL,
+ (FT_CMap_CharIndexFunc)tt_cmap2_char_index,
+ (FT_CMap_CharNextFunc) tt_cmap2_char_next,
+
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+
+ 2,
+ (TT_CMap_ValidateFunc)tt_cmap2_validate,
+ (TT_CMap_Info_GetFunc)tt_cmap2_get_info )
+
+#endif /* TT_CONFIG_CMAP_FORMAT_2 */
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** FORMAT 4 *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* TABLE OVERVIEW */
+ /* -------------- */
+ /* */
+ /* NAME OFFSET TYPE DESCRIPTION */
+ /* */
+ /* format 0 USHORT must be 4 */
+ /* length 2 USHORT table length */
+ /* in bytes */
+ /* language 4 USHORT Mac language code */
+ /* */
+ /* segCountX2 6 USHORT 2*NUM_SEGS */
+ /* searchRange 8 USHORT 2*(1 << LOG_SEGS) */
+ /* entrySelector 10 USHORT LOG_SEGS */
+ /* rangeShift 12 USHORT segCountX2 - */
+ /* searchRange */
+ /* */
+ /* endCount 14 USHORT[NUM_SEGS] end charcode for */
+ /* each segment; last */
+ /* is 0xFFFF */
+ /* */
+ /* pad 14+NUM_SEGS*2 USHORT padding */
+ /* */
+ /* startCount 16+NUM_SEGS*2 USHORT[NUM_SEGS] first charcode for */
+ /* each segment */
+ /* */
+ /* idDelta 16+NUM_SEGS*4 SHORT[NUM_SEGS] delta for each */
+ /* segment */
+ /* idOffset 16+NUM_SEGS*6 SHORT[NUM_SEGS] range offset for */
+ /* each segment; can be */
+ /* zero */
+ /* */
+ /* glyphIds 16+NUM_SEGS*8 USHORT[] array of glyph ID */
+ /* ranges */
+ /* */
+ /* Character codes are modelled by a series of ordered (increasing) */
+ /* intervals called segments. Each segment has start and end codes, */
+ /* provided by the `startCount' and `endCount' arrays. Segments must */
+ /* not overlap, and the last segment should always contain the value */
+ /* 0xFFFF for `endCount'. */
+ /* */
+ /* The fields `searchRange', `entrySelector' and `rangeShift' are better */
+ /* ignored (they are traces of over-engineering in the TrueType */
+ /* specification). */
+ /* */
+ /* Each segment also has a signed `delta', as well as an optional offset */
+ /* within the `glyphIds' table. */
+ /* */
+ /* If a segment's idOffset is 0, the glyph index corresponding to any */
+ /* charcode within the segment is obtained by adding the value of */
+ /* `idDelta' directly to the charcode, modulo 65536. */
+ /* */
+ /* Otherwise, a glyph index is taken from the glyph IDs sub-array for */
+ /* the segment, and the value of `idDelta' is added to it. */
+ /* */
+ /* */
+ /* Finally, note that a lot of fonts contain an invalid last segment, */
+ /* where `start' and `end' are correctly set to 0xFFFF but both `delta' */
+ /* and `offset' are incorrect (e.g., `opens___.ttf' which comes with */
+ /* OpenOffice.org). We need special code to deal with them correctly. */
+ /* */
+
+#ifdef TT_CONFIG_CMAP_FORMAT_4
+
+ typedef struct TT_CMap4Rec_
+ {
+ TT_CMapRec cmap;
+ FT_UInt32 cur_charcode; /* current charcode */
+ FT_UInt cur_gindex; /* current glyph index */
+
+ FT_UInt num_ranges;
+ FT_UInt cur_range;
+ FT_UInt cur_start;
+ FT_UInt cur_end;
+ FT_Int cur_delta;
+ FT_Byte* cur_values;
+
+ } TT_CMap4Rec, *TT_CMap4;
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ tt_cmap4_init( TT_CMap4 cmap,
+ FT_Byte* table )
+ {
+ FT_Byte* p;
+
+
+ cmap->cmap.data = table;
+
+ p = table + 6;
+ cmap->num_ranges = FT_PEEK_USHORT( p ) >> 1;
+ cmap->cur_charcode = (FT_UInt32)0xFFFFFFFFUL;
+ cmap->cur_gindex = 0;
+
+ return FT_Err_Ok;
+ }
+
+
+ static FT_Int
+ tt_cmap4_set_range( TT_CMap4 cmap,
+ FT_UInt range_index )
+ {
+ FT_Byte* table = cmap->cmap.data;
+ FT_Byte* p;
+ FT_UInt num_ranges = cmap->num_ranges;
+
+
+ while ( range_index < num_ranges )
+ {
+ FT_UInt offset;
+
+
+ p = table + 14 + range_index * 2;
+ cmap->cur_end = FT_PEEK_USHORT( p );
+
+ p += 2 + num_ranges * 2;
+ cmap->cur_start = FT_PEEK_USHORT( p );
+
+ p += num_ranges * 2;
+ cmap->cur_delta = FT_PEEK_SHORT( p );
+
+ p += num_ranges * 2;
+ offset = FT_PEEK_USHORT( p );
+
+ /* some fonts have an incorrect last segment; */
+ /* we have to catch it */
+ if ( range_index >= num_ranges - 1 &&
+ cmap->cur_start == 0xFFFFU &&
+ cmap->cur_end == 0xFFFFU )
+ {
+ TT_Face face = (TT_Face)cmap->cmap.cmap.charmap.face;
+ FT_Byte* limit = face->cmap_table + face->cmap_size;
+
+
+ if ( offset && p + offset + 2 > limit )
+ {
+ cmap->cur_delta = 1;
+ offset = 0;
+ }
+ }
+
+ if ( offset != 0xFFFFU )
+ {
+ cmap->cur_values = offset ? p + offset : NULL;
+ cmap->cur_range = range_index;
+ return 0;
+ }
+
+ /* we skip empty segments */
+ range_index++;
+ }
+
+ return -1;
+ }
+
+
+ /* search the index of the charcode next to cmap->cur_charcode; */
+ /* caller should call tt_cmap4_set_range with proper range */
+ /* before calling this function */
+ /* */
+ static void
+ tt_cmap4_next( TT_CMap4 cmap )
+ {
+ FT_UInt charcode;
+
+
+ if ( cmap->cur_charcode >= 0xFFFFUL )
+ goto Fail;
+
+ charcode = (FT_UInt)cmap->cur_charcode + 1;
+
+ if ( charcode < cmap->cur_start )
+ charcode = cmap->cur_start;
+
+ for ( ;; )
+ {
+ FT_Byte* values = cmap->cur_values;
+ FT_UInt end = cmap->cur_end;
+ FT_Int delta = cmap->cur_delta;
+
+
+ if ( charcode <= end )
+ {
+ if ( values )
+ {
+ FT_Byte* p = values + 2 * ( charcode - cmap->cur_start );
+
+
+ do
+ {
+ FT_UInt gindex = FT_NEXT_USHORT( p );
+
+
+ if ( gindex != 0 )
+ {
+ gindex = (FT_UInt)( ( gindex + delta ) & 0xFFFFU );
+ if ( gindex != 0 )
+ {
+ cmap->cur_charcode = charcode;
+ cmap->cur_gindex = gindex;
+ return;
+ }
+ }
+ } while ( ++charcode <= end );
+ }
+ else
+ {
+ do
+ {
+ FT_UInt gindex = (FT_UInt)( ( charcode + delta ) & 0xFFFFU );
+
+
+ if ( gindex != 0 )
+ {
+ cmap->cur_charcode = charcode;
+ cmap->cur_gindex = gindex;
+ return;
+ }
+ } while ( ++charcode <= end );
+ }
+ }
+
+ /* we need to find another range */
+ if ( tt_cmap4_set_range( cmap, cmap->cur_range + 1 ) < 0 )
+ break;
+
+ if ( charcode < cmap->cur_start )
+ charcode = cmap->cur_start;
+ }
+
+ Fail:
+ cmap->cur_charcode = (FT_UInt32)0xFFFFFFFFUL;
+ cmap->cur_gindex = 0;
+ }
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ tt_cmap4_validate( FT_Byte* table,
+ FT_Validator valid )
+ {
+ FT_Byte* p = table + 2; /* skip format */
+ FT_UInt length = TT_NEXT_USHORT( p );
+ FT_Byte *ends, *starts, *offsets, *deltas, *glyph_ids;
+ FT_UInt num_segs;
+ FT_Error error = FT_Err_Ok;
+
+
+ if ( length < 16 )
+ FT_INVALID_TOO_SHORT;
+
+ /* in certain fonts, the `length' field is invalid and goes */
+ /* out of bound. We try to correct this here... */
+ if ( table + length > valid->limit )
+ {
+ if ( valid->level >= FT_VALIDATE_TIGHT )
+ FT_INVALID_TOO_SHORT;
+
+ length = (FT_UInt)( valid->limit - table );
+ }
+
+ p = table + 6;
+ num_segs = TT_NEXT_USHORT( p ); /* read segCountX2 */
+
+ if ( valid->level >= FT_VALIDATE_PARANOID )
+ {
+ /* check that we have an even value here */
+ if ( num_segs & 1 )
+ FT_INVALID_DATA;
+ }
+
+ num_segs /= 2;
+
+ if ( length < 16 + num_segs * 2 * 4 )
+ FT_INVALID_TOO_SHORT;
+
+ /* check the search parameters - even though we never use them */
+ /* */
+ if ( valid->level >= FT_VALIDATE_PARANOID )
+ {
+ /* check the values of `searchRange', `entrySelector', `rangeShift' */
+ FT_UInt search_range = TT_NEXT_USHORT( p );
+ FT_UInt entry_selector = TT_NEXT_USHORT( p );
+ FT_UInt range_shift = TT_NEXT_USHORT( p );
+
+
+ if ( ( search_range | range_shift ) & 1 ) /* must be even values */
+ FT_INVALID_DATA;
+
+ search_range /= 2;
+ range_shift /= 2;
+
+ /* `search range' is the greatest power of 2 that is <= num_segs */
+
+ if ( search_range > num_segs ||
+ search_range * 2 < num_segs ||
+ search_range + range_shift != num_segs ||
+ search_range != ( 1U << entry_selector ) )
+ FT_INVALID_DATA;
+ }
+
+ ends = table + 14;
+ starts = table + 16 + num_segs * 2;
+ deltas = starts + num_segs * 2;
+ offsets = deltas + num_segs * 2;
+ glyph_ids = offsets + num_segs * 2;
+
+ /* check last segment; its end count value must be 0xFFFF */
+ if ( valid->level >= FT_VALIDATE_PARANOID )
+ {
+ p = ends + ( num_segs - 1 ) * 2;
+ if ( TT_PEEK_USHORT( p ) != 0xFFFFU )
+ FT_INVALID_DATA;
+ }
+
+ {
+ FT_UInt start, end, offset, n;
+ FT_UInt last_start = 0, last_end = 0;
+ FT_Int delta;
+ FT_Byte* p_start = starts;
+ FT_Byte* p_end = ends;
+ FT_Byte* p_delta = deltas;
+ FT_Byte* p_offset = offsets;
+
+
+ for ( n = 0; n < num_segs; n++ )
+ {
+ p = p_offset;
+ start = TT_NEXT_USHORT( p_start );
+ end = TT_NEXT_USHORT( p_end );
+ delta = TT_NEXT_SHORT( p_delta );
+ offset = TT_NEXT_USHORT( p_offset );
+
+ if ( start > end )
+ FT_INVALID_DATA;
+
+ /* this test should be performed at default validation level; */
+ /* unfortunately, some popular Asian fonts have overlapping */
+ /* ranges in their charmaps */
+ /* */
+ if ( start <= last_end && n > 0 )
+ {
+ if ( valid->level >= FT_VALIDATE_TIGHT )
+ FT_INVALID_DATA;
+ else
+ {
+ /* allow overlapping segments, provided their start points */
+ /* and end points, respectively, are in ascending order */
+ /* */
+ if ( last_start > start || last_end > end )
+ error |= TT_CMAP_FLAG_UNSORTED;
+ else
+ error |= TT_CMAP_FLAG_OVERLAPPING;
+ }
+ }
+
+ if ( offset && offset != 0xFFFFU )
+ {
+ p += offset; /* start of glyph ID array */
+
+ /* check that we point within the glyph IDs table only */
+ if ( valid->level >= FT_VALIDATE_TIGHT )
+ {
+ if ( p < glyph_ids ||
+ p + ( end - start + 1 ) * 2 > table + length )
+ FT_INVALID_DATA;
+ }
+ /* Some fonts handle the last segment incorrectly. In */
+ /* theory, 0xFFFF might point to an ordinary glyph -- */
+ /* a cmap 4 is versatile and could be used for any */
+ /* encoding, not only Unicode. However, reality shows */
+ /* that far too many fonts are sloppy and incorrectly */
+ /* set all fields but `start' and `end' for the last */
+ /* segment if it contains only a single character. */
+ /* */
+ /* We thus omit the test here, delaying it to the */
+ /* routines which actually access the cmap. */
+ else if ( n != num_segs - 1 ||
+ !( start == 0xFFFFU && end == 0xFFFFU ) )
+ {
+ if ( p < glyph_ids ||
+ p + ( end - start + 1 ) * 2 > valid->limit )
+ FT_INVALID_DATA;
+ }
+
+ /* check glyph indices within the segment range */
+ if ( valid->level >= FT_VALIDATE_TIGHT )
+ {
+ FT_UInt i, idx;
+
+
+ for ( i = start; i < end; i++ )
+ {
+ idx = FT_NEXT_USHORT( p );
+ if ( idx != 0 )
+ {
+ idx = (FT_UInt)( idx + delta ) & 0xFFFFU;
+
+ if ( idx >= TT_VALID_GLYPH_COUNT( valid ) )
+ FT_INVALID_GLYPH_ID;
+ }
+ }
+ }
+ }
+ else if ( offset == 0xFFFFU )
+ {
+ /* some fonts (erroneously?) use a range offset of 0xFFFF */
+ /* to mean missing glyph in cmap table */
+ /* */
+ if ( valid->level >= FT_VALIDATE_PARANOID ||
+ n != num_segs - 1 ||
+ !( start == 0xFFFFU && end == 0xFFFFU ) )
+ FT_INVALID_DATA;
+ }
+
+ last_start = start;
+ last_end = end;
+ }
+ }
+
+ return error;
+ }
+
+
+ static FT_UInt
+ tt_cmap4_char_map_linear( TT_CMap cmap,
+ FT_UInt32* pcharcode,
+ FT_Bool next )
+ {
+ FT_UInt num_segs2, start, end, offset;
+ FT_Int delta;
+ FT_UInt i, num_segs;
+ FT_UInt32 charcode = *pcharcode;
+ FT_UInt gindex = 0;
+ FT_Byte* p;
+
+
+ p = cmap->data + 6;
+ num_segs2 = FT_PAD_FLOOR( TT_PEEK_USHORT( p ), 2 );
+
+ num_segs = num_segs2 >> 1;
+
+ if ( !num_segs )
+ return 0;
+
+ if ( next )
+ charcode++;
+
+ /* linear search */
+ for ( ; charcode <= 0xFFFFU; charcode++ )
+ {
+ FT_Byte* q;
+
+
+ p = cmap->data + 14; /* ends table */
+ q = cmap->data + 16 + num_segs2; /* starts table */
+
+ for ( i = 0; i < num_segs; i++ )
+ {
+ end = TT_NEXT_USHORT( p );
+ start = TT_NEXT_USHORT( q );
+
+ if ( charcode >= start && charcode <= end )
+ {
+ p = q - 2 + num_segs2;
+ delta = TT_PEEK_SHORT( p );
+ p += num_segs2;
+ offset = TT_PEEK_USHORT( p );
+
+ /* some fonts have an incorrect last segment; */
+ /* we have to catch it */
+ if ( i >= num_segs - 1 &&
+ start == 0xFFFFU && end == 0xFFFFU )
+ {
+ TT_Face face = (TT_Face)cmap->cmap.charmap.face;
+ FT_Byte* limit = face->cmap_table + face->cmap_size;
+
+
+ if ( offset && p + offset + 2 > limit )
+ {
+ delta = 1;
+ offset = 0;
+ }
+ }
+
+ if ( offset == 0xFFFFU )
+ continue;
+
+ if ( offset )
+ {
+ p += offset + ( charcode - start ) * 2;
+ gindex = TT_PEEK_USHORT( p );
+ if ( gindex != 0 )
+ gindex = (FT_UInt)( gindex + delta ) & 0xFFFFU;
+ }
+ else
+ gindex = (FT_UInt)( charcode + delta ) & 0xFFFFU;
+
+ break;
+ }
+ }
+
+ if ( !next || gindex )
+ break;
+ }
+
+ if ( next && gindex )
+ *pcharcode = charcode;
+
+ return gindex;
+ }
+
+
+ static FT_UInt
+ tt_cmap4_char_map_binary( TT_CMap cmap,
+ FT_UInt32* pcharcode,
+ FT_Bool next )
+ {
+ FT_UInt num_segs2, start, end, offset;
+ FT_Int delta;
+ FT_UInt max, min, mid, num_segs;
+ FT_UInt charcode = (FT_UInt)*pcharcode;
+ FT_UInt gindex = 0;
+ FT_Byte* p;
+
+
+ p = cmap->data + 6;
+ num_segs2 = FT_PAD_FLOOR( TT_PEEK_USHORT( p ), 2 );
+
+ if ( !num_segs2 )
+ return 0;
+
+ num_segs = num_segs2 >> 1;
+
+ /* make compiler happy */
+ mid = num_segs;
+ end = 0xFFFFU;
+
+ if ( next )
+ charcode++;
+
+ min = 0;
+ max = num_segs;
+
+ /* binary search */
+ while ( min < max )
+ {
+ mid = ( min + max ) >> 1;
+ p = cmap->data + 14 + mid * 2;
+ end = TT_PEEK_USHORT( p );
+ p += 2 + num_segs2;
+ start = TT_PEEK_USHORT( p );
+
+ if ( charcode < start )
+ max = mid;
+ else if ( charcode > end )
+ min = mid + 1;
+ else
+ {
+ p += num_segs2;
+ delta = TT_PEEK_SHORT( p );
+ p += num_segs2;
+ offset = TT_PEEK_USHORT( p );
+
+ /* some fonts have an incorrect last segment; */
+ /* we have to catch it */
+ if ( mid >= num_segs - 1 &&
+ start == 0xFFFFU && end == 0xFFFFU )
+ {
+ TT_Face face = (TT_Face)cmap->cmap.charmap.face;
+ FT_Byte* limit = face->cmap_table + face->cmap_size;
+
+
+ if ( offset && p + offset + 2 > limit )
+ {
+ delta = 1;
+ offset = 0;
+ }
+ }
+
+ /* search the first segment containing `charcode' */
+ if ( cmap->flags & TT_CMAP_FLAG_OVERLAPPING )
+ {
+ FT_UInt i;
+
+
+ /* call the current segment `max' */
+ max = mid;
+
+ if ( offset == 0xFFFFU )
+ mid = max + 1;
+
+ /* search in segments before the current segment */
+ for ( i = max ; i > 0; i-- )
+ {
+ FT_UInt prev_end;
+ FT_Byte* old_p;
+
+
+ old_p = p;
+ p = cmap->data + 14 + ( i - 1 ) * 2;
+ prev_end = TT_PEEK_USHORT( p );
+
+ if ( charcode > prev_end )
+ {
+ p = old_p;
+ break;
+ }
+
+ end = prev_end;
+ p += 2 + num_segs2;
+ start = TT_PEEK_USHORT( p );
+ p += num_segs2;
+ delta = TT_PEEK_SHORT( p );
+ p += num_segs2;
+ offset = TT_PEEK_USHORT( p );
+
+ if ( offset != 0xFFFFU )
+ mid = i - 1;
+ }
+
+ /* no luck */
+ if ( mid == max + 1 )
+ {
+ if ( i != max )
+ {
+ p = cmap->data + 14 + max * 2;
+ end = TT_PEEK_USHORT( p );
+ p += 2 + num_segs2;
+ start = TT_PEEK_USHORT( p );
+ p += num_segs2;
+ delta = TT_PEEK_SHORT( p );
+ p += num_segs2;
+ offset = TT_PEEK_USHORT( p );
+ }
+
+ mid = max;
+
+ /* search in segments after the current segment */
+ for ( i = max + 1; i < num_segs; i++ )
+ {
+ FT_UInt next_end, next_start;
+
+
+ p = cmap->data + 14 + i * 2;
+ next_end = TT_PEEK_USHORT( p );
+ p += 2 + num_segs2;
+ next_start = TT_PEEK_USHORT( p );
+
+ if ( charcode < next_start )
+ break;
+
+ end = next_end;
+ start = next_start;
+ p += num_segs2;
+ delta = TT_PEEK_SHORT( p );
+ p += num_segs2;
+ offset = TT_PEEK_USHORT( p );
+
+ if ( offset != 0xFFFFU )
+ mid = i;
+ }
+ i--;
+
+ /* still no luck */
+ if ( mid == max )
+ {
+ mid = i;
+
+ break;
+ }
+ }
+
+ /* end, start, delta, and offset are for the i'th segment */
+ if ( mid != i )
+ {
+ p = cmap->data + 14 + mid * 2;
+ end = TT_PEEK_USHORT( p );
+ p += 2 + num_segs2;
+ start = TT_PEEK_USHORT( p );
+ p += num_segs2;
+ delta = TT_PEEK_SHORT( p );
+ p += num_segs2;
+ offset = TT_PEEK_USHORT( p );
+ }
+ }
+ else
+ {
+ if ( offset == 0xFFFFU )
+ break;
+ }
+
+ if ( offset )
+ {
+ p += offset + ( charcode - start ) * 2;
+ gindex = TT_PEEK_USHORT( p );
+ if ( gindex != 0 )
+ gindex = (FT_UInt)( gindex + delta ) & 0xFFFFU;
+ }
+ else
+ gindex = (FT_UInt)( charcode + delta ) & 0xFFFFU;
+
+ break;
+ }
+ }
+
+ if ( next )
+ {
+ TT_CMap4 cmap4 = (TT_CMap4)cmap;
+
+
+ /* if `charcode' is not in any segment, then `mid' is */
+ /* the segment nearest to `charcode' */
+ /* */
+
+ if ( charcode > end )
+ {
+ mid++;
+ if ( mid == num_segs )
+ return 0;
+ }
+
+ if ( tt_cmap4_set_range( cmap4, mid ) )
+ {
+ if ( gindex )
+ *pcharcode = charcode;
+ }
+ else
+ {
+ cmap4->cur_charcode = charcode;
+
+ if ( gindex )
+ cmap4->cur_gindex = gindex;
+ else
+ {
+ cmap4->cur_charcode = charcode;
+ tt_cmap4_next( cmap4 );
+ gindex = cmap4->cur_gindex;
+ }
+
+ if ( gindex )
+ *pcharcode = cmap4->cur_charcode;
+ }
+ }
+
+ return gindex;
+ }
+
+
+ FT_CALLBACK_DEF( FT_UInt )
+ tt_cmap4_char_index( TT_CMap cmap,
+ FT_UInt32 char_code )
+ {
+ if ( char_code >= 0x10000UL )
+ return 0;
+
+ if ( cmap->flags & TT_CMAP_FLAG_UNSORTED )
+ return tt_cmap4_char_map_linear( cmap, &char_code, 0 );
+ else
+ return tt_cmap4_char_map_binary( cmap, &char_code, 0 );
+ }
+
+
+ FT_CALLBACK_DEF( FT_UInt32 )
+ tt_cmap4_char_next( TT_CMap cmap,
+ FT_UInt32 *pchar_code )
+ {
+ FT_UInt gindex;
+
+
+ if ( *pchar_code >= 0xFFFFU )
+ return 0;
+
+ if ( cmap->flags & TT_CMAP_FLAG_UNSORTED )
+ gindex = tt_cmap4_char_map_linear( cmap, pchar_code, 1 );
+ else
+ {
+ TT_CMap4 cmap4 = (TT_CMap4)cmap;
+
+
+ /* no need to search */
+ if ( *pchar_code == cmap4->cur_charcode )
+ {
+ tt_cmap4_next( cmap4 );
+ gindex = cmap4->cur_gindex;
+ if ( gindex )
+ *pchar_code = cmap4->cur_charcode;
+ }
+ else
+ gindex = tt_cmap4_char_map_binary( cmap, pchar_code, 1 );
+ }
+
+ return gindex;
+ }
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ tt_cmap4_get_info( TT_CMap cmap,
+ TT_CMapInfo *cmap_info )
+ {
+ FT_Byte* p = cmap->data + 4;
+
+
+ cmap_info->format = 4;
+ cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p );
+
+ return FT_Err_Ok;
+ }
+
+
+ FT_DEFINE_TT_CMAP(
+ tt_cmap4_class_rec,
+ sizeof ( TT_CMap4Rec ),
+ (FT_CMap_InitFunc) tt_cmap4_init,
+ (FT_CMap_DoneFunc) NULL,
+ (FT_CMap_CharIndexFunc)tt_cmap4_char_index,
+ (FT_CMap_CharNextFunc) tt_cmap4_char_next,
+
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+
+ 4,
+ (TT_CMap_ValidateFunc)tt_cmap4_validate,
+ (TT_CMap_Info_GetFunc)tt_cmap4_get_info )
+
+#endif /* TT_CONFIG_CMAP_FORMAT_4 */
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** FORMAT 6 *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* TABLE OVERVIEW */
+ /* -------------- */
+ /* */
+ /* NAME OFFSET TYPE DESCRIPTION */
+ /* */
+ /* format 0 USHORT must be 4 */
+ /* length 2 USHORT table length in bytes */
+ /* language 4 USHORT Mac language code */
+ /* */
+ /* first 6 USHORT first segment code */
+ /* count 8 USHORT segment size in chars */
+ /* glyphIds 10 USHORT[count] glyph IDs */
+ /* */
+ /* A very simplified segment mapping. */
+ /* */
+
+#ifdef TT_CONFIG_CMAP_FORMAT_6
+
+ FT_CALLBACK_DEF( FT_Error )
+ tt_cmap6_validate( FT_Byte* table,
+ FT_Validator valid )
+ {
+ FT_Byte* p;
+ FT_UInt length, count;
+
+
+ if ( table + 10 > valid->limit )
+ FT_INVALID_TOO_SHORT;
+
+ p = table + 2;
+ length = TT_NEXT_USHORT( p );
+
+ p = table + 8; /* skip language and start index */
+ count = TT_NEXT_USHORT( p );
+
+ if ( table + length > valid->limit || length < 10 + count/* * 2 */) // Zhangxuefeng 2013.12.23. remove count multiply 2.
+ FT_INVALID_TOO_SHORT;
+
+ /* check glyph indices */
+ if ( valid->level >= FT_VALIDATE_TIGHT )
+ {
+ FT_UInt gindex;
+
+
+ for ( ; count > 0; count-- )
+ {
+ gindex = TT_NEXT_USHORT( p );
+ if ( gindex >= TT_VALID_GLYPH_COUNT( valid ) )
+ FT_INVALID_GLYPH_ID;
+ }
+ }
+
+ return FT_Err_Ok;
+ }
+
+
+ FT_CALLBACK_DEF( FT_UInt )
+ tt_cmap6_char_index( TT_CMap cmap,
+ FT_UInt32 char_code )
+ {
+ FT_Byte* table = cmap->data;
+ FT_UInt result = 0;
+ FT_Byte* p = table + 6;
+ FT_UInt start = TT_NEXT_USHORT( p );
+ FT_UInt count = TT_NEXT_USHORT( p );
+ FT_UInt idx = (FT_UInt)( char_code - start );
+
+
+ if ( idx < count )
+ {
+ p += 2 * idx;
+ result = TT_PEEK_USHORT( p );
+ }
+ return result;
+ }
+
+
+ FT_CALLBACK_DEF( FT_UInt32 )
+ tt_cmap6_char_next( TT_CMap cmap,
+ FT_UInt32 *pchar_code )
+ {
+ FT_Byte* table = cmap->data;
+ FT_UInt32 result = 0;
+ FT_UInt32 char_code = *pchar_code + 1;
+ FT_UInt gindex = 0;
+
+ FT_Byte* p = table + 6;
+ FT_UInt start = TT_NEXT_USHORT( p );
+ FT_UInt count = TT_NEXT_USHORT( p );
+ FT_UInt idx;
+
+
+ if ( char_code >= 0x10000UL )
+ goto Exit;
+
+ if ( char_code < start )
+ char_code = start;
+
+ idx = (FT_UInt)( char_code - start );
+ p += 2 * idx;
+
+ for ( ; idx < count; idx++ )
+ {
+ gindex = TT_NEXT_USHORT( p );
+ if ( gindex != 0 )
+ {
+ result = char_code;
+ break;
+ }
+ char_code++;
+ }
+
+ Exit:
+ *pchar_code = result;
+ return gindex;
+ }
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ tt_cmap6_get_info( TT_CMap cmap,
+ TT_CMapInfo *cmap_info )
+ {
+ FT_Byte* p = cmap->data + 4;
+
+
+ cmap_info->format = 6;
+ cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p );
+
+ return FT_Err_Ok;
+ }
+
+
+ FT_DEFINE_TT_CMAP(
+ tt_cmap6_class_rec,
+ sizeof ( TT_CMapRec ),
+
+ (FT_CMap_InitFunc) tt_cmap_init,
+ (FT_CMap_DoneFunc) NULL,
+ (FT_CMap_CharIndexFunc)tt_cmap6_char_index,
+ (FT_CMap_CharNextFunc) tt_cmap6_char_next,
+
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+
+ 6,
+ (TT_CMap_ValidateFunc)tt_cmap6_validate,
+ (TT_CMap_Info_GetFunc)tt_cmap6_get_info )
+
+#endif /* TT_CONFIG_CMAP_FORMAT_6 */
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** FORMAT 8 *****/
+ /***** *****/
+ /***** It is hard to completely understand what the OpenType spec *****/
+ /***** says about this format, but here is my conclusion. *****/
+ /***** *****/
+ /***** The purpose of this format is to easily map UTF-16 text to *****/
+ /***** glyph indices. Basically, the `char_code' must be in one of *****/
+ /***** the following formats: *****/
+ /***** *****/
+ /***** - A 16-bit value that isn't part of the Unicode Surrogates *****/
+ /***** Area (i.e. U+D800-U+DFFF). *****/
+ /***** *****/
+ /***** - A 32-bit value, made of two surrogate values, i.e.. if *****/
+ /***** `char_code = (char_hi << 16) | char_lo', then both *****/
+ /***** `char_hi' and `char_lo' must be in the Surrogates Area. *****/
+ /***** Area. *****/
+ /***** *****/
+ /***** The `is32' table embedded in the charmap indicates whether a *****/
+ /***** given 16-bit value is in the surrogates area or not. *****/
+ /***** *****/
+ /***** So, for any given `char_code', we can assert the following: *****/
+ /***** *****/
+ /***** If `char_hi == 0' then we must have `is32[char_lo] == 0'. *****/
+ /***** *****/
+ /***** If `char_hi != 0' then we must have both *****/
+ /***** `is32[char_hi] != 0' and `is32[char_lo] != 0'. *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* TABLE OVERVIEW */
+ /* -------------- */
+ /* */
+ /* NAME OFFSET TYPE DESCRIPTION */
+ /* */
+ /* format 0 USHORT must be 8 */
+ /* reserved 2 USHORT reserved */
+ /* length 4 ULONG length in bytes */
+ /* language 8 ULONG Mac language code */
+ /* is32 12 BYTE[8192] 32-bitness bitmap */
+ /* count 8204 ULONG number of groups */
+ /* */
+ /* This header is followed by `count' groups of the following format: */
+ /* */
+ /* start 0 ULONG first charcode */
+ /* end 4 ULONG last charcode */
+ /* startId 8 ULONG start glyph ID for the group */
+ /* */
+
+#ifdef TT_CONFIG_CMAP_FORMAT_8
+
+ FT_CALLBACK_DEF( FT_Error )
+ tt_cmap8_validate( FT_Byte* table,
+ FT_Validator valid )
+ {
+ FT_Byte* p = table + 4;
+ FT_Byte* is32;
+ FT_UInt32 length;
+ FT_UInt32 num_groups;
+
+
+ if ( table + 16 + 8192 > valid->limit )
+ FT_INVALID_TOO_SHORT;
+
+ length = TT_NEXT_ULONG( p );
+ if ( length > (FT_UInt32)( valid->limit - table ) || length < 8192 + 16 )
+ FT_INVALID_TOO_SHORT;
+
+ is32 = table + 12;
+ p = is32 + 8192; /* skip `is32' array */
+ num_groups = TT_NEXT_ULONG( p );
+
+ if ( p + num_groups * 12 > valid->limit )
+ FT_INVALID_TOO_SHORT;
+
+ /* check groups, they must be in increasing order */
+ {
+ FT_UInt32 n, start, end, start_id, count, last = 0;
+
+
+ for ( n = 0; n < num_groups; n++ )
+ {
+ FT_UInt hi, lo;
+
+
+ start = TT_NEXT_ULONG( p );
+ end = TT_NEXT_ULONG( p );
+ start_id = TT_NEXT_ULONG( p );
+
+ if ( start > end )
+ FT_INVALID_DATA;
+
+ if ( n > 0 && start <= last )
+ FT_INVALID_DATA;
+
+ if ( valid->level >= FT_VALIDATE_TIGHT )
+ {
+ if ( start_id + end - start >= TT_VALID_GLYPH_COUNT( valid ) )
+ FT_INVALID_GLYPH_ID;
+
+ count = (FT_UInt32)( end - start + 1 );
+
+ if ( start & ~0xFFFFU )
+ {
+ /* start_hi != 0; check that is32[i] is 1 for each i in */
+ /* the `hi' and `lo' of the range [start..end] */
+ for ( ; count > 0; count--, start++ )
+ {
+ hi = (FT_UInt)( start >> 16 );
+ lo = (FT_UInt)( start & 0xFFFFU );
+
+ if ( (is32[hi >> 3] & ( 0x80 >> ( hi & 7 ) ) ) == 0 )
+ FT_INVALID_DATA;
+
+ if ( (is32[lo >> 3] & ( 0x80 >> ( lo & 7 ) ) ) == 0 )
+ FT_INVALID_DATA;
+ }
+ }
+ else
+ {
+ /* start_hi == 0; check that is32[i] is 0 for each i in */
+ /* the range [start..end] */
+
+ /* end_hi cannot be != 0! */
+ if ( end & ~0xFFFFU )
+ FT_INVALID_DATA;
+
+ for ( ; count > 0; count--, start++ )
+ {
+ lo = (FT_UInt)( start & 0xFFFFU );
+
+ if ( (is32[lo >> 3] & ( 0x80 >> ( lo & 7 ) ) ) != 0 )
+ FT_INVALID_DATA;
+ }
+ }
+ }
+
+ last = end;
+ }
+ }
+
+ return FT_Err_Ok;
+ }
+
+
+ FT_CALLBACK_DEF( FT_UInt )
+ tt_cmap8_char_index( TT_CMap cmap,
+ FT_UInt32 char_code )
+ {
+ FT_Byte* table = cmap->data;
+ FT_UInt result = 0;
+ FT_Byte* p = table + 8204;
+ FT_UInt32 num_groups = TT_NEXT_ULONG( p );
+ FT_UInt32 start, end, start_id;
+
+
+ for ( ; num_groups > 0; num_groups-- )
+ {
+ start = TT_NEXT_ULONG( p );
+ end = TT_NEXT_ULONG( p );
+ start_id = TT_NEXT_ULONG( p );
+
+ if ( char_code < start )
+ break;
+
+ if ( char_code <= end )
+ {
+ result = (FT_UInt)( start_id + char_code - start );
+ break;
+ }
+ }
+ return result;
+ }
+
+
+ FT_CALLBACK_DEF( FT_UInt32 )
+ tt_cmap8_char_next( TT_CMap cmap,
+ FT_UInt32 *pchar_code )
+ {
+ FT_UInt32 result = 0;
+ FT_UInt32 char_code = *pchar_code + 1;
+ FT_UInt gindex = 0;
+ FT_Byte* table = cmap->data;
+ FT_Byte* p = table + 8204;
+ FT_UInt32 num_groups = TT_NEXT_ULONG( p );
+ FT_UInt32 start, end, start_id;
+
+
+ p = table + 8208;
+
+ for ( ; num_groups > 0; num_groups-- )
+ {
+ start = TT_NEXT_ULONG( p );
+ end = TT_NEXT_ULONG( p );
+ start_id = TT_NEXT_ULONG( p );
+
+ if ( char_code < start )
+ char_code = start;
+
+ if ( char_code <= end )
+ {
+ gindex = (FT_UInt)( char_code - start + start_id );
+ if ( gindex != 0 )
+ {
+ result = char_code;
+ goto Exit;
+ }
+ }
+ }
+
+ Exit:
+ *pchar_code = result;
+ return gindex;
+ }
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ tt_cmap8_get_info( TT_CMap cmap,
+ TT_CMapInfo *cmap_info )
+ {
+ FT_Byte* p = cmap->data + 8;
+
+
+ cmap_info->format = 8;
+ cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p );
+
+ return FT_Err_Ok;
+ }
+
+
+ FT_DEFINE_TT_CMAP(
+ tt_cmap8_class_rec,
+ sizeof ( TT_CMapRec ),
+
+ (FT_CMap_InitFunc) tt_cmap_init,
+ (FT_CMap_DoneFunc) NULL,
+ (FT_CMap_CharIndexFunc)tt_cmap8_char_index,
+ (FT_CMap_CharNextFunc) tt_cmap8_char_next,
+
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+
+ 8,
+ (TT_CMap_ValidateFunc)tt_cmap8_validate,
+ (TT_CMap_Info_GetFunc)tt_cmap8_get_info )
+
+#endif /* TT_CONFIG_CMAP_FORMAT_8 */
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** FORMAT 10 *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* TABLE OVERVIEW */
+ /* -------------- */
+ /* */
+ /* NAME OFFSET TYPE DESCRIPTION */
+ /* */
+ /* format 0 USHORT must be 10 */
+ /* reserved 2 USHORT reserved */
+ /* length 4 ULONG length in bytes */
+ /* language 8 ULONG Mac language code */
+ /* */
+ /* start 12 ULONG first char in range */
+ /* count 16 ULONG number of chars in range */
+ /* glyphIds 20 USHORT[count] glyph indices covered */
+ /* */
+
+#ifdef TT_CONFIG_CMAP_FORMAT_10
+
+ FT_CALLBACK_DEF( FT_Error )
+ tt_cmap10_validate( FT_Byte* table,
+ FT_Validator valid )
+ {
+ FT_Byte* p = table + 4;
+ FT_ULong length, count;
+
+
+ if ( table + 20 > valid->limit )
+ FT_INVALID_TOO_SHORT;
+
+ length = TT_NEXT_ULONG( p );
+ p = table + 16;
+ count = TT_NEXT_ULONG( p );
+
+ if ( length > (FT_ULong)( valid->limit - table ) ||
+ length < 20 + count * 2 )
+ FT_INVALID_TOO_SHORT;
+
+ /* check glyph indices */
+ if ( valid->level >= FT_VALIDATE_TIGHT )
+ {
+ FT_UInt gindex;
+
+
+ for ( ; count > 0; count-- )
+ {
+ gindex = TT_NEXT_USHORT( p );
+ if ( gindex >= TT_VALID_GLYPH_COUNT( valid ) )
+ FT_INVALID_GLYPH_ID;
+ }
+ }
+
+ return FT_Err_Ok;
+ }
+
+
+ FT_CALLBACK_DEF( FT_UInt )
+ tt_cmap10_char_index( TT_CMap cmap,
+ FT_UInt32 char_code )
+ {
+ FT_Byte* table = cmap->data;
+ FT_UInt result = 0;
+ FT_Byte* p = table + 12;
+ FT_UInt32 start = TT_NEXT_ULONG( p );
+ FT_UInt32 count = TT_NEXT_ULONG( p );
+ FT_UInt32 idx = (FT_ULong)( char_code - start );
+
+
+ if ( idx < count )
+ {
+ p += 2 * idx;
+ result = TT_PEEK_USHORT( p );
+ }
+ return result;
+ }
+
+
+ FT_CALLBACK_DEF( FT_UInt32 )
+ tt_cmap10_char_next( TT_CMap cmap,
+ FT_UInt32 *pchar_code )
+ {
+ FT_Byte* table = cmap->data;
+ FT_UInt32 char_code = *pchar_code + 1;
+ FT_UInt gindex = 0;
+ FT_Byte* p = table + 12;
+ FT_UInt32 start = TT_NEXT_ULONG( p );
+ FT_UInt32 count = TT_NEXT_ULONG( p );
+ FT_UInt32 idx;
+
+
+ if ( char_code < start )
+ char_code = start;
+
+ idx = (FT_UInt32)( char_code - start );
+ p += 2 * idx;
+
+ for ( ; idx < count; idx++ )
+ {
+ gindex = TT_NEXT_USHORT( p );
+ if ( gindex != 0 )
+ break;
+ char_code++;
+ }
+
+ *pchar_code = char_code;
+ return gindex;
+ }
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ tt_cmap10_get_info( TT_CMap cmap,
+ TT_CMapInfo *cmap_info )
+ {
+ FT_Byte* p = cmap->data + 8;
+
+
+ cmap_info->format = 10;
+ cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p );
+
+ return FT_Err_Ok;
+ }
+
+
+ FT_DEFINE_TT_CMAP(
+ tt_cmap10_class_rec,
+ sizeof ( TT_CMapRec ),
+
+ (FT_CMap_InitFunc) tt_cmap_init,
+ (FT_CMap_DoneFunc) NULL,
+ (FT_CMap_CharIndexFunc)tt_cmap10_char_index,
+ (FT_CMap_CharNextFunc) tt_cmap10_char_next,
+
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+
+ 10,
+ (TT_CMap_ValidateFunc)tt_cmap10_validate,
+ (TT_CMap_Info_GetFunc)tt_cmap10_get_info )
+
+#endif /* TT_CONFIG_CMAP_FORMAT_10 */
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** FORMAT 12 *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* TABLE OVERVIEW */
+ /* -------------- */
+ /* */
+ /* NAME OFFSET TYPE DESCRIPTION */
+ /* */
+ /* format 0 USHORT must be 12 */
+ /* reserved 2 USHORT reserved */
+ /* length 4 ULONG length in bytes */
+ /* language 8 ULONG Mac language code */
+ /* count 12 ULONG number of groups */
+ /* 16 */
+ /* */
+ /* This header is followed by `count' groups of the following format: */
+ /* */
+ /* start 0 ULONG first charcode */
+ /* end 4 ULONG last charcode */
+ /* startId 8 ULONG start glyph ID for the group */
+ /* */
+
+#ifdef TT_CONFIG_CMAP_FORMAT_12
+
+ typedef struct TT_CMap12Rec_
+ {
+ TT_CMapRec cmap;
+ FT_Bool valid;
+ FT_ULong cur_charcode;
+ FT_UInt cur_gindex;
+ FT_ULong cur_group;
+ FT_ULong num_groups;
+
+ } TT_CMap12Rec, *TT_CMap12;
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ tt_cmap12_init( TT_CMap12 cmap,
+ FT_Byte* table )
+ {
+ cmap->cmap.data = table;
+
+ table += 12;
+ cmap->num_groups = FT_PEEK_ULONG( table );
+
+ cmap->valid = 0;
+
+ return FT_Err_Ok;
+ }
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ tt_cmap12_validate( FT_Byte* table,
+ FT_Validator valid )
+ {
+ FT_Byte* p;
+ FT_ULong length;
+ FT_ULong num_groups;
+
+
+ if ( table + 16 > valid->limit )
+ FT_INVALID_TOO_SHORT;
+
+ p = table + 4;
+ length = TT_NEXT_ULONG( p );
+
+ p = table + 12;
+ num_groups = TT_NEXT_ULONG( p );
+
+ if ( length > (FT_ULong)( valid->limit - table ) ||
+ length < 16 + 12 * num_groups )
+ FT_INVALID_TOO_SHORT;
+
+ /* check groups, they must be in increasing order */
+ {
+ FT_ULong n, start, end, start_id, last = 0;
+
+
+ for ( n = 0; n < num_groups; n++ )
+ {
+ start = TT_NEXT_ULONG( p );
+ end = TT_NEXT_ULONG( p );
+ start_id = TT_NEXT_ULONG( p );
+
+ if ( start > end )
+ FT_INVALID_DATA;
+
+ if ( n > 0 && start <= last )
+ FT_INVALID_DATA;
+
+ if ( valid->level >= FT_VALIDATE_TIGHT )
+ {
+ if ( start_id + end - start >= TT_VALID_GLYPH_COUNT( valid ) )
+ FT_INVALID_GLYPH_ID;
+ }
+
+ last = end;
+ }
+ }
+
+ return FT_Err_Ok;
+ }
+
+
+ /* search the index of the charcode next to cmap->cur_charcode */
+ /* cmap->cur_group should be set up properly by caller */
+ /* */
+ static void
+ tt_cmap12_next( TT_CMap12 cmap )
+ {
+ FT_Byte* p;
+ FT_ULong start, end, start_id, char_code;
+ FT_ULong n;
+ FT_UInt gindex;
+
+
+ if ( cmap->cur_charcode >= 0xFFFFFFFFUL )
+ goto Fail;
+
+ char_code = cmap->cur_charcode + 1;
+
+ n = cmap->cur_group;
+
+ for ( n = cmap->cur_group; n < cmap->num_groups; n++ )
+ {
+ p = cmap->cmap.data + 16 + 12 * n;
+ start = TT_NEXT_ULONG( p );
+ end = TT_NEXT_ULONG( p );
+ start_id = TT_PEEK_ULONG( p );
+
+ if ( char_code < start )
+ char_code = start;
+
+ for ( ; char_code <= end; char_code++ )
+ {
+ gindex = (FT_UInt)( start_id + char_code - start );
+
+ if ( gindex )
+ {
+ cmap->cur_charcode = char_code;;
+ cmap->cur_gindex = gindex;
+ cmap->cur_group = n;
+
+ return;
+ }
+ }
+ }
+
+ Fail:
+ cmap->valid = 0;
+ }
+
+
+ static FT_UInt
+ tt_cmap12_char_map_binary( TT_CMap cmap,
+ FT_UInt32* pchar_code,
+ FT_Bool next )
+ {
+ FT_UInt gindex = 0;
+ FT_Byte* p = cmap->data + 12;
+ FT_UInt32 num_groups = TT_PEEK_ULONG( p );
+ FT_UInt32 char_code = *pchar_code;
+ FT_UInt32 start, end, start_id;
+ FT_UInt32 max, min, mid;
+
+
+ if ( !num_groups )
+ return 0;
+
+ /* make compiler happy */
+ mid = num_groups;
+ end = 0xFFFFFFFFUL;
+
+ if ( next )
+ char_code++;
+
+ min = 0;
+ max = num_groups;
+
+ /* binary search */
+ while ( min < max )
+ {
+ mid = ( min + max ) >> 1;
+ p = cmap->data + 16 + 12 * mid;
+
+ start = TT_NEXT_ULONG( p );
+ end = TT_NEXT_ULONG( p );
+
+ if ( char_code < start )
+ max = mid;
+ else if ( char_code > end )
+ min = mid + 1;
+ else
+ {
+ start_id = TT_PEEK_ULONG( p );
+ gindex = (FT_UInt)( start_id + char_code - start );
+
+ break;
+ }
+ }
+
+ if ( next )
+ {
+ TT_CMap12 cmap12 = (TT_CMap12)cmap;
+
+
+ /* if `char_code' is not in any group, then `mid' is */
+ /* the group nearest to `char_code' */
+ /* */
+
+ if ( char_code > end )
+ {
+ mid++;
+ if ( mid == num_groups )
+ return 0;
+ }
+
+ cmap12->valid = 1;
+ cmap12->cur_charcode = char_code;
+ cmap12->cur_group = mid;
+
+ if ( !gindex )
+ {
+ tt_cmap12_next( cmap12 );
+
+ if ( cmap12->valid )
+ gindex = cmap12->cur_gindex;
+ }
+ else
+ cmap12->cur_gindex = gindex;
+
+ if ( gindex )
+ *pchar_code = cmap12->cur_charcode;
+ }
+
+ return gindex;
+ }
+
+
+ FT_CALLBACK_DEF( FT_UInt )
+ tt_cmap12_char_index( TT_CMap cmap,
+ FT_UInt32 char_code )
+ {
+ return tt_cmap12_char_map_binary( cmap, &char_code, 0 );
+ }
+
+
+ FT_CALLBACK_DEF( FT_UInt32 )
+ tt_cmap12_char_next( TT_CMap cmap,
+ FT_UInt32 *pchar_code )
+ {
+ TT_CMap12 cmap12 = (TT_CMap12)cmap;
+ FT_ULong gindex;
+
+
+ if ( cmap12->cur_charcode >= 0xFFFFFFFFUL )
+ return 0;
+
+ /* no need to search */
+ if ( cmap12->valid && cmap12->cur_charcode == *pchar_code )
+ {
+ tt_cmap12_next( cmap12 );
+ if ( cmap12->valid )
+ {
+ gindex = cmap12->cur_gindex;
+
+ /* XXX: check cur_charcode overflow is expected */
+ if ( gindex )
+ *pchar_code = (FT_UInt32)cmap12->cur_charcode;
+ }
+ else
+ gindex = 0;
+ }
+ else
+ gindex = tt_cmap12_char_map_binary( cmap, pchar_code, 1 );
+
+ /* XXX: check gindex overflow is expected */
+ return (FT_UInt32)gindex;
+ }
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ tt_cmap12_get_info( TT_CMap cmap,
+ TT_CMapInfo *cmap_info )
+ {
+ FT_Byte* p = cmap->data + 8;
+
+
+ cmap_info->format = 12;
+ cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p );
+
+ return FT_Err_Ok;
+ }
+
+
+ FT_DEFINE_TT_CMAP(
+ tt_cmap12_class_rec,
+ sizeof ( TT_CMap12Rec ),
+
+ (FT_CMap_InitFunc) tt_cmap12_init,
+ (FT_CMap_DoneFunc) NULL,
+ (FT_CMap_CharIndexFunc)tt_cmap12_char_index,
+ (FT_CMap_CharNextFunc) tt_cmap12_char_next,
+
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+
+ 12,
+ (TT_CMap_ValidateFunc)tt_cmap12_validate,
+ (TT_CMap_Info_GetFunc)tt_cmap12_get_info )
+
+#endif /* TT_CONFIG_CMAP_FORMAT_12 */
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** FORMAT 13 *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* TABLE OVERVIEW */
+ /* -------------- */
+ /* */
+ /* NAME OFFSET TYPE DESCRIPTION */
+ /* */
+ /* format 0 USHORT must be 13 */
+ /* reserved 2 USHORT reserved */
+ /* length 4 ULONG length in bytes */
+ /* language 8 ULONG Mac language code */
+ /* count 12 ULONG number of groups */
+ /* 16 */
+ /* */
+ /* This header is followed by `count' groups of the following format: */
+ /* */
+ /* start 0 ULONG first charcode */
+ /* end 4 ULONG last charcode */
+ /* glyphId 8 ULONG glyph ID for the whole group */
+ /* */
+
+#ifdef TT_CONFIG_CMAP_FORMAT_13
+
+ typedef struct TT_CMap13Rec_
+ {
+ TT_CMapRec cmap;
+ FT_Bool valid;
+ FT_ULong cur_charcode;
+ FT_UInt cur_gindex;
+ FT_ULong cur_group;
+ FT_ULong num_groups;
+
+ } TT_CMap13Rec, *TT_CMap13;
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ tt_cmap13_init( TT_CMap13 cmap,
+ FT_Byte* table )
+ {
+ cmap->cmap.data = table;
+
+ table += 12;
+ cmap->num_groups = FT_PEEK_ULONG( table );
+
+ cmap->valid = 0;
+
+ return FT_Err_Ok;
+ }
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ tt_cmap13_validate( FT_Byte* table,
+ FT_Validator valid )
+ {
+ FT_Byte* p;
+ FT_ULong length;
+ FT_ULong num_groups;
+
+
+ if ( table + 16 > valid->limit )
+ FT_INVALID_TOO_SHORT;
+
+ p = table + 4;
+ length = TT_NEXT_ULONG( p );
+
+ p = table + 12;
+ num_groups = TT_NEXT_ULONG( p );
+
+ if ( length > (FT_ULong)( valid->limit - table ) ||
+ length < 16 + 12 * num_groups )
+ FT_INVALID_TOO_SHORT;
+
+ /* check groups, they must be in increasing order */
+ {
+ FT_ULong n, start, end, glyph_id, last = 0;
+
+
+ for ( n = 0; n < num_groups; n++ )
+ {
+ start = TT_NEXT_ULONG( p );
+ end = TT_NEXT_ULONG( p );
+ glyph_id = TT_NEXT_ULONG( p );
+
+ if ( start > end )
+ FT_INVALID_DATA;
+
+ if ( n > 0 && start <= last )
+ FT_INVALID_DATA;
+
+ if ( valid->level >= FT_VALIDATE_TIGHT )
+ {
+ if ( glyph_id >= TT_VALID_GLYPH_COUNT( valid ) )
+ FT_INVALID_GLYPH_ID;
+ }
+
+ last = end;
+ }
+ }
+
+ return FT_Err_Ok;
+ }
+
+
+ /* search the index of the charcode next to cmap->cur_charcode */
+ /* cmap->cur_group should be set up properly by caller */
+ /* */
+ static void
+ tt_cmap13_next( TT_CMap13 cmap )
+ {
+ FT_Byte* p;
+ FT_ULong start, end, glyph_id, char_code;
+ FT_ULong n;
+ FT_UInt gindex;
+
+
+ if ( cmap->cur_charcode >= 0xFFFFFFFFUL )
+ goto Fail;
+
+ char_code = cmap->cur_charcode + 1;
+
+ n = cmap->cur_group;
+
+ for ( n = cmap->cur_group; n < cmap->num_groups; n++ )
+ {
+ p = cmap->cmap.data + 16 + 12 * n;
+ start = TT_NEXT_ULONG( p );
+ end = TT_NEXT_ULONG( p );
+ glyph_id = TT_PEEK_ULONG( p );
+
+ if ( char_code < start )
+ char_code = start;
+
+ if ( char_code <= end )
+ {
+ gindex = (FT_UInt)glyph_id;
+
+ if ( gindex )
+ {
+ cmap->cur_charcode = char_code;;
+ cmap->cur_gindex = gindex;
+ cmap->cur_group = n;
+
+ return;
+ }
+ }
+ }
+
+ Fail:
+ cmap->valid = 0;
+ }
+
+
+ static FT_UInt
+ tt_cmap13_char_map_binary( TT_CMap cmap,
+ FT_UInt32* pchar_code,
+ FT_Bool next )
+ {
+ FT_UInt gindex = 0;
+ FT_Byte* p = cmap->data + 12;
+ FT_UInt32 num_groups = TT_PEEK_ULONG( p );
+ FT_UInt32 char_code = *pchar_code;
+ FT_UInt32 start, end;
+ FT_UInt32 max, min, mid;
+
+
+ if ( !num_groups )
+ return 0;
+
+ /* make compiler happy */
+ mid = num_groups;
+ end = 0xFFFFFFFFUL;
+
+ if ( next )
+ char_code++;
+
+ min = 0;
+ max = num_groups;
+
+ /* binary search */
+ while ( min < max )
+ {
+ mid = ( min + max ) >> 1;
+ p = cmap->data + 16 + 12 * mid;
+
+ start = TT_NEXT_ULONG( p );
+ end = TT_NEXT_ULONG( p );
+
+ if ( char_code < start )
+ max = mid;
+ else if ( char_code > end )
+ min = mid + 1;
+ else
+ {
+ gindex = (FT_UInt)TT_PEEK_ULONG( p );
+
+ break;
+ }
+ }
+
+ if ( next )
+ {
+ TT_CMap13 cmap13 = (TT_CMap13)cmap;
+
+
+ /* if `char_code' is not in any group, then `mid' is */
+ /* the group nearest to `char_code' */
+
+ if ( char_code > end )
+ {
+ mid++;
+ if ( mid == num_groups )
+ return 0;
+ }
+
+ cmap13->valid = 1;
+ cmap13->cur_charcode = char_code;
+ cmap13->cur_group = mid;
+
+ if ( !gindex )
+ {
+ tt_cmap13_next( cmap13 );
+
+ if ( cmap13->valid )
+ gindex = cmap13->cur_gindex;
+ }
+ else
+ cmap13->cur_gindex = gindex;
+
+ if ( gindex )
+ *pchar_code = cmap13->cur_charcode;
+ }
+
+ return gindex;
+ }
+
+
+ FT_CALLBACK_DEF( FT_UInt )
+ tt_cmap13_char_index( TT_CMap cmap,
+ FT_UInt32 char_code )
+ {
+ return tt_cmap13_char_map_binary( cmap, &char_code, 0 );
+ }
+
+
+ FT_CALLBACK_DEF( FT_UInt32 )
+ tt_cmap13_char_next( TT_CMap cmap,
+ FT_UInt32 *pchar_code )
+ {
+ TT_CMap13 cmap13 = (TT_CMap13)cmap;
+ FT_UInt gindex;
+
+
+ if ( cmap13->cur_charcode >= 0xFFFFFFFFUL )
+ return 0;
+
+ /* no need to search */
+ if ( cmap13->valid && cmap13->cur_charcode == *pchar_code )
+ {
+ tt_cmap13_next( cmap13 );
+ if ( cmap13->valid )
+ {
+ gindex = cmap13->cur_gindex;
+ if ( gindex )
+ *pchar_code = cmap13->cur_charcode;
+ }
+ else
+ gindex = 0;
+ }
+ else
+ gindex = tt_cmap13_char_map_binary( cmap, pchar_code, 1 );
+
+ return gindex;
+ }
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ tt_cmap13_get_info( TT_CMap cmap,
+ TT_CMapInfo *cmap_info )
+ {
+ FT_Byte* p = cmap->data + 8;
+
+
+ cmap_info->format = 13;
+ cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p );
+
+ return FT_Err_Ok;
+ }
+
+
+ FT_DEFINE_TT_CMAP(
+ tt_cmap13_class_rec,
+ sizeof ( TT_CMap13Rec ),
+
+ (FT_CMap_InitFunc) tt_cmap13_init,
+ (FT_CMap_DoneFunc) NULL,
+ (FT_CMap_CharIndexFunc)tt_cmap13_char_index,
+ (FT_CMap_CharNextFunc) tt_cmap13_char_next,
+
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+
+ 13,
+ (TT_CMap_ValidateFunc)tt_cmap13_validate,
+ (TT_CMap_Info_GetFunc)tt_cmap13_get_info )
+
+#endif /* TT_CONFIG_CMAP_FORMAT_13 */
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** FORMAT 14 *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* TABLE OVERVIEW */
+ /* -------------- */
+ /* */
+ /* NAME OFFSET TYPE DESCRIPTION */
+ /* */
+ /* format 0 USHORT must be 14 */
+ /* length 2 ULONG table length in bytes */
+ /* numSelector 6 ULONG number of variation sel. records */
+ /* */
+ /* Followed by numSelector records, each of which looks like */
+ /* */
+ /* varSelector 0 UINT24 Unicode codepoint of sel. */
+ /* defaultOff 3 ULONG offset to a default UVS table */
+ /* describing any variants to be found in */
+ /* the normal Unicode subtable. */
+ /* nonDefOff 7 ULONG offset to a non-default UVS table */
+ /* describing any variants not in the */
+ /* standard cmap, with GIDs here */
+ /* (either offset may be 0 NULL) */
+ /* */
+ /* Selectors are sorted by code point. */
+ /* */
+ /* A default Unicode Variation Selector (UVS) subtable is just a list of */
+ /* ranges of code points which are to be found in the standard cmap. No */
+ /* glyph IDs (GIDs) here. */
+ /* */
+ /* numRanges 0 ULONG number of ranges following */
+ /* */
+ /* A range looks like */
+ /* */
+ /* uniStart 0 UINT24 code point of the first character in */
+ /* this range */
+ /* additionalCnt 3 UBYTE count of additional characters in this */
+ /* range (zero means a range of a single */
+ /* character) */
+ /* */
+ /* Ranges are sorted by `uniStart'. */
+ /* */
+ /* A non-default Unicode Variation Selector (UVS) subtable is a list of */
+ /* mappings from codepoint to GID. */
+ /* */
+ /* numMappings 0 ULONG number of mappings */
+ /* */
+ /* A range looks like */
+ /* */
+ /* uniStart 0 UINT24 code point of the first character in */
+ /* this range */
+ /* GID 3 USHORT and its GID */
+ /* */
+ /* Ranges are sorted by `uniStart'. */
+
+#ifdef TT_CONFIG_CMAP_FORMAT_14
+
+ typedef struct TT_CMap14Rec_
+ {
+ TT_CMapRec cmap;
+ FT_ULong num_selectors;
+
+ /* This array is used to store the results of various
+ * cmap 14 query functions. The data is overwritten
+ * on each call to these functions.
+ */
+ FT_UInt32 max_results;
+ FT_UInt32* results;
+ FT_Memory memory;
+
+ } TT_CMap14Rec, *TT_CMap14;
+
+
+ FT_CALLBACK_DEF( void )
+ tt_cmap14_done( TT_CMap14 cmap )
+ {
+ FT_Memory memory = cmap->memory;
+
+
+ cmap->max_results = 0;
+ if ( memory != NULL && cmap->results != NULL )
+ FT_FREE( cmap->results );
+ }
+
+
+ static FT_Error
+ tt_cmap14_ensure( TT_CMap14 cmap,
+ FT_UInt32 num_results,
+ FT_Memory memory )
+ {
+ FT_UInt32 old_max = cmap->max_results;
+ FT_Error error = FT_Err_Ok;
+
+
+ if ( num_results > cmap->max_results )
+ {
+ cmap->memory = memory;
+
+ if ( FT_QRENEW_ARRAY( cmap->results, old_max, num_results ) )
+ return error;
+
+ cmap->max_results = num_results;
+ }
+
+ return error;
+ }
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ tt_cmap14_init( TT_CMap14 cmap,
+ FT_Byte* table )
+ {
+ cmap->cmap.data = table;
+
+ table += 6;
+ cmap->num_selectors = FT_PEEK_ULONG( table );
+ cmap->max_results = 0;
+ cmap->results = NULL;
+
+ return FT_Err_Ok;
+ }
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ tt_cmap14_validate( FT_Byte* table,
+ FT_Validator valid )
+ {
+ FT_Byte* p = table + 2;
+ FT_ULong length = TT_NEXT_ULONG( p );
+ FT_ULong num_selectors = TT_NEXT_ULONG( p );
+
+
+ if ( length > (FT_ULong)( valid->limit - table ) ||
+ length < 10 + 11 * num_selectors )
+ FT_INVALID_TOO_SHORT;
+
+ /* check selectors, they must be in increasing order */
+ {
+ /* we start lastVarSel at 1 because a variant selector value of 0
+ * isn't valid.
+ */
+ FT_ULong n, lastVarSel = 1;
+
+
+ for ( n = 0; n < num_selectors; n++ )
+ {
+ FT_ULong varSel = TT_NEXT_UINT24( p );
+ FT_ULong defOff = TT_NEXT_ULONG( p );
+ FT_ULong nondefOff = TT_NEXT_ULONG( p );
+
+
+ if ( defOff >= length || nondefOff >= length )
+ FT_INVALID_TOO_SHORT;
+
+ if ( varSel < lastVarSel )
+ FT_INVALID_DATA;
+
+ lastVarSel = varSel + 1;
+
+ /* check the default table (these glyphs should be reached */
+ /* through the normal Unicode cmap, no GIDs, just check order) */
+ if ( defOff != 0 )
+ {
+ FT_Byte* defp = table + defOff;
+ FT_ULong numRanges = TT_NEXT_ULONG( defp );
+ FT_ULong i;
+ FT_ULong lastBase = 0;
+
+
+ if ( defp + numRanges * 4 > valid->limit )
+ FT_INVALID_TOO_SHORT;
+
+ for ( i = 0; i < numRanges; ++i )
+ {
+ FT_ULong base = TT_NEXT_UINT24( defp );
+ FT_ULong cnt = FT_NEXT_BYTE( defp );
+
+
+ if ( base + cnt >= 0x110000UL ) /* end of Unicode */
+ FT_INVALID_DATA;
+
+ if ( base < lastBase )
+ FT_INVALID_DATA;
+
+ lastBase = base + cnt + 1U;
+ }
+ }
+
+ /* and the non-default table (these glyphs are specified here) */
+ if ( nondefOff != 0 )
+ {
+ FT_Byte* ndp = table + nondefOff;
+ FT_ULong numMappings = TT_NEXT_ULONG( ndp );
+ FT_ULong i, lastUni = 0;
+
+
+ if ( numMappings * 4 > (FT_ULong)( valid->limit - ndp ) )
+ FT_INVALID_TOO_SHORT;
+
+ for ( i = 0; i < numMappings; ++i )
+ {
+ FT_ULong uni = TT_NEXT_UINT24( ndp );
+ FT_ULong gid = TT_NEXT_USHORT( ndp );
+
+
+ if ( uni >= 0x110000UL ) /* end of Unicode */
+ FT_INVALID_DATA;
+
+ if ( uni < lastUni )
+ FT_INVALID_DATA;
+
+ lastUni = uni + 1U;
+
+ if ( valid->level >= FT_VALIDATE_TIGHT &&
+ gid >= TT_VALID_GLYPH_COUNT( valid ) )
+ FT_INVALID_GLYPH_ID;
+ }
+ }
+ }
+ }
+
+ return FT_Err_Ok;
+ }
+
+
+ FT_CALLBACK_DEF( FT_UInt )
+ tt_cmap14_char_index( TT_CMap cmap,
+ FT_UInt32 char_code )
+ {
+ FT_UNUSED( cmap );
+ FT_UNUSED( char_code );
+
+ /* This can't happen */
+ return 0;
+ }
+
+
+ FT_CALLBACK_DEF( FT_UInt32 )
+ tt_cmap14_char_next( TT_CMap cmap,
+ FT_UInt32 *pchar_code )
+ {
+ FT_UNUSED( cmap );
+
+ /* This can't happen */
+ *pchar_code = 0;
+ return 0;
+ }
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ tt_cmap14_get_info( TT_CMap cmap,
+ TT_CMapInfo *cmap_info )
+ {
+ FT_UNUSED( cmap );
+
+ cmap_info->format = 14;
+ /* subtable 14 does not define a language field */
+ cmap_info->language = 0xFFFFFFFFUL;
+
+ return FT_Err_Ok;
+ }
+
+
+ static FT_UInt
+ tt_cmap14_char_map_def_binary( FT_Byte *base,
+ FT_UInt32 char_code )
+ {
+ FT_UInt32 numRanges = TT_PEEK_ULONG( base );
+ FT_UInt32 max, min;
+
+
+ min = 0;
+ max = numRanges;
+
+ base += 4;
+
+ /* binary search */
+ while ( min < max )
+ {
+ FT_UInt32 mid = ( min + max ) >> 1;
+ FT_Byte* p = base + 4 * mid;
+ FT_ULong start = TT_NEXT_UINT24( p );
+ FT_UInt cnt = FT_NEXT_BYTE( p );
+
+
+ if ( char_code < start )
+ max = mid;
+ else if ( char_code > start+cnt )
+ min = mid + 1;
+ else
+ return TRUE;
+ }
+
+ return FALSE;
+ }
+
+
+ static FT_UInt
+ tt_cmap14_char_map_nondef_binary( FT_Byte *base,
+ FT_UInt32 char_code )
+ {
+ FT_UInt32 numMappings = TT_PEEK_ULONG( base );
+ FT_UInt32 max, min;
+
+
+ min = 0;
+ max = numMappings;
+
+ base += 4;
+
+ /* binary search */
+ while ( min < max )
+ {
+ FT_UInt32 mid = ( min + max ) >> 1;
+ FT_Byte* p = base + 5 * mid;
+ FT_UInt32 uni = (FT_UInt32)TT_NEXT_UINT24( p );
+
+
+ if ( char_code < uni )
+ max = mid;
+ else if ( char_code > uni )
+ min = mid + 1;
+ else
+ return TT_PEEK_USHORT( p );
+ }
+
+ return 0;
+ }
+
+
+ static FT_Byte*
+ tt_cmap14_find_variant( FT_Byte *base,
+ FT_UInt32 variantCode )
+ {
+ FT_UInt32 numVar = TT_PEEK_ULONG( base );
+ FT_UInt32 max, min;
+
+
+ min = 0;
+ max = numVar;
+
+ base += 4;
+
+ /* binary search */
+ while ( min < max )
+ {
+ FT_UInt32 mid = ( min + max ) >> 1;
+ FT_Byte* p = base + 11 * mid;
+ FT_ULong varSel = TT_NEXT_UINT24( p );
+
+
+ if ( variantCode < varSel )
+ max = mid;
+ else if ( variantCode > varSel )
+ min = mid + 1;
+ else
+ return p;
+ }
+
+ return NULL;
+ }
+
+
+ FT_CALLBACK_DEF( FT_UInt )
+ tt_cmap14_char_var_index( TT_CMap cmap,
+ TT_CMap ucmap,
+ FT_UInt32 charcode,
+ FT_UInt32 variantSelector )
+ {
+ FT_Byte* p = tt_cmap14_find_variant( cmap->data + 6, variantSelector );
+ FT_ULong defOff;
+ FT_ULong nondefOff;
+
+
+ if ( !p )
+ return 0;
+
+ defOff = TT_NEXT_ULONG( p );
+ nondefOff = TT_PEEK_ULONG( p );
+
+ if ( defOff != 0 &&
+ tt_cmap14_char_map_def_binary( cmap->data + defOff, charcode ) )
+ {
+ /* This is the default variant of this charcode. GID not stored */
+ /* here; stored in the normal Unicode charmap instead. */
+ return ucmap->cmap.clazz->char_index( &ucmap->cmap, charcode );
+ }
+
+ if ( nondefOff != 0 )
+ return tt_cmap14_char_map_nondef_binary( cmap->data + nondefOff,
+ charcode );
+
+ return 0;
+ }
+
+
+ FT_CALLBACK_DEF( FT_Int )
+ tt_cmap14_char_var_isdefault( TT_CMap cmap,
+ FT_UInt32 charcode,
+ FT_UInt32 variantSelector )
+ {
+ FT_Byte* p = tt_cmap14_find_variant( cmap->data + 6, variantSelector );
+ FT_ULong defOff;
+ FT_ULong nondefOff;
+
+
+ if ( !p )
+ return -1;
+
+ defOff = TT_NEXT_ULONG( p );
+ nondefOff = TT_NEXT_ULONG( p );
+
+ if ( defOff != 0 &&
+ tt_cmap14_char_map_def_binary( cmap->data + defOff, charcode ) )
+ return 1;
+
+ if ( nondefOff != 0 &&
+ tt_cmap14_char_map_nondef_binary( cmap->data + nondefOff,
+ charcode ) != 0 )
+ return 0;
+
+ return -1;
+ }
+
+
+ FT_CALLBACK_DEF( FT_UInt32* )
+ tt_cmap14_variants( TT_CMap cmap,
+ FT_Memory memory )
+ {
+ TT_CMap14 cmap14 = (TT_CMap14)cmap;
+ FT_UInt32 count = cmap14->num_selectors;
+ FT_Byte* p = cmap->data + 10;
+ FT_UInt32* result;
+ FT_UInt32 i;
+
+
+ if ( tt_cmap14_ensure( cmap14, ( count + 1 ), memory ) )
+ return NULL;
+
+ result = cmap14->results;
+ for ( i = 0; i < count; ++i )
+ {
+ result[i] = (FT_UInt32)TT_NEXT_UINT24( p );
+ p += 8;
+ }
+ result[i] = 0;
+
+ return result;
+ }
+
+
+ FT_CALLBACK_DEF( FT_UInt32 * )
+ tt_cmap14_char_variants( TT_CMap cmap,
+ FT_Memory memory,
+ FT_UInt32 charCode )
+ {
+ TT_CMap14 cmap14 = (TT_CMap14) cmap;
+ FT_UInt32 count = cmap14->num_selectors;
+ FT_Byte* p = cmap->data + 10;
+ FT_UInt32* q;
+
+
+ if ( tt_cmap14_ensure( cmap14, ( count + 1 ), memory ) )
+ return NULL;
+
+ for ( q = cmap14->results; count > 0; --count )
+ {
+ FT_UInt32 varSel = TT_NEXT_UINT24( p );
+ FT_ULong defOff = TT_NEXT_ULONG( p );
+ FT_ULong nondefOff = TT_NEXT_ULONG( p );
+
+
+ if ( ( defOff != 0 &&
+ tt_cmap14_char_map_def_binary( cmap->data + defOff,
+ charCode ) ) ||
+ ( nondefOff != 0 &&
+ tt_cmap14_char_map_nondef_binary( cmap->data + nondefOff,
+ charCode ) != 0 ) )
+ {
+ q[0] = varSel;
+ q++;
+ }
+ }
+ q[0] = 0;
+
+ return cmap14->results;
+ }
+
+
+ static FT_UInt
+ tt_cmap14_def_char_count( FT_Byte *p )
+ {
+ FT_UInt32 numRanges = (FT_UInt32)TT_NEXT_ULONG( p );
+ FT_UInt tot = 0;
+
+
+ p += 3; /* point to the first `cnt' field */
+ for ( ; numRanges > 0; numRanges-- )
+ {
+ tot += 1 + p[0];
+ p += 4;
+ }
+
+ return tot;
+ }
+
+
+ static FT_UInt32*
+ tt_cmap14_get_def_chars( TT_CMap cmap,
+ FT_Byte* p,
+ FT_Memory memory )
+ {
+ TT_CMap14 cmap14 = (TT_CMap14) cmap;
+ FT_UInt32 numRanges;
+ FT_UInt cnt;
+ FT_UInt32* q;
+
+
+ cnt = tt_cmap14_def_char_count( p );
+ numRanges = (FT_UInt32)TT_NEXT_ULONG( p );
+
+ if ( tt_cmap14_ensure( cmap14, ( cnt + 1 ), memory ) )
+ return NULL;
+
+ for ( q = cmap14->results; numRanges > 0; --numRanges )
+ {
+ FT_UInt32 uni = (FT_UInt32)TT_NEXT_UINT24( p );
+
+
+ cnt = FT_NEXT_BYTE( p ) + 1;
+ do
+ {
+ q[0] = uni;
+ uni += 1;
+ q += 1;
+
+ } while ( --cnt != 0 );
+ }
+ q[0] = 0;
+
+ return cmap14->results;
+ }
+
+
+ static FT_UInt32*
+ tt_cmap14_get_nondef_chars( TT_CMap cmap,
+ FT_Byte *p,
+ FT_Memory memory )
+ {
+ TT_CMap14 cmap14 = (TT_CMap14) cmap;
+ FT_UInt32 numMappings;
+ FT_UInt i;
+ FT_UInt32 *ret;
+
+
+ numMappings = (FT_UInt32)TT_NEXT_ULONG( p );
+
+ if ( tt_cmap14_ensure( cmap14, ( numMappings + 1 ), memory ) )
+ return NULL;
+
+ ret = cmap14->results;
+ for ( i = 0; i < numMappings; ++i )
+ {
+ ret[i] = (FT_UInt32)TT_NEXT_UINT24( p );
+ p += 2;
+ }
+ ret[i] = 0;
+
+ return ret;
+ }
+
+
+ FT_CALLBACK_DEF( FT_UInt32 * )
+ tt_cmap14_variant_chars( TT_CMap cmap,
+ FT_Memory memory,
+ FT_UInt32 variantSelector )
+ {
+ FT_Byte *p = tt_cmap14_find_variant( cmap->data + 6,
+ variantSelector );
+ FT_UInt32 *ret;
+ FT_Int i;
+ FT_ULong defOff;
+ FT_ULong nondefOff;
+
+
+ if ( !p )
+ return NULL;
+
+ defOff = TT_NEXT_ULONG( p );
+ nondefOff = TT_NEXT_ULONG( p );
+
+ if ( defOff == 0 && nondefOff == 0 )
+ return NULL;
+
+ if ( defOff == 0 )
+ return tt_cmap14_get_nondef_chars( cmap, cmap->data + nondefOff,
+ memory );
+ else if ( nondefOff == 0 )
+ return tt_cmap14_get_def_chars( cmap, cmap->data + defOff,
+ memory );
+ else
+ {
+ /* Both a default and a non-default glyph set? That's probably not */
+ /* good font design, but the spec allows for it... */
+ TT_CMap14 cmap14 = (TT_CMap14) cmap;
+ FT_UInt32 numRanges;
+ FT_UInt32 numMappings;
+ FT_UInt32 duni;
+ FT_UInt32 dcnt;
+ FT_UInt32 nuni;
+ FT_Byte* dp;
+ FT_UInt di, ni, k;
+
+
+ p = cmap->data + nondefOff;
+ dp = cmap->data + defOff;
+
+ numMappings = (FT_UInt32)TT_NEXT_ULONG( p );
+ dcnt = tt_cmap14_def_char_count( dp );
+ numRanges = (FT_UInt32)TT_NEXT_ULONG( dp );
+
+ if ( numMappings == 0 )
+ return tt_cmap14_get_def_chars( cmap, cmap->data + defOff,
+ memory );
+ if ( dcnt == 0 )
+ return tt_cmap14_get_nondef_chars( cmap, cmap->data + nondefOff,
+ memory );
+
+ if ( tt_cmap14_ensure( cmap14, ( dcnt + numMappings + 1 ), memory ) )
+ return NULL;
+
+ ret = cmap14->results;
+ duni = (FT_UInt32)TT_NEXT_UINT24( dp );
+ dcnt = FT_NEXT_BYTE( dp );
+ di = 1;
+ nuni = (FT_UInt32)TT_NEXT_UINT24( p );
+ p += 2;
+ ni = 1;
+ i = 0;
+
+ for ( ;; )
+ {
+ if ( nuni > duni + dcnt )
+ {
+ for ( k = 0; k <= dcnt; ++k )
+ ret[i++] = duni + k;
+
+ ++di;
+
+ if ( di > numRanges )
+ break;
+
+ duni = (FT_UInt32)TT_NEXT_UINT24( dp );
+ dcnt = FT_NEXT_BYTE( dp );
+ }
+ else
+ {
+ if ( nuni < duni )
+ ret[i++] = nuni;
+ /* If it is within the default range then ignore it -- */
+ /* that should not have happened */
+ ++ni;
+ if ( ni > numMappings )
+ break;
+
+ nuni = (FT_UInt32)TT_NEXT_UINT24( p );
+ p += 2;
+ }
+ }
+
+ if ( ni <= numMappings )
+ {
+ /* If we get here then we have run out of all default ranges. */
+ /* We have read one non-default mapping which we haven't stored */
+ /* and there may be others that need to be read. */
+ ret[i++] = nuni;
+ while ( ni < numMappings )
+ {
+ ret[i++] = (FT_UInt32)TT_NEXT_UINT24( p );
+ p += 2;
+ ++ni;
+ }
+ }
+ else if ( di <= numRanges )
+ {
+ /* If we get here then we have run out of all non-default */
+ /* mappings. We have read one default range which we haven't */
+ /* stored and there may be others that need to be read. */
+ for ( k = 0; k <= dcnt; ++k )
+ ret[i++] = duni + k;
+
+ while ( di < numRanges )
+ {
+ duni = (FT_UInt32)TT_NEXT_UINT24( dp );
+ dcnt = FT_NEXT_BYTE( dp );
+
+ for ( k = 0; k <= dcnt; ++k )
+ ret[i++] = duni + k;
+ ++di;
+ }
+ }
+
+ ret[i] = 0;
+
+ return ret;
+ }
+ }
+
+
+ FT_DEFINE_TT_CMAP(
+ tt_cmap14_class_rec,
+ sizeof ( TT_CMap14Rec ),
+
+ (FT_CMap_InitFunc) tt_cmap14_init,
+ (FT_CMap_DoneFunc) tt_cmap14_done,
+ (FT_CMap_CharIndexFunc)tt_cmap14_char_index,
+ (FT_CMap_CharNextFunc) tt_cmap14_char_next,
+
+ /* Format 14 extension functions */
+ (FT_CMap_CharVarIndexFunc) tt_cmap14_char_var_index,
+ (FT_CMap_CharVarIsDefaultFunc)tt_cmap14_char_var_isdefault,
+ (FT_CMap_VariantListFunc) tt_cmap14_variants,
+ (FT_CMap_CharVariantListFunc) tt_cmap14_char_variants,
+ (FT_CMap_VariantCharListFunc) tt_cmap14_variant_chars,
+
+ 14,
+ (TT_CMap_ValidateFunc)tt_cmap14_validate,
+ (TT_CMap_Info_GetFunc)tt_cmap14_get_info )
+
+#endif /* TT_CONFIG_CMAP_FORMAT_14 */
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+ static const TT_CMap_Class tt_cmap_classes[] =
+ {
+#define TTCMAPCITEM( a ) &a,
+#include "ttcmapc.h"
+ NULL,
+ };
+
+#else /*FT_CONFIG_OPTION_PIC*/
+
+ void
+ FT_Destroy_Class_tt_cmap_classes( FT_Library library,
+ TT_CMap_Class* clazz )
+ {
+ FT_Memory memory = library->memory;
+
+
+ if ( clazz )
+ FT_FREE( clazz );
+ }
+
+
+ FT_Error
+ FT_Create_Class_tt_cmap_classes( FT_Library library,
+ TT_CMap_Class** output_class )
+ {
+ TT_CMap_Class* clazz = NULL;
+ TT_CMap_ClassRec* recs;
+ FT_Error error;
+ FT_Memory memory = library->memory;
+
+ int i = 0;
+
+
+#define TTCMAPCITEM( a ) i++;
+#include "ttcmapc.h"
+
+ /* allocate enough space for both the pointers */
+ /* plus terminator and the class instances */
+ if ( FT_ALLOC( clazz, sizeof ( *clazz ) * ( i + 1 ) +
+ sizeof ( TT_CMap_ClassRec ) * i ) )
+ return error;
+
+ /* the location of the class instances follows the array of pointers */
+ recs = (TT_CMap_ClassRec*)( (char*)clazz +
+ sizeof ( *clazz ) * ( i + 1 ) );
+ i = 0;
+
+#undef TTCMAPCITEM
+#define TTCMAPCITEM( a ) \
+ FT_Init_Class_ ## a( &recs[i] ); \
+ clazz[i] = &recs[i]; \
+ i++;
+#include "ttcmapc.h"
+
+ clazz[i] = NULL;
+
+ *output_class = clazz;
+ return FT_Err_Ok;
+ }
+
+#endif /*FT_CONFIG_OPTION_PIC*/
+
+
+ /* parse the `cmap' table and build the corresponding TT_CMap objects */
+ /* in the current face */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ tt_face_build_cmaps( TT_Face face )
+ {
+ FT_Byte* table = face->cmap_table;
+ FT_Byte* limit = table + face->cmap_size;
+ FT_UInt volatile num_cmaps;
+ FT_Byte* volatile p = table;
+ FT_Library library = FT_FACE_LIBRARY( face );
+
+ FT_UNUSED( library );
+
+
+ if ( !p || p + 4 > limit )
+ return FT_THROW( Invalid_Table );
+
+ /* only recognize format 0 */
+ if ( TT_NEXT_USHORT( p ) != 0 )
+ {
+ p -= 2;
+ FT_ERROR(( "tt_face_build_cmaps:"
+ " unsupported `cmap' table format = %d\n",
+ TT_PEEK_USHORT( p ) ));
+ return FT_THROW( Invalid_Table );
+ }
+
+ num_cmaps = TT_NEXT_USHORT( p );
+
+#ifdef FT_MAX_CHARMAP_CACHEABLE
+ if ( num_cmaps > FT_MAX_CHARMAP_CACHEABLE )
+ FT_ERROR(( "tt_face_build_cmaps: too many cmap subtables (%d)\n"
+ " subtable #%d and higher are loaded"
+ " but cannot be searched\n",
+ num_cmaps, FT_MAX_CHARMAP_CACHEABLE + 1 ));
+#endif
+
+ for ( ; num_cmaps > 0 && p + 8 <= limit; num_cmaps-- )
+ {
+ FT_CharMapRec charmap;
+ FT_UInt32 offset;
+
+
+ charmap.platform_id = TT_NEXT_USHORT( p );
+ charmap.encoding_id = TT_NEXT_USHORT( p );
+ charmap.face = FT_FACE( face );
+ charmap.encoding = FT_ENCODING_NONE; /* will be filled later */
+ offset = TT_NEXT_ULONG( p );
+
+ if ( offset && offset <= face->cmap_size - 2 )
+ {
+ FT_Byte* volatile cmap = table + offset;
+ volatile FT_UInt format = TT_PEEK_USHORT( cmap );
+ const TT_CMap_Class* volatile pclazz = TT_CMAP_CLASSES_GET;
+ TT_CMap_Class volatile clazz;
+
+
+ for ( ; *pclazz; pclazz++ )
+ {
+ clazz = *pclazz;
+ if ( clazz->format == format )
+ {
+ volatile TT_ValidatorRec valid;
+ volatile FT_Error error = FT_Err_Ok;
+
+
+ ft_validator_init( FT_VALIDATOR( &valid ), cmap, limit,
+ FT_VALIDATE_DEFAULT );
+
+ valid.num_glyphs = (FT_UInt)face->max_profile.numGlyphs;
+#ifndef _FX_MANAGED_CODE_
+ if ( ft_setjmp( FT_VALIDATOR( &valid )->jump_buffer) == 0 )
+ {
+#endif
+ /* validate this cmap sub-table */
+ error = clazz->validate( cmap, FT_VALIDATOR( &valid ) );
+#ifndef _FX_MANAGED_CODE_
+ }
+#endif
+
+ if ( valid.validator.error == 0 )
+ {
+ FT_CMap ttcmap;
+
+
+ /* It might make sense to store the single variation */
+ /* selector cmap somewhere special. But it would have to be */
+ /* in the public FT_FaceRec, and we can't change that. */
+
+ if ( !FT_CMap_New( (FT_CMap_Class)clazz,
+ cmap, &charmap, &ttcmap ) )
+ {
+ /* it is simpler to directly set `flags' than adding */
+ /* a parameter to FT_CMap_New */
+ ((TT_CMap)ttcmap)->flags = (FT_Int)error;
+ }
+ }
+ else
+ {
+ FT_TRACE0(( "tt_face_build_cmaps:"
+ " broken cmap sub-table ignored\n" ));
+ }
+ break;
+ }
+ }
+
+ if ( *pclazz == NULL )
+ {
+ FT_TRACE0(( "tt_face_build_cmaps:"
+ " unsupported cmap sub-table ignored\n" ));
+ }
+ }
+ }
+
+ return FT_Err_Ok;
+ }
+
+
+ FT_LOCAL( FT_Error )
+ tt_get_cmap_info( FT_CharMap charmap,
+ TT_CMapInfo *cmap_info )
+ {
+ FT_CMap cmap = (FT_CMap)charmap;
+ TT_CMap_Class clazz = (TT_CMap_Class)cmap->clazz;
+
+
+ return clazz->get_cmap_info( charmap, cmap_info );
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttcmap.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttcmap.h
new file mode 100644
index 0000000000..3862494991
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttcmap.h
@@ -0,0 +1,158 @@
+/***************************************************************************/
+/* */
+/* ttcmap.h */
+/* */
+/* TrueType character mapping table (cmap) support (specification). */
+/* */
+/* Copyright 2002-2005, 2009, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __TTCMAP_H__
+#define __TTCMAP_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/tttypes.h"
+#include "../../include/freetype/internal/ftvalid.h"
+#include "../../include/freetype/internal/services/svttcmap.h"
+
+FT_BEGIN_HEADER
+
+
+#define TT_CMAP_FLAG_UNSORTED 1
+#define TT_CMAP_FLAG_OVERLAPPING 2
+
+ typedef struct TT_CMapRec_
+ {
+ FT_CMapRec cmap;
+ FT_Byte* data; /* pointer to in-memory cmap table */
+ FT_Int flags; /* for format 4 only */
+
+ } TT_CMapRec, *TT_CMap;
+
+ typedef const struct TT_CMap_ClassRec_* TT_CMap_Class;
+
+
+ typedef FT_Error
+ (*TT_CMap_ValidateFunc)( FT_Byte* data,
+ FT_Validator valid );
+
+ typedef struct TT_CMap_ClassRec_
+ {
+ FT_CMap_ClassRec clazz;
+ FT_UInt format;
+ TT_CMap_ValidateFunc validate;
+ TT_CMap_Info_GetFunc get_cmap_info;
+
+ } TT_CMap_ClassRec;
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_TT_CMAP( class_, \
+ size_, \
+ init_, \
+ done_, \
+ char_index_, \
+ char_next_, \
+ char_var_index_, \
+ char_var_default_, \
+ variant_list_, \
+ charvariant_list_, \
+ variantchar_list_, \
+ format_, \
+ validate_, \
+ get_cmap_info_ ) \
+ FT_CALLBACK_TABLE_DEF \
+ const TT_CMap_ClassRec class_ = \
+ { \
+ { size_, \
+ init_, \
+ done_, \
+ char_index_, \
+ char_next_, \
+ char_var_index_, \
+ char_var_default_, \
+ variant_list_, \
+ charvariant_list_, \
+ variantchar_list_ \
+ }, \
+ \
+ format_, \
+ validate_, \
+ get_cmap_info_ \
+ };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_TT_CMAP( class_, \
+ size_, \
+ init_, \
+ done_, \
+ char_index_, \
+ char_next_, \
+ char_var_index_, \
+ char_var_default_, \
+ variant_list_, \
+ charvariant_list_, \
+ variantchar_list_, \
+ format_, \
+ validate_, \
+ get_cmap_info_ ) \
+ void \
+ FT_Init_Class_ ## class_( TT_CMap_ClassRec* clazz ) \
+ { \
+ clazz->clazz.size = size_; \
+ clazz->clazz.init = init_; \
+ clazz->clazz.done = done_; \
+ clazz->clazz.char_index = char_index_; \
+ clazz->clazz.char_next = char_next_; \
+ clazz->clazz.char_var_index = char_var_index_; \
+ clazz->clazz.char_var_default = char_var_default_; \
+ clazz->clazz.variant_list = variant_list_; \
+ clazz->clazz.charvariant_list = charvariant_list_; \
+ clazz->clazz.variantchar_list = variantchar_list_; \
+ clazz->format = format_; \
+ clazz->validate = validate_; \
+ clazz->get_cmap_info = get_cmap_info_; \
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+ typedef struct TT_ValidatorRec_
+ {
+ FT_ValidatorRec validator;
+ FT_UInt num_glyphs;
+
+ } TT_ValidatorRec, *TT_Validator;
+
+
+#define TT_VALIDATOR( x ) ( (TT_Validator)( x ) )
+#define TT_VALID_GLYPH_COUNT( x ) TT_VALIDATOR( x )->num_glyphs
+
+
+ FT_LOCAL( FT_Error )
+ tt_face_build_cmaps( TT_Face face );
+
+ /* used in tt-cmaps service */
+ FT_LOCAL( FT_Error )
+ tt_get_cmap_info( FT_CharMap charmap,
+ TT_CMapInfo *cmap_info );
+
+
+FT_END_HEADER
+
+#endif /* __TTCMAP_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttcmapc.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttcmapc.h
new file mode 100644
index 0000000000..2ea204309c
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttcmapc.h
@@ -0,0 +1,56 @@
+/***************************************************************************/
+/* */
+/* ttcmapc.h */
+/* */
+/* TT CMAP classes definitions (specification only). */
+/* */
+/* Copyright 2009 by */
+/* Oran Agra and Mickey Gabel. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifdef TT_CONFIG_CMAP_FORMAT_0
+ TTCMAPCITEM( tt_cmap0_class_rec )
+#endif
+
+#ifdef TT_CONFIG_CMAP_FORMAT_2
+ TTCMAPCITEM( tt_cmap2_class_rec )
+#endif
+
+#ifdef TT_CONFIG_CMAP_FORMAT_4
+ TTCMAPCITEM( tt_cmap4_class_rec )
+#endif
+
+#ifdef TT_CONFIG_CMAP_FORMAT_6
+ TTCMAPCITEM( tt_cmap6_class_rec )
+#endif
+
+#ifdef TT_CONFIG_CMAP_FORMAT_8
+ TTCMAPCITEM( tt_cmap8_class_rec )
+#endif
+
+#ifdef TT_CONFIG_CMAP_FORMAT_10
+ TTCMAPCITEM( tt_cmap10_class_rec )
+#endif
+
+#ifdef TT_CONFIG_CMAP_FORMAT_12
+ TTCMAPCITEM( tt_cmap12_class_rec )
+#endif
+
+#ifdef TT_CONFIG_CMAP_FORMAT_13
+ TTCMAPCITEM( tt_cmap13_class_rec )
+#endif
+
+#ifdef TT_CONFIG_CMAP_FORMAT_14
+ TTCMAPCITEM( tt_cmap14_class_rec )
+#endif
+
+
+ /* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttkern.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttkern.c
new file mode 100644
index 0000000000..da38cf7d30
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttkern.c
@@ -0,0 +1,306 @@
+/***************************************************************************/
+/* */
+/* ttkern.c */
+/* */
+/* Load the basic TrueType kerning table. This doesn't handle */
+/* kerning data within the GPOS table at the moment. */
+/* */
+/* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2009, 2010 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/tttags.h"
+#include "ttkern.h"
+
+#include "sferrors.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_ttkern
+
+
+#undef TT_KERN_INDEX
+#define TT_KERN_INDEX( g1, g2 ) ( ( (FT_ULong)(g1) << 16 ) | (g2) )
+
+
+ FT_LOCAL_DEF( FT_Error )
+ tt_face_load_kern( TT_Face face,
+ FT_Stream stream )
+ {
+ FT_Error error;
+ FT_ULong table_size;
+ FT_Byte* p;
+ FT_Byte* p_limit;
+ FT_UInt nn, num_tables;
+ FT_UInt32 avail = 0, ordered = 0;
+
+
+ /* the kern table is optional; exit silently if it is missing */
+ error = face->goto_table( face, TTAG_kern, stream, &table_size );
+ if ( error )
+ goto Exit;
+
+ if ( table_size < 4 ) /* the case of a malformed table */
+ {
+ FT_ERROR(( "tt_face_load_kern:"
+ " kerning table is too small - ignored\n" ));
+ error = FT_THROW( Table_Missing );
+ goto Exit;
+ }
+
+ if ( FT_FRAME_EXTRACT( table_size, face->kern_table ) )
+ {
+ FT_ERROR(( "tt_face_load_kern:"
+ " could not extract kerning table\n" ));
+ goto Exit;
+ }
+
+ face->kern_table_size = table_size;
+
+ p = face->kern_table;
+ p_limit = p + table_size;
+
+ p += 2; /* skip version */
+ num_tables = FT_NEXT_USHORT( p );
+
+ if ( num_tables > 32 ) /* we only support up to 32 sub-tables */
+ num_tables = 32;
+
+ for ( nn = 0; nn < num_tables; nn++ )
+ {
+ FT_UInt num_pairs, length, coverage;
+ FT_Byte* p_next;
+ FT_UInt32 mask = (FT_UInt32)1UL << nn;
+
+
+ if ( p + 6 > p_limit )
+ break;
+
+ p_next = p;
+
+ p += 2; /* skip version */
+ length = FT_NEXT_USHORT( p );
+ coverage = FT_NEXT_USHORT( p );
+
+ if ( length <= 6 )
+ break;
+
+ p_next += length;
+
+ if ( p_next > p_limit ) /* handle broken table */
+ p_next = p_limit;
+
+ /* only use horizontal kerning tables */
+ if ( ( coverage & ~8 ) != 0x0001 ||
+ p + 8 > p_limit )
+ goto NextTable;
+
+ num_pairs = FT_NEXT_USHORT( p );
+ p += 6;
+
+ if ( ( p_next - p ) < 6 * (int)num_pairs ) /* handle broken count */
+ num_pairs = (FT_UInt)( ( p_next - p ) / 6 );
+
+ avail |= mask;
+
+ /*
+ * Now check whether the pairs in this table are ordered.
+ * We then can use binary search.
+ */
+ if ( num_pairs > 0 )
+ {
+ FT_ULong count;
+ FT_ULong old_pair;
+
+
+ old_pair = FT_NEXT_ULONG( p );
+ p += 2;
+
+ for ( count = num_pairs - 1; count > 0; count-- )
+ {
+ FT_UInt32 cur_pair;
+
+
+ cur_pair = FT_NEXT_ULONG( p );
+ if ( cur_pair <= old_pair )
+ break;
+
+ p += 2;
+ old_pair = cur_pair;
+ }
+
+ if ( count == 0 )
+ ordered |= mask;
+ }
+
+ NextTable:
+ p = p_next;
+ }
+
+ face->num_kern_tables = nn;
+ face->kern_avail_bits = avail;
+ face->kern_order_bits = ordered;
+
+ Exit:
+ return error;
+ }
+
+
+ FT_LOCAL_DEF( void )
+ tt_face_done_kern( TT_Face face )
+ {
+ FT_Stream stream = face->root.stream;
+
+
+ FT_FRAME_RELEASE( face->kern_table );
+ face->kern_table_size = 0;
+ face->num_kern_tables = 0;
+ face->kern_avail_bits = 0;
+ face->kern_order_bits = 0;
+ }
+
+
+ FT_LOCAL_DEF( FT_Int )
+ tt_face_get_kerning( TT_Face face,
+ FT_UInt left_glyph,
+ FT_UInt right_glyph )
+ {
+ FT_Int result = 0;
+ FT_UInt count, mask = 1;
+ FT_Byte* p = face->kern_table;
+ FT_Byte* p_limit = p + face->kern_table_size;
+
+
+ p += 4;
+ mask = 0x0001;
+
+ for ( count = face->num_kern_tables;
+ count > 0 && p + 6 <= p_limit;
+ count--, mask <<= 1 )
+ {
+ FT_Byte* base = p;
+ FT_Byte* next = base;
+ FT_UInt version = FT_NEXT_USHORT( p );
+ FT_UInt length = FT_NEXT_USHORT( p );
+ FT_UInt coverage = FT_NEXT_USHORT( p );
+ FT_UInt num_pairs;
+ FT_Int value = 0;
+
+ FT_UNUSED( version );
+
+
+ next = base + length;
+
+ if ( next > p_limit ) /* handle broken table */
+ next = p_limit;
+
+ if ( ( face->kern_avail_bits & mask ) == 0 )
+ goto NextTable;
+
+ if ( p + 8 > next )
+ goto NextTable;
+
+ num_pairs = FT_NEXT_USHORT( p );
+ p += 6;
+
+ if ( ( next - p ) < 6 * (int)num_pairs ) /* handle broken count */
+ num_pairs = (FT_UInt)( ( next - p ) / 6 );
+
+ switch ( coverage >> 8 )
+ {
+ case 0:
+ {
+ FT_ULong key0 = TT_KERN_INDEX( left_glyph, right_glyph );
+
+
+ if ( face->kern_order_bits & mask ) /* binary search */
+ {
+ FT_UInt min = 0;
+ FT_UInt max = num_pairs;
+
+
+ while ( min < max )
+ {
+ FT_UInt mid = ( min + max ) >> 1;
+ FT_Byte* q = p + 6 * mid;
+ FT_ULong key;
+
+
+ key = FT_NEXT_ULONG( q );
+
+ if ( key == key0 )
+ {
+ value = FT_PEEK_SHORT( q );
+ goto Found;
+ }
+ if ( key < key0 )
+ min = mid + 1;
+ else
+ max = mid;
+ }
+ }
+ else /* linear search */
+ {
+ FT_UInt count2;
+
+
+ for ( count2 = num_pairs; count2 > 0; count2-- )
+ {
+ FT_ULong key = FT_NEXT_ULONG( p );
+
+
+ if ( key == key0 )
+ {
+ value = FT_PEEK_SHORT( p );
+ goto Found;
+ }
+ p += 2;
+ }
+ }
+ }
+ break;
+
+ /*
+ * We don't support format 2 because we haven't seen a single font
+ * using it in real life...
+ */
+
+ default:
+ ;
+ }
+
+ goto NextTable;
+
+ Found:
+ if ( coverage & 8 ) /* override or add */
+ result = value;
+ else
+ result += value;
+
+ NextTable:
+ p = next;
+ }
+
+ return result;
+ }
+
+#undef TT_KERN_INDEX
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttkern.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttkern.h
new file mode 100644
index 0000000000..c2f1a93d50
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttkern.h
@@ -0,0 +1,52 @@
+/***************************************************************************/
+/* */
+/* ttkern.h */
+/* */
+/* Load the basic TrueType kerning table. This doesn't handle */
+/* kerning data within the GPOS table at the moment. */
+/* */
+/* Copyright 1996-2001, 2002, 2005, 2007 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __TTKERN_H__
+#define __TTKERN_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/internal/tttypes.h"
+
+
+FT_BEGIN_HEADER
+
+
+ FT_LOCAL( FT_Error )
+ tt_face_load_kern( TT_Face face,
+ FT_Stream stream );
+
+ FT_LOCAL( void )
+ tt_face_done_kern( TT_Face face );
+
+ FT_LOCAL( FT_Int )
+ tt_face_get_kerning( TT_Face face,
+ FT_UInt left_glyph,
+ FT_UInt right_glyph );
+
+#define TT_FACE_HAS_KERNING( face ) ( (face)->kern_avail_bits != 0 )
+
+
+FT_END_HEADER
+
+#endif /* __TTKERN_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttload.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttload.c
new file mode 100644
index 0000000000..38b7559e13
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttload.c
@@ -0,0 +1,1295 @@
+/***************************************************************************/
+/* */
+/* ttload.c */
+/* */
+/* Load the basic TrueType tables, i.e., tables that can be either in */
+/* TTF or OTF fonts (body). */
+/* */
+/* Copyright 1996-2010, 2012, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/tttags.h"
+#include "ttload.h"
+
+#include "sferrors.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_ttload
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_face_lookup_table */
+ /* */
+ /* <Description> */
+ /* Looks for a TrueType table by name. */
+ /* */
+ /* <Input> */
+ /* face :: A face object handle. */
+ /* */
+ /* tag :: The searched tag. */
+ /* */
+ /* <Return> */
+ /* A pointer to the table directory entry. 0 if not found. */
+ /* */
+ FT_LOCAL_DEF( TT_Table )
+ tt_face_get_nexttable(TT_Table first, TT_Table limit, TT_Table entry)
+ {
+ TT_Table temp = NULL;
+ if (!entry) return NULL;
+
+ for (first; first < limit; first++){
+ if (entry->Offset + entry->Length <= first->Offset){
+ if (!temp || first->Offset < temp->Offset){
+ temp = first;
+ }
+ }
+ }
+ return temp;
+ }
+
+ FT_LOCAL_DEF( TT_Table )
+ tt_face_lookup_table( TT_Face face,
+ FT_ULong tag )
+ {
+ TT_Table entry;
+ TT_Table limit;
+#ifdef FT_DEBUG_LEVEL_TRACE
+ FT_Bool zero_length = FALSE;
+#endif
+
+
+ FT_TRACE4(( "tt_face_lookup_table: %08p, `%c%c%c%c' -- ",
+ face,
+ (FT_Char)( tag >> 24 ),
+ (FT_Char)( tag >> 16 ),
+ (FT_Char)( tag >> 8 ),
+ (FT_Char)( tag ) ));
+
+ entry = face->dir_tables;
+ limit = entry + face->num_tables;
+
+ for ( ; entry < limit; entry++ )
+ {
+ /* For compatibility with Windows, we consider */
+ /* zero-length tables the same as missing tables. */
+ if ( entry->Tag == tag )
+ {
+ if ( entry->Length != 0 )
+ {
+ if (tag == TTAG_loca){
+ TT_Table next = tt_face_get_nexttable(face->dir_tables, limit, entry);
+ if (next && entry->Offset + entry->Length < next->Offset)
+ entry->Length = next->Offset - entry->Offset;
+ }
+ FT_TRACE4(( "found table.\n" ));
+ return entry;
+ }
+#ifdef FT_DEBUG_LEVEL_TRACE
+ zero_length = TRUE;
+#endif
+ }
+ }
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+ if ( zero_length )
+ FT_TRACE4(( "ignoring empty table\n" ));
+ else
+ FT_TRACE4(( "could not find table\n" ));
+#endif
+
+ return NULL;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_face_goto_table */
+ /* */
+ /* <Description> */
+ /* Looks for a TrueType table by name, then seek a stream to it. */
+ /* */
+ /* <Input> */
+ /* face :: A face object handle. */
+ /* */
+ /* tag :: The searched tag. */
+ /* */
+ /* stream :: The stream to seek when the table is found. */
+ /* */
+ /* <Output> */
+ /* length :: The length of the table if found, undefined otherwise. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ tt_face_goto_table( TT_Face face,
+ FT_ULong tag,
+ FT_Stream stream,
+ FT_ULong* length )
+ {
+ TT_Table table;
+ FT_Error error = 0;
+
+
+ table = tt_face_lookup_table( face, tag );
+ if ( table )
+ {
+ if ( length )
+ *length = table->Length;
+
+ if ( FT_STREAM_SEEK( table->Offset ) )
+ goto Exit;
+ }
+ else
+ error = FT_THROW( Table_Missing );
+
+ Exit:
+ return error;
+ }
+
+
+ /* Here, we */
+ /* */
+ /* - check that `num_tables' is valid (and adjust it if necessary) */
+ /* */
+ /* - look for a `head' table, check its size, and parse it to check */
+ /* whether its `magic' field is correctly set */
+ /* */
+ /* - errors (except errors returned by stream handling) */
+ /* */
+ /* SFNT_Err_Unknown_File_Format: */
+ /* no table is defined in directory, it is not sfnt-wrapped */
+ /* data */
+ /* SFNT_Err_Table_Missing: */
+ /* table directory is valid, but essential tables */
+ /* (head/bhed/SING) are missing */
+ /* */
+ static FT_Error
+ check_table_dir( SFNT_Header sfnt,
+ FT_Stream stream )
+ {
+ FT_Error error;
+ FT_UShort nn, valid_entries = 0;
+ FT_UInt has_head = 0, has_sing = 0, has_meta = 0;
+ FT_ULong offset = sfnt->offset + 12;
+
+ static const FT_Frame_Field table_dir_entry_fields[] =
+ {
+#undef FT_STRUCTURE
+#define FT_STRUCTURE TT_TableRec
+
+ FT_FRAME_START( 16 ),
+ FT_FRAME_ULONG( Tag ),
+ FT_FRAME_ULONG( CheckSum ),
+ FT_FRAME_ULONG( Offset ),
+ FT_FRAME_ULONG( Length ),
+ FT_FRAME_END
+ };
+
+
+ if ( FT_STREAM_SEEK( offset ) )
+ goto Exit;
+
+ for ( nn = 0; nn < sfnt->num_tables; nn++ )
+ {
+ TT_TableRec table;
+
+
+ if ( FT_STREAM_READ_FIELDS( table_dir_entry_fields, &table ) )
+ {
+ nn--;
+ FT_TRACE2(( "check_table_dir:"
+ " can read only %d table%s in font (instead of %d)\n",
+ nn, nn == 1 ? "" : "s", sfnt->num_tables ));
+ sfnt->num_tables = nn;
+ break;
+ }
+
+ /* we ignore invalid tables */
+ if ( table.Offset + table.Length > stream->size )
+ {
+ //BUGID: 53876, the cmap table is invalid, the font file couldn't be used.
+ if (table.Tag == TTAG_cmap) break;
+ FT_TRACE2(( "check_table_dir: table entry %d invalid\n", nn ));
+ continue;
+ }
+ else
+ valid_entries++;
+
+ if ( table.Tag == TTAG_head || table.Tag == TTAG_bhed )
+ {
+ FT_UInt32 magic;
+
+
+#ifndef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+ if ( table.Tag == TTAG_head )
+#endif
+ has_head = 1;
+
+ /*
+ * The table length should be 0x36, but certain font tools make it
+ * 0x38, so we will just check that it is greater.
+ *
+ * Note that according to the specification, the table must be
+ * padded to 32-bit lengths, but this doesn't apply to the value of
+ * its `Length' field!
+ *
+ */
+ if ( table.Length < 0x36 )
+ {
+ FT_TRACE2(( "check_table_dir: `head' table too small\n" ));
+ error = FT_THROW( Table_Missing );
+ goto Exit;
+ }
+
+ if ( FT_STREAM_SEEK( table.Offset + 12 ) ||
+ FT_READ_ULONG( magic ) )
+ goto Exit;
+
+ if ( magic != 0x5F0F3CF5UL )
+ {
+ FT_TRACE2(( "check_table_dir:"
+ " no magic number found in `head' table\n"));
+ error = FT_THROW( Table_Missing );
+ goto Exit;
+ }
+
+ if ( FT_STREAM_SEEK( offset + ( nn + 1 ) * 16 ) )
+ goto Exit;
+ }
+ else if ( table.Tag == TTAG_SING )
+ has_sing = 1;
+ else if ( table.Tag == TTAG_META )
+ has_meta = 1;
+ }
+
+ sfnt->num_tables = valid_entries;
+
+ if ( sfnt->num_tables == 0 )
+ {
+ FT_TRACE2(( "check_table_dir: no tables found\n" ));
+ error = FT_THROW( Unknown_File_Format );
+ goto Exit;
+ }
+
+ /* if `sing' and `meta' tables are present, there is no `head' table */
+ if ( has_head || ( has_sing && has_meta ) )
+ {
+ error = FT_Err_Ok;
+ goto Exit;
+ }
+ else
+ {
+ FT_TRACE2(( "check_table_dir:" ));
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+ FT_TRACE2(( " neither `head', `bhed', nor `sing' table found\n" ));
+#else
+ FT_TRACE2(( " neither `head' nor `sing' table found\n" ));
+#endif
+ error = FT_THROW( Table_Missing );
+ }
+
+ Exit:
+ return error;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_face_load_font_dir */
+ /* */
+ /* <Description> */
+ /* Loads the header of a SFNT font file. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the target face object. */
+ /* */
+ /* stream :: The input stream. */
+ /* */
+ /* <Output> */
+ /* sfnt :: The SFNT header. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ /* <Note> */
+ /* The stream cursor must be at the beginning of the font directory. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ tt_face_load_font_dir( TT_Face face,
+ FT_Stream stream )
+ {
+ SFNT_HeaderRec sfnt;
+ FT_Error error;
+ FT_Memory memory = stream->memory;
+ TT_TableRec* entry;
+ FT_Int nn;
+
+ static const FT_Frame_Field offset_table_fields[] =
+ {
+#undef FT_STRUCTURE
+#define FT_STRUCTURE SFNT_HeaderRec
+
+ FT_FRAME_START( 8 ),
+ FT_FRAME_USHORT( num_tables ),
+ FT_FRAME_USHORT( search_range ),
+ FT_FRAME_USHORT( entry_selector ),
+ FT_FRAME_USHORT( range_shift ),
+ FT_FRAME_END
+ };
+
+
+ FT_TRACE2(( "tt_face_load_font_dir: %08p\n", face ));
+
+ /* read the offset table */
+
+ sfnt.offset = FT_STREAM_POS();
+
+ if ( FT_READ_ULONG( sfnt.format_tag ) ||
+ FT_STREAM_READ_FIELDS( offset_table_fields, &sfnt ) )
+ goto Exit;
+
+ /* many fonts don't have these fields set correctly */
+#if 0
+ if ( sfnt.search_range != 1 << ( sfnt.entry_selector + 4 ) ||
+ sfnt.search_range + sfnt.range_shift != sfnt.num_tables << 4 )
+ return FT_THROW( Unknown_File_Format );
+#endif
+
+ /* load the table directory */
+
+ FT_TRACE2(( "-- Number of tables: %10u\n", sfnt.num_tables ));
+ FT_TRACE2(( "-- Format version: 0x%08lx\n", sfnt.format_tag ));
+
+ if ( sfnt.format_tag != TTAG_OTTO )
+ {
+ /* check first */
+ error = check_table_dir( &sfnt, stream );
+ if ( error )
+ {
+ FT_TRACE2(( "tt_face_load_font_dir:"
+ " invalid table directory for TrueType\n" ));
+
+ goto Exit;
+ }
+ }
+
+ face->num_tables = sfnt.num_tables;
+ face->format_tag = sfnt.format_tag;
+
+ if ( FT_QNEW_ARRAY( face->dir_tables, face->num_tables ) )
+ goto Exit;
+
+ if ( FT_STREAM_SEEK( sfnt.offset + 12 ) ||
+ FT_FRAME_ENTER( face->num_tables * 16L ) )
+ goto Exit;
+
+ entry = face->dir_tables;
+
+ FT_TRACE2(( "\n"
+ " tag offset length checksum\n"
+ " ----------------------------------\n" ));
+
+ for ( nn = 0; nn < sfnt.num_tables; nn++ )
+ {
+ entry->Tag = FT_GET_TAG4();
+ entry->CheckSum = FT_GET_ULONG();
+ entry->Offset = FT_GET_LONG();
+ entry->Length = FT_GET_LONG();
+
+ /* ignore invalid tables */
+ if ( entry->Offset + entry->Length > stream->size )
+ continue;
+ else
+ {
+ FT_TRACE2(( " %c%c%c%c %08lx %08lx %08lx\n",
+ (FT_Char)( entry->Tag >> 24 ),
+ (FT_Char)( entry->Tag >> 16 ),
+ (FT_Char)( entry->Tag >> 8 ),
+ (FT_Char)( entry->Tag ),
+ entry->Offset,
+ entry->Length,
+ entry->CheckSum ));
+ entry++;
+ }
+ }
+
+ FT_FRAME_EXIT();
+
+ FT_TRACE2(( "table directory loaded\n\n" ));
+
+ Exit:
+ return error;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_face_load_any */
+ /* */
+ /* <Description> */
+ /* Loads any font table into client memory. */
+ /* */
+ /* <Input> */
+ /* face :: The face object to look for. */
+ /* */
+ /* tag :: The tag of table to load. Use the value 0 if you want */
+ /* to access the whole font file, else set this parameter */
+ /* to a valid TrueType table tag that you can forge with */
+ /* the MAKE_TT_TAG macro. */
+ /* */
+ /* offset :: The starting offset in the table (or the file if */
+ /* tag == 0). */
+ /* */
+ /* length :: The address of the decision variable: */
+ /* */
+ /* If length == NULL: */
+ /* Loads the whole table. Returns an error if */
+ /* `offset' == 0! */
+ /* */
+ /* If *length == 0: */
+ /* Exits immediately; returning the length of the given */
+ /* table or of the font file, depending on the value of */
+ /* `tag'. */
+ /* */
+ /* If *length != 0: */
+ /* Loads the next `length' bytes of table or font, */
+ /* starting at offset `offset' (in table or font too). */
+ /* */
+ /* <Output> */
+ /* buffer :: The address of target buffer. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ tt_face_load_any( TT_Face face,
+ FT_ULong tag,
+ FT_Long offset,
+ FT_Byte* buffer,
+ FT_ULong* length )
+ {
+ FT_Error error;
+ FT_Stream stream;
+ TT_Table table;
+ FT_ULong size;
+
+
+ if ( tag != 0 )
+ {
+ /* look for tag in font directory */
+ table = tt_face_lookup_table( face, tag );
+ if ( !table )
+ {
+ error = FT_THROW( Table_Missing );
+ goto Exit;
+ }
+
+ offset += table->Offset;
+ size = table->Length;
+ }
+ else
+ /* tag == 0 -- the user wants to access the font file directly */
+ size = face->root.stream->size;
+
+ if ( length && *length == 0 )
+ {
+ *length = size;
+
+ return FT_Err_Ok;
+ }
+
+ if ( length )
+ size = *length;
+
+ stream = face->root.stream;
+ /* the `if' is syntactic sugar for picky compilers */
+ if ( FT_STREAM_READ_AT( offset, buffer, size ) )
+ goto Exit;
+
+ Exit:
+ return error;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_face_load_generic_header */
+ /* */
+ /* <Description> */
+ /* Loads the TrueType table `head' or `bhed'. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the target face object. */
+ /* */
+ /* stream :: The input stream. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ static FT_Error
+ tt_face_load_generic_header( TT_Face face,
+ FT_Stream stream,
+ FT_ULong tag )
+ {
+ FT_Error error;
+ TT_Header* header;
+
+ static const FT_Frame_Field header_fields[] =
+ {
+#undef FT_STRUCTURE
+#define FT_STRUCTURE TT_Header
+
+ FT_FRAME_START( 54 ),
+ FT_FRAME_ULONG ( Table_Version ),
+ FT_FRAME_ULONG ( Font_Revision ),
+ FT_FRAME_LONG ( CheckSum_Adjust ),
+ FT_FRAME_LONG ( Magic_Number ),
+ FT_FRAME_USHORT( Flags ),
+ FT_FRAME_USHORT( Units_Per_EM ),
+ FT_FRAME_LONG ( Created[0] ),
+ FT_FRAME_LONG ( Created[1] ),
+ FT_FRAME_LONG ( Modified[0] ),
+ FT_FRAME_LONG ( Modified[1] ),
+ FT_FRAME_SHORT ( xMin ),
+ FT_FRAME_SHORT ( yMin ),
+ FT_FRAME_SHORT ( xMax ),
+ FT_FRAME_SHORT ( yMax ),
+ FT_FRAME_USHORT( Mac_Style ),
+ FT_FRAME_USHORT( Lowest_Rec_PPEM ),
+ FT_FRAME_SHORT ( Font_Direction ),
+ FT_FRAME_SHORT ( Index_To_Loc_Format ),
+ FT_FRAME_SHORT ( Glyph_Data_Format ),
+ FT_FRAME_END
+ };
+
+
+ error = face->goto_table( face, tag, stream, 0 );
+ if ( error )
+ goto Exit;
+
+ header = &face->header;
+
+ if ( FT_STREAM_READ_FIELDS( header_fields, header ) )
+ goto Exit;
+
+ FT_TRACE3(( "Units per EM: %4u\n", header->Units_Per_EM ));
+ FT_TRACE3(( "IndexToLoc: %4d\n", header->Index_To_Loc_Format ));
+
+ Exit:
+ return error;
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ tt_face_load_head( TT_Face face,
+ FT_Stream stream )
+ {
+ return tt_face_load_generic_header( face, stream, TTAG_head );
+ }
+
+
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+
+ FT_LOCAL_DEF( FT_Error )
+ tt_face_load_bhed( TT_Face face,
+ FT_Stream stream )
+ {
+ return tt_face_load_generic_header( face, stream, TTAG_bhed );
+ }
+
+#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_face_load_max_profile */
+ /* */
+ /* <Description> */
+ /* Loads the maximum profile into a face object. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the target face object. */
+ /* */
+ /* stream :: The input stream. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ tt_face_load_maxp( TT_Face face,
+ FT_Stream stream )
+ {
+ FT_Error error;
+ TT_MaxProfile* maxProfile = &face->max_profile;
+
+ static const FT_Frame_Field maxp_fields[] =
+ {
+#undef FT_STRUCTURE
+#define FT_STRUCTURE TT_MaxProfile
+
+ FT_FRAME_START( 6 ),
+ FT_FRAME_LONG ( version ),
+ FT_FRAME_USHORT( numGlyphs ),
+ FT_FRAME_END
+ };
+
+ static const FT_Frame_Field maxp_fields_extra[] =
+ {
+ FT_FRAME_START( 26 ),
+ FT_FRAME_USHORT( maxPoints ),
+ FT_FRAME_USHORT( maxContours ),
+ FT_FRAME_USHORT( maxCompositePoints ),
+ FT_FRAME_USHORT( maxCompositeContours ),
+ FT_FRAME_USHORT( maxZones ),
+ FT_FRAME_USHORT( maxTwilightPoints ),
+ FT_FRAME_USHORT( maxStorage ),
+ FT_FRAME_USHORT( maxFunctionDefs ),
+ FT_FRAME_USHORT( maxInstructionDefs ),
+ FT_FRAME_USHORT( maxStackElements ),
+ FT_FRAME_USHORT( maxSizeOfInstructions ),
+ FT_FRAME_USHORT( maxComponentElements ),
+ FT_FRAME_USHORT( maxComponentDepth ),
+ FT_FRAME_END
+ };
+
+
+ error = face->goto_table( face, TTAG_maxp, stream, 0 );
+ if ( error )
+ goto Exit;
+
+ if ( FT_STREAM_READ_FIELDS( maxp_fields, maxProfile ) )
+ goto Exit;
+
+ maxProfile->maxPoints = 0;
+ maxProfile->maxContours = 0;
+ maxProfile->maxCompositePoints = 0;
+ maxProfile->maxCompositeContours = 0;
+ maxProfile->maxZones = 0;
+ maxProfile->maxTwilightPoints = 0;
+ maxProfile->maxStorage = 0;
+ maxProfile->maxFunctionDefs = 0;
+ maxProfile->maxInstructionDefs = 0;
+ maxProfile->maxStackElements = 0;
+ maxProfile->maxSizeOfInstructions = 0;
+ maxProfile->maxComponentElements = 0;
+ maxProfile->maxComponentDepth = 0;
+
+ if ( maxProfile->version >= 0x10000L )
+ {
+ if ( FT_STREAM_READ_FIELDS( maxp_fields_extra, maxProfile ) )
+ goto Exit;
+
+ /* XXX: an adjustment that is necessary to load certain */
+ /* broken fonts like `Keystrokes MT' :-( */
+ /* */
+ /* We allocate 64 function entries by default when */
+ /* the maxFunctionDefs value is smaller. */
+
+ if ( maxProfile->maxFunctionDefs < 64 )
+ maxProfile->maxFunctionDefs = 64;
+
+ /* we add 4 phantom points later */
+ if ( maxProfile->maxTwilightPoints > ( 0xFFFFU - 4 ) )
+ {
+ FT_TRACE0(( "tt_face_load_maxp:"
+ " too much twilight points in `maxp' table;\n"
+ " "
+ " some glyphs might be rendered incorrectly\n" ));
+
+ maxProfile->maxTwilightPoints = 0xFFFFU - 4;
+ }
+
+ /* we arbitrarily limit recursion to avoid stack exhaustion */
+ if ( maxProfile->maxComponentDepth > 100 )
+ {
+ FT_TRACE0(( "tt_face_load_maxp:"
+ " abnormally large component depth (%d) set to 100\n",
+ maxProfile->maxComponentDepth ));
+ maxProfile->maxComponentDepth = 100;
+ }
+ }
+
+ FT_TRACE3(( "numGlyphs: %u\n", maxProfile->numGlyphs ));
+
+ Exit:
+ return error;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_face_load_name */
+ /* */
+ /* <Description> */
+ /* Loads the name records. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the target face object. */
+ /* */
+ /* stream :: The input stream. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ tt_face_load_name( TT_Face face,
+ FT_Stream stream )
+ {
+ FT_Error error;
+ FT_Memory memory = stream->memory;
+ FT_ULong table_pos, table_len;
+ FT_ULong storage_start, storage_limit;
+ FT_UInt count;
+ TT_NameTable table;
+
+ static const FT_Frame_Field name_table_fields[] =
+ {
+#undef FT_STRUCTURE
+#define FT_STRUCTURE TT_NameTableRec
+
+ FT_FRAME_START( 6 ),
+ FT_FRAME_USHORT( format ),
+ FT_FRAME_USHORT( numNameRecords ),
+ FT_FRAME_USHORT( storageOffset ),
+ FT_FRAME_END
+ };
+
+ static const FT_Frame_Field name_record_fields[] =
+ {
+#undef FT_STRUCTURE
+#define FT_STRUCTURE TT_NameEntryRec
+
+ /* no FT_FRAME_START */
+ FT_FRAME_USHORT( platformID ),
+ FT_FRAME_USHORT( encodingID ),
+ FT_FRAME_USHORT( languageID ),
+ FT_FRAME_USHORT( nameID ),
+ FT_FRAME_USHORT( stringLength ),
+ FT_FRAME_USHORT( stringOffset ),
+ FT_FRAME_END
+ };
+
+
+ table = &face->name_table;
+ table->stream = stream;
+
+ error = face->goto_table( face, TTAG_name, stream, &table_len );
+ if ( error )
+ goto Exit;
+
+ table_pos = FT_STREAM_POS();
+
+
+ if ( FT_STREAM_READ_FIELDS( name_table_fields, table ) )
+ goto Exit;
+
+ /* Some popular Asian fonts have an invalid `storageOffset' value */
+ /* (it should be at least "6 + 12*num_names"). However, the string */
+ /* offsets, computed as "storageOffset + entry->stringOffset", are */
+ /* valid pointers within the name table... */
+ /* */
+ /* We thus can't check `storageOffset' right now. */
+ /* */
+ storage_start = table_pos + 6 + 12*table->numNameRecords;
+ storage_limit = table_pos + table_len;
+
+ if ( storage_start > storage_limit )
+ {
+ FT_ERROR(( "tt_face_load_name: invalid `name' table\n" ));
+ error = FT_THROW( Name_Table_Missing );
+ goto Exit;
+ }
+
+ /* Allocate the array of name records. */
+ count = table->numNameRecords;
+ table->numNameRecords = 0;
+
+ if ( FT_NEW_ARRAY( table->names, count ) ||
+ FT_FRAME_ENTER( count * 12 ) )
+ goto Exit;
+
+ /* Load the name records and determine how much storage is needed */
+ /* to hold the strings themselves. */
+ {
+ TT_NameEntryRec* entry = table->names;
+
+
+ for ( ; count > 0; count-- )
+ {
+ if ( FT_STREAM_READ_FIELDS( name_record_fields, entry ) )
+ continue;
+
+ /* check that the name is not empty */
+ if ( entry->stringLength == 0 )
+ continue;
+
+ /* check that the name string is within the table */
+ entry->stringOffset += table_pos + table->storageOffset;
+ if ( entry->stringOffset < storage_start ||
+ entry->stringOffset + entry->stringLength > storage_limit )
+ {
+ /* invalid entry - ignore it */
+ entry->stringOffset = 0;
+ entry->stringLength = 0;
+ continue;
+ }
+
+ entry++;
+ }
+
+ table->numNameRecords = (FT_UInt)( entry - table->names );
+ }
+
+ FT_FRAME_EXIT();
+
+ /* everything went well, update face->num_names */
+ face->num_names = (FT_UShort) table->numNameRecords;
+
+ Exit:
+ return error;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_face_free_names */
+ /* */
+ /* <Description> */
+ /* Frees the name records. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the target face object. */
+ /* */
+ FT_LOCAL_DEF( void )
+ tt_face_free_name( TT_Face face )
+ {
+ FT_Memory memory = face->root.driver->root.memory;
+ TT_NameTable table = &face->name_table;
+ TT_NameEntry entry = table->names;
+ FT_UInt count = table->numNameRecords;
+
+
+ if ( table->names )
+ {
+ for ( ; count > 0; count--, entry++ )
+ {
+ FT_FREE( entry->string );
+ entry->stringLength = 0;
+ }
+
+ /* free strings table */
+ FT_FREE( table->names );
+ }
+
+ table->numNameRecords = 0;
+ table->format = 0;
+ table->storageOffset = 0;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_face_load_cmap */
+ /* */
+ /* <Description> */
+ /* Loads the cmap directory in a face object. The cmaps themselves */
+ /* are loaded on demand in the `ttcmap.c' module. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the target face object. */
+ /* */
+ /* stream :: A handle to the input stream. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+
+ FT_LOCAL_DEF( FT_Error )
+ tt_face_load_cmap( TT_Face face,
+ FT_Stream stream )
+ {
+ FT_Error error;
+
+
+ error = face->goto_table( face, TTAG_cmap, stream, &face->cmap_size );
+ if ( error )
+ goto Exit;
+
+ if ( FT_FRAME_EXTRACT( face->cmap_size, face->cmap_table ) )
+ face->cmap_size = 0;
+
+ Exit:
+ return error;
+ }
+
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_face_load_os2 */
+ /* */
+ /* <Description> */
+ /* Loads the OS2 table. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the target face object. */
+ /* */
+ /* stream :: A handle to the input stream. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ tt_face_load_os2( TT_Face face,
+ FT_Stream stream )
+ {
+ FT_Error error;
+ TT_OS2* os2;
+
+ static const FT_Frame_Field os2_fields[] =
+ {
+#undef FT_STRUCTURE
+#define FT_STRUCTURE TT_OS2
+
+ FT_FRAME_START( 78 ),
+ FT_FRAME_USHORT( version ),
+ FT_FRAME_SHORT ( xAvgCharWidth ),
+ FT_FRAME_USHORT( usWeightClass ),
+ FT_FRAME_USHORT( usWidthClass ),
+ FT_FRAME_SHORT ( fsType ),
+ FT_FRAME_SHORT ( ySubscriptXSize ),
+ FT_FRAME_SHORT ( ySubscriptYSize ),
+ FT_FRAME_SHORT ( ySubscriptXOffset ),
+ FT_FRAME_SHORT ( ySubscriptYOffset ),
+ FT_FRAME_SHORT ( ySuperscriptXSize ),
+ FT_FRAME_SHORT ( ySuperscriptYSize ),
+ FT_FRAME_SHORT ( ySuperscriptXOffset ),
+ FT_FRAME_SHORT ( ySuperscriptYOffset ),
+ FT_FRAME_SHORT ( yStrikeoutSize ),
+ FT_FRAME_SHORT ( yStrikeoutPosition ),
+ FT_FRAME_SHORT ( sFamilyClass ),
+ FT_FRAME_BYTE ( panose[0] ),
+ FT_FRAME_BYTE ( panose[1] ),
+ FT_FRAME_BYTE ( panose[2] ),
+ FT_FRAME_BYTE ( panose[3] ),
+ FT_FRAME_BYTE ( panose[4] ),
+ FT_FRAME_BYTE ( panose[5] ),
+ FT_FRAME_BYTE ( panose[6] ),
+ FT_FRAME_BYTE ( panose[7] ),
+ FT_FRAME_BYTE ( panose[8] ),
+ FT_FRAME_BYTE ( panose[9] ),
+ FT_FRAME_ULONG ( ulUnicodeRange1 ),
+ FT_FRAME_ULONG ( ulUnicodeRange2 ),
+ FT_FRAME_ULONG ( ulUnicodeRange3 ),
+ FT_FRAME_ULONG ( ulUnicodeRange4 ),
+ FT_FRAME_BYTE ( achVendID[0] ),
+ FT_FRAME_BYTE ( achVendID[1] ),
+ FT_FRAME_BYTE ( achVendID[2] ),
+ FT_FRAME_BYTE ( achVendID[3] ),
+
+ FT_FRAME_USHORT( fsSelection ),
+ FT_FRAME_USHORT( usFirstCharIndex ),
+ FT_FRAME_USHORT( usLastCharIndex ),
+ FT_FRAME_SHORT ( sTypoAscender ),
+ FT_FRAME_SHORT ( sTypoDescender ),
+ FT_FRAME_SHORT ( sTypoLineGap ),
+ FT_FRAME_USHORT( usWinAscent ),
+ FT_FRAME_USHORT( usWinDescent ),
+ FT_FRAME_END
+ };
+
+ static const FT_Frame_Field os2_fields_extra[] =
+ {
+ FT_FRAME_START( 8 ),
+ FT_FRAME_ULONG( ulCodePageRange1 ),
+ FT_FRAME_ULONG( ulCodePageRange2 ),
+ FT_FRAME_END
+ };
+
+ static const FT_Frame_Field os2_fields_extra2[] =
+ {
+ FT_FRAME_START( 10 ),
+ FT_FRAME_SHORT ( sxHeight ),
+ FT_FRAME_SHORT ( sCapHeight ),
+ FT_FRAME_USHORT( usDefaultChar ),
+ FT_FRAME_USHORT( usBreakChar ),
+ FT_FRAME_USHORT( usMaxContext ),
+ FT_FRAME_END
+ };
+
+
+ /* We now support old Mac fonts where the OS/2 table doesn't */
+ /* exist. Simply put, we set the `version' field to 0xFFFF */
+ /* and test this value each time we need to access the table. */
+ error = face->goto_table( face, TTAG_OS2, stream, 0 );
+ if ( error )
+ goto Exit;
+
+ os2 = &face->os2;
+
+ if ( FT_STREAM_READ_FIELDS( os2_fields, os2 ) )
+ goto Exit;
+
+ os2->ulCodePageRange1 = 0;
+ os2->ulCodePageRange2 = 0;
+ os2->sxHeight = 0;
+ os2->sCapHeight = 0;
+ os2->usDefaultChar = 0;
+ os2->usBreakChar = 0;
+ os2->usMaxContext = 0;
+
+ if ( os2->version >= 0x0001 )
+ {
+ /* only version 1 tables */
+ if ( FT_STREAM_READ_FIELDS( os2_fields_extra, os2 ) )
+ goto Exit;
+
+ if ( os2->version >= 0x0002 )
+ {
+ /* only version 2 tables */
+ if ( FT_STREAM_READ_FIELDS( os2_fields_extra2, os2 ) )
+ goto Exit;
+ }
+ }
+
+ FT_TRACE3(( "sTypoAscender: %4d\n", os2->sTypoAscender ));
+ FT_TRACE3(( "sTypoDescender: %4d\n", os2->sTypoDescender ));
+ FT_TRACE3(( "usWinAscent: %4u\n", os2->usWinAscent ));
+ FT_TRACE3(( "usWinDescent: %4u\n", os2->usWinDescent ));
+ FT_TRACE3(( "fsSelection: 0x%2x\n", os2->fsSelection ));
+
+ Exit:
+ /*return error;*/
+ return 0; /* XYQ 2007-11-23 We can't just quit if OS/2 table can't be loaded.
+ TESTDOC: Bug #3160 - MyDoc.pdf */
+
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_face_load_postscript */
+ /* */
+ /* <Description> */
+ /* Loads the Postscript table. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the target face object. */
+ /* */
+ /* stream :: A handle to the input stream. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ tt_face_load_post( TT_Face face,
+ FT_Stream stream )
+ {
+ FT_Error error;
+ TT_Postscript* post = &face->postscript;
+
+ static const FT_Frame_Field post_fields[] =
+ {
+#undef FT_STRUCTURE
+#define FT_STRUCTURE TT_Postscript
+
+ FT_FRAME_START( 32 ),
+ FT_FRAME_ULONG( FormatType ),
+ FT_FRAME_ULONG( italicAngle ),
+ FT_FRAME_SHORT( underlinePosition ),
+ FT_FRAME_SHORT( underlineThickness ),
+ FT_FRAME_ULONG( isFixedPitch ),
+ FT_FRAME_ULONG( minMemType42 ),
+ FT_FRAME_ULONG( maxMemType42 ),
+ FT_FRAME_ULONG( minMemType1 ),
+ FT_FRAME_ULONG( maxMemType1 ),
+ FT_FRAME_END
+ };
+
+
+ error = face->goto_table( face, TTAG_post, stream, 0 );
+ if ( error )
+ return error;
+
+ if ( FT_STREAM_READ_FIELDS( post_fields, post ) )
+ return error;
+
+ /* we don't load the glyph names, we do that in another */
+ /* module (ttpost). */
+
+ FT_TRACE3(( "FormatType: 0x%x\n", post->FormatType ));
+ FT_TRACE3(( "isFixedPitch: %s\n", post->isFixedPitch
+ ? " yes" : " no" ));
+
+ return FT_Err_Ok;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_face_load_pclt */
+ /* */
+ /* <Description> */
+ /* Loads the PCL 5 Table. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the target face object. */
+ /* */
+ /* stream :: A handle to the input stream. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ tt_face_load_pclt( TT_Face face,
+ FT_Stream stream )
+ {
+ static const FT_Frame_Field pclt_fields[] =
+ {
+#undef FT_STRUCTURE
+#define FT_STRUCTURE TT_PCLT
+
+ FT_FRAME_START( 54 ),
+ FT_FRAME_ULONG ( Version ),
+ FT_FRAME_ULONG ( FontNumber ),
+ FT_FRAME_USHORT( Pitch ),
+ FT_FRAME_USHORT( xHeight ),
+ FT_FRAME_USHORT( Style ),
+ FT_FRAME_USHORT( TypeFamily ),
+ FT_FRAME_USHORT( CapHeight ),
+ FT_FRAME_BYTES ( TypeFace, 16 ),
+ FT_FRAME_BYTES ( CharacterComplement, 8 ),
+ FT_FRAME_BYTES ( FileName, 6 ),
+ FT_FRAME_CHAR ( StrokeWeight ),
+ FT_FRAME_CHAR ( WidthType ),
+ FT_FRAME_BYTE ( SerifStyle ),
+ FT_FRAME_BYTE ( Reserved ),
+ FT_FRAME_END
+ };
+
+ FT_Error error;
+ TT_PCLT* pclt = &face->pclt;
+
+
+ /* optional table */
+ error = face->goto_table( face, TTAG_PCLT, stream, 0 );
+ if ( error )
+ goto Exit;
+
+ if ( FT_STREAM_READ_FIELDS( pclt_fields, pclt ) )
+ goto Exit;
+
+ Exit:
+ return error;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_face_load_gasp */
+ /* */
+ /* <Description> */
+ /* Loads the `gasp' table into a face object. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the target face object. */
+ /* */
+ /* stream :: The input stream. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ tt_face_load_gasp( TT_Face face,
+ FT_Stream stream )
+ {
+ FT_Error error;
+ FT_Memory memory = stream->memory;
+
+ FT_UInt j,num_ranges;
+ TT_GaspRange gaspranges = NULL;
+
+
+ /* the gasp table is optional */
+ error = face->goto_table( face, TTAG_gasp, stream, 0 );
+ if ( error )
+ goto Exit;
+
+ if ( FT_FRAME_ENTER( 4L ) )
+ goto Exit;
+
+ face->gasp.version = FT_GET_USHORT();
+ face->gasp.numRanges = FT_GET_USHORT();
+
+ FT_FRAME_EXIT();
+
+ /* only support versions 0 and 1 of the table */
+ if ( face->gasp.version >= 2 )
+ {
+ face->gasp.numRanges = 0;
+ error = FT_THROW( Invalid_Table );
+ goto Exit;
+ }
+
+ num_ranges = face->gasp.numRanges;
+ FT_TRACE3(( "numRanges: %u\n", num_ranges ));
+
+ if ( FT_QNEW_ARRAY( face->gasp.gaspRanges, num_ranges ) ||
+ FT_FRAME_ENTER( num_ranges * 4L ) )
+ goto Exit;
+
+ gaspranges = face->gasp.gaspRanges;
+
+ for ( j = 0; j < num_ranges; j++ )
+ {
+ gaspranges[j].maxPPEM = FT_GET_USHORT();
+ gaspranges[j].gaspFlag = FT_GET_USHORT();
+
+ FT_TRACE3(( "gaspRange %d: rangeMaxPPEM %5d, rangeGaspBehavior 0x%x\n",
+ j,
+ gaspranges[j].maxPPEM,
+ gaspranges[j].gaspFlag ));
+ }
+
+ FT_FRAME_EXIT();
+
+ Exit:
+ return error;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttload.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttload.h
new file mode 100644
index 0000000000..a07bf099cd
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttload.h
@@ -0,0 +1,112 @@
+/***************************************************************************/
+/* */
+/* ttload.h */
+/* */
+/* Load the basic TrueType tables, i.e., tables that can be either in */
+/* TTF or OTF fonts (specification). */
+/* */
+/* Copyright 1996-2001, 2002, 2005, 2006 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __TTLOAD_H__
+#define __TTLOAD_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/internal/tttypes.h"
+
+
+FT_BEGIN_HEADER
+
+
+ FT_LOCAL( TT_Table )
+ tt_face_lookup_table( TT_Face face,
+ FT_ULong tag );
+
+ FT_LOCAL( FT_Error )
+ tt_face_goto_table( TT_Face face,
+ FT_ULong tag,
+ FT_Stream stream,
+ FT_ULong* length );
+
+
+ FT_LOCAL( FT_Error )
+ tt_face_load_font_dir( TT_Face face,
+ FT_Stream stream );
+
+
+ FT_LOCAL( FT_Error )
+ tt_face_load_any( TT_Face face,
+ FT_ULong tag,
+ FT_Long offset,
+ FT_Byte* buffer,
+ FT_ULong* length );
+
+
+ FT_LOCAL( FT_Error )
+ tt_face_load_head( TT_Face face,
+ FT_Stream stream );
+
+
+ FT_LOCAL( FT_Error )
+ tt_face_load_cmap( TT_Face face,
+ FT_Stream stream );
+
+
+ FT_LOCAL( FT_Error )
+ tt_face_load_maxp( TT_Face face,
+ FT_Stream stream );
+
+
+ FT_LOCAL( FT_Error )
+ tt_face_load_name( TT_Face face,
+ FT_Stream stream );
+
+
+ FT_LOCAL( FT_Error )
+ tt_face_load_os2( TT_Face face,
+ FT_Stream stream );
+
+
+ FT_LOCAL( FT_Error )
+ tt_face_load_post( TT_Face face,
+ FT_Stream stream );
+
+
+ FT_LOCAL( FT_Error )
+ tt_face_load_pclt( TT_Face face,
+ FT_Stream stream );
+
+ FT_LOCAL( void )
+ tt_face_free_name( TT_Face face );
+
+
+ FT_LOCAL( FT_Error )
+ tt_face_load_gasp( TT_Face face,
+ FT_Stream stream );
+
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+
+ FT_LOCAL( FT_Error )
+ tt_face_load_bhed( TT_Face face,
+ FT_Stream stream );
+
+#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
+
+
+FT_END_HEADER
+
+#endif /* __TTLOAD_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttmtx.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttmtx.c
new file mode 100644
index 0000000000..9fe61fb356
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttmtx.c
@@ -0,0 +1,286 @@
+/***************************************************************************/
+/* */
+/* ttmtx.c */
+/* */
+/* Load the metrics tables common to TTF and OTF fonts (body). */
+/* */
+/* Copyright 2006-2009, 2011-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/tttags.h"
+#include "ttmtx.h"
+
+#include "sferrors.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_ttmtx
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_face_load_hmtx */
+ /* */
+ /* <Description> */
+ /* Load the `hmtx' or `vmtx' table into a face object. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the target face object. */
+ /* */
+ /* stream :: The input stream. */
+ /* */
+ /* vertical :: A boolean flag. If set, load `vmtx'. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ tt_face_load_hmtx( TT_Face face,
+ FT_Stream stream,
+ FT_Bool vertical )
+ {
+ FT_Error error;
+ FT_ULong tag, table_size;
+ FT_ULong* ptable_offset;
+ FT_ULong* ptable_size;
+
+
+ if ( vertical )
+ {
+ tag = TTAG_vmtx;
+ ptable_offset = &face->vert_metrics_offset;
+ ptable_size = &face->vert_metrics_size;
+ }
+ else
+ {
+ tag = TTAG_hmtx;
+ ptable_offset = &face->horz_metrics_offset;
+ ptable_size = &face->horz_metrics_size;
+ }
+
+ error = face->goto_table( face, tag, stream, &table_size );
+#if 0
+ if ( error )
+ goto Fail;
+
+ *ptable_size = table_size;
+ *ptable_offset = FT_STREAM_POS();
+
+ Fail:
+ return error;
+#else
+ *ptable_size = error ? 0 : table_size;
+ *ptable_offset = FT_STREAM_POS();
+
+ return 0;
+#endif
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_face_load_hhea */
+ /* */
+ /* <Description> */
+ /* Load the `hhea' or 'vhea' table into a face object. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the target face object. */
+ /* */
+ /* stream :: The input stream. */
+ /* */
+ /* vertical :: A boolean flag. If set, load `vhea'. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ tt_face_load_hhea( TT_Face face,
+ FT_Stream stream,
+ FT_Bool vertical )
+ {
+ FT_Error error;
+ TT_HoriHeader* header;
+
+ static const FT_Frame_Field metrics_header_fields[] =
+ {
+#undef FT_STRUCTURE
+#define FT_STRUCTURE TT_HoriHeader
+
+ FT_FRAME_START( 36 ),
+ FT_FRAME_ULONG ( Version ),
+ FT_FRAME_SHORT ( Ascender ),
+ FT_FRAME_SHORT ( Descender ),
+ FT_FRAME_SHORT ( Line_Gap ),
+ FT_FRAME_USHORT( advance_Width_Max ),
+ FT_FRAME_SHORT ( min_Left_Side_Bearing ),
+ FT_FRAME_SHORT ( min_Right_Side_Bearing ),
+ FT_FRAME_SHORT ( xMax_Extent ),
+ FT_FRAME_SHORT ( caret_Slope_Rise ),
+ FT_FRAME_SHORT ( caret_Slope_Run ),
+ FT_FRAME_SHORT ( caret_Offset ),
+ FT_FRAME_SHORT ( Reserved[0] ),
+ FT_FRAME_SHORT ( Reserved[1] ),
+ FT_FRAME_SHORT ( Reserved[2] ),
+ FT_FRAME_SHORT ( Reserved[3] ),
+ FT_FRAME_SHORT ( metric_Data_Format ),
+ FT_FRAME_USHORT( number_Of_HMetrics ),
+ FT_FRAME_END
+ };
+
+
+ if ( vertical )
+ {
+ void *v = &face->vertical;
+
+
+ error = face->goto_table( face, TTAG_vhea, stream, 0 );
+ if ( error )
+ goto Fail;
+
+ header = (TT_HoriHeader*)v;
+ }
+ else
+ {
+ error = face->goto_table( face, TTAG_hhea, stream, 0 );
+ if ( error )
+ goto Fail;
+
+ header = &face->horizontal;
+ }
+
+ if ( FT_STREAM_READ_FIELDS( metrics_header_fields, header ) )
+ goto Fail;
+
+ FT_TRACE3(( "Ascender: %5d\n", header->Ascender ));
+ FT_TRACE3(( "Descender: %5d\n", header->Descender ));
+ FT_TRACE3(( "number_Of_Metrics: %5u\n", header->number_Of_HMetrics ));
+
+ header->long_metrics = NULL;
+ header->short_metrics = NULL;
+
+ Fail:
+ return error;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_face_get_metrics */
+ /* */
+ /* <Description> */
+ /* Returns the horizontal or vertical metrics in font units for a */
+ /* given glyph. The metrics are the left side bearing (resp. top */
+ /* side bearing) and advance width (resp. advance height). */
+ /* */
+ /* <Input> */
+ /* header :: A pointer to either the horizontal or vertical metrics */
+ /* structure. */
+ /* */
+ /* idx :: The glyph index. */
+ /* */
+ /* <Output> */
+ /* bearing :: The bearing, either left side or top side. */
+ /* */
+ /* advance :: The advance width resp. advance height. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ tt_face_get_metrics( TT_Face face,
+ FT_Bool vertical,
+ FT_UInt gindex,
+ FT_Short *abearing,
+ FT_UShort *aadvance )
+ {
+ FT_Error error;
+ FT_Stream stream = face->root.stream;
+ TT_HoriHeader* header;
+ FT_ULong table_pos, table_size, table_end;
+ FT_UShort k;
+
+
+ if ( vertical )
+ {
+ void* v = &face->vertical;
+
+
+ header = (TT_HoriHeader*)v;
+ table_pos = face->vert_metrics_offset;
+ table_size = face->vert_metrics_size;
+ }
+ else
+ {
+ header = &face->horizontal;
+ table_pos = face->horz_metrics_offset;
+ table_size = face->horz_metrics_size;
+ }
+
+ table_end = table_pos + table_size;
+
+ k = header->number_Of_HMetrics;
+
+ if ( k > 0 )
+ {
+ if ( gindex < (FT_UInt)k )
+ {
+ table_pos += 4 * gindex;
+ if ( table_pos + 4 > table_end )
+ goto NoData;
+
+ if ( FT_STREAM_SEEK( table_pos ) ||
+ FT_READ_USHORT( *aadvance ) ||
+ FT_READ_SHORT( *abearing ) )
+ goto NoData;
+ }
+ else
+ {
+ table_pos += 4 * ( k - 1 );
+ if ( table_pos + 4 > table_end )
+ goto NoData;
+
+ if ( FT_STREAM_SEEK( table_pos ) ||
+ FT_READ_USHORT( *aadvance ) )
+ goto NoData;
+
+ table_pos += 4 + 2 * ( gindex - k );
+ if ( table_pos + 2 > table_end )
+ *abearing = 0;
+ else
+ {
+ if ( !FT_STREAM_SEEK( table_pos ) )
+ (void)FT_READ_SHORT( *abearing );
+ }
+ }
+ }
+ else
+ {
+ NoData:
+ *abearing = 0;
+ *aadvance = 0;
+ }
+
+ return FT_Err_Ok;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttmtx.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttmtx.h
new file mode 100644
index 0000000000..78c0f06a7a
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttmtx.h
@@ -0,0 +1,55 @@
+/***************************************************************************/
+/* */
+/* ttmtx.h */
+/* */
+/* Load the metrics tables common to TTF and OTF fonts (specification). */
+/* */
+/* Copyright 2006 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __TTMTX_H__
+#define __TTMTX_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/internal/tttypes.h"
+
+
+FT_BEGIN_HEADER
+
+
+ FT_LOCAL( FT_Error )
+ tt_face_load_hhea( TT_Face face,
+ FT_Stream stream,
+ FT_Bool vertical );
+
+
+ FT_LOCAL( FT_Error )
+ tt_face_load_hmtx( TT_Face face,
+ FT_Stream stream,
+ FT_Bool vertical );
+
+
+ FT_LOCAL( FT_Error )
+ tt_face_get_metrics( TT_Face face,
+ FT_Bool vertical,
+ FT_UInt gindex,
+ FT_Short* abearing,
+ FT_UShort* aadvance );
+
+FT_END_HEADER
+
+#endif /* __TTMTX_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttpost.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttpost.c
new file mode 100644
index 0000000000..37688f22c5
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttpost.c
@@ -0,0 +1,563 @@
+/***************************************************************************/
+/* */
+/* ttpost.c */
+/* */
+/* Postcript name table processing for TrueType and OpenType fonts */
+/* (body). */
+/* */
+/* Copyright 1996-2003, 2006-2010, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* The post table is not completely loaded by the core engine. This */
+ /* file loads the missing PS glyph names and implements an API to access */
+ /* them. */
+ /* */
+ /*************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/tttags.h"
+#include "ttpost.h"
+
+#include "sferrors.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_ttpost
+
+
+ /* If this configuration macro is defined, we rely on the `PSNames' */
+ /* module to grab the glyph names. */
+
+#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES
+
+
+#include "../../include/freetype/internal/services/svpscmap.h"
+
+#define MAC_NAME( x ) ( (FT_String*)psnames->macintosh_name( x ) )
+
+
+#else /* FT_CONFIG_OPTION_POSTSCRIPT_NAMES */
+
+
+ /* Otherwise, we ignore the `PSNames' module, and provide our own */
+ /* table of Mac names. Thus, it is possible to build a version of */
+ /* FreeType without the Type 1 driver & PSNames module. */
+
+#define MAC_NAME( x ) ( (FT_String*)tt_post_default_names[x] )
+
+ /* the 258 default Mac PS glyph names */
+
+ static const FT_String* const tt_post_default_names[258] =
+ {
+ /* 0 */
+ ".notdef", ".null", "CR", "space", "exclam",
+ "quotedbl", "numbersign", "dollar", "percent", "ampersand",
+ /* 10 */
+ "quotesingle", "parenleft", "parenright", "asterisk", "plus",
+ "comma", "hyphen", "period", "slash", "zero",
+ /* 20 */
+ "one", "two", "three", "four", "five",
+ "six", "seven", "eight", "nine", "colon",
+ /* 30 */
+ "semicolon", "less", "equal", "greater", "question",
+ "at", "A", "B", "C", "D",
+ /* 40 */
+ "E", "F", "G", "H", "I",
+ "J", "K", "L", "M", "N",
+ /* 50 */
+ "O", "P", "Q", "R", "S",
+ "T", "U", "V", "W", "X",
+ /* 60 */
+ "Y", "Z", "bracketleft", "backslash", "bracketright",
+ "asciicircum", "underscore", "grave", "a", "b",
+ /* 70 */
+ "c", "d", "e", "f", "g",
+ "h", "i", "j", "k", "l",
+ /* 80 */
+ "m", "n", "o", "p", "q",
+ "r", "s", "t", "u", "v",
+ /* 90 */
+ "w", "x", "y", "z", "braceleft",
+ "bar", "braceright", "asciitilde", "Adieresis", "Aring",
+ /* 100 */
+ "Ccedilla", "Eacute", "Ntilde", "Odieresis", "Udieresis",
+ "aacute", "agrave", "acircumflex", "adieresis", "atilde",
+ /* 110 */
+ "aring", "ccedilla", "eacute", "egrave", "ecircumflex",
+ "edieresis", "iacute", "igrave", "icircumflex", "idieresis",
+ /* 120 */
+ "ntilde", "oacute", "ograve", "ocircumflex", "odieresis",
+ "otilde", "uacute", "ugrave", "ucircumflex", "udieresis",
+ /* 130 */
+ "dagger", "degree", "cent", "sterling", "section",
+ "bullet", "paragraph", "germandbls", "registered", "copyright",
+ /* 140 */
+ "trademark", "acute", "dieresis", "notequal", "AE",
+ "Oslash", "infinity", "plusminus", "lessequal", "greaterequal",
+ /* 150 */
+ "yen", "mu", "partialdiff", "summation", "product",
+ "pi", "integral", "ordfeminine", "ordmasculine", "Omega",
+ /* 160 */
+ "ae", "oslash", "questiondown", "exclamdown", "logicalnot",
+ "radical", "florin", "approxequal", "Delta", "guillemotleft",
+ /* 170 */
+ "guillemotright", "ellipsis", "nbspace", "Agrave", "Atilde",
+ "Otilde", "OE", "oe", "endash", "emdash",
+ /* 180 */
+ "quotedblleft", "quotedblright", "quoteleft", "quoteright", "divide",
+ "lozenge", "ydieresis", "Ydieresis", "fraction", "currency",
+ /* 190 */
+ "guilsinglleft", "guilsinglright", "fi", "fl", "daggerdbl",
+ "periodcentered", "quotesinglbase", "quotedblbase", "perthousand", "Acircumflex",
+ /* 200 */
+ "Ecircumflex", "Aacute", "Edieresis", "Egrave", "Iacute",
+ "Icircumflex", "Idieresis", "Igrave", "Oacute", "Ocircumflex",
+ /* 210 */
+ "apple", "Ograve", "Uacute", "Ucircumflex", "Ugrave",
+ "dotlessi", "circumflex", "tilde", "macron", "breve",
+ /* 220 */
+ "dotaccent", "ring", "cedilla", "hungarumlaut", "ogonek",
+ "caron", "Lslash", "lslash", "Scaron", "scaron",
+ /* 230 */
+ "Zcaron", "zcaron", "brokenbar", "Eth", "eth",
+ "Yacute", "yacute", "Thorn", "thorn", "minus",
+ /* 240 */
+ "multiply", "onesuperior", "twosuperior", "threesuperior", "onehalf",
+ "onequarter", "threequarters", "franc", "Gbreve", "gbreve",
+ /* 250 */
+ "Idot", "Scedilla", "scedilla", "Cacute", "cacute",
+ "Ccaron", "ccaron", "dmacron",
+ };
+
+
+#endif /* FT_CONFIG_OPTION_POSTSCRIPT_NAMES */
+
+
+ static FT_Error
+ load_format_20( TT_Face face,
+ FT_Stream stream,
+ FT_Long post_limit )
+ {
+ FT_Memory memory = stream->memory;
+ FT_Error error;
+
+ FT_Int num_glyphs;
+ FT_UShort num_names;
+
+ FT_UShort* glyph_indices = 0;
+ FT_Char** name_strings = 0;
+
+
+ if ( FT_READ_USHORT( num_glyphs ) )
+ goto Exit;
+
+ /* UNDOCUMENTED! The number of glyphs in this table can be smaller */
+ /* than the value in the maxp table (cf. cyberbit.ttf). */
+
+ /* There already exist fonts which have more than 32768 glyph names */
+ /* in this table, so the test for this threshold has been dropped. */
+
+ if ( num_glyphs > face->max_profile.numGlyphs )
+ {
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+ /* load the indices */
+ {
+ FT_Int n;
+
+
+ if ( FT_NEW_ARRAY ( glyph_indices, num_glyphs ) ||
+ FT_FRAME_ENTER( num_glyphs * 2L ) )
+ goto Fail;
+
+ for ( n = 0; n < num_glyphs; n++ )
+ glyph_indices[n] = FT_GET_USHORT();
+
+ FT_FRAME_EXIT();
+ }
+
+ /* compute number of names stored in table */
+ {
+ FT_Int n;
+
+
+ num_names = 0;
+
+ for ( n = 0; n < num_glyphs; n++ )
+ {
+ FT_Int idx;
+
+
+ idx = glyph_indices[n];
+ if ( idx >= 258 )
+ {
+ idx -= 257;
+ if ( idx > num_names )
+ num_names = (FT_UShort)idx;
+ }
+ }
+ }
+
+ /* now load the name strings */
+ {
+ FT_UShort n;
+
+
+ if ( FT_NEW_ARRAY( name_strings, num_names ) )
+ goto Fail;
+
+ for ( n = 0; n < num_names; n++ )
+ {
+ FT_UInt len;
+
+
+ if ( FT_STREAM_POS() >= post_limit )
+ break;
+ else
+ {
+ FT_TRACE6(( "load_format_20: %d byte left in post table\n",
+ post_limit - FT_STREAM_POS() ));
+
+ if ( FT_READ_BYTE( len ) )
+ goto Fail1;
+ }
+
+ if ( (FT_Int)len > post_limit ||
+ FT_STREAM_POS() > post_limit - (FT_Int)len )
+ {
+ FT_ERROR(( "load_format_20:"
+ " exceeding string length (%d),"
+ " truncating at end of post table (%d byte left)\n",
+ len, post_limit - FT_STREAM_POS() ));
+ len = FT_MAX( 0, post_limit - FT_STREAM_POS() );
+ }
+
+ if ( FT_NEW_ARRAY( name_strings[n], len + 1 ) ||
+ FT_STREAM_READ( name_strings[n], len ) )
+ goto Fail1;
+
+ name_strings[n][len] = '\0';
+ }
+
+ if ( n < num_names )
+ {
+ FT_ERROR(( "load_format_20:"
+ " all entries in post table are already parsed,"
+ " using NULL names for gid %d - %d\n",
+ n, num_names - 1 ));
+ for ( ; n < num_names; n++ )
+ if ( FT_NEW_ARRAY( name_strings[n], 1 ) )
+ goto Fail1;
+ else
+ name_strings[n][0] = '\0';
+ }
+ }
+
+ /* all right, set table fields and exit successfully */
+ {
+ TT_Post_20 table = &face->postscript_names.names.format_20;
+
+
+ table->num_glyphs = (FT_UShort)num_glyphs;
+ table->num_names = (FT_UShort)num_names;
+ table->glyph_indices = glyph_indices;
+ table->glyph_names = name_strings;
+ }
+ return FT_Err_Ok;
+
+ Fail1:
+ {
+ FT_UShort n;
+
+
+ for ( n = 0; n < num_names; n++ )
+ FT_FREE( name_strings[n] );
+ }
+
+ Fail:
+ FT_FREE( name_strings );
+ FT_FREE( glyph_indices );
+
+ Exit:
+ return error;
+ }
+
+
+ static FT_Error
+ load_format_25( TT_Face face,
+ FT_Stream stream,
+ FT_Long post_limit )
+ {
+ FT_Memory memory = stream->memory;
+ FT_Error error;
+
+ FT_Int num_glyphs;
+ FT_Char* offset_table = 0;
+
+ FT_UNUSED( post_limit );
+
+
+ /* UNDOCUMENTED! This value appears only in the Apple TT specs. */
+ if ( FT_READ_USHORT( num_glyphs ) )
+ goto Exit;
+
+ /* check the number of glyphs */
+ if ( num_glyphs > face->max_profile.numGlyphs || num_glyphs > 258 )
+ {
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+ if ( FT_NEW_ARRAY( offset_table, num_glyphs ) ||
+ FT_STREAM_READ( offset_table, num_glyphs ) )
+ goto Fail;
+
+ /* now check the offset table */
+ {
+ FT_Int n;
+
+
+ for ( n = 0; n < num_glyphs; n++ )
+ {
+ FT_Long idx = (FT_Long)n + offset_table[n];
+
+
+ if ( idx < 0 || idx > num_glyphs )
+ {
+ error = FT_THROW( Invalid_File_Format );
+ goto Fail;
+ }
+ }
+ }
+
+ /* OK, set table fields and exit successfully */
+ {
+ TT_Post_25 table = &face->postscript_names.names.format_25;
+
+
+ table->num_glyphs = (FT_UShort)num_glyphs;
+ table->offsets = offset_table;
+ }
+
+ return FT_Err_Ok;
+
+ Fail:
+ FT_FREE( offset_table );
+
+ Exit:
+ return error;
+ }
+
+
+ static FT_Error
+ load_post_names( TT_Face face )
+ {
+ FT_Stream stream;
+ FT_Error error;
+ FT_Fixed format;
+ FT_ULong post_len;
+ FT_Long post_limit;
+
+
+ /* get a stream for the face's resource */
+ stream = face->root.stream;
+
+ /* seek to the beginning of the PS names table */
+ error = face->goto_table( face, TTAG_post, stream, &post_len );
+ if ( error )
+ goto Exit;
+
+ post_limit = FT_STREAM_POS() + post_len;
+
+ format = face->postscript.FormatType;
+
+ /* go to beginning of subtable */
+ if ( FT_STREAM_SKIP( 32 ) )
+ goto Exit;
+
+ /* now read postscript table */
+ if ( format == 0x00020000L )
+ error = load_format_20( face, stream, post_limit );
+ else if ( format == 0x00028000L )
+ error = load_format_25( face, stream, post_limit );
+ else
+ error = FT_THROW( Invalid_File_Format );
+
+ face->postscript_names.loaded = 1;
+
+ Exit:
+ return error;
+ }
+
+
+ FT_LOCAL_DEF( void )
+ tt_face_free_ps_names( TT_Face face )
+ {
+ FT_Memory memory = face->root.memory;
+ TT_Post_Names names = &face->postscript_names;
+ FT_Fixed format;
+
+
+ if ( names->loaded )
+ {
+ format = face->postscript.FormatType;
+
+ if ( format == 0x00020000L )
+ {
+ TT_Post_20 table = &names->names.format_20;
+ FT_UShort n;
+
+
+ FT_FREE( table->glyph_indices );
+ table->num_glyphs = 0;
+
+ for ( n = 0; n < table->num_names; n++ )
+ FT_FREE( table->glyph_names[n] );
+
+ FT_FREE( table->glyph_names );
+ table->num_names = 0;
+ }
+ else if ( format == 0x00028000L )
+ {
+ TT_Post_25 table = &names->names.format_25;
+
+
+ FT_FREE( table->offsets );
+ table->num_glyphs = 0;
+ }
+ }
+ names->loaded = 0;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_face_get_ps_name */
+ /* */
+ /* <Description> */
+ /* Get the PostScript glyph name of a glyph. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the parent face. */
+ /* */
+ /* idx :: The glyph index. */
+ /* */
+ /* <InOut> */
+ /* PSname :: The address of a string pointer. Will be NULL in case */
+ /* of error, otherwise it is a pointer to the glyph name. */
+ /* */
+ /* You must not modify the returned string! */
+ /* */
+ /* <Output> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ tt_face_get_ps_name( TT_Face face,
+ FT_UInt idx,
+ FT_String** PSname )
+ {
+ FT_Error error;
+ TT_Post_Names names;
+ FT_Fixed format;
+
+#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES
+ FT_Service_PsCMaps psnames;
+#endif
+
+
+ if ( !face )
+ return FT_THROW( Invalid_Face_Handle );
+
+ if ( idx >= (FT_UInt)face->max_profile.numGlyphs )
+ return FT_THROW( Invalid_Glyph_Index );
+
+#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES
+ psnames = (FT_Service_PsCMaps)face->psnames;
+ if ( !psnames )
+ return FT_THROW( Unimplemented_Feature );
+#endif
+
+ names = &face->postscript_names;
+
+ /* `.notdef' by default */
+ *PSname = MAC_NAME( 0 );
+
+ format = face->postscript.FormatType;
+
+ if ( format == 0x00010000L )
+ {
+ if ( idx < 258 ) /* paranoid checking */
+ *PSname = MAC_NAME( idx );
+ }
+ else if ( format == 0x00020000L )
+ {
+ TT_Post_20 table = &names->names.format_20;
+
+
+ if ( !names->loaded )
+ {
+ error = load_post_names( face );
+ if ( error )
+ goto End;
+ }
+
+ if ( idx < (FT_UInt)table->num_glyphs )
+ {
+ FT_UShort name_index = table->glyph_indices[idx];
+
+
+ if ( name_index < 258 )
+ *PSname = MAC_NAME( name_index );
+ else
+ *PSname = (FT_String*)table->glyph_names[name_index - 258];
+ }
+ }
+ else if ( format == 0x00028000L )
+ {
+ TT_Post_25 table = &names->names.format_25;
+
+
+ if ( !names->loaded )
+ {
+ error = load_post_names( face );
+ if ( error )
+ goto End;
+ }
+
+ if ( idx < (FT_UInt)table->num_glyphs ) /* paranoid checking */
+ {
+ idx += table->offsets[idx];
+ *PSname = MAC_NAME( idx );
+ }
+ }
+
+ /* nothing to do for format == 0x00030000L */
+
+ End:
+ return FT_Err_Ok;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttpost.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttpost.h
new file mode 100644
index 0000000000..0016c090d1
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttpost.h
@@ -0,0 +1,46 @@
+/***************************************************************************/
+/* */
+/* ttpost.h */
+/* */
+/* Postcript name table processing for TrueType and OpenType fonts */
+/* (specification). */
+/* */
+/* Copyright 1996-2001, 2002 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __TTPOST_H__
+#define __TTPOST_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/config/ftconfig.h"
+#include "../../include/freetype/internal/tttypes.h"
+
+
+FT_BEGIN_HEADER
+
+
+ FT_LOCAL( FT_Error )
+ tt_face_get_ps_name( TT_Face face,
+ FT_UInt idx,
+ FT_String** PSname );
+
+ FT_LOCAL( void )
+ tt_face_free_ps_names( TT_Face face );
+
+
+FT_END_HEADER
+
+#endif /* __TTPOST_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttsbit.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttsbit.c
new file mode 100644
index 0000000000..1f54e2c0ee
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttsbit.c
@@ -0,0 +1,1177 @@
+/***************************************************************************/
+/* */
+/* ttsbit.c */
+/* */
+/* TrueType and OpenType embedded bitmap support (body). */
+/* */
+/* Copyright 2005-2009, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* Copyright 2013 by Google, Inc. */
+/* Google Author(s): Behdad Esfahbod. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/tttags.h"
+#include "../../include/freetype/ftbitmap.h"
+#include "ttsbit.h"
+
+#include "sferrors.h"
+
+#include "pngshim.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_ttsbit
+
+
+ FT_LOCAL_DEF( FT_Error )
+ tt_face_load_eblc( TT_Face face,
+ FT_Stream stream )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_Fixed version;
+ FT_ULong num_strikes, table_size;
+ FT_Byte* p;
+ FT_Byte* p_limit;
+ FT_UInt count;
+
+
+ face->sbit_num_strikes = 0;
+
+ /* this table is optional */
+ error = face->goto_table( face, TTAG_CBLC, stream, &table_size );
+ if ( error )
+ error = face->goto_table( face, TTAG_EBLC, stream, &table_size );
+ if ( error )
+ error = face->goto_table( face, TTAG_bloc, stream, &table_size );
+ if ( error )
+ goto Exit;
+
+ if ( table_size < 8 )
+ {
+ FT_ERROR(( "tt_face_load_sbit_strikes: table too short\n" ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+ if ( FT_FRAME_EXTRACT( table_size, face->sbit_table ) )
+ goto Exit;
+
+ face->sbit_table_size = table_size;
+
+ p = face->sbit_table;
+ p_limit = p + table_size;
+
+ version = FT_NEXT_ULONG( p );
+ num_strikes = FT_NEXT_ULONG( p );
+
+ if ( version != 0x00020000UL || num_strikes >= 0x10000UL )
+ {
+ FT_ERROR(( "tt_face_load_sbit_strikes: invalid table version\n" ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Fail;
+ }
+
+ /*
+ * Count the number of strikes available in the table. We are a bit
+ * paranoid there and don't trust the data.
+ */
+ count = (FT_UInt)num_strikes;
+ if ( 8 + 48UL * count > table_size )
+ count = (FT_UInt)( ( p_limit - p ) / 48 );
+
+ face->sbit_num_strikes = count;
+
+ FT_TRACE3(( "sbit_num_strikes: %u\n", count ));
+ Exit:
+ return error;
+
+ Fail:
+ FT_FRAME_RELEASE( face->sbit_table );
+ face->sbit_table_size = 0;
+ goto Exit;
+ }
+
+
+ FT_LOCAL_DEF( void )
+ tt_face_free_eblc( TT_Face face )
+ {
+ FT_Stream stream = face->root.stream;
+
+
+ FT_FRAME_RELEASE( face->sbit_table );
+ face->sbit_table_size = 0;
+ face->sbit_num_strikes = 0;
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ tt_face_set_sbit_strike( TT_Face face,
+ FT_Size_Request req,
+ FT_ULong* astrike_index )
+ {
+ return FT_Match_Size( (FT_Face)face, req, 0, astrike_index );
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ tt_face_load_strike_metrics( TT_Face face,
+ FT_ULong strike_index,
+ FT_Size_Metrics* metrics )
+ {
+ FT_Byte* strike;
+
+
+ if ( strike_index >= (FT_ULong)face->sbit_num_strikes )
+ return FT_THROW( Invalid_Argument );
+
+ strike = face->sbit_table + 8 + strike_index * 48;
+
+ metrics->x_ppem = (FT_UShort)strike[44];
+ metrics->y_ppem = (FT_UShort)strike[45];
+
+ metrics->ascender = (FT_Char)strike[16] << 6; /* hori.ascender */
+ metrics->descender = (FT_Char)strike[17] << 6; /* hori.descender */
+ metrics->height = metrics->ascender - metrics->descender;
+
+ /* XXX: Is this correct? */
+ metrics->max_advance = ( (FT_Char)strike[22] + /* min_origin_SB */
+ strike[18] + /* max_width */
+ (FT_Char)strike[23] /* min_advance_SB */
+ ) << 6;
+
+ return FT_Err_Ok;
+ }
+
+
+ typedef struct TT_SBitDecoderRec_
+ {
+ TT_Face face;
+ FT_Stream stream;
+ FT_Bitmap* bitmap;
+ TT_SBit_Metrics metrics;
+ FT_Bool metrics_loaded;
+ FT_Bool bitmap_allocated;
+ FT_Byte bit_depth;
+
+ FT_ULong ebdt_start;
+ FT_ULong ebdt_size;
+
+ FT_ULong strike_index_array;
+ FT_ULong strike_index_count;
+ FT_Byte* eblc_base;
+ FT_Byte* eblc_limit;
+
+ } TT_SBitDecoderRec, *TT_SBitDecoder;
+
+
+ static FT_Error
+ tt_sbit_decoder_init( TT_SBitDecoder decoder,
+ TT_Face face,
+ FT_ULong strike_index,
+ TT_SBit_MetricsRec* metrics )
+ {
+ FT_Error error;
+ FT_Stream stream = face->root.stream;
+ FT_ULong ebdt_size;
+
+
+ error = face->goto_table( face, TTAG_CBDT, stream, &ebdt_size );
+ if ( error )
+ error = face->goto_table( face, TTAG_EBDT, stream, &ebdt_size );
+ if ( error )
+ error = face->goto_table( face, TTAG_bdat, stream, &ebdt_size );
+ if ( error )
+ goto Exit;
+
+ decoder->face = face;
+ decoder->stream = stream;
+ decoder->bitmap = &face->root.glyph->bitmap;
+ decoder->metrics = metrics;
+
+ decoder->metrics_loaded = 0;
+ decoder->bitmap_allocated = 0;
+
+ decoder->ebdt_start = FT_STREAM_POS();
+ decoder->ebdt_size = ebdt_size;
+
+ decoder->eblc_base = face->sbit_table;
+ decoder->eblc_limit = face->sbit_table + face->sbit_table_size;
+
+ /* now find the strike corresponding to the index */
+ {
+ FT_Byte* p;
+
+
+ if ( 8 + 48 * strike_index + 3 * 4 + 34 + 1 > face->sbit_table_size )
+ {
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+ p = decoder->eblc_base + 8 + 48 * strike_index;
+
+ decoder->strike_index_array = FT_NEXT_ULONG( p );
+ p += 4;
+ decoder->strike_index_count = FT_NEXT_ULONG( p );
+ p += 34;
+ decoder->bit_depth = *p;
+
+ if ( decoder->strike_index_array > face->sbit_table_size ||
+ decoder->strike_index_array + 8 * decoder->strike_index_count >
+ face->sbit_table_size )
+ error = FT_THROW( Invalid_File_Format );
+ }
+
+ Exit:
+ return error;
+ }
+
+
+ static void
+ tt_sbit_decoder_done( TT_SBitDecoder decoder )
+ {
+ FT_UNUSED( decoder );
+ }
+
+
+ static FT_Error
+ tt_sbit_decoder_alloc_bitmap( TT_SBitDecoder decoder,
+ FT_UInt load_flags )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_UInt width, height;
+ FT_Bitmap* map = decoder->bitmap;
+ FT_Long size;
+
+
+ if ( !decoder->metrics_loaded )
+ {
+ error = FT_THROW( Invalid_Argument );
+ goto Exit;
+ }
+
+ width = decoder->metrics->width;
+ height = decoder->metrics->height;
+
+ map->width = (int)width;
+ map->rows = (int)height;
+
+ switch ( decoder->bit_depth )
+ {
+ case 1:
+ map->pixel_mode = FT_PIXEL_MODE_MONO;
+ map->pitch = ( map->width + 7 ) >> 3;
+ map->num_grays = 2;
+ break;
+
+ case 2:
+ map->pixel_mode = FT_PIXEL_MODE_GRAY2;
+ map->pitch = ( map->width + 3 ) >> 2;
+ map->num_grays = 4;
+ break;
+
+ case 4:
+ map->pixel_mode = FT_PIXEL_MODE_GRAY4;
+ map->pitch = ( map->width + 1 ) >> 1;
+ map->num_grays = 16;
+ break;
+
+ case 8:
+ map->pixel_mode = FT_PIXEL_MODE_GRAY;
+ map->pitch = map->width;
+ map->num_grays = 256;
+ break;
+
+ case 32:
+ if ( load_flags & FT_LOAD_COLOR )
+ {
+ map->pixel_mode = FT_PIXEL_MODE_BGRA;
+ map->pitch = map->width * 4;
+ map->num_grays = 256;
+ }
+ else
+ {
+ map->pixel_mode = FT_PIXEL_MODE_GRAY;
+ map->pitch = map->width;
+ map->num_grays = 256;
+ }
+ break;
+
+ default:
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+ size = map->rows * map->pitch;
+
+ /* check that there is no empty image */
+ if ( size == 0 )
+ goto Exit; /* exit successfully! */
+
+ error = ft_glyphslot_alloc_bitmap( decoder->face->root.glyph, size );
+ if ( error )
+ goto Exit;
+
+ decoder->bitmap_allocated = 1;
+
+ Exit:
+ return error;
+ }
+
+
+ static FT_Error
+ tt_sbit_decoder_load_metrics( TT_SBitDecoder decoder,
+ FT_Byte* *pp,
+ FT_Byte* limit,
+ FT_Bool big )
+ {
+ FT_Byte* p = *pp;
+ TT_SBit_Metrics metrics = decoder->metrics;
+
+
+ if ( p + 5 > limit )
+ goto Fail;
+
+ metrics->height = p[0];
+ metrics->width = p[1];
+ metrics->horiBearingX = (FT_Char)p[2];
+ metrics->horiBearingY = (FT_Char)p[3];
+ metrics->horiAdvance = p[4];
+
+ p += 5;
+ if ( big )
+ {
+ if ( p + 3 > limit )
+ goto Fail;
+
+ metrics->vertBearingX = (FT_Char)p[0];
+ metrics->vertBearingY = (FT_Char)p[1];
+ metrics->vertAdvance = p[2];
+
+ p += 3;
+ }
+
+ decoder->metrics_loaded = 1;
+ *pp = p;
+ return FT_Err_Ok;
+
+ Fail:
+ FT_TRACE1(( "tt_sbit_decoder_load_metrics: broken table" ));
+ return FT_THROW( Invalid_Argument );
+ }
+
+
+ /* forward declaration */
+ static FT_Error
+ tt_sbit_decoder_load_image( TT_SBitDecoder decoder,
+ FT_UInt load_flags,
+ FT_UInt glyph_index,
+ FT_Int x_pos,
+ FT_Int y_pos );
+
+ typedef FT_Error (*TT_SBitDecoder_LoadFunc)( TT_SBitDecoder decoder,
+ FT_UInt load_flags,
+ FT_Byte* p,
+ FT_Byte* plimit,
+ FT_Int x_pos,
+ FT_Int y_pos );
+
+
+ static FT_Error
+ tt_sbit_decoder_load_byte_aligned( TT_SBitDecoder decoder,
+ FT_UInt load_flags,
+ FT_Byte* p,
+ FT_Byte* limit,
+ FT_Int x_pos,
+ FT_Int y_pos )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_Byte* line;
+ FT_Int bit_height, bit_width, pitch, width, height, line_bits, h;
+ FT_Bitmap* bitmap;
+
+ FT_UNUSED( load_flags );
+
+
+ /* check that we can write the glyph into the bitmap */
+ bitmap = decoder->bitmap;
+ bit_width = bitmap->width;
+ bit_height = bitmap->rows;
+ pitch = bitmap->pitch;
+ line = bitmap->buffer;
+
+ width = decoder->metrics->width;
+ height = decoder->metrics->height;
+
+ line_bits = width * decoder->bit_depth;
+
+ if ( x_pos < 0 || x_pos + width > bit_width ||
+ y_pos < 0 || y_pos + height > bit_height )
+ {
+ FT_TRACE1(( "tt_sbit_decoder_load_byte_aligned:"
+ " invalid bitmap dimensions\n" ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+ if ( p + ( ( line_bits + 7 ) >> 3 ) * height > limit )
+ {
+ FT_TRACE1(( "tt_sbit_decoder_load_byte_aligned: broken bitmap\n" ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+ /* now do the blit */
+ line += y_pos * pitch + ( x_pos >> 3 );
+ x_pos &= 7;
+
+ if ( x_pos == 0 ) /* the easy one */
+ {
+ for ( h = height; h > 0; h--, line += pitch )
+ {
+ FT_Byte* pwrite = line;
+ FT_Int w;
+
+
+ for ( w = line_bits; w >= 8; w -= 8 )
+ {
+ pwrite[0] = (FT_Byte)( pwrite[0] | *p++ );
+ pwrite += 1;
+ }
+
+ if ( w > 0 )
+ pwrite[0] = (FT_Byte)( pwrite[0] | ( *p++ & ( 0xFF00U >> w ) ) );
+ }
+ }
+ else /* x_pos > 0 */
+ {
+ for ( h = height; h > 0; h--, line += pitch )
+ {
+ FT_Byte* pwrite = line;
+ FT_Int w;
+ FT_UInt wval = 0;
+
+
+ for ( w = line_bits; w >= 8; w -= 8 )
+ {
+ wval = (FT_UInt)( wval | *p++ );
+ pwrite[0] = (FT_Byte)( pwrite[0] | ( wval >> x_pos ) );
+ pwrite += 1;
+ wval <<= 8;
+ }
+
+ if ( w > 0 )
+ wval = (FT_UInt)( wval | ( *p++ & ( 0xFF00U >> w ) ) );
+
+ /* all bits read and there are `x_pos + w' bits to be written */
+
+ pwrite[0] = (FT_Byte)( pwrite[0] | ( wval >> x_pos ) );
+
+ if ( x_pos + w > 8 )
+ {
+ pwrite++;
+ wval <<= 8;
+ pwrite[0] = (FT_Byte)( pwrite[0] | ( wval >> x_pos ) );
+ }
+ }
+ }
+
+ Exit:
+ if ( !error )
+ FT_TRACE3(( "tt_sbit_decoder_load_byte_aligned: loaded\n" ));
+ return error;
+ }
+
+
+ /*
+ * Load a bit-aligned bitmap (with pointer `p') into a line-aligned bitmap
+ * (with pointer `pwrite'). In the example below, the width is 3 pixel,
+ * and `x_pos' is 1 pixel.
+ *
+ * p p+1
+ * | | |
+ * | 7 6 5 4 3 2 1 0 | 7 6 5 4 3 2 1 0 |...
+ * | | |
+ * +-------+ +-------+ +-------+ ...
+ * . . .
+ * . . .
+ * v . .
+ * +-------+ . .
+ * | | .
+ * | 7 6 5 4 3 2 1 0 | .
+ * | | .
+ * pwrite . .
+ * . .
+ * v .
+ * +-------+ .
+ * | |
+ * | 7 6 5 4 3 2 1 0 |
+ * | |
+ * pwrite+1 .
+ * .
+ * v
+ * +-------+
+ * | |
+ * | 7 6 5 4 3 2 1 0 |
+ * | |
+ * pwrite+2
+ *
+ */
+
+ static FT_Error
+ tt_sbit_decoder_load_bit_aligned( TT_SBitDecoder decoder,
+ FT_UInt load_flags,
+ FT_Byte* p,
+ FT_Byte* limit,
+ FT_Int x_pos,
+ FT_Int y_pos )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_Byte* line;
+ FT_Int bit_height, bit_width, pitch, width, height, line_bits, h, nbits;
+ FT_Bitmap* bitmap;
+ FT_UShort rval;
+
+ FT_UNUSED( load_flags );
+
+
+ /* check that we can write the glyph into the bitmap */
+ bitmap = decoder->bitmap;
+ bit_width = bitmap->width;
+ bit_height = bitmap->rows;
+ pitch = bitmap->pitch;
+ line = bitmap->buffer;
+
+ width = decoder->metrics->width;
+ height = decoder->metrics->height;
+
+ line_bits = width * decoder->bit_depth;
+
+ if ( x_pos < 0 || x_pos + width > bit_width ||
+ y_pos < 0 || y_pos + height > bit_height )
+ {
+ FT_TRACE1(( "tt_sbit_decoder_load_bit_aligned:"
+ " invalid bitmap dimensions\n" ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+ if ( p + ( ( line_bits * height + 7 ) >> 3 ) > limit )
+ {
+ FT_TRACE1(( "tt_sbit_decoder_load_bit_aligned: broken bitmap\n" ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+ /* now do the blit */
+
+ /* adjust `line' to point to the first byte of the bitmap */
+ line += y_pos * pitch + ( x_pos >> 3 );
+ x_pos &= 7;
+
+ /* the higher byte of `rval' is used as a buffer */
+ rval = 0;
+ nbits = 0;
+
+ for ( h = height; h > 0; h--, line += pitch )
+ {
+ FT_Byte* pwrite = line;
+ FT_Int w = line_bits;
+
+
+ /* handle initial byte (in target bitmap) specially if necessary */
+ if ( x_pos )
+ {
+ w = ( line_bits < 8 - x_pos ) ? line_bits : 8 - x_pos;
+
+ if ( h == height )
+ {
+ rval = *p++;
+ nbits = x_pos;
+ }
+ else if ( nbits < w )
+ {
+ if ( p < limit )
+ rval |= *p++;
+ nbits += 8 - w;
+ }
+ else
+ {
+ rval >>= 8;
+ nbits -= w;
+ }
+
+ *pwrite++ |= ( ( rval >> nbits ) & 0xFF ) &
+ ( ~( 0xFF << w ) << ( 8 - w - x_pos ) );
+ rval <<= 8;
+
+ w = line_bits - w;
+ }
+
+ /* handle medial bytes */
+ for ( ; w >= 8; w -= 8 )
+ {
+ rval |= *p++;
+ *pwrite++ |= ( rval >> nbits ) & 0xFF;
+
+ rval <<= 8;
+ }
+
+ /* handle final byte if necessary */
+ if ( w > 0 )
+ {
+ if ( nbits < w )
+ {
+ if ( p < limit )
+ rval |= *p++;
+ *pwrite |= ( ( rval >> nbits ) & 0xFF ) & ( 0xFF00U >> w );
+ nbits += 8 - w;
+
+ rval <<= 8;
+ }
+ else
+ {
+ *pwrite |= ( ( rval >> nbits ) & 0xFF ) & ( 0xFF00U >> w );
+ nbits -= w;
+ }
+ }
+ }
+
+ Exit:
+ if ( !error )
+ FT_TRACE3(( "tt_sbit_decoder_load_bit_aligned: loaded\n" ));
+ return error;
+ }
+
+
+ static FT_Error
+ tt_sbit_decoder_load_compound( TT_SBitDecoder decoder,
+ FT_UInt load_flags,
+ FT_Byte* p,
+ FT_Byte* limit,
+ FT_Int x_pos,
+ FT_Int y_pos )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_UInt num_components, nn;
+
+ FT_Char horiBearingX = decoder->metrics->horiBearingX;
+ FT_Char horiBearingY = decoder->metrics->horiBearingY;
+ FT_Byte horiAdvance = decoder->metrics->horiAdvance;
+ FT_Char vertBearingX = decoder->metrics->vertBearingX;
+ FT_Char vertBearingY = decoder->metrics->vertBearingY;
+ FT_Byte vertAdvance = decoder->metrics->vertAdvance;
+
+
+ if ( p + 2 > limit )
+ goto Fail;
+
+ num_components = FT_NEXT_USHORT( p );
+ if ( p + 4 * num_components > limit )
+ {
+ FT_TRACE1(( "tt_sbit_decoder_load_compound: broken table\n" ));
+ goto Fail;
+ }
+
+ FT_TRACE3(( "tt_sbit_decoder_load_compound: loading %d components\n",
+ num_components ));
+
+ for ( nn = 0; nn < num_components; nn++ )
+ {
+ FT_UInt gindex = FT_NEXT_USHORT( p );
+ FT_Byte dx = FT_NEXT_BYTE( p );
+ FT_Byte dy = FT_NEXT_BYTE( p );
+
+
+ /* NB: a recursive call */
+ error = tt_sbit_decoder_load_image( decoder, load_flags, gindex,
+ x_pos + dx, y_pos + dy );
+ if ( error )
+ break;
+ }
+
+ FT_TRACE3(( "tt_sbit_decoder_load_compound: done\n" ));
+
+ decoder->metrics->horiBearingX = horiBearingX;
+ decoder->metrics->horiBearingY = horiBearingY;
+ decoder->metrics->horiAdvance = horiAdvance;
+ decoder->metrics->vertBearingX = vertBearingX;
+ decoder->metrics->vertBearingY = vertBearingY;
+ decoder->metrics->vertAdvance = vertAdvance;
+ decoder->metrics->width = (FT_Byte)decoder->bitmap->width;
+ decoder->metrics->height = (FT_Byte)decoder->bitmap->rows;
+
+ Exit:
+ return error;
+
+ Fail:
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+
+#ifdef FT_CONFIG_OPTION_USE_PNG
+
+ static FT_Error
+ tt_sbit_decoder_load_png( TT_SBitDecoder decoder,
+ FT_UInt load_flags,
+ FT_Byte* p,
+ FT_Byte* limit,
+ FT_Int x_pos,
+ FT_Int y_pos )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_ULong png_len;
+
+ FT_UNUSED( load_flags );
+
+
+ if ( limit - p < 4 )
+ {
+ FT_TRACE1(( "tt_sbit_decoder_load_png: broken bitmap\n" ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+ png_len = FT_NEXT_ULONG( p );
+ if ( (FT_ULong)( limit - p ) < png_len )
+ {
+ FT_TRACE1(( "tt_sbit_decoder_load_png: broken bitmap\n" ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+ error = Load_SBit_Png( decoder->bitmap,
+ x_pos,
+ y_pos,
+ decoder->bit_depth,
+ decoder->metrics,
+ decoder->stream->memory,
+ p,
+ png_len );
+
+ Exit:
+ if ( !error )
+ FT_TRACE3(( "tt_sbit_decoder_load_png: loaded\n" ));
+ return error;
+ }
+
+#endif /* FT_CONFIG_OPTION_USE_PNG */
+
+
+ static FT_Error
+ tt_sbit_decoder_load_bitmap( TT_SBitDecoder decoder,
+ FT_UInt load_flags,
+ FT_UInt glyph_format,
+ FT_ULong glyph_start,
+ FT_ULong glyph_size,
+ FT_Int x_pos,
+ FT_Int y_pos )
+ {
+ FT_Error error;
+ FT_Stream stream = decoder->stream;
+ FT_Byte* p;
+ FT_Byte* p_limit;
+ FT_Byte* data;
+
+
+ /* seek into the EBDT table now */
+ if ( glyph_start + glyph_size > decoder->ebdt_size )
+ {
+ error = FT_THROW( Invalid_Argument );
+ goto Exit;
+ }
+
+ if ( FT_STREAM_SEEK( decoder->ebdt_start + glyph_start ) ||
+ FT_FRAME_EXTRACT( glyph_size, data ) )
+ goto Exit;
+
+ p = data;
+ p_limit = p + glyph_size;
+
+ /* read the data, depending on the glyph format */
+ switch ( glyph_format )
+ {
+ case 1:
+ case 2:
+ case 8:
+ case 17:
+ error = tt_sbit_decoder_load_metrics( decoder, &p, p_limit, 0 );
+ break;
+
+ case 6:
+ case 7:
+ case 9:
+ case 18:
+ error = tt_sbit_decoder_load_metrics( decoder, &p, p_limit, 1 );
+ break;
+
+ default:
+ error = FT_Err_Ok;
+ }
+
+ if ( error )
+ goto Fail;
+
+ {
+ TT_SBitDecoder_LoadFunc loader;
+
+
+ switch ( glyph_format )
+ {
+ case 1:
+ case 6:
+ loader = tt_sbit_decoder_load_byte_aligned;
+ break;
+
+ case 2:
+ case 5:
+ case 7:
+ loader = tt_sbit_decoder_load_bit_aligned;
+ break;
+
+ case 8:
+ if ( p + 1 > p_limit )
+ goto Fail;
+
+ p += 1; /* skip padding */
+ /* fall-through */
+
+ case 9:
+ loader = tt_sbit_decoder_load_compound;
+ break;
+
+#ifdef FT_CONFIG_OPTION_USE_PNG
+ case 17: /* small metrics, PNG image data */
+ case 18: /* big metrics, PNG image data */
+ case 19: /* metrics in EBLC, PNG image data */
+ loader = tt_sbit_decoder_load_png;
+ break;
+#endif /* FT_CONFIG_OPTION_USE_PNG */
+
+ default:
+ error = FT_THROW( Invalid_Table );
+ goto Fail;
+ }
+
+ if ( !decoder->bitmap_allocated )
+ {
+ error = tt_sbit_decoder_alloc_bitmap( decoder, load_flags );
+ if ( error )
+ goto Fail;
+ }
+
+ if ( decoder->bit_depth == 32 &&
+ decoder->bitmap->pixel_mode != FT_PIXEL_MODE_BGRA )
+ {
+ /* Flatten color bitmaps if color was not requested. */
+
+ FT_Library library = decoder->face->root.glyph->library;
+ FT_Memory memory = decoder->stream->memory;
+
+ FT_Bitmap color, *orig;
+
+
+ if ( decoder->bitmap->pixel_mode != FT_PIXEL_MODE_GRAY ||
+ x_pos != 0 || y_pos != 0 )
+ {
+ /* Shouldn't happen. */
+ error = FT_THROW( Invalid_Table );
+ goto Fail;
+ }
+
+ FT_Bitmap_New( &color );
+
+ color.rows = decoder->bitmap->rows;
+ color.width = decoder->bitmap->width;
+ color.pitch = color.width * 4;
+ color.pixel_mode = FT_PIXEL_MODE_BGRA;
+
+ if ( FT_ALLOC( color.buffer, color.rows * color.pitch ) )
+ goto Fail;
+
+ orig = decoder->bitmap;
+ decoder->bitmap = &color;
+
+ error = loader( decoder, load_flags, p, p_limit, x_pos, y_pos );
+
+ decoder->bitmap = orig;
+
+ /* explicitly test against FT_Err_Ok to avoid compiler warnings */
+ /* (we do an assignment within a conditional) */
+ if ( error ||
+ ( error = FT_Bitmap_Convert( library,
+ &color,
+ decoder->bitmap,
+ 1 ) ) != FT_Err_Ok )
+ {
+ FT_Bitmap_Done( library, &color );
+ goto Fail;
+ }
+
+ FT_Bitmap_Done( library, &color );
+ }
+
+ else
+ error = loader( decoder, load_flags, p, p_limit, x_pos, y_pos );
+ }
+
+ Fail:
+ FT_FRAME_RELEASE( data );
+
+ Exit:
+ return error;
+ }
+
+
+ static FT_Error
+ tt_sbit_decoder_load_image( TT_SBitDecoder decoder,
+ FT_UInt load_flags,
+ FT_UInt glyph_index,
+ FT_Int x_pos,
+ FT_Int y_pos )
+ {
+ /*
+ * First, we find the correct strike range that applies to this
+ * glyph index.
+ */
+
+ FT_Byte* p = decoder->eblc_base + decoder->strike_index_array;
+ FT_Byte* p_limit = decoder->eblc_limit;
+ FT_ULong num_ranges = decoder->strike_index_count;
+ FT_UInt start, end, index_format, image_format;
+ FT_ULong image_start = 0, image_end = 0, image_offset;
+
+
+ for ( ; num_ranges > 0; num_ranges-- )
+ {
+ start = FT_NEXT_USHORT( p );
+ end = FT_NEXT_USHORT( p );
+
+ if ( glyph_index >= start && glyph_index <= end )
+ goto FoundRange;
+
+ p += 4; /* ignore index offset */
+ }
+ goto NoBitmap;
+
+ FoundRange:
+ image_offset = FT_NEXT_ULONG( p );
+
+ /* overflow check */
+ p = decoder->eblc_base + decoder->strike_index_array;
+ if ( image_offset > (FT_ULong)( p_limit - p ) )
+ goto Failure;
+
+ p += image_offset;
+ if ( p + 8 > p_limit )
+ goto NoBitmap;
+
+ /* now find the glyph's location and extend within the ebdt table */
+ index_format = FT_NEXT_USHORT( p );
+ image_format = FT_NEXT_USHORT( p );
+ image_offset = FT_NEXT_ULONG ( p );
+
+ switch ( index_format )
+ {
+ case 1: /* 4-byte offsets relative to `image_offset' */
+ {
+ p += 4 * ( glyph_index - start );
+ if ( p + 8 > p_limit )
+ goto NoBitmap;
+
+ image_start = FT_NEXT_ULONG( p );
+ image_end = FT_NEXT_ULONG( p );
+
+ if ( image_start == image_end ) /* missing glyph */
+ goto NoBitmap;
+ }
+ break;
+
+ case 2: /* big metrics, constant image size */
+ {
+ FT_ULong image_size;
+
+
+ if ( p + 12 > p_limit )
+ goto NoBitmap;
+
+ image_size = FT_NEXT_ULONG( p );
+
+ if ( tt_sbit_decoder_load_metrics( decoder, &p, p_limit, 1 ) )
+ goto NoBitmap;
+
+ image_start = image_size * ( glyph_index - start );
+ image_end = image_start + image_size;
+ }
+ break;
+
+ case 3: /* 2-byte offsets relative to 'image_offset' */
+ {
+ p += 2 * ( glyph_index - start );
+ if ( p + 4 > p_limit )
+ goto NoBitmap;
+
+ image_start = FT_NEXT_USHORT( p );
+ image_end = FT_NEXT_USHORT( p );
+
+ if ( image_start == image_end ) /* missing glyph */
+ goto NoBitmap;
+ }
+ break;
+
+ case 4: /* sparse glyph array with (glyph,offset) pairs */
+ {
+ FT_ULong mm, num_glyphs;
+
+
+ if ( p + 4 > p_limit )
+ goto NoBitmap;
+
+ num_glyphs = FT_NEXT_ULONG( p );
+
+ /* overflow check for p + ( num_glyphs + 1 ) * 4 */
+ if ( num_glyphs > (FT_ULong)( ( ( p_limit - p ) >> 2 ) - 1 ) )
+ goto NoBitmap;
+
+ for ( mm = 0; mm < num_glyphs; mm++ )
+ {
+ FT_UInt gindex = FT_NEXT_USHORT( p );
+
+
+ if ( gindex == glyph_index )
+ {
+ image_start = FT_NEXT_USHORT( p );
+ p += 2;
+ image_end = FT_PEEK_USHORT( p );
+ break;
+ }
+ p += 2;
+ }
+
+ if ( mm >= num_glyphs )
+ goto NoBitmap;
+ }
+ break;
+
+ case 5: /* constant metrics with sparse glyph codes */
+ case 19:
+ {
+ FT_ULong image_size, mm, num_glyphs;
+
+
+ if ( p + 16 > p_limit )
+ goto NoBitmap;
+
+ image_size = FT_NEXT_ULONG( p );
+
+ if ( tt_sbit_decoder_load_metrics( decoder, &p, p_limit, 1 ) )
+ goto NoBitmap;
+
+ num_glyphs = FT_NEXT_ULONG( p );
+
+ /* overflow check for p + 2 * num_glyphs */
+ if ( num_glyphs > (FT_ULong)( ( p_limit - p ) >> 1 ) )
+ goto NoBitmap;
+
+ for ( mm = 0; mm < num_glyphs; mm++ )
+ {
+ FT_UInt gindex = FT_NEXT_USHORT( p );
+
+
+ if ( gindex == glyph_index )
+ break;
+ }
+
+ if ( mm >= num_glyphs )
+ goto NoBitmap;
+
+ image_start = image_size * mm;
+ image_end = image_start + image_size;
+ }
+ break;
+
+ default:
+ goto NoBitmap;
+ }
+
+ if ( image_start > image_end )
+ goto NoBitmap;
+
+ image_end -= image_start;
+ image_start = image_offset + image_start;
+
+ FT_TRACE3(( "tt_sbit_decoder_load_image:"
+ " found sbit (format %d) for glyph index %d\n",
+ image_format, glyph_index ));
+
+ return tt_sbit_decoder_load_bitmap( decoder,
+ load_flags,
+ image_format,
+ image_start,
+ image_end,
+ x_pos,
+ y_pos );
+
+ Failure:
+ return FT_THROW( Invalid_Table );
+
+ NoBitmap:
+ FT_TRACE4(( "tt_sbit_decoder_load_image:"
+ " no sbit found for glyph index %d\n", glyph_index ));
+
+ return FT_THROW( Invalid_Argument );
+ }
+
+
+ FT_LOCAL( FT_Error )
+ tt_face_load_sbit_image( TT_Face face,
+ FT_ULong strike_index,
+ FT_UInt glyph_index,
+ FT_UInt load_flags,
+ FT_Stream stream,
+ FT_Bitmap *map,
+ TT_SBit_MetricsRec *metrics )
+ {
+ TT_SBitDecoderRec decoder[1];
+ FT_Error error;
+
+ FT_UNUSED( load_flags );
+ FT_UNUSED( stream );
+ FT_UNUSED( map );
+
+
+ error = tt_sbit_decoder_init( decoder, face, strike_index, metrics );
+ if ( !error )
+ {
+ error = tt_sbit_decoder_load_image( decoder,
+ load_flags,
+ glyph_index,
+ 0,
+ 0 );
+ tt_sbit_decoder_done( decoder );
+ }
+
+ return error;
+ }
+
+
+/* EOF */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttsbit.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttsbit.h
new file mode 100644
index 0000000000..93096d8c1e
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/sfnt/ttsbit.h
@@ -0,0 +1,63 @@
+/***************************************************************************/
+/* */
+/* ttsbit.h */
+/* */
+/* TrueType and OpenType embedded bitmap support (specification). */
+/* */
+/* Copyright 1996-2008, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __TTSBIT_H__
+#define __TTSBIT_H__
+
+
+#include "../../include/ft2build.h"
+#include "ttload.h"
+
+
+FT_BEGIN_HEADER
+
+
+ FT_LOCAL( FT_Error )
+ tt_face_load_eblc( TT_Face face,
+ FT_Stream stream );
+
+ FT_LOCAL( void )
+ tt_face_free_eblc( TT_Face face );
+
+
+ FT_LOCAL( FT_Error )
+ tt_face_set_sbit_strike( TT_Face face,
+ FT_Size_Request req,
+ FT_ULong* astrike_index );
+
+ FT_LOCAL( FT_Error )
+ tt_face_load_strike_metrics( TT_Face face,
+ FT_ULong strike_index,
+ FT_Size_Metrics* metrics );
+
+ FT_LOCAL( FT_Error )
+ tt_face_load_sbit_image( TT_Face face,
+ FT_ULong strike_index,
+ FT_UInt glyph_index,
+ FT_UInt load_flags,
+ FT_Stream stream,
+ FT_Bitmap *map,
+ TT_SBit_MetricsRec *metrics );
+
+
+FT_END_HEADER
+
+#endif /* __TTSBIT_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/Jamfile b/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/Jamfile
new file mode 100644
index 0000000000..a8496aa2c2
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/Jamfile
@@ -0,0 +1,29 @@
+# FreeType 2 src/smooth Jamfile
+#
+# Copyright 2001 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT. By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+SubDir FT2_TOP $(FT2_SRC_DIR) smooth ;
+
+{
+ local _sources ;
+
+ if $(FT2_MULTI)
+ {
+ _sources = ftgrays ftsmooth ftspic ;
+ }
+ else
+ {
+ _sources = smooth ;
+ }
+
+ Library $(FT2_LIB) : $(_sources).c ;
+}
+
+# end of src/smooth Jamfile
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftgrays.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftgrays.c
new file mode 100644
index 0000000000..3aafeed323
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftgrays.c
@@ -0,0 +1,2137 @@
+/***************************************************************************/
+/* */
+/* ftgrays.c */
+/* */
+/* A new `perfect' anti-aliasing renderer (body). */
+/* */
+/* Copyright 2000-2003, 2005-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* This file can be compiled without the rest of the FreeType engine, by */
+ /* defining the _STANDALONE_ macro when compiling it. You also need to */
+ /* put the files `ftgrays.h' and `ftimage.h' into the current */
+ /* compilation directory. Typically, you could do something like */
+ /* */
+ /* - copy `src/smooth/ftgrays.c' (this file) to your current directory */
+ /* */
+ /* - copy `include/freetype/ftimage.h' and `src/smooth/ftgrays.h' to the */
+ /* same directory */
+ /* */
+ /* - compile `ftgrays' with the _STANDALONE_ macro defined, as in */
+ /* */
+ /* cc -c -D_STANDALONE_ ftgrays.c */
+ /* */
+ /* The renderer can be initialized with a call to */
+ /* `ft_gray_raster.raster_new'; an anti-aliased bitmap can be generated */
+ /* with a call to `ft_gray_raster.raster_render'. */
+ /* */
+ /* See the comments and documentation in the file `ftimage.h' for more */
+ /* details on how the raster works. */
+ /* */
+ /*************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* This is a new anti-aliasing scan-converter for FreeType 2. The */
+ /* algorithm used here is _very_ different from the one in the standard */
+ /* `ftraster' module. Actually, `ftgrays' computes the _exact_ */
+ /* coverage of the outline on each pixel cell. */
+ /* */
+ /* It is based on ideas that I initially found in Raph Levien's */
+ /* excellent LibArt graphics library (see http://www.levien.com/libart */
+ /* for more information, though the web pages do not tell anything */
+ /* about the renderer; you'll have to dive into the source code to */
+ /* understand how it works). */
+ /* */
+ /* Note, however, that this is a _very_ different implementation */
+ /* compared to Raph's. Coverage information is stored in a very */
+ /* different way, and I don't use sorted vector paths. Also, it doesn't */
+ /* use floating point values. */
+ /* */
+ /* This renderer has the following advantages: */
+ /* */
+ /* - It doesn't need an intermediate bitmap. Instead, one can supply a */
+ /* callback function that will be called by the renderer to draw gray */
+ /* spans on any target surface. You can thus do direct composition on */
+ /* any kind of bitmap, provided that you give the renderer the right */
+ /* callback. */
+ /* */
+ /* - A perfect anti-aliaser, i.e., it computes the _exact_ coverage on */
+ /* each pixel cell. */
+ /* */
+ /* - It performs a single pass on the outline (the `standard' FT2 */
+ /* renderer makes two passes). */
+ /* */
+ /* - It can easily be modified to render to _any_ number of gray levels */
+ /* cheaply. */
+ /* */
+ /* - For small (< 20) pixel sizes, it is faster than the standard */
+ /* renderer. */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_smooth
+
+
+#ifdef _STANDALONE_
+
+
+ /* Auxiliary macros for token concatenation. */
+#define FT_ERR_XCAT( x, y ) x ## y
+#define FT_ERR_CAT( x, y ) FT_ERR_XCAT( x, y )
+
+
+ /* define this to dump debugging information */
+/* #define FT_DEBUG_LEVEL_TRACE */
+
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+#include <stdio.h>
+#include <stdarg.h>
+#endif
+
+#include <stddef.h>
+#include <string.h>
+#include <setjmp.h>
+#include <limits.h>
+#define FT_UINT_MAX UINT_MAX
+#define FT_INT_MAX INT_MAX
+
+#define ft_memset memset
+
+#define ft_setjmp setjmp
+#define ft_longjmp longjmp
+#define ft_jmp_buf jmp_buf
+
+typedef ptrdiff_t FT_PtrDist;
+
+
+#define ErrRaster_Invalid_Mode -2
+#define ErrRaster_Invalid_Outline -1
+#define ErrRaster_Invalid_Argument -3
+#define ErrRaster_Memory_Overflow -4
+
+#define FT_BEGIN_HEADER
+#define FT_END_HEADER
+
+#include "ftimage.h"
+#include "ftgrays.h"
+
+
+ /* This macro is used to indicate that a function parameter is unused. */
+ /* Its purpose is simply to reduce compiler warnings. Note also that */
+ /* simply defining it as `(void)x' doesn't avoid warnings with certain */
+ /* ANSI compilers (e.g. LCC). */
+#define FT_UNUSED( x ) (x) = (x)
+
+
+ /* we only use level 5 & 7 tracing messages; cf. ftdebug.h */
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+
+ void
+ FT_Message( const char* fmt,
+ ... )
+ {
+ va_list ap;
+
+
+ va_start( ap, fmt );
+ vfprintf( stderr, fmt, ap );
+ va_end( ap );
+ }
+
+
+ /* empty function useful for setting a breakpoint to catch errors */
+ int
+ FT_Throw( int error,
+ int line,
+ const char* file )
+ {
+ FT_UNUSED( error );
+ FT_UNUSED( line );
+ FT_UNUSED( file );
+
+ return 0;
+ }
+
+
+ /* we don't handle tracing levels in stand-alone mode; */
+#ifndef FT_TRACE5
+#define FT_TRACE5( varformat ) FT_Message varformat
+#endif
+#ifndef FT_TRACE7
+#define FT_TRACE7( varformat ) FT_Message varformat
+#endif
+#ifndef FT_ERROR
+#define FT_ERROR( varformat ) FT_Message varformat
+#endif
+
+#define FT_THROW( e ) \
+ ( FT_Throw( FT_ERR_CAT( ErrRaster, e ), \
+ __LINE__, \
+ __FILE__ ) | \
+ FT_ERR_CAT( ErrRaster, e ) )
+
+#else /* !FT_DEBUG_LEVEL_TRACE */
+
+#define FT_TRACE5( x ) do { } while ( 0 ) /* nothing */
+#define FT_TRACE7( x ) do { } while ( 0 ) /* nothing */
+#define FT_ERROR( x ) do { } while ( 0 ) /* nothing */
+#define FT_THROW( e ) FT_ERR_CAT( ErrRaster_, e )
+
+
+#endif /* !FT_DEBUG_LEVEL_TRACE */
+
+
+#define FT_DEFINE_OUTLINE_FUNCS( class_, \
+ move_to_, line_to_, \
+ conic_to_, cubic_to_, \
+ shift_, delta_ ) \
+ static const FT_Outline_Funcs class_ = \
+ { \
+ move_to_, \
+ line_to_, \
+ conic_to_, \
+ cubic_to_, \
+ shift_, \
+ delta_ \
+ };
+
+#define FT_DEFINE_RASTER_FUNCS( class_, glyph_format_, \
+ raster_new_, raster_reset_, \
+ raster_set_mode_, raster_render_, \
+ raster_done_ ) \
+ const FT_Raster_Funcs class_ = \
+ { \
+ glyph_format_, \
+ raster_new_, \
+ raster_reset_, \
+ raster_set_mode_, \
+ raster_render_, \
+ raster_done_ \
+ };
+
+
+#else /* !_STANDALONE_ */
+
+
+#include "../../include/ft2build.h"
+#include "ftgrays.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/ftoutln.h"
+
+#include "ftsmerrs.h"
+
+#include "ftspic.h"
+
+#define Smooth_Err_Invalid_Mode Smooth_Err_Cannot_Render_Glyph
+#define Smooth_Err_Memory_Overflow Smooth_Err_Out_Of_Memory
+#define ErrRaster_Memory_Overflow Smooth_Err_Out_Of_Memory
+
+
+#endif /* !_STANDALONE_ */
+
+
+#ifndef FT_MEM_SET
+#define FT_MEM_SET( d, s, c ) ft_memset( d, s, c )
+#endif
+
+#ifndef FT_MEM_ZERO
+#define FT_MEM_ZERO( dest, count ) FT_MEM_SET( dest, 0, count )
+#endif
+
+ /* as usual, for the speed hungry :-) */
+
+#undef RAS_ARG
+#undef RAS_ARG_
+#undef RAS_VAR
+#undef RAS_VAR_
+
+#ifndef FT_STATIC_RASTER
+
+#define RAS_ARG gray_PWorker worker
+#define RAS_ARG_ gray_PWorker worker,
+
+#define RAS_VAR worker
+#define RAS_VAR_ worker,
+
+#else /* FT_STATIC_RASTER */
+
+#define RAS_ARG /* empty */
+#define RAS_ARG_ /* empty */
+#define RAS_VAR /* empty */
+#define RAS_VAR_ /* empty */
+
+#endif /* FT_STATIC_RASTER */
+
+
+ /* must be at least 6 bits! */
+#define PIXEL_BITS 8
+
+#undef FLOOR
+#undef CEILING
+#undef TRUNC
+#undef SCALED
+
+#define ONE_PIXEL ( 1L << PIXEL_BITS )
+#define PIXEL_MASK ( -1L << PIXEL_BITS )
+#define TRUNC( x ) ( (TCoord)( (x) >> PIXEL_BITS ) )
+#define SUBPIXELS( x ) ( (TPos)(x) << PIXEL_BITS )
+#define FLOOR( x ) ( (x) & -ONE_PIXEL )
+#define CEILING( x ) ( ( (x) + ONE_PIXEL - 1 ) & -ONE_PIXEL )
+#define ROUND( x ) ( ( (x) + ONE_PIXEL / 2 ) & -ONE_PIXEL )
+
+#if PIXEL_BITS >= 6
+#define UPSCALE( x ) ( (x) << ( PIXEL_BITS - 6 ) )
+#define DOWNSCALE( x ) ( (x) >> ( PIXEL_BITS - 6 ) )
+#else
+#define UPSCALE( x ) ( (x) >> ( 6 - PIXEL_BITS ) )
+#define DOWNSCALE( x ) ( (x) << ( 6 - PIXEL_BITS ) )
+#endif
+
+
+ /*************************************************************************/
+ /* */
+ /* TYPE DEFINITIONS */
+ /* */
+
+ /* don't change the following types to FT_Int or FT_Pos, since we might */
+ /* need to define them to "float" or "double" when experimenting with */
+ /* new algorithms */
+
+ typedef long TCoord; /* integer scanline/pixel coordinate */
+ typedef long TPos; /* sub-pixel coordinate */
+
+ /* determine the type used to store cell areas. This normally takes at */
+ /* least PIXEL_BITS*2 + 1 bits. On 16-bit systems, we need to use */
+ /* `long' instead of `int', otherwise bad things happen */
+
+#if PIXEL_BITS <= 7
+
+ typedef int TArea;
+
+#else /* PIXEL_BITS >= 8 */
+
+ /* approximately determine the size of integers using an ANSI-C header */
+#if FT_UINT_MAX == 0xFFFFU
+ typedef long TArea;
+#else
+ typedef int TArea;
+#endif
+
+#endif /* PIXEL_BITS >= 8 */
+
+
+ /* maximum number of gray spans in a call to the span callback */
+#define FT_MAX_GRAY_SPANS 32
+
+
+ typedef struct TCell_* PCell;
+
+ typedef struct TCell_
+ {
+ TPos x; /* same with gray_TWorker.ex */
+ TCoord cover; /* same with gray_TWorker.cover */
+ TArea area;
+ PCell next;
+
+ } TCell;
+
+
+#if defined( _MSC_VER ) /* Visual C++ (and Intel C++) */
+ /* We disable the warning `structure was padded due to */
+ /* __declspec(align())' in order to compile cleanly with */
+ /* the maximum level of warnings. */
+#pragma warning( push )
+#pragma warning( disable : 4324 )
+#endif /* _MSC_VER */
+
+ typedef struct gray_TWorker_
+ {
+ TCoord ex, ey;
+ TPos min_ex, max_ex;
+ TPos min_ey, max_ey;
+ TPos count_ex, count_ey;
+
+ TArea area;
+ TCoord cover;
+ int invalid;
+
+ PCell cells;
+ FT_PtrDist max_cells;
+ FT_PtrDist num_cells;
+
+ TCoord cx, cy;
+ TPos x, y;
+
+ TPos last_ey;
+
+ FT_Vector bez_stack[32 * 3 + 1];
+ int lev_stack[32];
+
+ FT_Outline outline;
+ FT_Bitmap target;
+ FT_BBox clip_box;
+
+ FT_Span gray_spans[FT_MAX_GRAY_SPANS];
+ int num_gray_spans;
+
+ FT_Raster_Span_Func render_span;
+ void* render_span_data;
+ int span_y;
+
+ int band_size;
+ int band_shoot;
+
+ ft_jmp_buf jump_buffer;
+
+ void* buffer;
+ long buffer_size;
+
+ PCell* ycells;
+ TPos ycount;
+
+ } gray_TWorker, *gray_PWorker;
+
+#if defined( _MSC_VER )
+#pragma warning( pop )
+#endif
+
+
+#ifndef FT_STATIC_RASTER
+#define ras (*worker)
+#else
+ static gray_TWorker ras;
+#endif
+
+
+ typedef struct gray_TRaster_
+ {
+ void* buffer;
+ long buffer_size;
+ int band_size;
+ void* memory;
+ gray_PWorker worker;
+
+ } gray_TRaster, *gray_PRaster;
+
+
+
+ /*************************************************************************/
+ /* */
+ /* Initialize the cells table. */
+ /* */
+ static void
+ gray_init_cells( RAS_ARG_ void* buffer,
+ long byte_size )
+ {
+ ras.buffer = buffer;
+ ras.buffer_size = byte_size;
+
+ ras.ycells = (PCell*) buffer;
+ ras.cells = NULL;
+ ras.max_cells = 0;
+ ras.num_cells = 0;
+ ras.area = 0;
+ ras.cover = 0;
+ ras.invalid = 1;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* Compute the outline bounding box. */
+ /* */
+ static void
+ gray_compute_cbox( RAS_ARG )
+ {
+ FT_Outline* outline = &ras.outline;
+ FT_Vector* vec = outline->points;
+ FT_Vector* limit = vec + outline->n_points;
+
+
+ if ( outline->n_points <= 0 )
+ {
+ ras.min_ex = ras.max_ex = 0;
+ ras.min_ey = ras.max_ey = 0;
+ return;
+ }
+
+ ras.min_ex = ras.max_ex = vec->x;
+ ras.min_ey = ras.max_ey = vec->y;
+
+ vec++;
+
+ for ( ; vec < limit; vec++ )
+ {
+ TPos x = vec->x;
+ TPos y = vec->y;
+
+
+ if ( x < ras.min_ex ) ras.min_ex = x;
+ if ( x > ras.max_ex ) ras.max_ex = x;
+ if ( y < ras.min_ey ) ras.min_ey = y;
+ if ( y > ras.max_ey ) ras.max_ey = y;
+ }
+
+ /* truncate the bounding box to integer pixels */
+ ras.min_ex = ras.min_ex >> 6;
+ ras.min_ey = ras.min_ey >> 6;
+ ras.max_ex = ( ras.max_ex + 63 ) >> 6;
+ ras.max_ey = ( ras.max_ey + 63 ) >> 6;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* Record the current cell in the table. */
+ /* */
+ static PCell
+ gray_find_cell( RAS_ARG )
+ {
+ PCell *pcell, cell;
+ TPos x = ras.ex;
+
+
+ if ( x > ras.count_ex )
+ x = ras.count_ex;
+
+ pcell = &ras.ycells[ras.ey];
+ for (;;)
+ {
+ cell = *pcell;
+ if ( cell == NULL || cell->x > x )
+ break;
+
+ if ( cell->x == x )
+ goto Exit;
+
+ pcell = &cell->next;
+ }
+
+ if ( ras.num_cells >= ras.max_cells )
+ ft_longjmp( ras.jump_buffer, 1 );
+
+ cell = ras.cells + ras.num_cells++;
+ cell->x = x;
+ cell->area = 0;
+ cell->cover = 0;
+
+ cell->next = *pcell;
+ *pcell = cell;
+
+ Exit:
+ return cell;
+ }
+
+
+ static void
+ gray_record_cell( RAS_ARG )
+ {
+ if ( !ras.invalid && ( ras.area | ras.cover ) )
+ {
+ PCell cell = gray_find_cell( RAS_VAR );
+
+
+ cell->area += ras.area;
+ cell->cover += ras.cover;
+ }
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* Set the current cell to a new position. */
+ /* */
+ static void
+ gray_set_cell( RAS_ARG_ TCoord ex,
+ TCoord ey )
+ {
+ /* Move the cell pointer to a new position. We set the `invalid' */
+ /* flag to indicate that the cell isn't part of those we're interested */
+ /* in during the render phase. This means that: */
+ /* */
+ /* . the new vertical position must be within min_ey..max_ey-1. */
+ /* . the new horizontal position must be strictly less than max_ex */
+ /* */
+ /* Note that if a cell is to the left of the clipping region, it is */
+ /* actually set to the (min_ex-1) horizontal position. */
+
+ /* All cells that are on the left of the clipping region go to the */
+ /* min_ex - 1 horizontal position. */
+ ey -= ras.min_ey;
+
+ if ( ex > ras.max_ex )
+ ex = ras.max_ex;
+
+ ex -= ras.min_ex;
+ if ( ex < 0 )
+ ex = -1;
+
+ /* are we moving to a different cell ? */
+ if ( ex != ras.ex || ey != ras.ey )
+ {
+ /* record the current one if it is valid */
+ if ( !ras.invalid )
+ gray_record_cell( RAS_VAR );
+
+ ras.area = 0;
+ ras.cover = 0;
+ }
+
+ ras.ex = ex;
+ ras.ey = ey;
+ ras.invalid = ( (unsigned)ey >= (unsigned)ras.count_ey ||
+ ex >= ras.count_ex );
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* Start a new contour at a given cell. */
+ /* */
+ static void
+ gray_start_cell( RAS_ARG_ TCoord ex,
+ TCoord ey )
+ {
+ if ( ex > ras.max_ex )
+ ex = (TCoord)( ras.max_ex );
+
+ if ( ex < ras.min_ex )
+ ex = (TCoord)( ras.min_ex - 1 );
+
+ ras.area = 0;
+ ras.cover = 0;
+ ras.ex = ex - ras.min_ex;
+ ras.ey = ey - ras.min_ey;
+ ras.last_ey = SUBPIXELS( ey );
+ ras.invalid = 0;
+
+ gray_set_cell( RAS_VAR_ ex, ey );
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* Render a scanline as one or more cells. */
+ /* */
+ static void
+ gray_render_scanline( RAS_ARG_ TCoord ey,
+ TPos x1,
+ TCoord y1,
+ TPos x2,
+ TCoord y2 )
+ {
+ TCoord ex1, ex2, fx1, fx2, delta, mod;
+ long p, first, dx;
+ int incr;
+
+
+ dx = x2 - x1;
+
+ ex1 = TRUNC( x1 );
+ ex2 = TRUNC( x2 );
+ fx1 = (TCoord)( x1 - SUBPIXELS( ex1 ) );
+ fx2 = (TCoord)( x2 - SUBPIXELS( ex2 ) );
+
+ /* trivial case. Happens often */
+ if ( y1 == y2 )
+ {
+ gray_set_cell( RAS_VAR_ ex2, ey );
+ return;
+ }
+
+ /* everything is located in a single cell. That is easy! */
+ /* */
+ if ( ex1 == ex2 )
+ {
+ delta = y2 - y1;
+ ras.area += (TArea)(( fx1 + fx2 ) * delta);
+ ras.cover += delta;
+ return;
+ }
+
+ /* ok, we'll have to render a run of adjacent cells on the same */
+ /* scanline... */
+ /* */
+ p = ( ONE_PIXEL - fx1 ) * ( y2 - y1 );
+ first = ONE_PIXEL;
+ incr = 1;
+
+ if ( dx < 0 )
+ {
+ p = fx1 * ( y2 - y1 );
+ first = 0;
+ incr = -1;
+ dx = -dx;
+ }
+
+ delta = (TCoord)( p / dx );
+ mod = (TCoord)( p % dx );
+ if ( mod < 0 )
+ {
+ delta--;
+ mod += (TCoord)dx;
+ }
+
+ ras.area += (TArea)(( fx1 + first ) * delta);
+ ras.cover += delta;
+
+ ex1 += incr;
+ gray_set_cell( RAS_VAR_ ex1, ey );
+ y1 += delta;
+
+ if ( ex1 != ex2 )
+ {
+ TCoord lift, rem;
+
+
+ p = ONE_PIXEL * ( y2 - y1 + delta );
+ lift = (TCoord)( p / dx );
+ rem = (TCoord)( p % dx );
+ if ( rem < 0 )
+ {
+ lift--;
+ rem += (TCoord)dx;
+ }
+
+ mod -= (int)dx;
+
+ while ( ex1 != ex2 )
+ {
+ delta = lift;
+ mod += rem;
+ if ( mod >= 0 )
+ {
+ mod -= (TCoord)dx;
+ delta++;
+ }
+
+ ras.area += (TArea)(ONE_PIXEL * delta);
+ ras.cover += delta;
+ y1 += delta;
+ ex1 += incr;
+ gray_set_cell( RAS_VAR_ ex1, ey );
+ }
+ }
+
+ delta = y2 - y1;
+ ras.area += (TArea)(( fx2 + ONE_PIXEL - first ) * delta);
+ ras.cover += delta;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* Render a given line as a series of scanlines. */
+ /* */
+ static void
+ gray_render_line( RAS_ARG_ TPos to_x,
+ TPos to_y )
+ {
+ TCoord ey1, ey2, fy1, fy2, mod;
+ TPos dx, dy, x, x2;
+ long p, first;
+ int delta, rem, lift, incr;
+
+
+ ey1 = TRUNC( ras.last_ey );
+ ey2 = TRUNC( to_y ); /* if (ey2 >= ras.max_ey) ey2 = ras.max_ey-1; */
+ fy1 = (TCoord)( ras.y - ras.last_ey );
+ fy2 = (TCoord)( to_y - SUBPIXELS( ey2 ) );
+
+ dx = to_x - ras.x;
+ dy = to_y - ras.y;
+
+ /* XXX: we should do something about the trivial case where dx == 0, */
+ /* as it happens very often! */
+
+ /* perform vertical clipping */
+ {
+ TCoord min, max;
+
+
+ min = ey1;
+ max = ey2;
+ if ( ey1 > ey2 )
+ {
+ min = ey2;
+ max = ey1;
+ }
+ if ( min >= ras.max_ey || max < ras.min_ey )
+ goto End;
+ }
+
+ /* everything is on a single scanline */
+ if ( ey1 == ey2 )
+ {
+ gray_render_scanline( RAS_VAR_ ey1, ras.x, fy1, to_x, fy2 );
+ goto End;
+ }
+
+ /* vertical line - avoid calling gray_render_scanline */
+ incr = 1;
+
+ if ( dx == 0 )
+ {
+ TCoord ex = TRUNC( ras.x );
+ TCoord two_fx = (TCoord)( ( ras.x - SUBPIXELS( ex ) ) << 1 );
+ TArea area;
+
+
+ first = ONE_PIXEL;
+ if ( dy < 0 )
+ {
+ first = 0;
+ incr = -1;
+ }
+
+ delta = (int)( first - fy1 );
+ ras.area += (TArea)two_fx * delta;
+ ras.cover += delta;
+ ey1 += incr;
+
+ gray_set_cell( RAS_VAR_ ex, ey1 );
+
+ delta = (int)( first + first - ONE_PIXEL );
+ area = (TArea)two_fx * delta;
+ while ( ey1 != ey2 )
+ {
+ ras.area += area;
+ ras.cover += delta;
+ ey1 += incr;
+
+ gray_set_cell( RAS_VAR_ ex, ey1 );
+ }
+
+ delta = (int)( fy2 - ONE_PIXEL + first );
+ ras.area += (TArea)two_fx * delta;
+ ras.cover += delta;
+
+ goto End;
+ }
+
+ /* ok, we have to render several scanlines */
+ p = ( ONE_PIXEL - fy1 ) * dx;
+ first = ONE_PIXEL;
+ incr = 1;
+
+ if ( dy < 0 )
+ {
+ p = fy1 * dx;
+ first = 0;
+ incr = -1;
+ dy = -dy;
+ }
+
+ delta = (int)( p / dy );
+ mod = (int)( p % dy );
+ if ( mod < 0 )
+ {
+ delta--;
+ mod += (TCoord)dy;
+ }
+
+ x = ras.x + delta;
+ gray_render_scanline( RAS_VAR_ ey1, ras.x, fy1, x, (TCoord)first );
+
+ ey1 += incr;
+ gray_set_cell( RAS_VAR_ TRUNC( x ), ey1 );
+
+ if ( ey1 != ey2 )
+ {
+ p = ONE_PIXEL * dx;
+ lift = (int)( p / dy );
+ rem = (int)( p % dy );
+ if ( rem < 0 )
+ {
+ lift--;
+ rem += (int)dy;
+ }
+ mod -= (int)dy;
+
+ while ( ey1 != ey2 )
+ {
+ delta = lift;
+ mod += rem;
+ if ( mod >= 0 )
+ {
+ mod -= (int)dy;
+ delta++;
+ }
+
+ x2 = x + delta;
+ gray_render_scanline( RAS_VAR_ ey1, x,
+ (TCoord)( ONE_PIXEL - first ), x2,
+ (TCoord)first );
+ x = x2;
+
+ ey1 += incr;
+ gray_set_cell( RAS_VAR_ TRUNC( x ), ey1 );
+ }
+ }
+
+ gray_render_scanline( RAS_VAR_ ey1, x,
+ (TCoord)( ONE_PIXEL - first ), to_x,
+ fy2 );
+
+ End:
+ ras.x = to_x;
+ ras.y = to_y;
+ ras.last_ey = SUBPIXELS( ey2 );
+ }
+
+
+ static void
+ gray_split_conic( FT_Vector* base )
+ {
+ TPos a, b;
+
+
+ base[4].x = base[2].x;
+ b = base[1].x;
+ a = base[3].x = ( base[2].x + b ) / 2;
+ b = base[1].x = ( base[0].x + b ) / 2;
+ base[2].x = ( a + b ) / 2;
+
+ base[4].y = base[2].y;
+ b = base[1].y;
+ a = base[3].y = ( base[2].y + b ) / 2;
+ b = base[1].y = ( base[0].y + b ) / 2;
+ base[2].y = ( a + b ) / 2;
+ }
+
+
+ static void
+ gray_render_conic( RAS_ARG_ const FT_Vector* control,
+ const FT_Vector* to )
+ {
+ TPos dx, dy;
+ TPos min, max, y;
+ int top, level;
+ int* levels;
+ FT_Vector* arc;
+
+
+ levels = ras.lev_stack;
+
+ arc = ras.bez_stack;
+ arc[0].x = UPSCALE( to->x );
+ arc[0].y = UPSCALE( to->y );
+ arc[1].x = UPSCALE( control->x );
+ arc[1].y = UPSCALE( control->y );
+ arc[2].x = ras.x;
+ arc[2].y = ras.y;
+ top = 0;
+
+ dx = FT_ABS( arc[2].x + arc[0].x - 2 * arc[1].x );
+ dy = FT_ABS( arc[2].y + arc[0].y - 2 * arc[1].y );
+ if ( dx < dy )
+ dx = dy;
+
+ if ( dx < ONE_PIXEL / 4 )
+ goto Draw;
+
+ /* short-cut the arc that crosses the current band */
+ min = max = arc[0].y;
+
+ y = arc[1].y;
+ if ( y < min ) min = y;
+ if ( y > max ) max = y;
+
+ y = arc[2].y;
+ if ( y < min ) min = y;
+ if ( y > max ) max = y;
+
+ if ( TRUNC( min ) >= ras.max_ey || TRUNC( max ) < ras.min_ey )
+ goto Draw;
+
+ level = 0;
+ do
+ {
+ dx >>= 2;
+ level++;
+ } while ( dx > ONE_PIXEL / 4 );
+
+ levels[0] = level;
+
+ do
+ {
+ level = levels[top];
+ if ( level > 0 )
+ {
+ gray_split_conic( arc );
+ arc += 2;
+ top++;
+ levels[top] = levels[top - 1] = level - 1;
+ continue;
+ }
+
+ Draw:
+ gray_render_line( RAS_VAR_ arc[0].x, arc[0].y );
+ top--;
+ arc -= 2;
+
+ } while ( top >= 0 );
+ }
+
+
+ static void
+ gray_split_cubic( FT_Vector* base )
+ {
+ TPos a, b, c, d;
+
+
+ base[6].x = base[3].x;
+ c = base[1].x;
+ d = base[2].x;
+ base[1].x = a = ( base[0].x + c ) / 2;
+ base[5].x = b = ( base[3].x + d ) / 2;
+ c = ( c + d ) / 2;
+ base[2].x = a = ( a + c ) / 2;
+ base[4].x = b = ( b + c ) / 2;
+ base[3].x = ( a + b ) / 2;
+
+ base[6].y = base[3].y;
+ c = base[1].y;
+ d = base[2].y;
+ base[1].y = a = ( base[0].y + c ) / 2;
+ base[5].y = b = ( base[3].y + d ) / 2;
+ c = ( c + d ) / 2;
+ base[2].y = a = ( a + c ) / 2;
+ base[4].y = b = ( b + c ) / 2;
+ base[3].y = ( a + b ) / 2;
+ }
+
+
+ static void
+ gray_render_cubic( RAS_ARG_ const FT_Vector* control1,
+ const FT_Vector* control2,
+ const FT_Vector* to )
+ {
+ FT_Vector* arc;
+ TPos min, max, y;
+
+
+ arc = ras.bez_stack;
+ arc[0].x = UPSCALE( to->x );
+ arc[0].y = UPSCALE( to->y );
+ arc[1].x = UPSCALE( control2->x );
+ arc[1].y = UPSCALE( control2->y );
+ arc[2].x = UPSCALE( control1->x );
+ arc[2].y = UPSCALE( control1->y );
+ arc[3].x = ras.x;
+ arc[3].y = ras.y;
+
+ /* Short-cut the arc that crosses the current band. */
+ min = max = arc[0].y;
+
+ y = arc[1].y;
+ if ( y < min )
+ min = y;
+ if ( y > max )
+ max = y;
+
+ y = arc[2].y;
+ if ( y < min )
+ min = y;
+ if ( y > max )
+ max = y;
+
+ y = arc[3].y;
+ if ( y < min )
+ min = y;
+ if ( y > max )
+ max = y;
+
+ if ( TRUNC( min ) >= ras.max_ey || TRUNC( max ) < ras.min_ey )
+ goto Draw;
+
+ for (;;)
+ {
+ /* Decide whether to split or draw. See `Rapid Termination */
+ /* Evaluation for Recursive Subdivision of Bezier Curves' by Thomas */
+ /* F. Hain, at */
+ /* http://www.cis.southalabama.edu/~hain/general/Publications/Bezier/Camera-ready%20CISST02%202.pdf */
+
+ {
+ TPos dx, dy, dx_, dy_;
+ TPos dx1, dy1, dx2, dy2;
+ TPos L, s, s_limit;
+
+
+ /* dx and dy are x and y components of the P0-P3 chord vector. */
+ dx = arc[3].x - arc[0].x;
+ dy = arc[3].y - arc[0].y;
+
+ /* L is an (under)estimate of the Euclidean distance P0-P3. */
+ /* */
+ /* If dx >= dy, then r = sqrt(dx^2 + dy^2) can be overestimated */
+ /* with least maximum error by */
+ /* */
+ /* r_upperbound = dx + (sqrt(2) - 1) * dy , */
+ /* */
+ /* where sqrt(2) - 1 can be (over)estimated by 107/256, giving an */
+ /* error of no more than 8.4%. */
+ /* */
+ /* Similarly, some elementary calculus shows that r can be */
+ /* underestimated with least maximum error by */
+ /* */
+ /* r_lowerbound = sqrt(2 + sqrt(2)) / 2 * dx */
+ /* + sqrt(2 - sqrt(2)) / 2 * dy . */
+ /* */
+ /* 236/256 and 97/256 are (under)estimates of the two algebraic */
+ /* numbers, giving an error of no more than 8.1%. */
+
+ dx_ = FT_ABS( dx );
+ dy_ = FT_ABS( dy );
+
+ /* This is the same as */
+ /* */
+ /* L = ( 236 * FT_MAX( dx_, dy_ ) */
+ /* + 97 * FT_MIN( dx_, dy_ ) ) >> 8; */
+ L = ( dx_ > dy_ ? 236 * dx_ + 97 * dy_
+ : 97 * dx_ + 236 * dy_ ) >> 8;
+
+ /* Avoid possible arithmetic overflow below by splitting. */
+ if ( L > 32767 )
+ goto Split;
+
+ /* Max deviation may be as much as (s/L) * 3/4 (if Hain's v = 1). */
+ s_limit = L * (TPos)( ONE_PIXEL / 6 );
+
+ /* s is L * the perpendicular distance from P1 to the line P0-P3. */
+ dx1 = arc[1].x - arc[0].x;
+ dy1 = arc[1].y - arc[0].y;
+ s = FT_ABS( dy * dx1 - dx * dy1 );
+
+ if ( s > s_limit )
+ goto Split;
+
+ /* s is L * the perpendicular distance from P2 to the line P0-P3. */
+ dx2 = arc[2].x - arc[0].x;
+ dy2 = arc[2].y - arc[0].y;
+ s = FT_ABS( dy * dx2 - dx * dy2 );
+
+ if ( s > s_limit )
+ goto Split;
+
+ /* Split super curvy segments where the off points are so far
+ from the chord that the angles P0-P1-P3 or P0-P2-P3 become
+ acute as detected by appropriate dot products. */
+ if ( dx1 * ( dx1 - dx ) + dy1 * ( dy1 - dy ) > 0 ||
+ dx2 * ( dx2 - dx ) + dy2 * ( dy2 - dy ) > 0 )
+ goto Split;
+
+ /* No reason to split. */
+ goto Draw;
+ }
+
+ Split:
+ gray_split_cubic( arc );
+ arc += 3;
+ continue;
+
+ Draw:
+ gray_render_line( RAS_VAR_ arc[0].x, arc[0].y );
+
+ if ( arc == ras.bez_stack )
+ return;
+
+ arc -= 3;
+ }
+ }
+
+
+ static int
+ gray_move_to( const FT_Vector* to,
+ gray_PWorker worker )
+ {
+ TPos x, y;
+
+
+ /* record current cell, if any */
+ gray_record_cell( RAS_VAR );
+
+ /* start to a new position */
+ x = UPSCALE( to->x );
+ y = UPSCALE( to->y );
+
+ gray_start_cell( RAS_VAR_ TRUNC( x ), TRUNC( y ) );
+
+ worker->x = x;
+ worker->y = y;
+ return 0;
+ }
+
+
+ static int
+ gray_line_to( const FT_Vector* to,
+ gray_PWorker worker )
+ {
+ gray_render_line( RAS_VAR_ UPSCALE( to->x ), UPSCALE( to->y ) );
+ return 0;
+ }
+
+
+ static int
+ gray_conic_to( const FT_Vector* control,
+ const FT_Vector* to,
+ gray_PWorker worker )
+ {
+ gray_render_conic( RAS_VAR_ control, to );
+ return 0;
+ }
+
+
+ static int
+ gray_cubic_to( const FT_Vector* control1,
+ const FT_Vector* control2,
+ const FT_Vector* to,
+ gray_PWorker worker )
+ {
+ gray_render_cubic( RAS_VAR_ control1, control2, to );
+ return 0;
+ }
+
+
+ static void
+ gray_render_span( int y,
+ int count,
+ const FT_Span* spans,
+ gray_PWorker worker )
+ {
+ unsigned char* p;
+ FT_Bitmap* map = &worker->target;
+
+
+ /* first of all, compute the scanline offset */
+ p = (unsigned char*)map->buffer - y * map->pitch;
+ if ( map->pitch >= 0 )
+ p += (unsigned)( ( map->rows - 1 ) * map->pitch );
+
+ for ( ; count > 0; count--, spans++ )
+ {
+ unsigned char coverage = spans->coverage;
+
+
+ if ( coverage )
+ {
+ /* For small-spans it is faster to do it by ourselves than
+ * calling `memset'. This is mainly due to the cost of the
+ * function call.
+ */
+ if ( spans->len >= 8 )
+ FT_MEM_SET( p + spans->x, (unsigned char)coverage, spans->len );
+ else
+ {
+ unsigned char* q = p + spans->x;
+
+
+ switch ( spans->len )
+ {
+ case 7: *q++ = (unsigned char)coverage;
+ case 6: *q++ = (unsigned char)coverage;
+ case 5: *q++ = (unsigned char)coverage;
+ case 4: *q++ = (unsigned char)coverage;
+ case 3: *q++ = (unsigned char)coverage;
+ case 2: *q++ = (unsigned char)coverage;
+ case 1: *q = (unsigned char)coverage;
+ default:
+ ;
+ }
+ }
+ }
+ }
+ }
+
+
+ static void
+ gray_hline( RAS_ARG_ TCoord x,
+ TCoord y,
+ TPos area,
+ TCoord acount )
+ {
+ int coverage;
+
+
+ /* compute the coverage line's coverage, depending on the */
+ /* outline fill rule */
+ /* */
+ /* the coverage percentage is area/(PIXEL_BITS*PIXEL_BITS*2) */
+ /* */
+ coverage = (int)( area >> ( PIXEL_BITS * 2 + 1 - 8 ) );
+ /* use range 0..256 */
+ if ( coverage < 0 )
+ coverage = -coverage;
+
+ if ( ras.outline.flags & FT_OUTLINE_EVEN_ODD_FILL )
+ {
+ coverage &= 511;
+
+ if ( coverage > 256 )
+ coverage = 512 - coverage;
+ else if ( coverage == 256 )
+ coverage = 255;
+ }
+ else
+ {
+ /* normal non-zero winding rule */
+ if ( coverage >= 256 )
+ coverage = 255;
+ }
+
+ y += (TCoord)ras.min_ey;
+ x += (TCoord)ras.min_ex;
+
+ /* FT_Span.x is a 16-bit short, so limit our coordinates appropriately */
+ if ( x >= 32767 )
+ x = 32767;
+
+ /* FT_Span.y is an integer, so limit our coordinates appropriately */
+ if ( y >= FT_INT_MAX )
+ y = FT_INT_MAX;
+
+ if ( coverage )
+ {
+ FT_Span* span;
+ int count;
+
+
+ /* see whether we can add this span to the current list */
+ count = ras.num_gray_spans;
+ span = ras.gray_spans + count - 1;
+ if ( count > 0 &&
+ ras.span_y == y &&
+ (int)span->x + span->len == (int)x &&
+ span->coverage == coverage )
+ {
+ span->len = (unsigned short)( span->len + acount );
+ return;
+ }
+
+ if ( ras.span_y != y || count >= FT_MAX_GRAY_SPANS )
+ {
+ if ( ras.render_span && count > 0 )
+ ras.render_span( ras.span_y, count, ras.gray_spans,
+ ras.render_span_data );
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+
+ if ( count > 0 )
+ {
+ int n;
+
+
+ FT_TRACE7(( "y = %3d ", ras.span_y ));
+ span = ras.gray_spans;
+ for ( n = 0; n < count; n++, span++ )
+ FT_TRACE7(( "[%d..%d]:%02x ",
+ span->x, span->x + span->len - 1, span->coverage ));
+ FT_TRACE7(( "\n" ));
+ }
+
+#endif /* FT_DEBUG_LEVEL_TRACE */
+
+ ras.num_gray_spans = 0;
+ ras.span_y = (int)y;
+
+ count = 0;
+ span = ras.gray_spans;
+ }
+ else
+ span++;
+ // Fix the Vulnerability Report FoxIT Reader - MSVR-10-0077.
+ // Limited to the value range of 'x', we have to crop it for avoid the overflow.
+ if (x < 32768) {
+ /* add a gray span to the current list */
+ span->x = (short)x;
+ span->len = (unsigned short)acount;
+ span->coverage = (unsigned char)coverage;
+
+ ras.num_gray_spans++;
+ }
+ }
+ }
+
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+
+ /* to be called while in the debugger -- */
+ /* this function causes a compiler warning since it is unused otherwise */
+ static void
+ gray_dump_cells( RAS_ARG )
+ {
+ int yindex;
+
+
+ for ( yindex = 0; yindex < ras.ycount; yindex++ )
+ {
+ PCell cell;
+
+
+ printf( "%3d:", yindex );
+
+ for ( cell = ras.ycells[yindex]; cell != NULL; cell = cell->next )
+ printf( " (%3ld, c:%4ld, a:%6d)", cell->x, cell->cover, cell->area );
+ printf( "\n" );
+ }
+ }
+
+#endif /* FT_DEBUG_LEVEL_TRACE */
+
+
+ static void
+ gray_sweep( RAS_ARG_ const FT_Bitmap* target )
+ {
+ int yindex;
+
+ FT_UNUSED( target );
+
+
+ if ( ras.num_cells == 0 )
+ return;
+
+ ras.num_gray_spans = 0;
+
+ FT_TRACE7(( "gray_sweep: start\n" ));
+
+ for ( yindex = 0; yindex < ras.ycount; yindex++ )
+ {
+ PCell cell = ras.ycells[yindex];
+ TCoord cover = 0;
+ TCoord x = 0;
+
+
+ for ( ; cell != NULL; cell = cell->next )
+ {
+ TPos area;
+
+
+ if ( cell->x > x && cover != 0 )
+ gray_hline( RAS_VAR_ x, yindex, cover * ( ONE_PIXEL * 2 ),
+ cell->x - x );
+
+ cover += cell->cover;
+ area = cover * ( ONE_PIXEL * 2 ) - cell->area;
+
+ if ( area != 0 && cell->x >= 0 )
+ gray_hline( RAS_VAR_ cell->x, yindex, area, 1 );
+
+ x = cell->x + 1;
+ }
+
+ if ( cover != 0 )
+ gray_hline( RAS_VAR_ x, yindex, cover * ( ONE_PIXEL * 2 ),
+ ras.count_ex - x );
+ }
+
+ if ( ras.render_span && ras.num_gray_spans > 0 )
+ ras.render_span( ras.span_y, ras.num_gray_spans,
+ ras.gray_spans, ras.render_span_data );
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+
+ if ( ras.num_gray_spans > 0 )
+ {
+ FT_Span* span;
+ int n;
+
+
+ FT_TRACE7(( "y = %3d ", ras.span_y ));
+ span = ras.gray_spans;
+ for ( n = 0; n < ras.num_gray_spans; n++, span++ )
+ FT_TRACE7(( "[%d..%d]:%02x ",
+ span->x, span->x + span->len - 1, span->coverage ));
+ FT_TRACE7(( "\n" ));
+ }
+
+ FT_TRACE7(( "gray_sweep: end\n" ));
+
+#endif /* FT_DEBUG_LEVEL_TRACE */
+
+ }
+
+
+#ifdef _STANDALONE_
+
+ /*************************************************************************/
+ /* */
+ /* The following function should only compile in stand-alone mode, */
+ /* i.e., when building this component without the rest of FreeType. */
+ /* */
+ /*************************************************************************/
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* FT_Outline_Decompose */
+ /* */
+ /* <Description> */
+ /* Walk over an outline's structure to decompose it into individual */
+ /* segments and Bézier arcs. This function is also able to emit */
+ /* `move to' and `close to' operations to indicate the start and end */
+ /* of new contours in the outline. */
+ /* */
+ /* <Input> */
+ /* outline :: A pointer to the source target. */
+ /* */
+ /* func_interface :: A table of `emitters', i.e., function pointers */
+ /* called during decomposition to indicate path */
+ /* operations. */
+ /* */
+ /* <InOut> */
+ /* user :: A typeless pointer which is passed to each */
+ /* emitter during the decomposition. It can be */
+ /* used to store the state during the */
+ /* decomposition. */
+ /* */
+ /* <Return> */
+ /* Error code. 0 means success. */
+ /* */
+ static int
+ FT_Outline_Decompose( const FT_Outline* outline,
+ const FT_Outline_Funcs* func_interface,
+ void* user )
+ {
+#undef SCALED
+#define SCALED( x ) ( ( (x) << shift ) - delta )
+
+ FT_Vector v_last;
+ FT_Vector v_control;
+ FT_Vector v_start;
+
+ FT_Vector* point;
+ FT_Vector* limit;
+ char* tags;
+
+ int error;
+
+ int n; /* index of contour in outline */
+ int first; /* index of first point in contour */
+ char tag; /* current point's state */
+
+ int shift;
+ TPos delta;
+
+
+ if ( !outline || !func_interface )
+ return FT_THROW( Invalid_Argument );
+
+ shift = func_interface->shift;
+ delta = func_interface->delta;
+ first = 0;
+
+ for ( n = 0; n < outline->n_contours; n++ )
+ {
+ int last; /* index of last point in contour */
+
+
+ FT_TRACE5(( "FT_Outline_Decompose: Outline %d\n", n ));
+
+ last = outline->contours[n];
+ if ( last < 0 )
+ goto Invalid_Outline;
+ limit = outline->points + last;
+
+ v_start = outline->points[first];
+ v_start.x = SCALED( v_start.x );
+ v_start.y = SCALED( v_start.y );
+
+ v_last = outline->points[last];
+ v_last.x = SCALED( v_last.x );
+ v_last.y = SCALED( v_last.y );
+
+ v_control = v_start;
+
+ point = outline->points + first;
+ tags = outline->tags + first;
+ tag = FT_CURVE_TAG( tags[0] );
+
+ /* A contour cannot start with a cubic control point! */
+ if ( tag == FT_CURVE_TAG_CUBIC )
+ goto Invalid_Outline;
+
+ /* check first point to determine origin */
+ if ( tag == FT_CURVE_TAG_CONIC )
+ {
+ /* first point is conic control. Yes, this happens. */
+ if ( FT_CURVE_TAG( outline->tags[last] ) == FT_CURVE_TAG_ON )
+ {
+ /* start at last point if it is on the curve */
+ v_start = v_last;
+ limit--;
+ }
+ else
+ {
+ /* if both first and last points are conic, */
+ /* start at their middle and record its position */
+ /* for closure */
+ v_start.x = ( v_start.x + v_last.x ) / 2;
+ v_start.y = ( v_start.y + v_last.y ) / 2;
+
+ v_last = v_start;
+ }
+ point--;
+ tags--;
+ }
+
+ FT_TRACE5(( " move to (%.2f, %.2f)\n",
+ v_start.x / 64.0, v_start.y / 64.0 ));
+ error = func_interface->move_to( &v_start, user );
+ if ( error )
+ goto Exit;
+
+ while ( point < limit )
+ {
+ point++;
+ tags++;
+
+ tag = FT_CURVE_TAG( tags[0] );
+ switch ( tag )
+ {
+ case FT_CURVE_TAG_ON: /* emit a single line_to */
+ {
+ FT_Vector vec;
+
+
+ vec.x = SCALED( point->x );
+ vec.y = SCALED( point->y );
+
+ FT_TRACE5(( " line to (%.2f, %.2f)\n",
+ vec.x / 64.0, vec.y / 64.0 ));
+ error = func_interface->line_to( &vec, user );
+ if ( error )
+ goto Exit;
+ continue;
+ }
+
+ case FT_CURVE_TAG_CONIC: /* consume conic arcs */
+ v_control.x = SCALED( point->x );
+ v_control.y = SCALED( point->y );
+
+ Do_Conic:
+ if ( point < limit )
+ {
+ FT_Vector vec;
+ FT_Vector v_middle;
+
+
+ point++;
+ tags++;
+ tag = FT_CURVE_TAG( tags[0] );
+
+ vec.x = SCALED( point->x );
+ vec.y = SCALED( point->y );
+
+ if ( tag == FT_CURVE_TAG_ON )
+ {
+ FT_TRACE5(( " conic to (%.2f, %.2f)"
+ " with control (%.2f, %.2f)\n",
+ vec.x / 64.0, vec.y / 64.0,
+ v_control.x / 64.0, v_control.y / 64.0 ));
+ error = func_interface->conic_to( &v_control, &vec, user );
+ if ( error )
+ goto Exit;
+ continue;
+ }
+
+ if ( tag != FT_CURVE_TAG_CONIC )
+ goto Invalid_Outline;
+
+ v_middle.x = ( v_control.x + vec.x ) / 2;
+ v_middle.y = ( v_control.y + vec.y ) / 2;
+
+ FT_TRACE5(( " conic to (%.2f, %.2f)"
+ " with control (%.2f, %.2f)\n",
+ v_middle.x / 64.0, v_middle.y / 64.0,
+ v_control.x / 64.0, v_control.y / 64.0 ));
+ error = func_interface->conic_to( &v_control, &v_middle, user );
+ if ( error )
+ goto Exit;
+
+ v_control = vec;
+ goto Do_Conic;
+ }
+
+ FT_TRACE5(( " conic to (%.2f, %.2f)"
+ " with control (%.2f, %.2f)\n",
+ v_start.x / 64.0, v_start.y / 64.0,
+ v_control.x / 64.0, v_control.y / 64.0 ));
+ error = func_interface->conic_to( &v_control, &v_start, user );
+ goto Close;
+
+ default: /* FT_CURVE_TAG_CUBIC */
+ {
+ FT_Vector vec1, vec2;
+
+
+ if ( point + 1 > limit ||
+ FT_CURVE_TAG( tags[1] ) != FT_CURVE_TAG_CUBIC )
+ goto Invalid_Outline;
+
+ point += 2;
+ tags += 2;
+
+ vec1.x = SCALED( point[-2].x );
+ vec1.y = SCALED( point[-2].y );
+
+ vec2.x = SCALED( point[-1].x );
+ vec2.y = SCALED( point[-1].y );
+
+ if ( point <= limit )
+ {
+ FT_Vector vec;
+
+
+ vec.x = SCALED( point->x );
+ vec.y = SCALED( point->y );
+
+ FT_TRACE5(( " cubic to (%.2f, %.2f)"
+ " with controls (%.2f, %.2f) and (%.2f, %.2f)\n",
+ vec.x / 64.0, vec.y / 64.0,
+ vec1.x / 64.0, vec1.y / 64.0,
+ vec2.x / 64.0, vec2.y / 64.0 ));
+ error = func_interface->cubic_to( &vec1, &vec2, &vec, user );
+ if ( error )
+ goto Exit;
+ continue;
+ }
+
+ FT_TRACE5(( " cubic to (%.2f, %.2f)"
+ " with controls (%.2f, %.2f) and (%.2f, %.2f)\n",
+ v_start.x / 64.0, v_start.y / 64.0,
+ vec1.x / 64.0, vec1.y / 64.0,
+ vec2.x / 64.0, vec2.y / 64.0 ));
+ error = func_interface->cubic_to( &vec1, &vec2, &v_start, user );
+ goto Close;
+ }
+ }
+ }
+
+ /* close the contour with a line segment */
+ FT_TRACE5(( " line to (%.2f, %.2f)\n",
+ v_start.x / 64.0, v_start.y / 64.0 ));
+ error = func_interface->line_to( &v_start, user );
+
+ Close:
+ if ( error )
+ goto Exit;
+
+ first = last + 1;
+ }
+
+ FT_TRACE5(( "FT_Outline_Decompose: Done\n", n ));
+ return 0;
+
+ Exit:
+ FT_TRACE5(( "FT_Outline_Decompose: Error %d\n", error ));
+ return error;
+
+ Invalid_Outline:
+ return FT_THROW( Invalid_Outline );
+ }
+
+#endif /* _STANDALONE_ */
+
+
+ typedef struct gray_TBand_
+ {
+ TPos min, max;
+
+ } gray_TBand;
+
+ FT_DEFINE_OUTLINE_FUNCS(func_interface,
+ (FT_Outline_MoveTo_Func) gray_move_to,
+ (FT_Outline_LineTo_Func) gray_line_to,
+ (FT_Outline_ConicTo_Func)gray_conic_to,
+ (FT_Outline_CubicTo_Func)gray_cubic_to,
+ 0,
+ 0
+ )
+
+ static int
+ gray_convert_glyph_inner( RAS_ARG )
+ {
+
+ volatile int error = 0;
+
+#ifdef FT_CONFIG_OPTION_PIC
+ FT_Outline_Funcs func_interface;
+ Init_Class_func_interface(&func_interface);
+#endif
+#ifndef _FX_MANAGED_CODE_
+ if ( ft_setjmp( ras.jump_buffer ) == 0 )
+ {
+#endif
+ error = FT_Outline_Decompose( &ras.outline, &func_interface, &ras );
+ gray_record_cell( RAS_VAR );
+#ifndef _FX_MANAGED_CODE_
+ }
+ else
+ error = FT_THROW( Memory_Overflow );
+#endif
+ return error;
+ }
+
+
+ static int
+ gray_convert_glyph( RAS_ARG )
+ {
+ gray_TBand bands[40];
+ gray_TBand* volatile band;
+ int volatile n, num_bands;
+ TPos volatile min, max, max_y;
+ FT_BBox* clip;
+
+
+ /* Set up state in the raster object */
+ gray_compute_cbox( RAS_VAR );
+
+ /* clip to target bitmap, exit if nothing to do */
+ clip = &ras.clip_box;
+
+ if ( ras.max_ex <= clip->xMin || ras.min_ex >= clip->xMax ||
+ ras.max_ey <= clip->yMin || ras.min_ey >= clip->yMax )
+ return 0;
+
+ if ( ras.min_ex < clip->xMin ) ras.min_ex = clip->xMin;
+ if ( ras.min_ey < clip->yMin ) ras.min_ey = clip->yMin;
+
+ if ( ras.max_ex > clip->xMax ) ras.max_ex = clip->xMax;
+ if ( ras.max_ey > clip->yMax ) ras.max_ey = clip->yMax;
+
+ ras.count_ex = ras.max_ex - ras.min_ex;
+ ras.count_ey = ras.max_ey - ras.min_ey;
+
+ /* set up vertical bands */
+ num_bands = (int)( ( ras.max_ey - ras.min_ey ) / ras.band_size );
+ if ( num_bands == 0 )
+ num_bands = 1;
+ if ( num_bands >= 39 )
+ num_bands = 39;
+
+ ras.band_shoot = 0;
+
+ min = ras.min_ey;
+ max_y = ras.max_ey;
+
+ for ( n = 0; n < num_bands; n++, min = max )
+ {
+ max = min + ras.band_size;
+ if ( n == num_bands - 1 || max > max_y )
+ max = max_y;
+
+ bands[0].min = min;
+ bands[0].max = max;
+ band = bands;
+
+ while ( band >= bands )
+ {
+ TPos bottom, top, middle;
+ int error;
+
+ {
+ PCell cells_max;
+ int yindex;
+ long cell_start, cell_end, cell_mod;
+
+
+ ras.ycells = (PCell*)ras.buffer;
+ ras.ycount = band->max - band->min;
+
+ cell_start = sizeof ( PCell ) * ras.ycount;
+ cell_mod = cell_start % sizeof ( TCell );
+ if ( cell_mod > 0 )
+ cell_start += sizeof ( TCell ) - cell_mod;
+
+ cell_end = ras.buffer_size;
+ cell_end -= cell_end % sizeof ( TCell );
+
+ cells_max = (PCell)( (char*)ras.buffer + cell_end );
+ ras.cells = (PCell)( (char*)ras.buffer + cell_start );
+ if ( ras.cells >= cells_max )
+ goto ReduceBands;
+
+ ras.max_cells = cells_max - ras.cells;
+ if ( ras.max_cells < 2 )
+ goto ReduceBands;
+
+ for ( yindex = 0; yindex < ras.ycount; yindex++ )
+ ras.ycells[yindex] = NULL;
+ }
+
+ ras.num_cells = 0;
+ ras.invalid = 1;
+ ras.min_ey = band->min;
+ ras.max_ey = band->max;
+ ras.count_ey = band->max - band->min;
+
+ error = gray_convert_glyph_inner( RAS_VAR );
+
+ if ( !error )
+ {
+ gray_sweep( RAS_VAR_ &ras.target );
+ band--;
+ continue;
+ }
+ else if ( error != ErrRaster_Memory_Overflow )
+ return 1;
+
+ ReduceBands:
+ /* render pool overflow; we will reduce the render band by half */
+ bottom = band->min;
+ top = band->max;
+ middle = bottom + ( ( top - bottom ) >> 1 );
+
+ /* This is too complex for a single scanline; there must */
+ /* be some problems. */
+ if ( middle == bottom )
+ {
+#ifdef FT_DEBUG_LEVEL_TRACE
+ FT_TRACE7(( "gray_convert_glyph: rotten glyph\n" ));
+#endif
+ return 1;
+ }
+
+ if ( bottom-top >= ras.band_size )
+ ras.band_shoot++;
+
+ band[1].min = bottom;
+ band[1].max = middle;
+ band[0].min = middle;
+ band[0].max = top;
+ band++;
+ }
+ }
+
+ if ( ras.band_shoot > 8 && ras.band_size > 16 )
+ ras.band_size = ras.band_size / 2;
+
+ return 0;
+ }
+
+
+ static int
+ gray_raster_render( gray_PRaster raster,
+ const FT_Raster_Params* params )
+ {
+ const FT_Outline* outline = (const FT_Outline*)params->source;
+ const FT_Bitmap* target_map = params->target;
+ gray_PWorker worker;
+
+
+ if ( !raster || !raster->buffer || !raster->buffer_size )
+ return FT_THROW( Invalid_Argument );
+
+ if ( !outline )
+ return FT_THROW( Invalid_Outline );
+
+ /* return immediately if the outline is empty */
+ if ( outline->n_points == 0 || outline->n_contours <= 0 )
+ return 0;
+
+ if ( !outline->contours || !outline->points )
+ return FT_THROW( Invalid_Outline );
+
+ if ( outline->n_points !=
+ outline->contours[outline->n_contours - 1] + 1 )
+ return FT_THROW( Invalid_Outline );
+
+ worker = raster->worker;
+
+ /* if direct mode is not set, we must have a target bitmap */
+ if ( !( params->flags & FT_RASTER_FLAG_DIRECT ) )
+ {
+ if ( !target_map )
+ return FT_THROW( Invalid_Argument );
+
+ /* nothing to do */
+ if ( !target_map->width || !target_map->rows )
+ return 0;
+
+ if ( !target_map->buffer )
+ return FT_THROW( Invalid_Argument );
+ }
+
+ /* this version does not support monochrome rendering */
+ if ( !( params->flags & FT_RASTER_FLAG_AA ) )
+ return FT_THROW( Invalid_Mode );
+
+ /* compute clipping box */
+ if ( !( params->flags & FT_RASTER_FLAG_DIRECT ) )
+ {
+ /* compute clip box from target pixmap */
+ ras.clip_box.xMin = 0;
+ ras.clip_box.yMin = 0;
+ ras.clip_box.xMax = target_map->width;
+ ras.clip_box.yMax = target_map->rows;
+ }
+ else if ( params->flags & FT_RASTER_FLAG_CLIP )
+ ras.clip_box = params->clip_box;
+ else
+ {
+ ras.clip_box.xMin = -32768L;
+ ras.clip_box.yMin = -32768L;
+ ras.clip_box.xMax = 32767L;
+ ras.clip_box.yMax = 32767L;
+ }
+
+ gray_init_cells( RAS_VAR_ raster->buffer, raster->buffer_size );
+
+ ras.outline = *outline;
+ ras.num_cells = 0;
+ ras.invalid = 1;
+ ras.band_size = raster->band_size;
+ ras.num_gray_spans = 0;
+
+ if ( params->flags & FT_RASTER_FLAG_DIRECT )
+ {
+ ras.render_span = (FT_Raster_Span_Func)params->gray_spans;
+ ras.render_span_data = params->user;
+ }
+ else
+ {
+ ras.target = *target_map;
+ ras.render_span = (FT_Raster_Span_Func)gray_render_span;
+ ras.render_span_data = &ras;
+ }
+
+ return gray_convert_glyph( RAS_VAR );
+ }
+
+
+ /**** RASTER OBJECT CREATION: In stand-alone mode, we simply use *****/
+ /**** a static object. *****/
+
+#ifdef _STANDALONE_
+
+ static int
+ gray_raster_new( void* memory,
+ FT_Raster* araster )
+ {
+ static gray_TRaster the_raster;
+
+ FT_UNUSED( memory );
+
+
+ *araster = (FT_Raster)&the_raster;
+ FT_MEM_ZERO( &the_raster, sizeof ( the_raster ) );
+
+ return 0;
+ }
+
+
+ static void
+ gray_raster_done( FT_Raster raster )
+ {
+ /* nothing */
+ FT_UNUSED( raster );
+ }
+
+#else /* !_STANDALONE_ */
+
+ static int
+ gray_raster_new( FT_Memory memory,
+ FT_Raster* araster )
+ {
+ FT_Error error;
+ gray_PRaster raster = NULL;
+
+
+ *araster = 0;
+ if ( !FT_ALLOC( raster, sizeof ( gray_TRaster ) ) )
+ {
+ raster->memory = memory;
+ *araster = (FT_Raster)raster;
+ }
+
+ return error;
+ }
+
+
+ static void
+ gray_raster_done( FT_Raster raster )
+ {
+ FT_Memory memory = (FT_Memory)((gray_PRaster)raster)->memory;
+
+
+ FT_FREE( raster );
+ }
+
+#endif /* !_STANDALONE_ */
+
+
+ static void
+ gray_raster_reset( FT_Raster raster,
+ char* pool_base,
+ long pool_size )
+ {
+ gray_PRaster rast = (gray_PRaster)raster;
+
+
+ if ( raster )
+ {
+ if ( pool_base && pool_size >= (long)sizeof ( gray_TWorker ) + 2048 )
+ {
+ gray_PWorker worker = (gray_PWorker)pool_base;
+
+
+ rast->worker = worker;
+ rast->buffer = pool_base +
+ ( ( sizeof ( gray_TWorker ) +
+ sizeof ( TCell ) - 1 ) &
+ ~( sizeof ( TCell ) - 1 ) );
+ rast->buffer_size = (long)( ( pool_base + pool_size ) -
+ (char*)rast->buffer ) &
+ ~( sizeof ( TCell ) - 1 );
+ rast->band_size = (int)( rast->buffer_size /
+ ( sizeof ( TCell ) * 8 ) );
+ }
+ else
+ {
+ rast->buffer = NULL;
+ rast->buffer_size = 0;
+ rast->worker = NULL;
+ }
+ }
+ }
+
+
+ FT_DEFINE_RASTER_FUNCS(ft_grays_raster,
+ FT_GLYPH_FORMAT_OUTLINE,
+
+ (FT_Raster_New_Func) gray_raster_new,
+ (FT_Raster_Reset_Func) gray_raster_reset,
+ (FT_Raster_Set_Mode_Func)0,
+ (FT_Raster_Render_Func) gray_raster_render,
+ (FT_Raster_Done_Func) gray_raster_done
+ )
+
+
+/* END */
+
+
+/* Local Variables: */
+/* coding: utf-8 */
+/* End: */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftgrays.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftgrays.h
new file mode 100644
index 0000000000..089db89085
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftgrays.h
@@ -0,0 +1,58 @@
+/***************************************************************************/
+/* */
+/* ftgrays.h */
+/* */
+/* FreeType smooth renderer declaration */
+/* */
+/* Copyright 1996-2001 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTGRAYS_H__
+#define __FTGRAYS_H__
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+
+#ifdef _STANDALONE_
+#include "ftimage.h"
+#else
+#include "../../include/ft2build.h"
+#include "../../include/freetype/config/ftconfig.h" /* for FT_CONFIG_OPTION_PIC */
+#include "../../include/freetype/ftimage.h"
+#endif
+
+
+ /*************************************************************************/
+ /* */
+ /* To make ftgrays.h independent from configuration files we check */
+ /* whether FT_EXPORT_VAR has been defined already. */
+ /* */
+ /* On some systems and compilers (Win32 mostly), an extra keyword is */
+ /* necessary to compile the library as a DLL. */
+ /* */
+#ifndef FT_EXPORT_VAR
+#define FT_EXPORT_VAR( x ) extern x
+#endif
+
+ FT_EXPORT_VAR( const FT_Raster_Funcs ) ft_grays_raster;
+
+
+#ifdef __cplusplus
+ }
+#endif
+
+#endif /* __FTGRAYS_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftsmerrs.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftsmerrs.h
new file mode 100644
index 0000000000..5f4f82435f
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftsmerrs.h
@@ -0,0 +1,42 @@
+/***************************************************************************/
+/* */
+/* ftsmerrs.h */
+/* */
+/* smooth renderer error codes (specification only). */
+/* */
+/* Copyright 2001, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* This file is used to define the smooth renderer error enumeration */
+ /* constants. */
+ /* */
+ /*************************************************************************/
+
+#ifndef __FTSMERRS_H__
+#define __FTSMERRS_H__
+
+#include "../../include/freetype/ftmoderr.h"
+
+#undef __FTERRORS_H__
+
+#undef FT_ERR_PREFIX
+#define FT_ERR_PREFIX Smooth_Err_
+#define FT_ERR_BASE FT_Mod_Err_Smooth
+
+#include "../../include/freetype/fterrors.h"
+
+#endif /* __FTSMERRS_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftsmooth.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftsmooth.c
new file mode 100644
index 0000000000..375b27b3e5
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftsmooth.c
@@ -0,0 +1,534 @@
+/***************************************************************************/
+/* */
+/* ftsmooth.c */
+/* */
+/* Anti-aliasing renderer interface (body). */
+/* */
+/* Copyright 2000-2006, 2009-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/ftoutln.h"
+#include "ftsmooth.h"
+#include "ftgrays.h"
+#include "ftspic.h"
+
+#include "ftsmerrs.h"
+
+
+ /* initialize renderer -- init its raster */
+ static FT_Error
+ ft_smooth_init( FT_Renderer render )
+ {
+ FT_Library library = FT_MODULE_LIBRARY( render );
+
+
+ render->clazz->raster_class->raster_reset( render->raster,
+ library->raster_pool,
+ library->raster_pool_size );
+
+ return 0;
+ }
+
+
+ /* sets render-specific mode */
+ static FT_Error
+ ft_smooth_set_mode( FT_Renderer render,
+ FT_ULong mode_tag,
+ FT_Pointer data )
+ {
+ /* we simply pass it to the raster */
+ return render->clazz->raster_class->raster_set_mode( render->raster,
+ mode_tag,
+ data );
+ }
+
+ /* transform a given glyph image */
+ static FT_Error
+ ft_smooth_transform( FT_Renderer render,
+ FT_GlyphSlot slot,
+ const FT_Matrix* matrix,
+ const FT_Vector* delta )
+ {
+ FT_Error error = FT_Err_Ok;
+
+
+ if ( slot->format != render->glyph_format )
+ {
+ error = FT_THROW( Invalid_Argument );
+ goto Exit;
+ }
+
+ if ( matrix )
+ FT_Outline_Transform( &slot->outline, matrix );
+
+ if ( delta )
+ FT_Outline_Translate( &slot->outline, delta->x, delta->y );
+
+ Exit:
+ return error;
+ }
+
+
+ /* return the glyph's control box */
+ static void
+ ft_smooth_get_cbox( FT_Renderer render,
+ FT_GlyphSlot slot,
+ FT_BBox* cbox )
+ {
+ FT_MEM_ZERO( cbox, sizeof ( *cbox ) );
+
+ if ( slot->format == render->glyph_format )
+ FT_Outline_Get_CBox( &slot->outline, cbox );
+ }
+
+
+ /* convert a slot's glyph image into a bitmap */
+ static FT_Error
+ ft_smooth_render_generic( FT_Renderer render,
+ FT_GlyphSlot slot,
+ FT_Render_Mode mode,
+ const FT_Vector* origin,
+ FT_Render_Mode required_mode )
+ {
+ FT_Error error;
+ FT_Outline* outline = NULL;
+ FT_BBox cbox;
+ FT_Pos width, height, pitch;
+#ifndef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
+ FT_Pos height_org, width_org;
+#endif
+ FT_Bitmap* bitmap = &slot->bitmap;
+ FT_Memory memory = render->root.memory;
+ FT_Int hmul = mode == FT_RENDER_MODE_LCD;
+ FT_Int vmul = mode == FT_RENDER_MODE_LCD_V;
+ FT_Pos x_shift = 0;
+ FT_Pos y_shift = 0;
+ FT_Pos x_left, y_top;
+
+ FT_Raster_Params params;
+
+ FT_Bool have_translated_origin = FALSE;
+ FT_Bool have_outline_shifted = FALSE;
+ FT_Bool have_buffer = FALSE;
+
+
+ /* check glyph image format */
+ if ( slot->format != render->glyph_format )
+ {
+ error = FT_THROW( Invalid_Argument );
+ goto Exit;
+ }
+
+ /* check mode */
+ if ( mode != required_mode )
+ {
+ error = FT_THROW( Cannot_Render_Glyph );
+ goto Exit;
+ }
+
+ outline = &slot->outline;
+
+ /* translate the outline to the new origin if needed */
+ if ( origin )
+ {
+ FT_Outline_Translate( outline, origin->x, origin->y );
+ have_translated_origin = TRUE;
+ }
+
+ /* compute the control box, and grid fit it */
+ FT_Outline_Get_CBox( outline, &cbox );
+
+ cbox.xMin = FT_PIX_FLOOR( cbox.xMin );
+ cbox.yMin = FT_PIX_FLOOR( cbox.yMin );
+ cbox.xMax = FT_PIX_CEIL( cbox.xMax );
+ cbox.yMax = FT_PIX_CEIL( cbox.yMax );
+
+ if ( cbox.xMin < 0 && cbox.xMax > FT_INT_MAX + cbox.xMin )
+ {
+ FT_ERROR(( "ft_smooth_render_generic: glyph too large:"
+ " xMin = %d, xMax = %d\n",
+ cbox.xMin >> 6, cbox.xMax >> 6 ));
+ error = FT_THROW( Raster_Overflow );
+ goto Exit;
+ }
+ else
+ width = ( cbox.xMax - cbox.xMin ) >> 6;
+
+ if ( cbox.yMin < 0 && cbox.yMax > FT_INT_MAX + cbox.yMin )
+ {
+ FT_ERROR(( "ft_smooth_render_generic: glyph too large:"
+ " yMin = %d, yMax = %d\n",
+ cbox.yMin >> 6, cbox.yMax >> 6 ));
+ error = FT_THROW( Raster_Overflow );
+ goto Exit;
+ }
+ else
+ height = ( cbox.yMax - cbox.yMin ) >> 6;
+
+#ifndef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
+ width_org = width;
+ height_org = height;
+#endif
+
+ /* release old bitmap buffer */
+ if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP )
+ {
+ FT_FREE( bitmap->buffer );
+ slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP;
+ }
+
+ /* allocate new one */
+ pitch = width;
+ if ( hmul )
+ {
+ width = width * 3;
+ pitch = FT_PAD_CEIL( width, 4 );
+ }
+
+ if ( vmul )
+ height *= 3;
+
+ x_shift = (FT_Int) cbox.xMin;
+ y_shift = (FT_Int) cbox.yMin;
+ x_left = (FT_Int)( cbox.xMin >> 6 );
+ y_top = (FT_Int)( cbox.yMax >> 6 );
+
+#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
+
+ if ( slot->library->lcd_filter_func )
+ {
+ FT_Int extra = slot->library->lcd_extra;
+
+
+ if ( hmul )
+ {
+ x_shift -= 64 * ( extra >> 1 );
+ width += 3 * extra;
+ pitch = FT_PAD_CEIL( width, 4 );
+ x_left -= extra >> 1;
+ }
+
+ if ( vmul )
+ {
+ y_shift -= 64 * ( extra >> 1 );
+ height += 3 * extra;
+ y_top += extra >> 1;
+ }
+ }
+
+#endif
+
+#if FT_UINT_MAX > 0xFFFFU
+
+ /* Required check is (pitch * height < FT_ULONG_MAX), */
+ /* but we care realistic cases only. Always pitch <= width. */
+ if ( width > 0x7FFF || height > 0x7FFF )
+ {
+ FT_ERROR(( "ft_smooth_render_generic: glyph too large: %u x %u\n",
+ width, height ));
+ error = FT_THROW( Raster_Overflow );
+ goto Exit;
+ }
+
+#endif
+
+ bitmap->pixel_mode = FT_PIXEL_MODE_GRAY;
+ bitmap->num_grays = 256;
+ bitmap->width = width;
+ bitmap->rows = height;
+ bitmap->pitch = pitch;
+
+ /* translate outline to render it into the bitmap */
+ FT_Outline_Translate( outline, -x_shift, -y_shift );
+ have_outline_shifted = TRUE;
+
+ if ( FT_ALLOC( bitmap->buffer, (FT_ULong)pitch * height ) )
+ goto Exit;
+ else
+ have_buffer = TRUE;
+
+ slot->internal->flags |= FT_GLYPH_OWN_BITMAP;
+
+ /* set up parameters */
+ params.target = bitmap;
+ params.source = outline;
+ params.flags = FT_RASTER_FLAG_AA;
+
+#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
+
+ /* implode outline if needed */
+ {
+ FT_Vector* points = outline->points;
+ FT_Vector* points_end = points + outline->n_points;
+ FT_Vector* vec;
+
+
+ if ( hmul )
+ for ( vec = points; vec < points_end; vec++ )
+ vec->x *= 3;
+
+ if ( vmul )
+ for ( vec = points; vec < points_end; vec++ )
+ vec->y *= 3;
+ }
+
+ /* render outline into the bitmap */
+ error = render->raster_render( render->raster, &params );
+
+ /* deflate outline if needed */
+ {
+ FT_Vector* points = outline->points;
+ FT_Vector* points_end = points + outline->n_points;
+ FT_Vector* vec;
+
+
+ if ( hmul )
+ for ( vec = points; vec < points_end; vec++ )
+ vec->x /= 3;
+
+ if ( vmul )
+ for ( vec = points; vec < points_end; vec++ )
+ vec->y /= 3;
+ }
+
+ if ( error )
+ goto Exit;
+
+ if ( slot->library->lcd_filter_func )
+ slot->library->lcd_filter_func( bitmap, mode, slot->library );
+
+#else /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */
+
+ /* render outline into bitmap */
+ error = render->raster_render( render->raster, &params );
+ if ( error )
+ goto Exit;
+
+ /* expand it horizontally */
+ if ( hmul )
+ {
+ FT_Byte* line = bitmap->buffer;
+ FT_UInt hh;
+
+
+ for ( hh = height_org; hh > 0; hh--, line += pitch )
+ {
+ FT_UInt xx;
+ FT_Byte* end = line + width;
+
+
+ for ( xx = width_org; xx > 0; xx-- )
+ {
+ FT_UInt pixel = line[xx-1];
+
+
+ end[-3] = (FT_Byte)pixel;
+ end[-2] = (FT_Byte)pixel;
+ end[-1] = (FT_Byte)pixel;
+ end -= 3;
+ }
+ }
+ }
+
+ /* expand it vertically */
+ if ( vmul )
+ {
+ FT_Byte* read = bitmap->buffer + ( height - height_org ) * pitch;
+ FT_Byte* write = bitmap->buffer;
+ FT_UInt hh;
+
+
+ for ( hh = height_org; hh > 0; hh-- )
+ {
+ ft_memcpy( write, read, pitch );
+ write += pitch;
+
+ ft_memcpy( write, read, pitch );
+ write += pitch;
+
+ ft_memcpy( write, read, pitch );
+ write += pitch;
+ read += pitch;
+ }
+ }
+
+#endif /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */
+
+ /*
+ * XXX: on 16bit system, we return an error for huge bitmap
+ * to prevent an overflow.
+ */
+ if ( x_left > FT_INT_MAX || y_top > FT_INT_MAX )
+ {
+ error = FT_THROW( Invalid_Pixel_Size );
+ goto Exit;
+ }
+
+ slot->format = FT_GLYPH_FORMAT_BITMAP;
+ slot->bitmap_left = (FT_Int)x_left;
+ slot->bitmap_top = (FT_Int)y_top;
+
+ /* everything is fine; don't deallocate buffer */
+ have_buffer = FALSE;
+
+ error = FT_Err_Ok;
+
+ Exit:
+ if ( have_outline_shifted )
+ FT_Outline_Translate( outline, x_shift, y_shift );
+ if ( have_translated_origin )
+ FT_Outline_Translate( outline, -origin->x, -origin->y );
+ if ( have_buffer )
+ {
+ FT_FREE( bitmap->buffer );
+ slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP;
+ }
+
+ return error;
+ }
+
+
+ /* convert a slot's glyph image into a bitmap */
+ static FT_Error
+ ft_smooth_render( FT_Renderer render,
+ FT_GlyphSlot slot,
+ FT_Render_Mode mode,
+ const FT_Vector* origin )
+ {
+ if ( mode == FT_RENDER_MODE_LIGHT )
+ mode = FT_RENDER_MODE_NORMAL;
+
+ return ft_smooth_render_generic( render, slot, mode, origin,
+ FT_RENDER_MODE_NORMAL );
+ }
+
+
+ /* convert a slot's glyph image into a horizontal LCD bitmap */
+ static FT_Error
+ ft_smooth_render_lcd( FT_Renderer render,
+ FT_GlyphSlot slot,
+ FT_Render_Mode mode,
+ const FT_Vector* origin )
+ {
+ FT_Error error;
+
+ error = ft_smooth_render_generic( render, slot, mode, origin,
+ FT_RENDER_MODE_LCD );
+ if ( !error )
+ slot->bitmap.pixel_mode = FT_PIXEL_MODE_LCD;
+
+ return error;
+ }
+
+
+ /* convert a slot's glyph image into a vertical LCD bitmap */
+ static FT_Error
+ ft_smooth_render_lcd_v( FT_Renderer render,
+ FT_GlyphSlot slot,
+ FT_Render_Mode mode,
+ const FT_Vector* origin )
+ {
+ FT_Error error;
+
+ error = ft_smooth_render_generic( render, slot, mode, origin,
+ FT_RENDER_MODE_LCD_V );
+ if ( !error )
+ slot->bitmap.pixel_mode = FT_PIXEL_MODE_LCD_V;
+
+ return error;
+ }
+
+
+ FT_DEFINE_RENDERER( ft_smooth_renderer_class,
+
+ FT_MODULE_RENDERER,
+ sizeof ( FT_RendererRec ),
+
+ "smooth",
+ 0x10000L,
+ 0x20000L,
+
+ 0, /* module specific interface */
+
+ (FT_Module_Constructor)ft_smooth_init,
+ (FT_Module_Destructor) 0,
+ (FT_Module_Requester) 0
+ ,
+
+ FT_GLYPH_FORMAT_OUTLINE,
+
+ (FT_Renderer_RenderFunc) ft_smooth_render,
+ (FT_Renderer_TransformFunc)ft_smooth_transform,
+ (FT_Renderer_GetCBoxFunc) ft_smooth_get_cbox,
+ (FT_Renderer_SetModeFunc) ft_smooth_set_mode,
+
+ (FT_Raster_Funcs*) &FT_GRAYS_RASTER_GET
+ )
+
+
+ FT_DEFINE_RENDERER( ft_smooth_lcd_renderer_class,
+
+ FT_MODULE_RENDERER,
+ sizeof ( FT_RendererRec ),
+
+ "smooth-lcd",
+ 0x10000L,
+ 0x20000L,
+
+ 0, /* module specific interface */
+
+ (FT_Module_Constructor)ft_smooth_init,
+ (FT_Module_Destructor) 0,
+ (FT_Module_Requester) 0
+ ,
+
+ FT_GLYPH_FORMAT_OUTLINE,
+
+ (FT_Renderer_RenderFunc) ft_smooth_render_lcd,
+ (FT_Renderer_TransformFunc)ft_smooth_transform,
+ (FT_Renderer_GetCBoxFunc) ft_smooth_get_cbox,
+ (FT_Renderer_SetModeFunc) ft_smooth_set_mode,
+
+ (FT_Raster_Funcs*) &FT_GRAYS_RASTER_GET
+ )
+
+ FT_DEFINE_RENDERER( ft_smooth_lcdv_renderer_class,
+
+ FT_MODULE_RENDERER,
+ sizeof ( FT_RendererRec ),
+
+ "smooth-lcdv",
+ 0x10000L,
+ 0x20000L,
+
+ 0, /* module specific interface */
+
+ (FT_Module_Constructor)ft_smooth_init,
+ (FT_Module_Destructor) 0,
+ (FT_Module_Requester) 0
+ ,
+
+ FT_GLYPH_FORMAT_OUTLINE,
+
+ (FT_Renderer_RenderFunc) ft_smooth_render_lcd_v,
+ (FT_Renderer_TransformFunc)ft_smooth_transform,
+ (FT_Renderer_GetCBoxFunc) ft_smooth_get_cbox,
+ (FT_Renderer_SetModeFunc) ft_smooth_set_mode,
+
+ (FT_Raster_Funcs*) &FT_GRAYS_RASTER_GET
+ )
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftsmooth.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftsmooth.h
new file mode 100644
index 0000000000..775b82d101
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftsmooth.h
@@ -0,0 +1,49 @@
+/***************************************************************************/
+/* */
+/* ftsmooth.h */
+/* */
+/* Anti-aliasing renderer interface (specification). */
+/* */
+/* Copyright 1996-2001 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTSMOOTH_H__
+#define __FTSMOOTH_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/ftrender.h"
+
+
+FT_BEGIN_HEADER
+
+
+#ifndef FT_CONFIG_OPTION_NO_STD_RASTER
+ FT_DECLARE_RENDERER( ft_std_renderer_class )
+#endif
+
+#ifndef FT_CONFIG_OPTION_NO_SMOOTH_RASTER
+ FT_DECLARE_RENDERER( ft_smooth_renderer_class )
+
+ FT_DECLARE_RENDERER( ft_smooth_lcd_renderer_class )
+
+ FT_DECLARE_RENDERER( ft_smooth_lcd_v_renderer_class )
+#endif
+
+
+
+FT_END_HEADER
+
+#endif /* __FTSMOOTH_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftspic.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftspic.c
new file mode 100644
index 0000000000..42b9373bc3
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftspic.c
@@ -0,0 +1,118 @@
+/***************************************************************************/
+/* */
+/* ftspic.c */
+/* */
+/* The FreeType position independent code services for smooth module. */
+/* */
+/* Copyright 2009, 2010, 2012, 2013 by */
+/* Oran Agra and Mickey Gabel. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/freetype.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "ftspic.h"
+#include "ftsmerrs.h"
+
+
+#ifdef FT_CONFIG_OPTION_PIC
+
+ /* forward declaration of PIC init functions from ftgrays.c */
+ void
+ FT_Init_Class_ft_grays_raster( FT_Raster_Funcs* funcs );
+
+
+ void
+ ft_smooth_renderer_class_pic_free( FT_Library library )
+ {
+ FT_PIC_Container* pic_container = &library->pic_container;
+ FT_Memory memory = library->memory;
+
+
+ if ( pic_container->smooth )
+ {
+ SmoothPIC* container = (SmoothPIC*)pic_container->smooth;
+
+
+ if ( --container->ref_count )
+ return;
+
+ FT_FREE( container );
+ pic_container->smooth = NULL;
+ }
+ }
+
+
+ FT_Error
+ ft_smooth_renderer_class_pic_init( FT_Library library )
+ {
+ FT_PIC_Container* pic_container = &library->pic_container;
+ FT_Error error = FT_Err_Ok;
+ SmoothPIC* container = NULL;
+ FT_Memory memory = library->memory;
+
+
+ /* since this function also serve smooth_lcd and smooth_lcdv renderers,
+ it implements reference counting */
+ if ( pic_container->smooth )
+ {
+ ((SmoothPIC*)pic_container->smooth)->ref_count++;
+ return error;
+ }
+
+ /* allocate pointer, clear and set global container pointer */
+ if ( FT_ALLOC( container, sizeof ( *container ) ) )
+ return error;
+ FT_MEM_SET( container, 0, sizeof ( *container ) );
+ pic_container->smooth = container;
+
+ container->ref_count = 1;
+
+ /* initialize pointer table - */
+ /* this is how the module usually expects this data */
+ FT_Init_Class_ft_grays_raster( &container->ft_grays_raster );
+
+ return error;
+ }
+
+
+ /* re-route these init and free functions to the above functions */
+ FT_Error
+ ft_smooth_lcd_renderer_class_pic_init( FT_Library library )
+ {
+ return ft_smooth_renderer_class_pic_init( library );
+ }
+
+
+ void
+ ft_smooth_lcd_renderer_class_pic_free( FT_Library library )
+ {
+ ft_smooth_renderer_class_pic_free( library );
+ }
+
+
+ FT_Error
+ ft_smooth_lcdv_renderer_class_pic_init( FT_Library library )
+ {
+ return ft_smooth_renderer_class_pic_init( library );
+ }
+
+
+ void
+ ft_smooth_lcdv_renderer_class_pic_free( FT_Library library )
+ {
+ ft_smooth_renderer_class_pic_free( library );
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftspic.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftspic.h
new file mode 100644
index 0000000000..5533967429
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/ftspic.h
@@ -0,0 +1,74 @@
+/***************************************************************************/
+/* */
+/* ftspic.h */
+/* */
+/* The FreeType position independent code services for smooth module. */
+/* */
+/* Copyright 2009 by */
+/* Oran Agra and Mickey Gabel. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __FTSPIC_H__
+#define __FTSPIC_H__
+
+
+FT_BEGIN_HEADER
+
+#include "../../include/freetype/internal/ftpic.h"
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_GRAYS_RASTER_GET ft_grays_raster
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+ typedef struct SmoothPIC_
+ {
+ int ref_count;
+ FT_Raster_Funcs ft_grays_raster;
+
+ } SmoothPIC;
+
+
+#define GET_PIC( lib ) \
+ ( (SmoothPIC*)( (lib)->pic_container.smooth ) )
+#define FT_GRAYS_RASTER_GET ( GET_PIC( library )->ft_grays_raster )
+
+
+ /* see ftspic.c for the implementation */
+ void
+ ft_smooth_renderer_class_pic_free( FT_Library library );
+
+ void
+ ft_smooth_lcd_renderer_class_pic_free( FT_Library library );
+
+ void
+ ft_smooth_lcdv_renderer_class_pic_free( FT_Library library );
+
+ FT_Error
+ ft_smooth_renderer_class_pic_init( FT_Library library );
+
+ FT_Error
+ ft_smooth_lcd_renderer_class_pic_init( FT_Library library );
+
+ FT_Error
+ ft_smooth_lcdv_renderer_class_pic_init( FT_Library library );
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __FTSPIC_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/fxft_smooth.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/fxft_smooth.c
new file mode 100644
index 0000000000..ad047ddc0a
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/fxft_smooth.c
@@ -0,0 +1,31 @@
+#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501
+/***************************************************************************/
+/* */
+/* smooth.c */
+/* */
+/* FreeType anti-aliasing rasterer module component (body only). */
+/* */
+/* Copyright 1996-2001 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#define FT_MAKE_OPTION_SINGLE_OBJECT
+#define FT2_BUILD_LIBRARY
+
+#include "../../include/ft2build.h"
+#include "ftspic.c"
+#include "ftgrays.c"
+#include "ftsmooth.c"
+
+
+/* END */
+#endif
+
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/module.mk b/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/module.mk
new file mode 100644
index 0000000000..47f6c04076
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/module.mk
@@ -0,0 +1,27 @@
+#
+# FreeType 2 smooth renderer module definition
+#
+
+
+# Copyright 1996-2000, 2006 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT. By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+
+FTMODULE_H_COMMANDS += SMOOTH_RENDERER
+
+define SMOOTH_RENDERER
+$(OPEN_DRIVER) FT_Renderer_Class, ft_smooth_renderer_class $(CLOSE_DRIVER)
+$(ECHO_DRIVER)smooth $(ECHO_DRIVER_DESC)anti-aliased bitmap renderer$(ECHO_DRIVER_DONE)
+$(OPEN_DRIVER) FT_Renderer_Class, ft_smooth_lcd_renderer_class $(CLOSE_DRIVER)
+$(ECHO_DRIVER)smooth $(ECHO_DRIVER_DESC)anti-aliased bitmap renderer for LCDs$(ECHO_DRIVER_DONE)
+$(OPEN_DRIVER) FT_Renderer_Class, ft_smooth_lcdv_renderer_class $(CLOSE_DRIVER)
+$(ECHO_DRIVER)smooth $(ECHO_DRIVER_DESC)anti-aliased bitmap renderer for vertical LCDs$(ECHO_DRIVER_DONE)
+endef
+
+# EOF
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/rules.mk b/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/rules.mk
new file mode 100644
index 0000000000..88d0aa53ac
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/smooth/rules.mk
@@ -0,0 +1,70 @@
+#
+# FreeType 2 smooth renderer module build rules
+#
+
+
+# Copyright 1996-2000, 2001, 2003, 2011 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT. By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+
+# smooth driver directory
+#
+SMOOTH_DIR := $(SRC_DIR)/smooth
+
+# compilation flags for the driver
+#
+SMOOTH_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(SMOOTH_DIR))
+
+
+# smooth driver sources (i.e., C files)
+#
+SMOOTH_DRV_SRC := $(SMOOTH_DIR)/ftgrays.c \
+ $(SMOOTH_DIR)/ftsmooth.c \
+ $(SMOOTH_DIR)/ftspic.c
+
+
+# smooth driver headers
+#
+SMOOTH_DRV_H := $(SMOOTH_DRV_SRC:%c=%h) \
+ $(SMOOTH_DIR)/ftsmerrs.h
+
+
+# smooth driver object(s)
+#
+# SMOOTH_DRV_OBJ_M is used during `multi' builds.
+# SMOOTH_DRV_OBJ_S is used during `single' builds.
+#
+SMOOTH_DRV_OBJ_M := $(SMOOTH_DRV_SRC:$(SMOOTH_DIR)/%.c=$(OBJ_DIR)/%.$O)
+SMOOTH_DRV_OBJ_S := $(OBJ_DIR)/smooth.$O
+
+# smooth driver source file for single build
+#
+SMOOTH_DRV_SRC_S := $(SMOOTH_DIR)/smooth.c
+
+
+# smooth driver - single object
+#
+$(SMOOTH_DRV_OBJ_S): $(SMOOTH_DRV_SRC_S) $(SMOOTH_DRV_SRC) \
+ $(FREETYPE_H) $(SMOOTH_DRV_H)
+ $(SMOOTH_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(SMOOTH_DRV_SRC_S))
+
+
+# smooth driver - multiple objects
+#
+$(OBJ_DIR)/%.$O: $(SMOOTH_DIR)/%.c $(FREETYPE_H) $(SMOOTH_DRV_H)
+ $(SMOOTH_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)
+
+
+# update main driver object lists
+#
+DRV_OBJS_S += $(SMOOTH_DRV_OBJ_S)
+DRV_OBJS_M += $(SMOOTH_DRV_OBJ_M)
+
+
+# EOF
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/Jamfile b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/Jamfile
new file mode 100644
index 0000000000..a8cccfe137
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/Jamfile
@@ -0,0 +1,29 @@
+# FreeType 2 src/truetype Jamfile
+#
+# Copyright 2001, 2004 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT. By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+SubDir FT2_TOP $(FT2_SRC_DIR) truetype ;
+
+{
+ local _sources ;
+
+ if $(FT2_MULTI)
+ {
+ _sources = ttdriver ttobjs ttpload ttgload ttinterp ttgxvar ttpic ;
+ }
+ else
+ {
+ _sources = truetype ;
+ }
+
+ Library $(FT2_LIB) : $(_sources).c ;
+}
+
+# end of src/truetype Jamfile
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/fxft_truetype.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/fxft_truetype.c
new file mode 100644
index 0000000000..5c793a4238
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/fxft_truetype.c
@@ -0,0 +1,42 @@
+#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501
+/***************************************************************************/
+/* */
+/* truetype.c */
+/* */
+/* FreeType TrueType driver component (body only). */
+/* */
+/* Copyright 1996-2001, 2004, 2006, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#define FT_MAKE_OPTION_SINGLE_OBJECT
+#define FT2_BUILD_LIBRARY
+
+#include "../../include/ft2build.h"
+#include "ttpic.c"
+#include "ttdriver.c" /* driver interface */
+#include "ttpload.c" /* tables loader */
+#include "ttgload.c" /* glyph loader */
+#include "ttobjs.c" /* object manager */
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+#include "ttinterp.c"
+#include "ttsubpix.c"
+#endif
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+#include "ttgxvar.c" /* gx distortable font */
+#endif
+
+
+/* END */
+#endif
+
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/module.mk b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/module.mk
new file mode 100644
index 0000000000..baee81a773
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/module.mk
@@ -0,0 +1,23 @@
+#
+# FreeType 2 TrueType module definition
+#
+
+
+# Copyright 1996-2000, 2006 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT. By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+
+FTMODULE_H_COMMANDS += TRUETYPE_DRIVER
+
+define TRUETYPE_DRIVER
+$(OPEN_DRIVER) FT_Driver_ClassRec, tt_driver_class $(CLOSE_DRIVER)
+$(ECHO_DRIVER)truetype $(ECHO_DRIVER_DESC)Windows/Mac font files with extension *.ttf or *.ttc$(ECHO_DRIVER_DONE)
+endef
+
+# EOF
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/rules.mk b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/rules.mk
new file mode 100644
index 0000000000..d4b69f578b
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/rules.mk
@@ -0,0 +1,74 @@
+#
+# FreeType 2 TrueType driver configuration rules
+#
+
+
+# Copyright 1996-2001, 2003-2004, 2011-2012 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT. By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+
+# TrueType driver directory
+#
+TT_DIR := $(SRC_DIR)/truetype
+
+
+# compilation flags for the driver
+#
+TT_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(TT_DIR))
+
+
+# TrueType driver sources (i.e., C files)
+#
+TT_DRV_SRC := $(TT_DIR)/ttdriver.c \
+ $(TT_DIR)/ttgload.c \
+ $(TT_DIR)/ttgxvar.c \
+ $(TT_DIR)/ttinterp.c \
+ $(TT_DIR)/ttobjs.c \
+ $(TT_DIR)/ttpic.c \
+ $(TT_DIR)/ttpload.c \
+ $(TT_DIR)/ttsubpix.c
+
+# TrueType driver headers
+#
+TT_DRV_H := $(TT_DRV_SRC:%.c=%.h) \
+ $(TT_DIR)/tterrors.h
+
+
+# TrueType driver object(s)
+#
+# TT_DRV_OBJ_M is used during `multi' builds
+# TT_DRV_OBJ_S is used during `single' builds
+#
+TT_DRV_OBJ_M := $(TT_DRV_SRC:$(TT_DIR)/%.c=$(OBJ_DIR)/%.$O)
+TT_DRV_OBJ_S := $(OBJ_DIR)/truetype.$O
+
+# TrueType driver source file for single build
+#
+TT_DRV_SRC_S := $(TT_DIR)/truetype.c
+
+
+# TrueType driver - single object
+#
+$(TT_DRV_OBJ_S): $(TT_DRV_SRC_S) $(TT_DRV_SRC) $(FREETYPE_H) $(TT_DRV_H)
+ $(TT_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(TT_DRV_SRC_S))
+
+
+# driver - multiple objects
+#
+$(OBJ_DIR)/%.$O: $(TT_DIR)/%.c $(FREETYPE_H) $(TT_DRV_H)
+ $(TT_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)
+
+
+# update main driver object lists
+#
+DRV_OBJS_S += $(TT_DRV_OBJ_S)
+DRV_OBJS_M += $(TT_DRV_OBJ_M)
+
+
+# EOF
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttdriver.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttdriver.c
new file mode 100644
index 0000000000..4576ad9b74
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttdriver.c
@@ -0,0 +1,572 @@
+/***************************************************************************/
+/* */
+/* ttdriver.c */
+/* */
+/* TrueType font driver implementation (body). */
+/* */
+/* Copyright 1996-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/internal/sfnt.h"
+#include "../../include/freetype/internal/services/svxf86nm.h"
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+#include "../../include/freetype/ftmm.h"
+#include "../../include/freetype/internal/services/svmm.h"
+#endif
+
+#include "../../include/freetype/internal/services/svtteng.h"
+#include "../../include/freetype/internal/services/svttglyf.h"
+#include "../../include/freetype/internal/services/svprop.h"
+#include "../../include/freetype/ftttdrv.h"
+
+#include "ttdriver.h"
+#include "ttgload.h"
+#include "ttpload.h"
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+#include "ttgxvar.h"
+#endif
+
+#include "tterrors.h"
+
+#include "ttpic.h"
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_ttdriver
+
+
+ /*
+ * PROPERTY SERVICE
+ *
+ */
+ static FT_Error
+ tt_property_set( FT_Module module, /* TT_Driver */
+ const char* property_name,
+ const void* value )
+ {
+ FT_Error error = FT_Err_Ok;
+ TT_Driver driver = (TT_Driver)module;
+
+
+ if ( !ft_strcmp( property_name, "interpreter-version" ) )
+ {
+ FT_UInt* interpreter_version = (FT_UInt*)value;
+
+
+#ifndef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ if ( *interpreter_version != TT_INTERPRETER_VERSION_35 )
+ error = FT_ERR( Unimplemented_Feature );
+ else
+#endif
+ driver->interpreter_version = *interpreter_version;
+
+ return error;
+ }
+
+ FT_TRACE0(( "tt_property_set: missing property `%s'\n",
+ property_name ));
+ return FT_THROW( Missing_Property );
+ }
+
+
+ static FT_Error
+ tt_property_get( FT_Module module, /* TT_Driver */
+ const char* property_name,
+ const void* value )
+ {
+ FT_Error error = FT_Err_Ok;
+ TT_Driver driver = (TT_Driver)module;
+
+ FT_UInt interpreter_version = driver->interpreter_version;
+
+
+ if ( !ft_strcmp( property_name, "interpreter-version" ) )
+ {
+ FT_UInt* val = (FT_UInt*)value;
+
+
+ *val = interpreter_version;
+
+ return error;
+ }
+
+ FT_TRACE0(( "tt_property_get: missing property `%s'\n",
+ property_name ));
+ return FT_THROW( Missing_Property );
+ }
+
+
+ FT_DEFINE_SERVICE_PROPERTIESREC(
+ tt_service_properties,
+ (FT_Properties_SetFunc)tt_property_set,
+ (FT_Properties_GetFunc)tt_property_get )
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** ****/
+ /**** F A C E S ****/
+ /**** ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+#undef PAIR_TAG
+#define PAIR_TAG( left, right ) ( ( (FT_ULong)left << 16 ) | \
+ (FT_ULong)right )
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_get_kerning */
+ /* */
+ /* <Description> */
+ /* A driver method used to return the kerning vector between two */
+ /* glyphs of the same face. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the source face object. */
+ /* */
+ /* left_glyph :: The index of the left glyph in the kern pair. */
+ /* */
+ /* right_glyph :: The index of the right glyph in the kern pair. */
+ /* */
+ /* <Output> */
+ /* kerning :: The kerning vector. This is in font units for */
+ /* scalable formats, and in pixels for fixed-sizes */
+ /* formats. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ /* <Note> */
+ /* Only horizontal layouts (left-to-right & right-to-left) are */
+ /* supported by this function. Other layouts, or more sophisticated */
+ /* kernings, are out of scope of this method (the basic driver */
+ /* interface is meant to be simple). */
+ /* */
+ /* They can be implemented by format-specific interfaces. */
+ /* */
+ static FT_Error
+ tt_get_kerning( FT_Face ttface, /* TT_Face */
+ FT_UInt left_glyph,
+ FT_UInt right_glyph,
+ FT_Vector* kerning )
+ {
+ TT_Face face = (TT_Face)ttface;
+ SFNT_Service sfnt = (SFNT_Service)face->sfnt;
+
+
+ kerning->x = 0;
+ kerning->y = 0;
+
+ if ( sfnt )
+ kerning->x = sfnt->get_kerning( face, left_glyph, right_glyph );
+
+ return 0;
+ }
+
+
+#undef PAIR_TAG
+
+
+ static FT_Error
+ tt_get_advances( FT_Face ttface,
+ FT_UInt start,
+ FT_UInt count,
+ FT_Int32 flags,
+ FT_Fixed *advances )
+ {
+ FT_UInt nn;
+ TT_Face face = (TT_Face) ttface;
+
+
+ /* XXX: TODO: check for sbits */
+
+ if ( flags & FT_LOAD_VERTICAL_LAYOUT )
+ {
+ for ( nn = 0; nn < count; nn++ )
+ {
+ FT_Short tsb;
+ FT_UShort ah;
+
+
+ TT_Get_VMetrics( face, start + nn, &tsb, &ah );
+ advances[nn] = ah;
+ }
+ }
+ else
+ {
+ for ( nn = 0; nn < count; nn++ )
+ {
+ FT_Short lsb;
+ FT_UShort aw;
+
+
+ TT_Get_HMetrics( face, start + nn, &lsb, &aw );
+ advances[nn] = aw;
+ }
+ }
+
+ return FT_Err_Ok;
+ }
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** ****/
+ /**** S I Z E S ****/
+ /**** ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+
+ static FT_Error
+ tt_size_select( FT_Size size,
+ FT_ULong strike_index )
+ {
+ TT_Face ttface = (TT_Face)size->face;
+ TT_Size ttsize = (TT_Size)size;
+ FT_Error error = FT_Err_Ok;
+
+
+ ttsize->strike_index = strike_index;
+
+ if ( FT_IS_SCALABLE( size->face ) )
+ {
+ /* use the scaled metrics, even when tt_size_reset fails */
+ FT_Select_Metrics( size->face, strike_index );
+
+ tt_size_reset( ttsize );
+ }
+ else
+ {
+ SFNT_Service sfnt = (SFNT_Service) ttface->sfnt;
+ FT_Size_Metrics* metrics = &size->metrics;
+
+
+ error = sfnt->load_strike_metrics( ttface, strike_index, metrics );
+ if ( error )
+ ttsize->strike_index = 0xFFFFFFFFUL;
+ }
+
+ return error;
+ }
+
+#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
+
+
+ static FT_Error
+ tt_size_request( FT_Size size,
+ FT_Size_Request req )
+ {
+ TT_Size ttsize = (TT_Size)size;
+ FT_Error error = FT_Err_Ok;
+
+
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+
+ if ( FT_HAS_FIXED_SIZES( size->face ) )
+ {
+ TT_Face ttface = (TT_Face)size->face;
+ SFNT_Service sfnt = (SFNT_Service) ttface->sfnt;
+ FT_ULong strike_index;
+
+
+ error = sfnt->set_sbit_strike( ttface, req, &strike_index );
+
+ if ( error )
+ ttsize->strike_index = 0xFFFFFFFFUL;
+ else
+ return tt_size_select( size, strike_index );
+ }
+
+#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
+
+ FT_Request_Metrics( size->face, req );
+
+ if ( FT_IS_SCALABLE( size->face ) )
+ {
+ error = tt_size_reset( ttsize );
+ ttsize->root.metrics = ttsize->metrics;
+ }
+
+ return error;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_glyph_load */
+ /* */
+ /* <Description> */
+ /* A driver method used to load a glyph within a given glyph slot. */
+ /* */
+ /* <Input> */
+ /* slot :: A handle to the target slot object where the glyph */
+ /* will be loaded. */
+ /* */
+ /* size :: A handle to the source face size at which the glyph */
+ /* must be scaled, loaded, etc. */
+ /* */
+ /* glyph_index :: The index of the glyph in the font file. */
+ /* */
+ /* load_flags :: A flag indicating what to load for this glyph. The */
+ /* FT_LOAD_XXX constants can be used to control the */
+ /* glyph loading process (e.g., whether the outline */
+ /* should be scaled, whether to load bitmaps or not, */
+ /* whether to hint the outline, etc). */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ static FT_Error
+ tt_glyph_load( FT_GlyphSlot ttslot, /* TT_GlyphSlot */
+ FT_Size ttsize, /* TT_Size */
+ FT_UInt glyph_index,
+ FT_Int32 load_flags )
+ {
+ TT_GlyphSlot slot = (TT_GlyphSlot)ttslot;
+ TT_Size size = (TT_Size)ttsize;
+ FT_Face face = ttslot->face;
+ FT_Error error;
+
+
+ if ( !slot )
+ return FT_THROW( Invalid_Slot_Handle );
+
+ if ( !size )
+ return FT_THROW( Invalid_Size_Handle );
+
+ if ( !face )
+ return FT_THROW( Invalid_Argument );
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+ if ( glyph_index >= (FT_UInt)face->num_glyphs &&
+ !face->internal->incremental_interface )
+#else
+ if ( glyph_index >= (FT_UInt)face->num_glyphs )
+#endif
+ return FT_THROW( Invalid_Argument );
+
+ if ( load_flags & FT_LOAD_NO_HINTING )
+ {
+ /* both FT_LOAD_NO_HINTING and FT_LOAD_NO_AUTOHINT */
+ /* are necessary to disable hinting for tricky fonts */
+
+ if ( FT_IS_TRICKY( face ) )
+ load_flags &= ~FT_LOAD_NO_HINTING;
+
+ if ( load_flags & FT_LOAD_NO_AUTOHINT )
+ load_flags |= FT_LOAD_NO_HINTING;
+ }
+
+ if ( load_flags & ( FT_LOAD_NO_RECURSE | FT_LOAD_NO_SCALE ) )
+ {
+ load_flags |= FT_LOAD_NO_BITMAP | FT_LOAD_NO_SCALE;
+
+ if ( !FT_IS_TRICKY( face ) )
+ load_flags |= FT_LOAD_NO_HINTING;
+ }
+
+ /* now load the glyph outline if necessary */
+ error = TT_Load_Glyph( size, slot, glyph_index, load_flags );
+
+ /* force drop-out mode to 2 - irrelevant now */
+ /* slot->outline.dropout_mode = 2; */
+
+ return error;
+ }
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /**** ****/
+ /**** ****/
+ /**** D R I V E R I N T E R F A C E ****/
+ /**** ****/
+ /**** ****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+ FT_DEFINE_SERVICE_MULTIMASTERSREC(
+ tt_service_gx_multi_masters,
+ (FT_Get_MM_Func) NULL,
+ (FT_Set_MM_Design_Func) NULL,
+ (FT_Set_MM_Blend_Func) TT_Set_MM_Blend,
+ (FT_Get_MM_Var_Func) TT_Get_MM_Var,
+ (FT_Set_Var_Design_Func)TT_Set_Var_Design )
+#endif
+
+ static const FT_Service_TrueTypeEngineRec tt_service_truetype_engine =
+ {
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+ FT_TRUETYPE_ENGINE_TYPE_UNPATENTED
+#else
+ FT_TRUETYPE_ENGINE_TYPE_PATENTED
+#endif
+
+#else /* !TT_USE_BYTECODE_INTERPRETER */
+
+ FT_TRUETYPE_ENGINE_TYPE_NONE
+
+#endif /* TT_USE_BYTECODE_INTERPRETER */
+ };
+
+ FT_DEFINE_SERVICE_TTGLYFREC(
+ tt_service_truetype_glyf,
+ (TT_Glyf_GetLocationFunc)tt_face_get_location )
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+ FT_DEFINE_SERVICEDESCREC5(
+ tt_services,
+ FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_TRUETYPE,
+ FT_SERVICE_ID_MULTI_MASTERS, &TT_SERVICE_GX_MULTI_MASTERS_GET,
+ FT_SERVICE_ID_TRUETYPE_ENGINE, &tt_service_truetype_engine,
+ FT_SERVICE_ID_TT_GLYF, &TT_SERVICE_TRUETYPE_GLYF_GET,
+ FT_SERVICE_ID_PROPERTIES, &TT_SERVICE_PROPERTIES_GET )
+#else
+ FT_DEFINE_SERVICEDESCREC4(
+ tt_services,
+ FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_TRUETYPE,
+ FT_SERVICE_ID_TRUETYPE_ENGINE, &tt_service_truetype_engine,
+ FT_SERVICE_ID_TT_GLYF, &TT_SERVICE_TRUETYPE_GLYF_GET,
+ FT_SERVICE_ID_PROPERTIES, &TT_SERVICE_PROPERTIES_GET )
+#endif
+
+
+ FT_CALLBACK_DEF( FT_Module_Interface )
+ tt_get_interface( FT_Module driver, /* TT_Driver */
+ const char* tt_interface )
+ {
+ FT_Library library;
+ FT_Module_Interface result;
+ FT_Module sfntd;
+ SFNT_Service sfnt;
+
+
+ /* TT_SERVICES_GET derefers `library' in PIC mode */
+#ifdef FT_CONFIG_OPTION_PIC
+ if ( !driver )
+ return NULL;
+ library = driver->library;
+ if ( !library )
+ return NULL;
+#endif
+
+ result = ft_service_list_lookup( TT_SERVICES_GET, tt_interface );
+ if ( result != NULL )
+ return result;
+
+#ifndef FT_CONFIG_OPTION_PIC
+ if ( !driver )
+ return NULL;
+ library = driver->library;
+ if ( !library )
+ return NULL;
+#endif
+
+ /* only return the default interface from the SFNT module */
+ sfntd = FT_Get_Module( library, "sfnt" );
+ if ( sfntd )
+ {
+ sfnt = (SFNT_Service)( sfntd->clazz->module_interface );
+ if ( sfnt )
+ return sfnt->get_interface( driver, tt_interface );
+ }
+
+ return 0;
+ }
+
+
+ /* The FT_DriverInterface structure is defined in ftdriver.h. */
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+#define TT_HINTER_FLAG FT_MODULE_DRIVER_HAS_HINTER
+#else
+#define TT_HINTER_FLAG 0
+#endif
+
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+#define TT_SIZE_SELECT tt_size_select
+#else
+#define TT_SIZE_SELECT 0
+#endif
+
+ FT_DEFINE_DRIVER(
+ tt_driver_class,
+
+ FT_MODULE_FONT_DRIVER |
+ FT_MODULE_DRIVER_SCALABLE |
+ TT_HINTER_FLAG,
+
+ sizeof ( TT_DriverRec ),
+
+ "truetype_xyq", /* driver name */
+ 0x10000L, /* driver version == 1.0 */
+ 0x20000L, /* driver requires FreeType 2.0 or above */
+
+ (void*)0, /* driver specific interface */
+
+ tt_driver_init,
+ tt_driver_done,
+ tt_get_interface,
+
+ sizeof ( TT_FaceRec ),
+ sizeof ( TT_SizeRec ),
+ sizeof ( FT_GlyphSlotRec ),
+
+ tt_face_init,
+ tt_face_done,
+ tt_size_init,
+ tt_size_done,
+ tt_slot_init,
+ 0, /* FT_Slot_DoneFunc */
+
+ tt_glyph_load,
+
+ tt_get_kerning,
+ 0, /* FT_Face_AttachFunc */
+ tt_get_advances,
+
+ tt_size_request,
+ TT_SIZE_SELECT
+ )
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttdriver.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttdriver.h
new file mode 100644
index 0000000000..80802c1de0
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttdriver.h
@@ -0,0 +1,38 @@
+/***************************************************************************/
+/* */
+/* ttdriver.h */
+/* */
+/* High-level TrueType driver interface (specification). */
+/* */
+/* Copyright 1996-2001, 2002 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __TTDRIVER_H__
+#define __TTDRIVER_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdriver.h"
+
+
+FT_BEGIN_HEADER
+
+
+ FT_DECLARE_DRIVER( tt_driver_class )
+
+
+FT_END_HEADER
+
+#endif /* __TTDRIVER_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/tterrors.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/tterrors.h
new file mode 100644
index 0000000000..b6aaa9f53b
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/tterrors.h
@@ -0,0 +1,41 @@
+/***************************************************************************/
+/* */
+/* tterrors.h */
+/* */
+/* TrueType error codes (specification only). */
+/* */
+/* Copyright 2001, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* This file is used to define the TrueType error enumeration */
+ /* constants. */
+ /* */
+ /*************************************************************************/
+
+#ifndef __TTERRORS_H__
+#define __TTERRORS_H__
+
+#include "../../include/freetype/ftmoderr.h"
+
+#undef __FTERRORS_H__
+
+#undef FT_ERR_PREFIX
+#define FT_ERR_PREFIX TT_Err_
+#define FT_ERR_BASE FT_Mod_Err_TrueType
+
+#include "../../include/freetype/fterrors.h"
+
+#endif /* __TTERRORS_H__ */
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttgload.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttgload.c
new file mode 100644
index 0000000000..c32419b77d
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttgload.c
@@ -0,0 +1,2337 @@
+/***************************************************************************/
+/* */
+/* ttgload.c */
+/* */
+/* TrueType Glyph Loader (body). */
+/* */
+/* Copyright 1996-2013 */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftcalc.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/internal/sfnt.h"
+#include "../../include/freetype/tttags.h"
+#include "../../include/freetype/ftoutln.h"
+#include "../../include/freetype/ftttdrv.h"
+
+
+#include "ttgload.h"
+#include "ttpload.h"
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+#include "ttgxvar.h"
+#endif
+
+#include "tterrors.h"
+#include "ttsubpix.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_ttgload
+
+
+ /*************************************************************************/
+ /* */
+ /* Composite glyph flags. */
+ /* */
+#define ARGS_ARE_WORDS 0x0001
+#define ARGS_ARE_XY_VALUES 0x0002
+#define ROUND_XY_TO_GRID 0x0004
+#define WE_HAVE_A_SCALE 0x0008
+/* reserved 0x0010 */
+#define MORE_COMPONENTS 0x0020
+#define WE_HAVE_AN_XY_SCALE 0x0040
+#define WE_HAVE_A_2X2 0x0080
+#define WE_HAVE_INSTR 0x0100
+#define USE_MY_METRICS 0x0200
+#define OVERLAP_COMPOUND 0x0400
+#define SCALED_COMPONENT_OFFSET 0x0800
+#define UNSCALED_COMPONENT_OFFSET 0x1000
+
+
+ /*************************************************************************/
+ /* */
+ /* Return the horizontal metrics in font units for a given glyph. */
+ /* */
+ FT_LOCAL_DEF( void )
+ TT_Get_HMetrics( TT_Face face,
+ FT_UInt idx,
+ FT_Short* lsb,
+ FT_UShort* aw )
+ {
+ ( (SFNT_Service)face->sfnt )->get_metrics( face, 0, idx, lsb, aw );
+
+ FT_TRACE5(( " advance width (font units): %d\n", *aw ));
+ FT_TRACE5(( " left side bearing (font units): %d\n", *lsb ));
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* Return the vertical metrics in font units for a given glyph. */
+ /* Greg Hitchcock from Microsoft told us that if there were no `vmtx' */
+ /* table, typoAscender/Descender from the `OS/2' table would be used */
+ /* instead, and if there were no `OS/2' table, use ascender/descender */
+ /* from the `hhea' table. But that is not what Microsoft's rasterizer */
+ /* apparently does: It uses the ppem value as the advance height, and */
+ /* sets the top side bearing to be zero. */
+ /* */
+ FT_LOCAL_DEF( void )
+ TT_Get_VMetrics( TT_Face face,
+ FT_UInt idx,
+ FT_Short* tsb,
+ FT_UShort* ah )
+ {
+ if ( face->vertical_info )
+ ( (SFNT_Service)face->sfnt )->get_metrics( face, 1, idx, tsb, ah );
+
+#if 1 /* Empirically determined, at variance with what MS said */
+
+ else
+ {
+ *tsb = 0;
+ *ah = face->root.units_per_EM;
+ }
+
+#else /* This is what MS said to do. It isn't what they do, however. */
+
+ else if ( face->os2.version != 0xFFFFU )
+ {
+ *tsb = face->os2.sTypoAscender;
+ *ah = face->os2.sTypoAscender - face->os2.sTypoDescender;
+ }
+ else
+ {
+ *tsb = face->horizontal.Ascender;
+ *ah = face->horizontal.Ascender - face->horizontal.Descender;
+ }
+
+#endif
+
+ FT_TRACE5(( " advance height (font units): %d\n", *ah ));
+ FT_TRACE5(( " top side bearing (font units): %d\n", *tsb ));
+ }
+
+
+ static void
+ tt_get_metrics( TT_Loader loader,
+ FT_UInt glyph_index )
+ {
+ TT_Face face = (TT_Face)loader->face;
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ TT_Driver driver = (TT_Driver)FT_FACE_DRIVER( face );
+#endif
+
+ FT_Short left_bearing = 0, top_bearing = 0;
+ FT_UShort advance_width = 0, advance_height = 0;
+
+
+ TT_Get_HMetrics( face, glyph_index,
+ &left_bearing,
+ &advance_width );
+ TT_Get_VMetrics( face, glyph_index,
+ &top_bearing,
+ &advance_height );
+
+ loader->left_bearing = left_bearing;
+ loader->advance = advance_width;
+ loader->top_bearing = top_bearing;
+ loader->vadvance = advance_height;
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 )
+ {
+ if ( loader->exec )
+ loader->exec->sph_tweak_flags = 0;
+
+ /* this may not be the right place for this, but it works */
+ if ( loader->exec && loader->exec->ignore_x_mode )
+ sph_set_tweaks( loader, glyph_index );
+ }
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+ if ( !loader->linear_def )
+ {
+ loader->linear_def = 1;
+ loader->linear = advance_width;
+ }
+ }
+
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+
+ static void
+ tt_get_metrics_incr_overrides( TT_Loader loader,
+ FT_UInt glyph_index )
+ {
+ TT_Face face = (TT_Face)loader->face;
+
+ FT_Short left_bearing = 0, top_bearing = 0;
+ FT_UShort advance_width = 0, advance_height = 0;
+
+
+ /* If this is an incrementally loaded font check whether there are */
+ /* overriding metrics for this glyph. */
+ if ( face->root.internal->incremental_interface &&
+ face->root.internal->incremental_interface->funcs->get_glyph_metrics )
+ {
+ FT_Incremental_MetricsRec metrics;
+ FT_Error error;
+
+
+ metrics.bearing_x = loader->left_bearing;
+ metrics.bearing_y = 0;
+ metrics.advance = loader->advance;
+ metrics.advance_v = 0;
+
+ error = face->root.internal->incremental_interface->funcs->get_glyph_metrics(
+ face->root.internal->incremental_interface->object,
+ glyph_index, FALSE, &metrics );
+ if ( error )
+ goto Exit;
+
+ left_bearing = (FT_Short)metrics.bearing_x;
+ advance_width = (FT_UShort)metrics.advance;
+
+#if 0
+
+ /* GWW: Do I do the same for vertical metrics? */
+ metrics.bearing_x = 0;
+ metrics.bearing_y = loader->top_bearing;
+ metrics.advance = loader->vadvance;
+
+ error = face->root.internal->incremental_interface->funcs->get_glyph_metrics(
+ face->root.internal->incremental_interface->object,
+ glyph_index, TRUE, &metrics );
+ if ( error )
+ goto Exit;
+
+ top_bearing = (FT_Short)metrics.bearing_y;
+ advance_height = (FT_UShort)metrics.advance;
+
+#endif /* 0 */
+
+ loader->left_bearing = left_bearing;
+ loader->advance = advance_width;
+ loader->top_bearing = top_bearing;
+ loader->vadvance = advance_height;
+
+ if ( !loader->linear_def )
+ {
+ loader->linear_def = 1;
+ loader->linear = advance_width;
+ }
+ }
+
+ Exit:
+ return;
+ }
+
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
+
+
+ /*************************************************************************/
+ /* */
+ /* Translates an array of coordinates. */
+ /* */
+ static void
+ translate_array( FT_UInt n,
+ FT_Vector* coords,
+ FT_Pos delta_x,
+ FT_Pos delta_y )
+ {
+ FT_UInt k;
+
+
+ if ( delta_x )
+ for ( k = 0; k < n; k++ )
+ coords[k].x += delta_x;
+
+ if ( delta_y )
+ for ( k = 0; k < n; k++ )
+ coords[k].y += delta_y;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* The following functions are used by default with TrueType fonts. */
+ /* However, they can be replaced by alternatives if we need to support */
+ /* TrueType-compressed formats (like MicroType) in the future. */
+ /* */
+ /*************************************************************************/
+
+ FT_CALLBACK_DEF( FT_Error )
+ TT_Access_Glyph_Frame( TT_Loader loader,
+ FT_UInt glyph_index,
+ FT_ULong offset,
+ FT_UInt byte_count )
+ {
+ FT_Error error;
+ FT_Stream stream = loader->stream;
+
+ /* for non-debug mode */
+ FT_UNUSED( glyph_index );
+
+
+ FT_TRACE4(( "Glyph %ld\n", glyph_index ));
+
+ /* the following line sets the `error' variable through macros! */
+ if ( FT_STREAM_SEEK( offset ) || FT_FRAME_ENTER( byte_count ) )
+ return error;
+
+ loader->cursor = stream->cursor;
+ loader->limit = stream->limit;
+
+ return FT_Err_Ok;
+ }
+
+
+ FT_CALLBACK_DEF( void )
+ TT_Forget_Glyph_Frame( TT_Loader loader )
+ {
+ FT_Stream stream = loader->stream;
+
+
+ FT_FRAME_EXIT();
+ }
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ TT_Load_Glyph_Header( TT_Loader loader )
+ {
+ FT_Byte* p = loader->cursor;
+ FT_Byte* limit = loader->limit;
+
+
+ if ( p + 10 > limit )
+ return FT_THROW( Invalid_Outline );
+
+ loader->n_contours = FT_NEXT_SHORT( p );
+
+ loader->bbox.xMin = FT_NEXT_SHORT( p );
+ loader->bbox.yMin = FT_NEXT_SHORT( p );
+ loader->bbox.xMax = FT_NEXT_SHORT( p );
+ loader->bbox.yMax = FT_NEXT_SHORT( p );
+
+ FT_TRACE5(( " # of contours: %d\n", loader->n_contours ));
+ FT_TRACE5(( " xMin: %4d xMax: %4d\n", loader->bbox.xMin,
+ loader->bbox.xMax ));
+ FT_TRACE5(( " yMin: %4d yMax: %4d\n", loader->bbox.yMin,
+ loader->bbox.yMax ));
+ loader->cursor = p;
+
+ return FT_Err_Ok;
+ }
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ TT_Load_Simple_Glyph( TT_Loader load )
+ {
+ FT_Error error;
+ FT_Byte* p = load->cursor;
+ FT_Byte* limit = load->limit;
+ FT_GlyphLoader gloader = load->gloader;
+ FT_Int n_contours = load->n_contours;
+ FT_Outline* outline;
+ TT_Face face = (TT_Face)load->face;
+ FT_UShort n_ins;
+ FT_Int n_points;
+
+ FT_Byte *flag, *flag_limit;
+ FT_Byte c, count;
+ FT_Vector *vec, *vec_limit;
+ FT_Pos x;
+ FT_Short *cont, *cont_limit, prev_cont;
+ FT_Int xy_size = 0;
+
+
+ /* check that we can add the contours to the glyph */
+ error = FT_GLYPHLOADER_CHECK_POINTS( gloader, 0, n_contours );
+ if ( error )
+ goto Fail;
+
+ /* reading the contours' endpoints & number of points */
+ cont = gloader->current.outline.contours;
+ cont_limit = cont + n_contours;
+
+ /* check space for contours array + instructions count */
+ if ( n_contours >= 0xFFF || p + ( n_contours + 1 ) * 2 > limit )
+ goto Invalid_Outline;
+
+ prev_cont = FT_NEXT_SHORT( p );
+
+ if ( n_contours > 0 )
+ cont[0] = prev_cont;
+
+ if ( prev_cont < 0 )
+ goto Invalid_Outline;
+
+ for ( cont++; cont < cont_limit; cont++ )
+ {
+ cont[0] = FT_NEXT_SHORT( p );
+ if ( cont[0] <= prev_cont )
+ {
+ /* unordered contours: this is invalid */
+ goto Invalid_Outline;
+ }
+ prev_cont = cont[0];
+ }
+
+ n_points = 0;
+ if ( n_contours > 0 )
+ {
+ n_points = cont[-1] + 1;
+ if ( n_points < 0 )
+ goto Invalid_Outline;
+ }
+
+ /* note that we will add four phantom points later */
+ error = FT_GLYPHLOADER_CHECK_POINTS( gloader, n_points + 4, 0 );
+ if ( error )
+ goto Fail;
+
+ /* reading the bytecode instructions */
+ load->glyph->control_len = 0;
+ load->glyph->control_data = 0;
+
+ if ( p + 2 > limit )
+ goto Invalid_Outline;
+
+ n_ins = FT_NEXT_USHORT( p );
+
+ FT_TRACE5(( " Instructions size: %u\n", n_ins ));
+
+ if ( n_ins > face->max_profile.maxSizeOfInstructions )
+ {
+ FT_TRACE0(( "TT_Load_Simple_Glyph: too many instructions (%d)\n",
+ n_ins ));
+ error = FT_THROW( Too_Many_Hints );
+ goto Fail;
+ }
+
+ if ( ( limit - p ) < n_ins )
+ {
+ FT_TRACE0(( "TT_Load_Simple_Glyph: instruction count mismatch\n" ));
+ error = FT_THROW( Too_Many_Hints );
+ goto Fail;
+ }
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+ if ( IS_HINTED( load->load_flags ) )
+ {
+ load->glyph->control_len = n_ins;
+ load->glyph->control_data = load->exec->glyphIns;
+
+ FT_MEM_COPY( load->exec->glyphIns, p, (FT_Long)n_ins );
+ }
+
+#endif /* TT_USE_BYTECODE_INTERPRETER */
+
+ p += n_ins;
+
+ outline = &gloader->current.outline;
+ if (outline->tags == NULL) {
+ FT_TRACE0(( "TT_Load_Simple_Glyph: Outline->tags = NULL!\n" ));
+ goto Invalid_Outline;
+ }
+
+ /* reading the point tags */
+ flag = (FT_Byte*)outline->tags;
+ flag_limit = flag + n_points;
+
+ //FT_ASSERT( flag != NULL );
+
+ while ( flag < flag_limit )
+ {
+ if ( p + 1 > limit )
+ goto Invalid_Outline;
+
+ *flag++ = c = FT_NEXT_BYTE( p );
+ if ( c & 8 )
+ {
+ if ( p + 1 > limit )
+ goto Invalid_Outline;
+
+ count = FT_NEXT_BYTE( p );
+ if ( flag + (FT_Int)count > flag_limit )
+ goto Invalid_Outline;
+
+ for ( ; count > 0; count-- )
+ *flag++ = c;
+ }
+ }
+
+ /* reading the X coordinates */
+
+ vec = outline->points;
+ vec_limit = vec + n_points;
+ flag = (FT_Byte*)outline->tags;
+ x = 0;
+
+ if ( p + xy_size > limit )
+ goto Invalid_Outline;
+
+ for ( ; vec < vec_limit; vec++, flag++ )
+ {
+ FT_Pos y = 0;
+ FT_Byte f = *flag;
+
+
+ if ( f & 2 )
+ {
+ if ( p + 1 > limit )
+ goto Invalid_Outline;
+
+ y = (FT_Pos)FT_NEXT_BYTE( p );
+ if ( ( f & 16 ) == 0 )
+ y = -y;
+ }
+ else if ( ( f & 16 ) == 0 )
+ {
+ if ( p + 2 > limit )
+ goto Invalid_Outline;
+
+ y = (FT_Pos)FT_NEXT_SHORT( p );
+ }
+
+ x += y;
+ vec->x = x;
+ /* the cast is for stupid compilers */
+ *flag = (FT_Byte)( f & ~( 2 | 16 ) );
+ }
+
+ /* reading the Y coordinates */
+
+ vec = gloader->current.outline.points;
+ vec_limit = vec + n_points;
+ flag = (FT_Byte*)outline->tags;
+ x = 0;
+
+ for ( ; vec < vec_limit; vec++, flag++ )
+ {
+ FT_Pos y = 0;
+ FT_Byte f = *flag;
+
+
+ if ( f & 4 )
+ {
+ if ( p + 1 > limit )
+ goto Invalid_Outline;
+
+ y = (FT_Pos)FT_NEXT_BYTE( p );
+ if ( ( f & 32 ) == 0 )
+ y = -y;
+ }
+ else if ( ( f & 32 ) == 0 )
+ {
+ if ( p + 2 > limit )
+ goto Invalid_Outline;
+
+ y = (FT_Pos)FT_NEXT_SHORT( p );
+ }
+
+ x += y;
+ vec->y = x;
+ /* the cast is for stupid compilers */
+ *flag = (FT_Byte)( f & FT_CURVE_TAG_ON );
+ }
+
+ outline->n_points = (FT_UShort)n_points;
+ outline->n_contours = (FT_Short) n_contours;
+
+ load->cursor = p;
+
+ Fail:
+ return error;
+
+ Invalid_Outline:
+ error = FT_THROW( Invalid_Outline );
+ goto Fail;
+ }
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ TT_Load_Composite_Glyph( TT_Loader loader )
+ {
+ FT_Error error;
+ FT_Byte* p = loader->cursor;
+ FT_Byte* limit = loader->limit;
+ FT_GlyphLoader gloader = loader->gloader;
+ FT_SubGlyph subglyph;
+ FT_UInt num_subglyphs;
+
+
+ num_subglyphs = 0;
+
+ do
+ {
+ FT_Fixed xx, xy, yy, yx;
+ FT_UInt count;
+
+
+ /* check that we can load a new subglyph */
+ error = FT_GlyphLoader_CheckSubGlyphs( gloader, num_subglyphs + 1 );
+ if ( error )
+ goto Fail;
+
+ /* check space */
+ if ( p + 4 > limit )
+ goto Invalid_Composite;
+
+ subglyph = gloader->current.subglyphs + num_subglyphs;
+
+ subglyph->arg1 = subglyph->arg2 = 0;
+
+ subglyph->flags = FT_NEXT_USHORT( p );
+ subglyph->index = FT_NEXT_USHORT( p );
+
+ /* check space */
+ count = 2;
+ if ( subglyph->flags & ARGS_ARE_WORDS )
+ count += 2;
+ if ( subglyph->flags & WE_HAVE_A_SCALE )
+ count += 2;
+ else if ( subglyph->flags & WE_HAVE_AN_XY_SCALE )
+ count += 4;
+ else if ( subglyph->flags & WE_HAVE_A_2X2 )
+ count += 8;
+
+ if ( p + count > limit )
+ goto Invalid_Composite;
+
+ /* read arguments */
+ if ( subglyph->flags & ARGS_ARE_WORDS )
+ {
+ subglyph->arg1 = FT_NEXT_SHORT( p );
+ subglyph->arg2 = FT_NEXT_SHORT( p );
+ }
+ else
+ {
+ subglyph->arg1 = FT_NEXT_CHAR( p );
+ subglyph->arg2 = FT_NEXT_CHAR( p );
+ }
+
+ /* read transform */
+ xx = yy = 0x10000L;
+ xy = yx = 0;
+
+ if ( subglyph->flags & WE_HAVE_A_SCALE )
+ {
+ xx = (FT_Fixed)FT_NEXT_SHORT( p ) << 2;
+ yy = xx;
+ }
+ else if ( subglyph->flags & WE_HAVE_AN_XY_SCALE )
+ {
+ xx = (FT_Fixed)FT_NEXT_SHORT( p ) << 2;
+ yy = (FT_Fixed)FT_NEXT_SHORT( p ) << 2;
+ }
+ else if ( subglyph->flags & WE_HAVE_A_2X2 )
+ {
+ xx = (FT_Fixed)FT_NEXT_SHORT( p ) << 2;
+ yx = (FT_Fixed)FT_NEXT_SHORT( p ) << 2;
+ xy = (FT_Fixed)FT_NEXT_SHORT( p ) << 2;
+ yy = (FT_Fixed)FT_NEXT_SHORT( p ) << 2;
+ }
+
+ subglyph->transform.xx = xx;
+ subglyph->transform.xy = xy;
+ subglyph->transform.yx = yx;
+ subglyph->transform.yy = yy;
+
+ num_subglyphs++;
+
+ } while ( subglyph->flags & MORE_COMPONENTS );
+
+ gloader->current.num_subglyphs = num_subglyphs;
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+ {
+ FT_Stream stream = loader->stream;
+
+
+ /* we must undo the FT_FRAME_ENTER in order to point */
+ /* to the composite instructions, if we find some. */
+ /* We will process them later. */
+ /* */
+ loader->ins_pos = (FT_ULong)( FT_STREAM_POS() +
+ p - limit );
+ }
+
+#endif
+
+ loader->cursor = p;
+
+ Fail:
+ return error;
+
+ Invalid_Composite:
+ error = FT_THROW( Invalid_Composite );
+ goto Fail;
+ }
+
+
+ FT_LOCAL_DEF( void )
+ TT_Init_Glyph_Loading( TT_Face face )
+ {
+ face->access_glyph_frame = TT_Access_Glyph_Frame;
+ face->read_glyph_header = TT_Load_Glyph_Header;
+ face->read_simple_glyph = TT_Load_Simple_Glyph;
+ face->read_composite_glyph = TT_Load_Composite_Glyph;
+ face->forget_glyph_frame = TT_Forget_Glyph_Frame;
+ }
+
+
+ static void
+ tt_prepare_zone( TT_GlyphZone zone,
+ FT_GlyphLoad load,
+ FT_UInt start_point,
+ FT_UInt start_contour )
+ {
+ zone->n_points = (FT_UShort)( load->outline.n_points - start_point );
+ zone->n_contours = (FT_Short) ( load->outline.n_contours -
+ start_contour );
+ zone->org = load->extra_points + start_point;
+ zone->cur = load->outline.points + start_point;
+ zone->orus = load->extra_points2 + start_point;
+ zone->tags = (FT_Byte*)load->outline.tags + start_point;
+ zone->contours = (FT_UShort*)load->outline.contours + start_contour;
+ zone->first_point = (FT_UShort)start_point;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* TT_Hint_Glyph */
+ /* */
+ /* <Description> */
+ /* Hint the glyph using the zone prepared by the caller. Note that */
+ /* the zone is supposed to include four phantom points. */
+ /* */
+ static FT_Error
+ TT_Hint_Glyph( TT_Loader loader,
+ FT_Bool is_composite )
+ {
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ TT_Face face = (TT_Face)loader->face;
+ TT_Driver driver = (TT_Driver)FT_FACE_DRIVER( face );
+#endif
+
+ TT_GlyphZone zone = &loader->zone;
+ FT_Pos origin;
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+ FT_UInt n_ins;
+#else
+ FT_UNUSED( is_composite );
+#endif
+
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+ if ( loader->glyph->control_len > 0xFFFFL )
+ {
+ FT_TRACE1(( "TT_Hint_Glyph: too long instructions " ));
+ FT_TRACE1(( "(0x%lx byte) is truncated\n",
+ loader->glyph->control_len ));
+ }
+ n_ins = (FT_UInt)( loader->glyph->control_len );
+#endif
+
+ origin = zone->cur[zone->n_points - 4].x;
+ origin = FT_PIX_ROUND( origin ) - origin;
+ if ( origin )
+ translate_array( zone->n_points, zone->cur, origin, 0 );
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+ /* save original point position in org */
+ if ( n_ins > 0 )
+ FT_ARRAY_COPY( zone->org, zone->cur, zone->n_points );
+
+ /* Reset graphics state. */
+ loader->exec->GS = ((TT_Size)loader->size)->GS;
+
+ /* XXX: UNDOCUMENTED! Hinting instructions of a composite glyph */
+ /* completely refer to the (already) hinted subglyphs. */
+ if ( is_composite )
+ {
+ loader->exec->metrics.x_scale = 1 << 16;
+ loader->exec->metrics.y_scale = 1 << 16;
+
+ FT_ARRAY_COPY( zone->orus, zone->cur, zone->n_points );
+ }
+ else
+ {
+ loader->exec->metrics.x_scale =
+ ((TT_Size)loader->size)->metrics.x_scale;
+ loader->exec->metrics.y_scale =
+ ((TT_Size)loader->size)->metrics.y_scale;
+ }
+#endif
+
+ /* round pp2 and pp4 */
+ zone->cur[zone->n_points - 3].x =
+ FT_PIX_ROUND( zone->cur[zone->n_points - 3].x );
+ zone->cur[zone->n_points - 1].y =
+ FT_PIX_ROUND( zone->cur[zone->n_points - 1].y );
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+ if ( n_ins > 0 )
+ {
+ FT_Bool debug;
+ FT_Error error;
+
+ FT_GlyphLoader gloader = loader->gloader;
+ FT_Outline current_outline = gloader->current.outline;
+
+
+ error = TT_Set_CodeRange( loader->exec, tt_coderange_glyph,
+ loader->exec->glyphIns, n_ins );
+ if ( error )
+ return error;
+
+ loader->exec->is_composite = is_composite;
+ loader->exec->pts = *zone;
+
+ debug = FT_BOOL( !( loader->load_flags & FT_LOAD_NO_SCALE ) &&
+ ((TT_Size)loader->size)->debug );
+
+ error = TT_Run_Context( loader->exec, debug );
+ if ( error && loader->exec->pedantic_hinting )
+ return error;
+
+ /* store drop-out mode in bits 5-7; set bit 2 also as a marker */
+ current_outline.tags[0] |=
+ ( loader->exec->GS.scan_type << 5 ) | FT_CURVE_TAG_HAS_SCANMODE;
+ }
+
+#endif
+
+ /* save glyph phantom points */
+ if ( !loader->preserve_pps )
+ {
+ loader->pp1 = zone->cur[zone->n_points - 4];
+ loader->pp2 = zone->cur[zone->n_points - 3];
+ loader->pp3 = zone->cur[zone->n_points - 2];
+ loader->pp4 = zone->cur[zone->n_points - 1];
+ }
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 )
+ {
+ if ( loader->exec->sph_tweak_flags & SPH_TWEAK_DEEMBOLDEN )
+ FT_Outline_EmboldenXY( &loader->gloader->current.outline, -24, 0 );
+
+ else if ( loader->exec->sph_tweak_flags & SPH_TWEAK_EMBOLDEN )
+ FT_Outline_EmboldenXY( &loader->gloader->current.outline, 24, 0 );
+ }
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+ return FT_Err_Ok;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* TT_Process_Simple_Glyph */
+ /* */
+ /* <Description> */
+ /* Once a simple glyph has been loaded, it needs to be processed. */
+ /* Usually, this means scaling and hinting through bytecode */
+ /* interpretation. */
+ /* */
+ static FT_Error
+ TT_Process_Simple_Glyph( TT_Loader loader )
+ {
+ FT_GlyphLoader gloader = loader->gloader;
+ FT_Error error = FT_Err_Ok;
+ FT_Outline* outline;
+ FT_Int n_points;
+
+
+ outline = &gloader->current.outline;
+ n_points = outline->n_points;
+
+ /* set phantom points */
+
+ outline->points[n_points ] = loader->pp1;
+ outline->points[n_points + 1] = loader->pp2;
+ outline->points[n_points + 2] = loader->pp3;
+ outline->points[n_points + 3] = loader->pp4;
+
+ outline->tags[n_points ] = 0;
+ outline->tags[n_points + 1] = 0;
+ outline->tags[n_points + 2] = 0;
+ outline->tags[n_points + 3] = 0;
+
+ n_points += 4;
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+
+ if ( ((TT_Face)loader->face)->doblend )
+ {
+ /* Deltas apply to the unscaled data. */
+ FT_Vector* deltas;
+ FT_Memory memory = loader->face->memory;
+ FT_Int i;
+
+
+ error = TT_Vary_Get_Glyph_Deltas( (TT_Face)(loader->face),
+ loader->glyph_index,
+ &deltas,
+ n_points );
+ if ( error )
+ return error;
+
+ for ( i = 0; i < n_points; ++i )
+ {
+ outline->points[i].x += deltas[i].x;
+ outline->points[i].y += deltas[i].y;
+ }
+
+ FT_FREE( deltas );
+ }
+
+#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */
+
+ if ( IS_HINTED( loader->load_flags ) )
+ {
+ tt_prepare_zone( &loader->zone, &gloader->current, 0, 0 );
+
+ FT_ARRAY_COPY( loader->zone.orus, loader->zone.cur,
+ loader->zone.n_points + 4 );
+ }
+
+ {
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ TT_Face face = (TT_Face)loader->face;
+ TT_Driver driver = (TT_Driver)FT_FACE_DRIVER( face );
+
+ FT_String* family = face->root.family_name;
+ FT_Int ppem = loader->size->metrics.x_ppem;
+ FT_String* style = face->root.style_name;
+ FT_Int x_scale_factor = 1000;
+#endif
+
+ FT_Vector* vec = outline->points;
+ FT_Vector* limit = outline->points + n_points;
+
+ FT_Fixed x_scale = 0; /* pacify compiler */
+ FT_Fixed y_scale = 0;
+
+ FT_Bool do_scale = FALSE;
+
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+
+ if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 )
+ {
+ /* scale, but only if enabled and only if TT hinting is being used */
+ if ( IS_HINTED( loader->load_flags ) )
+ x_scale_factor = sph_test_tweak_x_scaling( face,
+ family,
+ ppem,
+ style,
+ loader->glyph_index );
+ /* scale the glyph */
+ if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 ||
+ x_scale_factor != 1000 )
+ {
+ x_scale = FT_MulDiv( ((TT_Size)loader->size)->metrics.x_scale,
+ x_scale_factor, 1000 );
+ y_scale = ((TT_Size)loader->size)->metrics.y_scale;
+
+ /* compensate for any scaling by de/emboldening; */
+ /* the amount was determined via experimentation */
+ if ( x_scale_factor != 1000 && ppem > 11 )
+ FT_Outline_EmboldenXY( outline,
+ FT_MulFix( 1280 * ppem,
+ 1000 - x_scale_factor ),
+ 0 );
+ do_scale = TRUE;
+ }
+ }
+ else
+
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+ {
+ /* scale the glyph */
+ if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 )
+ {
+ x_scale = ((TT_Size)loader->size)->metrics.x_scale;
+ y_scale = ((TT_Size)loader->size)->metrics.y_scale;
+
+ do_scale = TRUE;
+ }
+ }
+
+ if ( do_scale )
+ {
+ for ( ; vec < limit; vec++ )
+ {
+ vec->x = FT_MulFix( vec->x, x_scale );
+ vec->y = FT_MulFix( vec->y, y_scale );
+ }
+
+ loader->pp1 = outline->points[n_points - 4];
+ loader->pp2 = outline->points[n_points - 3];
+ loader->pp3 = outline->points[n_points - 2];
+ loader->pp4 = outline->points[n_points - 1];
+ }
+ }
+
+ /**We Disable HINT except tricky font, seem it looks better, #Testdoc:0000584_Open_CAC5U7WH.pdf,
+ 0000879_Image_MSFNUnattendedPDF.pdf,0005480_sample-barcodes print.pdf.
+ */
+
+ if ( IS_HINTED( loader->load_flags ) && (loader->face->face_flags&FT_FACE_FLAG_TRICKY))
+ {
+ loader->zone.n_points += 4;
+
+ error = TT_Hint_Glyph( loader, 0 );
+ }
+
+ return error;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* TT_Process_Composite_Component */
+ /* */
+ /* <Description> */
+ /* Once a composite component has been loaded, it needs to be */
+ /* processed. Usually, this means transforming and translating. */
+ /* */
+ static FT_Error
+ TT_Process_Composite_Component( TT_Loader loader,
+ FT_SubGlyph subglyph,
+ FT_UInt start_point,
+ FT_UInt num_base_points )
+ {
+ FT_GlyphLoader gloader = loader->gloader;
+ FT_Vector* base_vec = gloader->base.outline.points;
+ FT_UInt num_points = gloader->base.outline.n_points;
+ FT_Bool have_scale;
+ FT_Pos x, y;
+
+
+ have_scale = FT_BOOL( subglyph->flags & ( WE_HAVE_A_SCALE |
+ WE_HAVE_AN_XY_SCALE |
+ WE_HAVE_A_2X2 ) );
+
+ /* perform the transform required for this subglyph */
+ if ( have_scale )
+ {
+ FT_UInt i;
+
+
+ for ( i = num_base_points; i < num_points; i++ )
+ FT_Vector_Transform( base_vec + i, &subglyph->transform );
+ }
+
+ /* get offset */
+ if ( !( subglyph->flags & ARGS_ARE_XY_VALUES ) )
+ {
+ FT_UInt k = subglyph->arg1;
+ FT_UInt l = subglyph->arg2;
+ FT_Vector* p1;
+ FT_Vector* p2;
+
+
+ /* match l-th point of the newly loaded component to the k-th point */
+ /* of the previously loaded components. */
+
+ /* change to the point numbers used by our outline */
+ k += start_point;
+ l += num_base_points;
+ if ( k >= num_base_points ||
+ l >= num_points )
+ return FT_THROW( Invalid_Composite );
+
+ p1 = gloader->base.outline.points + k;
+ p2 = gloader->base.outline.points + l;
+
+ x = p1->x - p2->x;
+ y = p1->y - p2->y;
+ }
+ else
+ {
+ x = subglyph->arg1;
+ y = subglyph->arg2;
+
+ if ( !x && !y )
+ return FT_Err_Ok;
+
+ /* Use a default value dependent on */
+ /* TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED. This is useful for old TT */
+ /* fonts which don't set the xxx_COMPONENT_OFFSET bit. */
+
+ if ( have_scale &&
+#ifdef TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED
+ !( subglyph->flags & UNSCALED_COMPONENT_OFFSET ) )
+#else
+ ( subglyph->flags & SCALED_COMPONENT_OFFSET ) )
+#endif
+ {
+
+#if 0
+
+ /*************************************************************************/
+ /* */
+ /* This algorithm is what Apple documents. But it doesn't work. */
+ /* */
+ int a = subglyph->transform.xx > 0 ? subglyph->transform.xx
+ : -subglyph->transform.xx;
+ int b = subglyph->transform.yx > 0 ? subglyph->transform.yx
+ : -subglyph->transform.yx;
+ int c = subglyph->transform.xy > 0 ? subglyph->transform.xy
+ : -subglyph->transform.xy;
+ int d = subglyph->transform.yy > 0 ? subglyph->transform.yy
+ : -subglyph->transform.yy;
+ int m = a > b ? a : b;
+ int n = c > d ? c : d;
+
+
+ if ( a - b <= 33 && a - b >= -33 )
+ m *= 2;
+ if ( c - d <= 33 && c - d >= -33 )
+ n *= 2;
+ x = FT_MulFix( x, m );
+ y = FT_MulFix( y, n );
+
+#else /* 0 */
+
+ /*************************************************************************/
+ /* */
+ /* This algorithm is a guess and works much better than the above. */
+ /* */
+ FT_Fixed mac_xscale = FT_Hypot( subglyph->transform.xx,
+ subglyph->transform.xy );
+ FT_Fixed mac_yscale = FT_Hypot( subglyph->transform.yy,
+ subglyph->transform.yx );
+
+
+ x = FT_MulFix( x, mac_xscale );
+ y = FT_MulFix( y, mac_yscale );
+
+#endif /* 0 */
+
+ }
+
+ if ( !( loader->load_flags & FT_LOAD_NO_SCALE ) )
+ {
+ FT_Fixed x_scale = ((TT_Size)loader->size)->metrics.x_scale;
+ FT_Fixed y_scale = ((TT_Size)loader->size)->metrics.y_scale;
+
+
+ x = FT_MulFix( x, x_scale );
+ y = FT_MulFix( y, y_scale );
+
+ if ( subglyph->flags & ROUND_XY_TO_GRID )
+ {
+ x = FT_PIX_ROUND( x );
+ y = FT_PIX_ROUND( y );
+ }
+ }
+ }
+
+ if ( x || y )
+ translate_array( num_points - num_base_points,
+ base_vec + num_base_points,
+ x, y );
+
+ return FT_Err_Ok;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* TT_Process_Composite_Glyph */
+ /* */
+ /* <Description> */
+ /* This is slightly different from TT_Process_Simple_Glyph, in that */
+ /* its sole purpose is to hint the glyph. Thus this function is */
+ /* only available when bytecode interpreter is enabled. */
+ /* */
+ static FT_Error
+ TT_Process_Composite_Glyph( TT_Loader loader,
+ FT_UInt start_point,
+ FT_UInt start_contour )
+ {
+ FT_Error error;
+ FT_Outline* outline;
+ FT_UInt i;
+
+
+ outline = &loader->gloader->base.outline;
+
+ /* make room for phantom points */
+ error = FT_GLYPHLOADER_CHECK_POINTS( loader->gloader,
+ outline->n_points + 4,
+ 0 );
+ if ( error )
+ return error;
+
+ outline->points[outline->n_points ] = loader->pp1;
+ outline->points[outline->n_points + 1] = loader->pp2;
+ outline->points[outline->n_points + 2] = loader->pp3;
+ outline->points[outline->n_points + 3] = loader->pp4;
+
+ outline->tags[outline->n_points ] = 0;
+ outline->tags[outline->n_points + 1] = 0;
+ outline->tags[outline->n_points + 2] = 0;
+ outline->tags[outline->n_points + 3] = 0;
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+ {
+ FT_Stream stream = loader->stream;
+ FT_UShort n_ins, max_ins;
+ FT_ULong tmp;
+
+
+ /* TT_Load_Composite_Glyph only gives us the offset of instructions */
+ /* so we read them here */
+ if ( FT_STREAM_SEEK( loader->ins_pos ) ||
+ FT_READ_USHORT( n_ins ) )
+ return error;
+
+ FT_TRACE5(( " Instructions size = %d\n", n_ins ));
+
+ /* check it */
+ max_ins = ((TT_Face)loader->face)->max_profile.maxSizeOfInstructions;
+ if ( n_ins > max_ins )
+ {
+ /* acroread ignores this field, so we only do a rough safety check */
+ if ( (FT_Int)n_ins > loader->byte_len )
+ {
+ FT_TRACE1(( "TT_Process_Composite_Glyph: "
+ "too many instructions (%d) for glyph with length %d\n",
+ n_ins, loader->byte_len ));
+ return FT_THROW( Too_Many_Hints );
+ }
+
+ tmp = loader->exec->glyphSize;
+ error = Update_Max( loader->exec->memory,
+ &tmp,
+ sizeof ( FT_Byte ),
+ (void*)&loader->exec->glyphIns,
+ n_ins );
+ loader->exec->glyphSize = (FT_UShort)tmp;
+ if ( error )
+ return error;
+ }
+ else if ( n_ins == 0 )
+ return FT_Err_Ok;
+
+ if ( FT_STREAM_READ( loader->exec->glyphIns, n_ins ) )
+ return error;
+
+ loader->glyph->control_data = loader->exec->glyphIns;
+ loader->glyph->control_len = n_ins;
+ }
+
+#endif
+
+ tt_prepare_zone( &loader->zone, &loader->gloader->base,
+ start_point, start_contour );
+
+ /* Some points are likely touched during execution of */
+ /* instructions on components. So let's untouch them. */
+ for ( i = start_point; i < loader->zone.n_points; i++ )
+ loader->zone.tags[i] &= ~FT_CURVE_TAG_TOUCH_BOTH;
+
+ loader->zone.n_points += 4;
+
+ return TT_Hint_Glyph( loader, 1 );
+ }
+
+
+ /* Calculate the four phantom points. */
+ /* The first two stand for horizontal origin and advance. */
+ /* The last two stand for vertical origin and advance. */
+#define TT_LOADER_SET_PP( loader ) \
+ do { \
+ (loader)->pp1.x = (loader)->bbox.xMin - (loader)->left_bearing; \
+ (loader)->pp1.y = 0; \
+ (loader)->pp2.x = (loader)->pp1.x + (loader)->advance; \
+ (loader)->pp2.y = 0; \
+ (loader)->pp3.x = 0; \
+ (loader)->pp3.y = (loader)->top_bearing + (loader)->bbox.yMax; \
+ (loader)->pp4.x = 0; \
+ (loader)->pp4.y = (loader)->pp3.y - (loader)->vadvance; \
+ } while ( 0 )
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* load_truetype_glyph */
+ /* */
+ /* <Description> */
+ /* Loads a given truetype glyph. Handles composites and uses a */
+ /* TT_Loader object. */
+ /* */
+ static FT_Error
+ load_truetype_glyph( TT_Loader loader,
+ FT_UInt glyph_index,
+ FT_UInt recurse_count,
+ FT_Bool header_only )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_Fixed x_scale, y_scale;
+ FT_ULong offset;
+ TT_Face face = (TT_Face)loader->face;
+ FT_GlyphLoader gloader = loader->gloader;
+ FT_Bool opened_frame = 0;
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+ FT_Vector* deltas = NULL;
+#endif
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+ FT_StreamRec inc_stream;
+ FT_Data glyph_data;
+ FT_Bool glyph_data_loaded = 0;
+#endif
+
+
+ /* some fonts have an incorrect value of `maxComponentDepth', */
+ /* thus we allow depth 1 to catch the majority of them */
+ if ( recurse_count > 1 &&
+ recurse_count > face->max_profile.maxComponentDepth )
+ {
+ error = FT_THROW( Invalid_Composite );
+ goto Exit;
+ }
+
+ /* check glyph index */
+ if ( glyph_index >= (FT_UInt)face->root.num_glyphs )
+ {
+ error = FT_THROW( Invalid_Glyph_Index );
+ goto Exit;
+ }
+
+ loader->glyph_index = glyph_index;
+
+ if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 )
+ {
+ x_scale = ((TT_Size)loader->size)->metrics.x_scale;
+ y_scale = ((TT_Size)loader->size)->metrics.y_scale;
+ }
+ else
+ {
+ x_scale = 0x10000L;
+ y_scale = 0x10000L;
+ }
+
+ tt_get_metrics( loader, glyph_index );
+
+ /* Set `offset' to the start of the glyph relative to the start of */
+ /* the `glyf' table, and `byte_len' to the length of the glyph in */
+ /* bytes. */
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+
+ /* If we are loading glyph data via the incremental interface, set */
+ /* the loader stream to a memory stream reading the data returned */
+ /* by the interface. */
+ if ( face->root.internal->incremental_interface )
+ {
+ error = face->root.internal->incremental_interface->funcs->get_glyph_data(
+ face->root.internal->incremental_interface->object,
+ glyph_index, &glyph_data );
+ if ( error )
+ goto Exit;
+
+ glyph_data_loaded = 1;
+ offset = 0;
+ loader->byte_len = glyph_data.length;
+
+ FT_MEM_ZERO( &inc_stream, sizeof ( inc_stream ) );
+ FT_Stream_OpenMemory( &inc_stream,
+ glyph_data.pointer, glyph_data.length );
+
+ loader->stream = &inc_stream;
+ }
+ else
+
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
+
+ offset = tt_face_get_location( face, glyph_index,
+ (FT_UInt*)&loader->byte_len );
+
+ if ( loader->byte_len > 0 )
+ {
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+ /* for the incremental interface, `glyf_offset' is always zero */
+ if ( !loader->glyf_offset &&
+ !face->root.internal->incremental_interface )
+#else
+ if ( !loader->glyf_offset )
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
+ {
+ FT_TRACE2(( "no `glyf' table but non-zero `loca' entry\n" ));
+ error = FT_THROW( Invalid_Table );
+ goto Exit;
+ }
+
+ error = face->access_glyph_frame( loader, glyph_index,
+ loader->glyf_offset + offset,
+ loader->byte_len );
+ if ( error )
+ goto Exit;
+
+ opened_frame = 1;
+
+ /* read glyph header first */
+ error = face->read_glyph_header( loader );
+ if ( error || header_only )
+ goto Exit;
+ }
+
+ if ( loader->byte_len == 0 || loader->n_contours == 0 )
+ {
+ loader->bbox.xMin = 0;
+ loader->bbox.xMax = 0;
+ loader->bbox.yMin = 0;
+ loader->bbox.yMax = 0;
+
+ if ( header_only )
+ goto Exit;
+
+ /* must initialize points before (possibly) overriding */
+ /* glyph metrics from the incremental interface */
+ TT_LOADER_SET_PP( loader );
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+ tt_get_metrics_incr_overrides( loader, glyph_index );
+#endif
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+
+ if ( ((TT_Face)(loader->face))->doblend )
+ {
+ /* this must be done before scaling */
+ FT_Memory memory = loader->face->memory;
+
+
+ error = TT_Vary_Get_Glyph_Deltas( (TT_Face)(loader->face),
+ glyph_index, &deltas, 4 );
+ if ( error )
+ goto Exit;
+
+ loader->pp1.x += deltas[0].x; loader->pp1.y += deltas[0].y;
+ loader->pp2.x += deltas[1].x; loader->pp2.y += deltas[1].y;
+ loader->pp3.x += deltas[2].x; loader->pp3.y += deltas[2].y;
+ loader->pp4.x += deltas[3].x; loader->pp4.y += deltas[3].y;
+
+ FT_FREE( deltas );
+ }
+
+#endif
+
+ if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 )
+ {
+ loader->pp1.x = FT_MulFix( loader->pp1.x, x_scale );
+ loader->pp2.x = FT_MulFix( loader->pp2.x, x_scale );
+ loader->pp3.y = FT_MulFix( loader->pp3.y, y_scale );
+ loader->pp4.y = FT_MulFix( loader->pp4.y, y_scale );
+ }
+
+ error = FT_Err_Ok;
+ goto Exit;
+ }
+
+ /* must initialize points before (possibly) overriding */
+ /* glyph metrics from the incremental interface */
+ TT_LOADER_SET_PP( loader );
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+ tt_get_metrics_incr_overrides( loader, glyph_index );
+#endif
+
+ /***********************************************************************/
+ /***********************************************************************/
+ /***********************************************************************/
+
+ /* if it is a simple glyph, load it */
+
+ if ( loader->n_contours > 0 )
+ {
+ error = face->read_simple_glyph( loader );
+ if ( error )
+ goto Exit;
+
+ /* all data have been read */
+ face->forget_glyph_frame( loader );
+ opened_frame = 0;
+
+ error = TT_Process_Simple_Glyph( loader );
+ if ( error )
+ goto Exit;
+
+ FT_GlyphLoader_Add( gloader );
+ }
+
+ /***********************************************************************/
+ /***********************************************************************/
+ /***********************************************************************/
+
+ /* otherwise, load a composite! */
+ else if ( loader->n_contours == -1 )
+ {
+ FT_UInt start_point;
+ FT_UInt start_contour;
+ FT_ULong ins_pos; /* position of composite instructions, if any */
+
+
+ start_point = gloader->base.outline.n_points;
+ start_contour = gloader->base.outline.n_contours;
+
+ /* for each subglyph, read composite header */
+ error = face->read_composite_glyph( loader );
+ if ( error )
+ goto Exit;
+
+ /* store the offset of instructions */
+ ins_pos = loader->ins_pos;
+
+ /* all data we need are read */
+ face->forget_glyph_frame( loader );
+ opened_frame = 0;
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+
+ if ( face->doblend )
+ {
+ FT_Int i, limit;
+ FT_SubGlyph subglyph;
+ FT_Memory memory = face->root.memory;
+
+
+ /* this provides additional offsets */
+ /* for each component's translation */
+
+ if ( ( error = TT_Vary_Get_Glyph_Deltas(
+ face,
+ glyph_index,
+ &deltas,
+ gloader->current.num_subglyphs + 4 )) != 0 )
+ goto Exit;
+
+ subglyph = gloader->current.subglyphs + gloader->base.num_subglyphs;
+ limit = gloader->current.num_subglyphs;
+
+ for ( i = 0; i < limit; ++i, ++subglyph )
+ {
+ if ( subglyph->flags & ARGS_ARE_XY_VALUES )
+ {
+ /* XXX: overflow check for subglyph->{arg1,arg2}. */
+ /* deltas[i].{x,y} must be within signed 16-bit, */
+ /* but the restriction of summed delta is not clear */
+ subglyph->arg1 += (FT_Int16)deltas[i].x;
+ subglyph->arg2 += (FT_Int16)deltas[i].y;
+ }
+ }
+
+ loader->pp1.x += deltas[i + 0].x; loader->pp1.y += deltas[i + 0].y;
+ loader->pp2.x += deltas[i + 1].x; loader->pp2.y += deltas[i + 1].y;
+ loader->pp3.x += deltas[i + 2].x; loader->pp3.y += deltas[i + 2].y;
+ loader->pp4.x += deltas[i + 3].x; loader->pp4.y += deltas[i + 3].y;
+
+ FT_FREE( deltas );
+ }
+
+#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */
+
+ if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 )
+ {
+ loader->pp1.x = FT_MulFix( loader->pp1.x, x_scale );
+ loader->pp2.x = FT_MulFix( loader->pp2.x, x_scale );
+ loader->pp3.y = FT_MulFix( loader->pp3.y, y_scale );
+ loader->pp4.y = FT_MulFix( loader->pp4.y, y_scale );
+ }
+
+ /* if the flag FT_LOAD_NO_RECURSE is set, we return the subglyph */
+ /* `as is' in the glyph slot (the client application will be */
+ /* responsible for interpreting these data)... */
+ if ( loader->load_flags & FT_LOAD_NO_RECURSE )
+ {
+ FT_GlyphLoader_Add( gloader );
+ loader->glyph->format = FT_GLYPH_FORMAT_COMPOSITE;
+
+ goto Exit;
+ }
+
+ /*********************************************************************/
+ /*********************************************************************/
+ /*********************************************************************/
+
+ {
+ FT_UInt n, num_base_points;
+ FT_SubGlyph subglyph = 0;
+
+ FT_UInt num_points = start_point;
+ FT_UInt num_subglyphs = gloader->current.num_subglyphs;
+ FT_UInt num_base_subgs = gloader->base.num_subglyphs;
+
+ FT_Stream old_stream = loader->stream;
+ FT_Int old_byte_len = loader->byte_len;
+
+
+ FT_GlyphLoader_Add( gloader );
+
+ /* read each subglyph independently */
+ for ( n = 0; n < num_subglyphs; n++ )
+ {
+ FT_Vector pp[4];
+
+
+ /* Each time we call load_truetype_glyph in this loop, the */
+ /* value of `gloader.base.subglyphs' can change due to table */
+ /* reallocations. We thus need to recompute the subglyph */
+ /* pointer on each iteration. */
+ subglyph = gloader->base.subglyphs + num_base_subgs + n;
+
+ pp[0] = loader->pp1;
+ pp[1] = loader->pp2;
+ pp[2] = loader->pp3;
+ pp[3] = loader->pp4;
+
+ num_base_points = gloader->base.outline.n_points;
+
+ error = load_truetype_glyph( loader, subglyph->index,
+ recurse_count + 1, FALSE );
+ if ( error )
+ goto Exit;
+
+ /* restore subglyph pointer */
+ subglyph = gloader->base.subglyphs + num_base_subgs + n;
+
+ if ( !( subglyph->flags & USE_MY_METRICS ) )
+ {
+ loader->pp1 = pp[0];
+ loader->pp2 = pp[1];
+ loader->pp3 = pp[2];
+ loader->pp4 = pp[3];
+ }
+
+ num_points = gloader->base.outline.n_points;
+
+ if ( num_points == num_base_points )
+ continue;
+
+ /* gloader->base.outline consists of three parts: */
+ /* 0 -(1)-> start_point -(2)-> num_base_points -(3)-> n_points. */
+ /* */
+ /* (1): exists from the beginning */
+ /* (2): components that have been loaded so far */
+ /* (3): the newly loaded component */
+ TT_Process_Composite_Component( loader, subglyph, start_point,
+ num_base_points );
+ }
+
+ loader->stream = old_stream;
+ loader->byte_len = old_byte_len;
+
+ /* process the glyph */
+ loader->ins_pos = ins_pos;
+ if ( IS_HINTED( loader->load_flags ) &&
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+ subglyph->flags & WE_HAVE_INSTR &&
+
+#endif
+
+ num_points > start_point )
+ TT_Process_Composite_Glyph( loader, start_point, start_contour );
+
+ }
+ }
+ else
+ {
+ /* invalid composite count (negative but not -1) */
+ error = FT_THROW( Invalid_Outline );
+ goto Exit;
+ }
+
+ /***********************************************************************/
+ /***********************************************************************/
+ /***********************************************************************/
+
+ Exit:
+
+ if ( opened_frame )
+ face->forget_glyph_frame( loader );
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+
+ if ( glyph_data_loaded )
+ face->root.internal->incremental_interface->funcs->free_glyph_data(
+ face->root.internal->incremental_interface->object,
+ &glyph_data );
+
+#endif
+
+ return error;
+ }
+
+
+ static FT_Error
+ compute_glyph_metrics( TT_Loader loader,
+ FT_UInt glyph_index )
+ {
+ TT_Face face = (TT_Face)loader->face;
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ TT_Driver driver = (TT_Driver)FT_FACE_DRIVER( face );
+#endif
+
+ FT_BBox bbox;
+ FT_Fixed y_scale;
+ TT_GlyphSlot glyph = loader->glyph;
+ TT_Size size = (TT_Size)loader->size;
+
+
+ y_scale = 0x10000L;
+ if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 )
+ y_scale = size->root.metrics.y_scale;
+
+ if ( glyph->format != FT_GLYPH_FORMAT_COMPOSITE )
+ FT_Outline_Get_CBox( &glyph->outline, &bbox );
+ else
+ bbox = loader->bbox;
+
+ /* get the device-independent horizontal advance; it is scaled later */
+ /* by the base layer. */
+ glyph->linearHoriAdvance = loader->linear;
+
+ glyph->metrics.horiBearingX = bbox.xMin;
+ glyph->metrics.horiBearingY = bbox.yMax;
+ glyph->metrics.horiAdvance = loader->pp2.x - loader->pp1.x;
+
+ /* adjust advance width to the value contained in the hdmx table */
+ if ( !face->postscript.isFixedPitch &&
+ IS_HINTED( loader->load_flags ) )
+ {
+ FT_Byte* widthp;
+
+
+ widthp = tt_face_get_device_metrics( face,
+ size->root.metrics.x_ppem,
+ glyph_index );
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+
+ if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 )
+ {
+ FT_Bool ignore_x_mode;
+
+
+ ignore_x_mode = FT_BOOL( FT_LOAD_TARGET_MODE( loader->load_flags ) !=
+ FT_RENDER_MODE_MONO );
+
+ if ( widthp &&
+ ( ( ignore_x_mode && loader->exec->compatible_widths ) ||
+ !ignore_x_mode ||
+ SPH_OPTION_BITMAP_WIDTHS ) )
+ glyph->metrics.horiAdvance = *widthp << 6;
+ }
+ else
+
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+ {
+ if ( widthp )
+ glyph->metrics.horiAdvance = *widthp << 6;
+ }
+ }
+
+ /* set glyph dimensions */
+ glyph->metrics.width = bbox.xMax - bbox.xMin;
+ glyph->metrics.height = bbox.yMax - bbox.yMin;
+
+ /* Now take care of vertical metrics. In the case where there is */
+ /* no vertical information within the font (relatively common), */
+ /* create some metrics manually */
+ {
+ FT_Pos top; /* scaled vertical top side bearing */
+ FT_Pos advance; /* scaled vertical advance height */
+
+
+ /* Get the unscaled top bearing and advance height. */
+ if ( face->vertical_info &&
+ face->vertical.number_Of_VMetrics > 0 )
+ {
+ top = (FT_Short)FT_DivFix( loader->pp3.y - bbox.yMax,
+ y_scale );
+
+ if ( loader->pp3.y <= loader->pp4.y )
+ advance = 0;
+ else
+ advance = (FT_UShort)FT_DivFix( loader->pp3.y - loader->pp4.y,
+ y_scale );
+ }
+ else
+ {
+ FT_Pos height;
+
+
+ /* XXX Compute top side bearing and advance height in */
+ /* Get_VMetrics instead of here. */
+
+ /* NOTE: The OS/2 values are the only `portable' ones, */
+ /* which is why we use them, if there is an OS/2 */
+ /* table in the font. Otherwise, we use the */
+ /* values defined in the horizontal header. */
+
+ height = (FT_Short)FT_DivFix( bbox.yMax - bbox.yMin,
+ y_scale );
+ if ( face->os2.version != 0xFFFFU )
+ advance = (FT_Pos)( face->os2.sTypoAscender -
+ face->os2.sTypoDescender );
+ else
+ advance = (FT_Pos)( face->horizontal.Ascender -
+ face->horizontal.Descender );
+
+ top = ( advance - height ) / 2;
+ }
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+ {
+ FT_Incremental_InterfaceRec* incr;
+ FT_Incremental_MetricsRec metrics;
+ FT_Error error;
+
+
+ incr = face->root.internal->incremental_interface;
+
+ /* If this is an incrementally loaded font see if there are */
+ /* overriding metrics for this glyph. */
+ if ( incr && incr->funcs->get_glyph_metrics )
+ {
+ metrics.bearing_x = 0;
+ metrics.bearing_y = top;
+ metrics.advance = advance;
+
+ error = incr->funcs->get_glyph_metrics( incr->object,
+ glyph_index,
+ TRUE,
+ &metrics );
+ if ( error )
+ return error;
+
+ top = metrics.bearing_y;
+ advance = metrics.advance;
+ }
+ }
+
+ /* GWW: Do vertical metrics get loaded incrementally too? */
+
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
+
+ glyph->linearVertAdvance = advance;
+
+ /* scale the metrics */
+ if ( !( loader->load_flags & FT_LOAD_NO_SCALE ) )
+ {
+ top = FT_MulFix( top, y_scale );
+ advance = FT_MulFix( advance, y_scale );
+ }
+
+ /* XXX: for now, we have no better algorithm for the lsb, but it */
+ /* should work fine. */
+ /* */
+ glyph->metrics.vertBearingX = glyph->metrics.horiBearingX -
+ glyph->metrics.horiAdvance / 2;
+ glyph->metrics.vertBearingY = top;
+ glyph->metrics.vertAdvance = advance;
+ }
+
+ return 0;
+ }
+
+
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+
+ static FT_Error
+ load_sbit_image( TT_Size size,
+ TT_GlyphSlot glyph,
+ FT_UInt glyph_index,
+ FT_Int32 load_flags )
+ {
+ TT_Face face;
+ SFNT_Service sfnt;
+ FT_Stream stream;
+ FT_Error error;
+ TT_SBit_MetricsRec metrics;
+
+
+ face = (TT_Face)glyph->face;
+ sfnt = (SFNT_Service)face->sfnt;
+ stream = face->root.stream;
+
+ error = sfnt->load_sbit_image( face,
+ size->strike_index,
+ glyph_index,
+ (FT_Int)load_flags,
+ stream,
+ &glyph->bitmap,
+ &metrics );
+ if ( !error )
+ {
+ glyph->outline.n_points = 0;
+ glyph->outline.n_contours = 0;
+
+ glyph->metrics.width = (FT_Pos)metrics.width << 6;
+ glyph->metrics.height = (FT_Pos)metrics.height << 6;
+
+ glyph->metrics.horiBearingX = (FT_Pos)metrics.horiBearingX << 6;
+ glyph->metrics.horiBearingY = (FT_Pos)metrics.horiBearingY << 6;
+ glyph->metrics.horiAdvance = (FT_Pos)metrics.horiAdvance << 6;
+
+ glyph->metrics.vertBearingX = (FT_Pos)metrics.vertBearingX << 6;
+ glyph->metrics.vertBearingY = (FT_Pos)metrics.vertBearingY << 6;
+ glyph->metrics.vertAdvance = (FT_Pos)metrics.vertAdvance << 6;
+
+ glyph->format = FT_GLYPH_FORMAT_BITMAP;
+
+ if ( load_flags & FT_LOAD_VERTICAL_LAYOUT )
+ {
+ glyph->bitmap_left = metrics.vertBearingX;
+ glyph->bitmap_top = metrics.vertBearingY;
+ }
+ else
+ {
+ glyph->bitmap_left = metrics.horiBearingX;
+ glyph->bitmap_top = metrics.horiBearingY;
+ }
+ }
+
+ return error;
+ }
+
+#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
+
+
+ static FT_Error
+ tt_loader_init( TT_Loader loader,
+ TT_Size size,
+ TT_GlyphSlot glyph,
+ FT_Int32 load_flags,
+ FT_Bool glyf_table_only )
+ {
+ TT_Face face;
+ FT_Stream stream;
+#ifdef TT_USE_BYTECODE_INTERPRETER
+ FT_Bool pedantic = FT_BOOL( load_flags & FT_LOAD_PEDANTIC );
+#endif
+
+
+ face = (TT_Face)glyph->face;
+ stream = face->root.stream;
+
+ FT_MEM_ZERO( loader, sizeof ( TT_LoaderRec ) );
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+ /* load execution context */
+ if ( IS_HINTED( load_flags ) && !glyf_table_only )
+ {
+ TT_ExecContext exec;
+ FT_Bool grayscale;
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ TT_Driver driver = (TT_Driver)FT_FACE_DRIVER( face );
+
+ FT_Bool subpixel_hinting = FALSE;
+ FT_Bool grayscale_hinting = TRUE;
+
+#if 0
+ /* not used yet */
+ FT_Bool compatible_widths;
+ FT_Bool symmetrical_smoothing;
+ FT_Bool bgr;
+ FT_Bool subpixel_positioned;
+#endif
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+ FT_Bool reexecute = FALSE;
+
+
+ if ( !size->cvt_ready )
+ {
+ FT_Error error = tt_size_ready_bytecode( size, pedantic );
+
+
+ if ( error )
+ return error;
+ }
+
+ /* query new execution context */
+ exec = size->debug ? size->context
+ : ( (TT_Driver)FT_FACE_DRIVER( face ) )->context;
+ if ( !exec )
+ return FT_THROW( Could_Not_Find_Context );
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+
+ if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 )
+ {
+ subpixel_hinting = FT_BOOL( ( FT_LOAD_TARGET_MODE( load_flags )
+ != FT_RENDER_MODE_MONO ) &&
+ SPH_OPTION_SET_SUBPIXEL );
+
+ if ( subpixel_hinting )
+ grayscale = grayscale_hinting = FALSE;
+ else if ( SPH_OPTION_SET_GRAYSCALE )
+ {
+ grayscale = grayscale_hinting = TRUE;
+ subpixel_hinting = FALSE;
+ }
+ else
+ grayscale = grayscale_hinting = FALSE;
+
+ if ( FT_IS_TRICKY( glyph->face ) )
+ subpixel_hinting = grayscale_hinting = FALSE;
+
+ exec->ignore_x_mode = subpixel_hinting || grayscale_hinting;
+ exec->rasterizer_version = SPH_OPTION_SET_RASTERIZER_VERSION;
+ if ( exec->sph_tweak_flags & SPH_TWEAK_RASTERIZER_35 )
+ exec->rasterizer_version = TT_INTERPRETER_VERSION_35;
+
+#if 1
+ exec->compatible_widths = SPH_OPTION_SET_COMPATIBLE_WIDTHS;
+ exec->symmetrical_smoothing = FALSE;
+ exec->bgr = FALSE;
+ exec->subpixel_positioned = TRUE;
+#else /* 0 */
+ exec->compatible_widths =
+ FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) !=
+ TT_LOAD_COMPATIBLE_WIDTHS );
+ exec->symmetrical_smoothing =
+ FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) !=
+ TT_LOAD_SYMMETRICAL_SMOOTHING );
+ exec->bgr =
+ FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) !=
+ TT_LOAD_BGR );
+ exec->subpixel_positioned =
+ FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) !=
+ TT_LOAD_SUBPIXEL_POSITIONED );
+#endif /* 0 */
+
+ }
+ else
+
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+ {
+ grayscale = FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) !=
+ FT_RENDER_MODE_MONO );
+ }
+
+ TT_Load_Context( exec, face, size );
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+
+ if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 )
+ {
+ /* a change from mono to subpixel rendering (and vice versa) */
+ /* requires a re-execution of the CVT program */
+ if ( subpixel_hinting != exec->subpixel_hinting )
+ {
+ FT_TRACE4(( "tt_loader_init: subpixel hinting change,"
+ " re-executing `prep' table\n" ));
+
+ exec->subpixel_hinting = subpixel_hinting;
+ reexecute = TRUE;
+ }
+
+ /* a change from mono to grayscale rendering (and vice versa) */
+ /* requires a re-execution of the CVT program */
+ if ( grayscale != exec->grayscale_hinting )
+ {
+ FT_TRACE4(( "tt_loader_init: grayscale hinting change,"
+ " re-executing `prep' table\n" ));
+
+ exec->grayscale_hinting = grayscale_hinting;
+ reexecute = TRUE;
+ }
+ }
+ else
+
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+ {
+ /* a change from mono to grayscale rendering (and vice versa) */
+ /* requires a re-execution of the CVT program */
+ if ( grayscale != exec->grayscale )
+ {
+ FT_TRACE4(( "tt_loader_init: grayscale change,"
+ " re-executing `prep' table\n" ));
+
+ exec->grayscale = grayscale;
+ reexecute = TRUE;
+ }
+ }
+
+ if ( reexecute )
+ {
+ FT_UInt i;
+
+
+ for ( i = 0; i < size->cvt_size; i++ )
+ size->cvt[i] = FT_MulFix( face->cvt[i], size->ttmetrics.scale );
+ tt_size_run_prep( size, pedantic );
+ }
+
+ /* see whether the cvt program has disabled hinting */
+ if ( exec->GS.instruct_control & 1 )
+ load_flags |= FT_LOAD_NO_HINTING;
+
+ /* load default graphics state -- if needed */
+ if ( exec->GS.instruct_control & 2 )
+ exec->GS = tt_default_graphics_state;
+
+ exec->pedantic_hinting = FT_BOOL( load_flags & FT_LOAD_PEDANTIC );
+ loader->exec = exec;
+ loader->instructions = exec->glyphIns;
+ }
+
+#endif /* TT_USE_BYTECODE_INTERPRETER */
+
+ /* seek to the beginning of the glyph table -- for Type 42 fonts */
+ /* the table might be accessed from a Postscript stream or something */
+ /* else... */
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+
+ if ( face->root.internal->incremental_interface )
+ loader->glyf_offset = 0;
+ else
+
+#endif
+
+ {
+ FT_Error error = face->goto_table( face, TTAG_glyf, stream, 0 );
+
+
+ if ( FT_ERR_EQ( error, Table_Missing ) )
+ loader->glyf_offset = 0;
+ else if ( error )
+ {
+ FT_ERROR(( "tt_loader_init: could not access glyph table\n" ));
+ return error;
+ }
+ else
+ loader->glyf_offset = FT_STREAM_POS();
+ }
+
+ /* get face's glyph loader */
+ if ( !glyf_table_only )
+ {
+ FT_GlyphLoader gloader = glyph->internal->loader;
+
+
+ FT_GlyphLoader_Rewind( gloader );
+ loader->gloader = gloader;
+ }
+
+ loader->load_flags = load_flags;
+
+ loader->face = (FT_Face)face;
+ loader->size = (FT_Size)size;
+ loader->glyph = (FT_GlyphSlot)glyph;
+ loader->stream = stream;
+
+ return FT_Err_Ok;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* TT_Load_Glyph */
+ /* */
+ /* <Description> */
+ /* A function used to load a single glyph within a given glyph slot, */
+ /* for a given size. */
+ /* */
+ /* <Input> */
+ /* glyph :: A handle to a target slot object where the glyph */
+ /* will be loaded. */
+ /* */
+ /* size :: A handle to the source face size at which the glyph */
+ /* must be scaled/loaded. */
+ /* */
+ /* glyph_index :: The index of the glyph in the font file. */
+ /* */
+ /* load_flags :: A flag indicating what to load for this glyph. The */
+ /* FT_LOAD_XXX constants can be used to control the */
+ /* glyph loading process (e.g., whether the outline */
+ /* should be scaled, whether to load bitmaps or not, */
+ /* whether to hint the outline, etc). */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ TT_Load_Glyph( TT_Size size,
+ TT_GlyphSlot glyph,
+ FT_UInt glyph_index,
+ FT_Int32 load_flags )
+ {
+ FT_Error error;
+ TT_LoaderRec loader;
+
+
+ error = FT_Err_Ok;
+
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+
+ /* try to load embedded bitmap if any */
+ /* */
+ /* XXX: The convention should be emphasized in */
+ /* the documents because it can be confusing. */
+ if ( size->strike_index != 0xFFFFFFFFUL &&
+ ( load_flags & FT_LOAD_NO_BITMAP ) == 0 )
+ {
+ error = load_sbit_image( size, glyph, glyph_index, load_flags );
+ if ( !error )
+ {
+ if ( FT_IS_SCALABLE( glyph->face ) )
+ {
+ /* for the bbox we need the header only */
+ (void)tt_loader_init( &loader, size, glyph, load_flags, TRUE );
+ (void)load_truetype_glyph( &loader, glyph_index, 0, TRUE );
+ glyph->linearHoriAdvance = loader.linear;
+ glyph->linearVertAdvance = loader.top_bearing + loader.bbox.yMax -
+ loader.vadvance;
+
+ /* sanity check: if `horiAdvance' in the sbit metric */
+ /* structure isn't set, use `linearHoriAdvance' */
+ if ( !glyph->metrics.horiAdvance && glyph->linearHoriAdvance )
+ glyph->metrics.horiAdvance =
+ FT_MulFix( glyph->linearHoriAdvance,
+ size->root.metrics.x_scale );
+ }
+
+ return FT_Err_Ok;
+ }
+ }
+
+#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
+
+ /* if FT_LOAD_NO_SCALE is not set, `ttmetrics' must be valid */
+ if ( !( load_flags & FT_LOAD_NO_SCALE ) && !size->ttmetrics.valid )
+ return FT_THROW( Invalid_Size_Handle );
+
+ if ( load_flags & FT_LOAD_SBITS_ONLY )
+ return FT_THROW( Invalid_Argument );
+
+ error = tt_loader_init( &loader, size, glyph, load_flags, FALSE );
+ if ( error )
+ return error;
+
+ glyph->format = FT_GLYPH_FORMAT_OUTLINE;
+ glyph->num_subglyphs = 0;
+ glyph->outline.flags = 0;
+
+ /* main loading loop */
+ error = load_truetype_glyph( &loader, glyph_index, 0, FALSE );
+ if ( !error )
+ {
+ if ( glyph->format == FT_GLYPH_FORMAT_COMPOSITE )
+ {
+ glyph->num_subglyphs = loader.gloader->base.num_subglyphs;
+ glyph->subglyphs = loader.gloader->base.subglyphs;
+ }
+ else
+ {
+ glyph->outline = loader.gloader->base.outline;
+ glyph->outline.flags &= ~FT_OUTLINE_SINGLE_PASS;
+
+ /* Translate array so that (0,0) is the glyph's origin. Note */
+ /* that this behaviour is independent on the value of bit 1 of */
+ /* the `flags' field in the `head' table -- at least major */
+ /* applications like Acroread indicate that. */
+ if ( loader.pp1.x )
+ FT_Outline_Translate( &glyph->outline, -loader.pp1.x, 0 );
+ }
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+ if ( IS_HINTED( load_flags ) )
+ {
+ if ( loader.exec->GS.scan_control )
+ {
+ /* convert scan conversion mode to FT_OUTLINE_XXX flags */
+ switch ( loader.exec->GS.scan_type )
+ {
+ case 0: /* simple drop-outs including stubs */
+ glyph->outline.flags |= FT_OUTLINE_INCLUDE_STUBS;
+ break;
+ case 1: /* simple drop-outs excluding stubs */
+ /* nothing; it's the default rendering mode */
+ break;
+ case 4: /* smart drop-outs including stubs */
+ glyph->outline.flags |= FT_OUTLINE_SMART_DROPOUTS |
+ FT_OUTLINE_INCLUDE_STUBS;
+ break;
+ case 5: /* smart drop-outs excluding stubs */
+ glyph->outline.flags |= FT_OUTLINE_SMART_DROPOUTS;
+ break;
+
+ default: /* no drop-out control */
+ glyph->outline.flags |= FT_OUTLINE_IGNORE_DROPOUTS;
+ break;
+ }
+ }
+ else
+ glyph->outline.flags |= FT_OUTLINE_IGNORE_DROPOUTS;
+ }
+
+#endif /* TT_USE_BYTECODE_INTERPRETER */
+
+ compute_glyph_metrics( &loader, glyph_index );
+ }
+
+ /* Set the `high precision' bit flag. */
+ /* This is _critical_ to get correct output for monochrome */
+ /* TrueType glyphs at all sizes using the bytecode interpreter. */
+ /* */
+ if ( !( load_flags & FT_LOAD_NO_SCALE ) &&
+ size->root.metrics.y_ppem < 24 )
+ glyph->outline.flags |= FT_OUTLINE_HIGH_PRECISION;
+
+ return error;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttgload.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttgload.h
new file mode 100644
index 0000000000..aea68f8ce7
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttgload.h
@@ -0,0 +1,61 @@
+/***************************************************************************/
+/* */
+/* ttgload.h */
+/* */
+/* TrueType Glyph Loader (specification). */
+/* */
+/* Copyright 1996-2006, 2008, 2011 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __TTGLOAD_H__
+#define __TTGLOAD_H__
+
+
+#include "../../include/ft2build.h"
+#include "ttobjs.h"
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+#include "ttinterp.h"
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ FT_LOCAL( void )
+ TT_Init_Glyph_Loading( TT_Face face );
+
+ FT_LOCAL( void )
+ TT_Get_HMetrics( TT_Face face,
+ FT_UInt idx,
+ FT_Short* lsb,
+ FT_UShort* aw );
+
+ FT_LOCAL( void )
+ TT_Get_VMetrics( TT_Face face,
+ FT_UInt idx,
+ FT_Short* tsb,
+ FT_UShort* ah );
+
+ FT_LOCAL( FT_Error )
+ TT_Load_Glyph( TT_Size size,
+ TT_GlyphSlot glyph,
+ FT_UInt glyph_index,
+ FT_Int32 load_flags );
+
+
+FT_END_HEADER
+
+#endif /* __TTGLOAD_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttgxvar.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttgxvar.c
new file mode 100644
index 0000000000..559e63237a
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttgxvar.c
@@ -0,0 +1,1532 @@
+/***************************************************************************/
+/* */
+/* ttgxvar.c */
+/* */
+/* TrueType GX Font Variation loader */
+/* */
+/* Copyright 2004-2013 by */
+/* David Turner, Robert Wilhelm, Werner Lemberg, and George Williams. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* Apple documents the `fvar', `gvar', `cvar', and `avar' tables at */
+ /* */
+ /* http://developer.apple.com/fonts/TTRefMan/RM06/Chap6[fgca]var.html */
+ /* */
+ /* The documentation for `fvar' is inconsistent. At one point it says */
+ /* that `countSizePairs' should be 3, at another point 2. It should */
+ /* be 2. */
+ /* */
+ /* The documentation for `gvar' is not intelligible; `cvar' refers you */
+ /* to `gvar' and is thus also incomprehensible. */
+ /* */
+ /* The documentation for `avar' appears correct, but Apple has no fonts */
+ /* with an `avar' table, so it is hard to test. */
+ /* */
+ /* Many thanks to John Jenkins (at Apple) in figuring this out. */
+ /* */
+ /* */
+ /* Apple's `kern' table has some references to tuple indices, but as */
+ /* there is no indication where these indices are defined, nor how to */
+ /* interpolate the kerning values (different tuples have different */
+ /* classes) this issue is ignored. */
+ /* */
+ /*************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/config/ftconfig.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/internal/sfnt.h"
+#include "../../include/freetype/tttags.h"
+#include "../../include/freetype/ftmm.h"
+
+#include "ttpload.h"
+#include "ttgxvar.h"
+
+#include "tterrors.h"
+
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+
+
+#define FT_Stream_FTell( stream ) \
+ (FT_ULong)( (stream)->cursor - (stream)->base )
+#define FT_Stream_SeekSet( stream, off ) \
+ ( (stream)->cursor = (stream)->base + (off) )
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_ttgxvar
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** Internal Routines *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro ALL_POINTS is used in `ft_var_readpackedpoints'. It */
+ /* indicates that there is a delta for every point without needing to */
+ /* enumerate all of them. */
+ /* */
+
+ /* ensure that value `0' has the same width as a pointer */
+#define ALL_POINTS (FT_UShort*)~(FT_PtrDist)0
+
+
+#define GX_PT_POINTS_ARE_WORDS 0x80
+#define GX_PT_POINT_RUN_COUNT_MASK 0x7F
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* ft_var_readpackedpoints */
+ /* */
+ /* <Description> */
+ /* Read a set of points to which the following deltas will apply. */
+ /* Points are packed with a run length encoding. */
+ /* */
+ /* <Input> */
+ /* stream :: The data stream. */
+ /* */
+ /* <Output> */
+ /* point_cnt :: The number of points read. A zero value means that */
+ /* all points in the glyph will be affected, without */
+ /* enumerating them individually. */
+ /* */
+ /* <Return> */
+ /* An array of FT_UShort containing the affected points or the */
+ /* special value ALL_POINTS. */
+ /* */
+ static FT_UShort*
+ ft_var_readpackedpoints( FT_Stream stream,
+ FT_UInt *point_cnt )
+ {
+ FT_UShort *points = NULL;
+ FT_Int n;
+ FT_Int runcnt;
+ FT_Int i;
+ FT_Int j;
+ FT_Int first;
+ FT_Memory memory = stream->memory;
+ FT_Error error = FT_Err_Ok;
+
+ FT_UNUSED( error );
+
+
+ *point_cnt = n = FT_GET_BYTE();
+ if ( n == 0 )
+ return ALL_POINTS;
+
+ if ( n & GX_PT_POINTS_ARE_WORDS )
+ n = FT_GET_BYTE() | ( ( n & GX_PT_POINT_RUN_COUNT_MASK ) << 8 );
+
+ if ( FT_NEW_ARRAY( points, n ) )
+ return NULL;
+
+ i = 0;
+ while ( i < n )
+ {
+ runcnt = FT_GET_BYTE();
+ if ( runcnt & GX_PT_POINTS_ARE_WORDS )
+ {
+ runcnt = runcnt & GX_PT_POINT_RUN_COUNT_MASK;
+ first = points[i++] = FT_GET_USHORT();
+
+ if ( runcnt < 1 || i + runcnt >= n )
+ goto Exit;
+
+ /* first point not included in runcount */
+ for ( j = 0; j < runcnt; ++j )
+ points[i++] = (FT_UShort)( first += FT_GET_USHORT() );
+ }
+ else
+ {
+ first = points[i++] = FT_GET_BYTE();
+
+ if ( runcnt < 1 || i + runcnt >= n )
+ goto Exit;
+
+ for ( j = 0; j < runcnt; ++j )
+ points[i++] = (FT_UShort)( first += FT_GET_BYTE() );
+ }
+ }
+
+ Exit:
+ return points;
+ }
+
+
+ enum
+ {
+ GX_DT_DELTAS_ARE_ZERO = 0x80,
+ GX_DT_DELTAS_ARE_WORDS = 0x40,
+ GX_DT_DELTA_RUN_COUNT_MASK = 0x3F
+ };
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* ft_var_readpackeddeltas */
+ /* */
+ /* <Description> */
+ /* Read a set of deltas. These are packed slightly differently than */
+ /* points. In particular there is no overall count. */
+ /* */
+ /* <Input> */
+ /* stream :: The data stream. */
+ /* */
+ /* delta_cnt :: The number of to be read. */
+ /* */
+ /* <Return> */
+ /* An array of FT_Short containing the deltas for the affected */
+ /* points. (This only gets the deltas for one dimension. It will */
+ /* generally be called twice, once for x, once for y. When used in */
+ /* cvt table, it will only be called once.) */
+ /* */
+ static FT_Short*
+ ft_var_readpackeddeltas( FT_Stream stream,
+ FT_Offset delta_cnt )
+ {
+ FT_Short *deltas = NULL;
+ FT_UInt runcnt;
+ FT_Offset i;
+ FT_UInt j;
+ FT_Memory memory = stream->memory;
+ FT_Error error = FT_Err_Ok;
+
+ FT_UNUSED( error );
+
+
+ if ( FT_NEW_ARRAY( deltas, delta_cnt ) )
+ return NULL;
+
+ i = 0;
+ while ( i < delta_cnt )
+ {
+ runcnt = FT_GET_BYTE();
+ if ( runcnt & GX_DT_DELTAS_ARE_ZERO )
+ {
+ /* runcnt zeroes get added */
+ for ( j = 0;
+ j <= ( runcnt & GX_DT_DELTA_RUN_COUNT_MASK ) && i < delta_cnt;
+ ++j )
+ deltas[i++] = 0;
+ }
+ else if ( runcnt & GX_DT_DELTAS_ARE_WORDS )
+ {
+ /* runcnt shorts from the stack */
+ for ( j = 0;
+ j <= ( runcnt & GX_DT_DELTA_RUN_COUNT_MASK ) && i < delta_cnt;
+ ++j )
+ deltas[i++] = FT_GET_SHORT();
+ }
+ else
+ {
+ /* runcnt signed bytes from the stack */
+ for ( j = 0;
+ j <= ( runcnt & GX_DT_DELTA_RUN_COUNT_MASK ) && i < delta_cnt;
+ ++j )
+ deltas[i++] = FT_GET_CHAR();
+ }
+
+ if ( j <= ( runcnt & GX_DT_DELTA_RUN_COUNT_MASK ) )
+ {
+ /* Bad format */
+ FT_FREE( deltas );
+ return NULL;
+ }
+ }
+
+ return deltas;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* ft_var_load_avar */
+ /* */
+ /* <Description> */
+ /* Parse the `avar' table if present. It need not be, so we return */
+ /* nothing. */
+ /* */
+ /* <InOut> */
+ /* face :: The font face. */
+ /* */
+ static void
+ ft_var_load_avar( TT_Face face )
+ {
+ FT_Stream stream = FT_FACE_STREAM(face);
+ FT_Memory memory = stream->memory;
+ GX_Blend blend = face->blend;
+ GX_AVarSegment segment;
+ FT_Error error = FT_Err_Ok;
+ FT_ULong version;
+ FT_Long axisCount;
+ FT_Int i, j;
+ FT_ULong table_len;
+
+ FT_UNUSED( error );
+
+
+ blend->avar_checked = TRUE;
+ if ( (error = face->goto_table( face, TTAG_avar, stream, &table_len )) != 0 )
+ return;
+
+ if ( FT_FRAME_ENTER( table_len ) )
+ return;
+
+ version = FT_GET_LONG();
+ axisCount = FT_GET_LONG();
+
+ if ( version != 0x00010000L ||
+ axisCount != (FT_Long)blend->mmvar->num_axis )
+ goto Exit;
+
+ if ( FT_NEW_ARRAY( blend->avar_segment, axisCount ) )
+ goto Exit;
+
+ segment = &blend->avar_segment[0];
+ for ( i = 0; i < axisCount; ++i, ++segment )
+ {
+ segment->pairCount = FT_GET_USHORT();
+ if ( FT_NEW_ARRAY( segment->correspondence, segment->pairCount ) )
+ {
+ /* Failure. Free everything we have done so far. We must do */
+ /* it right now since loading the `avar' table is optional. */
+
+ for ( j = i - 1; j >= 0; --j )
+ FT_FREE( blend->avar_segment[j].correspondence );
+
+ FT_FREE( blend->avar_segment );
+ blend->avar_segment = NULL;
+ goto Exit;
+ }
+
+ for ( j = 0; j < segment->pairCount; ++j )
+ {
+ segment->correspondence[j].fromCoord =
+ FT_GET_SHORT() << 2; /* convert to Fixed */
+ segment->correspondence[j].toCoord =
+ FT_GET_SHORT()<<2; /* convert to Fixed */
+ }
+ }
+
+ Exit:
+ FT_FRAME_EXIT();
+ }
+
+
+ typedef struct GX_GVar_Head_
+ {
+ FT_Long version;
+ FT_UShort axisCount;
+ FT_UShort globalCoordCount;
+ FT_ULong offsetToCoord;
+ FT_UShort glyphCount;
+ FT_UShort flags;
+ FT_ULong offsetToData;
+
+ } GX_GVar_Head;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* ft_var_load_gvar */
+ /* */
+ /* <Description> */
+ /* Parses the `gvar' table if present. If `fvar' is there, `gvar' */
+ /* had better be there too. */
+ /* */
+ /* <InOut> */
+ /* face :: The font face. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ static FT_Error
+ ft_var_load_gvar( TT_Face face )
+ {
+ FT_Stream stream = FT_FACE_STREAM(face);
+ FT_Memory memory = stream->memory;
+ GX_Blend blend = face->blend;
+ FT_Error error;
+ FT_UInt i, j;
+ FT_ULong table_len;
+ FT_ULong gvar_start;
+ FT_ULong offsetToData;
+ GX_GVar_Head gvar_head;
+
+ static const FT_Frame_Field gvar_fields[] =
+ {
+
+#undef FT_STRUCTURE
+#define FT_STRUCTURE GX_GVar_Head
+
+ FT_FRAME_START( 20 ),
+ FT_FRAME_LONG ( version ),
+ FT_FRAME_USHORT( axisCount ),
+ FT_FRAME_USHORT( globalCoordCount ),
+ FT_FRAME_ULONG ( offsetToCoord ),
+ FT_FRAME_USHORT( glyphCount ),
+ FT_FRAME_USHORT( flags ),
+ FT_FRAME_ULONG ( offsetToData ),
+ FT_FRAME_END
+ };
+
+ if ( (error = face->goto_table( face, TTAG_gvar, stream, &table_len )) != 0 )
+ goto Exit;
+
+ gvar_start = FT_STREAM_POS( );
+ if ( FT_STREAM_READ_FIELDS( gvar_fields, &gvar_head ) )
+ goto Exit;
+
+ blend->tuplecount = gvar_head.globalCoordCount;
+ blend->gv_glyphcnt = gvar_head.glyphCount;
+ offsetToData = gvar_start + gvar_head.offsetToData;
+
+ if ( gvar_head.version != (FT_Long)0x00010000L ||
+ gvar_head.axisCount != (FT_UShort)blend->mmvar->num_axis )
+ {
+ error = FT_THROW( Invalid_Table );
+ goto Exit;
+ }
+
+ if ( FT_NEW_ARRAY( blend->glyphoffsets, blend->gv_glyphcnt + 1 ) )
+ goto Exit;
+
+ if ( gvar_head.flags & 1 )
+ {
+ /* long offsets (one more offset than glyphs, to mark size of last) */
+ if ( FT_FRAME_ENTER( ( blend->gv_glyphcnt + 1 ) * 4L ) )
+ goto Exit;
+
+ for ( i = 0; i <= blend->gv_glyphcnt; ++i )
+ blend->glyphoffsets[i] = offsetToData + FT_GET_LONG();
+
+ FT_FRAME_EXIT();
+ }
+ else
+ {
+ /* short offsets (one more offset than glyphs, to mark size of last) */
+ if ( FT_FRAME_ENTER( ( blend->gv_glyphcnt + 1 ) * 2L ) )
+ goto Exit;
+
+ for ( i = 0; i <= blend->gv_glyphcnt; ++i )
+ blend->glyphoffsets[i] = offsetToData + FT_GET_USHORT() * 2;
+ /* XXX: Undocumented: `*2'! */
+
+ FT_FRAME_EXIT();
+ }
+
+ if ( blend->tuplecount != 0 )
+ {
+ if ( FT_NEW_ARRAY( blend->tuplecoords,
+ gvar_head.axisCount * blend->tuplecount ) )
+ goto Exit;
+
+ if ( FT_STREAM_SEEK( gvar_start + gvar_head.offsetToCoord ) ||
+ FT_FRAME_ENTER( blend->tuplecount * gvar_head.axisCount * 2L ) )
+ goto Exit;
+
+ for ( i = 0; i < blend->tuplecount; ++i )
+ for ( j = 0 ; j < (FT_UInt)gvar_head.axisCount; ++j )
+ blend->tuplecoords[i * gvar_head.axisCount + j] =
+ FT_GET_SHORT() << 2; /* convert to FT_Fixed */
+
+ FT_FRAME_EXIT();
+ }
+
+ Exit:
+ return error;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* ft_var_apply_tuple */
+ /* */
+ /* <Description> */
+ /* Figure out whether a given tuple (design) applies to the current */
+ /* blend, and if so, what is the scaling factor. */
+ /* */
+ /* <Input> */
+ /* blend :: The current blend of the font. */
+ /* */
+ /* tupleIndex :: A flag saying whether this is an intermediate */
+ /* tuple or not. */
+ /* */
+ /* tuple_coords :: The coordinates of the tuple in normalized axis */
+ /* units. */
+ /* */
+ /* im_start_coords :: The initial coordinates where this tuple starts */
+ /* to apply (for intermediate coordinates). */
+ /* */
+ /* im_end_coords :: The final coordinates after which this tuple no */
+ /* longer applies (for intermediate coordinates). */
+ /* */
+ /* <Return> */
+ /* An FT_Fixed value containing the scaling factor. */
+ /* */
+ static FT_Fixed
+ ft_var_apply_tuple( GX_Blend blend,
+ FT_UShort tupleIndex,
+ FT_Fixed* tuple_coords,
+ FT_Fixed* im_start_coords,
+ FT_Fixed* im_end_coords )
+ {
+ FT_UInt i;
+ FT_Fixed apply = 0x10000L;
+
+
+ for ( i = 0; i < blend->num_axis; ++i )
+ {
+ if ( tuple_coords[i] == 0 )
+ /* It's not clear why (for intermediate tuples) we don't need */
+ /* to check against start/end -- the documentation says we don't. */
+ /* Similarly, it's unclear why we don't need to scale along the */
+ /* axis. */
+ continue;
+
+ else if ( blend->normalizedcoords[i] == 0 ||
+ ( blend->normalizedcoords[i] < 0 && tuple_coords[i] > 0 ) ||
+ ( blend->normalizedcoords[i] > 0 && tuple_coords[i] < 0 ) )
+ {
+ apply = 0;
+ break;
+ }
+
+ else if ( !( tupleIndex & GX_TI_INTERMEDIATE_TUPLE ) )
+ /* not an intermediate tuple */
+ apply = FT_MulFix( apply,
+ blend->normalizedcoords[i] > 0
+ ? blend->normalizedcoords[i]
+ : -blend->normalizedcoords[i] );
+
+ else if ( blend->normalizedcoords[i] <= im_start_coords[i] ||
+ blend->normalizedcoords[i] >= im_end_coords[i] )
+ {
+ apply = 0;
+ break;
+ }
+
+ else if ( blend->normalizedcoords[i] < tuple_coords[i] )
+ apply = FT_MulDiv( apply,
+ blend->normalizedcoords[i] - im_start_coords[i],
+ tuple_coords[i] - im_start_coords[i] );
+
+ else
+ apply = FT_MulDiv( apply,
+ im_end_coords[i] - blend->normalizedcoords[i],
+ im_end_coords[i] - tuple_coords[i] );
+ }
+
+ return apply;
+ }
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** MULTIPLE MASTERS SERVICE FUNCTIONS *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ typedef struct GX_FVar_Head_
+ {
+ FT_Long version;
+ FT_UShort offsetToData;
+ FT_UShort countSizePairs;
+ FT_UShort axisCount;
+ FT_UShort axisSize;
+ FT_UShort instanceCount;
+ FT_UShort instanceSize;
+
+ } GX_FVar_Head;
+
+
+ typedef struct fvar_axis_
+ {
+ FT_ULong axisTag;
+ FT_ULong minValue;
+ FT_ULong defaultValue;
+ FT_ULong maxValue;
+ FT_UShort flags;
+ FT_UShort nameID;
+
+ } GX_FVar_Axis;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* TT_Get_MM_Var */
+ /* */
+ /* <Description> */
+ /* Check that the font's `fvar' table is valid, parse it, and return */
+ /* those data. */
+ /* */
+ /* <InOut> */
+ /* face :: The font face. */
+ /* TT_Get_MM_Var initializes the blend structure. */
+ /* */
+ /* <Output> */
+ /* master :: The `fvar' data (must be freed by caller). */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ TT_Get_MM_Var( TT_Face face,
+ FT_MM_Var* *master )
+ {
+ FT_Stream stream = face->root.stream;
+ FT_Memory memory = face->root.memory;
+ FT_ULong table_len;
+ FT_Error error = FT_Err_Ok;
+ FT_ULong fvar_start;
+ FT_Int i, j;
+ FT_MM_Var* mmvar = NULL;
+ FT_Fixed* next_coords;
+ FT_String* next_name;
+ FT_Var_Axis* a;
+ FT_Var_Named_Style* ns;
+ GX_FVar_Head fvar_head;
+
+ static const FT_Frame_Field fvar_fields[] =
+ {
+
+#undef FT_STRUCTURE
+#define FT_STRUCTURE GX_FVar_Head
+
+ FT_FRAME_START( 16 ),
+ FT_FRAME_LONG ( version ),
+ FT_FRAME_USHORT( offsetToData ),
+ FT_FRAME_USHORT( countSizePairs ),
+ FT_FRAME_USHORT( axisCount ),
+ FT_FRAME_USHORT( axisSize ),
+ FT_FRAME_USHORT( instanceCount ),
+ FT_FRAME_USHORT( instanceSize ),
+ FT_FRAME_END
+ };
+
+ static const FT_Frame_Field fvaraxis_fields[] =
+ {
+
+#undef FT_STRUCTURE
+#define FT_STRUCTURE GX_FVar_Axis
+
+ FT_FRAME_START( 20 ),
+ FT_FRAME_ULONG ( axisTag ),
+ FT_FRAME_ULONG ( minValue ),
+ FT_FRAME_ULONG ( defaultValue ),
+ FT_FRAME_ULONG ( maxValue ),
+ FT_FRAME_USHORT( flags ),
+ FT_FRAME_USHORT( nameID ),
+ FT_FRAME_END
+ };
+
+
+ if ( face->blend == NULL )
+ {
+ /* both `fvar' and `gvar' must be present */
+ if ( (error = face->goto_table( face, TTAG_gvar,
+ stream, &table_len )) != 0 )
+ goto Exit;
+
+ if ( (error = face->goto_table( face, TTAG_fvar,
+ stream, &table_len )) != 0 )
+ goto Exit;
+
+ fvar_start = FT_STREAM_POS( );
+
+ if ( FT_STREAM_READ_FIELDS( fvar_fields, &fvar_head ) )
+ goto Exit;
+
+ if ( fvar_head.version != (FT_Long)0x00010000L ||
+ fvar_head.countSizePairs != 2 ||
+ fvar_head.axisSize != 20 ||
+ /* axisCount limit implied by 16-bit instanceSize */
+ fvar_head.axisCount > 0x3FFE ||
+ fvar_head.instanceSize != 4 + 4 * fvar_head.axisCount ||
+ /* instanceCount limit implied by limited range of name IDs */
+ fvar_head.instanceCount > 0x7EFF ||
+ fvar_head.offsetToData + fvar_head.axisCount * 20U +
+ fvar_head.instanceCount * fvar_head.instanceSize > table_len )
+ {
+ error = FT_THROW( Invalid_Table );
+ goto Exit;
+ }
+
+ if ( FT_NEW( face->blend ) )
+ goto Exit;
+
+ /* cannot overflow 32-bit arithmetic because of limits above */
+ face->blend->mmvar_len =
+ sizeof ( FT_MM_Var ) +
+ fvar_head.axisCount * sizeof ( FT_Var_Axis ) +
+ fvar_head.instanceCount * sizeof ( FT_Var_Named_Style ) +
+ fvar_head.instanceCount * fvar_head.axisCount * sizeof ( FT_Fixed ) +
+ 5 * fvar_head.axisCount;
+
+ if ( FT_ALLOC( mmvar, face->blend->mmvar_len ) )
+ goto Exit;
+ face->blend->mmvar = mmvar;
+
+ mmvar->num_axis =
+ fvar_head.axisCount;
+ mmvar->num_designs =
+ ~0U; /* meaningless in this context; each glyph */
+ /* may have a different number of designs */
+ /* (or tuples, as called by Apple) */
+ mmvar->num_namedstyles =
+ fvar_head.instanceCount;
+ mmvar->axis =
+ (FT_Var_Axis*)&(mmvar[1]);
+ mmvar->namedstyle =
+ (FT_Var_Named_Style*)&(mmvar->axis[fvar_head.axisCount]);
+
+ next_coords =
+ (FT_Fixed*)&(mmvar->namedstyle[fvar_head.instanceCount]);
+ for ( i = 0; i < fvar_head.instanceCount; ++i )
+ {
+ mmvar->namedstyle[i].coords = next_coords;
+ next_coords += fvar_head.axisCount;
+ }
+
+ next_name = (FT_String*)next_coords;
+ for ( i = 0; i < fvar_head.axisCount; ++i )
+ {
+ mmvar->axis[i].name = next_name;
+ next_name += 5;
+ }
+
+ if ( FT_STREAM_SEEK( fvar_start + fvar_head.offsetToData ) )
+ goto Exit;
+
+ a = mmvar->axis;
+ for ( i = 0; i < fvar_head.axisCount; ++i )
+ {
+ GX_FVar_Axis axis_rec;
+
+
+ if ( FT_STREAM_READ_FIELDS( fvaraxis_fields, &axis_rec ) )
+ goto Exit;
+ a->tag = axis_rec.axisTag;
+ a->minimum = axis_rec.minValue; /* A Fixed */
+ a->def = axis_rec.defaultValue; /* A Fixed */
+ a->maximum = axis_rec.maxValue; /* A Fixed */
+ a->strid = axis_rec.nameID;
+
+ a->name[0] = (FT_String)( a->tag >> 24 );
+ a->name[1] = (FT_String)( ( a->tag >> 16 ) & 0xFF );
+ a->name[2] = (FT_String)( ( a->tag >> 8 ) & 0xFF );
+ a->name[3] = (FT_String)( ( a->tag ) & 0xFF );
+ a->name[4] = 0;
+
+ ++a;
+ }
+
+ ns = mmvar->namedstyle;
+ for ( i = 0; i < fvar_head.instanceCount; ++i, ++ns )
+ {
+ if ( FT_FRAME_ENTER( 4L + 4L * fvar_head.axisCount ) )
+ goto Exit;
+
+ ns->strid = FT_GET_USHORT();
+ (void) /* flags = */ FT_GET_USHORT();
+
+ for ( j = 0; j < fvar_head.axisCount; ++j )
+ ns->coords[j] = FT_GET_ULONG(); /* A Fixed */
+
+ FT_FRAME_EXIT();
+ }
+ }
+
+ if ( master != NULL )
+ {
+ FT_UInt n;
+
+
+ if ( FT_ALLOC( mmvar, face->blend->mmvar_len ) )
+ goto Exit;
+ FT_MEM_COPY( mmvar, face->blend->mmvar, face->blend->mmvar_len );
+
+ mmvar->axis =
+ (FT_Var_Axis*)&(mmvar[1]);
+ mmvar->namedstyle =
+ (FT_Var_Named_Style*)&(mmvar->axis[mmvar->num_axis]);
+ next_coords =
+ (FT_Fixed*)&(mmvar->namedstyle[mmvar->num_namedstyles]);
+
+ for ( n = 0; n < mmvar->num_namedstyles; ++n )
+ {
+ mmvar->namedstyle[n].coords = next_coords;
+ next_coords += mmvar->num_axis;
+ }
+
+ a = mmvar->axis;
+ next_name = (FT_String*)next_coords;
+ for ( n = 0; n < mmvar->num_axis; ++n )
+ {
+ a->name = next_name;
+
+ /* standard PostScript names for some standard apple tags */
+ if ( a->tag == TTAG_wght )
+ a->name = (char *)"Weight";
+ else if ( a->tag == TTAG_wdth )
+ a->name = (char *)"Width";
+ else if ( a->tag == TTAG_opsz )
+ a->name = (char *)"OpticalSize";
+ else if ( a->tag == TTAG_slnt )
+ a->name = (char *)"Slant";
+
+ next_name += 5;
+ ++a;
+ }
+
+ *master = mmvar;
+ }
+
+ Exit:
+ return error;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* TT_Set_MM_Blend */
+ /* */
+ /* <Description> */
+ /* Set the blend (normalized) coordinates for this instance of the */
+ /* font. Check that the `gvar' table is reasonable and does some */
+ /* initial preparation. */
+ /* */
+ /* <InOut> */
+ /* face :: The font. */
+ /* Initialize the blend structure with `gvar' data. */
+ /* */
+ /* <Input> */
+ /* num_coords :: Must be the axis count of the font. */
+ /* */
+ /* coords :: An array of num_coords, each between [-1,1]. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ TT_Set_MM_Blend( TT_Face face,
+ FT_UInt num_coords,
+ FT_Fixed* coords )
+ {
+ FT_Error error = FT_Err_Ok;
+ GX_Blend blend;
+ FT_MM_Var* mmvar;
+ FT_UInt i;
+ FT_Memory memory = face->root.memory;
+
+ enum
+ {
+ mcvt_retain,
+ mcvt_modify,
+ mcvt_load
+
+ } manageCvt;
+
+
+ face->doblend = FALSE;
+
+ if ( face->blend == NULL )
+ {
+ if ( (error = TT_Get_MM_Var( face, NULL)) != 0 )
+ goto Exit;
+ }
+
+ blend = face->blend;
+ mmvar = blend->mmvar;
+
+ if ( num_coords != mmvar->num_axis )
+ {
+ error = FT_THROW( Invalid_Argument );
+ goto Exit;
+ }
+
+ for ( i = 0; i < num_coords; ++i )
+ if ( coords[i] < -0x00010000L || coords[i] > 0x00010000L )
+ {
+ error = FT_THROW( Invalid_Argument );
+ goto Exit;
+ }
+
+ if ( blend->glyphoffsets == NULL )
+ if ( (error = ft_var_load_gvar( face )) != 0 )
+ goto Exit;
+
+ if ( blend->normalizedcoords == NULL )
+ {
+ if ( FT_NEW_ARRAY( blend->normalizedcoords, num_coords ) )
+ goto Exit;
+
+ manageCvt = mcvt_modify;
+
+ /* If we have not set the blend coordinates before this, then the */
+ /* cvt table will still be what we read from the `cvt ' table and */
+ /* we don't need to reload it. We may need to change it though... */
+ }
+ else
+ {
+ manageCvt = mcvt_retain;
+ for ( i = 0; i < num_coords; ++i )
+ {
+ if ( blend->normalizedcoords[i] != coords[i] )
+ {
+ manageCvt = mcvt_load;
+ break;
+ }
+ }
+
+ /* If we don't change the blend coords then we don't need to do */
+ /* anything to the cvt table. It will be correct. Otherwise we */
+ /* no longer have the original cvt (it was modified when we set */
+ /* the blend last time), so we must reload and then modify it. */
+ }
+
+ blend->num_axis = num_coords;
+ FT_MEM_COPY( blend->normalizedcoords,
+ coords,
+ num_coords * sizeof ( FT_Fixed ) );
+
+ face->doblend = TRUE;
+
+ if ( face->cvt != NULL )
+ {
+ switch ( manageCvt )
+ {
+ case mcvt_load:
+ /* The cvt table has been loaded already; every time we change the */
+ /* blend we may need to reload and remodify the cvt table. */
+ FT_FREE( face->cvt );
+ face->cvt = NULL;
+
+ tt_face_load_cvt( face, face->root.stream );
+ break;
+
+ case mcvt_modify:
+ /* The original cvt table is in memory. All we need to do is */
+ /* apply the `cvar' table (if any). */
+ tt_face_vary_cvt( face, face->root.stream );
+ break;
+
+ case mcvt_retain:
+ /* The cvt table is correct for this set of coordinates. */
+ break;
+ }
+ }
+
+ Exit:
+ return error;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* TT_Set_Var_Design */
+ /* */
+ /* <Description> */
+ /* Set the coordinates for the instance, measured in the user */
+ /* coordinate system. Parse the `avar' table (if present) to convert */
+ /* from user to normalized coordinates. */
+ /* */
+ /* <InOut> */
+ /* face :: The font face. */
+ /* Initialize the blend struct with `gvar' data. */
+ /* */
+ /* <Input> */
+ /* num_coords :: This must be the axis count of the font. */
+ /* */
+ /* coords :: A coordinate array with `num_coords' elements. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ TT_Set_Var_Design( TT_Face face,
+ FT_UInt num_coords,
+ FT_Fixed* coords )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_Fixed* normalized = NULL;
+ GX_Blend blend;
+ FT_MM_Var* mmvar;
+ FT_UInt i, j;
+ FT_Var_Axis* a;
+ GX_AVarSegment av;
+ FT_Memory memory = face->root.memory;
+
+
+ if ( face->blend == NULL )
+ {
+ if ( (error = TT_Get_MM_Var( face, NULL )) != 0 )
+ goto Exit;
+ }
+
+ blend = face->blend;
+ mmvar = blend->mmvar;
+
+ if ( num_coords != mmvar->num_axis )
+ {
+ error = FT_THROW( Invalid_Argument );
+ goto Exit;
+ }
+
+ /* Axis normalization is a two stage process. First we normalize */
+ /* based on the [min,def,max] values for the axis to be [-1,0,1]. */
+ /* Then, if there's an `avar' table, we renormalize this range. */
+
+ if ( FT_NEW_ARRAY( normalized, mmvar->num_axis ) )
+ goto Exit;
+
+ a = mmvar->axis;
+ for ( i = 0; i < mmvar->num_axis; ++i, ++a )
+ {
+ if ( coords[i] > a->maximum || coords[i] < a->minimum )
+ {
+ error = FT_THROW( Invalid_Argument );
+ goto Exit;
+ }
+
+ if ( coords[i] < a->def )
+ normalized[i] = -FT_DivFix( coords[i] - a->def, a->minimum - a->def );
+ else if ( a->maximum == a->def )
+ normalized[i] = 0;
+ else
+ normalized[i] = FT_DivFix( coords[i] - a->def, a->maximum - a->def );
+ }
+
+ if ( !blend->avar_checked )
+ ft_var_load_avar( face );
+
+ if ( blend->avar_segment != NULL )
+ {
+ av = blend->avar_segment;
+ for ( i = 0; i < mmvar->num_axis; ++i, ++av )
+ {
+ for ( j = 1; j < (FT_UInt)av->pairCount; ++j )
+ if ( normalized[i] < av->correspondence[j].fromCoord )
+ {
+ normalized[i] =
+ FT_MulDiv( normalized[i] - av->correspondence[j - 1].fromCoord,
+ av->correspondence[j].toCoord -
+ av->correspondence[j - 1].toCoord,
+ av->correspondence[j].fromCoord -
+ av->correspondence[j - 1].fromCoord ) +
+ av->correspondence[j - 1].toCoord;
+ break;
+ }
+ }
+ }
+
+ error = TT_Set_MM_Blend( face, num_coords, normalized );
+
+ Exit:
+ FT_FREE( normalized );
+ return error;
+ }
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** GX VAR PARSING ROUTINES *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_face_vary_cvt */
+ /* */
+ /* <Description> */
+ /* Modify the loaded cvt table according to the `cvar' table and the */
+ /* font's blend. */
+ /* */
+ /* <InOut> */
+ /* face :: A handle to the target face object. */
+ /* */
+ /* <Input> */
+ /* stream :: A handle to the input stream. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ /* Most errors are ignored. It is perfectly valid not to have a */
+ /* `cvar' table even if there is a `gvar' and `fvar' table. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ tt_face_vary_cvt( TT_Face face,
+ FT_Stream stream )
+ {
+ FT_Error error;
+ FT_Memory memory = stream->memory;
+ FT_ULong table_start;
+ FT_ULong table_len;
+ FT_UInt tupleCount;
+ FT_ULong offsetToData;
+ FT_ULong here;
+ FT_UInt i, j;
+ FT_Fixed* tuple_coords = NULL;
+ FT_Fixed* im_start_coords = NULL;
+ FT_Fixed* im_end_coords = NULL;
+ GX_Blend blend = face->blend;
+ FT_UInt point_count;
+ FT_UShort* localpoints;
+ FT_Short* deltas;
+
+
+ FT_TRACE2(( "CVAR " ));
+
+ if ( blend == NULL )
+ {
+ FT_TRACE2(( "tt_face_vary_cvt: no blend specified\n" ));
+
+ error = FT_Err_Ok;
+ goto Exit;
+ }
+
+ if ( face->cvt == NULL )
+ {
+ FT_TRACE2(( "tt_face_vary_cvt: no `cvt ' table\n" ));
+
+ error = FT_Err_Ok;
+ goto Exit;
+ }
+
+ error = face->goto_table( face, TTAG_cvar, stream, &table_len );
+ if ( error )
+ {
+ FT_TRACE2(( "is missing\n" ));
+
+ error = FT_Err_Ok;
+ goto Exit;
+ }
+
+ if ( FT_FRAME_ENTER( table_len ) )
+ {
+ error = FT_Err_Ok;
+ goto Exit;
+ }
+
+ table_start = FT_Stream_FTell( stream );
+ if ( FT_GET_LONG() != 0x00010000L )
+ {
+ FT_TRACE2(( "bad table version\n" ));
+
+ error = FT_Err_Ok;
+ goto FExit;
+ }
+
+ if ( FT_NEW_ARRAY( tuple_coords, blend->num_axis ) ||
+ FT_NEW_ARRAY( im_start_coords, blend->num_axis ) ||
+ FT_NEW_ARRAY( im_end_coords, blend->num_axis ) )
+ goto FExit;
+
+ tupleCount = FT_GET_USHORT();
+ offsetToData = table_start + FT_GET_USHORT();
+
+ /* The documentation implies there are flags packed into the */
+ /* tuplecount, but John Jenkins says that shared points don't apply */
+ /* to `cvar', and no other flags are defined. */
+
+ for ( i = 0; i < ( tupleCount & 0xFFF ); ++i )
+ {
+ FT_UInt tupleDataSize;
+ FT_UInt tupleIndex;
+ FT_Fixed apply;
+
+
+ tupleDataSize = FT_GET_USHORT();
+ tupleIndex = FT_GET_USHORT();
+
+ /* There is no provision here for a global tuple coordinate section, */
+ /* so John says. There are no tuple indices, just embedded tuples. */
+
+ if ( tupleIndex & GX_TI_EMBEDDED_TUPLE_COORD )
+ {
+ for ( j = 0; j < blend->num_axis; ++j )
+ tuple_coords[j] = FT_GET_SHORT() << 2; /* convert from */
+ /* short frac to fixed */
+ }
+ else
+ {
+ /* skip this tuple; it makes no sense */
+
+ if ( tupleIndex & GX_TI_INTERMEDIATE_TUPLE )
+ for ( j = 0; j < 2 * blend->num_axis; ++j )
+ (void)FT_GET_SHORT();
+
+ offsetToData += tupleDataSize;
+ continue;
+ }
+
+ if ( tupleIndex & GX_TI_INTERMEDIATE_TUPLE )
+ {
+ for ( j = 0; j < blend->num_axis; ++j )
+ im_start_coords[j] = FT_GET_SHORT() << 2;
+ for ( j = 0; j < blend->num_axis; ++j )
+ im_end_coords[j] = FT_GET_SHORT() << 2;
+ }
+
+ apply = ft_var_apply_tuple( blend,
+ (FT_UShort)tupleIndex,
+ tuple_coords,
+ im_start_coords,
+ im_end_coords );
+ if ( /* tuple isn't active for our blend */
+ apply == 0 ||
+ /* global points not allowed, */
+ /* if they aren't local, makes no sense */
+ !( tupleIndex & GX_TI_PRIVATE_POINT_NUMBERS ) )
+ {
+ offsetToData += tupleDataSize;
+ continue;
+ }
+
+ here = FT_Stream_FTell( stream );
+
+ FT_Stream_SeekSet( stream, offsetToData );
+
+ localpoints = ft_var_readpackedpoints( stream, &point_count );
+ deltas = ft_var_readpackeddeltas( stream,
+ point_count == 0 ? face->cvt_size
+ : point_count );
+ if ( localpoints == NULL || deltas == NULL )
+ /* failure, ignore it */;
+
+ else if ( localpoints == ALL_POINTS )
+ {
+ /* this means that there are deltas for every entry in cvt */
+ for ( j = 0; j < face->cvt_size; ++j )
+ face->cvt[j] = (FT_Short)( face->cvt[j] +
+ FT_MulFix( deltas[j], apply ) );
+ }
+
+ else
+ {
+ for ( j = 0; j < point_count; ++j )
+ {
+ int pindex = localpoints[j];
+
+ face->cvt[pindex] = (FT_Short)( face->cvt[pindex] +
+ FT_MulFix( deltas[j], apply ) );
+ }
+ }
+
+ if ( localpoints != ALL_POINTS )
+ FT_FREE( localpoints );
+ FT_FREE( deltas );
+
+ offsetToData += tupleDataSize;
+
+ FT_Stream_SeekSet( stream, here );
+ }
+
+ FExit:
+ FT_FRAME_EXIT();
+
+ Exit:
+ FT_FREE( tuple_coords );
+ FT_FREE( im_start_coords );
+ FT_FREE( im_end_coords );
+
+ return error;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* TT_Vary_Get_Glyph_Deltas */
+ /* */
+ /* <Description> */
+ /* Load the appropriate deltas for the current glyph. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the target face object. */
+ /* */
+ /* glyph_index :: The index of the glyph being modified. */
+ /* */
+ /* n_points :: The number of the points in the glyph, including */
+ /* phantom points. */
+ /* */
+ /* <Output> */
+ /* deltas :: The array of points to change. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ TT_Vary_Get_Glyph_Deltas( TT_Face face,
+ FT_UInt glyph_index,
+ FT_Vector* *deltas,
+ FT_UInt n_points )
+ {
+ FT_Stream stream = face->root.stream;
+ FT_Memory memory = stream->memory;
+ GX_Blend blend = face->blend;
+ FT_Vector* delta_xy = NULL;
+
+ FT_Error error;
+ FT_ULong glyph_start;
+ FT_UInt tupleCount;
+ FT_ULong offsetToData;
+ FT_ULong here;
+ FT_UInt i, j;
+ FT_Fixed* tuple_coords = NULL;
+ FT_Fixed* im_start_coords = NULL;
+ FT_Fixed* im_end_coords = NULL;
+ FT_UInt point_count, spoint_count = 0;
+ FT_UShort* sharedpoints = NULL;
+ FT_UShort* localpoints = NULL;
+ FT_UShort* points;
+ FT_Short *deltas_x, *deltas_y;
+
+
+ if ( !face->doblend || blend == NULL )
+ return FT_THROW( Invalid_Argument );
+
+ /* to be freed by the caller */
+ if ( FT_NEW_ARRAY( delta_xy, n_points ) )
+ goto Exit;
+ *deltas = delta_xy;
+
+ if ( glyph_index >= blend->gv_glyphcnt ||
+ blend->glyphoffsets[glyph_index] ==
+ blend->glyphoffsets[glyph_index + 1] )
+ return FT_Err_Ok; /* no variation data for this glyph */
+
+ if ( FT_STREAM_SEEK( blend->glyphoffsets[glyph_index] ) ||
+ FT_FRAME_ENTER( blend->glyphoffsets[glyph_index + 1] -
+ blend->glyphoffsets[glyph_index] ) )
+ goto Fail1;
+
+ glyph_start = FT_Stream_FTell( stream );
+
+ /* each set of glyph variation data is formatted similarly to `cvar' */
+ /* (except we get shared points and global tuples) */
+
+ if ( FT_NEW_ARRAY( tuple_coords, blend->num_axis ) ||
+ FT_NEW_ARRAY( im_start_coords, blend->num_axis ) ||
+ FT_NEW_ARRAY( im_end_coords, blend->num_axis ) )
+ goto Fail2;
+
+ tupleCount = FT_GET_USHORT();
+ offsetToData = glyph_start + FT_GET_USHORT();
+
+ if ( tupleCount & GX_TC_TUPLES_SHARE_POINT_NUMBERS )
+ {
+ here = FT_Stream_FTell( stream );
+
+ FT_Stream_SeekSet( stream, offsetToData );
+
+ sharedpoints = ft_var_readpackedpoints( stream, &spoint_count );
+ offsetToData = FT_Stream_FTell( stream );
+
+ FT_Stream_SeekSet( stream, here );
+ }
+
+ for ( i = 0; i < ( tupleCount & GX_TC_TUPLE_COUNT_MASK ); ++i )
+ {
+ FT_UInt tupleDataSize;
+ FT_UInt tupleIndex;
+ FT_Fixed apply;
+
+
+ tupleDataSize = FT_GET_USHORT();
+ tupleIndex = FT_GET_USHORT();
+
+ if ( tupleIndex & GX_TI_EMBEDDED_TUPLE_COORD )
+ {
+ for ( j = 0; j < blend->num_axis; ++j )
+ tuple_coords[j] = FT_GET_SHORT() << 2; /* convert from */
+ /* short frac to fixed */
+ }
+ else if ( ( tupleIndex & GX_TI_TUPLE_INDEX_MASK ) >= blend->tuplecount )
+ {
+ error = FT_THROW( Invalid_Table );
+ goto Fail3;
+ }
+ else
+ {
+ FT_MEM_COPY(
+ tuple_coords,
+ &blend->tuplecoords[(tupleIndex & 0xFFF) * blend->num_axis],
+ blend->num_axis * sizeof ( FT_Fixed ) );
+ }
+
+ if ( tupleIndex & GX_TI_INTERMEDIATE_TUPLE )
+ {
+ for ( j = 0; j < blend->num_axis; ++j )
+ im_start_coords[j] = FT_GET_SHORT() << 2;
+ for ( j = 0; j < blend->num_axis; ++j )
+ im_end_coords[j] = FT_GET_SHORT() << 2;
+ }
+
+ apply = ft_var_apply_tuple( blend,
+ (FT_UShort)tupleIndex,
+ tuple_coords,
+ im_start_coords,
+ im_end_coords );
+
+ if ( apply == 0 ) /* tuple isn't active for our blend */
+ {
+ offsetToData += tupleDataSize;
+ continue;
+ }
+
+ here = FT_Stream_FTell( stream );
+
+ if ( tupleIndex & GX_TI_PRIVATE_POINT_NUMBERS )
+ {
+ FT_Stream_SeekSet( stream, offsetToData );
+
+ localpoints = ft_var_readpackedpoints( stream, &point_count );
+ points = localpoints;
+ }
+ else
+ {
+ points = sharedpoints;
+ point_count = spoint_count;
+ }
+
+ deltas_x = ft_var_readpackeddeltas( stream,
+ point_count == 0 ? n_points
+ : point_count );
+ deltas_y = ft_var_readpackeddeltas( stream,
+ point_count == 0 ? n_points
+ : point_count );
+
+ if ( points == NULL || deltas_y == NULL || deltas_x == NULL )
+ ; /* failure, ignore it */
+
+ else if ( points == ALL_POINTS )
+ {
+ /* this means that there are deltas for every point in the glyph */
+ for ( j = 0; j < n_points; ++j )
+ {
+ delta_xy[j].x += FT_MulFix( deltas_x[j], apply );
+ delta_xy[j].y += FT_MulFix( deltas_y[j], apply );
+ }
+ }
+
+ else
+ {
+ for ( j = 0; j < point_count; ++j )
+ {
+ if ( localpoints[j] >= n_points )
+ continue;
+
+ delta_xy[localpoints[j]].x += FT_MulFix( deltas_x[j], apply );
+ delta_xy[localpoints[j]].y += FT_MulFix( deltas_y[j], apply );
+ }
+ }
+
+ if ( localpoints != ALL_POINTS )
+ FT_FREE( localpoints );
+ FT_FREE( deltas_x );
+ FT_FREE( deltas_y );
+
+ offsetToData += tupleDataSize;
+
+ FT_Stream_SeekSet( stream, here );
+ }
+
+ Fail3:
+ FT_FREE( tuple_coords );
+ FT_FREE( im_start_coords );
+ FT_FREE( im_end_coords );
+
+ Fail2:
+ FT_FRAME_EXIT();
+
+ Fail1:
+ if ( error )
+ {
+ FT_FREE( delta_xy );
+ *deltas = NULL;
+ }
+
+ Exit:
+ return error;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_done_blend */
+ /* */
+ /* <Description> */
+ /* Frees the blend internal data structure. */
+ /* */
+ FT_LOCAL_DEF( void )
+ tt_done_blend( FT_Memory memory,
+ GX_Blend blend )
+ {
+ if ( blend != NULL )
+ {
+ FT_UInt i;
+
+
+ FT_FREE( blend->normalizedcoords );
+ FT_FREE( blend->mmvar );
+
+ if ( blend->avar_segment != NULL )
+ {
+ for ( i = 0; i < blend->num_axis; ++i )
+ FT_FREE( blend->avar_segment[i].correspondence );
+ FT_FREE( blend->avar_segment );
+ }
+
+ FT_FREE( blend->tuplecoords );
+ FT_FREE( blend->glyphoffsets );
+ FT_FREE( blend );
+ }
+ }
+
+#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttgxvar.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttgxvar.h
new file mode 100644
index 0000000000..72fe953e93
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttgxvar.h
@@ -0,0 +1,182 @@
+/***************************************************************************/
+/* */
+/* ttgxvar.h */
+/* */
+/* TrueType GX Font Variation loader (specification) */
+/* */
+/* Copyright 2004 by */
+/* David Turner, Robert Wilhelm, Werner Lemberg and George Williams. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __TTGXVAR_H__
+#define __TTGXVAR_H__
+
+
+#include "../../include/ft2build.h"
+#include "ttobjs.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* GX_AVarCorrespondenceRec */
+ /* */
+ /* <Description> */
+ /* A data structure representing `shortFracCorrespondence' in `avar' */
+ /* table according to the specifications from Apple. */
+ /* */
+ typedef struct GX_AVarCorrespondenceRec_
+ {
+ FT_Fixed fromCoord;
+ FT_Fixed toCoord;
+
+ } GX_AVarCorrespondenceRec_, *GX_AVarCorrespondence;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* GX_AVarRec */
+ /* */
+ /* <Description> */
+ /* Data from the segment field of `avar' table. */
+ /* There is one of these for each axis. */
+ /* */
+ typedef struct GX_AVarSegmentRec_
+ {
+ FT_UShort pairCount;
+ GX_AVarCorrespondence correspondence; /* array with pairCount entries */
+
+ } GX_AVarSegmentRec, *GX_AVarSegment;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* GX_BlendRec */
+ /* */
+ /* <Description> */
+ /* Data for interpolating a font from a distortable font specified */
+ /* by the GX *var tables ([fgca]var). */
+ /* */
+ /* <Fields> */
+ /* num_axis :: The number of axes along which interpolation */
+ /* may happen */
+ /* */
+ /* normalizedcoords :: A normalized value (between [-1,1]) indicating */
+ /* the contribution along each axis to the final */
+ /* interpolated font. */
+ /* */
+ typedef struct GX_BlendRec_
+ {
+ FT_UInt num_axis;
+ FT_Fixed* normalizedcoords;
+
+ FT_MM_Var* mmvar;
+ FT_Offset mmvar_len;
+
+ FT_Bool avar_checked;
+ GX_AVarSegment avar_segment;
+
+ FT_UInt tuplecount; /* shared tuples in `gvar' */
+ FT_Fixed* tuplecoords; /* tuplecoords[tuplecount][num_axis] */
+
+ FT_UInt gv_glyphcnt;
+ FT_ULong* glyphoffsets;
+
+ } GX_BlendRec;
+
+
+ /*************************************************************************/
+ /* */
+ /* <enum> */
+ /* GX_TupleCountFlags */
+ /* */
+ /* <Description> */
+ /* Flags used within the `TupleCount' field of the `gvar' table. */
+ /* */
+ typedef enum GX_TupleCountFlags_
+ {
+ GX_TC_TUPLES_SHARE_POINT_NUMBERS = 0x8000,
+ GX_TC_RESERVED_TUPLE_FLAGS = 0x7000,
+ GX_TC_TUPLE_COUNT_MASK = 0x0FFF
+
+ } GX_TupleCountFlags;
+
+
+ /*************************************************************************/
+ /* */
+ /* <enum> */
+ /* GX_TupleIndexFlags */
+ /* */
+ /* <Description> */
+ /* Flags used within the `TupleIndex' field of the `gvar' and `cvar' */
+ /* tables. */
+ /* */
+ typedef enum GX_TupleIndexFlags_
+ {
+ GX_TI_EMBEDDED_TUPLE_COORD = 0x8000,
+ GX_TI_INTERMEDIATE_TUPLE = 0x4000,
+ GX_TI_PRIVATE_POINT_NUMBERS = 0x2000,
+ GX_TI_RESERVED_TUPLE_FLAG = 0x1000,
+ GX_TI_TUPLE_INDEX_MASK = 0x0FFF
+
+ } GX_TupleIndexFlags;
+
+
+#define TTAG_wght FT_MAKE_TAG( 'w', 'g', 'h', 't' )
+#define TTAG_wdth FT_MAKE_TAG( 'w', 'd', 't', 'h' )
+#define TTAG_opsz FT_MAKE_TAG( 'o', 'p', 's', 'z' )
+#define TTAG_slnt FT_MAKE_TAG( 's', 'l', 'n', 't' )
+
+
+ FT_LOCAL( FT_Error )
+ TT_Set_MM_Blend( TT_Face face,
+ FT_UInt num_coords,
+ FT_Fixed* coords );
+
+ FT_LOCAL( FT_Error )
+ TT_Set_Var_Design( TT_Face face,
+ FT_UInt num_coords,
+ FT_Fixed* coords );
+
+ FT_LOCAL( FT_Error )
+ TT_Get_MM_Var( TT_Face face,
+ FT_MM_Var* *master );
+
+
+ FT_LOCAL( FT_Error )
+ tt_face_vary_cvt( TT_Face face,
+ FT_Stream stream );
+
+
+ FT_LOCAL( FT_Error )
+ TT_Vary_Get_Glyph_Deltas( TT_Face face,
+ FT_UInt glyph_index,
+ FT_Vector* *deltas,
+ FT_UInt n_points );
+
+
+ FT_LOCAL( void )
+ tt_done_blend( FT_Memory memory,
+ GX_Blend blend );
+
+
+FT_END_HEADER
+
+
+#endif /* __TTGXVAR_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttinterp.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttinterp.c
new file mode 100644
index 0000000000..b7d2b62b3d
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttinterp.c
@@ -0,0 +1,8952 @@
+/***************************************************************************/
+/* */
+/* ttinterp.c */
+/* */
+/* TrueType bytecode interpreter (body). */
+/* */
+/* Copyright 1996-2013 */
+/* by David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+/* Greg Hitchcock from Microsoft has helped a lot in resolving unclear */
+/* issues; many thanks! */
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftcalc.h"
+#include "../../include/freetype/fttrigon.h"
+#include "../../include/freetype/ftsystem.h"
+#include "../../include/freetype/ftttdrv.h"
+
+#include "ttinterp.h"
+#include "tterrors.h"
+#include "ttsubpix.h"
+
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_ttinterp
+
+ /*************************************************************************/
+ /* */
+ /* In order to detect infinite loops in the code, we set up a counter */
+ /* within the run loop. A single stroke of interpretation is now */
+ /* limited to a maximum number of opcodes defined below. */
+ /* */
+#define MAX_RUNNABLE_OPCODES 1000000L
+
+
+ /*************************************************************************/
+ /* */
+ /* There are two kinds of implementations: */
+ /* */
+ /* a. static implementation */
+ /* */
+ /* The current execution context is a static variable, which fields */
+ /* are accessed directly by the interpreter during execution. The */
+ /* context is named `cur'. */
+ /* */
+ /* This version is non-reentrant, of course. */
+ /* */
+ /* b. indirect implementation */
+ /* */
+ /* The current execution context is passed to _each_ function as its */
+ /* first argument, and each field is thus accessed indirectly. */
+ /* */
+ /* This version is fully re-entrant. */
+ /* */
+ /* The idea is that an indirect implementation may be slower to execute */
+ /* on low-end processors that are used in some systems (like 386s or */
+ /* even 486s). */
+ /* */
+ /* As a consequence, the indirect implementation is now the default, as */
+ /* its performance costs can be considered negligible in our context. */
+ /* Note, however, that we kept the same source with macros because: */
+ /* */
+ /* - The code is kept very close in design to the Pascal code used for */
+ /* development. */
+ /* */
+ /* - It's much more readable that way! */
+ /* */
+ /* - It's still open to experimentation and tuning. */
+ /* */
+ /*************************************************************************/
+
+
+#ifndef TT_CONFIG_OPTION_STATIC_INTERPRETER /* indirect implementation */
+
+#define CUR (*exc) /* see ttobjs.h */
+
+ /*************************************************************************/
+ /* */
+ /* This macro is used whenever `exec' is unused in a function, to avoid */
+ /* stupid warnings from pedantic compilers. */
+ /* */
+#define FT_UNUSED_EXEC FT_UNUSED( exc )
+
+#else /* static implementation */
+
+#define CUR cur
+
+#define FT_UNUSED_EXEC int __dummy = __dummy
+
+ static
+ TT_ExecContextRec cur; /* static exec. context variable */
+
+ /* apparently, we have a _lot_ of direct indexing when accessing */
+ /* the static `cur', which makes the code bigger (due to all the */
+ /* four bytes addresses). */
+
+#endif /* TT_CONFIG_OPTION_STATIC_INTERPRETER */
+
+
+ /*************************************************************************/
+ /* */
+ /* The instruction argument stack. */
+ /* */
+#define INS_ARG EXEC_OP_ FT_Long* args /* see ttobjs.h for EXEC_OP_ */
+
+
+ /*************************************************************************/
+ /* */
+ /* This macro is used whenever `args' is unused in a function, to avoid */
+ /* stupid warnings from pedantic compilers. */
+ /* */
+#define FT_UNUSED_ARG FT_UNUSED_EXEC; FT_UNUSED( args )
+
+
+#define SUBPIXEL_HINTING \
+ ( ((TT_Driver)FT_FACE_DRIVER( CUR.face ))->interpreter_version == \
+ TT_INTERPRETER_VERSION_38 )
+
+
+ /*************************************************************************/
+ /* */
+ /* The following macros hide the use of EXEC_ARG and EXEC_ARG_ to */
+ /* increase readability of the code. */
+ /* */
+ /*************************************************************************/
+
+
+#define SKIP_Code() \
+ SkipCode( EXEC_ARG )
+
+#define GET_ShortIns() \
+ GetShortIns( EXEC_ARG )
+
+#define NORMalize( x, y, v ) \
+ Normalize( EXEC_ARG_ x, y, v )
+
+#define SET_SuperRound( scale, flags ) \
+ SetSuperRound( EXEC_ARG_ scale, flags )
+
+#define ROUND_None( d, c ) \
+ Round_None( EXEC_ARG_ d, c )
+
+#define INS_Goto_CodeRange( range, ip ) \
+ Ins_Goto_CodeRange( EXEC_ARG_ range, ip )
+
+#define CUR_Func_move( z, p, d ) \
+ CUR.func_move( EXEC_ARG_ z, p, d )
+
+#define CUR_Func_move_orig( z, p, d ) \
+ CUR.func_move_orig( EXEC_ARG_ z, p, d )
+
+#define CUR_Func_round( d, c ) \
+ CUR.func_round( EXEC_ARG_ d, c )
+
+#define CUR_Func_read_cvt( index ) \
+ CUR.func_read_cvt( EXEC_ARG_ index )
+
+#define CUR_Func_write_cvt( index, val ) \
+ CUR.func_write_cvt( EXEC_ARG_ index, val )
+
+#define CUR_Func_move_cvt( index, val ) \
+ CUR.func_move_cvt( EXEC_ARG_ index, val )
+
+#define CURRENT_Ratio() \
+ Current_Ratio( EXEC_ARG )
+
+#define CURRENT_Ppem() \
+ Current_Ppem( EXEC_ARG )
+
+#define CUR_Ppem() \
+ Cur_PPEM( EXEC_ARG )
+
+#define INS_SxVTL( a, b, c, d ) \
+ Ins_SxVTL( EXEC_ARG_ a, b, c, d )
+
+#define COMPUTE_Funcs() \
+ Compute_Funcs( EXEC_ARG )
+
+#define COMPUTE_Round( a ) \
+ Compute_Round( EXEC_ARG_ a )
+
+#define COMPUTE_Point_Displacement( a, b, c, d ) \
+ Compute_Point_Displacement( EXEC_ARG_ a, b, c, d )
+
+#define MOVE_Zp2_Point( a, b, c, t ) \
+ Move_Zp2_Point( EXEC_ARG_ a, b, c, t )
+
+
+#define CUR_Func_project( v1, v2 ) \
+ CUR.func_project( EXEC_ARG_ (v1)->x - (v2)->x, (v1)->y - (v2)->y )
+
+#define CUR_Func_dualproj( v1, v2 ) \
+ CUR.func_dualproj( EXEC_ARG_ (v1)->x - (v2)->x, (v1)->y - (v2)->y )
+
+#define CUR_fast_project( v ) \
+ CUR.func_project( EXEC_ARG_ (v)->x, (v)->y )
+
+#define CUR_fast_dualproj( v ) \
+ CUR.func_dualproj( EXEC_ARG_ (v)->x, (v)->y )
+
+
+ /*************************************************************************/
+ /* */
+ /* Instruction dispatch function, as used by the interpreter. */
+ /* */
+ typedef void (*TInstruction_Function)( INS_ARG );
+
+
+ /*************************************************************************/
+ /* */
+ /* Two simple bounds-checking macros. */
+ /* */
+#define BOUNDS( x, n ) ( (FT_UInt)(x) >= (FT_UInt)(n) )
+#define BOUNDSL( x, n ) ( (FT_ULong)(x) >= (FT_ULong)(n) )
+
+ /*************************************************************************/
+ /* */
+ /* This macro computes (a*2^14)/b and complements TT_MulFix14. */
+ /* */
+#define TT_DivFix14( a, b ) \
+ FT_DivFix( a, (b) << 2 )
+
+
+#undef SUCCESS
+#define SUCCESS 0
+
+#undef FAILURE
+#define FAILURE 1
+
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+#define GUESS_VECTOR( V ) \
+ if ( CUR.face->unpatented_hinting ) \
+ { \
+ CUR.GS.V.x = (FT_F2Dot14)( CUR.GS.both_x_axis ? 0x4000 : 0 ); \
+ CUR.GS.V.y = (FT_F2Dot14)( CUR.GS.both_x_axis ? 0 : 0x4000 ); \
+ }
+#else
+#define GUESS_VECTOR( V )
+#endif
+
+ /*************************************************************************/
+ /* */
+ /* CODERANGE FUNCTIONS */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* TT_Goto_CodeRange */
+ /* */
+ /* <Description> */
+ /* Switches to a new code range (updates the code related elements in */
+ /* `exec', and `IP'). */
+ /* */
+ /* <Input> */
+ /* range :: The new execution code range. */
+ /* */
+ /* IP :: The new IP in the new code range. */
+ /* */
+ /* <InOut> */
+ /* exec :: The target execution context. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ TT_Goto_CodeRange( TT_ExecContext exec,
+ FT_Int range,
+ FT_Long IP )
+ {
+ TT_CodeRange* coderange;
+
+
+ FT_ASSERT( range >= 1 && range <= 3 );
+
+ coderange = &exec->codeRangeTable[range - 1];
+
+ FT_ASSERT( coderange->base != NULL );
+
+ /* NOTE: Because the last instruction of a program may be a CALL */
+ /* which will return to the first byte *after* the code */
+ /* range, we test for IP <= Size instead of IP < Size. */
+ /* */
+ FT_ASSERT( (FT_ULong)IP <= coderange->size );
+
+ exec->code = coderange->base;
+ exec->codeSize = coderange->size;
+ exec->IP = IP;
+ exec->curRange = range;
+
+ return FT_Err_Ok;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* TT_Set_CodeRange */
+ /* */
+ /* <Description> */
+ /* Sets a code range. */
+ /* */
+ /* <Input> */
+ /* range :: The code range index. */
+ /* */
+ /* base :: The new code base. */
+ /* */
+ /* length :: The range size in bytes. */
+ /* */
+ /* <InOut> */
+ /* exec :: The target execution context. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ TT_Set_CodeRange( TT_ExecContext exec,
+ FT_Int range,
+ void* base,
+ FT_Long length )
+ {
+ FT_ASSERT( range >= 1 && range <= 3 );
+
+ exec->codeRangeTable[range - 1].base = (FT_Byte*)base;
+ exec->codeRangeTable[range - 1].size = length;
+
+ return FT_Err_Ok;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* TT_Clear_CodeRange */
+ /* */
+ /* <Description> */
+ /* Clears a code range. */
+ /* */
+ /* <Input> */
+ /* range :: The code range index. */
+ /* */
+ /* <InOut> */
+ /* exec :: The target execution context. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ /* <Note> */
+ /* Does not set the Error variable. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ TT_Clear_CodeRange( TT_ExecContext exec,
+ FT_Int range )
+ {
+ FT_ASSERT( range >= 1 && range <= 3 );
+
+ exec->codeRangeTable[range - 1].base = NULL;
+ exec->codeRangeTable[range - 1].size = 0;
+
+ return FT_Err_Ok;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* EXECUTION CONTEXT ROUTINES */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* TT_Done_Context */
+ /* */
+ /* <Description> */
+ /* Destroys a given context. */
+ /* */
+ /* <Input> */
+ /* exec :: A handle to the target execution context. */
+ /* */
+ /* memory :: A handle to the parent memory object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ /* <Note> */
+ /* Only the glyph loader and debugger should call this function. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ TT_Done_Context( TT_ExecContext exec )
+ {
+ FT_Memory memory = exec->memory;
+
+
+ /* points zone */
+ exec->maxPoints = 0;
+ exec->maxContours = 0;
+
+ /* free stack */
+ FT_FREE( exec->stack );
+ exec->stackSize = 0;
+
+ /* free call stack */
+ FT_FREE( exec->callStack );
+ exec->callSize = 0;
+ exec->callTop = 0;
+
+ /* free glyph code range */
+ FT_FREE( exec->glyphIns );
+ exec->glyphSize = 0;
+
+ exec->size = NULL;
+ exec->face = NULL;
+
+ FT_FREE( exec );
+
+ return FT_Err_Ok;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Init_Context */
+ /* */
+ /* <Description> */
+ /* Initializes a context object. */
+ /* */
+ /* <Input> */
+ /* memory :: A handle to the parent memory object. */
+ /* */
+ /* <InOut> */
+ /* exec :: A handle to the target execution context. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ static FT_Error
+ Init_Context( TT_ExecContext exec,
+ FT_Memory memory )
+ {
+ FT_Error error;
+
+
+ FT_TRACE1(( "Init_Context: new object at 0x%08p\n", exec ));
+
+ exec->memory = memory;
+ exec->callSize = 32;
+
+ if ( FT_NEW_ARRAY( exec->callStack, exec->callSize ) )
+ goto Fail_Memory;
+
+ /* all values in the context are set to 0 already, but this is */
+ /* here as a remainder */
+ exec->maxPoints = 0;
+ exec->maxContours = 0;
+
+ exec->stackSize = 0;
+ exec->glyphSize = 0;
+
+ exec->stack = NULL;
+ exec->glyphIns = NULL;
+
+ exec->face = NULL;
+ exec->size = NULL;
+
+ return FT_Err_Ok;
+
+ Fail_Memory:
+ FT_ERROR(( "Init_Context: not enough memory for %p\n", exec ));
+ TT_Done_Context( exec );
+
+ return error;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Update_Max */
+ /* */
+ /* <Description> */
+ /* Checks the size of a buffer and reallocates it if necessary. */
+ /* */
+ /* <Input> */
+ /* memory :: A handle to the parent memory object. */
+ /* */
+ /* multiplier :: The size in bytes of each element in the buffer. */
+ /* */
+ /* new_max :: The new capacity (size) of the buffer. */
+ /* */
+ /* <InOut> */
+ /* size :: The address of the buffer's current size expressed */
+ /* in elements. */
+ /* */
+ /* buff :: The address of the buffer base pointer. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ Update_Max( FT_Memory memory,
+ FT_ULong* size,
+ FT_Long multiplier,
+ void* _pbuff,
+ FT_ULong new_max )
+ {
+ FT_Error error;
+ void** pbuff = (void**)_pbuff;
+
+
+ if ( *size < new_max )
+ {
+ if ( FT_REALLOC( *pbuff, *size * multiplier, new_max * multiplier ) )
+ return error;
+ *size = new_max;
+ }
+
+ return FT_Err_Ok;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* TT_Load_Context */
+ /* */
+ /* <Description> */
+ /* Prepare an execution context for glyph hinting. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the source face object. */
+ /* */
+ /* size :: A handle to the source size object. */
+ /* */
+ /* <InOut> */
+ /* exec :: A handle to the target execution context. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ /* <Note> */
+ /* Only the glyph loader and debugger should call this function. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ TT_Load_Context( TT_ExecContext exec,
+ TT_Face face,
+ TT_Size size )
+ {
+ FT_Int i;
+ FT_ULong tmp;
+ TT_MaxProfile* maxp;
+ FT_Error error;
+
+
+ exec->face = face;
+ maxp = &face->max_profile;
+ exec->size = size;
+
+ if ( size )
+ {
+ exec->numFDefs = size->num_function_defs;
+ exec->maxFDefs = size->max_function_defs;
+ exec->numIDefs = size->num_instruction_defs;
+ exec->maxIDefs = size->max_instruction_defs;
+ exec->FDefs = size->function_defs;
+ exec->IDefs = size->instruction_defs;
+ exec->tt_metrics = size->ttmetrics;
+ exec->metrics = size->metrics;
+
+ exec->maxFunc = size->max_func;
+ exec->maxIns = size->max_ins;
+
+ for ( i = 0; i < TT_MAX_CODE_RANGES; i++ )
+ exec->codeRangeTable[i] = size->codeRangeTable[i];
+
+ /* set graphics state */
+ exec->GS = size->GS;
+
+ exec->cvtSize = size->cvt_size;
+ exec->cvt = size->cvt;
+
+ exec->storeSize = size->storage_size;
+ exec->storage = size->storage;
+
+ exec->twilight = size->twilight;
+
+ /* In case of multi-threading it can happen that the old size object */
+ /* no longer exists, thus we must clear all glyph zone references. */
+ ft_memset( &exec->zp0, 0, sizeof ( exec->zp0 ) );
+ exec->zp1 = exec->zp0;
+ exec->zp2 = exec->zp0;
+ }
+
+ /* XXX: We reserve a little more elements on the stack to deal safely */
+ /* with broken fonts like arialbs, courbs, timesbs, etc. */
+ tmp = exec->stackSize;
+ error = Update_Max( exec->memory,
+ &tmp,
+ sizeof ( FT_F26Dot6 ),
+ (void*)&exec->stack,
+ maxp->maxStackElements + 32 );
+ exec->stackSize = (FT_UInt)tmp;
+ if ( error )
+ return error;
+
+ tmp = exec->glyphSize;
+ error = Update_Max( exec->memory,
+ &tmp,
+ sizeof ( FT_Byte ),
+ (void*)&exec->glyphIns,
+ maxp->maxSizeOfInstructions );
+ exec->glyphSize = (FT_UShort)tmp;
+ if ( error )
+ return error;
+
+ exec->pts.n_points = 0;
+ exec->pts.n_contours = 0;
+
+ exec->zp1 = exec->pts;
+ exec->zp2 = exec->pts;
+ exec->zp0 = exec->pts;
+
+ exec->instruction_trap = FALSE;
+
+ return FT_Err_Ok;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* TT_Save_Context */
+ /* */
+ /* <Description> */
+ /* Saves the code ranges in a `size' object. */
+ /* */
+ /* <Input> */
+ /* exec :: A handle to the source execution context. */
+ /* */
+ /* <InOut> */
+ /* size :: A handle to the target size object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ /* <Note> */
+ /* Only the glyph loader and debugger should call this function. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ TT_Save_Context( TT_ExecContext exec,
+ TT_Size size )
+ {
+ FT_Int i;
+
+
+ /* XXX: Will probably disappear soon with all the code range */
+ /* management, which is now rather obsolete. */
+ /* */
+ size->num_function_defs = exec->numFDefs;
+ size->num_instruction_defs = exec->numIDefs;
+
+ size->max_func = exec->maxFunc;
+ size->max_ins = exec->maxIns;
+
+ for ( i = 0; i < TT_MAX_CODE_RANGES; i++ )
+ size->codeRangeTable[i] = exec->codeRangeTable[i];
+
+ return FT_Err_Ok;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* TT_Run_Context */
+ /* */
+ /* <Description> */
+ /* Executes one or more instructions in the execution context. */
+ /* */
+ /* <Input> */
+ /* debug :: A Boolean flag. If set, the function sets some internal */
+ /* variables and returns immediately, otherwise TT_RunIns() */
+ /* is called. */
+ /* */
+ /* This is commented out currently. */
+ /* */
+ /* <Input> */
+ /* exec :: A handle to the target execution context. */
+ /* */
+ /* <Return> */
+ /* TrueType error code. 0 means success. */
+ /* */
+ /* <Note> */
+ /* Only the glyph loader and debugger should call this function. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ TT_Run_Context( TT_ExecContext exec,
+ FT_Bool debug )
+ {
+ FT_Error error;
+
+
+ if ( ( error = TT_Goto_CodeRange( exec, tt_coderange_glyph, 0 ) )
+ != FT_Err_Ok )
+ return error;
+
+ exec->zp0 = exec->pts;
+ exec->zp1 = exec->pts;
+ exec->zp2 = exec->pts;
+
+ exec->GS.gep0 = 1;
+ exec->GS.gep1 = 1;
+ exec->GS.gep2 = 1;
+
+ exec->GS.projVector.x = 0x4000;
+ exec->GS.projVector.y = 0x0000;
+
+ exec->GS.freeVector = exec->GS.projVector;
+ exec->GS.dualVector = exec->GS.projVector;
+
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+ exec->GS.both_x_axis = TRUE;
+#endif
+
+ exec->GS.round_state = 1;
+ exec->GS.loop = 1;
+
+ /* some glyphs leave something on the stack. so we clean it */
+ /* before a new execution. */
+ exec->top = 0;
+ exec->callTop = 0;
+
+#if 1
+ FT_UNUSED( debug );
+
+ return exec->face->interpreter( exec );
+#else
+ if ( !debug )
+ return TT_RunIns( exec );
+ else
+ return FT_Err_Ok;
+#endif
+ }
+
+
+ /* The default value for `scan_control' is documented as FALSE in the */
+ /* TrueType specification. This is confusing since it implies a */
+ /* Boolean value. However, this is not the case, thus both the */
+ /* default values of our `scan_type' and `scan_control' fields (which */
+ /* the documentation's `scan_control' variable is split into) are */
+ /* zero. */
+
+ const TT_GraphicsState tt_default_graphics_state =
+ {
+ 0, 0, 0,
+ { 0x4000, 0 },
+ { 0x4000, 0 },
+ { 0x4000, 0 },
+
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+ TRUE,
+#endif
+
+ 1, 64, 1,
+ TRUE, 68, 0, 0, 9, 3,
+ 0, FALSE, 0, 1, 1, 1
+ };
+
+
+ /* documentation is in ttinterp.h */
+
+ FT_EXPORT_DEF( TT_ExecContext )
+ TT_New_Context( TT_Driver driver )
+ {
+ TT_ExecContext exec;
+ FT_Memory memory;
+
+
+ memory = driver->root.root.memory;
+ exec = driver->context;
+
+ if ( !driver->context )
+ {
+ FT_Error error;
+
+
+ /* allocate object */
+ if ( FT_NEW( exec ) )
+ goto Fail;
+
+ /* initialize it; in case of error this deallocates `exec' too */
+ error = Init_Context( exec, memory );
+ if ( error )
+ goto Fail;
+
+ /* store it into the driver */
+ driver->context = exec;
+ }
+
+ return driver->context;
+
+ Fail:
+ return NULL;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* Before an opcode is executed, the interpreter verifies that there are */
+ /* enough arguments on the stack, with the help of the `Pop_Push_Count' */
+ /* table. */
+ /* */
+ /* For each opcode, the first column gives the number of arguments that */
+ /* are popped from the stack; the second one gives the number of those */
+ /* that are pushed in result. */
+ /* */
+ /* Opcodes which have a varying number of parameters in the data stream */
+ /* (NPUSHB, NPUSHW) are handled specially; they have a negative value in */
+ /* the `opcode_length' table, and the value in `Pop_Push_Count' is set */
+ /* to zero. */
+ /* */
+ /*************************************************************************/
+
+
+#undef PACK
+#define PACK( x, y ) ( ( x << 4 ) | y )
+
+
+ static
+ const FT_Byte Pop_Push_Count[256] =
+ {
+ /* opcodes are gathered in groups of 16 */
+ /* please keep the spaces as they are */
+
+ /* SVTCA y */ PACK( 0, 0 ),
+ /* SVTCA x */ PACK( 0, 0 ),
+ /* SPvTCA y */ PACK( 0, 0 ),
+ /* SPvTCA x */ PACK( 0, 0 ),
+ /* SFvTCA y */ PACK( 0, 0 ),
+ /* SFvTCA x */ PACK( 0, 0 ),
+ /* SPvTL // */ PACK( 2, 0 ),
+ /* SPvTL + */ PACK( 2, 0 ),
+ /* SFvTL // */ PACK( 2, 0 ),
+ /* SFvTL + */ PACK( 2, 0 ),
+ /* SPvFS */ PACK( 2, 0 ),
+ /* SFvFS */ PACK( 2, 0 ),
+ /* GPV */ PACK( 0, 2 ),
+ /* GFV */ PACK( 0, 2 ),
+ /* SFvTPv */ PACK( 0, 0 ),
+ /* ISECT */ PACK( 5, 0 ),
+
+ /* SRP0 */ PACK( 1, 0 ),
+ /* SRP1 */ PACK( 1, 0 ),
+ /* SRP2 */ PACK( 1, 0 ),
+ /* SZP0 */ PACK( 1, 0 ),
+ /* SZP1 */ PACK( 1, 0 ),
+ /* SZP2 */ PACK( 1, 0 ),
+ /* SZPS */ PACK( 1, 0 ),
+ /* SLOOP */ PACK( 1, 0 ),
+ /* RTG */ PACK( 0, 0 ),
+ /* RTHG */ PACK( 0, 0 ),
+ /* SMD */ PACK( 1, 0 ),
+ /* ELSE */ PACK( 0, 0 ),
+ /* JMPR */ PACK( 1, 0 ),
+ /* SCvTCi */ PACK( 1, 0 ),
+ /* SSwCi */ PACK( 1, 0 ),
+ /* SSW */ PACK( 1, 0 ),
+
+ /* DUP */ PACK( 1, 2 ),
+ /* POP */ PACK( 1, 0 ),
+ /* CLEAR */ PACK( 0, 0 ),
+ /* SWAP */ PACK( 2, 2 ),
+ /* DEPTH */ PACK( 0, 1 ),
+ /* CINDEX */ PACK( 1, 1 ),
+ /* MINDEX */ PACK( 1, 0 ),
+ /* AlignPTS */ PACK( 2, 0 ),
+ /* INS_$28 */ PACK( 0, 0 ),
+ /* UTP */ PACK( 1, 0 ),
+ /* LOOPCALL */ PACK( 2, 0 ),
+ /* CALL */ PACK( 1, 0 ),
+ /* FDEF */ PACK( 1, 0 ),
+ /* ENDF */ PACK( 0, 0 ),
+ /* MDAP[0] */ PACK( 1, 0 ),
+ /* MDAP[1] */ PACK( 1, 0 ),
+
+ /* IUP[0] */ PACK( 0, 0 ),
+ /* IUP[1] */ PACK( 0, 0 ),
+ /* SHP[0] */ PACK( 0, 0 ),
+ /* SHP[1] */ PACK( 0, 0 ),
+ /* SHC[0] */ PACK( 1, 0 ),
+ /* SHC[1] */ PACK( 1, 0 ),
+ /* SHZ[0] */ PACK( 1, 0 ),
+ /* SHZ[1] */ PACK( 1, 0 ),
+ /* SHPIX */ PACK( 1, 0 ),
+ /* IP */ PACK( 0, 0 ),
+ /* MSIRP[0] */ PACK( 2, 0 ),
+ /* MSIRP[1] */ PACK( 2, 0 ),
+ /* AlignRP */ PACK( 0, 0 ),
+ /* RTDG */ PACK( 0, 0 ),
+ /* MIAP[0] */ PACK( 2, 0 ),
+ /* MIAP[1] */ PACK( 2, 0 ),
+
+ /* NPushB */ PACK( 0, 0 ),
+ /* NPushW */ PACK( 0, 0 ),
+ /* WS */ PACK( 2, 0 ),
+ /* RS */ PACK( 1, 1 ),
+ /* WCvtP */ PACK( 2, 0 ),
+ /* RCvt */ PACK( 1, 1 ),
+ /* GC[0] */ PACK( 1, 1 ),
+ /* GC[1] */ PACK( 1, 1 ),
+ /* SCFS */ PACK( 2, 0 ),
+ /* MD[0] */ PACK( 2, 1 ),
+ /* MD[1] */ PACK( 2, 1 ),
+ /* MPPEM */ PACK( 0, 1 ),
+ /* MPS */ PACK( 0, 1 ),
+ /* FlipON */ PACK( 0, 0 ),
+ /* FlipOFF */ PACK( 0, 0 ),
+ /* DEBUG */ PACK( 1, 0 ),
+
+ /* LT */ PACK( 2, 1 ),
+ /* LTEQ */ PACK( 2, 1 ),
+ /* GT */ PACK( 2, 1 ),
+ /* GTEQ */ PACK( 2, 1 ),
+ /* EQ */ PACK( 2, 1 ),
+ /* NEQ */ PACK( 2, 1 ),
+ /* ODD */ PACK( 1, 1 ),
+ /* EVEN */ PACK( 1, 1 ),
+ /* IF */ PACK( 1, 0 ),
+ /* EIF */ PACK( 0, 0 ),
+ /* AND */ PACK( 2, 1 ),
+ /* OR */ PACK( 2, 1 ),
+ /* NOT */ PACK( 1, 1 ),
+ /* DeltaP1 */ PACK( 1, 0 ),
+ /* SDB */ PACK( 1, 0 ),
+ /* SDS */ PACK( 1, 0 ),
+
+ /* ADD */ PACK( 2, 1 ),
+ /* SUB */ PACK( 2, 1 ),
+ /* DIV */ PACK( 2, 1 ),
+ /* MUL */ PACK( 2, 1 ),
+ /* ABS */ PACK( 1, 1 ),
+ /* NEG */ PACK( 1, 1 ),
+ /* FLOOR */ PACK( 1, 1 ),
+ /* CEILING */ PACK( 1, 1 ),
+ /* ROUND[0] */ PACK( 1, 1 ),
+ /* ROUND[1] */ PACK( 1, 1 ),
+ /* ROUND[2] */ PACK( 1, 1 ),
+ /* ROUND[3] */ PACK( 1, 1 ),
+ /* NROUND[0] */ PACK( 1, 1 ),
+ /* NROUND[1] */ PACK( 1, 1 ),
+ /* NROUND[2] */ PACK( 1, 1 ),
+ /* NROUND[3] */ PACK( 1, 1 ),
+
+ /* WCvtF */ PACK( 2, 0 ),
+ /* DeltaP2 */ PACK( 1, 0 ),
+ /* DeltaP3 */ PACK( 1, 0 ),
+ /* DeltaCn[0] */ PACK( 1, 0 ),
+ /* DeltaCn[1] */ PACK( 1, 0 ),
+ /* DeltaCn[2] */ PACK( 1, 0 ),
+ /* SROUND */ PACK( 1, 0 ),
+ /* S45Round */ PACK( 1, 0 ),
+ /* JROT */ PACK( 2, 0 ),
+ /* JROF */ PACK( 2, 0 ),
+ /* ROFF */ PACK( 0, 0 ),
+ /* INS_$7B */ PACK( 0, 0 ),
+ /* RUTG */ PACK( 0, 0 ),
+ /* RDTG */ PACK( 0, 0 ),
+ /* SANGW */ PACK( 1, 0 ),
+ /* AA */ PACK( 1, 0 ),
+
+ /* FlipPT */ PACK( 0, 0 ),
+ /* FlipRgON */ PACK( 2, 0 ),
+ /* FlipRgOFF */ PACK( 2, 0 ),
+ /* INS_$83 */ PACK( 0, 0 ),
+ /* INS_$84 */ PACK( 0, 0 ),
+ /* ScanCTRL */ PACK( 1, 0 ),
+ /* SDPVTL[0] */ PACK( 2, 0 ),
+ /* SDPVTL[1] */ PACK( 2, 0 ),
+ /* GetINFO */ PACK( 1, 1 ),
+ /* IDEF */ PACK( 1, 0 ),
+ /* ROLL */ PACK( 3, 3 ),
+ /* MAX */ PACK( 2, 1 ),
+ /* MIN */ PACK( 2, 1 ),
+ /* ScanTYPE */ PACK( 1, 0 ),
+ /* InstCTRL */ PACK( 2, 0 ),
+ /* INS_$8F */ PACK( 0, 0 ),
+
+ /* INS_$90 */ PACK( 0, 0 ),
+ /* INS_$91 */ PACK( 0, 0 ),
+ /* INS_$92 */ PACK( 0, 0 ),
+ /* INS_$93 */ PACK( 0, 0 ),
+ /* INS_$94 */ PACK( 0, 0 ),
+ /* INS_$95 */ PACK( 0, 0 ),
+ /* INS_$96 */ PACK( 0, 0 ),
+ /* INS_$97 */ PACK( 0, 0 ),
+ /* INS_$98 */ PACK( 0, 0 ),
+ /* INS_$99 */ PACK( 0, 0 ),
+ /* INS_$9A */ PACK( 0, 0 ),
+ /* INS_$9B */ PACK( 0, 0 ),
+ /* INS_$9C */ PACK( 0, 0 ),
+ /* INS_$9D */ PACK( 0, 0 ),
+ /* INS_$9E */ PACK( 0, 0 ),
+ /* INS_$9F */ PACK( 0, 0 ),
+
+ /* INS_$A0 */ PACK( 0, 0 ),
+ /* INS_$A1 */ PACK( 0, 0 ),
+ /* INS_$A2 */ PACK( 0, 0 ),
+ /* INS_$A3 */ PACK( 0, 0 ),
+ /* INS_$A4 */ PACK( 0, 0 ),
+ /* INS_$A5 */ PACK( 0, 0 ),
+ /* INS_$A6 */ PACK( 0, 0 ),
+ /* INS_$A7 */ PACK( 0, 0 ),
+ /* INS_$A8 */ PACK( 0, 0 ),
+ /* INS_$A9 */ PACK( 0, 0 ),
+ /* INS_$AA */ PACK( 0, 0 ),
+ /* INS_$AB */ PACK( 0, 0 ),
+ /* INS_$AC */ PACK( 0, 0 ),
+ /* INS_$AD */ PACK( 0, 0 ),
+ /* INS_$AE */ PACK( 0, 0 ),
+ /* INS_$AF */ PACK( 0, 0 ),
+
+ /* PushB[0] */ PACK( 0, 1 ),
+ /* PushB[1] */ PACK( 0, 2 ),
+ /* PushB[2] */ PACK( 0, 3 ),
+ /* PushB[3] */ PACK( 0, 4 ),
+ /* PushB[4] */ PACK( 0, 5 ),
+ /* PushB[5] */ PACK( 0, 6 ),
+ /* PushB[6] */ PACK( 0, 7 ),
+ /* PushB[7] */ PACK( 0, 8 ),
+ /* PushW[0] */ PACK( 0, 1 ),
+ /* PushW[1] */ PACK( 0, 2 ),
+ /* PushW[2] */ PACK( 0, 3 ),
+ /* PushW[3] */ PACK( 0, 4 ),
+ /* PushW[4] */ PACK( 0, 5 ),
+ /* PushW[5] */ PACK( 0, 6 ),
+ /* PushW[6] */ PACK( 0, 7 ),
+ /* PushW[7] */ PACK( 0, 8 ),
+
+ /* MDRP[00] */ PACK( 1, 0 ),
+ /* MDRP[01] */ PACK( 1, 0 ),
+ /* MDRP[02] */ PACK( 1, 0 ),
+ /* MDRP[03] */ PACK( 1, 0 ),
+ /* MDRP[04] */ PACK( 1, 0 ),
+ /* MDRP[05] */ PACK( 1, 0 ),
+ /* MDRP[06] */ PACK( 1, 0 ),
+ /* MDRP[07] */ PACK( 1, 0 ),
+ /* MDRP[08] */ PACK( 1, 0 ),
+ /* MDRP[09] */ PACK( 1, 0 ),
+ /* MDRP[10] */ PACK( 1, 0 ),
+ /* MDRP[11] */ PACK( 1, 0 ),
+ /* MDRP[12] */ PACK( 1, 0 ),
+ /* MDRP[13] */ PACK( 1, 0 ),
+ /* MDRP[14] */ PACK( 1, 0 ),
+ /* MDRP[15] */ PACK( 1, 0 ),
+
+ /* MDRP[16] */ PACK( 1, 0 ),
+ /* MDRP[17] */ PACK( 1, 0 ),
+ /* MDRP[18] */ PACK( 1, 0 ),
+ /* MDRP[19] */ PACK( 1, 0 ),
+ /* MDRP[20] */ PACK( 1, 0 ),
+ /* MDRP[21] */ PACK( 1, 0 ),
+ /* MDRP[22] */ PACK( 1, 0 ),
+ /* MDRP[23] */ PACK( 1, 0 ),
+ /* MDRP[24] */ PACK( 1, 0 ),
+ /* MDRP[25] */ PACK( 1, 0 ),
+ /* MDRP[26] */ PACK( 1, 0 ),
+ /* MDRP[27] */ PACK( 1, 0 ),
+ /* MDRP[28] */ PACK( 1, 0 ),
+ /* MDRP[29] */ PACK( 1, 0 ),
+ /* MDRP[30] */ PACK( 1, 0 ),
+ /* MDRP[31] */ PACK( 1, 0 ),
+
+ /* MIRP[00] */ PACK( 2, 0 ),
+ /* MIRP[01] */ PACK( 2, 0 ),
+ /* MIRP[02] */ PACK( 2, 0 ),
+ /* MIRP[03] */ PACK( 2, 0 ),
+ /* MIRP[04] */ PACK( 2, 0 ),
+ /* MIRP[05] */ PACK( 2, 0 ),
+ /* MIRP[06] */ PACK( 2, 0 ),
+ /* MIRP[07] */ PACK( 2, 0 ),
+ /* MIRP[08] */ PACK( 2, 0 ),
+ /* MIRP[09] */ PACK( 2, 0 ),
+ /* MIRP[10] */ PACK( 2, 0 ),
+ /* MIRP[11] */ PACK( 2, 0 ),
+ /* MIRP[12] */ PACK( 2, 0 ),
+ /* MIRP[13] */ PACK( 2, 0 ),
+ /* MIRP[14] */ PACK( 2, 0 ),
+ /* MIRP[15] */ PACK( 2, 0 ),
+
+ /* MIRP[16] */ PACK( 2, 0 ),
+ /* MIRP[17] */ PACK( 2, 0 ),
+ /* MIRP[18] */ PACK( 2, 0 ),
+ /* MIRP[19] */ PACK( 2, 0 ),
+ /* MIRP[20] */ PACK( 2, 0 ),
+ /* MIRP[21] */ PACK( 2, 0 ),
+ /* MIRP[22] */ PACK( 2, 0 ),
+ /* MIRP[23] */ PACK( 2, 0 ),
+ /* MIRP[24] */ PACK( 2, 0 ),
+ /* MIRP[25] */ PACK( 2, 0 ),
+ /* MIRP[26] */ PACK( 2, 0 ),
+ /* MIRP[27] */ PACK( 2, 0 ),
+ /* MIRP[28] */ PACK( 2, 0 ),
+ /* MIRP[29] */ PACK( 2, 0 ),
+ /* MIRP[30] */ PACK( 2, 0 ),
+ /* MIRP[31] */ PACK( 2, 0 )
+ };
+
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+
+ static
+ const char* const opcode_name[256] =
+ {
+ "SVTCA y",
+ "SVTCA x",
+ "SPvTCA y",
+ "SPvTCA x",
+ "SFvTCA y",
+ "SFvTCA x",
+ "SPvTL ||",
+ "SPvTL +",
+ "SFvTL ||",
+ "SFvTL +",
+ "SPvFS",
+ "SFvFS",
+ "GPV",
+ "GFV",
+ "SFvTPv",
+ "ISECT",
+
+ "SRP0",
+ "SRP1",
+ "SRP2",
+ "SZP0",
+ "SZP1",
+ "SZP2",
+ "SZPS",
+ "SLOOP",
+ "RTG",
+ "RTHG",
+ "SMD",
+ "ELSE",
+ "JMPR",
+ "SCvTCi",
+ "SSwCi",
+ "SSW",
+
+ "DUP",
+ "POP",
+ "CLEAR",
+ "SWAP",
+ "DEPTH",
+ "CINDEX",
+ "MINDEX",
+ "AlignPTS",
+ "INS_$28",
+ "UTP",
+ "LOOPCALL",
+ "CALL",
+ "FDEF",
+ "ENDF",
+ "MDAP[0]",
+ "MDAP[1]",
+
+ "IUP[0]",
+ "IUP[1]",
+ "SHP[0]",
+ "SHP[1]",
+ "SHC[0]",
+ "SHC[1]",
+ "SHZ[0]",
+ "SHZ[1]",
+ "SHPIX",
+ "IP",
+ "MSIRP[0]",
+ "MSIRP[1]",
+ "AlignRP",
+ "RTDG",
+ "MIAP[0]",
+ "MIAP[1]",
+
+ "NPushB",
+ "NPushW",
+ "WS",
+ "RS",
+ "WCvtP",
+ "RCvt",
+ "GC[0]",
+ "GC[1]",
+ "SCFS",
+ "MD[0]",
+ "MD[1]",
+ "MPPEM",
+ "MPS",
+ "FlipON",
+ "FlipOFF",
+ "DEBUG",
+
+ "LT",
+ "LTEQ",
+ "GT",
+ "GTEQ",
+ "EQ",
+ "NEQ",
+ "ODD",
+ "EVEN",
+ "IF",
+ "EIF",
+ "AND",
+ "OR",
+ "NOT",
+ "DeltaP1",
+ "SDB",
+ "SDS",
+
+ "ADD",
+ "SUB",
+ "DIV",
+ "MUL",
+ "ABS",
+ "NEG",
+ "FLOOR",
+ "CEILING",
+ "ROUND[0]",
+ "ROUND[1]",
+ "ROUND[2]",
+ "ROUND[3]",
+ "NROUND[0]",
+ "NROUND[1]",
+ "NROUND[2]",
+ "NROUND[3]",
+
+ "WCvtF",
+ "DeltaP2",
+ "DeltaP3",
+ "DeltaCn[0]",
+ "DeltaCn[1]",
+ "DeltaCn[2]",
+ "SROUND",
+ "S45Round",
+ "JROT",
+ "JROF",
+ "ROFF",
+ "INS_$7B",
+ "RUTG",
+ "RDTG",
+ "SANGW",
+ "AA",
+
+ "FlipPT",
+ "FlipRgON",
+ "FlipRgOFF",
+ "INS_$83",
+ "INS_$84",
+ "ScanCTRL",
+ "SDVPTL[0]",
+ "SDVPTL[1]",
+ "GetINFO",
+ "IDEF",
+ "ROLL",
+ "MAX",
+ "MIN",
+ "ScanTYPE",
+ "InstCTRL",
+ "INS_$8F",
+
+ "INS_$90",
+ "INS_$91",
+ "INS_$92",
+ "INS_$93",
+ "INS_$94",
+ "INS_$95",
+ "INS_$96",
+ "INS_$97",
+ "INS_$98",
+ "INS_$99",
+ "INS_$9A",
+ "INS_$9B",
+ "INS_$9C",
+ "INS_$9D",
+ "INS_$9E",
+ "INS_$9F",
+
+ "INS_$A0",
+ "INS_$A1",
+ "INS_$A2",
+ "INS_$A3",
+ "INS_$A4",
+ "INS_$A5",
+ "INS_$A6",
+ "INS_$A7",
+ "INS_$A8",
+ "INS_$A9",
+ "INS_$AA",
+ "INS_$AB",
+ "INS_$AC",
+ "INS_$AD",
+ "INS_$AE",
+ "INS_$AF",
+
+ "PushB[0]",
+ "PushB[1]",
+ "PushB[2]",
+ "PushB[3]",
+ "PushB[4]",
+ "PushB[5]",
+ "PushB[6]",
+ "PushB[7]",
+ "PushW[0]",
+ "PushW[1]",
+ "PushW[2]",
+ "PushW[3]",
+ "PushW[4]",
+ "PushW[5]",
+ "PushW[6]",
+ "PushW[7]",
+
+ "MDRP[00]",
+ "MDRP[01]",
+ "MDRP[02]",
+ "MDRP[03]",
+ "MDRP[04]",
+ "MDRP[05]",
+ "MDRP[06]",
+ "MDRP[07]",
+ "MDRP[08]",
+ "MDRP[09]",
+ "MDRP[10]",
+ "MDRP[11]",
+ "MDRP[12]",
+ "MDRP[13]",
+ "MDRP[14]",
+ "MDRP[15]",
+
+ "MDRP[16]",
+ "MDRP[17]",
+ "MDRP[18]",
+ "MDRP[19]",
+ "MDRP[20]",
+ "MDRP[21]",
+ "MDRP[22]",
+ "MDRP[23]",
+ "MDRP[24]",
+ "MDRP[25]",
+ "MDRP[26]",
+ "MDRP[27]",
+ "MDRP[28]",
+ "MDRP[29]",
+ "MDRP[30]",
+ "MDRP[31]",
+
+ "MIRP[00]",
+ "MIRP[01]",
+ "MIRP[02]",
+ "MIRP[03]",
+ "MIRP[04]",
+ "MIRP[05]",
+ "MIRP[06]",
+ "MIRP[07]",
+ "MIRP[08]",
+ "MIRP[09]",
+ "MIRP[10]",
+ "MIRP[11]",
+ "MIRP[12]",
+ "MIRP[13]",
+ "MIRP[14]",
+ "MIRP[15]",
+
+ "MIRP[16]",
+ "MIRP[17]",
+ "MIRP[18]",
+ "MIRP[19]",
+ "MIRP[20]",
+ "MIRP[21]",
+ "MIRP[22]",
+ "MIRP[23]",
+ "MIRP[24]",
+ "MIRP[25]",
+ "MIRP[26]",
+ "MIRP[27]",
+ "MIRP[28]",
+ "MIRP[29]",
+ "MIRP[30]",
+ "MIRP[31]"
+ };
+
+#endif /* FT_DEBUG_LEVEL_TRACE */
+
+
+ static
+ const FT_Char opcode_length[256] =
+ {
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+
+ -1,-2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 2, 3, 4, 5, 6, 7, 8, 9, 3, 5, 7, 9, 11,13,15,17,
+
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
+ };
+
+#undef PACK
+
+#if 1
+
+ static FT_Int32
+ TT_MulFix14( FT_Int32 a,
+ FT_Int b )
+ {
+ FT_Int32 sign;
+ FT_UInt32 ah, al, mid, lo, hi;
+
+
+ sign = a ^ b;
+
+ if ( a < 0 )
+ a = -a;
+ if ( b < 0 )
+ b = -b;
+
+ ah = (FT_UInt32)( ( a >> 16 ) & 0xFFFFU );
+ al = (FT_UInt32)( a & 0xFFFFU );
+
+ lo = al * b;
+ mid = ah * b;
+ hi = mid >> 16;
+ mid = ( mid << 16 ) + ( 1 << 13 ); /* rounding */
+ lo += mid;
+ if ( lo < mid )
+ hi += 1;
+
+ mid = ( lo >> 14 ) | ( hi << 18 );
+
+ return sign >= 0 ? (FT_Int32)mid : -(FT_Int32)mid;
+ }
+
+#else
+
+ /* compute (a*b)/2^14 with maximum accuracy and rounding */
+ static FT_Int32
+ TT_MulFix14( FT_Int32 a,
+ FT_Int b )
+ {
+ FT_Int32 m, s, hi;
+ FT_UInt32 l, lo;
+
+
+ /* compute ax*bx as 64-bit value */
+ l = (FT_UInt32)( ( a & 0xFFFFU ) * b );
+ m = ( a >> 16 ) * b;
+
+ lo = l + ( (FT_UInt32)m << 16 );
+ hi = ( m >> 16 ) + ( (FT_Int32)l >> 31 ) + ( lo < l );
+
+ /* divide the result by 2^14 with rounding */
+ s = hi >> 31;
+ l = lo + (FT_UInt32)s;
+ hi += s + ( l < lo );
+ lo = l;
+
+ l = lo + 0x2000U;
+ hi += l < lo;
+
+ return (FT_Int32)( ( (FT_UInt32)hi << 18 ) | ( l >> 14 ) );
+ }
+#endif
+
+
+ /* compute (ax*bx+ay*by)/2^14 with maximum accuracy and rounding */
+ static FT_Int32
+ TT_DotFix14( FT_Int32 ax,
+ FT_Int32 ay,
+ FT_Int bx,
+ FT_Int by )
+ {
+ FT_Int32 m, s, hi1, hi2, hi;
+ FT_UInt32 l, lo1, lo2, lo;
+
+
+ /* compute ax*bx as 64-bit value */
+ l = (FT_UInt32)( ( ax & 0xFFFFU ) * bx );
+ m = ( ax >> 16 ) * bx;
+
+ lo1 = l + ( (FT_UInt32)m << 16 );
+ hi1 = ( m >> 16 ) + ( (FT_Int32)l >> 31 ) + ( lo1 < l );
+
+ /* compute ay*by as 64-bit value */
+ l = (FT_UInt32)( ( ay & 0xFFFFU ) * by );
+ m = ( ay >> 16 ) * by;
+
+ lo2 = l + ( (FT_UInt32)m << 16 );
+ hi2 = ( m >> 16 ) + ( (FT_Int32)l >> 31 ) + ( lo2 < l );
+
+ /* add them */
+ lo = lo1 + lo2;
+ hi = hi1 + hi2 + ( lo < lo1 );
+
+ /* divide the result by 2^14 with rounding */
+ s = hi >> 31;
+ l = lo + (FT_UInt32)s;
+ hi += s + ( l < lo );
+ lo = l;
+
+ l = lo + 0x2000U;
+ hi += ( l < lo );
+
+ return (FT_Int32)( ( (FT_UInt32)hi << 18 ) | ( l >> 14 ) );
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Current_Ratio */
+ /* */
+ /* <Description> */
+ /* Returns the current aspect ratio scaling factor depending on the */
+ /* projection vector's state and device resolutions. */
+ /* */
+ /* <Return> */
+ /* The aspect ratio in 16.16 format, always <= 1.0 . */
+ /* */
+ static FT_Long
+ Current_Ratio( EXEC_OP )
+ {
+ if ( !CUR.tt_metrics.ratio )
+ {
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+ if ( CUR.face->unpatented_hinting )
+ {
+ if ( CUR.GS.both_x_axis )
+ CUR.tt_metrics.ratio = CUR.tt_metrics.x_ratio;
+ else
+ CUR.tt_metrics.ratio = CUR.tt_metrics.y_ratio;
+ }
+ else
+#endif
+ {
+ if ( CUR.GS.projVector.y == 0 )
+ CUR.tt_metrics.ratio = CUR.tt_metrics.x_ratio;
+
+ else if ( CUR.GS.projVector.x == 0 )
+ CUR.tt_metrics.ratio = CUR.tt_metrics.y_ratio;
+
+ else
+ {
+ FT_F26Dot6 x, y;
+
+
+ x = TT_MulFix14( CUR.tt_metrics.x_ratio,
+ CUR.GS.projVector.x );
+ y = TT_MulFix14( CUR.tt_metrics.y_ratio,
+ CUR.GS.projVector.y );
+ CUR.tt_metrics.ratio = FT_Hypot( x, y );
+ }
+ }
+ }
+ return CUR.tt_metrics.ratio;
+ }
+
+
+ static FT_Long
+ Current_Ppem( EXEC_OP )
+ {
+ return FT_MulFix( CUR.tt_metrics.ppem, CURRENT_Ratio() );
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* Functions related to the control value table (CVT). */
+ /* */
+ /*************************************************************************/
+
+
+ FT_CALLBACK_DEF( FT_F26Dot6 )
+ Read_CVT( EXEC_OP_ FT_ULong idx )
+ {
+ return CUR.cvt[idx];
+ }
+
+
+ FT_CALLBACK_DEF( FT_F26Dot6 )
+ Read_CVT_Stretched( EXEC_OP_ FT_ULong idx )
+ {
+ return FT_MulFix( CUR.cvt[idx], CURRENT_Ratio() );
+ }
+
+
+ FT_CALLBACK_DEF( void )
+ Write_CVT( EXEC_OP_ FT_ULong idx,
+ FT_F26Dot6 value )
+ {
+ CUR.cvt[idx] = value;
+ }
+
+
+ FT_CALLBACK_DEF( void )
+ Write_CVT_Stretched( EXEC_OP_ FT_ULong idx,
+ FT_F26Dot6 value )
+ {
+ CUR.cvt[idx] = FT_DivFix( value, CURRENT_Ratio() );
+ }
+
+
+ FT_CALLBACK_DEF( void )
+ Move_CVT( EXEC_OP_ FT_ULong idx,
+ FT_F26Dot6 value )
+ {
+ CUR.cvt[idx] += value;
+ }
+
+
+ FT_CALLBACK_DEF( void )
+ Move_CVT_Stretched( EXEC_OP_ FT_ULong idx,
+ FT_F26Dot6 value )
+ {
+ CUR.cvt[idx] += FT_DivFix( value, CURRENT_Ratio() );
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* GetShortIns */
+ /* */
+ /* <Description> */
+ /* Returns a short integer taken from the instruction stream at */
+ /* address IP. */
+ /* */
+ /* <Return> */
+ /* Short read at code[IP]. */
+ /* */
+ /* <Note> */
+ /* This one could become a macro. */
+ /* */
+ static FT_Short
+ GetShortIns( EXEC_OP )
+ {
+ /* Reading a byte stream so there is no endianess (DaveP) */
+ CUR.IP += 2;
+ return (FT_Short)( ( CUR.code[CUR.IP - 2] << 8 ) +
+ CUR.code[CUR.IP - 1] );
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Ins_Goto_CodeRange */
+ /* */
+ /* <Description> */
+ /* Goes to a certain code range in the instruction stream. */
+ /* */
+ /* <Input> */
+ /* aRange :: The index of the code range. */
+ /* */
+ /* aIP :: The new IP address in the code range. */
+ /* */
+ /* <Return> */
+ /* SUCCESS or FAILURE. */
+ /* */
+ static FT_Bool
+ Ins_Goto_CodeRange( EXEC_OP_ FT_Int aRange,
+ FT_ULong aIP )
+ {
+ TT_CodeRange* range;
+
+
+ if ( aRange < 1 || aRange > 3 )
+ {
+ CUR.error = FT_THROW( Bad_Argument );
+ return FAILURE;
+ }
+
+ range = &CUR.codeRangeTable[aRange - 1];
+
+ if ( range->base == NULL ) /* invalid coderange */
+ {
+ CUR.error = FT_THROW( Invalid_CodeRange );
+ return FAILURE;
+ }
+
+ /* NOTE: Because the last instruction of a program may be a CALL */
+ /* which will return to the first byte *after* the code */
+ /* range, we test for aIP <= Size, instead of aIP < Size. */
+
+ if ( aIP > range->size )
+ {
+ CUR.error = FT_THROW( Code_Overflow );
+ return FAILURE;
+ }
+
+ CUR.code = range->base;
+ CUR.codeSize = range->size;
+ CUR.IP = aIP;
+ CUR.curRange = aRange;
+
+ return SUCCESS;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Direct_Move */
+ /* */
+ /* <Description> */
+ /* Moves a point by a given distance along the freedom vector. The */
+ /* point will be `touched'. */
+ /* */
+ /* <Input> */
+ /* point :: The index of the point to move. */
+ /* */
+ /* distance :: The distance to apply. */
+ /* */
+ /* <InOut> */
+ /* zone :: The affected glyph zone. */
+ /* */
+ static void
+ Direct_Move( EXEC_OP_ TT_GlyphZone zone,
+ FT_UShort point,
+ FT_F26Dot6 distance )
+ {
+ FT_F26Dot6 v;
+
+
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+ FT_ASSERT( !CUR.face->unpatented_hinting );
+#endif
+
+ v = CUR.GS.freeVector.x;
+
+ if ( v != 0 )
+ {
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ if ( !SUBPIXEL_HINTING ||
+ ( !CUR.ignore_x_mode ||
+ ( CUR.sph_tweak_flags & SPH_TWEAK_ALLOW_X_DMOVE ) ) )
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+ zone->cur[point].x += FT_MulDiv( distance, v, CUR.F_dot_P );
+
+ zone->tags[point] |= FT_CURVE_TAG_TOUCH_X;
+ }
+
+ v = CUR.GS.freeVector.y;
+
+ if ( v != 0 )
+ {
+ zone->cur[point].y += FT_MulDiv( distance, v, CUR.F_dot_P );
+
+ zone->tags[point] |= FT_CURVE_TAG_TOUCH_Y;
+ }
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Direct_Move_Orig */
+ /* */
+ /* <Description> */
+ /* Moves the *original* position of a point by a given distance along */
+ /* the freedom vector. Obviously, the point will not be `touched'. */
+ /* */
+ /* <Input> */
+ /* point :: The index of the point to move. */
+ /* */
+ /* distance :: The distance to apply. */
+ /* */
+ /* <InOut> */
+ /* zone :: The affected glyph zone. */
+ /* */
+ static void
+ Direct_Move_Orig( EXEC_OP_ TT_GlyphZone zone,
+ FT_UShort point,
+ FT_F26Dot6 distance )
+ {
+ FT_F26Dot6 v;
+
+
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+ FT_ASSERT( !CUR.face->unpatented_hinting );
+#endif
+
+ v = CUR.GS.freeVector.x;
+
+ if ( v != 0 )
+ zone->org[point].x += FT_MulDiv( distance, v, CUR.F_dot_P );
+
+ v = CUR.GS.freeVector.y;
+
+ if ( v != 0 )
+ zone->org[point].y += FT_MulDiv( distance, v, CUR.F_dot_P );
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* Special versions of Direct_Move() */
+ /* */
+ /* The following versions are used whenever both vectors are both */
+ /* along one of the coordinate unit vectors, i.e. in 90% of the cases. */
+ /* */
+ /*************************************************************************/
+
+
+ static void
+ Direct_Move_X( EXEC_OP_ TT_GlyphZone zone,
+ FT_UShort point,
+ FT_F26Dot6 distance )
+ {
+ FT_UNUSED_EXEC;
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ if ( !SUBPIXEL_HINTING ||
+ !CUR.ignore_x_mode )
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+ zone->cur[point].x += distance;
+
+ zone->tags[point] |= FT_CURVE_TAG_TOUCH_X;
+ }
+
+
+ static void
+ Direct_Move_Y( EXEC_OP_ TT_GlyphZone zone,
+ FT_UShort point,
+ FT_F26Dot6 distance )
+ {
+ FT_UNUSED_EXEC;
+
+ zone->cur[point].y += distance;
+ zone->tags[point] |= FT_CURVE_TAG_TOUCH_Y;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* Special versions of Direct_Move_Orig() */
+ /* */
+ /* The following versions are used whenever both vectors are both */
+ /* along one of the coordinate unit vectors, i.e. in 90% of the cases. */
+ /* */
+ /*************************************************************************/
+
+
+ static void
+ Direct_Move_Orig_X( EXEC_OP_ TT_GlyphZone zone,
+ FT_UShort point,
+ FT_F26Dot6 distance )
+ {
+ FT_UNUSED_EXEC;
+
+ zone->org[point].x += distance;
+ }
+
+
+ static void
+ Direct_Move_Orig_Y( EXEC_OP_ TT_GlyphZone zone,
+ FT_UShort point,
+ FT_F26Dot6 distance )
+ {
+ FT_UNUSED_EXEC;
+
+ zone->org[point].y += distance;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Round_None */
+ /* */
+ /* <Description> */
+ /* Does not round, but adds engine compensation. */
+ /* */
+ /* <Input> */
+ /* distance :: The distance (not) to round. */
+ /* */
+ /* compensation :: The engine compensation. */
+ /* */
+ /* <Return> */
+ /* The compensated distance. */
+ /* */
+ /* <Note> */
+ /* The TrueType specification says very few about the relationship */
+ /* between rounding and engine compensation. However, it seems from */
+ /* the description of super round that we should add the compensation */
+ /* before rounding. */
+ /* */
+ static FT_F26Dot6
+ Round_None( EXEC_OP_ FT_F26Dot6 distance,
+ FT_F26Dot6 compensation )
+ {
+ FT_F26Dot6 val;
+
+ FT_UNUSED_EXEC;
+
+
+ if ( distance >= 0 )
+ {
+ val = distance + compensation;
+ if ( distance && val < 0 )
+ val = 0;
+ }
+ else
+ {
+ val = distance - compensation;
+ if ( val > 0 )
+ val = 0;
+ }
+ return val;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Round_To_Grid */
+ /* */
+ /* <Description> */
+ /* Rounds value to grid after adding engine compensation. */
+ /* */
+ /* <Input> */
+ /* distance :: The distance to round. */
+ /* */
+ /* compensation :: The engine compensation. */
+ /* */
+ /* <Return> */
+ /* Rounded distance. */
+ /* */
+ static FT_F26Dot6
+ Round_To_Grid( EXEC_OP_ FT_F26Dot6 distance,
+ FT_F26Dot6 compensation )
+ {
+ FT_F26Dot6 val;
+
+ FT_UNUSED_EXEC;
+
+
+ if ( distance >= 0 )
+ {
+ val = distance + compensation + 32;
+ if ( distance && val > 0 )
+ val &= ~63;
+ else
+ val = 0;
+ }
+ else
+ {
+ val = -FT_PIX_ROUND( compensation - distance );
+ if ( val > 0 )
+ val = 0;
+ }
+
+ return val;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Round_To_Half_Grid */
+ /* */
+ /* <Description> */
+ /* Rounds value to half grid after adding engine compensation. */
+ /* */
+ /* <Input> */
+ /* distance :: The distance to round. */
+ /* */
+ /* compensation :: The engine compensation. */
+ /* */
+ /* <Return> */
+ /* Rounded distance. */
+ /* */
+ static FT_F26Dot6
+ Round_To_Half_Grid( EXEC_OP_ FT_F26Dot6 distance,
+ FT_F26Dot6 compensation )
+ {
+ FT_F26Dot6 val;
+
+ FT_UNUSED_EXEC;
+
+
+ if ( distance >= 0 )
+ {
+ val = FT_PIX_FLOOR( distance + compensation ) + 32;
+ if ( distance && val < 0 )
+ val = 0;
+ }
+ else
+ {
+ val = -( FT_PIX_FLOOR( compensation - distance ) + 32 );
+ if ( val > 0 )
+ val = 0;
+ }
+
+ return val;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Round_Down_To_Grid */
+ /* */
+ /* <Description> */
+ /* Rounds value down to grid after adding engine compensation. */
+ /* */
+ /* <Input> */
+ /* distance :: The distance to round. */
+ /* */
+ /* compensation :: The engine compensation. */
+ /* */
+ /* <Return> */
+ /* Rounded distance. */
+ /* */
+ static FT_F26Dot6
+ Round_Down_To_Grid( EXEC_OP_ FT_F26Dot6 distance,
+ FT_F26Dot6 compensation )
+ {
+ FT_F26Dot6 val;
+
+ FT_UNUSED_EXEC;
+
+
+ if ( distance >= 0 )
+ {
+ val = distance + compensation;
+ if ( distance && val > 0 )
+ val &= ~63;
+ else
+ val = 0;
+ }
+ else
+ {
+ val = -( ( compensation - distance ) & -64 );
+ if ( val > 0 )
+ val = 0;
+ }
+
+ return val;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Round_Up_To_Grid */
+ /* */
+ /* <Description> */
+ /* Rounds value up to grid after adding engine compensation. */
+ /* */
+ /* <Input> */
+ /* distance :: The distance to round. */
+ /* */
+ /* compensation :: The engine compensation. */
+ /* */
+ /* <Return> */
+ /* Rounded distance. */
+ /* */
+ static FT_F26Dot6
+ Round_Up_To_Grid( EXEC_OP_ FT_F26Dot6 distance,
+ FT_F26Dot6 compensation )
+ {
+ FT_F26Dot6 val;
+
+ FT_UNUSED_EXEC;
+
+
+ if ( distance >= 0 )
+ {
+ val = distance + compensation + 63;
+ if ( distance && val > 0 )
+ val &= ~63;
+ else
+ val = 0;
+ }
+ else
+ {
+ val = -FT_PIX_CEIL( compensation - distance );
+ if ( val > 0 )
+ val = 0;
+ }
+
+ return val;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Round_To_Double_Grid */
+ /* */
+ /* <Description> */
+ /* Rounds value to double grid after adding engine compensation. */
+ /* */
+ /* <Input> */
+ /* distance :: The distance to round. */
+ /* */
+ /* compensation :: The engine compensation. */
+ /* */
+ /* <Return> */
+ /* Rounded distance. */
+ /* */
+ static FT_F26Dot6
+ Round_To_Double_Grid( EXEC_OP_ FT_F26Dot6 distance,
+ FT_F26Dot6 compensation )
+ {
+ FT_F26Dot6 val;
+
+ FT_UNUSED_EXEC;
+
+
+ if ( distance >= 0 )
+ {
+ val = distance + compensation + 16;
+ if ( distance && val > 0 )
+ val &= ~31;
+ else
+ val = 0;
+ }
+ else
+ {
+ val = -FT_PAD_ROUND( compensation - distance, 32 );
+ if ( val > 0 )
+ val = 0;
+ }
+
+ return val;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Round_Super */
+ /* */
+ /* <Description> */
+ /* Super-rounds value to grid after adding engine compensation. */
+ /* */
+ /* <Input> */
+ /* distance :: The distance to round. */
+ /* */
+ /* compensation :: The engine compensation. */
+ /* */
+ /* <Return> */
+ /* Rounded distance. */
+ /* */
+ /* <Note> */
+ /* The TrueType specification says very few about the relationship */
+ /* between rounding and engine compensation. However, it seems from */
+ /* the description of super round that we should add the compensation */
+ /* before rounding. */
+ /* */
+ static FT_F26Dot6
+ Round_Super( EXEC_OP_ FT_F26Dot6 distance,
+ FT_F26Dot6 compensation )
+ {
+ FT_F26Dot6 val;
+
+
+ if ( distance >= 0 )
+ {
+ val = ( distance - CUR.phase + CUR.threshold + compensation ) &
+ -CUR.period;
+ if ( distance && val < 0 )
+ val = 0;
+ val += CUR.phase;
+ }
+ else
+ {
+ val = -( ( CUR.threshold - CUR.phase - distance + compensation ) &
+ -CUR.period );
+ if ( val > 0 )
+ val = 0;
+ val -= CUR.phase;
+ }
+
+ return val;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Round_Super_45 */
+ /* */
+ /* <Description> */
+ /* Super-rounds value to grid after adding engine compensation. */
+ /* */
+ /* <Input> */
+ /* distance :: The distance to round. */
+ /* */
+ /* compensation :: The engine compensation. */
+ /* */
+ /* <Return> */
+ /* Rounded distance. */
+ /* */
+ /* <Note> */
+ /* There is a separate function for Round_Super_45() as we may need */
+ /* greater precision. */
+ /* */
+ static FT_F26Dot6
+ Round_Super_45( EXEC_OP_ FT_F26Dot6 distance,
+ FT_F26Dot6 compensation )
+ {
+ FT_F26Dot6 val;
+
+
+ if ( distance >= 0 )
+ {
+ val = ( ( distance - CUR.phase + CUR.threshold + compensation ) /
+ CUR.period ) * CUR.period;
+ if ( distance && val < 0 )
+ val = 0;
+ val += CUR.phase;
+ }
+ else
+ {
+ val = -( ( ( CUR.threshold - CUR.phase - distance + compensation ) /
+ CUR.period ) * CUR.period );
+ if ( val > 0 )
+ val = 0;
+ val -= CUR.phase;
+ }
+
+ return val;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Compute_Round */
+ /* */
+ /* <Description> */
+ /* Sets the rounding mode. */
+ /* */
+ /* <Input> */
+ /* round_mode :: The rounding mode to be used. */
+ /* */
+ static void
+ Compute_Round( EXEC_OP_ FT_Byte round_mode )
+ {
+ switch ( round_mode )
+ {
+ case TT_Round_Off:
+ CUR.func_round = (TT_Round_Func)Round_None;
+ break;
+
+ case TT_Round_To_Grid:
+ CUR.func_round = (TT_Round_Func)Round_To_Grid;
+ break;
+
+ case TT_Round_Up_To_Grid:
+ CUR.func_round = (TT_Round_Func)Round_Up_To_Grid;
+ break;
+
+ case TT_Round_Down_To_Grid:
+ CUR.func_round = (TT_Round_Func)Round_Down_To_Grid;
+ break;
+
+ case TT_Round_To_Half_Grid:
+ CUR.func_round = (TT_Round_Func)Round_To_Half_Grid;
+ break;
+
+ case TT_Round_To_Double_Grid:
+ CUR.func_round = (TT_Round_Func)Round_To_Double_Grid;
+ break;
+
+ case TT_Round_Super:
+ CUR.func_round = (TT_Round_Func)Round_Super;
+ break;
+
+ case TT_Round_Super_45:
+ CUR.func_round = (TT_Round_Func)Round_Super_45;
+ break;
+ }
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* SetSuperRound */
+ /* */
+ /* <Description> */
+ /* Sets Super Round parameters. */
+ /* */
+ /* <Input> */
+ /* GridPeriod :: The grid period. */
+ /* */
+ /* selector :: The SROUND opcode. */
+ /* */
+ static void
+ SetSuperRound( EXEC_OP_ FT_F26Dot6 GridPeriod,
+ FT_Long selector )
+ {
+ switch ( (FT_Int)( selector & 0xC0 ) )
+ {
+ case 0:
+ CUR.period = GridPeriod / 2;
+ break;
+
+ case 0x40:
+ CUR.period = GridPeriod;
+ break;
+
+ case 0x80:
+ CUR.period = GridPeriod * 2;
+ break;
+
+ /* This opcode is reserved, but... */
+
+ case 0xC0:
+ CUR.period = GridPeriod;
+ break;
+ }
+
+ switch ( (FT_Int)( selector & 0x30 ) )
+ {
+ case 0:
+ CUR.phase = 0;
+ break;
+
+ case 0x10:
+ CUR.phase = CUR.period / 4;
+ break;
+
+ case 0x20:
+ CUR.phase = CUR.period / 2;
+ break;
+
+ case 0x30:
+ CUR.phase = CUR.period * 3 / 4;
+ break;
+ }
+
+ if ( ( selector & 0x0F ) == 0 )
+ CUR.threshold = CUR.period - 1;
+ else
+ CUR.threshold = ( (FT_Int)( selector & 0x0F ) - 4 ) * CUR.period / 8;
+
+ CUR.period /= 256;
+ CUR.phase /= 256;
+ CUR.threshold /= 256;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Project */
+ /* */
+ /* <Description> */
+ /* Computes the projection of vector given by (v2-v1) along the */
+ /* current projection vector. */
+ /* */
+ /* <Input> */
+ /* v1 :: First input vector. */
+ /* v2 :: Second input vector. */
+ /* */
+ /* <Return> */
+ /* The distance in F26dot6 format. */
+ /* */
+ static FT_F26Dot6
+ Project( EXEC_OP_ FT_Pos dx,
+ FT_Pos dy )
+ {
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+ FT_ASSERT( !CUR.face->unpatented_hinting );
+#endif
+
+ return TT_DotFix14( (FT_UInt32)dx, (FT_UInt32)dy,
+ CUR.GS.projVector.x,
+ CUR.GS.projVector.y );
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Dual_Project */
+ /* */
+ /* <Description> */
+ /* Computes the projection of the vector given by (v2-v1) along the */
+ /* current dual vector. */
+ /* */
+ /* <Input> */
+ /* v1 :: First input vector. */
+ /* v2 :: Second input vector. */
+ /* */
+ /* <Return> */
+ /* The distance in F26dot6 format. */
+ /* */
+ static FT_F26Dot6
+ Dual_Project( EXEC_OP_ FT_Pos dx,
+ FT_Pos dy )
+ {
+ return TT_DotFix14( (FT_UInt32)dx, (FT_UInt32)dy,
+ CUR.GS.dualVector.x,
+ CUR.GS.dualVector.y );
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Project_x */
+ /* */
+ /* <Description> */
+ /* Computes the projection of the vector given by (v2-v1) along the */
+ /* horizontal axis. */
+ /* */
+ /* <Input> */
+ /* v1 :: First input vector. */
+ /* v2 :: Second input vector. */
+ /* */
+ /* <Return> */
+ /* The distance in F26dot6 format. */
+ /* */
+ static FT_F26Dot6
+ Project_x( EXEC_OP_ FT_Pos dx,
+ FT_Pos dy )
+ {
+ FT_UNUSED_EXEC;
+ FT_UNUSED( dy );
+
+ return dx;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Project_y */
+ /* */
+ /* <Description> */
+ /* Computes the projection of the vector given by (v2-v1) along the */
+ /* vertical axis. */
+ /* */
+ /* <Input> */
+ /* v1 :: First input vector. */
+ /* v2 :: Second input vector. */
+ /* */
+ /* <Return> */
+ /* The distance in F26dot6 format. */
+ /* */
+ static FT_F26Dot6
+ Project_y( EXEC_OP_ FT_Pos dx,
+ FT_Pos dy )
+ {
+ FT_UNUSED_EXEC;
+ FT_UNUSED( dx );
+
+ return dy;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Compute_Funcs */
+ /* */
+ /* <Description> */
+ /* Computes the projection and movement function pointers according */
+ /* to the current graphics state. */
+ /* */
+ static void
+ Compute_Funcs( EXEC_OP )
+ {
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+ if ( CUR.face->unpatented_hinting )
+ {
+ /* If both vectors point rightwards along the x axis, set */
+ /* `both-x-axis' true, otherwise set it false. The x values only */
+ /* need be tested because the vector has been normalised to a unit */
+ /* vector of length 0x4000 = unity. */
+ CUR.GS.both_x_axis = (FT_Bool)( CUR.GS.projVector.x == 0x4000 &&
+ CUR.GS.freeVector.x == 0x4000 );
+
+ /* Throw away projection and freedom vector information */
+ /* because the patents don't allow them to be stored. */
+ /* The relevant US Patents are 5155805 and 5325479. */
+ CUR.GS.projVector.x = 0;
+ CUR.GS.projVector.y = 0;
+ CUR.GS.freeVector.x = 0;
+ CUR.GS.freeVector.y = 0;
+
+ if ( CUR.GS.both_x_axis )
+ {
+ CUR.func_project = Project_x;
+ CUR.func_move = Direct_Move_X;
+ CUR.func_move_orig = Direct_Move_Orig_X;
+ }
+ else
+ {
+ CUR.func_project = Project_y;
+ CUR.func_move = Direct_Move_Y;
+ CUR.func_move_orig = Direct_Move_Orig_Y;
+ }
+
+ if ( CUR.GS.dualVector.x == 0x4000 )
+ CUR.func_dualproj = Project_x;
+ else if ( CUR.GS.dualVector.y == 0x4000 )
+ CUR.func_dualproj = Project_y;
+ else
+ CUR.func_dualproj = Dual_Project;
+
+ /* Force recalculation of cached aspect ratio */
+ CUR.tt_metrics.ratio = 0;
+
+ return;
+ }
+#endif /* TT_CONFIG_OPTION_UNPATENTED_HINTING */
+
+ if ( CUR.GS.freeVector.x == 0x4000 )
+ CUR.F_dot_P = CUR.GS.projVector.x;
+ else if ( CUR.GS.freeVector.y == 0x4000 )
+ CUR.F_dot_P = CUR.GS.projVector.y;
+ else
+ CUR.F_dot_P = ( (FT_Long)CUR.GS.projVector.x * CUR.GS.freeVector.x +
+ (FT_Long)CUR.GS.projVector.y * CUR.GS.freeVector.y ) >>
+ 14;
+
+ if ( CUR.GS.projVector.x == 0x4000 )
+ CUR.func_project = (TT_Project_Func)Project_x;
+ else if ( CUR.GS.projVector.y == 0x4000 )
+ CUR.func_project = (TT_Project_Func)Project_y;
+ else
+ CUR.func_project = (TT_Project_Func)Project;
+
+ if ( CUR.GS.dualVector.x == 0x4000 )
+ CUR.func_dualproj = (TT_Project_Func)Project_x;
+ else if ( CUR.GS.dualVector.y == 0x4000 )
+ CUR.func_dualproj = (TT_Project_Func)Project_y;
+ else
+ CUR.func_dualproj = (TT_Project_Func)Dual_Project;
+
+ CUR.func_move = (TT_Move_Func)Direct_Move;
+ CUR.func_move_orig = (TT_Move_Func)Direct_Move_Orig;
+
+ if ( CUR.F_dot_P == 0x4000L )
+ {
+ if ( CUR.GS.freeVector.x == 0x4000 )
+ {
+ CUR.func_move = (TT_Move_Func)Direct_Move_X;
+ CUR.func_move_orig = (TT_Move_Func)Direct_Move_Orig_X;
+ }
+ else if ( CUR.GS.freeVector.y == 0x4000 )
+ {
+ CUR.func_move = (TT_Move_Func)Direct_Move_Y;
+ CUR.func_move_orig = (TT_Move_Func)Direct_Move_Orig_Y;
+ }
+ }
+
+ /* at small sizes, F_dot_P can become too small, resulting */
+ /* in overflows and `spikes' in a number of glyphs like `w'. */
+
+ if ( FT_ABS( CUR.F_dot_P ) < 0x400L )
+ CUR.F_dot_P = 0x4000L;
+
+ /* Disable cached aspect ratio */
+ CUR.tt_metrics.ratio = 0;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Normalize */
+ /* */
+ /* <Description> */
+ /* Norms a vector. */
+ /* */
+ /* <Input> */
+ /* Vx :: The horizontal input vector coordinate. */
+ /* Vy :: The vertical input vector coordinate. */
+ /* */
+ /* <Output> */
+ /* R :: The normed unit vector. */
+ /* */
+ /* <Return> */
+ /* Returns FAILURE if a vector parameter is zero. */
+ /* */
+ /* <Note> */
+ /* In case Vx and Vy are both zero, Normalize() returns SUCCESS, and */
+ /* R is undefined. */
+ /* */
+ static FT_Bool
+ Normalize( EXEC_OP_ FT_F26Dot6 Vx,
+ FT_F26Dot6 Vy,
+ FT_UnitVector* R )
+ {
+ FT_F26Dot6 W;
+
+ FT_UNUSED_EXEC;
+
+
+ if ( FT_ABS( Vx ) < 0x4000L && FT_ABS( Vy ) < 0x4000L )
+ {
+ if ( Vx == 0 && Vy == 0 )
+ {
+ /* XXX: UNDOCUMENTED! It seems that it is possible to try */
+ /* to normalize the vector (0,0). Return immediately. */
+ return SUCCESS;
+ }
+
+ Vx *= 0x4000;
+ Vy *= 0x4000;
+ }
+
+ W = FT_Hypot( Vx, Vy );
+
+ R->x = (FT_F2Dot14)TT_DivFix14( Vx, W );
+ R->y = (FT_F2Dot14)TT_DivFix14( Vy, W );
+
+ return SUCCESS;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* Here we start with the implementation of the various opcodes. */
+ /* */
+ /*************************************************************************/
+
+
+ static FT_Bool
+ Ins_SxVTL( EXEC_OP_ FT_UShort aIdx1,
+ FT_UShort aIdx2,
+ FT_Int aOpc,
+ FT_UnitVector* Vec )
+ {
+ FT_Long A, B, C;
+ FT_Vector* p1;
+ FT_Vector* p2;
+
+
+ if ( BOUNDS( aIdx1, CUR.zp2.n_points ) ||
+ BOUNDS( aIdx2, CUR.zp1.n_points ) )
+ {
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Invalid_Reference );
+ return FAILURE;
+ }
+
+ p1 = CUR.zp1.cur + aIdx2;
+ p2 = CUR.zp2.cur + aIdx1;
+
+ A = p1->x - p2->x;
+ B = p1->y - p2->y;
+
+ /* If p1 == p2, SPVTL and SFVTL behave the same as */
+ /* SPVTCA[X] and SFVTCA[X], respectively. */
+ /* */
+ /* Confirmed by Greg Hitchcock. */
+
+ if ( A == 0 && B == 0 )
+ {
+ A = 0x4000;
+ aOpc = 0;
+ }
+
+ if ( ( aOpc & 1 ) != 0 )
+ {
+ C = B; /* counter clockwise rotation */
+ B = A;
+ A = -C;
+ }
+
+ NORMalize( A, B, Vec );
+
+ return SUCCESS;
+ }
+
+
+ /* When not using the big switch statements, the interpreter uses a */
+ /* call table defined later below in this source. Each opcode must */
+ /* thus have a corresponding function, even trivial ones. */
+ /* */
+ /* They are all defined there. */
+
+#define DO_SVTCA \
+ { \
+ FT_Short A, B; \
+ \
+ \
+ A = (FT_Short)( CUR.opcode & 1 ) << 14; \
+ B = A ^ (FT_Short)0x4000; \
+ \
+ CUR.GS.freeVector.x = A; \
+ CUR.GS.projVector.x = A; \
+ CUR.GS.dualVector.x = A; \
+ \
+ CUR.GS.freeVector.y = B; \
+ CUR.GS.projVector.y = B; \
+ CUR.GS.dualVector.y = B; \
+ \
+ COMPUTE_Funcs(); \
+ }
+
+
+#define DO_SPVTCA \
+ { \
+ FT_Short A, B; \
+ \
+ \
+ A = (FT_Short)( CUR.opcode & 1 ) << 14; \
+ B = A ^ (FT_Short)0x4000; \
+ \
+ CUR.GS.projVector.x = A; \
+ CUR.GS.dualVector.x = A; \
+ \
+ CUR.GS.projVector.y = B; \
+ CUR.GS.dualVector.y = B; \
+ \
+ GUESS_VECTOR( freeVector ); \
+ \
+ COMPUTE_Funcs(); \
+ }
+
+
+#define DO_SFVTCA \
+ { \
+ FT_Short A, B; \
+ \
+ \
+ A = (FT_Short)( CUR.opcode & 1 ) << 14; \
+ B = A ^ (FT_Short)0x4000; \
+ \
+ CUR.GS.freeVector.x = A; \
+ CUR.GS.freeVector.y = B; \
+ \
+ GUESS_VECTOR( projVector ); \
+ \
+ COMPUTE_Funcs(); \
+ }
+
+
+#define DO_SPVTL \
+ if ( INS_SxVTL( (FT_UShort)args[1], \
+ (FT_UShort)args[0], \
+ CUR.opcode, \
+ &CUR.GS.projVector ) == SUCCESS ) \
+ { \
+ CUR.GS.dualVector = CUR.GS.projVector; \
+ GUESS_VECTOR( freeVector ); \
+ COMPUTE_Funcs(); \
+ }
+
+
+#define DO_SFVTL \
+ if ( INS_SxVTL( (FT_UShort)args[1], \
+ (FT_UShort)args[0], \
+ CUR.opcode, \
+ &CUR.GS.freeVector ) == SUCCESS ) \
+ { \
+ GUESS_VECTOR( projVector ); \
+ COMPUTE_Funcs(); \
+ }
+
+
+#define DO_SFVTPV \
+ GUESS_VECTOR( projVector ); \
+ CUR.GS.freeVector = CUR.GS.projVector; \
+ COMPUTE_Funcs();
+
+
+#define DO_SPVFS \
+ { \
+ FT_Short S; \
+ FT_Long X, Y; \
+ \
+ \
+ /* Only use low 16bits, then sign extend */ \
+ S = (FT_Short)args[1]; \
+ Y = (FT_Long)S; \
+ S = (FT_Short)args[0]; \
+ X = (FT_Long)S; \
+ \
+ NORMalize( X, Y, &CUR.GS.projVector ); \
+ \
+ CUR.GS.dualVector = CUR.GS.projVector; \
+ GUESS_VECTOR( freeVector ); \
+ COMPUTE_Funcs(); \
+ }
+
+
+#define DO_SFVFS \
+ { \
+ FT_Short S; \
+ FT_Long X, Y; \
+ \
+ \
+ /* Only use low 16bits, then sign extend */ \
+ S = (FT_Short)args[1]; \
+ Y = (FT_Long)S; \
+ S = (FT_Short)args[0]; \
+ X = S; \
+ \
+ NORMalize( X, Y, &CUR.GS.freeVector ); \
+ GUESS_VECTOR( projVector ); \
+ COMPUTE_Funcs(); \
+ }
+
+
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+#define DO_GPV \
+ if ( CUR.face->unpatented_hinting ) \
+ { \
+ args[0] = CUR.GS.both_x_axis ? 0x4000 : 0; \
+ args[1] = CUR.GS.both_x_axis ? 0 : 0x4000; \
+ } \
+ else \
+ { \
+ args[0] = CUR.GS.projVector.x; \
+ args[1] = CUR.GS.projVector.y; \
+ }
+#else
+#define DO_GPV \
+ args[0] = CUR.GS.projVector.x; \
+ args[1] = CUR.GS.projVector.y;
+#endif
+
+
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+#define DO_GFV \
+ if ( CUR.face->unpatented_hinting ) \
+ { \
+ args[0] = CUR.GS.both_x_axis ? 0x4000 : 0; \
+ args[1] = CUR.GS.both_x_axis ? 0 : 0x4000; \
+ } \
+ else \
+ { \
+ args[0] = CUR.GS.freeVector.x; \
+ args[1] = CUR.GS.freeVector.y; \
+ }
+#else
+#define DO_GFV \
+ args[0] = CUR.GS.freeVector.x; \
+ args[1] = CUR.GS.freeVector.y;
+#endif
+
+
+#define DO_SRP0 \
+ CUR.GS.rp0 = (FT_UShort)args[0];
+
+
+#define DO_SRP1 \
+ CUR.GS.rp1 = (FT_UShort)args[0];
+
+
+#define DO_SRP2 \
+ CUR.GS.rp2 = (FT_UShort)args[0];
+
+
+#define DO_RTHG \
+ CUR.GS.round_state = TT_Round_To_Half_Grid; \
+ CUR.func_round = (TT_Round_Func)Round_To_Half_Grid;
+
+
+#define DO_RTG \
+ CUR.GS.round_state = TT_Round_To_Grid; \
+ CUR.func_round = (TT_Round_Func)Round_To_Grid;
+
+
+#define DO_RTDG \
+ CUR.GS.round_state = TT_Round_To_Double_Grid; \
+ CUR.func_round = (TT_Round_Func)Round_To_Double_Grid;
+
+
+#define DO_RUTG \
+ CUR.GS.round_state = TT_Round_Up_To_Grid; \
+ CUR.func_round = (TT_Round_Func)Round_Up_To_Grid;
+
+
+#define DO_RDTG \
+ CUR.GS.round_state = TT_Round_Down_To_Grid; \
+ CUR.func_round = (TT_Round_Func)Round_Down_To_Grid;
+
+
+#define DO_ROFF \
+ CUR.GS.round_state = TT_Round_Off; \
+ CUR.func_round = (TT_Round_Func)Round_None;
+
+
+#define DO_SROUND \
+ SET_SuperRound( 0x4000, args[0] ); \
+ CUR.GS.round_state = TT_Round_Super; \
+ CUR.func_round = (TT_Round_Func)Round_Super;
+
+
+#define DO_S45ROUND \
+ SET_SuperRound( 0x2D41, args[0] ); \
+ CUR.GS.round_state = TT_Round_Super_45; \
+ CUR.func_round = (TT_Round_Func)Round_Super_45;
+
+
+#define DO_SLOOP \
+ if ( args[0] < 0 ) \
+ CUR.error = FT_THROW( Bad_Argument ); \
+ else \
+ CUR.GS.loop = args[0];
+
+
+#define DO_SMD \
+ CUR.GS.minimum_distance = args[0];
+
+
+#define DO_SCVTCI \
+ CUR.GS.control_value_cutin = (FT_F26Dot6)args[0];
+
+
+#define DO_SSWCI \
+ CUR.GS.single_width_cutin = (FT_F26Dot6)args[0];
+
+
+#define DO_SSW \
+ CUR.GS.single_width_value = FT_MulFix( args[0], \
+ CUR.tt_metrics.scale );
+
+
+#define DO_FLIPON \
+ CUR.GS.auto_flip = TRUE;
+
+
+#define DO_FLIPOFF \
+ CUR.GS.auto_flip = FALSE;
+
+
+#define DO_SDB \
+ CUR.GS.delta_base = (FT_Short)args[0];
+
+
+#define DO_SDS \
+ CUR.GS.delta_shift = (FT_Short)args[0];
+
+
+#define DO_MD /* nothing */
+
+
+#define DO_MPPEM \
+ args[0] = CURRENT_Ppem();
+
+
+ /* Note: The pointSize should be irrelevant in a given font program; */
+ /* we thus decide to return only the ppem. */
+#if 0
+
+#define DO_MPS \
+ args[0] = CUR.metrics.pointSize;
+
+#else
+
+#define DO_MPS \
+ args[0] = CURRENT_Ppem();
+
+#endif /* 0 */
+
+
+#define DO_DUP \
+ args[1] = args[0];
+
+
+#define DO_CLEAR \
+ CUR.new_top = 0;
+
+
+#define DO_SWAP \
+ { \
+ FT_Long L; \
+ \
+ \
+ L = args[0]; \
+ args[0] = args[1]; \
+ args[1] = L; \
+ }
+
+
+#define DO_DEPTH \
+ args[0] = CUR.top;
+
+
+#define DO_CINDEX \
+ { \
+ FT_Long L; \
+ \
+ \
+ L = args[0]; \
+ \
+ if ( L <= 0 || L > CUR.args ) \
+ { \
+ if ( CUR.pedantic_hinting ) \
+ CUR.error = FT_THROW( Invalid_Reference ); \
+ args[0] = 0; \
+ } \
+ else \
+ args[0] = CUR.stack[CUR.args - L]; \
+ }
+
+
+#define DO_JROT \
+ if ( args[1] != 0 ) \
+ { \
+ if ( args[0] == 0 && CUR.args == 0 ) \
+ CUR.error = FT_THROW( Bad_Argument ); \
+ CUR.IP += args[0]; \
+ if ( CUR.IP < 0 || \
+ ( CUR.callTop > 0 && \
+ CUR.IP > CUR.callStack[CUR.callTop - 1].Cur_End ) ) \
+ CUR.error = FT_THROW( Bad_Argument ); \
+ CUR.step_ins = FALSE; \
+ }
+
+
+#define DO_JMPR \
+ if ( args[0] == 0 && CUR.args == 0 ) \
+ CUR.error = FT_THROW( Bad_Argument ); \
+ CUR.IP += args[0]; \
+ if ( CUR.IP < 0 || \
+ ( CUR.callTop > 0 && \
+ CUR.IP > CUR.callStack[CUR.callTop - 1].Cur_End ) ) \
+ CUR.error = FT_THROW( Bad_Argument ); \
+ CUR.step_ins = FALSE;
+
+
+#define DO_JROF \
+ if ( args[1] == 0 ) \
+ { \
+ if ( args[0] == 0 && CUR.args == 0 ) \
+ CUR.error = FT_THROW( Bad_Argument ); \
+ CUR.IP += args[0]; \
+ if ( CUR.IP < 0 || \
+ ( CUR.callTop > 0 && \
+ CUR.IP > CUR.callStack[CUR.callTop - 1].Cur_End ) ) \
+ CUR.error = FT_THROW( Bad_Argument ); \
+ CUR.step_ins = FALSE; \
+ }
+
+
+#define DO_LT \
+ args[0] = ( args[0] < args[1] );
+
+
+#define DO_LTEQ \
+ args[0] = ( args[0] <= args[1] );
+
+
+#define DO_GT \
+ args[0] = ( args[0] > args[1] );
+
+
+#define DO_GTEQ \
+ args[0] = ( args[0] >= args[1] );
+
+
+#define DO_EQ \
+ args[0] = ( args[0] == args[1] );
+
+
+#define DO_NEQ \
+ args[0] = ( args[0] != args[1] );
+
+
+#define DO_ODD \
+ args[0] = ( ( CUR_Func_round( args[0], 0 ) & 127 ) == 64 );
+
+
+#define DO_EVEN \
+ args[0] = ( ( CUR_Func_round( args[0], 0 ) & 127 ) == 0 );
+
+
+#define DO_AND \
+ args[0] = ( args[0] && args[1] );
+
+
+#define DO_OR \
+ args[0] = ( args[0] || args[1] );
+
+
+#define DO_NOT \
+ args[0] = !args[0];
+
+
+#define DO_ADD \
+ args[0] += args[1];
+
+
+#define DO_SUB \
+ args[0] -= args[1];
+
+
+#define DO_DIV \
+ if ( args[1] == 0 ) \
+ CUR.error = FT_THROW( Divide_By_Zero ); \
+ else \
+ args[0] = FT_MulDiv_No_Round( args[0], 64L, args[1] );
+
+
+#define DO_MUL \
+ args[0] = FT_MulDiv( args[0], args[1], 64L );
+
+
+#define DO_ABS \
+ args[0] = FT_ABS( args[0] );
+
+
+#define DO_NEG \
+ args[0] = -args[0];
+
+
+#define DO_FLOOR \
+ args[0] = FT_PIX_FLOOR( args[0] );
+
+
+#define DO_CEILING \
+ args[0] = FT_PIX_CEIL( args[0] );
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+
+#define DO_RS \
+ { \
+ FT_ULong I = (FT_ULong)args[0]; \
+ \
+ \
+ if ( BOUNDSL( I, CUR.storeSize ) ) \
+ { \
+ if ( CUR.pedantic_hinting ) \
+ ARRAY_BOUND_ERROR; \
+ else \
+ args[0] = 0; \
+ } \
+ else \
+ { \
+ /* subpixel hinting - avoid Typeman Dstroke and */ \
+ /* IStroke and Vacuform rounds */ \
+ \
+ if ( SUBPIXEL_HINTING && \
+ CUR.ignore_x_mode && \
+ ( ( I == 24 && \
+ ( CUR.face->sph_found_func_flags & \
+ ( SPH_FDEF_SPACING_1 | \
+ SPH_FDEF_SPACING_2 ) ) ) || \
+ ( I == 22 && \
+ ( CUR.sph_in_func_flags & \
+ SPH_FDEF_TYPEMAN_STROKES ) ) || \
+ ( I == 8 && \
+ ( CUR.face->sph_found_func_flags & \
+ SPH_FDEF_VACUFORM_ROUND_1 ) && \
+ CUR.iup_called ) ) ) \
+ args[0] = 0; \
+ else \
+ args[0] = CUR.storage[I]; \
+ } \
+ }
+
+#else /* !TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+#define DO_RS \
+ { \
+ FT_ULong I = (FT_ULong)args[0]; \
+ \
+ \
+ if ( BOUNDSL( I, CUR.storeSize ) ) \
+ { \
+ if ( CUR.pedantic_hinting ) \
+ { \
+ ARRAY_BOUND_ERROR; \
+ } \
+ else \
+ args[0] = 0; \
+ } \
+ else \
+ args[0] = CUR.storage[I]; \
+ }
+
+#endif /* !TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+
+#define DO_WS \
+ { \
+ FT_ULong I = (FT_ULong)args[0]; \
+ \
+ \
+ if ( BOUNDSL( I, CUR.storeSize ) ) \
+ { \
+ if ( CUR.pedantic_hinting ) \
+ { \
+ ARRAY_BOUND_ERROR; \
+ } \
+ } \
+ else \
+ CUR.storage[I] = args[1]; \
+ }
+
+
+#define DO_RCVT \
+ { \
+ FT_ULong I = (FT_ULong)args[0]; \
+ \
+ \
+ if ( BOUNDSL( I, CUR.cvtSize ) ) \
+ { \
+ if ( CUR.pedantic_hinting ) \
+ { \
+ ARRAY_BOUND_ERROR; \
+ } \
+ else \
+ args[0] = 0; \
+ } \
+ else \
+ args[0] = CUR_Func_read_cvt( I ); \
+ }
+
+
+#define DO_WCVTP \
+ { \
+ FT_ULong I = (FT_ULong)args[0]; \
+ \
+ \
+ if ( BOUNDSL( I, CUR.cvtSize ) ) \
+ { \
+ if ( CUR.pedantic_hinting ) \
+ { \
+ ARRAY_BOUND_ERROR; \
+ } \
+ } \
+ else \
+ CUR_Func_write_cvt( I, args[1] ); \
+ }
+
+
+#define DO_WCVTF \
+ { \
+ FT_ULong I = (FT_ULong)args[0]; \
+ \
+ \
+ if ( BOUNDSL( I, CUR.cvtSize ) ) \
+ { \
+ if ( CUR.pedantic_hinting ) \
+ { \
+ ARRAY_BOUND_ERROR; \
+ } \
+ } \
+ else \
+ CUR.cvt[I] = FT_MulFix( args[1], CUR.tt_metrics.scale ); \
+ }
+
+
+#define DO_DEBUG \
+ CUR.error = FT_THROW( Debug_OpCode );
+
+
+#define DO_ROUND \
+ args[0] = CUR_Func_round( \
+ args[0], \
+ CUR.tt_metrics.compensations[CUR.opcode - 0x68] );
+
+
+#define DO_NROUND \
+ args[0] = ROUND_None( args[0], \
+ CUR.tt_metrics.compensations[CUR.opcode - 0x6C] );
+
+
+#define DO_MAX \
+ if ( args[1] > args[0] ) \
+ args[0] = args[1];
+
+
+#define DO_MIN \
+ if ( args[1] < args[0] ) \
+ args[0] = args[1];
+
+
+#ifndef TT_CONFIG_OPTION_INTERPRETER_SWITCH
+
+
+#undef ARRAY_BOUND_ERROR
+#define ARRAY_BOUND_ERROR \
+ { \
+ CUR.error = FT_THROW( Invalid_Reference ); \
+ return; \
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SVTCA[a]: Set (F and P) Vectors to Coordinate Axis */
+ /* Opcode range: 0x00-0x01 */
+ /* Stack: --> */
+ /* */
+ static void
+ Ins_SVTCA( INS_ARG )
+ {
+ DO_SVTCA
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SPVTCA[a]: Set PVector to Coordinate Axis */
+ /* Opcode range: 0x02-0x03 */
+ /* Stack: --> */
+ /* */
+ static void
+ Ins_SPVTCA( INS_ARG )
+ {
+ DO_SPVTCA
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SFVTCA[a]: Set FVector to Coordinate Axis */
+ /* Opcode range: 0x04-0x05 */
+ /* Stack: --> */
+ /* */
+ static void
+ Ins_SFVTCA( INS_ARG )
+ {
+ DO_SFVTCA
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SPVTL[a]: Set PVector To Line */
+ /* Opcode range: 0x06-0x07 */
+ /* Stack: uint32 uint32 --> */
+ /* */
+ static void
+ Ins_SPVTL( INS_ARG )
+ {
+ DO_SPVTL
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SFVTL[a]: Set FVector To Line */
+ /* Opcode range: 0x08-0x09 */
+ /* Stack: uint32 uint32 --> */
+ /* */
+ static void
+ Ins_SFVTL( INS_ARG )
+ {
+ DO_SFVTL
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SFVTPV[]: Set FVector To PVector */
+ /* Opcode range: 0x0E */
+ /* Stack: --> */
+ /* */
+ static void
+ Ins_SFVTPV( INS_ARG )
+ {
+ DO_SFVTPV
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SPVFS[]: Set PVector From Stack */
+ /* Opcode range: 0x0A */
+ /* Stack: f2.14 f2.14 --> */
+ /* */
+ static void
+ Ins_SPVFS( INS_ARG )
+ {
+ DO_SPVFS
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SFVFS[]: Set FVector From Stack */
+ /* Opcode range: 0x0B */
+ /* Stack: f2.14 f2.14 --> */
+ /* */
+ static void
+ Ins_SFVFS( INS_ARG )
+ {
+ DO_SFVFS
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* GPV[]: Get Projection Vector */
+ /* Opcode range: 0x0C */
+ /* Stack: ef2.14 --> ef2.14 */
+ /* */
+ static void
+ Ins_GPV( INS_ARG )
+ {
+ DO_GPV
+ }
+
+
+ /*************************************************************************/
+ /* GFV[]: Get Freedom Vector */
+ /* Opcode range: 0x0D */
+ /* Stack: ef2.14 --> ef2.14 */
+ /* */
+ static void
+ Ins_GFV( INS_ARG )
+ {
+ DO_GFV
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SRP0[]: Set Reference Point 0 */
+ /* Opcode range: 0x10 */
+ /* Stack: uint32 --> */
+ /* */
+ static void
+ Ins_SRP0( INS_ARG )
+ {
+ DO_SRP0
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SRP1[]: Set Reference Point 1 */
+ /* Opcode range: 0x11 */
+ /* Stack: uint32 --> */
+ /* */
+ static void
+ Ins_SRP1( INS_ARG )
+ {
+ DO_SRP1
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SRP2[]: Set Reference Point 2 */
+ /* Opcode range: 0x12 */
+ /* Stack: uint32 --> */
+ /* */
+ static void
+ Ins_SRP2( INS_ARG )
+ {
+ DO_SRP2
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* RTHG[]: Round To Half Grid */
+ /* Opcode range: 0x19 */
+ /* Stack: --> */
+ /* */
+ static void
+ Ins_RTHG( INS_ARG )
+ {
+ DO_RTHG
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* RTG[]: Round To Grid */
+ /* Opcode range: 0x18 */
+ /* Stack: --> */
+ /* */
+ static void
+ Ins_RTG( INS_ARG )
+ {
+ DO_RTG
+ }
+
+
+ /*************************************************************************/
+ /* RTDG[]: Round To Double Grid */
+ /* Opcode range: 0x3D */
+ /* Stack: --> */
+ /* */
+ static void
+ Ins_RTDG( INS_ARG )
+ {
+ DO_RTDG
+ }
+
+
+ /*************************************************************************/
+ /* RUTG[]: Round Up To Grid */
+ /* Opcode range: 0x7C */
+ /* Stack: --> */
+ /* */
+ static void
+ Ins_RUTG( INS_ARG )
+ {
+ DO_RUTG
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* RDTG[]: Round Down To Grid */
+ /* Opcode range: 0x7D */
+ /* Stack: --> */
+ /* */
+ static void
+ Ins_RDTG( INS_ARG )
+ {
+ DO_RDTG
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* ROFF[]: Round OFF */
+ /* Opcode range: 0x7A */
+ /* Stack: --> */
+ /* */
+ static void
+ Ins_ROFF( INS_ARG )
+ {
+ DO_ROFF
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SROUND[]: Super ROUND */
+ /* Opcode range: 0x76 */
+ /* Stack: Eint8 --> */
+ /* */
+ static void
+ Ins_SROUND( INS_ARG )
+ {
+ DO_SROUND
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* S45ROUND[]: Super ROUND 45 degrees */
+ /* Opcode range: 0x77 */
+ /* Stack: uint32 --> */
+ /* */
+ static void
+ Ins_S45ROUND( INS_ARG )
+ {
+ DO_S45ROUND
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SLOOP[]: Set LOOP variable */
+ /* Opcode range: 0x17 */
+ /* Stack: int32? --> */
+ /* */
+ static void
+ Ins_SLOOP( INS_ARG )
+ {
+ DO_SLOOP
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SMD[]: Set Minimum Distance */
+ /* Opcode range: 0x1A */
+ /* Stack: f26.6 --> */
+ /* */
+ static void
+ Ins_SMD( INS_ARG )
+ {
+ DO_SMD
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SCVTCI[]: Set Control Value Table Cut In */
+ /* Opcode range: 0x1D */
+ /* Stack: f26.6 --> */
+ /* */
+ static void
+ Ins_SCVTCI( INS_ARG )
+ {
+ DO_SCVTCI
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SSWCI[]: Set Single Width Cut In */
+ /* Opcode range: 0x1E */
+ /* Stack: f26.6 --> */
+ /* */
+ static void
+ Ins_SSWCI( INS_ARG )
+ {
+ DO_SSWCI
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SSW[]: Set Single Width */
+ /* Opcode range: 0x1F */
+ /* Stack: int32? --> */
+ /* */
+ static void
+ Ins_SSW( INS_ARG )
+ {
+ DO_SSW
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* FLIPON[]: Set auto-FLIP to ON */
+ /* Opcode range: 0x4D */
+ /* Stack: --> */
+ /* */
+ static void
+ Ins_FLIPON( INS_ARG )
+ {
+ DO_FLIPON
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* FLIPOFF[]: Set auto-FLIP to OFF */
+ /* Opcode range: 0x4E */
+ /* Stack: --> */
+ /* */
+ static void
+ Ins_FLIPOFF( INS_ARG )
+ {
+ DO_FLIPOFF
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SANGW[]: Set ANGle Weight */
+ /* Opcode range: 0x7E */
+ /* Stack: uint32 --> */
+ /* */
+ static void
+ Ins_SANGW( INS_ARG )
+ {
+ /* instruction not supported anymore */
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SDB[]: Set Delta Base */
+ /* Opcode range: 0x5E */
+ /* Stack: uint32 --> */
+ /* */
+ static void
+ Ins_SDB( INS_ARG )
+ {
+ DO_SDB
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SDS[]: Set Delta Shift */
+ /* Opcode range: 0x5F */
+ /* Stack: uint32 --> */
+ /* */
+ static void
+ Ins_SDS( INS_ARG )
+ {
+ DO_SDS
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* MPPEM[]: Measure Pixel Per EM */
+ /* Opcode range: 0x4B */
+ /* Stack: --> Euint16 */
+ /* */
+ static void
+ Ins_MPPEM( INS_ARG )
+ {
+ DO_MPPEM
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* MPS[]: Measure Point Size */
+ /* Opcode range: 0x4C */
+ /* Stack: --> Euint16 */
+ /* */
+ static void
+ Ins_MPS( INS_ARG )
+ {
+ DO_MPS
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* DUP[]: DUPlicate the top stack's element */
+ /* Opcode range: 0x20 */
+ /* Stack: StkElt --> StkElt StkElt */
+ /* */
+ static void
+ Ins_DUP( INS_ARG )
+ {
+ DO_DUP
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* POP[]: POP the stack's top element */
+ /* Opcode range: 0x21 */
+ /* Stack: StkElt --> */
+ /* */
+ static void
+ Ins_POP( INS_ARG )
+ {
+ /* nothing to do */
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* CLEAR[]: CLEAR the entire stack */
+ /* Opcode range: 0x22 */
+ /* Stack: StkElt... --> */
+ /* */
+ static void
+ Ins_CLEAR( INS_ARG )
+ {
+ DO_CLEAR
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SWAP[]: SWAP the stack's top two elements */
+ /* Opcode range: 0x23 */
+ /* Stack: 2 * StkElt --> 2 * StkElt */
+ /* */
+ static void
+ Ins_SWAP( INS_ARG )
+ {
+ DO_SWAP
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* DEPTH[]: return the stack DEPTH */
+ /* Opcode range: 0x24 */
+ /* Stack: --> uint32 */
+ /* */
+ static void
+ Ins_DEPTH( INS_ARG )
+ {
+ DO_DEPTH
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* CINDEX[]: Copy INDEXed element */
+ /* Opcode range: 0x25 */
+ /* Stack: int32 --> StkElt */
+ /* */
+ static void
+ Ins_CINDEX( INS_ARG )
+ {
+ DO_CINDEX
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* EIF[]: End IF */
+ /* Opcode range: 0x59 */
+ /* Stack: --> */
+ /* */
+ static void
+ Ins_EIF( INS_ARG )
+ {
+ /* nothing to do */
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* JROT[]: Jump Relative On True */
+ /* Opcode range: 0x78 */
+ /* Stack: StkElt int32 --> */
+ /* */
+ static void
+ Ins_JROT( INS_ARG )
+ {
+ DO_JROT
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* JMPR[]: JuMP Relative */
+ /* Opcode range: 0x1C */
+ /* Stack: int32 --> */
+ /* */
+ static void
+ Ins_JMPR( INS_ARG )
+ {
+ DO_JMPR
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* JROF[]: Jump Relative On False */
+ /* Opcode range: 0x79 */
+ /* Stack: StkElt int32 --> */
+ /* */
+ static void
+ Ins_JROF( INS_ARG )
+ {
+ DO_JROF
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* LT[]: Less Than */
+ /* Opcode range: 0x50 */
+ /* Stack: int32? int32? --> bool */
+ /* */
+ static void
+ Ins_LT( INS_ARG )
+ {
+ DO_LT
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* LTEQ[]: Less Than or EQual */
+ /* Opcode range: 0x51 */
+ /* Stack: int32? int32? --> bool */
+ /* */
+ static void
+ Ins_LTEQ( INS_ARG )
+ {
+ DO_LTEQ
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* GT[]: Greater Than */
+ /* Opcode range: 0x52 */
+ /* Stack: int32? int32? --> bool */
+ /* */
+ static void
+ Ins_GT( INS_ARG )
+ {
+ DO_GT
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* GTEQ[]: Greater Than or EQual */
+ /* Opcode range: 0x53 */
+ /* Stack: int32? int32? --> bool */
+ /* */
+ static void
+ Ins_GTEQ( INS_ARG )
+ {
+ DO_GTEQ
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* EQ[]: EQual */
+ /* Opcode range: 0x54 */
+ /* Stack: StkElt StkElt --> bool */
+ /* */
+ static void
+ Ins_EQ( INS_ARG )
+ {
+ DO_EQ
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* NEQ[]: Not EQual */
+ /* Opcode range: 0x55 */
+ /* Stack: StkElt StkElt --> bool */
+ /* */
+ static void
+ Ins_NEQ( INS_ARG )
+ {
+ DO_NEQ
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* ODD[]: Is ODD */
+ /* Opcode range: 0x56 */
+ /* Stack: f26.6 --> bool */
+ /* */
+ static void
+ Ins_ODD( INS_ARG )
+ {
+ DO_ODD
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* EVEN[]: Is EVEN */
+ /* Opcode range: 0x57 */
+ /* Stack: f26.6 --> bool */
+ /* */
+ static void
+ Ins_EVEN( INS_ARG )
+ {
+ DO_EVEN
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* AND[]: logical AND */
+ /* Opcode range: 0x5A */
+ /* Stack: uint32 uint32 --> uint32 */
+ /* */
+ static void
+ Ins_AND( INS_ARG )
+ {
+ DO_AND
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* OR[]: logical OR */
+ /* Opcode range: 0x5B */
+ /* Stack: uint32 uint32 --> uint32 */
+ /* */
+ static void
+ Ins_OR( INS_ARG )
+ {
+ DO_OR
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* NOT[]: logical NOT */
+ /* Opcode range: 0x5C */
+ /* Stack: StkElt --> uint32 */
+ /* */
+ static void
+ Ins_NOT( INS_ARG )
+ {
+ DO_NOT
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* ADD[]: ADD */
+ /* Opcode range: 0x60 */
+ /* Stack: f26.6 f26.6 --> f26.6 */
+ /* */
+ static void
+ Ins_ADD( INS_ARG )
+ {
+ DO_ADD
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SUB[]: SUBtract */
+ /* Opcode range: 0x61 */
+ /* Stack: f26.6 f26.6 --> f26.6 */
+ /* */
+ static void
+ Ins_SUB( INS_ARG )
+ {
+ DO_SUB
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* DIV[]: DIVide */
+ /* Opcode range: 0x62 */
+ /* Stack: f26.6 f26.6 --> f26.6 */
+ /* */
+ static void
+ Ins_DIV( INS_ARG )
+ {
+ DO_DIV
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* MUL[]: MULtiply */
+ /* Opcode range: 0x63 */
+ /* Stack: f26.6 f26.6 --> f26.6 */
+ /* */
+ static void
+ Ins_MUL( INS_ARG )
+ {
+ DO_MUL
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* ABS[]: ABSolute value */
+ /* Opcode range: 0x64 */
+ /* Stack: f26.6 --> f26.6 */
+ /* */
+ static void
+ Ins_ABS( INS_ARG )
+ {
+ DO_ABS
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* NEG[]: NEGate */
+ /* Opcode range: 0x65 */
+ /* Stack: f26.6 --> f26.6 */
+ /* */
+ static void
+ Ins_NEG( INS_ARG )
+ {
+ DO_NEG
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* FLOOR[]: FLOOR */
+ /* Opcode range: 0x66 */
+ /* Stack: f26.6 --> f26.6 */
+ /* */
+ static void
+ Ins_FLOOR( INS_ARG )
+ {
+ DO_FLOOR
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* CEILING[]: CEILING */
+ /* Opcode range: 0x67 */
+ /* Stack: f26.6 --> f26.6 */
+ /* */
+ static void
+ Ins_CEILING( INS_ARG )
+ {
+ DO_CEILING
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* RS[]: Read Store */
+ /* Opcode range: 0x43 */
+ /* Stack: uint32 --> uint32 */
+ /* */
+ static void
+ Ins_RS( INS_ARG )
+ {
+ DO_RS
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* WS[]: Write Store */
+ /* Opcode range: 0x42 */
+ /* Stack: uint32 uint32 --> */
+ /* */
+ static void
+ Ins_WS( INS_ARG )
+ {
+ DO_WS
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* WCVTP[]: Write CVT in Pixel units */
+ /* Opcode range: 0x44 */
+ /* Stack: f26.6 uint32 --> */
+ /* */
+ static void
+ Ins_WCVTP( INS_ARG )
+ {
+ DO_WCVTP
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* WCVTF[]: Write CVT in Funits */
+ /* Opcode range: 0x70 */
+ /* Stack: uint32 uint32 --> */
+ /* */
+ static void
+ Ins_WCVTF( INS_ARG )
+ {
+ DO_WCVTF
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* RCVT[]: Read CVT */
+ /* Opcode range: 0x45 */
+ /* Stack: uint32 --> f26.6 */
+ /* */
+ static void
+ Ins_RCVT( INS_ARG )
+ {
+ DO_RCVT
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* AA[]: Adjust Angle */
+ /* Opcode range: 0x7F */
+ /* Stack: uint32 --> */
+ /* */
+ static void
+ Ins_AA( INS_ARG )
+ {
+ /* intentionally no longer supported */
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* DEBUG[]: DEBUG. Unsupported. */
+ /* Opcode range: 0x4F */
+ /* Stack: uint32 --> */
+ /* */
+ /* Note: The original instruction pops a value from the stack. */
+ /* */
+ static void
+ Ins_DEBUG( INS_ARG )
+ {
+ DO_DEBUG
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* ROUND[ab]: ROUND value */
+ /* Opcode range: 0x68-0x6B */
+ /* Stack: f26.6 --> f26.6 */
+ /* */
+ static void
+ Ins_ROUND( INS_ARG )
+ {
+ DO_ROUND
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* NROUND[ab]: No ROUNDing of value */
+ /* Opcode range: 0x6C-0x6F */
+ /* Stack: f26.6 --> f26.6 */
+ /* */
+ static void
+ Ins_NROUND( INS_ARG )
+ {
+ DO_NROUND
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* MAX[]: MAXimum */
+ /* Opcode range: 0x68 */
+ /* Stack: int32? int32? --> int32 */
+ /* */
+ static void
+ Ins_MAX( INS_ARG )
+ {
+ DO_MAX
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* MIN[]: MINimum */
+ /* Opcode range: 0x69 */
+ /* Stack: int32? int32? --> int32 */
+ /* */
+ static void
+ Ins_MIN( INS_ARG )
+ {
+ DO_MIN
+ }
+
+
+#endif /* !TT_CONFIG_OPTION_INTERPRETER_SWITCH */
+
+
+ /*************************************************************************/
+ /* */
+ /* The following functions are called as is within the switch statement. */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* MINDEX[]: Move INDEXed element */
+ /* Opcode range: 0x26 */
+ /* Stack: int32? --> StkElt */
+ /* */
+ static void
+ Ins_MINDEX( INS_ARG )
+ {
+ FT_Long L, K;
+
+
+ L = args[0];
+
+ if ( L <= 0 || L > CUR.args )
+ {
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Invalid_Reference );
+ }
+ else
+ {
+ K = CUR.stack[CUR.args - L];
+
+ FT_ARRAY_MOVE( &CUR.stack[CUR.args - L ],
+ &CUR.stack[CUR.args - L + 1],
+ ( L - 1 ) );
+
+ CUR.stack[CUR.args - 1] = K;
+ }
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* ROLL[]: ROLL top three elements */
+ /* Opcode range: 0x8A */
+ /* Stack: 3 * StkElt --> 3 * StkElt */
+ /* */
+ static void
+ Ins_ROLL( INS_ARG )
+ {
+ FT_Long A, B, C;
+
+ FT_UNUSED_EXEC;
+
+
+ A = args[2];
+ B = args[1];
+ C = args[0];
+
+ args[2] = C;
+ args[1] = A;
+ args[0] = B;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* MANAGING THE FLOW OF CONTROL */
+ /* */
+ /* Instructions appear in the specification's order. */
+ /* */
+ /*************************************************************************/
+
+
+ static FT_Bool
+ SkipCode( EXEC_OP )
+ {
+ CUR.IP += CUR.length;
+
+ if ( CUR.IP < CUR.codeSize )
+ {
+ CUR.opcode = CUR.code[CUR.IP];
+
+ CUR.length = opcode_length[CUR.opcode];
+ if ( CUR.length < 0 )
+ {
+ if ( CUR.IP + 1 >= CUR.codeSize )
+ goto Fail_Overflow;
+ CUR.length = 2 - CUR.length * CUR.code[CUR.IP + 1];
+ }
+
+ if ( CUR.IP + CUR.length <= CUR.codeSize )
+ return SUCCESS;
+ }
+
+ Fail_Overflow:
+ CUR.error = FT_THROW( Code_Overflow );
+ return FAILURE;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* IF[]: IF test */
+ /* Opcode range: 0x58 */
+ /* Stack: StkElt --> */
+ /* */
+ static void
+ Ins_IF( INS_ARG )
+ {
+ FT_Int nIfs;
+ FT_Bool Out;
+
+
+ if ( args[0] != 0 )
+ return;
+
+ nIfs = 1;
+ Out = 0;
+
+ do
+ {
+ if ( SKIP_Code() == FAILURE )
+ return;
+
+ switch ( CUR.opcode )
+ {
+ case 0x58: /* IF */
+ nIfs++;
+ break;
+
+ case 0x1B: /* ELSE */
+ Out = FT_BOOL( nIfs == 1 );
+ break;
+
+ case 0x59: /* EIF */
+ nIfs--;
+ Out = FT_BOOL( nIfs == 0 );
+ break;
+ }
+ } while ( Out == 0 );
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* ELSE[]: ELSE */
+ /* Opcode range: 0x1B */
+ /* Stack: --> */
+ /* */
+ static void
+ Ins_ELSE( INS_ARG )
+ {
+ FT_Int nIfs;
+
+ FT_UNUSED_ARG;
+
+
+ nIfs = 1;
+
+ do
+ {
+ if ( SKIP_Code() == FAILURE )
+ return;
+
+ switch ( CUR.opcode )
+ {
+ case 0x58: /* IF */
+ nIfs++;
+ break;
+
+ case 0x59: /* EIF */
+ nIfs--;
+ break;
+ }
+ } while ( nIfs != 0 );
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* DEFINING AND USING FUNCTIONS AND INSTRUCTIONS */
+ /* */
+ /* Instructions appear in the specification's order. */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* FDEF[]: Function DEFinition */
+ /* Opcode range: 0x2C */
+ /* Stack: uint32 --> */
+ /* */
+ static void
+ Ins_FDEF( INS_ARG )
+ {
+ FT_ULong n;
+ TT_DefRecord* rec;
+ TT_DefRecord* limit;
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ /* arguments to opcodes are skipped by `SKIP_Code' */
+ FT_Byte opcode_pattern[9][12] = {
+ /* #0 inline delta function 1 */
+ {
+ 0x4B, /* PPEM */
+ 0x53, /* GTEQ */
+ 0x23, /* SWAP */
+ 0x4B, /* PPEM */
+ 0x51, /* LTEQ */
+ 0x5A, /* AND */
+ 0x58, /* IF */
+ 0x38, /* SHPIX */
+ 0x1B, /* ELSE */
+ 0x21, /* POP */
+ 0x21, /* POP */
+ 0x59 /* EIF */
+ },
+ /* #1 inline delta function 2 */
+ {
+ 0x4B, /* PPEM */
+ 0x54, /* EQ */
+ 0x58, /* IF */
+ 0x38, /* SHPIX */
+ 0x1B, /* ELSE */
+ 0x21, /* POP */
+ 0x21, /* POP */
+ 0x59 /* EIF */
+ },
+ /* #2 diagonal stroke function */
+ {
+ 0x20, /* DUP */
+ 0x20, /* DUP */
+ 0xB0, /* PUSHB_1 */
+ /* 1 */
+ 0x60, /* ADD */
+ 0x46, /* GC_cur */
+ 0xB0, /* PUSHB_1 */
+ /* 64 */
+ 0x23, /* SWAP */
+ 0x42 /* WS */
+ },
+ /* #3 VacuFormRound function */
+ {
+ 0x45, /* RCVT */
+ 0x23, /* SWAP */
+ 0x46, /* GC_cur */
+ 0x60, /* ADD */
+ 0x20, /* DUP */
+ 0xB0 /* PUSHB_1 */
+ /* 38 */
+ },
+ /* #4 TTFautohint bytecode (old) */
+ {
+ 0x20, /* DUP */
+ 0x64, /* ABS */
+ 0xB0, /* PUSHB_1 */
+ /* 32 */
+ 0x60, /* ADD */
+ 0x66, /* FLOOR */
+ 0x23, /* SWAP */
+ 0xB0 /* PUSHB_1 */
+ },
+ /* #5 spacing function 1 */
+ {
+ 0x01, /* SVTCA_x */
+ 0xB0, /* PUSHB_1 */
+ /* 24 */
+ 0x43, /* RS */
+ 0x58 /* IF */
+ },
+ /* #6 spacing function 2 */
+ {
+ 0x01, /* SVTCA_x */
+ 0x18, /* RTG */
+ 0xB0, /* PUSHB_1 */
+ /* 24 */
+ 0x43, /* RS */
+ 0x58 /* IF */
+ },
+ /* #7 TypeMan Talk DiagEndCtrl function */
+ {
+ 0x01, /* SVTCA_x */
+ 0x20, /* DUP */
+ 0xB0, /* PUSHB_1 */
+ /* 3 */
+ 0x25, /* CINDEX */
+ },
+ /* #8 TypeMan Talk Align */
+ {
+ 0x06, /* SPVTL */
+ 0x7D, /* RDTG */
+ },
+ };
+ FT_UShort opcode_patterns = 9;
+ FT_UShort opcode_pointer[9] = { 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+ FT_UShort opcode_size[9] = { 12, 8, 8, 6, 7, 4, 5, 4, 2 };
+ FT_UShort i;
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+
+ /* some font programs are broken enough to redefine functions! */
+ /* We will then parse the current table. */
+
+ rec = CUR.FDefs;
+ limit = rec + CUR.numFDefs;
+ n = args[0];
+
+ for ( ; rec < limit; rec++ )
+ {
+ if ( rec->opc == n )
+ break;
+ }
+
+ if ( rec == limit )
+ {
+ /* check that there is enough room for new functions */
+ if ( CUR.numFDefs >= CUR.maxFDefs )
+ {
+ CUR.error = FT_THROW( Too_Many_Function_Defs );
+ return;
+ }
+ CUR.numFDefs++;
+ }
+
+ /* Although FDEF takes unsigned 32-bit integer, */
+ /* func # must be within unsigned 16-bit integer */
+ if ( n > 0xFFFFU )
+ {
+ CUR.error = FT_THROW( Too_Many_Function_Defs );
+ return;
+ }
+
+ rec->range = CUR.curRange;
+ rec->opc = (FT_UInt16)n;
+ rec->start = CUR.IP + 1;
+ rec->active = TRUE;
+ rec->inline_delta = FALSE;
+ rec->sph_fdef_flags = 0x0000;
+
+ if ( n > CUR.maxFunc )
+ CUR.maxFunc = (FT_UInt16)n;
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ /* We don't know for sure these are typeman functions, */
+ /* however they are only active when RS 22 is called */
+ if ( n >= 64 && n <= 66 )
+ rec->sph_fdef_flags |= SPH_FDEF_TYPEMAN_STROKES;
+#endif
+
+ /* Now skip the whole function definition. */
+ /* We don't allow nested IDEFS & FDEFs. */
+
+ while ( SKIP_Code() == SUCCESS )
+ {
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+
+ if ( SUBPIXEL_HINTING )
+ {
+ for ( i = 0; i < opcode_patterns; i++ )
+ {
+ if ( opcode_pointer[i] < opcode_size[i] &&
+ CUR.opcode == opcode_pattern[i][opcode_pointer[i]] )
+ {
+ opcode_pointer[i] += 1;
+
+ if ( opcode_pointer[i] == opcode_size[i] )
+ {
+ FT_TRACE7(( "sph: Function %d, opcode ptrn: %d, %s %s\n",
+ i, n,
+ CUR.face->root.family_name,
+ CUR.face->root.style_name ));
+
+ switch ( i )
+ {
+ case 0:
+ rec->sph_fdef_flags |= SPH_FDEF_INLINE_DELTA_1;
+ CUR.face->sph_found_func_flags |= SPH_FDEF_INLINE_DELTA_1;
+ break;
+
+ case 1:
+ rec->sph_fdef_flags |= SPH_FDEF_INLINE_DELTA_2;
+ CUR.face->sph_found_func_flags |= SPH_FDEF_INLINE_DELTA_2;
+ break;
+
+ case 2:
+ switch ( n )
+ {
+ /* needs to be implemented still */
+ case 58:
+ rec->sph_fdef_flags |= SPH_FDEF_DIAGONAL_STROKE;
+ CUR.face->sph_found_func_flags |= SPH_FDEF_DIAGONAL_STROKE;
+ }
+ break;
+
+ case 3:
+ switch ( n )
+ {
+ case 0:
+ rec->sph_fdef_flags |= SPH_FDEF_VACUFORM_ROUND_1;
+ CUR.face->sph_found_func_flags |= SPH_FDEF_VACUFORM_ROUND_1;
+ }
+ break;
+
+ case 4:
+ /* probably not necessary to detect anymore */
+ rec->sph_fdef_flags |= SPH_FDEF_TTFAUTOHINT_1;
+ CUR.face->sph_found_func_flags |= SPH_FDEF_TTFAUTOHINT_1;
+ break;
+
+ case 5:
+ switch ( n )
+ {
+ case 0:
+ case 1:
+ case 2:
+ case 4:
+ case 7:
+ case 8:
+ rec->sph_fdef_flags |= SPH_FDEF_SPACING_1;
+ CUR.face->sph_found_func_flags |= SPH_FDEF_SPACING_1;
+ }
+ break;
+
+ case 6:
+ switch ( n )
+ {
+ case 0:
+ case 1:
+ case 2:
+ case 4:
+ case 7:
+ case 8:
+ rec->sph_fdef_flags |= SPH_FDEF_SPACING_2;
+ CUR.face->sph_found_func_flags |= SPH_FDEF_SPACING_2;
+ }
+ break;
+
+ case 7:
+ rec->sph_fdef_flags |= SPH_FDEF_TYPEMAN_DIAGENDCTRL;
+ CUR.face->sph_found_func_flags |= SPH_FDEF_TYPEMAN_DIAGENDCTRL;
+ break;
+
+ case 8:
+#if 0
+ rec->sph_fdef_flags |= SPH_FDEF_TYPEMAN_DIAGENDCTRL;
+ CUR.face->sph_found_func_flags |= SPH_FDEF_TYPEMAN_DIAGENDCTRL;
+#endif
+ break;
+ }
+ opcode_pointer[i] = 0;
+ }
+ }
+
+ else
+ opcode_pointer[i] = 0;
+ }
+
+ /* Set sph_compatibility_mode only when deltas are detected */
+ CUR.face->sph_compatibility_mode =
+ ( ( CUR.face->sph_found_func_flags & SPH_FDEF_INLINE_DELTA_1 ) |
+ ( CUR.face->sph_found_func_flags & SPH_FDEF_INLINE_DELTA_2 ) );
+ }
+
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+ switch ( CUR.opcode )
+ {
+ case 0x89: /* IDEF */
+ case 0x2C: /* FDEF */
+ CUR.error = FT_THROW( Nested_DEFS );
+ return;
+
+ case 0x2D: /* ENDF */
+ rec->end = CUR.IP;
+ return;
+ }
+ }
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* ENDF[]: END Function definition */
+ /* Opcode range: 0x2D */
+ /* Stack: --> */
+ /* */
+ static void
+ Ins_ENDF( INS_ARG )
+ {
+ TT_CallRec* pRec;
+
+ FT_UNUSED_ARG;
+
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ CUR.sph_in_func_flags = 0x0000;
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+ if ( CUR.callTop <= 0 ) /* We encountered an ENDF without a call */
+ {
+ CUR.error = FT_THROW( ENDF_In_Exec_Stream );
+ return;
+ }
+
+ CUR.callTop--;
+
+ pRec = &CUR.callStack[CUR.callTop];
+
+ pRec->Cur_Count--;
+
+ CUR.step_ins = FALSE;
+
+ if ( pRec->Cur_Count > 0 )
+ {
+ CUR.callTop++;
+ CUR.IP = pRec->Cur_Restart;
+ }
+ else
+ /* Loop through the current function */
+ INS_Goto_CodeRange( pRec->Caller_Range,
+ pRec->Caller_IP );
+
+ /* Exit the current call frame. */
+
+ /* NOTE: If the last instruction of a program is a */
+ /* CALL or LOOPCALL, the return address is */
+ /* always out of the code range. This is a */
+ /* valid address, and it is why we do not test */
+ /* the result of Ins_Goto_CodeRange() here! */
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* CALL[]: CALL function */
+ /* Opcode range: 0x2B */
+ /* Stack: uint32? --> */
+ /* */
+ static void
+ Ins_CALL( INS_ARG )
+ {
+ FT_ULong F;
+ TT_CallRec* pCrec;
+ TT_DefRecord* def;
+
+
+ /* first of all, check the index */
+
+ F = args[0];
+ if ( BOUNDSL( F, CUR.maxFunc + 1 ) )
+ goto Fail;
+
+ /* Except for some old Apple fonts, all functions in a TrueType */
+ /* font are defined in increasing order, starting from 0. This */
+ /* means that we normally have */
+ /* */
+ /* CUR.maxFunc+1 == CUR.numFDefs */
+ /* CUR.FDefs[n].opc == n for n in 0..CUR.maxFunc */
+ /* */
+ /* If this isn't true, we need to look up the function table. */
+
+ def = CUR.FDefs + F;
+ if ( CUR.maxFunc + 1 != CUR.numFDefs || def->opc != F )
+ {
+ /* look up the FDefs table */
+ TT_DefRecord* limit;
+
+
+ def = CUR.FDefs;
+ limit = def + CUR.numFDefs;
+
+ while ( def < limit && def->opc != F )
+ def++;
+
+ if ( def == limit )
+ goto Fail;
+ }
+
+ /* check that the function is active */
+ if ( !def->active )
+ goto Fail;
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ if ( SUBPIXEL_HINTING &&
+ CUR.ignore_x_mode &&
+ ( ( CUR.iup_called &&
+ ( CUR.sph_tweak_flags & SPH_TWEAK_NO_CALL_AFTER_IUP ) ) ||
+ ( def->sph_fdef_flags & SPH_FDEF_VACUFORM_ROUND_1 ) ) )
+ goto Fail;
+ else
+ CUR.sph_in_func_flags = def->sph_fdef_flags;
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+ /* check the call stack */
+ if ( CUR.callTop >= CUR.callSize )
+ {
+ CUR.error = FT_THROW( Stack_Overflow );
+ return;
+ }
+
+ pCrec = CUR.callStack + CUR.callTop;
+
+ pCrec->Caller_Range = CUR.curRange;
+ pCrec->Caller_IP = CUR.IP + 1;
+ pCrec->Cur_Count = 1;
+ pCrec->Cur_Restart = def->start;
+ pCrec->Cur_End = def->end;
+
+ CUR.callTop++;
+
+ INS_Goto_CodeRange( def->range,
+ def->start );
+
+ CUR.step_ins = FALSE;
+
+ return;
+
+ Fail:
+ CUR.error = FT_THROW( Invalid_Reference );
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* LOOPCALL[]: LOOP and CALL function */
+ /* Opcode range: 0x2A */
+ /* Stack: uint32? Eint16? --> */
+ /* */
+ static void
+ Ins_LOOPCALL( INS_ARG )
+ {
+ FT_ULong F;
+ TT_CallRec* pCrec;
+ TT_DefRecord* def;
+
+
+ /* first of all, check the index */
+ F = args[1];
+ if ( BOUNDSL( F, CUR.maxFunc + 1 ) )
+ goto Fail;
+
+ /* Except for some old Apple fonts, all functions in a TrueType */
+ /* font are defined in increasing order, starting from 0. This */
+ /* means that we normally have */
+ /* */
+ /* CUR.maxFunc+1 == CUR.numFDefs */
+ /* CUR.FDefs[n].opc == n for n in 0..CUR.maxFunc */
+ /* */
+ /* If this isn't true, we need to look up the function table. */
+
+ def = CUR.FDefs + F;
+ if ( CUR.maxFunc + 1 != CUR.numFDefs || def->opc != F )
+ {
+ /* look up the FDefs table */
+ TT_DefRecord* limit;
+
+
+ def = CUR.FDefs;
+ limit = def + CUR.numFDefs;
+
+ while ( def < limit && def->opc != F )
+ def++;
+
+ if ( def == limit )
+ goto Fail;
+ }
+
+ /* check that the function is active */
+ if ( !def->active )
+ goto Fail;
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ if ( SUBPIXEL_HINTING &&
+ CUR.ignore_x_mode &&
+ ( def->sph_fdef_flags & SPH_FDEF_VACUFORM_ROUND_1 ) )
+ goto Fail;
+ else
+ CUR.sph_in_func_flags = def->sph_fdef_flags;
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+ /* check stack */
+ if ( CUR.callTop >= CUR.callSize )
+ {
+ CUR.error = FT_THROW( Stack_Overflow );
+ return;
+ }
+
+ if ( args[0] > 0 )
+ {
+ pCrec = CUR.callStack + CUR.callTop;
+
+ pCrec->Caller_Range = CUR.curRange;
+ pCrec->Caller_IP = CUR.IP + 1;
+ pCrec->Cur_Count = (FT_Int)args[0];
+ pCrec->Cur_Restart = def->start;
+ pCrec->Cur_End = def->end;
+
+ CUR.callTop++;
+
+ INS_Goto_CodeRange( def->range, def->start );
+
+ CUR.step_ins = FALSE;
+ }
+
+ return;
+
+ Fail:
+ CUR.error = FT_THROW( Invalid_Reference );
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* IDEF[]: Instruction DEFinition */
+ /* Opcode range: 0x89 */
+ /* Stack: Eint8 --> */
+ /* */
+ static void
+ Ins_IDEF( INS_ARG )
+ {
+ TT_DefRecord* def;
+ TT_DefRecord* limit;
+
+
+ /* First of all, look for the same function in our table */
+
+ def = CUR.IDefs;
+ limit = def + CUR.numIDefs;
+
+ for ( ; def < limit; def++ )
+ if ( def->opc == (FT_ULong)args[0] )
+ break;
+
+ if ( def == limit )
+ {
+ /* check that there is enough room for a new instruction */
+ if ( CUR.numIDefs >= CUR.maxIDefs )
+ {
+ CUR.error = FT_THROW( Too_Many_Instruction_Defs );
+ return;
+ }
+ CUR.numIDefs++;
+ }
+
+ /* opcode must be unsigned 8-bit integer */
+ if ( 0 > args[0] || args[0] > 0x00FF )
+ {
+ CUR.error = FT_THROW( Too_Many_Instruction_Defs );
+ return;
+ }
+
+ def->opc = (FT_Byte)args[0];
+ def->start = CUR.IP + 1;
+ def->range = CUR.curRange;
+ def->active = TRUE;
+
+ if ( (FT_ULong)args[0] > CUR.maxIns )
+ CUR.maxIns = (FT_Byte)args[0];
+
+ /* Now skip the whole function definition. */
+ /* We don't allow nested IDEFs & FDEFs. */
+
+ while ( SKIP_Code() == SUCCESS )
+ {
+ switch ( CUR.opcode )
+ {
+ case 0x89: /* IDEF */
+ case 0x2C: /* FDEF */
+ CUR.error = FT_THROW( Nested_DEFS );
+ return;
+ case 0x2D: /* ENDF */
+ return;
+ }
+ }
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* PUSHING DATA ONTO THE INTERPRETER STACK */
+ /* */
+ /* Instructions appear in the specification's order. */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* NPUSHB[]: PUSH N Bytes */
+ /* Opcode range: 0x40 */
+ /* Stack: --> uint32... */
+ /* */
+ static void
+ Ins_NPUSHB( INS_ARG )
+ {
+ FT_UShort L, K;
+
+
+ L = (FT_UShort)CUR.code[CUR.IP + 1];
+
+ if ( BOUNDS( L, CUR.stackSize + 1 - CUR.top ) )
+ {
+ CUR.error = FT_THROW( Stack_Overflow );
+ return;
+ }
+
+ for ( K = 1; K <= L; K++ )
+ args[K - 1] = CUR.code[CUR.IP + K + 1];
+
+ CUR.new_top += L;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* NPUSHW[]: PUSH N Words */
+ /* Opcode range: 0x41 */
+ /* Stack: --> int32... */
+ /* */
+ static void
+ Ins_NPUSHW( INS_ARG )
+ {
+ FT_UShort L, K;
+
+
+ L = (FT_UShort)CUR.code[CUR.IP + 1];
+
+ if ( BOUNDS( L, CUR.stackSize + 1 - CUR.top ) )
+ {
+ CUR.error = FT_THROW( Stack_Overflow );
+ return;
+ }
+
+ CUR.IP += 2;
+
+ for ( K = 0; K < L; K++ )
+ args[K] = GET_ShortIns();
+
+ CUR.step_ins = FALSE;
+ CUR.new_top += L;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* PUSHB[abc]: PUSH Bytes */
+ /* Opcode range: 0xB0-0xB7 */
+ /* Stack: --> uint32... */
+ /* */
+ static void
+ Ins_PUSHB( INS_ARG )
+ {
+ FT_UShort L, K;
+
+
+ L = (FT_UShort)( CUR.opcode - 0xB0 + 1 );
+
+ if ( BOUNDS( L, CUR.stackSize + 1 - CUR.top ) )
+ {
+ CUR.error = FT_THROW( Stack_Overflow );
+ return;
+ }
+
+ for ( K = 1; K <= L; K++ )
+ args[K - 1] = CUR.code[CUR.IP + K];
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* PUSHW[abc]: PUSH Words */
+ /* Opcode range: 0xB8-0xBF */
+ /* Stack: --> int32... */
+ /* */
+ static void
+ Ins_PUSHW( INS_ARG )
+ {
+ FT_UShort L, K;
+
+
+ L = (FT_UShort)( CUR.opcode - 0xB8 + 1 );
+
+ if ( BOUNDS( L, CUR.stackSize + 1 - CUR.top ) )
+ {
+ CUR.error = FT_THROW( Stack_Overflow );
+ return;
+ }
+
+ CUR.IP++;
+
+ for ( K = 0; K < L; K++ )
+ args[K] = GET_ShortIns();
+
+ CUR.step_ins = FALSE;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* MANAGING THE GRAPHICS STATE */
+ /* */
+ /* Instructions appear in the specs' order. */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* GC[a]: Get Coordinate projected onto */
+ /* Opcode range: 0x46-0x47 */
+ /* Stack: uint32 --> f26.6 */
+ /* */
+ /* XXX: UNDOCUMENTED: Measures from the original glyph must be taken */
+ /* along the dual projection vector! */
+ /* */
+ static void
+ Ins_GC( INS_ARG )
+ {
+ FT_ULong L;
+ FT_F26Dot6 R;
+
+
+ L = (FT_ULong)args[0];
+
+ if ( BOUNDSL( L, CUR.zp2.n_points ) )
+ {
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Invalid_Reference );
+ R = 0;
+ }
+ else
+ {
+ if ( CUR.opcode & 1 )
+ R = CUR_fast_dualproj( &CUR.zp2.org[L] );
+ else
+ R = CUR_fast_project( &CUR.zp2.cur[L] );
+ }
+
+ args[0] = R;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SCFS[]: Set Coordinate From Stack */
+ /* Opcode range: 0x48 */
+ /* Stack: f26.6 uint32 --> */
+ /* */
+ /* Formula: */
+ /* */
+ /* OA := OA + ( value - OA.p )/( f.p ) * f */
+ /* */
+ static void
+ Ins_SCFS( INS_ARG )
+ {
+ FT_Long K;
+ FT_UShort L;
+
+
+ L = (FT_UShort)args[0];
+
+ if ( BOUNDS( L, CUR.zp2.n_points ) )
+ {
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Invalid_Reference );
+ return;
+ }
+
+ K = CUR_fast_project( &CUR.zp2.cur[L] );
+
+ CUR_Func_move( &CUR.zp2, L, args[1] - K );
+
+ /* UNDOCUMENTED! The MS rasterizer does that with */
+ /* twilight points (confirmed by Greg Hitchcock) */
+ if ( CUR.GS.gep2 == 0 )
+ CUR.zp2.org[L] = CUR.zp2.cur[L];
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* MD[a]: Measure Distance */
+ /* Opcode range: 0x49-0x4A */
+ /* Stack: uint32 uint32 --> f26.6 */
+ /* */
+ /* XXX: UNDOCUMENTED: Measure taken in the original glyph must be along */
+ /* the dual projection vector. */
+ /* */
+ /* XXX: UNDOCUMENTED: Flag attributes are inverted! */
+ /* 0 => measure distance in original outline */
+ /* 1 => measure distance in grid-fitted outline */
+ /* */
+ /* XXX: UNDOCUMENTED: `zp0 - zp1', and not `zp2 - zp1! */
+ /* */
+ static void
+ Ins_MD( INS_ARG )
+ {
+ FT_UShort K, L;
+ FT_F26Dot6 D;
+
+
+ K = (FT_UShort)args[1];
+ L = (FT_UShort)args[0];
+
+ if ( BOUNDS( L, CUR.zp0.n_points ) ||
+ BOUNDS( K, CUR.zp1.n_points ) )
+ {
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Invalid_Reference );
+ D = 0;
+ }
+ else
+ {
+ if ( CUR.opcode & 1 )
+ D = CUR_Func_project( CUR.zp0.cur + L, CUR.zp1.cur + K );
+ else
+ {
+ /* XXX: UNDOCUMENTED: twilight zone special case */
+
+ if ( CUR.GS.gep0 == 0 || CUR.GS.gep1 == 0 )
+ {
+ FT_Vector* vec1 = CUR.zp0.org + L;
+ FT_Vector* vec2 = CUR.zp1.org + K;
+
+
+ D = CUR_Func_dualproj( vec1, vec2 );
+ }
+ else
+ {
+ FT_Vector* vec1 = CUR.zp0.orus + L;
+ FT_Vector* vec2 = CUR.zp1.orus + K;
+
+
+ if ( CUR.metrics.x_scale == CUR.metrics.y_scale )
+ {
+ /* this should be faster */
+ D = CUR_Func_dualproj( vec1, vec2 );
+ D = FT_MulFix( D, CUR.metrics.x_scale );
+ }
+ else
+ {
+ FT_Vector vec;
+
+
+ vec.x = FT_MulFix( vec1->x - vec2->x, CUR.metrics.x_scale );
+ vec.y = FT_MulFix( vec1->y - vec2->y, CUR.metrics.y_scale );
+
+ D = CUR_fast_dualproj( &vec );
+ }
+ }
+ }
+ }
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ /* Disable Type 2 Vacuform Rounds - e.g. Arial Narrow */
+ if ( SUBPIXEL_HINTING &&
+ CUR.ignore_x_mode && FT_ABS( D ) == 64 )
+ D += 1;
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+ args[0] = D;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SDPVTL[a]: Set Dual PVector to Line */
+ /* Opcode range: 0x86-0x87 */
+ /* Stack: uint32 uint32 --> */
+ /* */
+ static void
+ Ins_SDPVTL( INS_ARG )
+ {
+ FT_Long A, B, C;
+ FT_UShort p1, p2; /* was FT_Int in pas type ERROR */
+ FT_Int aOpc = CUR.opcode;
+
+
+ p1 = (FT_UShort)args[1];
+ p2 = (FT_UShort)args[0];
+
+ if ( BOUNDS( p2, CUR.zp1.n_points ) ||
+ BOUNDS( p1, CUR.zp2.n_points ) )
+ {
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Invalid_Reference );
+ return;
+ }
+
+ {
+ FT_Vector* v1 = CUR.zp1.org + p2;
+ FT_Vector* v2 = CUR.zp2.org + p1;
+
+
+ A = v1->x - v2->x;
+ B = v1->y - v2->y;
+
+ /* If v1 == v2, SDPVTL behaves the same as */
+ /* SVTCA[X], respectively. */
+ /* */
+ /* Confirmed by Greg Hitchcock. */
+
+ if ( A == 0 && B == 0 )
+ {
+ A = 0x4000;
+ aOpc = 0;
+ }
+ }
+
+ if ( ( aOpc & 1 ) != 0 )
+ {
+ C = B; /* counter clockwise rotation */
+ B = A;
+ A = -C;
+ }
+
+ NORMalize( A, B, &CUR.GS.dualVector );
+
+ {
+ FT_Vector* v1 = CUR.zp1.cur + p2;
+ FT_Vector* v2 = CUR.zp2.cur + p1;
+
+
+ A = v1->x - v2->x;
+ B = v1->y - v2->y;
+
+ if ( A == 0 && B == 0 )
+ {
+ A = 0x4000;
+ aOpc = 0;
+ }
+ }
+
+ if ( ( aOpc & 1 ) != 0 )
+ {
+ C = B; /* counter clockwise rotation */
+ B = A;
+ A = -C;
+ }
+
+ NORMalize( A, B, &CUR.GS.projVector );
+
+ GUESS_VECTOR( freeVector );
+
+ COMPUTE_Funcs();
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SZP0[]: Set Zone Pointer 0 */
+ /* Opcode range: 0x13 */
+ /* Stack: uint32 --> */
+ /* */
+ static void
+ Ins_SZP0( INS_ARG )
+ {
+ switch ( (FT_Int)args[0] )
+ {
+ case 0:
+ CUR.zp0 = CUR.twilight;
+ break;
+
+ case 1:
+ CUR.zp0 = CUR.pts;
+ break;
+
+ default:
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Invalid_Reference );
+ return;
+ }
+
+ CUR.GS.gep0 = (FT_UShort)args[0];
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SZP1[]: Set Zone Pointer 1 */
+ /* Opcode range: 0x14 */
+ /* Stack: uint32 --> */
+ /* */
+ static void
+ Ins_SZP1( INS_ARG )
+ {
+ switch ( (FT_Int)args[0] )
+ {
+ case 0:
+ CUR.zp1 = CUR.twilight;
+ break;
+
+ case 1:
+ CUR.zp1 = CUR.pts;
+ break;
+
+ default:
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Invalid_Reference );
+ return;
+ }
+
+ CUR.GS.gep1 = (FT_UShort)args[0];
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SZP2[]: Set Zone Pointer 2 */
+ /* Opcode range: 0x15 */
+ /* Stack: uint32 --> */
+ /* */
+ static void
+ Ins_SZP2( INS_ARG )
+ {
+ switch ( (FT_Int)args[0] )
+ {
+ case 0:
+ CUR.zp2 = CUR.twilight;
+ break;
+
+ case 1:
+ CUR.zp2 = CUR.pts;
+ break;
+
+ default:
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Invalid_Reference );
+ return;
+ }
+
+ CUR.GS.gep2 = (FT_UShort)args[0];
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SZPS[]: Set Zone PointerS */
+ /* Opcode range: 0x16 */
+ /* Stack: uint32 --> */
+ /* */
+ static void
+ Ins_SZPS( INS_ARG )
+ {
+ switch ( (FT_Int)args[0] )
+ {
+ case 0:
+ CUR.zp0 = CUR.twilight;
+ break;
+
+ case 1:
+ CUR.zp0 = CUR.pts;
+ break;
+
+ default:
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Invalid_Reference );
+ return;
+ }
+
+ CUR.zp1 = CUR.zp0;
+ CUR.zp2 = CUR.zp0;
+
+ CUR.GS.gep0 = (FT_UShort)args[0];
+ CUR.GS.gep1 = (FT_UShort)args[0];
+ CUR.GS.gep2 = (FT_UShort)args[0];
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* INSTCTRL[]: INSTruction ConTRoL */
+ /* Opcode range: 0x8e */
+ /* Stack: int32 int32 --> */
+ /* */
+ static void
+ Ins_INSTCTRL( INS_ARG )
+ {
+ FT_Long K, L;
+
+
+ K = args[1];
+ L = args[0];
+
+ if ( K < 1 || K > 2 )
+ {
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Invalid_Reference );
+ return;
+ }
+
+ if ( L != 0 )
+ L = K;
+
+ CUR.GS.instruct_control = FT_BOOL(
+ ( (FT_Byte)CUR.GS.instruct_control & ~(FT_Byte)K ) | (FT_Byte)L );
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SCANCTRL[]: SCAN ConTRoL */
+ /* Opcode range: 0x85 */
+ /* Stack: uint32? --> */
+ /* */
+ static void
+ Ins_SCANCTRL( INS_ARG )
+ {
+ FT_Int A;
+
+
+ /* Get Threshold */
+ A = (FT_Int)( args[0] & 0xFF );
+
+ if ( A == 0xFF )
+ {
+ CUR.GS.scan_control = TRUE;
+ return;
+ }
+ else if ( A == 0 )
+ {
+ CUR.GS.scan_control = FALSE;
+ return;
+ }
+
+ if ( ( args[0] & 0x100 ) != 0 && CUR.tt_metrics.ppem <= A )
+ CUR.GS.scan_control = TRUE;
+
+ if ( ( args[0] & 0x200 ) != 0 && CUR.tt_metrics.rotated )
+ CUR.GS.scan_control = TRUE;
+
+ if ( ( args[0] & 0x400 ) != 0 && CUR.tt_metrics.stretched )
+ CUR.GS.scan_control = TRUE;
+
+ if ( ( args[0] & 0x800 ) != 0 && CUR.tt_metrics.ppem > A )
+ CUR.GS.scan_control = FALSE;
+
+ if ( ( args[0] & 0x1000 ) != 0 && CUR.tt_metrics.rotated )
+ CUR.GS.scan_control = FALSE;
+
+ if ( ( args[0] & 0x2000 ) != 0 && CUR.tt_metrics.stretched )
+ CUR.GS.scan_control = FALSE;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SCANTYPE[]: SCAN TYPE */
+ /* Opcode range: 0x8D */
+ /* Stack: uint32? --> */
+ /* */
+ static void
+ Ins_SCANTYPE( INS_ARG )
+ {
+ if ( args[0] >= 0 )
+ CUR.GS.scan_type = (FT_Int)args[0];
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* MANAGING OUTLINES */
+ /* */
+ /* Instructions appear in the specification's order. */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* FLIPPT[]: FLIP PoinT */
+ /* Opcode range: 0x80 */
+ /* Stack: uint32... --> */
+ /* */
+ static void
+ Ins_FLIPPT( INS_ARG )
+ {
+ FT_UShort point;
+
+ FT_UNUSED_ARG;
+
+
+ if ( CUR.top < CUR.GS.loop )
+ {
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Too_Few_Arguments );
+ goto Fail;
+ }
+
+ while ( CUR.GS.loop > 0 )
+ {
+ CUR.args--;
+
+ point = (FT_UShort)CUR.stack[CUR.args];
+
+ if ( BOUNDS( point, CUR.pts.n_points ) )
+ {
+ if ( CUR.pedantic_hinting )
+ {
+ CUR.error = FT_THROW( Invalid_Reference );
+ return;
+ }
+ }
+ else
+ CUR.pts.tags[point] ^= FT_CURVE_TAG_ON;
+
+ CUR.GS.loop--;
+ }
+
+ Fail:
+ CUR.GS.loop = 1;
+ CUR.new_top = CUR.args;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* FLIPRGON[]: FLIP RanGe ON */
+ /* Opcode range: 0x81 */
+ /* Stack: uint32 uint32 --> */
+ /* */
+ static void
+ Ins_FLIPRGON( INS_ARG )
+ {
+ FT_UShort I, K, L;
+
+
+ K = (FT_UShort)args[1];
+ L = (FT_UShort)args[0];
+
+ if ( BOUNDS( K, CUR.pts.n_points ) ||
+ BOUNDS( L, CUR.pts.n_points ) )
+ {
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Invalid_Reference );
+ return;
+ }
+
+ for ( I = L; I <= K; I++ )
+ CUR.pts.tags[I] |= FT_CURVE_TAG_ON;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* FLIPRGOFF: FLIP RanGe OFF */
+ /* Opcode range: 0x82 */
+ /* Stack: uint32 uint32 --> */
+ /* */
+ static void
+ Ins_FLIPRGOFF( INS_ARG )
+ {
+ FT_UShort I, K, L;
+
+
+ K = (FT_UShort)args[1];
+ L = (FT_UShort)args[0];
+
+ if ( BOUNDS( K, CUR.pts.n_points ) ||
+ BOUNDS( L, CUR.pts.n_points ) )
+ {
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Invalid_Reference );
+ return;
+ }
+
+ for ( I = L; I <= K; I++ )
+ CUR.pts.tags[I] &= ~FT_CURVE_TAG_ON;
+ }
+
+
+ static FT_Bool
+ Compute_Point_Displacement( EXEC_OP_ FT_F26Dot6* x,
+ FT_F26Dot6* y,
+ TT_GlyphZone zone,
+ FT_UShort* refp )
+ {
+ TT_GlyphZoneRec zp;
+ FT_UShort p;
+ FT_F26Dot6 d;
+
+
+ if ( CUR.opcode & 1 )
+ {
+ zp = CUR.zp0;
+ p = CUR.GS.rp1;
+ }
+ else
+ {
+ zp = CUR.zp1;
+ p = CUR.GS.rp2;
+ }
+
+ if ( BOUNDS( p, zp.n_points ) )
+ {
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Invalid_Reference );
+ *refp = 0;
+ return FAILURE;
+ }
+
+ *zone = zp;
+ *refp = p;
+
+ d = CUR_Func_project( zp.cur + p, zp.org + p );
+
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+ if ( CUR.face->unpatented_hinting )
+ {
+ if ( CUR.GS.both_x_axis )
+ {
+ *x = d;
+ *y = 0;
+ }
+ else
+ {
+ *x = 0;
+ *y = d;
+ }
+ }
+ else
+#endif
+ {
+ *x = FT_MulDiv( d, (FT_Long)CUR.GS.freeVector.x, CUR.F_dot_P );
+ *y = FT_MulDiv( d, (FT_Long)CUR.GS.freeVector.y, CUR.F_dot_P );
+ }
+
+ return SUCCESS;
+ }
+
+
+ static void
+ Move_Zp2_Point( EXEC_OP_ FT_UShort point,
+ FT_F26Dot6 dx,
+ FT_F26Dot6 dy,
+ FT_Bool touch )
+ {
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+ if ( CUR.face->unpatented_hinting )
+ {
+ if ( CUR.GS.both_x_axis )
+ {
+ CUR.zp2.cur[point].x += dx;
+ if ( touch )
+ CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_X;
+ }
+ else
+ {
+ CUR.zp2.cur[point].y += dy;
+ if ( touch )
+ CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_Y;
+ }
+ return;
+ }
+#endif
+
+ if (CUR.zp2.cur == NULL) return; /* Security fix: Google Chris6 ufuzz109.pdf page #1 */
+ if ( CUR.GS.freeVector.x != 0 )
+ {
+ CUR.zp2.cur[point].x += dx;
+ if ( touch )
+ CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_X;
+ }
+
+ if ( CUR.GS.freeVector.y != 0 )
+ {
+ CUR.zp2.cur[point].y += dy;
+ if ( touch )
+ CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_Y;
+ }
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SHP[a]: SHift Point by the last point */
+ /* Opcode range: 0x32-0x33 */
+ /* Stack: uint32... --> */
+ /* */
+ static void
+ Ins_SHP( INS_ARG )
+ {
+ TT_GlyphZoneRec zp;
+ FT_UShort refp;
+
+ FT_F26Dot6 dx,
+ dy;
+ FT_UShort point;
+
+ FT_UNUSED_ARG;
+
+
+ if ( CUR.top < CUR.GS.loop )
+ {
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Invalid_Reference );
+ goto Fail;
+ }
+
+ if ( COMPUTE_Point_Displacement( &dx, &dy, &zp, &refp ) )
+ return;
+
+ while ( CUR.GS.loop > 0 )
+ {
+ CUR.args--;
+ point = (FT_UShort)CUR.stack[CUR.args];
+
+ if ( BOUNDS( point, CUR.zp2.n_points ) )
+ {
+ if ( CUR.pedantic_hinting )
+ {
+ CUR.error = FT_THROW( Invalid_Reference );
+ return;
+ }
+ }
+ else
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ /* doesn't follow Cleartype spec but produces better result */
+ if ( SUBPIXEL_HINTING &&
+ CUR.ignore_x_mode )
+ MOVE_Zp2_Point( point, 0, dy, TRUE );
+ else
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+ MOVE_Zp2_Point( point, dx, dy, TRUE );
+
+ CUR.GS.loop--;
+ }
+
+ Fail:
+ CUR.GS.loop = 1;
+ CUR.new_top = CUR.args;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SHC[a]: SHift Contour */
+ /* Opcode range: 0x34-35 */
+ /* Stack: uint32 --> */
+ /* */
+ /* UNDOCUMENTED: According to Greg Hitchcock, there is one (virtual) */
+ /* contour in the twilight zone, namely contour number */
+ /* zero which includes all points of it. */
+ /* */
+ static void
+ Ins_SHC( INS_ARG )
+ {
+ TT_GlyphZoneRec zp;
+ FT_UShort refp;
+ FT_F26Dot6 dx, dy;
+
+ FT_Short contour, bounds;
+ FT_UShort start, limit, i;
+
+
+ contour = (FT_UShort)args[0];
+ bounds = ( CUR.GS.gep2 == 0 ) ? 1 : CUR.zp2.n_contours;
+
+ if ( BOUNDS( contour, bounds ) )
+ {
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Invalid_Reference );
+ return;
+ }
+
+ if ( COMPUTE_Point_Displacement( &dx, &dy, &zp, &refp ) )
+ return;
+
+ if ( contour == 0 )
+ start = 0;
+ else
+ start = (FT_UShort)( CUR.zp2.contours[contour - 1] + 1 -
+ CUR.zp2.first_point );
+
+ /* we use the number of points if in the twilight zone */
+ if ( CUR.GS.gep2 == 0 )
+ limit = CUR.zp2.n_points;
+ else
+ limit = (FT_UShort)( CUR.zp2.contours[contour] -
+ CUR.zp2.first_point + 1 );
+
+ for ( i = start; i < limit; i++ )
+ {
+ if ( zp.cur != CUR.zp2.cur || refp != i )
+ MOVE_Zp2_Point( i, dx, dy, TRUE );
+ }
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SHZ[a]: SHift Zone */
+ /* Opcode range: 0x36-37 */
+ /* Stack: uint32 --> */
+ /* */
+ static void
+ Ins_SHZ( INS_ARG )
+ {
+ TT_GlyphZoneRec zp;
+ FT_UShort refp;
+ FT_F26Dot6 dx,
+ dy;
+
+ FT_UShort limit, i;
+
+
+ if ( BOUNDS( args[0], 2 ) )
+ {
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Invalid_Reference );
+ return;
+ }
+
+ if ( COMPUTE_Point_Displacement( &dx, &dy, &zp, &refp ) )
+ return;
+
+ /* XXX: UNDOCUMENTED! SHZ doesn't move the phantom points. */
+ /* Twilight zone has no real contours, so use `n_points'. */
+ /* Normal zone's `n_points' includes phantoms, so must */
+ /* use end of last contour. */
+ if ( CUR.GS.gep2 == 0 )
+ limit = (FT_UShort)CUR.zp2.n_points;
+ else if ( CUR.GS.gep2 == 1 && CUR.zp2.n_contours > 0 ) {
+ limit = (FT_UShort)( CUR.zp2.contours[CUR.zp2.n_contours - 1] + 1 );
+ if (limit >= CUR.zp2.n_points) /* XYQ 2010-10-01: security fix: validate last point index */
+ limit = CUR.zp2.n_points - 1;
+ }
+ else
+ limit = 0;
+
+ /* XXX: UNDOCUMENTED! SHZ doesn't touch the points */
+ for ( i = 0; i < limit; i++ )
+ {
+ if ( zp.cur != CUR.zp2.cur || refp != i )
+ MOVE_Zp2_Point( i, dx, dy, FALSE );
+ }
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SHPIX[]: SHift points by a PIXel amount */
+ /* Opcode range: 0x38 */
+ /* Stack: f26.6 uint32... --> */
+ /* */
+ static void
+ Ins_SHPIX( INS_ARG )
+ {
+ FT_F26Dot6 dx, dy;
+ FT_UShort point;
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ FT_Int B1, B2;
+#endif
+
+
+ if ( CUR.top < CUR.GS.loop + 1 )
+ {
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Invalid_Reference );
+ goto Fail;
+ }
+
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+ if ( CUR.face->unpatented_hinting )
+ {
+ if ( CUR.GS.both_x_axis )
+ {
+ dx = (FT_UInt32)args[0];
+ dy = 0;
+ }
+ else
+ {
+ dx = 0;
+ dy = (FT_UInt32)args[0];
+ }
+ }
+ else
+#endif
+ {
+ dx = TT_MulFix14( (FT_UInt32)args[0], CUR.GS.freeVector.x );
+ dy = TT_MulFix14( (FT_UInt32)args[0], CUR.GS.freeVector.y );
+ }
+
+ while ( CUR.GS.loop > 0 )
+ {
+ CUR.args--;
+
+ point = (FT_UShort)CUR.stack[CUR.args];
+
+ if ( BOUNDS( point, CUR.zp2.n_points ) )
+ {
+ if ( CUR.pedantic_hinting )
+ {
+ CUR.error = FT_THROW( Invalid_Reference );
+ return;
+ }
+ }
+ else
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ {
+ /* If not using ignore_x_mode rendering, allow ZP2 move. */
+ /* If inline deltas aren't allowed, skip ZP2 move. */
+ /* If using ignore_x_mode rendering, allow ZP2 point move if: */
+ /* - freedom vector is y and sph_compatibility_mode is off */
+ /* - the glyph is composite and the move is in the Y direction */
+ /* - the glyph is specifically set to allow SHPIX moves */
+ /* - the move is on a previously Y-touched point */
+
+ if ( SUBPIXEL_HINTING &&
+ CUR.ignore_x_mode )
+ {
+ /* save point for later comparison */
+ if ( CUR.GS.freeVector.y != 0 )
+ B1 = CUR.zp2.cur[point].y;
+ else
+ B1 = CUR.zp2.cur[point].x;
+
+ if ( !CUR.face->sph_compatibility_mode &&
+ CUR.GS.freeVector.y != 0 )
+ {
+ MOVE_Zp2_Point( point, dx, dy, TRUE );
+
+ /* save new point */
+ if ( CUR.GS.freeVector.y != 0 )
+ {
+ B2 = CUR.zp2.cur[point].y;
+
+ /* reverse any disallowed moves */
+ if ( ( CUR.sph_tweak_flags & SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES ) &&
+ ( B1 & 63 ) != 0 &&
+ ( B2 & 63 ) != 0 &&
+ B1 != B2 )
+ MOVE_Zp2_Point( point, -dx, -dy, TRUE );
+ }
+ }
+ else if ( CUR.face->sph_compatibility_mode )
+ {
+ if ( CUR.sph_tweak_flags & SPH_TWEAK_ROUND_NONPIXEL_Y_MOVES )
+ {
+ dx = FT_PIX_ROUND( B1 + dx ) - B1;
+ dy = FT_PIX_ROUND( B1 + dy ) - B1;
+ }
+
+ /* skip post-iup deltas */
+ if ( CUR.iup_called &&
+ ( ( CUR.sph_in_func_flags & SPH_FDEF_INLINE_DELTA_1 ) ||
+ ( CUR.sph_in_func_flags & SPH_FDEF_INLINE_DELTA_2 ) ) )
+ goto Skip;
+
+ if ( !( CUR.sph_tweak_flags & SPH_TWEAK_ALWAYS_SKIP_DELTAP ) &&
+ ( ( CUR.is_composite && CUR.GS.freeVector.y != 0 ) ||
+ ( CUR.zp2.tags[point] & FT_CURVE_TAG_TOUCH_Y ) ||
+ ( CUR.sph_tweak_flags & SPH_TWEAK_DO_SHPIX ) ) )
+ MOVE_Zp2_Point( point, 0, dy, TRUE );
+
+ /* save new point */
+ if ( CUR.GS.freeVector.y != 0 )
+ {
+ B2 = CUR.zp2.cur[point].y;
+
+ /* reverse any disallowed moves */
+ if ( ( B1 & 63 ) == 0 &&
+ ( B2 & 63 ) != 0 &&
+ B1 != B2 )
+ MOVE_Zp2_Point( point, 0, -dy, TRUE );
+ }
+ }
+ else if ( CUR.sph_in_func_flags & SPH_FDEF_TYPEMAN_DIAGENDCTRL )
+ MOVE_Zp2_Point( point, dx, dy, TRUE );
+ }
+ else
+ MOVE_Zp2_Point( point, dx, dy, TRUE );
+ }
+
+ Skip:
+
+#else /* !TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+ MOVE_Zp2_Point( point, dx, dy, TRUE );
+
+#endif /* !TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+ CUR.GS.loop--;
+ }
+
+ Fail:
+ CUR.GS.loop = 1;
+ CUR.new_top = CUR.args;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* MSIRP[a]: Move Stack Indirect Relative Position */
+ /* Opcode range: 0x3A-0x3B */
+ /* Stack: f26.6 uint32 --> */
+ /* */
+ static void
+ Ins_MSIRP( INS_ARG )
+ {
+ FT_UShort point;
+ FT_F26Dot6 distance;
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ FT_F26Dot6 control_value_cutin = 0; /* pacify compiler */
+
+
+ if ( SUBPIXEL_HINTING )
+ {
+ control_value_cutin = CUR.GS.control_value_cutin;
+
+ if ( CUR.ignore_x_mode &&
+ CUR.GS.freeVector.x != 0 &&
+ !( CUR.sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) )
+ control_value_cutin = 0;
+ }
+
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+ point = (FT_UShort)args[0];
+
+ if ( BOUNDS( point, CUR.zp1.n_points ) ||
+ BOUNDS( CUR.GS.rp0, CUR.zp0.n_points ) )
+ {
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Invalid_Reference );
+ return;
+ }
+
+ /* UNDOCUMENTED! The MS rasterizer does that with */
+ /* twilight points (confirmed by Greg Hitchcock) */
+ if ( CUR.GS.gep1 == 0 )
+ {
+ CUR.zp1.org[point] = CUR.zp0.org[CUR.GS.rp0];
+ CUR_Func_move_orig( &CUR.zp1, point, args[1] );
+ CUR.zp1.cur[point] = CUR.zp1.org[point];
+ }
+
+ distance = CUR_Func_project( CUR.zp1.cur + point,
+ CUR.zp0.cur + CUR.GS.rp0 );
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ /* subpixel hinting - make MSIRP respect CVT cut-in; */
+ if ( SUBPIXEL_HINTING &&
+ CUR.ignore_x_mode &&
+ CUR.GS.freeVector.x != 0 &&
+ FT_ABS( distance - args[1] ) >= control_value_cutin )
+ distance = args[1];
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+ CUR_Func_move( &CUR.zp1, point, args[1] - distance );
+
+ CUR.GS.rp1 = CUR.GS.rp0;
+ CUR.GS.rp2 = point;
+
+ if ( ( CUR.opcode & 1 ) != 0 )
+ CUR.GS.rp0 = point;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* MDAP[a]: Move Direct Absolute Point */
+ /* Opcode range: 0x2E-0x2F */
+ /* Stack: uint32 --> */
+ /* */
+ static void
+ Ins_MDAP( INS_ARG )
+ {
+ FT_UShort point;
+ FT_F26Dot6 cur_dist;
+ FT_F26Dot6 distance;
+
+
+ point = (FT_UShort)args[0];
+
+ if ( BOUNDS( point, CUR.zp0.n_points ) )
+ {
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Invalid_Reference );
+ return;
+ }
+
+ if ( ( CUR.opcode & 1 ) != 0 )
+ {
+ cur_dist = CUR_fast_project( &CUR.zp0.cur[point] );
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ if ( SUBPIXEL_HINTING &&
+ CUR.ignore_x_mode &&
+ CUR.GS.freeVector.x != 0 )
+ distance = ROUND_None(
+ cur_dist,
+ CUR.tt_metrics.compensations[0] ) - cur_dist;
+ else
+#endif
+ distance = CUR_Func_round(
+ cur_dist,
+ CUR.tt_metrics.compensations[0] ) - cur_dist;
+ }
+ else
+ distance = 0;
+
+ CUR_Func_move( &CUR.zp0, point, distance );
+
+ CUR.GS.rp0 = point;
+ CUR.GS.rp1 = point;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* MIAP[a]: Move Indirect Absolute Point */
+ /* Opcode range: 0x3E-0x3F */
+ /* Stack: uint32 uint32 --> */
+ /* */
+ static void
+ Ins_MIAP( INS_ARG )
+ {
+ FT_ULong cvtEntry;
+ FT_UShort point;
+ FT_F26Dot6 distance;
+ FT_F26Dot6 org_dist;
+ FT_F26Dot6 control_value_cutin;
+
+
+ control_value_cutin = CUR.GS.control_value_cutin;
+ cvtEntry = (FT_ULong)args[1];
+ point = (FT_UShort)args[0];
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ if ( SUBPIXEL_HINTING &&
+ CUR.ignore_x_mode &&
+ CUR.GS.freeVector.x != 0 &&
+ CUR.GS.freeVector.y == 0 &&
+ !( CUR.sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) )
+ control_value_cutin = 0;
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+ if ( BOUNDS( point, CUR.zp0.n_points ) ||
+ BOUNDSL( cvtEntry, CUR.cvtSize ) )
+ {
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Invalid_Reference );
+ goto Fail;
+ }
+
+ /* UNDOCUMENTED! */
+ /* */
+ /* The behaviour of an MIAP instruction is quite different when used */
+ /* in the twilight zone. */
+ /* */
+ /* First, no control value cut-in test is performed as it would fail */
+ /* anyway. Second, the original point, i.e. (org_x,org_y) of */
+ /* zp0.point, is set to the absolute, unrounded distance found in the */
+ /* CVT. */
+ /* */
+ /* This is used in the CVT programs of the Microsoft fonts Arial, */
+ /* Times, etc., in order to re-adjust some key font heights. It */
+ /* allows the use of the IP instruction in the twilight zone, which */
+ /* otherwise would be invalid according to the specification. */
+ /* */
+ /* We implement it with a special sequence for the twilight zone. */
+ /* This is a bad hack, but it seems to work. */
+ /* */
+ /* Confirmed by Greg Hitchcock. */
+
+ distance = CUR_Func_read_cvt( cvtEntry );
+
+ if ( CUR.GS.gep0 == 0 ) /* If in twilight zone */
+ {
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ /* Only adjust if not in sph_compatibility_mode or ignore_x_mode. */
+ /* Determined via experimentation and may be incorrect... */
+ if ( !SUBPIXEL_HINTING ||
+ ( !CUR.ignore_x_mode ||
+ !CUR.face->sph_compatibility_mode ) )
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+ CUR.zp0.org[point].x = TT_MulFix14( (FT_UInt32)distance,
+ CUR.GS.freeVector.x );
+ CUR.zp0.org[point].y = TT_MulFix14( (FT_UInt32)distance,
+ CUR.GS.freeVector.y ),
+ CUR.zp0.cur[point] = CUR.zp0.org[point];
+ }
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ if ( SUBPIXEL_HINTING &&
+ CUR.ignore_x_mode &&
+ ( CUR.sph_tweak_flags & SPH_TWEAK_MIAP_HACK ) &&
+ distance > 0 &&
+ CUR.GS.freeVector.y != 0 )
+ distance = 0;
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+ org_dist = CUR_fast_project( &CUR.zp0.cur[point] );
+
+ if ( ( CUR.opcode & 1 ) != 0 ) /* rounding and control cut-in flag */
+ {
+ if ( FT_ABS( distance - org_dist ) > control_value_cutin )
+ distance = org_dist;
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ if ( SUBPIXEL_HINTING &&
+ CUR.ignore_x_mode &&
+ CUR.GS.freeVector.x != 0 )
+ distance = ROUND_None( distance,
+ CUR.tt_metrics.compensations[0] );
+ else
+#endif
+ distance = CUR_Func_round( distance,
+ CUR.tt_metrics.compensations[0] );
+ }
+
+ CUR_Func_move( &CUR.zp0, point, distance - org_dist );
+
+ Fail:
+ CUR.GS.rp0 = point;
+ CUR.GS.rp1 = point;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* MDRP[abcde]: Move Direct Relative Point */
+ /* Opcode range: 0xC0-0xDF */
+ /* Stack: uint32 --> */
+ /* */
+ static void
+ Ins_MDRP( INS_ARG )
+ {
+ FT_UShort point;
+ FT_F26Dot6 org_dist, distance, minimum_distance;
+
+
+ minimum_distance = CUR.GS.minimum_distance;
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ if ( SUBPIXEL_HINTING &&
+ CUR.ignore_x_mode &&
+ CUR.GS.freeVector.x != 0 &&
+ !( CUR.sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) )
+ minimum_distance = 0;
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+ point = (FT_UShort)args[0];
+
+ if ( BOUNDS( point, CUR.zp1.n_points ) ||
+ BOUNDS( CUR.GS.rp0, CUR.zp0.n_points ) )
+ {
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Invalid_Reference );
+ goto Fail;
+ }
+
+ /* XXX: Is there some undocumented feature while in the */
+ /* twilight zone? */
+
+ /* XXX: UNDOCUMENTED: twilight zone special case */
+
+ if ( CUR.GS.gep0 == 0 || CUR.GS.gep1 == 0 )
+ {
+ FT_Vector* vec1 = &CUR.zp1.org[point];
+ FT_Vector* vec2 = &CUR.zp0.org[CUR.GS.rp0];
+
+
+ org_dist = CUR_Func_dualproj( vec1, vec2 );
+ }
+ else
+ {
+ FT_Vector* vec1 = &CUR.zp1.orus[point];
+ FT_Vector* vec2 = &CUR.zp0.orus[CUR.GS.rp0];
+
+
+ if ( CUR.metrics.x_scale == CUR.metrics.y_scale )
+ {
+ /* this should be faster */
+ org_dist = CUR_Func_dualproj( vec1, vec2 );
+ org_dist = FT_MulFix( org_dist, CUR.metrics.x_scale );
+ }
+ else
+ {
+ FT_Vector vec;
+
+
+ vec.x = FT_MulFix( vec1->x - vec2->x, CUR.metrics.x_scale );
+ vec.y = FT_MulFix( vec1->y - vec2->y, CUR.metrics.y_scale );
+
+ org_dist = CUR_fast_dualproj( &vec );
+ }
+ }
+
+ /* single width cut-in test */
+
+ if ( FT_ABS( org_dist - CUR.GS.single_width_value ) <
+ CUR.GS.single_width_cutin )
+ {
+ if ( org_dist >= 0 )
+ org_dist = CUR.GS.single_width_value;
+ else
+ org_dist = -CUR.GS.single_width_value;
+ }
+
+ /* round flag */
+
+ if ( ( CUR.opcode & 4 ) != 0 )
+ {
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ if ( SUBPIXEL_HINTING &&
+ CUR.ignore_x_mode &&
+ CUR.GS.freeVector.x != 0 )
+ distance = ROUND_None(
+ org_dist,
+ CUR.tt_metrics.compensations[CUR.opcode & 3] );
+ else
+#endif
+ distance = CUR_Func_round(
+ org_dist,
+ CUR.tt_metrics.compensations[CUR.opcode & 3] );
+ }
+ else
+ distance = ROUND_None(
+ org_dist,
+ CUR.tt_metrics.compensations[CUR.opcode & 3] );
+
+ /* minimum distance flag */
+
+ if ( ( CUR.opcode & 8 ) != 0 )
+ {
+ if ( org_dist >= 0 )
+ {
+ if ( distance < minimum_distance )
+ distance = minimum_distance;
+ }
+ else
+ {
+ if ( distance > -minimum_distance )
+ distance = -minimum_distance;
+ }
+ }
+
+ /* now move the point */
+
+ org_dist = CUR_Func_project( CUR.zp1.cur + point,
+ CUR.zp0.cur + CUR.GS.rp0 );
+
+ CUR_Func_move( &CUR.zp1, point, distance - org_dist );
+
+ Fail:
+ CUR.GS.rp1 = CUR.GS.rp0;
+ CUR.GS.rp2 = point;
+
+ if ( ( CUR.opcode & 16 ) != 0 )
+ CUR.GS.rp0 = point;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* MIRP[abcde]: Move Indirect Relative Point */
+ /* Opcode range: 0xE0-0xFF */
+ /* Stack: int32? uint32 --> */
+ /* */
+ static void
+ Ins_MIRP( INS_ARG )
+ {
+ FT_UShort point;
+ FT_ULong cvtEntry;
+
+ FT_F26Dot6 cvt_dist,
+ distance,
+ cur_dist,
+ org_dist,
+ control_value_cutin,
+ minimum_distance;
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ FT_Int B1 = 0; /* pacify compiler */
+ FT_Int B2 = 0;
+ FT_Bool reverse_move = FALSE;
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+
+ minimum_distance = CUR.GS.minimum_distance;
+ control_value_cutin = CUR.GS.control_value_cutin;
+ point = (FT_UShort)args[0];
+ cvtEntry = (FT_ULong)( args[1] + 1 );
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ if ( SUBPIXEL_HINTING &&
+ CUR.ignore_x_mode &&
+ CUR.GS.freeVector.x != 0 &&
+ !( CUR.sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) )
+ control_value_cutin = minimum_distance = 0;
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+ /* XXX: UNDOCUMENTED! cvt[-1] = 0 always */
+ /* Security fix: Google 07_oobread4.pdf page #1, cvtEntry > CUR.cvtSize + 1 will cause array index oob. */
+ if ( BOUNDS( point, CUR.zp1.n_points ) ||
+ BOUNDS( cvtEntry, CUR.cvtSize + 1 ) ||
+ BOUNDS( CUR.GS.rp0, CUR.zp0.n_points ) )
+ {
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Invalid_Reference );
+ goto Fail;
+ }
+
+ if ( !cvtEntry )
+ cvt_dist = 0;
+ else
+ cvt_dist = CUR_Func_read_cvt( cvtEntry - 1 );
+
+ /* single width test */
+
+ if ( FT_ABS( cvt_dist - CUR.GS.single_width_value ) <
+ CUR.GS.single_width_cutin )
+ {
+ if ( cvt_dist >= 0 )
+ cvt_dist = CUR.GS.single_width_value;
+ else
+ cvt_dist = -CUR.GS.single_width_value;
+ }
+
+ /* UNDOCUMENTED! The MS rasterizer does that with */
+ /* twilight points (confirmed by Greg Hitchcock) */
+ if ( CUR.GS.gep1 == 0 )
+ {
+ CUR.zp1.org[point].x = CUR.zp0.org[CUR.GS.rp0].x +
+ TT_MulFix14( (FT_UInt32)cvt_dist,
+ CUR.GS.freeVector.x );
+ CUR.zp1.org[point].y = CUR.zp0.org[CUR.GS.rp0].y +
+ TT_MulFix14( (FT_UInt32)cvt_dist,
+ CUR.GS.freeVector.y );
+ CUR.zp1.cur[point] = CUR.zp1.org[point];
+ }
+
+ org_dist = CUR_Func_dualproj( &CUR.zp1.org[point],
+ &CUR.zp0.org[CUR.GS.rp0] );
+ cur_dist = CUR_Func_project ( &CUR.zp1.cur[point],
+ &CUR.zp0.cur[CUR.GS.rp0] );
+
+ /* auto-flip test */
+
+ if ( CUR.GS.auto_flip )
+ {
+ if ( ( org_dist ^ cvt_dist ) < 0 )
+ cvt_dist = -cvt_dist;
+ }
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ if ( SUBPIXEL_HINTING &&
+ CUR.ignore_x_mode &&
+ CUR.GS.freeVector.y != 0 &&
+ ( CUR.sph_tweak_flags & SPH_TWEAK_TIMES_NEW_ROMAN_HACK ) )
+ {
+ if ( cur_dist < -64 )
+ cvt_dist -= 16;
+ else if ( cur_dist > 64 && cur_dist < 84 )
+ cvt_dist += 32;
+ }
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+ /* control value cut-in and round */
+
+ if ( ( CUR.opcode & 4 ) != 0 )
+ {
+ /* XXX: UNDOCUMENTED! Only perform cut-in test when both points */
+ /* refer to the same zone. */
+
+ if ( CUR.GS.gep0 == CUR.GS.gep1 )
+ {
+ /* XXX: According to Greg Hitchcock, the following wording is */
+ /* the right one: */
+ /* */
+ /* When the absolute difference between the value in */
+ /* the table [CVT] and the measurement directly from */
+ /* the outline is _greater_ than the cut_in value, the */
+ /* outline measurement is used. */
+ /* */
+ /* This is from `instgly.doc'. The description in */
+ /* `ttinst2.doc', version 1.66, is thus incorrect since */
+ /* it implies `>=' instead of `>'. */
+
+ if ( FT_ABS( cvt_dist - org_dist ) > control_value_cutin )
+ cvt_dist = org_dist;
+ }
+
+ distance = CUR_Func_round(
+ cvt_dist,
+ CUR.tt_metrics.compensations[CUR.opcode & 3] );
+ }
+ else
+ {
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ /* do cvt cut-in always in MIRP for sph */
+ if ( SUBPIXEL_HINTING &&
+ CUR.ignore_x_mode &&
+ CUR.GS.gep0 == CUR.GS.gep1 )
+ {
+ if ( FT_ABS( cvt_dist - org_dist ) > control_value_cutin )
+ cvt_dist = org_dist;
+ }
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+ distance = ROUND_None(
+ cvt_dist,
+ CUR.tt_metrics.compensations[CUR.opcode & 3] );
+ }
+
+ /* minimum distance test */
+
+ if ( ( CUR.opcode & 8 ) != 0 )
+ {
+ if ( org_dist >= 0 )
+ {
+ if ( distance < minimum_distance )
+ distance = minimum_distance;
+ }
+ else
+ {
+ if ( distance > -minimum_distance )
+ distance = -minimum_distance;
+ }
+ }
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ if ( SUBPIXEL_HINTING )
+ {
+ B1 = CUR.zp1.cur[point].y;
+
+ /* Round moves if necessary */
+ if ( CUR.ignore_x_mode &&
+ CUR.GS.freeVector.y != 0 &&
+ ( CUR.sph_tweak_flags & SPH_TWEAK_ROUND_NONPIXEL_Y_MOVES ) )
+ distance = FT_PIX_ROUND( B1 + distance - cur_dist ) - B1 + cur_dist;
+
+ if ( CUR.ignore_x_mode &&
+ CUR.GS.freeVector.y != 0 &&
+ ( CUR.opcode & 16 ) == 0 &&
+ ( CUR.opcode & 8 ) == 0 &&
+ ( CUR.sph_tweak_flags & SPH_TWEAK_COURIER_NEW_2_HACK ) )
+ distance += 64;
+ }
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+ CUR_Func_move( &CUR.zp1, point, distance - cur_dist );
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ if ( SUBPIXEL_HINTING )
+ {
+ B2 = CUR.zp1.cur[point].y;
+
+ /* Reverse move if necessary */
+ if ( CUR.ignore_x_mode )
+ {
+ if ( CUR.face->sph_compatibility_mode &&
+ CUR.GS.freeVector.y != 0 &&
+ ( B1 & 63 ) == 0 &&
+ ( B2 & 63 ) != 0 )
+ reverse_move = TRUE;
+
+ if ( ( CUR.sph_tweak_flags & SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES ) &&
+ CUR.GS.freeVector.y != 0 &&
+ ( B2 & 63 ) != 0 &&
+ ( B1 & 63 ) != 0 )
+ reverse_move = TRUE;
+ }
+
+ if ( reverse_move )
+ CUR_Func_move( &CUR.zp1, point, -( distance - cur_dist ) );
+ }
+
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+ Fail:
+ CUR.GS.rp1 = CUR.GS.rp0;
+
+ if ( ( CUR.opcode & 16 ) != 0 )
+ CUR.GS.rp0 = point;
+
+ CUR.GS.rp2 = point;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* ALIGNRP[]: ALIGN Relative Point */
+ /* Opcode range: 0x3C */
+ /* Stack: uint32 uint32... --> */
+ /* */
+ static void
+ Ins_ALIGNRP( INS_ARG )
+ {
+ FT_UShort point;
+ FT_F26Dot6 distance;
+
+ FT_UNUSED_ARG;
+
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ if ( SUBPIXEL_HINTING &&
+ CUR.ignore_x_mode &&
+ CUR.iup_called &&
+ ( CUR.sph_tweak_flags & SPH_TWEAK_NO_ALIGNRP_AFTER_IUP ) )
+ {
+ CUR.error = FT_THROW( Invalid_Reference );
+ goto Fail;
+ }
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+ if ( CUR.top < CUR.GS.loop ||
+ BOUNDS( CUR.GS.rp0, CUR.zp0.n_points ) )
+ {
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Invalid_Reference );
+ goto Fail;
+ }
+
+ while ( CUR.GS.loop > 0 )
+ {
+ CUR.args--;
+
+ point = (FT_UShort)CUR.stack[CUR.args];
+
+ if ( BOUNDS( point, CUR.zp1.n_points ) )
+ {
+ if ( CUR.pedantic_hinting )
+ {
+ CUR.error = FT_THROW( Invalid_Reference );
+ return;
+ }
+ }
+ else
+ {
+ distance = CUR_Func_project( CUR.zp1.cur + point,
+ CUR.zp0.cur + CUR.GS.rp0 );
+
+ CUR_Func_move( &CUR.zp1, point, -distance );
+ }
+
+ CUR.GS.loop--;
+ }
+
+ Fail:
+ CUR.GS.loop = 1;
+ CUR.new_top = CUR.args;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* ISECT[]: moves point to InterSECTion */
+ /* Opcode range: 0x0F */
+ /* Stack: 5 * uint32 --> */
+ /* */
+ static void
+ Ins_ISECT( INS_ARG )
+ {
+ FT_UShort point,
+ a0, a1,
+ b0, b1;
+
+ FT_F26Dot6 discriminant, dotproduct;
+
+ FT_F26Dot6 dx, dy,
+ dax, day,
+ dbx, dby;
+
+ FT_F26Dot6 val;
+
+ FT_Vector R;
+
+
+ point = (FT_UShort)args[0];
+
+ a0 = (FT_UShort)args[1];
+ a1 = (FT_UShort)args[2];
+ b0 = (FT_UShort)args[3];
+ b1 = (FT_UShort)args[4];
+
+ if ( BOUNDS( b0, CUR.zp0.n_points ) ||
+ BOUNDS( b1, CUR.zp0.n_points ) ||
+ BOUNDS( a0, CUR.zp1.n_points ) ||
+ BOUNDS( a1, CUR.zp1.n_points ) ||
+ BOUNDS( point, CUR.zp2.n_points ) )
+ {
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Invalid_Reference );
+ return;
+ }
+
+ /* Cramer's rule */
+
+ dbx = CUR.zp0.cur[b1].x - CUR.zp0.cur[b0].x;
+ dby = CUR.zp0.cur[b1].y - CUR.zp0.cur[b0].y;
+
+ dax = CUR.zp1.cur[a1].x - CUR.zp1.cur[a0].x;
+ day = CUR.zp1.cur[a1].y - CUR.zp1.cur[a0].y;
+
+ dx = CUR.zp0.cur[b0].x - CUR.zp1.cur[a0].x;
+ dy = CUR.zp0.cur[b0].y - CUR.zp1.cur[a0].y;
+
+ CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_BOTH;
+
+ discriminant = FT_MulDiv( dax, -dby, 0x40 ) +
+ FT_MulDiv( day, dbx, 0x40 );
+ dotproduct = FT_MulDiv( dax, dbx, 0x40 ) +
+ FT_MulDiv( day, dby, 0x40 );
+
+ /* The discriminant above is actually a cross product of vectors */
+ /* da and db. Together with the dot product, they can be used as */
+ /* surrogates for sine and cosine of the angle between the vectors. */
+ /* Indeed, */
+ /* dotproduct = |da||db|cos(angle) */
+ /* discriminant = |da||db|sin(angle) . */
+ /* We use these equations to reject grazing intersections by */
+ /* thresholding abs(tan(angle)) at 1/19, corresponding to 3 degrees. */
+ if ( 19 * FT_ABS( discriminant ) > FT_ABS( dotproduct ) )
+ {
+ val = FT_MulDiv( dx, -dby, 0x40 ) + FT_MulDiv( dy, dbx, 0x40 );
+
+ R.x = FT_MulDiv( val, dax, discriminant );
+ R.y = FT_MulDiv( val, day, discriminant );
+
+ CUR.zp2.cur[point].x = CUR.zp1.cur[a0].x + R.x;
+ CUR.zp2.cur[point].y = CUR.zp1.cur[a0].y + R.y;
+ }
+ else
+ {
+ /* else, take the middle of the middles of A and B */
+
+ CUR.zp2.cur[point].x = ( CUR.zp1.cur[a0].x +
+ CUR.zp1.cur[a1].x +
+ CUR.zp0.cur[b0].x +
+ CUR.zp0.cur[b1].x ) / 4;
+ CUR.zp2.cur[point].y = ( CUR.zp1.cur[a0].y +
+ CUR.zp1.cur[a1].y +
+ CUR.zp0.cur[b0].y +
+ CUR.zp0.cur[b1].y ) / 4;
+ }
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* ALIGNPTS[]: ALIGN PoinTS */
+ /* Opcode range: 0x27 */
+ /* Stack: uint32 uint32 --> */
+ /* */
+ static void
+ Ins_ALIGNPTS( INS_ARG )
+ {
+ FT_UShort p1, p2;
+ FT_F26Dot6 distance;
+
+
+ p1 = (FT_UShort)args[0];
+ p2 = (FT_UShort)args[1];
+
+ if ( BOUNDS( p1, CUR.zp1.n_points ) ||
+ BOUNDS( p2, CUR.zp0.n_points ) )
+ {
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Invalid_Reference );
+ return;
+ }
+
+ distance = CUR_Func_project( CUR.zp0.cur + p2,
+ CUR.zp1.cur + p1 ) / 2;
+
+ CUR_Func_move( &CUR.zp1, p1, distance );
+ CUR_Func_move( &CUR.zp0, p2, -distance );
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* IP[]: Interpolate Point */
+ /* Opcode range: 0x39 */
+ /* Stack: uint32... --> */
+ /* */
+
+ /* SOMETIMES, DUMBER CODE IS BETTER CODE */
+
+ static void
+ Ins_IP( INS_ARG )
+ {
+ FT_F26Dot6 old_range, cur_range;
+ FT_Vector* orus_base;
+ FT_Vector* cur_base;
+ FT_Int twilight;
+
+ FT_UNUSED_ARG;
+
+
+ if ( CUR.top < CUR.GS.loop )
+ {
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Invalid_Reference );
+ goto Fail;
+ }
+
+ /*
+ * We need to deal in a special way with the twilight zone.
+ * Otherwise, by definition, the value of CUR.twilight.orus[n] is (0,0),
+ * for every n.
+ */
+ twilight = CUR.GS.gep0 == 0 || CUR.GS.gep1 == 0 || CUR.GS.gep2 == 0;
+
+ if ( BOUNDS( CUR.GS.rp1, CUR.zp0.n_points ) )
+ {
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Invalid_Reference );
+ goto Fail;
+ }
+
+ if ( twilight )
+ orus_base = &CUR.zp0.org[CUR.GS.rp1];
+ else
+ orus_base = &CUR.zp0.orus[CUR.GS.rp1];
+
+ cur_base = &CUR.zp0.cur[CUR.GS.rp1];
+
+ /* XXX: There are some glyphs in some braindead but popular */
+ /* fonts out there (e.g. [aeu]grave in monotype.ttf) */
+ /* calling IP[] with bad values of rp[12]. */
+ /* Do something sane when this odd thing happens. */
+ if ( BOUNDS( CUR.GS.rp1, CUR.zp0.n_points ) ||
+ BOUNDS( CUR.GS.rp2, CUR.zp1.n_points ) )
+ {
+ old_range = 0;
+ cur_range = 0;
+ }
+ else
+ {
+ if ( twilight )
+ old_range = CUR_Func_dualproj( &CUR.zp1.org[CUR.GS.rp2],
+ orus_base );
+ else if ( CUR.metrics.x_scale == CUR.metrics.y_scale )
+ old_range = CUR_Func_dualproj( &CUR.zp1.orus[CUR.GS.rp2],
+ orus_base );
+ else
+ {
+ FT_Vector vec;
+
+
+ vec.x = FT_MulFix( CUR.zp1.orus[CUR.GS.rp2].x - orus_base->x,
+ CUR.metrics.x_scale );
+ vec.y = FT_MulFix( CUR.zp1.orus[CUR.GS.rp2].y - orus_base->y,
+ CUR.metrics.y_scale );
+
+ old_range = CUR_fast_dualproj( &vec );
+ }
+
+ cur_range = CUR_Func_project ( &CUR.zp1.cur[CUR.GS.rp2], cur_base );
+ }
+
+ for ( ; CUR.GS.loop > 0; --CUR.GS.loop )
+ {
+ FT_UInt point = (FT_UInt)CUR.stack[--CUR.args];
+ FT_F26Dot6 org_dist, cur_dist, new_dist;
+
+
+ /* check point bounds */
+ if ( BOUNDS( point, CUR.zp2.n_points ) )
+ {
+ if ( CUR.pedantic_hinting )
+ {
+ CUR.error = FT_THROW( Invalid_Reference );
+ return;
+ }
+ continue;
+ }
+
+ if ( twilight )
+ org_dist = CUR_Func_dualproj( &CUR.zp2.org[point], orus_base );
+ else if ( CUR.metrics.x_scale == CUR.metrics.y_scale )
+ org_dist = CUR_Func_dualproj( &CUR.zp2.orus[point], orus_base );
+ else
+ {
+ FT_Vector vec;
+
+
+ vec.x = FT_MulFix( CUR.zp2.orus[point].x - orus_base->x,
+ CUR.metrics.x_scale );
+ vec.y = FT_MulFix( CUR.zp2.orus[point].y - orus_base->y,
+ CUR.metrics.y_scale );
+
+ org_dist = CUR_fast_dualproj( &vec );
+ }
+
+ cur_dist = CUR_Func_project ( &CUR.zp2.cur[point], cur_base );
+
+ if ( org_dist )
+ {
+ if ( old_range )
+ new_dist = FT_MulDiv( org_dist, cur_range, old_range );
+ else
+ {
+ /* This is the same as what MS does for the invalid case: */
+ /* */
+ /* delta = (Original_Pt - Original_RP1) - */
+ /* (Current_Pt - Current_RP1) */
+ /* */
+ /* In FreeType speak: */
+ /* */
+ /* new_dist = cur_dist - */
+ /* org_dist - cur_dist; */
+
+ new_dist = -org_dist;
+ }
+ }
+ else
+ new_dist = 0;
+
+ CUR_Func_move( &CUR.zp2, (FT_UShort)point, new_dist - cur_dist );
+ }
+
+ Fail:
+ CUR.GS.loop = 1;
+ CUR.new_top = CUR.args;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* UTP[a]: UnTouch Point */
+ /* Opcode range: 0x29 */
+ /* Stack: uint32 --> */
+ /* */
+ static void
+ Ins_UTP( INS_ARG )
+ {
+ FT_UShort point;
+ FT_Byte mask;
+
+
+ point = (FT_UShort)args[0];
+
+ if ( BOUNDS( point, CUR.zp0.n_points ) )
+ {
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Invalid_Reference );
+ return;
+ }
+
+ mask = 0xFF;
+
+ if ( CUR.GS.freeVector.x != 0 )
+ mask &= ~FT_CURVE_TAG_TOUCH_X;
+
+ if ( CUR.GS.freeVector.y != 0 )
+ mask &= ~FT_CURVE_TAG_TOUCH_Y;
+
+ CUR.zp0.tags[point] &= mask;
+ }
+
+
+ /* Local variables for Ins_IUP: */
+ typedef struct IUP_WorkerRec_
+ {
+ FT_Vector* orgs; /* original and current coordinate */
+ FT_Vector* curs; /* arrays */
+ FT_Vector* orus;
+ FT_UInt max_points;
+
+ } IUP_WorkerRec, *IUP_Worker;
+
+
+ static void
+ _iup_worker_shift( IUP_Worker worker,
+ FT_UInt p1,
+ FT_UInt p2,
+ FT_UInt p )
+ {
+ FT_UInt i;
+ FT_F26Dot6 dx;
+
+
+ dx = worker->curs[p].x - worker->orgs[p].x;
+ if ( dx != 0 )
+ {
+ for ( i = p1; i < p; i++ )
+ worker->curs[i].x += dx;
+
+ for ( i = p + 1; i <= p2; i++ )
+ worker->curs[i].x += dx;
+ }
+ }
+
+
+ static void
+ _iup_worker_interpolate( IUP_Worker worker,
+ FT_UInt p1,
+ FT_UInt p2,
+ FT_UInt ref1,
+ FT_UInt ref2 )
+ {
+ FT_UInt i;
+ FT_F26Dot6 orus1, orus2, org1, org2, delta1, delta2;
+
+
+ if ( p1 > p2 )
+ return;
+
+ if ( BOUNDS( ref1, worker->max_points ) ||
+ BOUNDS( ref2, worker->max_points ) )
+ return;
+
+ orus1 = worker->orus[ref1].x;
+ orus2 = worker->orus[ref2].x;
+
+ if ( orus1 > orus2 )
+ {
+ FT_F26Dot6 tmp_o;
+ FT_UInt tmp_r;
+
+
+ tmp_o = orus1;
+ orus1 = orus2;
+ orus2 = tmp_o;
+
+ tmp_r = ref1;
+ ref1 = ref2;
+ ref2 = tmp_r;
+ }
+
+ org1 = worker->orgs[ref1].x;
+ org2 = worker->orgs[ref2].x;
+ delta1 = worker->curs[ref1].x - org1;
+ delta2 = worker->curs[ref2].x - org2;
+
+ if ( orus1 == orus2 )
+ {
+ /* simple shift of untouched points */
+ for ( i = p1; i <= p2; i++ )
+ {
+ FT_F26Dot6 x = worker->orgs[i].x;
+
+
+ if ( x <= org1 )
+ x += delta1;
+ else
+ x += delta2;
+
+ worker->curs[i].x = x;
+ }
+ }
+ else
+ {
+ FT_Fixed scale = 0;
+ FT_Bool scale_valid = 0;
+
+
+ /* interpolation */
+ for ( i = p1; i <= p2; i++ )
+ {
+ FT_F26Dot6 x = worker->orgs[i].x;
+
+
+ if ( x <= org1 )
+ x += delta1;
+
+ else if ( x >= org2 )
+ x += delta2;
+
+ else
+ {
+ if ( !scale_valid )
+ {
+ scale_valid = 1;
+ scale = FT_DivFix( org2 + delta2 - ( org1 + delta1 ),
+ orus2 - orus1 );
+ }
+
+ x = ( org1 + delta1 ) +
+ FT_MulFix( worker->orus[i].x - orus1, scale );
+ }
+ worker->curs[i].x = x;
+ }
+ }
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* IUP[a]: Interpolate Untouched Points */
+ /* Opcode range: 0x30-0x31 */
+ /* Stack: --> */
+ /* */
+ static void
+ Ins_IUP( INS_ARG )
+ {
+ IUP_WorkerRec V;
+ FT_Byte mask;
+
+ FT_UInt first_point; /* first point of contour */
+ FT_UInt end_point; /* end point (last+1) of contour */
+
+ FT_UInt first_touched; /* first touched point in contour */
+ FT_UInt cur_touched; /* current touched point in contour */
+
+ FT_UInt point; /* current point */
+ FT_Short contour; /* current contour */
+
+ FT_UNUSED_ARG;
+
+
+ /* ignore empty outlines */
+ if ( CUR.pts.n_contours == 0 )
+ return;
+
+ if ( CUR.opcode & 1 )
+ {
+ mask = FT_CURVE_TAG_TOUCH_X;
+ V.orgs = CUR.pts.org;
+ V.curs = CUR.pts.cur;
+ V.orus = CUR.pts.orus;
+ }
+ else
+ {
+ mask = FT_CURVE_TAG_TOUCH_Y;
+ V.orgs = (FT_Vector*)( (FT_Pos*)CUR.pts.org + 1 );
+ V.curs = (FT_Vector*)( (FT_Pos*)CUR.pts.cur + 1 );
+ V.orus = (FT_Vector*)( (FT_Pos*)CUR.pts.orus + 1 );
+ }
+ V.max_points = CUR.pts.n_points;
+
+ contour = 0;
+ point = 0;
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ if ( SUBPIXEL_HINTING &&
+ CUR.ignore_x_mode )
+ {
+ CUR.iup_called = TRUE;
+ if ( CUR.sph_tweak_flags & SPH_TWEAK_SKIP_IUP )
+ return;
+ }
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+ do
+ {
+ end_point = CUR.pts.contours[contour] - CUR.pts.first_point;
+ first_point = point;
+
+ if ( BOUNDS ( end_point, CUR.pts.n_points ) )
+ end_point = CUR.pts.n_points - 1;
+
+ while ( point <= end_point && ( CUR.pts.tags[point] & mask ) == 0 )
+ point++;
+
+ if ( point <= end_point )
+ {
+ first_touched = point;
+ cur_touched = point;
+
+ point++;
+
+ while ( point <= end_point )
+ {
+ if ( ( CUR.pts.tags[point] & mask ) != 0 )
+ {
+ _iup_worker_interpolate( &V,
+ cur_touched + 1,
+ point - 1,
+ cur_touched,
+ point );
+ cur_touched = point;
+ }
+
+ point++;
+ }
+
+ if ( cur_touched == first_touched )
+ _iup_worker_shift( &V, first_point, end_point, cur_touched );
+ else
+ {
+ _iup_worker_interpolate( &V,
+ (FT_UShort)( cur_touched + 1 ),
+ end_point,
+ cur_touched,
+ first_touched );
+
+ if ( first_touched > 0 )
+ _iup_worker_interpolate( &V,
+ first_point,
+ first_touched - 1,
+ cur_touched,
+ first_touched );
+ }
+ }
+ contour++;
+ } while ( contour < CUR.pts.n_contours );
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* DELTAPn[]: DELTA exceptions P1, P2, P3 */
+ /* Opcode range: 0x5D,0x71,0x72 */
+ /* Stack: uint32 (2 * uint32)... --> */
+ /* */
+ static void
+ Ins_DELTAP( INS_ARG )
+ {
+ FT_ULong k, nump;
+ FT_UShort A;
+ FT_ULong C;
+ FT_Long B;
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ FT_UShort B1, B2;
+
+
+ if ( SUBPIXEL_HINTING &&
+ CUR.ignore_x_mode &&
+ CUR.iup_called &&
+ ( CUR.sph_tweak_flags & SPH_TWEAK_NO_DELTAP_AFTER_IUP ) )
+ goto Fail;
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+ /* Delta hinting is covered by US Patent 5159668. */
+ if ( CUR.face->unpatented_hinting )
+ {
+ FT_Long n = args[0] * 2;
+
+
+ if ( CUR.args < n )
+ {
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Too_Few_Arguments );
+ n = CUR.args;
+ }
+
+ CUR.args -= n;
+ CUR.new_top = CUR.args;
+ return;
+ }
+#endif
+
+ nump = (FT_ULong)args[0]; /* some points theoretically may occur more
+ than once, thus UShort isn't enough */
+
+ for ( k = 1; k <= nump; k++ )
+ {
+ if ( CUR.args < 2 )
+ {
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Too_Few_Arguments );
+ CUR.args = 0;
+ goto Fail;
+ }
+
+ CUR.args -= 2;
+
+ A = (FT_UShort)CUR.stack[CUR.args + 1];
+ B = CUR.stack[CUR.args];
+
+ /* XXX: Because some popular fonts contain some invalid DeltaP */
+ /* instructions, we simply ignore them when the stacked */
+ /* point reference is off limit, rather than returning an */
+ /* error. As a delta instruction doesn't change a glyph */
+ /* in great ways, this shouldn't be a problem. */
+
+ if ( !BOUNDS( A, CUR.zp0.n_points ) )
+ {
+ C = ( (FT_ULong)B & 0xF0 ) >> 4;
+
+ switch ( CUR.opcode )
+ {
+ case 0x5D:
+ break;
+
+ case 0x71:
+ C += 16;
+ break;
+
+ case 0x72:
+ C += 32;
+ break;
+ }
+
+ C += CUR.GS.delta_base;
+
+ if ( CURRENT_Ppem() == (FT_Long)C )
+ {
+ B = ( (FT_ULong)B & 0xF ) - 8;
+ if ( B >= 0 )
+ B++;
+ B = B * 64 / ( 1L << CUR.GS.delta_shift );
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+
+ if ( SUBPIXEL_HINTING )
+ {
+ /*
+ * Allow delta move if
+ *
+ * - not using ignore_x_mode rendering
+ * - glyph is specifically set to allow it
+ * - glyph is composite and freedom vector is not subpixel
+ * vector
+ */
+ if ( !CUR.ignore_x_mode ||
+ ( CUR.sph_tweak_flags & SPH_TWEAK_ALWAYS_DO_DELTAP ) ||
+ ( CUR.is_composite && CUR.GS.freeVector.y != 0 ) )
+ CUR_Func_move( &CUR.zp0, A, B );
+
+ /* Otherwise apply subpixel hinting and */
+ /* compatibility mode rules */
+ else if ( CUR.ignore_x_mode )
+ {
+ if ( CUR.GS.freeVector.y != 0 )
+ B1 = CUR.zp0.cur[A].y;
+ else
+ B1 = CUR.zp0.cur[A].x;
+
+#if 0
+ /* Standard Subpixel Hinting: Allow y move. */
+ /* This messes up dejavu and may not be needed... */
+ if ( !CUR.face->sph_compatibility_mode &&
+ CUR.GS.freeVector.y != 0 )
+ CUR_Func_move( &CUR.zp0, A, B );
+ else
+#endif /* 0 */
+
+ /* Compatibility Mode: Allow x or y move if point touched in */
+ /* Y direction. */
+ if ( CUR.face->sph_compatibility_mode &&
+ !( CUR.sph_tweak_flags & SPH_TWEAK_ALWAYS_SKIP_DELTAP ) )
+ {
+ /* save the y value of the point now; compare after move */
+ B1 = CUR.zp0.cur[A].y;
+
+ if ( CUR.sph_tweak_flags & SPH_TWEAK_ROUND_NONPIXEL_Y_MOVES )
+ B = FT_PIX_ROUND( B1 + B ) - B1;
+
+ /* Allow delta move if using sph_compatibility_mode, */
+ /* IUP has not been called, and point is touched on Y. */
+ if ( !CUR.iup_called &&
+ ( CUR.zp0.tags[A] & FT_CURVE_TAG_TOUCH_Y ) )
+ CUR_Func_move( &CUR.zp0, A, B );
+ }
+
+ B2 = CUR.zp0.cur[A].y;
+
+ /* Reverse this move if it results in a disallowed move */
+ if ( CUR.GS.freeVector.y != 0 &&
+ ( ( CUR.face->sph_compatibility_mode &&
+ ( B1 & 63 ) == 0 &&
+ ( B2 & 63 ) != 0 ) ||
+ ( ( CUR.sph_tweak_flags &
+ SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES_DELTAP ) &&
+ ( B1 & 63 ) != 0 &&
+ ( B2 & 63 ) != 0 ) ) )
+ CUR_Func_move( &CUR.zp0, A, -B );
+ }
+ }
+ else
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+ CUR_Func_move( &CUR.zp0, A, B );
+ }
+ }
+ else
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Invalid_Reference );
+ }
+
+ Fail:
+ CUR.new_top = CUR.args;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* DELTACn[]: DELTA exceptions C1, C2, C3 */
+ /* Opcode range: 0x73,0x74,0x75 */
+ /* Stack: uint32 (2 * uint32)... --> */
+ /* */
+ static void
+ Ins_DELTAC( INS_ARG )
+ {
+ FT_ULong nump, k;
+ FT_ULong A, C;
+ FT_Long B;
+
+
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+ /* Delta hinting is covered by US Patent 5159668. */
+ if ( CUR.face->unpatented_hinting )
+ {
+ FT_Long n = args[0] * 2;
+
+
+ if ( CUR.args < n )
+ {
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Too_Few_Arguments );
+ n = CUR.args;
+ }
+
+ CUR.args -= n;
+ CUR.new_top = CUR.args;
+ return;
+ }
+#endif
+
+ nump = (FT_ULong)args[0];
+
+ for ( k = 1; k <= nump; k++ )
+ {
+ if ( CUR.args < 2 )
+ {
+ if ( CUR.pedantic_hinting )
+ CUR.error = FT_THROW( Too_Few_Arguments );
+ CUR.args = 0;
+ goto Fail;
+ }
+
+ CUR.args -= 2;
+
+ A = (FT_ULong)CUR.stack[CUR.args + 1];
+ B = CUR.stack[CUR.args];
+
+ if ( BOUNDSL( A, CUR.cvtSize ) )
+ {
+ if ( CUR.pedantic_hinting )
+ {
+ CUR.error = FT_THROW( Invalid_Reference );
+ return;
+ }
+ }
+ else
+ {
+ C = ( (FT_ULong)B & 0xF0 ) >> 4;
+
+ switch ( CUR.opcode )
+ {
+ case 0x73:
+ break;
+
+ case 0x74:
+ C += 16;
+ break;
+
+ case 0x75:
+ C += 32;
+ break;
+ }
+
+ C += CUR.GS.delta_base;
+
+ if ( CURRENT_Ppem() == (FT_Long)C )
+ {
+ B = ( (FT_ULong)B & 0xF ) - 8;
+ if ( B >= 0 )
+ B++;
+ B = B * 64 / ( 1L << CUR.GS.delta_shift );
+
+ CUR_Func_move_cvt( A, B );
+ }
+ }
+ }
+
+ Fail:
+ CUR.new_top = CUR.args;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* MISC. INSTRUCTIONS */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* GETINFO[]: GET INFOrmation */
+ /* Opcode range: 0x88 */
+ /* Stack: uint32 --> uint32 */
+ /* */
+ static void
+ Ins_GETINFO( INS_ARG )
+ {
+ FT_Long K;
+
+
+ K = 0;
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ /********************************/
+ /* RASTERIZER VERSION */
+ /* Selector Bit: 0 */
+ /* Return Bit(s): 0-7 */
+ /* */
+ if ( SUBPIXEL_HINTING &&
+ ( args[0] & 1 ) != 0 &&
+ CUR.ignore_x_mode )
+ {
+ K = CUR.rasterizer_version;
+ FT_TRACE7(( "Setting rasterizer version %d\n",
+ CUR.rasterizer_version ));
+ }
+ else
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+ if ( ( args[0] & 1 ) != 0 )
+ K = TT_INTERPRETER_VERSION_35;
+
+ /********************************/
+ /* GLYPH ROTATED */
+ /* Selector Bit: 1 */
+ /* Return Bit(s): 8 */
+ /* */
+ if ( ( args[0] & 2 ) != 0 && CUR.tt_metrics.rotated )
+ K |= 0x80;
+
+ /********************************/
+ /* GLYPH STRETCHED */
+ /* Selector Bit: 2 */
+ /* Return Bit(s): 9 */
+ /* */
+ if ( ( args[0] & 4 ) != 0 && CUR.tt_metrics.stretched )
+ K |= 1 << 8;
+
+ /********************************/
+ /* HINTING FOR GRAYSCALE */
+ /* Selector Bit: 5 */
+ /* Return Bit(s): 12 */
+ /* */
+ if ( ( args[0] & 32 ) != 0 && CUR.grayscale )
+ K |= 1 << 12;
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+
+ if ( SUBPIXEL_HINTING &&
+ CUR.ignore_x_mode &&
+ CUR.rasterizer_version >= TT_INTERPRETER_VERSION_35 )
+ {
+ /********************************/
+ /* HINTING FOR GRAYSCALE */
+ /* Selector Bit: 5 */
+ /* Return Bit(s): 12 */
+ /* */
+ if ( ( args[0] & 32 ) != 0 && CUR.grayscale_hinting )
+ K |= 1 << 12;
+
+ /********************************/
+ /* HINTING FOR SUBPIXEL */
+ /* Selector Bit: 6 */
+ /* Return Bit(s): 13 */
+ /* */
+ if ( ( args[0] & 64 ) != 0 &&
+ CUR.subpixel_hinting &&
+ CUR.rasterizer_version >= 37 )
+ {
+ K |= 1 << 13;
+
+ /* the stuff below is irrelevant if subpixel_hinting is not set */
+
+ /********************************/
+ /* COMPATIBLE WIDTHS ENABLED */
+ /* Selector Bit: 7 */
+ /* Return Bit(s): 14 */
+ /* */
+ /* Functionality still needs to be added */
+ if ( ( args[0] & 128 ) != 0 && CUR.compatible_widths )
+ K |= 1 << 14;
+
+ /********************************/
+ /* SYMMETRICAL SMOOTHING */
+ /* Selector Bit: 8 */
+ /* Return Bit(s): 15 */
+ /* */
+ /* Functionality still needs to be added */
+ if ( ( args[0] & 256 ) != 0 && CUR.symmetrical_smoothing )
+ K |= 1 << 15;
+
+ /********************************/
+ /* HINTING FOR BGR? */
+ /* Selector Bit: 9 */
+ /* Return Bit(s): 16 */
+ /* */
+ /* Functionality still needs to be added */
+ if ( ( args[0] & 512 ) != 0 && CUR.bgr )
+ K |= 1 << 16;
+
+ if ( CUR.rasterizer_version >= 38 )
+ {
+ /********************************/
+ /* SUBPIXEL POSITIONED? */
+ /* Selector Bit: 10 */
+ /* Return Bit(s): 17 */
+ /* */
+ /* Functionality still needs to be added */
+ if ( ( args[0] & 1024 ) != 0 && CUR.subpixel_positioned )
+ K |= 1 << 17;
+ }
+ }
+ }
+
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+ args[0] = K;
+ }
+
+
+ static void
+ Ins_UNKNOWN( INS_ARG )
+ {
+ TT_DefRecord* def = CUR.IDefs;
+ TT_DefRecord* limit = def + CUR.numIDefs;
+
+ FT_UNUSED_ARG;
+
+
+ for ( ; def < limit; def++ )
+ {
+ if ( (FT_Byte)def->opc == CUR.opcode && def->active )
+ {
+ TT_CallRec* call;
+
+
+ if ( CUR.callTop >= CUR.callSize )
+ {
+ CUR.error = FT_THROW( Stack_Overflow );
+ return;
+ }
+
+ call = CUR.callStack + CUR.callTop++;
+
+ call->Caller_Range = CUR.curRange;
+ call->Caller_IP = CUR.IP + 1;
+ call->Cur_Count = 1;
+ call->Cur_Restart = def->start;
+ call->Cur_End = def->end;
+
+ INS_Goto_CodeRange( def->range, def->start );
+
+ CUR.step_ins = FALSE;
+ return;
+ }
+ }
+
+ CUR.error = FT_THROW( Invalid_Opcode );
+ }
+
+
+#ifndef TT_CONFIG_OPTION_INTERPRETER_SWITCH
+
+
+ static
+ TInstruction_Function Instruct_Dispatch[256] =
+ {
+ /* Opcodes are gathered in groups of 16. */
+ /* Please keep the spaces as they are. */
+
+ /* SVTCA y */ Ins_SVTCA,
+ /* SVTCA x */ Ins_SVTCA,
+ /* SPvTCA y */ Ins_SPVTCA,
+ /* SPvTCA x */ Ins_SPVTCA,
+ /* SFvTCA y */ Ins_SFVTCA,
+ /* SFvTCA x */ Ins_SFVTCA,
+ /* SPvTL // */ Ins_SPVTL,
+ /* SPvTL + */ Ins_SPVTL,
+ /* SFvTL // */ Ins_SFVTL,
+ /* SFvTL + */ Ins_SFVTL,
+ /* SPvFS */ Ins_SPVFS,
+ /* SFvFS */ Ins_SFVFS,
+ /* GPV */ Ins_GPV,
+ /* GFV */ Ins_GFV,
+ /* SFvTPv */ Ins_SFVTPV,
+ /* ISECT */ Ins_ISECT,
+
+ /* SRP0 */ Ins_SRP0,
+ /* SRP1 */ Ins_SRP1,
+ /* SRP2 */ Ins_SRP2,
+ /* SZP0 */ Ins_SZP0,
+ /* SZP1 */ Ins_SZP1,
+ /* SZP2 */ Ins_SZP2,
+ /* SZPS */ Ins_SZPS,
+ /* SLOOP */ Ins_SLOOP,
+ /* RTG */ Ins_RTG,
+ /* RTHG */ Ins_RTHG,
+ /* SMD */ Ins_SMD,
+ /* ELSE */ Ins_ELSE,
+ /* JMPR */ Ins_JMPR,
+ /* SCvTCi */ Ins_SCVTCI,
+ /* SSwCi */ Ins_SSWCI,
+ /* SSW */ Ins_SSW,
+
+ /* DUP */ Ins_DUP,
+ /* POP */ Ins_POP,
+ /* CLEAR */ Ins_CLEAR,
+ /* SWAP */ Ins_SWAP,
+ /* DEPTH */ Ins_DEPTH,
+ /* CINDEX */ Ins_CINDEX,
+ /* MINDEX */ Ins_MINDEX,
+ /* AlignPTS */ Ins_ALIGNPTS,
+ /* INS_0x28 */ Ins_UNKNOWN,
+ /* UTP */ Ins_UTP,
+ /* LOOPCALL */ Ins_LOOPCALL,
+ /* CALL */ Ins_CALL,
+ /* FDEF */ Ins_FDEF,
+ /* ENDF */ Ins_ENDF,
+ /* MDAP[0] */ Ins_MDAP,
+ /* MDAP[1] */ Ins_MDAP,
+
+ /* IUP[0] */ Ins_IUP,
+ /* IUP[1] */ Ins_IUP,
+ /* SHP[0] */ Ins_SHP,
+ /* SHP[1] */ Ins_SHP,
+ /* SHC[0] */ Ins_SHC,
+ /* SHC[1] */ Ins_SHC,
+ /* SHZ[0] */ Ins_SHZ,
+ /* SHZ[1] */ Ins_SHZ,
+ /* SHPIX */ Ins_SHPIX,
+ /* IP */ Ins_IP,
+ /* MSIRP[0] */ Ins_MSIRP,
+ /* MSIRP[1] */ Ins_MSIRP,
+ /* AlignRP */ Ins_ALIGNRP,
+ /* RTDG */ Ins_RTDG,
+ /* MIAP[0] */ Ins_MIAP,
+ /* MIAP[1] */ Ins_MIAP,
+
+ /* NPushB */ Ins_NPUSHB,
+ /* NPushW */ Ins_NPUSHW,
+ /* WS */ Ins_WS,
+ /* RS */ Ins_RS,
+ /* WCvtP */ Ins_WCVTP,
+ /* RCvt */ Ins_RCVT,
+ /* GC[0] */ Ins_GC,
+ /* GC[1] */ Ins_GC,
+ /* SCFS */ Ins_SCFS,
+ /* MD[0] */ Ins_MD,
+ /* MD[1] */ Ins_MD,
+ /* MPPEM */ Ins_MPPEM,
+ /* MPS */ Ins_MPS,
+ /* FlipON */ Ins_FLIPON,
+ /* FlipOFF */ Ins_FLIPOFF,
+ /* DEBUG */ Ins_DEBUG,
+
+ /* LT */ Ins_LT,
+ /* LTEQ */ Ins_LTEQ,
+ /* GT */ Ins_GT,
+ /* GTEQ */ Ins_GTEQ,
+ /* EQ */ Ins_EQ,
+ /* NEQ */ Ins_NEQ,
+ /* ODD */ Ins_ODD,
+ /* EVEN */ Ins_EVEN,
+ /* IF */ Ins_IF,
+ /* EIF */ Ins_EIF,
+ /* AND */ Ins_AND,
+ /* OR */ Ins_OR,
+ /* NOT */ Ins_NOT,
+ /* DeltaP1 */ Ins_DELTAP,
+ /* SDB */ Ins_SDB,
+ /* SDS */ Ins_SDS,
+
+ /* ADD */ Ins_ADD,
+ /* SUB */ Ins_SUB,
+ /* DIV */ Ins_DIV,
+ /* MUL */ Ins_MUL,
+ /* ABS */ Ins_ABS,
+ /* NEG */ Ins_NEG,
+ /* FLOOR */ Ins_FLOOR,
+ /* CEILING */ Ins_CEILING,
+ /* ROUND[0] */ Ins_ROUND,
+ /* ROUND[1] */ Ins_ROUND,
+ /* ROUND[2] */ Ins_ROUND,
+ /* ROUND[3] */ Ins_ROUND,
+ /* NROUND[0] */ Ins_NROUND,
+ /* NROUND[1] */ Ins_NROUND,
+ /* NROUND[2] */ Ins_NROUND,
+ /* NROUND[3] */ Ins_NROUND,
+
+ /* WCvtF */ Ins_WCVTF,
+ /* DeltaP2 */ Ins_DELTAP,
+ /* DeltaP3 */ Ins_DELTAP,
+ /* DeltaCn[0] */ Ins_DELTAC,
+ /* DeltaCn[1] */ Ins_DELTAC,
+ /* DeltaCn[2] */ Ins_DELTAC,
+ /* SROUND */ Ins_SROUND,
+ /* S45Round */ Ins_S45ROUND,
+ /* JROT */ Ins_JROT,
+ /* JROF */ Ins_JROF,
+ /* ROFF */ Ins_ROFF,
+ /* INS_0x7B */ Ins_UNKNOWN,
+ /* RUTG */ Ins_RUTG,
+ /* RDTG */ Ins_RDTG,
+ /* SANGW */ Ins_SANGW,
+ /* AA */ Ins_AA,
+
+ /* FlipPT */ Ins_FLIPPT,
+ /* FlipRgON */ Ins_FLIPRGON,
+ /* FlipRgOFF */ Ins_FLIPRGOFF,
+ /* INS_0x83 */ Ins_UNKNOWN,
+ /* INS_0x84 */ Ins_UNKNOWN,
+ /* ScanCTRL */ Ins_SCANCTRL,
+ /* SDPVTL[0] */ Ins_SDPVTL,
+ /* SDPVTL[1] */ Ins_SDPVTL,
+ /* GetINFO */ Ins_GETINFO,
+ /* IDEF */ Ins_IDEF,
+ /* ROLL */ Ins_ROLL,
+ /* MAX */ Ins_MAX,
+ /* MIN */ Ins_MIN,
+ /* ScanTYPE */ Ins_SCANTYPE,
+ /* InstCTRL */ Ins_INSTCTRL,
+ /* INS_0x8F */ Ins_UNKNOWN,
+
+ /* INS_0x90 */ Ins_UNKNOWN,
+ /* INS_0x91 */ Ins_UNKNOWN,
+ /* INS_0x92 */ Ins_UNKNOWN,
+ /* INS_0x93 */ Ins_UNKNOWN,
+ /* INS_0x94 */ Ins_UNKNOWN,
+ /* INS_0x95 */ Ins_UNKNOWN,
+ /* INS_0x96 */ Ins_UNKNOWN,
+ /* INS_0x97 */ Ins_UNKNOWN,
+ /* INS_0x98 */ Ins_UNKNOWN,
+ /* INS_0x99 */ Ins_UNKNOWN,
+ /* INS_0x9A */ Ins_UNKNOWN,
+ /* INS_0x9B */ Ins_UNKNOWN,
+ /* INS_0x9C */ Ins_UNKNOWN,
+ /* INS_0x9D */ Ins_UNKNOWN,
+ /* INS_0x9E */ Ins_UNKNOWN,
+ /* INS_0x9F */ Ins_UNKNOWN,
+
+ /* INS_0xA0 */ Ins_UNKNOWN,
+ /* INS_0xA1 */ Ins_UNKNOWN,
+ /* INS_0xA2 */ Ins_UNKNOWN,
+ /* INS_0xA3 */ Ins_UNKNOWN,
+ /* INS_0xA4 */ Ins_UNKNOWN,
+ /* INS_0xA5 */ Ins_UNKNOWN,
+ /* INS_0xA6 */ Ins_UNKNOWN,
+ /* INS_0xA7 */ Ins_UNKNOWN,
+ /* INS_0xA8 */ Ins_UNKNOWN,
+ /* INS_0xA9 */ Ins_UNKNOWN,
+ /* INS_0xAA */ Ins_UNKNOWN,
+ /* INS_0xAB */ Ins_UNKNOWN,
+ /* INS_0xAC */ Ins_UNKNOWN,
+ /* INS_0xAD */ Ins_UNKNOWN,
+ /* INS_0xAE */ Ins_UNKNOWN,
+ /* INS_0xAF */ Ins_UNKNOWN,
+
+ /* PushB[0] */ Ins_PUSHB,
+ /* PushB[1] */ Ins_PUSHB,
+ /* PushB[2] */ Ins_PUSHB,
+ /* PushB[3] */ Ins_PUSHB,
+ /* PushB[4] */ Ins_PUSHB,
+ /* PushB[5] */ Ins_PUSHB,
+ /* PushB[6] */ Ins_PUSHB,
+ /* PushB[7] */ Ins_PUSHB,
+ /* PushW[0] */ Ins_PUSHW,
+ /* PushW[1] */ Ins_PUSHW,
+ /* PushW[2] */ Ins_PUSHW,
+ /* PushW[3] */ Ins_PUSHW,
+ /* PushW[4] */ Ins_PUSHW,
+ /* PushW[5] */ Ins_PUSHW,
+ /* PushW[6] */ Ins_PUSHW,
+ /* PushW[7] */ Ins_PUSHW,
+
+ /* MDRP[00] */ Ins_MDRP,
+ /* MDRP[01] */ Ins_MDRP,
+ /* MDRP[02] */ Ins_MDRP,
+ /* MDRP[03] */ Ins_MDRP,
+ /* MDRP[04] */ Ins_MDRP,
+ /* MDRP[05] */ Ins_MDRP,
+ /* MDRP[06] */ Ins_MDRP,
+ /* MDRP[07] */ Ins_MDRP,
+ /* MDRP[08] */ Ins_MDRP,
+ /* MDRP[09] */ Ins_MDRP,
+ /* MDRP[10] */ Ins_MDRP,
+ /* MDRP[11] */ Ins_MDRP,
+ /* MDRP[12] */ Ins_MDRP,
+ /* MDRP[13] */ Ins_MDRP,
+ /* MDRP[14] */ Ins_MDRP,
+ /* MDRP[15] */ Ins_MDRP,
+
+ /* MDRP[16] */ Ins_MDRP,
+ /* MDRP[17] */ Ins_MDRP,
+ /* MDRP[18] */ Ins_MDRP,
+ /* MDRP[19] */ Ins_MDRP,
+ /* MDRP[20] */ Ins_MDRP,
+ /* MDRP[21] */ Ins_MDRP,
+ /* MDRP[22] */ Ins_MDRP,
+ /* MDRP[23] */ Ins_MDRP,
+ /* MDRP[24] */ Ins_MDRP,
+ /* MDRP[25] */ Ins_MDRP,
+ /* MDRP[26] */ Ins_MDRP,
+ /* MDRP[27] */ Ins_MDRP,
+ /* MDRP[28] */ Ins_MDRP,
+ /* MDRP[29] */ Ins_MDRP,
+ /* MDRP[30] */ Ins_MDRP,
+ /* MDRP[31] */ Ins_MDRP,
+
+ /* MIRP[00] */ Ins_MIRP,
+ /* MIRP[01] */ Ins_MIRP,
+ /* MIRP[02] */ Ins_MIRP,
+ /* MIRP[03] */ Ins_MIRP,
+ /* MIRP[04] */ Ins_MIRP,
+ /* MIRP[05] */ Ins_MIRP,
+ /* MIRP[06] */ Ins_MIRP,
+ /* MIRP[07] */ Ins_MIRP,
+ /* MIRP[08] */ Ins_MIRP,
+ /* MIRP[09] */ Ins_MIRP,
+ /* MIRP[10] */ Ins_MIRP,
+ /* MIRP[11] */ Ins_MIRP,
+ /* MIRP[12] */ Ins_MIRP,
+ /* MIRP[13] */ Ins_MIRP,
+ /* MIRP[14] */ Ins_MIRP,
+ /* MIRP[15] */ Ins_MIRP,
+
+ /* MIRP[16] */ Ins_MIRP,
+ /* MIRP[17] */ Ins_MIRP,
+ /* MIRP[18] */ Ins_MIRP,
+ /* MIRP[19] */ Ins_MIRP,
+ /* MIRP[20] */ Ins_MIRP,
+ /* MIRP[21] */ Ins_MIRP,
+ /* MIRP[22] */ Ins_MIRP,
+ /* MIRP[23] */ Ins_MIRP,
+ /* MIRP[24] */ Ins_MIRP,
+ /* MIRP[25] */ Ins_MIRP,
+ /* MIRP[26] */ Ins_MIRP,
+ /* MIRP[27] */ Ins_MIRP,
+ /* MIRP[28] */ Ins_MIRP,
+ /* MIRP[29] */ Ins_MIRP,
+ /* MIRP[30] */ Ins_MIRP,
+ /* MIRP[31] */ Ins_MIRP
+ };
+
+
+#endif /* !TT_CONFIG_OPTION_INTERPRETER_SWITCH */
+
+
+ /*************************************************************************/
+ /* */
+ /* RUN */
+ /* */
+ /* This function executes a run of opcodes. It will exit in the */
+ /* following cases: */
+ /* */
+ /* - Errors (in which case it returns FALSE). */
+ /* */
+ /* - Reaching the end of the main code range (returns TRUE). */
+ /* Reaching the end of a code range within a function call is an */
+ /* error. */
+ /* */
+ /* - After executing one single opcode, if the flag `Instruction_Trap' */
+ /* is set to TRUE (returns TRUE). */
+ /* */
+ /* On exit with TRUE, test IP < CodeSize to know whether it comes from */
+ /* an instruction trap or a normal termination. */
+ /* */
+ /* */
+ /* Note: The documented DEBUG opcode pops a value from the stack. This */
+ /* behaviour is unsupported; here a DEBUG opcode is always an */
+ /* error. */
+ /* */
+ /* */
+ /* THIS IS THE INTERPRETER'S MAIN LOOP. */
+ /* */
+ /* Instructions appear in the specification's order. */
+ /* */
+ /*************************************************************************/
+
+
+ /* documentation is in ttinterp.h */
+
+ FT_EXPORT_DEF( FT_Error )
+ TT_RunIns( TT_ExecContext exc )
+ {
+ FT_Long ins_counter = 0; /* executed instructions counter */
+ FT_UShort i;
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ FT_Byte opcode_pattern[1][2] = {
+ /* #8 TypeMan Talk Align */
+ {
+ 0x06, /* SPVTL */
+ 0x7D, /* RDTG */
+ },
+ };
+ FT_UShort opcode_patterns = 1;
+ FT_UShort opcode_pointer[1] = { 0 };
+ FT_UShort opcode_size[1] = { 1 };
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+
+#ifdef TT_CONFIG_OPTION_STATIC_RASTER
+ cur = *exc;
+#endif
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ CUR.iup_called = FALSE;
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+ /* set CVT functions */
+ CUR.tt_metrics.ratio = 0;
+ if ( CUR.metrics.x_ppem != CUR.metrics.y_ppem )
+ {
+ /* non-square pixels, use the stretched routines */
+ CUR.func_read_cvt = Read_CVT_Stretched;
+ CUR.func_write_cvt = Write_CVT_Stretched;
+ CUR.func_move_cvt = Move_CVT_Stretched;
+ }
+ else
+ {
+ /* square pixels, use normal routines */
+ CUR.func_read_cvt = Read_CVT;
+ CUR.func_write_cvt = Write_CVT;
+ CUR.func_move_cvt = Move_CVT;
+ }
+
+ COMPUTE_Funcs();
+ COMPUTE_Round( (FT_Byte)exc->GS.round_state );
+
+ do
+ {
+ CUR.opcode = CUR.code[CUR.IP];
+
+ FT_TRACE7(( " " ));
+ FT_TRACE7(( opcode_name[CUR.opcode] ));
+ FT_TRACE7(( "\n" ));
+
+ if ( ( CUR.length = opcode_length[CUR.opcode] ) < 0 )
+ {
+ if ( CUR.IP + 1 >= CUR.codeSize )
+ goto LErrorCodeOverflow_;
+
+ CUR.length = 2 - CUR.length * CUR.code[CUR.IP + 1];
+ }
+
+ if ( CUR.IP + CUR.length > CUR.codeSize )
+ goto LErrorCodeOverflow_;
+
+ /* First, let's check for empty stack and overflow */
+ CUR.args = CUR.top - ( Pop_Push_Count[CUR.opcode] >> 4 );
+
+ /* `args' is the top of the stack once arguments have been popped. */
+ /* One can also interpret it as the index of the last argument. */
+ if ( CUR.args < 0 )
+ {
+ if ( CUR.pedantic_hinting )
+ {
+ CUR.error = FT_THROW( Too_Few_Arguments );
+ goto LErrorLabel_;
+ }
+
+ /* push zeroes onto the stack */
+ for ( i = 0; i < Pop_Push_Count[CUR.opcode] >> 4; i++ )
+ CUR.stack[i] = 0;
+ CUR.args = 0;
+ }
+
+ CUR.new_top = CUR.args + ( Pop_Push_Count[CUR.opcode] & 15 );
+
+ /* `new_top' is the new top of the stack, after the instruction's */
+ /* execution. `top' will be set to `new_top' after the `switch' */
+ /* statement. */
+ if ( CUR.new_top > CUR.stackSize )
+ {
+ CUR.error = FT_THROW( Stack_Overflow );
+ goto LErrorLabel_;
+ }
+
+ CUR.step_ins = TRUE;
+ CUR.error = FT_Err_Ok;
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+
+ if ( SUBPIXEL_HINTING )
+ {
+ for ( i = 0; i < opcode_patterns; i++ )
+ {
+ if ( opcode_pointer[i] < opcode_size[i] &&
+ CUR.opcode == opcode_pattern[i][opcode_pointer[i]] )
+ {
+ opcode_pointer[i] += 1;
+
+ if ( opcode_pointer[i] == opcode_size[i] )
+ {
+ FT_TRACE7(( "sph: opcode ptrn: %d, %s %s\n",
+ i,
+ CUR.face->root.family_name,
+ CUR.face->root.style_name ));
+
+ switch ( i )
+ {
+ case 0:
+ break;
+ }
+ opcode_pointer[i] = 0;
+ }
+ }
+ else
+ opcode_pointer[i] = 0;
+ }
+ }
+
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+#ifdef TT_CONFIG_OPTION_INTERPRETER_SWITCH
+
+ {
+ FT_Long* args = CUR.stack + CUR.args;
+ FT_Byte opcode = CUR.opcode;
+
+
+#undef ARRAY_BOUND_ERROR
+#define ARRAY_BOUND_ERROR goto Set_Invalid_Ref
+
+
+ switch ( opcode )
+ {
+ case 0x00: /* SVTCA y */
+ case 0x01: /* SVTCA x */
+ case 0x02: /* SPvTCA y */
+ case 0x03: /* SPvTCA x */
+ case 0x04: /* SFvTCA y */
+ case 0x05: /* SFvTCA x */
+ {
+ FT_Short AA, BB;
+
+
+ AA = (FT_Short)( ( opcode & 1 ) << 14 );
+ BB = (FT_Short)( AA ^ 0x4000 );
+
+ if ( opcode < 4 )
+ {
+ CUR.GS.projVector.x = AA;
+ CUR.GS.projVector.y = BB;
+
+ CUR.GS.dualVector.x = AA;
+ CUR.GS.dualVector.y = BB;
+ }
+ else
+ {
+ GUESS_VECTOR( projVector );
+ }
+
+ if ( ( opcode & 2 ) == 0 )
+ {
+ CUR.GS.freeVector.x = AA;
+ CUR.GS.freeVector.y = BB;
+ }
+ else
+ {
+ GUESS_VECTOR( freeVector );
+ }
+
+ COMPUTE_Funcs();
+ }
+ break;
+
+ case 0x06: /* SPvTL // */
+ case 0x07: /* SPvTL + */
+ DO_SPVTL
+ break;
+
+ case 0x08: /* SFvTL // */
+ case 0x09: /* SFvTL + */
+ DO_SFVTL
+ break;
+
+ case 0x0A: /* SPvFS */
+ DO_SPVFS
+ break;
+
+ case 0x0B: /* SFvFS */
+ DO_SFVFS
+ break;
+
+ case 0x0C: /* GPV */
+ DO_GPV
+ break;
+
+ case 0x0D: /* GFV */
+ DO_GFV
+ break;
+
+ case 0x0E: /* SFvTPv */
+ DO_SFVTPV
+ break;
+
+ case 0x0F: /* ISECT */
+ Ins_ISECT( EXEC_ARG_ args );
+ break;
+
+ case 0x10: /* SRP0 */
+ DO_SRP0
+ break;
+
+ case 0x11: /* SRP1 */
+ DO_SRP1
+ break;
+
+ case 0x12: /* SRP2 */
+ DO_SRP2
+ break;
+
+ case 0x13: /* SZP0 */
+ Ins_SZP0( EXEC_ARG_ args );
+ break;
+
+ case 0x14: /* SZP1 */
+ Ins_SZP1( EXEC_ARG_ args );
+ break;
+
+ case 0x15: /* SZP2 */
+ Ins_SZP2( EXEC_ARG_ args );
+ break;
+
+ case 0x16: /* SZPS */
+ Ins_SZPS( EXEC_ARG_ args );
+ break;
+
+ case 0x17: /* SLOOP */
+ DO_SLOOP
+ break;
+
+ case 0x18: /* RTG */
+ DO_RTG
+ break;
+
+ case 0x19: /* RTHG */
+ DO_RTHG
+ break;
+
+ case 0x1A: /* SMD */
+ DO_SMD
+ break;
+
+ case 0x1B: /* ELSE */
+ Ins_ELSE( EXEC_ARG_ args );
+ break;
+
+ case 0x1C: /* JMPR */
+ DO_JMPR
+ break;
+
+ case 0x1D: /* SCVTCI */
+ DO_SCVTCI
+ break;
+
+ case 0x1E: /* SSWCI */
+ DO_SSWCI
+ break;
+
+ case 0x1F: /* SSW */
+ DO_SSW
+ break;
+
+ case 0x20: /* DUP */
+ DO_DUP
+ break;
+
+ case 0x21: /* POP */
+ /* nothing :-) */
+ break;
+
+ case 0x22: /* CLEAR */
+ DO_CLEAR
+ break;
+
+ case 0x23: /* SWAP */
+ DO_SWAP
+ break;
+
+ case 0x24: /* DEPTH */
+ DO_DEPTH
+ break;
+
+ case 0x25: /* CINDEX */
+ DO_CINDEX
+ break;
+
+ case 0x26: /* MINDEX */
+ Ins_MINDEX( EXEC_ARG_ args );
+ break;
+
+ case 0x27: /* ALIGNPTS */
+ Ins_ALIGNPTS( EXEC_ARG_ args );
+ break;
+
+ case 0x28: /* ???? */
+ Ins_UNKNOWN( EXEC_ARG_ args );
+ break;
+
+ case 0x29: /* UTP */
+ Ins_UTP( EXEC_ARG_ args );
+ break;
+
+ case 0x2A: /* LOOPCALL */
+ Ins_LOOPCALL( EXEC_ARG_ args );
+ break;
+
+ case 0x2B: /* CALL */
+ Ins_CALL( EXEC_ARG_ args );
+ break;
+
+ case 0x2C: /* FDEF */
+ Ins_FDEF( EXEC_ARG_ args );
+ break;
+
+ case 0x2D: /* ENDF */
+ Ins_ENDF( EXEC_ARG_ args );
+ break;
+
+ case 0x2E: /* MDAP */
+ case 0x2F: /* MDAP */
+ Ins_MDAP( EXEC_ARG_ args );
+ break;
+
+ case 0x30: /* IUP */
+ case 0x31: /* IUP */
+ Ins_IUP( EXEC_ARG_ args );
+ break;
+
+ case 0x32: /* SHP */
+ case 0x33: /* SHP */
+ Ins_SHP( EXEC_ARG_ args );
+ break;
+
+ case 0x34: /* SHC */
+ case 0x35: /* SHC */
+ Ins_SHC( EXEC_ARG_ args );
+ break;
+
+ case 0x36: /* SHZ */
+ case 0x37: /* SHZ */
+ Ins_SHZ( EXEC_ARG_ args );
+ break;
+
+ case 0x38: /* SHPIX */
+ Ins_SHPIX( EXEC_ARG_ args );
+ break;
+
+ case 0x39: /* IP */
+ Ins_IP( EXEC_ARG_ args );
+ break;
+
+ case 0x3A: /* MSIRP */
+ case 0x3B: /* MSIRP */
+ Ins_MSIRP( EXEC_ARG_ args );
+ break;
+
+ case 0x3C: /* AlignRP */
+ Ins_ALIGNRP( EXEC_ARG_ args );
+ break;
+
+ case 0x3D: /* RTDG */
+ DO_RTDG
+ break;
+
+ case 0x3E: /* MIAP */
+ case 0x3F: /* MIAP */
+ Ins_MIAP( EXEC_ARG_ args );
+ break;
+
+ case 0x40: /* NPUSHB */
+ Ins_NPUSHB( EXEC_ARG_ args );
+ break;
+
+ case 0x41: /* NPUSHW */
+ Ins_NPUSHW( EXEC_ARG_ args );
+ break;
+
+ case 0x42: /* WS */
+ DO_WS
+ break;
+
+ Set_Invalid_Ref:
+ CUR.error = FT_THROW( Invalid_Reference );
+ break;
+
+ case 0x43: /* RS */
+ DO_RS
+ break;
+
+ case 0x44: /* WCVTP */
+ DO_WCVTP
+ break;
+
+ case 0x45: /* RCVT */
+ DO_RCVT
+ break;
+
+ case 0x46: /* GC */
+ case 0x47: /* GC */
+ Ins_GC( EXEC_ARG_ args );
+ break;
+
+ case 0x48: /* SCFS */
+ Ins_SCFS( EXEC_ARG_ args );
+ break;
+
+ case 0x49: /* MD */
+ case 0x4A: /* MD */
+ Ins_MD( EXEC_ARG_ args );
+ break;
+
+ case 0x4B: /* MPPEM */
+ DO_MPPEM
+ break;
+
+ case 0x4C: /* MPS */
+ DO_MPS
+ break;
+
+ case 0x4D: /* FLIPON */
+ DO_FLIPON
+ break;
+
+ case 0x4E: /* FLIPOFF */
+ DO_FLIPOFF
+ break;
+
+ case 0x4F: /* DEBUG */
+ DO_DEBUG
+ break;
+
+ case 0x50: /* LT */
+ DO_LT
+ break;
+
+ case 0x51: /* LTEQ */
+ DO_LTEQ
+ break;
+
+ case 0x52: /* GT */
+ DO_GT
+ break;
+
+ case 0x53: /* GTEQ */
+ DO_GTEQ
+ break;
+
+ case 0x54: /* EQ */
+ DO_EQ
+ break;
+
+ case 0x55: /* NEQ */
+ DO_NEQ
+ break;
+
+ case 0x56: /* ODD */
+ DO_ODD
+ break;
+
+ case 0x57: /* EVEN */
+ DO_EVEN
+ break;
+
+ case 0x58: /* IF */
+ Ins_IF( EXEC_ARG_ args );
+ break;
+
+ case 0x59: /* EIF */
+ /* do nothing */
+ break;
+
+ case 0x5A: /* AND */
+ DO_AND
+ break;
+
+ case 0x5B: /* OR */
+ DO_OR
+ break;
+
+ case 0x5C: /* NOT */
+ DO_NOT
+ break;
+
+ case 0x5D: /* DELTAP1 */
+ Ins_DELTAP( EXEC_ARG_ args );
+ break;
+
+ case 0x5E: /* SDB */
+ DO_SDB
+ break;
+
+ case 0x5F: /* SDS */
+ DO_SDS
+ break;
+
+ case 0x60: /* ADD */
+ DO_ADD
+ break;
+
+ case 0x61: /* SUB */
+ DO_SUB
+ break;
+
+ case 0x62: /* DIV */
+ DO_DIV
+ break;
+
+ case 0x63: /* MUL */
+ DO_MUL
+ break;
+
+ case 0x64: /* ABS */
+ DO_ABS
+ break;
+
+ case 0x65: /* NEG */
+ DO_NEG
+ break;
+
+ case 0x66: /* FLOOR */
+ DO_FLOOR
+ break;
+
+ case 0x67: /* CEILING */
+ DO_CEILING
+ break;
+
+ case 0x68: /* ROUND */
+ case 0x69: /* ROUND */
+ case 0x6A: /* ROUND */
+ case 0x6B: /* ROUND */
+ DO_ROUND
+ break;
+
+ case 0x6C: /* NROUND */
+ case 0x6D: /* NROUND */
+ case 0x6E: /* NRRUND */
+ case 0x6F: /* NROUND */
+ DO_NROUND
+ break;
+
+ case 0x70: /* WCVTF */
+ DO_WCVTF
+ break;
+
+ case 0x71: /* DELTAP2 */
+ case 0x72: /* DELTAP3 */
+ Ins_DELTAP( EXEC_ARG_ args );
+ break;
+
+ case 0x73: /* DELTAC0 */
+ case 0x74: /* DELTAC1 */
+ case 0x75: /* DELTAC2 */
+ Ins_DELTAC( EXEC_ARG_ args );
+ break;
+
+ case 0x76: /* SROUND */
+ DO_SROUND
+ break;
+
+ case 0x77: /* S45Round */
+ DO_S45ROUND
+ break;
+
+ case 0x78: /* JROT */
+ DO_JROT
+ break;
+
+ case 0x79: /* JROF */
+ DO_JROF
+ break;
+
+ case 0x7A: /* ROFF */
+ DO_ROFF
+ break;
+
+ case 0x7B: /* ???? */
+ Ins_UNKNOWN( EXEC_ARG_ args );
+ break;
+
+ case 0x7C: /* RUTG */
+ DO_RUTG
+ break;
+
+ case 0x7D: /* RDTG */
+ DO_RDTG
+ break;
+
+ case 0x7E: /* SANGW */
+ case 0x7F: /* AA */
+ /* nothing - obsolete */
+ break;
+
+ case 0x80: /* FLIPPT */
+ Ins_FLIPPT( EXEC_ARG_ args );
+ break;
+
+ case 0x81: /* FLIPRGON */
+ Ins_FLIPRGON( EXEC_ARG_ args );
+ break;
+
+ case 0x82: /* FLIPRGOFF */
+ Ins_FLIPRGOFF( EXEC_ARG_ args );
+ break;
+
+ case 0x83: /* UNKNOWN */
+ case 0x84: /* UNKNOWN */
+ Ins_UNKNOWN( EXEC_ARG_ args );
+ break;
+
+ case 0x85: /* SCANCTRL */
+ Ins_SCANCTRL( EXEC_ARG_ args );
+ break;
+
+ case 0x86: /* SDPVTL */
+ case 0x87: /* SDPVTL */
+ Ins_SDPVTL( EXEC_ARG_ args );
+ break;
+
+ case 0x88: /* GETINFO */
+ Ins_GETINFO( EXEC_ARG_ args );
+ break;
+
+ case 0x89: /* IDEF */
+ Ins_IDEF( EXEC_ARG_ args );
+ break;
+
+ case 0x8A: /* ROLL */
+ Ins_ROLL( EXEC_ARG_ args );
+ break;
+
+ case 0x8B: /* MAX */
+ DO_MAX
+ break;
+
+ case 0x8C: /* MIN */
+ DO_MIN
+ break;
+
+ case 0x8D: /* SCANTYPE */
+ Ins_SCANTYPE( EXEC_ARG_ args );
+ break;
+
+ case 0x8E: /* INSTCTRL */
+ Ins_INSTCTRL( EXEC_ARG_ args );
+ break;
+
+ case 0x8F:
+ Ins_UNKNOWN( EXEC_ARG_ args );
+ break;
+
+ default:
+ if ( opcode >= 0xE0 )
+ Ins_MIRP( EXEC_ARG_ args );
+ else if ( opcode >= 0xC0 )
+ Ins_MDRP( EXEC_ARG_ args );
+ else if ( opcode >= 0xB8 )
+ Ins_PUSHW( EXEC_ARG_ args );
+ else if ( opcode >= 0xB0 )
+ Ins_PUSHB( EXEC_ARG_ args );
+ else
+ Ins_UNKNOWN( EXEC_ARG_ args );
+ }
+
+ }
+
+#else
+
+ Instruct_Dispatch[CUR.opcode]( EXEC_ARG_ &CUR.stack[CUR.args] );
+
+#endif /* TT_CONFIG_OPTION_INTERPRETER_SWITCH */
+
+ if ( CUR.error )
+ {
+ switch ( CUR.error )
+ {
+ /* looking for redefined instructions */
+ case FT_ERR( Invalid_Opcode ):
+ {
+ TT_DefRecord* def = CUR.IDefs;
+ TT_DefRecord* limit = def + CUR.numIDefs;
+
+
+ for ( ; def < limit; def++ )
+ {
+ if ( def->active && CUR.opcode == (FT_Byte)def->opc )
+ {
+ TT_CallRec* callrec;
+
+
+ if ( CUR.callTop >= CUR.callSize )
+ {
+ CUR.error = FT_THROW( Invalid_Reference );
+ goto LErrorLabel_;
+ }
+
+ callrec = &CUR.callStack[CUR.callTop];
+
+ callrec->Caller_Range = CUR.curRange;
+ callrec->Caller_IP = CUR.IP + 1;
+ callrec->Cur_Count = 1;
+ callrec->Cur_Restart = def->start;
+ callrec->Cur_End = def->end;
+
+ if ( INS_Goto_CodeRange( def->range, def->start ) == FAILURE )
+ goto LErrorLabel_;
+
+ goto LSuiteLabel_;
+ }
+ }
+ }
+
+ CUR.error = FT_THROW( Invalid_Opcode );
+ goto LErrorLabel_;
+
+#if 0
+ break; /* Unreachable code warning suppression. */
+ /* Leave to remind in case a later change the editor */
+ /* to consider break; */
+#endif
+
+ default:
+ goto LErrorLabel_;
+
+#if 0
+ break;
+#endif
+ }
+ }
+
+ CUR.top = CUR.new_top;
+
+ if ( CUR.step_ins )
+ CUR.IP += CUR.length;
+
+ /* increment instruction counter and check if we didn't */
+ /* run this program for too long (e.g. infinite loops). */
+ if ( ++ins_counter > MAX_RUNNABLE_OPCODES )
+ return FT_THROW( Execution_Too_Long );
+
+ LSuiteLabel_:
+ if ( CUR.IP >= CUR.codeSize )
+ {
+ if ( CUR.callTop > 0 )
+ {
+ CUR.error = FT_THROW( Code_Overflow );
+ goto LErrorLabel_;
+ }
+ else
+ goto LNo_Error_;
+ }
+ } while ( !CUR.instruction_trap );
+
+ LNo_Error_:
+
+#ifdef TT_CONFIG_OPTION_STATIC_RASTER
+ *exc = cur;
+#endif
+
+ return FT_Err_Ok;
+
+ LErrorCodeOverflow_:
+ CUR.error = FT_THROW( Code_Overflow );
+
+ LErrorLabel_:
+
+#ifdef TT_CONFIG_OPTION_STATIC_RASTER
+ *exc = cur;
+#endif
+
+ /* If any errors have occurred, function tables may be broken. */
+ /* Force a re-execution of `prep' and `fpgm' tables if no */
+ /* bytecode debugger is run. */
+ if ( CUR.error && !CUR.instruction_trap )
+ {
+ FT_TRACE1(( " The interpreter returned error 0x%x\n", CUR.error ));
+ exc->size->cvt_ready = FALSE;
+ }
+
+ return CUR.error;
+ }
+
+
+#endif /* TT_USE_BYTECODE_INTERPRETER */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttinterp.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttinterp.h
new file mode 100644
index 0000000000..3acfade64a
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttinterp.h
@@ -0,0 +1,397 @@
+/***************************************************************************/
+/* */
+/* ttinterp.h */
+/* */
+/* TrueType bytecode interpreter (specification). */
+/* */
+/* Copyright 1996-2007, 2010, 2012-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __TTINTERP_H__
+#define __TTINTERP_H__
+
+#include "../../include/ft2build.h"
+#include "ttobjs.h"
+
+
+FT_BEGIN_HEADER
+
+
+#ifndef TT_CONFIG_OPTION_STATIC_INTERPRETER /* indirect implementation */
+
+#define EXEC_OP_ TT_ExecContext exc,
+#define EXEC_OP TT_ExecContext exc
+#define EXEC_ARG_ exc,
+#define EXEC_ARG exc
+
+#else /* static implementation */
+
+#define EXEC_OP_ /* void */
+#define EXEC_OP /* void */
+#define EXEC_ARG_ /* void */
+#define EXEC_ARG /* void */
+
+#endif /* TT_CONFIG_OPTION_STATIC_INTERPRETER */
+
+
+ /*************************************************************************/
+ /* */
+ /* Rounding mode constants. */
+ /* */
+#define TT_Round_Off 5
+#define TT_Round_To_Half_Grid 0
+#define TT_Round_To_Grid 1
+#define TT_Round_To_Double_Grid 2
+#define TT_Round_Up_To_Grid 4
+#define TT_Round_Down_To_Grid 3
+#define TT_Round_Super 6
+#define TT_Round_Super_45 7
+
+
+ /*************************************************************************/
+ /* */
+ /* Function types used by the interpreter, depending on various modes */
+ /* (e.g. the rounding mode, whether to render a vertical or horizontal */
+ /* line etc). */
+ /* */
+ /*************************************************************************/
+
+ /* Rounding function */
+ typedef FT_F26Dot6
+ (*TT_Round_Func)( EXEC_OP_ FT_F26Dot6 distance,
+ FT_F26Dot6 compensation );
+
+ /* Point displacement along the freedom vector routine */
+ typedef void
+ (*TT_Move_Func)( EXEC_OP_ TT_GlyphZone zone,
+ FT_UShort point,
+ FT_F26Dot6 distance );
+
+ /* Distance projection along one of the projection vectors */
+ typedef FT_F26Dot6
+ (*TT_Project_Func)( EXEC_OP_ FT_Pos dx,
+ FT_Pos dy );
+
+ /* reading a cvt value. Take care of non-square pixels if necessary */
+ typedef FT_F26Dot6
+ (*TT_Get_CVT_Func)( EXEC_OP_ FT_ULong idx );
+
+ /* setting or moving a cvt value. Take care of non-square pixels */
+ /* if necessary */
+ typedef void
+ (*TT_Set_CVT_Func)( EXEC_OP_ FT_ULong idx,
+ FT_F26Dot6 value );
+
+
+ /*************************************************************************/
+ /* */
+ /* This structure defines a call record, used to manage function calls. */
+ /* */
+ typedef struct TT_CallRec_
+ {
+ FT_Int Caller_Range;
+ FT_Long Caller_IP;
+ FT_Long Cur_Count;
+ FT_Long Cur_Restart;
+ FT_Long Cur_End;
+
+ } TT_CallRec, *TT_CallStack;
+
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+
+ /*************************************************************************/
+ /* */
+ /* These structures define rules used to tweak subpixel hinting for */
+ /* various fonts. "", 0, "", NULL value indicates to match any value. */
+ /* */
+
+#define SPH_MAX_NAME_SIZE 32
+#define SPH_MAX_CLASS_MEMBERS 100
+
+ typedef struct SPH_TweakRule_
+ {
+ const char family[SPH_MAX_NAME_SIZE];
+ const FT_UInt ppem;
+ const char style[SPH_MAX_NAME_SIZE];
+ const FT_ULong glyph;
+
+ } SPH_TweakRule;
+
+
+ typedef struct SPH_ScaleRule_
+ {
+ const char family[SPH_MAX_NAME_SIZE];
+ const FT_UInt ppem;
+ const char style[SPH_MAX_NAME_SIZE];
+ const FT_ULong glyph;
+ const FT_ULong scale;
+
+ } SPH_ScaleRule;
+
+
+ typedef struct SPH_Font_Class_
+ {
+ const char name[SPH_MAX_NAME_SIZE];
+ const char member[SPH_MAX_CLASS_MEMBERS][SPH_MAX_NAME_SIZE];
+
+ } SPH_Font_Class;
+
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+
+ /*************************************************************************/
+ /* */
+ /* The main structure for the interpreter which collects all necessary */
+ /* variables and states. */
+ /* */
+ typedef struct TT_ExecContextRec_
+ {
+ TT_Face face;
+ TT_Size size;
+ FT_Memory memory;
+
+ /* instructions state */
+
+ FT_Error error; /* last execution error */
+
+ FT_Long top; /* top of exec. stack */
+
+ FT_UInt stackSize; /* size of exec. stack */
+ FT_Long* stack; /* current exec. stack */
+
+ FT_Long args;
+ FT_UInt new_top; /* new top after exec. */
+
+ TT_GlyphZoneRec zp0, /* zone records */
+ zp1,
+ zp2,
+ pts,
+ twilight;
+
+ FT_Size_Metrics metrics;
+ TT_Size_Metrics tt_metrics; /* size metrics */
+
+ TT_GraphicsState GS; /* current graphics state */
+
+ FT_Int curRange; /* current code range number */
+ FT_Byte* code; /* current code range */
+ FT_Long IP; /* current instruction pointer */
+ FT_Long codeSize; /* size of current range */
+
+ FT_Byte opcode; /* current opcode */
+ FT_Int length; /* length of current opcode */
+
+ FT_Bool step_ins; /* true if the interpreter must */
+ /* increment IP after ins. exec */
+ FT_ULong cvtSize;
+ FT_Long* cvt;
+
+ FT_UInt glyphSize; /* glyph instructions buffer size */
+ FT_Byte* glyphIns; /* glyph instructions buffer */
+
+ FT_UInt numFDefs; /* number of function defs */
+ FT_UInt maxFDefs; /* maximum number of function defs */
+ TT_DefArray FDefs; /* table of FDefs entries */
+
+ FT_UInt numIDefs; /* number of instruction defs */
+ FT_UInt maxIDefs; /* maximum number of ins defs */
+ TT_DefArray IDefs; /* table of IDefs entries */
+
+ FT_UInt maxFunc; /* maximum function index */
+ FT_UInt maxIns; /* maximum instruction index */
+
+ FT_Int callTop, /* top of call stack during execution */
+ callSize; /* size of call stack */
+ TT_CallStack callStack; /* call stack */
+
+ FT_UShort maxPoints; /* capacity of this context's `pts' */
+ FT_Short maxContours; /* record, expressed in points and */
+ /* contours. */
+
+ TT_CodeRangeTable codeRangeTable; /* table of valid code ranges */
+ /* useful for the debugger */
+
+ FT_UShort storeSize; /* size of current storage */
+ FT_Long* storage; /* storage area */
+
+ FT_F26Dot6 period; /* values used for the */
+ FT_F26Dot6 phase; /* `SuperRounding' */
+ FT_F26Dot6 threshold;
+
+#if 0
+ /* this seems to be unused */
+ FT_Int cur_ppem; /* ppem along the current proj vector */
+#endif
+
+ FT_Bool instruction_trap; /* If `True', the interpreter will */
+ /* exit after each instruction */
+
+ TT_GraphicsState default_GS; /* graphics state resulting from */
+ /* the prep program */
+ FT_Bool is_composite; /* true if the glyph is composite */
+ FT_Bool pedantic_hinting; /* true if pedantic interpretation */
+
+ /* latest interpreter additions */
+
+ FT_Long F_dot_P; /* dot product of freedom and projection */
+ /* vectors */
+ TT_Round_Func func_round; /* current rounding function */
+
+ TT_Project_Func func_project, /* current projection function */
+ func_dualproj, /* current dual proj. function */
+ func_freeProj; /* current freedom proj. func */
+
+ TT_Move_Func func_move; /* current point move function */
+ TT_Move_Func func_move_orig; /* move original position function */
+
+ TT_Get_CVT_Func func_read_cvt; /* read a cvt entry */
+ TT_Set_CVT_Func func_write_cvt; /* write a cvt entry (in pixels) */
+ TT_Set_CVT_Func func_move_cvt; /* incr a cvt entry (in pixels) */
+
+ FT_Bool grayscale; /* are we hinting for grayscale? */
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ TT_Round_Func func_round_sphn; /* subpixel rounding function */
+
+ FT_Bool grayscale_hinting; /* Using grayscale hinting? */
+ FT_Bool subpixel_hinting; /* Using subpixel hinting? */
+ FT_Bool native_hinting; /* Using native hinting? */
+ FT_Bool ignore_x_mode; /* Standard rendering mode for */
+ /* subpixel hinting. On if gray */
+ /* or subpixel hinting is on ) */
+
+ /* The following 4 aren't fully implemented but here for MS rasterizer */
+ /* compatibility. */
+ FT_Bool compatible_widths; /* compatible widths? */
+ FT_Bool symmetrical_smoothing; /* symmetrical_smoothing? */
+ FT_Bool bgr; /* bgr instead of rgb? */
+ FT_Bool subpixel_positioned; /* subpixel positioned */
+ /* (DirectWrite ClearType)? */
+
+ FT_Int rasterizer_version; /* MS rasterizer version */
+
+ FT_Bool iup_called; /* IUP called for glyph? */
+
+ FT_ULong sph_tweak_flags; /* flags to control */
+ /* hint tweaks */
+
+ FT_ULong sph_in_func_flags; /* flags to indicate if in */
+ /* special functions */
+
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+ } TT_ExecContextRec;
+
+
+ extern const TT_GraphicsState tt_default_graphics_state;
+
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+ FT_LOCAL( FT_Error )
+ TT_Goto_CodeRange( TT_ExecContext exec,
+ FT_Int range,
+ FT_Long IP );
+
+ FT_LOCAL( FT_Error )
+ TT_Set_CodeRange( TT_ExecContext exec,
+ FT_Int range,
+ void* base,
+ FT_Long length );
+
+ FT_LOCAL( FT_Error )
+ TT_Clear_CodeRange( TT_ExecContext exec,
+ FT_Int range );
+
+
+ FT_LOCAL( FT_Error )
+ Update_Max( FT_Memory memory,
+ FT_ULong* size,
+ FT_Long multiplier,
+ void* _pbuff,
+ FT_ULong new_max );
+#endif /* TT_USE_BYTECODE_INTERPRETER */
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* TT_New_Context */
+ /* */
+ /* <Description> */
+ /* Queries the face context for a given font. Note that there is */
+ /* now a _single_ execution context in the TrueType driver which is */
+ /* shared among faces. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the source face object. */
+ /* */
+ /* <Return> */
+ /* A handle to the execution context. Initialized for `face'. */
+ /* */
+ /* <Note> */
+ /* Only the glyph loader and debugger should call this function. */
+ /* */
+ FT_EXPORT( TT_ExecContext )
+ TT_New_Context( TT_Driver driver );
+
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+ FT_LOCAL( FT_Error )
+ TT_Done_Context( TT_ExecContext exec );
+
+ FT_LOCAL( FT_Error )
+ TT_Load_Context( TT_ExecContext exec,
+ TT_Face face,
+ TT_Size size );
+
+ FT_LOCAL( FT_Error )
+ TT_Save_Context( TT_ExecContext exec,
+ TT_Size ins );
+
+ FT_LOCAL( FT_Error )
+ TT_Run_Context( TT_ExecContext exec,
+ FT_Bool debug );
+#endif /* TT_USE_BYTECODE_INTERPRETER */
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* TT_RunIns */
+ /* */
+ /* <Description> */
+ /* Executes one or more instruction in the execution context. This */
+ /* is the main function of the TrueType opcode interpreter. */
+ /* */
+ /* <Input> */
+ /* exec :: A handle to the target execution context. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ /* <Note> */
+ /* Only the object manager and debugger should call this function. */
+ /* */
+ /* This function is publicly exported because it is directly */
+ /* invoked by the TrueType debugger. */
+ /* */
+ FT_EXPORT( FT_Error )
+ TT_RunIns( TT_ExecContext exec );
+
+
+FT_END_HEADER
+
+#endif /* __TTINTERP_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttobjs.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttobjs.c
new file mode 100644
index 0000000000..4a6a7c1eee
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttobjs.c
@@ -0,0 +1,1346 @@
+/***************************************************************************/
+/* */
+/* ttobjs.c */
+/* */
+/* Objects manager (body). */
+/* */
+/* Copyright 1996-2013 */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/tttags.h"
+#include "../../include/freetype/internal/sfnt.h"
+#include "../../include/freetype/ftttdrv.h"
+
+#include "ttgload.h"
+#include "ttpload.h"
+
+#include "tterrors.h"
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+#include "ttinterp.h"
+#endif
+
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+#include "../../include/freetype/ttunpat.h"
+#endif
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+#include "ttgxvar.h"
+#endif
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_ttobjs
+
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+ /*************************************************************************/
+ /* */
+ /* GLYPH ZONE FUNCTIONS */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_glyphzone_done */
+ /* */
+ /* <Description> */
+ /* Deallocate a glyph zone. */
+ /* */
+ /* <Input> */
+ /* zone :: A pointer to the target glyph zone. */
+ /* */
+ FT_LOCAL_DEF( void )
+ tt_glyphzone_done( TT_GlyphZone zone )
+ {
+ FT_Memory memory = zone->memory;
+
+
+ if ( memory )
+ {
+ FT_FREE( zone->contours );
+ FT_FREE( zone->tags );
+ FT_FREE( zone->cur );
+ FT_FREE( zone->org );
+ FT_FREE( zone->orus );
+
+ zone->max_points = zone->n_points = 0;
+ zone->max_contours = zone->n_contours = 0;
+ zone->memory = NULL;
+ }
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_glyphzone_new */
+ /* */
+ /* <Description> */
+ /* Allocate a new glyph zone. */
+ /* */
+ /* <Input> */
+ /* memory :: A handle to the current memory object. */
+ /* */
+ /* maxPoints :: The capacity of glyph zone in points. */
+ /* */
+ /* maxContours :: The capacity of glyph zone in contours. */
+ /* */
+ /* <Output> */
+ /* zone :: A pointer to the target glyph zone record. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ tt_glyphzone_new( FT_Memory memory,
+ FT_UShort maxPoints,
+ FT_Short maxContours,
+ TT_GlyphZone zone )
+ {
+ FT_Error error;
+
+
+ FT_MEM_ZERO( zone, sizeof ( *zone ) );
+ zone->memory = memory;
+
+ if ( FT_NEW_ARRAY( zone->org, maxPoints ) ||
+ FT_NEW_ARRAY( zone->cur, maxPoints ) ||
+ FT_NEW_ARRAY( zone->orus, maxPoints ) ||
+ FT_NEW_ARRAY( zone->tags, maxPoints ) ||
+ FT_NEW_ARRAY( zone->contours, maxContours ) )
+ {
+ tt_glyphzone_done( zone );
+ }
+ else
+ {
+ zone->max_points = maxPoints;
+ zone->max_contours = maxContours;
+ }
+
+ return error;
+ }
+#endif /* TT_USE_BYTECODE_INTERPRETER */
+
+
+ /* Compare the face with a list of well-known `tricky' fonts. */
+ /* This list shall be expanded as we find more of them. */
+
+ static FT_Bool
+ tt_check_trickyness_family( FT_String* name )
+ {
+
+#define TRICK_NAMES_MAX_CHARACTERS 16
+#define TRICK_NAMES_COUNT 8
+
+ static const char trick_names[TRICK_NAMES_COUNT]
+ [TRICK_NAMES_MAX_CHARACTERS + 1] =
+ {
+ "DFKaiSho-SB", /* dfkaisb.ttf */
+ "DFKaiShu",
+ "DFKai-SB", /* kaiu.ttf */
+ "HuaTianKaiTi?", /* htkt2.ttf */
+ "HuaTianSongTi?", /* htst3.ttf */
+ "MingLiU", /* mingliu.ttf & mingliu.ttc */
+ "PMingLiU", /* mingliu.ttc */
+ "MingLi43", /* mingli.ttf */
+ };
+
+ int nn;
+
+
+ for ( nn = 0; nn < TRICK_NAMES_COUNT; nn++ )
+ if ( ft_strstr( name, trick_names[nn] ) )
+ return TRUE;
+
+ return FALSE;
+ }
+
+
+ /* XXX: This function should be in the `sfnt' module. */
+
+ /* Some PDF generators clear the checksums in the TrueType header table. */
+ /* For example, Quartz ContextPDF clears all entries, or Bullzip PDF */
+ /* Printer clears the entries for subsetted subtables. We thus have to */
+ /* recalculate the checksums where necessary. */
+
+ static FT_UInt32
+ tt_synth_sfnt_checksum( FT_Stream stream,
+ FT_ULong length )
+ {
+ FT_Error error;
+ FT_UInt32 checksum = 0;
+ int i;
+
+
+ if ( FT_FRAME_ENTER( length ) )
+ return 0;
+
+ for ( ; length > 3; length -= 4 )
+ checksum += (FT_UInt32)FT_GET_ULONG();
+
+ for ( i = 3; length > 0; length --, i-- )
+ checksum += (FT_UInt32)( FT_GET_BYTE() << ( i * 8 ) );
+
+ FT_FRAME_EXIT();
+
+ return checksum;
+ }
+
+
+ /* XXX: This function should be in the `sfnt' module. */
+
+ static FT_ULong
+ tt_get_sfnt_checksum( TT_Face face,
+ FT_UShort i )
+ {
+#if 0 /* if we believe the written value, use following part. */
+ if ( face->dir_tables[i].CheckSum )
+ return face->dir_tables[i].CheckSum;
+#endif
+
+ if ( !face->goto_table )
+ return 0;
+
+ if ( face->goto_table( face,
+ face->dir_tables[i].Tag,
+ face->root.stream,
+ NULL ) )
+ return 0;
+
+ return (FT_ULong)tt_synth_sfnt_checksum( face->root.stream,
+ face->dir_tables[i].Length );
+ }
+
+
+ typedef struct tt_sfnt_id_rec_
+ {
+ FT_ULong CheckSum;
+ FT_ULong Length;
+
+ } tt_sfnt_id_rec;
+
+
+ static FT_Bool
+ tt_check_trickyness_sfnt_ids( TT_Face face )
+ {
+#define TRICK_SFNT_IDS_PER_FACE 3
+#define TRICK_SFNT_IDS_NUM_FACES 17
+
+ static const tt_sfnt_id_rec sfnt_id[TRICK_SFNT_IDS_NUM_FACES]
+ [TRICK_SFNT_IDS_PER_FACE] = {
+
+#define TRICK_SFNT_ID_cvt 0
+#define TRICK_SFNT_ID_fpgm 1
+#define TRICK_SFNT_ID_prep 2
+
+ { /* MingLiU 1995 */
+ { 0x05bcf058, 0x000002e4 }, /* cvt */
+ { 0x28233bf1, 0x000087c4 }, /* fpgm */
+ { 0xa344a1ea, 0x000001e1 } /* prep */
+ },
+ { /* MingLiU 1996- */
+ { 0x05bcf058, 0x000002e4 }, /* cvt */
+ { 0x28233bf1, 0x000087c4 }, /* fpgm */
+ { 0xa344a1eb, 0x000001e1 } /* prep */
+ },
+ { /* DFKaiShu */
+ { 0x11e5ead4, 0x00000350 }, /* cvt */
+ { 0x5a30ca3b, 0x00009063 }, /* fpgm */
+ { 0x13a42602, 0x0000007e } /* prep */
+ },
+ { /* HuaTianKaiTi */
+ { 0xfffbfffc, 0x00000008 }, /* cvt */
+ { 0x9c9e48b8, 0x0000bea2 }, /* fpgm */
+ { 0x70020112, 0x00000008 } /* prep */
+ },
+ { /* HuaTianSongTi */
+ { 0xfffbfffc, 0x00000008 }, /* cvt */
+ { 0x0a5a0483, 0x00017c39 }, /* fpgm */
+ { 0x70020112, 0x00000008 } /* prep */
+ },
+ { /* NEC fadpop7.ttf */
+ { 0x00000000, 0x00000000 }, /* cvt */
+ { 0x40c92555, 0x000000e5 }, /* fpgm */
+ { 0xa39b58e3, 0x0000117c } /* prep */
+ },
+ { /* NEC fadrei5.ttf */
+ { 0x00000000, 0x00000000 }, /* cvt */
+ { 0x33c41652, 0x000000e5 }, /* fpgm */
+ { 0x26d6c52a, 0x00000f6a } /* prep */
+ },
+ { /* NEC fangot7.ttf */
+ { 0x00000000, 0x00000000 }, /* cvt */
+ { 0x6db1651d, 0x0000019d }, /* fpgm */
+ { 0x6c6e4b03, 0x00002492 } /* prep */
+ },
+ { /* NEC fangyo5.ttf */
+ { 0x00000000, 0x00000000 }, /* cvt */
+ { 0x40c92555, 0x000000e5 }, /* fpgm */
+ { 0xde51fad0, 0x0000117c } /* prep */
+ },
+ { /* NEC fankyo5.ttf */
+ { 0x00000000, 0x00000000 }, /* cvt */
+ { 0x85e47664, 0x000000e5 }, /* fpgm */
+ { 0xa6c62831, 0x00001caa } /* prep */
+ },
+ { /* NEC fanrgo5.ttf */
+ { 0x00000000, 0x00000000 }, /* cvt */
+ { 0x2d891cfd, 0x0000019d }, /* fpgm */
+ { 0xa0604633, 0x00001de8 } /* prep */
+ },
+ { /* NEC fangot5.ttc */
+ { 0x00000000, 0x00000000 }, /* cvt */
+ { 0x40aa774c, 0x000001cb }, /* fpgm */
+ { 0x9b5caa96, 0x00001f9a } /* prep */
+ },
+ { /* NEC fanmin3.ttc */
+ { 0x00000000, 0x00000000 }, /* cvt */
+ { 0x0d3de9cb, 0x00000141 }, /* fpgm */
+ { 0xd4127766, 0x00002280 } /* prep */
+ },
+ { /* NEC FA-Gothic, 1996 */
+ { 0x00000000, 0x00000000 }, /* cvt */
+ { 0x4a692698, 0x000001f0 }, /* fpgm */
+ { 0x340d4346, 0x00001fca } /* prep */
+ },
+ { /* NEC FA-Minchou, 1996 */
+ { 0x00000000, 0x00000000 }, /* cvt */
+ { 0xcd34c604, 0x00000166 }, /* fpgm */
+ { 0x6cf31046, 0x000022b0 } /* prep */
+ },
+ { /* NEC FA-RoundGothicB, 1996 */
+ { 0x00000000, 0x00000000 }, /* cvt */
+ { 0x5da75315, 0x0000019d }, /* fpgm */
+ { 0x40745a5f, 0x000022e0 } /* prep */
+ },
+ { /* NEC FA-RoundGothicM, 1996 */
+ { 0x00000000, 0x00000000 }, /* cvt */
+ { 0xf055fc48, 0x000001c2 }, /* fpgm */
+ { 0x3900ded3, 0x00001e18 } /* prep */
+ }
+ };
+
+ FT_ULong checksum;
+ int num_matched_ids[TRICK_SFNT_IDS_NUM_FACES];
+ FT_Bool has_cvt, has_fpgm, has_prep;
+ FT_UShort i;
+ int j, k;
+
+
+ FT_MEM_SET( num_matched_ids, 0,
+ sizeof ( int ) * TRICK_SFNT_IDS_NUM_FACES );
+ has_cvt = FALSE;
+ has_fpgm = FALSE;
+ has_prep = FALSE;
+
+ for ( i = 0; i < face->num_tables; i++ )
+ {
+ checksum = 0;
+
+ switch( face->dir_tables[i].Tag )
+ {
+ case TTAG_cvt:
+ k = TRICK_SFNT_ID_cvt;
+ has_cvt = TRUE;
+ break;
+
+ case TTAG_fpgm:
+ k = TRICK_SFNT_ID_fpgm;
+ has_fpgm = TRUE;
+ break;
+
+ case TTAG_prep:
+ k = TRICK_SFNT_ID_prep;
+ has_prep = TRUE;
+ break;
+
+ default:
+ continue;
+ }
+
+ for ( j = 0; j < TRICK_SFNT_IDS_NUM_FACES; j++ )
+ if ( face->dir_tables[i].Length == sfnt_id[j][k].Length )
+ {
+ if ( !checksum )
+ checksum = tt_get_sfnt_checksum( face, i );
+
+ if ( sfnt_id[j][k].CheckSum == checksum )
+ num_matched_ids[j]++;
+
+ if ( num_matched_ids[j] == TRICK_SFNT_IDS_PER_FACE )
+ return TRUE;
+ }
+ }
+
+ for ( j = 0; j < TRICK_SFNT_IDS_NUM_FACES; j++ )
+ {
+ if ( !has_cvt && !sfnt_id[j][TRICK_SFNT_ID_cvt].Length )
+ num_matched_ids[j] ++;
+ if ( !has_fpgm && !sfnt_id[j][TRICK_SFNT_ID_fpgm].Length )
+ num_matched_ids[j] ++;
+ if ( !has_prep && !sfnt_id[j][TRICK_SFNT_ID_prep].Length )
+ num_matched_ids[j] ++;
+ if ( num_matched_ids[j] == TRICK_SFNT_IDS_PER_FACE )
+ return TRUE;
+ }
+
+ return FALSE;
+ }
+
+
+ static FT_Bool
+ tt_check_trickyness( FT_Face face )
+ {
+ if ( !face )
+ return FALSE;
+
+ /* For first, check the face name for quick check. */
+ if ( face->family_name &&
+ tt_check_trickyness_family( face->family_name ) )
+ return TRUE;
+
+ /* Type42 fonts may lack `name' tables, we thus try to identify */
+ /* tricky fonts by checking the checksums of Type42-persistent */
+ /* sfnt tables (`cvt', `fpgm', and `prep'). */
+ if ( tt_check_trickyness_sfnt_ids( (TT_Face)face ) )
+ return TRUE;
+
+ return FALSE;
+ }
+
+
+ /* Check whether `.notdef' is the only glyph in the `loca' table. */
+ static FT_Bool
+ tt_check_single_notdef( FT_Face ttface )
+ {
+ FT_Bool result = FALSE;
+
+ TT_Face face = (TT_Face)ttface;
+ FT_UInt asize;
+ FT_ULong i;
+ FT_ULong glyph_index = 0;
+ FT_UInt count = 0;
+
+
+ for( i = 0; i < face->num_locations; i++ )
+ {
+ tt_face_get_location( face, i, &asize );
+ if ( asize > 0 )
+ {
+ count += 1;
+ if ( count > 1 )
+ break;
+ glyph_index = i;
+ }
+ }
+
+ /* Only have a single outline. */
+ if ( count == 1 )
+ {
+ if ( glyph_index == 0 )
+ result = TRUE;
+ else
+ {
+ /* FIXME: Need to test glyphname == .notdef ? */
+ FT_Error error;
+ char buf[8];
+
+
+ error = FT_Get_Glyph_Name( ttface, glyph_index, buf, 8 );
+ if ( !error &&
+ buf[0] == '.' && !ft_strncmp( buf, ".notdef", 8 ) )
+ result = TRUE;
+ }
+ }
+
+ return result;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_face_init */
+ /* */
+ /* <Description> */
+ /* Initialize a given TrueType face object. */
+ /* */
+ /* <Input> */
+ /* stream :: The source font stream. */
+ /* */
+ /* face_index :: The index of the font face in the resource. */
+ /* */
+ /* num_params :: Number of additional generic parameters. Ignored. */
+ /* */
+ /* params :: Additional generic parameters. Ignored. */
+ /* */
+ /* <InOut> */
+ /* face :: The newly built face object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ tt_face_init( FT_Stream stream,
+ FT_Face ttface, /* TT_Face */
+ FT_Int face_index,
+ FT_Int num_params,
+ FT_Parameter* params )
+ {
+ FT_Error error;
+ FT_Library library;
+ SFNT_Service sfnt;
+ TT_Face face = (TT_Face)ttface;
+
+
+ FT_TRACE2(( "TTF driver\n" ));
+
+ library = ttface->driver->root.library;
+
+ sfnt = (SFNT_Service)FT_Get_Module_Interface( library, "sfnt" );
+ if ( !sfnt )
+ {
+ FT_ERROR(( "tt_face_init: cannot access `sfnt' module\n" ));
+ error = FT_THROW( Missing_Module );
+ goto Exit;
+ }
+
+ /* create input stream from resource */
+ if ( FT_STREAM_SEEK( 0 ) )
+ goto Exit;
+
+ /* check that we have a valid TrueType file */
+ error = sfnt->init_face( stream, face, face_index, num_params, params );
+ if ( error )
+ goto Exit;
+
+ /* We must also be able to accept Mac/GX fonts, as well as OT ones. */
+ /* The 0x00020000 tag is completely undocumented; some fonts from */
+ /* Arphic made for Chinese Windows 3.1 have this. */
+ if ( face->format_tag != 0x00010000L && /* MS fonts */
+ face->format_tag != 0x00020000L && /* CJK fonts for Win 3.1 */
+ face->format_tag != TTAG_true ) /* Mac fonts */
+ {
+ FT_TRACE2(( " not a TTF font\n" ));
+ goto Bad_Format;
+ }
+ else
+ {
+ FT_ULong table_len;
+ if (face->goto_table( face, TTAG_CFF, stream, &table_len) != TT_Err_Table_Missing &&
+ face->goto_table( face, TTAG_loca, stream, &table_len) == TT_Err_Table_Missing)
+ {
+ FT_TRACE2(( "[not a valid TTF font]\n" ));
+ goto Bad_Format;
+ }
+ }
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+ ttface->face_flags |= FT_FACE_FLAG_HINTER;
+#endif
+
+ /* If we are performing a simple font format check, exit immediately. */
+ if ( face_index < 0 )
+ return FT_Err_Ok;
+
+ /* Load font directory */
+ error = sfnt->load_face( stream, face, face_index, num_params, params );
+ if ( error )
+ goto Exit;
+
+ if ( tt_check_trickyness( ttface ) )
+ ttface->face_flags |= FT_FACE_FLAG_TRICKY;
+
+ error = tt_face_load_hdmx( face, stream );
+ if ( error )
+ goto Exit;
+
+ if ( FT_IS_SCALABLE( ttface ) )
+ {
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+
+ if ( !ttface->internal->incremental_interface )
+ error = tt_face_load_loca( face, stream );
+ if ( !error )
+ error = tt_face_load_cvt( face, stream );
+ if ( !error )
+ error = tt_face_load_fpgm( face, stream );
+ if ( !error )
+ error = tt_face_load_prep( face, stream );
+
+ /* Check the scalable flag based on `loca'. */
+ if ( !ttface->internal->incremental_interface &&
+ ttface->num_fixed_sizes &&
+ face->glyph_locations &&
+ tt_check_single_notdef( ttface ) )
+ {
+ FT_TRACE5(( "tt_face_init:"
+ " Only the `.notdef' glyph has an outline.\n"
+ " "
+ " Resetting scalable flag to FALSE.\n" ));
+
+ ttface->face_flags &= ~FT_FACE_FLAG_SCALABLE;
+ }
+
+#else
+
+ if ( !error )
+ error = tt_face_load_loca( face, stream );
+ if ( !error )
+ error = tt_face_load_cvt( face, stream );
+ if ( !error )
+ error = tt_face_load_fpgm( face, stream );
+ if ( !error )
+ error = tt_face_load_prep( face, stream );
+
+ /* Check the scalable flag based on `loca'. */
+ if ( ttface->num_fixed_sizes &&
+ face->glyph_locations &&
+ tt_check_single_notdef( ttface ) )
+ {
+ FT_TRACE5(( "tt_face_init:"
+ " Only the `.notdef' glyph has an outline.\n"
+ " "
+ " Resetting scalable flag to FALSE.\n" ));
+
+ ttface->face_flags &= ~FT_FACE_FLAG_SCALABLE;
+ }
+
+#endif
+
+ }
+
+#if defined( TT_CONFIG_OPTION_UNPATENTED_HINTING ) && \
+ !defined( TT_CONFIG_OPTION_BYTECODE_INTERPRETER )
+
+ {
+ FT_Bool unpatented_hinting;
+ int i;
+
+
+ /* Determine whether unpatented hinting is to be used for this face. */
+ unpatented_hinting = FT_BOOL
+ ( library->debug_hooks[FT_DEBUG_HOOK_UNPATENTED_HINTING] != NULL );
+
+ for ( i = 0; i < num_params && !face->unpatented_hinting; i++ )
+ if ( params[i].tag == FT_PARAM_TAG_UNPATENTED_HINTING )
+ unpatented_hinting = TRUE;
+
+ if ( !unpatented_hinting )
+ ttface->internal->ignore_unpatented_hinter = TRUE;
+ }
+
+#endif /* TT_CONFIG_OPTION_UNPATENTED_HINTING &&
+ !TT_CONFIG_OPTION_BYTECODE_INTERPRETER */
+
+ /* initialize standard glyph loading routines */
+ TT_Init_Glyph_Loading( face );
+
+ Exit:
+ return error;
+
+ Bad_Format:
+ error = FT_THROW( Unknown_File_Format );
+ goto Exit;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_face_done */
+ /* */
+ /* <Description> */
+ /* Finalize a given face object. */
+ /* */
+ /* <Input> */
+ /* face :: A pointer to the face object to destroy. */
+ /* */
+ FT_LOCAL_DEF( void )
+ tt_face_done( FT_Face ttface ) /* TT_Face */
+ {
+ TT_Face face = (TT_Face)ttface;
+ FT_Memory memory;
+ FT_Stream stream;
+ SFNT_Service sfnt;
+
+
+ if ( !face )
+ return;
+
+ memory = ttface->memory;
+ stream = ttface->stream;
+ sfnt = (SFNT_Service)face->sfnt;
+
+ /* for `extended TrueType formats' (i.e. compressed versions) */
+ if ( face->extra.finalizer )
+ face->extra.finalizer( face->extra.data );
+
+ if ( sfnt )
+ sfnt->done_face( face );
+
+ /* freeing the locations table */
+ tt_face_done_loca( face );
+
+ tt_face_free_hdmx( face );
+
+ /* freeing the CVT */
+ FT_FREE( face->cvt );
+ face->cvt_size = 0;
+
+ /* freeing the programs */
+ FT_FRAME_RELEASE( face->font_program );
+ FT_FRAME_RELEASE( face->cvt_program );
+ face->font_program_size = 0;
+ face->cvt_program_size = 0;
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+ tt_done_blend( memory, face->blend );
+ face->blend = NULL;
+#endif
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SIZE FUNCTIONS */
+ /* */
+ /*************************************************************************/
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_size_run_fpgm */
+ /* */
+ /* <Description> */
+ /* Run the font program. */
+ /* */
+ /* <Input> */
+ /* size :: A handle to the size object. */
+ /* */
+ /* pedantic :: Set if bytecode execution should be pedantic. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ tt_size_run_fpgm( TT_Size size,
+ FT_Bool pedantic )
+ {
+ TT_Face face = (TT_Face)size->root.face;
+ TT_ExecContext exec;
+ FT_Error error;
+
+
+ /* debugging instances have their own context */
+ if ( size->debug )
+ exec = size->context;
+ else
+ exec = ( (TT_Driver)FT_FACE_DRIVER( face ) )->context;
+
+ if ( !exec )
+ return FT_THROW( Could_Not_Find_Context );
+
+ TT_Load_Context( exec, face, size );
+
+ exec->callTop = 0;
+ exec->top = 0;
+
+ exec->period = 64;
+ exec->phase = 0;
+ exec->threshold = 0;
+
+ exec->instruction_trap = FALSE;
+ exec->F_dot_P = 0x4000L;
+
+ exec->pedantic_hinting = pedantic;
+
+ {
+ FT_Size_Metrics* metrics = &exec->metrics;
+ TT_Size_Metrics* tt_metrics = &exec->tt_metrics;
+
+
+ metrics->x_ppem = 0;
+ metrics->y_ppem = 0;
+ metrics->x_scale = 0;
+ metrics->y_scale = 0;
+
+ tt_metrics->ppem = 0;
+ tt_metrics->scale = 0;
+ tt_metrics->ratio = 0x10000L;
+ }
+
+ /* allow font program execution */
+ TT_Set_CodeRange( exec,
+ tt_coderange_font,
+ face->font_program,
+ face->font_program_size );
+
+ /* disable CVT and glyph programs coderange */
+ TT_Clear_CodeRange( exec, tt_coderange_cvt );
+ TT_Clear_CodeRange( exec, tt_coderange_glyph );
+
+ if ( face->font_program_size > 0 )
+ {
+ error = TT_Goto_CodeRange( exec, tt_coderange_font, 0 );
+
+ if ( !error )
+ {
+ FT_TRACE4(( "Executing `fpgm' table.\n" ));
+
+ error = face->interpreter( exec );
+ }
+ }
+ else
+ error = FT_Err_Ok;
+
+ if ( !error )
+ TT_Save_Context( exec, size );
+
+ return error;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_size_run_prep */
+ /* */
+ /* <Description> */
+ /* Run the control value program. */
+ /* */
+ /* <Input> */
+ /* size :: A handle to the size object. */
+ /* */
+ /* pedantic :: Set if bytecode execution should be pedantic. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ tt_size_run_prep( TT_Size size,
+ FT_Bool pedantic )
+ {
+ TT_Face face = (TT_Face)size->root.face;
+ TT_ExecContext exec;
+ FT_Error error;
+
+
+ /* debugging instances have their own context */
+ if ( size->debug )
+ exec = size->context;
+ else
+ exec = ( (TT_Driver)FT_FACE_DRIVER( face ) )->context;
+
+ if ( !exec )
+ return FT_THROW( Could_Not_Find_Context );
+
+ TT_Load_Context( exec, face, size );
+
+ exec->callTop = 0;
+ exec->top = 0;
+
+ exec->instruction_trap = FALSE;
+
+ exec->pedantic_hinting = pedantic;
+
+ TT_Set_CodeRange( exec,
+ tt_coderange_cvt,
+ face->cvt_program,
+ face->cvt_program_size );
+
+ TT_Clear_CodeRange( exec, tt_coderange_glyph );
+
+ if ( face->cvt_program_size > 0 )
+ {
+ error = TT_Goto_CodeRange( exec, tt_coderange_cvt, 0 );
+
+ if ( !error && !size->debug )
+ {
+ FT_TRACE4(( "Executing `prep' table.\n" ));
+
+ error = face->interpreter( exec );
+ }
+ }
+ else
+ error = FT_Err_Ok;
+
+ /* UNDOCUMENTED! The MS rasterizer doesn't allow the following */
+ /* graphics state variables to be modified by the CVT program. */
+
+ exec->GS.dualVector.x = 0x4000;
+ exec->GS.dualVector.y = 0;
+ exec->GS.projVector.x = 0x4000;
+ exec->GS.projVector.y = 0x0;
+ exec->GS.freeVector.x = 0x4000;
+ exec->GS.freeVector.y = 0x0;
+
+ exec->GS.rp0 = 0;
+ exec->GS.rp1 = 0;
+ exec->GS.rp2 = 0;
+
+ exec->GS.gep0 = 1;
+ exec->GS.gep1 = 1;
+ exec->GS.gep2 = 1;
+
+ exec->GS.loop = 1;
+
+ /* save as default graphics state */
+ size->GS = exec->GS;
+
+ TT_Save_Context( exec, size );
+
+ return error;
+ }
+
+#endif /* TT_USE_BYTECODE_INTERPRETER */
+
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+ static void
+ tt_size_done_bytecode( FT_Size ftsize )
+ {
+ TT_Size size = (TT_Size)ftsize;
+ TT_Face face = (TT_Face)ftsize->face;
+ FT_Memory memory = face->root.memory;
+
+
+ if ( size->debug )
+ {
+ /* the debug context must be deleted by the debugger itself */
+ size->context = NULL;
+ size->debug = FALSE;
+ }
+
+ FT_FREE( size->cvt );
+ size->cvt_size = 0;
+
+ /* free storage area */
+ FT_FREE( size->storage );
+ size->storage_size = 0;
+
+ /* twilight zone */
+ tt_glyphzone_done( &size->twilight );
+
+ FT_FREE( size->function_defs );
+ FT_FREE( size->instruction_defs );
+
+ size->num_function_defs = 0;
+ size->max_function_defs = 0;
+ size->num_instruction_defs = 0;
+ size->max_instruction_defs = 0;
+
+ size->max_func = 0;
+ size->max_ins = 0;
+
+ size->bytecode_ready = 0;
+ size->cvt_ready = 0;
+ }
+
+
+ /* Initialize bytecode-related fields in the size object. */
+ /* We do this only if bytecode interpretation is really needed. */
+ static FT_Error
+ tt_size_init_bytecode( FT_Size ftsize,
+ FT_Bool pedantic )
+ {
+ FT_Error error;
+ TT_Size size = (TT_Size)ftsize;
+ TT_Face face = (TT_Face)ftsize->face;
+ FT_Memory memory = face->root.memory;
+ FT_Int i;
+
+ FT_UShort n_twilight;
+ TT_MaxProfile* maxp = &face->max_profile;
+
+
+ size->bytecode_ready = 1;
+ size->cvt_ready = 0;
+
+ size->max_function_defs = maxp->maxFunctionDefs;
+ size->max_instruction_defs = maxp->maxInstructionDefs;
+
+ size->num_function_defs = 0;
+ size->num_instruction_defs = 0;
+
+ size->max_func = 0;
+ size->max_ins = 0;
+
+ size->cvt_size = face->cvt_size;
+ size->storage_size = maxp->maxStorage;
+
+ /* Set default metrics */
+ {
+ TT_Size_Metrics* metrics = &size->ttmetrics;
+
+
+ metrics->rotated = FALSE;
+ metrics->stretched = FALSE;
+
+ /* set default compensation (all 0) */
+ for ( i = 0; i < 4; i++ )
+ metrics->compensations[i] = 0;
+ }
+
+ /* allocate function defs, instruction defs, cvt, and storage area */
+ if ( FT_NEW_ARRAY( size->function_defs, size->max_function_defs ) ||
+ FT_NEW_ARRAY( size->instruction_defs, size->max_instruction_defs ) ||
+ FT_NEW_ARRAY( size->cvt, size->cvt_size ) ||
+ FT_NEW_ARRAY( size->storage, size->storage_size ) )
+ goto Exit;
+
+ /* reserve twilight zone */
+ n_twilight = maxp->maxTwilightPoints;
+
+ /* there are 4 phantom points (do we need this?) */
+ n_twilight += 4;
+
+ error = tt_glyphzone_new( memory, n_twilight, 0, &size->twilight );
+ if ( error )
+ goto Exit;
+
+ size->twilight.n_points = n_twilight;
+
+ size->GS = tt_default_graphics_state;
+
+ /* set `face->interpreter' according to the debug hook present */
+ {
+ FT_Library library = face->root.driver->root.library;
+
+
+ face->interpreter = (TT_Interpreter)
+ library->debug_hooks[FT_DEBUG_HOOK_TRUETYPE];
+ if ( !face->interpreter )
+ face->interpreter = (TT_Interpreter)TT_RunIns;
+ }
+
+ /* Fine, now run the font program! */
+ error = tt_size_run_fpgm( size, pedantic );
+ /* It seems fpgm proc is causing some problem for some font, so we ignore the error. TESTDOC: Bug #12690 - Restaurantkarte_Oktober09+Wild.pdf*/
+ if ( error )
+ tt_size_done_bytecode( ftsize );
+ return TT_Err_Ok;
+
+ Exit:
+ if ( error )
+ tt_size_done_bytecode( ftsize );
+
+ return error;
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ tt_size_ready_bytecode( TT_Size size,
+ FT_Bool pedantic )
+ {
+ FT_Error error = FT_Err_Ok;
+
+
+ if ( !size->bytecode_ready )
+ {
+ error = tt_size_init_bytecode( (FT_Size)size, pedantic );
+ if ( error )
+ goto Exit;
+ }
+
+ /* rescale CVT when needed */
+ if ( !size->cvt_ready )
+ {
+ FT_UInt i;
+ TT_Face face = (TT_Face)size->root.face;
+
+
+ /* Scale the cvt values to the new ppem. */
+ /* We use by default the y ppem to scale the CVT. */
+ for ( i = 0; i < size->cvt_size; i++ )
+ size->cvt[i] = FT_MulFix( face->cvt[i], size->ttmetrics.scale );
+
+ /* all twilight points are originally zero */
+ for ( i = 0; i < (FT_UInt)size->twilight.n_points; i++ )
+ {
+ size->twilight.org[i].x = 0;
+ size->twilight.org[i].y = 0;
+ size->twilight.cur[i].x = 0;
+ size->twilight.cur[i].y = 0;
+ }
+
+ /* clear storage area */
+ for ( i = 0; i < (FT_UInt)size->storage_size; i++ )
+ size->storage[i] = 0;
+
+ size->GS = tt_default_graphics_state;
+
+ tt_size_run_prep( size, pedantic );/* It seems prep proc is causing some problem for some font, so we ignore the error. TESTDOC: Bug #5025 - naredba-rd-16-296.pdf */
+ /* However we can't disable the prep. TESTDOC: Bug #0063 - 050826_differ_table.pdf, page #4 */
+ if ( !error )
+ size->cvt_ready = 1;
+ }
+
+ Exit:
+ return error;
+ }
+
+#endif /* TT_USE_BYTECODE_INTERPRETER */
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_size_init */
+ /* */
+ /* <Description> */
+ /* Initialize a new TrueType size object. */
+ /* */
+ /* <InOut> */
+ /* size :: A handle to the size object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ tt_size_init( FT_Size ttsize ) /* TT_Size */
+ {
+ TT_Size size = (TT_Size)ttsize;
+ FT_Error error = FT_Err_Ok;
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+ size->bytecode_ready = 0;
+ size->cvt_ready = 0;
+#endif
+
+ size->ttmetrics.valid = FALSE;
+ size->strike_index = 0xFFFFFFFFUL;
+
+ return error;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_size_done */
+ /* */
+ /* <Description> */
+ /* The TrueType size object finalizer. */
+ /* */
+ /* <Input> */
+ /* size :: A handle to the target size object. */
+ /* */
+ FT_LOCAL_DEF( void )
+ tt_size_done( FT_Size ttsize ) /* TT_Size */
+ {
+ TT_Size size = (TT_Size)ttsize;
+
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+ if ( size->bytecode_ready )
+ tt_size_done_bytecode( ttsize );
+#endif
+
+ size->ttmetrics.valid = FALSE;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_size_reset */
+ /* */
+ /* <Description> */
+ /* Reset a TrueType size when resolutions and character dimensions */
+ /* have been changed. */
+ /* */
+ /* <Input> */
+ /* size :: A handle to the target size object. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ tt_size_reset( TT_Size size )
+ {
+ TT_Face face;
+ FT_Error error = FT_Err_Ok;
+ FT_Size_Metrics* metrics;
+
+
+ size->ttmetrics.valid = FALSE;
+
+ face = (TT_Face)size->root.face;
+
+ metrics = &size->metrics;
+
+ /* copy the result from base layer */
+ *metrics = size->root.metrics;
+
+ if ( metrics->x_ppem < 1 || metrics->y_ppem < 1 )
+ return FT_THROW( Invalid_PPem );
+
+ /* This bit flag, if set, indicates that the ppems must be */
+ /* rounded to integers. Nearly all TrueType fonts have this bit */
+ /* set, as hinting won't work really well otherwise. */
+ /* */
+ if ( face->header.Flags & 8 )
+ {
+ metrics->x_scale = FT_DivFix( metrics->x_ppem << 6,
+ face->root.units_per_EM );
+ metrics->y_scale = FT_DivFix( metrics->y_ppem << 6,
+ face->root.units_per_EM );
+
+ metrics->ascender =
+ FT_PIX_ROUND( FT_MulFix( face->root.ascender, metrics->y_scale ) );
+ metrics->descender =
+ FT_PIX_ROUND( FT_MulFix( face->root.descender, metrics->y_scale ) );
+ metrics->height =
+ FT_PIX_ROUND( FT_MulFix( face->root.height, metrics->y_scale ) );
+ metrics->max_advance =
+ FT_PIX_ROUND( FT_MulFix( face->root.max_advance_width,
+ metrics->x_scale ) );
+ }
+
+ /* compute new transformation */
+ if ( metrics->x_ppem >= metrics->y_ppem )
+ {
+ size->ttmetrics.scale = metrics->x_scale;
+ size->ttmetrics.ppem = metrics->x_ppem;
+ size->ttmetrics.x_ratio = 0x10000L;
+ size->ttmetrics.y_ratio = FT_DivFix( metrics->y_ppem,
+ metrics->x_ppem );
+ }
+ else
+ {
+ size->ttmetrics.scale = metrics->y_scale;
+ size->ttmetrics.ppem = metrics->y_ppem;
+ size->ttmetrics.x_ratio = FT_DivFix( metrics->x_ppem,
+ metrics->y_ppem );
+ size->ttmetrics.y_ratio = 0x10000L;
+ }
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+ size->cvt_ready = 0;
+#endif /* TT_USE_BYTECODE_INTERPRETER */
+
+ if ( !error )
+ size->ttmetrics.valid = TRUE;
+
+ return error;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_driver_init */
+ /* */
+ /* <Description> */
+ /* Initialize a given TrueType driver object. */
+ /* */
+ /* <Input> */
+ /* driver :: A handle to the target driver object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ tt_driver_init( FT_Module ttdriver ) /* TT_Driver */
+ {
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+ TT_Driver driver = (TT_Driver)ttdriver;
+
+
+ if ( !TT_New_Context( driver ) )
+ return FT_THROW( Could_Not_Find_Context );
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+ driver->interpreter_version = TT_INTERPRETER_VERSION_38;
+#else
+ driver->interpreter_version = TT_INTERPRETER_VERSION_35;
+#endif
+
+#else /* !TT_USE_BYTECODE_INTERPRETER */
+
+ FT_UNUSED( ttdriver );
+
+#endif /* !TT_USE_BYTECODE_INTERPRETER */
+
+ return FT_Err_Ok;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_driver_done */
+ /* */
+ /* <Description> */
+ /* Finalize a given TrueType driver. */
+ /* */
+ /* <Input> */
+ /* driver :: A handle to the target TrueType driver. */
+ /* */
+ FT_LOCAL_DEF( void )
+ tt_driver_done( FT_Module ttdriver ) /* TT_Driver */
+ {
+#ifdef TT_USE_BYTECODE_INTERPRETER
+ TT_Driver driver = (TT_Driver)ttdriver;
+
+
+ /* destroy the execution context */
+ if ( driver->context )
+ {
+ TT_Done_Context( driver->context );
+ driver->context = NULL;
+ }
+#else
+ FT_UNUSED( ttdriver );
+#endif
+
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_slot_init */
+ /* */
+ /* <Description> */
+ /* Initialize a new slot object. */
+ /* */
+ /* <InOut> */
+ /* slot :: A handle to the slot object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ tt_slot_init( FT_GlyphSlot slot )
+ {
+ return FT_GlyphLoader_CreateExtra( slot->internal->loader );
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttobjs.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttobjs.h
new file mode 100644
index 0000000000..21dfb7ac45
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttobjs.h
@@ -0,0 +1,442 @@
+/***************************************************************************/
+/* */
+/* ttobjs.h */
+/* */
+/* Objects manager (specification). */
+/* */
+/* Copyright 1996-2009, 2011-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __TTOBJS_H__
+#define __TTOBJS_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/tttypes.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* TT_Driver */
+ /* */
+ /* <Description> */
+ /* A handle to a TrueType driver object. */
+ /* */
+ typedef struct TT_DriverRec_* TT_Driver;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* TT_Instance */
+ /* */
+ /* <Description> */
+ /* A handle to a TrueType size object. */
+ /* */
+ typedef struct TT_SizeRec_* TT_Size;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* TT_GlyphSlot */
+ /* */
+ /* <Description> */
+ /* A handle to a TrueType glyph slot object. */
+ /* */
+ /* <Note> */
+ /* This is a direct typedef of FT_GlyphSlot, as there is nothing */
+ /* specific about the TrueType glyph slot. */
+ /* */
+ typedef FT_GlyphSlot TT_GlyphSlot;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* TT_GraphicsState */
+ /* */
+ /* <Description> */
+ /* The TrueType graphics state used during bytecode interpretation. */
+ /* */
+ typedef struct TT_GraphicsState_
+ {
+ FT_UShort rp0;
+ FT_UShort rp1;
+ FT_UShort rp2;
+
+ FT_UnitVector dualVector;
+ FT_UnitVector projVector;
+ FT_UnitVector freeVector;
+
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+ FT_Bool both_x_axis;
+#endif
+
+ FT_Long loop;
+ FT_F26Dot6 minimum_distance;
+ FT_Int round_state;
+
+ FT_Bool auto_flip;
+ FT_F26Dot6 control_value_cutin;
+ FT_F26Dot6 single_width_cutin;
+ FT_F26Dot6 single_width_value;
+ FT_Short delta_base;
+ FT_Short delta_shift;
+
+ FT_Byte instruct_control;
+ /* According to Greg Hitchcock from Microsoft, the `scan_control' */
+ /* variable as documented in the TrueType specification is a 32-bit */
+ /* integer; the high-word part holds the SCANTYPE value, the low-word */
+ /* part the SCANCTRL value. We separate it into two fields. */
+ FT_Bool scan_control;
+ FT_Int scan_type;
+
+ FT_UShort gep0;
+ FT_UShort gep1;
+ FT_UShort gep2;
+
+ } TT_GraphicsState;
+
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+ FT_LOCAL( void )
+ tt_glyphzone_done( TT_GlyphZone zone );
+
+ FT_LOCAL( FT_Error )
+ tt_glyphzone_new( FT_Memory memory,
+ FT_UShort maxPoints,
+ FT_Short maxContours,
+ TT_GlyphZone zone );
+
+#endif /* TT_USE_BYTECODE_INTERPRETER */
+
+
+
+ /*************************************************************************/
+ /* */
+ /* EXECUTION SUBTABLES */
+ /* */
+ /* These sub-tables relate to instruction execution. */
+ /* */
+ /*************************************************************************/
+
+
+#define TT_MAX_CODE_RANGES 3
+
+
+ /*************************************************************************/
+ /* */
+ /* There can only be 3 active code ranges at once: */
+ /* - the Font Program */
+ /* - the CVT Program */
+ /* - a glyph's instructions set */
+ /* */
+ typedef enum TT_CodeRange_Tag_
+ {
+ tt_coderange_none = 0,
+ tt_coderange_font,
+ tt_coderange_cvt,
+ tt_coderange_glyph
+
+ } TT_CodeRange_Tag;
+
+
+ typedef struct TT_CodeRange_
+ {
+ FT_Byte* base;
+ FT_ULong size;
+
+ } TT_CodeRange;
+
+ typedef TT_CodeRange TT_CodeRangeTable[TT_MAX_CODE_RANGES];
+
+
+ /*************************************************************************/
+ /* */
+ /* Defines a function/instruction definition record. */
+ /* */
+ typedef struct TT_DefRecord_
+ {
+ FT_Int range; /* in which code range is it located? */
+ FT_Long start; /* where does it start? */
+ FT_Long end; /* where does it end? */
+ FT_UInt opc; /* function #, or instruction code */
+ FT_Bool active; /* is it active? */
+ FT_Bool inline_delta; /* is function that defines inline delta? */
+ FT_ULong sph_fdef_flags; /* flags to identify special functions */
+
+ } TT_DefRecord, *TT_DefArray;
+
+
+ /*************************************************************************/
+ /* */
+ /* Subglyph transformation record. */
+ /* */
+ typedef struct TT_Transform_
+ {
+ FT_Fixed xx, xy; /* transformation matrix coefficients */
+ FT_Fixed yx, yy;
+ FT_F26Dot6 ox, oy; /* offsets */
+
+ } TT_Transform;
+
+
+ /*************************************************************************/
+ /* */
+ /* A note regarding non-squared pixels: */
+ /* */
+ /* (This text will probably go into some docs at some time; for now, it */
+ /* is kept here to explain some definitions in the TT_Size_Metrics */
+ /* record). */
+ /* */
+ /* The CVT is a one-dimensional array containing values that control */
+ /* certain important characteristics in a font, like the height of all */
+ /* capitals, all lowercase letter, default spacing or stem width/height. */
+ /* */
+ /* These values are found in FUnits in the font file, and must be scaled */
+ /* to pixel coordinates before being used by the CVT and glyph programs. */
+ /* Unfortunately, when using distinct x and y resolutions (or distinct x */
+ /* and y pointsizes), there are two possible scalings. */
+ /* */
+ /* A first try was to implement a `lazy' scheme where all values were */
+ /* scaled when first used. However, while some values are always used */
+ /* in the same direction, some others are used under many different */
+ /* circumstances and orientations. */
+ /* */
+ /* I have found a simpler way to do the same, and it even seems to work */
+ /* in most of the cases: */
+ /* */
+ /* - All CVT values are scaled to the maximum ppem size. */
+ /* */
+ /* - When performing a read or write in the CVT, a ratio factor is used */
+ /* to perform adequate scaling. Example: */
+ /* */
+ /* x_ppem = 14 */
+ /* y_ppem = 10 */
+ /* */
+ /* We choose ppem = x_ppem = 14 as the CVT scaling size. All cvt */
+ /* entries are scaled to it. */
+ /* */
+ /* x_ratio = 1.0 */
+ /* y_ratio = y_ppem/ppem (< 1.0) */
+ /* */
+ /* We compute the current ratio like: */
+ /* */
+ /* - If projVector is horizontal, */
+ /* ratio = x_ratio = 1.0 */
+ /* */
+ /* - if projVector is vertical, */
+ /* ratio = y_ratio */
+ /* */
+ /* - else, */
+ /* ratio = sqrt( (proj.x * x_ratio) ^ 2 + (proj.y * y_ratio) ^ 2 ) */
+ /* */
+ /* Reading a cvt value returns */
+ /* ratio * cvt[index] */
+ /* */
+ /* Writing a cvt value in pixels: */
+ /* cvt[index] / ratio */
+ /* */
+ /* The current ppem is simply */
+ /* ratio * ppem */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* Metrics used by the TrueType size and context objects. */
+ /* */
+ typedef struct TT_Size_Metrics_
+ {
+ /* for non-square pixels */
+ FT_Long x_ratio;
+ FT_Long y_ratio;
+
+ FT_UShort ppem; /* maximum ppem size */
+ FT_Long ratio; /* current ratio */
+ FT_Fixed scale;
+
+ FT_F26Dot6 compensations[4]; /* device-specific compensations */
+
+ FT_Bool valid;
+
+ FT_Bool rotated; /* `is the glyph rotated?'-flag */
+ FT_Bool stretched; /* `is the glyph stretched?'-flag */
+
+ } TT_Size_Metrics;
+
+
+ /*************************************************************************/
+ /* */
+ /* TrueType size class. */
+ /* */
+ typedef struct TT_SizeRec_
+ {
+ FT_SizeRec root;
+
+ /* we have our own copy of metrics so that we can modify */
+ /* it without affecting auto-hinting (when used) */
+ FT_Size_Metrics metrics;
+
+ TT_Size_Metrics ttmetrics;
+
+ FT_ULong strike_index; /* 0xFFFFFFFF to indicate invalid */
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+ FT_UInt num_function_defs; /* number of function definitions */
+ FT_UInt max_function_defs;
+ TT_DefArray function_defs; /* table of function definitions */
+
+ FT_UInt num_instruction_defs; /* number of ins. definitions */
+ FT_UInt max_instruction_defs;
+ TT_DefArray instruction_defs; /* table of ins. definitions */
+
+ FT_UInt max_func;
+ FT_UInt max_ins;
+
+ TT_CodeRangeTable codeRangeTable;
+
+ TT_GraphicsState GS;
+
+ FT_ULong cvt_size; /* the scaled control value table */
+ FT_Long* cvt;
+
+ FT_UShort storage_size; /* The storage area is now part of */
+ FT_Long* storage; /* the instance */
+
+ TT_GlyphZoneRec twilight; /* The instance's twilight zone */
+
+ /* debugging variables */
+
+ /* When using the debugger, we must keep the */
+ /* execution context tied to the instance */
+ /* object rather than asking it on demand. */
+
+ FT_Bool debug;
+ TT_ExecContext context;
+
+ FT_Bool bytecode_ready;
+ FT_Bool cvt_ready;
+
+#endif /* TT_USE_BYTECODE_INTERPRETER */
+
+ } TT_SizeRec;
+
+
+ /*************************************************************************/
+ /* */
+ /* TrueType driver class. */
+ /* */
+ typedef struct TT_DriverRec_
+ {
+ FT_DriverRec root;
+
+ TT_ExecContext context; /* execution context */
+ TT_GlyphZoneRec zone; /* glyph loader points zone */
+
+ FT_UInt interpreter_version;
+
+ } TT_DriverRec;
+
+
+ /* Note: All of the functions below (except tt_size_reset()) are used */
+ /* as function pointers in a FT_Driver_ClassRec. Therefore their */
+ /* parameters are of types FT_Face, FT_Size, etc., rather than TT_Face, */
+ /* TT_Size, etc., so that the compiler can confirm that the types and */
+ /* number of parameters are correct. In all cases the FT_xxx types are */
+ /* cast to their TT_xxx counterparts inside the functions since FreeType */
+ /* will always use the TT driver to create them. */
+
+
+ /*************************************************************************/
+ /* */
+ /* Face functions */
+ /* */
+ FT_LOCAL( FT_Error )
+ tt_face_init( FT_Stream stream,
+ FT_Face ttface, /* TT_Face */
+ FT_Int face_index,
+ FT_Int num_params,
+ FT_Parameter* params );
+
+ FT_LOCAL( void )
+ tt_face_done( FT_Face ttface ); /* TT_Face */
+
+
+ /*************************************************************************/
+ /* */
+ /* Size functions */
+ /* */
+ FT_LOCAL( FT_Error )
+ tt_size_init( FT_Size ttsize ); /* TT_Size */
+
+ FT_LOCAL( void )
+ tt_size_done( FT_Size ttsize ); /* TT_Size */
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+ FT_LOCAL( FT_Error )
+ tt_size_run_fpgm( TT_Size size,
+ FT_Bool pedantic );
+
+ FT_LOCAL( FT_Error )
+ tt_size_run_prep( TT_Size size,
+ FT_Bool pedantic );
+
+ FT_LOCAL( FT_Error )
+ tt_size_ready_bytecode( TT_Size size,
+ FT_Bool pedantic );
+
+#endif /* TT_USE_BYTECODE_INTERPRETER */
+
+ FT_LOCAL( FT_Error )
+ tt_size_reset( TT_Size size );
+
+
+ /*************************************************************************/
+ /* */
+ /* Driver functions */
+ /* */
+ FT_LOCAL( FT_Error )
+ tt_driver_init( FT_Module ttdriver ); /* TT_Driver */
+
+ FT_LOCAL( void )
+ tt_driver_done( FT_Module ttdriver ); /* TT_Driver */
+
+
+ /*************************************************************************/
+ /* */
+ /* Slot functions */
+ /* */
+ FT_LOCAL( FT_Error )
+ tt_slot_init( FT_GlyphSlot slot );
+
+
+ /* auxiliary */
+#define IS_HINTED( flags ) ( ( flags & FT_LOAD_NO_HINTING ) == 0 )
+
+
+FT_END_HEADER
+
+#endif /* __TTOBJS_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttpic.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttpic.c
new file mode 100644
index 0000000000..ea38fd8e8c
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttpic.c
@@ -0,0 +1,101 @@
+/***************************************************************************/
+/* */
+/* ttpic.c */
+/* */
+/* The FreeType position independent code services for truetype module. */
+/* */
+/* Copyright 2009, 2010, 2012, 2013 by */
+/* Oran Agra and Mickey Gabel. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/freetype.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "ttpic.h"
+#include "tterrors.h"
+
+
+#ifdef FT_CONFIG_OPTION_PIC
+
+ /* forward declaration of PIC init functions from ttdriver.c */
+ FT_Error
+ FT_Create_Class_tt_services( FT_Library library,
+ FT_ServiceDescRec** output_class );
+ void
+ FT_Destroy_Class_tt_services( FT_Library library,
+ FT_ServiceDescRec* clazz );
+ void
+ FT_Init_Class_tt_service_gx_multi_masters(
+ FT_Service_MultiMastersRec* sv_mm );
+ void
+ FT_Init_Class_tt_service_truetype_glyf(
+ FT_Service_TTGlyfRec* sv_ttglyf );
+
+
+ void
+ tt_driver_class_pic_free( FT_Library library )
+ {
+ FT_PIC_Container* pic_container = &library->pic_container;
+ FT_Memory memory = library->memory;
+
+
+ if ( pic_container->truetype )
+ {
+ TTModulePIC* container = (TTModulePIC*)pic_container->truetype;
+
+
+ if ( container->tt_services )
+ FT_Destroy_Class_tt_services( library, container->tt_services );
+ container->tt_services = NULL;
+ FT_FREE( container );
+ pic_container->truetype = NULL;
+ }
+ }
+
+
+ FT_Error
+ tt_driver_class_pic_init( FT_Library library )
+ {
+ FT_PIC_Container* pic_container = &library->pic_container;
+ FT_Error error = FT_Err_Ok;
+ TTModulePIC* container = NULL;
+ FT_Memory memory = library->memory;
+
+
+ /* allocate pointer, clear and set global container pointer */
+ if ( FT_ALLOC( container, sizeof ( *container ) ) )
+ return error;
+ FT_MEM_SET( container, 0, sizeof ( *container ) );
+ pic_container->truetype = container;
+
+ /* initialize pointer table - this is how the module usually */
+ /* expects this data */
+ error = FT_Create_Class_tt_services( library,
+ &container->tt_services );
+ if ( error )
+ goto Exit;
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+ FT_Init_Class_tt_service_gx_multi_masters(
+ &container->tt_service_gx_multi_masters );
+#endif
+ FT_Init_Class_tt_service_truetype_glyf(
+ &container->tt_service_truetype_glyf );
+
+ Exit:
+ if ( error )
+ tt_driver_class_pic_free( library );
+ return error;
+ }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttpic.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttpic.h
new file mode 100644
index 0000000000..36cb357a9d
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttpic.h
@@ -0,0 +1,81 @@
+/***************************************************************************/
+/* */
+/* ttpic.h */
+/* */
+/* The FreeType position independent code services for truetype module. */
+/* */
+/* Copyright 2009, 2012, 2013 by */
+/* Oran Agra and Mickey Gabel. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __TTPIC_H__
+#define __TTPIC_H__
+
+
+FT_BEGIN_HEADER
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define TT_SERVICES_GET tt_services
+#define TT_SERVICE_GX_MULTI_MASTERS_GET tt_service_gx_multi_masters
+#define TT_SERVICE_TRUETYPE_GLYF_GET tt_service_truetype_glyf
+#define TT_SERVICE_PROPERTIES_GET tt_service_properties
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#include "../../include/freetype/ftmm.h"
+#include "../../include/freetype/internal/services/svmm.h"
+#include "../../include/freetype/internal/services/svttglyf.h"
+#include "../../include/freetype/internal/services/svprop.h"
+
+
+ typedef struct TTModulePIC_
+ {
+ FT_ServiceDescRec* tt_services;
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+ FT_Service_MultiMastersRec tt_service_gx_multi_masters;
+#endif
+ FT_Service_TTGlyfRec tt_service_truetype_glyf;
+ FT_Service_PropertiesRec tt_service_properties;
+
+ } TTModulePIC;
+
+
+#define GET_PIC( lib ) \
+ ( (TTModulePIC*)((lib)->pic_container.truetype) )
+#define TT_SERVICES_GET \
+ ( GET_PIC( library )->tt_services )
+#define TT_SERVICE_GX_MULTI_MASTERS_GET \
+ ( GET_PIC( library )->tt_service_gx_multi_masters )
+#define TT_SERVICE_TRUETYPE_GLYF_GET \
+ ( GET_PIC( library )->tt_service_truetype_glyf )
+#define TT_SERVICE_PROPERTIES_GET \
+ ( GET_PIC( library )->tt_service_properties )
+
+
+ /* see ttpic.c for the implementation */
+ void
+ tt_driver_class_pic_free( FT_Library library );
+
+ FT_Error
+ tt_driver_class_pic_init( FT_Library library );
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __TTPIC_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttpload.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttpload.c
new file mode 100644
index 0000000000..283d07d82f
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttpload.c
@@ -0,0 +1,601 @@
+/***************************************************************************/
+/* */
+/* ttpload.c */
+/* */
+/* TrueType-specific tables loader (body). */
+/* */
+/* Copyright 1996-2002, 2004-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/tttags.h"
+
+#include "ttpload.h"
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+#include "ttgxvar.h"
+#endif
+
+#include "tterrors.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_ttpload
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_face_load_loca */
+ /* */
+ /* <Description> */
+ /* Load the locations table. */
+ /* */
+ /* <InOut> */
+ /* face :: A handle to the target face object. */
+ /* */
+ /* <Input> */
+ /* stream :: The input stream. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ tt_face_load_loca( TT_Face face,
+ FT_Stream stream )
+ {
+ FT_Error error;
+ FT_ULong table_len;
+ FT_Int shift;
+
+
+ /* we need the size of the `glyf' table for malformed `loca' tables */
+ error = face->goto_table( face, TTAG_glyf, stream, &face->glyf_len );
+
+ /* it is possible that a font doesn't have a glyf table at all */
+ /* or its size is zero */
+ if ( FT_ERR_EQ( error, Table_Missing ) )
+ face->glyf_len = 0;
+ else if ( error )
+ goto Exit;
+
+ FT_TRACE2(( "Locations " ));
+ error = face->goto_table( face, TTAG_loca, stream, &table_len );
+ if ( error )
+ {
+ error = FT_THROW( Locations_Missing );
+ goto Exit;
+ }
+
+ if ( face->header.Index_To_Loc_Format != 0 )
+ {
+ shift = 2;
+
+ if ( table_len >= 0x40000L )
+ {
+ FT_TRACE2(( "table too large\n" ));
+ error = FT_THROW( Invalid_Table );
+ goto Exit;
+ }
+ face->num_locations = table_len >> shift;
+ }
+ else
+ {
+ shift = 1;
+
+ if ( table_len >= 0x20000L )
+ {
+ FT_TRACE2(( "table too large\n" ));
+ error = FT_THROW( Invalid_Table );
+ goto Exit;
+ }
+ face->num_locations = table_len >> shift;
+ }
+ /* Sunliang.Liu 20101013, We ignore the 242 new added code which cause some font load failed.
+ TESTDOC: Bug #4502 - PM2-beheerdershandleiding.pdf*/
+ /*if ( face->num_locations != (FT_ULong)face->root.num_glyphs + 1 )
+ {
+ FT_TRACE2(( "glyph count mismatch! loca: %d, maxp: %d\n",
+ face->num_locations - 1, face->root.num_glyphs ));
+
+ // we only handle the case where `maxp' gives a larger value
+ if ( face->num_locations <= (FT_ULong)face->root.num_glyphs )
+ {
+ FT_Long new_loca_len =
+ ( (FT_Long)( face->root.num_glyphs ) + 1 ) << shift;
+
+ TT_Table entry = face->dir_tables;
+ TT_Table limit = entry + face->num_tables;
+
+ FT_Long pos = FT_Stream_Pos( stream );
+ FT_Long dist = 0x7FFFFFFFL;
+
+
+ // compute the distance to next table in font file
+ for ( ; entry < limit; entry++ )
+ {
+ FT_Long diff = entry->Offset - pos;
+
+
+ if ( diff > 0 && diff < dist )
+ dist = diff;
+ }
+
+ if ( entry == limit )
+ {
+ // `loca' is the last table
+ dist = stream->size - pos;
+ }
+
+ if ( new_loca_len <= dist )
+ {
+ face->num_locations = face->root.num_glyphs + 1;
+ table_len = new_loca_len;
+
+ FT_TRACE2(( "adjusting num_locations to %d\n",
+ face->num_locations ));
+ }
+ }
+ }*/
+
+ /*
+ * Extract the frame. We don't need to decompress it since
+ * we are able to parse it directly.
+ */
+ if ( FT_FRAME_EXTRACT( table_len, face->glyph_locations ) )
+ goto Exit;
+
+ FT_TRACE2(( "loaded\n" ));
+
+ Exit:
+ return error;
+ }
+
+
+ FT_LOCAL_DEF( FT_ULong )
+ tt_face_get_location( TT_Face face,
+ FT_UInt gindex,
+ FT_UInt *asize )
+ {
+ FT_ULong pos1, pos2;
+ FT_Byte* p;
+ FT_Byte* p_limit;
+
+
+ pos1 = pos2 = 0;
+
+
+ if (gindex < face->num_locations)/* gindex < face->num_locations */ /* XYQ 2008-11-03 Some ill TT has wrong glyf table size. It seems Adobe ignore the limit. TESTDOC: Bug #6248 - F-2008-18.pdf */
+ {
+ if ( face->header.Index_To_Loc_Format != 0 )
+ {
+ p = face->glyph_locations + gindex * 4;
+ p_limit = face->glyph_locations + face->num_locations * 4;
+
+ pos1 = FT_NEXT_ULONG( p );
+ pos2 = pos1;
+
+ if (1)/* p + 4 <= p_limit ) */
+ pos2 = FT_NEXT_ULONG( p );
+ }
+ else
+ {
+ p = face->glyph_locations + gindex * 2;
+ p_limit = face->glyph_locations + face->num_locations * 2;
+
+ pos1 = FT_NEXT_USHORT( p );
+ pos2 = pos1;
+
+ if (1) /* p + 2 <= p_limit ) */
+ pos2 = FT_NEXT_USHORT( p );
+
+ pos1 <<= 1;
+ pos2 <<= 1;
+ }
+ }
+
+ /* Check broken location data */
+ if ( pos1 > face->glyf_len )
+ {
+ FT_TRACE1(( "tt_face_get_location:"
+ " too large offset=0x%08lx found for gid=0x%04lx,"
+ " exceeding the end of glyf table (0x%08lx)\n",
+ pos1, gindex, face->glyf_len ));
+ *asize = 0;
+ return 0;
+ }
+
+ if ( pos2 > face->glyf_len )
+ {
+ FT_TRACE1(( "tt_face_get_location:"
+ " too large offset=0x%08lx found for gid=0x%04lx,"
+ " truncate at the end of glyf table (0x%08lx)\n",
+ pos2, gindex + 1, face->glyf_len ));
+ pos2 = face->glyf_len;
+ }
+
+ /* The `loca' table must be ordered; it refers to the length of */
+ /* an entry as the difference between the current and the next */
+ /* position. However, there do exist (malformed) fonts which */
+ /* don't obey this rule, so we are only able to provide an */
+ /* upper bound for the size. */
+ /* */
+ /* We get (intentionally) a wrong, non-zero result in case the */
+ /* `glyf' table is missing. */
+ if ( pos2 >= pos1 )
+ *asize = (FT_UInt)( pos2 - pos1 );
+ else
+ *asize = (FT_UInt)( face->glyf_len - pos1 );
+
+ return pos1;
+ }
+
+
+ FT_LOCAL_DEF( void )
+ tt_face_done_loca( TT_Face face )
+ {
+ FT_Stream stream = face->root.stream;
+
+
+ FT_FRAME_RELEASE( face->glyph_locations );
+ face->num_locations = 0;
+ }
+
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_face_load_cvt */
+ /* */
+ /* <Description> */
+ /* Load the control value table into a face object. */
+ /* */
+ /* <InOut> */
+ /* face :: A handle to the target face object. */
+ /* */
+ /* <Input> */
+ /* stream :: A handle to the input stream. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ tt_face_load_cvt( TT_Face face,
+ FT_Stream stream )
+ {
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+ FT_Error error;
+ FT_Memory memory = stream->memory;
+ FT_ULong table_len;
+
+
+ FT_TRACE2(( "CVT " ));
+
+ error = face->goto_table( face, TTAG_cvt, stream, &table_len );
+ if ( error )
+ {
+ FT_TRACE2(( "is missing\n" ));
+
+ face->cvt_size = 0;
+ face->cvt = NULL;
+ error = FT_Err_Ok;
+
+ goto Exit;
+ }
+
+ face->cvt_size = table_len / 2;
+
+ if ( FT_NEW_ARRAY( face->cvt, face->cvt_size ) )
+ goto Exit;
+
+ if ( FT_FRAME_ENTER( face->cvt_size * 2L ) )
+ goto Exit;
+
+ {
+ FT_Short* cur = face->cvt;
+ FT_Short* limit = cur + face->cvt_size;
+
+
+ for ( ; cur < limit; cur++ )
+ *cur = FT_GET_SHORT();
+ }
+
+ FT_FRAME_EXIT();
+ FT_TRACE2(( "loaded\n" ));
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+ if ( face->doblend )
+ error = tt_face_vary_cvt( face, stream );
+#endif
+
+ Exit:
+ return error;
+
+#else /* !TT_USE_BYTECODE_INTERPRETER */
+
+ FT_UNUSED( face );
+ FT_UNUSED( stream );
+
+ return FT_Err_Ok;
+
+#endif
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_face_load_fpgm */
+ /* */
+ /* <Description> */
+ /* Load the font program. */
+ /* */
+ /* <InOut> */
+ /* face :: A handle to the target face object. */
+ /* */
+ /* <Input> */
+ /* stream :: A handle to the input stream. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ tt_face_load_fpgm( TT_Face face,
+ FT_Stream stream )
+ {
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+ FT_Error error;
+ FT_ULong table_len;
+
+
+ FT_TRACE2(( "Font program " ));
+
+ /* The font program is optional */
+ error = face->goto_table( face, TTAG_fpgm, stream, &table_len );
+ if ( error )
+ {
+ face->font_program = NULL;
+ face->font_program_size = 0;
+ error = FT_Err_Ok;
+
+ FT_TRACE2(( "is missing\n" ));
+ }
+ else
+ {
+ face->font_program_size = table_len;
+ if ( FT_FRAME_EXTRACT( table_len, face->font_program ) )
+ goto Exit;
+
+ FT_TRACE2(( "loaded, %12d bytes\n", face->font_program_size ));
+ }
+
+ Exit:
+ return error;
+
+#else /* !TT_USE_BYTECODE_INTERPRETER */
+
+ FT_UNUSED( face );
+ FT_UNUSED( stream );
+
+ return FT_Err_Ok;
+
+#endif
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_face_load_prep */
+ /* */
+ /* <Description> */
+ /* Load the cvt program. */
+ /* */
+ /* <InOut> */
+ /* face :: A handle to the target face object. */
+ /* */
+ /* <Input> */
+ /* stream :: A handle to the input stream. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ tt_face_load_prep( TT_Face face,
+ FT_Stream stream )
+ {
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+ FT_Error error;
+ FT_ULong table_len;
+
+
+ FT_TRACE2(( "Prep program " ));
+
+ error = face->goto_table( face, TTAG_prep, stream, &table_len );
+ if ( error )
+ {
+ face->cvt_program = NULL;
+ face->cvt_program_size = 0;
+ error = FT_Err_Ok;
+
+ FT_TRACE2(( "is missing\n" ));
+ }
+ else
+ {
+ face->cvt_program_size = table_len;
+ if ( FT_FRAME_EXTRACT( table_len, face->cvt_program ) )
+ goto Exit;
+
+ FT_TRACE2(( "loaded, %12d bytes\n", face->cvt_program_size ));
+ }
+
+ Exit:
+ return error;
+
+#else /* !TT_USE_BYTECODE_INTERPRETER */
+
+ FT_UNUSED( face );
+ FT_UNUSED( stream );
+
+ return FT_Err_Ok;
+
+#endif
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* tt_face_load_hdmx */
+ /* */
+ /* <Description> */
+ /* Load the `hdmx' table into the face object. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the target face object. */
+ /* */
+ /* stream :: A handle to the input stream. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+
+ FT_LOCAL_DEF( FT_Error )
+ tt_face_load_hdmx( TT_Face face,
+ FT_Stream stream )
+ {
+ FT_Error error;
+ FT_Memory memory = stream->memory;
+ FT_UInt version, nn, num_records;
+ FT_ULong table_size, record_size;
+ FT_Byte* p;
+ FT_Byte* limit;
+
+
+ /* this table is optional */
+ error = face->goto_table( face, TTAG_hdmx, stream, &table_size );
+ if ( error || table_size < 8 )
+ return FT_Err_Ok;
+
+ if ( FT_FRAME_EXTRACT( table_size, face->hdmx_table ) )
+ goto Exit;
+
+ p = face->hdmx_table;
+ limit = p + table_size;
+
+ version = FT_NEXT_USHORT( p );
+ num_records = FT_NEXT_USHORT( p );
+ record_size = FT_NEXT_ULONG( p );
+
+ /* The maximum number of bytes in an hdmx device record is the */
+ /* maximum number of glyphs + 2; this is 0xFFFF + 2; this is */
+ /* the reason why `record_size' is a long (which we read as */
+ /* unsigned long for convenience). In practice, two bytes */
+ /* sufficient to hold the size value. */
+ /* */
+ /* There are at least two fonts, HANNOM-A and HANNOM-B version */
+ /* 2.0 (2005), which get this wrong: The upper two bytes of */
+ /* the size value are set to 0xFF instead of 0x00. We catch */
+ /* and fix this. */
+
+ if ( record_size >= 0xFFFF0000UL )
+ record_size &= 0xFFFFU;
+
+ /* The limit for `num_records' is a heuristic value. */
+
+ if ( version != 0 || num_records > 255 || record_size > 0x10001L )
+ {
+ error = FT_THROW( Invalid_File_Format );
+ goto Fail;
+ }
+
+ if ( FT_NEW_ARRAY( face->hdmx_record_sizes, num_records ) )
+ goto Fail;
+
+ for ( nn = 0; nn < num_records; nn++ )
+ {
+ if ( p + record_size > limit )
+ break;
+
+ face->hdmx_record_sizes[nn] = p[0];
+ p += record_size;
+ }
+
+ face->hdmx_record_count = nn;
+ face->hdmx_table_size = table_size;
+ face->hdmx_record_size = record_size;
+
+ Exit:
+ return error;
+
+ Fail:
+ FT_FRAME_RELEASE( face->hdmx_table );
+ face->hdmx_table_size = 0;
+ goto Exit;
+ }
+
+
+ FT_LOCAL_DEF( void )
+ tt_face_free_hdmx( TT_Face face )
+ {
+ FT_Stream stream = face->root.stream;
+ FT_Memory memory = stream->memory;
+
+
+ FT_FREE( face->hdmx_record_sizes );
+ FT_FRAME_RELEASE( face->hdmx_table );
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* Return the advance width table for a given pixel size if it is found */
+ /* in the font's `hdmx' table (if any). */
+ /* */
+ FT_LOCAL_DEF( FT_Byte* )
+ tt_face_get_device_metrics( TT_Face face,
+ FT_UInt ppem,
+ FT_UInt gindex )
+ {
+ FT_UInt nn;
+ FT_Byte* result = NULL;
+ FT_ULong record_size = face->hdmx_record_size;
+ FT_Byte* record = face->hdmx_table + 8;
+
+
+ for ( nn = 0; nn < face->hdmx_record_count; nn++ )
+ if ( face->hdmx_record_sizes[nn] == ppem )
+ {
+ gindex += 2;
+ if ( gindex < record_size )
+ result = record + nn * record_size + gindex;
+ break;
+ }
+
+ return result;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttpload.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttpload.h
new file mode 100644
index 0000000000..4535880265
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttpload.h
@@ -0,0 +1,75 @@
+/***************************************************************************/
+/* */
+/* ttpload.h */
+/* */
+/* TrueType-specific tables loader (specification). */
+/* */
+/* Copyright 1996-2001, 2002, 2005, 2006 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __TTPLOAD_H__
+#define __TTPLOAD_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/tttypes.h"
+
+
+FT_BEGIN_HEADER
+
+
+ FT_LOCAL( FT_Error )
+ tt_face_load_loca( TT_Face face,
+ FT_Stream stream );
+
+ FT_LOCAL( FT_ULong )
+ tt_face_get_location( TT_Face face,
+ FT_UInt gindex,
+ FT_UInt *asize );
+
+ FT_LOCAL( void )
+ tt_face_done_loca( TT_Face face );
+
+ FT_LOCAL( FT_Error )
+ tt_face_load_cvt( TT_Face face,
+ FT_Stream stream );
+
+ FT_LOCAL( FT_Error )
+ tt_face_load_fpgm( TT_Face face,
+ FT_Stream stream );
+
+
+ FT_LOCAL( FT_Error )
+ tt_face_load_prep( TT_Face face,
+ FT_Stream stream );
+
+
+ FT_LOCAL( FT_Error )
+ tt_face_load_hdmx( TT_Face face,
+ FT_Stream stream );
+
+
+ FT_LOCAL( void )
+ tt_face_free_hdmx( TT_Face face );
+
+
+ FT_LOCAL( FT_Byte* )
+ tt_face_get_device_metrics( TT_Face face,
+ FT_UInt ppem,
+ FT_UInt gindex );
+
+FT_END_HEADER
+
+#endif /* __TTPLOAD_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttsubpix.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttsubpix.c
new file mode 100644
index 0000000000..1bff6f968a
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttsubpix.c
@@ -0,0 +1,1011 @@
+/***************************************************************************/
+/* */
+/* ttsubpix.c */
+/* */
+/* TrueType Subpixel Hinting. */
+/* */
+/* Copyright 2010-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftcalc.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/internal/sfnt.h"
+#include "../../include/freetype/tttags.h"
+#include "../../include/freetype/ftoutln.h"
+#include "../../include/freetype/ftttdrv.h"
+
+#include "ttsubpix.h"
+
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+
+ /*************************************************************************/
+ /* */
+ /* These rules affect how the TT Interpreter does hinting, with the */
+ /* goal of doing subpixel hinting by (in general) ignoring x moves. */
+ /* Some of these rules are fixes that go above and beyond the */
+ /* stated techniques in the MS whitepaper on Cleartype, due to */
+ /* artifacts in many glyphs. So, these rules make some glyphs render */
+ /* better than they do in the MS rasterizer. */
+ /* */
+ /* "" string or 0 int/char indicates to apply to all glyphs. */
+ /* "-" used as dummy placeholders, but any non-matching string works. */
+ /* */
+ /* Some of this could arguably be implemented in fontconfig, however: */
+ /* */
+ /* - Fontconfig can't set things on a glyph-by-glyph basis. */
+ /* - The tweaks that happen here are very low-level, from an average */
+ /* user's point of view and are best implemented in the hinter. */
+ /* */
+ /* The goal is to make the subpixel hinting techniques as generalized */
+ /* as possible across all fonts to prevent the need for extra rules such */
+ /* as these. */
+ /* */
+ /* The rule structure is designed so that entirely new rules can easily */
+ /* be added when a new compatibility feature is discovered. */
+ /* */
+ /* The rule structures could also use some enhancement to handle ranges. */
+ /* */
+ /* ****************** WORK IN PROGRESS ******************* */
+ /* */
+
+ /* These are `classes' of fonts that can be grouped together and used in */
+ /* rules below. A blank entry "" is required at the end of these! */
+#define FAMILY_CLASS_RULES_SIZE 7
+
+ static const SPH_Font_Class FAMILY_CLASS_Rules
+ [FAMILY_CLASS_RULES_SIZE] =
+ {
+ { "MS Legacy Fonts",
+ { "Aharoni",
+ "Andale Mono",
+ "Andalus",
+ "Angsana New",
+ "AngsanaUPC",
+ "Arabic Transparent",
+ "Arial Black",
+ "Arial Narrow",
+ "Arial Unicode MS",
+ "Arial",
+ "Batang",
+ "Browallia New",
+ "BrowalliaUPC",
+ "Comic Sans MS",
+ "Cordia New",
+ "CordiaUPC",
+ "Courier New",
+ "DFKai-SB",
+ "David Transparent",
+ "David",
+ "DilleniaUPC",
+ "Estrangelo Edessa",
+ "EucrosiaUPC",
+ "FangSong_GB2312",
+ "Fixed Miriam Transparent",
+ "FrankRuehl",
+ "Franklin Gothic Medium",
+ "FreesiaUPC",
+ "Garamond",
+ "Gautami",
+ "Georgia",
+ "Gulim",
+ "Impact",
+ "IrisUPC",
+ "JasmineUPC",
+ "KaiTi_GB2312",
+ "KodchiangUPC",
+ "Latha",
+ "Levenim MT",
+ "LilyUPC",
+ "Lucida Console",
+ "Lucida Sans Unicode",
+ "MS Gothic",
+ "MS Mincho",
+ "MV Boli",
+ "Mangal",
+ "Marlett",
+ "Microsoft Sans Serif",
+ "Mingliu",
+ "Miriam Fixed",
+ "Miriam Transparent",
+ "Miriam",
+ "Narkisim",
+ "Palatino Linotype",
+ "Raavi",
+ "Rod Transparent",
+ "Rod",
+ "Shruti",
+ "SimHei",
+ "Simplified Arabic Fixed",
+ "Simplified Arabic",
+ "Simsun",
+ "Sylfaen",
+ "Symbol",
+ "Tahoma",
+ "Times New Roman",
+ "Traditional Arabic",
+ "Trebuchet MS",
+ "Tunga",
+ "Verdana",
+ "Webdings",
+ "Wingdings",
+ "",
+ },
+ },
+ { "Core MS Legacy Fonts",
+ { "Arial Black",
+ "Arial Narrow",
+ "Arial Unicode MS",
+ "Arial",
+ "Comic Sans MS",
+ "Courier New",
+ "Garamond",
+ "Georgia",
+ "Impact",
+ "Lucida Console",
+ "Lucida Sans Unicode",
+ "Microsoft Sans Serif",
+ "Palatino Linotype",
+ "Tahoma",
+ "Times New Roman",
+ "Trebuchet MS",
+ "Verdana",
+ "",
+ },
+ },
+ { "Apple Legacy Fonts",
+ { "Geneva",
+ "Times",
+ "Monaco",
+ "Century",
+ "Chalkboard",
+ "Lobster",
+ "Century Gothic",
+ "Optima",
+ "Lucida Grande",
+ "Gill Sans",
+ "Baskerville",
+ "Helvetica",
+ "Helvetica Neue",
+ "",
+ },
+ },
+ { "Legacy Sans Fonts",
+ { "Andale Mono",
+ "Arial Unicode MS",
+ "Arial",
+ "Century Gothic",
+ "Comic Sans MS",
+ "Franklin Gothic Medium",
+ "Geneva",
+ "Lucida Console",
+ "Lucida Grande",
+ "Lucida Sans Unicode",
+ "Lucida Sans Typewriter",
+ "Microsoft Sans Serif",
+ "Monaco",
+ "Tahoma",
+ "Trebuchet MS",
+ "Verdana",
+ "",
+ },
+ },
+
+ { "Misc Legacy Fonts",
+ { "Dark Courier", "", }, },
+ { "Verdana Clones",
+ { "DejaVu Sans",
+ "Bitstream Vera Sans", "", }, },
+ { "Verdana and Clones",
+ { "DejaVu Sans",
+ "Bitstream Vera Sans",
+ "Verdana", "", }, },
+ };
+
+
+ /* Define this to force natural (i.e. not bitmap-compatible) widths. */
+ /* The default leans strongly towards natural widths except for a few */
+ /* legacy fonts where a selective combination produces nicer results. */
+/* #define FORCE_NATURAL_WIDTHS */
+
+
+ /* Define `classes' of styles that can be grouped together and used in */
+ /* rules below. A blank entry "" is required at the end of these! */
+#define STYLE_CLASS_RULES_SIZE 5
+
+ const SPH_Font_Class STYLE_CLASS_Rules
+ [STYLE_CLASS_RULES_SIZE] =
+ {
+ { "Regular Class",
+ { "Regular",
+ "Book",
+ "Medium",
+ "Roman",
+ "Normal",
+ "",
+ },
+ },
+ { "Regular/Italic Class",
+ { "Regular",
+ "Book",
+ "Medium",
+ "Italic",
+ "Oblique",
+ "Roman",
+ "Normal",
+ "",
+ },
+ },
+ { "Bold/BoldItalic Class",
+ { "Bold",
+ "Bold Italic",
+ "Black",
+ "",
+ },
+ },
+ { "Bold/Italic/BoldItalic Class",
+ { "Bold",
+ "Bold Italic",
+ "Black",
+ "Italic",
+ "Oblique",
+ "",
+ },
+ },
+ { "Regular/Bold Class",
+ { "Regular",
+ "Book",
+ "Medium",
+ "Normal",
+ "Roman",
+ "Bold",
+ "Black",
+ "",
+ },
+ },
+ };
+
+
+ /* Force special legacy fixes for fonts. */
+#define COMPATIBILITY_MODE_RULES_SIZE 1
+
+ const SPH_TweakRule COMPATIBILITY_MODE_Rules
+ [COMPATIBILITY_MODE_RULES_SIZE] =
+ {
+ { "-", 0, "", 0 },
+ };
+
+
+ /* Don't do subpixel (ignore_x_mode) hinting; do normal hinting. */
+#define PIXEL_HINTING_RULES_SIZE 2
+
+ const SPH_TweakRule PIXEL_HINTING_Rules
+ [PIXEL_HINTING_RULES_SIZE] =
+ {
+ /* these characters are almost always safe */
+ { "Courier New", 12, "Italic", 'z' },
+ { "Courier New", 11, "Italic", 'z' },
+ };
+
+
+ /* Subpixel hinting ignores SHPIX rules on X. Force SHPIX for these. */
+#define DO_SHPIX_RULES_SIZE 1
+
+ const SPH_TweakRule DO_SHPIX_Rules
+ [DO_SHPIX_RULES_SIZE] =
+ {
+ { "-", 0, "", 0 },
+ };
+
+
+ /* Skip Y moves that start with a point that is not on a Y pixel */
+ /* boundary and don't move that point to a Y pixel boundary. */
+#define SKIP_NONPIXEL_Y_MOVES_RULES_SIZE 4
+
+ const SPH_TweakRule SKIP_NONPIXEL_Y_MOVES_Rules
+ [SKIP_NONPIXEL_Y_MOVES_RULES_SIZE] =
+ {
+ /* fix vwxyz thinness*/
+ { "Consolas", 0, "", 0 },
+ /* Fix thin middle stems */
+ { "Core MS Legacy Fonts", 0, "Regular", 0 },
+ /* Cyrillic small letter I */
+ { "Legacy Sans Fonts", 0, "", 0 },
+ /* Fix artifacts with some Regular & Bold */
+ { "Verdana Clones", 0, "", 0 },
+ };
+
+
+#define SKIP_NONPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE 1
+
+ const SPH_TweakRule SKIP_NONPIXEL_Y_MOVES_Rules_Exceptions
+ [SKIP_NONPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE] =
+ {
+ /* Fixes < and > */
+ { "Courier New", 0, "Regular", 0 },
+ };
+
+
+ /* Skip Y moves that start with a point that is not on a Y pixel */
+ /* boundary and don't move that point to a Y pixel boundary. */
+#define SKIP_NONPIXEL_Y_MOVES_DELTAP_RULES_SIZE 2
+
+ const SPH_TweakRule SKIP_NONPIXEL_Y_MOVES_DELTAP_Rules
+ [SKIP_NONPIXEL_Y_MOVES_DELTAP_RULES_SIZE] =
+ {
+ /* Maintain thickness of diagonal in 'N' */
+ { "Times New Roman", 0, "Regular/Bold Class", 'N' },
+ { "Georgia", 0, "Regular/Bold Class", 'N' },
+ };
+
+
+ /* Skip Y moves that move a point off a Y pixel boundary. */
+#define SKIP_OFFPIXEL_Y_MOVES_RULES_SIZE 1
+
+ const SPH_TweakRule SKIP_OFFPIXEL_Y_MOVES_Rules
+ [SKIP_OFFPIXEL_Y_MOVES_RULES_SIZE] =
+ {
+ { "-", 0, "", 0 },
+ };
+
+
+#define SKIP_OFFPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE 1
+
+ const SPH_TweakRule SKIP_OFFPIXEL_Y_MOVES_Rules_Exceptions
+ [SKIP_OFFPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE] =
+ {
+ { "-", 0, "", 0 },
+ };
+
+
+ /* Round moves that don't move a point to a Y pixel boundary. */
+#define ROUND_NONPIXEL_Y_MOVES_RULES_SIZE 2
+
+ const SPH_TweakRule ROUND_NONPIXEL_Y_MOVES_Rules
+ [ROUND_NONPIXEL_Y_MOVES_RULES_SIZE] =
+ {
+ /* Droid font instructions don't snap Y to pixels */
+ { "Droid Sans", 0, "Regular/Italic Class", 0 },
+ { "Droid Sans Mono", 0, "", 0 },
+ };
+
+
+#define ROUND_NONPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE 1
+
+ const SPH_TweakRule ROUND_NONPIXEL_Y_MOVES_Rules_Exceptions
+ [ROUND_NONPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE] =
+ {
+ { "-", 0, "", 0 },
+ };
+
+
+ /* Allow a Direct_Move along X freedom vector if matched. */
+#define ALLOW_X_DMOVE_RULES_SIZE 1
+
+ const SPH_TweakRule ALLOW_X_DMOVE_Rules
+ [ALLOW_X_DMOVE_RULES_SIZE] =
+ {
+ /* Fixes vanishing diagonal in 4 */
+ { "Verdana", 0, "Regular", '4' },
+ };
+
+
+ /* Return MS rasterizer version 35 if matched. */
+#define RASTERIZER_35_RULES_SIZE 8
+
+ const SPH_TweakRule RASTERIZER_35_Rules
+ [RASTERIZER_35_RULES_SIZE] =
+ {
+ /* This seems to be the only way to make these look good */
+ { "Times New Roman", 0, "Regular", 'i' },
+ { "Times New Roman", 0, "Regular", 'j' },
+ { "Times New Roman", 0, "Regular", 'm' },
+ { "Times New Roman", 0, "Regular", 'r' },
+ { "Times New Roman", 0, "Regular", 'a' },
+ { "Times New Roman", 0, "Regular", 'n' },
+ { "Times New Roman", 0, "Regular", 'p' },
+ { "Times", 0, "", 0 },
+ };
+
+
+ /* Don't round to the subpixel grid. Round to pixel grid. */
+#define NORMAL_ROUND_RULES_SIZE 1
+
+ const SPH_TweakRule NORMAL_ROUND_Rules
+ [NORMAL_ROUND_RULES_SIZE] =
+ {
+ /* Fix serif thickness for certain ppems */
+ /* Can probably be generalized somehow */
+ { "Courier New", 0, "", 0 },
+ };
+
+
+ /* Skip IUP instructions if matched. */
+#define SKIP_IUP_RULES_SIZE 1
+
+ const SPH_TweakRule SKIP_IUP_Rules
+ [SKIP_IUP_RULES_SIZE] =
+ {
+ { "Arial", 13, "Regular", 'a' },
+ };
+
+
+ /* Skip MIAP Twilight hack if matched. */
+#define MIAP_HACK_RULES_SIZE 1
+
+ const SPH_TweakRule MIAP_HACK_Rules
+ [MIAP_HACK_RULES_SIZE] =
+ {
+ { "Geneva", 12, "", 0 },
+ };
+
+
+ /* Skip DELTAP instructions if matched. */
+#define ALWAYS_SKIP_DELTAP_RULES_SIZE 23
+
+ const SPH_TweakRule ALWAYS_SKIP_DELTAP_Rules
+ [ALWAYS_SKIP_DELTAP_RULES_SIZE] =
+ {
+ { "Georgia", 0, "Regular", 'k' },
+ /* fix various problems with e in different versions */
+ { "Trebuchet MS", 14, "Regular", 'e' },
+ { "Trebuchet MS", 13, "Regular", 'e' },
+ { "Trebuchet MS", 15, "Regular", 'e' },
+ { "Trebuchet MS", 0, "Italic", 'v' },
+ { "Trebuchet MS", 0, "Italic", 'w' },
+ { "Trebuchet MS", 0, "Regular", 'Y' },
+ { "Arial", 11, "Regular", 's' },
+ /* prevent problems with '3' and others */
+ { "Verdana", 10, "Regular", 0 },
+ { "Verdana", 9, "Regular", 0 },
+ /* Cyrillic small letter short I */
+ { "Legacy Sans Fonts", 0, "", 0x438 },
+ { "Legacy Sans Fonts", 0, "", 0x439 },
+ { "Arial", 10, "Regular", '6' },
+ { "Arial", 0, "Bold/BoldItalic Class", 'a' },
+ /* Make horizontal stems consistent with the rest */
+ { "Arial", 24, "Bold", 'a' },
+ { "Arial", 25, "Bold", 'a' },
+ { "Arial", 24, "Bold", 's' },
+ { "Arial", 25, "Bold", 's' },
+ { "Arial", 34, "Bold", 's' },
+ { "Arial", 35, "Bold", 's' },
+ { "Arial", 36, "Bold", 's' },
+ { "Arial", 25, "Regular", 's' },
+ { "Arial", 26, "Regular", 's' },
+ };
+
+
+ /* Always do DELTAP instructions if matched. */
+#define ALWAYS_DO_DELTAP_RULES_SIZE 1
+
+ const SPH_TweakRule ALWAYS_DO_DELTAP_Rules
+ [ALWAYS_DO_DELTAP_RULES_SIZE] =
+ {
+ { "-", 0, "", 0 },
+ };
+
+
+ /* Don't allow ALIGNRP after IUP. */
+#define NO_ALIGNRP_AFTER_IUP_RULES_SIZE 1
+
+ static const SPH_TweakRule NO_ALIGNRP_AFTER_IUP_Rules
+ [NO_ALIGNRP_AFTER_IUP_RULES_SIZE] =
+ {
+ /* Prevent creation of dents in outline */
+ { "-", 0, "", 0 },
+ };
+
+
+ /* Don't allow DELTAP after IUP. */
+#define NO_DELTAP_AFTER_IUP_RULES_SIZE 1
+
+ static const SPH_TweakRule NO_DELTAP_AFTER_IUP_Rules
+ [NO_DELTAP_AFTER_IUP_RULES_SIZE] =
+ {
+ { "-", 0, "", 0 },
+ };
+
+
+ /* Don't allow CALL after IUP. */
+#define NO_CALL_AFTER_IUP_RULES_SIZE 1
+
+ static const SPH_TweakRule NO_CALL_AFTER_IUP_Rules
+ [NO_CALL_AFTER_IUP_RULES_SIZE] =
+ {
+ /* Prevent creation of dents in outline */
+ { "-", 0, "", 0 },
+ };
+
+
+ /* De-embolden these glyphs slightly. */
+#define DEEMBOLDEN_RULES_SIZE 9
+
+ static const SPH_TweakRule DEEMBOLDEN_Rules
+ [DEEMBOLDEN_RULES_SIZE] =
+ {
+ { "Courier New", 0, "Bold", 'A' },
+ { "Courier New", 0, "Bold", 'W' },
+ { "Courier New", 0, "Bold", 'w' },
+ { "Courier New", 0, "Bold", 'M' },
+ { "Courier New", 0, "Bold", 'X' },
+ { "Courier New", 0, "Bold", 'K' },
+ { "Courier New", 0, "Bold", 'x' },
+ { "Courier New", 0, "Bold", 'z' },
+ { "Courier New", 0, "Bold", 'v' },
+ };
+
+
+ /* Embolden these glyphs slightly. */
+#define EMBOLDEN_RULES_SIZE 2
+
+ static const SPH_TweakRule EMBOLDEN_Rules
+ [EMBOLDEN_RULES_SIZE] =
+ {
+ { "Courier New", 0, "Regular", 0 },
+ { "Courier New", 0, "Italic", 0 },
+ };
+
+
+ /* This is a CVT hack that makes thick horizontal stems on 2, 5, 7 */
+ /* similar to Windows XP. */
+#define TIMES_NEW_ROMAN_HACK_RULES_SIZE 12
+
+ static const SPH_TweakRule TIMES_NEW_ROMAN_HACK_Rules
+ [TIMES_NEW_ROMAN_HACK_RULES_SIZE] =
+ {
+ { "Times New Roman", 16, "Italic", '2' },
+ { "Times New Roman", 16, "Italic", '5' },
+ { "Times New Roman", 16, "Italic", '7' },
+ { "Times New Roman", 16, "Regular", '2' },
+ { "Times New Roman", 16, "Regular", '5' },
+ { "Times New Roman", 16, "Regular", '7' },
+ { "Times New Roman", 17, "Italic", '2' },
+ { "Times New Roman", 17, "Italic", '5' },
+ { "Times New Roman", 17, "Italic", '7' },
+ { "Times New Roman", 17, "Regular", '2' },
+ { "Times New Roman", 17, "Regular", '5' },
+ { "Times New Roman", 17, "Regular", '7' },
+ };
+
+
+ /* This fudges distance on 2 to get rid of the vanishing stem issue. */
+ /* A real solution to this is certainly welcome. */
+#define COURIER_NEW_2_HACK_RULES_SIZE 15
+
+ static const SPH_TweakRule COURIER_NEW_2_HACK_Rules
+ [COURIER_NEW_2_HACK_RULES_SIZE] =
+ {
+ { "Courier New", 10, "Regular", '2' },
+ { "Courier New", 11, "Regular", '2' },
+ { "Courier New", 12, "Regular", '2' },
+ { "Courier New", 13, "Regular", '2' },
+ { "Courier New", 14, "Regular", '2' },
+ { "Courier New", 15, "Regular", '2' },
+ { "Courier New", 16, "Regular", '2' },
+ { "Courier New", 17, "Regular", '2' },
+ { "Courier New", 18, "Regular", '2' },
+ { "Courier New", 19, "Regular", '2' },
+ { "Courier New", 20, "Regular", '2' },
+ { "Courier New", 21, "Regular", '2' },
+ { "Courier New", 22, "Regular", '2' },
+ { "Courier New", 23, "Regular", '2' },
+ { "Courier New", 24, "Regular", '2' },
+ };
+
+
+#ifndef FORCE_NATURAL_WIDTHS
+
+ /* Use compatible widths with these glyphs. Compatible widths is always */
+ /* on when doing B/W TrueType instructing, but is used selectively here, */
+ /* typically on glyphs with 3 or more vertical stems. */
+#define COMPATIBLE_WIDTHS_RULES_SIZE 38
+
+ static const SPH_TweakRule COMPATIBLE_WIDTHS_Rules
+ [COMPATIBLE_WIDTHS_RULES_SIZE] =
+ {
+ { "Arial Unicode MS", 12, "Regular Class", 'm' },
+ { "Arial Unicode MS", 14, "Regular Class", 'm' },
+ /* Cyrillic small letter sha */
+ { "Arial", 10, "Regular Class", 0x448 },
+ { "Arial", 11, "Regular Class", 'm' },
+ { "Arial", 12, "Regular Class", 'm' },
+ /* Cyrillic small letter sha */
+ { "Arial", 12, "Regular Class", 0x448 },
+ { "Arial", 13, "Regular Class", 0x448 },
+ { "Arial", 14, "Regular Class", 'm' },
+ /* Cyrillic small letter sha */
+ { "Arial", 14, "Regular Class", 0x448 },
+ { "Arial", 15, "Regular Class", 0x448 },
+ { "Arial", 17, "Regular Class", 'm' },
+ { "DejaVu Sans", 15, "Regular Class", 0 },
+ { "Microsoft Sans Serif", 11, "Regular Class", 0 },
+ { "Microsoft Sans Serif", 12, "Regular Class", 0 },
+ { "Segoe UI", 11, "Regular Class", 0 },
+ { "Monaco", 0, "Regular Class", 0 },
+ { "Segoe UI", 12, "Regular Class", 'm' },
+ { "Segoe UI", 14, "Regular Class", 'm' },
+ { "Tahoma", 11, "Regular Class", 0 },
+ { "Times New Roman", 16, "Regular Class", 'c' },
+ { "Times New Roman", 16, "Regular Class", 'm' },
+ { "Times New Roman", 16, "Regular Class", 'o' },
+ { "Times New Roman", 16, "Regular Class", 'w' },
+ { "Trebuchet MS", 11, "Regular Class", 0 },
+ { "Trebuchet MS", 12, "Regular Class", 0 },
+ { "Trebuchet MS", 14, "Regular Class", 0 },
+ { "Trebuchet MS", 15, "Regular Class", 0 },
+ { "Ubuntu", 12, "Regular Class", 'm' },
+ /* Cyrillic small letter sha */
+ { "Verdana", 10, "Regular Class", 0x448 },
+ { "Verdana", 11, "Regular Class", 0x448 },
+ { "Verdana and Clones", 12, "Regular Class", 'i' },
+ { "Verdana and Clones", 12, "Regular Class", 'j' },
+ { "Verdana and Clones", 12, "Regular Class", 'l' },
+ { "Verdana and Clones", 12, "Regular Class", 'm' },
+ { "Verdana and Clones", 13, "Regular Class", 'i' },
+ { "Verdana and Clones", 13, "Regular Class", 'j' },
+ { "Verdana and Clones", 13, "Regular Class", 'l' },
+ { "Verdana and Clones", 14, "Regular Class", 'm' },
+ };
+
+
+ /* Scaling slightly in the x-direction prior to hinting results in */
+ /* more visually pleasing glyphs in certain cases. */
+ /* This sometimes needs to be coordinated with compatible width rules. */
+ /* A value of 1000 corresponds to a scaled value of 1.0. */
+
+#define X_SCALING_RULES_SIZE 50
+
+ static const SPH_ScaleRule X_SCALING_Rules[X_SCALING_RULES_SIZE] =
+ {
+ { "DejaVu Sans", 12, "Regular Class", 'm', 950 },
+ { "Verdana and Clones", 12, "Regular Class", 'a', 1100 },
+ { "Verdana and Clones", 13, "Regular Class", 'a', 1050 },
+ { "Arial", 11, "Regular Class", 'm', 975 },
+ { "Arial", 12, "Regular Class", 'm', 1050 },
+ /* Cyrillic small letter el */
+ { "Arial", 13, "Regular Class", 0x43B, 950 },
+ { "Arial", 13, "Regular Class", 'o', 950 },
+ { "Arial", 13, "Regular Class", 'e', 950 },
+ { "Arial", 14, "Regular Class", 'm', 950 },
+ /* Cyrillic small letter el */
+ { "Arial", 15, "Regular Class", 0x43B, 925 },
+ { "Bitstream Vera Sans", 10, "Regular/Italic Class", 0, 1100 },
+ { "Bitstream Vera Sans", 12, "Regular/Italic Class", 0, 1050 },
+ { "Bitstream Vera Sans", 16, "Regular Class", 0, 1050 },
+ { "Bitstream Vera Sans", 9, "Regular/Italic Class", 0, 1050 },
+ { "DejaVu Sans", 12, "Regular Class", 'l', 975 },
+ { "DejaVu Sans", 12, "Regular Class", 'i', 975 },
+ { "DejaVu Sans", 12, "Regular Class", 'j', 975 },
+ { "DejaVu Sans", 13, "Regular Class", 'l', 950 },
+ { "DejaVu Sans", 13, "Regular Class", 'i', 950 },
+ { "DejaVu Sans", 13, "Regular Class", 'j', 950 },
+ { "DejaVu Sans", 10, "Regular/Italic Class", 0, 1100 },
+ { "DejaVu Sans", 12, "Regular/Italic Class", 0, 1050 },
+ { "Georgia", 10, "", 0, 1050 },
+ { "Georgia", 11, "", 0, 1100 },
+ { "Georgia", 12, "", 0, 1025 },
+ { "Georgia", 13, "", 0, 1050 },
+ { "Georgia", 16, "", 0, 1050 },
+ { "Georgia", 17, "", 0, 1030 },
+ { "Liberation Sans", 12, "Regular Class", 'm', 1100 },
+ { "Lucida Grande", 11, "Regular Class", 'm', 1100 },
+ { "Microsoft Sans Serif", 11, "Regular Class", 'm', 950 },
+ { "Microsoft Sans Serif", 12, "Regular Class", 'm', 1050 },
+ { "Segoe UI", 12, "Regular Class", 'H', 1050 },
+ { "Segoe UI", 12, "Regular Class", 'm', 1050 },
+ { "Segoe UI", 14, "Regular Class", 'm', 1050 },
+ { "Tahoma", 11, "Regular Class", 'i', 975 },
+ { "Tahoma", 11, "Regular Class", 'l', 975 },
+ { "Tahoma", 11, "Regular Class", 'j', 900 },
+ { "Tahoma", 11, "Regular Class", 'm', 918 },
+ { "Verdana", 10, "Regular/Italic Class", 0, 1100 },
+ { "Verdana", 12, "Regular Class", 'm', 975 },
+ { "Verdana", 12, "Regular/Italic Class", 0, 1050 },
+ { "Verdana", 13, "Regular/Italic Class", 'i', 950 },
+ { "Verdana", 13, "Regular/Italic Class", 'j', 950 },
+ { "Verdana", 13, "Regular/Italic Class", 'l', 950 },
+ { "Verdana", 16, "Regular Class", 0, 1050 },
+ { "Verdana", 9, "Regular/Italic Class", 0, 1050 },
+ { "Times New Roman", 16, "Regular Class", 'm', 918 },
+ { "Trebuchet MS", 11, "Regular Class", 'm', 800 },
+ { "Trebuchet MS", 12, "Regular Class", 'm', 800 },
+ };
+
+#else
+
+#define COMPATIBLE_WIDTHS_RULES_SIZE 1
+
+ static const SPH_TweakRule COMPATIBLE_WIDTHS_Rules
+ [COMPATIBLE_WIDTHS_RULES_SIZE] =
+ {
+ { "-", 0, "", 0 },
+ };
+
+
+#define X_SCALING_RULES_SIZE 1
+
+ static const SPH_ScaleRule X_SCALING_Rules
+ [X_SCALING_RULES_SIZE] =
+ {
+ { "-", 0, "", 0, 1000 },
+ };
+
+#endif /* FORCE_NATURAL_WIDTHS */
+
+
+ FT_LOCAL_DEF( FT_Bool )
+ is_member_of_family_class( const FT_String* detected_font_name,
+ const FT_String* rule_font_name )
+ {
+ FT_UInt i, j;
+
+
+ /* Does font name match rule family? */
+ if ( strcmp( detected_font_name, rule_font_name ) == 0 )
+ return TRUE;
+
+ /* Is font name a wildcard ""? */
+ if ( strcmp( rule_font_name, "" ) == 0 )
+ return TRUE;
+
+ /* Is font name contained in a class list? */
+ for ( i = 0; i < FAMILY_CLASS_RULES_SIZE; i++ )
+ {
+ if ( strcmp( FAMILY_CLASS_Rules[i].name, rule_font_name ) == 0 )
+ {
+ for ( j = 0; j < SPH_MAX_CLASS_MEMBERS; j++ )
+ {
+ if ( strcmp( FAMILY_CLASS_Rules[i].member[j], "" ) == 0 )
+ continue;
+ if ( strcmp( FAMILY_CLASS_Rules[i].member[j],
+ detected_font_name ) == 0 )
+ return TRUE;
+ }
+ }
+ }
+
+ return FALSE;
+ }
+
+
+ FT_LOCAL_DEF( FT_Bool )
+ is_member_of_style_class( const FT_String* detected_font_style,
+ const FT_String* rule_font_style )
+ {
+ FT_UInt i, j;
+
+
+ /* Does font style match rule style? */
+ if ( strcmp( detected_font_style, rule_font_style ) == 0 )
+ return TRUE;
+
+ /* Is font style a wildcard ""? */
+ if ( strcmp( rule_font_style, "" ) == 0 )
+ return TRUE;
+
+ /* Is font style contained in a class list? */
+ for ( i = 0; i < STYLE_CLASS_RULES_SIZE; i++ )
+ {
+ if ( strcmp( STYLE_CLASS_Rules[i].name, rule_font_style ) == 0 )
+ {
+ for ( j = 0; j < SPH_MAX_CLASS_MEMBERS; j++ )
+ {
+ if ( strcmp( STYLE_CLASS_Rules[i].member[j], "" ) == 0 )
+ continue;
+ if ( strcmp( STYLE_CLASS_Rules[i].member[j],
+ detected_font_style ) == 0 )
+ return TRUE;
+ }
+ }
+ }
+
+ return FALSE;
+ }
+
+
+ FT_LOCAL_DEF( FT_Bool )
+ sph_test_tweak( TT_Face face,
+ const FT_String* family,
+ FT_UInt ppem,
+ const FT_String* style,
+ FT_UInt glyph_index,
+ const SPH_TweakRule* rule,
+ FT_UInt num_rules )
+ {
+ FT_UInt i;
+
+
+ /* rule checks may be able to be optimized further */
+ for ( i = 0; i < num_rules; i++ )
+ {
+ if ( family &&
+ ( is_member_of_family_class ( family, rule[i].family ) ) )
+ if ( rule[i].ppem == 0 ||
+ rule[i].ppem == ppem )
+ if ( style &&
+ is_member_of_style_class ( style, rule[i].style ) )
+ if ( rule[i].glyph == 0 ||
+ FT_Get_Char_Index( (FT_Face)face,
+ rule[i].glyph ) == glyph_index )
+ return TRUE;
+ }
+
+ return FALSE;
+ }
+
+
+ static FT_UInt
+ scale_test_tweak( TT_Face face,
+ const FT_String* family,
+ FT_UInt ppem,
+ const FT_String* style,
+ FT_UInt glyph_index,
+ const SPH_ScaleRule* rule,
+ FT_UInt num_rules )
+ {
+ FT_UInt i;
+
+
+ /* rule checks may be able to be optimized further */
+ for ( i = 0; i < num_rules; i++ )
+ {
+ if ( family &&
+ ( is_member_of_family_class ( family, rule[i].family ) ) )
+ if ( rule[i].ppem == 0 ||
+ rule[i].ppem == ppem )
+ if ( style &&
+ is_member_of_style_class( style, rule[i].style ) )
+ if ( rule[i].glyph == 0 ||
+ FT_Get_Char_Index( (FT_Face)face,
+ rule[i].glyph ) == glyph_index )
+ return rule[i].scale;
+ }
+
+ return 1000;
+ }
+
+
+ FT_LOCAL_DEF( FT_UInt )
+ sph_test_tweak_x_scaling( TT_Face face,
+ const FT_String* family,
+ FT_UInt ppem,
+ const FT_String* style,
+ FT_UInt glyph_index )
+ {
+ return scale_test_tweak( face, family, ppem, style, glyph_index,
+ X_SCALING_Rules, X_SCALING_RULES_SIZE );
+ }
+
+
+#define TWEAK_RULES( x ) \
+ if ( sph_test_tweak( face, family, ppem, style, glyph_index, \
+ x##_Rules, x##_RULES_SIZE ) ) \
+ loader->exec->sph_tweak_flags |= SPH_TWEAK_##x;
+
+#define TWEAK_RULES_EXCEPTIONS( x ) \
+ if ( sph_test_tweak( face, family, ppem, style, glyph_index, \
+ x##_Rules_Exceptions, x##_RULES_EXCEPTIONS_SIZE ) ) \
+ loader->exec->sph_tweak_flags &= ~SPH_TWEAK_##x;
+
+
+ FT_LOCAL_DEF( void )
+ sph_set_tweaks( TT_Loader loader,
+ FT_UInt glyph_index )
+ {
+ TT_Face face = (TT_Face)loader->face;
+ FT_String* family = face->root.family_name;
+ int ppem = loader->size->metrics.x_ppem;
+ FT_String* style = face->root.style_name;
+
+
+ /* don't apply rules if style isn't set */
+ if ( !face->root.style_name )
+ return;
+
+#ifdef SPH_DEBUG_MORE_VERBOSE
+ printf( "%s,%d,%s,%c=%d ",
+ family, ppem, style, glyph_index, glyph_index );
+#endif
+
+ TWEAK_RULES( PIXEL_HINTING );
+
+ if ( loader->exec->sph_tweak_flags & SPH_TWEAK_PIXEL_HINTING )
+ {
+ loader->exec->ignore_x_mode = FALSE;
+ return;
+ }
+
+ TWEAK_RULES( ALLOW_X_DMOVE );
+ TWEAK_RULES( ALWAYS_DO_DELTAP );
+ TWEAK_RULES( ALWAYS_SKIP_DELTAP );
+ TWEAK_RULES( DEEMBOLDEN );
+ TWEAK_RULES( DO_SHPIX );
+ TWEAK_RULES( EMBOLDEN );
+ TWEAK_RULES( MIAP_HACK );
+ TWEAK_RULES( NORMAL_ROUND );
+ TWEAK_RULES( NO_ALIGNRP_AFTER_IUP );
+ TWEAK_RULES( NO_CALL_AFTER_IUP );
+ TWEAK_RULES( NO_DELTAP_AFTER_IUP );
+ TWEAK_RULES( RASTERIZER_35 );
+ TWEAK_RULES( SKIP_IUP );
+
+ TWEAK_RULES( SKIP_OFFPIXEL_Y_MOVES );
+ TWEAK_RULES_EXCEPTIONS( SKIP_OFFPIXEL_Y_MOVES );
+
+ TWEAK_RULES( SKIP_NONPIXEL_Y_MOVES_DELTAP );
+
+ TWEAK_RULES( SKIP_NONPIXEL_Y_MOVES );
+ TWEAK_RULES_EXCEPTIONS( SKIP_NONPIXEL_Y_MOVES );
+
+ TWEAK_RULES( ROUND_NONPIXEL_Y_MOVES );
+ TWEAK_RULES_EXCEPTIONS( ROUND_NONPIXEL_Y_MOVES );
+
+ if ( loader->exec->sph_tweak_flags & SPH_TWEAK_RASTERIZER_35 )
+ {
+ if ( loader->exec->rasterizer_version != TT_INTERPRETER_VERSION_35 )
+ {
+ loader->exec->rasterizer_version = TT_INTERPRETER_VERSION_35;
+ loader->exec->size->cvt_ready = FALSE;
+
+ tt_size_ready_bytecode(
+ loader->exec->size,
+ FT_BOOL( loader->load_flags & FT_LOAD_PEDANTIC ) );
+ }
+ else
+ loader->exec->rasterizer_version = TT_INTERPRETER_VERSION_35;
+ }
+ else
+ {
+ if ( loader->exec->rasterizer_version !=
+ SPH_OPTION_SET_RASTERIZER_VERSION )
+ {
+ loader->exec->rasterizer_version = SPH_OPTION_SET_RASTERIZER_VERSION;
+ loader->exec->size->cvt_ready = FALSE;
+
+ tt_size_ready_bytecode(
+ loader->exec->size,
+ FT_BOOL( loader->load_flags & FT_LOAD_PEDANTIC ) );
+ }
+ else
+ loader->exec->rasterizer_version = SPH_OPTION_SET_RASTERIZER_VERSION;
+ }
+
+ if ( IS_HINTED( loader->load_flags ) )
+ {
+ TWEAK_RULES( TIMES_NEW_ROMAN_HACK );
+ TWEAK_RULES( COURIER_NEW_2_HACK );
+ }
+
+ if ( sph_test_tweak( face, family, ppem, style, glyph_index,
+ COMPATIBILITY_MODE_Rules, COMPATIBILITY_MODE_RULES_SIZE ) )
+ loader->exec->face->sph_compatibility_mode = TRUE;
+
+
+ if ( IS_HINTED( loader->load_flags ) )
+ {
+ if ( sph_test_tweak( face, family, ppem, style, glyph_index,
+ COMPATIBLE_WIDTHS_Rules, COMPATIBLE_WIDTHS_RULES_SIZE ) )
+ loader->exec->compatible_widths |= TRUE;
+ }
+ }
+
+#else /* !TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+ /* ANSI C doesn't like empty source files */
+ typedef int _tt_subpix_dummy;
+
+#endif /* !TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttsubpix.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttsubpix.h
new file mode 100644
index 0000000000..b536c98ac9
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/truetype/ttsubpix.h
@@ -0,0 +1,110 @@
+/***************************************************************************/
+/* */
+/* ttsubpix.h */
+/* */
+/* TrueType Subpixel Hinting. */
+/* */
+/* Copyright 2010-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __TTSUBPIX_H__
+#define __TTSUBPIX_H__
+
+#include "../../include/ft2build.h"
+#include "ttobjs.h"
+#include "ttinterp.h"
+
+
+FT_BEGIN_HEADER
+
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+
+ /*************************************************************************/
+ /* */
+ /* ID flags to identify special functions at FDEF and runtime. */
+ /* */
+ /* */
+#define SPH_FDEF_INLINE_DELTA_1 0x0000001
+#define SPH_FDEF_INLINE_DELTA_2 0x0000002
+#define SPH_FDEF_DIAGONAL_STROKE 0x0000004
+#define SPH_FDEF_VACUFORM_ROUND_1 0x0000008
+#define SPH_FDEF_TTFAUTOHINT_1 0x0000010
+#define SPH_FDEF_SPACING_1 0x0000020
+#define SPH_FDEF_SPACING_2 0x0000040
+#define SPH_FDEF_TYPEMAN_STROKES 0x0000080
+#define SPH_FDEF_TYPEMAN_DIAGENDCTRL 0x0000100
+
+
+ /*************************************************************************/
+ /* */
+ /* Tweak flags that are set for each glyph by the below rules. */
+ /* */
+ /* */
+#define SPH_TWEAK_ALLOW_X_DMOVE 0x0000001
+#define SPH_TWEAK_ALWAYS_DO_DELTAP 0x0000002
+#define SPH_TWEAK_ALWAYS_SKIP_DELTAP 0x0000004
+#define SPH_TWEAK_COURIER_NEW_2_HACK 0x0000008
+#define SPH_TWEAK_DEEMBOLDEN 0x0000010
+#define SPH_TWEAK_DO_SHPIX 0x0000020
+#define SPH_TWEAK_EMBOLDEN 0x0000040
+#define SPH_TWEAK_MIAP_HACK 0x0000080
+#define SPH_TWEAK_NORMAL_ROUND 0x0000100
+#define SPH_TWEAK_NO_ALIGNRP_AFTER_IUP 0x0000200
+#define SPH_TWEAK_NO_CALL_AFTER_IUP 0x0000400
+#define SPH_TWEAK_NO_DELTAP_AFTER_IUP 0x0000800
+#define SPH_TWEAK_PIXEL_HINTING 0x0001000
+#define SPH_TWEAK_RASTERIZER_35 0x0002000
+#define SPH_TWEAK_ROUND_NONPIXEL_Y_MOVES 0x0004000
+#define SPH_TWEAK_SKIP_IUP 0x0008000
+#define SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES 0x0010000
+#define SPH_TWEAK_SKIP_OFFPIXEL_Y_MOVES 0x0020000
+#define SPH_TWEAK_TIMES_NEW_ROMAN_HACK 0x0040000
+#define SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES_DELTAP 0x0080000
+
+
+ FT_LOCAL( FT_Bool )
+ sph_test_tweak( TT_Face face,
+ const FT_String* family,
+ FT_UInt ppem,
+ const FT_String* style,
+ FT_UInt glyph_index,
+ const SPH_TweakRule* rule,
+ FT_UInt num_rules );
+
+ FT_LOCAL( FT_UInt )
+ sph_test_tweak_x_scaling( TT_Face face,
+ const FT_String* family,
+ FT_UInt ppem,
+ const FT_String* style,
+ FT_UInt glyph_index );
+
+ FT_LOCAL( void )
+ sph_set_tweaks( TT_Loader loader,
+ FT_UInt glyph_index );
+
+
+ /* These macros are defined absent a method for setting them */
+#define SPH_OPTION_BITMAP_WIDTHS FALSE
+#define SPH_OPTION_SET_SUBPIXEL TRUE
+#define SPH_OPTION_SET_GRAYSCALE FALSE
+#define SPH_OPTION_SET_COMPATIBLE_WIDTHS FALSE
+#define SPH_OPTION_SET_RASTERIZER_VERSION 38
+
+#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+
+
+FT_END_HEADER
+
+#endif /* __TTSUBPIX_H__ */
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/Jamfile b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/Jamfile
new file mode 100644
index 0000000000..8e366baae5
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/Jamfile
@@ -0,0 +1,29 @@
+# FreeType 2 src/type1 Jamfile
+#
+# Copyright 2001 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT. By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+SubDir FT2_TOP $(FT2_SRC_DIR) type1 ;
+
+{
+ local _sources ;
+
+ if $(FT2_MULTI)
+ {
+ _sources = t1afm t1driver t1objs t1load t1gload t1parse ;
+ }
+ else
+ {
+ _sources = type1 ;
+ }
+
+ Library $(FT2_LIB) : $(_sources).c ;
+}
+
+# end of src/type1 Jamfile
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/fxft_type1.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/fxft_type1.c
new file mode 100644
index 0000000000..00c85e1dfc
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/fxft_type1.c
@@ -0,0 +1,37 @@
+#if !defined(_FXFT_VERSION_) || _FXFT_VERSION_ == 2501
+/***************************************************************************/
+/* */
+/* type1.c */
+/* */
+/* FreeType Type 1 driver component (body only). */
+/* */
+/* Copyright 1996-2001 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#define FT_MAKE_OPTION_SINGLE_OBJECT
+#define FT2_BUILD_LIBRARY
+
+#include "../../include/ft2build.h"
+#include "t1parse.c"
+#include "t1load.c"
+#include "t1objs.c"
+#include "t1driver.c"
+#include "t1gload.c"
+
+#ifndef T1_CONFIG_OPTION_NO_AFM
+#include "t1afm.c"
+#endif
+
+
+/* END */
+#endif
+
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/module.mk b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/module.mk
new file mode 100644
index 0000000000..ade0210d76
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/module.mk
@@ -0,0 +1,23 @@
+#
+# FreeType 2 Type1 module definition
+#
+
+
+# Copyright 1996-2000, 2006 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT. By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+
+FTMODULE_H_COMMANDS += TYPE1_DRIVER
+
+define TYPE1_DRIVER
+$(OPEN_DRIVER) FT_Driver_ClassRec, t1_driver_class $(CLOSE_DRIVER)
+$(ECHO_DRIVER)type1 $(ECHO_DRIVER_DESC)Postscript font files with extension *.pfa or *.pfb$(ECHO_DRIVER_DONE)
+endef
+
+# EOF
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/rules.mk b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/rules.mk
new file mode 100644
index 0000000000..15087b0304
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/rules.mk
@@ -0,0 +1,73 @@
+#
+# FreeType 2 Type1 driver configuration rules
+#
+
+
+# Copyright 1996-2000, 2001, 2003 by
+# David Turner, Robert Wilhelm, and Werner Lemberg.
+#
+# This file is part of the FreeType project, and may only be used, modified,
+# and distributed under the terms of the FreeType project license,
+# LICENSE.TXT. By continuing to use, modify, or distribute this file you
+# indicate that you have read the license and understand and accept it
+# fully.
+
+
+# Type1 driver directory
+#
+T1_DIR := $(SRC_DIR)/type1
+
+
+# compilation flags for the driver
+#
+T1_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(T1_DIR))
+
+
+# Type1 driver sources (i.e., C files)
+#
+T1_DRV_SRC := $(T1_DIR)/t1parse.c \
+ $(T1_DIR)/t1load.c \
+ $(T1_DIR)/t1driver.c \
+ $(T1_DIR)/t1afm.c \
+ $(T1_DIR)/t1gload.c \
+ $(T1_DIR)/t1objs.c
+
+# Type1 driver headers
+#
+T1_DRV_H := $(T1_DRV_SRC:%.c=%.h) \
+ $(T1_DIR)/t1tokens.h \
+ $(T1_DIR)/t1errors.h
+
+
+# Type1 driver object(s)
+#
+# T1_DRV_OBJ_M is used during `multi' builds
+# T1_DRV_OBJ_S is used during `single' builds
+#
+T1_DRV_OBJ_M := $(T1_DRV_SRC:$(T1_DIR)/%.c=$(OBJ_DIR)/%.$O)
+T1_DRV_OBJ_S := $(OBJ_DIR)/type1.$O
+
+# Type1 driver source file for single build
+#
+T1_DRV_SRC_S := $(T1_DIR)/type1.c
+
+
+# Type1 driver - single object
+#
+$(T1_DRV_OBJ_S): $(T1_DRV_SRC_S) $(T1_DRV_SRC) $(FREETYPE_H) $(T1_DRV_H)
+ $(T1_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(T1_DRV_SRC_S))
+
+
+# Type1 driver - multiple objects
+#
+$(OBJ_DIR)/%.$O: $(T1_DIR)/%.c $(FREETYPE_H) $(T1_DRV_H)
+ $(T1_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)
+
+
+# update main driver object lists
+#
+DRV_OBJS_S += $(T1_DRV_OBJ_S)
+DRV_OBJS_M += $(T1_DRV_OBJ_M)
+
+
+# EOF
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1afm.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1afm.c
new file mode 100644
index 0000000000..b59225508e
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1afm.c
@@ -0,0 +1,396 @@
+/***************************************************************************/
+/* */
+/* t1afm.c */
+/* */
+/* AFM support for Type 1 fonts (body). */
+/* */
+/* Copyright 1996-2011, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "t1afm.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/internal/psaux.h"
+#include "t1errors.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_t1afm
+
+
+ FT_LOCAL_DEF( void )
+ T1_Done_Metrics( FT_Memory memory,
+ AFM_FontInfo fi )
+ {
+ FT_FREE( fi->KernPairs );
+ fi->NumKernPair = 0;
+
+ FT_FREE( fi->TrackKerns );
+ fi->NumTrackKern = 0;
+
+ FT_FREE( fi );
+ }
+
+
+ /* read a glyph name and return the equivalent glyph index */
+ static FT_Int
+ t1_get_index( const char* name,
+ FT_Offset len,
+ void* user_data )
+ {
+ T1_Font type1 = (T1_Font)user_data;
+ FT_Int n;
+
+
+ /* PS string/name length must be < 16-bit */
+ if ( len > 0xFFFFU )
+ return 0;
+
+ for ( n = 0; n < type1->num_glyphs; n++ )
+ {
+ char* gname = (char*)type1->glyph_names[n];
+
+
+ if ( gname && gname[0] == name[0] &&
+ ft_strlen( gname ) == len &&
+ ft_strncmp( gname, name, len ) == 0 )
+ return n;
+ }
+
+ return 0;
+ }
+
+
+#undef KERN_INDEX
+#define KERN_INDEX( g1, g2 ) ( ( (FT_ULong)(g1) << 16 ) | (g2) )
+
+
+ /* compare two kerning pairs */
+ FT_CALLBACK_DEF( int )
+ compare_kern_pairs( const void* a,
+ const void* b )
+ {
+ AFM_KernPair pair1 = (AFM_KernPair)a;
+ AFM_KernPair pair2 = (AFM_KernPair)b;
+
+ FT_ULong index1 = KERN_INDEX( pair1->index1, pair1->index2 );
+ FT_ULong index2 = KERN_INDEX( pair2->index1, pair2->index2 );
+
+
+ if ( index1 > index2 )
+ return 1;
+ else if ( index1 < index2 )
+ return -1;
+ else
+ return 0;
+ }
+
+
+ /* parse a PFM file -- for now, only read the kerning pairs */
+ static FT_Error
+ T1_Read_PFM( FT_Face t1_face,
+ FT_Stream stream,
+ AFM_FontInfo fi )
+ {
+ FT_Error error = FT_Err_Ok;
+ FT_Memory memory = stream->memory;
+ FT_Byte* start;
+ FT_Byte* limit;
+ FT_Byte* p;
+ AFM_KernPair kp;
+ FT_Int width_table_length;
+ FT_CharMap oldcharmap;
+ FT_CharMap charmap;
+ FT_Int n;
+
+
+ start = (FT_Byte*)stream->cursor;
+ limit = (FT_Byte*)stream->limit;
+
+ /* Figure out how long the width table is. */
+ /* This info is a little-endian short at offset 99. */
+ p = start + 99;
+ if ( p + 2 > limit )
+ {
+ error = FT_THROW( Unknown_File_Format );
+ goto Exit;
+ }
+ width_table_length = FT_PEEK_USHORT_LE( p );
+
+ p += 18 + width_table_length;
+ if ( p + 0x12 > limit || FT_PEEK_USHORT_LE( p ) < 0x12 )
+ /* extension table is probably optional */
+ goto Exit;
+
+ /* Kerning offset is 14 bytes from start of extensions table. */
+ p += 14;
+ p = start + FT_PEEK_ULONG_LE( p );
+
+ if ( p == start )
+ /* zero offset means no table */
+ goto Exit;
+
+ if ( p + 2 > limit )
+ {
+ error = FT_THROW( Unknown_File_Format );
+ goto Exit;
+ }
+
+ fi->NumKernPair = FT_PEEK_USHORT_LE( p );
+ p += 2;
+ if ( p + 4 * fi->NumKernPair > limit )
+ {
+ error = FT_THROW( Unknown_File_Format );
+ goto Exit;
+ }
+
+ /* Actually, kerning pairs are simply optional! */
+ if ( fi->NumKernPair == 0 )
+ goto Exit;
+
+ /* allocate the pairs */
+ if ( FT_QNEW_ARRAY( fi->KernPairs, fi->NumKernPair ) )
+ goto Exit;
+
+ /* now, read each kern pair */
+ kp = fi->KernPairs;
+ limit = p + 4 * fi->NumKernPair;
+
+ /* PFM kerning data are stored by encoding rather than glyph index, */
+ /* so find the PostScript charmap of this font and install it */
+ /* temporarily. If we find no PostScript charmap, then just use */
+ /* the default and hope it is the right one. */
+ oldcharmap = t1_face->charmap;
+ charmap = NULL;
+
+ for ( n = 0; n < t1_face->num_charmaps; n++ )
+ {
+ charmap = t1_face->charmaps[n];
+ /* check against PostScript pseudo platform */
+ if ( charmap->platform_id == 7 )
+ {
+ error = FT_Set_Charmap( t1_face, charmap );
+ if ( error )
+ goto Exit;
+ break;
+ }
+ }
+
+ /* Kerning info is stored as: */
+ /* */
+ /* encoding of first glyph (1 byte) */
+ /* encoding of second glyph (1 byte) */
+ /* offset (little-endian short) */
+ for ( ; p < limit ; p += 4 )
+ {
+ kp->index1 = FT_Get_Char_Index( t1_face, p[0] );
+ kp->index2 = FT_Get_Char_Index( t1_face, p[1] );
+
+ kp->x = (FT_Int)FT_PEEK_SHORT_LE(p + 2);
+ kp->y = 0;
+
+ kp++;
+ }
+
+ if ( oldcharmap != NULL )
+ error = FT_Set_Charmap( t1_face, oldcharmap );
+ if ( error )
+ goto Exit;
+
+ /* now, sort the kern pairs according to their glyph indices */
+ ft_qsort( fi->KernPairs, fi->NumKernPair, sizeof ( AFM_KernPairRec ),
+ compare_kern_pairs );
+
+ Exit:
+ if ( error )
+ {
+ FT_FREE( fi->KernPairs );
+ fi->NumKernPair = 0;
+ }
+
+ return error;
+ }
+
+
+ /* parse a metrics file -- either AFM or PFM depending on what */
+ /* it turns out to be */
+ FT_LOCAL_DEF( FT_Error )
+ T1_Read_Metrics( FT_Face t1_face,
+ FT_Stream stream )
+ {
+ PSAux_Service psaux;
+ FT_Memory memory = stream->memory;
+ AFM_ParserRec parser;
+ AFM_FontInfo fi = NULL;
+ FT_Error error = FT_ERR( Unknown_File_Format );
+ T1_Font t1_font = &( (T1_Face)t1_face )->type1;
+
+
+ if ( FT_NEW( fi ) ||
+ FT_FRAME_ENTER( stream->size ) )
+ goto Exit;
+
+ fi->FontBBox = t1_font->font_bbox;
+ fi->Ascender = t1_font->font_bbox.yMax;
+ fi->Descender = t1_font->font_bbox.yMin;
+
+ psaux = (PSAux_Service)( (T1_Face)t1_face )->psaux;
+ if ( psaux->afm_parser_funcs )
+ {
+ error = psaux->afm_parser_funcs->init( &parser,
+ stream->memory,
+ stream->cursor,
+ stream->limit );
+
+ if ( !error )
+ {
+ parser.FontInfo = fi;
+ parser.get_index = t1_get_index;
+ parser.user_data = t1_font;
+
+ error = psaux->afm_parser_funcs->parse( &parser );
+ psaux->afm_parser_funcs->done( &parser );
+ }
+ }
+
+ if ( FT_ERR_EQ( error, Unknown_File_Format ) )
+ {
+ FT_Byte* start = stream->cursor;
+
+
+ /* MS Windows allows versions up to 0x3FF without complaining */
+ if ( stream->size > 6 &&
+ start[1] < 4 &&
+ FT_PEEK_ULONG_LE( start + 2 ) == stream->size )
+ error = T1_Read_PFM( t1_face, stream, fi );
+ }
+
+ if ( !error )
+ {
+ t1_font->font_bbox = fi->FontBBox;
+
+ t1_face->bbox.xMin = fi->FontBBox.xMin >> 16;
+ t1_face->bbox.yMin = fi->FontBBox.yMin >> 16;
+ /* no `U' suffix here to 0xFFFF! */
+ t1_face->bbox.xMax = ( fi->FontBBox.xMax + 0xFFFF ) >> 16;
+ t1_face->bbox.yMax = ( fi->FontBBox.yMax + 0xFFFF ) >> 16;
+
+ /* no `U' suffix here to 0x8000! */
+ t1_face->ascender = (FT_Short)( ( fi->Ascender + 0x8000 ) >> 16 );
+ t1_face->descender = (FT_Short)( ( fi->Descender + 0x8000 ) >> 16 );
+
+ if ( fi->NumKernPair )
+ {
+ t1_face->face_flags |= FT_FACE_FLAG_KERNING;
+ ( (T1_Face)t1_face )->afm_data = fi;
+ fi = NULL;
+ }
+ }
+
+ FT_FRAME_EXIT();
+
+ Exit:
+ if ( fi != NULL )
+ T1_Done_Metrics( memory, fi );
+
+ return error;
+ }
+
+
+ /* find the kerning for a given glyph pair */
+ FT_LOCAL_DEF( void )
+ T1_Get_Kerning( AFM_FontInfo fi,
+ FT_UInt glyph1,
+ FT_UInt glyph2,
+ FT_Vector* kerning )
+ {
+ AFM_KernPair min, mid, max;
+ FT_ULong idx = KERN_INDEX( glyph1, glyph2 );
+
+
+ /* simple binary search */
+ min = fi->KernPairs;
+ max = min + fi->NumKernPair - 1;
+
+ while ( min <= max )
+ {
+ FT_ULong midi;
+
+
+ mid = min + ( max - min ) / 2;
+ midi = KERN_INDEX( mid->index1, mid->index2 );
+
+ if ( midi == idx )
+ {
+ kerning->x = mid->x;
+ kerning->y = mid->y;
+
+ return;
+ }
+
+ if ( midi < idx )
+ min = mid + 1;
+ else
+ max = mid - 1;
+ }
+
+ kerning->x = 0;
+ kerning->y = 0;
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ T1_Get_Track_Kerning( FT_Face face,
+ FT_Fixed ptsize,
+ FT_Int degree,
+ FT_Fixed* kerning )
+ {
+ AFM_FontInfo fi = (AFM_FontInfo)( (T1_Face)face )->afm_data;
+ FT_Int i;
+
+
+ if ( !fi )
+ return FT_THROW( Invalid_Argument );
+
+ for ( i = 0; i < fi->NumTrackKern; i++ )
+ {
+ AFM_TrackKern tk = fi->TrackKerns + i;
+
+
+ if ( tk->degree != degree )
+ continue;
+
+ if ( ptsize < tk->min_ptsize )
+ *kerning = tk->min_kern;
+ else if ( ptsize > tk->max_ptsize )
+ *kerning = tk->max_kern;
+ else
+ {
+ *kerning = FT_MulDiv( ptsize - tk->min_ptsize,
+ tk->max_kern - tk->min_kern,
+ tk->max_ptsize - tk->min_ptsize ) +
+ tk->min_kern;
+ }
+ }
+
+ return FT_Err_Ok;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1afm.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1afm.h
new file mode 100644
index 0000000000..60c3aa4cdc
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1afm.h
@@ -0,0 +1,54 @@
+/***************************************************************************/
+/* */
+/* t1afm.h */
+/* */
+/* AFM support for Type 1 fonts (specification). */
+/* */
+/* Copyright 1996-2001, 2002, 2006 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __T1AFM_H__
+#define __T1AFM_H__
+
+#include "../../include/ft2build.h"
+#include "t1objs.h"
+#include "../../include/freetype/internal/t1types.h"
+
+FT_BEGIN_HEADER
+
+
+ FT_LOCAL( FT_Error )
+ T1_Read_Metrics( FT_Face face,
+ FT_Stream stream );
+
+ FT_LOCAL( void )
+ T1_Done_Metrics( FT_Memory memory,
+ AFM_FontInfo fi );
+
+ FT_LOCAL( void )
+ T1_Get_Kerning( AFM_FontInfo fi,
+ FT_UInt glyph1,
+ FT_UInt glyph2,
+ FT_Vector* kerning );
+
+ FT_LOCAL( FT_Error )
+ T1_Get_Track_Kerning( FT_Face face,
+ FT_Fixed ptsize,
+ FT_Int degree,
+ FT_Fixed* kerning );
+
+FT_END_HEADER
+
+#endif /* __T1AFM_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1driver.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1driver.c
new file mode 100644
index 0000000000..8885862716
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1driver.c
@@ -0,0 +1,726 @@
+/***************************************************************************/
+/* */
+/* t1driver.c */
+/* */
+/* Type 1 driver interface (body). */
+/* */
+/* Copyright 1996-2004, 2006, 2007, 2009, 2011, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "t1driver.h"
+#include "t1gload.h"
+#include "t1load.h"
+
+#include "t1errors.h"
+
+#ifndef T1_CONFIG_OPTION_NO_AFM
+#include "t1afm.h"
+#endif
+
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftstream.h"
+
+#include "../../include/freetype/internal/services/svmm.h"
+#include "../../include/freetype/internal/services/svgldict.h"
+#include "../../include/freetype/internal/services/svxf86nm.h"
+#include "../../include/freetype/internal/services/svpostnm.h"
+#include "../../include/freetype/internal/services/svpscmap.h"
+#include "../../include/freetype/internal/services/svpsinfo.h"
+#include "../../include/freetype/internal/services/svkern.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_t1driver
+
+ /*
+ * GLYPH DICT SERVICE
+ *
+ */
+
+ static FT_Error
+ t1_get_glyph_name( T1_Face face,
+ FT_UInt glyph_index,
+ FT_Pointer buffer,
+ FT_UInt buffer_max )
+ {
+ FT_STRCPYN( buffer, face->type1.glyph_names[glyph_index], buffer_max );
+
+ return FT_Err_Ok;
+ }
+
+
+ static FT_UInt
+ t1_get_name_index( T1_Face face,
+ FT_String* glyph_name )
+ {
+ FT_Int i;
+
+
+ for ( i = 0; i < face->type1.num_glyphs; i++ )
+ {
+ FT_String* gname = face->type1.glyph_names[i];
+
+
+ if ( !ft_strcmp( glyph_name, gname ) )
+ return (FT_UInt)i;
+ }
+
+ return 0;
+ }
+
+
+ static const FT_Service_GlyphDictRec t1_service_glyph_dict =
+ {
+ (FT_GlyphDict_GetNameFunc) t1_get_glyph_name,
+ (FT_GlyphDict_NameIndexFunc)t1_get_name_index
+ };
+
+
+ /*
+ * POSTSCRIPT NAME SERVICE
+ *
+ */
+
+ static const char*
+ t1_get_ps_name( T1_Face face )
+ {
+ return (const char*) face->type1.font_name;
+ }
+
+
+ static const FT_Service_PsFontNameRec t1_service_ps_name =
+ {
+ (FT_PsName_GetFunc)t1_get_ps_name
+ };
+
+
+ /*
+ * MULTIPLE MASTERS SERVICE
+ *
+ */
+
+#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT
+ static const FT_Service_MultiMastersRec t1_service_multi_masters =
+ {
+ (FT_Get_MM_Func) T1_Get_Multi_Master,
+ (FT_Set_MM_Design_Func) T1_Set_MM_Design,
+ (FT_Set_MM_Blend_Func) T1_Set_MM_Blend,
+ (FT_Get_MM_Var_Func) T1_Get_MM_Var,
+ (FT_Set_Var_Design_Func)T1_Set_Var_Design
+ };
+#endif
+
+
+ /*
+ * POSTSCRIPT INFO SERVICE
+ *
+ */
+
+ static FT_Error
+ t1_ps_get_font_info( FT_Face face,
+ PS_FontInfoRec* afont_info )
+ {
+ *afont_info = ((T1_Face)face)->type1.font_info;
+
+ return FT_Err_Ok;
+ }
+
+
+ static FT_Error
+ t1_ps_get_font_extra( FT_Face face,
+ PS_FontExtraRec* afont_extra )
+ {
+ *afont_extra = ((T1_Face)face)->type1.font_extra;
+
+ return FT_Err_Ok;
+ }
+
+
+ static FT_Int
+ t1_ps_has_glyph_names( FT_Face face )
+ {
+ FT_UNUSED( face );
+
+ return 1;
+ }
+
+
+ static FT_Error
+ t1_ps_get_font_private( FT_Face face,
+ PS_PrivateRec* afont_private )
+ {
+ *afont_private = ((T1_Face)face)->type1.private_dict;
+
+ return FT_Err_Ok;
+ }
+
+
+ static FT_Long
+ t1_ps_get_font_value( FT_Face face,
+ PS_Dict_Keys key,
+ FT_UInt idx,
+ void *value,
+ FT_Long value_len )
+ {
+ FT_Long retval = -1;
+ T1_Face t1face = (T1_Face)face;
+ T1_Font type1 = &t1face->type1;
+
+
+ switch ( key )
+ {
+ case PS_DICT_FONT_TYPE:
+ retval = sizeof ( type1->font_type );
+ if ( value && value_len >= retval )
+ *((FT_Byte *)value) = type1->font_type;
+ break;
+
+ case PS_DICT_FONT_MATRIX:
+ if ( idx < sizeof ( type1->font_matrix ) /
+ sizeof ( type1->font_matrix.xx ) )
+ {
+ FT_Fixed val = 0;
+
+
+ retval = sizeof ( val );
+ if ( value && value_len >= retval )
+ {
+ switch ( idx )
+ {
+ case 0:
+ val = type1->font_matrix.xx;
+ break;
+ case 1:
+ val = type1->font_matrix.xy;
+ break;
+ case 2:
+ val = type1->font_matrix.yx;
+ break;
+ case 3:
+ val = type1->font_matrix.yy;
+ break;
+ }
+ *((FT_Fixed *)value) = val;
+ }
+ }
+ break;
+
+ case PS_DICT_FONT_BBOX:
+ if ( idx < sizeof ( type1->font_bbox ) /
+ sizeof ( type1->font_bbox.xMin ) )
+ {
+ FT_Fixed val = 0;
+
+
+ retval = sizeof ( val );
+ if ( value && value_len >= retval )
+ {
+ switch ( idx )
+ {
+ case 0:
+ val = type1->font_bbox.xMin;
+ break;
+ case 1:
+ val = type1->font_bbox.yMin;
+ break;
+ case 2:
+ val = type1->font_bbox.xMax;
+ break;
+ case 3:
+ val = type1->font_bbox.yMax;
+ break;
+ }
+ *((FT_Fixed *)value) = val;
+ }
+ }
+ break;
+
+ case PS_DICT_PAINT_TYPE:
+ retval = sizeof ( type1->paint_type );
+ if ( value && value_len >= retval )
+ *((FT_Byte *)value) = type1->paint_type;
+ break;
+
+ case PS_DICT_FONT_NAME:
+ retval = (FT_Long)( ft_strlen( type1->font_name ) + 1 );
+ if ( value && value_len >= retval )
+ ft_memcpy( value, (void *)( type1->font_name ), retval );
+ break;
+
+ case PS_DICT_UNIQUE_ID:
+ retval = sizeof ( type1->private_dict.unique_id );
+ if ( value && value_len >= retval )
+ *((FT_Int *)value) = type1->private_dict.unique_id;
+ break;
+
+ case PS_DICT_NUM_CHAR_STRINGS:
+ retval = sizeof ( type1->num_glyphs );
+ if ( value && value_len >= retval )
+ *((FT_Int *)value) = type1->num_glyphs;
+ break;
+
+ case PS_DICT_CHAR_STRING_KEY:
+ if ( idx < (FT_UInt)type1->num_glyphs )
+ {
+ retval = (FT_Long)( ft_strlen( type1->glyph_names[idx] ) + 1 );
+ if ( value && value_len >= retval )
+ {
+ ft_memcpy( value, (void *)( type1->glyph_names[idx] ), retval );
+ ((FT_Char *)value)[retval - 1] = (FT_Char)'\0';
+ }
+ }
+ break;
+
+ case PS_DICT_CHAR_STRING:
+ if ( idx < (FT_UInt)type1->num_glyphs )
+ {
+ retval = (FT_Long)( type1->charstrings_len[idx] + 1 );
+ if ( value && value_len >= retval )
+ {
+ ft_memcpy( value, (void *)( type1->charstrings[idx] ),
+ retval - 1 );
+ ((FT_Char *)value)[retval - 1] = (FT_Char)'\0';
+ }
+ }
+ break;
+
+ case PS_DICT_ENCODING_TYPE:
+ retval = sizeof ( type1->encoding_type );
+ if ( value && value_len >= retval )
+ *((T1_EncodingType *)value) = type1->encoding_type;
+ break;
+
+ case PS_DICT_ENCODING_ENTRY:
+ if ( type1->encoding_type == T1_ENCODING_TYPE_ARRAY &&
+ idx < (FT_UInt)type1->encoding.num_chars )
+ {
+ retval = (FT_Long)( ft_strlen( type1->encoding.char_name[idx] ) + 1 );
+ if ( value && value_len >= retval )
+ {
+ ft_memcpy( value, (void *)( type1->encoding.char_name[idx] ),
+ retval - 1 );
+ ((FT_Char *)value)[retval - 1] = (FT_Char)'\0';
+ }
+ }
+ break;
+
+ case PS_DICT_NUM_SUBRS:
+ retval = sizeof ( type1->num_subrs );
+ if ( value && value_len >= retval )
+ *((FT_Int *)value) = type1->num_subrs;
+ break;
+
+ case PS_DICT_SUBR:
+ if ( idx < (FT_UInt)type1->num_subrs )
+ {
+ retval = (FT_Long)( type1->subrs_len[idx] + 1 );
+ if ( value && value_len >= retval )
+ {
+ ft_memcpy( value, (void *)( type1->subrs[idx] ), retval - 1 );
+ ((FT_Char *)value)[retval - 1] = (FT_Char)'\0';
+ }
+ }
+ break;
+
+ case PS_DICT_STD_HW:
+ retval = sizeof ( type1->private_dict.standard_width[0] );
+ if ( value && value_len >= retval )
+ *((FT_UShort *)value) = type1->private_dict.standard_width[0];
+ break;
+
+ case PS_DICT_STD_VW:
+ retval = sizeof ( type1->private_dict.standard_height[0] );
+ if ( value && value_len >= retval )
+ *((FT_UShort *)value) = type1->private_dict.standard_height[0];
+ break;
+
+ case PS_DICT_NUM_BLUE_VALUES:
+ retval = sizeof ( type1->private_dict.num_blue_values );
+ if ( value && value_len >= retval )
+ *((FT_Byte *)value) = type1->private_dict.num_blue_values;
+ break;
+
+ case PS_DICT_BLUE_VALUE:
+ if ( idx < type1->private_dict.num_blue_values )
+ {
+ retval = sizeof ( type1->private_dict.blue_values[idx] );
+ if ( value && value_len >= retval )
+ *((FT_Short *)value) = type1->private_dict.blue_values[idx];
+ }
+ break;
+
+ case PS_DICT_BLUE_SCALE:
+ retval = sizeof ( type1->private_dict.blue_scale );
+ if ( value && value_len >= retval )
+ *((FT_Fixed *)value) = type1->private_dict.blue_scale;
+ break;
+
+ case PS_DICT_BLUE_FUZZ:
+ retval = sizeof ( type1->private_dict.blue_fuzz );
+ if ( value && value_len >= retval )
+ *((FT_Int *)value) = type1->private_dict.blue_fuzz;
+ break;
+
+ case PS_DICT_BLUE_SHIFT:
+ retval = sizeof ( type1->private_dict.blue_shift );
+ if ( value && value_len >= retval )
+ *((FT_Int *)value) = type1->private_dict.blue_shift;
+ break;
+
+ case PS_DICT_NUM_OTHER_BLUES:
+ retval = sizeof ( type1->private_dict.num_other_blues );
+ if ( value && value_len >= retval )
+ *((FT_Byte *)value) = type1->private_dict.num_other_blues;
+ break;
+
+ case PS_DICT_OTHER_BLUE:
+ if ( idx < type1->private_dict.num_other_blues )
+ {
+ retval = sizeof ( type1->private_dict.other_blues[idx] );
+ if ( value && value_len >= retval )
+ *((FT_Short *)value) = type1->private_dict.other_blues[idx];
+ }
+ break;
+
+ case PS_DICT_NUM_FAMILY_BLUES:
+ retval = sizeof ( type1->private_dict.num_family_blues );
+ if ( value && value_len >= retval )
+ *((FT_Byte *)value) = type1->private_dict.num_family_blues;
+ break;
+
+ case PS_DICT_FAMILY_BLUE:
+ if ( idx < type1->private_dict.num_family_blues )
+ {
+ retval = sizeof ( type1->private_dict.family_blues[idx] );
+ if ( value && value_len >= retval )
+ *((FT_Short *)value) = type1->private_dict.family_blues[idx];
+ }
+ break;
+
+ case PS_DICT_NUM_FAMILY_OTHER_BLUES:
+ retval = sizeof ( type1->private_dict.num_family_other_blues );
+ if ( value && value_len >= retval )
+ *((FT_Byte *)value) = type1->private_dict.num_family_other_blues;
+ break;
+
+ case PS_DICT_FAMILY_OTHER_BLUE:
+ if ( idx < type1->private_dict.num_family_other_blues )
+ {
+ retval = sizeof ( type1->private_dict.family_other_blues[idx] );
+ if ( value && value_len >= retval )
+ *((FT_Short *)value) = type1->private_dict.family_other_blues[idx];
+ }
+ break;
+
+ case PS_DICT_NUM_STEM_SNAP_H:
+ retval = sizeof ( type1->private_dict.num_snap_widths );
+ if ( value && value_len >= retval )
+ *((FT_Byte *)value) = type1->private_dict.num_snap_widths;
+ break;
+
+ case PS_DICT_STEM_SNAP_H:
+ if ( idx < type1->private_dict.num_snap_widths )
+ {
+ retval = sizeof ( type1->private_dict.snap_widths[idx] );
+ if ( value && value_len >= retval )
+ *((FT_Short *)value) = type1->private_dict.snap_widths[idx];
+ }
+ break;
+
+ case PS_DICT_NUM_STEM_SNAP_V:
+ retval = sizeof ( type1->private_dict.num_snap_heights );
+ if ( value && value_len >= retval )
+ *((FT_Byte *)value) = type1->private_dict.num_snap_heights;
+ break;
+
+ case PS_DICT_STEM_SNAP_V:
+ if ( idx < type1->private_dict.num_snap_heights )
+ {
+ retval = sizeof ( type1->private_dict.snap_heights[idx] );
+ if ( value && value_len >= retval )
+ *((FT_Short *)value) = type1->private_dict.snap_heights[idx];
+ }
+ break;
+
+ case PS_DICT_RND_STEM_UP:
+ retval = sizeof ( type1->private_dict.round_stem_up );
+ if ( value && value_len >= retval )
+ *((FT_Bool *)value) = type1->private_dict.round_stem_up;
+ break;
+
+ case PS_DICT_FORCE_BOLD:
+ retval = sizeof ( type1->private_dict.force_bold );
+ if ( value && value_len >= retval )
+ *((FT_Bool *)value) = type1->private_dict.force_bold;
+ break;
+
+ case PS_DICT_MIN_FEATURE:
+ if ( idx < sizeof ( type1->private_dict.min_feature ) /
+ sizeof ( type1->private_dict.min_feature[0] ) )
+ {
+ retval = sizeof ( type1->private_dict.min_feature[idx] );
+ if ( value && value_len >= retval )
+ *((FT_Short *)value) = type1->private_dict.min_feature[idx];
+ }
+ break;
+
+ case PS_DICT_LEN_IV:
+ retval = sizeof ( type1->private_dict.lenIV );
+ if ( value && value_len >= retval )
+ *((FT_Int *)value) = type1->private_dict.lenIV;
+ break;
+
+ case PS_DICT_PASSWORD:
+ retval = sizeof ( type1->private_dict.password );
+ if ( value && value_len >= retval )
+ *((FT_Long *)value) = type1->private_dict.password;
+ break;
+
+ case PS_DICT_LANGUAGE_GROUP:
+ retval = sizeof ( type1->private_dict.language_group );
+ if ( value && value_len >= retval )
+ *((FT_Long *)value) = type1->private_dict.language_group;
+ break;
+
+ case PS_DICT_IS_FIXED_PITCH:
+ retval = sizeof ( type1->font_info.is_fixed_pitch );
+ if ( value && value_len >= retval )
+ *((FT_Bool *)value) = type1->font_info.is_fixed_pitch;
+ break;
+
+ case PS_DICT_UNDERLINE_POSITION:
+ retval = sizeof ( type1->font_info.underline_position );
+ if ( value && value_len >= retval )
+ *((FT_Short *)value) = type1->font_info.underline_position;
+ break;
+
+ case PS_DICT_UNDERLINE_THICKNESS:
+ retval = sizeof ( type1->font_info.underline_thickness );
+ if ( value && value_len >= retval )
+ *((FT_UShort *)value) = type1->font_info.underline_thickness;
+ break;
+
+ case PS_DICT_FS_TYPE:
+ retval = sizeof ( type1->font_extra.fs_type );
+ if ( value && value_len >= retval )
+ *((FT_UShort *)value) = type1->font_extra.fs_type;
+ break;
+
+ case PS_DICT_VERSION:
+ retval = (FT_Long)( ft_strlen( type1->font_info.version ) + 1 );
+ if ( value && value_len >= retval )
+ ft_memcpy( value, (void *)( type1->font_info.version ), retval );
+ break;
+
+ case PS_DICT_NOTICE:
+ retval = (FT_Long)( ft_strlen( type1->font_info.notice ) + 1 );
+ if ( value && value_len >= retval )
+ ft_memcpy( value, (void *)( type1->font_info.notice ), retval );
+ break;
+
+ case PS_DICT_FULL_NAME:
+ retval = (FT_Long)( ft_strlen( type1->font_info.full_name ) + 1 );
+ if ( value && value_len >= retval )
+ ft_memcpy( value, (void *)( type1->font_info.full_name ), retval );
+ break;
+
+ case PS_DICT_FAMILY_NAME:
+ retval = (FT_Long)( ft_strlen( type1->font_info.family_name ) + 1 );
+ if ( value && value_len >= retval )
+ ft_memcpy( value, (void *)( type1->font_info.family_name ), retval );
+ break;
+
+ case PS_DICT_WEIGHT:
+ retval = (FT_Long)( ft_strlen( type1->font_info.weight ) + 1 );
+ if ( value && value_len >= retval )
+ ft_memcpy( value, (void *)( type1->font_info.weight ), retval );
+ break;
+
+ case PS_DICT_ITALIC_ANGLE:
+ retval = sizeof ( type1->font_info.italic_angle );
+ if ( value && value_len >= retval )
+ *((FT_Long *)value) = type1->font_info.italic_angle;
+ break;
+
+ default:
+ break;
+ }
+
+ return retval;
+ }
+
+
+ static const FT_Service_PsInfoRec t1_service_ps_info =
+ {
+ (PS_GetFontInfoFunc) t1_ps_get_font_info,
+ (PS_GetFontExtraFunc) t1_ps_get_font_extra,
+ (PS_HasGlyphNamesFunc) t1_ps_has_glyph_names,
+ (PS_GetFontPrivateFunc)t1_ps_get_font_private,
+ (PS_GetFontValueFunc) t1_ps_get_font_value,
+ };
+
+
+#ifndef T1_CONFIG_OPTION_NO_AFM
+ static const FT_Service_KerningRec t1_service_kerning =
+ {
+ T1_Get_Track_Kerning,
+ };
+#endif
+
+
+ /*
+ * SERVICE LIST
+ *
+ */
+
+ static const FT_ServiceDescRec t1_services[] =
+ {
+ { FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &t1_service_ps_name },
+ { FT_SERVICE_ID_GLYPH_DICT, &t1_service_glyph_dict },
+ { FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_TYPE_1 },
+ { FT_SERVICE_ID_POSTSCRIPT_INFO, &t1_service_ps_info },
+
+#ifndef T1_CONFIG_OPTION_NO_AFM
+ { FT_SERVICE_ID_KERNING, &t1_service_kerning },
+#endif
+
+#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT
+ { FT_SERVICE_ID_MULTI_MASTERS, &t1_service_multi_masters },
+#endif
+ { NULL, NULL }
+ };
+
+
+ FT_CALLBACK_DEF( FT_Module_Interface )
+ Get_Interface( FT_Module module,
+ const FT_String* t1_interface )
+ {
+ FT_UNUSED( module );
+
+ return ft_service_list_lookup( t1_services, t1_interface );
+ }
+
+
+#ifndef T1_CONFIG_OPTION_NO_AFM
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* Get_Kerning */
+ /* */
+ /* <Description> */
+ /* A driver method used to return the kerning vector between two */
+ /* glyphs of the same face. */
+ /* */
+ /* <Input> */
+ /* face :: A handle to the source face object. */
+ /* */
+ /* left_glyph :: The index of the left glyph in the kern pair. */
+ /* */
+ /* right_glyph :: The index of the right glyph in the kern pair. */
+ /* */
+ /* <Output> */
+ /* kerning :: The kerning vector. This is in font units for */
+ /* scalable formats, and in pixels for fixed-sizes */
+ /* formats. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ /* <Note> */
+ /* Only horizontal layouts (left-to-right & right-to-left) are */
+ /* supported by this function. Other layouts, or more sophisticated */
+ /* kernings are out of scope of this method (the basic driver */
+ /* interface is meant to be simple). */
+ /* */
+ /* They can be implemented by format-specific interfaces. */
+ /* */
+ static FT_Error
+ Get_Kerning( FT_Face t1face, /* T1_Face */
+ FT_UInt left_glyph,
+ FT_UInt right_glyph,
+ FT_Vector* kerning )
+ {
+ T1_Face face = (T1_Face)t1face;
+
+
+ kerning->x = 0;
+ kerning->y = 0;
+
+ if ( face->afm_data )
+ T1_Get_Kerning( (AFM_FontInfo)face->afm_data,
+ left_glyph,
+ right_glyph,
+ kerning );
+
+ return FT_Err_Ok;
+ }
+
+
+#endif /* T1_CONFIG_OPTION_NO_AFM */
+
+
+ FT_CALLBACK_TABLE_DEF
+ const FT_Driver_ClassRec t1_driver_class =
+ {
+ {
+ FT_MODULE_FONT_DRIVER |
+ FT_MODULE_DRIVER_SCALABLE |
+ FT_MODULE_DRIVER_HAS_HINTER,
+
+ sizeof ( FT_DriverRec ),
+
+ "type1",
+ 0x10000L,
+ 0x20000L,
+
+ 0, /* format interface */
+
+ T1_Driver_Init,
+ T1_Driver_Done,
+ Get_Interface,
+ },
+
+ sizeof ( T1_FaceRec ),
+ sizeof ( T1_SizeRec ),
+ sizeof ( T1_GlyphSlotRec ),
+
+ T1_Face_Init,
+ T1_Face_Done,
+ T1_Size_Init,
+ T1_Size_Done,
+ T1_GlyphSlot_Init,
+ T1_GlyphSlot_Done,
+
+ T1_Load_Glyph,
+
+#ifdef T1_CONFIG_OPTION_NO_AFM
+ 0, /* FT_Face_GetKerningFunc */
+ 0, /* FT_Face_AttachFunc */
+#else
+ Get_Kerning,
+ T1_Read_Metrics,
+#endif
+ T1_Get_Advances,
+ T1_Size_Request,
+ 0 /* FT_Size_SelectFunc */
+ };
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1driver.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1driver.h
new file mode 100644
index 0000000000..feff60dc3f
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1driver.h
@@ -0,0 +1,42 @@
+/***************************************************************************/
+/* */
+/* t1driver.h */
+/* */
+/* High-level Type 1 driver interface (specification). */
+/* */
+/* Copyright 1996-2001, 2002 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __T1DRIVER_H__
+#define __T1DRIVER_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdriver.h"
+
+
+FT_BEGIN_HEADER
+
+#ifdef FT_CONFIG_OPTION_PIC
+#error "this module does not support PIC yet"
+#endif
+
+
+ FT_EXPORT_VAR( const FT_Driver_ClassRec ) t1_driver_class;
+
+
+FT_END_HEADER
+
+#endif /* __T1DRIVER_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1errors.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1errors.h
new file mode 100644
index 0000000000..69584ba6b6
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1errors.h
@@ -0,0 +1,41 @@
+/***************************************************************************/
+/* */
+/* t1errors.h */
+/* */
+/* Type 1 error codes (specification only). */
+/* */
+/* Copyright 2001, 2012 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* This file is used to define the Type 1 error enumeration constants. */
+ /* */
+ /*************************************************************************/
+
+#ifndef __T1ERRORS_H__
+#define __T1ERRORS_H__
+
+#include "../../include/freetype/ftmoderr.h"
+
+#undef __FTERRORS_H__
+
+#undef FT_ERR_PREFIX
+#define FT_ERR_PREFIX T1_Err_
+#define FT_ERR_BASE FT_Mod_Err_Type1
+
+#include "../../include/freetype/fterrors.h"
+
+#endif /* __T1ERRORS_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1gload.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1gload.c
new file mode 100644
index 0000000000..6fc908b658
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1gload.c
@@ -0,0 +1,517 @@
+/***************************************************************************/
+/* */
+/* t1gload.c */
+/* */
+/* Type 1 Glyph Loader (body). */
+/* */
+/* Copyright 1996-2006, 2008-2010, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "t1gload.h"
+#include "../../include/freetype/internal/ftcalc.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/ftoutln.h"
+#include "../../include/freetype/internal/psaux.h"
+
+#include "t1errors.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_t1gload
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /********** *********/
+ /********** COMPUTE THE MAXIMUM ADVANCE WIDTH *********/
+ /********** *********/
+ /********** The following code is in charge of computing *********/
+ /********** the maximum advance width of the font. It *********/
+ /********** quickly processes each glyph charstring to *********/
+ /********** extract the value from either a `sbw' or `seac' *********/
+ /********** operator. *********/
+ /********** *********/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ FT_LOCAL_DEF( FT_Error )
+ T1_Parse_Glyph_And_Get_Char_String( T1_Decoder decoder,
+ FT_UInt glyph_index,
+ FT_Data* char_string )
+ {
+ T1_Face face = (T1_Face)decoder->builder.face;
+ T1_Font type1 = &face->type1;
+ FT_Error error = FT_Err_Ok;
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+ FT_Incremental_InterfaceRec *inc =
+ face->root.internal->incremental_interface;
+#endif
+
+
+ decoder->font_matrix = type1->font_matrix;
+ decoder->font_offset = type1->font_offset;
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+
+ /* For incremental fonts get the character data using the */
+ /* callback function. */
+ if ( inc )
+ error = inc->funcs->get_glyph_data( inc->object,
+ glyph_index, char_string );
+ else
+
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
+
+ /* For ordinary fonts get the character data stored in the face record. */
+ {
+ char_string->pointer = type1->charstrings[glyph_index];
+ char_string->length = (FT_Int)type1->charstrings_len[glyph_index];
+ }
+
+ if ( !error )
+ error = decoder->funcs.parse_charstrings(
+ decoder, (FT_Byte*)char_string->pointer,
+ char_string->length );
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+
+ /* Incremental fonts can optionally override the metrics. */
+ if ( !error && inc && inc->funcs->get_glyph_metrics )
+ {
+ FT_Incremental_MetricsRec metrics;
+
+
+ metrics.bearing_x = FIXED_TO_INT( decoder->builder.left_bearing.x );
+ metrics.bearing_y = 0;
+ metrics.advance = FIXED_TO_INT( decoder->builder.advance.x );
+ metrics.advance_v = FIXED_TO_INT( decoder->builder.advance.y );
+
+ error = inc->funcs->get_glyph_metrics( inc->object,
+ glyph_index, FALSE, &metrics );
+
+ decoder->builder.left_bearing.x = INT_TO_FIXED( metrics.bearing_x );
+ decoder->builder.advance.x = INT_TO_FIXED( metrics.advance );
+ decoder->builder.advance.y = INT_TO_FIXED( metrics.advance_v );
+ }
+
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
+
+ return error;
+ }
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ T1_Parse_Glyph( T1_Decoder decoder,
+ FT_UInt glyph_index )
+ {
+ FT_Data glyph_data;
+ FT_Error error = T1_Parse_Glyph_And_Get_Char_String(
+ decoder, glyph_index, &glyph_data );
+
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+
+ if ( !error )
+ {
+ T1_Face face = (T1_Face)decoder->builder.face;
+
+
+ if ( face->root.internal->incremental_interface )
+ face->root.internal->incremental_interface->funcs->free_glyph_data(
+ face->root.internal->incremental_interface->object,
+ &glyph_data );
+ }
+
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
+
+ return error;
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ T1_Compute_Max_Advance( T1_Face face,
+ FT_Pos* max_advance )
+ {
+ FT_Error error;
+ T1_DecoderRec decoder;
+ FT_Int glyph_index;
+ T1_Font type1 = &face->type1;
+ PSAux_Service psaux = (PSAux_Service)face->psaux;
+
+
+ FT_ASSERT( ( face->len_buildchar == 0 ) == ( face->buildchar == NULL ) );
+
+ *max_advance = 0;
+
+ /* initialize load decoder */
+ error = psaux->t1_decoder_funcs->init( &decoder,
+ (FT_Face)face,
+ 0, /* size */
+ 0, /* glyph slot */
+ (FT_Byte**)type1->glyph_names,
+ face->blend,
+ 0,
+ FT_RENDER_MODE_NORMAL,
+ T1_Parse_Glyph );
+ if ( error )
+ return error;
+
+ decoder.builder.metrics_only = 1;
+ decoder.builder.load_points = 0;
+
+ decoder.num_subrs = type1->num_subrs;
+ decoder.subrs = type1->subrs;
+ decoder.subrs_len = type1->subrs_len;
+
+ decoder.buildchar = face->buildchar;
+ decoder.len_buildchar = face->len_buildchar;
+
+ *max_advance = 0;
+
+ /* for each glyph, parse the glyph charstring and extract */
+ /* the advance width */
+ for ( glyph_index = 0; glyph_index < type1->num_glyphs; glyph_index++ )
+ {
+ /* now get load the unscaled outline */
+ error = T1_Parse_Glyph( &decoder, glyph_index );
+ if ( glyph_index == 0 || decoder.builder.advance.x > *max_advance )
+ *max_advance = decoder.builder.advance.x;
+
+ /* ignore the error if one occurred - skip to next glyph */
+ }
+
+ psaux->t1_decoder_funcs->done( &decoder );
+
+ return FT_Err_Ok;
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ T1_Get_Advances( FT_Face t1face, /* T1_Face */
+ FT_UInt first,
+ FT_UInt count,
+ FT_Int32 load_flags,
+ FT_Fixed* advances )
+ {
+ T1_Face face = (T1_Face)t1face;
+ T1_DecoderRec decoder;
+ T1_Font type1 = &face->type1;
+ PSAux_Service psaux = (PSAux_Service)face->psaux;
+ FT_UInt nn;
+ FT_Error error;
+
+
+ if ( load_flags & FT_LOAD_VERTICAL_LAYOUT )
+ {
+ for ( nn = 0; nn < count; nn++ )
+ advances[nn] = 0;
+
+ return FT_Err_Ok;
+ }
+
+ error = psaux->t1_decoder_funcs->init( &decoder,
+ (FT_Face)face,
+ 0, /* size */
+ 0, /* glyph slot */
+ (FT_Byte**)type1->glyph_names,
+ face->blend,
+ 0,
+ FT_RENDER_MODE_NORMAL,
+ T1_Parse_Glyph );
+ if ( error )
+ return error;
+
+ decoder.builder.metrics_only = 1;
+ decoder.builder.load_points = 0;
+
+ decoder.num_subrs = type1->num_subrs;
+ decoder.subrs = type1->subrs;
+ decoder.subrs_len = type1->subrs_len;
+
+ decoder.buildchar = face->buildchar;
+ decoder.len_buildchar = face->len_buildchar;
+
+ for ( nn = 0; nn < count; nn++ )
+ {
+ error = T1_Parse_Glyph( &decoder, first + nn );
+ if ( !error )
+ advances[nn] = FIXED_TO_INT( decoder.builder.advance.x );
+ else
+ advances[nn] = 0;
+ }
+
+ return FT_Err_Ok;
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ T1_Load_Glyph( FT_GlyphSlot t1glyph, /* T1_GlyphSlot */
+ FT_Size t1size, /* T1_Size */
+ FT_UInt glyph_index,
+ FT_Int32 load_flags )
+ {
+ T1_GlyphSlot glyph = (T1_GlyphSlot)t1glyph;
+ FT_Error error;
+ T1_DecoderRec decoder;
+ T1_Face face = (T1_Face)t1glyph->face;
+ FT_Bool hinting;
+ T1_Font type1 = &face->type1;
+ PSAux_Service psaux = (PSAux_Service)face->psaux;
+ const T1_Decoder_Funcs decoder_funcs = psaux->t1_decoder_funcs;
+
+ FT_Matrix font_matrix;
+ FT_Vector font_offset;
+ FT_Data glyph_data;
+ FT_Bool must_finish_decoder = FALSE;
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+ FT_Bool glyph_data_loaded = 0;
+#endif
+
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+ if ( glyph_index >= (FT_UInt)face->root.num_glyphs &&
+ !face->root.internal->incremental_interface )
+#else
+ if ( glyph_index >= (FT_UInt)face->root.num_glyphs )
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
+ {
+ error = FT_THROW( Invalid_Argument );
+ goto Exit;
+ }
+
+ FT_ASSERT( ( face->len_buildchar == 0 ) == ( face->buildchar == NULL ) );
+
+ if ( load_flags & FT_LOAD_NO_RECURSE )
+ load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING;
+
+ if ( t1size )
+ {
+ glyph->x_scale = t1size->metrics.x_scale;
+ glyph->y_scale = t1size->metrics.y_scale;
+ }
+ else
+ {
+ glyph->x_scale = 0x10000L;
+ glyph->y_scale = 0x10000L;
+ }
+
+ t1glyph->outline.n_points = 0;
+ t1glyph->outline.n_contours = 0;
+
+ hinting = FT_BOOL( ( load_flags & FT_LOAD_NO_SCALE ) == 0 &&
+ ( load_flags & FT_LOAD_NO_HINTING ) == 0 );
+
+ t1glyph->format = FT_GLYPH_FORMAT_OUTLINE;
+
+ error = decoder_funcs->init( &decoder,
+ t1glyph->face,
+ t1size,
+ t1glyph,
+ (FT_Byte**)type1->glyph_names,
+ face->blend,
+ FT_BOOL( hinting ),
+ FT_LOAD_TARGET_MODE( load_flags ),
+ T1_Parse_Glyph );
+ if ( error )
+ goto Exit;
+
+ must_finish_decoder = TRUE;
+
+ decoder.builder.no_recurse = FT_BOOL(
+ ( load_flags & FT_LOAD_NO_RECURSE ) != 0 );
+
+ decoder.num_subrs = type1->num_subrs;
+ decoder.subrs = type1->subrs;
+ decoder.subrs_len = type1->subrs_len;
+
+ decoder.buildchar = face->buildchar;
+ decoder.len_buildchar = face->len_buildchar;
+
+ /* now load the unscaled outline */
+ error = T1_Parse_Glyph_And_Get_Char_String( &decoder, glyph_index,
+ &glyph_data );
+ if ( error )
+ goto Exit;
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+ glyph_data_loaded = 1;
+#endif
+
+ font_matrix = decoder.font_matrix;
+ font_offset = decoder.font_offset;
+
+ /* save new glyph tables */
+ decoder_funcs->done( &decoder );
+
+ must_finish_decoder = FALSE;
+
+ /* now, set the metrics -- this is rather simple, as */
+ /* the left side bearing is the xMin, and the top side */
+ /* bearing the yMax */
+ if ( !error )
+ {
+ t1glyph->outline.flags &= FT_OUTLINE_OWNER;
+ t1glyph->outline.flags |= FT_OUTLINE_REVERSE_FILL;
+
+ /* for composite glyphs, return only left side bearing and */
+ /* advance width */
+ if ( load_flags & FT_LOAD_NO_RECURSE )
+ {
+ FT_Slot_Internal internal = t1glyph->internal;
+
+
+ t1glyph->metrics.horiBearingX =
+ FIXED_TO_INT( decoder.builder.left_bearing.x );
+ t1glyph->metrics.horiAdvance =
+ FIXED_TO_INT( decoder.builder.advance.x );
+
+ internal->glyph_matrix = font_matrix;
+ internal->glyph_delta = font_offset;
+ internal->glyph_transformed = 1;
+ }
+ else
+ {
+ FT_BBox cbox;
+ FT_Glyph_Metrics* metrics = &t1glyph->metrics;
+ FT_Vector advance;
+
+
+ /* copy the _unscaled_ advance width */
+ metrics->horiAdvance =
+ FIXED_TO_INT( decoder.builder.advance.x );
+ t1glyph->linearHoriAdvance =
+ FIXED_TO_INT( decoder.builder.advance.x );
+ t1glyph->internal->glyph_transformed = 0;
+
+ if ( load_flags & FT_LOAD_VERTICAL_LAYOUT )
+ {
+ /* make up vertical ones */
+ metrics->vertAdvance = ( face->type1.font_bbox.yMax -
+ face->type1.font_bbox.yMin ) >> 16;
+ t1glyph->linearVertAdvance = metrics->vertAdvance;
+ }
+ else
+ {
+ metrics->vertAdvance =
+ FIXED_TO_INT( decoder.builder.advance.y );
+ t1glyph->linearVertAdvance =
+ FIXED_TO_INT( decoder.builder.advance.y );
+ }
+
+ t1glyph->format = FT_GLYPH_FORMAT_OUTLINE;
+
+ if ( t1size && t1size->metrics.y_ppem < 24 )
+ t1glyph->outline.flags |= FT_OUTLINE_HIGH_PRECISION;
+
+#if 1
+ /* apply the font matrix, if any */
+ if ( font_matrix.xx != 0x10000L || font_matrix.yy != font_matrix.xx ||
+ font_matrix.xy != 0 || font_matrix.yx != 0 )
+ FT_Outline_Transform( &t1glyph->outline, &font_matrix );
+
+ if ( font_offset.x || font_offset.y )
+ FT_Outline_Translate( &t1glyph->outline,
+ font_offset.x,
+ font_offset.y );
+
+ advance.x = metrics->horiAdvance;
+ advance.y = 0;
+ FT_Vector_Transform( &advance, &font_matrix );
+ metrics->horiAdvance = advance.x + font_offset.x;
+ advance.x = 0;
+ advance.y = metrics->vertAdvance;
+ FT_Vector_Transform( &advance, &font_matrix );
+ metrics->vertAdvance = advance.y + font_offset.y;
+#endif
+
+ if ( ( load_flags & FT_LOAD_NO_SCALE ) == 0 )
+ {
+ /* scale the outline and the metrics */
+ FT_Int n;
+ FT_Outline* cur = decoder.builder.base;
+ FT_Vector* vec = cur->points;
+ FT_Fixed x_scale = glyph->x_scale;
+ FT_Fixed y_scale = glyph->y_scale;
+
+
+ /* First of all, scale the points, if we are not hinting */
+ if ( !hinting || ! decoder.builder.hints_funcs )
+ for ( n = cur->n_points; n > 0; n--, vec++ )
+ {
+ vec->x = FT_MulFix( vec->x, x_scale );
+ vec->y = FT_MulFix( vec->y, y_scale );
+ }
+
+ /* Then scale the metrics */
+ metrics->horiAdvance = FT_MulFix( metrics->horiAdvance, x_scale );
+ metrics->vertAdvance = FT_MulFix( metrics->vertAdvance, y_scale );
+ }
+
+ /* compute the other metrics */
+ FT_Outline_Get_CBox( &t1glyph->outline, &cbox );
+
+ metrics->width = cbox.xMax - cbox.xMin;
+ metrics->height = cbox.yMax - cbox.yMin;
+
+ metrics->horiBearingX = cbox.xMin;
+ metrics->horiBearingY = cbox.yMax;
+
+ if ( load_flags & FT_LOAD_VERTICAL_LAYOUT )
+ {
+ /* make up vertical ones */
+ ft_synthesize_vertical_metrics( metrics,
+ metrics->vertAdvance );
+ }
+ }
+
+ /* Set control data to the glyph charstrings. Note that this is */
+ /* _not_ zero-terminated. */
+ t1glyph->control_data = (FT_Byte*)glyph_data.pointer;
+ t1glyph->control_len = glyph_data.length;
+ }
+
+
+ Exit:
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+ if ( glyph_data_loaded && face->root.internal->incremental_interface )
+ {
+ face->root.internal->incremental_interface->funcs->free_glyph_data(
+ face->root.internal->incremental_interface->object,
+ &glyph_data );
+
+ /* Set the control data to null - it is no longer available if */
+ /* loaded incrementally. */
+ t1glyph->control_data = 0;
+ t1glyph->control_len = 0;
+ }
+#endif
+
+ if ( must_finish_decoder )
+ decoder_funcs->done( &decoder );
+
+ return error;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1gload.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1gload.h
new file mode 100644
index 0000000000..b8f4cfac9d
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1gload.h
@@ -0,0 +1,53 @@
+/***************************************************************************/
+/* */
+/* t1gload.h */
+/* */
+/* Type 1 Glyph Loader (specification). */
+/* */
+/* Copyright 1996-2001, 2002, 2003, 2008, 2011 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __T1GLOAD_H__
+#define __T1GLOAD_H__
+
+
+#include "../../include/ft2build.h"
+#include "t1objs.h"
+
+
+FT_BEGIN_HEADER
+
+
+ FT_LOCAL( FT_Error )
+ T1_Compute_Max_Advance( T1_Face face,
+ FT_Pos* max_advance );
+
+ FT_LOCAL( FT_Error )
+ T1_Get_Advances( FT_Face face,
+ FT_UInt first,
+ FT_UInt count,
+ FT_Int32 load_flags,
+ FT_Fixed* advances );
+
+ FT_LOCAL( FT_Error )
+ T1_Load_Glyph( FT_GlyphSlot glyph,
+ FT_Size size,
+ FT_UInt glyph_index,
+ FT_Int32 load_flags );
+
+
+FT_END_HEADER
+
+#endif /* __T1GLOAD_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1load.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1load.c
new file mode 100644
index 0000000000..76e36f82e7
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1load.c
@@ -0,0 +1,2272 @@
+/***************************************************************************/
+/* */
+/* t1load.c */
+/* */
+/* Type 1 font loader (body). */
+/* */
+/* Copyright 1996-2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* This is the new and improved Type 1 data loader for FreeType 2. The */
+ /* old loader has several problems: it is slow, complex, difficult to */
+ /* maintain, and contains incredible hacks to make it accept some */
+ /* ill-formed Type 1 fonts without hiccup-ing. Moreover, about 5% of */
+ /* the Type 1 fonts on my machine still aren't loaded correctly by it. */
+ /* */
+ /* This version is much simpler, much faster and also easier to read and */
+ /* maintain by a great order of magnitude. The idea behind it is to */
+ /* _not_ try to read the Type 1 token stream with a state machine (i.e. */
+ /* a Postscript-like interpreter) but rather to perform simple pattern */
+ /* matching. */
+ /* */
+ /* Indeed, nearly all data definitions follow a simple pattern like */
+ /* */
+ /* ... /Field <data> ... */
+ /* */
+ /* where <data> can be a number, a boolean, a string, or an array of */
+ /* numbers. There are a few exceptions, namely the encoding, font name, */
+ /* charstrings, and subrs; they are handled with a special pattern */
+ /* matching routine. */
+ /* */
+ /* All other common cases are handled very simply. The matching rules */
+ /* are defined in the file `t1tokens.h' through the use of several */
+ /* macros calls PARSE_XXX. This file is included twice here; the first */
+ /* time to generate parsing callback functions, the second time to */
+ /* generate a table of keywords (with pointers to the associated */
+ /* callback functions). */
+ /* */
+ /* The function `parse_dict' simply scans *linearly* a given dictionary */
+ /* (either the top-level or private one) and calls the appropriate */
+ /* callback when it encounters an immediate keyword. */
+ /* */
+ /* This is by far the fastest way one can find to parse and read all */
+ /* data. */
+ /* */
+ /* This led to tremendous code size reduction. Note that later, the */
+ /* glyph loader will also be _greatly_ simplified, and the automatic */
+ /* hinter will replace the clumsy `t1hinter'. */
+ /* */
+ /*************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/config/ftconfig.h"
+#include "../../include/freetype/ftmm.h"
+#include "../../include/freetype/internal/t1types.h"
+#include "../../include/freetype/internal/ftcalc.h"
+
+#include "t1load.h"
+#include "t1errors.h"
+
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+#define IS_INCREMENTAL (FT_Bool)( face->root.internal->incremental_interface != 0 )
+#else
+#define IS_INCREMENTAL 0
+#endif
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_t1load
+
+
+#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** MULTIPLE MASTERS SUPPORT *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ static FT_Error
+ t1_allocate_blend( T1_Face face,
+ FT_UInt num_designs,
+ FT_UInt num_axis )
+ {
+ PS_Blend blend;
+ FT_Memory memory = face->root.memory;
+ FT_Error error = FT_Err_Ok;
+
+
+ blend = face->blend;
+ if ( !blend )
+ {
+ if ( FT_NEW( blend ) )
+ goto Exit;
+
+ blend->num_default_design_vector = 0;
+
+ face->blend = blend;
+ }
+
+ /* allocate design data if needed */
+ if ( num_designs > 0 )
+ {
+ if ( blend->num_designs == 0 )
+ {
+ FT_UInt nn;
+
+
+ /* allocate the blend `private' and `font_info' dictionaries */
+ if ( FT_NEW_ARRAY( blend->font_infos[1], num_designs ) ||
+ FT_NEW_ARRAY( blend->privates [1], num_designs ) ||
+ FT_NEW_ARRAY( blend->bboxes [1], num_designs ) ||
+ FT_NEW_ARRAY( blend->weight_vector, num_designs * 2 ) )
+ goto Exit;
+
+ blend->default_weight_vector = blend->weight_vector + num_designs;
+
+ blend->font_infos[0] = &face->type1.font_info;
+ blend->privates [0] = &face->type1.private_dict;
+ blend->bboxes [0] = &face->type1.font_bbox;
+
+ for ( nn = 2; nn <= num_designs; nn++ )
+ {
+ blend->font_infos[nn] = blend->font_infos[nn - 1] + 1;
+ blend->privates [nn] = blend->privates [nn - 1] + 1;
+ blend->bboxes [nn] = blend->bboxes [nn - 1] + 1;
+ }
+
+ blend->num_designs = num_designs;
+ }
+ else if ( blend->num_designs != num_designs )
+ goto Fail;
+ }
+
+ /* allocate axis data if needed */
+ if ( num_axis > 0 )
+ {
+ if ( blend->num_axis != 0 && blend->num_axis != num_axis )
+ goto Fail;
+
+ blend->num_axis = num_axis;
+ }
+
+ /* allocate the blend design pos table if needed */
+ num_designs = blend->num_designs;
+ num_axis = blend->num_axis;
+ if ( num_designs && num_axis && blend->design_pos[0] == 0 )
+ {
+ FT_UInt n;
+
+
+ if ( FT_NEW_ARRAY( blend->design_pos[0], num_designs * num_axis ) )
+ goto Exit;
+
+ for ( n = 1; n < num_designs; n++ )
+ blend->design_pos[n] = blend->design_pos[0] + num_axis * n;
+ }
+
+ Exit:
+ return error;
+
+ Fail:
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ T1_Get_Multi_Master( T1_Face face,
+ FT_Multi_Master* master )
+ {
+ PS_Blend blend = face->blend;
+ FT_UInt n;
+ FT_Error error;
+
+
+ error = FT_THROW( Invalid_Argument );
+
+ if ( blend )
+ {
+ master->num_axis = blend->num_axis;
+ master->num_designs = blend->num_designs;
+
+ for ( n = 0; n < blend->num_axis; n++ )
+ {
+ FT_MM_Axis* axis = master->axis + n;
+ PS_DesignMap map = blend->design_map + n;
+
+
+ axis->name = blend->axis_names[n];
+ axis->minimum = map->design_points[0];
+ axis->maximum = map->design_points[map->num_points - 1];
+ }
+
+ error = FT_Err_Ok;
+ }
+
+ return error;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* Given a normalized (blend) coordinate, figure out the design */
+ /* coordinate appropriate for that value. */
+ /* */
+ FT_LOCAL_DEF( FT_Fixed )
+ mm_axis_unmap( PS_DesignMap axismap,
+ FT_Fixed ncv )
+ {
+ int j;
+
+
+ if ( ncv <= axismap->blend_points[0] )
+ return INT_TO_FIXED( axismap->design_points[0] );
+
+ for ( j = 1; j < axismap->num_points; ++j )
+ {
+ if ( ncv <= axismap->blend_points[j] )
+ return INT_TO_FIXED( axismap->design_points[j - 1] ) +
+ ( axismap->design_points[j] - axismap->design_points[j - 1] ) *
+ FT_DivFix( ncv - axismap->blend_points[j - 1],
+ axismap->blend_points[j] -
+ axismap->blend_points[j - 1] );
+ }
+
+ return INT_TO_FIXED( axismap->design_points[axismap->num_points - 1] );
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* Given a vector of weights, one for each design, figure out the */
+ /* normalized axis coordinates which gave rise to those weights. */
+ /* */
+ FT_LOCAL_DEF( void )
+ mm_weights_unmap( FT_Fixed* weights,
+ FT_Fixed* axiscoords,
+ FT_UInt axis_count )
+ {
+ FT_ASSERT( axis_count <= T1_MAX_MM_AXIS );
+
+ if ( axis_count == 1 )
+ axiscoords[0] = weights[1];
+
+ else if ( axis_count == 2 )
+ {
+ axiscoords[0] = weights[3] + weights[1];
+ axiscoords[1] = weights[3] + weights[2];
+ }
+
+ else if ( axis_count == 3 )
+ {
+ axiscoords[0] = weights[7] + weights[5] + weights[3] + weights[1];
+ axiscoords[1] = weights[7] + weights[6] + weights[3] + weights[2];
+ axiscoords[2] = weights[7] + weights[6] + weights[5] + weights[4];
+ }
+
+ else
+ {
+ axiscoords[0] = weights[15] + weights[13] + weights[11] + weights[9] +
+ weights[7] + weights[5] + weights[3] + weights[1];
+ axiscoords[1] = weights[15] + weights[14] + weights[11] + weights[10] +
+ weights[7] + weights[6] + weights[3] + weights[2];
+ axiscoords[2] = weights[15] + weights[14] + weights[13] + weights[12] +
+ weights[7] + weights[6] + weights[5] + weights[4];
+ axiscoords[3] = weights[15] + weights[14] + weights[13] + weights[12] +
+ weights[11] + weights[10] + weights[9] + weights[8];
+ }
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* Just a wrapper around T1_Get_Multi_Master to support the different */
+ /* arguments needed by the GX var distortable fonts. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ T1_Get_MM_Var( T1_Face face,
+ FT_MM_Var* *master )
+ {
+ FT_Memory memory = face->root.memory;
+ FT_MM_Var *mmvar = NULL;
+ FT_Multi_Master mmaster;
+ FT_Error error;
+ FT_UInt i;
+ FT_Fixed axiscoords[T1_MAX_MM_AXIS];
+ PS_Blend blend = face->blend;
+
+
+ error = T1_Get_Multi_Master( face, &mmaster );
+ if ( error )
+ goto Exit;
+ if ( FT_ALLOC( mmvar,
+ sizeof ( FT_MM_Var ) +
+ mmaster.num_axis * sizeof ( FT_Var_Axis ) ) )
+ goto Exit;
+
+ mmvar->num_axis = mmaster.num_axis;
+ mmvar->num_designs = mmaster.num_designs;
+ mmvar->num_namedstyles = ~0U; /* Does not apply */
+ mmvar->axis = (FT_Var_Axis*)&mmvar[1];
+ /* Point to axes after MM_Var struct */
+ mmvar->namedstyle = NULL;
+
+ for ( i = 0 ; i < mmaster.num_axis; ++i )
+ {
+ mmvar->axis[i].name = mmaster.axis[i].name;
+ mmvar->axis[i].minimum = INT_TO_FIXED( mmaster.axis[i].minimum);
+ mmvar->axis[i].maximum = INT_TO_FIXED( mmaster.axis[i].maximum);
+ mmvar->axis[i].def = ( mmvar->axis[i].minimum +
+ mmvar->axis[i].maximum ) / 2;
+ /* Does not apply. But this value is in range */
+ mmvar->axis[i].strid = ~0U; /* Does not apply */
+ mmvar->axis[i].tag = ~0U; /* Does not apply */
+
+ if ( ft_strcmp( mmvar->axis[i].name, "Weight" ) == 0 )
+ mmvar->axis[i].tag = FT_MAKE_TAG( 'w', 'g', 'h', 't' );
+ else if ( ft_strcmp( mmvar->axis[i].name, "Width" ) == 0 )
+ mmvar->axis[i].tag = FT_MAKE_TAG( 'w', 'd', 't', 'h' );
+ else if ( ft_strcmp( mmvar->axis[i].name, "OpticalSize" ) == 0 )
+ mmvar->axis[i].tag = FT_MAKE_TAG( 'o', 'p', 's', 'z' );
+ }
+
+ if ( blend->num_designs == ( 1U << blend->num_axis ) )
+ {
+ mm_weights_unmap( blend->default_weight_vector,
+ axiscoords,
+ blend->num_axis );
+
+ for ( i = 0; i < mmaster.num_axis; ++i )
+ mmvar->axis[i].def = mm_axis_unmap( &blend->design_map[i],
+ axiscoords[i] );
+ }
+
+ *master = mmvar;
+
+ Exit:
+ return error;
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ T1_Set_MM_Blend( T1_Face face,
+ FT_UInt num_coords,
+ FT_Fixed* coords )
+ {
+ PS_Blend blend = face->blend;
+ FT_Error error;
+ FT_UInt n, m;
+
+
+ error = FT_ERR( Invalid_Argument );
+
+ if ( blend && blend->num_axis == num_coords )
+ {
+ /* recompute the weight vector from the blend coordinates */
+ error = FT_Err_Ok;
+
+ for ( n = 0; n < blend->num_designs; n++ )
+ {
+ FT_Fixed result = 0x10000L; /* 1.0 fixed */
+
+
+ for ( m = 0; m < blend->num_axis; m++ )
+ {
+ FT_Fixed factor;
+
+
+ /* get current blend axis position */
+ factor = coords[m];
+ if ( factor < 0 )
+ factor = 0;
+ if ( factor > 0x10000L )
+ factor = 0x10000L;
+
+ if ( ( n & ( 1 << m ) ) == 0 )
+ factor = 0x10000L - factor;
+
+ result = FT_MulFix( result, factor );
+ }
+ blend->weight_vector[n] = result;
+ }
+
+ error = FT_Err_Ok;
+ }
+
+ return error;
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ T1_Set_MM_Design( T1_Face face,
+ FT_UInt num_coords,
+ FT_Long* coords )
+ {
+ PS_Blend blend = face->blend;
+ FT_Error error;
+ FT_UInt n, p;
+
+
+ error = FT_ERR( Invalid_Argument );
+ if ( blend && blend->num_axis == num_coords )
+ {
+ /* compute the blend coordinates through the blend design map */
+ FT_Fixed final_blends[T1_MAX_MM_DESIGNS];
+
+
+ for ( n = 0; n < blend->num_axis; n++ )
+ {
+ FT_Long design = coords[n];
+ FT_Fixed the_blend;
+ PS_DesignMap map = blend->design_map + n;
+ FT_Long* designs = map->design_points;
+ FT_Fixed* blends = map->blend_points;
+ FT_Int before = -1, after = -1;
+
+
+ for ( p = 0; p < (FT_UInt)map->num_points; p++ )
+ {
+ FT_Long p_design = designs[p];
+
+
+ /* exact match? */
+ if ( design == p_design )
+ {
+ the_blend = blends[p];
+ goto Found;
+ }
+
+ if ( design < p_design )
+ {
+ after = p;
+ break;
+ }
+
+ before = p;
+ }
+
+ /* now interpolate if necessary */
+ if ( before < 0 )
+ the_blend = blends[0];
+
+ else if ( after < 0 )
+ the_blend = blends[map->num_points - 1];
+
+ else
+ the_blend = FT_MulDiv( design - designs[before],
+ blends [after] - blends [before],
+ designs[after] - designs[before] );
+
+ Found:
+ final_blends[n] = the_blend;
+ }
+
+ error = T1_Set_MM_Blend( face, num_coords, final_blends );
+ }
+
+ return error;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* Just a wrapper around T1_Set_MM_Design to support the different */
+ /* arguments needed by the GX var distortable fonts. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ T1_Set_Var_Design( T1_Face face,
+ FT_UInt num_coords,
+ FT_Fixed* coords )
+ {
+ FT_Long lcoords[4]; /* maximum axis count is 4 */
+ FT_UInt i;
+ FT_Error error;
+
+
+ error = FT_ERR( Invalid_Argument );
+ if ( num_coords <= 4 && num_coords > 0 )
+ {
+ for ( i = 0; i < num_coords; ++i )
+ lcoords[i] = FIXED_TO_INT( coords[i] );
+ error = T1_Set_MM_Design( face, num_coords, lcoords );
+ }
+
+ return error;
+ }
+
+
+ FT_LOCAL_DEF( void )
+ T1_Done_Blend( T1_Face face )
+ {
+ FT_Memory memory = face->root.memory;
+ PS_Blend blend = face->blend;
+
+
+ if ( blend )
+ {
+ FT_UInt num_designs = blend->num_designs;
+ FT_UInt num_axis = blend->num_axis;
+ FT_UInt n;
+
+
+ /* release design pos table */
+ FT_FREE( blend->design_pos[0] );
+ for ( n = 1; n < num_designs; n++ )
+ blend->design_pos[n] = NULL;
+
+ /* release blend `private' and `font info' dictionaries */
+ FT_FREE( blend->privates[1] );
+ FT_FREE( blend->font_infos[1] );
+ FT_FREE( blend->bboxes[1] );
+
+ for ( n = 0; n < num_designs; n++ )
+ {
+ blend->privates [n] = NULL;
+ blend->font_infos[n] = NULL;
+ blend->bboxes [n] = NULL;
+ }
+
+ /* release weight vectors */
+ FT_FREE( blend->weight_vector );
+ blend->default_weight_vector = NULL;
+
+ /* release axis names */
+ for ( n = 0; n < num_axis; n++ )
+ FT_FREE( blend->axis_names[n] );
+
+ /* release design map */
+ for ( n = 0; n < num_axis; n++ )
+ {
+ PS_DesignMap dmap = blend->design_map + n;
+
+
+ FT_FREE( dmap->design_points );
+ dmap->num_points = 0;
+ }
+
+ FT_FREE( face->blend );
+ }
+ }
+
+
+ static void
+ parse_blend_axis_types( T1_Face face,
+ T1_Loader loader )
+ {
+ T1_TokenRec axis_tokens[T1_MAX_MM_AXIS];
+ FT_Int n, num_axis;
+ FT_Error error = FT_Err_Ok;
+ PS_Blend blend;
+ FT_Memory memory;
+
+
+ /* take an array of objects */
+ T1_ToTokenArray( &loader->parser, axis_tokens,
+ T1_MAX_MM_AXIS, &num_axis );
+ if ( num_axis < 0 )
+ {
+ error = FT_ERR( Ignore );
+ goto Exit;
+ }
+ if ( num_axis == 0 || num_axis > T1_MAX_MM_AXIS )
+ {
+ FT_ERROR(( "parse_blend_axis_types: incorrect number of axes: %d\n",
+ num_axis ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+ /* allocate blend if necessary */
+ error = t1_allocate_blend( face, 0, (FT_UInt)num_axis );
+ if ( error )
+ goto Exit;
+
+ blend = face->blend;
+ memory = face->root.memory;
+
+ /* each token is an immediate containing the name of the axis */
+ for ( n = 0; n < num_axis; n++ )
+ {
+ T1_Token token = axis_tokens + n;
+ FT_Byte* name;
+ FT_PtrDist len;
+
+
+ /* skip first slash, if any */
+ if ( token->start[0] == '/' )
+ token->start++;
+
+ len = token->limit - token->start;
+ if ( len == 0 )
+ {
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+ if ( FT_ALLOC( blend->axis_names[n], (FT_Long)( len + 1 ) ) )
+ goto Exit;
+
+ name = (FT_Byte*)blend->axis_names[n];
+ FT_MEM_COPY( name, token->start, len );
+ name[len] = '\0';
+ }
+
+ Exit:
+ loader->parser.root.error = error;
+ }
+
+
+ static void
+ parse_blend_design_positions( T1_Face face,
+ T1_Loader loader )
+ {
+ T1_TokenRec design_tokens[T1_MAX_MM_DESIGNS];
+ FT_Int num_designs;
+ FT_Int num_axis;
+ T1_Parser parser = &loader->parser;
+
+ FT_Error error = FT_Err_Ok;
+ PS_Blend blend;
+
+
+ /* get the array of design tokens -- compute number of designs */
+ T1_ToTokenArray( parser, design_tokens,
+ T1_MAX_MM_DESIGNS, &num_designs );
+ if ( num_designs < 0 )
+ {
+ error = FT_ERR( Ignore );
+ goto Exit;
+ }
+ if ( num_designs == 0 || num_designs > T1_MAX_MM_DESIGNS )
+ {
+ FT_ERROR(( "parse_blend_design_positions:"
+ " incorrect number of designs: %d\n",
+ num_designs ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+ {
+ FT_Byte* old_cursor = parser->root.cursor;
+ FT_Byte* old_limit = parser->root.limit;
+ FT_Int n;
+
+
+ blend = face->blend;
+ num_axis = 0; /* make compiler happy */
+
+ for ( n = 0; n < num_designs; n++ )
+ {
+ T1_TokenRec axis_tokens[T1_MAX_MM_AXIS];
+ T1_Token token;
+ FT_Int axis, n_axis;
+
+
+ /* read axis/coordinates tokens */
+ token = design_tokens + n;
+ parser->root.cursor = token->start;
+ parser->root.limit = token->limit;
+ T1_ToTokenArray( parser, axis_tokens, T1_MAX_MM_AXIS, &n_axis );
+
+ if ( n == 0 )
+ {
+ if ( n_axis <= 0 || n_axis > T1_MAX_MM_AXIS )
+ {
+ FT_ERROR(( "parse_blend_design_positions:"
+ " invalid number of axes: %d\n",
+ n_axis ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+ num_axis = n_axis;
+ error = t1_allocate_blend( face, num_designs, num_axis );
+ if ( error )
+ goto Exit;
+ blend = face->blend;
+ }
+ else if ( n_axis != num_axis )
+ {
+ FT_ERROR(( "parse_blend_design_positions: incorrect table\n" ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+ /* now read each axis token into the design position */
+ for ( axis = 0; axis < n_axis; axis++ )
+ {
+ T1_Token token2 = axis_tokens + axis;
+
+
+ parser->root.cursor = token2->start;
+ parser->root.limit = token2->limit;
+ blend->design_pos[n][axis] = T1_ToFixed( parser, 0 );
+ }
+ }
+
+ loader->parser.root.cursor = old_cursor;
+ loader->parser.root.limit = old_limit;
+ }
+
+ Exit:
+ loader->parser.root.error = error;
+ }
+
+
+ static void
+ parse_blend_design_map( T1_Face face,
+ T1_Loader loader )
+ {
+ FT_Error error = FT_Err_Ok;
+ T1_Parser parser = &loader->parser;
+ PS_Blend blend;
+ T1_TokenRec axis_tokens[T1_MAX_MM_AXIS];
+ FT_Int n, num_axis;
+ FT_Byte* old_cursor;
+ FT_Byte* old_limit;
+ FT_Memory memory = face->root.memory;
+
+
+ T1_ToTokenArray( parser, axis_tokens,
+ T1_MAX_MM_AXIS, &num_axis );
+ if ( num_axis < 0 )
+ {
+ error = FT_ERR( Ignore );
+ goto Exit;
+ }
+ if ( num_axis == 0 || num_axis > T1_MAX_MM_AXIS )
+ {
+ FT_ERROR(( "parse_blend_design_map: incorrect number of axes: %d\n",
+ num_axis ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+ old_cursor = parser->root.cursor;
+ old_limit = parser->root.limit;
+
+ error = t1_allocate_blend( face, 0, num_axis );
+ if ( error )
+ goto Exit;
+ blend = face->blend;
+
+ /* now read each axis design map */
+ for ( n = 0; n < num_axis; n++ )
+ {
+ PS_DesignMap map = blend->design_map + n;
+ T1_Token axis_token;
+ T1_TokenRec point_tokens[T1_MAX_MM_MAP_POINTS];
+ FT_Int p, num_points;
+
+
+ axis_token = axis_tokens + n;
+
+ parser->root.cursor = axis_token->start;
+ parser->root.limit = axis_token->limit;
+ T1_ToTokenArray( parser, point_tokens,
+ T1_MAX_MM_MAP_POINTS, &num_points );
+
+ if ( num_points <= 0 || num_points > T1_MAX_MM_MAP_POINTS )
+ {
+ FT_ERROR(( "parse_blend_design_map: incorrect table\n" ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+ /* allocate design map data */
+ if ( FT_NEW_ARRAY( map->design_points, num_points * 2 ) )
+ goto Exit;
+ map->blend_points = map->design_points + num_points;
+ map->num_points = (FT_Byte)num_points;
+
+ for ( p = 0; p < num_points; p++ )
+ {
+ T1_Token point_token;
+
+
+ point_token = point_tokens + p;
+
+ /* don't include delimiting brackets */
+ parser->root.cursor = point_token->start + 1;
+ parser->root.limit = point_token->limit - 1;
+
+ map->design_points[p] = T1_ToInt( parser );
+ map->blend_points [p] = T1_ToFixed( parser, 0 );
+ }
+ }
+
+ parser->root.cursor = old_cursor;
+ parser->root.limit = old_limit;
+
+ Exit:
+ parser->root.error = error;
+ }
+
+
+ static void
+ parse_weight_vector( T1_Face face,
+ T1_Loader loader )
+ {
+ T1_TokenRec design_tokens[T1_MAX_MM_DESIGNS];
+ FT_Int num_designs;
+ FT_Error error = FT_Err_Ok;
+ T1_Parser parser = &loader->parser;
+ PS_Blend blend = face->blend;
+ T1_Token token;
+ FT_Int n;
+ FT_Byte* old_cursor;
+ FT_Byte* old_limit;
+
+
+ T1_ToTokenArray( parser, design_tokens,
+ T1_MAX_MM_DESIGNS, &num_designs );
+ if ( num_designs < 0 )
+ {
+ error = FT_ERR( Ignore );
+ goto Exit;
+ }
+ if ( num_designs == 0 || num_designs > T1_MAX_MM_DESIGNS )
+ {
+ FT_ERROR(( "parse_weight_vector:"
+ " incorrect number of designs: %d\n",
+ num_designs ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+ if ( !blend || !blend->num_designs )
+ {
+ error = t1_allocate_blend( face, num_designs, 0 );
+ if ( error )
+ goto Exit;
+ blend = face->blend;
+ }
+ else if ( blend->num_designs != (FT_UInt)num_designs )
+ {
+ FT_ERROR(( "parse_weight_vector:"
+ " /BlendDesignPosition and /WeightVector have\n"
+ " "
+ " different number of elements\n" ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+ old_cursor = parser->root.cursor;
+ old_limit = parser->root.limit;
+
+ for ( n = 0; n < num_designs; n++ )
+ {
+ token = design_tokens + n;
+ parser->root.cursor = token->start;
+ parser->root.limit = token->limit;
+
+ blend->default_weight_vector[n] =
+ blend->weight_vector[n] = T1_ToFixed( parser, 0 );
+ }
+
+ parser->root.cursor = old_cursor;
+ parser->root.limit = old_limit;
+
+ Exit:
+ parser->root.error = error;
+ }
+
+
+ /* e.g., /BuildCharArray [0 0 0 0 0 0 0 0] def */
+ /* we're only interested in the number of array elements */
+ static void
+ parse_buildchar( T1_Face face,
+ T1_Loader loader )
+ {
+ face->len_buildchar = T1_ToFixedArray( &loader->parser, 0, NULL, 0 );
+
+ return;
+ }
+
+
+#endif /* !T1_CONFIG_OPTION_NO_MM_SUPPORT */
+
+
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** TYPE 1 SYMBOL PARSING *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+
+ static FT_Error
+ t1_load_keyword( T1_Face face,
+ T1_Loader loader,
+ const T1_Field field )
+ {
+ FT_Error error;
+ void* dummy_object;
+ void** objects;
+ FT_UInt max_objects;
+ PS_Blend blend = face->blend;
+
+
+ if ( blend && blend->num_designs == 0 )
+ blend = NULL;
+
+ /* if the keyword has a dedicated callback, call it */
+ if ( field->type == T1_FIELD_TYPE_CALLBACK )
+ {
+ field->reader( (FT_Face)face, loader );
+ error = loader->parser.root.error;
+ goto Exit;
+ }
+
+ /* now, the keyword is either a simple field, or a table of fields; */
+ /* we are now going to take care of it */
+ switch ( field->location )
+ {
+ case T1_FIELD_LOCATION_FONT_INFO:
+ dummy_object = &face->type1.font_info;
+ objects = &dummy_object;
+ max_objects = 0;
+
+ if ( blend )
+ {
+ objects = (void**)blend->font_infos;
+ max_objects = blend->num_designs;
+ }
+ break;
+
+ case T1_FIELD_LOCATION_FONT_EXTRA:
+ dummy_object = &face->type1.font_extra;
+ objects = &dummy_object;
+ max_objects = 0;
+ break;
+
+ case T1_FIELD_LOCATION_PRIVATE:
+ dummy_object = &face->type1.private_dict;
+ objects = &dummy_object;
+ max_objects = 0;
+
+ if ( blend )
+ {
+ objects = (void**)blend->privates;
+ max_objects = blend->num_designs;
+ }
+ break;
+
+ case T1_FIELD_LOCATION_BBOX:
+ dummy_object = &face->type1.font_bbox;
+ objects = &dummy_object;
+ max_objects = 0;
+
+ if ( blend )
+ {
+ objects = (void**)blend->bboxes;
+ max_objects = blend->num_designs;
+ }
+ break;
+
+ case T1_FIELD_LOCATION_LOADER:
+ dummy_object = loader;
+ objects = &dummy_object;
+ max_objects = 0;
+ break;
+
+ case T1_FIELD_LOCATION_FACE:
+ dummy_object = face;
+ objects = &dummy_object;
+ max_objects = 0;
+ break;
+
+#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT
+ case T1_FIELD_LOCATION_BLEND:
+ dummy_object = face->blend;
+ objects = &dummy_object;
+ max_objects = 0;
+ break;
+#endif
+
+ default:
+ dummy_object = &face->type1;
+ objects = &dummy_object;
+ max_objects = 0;
+ }
+
+ if ( *objects )
+ {
+ if ( field->type == T1_FIELD_TYPE_INTEGER_ARRAY ||
+ field->type == T1_FIELD_TYPE_FIXED_ARRAY )
+ error = T1_Load_Field_Table( &loader->parser, field,
+ objects, max_objects, 0 );
+ else
+ error = T1_Load_Field( &loader->parser, field,
+ objects, max_objects, 0 );
+ }
+ else
+ {
+ FT_TRACE1(( "t1_load_keyword: ignoring keyword `%s'"
+ " which is not valid at this point\n"
+ " (probably due to missing keywords)\n",
+ field->ident ));
+ error = FT_Err_Ok;
+ }
+
+ Exit:
+ return error;
+ }
+
+
+ static void
+ parse_private( T1_Face face,
+ T1_Loader loader )
+ {
+ FT_UNUSED( face );
+
+ loader->keywords_encountered |= T1_PRIVATE;
+ }
+
+
+ static int
+ read_binary_data( T1_Parser parser,
+ FT_Long* size,
+ FT_Byte** base,
+ FT_Bool incremental )
+ {
+ FT_Byte* cur;
+ FT_Byte* limit = parser->root.limit;
+
+
+ /* the binary data has one of the following formats */
+ /* */
+ /* `size' [white*] RD white ....... ND */
+ /* `size' [white*] -| white ....... |- */
+ /* */
+
+ T1_Skip_Spaces( parser );
+
+ cur = parser->root.cursor;
+
+ if ( cur < limit && ft_isdigit( *cur ) )
+ {
+ FT_Long s = T1_ToInt( parser );
+
+
+ T1_Skip_PS_Token( parser ); /* `RD' or `-|' or something else */
+
+ /* there is only one whitespace char after the */
+ /* `RD' or `-|' token */
+ *base = parser->root.cursor + 1;
+
+ if ( s >= 0 && s < limit - *base )
+ {
+ parser->root.cursor += s + 1;
+ *size = s;
+ return !parser->root.error;
+ }
+ }
+
+ if( !incremental )
+ {
+ FT_ERROR(( "read_binary_data: invalid size field\n" ));
+ parser->root.error = FT_THROW( Invalid_File_Format );
+ }
+
+ return 0;
+ }
+
+
+ /* We now define the routines to handle the `/Encoding', `/Subrs', */
+ /* and `/CharStrings' dictionaries. */
+
+ static void
+ t1_parse_font_matrix( T1_Face face,
+ T1_Loader loader )
+ {
+ T1_Parser parser = &loader->parser;
+ FT_Matrix* matrix = &face->type1.font_matrix;
+ FT_Vector* offset = &face->type1.font_offset;
+ FT_Face root = (FT_Face)&face->root;
+ FT_Fixed temp[6];
+ FT_Fixed temp_scale;
+ FT_Int result;
+
+
+ result = T1_ToFixedArray( parser, 6, temp, 3 );
+
+ if ( result < 0 )
+ {
+ parser->root.error = FT_THROW( Invalid_File_Format );
+ return;
+ }
+
+ temp_scale = FT_ABS( temp[3] );
+
+ if ( temp_scale == 0 )
+ {
+ FT_ERROR(( "t1_parse_font_matrix: invalid font matrix\n" ));
+ parser->root.error = FT_THROW( Invalid_File_Format );
+ return;
+ }
+
+ /* Set Units per EM based on FontMatrix values. We set the value to */
+ /* 1000 / temp_scale, because temp_scale was already multiplied by */
+ /* 1000 (in t1_tofixed, from psobjs.c). */
+
+ root->units_per_EM = (FT_UShort)FT_DivFix( 1000, temp_scale );
+
+ /* we need to scale the values by 1.0/temp_scale */
+ if ( temp_scale != 0x10000L )
+ {
+ temp[0] = FT_DivFix( temp[0], temp_scale );
+ temp[1] = FT_DivFix( temp[1], temp_scale );
+ temp[2] = FT_DivFix( temp[2], temp_scale );
+ temp[4] = FT_DivFix( temp[4], temp_scale );
+ temp[5] = FT_DivFix( temp[5], temp_scale );
+ temp[3] = temp[3] < 0 ? -0x10000L : 0x10000L;
+ }
+
+ matrix->xx = temp[0];
+ matrix->yx = temp[1];
+ matrix->xy = temp[2];
+ matrix->yy = temp[3];
+
+ /* note that the offsets must be expressed in integer font units */
+ offset->x = temp[4] >> 16;
+ offset->y = temp[5] >> 16;
+ }
+
+
+ static void
+ parse_encoding( T1_Face face,
+ T1_Loader loader )
+ {
+ T1_Parser parser = &loader->parser;
+ FT_Byte* cur;
+ FT_Byte* limit = parser->root.limit;
+
+ PSAux_Service psaux = (PSAux_Service)face->psaux;
+
+
+ T1_Skip_Spaces( parser );
+ cur = parser->root.cursor;
+ if ( cur >= limit )
+ {
+ FT_ERROR(( "parse_encoding: out of bounds\n" ));
+ parser->root.error = FT_THROW( Invalid_File_Format );
+ return;
+ }
+
+ /* if we have a number or `[', the encoding is an array, */
+ /* and we must load it now */
+ if ( ft_isdigit( *cur ) || *cur == '[' )
+ {
+ T1_Encoding encode = &face->type1.encoding;
+ FT_Int count, n;
+ PS_Table char_table = &loader->encoding_table;
+ FT_Memory memory = parser->root.memory;
+ FT_Error error;
+ FT_Bool only_immediates = 0;
+
+
+ /* read the number of entries in the encoding; should be 256 */
+ if ( *cur == '[' )
+ {
+ count = 256;
+ only_immediates = 1;
+ parser->root.cursor++;
+ }
+ else
+ count = (FT_Int)T1_ToInt( parser );
+
+ T1_Skip_Spaces( parser );
+ if ( parser->root.cursor >= limit )
+ return;
+
+ /* we use a T1_Table to store our charnames */
+ loader->num_chars = encode->num_chars = count;
+ if ( FT_NEW_ARRAY( encode->char_index, count ) ||
+ FT_NEW_ARRAY( encode->char_name, count ) ||
+ FT_SET_ERROR( psaux->ps_table_funcs->init(
+ char_table, count, memory ) ) )
+ {
+ parser->root.error = error;
+ return;
+ }
+
+ /* We need to `zero' out encoding_table.elements */
+ for ( n = 0; n < count; n++ )
+ {
+ char* notdef = (char *)".notdef";
+
+
+ T1_Add_Table( char_table, n, notdef, 8 );
+ }
+
+ /* Now we need to read records of the form */
+ /* */
+ /* ... charcode /charname ... */
+ /* */
+ /* for each entry in our table. */
+ /* */
+ /* We simply look for a number followed by an immediate */
+ /* name. Note that this ignores correctly the sequence */
+ /* that is often seen in type1 fonts: */
+ /* */
+ /* 0 1 255 { 1 index exch /.notdef put } for dup */
+ /* */
+ /* used to clean the encoding array before anything else. */
+ /* */
+ /* Alternatively, if the array is directly given as */
+ /* */
+ /* /Encoding [ ... ] */
+ /* */
+ /* we only read immediates. */
+
+ n = 0;
+ T1_Skip_Spaces( parser );
+
+ while ( parser->root.cursor < limit )
+ {
+ cur = parser->root.cursor;
+
+ /* we stop when we encounter a `def' or `]' */
+ if ( *cur == 'd' && cur + 3 < limit )
+ {
+ if ( cur[1] == 'e' &&
+ cur[2] == 'f' &&
+ IS_PS_DELIM( cur[3] ) )
+ {
+ FT_TRACE6(( "encoding end\n" ));
+ cur += 3;
+ break;
+ }
+ }
+ if ( *cur == ']' )
+ {
+ FT_TRACE6(( "encoding end\n" ));
+ cur++;
+ break;
+ }
+
+ /* check whether we've found an entry */
+ if ( ft_isdigit( *cur ) || only_immediates )
+ {
+ FT_Int charcode;
+
+
+ if ( only_immediates )
+ charcode = n;
+ else
+ {
+ charcode = (FT_Int)T1_ToInt( parser );
+ T1_Skip_Spaces( parser );
+ }
+
+ cur = parser->root.cursor;
+
+ if ( cur + 2 < limit && *cur == '/' && n < count )
+ {
+ FT_PtrDist len;
+
+
+ cur++;
+
+ parser->root.cursor = cur;
+ T1_Skip_PS_Token( parser );
+ if ( parser->root.cursor >= limit )
+ return;
+ if ( parser->root.error )
+ return;
+
+ len = parser->root.cursor - cur;
+
+ parser->root.error = T1_Add_Table( char_table, charcode,
+ cur, len + 1 );
+ if ( parser->root.error )
+ return;
+ char_table->elements[charcode][len] = '\0';
+
+ n++;
+ }
+ else if ( only_immediates )
+ {
+ /* Since the current position is not updated for */
+ /* immediates-only mode we would get an infinite loop if */
+ /* we don't do anything here. */
+ /* */
+ /* This encoding array is not valid according to the type1 */
+ /* specification (it might be an encoding for a CID type1 */
+ /* font, however), so we conclude that this font is NOT a */
+ /* type1 font. */
+ parser->root.error = FT_THROW( Unknown_File_Format );
+ return;
+ }
+ }
+ else
+ {
+ T1_Skip_PS_Token( parser );
+ if ( parser->root.error )
+ return;
+ }
+
+ T1_Skip_Spaces( parser );
+ }
+
+ face->type1.encoding_type = T1_ENCODING_TYPE_ARRAY;
+ parser->root.cursor = cur;
+ }
+
+ /* Otherwise, we should have either `StandardEncoding', */
+ /* `ExpertEncoding', or `ISOLatin1Encoding' */
+ else
+ {
+ if ( cur + 17 < limit &&
+ ft_strncmp( (const char*)cur, "StandardEncoding", 16 ) == 0 )
+ face->type1.encoding_type = T1_ENCODING_TYPE_STANDARD;
+
+ else if ( cur + 15 < limit &&
+ ft_strncmp( (const char*)cur, "ExpertEncoding", 14 ) == 0 )
+ face->type1.encoding_type = T1_ENCODING_TYPE_EXPERT;
+
+ else if ( cur + 18 < limit &&
+ ft_strncmp( (const char*)cur, "ISOLatin1Encoding", 17 ) == 0 )
+ face->type1.encoding_type = T1_ENCODING_TYPE_ISOLATIN1;
+
+ else
+ parser->root.error = FT_ERR( Ignore );
+ }
+ }
+
+
+ static void
+ parse_subrs( T1_Face face,
+ T1_Loader loader )
+ {
+ T1_Parser parser = &loader->parser;
+ PS_Table table = &loader->subrs;
+ FT_Memory memory = parser->root.memory;
+ FT_Error error;
+ FT_Int num_subrs;
+
+ PSAux_Service psaux = (PSAux_Service)face->psaux;
+
+
+ T1_Skip_Spaces( parser );
+
+ /* test for empty array */
+ if ( parser->root.cursor < parser->root.limit &&
+ *parser->root.cursor == '[' )
+ {
+ T1_Skip_PS_Token( parser );
+ T1_Skip_Spaces ( parser );
+ if ( parser->root.cursor >= parser->root.limit ||
+ *parser->root.cursor != ']' )
+ parser->root.error = FT_THROW( Invalid_File_Format );
+ return;
+ }
+
+ num_subrs = (FT_Int)T1_ToInt( parser );
+
+ /* position the parser right before the `dup' of the first subr */
+ T1_Skip_PS_Token( parser ); /* `array' */
+ if ( parser->root.error )
+ return;
+ T1_Skip_Spaces( parser );
+
+ /* initialize subrs array -- with synthetic fonts it is possible */
+ /* we get here twice */
+ if ( !loader->num_subrs )
+ {
+ error = psaux->ps_table_funcs->init( table, num_subrs, memory );
+ if ( error )
+ goto Fail;
+ }
+
+ /* the format is simple: */
+ /* */
+ /* `index' + binary data */
+ /* */
+ for (;;)
+ {
+ FT_Long idx, size;
+ FT_Byte* base;
+
+
+ /* If we are out of data, or if the next token isn't `dup', */
+ /* we are done. */
+ if ( parser->root.cursor + 4 >= parser->root.limit ||
+ ft_strncmp( (char*)parser->root.cursor, "dup", 3 ) != 0 )
+ break;
+
+ T1_Skip_PS_Token( parser ); /* `dup' */
+
+ idx = T1_ToInt( parser );
+
+ if ( !read_binary_data( parser, &size, &base, IS_INCREMENTAL ) )
+ return;
+
+ /* The binary string is followed by one token, e.g. `NP' */
+ /* (bound to `noaccess put') or by two separate tokens: */
+ /* `noaccess' & `put'. We position the parser right */
+ /* before the next `dup', if any. */
+ T1_Skip_PS_Token( parser ); /* `NP' or `|' or `noaccess' */
+ if ( parser->root.error )
+ return;
+ T1_Skip_Spaces ( parser );
+
+ if ( parser->root.cursor + 4 < parser->root.limit &&
+ ft_strncmp( (char*)parser->root.cursor, "put", 3 ) == 0 )
+ {
+ T1_Skip_PS_Token( parser ); /* skip `put' */
+ T1_Skip_Spaces ( parser );
+ }
+
+ /* with synthetic fonts it is possible we get here twice */
+ if ( loader->num_subrs )
+ continue;
+
+ /* some fonts use a value of -1 for lenIV to indicate that */
+ /* the charstrings are unencoded */
+ /* */
+ /* thanks to Tom Kacvinsky for pointing this out */
+ /* */
+ if ( face->type1.private_dict.lenIV >= 0 )
+ {
+ FT_Byte* temp;
+
+
+ /* some fonts define empty subr records -- this is not totally */
+ /* compliant to the specification (which says they should at */
+ /* least contain a `return'), but we support them anyway */
+ if ( size < face->type1.private_dict.lenIV )
+ {
+ error = FT_THROW( Invalid_File_Format );
+ goto Fail;
+ }
+
+ /* t1_decrypt() shouldn't write to base -- make temporary copy */
+ if ( FT_ALLOC( temp, size ) )
+ goto Fail;
+ FT_MEM_COPY( temp, base, size );
+ psaux->t1_decrypt( temp, size, 4330 );
+ size -= face->type1.private_dict.lenIV;
+ error = T1_Add_Table( table, (FT_Int)idx,
+ temp + face->type1.private_dict.lenIV, size );
+ FT_FREE( temp );
+ }
+ else
+ error = T1_Add_Table( table, (FT_Int)idx, base, size );
+ if ( error )
+ goto Fail;
+ }
+
+ if ( !loader->num_subrs )
+ loader->num_subrs = num_subrs;
+
+ return;
+
+ Fail:
+ parser->root.error = error;
+ }
+
+
+#define TABLE_EXTEND 5
+
+
+ static void
+ parse_charstrings( T1_Face face,
+ T1_Loader loader )
+ {
+ T1_Parser parser = &loader->parser;
+ PS_Table code_table = &loader->charstrings;
+ PS_Table name_table = &loader->glyph_names;
+ PS_Table swap_table = &loader->swap_table;
+ FT_Memory memory = parser->root.memory;
+ FT_Error error;
+
+ PSAux_Service psaux = (PSAux_Service)face->psaux;
+
+ FT_Byte* cur;
+ FT_Byte* limit = parser->root.limit;
+ FT_Int n, num_glyphs;
+ FT_UInt notdef_index = 0;
+ FT_Byte notdef_found = 0;
+
+
+ num_glyphs = (FT_Int)T1_ToInt( parser );
+ if ( num_glyphs < 0 )
+ {
+ error = FT_THROW( Invalid_File_Format );
+ goto Fail;
+ }
+
+ /* some fonts like Optima-Oblique not only define the /CharStrings */
+ /* array but access it also */
+ if ( num_glyphs == 0 || parser->root.error )
+ return;
+
+ /* initialize tables, leaving space for addition of .notdef, */
+ /* if necessary, and a few other glyphs to handle buggy */
+ /* fonts which have more glyphs than specified. */
+
+ /* for some non-standard fonts like `Optima' which provides */
+ /* different outlines depending on the resolution it is */
+ /* possible to get here twice */
+ if ( !loader->num_glyphs )
+ {
+ error = psaux->ps_table_funcs->init(
+ code_table, num_glyphs + 1 + TABLE_EXTEND, memory );
+ if ( error )
+ goto Fail;
+
+ error = psaux->ps_table_funcs->init(
+ name_table, num_glyphs + 1 + TABLE_EXTEND, memory );
+ if ( error )
+ goto Fail;
+
+ /* Initialize table for swapping index notdef_index and */
+ /* index 0 names and codes (if necessary). */
+
+ error = psaux->ps_table_funcs->init( swap_table, 4, memory );
+ if ( error )
+ goto Fail;
+ }
+
+ n = 0;
+
+ for (;;)
+ {
+ FT_Long size;
+ FT_Byte* base;
+
+
+ /* the format is simple: */
+ /* `/glyphname' + binary data */
+
+ T1_Skip_Spaces( parser );
+
+ cur = parser->root.cursor;
+ if ( cur >= limit )
+ break;
+
+ /* we stop when we find a `def' or `end' keyword */
+ if ( cur + 3 < limit && IS_PS_DELIM( cur[3] ) )
+ {
+ if ( cur[0] == 'd' &&
+ cur[1] == 'e' &&
+ cur[2] == 'f' )
+ {
+ /* There are fonts which have this: */
+ /* */
+ /* /CharStrings 118 dict def */
+ /* Private begin */
+ /* CharStrings begin */
+ /* ... */
+ /* */
+ /* To catch this we ignore `def' if */
+ /* no charstring has actually been */
+ /* seen. */
+ if ( n )
+ break;
+ }
+
+ if ( cur[0] == 'e' &&
+ cur[1] == 'n' &&
+ cur[2] == 'd' )
+ break;
+ }
+
+ T1_Skip_PS_Token( parser );
+ if ( parser->root.error )
+ return;
+
+ if ( *cur == '/' )
+ {
+ FT_PtrDist len;
+
+
+ if ( cur + 1 >= limit )
+ {
+ error = FT_THROW( Invalid_File_Format );
+ goto Fail;
+ }
+
+ cur++; /* skip `/' */
+ len = parser->root.cursor - cur;
+
+ if ( !read_binary_data( parser, &size, &base, IS_INCREMENTAL ) )
+ return;
+ /* xhl: Add boundary check here. Fix the bug reported by ifilter. */
+ /* TESTDOC: bug# 0018509, 45.pdf. */
+ if (base + size >= limit) {
+ error = T1_Err_Invalid_File_Format;
+ goto Fail;
+ }
+ /* for some non-standard fonts like `Optima' which provides */
+ /* different outlines depending on the resolution it is */
+ /* possible to get here twice */
+ if ( loader->num_glyphs )
+ continue;
+
+ error = T1_Add_Table( name_table, n, cur, len + 1 );
+ if ( error )
+ goto Fail;
+
+ /* add a trailing zero to the name table */
+ name_table->elements[n][len] = '\0';
+
+ /* record index of /.notdef */
+ if ( *cur == '.' &&
+ ft_strcmp( ".notdef",
+ (const char*)(name_table->elements[n]) ) == 0 )
+ {
+ notdef_index = n;
+ notdef_found = 1;
+ }
+
+ if ( face->type1.private_dict.lenIV >= 0 &&
+ n < num_glyphs + TABLE_EXTEND )
+ {
+ FT_Byte* temp;
+
+
+ if ( size <= face->type1.private_dict.lenIV )
+ {
+ error = FT_THROW( Invalid_File_Format );
+ goto Fail;
+ }
+
+ /* t1_decrypt() shouldn't write to base -- make temporary copy */
+ if ( FT_ALLOC( temp, size ) )
+ goto Fail;
+ FT_MEM_COPY( temp, base, size );
+ psaux->t1_decrypt( temp, size, 4330 );
+ size -= face->type1.private_dict.lenIV;
+ error = T1_Add_Table( code_table, n,
+ temp + face->type1.private_dict.lenIV, size );
+ FT_FREE( temp );
+ }
+ else
+ error = T1_Add_Table( code_table, n, base, size );
+ if ( error )
+ goto Fail;
+
+ n++;
+ }
+ }
+
+ loader->num_glyphs = n;
+
+ /* if /.notdef is found but does not occupy index 0, do our magic. */
+ if ( notdef_found &&
+ ft_strcmp( ".notdef", (const char*)name_table->elements[0] ) )
+ {
+ /* Swap glyph in index 0 with /.notdef glyph. First, add index 0 */
+ /* name and code entries to swap_table. Then place notdef_index */
+ /* name and code entries into swap_table. Then swap name and code */
+ /* entries at indices notdef_index and 0 using values stored in */
+ /* swap_table. */
+
+ /* Index 0 name */
+ error = T1_Add_Table( swap_table, 0,
+ name_table->elements[0],
+ name_table->lengths [0] );
+ if ( error )
+ goto Fail;
+
+ /* Index 0 code */
+ error = T1_Add_Table( swap_table, 1,
+ code_table->elements[0],
+ code_table->lengths [0] );
+ if ( error )
+ goto Fail;
+
+ /* Index notdef_index name */
+ error = T1_Add_Table( swap_table, 2,
+ name_table->elements[notdef_index],
+ name_table->lengths [notdef_index] );
+ if ( error )
+ goto Fail;
+
+ /* Index notdef_index code */
+ error = T1_Add_Table( swap_table, 3,
+ code_table->elements[notdef_index],
+ code_table->lengths [notdef_index] );
+ if ( error )
+ goto Fail;
+
+ error = T1_Add_Table( name_table, notdef_index,
+ swap_table->elements[0],
+ swap_table->lengths [0] );
+ if ( error )
+ goto Fail;
+
+ error = T1_Add_Table( code_table, notdef_index,
+ swap_table->elements[1],
+ swap_table->lengths [1] );
+ if ( error )
+ goto Fail;
+
+ error = T1_Add_Table( name_table, 0,
+ swap_table->elements[2],
+ swap_table->lengths [2] );
+ if ( error )
+ goto Fail;
+
+ error = T1_Add_Table( code_table, 0,
+ swap_table->elements[3],
+ swap_table->lengths [3] );
+ if ( error )
+ goto Fail;
+
+ }
+ else if ( !notdef_found )
+ {
+ /* notdef_index is already 0, or /.notdef is undefined in */
+ /* charstrings dictionary. Worry about /.notdef undefined. */
+ /* We take index 0 and add it to the end of the table(s) */
+ /* and add our own /.notdef glyph to index 0. */
+
+ /* 0 333 hsbw endchar */
+ FT_Byte notdef_glyph[] = { 0x8B, 0xF7, 0xE1, 0x0D, 0x0E };
+ char* notdef_name = (char *)".notdef";
+
+
+ error = T1_Add_Table( swap_table, 0,
+ name_table->elements[0],
+ name_table->lengths [0] );
+ if ( error )
+ goto Fail;
+
+ error = T1_Add_Table( swap_table, 1,
+ code_table->elements[0],
+ code_table->lengths [0] );
+ if ( error )
+ goto Fail;
+
+ error = T1_Add_Table( name_table, 0, notdef_name, 8 );
+ if ( error )
+ goto Fail;
+
+ error = T1_Add_Table( code_table, 0, notdef_glyph, 5 );
+
+ if ( error )
+ goto Fail;
+
+ error = T1_Add_Table( name_table, n,
+ swap_table->elements[0],
+ swap_table->lengths [0] );
+ if ( error )
+ goto Fail;
+
+ error = T1_Add_Table( code_table, n,
+ swap_table->elements[1],
+ swap_table->lengths [1] );
+ if ( error )
+ goto Fail;
+
+ /* we added a glyph. */
+ loader->num_glyphs += 1;
+ }
+
+ return;
+
+ Fail:
+ parser->root.error = error;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* Define the token field static variables. This is a set of */
+ /* T1_FieldRec variables. */
+ /* */
+ /*************************************************************************/
+
+
+ static
+ const T1_FieldRec t1_keywords[] =
+ {
+
+#include "t1tokens.h"
+
+ /* now add the special functions... */
+ T1_FIELD_CALLBACK( "FontMatrix", t1_parse_font_matrix,
+ T1_FIELD_DICT_FONTDICT )
+ T1_FIELD_CALLBACK( "Encoding", parse_encoding,
+ T1_FIELD_DICT_FONTDICT )
+ T1_FIELD_CALLBACK( "Subrs", parse_subrs,
+ T1_FIELD_DICT_PRIVATE )
+ T1_FIELD_CALLBACK( "CharStrings", parse_charstrings,
+ T1_FIELD_DICT_PRIVATE )
+ T1_FIELD_CALLBACK( "Private", parse_private,
+ T1_FIELD_DICT_FONTDICT )
+
+#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT
+ T1_FIELD_CALLBACK( "BlendDesignPositions", parse_blend_design_positions,
+ T1_FIELD_DICT_FONTDICT )
+ T1_FIELD_CALLBACK( "BlendDesignMap", parse_blend_design_map,
+ T1_FIELD_DICT_FONTDICT )
+ T1_FIELD_CALLBACK( "BlendAxisTypes", parse_blend_axis_types,
+ T1_FIELD_DICT_FONTDICT )
+ T1_FIELD_CALLBACK( "WeightVector", parse_weight_vector,
+ T1_FIELD_DICT_FONTDICT )
+ T1_FIELD_CALLBACK( "BuildCharArray", parse_buildchar,
+ T1_FIELD_DICT_PRIVATE )
+#endif
+
+ { 0, T1_FIELD_LOCATION_CID_INFO, T1_FIELD_TYPE_NONE, 0, 0, 0, 0, 0, 0 }
+ };
+
+
+#define T1_FIELD_COUNT \
+ ( sizeof ( t1_keywords ) / sizeof ( t1_keywords[0] ) )
+
+
+ static FT_Error
+ parse_dict( T1_Face face,
+ T1_Loader loader,
+ FT_Byte* base,
+ FT_Long size )
+ {
+ T1_Parser parser = &loader->parser;
+ FT_Byte *limit, *start_binary = NULL;
+ FT_Bool have_integer = 0;
+
+
+ parser->root.cursor = base;
+ parser->root.limit = base + size;
+ parser->root.error = FT_Err_Ok;
+
+ limit = parser->root.limit;
+
+ T1_Skip_Spaces( parser );
+
+ while ( parser->root.cursor < limit )
+ {
+ FT_Byte* cur;
+
+
+ cur = parser->root.cursor;
+
+ /* look for `eexec' */
+ if ( IS_PS_TOKEN( cur, limit, "eexec" ) )
+ break;
+
+ /* look for `closefile' which ends the eexec section */
+ else if ( IS_PS_TOKEN( cur, limit, "closefile" ) )
+ break;
+
+ /* in a synthetic font the base font starts after a */
+ /* `FontDictionary' token that is placed after a Private dict */
+ else if ( IS_PS_TOKEN( cur, limit, "FontDirectory" ) )
+ {
+ if ( loader->keywords_encountered & T1_PRIVATE )
+ loader->keywords_encountered |=
+ T1_FONTDIR_AFTER_PRIVATE;
+ parser->root.cursor += 13;
+ }
+
+ /* check whether we have an integer */
+ else if ( ft_isdigit( *cur ) )
+ {
+ start_binary = cur;
+ T1_Skip_PS_Token( parser );
+ if ( parser->root.error )
+ goto Exit;
+ have_integer = 1;
+ }
+
+ /* in valid Type 1 fonts we don't see `RD' or `-|' directly */
+ /* since those tokens are handled by parse_subrs and */
+ /* parse_charstrings */
+ else if ( *cur == 'R' && cur + 6 < limit && *(cur + 1) == 'D' &&
+ have_integer )
+ {
+ FT_Long s;
+ FT_Byte* b;
+
+
+ parser->root.cursor = start_binary;
+ if ( !read_binary_data( parser, &s, &b, IS_INCREMENTAL ) )
+ return FT_THROW( Invalid_File_Format );
+ have_integer = 0;
+ }
+
+ else if ( *cur == '-' && cur + 6 < limit && *(cur + 1) == '|' &&
+ have_integer )
+ {
+ FT_Long s;
+ FT_Byte* b;
+
+
+ parser->root.cursor = start_binary;
+ if ( !read_binary_data( parser, &s, &b, IS_INCREMENTAL ) )
+ return FT_THROW( Invalid_File_Format );
+ have_integer = 0;
+ }
+
+ /* look for immediates */
+ else if ( *cur == '/' && cur + 2 < limit )
+ {
+ FT_PtrDist len;
+
+
+ cur++;
+
+ parser->root.cursor = cur;
+ T1_Skip_PS_Token( parser );
+ if ( parser->root.error )
+ goto Exit;
+
+ len = parser->root.cursor - cur;
+
+ if ( len > 0 && len < 22 && parser->root.cursor < limit )
+ {
+ /* now compare the immediate name to the keyword table */
+ T1_Field keyword = (T1_Field)t1_keywords;
+
+
+ for (;;)
+ {
+ FT_Byte* name;
+
+
+ name = (FT_Byte*)keyword->ident;
+ if ( !name )
+ break;
+
+ if ( cur[0] == name[0] &&
+ len == (FT_PtrDist)ft_strlen( (const char *)name ) &&
+ ft_memcmp( cur, name, len ) == 0 )
+ {
+ /* We found it -- run the parsing callback! */
+ /* We record every instance of every field */
+ /* (until we reach the base font of a */
+ /* synthetic font) to deal adequately with */
+ /* multiple master fonts; this is also */
+ /* necessary because later PostScript */
+ /* definitions override earlier ones. */
+
+ /* Once we encounter `FontDirectory' after */
+ /* `/Private', we know that this is a synthetic */
+ /* font; except for `/CharStrings' we are not */
+ /* interested in anything that follows this */
+ /* `FontDirectory'. */
+
+ /* MM fonts have more than one /Private token at */
+ /* the top level; let's hope that all the junk */
+ /* that follows the first /Private token is not */
+ /* interesting to us. */
+
+ /* According to Adobe Tech Note #5175 (CID-Keyed */
+ /* Font Installation for ATM Software) a `begin' */
+ /* must be followed by exactly one `end', and */
+ /* `begin' -- `end' pairs must be accurately */
+ /* paired. We could use this to distinguish */
+ /* between the global Private and the Private */
+ /* dict that is a member of the Blend dict. */
+
+ const FT_UInt dict =
+ ( loader->keywords_encountered & T1_PRIVATE )
+ ? T1_FIELD_DICT_PRIVATE
+ : T1_FIELD_DICT_FONTDICT;
+
+ if ( !( dict & keyword->dict ) )
+ {
+ FT_TRACE1(( "parse_dict: found `%s' but ignoring it"
+ " since it is in the wrong dictionary\n",
+ keyword->ident ));
+ break;
+ }
+
+ if ( !( loader->keywords_encountered &
+ T1_FONTDIR_AFTER_PRIVATE ) ||
+ ft_strcmp( (const char*)name, "CharStrings" ) == 0 )
+ {
+ parser->root.error = t1_load_keyword( face,
+ loader,
+ keyword );
+ if ( parser->root.error != FT_Err_Ok )
+ {
+ if ( FT_ERR_EQ( parser->root.error, Ignore ) )
+ parser->root.error = FT_Err_Ok;
+ else
+ return parser->root.error;
+ }
+ }
+ break;
+ }
+
+ keyword++;
+ }
+ }
+
+ have_integer = 0;
+ }
+ else
+ {
+ T1_Skip_PS_Token( parser );
+ if ( parser->root.error )
+ goto Exit;
+ have_integer = 0;
+ }
+
+ T1_Skip_Spaces( parser );
+ }
+
+ Exit:
+ return parser->root.error;
+ }
+
+
+ static void
+ t1_init_loader( T1_Loader loader,
+ T1_Face face )
+ {
+ FT_UNUSED( face );
+
+ FT_MEM_ZERO( loader, sizeof ( *loader ) );
+ loader->num_glyphs = 0;
+ loader->num_chars = 0;
+
+ /* initialize the tables -- simply set their `init' field to 0 */
+ loader->encoding_table.init = 0;
+ loader->charstrings.init = 0;
+ loader->glyph_names.init = 0;
+ loader->subrs.init = 0;
+ loader->swap_table.init = 0;
+ loader->fontdata = 0;
+ loader->keywords_encountered = 0;
+ }
+
+
+ static void
+ t1_done_loader( T1_Loader loader )
+ {
+ T1_Parser parser = &loader->parser;
+
+
+ /* finalize tables */
+ T1_Release_Table( &loader->encoding_table );
+ T1_Release_Table( &loader->charstrings );
+ T1_Release_Table( &loader->glyph_names );
+ T1_Release_Table( &loader->swap_table );
+ T1_Release_Table( &loader->subrs );
+
+ /* finalize parser */
+ T1_Finalize_Parser( parser );
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ T1_Open_Face( T1_Face face )
+ {
+ T1_LoaderRec loader;
+ T1_Parser parser;
+ T1_Font type1 = &face->type1;
+ PS_Private priv = &type1->private_dict;
+ FT_Error error;
+
+ PSAux_Service psaux = (PSAux_Service)face->psaux;
+
+
+ t1_init_loader( &loader, face );
+
+ /* default values */
+ face->ndv_idx = -1;
+ face->cdv_idx = -1;
+ face->len_buildchar = 0;
+
+ priv->blue_shift = 7;
+ priv->blue_fuzz = 1;
+ priv->lenIV = 4;
+ priv->expansion_factor = (FT_Fixed)( 0.06 * 0x10000L );
+ priv->blue_scale = (FT_Fixed)( 0.039625 * 0x10000L * 1000 );
+
+ parser = &loader.parser;
+ error = T1_New_Parser( parser,
+ face->root.stream,
+ face->root.memory,
+ psaux );
+ if ( error )
+ goto Exit;
+
+ error = parse_dict( face, &loader,
+ parser->base_dict, parser->base_len );
+ if ( error )
+ goto Exit;
+
+ error = T1_Get_Private_Dict( parser, psaux );
+ if ( error )
+ goto Exit;
+
+ error = parse_dict( face, &loader,
+ parser->private_dict, parser->private_len );
+ if ( error )
+ goto Exit;
+
+ /* ensure even-ness of `num_blue_values' */
+ priv->num_blue_values &= ~1;
+
+#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT
+
+ if ( face->blend &&
+ face->blend->num_default_design_vector != 0 &&
+ face->blend->num_default_design_vector != face->blend->num_axis )
+ {
+ /* we don't use it currently so just warn, reset, and ignore */
+ FT_ERROR(( "T1_Open_Face(): /DesignVector contains %u entries "
+ "while there are %u axes.\n",
+ face->blend->num_default_design_vector,
+ face->blend->num_axis ));
+
+ face->blend->num_default_design_vector = 0;
+ }
+
+ /* the following can happen for MM instances; we then treat the */
+ /* font as a normal PS font */
+ if ( face->blend &&
+ ( !face->blend->num_designs || !face->blend->num_axis ) )
+ T1_Done_Blend( face );
+
+ /* another safety check */
+ if ( face->blend )
+ {
+ FT_UInt i;
+
+
+ for ( i = 0; i < face->blend->num_axis; i++ )
+ if ( !face->blend->design_map[i].num_points )
+ {
+ T1_Done_Blend( face );
+ break;
+ }
+ }
+
+ if ( face->blend )
+ {
+ if ( face->len_buildchar > 0 )
+ {
+ FT_Memory memory = face->root.memory;
+
+
+ if ( FT_NEW_ARRAY( face->buildchar, face->len_buildchar ) )
+ {
+ FT_ERROR(( "T1_Open_Face: cannot allocate BuildCharArray\n" ));
+ face->len_buildchar = 0;
+ goto Exit;
+ }
+ }
+ }
+ else
+ face->len_buildchar = 0;
+
+#endif /* !T1_CONFIG_OPTION_NO_MM_SUPPORT */
+
+ /* now, propagate the subrs, charstrings, and glyphnames tables */
+ /* to the Type1 data */
+ type1->num_glyphs = loader.num_glyphs;
+
+ if ( loader.subrs.init )
+ {
+ loader.subrs.init = 0;
+ type1->num_subrs = loader.num_subrs;
+ type1->subrs_block = loader.subrs.block;
+ type1->subrs = loader.subrs.elements;
+ type1->subrs_len = loader.subrs.lengths;
+ }
+
+ if ( !IS_INCREMENTAL )
+ if ( !loader.charstrings.init )
+ {
+ FT_ERROR(( "T1_Open_Face: no `/CharStrings' array in face\n" ));
+ error = FT_THROW( Invalid_File_Format );
+ }
+
+ loader.charstrings.init = 0;
+ type1->charstrings_block = loader.charstrings.block;
+ type1->charstrings = loader.charstrings.elements;
+ type1->charstrings_len = loader.charstrings.lengths;
+
+ /* we copy the glyph names `block' and `elements' fields; */
+ /* the `lengths' field must be released later */
+ type1->glyph_names_block = loader.glyph_names.block;
+ type1->glyph_names = (FT_String**)loader.glyph_names.elements;
+ loader.glyph_names.block = 0;
+ loader.glyph_names.elements = 0;
+
+ /* we must now build type1.encoding when we have a custom array */
+ if ( type1->encoding_type == T1_ENCODING_TYPE_ARRAY )
+ {
+ FT_Int charcode, idx, min_char, max_char;
+ FT_Byte* char_name;
+ FT_Byte* glyph_name;
+
+
+ /* OK, we do the following: for each element in the encoding */
+ /* table, look up the index of the glyph having the same name */
+ /* the index is then stored in type1.encoding.char_index, and */
+ /* the name to type1.encoding.char_name */
+
+ min_char = 0;
+ max_char = 0;
+
+ charcode = 0;
+ for ( ; charcode < loader.encoding_table.max_elems; charcode++ )
+ {
+ type1->encoding.char_index[charcode] = 0;
+ type1->encoding.char_name [charcode] = (char *)".notdef";
+
+ char_name = loader.encoding_table.elements[charcode];
+ if ( char_name )
+ for ( idx = 0; idx < type1->num_glyphs; idx++ )
+ {
+ glyph_name = (FT_Byte*)type1->glyph_names[idx];
+ if ( ft_strcmp( (const char*)char_name,
+ (const char*)glyph_name ) == 0 )
+ {
+ type1->encoding.char_index[charcode] = (FT_UShort)idx;
+ type1->encoding.char_name [charcode] = (char*)glyph_name;
+
+ /* Change min/max encoded char only if glyph name is */
+ /* not /.notdef */
+ if ( ft_strcmp( (const char*)".notdef",
+ (const char*)glyph_name ) != 0 )
+ {
+ if ( charcode < min_char )
+ min_char = charcode;
+ if ( charcode >= max_char )
+ max_char = charcode + 1;
+ }
+ break;
+ }
+ }
+ }
+
+ type1->encoding.code_first = min_char;
+ type1->encoding.code_last = max_char;
+ type1->encoding.num_chars = loader.num_chars;
+ }
+
+ Exit:
+ t1_done_loader( &loader );
+ return error;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1load.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1load.h
new file mode 100644
index 0000000000..d01744c4cb
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1load.h
@@ -0,0 +1,102 @@
+/***************************************************************************/
+/* */
+/* t1load.h */
+/* */
+/* Type 1 font loader (specification). */
+/* */
+/* Copyright 1996-2001, 2002, 2004, 2006, 2007 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __T1LOAD_H__
+#define __T1LOAD_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/internal/psaux.h"
+#include "../../include/freetype/ftmm.h"
+
+#include "t1parse.h"
+
+
+FT_BEGIN_HEADER
+
+
+ typedef struct T1_Loader_
+ {
+ T1_ParserRec parser; /* parser used to read the stream */
+
+ FT_Int num_chars; /* number of characters in encoding */
+ PS_TableRec encoding_table; /* PS_Table used to store the */
+ /* encoding character names */
+
+ FT_Int num_glyphs;
+ PS_TableRec glyph_names;
+ PS_TableRec charstrings;
+ PS_TableRec swap_table; /* For moving .notdef glyph to index 0. */
+
+ FT_Int num_subrs;
+ PS_TableRec subrs;
+ FT_Bool fontdata;
+
+ FT_UInt keywords_encountered; /* T1_LOADER_ENCOUNTERED_XXX */
+
+ } T1_LoaderRec, *T1_Loader;
+
+
+ /* treatment of some keywords differs depending on whether */
+ /* they precede or follow certain other keywords */
+
+#define T1_PRIVATE ( 1 << 0 )
+#define T1_FONTDIR_AFTER_PRIVATE ( 1 << 1 )
+
+
+ FT_LOCAL( FT_Error )
+ T1_Open_Face( T1_Face face );
+
+#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT
+
+ FT_LOCAL( FT_Error )
+ T1_Get_Multi_Master( T1_Face face,
+ FT_Multi_Master* master );
+
+ FT_LOCAL_DEF( FT_Error )
+ T1_Get_MM_Var( T1_Face face,
+ FT_MM_Var* *master );
+
+ FT_LOCAL( FT_Error )
+ T1_Set_MM_Blend( T1_Face face,
+ FT_UInt num_coords,
+ FT_Fixed* coords );
+
+ FT_LOCAL( FT_Error )
+ T1_Set_MM_Design( T1_Face face,
+ FT_UInt num_coords,
+ FT_Long* coords );
+
+ FT_LOCAL_DEF( FT_Error )
+ T1_Set_Var_Design( T1_Face face,
+ FT_UInt num_coords,
+ FT_Fixed* coords );
+
+ FT_LOCAL( void )
+ T1_Done_Blend( T1_Face face );
+
+#endif /* !T1_CONFIG_OPTION_NO_MM_SUPPORT */
+
+
+FT_END_HEADER
+
+#endif /* __T1LOAD_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1objs.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1objs.c
new file mode 100644
index 0000000000..81b230381c
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1objs.c
@@ -0,0 +1,616 @@
+/***************************************************************************/
+/* */
+/* t1objs.c */
+/* */
+/* Type 1 objects manager (body). */
+/* */
+/* Copyright 1996-2009, 2011, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftcalc.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/ttnameid.h"
+
+#include "t1gload.h"
+#include "t1load.h"
+
+#include "t1errors.h"
+
+#ifndef T1_CONFIG_OPTION_NO_AFM
+#include "t1afm.h"
+#endif
+
+#include "../../include/freetype/internal/services/svpscmap.h"
+#include "../../include/freetype/internal/psaux.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_t1objs
+
+
+ /*************************************************************************/
+ /* */
+ /* SIZE FUNCTIONS */
+ /* */
+ /* note that we store the global hints in the size's "internal" root */
+ /* field */
+ /* */
+ /*************************************************************************/
+
+
+ static PSH_Globals_Funcs
+ T1_Size_Get_Globals_Funcs( T1_Size size )
+ {
+ T1_Face face = (T1_Face)size->root.face;
+ PSHinter_Service pshinter = (PSHinter_Service)face->pshinter;
+ FT_Module module;
+
+
+ module = FT_Get_Module( size->root.face->driver->root.library,
+ "pshinter" );
+ return ( module && pshinter && pshinter->get_globals_funcs )
+ ? pshinter->get_globals_funcs( module )
+ : 0 ;
+ }
+
+
+ FT_LOCAL_DEF( void )
+ T1_Size_Done( FT_Size t1size ) /* T1_Size */
+ {
+ T1_Size size = (T1_Size)t1size;
+
+
+ if ( size->root.internal )
+ {
+ PSH_Globals_Funcs funcs;
+
+
+ funcs = T1_Size_Get_Globals_Funcs( size );
+ if ( funcs )
+ funcs->destroy( (PSH_Globals)size->root.internal );
+
+ size->root.internal = 0;
+ }
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ T1_Size_Init( FT_Size t1size ) /* T1_Size */
+ {
+ T1_Size size = (T1_Size)t1size;
+ FT_Error error = FT_Err_Ok;
+ PSH_Globals_Funcs funcs = T1_Size_Get_Globals_Funcs( size );
+
+
+ if ( funcs )
+ {
+ PSH_Globals globals;
+ T1_Face face = (T1_Face)size->root.face;
+
+
+ error = funcs->create( size->root.face->memory,
+ &face->type1.private_dict, &globals );
+ if ( !error )
+ size->root.internal = (FT_Size_Internal)(void*)globals;
+ }
+
+ return error;
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ T1_Size_Request( FT_Size t1size, /* T1_Size */
+ FT_Size_Request req )
+ {
+ T1_Size size = (T1_Size)t1size;
+ PSH_Globals_Funcs funcs = T1_Size_Get_Globals_Funcs( size );
+
+
+ FT_Request_Metrics( size->root.face, req );
+
+ if ( funcs )
+ funcs->set_scale( (PSH_Globals)size->root.internal,
+ size->root.metrics.x_scale,
+ size->root.metrics.y_scale,
+ 0, 0 );
+
+ return FT_Err_Ok;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* SLOT FUNCTIONS */
+ /* */
+ /*************************************************************************/
+
+ FT_LOCAL_DEF( void )
+ T1_GlyphSlot_Done( FT_GlyphSlot slot )
+ {
+ slot->internal->glyph_hints = 0;
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ T1_GlyphSlot_Init( FT_GlyphSlot slot )
+ {
+ T1_Face face;
+ PSHinter_Service pshinter;
+
+
+ face = (T1_Face)slot->face;
+ pshinter = (PSHinter_Service)face->pshinter;
+
+ if ( pshinter )
+ {
+ FT_Module module;
+
+
+ module = FT_Get_Module( slot->face->driver->root.library,
+ "pshinter" );
+ if ( module )
+ {
+ T1_Hints_Funcs funcs;
+
+
+ funcs = pshinter->get_t1_funcs( module );
+ slot->internal->glyph_hints = (void*)funcs;
+ }
+ }
+
+ return 0;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* FACE FUNCTIONS */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* T1_Face_Done */
+ /* */
+ /* <Description> */
+ /* The face object destructor. */
+ /* */
+ /* <Input> */
+ /* face :: A typeless pointer to the face object to destroy. */
+ /* */
+ FT_LOCAL_DEF( void )
+ T1_Face_Done( FT_Face t1face ) /* T1_Face */
+ {
+ T1_Face face = (T1_Face)t1face;
+ FT_Memory memory;
+ T1_Font type1;
+
+
+ if ( !face )
+ return;
+
+ memory = face->root.memory;
+ type1 = &face->type1;
+
+#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT
+ /* release multiple masters information */
+ FT_ASSERT( ( face->len_buildchar == 0 ) == ( face->buildchar == NULL ) );
+
+ if ( face->buildchar )
+ {
+ FT_FREE( face->buildchar );
+
+ face->buildchar = NULL;
+ face->len_buildchar = 0;
+ }
+
+ T1_Done_Blend( face );
+ face->blend = 0;
+#endif
+
+ /* release font info strings */
+ {
+ PS_FontInfo info = &type1->font_info;
+
+
+ FT_FREE( info->version );
+ FT_FREE( info->notice );
+ FT_FREE( info->full_name );
+ FT_FREE( info->family_name );
+ FT_FREE( info->weight );
+ }
+
+ /* release top dictionary */
+ FT_FREE( type1->charstrings_len );
+ FT_FREE( type1->charstrings );
+ FT_FREE( type1->glyph_names );
+
+ FT_FREE( type1->subrs );
+ FT_FREE( type1->subrs_len );
+
+ FT_FREE( type1->subrs_block );
+ FT_FREE( type1->charstrings_block );
+ FT_FREE( type1->glyph_names_block );
+
+ FT_FREE( type1->encoding.char_index );
+ FT_FREE( type1->encoding.char_name );
+ FT_FREE( type1->font_name );
+
+#ifndef T1_CONFIG_OPTION_NO_AFM
+ /* release afm data if present */
+ if ( face->afm_data )
+ T1_Done_Metrics( memory, (AFM_FontInfo)face->afm_data );
+#endif
+
+ /* release unicode map, if any */
+#if 0
+ FT_FREE( face->unicode_map_rec.maps );
+ face->unicode_map_rec.num_maps = 0;
+ face->unicode_map = NULL;
+#endif
+
+ face->root.family_name = NULL;
+ face->root.style_name = NULL;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* T1_Face_Init */
+ /* */
+ /* <Description> */
+ /* The face object constructor. */
+ /* */
+ /* <Input> */
+ /* stream :: input stream where to load font data. */
+ /* */
+ /* face_index :: The index of the font face in the resource. */
+ /* */
+ /* num_params :: Number of additional generic parameters. Ignored. */
+ /* */
+ /* params :: Additional generic parameters. Ignored. */
+ /* */
+ /* <InOut> */
+ /* face :: The face record to build. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ T1_Face_Init( FT_Stream stream,
+ FT_Face t1face, /* T1_Face */
+ FT_Int face_index,
+ FT_Int num_params,
+ FT_Parameter* params )
+ {
+ T1_Face face = (T1_Face)t1face;
+ FT_Error error;
+ FT_Service_PsCMaps psnames;
+ PSAux_Service psaux;
+ T1_Font type1 = &face->type1;
+ PS_FontInfo info = &type1->font_info;
+
+ FT_UNUSED( num_params );
+ FT_UNUSED( params );
+ FT_UNUSED( stream );
+
+
+ face->root.num_faces = 1;
+
+ FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS );
+ face->psnames = psnames;
+
+ face->psaux = FT_Get_Module_Interface( FT_FACE_LIBRARY( face ),
+ "psaux" );
+ psaux = (PSAux_Service)face->psaux;
+ if ( !psaux )
+ {
+ FT_ERROR(( "T1_Face_Init: cannot access `psaux' module\n" ));
+ error = FT_THROW( Missing_Module );
+ goto Exit;
+ }
+
+ face->pshinter = FT_Get_Module_Interface( FT_FACE_LIBRARY( face ),
+ "pshinter" );
+
+ FT_TRACE2(( "Type 1 driver\n" ));
+
+ /* open the tokenizer; this will also check the font format */
+ error = T1_Open_Face( face );
+ if ( error )
+ goto Exit;
+
+ /* if we just wanted to check the format, leave successfully now */
+ if ( face_index < 0 )
+ goto Exit;
+
+ /* check the face index */
+ if ( face_index > 0 )
+ {
+ FT_ERROR(( "T1_Face_Init: invalid face index\n" ));
+ error = FT_THROW( Invalid_Argument );
+ goto Exit;
+ }
+
+ /* now load the font program into the face object */
+
+ /* initialize the face object fields */
+
+ /* set up root face fields */
+ {
+ FT_Face root = (FT_Face)&face->root;
+
+
+ root->num_glyphs = type1->num_glyphs;
+ root->face_index = 0;
+
+ root->face_flags = FT_FACE_FLAG_SCALABLE |
+ FT_FACE_FLAG_HORIZONTAL |
+ FT_FACE_FLAG_GLYPH_NAMES |
+ FT_FACE_FLAG_HINTER;
+
+ if ( info->is_fixed_pitch )
+ root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH;
+
+ if ( face->blend )
+ root->face_flags |= FT_FACE_FLAG_MULTIPLE_MASTERS;
+
+ /* XXX: TODO -- add kerning with .afm support */
+
+
+ /* The following code to extract the family and the style is very */
+ /* simplistic and might get some things wrong. For a full-featured */
+ /* algorithm you might have a look at the whitepaper given at */
+ /* */
+ /* http://blogs.msdn.com/text/archive/2007/04/23/wpf-font-selection-model.aspx */
+
+ /* get style name -- be careful, some broken fonts only */
+ /* have a `/FontName' dictionary entry! */
+ root->family_name = info->family_name;
+ root->style_name = NULL;
+
+ if ( root->family_name )
+ {
+ char* full = info->full_name;
+ char* family = root->family_name;
+
+
+ if ( full )
+ {
+ FT_Bool the_same = TRUE;
+
+
+ while ( *full )
+ {
+ if ( *full == *family )
+ {
+ family++;
+ full++;
+ }
+ else
+ {
+ if ( *full == ' ' || *full == '-' )
+ full++;
+ else if ( *family == ' ' || *family == '-' )
+ family++;
+ else
+ {
+ the_same = FALSE;
+
+ if ( !*family )
+ root->style_name = full;
+ break;
+ }
+ }
+ }
+
+ if ( the_same )
+ root->style_name = (char *)"Regular";
+ }
+ }
+ else
+ {
+ /* do we have a `/FontName'? */
+ if ( type1->font_name )
+ root->family_name = type1->font_name;
+ }
+
+ if ( !root->style_name )
+ {
+ if ( info->weight )
+ root->style_name = info->weight;
+ else
+ /* assume `Regular' style because we don't know better */
+ root->style_name = (char *)"Regular";
+ }
+
+ /* compute style flags */
+ root->style_flags = 0;
+ if ( info->italic_angle )
+ root->style_flags |= FT_STYLE_FLAG_ITALIC;
+ if ( info->weight )
+ {
+ if ( !ft_strcmp( info->weight, "Bold" ) ||
+ !ft_strcmp( info->weight, "Black" ) )
+ root->style_flags |= FT_STYLE_FLAG_BOLD;
+ }
+
+ /* no embedded bitmap support */
+ root->num_fixed_sizes = 0;
+ root->available_sizes = 0;
+
+ root->bbox.xMin = type1->font_bbox.xMin >> 16;
+ root->bbox.yMin = type1->font_bbox.yMin >> 16;
+ /* no `U' suffix here to 0xFFFF! */
+ root->bbox.xMax = ( type1->font_bbox.xMax + 0xFFFF ) >> 16;
+ root->bbox.yMax = ( type1->font_bbox.yMax + 0xFFFF ) >> 16;
+
+ /* Set units_per_EM if we didn't set it in t1_parse_font_matrix. */
+ if ( !root->units_per_EM )
+ root->units_per_EM = 1000;
+
+ root->ascender = (FT_Short)( root->bbox.yMax );
+ root->descender = (FT_Short)( root->bbox.yMin );
+
+ root->height = (FT_Short)( ( root->units_per_EM * 12 ) / 10 );
+ if ( root->height < root->ascender - root->descender )
+ root->height = (FT_Short)( root->ascender - root->descender );
+
+ /* now compute the maximum advance width */
+ root->max_advance_width =
+ (FT_Short)( root->bbox.xMax );
+ {
+ FT_Pos max_advance;
+
+
+ error = T1_Compute_Max_Advance( face, &max_advance );
+
+ /* in case of error, keep the standard width */
+ if ( !error )
+ root->max_advance_width = (FT_Short)FIXED_TO_INT( max_advance );
+ else
+ error = FT_Err_Ok; /* clear error */
+ }
+
+ root->max_advance_height = root->height;
+
+ root->underline_position = (FT_Short)info->underline_position;
+ root->underline_thickness = (FT_Short)info->underline_thickness;
+ }
+
+ {
+ FT_Face root = &face->root;
+
+
+ if ( psnames )
+ {
+ FT_CharMapRec charmap;
+ T1_CMap_Classes cmap_classes = psaux->t1_cmap_classes;
+ FT_CMap_Class clazz;
+
+
+ charmap.face = root;
+
+ /* first of all, try to synthesize a Unicode charmap */
+ charmap.platform_id = TT_PLATFORM_MICROSOFT;
+ charmap.encoding_id = TT_MS_ID_UNICODE_CS;
+ charmap.encoding = FT_ENCODING_UNICODE;
+
+ error = FT_CMap_New( cmap_classes->unicode, NULL, &charmap, NULL );
+ if ( error &&
+ FT_ERR_NEQ( error, No_Unicode_Glyph_Name ) )
+ goto Exit;
+ error = FT_Err_Ok;
+
+ /* now, generate an Adobe Standard encoding when appropriate */
+ charmap.platform_id = TT_PLATFORM_ADOBE;
+ clazz = NULL;
+
+ switch ( type1->encoding_type )
+ {
+ case T1_ENCODING_TYPE_STANDARD:
+ charmap.encoding = FT_ENCODING_ADOBE_STANDARD;
+ charmap.encoding_id = TT_ADOBE_ID_STANDARD;
+ clazz = cmap_classes->standard;
+ break;
+
+ case T1_ENCODING_TYPE_EXPERT:
+ charmap.encoding = FT_ENCODING_ADOBE_EXPERT;
+ charmap.encoding_id = TT_ADOBE_ID_EXPERT;
+ clazz = cmap_classes->expert;
+ break;
+
+ case T1_ENCODING_TYPE_ARRAY:
+ charmap.encoding = FT_ENCODING_ADOBE_CUSTOM;
+ charmap.encoding_id = TT_ADOBE_ID_CUSTOM;
+ clazz = cmap_classes->custom;
+ break;
+
+ case T1_ENCODING_TYPE_ISOLATIN1:
+ charmap.encoding = FT_ENCODING_ADOBE_LATIN_1;
+ charmap.encoding_id = TT_ADOBE_ID_LATIN_1;
+ clazz = cmap_classes->unicode;
+ break;
+
+ default:
+ ;
+ }
+
+ if ( clazz )
+ error = FT_CMap_New( clazz, NULL, &charmap, NULL );
+
+#if 0
+ /* Select default charmap */
+ if (root->num_charmaps)
+ root->charmap = root->charmaps[0];
+#endif
+ }
+ }
+
+ Exit:
+ return error;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* T1_Driver_Init */
+ /* */
+ /* <Description> */
+ /* Initializes a given Type 1 driver object. */
+ /* */
+ /* <Input> */
+ /* driver :: A handle to the target driver object. */
+ /* */
+ /* <Return> */
+ /* FreeType error code. 0 means success. */
+ /* */
+ FT_LOCAL_DEF( FT_Error )
+ T1_Driver_Init( FT_Module driver )
+ {
+ FT_UNUSED( driver );
+
+ return FT_Err_Ok;
+ }
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* T1_Driver_Done */
+ /* */
+ /* <Description> */
+ /* Finalizes a given Type 1 driver. */
+ /* */
+ /* <Input> */
+ /* driver :: A handle to the target Type 1 driver. */
+ /* */
+ FT_LOCAL_DEF( void )
+ T1_Driver_Done( FT_Module driver )
+ {
+ FT_UNUSED( driver );
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1objs.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1objs.h
new file mode 100644
index 0000000000..338cfc257f
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1objs.h
@@ -0,0 +1,160 @@
+/***************************************************************************/
+/* */
+/* t1objs.h */
+/* */
+/* Type 1 objects manager (specification). */
+/* */
+/* Copyright 1996-2001, 2002, 2006, 2011 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __T1OBJS_H__
+#define __T1OBJS_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftobjs.h"
+#include "../../include/freetype/config/ftconfig.h"
+#include "../../include/freetype/internal/t1types.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /* The following structures must be defined by the hinter */
+ typedef struct T1_Size_Hints_ T1_Size_Hints;
+ typedef struct T1_Glyph_Hints_ T1_Glyph_Hints;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* T1_Size */
+ /* */
+ /* <Description> */
+ /* A handle to a Type 1 size object. */
+ /* */
+ typedef struct T1_SizeRec_* T1_Size;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* T1_GlyphSlot */
+ /* */
+ /* <Description> */
+ /* A handle to a Type 1 glyph slot object. */
+ /* */
+ typedef struct T1_GlyphSlotRec_* T1_GlyphSlot;
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* T1_CharMap */
+ /* */
+ /* <Description> */
+ /* A handle to a Type 1 character mapping object. */
+ /* */
+ /* <Note> */
+ /* The Type 1 format doesn't use a charmap but an encoding table. */
+ /* The driver is responsible for making up charmap objects */
+ /* corresponding to these tables. */
+ /* */
+ typedef struct T1_CharMapRec_* T1_CharMap;
+
+
+ /*************************************************************************/
+ /* */
+ /* HERE BEGINS THE TYPE1 SPECIFIC STUFF */
+ /* */
+ /*************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* T1_SizeRec */
+ /* */
+ /* <Description> */
+ /* Type 1 size record. */
+ /* */
+ typedef struct T1_SizeRec_
+ {
+ FT_SizeRec root;
+
+ } T1_SizeRec;
+
+
+ FT_LOCAL( void )
+ T1_Size_Done( FT_Size size );
+
+ FT_LOCAL( FT_Error )
+ T1_Size_Request( FT_Size size,
+ FT_Size_Request req );
+
+ FT_LOCAL( FT_Error )
+ T1_Size_Init( FT_Size size );
+
+
+ /*************************************************************************/
+ /* */
+ /* <Type> */
+ /* T1_GlyphSlotRec */
+ /* */
+ /* <Description> */
+ /* Type 1 glyph slot record. */
+ /* */
+ typedef struct T1_GlyphSlotRec_
+ {
+ FT_GlyphSlotRec root;
+
+ FT_Bool hint;
+ FT_Bool scaled;
+
+ FT_Int max_points;
+ FT_Int max_contours;
+
+ FT_Fixed x_scale;
+ FT_Fixed y_scale;
+
+ } T1_GlyphSlotRec;
+
+
+ FT_LOCAL( FT_Error )
+ T1_Face_Init( FT_Stream stream,
+ FT_Face face,
+ FT_Int face_index,
+ FT_Int num_params,
+ FT_Parameter* params );
+
+ FT_LOCAL( void )
+ T1_Face_Done( FT_Face face );
+
+ FT_LOCAL( FT_Error )
+ T1_GlyphSlot_Init( FT_GlyphSlot slot );
+
+ FT_LOCAL( void )
+ T1_GlyphSlot_Done( FT_GlyphSlot slot );
+
+ FT_LOCAL( FT_Error )
+ T1_Driver_Init( FT_Module driver );
+
+ FT_LOCAL( void )
+ T1_Driver_Done( FT_Module driver );
+
+
+FT_END_HEADER
+
+#endif /* __T1OBJS_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1parse.c b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1parse.c
new file mode 100644
index 0000000000..293d69abc8
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1parse.c
@@ -0,0 +1,497 @@
+/***************************************************************************/
+/* */
+/* t1parse.c */
+/* */
+/* Type 1 parser (body). */
+/* */
+/* Copyright 1996-2005, 2008, 2009, 2012, 2013 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+ /*************************************************************************/
+ /* */
+ /* The Type 1 parser is in charge of the following: */
+ /* */
+ /* - provide an implementation of a growing sequence of objects called */
+ /* a `T1_Table' (used to build various tables needed by the loader). */
+ /* */
+ /* - opening .pfb and .pfa files to extract their top-level and private */
+ /* dictionaries. */
+ /* */
+ /* - read numbers, arrays & strings from any dictionary. */
+ /* */
+ /* See `t1load.c' to see how data is loaded from the font file. */
+ /* */
+ /*************************************************************************/
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/ftdebug.h"
+#include "../../include/freetype/internal/ftstream.h"
+#include "../../include/freetype/internal/psaux.h"
+
+#include "t1parse.h"
+
+#include "t1errors.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_t1parse
+
+
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+ /***** *****/
+ /***** INPUT STREAM PARSER *****/
+ /***** *****/
+ /*************************************************************************/
+ /*************************************************************************/
+ /*************************************************************************/
+
+
+ /* see Adobe Technical Note 5040.Download_Fonts.pdf */
+
+ static FT_Error
+ read_pfb_tag( FT_Stream stream,
+ FT_UShort *atag,
+ FT_ULong *asize )
+ {
+ FT_Error error;
+ FT_UShort tag;
+ FT_ULong size;
+
+
+ *atag = 0;
+ *asize = 0;
+
+ if ( !FT_READ_USHORT( tag ) )
+ {
+ if ( tag == 0x8001U || tag == 0x8002U )
+ {
+ if ( !FT_READ_ULONG_LE( size ) )
+ *asize = size;
+ }
+
+ *atag = tag;
+ }
+
+ return error;
+ }
+
+
+ static FT_Error
+ check_type1_format( FT_Stream stream,
+ const char* header_string,
+ size_t header_length )
+ {
+ FT_Error error;
+ FT_UShort tag;
+ FT_ULong dummy;
+
+
+ if ( FT_STREAM_SEEK( 0 ) )
+ goto Exit;
+
+ error = read_pfb_tag( stream, &tag, &dummy );
+ if ( error )
+ goto Exit;
+
+ /* We assume that the first segment in a PFB is always encoded as */
+ /* text. This might be wrong (and the specification doesn't insist */
+ /* on that), but we have never seen a counterexample. */
+ if ( tag != 0x8001U && FT_STREAM_SEEK( 0 ) )
+ goto Exit;
+
+ if ( !FT_FRAME_ENTER( header_length ) )
+ {
+ error = FT_Err_Ok;
+
+ if ( ft_memcmp( stream->cursor, header_string, header_length ) != 0 )
+ error = FT_THROW( Unknown_File_Format );
+
+ FT_FRAME_EXIT();
+ }
+
+ Exit:
+ return error;
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ T1_New_Parser( T1_Parser parser,
+ FT_Stream stream,
+ FT_Memory memory,
+ PSAux_Service psaux )
+ {
+ FT_Error error;
+ FT_UShort tag;
+ FT_ULong size;
+
+
+ psaux->ps_parser_funcs->init( &parser->root, 0, 0, memory );
+
+ parser->stream = stream;
+ parser->base_len = 0;
+ parser->base_dict = 0;
+ parser->private_len = 0;
+ parser->private_dict = 0;
+ parser->in_pfb = 0;
+ parser->in_memory = 0;
+ parser->single_block = 0;
+
+ /* check the header format */
+ error = check_type1_format( stream, "%!PS-AdobeFont", 14 );
+ if ( error )
+ {
+ if ( FT_ERR_NEQ( error, Unknown_File_Format ) )
+ goto Exit;
+
+ error = check_type1_format( stream, "%!FontType", 10 );
+ if ( error )
+ {
+ FT_TRACE2(( " not a Type 1 font\n" ));
+ goto Exit;
+ }
+ }
+
+ /******************************************************************/
+ /* */
+ /* Here a short summary of what is going on: */
+ /* */
+ /* When creating a new Type 1 parser, we try to locate and load */
+ /* the base dictionary if this is possible (i.e., for PFB */
+ /* files). Otherwise, we load the whole font into memory. */
+ /* */
+ /* When `loading' the base dictionary, we only setup pointers */
+ /* in the case of a memory-based stream. Otherwise, we */
+ /* allocate and load the base dictionary in it. */
+ /* */
+ /* parser->in_pfb is set if we are in a binary (`.pfb') font. */
+ /* parser->in_memory is set if we have a memory stream. */
+ /* */
+
+ /* try to compute the size of the base dictionary; */
+ /* look for a Postscript binary file tag, i.e., 0x8001 */
+ if ( FT_STREAM_SEEK( 0L ) )
+ goto Exit;
+
+ error = read_pfb_tag( stream, &tag, &size );
+ if ( error )
+ goto Exit;
+
+ if ( tag != 0x8001U )
+ {
+ /* assume that this is a PFA file for now; an error will */
+ /* be produced later when more things are checked */
+ if ( FT_STREAM_SEEK( 0L ) )
+ goto Exit;
+ size = stream->size;
+ }
+ else
+ parser->in_pfb = 1;
+
+ /* now, try to load `size' bytes of the `base' dictionary we */
+ /* found previously */
+
+ /* if it is a memory-based resource, set up pointers */
+ if ( !stream->read )
+ {
+ parser->base_dict = (FT_Byte*)stream->base + stream->pos;
+ parser->base_len = size;
+ parser->in_memory = 1;
+
+ /* check that the `size' field is valid */
+ if ( FT_STREAM_SKIP( size ) )
+ goto Exit;
+ }
+ else
+ {
+ /* read segment in memory -- this is clumsy, but so does the format */
+ if ( FT_ALLOC( parser->base_dict, size ) ||
+ FT_STREAM_READ( parser->base_dict, size ) )
+ goto Exit;
+ parser->base_len = size;
+ }
+
+ parser->root.base = parser->base_dict;
+ parser->root.cursor = parser->base_dict;
+ parser->root.limit = parser->root.cursor + parser->base_len;
+
+ Exit:
+ if ( error && !parser->in_memory )
+ FT_FREE( parser->base_dict );
+
+ return error;
+ }
+
+
+ FT_LOCAL_DEF( void )
+ T1_Finalize_Parser( T1_Parser parser )
+ {
+ FT_Memory memory = parser->root.memory;
+
+
+ /* always free the private dictionary */
+ FT_FREE( parser->private_dict );
+
+ /* free the base dictionary only when we have a disk stream */
+ if ( !parser->in_memory )
+ FT_FREE( parser->base_dict );
+
+ parser->root.funcs.done( &parser->root );
+ }
+
+
+ FT_LOCAL_DEF( FT_Error )
+ T1_Get_Private_Dict( T1_Parser parser,
+ PSAux_Service psaux )
+ {
+ FT_Stream stream = parser->stream;
+ FT_Memory memory = parser->root.memory;
+ FT_Error error = FT_Err_Ok;
+ FT_ULong size;
+
+
+ if ( parser->in_pfb )
+ {
+ /* in the case of the PFB format, the private dictionary can be */
+ /* made of several segments. We thus first read the number of */
+ /* segments to compute the total size of the private dictionary */
+ /* then re-read them into memory. */
+ FT_Long start_pos = FT_STREAM_POS();
+ FT_UShort tag;
+
+
+ parser->private_len = 0;
+ for (;;)
+ {
+ error = read_pfb_tag( stream, &tag, &size );
+ if ( error )
+ goto Fail;
+
+ if ( tag != 0x8002U )
+ break;
+
+ parser->private_len += size;
+
+ if ( FT_STREAM_SKIP( size ) )
+ goto Fail;
+ }
+
+ /* Check that we have a private dictionary there */
+ /* and allocate private dictionary buffer */
+ if ( parser->private_len == 0 )
+ {
+ FT_ERROR(( "T1_Get_Private_Dict:"
+ " invalid private dictionary section\n" ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Fail;
+ }
+
+ if ( FT_STREAM_SEEK( start_pos ) ||
+ FT_ALLOC( parser->private_dict, parser->private_len ) )
+ goto Fail;
+
+ parser->private_len = 0;
+ for (;;)
+ {
+ error = read_pfb_tag( stream, &tag, &size );
+ if ( error || tag != 0x8002U )
+ {
+ error = FT_Err_Ok;
+ break;
+ }
+
+ if ( FT_STREAM_READ( parser->private_dict + parser->private_len,
+ size ) )
+ goto Fail;
+
+ parser->private_len += size;
+ }
+ }
+ else
+ {
+ /* We have already `loaded' the whole PFA font file into memory; */
+ /* if this is a memory resource, allocate a new block to hold */
+ /* the private dict. Otherwise, simply overwrite into the base */
+ /* dictionary block in the heap. */
+
+ /* first of all, look at the `eexec' keyword */
+ FT_Byte* cur = parser->base_dict;
+ FT_Byte* limit = cur + parser->base_len;
+ FT_Byte c;
+
+
+ Again:
+ for (;;)
+ {
+ c = cur[0];
+ if ( c == 'e' && cur + 9 < limit ) /* 9 = 5 letters for `eexec' + */
+ /* whitespace + 4 chars */
+ {
+ if ( cur[1] == 'e' &&
+ cur[2] == 'x' &&
+ cur[3] == 'e' &&
+ cur[4] == 'c' )
+ break;
+ }
+ cur++;
+ if ( cur >= limit )
+ {
+ FT_ERROR(( "T1_Get_Private_Dict:"
+ " could not find `eexec' keyword\n" ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+ }
+
+ /* check whether `eexec' was real -- it could be in a comment */
+ /* or string (as e.g. in u003043t.gsf from ghostscript) */
+
+ parser->root.cursor = parser->base_dict;
+ /* set limit to `eexec' + whitespace + 4 characters */
+ parser->root.limit = cur + 10;
+
+ cur = parser->root.cursor;
+ limit = parser->root.limit;
+
+ while ( cur < limit )
+ {
+ if ( *cur == 'e' && ft_strncmp( (char*)cur, "eexec", 5 ) == 0 )
+ goto Found;
+
+ T1_Skip_PS_Token( parser );
+ if ( parser->root.error )
+ break;
+ T1_Skip_Spaces ( parser );
+ cur = parser->root.cursor;
+ }
+
+ /* we haven't found the correct `eexec'; go back and continue */
+ /* searching */
+
+ cur = limit;
+ limit = parser->base_dict + parser->base_len;
+ goto Again;
+
+ /* now determine where to write the _encrypted_ binary private */
+ /* dictionary. We overwrite the base dictionary for disk-based */
+ /* resources and allocate a new block otherwise */
+
+ Found:
+ parser->root.limit = parser->base_dict + parser->base_len;
+
+ T1_Skip_PS_Token( parser );
+ cur = parser->root.cursor;
+ limit = parser->root.limit;
+
+ /* according to the Type1 spec, the first cipher byte must not be */
+ /* an ASCII whitespace character code (blank, tab, carriage return */
+ /* or line feed). We have seen Type 1 fonts with two line feed */
+ /* characters... So skip now all whitespace character codes. */
+ while ( cur < limit &&
+ ( *cur == ' ' ||
+ *cur == '\t' ||
+ *cur == '\r' ||
+ *cur == '\n' ) )
+ ++cur;
+ if ( cur >= limit )
+ {
+ FT_ERROR(( "T1_Get_Private_Dict:"
+ " `eexec' not properly terminated\n" ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Exit;
+ }
+
+ size = (FT_ULong)( parser->base_len - ( cur - parser->base_dict ) );
+
+ if ( parser->in_memory )
+ {
+ /* note that we allocate one more byte to put a terminating `0' */
+ if ( FT_ALLOC( parser->private_dict, size + 1 ) )
+ goto Fail;
+ parser->private_len = size;
+ }
+ else
+ {
+ parser->single_block = 1;
+ parser->private_dict = parser->base_dict;
+ parser->private_len = size;
+ parser->base_dict = 0;
+ parser->base_len = 0;
+ }
+
+ /* now determine whether the private dictionary is encoded in binary */
+ /* or hexadecimal ASCII format -- decode it accordingly */
+
+ /* we need to access the next 4 bytes (after the final whitespace */
+ /* following the `eexec' keyword); if they all are hexadecimal */
+ /* digits, then we have a case of ASCII storage */
+
+ if ( cur + 3 < limit &&
+ ft_isxdigit( cur[0] ) && ft_isxdigit( cur[1] ) &&
+ ft_isxdigit( cur[2] ) && ft_isxdigit( cur[3] ) )
+ {
+ /* ASCII hexadecimal encoding */
+ FT_Long len;
+
+
+ parser->root.cursor = cur;
+ (void)psaux->ps_parser_funcs->to_bytes( &parser->root,
+ parser->private_dict,
+ parser->private_len,
+ &len,
+ 0 );
+ parser->private_len = len;
+
+ /* put a safeguard */
+ parser->private_dict[len] = '\0';
+ }
+ else
+ /* binary encoding -- copy the private dict */
+ FT_MEM_MOVE( parser->private_dict, cur, size );
+ }
+
+ /* we now decrypt the encoded binary private dictionary */
+ psaux->t1_decrypt( parser->private_dict, parser->private_len, 55665U );
+
+ if ( parser->private_len < 4 )
+ {
+ FT_ERROR(( "T1_Get_Private_Dict:"
+ " invalid private dictionary section\n" ));
+ error = FT_THROW( Invalid_File_Format );
+ goto Fail;
+ }
+
+ /* replace the four random bytes at the beginning with whitespace */
+ parser->private_dict[0] = ' ';
+ parser->private_dict[1] = ' ';
+ parser->private_dict[2] = ' ';
+ parser->private_dict[3] = ' ';
+
+ parser->root.base = parser->private_dict;
+ parser->root.cursor = parser->private_dict;
+ parser->root.limit = parser->root.cursor + parser->private_len;
+
+ Fail:
+ Exit:
+ return error;
+ }
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1parse.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1parse.h
new file mode 100644
index 0000000000..8bb6c43b2a
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1parse.h
@@ -0,0 +1,135 @@
+/***************************************************************************/
+/* */
+/* t1parse.h */
+/* */
+/* Type 1 parser (specification). */
+/* */
+/* Copyright 1996-2001, 2002, 2003, 2008 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __T1PARSE_H__
+#define __T1PARSE_H__
+
+
+#include "../../include/ft2build.h"
+#include "../../include/freetype/internal/t1types.h"
+#include "../../include/freetype/internal/ftstream.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*************************************************************************/
+ /* */
+ /* <Struct> */
+ /* T1_ParserRec */
+ /* */
+ /* <Description> */
+ /* A PS_ParserRec is an object used to parse a Type 1 fonts very */
+ /* quickly. */
+ /* */
+ /* <Fields> */
+ /* root :: The root parser. */
+ /* */
+ /* stream :: The current input stream. */
+ /* */
+ /* base_dict :: A pointer to the top-level dictionary. */
+ /* */
+ /* base_len :: The length in bytes of the top dictionary. */
+ /* */
+ /* private_dict :: A pointer to the private dictionary. */
+ /* */
+ /* private_len :: The length in bytes of the private dictionary. */
+ /* */
+ /* in_pfb :: A boolean. Indicates that we are handling a PFB */
+ /* file. */
+ /* */
+ /* in_memory :: A boolean. Indicates a memory-based stream. */
+ /* */
+ /* single_block :: A boolean. Indicates that the private dictionary */
+ /* is stored in lieu of the base dictionary. */
+ /* */
+ typedef struct T1_ParserRec_
+ {
+ PS_ParserRec root;
+ FT_Stream stream;
+
+ FT_Byte* base_dict;
+ FT_ULong base_len;
+
+ FT_Byte* private_dict;
+ FT_ULong private_len;
+
+ FT_Bool in_pfb;
+ FT_Bool in_memory;
+ FT_Bool single_block;
+
+ } T1_ParserRec, *T1_Parser;
+
+
+#define T1_Add_Table( p, i, o, l ) (p)->funcs.add( (p), i, o, l )
+#define T1_Done_Table( p ) \
+ do \
+ { \
+ if ( (p)->funcs.done ) \
+ (p)->funcs.done( p ); \
+ } while ( 0 )
+#define T1_Release_Table( p ) \
+ do \
+ { \
+ if ( (p)->funcs.release ) \
+ (p)->funcs.release( p ); \
+ } while ( 0 )
+
+
+#define T1_Skip_Spaces( p ) (p)->root.funcs.skip_spaces( &(p)->root )
+#define T1_Skip_PS_Token( p ) (p)->root.funcs.skip_PS_token( &(p)->root )
+
+#define T1_ToInt( p ) (p)->root.funcs.to_int( &(p)->root )
+#define T1_ToFixed( p, t ) (p)->root.funcs.to_fixed( &(p)->root, t )
+
+#define T1_ToCoordArray( p, m, c ) \
+ (p)->root.funcs.to_coord_array( &(p)->root, m, c )
+#define T1_ToFixedArray( p, m, f, t ) \
+ (p)->root.funcs.to_fixed_array( &(p)->root, m, f, t )
+#define T1_ToToken( p, t ) \
+ (p)->root.funcs.to_token( &(p)->root, t )
+#define T1_ToTokenArray( p, t, m, c ) \
+ (p)->root.funcs.to_token_array( &(p)->root, t, m, c )
+
+#define T1_Load_Field( p, f, o, m, pf ) \
+ (p)->root.funcs.load_field( &(p)->root, f, o, m, pf )
+
+#define T1_Load_Field_Table( p, f, o, m, pf ) \
+ (p)->root.funcs.load_field_table( &(p)->root, f, o, m, pf )
+
+
+ FT_LOCAL( FT_Error )
+ T1_New_Parser( T1_Parser parser,
+ FT_Stream stream,
+ FT_Memory memory,
+ PSAux_Service psaux );
+
+ FT_LOCAL( FT_Error )
+ T1_Get_Private_Dict( T1_Parser parser,
+ PSAux_Service psaux );
+
+ FT_LOCAL( void )
+ T1_Finalize_Parser( T1_Parser parser );
+
+
+FT_END_HEADER
+
+#endif /* __T1PARSE_H__ */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1tokens.h b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1tokens.h
new file mode 100644
index 0000000000..e37276b908
--- /dev/null
+++ b/core/src/fxge/fx_freetype/fxft2.5.01/src/type1/t1tokens.h
@@ -0,0 +1,143 @@
+/***************************************************************************/
+/* */
+/* t1tokens.h */
+/* */
+/* Type 1 tokenizer (specification). */
+/* */
+/* Copyright 1996-2001, 2002, 2003, 2004, 2006, 2008, 2009 by */
+/* David Turner, Robert Wilhelm, and Werner Lemberg. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#undef FT_STRUCTURE
+#define FT_STRUCTURE PS_FontInfoRec
+#undef T1CODE
+#define T1CODE T1_FIELD_LOCATION_FONT_INFO
+
+ T1_FIELD_STRING( "version", version,
+ T1_FIELD_DICT_FONTDICT )
+ T1_FIELD_STRING( "Notice", notice,
+ T1_FIELD_DICT_FONTDICT )
+ T1_FIELD_STRING( "FullName", full_name,
+ T1_FIELD_DICT_FONTDICT )
+ T1_FIELD_STRING( "FamilyName", family_name,
+ T1_FIELD_DICT_FONTDICT )
+ T1_FIELD_STRING( "Weight", weight,
+ T1_FIELD_DICT_FONTDICT )
+
+ /* we use pointers to detect modifications made by synthetic fonts */
+ T1_FIELD_NUM ( "ItalicAngle", italic_angle,
+ T1_FIELD_DICT_FONTDICT )
+ T1_FIELD_BOOL ( "isFixedPitch", is_fixed_pitch,
+ T1_FIELD_DICT_FONTDICT )
+ T1_FIELD_NUM ( "UnderlinePosition", underline_position,
+ T1_FIELD_DICT_FONTDICT )
+ T1_FIELD_NUM ( "UnderlineThickness", underline_thickness,
+ T1_FIELD_DICT_FONTDICT )
+
+#undef FT_STRUCTURE
+#define FT_STRUCTURE PS_FontExtraRec
+#undef T1CODE
+#define T1CODE T1_FIELD_LOCATION_FONT_EXTRA
+
+ T1_FIELD_NUM ( "FSType", fs_type,
+ T1_FIELD_DICT_FONTDICT )
+
+#undef FT_STRUCTURE
+#define FT_STRUCTURE PS_PrivateRec
+#undef T1CODE
+#define T1CODE T1_FIELD_LOCATION_PRIVATE
+
+ T1_FIELD_NUM ( "UniqueID", unique_id,
+ T1_FIELD_DICT_FONTDICT | T1_FIELD_DICT_PRIVATE )
+ T1_FIELD_NUM ( "lenIV", lenIV,
+ T1_FIELD_DICT_PRIVATE )
+ T1_FIELD_NUM ( "LanguageGroup", language_group,
+ T1_FIELD_DICT_PRIVATE )
+ T1_FIELD_NUM ( "password", password,
+ T1_FIELD_DICT_PRIVATE )
+
+ T1_FIELD_FIXED_1000( "BlueScale", blue_scale,
+ T1_FIELD_DICT_PRIVATE )
+ T1_FIELD_NUM ( "BlueShift", blue_shift,
+ T1_FIELD_DICT_PRIVATE )
+ T1_FIELD_NUM ( "BlueFuzz", blue_fuzz,
+ T1_FIELD_DICT_PRIVATE )
+
+ T1_FIELD_NUM_TABLE ( "BlueValues", blue_values, 14,
+ T1_FIELD_DICT_PRIVATE )
+ T1_FIELD_NUM_TABLE ( "OtherBlues", other_blues, 10,
+ T1_FIELD_DICT_PRIVATE )
+ T1_FIELD_NUM_TABLE ( "FamilyBlues", family_blues, 14,
+ T1_FIELD_DICT_PRIVATE )
+ T1_FIELD_NUM_TABLE ( "FamilyOtherBlues", family_other_blues, 10,
+ T1_FIELD_DICT_PRIVATE )
+
+ T1_FIELD_NUM_TABLE2( "StdHW", standard_width, 1,
+ T1_FIELD_DICT_PRIVATE )
+ T1_FIELD_NUM_TABLE2( "StdVW", standard_height, 1,
+ T1_FIELD_DICT_PRIVATE )
+ T1_FIELD_NUM_TABLE2( "MinFeature", min_feature, 2,
+ T1_FIELD_DICT_PRIVATE )
+
+ T1_FIELD_NUM_TABLE ( "StemSnapH", snap_widths, 12,
+ T1_FIELD_DICT_PRIVATE )
+ T1_FIELD_NUM_TABLE ( "StemSnapV", snap_heights, 12,
+ T1_FIELD_DICT_PRIVATE )
+
+ T1_FIELD_FIXED ( "ExpansionFactor", expansion_factor,
+ T1_FIELD_DICT_PRIVATE )
+ T1_FIELD_BOOL ( "ForceBold", force_bold,
+ T1_FIELD_DICT_PRIVATE )
+
+
+#undef FT_STRUCTURE
+#define FT_STRUCTURE T1_FontRec
+#undef T1CODE
+#define T1CODE T1_FIELD_LOCATION_FONT_DICT
+
+ T1_FIELD_KEY ( "FontName", font_name, T1_FIELD_DICT_FONTDICT )
+ T1_FIELD_NUM ( "PaintType", paint_type, T1_FIELD_DICT_FONTDICT )
+ T1_FIELD_NUM ( "FontType", font_type, T1_FIELD_DICT_FONTDICT )
+ T1_FIELD_FIXED( "StrokeWidth", stroke_width, T1_FIELD_DICT_FONTDICT )
+
+
+#undef FT_STRUCTURE
+#define FT_STRUCTURE FT_BBox
+#undef T1CODE
+#define T1CODE T1_FIELD_LOCATION_BBOX
+
+ T1_FIELD_BBOX( "FontBBox", xMin, T1_FIELD_DICT_FONTDICT )
+
+
+#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT
+
+#undef FT_STRUCTURE
+#define FT_STRUCTURE T1_FaceRec
+#undef T1CODE
+#define T1CODE T1_FIELD_LOCATION_FACE
+
+ T1_FIELD_NUM( "NDV", ndv_idx, T1_FIELD_DICT_PRIVATE )
+ T1_FIELD_NUM( "CDV", cdv_idx, T1_FIELD_DICT_PRIVATE )
+
+
+#undef FT_STRUCTURE
+#define FT_STRUCTURE PS_BlendRec
+#undef T1CODE
+#define T1CODE T1_FIELD_LOCATION_BLEND
+
+ T1_FIELD_NUM_TABLE( "DesignVector", default_design_vector,
+ T1_MAX_MM_DESIGNS, T1_FIELD_DICT_FONTDICT )
+
+
+#endif /* T1_CONFIG_OPTION_NO_MM_SUPPORT */
+
+
+/* END */
diff --git a/core/src/fxge/fx_freetype/include/fxft_cffobjs.h b/core/src/fxge/fx_freetype/include/fxft_cffobjs.h
new file mode 100644
index 0000000000..c15e0755b3
--- /dev/null
+++ b/core/src/fxge/fx_freetype/include/fxft_cffobjs.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXFT_CFFOBJS_H_
+#define _FXFT_CFFOBJS_H_
+#include "../fxft2.5.01/src/cff/cffobjs.h"
+#endif
diff --git a/core/src/fxge/fx_freetype/include/fxft_cfftypes.h b/core/src/fxge/fx_freetype/include/fxft_cfftypes.h
new file mode 100644
index 0000000000..9fbb7a31f6
--- /dev/null
+++ b/core/src/fxge/fx_freetype/include/fxft_cfftypes.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXFT_FREETYPE_H_
+#define _FXFT_FREETYPE_H_
+#include "../fxft2.5.01/src/cff/cfftypes.h"
+#endif
diff --git a/core/src/fxge/fx_freetype/include/fxft_freetype.h b/core/src/fxge/fx_freetype/include/fxft_freetype.h
new file mode 100644
index 0000000000..92ffde0d79
--- /dev/null
+++ b/core/src/fxge/fx_freetype/include/fxft_freetype.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXFT_FREETYPE_H_
+#define _FXFT_FREETYPE_H_
+#include "../fxft2.5.01/include/freetype/freetype.h"
+#endif
diff --git a/core/src/fxge/fx_freetype/include/fxft_ft2build.h b/core/src/fxge/fx_freetype/include/fxft_ft2build.h
new file mode 100644
index 0000000000..f3438d4b24
--- /dev/null
+++ b/core/src/fxge/fx_freetype/include/fxft_ft2build.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXFT_FT2BUILD_H_
+#define _FXFT_FT2BUILD_H_
+#include "../fxft2.5.01/include/ft2build.h"
+#endif
diff --git a/core/src/fxge/fx_freetype/include/fxft_ftmm.h b/core/src/fxge/fx_freetype/include/fxft_ftmm.h
new file mode 100644
index 0000000000..4b36ef7058
--- /dev/null
+++ b/core/src/fxge/fx_freetype/include/fxft_ftmm.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXFT_FTMM_H_
+#define _FXFT_FTMM_H_
+#include "../fxft2.5.01/include/freetype/ftmm.h"
+#endif
diff --git a/core/src/fxge/fx_freetype/include/fxft_ftobjs.h b/core/src/fxge/fx_freetype/include/fxft_ftobjs.h
new file mode 100644
index 0000000000..40d7eaaccd
--- /dev/null
+++ b/core/src/fxge/fx_freetype/include/fxft_ftobjs.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXFT_FTOBJS_H_
+#define _FXFT_FTOBJS_H_
+#include "../fxft2.5.01/include/freetype/internal/ftobjs.h"
+#endif
diff --git a/core/src/fxge/fx_freetype/include/fxft_ftotval.h b/core/src/fxge/fx_freetype/include/fxft_ftotval.h
new file mode 100644
index 0000000000..f613aa7454
--- /dev/null
+++ b/core/src/fxge/fx_freetype/include/fxft_ftotval.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXFT_FTOTVAL_H_
+#define _FXFT_FTOTVAL_H_
+#include "../fxft2.5.01/include/freetype/ftotval.h"
+#endif
diff --git a/core/src/fxge/fx_freetype/include/fxft_ftoutln.h b/core/src/fxge/fx_freetype/include/fxft_ftoutln.h
new file mode 100644
index 0000000000..14396d8404
--- /dev/null
+++ b/core/src/fxge/fx_freetype/include/fxft_ftoutln.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXFT_FTOUTLN_H_
+#define _FXFT_FTOUTLN_H_
+#include "../fxft2.5.01/include/freetype/ftoutln.h"
+#endif
diff --git a/core/src/fxge/fx_freetype/include/fxft_ftstream.h b/core/src/fxge/fx_freetype/include/fxft_ftstream.h
new file mode 100644
index 0000000000..ff6a4220fa
--- /dev/null
+++ b/core/src/fxge/fx_freetype/include/fxft_ftstream.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXFT_FTSTREAM_H_
+#define _FXFT_FTSTREAM_H_
+#include "../fxft2.5.01/include/freetype/internal/ftstream.h"
+#endif
diff --git a/core/src/fxge/fx_freetype/include/fxft_tttables.h b/core/src/fxge/fx_freetype/include/fxft_tttables.h
new file mode 100644
index 0000000000..3b44fff44c
--- /dev/null
+++ b/core/src/fxge/fx_freetype/include/fxft_tttables.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXFT_TTTABLES_H_
+#define _FXFT_TTTABLES_H_
+#include "../fxft2.5.01/include/freetype/tttables.h"
+#endif
diff --git a/core/src/fxge/fx_freetype/include/fxft_tttypes.h b/core/src/fxge/fx_freetype/include/fxft_tttypes.h
new file mode 100644
index 0000000000..06128debdb
--- /dev/null
+++ b/core/src/fxge/fx_freetype/include/fxft_tttypes.h
@@ -0,0 +1,10 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXFT_TTTYPES_H_
+#define _FXFT_TTTYPES_H_
+#include "../fxft2.5.01/include/freetype/internal/tttypes.h"
+#endif
diff --git a/core/src/fxge/fx_freetype/src/fxft_cff.c b/core/src/fxge/fx_freetype/src/fxft_cff.c
new file mode 100644
index 0000000000..e877b7d945
--- /dev/null
+++ b/core/src/fxge/fx_freetype/src/fxft_cff.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../fxft2.5.01/src/cff/fxft_cff.c"
diff --git a/core/src/fxge/fx_freetype/src/fxft_ftbase.c b/core/src/fxge/fx_freetype/src/fxft_ftbase.c
new file mode 100644
index 0000000000..d769aca860
--- /dev/null
+++ b/core/src/fxge/fx_freetype/src/fxft_ftbase.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../fxft2.5.01/src/base/fxft_ftbase.c"
diff --git a/core/src/fxge/fx_freetype/src/fxft_ftbitmap.c b/core/src/fxge/fx_freetype/src/fxft_ftbitmap.c
new file mode 100644
index 0000000000..2edbc830cc
--- /dev/null
+++ b/core/src/fxge/fx_freetype/src/fxft_ftbitmap.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../fxft2.5.01/src/base/fxft_ftbitmap.c"
diff --git a/core/src/fxge/fx_freetype/src/fxft_ftglyph.c b/core/src/fxge/fx_freetype/src/fxft_ftglyph.c
new file mode 100644
index 0000000000..85855acf60
--- /dev/null
+++ b/core/src/fxge/fx_freetype/src/fxft_ftglyph.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../fxft2.5.01/src/base/fxft_ftglyph.c"
diff --git a/core/src/fxge/fx_freetype/src/fxft_ftinit.c b/core/src/fxge/fx_freetype/src/fxft_ftinit.c
new file mode 100644
index 0000000000..2be4b7fc79
--- /dev/null
+++ b/core/src/fxge/fx_freetype/src/fxft_ftinit.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../fxft2.5.01/src/base/fxft_ftinit.c"
diff --git a/core/src/fxge/fx_freetype/src/fxft_ftlcdfil.c b/core/src/fxge/fx_freetype/src/fxft_ftlcdfil.c
new file mode 100644
index 0000000000..8225ea0d0e
--- /dev/null
+++ b/core/src/fxge/fx_freetype/src/fxft_ftlcdfil.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../fxft2.5.01/src/base/fxft_ftlcdfil.c"
diff --git a/core/src/fxge/fx_freetype/src/fxft_ftmm.c b/core/src/fxge/fx_freetype/src/fxft_ftmm.c
new file mode 100644
index 0000000000..85064469e0
--- /dev/null
+++ b/core/src/fxge/fx_freetype/src/fxft_ftmm.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../fxft2.5.01/src/base/fxft_ftmm.c"
diff --git a/core/src/fxge/fx_freetype/src/fxft_ftsystem.c b/core/src/fxge/fx_freetype/src/fxft_ftsystem.c
new file mode 100644
index 0000000000..36182a38dd
--- /dev/null
+++ b/core/src/fxge/fx_freetype/src/fxft_ftsystem.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../fxft2.5.01/src/base/fxft_ftsystem.c"
diff --git a/core/src/fxge/fx_freetype/src/fxft_psaux.c b/core/src/fxge/fx_freetype/src/fxft_psaux.c
new file mode 100644
index 0000000000..0c6d0cb9f5
--- /dev/null
+++ b/core/src/fxge/fx_freetype/src/fxft_psaux.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../fxft2.5.01/src/psaux/fxft_psaux.c"
diff --git a/core/src/fxge/fx_freetype/src/fxft_pshinter.c b/core/src/fxge/fx_freetype/src/fxft_pshinter.c
new file mode 100644
index 0000000000..02c5d41d48
--- /dev/null
+++ b/core/src/fxge/fx_freetype/src/fxft_pshinter.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../fxft2.5.01/src/pshinter/fxft_pshinter.c"
diff --git a/core/src/fxge/fx_freetype/src/fxft_psmodule.c b/core/src/fxge/fx_freetype/src/fxft_psmodule.c
new file mode 100644
index 0000000000..9495886a56
--- /dev/null
+++ b/core/src/fxge/fx_freetype/src/fxft_psmodule.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../fxft2.5.01/src/psnames/fxft_psmodule.c"
diff --git a/core/src/fxge/fx_freetype/src/fxft_raster.c b/core/src/fxge/fx_freetype/src/fxft_raster.c
new file mode 100644
index 0000000000..a616016f9e
--- /dev/null
+++ b/core/src/fxge/fx_freetype/src/fxft_raster.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../fxft2.5.01/src/raster/fxft_raster.c"
diff --git a/core/src/fxge/fx_freetype/src/fxft_sfnt.c b/core/src/fxge/fx_freetype/src/fxft_sfnt.c
new file mode 100644
index 0000000000..6fa2b57e41
--- /dev/null
+++ b/core/src/fxge/fx_freetype/src/fxft_sfnt.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../fxft2.5.01/src/sfnt/fxft_sfnt.c"
diff --git a/core/src/fxge/fx_freetype/src/fxft_smooth.c b/core/src/fxge/fx_freetype/src/fxft_smooth.c
new file mode 100644
index 0000000000..2cbfa01154
--- /dev/null
+++ b/core/src/fxge/fx_freetype/src/fxft_smooth.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../fxft2.5.01/src/smooth/fxft_smooth.c"
diff --git a/core/src/fxge/fx_freetype/src/fxft_truetype.c b/core/src/fxge/fx_freetype/src/fxft_truetype.c
new file mode 100644
index 0000000000..6ed54960f5
--- /dev/null
+++ b/core/src/fxge/fx_freetype/src/fxft_truetype.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../fxft2.5.01/src/truetype/fxft_truetype.c"
diff --git a/core/src/fxge/fx_freetype/src/fxft_type1.c b/core/src/fxge/fx_freetype/src/fxft_type1.c
new file mode 100644
index 0000000000..d784e0a1f9
--- /dev/null
+++ b/core/src/fxge/fx_freetype/src/fxft_type1.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../fxft2.5.01/src/type1/fxft_type1.c"
diff --git a/core/src/fxge/fx_freetype/src/fxft_type1cid.c b/core/src/fxge/fx_freetype/src/fxft_type1cid.c
new file mode 100644
index 0000000000..b6319f6202
--- /dev/null
+++ b/core/src/fxge/fx_freetype/src/fxft_type1cid.c
@@ -0,0 +1,7 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../fxft2.5.01/src/cid/fxft_type1cid.c"
diff --git a/core/src/fxge/ge/fx_ge.cpp b/core/src/fxge/ge/fx_ge.cpp
new file mode 100644
index 0000000000..df200d5b48
--- /dev/null
+++ b/core/src/fxge/ge/fx_ge.cpp
@@ -0,0 +1,79 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxge/fx_ge.h"
+#include "text_int.h"
+static CFX_GEModule* g_pGEModule = NULL;
+CFX_GEModule::CFX_GEModule()
+{
+ m_pFontCache = NULL;
+ m_pFontMgr = NULL;
+ m_FTLibrary = NULL;
+ m_pCodecModule = NULL;
+ m_pPlatformData = NULL;
+}
+CFX_GEModule::~CFX_GEModule()
+{
+ if (m_pFontCache) {
+ delete m_pFontCache;
+ }
+ m_pFontCache = NULL;
+ if (m_pFontMgr) {
+ delete m_pFontMgr;
+ }
+ m_pFontMgr = NULL;
+ DestroyPlatform();
+}
+CFX_GEModule* CFX_GEModule::Get()
+{
+ return g_pGEModule;
+}
+void CFX_GEModule::Create()
+{
+ g_pGEModule = FX_NEW CFX_GEModule;
+ if (!g_pGEModule) {
+ return;
+ }
+ g_pGEModule->m_pFontMgr = FX_NEW CFX_FontMgr;
+ g_pGEModule->InitPlatform();
+ g_pGEModule->SetTextGamma(2.2f);
+}
+void CFX_GEModule::Use(CFX_GEModule* pModule)
+{
+ g_pGEModule = pModule;
+}
+void CFX_GEModule::Destroy()
+{
+ if (g_pGEModule) {
+ delete g_pGEModule;
+ }
+ g_pGEModule = NULL;
+}
+CFX_FontCache* CFX_GEModule::GetFontCache()
+{
+ if (m_pFontCache == NULL) {
+ m_pFontCache = FX_NEW CFX_FontCache();
+ }
+ return m_pFontCache;
+}
+void CFX_GEModule::SetTextGamma(FX_FLOAT gammaValue)
+{
+ gammaValue /= 2.2f;
+ int i = 0;
+ while (i < 256) {
+ m_GammaValue[i] = (FX_BYTE)(FXSYS_pow((FX_FLOAT)i / 255, gammaValue) * 255.0f + 0.5f);
+ i++;
+ }
+}
+FX_LPCBYTE CFX_GEModule::GetTextGammaTable()
+{
+ return m_GammaValue;
+}
+void CFX_GEModule::SetExtFontMapper(IFX_FontMapper* pFontMapper)
+{
+ GetFontMgr()->m_pExtMapper = pFontMapper;
+ pFontMapper->m_pFontMgr = m_pFontMgr;
+}
diff --git a/core/src/fxge/ge/fx_ge_device.cpp b/core/src/fxge/ge/fx_ge_device.cpp
new file mode 100644
index 0000000000..8f7ccdb7d9
--- /dev/null
+++ b/core/src/fxge/ge/fx_ge_device.cpp
@@ -0,0 +1,405 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxge/fx_ge.h"
+CFX_RenderDevice::CFX_RenderDevice()
+{
+ m_pDeviceDriver = NULL;
+ m_pBitmap = NULL;
+}
+CFX_RenderDevice::~CFX_RenderDevice()
+{
+ if (m_pDeviceDriver) {
+ delete m_pDeviceDriver;
+ }
+}
+void CFX_RenderDevice::SetDeviceDriver(IFX_RenderDeviceDriver* pDriver)
+{
+ if (m_pDeviceDriver) {
+ delete m_pDeviceDriver;
+ }
+ m_pDeviceDriver = pDriver;
+ InitDeviceInfo();
+}
+void CFX_RenderDevice::InitDeviceInfo()
+{
+ ASSERT(m_pDeviceDriver != NULL);
+ m_Width = m_pDeviceDriver->GetDeviceCaps(FXDC_PIXEL_WIDTH);
+ m_Height = m_pDeviceDriver->GetDeviceCaps(FXDC_PIXEL_HEIGHT);
+ m_bpp = m_pDeviceDriver->GetDeviceCaps(FXDC_BITS_PIXEL);
+ m_RenderCaps = m_pDeviceDriver->GetDeviceCaps(FXDC_RENDER_CAPS);
+ m_DeviceClass = m_pDeviceDriver->GetDeviceCaps(FXDC_DEVICE_CLASS);
+ if (!m_pDeviceDriver->GetClipBox(&m_ClipBox)) {
+ m_ClipBox.left = 0;
+ m_ClipBox.top = 0;
+ m_ClipBox.right = m_Width;
+ m_ClipBox.bottom = m_Height;
+ }
+}
+FX_BOOL CFX_RenderDevice::StartRendering()
+{
+ return m_pDeviceDriver->StartRendering();
+}
+void CFX_RenderDevice::EndRendering()
+{
+ m_pDeviceDriver->EndRendering();
+}
+void CFX_RenderDevice::SaveState()
+{
+ m_pDeviceDriver->SaveState();
+}
+void CFX_RenderDevice::RestoreState(FX_BOOL bKeepSaved)
+{
+ m_pDeviceDriver->RestoreState(bKeepSaved);
+ UpdateClipBox();
+}
+int CFX_RenderDevice::GetDeviceCaps(int caps_id) const
+{
+ return m_pDeviceDriver->GetDeviceCaps(caps_id);
+}
+CFX_Matrix CFX_RenderDevice::GetCTM() const
+{
+ return m_pDeviceDriver->GetCTM();
+}
+FX_BOOL CFX_RenderDevice::CreateCompatibleBitmap(CFX_DIBitmap* pDIB, int width, int height) const
+{
+ if (m_RenderCaps & FXRC_CMYK_OUTPUT) {
+ return pDIB->Create(width, height, m_RenderCaps & FXRC_ALPHA_OUTPUT ? FXDIB_Cmyka : FXDIB_Cmyk);
+ } else if (m_RenderCaps & FXRC_BYTEMASK_OUTPUT) {
+ return pDIB->Create(width, height, FXDIB_8bppMask);
+ } else
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ return pDIB->Create(width, height, m_RenderCaps & FXRC_ALPHA_OUTPUT ? FXDIB_Argb : FXDIB_Rgb32);
+#else
+ return pDIB->Create(width, height, m_RenderCaps & FXRC_ALPHA_OUTPUT ? FXDIB_Argb : FXDIB_Rgb);
+#endif
+}
+FX_BOOL CFX_RenderDevice::SetClip_PathFill(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ int fill_mode
+ )
+{
+ if (!m_pDeviceDriver->SetClip_PathFill(pPathData, pObject2Device, fill_mode)) {
+ return FALSE;
+ }
+ UpdateClipBox();
+ return TRUE;
+}
+FX_BOOL CFX_RenderDevice::SetClip_PathStroke(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ const CFX_GraphStateData* pGraphState
+ )
+{
+ if (!m_pDeviceDriver->SetClip_PathStroke(pPathData, pObject2Device, pGraphState)) {
+ return FALSE;
+ }
+ UpdateClipBox();
+ return TRUE;
+}
+FX_BOOL CFX_RenderDevice::SetClip_Rect(const FX_RECT* pRect)
+{
+ CFX_PathData path;
+ path.AppendRect((FX_FLOAT)(pRect->left), (FX_FLOAT)(pRect->bottom), (FX_FLOAT)(pRect->right), (FX_FLOAT)(pRect->top));
+ if (!SetClip_PathFill(&path, NULL, FXFILL_WINDING)) {
+ return FALSE;
+ }
+ UpdateClipBox();
+ return TRUE;
+}
+void CFX_RenderDevice::UpdateClipBox()
+{
+ if (m_pDeviceDriver->GetClipBox(&m_ClipBox)) {
+ return;
+ }
+ m_ClipBox.left = 0;
+ m_ClipBox.top = 0;
+ m_ClipBox.right = m_Width;
+ m_ClipBox.bottom = m_Height;
+}
+FX_BOOL CFX_RenderDevice::DrawPath(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ const CFX_GraphStateData* pGraphState,
+ FX_DWORD fill_color, FX_DWORD stroke_color, int fill_mode,
+ int alpha_flag, void* pIccTransform, int blend_type)
+{
+ FX_BYTE fill_alpha, stroke_alpha;
+ if (FXGETFLAG_COLORTYPE(alpha_flag)) {
+ fill_alpha = FXGETFLAG_ALPHA_FILL(alpha_flag);
+ stroke_alpha = FXGETFLAG_ALPHA_STROKE(alpha_flag);
+ } else {
+ fill_alpha = FXARGB_A(fill_color);
+ stroke_alpha = FXARGB_A(stroke_color);
+ }
+ if ((fill_mode & 3) == 0) {
+ fill_alpha = 0;
+ }
+ if (pGraphState == NULL) {
+ stroke_alpha = 0;
+ }
+ if (stroke_alpha == 0 && pPathData->GetPointCount() == 2) {
+ FX_PATHPOINT* pPoints = pPathData->GetPoints();
+ FX_FLOAT x1, x2, y1, y2;
+ if (pObject2Device) {
+ pObject2Device->Transform(pPoints[0].m_PointX, pPoints[0].m_PointY, x1, y1);
+ pObject2Device->Transform(pPoints[1].m_PointX, pPoints[1].m_PointY, x2, y2);
+ } else {
+ x1 = pPoints[0].m_PointX;
+ y1 = pPoints[0].m_PointY;
+ x2 = pPoints[1].m_PointX;
+ y2 = pPoints[1].m_PointY;
+ }
+ DrawCosmeticLine(x1, y1, x2, y2, fill_color, fill_mode, alpha_flag, pIccTransform, blend_type);
+ return TRUE;
+ }
+ if ((pPathData->GetPointCount() == 5 || pPathData->GetPointCount() == 4) && stroke_alpha == 0) {
+ CFX_FloatRect rect_f;
+ if (!(fill_mode & FXFILL_RECT_AA) && pPathData->IsRect(pObject2Device, &rect_f)) {
+ FX_RECT rect_i = rect_f.GetOutterRect();
+ int width = (int)FXSYS_ceil(rect_f.right - rect_f.left);
+ if (width < 1) {
+ width = 1;
+ if (rect_i.left == rect_i.right) {
+ rect_i.right ++;
+ }
+ }
+ int height = (int)FXSYS_ceil(rect_f.top - rect_f.bottom);
+ if (height < 1) {
+ height = 1;
+ if (rect_i.bottom == rect_i.top) {
+ rect_i.bottom ++;
+ }
+ }
+ if (rect_i.Width() >= width + 1) {
+ if (rect_f.left - (FX_FLOAT)(rect_i.left) > (FX_FLOAT)(rect_i.right) - rect_f.right) {
+ rect_i.left ++;
+ } else {
+ rect_i.right --;
+ }
+ }
+ if (rect_i.Height() >= height + 1) {
+ if (rect_f.top - (FX_FLOAT)(rect_i.top) > (FX_FLOAT)(rect_i.bottom) - rect_f.bottom) {
+ rect_i.top ++;
+ } else {
+ rect_i.bottom --;
+ }
+ }
+ if (FillRect(&rect_i, fill_color, alpha_flag, pIccTransform, blend_type)) {
+ return TRUE;
+ }
+ }
+ }
+ if((fill_mode & 3) && stroke_alpha == 0 && !(fill_mode & FX_FILL_STROKE) && !(fill_mode & FX_FILL_TEXT_MODE)) {
+ CFX_PathData newPath;
+ FX_BOOL bThin = FALSE;
+ if (pPathData->GetZeroAreaPath(newPath, (CFX_Matrix*)pObject2Device, bThin, m_pDeviceDriver->GetDriverType())) {
+ CFX_GraphStateData graphState;
+ graphState.m_LineWidth = 0.0f;
+ FX_DWORD strokecolor = fill_color;
+ if (bThin) {
+ if (FXGETFLAG_COLORTYPE(alpha_flag)) {
+ FXSETFLAG_ALPHA_STROKE(alpha_flag, fill_alpha >> 2);
+ } else {
+ strokecolor = (((fill_alpha >> 2) << 24) | (strokecolor & 0x00ffffff));
+ }
+ }
+ CFX_AffineMatrix* pMatrix = NULL;
+ if (pObject2Device && !pObject2Device->IsIdentity()) {
+ pMatrix = (CFX_AffineMatrix*)pObject2Device;
+ }
+ int smooth_path = FX_ZEROAREA_FILL;
+ if (fill_mode & FXFILL_NOPATHSMOOTH) {
+ smooth_path |= FXFILL_NOPATHSMOOTH;
+ }
+ m_pDeviceDriver->DrawPath(&newPath, pMatrix, &graphState, 0, strokecolor, smooth_path, alpha_flag, pIccTransform, blend_type);
+ }
+ }
+ if ((fill_mode & 3) && fill_alpha && stroke_alpha < 0xff && (fill_mode & FX_FILL_STROKE)) {
+ if (!(m_RenderCaps & FXRC_GET_BITS)) {
+ return FALSE;
+ }
+ CFX_FloatRect bbox;
+ if (pGraphState) {
+ bbox = pPathData->GetBoundingBox(pGraphState->m_LineWidth, pGraphState->m_MiterLimit);
+ } else {
+ bbox = pPathData->GetBoundingBox();
+ }
+ if (pObject2Device) {
+ bbox.Transform(pObject2Device);
+ }
+ CFX_Matrix ctm = GetCTM();
+ FX_FLOAT fScaleX = FXSYS_fabs(ctm.a);
+ FX_FLOAT fScaleY = FXSYS_fabs(ctm.d);
+ FX_RECT rect = bbox.GetOutterRect();
+ CFX_DIBitmap bitmap, Backdrop;
+ if (!CreateCompatibleBitmap(&bitmap, FXSYS_round(rect.Width() * fScaleX), FXSYS_round(rect.Height() * fScaleY))) {
+ return FALSE;
+ }
+ if (bitmap.HasAlpha()) {
+ bitmap.Clear(0);
+ Backdrop.Copy(&bitmap);
+ } else {
+ if (!m_pDeviceDriver->GetDIBits(&bitmap, rect.left, rect.top, NULL)) {
+ return FALSE;
+ }
+ Backdrop.Copy(&bitmap);
+ }
+ CFX_FxgeDevice bitmap_device;
+ bitmap_device.Attach(&bitmap, 0, FALSE, &Backdrop, TRUE);
+ CFX_AffineMatrix matrix;
+ if (pObject2Device) {
+ matrix = *pObject2Device;
+ }
+ matrix.TranslateI(-rect.left, -rect.top);
+ matrix.Concat(fScaleX, 0, 0, fScaleY, 0, 0);
+ if (!bitmap_device.GetDeviceDriver()->DrawPath(pPathData, &matrix, pGraphState, fill_color, stroke_color, fill_mode, alpha_flag, pIccTransform, blend_type)) {
+ return FALSE;
+ }
+ FX_RECT src_rect(0, 0, FXSYS_round(rect.Width() * fScaleX), FXSYS_round(rect.Height() * fScaleY));
+ return m_pDeviceDriver->SetDIBits(&bitmap, 0, &src_rect, rect.left, rect.top, FXDIB_BLEND_NORMAL);
+ }
+ return m_pDeviceDriver->DrawPath(pPathData, pObject2Device, pGraphState, fill_color, stroke_color, fill_mode, alpha_flag, pIccTransform, blend_type);
+}
+FX_BOOL CFX_RenderDevice::SetPixel(int x, int y, FX_DWORD color, int alpha_flag, void* pIccTransform)
+{
+ if (m_pDeviceDriver->SetPixel(x, y, color, alpha_flag, pIccTransform)) {
+ return TRUE;
+ }
+ FX_RECT rect(x, y, x + 1, y + 1);
+ return FillRect(&rect, color, alpha_flag, pIccTransform);
+}
+FX_BOOL CFX_RenderDevice::FillRect(const FX_RECT* pRect, FX_DWORD fill_color, int alpha_flag, void* pIccTransform, int blend_type)
+{
+ if (m_pDeviceDriver->FillRect(pRect, fill_color, alpha_flag, pIccTransform, blend_type)) {
+ return TRUE;
+ }
+ if (!(m_RenderCaps & FXRC_GET_BITS)) {
+ return FALSE;
+ }
+ CFX_DIBitmap bitmap;
+ if (!CreateCompatibleBitmap(&bitmap, pRect->Width(), pRect->Height())) {
+ return FALSE;
+ }
+ if (!m_pDeviceDriver->GetDIBits(&bitmap, pRect->left, pRect->top)) {
+ return FALSE;
+ }
+ if (!bitmap.CompositeRect(0, 0, pRect->Width(), pRect->Height(), fill_color, alpha_flag, pIccTransform)) {
+ return FALSE;
+ }
+ FX_RECT src_rect(0, 0, pRect->Width(), pRect->Height());
+ m_pDeviceDriver->SetDIBits(&bitmap, 0, &src_rect, pRect->left, pRect->top, FXDIB_BLEND_NORMAL);
+ return TRUE;
+}
+FX_BOOL CFX_RenderDevice::DrawCosmeticLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2, FX_DWORD color,
+ int fill_mode, int alpha_flag, void* pIccTransform, int blend_type)
+{
+ if (((m_RenderCaps & FXRC_ALPHA_PATH) &&
+ (FXGETFLAG_COLORTYPE(alpha_flag) && FXGETFLAG_ALPHA_FILL(alpha_flag) == 0xff)) ||
+ color >= 0xff000000)
+ if (m_pDeviceDriver->DrawCosmeticLine(x1, y1, x2, y2, color, alpha_flag, pIccTransform, blend_type)) {
+ return TRUE;
+ }
+ CFX_GraphStateData graph_state;
+ CFX_PathData path;
+ path.SetPointCount(2);
+ path.SetPoint(0, x1, y1, FXPT_MOVETO);
+ path.SetPoint(1, x2, y2, FXPT_LINETO);
+ return m_pDeviceDriver->DrawPath(&path, NULL, &graph_state, 0, color, fill_mode, alpha_flag, pIccTransform, blend_type);
+}
+FX_BOOL CFX_RenderDevice::GetDIBits(CFX_DIBitmap* pBitmap, int left, int top, void* pIccTransform)
+{
+ if (!(m_RenderCaps & FXRC_GET_BITS)) {
+ return FALSE;
+ }
+ return m_pDeviceDriver->GetDIBits(pBitmap, left, top, pIccTransform);
+}
+CFX_DIBitmap* CFX_RenderDevice::GetBackDrop()
+{
+ return m_pDeviceDriver->GetBackDrop();
+}
+FX_BOOL CFX_RenderDevice::SetDIBits(const CFX_DIBSource* pBitmap, int left, int top, int blend_mode,
+ void* pIccTransform)
+{
+ ASSERT(!pBitmap->IsAlphaMask());
+ CFX_AffineMatrix ctm = GetCTM();
+ FX_FLOAT fScaleX = FXSYS_fabs(ctm.a);
+ FX_FLOAT fScaleY = FXSYS_fabs(ctm.d);
+ FX_RECT dest_rect(left, top, FXSYS_round(left + pBitmap->GetWidth() / fScaleX), FXSYS_round(top + pBitmap->GetHeight() / fScaleY));
+ dest_rect.Intersect(m_ClipBox);
+ if (dest_rect.IsEmpty()) {
+ return TRUE;
+ }
+ FX_RECT src_rect(dest_rect.left - left, dest_rect.top - top,
+ dest_rect.left - left + dest_rect.Width(), dest_rect.top - top + dest_rect.Height());
+ src_rect.left = FXSYS_round(src_rect.left * fScaleX);
+ src_rect.top = FXSYS_round(src_rect.top * fScaleY);
+ src_rect.right = FXSYS_round(src_rect.right * fScaleX);
+ src_rect.bottom = FXSYS_round(src_rect.bottom * fScaleY);
+ if ((blend_mode != FXDIB_BLEND_NORMAL && !(m_RenderCaps & FXRC_BLEND_MODE)) ||
+ (pBitmap->HasAlpha() && !(m_RenderCaps & FXRC_ALPHA_IMAGE))) {
+ if (!(m_RenderCaps & FXRC_GET_BITS)) {
+ return FALSE;
+ }
+ int bg_pixel_width = FXSYS_round(dest_rect.Width() * fScaleX);
+ int bg_pixel_height = FXSYS_round(dest_rect.Height() * fScaleY);
+ CFX_DIBitmap background;
+ if (!background.Create(bg_pixel_width, bg_pixel_height,
+ (m_RenderCaps & FXRC_CMYK_OUTPUT) ? FXDIB_Cmyk : FXDIB_Rgb32)) {
+ return FALSE;
+ }
+ if (!m_pDeviceDriver->GetDIBits(&background, dest_rect.left, dest_rect.top)) {
+ return FALSE;
+ }
+ if (!background.CompositeBitmap(0, 0, bg_pixel_width, bg_pixel_height,
+ pBitmap, src_rect.left, src_rect.top,
+ blend_mode, NULL, FALSE, pIccTransform)) {
+ return FALSE;
+ }
+ FX_RECT src_rect(0, 0, bg_pixel_width, bg_pixel_height);
+ return m_pDeviceDriver->SetDIBits(&background, 0, &src_rect, dest_rect.left, dest_rect.top, FXDIB_BLEND_NORMAL);
+ }
+ return m_pDeviceDriver->SetDIBits(pBitmap, 0, &src_rect, dest_rect.left, dest_rect.top, blend_mode, 0, pIccTransform);
+}
+FX_BOOL CFX_RenderDevice::StretchDIBits(const CFX_DIBSource* pBitmap, int left, int top,
+ int dest_width, int dest_height, FX_DWORD flags,
+ void* pIccTransform, int blend_mode)
+{
+ FX_RECT dest_rect(left, top, left + dest_width, top + dest_height);
+ FX_RECT clip_box = m_ClipBox;
+ clip_box.Intersect(dest_rect);
+ if (clip_box.IsEmpty()) {
+ return TRUE;
+ }
+ return m_pDeviceDriver->StretchDIBits(pBitmap, 0, left, top, dest_width, dest_height, &clip_box, flags, 0, pIccTransform, blend_mode);
+}
+FX_BOOL CFX_RenderDevice::SetBitMask(const CFX_DIBSource* pBitmap, int left, int top, FX_DWORD argb,
+ int alpha_flag, void* pIccTransform)
+{
+ FX_RECT src_rect(0, 0, pBitmap->GetWidth(), pBitmap->GetHeight());
+ return m_pDeviceDriver->SetDIBits(pBitmap, argb, &src_rect, left, top, FXDIB_BLEND_NORMAL, alpha_flag, pIccTransform);
+}
+FX_BOOL CFX_RenderDevice::StretchBitMask(const CFX_DIBSource* pBitmap, int left, int top,
+ int dest_width, int dest_height, FX_DWORD argb, FX_DWORD flags,
+ int alpha_flag, void* pIccTransform)
+{
+ FX_RECT dest_rect(left, top, left + dest_width, top + dest_height);
+ FX_RECT clip_box = m_ClipBox;
+ clip_box.Intersect(dest_rect);
+ return m_pDeviceDriver->StretchDIBits(pBitmap, argb, left, top, dest_width, dest_height, &clip_box, flags, alpha_flag, pIccTransform);
+}
+FX_BOOL CFX_RenderDevice::StartDIBits(const CFX_DIBSource* pBitmap, int bitmap_alpha, FX_DWORD argb,
+ const CFX_AffineMatrix* pMatrix, FX_DWORD flags, FX_LPVOID& handle,
+ int alpha_flag, void* pIccTransform, int blend_mode)
+{
+ return m_pDeviceDriver->StartDIBits(pBitmap, bitmap_alpha, argb, pMatrix, flags, handle, alpha_flag, pIccTransform, blend_mode);
+}
+FX_BOOL CFX_RenderDevice::ContinueDIBits(FX_LPVOID handle, IFX_Pause* pPause)
+{
+ return m_pDeviceDriver->ContinueDIBits(handle, pPause);
+}
+void CFX_RenderDevice::CancelDIBits(FX_LPVOID handle)
+{
+ m_pDeviceDriver->CancelDIBits(handle);
+}
diff --git a/core/src/fxge/ge/fx_ge_font.cpp b/core/src/fxge/ge/fx_ge_font.cpp
new file mode 100644
index 0000000000..e047d2ecb0
--- /dev/null
+++ b/core/src/fxge/ge/fx_ge_font.cpp
@@ -0,0 +1,458 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxge/fx_ge.h"
+#include "../../../include/fxge/fx_freetype.h"
+#include "text_int.h"
+#define EM_ADJUST(em, a) (em == 0?(a): (a)*1000/em)
+extern void _FPDFAPI_GetInternalFontData(int id1, FX_LPCBYTE& data, FX_DWORD& size);
+CFX_Font::CFX_Font()
+{
+ m_pSubstFont = NULL;
+ m_Face = NULL;
+ m_bEmbedded = FALSE;
+ m_bVertical = FALSE;
+ m_pFontData = NULL;
+ m_pFontDataAllocation = NULL;
+ m_dwSize = 0;
+ m_pOwnedStream = NULL;
+ m_pGsubData = NULL;
+ m_pPlatformFont = NULL;
+ m_pPlatformFontCollection = NULL;
+ m_pDwFont = NULL;
+ m_hHandle = NULL;
+ m_bDwLoaded = FALSE;
+}
+CFX_Font::~CFX_Font()
+{
+ if (m_pSubstFont) {
+ delete m_pSubstFont;
+ m_pSubstFont = NULL;
+ }
+#ifdef FOXIT_CHROME_BUILD
+ if (m_pFontDataAllocation) {
+ FX_Free(m_pFontDataAllocation);
+ m_pFontDataAllocation = NULL;
+ }
+#endif
+ if (m_Face) {
+#ifdef FOXIT_CHROME_BUILD
+ FXFT_Library library = FXFT_Get_Face_FreeType(m_Face);
+ if (FXFT_Get_Face_External_Stream(m_Face)) {
+ FXFT_Clear_Face_External_Stream(m_Face);
+ }
+#endif
+ if(m_bEmbedded) {
+ DeleteFace();
+ } else {
+ CFX_GEModule::Get()->GetFontMgr()->ReleaseFace(m_Face);
+ }
+ }
+ if (m_pOwnedStream) {
+ FX_Free(m_pOwnedStream);
+ m_pOwnedStream = NULL;
+ }
+ if (m_pGsubData) {
+ FX_Free(m_pGsubData);
+ m_pGsubData = NULL;
+ }
+#if (_FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ && (!defined(_FPDFAPI_MINI_)))
+ ReleasePlatformResource();
+#endif
+}
+void CFX_Font::DeleteFace()
+{
+ FXFT_Done_Face(m_Face);
+ m_Face = NULL;
+}
+FX_BOOL CFX_Font::LoadSubst(const CFX_ByteString& face_name, FX_BOOL bTrueType, FX_DWORD flags,
+ int weight, int italic_angle, int CharsetCP, FX_BOOL bVertical)
+{
+ m_bEmbedded = FALSE;
+ m_bVertical = bVertical;
+ m_pSubstFont = FX_NEW CFX_SubstFont;
+ if (!m_pSubstFont) {
+ return FALSE;
+ }
+ m_Face = CFX_GEModule::Get()->GetFontMgr()->FindSubstFont(face_name, bTrueType, flags, weight, italic_angle,
+ CharsetCP, m_pSubstFont);
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ if(m_pSubstFont->m_ExtHandle) {
+ m_pPlatformFont = m_pSubstFont->m_ExtHandle;
+ m_pSubstFont->m_ExtHandle = NULL;
+ }
+#endif
+ if (m_Face) {
+ m_pFontData = FXFT_Get_Face_Stream_Base(m_Face);
+ m_dwSize = FXFT_Get_Face_Stream_Size(m_Face);
+ }
+ return TRUE;
+}
+extern "C" {
+ unsigned long _FTStreamRead(FXFT_Stream stream, unsigned long offset,
+ unsigned char* buffer, unsigned long count)
+ {
+ if (count == 0) {
+ return 0;
+ }
+ IFX_FileRead* pFile = (IFX_FileRead*)stream->descriptor.pointer;
+ int res = pFile->ReadBlock(buffer, offset, count);
+ if (res) {
+ return count;
+ }
+ return 0;
+ }
+ void _FTStreamClose(FXFT_Stream stream)
+ {
+ }
+};
+FX_BOOL _LoadFile(FXFT_Library library, FXFT_Face* Face, IFX_FileRead* pFile, FXFT_Stream* stream)
+{
+ FXFT_Stream stream1 = (FXFT_Stream)FX_Alloc(FX_BYTE, sizeof (FXFT_StreamRec));
+ if (!stream1) {
+ return FALSE;
+ }
+ stream1->base = NULL;
+ stream1->size = (unsigned long)pFile->GetSize();
+ stream1->pos = 0;
+ stream1->descriptor.pointer = pFile;
+ stream1->close = _FTStreamClose;
+ stream1->read = _FTStreamRead;
+ FXFT_Open_Args args;
+ args.flags = FT_OPEN_STREAM;
+ args.stream = stream1;
+ if (FXFT_Open_Face(library, &args, 0, Face)) {
+ FX_Free(stream1);
+ return FALSE;
+ }
+ if (stream) {
+ *stream = stream1;
+ }
+ return TRUE;
+}
+FX_BOOL CFX_Font::LoadFile(IFX_FileRead* pFile)
+{
+ m_bEmbedded = FALSE;
+ FXFT_Library library;
+ if (CFX_GEModule::Get()->GetFontMgr()->m_FTLibrary == NULL) {
+ FXFT_Init_FreeType(&CFX_GEModule::Get()->GetFontMgr()->m_FTLibrary);
+ }
+ library = CFX_GEModule::Get()->GetFontMgr()->m_FTLibrary;
+ FXFT_Stream stream = NULL;
+ if (!_LoadFile(library, &m_Face, pFile, &stream)) {
+ return FALSE;
+ }
+ m_pOwnedStream = stream;
+ FXFT_Set_Pixel_Sizes(m_Face, 0, 64);
+ return TRUE;
+}
+int CFX_Font::GetGlyphWidth(FX_DWORD glyph_index)
+{
+ if (!m_Face) {
+ return 0;
+ }
+ if (m_pSubstFont && (m_pSubstFont->m_SubstFlags & FXFONT_SUBST_MM)) {
+ AdjustMMParams(glyph_index, 0, 0);
+ }
+ int err = FXFT_Load_Glyph(m_Face, glyph_index, FXFT_LOAD_NO_SCALE | FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH);
+ if (err) {
+ return 0;
+ }
+ int width = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Glyph_HoriAdvance(m_Face));
+ return width;
+}
+static FXFT_Face FT_LoadFont(FX_LPBYTE pData, int size)
+{
+ FXFT_Library library;
+ if (CFX_GEModule::Get()->GetFontMgr()->m_FTLibrary == NULL) {
+ FXFT_Init_FreeType(&CFX_GEModule::Get()->GetFontMgr()->m_FTLibrary);
+ }
+ library = CFX_GEModule::Get()->GetFontMgr()->m_FTLibrary;
+ FXFT_Face face;
+ int error = FXFT_New_Memory_Face(library, pData, size, 0, &face);
+ if (error) {
+ return NULL;
+ }
+ error = FXFT_Set_Pixel_Sizes(face, 64, 64);
+ if (error) {
+ return NULL;
+ }
+ return face;
+}
+FX_BOOL CFX_Font::LoadEmbedded(FX_LPCBYTE data, FX_DWORD size)
+{
+#ifdef FOXIT_CHROME_BUILD
+ m_pFontDataAllocation = FX_Alloc(FX_BYTE, size);
+ if (!m_pFontDataAllocation) {
+ return FALSE;
+ }
+ FXSYS_memcpy32(m_pFontDataAllocation, data, size);
+ m_Face = FT_LoadFont((FX_LPBYTE)m_pFontDataAllocation, size);
+ m_pFontData = (FX_LPBYTE)m_pFontDataAllocation;
+#else
+ m_Face = FT_LoadFont((FX_LPBYTE)data, size);
+ m_pFontData = (FX_LPBYTE)data;
+#endif
+ m_bEmbedded = TRUE;
+ m_dwSize = size;
+ return m_Face != NULL;
+}
+FX_BOOL CFX_Font::IsTTFont()
+{
+ if (m_Face == NULL) {
+ return FALSE;
+ }
+ return FXFT_Is_Face_TT_OT(m_Face) == FXFT_FACE_FLAG_SFNT;
+}
+int CFX_Font::GetAscent() const
+{
+ if (m_Face == NULL) {
+ return 0;
+ }
+ int ascent = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_Ascender(m_Face));
+ return ascent;
+}
+int CFX_Font::GetDescent() const
+{
+ if (m_Face == NULL) {
+ return 0;
+ }
+ int descent = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_Descender(m_Face));
+ return descent;
+}
+FX_BOOL CFX_Font::GetGlyphBBox(FX_DWORD glyph_index, FX_RECT &bbox)
+{
+ if (m_Face == NULL) {
+ return FALSE;
+ }
+ if (FXFT_Is_Face_Tricky(m_Face)) {
+ int error = FXFT_Set_Char_Size(m_Face, 0, 1000 * 64, 72, 72);
+ if (error) {
+ return FALSE;
+ }
+ error = FXFT_Load_Glyph(m_Face, glyph_index, FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH);
+ if (error) {
+ return FALSE;
+ }
+ FXFT_BBox cbox;
+ FT_Glyph glyph;
+ error = FXFT_Get_Glyph(((FXFT_Face)m_Face)->glyph, &glyph);
+ if (error) {
+ return FALSE;
+ }
+ FXFT_Glyph_Get_CBox(glyph, FXFT_GLYPH_BBOX_PIXELS, &cbox);
+ int pixel_size_x = ((FXFT_Face)m_Face)->size->metrics.x_ppem,
+ pixel_size_y = ((FXFT_Face)m_Face)->size->metrics.y_ppem;
+ if (pixel_size_x == 0 || pixel_size_y == 0) {
+ bbox.left = cbox.xMin;
+ bbox.right = cbox.xMax;
+ bbox.top = cbox.yMax;
+ bbox.bottom = cbox.yMin;
+ } else {
+ bbox.left = cbox.xMin * 1000 / pixel_size_x;
+ bbox.right = cbox.xMax * 1000 / pixel_size_x;
+ bbox.top = cbox.yMax * 1000 / pixel_size_y;
+ bbox.bottom = cbox.yMin * 1000 / pixel_size_y;
+ }
+ if (bbox.top > FXFT_Get_Face_Ascender(m_Face)) {
+ bbox.top = FXFT_Get_Face_Ascender(m_Face);
+ }
+ if (bbox.bottom < FXFT_Get_Face_Descender(m_Face)) {
+ bbox.bottom = FXFT_Get_Face_Descender(m_Face);
+ }
+ FT_Done_Glyph(glyph);
+ return FXFT_Set_Pixel_Sizes(m_Face, 0, 64) == 0;
+ }
+ if (FXFT_Load_Glyph(m_Face, glyph_index, FXFT_LOAD_NO_SCALE | FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH)) {
+ return FALSE;
+ }
+ int em = FXFT_Get_Face_UnitsPerEM(m_Face);
+ if (em == 0) {
+ bbox.left = FXFT_Get_Glyph_HoriBearingX(m_Face);
+ bbox.bottom = FXFT_Get_Glyph_HoriBearingY(m_Face);
+ bbox.top = bbox.bottom - FXFT_Get_Glyph_Height(m_Face);
+ bbox.right = bbox.left + FXFT_Get_Glyph_Width(m_Face);
+ } else {
+ bbox.left = FXFT_Get_Glyph_HoriBearingX(m_Face) * 1000 / em;
+ bbox.top = (FXFT_Get_Glyph_HoriBearingY(m_Face) - FXFT_Get_Glyph_Height(m_Face)) * 1000 / em;
+ bbox.right = (FXFT_Get_Glyph_HoriBearingX(m_Face) + FXFT_Get_Glyph_Width(m_Face)) * 1000 / em;
+ bbox.bottom = (FXFT_Get_Glyph_HoriBearingY(m_Face)) * 1000 / em;
+ }
+ return TRUE;
+}
+FX_BOOL CFX_Font::IsItalic()
+{
+ if (m_Face == NULL) {
+ return FALSE;
+ }
+ FX_BOOL ret = FXFT_Is_Face_Italic(m_Face) == FXFT_STYLE_FLAG_ITALIC;
+ if (!ret) {
+ CFX_ByteString str(FXFT_Get_Face_Style_Name(m_Face));
+ str.MakeLower();
+ if (str.Find("italic") != -1) {
+ ret = TRUE;
+ }
+ }
+ return ret;
+}
+FX_BOOL CFX_Font::IsBold()
+{
+ if (m_Face == NULL) {
+ return FALSE;
+ }
+ return FXFT_Is_Face_Bold(m_Face) == FXFT_STYLE_FLAG_BOLD;
+}
+FX_BOOL CFX_Font::IsFixedWidth()
+{
+ if (m_Face == NULL) {
+ return FALSE;
+ }
+ return FXFT_Is_Face_fixedwidth(m_Face);
+}
+CFX_WideString CFX_Font::GetPsName() const
+{
+ if (m_Face == NULL) {
+ return CFX_WideString();
+ }
+ CFX_WideString psName = CFX_WideString::FromLocal(FXFT_Get_Postscript_Name(m_Face));
+ if (psName.IsEmpty()) {
+ psName = CFX_WideString::FromLocal("Untitled");
+ }
+ return psName;
+}
+CFX_ByteString CFX_Font::GetFamilyName() const
+{
+ if (m_Face == NULL && m_pSubstFont == NULL) {
+ return CFX_ByteString();
+ }
+ if (m_Face) {
+ return CFX_ByteString(FXFT_Get_Face_Family_Name(m_Face));
+ } else {
+ return m_pSubstFont->m_Family;
+ }
+}
+CFX_ByteString CFX_Font::GetFaceName() const
+{
+ if (m_Face == NULL && m_pSubstFont == NULL) {
+ return CFX_ByteString();
+ }
+ if (m_Face) {
+ CFX_ByteString facename;
+ CFX_ByteString style = CFX_ByteString(FXFT_Get_Face_Style_Name(m_Face));
+ facename = GetFamilyName();
+ if (facename.IsEmpty()) {
+ facename = "Untitled";
+ }
+ if (!style.IsEmpty() && style != "Regular") {
+ facename += " " + style;
+ }
+ return facename;
+ } else {
+ return m_pSubstFont->m_Family;
+ }
+}
+FX_BOOL CFX_Font::GetBBox(FX_RECT &bbox)
+{
+ if (m_Face == NULL) {
+ return FALSE;
+ }
+ int em = FXFT_Get_Face_UnitsPerEM(m_Face);
+ if (em == 0) {
+ bbox.left = FXFT_Get_Face_xMin(m_Face);
+ bbox.bottom = FXFT_Get_Face_yMax(m_Face);
+ bbox.top = FXFT_Get_Face_yMin(m_Face);
+ bbox.right = FXFT_Get_Face_xMax(m_Face);
+ } else {
+ bbox.left = FXFT_Get_Face_xMin(m_Face) * 1000 / em;
+ bbox.top = FXFT_Get_Face_yMin(m_Face) * 1000 / em;
+ bbox.right = FXFT_Get_Face_xMax(m_Face) * 1000 / em;
+ bbox.bottom = FXFT_Get_Face_yMax(m_Face) * 1000 / em;
+ }
+ return TRUE;
+}
+int CFX_Font::GetHeight()
+{
+ if (m_Face == NULL) {
+ return 0;
+ }
+ int height = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_Height(m_Face));
+ return height;
+}
+int CFX_Font::GetMaxAdvanceWidth()
+{
+ if (m_Face == NULL) {
+ return 0;
+ }
+ int width = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_MaxAdvanceWidth(m_Face));
+ return width;
+}
+int CFX_Font::GetULPos()
+{
+ if (m_Face == NULL) {
+ return 0;
+ }
+ int pos = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_UnderLinePosition(m_Face));
+ return pos;
+}
+int CFX_Font::GetULthickness()
+{
+ if (m_Face == NULL) {
+ return 0;
+ }
+ int thickness = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_UnderLineThickness(m_Face));
+ return thickness;
+}
+CFX_UnicodeEncoding::CFX_UnicodeEncoding(CFX_Font* pFont)
+{
+ m_pFont = pFont;
+}
+FX_DWORD CFX_UnicodeEncoding::GlyphFromCharCode(FX_DWORD charcode)
+{
+ FXFT_Face face = m_pFont->GetFace();
+ if (!face) {
+ return charcode;
+ }
+ if (FXFT_Select_Charmap(face, FXFT_ENCODING_UNICODE) == 0) {
+ return FXFT_Get_Char_Index(face, charcode);
+ }
+ if (m_pFont->m_pSubstFont && m_pFont->m_pSubstFont->m_Charset == 2) {
+ FX_DWORD index = 0;
+ if (FXFT_Select_Charmap(face, FXFT_ENCODING_MS_SYMBOL) == 0) {
+ index = FXFT_Get_Char_Index(face, charcode);
+ }
+ if (!index && !FXFT_Select_Charmap(face, FXFT_ENCODING_APPLE_ROMAN)) {
+ return FXFT_Get_Char_Index(face, charcode);
+ }
+ }
+ return charcode;
+}
+FX_DWORD CFX_UnicodeEncoding::GlyphFromCharCodeEx(FX_DWORD charcode, int encoding)
+{
+ FXFT_Face face = m_pFont->GetFace();
+ if (!face) {
+ return charcode;
+ }
+ if (encoding == ENCODING_UNICODE) {
+ return GlyphFromCharCode(charcode);
+ } else {
+ int nmaps = FXFT_Get_Face_CharmapCount(m_pFont->m_Face);
+ int i = 0;
+ while (i < nmaps) {
+ int encoding = FXFT_Get_Charmap_Encoding(FXFT_Get_Face_Charmaps(face)[i++]);
+ if (encoding != FXFT_ENCODING_UNICODE) {
+ FXFT_Select_Charmap(face, encoding);
+ break;
+ }
+ }
+ }
+ return FXFT_Get_Char_Index(face, charcode);
+}
+IFX_FontEncoding* FXGE_CreateUnicodeEncoding(CFX_Font* pFont)
+{
+ CFX_UnicodeEncoding* pEncoding = NULL;
+ pEncoding = FX_NEW CFX_UnicodeEncoding(pFont);
+ return pEncoding;
+}
diff --git a/core/src/fxge/ge/fx_ge_fontmap.cpp b/core/src/fxge/ge/fx_ge_fontmap.cpp
new file mode 100644
index 0000000000..6549e8e531
--- /dev/null
+++ b/core/src/fxge/ge/fx_ge_fontmap.cpp
@@ -0,0 +1,1558 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxge/fx_ge.h"
+#include "../../../include/fxge/fx_freetype.h"
+#include "text_int.h"
+#define GET_TT_SHORT(w) (FX_WORD)(((w)[0] << 8) | (w)[1])
+#define GET_TT_LONG(w) (FX_DWORD)(((w)[0] << 24) | ((w)[1] << 16) | ((w)[2] << 8) | (w)[3])
+CFX_SubstFont::CFX_SubstFont()
+{
+ m_ExtHandle = NULL;
+ m_Charset = 0;
+ m_SubstFlags = 0;
+ m_Weight = 0;
+ m_ItalicAngle = 0;
+ m_bSubstOfCJK = FALSE;
+ m_WeightCJK = 0;
+ m_bItlicCJK = FALSE;
+}
+CTTFontDesc::~CTTFontDesc()
+{
+ if (m_Type == 1) {
+ if (m_SingleFace.m_pFace) {
+ FXFT_Done_Face(m_SingleFace.m_pFace);
+ }
+ } else if (m_Type == 2) {
+ for (int i = 0; i < 16; i ++)
+ if (m_TTCFace.m_pFaces[i]) {
+ FXFT_Done_Face(m_TTCFace.m_pFaces[i]);
+ }
+ }
+ if (m_pFontData) {
+ FX_Free(m_pFontData);
+ }
+}
+FX_BOOL CTTFontDesc::ReleaseFace(FXFT_Face face)
+{
+ if (m_Type == 1) {
+ if (m_SingleFace.m_pFace != face) {
+ return FALSE;
+ }
+ } else if (m_Type == 2) {
+ int i;
+ for (i = 0; i < 16; i ++)
+ if (m_TTCFace.m_pFaces[i] == face) {
+ break;
+ }
+ if (i == 16) {
+ return FALSE;
+ }
+ }
+ m_RefCount --;
+ if (m_RefCount) {
+ return FALSE;
+ }
+ delete this;
+ return TRUE;
+}
+CFX_FontMgr::CFX_FontMgr()
+{
+ m_pBuiltinMapper = FX_NEW CFX_FontMapper;
+ if (!m_pBuiltinMapper) {
+ return;
+ }
+ m_pBuiltinMapper->m_pFontMgr = this;
+ m_pExtMapper = NULL;
+ m_FTLibrary = NULL;
+ FXSYS_memset32(m_ExternalFonts, 0, sizeof m_ExternalFonts);
+}
+CFX_FontMgr::~CFX_FontMgr()
+{
+ if (m_pBuiltinMapper) {
+ delete m_pBuiltinMapper;
+ }
+ FreeCache();
+ if (m_FTLibrary) {
+ FXFT_Done_FreeType(m_FTLibrary);
+ }
+}
+void CFX_FontMgr::InitFTLibrary()
+{
+ if (m_FTLibrary == NULL) {
+ FXFT_Init_FreeType(&m_FTLibrary);
+ }
+}
+void CFX_FontMgr::FreeCache()
+{
+ FX_POSITION pos = m_FaceMap.GetStartPosition();
+ while(pos) {
+ CFX_ByteString Key;
+ CTTFontDesc* face;
+ m_FaceMap.GetNextAssoc(pos, Key, (void*&)face);
+ delete face;
+ }
+ m_FaceMap.RemoveAll();
+}
+void CFX_FontMgr::SetSystemFontInfo(IFX_SystemFontInfo* pFontInfo)
+{
+ m_pBuiltinMapper->SetSystemFontInfo(pFontInfo);
+}
+FXFT_Face CFX_FontMgr::FindSubstFont(const CFX_ByteString& face_name, FX_BOOL bTrueType,
+ FX_DWORD flags, int weight, int italic_angle, int CharsetCP, CFX_SubstFont* pSubstFont)
+{
+ if (m_FTLibrary == NULL) {
+ FXFT_Init_FreeType(&m_FTLibrary);
+ }
+ if (m_pExtMapper) {
+ FXFT_Face face = m_pExtMapper->FindSubstFont(face_name, bTrueType, flags, weight, italic_angle,
+ CharsetCP, pSubstFont);
+ if (face) {
+ return face;
+ }
+ }
+ return m_pBuiltinMapper->FindSubstFont(face_name, bTrueType, flags, weight, italic_angle,
+ CharsetCP, pSubstFont);
+}
+FXFT_Face CFX_FontMgr::GetCachedFace(const CFX_ByteString& face_name,
+ int weight, FX_BOOL bItalic, FX_LPBYTE& pFontData)
+{
+ CFX_ByteString key(face_name);
+ key += ',';
+ key += CFX_ByteString::FormatInteger(weight);
+ key += bItalic ? 'I' : 'N';
+ CTTFontDesc* pFontDesc = NULL;
+ m_FaceMap.Lookup(key, (void*&)pFontDesc);
+ if(pFontDesc) {
+ pFontData = pFontDesc->m_pFontData;
+ pFontDesc->m_RefCount ++;
+ return pFontDesc->m_SingleFace.m_pFace;
+ }
+ return NULL;
+}
+FXFT_Face CFX_FontMgr::AddCachedFace(const CFX_ByteString& face_name,
+ int weight, FX_BOOL bItalic, FX_LPBYTE pData, FX_DWORD size, int face_index)
+{
+ CTTFontDesc* pFontDesc = FX_NEW CTTFontDesc;
+ if (!pFontDesc) {
+ return NULL;
+ }
+ pFontDesc->m_Type = 1;
+ pFontDesc->m_SingleFace.m_pFace = NULL;
+ pFontDesc->m_SingleFace.m_bBold = weight;
+ pFontDesc->m_SingleFace.m_bItalic = bItalic;
+ pFontDesc->m_pFontData = pData;
+ pFontDesc->m_RefCount = 1;
+ FXFT_Library library;
+ if (m_FTLibrary == NULL) {
+ FXFT_Init_FreeType(&m_FTLibrary);
+ }
+ library = m_FTLibrary;
+ int ret = FXFT_New_Memory_Face(library, pData, size, face_index, &pFontDesc->m_SingleFace.m_pFace);
+ if (ret) {
+ delete pFontDesc;
+ return NULL;
+ }
+ ret = FXFT_Set_Pixel_Sizes(pFontDesc->m_SingleFace.m_pFace, 64, 64);
+ if (ret) {
+ delete pFontDesc;
+ return NULL;
+ }
+ CFX_ByteString key(face_name);
+ key += ',';
+ key += CFX_ByteString::FormatInteger(weight);
+ key += bItalic ? 'I' : 'N';
+ m_FaceMap.SetAt(key, pFontDesc);
+ return pFontDesc->m_SingleFace.m_pFace;
+}
+const FX_LPCSTR g_Base14FontNames[14] = {
+ "Courier",
+ "Courier-Bold",
+ "Courier-BoldOblique",
+ "Courier-Oblique",
+ "Helvetica",
+ "Helvetica-Bold",
+ "Helvetica-BoldOblique",
+ "Helvetica-Oblique",
+ "Times-Roman",
+ "Times-Bold",
+ "Times-BoldItalic",
+ "Times-Italic",
+ "Symbol",
+ "ZapfDingbats",
+};
+const struct _AltFontName {
+ const FX_CHAR* m_pName;
+ int m_Index;
+}
+g_AltFontNames[] = {
+ {"Arial", 4},
+ {"Arial,Bold", 5},
+ {"Arial,BoldItalic", 6},
+ {"Arial,Italic", 7},
+ {"Arial-Bold", 5},
+ {"Arial-BoldItalic", 6},
+ {"Arial-BoldItalicMT", 6},
+ {"Arial-BoldMT", 5},
+ {"Arial-Italic", 7},
+ {"Arial-ItalicMT", 7},
+ {"ArialBold", 5},
+ {"ArialBoldItalic", 6},
+ {"ArialItalic", 7},
+ {"ArialMT", 4},
+ {"ArialMT,Bold", 5},
+ {"ArialMT,BoldItalic", 6},
+ {"ArialMT,Italic", 7},
+ {"ArialRoundedMTBold", 5},
+ {"Courier", 0},
+ {"Courier,Bold", 1},
+ {"Courier,BoldItalic", 2},
+ {"Courier,Italic", 3},
+ {"Courier-Bold", 1},
+ {"Courier-BoldOblique", 2},
+ {"Courier-Oblique", 3},
+ {"CourierBold", 1},
+ {"CourierBoldItalic", 2},
+ {"CourierItalic", 3},
+ {"CourierNew", 0},
+ {"CourierNew,Bold", 1},
+ {"CourierNew,BoldItalic", 2},
+ {"CourierNew,Italic", 3},
+ {"CourierNew-Bold", 1},
+ {"CourierNew-BoldItalic", 2},
+ {"CourierNew-Italic", 3},
+ {"CourierNewBold", 1},
+ {"CourierNewBoldItalic", 2},
+ {"CourierNewItalic", 3},
+ {"CourierNewPS-BoldItalicMT", 2},
+ {"CourierNewPS-BoldMT", 1},
+ {"CourierNewPS-ItalicMT", 3},
+ {"CourierNewPSMT", 0},
+ {"CourierStd", 0},
+ {"CourierStd-Bold", 1},
+ {"CourierStd-BoldOblique", 2},
+ {"CourierStd-Oblique", 3},
+ {"Helvetica", 4},
+ {"Helvetica,Bold", 5},
+ {"Helvetica,BoldItalic", 6},
+ {"Helvetica,Italic", 7},
+ {"Helvetica-Bold", 5},
+ {"Helvetica-BoldItalic", 6},
+ {"Helvetica-BoldOblique", 6},
+ {"Helvetica-Italic", 7},
+ {"Helvetica-Oblique", 7},
+ {"HelveticaBold", 5},
+ {"HelveticaBoldItalic", 6},
+ {"HelveticaItalic", 7},
+ {"Symbol", 12},
+ {"SymbolMT", 12},
+ {"Times-Bold", 9},
+ {"Times-BoldItalic", 10},
+ {"Times-Italic", 11},
+ {"Times-Roman", 8},
+ {"TimesBold", 9},
+ {"TimesBoldItalic", 10},
+ {"TimesItalic", 11},
+ {"TimesNewRoman", 8},
+ {"TimesNewRoman,Bold", 9},
+ {"TimesNewRoman,BoldItalic", 10},
+ {"TimesNewRoman,Italic", 11},
+ {"TimesNewRoman-Bold", 9},
+ {"TimesNewRoman-BoldItalic", 10},
+ {"TimesNewRoman-Italic", 11},
+ {"TimesNewRomanBold", 9},
+ {"TimesNewRomanBoldItalic", 10},
+ {"TimesNewRomanItalic", 11},
+ {"TimesNewRomanPS", 8},
+ {"TimesNewRomanPS-Bold", 9},
+ {"TimesNewRomanPS-BoldItalic", 10},
+ {"TimesNewRomanPS-BoldItalicMT", 10},
+ {"TimesNewRomanPS-BoldMT", 9},
+ {"TimesNewRomanPS-Italic", 11},
+ {"TimesNewRomanPS-ItalicMT", 11},
+ {"TimesNewRomanPSMT", 8},
+ {"TimesNewRomanPSMT,Bold", 9},
+ {"TimesNewRomanPSMT,BoldItalic", 10},
+ {"TimesNewRomanPSMT,Italic", 11},
+ {"ZapfDingbats", 13},
+};
+extern "C" {
+ static int compareString(const void* key, const void* element)
+ {
+ return FXSYS_stricmp((FX_LPCSTR)key, ((_AltFontName*)element)->m_pName);
+ }
+}
+int _PDF_GetStandardFontName(CFX_ByteString& name)
+{
+ _AltFontName* found = (_AltFontName*)FXSYS_bsearch((FX_LPCSTR)name, g_AltFontNames,
+ sizeof g_AltFontNames / sizeof (_AltFontName), sizeof (_AltFontName), compareString);
+ if (found == NULL) {
+ return -1;
+ }
+ name = g_Base14FontNames[found->m_Index];
+ return found->m_Index;
+}
+int GetTTCIndex(FX_LPCBYTE pFontData, FX_DWORD ttc_size, FX_DWORD font_offset)
+{
+ int face_index = 0;
+ FX_LPCBYTE p = pFontData + 8;
+ FX_DWORD nfont = GET_TT_LONG(p);
+ FX_DWORD index;
+ for (index = 0; index < nfont; index ++) {
+ p = pFontData + 12 + index * 4;
+ if (GET_TT_LONG(p) == font_offset) {
+ break;
+ }
+ }
+ if(index >= nfont) {
+ face_index = 0;
+ } else {
+ face_index = index;
+ }
+ return face_index;
+}
+FXFT_Face CFX_FontMgr::GetCachedTTCFace(int ttc_size, FX_DWORD checksum,
+ int font_offset, FX_LPBYTE& pFontData)
+{
+ CFX_ByteString key;
+ key.Format("%d:%d", ttc_size, checksum);
+ CTTFontDesc* pFontDesc = NULL;
+ m_FaceMap.Lookup(key, (void*&)pFontDesc);
+ if (pFontDesc == NULL) {
+ return NULL;
+ }
+ pFontData = pFontDesc->m_pFontData;
+ pFontDesc->m_RefCount ++;
+ int face_index = GetTTCIndex(pFontDesc->m_pFontData, ttc_size, font_offset);
+ if (pFontDesc->m_TTCFace.m_pFaces[face_index] == NULL) {
+ pFontDesc->m_TTCFace.m_pFaces[face_index] = GetFixedFace(pFontDesc->m_pFontData, ttc_size, face_index);
+ }
+ return pFontDesc->m_TTCFace.m_pFaces[face_index];
+}
+FXFT_Face CFX_FontMgr::AddCachedTTCFace(int ttc_size, FX_DWORD checksum,
+ FX_LPBYTE pData, FX_DWORD size, int font_offset)
+{
+ CFX_ByteString key;
+ key.Format("%d:%d", ttc_size, checksum);
+ CTTFontDesc* pFontDesc = FX_NEW CTTFontDesc;
+ if (!pFontDesc) {
+ return NULL;
+ }
+ pFontDesc->m_Type = 2;
+ pFontDesc->m_pFontData = pData;
+ for (int i = 0; i < 16; i ++) {
+ pFontDesc->m_TTCFace.m_pFaces[i] = NULL;
+ }
+ pFontDesc->m_RefCount ++;
+ key.Format("%d:%d", ttc_size, checksum);
+ m_FaceMap.SetAt(key, pFontDesc);
+ int face_index = GetTTCIndex(pFontDesc->m_pFontData, ttc_size, font_offset);
+ pFontDesc->m_TTCFace.m_pFaces[face_index] = GetFixedFace(pFontDesc->m_pFontData, ttc_size, face_index);
+ return pFontDesc->m_TTCFace.m_pFaces[face_index];
+}
+FXFT_Face CFX_FontMgr::GetFixedFace(FX_LPCBYTE pData, FX_DWORD size, int face_index)
+{
+ FXFT_Library library;
+ if (m_FTLibrary == NULL) {
+ FXFT_Init_FreeType(&m_FTLibrary);
+ }
+ library = m_FTLibrary;
+ FXFT_Face face = NULL;
+ int ret = FXFT_New_Memory_Face(library, pData, size, face_index, &face);
+ if (ret) {
+ return NULL;
+ }
+ ret = FXFT_Set_Pixel_Sizes(face, 64, 64);
+ if (ret) {
+ return NULL;
+ }
+ return face;
+}
+FXFT_Face CFX_FontMgr::GetFileFace(FX_LPCSTR filename, int face_index)
+{
+ FXFT_Library library;
+ if (m_FTLibrary == NULL) {
+ FXFT_Init_FreeType(&m_FTLibrary);
+ }
+ library = m_FTLibrary;
+ FXFT_Face face = NULL;
+ int ret = FXFT_New_Face(library, filename, face_index, &face);
+ if (ret) {
+ return NULL;
+ }
+ ret = FXFT_Set_Pixel_Sizes(face, 64, 64);
+ if (ret) {
+ return NULL;
+ }
+ return face;
+}
+void CFX_FontMgr::ReleaseFace(FXFT_Face face)
+{
+ if (face == NULL) {
+ return;
+ }
+ FX_POSITION pos = m_FaceMap.GetStartPosition();
+ while(pos) {
+ CFX_ByteString Key;
+ CTTFontDesc* ttface;
+ m_FaceMap.GetNextAssoc(pos, Key, (void*&)ttface);
+ if (ttface->ReleaseFace(face)) {
+ m_FaceMap.RemoveKey(Key);
+ }
+ }
+}
+extern "C" {
+ extern const unsigned char g_FoxitFixedItalicFontData [18746];
+ extern const unsigned char g_FoxitFixedFontData [17597];
+ extern const unsigned char g_FoxitSansItalicFontData [16339];
+ extern const unsigned char g_FoxitSansFontData [15025];
+ extern const unsigned char g_FoxitSerifItalicFontData [21227];
+ extern const unsigned char g_FoxitSerifFontData [19469];
+ extern const unsigned char g_FoxitFixedBoldItalicFontData [19151];
+ extern const unsigned char g_FoxitFixedBoldFontData [18055];
+ extern const unsigned char g_FoxitSansBoldItalicFontData [16418];
+ extern const unsigned char g_FoxitSansBoldFontData [16344];
+ extern const unsigned char g_FoxitSerifBoldItalicFontData [20733];
+ extern const unsigned char g_FoxitSerifBoldFontData [19395];
+ extern const unsigned char g_FoxitSymbolFontData[16729];
+ extern const unsigned char g_FoxitDingbatsFontData[29513];
+ extern const unsigned char g_FoxitSerifMMFontData[113417];
+ extern const unsigned char g_FoxitSansMMFontData[66919];
+};
+const FoxitFonts g_FoxitFonts[14] = {
+ {g_FoxitFixedFontData, 17597},
+ {g_FoxitFixedBoldFontData, 18055},
+ {g_FoxitFixedBoldItalicFontData, 19151},
+ {g_FoxitFixedItalicFontData, 18746},
+ {g_FoxitSansFontData, 15025},
+ {g_FoxitSansBoldFontData, 16344},
+ {g_FoxitSansBoldItalicFontData, 16418},
+ {g_FoxitSansItalicFontData, 16339},
+ {g_FoxitSerifFontData, 19469},
+ {g_FoxitSerifBoldFontData, 19395},
+ {g_FoxitSerifBoldItalicFontData, 20733},
+ {g_FoxitSerifItalicFontData, 21227},
+ {g_FoxitSymbolFontData, 16729},
+ {g_FoxitDingbatsFontData, 29513},
+};
+void _FPDFAPI_GetInternalFontData(int id, FX_LPCBYTE& data, FX_DWORD& size)
+{
+ CFX_GEModule::Get()->GetFontMgr()->GetStandardFont(data, size, id);
+}
+FX_BOOL CFX_FontMgr::GetStandardFont(FX_LPCBYTE& pFontData, FX_DWORD& size, int index)
+{
+ if (index > 15 || index < 0) {
+ return FALSE;
+ }
+ {
+ if (index >= 14) {
+ if (index == 14) {
+ pFontData = g_FoxitSerifMMFontData;
+ size = 113417;
+ } else {
+ pFontData = g_FoxitSansMMFontData;
+ size = 66919;
+ }
+ } else {
+ pFontData = g_FoxitFonts[index].m_pFontData;
+ size = g_FoxitFonts[index].m_dwSize;
+ }
+ }
+ return TRUE;
+}
+CFX_FontMapper::CFX_FontMapper()
+{
+ FXSYS_memset32(m_FoxitFaces, 0, sizeof m_FoxitFaces);
+ m_MMFaces[0] = m_MMFaces[1] = NULL;
+ m_pFontInfo = NULL;
+ m_bListLoaded = FALSE;
+ m_pFontEnumerator = NULL;
+}
+CFX_FontMapper::~CFX_FontMapper()
+{
+ for (int i = 0; i < 14; i ++)
+ if (m_FoxitFaces[i]) {
+ FXFT_Done_Face(m_FoxitFaces[i]);
+ }
+ if (m_MMFaces[0]) {
+ FXFT_Done_Face(m_MMFaces[0]);
+ }
+ if (m_MMFaces[1]) {
+ FXFT_Done_Face(m_MMFaces[1]);
+ }
+ if (m_pFontInfo) {
+ m_pFontInfo->Release();
+ }
+}
+void CFX_FontMapper::SetSystemFontInfo(IFX_SystemFontInfo* pFontInfo)
+{
+ if (pFontInfo == NULL) {
+ return;
+ }
+ if (m_pFontInfo) {
+ m_pFontInfo->Release();
+ }
+ m_pFontInfo = pFontInfo;
+}
+static CFX_ByteString _TT_NormalizeName(FX_LPCSTR family)
+{
+ CFX_ByteString norm(family, -1);
+ norm.Remove(' ');
+ norm.Remove('-');
+ norm.Remove(',');
+ int pos = norm.Find('+');
+ if (pos > 0) {
+ norm = norm.Left(pos);
+ }
+ norm.MakeLower();
+ return norm;
+}
+CFX_ByteString _FPDF_GetNameFromTT(FX_LPCBYTE name_table, FX_DWORD name_id)
+{
+ FX_LPCBYTE ptr = name_table + 2;
+ int name_count = GET_TT_SHORT(ptr);
+ int string_offset = GET_TT_SHORT(ptr + 2);
+ FX_LPCBYTE string_ptr = name_table + string_offset;
+ ptr += 4;
+ for (int i = 0; i < name_count; i ++) {
+ if (GET_TT_SHORT(ptr + 6) == name_id && GET_TT_SHORT(ptr) == 1 && GET_TT_SHORT(ptr + 2) == 0) {
+ return CFX_ByteStringC(string_ptr + GET_TT_SHORT(ptr + 10), GET_TT_SHORT(ptr + 8));
+ }
+ ptr += 12;
+ }
+ return CFX_ByteString();
+}
+static CFX_ByteString _FPDF_ReadStringFromFile(FXSYS_FILE* pFile, FX_DWORD size)
+{
+ CFX_ByteString buffer;
+ if (!FXSYS_fread(buffer.GetBuffer(size), size, 1, pFile)) {
+ return CFX_ByteString();
+ }
+ buffer.ReleaseBuffer(size);
+ return buffer;
+}
+static CFX_ByteString _FPDF_ReadStringFromStreamFile(IFX_FileStream* pFile, FX_DWORD size)
+{
+ CFX_ByteString buffer;
+ if (!pFile->ReadBlock(buffer.GetBuffer(size), size)) {
+ return CFX_ByteString();
+ }
+ buffer.ReleaseBuffer(size);
+ return buffer;
+}
+CFX_ByteString _FPDF_LoadTableFromTT(FXSYS_FILE* pFile, FX_LPCBYTE pTables, FX_DWORD nTables, FX_DWORD tag)
+{
+ for (FX_DWORD i = 0; i < nTables; i ++) {
+ FX_LPCBYTE p = pTables + i * 16;
+ if (GET_TT_LONG(p) == tag) {
+ FX_DWORD offset = GET_TT_LONG(p + 8);
+ FX_DWORD size = GET_TT_LONG(p + 12);
+ FXSYS_fseek(pFile, offset, FXSYS_SEEK_SET);
+ return _FPDF_ReadStringFromFile(pFile, size);
+ }
+ }
+ return CFX_ByteString();
+}
+CFX_ByteString _FPDF_LoadTableFromTTStreamFile(IFX_FileStream* pFile, FX_LPCBYTE pTables, FX_DWORD nTables, FX_DWORD tag)
+{
+ for (FX_DWORD i = 0; i < nTables; i ++) {
+ FX_LPCBYTE p = pTables + i * 16;
+ if (GET_TT_LONG(p) == tag) {
+ FX_DWORD offset = GET_TT_LONG(p + 8);
+ FX_DWORD size = GET_TT_LONG(p + 12);
+ CFX_ByteString buffer;
+ if (!pFile->ReadBlock(buffer.GetBuffer(size), offset, size)) {
+ return CFX_ByteString();
+ }
+ buffer.ReleaseBuffer(size);
+ return buffer;
+ }
+ }
+ return CFX_ByteString();
+}
+CFX_ByteString CFX_FontMapper::GetPSNameFromTT(void* hFont)
+{
+ if (m_pFontInfo == NULL) {
+ CFX_ByteString();
+ }
+ CFX_ByteString result;
+ FX_DWORD size = m_pFontInfo->GetFontData(hFont, 0x6e616d65, NULL, 0);
+ if (size) {
+ FX_LPBYTE buffer = FX_Alloc(FX_BYTE, size);
+ if (!buffer) {
+ return result;
+ }
+ m_pFontInfo->GetFontData(hFont, 0x6e616d65, buffer, size);
+ result = _FPDF_GetNameFromTT(buffer, 6);
+ FX_Free(buffer);
+ }
+ return result;
+}
+void CFX_FontMapper::AddInstalledFont(const CFX_ByteString& name, int charset)
+{
+ if (m_pFontInfo == NULL) {
+ return;
+ }
+ if (m_CharsetArray.Find((FX_DWORD)charset) == -1) {
+ m_CharsetArray.Add((FX_DWORD)charset);
+ m_FaceArray.Add(name);
+ }
+ if (name == m_LastFamily) {
+ return;
+ }
+ FX_LPCBYTE ptr = name;
+ FX_BOOL bLocalized = FALSE;
+ for (int i = 0; i < name.GetLength(); i ++)
+ if (ptr[i] > 0x80) {
+ bLocalized = TRUE;
+ break;
+ }
+ if (bLocalized) {
+ void* hFont = m_pFontInfo->GetFont(name);
+ if (hFont == NULL) {
+ FX_BOOL bExact;
+ hFont = m_pFontInfo->MapFont(0, 0, FXFONT_DEFAULT_CHARSET, 0, name, bExact);
+ if (hFont == NULL) {
+ return;
+ }
+ }
+ CFX_ByteString new_name = GetPSNameFromTT(hFont);
+ if (!new_name.IsEmpty()) {
+ new_name.Insert(0, ' ');
+ m_InstalledTTFonts.Add(new_name);
+ }
+ m_pFontInfo->DeleteFont(hFont);
+ }
+ m_InstalledTTFonts.Add(name);
+ m_LastFamily = name;
+}
+void CFX_FontMapper::LoadInstalledFonts()
+{
+ if (m_pFontInfo == NULL) {
+ return;
+ }
+ if (m_bListLoaded) {
+ return;
+ }
+ if (m_bListLoaded) {
+ return;
+ }
+ m_pFontInfo->EnumFontList(this);
+ m_bListLoaded = TRUE;
+}
+CFX_ByteString CFX_FontMapper::MatchInstalledFonts(const CFX_ByteString& norm_name)
+{
+ LoadInstalledFonts();
+ int i;
+ for (i = m_InstalledTTFonts.GetSize() - 1; i >= 0; i --) {
+ CFX_ByteString norm1 = _TT_NormalizeName(m_InstalledTTFonts[i]);
+ if (norm1 == norm_name) {
+ break;
+ }
+ }
+ if (i < 0) {
+ return CFX_ByteString();
+ }
+ CFX_ByteString match = m_InstalledTTFonts[i];
+ if (match[0] == ' ') {
+ match = m_InstalledTTFonts[i + 1];
+ }
+ return match;
+}
+typedef struct _CHARSET_MAP_ {
+ FX_BYTE charset;
+ FX_WORD codepage;
+} CHARSET_MAP;
+static const CHARSET_MAP g_Codepage2CharsetTable[] = {
+ { 1 , 0 },
+ { 2 , 42 },
+ { 254, 437 },
+ { 255, 850 },
+ { 222, 874 },
+ { 128, 932 },
+ { 134, 936 },
+ { 129, 949 },
+ { 136, 950 },
+ { 238, 1250 },
+ { 204, 1251 },
+ { 0, 1252 },
+ { 161, 1253 },
+ { 162, 1254 },
+ { 177, 1255 },
+ { 178, 1256 },
+ { 186, 1257 },
+ { 163, 1258 },
+ { 130, 1361 },
+ { 77, 10000 },
+ { 78, 10001 },
+ { 79, 10003 },
+ { 80, 10008 },
+ { 81, 10002 },
+ { 83, 10005 },
+ { 84, 10004 },
+ { 85, 10006 },
+ { 86, 10081 },
+ { 87, 10021 },
+ { 88, 10029 },
+ { 89, 10007 },
+};
+FX_BYTE _GetCharsetFromCodePage(FX_WORD codepage)
+{
+ FX_INT32 iEnd = sizeof(g_Codepage2CharsetTable) / sizeof(CHARSET_MAP) - 1;
+ FXSYS_assert(iEnd >= 0);
+ FX_INT32 iStart = 0, iMid;
+ do {
+ iMid = (iStart + iEnd) / 2;
+ const CHARSET_MAP & cp = g_Codepage2CharsetTable[iMid];
+ if (codepage == cp.codepage) {
+ return cp.charset;
+ } else if (codepage < cp.codepage) {
+ iEnd = iMid - 1;
+ } else {
+ iStart = iMid + 1;
+ }
+ } while (iStart <= iEnd);
+ return 1;
+}
+FX_DWORD _GetCodePageRangeFromCharset(int charset)
+{
+ if (charset == FXFONT_EASTEUROPE_CHARSET) {
+ return 1 << 1;
+ }
+ if (charset == FXFONT_GREEK_CHARSET) {
+ return 1 << 3;
+ }
+ if (charset == FXFONT_TURKISH_CHARSET) {
+ return 1 << 4;
+ }
+ if (charset == FXFONT_HEBREW_CHARSET) {
+ return 1 << 5;
+ }
+ if (charset == FXFONT_ARABIC_CHARSET) {
+ return 1 << 6;
+ }
+ if (charset == FXFONT_BALTIC_CHARSET) {
+ return 1 << 7;
+ }
+ if (charset == FXFONT_THAI_CHARSET) {
+ return 1 << 16;
+ }
+ if (charset == FXFONT_SHIFTJIS_CHARSET) {
+ return 1 << 17;
+ }
+ if (charset == FXFONT_GB2312_CHARSET) {
+ return 1 << 18;
+ }
+ if (charset == FXFONT_CHINESEBIG5_CHARSET) {
+ return 1 << 20;
+ }
+ if (charset == FXFONT_HANGEUL_CHARSET) {
+ return 1 << 19;
+ }
+ if (charset == FXFONT_SYMBOL_CHARSET) {
+ return 1 << 31;
+ }
+ return 1 << 21;
+}
+static int CP2CharSet(int cp)
+{
+ if(cp == 932) {
+ return FXFONT_SHIFTJIS_CHARSET;
+ } else if(cp == 936) {
+ return FXFONT_GB2312_CHARSET;
+ } else if(cp == 949) {
+ return FXFONT_HANGEUL_CHARSET;
+ } else if(cp == 950) {
+ return FXFONT_CHINESEBIG5_CHARSET;
+ }
+ return FXFONT_DEFAULT_CHARSET;
+}
+FXFT_Face CFX_FontMapper::UseInternalSubst(CFX_SubstFont* pSubstFont, int iBaseFont, int italic_angle, int weight, int picthfamily)
+{
+ if (iBaseFont < 12) {
+ if (m_FoxitFaces[iBaseFont]) {
+ return m_FoxitFaces[iBaseFont];
+ }
+ FX_LPCBYTE pFontData = NULL;
+ FX_DWORD size = 0;
+ if (m_pFontMgr->GetStandardFont(pFontData, size, iBaseFont)) {
+ m_FoxitFaces[iBaseFont] = m_pFontMgr->GetFixedFace(pFontData, size, 0);
+ return m_FoxitFaces[iBaseFont];
+ }
+ }
+ pSubstFont->m_SubstFlags |= FXFONT_SUBST_MM;
+ pSubstFont->m_ItalicAngle = italic_angle;
+ if (weight) {
+ pSubstFont->m_Weight = weight;
+ }
+ if (picthfamily & FXFONT_FF_ROMAN) {
+ pSubstFont->m_Weight = pSubstFont->m_Weight * 4 / 5;
+ pSubstFont->m_Family = "Chrome Serif";
+ if (m_MMFaces[1]) {
+ return m_MMFaces[1];
+ }
+ FX_LPCBYTE pFontData = NULL;
+ FX_DWORD size;
+ m_pFontMgr->GetStandardFont(pFontData, size, 14);
+ m_MMFaces[1] = m_pFontMgr->GetFixedFace(pFontData, size, 0);
+ return m_MMFaces[1];
+ }
+ pSubstFont->m_Family = "Chrome Sans";
+ if (m_MMFaces[0]) {
+ return m_MMFaces[0];
+ }
+ FX_LPCBYTE pFontData = NULL;
+ FX_DWORD size = 0;
+ m_pFontMgr->GetStandardFont(pFontData, size, 15);
+ m_MMFaces[0] = m_pFontMgr->GetFixedFace(pFontData, size, 0);
+ return m_MMFaces[0];
+}
+const struct _AltFontFamily {
+ FX_LPCSTR m_pFontName;
+ FX_LPCSTR m_pFontFamily;
+}
+g_AltFontFamilies[] = {
+ {"AGaramondPro", "Adobe Garamond Pro"},
+ {"BankGothicBT-Medium", "BankGothic Md BT"},
+ {"ForteMT", "Forte"},
+};
+extern "C" {
+ static int compareFontFamilyString(const void* key, const void* element)
+ {
+ CFX_ByteString str_key((FX_LPCSTR)key);
+ if (str_key.Find(((_AltFontFamily*)element)->m_pFontName) != -1) {
+ return 0;
+ }
+ return FXSYS_stricmp((FX_LPCSTR)key, ((_AltFontFamily*)element)->m_pFontName);
+ }
+}
+#define FX_FONT_STYLE_None 0x00
+#define FX_FONT_STYLE_Bold 0x01
+#define FX_FONT_STYLE_Italic 0x02
+#define FX_FONT_STYLE_BoldBold 0x04
+static CFX_ByteString _GetFontFamily(CFX_ByteString fontName, int nStyle)
+{
+ if (fontName.Find("Script") >= 0) {
+ if ((nStyle & FX_FONT_STYLE_Bold) == FX_FONT_STYLE_Bold) {
+ fontName = "ScriptMTBold";
+ } else if (fontName.Find("Palace") >= 0) {
+ fontName = "PalaceScriptMT";
+ } else if (fontName.Find("French") >= 0) {
+ fontName = "FrenchScriptMT";
+ } else if (fontName.Find("FreeStyle") >= 0) {
+ fontName = "FreeStyleScript";
+ }
+ return fontName;
+ }
+ _AltFontFamily* found = (_AltFontFamily*)FXSYS_bsearch((FX_LPCSTR)fontName, g_AltFontFamilies,
+ sizeof g_AltFontFamilies / sizeof (_AltFontFamily), sizeof (_AltFontFamily), compareFontFamilyString);
+ if (found == NULL) {
+ return fontName;
+ }
+ return found->m_pFontFamily;
+};
+typedef struct _FX_FontStyle {
+ FX_LPCSTR style;
+ FX_INT32 len;
+} FX_FontStyle;
+const FX_FontStyle g_FontStyles[] = {
+ "Bold", 4,
+ "Italic", 6,
+ "BoldItalic", 10,
+ "Reg", 3,
+ "Regular", 7,
+};
+CFX_ByteString ParseStyle(FX_LPCSTR pStyle, int iLen, int iIndex)
+{
+ CFX_ByteTextBuf buf;
+ if (!iLen || iLen <= iIndex) {
+ return buf.GetByteString();
+ }
+ while (iIndex < iLen) {
+ if (pStyle[iIndex] == ',') {
+ break;
+ }
+ buf.AppendChar(pStyle[iIndex]);
+ ++iIndex;
+ }
+ return buf.GetByteString();
+}
+FX_INT32 GetStyleType(const CFX_ByteString &bsStyle, FX_BOOL bRevert)
+{
+ FX_INT32 iLen = bsStyle.GetLength();
+ if (!iLen) {
+ return -1;
+ }
+ int iSize = sizeof(g_FontStyles) / sizeof(FX_FontStyle);
+ const FX_FontStyle *pStyle = NULL;
+ for (int i = iSize - 1; i >= 0; --i) {
+ pStyle = g_FontStyles + i;
+ if (!pStyle || pStyle->len > iLen) {
+ continue;
+ }
+ if (!bRevert) {
+ if (bsStyle.Left(pStyle->len).Compare(pStyle->style) == 0) {
+ return i;
+ }
+ } else {
+ if (bsStyle.Right(pStyle->len).Compare(pStyle->style) == 0) {
+ return i;
+ }
+ }
+ }
+ return -1;
+}
+FX_BOOL CheckSupportThirdPartFont(CFX_ByteString name, int &PitchFamily)
+{
+ if (name == FX_BSTRC("MyriadPro")) {
+ PitchFamily &= ~FXFONT_FF_ROMAN;
+ return TRUE;
+ }
+ return FALSE;
+}
+FXFT_Face CFX_FontMapper::FindSubstFont(const CFX_ByteString& name, FX_BOOL bTrueType, FX_DWORD flags,
+ int weight, int italic_angle, int WindowCP, CFX_SubstFont* pSubstFont)
+{
+ if (!(flags & FXFONT_USEEXTERNATTR)) {
+ weight = FXFONT_FW_NORMAL;
+ italic_angle = 0;
+ }
+ CFX_ByteString SubstName = name;
+ SubstName.Remove(0x20);
+ if (bTrueType) {
+ if (name[0] == '@') {
+ SubstName = name.Mid(1);
+ }
+ }
+ _PDF_GetStandardFontName(SubstName);
+ if (SubstName == FX_BSTRC("Symbol") && !bTrueType) {
+ pSubstFont->m_Family = "Chrome Symbol";
+ pSubstFont->m_Charset = FXFONT_SYMBOL_CHARSET;
+ pSubstFont->m_SubstFlags |= FXFONT_SUBST_STANDARD;
+ if (m_FoxitFaces[12]) {
+ return m_FoxitFaces[12];
+ }
+ FX_LPCBYTE pFontData = NULL;
+ FX_DWORD size = 0;
+ m_pFontMgr->GetStandardFont(pFontData, size, 12);
+ m_FoxitFaces[12] = m_pFontMgr->GetFixedFace(pFontData, size, 0);
+ return m_FoxitFaces[12];
+ }
+ if (SubstName == FX_BSTRC("ZapfDingbats")) {
+ pSubstFont->m_Family = "Chrome Dingbats";
+ pSubstFont->m_Charset = FXFONT_SYMBOL_CHARSET;
+ pSubstFont->m_SubstFlags |= FXFONT_SUBST_STANDARD;
+ if (m_FoxitFaces[13]) {
+ return m_FoxitFaces[13];
+ }
+ FX_LPCBYTE pFontData = NULL;
+ FX_DWORD size = 0;
+ m_pFontMgr->GetStandardFont(pFontData, size, 13);
+ m_FoxitFaces[13] = m_pFontMgr->GetFixedFace(pFontData, size, 0);
+ return m_FoxitFaces[13];
+ }
+ int iBaseFont = 0;
+ CFX_ByteString family, style;
+ FX_BOOL bHasComma = FALSE;
+ FX_BOOL bHasHypen = FALSE;
+ int find = SubstName.Find(FX_BSTRC(","), 0);
+ if (find >= 0) {
+ family = SubstName.Left(find);
+ _PDF_GetStandardFontName(family);
+ style = SubstName.Mid(find + 1);
+ bHasComma = TRUE;
+ } else {
+ family = SubstName;
+ }
+ for (; iBaseFont < 12; iBaseFont ++)
+ if (family == CFX_ByteStringC(g_Base14FontNames[iBaseFont])) {
+ break;
+ }
+ int PitchFamily = 0;
+ FX_BOOL bItalic = FALSE;
+ FX_DWORD nStyle = 0;
+ FX_BOOL bStyleAvail = FALSE;
+ FX_BOOL bFamilyStyleIsWhole = FALSE;
+ FX_BOOL bNextF = FALSE;
+ if (iBaseFont < 12) {
+ family = g_Base14FontNames[iBaseFont];
+ if ((iBaseFont % 4) == 1 || (iBaseFont % 4) == 2) {
+ nStyle |= FX_FONT_STYLE_Bold;
+ }
+ if ((iBaseFont % 4) / 2) {
+ nStyle |= FX_FONT_STYLE_Italic;
+ }
+ if (iBaseFont < 4) {
+ PitchFamily |= FXFONT_FF_FIXEDPITCH;
+ }
+ if (iBaseFont >= 8) {
+ PitchFamily |= FXFONT_FF_ROMAN;
+ }
+ } else {
+ if (!bHasComma) {
+ find = family.ReverseFind('-');
+ if (find >= 0) {
+ style = family.Mid(find + 1);
+ family = family.Left(find);
+ bHasHypen = TRUE;
+ }
+ }
+ if (!bHasHypen) {
+ int nLen = family.GetLength();
+ FX_INT32 nRet = GetStyleType(family, TRUE);
+ if (nRet > -1) {
+ family = family.Left(nLen - g_FontStyles[nRet].len);
+ if (nRet == 0) {
+ nStyle |= FX_FONT_STYLE_Bold;
+ }
+ if (nRet == 1) {
+ nStyle |= FX_FONT_STYLE_Italic;
+ }
+ if (nRet == 2) {
+ nStyle |= (FX_FONT_STYLE_Bold | FX_FONT_STYLE_Italic);
+ }
+ }
+ }
+ if (flags & FXFONT_SERIF) {
+ PitchFamily |= FXFONT_FF_ROMAN;
+ }
+ if (flags & FXFONT_SCRIPT) {
+ PitchFamily |= FXFONT_FF_SCRIPT;
+ }
+ if (flags & FXFONT_FIXED_PITCH) {
+ PitchFamily |= FXFONT_FF_FIXEDPITCH;
+ }
+ }
+ if (!style.IsEmpty()) {
+ int nLen = style.GetLength();
+ FX_LPCSTR pStyle = style;
+ int i = 0;
+ FX_BOOL bFirstItem = TRUE;
+ CFX_ByteString buf;
+ while (i < nLen) {
+ buf = ParseStyle(pStyle, nLen, i);
+ FX_INT32 nRet = GetStyleType(buf, FALSE);
+ if ((i && !bStyleAvail) || (!i && nRet < 0)) {
+ family = SubstName;
+ iBaseFont = 12;
+ break;
+ } else if (nRet >= 0) {
+ bStyleAvail = TRUE;
+ }
+ if (nRet == 0) {
+ if (nStyle & FX_FONT_STYLE_Bold) {
+ nStyle |= FX_FONT_STYLE_BoldBold;
+ } else {
+ nStyle |= FX_FONT_STYLE_Bold;
+ }
+ bFirstItem = FALSE;
+ }
+ if (nRet == 1) {
+ if (bFirstItem) {
+ nStyle |= FX_FONT_STYLE_Italic;
+ } else {
+ family = SubstName;
+ iBaseFont = 12;
+ }
+ break;
+ }
+ if (nRet == 2) {
+ nStyle |= FX_FONT_STYLE_Italic;
+ if (nStyle & FX_FONT_STYLE_Bold) {
+ nStyle |= FX_FONT_STYLE_BoldBold;
+ } else {
+ nStyle |= FX_FONT_STYLE_Bold;
+ }
+ bFirstItem = FALSE;
+ }
+ i += buf.GetLength() + 1;
+ }
+ }
+ weight = weight ? weight : FXFONT_FW_NORMAL;
+ int old_weight = weight;
+ if (nStyle) {
+ weight = nStyle & FX_FONT_STYLE_BoldBold ? 900 : (nStyle & FX_FONT_STYLE_Bold ? FXFONT_FW_BOLD : FXFONT_FW_NORMAL);
+ }
+ if (nStyle & FX_FONT_STYLE_Italic) {
+ bItalic = TRUE;
+ }
+ FX_BOOL bCJK = FALSE;
+ FX_BOOL bExact = FALSE;
+ int Charset = FXFONT_ANSI_CHARSET;
+ if (WindowCP) {
+ Charset = _GetCharsetFromCodePage(WindowCP);
+ } else if (iBaseFont == 12 && (flags & FXFONT_SYMBOLIC)) {
+ Charset = FXFONT_SYMBOL_CHARSET;
+ }
+ if (Charset == FXFONT_SHIFTJIS_CHARSET || Charset == FXFONT_GB2312_CHARSET ||
+ Charset == FXFONT_HANGEUL_CHARSET || Charset == FXFONT_CHINESEBIG5_CHARSET) {
+ bCJK = TRUE;
+ }
+ if (m_pFontInfo == NULL) {
+ pSubstFont->m_SubstFlags |= FXFONT_SUBST_STANDARD;
+ return UseInternalSubst(pSubstFont, iBaseFont, italic_angle, old_weight, PitchFamily);
+ }
+ family = _GetFontFamily(family, nStyle);
+ CFX_ByteString match = MatchInstalledFonts(_TT_NormalizeName(family));
+ if (match.IsEmpty() && family != SubstName && (!bHasComma && (!bHasHypen || (bHasHypen && !bStyleAvail)))) {
+ match = MatchInstalledFonts(_TT_NormalizeName(SubstName));
+ }
+ if (match.IsEmpty() && iBaseFont >= 12) {
+ if (!bCJK) {
+ if (!CheckSupportThirdPartFont(family, PitchFamily)) {
+ if (italic_angle != 0) {
+ bItalic = TRUE;
+ } else {
+ bItalic = FALSE;
+ }
+ weight = old_weight;
+ }
+ } else {
+ pSubstFont->m_bSubstOfCJK = TRUE;
+ if (nStyle) {
+ pSubstFont->m_WeightCJK = weight;
+ } else {
+ pSubstFont->m_WeightCJK = FXFONT_FW_NORMAL;
+ }
+ if (nStyle & FX_FONT_STYLE_Italic) {
+ pSubstFont->m_bItlicCJK = TRUE;
+ }
+ }
+ } else {
+ italic_angle = 0;
+ weight = nStyle & FX_FONT_STYLE_BoldBold ? 900 : (nStyle & FX_FONT_STYLE_Bold ? FXFONT_FW_BOLD : FXFONT_FW_NORMAL);
+ }
+ if (!match.IsEmpty() || iBaseFont < 12) {
+ pSubstFont->m_SubstFlags |= FXFONT_SUBST_EXACT;
+ if (!match.IsEmpty()) {
+ family = match;
+ }
+ if (iBaseFont < 12) {
+ if (nStyle && !(iBaseFont % 4)) {
+ if ((nStyle & 0x3) == 1) {
+ iBaseFont += 1;
+ }
+ if ((nStyle & 0x3) == 2) {
+ iBaseFont += 3;
+ }
+ if ((nStyle & 0x3) == 3) {
+ iBaseFont += 2;
+ }
+ }
+ if (m_pFontMgr->m_ExternalFonts[iBaseFont].m_pFontData) {
+ if (m_FoxitFaces[iBaseFont]) {
+ return m_FoxitFaces[iBaseFont];
+ }
+ m_FoxitFaces[iBaseFont] = m_pFontMgr->GetFixedFace(m_pFontMgr->m_ExternalFonts[iBaseFont].m_pFontData,
+ m_pFontMgr->m_ExternalFonts[iBaseFont].m_dwSize, 0);
+ if (m_FoxitFaces[iBaseFont]) {
+ return m_FoxitFaces[iBaseFont];
+ }
+ } else {
+ family = g_Base14FontNames[iBaseFont];
+ }
+ pSubstFont->m_SubstFlags |= FXFONT_SUBST_STANDARD;
+ }
+ } else {
+ if (flags & FXFONT_ITALIC) {
+ bItalic = TRUE;
+ }
+ }
+ bExact = !match.IsEmpty();
+ void* hFont = m_pFontInfo->MapFont(weight, bItalic, Charset, PitchFamily, family, bExact);
+ if (bExact) {
+ pSubstFont->m_SubstFlags |= FXFONT_SUBST_EXACT;
+ }
+ if (hFont == NULL) {
+ if (bCJK) {
+ if (italic_angle != 0) {
+ bItalic = TRUE;
+ } else {
+ bItalic = FALSE;
+ }
+ weight = old_weight;
+ }
+ if (!match.IsEmpty()) {
+ hFont = m_pFontInfo->GetFont(match);
+ if (hFont == NULL) {
+ return UseInternalSubst(pSubstFont, iBaseFont, italic_angle, old_weight, PitchFamily);
+ }
+ } else {
+ if (Charset == FXFONT_SYMBOL_CHARSET) {
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ || _FXM_PLATFORM_ == _FXM_PLATFORM_ANDROID_
+ if (SubstName == FX_BSTRC("Symbol")) {
+ pSubstFont->m_Family = "Chrome Symbol";
+ pSubstFont->m_SubstFlags |= FXFONT_SUBST_STANDARD;
+ pSubstFont->m_Charset = FXFONT_SYMBOL_CHARSET;
+ if (m_FoxitFaces[12]) {
+ return m_FoxitFaces[12];
+ }
+ FX_LPCBYTE pFontData = NULL;
+ FX_DWORD size = 0;
+ m_pFontMgr->GetStandardFont(pFontData, size, 12);
+ m_FoxitFaces[12] = m_pFontMgr->GetFixedFace(pFontData, size, 0);
+ return m_FoxitFaces[12];
+ } else {
+ pSubstFont->m_SubstFlags |= FXFONT_SUBST_NONSYMBOL;
+ return FindSubstFont(family, bTrueType, flags & ~FXFONT_SYMBOLIC, weight, italic_angle, 0, pSubstFont);
+ }
+#else
+ pSubstFont->m_SubstFlags |= FXFONT_SUBST_NONSYMBOL;
+ return FindSubstFont(family, bTrueType, flags & ~FXFONT_SYMBOLIC, weight, italic_angle, 0, pSubstFont);
+#endif
+ }
+ if (Charset == FXFONT_ANSI_CHARSET) {
+ pSubstFont->m_SubstFlags |= FXFONT_SUBST_STANDARD;
+ return UseInternalSubst(pSubstFont, iBaseFont, italic_angle, old_weight, PitchFamily);
+ }
+ int index = m_CharsetArray.Find(Charset);
+ if (index < 0) {
+ return UseInternalSubst(pSubstFont, iBaseFont, italic_angle, old_weight, PitchFamily);
+ } else {
+ hFont = m_pFontInfo->GetFont(m_FaceArray[index]);
+ }
+ }
+ }
+ pSubstFont->m_ExtHandle = m_pFontInfo->RetainFont(hFont);
+ if (hFont == NULL) {
+ return NULL;
+ }
+ m_pFontInfo->GetFaceName(hFont, SubstName);
+ if (Charset == FXFONT_DEFAULT_CHARSET) {
+ m_pFontInfo->GetFontCharset(hFont, Charset);
+ }
+ FX_DWORD ttc_size = m_pFontInfo->GetFontData(hFont, 0x74746366, NULL, 0);
+ FX_DWORD font_size = m_pFontInfo->GetFontData(hFont, 0, NULL, 0);
+ if(font_size == 0 && ttc_size == 0) {
+ m_pFontInfo->DeleteFont(hFont);
+ return NULL;
+ }
+ FXFT_Face face = NULL;
+ if (ttc_size) {
+ FX_BYTE temp[1024];
+ m_pFontInfo->GetFontData(hFont, 0x74746366, temp, 1024);
+ FX_DWORD checksum = 0;
+ for (int i = 0; i < 256; i ++) {
+ checksum += ((FX_DWORD*)temp)[i];
+ }
+ FX_LPBYTE pFontData;
+ face = m_pFontMgr->GetCachedTTCFace(ttc_size, checksum, ttc_size - font_size, pFontData);
+ if (face == NULL) {
+ pFontData = FX_Alloc(FX_BYTE, ttc_size);
+ if (pFontData) {
+ m_pFontInfo->GetFontData(hFont, 0x74746366, pFontData, ttc_size);
+ face = m_pFontMgr->AddCachedTTCFace(ttc_size, checksum, pFontData, ttc_size,
+ ttc_size - font_size);
+ }
+ }
+ } else {
+ FX_LPBYTE pFontData;
+ face = m_pFontMgr->GetCachedFace(SubstName, weight, bItalic, pFontData);
+ if (face == NULL) {
+ pFontData = FX_Alloc(FX_BYTE, font_size);
+ if (!pFontData) {
+ m_pFontInfo->DeleteFont(hFont);
+ return NULL;
+ }
+ m_pFontInfo->GetFontData(hFont, 0, pFontData, font_size);
+ face = m_pFontMgr->AddCachedFace(SubstName, weight, bItalic, pFontData, font_size, m_pFontInfo->GetFaceIndex(hFont));
+ }
+ }
+ if (face == NULL) {
+ m_pFontInfo->DeleteFont(hFont);
+ return NULL;
+ }
+ pSubstFont->m_Family = SubstName;
+ pSubstFont->m_Charset = Charset;
+ FX_BOOL bNeedUpdateWeight = FALSE;
+ if (FXFT_Is_Face_Bold(face)) {
+ if (weight == FXFONT_FW_BOLD) {
+ bNeedUpdateWeight = FALSE;
+ } else {
+ bNeedUpdateWeight = TRUE;
+ }
+ } else {
+ if (weight == FXFONT_FW_NORMAL) {
+ bNeedUpdateWeight = FALSE;
+ } else {
+ bNeedUpdateWeight = TRUE;
+ }
+ }
+ if (bNeedUpdateWeight) {
+ pSubstFont->m_Weight = weight;
+ }
+ if (bItalic && !FXFT_Is_Face_Italic(face)) {
+ if (italic_angle == 0) {
+ italic_angle = -12;
+ } else if (FXSYS_abs(italic_angle) < 5) {
+ italic_angle = 0;
+ }
+ pSubstFont->m_ItalicAngle = italic_angle;
+ }
+ m_pFontInfo->DeleteFont(hFont);
+ return face;
+}
+extern "C" {
+ unsigned long _FTStreamRead(FXFT_Stream stream, unsigned long offset,
+ unsigned char* buffer, unsigned long count);
+ void _FTStreamClose(FXFT_Stream stream);
+};
+CFontFileFaceInfo::CFontFileFaceInfo()
+{
+ m_pFile = NULL;
+ m_Face = NULL;
+ m_Charsets = 0;
+ m_FileSize = 0;
+ m_FontOffset = 0;
+ m_Weight = 0;
+ m_bItalic = FALSE;
+ m_PitchFamily = 0;
+}
+CFontFileFaceInfo::~CFontFileFaceInfo()
+{
+ if (m_Face) {
+ FXFT_Done_Face(m_Face);
+ }
+ m_Face = NULL;
+}
+extern FX_BOOL _LoadFile(FXFT_Library library, FXFT_Face* Face, IFX_FileRead* pFile, FXFT_Stream* stream);
+#if defined(_FPDFAPI_MINI_) || _FX_OS_ == _FX_ANDROID_
+IFX_SystemFontInfo* IFX_SystemFontInfo::CreateDefault()
+{
+ return NULL;
+}
+#endif
+#if !defined(_FPDFAPI_MINI_)
+CFX_FolderFontInfo::CFX_FolderFontInfo()
+{
+}
+CFX_FolderFontInfo::~CFX_FolderFontInfo()
+{
+ FX_POSITION pos = m_FontList.GetStartPosition();
+ while (pos) {
+ CFX_ByteString key;
+ FX_LPVOID value;
+ m_FontList.GetNextAssoc(pos, key, value);
+ delete (CFontFaceInfo*)value;
+ }
+}
+void CFX_FolderFontInfo::AddPath(FX_BSTR path)
+{
+ m_PathList.Add(path);
+}
+void CFX_FolderFontInfo::Release()
+{
+ delete this;
+}
+FX_BOOL CFX_FolderFontInfo::EnumFontList(CFX_FontMapper* pMapper)
+{
+ m_pMapper = pMapper;
+ for (int i = 0; i < m_PathList.GetSize(); i ++) {
+ ScanPath(m_PathList[i]);
+ }
+ return TRUE;
+}
+void CFX_FolderFontInfo::ScanPath(CFX_ByteString& path)
+{
+ void* handle = FX_OpenFolder(path);
+ if (handle == NULL) {
+ return;
+ }
+ CFX_ByteString filename;
+ FX_BOOL bFolder;
+ while (FX_GetNextFile(handle, filename, bFolder)) {
+ if (bFolder) {
+ if (filename == "." || filename == "..") {
+ continue;
+ }
+ } else {
+ CFX_ByteString ext = filename.Right(4);
+ ext.MakeUpper();
+ if (ext != ".TTF" && ext != ".OTF" && ext != ".TTC") {
+ continue;
+ }
+ }
+ CFX_ByteString fullpath = path;
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+ fullpath += "\\";
+#else
+ fullpath += "/";
+#endif
+ fullpath += filename;
+ if (bFolder) {
+ ScanPath(fullpath);
+ } else {
+ ScanFile(fullpath);
+ }
+ }
+ FX_CloseFolder(handle);
+}
+void CFX_FolderFontInfo::ScanFile(CFX_ByteString& path)
+{
+ FXSYS_FILE* pFile = FXSYS_fopen(path, "rb");
+ if (pFile == NULL) {
+ return;
+ }
+ FXSYS_fseek(pFile, 0, FXSYS_SEEK_END);
+ FX_DWORD filesize = FXSYS_ftell(pFile);
+ FX_BYTE buffer[16];
+ FXSYS_fseek(pFile, 0, FXSYS_SEEK_SET);
+ size_t readCnt = FXSYS_fread(buffer, 12, 1, pFile);
+ if (GET_TT_LONG(buffer) == 0x74746366) {
+ FX_DWORD nFaces = GET_TT_LONG(buffer + 8);
+ FX_LPBYTE offsets = FX_Alloc(FX_BYTE, nFaces * 4);
+ if (!offsets) {
+ FXSYS_fclose(pFile);
+ return;
+ }
+ readCnt = FXSYS_fread(offsets, nFaces * 4, 1, pFile);
+ for (FX_DWORD i = 0; i < nFaces; i ++) {
+ FX_LPBYTE p = offsets + i * 4;
+ ReportFace(path, pFile, filesize, GET_TT_LONG(p));
+ }
+ FX_Free(offsets);
+ } else {
+ ReportFace(path, pFile, filesize, 0);
+ }
+ FXSYS_fclose(pFile);
+}
+void CFX_FolderFontInfo::ReportFace(CFX_ByteString& path, FXSYS_FILE* pFile, FX_DWORD filesize, FX_DWORD offset)
+{
+ FXSYS_fseek(pFile, offset, FXSYS_SEEK_SET);
+ char buffer[16];
+ if (!FXSYS_fread(buffer, 12, 1, pFile)) {
+ return;
+ }
+ FX_DWORD nTables = GET_TT_SHORT(buffer + 4);
+ CFX_ByteString tables = _FPDF_ReadStringFromFile(pFile, nTables * 16);
+ CFX_ByteString names = _FPDF_LoadTableFromTT(pFile, tables, nTables, 0x6e616d65);
+ CFX_ByteString facename = _FPDF_GetNameFromTT(names, 1);
+ CFX_ByteString style = _FPDF_GetNameFromTT(names, 2);
+ if (style != "Regular") {
+ facename += " " + style;
+ }
+ FX_LPVOID p;
+ if (m_FontList.Lookup(facename, p)) {
+ return;
+ }
+ CFontFaceInfo* pInfo = FX_NEW CFontFaceInfo;
+ if (!pInfo) {
+ return;
+ }
+ pInfo->m_FilePath = path;
+ pInfo->m_FaceName = facename;
+ pInfo->m_FontTables = tables;
+ pInfo->m_FontOffset = offset;
+ pInfo->m_FileSize = filesize;
+ pInfo->m_Charsets = 0;
+ CFX_ByteString os2 = _FPDF_LoadTableFromTT(pFile, tables, nTables, 0x4f532f32);
+ if (os2.GetLength() >= 86) {
+ FX_LPCBYTE p = (FX_LPCBYTE)os2 + 78;
+ FX_DWORD codepages = GET_TT_LONG(p);
+ if (codepages & (1 << 17)) {
+ m_pMapper->AddInstalledFont(facename, FXFONT_SHIFTJIS_CHARSET);
+ pInfo->m_Charsets |= CHARSET_FLAG_SHIFTJIS;
+ }
+ if (codepages & (1 << 18)) {
+ m_pMapper->AddInstalledFont(facename, FXFONT_GB2312_CHARSET);
+ pInfo->m_Charsets |= CHARSET_FLAG_GB;
+ }
+ if (codepages & (1 << 20)) {
+ m_pMapper->AddInstalledFont(facename, FXFONT_CHINESEBIG5_CHARSET);
+ pInfo->m_Charsets |= CHARSET_FLAG_BIG5;
+ }
+ if ((codepages & (1 << 19)) || (codepages & (1 << 21))) {
+ m_pMapper->AddInstalledFont(facename, FXFONT_HANGEUL_CHARSET);
+ pInfo->m_Charsets |= CHARSET_FLAG_KOREAN;
+ }
+ if (codepages & (1 << 31)) {
+ m_pMapper->AddInstalledFont(facename, FXFONT_SYMBOL_CHARSET);
+ pInfo->m_Charsets |= CHARSET_FLAG_SYMBOL;
+ }
+ }
+ m_pMapper->AddInstalledFont(facename, FXFONT_ANSI_CHARSET);
+ pInfo->m_Charsets |= CHARSET_FLAG_ANSI;
+ pInfo->m_Styles = 0;
+ if (style.Find(FX_BSTRC("Bold")) > -1) {
+ pInfo->m_Styles |= FXFONT_BOLD;
+ }
+ if (style.Find(FX_BSTRC("Italic")) > -1 || style.Find(FX_BSTRC("Oblique")) > -1) {
+ pInfo->m_Styles |= FXFONT_ITALIC;
+ }
+ if (facename.Find(FX_BSTRC("Serif")) > -1) {
+ pInfo->m_Styles |= FXFONT_SERIF;
+ }
+ m_FontList.SetAt(facename, pInfo);
+}
+void* CFX_FolderFontInfo::MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR family, FX_BOOL& bExact)
+{
+ return NULL;
+}
+void* CFX_FolderFontInfo::GetFont(FX_LPCSTR face)
+{
+ FX_LPVOID p;
+ if (!m_FontList.Lookup(face, p)) {
+ return NULL;
+ }
+ return p;
+}
+FX_DWORD CFX_FolderFontInfo::GetFontData(void* hFont, FX_DWORD table, FX_LPBYTE buffer, FX_DWORD size)
+{
+ if (hFont == NULL) {
+ return 0;
+ }
+ CFontFaceInfo* pFont = (CFontFaceInfo*)hFont;
+ FXSYS_FILE* pFile = NULL;
+ if (size > 0) {
+ pFile = FXSYS_fopen(pFont->m_FilePath, "rb");
+ if (pFile == NULL) {
+ return 0;
+ }
+ }
+ FX_DWORD datasize = 0;
+ FX_DWORD offset;
+ if (table == 0) {
+ datasize = pFont->m_FontOffset ? 0 : pFont->m_FileSize;
+ offset = 0;
+ } else if (table == 0x74746366) {
+ datasize = pFont->m_FontOffset ? pFont->m_FileSize : 0;
+ offset = 0;
+ } else {
+ FX_DWORD nTables = pFont->m_FontTables.GetLength() / 16;
+ for (FX_DWORD i = 0; i < nTables; i ++) {
+ FX_LPCBYTE p = (FX_LPCBYTE)pFont->m_FontTables + i * 16;
+ if (GET_TT_LONG(p) == table) {
+ offset = GET_TT_LONG(p + 8);
+ datasize = GET_TT_LONG(p + 12);
+ }
+ }
+ }
+ if (datasize && size >= datasize && pFile) {
+ FXSYS_fseek(pFile, offset, FXSYS_SEEK_SET);
+ size_t readCnt = FXSYS_fread(buffer, datasize, 1, pFile);
+ }
+ if (pFile) {
+ FXSYS_fclose(pFile);
+ }
+ return datasize;
+}
+void CFX_FolderFontInfo::DeleteFont(void* hFont)
+{
+}
+FX_BOOL CFX_FolderFontInfo::GetFaceName(void* hFont, CFX_ByteString& name)
+{
+ if (hFont == NULL) {
+ return FALSE;
+ }
+ CFontFaceInfo* pFont = (CFontFaceInfo*)hFont;
+ name = pFont->m_FaceName;
+ return TRUE;
+}
+FX_BOOL CFX_FolderFontInfo::GetFontCharset(void* hFont, int& charset)
+{
+ return FALSE;
+}
+#endif
diff --git a/core/src/fxge/ge/fx_ge_linux.cpp b/core/src/fxge/ge/fx_ge_linux.cpp
new file mode 100644
index 0000000000..33cfcfe722
--- /dev/null
+++ b/core/src/fxge/ge/fx_ge_linux.cpp
@@ -0,0 +1,259 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxge/fx_ge.h"
+#include "../agg/include/fx_agg_driver.h"
+#include "text_int.h"
+#if !defined(_FPDFAPI_MINI_) && _FXM_PLATFORM_ == _FXM_PLATFORM_LINUX_
+#if (_FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ && (!defined(_FPDFAPI_MINI_)))
+void CFX_AggDeviceDriver::InitPlatform()
+{
+}
+void CFX_AggDeviceDriver::DestroyPlatform()
+{
+}
+void CFX_FaceCache::InitPlatform()
+{
+}
+FX_BOOL CFX_AggDeviceDriver::DrawDeviceText(int nChars, const FXTEXT_CHARPOS* pCharPos, CFX_Font* pFont,
+ CFX_FontCache* pCache, const CFX_AffineMatrix* pObject2Device,
+ FX_FLOAT font_size, FX_DWORD argb)
+{
+ return FALSE;
+}
+CFX_GlyphBitmap* CFX_FaceCache::RenderGlyph_Nativetext(CFX_Font* pFont, FX_DWORD glyph_index, const CFX_AffineMatrix* pMatrix,
+ int dest_width, int anti_alias)
+{
+ return NULL;
+}
+void CFX_Font::ReleasePlatformResource()
+{
+}
+#endif
+static const struct {
+ FX_LPCSTR m_pName;
+ FX_LPCSTR m_pSubstName;
+}
+Base14Substs[] = {
+ {"Courier", "Courier New"},
+ {"Courier-Bold", "Courier New Bold"},
+ {"Courier-BoldOblique", "Courier New Bold Italic"},
+ {"Courier-Oblique", "Courier New Italic"},
+ {"Helvetica", "Arial"},
+ {"Helvetica-Bold", "Arial Bold"},
+ {"Helvetica-BoldOblique", "Arial Bold Italic"},
+ {"Helvetica-Oblique", "Arial Italic"},
+ {"Times-Roman", "Times New Roman"},
+ {"Times-Bold", "Times New Roman Bold"},
+ {"Times-BoldItalic", "Times New Roman Bold Italic"},
+ {"Times-Italic", "Times New Roman Italic"},
+};
+class CFX_LinuxFontInfo : public CFX_FolderFontInfo
+{
+public:
+ virtual void* MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR family, FX_BOOL& bExact);
+ FX_BOOL ParseFontCfg();
+ void* FindFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR family, FX_BOOL bMatchName);
+};
+#define LINUX_GPNAMESIZE 6
+static const struct {
+ FX_LPCSTR NameArr[LINUX_GPNAMESIZE];
+}
+LinuxGpFontList[] = {
+ {{"TakaoPGothic", "VL PGothic", "IPAPGothic", "VL Gothic", "Kochi Gothic", "VL Gothic regular"}},
+ {{"TakaoGothic", "VL Gothic", "IPAGothic", "Kochi Gothic", NULL, "VL Gothic regular"}},
+ {{"TakaoPMincho", "IPAPMincho", "VL Gothic", "Kochi Mincho", NULL, "VL Gothic regular"}},
+ {{"TakaoMincho", "IPAMincho", "VL Gothic", "Kochi Mincho", NULL, "VL Gothic regular"}},
+};
+static const FX_LPCSTR g_LinuxGbFontList[] = {
+ "AR PL UMing CN Light",
+ "WenQuanYi Micro Hei",
+ "AR PL UKai CN",
+};
+static const FX_LPCSTR g_LinuxB5FontList[] = {
+ "AR PL UMing TW Light",
+ "WenQuanYi Micro Hei",
+ "AR PL UKai TW",
+};
+static const FX_LPCSTR g_LinuxHGFontList[] = {
+ "UnDotum",
+};
+static FX_INT32 GetJapanesePreference(FX_LPCSTR facearr, int weight, int picth_family)
+{
+ CFX_ByteString face = facearr;
+ if (face.Find("Gothic") >= 0 || face.Find("\x83\x53\x83\x56\x83\x62\x83\x4e") >= 0) {
+ if (face.Find("PGothic") >= 0 || face.Find("\x82\x6f\x83\x53\x83\x56\x83\x62\x83\x4e") >= 0) {
+ return 0;
+ } else {
+ return 1;
+ }
+ } else if (face.Find("Mincho") >= 0 || face.Find("\x96\xbe\x92\xa9") >= 0) {
+ if (face.Find("PMincho") >= 0 || face.Find("\x82\x6f\x96\xbe\x92\xa9") >= 0) {
+ return 2;
+ } else {
+ return 3;
+ }
+ }
+ if (!(picth_family & FXFONT_FF_ROMAN) && weight > 400) {
+ return 0;
+ }
+ return 2;
+}
+void* CFX_LinuxFontInfo::MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR cstr_face, FX_BOOL& bExact)
+{
+ CFX_ByteString face = cstr_face;
+ int iBaseFont;
+ for (iBaseFont = 0; iBaseFont < 12; iBaseFont ++)
+ if (face == CFX_ByteStringC(Base14Substs[iBaseFont].m_pName)) {
+ face = Base14Substs[iBaseFont].m_pSubstName;
+ bExact = TRUE;
+ break;
+ }
+ if (iBaseFont < 12) {
+ return GetFont(face);
+ }
+ FX_LPVOID p = NULL;
+ FX_BOOL bCJK = TRUE;
+ switch (charset) {
+ case FXFONT_SHIFTJIS_CHARSET: {
+ FX_INT32 index = GetJapanesePreference(cstr_face, weight, pitch_family);
+ if (index < 0) {
+ break;
+ }
+ for (FX_INT32 i = 0; i < LINUX_GPNAMESIZE; i++)
+ if (m_FontList.Lookup(LinuxGpFontList[index].NameArr[i], p)) {
+ return p;
+ }
+ }
+ break;
+ case FXFONT_GB2312_CHARSET: {
+ static FX_INT32 s_gbCount = sizeof(g_LinuxGbFontList) / sizeof(FX_LPCSTR);
+ for (FX_INT32 i = 0; i < s_gbCount; i++)
+ if (m_FontList.Lookup(g_LinuxGbFontList[i], p)) {
+ return p;
+ }
+ }
+ break;
+ case FXFONT_CHINESEBIG5_CHARSET: {
+ static FX_INT32 s_b5Count = sizeof(g_LinuxB5FontList) / sizeof(FX_LPCSTR);
+ for (FX_INT32 i = 0; i < s_b5Count; i++)
+ if (m_FontList.Lookup(g_LinuxB5FontList[i], p)) {
+ return p;
+ }
+ }
+ break;
+ case FXFONT_HANGEUL_CHARSET: {
+ static FX_INT32 s_hgCount = sizeof(g_LinuxHGFontList) / sizeof(FX_LPCSTR);
+ for (FX_INT32 i = 0; i < s_hgCount; i++)
+ if (m_FontList.Lookup(g_LinuxHGFontList[i], p)) {
+ return p;
+ }
+ }
+ break;
+ default:
+ bCJK = FALSE;
+ break;
+ }
+ if (charset == FXFONT_ANSI_CHARSET && (pitch_family & FXFONT_FF_FIXEDPITCH)) {
+ return GetFont("Courier New");
+ }
+ return FindFont(weight, bItalic, charset, pitch_family, cstr_face, !bCJK);
+}
+static FX_DWORD _LinuxGetCharset(int charset)
+{
+ switch(charset) {
+ case FXFONT_SHIFTJIS_CHARSET:
+ return CHARSET_FLAG_SHIFTJIS;
+ case FXFONT_GB2312_CHARSET:
+ return CHARSET_FLAG_GB;
+ case FXFONT_CHINESEBIG5_CHARSET:
+ return CHARSET_FLAG_BIG5;
+ case FXFONT_HANGEUL_CHARSET:
+ return CHARSET_FLAG_KOREAN;
+ case FXFONT_SYMBOL_CHARSET:
+ return CHARSET_FLAG_SYMBOL;
+ case FXFONT_ANSI_CHARSET:
+ return CHARSET_FLAG_ANSI;
+ default:
+ break;
+ }
+ return 0;
+}
+static FX_INT32 _LinuxGetSimilarValue(int weight, FX_BOOL bItalic, int pitch_family, FX_DWORD style)
+{
+ FX_INT32 iSimilarValue = 0;
+ if ((style & FXFONT_BOLD) == (weight > 400)) {
+ iSimilarValue += 16;
+ }
+ if ((style & FXFONT_ITALIC) == bItalic) {
+ iSimilarValue += 16;
+ }
+ if ((style & FXFONT_SERIF) == (pitch_family & FXFONT_FF_ROMAN)) {
+ iSimilarValue += 16;
+ }
+ if ((style & FXFONT_SCRIPT) == (pitch_family & FXFONT_FF_SCRIPT)) {
+ iSimilarValue += 8;
+ }
+ if ((style & FXFONT_FIXED_PITCH) == (pitch_family & FXFONT_FF_FIXEDPITCH)) {
+ iSimilarValue += 8;
+ }
+ return iSimilarValue;
+}
+void* CFX_LinuxFontInfo::FindFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR family, FX_BOOL bMatchName)
+{
+ CFontFaceInfo* pFind = NULL;
+ FX_DWORD charset_flag = _LinuxGetCharset(charset);
+ FX_INT32 iBestSimilar = 0;
+ FX_POSITION pos = m_FontList.GetStartPosition();
+ while (pos) {
+ CFX_ByteString bsName;
+ CFontFaceInfo* pFont = NULL;
+ m_FontList.GetNextAssoc(pos, bsName, (FX_LPVOID&)pFont);
+ if (!(pFont->m_Charsets & charset_flag) && charset != FXFONT_DEFAULT_CHARSET) {
+ continue;
+ }
+ FX_INT32 iSimilarValue = 0;
+ FX_INT32 index = bsName.Find(family);
+ if (bMatchName && index < 0) {
+ continue;
+ }
+ if (!bMatchName && index > 0) {
+ iSimilarValue += 64;
+ }
+ iSimilarValue = _LinuxGetSimilarValue(weight, bItalic, pitch_family, pFont->m_Styles);
+ if (iSimilarValue > iBestSimilar) {
+ iBestSimilar = iSimilarValue;
+ pFind = pFont;
+ }
+ }
+ return pFind;
+}
+IFX_SystemFontInfo* IFX_SystemFontInfo::CreateDefault()
+{
+ CFX_LinuxFontInfo* pInfo = FX_NEW CFX_LinuxFontInfo;
+ if (!pInfo) {
+ return NULL;
+ }
+ if (!pInfo->ParseFontCfg()) {
+ pInfo->AddPath("/usr/share/fonts");
+ pInfo->AddPath("/usr/share/X11/fonts/Type1");
+ pInfo->AddPath("/usr/share/X11/fonts/TTF");
+ pInfo->AddPath("/usr/local/share/fonts");
+ }
+ return pInfo;
+}
+FX_BOOL CFX_LinuxFontInfo::ParseFontCfg()
+{
+ return FALSE;
+}
+void CFX_GEModule::InitPlatform()
+{
+ m_pFontMgr->SetSystemFontInfo(IFX_SystemFontInfo::CreateDefault());
+}
+void CFX_GEModule::DestroyPlatform()
+{
+}
+#endif
diff --git a/core/src/fxge/ge/fx_ge_path.cpp b/core/src/fxge/ge/fx_ge_path.cpp
new file mode 100644
index 0000000000..fc6ee52f1f
--- /dev/null
+++ b/core/src/fxge/ge/fx_ge_path.cpp
@@ -0,0 +1,654 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxcrt/fx_basic.h"
+#include "../../../include/fxge/fx_ge.h"
+CFX_ClipRgn::CFX_ClipRgn(int width, int height)
+{
+ m_Type = RectI;
+ m_Box.left = m_Box.top = 0;
+ m_Box.right = width;
+ m_Box.bottom = height;
+}
+CFX_ClipRgn::CFX_ClipRgn(const FX_RECT& rect)
+{
+ m_Type = RectI;
+ m_Box = rect;
+}
+CFX_ClipRgn::CFX_ClipRgn(const CFX_ClipRgn& src)
+{
+ m_Type = src.m_Type;
+ m_Box = src.m_Box;
+ m_Mask = src.m_Mask;
+}
+CFX_ClipRgn::~CFX_ClipRgn()
+{
+}
+void CFX_ClipRgn::Reset(const FX_RECT& rect)
+{
+ m_Type = RectI;
+ m_Box = rect;
+ m_Mask.SetNull();
+}
+void CFX_ClipRgn::IntersectRect(const FX_RECT& rect)
+{
+ if (m_Type == RectI) {
+ m_Box.Intersect(rect);
+ return;
+ }
+ if (m_Type == MaskF) {
+ IntersectMaskRect(rect, m_Box, m_Mask);
+ return;
+ }
+}
+void CFX_ClipRgn::IntersectMaskRect(FX_RECT rect, FX_RECT mask_rect, CFX_DIBitmapRef Mask)
+{
+ const CFX_DIBitmap* mask_dib = Mask;
+ m_Type = MaskF;
+ m_Box = rect;
+ m_Box.Intersect(mask_rect);
+ if (m_Box.IsEmpty()) {
+ m_Type = RectI;
+ return;
+ } else if (m_Box == mask_rect) {
+ m_Mask = Mask;
+ return;
+ }
+ CFX_DIBitmap* new_dib = m_Mask.New();
+ if (!new_dib) {
+ return;
+ }
+ new_dib->Create(m_Box.Width(), m_Box.Height(), FXDIB_8bppMask);
+ for (int row = m_Box.top; row < m_Box.bottom; row ++) {
+ FX_LPBYTE dest_scan = new_dib->GetBuffer() + new_dib->GetPitch() * (row - m_Box.top);
+ FX_LPBYTE src_scan = mask_dib->GetBuffer() + mask_dib->GetPitch() * (row - mask_rect.top);
+ for (int col = m_Box.left; col < m_Box.right; col ++) {
+ dest_scan[col - m_Box.left] = src_scan[col - mask_rect.left];
+ }
+ }
+}
+void CFX_ClipRgn::IntersectMaskF(int left, int top, CFX_DIBitmapRef Mask)
+{
+ const CFX_DIBitmap* mask_dib = Mask;
+ ASSERT(mask_dib->GetFormat() == FXDIB_8bppMask);
+ FX_RECT mask_box(left, top, left + mask_dib->GetWidth(), top + mask_dib->GetHeight());
+ if (m_Type == RectI) {
+ IntersectMaskRect(m_Box, mask_box, Mask);
+ return;
+ }
+ if (m_Type == MaskF) {
+ FX_RECT new_box = m_Box;
+ new_box.Intersect(mask_box);
+ if (new_box.IsEmpty()) {
+ m_Type = RectI;
+ m_Mask.SetNull();
+ m_Box = new_box;
+ return;
+ }
+ CFX_DIBitmapRef new_mask;
+ CFX_DIBitmap* new_dib = new_mask.New();
+ if (!new_dib) {
+ return;
+ }
+ new_dib->Create(new_box.Width(), new_box.Height(), FXDIB_8bppMask);
+ const CFX_DIBitmap* old_dib = m_Mask;
+ for (int row = new_box.top; row < new_box.bottom; row ++) {
+ FX_LPBYTE old_scan = old_dib->GetBuffer() + (row - m_Box.top) * old_dib->GetPitch();
+ FX_LPBYTE mask_scan = mask_dib->GetBuffer() + (row - top) * mask_dib->GetPitch();
+ FX_LPBYTE new_scan = new_dib->GetBuffer() + (row - new_box.top) * new_dib->GetPitch();
+ for (int col = new_box.left; col < new_box.right; col ++) {
+ new_scan[col - new_box.left] = old_scan[col - m_Box.left] * mask_scan[col - left] / 255;
+ }
+ }
+ m_Box = new_box;
+ m_Mask = new_mask;
+ return;
+ }
+ ASSERT(FALSE);
+}
+CFX_PathData::CFX_PathData()
+{
+ m_PointCount = m_AllocCount = 0;
+ m_pPoints = NULL;
+}
+CFX_PathData::~CFX_PathData()
+{
+ if (m_pPoints) {
+ FX_Free(m_pPoints);
+ }
+}
+FX_BOOL CFX_PathData::SetPointCount(int nPoints)
+{
+ m_PointCount = nPoints;
+ if (m_AllocCount < nPoints) {
+ if (m_pPoints) {
+ FX_Free(m_pPoints);
+ m_pPoints = NULL;
+ }
+ m_pPoints = FX_Alloc(FX_PATHPOINT, nPoints);
+ if (!m_pPoints) {
+ return FALSE;
+ }
+ m_AllocCount = nPoints;
+ }
+ return TRUE;
+}
+FX_BOOL CFX_PathData::AllocPointCount(int nPoints)
+{
+ if (m_AllocCount < nPoints) {
+ FX_PATHPOINT* pNewBuf = FX_Alloc(FX_PATHPOINT, nPoints);
+ if (!pNewBuf) {
+ return FALSE;
+ }
+ if (m_PointCount) {
+ FXSYS_memcpy32(pNewBuf, m_pPoints, m_PointCount * sizeof(FX_PATHPOINT));
+ }
+ if (m_pPoints) {
+ FX_Free(m_pPoints);
+ }
+ m_pPoints = pNewBuf;
+ m_AllocCount = nPoints;
+ }
+ return TRUE;
+}
+CFX_PathData::CFX_PathData(const CFX_PathData& src)
+{
+ m_pPoints = NULL;
+ m_PointCount = m_AllocCount = src.m_PointCount;
+ m_pPoints = FX_Alloc(FX_PATHPOINT, src.m_PointCount);
+ if (!m_pPoints) {
+ return;
+ }
+ FXSYS_memcpy32(m_pPoints, src.m_pPoints, sizeof(FX_PATHPOINT) * m_PointCount);
+}
+void CFX_PathData::TrimPoints(int nPoints)
+{
+ if (m_PointCount <= nPoints) {
+ return;
+ }
+ SetPointCount(nPoints);
+}
+FX_BOOL CFX_PathData::AddPointCount(int addPoints)
+{
+ int new_count = m_PointCount + addPoints;
+ if (!AllocPointCount(new_count)) {
+ return FALSE;
+ }
+ m_PointCount = new_count;
+ return TRUE;
+}
+FX_BOOL CFX_PathData::Append(const CFX_PathData* pSrc, const CFX_AffineMatrix* pMatrix)
+{
+ int old_count = m_PointCount;
+ if (!AddPointCount(pSrc->m_PointCount)) {
+ return FALSE;
+ }
+ FXSYS_memcpy32(m_pPoints + old_count, pSrc->m_pPoints, pSrc->m_PointCount * sizeof(FX_PATHPOINT));
+ if (pMatrix == NULL) {
+ return TRUE;
+ }
+ for (int i = 0; i < pSrc->m_PointCount; i ++) {
+ pMatrix->Transform(m_pPoints[old_count + i].m_PointX, m_pPoints[old_count + i].m_PointY);
+ }
+ return TRUE;
+}
+void CFX_PathData::SetPoint(int index, FX_FLOAT x, FX_FLOAT y, int flag)
+{
+ ASSERT(index < m_PointCount);
+ m_pPoints[index].m_PointX = x;
+ m_pPoints[index].m_PointY = y;
+ m_pPoints[index].m_Flag = flag;
+}
+FX_BOOL CFX_PathData::AppendRect(FX_FLOAT left, FX_FLOAT bottom, FX_FLOAT right, FX_FLOAT top)
+{
+ int old_count = m_PointCount;
+ if (!AddPointCount(5)) {
+ return FALSE;
+ }
+ FX_PATHPOINT* pPoints = m_pPoints + old_count;
+ pPoints[0].m_PointX = pPoints[1].m_PointX = pPoints[4].m_PointX = left;
+ pPoints[2].m_PointX = pPoints[3].m_PointX = right;
+ pPoints[0].m_PointY = pPoints[3].m_PointY = pPoints[4].m_PointY = bottom;
+ pPoints[1].m_PointY = pPoints[2].m_PointY = top;
+ pPoints[0].m_Flag = FXPT_MOVETO;
+ pPoints[1].m_Flag = pPoints[2].m_Flag = pPoints[3].m_Flag = FXPT_LINETO;
+ pPoints[4].m_Flag = FXPT_LINETO | FXPT_CLOSEFIGURE;
+ return TRUE;
+}
+CFX_FloatRect CFX_PathData::GetBoundingBox() const
+{
+ CFX_FloatRect rect;
+ if (m_PointCount) {
+ rect.InitRect(m_pPoints[0].m_PointX, m_pPoints[0].m_PointY);
+ for (int i = 1; i < m_PointCount; i ++) {
+ rect.UpdateRect(m_pPoints[i].m_PointX, m_pPoints[i].m_PointY);
+ }
+ }
+ return rect;
+}
+static void _UpdateLineEndPoints(CFX_FloatRect& rect, FX_FLOAT start_x, FX_FLOAT start_y, FX_FLOAT end_x, FX_FLOAT end_y,
+ FX_FLOAT hw)
+{
+ if (start_x == end_x) {
+ if (start_y == end_y) {
+ rect.UpdateRect(end_x + hw, end_y + hw);
+ rect.UpdateRect(end_x - hw, end_y - hw);
+ return;
+ }
+ FX_FLOAT point_y;
+ if (end_y < start_y) {
+ point_y = end_y - hw;
+ } else {
+ point_y = end_y + hw;
+ }
+ rect.UpdateRect(end_x + hw, point_y);
+ rect.UpdateRect(end_x - hw, point_y);
+ return;
+ } else if (start_y == end_y) {
+ FX_FLOAT point_x;
+ if (end_x < start_x) {
+ point_x = end_x - hw;
+ } else {
+ point_x = end_x + hw;
+ }
+ rect.UpdateRect(point_x, end_y + hw);
+ rect.UpdateRect(point_x, end_y - hw);
+ return;
+ }
+ FX_FLOAT dx = end_x - start_x;
+ FX_FLOAT dy = end_y - start_y;
+ FX_FLOAT ll = FXSYS_sqrt2(dx, dy);
+ FX_FLOAT mx = end_x + hw * dx / ll;
+ FX_FLOAT my = end_y + hw * dy / ll;
+ FX_FLOAT dx1 = hw * dy / ll;
+ FX_FLOAT dy1 = hw * dx / ll;
+ rect.UpdateRect(mx - dx1, my + dy1);
+ rect.UpdateRect(mx + dx1, my - dy1);
+}
+static void _UpdateLineJoinPoints(CFX_FloatRect& rect, FX_FLOAT start_x, FX_FLOAT start_y,
+ FX_FLOAT middle_x, FX_FLOAT middle_y, FX_FLOAT end_x, FX_FLOAT end_y,
+ FX_FLOAT half_width, FX_FLOAT miter_limit)
+{
+ FX_FLOAT start_k = 0, start_c = 0, end_k = 0, end_c = 0, start_len = 0, start_dc = 0, end_len = 0, end_dc = 0;
+ FX_BOOL bStartVert = FXSYS_fabs(start_x - middle_x) < 1.0f / 20;
+ FX_BOOL bEndVert = FXSYS_fabs(middle_x - end_x) < 1.0f / 20;
+ if (bStartVert && bEndVert) {
+ int start_dir = middle_y > start_y ? 1 : -1;
+ FX_FLOAT point_y = middle_y + half_width * start_dir;
+ rect.UpdateRect(middle_x + half_width, point_y);
+ rect.UpdateRect(middle_x - half_width, point_y);
+ return;
+ }
+ if (!bStartVert) {
+ start_k = FXSYS_Div(middle_y - start_y, middle_x - start_x);
+ start_c = middle_y - FXSYS_Mul(start_k, middle_x);
+ start_len = FXSYS_sqrt2(start_x - middle_x, start_y - middle_y);
+ start_dc = (FX_FLOAT)FXSYS_fabs(FXSYS_MulDiv(half_width, start_len, start_x - middle_x));
+ }
+ if (!bEndVert) {
+ end_k = FXSYS_Div(end_y - middle_y, end_x - middle_x);
+ end_c = middle_y - FXSYS_Mul(end_k, middle_x);
+ end_len = FXSYS_sqrt2(end_x - middle_x, end_y - middle_y);
+ end_dc = (FX_FLOAT)FXSYS_fabs(FXSYS_MulDiv(half_width, end_len, end_x - middle_x));
+ }
+ if (bStartVert) {
+ FX_FLOAT outside_x = start_x;
+ if (end_x < start_x) {
+ outside_x += half_width;
+ } else {
+ outside_x -= half_width;
+ }
+ FX_FLOAT outside_y;
+ if (start_y < FXSYS_Mul(end_k, start_x) + end_c) {
+ outside_y = FXSYS_Mul(end_k, outside_x) + end_c + end_dc;
+ } else {
+ outside_y = FXSYS_Mul(end_k, outside_x) + end_c - end_dc;
+ }
+ rect.UpdateRect(outside_x, outside_y);
+ return;
+ }
+ if (bEndVert) {
+ FX_FLOAT outside_x = end_x;
+ if (start_x < end_x) {
+ outside_x += half_width;
+ } else {
+ outside_x -= half_width;
+ }
+ FX_FLOAT outside_y;
+ if (end_y < FXSYS_Mul(start_k, end_x) + start_c) {
+ outside_y = FXSYS_Mul(start_k, outside_x) + start_c + start_dc;
+ } else {
+ outside_y = FXSYS_Mul(start_k, outside_x) + start_c - start_dc;
+ }
+ rect.UpdateRect(outside_x, outside_y);
+ return;
+ }
+ if (FXSYS_fabs(start_k - end_k) < 1.0f / 20) {
+ int start_dir = middle_x > start_x ? 1 : -1;
+ int end_dir = end_x > middle_x ? 1 : -1;
+ if (start_dir == end_dir) {
+ _UpdateLineEndPoints(rect, middle_x, middle_y, end_x, end_y, half_width);
+ } else {
+ _UpdateLineEndPoints(rect, start_x, start_y, middle_x, middle_y, half_width);
+ }
+ return;
+ }
+ FX_FLOAT start_outside_c = start_c;
+ if (end_y < FXSYS_Mul(start_k, end_x) + start_c) {
+ start_outside_c += start_dc;
+ } else {
+ start_outside_c -= start_dc;
+ }
+ FX_FLOAT end_outside_c = end_c;
+ if (start_y < FXSYS_Mul(end_k, start_x) + end_c) {
+ end_outside_c += end_dc;
+ } else {
+ end_outside_c -= end_dc;
+ }
+ FX_FLOAT join_x = FXSYS_Div(end_outside_c - start_outside_c, start_k - end_k);
+ FX_FLOAT join_y = FXSYS_Mul(start_k, join_x) + start_outside_c;
+ rect.UpdateRect(join_x, join_y);
+}
+CFX_FloatRect CFX_PathData::GetBoundingBox(FX_FLOAT line_width, FX_FLOAT miter_limit) const
+{
+ CFX_FloatRect rect(100000 * 1.0f, 100000 * 1.0f, -100000 * 1.0f, -100000 * 1.0f);
+ int iPoint = 0;
+ FX_FLOAT half_width = line_width;
+ int iStartPoint, iEndPoint, iMiddlePoint;
+ FX_BOOL bJoin;
+ while (iPoint < m_PointCount) {
+ if (m_pPoints[iPoint].m_Flag == FXPT_MOVETO) {
+ iStartPoint = iPoint + 1;
+ iEndPoint = iPoint;
+ bJoin = FALSE;
+ } else {
+ if (m_pPoints[iPoint].m_Flag == FXPT_BEZIERTO) {
+ rect.UpdateRect(m_pPoints[iPoint].m_PointX, m_pPoints[iPoint].m_PointY);
+ rect.UpdateRect(m_pPoints[iPoint + 1].m_PointX, m_pPoints[iPoint + 1].m_PointY);
+ iPoint += 2;
+ }
+ if (iPoint == m_PointCount - 1 || m_pPoints[iPoint + 1].m_Flag == FXPT_MOVETO) {
+ iStartPoint = iPoint - 1;
+ iEndPoint = iPoint;
+ bJoin = FALSE;
+ } else {
+ iStartPoint = iPoint - 1;
+ iMiddlePoint = iPoint;
+ iEndPoint = iPoint + 1;
+ bJoin = TRUE;
+ }
+ }
+ FX_FLOAT start_x = m_pPoints[iStartPoint].m_PointX;
+ FX_FLOAT start_y = m_pPoints[iStartPoint].m_PointY;
+ FX_FLOAT end_x = m_pPoints[iEndPoint].m_PointX;
+ FX_FLOAT end_y = m_pPoints[iEndPoint].m_PointY;
+ if (bJoin) {
+ FX_FLOAT middle_x = m_pPoints[iMiddlePoint].m_PointX;
+ FX_FLOAT middle_y = m_pPoints[iMiddlePoint].m_PointY;
+ _UpdateLineJoinPoints(rect, start_x, start_y, middle_x, middle_y, end_x, end_y, half_width, miter_limit);
+ } else {
+ _UpdateLineEndPoints(rect, start_x, start_y, end_x, end_y, half_width);
+ }
+ iPoint ++;
+ }
+ return rect;
+}
+void CFX_PathData::Transform(const CFX_AffineMatrix* pMatrix)
+{
+ if (pMatrix == NULL) {
+ return;
+ }
+ for (int i = 0; i < m_PointCount; i ++) {
+ pMatrix->Transform(m_pPoints[i].m_PointX, m_pPoints[i].m_PointY);
+ }
+}
+const int g_Distant[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
+FX_BOOL CFX_PathData::GetZeroAreaPath(CFX_PathData& NewPath, CFX_AffineMatrix* pMatrix, FX_BOOL&bThin, FX_BOOL bAdjust) const
+{
+ if (m_PointCount < 3) {
+ return FALSE;
+ }
+ if (m_PointCount == 3 && (m_pPoints[0].m_Flag & FXPT_TYPE) == FXPT_MOVETO &&
+ (m_pPoints[1].m_Flag & FXPT_TYPE) == FXPT_LINETO && (m_pPoints[2].m_Flag & FXPT_TYPE) == FXPT_LINETO
+ && m_pPoints[0].m_PointX == m_pPoints[2].m_PointX && m_pPoints[0].m_PointY == m_pPoints[2].m_PointY) {
+ NewPath.AddPointCount(2);
+ if (bAdjust) {
+ if (pMatrix) {
+ FX_FLOAT x = m_pPoints[0].m_PointX, y = m_pPoints[0].m_PointY;
+ pMatrix->TransformPoint(x, y);
+ x = (int)x + 0.5f;
+ y = (int)y + 0.5f;
+ NewPath.SetPoint(0, x, y, FXPT_MOVETO);
+ x = m_pPoints[1].m_PointX, y = m_pPoints[1].m_PointY;
+ pMatrix->TransformPoint(x, y);
+ x = (int)x + 0.5f;
+ y = (int)y + 0.5f;
+ NewPath.SetPoint(1, x, y, FXPT_LINETO);
+ pMatrix->SetIdentity();
+ } else {
+ FX_FLOAT x = (int)m_pPoints[0].m_PointX + 0.5f, y = (int)m_pPoints[0].m_PointY + 0.5f;
+ NewPath.SetPoint(0, x, y, FXPT_MOVETO);
+ x = (int)m_pPoints[1].m_PointX + 0.5f, y = (int)m_pPoints[1].m_PointY + 0.5f;
+ NewPath.SetPoint(1, x, y, FXPT_LINETO);
+ }
+ } else {
+ NewPath.SetPoint(0, m_pPoints[0].m_PointX, m_pPoints[0].m_PointY, FXPT_MOVETO);
+ NewPath.SetPoint(1, m_pPoints[1].m_PointX, m_pPoints[1].m_PointY, FXPT_LINETO);
+ }
+ if (m_pPoints[0].m_PointX != m_pPoints[1].m_PointX && m_pPoints[0].m_PointY != m_pPoints[1].m_PointY) {
+ bThin = TRUE;
+ }
+ return TRUE;
+ }
+ if (((m_PointCount > 3) && (m_PointCount % 2))) {
+ int mid = m_PointCount / 2;
+ FX_BOOL bZeroArea = FALSE;
+ CFX_PathData t_path;
+ for (int i = 0; i < mid; i++) {
+ if (!(m_pPoints[mid - i - 1].m_PointX == m_pPoints[mid + i + 1].m_PointX
+ && m_pPoints[mid - i - 1].m_PointY == m_pPoints[mid + i + 1].m_PointY &&
+ ((m_pPoints[mid - i - 1].m_Flag & FXPT_TYPE) != FXPT_BEZIERTO && (m_pPoints[mid + i + 1].m_Flag & FXPT_TYPE) != FXPT_BEZIERTO))) {
+ bZeroArea = TRUE;
+ break;
+ }
+ int new_count = t_path.GetPointCount();
+ t_path.AddPointCount(2);
+ t_path.SetPoint(new_count, m_pPoints[mid - i].m_PointX, m_pPoints[mid - i].m_PointY, FXPT_MOVETO);
+ t_path.SetPoint(new_count + 1, m_pPoints[mid - i - 1].m_PointX, m_pPoints[mid - i - 1].m_PointY, FXPT_LINETO);
+ }
+ if (!bZeroArea) {
+ NewPath.Append(&t_path, NULL);
+ bThin = TRUE;
+ return TRUE;
+ }
+ }
+ int stratPoint = 0;
+ int next = 0, i;
+ for (i = 0; i < m_PointCount; i++) {
+ int point_type = m_pPoints[i].m_Flag & FXPT_TYPE;
+ if (point_type == FXPT_MOVETO) {
+ stratPoint = i;
+ } else if (point_type == FXPT_LINETO) {
+ next = (i + 1 - stratPoint) % (m_PointCount - stratPoint) + stratPoint;
+ if ((m_pPoints[next].m_Flag & FXPT_TYPE) != FXPT_BEZIERTO && (m_pPoints[next].m_Flag & FXPT_TYPE) != FXPT_MOVETO) {
+ if((m_pPoints[i - 1].m_PointX == m_pPoints[i].m_PointX && m_pPoints[i].m_PointX == m_pPoints[next].m_PointX)
+ && ((m_pPoints[i].m_PointY - m_pPoints[i - 1].m_PointY) * (m_pPoints[i].m_PointY - m_pPoints[next].m_PointY) > 0)) {
+ int pre = i;
+ if (FXSYS_fabs(m_pPoints[i].m_PointY - m_pPoints[i - 1].m_PointY)
+ < FXSYS_fabs(m_pPoints[i].m_PointY - m_pPoints[next].m_PointY)) {
+ pre --;
+ next--;
+ }
+ int new_count = NewPath.GetPointCount();
+ NewPath.AddPointCount(2);
+ NewPath.SetPoint(new_count, m_pPoints[pre].m_PointX, m_pPoints[pre].m_PointY, FXPT_MOVETO);
+ NewPath.SetPoint(new_count + 1, m_pPoints[next].m_PointX, m_pPoints[next].m_PointY, FXPT_LINETO);
+ } else if((m_pPoints[i - 1].m_PointY == m_pPoints[i].m_PointY && m_pPoints[i].m_PointY == m_pPoints[next].m_PointY)
+ && ((m_pPoints[i].m_PointX - m_pPoints[i - 1].m_PointX) * (m_pPoints[i].m_PointX - m_pPoints[next].m_PointX) > 0)) {
+ int pre = i;
+ if (FXSYS_fabs(m_pPoints[i].m_PointX - m_pPoints[i - 1].m_PointX)
+ < FXSYS_fabs(m_pPoints[i].m_PointX - m_pPoints[next].m_PointX)) {
+ pre --;
+ next--;
+ }
+ int new_count = NewPath.GetPointCount();
+ NewPath.AddPointCount(2);
+ NewPath.SetPoint(new_count, m_pPoints[pre].m_PointX, m_pPoints[pre].m_PointY, FXPT_MOVETO);
+ NewPath.SetPoint(new_count + 1, m_pPoints[next].m_PointX, m_pPoints[next].m_PointY, FXPT_LINETO);
+ } else if ((m_pPoints[i - 1].m_Flag & FXPT_TYPE) == FXPT_MOVETO && (m_pPoints[next].m_Flag & FXPT_TYPE) == FXPT_LINETO &&
+ m_pPoints[i - 1].m_PointX == m_pPoints[next].m_PointX && m_pPoints[i - 1].m_PointY == m_pPoints[next].m_PointY
+ && m_pPoints[next].m_Flag & FXPT_CLOSEFIGURE) {
+ int new_count = NewPath.GetPointCount();
+ NewPath.AddPointCount(2);
+ NewPath.SetPoint(new_count, m_pPoints[i - 1].m_PointX, m_pPoints[i - 1].m_PointY, FXPT_MOVETO);
+ NewPath.SetPoint(new_count + 1, m_pPoints[i].m_PointX, m_pPoints[i].m_PointY, FXPT_LINETO);
+ bThin = TRUE;
+ }
+ }
+ } else if (point_type == FXPT_BEZIERTO) {
+ i += 2;
+ continue;
+ }
+ }
+ if (m_PointCount > 3 && NewPath.GetPointCount()) {
+ bThin = TRUE;
+ }
+ if (NewPath.GetPointCount() == 0) {
+ return FALSE;
+ }
+ return TRUE;
+}
+FX_BOOL CFX_PathData::IsRect() const
+{
+ if (m_PointCount != 5 && m_PointCount != 4) {
+ return FALSE;
+ }
+ if ((m_PointCount == 5 && (m_pPoints[0].m_PointX != m_pPoints[4].m_PointX ||
+ m_pPoints[0].m_PointY != m_pPoints[4].m_PointY)) ||
+ (m_pPoints[0].m_PointX == m_pPoints[2].m_PointX && m_pPoints[0].m_PointY == m_pPoints[2].m_PointY) ||
+ (m_pPoints[1].m_PointX == m_pPoints[3].m_PointX && m_pPoints[1].m_PointY == m_pPoints[3].m_PointY)) {
+ return FALSE;
+ }
+ if (m_pPoints[0].m_PointX != m_pPoints[3].m_PointX && m_pPoints[0].m_PointY != m_pPoints[3].m_PointY) {
+ return FALSE;
+ }
+ for (int i = 1; i < 4; i ++) {
+ if ((m_pPoints[i].m_Flag & FXPT_TYPE) != FXPT_LINETO) {
+ return FALSE;
+ }
+ if (m_pPoints[i].m_PointX != m_pPoints[i - 1].m_PointX && m_pPoints[i].m_PointY != m_pPoints[i - 1].m_PointY) {
+ return FALSE;
+ }
+ }
+ return m_PointCount == 5 || (m_pPoints[3].m_Flag & FXPT_CLOSEFIGURE);
+}
+FX_BOOL CFX_PathData::IsRect(const CFX_AffineMatrix* pMatrix, CFX_FloatRect* pRect) const
+{
+ if (pMatrix == NULL) {
+ if (!IsRect()) {
+ return FALSE;
+ }
+ if (pRect) {
+ pRect->left = m_pPoints[0].m_PointX;
+ pRect->right = m_pPoints[2].m_PointX;
+ pRect->bottom = m_pPoints[0].m_PointY;
+ pRect->top = m_pPoints[2].m_PointY;
+ pRect->Normalize();
+ }
+ return TRUE;
+ }
+ if (m_PointCount != 5 && m_PointCount != 4) {
+ return FALSE;
+ }
+ if ((m_PointCount == 5 && (m_pPoints[0].m_PointX != m_pPoints[4].m_PointX || m_pPoints[0].m_PointY != m_pPoints[4].m_PointY)) ||
+ (m_pPoints[1].m_PointX == m_pPoints[3].m_PointX && m_pPoints[1].m_PointY == m_pPoints[3].m_PointY)) {
+ return FALSE;
+ }
+ if (m_PointCount == 4 && m_pPoints[0].m_PointX != m_pPoints[3].m_PointX && m_pPoints[0].m_PointY != m_pPoints[3].m_PointY) {
+ return FALSE;
+ }
+ FX_FLOAT x[5], y[5];
+ for (int i = 0; i < m_PointCount; i ++) {
+ pMatrix->Transform(m_pPoints[i].m_PointX, m_pPoints[i].m_PointY, x[i], y[i]);
+ if (i) {
+ if ((m_pPoints[i].m_Flag & FXPT_TYPE) != FXPT_LINETO) {
+ return FALSE;
+ }
+ if (x[i] != x[i - 1] && y[i] != y[i - 1]) {
+ return FALSE;
+ }
+ }
+ }
+ if (pRect) {
+ pRect->left = x[0];
+ pRect->right = x[2];
+ pRect->bottom = y[0];
+ pRect->top = y[2];
+ pRect->Normalize();
+ }
+ return TRUE;
+}
+FX_BOOL CFX_PathData::Copy(const CFX_PathData &src)
+{
+ if (!SetPointCount(src.m_PointCount)) {
+ return FALSE;
+ }
+ FXSYS_memcpy32(m_pPoints, src.m_pPoints, sizeof(FX_PATHPOINT) * m_PointCount);
+ return TRUE;
+}
+CFX_GraphStateData::CFX_GraphStateData()
+{
+ m_LineCap = LineCapButt;
+ m_DashCount = 0;
+ m_DashArray = NULL;
+ m_DashPhase = 0;
+ m_LineJoin = LineJoinMiter;
+ m_MiterLimit = 10 * 1.0f;
+ m_LineWidth = 1.0f;
+}
+CFX_GraphStateData::CFX_GraphStateData(const CFX_GraphStateData& src)
+{
+ m_DashArray = NULL;
+ Copy(src);
+}
+void CFX_GraphStateData::Copy(const CFX_GraphStateData& src)
+{
+ m_LineCap = src.m_LineCap;
+ m_DashCount = src.m_DashCount;
+ if (m_DashArray) {
+ FX_Free(m_DashArray);
+ }
+ m_DashArray = NULL;
+ m_DashPhase = src.m_DashPhase;
+ m_LineJoin = src.m_LineJoin;
+ m_MiterLimit = src.m_MiterLimit;
+ m_LineWidth = src.m_LineWidth;
+ if (m_DashCount) {
+ m_DashArray = FX_Alloc(FX_FLOAT, m_DashCount);
+ if (!m_DashArray) {
+ return;
+ }
+ FXSYS_memcpy32(m_DashArray, src.m_DashArray, m_DashCount * sizeof(FX_FLOAT));
+ }
+}
+CFX_GraphStateData::~CFX_GraphStateData()
+{
+ if (m_DashArray) {
+ FX_Free(m_DashArray);
+ }
+}
+void CFX_GraphStateData::SetDashCount(int count)
+{
+ if (m_DashArray) {
+ FX_Free(m_DashArray);
+ }
+ m_DashArray = NULL;
+ m_DashCount = count;
+ if (count == 0) {
+ return;
+ }
+ m_DashArray = FX_Alloc(FX_FLOAT, count);
+}
diff --git a/core/src/fxge/ge/fx_ge_ps.cpp b/core/src/fxge/ge/fx_ge_ps.cpp
new file mode 100644
index 0000000000..a39ab2dee0
--- /dev/null
+++ b/core/src/fxge/ge/fx_ge_ps.cpp
@@ -0,0 +1,657 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxge/fx_ge.h"
+#include "../../../include/fxcodec/fx_codec.h"
+#include "text_int.h"
+struct PSGlyph {
+ CFX_Font* m_pFont;
+ FX_DWORD m_GlyphIndex;
+ FX_BOOL m_bGlyphAdjust;
+ FX_FLOAT m_AdjustMatrix[4];
+};
+class CPSFont : public CFX_Object
+{
+public:
+ PSGlyph m_Glyphs[256];
+ int m_nGlyphs;
+};
+CFX_PSRenderer::CFX_PSRenderer()
+{
+ m_pOutput = NULL;
+ m_bColorSet = m_bGraphStateSet = FALSE;
+ m_bInited = FALSE;
+}
+CFX_PSRenderer::~CFX_PSRenderer()
+{
+ for (int i = 0; i < (int)m_PSFontList.GetSize(); i ++) {
+ CPSFont* pFont = m_PSFontList[i];
+ delete pFont;
+ }
+}
+#define OUTPUT_PS(str) m_pOutput->OutputPS(str, sizeof str-1)
+void CFX_PSRenderer::Init(IFX_PSOutput* pOutput, int pslevel, int width, int height, FX_BOOL bCmykOutput)
+{
+ m_PSLevel = pslevel;
+ m_pOutput = pOutput;
+ m_ClipBox.left = m_ClipBox.top = 0;
+ m_ClipBox.right = width;
+ m_ClipBox.bottom = height;
+ m_bCmykOutput = bCmykOutput;
+}
+FX_BOOL CFX_PSRenderer::StartRendering()
+{
+ if (m_bInited) {
+ return TRUE;
+ }
+ static const char init_str[] = "\nsave\n/im/initmatrix load def\n"
+ "/n/newpath load def/m/moveto load def/l/lineto load def/c/curveto load def/h/closepath load def\n"
+ "/f/fill load def/F/eofill load def/s/stroke load def/W/clip load def/W*/eoclip load def\n"
+ "/rg/setrgbcolor load def/k/setcmykcolor load def\n"
+ "/J/setlinecap load def/j/setlinejoin load def/w/setlinewidth load def/M/setmiterlimit load def/d/setdash load def\n"
+ "/q/gsave load def/Q/grestore load def/iM/imagemask load def\n"
+ "/Tj/show load def/Ff/findfont load def/Fs/scalefont load def/Sf/setfont load def\n"
+ "/cm/concat load def/Cm/currentmatrix load def/mx/matrix load def/sm/setmatrix load def\n"
+ ;
+ OUTPUT_PS(init_str);
+ m_bInited = TRUE;
+ return TRUE;
+}
+void CFX_PSRenderer::EndRendering()
+{
+ if (m_bInited) {
+ OUTPUT_PS("\nrestore\n");
+ }
+ m_bInited = FALSE;
+}
+void CFX_PSRenderer::SaveState()
+{
+ StartRendering();
+ OUTPUT_PS("q\n");
+ m_ClipBoxStack.Add(m_ClipBox);
+}
+void CFX_PSRenderer::RestoreState(FX_BOOL bKeepSaved)
+{
+ StartRendering();
+ if (bKeepSaved) {
+ OUTPUT_PS("Q\nq\n");
+ } else {
+ OUTPUT_PS("Q\n");
+ }
+ m_bColorSet = m_bGraphStateSet = FALSE;
+ m_ClipBox = m_ClipBoxStack.GetAt(m_ClipBoxStack.GetSize() - 1);
+ if (!bKeepSaved) {
+ m_ClipBoxStack.RemoveAt(m_ClipBoxStack.GetSize() - 1);
+ }
+}
+void CFX_PSRenderer::OutputPath(const CFX_PathData* pPathData, const CFX_AffineMatrix* pObject2Device)
+{
+ int nPoints = pPathData->GetPointCount();
+ CFX_ByteTextBuf buf;
+ buf.EstimateSize(nPoints * 10);
+ for (int i = 0; i < nPoints; i ++) {
+ FX_BYTE flag = pPathData->GetFlag(i);
+ FX_FLOAT x = pPathData->GetPointX(i);
+ FX_FLOAT y = pPathData->GetPointY(i);
+ if (pObject2Device) {
+ pObject2Device->Transform(x, y);
+ }
+ buf << x << FX_BSTRC(" ") << y;
+ switch (flag & FXPT_TYPE) {
+ case FXPT_MOVETO:
+ buf << FX_BSTRC(" m ");
+ break;
+ case FXPT_LINETO:
+ if (flag & FXPT_CLOSEFIGURE) {
+ buf << FX_BSTRC(" l h ");
+ } else {
+ buf << FX_BSTRC(" l ");
+ }
+ break;
+ case FXPT_BEZIERTO: {
+ FX_FLOAT x1 = pPathData->GetPointX(i + 1);
+ FX_FLOAT x2 = pPathData->GetPointX(i + 2);
+ FX_FLOAT y1 = pPathData->GetPointY(i + 1);
+ FX_FLOAT y2 = pPathData->GetPointY(i + 2);
+ if (pObject2Device) {
+ pObject2Device->Transform(x1, y1);
+ pObject2Device->Transform(x2, y2);
+ }
+ buf << FX_BSTRC(" ") << x1 << FX_BSTRC(" ") << y1 << FX_BSTRC(" ") << x2 << FX_BSTRC(" ") << y2;
+ if (flag & FXPT_CLOSEFIGURE) {
+ buf << FX_BSTRC(" c h\n");
+ } else {
+ buf << FX_BSTRC(" c\n");
+ }
+ i += 2;
+ break;
+ }
+ }
+ }
+ m_pOutput->OutputPS((FX_LPCSTR)buf.GetBuffer(), buf.GetSize());
+}
+void CFX_PSRenderer::SetClip_PathFill(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ int fill_mode
+ )
+{
+ StartRendering();
+ OutputPath(pPathData, pObject2Device);
+ CFX_FloatRect rect = pPathData->GetBoundingBox();
+ if (pObject2Device) {
+ rect.Transform(pObject2Device);
+ }
+ m_ClipBox.Intersect(rect.GetOutterRect());
+ if ((fill_mode & 3) == FXFILL_WINDING) {
+ OUTPUT_PS("W n\n");
+ } else {
+ OUTPUT_PS("W* n\n");
+ }
+}
+void CFX_PSRenderer::SetClip_PathStroke(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ const CFX_GraphStateData* pGraphState
+ )
+{
+ StartRendering();
+ SetGraphState(pGraphState);
+ if (pObject2Device) {
+ CFX_ByteTextBuf buf;
+ buf << FX_BSTRC("mx Cm [") << pObject2Device->a << FX_BSTRC(" ") << pObject2Device->b << FX_BSTRC(" ") <<
+ pObject2Device->c << FX_BSTRC(" ") << pObject2Device->d << FX_BSTRC(" ") << pObject2Device->e <<
+ FX_BSTRC(" ") << pObject2Device->f << FX_BSTRC("]cm ");
+ m_pOutput->OutputPS((FX_LPCSTR)buf.GetBuffer(), buf.GetSize());
+ }
+ OutputPath(pPathData, NULL);
+ CFX_FloatRect rect = pPathData->GetBoundingBox(pGraphState->m_LineWidth, pGraphState->m_MiterLimit);
+ rect.Transform(pObject2Device);
+ m_ClipBox.Intersect(rect.GetOutterRect());
+ if (pObject2Device) {
+ OUTPUT_PS("strokepath W n sm\n");
+ } else {
+ OUTPUT_PS("strokepath W n\n");
+ }
+}
+FX_BOOL CFX_PSRenderer::DrawPath(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ const CFX_GraphStateData* pGraphState,
+ FX_DWORD fill_color,
+ FX_DWORD stroke_color,
+ int fill_mode,
+ int alpha_flag,
+ void* pIccTransform
+ )
+{
+ StartRendering();
+ int fill_alpha = FXGETFLAG_COLORTYPE(alpha_flag) ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXARGB_A(fill_color);
+ int stroke_alpha = FXGETFLAG_COLORTYPE(alpha_flag) ? FXGETFLAG_ALPHA_STROKE(alpha_flag) : FXARGB_A(stroke_color);
+ if (fill_alpha && fill_alpha < 255) {
+ return FALSE;
+ }
+ if (stroke_alpha && stroke_alpha < 255) {
+ return FALSE;
+ }
+ if (fill_alpha == 0 && stroke_alpha == 0) {
+ return FALSE;
+ }
+ if (stroke_alpha) {
+ SetGraphState(pGraphState);
+ if (pObject2Device) {
+ CFX_ByteTextBuf buf;
+ buf << FX_BSTRC("mx Cm [") << pObject2Device->a << FX_BSTRC(" ") << pObject2Device->b << FX_BSTRC(" ") <<
+ pObject2Device->c << FX_BSTRC(" ") << pObject2Device->d << FX_BSTRC(" ") << pObject2Device->e <<
+ FX_BSTRC(" ") << pObject2Device->f << FX_BSTRC("]cm ");
+ m_pOutput->OutputPS((FX_LPCSTR)buf.GetBuffer(), buf.GetSize());
+ }
+ }
+ OutputPath(pPathData, stroke_alpha ? NULL : pObject2Device);
+ if (fill_mode && fill_alpha) {
+ SetColor(fill_color, alpha_flag, pIccTransform);
+ if ((fill_mode & 3) == FXFILL_WINDING) {
+ if (stroke_alpha) {
+ OUTPUT_PS("q f Q ");
+ } else {
+ OUTPUT_PS("f");
+ }
+ } else if ((fill_mode & 3) == FXFILL_ALTERNATE) {
+ if (stroke_alpha) {
+ OUTPUT_PS("q F Q ");
+ } else {
+ OUTPUT_PS("F");
+ }
+ }
+ }
+ if (stroke_alpha) {
+ SetColor(stroke_color, alpha_flag, pIccTransform);
+ if (pObject2Device) {
+ OUTPUT_PS("s sm");
+ } else {
+ OUTPUT_PS("s");
+ }
+ }
+ OUTPUT_PS("\n");
+ return TRUE;
+}
+void CFX_PSRenderer::SetGraphState(const CFX_GraphStateData* pGraphState)
+{
+ CFX_ByteTextBuf buf;
+ if (!m_bGraphStateSet || m_CurGraphState.m_LineCap != pGraphState->m_LineCap) {
+ buf << pGraphState->m_LineCap << FX_BSTRC(" J\n");
+ }
+ if (!m_bGraphStateSet || m_CurGraphState.m_DashCount != pGraphState->m_DashCount ||
+ FXSYS_memcmp32(m_CurGraphState.m_DashArray, pGraphState->m_DashArray, sizeof(FX_FLOAT)*m_CurGraphState.m_DashCount)) {
+ buf << FX_BSTRC("[");
+ for (int i = 0; i < pGraphState->m_DashCount; i ++) {
+ buf << pGraphState->m_DashArray[i] << FX_BSTRC(" ");
+ }
+ buf << FX_BSTRC("]") << pGraphState->m_DashPhase << FX_BSTRC(" d\n");
+ }
+ if (!m_bGraphStateSet || m_CurGraphState.m_LineJoin != pGraphState->m_LineJoin) {
+ buf << pGraphState->m_LineJoin << FX_BSTRC(" j\n");
+ }
+ if (!m_bGraphStateSet || m_CurGraphState.m_LineWidth != pGraphState->m_LineWidth) {
+ buf << pGraphState->m_LineWidth << FX_BSTRC(" w\n");
+ }
+ if (!m_bGraphStateSet || m_CurGraphState.m_MiterLimit != pGraphState->m_MiterLimit) {
+ buf << pGraphState->m_MiterLimit << FX_BSTRC(" M\n");
+ }
+ m_CurGraphState.Copy(*pGraphState);
+ m_bGraphStateSet = TRUE;
+ if (buf.GetSize()) {
+ m_pOutput->OutputPS((FX_LPCSTR)buf.GetBuffer(), buf.GetSize());
+ }
+}
+static void FaxCompressData(FX_LPBYTE src_buf, int width, int height, FX_LPBYTE& dest_buf, FX_DWORD& dest_size)
+{
+ CCodec_ModuleMgr* pEncoders = CFX_GEModule::Get()->GetCodecModule();
+ if (width * height > 128 && pEncoders && pEncoders->GetFaxModule()->Encode(src_buf, width, height, (width + 7) / 8, dest_buf, dest_size)) {
+ FX_Free(src_buf);
+ } else {
+ dest_buf = src_buf;
+ dest_size = (width + 7) / 8 * height;
+ }
+}
+static void PSCompressData(int PSLevel, FX_LPBYTE src_buf, FX_DWORD src_size,
+ FX_LPBYTE& output_buf, FX_DWORD& output_size, FX_LPCSTR& filter)
+{
+ output_buf = src_buf;
+ output_size = src_size;
+ filter = "";
+ if (src_size < 1024) {
+ return;
+ }
+ CCodec_ModuleMgr* pEncoders = CFX_GEModule::Get()->GetCodecModule();
+ FX_LPBYTE dest_buf = NULL;
+ FX_DWORD dest_size = src_size;
+ if (PSLevel >= 3) {
+ if (pEncoders && pEncoders->GetFlateModule()->Encode(src_buf, src_size, dest_buf, dest_size)) {
+ filter = "/FlateDecode filter ";
+ }
+ } else {
+ if (pEncoders && pEncoders->GetBasicModule()->RunLengthEncode(src_buf, src_size, dest_buf, dest_size)) {
+ filter = "/RunLengthDecode filter ";
+ }
+ }
+ if (dest_size < src_size) {
+ output_buf = dest_buf;
+ output_size = dest_size;
+ } else {
+ filter = NULL;
+ if (dest_buf) {
+ FX_Free(dest_buf);
+ }
+ }
+}
+FX_BOOL CFX_PSRenderer::SetDIBits(const CFX_DIBSource* pSource, FX_DWORD color, int left, int top,
+ int alpha_flag, void* pIccTransform)
+{
+ StartRendering();
+ CFX_AffineMatrix matrix((FX_FLOAT)(pSource->GetWidth()), 0.0f, 0.0f, -(FX_FLOAT)(pSource->GetHeight()),
+ (FX_FLOAT)(left), (FX_FLOAT)(top + pSource->GetHeight()));
+ return DrawDIBits(pSource, color, &matrix, 0, alpha_flag, pIccTransform);
+}
+FX_BOOL CFX_PSRenderer::StretchDIBits(const CFX_DIBSource* pSource, FX_DWORD color, int dest_left, int dest_top,
+ int dest_width, int dest_height, FX_DWORD flags,
+ int alpha_flag, void* pIccTransform)
+{
+ StartRendering();
+ CFX_AffineMatrix matrix((FX_FLOAT)(dest_width), 0.0f, 0.0f, (FX_FLOAT)(-dest_height),
+ (FX_FLOAT)(dest_left), (FX_FLOAT)(dest_top + dest_height));
+ return DrawDIBits(pSource, color, &matrix, flags, alpha_flag, pIccTransform);
+}
+FX_BOOL CFX_PSRenderer::DrawDIBits(const CFX_DIBSource* pSource, FX_DWORD color,
+ const CFX_AffineMatrix* pMatrix, FX_DWORD flags,
+ int alpha_flag, void* pIccTransform)
+{
+ StartRendering();
+ if ((pMatrix->a == 0 && pMatrix->b == 0) || (pMatrix->c == 0 && pMatrix->d == 0)) {
+ return TRUE;
+ }
+ if (pSource->HasAlpha()) {
+ return FALSE;
+ }
+ int alpha = FXGETFLAG_COLORTYPE(alpha_flag) ? FXGETFLAG_ALPHA_FILL(color) : FXARGB_A(color);
+ if (pSource->IsAlphaMask() && (alpha < 255 || pSource->GetBPP() != 1)) {
+ return FALSE;
+ }
+ OUTPUT_PS("q\n");
+ CFX_ByteTextBuf buf;
+ buf << FX_BSTRC("[") << pMatrix->a << FX_BSTRC(" ") << pMatrix->b << FX_BSTRC(" ") <<
+ pMatrix->c << FX_BSTRC(" ") << pMatrix->d << FX_BSTRC(" ") << pMatrix->e <<
+ FX_BSTRC(" ") << pMatrix->f << FX_BSTRC("]cm ");
+ int width = pSource->GetWidth();
+ int height = pSource->GetHeight();
+ buf << width << FX_BSTRC(" ") << height;
+ if (pSource->GetBPP() == 1 && pSource->GetPalette() == NULL) {
+ int pitch = (width + 7) / 8;
+ FX_DWORD src_size = height * pitch;
+ FX_LPBYTE src_buf = FX_Alloc(FX_BYTE, src_size);
+ if (!src_buf) {
+ return FALSE;
+ }
+ for (int row = 0; row < height; row ++) {
+ FX_LPCBYTE src_scan = pSource->GetScanline(row);
+ FXSYS_memcpy32(src_buf + row * pitch, src_scan, pitch);
+ }
+ FX_LPBYTE output_buf;
+ FX_DWORD output_size;
+ FaxCompressData(src_buf, width, height, output_buf, output_size);
+ if (pSource->IsAlphaMask()) {
+ SetColor(color, alpha_flag, pIccTransform);
+ m_bColorSet = FALSE;
+ buf << FX_BSTRC(" true[");
+ } else {
+ buf << FX_BSTRC(" 1[");
+ }
+ buf << width << FX_BSTRC(" 0 0 -") << height << FX_BSTRC(" 0 ") << height <<
+ FX_BSTRC("]currentfile/ASCII85Decode filter ");
+ if (output_buf != src_buf)
+ buf << FX_BSTRC("<</K -1/EndOfBlock false/Columns ") << width << FX_BSTRC("/Rows ") << height <<
+ FX_BSTRC(">>/CCITTFaxDecode filter ");
+ if (pSource->IsAlphaMask()) {
+ buf << FX_BSTRC("iM\n");
+ } else {
+ buf << FX_BSTRC("false 1 colorimage\n");
+ }
+ m_pOutput->OutputPS((FX_LPCSTR)buf.GetBuffer(), buf.GetSize());
+ WritePSBinary(output_buf, output_size);
+ FX_Free(output_buf);
+ } else {
+ CFX_DIBSource* pConverted = (CFX_DIBSource*)pSource;
+ if (pIccTransform) {
+ FXDIB_Format format = m_bCmykOutput ? FXDIB_Cmyk : FXDIB_Rgb;
+ pConverted = pSource->CloneConvert(format, NULL, pIccTransform);
+ } else {
+ switch (pSource->GetFormat()) {
+ case FXDIB_1bppRgb:
+ case FXDIB_Rgb32:
+ pConverted = pSource->CloneConvert(FXDIB_Rgb);
+ break;
+ case FXDIB_8bppRgb:
+ if (pSource->GetPalette() != NULL) {
+ pConverted = pSource->CloneConvert(FXDIB_Rgb);
+ }
+ break;
+ case FXDIB_1bppCmyk:
+ pConverted = pSource->CloneConvert(FXDIB_Cmyk);
+ break;
+ case FXDIB_8bppCmyk:
+ if (pSource->GetPalette() != NULL) {
+ pConverted = pSource->CloneConvert(FXDIB_Cmyk);
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ if (pConverted == NULL) {
+ OUTPUT_PS("\nQ\n");
+ return FALSE;
+ }
+ int Bpp = pConverted->GetBPP() / 8;
+ FX_LPBYTE output_buf = NULL;
+ FX_STRSIZE output_size = 0;
+ FX_LPCSTR filter = NULL;
+ if (flags & FXRENDER_IMAGE_LOSSY) {
+ CCodec_ModuleMgr* pEncoders = CFX_GEModule::Get()->GetCodecModule();
+ if (pEncoders && pEncoders->GetJpegModule()->Encode(pConverted, output_buf, output_size)) {
+ filter = "/DCTDecode filter ";
+ }
+ }
+ if (filter == NULL) {
+ int src_pitch = width * Bpp;
+ output_size = height * src_pitch;
+ output_buf = FX_Alloc(FX_BYTE, output_size);
+ if (!output_buf) {
+ if (pConverted != pSource) {
+ delete pConverted;
+ pConverted = NULL;
+ }
+ return FALSE;
+ }
+ for (int row = 0; row < height; row ++) {
+ FX_LPCBYTE src_scan = pConverted->GetScanline(row);
+ FX_LPBYTE dest_scan = output_buf + row * src_pitch;
+ if (Bpp == 3) {
+ for (int col = 0; col < width; col ++) {
+ *dest_scan++ = src_scan[2];
+ *dest_scan++ = src_scan[1];
+ *dest_scan++ = *src_scan;
+ src_scan += 3;
+ }
+ } else {
+ FXSYS_memcpy32(dest_scan, src_scan, src_pitch);
+ }
+ }
+ FX_LPBYTE compressed_buf;
+ FX_DWORD compressed_size;
+ PSCompressData(m_PSLevel, output_buf, output_size, compressed_buf, compressed_size, filter);
+ if (output_buf != compressed_buf) {
+ FX_Free(output_buf);
+ }
+ output_buf = compressed_buf;
+ output_size = compressed_size;
+ }
+ if (pConverted != pSource) {
+ delete pConverted;
+ pConverted = NULL;
+ }
+ buf << FX_BSTRC(" 8[");
+ buf << width << FX_BSTRC(" 0 0 -") << height << FX_BSTRC(" 0 ") << height << FX_BSTRC("]");
+ buf << FX_BSTRC("currentfile/ASCII85Decode filter ");
+ if (filter) {
+ buf << filter;
+ }
+ buf << FX_BSTRC("false ") << Bpp;
+ buf << FX_BSTRC(" colorimage\n");
+ m_pOutput->OutputPS((FX_LPCSTR)buf.GetBuffer(), buf.GetSize());
+ WritePSBinary(output_buf, output_size);
+ FX_Free(output_buf);
+ }
+ OUTPUT_PS("\nQ\n");
+ return TRUE;
+}
+void CFX_PSRenderer::SetColor(FX_DWORD color, int alpha_flag, void* pIccTransform)
+{
+ if (!CFX_GEModule::Get()->GetCodecModule() || !CFX_GEModule::Get()->GetCodecModule()->GetIccModule()) {
+ pIccTransform = NULL;
+ }
+ FX_BOOL bCMYK = FALSE;
+ if (pIccTransform) {
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ color = FXGETFLAG_COLORTYPE(alpha_flag) ? FXCMYK_TODIB(color) : FXARGB_TODIB(color);
+ FX_LPBYTE pColor = (FX_LPBYTE)&color;
+ pIccModule->TranslateScanline(pIccTransform, pColor, pColor, 1);
+ color = m_bCmykOutput ? FXCMYK_TODIB(color) : FXARGB_TODIB(color);
+ bCMYK = m_bCmykOutput;
+ } else {
+ bCMYK = FXGETFLAG_COLORTYPE(alpha_flag);
+ }
+ if (bCMYK != m_bCmykOutput || !m_bColorSet || m_LastColor != color) {
+ CFX_ByteTextBuf buf;
+ if (bCMYK) {
+ buf << FXSYS_GetCValue(color) / 255.0 << FX_BSTRC(" ") << FXSYS_GetMValue(color) / 255.0 << FX_BSTRC(" ")
+ << FXSYS_GetYValue(color) / 255.0 << FX_BSTRC(" ") << FXSYS_GetKValue(color) / 255.0 << FX_BSTRC(" k\n");
+ } else {
+ buf << FXARGB_R(color) / 255.0 << FX_BSTRC(" ") << FXARGB_G(color) / 255.0 << FX_BSTRC(" ")
+ << FXARGB_B(color) / 255.0 << FX_BSTRC(" rg\n");
+ }
+ if (bCMYK == m_bCmykOutput) {
+ m_bColorSet = TRUE;
+ m_LastColor = color;
+ }
+ m_pOutput->OutputPS((FX_LPCSTR)buf.GetBuffer(), buf.GetSize());
+ }
+}
+void CFX_PSRenderer::FindPSFontGlyph(CFX_FaceCache* pFaceCache, CFX_Font* pFont, const FXTEXT_CHARPOS& charpos,
+ int& ps_fontnum, int &ps_glyphindex)
+{
+ for (int i = 0; i < (int)m_PSFontList.GetSize(); i ++) {
+ CPSFont* pPSFont = m_PSFontList[i];
+ for (int j = 0; j < pPSFont->m_nGlyphs; j ++)
+ if (pPSFont->m_Glyphs[j].m_pFont == pFont && pPSFont->m_Glyphs[j].m_GlyphIndex == charpos.m_GlyphIndex) {
+ if ((!pPSFont->m_Glyphs[j].m_bGlyphAdjust && !charpos.m_bGlyphAdjust) ||
+ (pPSFont->m_Glyphs[j].m_bGlyphAdjust && charpos.m_bGlyphAdjust &&
+ (FXSYS_fabs(pPSFont->m_Glyphs[j].m_AdjustMatrix[0] - charpos.m_AdjustMatrix[0]) < 0.01 &&
+ FXSYS_fabs(pPSFont->m_Glyphs[j].m_AdjustMatrix[1] - charpos.m_AdjustMatrix[1]) < 0.01 &&
+ FXSYS_fabs(pPSFont->m_Glyphs[j].m_AdjustMatrix[2] - charpos.m_AdjustMatrix[2]) < 0.01 &&
+ FXSYS_fabs(pPSFont->m_Glyphs[j].m_AdjustMatrix[3] - charpos.m_AdjustMatrix[3]) < 0.01))) {
+ ps_fontnum = i;
+ ps_glyphindex = j;
+ return;
+ }
+ }
+ }
+ if (m_PSFontList.GetSize() == 0 || m_PSFontList[m_PSFontList.GetSize() - 1]->m_nGlyphs == 256) {
+ CPSFont* pPSFont = FX_NEW CPSFont;
+ if (!pPSFont) {
+ return;
+ }
+ pPSFont->m_nGlyphs = 0;
+ m_PSFontList.Add(pPSFont);
+ CFX_ByteTextBuf buf;
+ buf << FX_BSTRC("8 dict begin/FontType 3 def/FontMatrix[1 0 0 1 0 0]def\n"
+ "/FontBBox[0 0 0 0]def/Encoding 256 array def 0 1 255{Encoding exch/.notdef put}for\n"
+ "/CharProcs 1 dict def CharProcs begin/.notdef {} def end\n"
+ "/BuildGlyph{1 0 -10 -10 10 10 setcachedevice exch/CharProcs get exch 2 copy known not{pop/.notdef}if get exec}bind def\n"
+ "/BuildChar{1 index/Encoding get exch get 1 index/BuildGlyph get exec}bind def\n"
+ "currentdict end\n");
+ buf << FX_BSTRC("/X") << m_PSFontList.GetSize() - 1 << FX_BSTRC(" exch definefont pop\n");
+ m_pOutput->OutputPS((FX_LPCSTR)buf.GetBuffer(), buf.GetSize());
+ buf.Clear();
+ }
+ ps_fontnum = m_PSFontList.GetSize() - 1;
+ CPSFont* pPSFont = m_PSFontList[ps_fontnum];
+ ps_glyphindex = pPSFont->m_nGlyphs;
+ pPSFont->m_Glyphs[ps_glyphindex].m_GlyphIndex = charpos.m_GlyphIndex;
+ pPSFont->m_Glyphs[ps_glyphindex].m_pFont = pFont;
+ pPSFont->m_Glyphs[ps_glyphindex].m_bGlyphAdjust = charpos.m_bGlyphAdjust;
+ if (charpos.m_bGlyphAdjust) {
+ pPSFont->m_Glyphs[ps_glyphindex].m_AdjustMatrix[0] = charpos.m_AdjustMatrix[0];
+ pPSFont->m_Glyphs[ps_glyphindex].m_AdjustMatrix[1] = charpos.m_AdjustMatrix[1];
+ pPSFont->m_Glyphs[ps_glyphindex].m_AdjustMatrix[2] = charpos.m_AdjustMatrix[2];
+ pPSFont->m_Glyphs[ps_glyphindex].m_AdjustMatrix[3] = charpos.m_AdjustMatrix[3];
+ }
+ pPSFont->m_nGlyphs ++;
+ CFX_AffineMatrix matrix;
+ if (charpos.m_bGlyphAdjust)
+ matrix.Set(charpos.m_AdjustMatrix[0], charpos.m_AdjustMatrix[1],
+ charpos.m_AdjustMatrix[2], charpos.m_AdjustMatrix[3], 0, 0);
+ matrix.Concat(1.0f, 0, 0, 1.0f, 0, 0);
+ const CFX_PathData* pPathData = pFaceCache->LoadGlyphPath(pFont, charpos.m_GlyphIndex, charpos.m_FontCharWidth);
+ if (pPathData == NULL) {
+ return;
+ }
+ CFX_PathData TransformedPath(*pPathData);
+ if (charpos.m_bGlyphAdjust) {
+ TransformedPath.Transform(&matrix);
+ }
+ CFX_ByteTextBuf buf;
+ buf << FX_BSTRC("/X") << ps_fontnum << FX_BSTRC(" Ff/CharProcs get begin/")
+ << ps_glyphindex << FX_BSTRC("{");
+ buf << FX_BSTRC("n ");
+ for (int p = 0; p < TransformedPath.GetPointCount(); p ++) {
+ FX_FLOAT x = TransformedPath.GetPointX(p), y = TransformedPath.GetPointY(p);
+ switch (TransformedPath.GetFlag(p) & FXPT_TYPE) {
+ case FXPT_MOVETO: {
+ buf << x << FX_BSTRC(" ") << y << FX_BSTRC(" m\n");
+ break;
+ }
+ case FXPT_LINETO: {
+ buf << x << FX_BSTRC(" ") << y << FX_BSTRC(" l\n");
+ break;
+ }
+ case FXPT_BEZIERTO: {
+ buf << x << FX_BSTRC(" ") << y << FX_BSTRC(" ")
+ << TransformedPath.GetPointX(p + 1) << FX_BSTRC(" ")
+ << TransformedPath.GetPointY(p + 1) << FX_BSTRC(" ")
+ << TransformedPath.GetPointX(p + 2) << FX_BSTRC(" ")
+ << TransformedPath.GetPointY(p + 2) << FX_BSTRC(" c\n");
+ p += 2;
+ break;
+ }
+ }
+ }
+ buf << FX_BSTRC("f");
+ buf << FX_BSTRC("}bind def end\n");
+ buf << FX_BSTRC("/X") << ps_fontnum << FX_BSTRC(" Ff/Encoding get ") << ps_glyphindex
+ << FX_BSTRC("/") << ps_glyphindex << FX_BSTRC(" put\n");
+ m_pOutput->OutputPS((FX_LPCSTR)buf.GetBuffer(), buf.GetSize());
+}
+FX_BOOL CFX_PSRenderer::DrawText(int nChars, const FXTEXT_CHARPOS* pCharPos, CFX_Font* pFont,
+ CFX_FontCache* pCache, const CFX_AffineMatrix* pObject2Device,
+ FX_FLOAT font_size, FX_DWORD color,
+ int alpha_flag, void* pIccTransform)
+{
+ StartRendering();
+ int alpha = FXGETFLAG_COLORTYPE(alpha_flag) ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXARGB_A(color);
+ if (alpha < 255) {
+ return FALSE;
+ }
+ if ((pObject2Device->a == 0 && pObject2Device->b == 0) || (pObject2Device->c == 0 && pObject2Device->d == 0)) {
+ return TRUE;
+ }
+ SetColor(color, alpha_flag, pIccTransform);
+ CFX_ByteTextBuf buf;
+ buf << FX_BSTRC("q[") << pObject2Device->a << FX_BSTRC(" ") << pObject2Device->b << FX_BSTRC(" ")
+ << pObject2Device->c << FX_BSTRC(" ") << pObject2Device->d;
+ buf << FX_BSTRC(" ") << pObject2Device->e << FX_BSTRC(" ") << pObject2Device->f << "]cm\n";
+ if (pCache == NULL) {
+ pCache = CFX_GEModule::Get()->GetFontCache();
+ }
+ CFX_FaceCache* pFaceCache = pCache->GetCachedFace(pFont);
+ FX_FONTCACHE_DEFINE(pCache, pFont);
+ int last_fontnum = -1;
+ for (int i = 0; i < nChars; i ++) {
+ int ps_fontnum, ps_glyphindex;
+ FindPSFontGlyph(pFaceCache, pFont, pCharPos[i], ps_fontnum, ps_glyphindex);
+ if (last_fontnum != ps_fontnum) {
+ buf << FX_BSTRC("/X") << ps_fontnum << FX_BSTRC(" Ff ") << font_size
+ << FX_BSTRC(" Fs Sf ");
+ last_fontnum = ps_fontnum;
+ }
+ buf << pCharPos[i].m_OriginX << FX_BSTRC(" ")
+ << pCharPos[i].m_OriginY << FX_BSTRC(" m");
+ CFX_ByteString hex;
+ hex.Format("<%02X>", ps_glyphindex);
+ buf << hex << FX_BSTRC("Tj\n");
+ }
+ buf << FX_BSTRC("Q\n");
+ m_pOutput->OutputPS((FX_LPCSTR)buf.GetBuffer(), buf.GetSize());
+ return TRUE;
+}
+void CFX_PSRenderer::WritePSBinary(FX_LPCBYTE data, int len)
+{
+ FX_LPBYTE dest_buf;
+ FX_DWORD dest_size;
+ CCodec_ModuleMgr* pEncoders = CFX_GEModule::Get()->GetCodecModule();
+ if (pEncoders && pEncoders->GetBasicModule()->A85Encode(data, len, dest_buf, dest_size)) {
+ m_pOutput->OutputPS((FX_LPCSTR)dest_buf, dest_size);
+ FX_Free(dest_buf);
+ } else {
+ m_pOutput->OutputPS((FX_LPCSTR)data, len);
+ }
+}
diff --git a/core/src/fxge/ge/fx_ge_text.cpp b/core/src/fxge/ge/fx_ge_text.cpp
new file mode 100644
index 0000000000..3c08cd62d4
--- /dev/null
+++ b/core/src/fxge/ge/fx_ge_text.cpp
@@ -0,0 +1,1774 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxge/fx_ge.h"
+#include "../../../include/fxge/fx_freetype.h"
+#include "../../../include/fxcodec/fx_codec.h"
+#include "text_int.h"
+#undef FX_GAMMA
+#undef FX_GAMMA_INVERSE
+#define FX_GAMMA(value) (value)
+#define FX_GAMMA_INVERSE(value) (value)
+FX_RECT FXGE_GetGlyphsBBox(FXTEXT_GLYPHPOS* pGlyphAndPos, int nChars, int anti_alias, FX_FLOAT retinaScaleX, FX_FLOAT retinaScaleY)
+{
+ FX_RECT rect(0, 0, 0, 0);
+ FX_BOOL bStarted = FALSE;
+ for (int iChar = 0; iChar < nChars; iChar ++) {
+ FXTEXT_GLYPHPOS& glyph = pGlyphAndPos[iChar];
+ const CFX_GlyphBitmap* pGlyph = glyph.m_pGlyph;
+ if (pGlyph == NULL) {
+ continue;
+ }
+ int char_left = glyph.m_OriginX + pGlyph->m_Left;
+ int char_width = (int)(pGlyph->m_Bitmap.GetWidth() / retinaScaleX);
+ if (anti_alias == FXFT_RENDER_MODE_LCD) {
+ char_width /= 3;
+ }
+ int char_right = char_left + char_width;
+ int char_top = glyph.m_OriginY - pGlyph->m_Top;
+ int char_bottom = char_top + (int)(pGlyph->m_Bitmap.GetHeight() / retinaScaleY);
+ if (!bStarted) {
+ rect.left = char_left;
+ rect.right = char_right;
+ rect.top = char_top;
+ rect.bottom = char_bottom;
+ bStarted = TRUE;
+ } else {
+ if (rect.left > char_left) {
+ rect.left = char_left;
+ }
+ if (rect.right < char_right) {
+ rect.right = char_right;
+ }
+ if (rect.top > char_top) {
+ rect.top = char_top;
+ }
+ if (rect.bottom < char_bottom) {
+ rect.bottom = char_bottom;
+ }
+ }
+ }
+ return rect;
+}
+static void _AdjustGlyphSpace(FXTEXT_GLYPHPOS* pGlyphAndPos, int nChars)
+{
+ ASSERT(nChars > 1);
+ FX_BOOL bVertical = FALSE;
+ if (pGlyphAndPos[nChars - 1].m_OriginX == pGlyphAndPos[0].m_OriginX) {
+ bVertical = TRUE;
+ } else if (pGlyphAndPos[nChars - 1].m_OriginY != pGlyphAndPos[0].m_OriginY) {
+ return;
+ }
+ int i = nChars - 1;
+ int* next_origin = bVertical ? &pGlyphAndPos[i].m_OriginY : &pGlyphAndPos[i].m_OriginX;
+ FX_FLOAT next_origin_f = bVertical ? pGlyphAndPos[i].m_fOriginY : pGlyphAndPos[i].m_fOriginX;
+ for (i --; i > 0; i --) {
+ int* this_origin = bVertical ? &pGlyphAndPos[i].m_OriginY : &pGlyphAndPos[i].m_OriginX;
+ FX_FLOAT this_origin_f = bVertical ? pGlyphAndPos[i].m_fOriginY : pGlyphAndPos[i].m_fOriginX;
+ int space = (*next_origin) - (*this_origin);
+ FX_FLOAT space_f = next_origin_f - this_origin_f;
+ FX_FLOAT error = (FX_FLOAT)(FXSYS_fabs(space_f) - FXSYS_fabs((FX_FLOAT)(space)));
+ if (error > 0.5f) {
+ *this_origin += space > 0 ? -1 : 1;
+ }
+ next_origin = this_origin;
+ next_origin_f = this_origin_f;
+ }
+}
+static const FX_BYTE g_GdipGamma_bgw[9] = {0, 0, 63, 120, 0, 168, 210, 239, 255};
+static const FX_BYTE g_GdipGamma_fgw[9] = {0, 0, 16, 45, 0, 87, 135, 192, 255};
+static const FX_BYTE g_GdipGammaAdjust_47[48] = {
+ 0, 30, 33, 34, 35, 36, 37, 38, 38, 39, 39, 40, 40, 40, 41, 41, 41, 42, 42, 42, 42, 43,
+ 43, 43, 43, 43, 44, 44, 44, 44, 44, 44, 45, 45, 45, 45, 45, 45, 45, 46,
+ 46, 46, 46, 46, 46, 46, 46, 47
+};
+static const FX_BYTE g_GdipGammaAdjust_75[76] = {
+ 0, 46, 50, 52, 54, 55, 56, 57, 58, 59, 60, 60, 61, 61, 62, 62, 63, 63, 64, 64, 64, 65,
+ 65, 65, 66, 66, 66, 67, 67, 67, 67, 68, 68, 68, 68, 68, 69, 69, 69, 69, 69, 70, 70, 70,
+ 70, 70, 71, 71, 71, 71, 71, 71, 72, 72, 72, 72, 72, 72, 72, 73, 73, 73, 73, 73, 73, 73,
+ 73, 74, 74, 74, 74, 74, 74, 74, 74, 75
+};
+static const FX_BYTE g_GdipGammaAdjust_81[82] = {
+ 0, 49, 53, 56, 58, 59, 60, 61, 62, 63, 64, 65, 65, 66, 66, 67, 67, 68, 68, 69, 69, 69, 70, 70, 70,
+ 71, 71, 71, 72, 72, 72, 72, 73, 73, 73, 73, 74, 74, 74, 74, 74, 75, 75, 75, 75, 75, 76, 76, 76, 76,
+ 76, 76, 77, 77, 77, 77, 77, 77, 78, 78, 78, 78, 78, 78, 78, 79, 79, 79, 79, 79, 79, 79, 79, 80,
+ 80, 80, 80, 80, 80, 80, 80, 81
+};
+static void _Adjust_alpha(int background, int foreground, int& src_alpha, int text_flags, int a)
+{
+}
+static const FX_BYTE g_TextGammaAdjust[256] = {
+ 0, 2, 3, 4, 6, 7, 8, 10, 11, 12, 13, 15, 16, 17, 18, 19,
+ 21, 22, 23, 24, 25, 26, 27, 29, 30, 31, 32, 33, 34, 35, 36, 38,
+ 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 51, 52, 53, 54, 55,
+ 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 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, 128, 129, 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, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166,
+ 167, 168, 169, 170, 171, 172, 173, 174, 174, 175, 176, 177, 178, 179, 180, 181,
+ 182, 183, 184, 185, 186, 187, 188, 189, 190, 190, 191, 192, 193, 194, 195, 196,
+ 197, 198, 199, 200, 201, 202, 203, 204, 204, 205, 206, 207, 208, 209, 210, 211,
+ 212, 213, 214, 215, 216, 217, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226,
+ 227, 228, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 239, 240,
+ 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 250, 251, 252, 253, 254, 255,
+};
+#define ADJUST_ALPHA(background, foreground, src_alpha, text_flags, a) \
+ src_alpha = g_TextGammaAdjust[(FX_BYTE)src_alpha];
+void _Color2Argb(FX_ARGB& argb, FX_DWORD color, int alpha_flag, void* pIccTransform)
+{
+ if (pIccTransform == NULL && !FXGETFLAG_COLORTYPE(alpha_flag)) {
+ argb = color;
+ return;
+ }
+ if (!CFX_GEModule::Get()->GetCodecModule() || !CFX_GEModule::Get()->GetCodecModule()->GetIccModule()) {
+ pIccTransform = NULL;
+ }
+ FX_BYTE bgra[4];
+ if (pIccTransform) {
+ ICodec_IccModule* pIccModule = CFX_GEModule::Get()->GetCodecModule()->GetIccModule();
+ color = FXGETFLAG_COLORTYPE(alpha_flag) ? FXCMYK_TODIB(color) : FXARGB_TODIB(color);
+ pIccModule->TranslateScanline(pIccTransform, bgra, (FX_LPCBYTE)&color, 1);
+ bgra[3] = FXGETFLAG_COLORTYPE(alpha_flag) ?
+ (alpha_flag >> 24) ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXGETFLAG_ALPHA_STROKE(alpha_flag) :
+ FXARGB_A(color);
+ argb = FXARGB_MAKE(bgra[3], bgra[2], bgra[1], bgra[0]);
+ return;
+ }
+ AdobeCMYK_to_sRGB1(FXSYS_GetCValue(color), FXSYS_GetMValue(color),
+ FXSYS_GetYValue(color), FXSYS_GetKValue(color),
+ bgra[2], bgra[1], bgra[0]);
+ bgra[3] = (alpha_flag >> 24) ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXGETFLAG_ALPHA_STROKE(alpha_flag);
+ argb = FXARGB_MAKE(bgra[3], bgra[2], bgra[1], bgra[0]);
+}
+FX_BOOL CFX_RenderDevice::DrawNormalText(int nChars, const FXTEXT_CHARPOS* pCharPos,
+ CFX_Font* pFont, CFX_FontCache* pCache,
+ FX_FLOAT font_size, const CFX_AffineMatrix* pText2Device,
+ FX_DWORD fill_color, FX_DWORD text_flags,
+ int alpha_flag, void* pIccTransform)
+{
+ int nativetext_flags = text_flags;
+ if (m_DeviceClass != FXDC_DISPLAY) {
+ if (!(text_flags & FXTEXT_PRINTGRAPHICTEXT)) {
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ if (!(text_flags & FXFONT_CIDFONT) && pFont->GetPsName().Find(CFX_WideString::FromLocal("+ZJHL")) == -1)
+#ifdef FOXIT_CHROME_BUILD
+ if (pFont->GetPsName() != CFX_WideString::FromLocal("CNAAJI+cmex10"))
+#endif
+#endif
+ if (m_pDeviceDriver->DrawDeviceText(nChars, pCharPos, pFont, pCache, pText2Device, font_size, fill_color, alpha_flag, pIccTransform)) {
+ return TRUE;
+ }
+ }
+ int alpha = FXGETFLAG_COLORTYPE(alpha_flag) ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXARGB_A(fill_color);
+ if (alpha < 255) {
+ return FALSE;
+ }
+ } else if (!(text_flags & FXTEXT_NO_NATIVETEXT)) {
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+ if (!(text_flags & FXFONT_CIDFONT))
+#ifdef FOXIT_CHROME_BUILD
+ if (pFont->GetPsName() != CFX_WideString::FromLocal("CNAAJI+cmex10"))
+#endif
+#endif
+ if (m_pDeviceDriver->DrawDeviceText(nChars, pCharPos, pFont, pCache, pText2Device, font_size, fill_color, alpha_flag, pIccTransform)) {
+ return TRUE;
+ }
+ }
+ CFX_AffineMatrix char2device, deviceCtm, text2Device;
+ if (pText2Device) {
+ char2device = *pText2Device;
+ text2Device = *pText2Device;
+ }
+ char2device.Scale(font_size, -font_size);
+ if (FXSYS_fabs(char2device.a) + FXSYS_fabs(char2device.b) > 50 * 1.0f ||
+ ((m_DeviceClass == FXDC_PRINTER && !m_pDeviceDriver->IsPSPrintDriver())
+ && !(text_flags & FXTEXT_PRINTIMAGETEXT))) {
+ if (pFont->GetFace() != NULL || (pFont->GetSubstFont()->m_SubstFlags & FXFONT_SUBST_GLYPHPATH)) {
+ int nPathFlags = (text_flags & FXTEXT_NOSMOOTH) == 0 ? 0 : FXFILL_NOPATHSMOOTH;
+ return DrawTextPath(nChars, pCharPos, pFont, pCache, font_size, pText2Device, NULL, NULL, fill_color, 0, NULL, nPathFlags, alpha_flag, pIccTransform);
+ }
+ }
+ int anti_alias = FXFT_RENDER_MODE_MONO;
+ FX_BOOL bNormal = FALSE;
+ if ((text_flags & FXTEXT_NOSMOOTH) == 0) {
+ if (m_DeviceClass == FXDC_DISPLAY && m_bpp > 1) {
+ FX_BOOL bClearType;
+ if (pFont->GetFace() == NULL && !(pFont->GetSubstFont()->m_SubstFlags & FXFONT_SUBST_CLEARTYPE)) {
+ bClearType = FALSE;
+ } else {
+ bClearType = text_flags & FXTEXT_CLEARTYPE;
+ }
+ if ((m_RenderCaps & (FXRC_ALPHA_OUTPUT | FXRC_CMYK_OUTPUT))) {
+ anti_alias = FXFT_RENDER_MODE_LCD;
+ bNormal = TRUE;
+ } else if (m_bpp < 16) {
+ anti_alias = FXFT_RENDER_MODE_NORMAL;
+ } else {
+ if (bClearType == FALSE) {
+ anti_alias = FXFT_RENDER_MODE_LCD;
+ bNormal = TRUE;
+ } else {
+ anti_alias = FXFT_RENDER_MODE_LCD;
+ }
+ }
+ }
+ }
+ if (pCache == NULL) {
+ pCache = CFX_GEModule::Get()->GetFontCache();
+ }
+ CFX_FaceCache* pFaceCache = pCache->GetCachedFace(pFont);
+ FX_FONTCACHE_DEFINE(pCache, pFont);
+ FXTEXT_GLYPHPOS* pGlyphAndPos = FX_Alloc(FXTEXT_GLYPHPOS, nChars);
+ if (!pGlyphAndPos) {
+ return FALSE;
+ }
+ int iChar;
+ deviceCtm = char2device;
+ CFX_AffineMatrix matrixCTM = GetCTM();
+ FX_FLOAT scale_x = FXSYS_fabs(matrixCTM.a);
+ FX_FLOAT scale_y = FXSYS_fabs(matrixCTM.d);
+ deviceCtm.Concat(scale_x, 0, 0, scale_y, 0, 0);
+ text2Device.Concat(scale_x, 0, 0, scale_y, 0, 0);
+ for (iChar = 0; iChar < nChars; iChar ++) {
+ FXTEXT_GLYPHPOS& glyph = pGlyphAndPos[iChar];
+ const FXTEXT_CHARPOS& charpos = pCharPos[iChar];
+ glyph.m_fOriginX = charpos.m_OriginX;
+ glyph.m_fOriginY = charpos.m_OriginY;
+ text2Device.Transform(glyph.m_fOriginX, glyph.m_fOriginY);
+ if (anti_alias < FXFT_RENDER_MODE_LCD) {
+ glyph.m_OriginX = FXSYS_round(glyph.m_fOriginX);
+ } else {
+ glyph.m_OriginX = (int)FXSYS_floor(glyph.m_fOriginX);
+ }
+ glyph.m_OriginY = FXSYS_round(glyph.m_fOriginY);
+ if (charpos.m_bGlyphAdjust) {
+ CFX_AffineMatrix new_matrix(charpos.m_AdjustMatrix[0], charpos.m_AdjustMatrix[1],
+ charpos.m_AdjustMatrix[2], charpos.m_AdjustMatrix[3], 0, 0);
+ new_matrix.Concat(deviceCtm);
+ glyph.m_pGlyph = pFaceCache->LoadGlyphBitmap(pFont, charpos.m_GlyphIndex, charpos.m_bFontStyle, &new_matrix,
+ charpos.m_FontCharWidth, anti_alias, nativetext_flags);
+ } else
+ glyph.m_pGlyph = pFaceCache->LoadGlyphBitmap(pFont, charpos.m_GlyphIndex, charpos.m_bFontStyle, &deviceCtm,
+ charpos.m_FontCharWidth, anti_alias, nativetext_flags);
+ }
+ if (anti_alias < FXFT_RENDER_MODE_LCD && nChars > 1) {
+ _AdjustGlyphSpace(pGlyphAndPos, nChars);
+ }
+ FX_RECT bmp_rect1 = FXGE_GetGlyphsBBox(pGlyphAndPos, nChars, anti_alias);
+ if (scale_x > 1 && scale_y > 1) {
+ bmp_rect1.left--;
+ bmp_rect1.top --;
+ bmp_rect1.right ++;
+ bmp_rect1.bottom ++;
+ }
+ FX_RECT bmp_rect(FXSYS_round((FX_FLOAT)(bmp_rect1.left) / scale_x), FXSYS_round((FX_FLOAT)(bmp_rect1.top) / scale_y),
+ FXSYS_round((FX_FLOAT)bmp_rect1.right / scale_x), FXSYS_round((FX_FLOAT)bmp_rect1.bottom / scale_y));
+ bmp_rect.Intersect(m_ClipBox);
+ if (bmp_rect.IsEmpty()) {
+ FX_Free(pGlyphAndPos);
+ return TRUE;
+ }
+ int pixel_width = FXSYS_round(bmp_rect.Width() * scale_x);
+ int pixel_height = FXSYS_round(bmp_rect.Height() * scale_y);
+ int pixel_left = FXSYS_round(bmp_rect.left * scale_x);
+ int pixel_top = FXSYS_round(bmp_rect.top * scale_y);
+ if (anti_alias == FXFT_RENDER_MODE_MONO) {
+ CFX_DIBitmap bitmap;
+ if (!bitmap.Create(pixel_width, pixel_height, FXDIB_1bppMask)) {
+ FX_Free(pGlyphAndPos);
+ return FALSE;
+ }
+ bitmap.Clear(0);
+ for (iChar = 0; iChar < nChars; iChar ++) {
+ FXTEXT_GLYPHPOS& glyph = pGlyphAndPos[iChar];
+ if (glyph.m_pGlyph == NULL) {
+ continue;
+ }
+ const CFX_DIBitmap* pGlyph = &glyph.m_pGlyph->m_Bitmap;
+ bitmap.TransferBitmap(glyph.m_OriginX + glyph.m_pGlyph->m_Left - pixel_left,
+ glyph.m_OriginY - glyph.m_pGlyph->m_Top - pixel_top,
+ pGlyph->GetWidth(), pGlyph->GetHeight(), pGlyph, 0, 0);
+ }
+ FX_Free(pGlyphAndPos);
+ return SetBitMask(&bitmap, bmp_rect.left, bmp_rect.top, fill_color);
+ }
+ CFX_DIBitmap bitmap;
+ if (m_bpp == 8) {
+ if (!bitmap.Create(pixel_width, pixel_height, FXDIB_8bppMask)) {
+ FX_Free(pGlyphAndPos);
+ return FALSE;
+ }
+ } else {
+ if (!CreateCompatibleBitmap(&bitmap, pixel_width, pixel_height)) {
+ FX_Free(pGlyphAndPos);
+ return FALSE;
+ }
+ }
+ if (!bitmap.HasAlpha() && !bitmap.IsAlphaMask()) {
+ bitmap.Clear(0xFFFFFFFF);
+ if (!GetDIBits(&bitmap, bmp_rect.left, bmp_rect.top)) {
+ FX_Free(pGlyphAndPos);
+ return FALSE;
+ }
+ } else {
+ bitmap.Clear(0);
+ if (bitmap.m_pAlphaMask) {
+ bitmap.m_pAlphaMask->Clear(0);
+ }
+ }
+ int dest_width = pixel_width;
+ FX_LPBYTE dest_buf = bitmap.GetBuffer();
+ int dest_pitch = bitmap.GetPitch();
+ int Bpp = bitmap.GetBPP() / 8;
+ int a, r, g, b;
+ if (anti_alias == FXFT_RENDER_MODE_LCD) {
+ _Color2Argb(fill_color, fill_color, alpha_flag | (1 << 24), pIccTransform);
+ ArgbDecode(fill_color, a, r, g, b);
+ r = FX_GAMMA(r);
+ g = FX_GAMMA(g);
+ b = FX_GAMMA(b);
+ }
+ for (iChar = 0; iChar < nChars; iChar ++) {
+ FXTEXT_GLYPHPOS& glyph = pGlyphAndPos[iChar];
+ if (glyph.m_pGlyph == NULL) {
+ continue;
+ }
+ const CFX_DIBitmap* pGlyph = &glyph.m_pGlyph->m_Bitmap;
+ int left = glyph.m_OriginX + glyph.m_pGlyph->m_Left - pixel_left;
+ int top = glyph.m_OriginY - glyph.m_pGlyph->m_Top - pixel_top;
+ int ncols = pGlyph->GetWidth();
+ int nrows = pGlyph->GetHeight();
+ if (anti_alias == FXFT_RENDER_MODE_NORMAL) {
+ if (!bitmap.CompositeMask(left, top, ncols, nrows, pGlyph, fill_color,
+ 0, 0, FXDIB_BLEND_NORMAL, NULL, FALSE, alpha_flag, pIccTransform)) {
+ FX_Free(pGlyphAndPos);
+ return FALSE;
+ }
+ continue;
+ }
+ FX_BOOL bBGRStripe = text_flags & FXTEXT_BGR_STRIPE;
+ ncols /= 3;
+ int x_subpixel = (int)(glyph.m_fOriginX * 3) % 3;
+ FX_LPBYTE src_buf = pGlyph->GetBuffer();
+ int src_pitch = pGlyph->GetPitch();
+ int start_col = left;
+ if (start_col < 0) {
+ start_col = 0;
+ }
+ int end_col = left + ncols;
+ if (end_col > dest_width) {
+ end_col = dest_width;
+ }
+ if (start_col >= end_col) {
+ continue;
+ }
+ if (bitmap.GetFormat() == FXDIB_Argb) {
+ for (int row = 0; row < nrows; row ++) {
+ int dest_row = row + top;
+ if (dest_row < 0 || dest_row >= bitmap.GetHeight()) {
+ continue;
+ }
+ FX_LPBYTE src_scan = src_buf + row * src_pitch + (start_col - left) * 3;
+ FX_LPBYTE dest_scan = dest_buf + dest_row * dest_pitch + (start_col << 2);
+ if (bBGRStripe) {
+ if (x_subpixel == 0) {
+ for (int col = start_col; col < end_col; col ++) {
+ int src_alpha = src_scan[2];
+ src_alpha = src_alpha * a / 255;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
+ src_alpha = src_scan[1];
+ src_alpha = src_alpha * a / 255;
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
+ src_alpha = src_scan[0];
+ src_alpha = src_alpha * a / 255;
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
+ dest_scan[3] = 255;
+ dest_scan += 4;
+ src_scan += 3;
+ }
+ } else if (x_subpixel == 1) {
+ int src_alpha = src_scan[1];
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
+ src_alpha = src_scan[0];
+ ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
+ if (start_col > left) {
+ src_alpha = src_scan[-1];
+ ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
+ }
+ dest_scan[3] = 255;
+ dest_scan += 4;
+ src_scan += 3;
+ for (int col = start_col + 1; col < end_col - 1; col ++) {
+ int src_alpha = src_scan[1];
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
+ src_alpha = src_scan[0];
+ ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
+ src_alpha = src_scan[-1];
+ ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
+ dest_scan[3] = 255;
+ dest_scan += 4;
+ src_scan += 3;
+ }
+ } else {
+ int src_alpha = src_scan[0];
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
+ if (start_col > left) {
+ src_alpha = src_scan[-1];
+ ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
+ src_alpha = src_scan[-2];
+ ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
+ }
+ dest_scan[3] = 255;
+ dest_scan += 4;
+ src_scan += 3;
+ for (int col = start_col + 1; col < end_col - 1; col ++) {
+ int src_alpha = src_scan[0];
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
+ src_alpha = src_scan[-1];
+ ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
+ src_alpha = src_scan[-2];
+ ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
+ dest_scan[3] = 255;
+ dest_scan += 4;
+ src_scan += 3;
+ }
+ }
+ } else {
+ if (x_subpixel == 0) {
+ for (int col = start_col; col < end_col; col ++) {
+ if (bNormal) {
+ int src_alpha1 = (src_scan[0] + src_scan[1] + src_scan[2]) / 3;
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);
+ src_alpha1 = src_alpha1 * a / 255;
+ FX_BYTE back_alpha = dest_scan[3];
+ if (back_alpha == 0) {
+ FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha1, r, g, b));
+ dest_scan += 4;
+ src_scan += 3;
+ continue;
+ }
+ if (src_alpha1 == 0) {
+ dest_scan += 4;
+ src_scan += 3;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha1 - back_alpha * src_alpha1 / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha1 * 255 / dest_alpha;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, alpha_ratio));
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, alpha_ratio));
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, alpha_ratio));
+ dest_scan += 4;
+ src_scan += 3;
+ continue;
+ }
+ int src_alpha = src_scan[0];
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
+ src_alpha = src_scan[1];
+ ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
+ src_alpha = src_scan[2];
+ ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
+ dest_scan[3] = 255;
+ dest_scan += 4;
+ src_scan += 3;
+ }
+ } else if (x_subpixel == 1) {
+ if (bNormal) {
+ int src_alpha1 = start_col > left ? ((src_scan[-1] + src_scan[0] + src_scan[1]) / 3) : ((src_scan[0] + src_scan[1]) / 3);
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);
+ src_alpha1 = src_alpha1 * a / 255;
+ if (src_alpha1 == 0) {
+ dest_scan += 4;
+ src_scan += 3;
+ } else {
+ FX_BYTE back_alpha = dest_scan[3];
+ if (back_alpha == 0) {
+ FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha1, r, g, b));
+ } else {
+ FX_BYTE dest_alpha = back_alpha + src_alpha1 - back_alpha * src_alpha1 / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha1 * 255 / dest_alpha;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, alpha_ratio));
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, alpha_ratio));
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, alpha_ratio));
+ }
+ dest_scan += 4;
+ src_scan += 3;
+ }
+ } else {
+ if (start_col > left) {
+ int src_alpha = src_scan[-1];
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
+ }
+ int src_alpha = src_scan[0];
+ ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
+ src_alpha = src_scan[1];
+ ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
+ dest_scan[3] = 255;
+ dest_scan += 4;
+ src_scan += 3;
+ }
+ for (int col = start_col + 1; col < end_col; col ++) {
+ if (bNormal) {
+ int src_alpha1 = (src_scan[-1] + src_scan[0] + src_scan[1]) / 3;
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);
+ src_alpha1 = src_alpha1 * a / 255;
+ FX_BYTE back_alpha = dest_scan[3];
+ if (back_alpha == 0) {
+ FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha1, r, g, b));
+ dest_scan += 4;
+ src_scan += 3;
+ continue;
+ }
+ if (src_alpha1 == 0) {
+ dest_scan += 4;
+ src_scan += 3;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha1 - back_alpha * src_alpha1 / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha1 * 255 / dest_alpha;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, alpha_ratio));
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, alpha_ratio));
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, alpha_ratio));
+ dest_scan += 4;
+ src_scan += 3;
+ continue;
+ }
+ int src_alpha = src_scan[-1];
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
+ src_alpha = src_scan[0];
+ ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
+ src_alpha = src_scan[1];
+ ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
+ dest_scan[3] = 255;
+ dest_scan += 4;
+ src_scan += 3;
+ }
+ } else {
+ if (bNormal) {
+ int src_alpha1 = start_col > left ? ((src_scan[-2] + src_scan[-1] + src_scan[0]) / 3) : ((src_scan[0]) / 3);
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);
+ src_alpha1 = src_alpha1 * a / 255;
+ if (src_alpha1 == 0) {
+ dest_scan += 4;
+ src_scan += 3;
+ } else {
+ FX_BYTE back_alpha = dest_scan[3];
+ if (back_alpha == 0) {
+ FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha1, r, g, b));
+ } else {
+ FX_BYTE dest_alpha = back_alpha + src_alpha1 - back_alpha * src_alpha1 / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha1 * 255 / dest_alpha;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, alpha_ratio));
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, alpha_ratio));
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, alpha_ratio));
+ }
+ dest_scan += 4;
+ src_scan += 3;
+ }
+ } else {
+ if (start_col > left) {
+ int src_alpha = src_scan[-2];
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
+ src_alpha = src_scan[-1];
+ ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
+ }
+ int src_alpha = src_scan[0];
+ ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
+ dest_scan[3] = 255;
+ dest_scan += 4;
+ src_scan += 3;
+ }
+ for (int col = start_col + 1; col < end_col; col ++) {
+ if (bNormal) {
+ int src_alpha1 = (src_scan[-2] + src_scan[-1] + src_scan[0]) / 3;
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);
+ src_alpha1 = src_alpha1 * a / 255;
+ FX_BYTE back_alpha = dest_scan[3];
+ if (back_alpha == 0) {
+ FXARGB_SETDIB(dest_scan, FXARGB_MAKE(src_alpha1, r, g, b));
+ dest_scan += 4;
+ src_scan += 3;
+ continue;
+ }
+ if (src_alpha1 == 0) {
+ dest_scan += 4;
+ src_scan += 3;
+ continue;
+ }
+ FX_BYTE dest_alpha = back_alpha + src_alpha1 - back_alpha * src_alpha1 / 255;
+ dest_scan[3] = dest_alpha;
+ int alpha_ratio = src_alpha1 * 255 / dest_alpha;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, alpha_ratio));
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, alpha_ratio));
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, alpha_ratio));
+ dest_scan += 4;
+ src_scan += 3;
+ continue;
+ }
+ int src_alpha = src_scan[-2];
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
+ src_alpha = src_scan[-1];
+ ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
+ src_alpha = src_scan[0];
+ ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
+ dest_scan[3] = 255;
+ dest_scan += 4;
+ src_scan += 3;
+ }
+ }
+ }
+ }
+ } else {
+ for (int row = 0; row < nrows; row ++) {
+ int dest_row = row + top;
+ if (dest_row < 0 || dest_row >= bitmap.GetHeight()) {
+ continue;
+ }
+ FX_LPBYTE src_scan = src_buf + row * src_pitch + (start_col - left) * 3;
+ FX_LPBYTE dest_scan = dest_buf + dest_row * dest_pitch + start_col * Bpp;
+ if (bBGRStripe) {
+ if (x_subpixel == 0) {
+ for (int col = start_col; col < end_col; col ++) {
+ int src_alpha = src_scan[2];
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
+ src_alpha = src_scan[1];
+ ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
+ src_alpha = src_scan[0];
+ ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
+ dest_scan += Bpp;
+ src_scan += 3;
+ }
+ } else if (x_subpixel == 1) {
+ int src_alpha = src_scan[1];
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
+ src_alpha = src_scan[0];
+ ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
+ if (start_col > left) {
+ src_alpha = src_scan[-1];
+ ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
+ }
+ dest_scan += Bpp;
+ src_scan += 3;
+ for (int col = start_col + 1; col < end_col - 1; col ++) {
+ int src_alpha = src_scan[1];
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
+ src_alpha = src_scan[0];
+ ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
+ src_alpha = src_scan[-1];
+ ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
+ dest_scan += Bpp;
+ src_scan += 3;
+ }
+ } else {
+ int src_alpha = src_scan[0];
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
+ if (start_col > left) {
+ src_alpha = src_scan[-1];
+ ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
+ src_alpha = src_scan[-2];
+ ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
+ }
+ dest_scan += Bpp;
+ src_scan += 3;
+ for (int col = start_col + 1; col < end_col - 1; col ++) {
+ int src_alpha = src_scan[0];
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
+ src_alpha = src_scan[-1];
+ ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
+ src_alpha = src_scan[-2];
+ ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
+ dest_scan += Bpp;
+ src_scan += 3;
+ }
+ }
+ } else {
+ if (x_subpixel == 0) {
+ for (int col = start_col; col < end_col; col ++) {
+ if (bNormal) {
+ int src_alpha1 = (src_scan[0] + src_scan[1] + src_scan[2]) / 3;
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);
+ src_alpha1 = src_alpha1 * a / 255;
+ if (src_alpha1 == 0) {
+ dest_scan += Bpp;
+ src_scan += 3;
+ continue;
+ }
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha1));
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha1));
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha1));
+ dest_scan += Bpp;
+ src_scan += 3;
+ continue;
+ }
+ int src_alpha = src_scan[0];
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
+ src_alpha = src_scan[1];
+ ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
+ src_alpha = src_scan[2];
+ ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
+ dest_scan += Bpp;
+ src_scan += 3;
+ }
+ } else if (x_subpixel == 1) {
+ if (bNormal) {
+ int src_alpha1 = start_col > left ? (src_scan[0] + src_scan[1] + src_scan[-1]) / 3 : (src_scan[0] + src_scan[1]) / 3;
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);
+ src_alpha1 = src_alpha1 * a / 255;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha1));
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha1));
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha1));
+ dest_scan += Bpp;
+ src_scan += 3;
+ } else {
+ if (start_col > left) {
+ int src_alpha = src_scan[-1];
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
+ }
+ int src_alpha = src_scan[0];
+ ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
+ src_alpha = src_scan[1];
+ ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
+ dest_scan += Bpp;
+ src_scan += 3;
+ }
+ for (int col = start_col + 1; col < end_col; col ++) {
+ if (bNormal) {
+ int src_alpha1 = (src_scan[0] + src_scan[1] + src_scan[-1]) / 3;
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);
+ src_alpha1 = src_alpha1 * a / 255;
+ if (src_alpha1 == 0) {
+ dest_scan += Bpp;
+ src_scan += 3;
+ continue;
+ }
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha1));
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha1));
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha1));
+ dest_scan += Bpp;
+ src_scan += 3;
+ continue;
+ }
+ int src_alpha = src_scan[-1];
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
+ src_alpha = src_scan[0];
+ ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
+ src_alpha = src_scan[1];
+ ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
+ dest_scan += Bpp;
+ src_scan += 3;
+ }
+ } else {
+ if (bNormal) {
+ int src_alpha1 = start_col > left ? (src_scan[0] + src_scan[-2] + src_scan[-1]) / 3 : src_scan[0] / 3;
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);
+ src_alpha1 = src_alpha1 * a / 255;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha1));
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha1));
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha1));
+ dest_scan += Bpp;
+ src_scan += 3;
+ } else {
+ if (start_col > left) {
+ int src_alpha = src_scan[-2];
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
+ src_alpha = src_scan[-1];
+ ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
+ }
+ int src_alpha = src_scan[0];
+ ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
+ dest_scan += Bpp;
+ src_scan += 3;
+ }
+ for (int col = start_col + 1; col < end_col; col ++) {
+ if (bNormal) {
+ int src_alpha1 = ((int)(src_scan[0]) + (int)(src_scan[-2]) + (int)(src_scan[-1])) / 3;
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha1, nativetext_flags, a);
+ src_alpha1 = src_alpha1 * a / 255;
+ if (src_alpha1 == 0) {
+ dest_scan += Bpp;
+ src_scan += 3;
+ continue;
+ }
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha1));
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha1));
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha1));
+ dest_scan += Bpp;
+ src_scan += 3;
+ continue;
+ }
+ int src_alpha = src_scan[-2];
+ ADJUST_ALPHA(dest_scan[2], r, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[2] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[2]), r, src_alpha));
+ src_alpha = src_scan[-1];
+ ADJUST_ALPHA(dest_scan[1], g, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[1] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[1]), g, src_alpha));
+ src_alpha = src_scan[0];
+ ADJUST_ALPHA(dest_scan[0], b, src_alpha, nativetext_flags, a);
+ src_alpha = src_alpha * a / 255;
+ dest_scan[0] = FX_GAMMA_INVERSE(FXDIB_ALPHA_MERGE(FX_GAMMA(dest_scan[0]), b, src_alpha));
+ dest_scan += Bpp;
+ src_scan += 3;
+ }
+ }
+ }
+ }
+ }
+ }
+ if (bitmap.IsAlphaMask()) {
+ SetBitMask(&bitmap, bmp_rect.left, bmp_rect.top, fill_color, alpha_flag, pIccTransform);
+ } else {
+ SetDIBits(&bitmap, bmp_rect.left, bmp_rect.top);
+ }
+ FX_Free(pGlyphAndPos);
+ return TRUE;
+}
+FX_BOOL CFX_RenderDevice::DrawTextPath(int nChars, const FXTEXT_CHARPOS* pCharPos,
+ CFX_Font* pFont, CFX_FontCache* pCache,
+ FX_FLOAT font_size, const CFX_AffineMatrix* pText2User,
+ const CFX_AffineMatrix* pUser2Device, const CFX_GraphStateData* pGraphState,
+ FX_DWORD fill_color, FX_ARGB stroke_color, CFX_PathData* pClippingPath, int nFlag,
+ int alpha_flag, void* pIccTransform, int blend_type)
+{
+ if (pCache == NULL) {
+ pCache = CFX_GEModule::Get()->GetFontCache();
+ }
+ CFX_FaceCache* pFaceCache = pCache->GetCachedFace(pFont);
+ FX_FONTCACHE_DEFINE(pCache, pFont);
+ for (int iChar = 0; iChar < nChars; iChar ++) {
+ const FXTEXT_CHARPOS& charpos = pCharPos[iChar];
+ CFX_AffineMatrix matrix;
+ if (charpos.m_bGlyphAdjust)
+ matrix.Set(charpos.m_AdjustMatrix[0], charpos.m_AdjustMatrix[1],
+ charpos.m_AdjustMatrix[2], charpos.m_AdjustMatrix[3], 0, 0);
+ matrix.Concat(font_size, 0, 0, font_size, charpos.m_OriginX, charpos.m_OriginY);
+ const CFX_PathData* pPath = pFaceCache->LoadGlyphPath(pFont, charpos.m_GlyphIndex, charpos.m_FontCharWidth);
+ if (pPath == NULL) {
+ continue;
+ }
+ matrix.Concat(*pText2User);
+ CFX_PathData TransformedPath(*pPath);
+ TransformedPath.Transform(&matrix);
+ FX_BOOL bHasAlpha = FXGETFLAG_COLORTYPE(alpha_flag) ?
+ (FXGETFLAG_ALPHA_FILL(alpha_flag) || FXGETFLAG_ALPHA_STROKE(alpha_flag)) :
+ (fill_color || stroke_color);
+ if (bHasAlpha) {
+ int fill_mode = nFlag;
+ if (FXGETFLAG_COLORTYPE(alpha_flag)) {
+ if (FXGETFLAG_ALPHA_FILL(alpha_flag)) {
+ fill_mode |= FXFILL_WINDING;
+ }
+ } else {
+ if (fill_color) {
+ fill_mode |= FXFILL_WINDING;
+ }
+ }
+ fill_mode |= FX_FILL_TEXT_MODE;
+ if (!DrawPath(&TransformedPath, pUser2Device, pGraphState, fill_color, stroke_color, fill_mode, alpha_flag, pIccTransform, blend_type)) {
+ return FALSE;
+ }
+ }
+ if (pClippingPath) {
+ pClippingPath->Append(&TransformedPath, pUser2Device);
+ }
+ }
+ return TRUE;
+}
+CFX_FontCache::~CFX_FontCache()
+{
+ FreeCache(TRUE);
+}
+CFX_FaceCache* CFX_FontCache::GetCachedFace(CFX_Font* pFont)
+{
+ FX_BOOL bExternal = pFont->GetFace() == NULL;
+ void* face = bExternal ? pFont->GetSubstFont()->m_ExtHandle : pFont->GetFace();
+ CFX_FTCacheMap& map = bExternal ? m_ExtFaceMap : m_FTFaceMap;
+ CFX_CountedFaceCache* counted_face_cache = NULL;
+ if (map.Lookup((FXFT_Face)face, counted_face_cache)) {
+ counted_face_cache->m_nCount++;
+ return counted_face_cache->m_Obj;
+ }
+ CFX_FaceCache* face_cache = NULL;
+ face_cache = FX_NEW CFX_FaceCache(bExternal ? NULL : (FXFT_Face)face);
+ if (face_cache == NULL) {
+ return NULL;
+ }
+ counted_face_cache = FX_NEW CFX_CountedFaceCache;
+ if (!counted_face_cache) {
+ if (face_cache) {
+ delete face_cache;
+ face_cache = NULL;
+ }
+ return NULL;
+ }
+ counted_face_cache->m_nCount = 2;
+ counted_face_cache->m_Obj = face_cache;
+ map.SetAt((FXFT_Face)face, counted_face_cache);
+ return face_cache;
+}
+void CFX_FontCache::ReleaseCachedFace(CFX_Font* pFont)
+{
+ FX_BOOL bExternal = pFont->GetFace() == NULL;
+ void* face = bExternal ? pFont->GetSubstFont()->m_ExtHandle : pFont->GetFace();
+ CFX_FTCacheMap& map = bExternal ? m_ExtFaceMap : m_FTFaceMap;
+ CFX_CountedFaceCache* counted_face_cache = NULL;
+ if (!map.Lookup((FXFT_Face)face, counted_face_cache)) {
+ return;
+ }
+ if (counted_face_cache->m_nCount > 1) {
+ counted_face_cache->m_nCount--;
+ }
+}
+void CFX_FontCache::FreeCache(FX_BOOL bRelease)
+{
+ {
+ FX_POSITION pos;
+ pos = m_FTFaceMap.GetStartPosition();
+ while (pos) {
+ FXFT_Face face;
+ CFX_CountedFaceCache* cache;
+ m_FTFaceMap.GetNextAssoc(pos, face, cache);
+ if (bRelease || cache->m_nCount < 2) {
+ delete cache->m_Obj;
+ delete cache;
+ m_FTFaceMap.RemoveKey(face);
+ }
+ }
+ pos = m_ExtFaceMap.GetStartPosition();
+ while (pos) {
+ FXFT_Face face;
+ CFX_CountedFaceCache* cache;
+ m_ExtFaceMap.GetNextAssoc(pos, face, cache);
+ if (bRelease || cache->m_nCount < 2) {
+ delete cache->m_Obj;
+ delete cache;
+ m_ExtFaceMap.RemoveKey(face);
+ }
+ }
+ }
+}
+CFX_FaceCache::CFX_FaceCache(FXFT_Face face)
+{
+ m_Face = face;
+ m_pBitmap = NULL;
+}
+CFX_FaceCache::~CFX_FaceCache()
+{
+ FX_POSITION pos = m_SizeMap.GetStartPosition();
+ CFX_ByteString Key;
+ CFX_SizeGlyphCache* pSizeCache = NULL;
+ while(pos) {
+ m_SizeMap.GetNextAssoc( pos, Key, (void*&)pSizeCache);
+ delete pSizeCache;
+ }
+ m_SizeMap.RemoveAll();
+ pos = m_PathMap.GetStartPosition();
+ FX_LPVOID key1;
+ CFX_PathData* pPath;
+ while (pos) {
+ m_PathMap.GetNextAssoc(pos, key1, (FX_LPVOID&)pPath);
+ delete pPath;
+ }
+ if (m_pBitmap) {
+ delete m_pBitmap;
+ }
+ m_PathMap.RemoveAll();
+}
+#if ((_FXM_PLATFORM_ != _FXM_PLATFORM_APPLE_)|| defined(_FPDFAPI_MINI_))
+void CFX_FaceCache::InitPlatform()
+{
+}
+#endif
+CFX_GlyphBitmap* CFX_FaceCache::LookUpGlyphBitmap(CFX_Font* pFont, const CFX_AffineMatrix* pMatrix,
+ CFX_ByteStringC& FaceGlyphsKey, FX_DWORD glyph_index, FX_BOOL bFontStyle,
+ int dest_width, int anti_alias)
+{
+ CFX_SizeGlyphCache* pSizeCache = NULL;
+ if (!m_SizeMap.Lookup(FaceGlyphsKey, (void*&)pSizeCache)) {
+ pSizeCache = FX_NEW CFX_SizeGlyphCache;
+ if (pSizeCache == NULL) {
+ return NULL;
+ }
+ m_SizeMap.SetAt(FaceGlyphsKey, pSizeCache);
+ }
+ CFX_GlyphBitmap* pGlyphBitmap = NULL;
+ if (pSizeCache->m_GlyphMap.Lookup((FX_LPVOID)(FX_UINTPTR)glyph_index, (void*&)pGlyphBitmap)) {
+ return pGlyphBitmap;
+ }
+ pGlyphBitmap = RenderGlyph(pFont, glyph_index, bFontStyle, pMatrix, dest_width, anti_alias);
+ if (pGlyphBitmap == NULL) {
+ return NULL;
+ }
+ pSizeCache->m_GlyphMap.SetAt((FX_LPVOID)(FX_UINTPTR)glyph_index, pGlyphBitmap);
+ return pGlyphBitmap;
+}
+const CFX_GlyphBitmap* CFX_FaceCache::LoadGlyphBitmap(CFX_Font* pFont, FX_DWORD glyph_index, FX_BOOL bFontStyle, const CFX_AffineMatrix* pMatrix,
+ int dest_width, int anti_alias, int& text_flags)
+{
+ if (glyph_index == (FX_DWORD) - 1) {
+ return NULL;
+ }
+ _CFX_UniqueKeyGen keygen;
+#if ((_FXM_PLATFORM_ != _FXM_PLATFORM_APPLE_)|| defined(_FPDFAPI_MINI_))
+ if (pFont->GetSubstFont())
+ keygen.Generate(9, (int)(pMatrix->a * 10000), (int)(pMatrix->b * 10000),
+ (int)(pMatrix->c * 10000), (int)(pMatrix->d * 10000), dest_width, anti_alias,
+ pFont->GetSubstFont()->m_Weight, pFont->GetSubstFont()->m_ItalicAngle, pFont->IsVertical());
+ else
+ keygen.Generate(6, (int)(pMatrix->a * 10000), (int)(pMatrix->b * 10000),
+ (int)(pMatrix->c * 10000), (int)(pMatrix->d * 10000), dest_width, anti_alias);
+#else
+ if (text_flags & FXTEXT_NO_NATIVETEXT) {
+ if (pFont->GetSubstFont())
+ keygen.Generate(9, (int)(pMatrix->a * 10000), (int)(pMatrix->b * 10000),
+ (int)(pMatrix->c * 10000), (int)(pMatrix->d * 10000), dest_width, anti_alias,
+ pFont->GetSubstFont()->m_Weight, pFont->GetSubstFont()->m_ItalicAngle, pFont->IsVertical());
+ else
+ keygen.Generate(6, (int)(pMatrix->a * 10000), (int)(pMatrix->b * 10000),
+ (int)(pMatrix->c * 10000), (int)(pMatrix->d * 10000), dest_width, anti_alias);
+ } else {
+ if (pFont->GetSubstFont())
+ keygen.Generate(10, (int)(pMatrix->a * 10000), (int)(pMatrix->b * 10000),
+ (int)(pMatrix->c * 10000), (int)(pMatrix->d * 10000), dest_width, anti_alias,
+ pFont->GetSubstFont()->m_Weight, pFont->GetSubstFont()->m_ItalicAngle, pFont->IsVertical(), 3);
+ else
+ keygen.Generate(7, (int)(pMatrix->a * 10000), (int)(pMatrix->b * 10000),
+ (int)(pMatrix->c * 10000), (int)(pMatrix->d * 10000), dest_width, anti_alias, 3);
+ }
+#endif
+ CFX_ByteStringC FaceGlyphsKey(keygen.m_Key, keygen.m_KeyLen);
+#if ((_FXM_PLATFORM_ != _FXM_PLATFORM_APPLE_)|| defined(_FPDFAPI_MINI_))
+ return LookUpGlyphBitmap(pFont, pMatrix, FaceGlyphsKey, glyph_index, bFontStyle, dest_width, anti_alias);
+#else
+ if (text_flags & FXTEXT_NO_NATIVETEXT) {
+ return LookUpGlyphBitmap(pFont, pMatrix, FaceGlyphsKey, glyph_index, bFontStyle, dest_width, anti_alias);
+ } else {
+ CFX_GlyphBitmap* pGlyphBitmap;
+ CFX_SizeGlyphCache* pSizeCache = NULL;
+ if (m_SizeMap.Lookup(FaceGlyphsKey, (void*&)pSizeCache)) {
+ if (pSizeCache->m_GlyphMap.Lookup((FX_LPVOID)(FX_UINTPTR)glyph_index, (void*&)pGlyphBitmap)) {
+ return pGlyphBitmap;
+ }
+ pGlyphBitmap = RenderGlyph_Nativetext(pFont, glyph_index, pMatrix, dest_width, anti_alias);
+ if (pGlyphBitmap) {
+ pSizeCache->m_GlyphMap.SetAt((FX_LPVOID)(FX_UINTPTR)glyph_index, pGlyphBitmap);
+ return pGlyphBitmap;
+ }
+ } else {
+ pGlyphBitmap = RenderGlyph_Nativetext(pFont, glyph_index, pMatrix, dest_width, anti_alias);
+ if (pGlyphBitmap) {
+ pSizeCache = FX_NEW CFX_SizeGlyphCache;
+ if (pSizeCache == NULL) {
+ return NULL;
+ }
+ m_SizeMap.SetAt(FaceGlyphsKey, pSizeCache);
+ pSizeCache->m_GlyphMap.SetAt((FX_LPVOID)(FX_UINTPTR)glyph_index, pGlyphBitmap);
+ return pGlyphBitmap;
+ }
+ }
+ if (pFont->GetSubstFont())
+ keygen.Generate(9, (int)(pMatrix->a * 10000), (int)(pMatrix->b * 10000),
+ (int)(pMatrix->c * 10000), (int)(pMatrix->d * 10000), dest_width, anti_alias,
+ pFont->GetSubstFont()->m_Weight, pFont->GetSubstFont()->m_ItalicAngle, pFont->IsVertical());
+ else
+ keygen.Generate(6, (int)(pMatrix->a * 10000), (int)(pMatrix->b * 10000),
+ (int)(pMatrix->c * 10000), (int)(pMatrix->d * 10000), dest_width, anti_alias);
+ CFX_ByteStringC FaceGlyphsKey(keygen.m_Key, keygen.m_KeyLen);
+ text_flags |= FXTEXT_NO_NATIVETEXT;
+ return LookUpGlyphBitmap(pFont, pMatrix, FaceGlyphsKey, glyph_index, bFontStyle, dest_width, anti_alias);
+ }
+#endif
+}
+CFX_SizeGlyphCache::~CFX_SizeGlyphCache()
+{
+ FX_POSITION pos = m_GlyphMap.GetStartPosition();
+ FX_LPVOID Key;
+ CFX_GlyphBitmap* pGlyphBitmap = NULL;
+ while(pos) {
+ m_GlyphMap.GetNextAssoc(pos, Key, (void*&)pGlyphBitmap);
+ delete pGlyphBitmap;
+ }
+ m_GlyphMap.RemoveAll();
+}
+#if defined(_FPDFAPI_MINI_)
+#define CONTRAST_RAMP_STEP 16
+#else
+#define CONTRAST_RAMP_STEP 1
+#endif
+static const FX_BYTE g_adjust_contrast11[256] = {
+ 0, 0, 2, 3, 4, 5, 6, 8, 9, 10, 11, 13, 14, 15, 17, 18, 19, 21, 22, 24, 25, 26, 28, 29, 31,
+ 32, 33, 35, 36, 38, 39, 40, 42, 43, 45, 46, 48, 49, 51, 52, 54, 55, 56, 58, 59, 61, 62, 64, 65,
+ 67, 68, 70, 71, 72, 74, 75, 77, 78, 80, 81, 83, 84, 86, 87, 89, 90, 91, 93, 94, 96, 97, 99, 100,
+ 101, 103, 104, 106, 107, 109, 110, 111, 113, 114, 116, 117, 118, 120, 121, 123, 124, 125, 127,
+ 128, 130, 131, 132, 134, 135, 136, 138, 139, 140, 142, 143, 144, 146, 147, 148, 149, 151, 152,
+ 153, 155, 156, 157, 158, 160, 161, 162, 163, 165, 166, 167, 168, 169, 171, 172, 173, 174, 175,
+ 177, 178, 179, 180, 181, 182, 183, 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,
+ 215, 216, 217, 218, 219, 220, 221, 221, 222, 223, 224, 224, 225, 226, 227, 227, 228, 229, 230,
+ 230, 231, 232, 232, 233, 234, 234, 235, 236, 236, 237, 237, 238, 239, 239, 240, 240, 241, 241,
+ 242, 242, 243, 243, 244, 244, 245, 245, 246, 246, 246, 247, 247, 248, 248, 248, 249, 249, 249,
+ 250, 250, 250, 251, 251, 251, 251, 252, 252, 252, 252, 253, 253, 253, 253, 253, 253, 254, 254,
+ 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 255,
+};
+static const FX_BYTE g_adjust_contrast15[256] = {
+ 0, 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 5, 5, 6, 7, 7, 8, 9, 10, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
+ 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 34, 35, 36, 37, 38, 40, 41, 42, 43, 45, 46, 47, 48, 50, 51,
+ 52, 54, 55, 56, 58, 59, 60, 62, 63, 64, 66, 67, 68, 70, 71, 73, 74, 75, 77, 78, 80, 81, 82, 84, 85, 87,
+ 88, 90, 91, 93, 94, 95, 97, 98, 100, 101, 103, 104, 106, 107, 109, 110, 111, 113, 114, 116, 117, 119,
+ 120, 122, 123, 125, 126, 128, 129, 130, 132, 133, 135, 136, 138, 139, 141, 142, 143, 145, 146, 148,
+ 149, 150, 152, 153, 155, 156, 157, 159, 160, 161, 163, 164, 166, 167, 168, 170, 171, 172, 174, 175,
+ 176, 177, 179, 180, 181, 183, 184, 185, 186, 188, 189, 190, 191, 192, 194, 195, 196, 197, 198, 199,
+ 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, 227, 228, 229, 230, 231, 232, 232, 233, 234, 235, 235, 236, 237,
+ 237, 238, 239, 239, 240, 241, 241, 242, 242, 243, 244, 244, 245, 245, 246, 246, 247, 247, 248, 248,
+ 248, 249, 249, 250, 250, 250, 251, 251, 251, 252, 252, 252, 252, 253, 253, 253, 253, 253, 254, 254,
+ 254, 254, 254, 254, 254, 254, 254, 254, 254, 255,
+};
+static void _CalcContrastRamp(FX_LPBYTE ramp, int level)
+{
+ int contrast_min = 0, contrast_max = 255 - level, i;
+ for (i = 0; i < contrast_min; i ++) {
+ ramp[i] = 0;
+ }
+ for (i = contrast_min; i < contrast_max; i ++) {
+ ramp[i] = 255 * (i - contrast_min) / (contrast_max - contrast_min);
+ }
+ for (i = contrast_max; i < 256; i ++) {
+ ramp[i] = 255;
+ }
+}
+void CFX_Font::AdjustMMParams(int glyph_index, int dest_width, int weight)
+{
+ FXFT_MM_Var pMasters = NULL;
+ FXFT_Get_MM_Var(m_Face, &pMasters);
+ if (pMasters == NULL) {
+ return;
+ }
+ long coords[2];
+ if (weight == 0) {
+ coords[0] = FXFT_Get_MM_Axis_Def(FXFT_Get_MM_Axis(pMasters, 0)) / 65536;
+ } else {
+ coords[0] = weight;
+ }
+ if (dest_width == 0) {
+ coords[1] = FXFT_Get_MM_Axis_Def(FXFT_Get_MM_Axis(pMasters, 1)) / 65536;
+ } else {
+ int min_param = FXFT_Get_MM_Axis_Min(FXFT_Get_MM_Axis(pMasters, 1)) / 65536;
+ int max_param = FXFT_Get_MM_Axis_Max(FXFT_Get_MM_Axis(pMasters, 1)) / 65536;
+ coords[1] = min_param;
+ int error = FXFT_Set_MM_Design_Coordinates(m_Face, 2, coords);
+ error = FXFT_Load_Glyph(m_Face, glyph_index, FXFT_LOAD_NO_SCALE | FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH);
+ int min_width = FXFT_Get_Glyph_HoriAdvance(m_Face) * 1000 / FXFT_Get_Face_UnitsPerEM(m_Face);
+ coords[1] = max_param;
+ error = FXFT_Set_MM_Design_Coordinates(m_Face, 2, coords);
+ error = FXFT_Load_Glyph(m_Face, glyph_index, FXFT_LOAD_NO_SCALE | FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH);
+ int max_width = FXFT_Get_Glyph_HoriAdvance(m_Face) * 1000 / FXFT_Get_Face_UnitsPerEM(m_Face);
+ if (max_width == min_width) {
+ return;
+ }
+ int param = min_param + (max_param - min_param) * (dest_width - min_width) / (max_width - min_width);
+ coords[1] = param;
+ }
+ FXFT_Free(m_Face, pMasters);
+ FXFT_Set_MM_Design_Coordinates(m_Face, 2, coords);
+}
+extern const char g_AngleSkew[30] = {
+ 0, 2, 3, 5, 7, 9, 11, 12, 14, 16,
+ 18, 19, 21, 23, 25, 27, 29, 31, 32, 34,
+ 36, 38, 40, 42, 45, 47, 49, 51, 53, 55,
+};
+static const FX_BYTE g_WeightPow[100] = {
+ 0, 3, 6, 7, 8, 9, 11, 12, 14, 15, 16, 17, 18, 19, 20,
+ 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 35, 36, 36,
+ 37, 37, 37, 38, 38, 38, 39, 39, 39, 40, 40, 40, 41, 41, 41, 42, 42, 42,
+ 42, 43, 43, 43, 44, 44, 44, 44, 45, 45, 45, 45, 46, 46, 46, 46, 47, 47,
+ 47, 47, 48, 48, 48, 48, 48, 49, 49, 49, 49, 50, 50, 50, 50, 50, 51, 51,
+ 51, 51, 51, 52, 52, 52, 52, 52, 53, 53, 53, 53, 53,
+};
+extern const FX_BYTE g_WeightPow_11[100] = {
+ 0, 4, 7, 8, 9, 10, 12, 13, 15, 17, 18, 19, 20, 21, 22,
+ 23, 24, 25, 26, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 39, 39, 40, 40,
+ 41, 41, 41, 42, 42, 42, 43, 43, 43, 44, 44, 44, 45, 45, 45, 46, 46, 46,
+ 46, 43, 47, 47, 48, 48, 48, 48, 45, 50, 50, 50, 46, 51, 51, 51, 52, 52,
+ 52, 52, 53, 53, 53, 53, 53, 54, 54, 54, 54, 55, 55, 55, 55, 55, 56, 56,
+ 56, 56, 56, 57, 57, 57, 57, 57, 58, 58, 58, 58, 58,
+};
+extern const FX_BYTE g_WeightPow_SHIFTJIS[100] = {
+ 0, 0, 1, 2, 3, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 21, 22, 24, 26, 28,
+ 30, 32, 33, 35, 37, 39, 41, 43, 45, 48, 48, 48, 48, 49, 49, 49, 50, 50, 50, 50,
+ 51, 51, 51, 51, 52, 52, 52, 52, 52, 53, 53, 53, 53, 53, 54, 54, 54, 54, 54, 55, 55,
+ 55, 55, 55, 56, 56, 56, 56, 56 , 56, 57, 57, 57 , 57 , 57, 57, 57, 58, 58, 58, 58, 58,
+ 58, 58, 59, 59, 59, 59, 59, 59, 59, 60, 60, 60, 60, 60, 60, 60, 60,
+};
+static void _GammaAdjust(FX_LPBYTE pData, int nWid, int nHei, int src_pitch, FX_LPCBYTE gammaTable)
+{
+ int count = nHei * src_pitch;
+ for(int i = 0; i < count; i++) {
+ pData[i] = gammaTable[pData[i]];
+ }
+}
+static void _ContrastAdjust(FX_LPBYTE pDataIn, FX_LPBYTE pDataOut, int nWid, int nHei, int nSrcRowBytes, int nDstRowBytes)
+{
+ int col, row, temp;
+ int max = 0, min = 255;
+ FX_FLOAT rate;
+ for (row = 0; row < nHei; row ++) {
+ FX_LPBYTE pRow = pDataIn + row * nSrcRowBytes;
+ for (col = 0; col < nWid; col++) {
+ temp = *pRow ++;
+ if (temp > max) {
+ max = temp;
+ }
+ if (temp < min) {
+ min = temp;
+ }
+ }
+ }
+ temp = max - min;
+ if (0 == temp || 255 == temp) {
+ int rowbytes = FXSYS_abs(nSrcRowBytes) > nDstRowBytes ? nDstRowBytes : FXSYS_abs(nSrcRowBytes);
+ for (row = 0; row < nHei; row ++) {
+ FXSYS_memcpy32(pDataOut + row * nDstRowBytes, pDataIn + row * nSrcRowBytes, rowbytes);
+ }
+ return;
+ }
+ rate = 255.f / temp;
+ for (row = 0; row < nHei; row ++) {
+ FX_LPBYTE pSrcRow = pDataIn + row * nSrcRowBytes;
+ FX_LPBYTE pDstRow = pDataOut + row * nDstRowBytes;
+ for (col = 0; col < nWid; col ++) {
+ temp = (int)((*(pSrcRow++) - min) * rate + 0.5);
+ if (temp > 255) {
+ temp = 255;
+ } else if (temp < 0) {
+ temp = 0;
+ }
+ *pDstRow ++ = (FX_BYTE)temp;
+ }
+ }
+}
+CFX_GlyphBitmap* CFX_FaceCache::RenderGlyph(CFX_Font* pFont, FX_DWORD glyph_index, FX_BOOL bFontStyle,
+ const CFX_AffineMatrix* pMatrix, int dest_width, int anti_alias)
+{
+ if (m_Face == NULL) {
+ return NULL;
+ }
+ FXFT_Matrix ft_matrix;
+ ft_matrix.xx = (signed long)(pMatrix->GetA() / 64 * 65536);
+ ft_matrix.xy = (signed long)(pMatrix->GetC() / 64 * 65536);
+ ft_matrix.yx = (signed long)(pMatrix->GetB() / 64 * 65536);
+ ft_matrix.yy = (signed long)(pMatrix->GetD() / 64 * 65536);
+ FX_BOOL bUseCJKSubFont = FALSE;
+ const CFX_SubstFont* pSubstFont = pFont->GetSubstFont();
+ if (pSubstFont) {
+ bUseCJKSubFont = pSubstFont->m_bSubstOfCJK && bFontStyle;
+ int skew = 0;
+ if (bUseCJKSubFont) {
+ skew = pSubstFont->m_bItlicCJK ? -15 : 0;
+ } else {
+ skew = pSubstFont->m_ItalicAngle;
+ }
+ if (skew) {
+ skew = skew <= -30 ? -58 : -g_AngleSkew[-skew];
+ if (pFont->IsVertical()) {
+ ft_matrix.yx += ft_matrix.yy * skew / 100;
+ } else {
+ ft_matrix.xy += -ft_matrix.xx * skew / 100;
+ }
+ }
+ if (pSubstFont->m_SubstFlags & FXFONT_SUBST_MM) {
+ pFont->AdjustMMParams(glyph_index, dest_width, pFont->GetSubstFont()->m_Weight);
+ }
+ }
+ int transflag = FXFT_Get_Face_Internal_Flag(m_Face);
+ FXFT_Set_Transform(m_Face, &ft_matrix, 0);
+ int load_flags = (m_Face->face_flags & FT_FACE_FLAG_SFNT) ? FXFT_LOAD_NO_BITMAP : (FXFT_LOAD_NO_BITMAP | FT_LOAD_NO_HINTING);
+ int error = FXFT_Load_Glyph(m_Face, glyph_index, load_flags);
+ if (error) {
+ FXFT_Set_Face_Internal_Flag(m_Face, transflag);
+ return NULL;
+ }
+ int weight = 0;
+ if (bUseCJKSubFont) {
+ weight = pSubstFont->m_WeightCJK;
+ } else {
+ weight = pSubstFont ? pSubstFont->m_Weight : 0;
+ }
+ if (pSubstFont && !(pSubstFont->m_SubstFlags & FXFONT_SUBST_MM) && weight > 400) {
+ int index = (weight - 400) / 10;
+ if (index >= 100) {
+ FXFT_Set_Face_Internal_Flag(m_Face, transflag);
+ return NULL;
+ }
+ int level = 0;
+ if (pSubstFont->m_Charset == FXFONT_SHIFTJIS_CHARSET) {
+ level = g_WeightPow_SHIFTJIS[index] * 2 * (FXSYS_abs(ft_matrix.xx) + FXSYS_abs(ft_matrix.xy)) / 36655;
+ } else {
+ level = g_WeightPow_11[index] * (FXSYS_abs(ft_matrix.xx) + FXSYS_abs(ft_matrix.xy)) / 36655;
+ }
+ FXFT_Outline_Embolden(FXFT_Get_Glyph_Outline(m_Face), level);
+ }
+ FXFT_Library_SetLcdFilter(CFX_GEModule::Get()->GetFontMgr()->m_FTLibrary, FT_LCD_FILTER_DEFAULT);
+ error = FXFT_Render_Glyph(m_Face, anti_alias);
+ if (error) {
+ FXFT_Set_Face_Internal_Flag(m_Face, transflag);
+ return NULL;
+ }
+ int bmwidth = FXFT_Get_Bitmap_Width(FXFT_Get_Glyph_Bitmap(m_Face));
+ int bmheight = FXFT_Get_Bitmap_Rows(FXFT_Get_Glyph_Bitmap(m_Face));
+ if (bmwidth > 2048 || bmheight > 2048) {
+ FXFT_Set_Face_Internal_Flag(m_Face, transflag);
+ return NULL;
+ }
+ int dib_width = bmwidth;
+ CFX_GlyphBitmap* pGlyphBitmap = FX_NEW CFX_GlyphBitmap;
+ if (!pGlyphBitmap) {
+ return NULL;
+ }
+ pGlyphBitmap->m_Bitmap.Create(dib_width, bmheight,
+ anti_alias == FXFT_RENDER_MODE_MONO ? FXDIB_1bppMask : FXDIB_8bppMask);
+ pGlyphBitmap->m_Left = FXFT_Get_Glyph_BitmapLeft(m_Face);
+ pGlyphBitmap->m_Top = FXFT_Get_Glyph_BitmapTop(m_Face);
+ int dest_pitch = pGlyphBitmap->m_Bitmap.GetPitch();
+ int src_pitch = FXFT_Get_Bitmap_Pitch(FXFT_Get_Glyph_Bitmap(m_Face));
+ FX_BYTE* pDestBuf = pGlyphBitmap->m_Bitmap.GetBuffer();
+ FX_BYTE* pSrcBuf = (FX_BYTE*)FXFT_Get_Bitmap_Buffer(FXFT_Get_Glyph_Bitmap(m_Face));
+ if (anti_alias != FXFT_RENDER_MODE_MONO && FXFT_Get_Bitmap_PixelMode(FXFT_Get_Glyph_Bitmap(m_Face)) == FXFT_PIXEL_MODE_MONO) {
+ int bytes = anti_alias == FXFT_RENDER_MODE_LCD ? 3 : 1;
+ for(int i = 0; i < bmheight; i++)
+ for(int n = 0; n < bmwidth; n++) {
+ FX_BYTE data = (pSrcBuf[i * src_pitch + n / 8] & (0x80 >> (n % 8))) ? 255 : 0;
+ for (int b = 0; b < bytes; b ++) {
+ pDestBuf[i * dest_pitch + n * bytes + b] = data;
+ }
+ }
+ } else {
+ FXSYS_memset32(pDestBuf, 0, dest_pitch * bmheight);
+ if (anti_alias == FXFT_RENDER_MODE_MONO && FXFT_Get_Bitmap_PixelMode(FXFT_Get_Glyph_Bitmap(m_Face)) == FXFT_PIXEL_MODE_MONO) {
+ int rowbytes = FXSYS_abs(src_pitch) > dest_pitch ? dest_pitch : FXSYS_abs(src_pitch);
+ for (int row = 0; row < bmheight; row ++) {
+ FXSYS_memcpy32(pDestBuf + row * dest_pitch, pSrcBuf + row * src_pitch, rowbytes);
+ }
+ } else {
+ _ContrastAdjust(pSrcBuf, pDestBuf, bmwidth, bmheight, src_pitch, dest_pitch);
+ _GammaAdjust(pDestBuf, bmwidth, bmheight, dest_pitch, CFX_GEModule::Get()->GetTextGammaTable());
+ }
+ }
+ FXFT_Set_Face_Internal_Flag(m_Face, transflag);
+ return pGlyphBitmap;
+}
+FX_BOOL _OutputGlyph(void* dib, int x, int y, CFX_Font* pFont,
+ int glyph_index, FX_ARGB argb)
+{
+ CFX_DIBitmap* pDib = (CFX_DIBitmap*)dib;
+ FXFT_Face face = pFont->GetFace();
+ int error = FXFT_Load_Glyph(face, glyph_index, FXFT_LOAD_NO_BITMAP);
+ if (error) {
+ return FALSE;
+ }
+ error = FXFT_Render_Glyph(face, FXFT_RENDER_MODE_NORMAL);
+ if (error) {
+ return FALSE;
+ }
+ int bmwidth = FXFT_Get_Bitmap_Width(FXFT_Get_Glyph_Bitmap(face));
+ int bmheight = FXFT_Get_Bitmap_Rows(FXFT_Get_Glyph_Bitmap(face));
+ int left = FXFT_Get_Glyph_BitmapLeft(face);
+ int top = FXFT_Get_Glyph_BitmapTop(face);
+ FX_LPCBYTE src_buf = (FX_LPCBYTE)FXFT_Get_Bitmap_Buffer(FXFT_Get_Glyph_Bitmap(face));
+ int src_pitch = FXFT_Get_Bitmap_Pitch(FXFT_Get_Glyph_Bitmap(face));
+ CFX_DIBitmap mask;
+ mask.Create(bmwidth, bmheight, FXDIB_8bppMask);
+ FX_LPBYTE dest_buf = mask.GetBuffer();
+ int dest_pitch = mask.GetPitch();
+ for (int row = 0; row < bmheight; row ++) {
+ FX_LPCBYTE src_scan = src_buf + row * src_pitch;
+ FX_LPBYTE dest_scan = dest_buf + row * dest_pitch;
+ FXSYS_memcpy32(dest_scan, src_scan, dest_pitch);
+ }
+ pDib->CompositeMask(x + left, y - top, bmwidth, bmheight, &mask, argb, 0, 0);
+ return TRUE;
+}
+FX_BOOL OutputText(void* dib, int x, int y, CFX_Font* pFont, double font_size,
+ CFX_AffineMatrix* pText_matrix, unsigned short const* text, unsigned long argb)
+{
+ if (!pFont) {
+ return FALSE;
+ }
+ FXFT_Face face = pFont->GetFace();
+ FXFT_Select_Charmap(pFont->m_Face, FXFT_ENCODING_UNICODE);
+ int transflag = FXFT_Get_Face_Internal_Flag(pFont->m_Face);
+ if (pText_matrix) {
+ FXFT_Matrix ft_matrix;
+ ft_matrix.xx = (signed long)(pText_matrix->a / 64 * 65536);
+ ft_matrix.xy = (signed long)(pText_matrix->c / 64 * 65536);
+ ft_matrix.yx = (signed long)(pText_matrix->b / 64 * 65536);
+ ft_matrix.yy = (signed long)(pText_matrix->d / 64 * 65536);
+ FXFT_Set_Transform(face, &ft_matrix, 0);
+ }
+ FX_FLOAT x_pos = 0;
+ for (; *text != 0; text ++) {
+ FX_WCHAR unicode = *text;
+ int glyph_index = FXFT_Get_Char_Index(pFont->m_Face, unicode);
+ if (glyph_index <= 0) {
+ continue;
+ }
+ int err = FXFT_Load_Glyph(pFont->m_Face, glyph_index, FXFT_LOAD_NO_SCALE | FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH);
+ if (err) {
+ continue;
+ }
+ int w = FXFT_Get_Glyph_HoriAdvance(pFont->m_Face);
+ int em = FXFT_Get_Face_UnitsPerEM(pFont->m_Face);
+ FX_FLOAT x1, y1;
+ pText_matrix->Transform(x_pos, 0, x1, y1);
+ _OutputGlyph(dib, (int)x1 + x, (int) - y1 + y, pFont,
+ glyph_index, argb);
+ x_pos += (FX_FLOAT)w / em;
+ }
+ FXFT_Set_Face_Internal_Flag(pFont->m_Face, transflag);
+ return TRUE;
+}
+FX_BOOL OutputGlyph(void* dib, int x, int y, CFX_Font* pFont, double font_size,
+ CFX_AffineMatrix* pMatrix, unsigned long glyph_index, unsigned long argb)
+{
+ FXFT_Matrix ft_matrix;
+ if (pMatrix) {
+ ft_matrix.xx = (signed long)(pMatrix->a * font_size / 64 * 65536);
+ ft_matrix.xy = (signed long)(pMatrix->c * font_size / 64 * 65536);
+ ft_matrix.yx = (signed long)(pMatrix->b * font_size / 64 * 65536);
+ ft_matrix.yy = (signed long)(pMatrix->d * font_size / 64 * 65536);
+ } else {
+ ft_matrix.xx = (signed long)(font_size / 64 * 65536);
+ ft_matrix.xy = ft_matrix.yx = 0;
+ ft_matrix.yy = (signed long)(font_size / 64 * 65536);
+ }
+ int transflag = FXFT_Get_Face_Internal_Flag(pFont->m_Face);
+ FXFT_Set_Transform(pFont->m_Face, &ft_matrix, 0);
+ FX_BOOL ret = _OutputGlyph(dib, x, y, pFont,
+ glyph_index, argb);
+ FXFT_Set_Face_Internal_Flag(pFont->m_Face, transflag);
+ return ret;
+}
+const CFX_PathData* CFX_FaceCache::LoadGlyphPath(CFX_Font* pFont, FX_DWORD glyph_index, int dest_width)
+{
+ if (m_Face == NULL || glyph_index == (FX_DWORD) - 1) {
+ return NULL;
+ }
+ CFX_PathData* pGlyphPath = NULL;
+ FX_LPVOID key;
+ if (pFont->GetSubstFont())
+ key = (FX_LPVOID)(FX_UINTPTR)(glyph_index + ((pFont->GetSubstFont()->m_Weight / 16) << 15) +
+ ((pFont->GetSubstFont()->m_ItalicAngle / 2) << 21) + ((dest_width / 16) << 25) +
+ (pFont->IsVertical() << 31));
+ else {
+ key = (FX_LPVOID)(FX_UINTPTR)glyph_index;
+ }
+ if (m_PathMap.Lookup(key, (FX_LPVOID&)pGlyphPath)) {
+ return pGlyphPath;
+ }
+ pGlyphPath = pFont->LoadGlyphPath(glyph_index, dest_width);
+ m_PathMap.SetAt(key, pGlyphPath);
+ return pGlyphPath;
+}
+typedef struct {
+ FX_BOOL m_bCount;
+ int m_PointCount;
+ FX_PATHPOINT* m_pPoints;
+ int m_CurX;
+ int m_CurY;
+ FX_FLOAT m_CoordUnit;
+} OUTLINE_PARAMS;
+void _Outline_CheckEmptyContour(OUTLINE_PARAMS* param)
+{
+ if (param->m_PointCount >= 2 && param->m_pPoints[param->m_PointCount - 2].m_Flag == FXPT_MOVETO &&
+ param->m_pPoints[param->m_PointCount - 2].m_PointX == param->m_pPoints[param->m_PointCount - 1].m_PointX &&
+ param->m_pPoints[param->m_PointCount - 2].m_PointY == param->m_pPoints[param->m_PointCount - 1].m_PointY) {
+ param->m_PointCount -= 2;
+ }
+ if (param->m_PointCount >= 4 && param->m_pPoints[param->m_PointCount - 4].m_Flag == FXPT_MOVETO &&
+ param->m_pPoints[param->m_PointCount - 3].m_Flag == FXPT_BEZIERTO &&
+ param->m_pPoints[param->m_PointCount - 3].m_PointX == param->m_pPoints[param->m_PointCount - 4].m_PointX &&
+ param->m_pPoints[param->m_PointCount - 3].m_PointY == param->m_pPoints[param->m_PointCount - 4].m_PointY &&
+ param->m_pPoints[param->m_PointCount - 2].m_PointX == param->m_pPoints[param->m_PointCount - 4].m_PointX &&
+ param->m_pPoints[param->m_PointCount - 2].m_PointY == param->m_pPoints[param->m_PointCount - 4].m_PointY &&
+ param->m_pPoints[param->m_PointCount - 1].m_PointX == param->m_pPoints[param->m_PointCount - 4].m_PointX &&
+ param->m_pPoints[param->m_PointCount - 1].m_PointY == param->m_pPoints[param->m_PointCount - 4].m_PointY) {
+ param->m_PointCount -= 4;
+ }
+}
+extern "C" {
+ static int _Outline_MoveTo(const FXFT_Vector* to, void* user)
+ {
+ OUTLINE_PARAMS* param = (OUTLINE_PARAMS*)user;
+ if (!param->m_bCount) {
+ _Outline_CheckEmptyContour(param);
+ param->m_pPoints[param->m_PointCount].m_PointX = to->x / param->m_CoordUnit;
+ param->m_pPoints[param->m_PointCount].m_PointY = to->y / param->m_CoordUnit;
+ param->m_pPoints[param->m_PointCount].m_Flag = FXPT_MOVETO;
+ param->m_CurX = to->x;
+ param->m_CurY = to->y;
+ if (param->m_PointCount) {
+ param->m_pPoints[param->m_PointCount - 1].m_Flag |= FXPT_CLOSEFIGURE;
+ }
+ }
+ param->m_PointCount ++;
+ return 0;
+ }
+};
+extern "C" {
+ static int _Outline_LineTo(const FXFT_Vector* to, void* user)
+ {
+ OUTLINE_PARAMS* param = (OUTLINE_PARAMS*)user;
+ if (!param->m_bCount) {
+ param->m_pPoints[param->m_PointCount].m_PointX = to->x / param->m_CoordUnit;
+ param->m_pPoints[param->m_PointCount].m_PointY = to->y / param->m_CoordUnit;
+ param->m_pPoints[param->m_PointCount].m_Flag = FXPT_LINETO;
+ param->m_CurX = to->x;
+ param->m_CurY = to->y;
+ }
+ param->m_PointCount ++;
+ return 0;
+ }
+};
+extern "C" {
+ static int _Outline_ConicTo(const FXFT_Vector* control, const FXFT_Vector* to, void* user)
+ {
+ OUTLINE_PARAMS* param = (OUTLINE_PARAMS*)user;
+ if (!param->m_bCount) {
+ param->m_pPoints[param->m_PointCount].m_PointX = (param->m_CurX + (control->x - param->m_CurX) * 2 / 3) / param->m_CoordUnit;
+ param->m_pPoints[param->m_PointCount].m_PointY = (param->m_CurY + (control->y - param->m_CurY) * 2 / 3) / param->m_CoordUnit;
+ param->m_pPoints[param->m_PointCount].m_Flag = FXPT_BEZIERTO;
+ param->m_pPoints[param->m_PointCount + 1].m_PointX = (control->x + (to->x - control->x) / 3) / param->m_CoordUnit;
+ param->m_pPoints[param->m_PointCount + 1].m_PointY = (control->y + (to->y - control->y) / 3) / param->m_CoordUnit;
+ param->m_pPoints[param->m_PointCount + 1].m_Flag = FXPT_BEZIERTO;
+ param->m_pPoints[param->m_PointCount + 2].m_PointX = to->x / param->m_CoordUnit;
+ param->m_pPoints[param->m_PointCount + 2].m_PointY = to->y / param->m_CoordUnit;
+ param->m_pPoints[param->m_PointCount + 2].m_Flag = FXPT_BEZIERTO;
+ param->m_CurX = to->x;
+ param->m_CurY = to->y;
+ }
+ param->m_PointCount += 3;
+ return 0;
+ }
+};
+extern "C" {
+ static int _Outline_CubicTo(const FXFT_Vector* control1, const FXFT_Vector* control2, const FXFT_Vector* to, void* user)
+ {
+ OUTLINE_PARAMS* param = (OUTLINE_PARAMS*)user;
+ if (!param->m_bCount) {
+ param->m_pPoints[param->m_PointCount].m_PointX = control1->x / param->m_CoordUnit;
+ param->m_pPoints[param->m_PointCount].m_PointY = control1->y / param->m_CoordUnit;
+ param->m_pPoints[param->m_PointCount].m_Flag = FXPT_BEZIERTO;
+ param->m_pPoints[param->m_PointCount + 1].m_PointX = control2->x / param->m_CoordUnit;
+ param->m_pPoints[param->m_PointCount + 1].m_PointY = control2->y / param->m_CoordUnit;
+ param->m_pPoints[param->m_PointCount + 1].m_Flag = FXPT_BEZIERTO;
+ param->m_pPoints[param->m_PointCount + 2].m_PointX = to->x / param->m_CoordUnit;
+ param->m_pPoints[param->m_PointCount + 2].m_PointY = to->y / param->m_CoordUnit;
+ param->m_pPoints[param->m_PointCount + 2].m_Flag = FXPT_BEZIERTO;
+ param->m_CurX = to->x;
+ param->m_CurY = to->y;
+ }
+ param->m_PointCount += 3;
+ return 0;
+ }
+};
+CFX_PathData* CFX_Font::LoadGlyphPath(FX_DWORD glyph_index, int dest_width)
+{
+ if (m_Face == NULL) {
+ return NULL;
+ }
+ FXFT_Set_Pixel_Sizes(m_Face, 0, 64);
+ FXFT_Matrix ft_matrix = {65536, 0, 0, 65536};
+ if (m_pSubstFont) {
+ if (m_pSubstFont->m_ItalicAngle) {
+ int skew = m_pSubstFont->m_ItalicAngle;
+ skew = skew <= -30 ? -58 : -g_AngleSkew[-skew];
+ if (m_bVertical) {
+ ft_matrix.yx += ft_matrix.yy * skew / 100;
+ } else {
+ ft_matrix.xy += -ft_matrix.xx * skew / 100;
+ }
+ }
+ if (m_pSubstFont->m_SubstFlags & FXFONT_SUBST_MM) {
+ AdjustMMParams(glyph_index, dest_width, m_pSubstFont->m_Weight);
+ }
+ }
+ int transflag = FXFT_Get_Face_Internal_Flag(m_Face);
+ FXFT_Set_Transform(m_Face, &ft_matrix, 0);
+ int load_flags = (m_Face->face_flags & FT_FACE_FLAG_SFNT) ? FXFT_LOAD_NO_BITMAP : FXFT_LOAD_NO_BITMAP | FT_LOAD_NO_HINTING;
+ int error = FXFT_Load_Glyph(m_Face, glyph_index, load_flags);
+ if (error) {
+ FXFT_Set_Face_Internal_Flag(m_Face, transflag);
+ return NULL;
+ }
+ if (m_pSubstFont && !(m_pSubstFont->m_SubstFlags & FXFONT_SUBST_MM) && m_pSubstFont->m_Weight > 400) {
+ int level = 0;
+ if (m_pSubstFont->m_Charset == FXFONT_SHIFTJIS_CHARSET) {
+ level = g_WeightPow_SHIFTJIS[(m_pSubstFont->m_Weight - 400) / 10] * 2 * 65536 / 36655;
+ } else {
+ level = g_WeightPow[(m_pSubstFont->m_Weight - 400) / 10] * 2;
+ }
+ FXFT_Outline_Embolden(FXFT_Get_Glyph_Outline(m_Face), level);
+ }
+ FXFT_Outline_Funcs funcs;
+ funcs.move_to = _Outline_MoveTo;
+ funcs.line_to = _Outline_LineTo;
+ funcs.conic_to = _Outline_ConicTo;
+ funcs.cubic_to = _Outline_CubicTo;
+ funcs.shift = 0;
+ funcs.delta = 0;
+ OUTLINE_PARAMS params;
+ params.m_bCount = TRUE;
+ params.m_PointCount = 0;
+ FXFT_Outline_Decompose(FXFT_Get_Glyph_Outline(m_Face), &funcs, &params);
+ if (params.m_PointCount == 0) {
+ FXFT_Set_Face_Internal_Flag(m_Face, transflag);
+ return NULL;
+ }
+ CFX_PathData* pPath = FX_NEW CFX_PathData;
+ if (!pPath) {
+ return NULL;
+ }
+ pPath->SetPointCount(params.m_PointCount);
+ params.m_bCount = FALSE;
+ params.m_PointCount = 0;
+ params.m_pPoints = pPath->GetPoints();
+ params.m_CurX = params.m_CurY = 0;
+ params.m_CoordUnit = 64 * 64.0;
+ FXFT_Outline_Decompose(FXFT_Get_Glyph_Outline(m_Face), &funcs, &params);
+ _Outline_CheckEmptyContour(&params);
+ pPath->TrimPoints(params.m_PointCount);
+ if (params.m_PointCount) {
+ pPath->GetPoints()[params.m_PointCount - 1].m_Flag |= FXPT_CLOSEFIGURE;
+ }
+ FXFT_Set_Face_Internal_Flag(m_Face, transflag);
+ return pPath;
+}
+void _CFX_UniqueKeyGen::Generate(int count, ...)
+{
+ va_list argList;
+ va_start(argList, count);
+ for (int i = 0; i < count; i ++) {
+ int p = va_arg(argList, int);
+ ((FX_DWORD*)m_Key)[i] = p;
+ }
+ va_end(argList);
+ m_KeyLen = count * sizeof(FX_DWORD);
+}
diff --git a/core/src/fxge/ge/text_int.h b/core/src/fxge/ge/text_int.h
new file mode 100644
index 0000000000..7608f8a2ed
--- /dev/null
+++ b/core/src/fxge/ge/text_int.h
@@ -0,0 +1,100 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+struct _CFX_UniqueKeyGen {
+ void Generate(int count, ...);
+ FX_CHAR m_Key[128];
+ int m_KeyLen;
+};
+class CFX_SizeGlyphCache : public CFX_Object
+{
+public:
+ CFX_SizeGlyphCache()
+ {
+ m_GlyphMap.InitHashTable(253);
+ }
+ ~CFX_SizeGlyphCache();
+ CFX_MapPtrToPtr m_GlyphMap;
+};
+class CTTFontDesc : public CFX_Object
+{
+public:
+ CTTFontDesc()
+ {
+ m_Type = 0;
+ m_pFontData = NULL;
+ m_RefCount = 0;
+ }
+ ~CTTFontDesc();
+ FX_BOOL ReleaseFace(FXFT_Face face);
+ int m_Type;
+ union {
+ struct {
+ FX_BOOL m_bItalic;
+ FX_BOOL m_bBold;
+ FXFT_Face m_pFace;
+ } m_SingleFace;
+ struct {
+ FXFT_Face m_pFaces[16];
+ } m_TTCFace;
+ };
+ FX_BYTE* m_pFontData;
+ int m_RefCount;
+};
+class CFX_UnicodeEncoding : public IFX_FontEncoding
+{
+public:
+ CFX_UnicodeEncoding(CFX_Font* pFont);
+ virtual FX_DWORD GlyphFromCharCodeEx(FX_DWORD charcode, int encoding = ENCODING_UNICODE);
+private:
+ CFX_Font* m_pFont;
+ virtual FX_DWORD GlyphFromCharCode(FX_DWORD charcode);
+ virtual CFX_WideString UnicodeFromCharCode(FX_DWORD charcode) const
+ {
+ return CFX_WideString((FX_WCHAR)charcode);
+ }
+ virtual FX_DWORD CharCodeFromUnicode(FX_WCHAR Unicode) const
+ {
+ return Unicode;
+ }
+ virtual FX_BOOL IsUnicodeCompatible() const
+ {
+ return TRUE;
+ }
+};
+#define CHARSET_FLAG_ANSI 1
+#define CHARSET_FLAG_SYMBOL 2
+#define CHARSET_FLAG_SHIFTJIS 4
+#define CHARSET_FLAG_BIG5 8
+#define CHARSET_FLAG_GB 16
+#define CHARSET_FLAG_KOREAN 32
+class CFontFaceInfo : public CFX_Object
+{
+public:
+ CFX_ByteString m_FilePath;
+ CFX_ByteString m_FaceName;
+ FX_DWORD m_Styles;
+ FX_DWORD m_Charsets;
+ FX_DWORD m_FontOffset;
+ FX_DWORD m_FileSize;
+ CFX_ByteString m_FontTables;
+};
+class CFontFileFaceInfo : public CFX_Object
+{
+public:
+ CFontFileFaceInfo();
+ ~CFontFileFaceInfo();
+ IFX_FileStream* m_pFile;
+ FXFT_Face m_Face;
+ CFX_ByteString m_FaceName;
+ FX_DWORD m_Charsets;
+ FX_DWORD m_FileSize;
+ FX_DWORD m_FontOffset;
+ int m_Weight;
+ FX_BOOL m_bItalic;
+ int m_PitchFamily;
+ CFX_ByteString m_FontTables;
+};
diff --git a/core/src/fxge/win32/dwrite_int.h b/core/src/fxge/win32/dwrite_int.h
new file mode 100644
index 0000000000..1f0770d0bf
--- /dev/null
+++ b/core/src/fxge/win32/dwrite_int.h
@@ -0,0 +1,59 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FX_DIRECT_WRITE_
+#define _FX_DIRECT_WRITE_
+#ifndef DECLSPEC_UUID
+#if (_MSC_VER >= 1100) && defined (__cplusplus)
+#define DECLSPEC_UUID(x) __declspec(uuid(x))
+#else
+#define DECLSPEC_UUID(x)
+#endif
+#endif
+#ifndef DECLSPEC_NOVTABLE
+#if (_MSC_VER >= 1100) && defined(__cplusplus)
+#define DECLSPEC_NOVTABLE __declspec(novtable)
+#else
+#define DECLSPEC_NOVTABLE
+#endif
+#endif
+#if(WINVER < 0x0500)
+#ifndef _MAC
+DECLARE_HANDLE(HMONITOR);
+#endif
+#endif
+class CDWriteExt
+{
+public:
+ CDWriteExt();
+ ~CDWriteExt();
+
+ void Load();
+ void Unload();
+
+ FX_BOOL IsAvailable()
+ {
+ return m_pDWriteFactory != NULL;
+ }
+
+ void* DwCreateFontFaceFromStream(FX_LPBYTE pData, FX_DWORD size, int simulation_style);
+ FX_BOOL DwCreateRenderingTarget(CFX_DIBitmap* pSrc, void** renderTarget);
+ void DwDeleteRenderingTarget(void* renderTarget);
+ FX_BOOL DwRendingString(void* renderTarget, CFX_ClipRgn* pClipRgn, FX_RECT& stringRect, CFX_AffineMatrix* pMatrix,
+ void *font, FX_FLOAT font_size, FX_ARGB text_color,
+ int glyph_count, unsigned short* glyph_indices,
+ FX_FLOAT baselineOriginX, FX_FLOAT baselineOriginY,
+ void* glyph_offsets,
+ FX_FLOAT* glyph_advances);
+ void DwDeleteFont(void* pFont);
+
+protected:
+ void* m_hModule;
+ void* m_pDWriteFactory;
+ void* m_pDwFontContext;
+ void* m_pDwTextRenderer;
+};
+#endif
diff --git a/core/src/fxge/win32/fx_win32_device.cpp b/core/src/fxge/win32/fx_win32_device.cpp
new file mode 100644
index 0000000000..e3f5ae0609
--- /dev/null
+++ b/core/src/fxge/win32/fx_win32_device.cpp
@@ -0,0 +1,1200 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxge/fx_ge.h"
+#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_
+#include "../../../include/fxge/fx_ge_win32.h"
+#include <crtdbg.h>
+#include "../agg/include/fxfx_agg_clip_liang_barsky.h"
+#include "dwrite_int.h"
+#include "win32_int.h"
+#include "../ge/text_int.h"
+#include "../dib/dib_int.h"
+#include "../agg/include/fx_agg_driver.h"
+#include "../../../include/fxge/fx_freetype.h"
+#include "../../../include/fxcodec/fx_codec.h"
+class CWin32FontInfo : public IFX_SystemFontInfo
+{
+public:
+ CWin32FontInfo();
+ ~CWin32FontInfo();
+ virtual void Release();
+ virtual FX_BOOL EnumFontList(CFX_FontMapper* pMapper);
+ virtual void* MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR face, FX_BOOL& bExact);
+ virtual void* GetFont(FX_LPCSTR face)
+ {
+ return NULL;
+ }
+ virtual FX_DWORD GetFontData(void* hFont, FX_DWORD table, FX_LPBYTE buffer, FX_DWORD size);
+ virtual void DeleteFont(void* hFont);
+ virtual FX_BOOL GetFaceName(void* hFont, CFX_ByteString& name);
+ virtual FX_BOOL GetFontCharset(void* hFont, int& charset);
+ FX_BOOL IsOpenTypeFromDiv(const LOGFONTA *plf);
+ FX_BOOL IsSupportFontFormDiv(const LOGFONTA* plf);
+ void AddInstalledFont(const LOGFONTA *plf, FX_DWORD FontType);
+ void GetGBPreference(CFX_ByteString& face, int weight, int picth_family);
+ void GetJapanesePreference(CFX_ByteString& face, int weight, int picth_family);
+ CFX_ByteString FindFont(const CFX_ByteString& name);
+ HDC m_hDC;
+ CFX_FontMapper* m_pMapper;
+ CFX_ByteString m_LastFamily;
+ CFX_ByteString m_KaiTi, m_FangSong;
+};
+CWin32FontInfo::CWin32FontInfo()
+{
+ m_hDC = CreateCompatibleDC(NULL);
+}
+CWin32FontInfo::~CWin32FontInfo()
+{
+ m_pMapper = NULL;
+}
+void CWin32FontInfo::Release()
+{
+ DeleteDC(m_hDC);
+ delete this;
+}
+#define TT_MAKE_TAG(x1, x2, x3, x4) (((FX_DWORD)x1<<24)|((FX_DWORD)x2<<16)|((FX_DWORD)x3<<8)|(FX_DWORD)x4)
+FX_BOOL CWin32FontInfo::IsOpenTypeFromDiv(const LOGFONTA *plf)
+{
+ HFONT hFont = CreateFontIndirectA(plf);
+ FX_BOOL ret = FALSE;
+ FX_DWORD font_size = GetFontData(hFont, 0, NULL, 0);
+ if (font_size != GDI_ERROR && font_size >= sizeof(FX_DWORD)) {
+ FX_DWORD lVersion = 0;
+ GetFontData(hFont, 0, (FX_BYTE*)(&lVersion), sizeof(FX_DWORD));
+ lVersion = (((FX_DWORD)(FX_BYTE)(lVersion)) << 24) | ((FX_DWORD)((FX_BYTE)(lVersion >> 8))) << 16 |
+ ((FX_DWORD)((FX_BYTE)(lVersion >> 16))) << 8 | ((FX_BYTE)(lVersion >> 24));
+ if (lVersion == TT_MAKE_TAG('O', 'T', 'T', 'O') ||
+ lVersion == 0x00010000 ||
+ lVersion == TT_MAKE_TAG('t', 't', 'c', 'f') ||
+ lVersion == TT_MAKE_TAG('t', 'r', 'u', 'e') ||
+ lVersion == 0x00020000) {
+ ret = TRUE;
+ }
+ }
+ DeleteFont(hFont);
+ return ret;
+}
+FX_BOOL CWin32FontInfo::IsSupportFontFormDiv(const LOGFONTA* plf)
+{
+ HFONT hFont = CreateFontIndirectA(plf);
+ FX_BOOL ret = FALSE;
+ FX_DWORD font_size = GetFontData(hFont, 0, NULL, 0);
+ if (font_size != GDI_ERROR && font_size >= sizeof(FX_DWORD)) {
+ FX_DWORD lVersion = 0;
+ GetFontData(hFont, 0, (FX_BYTE*)(&lVersion), sizeof(FX_DWORD));
+ lVersion = (((FX_DWORD)(FX_BYTE)(lVersion)) << 24) | ((FX_DWORD)((FX_BYTE)(lVersion >> 8))) << 16 |
+ ((FX_DWORD)((FX_BYTE)(lVersion >> 16))) << 8 | ((FX_BYTE)(lVersion >> 24));
+ if (lVersion == TT_MAKE_TAG('O', 'T', 'T', 'O') ||
+ lVersion == 0x00010000 ||
+ lVersion == TT_MAKE_TAG('t', 't', 'c', 'f') ||
+ lVersion == TT_MAKE_TAG('t', 'r', 'u', 'e') ||
+ lVersion == 0x00020000) {
+ ret = TRUE;
+ } else if ((lVersion & 0xFFFF0000) == TT_MAKE_TAG(0x80, 0x01, 0x00, 0x00) ||
+ (lVersion & 0xFFFF0000) == TT_MAKE_TAG('%', '!', 0, 0)) {
+ ret = TRUE;
+ }
+ }
+ DeleteFont(hFont);
+ return ret;
+}
+void CWin32FontInfo::AddInstalledFont(const LOGFONTA *plf, FX_DWORD FontType)
+{
+ CFX_ByteString name(plf->lfFaceName, -1);
+ if (name[0] == '@') {
+ return;
+ }
+ if (name == m_LastFamily) {
+ m_pMapper->AddInstalledFont(name, plf->lfCharSet);
+ return;
+ }
+ if (!(FontType & TRUETYPE_FONTTYPE) && !(FontType & DEVICE_FONTTYPE)) {
+ return;
+ }
+ if (!(FontType & TRUETYPE_FONTTYPE)) {
+ if (!IsSupportFontFormDiv(plf)) {
+ return;
+ }
+ }
+ m_pMapper->AddInstalledFont(name, plf->lfCharSet);
+ m_LastFamily = name;
+}
+static int CALLBACK FontEnumProc(
+ const LOGFONTA *plf,
+ const TEXTMETRICA *lpntme,
+ FX_DWORD FontType,
+ LPARAM lParam
+)
+{
+ CWin32FontInfo* pFontInfo = (CWin32FontInfo*)lParam;
+ if (pFontInfo->m_pMapper->GetFontEnumerator()) {
+ pFontInfo->m_pMapper->GetFontEnumerator()->HitFont();
+ }
+ pFontInfo->AddInstalledFont(plf, FontType);
+ return 1;
+}
+FX_BOOL CWin32FontInfo::EnumFontList(CFX_FontMapper* pMapper)
+{
+ m_pMapper = pMapper;
+ LOGFONTA lf;
+ FXSYS_memset32(&lf, 0, sizeof(LOGFONTA));
+ lf.lfCharSet = DEFAULT_CHARSET;
+ lf.lfFaceName[0] = 0;
+ lf.lfPitchAndFamily = 0;
+ EnumFontFamiliesExA(m_hDC, &lf, (FONTENUMPROCA)FontEnumProc, (FX_UINTPTR)this, 0);
+ if (pMapper->GetFontEnumerator()) {
+ pMapper->GetFontEnumerator()->Finish();
+ }
+ return TRUE;
+}
+static const struct {
+ FX_LPCSTR m_pFaceName;
+ FX_LPCSTR m_pVariantName;
+}
+VariantNames[] = {
+ {"DFKai-SB", "\x19\x6A\x77\x69\xD4\x9A"},
+};
+static const struct {
+ FX_LPCSTR m_pName;
+ FX_LPCSTR m_pWinName;
+ FX_BOOL m_bBold;
+ FX_BOOL m_bItalic;
+}
+Base14Substs[] = {
+ {"Courier", "Courier New", FALSE, FALSE},
+ {"Courier-Bold", "Courier New", TRUE, FALSE},
+ {"Courier-BoldOblique", "Courier New", TRUE, TRUE},
+ {"Courier-Oblique", "Courier New", FALSE, TRUE},
+ {"Helvetica", "Arial", FALSE, FALSE},
+ {"Helvetica-Bold", "Arial", TRUE, FALSE},
+ {"Helvetica-BoldOblique", "Arial", TRUE, TRUE},
+ {"Helvetica-Oblique", "Arial", FALSE, TRUE},
+ {"Times-Roman", "Times New Roman", FALSE, FALSE},
+ {"Times-Bold", "Times New Roman", TRUE, FALSE},
+ {"Times-BoldItalic", "Times New Roman", TRUE, TRUE},
+ {"Times-Italic", "Times New Roman", FALSE, TRUE},
+};
+CFX_ByteString CWin32FontInfo::FindFont(const CFX_ByteString& name)
+{
+ if (m_pMapper == NULL) {
+ return name;
+ }
+ int nFonts = m_pMapper->m_InstalledTTFonts.GetSize();
+ for (int i = 0; i < nFonts; i ++) {
+ CFX_ByteString thisname = m_pMapper->m_InstalledTTFonts[i];
+ if (thisname[0] == ' ') {
+ if (thisname.Mid(1, name.GetLength()) == name) {
+ return m_pMapper->m_InstalledTTFonts[i + 1];
+ }
+ } else if (thisname.Left(name.GetLength()) == name) {
+ return m_pMapper->m_InstalledTTFonts[i];
+ }
+ }
+ return CFX_ByteString();
+}
+struct _FontNameMap {
+ FX_LPCSTR m_pSubFontName;
+ FX_LPCSTR m_pSrcFontName;
+};
+const _FontNameMap g_JpFontNameMap[] = {
+ {"MS Mincho", "Heiseimin-W3"},
+ {"MS Gothic", "Jun101-Light"},
+};
+const _FontNameMap g_GbFontNameMap[1];
+extern "C" {
+ static int compareString(const void* key, const void* element)
+ {
+ return FXSYS_stricmp((FX_LPCSTR)key, ((_FontNameMap*)element)->m_pSrcFontName);
+ }
+}
+FX_BOOL _GetSubFontName(CFX_ByteString& name, int lang)
+{
+ int size = sizeof g_JpFontNameMap;
+ void* pFontnameMap = (void*)g_JpFontNameMap;
+ if (lang == 1) {
+ size = sizeof g_GbFontNameMap;
+ pFontnameMap = (void*)g_GbFontNameMap;
+ } else if (lang == 2) {
+ size = 0;
+ }
+ _FontNameMap* found = (_FontNameMap*)FXSYS_bsearch((FX_LPCSTR)name, pFontnameMap,
+ size / sizeof (_FontNameMap), sizeof (_FontNameMap), compareString);
+ if (found == NULL) {
+ return FALSE;
+ }
+ name = found->m_pSubFontName;
+ return TRUE;
+}
+void CWin32FontInfo::GetGBPreference(CFX_ByteString& face, int weight, int picth_family)
+{
+ if (face.Find("KaiTi") >= 0 || face.Find("\xbf\xac") >= 0) {
+ if (m_KaiTi.IsEmpty()) {
+ m_KaiTi = FindFont("KaiTi");
+ if (m_KaiTi.IsEmpty()) {
+ m_KaiTi = "SimSun";
+ }
+ }
+ face = m_KaiTi;
+ } else if (face.Find("FangSong") >= 0 || face.Find("\xb7\xc2\xcb\xce") >= 0) {
+ if (m_FangSong.IsEmpty()) {
+ m_FangSong = FindFont("FangSong");
+ if (m_FangSong.IsEmpty()) {
+ m_FangSong = "SimSun";
+ }
+ }
+ face = m_FangSong;
+ } else if (face.Find("SimSun") >= 0 || face.Find("\xcb\xce") >= 0) {
+ face = "SimSun";
+ } else if (face.Find("SimHei") >= 0 || face.Find("\xba\xda") >= 0) {
+ face = "SimHei";
+ } else if (!(picth_family & FF_ROMAN) && weight > 550) {
+ face = "SimHei";
+ } else {
+ face = "SimSun";
+ }
+}
+void CWin32FontInfo::GetJapanesePreference(CFX_ByteString& face, int weight, int picth_family)
+{
+ if (face.Find("Gothic") >= 0 || face.Find("\x83\x53\x83\x56\x83\x62\x83\x4e") >= 0) {
+ if (face.Find("PGothic") >= 0 || face.Find("\x82\x6f\x83\x53\x83\x56\x83\x62\x83\x4e") >= 0) {
+ face = "MS PGothic";
+ } else if (face.Find("UI Gothic") >= 0) {
+ face = "MS UI Gothic";
+ } else {
+ if (face.Find("HGSGothicM") >= 0 || face.Find("HGMaruGothicMPRO") >= 0) {
+ face = "MS PGothic";
+ } else {
+ face = "MS Gothic";
+ }
+ }
+ return;
+ } else if (face.Find("Mincho") >= 0 || face.Find("\x96\xbe\x92\xa9") >= 0) {
+ if (face.Find("PMincho") >= 0 || face.Find("\x82\x6f\x96\xbe\x92\xa9") >= 0) {
+ face = "MS PMincho";
+ } else {
+ face = "MS Mincho";
+ }
+ return;
+ }
+ if (_GetSubFontName(face, 0)) {
+ return;
+ }
+ if (!(picth_family & FF_ROMAN) && weight > 400) {
+ face = "MS PGothic";
+ } else {
+ face = "MS PMincho";
+ }
+}
+void* CWin32FontInfo::MapFont(int weight, FX_BOOL bItalic, int charset, int pitch_family, FX_LPCSTR cstr_face, FX_BOOL& bExact)
+{
+ CFX_ByteString face = cstr_face;
+ int iBaseFont;
+ for (iBaseFont = 0; iBaseFont < 12; iBaseFont ++)
+ if (face == CFX_ByteStringC(Base14Substs[iBaseFont].m_pName)) {
+ face = Base14Substs[iBaseFont].m_pWinName;
+ weight = Base14Substs[iBaseFont].m_bBold ? FW_BOLD : FW_NORMAL;
+ bItalic = Base14Substs[iBaseFont].m_bItalic;
+ bExact = TRUE;
+ break;
+ }
+ if (charset == ANSI_CHARSET || charset == SYMBOL_CHARSET) {
+ charset = DEFAULT_CHARSET;
+ }
+ int subst_pitch_family = pitch_family;
+ switch (charset) {
+ case SHIFTJIS_CHARSET:
+ subst_pitch_family = FF_ROMAN;
+ break;
+ case CHINESEBIG5_CHARSET:
+ case HANGUL_CHARSET:
+ case GB2312_CHARSET:
+ subst_pitch_family = 0;
+ break;
+ }
+ HFONT hFont = ::CreateFontA(-10, 0, 0, 0, weight, bItalic, 0, 0, charset, OUT_TT_ONLY_PRECIS,
+ 0, 0, subst_pitch_family, face);
+ char facebuf[100];
+ HFONT hOldFont = (HFONT)::SelectObject(m_hDC, hFont);
+ int ret = ::GetTextFaceA(m_hDC, 100, facebuf);
+ ::SelectObject(m_hDC, hOldFont);
+ if (face.EqualNoCase(facebuf)) {
+ return hFont;
+ }
+ int iCount = sizeof(VariantNames) / sizeof(VariantNames[0]);
+ for (int i = 0; i < iCount; ++i) {
+ if (face == VariantNames[i].m_pFaceName) {
+ CFX_WideString wsFace = CFX_WideString::FromLocal(facebuf);
+ CFX_WideString wsName = CFX_WideString::FromUTF16LE((const unsigned short*)VariantNames[i].m_pVariantName);
+ if (wsFace == wsName) {
+ return hFont;
+ }
+ }
+ }
+ ::DeleteObject(hFont);
+ if (charset == DEFAULT_CHARSET) {
+ return NULL;
+ }
+ switch (charset) {
+ case SHIFTJIS_CHARSET:
+ GetJapanesePreference(face, weight, pitch_family);
+ break;
+ case GB2312_CHARSET:
+ GetGBPreference(face, weight, pitch_family);
+ break;
+ case HANGUL_CHARSET:
+ face = "Gulim";
+ break;
+ case CHINESEBIG5_CHARSET:
+ if (face.Find("MSung") >= 0) {
+ face = "MingLiU";
+ } else {
+ face = "PMingLiU";
+ }
+ break;
+ }
+ hFont = ::CreateFontA(-10, 0, 0, 0, weight, bItalic, 0, 0, charset, OUT_TT_ONLY_PRECIS,
+ 0, 0, subst_pitch_family, face);
+ return hFont;
+}
+void CWin32FontInfo::DeleteFont(void* hFont)
+{
+ ::DeleteObject(hFont);
+}
+FX_DWORD CWin32FontInfo::GetFontData(void* hFont, FX_DWORD table, FX_LPBYTE buffer, FX_DWORD size)
+{
+ HFONT hOldFont = (HFONT)::SelectObject(m_hDC, (HFONT)hFont);
+ table = FXDWORD_FROM_MSBFIRST(table);
+ size = ::GetFontData(m_hDC, table, 0, buffer, size);
+ ::SelectObject(m_hDC, hOldFont);
+ if (size == GDI_ERROR) {
+ return 0;
+ }
+ return size;
+}
+FX_BOOL CWin32FontInfo::GetFaceName(void* hFont, CFX_ByteString& name)
+{
+ char facebuf[100];
+ HFONT hOldFont = (HFONT)::SelectObject(m_hDC, (HFONT)hFont);
+ int ret = ::GetTextFaceA(m_hDC, 100, facebuf);
+ ::SelectObject(m_hDC, hOldFont);
+ if (ret == 0) {
+ return FALSE;
+ }
+ name = facebuf;
+ return TRUE;
+}
+FX_BOOL CWin32FontInfo::GetFontCharset(void* hFont, int& charset)
+{
+ TEXTMETRIC tm;
+ HFONT hOldFont = (HFONT)::SelectObject(m_hDC, (HFONT)hFont);
+ ::GetTextMetrics(m_hDC, &tm);
+ ::SelectObject(m_hDC, hOldFont);
+ charset = tm.tmCharSet;
+ return TRUE;
+}
+#ifndef _FPDFAPI_MINI_
+IFX_SystemFontInfo* IFX_SystemFontInfo::CreateDefault()
+{
+ return FX_NEW CWin32FontInfo;
+}
+#endif
+void CFX_GEModule::InitPlatform()
+{
+ CWin32Platform* pPlatformData = FX_NEW CWin32Platform;
+ if (!pPlatformData) {
+ return;
+ }
+ OSVERSIONINFO ver;
+ ver.dwOSVersionInfoSize = sizeof(ver);
+ GetVersionEx(&ver);
+ pPlatformData->m_bHalfTone = ver.dwMajorVersion >= 5;
+ pPlatformData->m_GdiplusExt.Load();
+ m_pPlatformData = pPlatformData;
+ m_pFontMgr->SetSystemFontInfo(IFX_SystemFontInfo::CreateDefault());
+}
+void CFX_GEModule::DestroyPlatform()
+{
+ if (m_pPlatformData) {
+ delete (CWin32Platform*)m_pPlatformData;
+ }
+ m_pPlatformData = NULL;
+}
+CGdiDeviceDriver::CGdiDeviceDriver(HDC hDC, int device_class)
+{
+ m_hDC = hDC;
+ m_DeviceClass = device_class;
+ CWin32Platform* pPlatform = (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData();
+ SetStretchBltMode(hDC, pPlatform->m_bHalfTone ? HALFTONE : COLORONCOLOR);
+ if (GetObjectType(m_hDC) == OBJ_MEMDC) {
+ HBITMAP hBitmap = CreateBitmap(1, 1, 1, 1, NULL);
+ hBitmap = (HBITMAP)SelectObject(m_hDC, hBitmap);
+ BITMAP bitmap;
+ GetObject(hBitmap, sizeof bitmap, &bitmap);
+ m_nBitsPerPixel = bitmap.bmBitsPixel;
+ m_Width = bitmap.bmWidth;
+ m_Height = abs(bitmap.bmHeight);
+ hBitmap = (HBITMAP)SelectObject(m_hDC, hBitmap);
+ DeleteObject(hBitmap);
+ } else {
+ m_nBitsPerPixel = ::GetDeviceCaps(m_hDC, BITSPIXEL);
+ m_Width = ::GetDeviceCaps(m_hDC, HORZRES);
+ m_Height = ::GetDeviceCaps(m_hDC, VERTRES);
+ }
+ if (m_DeviceClass != FXDC_DISPLAY) {
+ m_RenderCaps = FXRC_BIT_MASK;
+ } else {
+ m_RenderCaps = FXRC_GET_BITS | FXRC_BIT_MASK;
+ }
+}
+int CGdiDeviceDriver::GetDeviceCaps(int caps_id)
+{
+ switch (caps_id) {
+ case FXDC_DEVICE_CLASS:
+ return m_DeviceClass;
+ case FXDC_PIXEL_WIDTH:
+ return m_Width;
+ case FXDC_PIXEL_HEIGHT:
+ return m_Height;
+ case FXDC_BITS_PIXEL:
+ return m_nBitsPerPixel;
+ case FXDC_RENDER_CAPS:
+ return m_RenderCaps;
+ }
+ return 0;
+}
+FX_LPVOID CGdiDeviceDriver::GetClipRgn()
+{
+ HRGN hClipRgn = CreateRectRgn(0, 0, 1, 1);
+ if (::GetClipRgn(m_hDC, hClipRgn) == 0) {
+ DeleteObject(hClipRgn);
+ hClipRgn = NULL;
+ }
+ return (FX_LPVOID)hClipRgn;
+}
+FX_BOOL CGdiDeviceDriver::GDI_SetDIBits(const CFX_DIBitmap* pBitmap1, const FX_RECT* pSrcRect, int left, int top, void* pIccTransform)
+{
+ if (m_DeviceClass == FXDC_PRINTER) {
+ CFX_DIBitmap* pBitmap = pBitmap1->FlipImage(FALSE, TRUE);
+ if (pBitmap == NULL) {
+ return FALSE;
+ }
+ if ((pBitmap->IsCmykImage() || pIccTransform) &&
+ !pBitmap->ConvertFormat(FXDIB_Rgb, pIccTransform)) {
+ return FALSE;
+ }
+ int width = pSrcRect->Width(), height = pSrcRect->Height();
+ int pitch = pBitmap->GetPitch();
+ LPBYTE pBuffer = pBitmap->GetBuffer();
+ CFX_ByteString info = CFX_WindowsDIB::GetBitmapInfo(pBitmap);
+ ((BITMAPINFOHEADER*)(FX_LPCSTR)info)->biHeight *= -1;
+ FX_RECT dst_rect(0, 0, width, height);
+ dst_rect.Intersect(0, 0, pBitmap->GetWidth(), pBitmap->GetHeight());
+ int dst_width = dst_rect.Width();
+ int dst_height = dst_rect.Height();
+ ::StretchDIBits(m_hDC, left, top, dst_width, dst_height,
+ 0, 0, dst_width, dst_height, pBuffer, (BITMAPINFO*)(FX_LPCSTR)info, DIB_RGB_COLORS, SRCCOPY);
+ delete pBitmap;
+ } else {
+ CFX_DIBitmap* pBitmap = (CFX_DIBitmap*)pBitmap1;
+ if ((pBitmap->IsCmykImage() || pIccTransform) &&
+ (pBitmap = pBitmap->CloneConvert(FXDIB_Rgb, NULL, pIccTransform)) == NULL) {
+ return FALSE;
+ }
+ int width = pSrcRect->Width(), height = pSrcRect->Height();
+ int pitch = pBitmap->GetPitch();
+ LPBYTE pBuffer = pBitmap->GetBuffer();
+ CFX_ByteString info = CFX_WindowsDIB::GetBitmapInfo(pBitmap);
+ ::SetDIBitsToDevice(m_hDC, left, top, width, height, pSrcRect->left, pBitmap->GetHeight() - pSrcRect->bottom,
+ 0, pBitmap->GetHeight(), pBuffer, (BITMAPINFO*)(FX_LPCSTR)info, DIB_RGB_COLORS);
+ if (pBitmap != pBitmap1) {
+ delete pBitmap;
+ }
+ }
+ return TRUE;
+}
+FX_BOOL CGdiDeviceDriver::GDI_StretchDIBits(const CFX_DIBitmap* pBitmap1, int dest_left, int dest_top,
+ int dest_width, int dest_height, FX_DWORD flags, void* pIccTransform)
+{
+ CFX_DIBitmap* pBitmap = (CFX_DIBitmap*)pBitmap1;
+ if (pBitmap == NULL) {
+ return FALSE;
+ }
+ if ((pBitmap->IsCmykImage() || pIccTransform) &&
+ !pBitmap->ConvertFormat(FXDIB_Rgb, pIccTransform)) {
+ return FALSE;
+ }
+ CFX_ByteString info = CFX_WindowsDIB::GetBitmapInfo(pBitmap);
+ if (abs(dest_width) * abs(dest_height) < pBitmap1->GetWidth() * pBitmap1->GetHeight() * 4 ||
+ (flags & FXDIB_INTERPOL) || (flags & FXDIB_BICUBIC_INTERPOL)) {
+ SetStretchBltMode(m_hDC, HALFTONE);
+ } else {
+ SetStretchBltMode(m_hDC, COLORONCOLOR);
+ }
+ CFX_DIBitmap* pToStrechBitmap = pBitmap;
+ bool del = false;
+ if (m_DeviceClass == FXDC_PRINTER && (pBitmap->GetWidth() * pBitmap->GetHeight() > abs(dest_width) * abs(dest_height))) {
+ pToStrechBitmap = pBitmap->StretchTo(dest_width, dest_height);
+ del = true;
+ }
+ CFX_ByteString toStrechBitmapInfo = CFX_WindowsDIB::GetBitmapInfo(pToStrechBitmap);
+ ::StretchDIBits(m_hDC, dest_left, dest_top, dest_width, dest_height,
+ 0, 0, pToStrechBitmap->GetWidth(), pToStrechBitmap->GetHeight(), pToStrechBitmap->GetBuffer(),
+ (BITMAPINFO*)(FX_LPCSTR)toStrechBitmapInfo, DIB_RGB_COLORS, SRCCOPY);
+ if (del) {
+ delete pToStrechBitmap;
+ }
+ return TRUE;
+}
+FX_BOOL CGdiDeviceDriver::GDI_StretchBitMask(const CFX_DIBitmap* pBitmap1, int dest_left, int dest_top,
+ int dest_width, int dest_height, FX_DWORD bitmap_color, FX_DWORD flags,
+ int alpha_flag, void* pIccTransform)
+{
+ CFX_DIBitmap* pBitmap = (CFX_DIBitmap*)pBitmap1;
+ if (pBitmap == NULL) {
+ return FALSE;
+ }
+ _Color2Argb(bitmap_color, bitmap_color, alpha_flag | (1 << 24), pIccTransform);
+ int width = pBitmap->GetWidth(), height = pBitmap->GetHeight();
+ struct {
+ BITMAPINFOHEADER bmiHeader;
+ FX_DWORD bmiColors[2];
+ } bmi;
+ FXSYS_memset32(&bmi.bmiHeader, 0, sizeof (BITMAPINFOHEADER));
+ bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
+ bmi.bmiHeader.biBitCount = 1;
+ bmi.bmiHeader.biCompression = BI_RGB;
+ bmi.bmiHeader.biHeight = -height;
+ bmi.bmiHeader.biPlanes = 1;
+ bmi.bmiHeader.biWidth = width;
+ if (m_nBitsPerPixel != 1) {
+ SetStretchBltMode(m_hDC, HALFTONE);
+ }
+ bmi.bmiColors[0] = 0xffffff;
+ bmi.bmiColors[1] = 0;
+ ::StretchDIBits(m_hDC, dest_left, dest_top, dest_width, dest_height,
+ 0, 0, width, height, pBitmap->GetBuffer(), (BITMAPINFO*)&bmi, DIB_RGB_COLORS, SRCAND);
+ return TRUE;
+}
+BOOL CGdiDeviceDriver::GetClipBox(FX_RECT* pRect)
+{
+ return ::GetClipBox(m_hDC, (RECT*)pRect);
+}
+FX_BOOL CGdiDeviceDriver::SetClipRgn(FX_LPVOID hRgn)
+{
+ ::SelectClipRgn(m_hDC, (HRGN)hRgn);
+ return TRUE;
+}
+static HPEN _CreatePen(const CFX_GraphStateData* pGraphState, const CFX_AffineMatrix* pMatrix, FX_DWORD argb)
+{
+ FX_FLOAT width;
+ FX_FLOAT scale = 1.f;
+ if (pMatrix)
+ scale = FXSYS_fabs(pMatrix->a) > FXSYS_fabs(pMatrix->b) ?
+ FXSYS_fabs(pMatrix->a) : FXSYS_fabs(pMatrix->b);
+ if (pGraphState) {
+ width = scale * pGraphState->m_LineWidth;
+ } else {
+ width = 1.0f;
+ }
+ FX_DWORD PenStyle = PS_GEOMETRIC;
+ if (width < 1) {
+ width = 1;
+ }
+ if(pGraphState->m_DashCount) {
+ PenStyle |= PS_USERSTYLE;
+ } else {
+ PenStyle |= PS_SOLID;
+ }
+ switch(pGraphState->m_LineCap) {
+ case 0:
+ PenStyle |= PS_ENDCAP_FLAT;
+ break;
+ case 1:
+ PenStyle |= PS_ENDCAP_ROUND;
+ break;
+ case 2:
+ PenStyle |= PS_ENDCAP_SQUARE;
+ break;
+ }
+ switch(pGraphState->m_LineJoin) {
+ case 0:
+ PenStyle |= PS_JOIN_MITER;
+ break;
+ case 1:
+ PenStyle |= PS_JOIN_ROUND;
+ break;
+ case 2:
+ PenStyle |= PS_JOIN_BEVEL;
+ break;
+ }
+ int a;
+ FX_COLORREF rgb;
+ ArgbDecode(argb, a, rgb);
+ LOGBRUSH lb;
+ lb.lbColor = rgb;
+ lb.lbStyle = BS_SOLID;
+ lb.lbHatch = 0;
+ FX_DWORD* pDash = NULL;
+ if (pGraphState->m_DashCount) {
+ pDash = FX_Alloc(FX_DWORD, pGraphState->m_DashCount);
+ if (!pDash) {
+ return NULL;
+ }
+ for (int i = 0; i < pGraphState->m_DashCount; i ++) {
+ pDash[i] = FXSYS_round(pMatrix ? pMatrix->TransformDistance(pGraphState->m_DashArray[i]) : pGraphState->m_DashArray[i]);
+ if (pDash[i] < 1) {
+ pDash[i] = 1;
+ }
+ }
+ }
+ HPEN hPen = ExtCreatePen(PenStyle, (DWORD)FXSYS_ceil(width), &lb, pGraphState->m_DashCount, (const DWORD*)pDash);
+ if (pDash) {
+ FX_Free(pDash);
+ }
+ return hPen;
+}
+static HBRUSH _CreateBrush(FX_DWORD argb)
+{
+ int a;
+ FX_COLORREF rgb;
+ ArgbDecode(argb, a, rgb);
+ return CreateSolidBrush(rgb);
+}
+static void _SetPathToDC(HDC hDC, const CFX_PathData* pPathData, const CFX_AffineMatrix* pMatrix)
+{
+ BeginPath(hDC);
+ int nPoints = pPathData->GetPointCount();
+ FX_PATHPOINT* pPoints = pPathData->GetPoints();
+ for(int i = 0; i < nPoints; i++) {
+ FX_FLOAT posx = pPoints[i].m_PointX, posy = pPoints[i].m_PointY;
+ if (pMatrix) {
+ pMatrix->Transform(posx, posy);
+ }
+ int screen_x = FXSYS_round(posx), screen_y = FXSYS_round(posy);
+ int point_type = pPoints[i].m_Flag & FXPT_TYPE;
+ if(point_type == PT_MOVETO) {
+ MoveToEx(hDC, screen_x, screen_y, NULL);
+ } else if(point_type == PT_LINETO) {
+ if (pPoints[i].m_PointY == pPoints[i - 1].m_PointY && pPoints[i].m_PointX == pPoints[i - 1].m_PointX) {
+ screen_x ++;
+ }
+ LineTo(hDC, screen_x, screen_y);
+ } else if(point_type == PT_BEZIERTO) {
+ POINT lppt[3];
+ lppt[0].x = screen_x;
+ lppt[0].y = screen_y;
+ posx = pPoints[i + 1].m_PointX;
+ posy = pPoints[i + 1].m_PointY;
+ if (pMatrix) {
+ pMatrix->Transform(posx, posy);
+ }
+ lppt[1].x = FXSYS_round(posx);
+ lppt[1].y = FXSYS_round(posy);
+ posx = pPoints[i + 2].m_PointX;
+ posy = pPoints[i + 2].m_PointY;
+ if (pMatrix) {
+ pMatrix->Transform(posx, posy);
+ }
+ lppt[2].x = FXSYS_round(posx);
+ lppt[2].y = FXSYS_round(posy);
+ PolyBezierTo(hDC, lppt, 3);
+ i += 2;
+ }
+ if (pPoints[i].m_Flag & PT_CLOSEFIGURE) {
+ CloseFigure(hDC);
+ }
+ }
+ EndPath(hDC);
+}
+void CGdiDeviceDriver::DrawLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2)
+{
+ int flag1 = (x1 < 0) | ((x1 > m_Width) << 1) | ((y1 < 0) << 2) | ((y1 > m_Height) << 3);
+ int flag2 = (x2 < 0) | ((x2 > m_Width) << 1) | ((y2 < 0) << 2) | ((y2 > m_Height) << 3);
+ if (flag1 & flag2) {
+ return;
+ }
+ if (flag1 || flag2) {
+ agg::rect_base<FX_FLOAT> rect(0.0f, 0.0f, (FX_FLOAT)(m_Width), (FX_FLOAT)(m_Height));
+ FX_FLOAT x[2], y[2];
+ int np = agg::clip_liang_barsky<FX_FLOAT>(x1, y1, x2, y2, rect, x, y);
+ if (np == 0) {
+ return;
+ }
+ if (np == 1) {
+ x2 = x[0];
+ y2 = y[0];
+ } else {
+ x1 = x[0];
+ y1 = y[0];
+ x2 = x[np - 1];
+ y2 = y[np - 1];
+ }
+ }
+ MoveToEx(m_hDC, FXSYS_round(x1), FXSYS_round(y1), NULL);
+ LineTo(m_hDC, FXSYS_round(x2), FXSYS_round(y2));
+}
+static FX_BOOL _MatrixNoScaled(const CFX_AffineMatrix* pMatrix)
+{
+ return pMatrix->GetA() == 1.0f && pMatrix->GetB() == 0 && pMatrix->GetC() == 0 && pMatrix->GetD() == 1.0f;
+}
+FX_BOOL CGdiDeviceDriver::DrawPath(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pMatrix,
+ const CFX_GraphStateData* pGraphState,
+ FX_DWORD fill_color,
+ FX_DWORD stroke_color,
+ int fill_mode,
+ int alpha_flag,
+ void* pIccTransform,
+ int blend_type
+ )
+{
+ if (blend_type != FXDIB_BLEND_NORMAL) {
+ return FALSE;
+ }
+ _Color2Argb(fill_color, fill_color, alpha_flag | (1 << 24), pIccTransform);
+ _Color2Argb(stroke_color, stroke_color, alpha_flag, pIccTransform);
+ CWin32Platform* pPlatform = (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData();
+ if ((pGraphState == NULL || stroke_color == 0) && !pPlatform->m_GdiplusExt.IsAvailable()) {
+ CFX_FloatRect bbox_f = pPathData->GetBoundingBox();
+ if (pMatrix) {
+ bbox_f.Transform(pMatrix);
+ }
+ FX_RECT bbox = bbox_f.GetInnerRect();
+ if (bbox.Width() <= 0) {
+ return DrawCosmeticLine((FX_FLOAT)(bbox.left), (FX_FLOAT)(bbox.top), (FX_FLOAT)(bbox.left), (FX_FLOAT)(bbox.bottom + 1), fill_color,
+ alpha_flag, pIccTransform, FXDIB_BLEND_NORMAL);
+ } else if (bbox.Height() <= 0) {
+ return DrawCosmeticLine((FX_FLOAT)(bbox.left), (FX_FLOAT)(bbox.top), (FX_FLOAT)(bbox.right + 1), (FX_FLOAT)(bbox.top), fill_color,
+ alpha_flag, pIccTransform, FXDIB_BLEND_NORMAL);
+ }
+ }
+ int fill_alpha = FXARGB_A(fill_color);
+ int stroke_alpha = FXARGB_A(stroke_color);
+ FX_BOOL bDrawAlpha = (fill_alpha > 0 && fill_alpha < 255) || (stroke_alpha > 0 && stroke_alpha < 255 && pGraphState);
+ if (!pPlatform->m_GdiplusExt.IsAvailable() && bDrawAlpha) {
+ return FALSE;
+ }
+ if (pPlatform->m_GdiplusExt.IsAvailable()) {
+ if (bDrawAlpha || ((m_DeviceClass != FXDC_PRINTER && !(fill_mode & FXFILL_FULLCOVER)) || pGraphState && pGraphState->m_DashCount)) {
+ if ( !((NULL == pMatrix || _MatrixNoScaled(pMatrix)) &&
+ pGraphState && pGraphState->m_LineWidth == 1.f &&
+ (pPathData->GetPointCount() == 5 || pPathData->GetPointCount() == 4) &&
+ pPathData->IsRect()) ) {
+ if (pPlatform->m_GdiplusExt.DrawPath(m_hDC, pPathData, pMatrix, pGraphState, fill_color, stroke_color, fill_mode)) {
+ return TRUE;
+ }
+ }
+ }
+ }
+ int old_fill_mode = fill_mode;
+ fill_mode &= 3;
+ HPEN hPen = NULL;
+ HBRUSH hBrush = NULL;
+ if (pGraphState && stroke_alpha) {
+ SetMiterLimit(m_hDC, pGraphState->m_MiterLimit, NULL);
+ hPen = _CreatePen(pGraphState, pMatrix, stroke_color);
+ hPen = (HPEN)SelectObject(m_hDC, hPen);
+ }
+ if (fill_mode && fill_alpha) {
+ SetPolyFillMode(m_hDC, fill_mode);
+ hBrush = _CreateBrush(fill_color);
+ hBrush = (HBRUSH)SelectObject(m_hDC, hBrush);
+ }
+ if (pPathData->GetPointCount() == 2 && pGraphState && pGraphState->m_DashCount) {
+ FX_FLOAT x1 = pPathData->GetPointX(0), y1 = pPathData->GetPointY(0);
+ if (pMatrix) {
+ pMatrix->Transform(x1, y1);
+ }
+ FX_FLOAT x2 = pPathData->GetPointX(1), y2 = pPathData->GetPointY(1);
+ if (pMatrix) {
+ pMatrix->Transform(x2, y2);
+ }
+ DrawLine(x1, y1, x2, y2);
+ } else {
+ _SetPathToDC(m_hDC, pPathData, pMatrix);
+ if (pGraphState && stroke_alpha) {
+ if (fill_mode && fill_alpha) {
+ if (old_fill_mode & FX_FILL_TEXT_MODE) {
+ StrokeAndFillPath(m_hDC);
+ } else {
+ FillPath(m_hDC);
+ _SetPathToDC(m_hDC, pPathData, pMatrix);
+ StrokePath(m_hDC);
+ }
+ } else {
+ StrokePath(m_hDC);
+ }
+ } else if (fill_mode && fill_alpha) {
+ FillPath(m_hDC);
+ }
+ }
+ if (hPen) {
+ hPen = (HPEN)SelectObject(m_hDC, hPen);
+ DeleteObject(hPen);
+ }
+ if (hBrush) {
+ hBrush = (HBRUSH)SelectObject(m_hDC, hBrush);
+ DeleteObject(hBrush);
+ }
+ return TRUE;
+}
+FX_BOOL CGdiDeviceDriver::FillRect(const FX_RECT* pRect, FX_DWORD fill_color, int alpha_flag, void* pIccTransform, int blend_type)
+{
+ if (blend_type != FXDIB_BLEND_NORMAL) {
+ return FALSE;
+ }
+ _Color2Argb(fill_color, fill_color, alpha_flag | (1 << 24), pIccTransform);
+ int alpha;
+ FX_COLORREF rgb;
+ ArgbDecode(fill_color, alpha, rgb);
+ if (alpha == 0) {
+ return TRUE;
+ }
+ if (alpha < 255) {
+ return FALSE;
+ }
+ HBRUSH hBrush = CreateSolidBrush(rgb);
+ ::FillRect(m_hDC, (RECT*)pRect, hBrush);
+ DeleteObject(hBrush);
+ return TRUE;
+}
+FX_BOOL CGdiDeviceDriver::SetClip_PathFill(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pMatrix,
+ int fill_mode
+ )
+{
+ if (pPathData->GetPointCount() == 5) {
+ CFX_FloatRect rectf;
+ if (pPathData->IsRect(pMatrix, &rectf)) {
+ FX_RECT rect = rectf.GetOutterRect();
+ IntersectClipRect(m_hDC, rect.left, rect.top, rect.right, rect.bottom);
+ return TRUE;
+ }
+ }
+ _SetPathToDC(m_hDC, pPathData, pMatrix);
+ SetPolyFillMode(m_hDC, fill_mode & 3);
+ SelectClipPath(m_hDC, RGN_AND);
+ return TRUE;
+}
+FX_BOOL CGdiDeviceDriver::SetClip_PathStroke(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pMatrix,
+ const CFX_GraphStateData* pGraphState
+ )
+{
+ HPEN hPen = _CreatePen(pGraphState, pMatrix, 0xff000000);
+ hPen = (HPEN)SelectObject(m_hDC, hPen);
+ _SetPathToDC(m_hDC, pPathData, pMatrix);
+ WidenPath(m_hDC);
+ SetPolyFillMode(m_hDC, WINDING);
+ FX_BOOL ret = SelectClipPath(m_hDC, RGN_AND);
+ hPen = (HPEN)SelectObject(m_hDC, hPen);
+ DeleteObject(hPen);
+ return ret;
+}
+FX_BOOL CGdiDeviceDriver::DrawCosmeticLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2, FX_DWORD color,
+ int alpha_flag, void* pIccTransform, int blend_type)
+{
+ if (blend_type != FXDIB_BLEND_NORMAL) {
+ return FALSE;
+ }
+ _Color2Argb(color, color, alpha_flag | (1 << 24), pIccTransform);
+ int a;
+ FX_COLORREF rgb;
+ ArgbDecode(color, a, rgb);
+ if (a == 0) {
+ return TRUE;
+ }
+ HPEN hPen = CreatePen(PS_SOLID, 1, rgb);
+ hPen = (HPEN)SelectObject(m_hDC, hPen);
+ MoveToEx(m_hDC, FXSYS_round(x1), FXSYS_round(y1), NULL);
+ LineTo(m_hDC, FXSYS_round(x2), FXSYS_round(y2));
+ hPen = (HPEN)SelectObject(m_hDC, hPen);
+ DeleteObject(hPen);
+ return TRUE;
+}
+FX_BOOL CGdiDeviceDriver::DeleteDeviceRgn(FX_LPVOID pRgn)
+{
+ DeleteObject((HGDIOBJ)pRgn);
+ return TRUE;
+}
+CGdiDisplayDriver::CGdiDisplayDriver(HDC hDC) : CGdiDeviceDriver(hDC, FXDC_DISPLAY)
+{
+ CWin32Platform* pPlatform = (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData();
+ if (pPlatform->m_GdiplusExt.IsAvailable()) {
+ m_RenderCaps |= FXRC_ALPHA_PATH | FXRC_ALPHA_IMAGE;
+ }
+}
+FX_BOOL CGdiDisplayDriver::GetDIBits(CFX_DIBitmap* pBitmap, int left, int top, void* pIccTransform, FX_BOOL bDEdge)
+{
+ FX_BOOL ret = FALSE;
+ int width = pBitmap->GetWidth();
+ int height = pBitmap->GetHeight();
+ HBITMAP hbmp = CreateCompatibleBitmap(m_hDC, width, height);
+ HDC hDCMemory = CreateCompatibleDC(m_hDC);
+ HBITMAP holdbmp = (HBITMAP)SelectObject(hDCMemory, hbmp);
+ BitBlt(hDCMemory, 0, 0, width, height, m_hDC, left, top, SRCCOPY);
+ SelectObject(hDCMemory, holdbmp);
+ BITMAPINFO bmi;
+ FXSYS_memset32(&bmi, 0, sizeof bmi);
+ bmi.bmiHeader.biSize = sizeof bmi.bmiHeader;
+ bmi.bmiHeader.biBitCount = pBitmap->GetBPP();
+ bmi.bmiHeader.biHeight = -height;
+ bmi.bmiHeader.biPlanes = 1;
+ bmi.bmiHeader.biWidth = width;
+ if (!CFX_GEModule::Get()->GetCodecModule() || !CFX_GEModule::Get()->GetCodecModule()->GetIccModule()) {
+ pIccTransform = NULL;
+ }
+ if (pBitmap->GetBPP() > 8 && !pBitmap->IsCmykImage() && pIccTransform == NULL) {
+ ret = ::GetDIBits(hDCMemory, hbmp, 0, height, pBitmap->GetBuffer(), &bmi, DIB_RGB_COLORS) == height;
+ } else {
+ CFX_DIBitmap bitmap;
+ if (bitmap.Create(width, height, FXDIB_Rgb)) {
+ bmi.bmiHeader.biBitCount = 24;
+ ::GetDIBits(hDCMemory, hbmp, 0, height, bitmap.GetBuffer(), &bmi, DIB_RGB_COLORS);
+ ret = pBitmap->TransferBitmap(0, 0, width, height, &bitmap, 0, 0, pIccTransform);
+ } else {
+ ret = FALSE;
+ }
+ }
+#ifndef _FPDFAPI_MINI_
+ if (pBitmap->HasAlpha() && ret) {
+ pBitmap->LoadChannel(FXDIB_Alpha, 0xff);
+ }
+#endif
+ DeleteObject(hbmp);
+ DeleteObject(hDCMemory);
+ return ret;
+}
+FX_BOOL CGdiDisplayDriver::SetDIBits(const CFX_DIBSource* pSource, FX_DWORD color, const FX_RECT* pSrcRect, int left, int top, int blend_type,
+ int alpha_flag, void* pIccTransform)
+{
+ ASSERT(blend_type == FXDIB_BLEND_NORMAL);
+ if (pSource->IsAlphaMask()) {
+ int width = pSource->GetWidth(), height = pSource->GetHeight();
+ int alpha = FXGETFLAG_COLORTYPE(alpha_flag) ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXARGB_A(color);
+ FX_BOOL bGDI = pSource->GetBPP() == 1 && alpha == 255;
+ if (!bGDI) {
+ CFX_DIBitmap background;
+ if (!background.Create(width, height, FXDIB_Rgb32) ||
+ !GetDIBits(&background, left, top, NULL) ||
+ !background.CompositeMask(0, 0, width, height, pSource, color, 0, 0, FXDIB_BLEND_NORMAL, NULL, FALSE, alpha_flag, pIccTransform)) {
+ return FALSE;
+ }
+ FX_RECT src_rect(0, 0, width, height);
+ return SetDIBits(&background, 0, &src_rect, left, top, FXDIB_BLEND_NORMAL, 0, NULL);
+ }
+ FX_RECT clip_rect(left, top, left + pSrcRect->Width(), top + pSrcRect->Height());
+ return StretchDIBits(pSource, color, left - pSrcRect->left, top - pSrcRect->top, width, height,
+ &clip_rect, 0, alpha_flag, pIccTransform, FXDIB_BLEND_NORMAL);
+ } else {
+ int width = pSrcRect->Width(), height = pSrcRect->Height();
+ if (pSource->HasAlpha()) {
+ CFX_DIBitmap bitmap;
+ if (!bitmap.Create(width, height, FXDIB_Rgb) ||
+ !GetDIBits(&bitmap, left, top, NULL) ||
+ !bitmap.CompositeBitmap(0, 0, width, height, pSource, pSrcRect->left, pSrcRect->top, FXDIB_BLEND_NORMAL, NULL, FALSE, pIccTransform)) {
+ return FALSE;
+ }
+ FX_RECT src_rect(0, 0, width, height);
+ return SetDIBits(&bitmap, 0, &src_rect, left, top, FXDIB_BLEND_NORMAL, 0, NULL);
+ }
+ CFX_DIBExtractor temp(pSource);
+ CFX_DIBitmap* pBitmap = temp;
+ if (pBitmap) {
+ return GDI_SetDIBits(pBitmap, pSrcRect, left, top, pIccTransform);
+ }
+ }
+ return FALSE;
+}
+FX_BOOL CGdiDisplayDriver::UseFoxitStretchEngine(const CFX_DIBSource* pSource, FX_DWORD color, int dest_left, int dest_top,
+ int dest_width, int dest_height, const FX_RECT* pClipRect, int render_flags,
+ int alpha_flag, void* pIccTransform, int blend_type)
+{
+ FX_RECT bitmap_clip = *pClipRect;
+ if (dest_width < 0) {
+ dest_left += dest_width;
+ }
+ if (dest_height < 0) {
+ dest_top += dest_height;
+ }
+ bitmap_clip.Offset(-dest_left, -dest_top);
+ CFX_DIBitmap* pStretched = pSource->StretchTo(dest_width, dest_height, render_flags, &bitmap_clip);
+ if (pStretched == NULL) {
+ return TRUE;
+ }
+ FX_RECT src_rect(0, 0, pStretched->GetWidth(), pStretched->GetHeight());
+ FX_BOOL ret = SetDIBits(pStretched, color, &src_rect, pClipRect->left, pClipRect->top, FXDIB_BLEND_NORMAL, alpha_flag, pIccTransform);
+ delete pStretched;
+ return ret;
+}
+FX_BOOL CGdiDisplayDriver::StretchDIBits(const CFX_DIBSource* pSource, FX_DWORD color, int dest_left, int dest_top,
+ int dest_width, int dest_height, const FX_RECT* pClipRect, FX_DWORD flags,
+ int alpha_flag, void* pIccTransform, int blend_type)
+{
+ ASSERT(pSource != NULL && pClipRect != NULL);
+ if (flags || dest_width > 10000 || dest_width < -10000 || dest_height > 10000 || dest_height < -10000)
+ return UseFoxitStretchEngine(pSource, color, dest_left, dest_top, dest_width, dest_height,
+ pClipRect, flags, alpha_flag, pIccTransform, blend_type);
+ if (pSource->IsAlphaMask()) {
+ FX_RECT image_rect;
+ image_rect.left = dest_width > 0 ? dest_left : dest_left + dest_width;
+ image_rect.right = dest_width > 0 ? dest_left + dest_width : dest_left;
+ image_rect.top = dest_height > 0 ? dest_top : dest_top + dest_height;
+ image_rect.bottom = dest_height > 0 ? dest_top + dest_height : dest_top;
+ FX_RECT clip_rect = image_rect;
+ clip_rect.Intersect(*pClipRect);
+ clip_rect.Offset(-image_rect.left, -image_rect.top);
+ int clip_width = clip_rect.Width(), clip_height = clip_rect.Height();
+ CFX_DIBitmap* pStretched = pSource->StretchTo(dest_width, dest_height, flags, &clip_rect);
+ if (pStretched == NULL) {
+ return TRUE;
+ }
+ CFX_DIBitmap background;
+ if (!background.Create(clip_width, clip_height, FXDIB_Rgb32) ||
+ !GetDIBits(&background, image_rect.left + clip_rect.left, image_rect.top + clip_rect.top, NULL) ||
+ !background.CompositeMask(0, 0, clip_width, clip_height, pStretched, color, 0, 0, FXDIB_BLEND_NORMAL, NULL, FALSE, alpha_flag, pIccTransform)) {
+ delete pStretched;
+ return FALSE;
+ }
+ FX_RECT src_rect(0, 0, clip_width, clip_height);
+ FX_BOOL ret = SetDIBits(&background, 0, &src_rect, image_rect.left + clip_rect.left, image_rect.top + clip_rect.top, FXDIB_BLEND_NORMAL, 0, NULL);
+ delete pStretched;
+ return ret;
+ } else {
+ if (pSource->HasAlpha()) {
+ CWin32Platform* pPlatform = (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData();
+ if (pPlatform->m_GdiplusExt.IsAvailable() && pIccTransform == NULL && !pSource->IsCmykImage()) {
+ CFX_DIBExtractor temp(pSource);
+ CFX_DIBitmap* pBitmap = temp;
+ if (pBitmap == NULL) {
+ return FALSE;
+ }
+ return pPlatform->m_GdiplusExt.StretchDIBits(m_hDC, pBitmap, dest_left, dest_top, dest_width, dest_height, pClipRect, flags);
+ }
+ return UseFoxitStretchEngine(pSource, color, dest_left, dest_top, dest_width, dest_height,
+ pClipRect, flags, alpha_flag, pIccTransform, blend_type);
+ }
+ CFX_DIBExtractor temp(pSource);
+ CFX_DIBitmap* pBitmap = temp;
+ if (pBitmap) {
+ return GDI_StretchDIBits(pBitmap, dest_left, dest_top, dest_width, dest_height, flags, pIccTransform);
+ }
+ }
+ return FALSE;
+}
+#define GET_PS_FEATURESETTING 4121
+#define FEATURESETTING_PSLEVEL 2
+int GetPSLevel(HDC hDC)
+{
+ int device_type = ::GetDeviceCaps(hDC, TECHNOLOGY);
+ if (device_type != DT_RASPRINTER) {
+ return 0;
+ }
+ FX_DWORD esc = GET_PS_FEATURESETTING;
+ if (ExtEscape(hDC, QUERYESCSUPPORT, sizeof esc, (char*)&esc, 0, NULL)) {
+ int param = FEATURESETTING_PSLEVEL;
+ if (ExtEscape(hDC, GET_PS_FEATURESETTING, sizeof(int), (char*)&param, sizeof(int), (char*)&param) > 0) {
+ return param;
+ }
+ }
+ esc = POSTSCRIPT_IDENTIFY;
+ if (ExtEscape(hDC, QUERYESCSUPPORT, sizeof esc, (char*)&esc, 0, NULL) == 0) {
+ esc = POSTSCRIPT_DATA;
+ if (ExtEscape(hDC, QUERYESCSUPPORT, sizeof esc, (char*)&esc, 0, NULL)) {
+ return 2;
+ }
+ return 0;
+ }
+ esc = PSIDENT_GDICENTRIC;
+ if (ExtEscape(hDC, POSTSCRIPT_IDENTIFY, sizeof(FX_DWORD), (char*)&esc, 0, NULL) <= 0) {
+ return 2;
+ }
+ esc = GET_PS_FEATURESETTING;
+ if (ExtEscape(hDC, QUERYESCSUPPORT, sizeof esc, (char*)&esc, 0, NULL)) {
+ int param = FEATURESETTING_PSLEVEL;
+ if (ExtEscape(hDC, GET_PS_FEATURESETTING, sizeof(int), (char*)&param, sizeof(int), (char*)&param) > 0) {
+ return param;
+ }
+ }
+ return 2;
+}
+int CFX_WindowsDevice::m_psLevel = 2;
+CFX_WindowsDevice::CFX_WindowsDevice(HDC hDC, FX_BOOL bCmykOutput, FX_BOOL bForcePSOutput, int psLevel)
+{
+ m_bForcePSOutput = bForcePSOutput;
+ m_psLevel = psLevel;
+ if (bForcePSOutput) {
+ IFX_RenderDeviceDriver* pDriver = FX_NEW CPSPrinterDriver;
+ if (!pDriver) {
+ return;
+ }
+ ((CPSPrinterDriver*)pDriver)->Init(hDC, psLevel, bCmykOutput);
+ SetDeviceDriver(pDriver);
+ return;
+ }
+ SetDeviceDriver(CreateDriver(hDC, bCmykOutput));
+}
+HDC CFX_WindowsDevice::GetDC() const
+{
+ IFX_RenderDeviceDriver *pRDD = GetDeviceDriver();
+ if (!pRDD) {
+ return NULL;
+ }
+ return (HDC)pRDD->GetPlatformSurface();
+}
+IFX_RenderDeviceDriver* CFX_WindowsDevice::CreateDriver(HDC hDC, FX_BOOL bCmykOutput)
+{
+ int device_type = ::GetDeviceCaps(hDC, TECHNOLOGY);
+ int obj_type = ::GetObjectType(hDC);
+ int device_class;
+ if (device_type == DT_RASPRINTER || device_type == DT_PLOTTER || obj_type == OBJ_ENHMETADC) {
+ device_class = FXDC_PRINTER;
+ } else {
+ device_class = FXDC_DISPLAY;
+ }
+ return FX_NEW CGdiDisplayDriver(hDC);
+}
+CFX_WinBitmapDevice::CFX_WinBitmapDevice(int width, int height, FXDIB_Format format)
+{
+ BITMAPINFOHEADER bmih;
+ FXSYS_memset32(&bmih, 0, sizeof (BITMAPINFOHEADER));
+ bmih.biSize = sizeof(BITMAPINFOHEADER);
+ bmih.biBitCount = format & 0xff;
+ bmih.biHeight = -height;
+ bmih.biPlanes = 1;
+ bmih.biWidth = width;
+ FX_LPBYTE pBuffer;
+ m_hBitmap = CreateDIBSection(NULL, (BITMAPINFO*)&bmih, DIB_RGB_COLORS, (FX_LPVOID*)&pBuffer, NULL, 0);
+ if (m_hBitmap == NULL) {
+ return;
+ }
+ CFX_DIBitmap* pBitmap = FX_NEW CFX_DIBitmap;
+ if (!pBitmap) {
+ return;
+ }
+ pBitmap->Create(width, height, format, pBuffer);
+ SetBitmap(pBitmap);
+ m_hDC = ::CreateCompatibleDC(NULL);
+ m_hOldBitmap = (HBITMAP)SelectObject(m_hDC, m_hBitmap);
+ IFX_RenderDeviceDriver* pDriver = FX_NEW CGdiDisplayDriver(m_hDC);
+ if (!pDriver) {
+ return;
+ }
+ SetDeviceDriver(pDriver);
+}
+CFX_WinBitmapDevice::~CFX_WinBitmapDevice()
+{
+ if (m_hDC) {
+ SelectObject(m_hDC, m_hOldBitmap);
+ DeleteDC(m_hDC);
+ }
+ if (m_hBitmap) {
+ DeleteObject(m_hBitmap);
+ }
+ delete GetBitmap();
+}
+#endif
diff --git a/core/src/fxge/win32/fx_win32_dib.cpp b/core/src/fxge/win32/fx_win32_dib.cpp
new file mode 100644
index 0000000000..a9cf78eac3
--- /dev/null
+++ b/core/src/fxge/win32/fx_win32_dib.cpp
@@ -0,0 +1,310 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxge/fx_ge.h"
+#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_
+#include <windows.h>
+#include "../../../include/fxge/fx_ge_win32.h"
+#include "win32_int.h"
+CFX_ByteString CFX_WindowsDIB::GetBitmapInfo(const CFX_DIBitmap* pBitmap)
+{
+ CFX_ByteString result;
+ int len = sizeof (BITMAPINFOHEADER);
+ if (pBitmap->GetBPP() == 1 || pBitmap->GetBPP() == 8) {
+ len += sizeof (DWORD) * (int)(1 << pBitmap->GetBPP());
+ }
+ BITMAPINFOHEADER* pbmih = (BITMAPINFOHEADER*)result.GetBuffer(len);
+ FXSYS_memset32(pbmih, 0, sizeof (BITMAPINFOHEADER));
+ pbmih->biSize = sizeof(BITMAPINFOHEADER);
+ pbmih->biBitCount = pBitmap->GetBPP();
+ pbmih->biCompression = BI_RGB;
+ pbmih->biHeight = -(int)pBitmap->GetHeight();
+ pbmih->biPlanes = 1;
+ pbmih->biWidth = pBitmap->GetWidth();
+ if (pBitmap->GetBPP() == 8) {
+ FX_DWORD* pPalette = (FX_DWORD*)(pbmih + 1);
+ if (pBitmap->GetPalette() == NULL) {
+ for (int i = 0; i < 256; i ++) {
+ pPalette[i] = i * 0x010101;
+ }
+ } else {
+ for (int i = 0; i < 256; i ++) {
+ pPalette[i] = pBitmap->GetPalette()[i];
+ }
+ }
+ }
+ if (pBitmap->GetBPP() == 1) {
+ FX_DWORD* pPalette = (FX_DWORD*)(pbmih + 1);
+ if (pBitmap->GetPalette() == NULL) {
+ pPalette[0] = 0;
+ pPalette[1] = 0xffffff;
+ } else {
+ pPalette[0] = pBitmap->GetPalette()[0];
+ pPalette[1] = pBitmap->GetPalette()[1];
+ }
+ }
+ result.ReleaseBuffer(len);
+ return result;
+}
+CFX_DIBitmap* _FX_WindowsDIB_LoadFromBuf(BITMAPINFO* pbmi, LPVOID pData, FX_BOOL bAlpha)
+{
+ int width = pbmi->bmiHeader.biWidth;
+ int height = pbmi->bmiHeader.biHeight;
+ BOOL bBottomUp = TRUE;
+ if (height < 0) {
+ height = -height;
+ bBottomUp = FALSE;
+ }
+ int pitch = (width * pbmi->bmiHeader.biBitCount + 31) / 32 * 4;
+ CFX_DIBitmap* pBitmap = FX_NEW CFX_DIBitmap;
+ if (!pBitmap) {
+ return NULL;
+ }
+ FXDIB_Format format = bAlpha ? (FXDIB_Format)(pbmi->bmiHeader.biBitCount + 0x200) : (FXDIB_Format)pbmi->bmiHeader.biBitCount;
+ FX_BOOL ret = pBitmap->Create(width, height, format);
+ if (!ret) {
+ delete pBitmap;
+ return NULL;
+ }
+ FXSYS_memcpy32(pBitmap->GetBuffer(), pData, pitch * height);
+ if (bBottomUp) {
+ FX_LPBYTE temp_buf = FX_Alloc(FX_BYTE, pitch);
+ if (!temp_buf) {
+ if (pBitmap) {
+ delete pBitmap;
+ }
+ return NULL;
+ }
+ int top = 0, bottom = height - 1;
+ while (top < bottom) {
+ FXSYS_memcpy32(temp_buf, pBitmap->GetBuffer() + top * pitch, pitch);
+ FXSYS_memcpy32(pBitmap->GetBuffer() + top * pitch, pBitmap->GetBuffer() + bottom * pitch, pitch);
+ FXSYS_memcpy32(pBitmap->GetBuffer() + bottom * pitch, temp_buf, pitch);
+ top ++;
+ bottom --;
+ }
+ FX_Free(temp_buf);
+ temp_buf = NULL;
+ }
+ if (pbmi->bmiHeader.biBitCount == 1) {
+ for (int i = 0; i < 2; i ++) {
+ pBitmap->SetPaletteEntry(i, ((FX_DWORD*)pbmi->bmiColors)[i] | 0xff000000);
+ }
+ } else if (pbmi->bmiHeader.biBitCount == 8) {
+ for (int i = 0; i < 256; i ++) {
+ pBitmap->SetPaletteEntry(i, ((FX_DWORD*)pbmi->bmiColors)[i] | 0xff000000);
+ }
+ }
+ return pBitmap;
+}
+CFX_DIBitmap* CFX_WindowsDIB::LoadFromBuf(BITMAPINFO* pbmi, LPVOID pData)
+{
+ return _FX_WindowsDIB_LoadFromBuf(pbmi, pData, FALSE);
+}
+HBITMAP CFX_WindowsDIB::GetDDBitmap(const CFX_DIBitmap* pBitmap, HDC hDC)
+{
+ CFX_ByteString info = GetBitmapInfo(pBitmap);
+ HBITMAP hBitmap = NULL;
+ hBitmap = CreateDIBitmap(hDC, (BITMAPINFOHEADER*)(FX_LPCSTR)info, CBM_INIT,
+ pBitmap->GetBuffer(), (BITMAPINFO*)(FX_LPCSTR)info, DIB_RGB_COLORS);
+ return hBitmap;
+}
+void GetBitmapSize(HBITMAP hBitmap, int& w, int& h)
+{
+ BITMAP bmp;
+ GetObject(hBitmap, sizeof bmp, &bmp);
+ w = bmp.bmWidth;
+ h = bmp.bmHeight;
+}
+CFX_DIBitmap* CFX_WindowsDIB::LoadFromFile(FX_LPCWSTR filename)
+{
+ CWin32Platform* pPlatform = (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData();
+ if (pPlatform->m_GdiplusExt.IsAvailable()) {
+ WINDIB_Open_Args_ args;
+ args.flags = WINDIB_OPEN_PATHNAME;
+ args.path_name = filename;
+ return pPlatform->m_GdiplusExt.LoadDIBitmap(args);
+ }
+ HBITMAP hBitmap = (HBITMAP)LoadImageW(NULL, (wchar_t*)filename, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
+ if (hBitmap == NULL) {
+ return NULL;
+ }
+ HDC hDC = CreateCompatibleDC(NULL);
+ int width, height;
+ GetBitmapSize(hBitmap, width, height);
+ CFX_DIBitmap* pDIBitmap = FX_NEW CFX_DIBitmap;
+ if (!pDIBitmap) {
+ DeleteDC(hDC);
+ return NULL;
+ }
+ if (!pDIBitmap->Create(width, height, FXDIB_Rgb)) {
+ delete pDIBitmap;
+ DeleteDC(hDC);
+ return NULL;
+ }
+ CFX_ByteString info = GetBitmapInfo(pDIBitmap);
+ int ret = GetDIBits(hDC, hBitmap, 0, height, pDIBitmap->GetBuffer(), (BITMAPINFO*)(FX_LPCSTR)info, DIB_RGB_COLORS);
+ if (!ret) {
+ if (pDIBitmap) {
+ delete pDIBitmap;
+ }
+ pDIBitmap = NULL;
+ }
+ DeleteDC(hDC);
+ return pDIBitmap;
+}
+CFX_DIBitmap* CFX_WindowsDIB::LoadDIBitmap(WINDIB_Open_Args_ args)
+{
+ CWin32Platform* pPlatform = (CWin32Platform*)CFX_GEModule::Get()->GetPlatformData();
+ if (pPlatform->m_GdiplusExt.IsAvailable()) {
+ return pPlatform->m_GdiplusExt.LoadDIBitmap(args);
+ } else if (args.flags == WINDIB_OPEN_MEMORY) {
+ return NULL;
+ }
+ HBITMAP hBitmap = (HBITMAP)LoadImageW(NULL, (wchar_t*)args.path_name, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
+ if (hBitmap == NULL) {
+ return NULL;
+ }
+ HDC hDC = CreateCompatibleDC(NULL);
+ int width, height;
+ GetBitmapSize(hBitmap, width, height);
+ CFX_DIBitmap* pDIBitmap = FX_NEW CFX_DIBitmap;
+ if (!pDIBitmap) {
+ DeleteDC(hDC);
+ return NULL;
+ }
+ if (!pDIBitmap->Create(width, height, FXDIB_Rgb)) {
+ delete pDIBitmap;
+ DeleteDC(hDC);
+ return NULL;
+ }
+ CFX_ByteString info = GetBitmapInfo(pDIBitmap);
+ int ret = GetDIBits(hDC, hBitmap, 0, height, pDIBitmap->GetBuffer(), (BITMAPINFO*)(FX_LPCSTR)info, DIB_RGB_COLORS);
+ if (!ret) {
+ if (pDIBitmap) {
+ delete pDIBitmap;
+ }
+ pDIBitmap = NULL;
+ }
+ DeleteDC(hDC);
+ return pDIBitmap;
+}
+CFX_DIBitmap* CFX_WindowsDIB::LoadFromDDB(HDC hDC, HBITMAP hBitmap, FX_DWORD* pPalette, FX_DWORD palsize)
+{
+ FX_BOOL bCreatedDC = hDC == NULL;
+ if (hDC == NULL) {
+ hDC = CreateCompatibleDC(NULL);
+ }
+ BITMAPINFOHEADER bmih;
+ FXSYS_memset32(&bmih, 0, sizeof bmih);
+ bmih.biSize = sizeof bmih;
+ GetDIBits(hDC, hBitmap, 0, 0, NULL, (BITMAPINFO*)&bmih, DIB_RGB_COLORS);
+ int width = bmih.biWidth;
+ int height = abs(bmih.biHeight);
+ bmih.biHeight = -height;
+ bmih.biCompression = BI_RGB;
+ CFX_DIBitmap* pDIBitmap = FX_NEW CFX_DIBitmap;
+ if (!pDIBitmap) {
+ return NULL;
+ }
+ int ret = 0;
+ if (bmih.biBitCount == 1 || bmih.biBitCount == 8) {
+ int size = sizeof (BITMAPINFOHEADER) + 8;
+ if (bmih.biBitCount == 8) {
+ size += sizeof (FX_DWORD) * 254;
+ }
+ BITMAPINFO* pbmih = (BITMAPINFO*)FX_Alloc(FX_BYTE, size);
+ if (!pbmih) {
+ delete pDIBitmap;
+ if (bCreatedDC) {
+ DeleteDC(hDC);
+ }
+ return NULL;
+ }
+ FXSYS_memset32(pbmih, 0, sizeof (BITMAPINFOHEADER));
+ pbmih->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
+ pbmih->bmiHeader.biBitCount = bmih.biBitCount;
+ pbmih->bmiHeader.biCompression = BI_RGB;
+ pbmih->bmiHeader.biHeight = -height;
+ pbmih->bmiHeader.biPlanes = 1;
+ pbmih->bmiHeader.biWidth = bmih.biWidth;
+ if (!pDIBitmap->Create(bmih.biWidth, height, bmih.biBitCount == 1 ? FXDIB_1bppRgb : FXDIB_8bppRgb)) {
+ delete pDIBitmap;
+ FX_Free(pbmih);
+ if (bCreatedDC) {
+ DeleteDC(hDC);
+ }
+ return NULL;
+ }
+ ret = GetDIBits(hDC, hBitmap, 0, height, pDIBitmap->GetBuffer(), (BITMAPINFO*)pbmih, DIB_RGB_COLORS);
+ FX_Free(pbmih);
+ pbmih = NULL;
+ pDIBitmap->CopyPalette(pPalette, palsize);
+ } else {
+ if (bmih.biBitCount <= 24) {
+ bmih.biBitCount = 24;
+ } else {
+ bmih.biBitCount = 32;
+ }
+ if (!pDIBitmap->Create(bmih.biWidth, height, bmih.biBitCount == 24 ? FXDIB_Rgb : FXDIB_Rgb32)) {
+ delete pDIBitmap;
+ if (bCreatedDC) {
+ DeleteDC(hDC);
+ }
+ return NULL;
+ }
+ ret = GetDIBits(hDC, hBitmap, 0, height, pDIBitmap->GetBuffer(), (BITMAPINFO*)&bmih, DIB_RGB_COLORS);
+ if (ret != 0 && bmih.biBitCount == 32) {
+ int pitch = pDIBitmap->GetPitch();
+ for (int row = 0; row < height; row ++) {
+ FX_BYTE* dest_scan = (FX_BYTE*)(pDIBitmap->GetBuffer() + row * pitch);
+ for (int col = 0; col < width; col++) {
+ dest_scan[3] = 255;
+ dest_scan += 4;
+ }
+ }
+ }
+ }
+ if (ret == 0) {
+ if (pDIBitmap) {
+ delete pDIBitmap;
+ }
+ pDIBitmap = NULL;
+ }
+ if (bCreatedDC) {
+ DeleteDC(hDC);
+ }
+ return pDIBitmap;
+}
+CFX_WindowsDIB::CFX_WindowsDIB(HDC hDC, int width, int height)
+{
+ Create(width, height, FXDIB_Rgb, (FX_LPBYTE)1);
+ BITMAPINFOHEADER bmih;
+ FXSYS_memset32(&bmih, 0, sizeof bmih);
+ bmih.biSize = sizeof bmih;
+ bmih.biBitCount = 24;
+ bmih.biHeight = -height;
+ bmih.biPlanes = 1;
+ bmih.biWidth = width;
+ m_hBitmap = CreateDIBSection(hDC, (BITMAPINFO*)&bmih, DIB_RGB_COLORS, (LPVOID*)&m_pBuffer, NULL, 0);
+ m_hMemDC = CreateCompatibleDC(hDC);
+ m_hOldBitmap = (HBITMAP)SelectObject(m_hMemDC, m_hBitmap);
+}
+CFX_WindowsDIB::~CFX_WindowsDIB()
+{
+ SelectObject(m_hMemDC, m_hOldBitmap);
+ DeleteDC(m_hMemDC);
+ DeleteObject(m_hBitmap);
+}
+void CFX_WindowsDIB::LoadFromDevice(HDC hDC, int left, int top)
+{
+ ::BitBlt(m_hMemDC, 0, 0, m_Width, m_Height, hDC, left, top, SRCCOPY);
+}
+void CFX_WindowsDIB::SetToDevice(HDC hDC, int left, int top)
+{
+ ::BitBlt(hDC, left, top, m_Width, m_Height, m_hMemDC, 0, 0, SRCCOPY);
+}
+#endif
diff --git a/core/src/fxge/win32/fx_win32_dwrite.cpp b/core/src/fxge/win32/fx_win32_dwrite.cpp
new file mode 100644
index 0000000000..d4c962036e
--- /dev/null
+++ b/core/src/fxge/win32/fx_win32_dwrite.cpp
@@ -0,0 +1,480 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxge/fx_ge.h"
+#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_
+#include "../../../include/fxge/fx_ge_win32.h"
+#include "dwrite_int.h"
+#include "../Microsoft SDK/include/DWrite.h"
+typedef HRESULT (__stdcall *FuncType_DWriteCreateFactory)(__in DWRITE_FACTORY_TYPE, __in REFIID, __out IUnknown **);
+template <typename InterfaceType>
+inline void SafeRelease(InterfaceType** currentObject)
+{
+ if (*currentObject != NULL) {
+ (*currentObject)->Release();
+ *currentObject = NULL;
+ }
+}
+template <typename InterfaceType>
+inline InterfaceType* SafeAcquire(InterfaceType* newObject)
+{
+ if (newObject != NULL) {
+ newObject->AddRef();
+ }
+ return newObject;
+}
+class CDwFontFileStream : public IDWriteFontFileStream, public CFX_Object
+{
+public:
+ explicit CDwFontFileStream(void const* fontFileReferenceKey, UINT32 fontFileReferenceKeySize);
+ virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void** ppvObject);
+ virtual ULONG STDMETHODCALLTYPE AddRef();
+ virtual ULONG STDMETHODCALLTYPE Release();
+ virtual HRESULT STDMETHODCALLTYPE ReadFileFragment(void const** fragmentStart, UINT64 fileOffset, UINT64 fragmentSize, OUT void** fragmentContext);
+ virtual void STDMETHODCALLTYPE ReleaseFileFragment(void* fragmentContext);
+ virtual HRESULT STDMETHODCALLTYPE GetFileSize(OUT UINT64* fileSize);
+ virtual HRESULT STDMETHODCALLTYPE GetLastWriteTime(OUT UINT64* lastWriteTime);
+ bool IsInitialized()
+ {
+ return resourcePtr_ != NULL;
+ }
+private:
+ ULONG refCount_;
+ void const* resourcePtr_;
+ DWORD resourceSize_;
+};
+class CDwFontFileLoader : public IDWriteFontFileLoader, public CFX_Object
+{
+public:
+ virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void** ppvObject);
+ virtual ULONG STDMETHODCALLTYPE AddRef();
+ virtual ULONG STDMETHODCALLTYPE Release();
+ virtual HRESULT STDMETHODCALLTYPE CreateStreamFromKey(void const* fontFileReferenceKey, UINT32 fontFileReferenceKeySize, OUT IDWriteFontFileStream** fontFileStream);
+
+ static IDWriteFontFileLoader* GetLoader()
+ {
+ if (instance_ == NULL) {
+ instance_ = FX_NEW CDwFontFileLoader();
+ return instance_;
+ }
+ return instance_;
+ }
+ static bool IsLoaderInitialized()
+ {
+ return instance_ != NULL;
+ }
+private:
+ CDwFontFileLoader();
+ ULONG refCount_;
+ static IDWriteFontFileLoader* instance_;
+};
+class CDwFontContext : public CFX_Object
+{
+public:
+ CDwFontContext(IDWriteFactory* dwriteFactory);
+ ~CDwFontContext();
+ HRESULT Initialize();
+private:
+ CDwFontContext(CDwFontContext const&);
+ void operator=(CDwFontContext const&);
+ HRESULT hr_;
+ IDWriteFactory* dwriteFactory_;
+};
+class CDwGdiTextRenderer : public CFX_Object
+{
+public:
+ CDwGdiTextRenderer(
+ CFX_DIBitmap* pBitmap,
+ IDWriteBitmapRenderTarget* bitmapRenderTarget,
+ IDWriteRenderingParams* renderingParams
+ );
+ CDwGdiTextRenderer::~CDwGdiTextRenderer();
+ HRESULT STDMETHODCALLTYPE DrawGlyphRun(
+ const FX_RECT& text_bbox,
+ __in_opt CFX_ClipRgn* pClipRgn,
+ __in_opt DWRITE_MATRIX const* pMatrix,
+ FLOAT baselineOriginX,
+ FLOAT baselineOriginY,
+ DWRITE_MEASURING_MODE measuringMode,
+ __in DWRITE_GLYPH_RUN const* glyphRun,
+ const COLORREF& textColor
+ );
+private:
+ CFX_DIBitmap* pBitmap_;
+ IDWriteBitmapRenderTarget* pRenderTarget_;
+ IDWriteRenderingParams* pRenderingParams_;
+};
+CDWriteExt::CDWriteExt()
+{
+ m_hModule = NULL;
+ m_pDWriteFactory = NULL;
+ m_pDwFontContext = NULL;
+ m_pDwTextRenderer = NULL;
+}
+void CDWriteExt::Load()
+{
+}
+void CDWriteExt::Unload()
+{
+ if (m_pDwFontContext) {
+ delete (CDwFontContext*)m_pDwFontContext;
+ m_pDwFontContext = NULL;
+ }
+ SafeRelease((IDWriteFactory**)&m_pDWriteFactory);
+}
+CDWriteExt::~CDWriteExt()
+{
+ Unload();
+}
+LPVOID CDWriteExt::DwCreateFontFaceFromStream(FX_LPBYTE pData, FX_DWORD size, int simulation_style)
+{
+ IDWriteFactory* pDwFactory = (IDWriteFactory*)m_pDWriteFactory;
+ IDWriteFontFile* pDwFontFile = NULL;
+ IDWriteFontFace* pDwFontFace = NULL;
+ BOOL isSupportedFontType = FALSE;
+ DWRITE_FONT_FILE_TYPE fontFileType;
+ DWRITE_FONT_FACE_TYPE fontFaceType;
+ UINT32 numberOfFaces;
+ DWRITE_FONT_SIMULATIONS fontStyle = (DWRITE_FONT_SIMULATIONS)(simulation_style & 3);
+ HRESULT hr = S_OK;
+ hr = pDwFactory->CreateCustomFontFileReference(
+ (void const*)pData,
+ (UINT32)size,
+ CDwFontFileLoader::GetLoader(),
+ &pDwFontFile
+ );
+ if (FAILED(hr)) {
+ goto failed;
+ }
+ hr = pDwFontFile->Analyze(
+ &isSupportedFontType,
+ &fontFileType,
+ &fontFaceType,
+ &numberOfFaces
+ );
+ if (FAILED(hr) || !isSupportedFontType || fontFaceType == DWRITE_FONT_FACE_TYPE_UNKNOWN) {
+ goto failed;
+ }
+ hr = pDwFactory->CreateFontFace(
+ fontFaceType,
+ 1,
+ &pDwFontFile,
+ 0,
+ fontStyle,
+ &pDwFontFace
+ );
+ if (FAILED(hr)) {
+ goto failed;
+ }
+ SafeRelease(&pDwFontFile);
+ return pDwFontFace;
+failed:
+ SafeRelease(&pDwFontFile);
+ return NULL;
+}
+FX_BOOL CDWriteExt::DwCreateRenderingTarget(CFX_DIBitmap* pBitmap, void** renderTarget)
+{
+ if (pBitmap->GetFormat() > FXDIB_Argb) {
+ return FALSE;
+ }
+ IDWriteFactory* pDwFactory = (IDWriteFactory*)m_pDWriteFactory;
+ IDWriteGdiInterop* pGdiInterop = NULL;
+ IDWriteBitmapRenderTarget* pBitmapRenderTarget = NULL;
+ IDWriteRenderingParams* pRenderingParams = NULL;
+ HRESULT hr = S_OK;
+ hr = pDwFactory->GetGdiInterop(&pGdiInterop);
+ if (FAILED(hr)) {
+ goto failed;
+ }
+ hr = pGdiInterop->CreateBitmapRenderTarget(NULL, pBitmap->GetWidth(), pBitmap->GetHeight(),
+ &pBitmapRenderTarget);
+ if (FAILED(hr)) {
+ goto failed;
+ }
+ hr = pDwFactory->CreateCustomRenderingParams(
+ 1.0f,
+ 0.0f,
+ 1.0f,
+ DWRITE_PIXEL_GEOMETRY_RGB,
+ DWRITE_RENDERING_MODE_DEFAULT,
+ &pRenderingParams
+ );
+ if (FAILED(hr)) {
+ goto failed;
+ }
+ hr = pBitmapRenderTarget->SetPixelsPerDip(1.0f);
+ if (FAILED(hr)) {
+ goto failed;
+ }
+ *(CDwGdiTextRenderer**)renderTarget = FX_NEW CDwGdiTextRenderer(pBitmap, pBitmapRenderTarget, pRenderingParams);
+ if (*(CDwGdiTextRenderer**)renderTarget == NULL) {
+ goto failed;
+ }
+ SafeRelease(&pGdiInterop);
+ SafeRelease(&pBitmapRenderTarget);
+ SafeRelease(&pRenderingParams);
+ return TRUE;
+failed:
+ SafeRelease(&pGdiInterop);
+ SafeRelease(&pBitmapRenderTarget);
+ SafeRelease(&pRenderingParams);
+ return FALSE;
+}
+FX_BOOL CDWriteExt::DwRendingString(void* renderTarget, CFX_ClipRgn* pClipRgn, FX_RECT& stringRect, CFX_AffineMatrix* pMatrix,
+ void *font, FX_FLOAT font_size, FX_ARGB text_color,
+ int glyph_count, unsigned short* glyph_indices,
+ FX_FLOAT baselineOriginX, FX_FLOAT baselineOriginY,
+ void* glyph_offsets,
+ FX_FLOAT* glyph_advances)
+{
+ if (renderTarget == NULL) {
+ return TRUE;
+ }
+ CDwGdiTextRenderer* pTextRenderer = (CDwGdiTextRenderer*)renderTarget;
+ DWRITE_MATRIX transform;
+ DWRITE_GLYPH_RUN glyphRun;
+ HRESULT hr = S_OK;
+ if (pMatrix) {
+ transform.m11 = pMatrix->a;
+ transform.m12 = pMatrix->b;
+ transform.m21 = pMatrix->c;
+ transform.m22 = pMatrix->d;
+ transform.dx = pMatrix->e;
+ transform.dy = pMatrix->f;
+ }
+ glyphRun.fontFace = (IDWriteFontFace*)font;
+ glyphRun.fontEmSize = font_size;
+ glyphRun.glyphCount = glyph_count;
+ glyphRun.glyphIndices = glyph_indices;
+ glyphRun.glyphAdvances = glyph_advances;
+ glyphRun.glyphOffsets = (DWRITE_GLYPH_OFFSET*)glyph_offsets;
+ glyphRun.isSideways = FALSE;
+ glyphRun.bidiLevel = 0;
+ hr = pTextRenderer->DrawGlyphRun(
+ stringRect,
+ pClipRgn,
+ pMatrix ? &transform : NULL,
+ baselineOriginX, baselineOriginY,
+ DWRITE_MEASURING_MODE_NATURAL,
+ &glyphRun,
+ RGB(FXARGB_R(text_color), FXARGB_G(text_color), FXARGB_B(text_color))
+ );
+ return SUCCEEDED(hr) ? TRUE : FALSE;
+}
+void CDWriteExt::DwDeleteRenderingTarget(void* renderTarget)
+{
+ if (renderTarget) {
+ delete (CDwGdiTextRenderer*)renderTarget;
+ }
+}
+void CDWriteExt::DwDeleteFont(void* pFont)
+{
+ if (pFont) {
+ SafeRelease((IDWriteFontFace**)&pFont);
+ }
+}
+CDwFontFileStream::CDwFontFileStream(void const* fontFileReferenceKey, UINT32 fontFileReferenceKeySize)
+{
+ refCount_ = 0;
+ resourcePtr_ = fontFileReferenceKey;
+ resourceSize_ = fontFileReferenceKeySize;
+}
+HRESULT STDMETHODCALLTYPE CDwFontFileStream::QueryInterface(REFIID iid, void** ppvObject)
+{
+ if (iid == IID_IUnknown || iid == __uuidof(IDWriteFontFileStream)) {
+ *ppvObject = this;
+ AddRef();
+ return S_OK;
+ } else {
+ *ppvObject = NULL;
+ return E_NOINTERFACE;
+ }
+}
+ULONG STDMETHODCALLTYPE CDwFontFileStream::AddRef()
+{
+ return InterlockedIncrement((long*)(&refCount_));
+}
+ULONG STDMETHODCALLTYPE CDwFontFileStream::Release()
+{
+ ULONG newCount = InterlockedDecrement((long*)(&refCount_));
+ if (newCount == 0) {
+ delete this;
+ }
+ return newCount;
+}
+HRESULT STDMETHODCALLTYPE CDwFontFileStream::ReadFileFragment(
+ void const** fragmentStart,
+ UINT64 fileOffset,
+ UINT64 fragmentSize,
+ OUT void** fragmentContext
+)
+{
+ if (fileOffset <= resourceSize_ &&
+ fragmentSize <= resourceSize_ - fileOffset) {
+ *fragmentStart = static_cast<FX_BYTE const*>(resourcePtr_) + static_cast<size_t>(fileOffset);
+ *fragmentContext = NULL;
+ return S_OK;
+ } else {
+ *fragmentStart = NULL;
+ *fragmentContext = NULL;
+ return E_FAIL;
+ }
+}
+void STDMETHODCALLTYPE CDwFontFileStream::ReleaseFileFragment(void* fragmentContext)
+{
+}
+HRESULT STDMETHODCALLTYPE CDwFontFileStream::GetFileSize(OUT UINT64* fileSize)
+{
+ *fileSize = resourceSize_;
+ return S_OK;
+}
+HRESULT STDMETHODCALLTYPE CDwFontFileStream::GetLastWriteTime(OUT UINT64* lastWriteTime)
+{
+ *lastWriteTime = 0;
+ return E_NOTIMPL;
+}
+IDWriteFontFileLoader* CDwFontFileLoader::instance_ = NULL;
+CDwFontFileLoader::CDwFontFileLoader() :
+ refCount_(0)
+{
+}
+HRESULT STDMETHODCALLTYPE CDwFontFileLoader::QueryInterface(REFIID iid, void** ppvObject)
+{
+ if (iid == IID_IUnknown || iid == __uuidof(IDWriteFontFileLoader)) {
+ *ppvObject = this;
+ AddRef();
+ return S_OK;
+ } else {
+ *ppvObject = NULL;
+ return E_NOINTERFACE;
+ }
+}
+ULONG STDMETHODCALLTYPE CDwFontFileLoader::AddRef()
+{
+ return InterlockedIncrement((long*)(&refCount_));
+}
+ULONG STDMETHODCALLTYPE CDwFontFileLoader::Release()
+{
+ ULONG newCount = InterlockedDecrement((long*)(&refCount_));
+ if (newCount == 0) {
+ instance_ = NULL;
+ delete this;
+ }
+ return newCount;
+}
+HRESULT STDMETHODCALLTYPE CDwFontFileLoader::CreateStreamFromKey(
+ void const* fontFileReferenceKey,
+ UINT32 fontFileReferenceKeySize,
+ OUT IDWriteFontFileStream** fontFileStream
+)
+{
+ *fontFileStream = NULL;
+ CDwFontFileStream* stream = FX_NEW CDwFontFileStream(fontFileReferenceKey, fontFileReferenceKeySize);
+ if (stream == NULL) {
+ return E_OUTOFMEMORY;
+ }
+ if (!stream->IsInitialized()) {
+ delete stream;
+ return E_FAIL;
+ }
+ *fontFileStream = SafeAcquire(stream);
+ return S_OK;
+}
+CDwFontContext::CDwFontContext(IDWriteFactory* dwriteFactory) :
+ hr_(S_FALSE),
+ dwriteFactory_(SafeAcquire(dwriteFactory))
+{
+}
+CDwFontContext::~CDwFontContext()
+{
+ if(dwriteFactory_ && hr_ == S_OK) {
+ dwriteFactory_->UnregisterFontFileLoader(CDwFontFileLoader::GetLoader());
+ }
+ SafeRelease(&dwriteFactory_);
+}
+HRESULT CDwFontContext::Initialize()
+{
+ if (hr_ == S_FALSE) {
+ return hr_ = dwriteFactory_->RegisterFontFileLoader(CDwFontFileLoader::GetLoader());
+ }
+ return hr_;
+}
+CDwGdiTextRenderer::CDwGdiTextRenderer(CFX_DIBitmap* pBitmap, IDWriteBitmapRenderTarget* bitmapRenderTarget, IDWriteRenderingParams* renderingParams):
+ pBitmap_(pBitmap),
+ pRenderTarget_(SafeAcquire(bitmapRenderTarget)),
+ pRenderingParams_(SafeAcquire(renderingParams))
+{
+}
+CDwGdiTextRenderer::~CDwGdiTextRenderer()
+{
+ SafeRelease(&pRenderTarget_);
+ SafeRelease(&pRenderingParams_);
+}
+STDMETHODIMP CDwGdiTextRenderer::DrawGlyphRun(
+ const FX_RECT& text_bbox,
+ __in_opt CFX_ClipRgn* pClipRgn,
+ __in_opt DWRITE_MATRIX const* pMatrix,
+ FLOAT baselineOriginX,
+ FLOAT baselineOriginY,
+ DWRITE_MEASURING_MODE measuringMode,
+ __in DWRITE_GLYPH_RUN const* glyphRun,
+ const COLORREF& textColor
+)
+{
+ HRESULT hr = S_OK;
+ if (pMatrix) {
+ hr = pRenderTarget_->SetCurrentTransform(pMatrix);
+ if (FAILED(hr)) {
+ return hr;
+ }
+ }
+ HDC hDC = pRenderTarget_->GetMemoryDC();
+ HBITMAP hBitmap = (HBITMAP)::GetCurrentObject(hDC, OBJ_BITMAP);
+ BITMAP bitmap;
+ GetObject(hBitmap, sizeof bitmap, &bitmap);
+ CFX_DIBitmap dib;
+ dib.Create(
+ bitmap.bmWidth,
+ bitmap.bmHeight,
+ bitmap.bmBitsPixel == 24 ? FXDIB_Rgb : FXDIB_Rgb32,
+ (FX_LPBYTE)bitmap.bmBits
+ );
+ dib.CompositeBitmap(
+ text_bbox.left,
+ text_bbox.top,
+ text_bbox.Width(),
+ text_bbox.Height(),
+ pBitmap_,
+ text_bbox.left,
+ text_bbox.top,
+ FXDIB_BLEND_NORMAL,
+ NULL
+ );
+ hr = pRenderTarget_->DrawGlyphRun(
+ baselineOriginX,
+ baselineOriginY,
+ measuringMode,
+ glyphRun,
+ pRenderingParams_,
+ textColor
+ );
+ if (FAILED(hr)) {
+ return hr;
+ }
+ pBitmap_->CompositeBitmap(
+ text_bbox.left,
+ text_bbox.top,
+ text_bbox.Width(),
+ text_bbox.Height(),
+ &dib,
+ text_bbox.left,
+ text_bbox.top,
+ FXDIB_BLEND_NORMAL,
+ pClipRgn
+ );
+ return hr;
+}
+#endif
diff --git a/core/src/fxge/win32/fx_win32_gdipext.cpp b/core/src/fxge/win32/fx_win32_gdipext.cpp
new file mode 100644
index 0000000000..7f9240629c
--- /dev/null
+++ b/core/src/fxge/win32/fx_win32_gdipext.cpp
@@ -0,0 +1,1286 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxge/fx_ge.h"
+#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_
+#include <windows.h>
+#include "../../../include/fxge/fx_ge_win32.h"
+#include "win32_int.h"
+#include "../Microsoft SDK/include/GdiPlus.h"
+using namespace Gdiplus;
+using namespace Gdiplus::DllExports;
+#define GdiFillType2Gdip(fill_type) (fill_type == ALTERNATE ? FillModeAlternate : FillModeWinding)
+static CombineMode GdiCombineMode2Gdip(int mode)
+{
+ switch (mode) {
+ case RGN_AND:
+ return CombineModeIntersect;
+ }
+ return CombineModeIntersect;
+}
+enum {
+ FuncId_GdipCreatePath2,
+ FuncId_GdipSetPenDashStyle,
+ FuncId_GdipSetPenDashArray,
+ FuncId_GdipSetPenDashCap197819,
+ FuncId_GdipSetPenLineJoin,
+ FuncId_GdipSetPenWidth,
+ FuncId_GdipCreateFromHDC,
+ FuncId_GdipSetPageUnit,
+ FuncId_GdipSetSmoothingMode,
+ FuncId_GdipCreateSolidFill,
+ FuncId_GdipFillPath,
+ FuncId_GdipDeleteBrush,
+ FuncId_GdipCreatePen1,
+ FuncId_GdipSetPenMiterLimit,
+ FuncId_GdipDrawPath,
+ FuncId_GdipDeletePen,
+ FuncId_GdipDeletePath,
+ FuncId_GdipDeleteGraphics,
+ FuncId_GdipCreateBitmapFromFileICM,
+ FuncId_GdipCreateBitmapFromStreamICM,
+ FuncId_GdipGetImageHeight,
+ FuncId_GdipGetImageWidth,
+ FuncId_GdipGetImagePixelFormat,
+ FuncId_GdipBitmapLockBits,
+ FuncId_GdipGetImagePaletteSize,
+ FuncId_GdipGetImagePalette,
+ FuncId_GdipBitmapUnlockBits,
+ FuncId_GdipDisposeImage,
+ FuncId_GdipFillRectangle,
+ FuncId_GdipCreateBitmapFromScan0,
+ FuncId_GdipSetImagePalette,
+ FuncId_GdipSetInterpolationMode,
+ FuncId_GdipDrawImagePointsI,
+ FuncId_GdipCreateBitmapFromGdiDib,
+ FuncId_GdiplusStartup,
+ FuncId_GdipDrawLineI,
+ FuncId_GdipResetClip,
+ FuncId_GdipCreatePath,
+ FuncId_GdipAddPathPath,
+ FuncId_GdipSetPathFillMode,
+ FuncId_GdipSetClipPath,
+ FuncId_GdipGetClip,
+ FuncId_GdipCreateRegion,
+ FuncId_GdipGetClipBoundsI,
+ FuncId_GdipSetClipRegion,
+ FuncId_GdipWidenPath,
+ FuncId_GdipAddPathLine,
+ FuncId_GdipAddPathRectangle,
+ FuncId_GdipDeleteRegion,
+ FuncId_GdipGetDC,
+ FuncId_GdipReleaseDC,
+ FuncId_GdipSetPenLineCap197819,
+ FuncId_GdipSetPenDashOffset,
+ FuncId_GdipResetPath,
+ FuncId_GdipCreateRegionPath,
+ FuncId_GdipCreateFont,
+ FuncId_GdipGetFontSize,
+ FuncId_GdipCreateFontFamilyFromName,
+ FuncId_GdipSetTextRenderingHint,
+ FuncId_GdipDrawDriverString,
+ FuncId_GdipCreateMatrix2,
+ FuncId_GdipDeleteMatrix,
+ FuncId_GdipSetWorldTransform,
+ FuncId_GdipResetWorldTransform,
+ FuncId_GdipDeleteFontFamily,
+ FuncId_GdipDeleteFont,
+ FuncId_GdipNewPrivateFontCollection,
+ FuncId_GdipDeletePrivateFontCollection,
+ FuncId_GdipPrivateAddMemoryFont,
+ FuncId_GdipGetFontCollectionFamilyList,
+ FuncId_GdipGetFontCollectionFamilyCount,
+ FuncId_GdipSetTextContrast,
+ FuncId_GdipSetPixelOffsetMode,
+ FuncId_GdipGetImageGraphicsContext,
+ FuncId_GdipDrawImageI,
+ FuncId_GdipDrawImageRectI,
+ FuncId_GdipDrawString,
+ FuncId_GdipSetPenTransform,
+};
+static LPCSTR g_GdipFuncNames[] = {
+ "GdipCreatePath2",
+ "GdipSetPenDashStyle",
+ "GdipSetPenDashArray",
+ "GdipSetPenDashCap197819",
+ "GdipSetPenLineJoin",
+ "GdipSetPenWidth",
+ "GdipCreateFromHDC",
+ "GdipSetPageUnit",
+ "GdipSetSmoothingMode",
+ "GdipCreateSolidFill",
+ "GdipFillPath",
+ "GdipDeleteBrush",
+ "GdipCreatePen1",
+ "GdipSetPenMiterLimit",
+ "GdipDrawPath",
+ "GdipDeletePen",
+ "GdipDeletePath",
+ "GdipDeleteGraphics",
+ "GdipCreateBitmapFromFileICM",
+ "GdipCreateBitmapFromStreamICM",
+ "GdipGetImageHeight",
+ "GdipGetImageWidth",
+ "GdipGetImagePixelFormat",
+ "GdipBitmapLockBits",
+ "GdipGetImagePaletteSize",
+ "GdipGetImagePalette",
+ "GdipBitmapUnlockBits",
+ "GdipDisposeImage",
+ "GdipFillRectangle",
+ "GdipCreateBitmapFromScan0",
+ "GdipSetImagePalette",
+ "GdipSetInterpolationMode",
+ "GdipDrawImagePointsI",
+ "GdipCreateBitmapFromGdiDib",
+ "GdiplusStartup",
+ "GdipDrawLineI",
+ "GdipResetClip",
+ "GdipCreatePath",
+ "GdipAddPathPath",
+ "GdipSetPathFillMode",
+ "GdipSetClipPath",
+ "GdipGetClip",
+ "GdipCreateRegion",
+ "GdipGetClipBoundsI",
+ "GdipSetClipRegion",
+ "GdipWidenPath",
+ "GdipAddPathLine",
+ "GdipAddPathRectangle",
+ "GdipDeleteRegion",
+ "GdipGetDC",
+ "GdipReleaseDC",
+ "GdipSetPenLineCap197819",
+ "GdipSetPenDashOffset",
+ "GdipResetPath",
+ "GdipCreateRegionPath",
+ "GdipCreateFont",
+ "GdipGetFontSize",
+ "GdipCreateFontFamilyFromName",
+ "GdipSetTextRenderingHint",
+ "GdipDrawDriverString",
+ "GdipCreateMatrix2",
+ "GdipDeleteMatrix",
+ "GdipSetWorldTransform",
+ "GdipResetWorldTransform",
+ "GdipDeleteFontFamily",
+ "GdipDeleteFont",
+ "GdipNewPrivateFontCollection",
+ "GdipDeletePrivateFontCollection",
+ "GdipPrivateAddMemoryFont",
+ "GdipGetFontCollectionFamilyList",
+ "GdipGetFontCollectionFamilyCount",
+ "GdipSetTextContrast",
+ "GdipSetPixelOffsetMode",
+ "GdipGetImageGraphicsContext",
+ "GdipDrawImageI",
+ "GdipDrawImageRectI",
+ "GdipDrawString",
+ "GdipSetPenTransform",
+};
+typedef GpStatus (WINGDIPAPI *FuncType_GdipCreatePath2)(GDIPCONST GpPointF*, GDIPCONST BYTE*, INT, GpFillMode, GpPath **path);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPenDashStyle)(GpPen *pen, GpDashStyle dashstyle);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPenDashArray)(GpPen *pen, GDIPCONST REAL *dash, INT count);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPenDashCap197819)(GpPen *pen, GpDashCap dashCap);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPenLineJoin)(GpPen *pen, GpLineJoin lineJoin);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPenWidth)(GpPen *pen, REAL width);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipCreateFromHDC)(HDC hdc, GpGraphics **graphics);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPageUnit)(GpGraphics *graphics, GpUnit unit);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetSmoothingMode)(GpGraphics *graphics, SmoothingMode smoothingMode);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipCreateSolidFill)(ARGB color, GpSolidFill **brush);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipFillPath)(GpGraphics *graphics, GpBrush *brush, GpPath *path);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipDeleteBrush)(GpBrush *brush);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipCreatePen1)(ARGB color, REAL width, GpUnit unit, GpPen **pen);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPenMiterLimit)(GpPen *pen, REAL miterLimit);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipDrawPath)(GpGraphics *graphics, GpPen *pen, GpPath *path);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipDeletePen)(GpPen *pen);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipDeletePath)(GpPath* path);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipDeleteGraphics)(GpGraphics *graphics);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipCreateBitmapFromFileICM)(GDIPCONST WCHAR* filename, GpBitmap **bitmap);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipCreateBitmapFromStreamICM)(IStream* stream, GpBitmap **bitmap);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipGetImageWidth)(GpImage *image, UINT *width);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipGetImageHeight)(GpImage *image, UINT *height);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipGetImagePixelFormat)(GpImage *image, PixelFormat *format);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipBitmapLockBits)(GpBitmap* bitmap, GDIPCONST GpRect* rect, UINT flags, PixelFormat format, BitmapData* lockedBitmapData);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipGetImagePalette)(GpImage *image, ColorPalette *palette, INT size);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipGetImagePaletteSize)(GpImage *image, INT *size);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipBitmapUnlockBits)(GpBitmap* bitmap, BitmapData* lockedBitmapData);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipDisposeImage)(GpImage *image);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipFillRectangle)(GpGraphics *graphics, GpBrush *brush, REAL x, REAL y, REAL width, REAL height);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipCreateBitmapFromScan0)(INT width, INT height, INT stride, PixelFormat format, BYTE* scan0, GpBitmap** bitmap);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetImagePalette)(GpImage *image, GDIPCONST ColorPalette *palette);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetInterpolationMode)(GpGraphics *graphics, InterpolationMode interpolationMode);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipDrawImagePointsI)(GpGraphics *graphics, GpImage *image, GDIPCONST GpPoint *dstpoints, INT count);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipCreateBitmapFromGdiDib)(GDIPCONST BITMAPINFO* gdiBitmapInfo, VOID* gdiBitmapData, GpBitmap** bitmap);
+typedef Status (WINAPI *FuncType_GdiplusStartup)(OUT FX_UINTPTR *token, const GdiplusStartupInput *input, OUT GdiplusStartupOutput *output);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipDrawLineI)(GpGraphics *graphics, GpPen *pen, int x1, int y1, int x2, int y2);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipResetClip)(GpGraphics *graphics);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipCreatePath)(GpFillMode brushMode, GpPath **path);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipAddPathPath)(GpPath *path, GDIPCONST GpPath* addingPath, BOOL connect);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPathFillMode)(GpPath *path, GpFillMode fillmode);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetClipPath)(GpGraphics *graphics, GpPath *path, CombineMode combineMode);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipGetClip)(GpGraphics *graphics, GpRegion *region);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipCreateRegion)(GpRegion **region);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipGetClipBoundsI)(GpGraphics *graphics, GpRect *rect);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetClipRegion)(GpGraphics *graphics, GpRegion *region, CombineMode combineMode);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipWidenPath)(GpPath *nativePath, GpPen *pen, GpMatrix *matrix, REAL flatness);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipAddPathLine)(GpPath *path, REAL x1, REAL y1, REAL x2, REAL y2);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipAddPathRectangle)(GpPath *path, REAL x, REAL y, REAL width, REAL height);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipDeleteRegion)(GpRegion *region);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipGetDC)(GpGraphics* graphics, HDC * hdc);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipReleaseDC)(GpGraphics* graphics, HDC hdc);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPenLineCap197819)(GpPen *pen, GpLineCap startCap, GpLineCap endCap, GpDashCap dashCap);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPenDashOffset)(GpPen *pen, REAL offset);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipResetPath)(GpPath *path);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipCreateRegionPath)(GpPath *path, GpRegion **region);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipCreateFont)(GDIPCONST GpFontFamily *fontFamily, REAL emSize, INT style, Unit unit, GpFont **font);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipGetFontSize)(GpFont *font, REAL *size);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipCreateFontFamilyFromName)(GDIPCONST WCHAR *name, GpFontCollection *fontCollection, GpFontFamily **FontFamily);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetTextRenderingHint)(GpGraphics *graphics, TextRenderingHint mode);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipDrawDriverString)(GpGraphics *graphics, GDIPCONST UINT16 *text, INT length, GDIPCONST GpFont *font, GDIPCONST GpBrush *brush, GDIPCONST PointF *positions, INT flags, GDIPCONST GpMatrix *matrix);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipCreateMatrix2)(REAL m11, REAL m12, REAL m21, REAL m22, REAL dx, REAL dy, GpMatrix **matrix);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipDeleteMatrix)(GpMatrix *matrix);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetWorldTransform)(GpGraphics *graphics, GpMatrix *matrix);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipResetWorldTransform)(GpGraphics *graphics);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipDeleteFontFamily)(GpFontFamily *FontFamily);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipDeleteFont)(GpFont* font);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipNewPrivateFontCollection)(GpFontCollection** fontCollection);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipDeletePrivateFontCollection)(GpFontCollection** fontCollection);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipPrivateAddMemoryFont)(GpFontCollection* fontCollection, GDIPCONST void* memory, INT length);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipGetFontCollectionFamilyList)(GpFontCollection* fontCollection, INT numSought, GpFontFamily* gpfamilies[], INT* numFound);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipGetFontCollectionFamilyCount)(GpFontCollection* fontCollection, INT* numFound);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetTextContrast)(GpGraphics *graphics, UINT contrast);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPixelOffsetMode)(GpGraphics* graphics, PixelOffsetMode pixelOffsetMode);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipGetImageGraphicsContext)(GpImage *image, GpGraphics **graphics);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipDrawImageI)(GpGraphics *graphics, GpImage *image, INT x, INT y);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipDrawImageRectI)(GpGraphics *graphics, GpImage *image, INT x, INT y, INT width, INT height);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipDrawString)(GpGraphics *graphics, GDIPCONST WCHAR *string, INT length, GDIPCONST GpFont *font, GDIPCONST RectF *layoutRect, GDIPCONST GpStringFormat *stringFormat, GDIPCONST GpBrush *brush);
+typedef GpStatus (WINGDIPAPI *FuncType_GdipSetPenTransform)(GpPen *pen, GpMatrix *matrix);
+#define CallFunc(funcname) ((FuncType_##funcname)GdiplusExt.m_Functions[FuncId_##funcname])
+typedef HANDLE (__stdcall *FuncType_GdiAddFontMemResourceEx)(PVOID pbFont, DWORD cbFont, PVOID pdv, DWORD *pcFonts);
+typedef BOOL (__stdcall *FuncType_GdiRemoveFontMemResourceEx)(HANDLE handle);
+void* CGdiplusExt::GdiAddFontMemResourceEx(void *pFontdata, FX_DWORD size, void* pdv, FX_DWORD* num_face)
+{
+ if (m_pGdiAddFontMemResourceEx) {
+ return ((FuncType_GdiAddFontMemResourceEx)m_pGdiAddFontMemResourceEx)((PVOID)pFontdata, (DWORD)size, (PVOID)pdv, (DWORD*)num_face);
+ }
+ return NULL;
+}
+FX_BOOL CGdiplusExt::GdiRemoveFontMemResourceEx(void* handle)
+{
+ if (m_pGdiRemoveFontMemResourseEx) {
+ return ((FuncType_GdiRemoveFontMemResourceEx)m_pGdiRemoveFontMemResourseEx)((HANDLE)handle);
+ }
+ return FALSE;
+}
+static GpBrush* _GdipCreateBrush(DWORD argb)
+{
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ GpSolidFill* solidBrush = NULL;
+ CallFunc(GdipCreateSolidFill)((ARGB)argb, &solidBrush);
+ return solidBrush;
+}
+static CFX_DIBitmap* _StretchMonoToGray(int dest_width, int dest_height,
+ const CFX_DIBitmap* pSource, FX_RECT* pClipRect)
+{
+ FX_BOOL bFlipX = dest_width < 0;
+ if (bFlipX) {
+ dest_width = -dest_width;
+ }
+ FX_BOOL bFlipY = dest_height < 0;
+ if (bFlipY) {
+ dest_height = -dest_height;
+ }
+ int result_width = pClipRect->Width();
+ int result_height = pClipRect->Height();
+ int result_pitch = (result_width + 3) / 4 * 4;
+ CFX_DIBitmap* pStretched = FX_NEW CFX_DIBitmap;
+ if (!pStretched) {
+ return NULL;
+ }
+ if (!pStretched->Create(result_width, result_height, FXDIB_8bppRgb)) {
+ delete pStretched;
+ return NULL;
+ }
+ LPBYTE dest_buf = pStretched->GetBuffer();
+ int src_width = pSource->GetWidth();
+ int src_height = pSource->GetHeight();
+ int src_count = src_width * src_height;
+ int dest_count = dest_width * dest_height;
+ int ratio = 255 * dest_count / src_count;
+ int y_unit = src_height / dest_height;
+ int x_unit = src_width / dest_width;
+ int area_unit = y_unit * x_unit;
+ LPBYTE src_buf = pSource->GetBuffer();
+ int src_pitch = pSource->GetPitch();
+ for (int dest_y = 0; dest_y < result_height; dest_y ++) {
+ LPBYTE dest_scan = dest_buf + dest_y * result_pitch;
+ int src_y_start = bFlipY ? (dest_height - 1 - dest_y - pClipRect->top) : (dest_y + pClipRect->top);
+ src_y_start = src_y_start * src_height / dest_height;
+ LPBYTE src_scan = src_buf + src_y_start * src_pitch;
+ for (int dest_x = 0; dest_x < result_width; dest_x ++) {
+ int sum = 0;
+ int src_x_start = bFlipX ? (dest_width - 1 - dest_x - pClipRect->left) : (dest_x + pClipRect->left);
+ src_x_start = src_x_start * src_width / dest_width;
+ int src_x_end = src_x_start + x_unit;
+ LPBYTE src_line = src_scan;
+ for (int src_y = 0; src_y < y_unit; src_y ++) {
+ for (int src_x = src_x_start; src_x < src_x_end; src_x ++) {
+ if (!(src_line[src_x / 8] & (1 << (7 - src_x % 8)))) {
+ sum += 255;
+ }
+ }
+ src_line += src_pitch;
+ }
+ dest_scan[dest_x] = 255 - sum / area_unit;
+ }
+ }
+ return pStretched;
+}
+static void OutputImageMask(GpGraphics* pGraphics, BOOL bMonoDevice, const CFX_DIBitmap* pBitmap, int dest_left, int dest_top,
+ int dest_width, int dest_height, FX_ARGB argb, const FX_RECT* pClipRect)
+{
+ ASSERT(pBitmap->GetBPP() == 1);
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ int src_width = pBitmap->GetWidth(), src_height = pBitmap->GetHeight();
+ int src_pitch = pBitmap->GetPitch();
+ FX_LPBYTE scan0 = pBitmap->GetBuffer();
+ if (src_width == 1 && src_height == 1) {
+ if ((scan0[0] & 0x80) == 0) {
+ return;
+ }
+ GpSolidFill* solidBrush;
+ CallFunc(GdipCreateSolidFill)((ARGB)argb, &solidBrush);
+ if (dest_width < 0) {
+ dest_width = -dest_width;
+ dest_left -= dest_width;
+ }
+ if (dest_height < 0) {
+ dest_height = -dest_height;
+ dest_top -= dest_height;
+ }
+ CallFunc(GdipFillRectangle)(pGraphics, solidBrush, (float)dest_left, (float)dest_top,
+ (float)dest_width, (float)dest_height);
+ CallFunc(GdipDeleteBrush)(solidBrush);
+ return;
+ }
+ if (!bMonoDevice && abs(dest_width) < src_width && abs(dest_height) < src_height) {
+ FX_RECT image_rect(dest_left, dest_top, dest_left + dest_width, dest_top + dest_height);
+ image_rect.Normalize();
+ FX_RECT image_clip = image_rect;
+ image_clip.Intersect(*pClipRect);
+ if (image_clip.IsEmpty()) {
+ return;
+ }
+ image_clip.Offset(-image_rect.left, -image_rect.top);
+ CFX_DIBitmap* pStretched = NULL;
+ if (src_width * src_height > 10000) {
+ pStretched = _StretchMonoToGray(dest_width, dest_height, pBitmap, &image_clip);
+ } else {
+ pStretched = pBitmap->StretchTo(dest_width, dest_height, FALSE, &image_clip);
+ }
+ GpBitmap* bitmap;
+ CallFunc(GdipCreateBitmapFromScan0)(image_clip.Width(), image_clip.Height(),
+ (image_clip.Width() + 3) / 4 * 4, PixelFormat8bppIndexed, pStretched->GetBuffer(), &bitmap);
+ int a, r, g, b;
+ ArgbDecode(argb, a, r, g, b);
+ UINT pal[258];
+ pal[0] = 0;
+ pal[1] = 256;
+ for (int i = 0; i < 256; i ++) {
+ pal[i + 2] = ArgbEncode(i * a / 255, r, g, b);
+ }
+ CallFunc(GdipSetImagePalette)(bitmap, (ColorPalette*)pal);
+ CallFunc(GdipDrawImageI)(pGraphics, bitmap, image_rect.left + image_clip.left,
+ image_rect.top + image_clip.top);
+ CallFunc(GdipDisposeImage)(bitmap);
+ delete pStretched;
+ return;
+ }
+ GpBitmap* bitmap;
+ CallFunc(GdipCreateBitmapFromScan0)(src_width, src_height, src_pitch, PixelFormat1bppIndexed, scan0, &bitmap);
+ UINT palette[4] = { PaletteFlagsHasAlpha, 2, 0, argb };
+ CallFunc(GdipSetImagePalette)(bitmap, (ColorPalette*)palette);
+ Point destinationPoints[] = {
+ Point(dest_left, dest_top),
+ Point(dest_left + dest_width, dest_top),
+ Point(dest_left, dest_top + dest_height)
+ };
+ CallFunc(GdipDrawImagePointsI)(pGraphics, bitmap, destinationPoints, 3);
+ CallFunc(GdipDisposeImage)(bitmap);
+}
+static void OutputImage(GpGraphics* pGraphics, const CFX_DIBitmap* pBitmap, const FX_RECT* pSrcRect,
+ int dest_left, int dest_top, int dest_width, int dest_height)
+{
+ int src_width = pSrcRect->Width(), src_height = pSrcRect->Height();
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ if (pBitmap->GetBPP() == 1 && (pSrcRect->left % 8)) {
+ FX_RECT new_rect(0, 0, src_width, src_height);
+ CFX_DIBitmap* pCloned = pBitmap->Clone(pSrcRect);
+ if (!pCloned) {
+ return;
+ }
+ OutputImage(pGraphics, pCloned, &new_rect, dest_left, dest_top, dest_width, dest_height);
+ delete pCloned;
+ return;
+ }
+ int src_pitch = pBitmap->GetPitch();
+ FX_LPBYTE scan0 = pBitmap->GetBuffer() + pSrcRect->top * src_pitch + pBitmap->GetBPP() * pSrcRect->left / 8;
+ GpBitmap* bitmap = NULL;
+ switch (pBitmap->GetFormat()) {
+ case FXDIB_Argb:
+ CallFunc(GdipCreateBitmapFromScan0)(src_width, src_height, src_pitch,
+ PixelFormat32bppARGB, scan0, &bitmap);
+ break;
+ case FXDIB_Rgb32:
+ CallFunc(GdipCreateBitmapFromScan0)(src_width, src_height, src_pitch,
+ PixelFormat32bppRGB, scan0, &bitmap);
+ break;
+ case FXDIB_Rgb:
+ CallFunc(GdipCreateBitmapFromScan0)(src_width, src_height, src_pitch,
+ PixelFormat24bppRGB, scan0, &bitmap);
+ break;
+ case FXDIB_8bppRgb: {
+ CallFunc(GdipCreateBitmapFromScan0)(src_width, src_height, src_pitch,
+ PixelFormat8bppIndexed, scan0, &bitmap);
+ UINT pal[258];
+ pal[0] = 0;
+ pal[1] = 256;
+ for (int i = 0; i < 256; i ++) {
+ pal[i + 2] = pBitmap->GetPaletteEntry(i);
+ }
+ CallFunc(GdipSetImagePalette)(bitmap, (ColorPalette*)pal);
+ break;
+ }
+ case FXDIB_1bppRgb: {
+ CallFunc(GdipCreateBitmapFromScan0)(src_width, src_height, src_pitch,
+ PixelFormat1bppIndexed, scan0, &bitmap);
+ break;
+ }
+ }
+ if (dest_height < 0) {
+ dest_height --;
+ }
+ if (dest_width < 0) {
+ dest_width --;
+ }
+ Point destinationPoints[] = {
+ Point(dest_left, dest_top),
+ Point(dest_left + dest_width, dest_top),
+ Point(dest_left, dest_top + dest_height)
+ };
+ CallFunc(GdipDrawImagePointsI)(pGraphics, bitmap, destinationPoints, 3);
+ CallFunc(GdipDisposeImage)(bitmap);
+}
+CGdiplusExt::CGdiplusExt()
+{
+ m_hModule = NULL;
+ m_GdiModule = NULL;
+ for (int i = 0; i < sizeof g_GdipFuncNames / sizeof(LPCSTR); i ++) {
+ m_Functions[i] = NULL;
+ }
+ m_pGdiAddFontMemResourceEx = NULL;
+ m_pGdiRemoveFontMemResourseEx = NULL;
+}
+void CGdiplusExt::Load()
+{
+ CFX_ByteString strPlusPath = "";
+ FX_CHAR buf[MAX_PATH];
+ GetSystemDirectoryA(buf, MAX_PATH);
+ strPlusPath += buf;
+ strPlusPath += "\\";
+ strPlusPath += "GDIPLUS.DLL";
+ m_hModule = LoadLibraryA(strPlusPath);
+ if (m_hModule == NULL) {
+ return;
+ }
+ for (int i = 0; i < sizeof g_GdipFuncNames / sizeof(LPCSTR); i ++) {
+ m_Functions[i] = GetProcAddress(m_hModule, g_GdipFuncNames[i]);
+ if (m_Functions[i] == NULL) {
+ m_hModule = NULL;
+ return;
+ }
+ }
+ FX_UINTPTR gdiplusToken;
+ GdiplusStartupInput gdiplusStartupInput;
+ ((FuncType_GdiplusStartup)m_Functions[FuncId_GdiplusStartup])(&gdiplusToken, &gdiplusStartupInput, NULL);
+ m_GdiModule = LoadLibraryA("GDI32.DLL");
+ if (m_GdiModule == NULL) {
+ return;
+ }
+ m_pGdiAddFontMemResourceEx = GetProcAddress(m_GdiModule, "AddFontMemResourceEx");
+ m_pGdiRemoveFontMemResourseEx = GetProcAddress(m_GdiModule, "RemoveFontMemResourceEx");
+}
+CGdiplusExt::~CGdiplusExt()
+{
+}
+LPVOID CGdiplusExt::LoadMemFont(LPBYTE pData, FX_DWORD size)
+{
+ GpFontCollection* pCollection = NULL;
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ CallFunc(GdipNewPrivateFontCollection)(&pCollection);
+ GpStatus status = CallFunc(GdipPrivateAddMemoryFont)(pCollection, pData, size);
+ if (status == Ok) {
+ return pCollection;
+ }
+ CallFunc(GdipDeletePrivateFontCollection)(&pCollection);
+ return NULL;
+}
+void CGdiplusExt::DeleteMemFont(LPVOID pCollection)
+{
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ CallFunc(GdipDeletePrivateFontCollection)((GpFontCollection**)&pCollection);
+}
+FX_BOOL CGdiplusExt::GdipCreateBitmap(CFX_DIBitmap* pBitmap, void**bitmap)
+{
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ PixelFormat format;
+ switch (pBitmap->GetFormat()) {
+ case FXDIB_Rgb:
+ format = PixelFormat24bppRGB;
+ break;
+ case FXDIB_Rgb32:
+ format = PixelFormat32bppRGB;
+ break;
+ case FXDIB_Argb:
+ format = PixelFormat32bppARGB;
+ break;
+ default:
+ return FALSE;
+ }
+ GpStatus status = CallFunc(GdipCreateBitmapFromScan0)(pBitmap->GetWidth(), pBitmap->GetHeight(),
+ pBitmap->GetPitch(), format, pBitmap->GetBuffer(), (GpBitmap**)bitmap);
+ if (status == Ok) {
+ return TRUE;
+ }
+ return FALSE;
+}
+FX_BOOL CGdiplusExt::GdipCreateFromImage(void* bitmap, void** graphics)
+{
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ GpStatus status = CallFunc(GdipGetImageGraphicsContext)((GpBitmap*)bitmap, (GpGraphics**)graphics);
+ if (status == Ok) {
+ return TRUE;
+ }
+ return FALSE;
+}
+FX_BOOL CGdiplusExt::GdipCreateFontFamilyFromName(FX_LPCWSTR name, void* pFontCollection, void**pFamily)
+{
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ GpStatus status = CallFunc(GdipCreateFontFamilyFromName)((GDIPCONST WCHAR *)name, (GpFontCollection*)pFontCollection, (GpFontFamily**)pFamily);
+ if (status == Ok) {
+ return TRUE;
+ }
+ return FALSE;
+}
+FX_BOOL CGdiplusExt::GdipCreateFontFromFamily(void* pFamily, FX_FLOAT font_size, int fontstyle, int flag, void** pFont)
+{
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ GpStatus status = CallFunc(GdipCreateFont)((GpFontFamily*)pFamily, font_size, fontstyle, Unit(flag), (GpFont**)pFont);
+ if (status == Ok) {
+ return TRUE;
+ }
+ return FALSE;
+}
+void CGdiplusExt::GdipGetFontSize(void *pFont, FX_FLOAT *size)
+{
+ REAL get_size;
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ GpStatus status = CallFunc(GdipGetFontSize)((GpFont *)pFont, (REAL*)&get_size);
+ if (status == Ok) {
+ *size = (FX_FLOAT)get_size;
+ } else {
+ *size = 0;
+ }
+}
+void CGdiplusExt::GdipSetTextRenderingHint(void* graphics, int mode)
+{
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ CallFunc(GdipSetTextRenderingHint)((GpGraphics*)graphics, (TextRenderingHint)mode);
+}
+void CGdiplusExt::GdipSetPageUnit(void* graphics, FX_DWORD unit)
+{
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ CallFunc(GdipSetPageUnit)((GpGraphics*)graphics, (GpUnit)unit);
+}
+FX_BOOL CGdiplusExt::GdipDrawDriverString(void *graphics, unsigned short *text, int length,
+ void *font, void* brush, void *positions, int flags, const void *matrix)
+{
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ GpStatus status = CallFunc(GdipDrawDriverString)((GpGraphics*)graphics, (GDIPCONST UINT16 *)text, (INT)length, (GDIPCONST GpFont *)font, (GDIPCONST GpBrush*)brush,
+ (GDIPCONST PointF *)positions, (INT)flags, (GDIPCONST GpMatrix *)matrix);
+ if (status == Ok) {
+ return TRUE;
+ }
+ return FALSE;
+}
+void CGdiplusExt::GdipCreateBrush(FX_DWORD fill_argb, void** pBrush)
+{
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ CallFunc(GdipCreateSolidFill)((ARGB)fill_argb, (GpSolidFill**)pBrush);
+}
+void CGdiplusExt::GdipDeleteBrush(void* pBrush)
+{
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ CallFunc(GdipDeleteBrush)((GpSolidFill*)pBrush);
+}
+void* CGdiplusExt::GdipCreateFontFromCollection(void* pFontCollection, FX_FLOAT font_size, int fontstyle)
+{
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ int numFamilies = 0;
+ GpStatus status = CallFunc(GdipGetFontCollectionFamilyCount)((GpFontCollection*)pFontCollection, &numFamilies);
+ if (status != Ok) {
+ return NULL;
+ }
+ GpFontFamily* family_list[1];
+ status = CallFunc(GdipGetFontCollectionFamilyList)((GpFontCollection*)pFontCollection, 1, family_list, &numFamilies);
+ if (status != Ok) {
+ return NULL;
+ }
+ GpFont* pFont = NULL;
+ status = CallFunc(GdipCreateFont)(family_list[0], font_size, fontstyle, UnitPixel, &pFont);
+ if (status != Ok) {
+ return NULL;
+ }
+ return pFont;
+}
+void CGdiplusExt::GdipCreateMatrix(FX_FLOAT a, FX_FLOAT b, FX_FLOAT c, FX_FLOAT d, FX_FLOAT e, FX_FLOAT f, void** matrix)
+{
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ CallFunc(GdipCreateMatrix2)(a, b, c, d, e, f, (GpMatrix**)matrix);
+}
+void CGdiplusExt::GdipDeleteMatrix(void* matrix)
+{
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ CallFunc(GdipDeleteMatrix)((GpMatrix*)matrix);
+}
+void CGdiplusExt::GdipDeleteFontFamily(void* pFamily)
+{
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ CallFunc(GdipDeleteFontFamily)((GpFontFamily*)pFamily);
+}
+void CGdiplusExt::GdipDeleteFont(void* pFont)
+{
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ CallFunc(GdipDeleteFont)((GpFont*)pFont);
+}
+void CGdiplusExt::GdipSetWorldTransform(void* graphics, void* pMatrix)
+{
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ CallFunc(GdipSetWorldTransform)((GpGraphics*)graphics, (GpMatrix*)pMatrix);
+}
+void CGdiplusExt::GdipDisposeImage(void* bitmap)
+{
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ CallFunc(GdipDisposeImage)((GpBitmap*)bitmap);
+}
+void CGdiplusExt::GdipDeleteGraphics(void* graphics)
+{
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ CallFunc(GdipDeleteGraphics)((GpGraphics*)graphics);
+}
+FX_BOOL CGdiplusExt::StretchBitMask(HDC hDC, BOOL bMonoDevice, const CFX_DIBitmap* pBitmap, int dest_left, int dest_top,
+ int dest_width, int dest_height, FX_DWORD argb, const FX_RECT* pClipRect, int flags)
+{
+ ASSERT(pBitmap->GetBPP() == 1);
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ GpGraphics* pGraphics = NULL;
+ CallFunc(GdipCreateFromHDC)(hDC, &pGraphics);
+ CallFunc(GdipSetPageUnit)(pGraphics, UnitPixel);
+ if (flags & FXDIB_NOSMOOTH) {
+ CallFunc(GdipSetInterpolationMode)(pGraphics, InterpolationModeNearestNeighbor);
+ } else {
+ CallFunc(GdipSetInterpolationMode)(pGraphics, InterpolationModeHighQuality);
+ }
+ OutputImageMask(pGraphics, bMonoDevice, pBitmap, dest_left, dest_top, dest_width, dest_height, argb, pClipRect);
+ CallFunc(GdipDeleteGraphics)(pGraphics);
+ return TRUE;
+}
+FX_BOOL CGdiplusExt::StretchDIBits(HDC hDC, const CFX_DIBitmap* pBitmap, int dest_left, int dest_top,
+ int dest_width, int dest_height, const FX_RECT* pClipRect, int flags)
+{
+ GpGraphics* pGraphics;
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ CallFunc(GdipCreateFromHDC)(hDC, &pGraphics);
+ CallFunc(GdipSetPageUnit)(pGraphics, UnitPixel);
+ if (flags & FXDIB_NOSMOOTH) {
+ CallFunc(GdipSetInterpolationMode)(pGraphics, InterpolationModeNearestNeighbor);
+ } else if (pBitmap->GetWidth() > abs(dest_width) / 2 || pBitmap->GetHeight() > abs(dest_height) / 2) {
+ CallFunc(GdipSetInterpolationMode)(pGraphics, InterpolationModeHighQuality);
+ } else {
+ CallFunc(GdipSetInterpolationMode)(pGraphics, InterpolationModeBilinear);
+ }
+ FX_RECT src_rect(0, 0, pBitmap->GetWidth(), pBitmap->GetHeight());
+ OutputImage(pGraphics, pBitmap, &src_rect, dest_left, dest_top, dest_width, dest_height);
+ CallFunc(GdipDeleteGraphics)(pGraphics);
+ CallFunc(GdipDeleteGraphics)(pGraphics);
+ return TRUE;
+}
+static GpPen* _GdipCreatePen(const CFX_GraphStateData* pGraphState, const CFX_AffineMatrix* pMatrix, DWORD argb, FX_BOOL bTextMode = FALSE)
+{
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ FX_FLOAT width = pGraphState ? pGraphState->m_LineWidth : 1.0f;
+ if (!bTextMode) {
+ FX_FLOAT unit = pMatrix == NULL ? 1.0f : FXSYS_Div(1.0f, (pMatrix->GetXUnit() + pMatrix->GetYUnit()) / 2);
+ if (width < unit) {
+ width = unit;
+ }
+ }
+ GpPen* pPen = NULL;
+ CallFunc(GdipCreatePen1)((ARGB)argb, width, UnitWorld, &pPen);
+ LineCap lineCap;
+ DashCap dashCap = DashCapFlat;
+ FX_BOOL bDashExtend = FALSE;
+ switch(pGraphState->m_LineCap) {
+ case CFX_GraphStateData::LineCapButt:
+ lineCap = LineCapFlat;
+ break;
+ case CFX_GraphStateData::LineCapRound:
+ lineCap = LineCapRound;
+ dashCap = DashCapRound;
+ bDashExtend = TRUE;
+ break;
+ case CFX_GraphStateData::LineCapSquare:
+ lineCap = LineCapSquare;
+ bDashExtend = TRUE;
+ break;
+ }
+ CallFunc(GdipSetPenLineCap197819)(pPen, lineCap, lineCap, dashCap);
+ LineJoin lineJoin;
+ switch(pGraphState->m_LineJoin) {
+ case CFX_GraphStateData::LineJoinMiter:
+ lineJoin = LineJoinMiterClipped;
+ break;
+ case CFX_GraphStateData::LineJoinRound:
+ lineJoin = LineJoinRound;
+ break;
+ case CFX_GraphStateData::LineJoinBevel:
+ lineJoin = LineJoinBevel;
+ break;
+ }
+ CallFunc(GdipSetPenLineJoin)(pPen, lineJoin);
+ if(pGraphState->m_DashCount) {
+ FX_FLOAT* pDashArray = FX_Alloc(FX_FLOAT, pGraphState->m_DashCount + pGraphState->m_DashCount % 2);
+ if (!pDashArray) {
+ return NULL;
+ }
+ int nCount = 0;
+ FX_FLOAT on_leftover = 0, off_leftover = 0;
+ for (int i = 0; i < pGraphState->m_DashCount; i += 2) {
+ FX_FLOAT on_phase = pGraphState->m_DashArray[i];
+ FX_FLOAT off_phase;
+ if (i == pGraphState->m_DashCount - 1) {
+ off_phase = on_phase;
+ } else {
+ off_phase = pGraphState->m_DashArray[i + 1];
+ }
+ on_phase /= width;
+ off_phase /= width;
+ if (on_phase + off_phase <= 0.00002f) {
+ on_phase = 1.0f / 10;
+ off_phase = 1.0f / 10;
+ }
+ if (bDashExtend) {
+ if (off_phase < 1) {
+ off_phase = 0;
+ } else {
+ off_phase -= 1;
+ }
+ on_phase += 1;
+ }
+ if (on_phase == 0 || off_phase == 0) {
+ if (nCount == 0) {
+ on_leftover += on_phase;
+ off_leftover += off_phase;
+ } else {
+ pDashArray[nCount - 2] += on_phase;
+ pDashArray[nCount - 1] += off_phase;
+ }
+ } else {
+ pDashArray[nCount++] = on_phase + on_leftover;
+ on_leftover = 0;
+ pDashArray[nCount++] = off_phase + off_leftover;
+ off_leftover = 0;
+ }
+ }
+ CallFunc(GdipSetPenDashArray)(pPen, pDashArray, nCount);
+ FX_FLOAT phase = pGraphState->m_DashPhase;
+ if (bDashExtend)
+ if (phase < 0.5f) {
+ phase = 0;
+ } else {
+ phase -= 0.5f;
+ }
+ CallFunc(GdipSetPenDashOffset)(pPen, phase);
+ FX_Free(pDashArray);
+ pDashArray = NULL;
+ }
+ CallFunc(GdipSetPenMiterLimit)(pPen, pGraphState->m_MiterLimit);
+ return pPen;
+}
+static BOOL IsSmallTriangle(PointF* points, const CFX_AffineMatrix* pMatrix, int& v1, int& v2)
+{
+ int pairs[] = {1, 2, 0, 2, 0, 1};
+ for (int i = 0; i < 3; i ++) {
+ int pair1 = pairs[i * 2];
+ int pair2 = pairs[i * 2 + 1];
+ FX_FLOAT x1 = points[pair1].X, x2 = points[pair2].X;
+ FX_FLOAT y1 = points[pair1].Y, y2 = points[pair2].Y;
+ if (pMatrix) {
+ pMatrix->Transform(x1, y1);
+ pMatrix->Transform(x2, y2);
+ }
+ FX_FLOAT dx = x1 - x2;
+ FX_FLOAT dy = y1 - y2;
+ FX_FLOAT distance_square = FXSYS_Mul(dx, dx) + FXSYS_Mul(dy, dy);
+ if (distance_square < (1.0f * 2 + 1.0f / 4)) {
+ v1 = i;
+ v2 = pair1;
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+BOOL CGdiplusExt::DrawPath(HDC hDC, const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ const CFX_GraphStateData* pGraphState,
+ FX_DWORD fill_argb,
+ FX_DWORD stroke_argb,
+ int fill_mode
+ )
+{
+ int nPoints = pPathData->GetPointCount();
+ if (nPoints == 0) {
+ return TRUE;
+ }
+ FX_PATHPOINT* pPoints = pPathData->GetPoints();
+ GpGraphics* pGraphics = NULL;
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ CallFunc(GdipCreateFromHDC)(hDC, &pGraphics);
+ CallFunc(GdipSetPageUnit)(pGraphics, UnitPixel);
+ CallFunc(GdipSetPixelOffsetMode)(pGraphics, PixelOffsetModeHalf);
+ GpMatrix* pMatrix = NULL;
+ if (pObject2Device) {
+ CallFunc(GdipCreateMatrix2)(pObject2Device->a, pObject2Device->b, pObject2Device->c, pObject2Device->d, pObject2Device->e, pObject2Device->f, &pMatrix);
+ CallFunc(GdipSetWorldTransform)(pGraphics, pMatrix);
+ }
+ PointF *points = FX_Alloc(PointF, nPoints);
+ if (!points) {
+ return FALSE;
+ }
+ BYTE * types = FX_Alloc(BYTE, nPoints);
+ if (!types) {
+ FX_Free(points);
+ return FALSE;
+ }
+ int nSubPathes = 0;
+ FX_BOOL bSubClose = FALSE;
+ int pos_subclose = 0;
+ FX_BOOL bSmooth = FALSE;
+ int startpoint = 0;
+ for(int i = 0; i < nPoints; i++) {
+ points[i].X = pPoints[i].m_PointX;
+ points[i].Y = pPoints[i].m_PointY;
+ FX_FLOAT x, y;
+ if (pObject2Device) {
+ pObject2Device->Transform(pPoints[i].m_PointX, pPoints[i].m_PointY, x, y);
+ } else {
+ x = pPoints[i].m_PointX;
+ y = pPoints[i].m_PointY;
+ }
+ if (x > 50000 * 1.0f) {
+ points[i].X = 50000 * 1.0f;
+ }
+ if (x < -50000 * 1.0f) {
+ points[i].X = -50000 * 1.0f;
+ }
+ if (y > 50000 * 1.0f) {
+ points[i].Y = 50000 * 1.0f;
+ }
+ if (y < -50000 * 1.0f) {
+ points[i].Y = -50000 * 1.0f;
+ }
+ int point_type = pPoints[i].m_Flag & FXPT_TYPE;
+ if(point_type == FXPT_MOVETO) {
+ types[i] = PathPointTypeStart;
+ nSubPathes ++;
+ bSubClose = FALSE;
+ startpoint = i;
+ } else if (point_type == FXPT_LINETO) {
+ types[i] = PathPointTypeLine;
+ if (pPoints[i - 1].m_Flag == FXPT_MOVETO && (i == nPoints - 1 || pPoints[i + 1].m_Flag == FXPT_MOVETO) &&
+ points[i].Y == points[i - 1].Y && points[i].X == points[i - 1].X) {
+ points[i].X += 0.01f;
+ continue;
+ }
+ if (!bSmooth && points[i].X != points[i - 1].X && points[i].Y != points[i - 1].Y) {
+ bSmooth = TRUE;
+ }
+ } else if (point_type == FXPT_BEZIERTO) {
+ types[i] = PathPointTypeBezier;
+ bSmooth = TRUE;
+ }
+ if (pPoints[i].m_Flag & FXPT_CLOSEFIGURE) {
+ if (bSubClose) {
+ types[pos_subclose] &= ~PathPointTypeCloseSubpath;
+ } else {
+ bSubClose = TRUE;
+ }
+ pos_subclose = i;
+ types[i] |= PathPointTypeCloseSubpath;
+ if (!bSmooth && points[i].X != points[startpoint].X && points[i].Y != points[startpoint].Y) {
+ bSmooth = TRUE;
+ }
+ }
+ }
+ if (fill_mode & FXFILL_NOPATHSMOOTH) {
+ bSmooth = FALSE;
+ CallFunc(GdipSetSmoothingMode)(pGraphics, SmoothingModeNone);
+ } else if (!(fill_mode & FXFILL_FULLCOVER)) {
+ if (!bSmooth && (fill_mode & 3)) {
+ bSmooth = TRUE;
+ }
+ if (bSmooth || pGraphState && pGraphState->m_LineWidth > 2) {
+ CallFunc(GdipSetSmoothingMode)(pGraphics, SmoothingModeAntiAlias);
+ }
+ }
+ int new_fill_mode = fill_mode & 3;
+ if (nPoints == 4 && pGraphState == NULL) {
+ int v1, v2;
+ if (IsSmallTriangle(points, pObject2Device, v1, v2)) {
+ GpPen* pPen = NULL;
+ CallFunc(GdipCreatePen1)(fill_argb, 1.0f, UnitPixel, &pPen);
+ CallFunc(GdipDrawLineI)(pGraphics, pPen, FXSYS_round(points[v1].X), FXSYS_round(points[v1].Y),
+ FXSYS_round(points[v2].X), FXSYS_round(points[v2].Y));
+ CallFunc(GdipDeletePen)(pPen);
+ return TRUE;
+ }
+ }
+ GpPath* pGpPath = NULL;
+ CallFunc(GdipCreatePath2)(points, types, nPoints, GdiFillType2Gdip(new_fill_mode), &pGpPath);
+ if (!pGpPath) {
+ if (pMatrix) {
+ CallFunc(GdipDeleteMatrix)(pMatrix);
+ }
+ FX_Free(points);
+ FX_Free(types);
+ CallFunc(GdipDeleteGraphics)(pGraphics);
+ return FALSE;
+ }
+ if (new_fill_mode) {
+ GpBrush* pBrush = _GdipCreateBrush(fill_argb);
+ CallFunc(GdipSetPathFillMode)(pGpPath, GdiFillType2Gdip(new_fill_mode));
+ CallFunc(GdipFillPath)(pGraphics, pBrush, pGpPath);
+ CallFunc(GdipDeleteBrush)(pBrush);
+ }
+ if (pGraphState && stroke_argb) {
+ GpPen* pPen = _GdipCreatePen(pGraphState, pObject2Device, stroke_argb, fill_mode & FX_STROKE_TEXT_MODE);
+ if (nSubPathes == 1) {
+ CallFunc(GdipDrawPath)(pGraphics, pPen, pGpPath);
+ } else {
+ int iStart = 0;
+ for (int i = 0; i < nPoints; i ++) {
+ if (i == nPoints - 1 || types[i + 1] == PathPointTypeStart) {
+ GpPath* pSubPath;
+ CallFunc(GdipCreatePath2)(points + iStart, types + iStart, i - iStart + 1, GdiFillType2Gdip(new_fill_mode), &pSubPath);
+ iStart = i + 1;
+ CallFunc(GdipDrawPath)(pGraphics, pPen, pSubPath);
+ CallFunc(GdipDeletePath)(pSubPath);
+ }
+ }
+ }
+ CallFunc(GdipDeletePen)(pPen);
+ }
+ if (pMatrix) {
+ CallFunc(GdipDeleteMatrix)(pMatrix);
+ }
+ FX_Free(points);
+ FX_Free(types);
+ CallFunc(GdipDeletePath)(pGpPath);
+ CallFunc(GdipDeleteGraphics)(pGraphics);
+ return TRUE;
+}
+class GpStream : public IStream, public CFX_Object
+{
+ LONG m_RefCount;
+ int m_ReadPos;
+ CFX_ByteTextBuf m_InterStream;
+public:
+ GpStream()
+ {
+ m_RefCount = 1;
+ m_ReadPos = 0;
+ }
+ virtual HRESULT STDMETHODCALLTYPE
+ QueryInterface(REFIID iid, void ** ppvObject)
+ {
+ if (iid == __uuidof(IUnknown) || iid == __uuidof(IStream) ||
+ iid == __uuidof(ISequentialStream)) {
+ *ppvObject = static_cast<IStream*>(this);
+ AddRef();
+ return S_OK;
+ } else {
+ return E_NOINTERFACE;
+ }
+ }
+ virtual ULONG STDMETHODCALLTYPE AddRef(void)
+ {
+ return (ULONG)InterlockedIncrement(&m_RefCount);
+ }
+ virtual ULONG STDMETHODCALLTYPE Release(void)
+ {
+ ULONG res = (ULONG) InterlockedDecrement(&m_RefCount);
+ if (res == 0) {
+ delete this;
+ }
+ return res;
+ }
+public:
+ virtual HRESULT STDMETHODCALLTYPE Read(void* Output, ULONG cb, ULONG* pcbRead)
+ {
+ size_t bytes_left;
+ size_t bytes_out;
+ if (pcbRead != NULL) {
+ *pcbRead = 0;
+ }
+ if (m_ReadPos == m_InterStream.GetLength()) {
+ return HRESULT_FROM_WIN32(ERROR_END_OF_MEDIA);
+ }
+ bytes_left = m_InterStream.GetLength() - m_ReadPos;
+ bytes_out = FX_MIN(cb, bytes_left);
+ FXSYS_memcpy32(Output, m_InterStream.GetBuffer() + m_ReadPos, bytes_out);
+ m_ReadPos += (FX_INT32)bytes_out;
+ if (pcbRead != NULL) {
+ *pcbRead = (ULONG)bytes_out;
+ }
+ return S_OK;
+ }
+ virtual HRESULT STDMETHODCALLTYPE Write(void const* Input, ULONG cb, ULONG* pcbWritten)
+ {
+ if (cb <= 0) {
+ if (pcbWritten != NULL) {
+ *pcbWritten = 0;
+ }
+ return S_OK;
+ }
+ m_InterStream.InsertBlock(m_InterStream.GetLength(), Input, cb);
+ if (pcbWritten != NULL) {
+ *pcbWritten = cb;
+ }
+ return S_OK;
+ }
+public:
+ virtual HRESULT STDMETHODCALLTYPE SetSize(ULARGE_INTEGER)
+ {
+ return E_NOTIMPL;
+ }
+ virtual HRESULT STDMETHODCALLTYPE CopyTo(IStream*, ULARGE_INTEGER, ULARGE_INTEGER*, ULARGE_INTEGER*)
+ {
+ return E_NOTIMPL;
+ }
+ virtual HRESULT STDMETHODCALLTYPE Commit(DWORD)
+ {
+ return E_NOTIMPL;
+ }
+ virtual HRESULT STDMETHODCALLTYPE Revert(void)
+ {
+ return E_NOTIMPL;
+ }
+ virtual HRESULT STDMETHODCALLTYPE LockRegion(ULARGE_INTEGER, ULARGE_INTEGER, DWORD)
+ {
+ return E_NOTIMPL;
+ }
+ virtual HRESULT STDMETHODCALLTYPE UnlockRegion(ULARGE_INTEGER, ULARGE_INTEGER, DWORD)
+ {
+ return E_NOTIMPL;
+ }
+ virtual HRESULT STDMETHODCALLTYPE Clone(IStream **)
+ {
+ return E_NOTIMPL;
+ }
+ virtual HRESULT STDMETHODCALLTYPE Seek(LARGE_INTEGER liDistanceToMove, DWORD dwOrigin, ULARGE_INTEGER* lpNewFilePointer)
+ {
+ long start = 0;
+ long new_read_position;
+ switch(dwOrigin) {
+ case STREAM_SEEK_SET:
+ start = 0;
+ break;
+ case STREAM_SEEK_CUR:
+ start = m_ReadPos;
+ break;
+ case STREAM_SEEK_END:
+ start = m_InterStream.GetLength();
+ break;
+ default:
+ return STG_E_INVALIDFUNCTION;
+ break;
+ }
+ new_read_position = start + (long)liDistanceToMove.QuadPart;
+ if (new_read_position < 0 || new_read_position > m_InterStream.GetLength()) {
+ return STG_E_SEEKERROR;
+ }
+ m_ReadPos = new_read_position;
+ if (lpNewFilePointer != NULL) {
+ lpNewFilePointer->QuadPart = m_ReadPos;
+ }
+ return S_OK;
+ }
+ virtual HRESULT STDMETHODCALLTYPE Stat(STATSTG* pStatstg, DWORD grfStatFlag)
+ {
+ if (pStatstg == NULL) {
+ return STG_E_INVALIDFUNCTION;
+ }
+ ZeroMemory(pStatstg, sizeof(STATSTG));
+ pStatstg->cbSize.QuadPart = m_InterStream.GetLength();
+ return S_OK;
+ }
+};
+typedef struct {
+ BITMAPINFO* pbmi;
+ int Stride;
+ LPBYTE pScan0;
+ GpBitmap* pBitmap;
+ BitmapData* pBitmapData;
+ GpStream* pStream;
+} PREVIEW3_DIBITMAP;
+static PREVIEW3_DIBITMAP* LoadDIBitmap(WINDIB_Open_Args_ args)
+{
+ GpBitmap* pBitmap;
+ GpStream* pStream = NULL;
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ Status status = Ok;
+ if (args.flags == WINDIB_OPEN_PATHNAME) {
+ status = CallFunc(GdipCreateBitmapFromFileICM)((wchar_t*)args.path_name, &pBitmap);
+ } else {
+ if (args.memory_size == 0 || !args.memory_base) {
+ return NULL;
+ }
+ pStream = FX_NEW GpStream;
+ if (!pStream) {
+ return NULL;
+ }
+ pStream->Write(args.memory_base, (ULONG)args.memory_size, NULL);
+ status = CallFunc(GdipCreateBitmapFromStreamICM)(pStream, &pBitmap);
+ }
+ if (status != Ok) {
+ if (pStream) {
+ pStream->Release();
+ }
+ return NULL;
+ }
+ UINT height, width;
+ CallFunc(GdipGetImageHeight)(pBitmap, &height);
+ CallFunc(GdipGetImageWidth)(pBitmap, &width);
+ PixelFormat pixel_format;
+ CallFunc(GdipGetImagePixelFormat)(pBitmap, &pixel_format);
+ int info_size = sizeof(BITMAPINFOHEADER);
+ int bpp = 24;
+ int dest_pixel_format = PixelFormat24bppRGB;
+ if (pixel_format == PixelFormat1bppIndexed) {
+ info_size += 8;
+ bpp = 1;
+ dest_pixel_format = PixelFormat1bppIndexed;
+ } else if (pixel_format == PixelFormat8bppIndexed) {
+ info_size += 1024;
+ bpp = 8;
+ dest_pixel_format = PixelFormat8bppIndexed;
+ } else if (pixel_format == PixelFormat32bppARGB) {
+ bpp = 32;
+ dest_pixel_format = PixelFormat32bppARGB;
+ }
+ LPBYTE buf = FX_Alloc(BYTE, info_size);
+ if (!buf) {
+ if (pStream) {
+ pStream->Release();
+ }
+ return NULL;
+ }
+ BITMAPINFOHEADER* pbmih = (BITMAPINFOHEADER*)buf;
+ FXSYS_memset32(buf, 0, info_size);
+ pbmih->biBitCount = bpp;
+ pbmih->biCompression = BI_RGB;
+ pbmih->biHeight = -(int)height;
+ pbmih->biPlanes = 1;
+ pbmih->biWidth = width;
+ Rect rect(0, 0, width, height);
+ BitmapData* pBitmapData = FX_Alloc(BitmapData, 1);
+ if (!pBitmapData) {
+ if (pStream) {
+ pStream->Release();
+ }
+ return NULL;
+ }
+ CallFunc(GdipBitmapLockBits)(pBitmap, &rect, ImageLockModeRead,
+ dest_pixel_format, pBitmapData);
+ if (pixel_format == PixelFormat1bppIndexed || pixel_format == PixelFormat8bppIndexed) {
+ DWORD* ppal = (DWORD*)(buf + sizeof(BITMAPINFOHEADER));
+ struct {
+ UINT flags;
+ UINT Count;
+ DWORD Entries[256];
+ } pal;
+ int size = 0;
+ CallFunc(GdipGetImagePaletteSize)(pBitmap, &size);
+ CallFunc(GdipGetImagePalette)(pBitmap, (ColorPalette*)&pal, size);
+ int entries = pixel_format == PixelFormat1bppIndexed ? 2 : 256;
+ for (int i = 0; i < entries; i ++) {
+ ppal[i] = pal.Entries[i] & 0x00ffffff;
+ }
+ }
+ PREVIEW3_DIBITMAP* pInfo = FX_Alloc(PREVIEW3_DIBITMAP, 1);
+ if (!pInfo) {
+ if (pStream) {
+ pStream->Release();
+ }
+ return NULL;
+ }
+ pInfo->pbmi = (BITMAPINFO*)buf;
+ pInfo->pScan0 = (LPBYTE)pBitmapData->Scan0;
+ pInfo->Stride = pBitmapData->Stride;
+ pInfo->pBitmap = pBitmap;
+ pInfo->pBitmapData = pBitmapData;
+ pInfo->pStream = pStream;
+ return pInfo;
+}
+static void FreeDIBitmap(PREVIEW3_DIBITMAP* pInfo)
+{
+ CGdiplusExt& GdiplusExt = ((CWin32Platform*)CFX_GEModule::Get()->GetPlatformData())->m_GdiplusExt;
+ CallFunc(GdipBitmapUnlockBits)(pInfo->pBitmap, pInfo->pBitmapData);
+ CallFunc(GdipDisposeImage)(pInfo->pBitmap);
+ FX_Free(pInfo->pBitmapData);
+ FX_Free((LPBYTE)pInfo->pbmi);
+ if (pInfo->pStream) {
+ pInfo->pStream->Release();
+ }
+ FX_Free(pInfo);
+}
+CFX_DIBitmap* _FX_WindowsDIB_LoadFromBuf(BITMAPINFO* pbmi, LPVOID pData, FX_BOOL bAlpha);
+CFX_DIBitmap* CGdiplusExt::LoadDIBitmap(WINDIB_Open_Args_ args)
+{
+ PREVIEW3_DIBITMAP* pInfo = ::LoadDIBitmap(args);
+ if (pInfo == NULL) {
+ return NULL;
+ }
+ int height = abs(pInfo->pbmi->bmiHeader.biHeight);
+ int width = pInfo->pbmi->bmiHeader.biWidth;
+ int dest_pitch = (width * pInfo->pbmi->bmiHeader.biBitCount + 31) / 32 * 4;
+ LPBYTE pData = FX_Alloc(BYTE, dest_pitch * height);
+ if (pData == NULL) {
+ FreeDIBitmap(pInfo);
+ return NULL;
+ }
+ if (dest_pitch == pInfo->Stride) {
+ FXSYS_memcpy32(pData, pInfo->pScan0, dest_pitch * height);
+ } else for (int i = 0; i < height; i ++) {
+ FXSYS_memcpy32(pData + dest_pitch * i, pInfo->pScan0 + pInfo->Stride * i, dest_pitch);
+ }
+ CFX_DIBitmap* pDIBitmap = _FX_WindowsDIB_LoadFromBuf(pInfo->pbmi, pData, pInfo->pbmi->bmiHeader.biBitCount == 32);
+ FX_Free(pData);
+ FreeDIBitmap(pInfo);
+ return pDIBitmap;
+}
+#endif
diff --git a/core/src/fxge/win32/fx_win32_print.cpp b/core/src/fxge/win32/fx_win32_print.cpp
new file mode 100644
index 0000000000..c08c8e7bb6
--- /dev/null
+++ b/core/src/fxge/win32/fx_win32_print.cpp
@@ -0,0 +1,426 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "../../../include/fxge/fx_ge.h"
+#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_
+#include <windows.h>
+#include "../../../include/fxge/fx_ge_win32.h"
+#include "win32_int.h"
+#include "../../../include/fxge/fx_freetype.h"
+#include "../ge/text_int.h"
+#include "../dib/dib_int.h"
+#define SIZETHRESHOLD 1000
+#define OUTPUTPSLEN 4096
+CGdiPrinterDriver::CGdiPrinterDriver(HDC hDC) : CGdiDeviceDriver(hDC, FXDC_PRINTER)
+{
+ m_HorzSize = ::GetDeviceCaps(m_hDC, HORZSIZE);
+ m_VertSize = ::GetDeviceCaps(m_hDC, VERTSIZE);
+ m_bSupportROP = TRUE;
+}
+int CGdiPrinterDriver::GetDeviceCaps(int caps_id)
+{
+ if (caps_id == FXDC_HORZ_SIZE) {
+ return m_HorzSize;
+ }
+ if (caps_id == FXDC_VERT_SIZE) {
+ return m_VertSize;
+ }
+ return CGdiDeviceDriver::GetDeviceCaps(caps_id);
+}
+FX_BOOL CGdiPrinterDriver::SetDIBits(const CFX_DIBSource* pSource, FX_DWORD color, const FX_RECT* pSrcRect, int left, int top, int blend_type,
+ int alpha_flag, void* pIccTransform)
+{
+ if (pSource->IsAlphaMask()) {
+ FX_RECT clip_rect(left, top, left + pSrcRect->Width(), top + pSrcRect->Height());
+ return StretchDIBits(pSource, color, left - pSrcRect->left, top - pSrcRect->top, pSource->GetWidth(), pSource->GetHeight(),
+ &clip_rect, 0, alpha_flag, pIccTransform, FXDIB_BLEND_NORMAL);
+ }
+ ASSERT(pSource != NULL && !pSource->IsAlphaMask() && pSrcRect != NULL);
+ ASSERT(blend_type == FXDIB_BLEND_NORMAL);
+ if (pSource->HasAlpha()) {
+ return FALSE;
+ }
+ CFX_DIBExtractor temp(pSource);
+ CFX_DIBitmap* pBitmap = temp;
+ if (pBitmap == NULL) {
+ return FALSE;
+ }
+ return GDI_SetDIBits(pBitmap, pSrcRect, left, top, pIccTransform);
+}
+FX_BOOL CGdiPrinterDriver::StretchDIBits(const CFX_DIBSource* pSource, FX_DWORD color, int dest_left, int dest_top,
+ int dest_width, int dest_height, const FX_RECT* pClipRect, FX_DWORD flags,
+ int alpha_flag, void* pIccTransform, int blend_type)
+{
+ if (pSource->IsAlphaMask()) {
+ int alpha = FXGETFLAG_COLORTYPE(alpha_flag) ? FXGETFLAG_ALPHA_FILL(alpha_flag) : FXARGB_A(color);
+ if (pSource->GetBPP() != 1 || alpha != 255 || !m_bSupportROP) {
+ return FALSE;
+ }
+ if (dest_width < 0 || dest_height < 0) {
+ CFX_DIBitmap* pFlipped = pSource->FlipImage(dest_width < 0, dest_height < 0);
+ if (pFlipped == NULL) {
+ return FALSE;
+ }
+ if (dest_width < 0) {
+ dest_left += dest_width;
+ }
+ if (dest_height < 0) {
+ dest_top += dest_height;
+ }
+ FX_BOOL ret = GDI_StretchBitMask(pFlipped, dest_left, dest_top, abs(dest_width), abs(dest_height), color, flags, alpha_flag, pIccTransform);
+ delete pFlipped;
+ return ret;
+ }
+ CFX_DIBExtractor temp(pSource);
+ CFX_DIBitmap* pBitmap = temp;
+ if (pBitmap == NULL) {
+ return FALSE;
+ }
+ return GDI_StretchBitMask(pBitmap, dest_left, dest_top, dest_width, dest_height, color, flags, alpha_flag, pIccTransform);
+ } else {
+ ASSERT(pSource != NULL);
+ if (pSource->HasAlpha()) {
+ return FALSE;
+ }
+ if (dest_width < 0 || dest_height < 0) {
+ CFX_DIBitmap* pFlipped = pSource->FlipImage(dest_width < 0, dest_height < 0);
+ if (pFlipped == NULL) {
+ return FALSE;
+ }
+ if (dest_width < 0) {
+ dest_left += dest_width;
+ }
+ if (dest_height < 0) {
+ dest_top += dest_height;
+ }
+ FX_BOOL ret = GDI_StretchDIBits(pFlipped, dest_left, dest_top, abs(dest_width), abs(dest_height), flags, pIccTransform);
+ delete pFlipped;
+ return ret;
+ }
+ CFX_DIBExtractor temp(pSource);
+ CFX_DIBitmap* pBitmap = temp;
+ if (pBitmap == NULL) {
+ return FALSE;
+ }
+ return GDI_StretchDIBits(pBitmap, dest_left, dest_top, dest_width, dest_height, flags, pIccTransform);
+ }
+}
+static CFX_DIBitmap* Transform1bppBitmap(const CFX_DIBSource* pSrc, const CFX_AffineMatrix* pDestMatrix)
+{
+ ASSERT(pSrc->GetFormat() == FXDIB_1bppRgb || pSrc->GetFormat() == FXDIB_1bppMask || pSrc->GetFormat() == FXDIB_1bppCmyk);
+ CFX_FloatRect unit_rect = pDestMatrix->GetUnitRect();
+ FX_RECT full_rect = unit_rect.GetOutterRect();
+ int full_left = full_rect.left;
+ int full_top = full_rect.top;
+ CFX_DIBExtractor src_bitmap(pSrc);
+ CFX_DIBitmap* pSrcBitmap = src_bitmap;
+ if (pSrcBitmap == NULL) {
+ return NULL;
+ }
+ int src_width = pSrcBitmap->GetWidth(), src_height = pSrcBitmap->GetHeight();
+ FX_LPBYTE src_buf = pSrcBitmap->GetBuffer();
+ FX_DWORD src_pitch = pSrcBitmap->GetPitch();
+ FX_FLOAT dest_area = pDestMatrix->GetUnitArea();
+ FX_FLOAT area_scale = FXSYS_Div((FX_FLOAT)(src_width * src_height), dest_area);
+ FX_FLOAT size_scale = FXSYS_sqrt(area_scale);
+ CFX_AffineMatrix adjusted_matrix(*pDestMatrix);
+ adjusted_matrix.Scale(size_scale, size_scale);
+ CFX_FloatRect result_rect_f = adjusted_matrix.GetUnitRect();
+ FX_RECT result_rect = result_rect_f.GetOutterRect();
+ CFX_AffineMatrix src2result;
+ src2result.e = adjusted_matrix.c + adjusted_matrix.e;
+ src2result.f = adjusted_matrix.d + adjusted_matrix.f;
+ src2result.a = adjusted_matrix.a / pSrcBitmap->GetWidth();
+ src2result.b = adjusted_matrix.b / pSrcBitmap->GetWidth();
+ src2result.c = -adjusted_matrix.c / pSrcBitmap->GetHeight();
+ src2result.d = -adjusted_matrix.d / pSrcBitmap->GetHeight();
+ src2result.TranslateI(-result_rect.left, -result_rect.top);
+ CFX_AffineMatrix result2src;
+ result2src.SetReverse(src2result);
+ CPDF_FixedMatrix result2src_fix(result2src, 8);
+ int result_width = result_rect.Width();
+ int result_height = result_rect.Height();
+ CFX_DIBitmap* pTempBitmap = FX_NEW CFX_DIBitmap;
+ if (!pTempBitmap) {
+ if (pSrcBitmap != src_bitmap) {
+ delete pSrcBitmap;
+ }
+ return NULL;
+ }
+ if (!pTempBitmap->Create(result_width, result_height, pSrc->GetFormat())) {
+ delete pTempBitmap;
+ if (pSrcBitmap != src_bitmap) {
+ delete pSrcBitmap;
+ }
+ return NULL;
+ }
+ pTempBitmap->CopyPalette(pSrc->GetPalette());
+ FX_LPBYTE dest_buf = pTempBitmap->GetBuffer();
+ int dest_pitch = pTempBitmap->GetPitch();
+ FXSYS_memset8(dest_buf, pSrc->IsAlphaMask() ? 0 : 0xff, dest_pitch * result_height);
+ if (pSrcBitmap->IsAlphaMask()) {
+ for (int dest_y = 0; dest_y < result_height; dest_y ++) {
+ FX_LPBYTE dest_scan = dest_buf + dest_y * dest_pitch;
+ for (int dest_x = 0; dest_x < result_width; dest_x ++) {
+ int src_x, src_y;
+ result2src_fix.Transform(dest_x, dest_y, src_x, src_y);
+ if (src_x < 0 || src_x >= src_width || src_y < 0 || src_y >= src_height) {
+ continue;
+ }
+ if (!((src_buf + src_pitch * src_y)[src_x / 8] & (1 << (7 - src_x % 8)))) {
+ continue;
+ }
+ dest_scan[dest_x / 8] |= 1 << (7 - dest_x % 8);
+ }
+ }
+ } else {
+ for (int dest_y = 0; dest_y < result_height; dest_y ++) {
+ FX_LPBYTE dest_scan = dest_buf + dest_y * dest_pitch;
+ for (int dest_x = 0; dest_x < result_width; dest_x ++) {
+ int src_x, src_y;
+ result2src_fix.Transform(dest_x, dest_y, src_x, src_y);
+ if (src_x < 0 || src_x >= src_width || src_y < 0 || src_y >= src_height) {
+ continue;
+ }
+ if ((src_buf + src_pitch * src_y)[src_x / 8] & (1 << (7 - src_x % 8))) {
+ continue;
+ }
+ dest_scan[dest_x / 8] &= ~(1 << (7 - dest_x % 8));
+ }
+ }
+ }
+ if (pSrcBitmap != src_bitmap) {
+ delete pSrcBitmap;
+ }
+ return pTempBitmap;
+}
+FX_BOOL CGdiPrinterDriver::StartDIBits(const CFX_DIBSource* pSource, int bitmap_alpha, FX_DWORD color,
+ const CFX_AffineMatrix* pMatrix, FX_DWORD render_flags, FX_LPVOID& handle,
+ int alpha_flag, void* pIccTransform, int blend_type)
+{
+ if (bitmap_alpha < 255 || pSource->HasAlpha() || (pSource->IsAlphaMask() && (pSource->GetBPP() != 1 || !m_bSupportROP))) {
+ return FALSE;
+ }
+ CFX_FloatRect unit_rect = pMatrix->GetUnitRect();
+ FX_RECT full_rect = unit_rect.GetOutterRect();
+ if (FXSYS_fabs(pMatrix->b) < 0.5f && pMatrix->a != 0 && FXSYS_fabs(pMatrix->c) < 0.5f && pMatrix->d != 0) {
+ FX_BOOL bFlipX = pMatrix->a < 0;
+ FX_BOOL bFlipY = pMatrix->d > 0;
+ return StretchDIBits(pSource, color, bFlipX ? full_rect.right : full_rect.left, bFlipY ? full_rect.bottom : full_rect.top,
+ bFlipX ? -full_rect.Width() : full_rect.Width(), bFlipY ? -full_rect.Height() : full_rect.Height(), NULL, 0,
+ alpha_flag, pIccTransform, blend_type);
+ }
+ if (FXSYS_fabs(pMatrix->a) < 0.5f && FXSYS_fabs(pMatrix->d) < 0.5f) {
+ CFX_DIBitmap* pTransformed = pSource->SwapXY(pMatrix->c > 0, pMatrix->b < 0);
+ if (pTransformed == NULL) {
+ return FALSE;
+ }
+ FX_BOOL ret = StretchDIBits(pTransformed, color, full_rect.left, full_rect.top, full_rect.Width(), full_rect.Height(), NULL, 0,
+ alpha_flag, pIccTransform, blend_type);
+ delete pTransformed;
+ return ret;
+ }
+ if (pSource->GetBPP() == 1) {
+ CFX_DIBitmap* pTransformed = Transform1bppBitmap(pSource, pMatrix);
+ if (pIccTransform == NULL) {
+ return FALSE;
+ }
+ SaveState();
+ CFX_PathData path;
+ path.AppendRect(0, 0, 1.0f, 1.0f);
+ SetClip_PathFill(&path, pMatrix, WINDING);
+ FX_BOOL ret = StretchDIBits(pTransformed, color, full_rect.left, full_rect.top, full_rect.Width(), full_rect.Height(), NULL, 0,
+ alpha_flag, pIccTransform, blend_type);
+ RestoreState();
+ delete pTransformed;
+ handle = NULL;
+ return ret;
+ }
+ return FALSE;
+}
+CPSOutput::CPSOutput(HDC hDC)
+{
+ m_hDC = hDC;
+ m_pBuf = NULL;
+}
+CPSOutput::~CPSOutput()
+{
+ if (m_pBuf) {
+ FX_Free(m_pBuf);
+ }
+}
+void CPSOutput::Init()
+{
+ m_pBuf = FX_Alloc(FX_CHAR, 1026);
+}
+void CPSOutput::OutputPS(FX_LPCSTR string, int len)
+{
+ if (len < 0) {
+ len = (int)FXSYS_strlen(string);
+ }
+ int sent_len = 0;
+ while (len > 0) {
+ int send_len = len > 1024 ? 1024 : len;
+ *(FX_WORD*)m_pBuf = send_len;
+ FXSYS_memcpy(m_pBuf + 2, string + sent_len, send_len);
+ int ret = ExtEscape(m_hDC, PASSTHROUGH, send_len + 2, m_pBuf, 0, NULL);
+ sent_len += send_len;
+ len -= send_len;
+ }
+}
+CPSPrinterDriver::CPSPrinterDriver()
+{
+ m_pPSOutput = NULL;
+ m_bCmykOutput = FALSE;
+}
+CPSPrinterDriver::~CPSPrinterDriver()
+{
+ EndRendering();
+ if (m_pPSOutput) {
+ delete m_pPSOutput;
+ }
+}
+FX_BOOL CPSPrinterDriver::Init(HDC hDC, int pslevel, FX_BOOL bCmykOutput)
+{
+ m_hDC = hDC;
+ m_HorzSize = ::GetDeviceCaps(m_hDC, HORZSIZE);
+ m_VertSize = ::GetDeviceCaps(m_hDC, VERTSIZE);
+ m_Width = ::GetDeviceCaps(m_hDC, HORZRES);
+ m_Height = ::GetDeviceCaps(m_hDC, VERTRES);
+ m_nBitsPerPixel = ::GetDeviceCaps(m_hDC, BITSPIXEL);
+ m_pPSOutput = FX_NEW CPSOutput(hDC);
+ if (!m_pPSOutput) {
+ return FALSE;
+ }
+ ((CPSOutput*)m_pPSOutput)->Init();
+ m_PSRenderer.Init(m_pPSOutput, pslevel, m_Width, m_Height, bCmykOutput);
+ m_bCmykOutput = bCmykOutput;
+ HRGN hRgn = ::CreateRectRgn(0, 0, 1, 1);
+ int ret = ::GetClipRgn(hDC, hRgn);
+ if (ret == 1) {
+ ret = ::GetRegionData(hRgn, 0, NULL);
+ if (ret) {
+ RGNDATA* pData = (RGNDATA*)FX_Alloc(FX_BYTE, ret);
+ if (!pData) {
+ return FALSE;
+ }
+ ret = ::GetRegionData(hRgn, ret, pData);
+ if (ret) {
+ CFX_PathData path;
+ path.AllocPointCount(pData->rdh.nCount * 5);
+ for (FX_DWORD i = 0; i < pData->rdh.nCount; i ++) {
+ RECT* pRect = (RECT*)(pData->Buffer + pData->rdh.nRgnSize * i);
+ path.AppendRect((FX_FLOAT)pRect->left, (FX_FLOAT)pRect->bottom, (FX_FLOAT)pRect->right, (FX_FLOAT)pRect->top);
+ }
+ m_PSRenderer.SetClip_PathFill(&path, NULL, FXFILL_WINDING);
+ }
+ FX_Free(pData);
+ }
+ }
+ ::DeleteObject(hRgn);
+ return TRUE;
+}
+int CPSPrinterDriver::GetDeviceCaps(int caps_id)
+{
+ switch (caps_id) {
+ case FXDC_DEVICE_CLASS:
+ return FXDC_PRINTER;
+ case FXDC_PIXEL_WIDTH:
+ return m_Width;
+ case FXDC_PIXEL_HEIGHT:
+ return m_Height;
+ case FXDC_BITS_PIXEL:
+ return m_nBitsPerPixel;
+ case FXDC_RENDER_CAPS:
+ return m_bCmykOutput ? FXRC_BIT_MASK | FXRC_CMYK_OUTPUT : FXRC_BIT_MASK;
+ case FXDC_HORZ_SIZE:
+ return m_HorzSize;
+ case FXDC_VERT_SIZE:
+ return m_VertSize;
+ }
+ return 0;
+}
+FX_BOOL CPSPrinterDriver::StartRendering()
+{
+ return m_PSRenderer.StartRendering();
+}
+void CPSPrinterDriver::EndRendering()
+{
+ m_PSRenderer.EndRendering();
+}
+void CPSPrinterDriver::SaveState()
+{
+ m_PSRenderer.SaveState();
+}
+void CPSPrinterDriver::RestoreState(FX_BOOL bKeepSaved)
+{
+ m_PSRenderer.RestoreState(bKeepSaved);
+}
+FX_BOOL CPSPrinterDriver::SetClip_PathFill(const CFX_PathData* pPathData, const CFX_AffineMatrix* pObject2Device,
+ int fill_mode)
+{
+ m_PSRenderer.SetClip_PathFill(pPathData, pObject2Device, fill_mode);
+ return TRUE;
+}
+FX_BOOL CPSPrinterDriver::SetClip_PathStroke(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ const CFX_GraphStateData* pGraphState)
+{
+ m_PSRenderer.SetClip_PathStroke(pPathData, pObject2Device, pGraphState);
+ return TRUE;
+}
+FX_BOOL CPSPrinterDriver::DrawPath(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ const CFX_GraphStateData* pGraphState, FX_ARGB fill_color, FX_ARGB stroke_color,
+ int fill_mode, int alpha_flag, void* pIccTransform, int blend_type)
+{
+ if (blend_type != FXDIB_BLEND_NORMAL) {
+ return FALSE;
+ }
+ return m_PSRenderer.DrawPath(pPathData, pObject2Device, pGraphState, fill_color, stroke_color, fill_mode & 3, alpha_flag, pIccTransform);
+}
+FX_BOOL CPSPrinterDriver::GetClipBox(FX_RECT* pRect)
+{
+ *pRect = m_PSRenderer.GetClipBox();
+ return TRUE;
+}
+FX_BOOL CPSPrinterDriver::SetDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, const FX_RECT* pSrcRect, int left, int top, int blend_type,
+ int alpha_flag, void* pIccTransform)
+{
+ if (blend_type != FXDIB_BLEND_NORMAL) {
+ return FALSE;
+ }
+ return m_PSRenderer.SetDIBits(pBitmap, color, left, top, alpha_flag, pIccTransform);
+}
+FX_BOOL CPSPrinterDriver::StretchDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, int dest_left, int dest_top,
+ int dest_width, int dest_height, const FX_RECT* pClipRect, FX_DWORD flags,
+ int alpha_flag, void* pIccTransform, int blend_type)
+{
+ if (blend_type != FXDIB_BLEND_NORMAL) {
+ return FALSE;
+ }
+ return m_PSRenderer.StretchDIBits(pBitmap, color, dest_left, dest_top, dest_width, dest_height, flags, alpha_flag, pIccTransform);
+}
+FX_BOOL CPSPrinterDriver::StartDIBits(const CFX_DIBSource* pBitmap, int bitmap_alpha, FX_DWORD color,
+ const CFX_AffineMatrix* pMatrix, FX_DWORD render_flags, FX_LPVOID& handle,
+ int alpha_flag, void* pIccTransform, int blend_type)
+{
+ if (blend_type != FXDIB_BLEND_NORMAL) {
+ return FALSE;
+ }
+ if (bitmap_alpha < 255) {
+ return FALSE;
+ }
+ handle = NULL;
+ return m_PSRenderer.DrawDIBits(pBitmap, color, pMatrix, render_flags, alpha_flag, pIccTransform);
+}
+FX_BOOL CPSPrinterDriver::DrawDeviceText(int nChars, const FXTEXT_CHARPOS* pCharPos, CFX_Font* pFont,
+ CFX_FontCache* pCache, const CFX_AffineMatrix* pObject2Device, FX_FLOAT font_size, FX_DWORD color,
+ int alpha_flag, void* pIccTransform)
+{
+ return m_PSRenderer.DrawText(nChars, pCharPos, pFont, pCache, pObject2Device, font_size, color, alpha_flag, pIccTransform);
+}
+#endif
diff --git a/core/src/fxge/win32/win32_int.h b/core/src/fxge/win32/win32_int.h
new file mode 100644
index 0000000000..3f940eda1e
--- /dev/null
+++ b/core/src/fxge/win32/win32_int.h
@@ -0,0 +1,238 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+struct WINDIB_Open_Args_;
+class CGdiplusExt
+{
+public:
+ CGdiplusExt();
+ ~CGdiplusExt();
+ void Load();
+ FX_BOOL IsAvailable()
+ {
+ return m_hModule != NULL;
+ }
+ FX_BOOL StretchBitMask(HDC hDC, BOOL bMonoDevice, const CFX_DIBitmap* pBitmap, int dest_left, int dest_top,
+ int dest_width, int dest_height, FX_DWORD argb, const FX_RECT* pClipRect, int flags);
+ FX_BOOL StretchDIBits(HDC hDC, const CFX_DIBitmap* pBitmap, int dest_left, int dest_top,
+ int dest_width, int dest_height, const FX_RECT* pClipRect, int flags);
+ FX_BOOL DrawPath(HDC hDC, const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ const CFX_GraphStateData* pGraphState,
+ FX_DWORD fill_argb,
+ FX_DWORD stroke_argb,
+ int fill_mode
+ );
+
+ void* LoadMemFont(FX_BYTE* pData, FX_DWORD size);
+ void DeleteMemFont(void* pFontCollection);
+ FX_BOOL GdipCreateFromImage(void* bitmap, void** graphics);
+ void GdipDeleteGraphics(void* graphics);
+ void GdipSetTextRenderingHint(void* graphics, int mode);
+ void GdipSetPageUnit(void* graphics, FX_DWORD unit);
+ void GdipSetWorldTransform(void* graphics, void* pMatrix);
+ FX_BOOL GdipDrawDriverString(void *graphics, unsigned short *text, int length, void *font, void* brush, void *positions, int flags, const void *matrix);
+ void GdipCreateBrush(FX_DWORD fill_argb, void** pBrush);
+ void GdipDeleteBrush(void* pBrush);
+ void GdipCreateMatrix(FX_FLOAT a, FX_FLOAT b, FX_FLOAT c, FX_FLOAT d, FX_FLOAT e, FX_FLOAT f, void** matrix);
+ void GdipDeleteMatrix(void* matrix);
+ FX_BOOL GdipCreateFontFamilyFromName(FX_LPCWSTR name, void* pFontCollection, void**pFamily);
+ void GdipDeleteFontFamily(void* pFamily);
+ FX_BOOL GdipCreateFontFromFamily(void* pFamily, FX_FLOAT font_size, int fontstyle, int flag, void** pFont);
+ void* GdipCreateFontFromCollection(void* pFontCollection, FX_FLOAT font_size, int fontstyle);
+ void GdipDeleteFont(void* pFont);
+ FX_BOOL GdipCreateBitmap(CFX_DIBitmap* pBitmap, void**bitmap);
+ void GdipDisposeImage(void* bitmap);
+ void GdipGetFontSize(void *pFont, FX_FLOAT *size);
+ void* GdiAddFontMemResourceEx(void *pFontdata, FX_DWORD size, void* pdv, FX_DWORD* num_face);
+ FX_BOOL GdiRemoveFontMemResourceEx(void* handle);
+ void* m_Functions[100];
+ void* m_pGdiAddFontMemResourceEx;
+ void* m_pGdiRemoveFontMemResourseEx;
+ CFX_DIBitmap* LoadDIBitmap(WINDIB_Open_Args_ args);
+protected:
+ HMODULE m_hModule;
+ HMODULE m_GdiModule;
+};
+#include "dwrite_int.h"
+class CWin32Platform : public CFX_Object
+{
+public:
+ FX_BOOL m_bHalfTone;
+ CGdiplusExt m_GdiplusExt;
+ CDWriteExt m_DWriteExt;
+};
+class CGdiDeviceDriver : public IFX_RenderDeviceDriver
+{
+protected:
+ virtual int GetDeviceCaps(int caps_id);
+ virtual void SaveState()
+ {
+ SaveDC(m_hDC);
+ }
+ virtual void RestoreState(FX_BOOL bKeepSaved = FALSE)
+ {
+ RestoreDC(m_hDC, -1);
+ if (bKeepSaved) {
+ SaveDC(m_hDC);
+ }
+ }
+ virtual FX_BOOL SetClip_PathFill(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ int fill_mode
+ );
+ virtual FX_BOOL SetClip_PathStroke(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ const CFX_GraphStateData* pGraphState
+ );
+ virtual FX_BOOL DrawPath(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ const CFX_GraphStateData* pGraphState,
+ FX_DWORD fill_color,
+ FX_DWORD stroke_color,
+ int fill_mode,
+ int alpha_flag,
+ void* pIccTransform,
+ int blend_type
+ );
+ virtual FX_BOOL FillRect(const FX_RECT* pRect,
+ FX_DWORD fill_color,
+ int alpha_flag, void* pIccTransform, int blend_type);
+ virtual FX_BOOL DrawCosmeticLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2, FX_DWORD color,
+ int alpha_flag, void* pIccTransform, int blend_type);
+ virtual FX_LPVOID GetClipRgn() ;
+ virtual FX_BOOL SetClipRgn(FX_LPVOID pRgn) ;
+ virtual FX_BOOL GetClipBox(FX_RECT* pRect);
+ virtual FX_BOOL DeleteDeviceRgn(FX_LPVOID pRgn);
+ virtual void DrawLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2);
+ virtual void* GetPlatformSurface()
+ {
+ return (void*)m_hDC;
+ }
+ FX_BOOL GDI_SetDIBits(const CFX_DIBitmap* pBitmap, const FX_RECT* pSrcRect, int left, int top,
+ void* pIccTransform);
+ FX_BOOL GDI_StretchDIBits(const CFX_DIBitmap* pBitmap, int dest_left, int dest_top,
+ int dest_width, int dest_height, FX_DWORD flags,
+ void* pIccTransform);
+ FX_BOOL GDI_StretchBitMask(const CFX_DIBitmap* pBitmap, int dest_left, int dest_top,
+ int dest_width, int dest_height, FX_DWORD bitmap_color, FX_DWORD flags,
+ int alpha_flag, void* pIccTransform);
+ HDC m_hDC;
+ int m_Width, m_Height, m_nBitsPerPixel;
+ int m_DeviceClass, m_RenderCaps;
+ CGdiDeviceDriver(HDC hDC, int device_class);
+ ~CGdiDeviceDriver() {}
+};
+class CGdiDisplayDriver : public CGdiDeviceDriver
+{
+public:
+ CGdiDisplayDriver(HDC hDC);
+protected:
+ virtual FX_BOOL GetDIBits(CFX_DIBitmap* pBitmap, int left, int top, void* pIccTransform = NULL, FX_BOOL bDEdge = FALSE);
+ virtual FX_BOOL SetDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, const FX_RECT* pSrcRect, int left, int top, int blend_type,
+ int alpha_flag, void* pIccTransform);
+ virtual FX_BOOL StretchDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, int dest_left, int dest_top,
+ int dest_width, int dest_height, const FX_RECT* pClipRect, FX_DWORD flags,
+ int alpha_flag, void* pIccTransform, int blend_type);
+ virtual FX_BOOL StartDIBits(const CFX_DIBSource* pBitmap, int bitmap_alpha, FX_DWORD color,
+ const CFX_AffineMatrix* pMatrix, FX_DWORD render_flags, FX_LPVOID& handle,
+ int alpha_flag, void* pIccTransform, int blend_type)
+ {
+ return FALSE;
+ }
+ FX_BOOL UseFoxitStretchEngine(const CFX_DIBSource* pSource, FX_DWORD color, int dest_left, int dest_top,
+ int dest_width, int dest_height, const FX_RECT* pClipRect, int render_flags,
+ int alpha_flag = 0, void* pIccTransform = NULL, int blend_type = FXDIB_BLEND_NORMAL);
+};
+class CGdiPrinterDriver : public CGdiDeviceDriver
+{
+public:
+ CGdiPrinterDriver(HDC hDC);
+protected:
+ virtual int GetDeviceCaps(int caps_id);
+ virtual FX_BOOL SetDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, const FX_RECT* pSrcRect, int left, int top, int blend_type,
+ int alpha_flag, void* pIccTransform);
+ virtual FX_BOOL StretchDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, int dest_left, int dest_top,
+ int dest_width, int dest_height, const FX_RECT* pClipRect, FX_DWORD flags,
+ int alpha_flag, void* pIccTransform, int blend_type);
+ virtual FX_BOOL StartDIBits(const CFX_DIBSource* pBitmap, int bitmap_alpha, FX_DWORD color,
+ const CFX_AffineMatrix* pMatrix, FX_DWORD render_flags, FX_LPVOID& handle,
+ int alpha_flag, void* pIccTransform, int blend_type);
+ int m_HorzSize, m_VertSize;
+ FX_BOOL m_bSupportROP;
+};
+class CPSOutput : public IFX_PSOutput, public CFX_Object
+{
+public:
+ CPSOutput(HDC hDC);
+ virtual ~CPSOutput();
+ virtual void Release()
+ {
+ delete this;
+ }
+ void Init();
+ virtual void OutputPS(FX_LPCSTR string, int len);
+ HDC m_hDC;
+ FX_LPSTR m_pBuf;
+};
+class CPSPrinterDriver : public IFX_RenderDeviceDriver
+{
+public:
+ CPSPrinterDriver();
+ FX_BOOL Init(HDC hDC, int ps_level, FX_BOOL bCmykOutput);
+ ~CPSPrinterDriver();
+protected:
+ virtual FX_BOOL IsPSPrintDriver()
+ {
+ return TRUE;
+ }
+ virtual int GetDeviceCaps(int caps_id);
+ virtual FX_BOOL StartRendering();
+ virtual void EndRendering();
+ virtual void SaveState();
+ virtual void RestoreState(FX_BOOL bKeepSaved = FALSE);
+ virtual FX_BOOL SetClip_PathFill(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ int fill_mode
+ );
+ virtual FX_BOOL SetClip_PathStroke(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ const CFX_GraphStateData* pGraphState
+ );
+ virtual FX_BOOL DrawPath(const CFX_PathData* pPathData,
+ const CFX_AffineMatrix* pObject2Device,
+ const CFX_GraphStateData* pGraphState,
+ FX_DWORD fill_color,
+ FX_DWORD stroke_color,
+ int fill_mode,
+ int alpha_flag,
+ void* pIccTransform,
+ int blend_type
+ );
+ virtual FX_BOOL GetClipBox(FX_RECT* pRect);
+ virtual FX_BOOL SetDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, const FX_RECT* pSrcRect, int left, int top, int blend_type,
+ int alpha_flag, void* pIccTransform);
+ virtual FX_BOOL StretchDIBits(const CFX_DIBSource* pBitmap, FX_DWORD color, int dest_left, int dest_top,
+ int dest_width, int dest_height, const FX_RECT* pClipRect, FX_DWORD flags,
+ int alpha_flag, void* pIccTransform, int blend_type);
+ virtual FX_BOOL StartDIBits(const CFX_DIBSource* pBitmap, int bitmap_alpha, FX_DWORD color,
+ const CFX_AffineMatrix* pMatrix, FX_DWORD render_flags, FX_LPVOID& handle,
+ int alpha_flag, void* pIccTransform, int blend_type);
+ virtual FX_BOOL DrawDeviceText(int nChars, const FXTEXT_CHARPOS* pCharPos, CFX_Font* pFont,
+ CFX_FontCache* pCache, const CFX_AffineMatrix* pObject2Device, FX_FLOAT font_size, FX_DWORD color,
+ int alpha_flag, void* pIccTransform);
+ virtual void* GetPlatformSurface()
+ {
+ return (void*)m_hDC;
+ }
+ HDC m_hDC;
+ FX_BOOL m_bCmykOutput;
+ int m_Width, m_Height, m_nBitsPerPixel;
+ int m_HorzSize, m_VertSize;
+ CPSOutput* m_pPSOutput;
+ CFX_PSRenderer m_PSRenderer;
+};
+void _Color2Argb(FX_ARGB& argb, FX_DWORD color, int alpha_flag, void* pIccTransform);