From: John Ellis Date: Mon, 3 Apr 2000 18:24:05 +0000 (+0000) Subject: Initial revision X-Git-Tag: v1.0.0~1802 X-Git-Url: http://geeqie.org/cgi-bin/gitweb.cgi?p=geeqie.git;a=commitdiff_plain;h=93e32295cfd3fd2586f8ceebe5aba5607ccc17c0 Initial revision --- diff --git a/.cvsignore b/.cvsignore new file mode 100644 index 00000000..e73b3226 --- /dev/null +++ b/.cvsignore @@ -0,0 +1,22 @@ +Makefile +Makefile.in +aclocal.m4 +config.cache +config.guess +config.h +config.h.in +config.log +config.status +config.sub +configure +configure.scan +missing +mkinstalldirs +COPYING +install-sh +stamp-h +stamp-h.in +INSTALL +gqview.spec +intl +ABOUT-NLS diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 00000000..ceae3fa1 --- /dev/null +++ b/AUTHORS @@ -0,0 +1 @@ +johne@bellatlantic.net diff --git a/BUGS b/BUGS new file mode 100644 index 00000000..38417008 --- /dev/null +++ b/BUGS @@ -0,0 +1,2 @@ + >drag and drop bug with GTK+-1.2.3, endless loops, see TODO for more. + diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 00000000..1366bb09 --- /dev/null +++ b/ChangeLog @@ -0,0 +1,375 @@ +Thu Mar 16 17:04:24 2000 John Ellis + + * pathsel.c, tabcomp.c: Fix memory leaks. + +Fri Oct 1 17:17:21 1999 John Ellis + + * po/ru.po: Added Russian translation + from Oleg Andrjushenko + * po/pt_BR.po: Added Brazilian Portuguese translation + from Vitor Fernandes + * po/ja/po: Added Japanese translation + from Shingo Akagaki + * configure.in: Updated ALL_LINGUAS. + +Mon Sep 6 06:25:38 1999 John Ellis + + * image.c, img-main.c, img-view.c, window.c: Remove warnings for + gtk+-1.2.5-pre1. I think there are still realize issues with that + version of GTK+, however. + +Wed Aug 18 21:03:05 1999 John Ellis + + * filelist.c: Fix reversal of calculating column width of the files + list for icons vs. no icons. + * pathsel.c, utilops.c: Set teh clist columns to autosize, so that + horizontal scrollbar is accurate (and usually not there ;) + +Wed Aug 18 20:35:07 1999 John Ellis + + * gqview.h, tabcomp.c, utilops.c: Move and copy dialogs now have a + history. This was done by adding a combo widget option to the tab + completion routines. + +Wed Aug 18 17:37:48 1999 John Ellis + + * config.c: Fix 'fall back to 48x48 icon size' bug. + +Mon Aug 16 13:25:29 1999 John Ellis + + * po/de.po: Added german translation + by mawarkus@t-online.de (Matthias Warkus) + * configure.in (ALL_LINGUAS): Added de. + +Mon Aug 16 12:44:56 1999 John Ellis + + * utilops.c: Make it easier for translators. + +Mon Aug 16 12:09:53 1999 John Ellis + + * thumb.c: Regenerate thumbnails whent the preferred size changes. + +Mon Aug 16 11:56:29 1999 John Ellis + + * config.c, globals.c, gqview.h, main.c, rcfile.c: Removed the + 'save settings on exit' option and always save one exit, this was + leading to confusion as to why settings are not always saved. + * menus.: Removed the save settings menu line, no longer needed. + +Tue Aug 10 07:03:44 1999 John Ellis + + * main.c(main): Use gtk_set_locale(); + * window.c: Use gqview instead of main for wmhints. + +Tue Aug 10 06:55:48 1999 John Ellis + + * filelist.c: Update the file count when files are removed. + * dnd.c: When a drag and drop results in a GDK_ACTION_MOVE, refresh + the lists to account for possibly deleted files. + +Fri Jul 23 17:09:02 1999 John Ellis + + * window.c: Fix hang bug when dragging a file after starting with tools + floating, then unfloating the window. (don't use gtk_widget_reparent + for this). + * dnd.c: Properly add "\r\n" to the end of all files for URI types, now + all drags to Gimp 1.1.6 works. + +Tue Jul 20 20:37:03 1999 John Ellis + + * configure.in, Makefile.am: Added localedir definition. + * src/main.c: Added locale and i18n initialization. + +Tue Jul 20 20:03:18 1999 John Ellis + + * configure.in, Makefile.am, autogen.sh: Add gettext calls, simplify + gtk/imlib checks. + * po/POTFILES.in: Created for gettext. + * src/intl.h, gqmpeg.h, *.c: Added intl stuff, marked strings for + translation. + +Sat Jul 10 15:12:13 1999 John Ellis + + * all files: Moved to autoconf and automake. + +Sat Jul 3 08:23:59 1999 John Ellis + + * gqview.h, README, gqview.spec: Release 0.7.0 + +Fri Jul 2 13:00:21 1999 John Ellis + + * img-view.c: Added a 'close window' option to pop up dialog. + +Fri Jul 2 09:11:02 1999 John Ellis + + * main.c (main): Fix so that window does not expand to image size when + strting up with an image (from command line). + * img-view.c (view_window_new): Follow the limit window size option, + if enabled. + +Thu Jul 1 20:13:31 1999 John Ellis + + * main.c: Setup random seed, for better random slideshows. + +Sun Jun 27 15:17:10 1999 John Ellis + + * img-main.c: Use black background for full screen. + * menu.c: Keep keyboard grab when full screen menu closes. + +Sun Jun 27 14:07:05 1999 John Ellis + + * img-main.c: Keyboard now works with full screen. + * main.c: Drop out of full screen before exiting. + +Sun Jun 27 06:57:22 1999 John Ellis + + * image.c: Fix image snapping to uppper left when resizing window. + * main.c: Increase progressive scrolling rate. + +Fri Jun 25 15:22:32 1999 John Ellis + + * config.c, globals.c, gqview.h, img-view.c, main.c, rcfile.c: Added + progressive key scrolling option. + +Fri Jun 25 14:06:12 1999 John Ellis + + * image.c, img-main.c, gqview.h: A few api changes with regard to image + auto-sizing and zooming. + * dnd.c: Made image dnd more generic to work with separate views. + * img-view.c: Added dnd and keyboard support. + +Fri Jun 25 11:00:38 1999 John Ellis + + * image.c, img-view.c, window.c: Fixups for window resizing and initial + size setting. + +Fri Jun 18 13:42:35 1999 John Ellis + + * dnd.c, filelist.c, gqview.h, menu.c: Dragging and right clicking on + file list no longer displays image, but correctly, only displays + action/popup menu. + * globals.c, gqview.h, img-main.c, main.c, menu.c, window.c: Add full + screen option. + +Fri Jun 18 04:24:51 1999 John Ellis + + * image.[ch], img-main.c, gqview.h: Beginnings of adding capability to + view images in a new window. ImageWindow functions are now completely + generic (save one spot). + +Wed Jun 16 03:47:36 1999 John Ellis + + * slideshow.c, filelist.c: Make slideshow work correctly. + * config.c, rcfile.c: Add saving and adjustment of slide show options. + +Wed Jun 16 00:46:09 1999 John Ellis + + * slideshow.c, globals.c, gqview.h: Begin slideshow ability. + * menu.c: Add 'Toggle slideshow' so view menu, may not stay here. + * filelist.c: Made a few functions needed for slideshow public. + +Tue Jun 15 19:21:26 1999 John Ellis + + * filelist.c, pathsel.c, tabcomp.c: Small speed improvements in + handling (creating) GLists. + +Sat Jun 12 23:17:34 1999 John Ellis + + * rcfile.c (load_options): Fix memory leak, patch submitted by + F. Petitjean + +Thu May 27 14:32:22 1999 John Ellis + + * gqmpeg.h, README, gqmpeg.spec: Release 0.6.1 + +Thu May 27 13:10:02 1999 John Ellis + + * filelist.c: Generate thumbnails for visible files first. Thumbnails + are now kept when renaming. + +Thu May 27 11:54:09 1999 John Ellis + + * pathsel.c: Merge improvements from gqmpeg version. + * tabcomp.c, tabcomp.xpm: ditto. + * utildlg.c: ditto. + * config.c, utilops.c, window.c: Use newer features of above. + +Thu May 27 11:44:00 1999 John Ellis + + * filelist.c, image.c, gqmpeg.h: Properly update the image window when + viewed files are moved, renamed, or deleted. + +Thu May 27 11:01:31 1999 John Ellis + + * main.c (main): Push correct visual and colormap to fix 8 but psuedo + color displays. + +Sun May 23 09:21:50 1999 John Ellis + + * Makefile: Added static build target, some cleanup. + +Sat Apr 10 19:01:33 1999 John Ellis + + * window.c(toolwindow_create): Use gtk_window_set_policy on toolwindow + so it can be resized smaller. + +0.6.0 (3-5-98) + > Major rewrite (60-70%), now requires gtk+-1.2.0 + > Multiple file selection. + > Drag and drop. + > Better keyboard support. + > xvpics thumbnail support (read only), optional. + - Add command line options to force show and hide of tools. + * Fix tab completion bug. + * Fix gtk 1.2.0 related bugs. + +0.5.1 (12-8-98) + - Should compile now without editing the Makefile with any gtk through 1.1.5 + * Fix file highlight bug when user tab completes to currently displayed dir. + * Fix for FreeBSD. + +0.5.0 (11-11-98) + > Add path entry window with tab completion. + > Add tab completion to all areas where a path can be typed. + > Add option to save window positions. + - Pressing '+' zooms image. Previously only '=' was bound, causing problems + for some keyboard layouts. + - Add border to floating tools window for better appearance on some WM's. + +0.4.3 (10-09-98) + * Fix bug when 'fit window to image' is on, tools float/hide, and the next + image selected has the same dimensions, it would not display. + * More fixes dealing with 'fit window to image' + +0.4.2 (10-07-98) + > Add 'fit window to image' option when tools float or hide. + > Add copy and move dialogs. + > Add option to hide the tools completely. + > Save settings on exit option added, and option to restore tool state. + - Pressing the [ESC] key will now stop loading of thumbnails. + - [CTRL] - M is now moves files, purging old thumbnails is now [CTRL] - T. + - Add save button to config dialog. + - New configuration tab: image, moved relevent options there. + +0.4.1 (9-11-98) + > Scrollbars removed, now you can pan the image by pressing and dragging the + mouse on the image. The arrow keys will pan too (use [Ctrl] to pan faster) + > The file selection area and status line can be 'floated' into a separate + window, this allows the image window to display more of the image. + > The file delete confirmation dialog can now be disabled in the options + window. + > The beginnings of keyboard support ( see the keyboard chart, above ) + - Now if a thumbnail is older than it's parent image, the thumbnail is + recreated, so that changed images have their thumbnail properly updated. + - While loading thumbnails GQview is now responsive to commands, slowly, but + it works. You can now load images, delete files, etc. while the thumbnails + are being generated. The thumbnail generation can be interrupted too by + simply turning them off. + * The code that determines the user's HOME directory has been rewritten, now + hopefully users of nis will be happy. If the directory is not found or + cannot be determined, GQview exits semi-gracefully. + * Fixed some bugs here and there. + +0.4.0 (8-15-98) + > Thumbnail caching added ($HOME/.gqview_thmb). + - patch from Joshua Thomas Green applied for those that want to compile + with GTK 1.1.x (the development version), just uncomment one line in the + Makefile. + - patch from Joel Young applied to the .spec file of the RPM version. + +0.3.4 (7-30-98) + * Fixed problem loading files into external editors when a space was in the + pathname. + +0.3.3 (5-15-98) + - Changes to file listing code for speed improvement in large directories. + * Fixed a bug that would cause a thumbnail's height or width to be zero when + an image has a large aspect ratio. + * Fixed some memory leaks in the file listing code. + - Other small changes including source re-organization. + - Added a pixmap file to use as an icon (gqview.xpm). + +0.3.2 (5-7-98) + * Fixed a bug which made the first editor slot useless from config dialog. + +0.3.1 (5-4-98) + - Changed filelist code to properly implement Glist. + - Moved definitions of variables and #includes to better places. + +0.3.0 (4-24-98) + > New feature! Thumbnails displayed in the file list(us 't' to toggle). + > Thumbnails size can be selected (General Options). + > Rewrite (again) of the file list (to support adding/removing entries + without re-reading the entire directory listing, [still need to convert + the directory list, however]). + - minor display layout changes (to accomodate the progress bar). + - if a file format cannot be determined, a generic 'unknown image' picture + is displayed. + - added display for the number of files listed. + - added '-debug' command line option for debug output (preliminary) + +0.2.1 (4-8-98) + > Added a handle, now the file lists are sizeable. + - renamed menu item Exit to Quit. + - Added missing file includes that were exposed with GTK+ 0.99.10 release. + +0.2.0 (3-19-98) + > External editors can be specified in the configuration window (max 8). + Under the "external editors" tab. + - Popup menu for filelist (delete, rename, and edit). + - Filelist highlight now follows currently viewed image. + - A few minor fixes. + +0.1.1 (3-3-98) + > Updated code to compile with GTK+-0.99.4 + (will not work with previous versions of GTK) + - Command line no longer requires a complete path to a file if it is in + the current working directory. (or must be relative to it) + - When moving to the next (or previous) image, the file list + scrolls to include the current image's name. + +0.1.0 (2-28-98) + > Added menu bar. + > Added keyboard shorcuts. + > Configuration can be saved (to .gqviewrc in user's home dir) + > Command line support. (specify startup directory or file to view) + > Can set startup directory in options window (can be disabled) + > Added custom filtering options to support more formats + (Imlib supports almost anything your system can read using + ImageMagick or Netpbm, if available). + > File operations: create directory, rename file, delete file. + > clicking mouse on image: + button one: next image + button two: previous image + button three: popup menu (zoom, file operations, edit image) + > Added option to load image into The Gimp. + - Fixed a bug in the history list truncating routine. (GQview would crash) + - Other minor improvements and fixes. + +0.0.3 (2-18-98) + > Source code clean up! The source code has been organized + and is now readable (some code still needs organizing, but + at least now the code can be followed). + > Makefile rewritten, it may still need editing for some systems. + The '-g' gcc option was removed for the released code, this makes + the binary about 1/3 smaller (it removes some debugging facilities) + - Fixed the transparency problem. This removes the garbage displayed + where an image is transparent, unfortunately for now it is set to purple. + +0.0.2 (2-14-98) + > Rewrote directory and file list handling, the lists + can now be of any length. + > Lists are now sorted. + > History list no longer expands out of control as the + directory path gets longer, entries are truncated at + 32 characters and '/...' is prepended. + > Added configuration window, including: + - show or hide dot files + - select default zoom mode for new image + - disable file filtering + - choose file types to filter + - about tab for version and contact info + +0.0.1 (2-10-98) + > No history, first release! + diff --git a/HACKING b/HACKING new file mode 100644 index 00000000..5ffd6d64 --- /dev/null +++ b/HACKING @@ -0,0 +1,14 @@ +A brief overview for those that wish to work with the source. + +The Makefiles and configure script are generated by the autogen.sh script, usually +only distributed with snapshot releases. Running autogen.sh requires automake +and autoconf. GNU gettext may also be needed by autogen.sh. + +CVS commits _require_ a ChangeLog entry, commits without a ChangeLog will be reverted. + +Translators create a translation by creating the appropriate .po file in the /po +directory. Please see the gettext info pages for an overview and instructions. +Basically: Add your language code to the ALL_LINGUAS= line in configure.in, +then get started translating the strings in your ??.po file. +Note: The strings for debug output is intentionally not marked for translation. + diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 00000000..8a6e380a --- /dev/null +++ b/Makefile.am @@ -0,0 +1,15 @@ +## Process this file with automake to produce Makefile.in. + +SUBDIRS = src intl po +DIST_SUBDIRS = src intl po + +EXTRA_DIST = gqview.desktop gqview.png gqview.spec BUGS ChangeLog + +if HAVE_GNOME +desktopdir = $(GNOME_DATADIR)/gnome/apps/Graphics +desktop_DATA = gqview.desktop + +icondir = $(GNOME_DATADIR)/pixmaps +icon_DATA = gqview.png +endif + diff --git a/NEWS b/NEWS new file mode 100644 index 00000000..e69de29b diff --git a/README b/README new file mode 100644 index 00000000..4e5c3c9b --- /dev/null +++ b/README @@ -0,0 +1,118 @@ +################################################################### +## GQview 0.7.0 (07/03/99) ## +## This software is Copyright (C) 1999 by John Ellis. ## +## Use this software at your own risk. I am not responsible for ## +## anything this software may do to your computer. ## +## This software falls under the GNU Public License. Please read ## +## the COPYING file for more information ## +################################################################### + +Author: John Ellis +e-mail: gqview@email.com +homepage: gqview.netpedia.net + www.geocities.com/SiliconValley/Haven/5235/ (mirror always up to date) + +======== Requirements + + GTK+-1.2.0: ftp://ftp.gtk.org/pub/gtk + Imlib 1.9: ftp://ftp.labs.redhat.com/pub/imlib + +======== Notes and changes for this release + + Changes: + > Now use autoconf/make, resulting in a configure script. + > Now supports i18n, added translations: de ja pt_BR ru + > Remove 'save settings on exit', they are now always saved. + > Copy/move dialogs now include drop down history. + - Icons now update when size is configured. + - When dragging files, and the action was a move, refresh the filelist. + * Icons sizes are now properly remembered when the config dialog is opened + then closed without re-selecting the size. + + Notes: + known bug: When starting up with tools floating, then unfloat the tools and + attempt to do drag and drop, BOOM! endless loop of errors on + GTK+-1.2.3 (hint: could use a little help figuring this out) + +======== Installation + + Compilation: ./configure ; make + General install: make install + GNOME install: make gnome-install is deprecated!, configure finds gnome for + you now. + Removal: make uninstall + +======== Description / Features + + GQview is a graphics file viewer. Basic features: + - Single click image viewing / navigation. + - Zoom functions. + - Thumbnails, with optional caching and .xvpics support. + - Multiple file selection for move, copy, delete, rename, drag and drop. + - Drag and drop. + - Slideshow. + - Full screen. + - Ability to open images in external editors (configurable). + +======== Documentation (brief) + + Keyboard commands: + [PageDown] next image + [PageUp] previous image + [Home] first image in list + [End] last image in list + [Tab] tab completion in path entry window + [Escape], cancel completion in path entry window + [Escape] stop generating thumbnails + + Keyboard commands valid when image has focus (image has black rectangle) + arrow keys pan image + [Shift] - arrow keys pan image faster + [Space] next image + [Backspace] previous image + + File menu related: + [Ctrl] - N New directory + [Ctrl] - C Copy file + [Ctrl] - M Move file + [Ctrl] - R Rename file + [Ctrl] - D, [Delete] Delete file + [Ctrl] - Q, Q Exit + + Edit menu related: + [Ctrl] - 1 .. 8 run external editor + [Ctrl] - O configure Options + [Ctrl] - S Save options + [Ctrl] - T Maintain thumbnails + + View menu related: + +, = zoom in + - zoom out + Z zoom to original size + X zoom to fit + T toggle thumbnail display + R refresh list + F (Un)float file selection area + H (Un)hide file selection area + [Ctrl] = F Toggle full screen + S Toggle slide show + +======== Thanks go to the following for fixes, additions, and patches: + + Oleg Andrjushenko + for Russian translation + + Vitor Fernandes + for Brazilian Portuguese translation + + Shingo Akagaki a + for Japanese translation + + Matthias Warkus + for German translation. + + Diederen Damien + for .xvpics thumbnail reading support. + +======== + diff --git a/TODO b/TODO new file mode 100644 index 00000000..6e6d3280 --- /dev/null +++ b/TODO @@ -0,0 +1,40 @@ +TODO key: d = done, w = work in progress, ? = possibly fixed, * = wt? - how? + +d>try gtk_container_remove instead of reparent, to try to fix dragging hang. +d>After dragging files, check if they are now gone (moved). + >Remember previous directory used in move/copy dialogs. + +Major: +---------------------------------------------- +d>Fix window resizing to start-up size when window is made smaller, then an + image is changed, or widget is 'operated'. +d>Fix hang (endless gtk loop on drags in GTK+ 1.2.3) bah, in gdb its a pain, + breaking it within the error causes a stuck pointer grab :-/ + HOW TO REPEAT: + enable 'save tool state' + set the tools to float + exit + restart + unfloat tools + try to do drag and drop -> BOOM! + UPDATE: I dunno, this still looks like a gtk bug? + +Minor: +---------------------------------------------- + >add a read-ahead buffer for next image, note that this will not be threaded. + >add command line option to invoke full screen and slideshow on startup + >make *'s const, where appropriate () + >make Escape cancel dialogs. + + >add progress dialog when moving/copying/deleting multiple files. + >.xbm file format not listed by default? .pnm, more? + + >ability to specify view window background color + >show wait cursor during image load + +Wishlist?: +---------------------------------------------- + >image list, like playlist in sound players + >add vert drag bar + >make *.jpg on command line show only jpg files, for ex. + diff --git a/acconfig.h b/acconfig.h new file mode 100644 index 00000000..83c904d2 --- /dev/null +++ b/acconfig.h @@ -0,0 +1,9 @@ +#undef ENABLE_NLS +#undef HAVE_CATGETS +#undef HAVE_GETTEXT +#undef HAVE_LC_MESSAGES +#undef HAVE_STPCPY + +#undef PACKAGE +#undef VERSION + diff --git a/autogen.sh b/autogen.sh new file mode 100755 index 00000000..4b1ca7cf --- /dev/null +++ b/autogen.sh @@ -0,0 +1,115 @@ +#!/bin/sh +# Run this to generate all the initial makefiles, etc. + +#this was originally taken from the gnome macros/autogen.sh scripts + +srcdir=`dirname $0` +test -z "$srcdir" && srcdir=. + +(test -f $srcdir/configure.in \ + && test -f $srcdir/src/main.c \ + && test -f $srcdir/src/gqview.h) || { + echo -n "**Error**: Directory "\`$srcdir\'" does not look like the" + echo " top-level gqview directory" + exit 1 +} + +DIE=0 + +(autoconf --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "**Error**: You must have \`autoconf' installed." + echo "Download the appropriate package for your distribution," + echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" + DIE=1 +} + +grep "^AM_GNU_GETTEXT" $srcdir/configure.in >/dev/null && { + grep "sed.*POTFILES" $srcdir/configure.in >/dev/null || \ + (gettext --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "**Error**: You must have \`gettext' installed." + echo "Get ftp://alpha.gnu.org/gnu/gettext-0.10.35.tar.gz" + echo "(or a newer version if it is available)" + DIE=1 + } +} + +# if no automake, don't bother testing for aclocal +test -n "$NO_AUTOMAKE" || (aclocal --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "**Error**: Missing \`aclocal'. The version of \`automake'" + echo "installed doesn't appear recent enough." + echo "Get ftp://ftp.gnu.org/pub/gnu/automake-1.3.tar.gz" + echo "(or a newer version if it is available)" + DIE=1 +} + +if test "$DIE" -eq 1; then + exit 1 +fi + +if test -z "$*"; then + echo "**Warning**: I am going to run \`configure' with no arguments." + echo "If you wish to pass any to it, please specify them on the" + echo \`$0\'" command line." + echo +fi + +case $CC in +xlc ) + am_opt=--include-deps;; +esac + +for coin in `find $srcdir -name configure.in -print` +do + dr=`dirname $coin` + if test -f $dr/NO-AUTO-GEN; then + echo skipping $dr -- flagged as no auto-gen + else + echo processing $dr + macrodirs=`sed -n -e 's,AM_ACLOCAL_INCLUDE(\(.*\)),\1,gp' < $coin` + ( cd $dr + aclocalinclude="$ACLOCAL_FLAGS" + for k in $macrodirs; do + if test -d $k; then + aclocalinclude="$aclocalinclude -I $k" + ##else + ## echo "**Warning**: No such directory \`$k'. Ignored." + fi + done + if grep "^AM_GNU_GETTEXT" configure.in >/dev/null; then + if grep "sed.*POTFILES" configure.in >/dev/null; then + : do nothing -- we still have an old unmodified configure.in + else + echo "Creating $dr/aclocal.m4 ..." + test -r $dr/aclocal.m4 || touch $dr/aclocal.m4 + echo "Running gettextize... Ignore non-fatal messages." + echo "no" | gettextize --force --copy + echo "Making $dr/aclocal.m4 writable ..." + test -r $dr/aclocal.m4 && chmod u+w $dr/aclocal.m4 + fi + fi + echo "Running aclocal $aclocalinclude ..." + aclocal $aclocalinclude + if grep "^AM_CONFIG_HEADER" configure.in >/dev/null; then + echo "Running autoheader..." + autoheader + fi + echo "Running automake --gnu $am_opt ..." + automake --add-missing --gnu $am_opt + echo "Running autoconf ..." + autoconf + ) + fi +done + +conf_flags="--enable-maintainer-mode --enable-compile-warnings" #--enable-iso-c + +if test x$NOCONFIGURE = x; then + echo Running $srcdir/configure $conf_flags "$@" ... + $srcdir/configure $conf_flags "$@" \ + && echo Now type \`make\' to compile $PKG_NAME +else + echo Skipping configure process. +fi diff --git a/configure.in b/configure.in new file mode 100644 index 00000000..c932ecfc --- /dev/null +++ b/configure.in @@ -0,0 +1,55 @@ +AC_INIT(src/main.c) +AM_CONFIG_HEADER(config.h) + +AM_INIT_AUTOMAKE(gqview, 0.7.0f) + +AM_MAINTAINER_MODE + +AC_ISC_POSIX +AC_PROG_CC +AC_STDC_HEADERS +AC_ARG_PROGRAM + +dnl reasonable guesses for where stuff is installed +if test "x$prefix" = "xNONE"; then + prefix="/usr/local" +else + prefix=$prefix +fi + +AM_PATH_GTK(1.2.0,,AC_MSG_ERROR(GTK+ >= 1.2.0 not installed.)) +AM_PATH_GDK_IMLIB(1.9,,AC_MSG_ERROR(Imlib >= 1.9 not installed.)) + +dnl CHECK_GNOME + AC_PATH_PROG(GNOME_CONFIG,gnome-config,no) + AM_CONDITIONAL(HAVE_GNOME, test $GNOME_CONFIG != no) + if test "$GNOME_CONFIG" = no; then + AC_MSG_RESULT(GNOME icon and menu entry will NOT be installed) + else + AC_MSG_RESULT(will install a GNOME icon and menu entry) + AC_SUBST(GNOME_DATADIR) + GNOME_DATADIR="`$GNOME_CONFIG --datadir`" + fi + +dnl utility conditional +AM_CONDITIONAL(FALSE, test "x" = "y") + +dnl locale location for po +localedir='${prefix}/share/locale' +AC_SUBST(localedir) + +ALL_LINGUAS="de ja pt_BR ru" +AM_GNU_GETTEXT + +AC_SUBST(CFLAGS) +AC_SUBST(CPPFLAGS) +AC_SUBST(LDFLAGS) + +AC_OUTPUT([ +Makefile +intl/Makefile +po/Makefile.in +gqview.spec +src/Makefile +src/icons/Makefile +]) diff --git a/gqview.desktop b/gqview.desktop new file mode 100644 index 00000000..015ded62 --- /dev/null +++ b/gqview.desktop @@ -0,0 +1,7 @@ +[Desktop Entry] +Name=GQview +Comment=Image Viewer +Exec=gqview +Icon=gqview.png +Terminal=0 +Type=Application diff --git a/gqview.png b/gqview.png new file mode 100644 index 00000000..88801e0c Binary files /dev/null and b/gqview.png differ diff --git a/gqview.spec.in b/gqview.spec.in new file mode 100644 index 00000000..fa10f4a4 --- /dev/null +++ b/gqview.spec.in @@ -0,0 +1,53 @@ +%define ver @VERSION@ +%define rel 1 +%define prefix /usr + +Summary: Graphics file browser utility. +Name: gqview +Version: %ver +Release: %rel +Copyright: GPL +Group: Applications/Multimedia +Source: http://gqview.netpedia.net/gqview-%{ver}.tar.gz +BuildRoot: /var/tmp/%{name}-%{version}-root + +URL: http://gqview.netpedia.net/index.html + +Requires: gtk+ >= 1.2 +Requires: imlib >= 1.9 + +%description +GQview is a browser for graphics files. +Offering single click viewing of your graphics files. +Includes thumbnail view, zoom and filtering features. +And external editor support. + +%prep +%setup + +%build +if [ ! -f configure ]; then + CFLAGS="$MYCFLAGS" ./autogen.sh $MYARCH_FLAGS --prefix=%prefix +else + CFLAGS="$MYCFLAGS" ./configure $MYARCH_FLAGS --prefix=%prefix +fi + +make + +%install +rm -rf $RPM_BUILD_ROOT + +make GNOME_DATADIR=$RPM_BUILD_ROOT%{prefix}/share prefix=$RPM_BUILD_ROOT%{prefix} install + +%clean +rm -rf $RPM_BUILD_ROOT + +%files +%defattr(-, root, root) + +%doc README COPYING TODO +%{prefix}/bin/gqview +@HAVE_GNOME_TRUE@%{prefix}/share/gnome/apps/Graphics/gqview.desktop +@HAVE_GNOME_TRUE@%{prefix}/share/pixmaps/gqview.png + + diff --git a/po/.cvsignore b/po/.cvsignore new file mode 100644 index 00000000..22293000 --- /dev/null +++ b/po/.cvsignore @@ -0,0 +1,9 @@ +Makefile +Makefile.in +Makefile.in.in +POTFILES +cat-id-tbl.c +gqview.pot +stamp-cat-id +*.gmo +gqview.pot diff --git a/po/ChangeLog b/po/ChangeLog new file mode 100644 index 00000000..e69de29b diff --git a/po/POTFILES.in b/po/POTFILES.in new file mode 100644 index 00000000..c7d1d08a --- /dev/null +++ b/po/POTFILES.in @@ -0,0 +1,16 @@ +./src/config.c +./src/dnd.c +./src/filelist.c +./src/fileops.c +./src/image.c +./src/img-main.c +./src/img-view.c +./src/main.c +./src/menu.c +./src/pathsel.c +./src/rcfile.c +./src/tabcomp.c +./src/thumb.c +./src/utildlg.c +./src/utilops.c +./src/window.c diff --git a/po/de.po b/po/de.po new file mode 100644 index 00000000..81782189 --- /dev/null +++ b/po/de.po @@ -0,0 +1,852 @@ +# gqmpeg de.po file. +# Copyright (C) 1999 John Ellis. +# Matthias Warkus , 1999. +# +msgid "" +msgstr "" +"Project-Id-Version: gqmpeg-0.6.3a\n" +"POT-Creation-Date: 1999-08-21 14:22-0400\n" +"PO-Revision-Date: 1999-08-15 23:47+02:00\n" +"Last-Translator: Matthias Warkus \n" +"Language-Team: Me and my monkey \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=iso-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/config.c:303 +msgid "GQview configuration" +msgstr "GQview-Konfiguration" + +#: src/config.c:315 +msgid "Ok" +msgstr "OK" + +#: src/config.c:320 +msgid "Apply" +msgstr "" + +#: src/config.c:325 src/utildlg.c:140 src/utilops.c:414 src/utilops.c:722 +#: src/utilops.c:851 src/utilops.c:949 +msgid "Cancel" +msgstr "Abbrechen" + +#: src/config.c:339 +msgid "General" +msgstr "Allgemein" + +#: src/config.c:347 +msgid "Initial directory" +msgstr "Anfängliches Verzeichnis" + +#: src/config.c:357 +msgid "On startup, change to this directory:" +msgstr "Beim Start in dieses Verzeichnis wechseln:" + +#: src/config.c:369 +msgid "Use current" +msgstr "Aktuelle benutzen" + +#: src/config.c:375 +msgid "Confirm file delete" +msgstr "Dateilöschung bestätigen" + +#: src/config.c:377 +msgid "Remember tool state (float/hidden)" +msgstr "An Werkzeugstatus erinnern (schwebend/verborgen)" + +#: src/config.c:379 +msgid "Remember window positions" +msgstr "An Fensterpositionen erinnern" + +#: src/config.c:381 +msgid "Slide show" +msgstr "Diavorführung" + +#: src/config.c:394 +msgid "Delay before image change (seconds):" +msgstr "Verzögerung vor Bildwechsel (Sekunden):" + +#: src/config.c:407 +msgid "Random" +msgstr "Zufall" + +#: src/config.c:409 +msgid "Repeat" +msgstr "Wiederholung" + +#: src/config.c:416 +msgid "Image" +msgstr "Bild" + +#: src/config.c:424 +msgid "When new image is selected:" +msgstr "Wenn neues Bild ausgewählt wird:" + +#: src/config.c:434 +msgid "Zoom to original size" +msgstr "Zu Ausgangsgröße zoomen" + +#: src/config.c:440 src/img-view.c:283 src/menu.c:458 src/menu.c:531 +#: src/menu.c:571 src/menu.c:661 +msgid "Fit image to window" +msgstr "Bild in Fenster einpassen" + +#: src/config.c:446 +msgid "Leave Zoom at previous setting" +msgstr "Zoom bei vorheriger Einstellung belassen" + +#: src/config.c:453 +msgid "Fit window to image when tools are hidden/floating" +msgstr "Bild in Fenster einpassen wenn Werkzeuge verborgen sind / schweben" + +#: src/config.c:460 +msgid "Limit size when auto-sizing window" +msgstr "Größe begrenzen bei der automatischen Fenstergrößenanpassung" + +#: src/config.c:470 src/menu.c:462 +msgid "Thumbnails" +msgstr "Indexbilder" + +#: src/config.c:486 +msgid "Size:" +msgstr "Größe:" + +#: src/config.c:515 +msgid "Cache thumbnails" +msgstr "Indexbilder cachen" + +#: src/config.c:517 +msgid "Use xvpics thumbnails when found (read only)" +msgstr "xvpics-Indexbilder benutzen, wenn gefunden (nur Lesezugriff)" + +#: src/config.c:520 +msgid "Progressive keyboard scrolling" +msgstr "Gleichmäßiges Tastaturrollen" + +#: src/config.c:527 +msgid "Filtering" +msgstr "Filtern" + +#: src/config.c:536 +msgid "Show entries that begin with a dot" +msgstr "Einträge zeigen, die mit einem Punkt beginnen" + +#: src/config.c:538 +msgid "Disable File Filtering" +msgstr "Dateifiltern abschalten" + +#: src/config.c:540 +msgid "Include files of type:" +msgstr "Dateien dieses Typ einschließen:" + +#: src/config.c:590 +msgid "Custom file types:" +msgstr "Selbstdefinierte Dateitypen::" + +#: src/config.c:603 +msgid "format: [.foo;.bar]" +msgstr "Format: [.foo;.bar]" + +#: src/config.c:612 +msgid "External Editors" +msgstr "Externe Editoren:" + +#: src/config.c:624 +msgid "#" +msgstr "Nr. " + +#: src/config.c:627 +msgid "Menu name" +msgstr "Menüname" + +#: src/config.c:630 +msgid "Command Line" +msgstr "Kommandozeile" + +#: src/config.c:660 src/menu.c:484 +msgid "About" +msgstr "Info" + +#: src/config.c:676 +#, c-format +msgid "" +"GQview %s\n" +"\n" +"Copyright (c) 1999 by John Ellis\n" +"http://gqview.netpedia.net\n" +"gqview@email.com\n" +"\n" +"Released under the GNU Public License" +msgstr "" +"QGview %s\n" +"\n" +"Copyright (C) 1999 by John Ellis\n" +"http://gqview.netpedia.net\n" +"gqview@email.com\n" +"\n" +"Freigegeben unter der GNU General Public License" + +#: src/filelist.c:51 +msgid " Slideshow" +msgstr " Diavorführung" + +#: src/filelist.c:55 +#, c-format +msgid "%d files (%d)%s" +msgstr "%d Dateien (%d)%s" + +#: src/filelist.c:57 +#, c-format +msgid "%d files%s" +msgstr "%d Dateien%s" + +#: src/filelist.c:960 +msgid "Loading thumbs..." +msgstr "Lade Indexbilder..." + +#: src/image.c:65 +#, c-format +msgid "( ? x ? ) %d bytes" +msgstr "( ? x ? ) %d Bytes" + +#: src/image.c:67 +#, c-format +msgid "( %d x %d ) %d bytes" +msgstr "( %d x %d ) %d Bytes" + +#: src/img-main.c:230 +msgid "GQview full screen" +msgstr "GQview Vollbild" + +#: src/img-view.c:280 src/menu.c:455 src/menu.c:528 src/menu.c:568 +#: src/menu.c:657 +msgid "Zoom in" +msgstr "Einzoomen" + +#: src/img-view.c:281 src/menu.c:456 src/menu.c:529 src/menu.c:569 +#: src/menu.c:659 +msgid "Zoom out" +msgstr "Wegzoomen" + +#: src/img-view.c:282 src/menu.c:457 src/menu.c:530 src/menu.c:570 +msgid "Zoom 1:1" +msgstr "Zoom 1:1" + +#. edit menu +#: src/img-view.c:286 src/menu.c:442 src/menu.c:503 src/menu.c:534 +#: src/menu.c:574 +msgid "Edit" +msgstr "Bearbeiten" + +#: src/img-view.c:291 src/menu.c:431 src/menu.c:510 src/menu.c:541 +#: src/menu.c:579 +msgid "Copy..." +msgstr "Kopieren..." + +#: src/img-view.c:292 src/menu.c:432 src/menu.c:511 src/menu.c:542 +#: src/menu.c:580 +msgid "Move..." +msgstr "Verschieben..." + +#: src/img-view.c:293 src/menu.c:433 src/menu.c:512 src/menu.c:543 +#: src/menu.c:581 +msgid "Rename..." +msgstr "Umbenennen.." + +#: src/img-view.c:294 src/menu.c:434 src/menu.c:513 src/menu.c:544 +#: src/menu.c:582 +msgid "Delete..." +msgstr "Löschen..." + +#: src/img-view.c:297 +msgid "Close window" +msgstr "Fenster schließen" + +#: src/main.c:90 src/main.c:119 +#, c-format +msgid "GQview running: %s\n" +msgstr "GQview läuft: %s\n" + +#: src/main.c:316 +msgid "" +"Usage: gqview [options] [path]\n" +"\n" +msgstr "" +"Verwendung: gqview [optionen] [pfad]\n" +"\n" + +#: src/main.c:317 +msgid "valid options are:\n" +msgstr "Gültige Optionen sind:\n" + +#: src/main.c:318 +msgid " +t, +tools force show of tools\n" +msgstr " +t, +tools Anzeige der Werkzeuge erzwingen\n" + +#: src/main.c:319 +msgid " -t, -tools force hide of tools\n" +msgstr " -t, -tools Verbergen der Werkzeuge erzwingen\n" + +#: src/main.c:320 +msgid " -debug turn on debug output\n" +msgstr " -debug Diagnoseausgabe einschalten\n" + +#: src/main.c:321 +msgid "" +" -help this message\n" +"\n" +msgstr "" +" -help Diese Meldung\n" +"\n" + +#: src/main.c:326 +#, c-format +msgid "" +"invalid or ignored: %s\n" +"Use -help for options\n" +msgstr "" +"Ungültig oder ignoriert: %s\n" +"Benutzen Sie -help für Optionen\n" + +#: src/main.c:353 +msgid "The Gimp" +msgstr "The Gimp" + +#: src/main.c:356 +msgid "Electric Eyes" +msgstr "Electric Eyes" + +#: src/main.c:359 +msgid "XV" +msgstr "XV" + +#: src/main.c:362 +msgid "Xpaint" +msgstr "Xpaint" + +#: src/menu.c:364 +#, c-format +msgid "in %s..." +msgstr "in %s..." + +#: src/menu.c:366 +msgid "in (unknown)..." +msgstr "in (unbekannt)..." + +#: src/menu.c:385 +msgid "Options..." +msgstr "Optionen..." + +#: src/menu.c:387 +msgid "Remove old thumbnails" +msgstr "Alte Indexbilder entfernen" + +#. file menu +#: src/menu.c:425 +msgid "File" +msgstr "Datei" + +#: src/menu.c:429 +msgid "Create Dir..." +msgstr "Verzeichnis anlegen..." + +#: src/menu.c:436 +msgid "Exit" +msgstr "Beenden" + +#. view menu +#: src/menu.c:451 +msgid "View" +msgstr "Ansicht" + +#: src/menu.c:461 src/menu.c:547 +msgid "Full screen" +msgstr "Vollbild" + +#: src/menu.c:469 +msgid "Refresh Lists" +msgstr "Listen auffrischen" + +#: src/menu.c:470 +msgid "(Un)Float file list" +msgstr "Dateiliste schweben lassen / einfangen" + +#: src/menu.c:471 src/menu.c:546 +msgid "(Un)Hide file list" +msgstr "Dateiliste verbergen / hervorholen" + +#: src/menu.c:474 +msgid "Toggle slideshow" +msgstr "Diavorführung an/aus" + +#. help menu +#: src/menu.c:480 +msgid "Help" +msgstr "Hilfe" + +#: src/menu.c:507 src/menu.c:538 +msgid "View in new window" +msgstr "In neuem Fenster anzeigen" + +#: src/menu.c:515 +msgid "Refresh" +msgstr "Auffrischen" + +#: src/menu.c:585 +msgid "Exit full screen" +msgstr "Vollbild verlassen" + +#: src/menu.c:644 +msgid "Create thumbnails" +msgstr "Indexbilder erzeugen" + +#: src/menu.c:653 +msgid "Change to home directory" +msgstr "Ins Heimverzeichnis wechseln" + +#: src/menu.c:655 +msgid "Refresh file list" +msgstr "Dateiliste auffrischen" + +#: src/menu.c:663 +msgid "Set zoom 1:1" +msgstr "Zoom auf 1:1 setzen" + +#: src/menu.c:665 +msgid "Configure options" +msgstr "Optionen konfigurieren" + +#: src/menu.c:667 +msgid "Float Controls" +msgstr "Kontrollen schweben lassen" + +#: src/rcfile.c:132 +#, c-format +msgid "error saving config file: %s\n" +msgstr "Fehler beim Speichern von Konfigurationsdatei: %s\n" + +#: src/thumb.c:127 src/thumb.c:151 +#, c-format +msgid "create dir failed: %s\n" +msgstr "Anlegen von Verzeichnis fehlgeschlagen: %s\n" + +#: src/thumb.c:233 +#, c-format +msgid "Unable to delete dir: %s\n" +msgstr "Kann Verzeichnis nicht löschen: %s\n" + +#: src/thumb.c:249 +#, c-format +msgid "failed to delete:%s\n" +msgstr "Kann nicht löschen: %s\n" + +#: src/utildlg.c:67 +msgid " Ok " +msgstr " OK " + +#: src/utilops.c:162 +#, fuzzy, c-format +msgid "" +"Overwrite file:\n" +" %s\n" +" with:\b %s" +msgstr "Datei überschreiben:\n" + +#: src/utilops.c:163 src/utilops.c:262 src/utilops.c:621 src/utilops.c:803 +msgid "Overwrite file" +msgstr "Datei überschreiben" + +#: src/utilops.c:164 +msgid "Skip" +msgstr "Überspringen" + +#: src/utilops.c:165 +msgid "Yes to all" +msgstr "Ja zu allen" + +#: src/utilops.c:166 +msgid "Yes" +msgstr "Ja" + +#: src/utilops.c:200 src/utilops.c:288 +#, fuzzy +msgid "Error copying file" +msgstr "Fehler beim Umbenennen von Datei" + +#: src/utilops.c:201 +#, c-format +msgid "" +"Unable to copy file:\n" +"%sto:\n" +"%s\n" +" during multiple file copy." +msgstr "" + +#: src/utilops.c:205 src/utilops.c:293 +#, fuzzy +msgid "Error moving file" +msgstr "Fehler beim Umbenennen von Datei" + +#: src/utilops.c:206 +#, fuzzy, c-format +msgid "" +"Unable to move file:\n" +"%sto:\n" +"%s\n" +" during multiple file move." +msgstr "" +"\n" +" während Verschieben mehrerer Dateien." + +#: src/utilops.c:209 src/utilops.c:486 +msgid "Continue" +msgstr "Fortsetzen" + +#: src/utilops.c:261 +#, fuzzy, c-format +msgid "" +"Overwrite file:\n" +"%s\n" +" with:\n" +"%s" +msgstr "Datei überschreiben:\n" + +#: src/utilops.c:263 src/utilops.c:622 src/utilops.c:804 +msgid "Overwrite" +msgstr "Überschreiben" + +#: src/utilops.c:289 +#, fuzzy, c-format +msgid "" +"Unable to copy file:\n" +"%s\n" +"to:\n" +"%s" +msgstr "Kann Datei nicht löschen:\n" + +#: src/utilops.c:294 +#, fuzzy, c-format +msgid "" +"Unable to move file:\n" +"%s\n" +"to:\n" +"%s" +msgstr "Kann Datei nicht umbenennen:\n" + +#: src/utilops.c:337 +msgid "Invalid destination" +msgstr "Ungültiges Ziel" + +#: src/utilops.c:337 +msgid "" +"When operating with multiple files, please select\n" +" a directory, not file." +msgstr "" +"Beim Umgang mit mehreren Dateien, bitte ein\n" +" Verzeichnis, keine Datei wählen." + +#: src/utilops.c:339 +msgid "Invalid directory" +msgstr "Ungültiges Verzeichnis" + +#: src/utilops.c:339 +msgid "Please select an existing directory" +msgstr "Bitte wählen Sie ein existierendes Verzeichnis" + +#: src/utilops.c:397 +msgid "GQview - copy" +msgstr "GQview - Kopieren" + +#: src/utilops.c:398 +msgid "Copy" +msgstr "Kopieren" + +#: src/utilops.c:400 +#, c-format +msgid "" +"Copy file:\n" +"%s\n" +"to:" +msgstr "" + +#: src/utilops.c:402 +#, fuzzy, c-format +msgid "" +"Copy multiple files from:\n" +"%s\n" +"to:" +msgstr " mehrere Dateien von:\n" + +#: src/utilops.c:406 +msgid "GQview - move" +msgstr "GQview - Verschieben" + +#: src/utilops.c:407 +msgid "Move" +msgstr "Verschieben" + +#: src/utilops.c:409 +#, c-format +msgid "" +"Move file:\n" +"%s\n" +"to:" +msgstr "" + +#: src/utilops.c:411 +#, fuzzy, c-format +msgid "" +"Move multiple files from:\n" +"%s\n" +"to:" +msgstr " mehrere Dateien von:\n" + +#: src/utilops.c:484 +#, fuzzy, c-format +msgid "" +"Unable to delete file:\n" +" %s\n" +" Continue multiple delete operation?" +msgstr "" +"\n" +"Mehrfaches Löschen fortsetzen?" + +#: src/utilops.c:485 src/utilops.c:491 +msgid "Delete failed" +msgstr "Löschen fehlgeschlagen" + +#: src/utilops.c:490 src/utilops.c:535 +#, fuzzy, c-format +msgid "" +"Unable to delete file:\n" +"%s" +msgstr "Kann Datei nicht löschen:\n" + +#: src/utilops.c:520 +msgid "Delete files" +msgstr "Dateien löschen" + +#: src/utilops.c:520 +msgid "About to delete multiple files..." +msgstr "Werde mehrere Dateien löschen..." + +#: src/utilops.c:521 src/utilops.c:566 +msgid "Delete" +msgstr "Löschen" + +#: src/utilops.c:536 +msgid "File deletion failed" +msgstr "Dateilöschen fehlgeschlagen" + +#: src/utilops.c:564 +#, fuzzy, c-format +msgid "" +"About to delete the file:\n" +" %s" +msgstr "Werde Datei löschen:\n" + +#: src/utilops.c:565 +msgid "Delete file" +msgstr "Datei löschen" + +#: src/utilops.c:620 +#, fuzzy, c-format +msgid "" +"Overwrite file:\n" +"%s\n" +"by renaming:\n" +"%s" +msgstr "Datei überschreiben:\n" + +#: src/utilops.c:631 +#, fuzzy, c-format +msgid "" +"Unable to rename file:\n" +"%s\n" +" to:\n" +"%s" +msgstr "Kann Datei nicht umbenennen:\n" + +#: src/utilops.c:632 src/utilops.c:813 +msgid "Error renaming file" +msgstr "Fehler beim Umbenennen von Datei" + +#: src/utilops.c:722 src/utilops.c:851 +msgid "GQview - rename" +msgstr "GQview - Umbenennen" + +#: src/utilops.c:722 +msgid "Rename multiple files:" +msgstr "Mehrere Dateien umbenennen:" + +#: src/utilops.c:722 src/utilops.c:851 +msgid "Rename" +msgstr "Umbenennen" + +#: src/utilops.c:758 +msgid "Rename:" +msgstr "Umbenennen:" + +#: src/utilops.c:767 +msgid "to:" +msgstr "in:" + +#: src/utilops.c:802 +#, fuzzy, c-format +msgid "" +"Overwrite file:\n" +"%s\n" +"with:\n" +"%s" +msgstr "Datei überschreiben:\n" + +#: src/utilops.c:812 +#, fuzzy, c-format +msgid "" +"Unable to rename file:\n" +"%s\n" +"to:\n" +"%s" +msgstr "Kann Datei nicht umbenennen:\n" + +#: src/utilops.c:850 +#, fuzzy, c-format +msgid "" +"Rename file:\n" +"%s\n" +"to:" +msgstr "Datei umbenennen:\n" + +#: src/utilops.c:894 +#, fuzzy, c-format +msgid "" +"The path:\n" +"%s\n" +"already exists as a file." +msgstr "" +"\n" +" existiert bereits als Datei." + +#: src/utilops.c:895 +msgid "Could not create directory" +msgstr "Konnte Verzeichnis nicht anlegen" + +#: src/utilops.c:900 +#, fuzzy, c-format +msgid "" +"The directory:\n" +"%s\n" +"already exists." +msgstr "" +"\n" +" existiert bereits" + +#: src/utilops.c:901 +msgid "Directory exists" +msgstr "Verzeichnis existiert" + +#: src/utilops.c:908 +#, fuzzy, c-format +msgid "" +"Unable to create directory:\n" +"%s" +msgstr "Kann Verzeichnis nicht anlegen:\n" + +#: src/utilops.c:909 +msgid "Error creating directory" +msgstr "Fehler beim Anlegen von Verzeichnis" + +#: src/utilops.c:948 +#, fuzzy, c-format +msgid "" +"Create directory in:\n" +"%s\n" +"named:" +msgstr "Verzeichnis anlegen in:\n" + +#: src/utilops.c:949 +msgid "GQview - new directory" +msgstr "GQview - Neues Verzeichnis" + +#: src/utilops.c:949 +msgid "Create" +msgstr "Erzeugen" + +#: src/window.c:151 +msgid "GQview Tools" +msgstr "GQview-Werkzeuge" + +#~ msgid "Save" +#~ msgstr "Speichern" + +#~ msgid "Save settings on exit" +#~ msgstr "Einstellungen beim Beenden speichern" + +#~ msgid "Save options" +#~ msgstr "Optionen speichern..." + +#~ msgid "copy" +#~ msgstr "Kopieren" + +#~ msgid "move" +#~ msgstr "Verschieben" + +#~ msgid "" +#~ "\n" +#~ " with:\n" +#~ msgstr "" +#~ "\n" +#~ " mit:\n" + +#~ msgid "Error " +#~ msgstr "Fehler " + +#~ msgid "ing file" +#~ msgstr "von Datei" + +#~ msgid "Unable to " +#~ msgstr "Kann nicht " + +#~ msgid " file:\n" +#~ msgstr " Datei:\n" + +#~ msgid "" +#~ "\n" +#~ " to:\n" +#~ msgstr "" +#~ "\n" +#~ " nach:\n" + +#~ msgid "" +#~ "\n" +#~ "to:" +#~ msgstr "" +#~ "\n" +#~ "nach:" + +#~ msgid "" +#~ "\n" +#~ " by renaming:\n" +#~ msgstr "" +#~ "\n" +#~ " beim Umbenennen:\n" + +#~ msgid "" +#~ "\n" +#~ " to:" +#~ msgstr "" +#~ "\n" +#~ " in:" + +#~ msgid "The path:\n" +#~ msgstr "Der Pfad:\n" + +#~ msgid "The directory:\n" +#~ msgstr "Das Verzeichnis:\n" + +#~ msgid "" +#~ "\n" +#~ " named:" +#~ msgstr "" +#~ "\n" +#~ " genannt:" diff --git a/po/ja.po b/po/ja.po new file mode 100644 index 00000000..177b879d --- /dev/null +++ b/po/ja.po @@ -0,0 +1,855 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR Free Software Foundation, Inc. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 1999-09-27 03:05+0900\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: ENCODING\n" + +#: config.c:295 +msgid "GQview configuration" +msgstr "GQview¤ÎÀßÄê" + +#: config.c:307 +msgid "Ok" +msgstr "Ok" + +#: config.c:312 +msgid "Save" +msgstr "¥»¡¼¥Ö" + +#: config.c:317 utildlg.c:140 utilops.c:401 utilops.c:697 utilops.c:923 +msgid "Cancel" +msgstr "¥­¥ã¥ó¥»¥ë" + +#: config.c:331 +msgid "General" +msgstr "°ìÈÌ" + +#: config.c:339 +msgid "Initial directory" +msgstr "½é´ü¥Ç¥£¥ì¥¯¥È¥ê:" + +#: config.c:349 +msgid "On startup, change to this directory:" +msgstr "µ¯Æ°»þ¤Ë¤³¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ø°ÜÆ°¤¹¤ë" + +#: config.c:361 +msgid "Use current" +msgstr "¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê" + +#: config.c:367 +msgid "Confirm file delete" +msgstr "ºï½ü»þ¤Ë³Îǧ" + +#: config.c:369 +msgid "Save settings on exit" +msgstr "½ªÎ»»þ¤ËÀßÄê¤òÊݸ¤¹¤ë" + +#: config.c:371 +msgid "Remember tool state (float/hidden)" +msgstr "¥Ä¡¼¥ë¥Ð¡¼¤Î¾õÂÖ¤òÊÝ»ý(float¤äÈóɽ¼¨)" + +#: config.c:373 +msgid "Remember window positions" +msgstr "¥¦¥£¥ó¥É¥¦°ÌÃÖ¤òÊÝ»ý" + +#: config.c:375 +msgid "Slide show" +msgstr "¥¹¥é¥¤¥É¥·¥ç¥¦:" + +#: config.c:388 +msgid "Delay before image change (seconds):" +msgstr "¼¡¤Î¥¤¥á¡¼¥¸¤Þ¤Ç¤ÎÉÿô" + +#: config.c:401 +msgid "Random" +msgstr "¥é¥ó¥À¥à" + +#: config.c:403 +msgid "Repeat" +msgstr "·«¤êÊÖ¤¹" + +#: config.c:410 +msgid "Image" +msgstr "¥¤¥á¡¼¥¸" + +#: config.c:418 +msgid "When new image is selected:" +msgstr "¤¢¤¿¤é¤·¤¤¥¤¥á¡¼¥¸¤¬ÁªÂò¤µ¤ì¤¿¤È¤­:" + +#: config.c:428 +msgid "Zoom to original size" +msgstr "¥ª¥ê¥¸¥Ê¥ë¤Î¥µ¥¤¥º¤Ø³ÈÂç" + +#: config.c:434 img-view.c:283 menu.c:464 menu.c:537 menu.c:578 menu.c:668 +msgid "Fit image to window" +msgstr "¥¦¥£¥ó¥É¥¦¤Ë¥Õ¥£¥Ã¥È¤µ¤»¤ë" + +#: config.c:440 +msgid "Leave Zoom at previous setting" +msgstr "ľÁ°¤Î¥º¡¼¥à¤ÎÀßÄê¤ò˺¤ì¤ë" + +#: config.c:447 +msgid "Fit window to image when tools are hidden/floating" +msgstr "¥Ä¡¼¥ë¥Ð¡¼¤Î¾õÂÖÊѹ¹»þ¤Ë¥¤¥á¡¼¥¸¤ò¥¦¥£¥ó¥É¥¦¤Ë¥Õ¥£¥Ã¥È¤µ¤»¤ë" + +#: config.c:454 +msgid "Limit size when auto-sizing window" +msgstr "¥¦¥£¥ó¥É¥¦¤Î¼«Æ°Ä´Àá¤Î¸Â³¦" + +#: config.c:464 menu.c:468 +msgid "Thumbnails" +msgstr "¥µ¥à¥Í¥¤¥ë:" + +#: config.c:480 +msgid "Size:" +msgstr "¥µ¥¤¥º" + +#: config.c:484 +msgid "48x48" +msgstr "" + +#: config.c:490 +msgid "64x64" +msgstr "" + +#: config.c:496 +msgid "85x64" +msgstr "" + +#: config.c:502 +msgid "100x100" +msgstr "" + +#: config.c:509 +msgid "Cache thumbnails" +msgstr "¥µ¥à¥Í¥¤¥ë¤ò¥­¥ã¥Ã¥·¥å¤¹¤ë" + +#: config.c:511 +msgid "Use xvpics thumbnails when found (read only)" +msgstr "xvpics¤¬¤¢¤ë»þ¤Ë»ÈÍѤ¹¤ë(Æɤ߹þ¤ß¤Î¤ß)" + +#: config.c:514 +msgid "Progressive keyboard scrolling" +msgstr "¥­¡¼¥Ü¡¼¥É¤Ë¤è¤ë¥¹¥¯¥í¡¼¥ë" + +#: config.c:521 +msgid "Filtering" +msgstr "¥Õ¥£¥ë¥¿¥ê¥ó¥°" + +#: config.c:530 +msgid "Show entries that begin with a dot" +msgstr "¥É¥Ã¥È¥Õ¥¡¥¤¥ë¤âɽ¼¨¤¹¤ë" + +#: config.c:532 +msgid "Disable File Filtering" +msgstr "¥Õ¥£¥ë¥¿¥ê¥ó¥°¤·¤Ê¤¤" + +#: config.c:534 +msgid "Include files of type:" +msgstr "ɽ¼¨¤¹¤ë³ÈÄ¥»Ò:" + +#: config.c:552 +msgid "JPG / JPEG" +msgstr "" + +#: config.c:554 +msgid "XPM" +msgstr "" + +#: config.c:556 +msgid "TIF / TIFF" +msgstr "" + +#: config.c:563 +msgid "GIF" +msgstr "" + +#: config.c:565 +msgid "PNG" +msgstr "" + +#: config.c:567 +msgid "PPM" +msgstr "" + +#: config.c:574 +msgid "PGM" +msgstr "" + +#: config.c:576 +msgid "PCX" +msgstr "" + +#: config.c:578 +msgid "BMP" +msgstr "" + +#: config.c:584 +msgid "Custom file types:" +msgstr "¥«¥¹¥¿¥à¥¿¥¤¥×" + +#: config.c:597 +msgid "format: [.foo;.bar]" +msgstr "½ñ¼°: [.foo;.bar]" + +#: config.c:606 +msgid "External Editors" +msgstr "³°Éô¥¨¥Ç¥£¥¿" + +#: config.c:618 +msgid "#" +msgstr "" + +#: config.c:621 +msgid "Menu name" +msgstr "ɽ¼¨Ì¾" + +#: config.c:624 +msgid "Command Line" +msgstr "¥³¥Þ¥ó¥É" + +#: config.c:654 menu.c:490 +msgid "About" +msgstr "" + +#: config.c:670 +#, c-format +msgid "" +"GQview %d.%d.%d\n" +"\n" +"Copyright (c) 1999 by John Ellis\n" +"http://gqview.netpedia.net\n" +"gqview@email.com\n" +"\n" +"Released under the GNU Public License" +msgstr "" + +#: dnd.c:130 +#, c-format +msgid "dropped: %s\n" +msgstr "" + +#: filelist.c:51 +msgid " Slideshow" +msgstr "¥¹¥é¥¤¥É¥·¥ç¥¦" + +#: filelist.c:55 +#, c-format +msgid "%d files (%d)%s" +msgstr "" + +#: filelist.c:57 +#, c-format +msgid "%d files%s" +msgstr "" + +#: filelist.c:221 +#, c-format +msgid "s = %d\n" +msgstr "" + +#: filelist.c:225 +#, c-format +msgid "files selected = %d\n" +msgstr "" + +#: filelist.c:466 +#, c-format +msgid "row = %d, closest is %d\n" +msgstr "" + +#: filelist.c:959 +msgid "Loading thumbs..." +msgstr "" + +#: image.c:50 +#, c-format +msgid "%d :%s%d" +msgstr "" + +#: image.c:65 +#, c-format +msgid "( ? x ? ) %d bytes" +msgstr "" + +#: image.c:67 +#, c-format +msgid "( %d x %d ) %d bytes" +msgstr "" + +#: image.c:127 +#, c-format +msgid "auto sized to %d x %d\n" +msgstr "" + +#: image.c:282 +#, c-format +msgid "recalc %d x %d @ %f\n" +msgstr "" + +#: image.c:411 +#, c-format +msgid "redrawn %d x %d\n" +msgstr "" + +#: image.c:417 +msgid "redraw cancelled\n" +msgstr "" + +#: image.c:494 +#, c-format +msgid "sized %d x %d (%d x %d)\n" +msgstr "" + +#: image.c:700 +msgid "GQview - " +msgstr "" + +#: img-main.c:230 +msgid "GQview full screen" +msgstr "GQview ¥Õ¥ë¥¹¥¯¥ê¡¼¥ó" + +#: img-view.c:153 window.c:82 window.c:418 +msgid "GQview" +msgstr "" + +#: img-view.c:280 menu.c:461 menu.c:534 menu.c:574 menu.c:664 +msgid "Zoom in" +msgstr "³ÈÂç" + +#: img-view.c:281 menu.c:462 menu.c:535 menu.c:576 menu.c:666 +msgid "Zoom out" +msgstr "½Ì¾®" + +#: img-view.c:282 menu.c:463 menu.c:536 menu.c:577 +msgid "Zoom 1:1" +msgstr "¸µ¤Î¥µ¥¤¥º" + +#: img-view.c:286 menu.c:448 menu.c:509 menu.c:540 menu.c:581 +msgid "Edit" +msgstr "ÊÔ½¸" + +#: img-view.c:291 menu.c:437 menu.c:516 menu.c:547 menu.c:586 +msgid "Copy..." +msgstr "¥³¥Ô¡¼..." + +#: img-view.c:292 menu.c:438 menu.c:517 menu.c:548 menu.c:587 +msgid "Move..." +msgstr "°ÜÆ°..." + +#: img-view.c:293 menu.c:439 menu.c:518 menu.c:549 menu.c:588 +msgid "Rename..." +msgstr "̾Á°¤ÎÊѹ¹..." + +#: img-view.c:294 menu.c:440 menu.c:519 menu.c:550 menu.c:589 +msgid "Delete..." +msgstr "ºï½ü..." + +#: img-view.c:297 +msgid "Close window" +msgstr "¥¦¥£¥ó¥É¥¦¤òÊĤ¸¤ë" + +#: main.c:89 +#, c-format +msgid "%s \"%s\" &" +msgstr "" + +#: main.c:90 main.c:119 +#, c-format +msgid "GQview running: %s\n" +msgstr "" + +#: main.c:300 +msgid "debugging output enabled\n" +msgstr "" + +#: main.c:315 +#, c-format +msgid "GQview version %d.%d.%d\n" +msgstr "" + +#: main.c:316 +msgid "" +"Usage: gqview [options] [path]\n" +"\n" +msgstr "" +"»È¤¤Êý: gqview [¥ª¥×¥·¥ç¥ó] [¥Ñ¥¹]\n" +"\n" + +#: main.c:317 +msgid "valid options are:\n" +msgstr "¥ª¥×¥·¥ç¥ó:\n" + +#: main.c:318 +msgid " +t, +tools force show of tools\n" +msgstr " +t, +tools ¥Ä¡¼¥ë¥Ð¡¼¤òɽ¼¨\n" + +#: main.c:319 +msgid " -t, -tools force hide of tools\n" +msgstr " -t, -tools ¥Ä¡¼¥ë¥Ð¡¼¤òÈóɽ¼¨\n" + +#: main.c:320 +msgid " -debug turn on debug output\n" +msgstr " -debug ¥Ç¥Ð¥Ã¥°ÍѤνÐÎϤòÍ­¸ú¤Ë¤¹¤ë\n" + +#: main.c:321 +msgid "" +" -help this message\n" +"\n" +msgstr "" +" -help ¤³¤Î¥á¥Ã¥»¡¼¥¸¤òɽ¼¨\n" +"\n" + +#: main.c:326 +#, c-format +msgid "" +"invalid or ignored: %s\n" +"Use -help for options\n" +msgstr "" +"%s¤ÏÉÔÌÀ¤Ç¤¹¡£\n" +"¾Ü¤·¤¯¤Ï `gqview -help` ¤ò¼Â¹Ô¤·¤Æ¤¯¤À¤µ¤¤¡£\n" + +#: main.c:353 +msgid "The Gimp" +msgstr "" + +#: main.c:356 +msgid "Electric Eyes" +msgstr "" + +#: main.c:359 +msgid "XV" +msgstr "" + +#: main.c:362 +msgid "Xpaint" +msgstr "" + +#: menu.c:369 +#, c-format +msgid "in %s..." +msgstr "" + +#: menu.c:371 +msgid "in (unknown)..." +msgstr "" + +#: menu.c:390 +msgid "Options..." +msgstr "¥ª¥×¥·¥ç¥ó..." + +#: menu.c:391 +msgid "Save options" +msgstr "ÀßÄê¤òÊݸ" + +#: menu.c:393 +msgid "Remove old thumbnails" +msgstr "¸Å¤¤¥µ¥à¥Í¥¤¥ë¤òÇË´þ" + +#: menu.c:431 +msgid "File" +msgstr "¥Õ¥¡¥¤¥ë" + +#: menu.c:435 +msgid "Create Dir..." +msgstr "¥Ç¥£¥ì¥¯¥È¥êºîÀ®..." + +#: menu.c:442 +msgid "Exit" +msgstr "½ªÎ»" + +#: menu.c:457 +msgid "View" +msgstr "¥Ó¥å¡¼" + +#: menu.c:467 menu.c:553 +msgid "Full screen" +msgstr "¥Õ¥ë¥¹¥¯¥ê¡¼¥ó" + +#: menu.c:469 +msgid "activate" +msgstr "" + +#: menu.c:475 +msgid "Refresh Lists" +msgstr "¥ê¥¹¥È¤Î¹¹¿·" + +#: menu.c:476 +msgid "(Un)Float file list" +msgstr "¥Õ¥¡¥¤¥ë¥ê¥¹¥È¤ò(Èó)¥Õ¥í¡¼¥È¤Ë¤¹¤ë" + +#: menu.c:477 menu.c:552 +msgid "(Un)Hide file list" +msgstr "¥Õ¥¡¥¤¥ë¥ê¥¹¥È¤ò(Èó)ɽ¼¨¤Ë¤¹¤ë" + +#: menu.c:480 +msgid "Toggle slideshow" +msgstr "¥¹¥é¥¤¥É¥·¥ç¥¦" + +#: menu.c:486 +msgid "Help" +msgstr "¥Ø¥ë¥×" + +#: menu.c:513 menu.c:544 +msgid "View in new window" +msgstr "¿·¤·¤¤¥¦¥£¥ó¥É¥¦¤Ç¤ß¤ë" + +#: menu.c:521 +msgid "Refresh" +msgstr "¹¹¿·" + +#: menu.c:592 +msgid "Exit full screen" +msgstr "¥Õ¥ë¥¹¥¯¥ê¡¼¥ó¤ò¤ä¤á¤ë" + +#: menu.c:651 +msgid "Create thumbnails" +msgstr "¥µ¥à¥Í¥¤¥ëºîÀ®" + +#: menu.c:660 +msgid "Change to home directory" +msgstr "¥Û¡¼¥à¥Ç¥£¥ì¥¯¥È¥ê¤Ø°ÜÆ°" + +#: menu.c:662 +msgid "Refresh file list" +msgstr "¥Õ¥¡¥¤¥ë¥ê¥¹¥È¤Î¹¹¿·" + +#: menu.c:670 +msgid "Set zoom 1:1" +msgstr "¸µ¤Î¥µ¥¤¥º¤Ë¤¹¤ë" + +#: menu.c:672 +msgid "Configure options" +msgstr "¥ª¥×¥·¥ç¥óÀßÄê" + +#: menu.c:674 +msgid "Float Controls" +msgstr "¥³¥ó¥È¥í¡¼¥ë¤ò¥Õ¥í¡¼¥È¾õÂ֤ˤ¹¤ë" + +#: tabcomp.c:388 +msgid "Tab completion error: entry != NULL\n" +msgstr "" + +#: thumb.c:32 +#, c-format +msgid "Gen thumbnail:%s\n" +msgstr "¥µ¥à¥Í¥¤¥ëºîÀ®:%s\n" + +#: thumb.c:40 +msgid "XV thumbnail found, loaded\n" +msgstr "XV¤Î¥µ¥à¥Í¥¤¥ë¤ò¸«¤Ä¤±¤¿¤Î¤Ç¡¢Æɤ߹þ¤ß¤Þ¤·¤¿\n" + +#: thumb.c:54 +#, c-format +msgid "Found in cache:%s\n" +msgstr "¥­¥ã¥Ã¥·¥å¤ò¸«¤Ä¤±¤Þ¤·¤¿:%s\n" + +#: thumb.c:116 +#, c-format +msgid "creating thumbnail dir:%s\n" +msgstr "%s¥Ç¥£¥ì¥¯¥È¥ê¤Î¥µ¥à¥Í¥¤¥ë¤òºîÀ®¤·¤Æ¤¤¤Þ¤¹¡£\n" + +#: thumb.c:118 thumb.c:142 +#, c-format +msgid "create dir failed: %s\n" +msgstr "%s¥Ç¥£¥ì¥¯¥È¥ê¤Ç¼ºÇÔ¤·¤Þ¤·¤¿¡£\n" + +#: thumb.c:140 +#, c-format +msgid "creating sub dir:%s\n" +msgstr "¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê%s¤Î¥µ¥à¥Í¥¤¥ë¤òºîÀ®¤·¤Æ¤¤¤Þ¤¹¡£\n" + +#: thumb.c:151 +#, c-format +msgid "Saving thumb: %s\n" +msgstr "¥µ¥à¥Í¥¤¥ë%s¤òÊݸ¤·¤Þ¤·¤¿¡£\n" + +#: thumb.c:186 +#, c-format +msgid "maintainance check: %s\n" +msgstr "%s¤ò¥á¥ó¥Æ¥Ê¥ó¥¹¤Î¤¿¤á¥Á¥§¥Ã¥¯¤·¤Æ¤¤¤Þ¤¹¡£\n" + +#: thumb.c:222 +#, c-format +msgid "Deleting thumb dir: %s\n" +msgstr "%s¥Ç¥£¥ì¥¯¥È¥ê¤Î¥µ¥à¥Í¥¤¥ë¤òºï½ü¤·¤Æ¤¤¤Þ¤¹¡£\n" + +#: thumb.c:224 +#, c-format +msgid "Unable to delete dir: %s\n" +msgstr "%s¥Ç¥£¥ì¥¯¥È¥ê¤Çºï½ü¤Ë¼ºÇÔ¡£\n" + +#: thumb.c:238 +#, c-format +msgid "Deleting thumb: %s\n" +msgstr "¥µ¥à¥Í¥¤¥ë%s¤òºï½ü¤·¤Æ¤¤¤Þ¤¹¡£\n" + +#: thumb.c:240 +#, c-format +msgid "failed to delete:%s\n" +msgstr "%s¤Îºï½ü¤Ë¼ºÇÔ\n" + +#: utildlg.c:67 +msgid " Ok " +msgstr "" + +#: utilops.c:112 utilops.c:231 +msgid "copy" +msgstr "¥³¥Ô¡¼" + +#: utilops.c:114 utilops.c:233 +msgid "move" +msgstr "°ÜÆ°" + +#: utilops.c:168 utilops.c:262 utilops.c:595 utilops.c:776 +msgid "Overwrite file:\n" +msgstr "¥Õ¥¡¥¤¥ë¤Î¾å½ñ¤­:\n" + +#: utilops.c:168 utilops.c:262 utilops.c:776 +msgid "" +"\n" +" with:\n" +msgstr "" +"\n" +"¤ò...\n" + +#: utilops.c:169 utilops.c:263 utilops.c:596 utilops.c:777 +msgid "Overwrite file" +msgstr "¥Õ¥¡¥¤¥ë¤Î¾å½ñ¤­" + +#: utilops.c:170 +msgid "Skip" +msgstr "¥¹¥­¥Ã¥×" + +#: utilops.c:171 +msgid "Yes to all" +msgstr "¤¹¤Ù¤Æ¤Ï¤¤" + +#: utilops.c:172 +msgid "Yes" +msgstr "¤Ï¤¤" + +#: utilops.c:202 utilops.c:285 +msgid "Error " +msgstr "¥¨¥é¡¼" + +#: utilops.c:202 +msgid "ing file" +msgstr "" + +#: utilops.c:203 utilops.c:286 +msgid "Unable to " +msgstr "" + +#: utilops.c:203 utilops.c:286 utilops.c:397 +msgid " file:\n" +msgstr "" + +#: utilops.c:203 utilops.c:286 utilops.c:606 utilops.c:786 +msgid "" +"\n" +" to:\n" +msgstr "" + +#: utilops.c:203 +msgid "" +"\n" +" during multiple file move." +msgstr "" + +#: utilops.c:205 utilops.c:461 +msgid "Continue" +msgstr "" + +#: utilops.c:264 utilops.c:597 utilops.c:778 +msgid "Overwrite" +msgstr "" + +#: utilops.c:328 +msgid "Invalid destination" +msgstr "" + +#: utilops.c:328 +msgid "" +"When operating with multiple files, please select\n" +" a directory, not file." +msgstr "" + +#: utilops.c:330 +msgid "Invalid directory" +msgstr "" + +#: utilops.c:330 +msgid "Please select an existing directory" +msgstr "" + +#: utilops.c:387 +msgid "GQview - copy" +msgstr "" + +#: utilops.c:388 +msgid "Copy" +msgstr "" + +#: utilops.c:392 +msgid "GQview - move" +msgstr "" + +#: utilops.c:393 +msgid "Move" +msgstr "" + +#: utilops.c:397 utilops.c:399 +msgid "" +"\n" +"to:" +msgstr "" + +#: utilops.c:399 +msgid " multiple files from:\n" +msgstr "" + +#: utilops.c:459 utilops.c:465 utilops.c:510 +msgid "Unable to delete file:\n" +msgstr "" + +#: utilops.c:459 +msgid "" +"\n" +"Continue multiple delete operation?" +msgstr "" + +#: utilops.c:460 utilops.c:466 +msgid "Delete failed" +msgstr "" + +#: utilops.c:495 +msgid "Delete files" +msgstr "" + +#: utilops.c:495 +msgid "About to delete multiple files..." +msgstr "" + +#: utilops.c:496 utilops.c:541 +msgid "Delete" +msgstr "" + +#: utilops.c:511 +msgid "File deletion failed" +msgstr "" + +#: utilops.c:539 +msgid "About to delete the file:\n" +msgstr "" + +#: utilops.c:540 +msgid "Delete file" +msgstr "" + +#: utilops.c:595 +msgid "" +"\n" +" by renaming:\n" +msgstr "" + +#: utilops.c:606 utilops.c:786 +msgid "Unable to rename file:\n" +msgstr "" + +#: utilops.c:607 utilops.c:787 +msgid "Error renaming file" +msgstr "" + +#: utilops.c:624 +#, c-format +msgid "r=%d n=%d\n" +msgstr "" + +#: utilops.c:640 +#, c-format +msgid "closed by #%d\n" +msgstr "" + +#: utilops.c:697 utilops.c:825 +msgid "GQview - rename" +msgstr "" + +#: utilops.c:697 +msgid "Rename multiple files:" +msgstr "" + +#: utilops.c:697 +msgid "Rename" +msgstr "" + +#: utilops.c:732 +msgid "Rename:" +msgstr "" + +#: utilops.c:741 +msgid "to:" +msgstr "" + +#: utilops.c:824 +msgid "Rename file:\n" +msgstr "" + +#: utilops.c:824 +msgid "" +"\n" +" to:" +msgstr "" + +#: utilops.c:868 +msgid "The path:\n" +msgstr "" + +#: utilops.c:868 +msgid "" +"\n" +" already exists as a file." +msgstr "" + +#: utilops.c:874 +msgid "The directory:\n" +msgstr "" + +#: utilops.c:874 +msgid "" +"\n" +" already exists." +msgstr "" + +#: utilops.c:882 +msgid "Unable to create directory:\n" +msgstr "¥Ç¥£¥ì¥¯¥È¥ê¤ÎºîÀ®¤¬¤Ç¤­¤Þ¤»¤ó¡£\n" + +#: utilops.c:922 +msgid "Create directory in:\n" +msgstr "¥Ç¥£¥ì¥¯¥È¥êºîÀ®\n" + +#: utilops.c:922 +msgid "" +"\n" +" named:" +msgstr "" + +#: utilops.c:923 +msgid "GQview - new directory" +msgstr "GQview - ¿·µ¬¥Ç¥£¥ì¥¯¥È¥ê" + +#: utilops.c:923 +msgid "Create" +msgstr "ºîÀ®" + diff --git a/po/pt_BR.po b/po/pt_BR.po new file mode 100644 index 00000000..56ac6955 --- /dev/null +++ b/po/pt_BR.po @@ -0,0 +1,798 @@ +# gqview pt_BR.po file. +# Copyright (C) 1999 Vitor Fernandes. +# Vitor Fernandes , 1999. +# +msgid "" +msgstr "" +"Project-Id-Version: gqview-0.7.0c\n" +"POT-Creation-Date: 1999-09-15 15:22-0300\n" +"PO-Revision-Date: 1999-09-15 16:47-0300\n" +"Last-Translator: Vitor Fernandes \n" +"Language-Team: Vitor Fernandes \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=3Diso-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" + + +#: src/config.c:303 +msgid "GQview configuration" +msgstr "Configura=E7=E3o do GQview" + +#: src/config.c:315 +msgid "Ok" +msgstr "Ok" + +#: src/config.c:320 +msgid "Apply" +msgstr "Aplicar" + +#: src/config.c:325 src/utildlg.c:140 src/utilops.c:414 src/utilops.c:722 +#: src/utilops.c:851 src/utilops.c:949 +msgid "Cancel" +msgstr "Cancelar" + +#: src/config.c:339 +msgid "General" +msgstr "Geral" + +#: src/config.c:347 +msgid "Initial directory" +msgstr "Diret=F3rio inicial" + +#: src/config.c:357 +msgid "On startup, change to this directory:" +msgstr "Na abertura, mude para esse diret=F3rio:" + +#: src/config.c:369 +msgid "Use current" +msgstr "Use o atual" + +#: src/config.c:375 +msgid "Confirm file delete" +msgstr "Confirmar exclus=E3o de arquivo" + +#: src/config.c:377 +msgid "Remember tool state (float/hidden)" +msgstr "Lembrar estado da ferramenta (flutuante/escondida)" + +#: src/config.c:379 +msgid "Remember window positions" +msgstr "Lembrar posi=E7=F5es da janela" + +#: src/config.c:381 +msgid "Slide show" +msgstr "Show de slides" + +#: src/config.c:394 +msgid "Delay before image change (seconds):" +msgstr "Demora antes de mudar imagem (segundos):" + +#: src/config.c:407 +msgid "Random" +msgstr "Aleat=F3rio" + +#: src/config.c:409 +msgid "Repeat" +msgstr "Repetir" + +#: src/config.c:416 +msgid "Image" +msgstr "Imagem" + +#: src/config.c:424 +msgid "When new image is selected:" +msgstr "Quando nova imagem =E9 selecionada:" + +#: src/config.c:434 +msgid "Zoom to original size" +msgstr "Zoom para o tamanho original" + +#: src/config.c:440 src/img-view.c:283 src/menu.c:458 src/menu.c:531 +#: src/menu.c:571 src/menu.c:661 +msgid "Fit image to window" +msgstr "Ajustar imagem =E0 janela" + +#: src/config.c:446 +msgid "Leave Zoom at previous setting" +msgstr "Deixar o Zoom na configura=E7=E3o anterior" + +#: src/config.c:453 +msgid "Fit window to image when tools are hidden/floating" +msgstr "Ajustar janela =E0 imagem quando as ferramentas estiverem escondidas/flutuando" + +#: src/config.c:460 +msgid "Limit size when auto-sizing window" +msgstr "Limitar tamanho quando auto-dimensionando janela" + +#: src/config.c:470 src/menu.c:462 +msgid "Thumbnails" +msgstr "Miniaturas" + +#: src/config.c:486 +msgid "Size:" +msgstr "Tamanho:" + +#: src/config.c:515 +msgid "Cache thumbnails" +msgstr "Manter miniaturas" + +#: src/config.c:517 +msgid "Use xvpics thumbnails when found (read only)" +msgstr "Usar miniaturas xvpics quando encontradas (somente leitura)" + +#: src/config.c:520 +msgid "Progressive keyboard scrolling" +msgstr "Rolagem de teclado progressiva" + +#: src/config.c:527 +msgid "Filtering" +msgstr "Filtragem" + +#: src/config.c:536 +msgid "Show entries that begin with a dot" +msgstr "Exibir entradas que iniciam com um ponto" + +#: src/config.c:538 +msgid "Disable File Filtering" +msgstr "Desativar Filtragem de Arquivos" + +#: src/config.c:540 +msgid "Include files of type:" +msgstr "Incluir arquivos do tipo:" + +#: src/config.c:590 +msgid "Custom file types:" +msgstr "Tipos de arquivos personalizados:" + +#: src/config.c:603 +msgid "format: [.foo;.bar]" +msgstr "formato: [.foo;.bar]" + +#: src/config.c:612 +msgid "External Editors" +msgstr "Editores Externos" + +#: src/config.c:624 +msgid "#" +msgstr "#" + +#: src/config.c:627 +msgid "Menu name" +msgstr "Nome no menu" + +#: src/config.c:630 +msgid "Command Line" +msgstr "Linha do comando" + +#: src/config.c:660 src/menu.c:484 +msgid "About" +msgstr "Sobre" + +#: src/config.c:676 +msgid "" +"GQview %s\n" +"\n" +"Copyright (c) 1999 by John Ellis\n" +"http://gqview.netpedia.net\n" +"gqview@email.com\n" +"\n" +"Released under the GNU Public License" +msgstr "" +"GQview %s\n" +"\n" +"Copyright (c) 1999 por John Ellis\n" +"http://gqview.netpedia.net\n" +"gqview@email.com\n" +"\n" +"Lan=E7ado sob a Licensa P=FAblica Geral GNU" + +#: src/filelist.c:51 +msgid " Slideshow" +msgstr "Show de Slides" + +#: src/filelist.c:55 +msgid "%d files (%d)%s" +msgstr "%d arquivos (%d)%s" + +#: src/filelist.c:57 +msgid "%d files%s" +msgstr "%d arquivos%s" + +#: src/filelist.c:960 +msgid "Loading thumbs..." +msgstr "Carregando mini..." + +#: src/image.c:65 +msgid "( ? x ? ) %d bytes" +msgstr "" + +#: src/image.c:67 +msgid "( %d x %d ) %d bytes" +msgstr "" + +#: src/img-main.c:230 +msgid "GQview full screen" +msgstr "GQview tela cheia" + +#: src/img-view.c:280 src/menu.c:455 src/menu.c:528 src/menu.c:568 +#: src/menu.c:657 +msgid "Zoom in" +msgstr "Mais Zoom" + +#: src/img-view.c:281 src/menu.c:456 src/menu.c:529 src/menu.c:569 src/menu.c:659 +msgid "Zoom out" +msgstr "Menos Zoom" + +#: src/img-view.c:282 src/menu.c:457 src/menu.c:530 src/menu.c:570 +msgid "Zoom 1:1" +msgstr "" + +#. edit menu +#: src/img-view.c:286 src/menu.c:442 src/menu.c:503 src/menu.c:534 src/menu.c:574 +msgid "Edit" +msgstr "Editar" + +#: src/img-view.c:291 src/menu.c:431 src/menu.c:510 src/menu.c:541 src/menu.c:579 +msgid "Copy..." +msgstr "Copiar..." + +#: src/img-view.c:292 src/menu.c:432 src/menu.c:511 src/menu.c:542 src/menu.c:580 +msgid "Move..." +msgstr "Mover..." + +#: src/img-view.c:293 src/menu.c:433 src/menu.c:512 src/menu.c:543 src/menu.c:581 +msgid "Rename..." +msgstr "Renomear..." + +#: src/img-view.c:294 src/menu.c:434 src/menu.c:513 src/menu.c:544 src/menu.c:582 +msgid "Delete..." +msgstr "Excluir..." + +#: src/img-view.c:297 +msgid "Close window" +msgstr "Fechar janela" + +#: src/main.c:90 src/main.c:119 +msgid "GQview running: %s\n" +msgstr "GQview rodando: %s\n" + +#: src/main.c:316 +msgid "" +"Usage: gqview [options] [path]\n" +"\n" +msgstr "" +"Uso: gqview [op=E7=F5es] [caminho]\n" +"\n" + +#: src/main.c:317 +msgid "valid options are:\n" +msgstr "op=E7=F5es v=E1lidas s=E3o:\n" + +#: src/main.c:318 +msgid " +t, +tools force show of tools\n" +msgstr " +t, +tools for=E7a a exibir as ferramentas\n" + +#: src/main.c:319 +msgid " -t, -tools force hide of tools\n" +msgstr " -t, -tools for=E7a a olcultar as ferramentas\n" + +#: src/main.c:320 +msgid " -debug turn on debug output\n" +msgstr " -debug ativa sa=EDda de debug\n" + +#: src/main.c:321 +msgid "" +" -help this message\n" +"\n" +msgstr "" +" -help essa mensagem\n" +"\n" +#: src/main.c:326 +msgid "" +"invalid or ignored: %s\n" +"Use -help for options\n" +msgstr "" +"inv=E1lido ou ignorado: %s\n" +"Use -help para op=E7=F5es\n" +#: src/main.c:353 +msgid "The Gimp" +msgstr "" + +#: src/main.c:356 +msgid "Electric Eyes" +msgstr "" + +#: src/main.c:359 +msgid "XV" +msgstr "" + +#: src/main.c:362 +msgid "Xpaint" +msgstr "" + +#: src/menu.c:364 +msgid "in %s..." +msgstr "em %s..." + +#: src/menu.c:366 +msgid "in (unknown)..." +msgstr "em (desconhecido)..." + +#: src/menu.c:385 +msgid "Options..." +msgstr "Op=E7=F5es..." + +#: src/menu.c:387 +msgid "Remove old thumbnails" +msgstr "Remover miniaturas velhas" + +#. file menu +#: src/menu.c:425 +msgid "File" +msgstr "Arquivo" + +#: src/menu.c:429 +msgid "Create Dir..." +msgstr "Criar diret=F3rio..." + +#: src/menu.c:436 +msgid "Exit" +msgstr "Sair" + +#. view menu +#: src/menu.c:451 +msgid "View" +msgstr "Ver" + +#: src/menu.c:461 src/menu.c:547 +msgid "Full screen" +msgstr "Tela cheia" + +#: src/menu.c:469 +msgid "Refresh Lists" +msgstr "Atualizar Listas" + +#: src/menu.c:470 +msgid "(Un)Float file list" +msgstr "(Des)Flutuar lista de arquivos" + +#: src/menu.c:471 src/menu.c:546 +msgid "(Un)Hide file list" +msgstr "(Des)Esconder lista de arquivos" + +#: src/menu.c:474 +msgid "Toggle slideshow" +msgstr "Alternar show de slides" + +#: src/menu.c:480 +msgid "Help" +msgstr "Ajuda" + +#: src/menu.c:507 src/menu.c:538 +msgid "View in new window" +msgstr "Ver em nova janela" + +#: src/menu.c:515 +msgid "Refresh" +msgstr "Atualizar" + +#: src/menu.c:585 +msgid "Exit full screen" +msgstr "Sair da tela cheia" + +#: src/menu.c:644 +msgid "Create thumbnails" +msgstr "Criar miniaturas" + +#: src/menu.c:653 +msgid "Change to home directory" +msgstr "Mudar para diret=F3rio pessoal" + +#: src/menu.c:655 +msgid "Refresh file list" +msgstr "Atualizar lista de arquivos" + +#: src/menu.c:663 +msgid "Set zoom 1:1" +msgstr "Deixar zoom em 1:1" + +#: src/menu.c:665 +msgid "Configure options" +msgstr "Configurar op=E7=F5es" + +#: src/menu.c:667 +msgid "Float Controls" +msgstr "Controles Flutuantes" + +#: src/rcfile.c:132 +msgid "error saving config file: %s\n" +msgstr "erro salvando arquivo de configura=E7=E3o: %s\n" + +#: src/thumb.c:127 src/thumb.c:151 +msgid "create dir failed: %s\n" +msgstr "falha ao criar diret=F3rio: %s\n" + +#: src/thumb.c:233 +msgid "Unable to delete dir: %s\n" +msgstr "Incapaz de excluir diret=F3rio: %s\n" + +#: src/thumb.c:249 +msgid "failed to delete:%s\n" +msgstr "falha ao excluir: %s\n" + +#: src/utildlg.c:67 +msgid " Ok " +msgstr " OK " + +#: src/utilops.c:162 +msgid "" +"Overwrite file:\n" +" %s\n" +" with:\b %s" +msgstr "" +"Sobescrever arquivo:\n" +" %s\n" +" com:\b %s" + +#: src/utilops.c:163 src/utilops.c:262 src/utilops.c:621 src/utilops.c:803 +msgid "Overwrite file" +msgstr "Sobescrever arquivo" + +#: src/utilops.c:164 +msgid "Skip" +msgstr "Saltar" + +#: src/utilops.c:165 +msgid "Yes to all" +msgstr "Sim para todos" + +#: src/utilops.c:166 +msgid "Yes" +msgstr "Sim" + +#: src/utilops.c:200 src/utilops.c:288 +msgid "Error copying file" +msgstr "Erro copiando arquivo" + +#: src/utilops.c:201 +msgid "" +"Unable to copy file:\n" +"%sto:\n" +"%s\n" +" during multiple file copy." +msgstr "" +"Incapaz de copiar arquivo:\n" +"%sto:\n" +"%s\n" +" durante c=F3pia m=FAltipla de arquivos." + +#: src/utilops.c:205 src/utilops.c:293 +msgid "Error moving file" +msgstr "Erro movendo arquivo" + +#: src/utilops.c:206 +msgid "" +"Unable to move file:\n" +"%sto:\n" +"%s\n" +" during multiple file move." +msgstr "" +"Incapaz de mover arquivo:\n" +"%sto:\n" +"%s\n" +" durante movimento m=FAltiplo de arquivos." + +#: src/utilops.c:209 src/utilops.c:486 +msgid "Continue" +msgstr "Continuar" + +#: src/utilops.c:261 +msgid "" +"Overwrite file:\n" +"%s\n" +" with:\n" +"%s" +msgstr "" +"Sobescrever arquivo:\n" +"%s\n" +" com:\n" +"%s" + +#: src/utilops.c:263 src/utilops.c:622 src/utilops.c:804 +msgid "Overwrite" +msgstr "Sobescrever" + +#: src/utilops.c:289 +msgid "" +"Unable to copy file:\n" +"%s\n" +"to:\n" +"%s" +msgstr "" +"Incapaz de copiar arquivo:\n" +"%s\n" +"para:\n" +"%s" + +#: src/utilops.c:294 +msgid "" +"Unable to move file:\n" +"%s\n" +"to:\n" +"%s" +msgstr "" +"Incapaz de mover arquivo:\n" +"%s\n" +"para:\n" +"%s" + +#: src/utilops.c:337 +msgid "Invalid destination" +msgstr "Destino inv=E1lido" + +#: src/utilops.c:337 +msgid "" +"When operating with multiple files, please select\n" +" a directory, not file." +msgstr "" +"Quando operando com v=E1rios arquivos, por favor selecione\n" +" um diret=F3rio, n=E3o arquivo." + +#: src/utilops.c:339 +msgid "Invalid directory" +msgstr "Diret=F3rio inv=E1lido" + +#: src/utilops.c:339 +msgid "Please select an existing directory" +msgstr "Por favor selecione um diret=F3rio existente" + +#: src/utilops.c:397 +msgid "GQview - copy" +msgstr "GQview - copiar" + +#: src/utilops.c:398 +msgid "Copy" +msgstr "Copiar" + +#: src/utilops.c:400 +msgid "" +"Copy file:\n" +"%s\n" +"to:" +msgstr "" +"Copiar arquivo:\n" +"%s\n" +"para:" + +#: src/utilops.c:402 +msgid "" +"Copy multiple files from:\n" +"%s\n" +"to:" +msgstr "" +"Copiar m=FAltiplos arquivos de:\n" +"%s\n" +"para:" + +#: src/utilops.c:406 +msgid "GQview - move" +msgstr "GQview - mover" + +#: src/utilops.c:407 +msgid "Move" +msgstr "Mover" + +#: src/utilops.c:409 +msgid "" +"Move file:\n" +"%s\n" +"to:" +msgstr "" +"Mover arquivo:\n" +"%s\n" +"para:" + +#: src/utilops.c:411 +msgid "" +"Move multiple files from:\n" +"%s\n" +"to:" +msgstr "" +"Mover m=FAltiplos arquivos de:\n" +"%s\n" +"para:" + +#: src/utilops.c:484 +msgid "" +"Unable to delete file:\n" +" %s\n" +" Continue multiple delete operation?" +msgstr "" +"Incapaz de excluir arquivo:\n" +" %s\n" +" Continuar opera=E7=E3o de exclus=E3o multipla ?" + +#: src/utilops.c:485 src/utilops.c:491 +msgid "Delete failed" +msgstr "Falha ao excluir" + +#: src/utilops.c:490 src/utilops.c:535 +msgid "" +"Unable to delete file:\n" +"%s" +msgstr "" +"Incapaz de excluir arquivo:\n" +"%s" + +#: src/utilops.c:520 +msgid "Delete files" +msgstr "Excluir arquivos" + +#: src/utilops.c:520 +msgid "About to delete multiple files..." +msgstr "Prestes a excluir m=FAltiplos arquivos..." + +#: src/utilops.c:521 src/utilops.c:566 +msgid "Delete" +msgstr "Excluir" + +#: src/utilops.c:536 +msgid "File deletion failed" +msgstr "Exclus=E3o de arquivos falhou" + +#: src/utilops.c:564 +msgid "" +"About to delete the file:\n" +" %s" +msgstr "" +"Prestes a excluir o arquivo:\n" +" %s" + +#: src/utilops.c:565 +msgid "Delete file" +msgstr "Excluir arquivo" + +#: src/utilops.c:620 +msgid "" +"Overwrite file:\n" +"%s\n" +"by renaming:\n" +"%s" +msgstr "" +"Sobescrever arquivo:\n" +"%s\n" +"renomeando:\n" +"%s" + +#: src/utilops.c:631 +msgid "" +"Unable to rename file:\n" +"%s\n" +" to:\n" +"%s" +msgstr "" +"Incapaz de renomear arquivo:\n" +"%s\n" +" para:\n" +"%s" + +#: src/utilops.c:632 src/utilops.c:813 +msgid "Error renaming file" +msgstr "Erro renomeando arquivo" + +#: src/utilops.c:722 src/utilops.c:851 +msgid "GQview - rename" +msgstr "GQview - renomear" + +#: src/utilops.c:722 +msgid "Rename multiple files:" +msgstr "Renomear m=FAltiplos arquivos:" + +#: src/utilops.c:722 src/utilops.c:851 +msgid "Rename" +msgstr "Renomear" + +#: src/utilops.c:758 +msgid "Rename:" +msgstr "Renomear:" + +#: src/utilops.c:767 +msgid "to:" +msgstr "para:" + +#: src/utilops.c:802 +msgid "" +"Overwrite file:\n" +"%s\n" +"with:\n" +"%s" +msgstr "" +"Sobescrever arquivo:\n" +"%s\n" +"com:\n" +"%s" + +#: src/utilops.c:812 +msgid "" +"Unable to rename file:\n" +"%s\n" +"to:\n" +"%s" +msgstr "" +"Incapaz de renomear arquivo:\n" +"%s\n" +"para:\n" +"%s" + +#: src/utilops.c:850 +msgid "" +"Rename file:\n" +"%s\n" +"to:" +msgstr "" +"Renomear arquivo:\n" +"%s\n" +"para:" + +#: src/utilops.c:894 +msgid "" +"The path:\n" +"%s\n" +"already exists as a file." +msgstr "" +"O caminho:\n" +"%s\n" +"j=E1 existe como um arquivo." + +#: src/utilops.c:895 +msgid "Could not create directory" +msgstr "N=E3o pude criar diret=F3rio" + +#: src/utilops.c:900 +msgid "" +"The directory:\n" +"%s\n" +"already exists." +msgstr "" +"O diret=F3rio:\n" +"%s\n" +"j=E1 existe." + +#: src/utilops.c:901 +msgid "Directory exists" +msgstr "Diret=F3rio existe" + +#: src/utilops.c:908 +msgid "" +"Unable to create directory:\n" +"%s" +msgstr "" +"Incapaz de criar diret=F3rio:\n" +"%s" + +#: src/utilops.c:909 +msgid "Error creating directory" +msgstr "Erro criando diret=F3rio" + +#: src/utilops.c:948 +msgid "" +"Create directory in:\n" +"%s\n" +"named:" +msgstr "" +"Criar diret=F3rio em:\n" +"%s\n" +"chamado:" + +#: src/utilops.c:949 +msgid "GQview - new directory" +msgstr "GQview - novo diret=F3rio" + +#: src/utilops.c:949 +msgid "Create" +msgstr "Criar" + +#: src/window.c:151 +msgid "GQview Tools" +msgstr "GQview Ferramentas" + diff --git a/po/ru.po b/po/ru.po new file mode 100644 index 00000000..d58934a5 --- /dev/null +++ b/po/ru.po @@ -0,0 +1,837 @@ +# gqview ru.po file. Russian locale definition for gqview. +# Copyright (C) 1999 Free Software Foundation, Inc. +# Oleg Andrjushenko , 1999. +# +msgid "" +msgstr "" +"Project-Id-Version: gqview-0.7.0d\n" +"POT-Creation-Date: 1999-09-09 09:09+0300\n" +"PO-Revision-Date: 1999-09-09 09:09+0300\n" +"Last-Translator: Oleg Andrjushenko \n" +"Language-Team: It`s me \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=koi8-r\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/config.c:303 +msgid "GQview configuration" +msgstr "ëÏÎÆÉÇÕÒÁÃÉÑ GQview" + +#: src/config.c:315 +msgid "Ok" +msgstr "Ok" + +#: src/config.c:320 +msgid "Apply" +msgstr "ðÒÉÍÅÎÉÔØ" + +#: src/config.c:325 src/utildlg.c:140 src/utilops.c:414 src/utilops.c:722 +#: src/utilops.c:851 src/utilops.c:949 +msgid "Cancel" +msgstr "ïÔÍÅÎÁ" + +#: src/config.c:339 +msgid "General" +msgstr "ïÂÝÉÅ" + +#: src/config.c:347 +msgid "Initial directory" +msgstr "éÓÈÏÄÎÙÊ ËÁÔÁÌÏÇ" + +#: src/config.c:357 +msgid "On startup, change to this directory:" +msgstr "ðÒÉ ÓÔÁÒÔÅ, ÉÚÍÅÎÉÔØ ÎÁ ËÁÔÁÌÏÇ:" + +#: src/config.c:369 +msgid "Use current" +msgstr "éÓÐÏÌØÚÏ×ÁÔØ ÔÅËÕÝÉÊ" + +#: src/config.c:375 +msgid "Confirm file delete" +msgstr "ðÏÄÔ×ÅÒÖÄÁÔØ ÕÄÁÌÅÎÉÅ ÆÁÊÌÏ×" + +#: src/config.c:377 +msgid "Remember tool state (float/hidden)" +msgstr "ðÏÍÎÉÔØ ÒÁÓÐÏÌÏÖÅÎÉÅ ÉÎÓÔÒÕÍÅÎÔÏ× (Ó×ÏÂÏÄÎÏÅ/ÐÒÉËÒÅÐÌÅÎÎÏÅ)" + +#: src/config.c:379 +msgid "Remember window positions" +msgstr "ðÏÍÎÉÔØ ÒÁÓÐÏÌÏÖÅÎÉÅ ÏËÎÁ" + +#: src/config.c:381 +msgid "Slide show" +msgstr "ðÒÏÓÍÏÔÒ ÓÌÁÊÄÏ×" + +#: src/config.c:394 +msgid "Delay before image change (seconds):" +msgstr "ðÁÕÚÁ ÐÅÒÅÄ ÓÍÅÎÏÊ ËÁÒÔÉÎËÉ (ÓÅËÕÎÙ):" + +#: src/config.c:407 +msgid "Random" +msgstr "óÌÕÞÁÊÎÏ" + +#: src/config.c:409 +msgid "Repeat" +msgstr "ðÏ×ÔÏÒÑÔØ × ÃÉËÌÅ" + +#: src/config.c:416 +msgid "Image" +msgstr "éÚÏÂÒÁÖÅÎÉÅ" + +#: src/config.c:424 +msgid "When new image is selected:" +msgstr "ðÒÉ ×ÙÂÏÒÅ ÎÏ×ÏÇÏ ÉÚÏÂÒÁÖÅÎÉÑ:" + +#: src/config.c:434 +msgid "Zoom to original size" +msgstr "íÁÛÔÁÂÉÒÏ×ÁÔØ Ë ÒÁÚÍÅÒÕ ÏÒÉÇÉÎÁÌÁ" + +#: src/config.c:440 src/img-view.c:283 src/menu.c:458 src/menu.c:531 +#: src/menu.c:571 src/menu.c:661 +msgid "Fit image to window" +msgstr "ë ÒÁÚÍÅÒÕ ÏËÎÁ" + +#: src/config.c:446 +msgid "Leave Zoom at previous setting" +msgstr "éÓÐÏÌØÚÏ×ÁÔØ ÐÏÓÌÅÄÎÉÊ ÚÁÄÁÎÎÙÊ ÍÁÛÔÁÂ" + +#: src/config.c:453 +msgid "Fit window to image when tools are hidden/floating" +msgstr "" +"ðÏÄÂÉÒÁÔØ ÒÁÚÍÅÒÙ ÏËÎÁ Ë ÉÚÏÂÒÁÖÅÎÉÀ \n" +"ËÏÇÄÁ ÉÎÓÔÒÕÍÅÎÔÙ ÐÒÉËÒÅÐÌÅÎÎÙ/Ó×ÏÂÏÄÎÙ" + +#: src/config.c:460 +msgid "Limit size when auto-sizing window" +msgstr "ïÇÒÁÎÉÞÉÔØ ÒÁÚÍÅÒ auto-ÒÁÚÍÅÒÎÏÇÏ ÏËÎÁ" + +#: src/config.c:470 src/menu.c:462 +msgid "Thumbnails" +msgstr "üËÓËÉÚÙ" + +#: src/config.c:486 +msgid "Size:" +msgstr "òÁÚÍÅÒ:" + +#: src/config.c:515 +msgid "Cache thumbnails" +msgstr "ëÜÛÉÒÏ×ÁÔØ ÜËÓËÉÚÙ" + +#: src/config.c:517 +msgid "Use xvpics thumbnails when found (read only)" +msgstr "éÓÐÏÌØÚÏ×ÁÔØ ÜËÓËÉÚÙ ÏÔ xvpics, ÅÓÌÉ ÎÁÊÄÅÎÙ (ÔÏÌØËÏ ÞÔÅÎÉÅ)" + +#: src/config.c:520 +msgid "Progressive keyboard scrolling" +msgstr "" + +#: src/config.c:527 +msgid "Filtering" +msgstr "æÉÌØÔÒÁÃÉÑ" + +#: src/config.c:536 +msgid "Show entries that begin with a dot" +msgstr "ðÏËÁÚÙ×ÁÔØ ÆÁÊÌÙ ÎÁÞÉÎÁÀÝÉÅÓÑ Ó ÔÏÞËÉ" + +#: src/config.c:538 +msgid "Disable File Filtering" +msgstr "úÁÐÒÅÔÉÔØ æÉÌØÔÒÁÃÉÀ æÁÊÌÁ" + +#: src/config.c:540 +msgid "Include files of type:" +msgstr "÷ËÌÀÞÁÔØ ÆÁÊÌÙ ÔÉÐÁ:" + +#: src/config.c:590 +msgid "Custom file types:" +msgstr "É/ÉÌÉ Ó×ÏÊ ÔÉÐ ÆÁÊÌÁ:" + +#: src/config.c:603 +msgid "format: [.foo;.bar]" +msgstr "ÆÏÒÍÁÔ: [.foo;.bar]" + +#: src/config.c:612 +msgid "External Editors" +msgstr "÷ÎÅÛÎÉÅ òÅÄÁËÔÏÒÙ" + +#: src/config.c:624 +msgid "#" +msgstr "" + +#: src/config.c:627 +msgid "Menu name" +msgstr "éÍÑ × ÍÅÎÀ" + +#: src/config.c:630 +msgid "Command Line" +msgstr "ëÏÍÍÁÎÄÎÁÑ ÓÔÒÏËÁ" + +#: src/config.c:660 src/menu.c:484 +msgid "About" +msgstr "ï ÐÒÏÇÒÁÍÍÅ..." + +#: src/config.c:676 +#, c-format +msgid "" +"GQview %s\n" +"\n" +"Copyright (c) 1999 by John Ellis\n" +"http://gqview.netpedia.net\n" +"gqview@email.com\n" +"\n" +"Released under the GNU Public License" +msgstr "" + +#: src/filelist.c:51 +msgid " Slideshow" +msgstr " ðÒÏÓÍÏÔÒ ÓÌÁÊÄÏ×..." + +#: src/filelist.c:55 +#, c-format +msgid "%d files (%d)%s" +msgstr "%d ÆÁÊÌÏ× (%d)%s" + +#: src/filelist.c:57 +#, c-format +msgid "%d files%s" +msgstr "%d ÆÁÊÌÏ×%s" + +#: src/filelist.c:960 +msgid "Loading thumbs..." +msgstr "úÁÇÒÕÚËÁ ÜËÓËÉÚÏ×" + +#: src/image.c:65 +#, c-format +msgid "( ? x ? ) %d bytes" +msgstr "( ? x ? ) %d ÂÁÊÔ" + +#: src/image.c:67 +#, c-format +msgid "( %d x %d ) %d bytes" +msgstr "( %d x %d ) %d ÂÁÊÔ" + +#: src/img-main.c:231 +msgid "GQview full screen" +msgstr "GQview ÎÁ ×ÅÓØ ÜËÒÁÎ" + +#: src/img-view.c:280 src/menu.c:455 src/menu.c:528 src/menu.c:568 +#: src/menu.c:657 +msgid "Zoom in" +msgstr "íÁÓÛÔÁ +" + +#: src/img-view.c:281 src/menu.c:456 src/menu.c:529 src/menu.c:569 +#: src/menu.c:659 +msgid "Zoom out" +msgstr "íÁÓÛÔÁ -" + +#: src/img-view.c:282 src/menu.c:457 src/menu.c:530 src/menu.c:570 +msgid "Zoom 1:1" +msgstr "íÁÓÛÔÁ 1:1" + +#. edit menu +#: src/img-view.c:286 src/menu.c:442 src/menu.c:503 src/menu.c:534 +#: src/menu.c:574 +msgid "Edit" +msgstr "ðÒÁ×ËÁ" + +#: src/img-view.c:291 src/menu.c:431 src/menu.c:510 src/menu.c:541 +#: src/menu.c:579 +msgid "Copy..." +msgstr "ëÏÐÉÒÏ×ÁÔØ..." + +#: src/img-view.c:292 src/menu.c:432 src/menu.c:511 src/menu.c:542 +#: src/menu.c:580 +msgid "Move..." +msgstr "ðÅÒÅÍÅÓÔÉÔØ..." + +#: src/img-view.c:293 src/menu.c:433 src/menu.c:512 src/menu.c:543 +#: src/menu.c:581 +msgid "Rename..." +msgstr "ðÅÒÅÉÍÅÎÏ×ÁÔØ..." + +#: src/img-view.c:294 src/menu.c:434 src/menu.c:513 src/menu.c:544 +#: src/menu.c:582 +msgid "Delete..." +msgstr "õÄÁÌÉÔØ..." + +#: src/img-view.c:297 +msgid "Close window" +msgstr "úÁËÒÙÔØ ÏËÎÏ" + +#: src/main.c:90 src/main.c:119 +#, c-format +msgid "GQview running: %s\n" +msgstr "GQview ×ÙÐÏÌÎÑÅÔ: %s\n" + +#: src/main.c:316 +msgid "" +"Usage: gqview [options] [path]\n" +"\n" +msgstr "" +"éÓÐÏÌØÚÏ×ÁÎÉÅ: gqview [ÐÁÒÁÍÅÔÒÙ] [ÐÕÔØ]\n" +"\n" + +#: src/main.c:317 +msgid "valid options are:\n" +msgstr "ÄÏÐÕÓÔÉÍÙÅ ÐÁÒÁÍÅÔÒÙ:\n" + +#: src/main.c:318 +msgid " +t, +tools force show of tools\n" +msgstr " +t, +tools ÐÏËÁÚÙ×ÁÔØ ÏËÎÏ ÉÎÓÔÒÕÍÅÎÔÏ×\n" + +#: src/main.c:319 +msgid " -t, -tools force hide of tools\n" +msgstr " -t, -tools ÓÐÒÑÔÁÔØ ÏËÎÏ ÉÎÓÔÒÕÍÅÎÔÏ×\n" + +#: src/main.c:320 +msgid " -debug turn on debug output\n" +msgstr " -debug ×Ù×ÏÄÉÔØ ÏÔÌÁÄÏÞÎÕÀ ÉÎÆÏÒÍÁÃÉÀ\n" + +#: src/main.c:321 +msgid "" +" -help this message\n" +"\n" +msgstr "" +" -help ÐÏËÁÚÁÔØ üôï ÓÏÏÂÝÅÎÉÅ\n" +"\n" + +#: src/main.c:326 +#, c-format +msgid "" +"invalid or ignored: %s\n" +"Use -help for options\n" +msgstr "" +"ÎÅ×ÅÒÎÙÊ ÐÁÒÁÍÅÔÒ: %s\n" +"îÁÂÅÒÉÔÅ gqview -help ÄÌÑ ÓÐÒÁ×ËÉ.\n" + +#: src/main.c:353 +msgid "The Gimp" +msgstr "" + +#: src/main.c:356 +msgid "Electric Eyes" +msgstr "" + +#: src/main.c:359 +msgid "XV" +msgstr "" + +#: src/main.c:362 +msgid "Xpaint" +msgstr "" + +#: src/menu.c:364 +#, c-format +msgid "in %s..." +msgstr "× %s..." + +#: src/menu.c:366 +msgid "in (unknown)..." +msgstr "× (ÎÅÉÚ×ÅÓÔÎÏ)..." + +#: src/menu.c:385 +msgid "Options..." +msgstr "ëÏÎÆÉÇÕÒÁÃÉÑ..." + +#: src/menu.c:387 +msgid "Remove old thumbnails" +msgstr "õÄÁÌÉÔØ ÓÔÁÒÙÅ ÜËÓËÉÚÙ" + +#. file menu +#: src/menu.c:425 +msgid "File" +msgstr "æÁÊÌ" + +#: src/menu.c:429 +msgid "Create Dir..." +msgstr "óÏÚÄÁÔØ ËÁÔÁÌÏÇ..." + +#: src/menu.c:436 +msgid "Exit" +msgstr "÷ÙÈÏÄ" + +#. view menu +#: src/menu.c:451 +msgid "View" +msgstr "ðÒÏÓÍÏÔÒ" + +#: src/menu.c:461 src/menu.c:547 +msgid "Full screen" +msgstr "îÁ ×ÅÓØ ÜËÒÁÎ" + +#: src/menu.c:469 +msgid "Refresh Lists" +msgstr "ïÂÎÏ×ÉÔØ ÓÐÉÓÏË ÆÁÊÌÏ×" + +#: src/menu.c:470 +msgid "(Un)Float file list" +msgstr "(îÅ)ïÓ×ÏÂÏÄÉÔØ ÉÎÓÔÒÕÍÅÎÔÙ" + +#: src/menu.c:471 src/menu.c:546 +msgid "(Un)Hide file list" +msgstr "îÅÔ/äÁ ÉÎÓÔÒÕÍÅÎÔÁÍ" + +#: src/menu.c:474 +msgid "Toggle slideshow" +msgstr "÷ËÌ/÷ÙËÌ. ÐÒÏÓÍÏÔÒ ÓÌÁÊÄÏ×" + +#. help menu +#: src/menu.c:480 +msgid "Help" +msgstr "ðÏÍÏÝØ" + +#: src/menu.c:507 src/menu.c:538 +msgid "View in new window" +msgstr "ðÒÏÓÍÏÔÒ × ÎÏ×ÏÍ ÏËÎÅ" + +#: src/menu.c:515 +msgid "Refresh" +msgstr "ïÂÎÏ×ÉÔØ" + +#: src/menu.c:585 +msgid "Exit full screen" +msgstr "÷ÙÊÔÉ ÉÚ ÐÏÌÎÏÇÏ ÜËÒÁÎÁ" + +#: src/menu.c:644 +msgid "Create thumbnails" +msgstr "óÏÚÄÁÔØ ÜËÓËÉÚÙ" + +#: src/menu.c:653 +msgid "Change to home directory" +msgstr "ðÅÒÅÊÔÉ × ÄÏÍÁÛÎÉÊ ËÁÔÁÌÏÇ" + +#: src/menu.c:655 +msgid "Refresh file list" +msgstr "ïÂÎÏ×ÉÔØ ÓÐÉÓÏË ÆÁÊÌÏ×" + +#: src/menu.c:663 +msgid "Set zoom 1:1" +msgstr "íÁÓÛÔÁ 1:1" + +#: src/menu.c:665 +msgid "Configure options" +msgstr "ëÏÎÆÉÇÕÒÁÃÉÑ" + +#: src/menu.c:667 +msgid "Float Controls" +msgstr "ÐÒÉËÒÅÐÉÔØ/Ó×ÏÂÏÄÉÔØ ÉÎÓÔÒÕÍÅÎÔÙ" + +#: src/rcfile.c:132 +#, c-format +msgid "error saving config file: %s\n" +msgstr "ÏÛÉÂËÁ ÚÁÐÉÓÉ ÆÁÊÌÁ ËÏÎÆÉÇÕÒÁÃÉÉ: %s\n" + +#: src/thumb.c:127 src/thumb.c:151 +#, c-format +msgid "create dir failed: %s\n" +msgstr "ÓÏÚÄÁÔØ ËÁÔÁÌÏÇ ÎÅÕÄÁÌÏÓØ: %s\n" + +#: src/thumb.c:233 +#, c-format +msgid "Unable to delete dir: %s\n" +msgstr "îÅÍÏÇÕ ÕÄÁÌÉÔØ ËÁÔÁÌÏÇ: %s\n" + +#: src/thumb.c:249 +#, c-format +msgid "failed to delete:%s\n" +msgstr "ÎÅÕÄÁÌÏÓØ ÕÄÁÌÉÔØ:%s\n" + +#: src/utildlg.c:67 +msgid " Ok " +msgstr " Ok " + +#: src/utilops.c:162 +#, c-format +msgid "" +"Overwrite file:\n" +" %s\n" +" with:\b %s" +msgstr "" +"æÁÊÌ Ó ÔÁËÉÍ ÉÍÅÎÅÍ ÕÖÅ ÓÕÝÅÓÔ×ÕÅÔ !\n" +"ðÅÒÅÚÁÐÉÓÁÔØ ÆÁÊÌ ?:\n" +" %s\n" +" ÆÁÊÌÏÍ:\b %s" + +#: src/utilops.c:163 src/utilops.c:262 src/utilops.c:621 src/utilops.c:803 +msgid "Overwrite file" +msgstr "ðÅÒÅÚÁÐÉÓÁÔØ ÆÁÊÌ" + +#: src/utilops.c:164 +msgid "Skip" +msgstr "ðÒÏÐÕÓÔÉÔØ" + +#: src/utilops.c:165 +msgid "Yes to all" +msgstr "äÁ ÄÌÑ ×ÓÅÈ" + +#: src/utilops.c:166 +msgid "Yes" +msgstr "äÁ" + +#: src/utilops.c:200 src/utilops.c:288 +msgid "Error copying file" +msgstr "ïÛÉÂËÁ ËÏÐÉÒÏ×ÁÎÉÑ ÆÁÊÌÁ" + +#: src/utilops.c:201 +#, c-format +msgid "" +"Unable to copy file:\n" +"%sto:\n" +"%s\n" +" during multiple file copy." +msgstr "" +"îÅÍÏÇÕ ÓËÏÐÉÒÏ×ÁÔØ ÆÁÊÌ:\n" +"%s ×:\n" +"%s\n" +" during multiple file copy." + +#: src/utilops.c:205 src/utilops.c:293 +msgid "Error moving file" +msgstr "ïÛÉÂËÁ ÐÅÒÅÍÅÝÅÎÉÑ ÆÁÊÌÁ" + +#: src/utilops.c:206 +#, c-format +msgid "" +"Unable to move file:\n" +"%sto:\n" +"%s\n" +" during multiple file move." +msgstr "" +"îÅÍÏÇÕ ÐÅÒÅÍÅÓÔÉÔØ ÆÁÊÌ:\n" +"%s ×:\n" +"%s\n" +" during multiple file move." + +#: src/utilops.c:209 src/utilops.c:486 +msgid "Continue" +msgstr "ðÒÏÄÏÌÖÉÔØ" + +#: src/utilops.c:261 +#, c-format +msgid "" +"Overwrite file:\n" +"%s\n" +" with:\n" +"%s" +msgstr "" +"æÁÊÌ Ó ÔÁËÉÍ ÉÍÅÎÅÍ ÕÖÅ ÓÕÝÅÓÔ×ÕÅÔ !\n" +"ðÒÅÚÁÐÉÓÁÔØ ÆÁÊÌ ?:\n" +"%s\n" +" ÆÁÊÌÏÍ:\n" +"%s" + +#: src/utilops.c:263 src/utilops.c:622 src/utilops.c:804 +msgid "Overwrite" +msgstr "ðÅÒÅÐÉÓÁÔØ" + +#: src/utilops.c:289 +#, c-format +msgid "" +"Unable to copy file:\n" +"%s\n" +"to:\n" +"%s" +msgstr "" +"îÅÍÏÇÕ ÓËÏÐÉÒÏ×ÁÔØ ÆÁÊÌ:\n" +"%s\n" +"×:\n" +"%s" + +#: src/utilops.c:294 +#, c-format +msgid "" +"Unable to move file:\n" +"%s\n" +"to:\n" +"%s" +msgstr "" +"îÅÍÏÇÕ ÐÅÒÅÍÅÓÔÉÔØ ÆÁÊÌ:\n" +"%s\n" +"×:\n" +"%s" + +#: src/utilops.c:337 +msgid "Invalid destination" +msgstr "îÅÐÒÁ×ÉÌØÎÏÅ ÎÁÚÎÁÞÅÎÉÅ" + +#: src/utilops.c:337 +msgid "" +"When operating with multiple files, please select\n" +" a directory, not file." +msgstr "" +"ëÏÇÄÁ ÏÐÅÒÁÃÉÑ ÐÒÏÉÚ×ÏÄÉÔÓÑ ÎÁÄ ÎÅÓËÏÌØËÉÍÉ ÆÁÊÌÁÍÉ,\n" +" ÐÏÖÁÌÕÊÓÔÁ ÚÁÄÁÊÔÅ ËÁÔÁÌÏÇ, ÎÅ ÆÁÊÌ." + +#: src/utilops.c:339 +msgid "Invalid directory" +msgstr "îÅÐÒÁ×ÉÌØÎÙÊ ËÁÔÁÌÏÇ" + +#: src/utilops.c:339 +msgid "Please select an existing directory" +msgstr "ðÏÖÁÌÕÊÓÔÁ ×ÙÂÅÒÉÔÅ ÓÕÝÅÓÔ×ÕÀÝÉÊ ËÁÔÁÌÏÇ" + +#: src/utilops.c:397 +msgid "GQview - copy" +msgstr "GQview - ËÏÐÉÒÏ×ÁÎÉÅ" + +#: src/utilops.c:398 +msgid "Copy" +msgstr "ëÏÐÉÒÏ×ÁÔØ" + +#: src/utilops.c:400 +#, c-format +msgid "" +"Copy file:\n" +"%s\n" +"to:" +msgstr "" +"ëÏÐÉÒÏ×ÁÔØ ÆÁÊÌ:\n" +"%s\n" +"×:" + +#: src/utilops.c:402 +#, c-format +msgid "" +"Copy multiple files from:\n" +"%s\n" +"to:" +msgstr "" +"ëÏÐÉÒÏ×ÁÔØ ×ÙÄÅÌÅÎÎÙÅ ÆÁÊÌÙ ÉÚ:\n" +"%s\n" +"×:" + +#: src/utilops.c:406 +msgid "GQview - move" +msgstr "GQview - ÐÅÒÅÍÅÓÔÉÔØ" + +#: src/utilops.c:407 +msgid "Move" +msgstr "ðÅÒÅÍÅÓÔÉÔØ" + +#: src/utilops.c:409 +#, c-format +msgid "" +"Move file:\n" +"%s\n" +"to:" +msgstr "" +"ðÅÒÅÍÅÓÔÉÔØ ÆÁÊÌ:\n" +"%s\n" +"×:" + +#: src/utilops.c:411 +#, c-format +msgid "" +"Move multiple files from:\n" +"%s\n" +"to:" +msgstr "" +"ðÅÒÅÍÅÓÔÉÔØ ×ÙÄÅÌÅÎÎÙÅ ÆÁÊÌÙ ÉÚ:\n" +"%s\n" +"×:" + +#: src/utilops.c:484 +#, c-format +msgid "" +"Unable to delete file:\n" +" %s\n" +" Continue multiple delete operation?" +msgstr "" +"îÅ×ÏÚÍÏÖÎÏ ÕÄÁÌÉÔØ ÆÁÊÌ:\n" +" %s\n" +" ðÒÏÄÏÌÖÁÔØ ÏÐÅÒÁÃÉÀ ÕÄÁÌÅÎÉÑ ÄÌÑ ÏÓÔÁ×ÛÉÈÓÑ ÆÁÊÌÏ× ?" + +#: src/utilops.c:485 src/utilops.c:491 +msgid "Delete failed" +msgstr "õÄÁÌÉÔØ ÎÅÕÄÁÌÏÓØ" + +#: src/utilops.c:490 src/utilops.c:535 +#, c-format +msgid "" +"Unable to delete file:\n" +"%s" +msgstr "" +"îÅÍÏÇÕ ÕÄÁÌÉÔØ ÆÁÊÌ:\n" +"%s" + +#: src/utilops.c:520 +msgid "Delete files" +msgstr "õÄÁÌÉÔØ ÆÁÊÌÙ" + +#: src/utilops.c:520 +msgid "About to delete multiple files..." +msgstr "÷Ù ÈÏÔÉÔÅ ÕÄÁÌÉÔØ ÏÔÍÅÞÅÎÎÙÅ ÆÁÊÌÙ ?" + +#: src/utilops.c:521 src/utilops.c:566 +msgid "Delete" +msgstr "õÄÁÌÉÔØ" + +#: src/utilops.c:536 +msgid "File deletion failed" +msgstr "õÄÁÌÅÎÉÅ ÆÁÊÌÁ ÎÅÕÄÁÌÏÓØ" + +#: src/utilops.c:564 +#, c-format +msgid "" +"About to delete the file:\n" +" %s" +msgstr "" +"èÏÔÉÔÅ ÕÄÁÌÉÔØ ÆÁÊÌ ?:\n" +" %s" + +#: src/utilops.c:565 +msgid "Delete file" +msgstr "õÄÁÌÉÔØ ÆÁÊÌ" + +#: src/utilops.c:620 +#, c-format +msgid "" +"Overwrite file:\n" +"%s\n" +"by renaming:\n" +"%s" +msgstr "" +"ðÅÒÅÚÁÐÉÓÁÔØ ÆÁÊÌ:\n" +"%s\n" +"ÐÅÒÅÉÍÅÎÏ×Á×:\n" +"%s" + +#: src/utilops.c:631 +#, c-format +msgid "" +"Unable to rename file:\n" +"%s\n" +" to:\n" +"%s" +msgstr "" +"îÅÍÏÇÕ ÐÅÒÅÉÍÅÎÏ×ÁÔØ ÆÁÊÌ:\n" +"%s\n" +" ×:\n" +"%s" + +#: src/utilops.c:632 src/utilops.c:813 +msgid "Error renaming file" +msgstr "ïÛÉÂËÁ ÐÅÒÅÉÍÅÎÏ×ÁÎÉÑ ÆÁÊÌÁ" + +#: src/utilops.c:722 src/utilops.c:851 +msgid "GQview - rename" +msgstr "GQview - ÐÅÒÅÉÍÅÎÏ×ÁÔØ" + +#: src/utilops.c:722 +msgid "Rename multiple files:" +msgstr "ðÅÒÅÉÍÅÎÏ×ÁÔØ ×ÙÄÅÌÅÎÎÙÅ ÆÁÊÌÙ:" + +#: src/utilops.c:722 src/utilops.c:851 +msgid "Rename" +msgstr "ðÅÒÅÉÍÅÎÏ×ÁÔØ" + +#: src/utilops.c:758 +msgid "Rename:" +msgstr "ðÅÒÅÉÍÅÎÏ×ÁÔØ:" + +#: src/utilops.c:767 +msgid "to:" +msgstr "×:" + +#: src/utilops.c:802 +#, c-format +msgid "" +"Overwrite file:\n" +"%s\n" +"with:\n" +"%s" +msgstr "" +"æÁÊÌ ÕÖÅ ÓÕÝÅÓÔ×ÕÅÔ !\n" +"ðÅÒÅÚÁÐÉÓÁÔØ ÆÁÊÌ ?:\n" +"%s\n" +"ÆÁÊÌÏÍ:\n" +"%s" + +#: src/utilops.c:812 +#, c-format +msgid "" +"Unable to rename file:\n" +"%s\n" +"to:\n" +"%s" +msgstr "" +"îÅÍÏÇÕ ÐÅÒÅÉÍÅÎÏ×ÁÔØ ÆÁÊÌ:\n" +"%s\n" +" ×:\n" +"%s" + +#: src/utilops.c:850 +#, c-format +msgid "" +"Rename file:\n" +"%s\n" +"to:" +msgstr "" +"ðÅÒÅÉÍÅÎÏ×ÁÔØ ÆÁÊÌ:\n" +"%s\n" +"×:" + +#: src/utilops.c:894 +#, c-format +msgid "" +"The path:\n" +"%s\n" +"already exists as a file." +msgstr "" +"ðÕÔØ:\n" +"%s\n" +"ÕÖÅ ÓÕÝÅÓÔ×ÕÅÔ ËÁË ÆÁÊÌ." + +#: src/utilops.c:895 +msgid "Could not create directory" +msgstr "îÅÍÏÇÕ ÓÏÚÄÁÔØ ËÁÔÁÌÏÇ" + +#: src/utilops.c:900 +#, c-format +msgid "" +"The directory:\n" +"%s\n" +"already exists." +msgstr "" +"ëÁÔÁÌÏÇ:\n" +"%s\n" +"ÕÖÅ ÓÕÝÅÓÔ×ÕÅÔ." + +#: src/utilops.c:901 +msgid "Directory exists" +msgstr "ëÁÔÁÌÏÇ ÓÕÝÅÓÔ×ÕÅÔ" + +#: src/utilops.c:908 +#, c-format +msgid "" +"Unable to create directory:\n" +"%s" +msgstr "" +"îÅÍÏÇÕ ÓÏÚÄÁÔØ ËÁÔÁÌÏÇ:\n" +"%s" + +#: src/utilops.c:909 +msgid "Error creating directory" +msgstr "ïÛÉÂËÁ ÓÏÚÄÁÎÉÑ ËÁÔÁÌÏÇÁ" + +#: src/utilops.c:948 +#, c-format +msgid "" +"Create directory in:\n" +"%s\n" +"named:" +msgstr "" +"óÏÚÄÁÔØ ËÁÔÁÌÏÇ ×:\n" +"%s\n" +"Ó ÉÍÅÎÅÍ:" + +#: src/utilops.c:949 +msgid "GQview - new directory" +msgstr "GQview - ÎÏ×ÙÊ ËÁÔÁÌÏÇ" + +#: src/utilops.c:949 +msgid "Create" +msgstr "óÏÚÄÁÔØ" + +#: src/window.c:151 +msgid "GQview Tools" +msgstr "GQview éÎÓÔÒÕÍÅÎÔÙ" diff --git a/src/.cvsignore b/src/.cvsignore new file mode 100644 index 00000000..1f1b8f75 --- /dev/null +++ b/src/.cvsignore @@ -0,0 +1,4 @@ +.deps +Makefile.in +Makefile +gqview diff --git a/src/Makefile.am b/src/Makefile.am new file mode 100644 index 00000000..7cf5d43b --- /dev/null +++ b/src/Makefile.am @@ -0,0 +1,39 @@ +SUBDIRS = icons +DIST_SUBDIRS = icons + +INCLUDES = -I$(srcdir) -I$(builddir) \ + -I$(top_srcdir) -I$(top_builddir) \ + -DLOCALEDIR=\""$(localedir)"\" \ + -I$(includedir) $(GTK_CFLAGS) $(GDK_IMLIB_CFLAGS) + +bin_PROGRAMS = gqview + +gqview_SOURCES = \ + config.c \ + dnd.c \ + filelist.c \ + fileops.c \ + globals.c \ + gqview.h \ + image.c \ + image.h \ + img-main.c \ + img-view.c \ + intl.h \ + logo.h \ + main.c \ + menu.c \ + pathsel.c \ + rcfile.c \ + slideshow.c \ + tabcomp.c \ + thumb.c \ + utildlg.c \ + utildlg.h \ + utilops.c \ + window.c + +gqview_LDADD = $(GTK_LIBS) $(GDK_IMLIB_LIBS) + +EXTRA_DIST = tabcomp.xpm + diff --git a/src/config.c b/src/config.c new file mode 100644 index 00000000..420a3061 --- /dev/null +++ b/src/config.c @@ -0,0 +1,704 @@ +/* + * GQview image viewer + * (C)1999 John Ellis + * + * Author: John Ellis + * + */ + +#include "gqview.h" + +/* config memory values */ +static gint startup_path_enable_c; +static gint confirm_delete_c; +static gint restore_tool_c; +static gint save_window_positions_c; +static gint zoom_mode_c; +static gint fit_window_c; +static gint limit_window_size_c; +static gint max_window_size_c; +static gint progressive_key_scrolling_c; +static gint thumb_max_width_c; +static gint thumb_max_height_c; +static gint enable_thumb_caching_c; +static gint use_xvpics_thumbnails_c; +static gint show_dot_files_c; +static gint file_filter_disable_c; +static gint filter_include_jpg_c; +static gint filter_include_xpm_c; +static gint filter_include_tif_c; +static gint filter_include_gif_c; +static gint filter_include_png_c; +static gint filter_include_ppm_c; +static gint filter_include_pgm_c; +static gint filter_include_pcx_c; +static gint filter_include_bmp_c; +static gint slideshow_delay_c; +static gint slideshow_random_c; +static gint slideshow_repeat_c; + +static GtkWidget *configwindow = NULL; +static GtkWidget *startup_path_entry; +static GtkWidget *custom_filter_entry; +static GtkWidget *editor_name_entry[8]; +static GtkWidget *editor_command_entry[8]; + +static void startup_path_set_current(GtkWidget *widget, gpointer data); +static void slideshow_delay_cb(GtkObject *adj, gpointer data); +static void zoom_mode_original_cb(GtkWidget *widget, gpointer data); +static void zoom_mode_fit_cb(GtkWidget *widget, gpointer data); +static void zoom_mode_none_cb(GtkWidget *widget, gpointer data); +static void max_window_size_cb(GtkObject *adj, gpointer data); +static void thumb_size_48_selected(GtkWidget *w, gpointer data); +static void thumb_size_64_selected(GtkWidget *w, gpointer data); +static void thumb_size_85_selected(GtkWidget *w, gpointer data); +static void thumb_size_100_selected(GtkWidget *w, gpointer data); + +static void config_window_apply(); +static void config_window_close_cb(GtkWidget *widget, gpointer data); +static void config_window_destroy(GtkWidget *w, GdkEvent *event, gpointer data); +static void config_window_ok_cb(GtkWidget *widget, gpointer data); +static void config_window_save_cb(GtkWidget *widget, gpointer data); + +static void check_button_cb(GtkWidget *widget, gpointer data); +static void add_check_button(gint option, gint *option_c, gchar *text, GtkWidget *box); +static void config_window_create(gint start_tab); + +/* + *----------------------------------------------------------------------------- + * option widget callbacks (private) + *----------------------------------------------------------------------------- + */ + +static void startup_path_set_current(GtkWidget *widget, gpointer data) +{ + gtk_entry_set_text(GTK_ENTRY(startup_path_entry), current_path); +} + +static void slideshow_delay_cb(GtkObject *adj, gpointer data) +{ + slideshow_delay_c = (gint)GTK_ADJUSTMENT(adj)->value; +} + +static void zoom_mode_original_cb(GtkWidget *widget, gpointer data) +{ + if (GTK_TOGGLE_BUTTON (widget)->active) + zoom_mode_c = ZOOM_RESET_ORIGINAL; +} + +static void zoom_mode_fit_cb(GtkWidget *widget, gpointer data) +{ + if (GTK_TOGGLE_BUTTON (widget)->active) + zoom_mode_c = ZOOM_RESET_FIT_WINDOW; +} + +static void zoom_mode_none_cb(GtkWidget *widget, gpointer data) +{ + if (GTK_TOGGLE_BUTTON (widget)->active) + zoom_mode_c = ZOOM_RESET_NONE; +} + +static void max_window_size_cb(GtkObject *adj, gpointer data) +{ + max_window_size_c = (gint)GTK_ADJUSTMENT(adj)->value; +} + +static void thumb_size_48_selected(GtkWidget *w, gpointer data) +{ + if (GTK_TOGGLE_BUTTON (w)->active) + { + thumb_max_width_c = 48; + thumb_max_height_c = 48; + } +} + +static void thumb_size_64_selected(GtkWidget *w, gpointer data) +{ + if (GTK_TOGGLE_BUTTON (w)->active) + { + thumb_max_width_c = 64; + thumb_max_height_c = 64; + } +} + +static void thumb_size_85_selected(GtkWidget *w, gpointer data) +{ + if (GTK_TOGGLE_BUTTON (w)->active) + { + thumb_max_width_c = 85; + thumb_max_height_c = 64; + } +} + +static void thumb_size_100_selected(GtkWidget *w, gpointer data) +{ + if (GTK_TOGGLE_BUTTON (w)->active) + { + thumb_max_width_c = 100; + thumb_max_height_c = 100; + } +} + +/* + *----------------------------------------------------------------------------- + * sync progam to config window routine (private) + *----------------------------------------------------------------------------- + */ + +static void config_window_apply() +{ + gchar *buf; + gint i; + gint refresh = FALSE; + + for(i=0; i<8; i++) + { + g_free(editor_name[i]); + editor_name[i] = NULL; + buf = gtk_entry_get_text(GTK_ENTRY(editor_name_entry[i])); + if (buf && strlen(buf) > 0) editor_name[i] = g_strdup(buf); + + g_free(editor_command[i]); + editor_command[i] = NULL; + buf = gtk_entry_get_text(GTK_ENTRY(editor_command_entry[i])); + if (buf && strlen(buf) > 0) editor_command[i] = g_strdup(buf); + } + update_edit_menus(mainwindow_accel_grp); + + g_free(startup_path); + startup_path = NULL; + buf = gtk_entry_get_text(GTK_ENTRY(startup_path_entry)); + if (buf && strlen(buf) > 0) startup_path = remove_trailing_slash(buf); + + buf = gtk_entry_get_text(GTK_ENTRY(custom_filter_entry)); + if ((buf && strlen(buf) > 0) != (custom_filter != NULL)) refresh = TRUE; + if ((buf && strlen(buf) > 0 && custom_filter) && strcmp(buf, custom_filter) != 0) refresh = TRUE; + g_free(custom_filter); + custom_filter = NULL; + if (buf && strlen(buf) > 0) custom_filter = g_strdup(buf); + + if (show_dot_files != show_dot_files_c) refresh = TRUE; + if (file_filter_disable != file_filter_disable_c) refresh = TRUE; + if (filter_include_jpg != filter_include_jpg_c) refresh = TRUE; + if (filter_include_xpm != filter_include_xpm_c) refresh = TRUE; + if (filter_include_tif != filter_include_tif_c) refresh = TRUE; + if (filter_include_gif != filter_include_gif_c) refresh = TRUE; + if (filter_include_png != filter_include_png_c) refresh = TRUE; + if (filter_include_ppm != filter_include_ppm_c) refresh = TRUE; + if (filter_include_pgm != filter_include_pgm_c) refresh = TRUE; + if (filter_include_pcx != filter_include_pcx_c) refresh = TRUE; + if (filter_include_bmp != filter_include_bmp_c) refresh = TRUE; + + startup_path_enable = startup_path_enable_c; + confirm_delete = confirm_delete_c; + restore_tool = restore_tool_c; + save_window_positions = save_window_positions_c; + zoom_mode = zoom_mode_c; + fit_window = fit_window_c; + limit_window_size = limit_window_size_c; + max_window_size = max_window_size_c; + progressive_key_scrolling = progressive_key_scrolling_c; + thumb_max_width = thumb_max_width_c; + thumb_max_height = thumb_max_height_c; + enable_thumb_caching = enable_thumb_caching_c; + use_xvpics_thumbnails = use_xvpics_thumbnails_c; + show_dot_files = show_dot_files_c; + file_filter_disable = file_filter_disable_c; + filter_include_jpg = filter_include_jpg_c; + filter_include_xpm = filter_include_xpm_c; + filter_include_tif = filter_include_tif_c; + filter_include_gif = filter_include_gif_c; + filter_include_png = filter_include_png_c; + filter_include_ppm = filter_include_ppm_c; + filter_include_pgm = filter_include_pgm_c; + filter_include_pcx = filter_include_pcx_c; + filter_include_bmp = filter_include_bmp_c; + + slideshow_random = slideshow_random_c; + slideshow_repeat = slideshow_repeat_c; + slideshow_delay = slideshow_delay_c; + + if (refresh) + { + rebuild_file_filter(); + filelist_refresh(); + } +} + +/* + *----------------------------------------------------------------------------- + * config window main button callbacks (private) + *----------------------------------------------------------------------------- + */ + +static void config_window_close_cb(GtkWidget *widget, gpointer data) +{ + gtk_widget_destroy(configwindow); + configwindow = NULL; +} + +static void config_window_destroy(GtkWidget *w, GdkEvent *event, gpointer data) +{ + config_window_close_cb(NULL, NULL); +} + +static void config_window_ok_cb(GtkWidget *widget, gpointer data) +{ + config_window_apply(); + config_window_close_cb(NULL, NULL); +} + +static void config_window_apply_cb(GtkWidget *widget, gpointer data) +{ + config_window_apply(); +} + +/* + *----------------------------------------------------------------------------- + * config window setup (private) + *----------------------------------------------------------------------------- + */ + +static void check_button_cb(GtkWidget *widget, gpointer data) +{ + gint *value_ptr = data; + *value_ptr = GTK_TOGGLE_BUTTON (widget)->active; +} + +static void add_check_button(gint option, gint *option_c, gchar *text, GtkWidget *box) +{ + GtkWidget *button; + *option_c = option; + button = gtk_check_button_new_with_label (text); + gtk_box_pack_start(GTK_BOX(box), button, FALSE, FALSE, 0); + gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON(button), option); + gtk_signal_connect (GTK_OBJECT(button),"clicked",(GtkSignalFunc) check_button_cb, option_c); + gtk_widget_show(button); +} + +static void config_window_create(gint start_tab) +{ + GtkWidget *win_vbox; + GtkWidget *hbox; + GtkWidget *notebook; + GtkWidget *frame; + GtkWidget *label; + GtkWidget *vbox; + GtkWidget *vbox1; + GtkWidget *vbox2; + GtkWidget *button; + GtkWidget *tabcomp; + GtkWidget *radiobuttongroup; + GtkWidget *table; + GtkObject *adj; + GtkWidget *spin; + GdkImlibImage* im; + GdkPixmap *pixmap; + gchar buf[255]; + gint i; + + configwindow = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_signal_connect (GTK_OBJECT (configwindow), "delete_event",(GtkSignalFunc) config_window_destroy, NULL); + gtk_window_set_policy (GTK_WINDOW (configwindow), FALSE, FALSE, FALSE); + gtk_window_set_title (GTK_WINDOW (configwindow), _("GQview configuration")); + gtk_window_set_wmclass(GTK_WINDOW (configwindow), "config", "GQview"); + gtk_container_border_width (GTK_CONTAINER (configwindow), 5); + + win_vbox = gtk_vbox_new(FALSE, 5); + gtk_container_add(GTK_CONTAINER(configwindow), win_vbox); + gtk_widget_show(win_vbox); + + hbox = gtk_hbox_new (TRUE, 0); + gtk_box_pack_end(GTK_BOX(win_vbox), hbox, FALSE, FALSE, 0); + gtk_widget_show(hbox); + + button = gtk_button_new_with_label(_("Ok")); + gtk_signal_connect (GTK_OBJECT (button), "clicked",(GtkSignalFunc) config_window_ok_cb, NULL); + gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 20); + gtk_widget_show(button); + + button = gtk_button_new_with_label(_("Apply")); + gtk_signal_connect (GTK_OBJECT (button), "clicked",(GtkSignalFunc) config_window_apply_cb, NULL); + gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 20); + gtk_widget_show(button); + + button = gtk_button_new_with_label(_("Cancel")); + gtk_signal_connect (GTK_OBJECT (button), "clicked",(GtkSignalFunc) config_window_close_cb, NULL); + gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 20); + gtk_widget_show(button); + + notebook = gtk_notebook_new(); + gtk_notebook_set_tab_pos (GTK_NOTEBOOK(notebook), GTK_POS_TOP); + gtk_box_pack_start (GTK_BOX(win_vbox), notebook, TRUE, TRUE, 0); + + /* general options tab */ + + frame = gtk_frame_new(NULL); + gtk_container_border_width (GTK_CONTAINER (frame), 5); + gtk_widget_show(frame); + label = gtk_label_new(_("General")); + gtk_notebook_append_page (GTK_NOTEBOOK(notebook), frame, label); + + vbox = gtk_vbox_new (FALSE, 0); + gtk_container_border_width (GTK_CONTAINER (vbox), 5); + gtk_container_add (GTK_CONTAINER(frame),vbox); + gtk_widget_show(vbox); + + frame = gtk_frame_new(_("Initial directory")); + gtk_container_border_width (GTK_CONTAINER (frame), 5); + gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 0); + gtk_widget_show(frame); + + vbox1 = gtk_vbox_new (FALSE, 0); + gtk_container_add (GTK_CONTAINER(frame),vbox1); + gtk_widget_show(vbox1); + + add_check_button(startup_path_enable, &startup_path_enable_c, + _("On startup, change to this directory:"), vbox1); + + hbox = gtk_hbox_new (FALSE, 0); + gtk_box_pack_start(GTK_BOX(vbox1), hbox, FALSE, FALSE, 0); + gtk_widget_show(hbox); + + gtk_widget_realize(configwindow); + + tabcomp = tab_completion_new(&startup_path_entry, configwindow, startup_path, NULL, NULL); + gtk_box_pack_start(GTK_BOX(hbox), tabcomp, TRUE, TRUE, 0); + gtk_widget_show(tabcomp); + + button = gtk_button_new_with_label (_("Use current")); + gtk_signal_connect (GTK_OBJECT(button),"clicked",(GtkSignalFunc) startup_path_set_current, NULL); + gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0); + gtk_widget_show(button); + + add_check_button(confirm_delete, &confirm_delete_c, + _("Confirm file delete"), vbox); + add_check_button(restore_tool, &restore_tool_c, + _("Remember tool state (float/hidden)"), vbox); + add_check_button(save_window_positions, &save_window_positions_c, + _("Remember window positions"), vbox); + + frame = gtk_frame_new(_("Slide show")); + gtk_container_border_width (GTK_CONTAINER (frame), 5); + gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 0); + gtk_widget_show(frame); + + vbox1 = gtk_vbox_new (FALSE, 0); + gtk_container_add (GTK_CONTAINER(frame),vbox1); + gtk_widget_show(vbox1); + + hbox = gtk_hbox_new (FALSE, 0); + gtk_box_pack_start(GTK_BOX(vbox1), hbox, FALSE, FALSE, 0); + gtk_widget_show(hbox); + + label = gtk_label_new(_("Delay before image change (seconds):")); + gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); + gtk_widget_show(label); + + slideshow_delay_c = slideshow_delay; + adj = gtk_adjustment_new((float)slideshow_delay_c, 1.0, 1200.0, 1, 1, 1); + spin = gtk_spin_button_new( GTK_ADJUSTMENT(adj), 1, 0 ); + gtk_box_pack_start( GTK_BOX(hbox), spin, FALSE, FALSE, 5); + gtk_signal_connect( GTK_OBJECT(adj),"value_changed",GTK_SIGNAL_FUNC(slideshow_delay_cb), NULL); + gtk_spin_button_set_update_policy( GTK_SPIN_BUTTON(spin),GTK_UPDATE_ALWAYS ); + gtk_widget_show(spin); + + add_check_button(slideshow_random, &slideshow_random_c, + _("Random"), vbox1); + add_check_button(slideshow_repeat, &slideshow_repeat_c, + _("Repeat"), vbox1); + + /* image tab */ + + frame = gtk_frame_new(NULL); + gtk_container_border_width (GTK_CONTAINER (frame), 5); + gtk_widget_show(frame); + label = gtk_label_new(_("Image")); + gtk_notebook_append_page (GTK_NOTEBOOK (notebook), frame, label); + + vbox = gtk_vbox_new (FALSE, 0); + gtk_container_border_width (GTK_CONTAINER (vbox), 5); + gtk_container_add (GTK_CONTAINER(frame),vbox); + gtk_widget_show(vbox); + + frame = gtk_frame_new(_("When new image is selected:")); + gtk_container_border_width (GTK_CONTAINER (frame), 5); + gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 0); + gtk_widget_show(frame); + + vbox1 = gtk_vbox_new (FALSE, 0); + gtk_container_add (GTK_CONTAINER(frame),vbox1); + gtk_widget_show(vbox1); + + zoom_mode_c = zoom_mode; + radiobuttongroup = gtk_radio_button_new_with_label (NULL, _("Zoom to original size")); + if (zoom_mode == ZOOM_RESET_ORIGINAL) gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON(radiobuttongroup), 1); + gtk_signal_connect (GTK_OBJECT(radiobuttongroup),"clicked",(GtkSignalFunc) zoom_mode_original_cb, NULL); + gtk_box_pack_start(GTK_BOX(vbox1), radiobuttongroup, FALSE, FALSE, 0); + gtk_widget_show(radiobuttongroup); + + button = gtk_radio_button_new_with_label (gtk_radio_button_group(GTK_RADIO_BUTTON(radiobuttongroup)),_("Fit image to window")); + if (zoom_mode == ZOOM_RESET_FIT_WINDOW) gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON(button), 1); + gtk_signal_connect (GTK_OBJECT(button),"clicked",(GtkSignalFunc) zoom_mode_fit_cb, NULL); + gtk_box_pack_start(GTK_BOX(vbox1), button, FALSE, FALSE, 0); + gtk_widget_show(button); + + button = gtk_radio_button_new_with_label (gtk_radio_button_group(GTK_RADIO_BUTTON(radiobuttongroup)),_("Leave Zoom at previous setting")); + if (zoom_mode == ZOOM_RESET_NONE) gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON(button), 1); + gtk_signal_connect (GTK_OBJECT(button),"clicked",(GtkSignalFunc) zoom_mode_none_cb, NULL); + gtk_box_pack_start(GTK_BOX(vbox1), button, FALSE, FALSE, 0); + gtk_widget_show(button); + + add_check_button(fit_window, &fit_window_c, + _("Fit window to image when tools are hidden/floating"), vbox); + + hbox = gtk_hbox_new (FALSE, 0); + gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); + gtk_widget_show(hbox); + + add_check_button(limit_window_size, &limit_window_size_c, + _("Limit size when auto-sizing window"), hbox); + + max_window_size_c = max_window_size; + adj = gtk_adjustment_new((float)max_window_size_c, 10.0, 150.0, 1, 1, 1); + spin = gtk_spin_button_new( GTK_ADJUSTMENT(adj), 1, 0 ); + gtk_box_pack_start( GTK_BOX(hbox), spin, FALSE, FALSE, 5); + gtk_signal_connect( GTK_OBJECT(adj),"value_changed",GTK_SIGNAL_FUNC(max_window_size_cb), NULL); + gtk_spin_button_set_update_policy( GTK_SPIN_BUTTON(spin),GTK_UPDATE_ALWAYS ); + gtk_widget_show(spin); + + frame = gtk_frame_new(_("Thumbnails")); + gtk_container_border_width (GTK_CONTAINER (frame), 5); + gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 0); + gtk_widget_show(frame); + + vbox1 = gtk_vbox_new (FALSE, 0); + gtk_container_add (GTK_CONTAINER(frame),vbox1); + gtk_widget_show(vbox1); + + hbox = gtk_hbox_new (FALSE, 0); + gtk_box_pack_start(GTK_BOX(vbox1), hbox, FALSE, FALSE, 0); + gtk_widget_show(hbox); + + thumb_max_width_c = thumb_max_width; + thumb_max_height_c = thumb_max_height; + + label = gtk_label_new(_("Size:")); + gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5); + gtk_widget_show(label); + + radiobuttongroup = gtk_radio_button_new_with_label (NULL,"48x48"); + gtk_box_pack_start(GTK_BOX(hbox), radiobuttongroup, FALSE, FALSE, 0); + if (thumb_max_width_c == 48 && thumb_max_height_c == 48) gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON(radiobuttongroup), 1); + gtk_signal_connect (GTK_OBJECT(radiobuttongroup),"clicked",(GtkSignalFunc) thumb_size_48_selected, NULL); + gtk_widget_show(radiobuttongroup); + + button = gtk_radio_button_new_with_label (gtk_radio_button_group(GTK_RADIO_BUTTON(radiobuttongroup)),"64x64"); + gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); + if (thumb_max_width_c == 64 && thumb_max_height_c == 64) gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON(button), 1); + gtk_signal_connect (GTK_OBJECT(button),"clicked",(GtkSignalFunc) thumb_size_64_selected, NULL); + gtk_widget_show(button); + + button = gtk_radio_button_new_with_label (gtk_radio_button_group(GTK_RADIO_BUTTON(radiobuttongroup)),"85x64"); + gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); + if (thumb_max_width_c == 85 && thumb_max_height_c == 64) gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON(button), 1); + gtk_signal_connect (GTK_OBJECT(button),"clicked",(GtkSignalFunc) thumb_size_85_selected, NULL); + gtk_widget_show(button); + + button = gtk_radio_button_new_with_label (gtk_radio_button_group(GTK_RADIO_BUTTON(radiobuttongroup)),"100x100"); + gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); + if (thumb_max_width_c == 100 && thumb_max_height_c == 100) gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON(button), 1); + gtk_signal_connect (GTK_OBJECT(button),"clicked",(GtkSignalFunc) thumb_size_100_selected, NULL); + gtk_widget_show(button); + + add_check_button(enable_thumb_caching, &enable_thumb_caching_c, + _("Cache thumbnails"), vbox1); + add_check_button(use_xvpics_thumbnails, &use_xvpics_thumbnails_c, + _("Use xvpics thumbnails when found (read only)"), vbox1); + + add_check_button(progressive_key_scrolling, &progressive_key_scrolling_c, + _("Progressive keyboard scrolling"), vbox); + + /* filtering tab */ + + frame = gtk_frame_new(NULL); + gtk_container_border_width (GTK_CONTAINER (frame), 5); + gtk_widget_show(frame); + label = gtk_label_new(_("Filtering")); + gtk_notebook_append_page (GTK_NOTEBOOK (notebook), frame, label); + + vbox = gtk_vbox_new (FALSE, 0); + gtk_container_border_width (GTK_CONTAINER (vbox), 5); + gtk_container_add (GTK_CONTAINER(frame),vbox); + gtk_widget_show(vbox); + + add_check_button(show_dot_files, &show_dot_files_c, + _("Show entries that begin with a dot"), vbox); + add_check_button(file_filter_disable, &file_filter_disable_c, + _("Disable File Filtering"), vbox); + + frame = gtk_frame_new(_("Include files of type:")); + gtk_container_border_width (GTK_CONTAINER (frame), 5); + gtk_box_pack_start(GTK_BOX(vbox), frame, TRUE, TRUE, 0); + gtk_widget_show(frame); + + vbox1 = gtk_vbox_new (FALSE, 0); + gtk_container_add (GTK_CONTAINER(frame),vbox1); + gtk_widget_show(vbox1); + + hbox = gtk_hbox_new (TRUE, 0); + gtk_box_pack_start (GTK_BOX(vbox1), hbox, FALSE, FALSE, 0); + gtk_widget_show(hbox); + + vbox2 = gtk_vbox_new (FALSE, 0); + gtk_box_pack_start (GTK_BOX(hbox), vbox2,FALSE, FALSE, 0); + gtk_widget_show(vbox2); + + add_check_button(filter_include_jpg, &filter_include_jpg_c, + "JPG / JPEG", vbox2); + add_check_button(filter_include_xpm, &filter_include_xpm_c, + "XPM", vbox2); + add_check_button(filter_include_tif, &filter_include_tif_c, + "TIF / TIFF", vbox2); + + vbox2 = gtk_vbox_new (FALSE, 0); + gtk_box_pack_start (GTK_BOX(hbox), vbox2,FALSE, FALSE, 0); + gtk_widget_show(vbox2); + + add_check_button(filter_include_gif, &filter_include_gif_c, + "GIF", vbox2); + add_check_button(filter_include_png, &filter_include_png_c, + "PNG", vbox2); + add_check_button(filter_include_ppm, &filter_include_ppm_c, + "PPM", vbox2); + + vbox2 = gtk_vbox_new (FALSE, 0); + gtk_box_pack_start (GTK_BOX(hbox), vbox2,FALSE, FALSE, 0); + gtk_widget_show(vbox2); + + add_check_button(filter_include_pgm, &filter_include_pgm_c, + "PGM", vbox2); + add_check_button(filter_include_pcx, &filter_include_pcx_c, + "PCX", vbox2); + add_check_button(filter_include_bmp, &filter_include_bmp_c, + "BMP", vbox2); + + hbox = gtk_hbox_new (FALSE, 0); + gtk_box_pack_start (GTK_BOX(vbox1), hbox, FALSE, FALSE, 0); + gtk_widget_show(hbox); + + label = gtk_label_new(_("Custom file types:")); + gtk_box_pack_start(GTK_BOX(hbox),label,FALSE,FALSE,0); + gtk_widget_show(label); + + custom_filter_entry = gtk_entry_new(); + if (custom_filter) gtk_entry_set_text(GTK_ENTRY(custom_filter_entry), custom_filter); + gtk_box_pack_start(GTK_BOX(vbox1),custom_filter_entry,FALSE,FALSE,0); + gtk_widget_show(custom_filter_entry); + + hbox = gtk_hbox_new (FALSE, 0); + gtk_box_pack_start (GTK_BOX(vbox1), hbox, FALSE, FALSE, 0); + gtk_widget_show(hbox); + + label = gtk_label_new(_("format: [.foo;.bar]")); + gtk_box_pack_end(GTK_BOX(hbox),label,FALSE,FALSE,5); + gtk_widget_show(label); + + /* editor entry tab */ + + frame = gtk_frame_new(NULL); + gtk_container_border_width (GTK_CONTAINER (frame), 5); + gtk_widget_show(frame); + label = gtk_label_new(_("External Editors")); + gtk_notebook_append_page (GTK_NOTEBOOK (notebook), frame, label); + + vbox = gtk_vbox_new(FALSE,0); + gtk_container_border_width (GTK_CONTAINER (vbox), 5); + gtk_container_add (GTK_CONTAINER(frame),vbox); + gtk_widget_show(vbox); + + table=gtk_table_new(3,9,FALSE); + gtk_container_add (GTK_CONTAINER(vbox),table); + gtk_widget_show(table); + + label = gtk_label_new(_("#")); + gtk_table_attach_defaults(GTK_TABLE (table),label, 0, 1, 0, 1); + gtk_widget_show(label); + label = gtk_label_new(_("Menu name")); + gtk_table_attach_defaults(GTK_TABLE (table),label, 1, 2, 0, 1); + gtk_widget_show(label); + label = gtk_label_new(_("Command Line")); + gtk_table_attach_defaults(GTK_TABLE (table),label, 2, 3, 0, 1); + gtk_widget_show(label); + + for (i=0; i<8; i++) + { + sprintf(buf,"%d",i+1); + label = gtk_label_new(buf); + gtk_table_attach_defaults(GTK_TABLE (table),label, 0, 1, i+1, i+2); + gtk_widget_show(label); + + editor_name_entry[i] = gtk_entry_new_with_max_length(32); + gtk_widget_set_usize(editor_name_entry[i],80,-1); + if (editor_name[i]) gtk_entry_set_text(GTK_ENTRY(editor_name_entry[i]),editor_name[i]); + gtk_table_attach_defaults(GTK_TABLE (table),editor_name_entry[i],1,2,i+1,i+2); + gtk_widget_show(editor_name_entry[i]); + + editor_command_entry[i] = gtk_entry_new_with_max_length(255); + gtk_widget_set_usize(editor_command_entry[i],160,-1); + tab_completion_add_to_entry(editor_command_entry[i], NULL, NULL); + if (editor_command[i]) gtk_entry_set_text(GTK_ENTRY(editor_command_entry[i]), editor_command[i]); + gtk_table_attach_defaults(GTK_TABLE (table),editor_command_entry[i],2,3,i+1,i+2); + gtk_widget_show(editor_command_entry[i]); + } + + /* about tab */ + + frame = gtk_frame_new(NULL); + gtk_container_border_width (GTK_CONTAINER (frame), 5); + gtk_widget_show(frame); + label = gtk_label_new(_("About")); + gtk_notebook_append_page (GTK_NOTEBOOK (notebook), frame, label); + + vbox = gtk_vbox_new (FALSE, 0); + gtk_container_add (GTK_CONTAINER(frame),vbox); + gtk_widget_show(vbox); + + im = gdk_imlib_create_image_from_data((char *)logo, NULL, logo_width, logo_height); + gdk_imlib_render(im, logo_width, logo_height); + pixmap = gdk_imlib_move_image(im); + gdk_imlib_destroy_image(im); + + button=gtk_pixmap_new(pixmap, NULL); + gtk_box_pack_start(GTK_BOX(vbox), button, TRUE, TRUE, 0); + gtk_widget_show (button); + + sprintf(buf, _("GQview %s\n\nCopyright (c) 1999 by John Ellis\nhttp://gqview.netpedia.net\ngqview@email.com\n\nReleased under the GNU Public License"), VERSION); + label = gtk_label_new(buf); + gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, TRUE, 0); + gtk_widget_show (label); + + gtk_notebook_set_page (GTK_NOTEBOOK(notebook), start_tab); + gtk_widget_show(notebook); + + gtk_widget_show(configwindow); +} + +/* + *----------------------------------------------------------------------------- + * config/about window show (public) + *----------------------------------------------------------------------------- + */ + +void show_config_window() +{ + if (configwindow) return; + config_window_create(0); +} + +void show_about_window() +{ + if (configwindow) return; + config_window_create(4); +} + diff --git a/src/dnd.c b/src/dnd.c new file mode 100644 index 00000000..b26c29ee --- /dev/null +++ b/src/dnd.c @@ -0,0 +1,441 @@ +/* + * GQview image viewer + * (C)1999 John Ellis + * + * Author: John Ellis + * + */ + +#include "gqview.h" +#include "image.h" + +enum { + TARGET_URI_LIST, + TARGET_TEXT_PLAIN +}; + +static GtkTargetEntry file_drag_types[] = { + { "text/uri-list", 0, TARGET_URI_LIST }, + { "text/plain", 0, TARGET_TEXT_PLAIN } +}; +static gint n_file_drag_types = 2; + +static GtkTargetEntry file_drop_types[] = { + { "text/uri-list", 0, TARGET_URI_LIST } +}; +static gint n_file_drop_types = 1; + +static GList *get_uri_file_list(gchar *data); + +static void image_get_dnd_data(GtkWidget *widget, GdkDragContext *context, + gint x, gint y, + GtkSelectionData *selection_data, guint info, + guint time, gpointer data); +static void image_set_dnd_data(GtkWidget *widget, GdkDragContext *context, + GtkSelectionData *selection_data, guint info, + guint time, gpointer data); +static void image_drag_end(GtkWidget *widget, GdkDragContext *context, gpointer data); + +static void file_list_set_dnd_data(GtkWidget *widget, GdkDragContext *context, + GtkSelectionData *selection_data, guint info, + guint time, gpointer data); +static void file_list_drag_begin(GtkWidget *widget, GdkDragContext *context, gpointer data); +static void file_list_drag_end(GtkWidget *widget, GdkDragContext *context, gpointer data); + +static void dir_list_set_dnd_data(GtkWidget *widget, GdkDragContext *context, + GtkSelectionData *selection_data, guint info, + guint time, gpointer data); +static void dir_clist_set_highlight(gint set); +static void dir_list_drag_begin(GtkWidget *widget, GdkDragContext *context, gpointer data); +static void dir_list_drag_end(GtkWidget *widget, GdkDragContext *context, gpointer data); + +static GList *get_uri_file_list(gchar *data) +{ + GList *list = NULL; + gint b, e; + + b = e = 0; + + while (data[b] != '\0') + { + while (data[e] != '\r' && data[e] != '\n' && data[e] != '\0') e++; + if (!strncmp(data + b, "file:", 5)) + { + b += 5; + list = g_list_append(list, g_strndup(data + b, e - b)); + } + while (data[e] == '\r' || data[e] == '\n') e++; + b = e; + } + + return list; +} + +/* + *----------------------------------------------------------------------------- + * image drag and drop routines + *----------------------------------------------------------------------------- + */ + +static void image_get_dnd_data(GtkWidget *widget, GdkDragContext *context, + gint x, gint y, + GtkSelectionData *selection_data, guint info, + guint time, gpointer data) +{ + ImageWindow *imd = data; + + if (info == TARGET_URI_LIST) + { + GList *list = get_uri_file_list(selection_data->data); + if (list) + { + gchar *path; + + path = list->data; + + if (imd == normal_image) + { + if (isfile(path)) + { + gint row; + gchar *dir = remove_level_from_path(path); + if (strcmp(dir, current_path) != 0) + filelist_change_to(dir); + g_free(dir); + + row = find_file_in_list(path); + if (row == -1) + image_change_to(path); + else + file_image_change_to(row); + } + else if (isdir(path)) + { + filelist_change_to(path); + image_change_to(NULL); + } + } + else + { + if (isfile(path)) + { + image_area_set_image(imd, path, get_default_zoom(imd)); + } + } + + if (debug) + { + GList *work = list; + while (work) + { + printf("dropped: %s\n", (gchar *)(work->data)); + work = work->next; + } + } + + g_list_foreach(list, (GFunc)g_free, NULL); + g_list_free(list); + } + } +} + +static void image_set_dnd_data(GtkWidget *widget, GdkDragContext *context, + GtkSelectionData *selection_data, guint info, + guint time, gpointer data) +{ + ImageWindow *imd = data; + gchar *path = image_area_get_path(imd); + + if (path) + { + gchar *text = NULL; + switch (info) + { + case TARGET_URI_LIST: + text = g_strconcat("file:", path, "\r\n", NULL); + break; + case TARGET_TEXT_PLAIN: + text = g_strdup(path); + break; + } + if (text) + { + gtk_selection_data_set (selection_data, selection_data->target, + 8, text, strlen(text)); + g_free(text); + } + } + else + { + gtk_selection_data_set (selection_data, selection_data->target, + 8, NULL, 0); + } +} + +static void image_drag_end(GtkWidget *widget, GdkDragContext *context, gpointer data) +{ + ImageWindow *imd = data; + if (context->action == GDK_ACTION_MOVE) + { + gint row = find_file_in_list(image_area_get_path(imd)); + if (row < 0) return; + if (image_get_path() && strcmp(image_get_path(), image_area_get_path(imd)) == 0) + { + if (row < file_count() - 1) + { + file_next_image(); + } + else + { + file_prev_image(); + } + } + filelist_refresh(); + } +} + +void image_dnd_init(ImageWindow *imd) +{ + gtk_drag_source_set(imd->viewport, GDK_BUTTON2_MASK, + file_drag_types, n_file_drag_types, GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK); + gtk_signal_connect(GTK_OBJECT(imd->viewport), "drag_data_get", + image_set_dnd_data, imd); + gtk_signal_connect(GTK_OBJECT(imd->viewport), "drag_end", + image_drag_end, imd); + + gtk_drag_dest_set(imd->viewport, + GTK_DEST_DEFAULT_MOTION | GTK_DEST_DEFAULT_HIGHLIGHT | GTK_DEST_DEFAULT_DROP, + file_drop_types, n_file_drop_types, + GDK_ACTION_COPY); + gtk_signal_connect(GTK_OBJECT(imd->viewport), "drag_data_received", + image_get_dnd_data, imd); +} + +/* + *----------------------------------------------------------------------------- + * file list drag and drop routines (private) + *----------------------------------------------------------------------------- + */ + +static void file_list_set_dnd_data(GtkWidget *widget, GdkDragContext *context, + GtkSelectionData *selection_data, guint info, + guint time, gpointer data) +{ + gchar *uri_text = NULL; + gchar *leader = "file:"; + gchar *sep = "\r\n"; + gint total; + gint leader_l; + gint sep_l = strlen(sep); + gchar *ptr; + + switch (info) + { + case TARGET_URI_LIST: + leader_l = strlen(leader); + break; + case TARGET_TEXT_PLAIN: + leader_l = 0; + break; + default: + return; + break; + } + + if (file_clicked_is_selected()) + { + GList *list; + GList *work; + + list = file_get_selected_list(); + if (!list) return; + work = list; + total = 0; + + /* compute length */ + + while (work) + { + gchar *name = work->data; + total += leader_l + strlen(name) + sep_l; + work = work->next; + } + + /* create list */ + uri_text = g_malloc(total + 1); + ptr = uri_text; + + work = list; + while (work) + { + gchar *name = work->data; + if (leader_l > 0) + { + strcpy(ptr, leader); + ptr += leader_l; + } + strcpy(ptr, name); + ptr += strlen(name); + strcpy(ptr, sep); + ptr += sep_l; + work = work->next; + } + ptr[0] = '\0'; + free_selected_list(list); + } + else + { + gchar *path = file_clicked_get_path(); + if (!path) return; + switch (info) + { + case TARGET_URI_LIST: + uri_text = g_strconcat("file:", path, "\r\n", NULL); + break; + case TARGET_TEXT_PLAIN: + uri_text = g_strdup(path); + break; + } + total = strlen(uri_text); + g_free(path); + } + + if (debug) printf(uri_text); + + gtk_selection_data_set (selection_data, selection_data->target, + 8, uri_text, total); + g_free(uri_text); + + file_clist_highlight_unset(); +} + +static void file_list_drag_begin(GtkWidget *widget, GdkDragContext *context, gpointer data) +{ + file_clist_highlight_set(); +} + +static void file_list_drag_end(GtkWidget *widget, GdkDragContext *context, gpointer data) +{ + file_clist_highlight_unset(); + + if (context->action == GDK_ACTION_MOVE) + { + filelist_refresh(); + } +} + +/* + *----------------------------------------------------------------------------- + * directory list drag and drop routines (private) + *----------------------------------------------------------------------------- + */ + +static void dir_list_set_dnd_data(GtkWidget *widget, GdkDragContext *context, + GtkSelectionData *selection_data, guint info, + guint time, gpointer data) +{ + gint row = GPOINTER_TO_INT(gtk_object_get_user_data(GTK_OBJECT(dir_clist))); + + if (row >= 0) + { + gchar *name = gtk_clist_get_row_data(GTK_CLIST(dir_clist), row); + gchar *new_path; + gchar *text = NULL; + + if (strcmp(name, ".") == 0) + new_path = g_strdup(current_path); + else if (strcmp(name, "..") == 0) + new_path = remove_level_from_path(current_path); + else + { + if (strcmp(current_path, "/") == 0) + new_path = g_strconcat(current_path, name, NULL); + else + new_path = g_strconcat(current_path, "/", name, NULL); + } + + + switch (info) + { + case TARGET_URI_LIST: + text = g_strconcat("file:", new_path, "\r\n", NULL); + break; + case TARGET_TEXT_PLAIN: + text = g_strdup(new_path); + break; + } + if (text) + { + gtk_selection_data_set (selection_data, selection_data->target, + 8, text, strlen(text)); + g_free(text); + } + g_free(new_path); + } +} + +static void dir_clist_set_highlight(gint set) +{ + gint row = GPOINTER_TO_INT(gtk_object_get_user_data(GTK_OBJECT(dir_clist))); + if (set) + { + gtk_clist_set_background(GTK_CLIST(dir_clist), row, + >K_WIDGET (dir_clist)->style->bg[GTK_STATE_SELECTED]); + gtk_clist_set_foreground(GTK_CLIST(dir_clist), row, + >K_WIDGET (dir_clist)->style->fg[GTK_STATE_SELECTED]); + } + else + { + gtk_clist_set_background(GTK_CLIST(dir_clist), row, NULL); + gtk_clist_set_foreground(GTK_CLIST(dir_clist), row, NULL); + } +} + +static void dir_list_drag_begin(GtkWidget *widget, GdkDragContext *context, gpointer data) +{ + dir_clist_set_highlight(TRUE); +} + +static void dir_list_drag_end(GtkWidget *widget, GdkDragContext *context, gpointer data) +{ + dir_clist_set_highlight(FALSE); + + if (context->action == GDK_ACTION_MOVE) + { + filelist_refresh(); + } +} + +/* + *----------------------------------------------------------------------------- + * drag and drop initialization (public) + *----------------------------------------------------------------------------- + */ + +void init_dnd() +{ + /* dir clist */ + gtk_drag_source_set(dir_clist, GDK_BUTTON2_MASK, + file_drag_types, n_file_drag_types, GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK); + gtk_signal_connect(GTK_OBJECT(dir_clist), "drag_begin", + dir_list_drag_begin, NULL); + gtk_signal_connect(GTK_OBJECT(dir_clist), "drag_data_get", + dir_list_set_dnd_data, NULL); + gtk_signal_connect(GTK_OBJECT(dir_clist), "drag_end", + dir_list_drag_end, NULL); + + /* file clist */ + gtk_drag_source_set(file_clist, GDK_BUTTON2_MASK, + file_drag_types, n_file_drag_types, GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK); + gtk_signal_connect(GTK_OBJECT(file_clist), "drag_begin", + file_list_drag_begin, NULL); + gtk_signal_connect(GTK_OBJECT(file_clist), "drag_data_get", + file_list_set_dnd_data, NULL); + gtk_signal_connect(GTK_OBJECT(file_clist), "drag_end", + file_list_drag_end, NULL); + + /* image */ + image_dnd_init(main_image); +} + + diff --git a/src/filelist.c b/src/filelist.c new file mode 100644 index 00000000..a203f39e --- /dev/null +++ b/src/filelist.c @@ -0,0 +1,1074 @@ +/* + * GQview image viewer + * (C)1999 John Ellis + * + * Author: John Ellis + * + */ + +#include "gqview.h" + +static gint filelist_click_row = -1; + +static void update_progressbar(gfloat val); + +static gint file_is_hidden(gchar *name); +static gint file_is_in_filter(gchar *name); +static void add_to_filter(gchar *text, gint add); + +static gint sort_list_cb(void *a, void *b); +static void filelist_read(gchar *path); + +static gint file_find_closest_unaccounted(gint row, gint count, GList *ignore_list); + +static void history_menu_select_cb(GtkWidget *widget, gpointer data); +static gchar *truncate_hist_text(gchar *t, gint l); +static void filelist_set_history(gchar *path); + +/* + *----------------------------------------------------------------------------- + * file status information (private) + *----------------------------------------------------------------------------- + */ + +static void update_progressbar(gfloat val) +{ + gtk_progress_bar_update (GTK_PROGRESS_BAR(info_progress_bar), val); +} + +void update_status_label(gchar *text) +{ + gchar *buf; + gint count; + gchar *ss = ""; + + if (text) + { + gtk_label_set(GTK_LABEL(info_status), text); + return; + } + + if (slideshow_is_running()) ss = _(" Slideshow"); + + count = file_selection_count(); + if (count > 0) + buf = g_strdup_printf(_("%d files (%d)%s"), file_count(), count, ss); + else + buf = g_strdup_printf(_("%d files%s"), file_count(), ss); + + gtk_label_set(GTK_LABEL(info_status), buf); + g_free(buf); +} + +/* + *----------------------------------------------------------------------------- + * file filtering + *----------------------------------------------------------------------------- + */ + +static gint file_is_hidden(gchar *name) +{ + if (name[0] != '.') return FALSE; + if (name[1] == '\0' || (name[1] == '.' && name[2] == '\0')) return FALSE; + return TRUE; +} + +static gint file_is_in_filter(gchar *name) +{ + GList *work; + if (!filename_filter || file_filter_disable) return TRUE; + + work = filename_filter; + while (work) + { + gchar *filter = work->data; + gint lf = strlen(filter); + gint ln = strlen(name); + if (ln >= lf) + { + if (strncasecmp(name + ln - lf, filter, lf) == 0) return TRUE; + } + work = work->next; + } + + return FALSE; +} + +static void add_to_filter(gchar *text, gint add) +{ + if (add) filename_filter = g_list_append(filename_filter, g_strdup(text)); +} + +void rebuild_file_filter() +{ + if (filename_filter) + { + g_list_foreach(filename_filter,(GFunc)g_free,NULL); + g_list_free(filename_filter); + filename_filter = NULL; + } + + add_to_filter(".jpg", filter_include_jpg); + add_to_filter(".jpeg", filter_include_jpg); + add_to_filter(".xpm", filter_include_xpm); + add_to_filter(".tif", filter_include_tif); + add_to_filter(".tiff", filter_include_tif); + add_to_filter(".gif", filter_include_gif); + add_to_filter(".png", filter_include_png); + add_to_filter(".ppm", filter_include_ppm); + add_to_filter(".pgm", filter_include_pgm); + add_to_filter(".pcx", filter_include_pcx); + add_to_filter(".bmp", filter_include_bmp); + + if (custom_filter) + { + gchar *buf = g_strdup(custom_filter); + gchar *pos_ptr_b; + gchar *pos_ptr_e = custom_filter; + while(pos_ptr_e[0] != '\0') + { + pos_ptr_b = pos_ptr_e; + while (pos_ptr_e[0] != ';' && pos_ptr_e[0] != '\0') pos_ptr_e++; + if (pos_ptr_e[0] == ';') + { + pos_ptr_e[0] = '\0'; + pos_ptr_e++; + } + add_to_filter(pos_ptr_b, TRUE); + } + g_free(buf); + } +} + +/* + *----------------------------------------------------------------------------- + * load file list (private) + *----------------------------------------------------------------------------- + */ + +static gint sort_list_cb(void *a, void *b) +{ + return strcmp((gchar *)a, (gchar *)b); +} + +static void filelist_read(gchar *path) +{ + DIR *dp; + struct dirent *dir; + struct stat ent_sbuf; + + if((dp = opendir(path))==NULL) + { + /* dir not found */ + return; + } + + g_list_foreach(dir_list,(GFunc)g_free,NULL); + g_list_free(dir_list); + dir_list = NULL; + + g_list_foreach(file_list,(GFunc)g_free,NULL); + g_list_free(file_list); + file_list = NULL; + + while ((dir = readdir(dp)) != NULL) + { + /* skips removed files */ + if (dir->d_ino > 0) + { + gchar *name = dir->d_name; + if (show_dot_files || !file_is_hidden(name)) + { + gchar *filepath = g_strconcat(path, "/", name, NULL); + if (stat(filepath,&ent_sbuf) >= 0 && S_ISDIR(ent_sbuf.st_mode)) + { + dir_list = g_list_prepend(dir_list, g_strdup(name)); + } + else + { + if (file_is_in_filter(name)) + file_list = g_list_prepend(file_list, g_strdup(name)); + } + g_free(filepath); + } + } + } + + closedir(dp); + + dir_list = g_list_sort(dir_list, (GCompareFunc) sort_list_cb); + file_list = g_list_sort(file_list, (GCompareFunc) sort_list_cb); +} + +/* + *----------------------------------------------------------------------------- + * file list utilities to retrieve information (public) + *----------------------------------------------------------------------------- + */ + +gint file_count() +{ + return g_list_length(file_list); +} + +gint file_selection_count() +{ + gint count = 0; + GList *work = GTK_CLIST(file_clist)->selection; + while(work) + { + count++; + if (debug) printf("s = %d\n", GPOINTER_TO_INT(work->data)); + work = work->next; + } + + if (debug) printf("files selected = %d\n", count); + + return count; +} + +gint find_file_in_list(gchar *path) +{ + GList *work = file_list; + gchar *buf; + gchar *name; + gint count = -1; + + if (!path) return -1; + + buf = remove_level_from_path(path); + if (strcmp(buf, current_path) != 0) + { + g_free(buf); + return -1; + } + g_free(buf); + + name = filename_from_path(path); + while(work) + { + count++; + if (strcmp(name, work->data) == 0) return count; + work = work->next; + } + + return -1; +} + +gchar *file_get_path(gint row) +{ + gchar *path = NULL; + gchar *name = gtk_clist_get_row_data(GTK_CLIST(file_clist), row); + + if (name) path = g_strconcat(current_path, "/", name, NULL); + + return path; +} + +gint file_is_selected(gint row) +{ + GList *work = GTK_CLIST(file_clist)->selection; + + while(work) + { + if (GPOINTER_TO_INT(work->data) == row) return TRUE; + work = work->next; + } + + return FALSE; +} + +/* + *----------------------------------------------------------------------------- + * utilities to retrieve list of selected files (public) + *----------------------------------------------------------------------------- + */ + +GList *file_get_selected_list() +{ + GList *list = NULL; + GList *work = GTK_CLIST(file_clist)->selection; + + while(work) + { + gchar *name = gtk_clist_get_row_data(GTK_CLIST(file_clist), + GPOINTER_TO_INT(work->data)); + list = g_list_prepend(list, g_strconcat(current_path, "/", name, NULL)); + work = work->next; + } + + list = g_list_reverse(list); + + return list; +} + +void free_selected_list(GList *list) +{ + g_list_foreach(list, (GFunc)g_free, NULL); + g_list_free(list); +} + +gint file_clicked_is_selected() +{ + return file_is_selected(filelist_click_row); +} + +gchar *file_clicked_get_path() +{ + return file_get_path(filelist_click_row); +} + +/* + *----------------------------------------------------------------------------- + * image change routines + *----------------------------------------------------------------------------- + */ + +void file_image_change_to(gint row) +{ + gtk_clist_unselect_all(GTK_CLIST(file_clist)); + gtk_clist_select_row(GTK_CLIST(file_clist), row, -1); + if (gtk_clist_row_is_visible(GTK_CLIST(file_clist), row) != GTK_VISIBILITY_FULL) + { + gtk_clist_moveto(GTK_CLIST(file_clist), row, -1, 0.5, 0.0); + } +} + +void file_next_image() +{ + gint current = find_file_in_list(image_get_path()); + gint total = file_count(); + + if (current >= 0) + { + if (current < total - 1) + { + file_image_change_to(current + 1); + } + } + else + { + file_image_change_to(0); + } +} + +void file_prev_image() +{ + gint current = find_file_in_list(image_get_path()); + + if (current >= 0) + { + if (current > 0) + { + file_image_change_to(current - 1); + } + } + else + { + file_image_change_to(file_count() - 1); + } +} + +void file_first_image() +{ + gint current = find_file_in_list(image_get_path()); + if (current != 0 && file_count() > 0) + { + file_image_change_to(0); + } +} + +void file_last_image() +{ + gint current = find_file_in_list(image_get_path()); + gint count = file_count(); + if (current != count - 1 && count > 0) + { + file_image_change_to(count - 1); + } +} + +/* + *----------------------------------------------------------------------------- + * file delete/rename update routines + *----------------------------------------------------------------------------- + */ + +static gint file_find_closest_unaccounted(gint row, gint count, GList *ignore_list) +{ + GList *list = NULL; + GList *work; + gint rev = row - 1; + row ++; + + work = ignore_list; + while(work) + { + gint f = find_file_in_list(work->data); + if (f >= 0) list = g_list_append(list, GINT_TO_POINTER(f)); + work = work->next; + } + + while(list) + { + gint c = TRUE; + work = list; + while(work && c) + { + gpointer p = work->data; + work = work->next; + if (row == GPOINTER_TO_INT(p)) + { + row++; + c = FALSE; + } + if (rev == GPOINTER_TO_INT(p)) + { + rev--; + c = FALSE; + } + if (!c) list = g_list_remove(list, p); + } + if (c && list) + { + g_list_free(list); + list = NULL; + } + } + if (row > count - 1) + { + if (rev < 0) + return -1; + else + return rev; + } + else + { + return row; + } +} + +void file_is_gone(gchar *path, GList *ignore_list) +{ + GList *list; + gchar *name; + gint row; + gint new_row = -1; + row = find_file_in_list(path); + if (row < 0) return; + + if (file_is_selected(row) /* && file_selection_count() == 1 */) + { + gint n = file_count(); + if (ignore_list) + { + new_row = file_find_closest_unaccounted(row, n, ignore_list); + if (debug) printf("row = %d, closest is %d\n", row, new_row); + } + else + { + if (row + 1 < n) + { + new_row = row + 1; + } + else if (row > 0) + { + new_row = row - 1; + } + } + gtk_clist_unselect_all(GTK_CLIST(file_clist)); + if (new_row >= 0) + { + gtk_clist_select_row(GTK_CLIST(file_clist), new_row, -1); + file_image_change_to(new_row); + } + else + { + image_change_to(NULL); + } + } + + gtk_clist_remove(GTK_CLIST(file_clist), row); + list = g_list_nth(file_list, row); + name = list->data; + file_list = g_list_remove(file_list, name); + g_free(name); + update_status_label(NULL); +} + +void file_is_renamed(gchar *source, gchar *dest) +{ + gint row; + gchar *source_base; + gchar *dest_base; + + if (image_get_path() && !strcmp(source, image_get_path())) + { + image_set_path(dest); + } + + row = find_file_in_list(source); + if (row < 0) return; + + source_base = remove_level_from_path(source); + dest_base = remove_level_from_path(dest); + + if (strcmp(source_base, dest_base) == 0) + { + gchar *name; + gint n; + GList *work = g_list_nth(file_list, row); + name = work->data; + file_list = g_list_remove(file_list, name); + g_free(name); + name = g_strdup(filename_from_path(dest)); + file_list = g_list_insert_sorted(file_list, name, (GCompareFunc) sort_list_cb); + n = g_list_index(file_list, name); + + if (gtk_clist_get_cell_type(GTK_CLIST(file_clist), row, 0) != GTK_CELL_PIXTEXT) + { + gtk_clist_set_text (GTK_CLIST(file_clist), row, 0, name); + } + else + { + guint8 spacing = 0; + GdkPixmap *pixmap = NULL; + GdkBitmap *mask = NULL; + gtk_clist_get_pixtext(GTK_CLIST(file_clist), row, 0, + NULL, &spacing, &pixmap, &mask); + gtk_clist_set_pixtext(GTK_CLIST(file_clist), row, 0, + name, spacing, pixmap, mask); + } + + gtk_clist_set_row_data(GTK_CLIST(file_clist), row, name); + gtk_clist_row_move(GTK_CLIST(file_clist), row, n); + } + else + { + GList *work = g_list_nth(file_list, row); + gchar *name = work->data; + file_list = g_list_remove(file_list, name); + gtk_clist_remove(GTK_CLIST(file_clist), row); + g_free(name); + update_status_label(NULL); + } + + g_free(source_base); + g_free(dest_base); + +} + +/* + *----------------------------------------------------------------------------- + * directory list callbacks + *----------------------------------------------------------------------------- + */ + +void dir_select_cb(GtkWidget *widget, gint row, gint col, + GdkEvent *event, gpointer data) +{ + gchar *name; + gchar *new_path; + name = gtk_clist_get_row_data (GTK_CLIST(dir_clist), row); + if (strcmp(name, ".") == 0) + { + new_path = g_strdup(current_path); + } + else if (strcmp(name, "..") == 0) + { + new_path = remove_level_from_path(current_path); + } + else + { + if (strcmp(current_path, "/") == 0) + new_path = g_strconcat(current_path, name, NULL); + else + new_path = g_strconcat(current_path, "/", name, NULL); + } + filelist_change_to(new_path); + g_free(new_path); +} + +void dir_press_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data) +{ + gint row = -1; + gint col = -1; + + gtk_clist_get_selection_info (GTK_CLIST (widget), bevent->x, bevent->y, &row, &col); + + if (bevent->button == 2) + { + gtk_object_set_user_data(GTK_OBJECT(dir_clist), GINT_TO_POINTER(row)); + } +} + +/* + *----------------------------------------------------------------------------- + * file list callbacks + *----------------------------------------------------------------------------- + */ + +void file_press_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data) +{ + gint row = -1; + gint col = -1; + + gtk_clist_get_selection_info (GTK_CLIST (widget), bevent->x, bevent->y, &row, &col); + if (row == -1 || col == -1) + { + filelist_click_row = -1; + return; + } + + filelist_click_row = row; + + if (bevent->button == 3) + { + file_clist_highlight_set(); + gtk_menu_popup (GTK_MENU(menu_file_popup), NULL, NULL, NULL, NULL, + bevent->button, bevent->time); + } +} + +void file_select_cb(GtkWidget *widget, gint row, gint col, + GdkEvent *event, gpointer data) +{ + gchar *name; + gchar *path; + + if (file_selection_count() != 1) + { + update_status_label(NULL); + return; + } + + name = gtk_clist_get_row_data(GTK_CLIST(file_clist), row); + path = g_strconcat(current_path, "/", name, NULL); + image_change_to(path); + update_status_label(NULL); + g_free(path); +} + +void file_unselect_cb(GtkWidget *widget, gint row, gint col, + GdkEvent *event, gpointer data) +{ +#if 0 + gchar *name; + gchar *path; + + name = gtk_clist_get_row_data(GTK_CLIST(file_clist), row); + path = g_strconcat(current_path, "/", name, NULL); + + if (strcmp(path, image_get_path()) == 0) + { + if (file_selection_count() > 0 && !file_is_selected(find_file_in_list(image_get_path())) ) + { + gint new_row = GPOINTER_TO_INT(GTK_CLIST(file_clist)->selection->data); + gchar *new_name = gtk_clist_get_row_data(GTK_CLIST(file_clist), new_row); + gchar *new_path = g_strconcat(current_path, "/", new_name, NULL); + image_change_to(new_path); + g_free(new_path); + } + } + g_free(path); +#endif + update_status_label(NULL); +} + +/* + *----------------------------------------------------------------------------- + * file list highlight utils + *----------------------------------------------------------------------------- + */ + +void file_clist_highlight_set() +{ + if (file_clicked_is_selected()) return; + + gtk_clist_set_background(GTK_CLIST(file_clist), filelist_click_row, + >K_WIDGET (file_clist)->style->bg[GTK_STATE_PRELIGHT]); + gtk_clist_set_foreground(GTK_CLIST(file_clist), filelist_click_row, + >K_WIDGET (file_clist)->style->fg[GTK_STATE_PRELIGHT]); +} + +void file_clist_highlight_unset() +{ + if (file_clicked_is_selected()) return; + + gtk_clist_set_background(GTK_CLIST(file_clist), filelist_click_row, NULL); + gtk_clist_set_foreground(GTK_CLIST(file_clist), filelist_click_row, NULL); +} + +/* + *----------------------------------------------------------------------------- + * path entry and history menu + *----------------------------------------------------------------------------- + */ + +void path_entry_cb(gchar *newdir, gpointer data) +{ + gchar *new_path = g_strdup(newdir); + parse_out_relatives(new_path); + if (isdir(new_path)) + filelist_change_to(new_path); + else if (isfile(new_path)) + { + gchar *path = remove_level_from_path(new_path); + filelist_change_to(path); + g_free(path); + image_change_to(new_path); + } + g_free(new_path); +} + +static void history_menu_select_cb(GtkWidget *widget, gpointer data) +{ + gchar *new_path = data; + filelist_change_to(new_path); +} + +static gchar *truncate_hist_text(gchar *t, gint l) +{ + gchar *tp; + gchar *tbuf; + if (l >= strlen(t)) return g_strdup(t); + tp = t + strlen(t) - l; + while (tp[0] != '/' && tp < t + strlen(t)) tp++; + /* this checks to see if directory name is longer than l, if so + * reset the length of name to l, it's better to have a partial + * name than no name at all. + */ + if (tp >= t + strlen(t)) tp = t + strlen(t) - l; + tbuf = g_strconcat("/...", tp, NULL); + return tbuf; +} + +static void filelist_set_history(gchar *path) +{ + static GList *history_list = NULL; + gchar *buf; + gchar *buf_ptr; + GtkWidget *menu; + GtkWidget *item; + + if (!path) return; + + gtk_entry_set_text(GTK_ENTRY(path_entry), current_path); + + if (history_list) + { + g_list_foreach(history_list, (GFunc)g_free, NULL); + g_list_free(history_list); + history_list = NULL; + } + + menu = gtk_menu_new(); + + buf = g_strdup(path); + buf_ptr = buf + strlen(buf) - 1 ; + while (buf_ptr > buf) + { + gchar *full_path; + gchar *truncated; + truncated = truncate_hist_text(buf, 32); + + full_path = g_strdup(buf); + history_list = g_list_append(history_list, full_path); + + item = gtk_menu_item_new_with_label (truncated); + gtk_signal_connect (GTK_OBJECT (item), "activate", + (GtkSignalFunc) history_menu_select_cb, full_path); + + gtk_menu_append (GTK_MENU (menu), item); + gtk_widget_show (item); + + g_free(truncated); + + while (buf_ptr[0] != '/' && buf_ptr > buf) buf_ptr--; + buf_ptr[0] = '\0'; + } + g_free(buf); + + item = gtk_menu_item_new_with_label ("/"); + + gtk_signal_connect (GTK_OBJECT (item), "activate", + (GtkSignalFunc) history_menu_select_cb, "/"); + + gtk_menu_append (GTK_MENU (menu), item); + gtk_widget_show (item); + + gtk_option_menu_set_menu(GTK_OPTION_MENU(history_menu), menu); +} + +/* + *----------------------------------------------------------------------------- + * list update routines (public) + *----------------------------------------------------------------------------- + */ + +static gint thumbs_running = 0; + +void interrupt_thumbs() +{ + if (thumbs_running > 0) thumbs_running ++; +} + +void filelist_populate_clist() +{ + GList *work; + gint width; + gint tmp_width; + gint row; + gchar *image_name = NULL; + gchar *buf; + + gint row_p = 0; + gchar *text; + guint8 spacing; + GdkPixmap *nopixmap; + GdkBitmap *nomask; + + interrupt_thumbs(); + + filelist_set_history(current_path); + + gtk_clist_freeze (GTK_CLIST (dir_clist)); + gtk_clist_clear (GTK_CLIST (dir_clist)); + + width = 0; + work = dir_list; + while(work) + { + gchar *buf[2]; + buf[0] = work->data; + buf[1] = NULL; + row = gtk_clist_append(GTK_CLIST(dir_clist), buf); + gtk_clist_set_row_data (GTK_CLIST(dir_clist), row, work->data); + tmp_width = gdk_string_width(dir_clist->style->font, buf[0]); + if (tmp_width > width) width = tmp_width; + work = work->next; + } + + gtk_clist_set_column_width(GTK_CLIST(dir_clist), 0, width); + gtk_clist_thaw(GTK_CLIST (dir_clist)); + + buf = remove_level_from_path(image_get_path()); + if (buf && strcmp(buf, current_path) == 0) + { + image_name = image_get_name(); + } + g_free(buf); + + gtk_clist_freeze (GTK_CLIST (file_clist)); + + if (!thumbnails_enabled) + { + gtk_clist_set_row_height (GTK_CLIST(file_clist), + GTK_WIDGET(file_clist)->style->font->ascent + + GTK_WIDGET(file_clist)->style->font->descent + 1); + } + else + { + gtk_clist_set_row_height (GTK_CLIST(file_clist), thumb_max_height + 2); + maintain_thumbnail_dir(current_path, FALSE); + } + + width = 0; + work = file_list; + + while(work) + { + gint has_pixmap; + gint match; + gchar *name = work->data; + gint done = FALSE; + + while (!done) + { + if (GTK_CLIST(file_clist)->rows > row_p) + { + if (gtk_clist_get_cell_type(GTK_CLIST(file_clist),row_p, 0) == GTK_CELL_PIXTEXT) + { + gtk_clist_get_pixtext(GTK_CLIST(file_clist), row_p, 0, &text, &spacing, &nopixmap, &nomask); + has_pixmap = TRUE; + } + else + { + gtk_clist_get_text(GTK_CLIST(file_clist), row_p, 0, &text); + has_pixmap = FALSE; + } + match = strcmp(name, text); + } + else + { + match = -1; + } + + if (match < 0) + { + gchar *buf[2]; + buf[0] = name; + buf[1] = NULL; + row = gtk_clist_insert(GTK_CLIST(file_clist), row_p, buf); + gtk_clist_set_row_data (GTK_CLIST(file_clist), row, name); + if (thumbnails_enabled) + gtk_clist_set_shift(GTK_CLIST(file_clist), row, 0, 0, 5 + thumb_max_width); + done = TRUE; + if (image_name && strcmp(name, image_name) == 0) + gtk_clist_select_row(GTK_CLIST(file_clist), row, 0); + } + else if (match > 0) + { + gtk_clist_remove(GTK_CLIST(file_clist), row_p); + } + else + { + if (thumbnails_enabled && !has_pixmap) + gtk_clist_set_shift(GTK_CLIST(file_clist), row_p, 0, 0, 5 + thumb_max_width); + if (!thumbnails_enabled/* && has_pixmap*/) + { + gtk_clist_set_text(GTK_CLIST(file_clist), row_p, 0, name); + gtk_clist_set_shift(GTK_CLIST(file_clist), row_p, 0, 0, 0); + } + gtk_clist_set_row_data (GTK_CLIST(file_clist), row_p, name); + done = TRUE; + } + } + row_p++; + + if (thumbnails_enabled) + tmp_width = gdk_string_width(file_clist->style->font, name) + thumb_max_width + 5; + else + tmp_width = gdk_string_width(file_clist->style->font, name); + if (tmp_width > width) width = tmp_width; + work = work->next; + } + + while (GTK_CLIST(file_clist)->rows > row_p) + gtk_clist_remove(GTK_CLIST(file_clist), row_p); + + gtk_clist_set_column_width(GTK_CLIST(file_clist), 0, width); + gtk_clist_thaw(GTK_CLIST (file_clist)); + + if (thumbnails_enabled) + { + GList *done_list = NULL; + gint past_run; + gint finished = FALSE; + gint j; + gint count = 0; + update_status_label(_("Loading thumbs...")); + + for (j = 0; j < GTK_CLIST(file_clist)->rows; j++) + { + done_list = g_list_prepend(done_list, GINT_TO_POINTER(FALSE)); + } + + /* load thumbs */ + + while (!finished && done_list) + { + gint p = -1; + gint r = -1; + gint c = -1; + gtk_clist_get_selection_info (GTK_CLIST(file_clist), 1, 1, &r, &c); + if (r != -1) + { + work = g_list_nth(done_list, r); + while (work) + { + if (gtk_clist_row_is_visible(GTK_CLIST(file_clist), r)) + { + if (!GPOINTER_TO_INT(work->data)) + { + work->data = GINT_TO_POINTER(TRUE); + p = r; + work = NULL; + } + else + { + r++; + work = work->next; + } + } + else + { + work = NULL; + } + } + } + if (p == -1) + { + work = done_list; + r = 0; + while(work && p == -1) + { + if (!GPOINTER_TO_INT(work->data)) + { + p = r; + work->data = GINT_TO_POINTER(TRUE); + } + else + { + r++; + work = work->next; + if (!work) finished = TRUE; + } + } + } + + count++; + + if (!finished && gtk_clist_get_cell_type(GTK_CLIST(file_clist), p, 0) != GTK_CELL_PIXTEXT) + { + GdkPixmap *pixmap = NULL; + GdkBitmap *mask = NULL; + gchar *name; + gchar *path; + + thumbs_running ++; + past_run = thumbs_running; + while(gtk_events_pending()) gtk_main_iteration(); + if (thumbs_running > past_run) + { + thumbs_running -= 2; + update_progressbar(0.0); + update_status_label(NULL); + g_list_free(done_list); + return; + } + thumbs_running --; + + name = gtk_clist_get_row_data(GTK_CLIST(file_clist), p); + path = g_strconcat (current_path, "/", name, NULL); + spacing = create_thumbnail(path, &pixmap, &mask); + g_free(path); + gtk_clist_set_pixtext (GTK_CLIST(file_clist), p, 0, name, spacing + 5, pixmap, mask); + gtk_clist_set_shift(GTK_CLIST(file_clist), p, 0, 0, 0); + + update_progressbar((gfloat)(count) / GTK_CLIST(file_clist)->rows); + } + } + update_progressbar(0.0); + g_list_free(done_list); + } + + update_status_label(NULL); +} + +void filelist_refresh() +{ + filelist_read(current_path); + filelist_populate_clist(); + filelist_click_row = -1; +} + +void filelist_change_to(gchar *path) +{ + if (!isdir(path)) return; + + g_free(current_path); + current_path = g_strdup(path); + + filelist_refresh(); +} diff --git a/src/fileops.c b/src/fileops.c new file mode 100644 index 00000000..8b6ba3c4 --- /dev/null +++ b/src/fileops.c @@ -0,0 +1,133 @@ +/* + * GQview image viewer + * (C)1999 John Ellis + * + * Author: John Ellis + * + */ + +#include "gqview.h" + +/* + *----------------------------------------------------------------------------- + * generic file information and manipulation routines (public) + *----------------------------------------------------------------------------- + */ + +/* first we try the HOME environment var, if that doesn't work, we try getpwuid(). */ +gchar *homedir() +{ + gchar *home = getenv("HOME"); + if(home) + return home; + else + { + struct passwd *pw = getpwuid(getuid()); + if (pw) + return pw->pw_dir; + else + return NULL ; /* now we've got a problem */ + } +} + +int isfile(char *s) +{ + struct stat st; + + if ((!s)||(!*s)) return 0; + if (stat(s,&st)<0) return 0; + if (S_ISREG(st.st_mode)) return 1; + return 0; +} + +int isdir(char *s) +{ + struct stat st; + + if ((!s)||(!*s)) return 0; + if (stat(s,&st)<0) return 0; + if (S_ISDIR(st.st_mode)) return 1; + return 0; +} + +int filesize(char *s) +{ + struct stat st; + + if ((!s)||(!*s)) return 0; + if (stat(s,&st)<0) return 0; + return (int)st.st_size; +} + +time_t filetime(gchar *s) +{ + struct stat st; + + if ((!s)||(!*s)) return 0; + if (stat(s,&st)<0) return 0; + return st.st_mtime; +} + +int copy_file(char *s, char *t) +{ + FILE *fi, *fo; + char buf[4096]; + int b; + + fi = fopen(s, "rb"); + if (!fi) + { + return FALSE; + } + + fo = fopen(t, "wb"); + if (!fo) + { + fclose(fi); + return FALSE; + } + + while((b = fread(buf, sizeof(char), 4096, fi)) && b != 0) + { + if (fwrite(buf, sizeof(char), b, fo) != b) + { + fclose(fi); + fclose(fo); + return FALSE; + } + } + + fclose(fi); + fclose(fo); + return TRUE; +} + +int move_file(char *s, char *t) +{ + if (rename (s, t) < 0) + { + /* this may have failed because moving a file across filesystems + was attempted, so try copy and delete instead */ + if (copy_file(s, t)) + { + if (unlink (s) < 0) + { + /* err, now we can't delete the source file so return FALSE */ + return FALSE; + } + } + else + return FALSE; + } + + return TRUE; +} + +gchar *get_current_dir() +{ + char buf[512]; + getcwd(buf, 510); + return g_strdup(buf); +} + + diff --git a/src/globals.c b/src/globals.c new file mode 100644 index 00000000..a41cdb08 --- /dev/null +++ b/src/globals.c @@ -0,0 +1,120 @@ +/* + * GQview image viewer + * (C)1999 John Ellis + * + * Author: John Ellis + * + */ + +#include "gqview.h" +#include "logo.h" + +/* image */ +ImageWindow *main_image = NULL; + +/* main window */ +GtkWidget *mainwindow; +GtkWidget *mainwindow_hbox; +GtkWidget *mainwindow_vbox; +GtkAccelGroup *mainwindow_accel_grp; + +GtkWidget *info_box = NULL; +GtkWidget *info_progress_bar; +GtkWidget *info_status; +GtkWidget *info_details; +GtkWidget *info_zoom; + +/* full screen */ +ImageWindow *normal_image = NULL; +ImageWindow *full_screen_image = NULL; +GtkWidget *full_screen_window = NULL; + +/* tools floating window */ +GtkWidget *toolwindow = NULL; + +/* tools */ +GtkWidget *tool_vbox; + +GtkWidget *path_entry; +GtkWidget *history_menu; + +GtkWidget *dir_clist; +GtkWidget *file_clist; + +GtkWidget *menu_file; +GtkWidget *menu_edit; +GtkWidget *menu_view; +GtkWidget *menu_help; +GtkWidget *menu_file_popup; +GtkWidget *menu_filelist_edit; +GtkWidget *menu_image_popup; +GtkWidget *menu_image_edit; +GtkWidget *menu_window_full; +GtkWidget *menu_window_full_edit; +GtkWidget *menu_window_view; +GtkWidget *menu_window_view_edit; + +GtkWidget *thumb_button; +GtkWidget *thumb_menu_item; + +/* lists */ +GList *dir_list = NULL; +GList *file_list = NULL; +gchar *current_path = NULL; + +GList *filename_filter = NULL; + +/* -- options -- */ +gint main_window_w = 400; +gint main_window_h = 350; +gint main_window_x = 0; +gint main_window_y = 0; + +gint float_window_w = 150; +gint float_window_h = 350; +gint float_window_x = 0; +gint float_window_y = 0; + +gint save_window_positions = FALSE; +gint tools_float = FALSE; +gint tools_hidden = FALSE; +gint progressive_key_scrolling = FALSE; + +gint startup_path_enable = FALSE; +gchar *startup_path = NULL; +gint confirm_delete = TRUE; +gint restore_tool = FALSE; +gint zoom_mode = ZOOM_RESET_ORIGINAL; +gint fit_window = FALSE; +gint limit_window_size = FALSE; +gint max_window_size = 100; +gint thumb_max_width = 64; +gint thumb_max_height = 64; +gint enable_thumb_caching = FALSE; +gint use_xvpics_thumbnails = TRUE; +gint show_dot_files = FALSE; +gint file_filter_disable = FALSE; +gint filter_include_jpg = TRUE; +gint filter_include_xpm = TRUE; +gint filter_include_tif = TRUE; +gint filter_include_gif = TRUE; +gint filter_include_png = TRUE; +gint filter_include_ppm = TRUE; +gint filter_include_pgm = TRUE; +gint filter_include_pcx = TRUE; +gint filter_include_bmp = TRUE; +gchar *custom_filter = NULL; +gchar *editor_name[8]; +gchar *editor_command[8]; + +gint thumbnails_enabled = FALSE; + +gint slideshow_delay = 15; +gint slideshow_random = FALSE; +gint slideshow_repeat = FALSE; + +gint debug = FALSE; + +/* logo & misc images */ + + diff --git a/src/gqview.h b/src/gqview.h new file mode 100644 index 00000000..1f8fee6e --- /dev/null +++ b/src/gqview.h @@ -0,0 +1,354 @@ +/* + * GQview image viewer + * (C)1999 John Ellis + * + * Author: John Ellis + * + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "intl.h" + +/* + *------------------------------------- + * Standard library includes + *------------------------------------- + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +/* + *------------------------------------- + * includes for glib / gtk / imlib + *------------------------------------- + */ + +#include +#include +#include + +/* + *---------------------------------------------------------------------------- + * defines + *---------------------------------------------------------------------------- + */ + +#define RC_FILE_NAME ".gqviewrc" +#define RC_THUMB_DIR ".gqview_thmb" + +#define ZOOM_RESET_ORIGINAL 0 +#define ZOOM_RESET_FIT_WINDOW 1 +#define ZOOM_RESET_NONE 2 + +typedef struct _ImageWindow ImageWindow; +struct _ImageWindow +{ + GtkWidget *eventbox; + GtkWidget *table; + GtkWidget *viewport; + GtkWidget *image; + + gchar *image_path; + gchar *image_name; + + gint width; + gint height; + gint size; + + gint old_width; + gint old_height; + + gint unknown; + gint zoom; + + GdkPixmap *image_pixmap; + GdkImlibImage *image_data; + + gint in_drag; + gint drag_last_x; + gint drag_last_y; + gint drag_moved; + + gint artificial_size; + gint new_img; + + /* info, zoom labels & windows */ + + GtkWidget *top_window; /* window that gets title set to image filename */ + GtkWidget *info_label; /* label set to show image h x w , size */ + GtkWidget *zoom_label; /* label to display zoom */ + gchar *title; /* window title to display left of file name */ + gint show_title_zoom; /* option to include zoom in window title */ + + /* button functions */ + void (*func_btn1)(ImageWindow *, GdkEventButton *, gpointer); + void (*func_btn2)(ImageWindow *, GdkEventButton *, gpointer); + void (*func_btn3)(ImageWindow *, GdkEventButton *, gpointer); + + gpointer data_btn1; + gpointer data_btn2; + gpointer data_btn3; +}; + +/* image */ +extern ImageWindow *main_image; + +/* main window */ +extern GtkWidget *mainwindow; +extern GtkWidget *mainwindow_hbox; +extern GtkWidget *mainwindow_vbox; +extern GtkAccelGroup *mainwindow_accel_grp; + +extern GtkWidget *info_box; +extern GtkWidget *info_progress_bar; +extern GtkWidget *info_status; +extern GtkWidget *info_details; +extern GtkWidget *info_zoom; + +/* full screen */ +extern ImageWindow *normal_image; +extern ImageWindow *full_screen_image; +extern GtkWidget *full_screen_window; + +/* tools floating window */ +extern GtkWidget *toolwindow; + +/* tools */ +extern GtkWidget *tool_vbox; + +extern GtkWidget *path_entry; +extern GtkWidget *history_menu; + +extern GtkWidget *dir_clist; +extern GtkWidget *file_clist; + +extern GtkWidget *menu_file; +extern GtkWidget *menu_edit; +extern GtkWidget *menu_view; +extern GtkWidget *menu_help; +extern GtkWidget *menu_file_popup; +extern GtkWidget *menu_filelist_edit; +extern GtkWidget *menu_image_popup; +extern GtkWidget *menu_image_edit; +extern GtkWidget *menu_window_full; +extern GtkWidget *menu_window_full_edit; +extern GtkWidget *menu_window_view; +extern GtkWidget *menu_window_view_edit; + +extern GtkWidget *thumb_button; +extern GtkWidget *thumb_menu_item; + +/* lists */ +extern GList *dir_list; +extern GList *file_list; +extern gchar *current_path; + +extern GList *filename_filter; + +/* -- options -- */ +extern gint main_window_w; +extern gint main_window_h; +extern gint main_window_x; +extern gint main_window_y; + +extern gint float_window_w; +extern gint float_window_h; +extern gint float_window_x; +extern gint float_window_y; + +extern gint save_window_positions; +extern gint tools_float; +extern gint tools_hidden; +extern gint progressive_key_scrolling; + +extern gint startup_path_enable; +extern gchar *startup_path; +extern gint confirm_delete; +extern gint restore_tool; +extern gint zoom_mode; +extern gint fit_window; +extern gint limit_window_size; +extern gint max_window_size; +extern gint thumb_max_width; +extern gint thumb_max_height; +extern gint enable_thumb_caching; +extern gint use_xvpics_thumbnails; +extern gint show_dot_files; +extern gint file_filter_disable; +extern gint filter_include_jpg; +extern gint filter_include_xpm; +extern gint filter_include_tif; +extern gint filter_include_gif; +extern gint filter_include_png; +extern gint filter_include_ppm; +extern gint filter_include_pgm; +extern gint filter_include_pcx; +extern gint filter_include_bmp; +extern gchar *custom_filter; +extern gchar *editor_name[]; +extern gchar *editor_command[]; + +extern gint thumbnails_enabled; + +extern gint slideshow_delay; /* in seconds */ +extern gint slideshow_random; +extern gint slideshow_repeat; + +extern gint debug; + +/* logo & misc images */ +extern const int logo_width; +extern const int logo_height; +extern const unsigned char logo[]; + +/* -- functions -- */ + +/* main.c */ +gchar *filename_from_path(char *t); +gchar *remove_level_from_path(gchar *path); +void parse_out_relatives(gchar *path); +void start_editor_from_file(gint n, gchar *path); +void start_editor_from_image(gint n); +void start_editor_from_list(gint n); +void keyboard_scroll_calc(gint *x, gint *y, GdkEventKey *event); +gint key_press_cb(GtkWidget *widget, GdkEventKey *event); +void exit_gqview(); + +/* window.c */ +void toolwindow_float(); +void toolwindow_hide(); +void create_main_window(); + +/* menu.c */ +void add_menu_popup_item(GtkWidget *menu, gchar *label, + GtkSignalFunc func, gpointer data); +void add_menu_divider(GtkWidget *menu); +void update_edit_menus(GtkAccelGroup *accel_grp); +GtkWidget *create_menu_bar(GtkAccelGroup *accel_grp); +void create_menu_popups(); +GtkWidget *create_button_bar(GtkTooltips *tooltips); + +/* img-main.c */ +void full_screen_start(); +void full_screen_stop(); +void full_screen_toggle(); +void image_scroll(gint x, gint y); +void image_adjust_zoom(gint increment); +void image_set_zoom(gint zoom); +void image_set_path(gchar *path); +gchar *image_get_path(); +gchar *image_get_name(); +void image_change_to(gchar *path); +void image_set_labels(GtkWidget *info, GtkWidget *zoom); +GtkWidget *image_create(); + +/* filelist.c */ +void update_status_label(gchar *text); +void rebuild_file_filter(); +gint find_file_in_list(gchar *path); +GList *file_get_selected_list(); +void free_selected_list(GList *list); +gint file_clicked_is_selected(); +gchar *file_clicked_get_path(); +gint file_count(); +gint file_selection_count(); +gchar *file_get_path(gint row); +gint file_is_selected(gint row); +void file_image_change_to(gint row); +void file_next_image(); +void file_prev_image(); +void file_first_image(); +void file_last_image(); +void file_is_gone(gchar *path, GList *ignore_list); +void file_is_renamed(gchar *source, gchar *dest); +void dir_select_cb(GtkWidget *widget, gint row, gint col, + GdkEvent *event, gpointer data); +void dir_press_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data); +void file_press_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data); +void file_select_cb(GtkWidget *widget, gint row, gint col, + GdkEvent *event, gpointer data); +void file_unselect_cb(GtkWidget *widget, gint row, gint col, + GdkEvent *event, gpointer data); +void file_clist_highlight_set(); +void file_clist_highlight_unset(); +void path_entry_cb(gchar *newdir, gpointer data); +void interrupt_thumbs(); +void filelist_populate_clist(); +void filelist_refresh(); +void filelist_change_to(gchar *path); + +/* config.c */ +void show_config_window(); +void show_about_window(); + +/* rcfile.c */ +void save_options(); +void load_options(); + +/* tabcomp.c */ +GtkWidget *tab_completion_new_with_history(GtkWidget **entry, GtkWidget *window, gchar *text, + const gchar *history_key, gint max_levels, + void (*enter_func)(gchar *, gpointer), gpointer data); +gchar *tab_completion_set_to_last_history(GtkWidget *entry); +void tab_completion_append_to_history(GtkWidget *entry, gchar *path); + +GtkWidget *tab_completion_new(GtkWidget **entry, GtkWidget *window, gchar *text, + void (*enter_func)(gchar *, gpointer), gpointer data); +void tab_completion_add_to_entry(GtkWidget *entry, void (*enter_func)(gchar *, gpointer), gpointer data); +void tab_completion_add_tab_func(GtkWidget *entry, void (*tab_func)(gchar *, gpointer), gpointer data); +gchar *remove_trailing_slash(gchar *path); + +/* fileops.c */ +gchar *homedir(); +int isfile(char *s); +int isdir(char *s); +int filesize(char *s); +time_t filetime(gchar *s); +int copy_file(char *s, char *t); +int move_file(char *s, char *t); +gchar *get_current_dir(); + +/* dnd.c */ +void image_dnd_init(ImageWindow *imd); +void init_dnd(); + +/* pathsel.c */ +GtkWidget *destination_widget_new(gchar *path, GtkWidget *entry); +void destination_widget_sync_to_entry(GtkWidget *entry); + +#include "utildlg.h" + +/* utilops.c */ +void file_util_delete(gchar *source_path, GList *source_list); +void file_util_move(gchar *source_path, GList *source_list, gchar *dest_path); +void file_util_copy(gchar *source_path, GList *source_list, gchar *dest_path); +void file_util_rename(gchar *source_path, GList *source_list); +void file_util_create_dir(gchar *path); + +/* thumb.c */ +gint create_thumbnail(gchar *path, GdkPixmap **thumb_pixmap, GdkBitmap **thumb_mask); +gint maintain_thumbnail_dir(gchar *dir, gint recursive); + +/* slideshow.c */ +void slideshow_start(); +void slideshow_stop(); +void slideshow_toggle(); +gint slideshow_is_running(); + +/* img-view.c */ +void view_window_new(gchar *path); +void view_window_active_edit(gint n); +void create_menu_view_popup(); + + + diff --git a/src/icons/.cvsignore b/src/icons/.cvsignore new file mode 100644 index 00000000..3dda7298 --- /dev/null +++ b/src/icons/.cvsignore @@ -0,0 +1,2 @@ +Makefile.in +Makefile diff --git a/src/icons/Makefile.am b/src/icons/Makefile.am new file mode 100644 index 00000000..8b13875c --- /dev/null +++ b/src/icons/Makefile.am @@ -0,0 +1,12 @@ +EXTRA_DIST = \ + icon_config.xpm \ + icon_float.xpm \ + icon_home.xpm \ + icon_reload.xpm \ + icon_thumb.xpm \ + icon_zoom_fit.xpm \ + icon_zoom_in.xpm \ + icon_zoom_norm.xpm \ + icon_zoom_out.xpm \ + img_unknown.xpm + diff --git a/src/icons/icon_config.xpm b/src/icons/icon_config.xpm new file mode 100644 index 00000000..427c8686 --- /dev/null +++ b/src/icons/icon_config.xpm @@ -0,0 +1,28 @@ +/* XPM */ +static char * icon_config_xpm[] = { +"20 20 5 1", +" c None", +". c #000000000000", +"X c #CF3CCF3CCF3C", +"o c #79E77DF779E7", +"O c #FFFFFFFFFFFF", +" ", +" ... ", +" .XX. ", +" .XX. ", +" .. .X.o ", +" .X. .XX.o ", +" .XX.XXO.o ", +" .XXOXXX. ", +" ....XOX. ", +" ooo.XOX. ", +" .XOX.... ", +" .XXOXOX. ", +" .XXX.XX. ", +" .OX.o.X.o ", +" .X.oo ..o ", +" .XX. oo ", +" .XX. ", +" ...o ", +" ooo ", +" "}; diff --git a/src/icons/icon_float.xpm b/src/icons/icon_float.xpm new file mode 100644 index 00000000..ae27662c --- /dev/null +++ b/src/icons/icon_float.xpm @@ -0,0 +1,28 @@ +/* XPM */ +static char * icon_float_xpm[] = { +"10 20 5 1", +" c None", +". c #000000", +"+ c #FFFFFF", +"@ c #CFCFCF", +"# c #797D79", +" ", +" ....... ", +" .++@+@.# ", +" .+@+@@.# ", +" .@@@.## ", +" .+@@.## ", +" .@@@.# ", +" .+@@.# ", +" .++@@@. ", +".++@+@+@. ", +".+@@@@@@.#", +".........#", +" #.@.####", +" .+.# ", +" .+.# ", +" .+.# ", +" .+.# ", +" .## ", +" # ", +" "}; diff --git a/src/icons/icon_home.xpm b/src/icons/icon_home.xpm new file mode 100644 index 00000000..7e3ed43e --- /dev/null +++ b/src/icons/icon_home.xpm @@ -0,0 +1,30 @@ +/* XPM */ +static char * icon_home_xpm[] = { +"20 20 7 1", +" c None", +". c #FFFF00000000", +"X c #79E700000000", +"o c #10402CB22081", +"O c #79E77DF779E7", +"+ c #9E799A699E79", +"@ c #FFFFFFFFFFFF", +" ", +" .XX oo ", +" .XoOo++o ", +" .Xoo+++@o ", +" .Xo+++@@@o ", +" .o+++@@@@@o ", +" o+++@@@@@@@o ", +" o+++@@@@@@@@@o ", +" ooo+@@@@@@@@@ooo ", +" Oo@@@@@@@@@@oOOO ", +" o@@@@@@@@@@oO ", +" o@@oooo@@@@oO ", +" o@@oO o@@@@oO ", +" o@@oO o@@@@oO ", +" o@@oO o@@@@oO ", +" o@@oO o@@@@oO ", +" o@@oO o@@@@oO ", +" ooooO ooooooO ", +" OOOO OOOOOO ", +" "}; diff --git a/src/icons/icon_reload.xpm b/src/icons/icon_reload.xpm new file mode 100644 index 00000000..b39fc37f --- /dev/null +++ b/src/icons/icon_reload.xpm @@ -0,0 +1,27 @@ +/* XPM */ +static char * icon_reload_xpm[] = { +"20 20 4 1", +" c None", +". c #000000000000", +"X c #00007DF70000", +"o c #79E77DF779E7", +" ", +" ", +" ...... ", +" .XXXXXX.. ", +" .XXXXXXXXX. ", +" .XXXX...XXXX. ", +" .XXX.ooo..XX. ", +" .XX.oo .XXX. ", +" ...XX... .XX.o ", +" .XXXX.oo .XX.o ", +" .XX.oo .XX.o ", +" ..oo .XX.o ", +" oo .XXX.o ", +" ..... ..XX.oo ", +" .XXX....XXXX.o ", +" .XXXXXXXXX.oo ", +" ..XXXXX..oo ", +" o.....ooo ", +" ooooo ", +" "}; diff --git a/src/icons/icon_thumb.xpm b/src/icons/icon_thumb.xpm new file mode 100644 index 00000000..2fe88f8f --- /dev/null +++ b/src/icons/icon_thumb.xpm @@ -0,0 +1,26 @@ +/* XPM */ +static char * icon_thumb_xpm[] = { +"20 20 3 1", +" c None", +". c #000000", +"+ c #797D79", +" ", +" ", +" ...... ", +" ......+ . . ", +" ......+ . . . ", +" ......+ + + + ", +" ++++++ ", +" ", +" ...... ", +" ......+ . . . . ", +" ......+ . . . . ", +" ......+ + + + + ", +" ++++++ ", +" ", +" ...... ", +" ......+ . . . ", +" ......+ . . . . ", +" ......+ + + + + ", +" ++++++ ", +" "}; diff --git a/src/icons/icon_zoom_fit.xpm b/src/icons/icon_zoom_fit.xpm new file mode 100644 index 00000000..ac6eb2f2 --- /dev/null +++ b/src/icons/icon_zoom_fit.xpm @@ -0,0 +1,26 @@ +/* XPM */ +static char * icon_zoom_fit_xpm[] = { +"20 20 3 1", +" c None", +". c #000000000000", +"X c #79E77DF779E7", +" ", +" ", +" ....... ", +" XX.XXXX ", +" ... ", +" . .X. ", +" . .X . ", +" .X . .X . .X ", +" .X. X . .X ", +" ...... ......X ", +" .X.XXXX XX.X.X ", +" .X . . . .X ", +" .X .X .X ", +" X . .X. X ", +" ... ", +" .X ", +" ....... ", +" XXXXXXX ", +" ", +" "}; diff --git a/src/icons/icon_zoom_in.xpm b/src/icons/icon_zoom_in.xpm new file mode 100644 index 00000000..f4e74ebb --- /dev/null +++ b/src/icons/icon_zoom_in.xpm @@ -0,0 +1,29 @@ +/* XPM */ +static char * icon_zoom_in_xpm[] = { +"20 20 6 1", +" c None", +". c #000000000000", +"X c #E79DE79DE79D", +"o c #B6DAB2CAB6DA", +"O c #79E77DF779E7", +"+ c #FFFFFFFFFFFF", +" ", +" ... ", +" ..XXX.. ", +" .XXo.oXX. ", +" .Xoo.XoX. ", +" .XooX.XXXX. ", +" .X.......X.O ", +" .XoXX.XXXX.O ", +" .XXX.XXX.OO ", +" .XXX.XXX.O ", +" ..XXX..X. ", +" ...OO.X.. ", +" OOO .+X. ", +" .X+X. ", +" .X+X. ", +" .X+X. ", +" .X+X. ", +" .X.OO", +" .OO ", +" O "}; diff --git a/src/icons/icon_zoom_norm.xpm b/src/icons/icon_zoom_norm.xpm new file mode 100644 index 00000000..e8169af7 --- /dev/null +++ b/src/icons/icon_zoom_norm.xpm @@ -0,0 +1,26 @@ +/* XPM */ +static char * icon_zoom_norm_xpm[] = { +"20 20 3 1", +" c None", +". c #000000000000", +"X c #79E77DF779E7", +" ", +" ", +" ..... ..... ", +" .XXXXX XXX.X ", +" .X .X ", +" .X .X ", +" .X .X ", +" X X ", +" ", +" ", +" ", +" ", +" . . ", +" .X .X ", +" .X .X ", +" .X .X ", +" ..... .....X ", +" XXXXX XXXXX ", +" ", +" "}; diff --git a/src/icons/icon_zoom_out.xpm b/src/icons/icon_zoom_out.xpm new file mode 100644 index 00000000..6f8e354f --- /dev/null +++ b/src/icons/icon_zoom_out.xpm @@ -0,0 +1,29 @@ +/* XPM */ +static char * icon_zoom_out_xpm[] = { +"20 20 6 1", +" c None", +". c #000000000000", +"X c #E79DE79DE79D", +"o c #B6DAB2CAB6DA", +"O c #79E77DF779E7", +"+ c #FFFFFFFFFFFF", +" ", +" ... ", +" ..XXX.. ", +" .XXoooXX. ", +" .XooXooX. ", +" .XooXXXXXX. ", +" .X.......X.O ", +" .XoXXXXXXX.O ", +" .XXXXXXX.OO ", +" .XXXXXXX.O ", +" ..XXX..X. ", +" ...OO.X.. ", +" OOO .+X. ", +" .X+X. ", +" .X+X. ", +" .X+X. ", +" .X+X. ", +" .X.OO", +" .OO ", +" O "}; diff --git a/src/icons/img_unknown.xpm b/src/icons/img_unknown.xpm new file mode 100644 index 00000000..0b202bfc --- /dev/null +++ b/src/icons/img_unknown.xpm @@ -0,0 +1,159 @@ +/* XPM */ +static char * img_unknown_xpm[] = { +"48 48 108 2", +" c None", +". c #DDDDDD", +"+ c #DCDCDC", +"@ c #DBDBDB", +"# c #DADADA", +"$ c #D9D9D9", +"% c #D8D8D8", +"& c #D7D7D7", +"* c #D6D6D6", +"= c #D5D5D5", +"- c #D4D4D4", +"; c #D3D3D3", +"> c #D2D2D2", +", c #D1D1D1", +"' c #F40000", +") c #F30000", +"! c #F10000", +"~ c #F00000", +"{ c #EF0000", +"] c #EE0000", +"^ c #ED0000", +"/ c #CDCDCD", +"( c #CECECE", +"_ c #CFCFCF", +": c #D0D0D0", +"< c #F50000", +"[ c #EB0000", +"} c #EA0000", +"| c #E90000", +"1 c #E80000", +"2 c #C9C9C9", +"3 c #CACACA", +"4 c #CCCCCC", +"5 c #F60000", +"6 c #EC0000", +"7 c #E60000", +"8 c #E50000", +"9 c #E40000", +"0 c #E30000", +"a c #E20000", +"b c #C6C6C6", +"c c #C7C7C7", +"d c #CBCBCB", +"e c #C4C4C4", +"f c #C3C3C3", +"g c #DF0000", +"h c #DE0000", +"i c #DD0000", +"j c #DC0000", +"k c #F70000", +"l c #E70000", +"m c #C0C0C0", +"n c #BEBEBE", +"o c #BCBCBC", +"p c #D80000", +"q c #D70000", +"r c #D90000", +"s c #BDBDBD", +"t c #BFBFBF", +"u c #C5C5C5", +"v c #F20000", +"w c #C2C2C2", +"x c #BBBBBB", +"y c #B9B9B9", +"z c #B8B8B8", +"A c #D30000", +"B c #D20000", +"C c #D50000", +"D c #C1C1C1", +"E c #E00000", +"F c #BABABA", +"G c #B6B6B6", +"H c #B5B5B5", +"I c #B4B4B4", +"J c #CF0000", +"K c #CE0000", +"L c #D00000", +"M c #B7B7B7", +"N c #B3B3B3", +"O c #B2B2B2", +"P c #CC0000", +"Q c #CB0000", +"R c #CA0000", +"S c #B1B1B1", +"T c #C80000", +"U c #C70000", +"V c #AFAFAF", +"W c #C90000", +"X c #C60000", +"Y c #C50000", +"Z c #ADADAD", +"` c #C40000", +" . c #ABABAB", +".. c #AEAEAE", +"+. c #C8C8C8", +"@. c #C30000", +"#. c #AAAAAA", +"$. c #B0B0B0", +"%. c #D10000", +"&. c #A9A9A9", +"*. c #ACACAC", +"=. c #D60000", +"-. c #DA0000", +";. c #D40000", +">. c #CD0000", +",. c #DB0000", +"'. c #E10000", +"). c #000000", +". . . . . . . . . . . . . . . . + + @ @ # $ % & * * * = = = = = = * * & % $ $ # @ + + . . . . . ", +". . . . . . . . . . . . . . . + + @ # $ % & * = - ; > > , , , , > ; ; = * * % $ # @ + + . . . . ", +". . . . . . . . . . . . . . + + @ # % & * = ' ) ! ~ { ] ^ / / / ( _ : , > - * & % # @ + + . . . ", +". . . . . . . . . . . . . + + @ # % * * < ) ! { ^ [ } | 1 1 1 1 2 3 4 / _ , ; = * % $ @ + + . . ", +". . . . . . . . . . . . . + @ # % * 5 ' ! { 6 } 1 7 8 9 0 a a 0 0 b c 2 d / : > = * % # @ + . . ", +". . . . . . . . . . . . + @ # $ & 5 ' ! ] [ 1 b e f g h i i j i i g f e c 2 4 : > = * % # @ + . ", +". . . . . . . . . . . . + @ $ & k ' ! ] } l 9 f m n o o p q q q p r s t f u 2 4 : > = & $ @ + . ", +". . . . . . . . . . . + @ # % * < v { [ l 0 w t o x y z A A B B B A C x s D u 2 / : ; * % # @ + ", +". . . . . . . . . . . + @ $ & k ' ~ 6 1 9 E n o F z G H I J K K K J L G y s D u 2 ( , = & $ @ + ", +". . . . . . . . . . . + # $ & 5 v { } 7 a m o F M G H N O P Q R R Q P O G y n f c 4 : ; * % # + ", +". . . . . . . . . . + + # % * - v ] | 8 f t o y M G I O S Q R T U U T V O G x m u 2 _ > * % # @ ", +". . . . . . . . . . + @ # % * - : / 2 b w n o y M G I N S Q W U X Y X Z V I z s f 2 / , = & $ @ ", +". . . . . . . . . . + @ # % * - : ( 2 b f t o F z G G I O Q W U Y ` ` ...S G o w c 4 : - & $ @ ", +". . . . . . . . . . + + # % * - , ( 3 +.e D n o x y M G J P R U Y @.@.#.Z $.G x D b d : - * $ @ ", +". . . . . . . . . . . + # $ & = > : 4 2 b f D n o x y M %.K Q U Y @.&.&.*.$.H x m b d : - * $ @ ", +". . . . . . . . . . . + @ $ % * ; : ( d 2 b f D t s x =.A J Q T Y ` &.&.*.$.H x D b d : - * $ @ ", +". . . . . . . . . . . + @ # % * = > : / 3 +.b f w t -.q ;.L P W X &.&.#.Z S G o D c 4 : - & $ @ ", +". . . . . . . . . . . + + @ $ & * - , _ / 3 +.u f g j p ;.L >.W *.#.#.*.V N M o f +./ , = & $ @ ", +". . . . . . . . . . . . + @ # % & = ; : _ 4 2 c 0 E j p C %.>.V Z *.*...$.H y t e 2 ( > * % # @ ", +". . . . . . . . . . . . + + @ $ % * - > : / } l 0 E j p ;.%.O V ....V $.N M o D b d : ; * % # + ", +". . . . . . . . . . . . . + @ # % * = > ! ^ } 7 0 g ,.p M H O $.V V S N G x t e 2 / , = & $ @ + ", +". . . . . . . . . . . . . + @ # $ & = ' ~ ^ | 7 a h o F M H N O S O I G F n f c d : ; * % # @ + ", +". . . . . . . . . . . . . + @ # $ & = ) ~ 6 1 9 w t o y M G I I I G M F s w b 3 ( , = * $ # + . ", +". . . . . . . . . . . . . + @ # % * = v { [ l e D n x y M G G G M y o n w u 2 / : ; * % # @ + . ", +". . . . . . . . . . . . . + @ # % * - ! ] } b f m o x y z M z y x o t f b 2 / : ; * & $ @ + . . ", +". . . . . . . . . . . . . + @ $ & * ' ~ 6 1 u w t o x F y F x o n D f c 2 / : > = & $ # @ + . . ", +". . . . . . . . . . . . . + # $ & = ) { [ l e D n o x x x o s m w u +.3 / : ; = * % # @ + . . . ", +". . . . . . . . . . . . + @ # % * - : / 2 b f m s o o o s t D f b 2 d ( : ; = & % # @ + . . . . ", +". . . . . . . . . . . . + @ $ & * ; : 4 2 u w t s o o s t w f c 2 4 _ , - * & $ # @ + . . . . . ", +". . . . . . . . . . . . + # $ * = , _ } c f D t s s s t D f c 2 / : > - * & $ # @ + . . . . . . ", +". . . . . . . . . . . + @ # % * - ! ^ | 8 '.m n s s n D f b 2 4 : > - * & $ # @ + . . . . . . . ", +". . . . . . . . . . . + @ $ & = ) { [ l 0 g j s o s t w e +.d _ , - * & $ # @ + . . . . . . . . ", +". . . . . . . . . . . + # $ * < v ] } 8 '.h ,.o o s t w u 2 / : ; * & $ # @ + . . . . . . . . . ", +". . . . . . . . . . + @ # % * ' ! 6 1 0 g j -.o o o t f b 3 ( , - * % # @ + . . . . . . . . . . ", +". . . . . . . . . . + @ # & * ) { [ 7 a h -.p x x o t f c 3 _ > = & $ @ + . . . . . . . . . . . ", +". . . . . . . . . . + @ $ & = ) ] } 8 '.i r x F x o m f c d _ > * & # @ + . . . . . . . . . . . ", +". . . . . . . . . . + @ $ & = , ] | 8 E j o F F x s m f +.4 : ; * % # @ + . . . . . . . . . . . ", +". . . . . . . . . . + @ $ & = , ( 3 b f t o x x o n D u 2 / : - * % # + . . . . . . . . . . . . ", +". . . . . . . . . . + @ $ & = ).).3 c f m n o o s m f b 3 ( , = & $ @ + . . . . . . . . . . . . ", +". . . . . . . . . . + @ $ & * ).).4 2 u f m t t m f u 2 4 : > * & $ @ + . . . . . . . . . . . . ", +". . . . . . . . . . + @ # % * ).).( 3 +.u f f f f u +.3 ( : - * % # @ + . . . . . . . . . . . . ", +". . . ).).. ).).. ).+ ).).$ * ).).: ).).+.).b ).).2 3 / ).).).& $ ).).. ).).. ).. ).).. . . . . ", +". . . ).).. ).).. ).).+ ).).% ).).).)./ d ).).2 ).).( ).).= ).).# ).).).).).. ).).. ).).. . . . ", +". . . ).).. ).).. ).).+ ).).$ ).).).> : _ ).).( ).).: ).).* ).).@ ).).).).).. ).).. ).).. . . . ", +". . . ).).. ).).. ).).. ).).# ).).).).; > ).)., ).).- ).).% ).).@ ).).).).).. ).).. ).).. . . . ", +". . . . ).).. ).. ).).. ).).@ ).).% ).).= ).).- ).).* & ).).).@ + . ).. ).. . ).).. ).).. . . . ", +". . . . . . . . . . . . . + + @ # $ $ % & & * * & & % $ # @ @ + . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . + + @ @ # # $ $ $ $ $ $ # # @ + + . . . . . . . . . . . . . . . . . "}; diff --git a/src/image.c b/src/image.c new file mode 100644 index 00000000..7f8c55c7 --- /dev/null +++ b/src/image.c @@ -0,0 +1,773 @@ +/* + * GQview image viewer + * (C)1999 John Ellis + * + * Author: John Ellis + * + */ + +#include "gqview.h" +#include "image.h" +#include "icons/img_unknown.xpm" + +static gchar *zoom_as_text(gint zoom, gfloat scale); +static void set_zoom_label(GtkWidget *label, gint zoom, gfloat scale); +static void set_info_label(GtkWidget *label, gint width, gint height, gint size, gint unknown); +static void set_window_title(ImageWindow *imd, gchar *text); + +static gint image_area_size_top_window(ImageWindow *imd, gint w, gint h); + +static void image_area_recalc_size(ImageWindow *imd, GtkAllocation *allocation); + +static void image_area_redraw(ImageWindow *imd); +static gint image_area_size_cb(GtkWidget *widget, GtkAllocation *allocation, gpointer data); +static gint image_area_update_cb(GtkWidget *widget, GdkEventConfigure *event, gpointer data); + +static void set_mouse_cursor (GdkWindow *window, gint icon); +static void image_area_mouse_moved(GtkWidget *widget, GdkEventButton *bevent, gpointer data); +static void image_area_mouse_pressed(GtkWidget *widget, GdkEventButton *bevent, gpointer data); +static void image_area_mouse_released(GtkWidget *widget, GdkEventButton *bevent, gpointer data); +static void image_area_mouse_drag(GtkWidget *widget, GdkDragContext *context, gpointer data); + +/* + *----------------------------------------------------------------------------- + * image status widget update routines (private) + *----------------------------------------------------------------------------- + */ + +static gchar *zoom_as_text(gint zoom, gfloat scale) +{ + gint l = 1; + gint r = 1; + gchar *approx = " "; + if (zoom > 1) l = zoom; + if (zoom < -1) r = -zoom; + if (zoom == 0 && scale != 0) + { + if (scale < 1) r = 1 / scale + 0.5; + approx = " ~"; + } + return g_strdup_printf("%d :%s%d", l, approx, r); +} + +static void set_zoom_label(GtkWidget *label, gint zoom, gfloat scale) +{ + gchar *buf; + buf = zoom_as_text(zoom, scale); + gtk_label_set(GTK_LABEL(label), buf); + g_free(buf); +} + +static void set_info_label(GtkWidget *label, gint width, gint height, gint size, gint unknown) +{ + gchar buf[64]; + if (unknown) + sprintf(buf, _("( ? x ? ) %d bytes"), size); + else + sprintf(buf, _("( %d x %d ) %d bytes"), width, height, size); + gtk_label_set(GTK_LABEL(label), buf); +} + +static void set_window_title(ImageWindow *imd, gchar *text) +{ + gchar *title = NULL; + if (!imd->top_window) return; + + if (imd->title) + { + title = g_strconcat(imd->title, imd->image_name, text, NULL); + } + else + { + title = g_strconcat(imd->image_name, text, NULL); + } + + gtk_window_set_title(GTK_WINDOW(imd->top_window), title); + g_free(title); +} + +/* + *----------------------------------------------------------------------------- + * fit window to image utility (private) + *----------------------------------------------------------------------------- + */ + +static gint image_area_size_top_window(ImageWindow *imd, gint w, gint h) +{ + if (!imd->top_window) return FALSE; + if (imd == full_screen_image) return FALSE; + if (imd == normal_image && !toolwindow) return FALSE; + if (!fit_window) return FALSE; + + if (imd == normal_image) + { + /* account for border frame */ + w += 4; + h += 4; + } + + if (limit_window_size) + { + gint sw = gdk_screen_width() * max_window_size / 100; + gint sh = gdk_screen_height() * max_window_size / 100; + + if (w > sw) w = sw; + if (h > sh) h = sh; + } + + /* to cheat on a prob a little, don't resize if within 1 either way... + ...dumb off by 1 errors! ;) */ + +/* if (w >= (imd->top_window)->allocation.width - 1 && + w <= (imd->top_window)->allocation.width + 1 && + h >= (imd->top_window)->allocation.height - 1 && + h <= (imd->top_window)->allocation.height + 1) + return FALSE; +*/ + if (debug) printf("auto sized to %d x %d\n", w, h); + + gdk_window_resize(imd->top_window->window, w, h); + gtk_widget_set_usize(imd->top_window, w, h); + + return TRUE; +} + +/* + *----------------------------------------------------------------------------- + * image widget zoom/recalc routines + *----------------------------------------------------------------------------- + */ + +void image_area_scroll(ImageWindow *imd, gint x, gint y) +{ + if (x != 0) + { + GtkAdjustment *h = gtk_viewport_get_hadjustment(GTK_VIEWPORT(imd->viewport)); + gfloat val = h->value + x; + if (val < h->lower) val = h->lower; + if (val > h->upper - h->page_size) val = h->upper - h->page_size; + gtk_adjustment_set_value(GTK_ADJUSTMENT(h), val); + } + + if (y != 0) + { + GtkAdjustment *v = gtk_viewport_get_vadjustment(GTK_VIEWPORT(imd->viewport)); + gfloat val = v->value + y; + if (val < v->lower) val = v->lower; + if (val > v->upper - v->page_size) val = v->upper - v->page_size; + gtk_adjustment_set_value(GTK_ADJUSTMENT(v), val); + } +} + +gint image_area_get_zoom(ImageWindow *imd) +{ + return imd->zoom; +} + +void image_area_adjust_zoom(ImageWindow *imd, gint increment) +{ + gint zoom = imd->zoom; + if (increment < 0) + { + while (increment < 0) + { + zoom--; + if (zoom == 0 || zoom == -1) zoom = -2; + increment++; + } + if (zoom < -8) zoom = -8; + } + else + { + while (increment > 0) + { + zoom++; + if (zoom == -1) zoom = 1; + increment--; + } + if (zoom > 3) zoom = 3; + } + if (zoom != imd->zoom) + image_area_set_zoom(imd, zoom); +} + +void image_area_set_zoom(ImageWindow *imd, gint zoom) +{ + if (zoom == imd->zoom && imd->width > 0 && imd->height > 0) return; + + imd->zoom = zoom; + image_area_recalc_size(imd, NULL); + + gtk_widget_set_usize (imd->table, imd->width, imd->height); + gtk_drawing_area_size(GTK_DRAWING_AREA(imd->image), imd->width, imd->height); +} + +static void image_area_recalc_size(ImageWindow *imd, GtkAllocation *allocation) +{ + gint w, h, ww, wh; + gfloat scale_factor = 1; + + w = imd->image_data->rgb_width; + h = imd->image_data->rgb_height; + if (allocation) + { + ww = allocation->width; + wh = allocation->height; + } + else + { + ww = (imd->eventbox)->allocation.width; + wh = (imd->eventbox)->allocation.height; + } + + if (imd == normal_image) + { + /* account for frame */ + ww -= 4; + wh -= 4; + } + + if (imd->zoom == 0) /* zoom to fit */ + { + if (imd == normal_image && imd->width == 0 && imd->height == 0 && + fit_window && toolwindow) + { + if (limit_window_size) + { + ww = (gdk_screen_width() * max_window_size / 100) - 4; + wh = (gdk_screen_height() * max_window_size / 100) - 4; + } + else + { + ww = w; + wh = h; + } + } + if (w > ww || h > wh) + { + if ((gfloat)ww / w > (gfloat)wh / h) + { + scale_factor = (gfloat) wh / h; + h = wh; + w = w * scale_factor + 0.5; + if (w > ww) w = ww; + } + else + { + scale_factor = (gfloat)ww / w; + w = ww; + h = h * scale_factor + 0.5; + if (h > wh) h = wh; + } + if (w < 1) w = 1; + if (h < 1) h = 1; + } + } + else if (imd->zoom > 0) /* zoom orig, in */ + { + scale_factor = imd->zoom; + w = w * scale_factor; + h = h * scale_factor; + } + else if (imd->zoom < -1) /* zoom out */ + { + scale_factor = (- imd->zoom); + w = w / scale_factor; + h = h / scale_factor; + } + + imd->width = w; + imd->height = h; + + if (debug) printf("recalc %d x %d @ %f\n", w, h, scale_factor); + + if (imd->zoom_label) + { + set_zoom_label(imd->zoom_label, imd->zoom, scale_factor); + } + +/* this is causing problems with resizing + if (imd->top_window && imd->show_title_zoom) + { + gchar *buf = zoom_as_text(imd->zoom, scale_factor); + gchar *zbuf = g_strconcat(" [ ", buf, "]", NULL); + g_free(buf); + set_window_title(imd, zbuf); + g_free(zbuf); + } +*/ + + if (image_area_size_top_window(imd, w, h)) + { + /* this is hacky */ + imd->artificial_size = TRUE; + gtk_grab_add (info_zoom); + while(gtk_events_pending()) gtk_main_iteration(); + gtk_grab_remove(info_zoom); + imd->artificial_size = FALSE; + } +} + +/* + *----------------------------------------------------------------------------- + * image widget set/get image information + *----------------------------------------------------------------------------- + */ + +void image_area_set_path(ImageWindow *imd, gchar *newpath) +{ + if (!imd->image_path || !newpath) return; + + g_free(imd->image_path); + imd->image_path = g_strdup(newpath); + imd->image_name = filename_from_path(imd->image_path); + + if (imd->top_window) + { + set_window_title(imd, NULL); + } +} + +gchar *image_area_get_path(ImageWindow *imd) +{ + return imd->image_path; +} + +gchar *image_area_get_name(ImageWindow *imd) +{ + return imd->image_name; +} + +void image_area_set_image(ImageWindow *imd, gchar *path, gint zoom) +{ + if (path && imd->image_path && !strcmp(path, imd->image_path)) return; + + g_free(imd->image_path); + if (path) + { + imd->image_path = g_strdup(path); + imd->image_name = filename_from_path(imd->image_path); + } + else + { + imd->image_path = NULL; + imd->image_name = " "; + zoom = 1; + } + + if (imd->image_data) gdk_imlib_destroy_image(imd->image_data); + if (path && isfile(path)) + { + imd->image_data = gdk_imlib_load_image(path); + if (!imd->image_data) + { + imd->image_data = gdk_imlib_create_image_from_xpm_data((gchar **)img_unknown_xpm); + imd->unknown = TRUE; + } + else + { + imd->unknown = FALSE; + } + imd->size = filesize(path); + } + else + { + if (path) + imd->image_data = gdk_imlib_create_image_from_xpm_data((gchar **)img_unknown_xpm); + else + imd->image_data = gdk_imlib_create_image_from_data((char *)logo, NULL, logo_width, logo_height); + imd->unknown = TRUE; + imd->size = 0; + } + + imd->width = imd->old_width = 0; + imd->height = imd->old_height = 0; + + if (imd->top_window) + { + set_window_title(imd, NULL); + } + if (imd->info_label) + { + set_info_label(imd->info_label, imd->image_data->rgb_width, imd->image_data->rgb_height, imd->size, imd->unknown); + } + + /* do info area updates here */ + + imd->new_img = TRUE; + image_area_set_zoom(imd, zoom); +} + +/* + *----------------------------------------------------------------------------- + * image widget redraw/callbacks (private) + *----------------------------------------------------------------------------- + */ + +static void image_area_redraw(ImageWindow *imd) +{ + GdkBitmap *mask = NULL; + + if (debug) printf("redrawn %d x %d\n", imd->width, imd->height); + + if (!imd->image_data) return; + + if (imd->width == imd->old_width && imd->height == imd->old_height) + { + if (debug) printf("redraw cancelled\n"); + return; + } + + if (imd->image_pixmap) gdk_imlib_free_pixmap(imd->image_pixmap); + imd->image_pixmap = NULL; + + gdk_imlib_render(imd->image_data, imd->width, imd->height); + imd->image_pixmap = gdk_imlib_move_image(imd->image_data); + mask = gdk_imlib_move_mask(imd->image_data); + + gdk_window_set_back_pixmap(imd->image->window, imd->image_pixmap, FALSE); + gdk_window_shape_combine_mask (imd->image->window, mask, 0, 0); + gdk_window_clear(imd->image->window); + gdk_flush(); + + imd->old_width = imd->width; + imd->old_height = imd->height; +} + +static gint image_area_size_cb(GtkWidget *widget, GtkAllocation *allocation, gpointer data) +{ + ImageWindow *imd = data; + gint old_w, old_h; + GtkAdjustment *h; + GtkAdjustment *v; + gfloat h_pos; + gfloat v_pos; + gfloat h_max; + gfloat v_max; + + if (imd->artificial_size) return FALSE; + + h = gtk_viewport_get_hadjustment(GTK_VIEWPORT(imd->viewport)); + v = gtk_viewport_get_vadjustment(GTK_VIEWPORT(imd->viewport)); + + h_pos = h->value; + h_max = allocation->width; + v_pos = v->value; + v_max = allocation->height; + + if (imd == normal_image) + { + h_max -= 4.0; + v_max -= 4.0; + } + + if (h_pos > h->upper - h_max) h_pos = h->upper - h_max; + if (v_pos > v->upper - v_max) v_pos = v->upper - v_max; + + if (imd->new_img) + { + imd->new_img = FALSE; + gtk_adjustment_clamp_page(h, 0.0, h_max); + gtk_adjustment_clamp_page(v, 0.0, v_max); + } + else + { + gtk_adjustment_clamp_page(h, h_pos, h_max); + gtk_adjustment_clamp_page(v, v_pos, v_max); + } + + gtk_adjustment_changed(h); + gtk_adjustment_changed(v); + + if (!imd->image_data || imd->zoom != 0) return FALSE; + + old_w = imd->width; + old_h = imd->height; + image_area_recalc_size(imd, allocation); + if (old_w != imd->width || old_h != imd->height) + { + gtk_widget_set_usize (imd->table, imd->width, imd->height); + gtk_drawing_area_size(GTK_DRAWING_AREA(imd->image), imd->width, imd->height); + } + + if (debug) printf("sized %d x %d (%d x %d)\n", allocation->width, allocation->height, imd->width, imd->height); + + return FALSE; +} + +static gint image_area_update_cb(GtkWidget *widget, GdkEventConfigure *event, gpointer data) +{ + ImageWindow *imd = data; + + if (imd->artificial_size) return FALSE; + + image_area_redraw(imd); + + return FALSE; +} + +/* + *----------------------------------------------------------------------------- + * image widget mouse routines (private) + *----------------------------------------------------------------------------- + */ + +static void set_mouse_cursor (GdkWindow *window, gint icon) +{ + GdkCursor *cursor; + + if (icon == -1) + { + cursor = NULL; + } + else + { + cursor = gdk_cursor_new (icon); + } + + gdk_window_set_cursor (window, cursor); + + if (cursor) gdk_cursor_destroy (cursor); +} + +static void image_area_mouse_moved(GtkWidget *widget, GdkEventButton *bevent, gpointer data) +{ + ImageWindow *imd = data; + GtkAdjustment* h; + GtkAdjustment* v; + gfloat x, y; + gfloat val; + + if (!imd->in_drag || !gdk_pointer_is_grabbed()) return; + + if (imd->drag_moved < 4) + { + imd->drag_moved++; + } + else + { + set_mouse_cursor (imd->eventbox->window, GDK_FLEUR); + } + + h = gtk_viewport_get_hadjustment(GTK_VIEWPORT(imd->viewport)); + v = gtk_viewport_get_vadjustment(GTK_VIEWPORT(imd->viewport)); + + x = imd->drag_last_x - bevent->x; + y = imd->drag_last_y - bevent->y; + + /* x */ + if (h->upper - h->page_size > 0) + { + val = (float)h->value + x; + if (val < 0 ) val = 0; + if (val > h->upper - h->page_size) val = h->upper - h->page_size; + h->value = val; + gtk_adjustment_set_value (GTK_ADJUSTMENT(h), val); + } + + /* y */ + if (v->upper - v->page_size > 0) + { + val = v->value + y; + if (val < 0 ) val = 0; + if (val > v->upper - v->page_size) val = v->upper - v->page_size; + v->value = val; + gtk_adjustment_set_value (GTK_ADJUSTMENT(v), val); + } + + gtk_adjustment_value_changed(h); + gtk_adjustment_value_changed(v); + + imd->drag_last_x = bevent->x; + imd->drag_last_y = bevent->y; +} + +static void image_area_mouse_pressed(GtkWidget *widget, GdkEventButton *bevent, gpointer data) +{ + ImageWindow *imd = data; + switch (bevent->button) + { + case 1: + imd->in_drag = TRUE; + imd->drag_last_x = bevent->x; + imd->drag_last_y = bevent->y; + imd->drag_moved = 0; + gdk_pointer_grab (imd->eventbox->window, FALSE, + GDK_POINTER_MOTION_MASK | + GDK_BUTTON_RELEASE_MASK, + NULL, NULL, bevent->time); + gtk_grab_add (imd->eventbox); + break; + case 2: + imd->drag_moved = 0; + break; + case 3: + if (imd->func_btn3) + imd->func_btn3(imd, bevent, imd->data_btn3); + break; + default: + break; + } + gtk_widget_grab_focus(imd->viewport); +} + +static void image_area_mouse_released(GtkWidget *widget, GdkEventButton *bevent, gpointer data) +{ + ImageWindow *imd = data; + if (gdk_pointer_is_grabbed() && GTK_WIDGET_HAS_GRAB (imd->eventbox)) + { + gtk_grab_remove (imd->eventbox); + gdk_pointer_ungrab (bevent->time); + set_mouse_cursor (imd->eventbox->window, -1); + } + + if (bevent->button == 1) + { + if (imd->drag_moved < 4 && imd->func_btn1) + imd->func_btn1(imd, bevent, imd->data_btn1); + } + + if (bevent->button == 2) + { + if (imd->drag_moved < 4 && imd->func_btn2) + imd->func_btn2(imd, bevent, imd->data_btn2); + } + + imd->in_drag = FALSE; +} + +static void image_area_mouse_drag(GtkWidget *widget, GdkDragContext *context, gpointer data) +{ + ImageWindow *imd = data; + imd->drag_moved = 4; +} + +/* + *----------------------------------------------------------------------------- + * image widget setup routines + *----------------------------------------------------------------------------- + */ + +void image_area_set_topwindow(ImageWindow *imd, GtkWidget *window, gchar *title, gint show_zoom) +{ + imd->top_window = window; + imd->show_title_zoom = show_zoom; + + g_free(imd->title); + if (title) + imd->title = g_strdup(title); + else + imd->title = NULL; +} + +void image_area_set_labels(ImageWindow *imd, GtkWidget *info, GtkWidget *zoom) +{ + imd->info_label = info; + imd->zoom_label = zoom; +} + +void image_area_set_button(ImageWindow *imd, gint button, + void (*func)(ImageWindow *, GdkEventButton *, gpointer), gpointer data) +{ + switch (button) + { + case 1: + imd->func_btn1 = func; + imd->data_btn1 = data; + break; + case 2: + imd->func_btn2 = func; + imd->data_btn2 = data; + break; + case 3: + imd->func_btn3 = func; + imd->data_btn3 = data; + break; + } +} + +ImageWindow *image_area_new(GtkWidget *top_window) +{ + GtkObject *h_adj; + GtkObject *v_adj; + ImageWindow *imd; + + imd = g_new0(ImageWindow, 1); + imd->zoom = 0; + + imd->top_window = top_window; + imd->title = g_strdup("GQview - "); + imd->show_title_zoom = FALSE; + imd->new_img = FALSE; + + imd->eventbox = gtk_event_box_new(); + + gtk_signal_connect(GTK_OBJECT(imd->eventbox),"motion_notify_event", + GTK_SIGNAL_FUNC(image_area_mouse_moved), imd); + gtk_signal_connect(GTK_OBJECT(imd->eventbox),"button_press_event", + GTK_SIGNAL_FUNC(image_area_mouse_pressed), imd); + gtk_signal_connect(GTK_OBJECT(imd->eventbox),"button_release_event", + GTK_SIGNAL_FUNC(image_area_mouse_released), imd); + gtk_widget_set_events(imd->eventbox, GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK | GDK_BUTTON_PRESS_MASK); + + /* viewer */ + h_adj = gtk_adjustment_new(0.0,0.0,0.0,1.0,1.0,1.0); + v_adj = gtk_adjustment_new(0.0,0.0,0.0,1.0,1.0,1.0); + + imd->viewport = gtk_viewport_new (GTK_ADJUSTMENT(h_adj), GTK_ADJUSTMENT(v_adj)); + gtk_container_add(GTK_CONTAINER(imd->eventbox), imd->viewport); + + /* table for resize */ + imd->table = gtk_table_new (1,1,TRUE); + gtk_container_add(GTK_CONTAINER (imd->viewport), imd->table); + + /* imagewindow */ + imd->image = gtk_drawing_area_new(); + gtk_table_attach(GTK_TABLE (imd->table),imd->image,0,1,0,1,GTK_EXPAND,GTK_EXPAND,0,0); + + gtk_signal_connect(GTK_OBJECT(imd->eventbox),"size_allocate",GTK_SIGNAL_FUNC(image_area_size_cb), imd); + gtk_signal_connect(GTK_OBJECT(imd->image),"configure_event",GTK_SIGNAL_FUNC(image_area_update_cb), imd); + + gtk_signal_connect(GTK_OBJECT(imd->viewport),"drag_begin", + GTK_SIGNAL_FUNC(image_area_mouse_drag), imd); + + return imd; +} + +void image_area_free(ImageWindow *imd) +{ + g_free(imd->image_path); + + if (imd->image_pixmap) gdk_imlib_free_pixmap(imd->image_pixmap); + if (imd->image_data) gdk_imlib_destroy_image(imd->image_data); + + g_free(imd); +} + +gint get_default_zoom(ImageWindow *imd) +{ + gint zoom; + + if (zoom_mode == ZOOM_RESET_ORIGINAL) + { + zoom = 1; + } + else if (zoom_mode == ZOOM_RESET_FIT_WINDOW) + { + zoom = 0; + } + else + { + if (imd) + { + zoom = image_area_get_zoom(imd); + } + else + { + zoom = 1; + } + } + + return zoom; +} + diff --git a/src/image.h b/src/image.h new file mode 100644 index 00000000..e620c825 --- /dev/null +++ b/src/image.h @@ -0,0 +1,40 @@ +/* + * GQview image viewer + * (C)1999 John Ellis + * + * Author: John Ellis + * + */ + +ImageWindow *image_area_new(GtkWidget *top_window); +void image_area_free(ImageWindow *imd); + +/* for attaching the top window for resizing */ +void image_area_set_topwindow(ImageWindow *imd, GtkWidget *window, gchar *title, gint show_zoom); + +/* attach labels to be updated */ +void image_area_set_labels(ImageWindow *imd, GtkWidget *info, GtkWidget *zoom); + +/* set the current image to a different path */ +void image_area_set_path(ImageWindow *imd, gchar *newpath); + +/* attach handler functions for mouse buttons (1-3) */ +void image_area_set_button(ImageWindow *imd, gint button, + void (*func)(ImageWindow *, GdkEventButton *, gpointer), gpointer data); + +/* get the current image's path, etc. */ +gchar *image_area_get_path(ImageWindow *imd); +gchar *image_area_get_name(ImageWindow *imd); + +/* load a new image, or NULL sets to logo */ +void image_area_set_image(ImageWindow *imd, gchar *path, gint zoom); + +/* image manipulation */ +void image_area_scroll(ImageWindow *imd, gint x, gint y); +gint image_area_get_zoom(ImageWindow *imd); +void image_area_adjust_zoom(ImageWindow *imd, gint increment); +void image_area_set_zoom(ImageWindow *imd, gint zoom); + +/* get the default zoom for an image */ +gint get_default_zoom(ImageWindow *imd); + diff --git a/src/img-main.c b/src/img-main.c new file mode 100644 index 00000000..cbf4921d --- /dev/null +++ b/src/img-main.c @@ -0,0 +1,361 @@ +/* + * GQview image viewer + * (C)1999 John Ellis + * + * Author: John Ellis + * + */ + +#include "gqview.h" +#include "image.h" +#include /* for keyboard values */ + +#define BLACK_BACKGROUND 1 + +/* + *----------------------------------------------------------------------------- + * full screen keyboard + *----------------------------------------------------------------------------- + */ + +static gint full_screen_key_press_cb(GtkWidget *widget, GdkEventKey *event, gpointer data) +{ + ImageWindow *imd = data; + gint stop_signal = FALSE; + gint x = 0; + gint y = 0; + + switch (event->keyval) + { + case GDK_Left: + x -= 1; + stop_signal = TRUE; + break; + case GDK_Right: + x += 1; + stop_signal = TRUE; + break; + case GDK_Up: + y -= 1; + stop_signal = TRUE; + break; + case GDK_Down: + y += 1; + stop_signal = TRUE; + break; + case '+': case '=': + image_area_adjust_zoom(imd, 1); + break; + case '-': + image_area_adjust_zoom(imd, -1); + break; + case 'x': + image_area_set_zoom(imd, 0); + break; + case 'z': + image_area_set_zoom(imd, 1); + break; + case GDK_Page_Up: + case GDK_BackSpace: + file_prev_image(); + stop_signal = TRUE; + break; + case GDK_Page_Down: + case GDK_space: + file_next_image(); + stop_signal = TRUE; + break; + case GDK_Home: + file_first_image(); + stop_signal = TRUE; + break; + case GDK_End: + file_last_image(); + stop_signal = TRUE; + break; + case GDK_Delete: + full_screen_stop(); + file_util_delete(image_area_get_path(imd), NULL); + stop_signal = TRUE; + break; + case GDK_Escape: + full_screen_stop(); + stop_signal = TRUE; + break; + case 'Q': case 'q': + exit_gqview(); + return FALSE; + break; + case 'S': case 's': + slideshow_toggle(); + break; + } + + if (event->state & GDK_CONTROL_MASK) + { + gint n = -1; + switch (event->keyval) + { + case '1': + n = 0; + break; + case '2': + n = 1; + break; + case '3': + n = 2; + break; + case '4': + n = 3; + break; + case '5': + n = 4; + break; + case '6': + n = 5; + break; + case '7': + n = 6; + break; + case '8': + n = 7; + break; + case 'F': case 'f': + full_screen_stop(); + break; + case 'C': case 'c': + full_screen_stop(); + file_util_copy(image_area_get_path(imd), NULL, current_path); + break; + case 'M': case 'm': + full_screen_stop(); + file_util_move(image_area_get_path(imd), NULL, current_path); + break; + case 'R': case 'r': + full_screen_stop(); + file_util_rename(image_area_get_path(imd), NULL); + break; + case 'D': case 'd': + full_screen_stop(); + file_util_delete(image_area_get_path(imd), NULL); + break; + } + if (n != -1) + { + full_screen_stop(); + start_editor_from_file(n, image_area_get_path(imd)); + } + } + + if (event->state & GDK_SHIFT_MASK) + { + x *= 3; + y *= 3; + } + + if (x != 0 || y!= 0) + { + keyboard_scroll_calc(&x, &y, event); + image_area_scroll(imd, x, y); + } + + return stop_signal; +} + +/* + *---------------------------------------------------------------------------- + * mouse button callbacks + *---------------------------------------------------------------------------- + */ + +static void button1_cb(ImageWindow *imd, GdkEventButton *bevent, gpointer data) +{ + file_next_image(); +} + +static void button2_cb(ImageWindow *imd, GdkEventButton *bevent, gpointer data) +{ + file_prev_image(); +} + +static void button3_cb(ImageWindow *imd, GdkEventButton *bevent, gpointer data) +{ + if (main_image == normal_image) + { + gtk_menu_popup (GTK_MENU(menu_image_popup), NULL, NULL, NULL, NULL, + bevent->button, bevent->time); + } + else + { + gtk_menu_popup (GTK_MENU(menu_window_full), NULL, NULL, NULL, NULL, + bevent->button, bevent->time); + } +} + +/* + *---------------------------------------------------------------------------- + * full screen functions + *---------------------------------------------------------------------------- + */ + +static gint full_screen_delete_cb(GtkWidget *widget, GdkEventAny *event, gpointer data) +{ + full_screen_stop(); + return TRUE; +} + +static gint full_screen_destroy_cb(GtkWidget *widget, GdkEventAny *event, gpointer data) +{ + image_area_free(full_screen_image); + full_screen_image = NULL; + + return FALSE; +} + +void full_screen_start() +{ + GtkWidget *window; + gint w; + gint h; + + if (full_screen_window) return; + + w = gdk_screen_width(); + h = gdk_screen_height(); + + window = gtk_window_new(GTK_WINDOW_POPUP); + gtk_container_border_width(GTK_CONTAINER(window), 0); + gtk_signal_connect(GTK_OBJECT(window), "delete_event", (GtkSignalFunc)full_screen_delete_cb, NULL); + gtk_signal_connect(GTK_OBJECT(window), "destroy_event", (GtkSignalFunc)full_screen_destroy_cb, NULL); + + gtk_window_set_title(GTK_WINDOW(window), _("GQview full screen")); + gtk_widget_set_usize(window, w, h); + + full_screen_image = image_area_new(NULL); + + gtk_viewport_set_shadow_type (GTK_VIEWPORT(full_screen_image->viewport), GTK_SHADOW_NONE); + gtk_container_add(GTK_CONTAINER(window), full_screen_image->eventbox); + + /* set background to black */ + if (BLACK_BACKGROUND) + { + GtkStyle *style; + style = gtk_style_copy(gtk_widget_get_style(full_screen_image->eventbox)); + gtk_style_ref(style); + style->bg[GTK_STATE_NORMAL] = style->black; + gtk_widget_set_style(full_screen_image->viewport, style); + gtk_style_unref(style); + } + + gtk_widget_show_all(full_screen_image->eventbox); + + gtk_signal_connect(GTK_OBJECT(window), "key_press_event", GTK_SIGNAL_FUNC(full_screen_key_press_cb), full_screen_image); + + image_area_set_image(full_screen_image, image_get_path(), image_area_get_zoom(normal_image)); + +/* + if (!GTK_WIDGET_REALIZED(window)) gtk_widget_realize(window); + gdk_window_set_override_redirect(window->window, TRUE); +*/ + gtk_widget_show(window); + gdk_keyboard_grab(window->window, TRUE, GDK_CURRENT_TIME); + + /* hide normal window */ + gtk_widget_hide(mainwindow); + image_area_set_image(normal_image, NULL, image_area_get_zoom(normal_image)); + + full_screen_window = window; + + image_area_set_button(full_screen_image, 1, button1_cb, NULL); + image_area_set_button(full_screen_image, 2, button2_cb, NULL); + image_area_set_button(full_screen_image, 3, button3_cb, NULL); + + main_image = full_screen_image; +} + +void full_screen_stop() +{ + if (!full_screen_window) return; + + gdk_keyboard_ungrab (GDK_CURRENT_TIME); + + image_area_set_image(normal_image, image_get_path(), image_area_get_zoom(full_screen_image)); + main_image = normal_image; + + gtk_widget_destroy(full_screen_window); + full_screen_window = NULL; + + gtk_widget_show(mainwindow); +} + +void full_screen_toggle() +{ + if (full_screen_window) + { + full_screen_stop(); + } + else + { + full_screen_start(); + } +} + +/* + *---------------------------------------------------------------------------- + * main image manipulation + *---------------------------------------------------------------------------- + */ + +void image_scroll(gint x, gint y) +{ + image_area_scroll(main_image, x, y); +} + +void image_adjust_zoom(gint increment) +{ + image_area_adjust_zoom(main_image, increment); +} + +void image_set_zoom(gint zoom) +{ + image_area_set_zoom(main_image, zoom); +} + +void image_set_path(gchar *path) +{ + image_area_set_path(main_image, path); +} + +gchar *image_get_path() +{ + return image_area_get_path(main_image); +} + +gchar *image_get_name() +{ + return image_area_get_name(main_image); +} + +void image_change_to(gchar *path) +{ + image_area_set_image(main_image, path, get_default_zoom(main_image)); +} + +void image_set_labels(GtkWidget *info, GtkWidget *zoom) +{ + image_area_set_labels(normal_image, info, zoom); +} + +GtkWidget *image_create() +{ + normal_image = image_area_new(mainwindow); + + main_image = normal_image; + + image_area_set_button(main_image, 1, button1_cb, NULL); + image_area_set_button(main_image, 2, button2_cb, NULL); + image_area_set_button(main_image, 3, button3_cb, NULL); + + return main_image->eventbox; +} + diff --git a/src/img-view.c b/src/img-view.c new file mode 100644 index 00000000..0c9b8f80 --- /dev/null +++ b/src/img-view.c @@ -0,0 +1,300 @@ +/* + * GQview image viewer + * (C)1999 John Ellis + * + * Author: John Ellis + * + */ + +#include "gqview.h" +#include "image.h" +#include /* for keyboard values */ + +/* + *----------------------------------------------------------------------------- + * view window keyboard + *----------------------------------------------------------------------------- + */ + +static gint view_window_key_press_cb(GtkWidget *widget, GdkEventKey *event, gpointer data) +{ + ImageWindow *imd = data; + gint stop_signal = FALSE; + gint x = 0; + gint y = 0; + + switch (event->keyval) + { + case GDK_Left: + x -= 1; + stop_signal = TRUE; + break; + case GDK_Right: + x += 1; + stop_signal = TRUE; + break; + case GDK_Up: + y -= 1; + stop_signal = TRUE; + break; + case GDK_Down: + y += 1; + stop_signal = TRUE; + break; + case '+': case '=': + image_area_adjust_zoom(imd, 1); + break; + case '-': + image_area_adjust_zoom(imd, -1); + break; + case 'x': + image_area_set_zoom(imd, 0); + break; + case 'z': + image_area_set_zoom(imd, 1); + break; + case GDK_Delete: + file_util_delete(image_area_get_path(imd), NULL); + stop_signal = TRUE; + break; + case GDK_Escape: + gtk_widget_destroy(imd->top_window); + stop_signal = TRUE; + break; + } + + if (event->state & GDK_CONTROL_MASK) + { + gint n = -1; + switch (event->keyval) + { + case '1': + n = 0; + break; + case '2': + n = 1; + break; + case '3': + n = 2; + break; + case '4': + n = 3; + break; + case '5': + n = 4; + break; + case '6': + n = 5; + break; + case '7': + n = 6; + break; + case '8': + n = 7; + break; + } + if (n != -1) + { + start_editor_from_file(n, image_area_get_path(imd)); + } + } + + if (event->state & GDK_SHIFT_MASK) + { + x *= 3; + y *= 3; + } + + if (x != 0 || y!= 0) + { + keyboard_scroll_calc(&x, &y, event); + image_area_scroll(imd, x, y); + } + + return stop_signal; +} + +/* + *----------------------------------------------------------------------------- + * view window main routines + *----------------------------------------------------------------------------- + */ + +static void button3_cb(ImageWindow *imd, GdkEventButton *bevent, gpointer data) +{ + gtk_object_set_data(GTK_OBJECT(menu_window_view), "view_active", imd); + gtk_menu_popup (GTK_MENU(menu_window_view), NULL, NULL, NULL, NULL, + bevent->button, bevent->time); +} + +static gint view_window_delete_cb(GtkWidget *w, GdkEventAny *event, gpointer data) +{ + gtk_widget_destroy(w); + return TRUE; +} + +static gint view_window_destroy_cb(GtkWidget *w, GdkEventAny *event, gpointer data) +{ + ImageWindow *imd = data; + image_area_free(imd); + return FALSE; +} + +void view_window_new(gchar *path) +{ + GtkWidget *window; + ImageWindow *imd; + GtkAllocation req_size; + gint w, h; + if (!path) return; + + window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_window_set_policy(GTK_WINDOW(window), TRUE, TRUE, FALSE); + gtk_window_set_title (GTK_WINDOW (window), "GQview"); + gtk_window_set_wmclass(GTK_WINDOW (window), "view", "GQview"); + gtk_container_border_width (GTK_CONTAINER (window), 0); + + imd = image_area_new(NULL); + image_area_set_topwindow(imd, window, NULL, TRUE); + gtk_container_add(GTK_CONTAINER(window), imd->eventbox); + gtk_viewport_set_shadow_type (GTK_VIEWPORT(imd->viewport), GTK_SHADOW_NONE); + gtk_container_border_width (GTK_CONTAINER (imd->viewport), 0); + gtk_widget_show_all(imd->eventbox); + + image_dnd_init(imd); + + image_area_set_button(imd, 3, button3_cb, NULL); + + gtk_signal_connect(GTK_OBJECT(window), "delete_event", (GtkSignalFunc) view_window_delete_cb, NULL); + gtk_signal_connect(GTK_OBJECT(window), "destroy_event", (GtkSignalFunc) view_window_destroy_cb, imd); + gtk_signal_connect(GTK_OBJECT(window), "key_press_event", GTK_SIGNAL_FUNC(view_window_key_press_cb), imd); + + image_area_set_image(imd, path, get_default_zoom(NULL)); + + w = imd->width; + h = imd->height; + if (limit_window_size) + { + gint mw = gdk_screen_width() * max_window_size / 100; + gint mh = gdk_screen_height() * max_window_size / 100; + + if (w > mw) w = mw; + if (h > mh) h = mh; + } + + gtk_window_set_default_size (GTK_WINDOW(window), w, h); + req_size.x = req_size.y = 0; + req_size.width = w; + req_size.height = h; + gtk_widget_size_allocate(GTK_WIDGET(window), &req_size); + + gtk_widget_set_usize(imd->eventbox, w, h); + + gtk_widget_show(window); +} + +/* + *----------------------------------------------------------------------------- + * view window menu routines and callbacks + *----------------------------------------------------------------------------- + */ + +static ImageWindow *view_window_get_active() +{ + return gtk_object_get_data(GTK_OBJECT(menu_window_view), "view_active"); +} + +void view_window_active_edit(gint n) +{ + ImageWindow *imd = view_window_get_active(); + if (!imd) return; + start_editor_from_file(n, image_area_get_path(imd)); +} + +static void view_zoom_in_cb(GtkWidget *widget, gpointer data) +{ + ImageWindow *imd = view_window_get_active(); + if (!imd) return; + image_area_adjust_zoom(imd, 1); +} + +static void view_zoom_out_cb(GtkWidget *widget, gpointer data) +{ + ImageWindow *imd = view_window_get_active(); + if (!imd) return; + image_area_adjust_zoom(imd, -1); +} + +static void view_zoom_1_1_cb(GtkWidget *widget, gpointer data) +{ + ImageWindow *imd = view_window_get_active(); + if (!imd) return; + image_area_set_zoom(imd, 1); +} + +static void view_zoom_fit_cb(GtkWidget *widget, gpointer data) +{ + ImageWindow *imd = view_window_get_active(); + if (!imd) return; + image_area_set_zoom(imd, 0); +} + +static void view_copy_cb(GtkWidget *widget, gpointer data) +{ + ImageWindow *imd = view_window_get_active(); + if (!imd) return; + file_util_copy(image_area_get_path(imd), NULL, current_path); +} + +static void view_move_cb(GtkWidget *widget, gpointer data) +{ + ImageWindow *imd = view_window_get_active(); + if (!imd) return; + file_util_move(image_area_get_path(imd), NULL, current_path); +} + +static void view_rename_cb(GtkWidget *widget, gpointer data) +{ + ImageWindow *imd = view_window_get_active(); + if (!imd) return; + file_util_rename(image_area_get_path(imd), NULL); +} + +static void view_delete_cb(GtkWidget *widget, gpointer data) +{ + ImageWindow *imd = view_window_get_active(); + if (!imd) return; + file_util_delete(image_area_get_path(imd), NULL); +} + +static void view_close_cb(GtkWidget *widget, gpointer data) +{ + ImageWindow *imd = view_window_get_active(); + if (!imd) return; + gtk_widget_destroy(imd->top_window); +} + +void create_menu_view_popup() +{ + menu_window_view = gtk_menu_new(); + add_menu_popup_item(menu_window_view, _("Zoom in"), view_zoom_in_cb, NULL); + add_menu_popup_item(menu_window_view, _("Zoom out"), view_zoom_out_cb, NULL); + add_menu_popup_item(menu_window_view, _("Zoom 1:1"), view_zoom_1_1_cb, NULL); + add_menu_popup_item(menu_window_view, _("Fit image to window"), view_zoom_fit_cb, NULL); + add_menu_divider(menu_window_view); + + menu_window_view_edit = gtk_menu_item_new_with_label(_("Edit")); + gtk_menu_append(GTK_MENU(menu_window_view), menu_window_view_edit); + gtk_widget_show(menu_window_view_edit); + + add_menu_divider(menu_window_view); + add_menu_popup_item(menu_window_view, _("Copy..."), view_copy_cb, NULL); + add_menu_popup_item(menu_window_view, _("Move..."), view_move_cb, NULL); + add_menu_popup_item(menu_window_view, _("Rename..."), view_rename_cb, NULL); + add_menu_popup_item(menu_window_view, _("Delete..."), view_delete_cb, NULL); + + add_menu_divider(menu_window_view); + add_menu_popup_item(menu_window_view, _("Close window"), view_close_cb, NULL); +} + + diff --git a/src/intl.h b/src/intl.h new file mode 100644 index 00000000..0f172d7c --- /dev/null +++ b/src/intl.h @@ -0,0 +1,22 @@ +#ifndef __INTL_H__ +#define __INTL_H__ + +#ifdef ENABLE_NLS +# include +# define _(String) dgettext(PACKAGE,String) +# ifdef gettext_noop +# define N_(String) gettext_noop(String) +# else +# define N_(String) (String) +# endif /* gettext_noop */ +#else +# define _(String) (String) +# define N_(String) (String) +# define textdomain(String) (String) +# define gettext(String) (String) +# define dgettext(Domain,String) (String) +# define dcgettext(Domain,String,Type) (String) +# define bindtextdomain(Domain,Directory) (Domain) +#endif /* ENABLE_NLS */ + +#endif /* __INTL_H__ */ diff --git a/src/logo.h b/src/logo.h new file mode 100644 index 00000000..fc310f60 --- /dev/null +++ b/src/logo.h @@ -0,0 +1,3507 @@ +/* Imlib raw rgb data file created by convertrgb */ + +const int logo_width = 200; +const int logo_height = 70; +const GdkImlibColor logo_alpha = { -1, -1, -1, 0 }; +const unsigned char logo[] = { +0x13, 0x16, 0x42, 0x23, 0x28, 0x75, 0x19, 0x1d, 0x53, 0x12, 0x15, 0x3a, +0x12, 0x16, 0x3b, 0x13, 0x17, 0x3c, 0x15, 0x17, 0x3d, 0x15, 0x18, 0x3d, +0x16, 0x19, 0x3e, 0x17, 0x1a, 0x3f, 0x18, 0x1b, 0x3f, 0x17, 0x1a, 0x40, +0x16, 0x1a, 0x41, 0x15, 0x18, 0x42, 0x15, 0x18, 0x42, 0x14, 0x17, 0x43, +0x13, 0x16, 0x44, 0x12, 0x16, 0x45, 0x13, 0x16, 0x46, 0x15, 0x18, 0x47, +0x16, 0x1a, 0x47, 0x18, 0x1c, 0x48, 0x1a, 0x1e, 0x4a, 0x1d, 0x20, 0x4a, +0x1a, 0x1e, 0x4b, 0x17, 0x1b, 0x4d, 0x15, 0x18, 0x4e, 0x12, 0x16, 0x4e, +0x10, 0x15, 0x4f, 0x12, 0x15, 0x51, 0x14, 0x17, 0x52, 0x16, 0x1a, 0x53, +0x1a, 0x1e, 0x54, 0x1d, 0x22, 0x55, 0x1e, 0x22, 0x57, 0x1f, 0x24, 0x58, +0x20, 0x25, 0x59, 0x21, 0x26, 0x5a, 0x22, 0x27, 0x5c, 0x22, 0x27, 0x5d, +0x24, 0x29, 0x5e, 0x21, 0x26, 0x5f, 0x1e, 0x23, 0x61, 0x1c, 0x21, 0x62, +0x1a, 0x1f, 0x64, 0x1a, 0x1f, 0x64, 0x18, 0x1d, 0x66, 0x20, 0x26, 0x67, +0x28, 0x2f, 0x5f, 0x1b, 0x1f, 0x3b, 0x2b, 0x31, 0x6b, 0x23, 0x29, 0x6c, +0x1f, 0x24, 0x6d, 0x1b, 0x21, 0x6e, 0x20, 0x26, 0x6f, 0x2f, 0x35, 0x6f, +0x1e, 0x22, 0x41, 0x22, 0x27, 0x4d, 0x27, 0x2d, 0x58, 0x2b, 0x32, 0x62, +0x2d, 0x35, 0x73, 0x25, 0x2c, 0x74, 0x23, 0x29, 0x74, 0x25, 0x2c, 0x74, +0x22, 0x28, 0x74, 0x1d, 0x23, 0x75, 0x21, 0x27, 0x75, 0x2a, 0x32, 0x75, +0x27, 0x2d, 0x74, 0x23, 0x29, 0x74, 0x22, 0x27, 0x74, 0x20, 0x26, 0x74, +0x1e, 0x23, 0x73, 0x1f, 0x25, 0x73, 0x2c, 0x33, 0x72, 0x25, 0x2b, 0x55, +0x26, 0x2d, 0x71, 0x22, 0x27, 0x6f, 0x27, 0x2f, 0x6f, 0x2b, 0x32, 0x6d, +0x24, 0x2a, 0x6d, 0x20, 0x25, 0x6c, 0x22, 0x27, 0x6b, 0x24, 0x2a, 0x6a, +0x26, 0x2d, 0x69, 0x28, 0x2f, 0x67, 0x28, 0x2e, 0x67, 0x25, 0x2a, 0x65, +0x22, 0x27, 0x64, 0x21, 0x26, 0x64, 0x21, 0x26, 0x62, 0x20, 0x25, 0x62, +0x1f, 0x24, 0x60, 0x1e, 0x22, 0x5f, 0x1d, 0x21, 0x5e, 0x1d, 0x22, 0x5d, +0x1e, 0x24, 0x5c, 0x1f, 0x25, 0x5a, 0x21, 0x26, 0x5a, 0x22, 0x27, 0x58, +0x24, 0x29, 0x57, 0x20, 0x25, 0x4a, 0x20, 0x25, 0x4b, 0x21, 0x26, 0x54, +0x1e, 0x22, 0x53, 0x1b, 0x1f, 0x52, 0x19, 0x1d, 0x50, 0x19, 0x1d, 0x50, +0x1a, 0x1e, 0x4f, 0x1a, 0x1e, 0x4d, 0x1a, 0x1f, 0x4d, 0x1c, 0x1f, 0x4b, +0x1a, 0x1e, 0x4a, 0x18, 0x1c, 0x4a, 0x16, 0x1a, 0x48, 0x15, 0x18, 0x47, +0x13, 0x16, 0x47, 0x12, 0x15, 0x46, 0x12, 0x15, 0x45, 0x12, 0x15, 0x45, +0x12, 0x15, 0x43, 0x12, 0x15, 0x42, 0x12, 0x15, 0x41, 0x11, 0x15, 0x41, +0x11, 0x15, 0x3f, 0x11, 0x15, 0x3f, 0x11, 0x15, 0x3f, 0x11, 0x15, 0x3d, +0x11, 0x15, 0x3d, 0x11, 0x15, 0x3d, 0x11, 0x14, 0x3b, 0x11, 0x14, 0x3b, +0x11, 0x14, 0x3a, 0x10, 0x13, 0x39, 0x10, 0x13, 0x39, 0x10, 0x12, 0x38, +0x10, 0x12, 0x37, 0x0f, 0x12, 0x37, 0x0f, 0x12, 0x36, 0x0f, 0x12, 0x35, +0x0f, 0x12, 0x35, 0x0f, 0x11, 0x35, 0x0e, 0x10, 0x34, 0x0e, 0x10, 0x33, +0x0e, 0x10, 0x33, 0x0e, 0x10, 0x32, 0x0d, 0x0f, 0x32, 0x0d, 0x0f, 0x32, +0x0d, 0x0f, 0x31, 0x0d, 0x0f, 0x30, 0x0d, 0x0f, 0x2f, 0x0d, 0x0f, 0x2f, +0x0c, 0x0e, 0x2f, 0x0b, 0x0d, 0x2e, 0x0b, 0x0d, 0x2d, 0x0b, 0x0d, 0x2d, +0x0a, 0x0d, 0x2d, 0x0a, 0x0d, 0x2d, 0x0a, 0x0d, 0x2c, 0x0a, 0x0d, 0x2c, +0x0a, 0x0d, 0x2c, 0x0a, 0x0c, 0x2b, 0x0a, 0x0c, 0x2a, 0x0a, 0x0c, 0x2a, +0x0a, 0x0c, 0x2a, 0x0a, 0x0b, 0x2a, 0x0a, 0x0b, 0x29, 0x0a, 0x0b, 0x29, +0x0a, 0x0b, 0x28, 0x0a, 0x0b, 0x28, 0x0a, 0x0b, 0x27, 0x0a, 0x0b, 0x27, +0x0a, 0x0b, 0x27, 0x09, 0x0b, 0x26, 0x09, 0x0b, 0x26, 0x0a, 0x0b, 0x26, +0x09, 0x0a, 0x26, 0x0a, 0x0b, 0x26, 0x09, 0x0a, 0x25, 0x09, 0x0a, 0x25, +0x09, 0x0a, 0x24, 0x09, 0x0a, 0x24, 0x09, 0x0a, 0x24, 0x09, 0x0a, 0x24, +0x09, 0x0a, 0x23, 0x09, 0x0a, 0x23, 0x09, 0x0a, 0x22, 0x09, 0x0a, 0x22, +0x09, 0x0a, 0x22, 0x09, 0x0a, 0x22, 0x08, 0x0a, 0x22, 0x08, 0x0a, 0x22, +0x08, 0x0a, 0x21, 0x08, 0x0a, 0x21, 0x07, 0x09, 0x20, 0x07, 0x09, 0x20, +0x07, 0x09, 0x20, 0x07, 0x09, 0x20, 0x07, 0x09, 0x1f, 0x02, 0x02, 0x08, +0x2c, 0x34, 0x9d, 0x3d, 0x4a, 0xd5, 0x3b, 0x45, 0xc6, 0x37, 0x41, 0xba, +0x3a, 0x42, 0xbb, 0x3c, 0x46, 0xbc, 0x3d, 0x47, 0xbe, 0x3e, 0x4a, 0xc1, +0x43, 0x4c, 0xc2, 0x47, 0x51, 0xc4, 0x4a, 0x55, 0xc7, 0x4e, 0x58, 0xca, +0x4e, 0x59, 0xcc, 0x4c, 0x58, 0xcf, 0x49, 0x54, 0xd0, 0x47, 0x51, 0xd4, +0x43, 0x4e, 0xd5, 0x41, 0x4c, 0xd9, 0x3e, 0x49, 0xdc, 0x3d, 0x47, 0xde, +0x41, 0x4e, 0xe1, 0x47, 0x51, 0xe5, 0x4a, 0x58, 0xe7, 0x51, 0x60, 0xeb, +0x59, 0x66, 0xef, 0x59, 0x67, 0xf2, 0x51, 0x5d, 0xf3, 0x47, 0x54, 0xf8, +0x3e, 0x4c, 0xfc, 0x38, 0x46, 0xfe, 0x38, 0x43, 0xff, 0x3e, 0x4a, 0xff, +0x47, 0x53, 0xff, 0x51, 0x5e, 0xff, 0x5e, 0x6c, 0xff, 0x63, 0x70, 0xff, +0x66, 0x75, 0xff, 0x6a, 0x78, 0xff, 0x6c, 0x7d, 0xff, 0x6f, 0x81, 0xff, +0x70, 0x82, 0xff, 0x73, 0x83, 0xff, 0x6a, 0x7a, 0xff, 0x60, 0x70, 0xff, +0x59, 0x67, 0xff, 0x55, 0x65, 0xff, 0x53, 0x61, 0xff, 0x55, 0x66, 0xff, +0x75, 0x87, 0xff, 0x4a, 0x54, 0xa0, 0x73, 0x86, 0xff, 0x7e, 0x93, 0xff, +0x6b, 0x7d, 0xff, 0x5e, 0x70, 0xff, 0x5d, 0x6c, 0xff, 0x82, 0x95, 0xff, +0x4f, 0x5d, 0xac, 0x66, 0x77, 0xdc, 0x78, 0x89, 0xff, 0x86, 0x98, 0xff, +0x98, 0xab, 0xff, 0x7d, 0x92, 0xff, 0x70, 0x83, 0xff, 0x7a, 0x8e, 0xff, +0x70, 0x83, 0xff, 0x60, 0x70, 0xff, 0x6a, 0x7e, 0xff, 0x89, 0xa0, 0xff, +0x7e, 0x94, 0xff, 0x70, 0x86, 0xff, 0x6b, 0x7e, 0xff, 0x66, 0x7a, 0xff, +0x60, 0x72, 0xff, 0x6a, 0x7e, 0xff, 0x8a, 0x9e, 0xff, 0x8a, 0xa0, 0xff, +0x72, 0x86, 0xff, 0x73, 0x87, 0xff, 0x8a, 0xa0, 0xff, 0x82, 0x98, 0xff, +0x6f, 0x82, 0xff, 0x6b, 0x7d, 0xff, 0x72, 0x86, 0xff, 0x7c, 0x8e, 0xff, +0x81, 0x94, 0xff, 0x89, 0x9c, 0xff, 0x7c, 0x8f, 0xff, 0x72, 0x83, 0xff, +0x6b, 0x7d, 0xff, 0x6b, 0x7c, 0xff, 0x6b, 0x7a, 0xff, 0x65, 0x77, 0xff, +0x61, 0x72, 0xff, 0x5e, 0x6f, 0xff, 0x60, 0x70, 0xff, 0x63, 0x73, 0xff, +0x67, 0x78, 0xff, 0x6c, 0x7c, 0xff, 0x72, 0x81, 0xff, 0x72, 0x7e, 0xff, +0x65, 0x70, 0xe1, 0x67, 0x73, 0xed, 0x6b, 0x7a, 0xff, 0x60, 0x6c, 0xff, +0x58, 0x65, 0xff, 0x51, 0x5e, 0xff, 0x54, 0x61, 0xfe, 0x55, 0x63, 0xfc, +0x55, 0x65, 0xf8, 0x59, 0x66, 0xf5, 0x5a, 0x67, 0xf2, 0x53, 0x5e, 0xef, +0x4a, 0x58, 0xeb, 0x46, 0x51, 0xe7, 0x41, 0x4c, 0xe5, 0x3d, 0x47, 0xe1, +0x3a, 0x43, 0xde, 0x3a, 0x43, 0xdb, 0x3a, 0x43, 0xd9, 0x3a, 0x46, 0xd8, +0x3a, 0x43, 0xd4, 0x3a, 0x43, 0xd0, 0x3a, 0x46, 0xce, 0x3a, 0x46, 0xcc, +0x3a, 0x43, 0xc9, 0x38, 0x43, 0xc7, 0x38, 0x43, 0xc4, 0x38, 0x42, 0xc2, +0x38, 0x41, 0xbe, 0x38, 0x41, 0xbd, 0x38, 0x41, 0xbc, 0x38, 0x41, 0xbb, +0x37, 0x3e, 0xb7, 0x37, 0x3e, 0xb5, 0x35, 0x3d, 0xb3, 0x33, 0x3c, 0xb0, +0x33, 0x3c, 0xaf, 0x31, 0x3a, 0xac, 0x31, 0x3a, 0xab, 0x30, 0x38, 0xaa, +0x2f, 0x37, 0xa6, 0x2f, 0x35, 0xa5, 0x2c, 0x35, 0xa3, 0x2c, 0x33, 0xa1, +0x2c, 0x33, 0xa0, 0x2b, 0x33, 0x9e, 0x2b, 0x31, 0x9c, 0x2a, 0x30, 0x9b, +0x28, 0x30, 0x99, 0x28, 0x2f, 0x98, 0x28, 0x2f, 0x95, 0x26, 0x2c, 0x94, +0x25, 0x2b, 0x93, 0x25, 0x2b, 0x93, 0x25, 0x2b, 0x92, 0x23, 0x2a, 0x8f, +0x23, 0x2a, 0x8e, 0x23, 0x28, 0x8c, 0x21, 0x28, 0x8c, 0x21, 0x28, 0x8a, +0x21, 0x26, 0x89, 0x21, 0x26, 0x87, 0x20, 0x26, 0x86, 0x20, 0x26, 0x86, +0x20, 0x26, 0x83, 0x20, 0x26, 0x82, 0x20, 0x26, 0x82, 0x20, 0x26, 0x81, +0x20, 0x26, 0x7e, 0x20, 0x26, 0x7e, 0x20, 0x26, 0x7d, 0x20, 0x25, 0x7c, +0x20, 0x25, 0x7c, 0x20, 0x25, 0x78, 0x20, 0x25, 0x78, 0x20, 0x25, 0x78, +0x20, 0x25, 0x77, 0x20, 0x25, 0x77, 0x1e, 0x23, 0x73, 0x1e, 0x23, 0x73, +0x1e, 0x23, 0x72, 0x1e, 0x23, 0x72, 0x1e, 0x23, 0x70, 0x1e, 0x23, 0x70, +0x1d, 0x23, 0x6f, 0x1d, 0x23, 0x6f, 0x1d, 0x21, 0x6c, 0x1d, 0x21, 0x6c, +0x1d, 0x21, 0x6b, 0x1a, 0x21, 0x6b, 0x1a, 0x20, 0x6a, 0x1a, 0x20, 0x6a, +0x1a, 0x20, 0x67, 0x1a, 0x20, 0x67, 0x1a, 0x20, 0x67, 0x19, 0x1e, 0x66, +0x19, 0x1e, 0x66, 0x19, 0x1e, 0x65, 0x19, 0x1e, 0x65, 0x0c, 0x0e, 0x2e, +0x1a, 0x20, 0x62, 0x2c, 0x36, 0xa2, 0x33, 0x3d, 0xb2, 0x32, 0x39, 0xa7, +0x33, 0x3a, 0xaa, 0x34, 0x3d, 0xac, 0x36, 0x3f, 0xad, 0x38, 0x40, 0xb0, +0x3a, 0x44, 0xb2, 0x3e, 0x46, 0xb3, 0x40, 0x4a, 0xb7, 0x44, 0x4e, 0xb9, +0x46, 0x4f, 0xba, 0x4a, 0x54, 0xbe, 0x4a, 0x55, 0xbf, 0x47, 0x52, 0xc1, +0x45, 0x4f, 0xc5, 0x41, 0x4b, 0xc6, 0x3f, 0x47, 0xc9, 0x3d, 0x46, 0xcb, +0x39, 0x45, 0xcf, 0x3a, 0x45, 0xd3, 0x40, 0x4a, 0xd4, 0x45, 0x4f, 0xd6, +0x4a, 0x55, 0xda, 0x51, 0x5f, 0xdc, 0x5a, 0x67, 0xe0, 0x51, 0x5b, 0xe4, +0x45, 0x51, 0xe6, 0x3e, 0x47, 0xea, 0x36, 0x41, 0xed, 0x33, 0x3e, 0xf0, +0x39, 0x44, 0xf5, 0x40, 0x4c, 0xf7, 0x4b, 0x59, 0xfc, 0x5a, 0x67, 0xff, +0x5c, 0x6a, 0xff, 0x60, 0x6d, 0xff, 0x62, 0x73, 0xff, 0x66, 0x75, 0xff, +0x68, 0x77, 0xff, 0x6c, 0x7c, 0xff, 0x6c, 0x7c, 0xff, 0x62, 0x70, 0xff, +0x5a, 0x68, 0xff, 0x52, 0x60, 0xff, 0x4f, 0x5f, 0xff, 0x4b, 0x5a, 0xff, +0x59, 0x68, 0xff, 0x81, 0x92, 0xff, 0x2b, 0x34, 0x67, 0x83, 0x96, 0xff, +0x6d, 0x7d, 0xff, 0x5c, 0x6d, 0xff, 0x51, 0x61, 0xff, 0x67, 0x7b, 0xff, +0x67, 0x76, 0xdc, 0x51, 0x5f, 0xad, 0x62, 0x71, 0xd5, 0x73, 0x83, 0xfd, +0x7c, 0x8e, 0xff, 0x7c, 0x8f, 0xff, 0x67, 0x7b, 0xff, 0x71, 0x84, 0xff, +0x6d, 0x7e, 0xff, 0x5b, 0x6d, 0xff, 0x64, 0x77, 0xff, 0x83, 0x98, 0xff, +0x77, 0x8c, 0xff, 0x6c, 0x7e, 0xff, 0x66, 0x77, 0xff, 0x5f, 0x71, 0xff, +0x56, 0x68, 0xff, 0x6d, 0x81, 0xff, 0x56, 0x66, 0xc1, 0x84, 0x99, 0xff, +0x61, 0x73, 0xff, 0x71, 0x87, 0xff, 0x8b, 0x9e, 0xff, 0x71, 0x84, 0xff, +0x5f, 0x70, 0xff, 0x67, 0x7a, 0xff, 0x6f, 0x81, 0xff, 0x76, 0x88, 0xff, +0x7e, 0x91, 0xff, 0x7a, 0x8b, 0xff, 0x6f, 0x7e, 0xff, 0x64, 0x75, 0xff, +0x66, 0x75, 0xff, 0x62, 0x73, 0xff, 0x61, 0x70, 0xff, 0x5c, 0x6c, 0xff, +0x59, 0x67, 0xff, 0x5a, 0x68, 0xff, 0x5c, 0x6d, 0xff, 0x61, 0x6f, 0xff, +0x66, 0x76, 0xff, 0x6c, 0x7a, 0xff, 0x67, 0x75, 0xf0, 0x5a, 0x64, 0xc6, +0x61, 0x6f, 0xe1, 0x62, 0x70, 0xfc, 0x5a, 0x66, 0xf7, 0x51, 0x5c, 0xf5, +0x4e, 0x5a, 0xf0, 0x4f, 0x5b, 0xed, 0x51, 0x5f, 0xea, 0x54, 0x60, 0xe7, +0x55, 0x61, 0xe2, 0x52, 0x5c, 0xe0, 0x4b, 0x55, 0xdc, 0x45, 0x4f, 0xda, +0x3f, 0x4b, 0xd6, 0x3a, 0x45, 0xd4, 0x38, 0x40, 0xd3, 0x38, 0x40, 0xce, +0x38, 0x3f, 0xcb, 0x38, 0x3f, 0xc8, 0x38, 0x40, 0xc6, 0x36, 0x40, 0xc4, +0x36, 0x40, 0xc1, 0x36, 0x40, 0xbf, 0x36, 0x3f, 0xbb, 0x36, 0x3f, 0xba, +0x36, 0x3f, 0xb8, 0x36, 0x3e, 0xb4, 0x36, 0x3e, 0xb3, 0x34, 0x3d, 0xb0, +0x34, 0x3e, 0xae, 0x34, 0x3d, 0xac, 0x34, 0x3d, 0xac, 0x33, 0x3a, 0xa9, +0x32, 0x39, 0xa7, 0x32, 0x39, 0xa5, 0x30, 0x38, 0xa3, 0x2f, 0x36, 0xa1, +0x2f, 0x36, 0x9f, 0x2d, 0x34, 0x9d, 0x2d, 0x34, 0x9c, 0x2b, 0x33, 0x99, +0x2a, 0x32, 0x98, 0x2a, 0x32, 0x97, 0x2a, 0x30, 0x96, 0x29, 0x2f, 0x94, +0x27, 0x2f, 0x92, 0x27, 0x2d, 0x8f, 0x25, 0x2b, 0x8e, 0x24, 0x2b, 0x8c, +0x24, 0x2a, 0x8b, 0x24, 0x2a, 0x8b, 0x23, 0x29, 0x89, 0x23, 0x29, 0x88, +0x22, 0x27, 0x87, 0x22, 0x27, 0x84, 0x1f, 0x25, 0x83, 0x1f, 0x25, 0x82, +0x1f, 0x24, 0x81, 0x1e, 0x24, 0x81, 0x1e, 0x24, 0x7e, 0x1e, 0x24, 0x7d, +0x1e, 0x24, 0x7c, 0x1e, 0x24, 0x7b, 0x1e, 0x24, 0x7b, 0x1e, 0x24, 0x7a, +0x1e, 0x24, 0x77, 0x1e, 0x24, 0x77, 0x1e, 0x24, 0x76, 0x1e, 0x23, 0x75, +0x1e, 0x24, 0x75, 0x1e, 0x23, 0x73, 0x1e, 0x23, 0x71, 0x1e, 0x23, 0x71, +0x1e, 0x23, 0x70, 0x1d, 0x22, 0x6d, 0x1d, 0x22, 0x6d, 0x1d, 0x22, 0x6d, +0x1d, 0x22, 0x6d, 0x1d, 0x22, 0x6c, 0x1d, 0x22, 0x6a, 0x1c, 0x22, 0x68, +0x1c, 0x22, 0x67, 0x1c, 0x22, 0x67, 0x1c, 0x1f, 0x66, 0x1c, 0x1f, 0x66, +0x19, 0x1e, 0x66, 0x19, 0x1e, 0x64, 0x19, 0x1e, 0x62, 0x19, 0x1e, 0x62, +0x18, 0x1e, 0x61, 0x18, 0x1e, 0x61, 0x18, 0x1d, 0x60, 0x18, 0x1d, 0x60, +0x18, 0x1d, 0x60, 0x17, 0x1c, 0x5f, 0x17, 0x1c, 0x5f, 0x17, 0x1c, 0x5c, +0x17, 0x1c, 0x5c, 0x17, 0x1c, 0x5b, 0x16, 0x1a, 0x57, 0x04, 0x04, 0x0f, +0x12, 0x16, 0x44, 0x25, 0x2d, 0x89, 0x28, 0x30, 0x92, 0x25, 0x2b, 0x82, +0x26, 0x2b, 0x80, 0x26, 0x2c, 0x82, 0x28, 0x2d, 0x83, 0x29, 0x2f, 0x85, +0x2a, 0x30, 0x86, 0x2c, 0x32, 0x88, 0x2e, 0x34, 0x8a, 0x30, 0x36, 0x8b, +0x31, 0x3b, 0x8d, 0x34, 0x3c, 0x8f, 0x37, 0x3f, 0x91, 0x3b, 0x42, 0x93, +0x3b, 0x42, 0x95, 0x37, 0x40, 0x98, 0x34, 0x3d, 0x99, 0x32, 0x3b, 0x9b, +0x31, 0x39, 0x9d, 0x2e, 0x36, 0x9e, 0x2c, 0x33, 0xa1, 0x2f, 0x37, 0xa4, +0x32, 0x3c, 0xa5, 0x37, 0x41, 0xa7, 0x3e, 0x46, 0xab, 0x43, 0x4e, 0xad, +0x42, 0x4c, 0xaf, 0x39, 0x42, 0xb3, 0x30, 0x3b, 0xb5, 0x2b, 0x33, 0xb7, +0x28, 0x2f, 0xb9, 0x2b, 0x33, 0xbd, 0x31, 0x3b, 0xbf, 0x39, 0x42, 0xc2, +0x44, 0x4f, 0xc6, 0x48, 0x53, 0xc8, 0x4a, 0x56, 0xcb, 0x4e, 0x58, 0xce, +0x51, 0x5c, 0xd1, 0x52, 0x5f, 0xd4, 0x54, 0x61, 0xd8, 0x54, 0x60, 0xdb, +0x4c, 0x56, 0xde, 0x44, 0x50, 0xe1, 0x3f, 0x4a, 0xe5, 0x3c, 0x46, 0xe7, +0x39, 0x43, 0xeb, 0x4e, 0x5a, 0xee, 0x41, 0x4a, 0x8b, 0x41, 0x4d, 0x8d, +0x5f, 0x6d, 0xf8, 0x4e, 0x5b, 0xfb, 0x42, 0x50, 0xfe, 0x44, 0x52, 0xff, +0x68, 0x78, 0xff, 0x2c, 0x33, 0x64, 0x41, 0x4c, 0x8c, 0x49, 0x53, 0x9c, +0x51, 0x5d, 0xb0, 0x67, 0x77, 0xff, 0x52, 0x61, 0xff, 0x58, 0x67, 0xff, +0x57, 0x67, 0xff, 0x49, 0x57, 0xff, 0x4f, 0x5d, 0xff, 0x69, 0x79, 0xff, +0x5f, 0x6e, 0xff, 0x54, 0x63, 0xff, 0x50, 0x5f, 0xff, 0x4a, 0x58, 0xff, +0x44, 0x52, 0xff, 0x5d, 0x6d, 0xff, 0x1d, 0x24, 0x4e, 0x60, 0x6e, 0xff, +0x4f, 0x5c, 0xff, 0x60, 0x6f, 0xfe, 0x63, 0x73, 0xfc, 0x51, 0x60, 0xf9, +0x4d, 0x5a, 0xf7, 0x53, 0x62, 0xf3, 0x5b, 0x68, 0xf1, 0x60, 0x6e, 0xee, +0x63, 0x72, 0xec, 0x58, 0x67, 0xea, 0x50, 0x5d, 0xe6, 0x4f, 0x5b, 0xe4, +0x4e, 0x5b, 0xe1, 0x4c, 0x57, 0xde, 0x48, 0x54, 0xdc, 0x45, 0x51, 0xda, +0x45, 0x51, 0xd8, 0x49, 0x54, 0xd5, 0x4d, 0x57, 0xd2, 0x50, 0x5c, 0xd0, +0x55, 0x60, 0xcc, 0x4c, 0x55, 0xad, 0x40, 0x4a, 0x90, 0x4c, 0x56, 0xae, +0x4d, 0x57, 0xc2, 0x44, 0x4f, 0xbf, 0x3e, 0x46, 0xbd, 0x3d, 0x45, 0xb9, +0x3e, 0x48, 0xb7, 0x40, 0x49, 0xb5, 0x41, 0x4c, 0xb1, 0x44, 0x4d, 0xb0, +0x3e, 0x45, 0xad, 0x39, 0x41, 0xaa, 0x32, 0x3b, 0xa7, 0x2f, 0x39, 0xa6, +0x2c, 0x33, 0xa3, 0x2b, 0x31, 0xa1, 0x2b, 0x31, 0x9e, 0x2b, 0x32, 0x9d, +0x2a, 0x32, 0x9b, 0x2a, 0x31, 0x99, 0x2a, 0x31, 0x97, 0x2b, 0x32, 0x94, +0x2b, 0x32, 0x93, 0x2a, 0x31, 0x91, 0x2a, 0x31, 0x8f, 0x2a, 0x30, 0x8c, +0x2a, 0x30, 0x8b, 0x2a, 0x2f, 0x89, 0x2a, 0x2f, 0x87, 0x29, 0x2f, 0x86, +0x29, 0x2e, 0x83, 0x28, 0x2e, 0x82, 0x28, 0x2d, 0x81, 0x27, 0x2c, 0x7f, +0x26, 0x2b, 0x7e, 0x24, 0x2a, 0x7c, 0x24, 0x2a, 0x7b, 0x22, 0x29, 0x79, +0x21, 0x28, 0x78, 0x21, 0x28, 0x77, 0x21, 0x28, 0x76, 0x20, 0x26, 0x74, +0x1f, 0x26, 0x73, 0x1f, 0x24, 0x72, 0x1e, 0x22, 0x70, 0x1d, 0x21, 0x6f, +0x1c, 0x21, 0x6e, 0x1c, 0x20, 0x6d, 0x1c, 0x20, 0x6c, 0x1b, 0x1f, 0x6a, +0x1b, 0x1f, 0x69, 0x1a, 0x1e, 0x68, 0x19, 0x1d, 0x67, 0x19, 0x1e, 0x66, +0x19, 0x1d, 0x65, 0x18, 0x1c, 0x64, 0x18, 0x1c, 0x63, 0x18, 0x1c, 0x62, +0x18, 0x1c, 0x62, 0x18, 0x1c, 0x61, 0x18, 0x1c, 0x60, 0x18, 0x1b, 0x5f, +0x18, 0x1b, 0x5d, 0x18, 0x1c, 0x5d, 0x18, 0x1b, 0x5c, 0x18, 0x1b, 0x5b, +0x18, 0x1b, 0x5a, 0x18, 0x1b, 0x5a, 0x18, 0x1b, 0x58, 0x18, 0x1b, 0x57, +0x17, 0x1b, 0x57, 0x17, 0x1b, 0x56, 0x17, 0x1b, 0x55, 0x17, 0x1b, 0x55, +0x17, 0x1b, 0x54, 0x16, 0x1a, 0x53, 0x16, 0x1a, 0x52, 0x16, 0x1a, 0x52, +0x16, 0x1a, 0x52, 0x16, 0x19, 0x51, 0x16, 0x19, 0x51, 0x15, 0x19, 0x4f, +0x15, 0x19, 0x4f, 0x15, 0x18, 0x4e, 0x14, 0x18, 0x4d, 0x14, 0x18, 0x4d, +0x14, 0x17, 0x4d, 0x14, 0x17, 0x4c, 0x14, 0x17, 0x4a, 0x14, 0x17, 0x4a, +0x13, 0x16, 0x49, 0x13, 0x16, 0x49, 0x13, 0x16, 0x49, 0x13, 0x16, 0x48, +0x13, 0x16, 0x48, 0x10, 0x15, 0x46, 0x10, 0x15, 0x46, 0x10, 0x15, 0x45, +0x10, 0x15, 0x45, 0x10, 0x15, 0x44, 0x0f, 0x12, 0x3e, 0x01, 0x01, 0x06, +0x12, 0x15, 0x44, 0x25, 0x2c, 0x8a, 0x27, 0x2e, 0x8f, 0x21, 0x28, 0x7a, +0x1f, 0x25, 0x72, 0x1f, 0x25, 0x73, 0x21, 0x26, 0x75, 0x22, 0x28, 0x76, +0x23, 0x29, 0x77, 0x25, 0x2b, 0x79, 0x26, 0x2d, 0x7b, 0x27, 0x2e, 0x7c, +0x29, 0x30, 0x7e, 0x2c, 0x32, 0x80, 0x2e, 0x35, 0x81, 0x31, 0x38, 0x83, +0x33, 0x3b, 0x85, 0x36, 0x3e, 0x87, 0x35, 0x3d, 0x88, 0x32, 0x3b, 0x8a, +0x30, 0x37, 0x8c, 0x2d, 0x35, 0x8e, 0x2c, 0x32, 0x90, 0x29, 0x31, 0x92, +0x29, 0x31, 0x94, 0x2c, 0x34, 0x96, 0x30, 0x39, 0x98, 0x35, 0x3e, 0x9a, +0x3b, 0x43, 0x9d, 0x40, 0x49, 0x9f, 0x36, 0x40, 0xa2, 0x2f, 0x37, 0xa4, +0x29, 0x31, 0xa7, 0x24, 0x2c, 0xa9, 0x25, 0x2d, 0xab, 0x2a, 0x33, 0xae, +0x32, 0x3b, 0xb1, 0x3e, 0x47, 0xb3, 0x42, 0x4c, 0xb6, 0x44, 0x4f, 0xb9, +0x47, 0x52, 0xbc, 0x4a, 0x55, 0xbf, 0x4b, 0x57, 0xc2, 0x4e, 0x59, 0xc5, +0x4b, 0x56, 0xc8, 0x44, 0x4d, 0xcb, 0x3c, 0x46, 0xce, 0x38, 0x42, 0xd1, +0x34, 0x3f, 0xd4, 0x38, 0x42, 0xd7, 0x52, 0x60, 0xda, 0x11, 0x15, 0x31, +0x52, 0x5e, 0xb8, 0x4c, 0x59, 0xe3, 0x40, 0x4b, 0xe6, 0x37, 0x43, 0xe7, +0x50, 0x5d, 0xe7, 0x13, 0x18, 0x36, 0x1d, 0x24, 0x48, 0x2e, 0x37, 0x67, +0x36, 0x3f, 0x75, 0x56, 0x64, 0xc6, 0x50, 0x5e, 0xe4, 0x51, 0x5f, 0xe3, +0x54, 0x63, 0xe3, 0x44, 0x52, 0xe3, 0x48, 0x56, 0xe3, 0x58, 0x66, 0xcf, +0x58, 0x66, 0xe2, 0x4e, 0x5d, 0xe2, 0x4a, 0x58, 0xe2, 0x43, 0x51, 0xe1, +0x3f, 0x4c, 0xe1, 0x56, 0x65, 0xcd, 0x27, 0x2e, 0x5c, 0x50, 0x5e, 0xe1, +0x4e, 0x5c, 0xe1, 0x54, 0x61, 0xc5, 0x54, 0x63, 0xe1, 0x44, 0x50, 0xe1, +0x47, 0x54, 0xdf, 0x4f, 0x5c, 0xdd, 0x55, 0x62, 0xda, 0x4f, 0x5c, 0xbf, +0x55, 0x62, 0xd5, 0x4c, 0x59, 0xd2, 0x47, 0x53, 0xd0, 0x47, 0x52, 0xce, +0x45, 0x51, 0xcc, 0x43, 0x4e, 0xca, 0x40, 0x4b, 0xc7, 0x3f, 0x49, 0xc5, +0x43, 0x4d, 0xc2, 0x45, 0x50, 0xbf, 0x4a, 0x54, 0xbe, 0x4b, 0x55, 0xb2, +0x41, 0x4b, 0x94, 0x36, 0x3d, 0x76, 0x44, 0x4d, 0x9c, 0x44, 0x4f, 0xb1, +0x3c, 0x46, 0xae, 0x36, 0x3f, 0xac, 0x37, 0x41, 0xa9, 0x3a, 0x42, 0xa7, +0x3c, 0x44, 0xa4, 0x3e, 0x47, 0xa2, 0x3b, 0x43, 0x9f, 0x35, 0x3e, 0x9c, +0x30, 0x38, 0x9b, 0x2d, 0x34, 0x98, 0x29, 0x30, 0x96, 0x26, 0x2d, 0x94, +0x26, 0x2d, 0x92, 0x27, 0x2d, 0x8f, 0x26, 0x2d, 0x8d, 0x26, 0x2e, 0x8c, +0x26, 0x2d, 0x8a, 0x26, 0x2d, 0x88, 0x26, 0x2d, 0x86, 0x26, 0x2d, 0x84, +0x26, 0x2c, 0x82, 0x26, 0x2c, 0x81, 0x26, 0x2b, 0x7f, 0x25, 0x2b, 0x7d, +0x26, 0x2b, 0x7c, 0x25, 0x2b, 0x7a, 0x25, 0x2a, 0x78, 0x24, 0x2a, 0x77, +0x23, 0x28, 0x75, 0x22, 0x27, 0x73, 0x22, 0x27, 0x72, 0x21, 0x26, 0x71, +0x20, 0x25, 0x70, 0x20, 0x25, 0x6f, 0x1e, 0x24, 0x6d, 0x1e, 0x23, 0x6c, +0x1e, 0x23, 0x6b, 0x1d, 0x21, 0x69, 0x1c, 0x21, 0x68, 0x1b, 0x20, 0x67, +0x1b, 0x1f, 0x66, 0x19, 0x1e, 0x65, 0x19, 0x1d, 0x63, 0x18, 0x1d, 0x62, +0x18, 0x1c, 0x61, 0x17, 0x1b, 0x60, 0x17, 0x1b, 0x5f, 0x17, 0x1a, 0x5e, +0x16, 0x1a, 0x5d, 0x15, 0x19, 0x5c, 0x15, 0x19, 0x5b, 0x15, 0x19, 0x5a, +0x15, 0x19, 0x59, 0x14, 0x19, 0x58, 0x15, 0x19, 0x58, 0x15, 0x19, 0x57, +0x15, 0x18, 0x56, 0x15, 0x18, 0x55, 0x15, 0x18, 0x54, 0x15, 0x18, 0x53, +0x15, 0x18, 0x53, 0x14, 0x18, 0x52, 0x14, 0x18, 0x51, 0x14, 0x18, 0x50, +0x14, 0x18, 0x50, 0x14, 0x18, 0x4f, 0x14, 0x18, 0x4e, 0x14, 0x18, 0x4e, +0x13, 0x17, 0x4d, 0x13, 0x17, 0x4c, 0x13, 0x17, 0x4c, 0x13, 0x17, 0x4b, +0x13, 0x17, 0x4a, 0x13, 0x16, 0x49, 0x13, 0x16, 0x48, 0x12, 0x16, 0x48, +0x12, 0x16, 0x47, 0x11, 0x15, 0x47, 0x11, 0x15, 0x47, 0x11, 0x15, 0x45, +0x11, 0x14, 0x45, 0x11, 0x14, 0x44, 0x10, 0x14, 0x44, 0x10, 0x14, 0x43, +0x10, 0x14, 0x43, 0x10, 0x13, 0x42, 0x10, 0x13, 0x42, 0x0f, 0x13, 0x41, +0x0f, 0x12, 0x41, 0x0f, 0x12, 0x40, 0x0f, 0x12, 0x40, 0x0f, 0x12, 0x3f, +0x0e, 0x12, 0x3f, 0x0e, 0x11, 0x3e, 0x0e, 0x11, 0x3e, 0x0e, 0x11, 0x3d, +0x0e, 0x11, 0x3d, 0x0e, 0x11, 0x3d, 0x0d, 0x0f, 0x36, 0x01, 0x01, 0x05, +0x12, 0x15, 0x45, 0x25, 0x2b, 0x8a, 0x27, 0x2d, 0x90, 0x22, 0x27, 0x7b, +0x1e, 0x24, 0x73, 0x1f, 0x25, 0x74, 0x20, 0x26, 0x76, 0x21, 0x27, 0x77, +0x22, 0x28, 0x78, 0x24, 0x2a, 0x7a, 0x25, 0x2b, 0x7b, 0x26, 0x2c, 0x7d, +0x27, 0x2e, 0x7f, 0x29, 0x30, 0x80, 0x2c, 0x32, 0x82, 0x2d, 0x35, 0x84, +0x31, 0x37, 0x86, 0x33, 0x3b, 0x87, 0x36, 0x3e, 0x89, 0x3a, 0x41, 0x8b, +0x37, 0x3f, 0x8d, 0x35, 0x3c, 0x8f, 0x32, 0x3a, 0x91, 0x2f, 0x36, 0x93, +0x2c, 0x34, 0x95, 0x2a, 0x31, 0x98, 0x2c, 0x33, 0x99, 0x30, 0x38, 0x9c, +0x35, 0x3e, 0x9e, 0x3c, 0x44, 0xa1, 0x43, 0x4c, 0xa3, 0x3d, 0x46, 0xa6, +0x33, 0x3c, 0xa8, 0x2b, 0x34, 0xaa, 0x26, 0x2f, 0xae, 0x25, 0x2d, 0xb0, +0x2b, 0x33, 0xb3, 0x32, 0x3c, 0xb6, 0x3f, 0x47, 0xb9, 0x45, 0x4f, 0xbc, +0x48, 0x52, 0xbe, 0x4a, 0x56, 0xc2, 0x4e, 0x59, 0xc5, 0x50, 0x5b, 0xc8, +0x51, 0x5d, 0xcb, 0x4d, 0x58, 0xce, 0x43, 0x4f, 0xd1, 0x3c, 0x47, 0xd5, +0x38, 0x43, 0xd7, 0x35, 0x40, 0xdb, 0x41, 0x4d, 0xde, 0x4c, 0x56, 0xa8, +0x1c, 0x21, 0x45, 0x5c, 0x6a, 0xe7, 0x49, 0x56, 0xe7, 0x3f, 0x4b, 0xe7, +0x46, 0x53, 0xe6, 0x3c, 0x45, 0x81, 0x14, 0x19, 0x39, 0x15, 0x1a, 0x3a, +0x1d, 0x23, 0x48, 0x3a, 0x43, 0x7e, 0x58, 0x67, 0xe3, 0x55, 0x64, 0xe3, +0x5c, 0x6b, 0xe3, 0x4a, 0x57, 0xe2, 0x4c, 0x5b, 0xe2, 0x4c, 0x59, 0xab, +0x5d, 0x6d, 0xe2, 0x53, 0x62, 0xe2, 0x4e, 0x5c, 0xe1, 0x47, 0x55, 0xe1, +0x47, 0x55, 0xe1, 0x2d, 0x35, 0x68, 0x32, 0x3b, 0x73, 0x4c, 0x5a, 0xe0, +0x59, 0x68, 0xe0, 0x45, 0x50, 0x9d, 0x52, 0x60, 0xe0, 0x48, 0x55, 0xe0, +0x4f, 0x5d, 0xe0, 0x57, 0x65, 0xe1, 0x54, 0x62, 0xcd, 0x52, 0x5f, 0xc6, +0x52, 0x5f, 0xd9, 0x4a, 0x57, 0xd6, 0x49, 0x56, 0xd4, 0x49, 0x55, 0xd2, +0x46, 0x52, 0xd0, 0x43, 0x4d, 0xcd, 0x41, 0x4b, 0xca, 0x44, 0x4f, 0xc8, +0x48, 0x54, 0xc5, 0x4c, 0x58, 0xc3, 0x4a, 0x54, 0xae, 0x3f, 0x47, 0x8c, +0x30, 0x38, 0x6a, 0x46, 0x50, 0xa1, 0x46, 0x51, 0xb6, 0x3d, 0x48, 0xb3, +0x39, 0x42, 0xb1, 0x3b, 0x43, 0xad, 0x3e, 0x46, 0xab, 0x3f, 0x48, 0xa8, +0x41, 0x4a, 0xa6, 0x3c, 0x44, 0xa3, 0x35, 0x3d, 0xa1, 0x30, 0x38, 0x9e, +0x2b, 0x33, 0x9b, 0x29, 0x30, 0x9a, 0x28, 0x2e, 0x97, 0x28, 0x2f, 0x95, +0x28, 0x2f, 0x93, 0x27, 0x2f, 0x91, 0x28, 0x2f, 0x8e, 0x28, 0x30, 0x8d, +0x28, 0x2f, 0x8b, 0x28, 0x2e, 0x89, 0x28, 0x2e, 0x87, 0x28, 0x2e, 0x85, +0x28, 0x2e, 0x83, 0x27, 0x2d, 0x81, 0x27, 0x2d, 0x80, 0x27, 0x2d, 0x7e, +0x26, 0x2c, 0x7c, 0x25, 0x2b, 0x7b, 0x24, 0x2a, 0x79, 0x24, 0x29, 0x77, +0x23, 0x28, 0x76, 0x22, 0x27, 0x74, 0x21, 0x26, 0x73, 0x20, 0x26, 0x71, +0x20, 0x25, 0x70, 0x1f, 0x24, 0x6f, 0x1e, 0x24, 0x6d, 0x1d, 0x22, 0x6c, +0x1d, 0x21, 0x6b, 0x1c, 0x21, 0x6a, 0x1b, 0x20, 0x69, 0x1a, 0x1f, 0x67, +0x1a, 0x1e, 0x66, 0x19, 0x1d, 0x65, 0x18, 0x1d, 0x64, 0x18, 0x1c, 0x63, +0x18, 0x1b, 0x62, 0x17, 0x1b, 0x61, 0x17, 0x1b, 0x60, 0x16, 0x1a, 0x5e, +0x16, 0x1a, 0x5d, 0x16, 0x1a, 0x5d, 0x16, 0x1a, 0x5c, 0x16, 0x1a, 0x5b, +0x16, 0x1a, 0x5a, 0x16, 0x1a, 0x59, 0x16, 0x1a, 0x58, 0x15, 0x19, 0x57, +0x15, 0x19, 0x56, 0x15, 0x19, 0x55, 0x15, 0x19, 0x54, 0x15, 0x19, 0x54, +0x15, 0x19, 0x53, 0x15, 0x19, 0x52, 0x15, 0x19, 0x51, 0x15, 0x19, 0x51, +0x14, 0x19, 0x50, 0x14, 0x19, 0x4f, 0x14, 0x19, 0x4e, 0x14, 0x19, 0x4e, +0x14, 0x19, 0x4d, 0x14, 0x17, 0x4c, 0x14, 0x17, 0x4c, 0x13, 0x17, 0x4b, +0x13, 0x17, 0x4a, 0x13, 0x17, 0x4a, 0x12, 0x16, 0x48, 0x12, 0x15, 0x48, +0x12, 0x15, 0x47, 0x11, 0x14, 0x47, 0x11, 0x14, 0x47, 0x11, 0x14, 0x45, +0x11, 0x14, 0x45, 0x10, 0x14, 0x44, 0x10, 0x14, 0x44, 0x10, 0x13, 0x43, +0x10, 0x13, 0x43, 0x10, 0x13, 0x42, 0x10, 0x13, 0x42, 0x0f, 0x12, 0x41, +0x0f, 0x12, 0x41, 0x0f, 0x12, 0x40, 0x0f, 0x12, 0x40, 0x0e, 0x12, 0x3f, +0x0e, 0x12, 0x3f, 0x0e, 0x11, 0x3e, 0x0e, 0x11, 0x3e, 0x0e, 0x11, 0x3d, +0x0e, 0x11, 0x3d, 0x0e, 0x11, 0x3d, 0x0d, 0x0f, 0x36, 0x01, 0x01, 0x05, +0x13, 0x16, 0x45, 0x27, 0x2d, 0x8b, 0x28, 0x2e, 0x90, 0x22, 0x27, 0x7c, +0x1e, 0x23, 0x73, 0x1f, 0x24, 0x75, 0x1f, 0x25, 0x76, 0x20, 0x26, 0x77, +0x21, 0x28, 0x79, 0x22, 0x28, 0x7a, 0x23, 0x29, 0x7c, 0x25, 0x2b, 0x7e, +0x26, 0x2d, 0x7f, 0x27, 0x2e, 0x81, 0x2a, 0x30, 0x83, 0x2c, 0x32, 0x85, +0x2e, 0x35, 0x87, 0x31, 0x37, 0x88, 0x33, 0x3b, 0x8a, 0x36, 0x3e, 0x8c, +0x3a, 0x42, 0x8e, 0x3d, 0x44, 0x90, 0x3a, 0x42, 0x93, 0x36, 0x3f, 0x94, +0x34, 0x3b, 0x97, 0x30, 0x38, 0x98, 0x2d, 0x35, 0x9b, 0x2c, 0x33, 0x9d, +0x30, 0x38, 0xa0, 0x34, 0x3e, 0xa2, 0x3a, 0x43, 0xa5, 0x42, 0x4b, 0xa7, +0x45, 0x4f, 0xa9, 0x39, 0x42, 0xad, 0x2f, 0x38, 0xaf, 0x28, 0x31, 0xb2, +0x25, 0x2d, 0xb5, 0x2a, 0x32, 0xb8, 0x32, 0x3c, 0xbb, 0x3f, 0x49, 0xbe, +0x48, 0x52, 0xc1, 0x4b, 0x56, 0xc4, 0x4f, 0x5a, 0xc8, 0x51, 0x5d, 0xcb, +0x54, 0x60, 0xce, 0x55, 0x63, 0xd2, 0x4f, 0x5a, 0xd5, 0x44, 0x51, 0xd9, +0x3d, 0x48, 0xdb, 0x39, 0x44, 0xdf, 0x35, 0x40, 0xe3, 0x4f, 0x5c, 0xe5, +0x13, 0x17, 0x35, 0x3a, 0x43, 0x7d, 0x56, 0x64, 0xe7, 0x48, 0x54, 0xe7, +0x3f, 0x4b, 0xe6, 0x5c, 0x6a, 0xd6, 0x16, 0x1b, 0x3c, 0x16, 0x1b, 0x3c, +0x16, 0x1b, 0x3d, 0x16, 0x1b, 0x3d, 0x59, 0x68, 0xd0, 0x59, 0x69, 0xe2, +0x58, 0x67, 0xcf, 0x4f, 0x5e, 0xe2, 0x4f, 0x5e, 0xe1, 0x3d, 0x48, 0x89, +0x56, 0x64, 0xc7, 0x57, 0x67, 0xe1, 0x52, 0x61, 0xe0, 0x4a, 0x59, 0xe0, +0x53, 0x62, 0xe0, 0x12, 0x17, 0x39, 0x3f, 0x4b, 0x90, 0x51, 0x60, 0xdf, +0x47, 0x54, 0xa5, 0x4a, 0x56, 0xab, 0x4f, 0x5d, 0xdf, 0x50, 0x5d, 0xdf, +0x58, 0x67, 0xdf, 0x53, 0x5f, 0xc4, 0x47, 0x52, 0xa3, 0x59, 0x67, 0xdf, +0x4e, 0x5b, 0xdd, 0x4d, 0x59, 0xdb, 0x4d, 0x59, 0xd8, 0x4a, 0x56, 0xd6, +0x45, 0x51, 0xd3, 0x42, 0x4e, 0xd1, 0x47, 0x52, 0xce, 0x4c, 0x57, 0xcc, +0x50, 0x5b, 0xc9, 0x4b, 0x55, 0xad, 0x3b, 0x43, 0x83, 0x2f, 0x37, 0x67, +0x48, 0x53, 0xa8, 0x48, 0x53, 0xbb, 0x3e, 0x49, 0xb9, 0x3c, 0x45, 0xb5, +0x3f, 0x48, 0xb2, 0x41, 0x4b, 0xb0, 0x43, 0x4d, 0xac, 0x42, 0x4c, 0xaa, +0x3b, 0x44, 0xa7, 0x35, 0x3d, 0xa5, 0x30, 0x37, 0xa2, 0x2c, 0x33, 0xa0, +0x29, 0x30, 0x9d, 0x29, 0x30, 0x9b, 0x29, 0x31, 0x99, 0x29, 0x31, 0x96, +0x2a, 0x31, 0x94, 0x2a, 0x31, 0x92, 0x2a, 0x31, 0x90, 0x29, 0x30, 0x8d, +0x2a, 0x30, 0x8b, 0x2a, 0x30, 0x8a, 0x29, 0x30, 0x88, 0x28, 0x2f, 0x86, +0x28, 0x30, 0x84, 0x28, 0x2f, 0x82, 0x27, 0x2e, 0x80, 0x26, 0x2d, 0x7f, +0x25, 0x2c, 0x7d, 0x24, 0x2b, 0x7b, 0x24, 0x2a, 0x7a, 0x23, 0x29, 0x78, +0x22, 0x28, 0x76, 0x22, 0x27, 0x75, 0x21, 0x26, 0x73, 0x21, 0x26, 0x72, +0x1f, 0x25, 0x70, 0x1f, 0x24, 0x6f, 0x1e, 0x22, 0x6e, 0x1d, 0x22, 0x6c, +0x1c, 0x20, 0x6c, 0x1b, 0x1f, 0x6a, 0x1a, 0x1f, 0x69, 0x1a, 0x1e, 0x68, +0x19, 0x1e, 0x67, 0x18, 0x1d, 0x65, 0x18, 0x1c, 0x64, 0x17, 0x1c, 0x63, +0x17, 0x1b, 0x62, 0x16, 0x1b, 0x61, 0x17, 0x1b, 0x60, 0x17, 0x1b, 0x5f, +0x17, 0x1a, 0x5e, 0x17, 0x1b, 0x5d, 0x17, 0x1b, 0x5c, 0x16, 0x1a, 0x5b, +0x17, 0x1b, 0x5a, 0x17, 0x1b, 0x59, 0x16, 0x1a, 0x58, 0x16, 0x1a, 0x57, +0x16, 0x1a, 0x56, 0x16, 0x1a, 0x56, 0x16, 0x1a, 0x55, 0x16, 0x1a, 0x54, +0x15, 0x1a, 0x53, 0x15, 0x1a, 0x52, 0x15, 0x1a, 0x52, 0x15, 0x1a, 0x51, +0x15, 0x19, 0x50, 0x15, 0x19, 0x4f, 0x15, 0x19, 0x4f, 0x14, 0x19, 0x4e, +0x14, 0x18, 0x4d, 0x14, 0x17, 0x4d, 0x13, 0x17, 0x4c, 0x13, 0x17, 0x4b, +0x13, 0x17, 0x4b, 0x12, 0x16, 0x4a, 0x12, 0x15, 0x48, 0x12, 0x15, 0x48, +0x11, 0x15, 0x47, 0x11, 0x15, 0x47, 0x11, 0x14, 0x47, 0x11, 0x14, 0x45, +0x10, 0x14, 0x45, 0x10, 0x14, 0x44, 0x10, 0x14, 0x44, 0x10, 0x13, 0x43, +0x10, 0x13, 0x43, 0x10, 0x13, 0x43, 0x10, 0x13, 0x42, 0x0f, 0x12, 0x41, +0x0f, 0x12, 0x41, 0x0f, 0x12, 0x40, 0x0f, 0x12, 0x40, 0x0e, 0x11, 0x3f, +0x0e, 0x11, 0x3f, 0x0e, 0x11, 0x3e, 0x0e, 0x11, 0x3e, 0x0e, 0x11, 0x3e, +0x0e, 0x11, 0x3d, 0x0e, 0x11, 0x3d, 0x0d, 0x0f, 0x36, 0x01, 0x01, 0x05, +0x13, 0x17, 0x45, 0x27, 0x2e, 0x8b, 0x28, 0x2f, 0x93, 0x22, 0x28, 0x7c, +0x1f, 0x24, 0x74, 0x1f, 0x24, 0x75, 0x1f, 0x25, 0x77, 0x1f, 0x25, 0x78, +0x20, 0x26, 0x79, 0x21, 0x28, 0x7b, 0x22, 0x29, 0x7d, 0x23, 0x29, 0x7f, +0x25, 0x2b, 0x80, 0x26, 0x2d, 0x82, 0x27, 0x2e, 0x84, 0x29, 0x30, 0x86, +0x2b, 0x31, 0x87, 0x2d, 0x34, 0x89, 0x30, 0x37, 0x8b, 0x33, 0x3b, 0x8d, +0x35, 0x3e, 0x8f, 0x3a, 0x41, 0x91, 0x37, 0x3f, 0x85, 0x36, 0x3f, 0x81, +0x3c, 0x44, 0x98, 0x38, 0x40, 0x9a, 0x34, 0x3d, 0x9d, 0x32, 0x3a, 0x9f, +0x2e, 0x36, 0xa1, 0x30, 0x37, 0xa4, 0x34, 0x3d, 0xa6, 0x3b, 0x44, 0xa8, +0x42, 0x4c, 0xac, 0x4b, 0x56, 0xae, 0x40, 0x4a, 0xb1, 0x35, 0x3e, 0xb4, +0x2b, 0x34, 0xb7, 0x26, 0x2e, 0xba, 0x2a, 0x33, 0xbe, 0x32, 0x3c, 0xc1, +0x3f, 0x4a, 0xc4, 0x4a, 0x56, 0xc7, 0x4e, 0x5a, 0xcb, 0x52, 0x5e, 0xce, +0x54, 0x62, 0xd1, 0x57, 0x63, 0xd3, 0x59, 0x66, 0xd7, 0x50, 0x5c, 0xdc, +0x44, 0x51, 0xe0, 0x3e, 0x49, 0xe3, 0x3a, 0x45, 0xe5, 0x3e, 0x4a, 0xe6, +0x56, 0x63, 0xc3, 0x14, 0x19, 0x39, 0x50, 0x5c, 0xae, 0x53, 0x61, 0xe7, +0x46, 0x53, 0xe6, 0x56, 0x65, 0xe5, 0x17, 0x1d, 0x3f, 0x17, 0x1d, 0x3f, +0x17, 0x1d, 0x40, 0x17, 0x1d, 0x40, 0x41, 0x4c, 0x8e, 0x5e, 0x6d, 0xe2, +0x51, 0x5e, 0xb7, 0x56, 0x66, 0xe1, 0x53, 0x63, 0xe1, 0x2a, 0x32, 0x61, +0x4b, 0x58, 0xa9, 0x5c, 0x6c, 0xdf, 0x56, 0x66, 0xdf, 0x4d, 0x5c, 0xdf, +0x52, 0x61, 0xc2, 0x12, 0x18, 0x3b, 0x49, 0x56, 0xa9, 0x55, 0x65, 0xcf, +0x18, 0x1f, 0x45, 0x51, 0x5f, 0xc0, 0x51, 0x60, 0xde, 0x59, 0x68, 0xdd, +0x4c, 0x58, 0xb1, 0x3a, 0x44, 0x85, 0x48, 0x53, 0xa6, 0x57, 0x65, 0xdf, +0x50, 0x5e, 0xe0, 0x4f, 0x5d, 0xe0, 0x4e, 0x5a, 0xdd, 0x48, 0x54, 0xda, +0x45, 0x50, 0xd8, 0x49, 0x55, 0xd5, 0x4f, 0x5b, 0xd2, 0x54, 0x61, 0xcf, +0x4a, 0x55, 0xa9, 0x38, 0x40, 0x7a, 0x2e, 0x36, 0x65, 0x4b, 0x56, 0xad, +0x49, 0x54, 0xc1, 0x3f, 0x4a, 0xbd, 0x3f, 0x49, 0xbb, 0x42, 0x4c, 0xb8, +0x45, 0x4f, 0xb5, 0x48, 0x52, 0xb1, 0x42, 0x4b, 0xaf, 0x3b, 0x43, 0xac, +0x34, 0x3d, 0xa9, 0x2f, 0x38, 0xa7, 0x2b, 0x33, 0xa4, 0x2b, 0x32, 0xa1, +0x2b, 0x33, 0x9f, 0x2b, 0x33, 0x9c, 0x2c, 0x33, 0x9a, 0x2c, 0x33, 0x98, +0x2c, 0x33, 0x95, 0x2c, 0x33, 0x93, 0x2c, 0x32, 0x91, 0x2b, 0x32, 0x8f, +0x2b, 0x32, 0x8c, 0x2b, 0x32, 0x8a, 0x2b, 0x32, 0x89, 0x2a, 0x31, 0x87, +0x29, 0x30, 0x85, 0x28, 0x2f, 0x83, 0x27, 0x2e, 0x81, 0x26, 0x2d, 0x7f, +0x25, 0x2c, 0x7e, 0x24, 0x2b, 0x7c, 0x24, 0x2a, 0x7a, 0x23, 0x29, 0x79, +0x22, 0x28, 0x77, 0x21, 0x27, 0x75, 0x20, 0x25, 0x74, 0x1f, 0x25, 0x72, +0x1e, 0x24, 0x71, 0x1e, 0x22, 0x6f, 0x1d, 0x21, 0x6e, 0x1c, 0x20, 0x6c, +0x1b, 0x20, 0x6c, 0x1a, 0x20, 0x6b, 0x1a, 0x1e, 0x69, 0x19, 0x1e, 0x68, +0x18, 0x1d, 0x67, 0x18, 0x1d, 0x66, 0x18, 0x1c, 0x65, 0x17, 0x1c, 0x63, +0x18, 0x1b, 0x62, 0x17, 0x1c, 0x61, 0x18, 0x1c, 0x60, 0x18, 0x1c, 0x5f, +0x17, 0x1b, 0x5e, 0x17, 0x1c, 0x5d, 0x17, 0x1c, 0x5c, 0x17, 0x1b, 0x5b, +0x18, 0x1c, 0x5a, 0x18, 0x1c, 0x59, 0x18, 0x1c, 0x58, 0x17, 0x1b, 0x57, +0x17, 0x1c, 0x57, 0x17, 0x1b, 0x56, 0x17, 0x1b, 0x55, 0x16, 0x1b, 0x54, +0x16, 0x1a, 0x53, 0x16, 0x1a, 0x53, 0x15, 0x1a, 0x52, 0x15, 0x1a, 0x51, +0x15, 0x19, 0x50, 0x15, 0x19, 0x50, 0x14, 0x19, 0x4f, 0x14, 0x19, 0x4e, +0x14, 0x18, 0x4d, 0x13, 0x17, 0x4d, 0x13, 0x17, 0x4c, 0x13, 0x16, 0x4b, +0x13, 0x16, 0x4b, 0x12, 0x16, 0x4a, 0x12, 0x15, 0x49, 0x11, 0x15, 0x48, +0x11, 0x15, 0x47, 0x11, 0x15, 0x47, 0x11, 0x14, 0x47, 0x11, 0x14, 0x47, +0x10, 0x14, 0x45, 0x10, 0x13, 0x44, 0x10, 0x13, 0x44, 0x10, 0x13, 0x43, +0x10, 0x13, 0x43, 0x10, 0x12, 0x43, 0x0f, 0x12, 0x42, 0x0f, 0x12, 0x41, +0x0f, 0x12, 0x41, 0x0f, 0x12, 0x40, 0x0f, 0x12, 0x40, 0x0e, 0x11, 0x3f, +0x0e, 0x11, 0x3f, 0x0e, 0x11, 0x3f, 0x0e, 0x11, 0x3e, 0x0e, 0x11, 0x3e, +0x0d, 0x10, 0x3d, 0x0d, 0x10, 0x3d, 0x0d, 0x0f, 0x36, 0x01, 0x01, 0x05, +0x14, 0x17, 0x45, 0x29, 0x31, 0x8d, 0x29, 0x32, 0x93, 0x24, 0x2a, 0x7d, +0x1f, 0x26, 0x74, 0x20, 0x26, 0x76, 0x20, 0x26, 0x77, 0x20, 0x26, 0x78, +0x20, 0x26, 0x7a, 0x20, 0x26, 0x7c, 0x21, 0x28, 0x7e, 0x22, 0x29, 0x7f, +0x24, 0x2a, 0x80, 0x25, 0x2b, 0x82, 0x26, 0x2d, 0x85, 0x27, 0x2e, 0x87, +0x29, 0x31, 0x89, 0x2b, 0x32, 0x8a, 0x2d, 0x34, 0x8c, 0x30, 0x37, 0x8f, +0x32, 0x3a, 0x90, 0x36, 0x3e, 0x93, 0x3a, 0x41, 0x94, 0x3b, 0x44, 0x92, +0x36, 0x3e, 0x7f, 0x36, 0x3f, 0x81, 0x3e, 0x48, 0x9e, 0x3a, 0x44, 0xa1, +0x36, 0x3f, 0xa3, 0x32, 0x3b, 0xa6, 0x2f, 0x37, 0xa8, 0x34, 0x3c, 0xab, +0x39, 0x43, 0xad, 0x42, 0x4b, 0xb0, 0x4b, 0x56, 0xb3, 0x49, 0x54, 0xb6, +0x3a, 0x44, 0xba, 0x2f, 0x39, 0xbd, 0x28, 0x31, 0xc0, 0x2a, 0x32, 0xc3, +0x32, 0x3c, 0xc6, 0x40, 0x4a, 0xc9, 0x4d, 0x59, 0xcd, 0x52, 0x5e, 0xd1, +0x56, 0x63, 0xd4, 0x56, 0x62, 0xce, 0x57, 0x65, 0xd1, 0x57, 0x64, 0xce, +0x52, 0x5e, 0xe4, 0x46, 0x53, 0xe5, 0x41, 0x4d, 0xe5, 0x3d, 0x49, 0xe5, +0x4d, 0x5c, 0xe5, 0x16, 0x1b, 0x3b, 0x16, 0x1c, 0x3d, 0x60, 0x6f, 0xe0, +0x51, 0x5f, 0xe6, 0x4b, 0x5a, 0xe5, 0x19, 0x1e, 0x42, 0x19, 0x1f, 0x43, +0x19, 0x1e, 0x43, 0x19, 0x1e, 0x43, 0x19, 0x1e, 0x43, 0x57, 0x66, 0xc8, +0x44, 0x4f, 0x96, 0x5d, 0x6d, 0xe0, 0x58, 0x68, 0xe0, 0x18, 0x1e, 0x44, +0x3e, 0x4a, 0x8c, 0x53, 0x63, 0xc3, 0x5b, 0x6b, 0xdf, 0x51, 0x61, 0xde, +0x24, 0x2c, 0x5a, 0x14, 0x19, 0x3e, 0x51, 0x5f, 0xc1, 0x36, 0x40, 0x7c, +0x11, 0x17, 0x3a, 0x54, 0x64, 0xcd, 0x57, 0x67, 0xd8, 0x46, 0x53, 0xa3, +0x2e, 0x37, 0x6d, 0x23, 0x2a, 0x57, 0x4c, 0x58, 0xb1, 0x57, 0x65, 0xdf, +0x55, 0x63, 0xe0, 0x53, 0x60, 0xe2, 0x4d, 0x5a, 0xe1, 0x48, 0x55, 0xdf, +0x4c, 0x58, 0xdc, 0x51, 0x5e, 0xd9, 0x58, 0x65, 0xd6, 0x47, 0x52, 0x9f, +0x31, 0x38, 0x6a, 0x2e, 0x36, 0x65, 0x4f, 0x5a, 0xb7, 0x4a, 0x55, 0xc6, +0x40, 0x4b, 0xc4, 0x44, 0x4e, 0xc0, 0x47, 0x52, 0xbd, 0x4a, 0x55, 0xba, +0x4c, 0x56, 0xb7, 0x41, 0x4b, 0xb4, 0x3a, 0x43, 0xb0, 0x33, 0x3c, 0xae, +0x2e, 0x36, 0xab, 0x2d, 0x35, 0xa8, 0x2d, 0x35, 0xa5, 0x2d, 0x36, 0xa3, +0x2e, 0x35, 0xa0, 0x2e, 0x35, 0x9e, 0x2e, 0x35, 0x9b, 0x2e, 0x36, 0x99, +0x2d, 0x35, 0x96, 0x2d, 0x35, 0x94, 0x2d, 0x35, 0x92, 0x2d, 0x35, 0x90, +0x2c, 0x34, 0x8d, 0x2d, 0x33, 0x8b, 0x2c, 0x32, 0x89, 0x2a, 0x31, 0x88, +0x29, 0x30, 0x86, 0x28, 0x2f, 0x83, 0x27, 0x2d, 0x81, 0x26, 0x2d, 0x80, +0x25, 0x2b, 0x7e, 0x24, 0x2a, 0x7d, 0x23, 0x2a, 0x7b, 0x22, 0x28, 0x79, +0x21, 0x27, 0x78, 0x20, 0x25, 0x76, 0x1f, 0x24, 0x74, 0x1e, 0x23, 0x73, +0x1d, 0x22, 0x71, 0x1c, 0x22, 0x70, 0x1c, 0x21, 0x6e, 0x1b, 0x20, 0x6d, +0x1a, 0x1f, 0x6c, 0x1a, 0x1f, 0x6b, 0x19, 0x1e, 0x69, 0x19, 0x1e, 0x69, +0x18, 0x1d, 0x67, 0x19, 0x1d, 0x66, 0x19, 0x1d, 0x65, 0x19, 0x1d, 0x64, +0x19, 0x1d, 0x63, 0x19, 0x1d, 0x62, 0x19, 0x1d, 0x61, 0x19, 0x1d, 0x5f, +0x19, 0x1d, 0x5e, 0x18, 0x1d, 0x5d, 0x18, 0x1d, 0x5c, 0x18, 0x1d, 0x5b, +0x19, 0x1d, 0x5a, 0x18, 0x1d, 0x5a, 0x18, 0x1d, 0x59, 0x18, 0x1d, 0x58, +0x17, 0x1c, 0x57, 0x17, 0x1c, 0x56, 0x17, 0x1c, 0x55, 0x16, 0x1b, 0x54, +0x16, 0x1a, 0x54, 0x16, 0x1a, 0x53, 0x15, 0x1a, 0x52, 0x15, 0x1a, 0x51, +0x15, 0x19, 0x50, 0x14, 0x19, 0x50, 0x14, 0x19, 0x4f, 0x14, 0x18, 0x4e, +0x14, 0x18, 0x4e, 0x13, 0x17, 0x4c, 0x13, 0x16, 0x4c, 0x13, 0x16, 0x4c, +0x12, 0x16, 0x4b, 0x12, 0x16, 0x4a, 0x12, 0x15, 0x49, 0x11, 0x15, 0x48, +0x11, 0x15, 0x47, 0x11, 0x15, 0x47, 0x11, 0x14, 0x47, 0x11, 0x14, 0x47, +0x10, 0x14, 0x45, 0x10, 0x14, 0x45, 0x10, 0x13, 0x44, 0x10, 0x13, 0x44, +0x10, 0x13, 0x43, 0x10, 0x12, 0x43, 0x0f, 0x12, 0x42, 0x0f, 0x12, 0x41, +0x0f, 0x12, 0x41, 0x0e, 0x12, 0x40, 0x0e, 0x12, 0x40, 0x0e, 0x12, 0x40, +0x0e, 0x11, 0x3f, 0x0e, 0x11, 0x3f, 0x0e, 0x11, 0x3e, 0x0e, 0x11, 0x3e, +0x0d, 0x10, 0x3d, 0x0d, 0x10, 0x3d, 0x0d, 0x0f, 0x36, 0x01, 0x01, 0x05, +0x15, 0x18, 0x46, 0x2b, 0x31, 0x8d, 0x2c, 0x34, 0x94, 0x25, 0x2a, 0x7d, +0x21, 0x27, 0x75, 0x22, 0x27, 0x76, 0x22, 0x28, 0x77, 0x22, 0x28, 0x79, +0x22, 0x28, 0x7b, 0x21, 0x28, 0x7d, 0x21, 0x28, 0x7e, 0x21, 0x28, 0x80, +0x22, 0x29, 0x81, 0x23, 0x2a, 0x83, 0x25, 0x2b, 0x85, 0x26, 0x2d, 0x88, +0x28, 0x2f, 0x89, 0x29, 0x31, 0x8b, 0x2b, 0x32, 0x8d, 0x2d, 0x34, 0x8f, +0x2f, 0x37, 0x91, 0x31, 0x3a, 0x94, 0x36, 0x3e, 0x96, 0x39, 0x41, 0x98, +0x3d, 0x45, 0x9a, 0x3a, 0x43, 0x8c, 0x33, 0x3a, 0x76, 0x37, 0x3f, 0x81, +0x41, 0x4b, 0xa5, 0x3c, 0x45, 0xa7, 0x38, 0x41, 0xa9, 0x34, 0x3c, 0xac, +0x32, 0x3b, 0xb0, 0x38, 0x42, 0xb2, 0x40, 0x4a, 0xb5, 0x4a, 0x55, 0xb8, +0x55, 0x61, 0xbc, 0x42, 0x4d, 0xbf, 0x34, 0x3e, 0xc2, 0x2a, 0x33, 0xc5, +0x28, 0x33, 0xc9, 0x32, 0x3c, 0xcd, 0x40, 0x4b, 0xd0, 0x52, 0x5e, 0xd4, +0x56, 0x63, 0xd7, 0x58, 0x65, 0xd5, 0x57, 0x63, 0xce, 0x58, 0x65, 0xce, +0x57, 0x63, 0xc8, 0x54, 0x63, 0xe4, 0x4a, 0x57, 0xe4, 0x44, 0x51, 0xe4, +0x41, 0x4d, 0xe4, 0x57, 0x65, 0xc7, 0x17, 0x1d, 0x3f, 0x1c, 0x22, 0x47, +0x5f, 0x6f, 0xe6, 0x4f, 0x5d, 0xe5, 0x4f, 0x5c, 0xae, 0x1b, 0x20, 0x46, +0x1b, 0x20, 0x46, 0x1b, 0x20, 0x47, 0x1a, 0x20, 0x47, 0x49, 0x56, 0xa2, +0x33, 0x3d, 0x75, 0x51, 0x60, 0xb7, 0x5c, 0x6d, 0xdf, 0x1a, 0x20, 0x48, +0x28, 0x31, 0x61, 0x46, 0x54, 0x9f, 0x54, 0x63, 0xc5, 0x55, 0x65, 0xdd, +0x16, 0x1c, 0x42, 0x15, 0x1b, 0x41, 0x49, 0x57, 0xac, 0x13, 0x19, 0x3e, +0x20, 0x27, 0x54, 0x53, 0x63, 0xcd, 0x3f, 0x4b, 0x93, 0x24, 0x2c, 0x5a, +0x0f, 0x14, 0x36, 0x2a, 0x32, 0x66, 0x50, 0x5e, 0xc0, 0x58, 0x67, 0xd9, +0x59, 0x68, 0xe0, 0x53, 0x61, 0xe2, 0x4d, 0x5b, 0xe3, 0x4e, 0x5c, 0xe3, +0x56, 0x63, 0xe0, 0x59, 0x67, 0xd4, 0x45, 0x4f, 0x97, 0x2a, 0x31, 0x5c, +0x2f, 0x36, 0x65, 0x54, 0x60, 0xc4, 0x4b, 0x56, 0xcd, 0x44, 0x4f, 0xc9, +0x48, 0x53, 0xc6, 0x4c, 0x57, 0xc3, 0x50, 0x5b, 0xbf, 0x4b, 0x56, 0xbc, +0x40, 0x4a, 0xb8, 0x38, 0x41, 0xb5, 0x32, 0x3c, 0xb3, 0x2e, 0x37, 0xaf, +0x2e, 0x37, 0xac, 0x2f, 0x38, 0xaa, 0x30, 0x38, 0xa7, 0x30, 0x38, 0xa4, +0x30, 0x38, 0xa1, 0x30, 0x39, 0x9f, 0x30, 0x38, 0x9c, 0x30, 0x38, 0x9a, +0x30, 0x37, 0x98, 0x2f, 0x36, 0x95, 0x2f, 0x36, 0x92, 0x2f, 0x36, 0x91, +0x2d, 0x34, 0x8e, 0x2d, 0x33, 0x8c, 0x2b, 0x32, 0x8a, 0x2a, 0x30, 0x88, +0x28, 0x2f, 0x86, 0x27, 0x2f, 0x84, 0x26, 0x2d, 0x82, 0x25, 0x2c, 0x80, +0x24, 0x2a, 0x7e, 0x23, 0x29, 0x7d, 0x22, 0x28, 0x7c, 0x21, 0x26, 0x7a, +0x20, 0x25, 0x78, 0x1f, 0x24, 0x77, 0x1e, 0x24, 0x75, 0x1d, 0x22, 0x73, +0x1c, 0x22, 0x72, 0x1b, 0x21, 0x70, 0x1b, 0x21, 0x6f, 0x1a, 0x20, 0x6d, +0x1a, 0x1f, 0x6c, 0x1a, 0x1f, 0x6b, 0x1a, 0x1e, 0x69, 0x1a, 0x1f, 0x69, +0x1a, 0x1f, 0x68, 0x1a, 0x1f, 0x66, 0x1a, 0x1f, 0x65, 0x1a, 0x1e, 0x64, +0x1a, 0x1e, 0x63, 0x1a, 0x1e, 0x62, 0x1a, 0x1e, 0x61, 0x1a, 0x1e, 0x60, +0x1a, 0x1f, 0x5f, 0x1a, 0x1e, 0x5e, 0x19, 0x1f, 0x5d, 0x19, 0x1f, 0x5c, +0x19, 0x1e, 0x5b, 0x19, 0x1e, 0x5a, 0x18, 0x1d, 0x59, 0x18, 0x1d, 0x58, +0x17, 0x1c, 0x57, 0x17, 0x1c, 0x56, 0x16, 0x1b, 0x55, 0x16, 0x1b, 0x55, +0x16, 0x1b, 0x54, 0x15, 0x1a, 0x53, 0x15, 0x1a, 0x52, 0x15, 0x1a, 0x51, +0x15, 0x19, 0x51, 0x14, 0x19, 0x50, 0x14, 0x18, 0x4f, 0x13, 0x18, 0x4e, +0x13, 0x18, 0x4e, 0x13, 0x16, 0x4c, 0x12, 0x16, 0x4c, 0x12, 0x16, 0x4c, +0x12, 0x16, 0x4b, 0x12, 0x16, 0x4a, 0x12, 0x16, 0x4a, 0x11, 0x15, 0x48, +0x11, 0x14, 0x48, 0x11, 0x14, 0x47, 0x11, 0x14, 0x47, 0x11, 0x14, 0x47, +0x10, 0x13, 0x45, 0x10, 0x13, 0x45, 0x10, 0x13, 0x44, 0x10, 0x13, 0x44, +0x10, 0x13, 0x43, 0x10, 0x12, 0x43, 0x0f, 0x12, 0x42, 0x0f, 0x12, 0x42, +0x0f, 0x12, 0x41, 0x0e, 0x12, 0x41, 0x0e, 0x11, 0x40, 0x0e, 0x11, 0x40, +0x0e, 0x11, 0x3f, 0x0e, 0x11, 0x3f, 0x0e, 0x11, 0x3e, 0x0e, 0x11, 0x3e, +0x0d, 0x10, 0x3d, 0x0d, 0x10, 0x3d, 0x0d, 0x0f, 0x37, 0x01, 0x01, 0x05, +0x14, 0x18, 0x46, 0x2b, 0x31, 0x8e, 0x2d, 0x34, 0x94, 0x27, 0x2c, 0x7e, +0x23, 0x28, 0x75, 0x23, 0x29, 0x77, 0x24, 0x29, 0x78, 0x24, 0x2a, 0x7a, +0x24, 0x29, 0x7b, 0x23, 0x2a, 0x7d, 0x23, 0x2a, 0x7f, 0x24, 0x2a, 0x81, +0x24, 0x2a, 0x82, 0x23, 0x2a, 0x84, 0x23, 0x2a, 0x86, 0x25, 0x2b, 0x88, +0x27, 0x2d, 0x8a, 0x27, 0x2e, 0x8c, 0x29, 0x30, 0x8e, 0x2b, 0x32, 0x90, +0x2d, 0x34, 0x93, 0x2f, 0x37, 0x94, 0x31, 0x3a, 0x97, 0x34, 0x3c, 0x99, +0x38, 0x40, 0x9c, 0x3c, 0x45, 0x9e, 0x3f, 0x48, 0x9b, 0x39, 0x41, 0x87, +0x31, 0x38, 0x70, 0x38, 0x40, 0x83, 0x44, 0x4e, 0xab, 0x3f, 0x48, 0xae, +0x39, 0x43, 0xb1, 0x33, 0x3c, 0xb4, 0x37, 0x41, 0xb7, 0x3f, 0x4a, 0xba, +0x49, 0x54, 0xbe, 0x56, 0x62, 0xc1, 0x4d, 0x58, 0xc4, 0x3b, 0x46, 0xc8, +0x2e, 0x38, 0xcc, 0x29, 0x32, 0xcf, 0x30, 0x3b, 0xd3, 0x40, 0x4b, 0xd7, +0x55, 0x62, 0xda, 0x5a, 0x68, 0xdf, 0x58, 0x65, 0xd1, 0x51, 0x5d, 0xb9, +0x4b, 0x56, 0xa7, 0x4c, 0x59, 0xab, 0x59, 0x67, 0xe3, 0x4c, 0x5b, 0xe3, +0x47, 0x55, 0xe3, 0x4c, 0x5a, 0xe4, 0x18, 0x1e, 0x41, 0x1a, 0x1f, 0x44, +0x3e, 0x49, 0x85, 0x5b, 0x6c, 0xe5, 0x5b, 0x6c, 0xe4, 0x1d, 0x23, 0x4a, +0x1d, 0x23, 0x4b, 0x1d, 0x23, 0x4b, 0x1d, 0x23, 0x4c, 0x25, 0x2d, 0x5b, +0x25, 0x2d, 0x5b, 0x39, 0x44, 0x80, 0x56, 0x66, 0xc7, 0x1b, 0x22, 0x4c, +0x1b, 0x21, 0x4b, 0x36, 0x40, 0x7b, 0x4b, 0x59, 0xac, 0x50, 0x60, 0xbe, +0x17, 0x1d, 0x46, 0x16, 0x1c, 0x45, 0x22, 0x2a, 0x59, 0x14, 0x1a, 0x41, +0x2d, 0x36, 0x6d, 0x3b, 0x46, 0x89, 0x15, 0x1b, 0x42, 0x10, 0x16, 0x3a, +0x10, 0x15, 0x38, 0x33, 0x3e, 0x79, 0x49, 0x55, 0xaa, 0x50, 0x5e, 0xbd, +0x5a, 0x69, 0xe0, 0x54, 0x62, 0xe2, 0x54, 0x62, 0xe3, 0x5c, 0x69, 0xe4, +0x59, 0x66, 0xd0, 0x3f, 0x49, 0x8a, 0x1b, 0x20, 0x42, 0x30, 0x38, 0x69, +0x59, 0x65, 0xd1, 0x4d, 0x58, 0xd4, 0x49, 0x55, 0xd0, 0x4e, 0x58, 0xcc, +0x52, 0x5e, 0xc8, 0x57, 0x62, 0xc5, 0x4a, 0x54, 0xc2, 0x3f, 0x49, 0xbe, +0x37, 0x41, 0xbb, 0x31, 0x3a, 0xb7, 0x31, 0x39, 0xb4, 0x31, 0x3a, 0xb1, +0x32, 0x3a, 0xae, 0x32, 0x3b, 0xab, 0x33, 0x3b, 0xa8, 0x33, 0x3b, 0xa5, +0x33, 0x3a, 0xa3, 0x33, 0x3a, 0xa0, 0x32, 0x3a, 0x9e, 0x31, 0x3a, 0x9b, +0x31, 0x3a, 0x99, 0x30, 0x39, 0x96, 0x30, 0x37, 0x94, 0x2f, 0x35, 0x91, +0x2d, 0x33, 0x8f, 0x2b, 0x32, 0x8d, 0x2b, 0x31, 0x8b, 0x29, 0x30, 0x88, +0x28, 0x2f, 0x87, 0x27, 0x2e, 0x85, 0x25, 0x2c, 0x83, 0x24, 0x2b, 0x81, +0x23, 0x29, 0x7f, 0x21, 0x27, 0x7d, 0x21, 0x27, 0x7b, 0x20, 0x25, 0x7b, +0x1f, 0x24, 0x79, 0x1e, 0x24, 0x77, 0x1d, 0x23, 0x75, 0x1c, 0x22, 0x74, +0x1c, 0x21, 0x72, 0x1b, 0x21, 0x71, 0x1b, 0x20, 0x6f, 0x1b, 0x20, 0x6e, +0x1b, 0x20, 0x6c, 0x1b, 0x20, 0x6b, 0x1c, 0x20, 0x6a, 0x1b, 0x20, 0x68, +0x1b, 0x20, 0x68, 0x1c, 0x20, 0x66, 0x1c, 0x20, 0x66, 0x1c, 0x21, 0x65, +0x1b, 0x20, 0x63, 0x1a, 0x20, 0x62, 0x1a, 0x20, 0x61, 0x1a, 0x20, 0x60, +0x1b, 0x20, 0x5f, 0x1a, 0x20, 0x5e, 0x1a, 0x1f, 0x5d, 0x19, 0x1f, 0x5c, +0x19, 0x1e, 0x5b, 0x18, 0x1d, 0x5a, 0x18, 0x1d, 0x59, 0x17, 0x1c, 0x58, +0x17, 0x1c, 0x57, 0x16, 0x1c, 0x56, 0x16, 0x1b, 0x56, 0x16, 0x1b, 0x55, +0x16, 0x1a, 0x54, 0x15, 0x1a, 0x53, 0x15, 0x1a, 0x52, 0x15, 0x19, 0x52, +0x15, 0x19, 0x51, 0x14, 0x18, 0x4f, 0x13, 0x18, 0x4f, 0x13, 0x18, 0x4f, +0x13, 0x17, 0x4e, 0x13, 0x17, 0x4d, 0x12, 0x16, 0x4c, 0x12, 0x16, 0x4c, +0x12, 0x16, 0x4b, 0x12, 0x16, 0x4b, 0x12, 0x16, 0x4a, 0x11, 0x14, 0x48, +0x11, 0x14, 0x48, 0x11, 0x14, 0x47, 0x11, 0x14, 0x47, 0x11, 0x14, 0x47, +0x10, 0x13, 0x45, 0x10, 0x13, 0x45, 0x10, 0x13, 0x44, 0x10, 0x13, 0x44, +0x10, 0x12, 0x43, 0x10, 0x12, 0x43, 0x0f, 0x12, 0x42, 0x0f, 0x12, 0x42, +0x0e, 0x12, 0x41, 0x0e, 0x11, 0x41, 0x0e, 0x11, 0x40, 0x0e, 0x11, 0x40, +0x0e, 0x11, 0x3f, 0x0e, 0x11, 0x3f, 0x0d, 0x10, 0x3e, 0x0d, 0x10, 0x3e, +0x0d, 0x10, 0x3d, 0x0d, 0x10, 0x3d, 0x0d, 0x0f, 0x37, 0x01, 0x01, 0x05, +0x14, 0x17, 0x47, 0x28, 0x31, 0x8e, 0x2a, 0x32, 0x95, 0x25, 0x2b, 0x7e, +0x23, 0x28, 0x76, 0x24, 0x2a, 0x78, 0x26, 0x2b, 0x78, 0x26, 0x2b, 0x7a, +0x25, 0x2b, 0x7c, 0x26, 0x2b, 0x7e, 0x26, 0x2c, 0x80, 0x26, 0x2c, 0x81, +0x26, 0x2c, 0x83, 0x26, 0x2c, 0x85, 0x26, 0x2c, 0x87, 0x26, 0x2c, 0x89, +0x25, 0x2c, 0x8b, 0x26, 0x2d, 0x8d, 0x28, 0x2f, 0x8f, 0x29, 0x31, 0x91, +0x2b, 0x32, 0x94, 0x2d, 0x34, 0x95, 0x2f, 0x37, 0x98, 0x32, 0x39, 0x9a, +0x34, 0x3c, 0x9d, 0x37, 0x40, 0x9f, 0x3b, 0x44, 0xa2, 0x41, 0x49, 0xa5, +0x41, 0x49, 0x9c, 0x37, 0x3f, 0x7f, 0x29, 0x2f, 0x5d, 0x3b, 0x44, 0x89, +0x47, 0x52, 0xb3, 0x40, 0x4a, 0xb6, 0x3a, 0x44, 0xb9, 0x36, 0x40, 0xbc, +0x3d, 0x49, 0xc0, 0x48, 0x52, 0xc3, 0x55, 0x62, 0xc6, 0x5b, 0x68, 0xca, +0x44, 0x50, 0xce, 0x33, 0x3e, 0xd2, 0x28, 0x32, 0xd6, 0x30, 0x3a, 0xda, +0x3f, 0x4b, 0xde, 0x5a, 0x67, 0xe2, 0x57, 0x64, 0xce, 0x4b, 0x57, 0xaa, +0x3e, 0x47, 0x89, 0x33, 0x3c, 0x72, 0x3f, 0x4a, 0x8b, 0x5c, 0x6b, 0xe2, +0x51, 0x60, 0xe2, 0x4c, 0x5a, 0xe3, 0x5b, 0x6b, 0xd4, 0x1b, 0x21, 0x47, +0x1d, 0x23, 0x49, 0x4f, 0x5b, 0xaa, 0x58, 0x6a, 0xe4, 0x1f, 0x25, 0x4e, +0x1f, 0x26, 0x4f, 0x1f, 0x25, 0x4f, 0x1f, 0x26, 0x50, 0x1e, 0x25, 0x50, +0x1f, 0x25, 0x51, 0x1f, 0x25, 0x51, 0x4d, 0x5c, 0xad, 0x1e, 0x24, 0x50, +0x1d, 0x24, 0x50, 0x23, 0x2b, 0x5a, 0x3e, 0x4b, 0x8f, 0x22, 0x2a, 0x5a, +0x18, 0x1f, 0x4a, 0x17, 0x1e, 0x47, 0x16, 0x1c, 0x46, 0x15, 0x1b, 0x44, +0x36, 0x42, 0x81, 0x13, 0x19, 0x40, 0x12, 0x18, 0x3e, 0x11, 0x17, 0x3d, +0x10, 0x16, 0x3b, 0x31, 0x3a, 0x73, 0x3e, 0x4a, 0x8f, 0x4d, 0x5a, 0xb3, +0x5a, 0x6a, 0xe0, 0x5b, 0x6a, 0xe2, 0x58, 0x67, 0xd0, 0x4c, 0x58, 0xa9, +0x2e, 0x36, 0x66, 0x13, 0x17, 0x35, 0x31, 0x38, 0x6a, 0x5d, 0x6b, 0xdf, +0x4e, 0x5a, 0xdb, 0x4e, 0x5a, 0xd7, 0x54, 0x60, 0xd3, 0x5a, 0x66, 0xce, +0x56, 0x62, 0xcb, 0x48, 0x54, 0xc7, 0x3e, 0x48, 0xc4, 0x36, 0x40, 0xc0, +0x33, 0x3c, 0xbd, 0x33, 0x3d, 0xb9, 0x34, 0x3d, 0xb6, 0x34, 0x3e, 0xb3, +0x35, 0x3d, 0xaf, 0x36, 0x3e, 0xad, 0x35, 0x3e, 0xaa, 0x35, 0x3e, 0xa7, +0x35, 0x3e, 0xa4, 0x35, 0x3d, 0xa1, 0x35, 0x3d, 0x9e, 0x33, 0x3c, 0x9c, +0x32, 0x3a, 0x99, 0x30, 0x39, 0x97, 0x2f, 0x36, 0x95, 0x2e, 0x35, 0x92, +0x2c, 0x33, 0x90, 0x2b, 0x31, 0x8e, 0x2a, 0x31, 0x8c, 0x28, 0x30, 0x89, +0x26, 0x2d, 0x87, 0x25, 0x2c, 0x86, 0x24, 0x2a, 0x84, 0x23, 0x29, 0x82, +0x22, 0x27, 0x80, 0x21, 0x26, 0x7e, 0x1f, 0x25, 0x7c, 0x1e, 0x25, 0x7b, +0x1d, 0x23, 0x79, 0x1d, 0x23, 0x78, 0x1d, 0x23, 0x76, 0x1c, 0x22, 0x74, +0x1d, 0x22, 0x73, 0x1d, 0x22, 0x71, 0x1d, 0x22, 0x70, 0x1d, 0x22, 0x6e, +0x1d, 0x22, 0x6d, 0x1d, 0x22, 0x6b, 0x1d, 0x22, 0x6a, 0x1d, 0x22, 0x69, +0x1d, 0x22, 0x68, 0x1c, 0x22, 0x66, 0x1c, 0x22, 0x66, 0x1c, 0x22, 0x65, +0x1c, 0x21, 0x63, 0x1c, 0x21, 0x63, 0x1b, 0x21, 0x61, 0x1b, 0x20, 0x60, +0x1a, 0x20, 0x5f, 0x1a, 0x1f, 0x5e, 0x19, 0x1f, 0x5d, 0x19, 0x1e, 0x5c, +0x18, 0x1e, 0x5b, 0x18, 0x1d, 0x5a, 0x17, 0x1d, 0x59, 0x17, 0x1c, 0x58, +0x17, 0x1c, 0x57, 0x16, 0x1b, 0x57, 0x16, 0x1b, 0x56, 0x16, 0x1a, 0x55, +0x16, 0x1a, 0x54, 0x15, 0x1a, 0x53, 0x15, 0x19, 0x52, 0x14, 0x19, 0x52, +0x14, 0x19, 0x51, 0x13, 0x18, 0x4f, 0x13, 0x18, 0x4f, 0x13, 0x18, 0x4f, +0x13, 0x17, 0x4e, 0x13, 0x17, 0x4d, 0x12, 0x16, 0x4c, 0x12, 0x16, 0x4c, +0x12, 0x16, 0x4b, 0x12, 0x16, 0x4b, 0x12, 0x15, 0x4a, 0x11, 0x14, 0x48, +0x11, 0x14, 0x48, 0x11, 0x14, 0x47, 0x11, 0x14, 0x47, 0x11, 0x14, 0x47, +0x10, 0x13, 0x45, 0x10, 0x13, 0x45, 0x10, 0x12, 0x44, 0x10, 0x12, 0x44, +0x10, 0x12, 0x43, 0x10, 0x12, 0x43, 0x0f, 0x12, 0x43, 0x0e, 0x11, 0x42, +0x0e, 0x11, 0x41, 0x0e, 0x11, 0x41, 0x0e, 0x11, 0x40, 0x0e, 0x11, 0x40, +0x0e, 0x11, 0x3f, 0x0e, 0x11, 0x3f, 0x0d, 0x10, 0x3e, 0x0d, 0x10, 0x3e, +0x0d, 0x10, 0x3e, 0x0d, 0x10, 0x3d, 0x0d, 0x0f, 0x37, 0x01, 0x01, 0x05, +0x13, 0x17, 0x47, 0x27, 0x2f, 0x8f, 0x29, 0x32, 0x95, 0x24, 0x2b, 0x7f, +0x21, 0x27, 0x76, 0x22, 0x29, 0x78, 0x24, 0x2a, 0x79, 0x25, 0x2b, 0x7b, +0x26, 0x2c, 0x7d, 0x27, 0x2e, 0x7f, 0x27, 0x2e, 0x80, 0x27, 0x2e, 0x81, +0x27, 0x2e, 0x84, 0x27, 0x2f, 0x86, 0x28, 0x2f, 0x88, 0x27, 0x2e, 0x89, +0x28, 0x2e, 0x8c, 0x28, 0x2f, 0x8e, 0x28, 0x2f, 0x90, 0x28, 0x2e, 0x92, +0x29, 0x31, 0x95, 0x2b, 0x33, 0x97, 0x2d, 0x34, 0x99, 0x2e, 0x37, 0x9b, +0x31, 0x38, 0x9e, 0x33, 0x3d, 0xa1, 0x36, 0x3f, 0xa3, 0x3a, 0x44, 0xa6, +0x3f, 0x48, 0xa9, 0x44, 0x4e, 0xac, 0x3e, 0x47, 0x94, 0x33, 0x3a, 0x74, +0x23, 0x2a, 0x52, 0x3d, 0x46, 0x8d, 0x49, 0x54, 0xbb, 0x41, 0x4c, 0xbe, +0x3a, 0x45, 0xc2, 0x3c, 0x46, 0xc5, 0x46, 0x51, 0xc9, 0x53, 0x5f, 0xcc, +0x65, 0x73, 0xd0, 0x50, 0x5d, 0xd4, 0x3a, 0x44, 0xd8, 0x2a, 0x34, 0xdd, +0x2e, 0x39, 0xe1, 0x40, 0x4d, 0xe2, 0x56, 0x63, 0xcd, 0x49, 0x55, 0xa6, +0x34, 0x3d, 0x74, 0x21, 0x28, 0x52, 0x14, 0x19, 0x3c, 0x2f, 0x38, 0x6b, +0x5a, 0x69, 0xd6, 0x56, 0x65, 0xe1, 0x50, 0x60, 0xe2, 0x1c, 0x22, 0x4a, +0x1e, 0x24, 0x4c, 0x20, 0x27, 0x4f, 0x58, 0x68, 0xc1, 0x3f, 0x49, 0x87, +0x22, 0x29, 0x54, 0x22, 0x29, 0x55, 0x21, 0x28, 0x55, 0x22, 0x29, 0x56, +0x21, 0x28, 0x56, 0x21, 0x28, 0x56, 0x40, 0x4c, 0x8f, 0x20, 0x27, 0x55, +0x1f, 0x26, 0x55, 0x1e, 0x26, 0x54, 0x2f, 0x39, 0x71, 0x1c, 0x23, 0x50, +0x1a, 0x21, 0x4e, 0x19, 0x1f, 0x4c, 0x17, 0x1e, 0x49, 0x16, 0x1d, 0x48, +0x15, 0x1b, 0x45, 0x14, 0x1a, 0x43, 0x13, 0x19, 0x41, 0x12, 0x18, 0x3f, +0x11, 0x17, 0x3d, 0x20, 0x27, 0x54, 0x33, 0x3c, 0x76, 0x4e, 0x5c, 0xb4, +0x57, 0x66, 0xce, 0x49, 0x54, 0xa1, 0x34, 0x3d, 0x73, 0x15, 0x19, 0x39, +0x15, 0x19, 0x39, 0x30, 0x38, 0x67, 0x5f, 0x6e, 0xe6, 0x4d, 0x59, 0xe2, +0x55, 0x61, 0xdd, 0x5a, 0x66, 0xd7, 0x4a, 0x54, 0xa5, 0x54, 0x60, 0xd1, +0x46, 0x51, 0xcd, 0x3c, 0x47, 0xca, 0x34, 0x3e, 0xc6, 0x36, 0x40, 0xc2, +0x36, 0x40, 0xbe, 0x38, 0x40, 0xbb, 0x38, 0x41, 0xb8, 0x38, 0x42, 0xb4, +0x38, 0x41, 0xb1, 0x39, 0x42, 0xae, 0x39, 0x41, 0xab, 0x38, 0x41, 0xa8, +0x37, 0x41, 0xa5, 0x36, 0x3f, 0xa2, 0x35, 0x3c, 0x9f, 0x32, 0x3b, 0x9d, +0x31, 0x39, 0x9a, 0x30, 0x38, 0x98, 0x2e, 0x36, 0x96, 0x2d, 0x34, 0x93, +0x2c, 0x33, 0x91, 0x2a, 0x31, 0x8e, 0x3b, 0x42, 0x7e, 0x90, 0x8f, 0x41, +0xa5, 0xa3, 0x32, 0xa5, 0xa2, 0x31, 0x4d, 0x50, 0x69, 0x21, 0x27, 0x82, +0x20, 0x27, 0x80, 0x1f, 0x25, 0x7f, 0x1f, 0x24, 0x7d, 0x1e, 0x24, 0x7b, +0x1e, 0x24, 0x79, 0x1e, 0x24, 0x78, 0x1f, 0x24, 0x77, 0x1f, 0x24, 0x75, +0x1f, 0x24, 0x73, 0x1f, 0x24, 0x72, 0x1f, 0x24, 0x70, 0x1f, 0x24, 0x6f, +0x1e, 0x24, 0x6d, 0x1e, 0x24, 0x6c, 0x1e, 0x24, 0x6a, 0x1e, 0x24, 0x69, +0x1e, 0x24, 0x68, 0x1e, 0x24, 0x68, 0x1d, 0x22, 0x65, 0x1d, 0x22, 0x65, +0x1c, 0x21, 0x63, 0x1c, 0x21, 0x63, 0x1b, 0x21, 0x62, 0x1a, 0x20, 0x60, +0x1a, 0x1f, 0x5f, 0x1a, 0x1f, 0x5e, 0x19, 0x1e, 0x5d, 0x18, 0x1e, 0x5c, +0x18, 0x1d, 0x5b, 0x18, 0x1d, 0x5a, 0x18, 0x1d, 0x5a, 0x17, 0x1c, 0x59, +0x17, 0x1b, 0x58, 0x16, 0x1b, 0x57, 0x16, 0x1a, 0x56, 0x16, 0x1a, 0x55, +0x15, 0x19, 0x54, 0x14, 0x19, 0x53, 0x14, 0x19, 0x53, 0x14, 0x19, 0x52, +0x14, 0x18, 0x51, 0x13, 0x18, 0x4f, 0x13, 0x18, 0x4f, 0x13, 0x17, 0x4f, +0x13, 0x17, 0x4e, 0x13, 0x17, 0x4d, 0x12, 0x16, 0x4c, 0x12, 0x16, 0x4c, +0x12, 0x15, 0x4b, 0x12, 0x15, 0x4b, 0x12, 0x15, 0x4a, 0x11, 0x14, 0x49, +0x11, 0x14, 0x48, 0x11, 0x14, 0x47, 0x11, 0x14, 0x47, 0x11, 0x14, 0x47, +0x11, 0x14, 0x47, 0x10, 0x13, 0x45, 0x10, 0x12, 0x44, 0x10, 0x12, 0x44, +0x10, 0x12, 0x43, 0x10, 0x12, 0x43, 0x0f, 0x12, 0x43, 0x0e, 0x11, 0x42, +0x0e, 0x11, 0x41, 0x0e, 0x11, 0x41, 0x0e, 0x11, 0x40, 0x0e, 0x11, 0x40, +0x0e, 0x10, 0x3f, 0x0e, 0x10, 0x3f, 0x0d, 0x10, 0x3e, 0x0d, 0x10, 0x3e, +0x0d, 0x10, 0x3e, 0x0d, 0x10, 0x3d, 0x0d, 0x0f, 0x37, 0x01, 0x01, 0x05, +0x13, 0x16, 0x48, 0x27, 0x2d, 0x8f, 0x29, 0x31, 0x96, 0x23, 0x29, 0x7f, +0x20, 0x26, 0x77, 0x21, 0x28, 0x78, 0x22, 0x29, 0x7a, 0x24, 0x29, 0x7b, +0x24, 0x2a, 0x7d, 0x26, 0x2c, 0x7f, 0x27, 0x2d, 0x81, 0x28, 0x2f, 0x82, +0x29, 0x30, 0x84, 0x2a, 0x31, 0x86, 0x2b, 0x32, 0x89, 0x2b, 0x32, 0x8a, +0x2a, 0x32, 0x8c, 0x2a, 0x32, 0x8f, 0x2a, 0x32, 0x90, 0x2a, 0x32, 0x93, +0x2a, 0x32, 0x95, 0x2a, 0x32, 0x98, 0x2a, 0x32, 0x9a, 0x2d, 0x34, 0x9d, +0x2f, 0x37, 0x9f, 0x31, 0x38, 0xa2, 0x33, 0x3c, 0xa5, 0x36, 0x3f, 0xa7, +0x3a, 0x43, 0xab, 0x3d, 0x47, 0xad, 0x44, 0x4c, 0xb0, 0x47, 0x52, 0xae, +0x3d, 0x46, 0x8f, 0x2e, 0x35, 0x67, 0x22, 0x28, 0x50, 0x40, 0x49, 0x93, +0x4c, 0x58, 0xc4, 0x43, 0x4f, 0xc8, 0x3a, 0x46, 0xcb, 0x44, 0x4f, 0xcf, +0x51, 0x5e, 0xd3, 0x41, 0x4b, 0x94, 0x49, 0x54, 0xa8, 0x44, 0x4f, 0xe0, +0x30, 0x3b, 0xe1, 0x2f, 0x3a, 0xe1, 0x42, 0x4f, 0xe1, 0x4f, 0x5c, 0xb8, +0x31, 0x3a, 0x71, 0x17, 0x1c, 0x41, 0x15, 0x1a, 0x3d, 0x16, 0x1c, 0x40, +0x1f, 0x26, 0x50, 0x52, 0x61, 0xbc, 0x5b, 0x6b, 0xe1, 0x5f, 0x70, 0xe0, +0x1f, 0x26, 0x4f, 0x22, 0x29, 0x53, 0x24, 0x2b, 0x57, 0x5e, 0x70, 0xd6, +0x25, 0x2c, 0x5a, 0x25, 0x2c, 0x5a, 0x25, 0x2c, 0x5b, 0x24, 0x2c, 0x5b, +0x24, 0x2c, 0x5c, 0x24, 0x2b, 0x5c, 0x30, 0x3a, 0x72, 0x23, 0x2a, 0x5b, +0x22, 0x2a, 0x5b, 0x21, 0x28, 0x58, 0x1f, 0x26, 0x56, 0x1e, 0x25, 0x55, +0x1c, 0x23, 0x52, 0x1a, 0x21, 0x4f, 0x19, 0x20, 0x4d, 0x17, 0x1e, 0x4b, +0x16, 0x1d, 0x48, 0x15, 0x1c, 0x46, 0x14, 0x1a, 0x43, 0x13, 0x19, 0x42, +0x13, 0x19, 0x41, 0x14, 0x1a, 0x40, 0x34, 0x3e, 0x78, 0x48, 0x54, 0xa1, +0x34, 0x3e, 0x75, 0x16, 0x1c, 0x3e, 0x16, 0x1b, 0x3d, 0x17, 0x1c, 0x3c, +0x1e, 0x24, 0x48, 0x62, 0x70, 0xe6, 0x56, 0x63, 0xe7, 0x5c, 0x6a, 0xe5, +0x55, 0x61, 0xc1, 0x4f, 0x5a, 0xb2, 0x51, 0x5d, 0xd8, 0x43, 0x4f, 0xd4, +0x3a, 0x43, 0xcf, 0x38, 0x42, 0xcc, 0x39, 0x44, 0xc8, 0x3a, 0x44, 0xc4, +0x3c, 0x45, 0xc1, 0x3c, 0x45, 0xbd, 0x3c, 0x46, 0xba, 0x3c, 0x46, 0xb6, +0x3c, 0x45, 0xb2, 0x3c, 0x45, 0xaf, 0x3b, 0x45, 0xac, 0x39, 0x42, 0xa9, +0x37, 0x40, 0xa7, 0x36, 0x3e, 0xa3, 0x34, 0x3b, 0xa1, 0x33, 0x3a, 0x9e, +0x30, 0x38, 0x9c, 0x2f, 0x37, 0x99, 0x2e, 0x34, 0x96, 0x2b, 0x32, 0x94, +0x29, 0x31, 0x91, 0x66, 0x69, 0x61, 0xe6, 0xdf, 0x07, 0xe6, 0xdf, 0x07, +0xe6, 0xdf, 0x07, 0xe6, 0xdf, 0x07, 0xe6, 0xdf, 0x07, 0x62, 0x64, 0x59, +0x20, 0x27, 0x81, 0x21, 0x26, 0x7f, 0x21, 0x26, 0x7d, 0x20, 0x26, 0x7b, +0x21, 0x27, 0x7a, 0x20, 0x27, 0x78, 0x20, 0x26, 0x77, 0x20, 0x26, 0x75, +0x20, 0x27, 0x74, 0x21, 0x27, 0x72, 0x21, 0x26, 0x71, 0x20, 0x26, 0x6f, +0x21, 0x26, 0x6e, 0x20, 0x25, 0x6c, 0x20, 0x25, 0x6b, 0x1f, 0x24, 0x6a, +0x1e, 0x23, 0x68, 0x1e, 0x23, 0x67, 0x1d, 0x22, 0x66, 0x1c, 0x22, 0x65, +0x1c, 0x21, 0x64, 0x1b, 0x21, 0x63, 0x1a, 0x20, 0x62, 0x1a, 0x1f, 0x60, +0x19, 0x1f, 0x5f, 0x19, 0x1f, 0x5f, 0x19, 0x1d, 0x5e, 0x18, 0x1d, 0x5d, +0x18, 0x1d, 0x5c, 0x18, 0x1c, 0x5b, 0x17, 0x1c, 0x5a, 0x17, 0x1c, 0x59, +0x17, 0x1b, 0x58, 0x17, 0x1b, 0x57, 0x16, 0x1a, 0x56, 0x16, 0x1a, 0x55, +0x15, 0x19, 0x54, 0x15, 0x19, 0x54, 0x15, 0x19, 0x53, 0x14, 0x18, 0x52, +0x14, 0x18, 0x51, 0x14, 0x17, 0x50, 0x13, 0x17, 0x4f, 0x13, 0x17, 0x4f, +0x13, 0x17, 0x4e, 0x13, 0x16, 0x4e, 0x12, 0x16, 0x4c, 0x12, 0x16, 0x4c, +0x12, 0x16, 0x4c, 0x12, 0x15, 0x4b, 0x12, 0x15, 0x4a, 0x11, 0x14, 0x49, +0x11, 0x14, 0x48, 0x11, 0x14, 0x47, 0x11, 0x14, 0x47, 0x10, 0x14, 0x47, +0x10, 0x14, 0x47, 0x10, 0x12, 0x45, 0x10, 0x12, 0x45, 0x10, 0x12, 0x44, +0x10, 0x12, 0x43, 0x10, 0x12, 0x43, 0x0f, 0x12, 0x43, 0x0e, 0x11, 0x42, +0x0e, 0x11, 0x41, 0x0e, 0x11, 0x41, 0x0e, 0x11, 0x40, 0x0e, 0x11, 0x40, +0x0e, 0x10, 0x3f, 0x0e, 0x10, 0x3f, 0x0d, 0x10, 0x3f, 0x0d, 0x10, 0x3e, +0x0d, 0x10, 0x3e, 0x0d, 0x10, 0x3d, 0x0d, 0x0f, 0x37, 0x01, 0x01, 0x05, +0x13, 0x17, 0x48, 0x27, 0x2d, 0x90, 0x28, 0x2e, 0x96, 0x23, 0x28, 0x80, +0x20, 0x25, 0x78, 0x20, 0x26, 0x78, 0x21, 0x27, 0x7a, 0x22, 0x28, 0x7c, +0x23, 0x2a, 0x7e, 0x24, 0x2a, 0x80, 0x26, 0x2c, 0x81, 0x27, 0x2e, 0x83, +0x28, 0x2f, 0x85, 0x29, 0x31, 0x87, 0x2b, 0x32, 0x89, 0x2e, 0x34, 0x8b, +0x2d, 0x34, 0x8d, 0x2e, 0x34, 0x90, 0x2e, 0x35, 0x91, 0x2d, 0x34, 0x94, +0x2d, 0x34, 0x96, 0x2d, 0x34, 0x99, 0x2d, 0x35, 0x9b, 0x2d, 0x35, 0x9e, +0x2c, 0x35, 0xa0, 0x2f, 0x36, 0xa4, 0x30, 0x39, 0xa6, 0x33, 0x3c, 0xa9, +0x36, 0x3e, 0xab, 0x39, 0x42, 0xae, 0x3d, 0x46, 0xb1, 0x41, 0x4b, 0xb5, +0x69, 0x70, 0x91, 0x7a, 0x7f, 0x71, 0xac, 0xaa, 0x30, 0xa5, 0xa3, 0x21, +0xa3, 0xa0, 0x1d, 0xaf, 0xae, 0x38, 0xb3, 0xb3, 0x49, 0xaf, 0xaf, 0x4a, +0xae, 0xad, 0x4c, 0x80, 0x86, 0x93, 0x81, 0x87, 0x7e, 0x0d, 0x12, 0x30, +0x53, 0x61, 0xe0, 0x3a, 0x46, 0xe0, 0x30, 0x3c, 0xe0, 0x43, 0x51, 0xdf, +0x48, 0x55, 0xa6, 0x13, 0x19, 0x3c, 0x15, 0x1a, 0x3f, 0x16, 0x1c, 0x42, +0x18, 0x1e, 0x45, 0x1a, 0x21, 0x49, 0x4b, 0x58, 0xa7, 0x5c, 0x6c, 0xd6, +0x21, 0x28, 0x53, 0x24, 0x2b, 0x57, 0x27, 0x2e, 0x5b, 0x34, 0x3d, 0x72, +0x29, 0x30, 0x60, 0x29, 0x30, 0x61, 0x29, 0x30, 0x62, 0x28, 0x30, 0x62, +0x27, 0x2f, 0x62, 0x50, 0x55, 0x4e, 0x66, 0x69, 0x43, 0xa6, 0xa4, 0x25, +0xa5, 0xa3, 0x25, 0xa5, 0xa3, 0x24, 0xa4, 0xa2, 0x23, 0x8d, 0x8d, 0x2c, +0x60, 0x63, 0x3c, 0x32, 0x37, 0x4b, 0x1a, 0x21, 0x51, 0x19, 0x20, 0x4f, +0x17, 0x1e, 0x4c, 0x16, 0x1d, 0x49, 0x15, 0x1b, 0x47, 0x15, 0x1b, 0x46, +0x16, 0x1c, 0x45, 0x16, 0x1c, 0x44, 0x34, 0x3e, 0x78, 0x18, 0x1d, 0x43, +0x18, 0x1e, 0x42, 0x19, 0x1e, 0x41, 0x18, 0x1e, 0x40, 0x18, 0x1d, 0x3e, +0x5c, 0x6b, 0xd3, 0x60, 0x6e, 0xe7, 0x58, 0x65, 0xc8, 0x46, 0x50, 0x97, +0x5f, 0x6d, 0xe2, 0x4d, 0x5a, 0xdf, 0x40, 0x4b, 0xdb, 0x3a, 0x45, 0xd6, +0x3b, 0x46, 0xd2, 0x3c, 0x47, 0xce, 0x3e, 0x49, 0xca, 0x3f, 0x49, 0xc6, +0x3f, 0x49, 0xc2, 0x3f, 0x4b, 0xbf, 0x41, 0x4a, 0xbb, 0x40, 0x49, 0xb8, +0x40, 0x49, 0xb4, 0x3e, 0x47, 0xb0, 0x3a, 0x44, 0xad, 0x39, 0x41, 0xaa, +0x36, 0x3f, 0xa7, 0x35, 0x3d, 0xa5, 0x33, 0x3b, 0xa1, 0x31, 0x39, 0x9f, +0x2e, 0x36, 0x9c, 0x2c, 0x34, 0x9a, 0x2a, 0x32, 0x97, 0x28, 0x30, 0x95, +0x27, 0x2e, 0x92, 0xd0, 0xca, 0x16, 0xe6, 0xdf, 0x07, 0xe6, 0xdf, 0x07, +0xe6, 0xdf, 0x07, 0xe6, 0xdf, 0x07, 0xe6, 0xdf, 0x07, 0xcf, 0xca, 0x15, +0x22, 0x29, 0x82, 0x22, 0x29, 0x80, 0x22, 0x29, 0x7e, 0x22, 0x29, 0x7c, +0x23, 0x29, 0x7a, 0x23, 0x29, 0x78, 0x23, 0x29, 0x78, 0x23, 0x29, 0x76, +0x23, 0x28, 0x74, 0x23, 0x28, 0x73, 0x22, 0x28, 0x71, 0x21, 0x27, 0x6f, +0x21, 0x26, 0x6e, 0x20, 0x25, 0x6d, 0x1f, 0x24, 0x6b, 0x1e, 0x24, 0x6a, +0x1d, 0x23, 0x68, 0x1d, 0x23, 0x67, 0x1c, 0x22, 0x66, 0x1c, 0x22, 0x65, +0x1b, 0x21, 0x65, 0x1a, 0x20, 0x63, 0x19, 0x1f, 0x62, 0x19, 0x1f, 0x61, +0x19, 0x1e, 0x5f, 0x19, 0x1e, 0x5f, 0x19, 0x1d, 0x5e, 0x18, 0x1d, 0x5d, +0x18, 0x1c, 0x5c, 0x17, 0x1c, 0x5b, 0x17, 0x1c, 0x5a, 0x17, 0x1b, 0x59, +0x17, 0x1b, 0x58, 0x16, 0x1a, 0x57, 0x16, 0x1a, 0x56, 0x15, 0x19, 0x55, +0x15, 0x19, 0x55, 0x15, 0x18, 0x54, 0x15, 0x18, 0x53, 0x14, 0x18, 0x52, +0x14, 0x17, 0x51, 0x14, 0x17, 0x51, 0x13, 0x17, 0x50, 0x13, 0x17, 0x4f, +0x12, 0x16, 0x4e, 0x12, 0x16, 0x4e, 0x12, 0x16, 0x4c, 0x12, 0x15, 0x4c, +0x12, 0x15, 0x4c, 0x11, 0x15, 0x4b, 0x11, 0x15, 0x4a, 0x11, 0x14, 0x49, +0x11, 0x14, 0x48, 0x11, 0x14, 0x48, 0x10, 0x14, 0x47, 0x10, 0x13, 0x47, +0x10, 0x13, 0x47, 0x10, 0x12, 0x45, 0x10, 0x12, 0x45, 0x0f, 0x12, 0x44, +0x0f, 0x12, 0x44, 0x0f, 0x12, 0x43, 0x0f, 0x12, 0x43, 0x0e, 0x11, 0x42, +0x0e, 0x11, 0x41, 0x0e, 0x11, 0x41, 0x0e, 0x10, 0x40, 0x0e, 0x10, 0x40, +0x0e, 0x10, 0x40, 0x0e, 0x10, 0x3f, 0x0d, 0x10, 0x3f, 0x0d, 0x10, 0x3e, +0x0d, 0x10, 0x3e, 0x0d, 0x0f, 0x3d, 0x0d, 0x0f, 0x37, 0x01, 0x01, 0x05, +0x14, 0x17, 0x48, 0x28, 0x2f, 0x90, 0x29, 0x32, 0x97, 0x23, 0x2a, 0x80, +0x20, 0x26, 0x78, 0x20, 0x26, 0x79, 0x20, 0x27, 0x7b, 0x20, 0x26, 0x7c, +0x21, 0x28, 0x7e, 0x22, 0x29, 0x80, 0x24, 0x2a, 0x81, 0x25, 0x2b, 0x83, +0x26, 0x2d, 0x86, 0x28, 0x2e, 0x88, 0x29, 0x30, 0x8a, 0x2a, 0x32, 0x8c, +0x2d, 0x33, 0x8e, 0x2e, 0x35, 0x90, 0x30, 0x38, 0x92, 0x31, 0x39, 0x95, +0x31, 0x39, 0x97, 0x30, 0x39, 0x9a, 0x31, 0x39, 0x9c, 0x30, 0x39, 0x9f, +0x2f, 0x38, 0xa1, 0x2f, 0x38, 0xa4, 0x2f, 0x38, 0xa7, 0x30, 0x39, 0xaa, +0x32, 0x3b, 0xad, 0x70, 0x73, 0x77, 0xac, 0xaa, 0x40, 0xc7, 0xc5, 0x18, +0xd1, 0xca, 0x1a, 0xd7, 0xd0, 0x1c, 0xde, 0xd7, 0x1d, 0xcf, 0xc9, 0x1a, +0xdb, 0xd4, 0x1c, 0xdc, 0xda, 0x1d, 0xc7, 0xc5, 0x18, 0xcc, 0xc6, 0x19, +0xd7, 0xd5, 0x1c, 0xdf, 0xd9, 0x22, 0xd1, 0xcf, 0x1a, 0xdf, 0xd9, 0x22, +0xcd, 0xc7, 0x0b, 0x99, 0x9a, 0x3f, 0x69, 0x72, 0xaf, 0x33, 0x40, 0xde, +0x45, 0x53, 0xde, 0x3d, 0x48, 0x8b, 0x15, 0x1b, 0x40, 0x17, 0x1d, 0x44, +0x19, 0x1f, 0x47, 0x1b, 0x21, 0x4a, 0x1d, 0x24, 0x4e, 0x3a, 0x46, 0x82, +0x54, 0x63, 0xbc, 0x25, 0x2c, 0x5b, 0x29, 0x30, 0x60, 0x2d, 0x34, 0x65, +0x35, 0x3e, 0x74, 0x2d, 0x35, 0x69, 0x55, 0x5a, 0x53, 0x92, 0x93, 0x33, +0xd0, 0xcb, 0x12, 0xe6, 0xdf, 0x37, 0xe3, 0xe1, 0x32, 0xdf, 0xd9, 0x22, +0xe0, 0xd9, 0x23, 0xe0, 0xd9, 0x23, 0xde, 0xd8, 0x1f, 0xd4, 0xcd, 0x1b, +0xd9, 0xd2, 0x1c, 0xde, 0xdb, 0x1d, 0xb8, 0xb5, 0x18, 0x74, 0x75, 0x31, +0x18, 0x20, 0x4f, 0x17, 0x1e, 0x4c, 0x16, 0x1d, 0x4b, 0x17, 0x1e, 0x4a, +0x18, 0x1f, 0x4a, 0x19, 0x1f, 0x49, 0x1a, 0x20, 0x48, 0x1b, 0x21, 0x48, +0x1b, 0x21, 0x47, 0x1b, 0x21, 0x45, 0x1a, 0x1f, 0x43, 0x56, 0x63, 0xbe, +0x50, 0x5c, 0xaf, 0x38, 0x41, 0x78, 0x2a, 0x31, 0x5d, 0x5d, 0x6b, 0xe7, +0x49, 0x55, 0xe6, 0x3c, 0x47, 0xe1, 0x3e, 0x49, 0xdd, 0x40, 0x4b, 0xd8, +0x42, 0x4d, 0xd4, 0x43, 0x4e, 0xd0, 0x43, 0x4f, 0xcc, 0x44, 0x4f, 0xc8, +0x45, 0x4f, 0xc4, 0x44, 0x4e, 0xc0, 0x43, 0x4e, 0xbc, 0x41, 0x4b, 0xb9, +0x3f, 0x47, 0xb5, 0x3b, 0x45, 0xb2, 0x39, 0x42, 0xae, 0x38, 0x40, 0xab, +0x35, 0x3e, 0xa8, 0x34, 0x3b, 0xa5, 0x30, 0x38, 0xa2, 0x2e, 0x36, 0x9f, +0x2c, 0x34, 0x9d, 0x29, 0x31, 0x9a, 0x27, 0x2f, 0x98, 0x27, 0x2d, 0x95, +0x65, 0x67, 0x64, 0xe6, 0xdf, 0x07, 0xe6, 0xdf, 0x07, 0xe6, 0xdf, 0x07, +0xe6, 0xdf, 0x07, 0xe6, 0xdf, 0x07, 0xe6, 0xdf, 0x07, 0xe6, 0xdf, 0x07, +0x25, 0x2b, 0x82, 0x26, 0x2c, 0x80, 0x26, 0x2b, 0x7e, 0x25, 0x2b, 0x7c, +0x26, 0x2c, 0x7b, 0x26, 0x2c, 0x79, 0x25, 0x2b, 0x78, 0x24, 0x2a, 0x76, +0x23, 0x29, 0x75, 0x22, 0x28, 0x73, 0x22, 0x27, 0x71, 0x21, 0x26, 0x70, +0x20, 0x25, 0x6e, 0x1f, 0x24, 0x6d, 0x1e, 0x24, 0x6c, 0x1d, 0x23, 0x6a, +0x1d, 0x23, 0x69, 0x1c, 0x22, 0x67, 0x1c, 0x22, 0x66, 0x1b, 0x21, 0x65, +0x1a, 0x20, 0x64, 0x1a, 0x1f, 0x63, 0x19, 0x1f, 0x62, 0x19, 0x1e, 0x61, +0x19, 0x1e, 0x5f, 0x19, 0x1d, 0x5f, 0x18, 0x1c, 0x5e, 0x18, 0x1c, 0x5d, +0x17, 0x1c, 0x5c, 0x17, 0x1b, 0x5b, 0x17, 0x1b, 0x5a, 0x16, 0x1a, 0x59, +0x16, 0x1a, 0x58, 0x15, 0x19, 0x57, 0x15, 0x19, 0x56, 0x15, 0x19, 0x56, +0x15, 0x18, 0x55, 0x15, 0x18, 0x54, 0x14, 0x18, 0x53, 0x14, 0x17, 0x52, +0x14, 0x17, 0x52, 0x13, 0x17, 0x51, 0x13, 0x17, 0x50, 0x12, 0x16, 0x4f, +0x12, 0x16, 0x4f, 0x12, 0x16, 0x4e, 0x12, 0x16, 0x4d, 0x12, 0x15, 0x4c, +0x12, 0x15, 0x4c, 0x11, 0x15, 0x4b, 0x11, 0x14, 0x4a, 0x11, 0x14, 0x4a, +0x11, 0x14, 0x48, 0x11, 0x14, 0x48, 0x10, 0x13, 0x47, 0x10, 0x13, 0x47, +0x10, 0x13, 0x47, 0x10, 0x12, 0x45, 0x10, 0x12, 0x45, 0x0f, 0x12, 0x44, +0x0f, 0x12, 0x44, 0x0f, 0x12, 0x43, 0x0f, 0x12, 0x43, 0x0e, 0x11, 0x42, +0x0e, 0x11, 0x42, 0x0e, 0x11, 0x41, 0x0e, 0x11, 0x41, 0x0e, 0x10, 0x40, +0x0e, 0x10, 0x40, 0x0e, 0x10, 0x3f, 0x0d, 0x10, 0x3f, 0x0d, 0x10, 0x3e, +0x0d, 0x10, 0x3e, 0x0d, 0x0f, 0x3d, 0x0d, 0x0f, 0x37, 0x01, 0x01, 0x05, +0x15, 0x19, 0x48, 0x2b, 0x31, 0x90, 0x2c, 0x34, 0x97, 0x26, 0x2c, 0x81, +0x22, 0x28, 0x78, 0x22, 0x28, 0x79, 0x22, 0x29, 0x7b, 0x22, 0x29, 0x7d, +0x22, 0x29, 0x7f, 0x22, 0x29, 0x81, 0x22, 0x29, 0x82, 0x23, 0x2a, 0x84, +0x24, 0x2b, 0x86, 0x26, 0x2d, 0x89, 0x27, 0x2e, 0x8a, 0x28, 0x2f, 0x8c, +0x2a, 0x32, 0x8f, 0x2c, 0x33, 0x90, 0x2d, 0x34, 0x93, 0x2f, 0x38, 0x96, +0x32, 0x39, 0x98, 0x33, 0x3c, 0x9b, 0x34, 0x3d, 0x9d, 0x34, 0x3c, 0xa0, +0x34, 0x3d, 0xa3, 0x34, 0x3c, 0xa5, 0x33, 0x3c, 0xa8, 0x82, 0x83, 0x62, +0xd1, 0xcc, 0x1a, 0xd9, 0xd2, 0x1c, 0xdb, 0xd4, 0x1c, 0xdf, 0xd8, 0x20, +0xcb, 0xc4, 0x18, 0xcf, 0xc9, 0x1a, 0xdd, 0xd6, 0x1c, 0xde, 0xd7, 0x1d, +0xdf, 0xd8, 0x20, 0xd2, 0xcc, 0x1b, 0xc6, 0xc4, 0x17, 0xc0, 0xba, 0x15, +0xd1, 0xcf, 0x1a, 0xe0, 0xda, 0x25, 0xe6, 0xdf, 0x37, 0xdf, 0xd9, 0x22, +0xdc, 0xda, 0x1d, 0xcf, 0xc9, 0x1a, 0x9e, 0x9b, 0x16, 0x58, 0x68, 0xdd, +0x3c, 0x4a, 0xdd, 0x46, 0x55, 0xdd, 0x32, 0x3c, 0x76, 0x17, 0x1d, 0x45, +0x19, 0x20, 0x49, 0x1c, 0x22, 0x4d, 0x1e, 0x25, 0x51, 0x21, 0x28, 0x56, +0x27, 0x2f, 0x60, 0x27, 0x2f, 0x60, 0x2b, 0x33, 0x65, 0x2f, 0x37, 0x6b, +0x45, 0x4c, 0x63, 0xaa, 0xa8, 0x2a, 0xe6, 0xdf, 0x37, 0xe6, 0xe0, 0x39, +0xe6, 0xe4, 0x3b, 0xea, 0xe4, 0x45, 0xe3, 0xe1, 0x32, 0xdf, 0xd9, 0x22, +0xd1, 0xcf, 0x1a, 0xdf, 0xd8, 0x20, 0xd2, 0xcc, 0x1b, 0xdc, 0xda, 0x1d, +0xde, 0xdb, 0x1d, 0xdf, 0xd8, 0x20, 0xe0, 0xda, 0x25, 0xdf, 0xd9, 0x22, +0xce, 0xc9, 0x0f, 0x45, 0x49, 0x3f, 0x19, 0x21, 0x50, 0x1b, 0x22, 0x50, +0x1c, 0x22, 0x4f, 0x1d, 0x23, 0x4e, 0x1e, 0x24, 0x4e, 0x1e, 0x24, 0x4c, +0x1e, 0x24, 0x4b, 0x1c, 0x22, 0x47, 0x49, 0x55, 0x9d, 0x2d, 0x35, 0x64, +0x18, 0x1d, 0x3f, 0x32, 0x3b, 0x6e, 0x5a, 0x69, 0xe6, 0x47, 0x53, 0xe6, +0x41, 0x4c, 0xe6, 0x43, 0x4f, 0xe5, 0x44, 0x51, 0xdf, 0x47, 0x52, 0xdb, +0x48, 0x54, 0xd6, 0x49, 0x55, 0xd2, 0x49, 0x55, 0xce, 0x49, 0x54, 0xca, +0x48, 0x53, 0xc5, 0x44, 0x4f, 0xc1, 0x42, 0x4c, 0xbd, 0x40, 0x49, 0xba, +0x3c, 0x46, 0xb6, 0x3a, 0x44, 0xb3, 0x38, 0x41, 0xb0, 0x35, 0x3d, 0xad, +0x32, 0x3b, 0xa9, 0x2f, 0x37, 0xa6, 0x2d, 0x35, 0xa4, 0x2a, 0x33, 0xa0, +0x29, 0x31, 0x9e, 0x27, 0x2e, 0x9b, 0x27, 0x2e, 0x98, 0x27, 0x2e, 0x96, +0x66, 0x69, 0x64, 0xe6, 0xdf, 0x07, 0xe6, 0xdf, 0x07, 0xe6, 0xdf, 0x07, +0xe6, 0xdf, 0x07, 0xe6, 0xdf, 0x07, 0xe6, 0xdf, 0x07, 0xd0, 0xca, 0x15, +0x29, 0x30, 0x82, 0x28, 0x2f, 0x81, 0x28, 0x2f, 0x7f, 0x27, 0x2d, 0x7d, +0x26, 0x2c, 0x7b, 0x25, 0x2b, 0x79, 0x24, 0x2a, 0x77, 0x23, 0x29, 0x76, +0x22, 0x27, 0x75, 0x21, 0x26, 0x73, 0x21, 0x26, 0x72, 0x20, 0x25, 0x70, +0x1f, 0x25, 0x6f, 0x1e, 0x24, 0x6d, 0x1d, 0x24, 0x6c, 0x1d, 0x23, 0x6a, +0x1c, 0x22, 0x69, 0x1c, 0x21, 0x68, 0x1b, 0x21, 0x66, 0x1b, 0x20, 0x65, +0x1a, 0x1f, 0x64, 0x1a, 0x1f, 0x63, 0x19, 0x1e, 0x62, 0x19, 0x1e, 0x62, +0x19, 0x1d, 0x5f, 0x18, 0x1d, 0x5f, 0x18, 0x1c, 0x5e, 0x17, 0x1c, 0x5d, +0x17, 0x1b, 0x5c, 0x16, 0x1b, 0x5b, 0x16, 0x1a, 0x5a, 0x16, 0x1a, 0x59, +0x15, 0x19, 0x58, 0x15, 0x19, 0x57, 0x15, 0x19, 0x57, 0x15, 0x18, 0x56, +0x14, 0x18, 0x55, 0x14, 0x18, 0x54, 0x14, 0x17, 0x53, 0x13, 0x17, 0x52, +0x13, 0x17, 0x52, 0x13, 0x17, 0x51, 0x13, 0x16, 0x50, 0x12, 0x16, 0x4f, +0x12, 0x16, 0x4f, 0x12, 0x16, 0x4e, 0x12, 0x15, 0x4d, 0x12, 0x15, 0x4d, +0x11, 0x15, 0x4c, 0x11, 0x15, 0x4b, 0x11, 0x14, 0x4b, 0x11, 0x14, 0x4a, +0x10, 0x14, 0x48, 0x10, 0x14, 0x48, 0x10, 0x13, 0x47, 0x10, 0x13, 0x47, +0x10, 0x13, 0x47, 0x0f, 0x12, 0x45, 0x0f, 0x12, 0x45, 0x0f, 0x12, 0x44, +0x0f, 0x12, 0x44, 0x0f, 0x12, 0x43, 0x0f, 0x12, 0x43, 0x0e, 0x11, 0x42, +0x0e, 0x11, 0x42, 0x0e, 0x11, 0x41, 0x0e, 0x11, 0x41, 0x0e, 0x10, 0x40, +0x0e, 0x10, 0x40, 0x0e, 0x10, 0x3f, 0x0d, 0x10, 0x3f, 0x0d, 0x10, 0x3e, +0x0d, 0x10, 0x3e, 0x0d, 0x10, 0x3d, 0x0d, 0x0f, 0x37, 0x01, 0x01, 0x05, +0x17, 0x1a, 0x48, 0x2d, 0x34, 0x92, 0x2f, 0x36, 0x97, 0x28, 0x2d, 0x81, +0x24, 0x2a, 0x78, 0x25, 0x2a, 0x7a, 0x25, 0x2a, 0x7b, 0x24, 0x2a, 0x7d, +0x24, 0x2a, 0x7f, 0x25, 0x2a, 0x81, 0x25, 0x2b, 0x82, 0x25, 0x2b, 0x85, +0x25, 0x2c, 0x87, 0x25, 0x2c, 0x89, 0x25, 0x2d, 0x8b, 0x27, 0x2d, 0x8d, +0x28, 0x2f, 0x90, 0x29, 0x30, 0x91, 0x2b, 0x33, 0x94, 0x2d, 0x34, 0x96, +0x2f, 0x36, 0x99, 0x30, 0x38, 0x9b, 0x33, 0x3a, 0x9e, 0x35, 0x3e, 0xa0, +0x38, 0x41, 0xa4, 0x72, 0x76, 0x71, 0xd2, 0xcd, 0x19, 0xdf, 0xd9, 0x22, +0xe0, 0xde, 0x25, 0xd1, 0xcf, 0x1a, 0xdc, 0xda, 0x1d, 0xde, 0xdc, 0x1f, +0xde, 0xdc, 0x1f, 0xd4, 0xcd, 0x1b, 0xad, 0xac, 0x46, 0x8a, 0x8e, 0x72, +0x7c, 0x81, 0x8a, 0x80, 0x87, 0x8d, 0x82, 0x87, 0x84, 0x9a, 0x9b, 0x43, +0xce, 0xc9, 0x0d, 0xe0, 0xde, 0x25, 0xd4, 0xcd, 0x1b, 0xdb, 0xd4, 0x1c, +0xd9, 0xd2, 0x1c, 0xcf, 0xc9, 0x1a, 0x8d, 0x8c, 0x28, 0x11, 0x16, 0x3a, +0x1b, 0x22, 0x4d, 0x49, 0x59, 0xdb, 0x47, 0x56, 0xda, 0x26, 0x2e, 0x5f, +0x19, 0x20, 0x4b, 0x1c, 0x22, 0x4f, 0x1f, 0x26, 0x54, 0x22, 0x2a, 0x59, +0x26, 0x2d, 0x5e, 0x29, 0x31, 0x64, 0x2d, 0x35, 0x6a, 0x81, 0x83, 0x42, +0xde, 0xd7, 0x1d, 0xe1, 0xda, 0x26, 0xe4, 0xe2, 0x35, 0xe5, 0xdf, 0x36, +0xe1, 0xda, 0x26, 0xe8, 0xe2, 0x3f, 0xe1, 0xdb, 0x28, 0xbe, 0xbb, 0x21, +0xaa, 0xa8, 0x2d, 0xa9, 0xa7, 0x2c, 0xd4, 0xcd, 0x1b, 0xdf, 0xd8, 0x20, +0xd2, 0xcc, 0x1b, 0xde, 0xdb, 0x1d, 0xe2, 0xe0, 0x2d, 0xe1, 0xdf, 0x2a, +0xe3, 0xdd, 0x30, 0xdf, 0xd8, 0x20, 0x76, 0x77, 0x32, 0x1f, 0x26, 0x56, +0x20, 0x27, 0x56, 0x21, 0x27, 0x54, 0x22, 0x28, 0x53, 0x22, 0x28, 0x51, +0x20, 0x26, 0x4e, 0x1e, 0x24, 0x4a, 0x1c, 0x22, 0x47, 0x1a, 0x1f, 0x43, +0x3e, 0x48, 0x85, 0x57, 0x66, 0xe6, 0x49, 0x56, 0xe6, 0x4a, 0x57, 0xe6, +0x4b, 0x58, 0xe6, 0x4c, 0x58, 0xe6, 0x4c, 0x59, 0xe2, 0x4e, 0x5b, 0xdd, +0x4e, 0x5b, 0xd8, 0x4f, 0x5b, 0xd4, 0x4d, 0x59, 0xcf, 0x49, 0x54, 0xcb, +0x45, 0x51, 0xc7, 0x43, 0x4e, 0xc2, 0x41, 0x4a, 0xbf, 0x3d, 0x47, 0xbb, +0x39, 0x43, 0xb8, 0x35, 0x3f, 0xb4, 0x33, 0x3c, 0xb0, 0x30, 0x39, 0xad, +0x2e, 0x36, 0xaa, 0x2b, 0x34, 0xa7, 0x2a, 0x32, 0xa4, 0x29, 0x30, 0xa1, +0x29, 0x31, 0x9e, 0x2a, 0x32, 0x9c, 0x2b, 0x32, 0x99, 0x2b, 0x32, 0x97, +0x3f, 0x45, 0x84, 0xe6, 0xdf, 0x07, 0xe6, 0xdf, 0x07, 0xe6, 0xdf, 0x07, +0xe6, 0xdf, 0x07, 0xe6, 0xdf, 0x07, 0xe6, 0xdf, 0x07, 0x7d, 0x7d, 0x4d, +0x29, 0x30, 0x82, 0x28, 0x2e, 0x81, 0x27, 0x2d, 0x7f, 0x26, 0x2c, 0x7d, +0x25, 0x2b, 0x7b, 0x24, 0x2a, 0x7a, 0x23, 0x29, 0x78, 0x22, 0x28, 0x77, +0x21, 0x27, 0x75, 0x20, 0x26, 0x74, 0x20, 0x25, 0x72, 0x1f, 0x25, 0x71, +0x1e, 0x24, 0x6f, 0x1d, 0x23, 0x6e, 0x1d, 0x23, 0x6c, 0x1c, 0x22, 0x6b, +0x1c, 0x21, 0x69, 0x1c, 0x21, 0x68, 0x1b, 0x20, 0x67, 0x1b, 0x1f, 0x65, +0x1a, 0x1f, 0x65, 0x1a, 0x1e, 0x63, 0x19, 0x1e, 0x63, 0x19, 0x1d, 0x62, +0x18, 0x1d, 0x60, 0x18, 0x1c, 0x5f, 0x17, 0x1b, 0x5e, 0x17, 0x1b, 0x5d, +0x16, 0x1a, 0x5c, 0x16, 0x1a, 0x5b, 0x16, 0x1a, 0x5a, 0x15, 0x19, 0x59, +0x15, 0x19, 0x59, 0x15, 0x19, 0x58, 0x14, 0x19, 0x57, 0x14, 0x18, 0x56, +0x14, 0x18, 0x55, 0x14, 0x17, 0x54, 0x13, 0x17, 0x53, 0x13, 0x17, 0x53, +0x13, 0x17, 0x52, 0x13, 0x16, 0x51, 0x12, 0x16, 0x50, 0x12, 0x16, 0x4f, +0x12, 0x16, 0x4f, 0x12, 0x15, 0x4e, 0x11, 0x15, 0x4d, 0x11, 0x15, 0x4d, +0x11, 0x15, 0x4c, 0x11, 0x14, 0x4b, 0x11, 0x14, 0x4b, 0x11, 0x14, 0x4a, +0x10, 0x14, 0x48, 0x10, 0x14, 0x48, 0x10, 0x13, 0x48, 0x10, 0x13, 0x48, +0x10, 0x13, 0x47, 0x0f, 0x12, 0x45, 0x0f, 0x12, 0x45, 0x0f, 0x12, 0x44, +0x0f, 0x12, 0x44, 0x0f, 0x12, 0x43, 0x0f, 0x12, 0x43, 0x0e, 0x11, 0x42, +0x0e, 0x11, 0x42, 0x0e, 0x11, 0x41, 0x0e, 0x11, 0x41, 0x0e, 0x10, 0x40, +0x0e, 0x10, 0x40, 0x0e, 0x10, 0x3f, 0x0d, 0x10, 0x3f, 0x0d, 0x10, 0x3e, +0x0d, 0x10, 0x3e, 0x0d, 0x10, 0x3d, 0x0d, 0x0f, 0x37, 0x01, 0x01, 0x05, +0x17, 0x1a, 0x48, 0x2f, 0x36, 0x92, 0x31, 0x3a, 0x98, 0x2a, 0x30, 0x81, +0x26, 0x2c, 0x78, 0x27, 0x2d, 0x7a, 0x26, 0x2d, 0x7c, 0x27, 0x2d, 0x7e, +0x27, 0x2e, 0x80, 0x27, 0x2e, 0x81, 0x27, 0x2f, 0x83, 0x28, 0x2e, 0x85, +0x28, 0x2e, 0x87, 0x28, 0x2f, 0x8a, 0x28, 0x2f, 0x8b, 0x28, 0x2f, 0x8e, +0x29, 0x2f, 0x90, 0x28, 0x2f, 0x92, 0x29, 0x30, 0x95, 0x2a, 0x32, 0x97, +0x2c, 0x34, 0x9a, 0x2e, 0x35, 0x9c, 0x30, 0x38, 0x9f, 0x44, 0x4c, 0x90, +0xaa, 0xa9, 0x3b, 0xde, 0xdb, 0x1d, 0xe1, 0xda, 0x26, 0xd7, 0xd5, 0x1c, +0xd7, 0xd5, 0x1c, 0xde, 0xdc, 0x1f, 0xd5, 0xcf, 0x1c, 0xd2, 0xcd, 0x1b, +0x86, 0x89, 0x6c, 0x3a, 0x44, 0xc2, 0x39, 0x43, 0xc6, 0x3c, 0x46, 0xcb, +0x40, 0x4c, 0xcf, 0x45, 0x51, 0xd2, 0x4c, 0x58, 0xd7, 0x54, 0x61, 0xdb, +0x52, 0x5f, 0xc3, 0x95, 0x95, 0x35, 0xb2, 0xac, 0x11, 0xd7, 0xd0, 0x1c, +0xd9, 0xd2, 0x1c, 0xe1, 0xda, 0x26, 0x87, 0x8f, 0x95, 0x2a, 0x33, 0x67, +0x12, 0x18, 0x3e, 0x14, 0x1a, 0x41, 0x50, 0x60, 0xc2, 0x49, 0x59, 0xd8, +0x19, 0x20, 0x4c, 0x1d, 0x24, 0x52, 0x20, 0x27, 0x56, 0x23, 0x2b, 0x5c, +0x27, 0x2f, 0x62, 0x2b, 0x33, 0x69, 0xa9, 0xa7, 0x2a, 0xe1, 0xda, 0x26, +0xe4, 0xde, 0x31, 0xe6, 0xe4, 0x39, 0xe0, 0xde, 0x25, 0xdf, 0xd8, 0x20, +0xe3, 0xdd, 0x30, 0x87, 0x8a, 0x4f, 0x3c, 0x46, 0x8a, 0x3b, 0x45, 0x89, +0x39, 0x43, 0x86, 0x34, 0x3e, 0x81, 0x30, 0x3a, 0x7c, 0x7e, 0x80, 0x45, +0xe1, 0xdb, 0x2a, 0xe0, 0xde, 0x25, 0xe0, 0xd9, 0x23, 0xe1, 0xda, 0x26, +0xe2, 0xdc, 0x2d, 0xe3, 0xdd, 0x2e, 0xde, 0xdb, 0x1d, 0x8f, 0x8e, 0x2d, +0x25, 0x2c, 0x5c, 0x26, 0x2e, 0x5c, 0x26, 0x2c, 0x59, 0x23, 0x2a, 0x55, +0x21, 0x27, 0x50, 0x1f, 0x25, 0x4c, 0x1d, 0x22, 0x48, 0x4b, 0x58, 0xa3, +0x54, 0x63, 0xe5, 0x52, 0x61, 0xe5, 0x54, 0x61, 0xe5, 0x55, 0x63, 0xe5, +0x55, 0x64, 0xe6, 0x55, 0x64, 0xe6, 0x54, 0x62, 0xe4, 0x56, 0x63, 0xdf, +0x52, 0x5f, 0xda, 0x4e, 0x5a, 0xd5, 0x4b, 0x57, 0xd1, 0x47, 0x52, 0xcd, +0x44, 0x4f, 0xc8, 0x3f, 0x4a, 0xc4, 0x3b, 0x46, 0xc0, 0x37, 0x41, 0xbc, +0x34, 0x3d, 0xb8, 0x31, 0x3a, 0xb5, 0x2f, 0x38, 0xb2, 0x2b, 0x34, 0xae, +0x2c, 0x35, 0xaa, 0x2d, 0x35, 0xa8, 0x2d, 0x36, 0xa5, 0x2e, 0x36, 0xa2, +0x2f, 0x36, 0x9f, 0x30, 0x37, 0x9c, 0x30, 0x37, 0x9a, 0x30, 0x38, 0x97, +0x30, 0x38, 0x95, 0x6d, 0x6f, 0x63, 0xe6, 0xdf, 0x07, 0xe6, 0xdf, 0x07, +0xe6, 0xdf, 0x07, 0xe6, 0xdf, 0x07, 0x91, 0x91, 0x40, 0x29, 0x30, 0x85, +0x27, 0x2f, 0x83, 0x26, 0x2d, 0x81, 0x26, 0x2c, 0x7f, 0x25, 0x2b, 0x7e, +0x24, 0x29, 0x7c, 0x23, 0x29, 0x7a, 0x22, 0x28, 0x78, 0x21, 0x27, 0x76, +0x20, 0x26, 0x75, 0x1f, 0x26, 0x74, 0x1f, 0x25, 0x72, 0x1e, 0x24, 0x71, +0x1d, 0x23, 0x6f, 0x1d, 0x23, 0x6e, 0x1c, 0x22, 0x6c, 0x1c, 0x21, 0x6b, +0x1c, 0x21, 0x6a, 0x1b, 0x20, 0x68, 0x1a, 0x1f, 0x67, 0x1a, 0x1e, 0x66, +0x19, 0x1e, 0x65, 0x19, 0x1d, 0x64, 0x19, 0x1d, 0x63, 0x18, 0x1c, 0x62, +0x18, 0x1c, 0x60, 0x17, 0x1b, 0x60, 0x17, 0x1b, 0x5f, 0x17, 0x1a, 0x5e, +0x16, 0x1a, 0x5d, 0x16, 0x1a, 0x5c, 0x15, 0x19, 0x5b, 0x15, 0x1a, 0x5a, +0x15, 0x19, 0x59, 0x14, 0x19, 0x58, 0x14, 0x18, 0x57, 0x14, 0x18, 0x56, +0x14, 0x17, 0x55, 0x13, 0x17, 0x54, 0x13, 0x17, 0x53, 0x13, 0x17, 0x53, +0x13, 0x16, 0x52, 0x12, 0x16, 0x51, 0x12, 0x15, 0x50, 0x12, 0x15, 0x50, +0x12, 0x15, 0x4f, 0x12, 0x15, 0x4e, 0x11, 0x15, 0x4d, 0x11, 0x15, 0x4d, +0x11, 0x15, 0x4c, 0x11, 0x14, 0x4b, 0x11, 0x14, 0x4b, 0x11, 0x14, 0x4a, +0x10, 0x14, 0x48, 0x10, 0x14, 0x48, 0x10, 0x13, 0x48, 0x10, 0x13, 0x48, +0x10, 0x13, 0x47, 0x10, 0x13, 0x46, 0x10, 0x13, 0x45, 0x0f, 0x13, 0x44, +0x0f, 0x12, 0x44, 0x0f, 0x12, 0x43, 0x0f, 0x12, 0x43, 0x0f, 0x12, 0x43, +0x0e, 0x11, 0x42, 0x0e, 0x11, 0x41, 0x0e, 0x11, 0x41, 0x0e, 0x10, 0x40, +0x0e, 0x10, 0x40, 0x0e, 0x10, 0x3f, 0x0d, 0x10, 0x3f, 0x0d, 0x10, 0x3e, +0x0d, 0x10, 0x3e, 0x0d, 0x10, 0x3d, 0x0d, 0x0f, 0x37, 0x01, 0x01, 0x05, +0x14, 0x18, 0x48, 0x2b, 0x32, 0x92, 0x2e, 0x35, 0x98, 0x28, 0x2e, 0x82, +0x26, 0x2b, 0x79, 0x26, 0x2d, 0x7a, 0x28, 0x2f, 0x7c, 0x2a, 0x30, 0x7e, +0x2a, 0x31, 0x80, 0x2b, 0x31, 0x81, 0x2b, 0x31, 0x83, 0x2b, 0x32, 0x86, +0x2b, 0x32, 0x88, 0x2b, 0x32, 0x8a, 0x2b, 0x32, 0x8c, 0x2b, 0x32, 0x8e, +0x2c, 0x33, 0x90, 0x2c, 0x33, 0x93, 0x2c, 0x34, 0x96, 0x2b, 0x33, 0x97, +0x2b, 0x34, 0x9b, 0x2c, 0x34, 0x9d, 0x41, 0x47, 0x8f, 0xd1, 0xcb, 0x18, +0xd5, 0xcf, 0x1c, 0xd7, 0xd0, 0x1c, 0xde, 0xdc, 0x1f, 0xe1, 0xdf, 0x2a, +0xd1, 0xcf, 0x1a, 0xd7, 0xd0, 0x1c, 0x8a, 0x8d, 0x6a, 0x45, 0x4e, 0xbd, +0x44, 0x4e, 0xc0, 0x42, 0x4d, 0xc4, 0x41, 0x4c, 0xc8, 0x40, 0x4b, 0xcc, +0x3e, 0x49, 0xd0, 0x3d, 0x49, 0xd5, 0x42, 0x4e, 0xd9, 0x49, 0x56, 0xdd, +0x51, 0x5e, 0xe2, 0x89, 0x90, 0x97, 0xdd, 0xd6, 0x1c, 0xd9, 0xd2, 0x1c, +0xdf, 0xd8, 0x20, 0xe2, 0xe0, 0x2d, 0x3f, 0x42, 0x2f, 0x1f, 0x27, 0x54, +0x34, 0x3f, 0x7d, 0x14, 0x1a, 0x43, 0x15, 0x1c, 0x46, 0x17, 0x1e, 0x4a, +0x4c, 0x5e, 0xd6, 0x1d, 0x24, 0x54, 0x1f, 0x27, 0x59, 0x24, 0x2c, 0x5f, +0x28, 0x31, 0x66, 0xa8, 0xa6, 0x29, 0xde, 0xdb, 0x1d, 0xe2, 0xdc, 0x2b, +0xe0, 0xde, 0x25, 0xe4, 0xde, 0x31, 0xe1, 0xdb, 0x2a, 0xd4, 0xcf, 0x17, +0x59, 0x61, 0x88, 0x46, 0x51, 0x99, 0x45, 0x50, 0x99, 0x43, 0x4e, 0x98, +0x40, 0x4b, 0x94, 0x3b, 0x46, 0x8e, 0x35, 0x40, 0x87, 0x31, 0x3b, 0x81, +0x40, 0x48, 0x6d, 0xd0, 0xcb, 0x13, 0xd9, 0xd2, 0x1c, 0xe1, 0xdb, 0x2a, +0xde, 0xd7, 0x1d, 0xde, 0xdc, 0x1f, 0xe2, 0xe0, 0x2b, 0xe1, 0xdb, 0x28, +0x6a, 0x6c, 0x45, 0x2b, 0x32, 0x62, 0x28, 0x2f, 0x5c, 0x24, 0x2b, 0x57, +0x22, 0x29, 0x53, 0x20, 0x26, 0x4f, 0x55, 0x63, 0xbc, 0x5c, 0x6c, 0xe4, +0x5e, 0x6d, 0xe4, 0x60, 0x70, 0xe5, 0x60, 0x6f, 0xe3, 0x60, 0x6f, 0xe4, +0x60, 0x6e, 0xe4, 0x5f, 0x6e, 0xe4, 0x5a, 0x68, 0xe6, 0x53, 0x60, 0xe1, +0x4f, 0x5c, 0xdc, 0x4b, 0x57, 0xd7, 0x47, 0x53, 0xd2, 0x41, 0x4d, 0xce, +0x3c, 0x48, 0xc9, 0x38, 0x42, 0xc5, 0x36, 0x3f, 0xc1, 0x32, 0x3c, 0xbd, +0x2f, 0x38, 0xb9, 0x2f, 0x38, 0xb5, 0x30, 0x3a, 0xb2, 0x32, 0x3a, 0xaf, +0x32, 0x3b, 0xac, 0x33, 0x3c, 0xa9, 0x34, 0x3c, 0xa6, 0x34, 0x3d, 0xa2, +0x35, 0x3d, 0xa0, 0x35, 0x3e, 0x9d, 0x35, 0x3e, 0x9b, 0x33, 0x3b, 0x97, +0x31, 0x39, 0x95, 0x2f, 0x38, 0x93, 0x2e, 0x35, 0x90, 0x6a, 0x6d, 0x61, +0x69, 0x6b, 0x5f, 0x3e, 0x44, 0x7a, 0x29, 0x30, 0x88, 0x27, 0x2e, 0x86, +0x26, 0x2d, 0x83, 0x26, 0x2c, 0x81, 0x25, 0x2b, 0x80, 0x24, 0x29, 0x7e, +0x23, 0x28, 0x7c, 0x22, 0x28, 0x7a, 0x21, 0x28, 0x79, 0x20, 0x26, 0x77, +0x1f, 0x25, 0x75, 0x1e, 0x24, 0x74, 0x1e, 0x24, 0x73, 0x1d, 0x23, 0x71, +0x1d, 0x22, 0x70, 0x1d, 0x21, 0x6e, 0x1c, 0x21, 0x6d, 0x1b, 0x20, 0x6b, +0x1b, 0x1f, 0x6a, 0x1a, 0x1f, 0x68, 0x1a, 0x1e, 0x67, 0x19, 0x1e, 0x66, +0x19, 0x1d, 0x65, 0x18, 0x1c, 0x64, 0x18, 0x1c, 0x63, 0x18, 0x1b, 0x62, +0x17, 0x1b, 0x61, 0x17, 0x1b, 0x60, 0x16, 0x1b, 0x5f, 0x16, 0x1a, 0x5e, +0x16, 0x1a, 0x5d, 0x15, 0x19, 0x5c, 0x15, 0x19, 0x5b, 0x15, 0x19, 0x5a, +0x15, 0x19, 0x59, 0x14, 0x18, 0x58, 0x14, 0x18, 0x57, 0x14, 0x17, 0x56, +0x13, 0x17, 0x55, 0x13, 0x17, 0x54, 0x13, 0x17, 0x54, 0x13, 0x17, 0x53, +0x13, 0x16, 0x52, 0x13, 0x16, 0x51, 0x12, 0x16, 0x50, 0x12, 0x16, 0x50, +0x12, 0x16, 0x4f, 0x12, 0x15, 0x4e, 0x12, 0x15, 0x4e, 0x12, 0x15, 0x4d, +0x11, 0x15, 0x4c, 0x11, 0x14, 0x4b, 0x11, 0x14, 0x4b, 0x11, 0x14, 0x4a, +0x11, 0x14, 0x49, 0x10, 0x14, 0x48, 0x10, 0x13, 0x48, 0x10, 0x13, 0x48, +0x10, 0x13, 0x47, 0x10, 0x13, 0x47, 0x10, 0x13, 0x45, 0x0f, 0x13, 0x44, +0x0f, 0x13, 0x44, 0x0f, 0x12, 0x44, 0x0f, 0x12, 0x44, 0x0f, 0x12, 0x43, +0x0e, 0x11, 0x42, 0x0e, 0x11, 0x41, 0x0e, 0x11, 0x41, 0x0e, 0x11, 0x40, +0x0e, 0x11, 0x40, 0x0e, 0x10, 0x3f, 0x0d, 0x10, 0x3f, 0x0d, 0x10, 0x3e, +0x0d, 0x10, 0x3e, 0x0d, 0x10, 0x3d, 0x0d, 0x0f, 0x37, 0x01, 0x01, 0x05, +0x13, 0x16, 0x48, 0x28, 0x2e, 0x93, 0x2a, 0x32, 0x98, 0x25, 0x2b, 0x82, +0x22, 0x28, 0x79, 0x23, 0x29, 0x7b, 0x24, 0x2a, 0x7d, 0x26, 0x2c, 0x7f, +0x27, 0x2e, 0x81, 0x29, 0x30, 0x82, 0x2b, 0x31, 0x84, 0x2d, 0x34, 0x86, +0x2e, 0x36, 0x88, 0x2f, 0x36, 0x8a, 0x2f, 0x37, 0x8c, 0x30, 0x38, 0x8f, +0x30, 0x38, 0x91, 0x2f, 0x38, 0x93, 0x30, 0x38, 0x96, 0x30, 0x38, 0x98, +0x30, 0x38, 0x9b, 0x43, 0x4a, 0x8d, 0xd1, 0xcc, 0x18, 0xdf, 0xd8, 0x20, +0xe3, 0xdd, 0x30, 0xde, 0xd7, 0x1d, 0xde, 0xd8, 0x1f, 0xcc, 0xc6, 0x19, +0xd1, 0xcc, 0x1a, 0x4b, 0x54, 0xa2, 0x3c, 0x46, 0xba, 0x3f, 0x4a, 0xbe, +0x44, 0x4e, 0xc2, 0x49, 0x54, 0xc5, 0x4b, 0x57, 0xca, 0x49, 0x56, 0xce, +0x48, 0x54, 0xd2, 0x46, 0x52, 0xd6, 0x44, 0x4f, 0xda, 0x40, 0x4c, 0xdf, +0x46, 0x53, 0xe2, 0x81, 0x88, 0x98, 0xde, 0xdc, 0x1f, 0xde, 0xdc, 0x1f, +0xe1, 0xda, 0x26, 0xe2, 0xdc, 0x2d, 0x12, 0x18, 0x3d, 0x13, 0x19, 0x3f, +0x14, 0x1a, 0x42, 0x15, 0x1b, 0x45, 0x15, 0x1c, 0x48, 0x17, 0x1e, 0x4c, +0x19, 0x21, 0x50, 0x46, 0x56, 0xa8, 0x20, 0x28, 0x5b, 0x24, 0x2c, 0x62, +0xa7, 0xa5, 0x28, 0xdf, 0xd9, 0x22, 0xe1, 0xda, 0x26, 0xdd, 0xd6, 0x1c, +0xe1, 0xdb, 0x28, 0xdf, 0xd9, 0x22, 0xd5, 0xd0, 0x19, 0x64, 0x6d, 0x98, +0x53, 0x5f, 0xac, 0x51, 0x5d, 0xac, 0x4f, 0x5c, 0xab, 0x4d, 0x5a, 0xaa, +0x49, 0x55, 0xa5, 0x43, 0x4f, 0x9d, 0x3c, 0x48, 0x95, 0x35, 0x41, 0x8c, +0x2f, 0x3a, 0x83, 0x54, 0x5a, 0x62, 0xdf, 0xd8, 0x20, 0xdb, 0xd4, 0x1c, +0xe0, 0xde, 0x25, 0xde, 0xdc, 0x1f, 0xe2, 0xdc, 0x2d, 0xdf, 0xd8, 0x20, +0xd1, 0xcc, 0x12, 0x41, 0x46, 0x5a, 0x29, 0x30, 0x5f, 0x26, 0x2d, 0x5b, +0x23, 0x2a, 0x55, 0x58, 0x68, 0xc6, 0x51, 0x5f, 0xb2, 0x4d, 0x59, 0xa7, +0x46, 0x52, 0x98, 0x45, 0x51, 0x97, 0x46, 0x52, 0x99, 0x45, 0x51, 0x98, +0x57, 0x64, 0xc9, 0x5d, 0x6c, 0xe4, 0x56, 0x63, 0xe5, 0x50, 0x5d, 0xe2, +0x49, 0x56, 0xdd, 0x43, 0x4f, 0xd8, 0x3d, 0x49, 0xd4, 0x39, 0x43, 0xcf, +0x36, 0x40, 0xca, 0x32, 0x3c, 0xc6, 0x34, 0x3d, 0xc2, 0x34, 0x3e, 0xbf, +0x36, 0x3f, 0xbb, 0x37, 0x40, 0xb7, 0x39, 0x42, 0xb3, 0x39, 0x43, 0xb0, +0x3a, 0x43, 0xad, 0x3b, 0x45, 0xa9, 0x3c, 0x45, 0xa6, 0x39, 0x42, 0xa3, +0x36, 0x3f, 0xa0, 0x35, 0x3d, 0x9e, 0x32, 0x3b, 0x9a, 0x31, 0x38, 0x98, +0x2f, 0x38, 0x95, 0x2d, 0x35, 0x93, 0x2d, 0x33, 0x91, 0x2b, 0x32, 0x8f, +0x29, 0x31, 0x8c, 0x28, 0x30, 0x8a, 0x26, 0x2e, 0x87, 0x26, 0x2d, 0x86, +0x25, 0x2b, 0x84, 0x25, 0x2b, 0x82, 0x23, 0x29, 0x80, 0x22, 0x29, 0x7f, +0x21, 0x28, 0x7d, 0x20, 0x27, 0x7b, 0x1f, 0x26, 0x79, 0x1f, 0x25, 0x77, +0x1f, 0x24, 0x76, 0x1e, 0x23, 0x75, 0x1e, 0x22, 0x73, 0x1d, 0x22, 0x71, +0x1c, 0x21, 0x70, 0x1c, 0x21, 0x6e, 0x1b, 0x20, 0x6d, 0x1b, 0x1f, 0x6b, +0x1a, 0x1f, 0x6a, 0x1a, 0x1e, 0x69, 0x19, 0x1e, 0x67, 0x18, 0x1d, 0x66, +0x18, 0x1d, 0x65, 0x18, 0x1c, 0x65, 0x17, 0x1c, 0x63, 0x17, 0x1b, 0x62, +0x16, 0x1b, 0x61, 0x16, 0x1b, 0x60, 0x16, 0x1a, 0x5f, 0x15, 0x1a, 0x5e, +0x15, 0x19, 0x5d, 0x15, 0x19, 0x5c, 0x15, 0x19, 0x5b, 0x15, 0x19, 0x5a, +0x15, 0x19, 0x59, 0x14, 0x18, 0x58, 0x14, 0x18, 0x57, 0x14, 0x18, 0x56, +0x14, 0x17, 0x55, 0x13, 0x17, 0x54, 0x13, 0x17, 0x54, 0x13, 0x17, 0x53, +0x13, 0x16, 0x52, 0x13, 0x16, 0x51, 0x13, 0x16, 0x51, 0x12, 0x16, 0x50, +0x12, 0x16, 0x4f, 0x12, 0x15, 0x4e, 0x12, 0x15, 0x4e, 0x12, 0x15, 0x4d, +0x11, 0x15, 0x4c, 0x11, 0x15, 0x4c, 0x11, 0x15, 0x4b, 0x11, 0x14, 0x4a, +0x11, 0x14, 0x49, 0x11, 0x14, 0x48, 0x10, 0x14, 0x48, 0x10, 0x13, 0x48, +0x10, 0x13, 0x47, 0x10, 0x13, 0x47, 0x10, 0x13, 0x45, 0x0f, 0x13, 0x44, +0x0f, 0x13, 0x44, 0x0f, 0x12, 0x44, 0x0f, 0x12, 0x44, 0x0f, 0x12, 0x43, +0x0f, 0x11, 0x42, 0x0f, 0x11, 0x41, 0x0f, 0x11, 0x41, 0x0e, 0x11, 0x40, +0x0e, 0x11, 0x40, 0x0e, 0x10, 0x3f, 0x0e, 0x10, 0x3f, 0x0d, 0x10, 0x3e, +0x0d, 0x10, 0x3e, 0x0d, 0x10, 0x3e, 0x0d, 0x0f, 0x37, 0x01, 0x01, 0x05, +0x12, 0x15, 0x48, 0x25, 0x2c, 0x93, 0x28, 0x2e, 0x99, 0x22, 0x28, 0x82, +0x1f, 0x25, 0x79, 0x20, 0x26, 0x7b, 0x21, 0x27, 0x7d, 0x22, 0x29, 0x7f, +0x24, 0x2a, 0x81, 0x25, 0x2b, 0x82, 0x26, 0x2c, 0x84, 0x28, 0x2e, 0x87, +0x29, 0x31, 0x89, 0x2c, 0x32, 0x8a, 0x2e, 0x35, 0x8d, 0x2f, 0x37, 0x8f, +0x32, 0x3a, 0x91, 0x35, 0x3e, 0x94, 0x36, 0x3d, 0x96, 0x35, 0x3e, 0x99, +0x48, 0x4f, 0x8a, 0xd1, 0xcc, 0x18, 0xd5, 0xcf, 0x1c, 0xe3, 0xdd, 0x30, +0xe1, 0xdb, 0x2a, 0xde, 0xdb, 0x1d, 0xd7, 0xd0, 0x1c, 0xd1, 0xcc, 0x1a, +0x47, 0x4e, 0xa0, 0x34, 0x3d, 0xb7, 0x36, 0x40, 0xbb, 0x39, 0x44, 0xbf, +0x3c, 0x47, 0xc2, 0x40, 0x4b, 0xc6, 0x45, 0x50, 0xcb, 0x4a, 0x57, 0xcf, +0x51, 0x5d, 0xd4, 0x53, 0x61, 0xd8, 0x51, 0x5f, 0xdd, 0x4f, 0x5c, 0xe2, +0x4d, 0x5b, 0xe2, 0x7f, 0x85, 0x98, 0xdf, 0xd9, 0x22, 0xdf, 0xd9, 0x22, +0xde, 0xdb, 0x1d, 0xcf, 0xca, 0x0f, 0x13, 0x19, 0x3e, 0x14, 0x1a, 0x41, +0x15, 0x1b, 0x44, 0x16, 0x1c, 0x47, 0x17, 0x1e, 0x4a, 0x18, 0x1f, 0x4e, +0x19, 0x21, 0x52, 0x1c, 0x24, 0x57, 0x1f, 0x27, 0x5d, 0x8f, 0x8e, 0x31, +0xe6, 0xdf, 0x37, 0xe6, 0xdf, 0x37, 0xd7, 0xd5, 0x1c, 0xdf, 0xd9, 0x22, +0xdf, 0xd9, 0x22, 0xd5, 0xd0, 0x19, 0x72, 0x7c, 0xa9, 0x64, 0x70, 0xc2, +0x62, 0x6f, 0xc3, 0x5f, 0x6c, 0xc2, 0x5e, 0x6b, 0xc3, 0x5b, 0x68, 0xc0, +0x55, 0x63, 0xba, 0x4c, 0x59, 0xaf, 0x42, 0x4f, 0xa3, 0x3b, 0x47, 0x99, +0x34, 0x40, 0x8f, 0x2e, 0x39, 0x85, 0x92, 0x93, 0x3c, 0xd1, 0xca, 0x1a, +0xde, 0xdb, 0x1d, 0xdf, 0xd8, 0x20, 0xe0, 0xde, 0x25, 0xe1, 0xda, 0x26, +0xe1, 0xdb, 0x28, 0x94, 0x93, 0x32, 0x2b, 0x32, 0x63, 0x27, 0x2e, 0x5d, +0x30, 0x39, 0x6c, 0x25, 0x2c, 0x58, 0x1f, 0x25, 0x4e, 0x1d, 0x23, 0x4a, +0x1a, 0x20, 0x46, 0x1c, 0x21, 0x48, 0x3a, 0x45, 0x80, 0x4e, 0x5b, 0xb0, +0x5b, 0x69, 0xd7, 0x56, 0x65, 0xe3, 0x4d, 0x5a, 0xe4, 0x43, 0x50, 0xe3, +0x3e, 0x4a, 0xde, 0x39, 0x44, 0xd9, 0x36, 0x40, 0xd4, 0x38, 0x42, 0xd0, +0x39, 0x44, 0xcb, 0x3c, 0x45, 0xc7, 0x3c, 0x47, 0xc2, 0x3e, 0x49, 0xbf, +0x40, 0x4b, 0xbb, 0x42, 0x4c, 0xb7, 0x42, 0x4c, 0xb3, 0x3f, 0x49, 0xb0, +0x3d, 0x46, 0xad, 0x3a, 0x43, 0xaa, 0x38, 0x42, 0xa7, 0x36, 0x3e, 0xa4, +0x33, 0x3d, 0xa1, 0x32, 0x3a, 0x9e, 0x30, 0x38, 0x9b, 0x2e, 0x36, 0x99, +0x2d, 0x34, 0x96, 0x2c, 0x33, 0x94, 0x2a, 0x32, 0x91, 0x29, 0x31, 0x8f, +0x27, 0x2f, 0x8d, 0x27, 0x2e, 0x8a, 0x26, 0x2c, 0x89, 0x25, 0x2b, 0x87, +0x23, 0x2a, 0x84, 0x23, 0x29, 0x82, 0x22, 0x29, 0x80, 0x21, 0x27, 0x7f, +0x20, 0x26, 0x7d, 0x1f, 0x26, 0x7b, 0x1f, 0x25, 0x79, 0x1e, 0x24, 0x77, +0x1e, 0x23, 0x76, 0x1d, 0x22, 0x75, 0x1c, 0x21, 0x73, 0x1c, 0x21, 0x72, +0x1b, 0x20, 0x70, 0x1b, 0x20, 0x6f, 0x1a, 0x1f, 0x6d, 0x1a, 0x1e, 0x6c, +0x1a, 0x1e, 0x6a, 0x19, 0x1d, 0x69, 0x19, 0x1d, 0x68, 0x18, 0x1c, 0x66, +0x17, 0x1c, 0x65, 0x17, 0x1c, 0x65, 0x17, 0x1c, 0x63, 0x17, 0x1b, 0x62, +0x16, 0x1b, 0x61, 0x16, 0x1b, 0x60, 0x16, 0x1a, 0x5f, 0x16, 0x1a, 0x5e, +0x16, 0x1a, 0x5d, 0x15, 0x19, 0x5c, 0x15, 0x19, 0x5b, 0x15, 0x19, 0x5a, +0x15, 0x19, 0x59, 0x14, 0x18, 0x58, 0x14, 0x18, 0x57, 0x14, 0x18, 0x56, +0x14, 0x17, 0x55, 0x14, 0x17, 0x55, 0x13, 0x17, 0x54, 0x13, 0x17, 0x53, +0x13, 0x17, 0x52, 0x13, 0x16, 0x51, 0x13, 0x16, 0x51, 0x12, 0x16, 0x50, +0x12, 0x16, 0x4f, 0x12, 0x15, 0x4e, 0x12, 0x15, 0x4e, 0x12, 0x15, 0x4d, +0x11, 0x15, 0x4c, 0x11, 0x15, 0x4c, 0x11, 0x15, 0x4b, 0x11, 0x14, 0x4a, +0x11, 0x14, 0x49, 0x11, 0x14, 0x48, 0x10, 0x14, 0x48, 0x10, 0x14, 0x48, +0x10, 0x13, 0x47, 0x10, 0x13, 0x47, 0x10, 0x13, 0x45, 0x10, 0x13, 0x45, +0x10, 0x13, 0x44, 0x0f, 0x12, 0x44, 0x0f, 0x12, 0x44, 0x0f, 0x12, 0x43, +0x0f, 0x11, 0x42, 0x0f, 0x11, 0x41, 0x0f, 0x11, 0x41, 0x0f, 0x11, 0x40, +0x0f, 0x11, 0x40, 0x0e, 0x10, 0x3f, 0x0e, 0x10, 0x3f, 0x0d, 0x10, 0x3e, +0x0d, 0x10, 0x3e, 0x0d, 0x10, 0x3e, 0x0d, 0x0f, 0x37, 0x01, 0x01, 0x05, +0x11, 0x14, 0x48, 0x23, 0x2b, 0x93, 0x24, 0x2d, 0x99, 0x20, 0x26, 0x82, +0x1d, 0x23, 0x79, 0x1e, 0x23, 0x7b, 0x1f, 0x24, 0x7d, 0x20, 0x25, 0x7f, +0x21, 0x26, 0x81, 0x21, 0x28, 0x82, 0x22, 0x29, 0x85, 0x23, 0x2a, 0x87, +0x25, 0x2c, 0x89, 0x27, 0x2e, 0x8b, 0x28, 0x2f, 0x8d, 0x2a, 0x31, 0x90, +0x2c, 0x33, 0x92, 0x2e, 0x34, 0x94, 0x30, 0x39, 0x96, 0x33, 0x3a, 0x99, +0xd1, 0xcc, 0x17, 0xdb, 0xd4, 0x1c, 0xde, 0xdc, 0x1f, 0xdf, 0xd9, 0x22, +0xde, 0xdb, 0x1d, 0xc7, 0xc5, 0x18, 0xc0, 0xba, 0x15, 0x4f, 0x57, 0x9e, +0x3b, 0x46, 0xb5, 0x3b, 0x46, 0xb8, 0x3b, 0x45, 0xbc, 0x3b, 0x45, 0xbf, +0x3a, 0x44, 0xc4, 0x3a, 0x44, 0xc8, 0x3d, 0x48, 0xcc, 0x40, 0x4c, 0xd0, +0x45, 0x51, 0xd5, 0x4b, 0x58, 0xd9, 0x52, 0x60, 0xdf, 0x5a, 0x68, 0xe2, +0x57, 0x65, 0xd1, 0x86, 0x8d, 0x8d, 0xe0, 0xde, 0x25, 0xd7, 0xd5, 0x1c, +0xe0, 0xd9, 0x23, 0xb3, 0xb3, 0x41, 0x2c, 0x36, 0x6b, 0x15, 0x1b, 0x43, +0x16, 0x1d, 0x47, 0x17, 0x1e, 0x49, 0x19, 0x20, 0x4d, 0x1a, 0x21, 0x51, +0x1b, 0x23, 0x55, 0x1d, 0x25, 0x59, 0x4b, 0x50, 0x4c, 0xe0, 0xde, 0x25, +0xe1, 0xda, 0x26, 0xe4, 0xe2, 0x35, 0xdf, 0xd9, 0x22, 0xdd, 0xd6, 0x1c, +0xdf, 0xd8, 0x20, 0x8a, 0x8f, 0x7d, 0x6d, 0x7a, 0xcf, 0x77, 0x85, 0xde, +0x76, 0x85, 0xe1, 0x73, 0x82, 0xe1, 0x71, 0x7f, 0xe1, 0x6c, 0x7b, 0xdd, +0x64, 0x73, 0xd4, 0x57, 0x66, 0xc5, 0x4b, 0x59, 0xb6, 0x41, 0x4e, 0xa8, +0x39, 0x46, 0x9b, 0x32, 0x3e, 0x8f, 0x4b, 0x55, 0x82, 0xde, 0xd8, 0x1f, +0xe4, 0xe2, 0x33, 0xe1, 0xdf, 0x2a, 0xd7, 0xd5, 0x1c, 0xdd, 0xd6, 0x1c, +0xe3, 0xdd, 0x30, 0xdb, 0xd4, 0x1c, 0x2c, 0x34, 0x66, 0x28, 0x30, 0x5f, +0x25, 0x2c, 0x5a, 0x22, 0x28, 0x54, 0x1f, 0x26, 0x50, 0x1c, 0x22, 0x4a, +0x1a, 0x20, 0x46, 0x2b, 0x33, 0x63, 0x42, 0x4e, 0x94, 0x5d, 0x6b, 0xe0, +0x52, 0x60, 0xe2, 0x48, 0x55, 0xe2, 0x40, 0x4d, 0xe3, 0x39, 0x45, 0xe3, +0x3c, 0x48, 0xdf, 0x3f, 0x4b, 0xda, 0x41, 0x4e, 0xd5, 0x45, 0x50, 0xd0, +0x48, 0x53, 0xcc, 0x4a, 0x55, 0xc8, 0x4b, 0x56, 0xc4, 0x48, 0x53, 0xbf, +0x44, 0x4f, 0xbc, 0x41, 0x4a, 0xb8, 0x3d, 0x48, 0xb5, 0x3a, 0x45, 0xb1, +0x39, 0x42, 0xae, 0x37, 0x3f, 0xab, 0x35, 0x3d, 0xa7, 0x33, 0x3b, 0xa4, +0x31, 0x39, 0xa1, 0x30, 0x38, 0x9f, 0x2e, 0x36, 0x9c, 0x2c, 0x33, 0x99, +0x2b, 0x32, 0x96, 0x29, 0x31, 0x94, 0x28, 0x30, 0x92, 0x27, 0x2e, 0x8f, +0x25, 0x2c, 0x8d, 0x25, 0x2c, 0x8b, 0x24, 0x2b, 0x89, 0x23, 0x2a, 0x87, +0x22, 0x29, 0x85, 0x21, 0x28, 0x82, 0x21, 0x27, 0x81, 0x20, 0x25, 0x7f, +0x1f, 0x24, 0x7d, 0x1f, 0x24, 0x7b, 0x1e, 0x23, 0x79, 0x1d, 0x22, 0x78, +0x1d, 0x22, 0x76, 0x1c, 0x21, 0x75, 0x1b, 0x20, 0x73, 0x1b, 0x20, 0x72, +0x1b, 0x1f, 0x70, 0x1a, 0x1f, 0x6f, 0x1a, 0x1f, 0x6d, 0x19, 0x1e, 0x6c, +0x19, 0x1e, 0x6a, 0x19, 0x1d, 0x69, 0x19, 0x1d, 0x68, 0x18, 0x1d, 0x66, +0x18, 0x1d, 0x65, 0x18, 0x1c, 0x65, 0x17, 0x1c, 0x63, 0x17, 0x1c, 0x63, +0x17, 0x1b, 0x61, 0x17, 0x1b, 0x60, 0x16, 0x1a, 0x5f, 0x16, 0x1a, 0x5e, +0x16, 0x1a, 0x5d, 0x15, 0x19, 0x5c, 0x15, 0x19, 0x5b, 0x15, 0x19, 0x5a, +0x15, 0x19, 0x59, 0x14, 0x19, 0x58, 0x14, 0x18, 0x57, 0x14, 0x18, 0x56, +0x14, 0x18, 0x56, 0x14, 0x18, 0x55, 0x13, 0x17, 0x54, 0x13, 0x17, 0x53, +0x13, 0x17, 0x52, 0x13, 0x16, 0x51, 0x13, 0x16, 0x51, 0x12, 0x16, 0x50, +0x12, 0x16, 0x4f, 0x12, 0x16, 0x4e, 0x12, 0x16, 0x4e, 0x12, 0x15, 0x4d, +0x12, 0x15, 0x4c, 0x12, 0x15, 0x4c, 0x11, 0x15, 0x4b, 0x11, 0x14, 0x4a, +0x11, 0x14, 0x49, 0x11, 0x14, 0x48, 0x10, 0x14, 0x48, 0x10, 0x14, 0x48, +0x10, 0x13, 0x47, 0x10, 0x13, 0x47, 0x10, 0x13, 0x45, 0x10, 0x13, 0x45, +0x10, 0x13, 0x44, 0x10, 0x13, 0x44, 0x10, 0x13, 0x44, 0x0f, 0x12, 0x43, +0x0f, 0x11, 0x42, 0x0f, 0x11, 0x41, 0x0f, 0x11, 0x41, 0x0f, 0x11, 0x40, +0x0f, 0x11, 0x40, 0x0e, 0x11, 0x3f, 0x0e, 0x11, 0x3f, 0x0e, 0x10, 0x3f, +0x0d, 0x10, 0x3e, 0x0d, 0x10, 0x3e, 0x0d, 0x0f, 0x37, 0x01, 0x01, 0x05, +0x13, 0x16, 0x49, 0x25, 0x2c, 0x93, 0x27, 0x2d, 0x99, 0x22, 0x27, 0x82, +0x1e, 0x24, 0x7a, 0x1e, 0x23, 0x7c, 0x1f, 0x24, 0x7e, 0x1e, 0x24, 0x80, +0x1f, 0x25, 0x81, 0x1f, 0x25, 0x83, 0x20, 0x26, 0x85, 0x20, 0x27, 0x87, +0x22, 0x28, 0x8a, 0x23, 0x29, 0x8b, 0x24, 0x2b, 0x8e, 0x25, 0x2c, 0x90, +0x27, 0x2e, 0x92, 0x28, 0x30, 0x95, 0x2a, 0x32, 0x97, 0x92, 0x92, 0x48, +0xdb, 0xd4, 0x1c, 0xd4, 0xcd, 0x1b, 0xe2, 0xe0, 0x2d, 0xdf, 0xd9, 0x22, +0xd1, 0xcf, 0x1a, 0xbe, 0xb8, 0x15, 0x78, 0x7c, 0x77, 0x46, 0x51, 0xb2, +0x46, 0x51, 0xb6, 0x46, 0x50, 0xb9, 0x46, 0x51, 0xbd, 0x46, 0x50, 0xc1, +0x44, 0x50, 0xc4, 0x44, 0x50, 0xc9, 0x43, 0x4d, 0xcd, 0x40, 0x4c, 0xd1, +0x40, 0x4b, 0xd6, 0x40, 0x4b, 0xdb, 0x45, 0x51, 0xe0, 0x4b, 0x58, 0xe2, +0x54, 0x63, 0xe1, 0x86, 0x8d, 0x8d, 0xdb, 0xd4, 0x1c, 0xe1, 0xdb, 0x28, +0xe1, 0xda, 0x26, 0x81, 0x83, 0x43, 0x38, 0x43, 0x83, 0x34, 0x3e, 0x7a, +0x17, 0x1e, 0x48, 0x19, 0x20, 0x4c, 0x1a, 0x21, 0x50, 0x1c, 0x23, 0x54, +0x1d, 0x25, 0x58, 0x1f, 0x27, 0x5e, 0xcf, 0xca, 0x11, 0xe1, 0xda, 0x26, +0xe0, 0xde, 0x25, 0xdb, 0xd4, 0x1c, 0xde, 0xdb, 0x1d, 0xe2, 0xdc, 0x2b, +0xb5, 0xb4, 0x40, 0x64, 0x71, 0xc9, 0x78, 0x87, 0xe4, 0x92, 0xa1, 0xfd, +0x8e, 0x9d, 0xfd, 0x86, 0x96, 0xfd, 0x80, 0x91, 0xfd, 0x7a, 0x8b, 0xf9, +0x6f, 0x80, 0xed, 0x61, 0x71, 0xdc, 0x54, 0x63, 0xca, 0x49, 0x58, 0xba, +0x3d, 0x4c, 0xa9, 0x42, 0x4f, 0xa7, 0x4b, 0x58, 0xaa, 0xb5, 0xb4, 0x3e, +0xde, 0xd8, 0x1f, 0xe1, 0xdf, 0x2a, 0xdc, 0xda, 0x1d, 0xde, 0xd7, 0x1d, +0xe1, 0xda, 0x26, 0xe2, 0xe0, 0x2d, 0x6a, 0x6d, 0x48, 0x2a, 0x31, 0x62, +0x25, 0x2c, 0x5b, 0x21, 0x28, 0x55, 0x1e, 0x25, 0x4f, 0x1b, 0x22, 0x4a, +0x28, 0x31, 0x60, 0x4d, 0x5a, 0xaf, 0x57, 0x66, 0xe0, 0x4c, 0x5b, 0xe0, +0x44, 0x53, 0xe1, 0x47, 0x55, 0xe1, 0x49, 0x57, 0xe2, 0x4c, 0x59, 0xe3, +0x4f, 0x5c, 0xe0, 0x53, 0x60, 0xdb, 0x56, 0x63, 0xd6, 0x53, 0x5f, 0xd1, +0x4d, 0x59, 0xcd, 0x4a, 0x55, 0xc9, 0x46, 0x50, 0xc4, 0x42, 0x4c, 0xc1, +0x40, 0x49, 0xbc, 0x3c, 0x46, 0xb8, 0x39, 0x43, 0xb5, 0x37, 0x41, 0xb1, +0x36, 0x3f, 0xae, 0x33, 0x3c, 0xab, 0x32, 0x3a, 0xa8, 0x2f, 0x37, 0xa5, +0x2e, 0x36, 0xa2, 0x2d, 0x35, 0x9f, 0x2b, 0x33, 0x9c, 0x29, 0x31, 0x9a, +0x29, 0x30, 0x97, 0x27, 0x2f, 0x95, 0x26, 0x2e, 0x92, 0x25, 0x2c, 0x90, +0x24, 0x2b, 0x8e, 0x23, 0x2a, 0x8b, 0x22, 0x29, 0x89, 0x22, 0x28, 0x87, +0x21, 0x27, 0x85, 0x20, 0x26, 0x83, 0x1f, 0x25, 0x81, 0x1f, 0x24, 0x80, +0x1f, 0x24, 0x7e, 0x1e, 0x23, 0x7c, 0x1d, 0x23, 0x7a, 0x1d, 0x22, 0x78, +0x1c, 0x21, 0x77, 0x1c, 0x21, 0x75, 0x1c, 0x21, 0x74, 0x1c, 0x20, 0x72, +0x1b, 0x20, 0x70, 0x1a, 0x1f, 0x6f, 0x1a, 0x1f, 0x6d, 0x1a, 0x1e, 0x6c, +0x1a, 0x1e, 0x6b, 0x19, 0x1d, 0x69, 0x19, 0x1e, 0x68, 0x19, 0x1d, 0x68, +0x18, 0x1d, 0x66, 0x18, 0x1c, 0x65, 0x17, 0x1c, 0x64, 0x17, 0x1c, 0x63, +0x17, 0x1b, 0x62, 0x17, 0x1b, 0x60, 0x16, 0x1b, 0x5f, 0x16, 0x1a, 0x5e, +0x16, 0x1a, 0x5d, 0x16, 0x1a, 0x5c, 0x15, 0x19, 0x5b, 0x15, 0x1a, 0x5a, +0x15, 0x19, 0x59, 0x14, 0x19, 0x58, 0x14, 0x18, 0x57, 0x14, 0x18, 0x56, +0x14, 0x18, 0x56, 0x14, 0x18, 0x55, 0x14, 0x17, 0x54, 0x13, 0x17, 0x53, +0x13, 0x17, 0x52, 0x13, 0x17, 0x51, 0x13, 0x17, 0x51, 0x12, 0x16, 0x50, +0x12, 0x16, 0x4f, 0x12, 0x16, 0x4e, 0x12, 0x16, 0x4e, 0x12, 0x15, 0x4d, +0x12, 0x15, 0x4c, 0x12, 0x15, 0x4c, 0x11, 0x15, 0x4b, 0x11, 0x15, 0x4a, +0x11, 0x15, 0x49, 0x11, 0x14, 0x48, 0x11, 0x14, 0x48, 0x11, 0x14, 0x48, +0x10, 0x14, 0x47, 0x10, 0x14, 0x47, 0x10, 0x13, 0x45, 0x10, 0x13, 0x45, +0x10, 0x13, 0x44, 0x10, 0x13, 0x44, 0x10, 0x13, 0x44, 0x0f, 0x12, 0x43, +0x0f, 0x11, 0x42, 0x0f, 0x11, 0x41, 0x0f, 0x11, 0x41, 0x0f, 0x11, 0x40, +0x0f, 0x11, 0x40, 0x0f, 0x11, 0x3f, 0x0f, 0x11, 0x3f, 0x0e, 0x11, 0x3f, +0x0e, 0x11, 0x3e, 0x0e, 0x11, 0x3e, 0x0e, 0x0f, 0x37, 0x01, 0x01, 0x05, +0x14, 0x17, 0x49, 0x29, 0x2f, 0x94, 0x2a, 0x31, 0x99, 0x24, 0x2a, 0x82, +0x20, 0x26, 0x7a, 0x20, 0x26, 0x7c, 0x21, 0x27, 0x7e, 0x21, 0x27, 0x80, +0x21, 0x27, 0x81, 0x21, 0x28, 0x83, 0x22, 0x28, 0x85, 0x23, 0x28, 0x88, +0x22, 0x29, 0x8a, 0x22, 0x28, 0x8c, 0x23, 0x29, 0x8e, 0x23, 0x29, 0x90, +0x23, 0x2a, 0x93, 0x24, 0x2b, 0x95, 0x4f, 0x53, 0x77, 0xcb, 0xc4, 0x18, +0xc9, 0xc7, 0x18, 0xde, 0xdb, 0x1d, 0xdb, 0xd4, 0x1c, 0xd4, 0xcd, 0x1b, +0xdf, 0xd9, 0x22, 0xbd, 0xba, 0x2b, 0x35, 0x3e, 0xaf, 0x38, 0x42, 0xb3, +0x3b, 0x46, 0xb6, 0x40, 0x4b, 0xb9, 0x45, 0x50, 0xbd, 0x4c, 0x57, 0xc2, +0x52, 0x5e, 0xc5, 0x52, 0x5f, 0xc9, 0x52, 0x5f, 0xce, 0x51, 0x5d, 0xd2, +0x4f, 0x5c, 0xd7, 0x4e, 0x5b, 0xdc, 0x4c, 0x59, 0xe1, 0x4b, 0x58, 0xe2, +0x49, 0x57, 0xe1, 0x70, 0x7a, 0xb0, 0xb6, 0xb6, 0x4f, 0xb3, 0xb3, 0x41, +0xa8, 0xa6, 0x28, 0x42, 0x45, 0x33, 0x16, 0x1c, 0x43, 0x17, 0x1e, 0x47, +0x19, 0x1f, 0x4b, 0x1a, 0x21, 0x4e, 0x1c, 0x23, 0x53, 0x1d, 0x25, 0x57, +0x20, 0x28, 0x5d, 0x8e, 0x8e, 0x2f, 0xe0, 0xde, 0x25, 0xd2, 0xcc, 0x1b, +0xd9, 0xd2, 0x1c, 0xdf, 0xd9, 0x22, 0xdf, 0xd8, 0x20, 0xd7, 0xd5, 0x1c, +0x64, 0x6e, 0xa6, 0x6a, 0x79, 0xd8, 0x80, 0x90, 0xf6, 0x99, 0xaa, 0xfd, +0xa5, 0xb6, 0xfd, 0x9d, 0xaf, 0xfd, 0x93, 0xa6, 0xfd, 0x8c, 0x9f, 0xfd, +0x7d, 0x90, 0xfd, 0x6b, 0x7d, 0xf6, 0x5b, 0x6c, 0xe0, 0x4d, 0x5e, 0xcb, +0x4b, 0x5b, 0xc1, 0x5c, 0x6a, 0xca, 0x67, 0x75, 0xce, 0xa3, 0xa6, 0x75, +0xd7, 0xd0, 0x1c, 0xd1, 0xca, 0x1a, 0xe1, 0xdf, 0x2a, 0xe7, 0xe1, 0x3e, +0xe1, 0xdb, 0x2a, 0xdf, 0xd9, 0x22, 0xa8, 0xa6, 0x28, 0x28, 0x30, 0x62, +0x23, 0x2b, 0x5a, 0x20, 0x27, 0x54, 0x1d, 0x24, 0x4f, 0x3c, 0x47, 0x88, +0x5a, 0x6a, 0xd9, 0x74, 0x7f, 0xae, 0x96, 0x9c, 0x7f, 0xb7, 0xb8, 0x4e, +0xdb, 0xd4, 0x1c, 0xa2, 0xa3, 0x54, 0x4a, 0x56, 0xa9, 0x54, 0x60, 0xc6, +0x59, 0x67, 0xe1, 0x53, 0x61, 0xdc, 0x4e, 0x5b, 0xd7, 0x49, 0x56, 0xd2, +0x45, 0x51, 0xce, 0x43, 0x4e, 0xc9, 0x51, 0x5a, 0xaf, 0x9a, 0x9b, 0x5a, +0xe8, 0xe6, 0x3f, 0xe3, 0xe1, 0x32, 0xbe, 0xbb, 0x2d, 0x5a, 0x5f, 0x8c, +0x32, 0x3a, 0xae, 0x2f, 0x37, 0xab, 0x2e, 0x36, 0xa8, 0x2c, 0x35, 0xa5, +0x2a, 0x33, 0xa3, 0x2a, 0x32, 0xa0, 0x28, 0x31, 0x9d, 0x27, 0x2f, 0x9a, +0x66, 0x69, 0x67, 0x8f, 0x8e, 0x46, 0xba, 0xb6, 0x26, 0xcb, 0xc4, 0x18, +0xc9, 0xc7, 0x18, 0xa4, 0xa2, 0x33, 0x22, 0x28, 0x8a, 0x21, 0x27, 0x88, +0x20, 0x26, 0x85, 0x20, 0x26, 0x83, 0x1f, 0x25, 0x81, 0x1f, 0x25, 0x80, +0x1f, 0x24, 0x7e, 0x1e, 0x24, 0x7c, 0x1e, 0x23, 0x7a, 0x1d, 0x22, 0x78, +0x1d, 0x22, 0x77, 0x1d, 0x22, 0x76, 0x1c, 0x22, 0x74, 0x1c, 0x21, 0x72, +0x32, 0x35, 0x65, 0x74, 0x74, 0x40, 0xa2, 0x9f, 0x29, 0xdb, 0xd4, 0x1c, +0xc7, 0xc5, 0x18, 0xc3, 0xbd, 0x16, 0xce, 0xc9, 0x12, 0xa1, 0x9e, 0x27, +0x45, 0x47, 0x51, 0x18, 0x1c, 0x65, 0x18, 0x1c, 0x64, 0x17, 0x1c, 0x63, +0x18, 0x1b, 0x62, 0x17, 0x1b, 0x60, 0x17, 0x1b, 0x5f, 0x17, 0x1a, 0x5e, +0x16, 0x1a, 0x5d, 0x5b, 0x5b, 0x3f, 0x88, 0x86, 0x2c, 0xb7, 0xb2, 0x19, +0xd9, 0xd2, 0x1c, 0xdf, 0xd9, 0x22, 0x5a, 0x5b, 0x3c, 0x14, 0x19, 0x57, +0x14, 0x18, 0x56, 0x14, 0x18, 0x55, 0x14, 0x17, 0x54, 0x13, 0x17, 0x53, +0x13, 0x17, 0x52, 0x13, 0x17, 0x52, 0x13, 0x17, 0x51, 0x13, 0x16, 0x50, +0x12, 0x16, 0x4f, 0x12, 0x16, 0x4f, 0x12, 0x16, 0x4e, 0x29, 0x2c, 0x45, +0x40, 0x41, 0x3c, 0x12, 0x15, 0x4c, 0x11, 0x15, 0x4b, 0x11, 0x15, 0x4a, +0x11, 0x15, 0x4a, 0x11, 0x15, 0x48, 0x11, 0x15, 0x48, 0x11, 0x14, 0x48, +0x58, 0x57, 0x31, 0xb6, 0xb1, 0x15, 0xe2, 0xdc, 0x2b, 0xcd, 0xc7, 0x0e, +0x6e, 0x6d, 0x28, 0x10, 0x13, 0x44, 0x10, 0x13, 0x44, 0x10, 0x13, 0x43, +0x0f, 0x12, 0x42, 0x0f, 0x12, 0x41, 0x0f, 0x12, 0x41, 0x0f, 0x11, 0x40, +0x0f, 0x11, 0x40, 0x0f, 0x11, 0x3f, 0x0f, 0x11, 0x3f, 0x0e, 0x11, 0x3f, +0x0e, 0x11, 0x3e, 0x0e, 0x11, 0x3e, 0x0e, 0x0f, 0x37, 0x01, 0x01, 0x05, +0x15, 0x19, 0x49, 0x2b, 0x33, 0x94, 0x2d, 0x35, 0x99, 0x26, 0x2d, 0x82, +0x23, 0x29, 0x7a, 0x23, 0x29, 0x7c, 0x23, 0x2a, 0x7e, 0x24, 0x2a, 0x80, +0x24, 0x2a, 0x81, 0x24, 0x2b, 0x83, 0x25, 0x2c, 0x86, 0x25, 0x2c, 0x88, +0x25, 0x2d, 0x8a, 0x26, 0x2d, 0x8c, 0x26, 0x2d, 0x8e, 0x27, 0x2e, 0x90, +0x26, 0x2e, 0x93, 0x27, 0x2e, 0x96, 0xbb, 0xb7, 0x27, 0xe1, 0xda, 0x26, +0xe1, 0xdf, 0x2a, 0xd4, 0xcd, 0x1b, 0xd7, 0xd5, 0x1c, 0xc7, 0xc1, 0x18, +0xd4, 0xcd, 0x1b, 0x53, 0x58, 0x87, 0x2c, 0x35, 0xb0, 0x2e, 0x37, 0xb3, +0x31, 0x3a, 0xb6, 0x33, 0x3d, 0xba, 0x37, 0x41, 0xbe, 0x3a, 0x44, 0xc2, +0x3f, 0x4a, 0xc7, 0x44, 0x4f, 0xcb, 0x49, 0x55, 0xcf, 0x51, 0x5d, 0xd4, +0x55, 0x61, 0xce, 0x48, 0x52, 0xa4, 0x50, 0x5b, 0xb8, 0x52, 0x5f, 0xbf, +0x51, 0x5f, 0xbe, 0x51, 0x5f, 0xbe, 0x53, 0x61, 0xc5, 0x55, 0x64, 0xcc, +0x55, 0x64, 0xcb, 0x41, 0x4e, 0x96, 0x1a, 0x21, 0x4b, 0x18, 0x1e, 0x48, +0x1a, 0x21, 0x4d, 0x1c, 0x23, 0x51, 0x1d, 0x25, 0x56, 0x20, 0x28, 0x5b, +0x37, 0x3d, 0x56, 0xe3, 0xdd, 0x30, 0xde, 0xd7, 0x1d, 0xdf, 0xd9, 0x22, +0xe0, 0xde, 0x25, 0xde, 0xd7, 0x1d, 0xe2, 0xe0, 0x2d, 0xaf, 0xaf, 0x3c, +0x53, 0x62, 0xc1, 0x69, 0x79, 0xe1, 0x83, 0x94, 0xfd, 0x9f, 0xb2, 0xfd, +0xc3, 0xd7, 0xfd, 0xba, 0xd0, 0xfd, 0xae, 0xc4, 0xfd, 0xa4, 0xbb, 0xfd, +0x8f, 0xa5, 0xfd, 0x75, 0x8b, 0xfd, 0x61, 0x75, 0xf8, 0x51, 0x64, 0xde, +0x6b, 0x7c, 0xed, 0x82, 0x92, 0xfa, 0x8c, 0x9b, 0xf6, 0x9c, 0xa2, 0x95, +0xc4, 0xbe, 0x17, 0xd4, 0xcd, 0x1b, 0xe1, 0xda, 0x26, 0xe3, 0xdd, 0x2e, +0xe2, 0xdc, 0x2b, 0xe4, 0xde, 0x33, 0xbc, 0xb8, 0x1c, 0x26, 0x2e, 0x62, +0x22, 0x29, 0x5a, 0x4f, 0x54, 0x4b, 0x88, 0x8c, 0x52, 0xa8, 0xa6, 0x28, +0xdb, 0xd4, 0x1c, 0xe0, 0xda, 0x25, 0xe1, 0xda, 0x26, 0xdd, 0xd6, 0x1c, +0xde, 0xd8, 0x1f, 0xcc, 0xc6, 0x19, 0x97, 0x9c, 0x7d, 0x54, 0x62, 0xe1, +0x4e, 0x5b, 0xe2, 0x4a, 0x56, 0xdd, 0x46, 0x52, 0xd8, 0x41, 0x4d, 0xd3, +0x3e, 0x49, 0xce, 0x3c, 0x46, 0xca, 0xac, 0xab, 0x46, 0xde, 0xdb, 0x1d, +0xe0, 0xda, 0x25, 0xe3, 0xdd, 0x2e, 0xe1, 0xdf, 0x2a, 0xdf, 0xd9, 0x22, +0x41, 0x48, 0x9c, 0x2c, 0x35, 0xac, 0x2b, 0x33, 0xa9, 0x3e, 0x44, 0x94, +0x67, 0x6a, 0x6f, 0x90, 0x90, 0x4b, 0xbb, 0xb7, 0x28, 0xdf, 0xd9, 0x22, +0xe1, 0xdb, 0x2a, 0xe1, 0xdb, 0x2a, 0xde, 0xdb, 0x1d, 0xe1, 0xda, 0x26, +0xe1, 0xdf, 0x2a, 0xa5, 0xa2, 0x33, 0x22, 0x29, 0x8a, 0x22, 0x28, 0x88, +0x22, 0x27, 0x86, 0x20, 0x26, 0x83, 0x20, 0x26, 0x82, 0x20, 0x26, 0x80, +0x1f, 0x25, 0x7e, 0x1f, 0x24, 0x7c, 0x1e, 0x24, 0x7a, 0x1e, 0x23, 0x78, +0x1d, 0x22, 0x77, 0x1d, 0x22, 0x76, 0x32, 0x36, 0x68, 0x8b, 0x8a, 0x36, +0xdc, 0xda, 0x1d, 0xe0, 0xd9, 0x23, 0xe0, 0xde, 0x25, 0xd1, 0xcf, 0x1a, +0xd4, 0xcd, 0x1b, 0xd9, 0xd2, 0x1c, 0xdf, 0xd8, 0x20, 0xdf, 0xd8, 0x20, +0xde, 0xd7, 0x1d, 0x89, 0x88, 0x31, 0x18, 0x1c, 0x64, 0x18, 0x1c, 0x63, +0x18, 0x1c, 0x62, 0x2d, 0x30, 0x57, 0x72, 0x71, 0x38, 0xa1, 0x9d, 0x24, +0xdf, 0xd9, 0x22, 0xe3, 0xdd, 0x30, 0xde, 0xd7, 0x1d, 0xdf, 0xd9, 0x22, +0xe0, 0xde, 0x25, 0xde, 0xd7, 0x1d, 0x5a, 0x5b, 0x3d, 0x15, 0x19, 0x57, +0x15, 0x19, 0x56, 0x15, 0x18, 0x55, 0x15, 0x18, 0x54, 0x14, 0x18, 0x53, +0x14, 0x18, 0x52, 0x14, 0x18, 0x52, 0x14, 0x17, 0x51, 0x2b, 0x2c, 0x47, +0xd5, 0xcf, 0x1c, 0xdd, 0xd6, 0x1c, 0xde, 0xdc, 0x1f, 0xdb, 0xd4, 0x1c, +0x9f, 0x9c, 0x1e, 0x12, 0x16, 0x4c, 0x12, 0x16, 0x4b, 0x12, 0x15, 0x4a, +0x12, 0x15, 0x4a, 0x12, 0x15, 0x48, 0x12, 0x15, 0x48, 0x40, 0x41, 0x39, +0xe2, 0xdc, 0x2b, 0xe4, 0xde, 0x33, 0xe2, 0xe0, 0x2b, 0xe1, 0xdb, 0x28, +0xe1, 0xdb, 0x28, 0x6f, 0x6d, 0x28, 0x10, 0x13, 0x44, 0x10, 0x13, 0x44, +0x0f, 0x12, 0x42, 0x0f, 0x12, 0x41, 0x0f, 0x12, 0x41, 0x0f, 0x12, 0x40, +0x0f, 0x12, 0x40, 0x0f, 0x12, 0x40, 0x0f, 0x11, 0x3f, 0x0e, 0x11, 0x3f, +0x0e, 0x11, 0x3e, 0x0e, 0x11, 0x3e, 0x0e, 0x10, 0x37, 0x01, 0x01, 0x05, +0x16, 0x1a, 0x49, 0x2e, 0x36, 0x94, 0x31, 0x38, 0x9c, 0x2a, 0x30, 0x82, +0x26, 0x2c, 0x7a, 0x26, 0x2d, 0x7c, 0x27, 0x2d, 0x7e, 0x27, 0x2e, 0x80, +0x27, 0x2e, 0x81, 0x28, 0x2f, 0x84, 0x28, 0x30, 0x86, 0x29, 0x30, 0x88, +0x2a, 0x31, 0x8a, 0x2a, 0x31, 0x8c, 0x2b, 0x32, 0x8f, 0x2b, 0x33, 0x90, +0x2b, 0x33, 0x93, 0x54, 0x59, 0x76, 0xe0, 0xde, 0x25, 0xe6, 0xdf, 0x37, +0xe0, 0xde, 0x25, 0xdf, 0xd9, 0x22, 0xd1, 0xcf, 0x1a, 0xd1, 0xcf, 0x1a, +0xbc, 0xb9, 0x2b, 0x2e, 0x37, 0xac, 0x2e, 0x37, 0xb0, 0x2f, 0x38, 0xb3, +0x2e, 0x37, 0xb7, 0x2e, 0x37, 0xbb, 0x2e, 0x37, 0xbf, 0x2e, 0x37, 0xc3, +0x30, 0x3a, 0xc7, 0x33, 0x3d, 0xcc, 0x36, 0x41, 0xd0, 0x3a, 0x45, 0xd4, +0x3e, 0x4a, 0xd9, 0x44, 0x50, 0xde, 0x4c, 0x58, 0xe2, 0x55, 0x64, 0xe2, +0x51, 0x5f, 0xbe, 0x2d, 0x36, 0x69, 0x12, 0x17, 0x39, 0x13, 0x18, 0x3c, +0x14, 0x1a, 0x3f, 0x15, 0x1b, 0x42, 0x17, 0x1d, 0x46, 0x18, 0x1f, 0x4a, +0x1a, 0x21, 0x4e, 0x1c, 0x23, 0x52, 0x1e, 0x26, 0x58, 0x21, 0x29, 0x5e, +0x7a, 0x7b, 0x3b, 0xdf, 0xd8, 0x20, 0xe0, 0xda, 0x25, 0xdc, 0xda, 0x1d, +0xe2, 0xdc, 0x2d, 0xde, 0xd8, 0x1f, 0xdb, 0xd4, 0x1c, 0x66, 0x6f, 0x89, +0x4d, 0x5d, 0xc3, 0x62, 0x73, 0xe4, 0x7e, 0x91, 0xfd, 0xa3, 0xb8, 0xfd, +0xd0, 0xe7, 0xfd, 0xe6, 0xfd, 0xfd, 0xd2, 0xec, 0xfd, 0xc5, 0xe0, 0xfd, +0xa6, 0xc0, 0xfd, 0x83, 0x9c, 0xfd, 0x69, 0x80, 0xfd, 0x7b, 0x90, 0xfd, +0x9c, 0xaf, 0xfd, 0xa9, 0xba, 0xfd, 0x94, 0xa4, 0xfd, 0x7f, 0x8d, 0xeb, +0xcf, 0xc9, 0x1a, 0xdd, 0xd6, 0x1c, 0xde, 0xd8, 0x1f, 0xe0, 0xd9, 0x23, +0xde, 0xdc, 0x1f, 0xe5, 0xdf, 0x34, 0xe6, 0xe0, 0x39, 0x24, 0x2c, 0x60, +0x62, 0x65, 0x3e, 0xe4, 0xde, 0x31, 0xdf, 0xd8, 0x20, 0xde, 0xd7, 0x1d, +0xe2, 0xe0, 0x2b, 0xd7, 0xd0, 0x1c, 0xdc, 0xda, 0x1d, 0xde, 0xdc, 0x1f, +0xe0, 0xd9, 0x23, 0xce, 0xc7, 0x19, 0xc4, 0xc2, 0x37, 0x48, 0x56, 0xe1, +0x43, 0x4f, 0xe2, 0x3f, 0x4b, 0xdd, 0x3c, 0x48, 0xd8, 0x3a, 0x45, 0xd4, +0x37, 0x42, 0xcf, 0x34, 0x3f, 0xcb, 0xaa, 0xa9, 0x47, 0xe0, 0xda, 0x25, +0xde, 0xd8, 0x1f, 0xde, 0xdc, 0x1f, 0xe3, 0xdd, 0x30, 0xe3, 0xdd, 0x30, +0x92, 0x93, 0x52, 0x2b, 0x33, 0xac, 0x2b, 0x33, 0xa9, 0xde, 0xdb, 0x1d, +0xe3, 0xdd, 0x2e, 0xe2, 0xe0, 0x2b, 0xde, 0xdb, 0x1d, 0xdb, 0xd4, 0x1c, +0xd7, 0xd5, 0x1c, 0xde, 0xd8, 0x1f, 0xe0, 0xde, 0x25, 0xe6, 0xdf, 0x37, +0xe0, 0xde, 0x25, 0x64, 0x66, 0x5f, 0x23, 0x29, 0x8a, 0x23, 0x28, 0x88, +0x22, 0x28, 0x86, 0x22, 0x27, 0x84, 0x20, 0x26, 0x82, 0x20, 0x26, 0x80, +0x20, 0x25, 0x7e, 0x1f, 0x25, 0x7c, 0x1f, 0x24, 0x7a, 0x1e, 0x23, 0x78, +0x1e, 0x23, 0x78, 0x76, 0x75, 0x44, 0xcf, 0xc9, 0x1a, 0xce, 0xcc, 0x19, +0xde, 0xd8, 0x1f, 0xdd, 0xd6, 0x1c, 0xce, 0xc9, 0x12, 0xa2, 0x9f, 0x28, +0xb8, 0xb4, 0x1d, 0xdf, 0xd9, 0x22, 0xe1, 0xdb, 0x28, 0xd7, 0xd5, 0x1c, +0xd2, 0xcc, 0x1b, 0xdf, 0xd8, 0x20, 0x73, 0x73, 0x3a, 0x19, 0x1d, 0x63, +0x19, 0x1d, 0x62, 0xe5, 0xdf, 0x36, 0xe6, 0xdf, 0x37, 0xe4, 0xde, 0x31, +0xe2, 0xdc, 0x2d, 0xdf, 0xd8, 0x20, 0xe0, 0xda, 0x25, 0xdc, 0xda, 0x1d, +0xe2, 0xdc, 0x2d, 0xde, 0xd8, 0x1f, 0x89, 0x86, 0x2b, 0x16, 0x1a, 0x57, +0x16, 0x1a, 0x56, 0x15, 0x19, 0x55, 0x15, 0x19, 0x54, 0x15, 0x19, 0x53, +0x14, 0x18, 0x52, 0x14, 0x18, 0x52, 0x14, 0x18, 0x51, 0x88, 0x86, 0x27, +0xe2, 0xdc, 0x2b, 0xcb, 0xc4, 0x18, 0xd9, 0xd2, 0x1c, 0xde, 0xd7, 0x1d, +0x9f, 0x9c, 0x1e, 0x13, 0x16, 0x4c, 0x13, 0x16, 0x4b, 0x13, 0x16, 0x4b, +0x12, 0x16, 0x4a, 0x12, 0x15, 0x48, 0x12, 0x15, 0x48, 0x12, 0x15, 0x48, +0xde, 0xdc, 0x1f, 0xe5, 0xdf, 0x34, 0xe6, 0xe0, 0x39, 0xe2, 0xe0, 0x2d, +0xe2, 0xdc, 0x2d, 0xcd, 0xc7, 0x0d, 0x11, 0x13, 0x44, 0x11, 0x13, 0x44, +0x10, 0x13, 0x42, 0x10, 0x13, 0x42, 0x0f, 0x12, 0x41, 0x0f, 0x12, 0x41, +0x0f, 0x12, 0x40, 0x0f, 0x12, 0x40, 0x0f, 0x12, 0x3f, 0x0f, 0x12, 0x3f, +0x0e, 0x11, 0x3e, 0x0e, 0x11, 0x3e, 0x0e, 0x10, 0x37, 0x01, 0x01, 0x05, +0x14, 0x18, 0x49, 0x29, 0x32, 0x94, 0x2d, 0x35, 0x9c, 0x27, 0x2d, 0x83, +0x23, 0x29, 0x7a, 0x24, 0x2a, 0x7c, 0x25, 0x2b, 0x7e, 0x26, 0x2c, 0x80, +0x27, 0x2d, 0x81, 0x28, 0x2f, 0x84, 0x29, 0x30, 0x86, 0x2a, 0x31, 0x88, +0x2c, 0x33, 0x8a, 0x2d, 0x34, 0x8c, 0x2e, 0x36, 0x8f, 0x30, 0x38, 0x91, +0x32, 0x39, 0x93, 0xaa, 0xa8, 0x36, 0xde, 0xd7, 0x1d, 0xe1, 0xda, 0x26, +0xe1, 0xdb, 0x28, 0xdf, 0xd9, 0x22, 0xe1, 0xdb, 0x28, 0xde, 0xd7, 0x1d, +0x71, 0x74, 0x73, 0x37, 0x40, 0xad, 0x37, 0x40, 0xb0, 0x38, 0x42, 0xb4, +0x38, 0x42, 0xb8, 0x38, 0x42, 0xbc, 0x38, 0x42, 0xbf, 0x38, 0x42, 0xc3, +0x38, 0x42, 0xc7, 0x38, 0x43, 0xcc, 0x38, 0x42, 0xd0, 0x37, 0x42, 0xd5, +0x36, 0x42, 0xda, 0x35, 0x41, 0xdf, 0x35, 0x41, 0xe2, 0x3a, 0x46, 0xe1, +0x41, 0x4e, 0xe1, 0x48, 0x56, 0xe0, 0x53, 0x62, 0xdf, 0x55, 0x64, 0xcc, +0x32, 0x3c, 0x75, 0x16, 0x1c, 0x43, 0x17, 0x1d, 0x47, 0x19, 0x1f, 0x4a, +0x1b, 0x22, 0x4f, 0x1d, 0x24, 0x54, 0x1f, 0x27, 0x59, 0x22, 0x2a, 0x60, +0xd0, 0xca, 0x11, 0xe3, 0xdd, 0x30, 0xd2, 0xcc, 0x1b, 0xdb, 0xd4, 0x1c, +0xe1, 0xdf, 0x2a, 0xe1, 0xda, 0x26, 0xd3, 0xcf, 0x19, 0x4f, 0x5e, 0xc0, +0x53, 0x64, 0xd1, 0x58, 0x6b, 0xe5, 0x74, 0x89, 0xfd, 0x9e, 0xb6, 0xfd, +0xd9, 0xf4, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xf7, 0xfd, 0xfd, +0xc5, 0xe5, 0xfd, 0x94, 0xb2, 0xfd, 0x8e, 0xa9, 0xfd, 0xc4, 0xdc, 0xfd, +0xcd, 0xe2, 0xfd, 0xaf, 0xc2, 0xfd, 0x98, 0xa9, 0xfd, 0x86, 0x95, 0xf7, +0xe0, 0xde, 0x25, 0xdf, 0xd9, 0x22, 0xd4, 0xcd, 0x1b, 0xd7, 0xd5, 0x1c, +0xdb, 0xd4, 0x1c, 0xe6, 0xdf, 0x37, 0xe1, 0xdf, 0x2a, 0x22, 0x2a, 0x60, +0x49, 0x4e, 0x46, 0xa2, 0xa0, 0x20, 0xce, 0xc9, 0x0f, 0xe1, 0xda, 0x26, +0xde, 0xdc, 0x1f, 0xd1, 0xcf, 0x1a, 0xd9, 0xd2, 0x1c, 0xe0, 0xde, 0x25, +0xe0, 0xda, 0x25, 0xd2, 0xcc, 0x1b, 0xcc, 0xc6, 0x19, 0x3e, 0x4a, 0xe1, +0x39, 0x45, 0xe2, 0x36, 0x41, 0xde, 0x35, 0x40, 0xda, 0x34, 0x40, 0xd5, +0x34, 0x3f, 0xd0, 0x33, 0x3e, 0xcc, 0x6e, 0x72, 0x87, 0xe6, 0xe0, 0x39, +0xe3, 0xdd, 0x30, 0xe1, 0xdf, 0x2a, 0xcc, 0xc6, 0x19, 0xd7, 0xd5, 0x1c, +0xa8, 0xa6, 0x3f, 0x2d, 0x35, 0xad, 0x2c, 0x34, 0xaa, 0xa7, 0xa6, 0x3c, +0xd0, 0xcb, 0x18, 0xe1, 0xdf, 0x2a, 0xdf, 0xd8, 0x20, 0xdf, 0xd8, 0x20, +0xd4, 0xcd, 0x1b, 0xd7, 0xd5, 0x1c, 0xde, 0xd7, 0x1d, 0xe1, 0xda, 0x26, +0xe1, 0xdb, 0x28, 0x4e, 0x51, 0x6e, 0x24, 0x2a, 0x8b, 0x24, 0x29, 0x88, +0x23, 0x29, 0x86, 0x22, 0x28, 0x84, 0x22, 0x28, 0x82, 0x22, 0x27, 0x80, +0x21, 0x27, 0x7e, 0x21, 0x26, 0x7c, 0x20, 0x26, 0x7a, 0x20, 0x26, 0x79, +0xa4, 0xa1, 0x2c, 0xd2, 0xcc, 0x1b, 0xdf, 0xd8, 0x20, 0xce, 0xcc, 0x19, +0xd4, 0xcd, 0x1b, 0x76, 0x75, 0x40, 0x1d, 0x22, 0x6e, 0x1d, 0x22, 0x6c, +0x1d, 0x21, 0x6b, 0x5f, 0x60, 0x49, 0xc7, 0xc5, 0x18, 0xd5, 0xcf, 0x1c, +0xd9, 0xd2, 0x1c, 0xe1, 0xdb, 0x2a, 0xce, 0xc9, 0x11, 0x1a, 0x1f, 0x63, +0x1a, 0x1e, 0x62, 0xa2, 0x9e, 0x25, 0xb8, 0xb3, 0x1a, 0xe3, 0xe1, 0x32, +0xe2, 0xdc, 0x2b, 0xe3, 0xdd, 0x30, 0xd2, 0xcc, 0x1b, 0xdb, 0xd4, 0x1c, +0xe1, 0xdf, 0x2a, 0xe1, 0xda, 0x26, 0xa1, 0x9d, 0x22, 0x17, 0x1b, 0x57, +0x17, 0x1b, 0x56, 0x16, 0x1a, 0x55, 0x16, 0x1a, 0x54, 0x16, 0x1a, 0x53, +0x15, 0x19, 0x52, 0x15, 0x19, 0x52, 0x15, 0x19, 0x51, 0xcf, 0xc9, 0x1a, +0xe3, 0xdd, 0x2e, 0xd7, 0xd0, 0x1c, 0xd7, 0xd5, 0x1c, 0xd4, 0xcd, 0x1b, +0xce, 0xc8, 0x0e, 0x14, 0x17, 0x4c, 0x14, 0x17, 0x4b, 0x13, 0x17, 0x4b, +0x13, 0x16, 0x4a, 0x13, 0x16, 0x49, 0x12, 0x15, 0x48, 0x12, 0x15, 0x48, +0xdb, 0xd4, 0x1c, 0xe6, 0xdf, 0x37, 0xe1, 0xdf, 0x2a, 0xe0, 0xde, 0x25, +0xe5, 0xdf, 0x36, 0xe2, 0xdc, 0x2d, 0x11, 0x14, 0x44, 0x11, 0x14, 0x44, +0x10, 0x13, 0x42, 0x10, 0x13, 0x42, 0x10, 0x13, 0x41, 0x10, 0x13, 0x41, +0x0f, 0x13, 0x40, 0x0f, 0x13, 0x40, 0x0f, 0x12, 0x3f, 0x0f, 0x12, 0x3f, +0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3e, 0x0e, 0x10, 0x37, 0x01, 0x01, 0x05, +0x13, 0x16, 0x49, 0x28, 0x2e, 0x94, 0x2a, 0x31, 0x9c, 0x24, 0x2a, 0x83, +0x20, 0x27, 0x7b, 0x20, 0x27, 0x7c, 0x21, 0x28, 0x7e, 0x22, 0x29, 0x80, +0x23, 0x2a, 0x82, 0x24, 0x2b, 0x84, 0x25, 0x2c, 0x86, 0x26, 0x2c, 0x88, +0x27, 0x2e, 0x8a, 0x28, 0x2e, 0x8c, 0x29, 0x30, 0x8f, 0x2a, 0x32, 0x91, +0x2b, 0x33, 0x94, 0xd9, 0xd2, 0x1c, 0xe1, 0xda, 0x26, 0xe2, 0xe0, 0x2d, +0xe0, 0xde, 0x25, 0xd7, 0xd5, 0x1c, 0xe2, 0xdc, 0x2b, 0xde, 0xd8, 0x1f, +0x39, 0x42, 0xaa, 0x3c, 0x45, 0xad, 0x3e, 0x48, 0xb1, 0x41, 0x4a, 0xb4, +0x44, 0x4e, 0xb8, 0x47, 0x51, 0xbc, 0x47, 0x51, 0xbf, 0x47, 0x53, 0xc4, +0x49, 0x54, 0xc8, 0x49, 0x54, 0xcc, 0x49, 0x55, 0xd1, 0x4a, 0x56, 0xd6, +0x4a, 0x56, 0xda, 0x4a, 0x56, 0xdf, 0x49, 0x56, 0xe2, 0x4b, 0x59, 0xe1, +0x4d, 0x5b, 0xe1, 0x4e, 0x5c, 0xe0, 0x4f, 0x5d, 0xdf, 0x4f, 0x5e, 0xde, +0x50, 0x60, 0xdd, 0x51, 0x61, 0xdb, 0x58, 0x69, 0xda, 0x40, 0x4e, 0x96, +0x1b, 0x22, 0x50, 0x1d, 0x25, 0x55, 0x20, 0x27, 0x5a, 0x4d, 0x52, 0x4d, +0xde, 0xd8, 0x1f, 0xe5, 0xdf, 0x36, 0xe1, 0xda, 0x26, 0xd9, 0xd2, 0x1c, +0xe3, 0xe1, 0x32, 0xe3, 0xdd, 0x30, 0xb4, 0xb4, 0x43, 0x5a, 0x69, 0xd0, +0x62, 0x73, 0xe7, 0x69, 0x7d, 0xfd, 0x72, 0x89, 0xfd, 0x8d, 0xa8, 0xfd, +0xd3, 0xf3, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, +0xee, 0xfd, 0xfd, 0xa6, 0xcb, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, +0xd5, 0xec, 0xfd, 0xb3, 0xc7, 0xfd, 0x8e, 0x9f, 0xfd, 0x74, 0x83, 0xea, +0xde, 0xd8, 0x1f, 0xe2, 0xe0, 0x2d, 0xe0, 0xde, 0x25, 0xde, 0xd7, 0x1d, +0xe2, 0xe0, 0x2b, 0xe2, 0xe0, 0x2d, 0xe0, 0xde, 0x25, 0x21, 0x29, 0x5f, +0x1e, 0x26, 0x59, 0x1c, 0x23, 0x53, 0x1a, 0x21, 0x4f, 0x39, 0x45, 0x86, +0x5f, 0x6d, 0xa8, 0xe0, 0xd9, 0x23, 0xcf, 0xc9, 0x1a, 0xdb, 0xd4, 0x1c, +0xdb, 0xd4, 0x1c, 0xd7, 0xd5, 0x1c, 0xdf, 0xd9, 0x22, 0x3e, 0x4b, 0xe1, +0x3b, 0x47, 0xe2, 0x39, 0x45, 0xdf, 0x39, 0x44, 0xda, 0x37, 0x43, 0xd6, +0x37, 0x41, 0xd1, 0x36, 0x40, 0xcc, 0x70, 0x74, 0x87, 0xe5, 0xdf, 0x36, +0xe1, 0xdf, 0x2a, 0xdf, 0xd9, 0x22, 0xdf, 0xd8, 0x20, 0xde, 0xd7, 0x1d, +0xa9, 0xa7, 0x3f, 0x2e, 0x37, 0xae, 0x2e, 0x36, 0xaa, 0x2d, 0x36, 0xa7, +0x2d, 0x35, 0xa4, 0x2c, 0x34, 0xa2, 0x54, 0x59, 0x7c, 0xd0, 0xcb, 0x17, +0xdf, 0xd8, 0x20, 0xd9, 0xd2, 0x1c, 0xe1, 0xda, 0x26, 0xe2, 0xe0, 0x2d, +0xe0, 0xde, 0x25, 0x27, 0x2e, 0x8c, 0x27, 0x2e, 0x8b, 0x26, 0x2d, 0x88, +0x26, 0x2d, 0x86, 0x25, 0x2c, 0x84, 0x25, 0x2c, 0x83, 0x24, 0x2b, 0x80, +0x23, 0x2a, 0x7e, 0x23, 0x29, 0x7c, 0x23, 0x29, 0x7b, 0xa4, 0xa2, 0x2d, +0xde, 0xdc, 0x1f, 0xe0, 0xde, 0x25, 0xdb, 0xd4, 0x1c, 0xd7, 0xd5, 0x1c, +0x61, 0x63, 0x4d, 0x1f, 0x25, 0x70, 0x1f, 0x25, 0x6e, 0x1e, 0x24, 0x6d, +0x1e, 0x23, 0x6b, 0x1e, 0x23, 0x6a, 0xb9, 0xb4, 0x1c, 0xde, 0xdc, 0x1f, +0xd7, 0xd5, 0x1c, 0xe1, 0xda, 0x26, 0xdb, 0xd4, 0x1c, 0x5e, 0x5f, 0x44, +0x1b, 0x20, 0x62, 0x1b, 0x20, 0x61, 0x1b, 0x1f, 0x60, 0x1b, 0x1f, 0x5f, +0x1a, 0x1e, 0x5e, 0xb8, 0xb3, 0x1a, 0xe1, 0xda, 0x26, 0xd9, 0xd2, 0x1c, +0xe3, 0xe1, 0x32, 0xe3, 0xdd, 0x30, 0xa1, 0x9e, 0x22, 0x18, 0x1c, 0x57, +0x17, 0x1c, 0x56, 0x17, 0x1b, 0x55, 0x17, 0x1b, 0x54, 0x16, 0x1b, 0x53, +0x16, 0x1b, 0x53, 0x16, 0x1a, 0x52, 0x72, 0x71, 0x30, 0xd1, 0xcf, 0x1a, +0xd4, 0xcd, 0x1b, 0xd7, 0xd5, 0x1c, 0xcb, 0xc4, 0x18, 0xd1, 0xcf, 0x1a, +0xce, 0xcc, 0x19, 0x14, 0x18, 0x4c, 0x14, 0x18, 0x4b, 0x14, 0x18, 0x4b, +0x14, 0x17, 0x4a, 0x13, 0x16, 0x49, 0x13, 0x16, 0x49, 0x13, 0x16, 0x48, +0x9f, 0x9c, 0x1c, 0xe2, 0xe0, 0x2d, 0xe0, 0xde, 0x25, 0xde, 0xd7, 0x1d, +0xe2, 0xe0, 0x2d, 0xe7, 0xe1, 0x3c, 0x11, 0x14, 0x44, 0x11, 0x14, 0x44, +0x10, 0x14, 0x42, 0x10, 0x14, 0x42, 0x10, 0x13, 0x41, 0x10, 0x13, 0x41, +0x10, 0x13, 0x40, 0x10, 0x13, 0x40, 0x10, 0x13, 0x3f, 0x10, 0x13, 0x3f, +0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3e, 0x0f, 0x10, 0x37, 0x01, 0x01, 0x05, +0x12, 0x15, 0x49, 0x25, 0x2c, 0x94, 0x27, 0x2d, 0x9c, 0x22, 0x27, 0x83, +0x1e, 0x23, 0x7b, 0x1f, 0x24, 0x7d, 0x1f, 0x24, 0x7f, 0x20, 0x26, 0x81, +0x20, 0x26, 0x82, 0x21, 0x27, 0x84, 0x22, 0x27, 0x86, 0x23, 0x29, 0x89, +0x23, 0x2a, 0x8a, 0x23, 0x2a, 0x8d, 0x24, 0x2b, 0x8f, 0x25, 0x2d, 0x91, +0x66, 0x69, 0x65, 0xc9, 0xc3, 0x18, 0xe1, 0xdb, 0x28, 0xe1, 0xda, 0x26, +0xdf, 0xd8, 0x20, 0xcb, 0xc4, 0x18, 0xd1, 0xcf, 0x1a, 0xa8, 0xa7, 0x3c, +0x30, 0x38, 0xaa, 0x31, 0x3a, 0xad, 0x33, 0x3c, 0xb1, 0x34, 0x3e, 0xb4, +0x37, 0x40, 0xb8, 0x38, 0x42, 0xbc, 0x3b, 0x44, 0xc0, 0x3d, 0x47, 0xc4, +0x3f, 0x4a, 0xc8, 0x43, 0x4d, 0xcd, 0x46, 0x51, 0xd1, 0x49, 0x55, 0xd6, +0x4d, 0x5a, 0xdb, 0x51, 0x5e, 0xe0, 0x58, 0x67, 0xe2, 0x56, 0x63, 0xcd, +0x44, 0x50, 0x9a, 0x27, 0x2f, 0x5e, 0x16, 0x1b, 0x41, 0x13, 0x19, 0x3e, +0x15, 0x1b, 0x41, 0x16, 0x1c, 0x44, 0x18, 0x1e, 0x48, 0x1a, 0x20, 0x4c, +0x1c, 0x23, 0x51, 0x1e, 0x25, 0x55, 0x20, 0x28, 0x5b, 0x8e, 0x8e, 0x2f, +0xd7, 0xd0, 0x1c, 0xe4, 0xe2, 0x35, 0xe5, 0xdf, 0x36, 0xe0, 0xda, 0x25, +0xe1, 0xda, 0x26, 0xe2, 0xe0, 0x2d, 0x85, 0x8d, 0x84, 0x60, 0x70, 0xdb, +0x6e, 0x80, 0xf9, 0x7e, 0x94, 0xfd, 0x8e, 0xa7, 0xfd, 0xa0, 0xbe, 0xfd, +0xb3, 0xd8, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, +0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, +0xc0, 0xd9, 0xfd, 0x91, 0xa7, 0xfd, 0x74, 0x86, 0xfd, 0x5f, 0x6f, 0xda, +0xe1, 0xda, 0x26, 0xd9, 0xd2, 0x1c, 0xe2, 0xe0, 0x2d, 0xe1, 0xdf, 0x2a, +0xe3, 0xdd, 0x2e, 0xe0, 0xde, 0x25, 0xde, 0xd8, 0x1f, 0x23, 0x2c, 0x62, +0x20, 0x28, 0x5b, 0x1e, 0x25, 0x55, 0x2c, 0x36, 0x6d, 0x3f, 0x4b, 0x91, +0x4d, 0x5c, 0xb4, 0xc5, 0xc4, 0x34, 0xe0, 0xd9, 0x23, 0xde, 0xdc, 0x1f, +0xc7, 0xc5, 0x18, 0xd7, 0xd5, 0x1c, 0xd9, 0xd2, 0x1c, 0x54, 0x5f, 0xc9, +0x40, 0x4d, 0xe3, 0x3f, 0x4b, 0xe0, 0x3f, 0x4b, 0xdb, 0x3f, 0x4a, 0xd6, +0x3e, 0x49, 0xd1, 0x3d, 0x49, 0xcd, 0x4f, 0x57, 0xb3, 0xe2, 0xdc, 0x2b, +0xe0, 0xde, 0x25, 0xde, 0xd8, 0x1f, 0xde, 0xd7, 0x1d, 0xdf, 0xd8, 0x20, +0x71, 0x75, 0x79, 0x36, 0x40, 0xae, 0x35, 0x3e, 0xaa, 0x35, 0x3d, 0xa7, +0x35, 0x3c, 0xa5, 0x33, 0x3b, 0xa2, 0x32, 0x3a, 0x9e, 0xe2, 0xe0, 0x2d, +0xdb, 0xd4, 0x1c, 0xc9, 0xc3, 0x18, 0xe1, 0xdb, 0x28, 0xe1, 0xda, 0x26, +0xbc, 0xb8, 0x25, 0x2c, 0x33, 0x8d, 0x2b, 0x33, 0x8b, 0x2b, 0x32, 0x89, +0x29, 0x30, 0x86, 0x29, 0x2f, 0x84, 0x29, 0x2f, 0x83, 0x28, 0x2e, 0x81, +0x27, 0x2d, 0x7f, 0x27, 0x2c, 0x7d, 0xa6, 0xa3, 0x2d, 0xe3, 0xdd, 0x30, +0xd5, 0xcf, 0x1c, 0xd5, 0xcf, 0x1c, 0xdf, 0xd8, 0x20, 0x8e, 0x8d, 0x37, +0x22, 0x28, 0x71, 0x22, 0x28, 0x70, 0x21, 0x27, 0x6e, 0x20, 0x26, 0x6d, +0x20, 0x26, 0x6b, 0x1f, 0x25, 0x6a, 0xa3, 0xa1, 0x27, 0xdf, 0xd8, 0x20, +0xdf, 0xd8, 0x20, 0xd7, 0xd5, 0x1c, 0xd9, 0xd2, 0x1c, 0x5f, 0x61, 0x44, +0x1c, 0x22, 0x62, 0x1c, 0x21, 0x61, 0x1b, 0x21, 0x60, 0x1b, 0x21, 0x5f, +0x1a, 0x20, 0x5e, 0xa2, 0x9f, 0x23, 0xe5, 0xdf, 0x36, 0xe0, 0xda, 0x25, +0xe1, 0xda, 0x26, 0xe2, 0xe0, 0x2d, 0xa1, 0x9e, 0x22, 0x18, 0x1d, 0x57, +0x18, 0x1d, 0x56, 0x18, 0x1c, 0x55, 0x18, 0x1c, 0x54, 0x17, 0x1b, 0x53, +0x17, 0x1b, 0x53, 0x16, 0x1b, 0x52, 0xce, 0xc8, 0x0f, 0xde, 0xdc, 0x1f, +0xce, 0xcc, 0x19, 0xd4, 0xcd, 0x1b, 0xc0, 0xba, 0x15, 0xd9, 0xd2, 0x1c, +0xdf, 0xd8, 0x20, 0x14, 0x18, 0x4c, 0x14, 0x18, 0x4b, 0x14, 0x18, 0x4b, +0x14, 0x18, 0x4a, 0x13, 0x17, 0x49, 0x13, 0x16, 0x49, 0x13, 0x16, 0x48, +0x9f, 0x9c, 0x1c, 0xe0, 0xde, 0x25, 0xde, 0xd8, 0x1f, 0xe0, 0xde, 0x25, +0xe1, 0xda, 0x26, 0x9f, 0x9b, 0x1b, 0x11, 0x15, 0x44, 0x11, 0x15, 0x44, +0x11, 0x14, 0x42, 0x11, 0x14, 0x42, 0x11, 0x14, 0x41, 0x11, 0x14, 0x41, +0x10, 0x14, 0x40, 0x10, 0x14, 0x40, 0x10, 0x13, 0x3f, 0x10, 0x13, 0x3f, +0x10, 0x13, 0x3e, 0x10, 0x13, 0x3e, 0x0f, 0x10, 0x37, 0x01, 0x01, 0x05, +0x11, 0x14, 0x49, 0x23, 0x2b, 0x94, 0x24, 0x2c, 0x9c, 0x20, 0x25, 0x83, +0x1c, 0x22, 0x7b, 0x1d, 0x23, 0x7d, 0x1d, 0x24, 0x7f, 0x1d, 0x24, 0x81, +0x1e, 0x24, 0x82, 0x1e, 0x25, 0x84, 0x1f, 0x26, 0x86, 0x1f, 0x27, 0x89, +0x20, 0x27, 0x8a, 0x20, 0x27, 0x8d, 0x21, 0x28, 0x8f, 0x22, 0x29, 0x91, +0x8e, 0x8e, 0x46, 0xdf, 0xd8, 0x20, 0xde, 0xd7, 0x1d, 0xe1, 0xda, 0x26, +0xdd, 0xd6, 0x1c, 0xce, 0xcc, 0x19, 0xd5, 0xcf, 0x1c, 0x7c, 0x7c, 0x60, +0x28, 0x31, 0xaa, 0x2a, 0x32, 0xae, 0x2b, 0x33, 0xb1, 0x2c, 0x34, 0xb5, +0x2d, 0x35, 0xb8, 0x2e, 0x37, 0xbd, 0x2e, 0x38, 0xc0, 0x30, 0x3a, 0xc4, +0x31, 0x3c, 0xc9, 0x33, 0x3d, 0xcd, 0x34, 0x3e, 0xd2, 0x36, 0x40, 0xd6, +0x37, 0x42, 0xdb, 0x39, 0x44, 0xe0, 0x3c, 0x48, 0xe2, 0x40, 0x4d, 0xe1, +0x44, 0x52, 0xe1, 0x49, 0x58, 0xdf, 0x4f, 0x5e, 0xdf, 0x56, 0x66, 0xde, +0x55, 0x65, 0xce, 0x42, 0x4e, 0x97, 0x2a, 0x33, 0x67, 0x1a, 0x20, 0x4c, +0x1c, 0x23, 0x51, 0x1e, 0x25, 0x56, 0x21, 0x29, 0x5c, 0xba, 0xb7, 0x1b, +0xdc, 0xda, 0x1d, 0xdd, 0xd6, 0x1c, 0xe7, 0xe1, 0x3c, 0xe2, 0xe0, 0x2d, +0xe1, 0xdb, 0x28, 0xe0, 0xda, 0x25, 0x67, 0x74, 0xb2, 0x63, 0x74, 0xe1, +0x71, 0x84, 0xfd, 0x85, 0x9b, 0xfd, 0x9e, 0xb8, 0xfd, 0xc4, 0xe4, 0xfd, +0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, +0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xc1, 0xe1, 0xfd, +0x8e, 0xa8, 0xfd, 0x7c, 0x92, 0xfd, 0x6d, 0x80, 0xfd, 0x62, 0x73, 0xe0, +0xde, 0xd8, 0x1f, 0xd7, 0xd0, 0x1c, 0xe4, 0xe2, 0x35, 0xe6, 0xdf, 0x37, +0xdf, 0xd8, 0x20, 0xe0, 0xde, 0x25, 0xdf, 0xd9, 0x22, 0x26, 0x2e, 0x65, +0x23, 0x2b, 0x5e, 0x20, 0x27, 0x58, 0x1e, 0x25, 0x53, 0x1b, 0x22, 0x4e, +0x19, 0x20, 0x4a, 0xa1, 0x9e, 0x1c, 0xe0, 0xde, 0x25, 0xe2, 0xe0, 0x2b, +0xd1, 0xcf, 0x1a, 0xd7, 0xd5, 0x1c, 0xd9, 0xd2, 0x1c, 0x87, 0x8e, 0x8e, +0x5c, 0x6a, 0xe3, 0x58, 0x66, 0xe1, 0x56, 0x64, 0xdc, 0x54, 0x61, 0xd7, +0x52, 0x5e, 0xd3, 0x50, 0x5c, 0xce, 0x4e, 0x5a, 0xca, 0xce, 0xc7, 0x19, +0xdf, 0xd8, 0x20, 0xde, 0xd8, 0x1f, 0xdf, 0xd8, 0x20, 0xde, 0xdb, 0x1d, +0x43, 0x4c, 0xb2, 0x41, 0x4b, 0xaf, 0x40, 0x49, 0xab, 0x3e, 0x47, 0xa7, +0x3c, 0x45, 0xa5, 0x3b, 0x44, 0xa2, 0x5f, 0x64, 0x7c, 0xd4, 0xcd, 0x1b, +0xd7, 0xd5, 0x1c, 0xdf, 0xd8, 0x20, 0xde, 0xd7, 0x1d, 0xe1, 0xda, 0x26, +0xaa, 0xa8, 0x34, 0x31, 0x39, 0x8d, 0x30, 0x38, 0x8b, 0x30, 0x37, 0x89, +0x2e, 0x35, 0x86, 0x2d, 0x34, 0x84, 0x2d, 0x33, 0x83, 0x2b, 0x32, 0x81, +0x2b, 0x32, 0x7f, 0x7d, 0x7e, 0x48, 0xd7, 0xd0, 0x1c, 0xde, 0xd8, 0x1f, +0xd4, 0xcd, 0x1b, 0xcc, 0xc6, 0x19, 0xd0, 0xca, 0x13, 0x26, 0x2b, 0x73, +0x25, 0x2a, 0x71, 0x25, 0x2a, 0x70, 0x23, 0x29, 0x6e, 0x23, 0x28, 0x6d, +0x22, 0x27, 0x6b, 0x22, 0x27, 0x6b, 0xcf, 0xc9, 0x12, 0xe0, 0xde, 0x25, +0xe0, 0xda, 0x25, 0xdd, 0xd6, 0x1c, 0xde, 0xdc, 0x1f, 0x60, 0x61, 0x44, +0x1e, 0x23, 0x62, 0x1e, 0x22, 0x61, 0x1d, 0x22, 0x60, 0x1d, 0x21, 0x5f, +0x1c, 0x20, 0x5e, 0xa2, 0x9f, 0x23, 0xe7, 0xe1, 0x3c, 0xe2, 0xe0, 0x2d, +0xe1, 0xdb, 0x28, 0xe0, 0xda, 0x25, 0xa2, 0x9f, 0x22, 0x19, 0x1e, 0x57, +0x19, 0x1e, 0x56, 0x18, 0x1d, 0x55, 0x18, 0x1d, 0x54, 0x18, 0x1c, 0x53, +0x18, 0x1c, 0x53, 0x72, 0x71, 0x30, 0xc4, 0xbe, 0x17, 0xe1, 0xdb, 0x28, +0xce, 0xcc, 0x19, 0xce, 0xcc, 0x19, 0xdf, 0xd9, 0x22, 0xdd, 0xd6, 0x1c, +0xd7, 0xd5, 0x1c, 0x14, 0x18, 0x4c, 0x14, 0x18, 0x4b, 0x14, 0x18, 0x4b, +0x14, 0x18, 0x4a, 0x13, 0x17, 0x49, 0x13, 0x17, 0x49, 0x13, 0x17, 0x48, +0x59, 0x59, 0x31, 0xe0, 0xde, 0x25, 0xdf, 0xd9, 0x22, 0xd9, 0xd2, 0x1c, +0xde, 0xdc, 0x1f, 0x6f, 0x6e, 0x28, 0x11, 0x15, 0x44, 0x11, 0x15, 0x44, +0x11, 0x14, 0x42, 0x11, 0x14, 0x42, 0x11, 0x14, 0x41, 0x11, 0x14, 0x41, +0x10, 0x14, 0x40, 0x10, 0x14, 0x40, 0x10, 0x13, 0x3f, 0x10, 0x13, 0x3f, +0x10, 0x13, 0x3e, 0x10, 0x13, 0x3e, 0x0f, 0x10, 0x37, 0x01, 0x01, 0x05, +0x11, 0x15, 0x49, 0x23, 0x2b, 0x94, 0x25, 0x2d, 0x9c, 0x20, 0x26, 0x83, +0x1d, 0x23, 0x7b, 0x1d, 0x23, 0x7d, 0x1d, 0x24, 0x7f, 0x1e, 0x25, 0x81, +0x1f, 0x25, 0x82, 0x1f, 0x25, 0x84, 0x20, 0x26, 0x86, 0x20, 0x27, 0x89, +0x21, 0x28, 0x8a, 0x22, 0x28, 0x8d, 0x22, 0x29, 0x8f, 0x23, 0x2a, 0x91, +0xa5, 0xa2, 0x36, 0xe3, 0xdd, 0x30, 0xe2, 0xdc, 0x2b, 0xce, 0xc7, 0x19, +0xdb, 0xd4, 0x1c, 0xde, 0xdc, 0x1f, 0xc1, 0xbb, 0x16, 0x67, 0x69, 0x71, +0x28, 0x31, 0xaa, 0x2a, 0x32, 0xae, 0x2a, 0x32, 0xb1, 0x2b, 0x34, 0xb5, +0x2c, 0x35, 0xb9, 0x2d, 0x36, 0xbd, 0x2e, 0x37, 0xc0, 0x2f, 0x38, 0xc5, +0x30, 0x39, 0xc9, 0x30, 0x3a, 0xcd, 0x31, 0x3b, 0xd2, 0x31, 0x3d, 0xd6, +0x32, 0x3e, 0xdb, 0x33, 0x3f, 0xe0, 0x36, 0x42, 0xe2, 0x39, 0x45, 0xe1, +0x3c, 0x48, 0xe1, 0x3f, 0x4d, 0xe0, 0x42, 0x51, 0xdf, 0x48, 0x56, 0xde, +0x4c, 0x5b, 0xdd, 0x51, 0x61, 0xdb, 0x56, 0x68, 0xda, 0x52, 0x62, 0xc3, +0x44, 0x53, 0xa0, 0x2f, 0x3a, 0x74, 0x21, 0x29, 0x5c, 0xd7, 0xd0, 0x1c, +0xe1, 0xda, 0x26, 0xe0, 0xd9, 0x23, 0xde, 0xdb, 0x1d, 0xdc, 0xda, 0x1d, +0xe2, 0xdc, 0x2d, 0xe1, 0xda, 0x26, 0x58, 0x67, 0xc9, 0x64, 0x75, 0xe3, +0x73, 0x86, 0xfd, 0x86, 0x9d, 0xfd, 0xa2, 0xbd, 0xfd, 0xcb, 0xed, 0xfd, +0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, +0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xec, 0xfd, 0xfd, +0xbc, 0xd7, 0xfd, 0x9c, 0xb3, 0xfd, 0x86, 0x99, 0xfd, 0x80, 0x8e, 0xd9, +0xce, 0xc7, 0x19, 0xe3, 0xdd, 0x2e, 0xe5, 0xdf, 0x34, 0xe2, 0xdc, 0x2b, +0xdc, 0xda, 0x1d, 0xdc, 0xda, 0x1d, 0xbc, 0xb9, 0x1e, 0x29, 0x31, 0x68, +0x25, 0x2d, 0x60, 0x22, 0x29, 0x5a, 0x1f, 0x26, 0x54, 0x1c, 0x23, 0x4f, +0x1b, 0x21, 0x4b, 0x5d, 0x5f, 0x31, 0xde, 0xd8, 0x1f, 0xe0, 0xde, 0x25, +0xdf, 0xd9, 0x22, 0xd7, 0xd5, 0x1c, 0xe2, 0xe0, 0x2d, 0x78, 0x7c, 0x62, +0x4d, 0x58, 0xad, 0x54, 0x61, 0xc5, 0x55, 0x61, 0xc8, 0x55, 0x62, 0xca, +0x55, 0x61, 0xcc, 0x54, 0x61, 0xce, 0x52, 0x5e, 0xca, 0xc4, 0xc1, 0x31, +0xe0, 0xde, 0x25, 0xe1, 0xda, 0x26, 0xe3, 0xe1, 0x32, 0x9e, 0x9e, 0x55, +0x43, 0x4d, 0xb2, 0x42, 0x4b, 0xaf, 0x3f, 0x49, 0xab, 0x3e, 0x47, 0xa7, +0x3b, 0x45, 0xa5, 0x3b, 0x43, 0xa2, 0x72, 0x75, 0x6c, 0xc7, 0xc5, 0x18, +0xdb, 0xd4, 0x1c, 0xe3, 0xdd, 0x30, 0xe2, 0xdc, 0x2b, 0xce, 0xc7, 0x19, +0x6d, 0x6f, 0x61, 0x30, 0x37, 0x8d, 0x2f, 0x35, 0x8b, 0x2e, 0x35, 0x89, +0x2c, 0x34, 0x86, 0x2b, 0x33, 0x85, 0x2b, 0x32, 0x83, 0x29, 0x31, 0x81, +0x3d, 0x43, 0x71, 0xe0, 0xda, 0x25, 0xe1, 0xda, 0x26, 0xd4, 0xcd, 0x1b, +0xd1, 0xcf, 0x1a, 0xd4, 0xcd, 0x1b, 0x79, 0x7a, 0x43, 0x24, 0x29, 0x73, +0x23, 0x29, 0x71, 0x23, 0x28, 0x70, 0x22, 0x28, 0x6e, 0x21, 0x27, 0x6d, +0x20, 0x26, 0x6c, 0x77, 0x77, 0x3e, 0xdf, 0xd8, 0x20, 0xe1, 0xdb, 0x28, +0xdf, 0xd8, 0x20, 0xcc, 0xc6, 0x19, 0xde, 0xdb, 0x1d, 0x1d, 0x22, 0x63, +0x1c, 0x22, 0x62, 0x1c, 0x21, 0x61, 0x1c, 0x21, 0x60, 0x1c, 0x21, 0x5f, +0x1b, 0x20, 0x5e, 0xa2, 0x9f, 0x23, 0xde, 0xdb, 0x1d, 0xdc, 0xda, 0x1d, +0xe2, 0xdc, 0x2d, 0xe1, 0xda, 0x26, 0xa1, 0x9e, 0x22, 0x18, 0x1d, 0x57, +0x18, 0x1c, 0x56, 0x18, 0x1c, 0x55, 0x17, 0x1b, 0x54, 0x17, 0x1b, 0x53, +0x17, 0x1b, 0x53, 0xce, 0xc8, 0x0f, 0xdb, 0xd4, 0x1c, 0xce, 0xc7, 0x19, +0xd1, 0xca, 0x1a, 0xdf, 0xd9, 0x22, 0xde, 0xdc, 0x1f, 0xdd, 0xd6, 0x1c, +0xe2, 0xe0, 0x2b, 0x14, 0x18, 0x4c, 0x14, 0x18, 0x4b, 0x14, 0x18, 0x4b, +0x14, 0x18, 0x4a, 0x13, 0x16, 0x49, 0x13, 0x16, 0x49, 0x13, 0x16, 0x48, +0x59, 0x59, 0x32, 0xdc, 0xda, 0x1d, 0xd7, 0xd0, 0x1c, 0xdc, 0xda, 0x1d, +0xe1, 0xda, 0x26, 0x12, 0x15, 0x45, 0x12, 0x14, 0x44, 0x11, 0x14, 0x44, +0x10, 0x14, 0x42, 0x10, 0x14, 0x42, 0x10, 0x13, 0x41, 0x10, 0x13, 0x41, +0x10, 0x13, 0x40, 0x10, 0x13, 0x40, 0x10, 0x13, 0x3f, 0x10, 0x13, 0x3f, +0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3e, 0x0f, 0x10, 0x37, 0x01, 0x01, 0x05, +0x12, 0x15, 0x49, 0x24, 0x2c, 0x94, 0x25, 0x2d, 0x9c, 0x21, 0x26, 0x83, +0x1e, 0x23, 0x7b, 0x1e, 0x24, 0x7d, 0x1e, 0x24, 0x7f, 0x1f, 0x25, 0x81, +0x20, 0x25, 0x82, 0x20, 0x26, 0x84, 0x21, 0x27, 0x86, 0x21, 0x27, 0x89, +0x21, 0x28, 0x8a, 0x22, 0x28, 0x8d, 0x23, 0x29, 0x8f, 0x23, 0x2a, 0x91, +0xd0, 0xca, 0x17, 0xd7, 0xd0, 0x1c, 0xde, 0xd7, 0x1d, 0xdc, 0xda, 0x1d, +0xd7, 0xd5, 0x1c, 0xdf, 0xd8, 0x20, 0xd2, 0xcc, 0x1b, 0x3d, 0x44, 0x95, +0x2a, 0x33, 0xaa, 0x2c, 0x34, 0xae, 0x2c, 0x35, 0xb1, 0x2d, 0x36, 0xb5, +0x2e, 0x37, 0xb8, 0x2f, 0x38, 0xbd, 0x30, 0x3a, 0xc0, 0x31, 0x3b, 0xc5, +0x33, 0x3c, 0xc9, 0xaa, 0xa9, 0x49, 0xd1, 0xca, 0x1a, 0xc3, 0xbd, 0x16, +0xd7, 0xd5, 0x1c, 0xde, 0xd7, 0x1d, 0xd7, 0xd5, 0x1c, 0xdc, 0xda, 0x1d, +0xe1, 0xda, 0x26, 0xd7, 0xd5, 0x1c, 0xd1, 0xcf, 0x1a, 0xe1, 0xdb, 0x2a, +0xdd, 0xd6, 0x1c, 0xce, 0xcc, 0x19, 0xcb, 0xc4, 0x18, 0xa9, 0xa8, 0x2b, +0x1c, 0x23, 0x51, 0x1e, 0x26, 0x57, 0x36, 0x3c, 0x52, 0xe1, 0xdf, 0x2a, +0xc3, 0xbd, 0x16, 0xdf, 0xd9, 0x22, 0xe1, 0xda, 0x26, 0xe0, 0xde, 0x25, +0xce, 0xcc, 0x19, 0xc3, 0xc0, 0x2c, 0x58, 0x67, 0xc8, 0x64, 0x75, 0xe2, +0x72, 0x85, 0xfd, 0x86, 0x9c, 0xfd, 0xa0, 0xba, 0xfd, 0xbd, 0xdd, 0xfd, +0xe2, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, +0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xf0, 0xfd, 0xfd, +0xc3, 0xdd, 0xfd, 0xa4, 0xba, 0xfd, 0x8d, 0xa0, 0xfd, 0x9f, 0xa8, 0xa9, +0xe1, 0xdb, 0x28, 0xe6, 0xdf, 0x37, 0xdf, 0xd8, 0x20, 0xd7, 0xd0, 0x1c, +0xe1, 0xdf, 0x2a, 0xdf, 0xd9, 0x22, 0xa9, 0xa7, 0x2b, 0x2b, 0x34, 0x6b, +0x27, 0x2f, 0x62, 0x24, 0x2b, 0x5c, 0x20, 0x27, 0x56, 0x2c, 0x35, 0x68, +0x48, 0x56, 0xa2, 0x82, 0x8a, 0x7f, 0xd2, 0xcc, 0x1b, 0xd7, 0xd5, 0x1c, +0xe0, 0xde, 0x25, 0xe0, 0xde, 0x25, 0xe0, 0xda, 0x25, 0x7e, 0x85, 0x99, +0x49, 0x56, 0xe4, 0x46, 0x52, 0xe2, 0x44, 0x50, 0xdc, 0x43, 0x4f, 0xd8, +0x42, 0x4e, 0xd3, 0x41, 0x4c, 0xce, 0x40, 0x4a, 0xca, 0xae, 0xad, 0x46, +0xdb, 0xd4, 0x1c, 0xe3, 0xdd, 0x30, 0xe4, 0xe2, 0x33, 0x4b, 0x53, 0xa2, +0x38, 0x41, 0xb2, 0x37, 0x40, 0xaf, 0x35, 0x3e, 0xab, 0x34, 0x3e, 0xa8, +0x33, 0x3c, 0xa5, 0x33, 0x3a, 0xa2, 0xaa, 0xa7, 0x39, 0xe1, 0xdf, 0x2a, +0xde, 0xdb, 0x1d, 0xd7, 0xd0, 0x1c, 0xde, 0xd7, 0x1d, 0xdc, 0xda, 0x1d, +0x6a, 0x6c, 0x61, 0x2b, 0x31, 0x8d, 0x2b, 0x31, 0x8b, 0x29, 0x30, 0x89, +0x28, 0x2f, 0x86, 0x27, 0x2e, 0x85, 0x27, 0x2d, 0x83, 0x26, 0x2d, 0x81, +0xba, 0xb6, 0x21, 0xdf, 0xd8, 0x20, 0xdf, 0xd8, 0x20, 0xd1, 0xcf, 0x1a, +0xd1, 0xca, 0x1a, 0xdc, 0xda, 0x1d, 0x22, 0x28, 0x74, 0x21, 0x27, 0x73, +0x20, 0x27, 0x71, 0x20, 0x26, 0x70, 0x20, 0x25, 0x6e, 0x1f, 0x25, 0x6d, +0x61, 0x62, 0x4a, 0xd7, 0xd5, 0x1c, 0xd1, 0xcf, 0x1a, 0xe1, 0xdb, 0x2a, +0xdd, 0xd6, 0x1c, 0xce, 0xcc, 0x19, 0x8b, 0x8a, 0x30, 0x1c, 0x21, 0x63, +0x1b, 0x20, 0x62, 0x1b, 0x20, 0x61, 0x1b, 0x1f, 0x60, 0x1a, 0x1f, 0x5f, +0x1a, 0x1e, 0x5e, 0xa2, 0x9e, 0x23, 0xe1, 0xda, 0x26, 0xe0, 0xde, 0x25, +0xce, 0xcc, 0x19, 0xde, 0xd7, 0x1d, 0xd4, 0xcd, 0x1b, 0x18, 0x1c, 0x57, +0x17, 0x1b, 0x56, 0x17, 0x1b, 0x55, 0x17, 0x1b, 0x54, 0x16, 0x1b, 0x53, +0x72, 0x71, 0x31, 0xdf, 0xd8, 0x20, 0xd7, 0xd5, 0x1c, 0x71, 0x70, 0x2f, +0xd5, 0xcf, 0x1c, 0xe0, 0xda, 0x25, 0xde, 0xd7, 0x1d, 0xdf, 0xd8, 0x20, +0xdf, 0xd8, 0x20, 0x14, 0x18, 0x4c, 0x14, 0x17, 0x4b, 0x14, 0x17, 0x4b, +0x13, 0x17, 0x4a, 0x13, 0x16, 0x49, 0x13, 0x16, 0x49, 0x13, 0x16, 0x48, +0x12, 0x16, 0x47, 0xdf, 0xd9, 0x22, 0xdf, 0xd8, 0x20, 0xdf, 0xd9, 0x22, +0x87, 0x84, 0x22, 0x12, 0x14, 0x45, 0x11, 0x14, 0x44, 0x11, 0x14, 0x44, +0x10, 0x13, 0x42, 0x10, 0x13, 0x42, 0x10, 0x13, 0x41, 0x10, 0x13, 0x41, +0x0f, 0x13, 0x40, 0x0f, 0x13, 0x40, 0x0f, 0x12, 0x3f, 0x0f, 0x12, 0x3f, +0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3e, 0x0e, 0x10, 0x37, 0x01, 0x01, 0x05, +0x12, 0x15, 0x49, 0x25, 0x2c, 0x94, 0x27, 0x2d, 0x9c, 0x22, 0x27, 0x83, +0x1e, 0x23, 0x7b, 0x1f, 0x24, 0x7d, 0x1f, 0x24, 0x7f, 0x20, 0x25, 0x81, +0x20, 0x26, 0x82, 0x21, 0x26, 0x84, 0x21, 0x27, 0x86, 0x22, 0x28, 0x89, +0x22, 0x29, 0x8a, 0x23, 0x2a, 0x8d, 0x24, 0x2a, 0x8f, 0x25, 0x2c, 0x91, +0xd4, 0xcd, 0x1b, 0xe0, 0xde, 0x25, 0xdb, 0xd4, 0x1c, 0xd2, 0xcc, 0x1b, +0xde, 0xdb, 0x1d, 0xe1, 0xdb, 0x2a, 0xdf, 0xd8, 0x20, 0x2b, 0x33, 0xa7, +0x2c, 0x35, 0xaa, 0x2d, 0x36, 0xad, 0x2f, 0x38, 0xb1, 0x30, 0x39, 0xb4, +0x32, 0x3a, 0xb8, 0x33, 0x3d, 0xbc, 0x35, 0x3e, 0xc0, 0x36, 0x40, 0xc4, +0x37, 0x42, 0xc8, 0xac, 0xab, 0x49, 0xc7, 0xc5, 0x18, 0xcf, 0xc9, 0x1a, +0xd4, 0xcd, 0x1b, 0xce, 0xc7, 0x19, 0xd4, 0xcd, 0x1b, 0xde, 0xd7, 0x1d, +0xde, 0xd7, 0x1d, 0xd7, 0xd0, 0x1c, 0xd5, 0xcf, 0x1c, 0xdd, 0xd6, 0x1c, +0xd7, 0xd5, 0x1c, 0xe0, 0xde, 0x25, 0xdf, 0xd8, 0x20, 0xa2, 0x9f, 0x1e, +0x1c, 0x23, 0x51, 0x1e, 0x25, 0x55, 0x62, 0x65, 0x3f, 0xdc, 0xda, 0x1d, +0xcb, 0xc4, 0x18, 0xe0, 0xde, 0x25, 0xe1, 0xda, 0x26, 0xdf, 0xd8, 0x20, +0xe0, 0xd9, 0x23, 0xb1, 0xb1, 0x3e, 0x54, 0x63, 0xc2, 0x5d, 0x6d, 0xd8, +0x66, 0x78, 0xf1, 0x6f, 0x85, 0xfd, 0x7b, 0x94, 0xfd, 0x88, 0xa6, 0xfd, +0xa0, 0xc5, 0xfd, 0xc5, 0xf5, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, +0xfd, 0xfd, 0xfd, 0xf0, 0xfd, 0xfd, 0xbc, 0xe1, 0xfd, 0xb3, 0xd1, 0xfd, +0xa6, 0xbf, 0xfd, 0x98, 0xae, 0xfd, 0x86, 0x98, 0xfd, 0xa7, 0xad, 0x89, +0xe1, 0xda, 0x26, 0xe0, 0xd9, 0x23, 0xdf, 0xd9, 0x22, 0xdb, 0xd4, 0x1c, +0xe1, 0xdb, 0x2a, 0xdb, 0xd4, 0x1c, 0x80, 0x82, 0x42, 0x2b, 0x33, 0x6a, +0x26, 0x2e, 0x61, 0x23, 0x2a, 0x5b, 0x21, 0x28, 0x56, 0x1e, 0x25, 0x51, +0x1c, 0x22, 0x4b, 0x5e, 0x5f, 0x31, 0xe1, 0xdb, 0x2a, 0xde, 0xdc, 0x1f, +0xe1, 0xda, 0x26, 0xe0, 0xde, 0x25, 0xdc, 0xda, 0x1d, 0xa9, 0xab, 0x69, +0x55, 0x64, 0xe4, 0x4e, 0x5b, 0xe2, 0x49, 0x56, 0xdd, 0x46, 0x51, 0xd8, +0x43, 0x4e, 0xd3, 0x3f, 0x4a, 0xce, 0x4e, 0x58, 0xb4, 0xdf, 0xd9, 0x22, +0xd2, 0xcc, 0x1b, 0xdf, 0xd9, 0x22, 0x95, 0x96, 0x56, 0x32, 0x3b, 0xb5, +0x30, 0x3a, 0xb2, 0x2f, 0x38, 0xae, 0x2f, 0x37, 0xab, 0x2d, 0x35, 0xa8, +0x2d, 0x35, 0xa5, 0x2c, 0x34, 0xa2, 0xbc, 0xb8, 0x28, 0xde, 0xd7, 0x1d, +0xd4, 0xcd, 0x1b, 0xe0, 0xde, 0x25, 0xdb, 0xd4, 0x1c, 0xd2, 0xcc, 0x1b, +0x28, 0x2e, 0x8f, 0x26, 0x2e, 0x8d, 0x26, 0x2d, 0x8b, 0x26, 0x2c, 0x89, +0x25, 0x2b, 0x87, 0x24, 0x2a, 0x85, 0x24, 0x2a, 0x83, 0x39, 0x3d, 0x73, +0xe2, 0xe0, 0x2d, 0xe4, 0xe2, 0x35, 0xe2, 0xe0, 0x2b, 0xe1, 0xdb, 0x28, +0xdf, 0xd8, 0x20, 0xa4, 0xa1, 0x2c, 0x1f, 0x25, 0x74, 0x1f, 0x24, 0x73, +0x1f, 0x24, 0x71, 0x1e, 0x24, 0x70, 0x1e, 0x23, 0x6e, 0x8c, 0x8a, 0x34, +0xde, 0xd7, 0x1d, 0xd7, 0xd0, 0x1c, 0xd5, 0xcf, 0x1c, 0xdd, 0xd6, 0x1c, +0xd7, 0xd5, 0x1c, 0xce, 0xc9, 0x11, 0x31, 0x34, 0x59, 0x1a, 0x1f, 0x63, +0x1a, 0x1e, 0x62, 0x1a, 0x1e, 0x61, 0x19, 0x1d, 0x60, 0x19, 0x1d, 0x5f, +0x19, 0x1d, 0x5e, 0xa1, 0x9e, 0x23, 0xe1, 0xda, 0x26, 0xdf, 0xd8, 0x20, +0xe0, 0xd9, 0x23, 0xdf, 0xd8, 0x20, 0xe2, 0xdc, 0x2b, 0x17, 0x1b, 0x57, +0x16, 0x1a, 0x56, 0x16, 0x1a, 0x55, 0x16, 0x1a, 0x54, 0x15, 0x19, 0x53, +0xce, 0xc8, 0x0f, 0xe2, 0xdc, 0x2b, 0xa0, 0x9d, 0x1f, 0x14, 0x18, 0x50, +0xde, 0xd8, 0x1f, 0xe2, 0xe0, 0x2d, 0xde, 0xd7, 0x1d, 0xd7, 0xd5, 0x1c, +0xdf, 0xd9, 0x22, 0x59, 0x59, 0x35, 0x13, 0x16, 0x4b, 0x13, 0x16, 0x4b, +0x13, 0x16, 0x4a, 0x12, 0x16, 0x49, 0x12, 0x16, 0x49, 0x12, 0x16, 0x48, +0x6f, 0x6e, 0x2a, 0xdb, 0xd4, 0x1c, 0xe2, 0xe0, 0x2d, 0xcd, 0xc7, 0x0e, +0x28, 0x2a, 0x3e, 0x11, 0x14, 0x45, 0x11, 0x14, 0x44, 0x11, 0x14, 0x44, +0x10, 0x13, 0x42, 0x10, 0x13, 0x42, 0x10, 0x12, 0x41, 0x0f, 0x12, 0x41, +0x0f, 0x12, 0x40, 0x0f, 0x12, 0x40, 0x0f, 0x12, 0x3f, 0x0f, 0x12, 0x3f, +0x0e, 0x11, 0x3e, 0x0e, 0x11, 0x3e, 0x0e, 0x10, 0x37, 0x01, 0x01, 0x05, +0x12, 0x15, 0x49, 0x25, 0x2c, 0x94, 0x28, 0x2e, 0x9c, 0x22, 0x28, 0x83, +0x1f, 0x25, 0x7b, 0x1f, 0x25, 0x7c, 0x20, 0x25, 0x7e, 0x21, 0x26, 0x80, +0x21, 0x28, 0x82, 0x22, 0x28, 0x84, 0x23, 0x29, 0x86, 0x23, 0x29, 0x88, +0x24, 0x2b, 0x8a, 0x24, 0x2c, 0x8c, 0x25, 0x2c, 0x8f, 0x26, 0x2e, 0x91, +0xbe, 0xb8, 0x15, 0xdb, 0xd4, 0x1c, 0xe5, 0xdf, 0x36, 0xe3, 0xdd, 0x30, +0xe1, 0xdb, 0x28, 0xe2, 0xe0, 0x2d, 0xdd, 0xd6, 0x1c, 0x2f, 0x37, 0xa7, +0x31, 0x3a, 0xaa, 0x32, 0x3b, 0xad, 0x34, 0x3c, 0xb1, 0x35, 0x3e, 0xb4, +0x37, 0x41, 0xb8, 0x39, 0x43, 0xbc, 0x3b, 0x45, 0xbf, 0x3d, 0x48, 0xc4, +0x3f, 0x4a, 0xc8, 0x8a, 0x8d, 0x74, 0xb0, 0xaf, 0x4a, 0xc2, 0xbf, 0x35, +0xcb, 0xc4, 0x18, 0xd2, 0xcc, 0x1b, 0xd1, 0xcf, 0x1a, 0xe0, 0xd9, 0x23, +0xdb, 0xd4, 0x1c, 0xdb, 0xd4, 0x1c, 0xde, 0xd8, 0x1f, 0xdf, 0xd9, 0x22, +0xd3, 0xce, 0x17, 0xac, 0xab, 0x30, 0xa9, 0xa7, 0x2a, 0x78, 0x7a, 0x35, +0x1b, 0x22, 0x50, 0x1d, 0x25, 0x55, 0x62, 0x65, 0x3f, 0xde, 0xdb, 0x1d, +0xdf, 0xd8, 0x20, 0xcc, 0xc6, 0x19, 0xcb, 0xc4, 0x18, 0xd7, 0xd5, 0x1c, +0xe2, 0xe0, 0x2d, 0xae, 0xae, 0x3a, 0x47, 0x55, 0xb2, 0x4f, 0x5e, 0xc5, +0x54, 0x65, 0xd9, 0x59, 0x6d, 0xf0, 0x64, 0x7b, 0xfd, 0x70, 0x8b, 0xfd, +0x82, 0xa2, 0xfd, 0xa4, 0xc9, 0xfd, 0xfd, 0xfd, 0xfd, 0xfb, 0xfd, 0xfd, +0xd6, 0xfd, 0xfd, 0xbc, 0xe1, 0xfd, 0x9f, 0xbf, 0xfd, 0x86, 0xa1, 0xfd, +0x7b, 0x92, 0xfd, 0x76, 0x8a, 0xfd, 0x71, 0x82, 0xf6, 0xbd, 0xbd, 0x4f, +0xdf, 0xd9, 0x22, 0xe1, 0xda, 0x26, 0xd4, 0xcd, 0x1b, 0xcf, 0xc9, 0x1a, +0xe0, 0xd9, 0x23, 0xe2, 0xdc, 0x2d, 0x55, 0x5b, 0x58, 0x29, 0x32, 0x67, +0x25, 0x2d, 0x60, 0x22, 0x2a, 0x5a, 0x20, 0x27, 0x55, 0x1d, 0x24, 0x4f, +0x1c, 0x22, 0x4b, 0x19, 0x1f, 0x47, 0xe2, 0xe0, 0x2b, 0xe4, 0xe2, 0x35, +0xe0, 0xda, 0x25, 0xde, 0xdc, 0x1f, 0xe0, 0xde, 0x25, 0x9f, 0x9c, 0x16, +0x10, 0x15, 0x33, 0x10, 0x14, 0x32, 0x25, 0x2c, 0x56, 0x37, 0x41, 0x7b, +0x42, 0x4b, 0x94, 0x4a, 0x55, 0xac, 0xa2, 0xa3, 0x58, 0xd1, 0xca, 0x1a, +0xe0, 0xde, 0x25, 0xd3, 0xce, 0x1b, 0x55, 0x5d, 0xa5, 0x40, 0x4a, 0xb5, +0x3d, 0x47, 0xb2, 0x3a, 0x44, 0xae, 0x38, 0x40, 0xab, 0x36, 0x3f, 0xa8, +0x34, 0x3b, 0xa5, 0x32, 0x3a, 0xa2, 0xe1, 0xdb, 0x2a, 0xc7, 0xc1, 0x18, +0xbe, 0xb8, 0x15, 0xdb, 0xd4, 0x1c, 0xe5, 0xdf, 0x36, 0xd0, 0xcb, 0x16, +0x28, 0x2f, 0x8f, 0x27, 0x2d, 0x8d, 0x26, 0x2d, 0x8b, 0x25, 0x2b, 0x88, +0x24, 0x2a, 0x87, 0x23, 0x29, 0x85, 0x22, 0x29, 0x83, 0x8d, 0x8d, 0x3d, +0xde, 0xd8, 0x1f, 0xdf, 0xd9, 0x22, 0xdb, 0xd4, 0x1c, 0xe1, 0xdf, 0x2a, +0xe1, 0xda, 0x26, 0x60, 0x62, 0x51, 0x1d, 0x23, 0x74, 0x1d, 0x23, 0x73, +0x49, 0x4c, 0x59, 0x8b, 0x8a, 0x35, 0xcf, 0xc9, 0x12, 0xe0, 0xd9, 0x23, +0xdb, 0xd4, 0x1c, 0xdb, 0xd4, 0x1c, 0xde, 0xd8, 0x1f, 0xdf, 0xd9, 0x22, +0xce, 0xc9, 0x11, 0x2f, 0x33, 0x5a, 0x19, 0x1e, 0x64, 0x19, 0x1d, 0x63, +0x19, 0x1d, 0x62, 0x18, 0x1d, 0x61, 0x18, 0x1c, 0x60, 0x18, 0x1c, 0x5f, +0x17, 0x1b, 0x5e, 0x72, 0x71, 0x36, 0xcb, 0xc4, 0x18, 0xd7, 0xd5, 0x1c, +0xe2, 0xe0, 0x2d, 0xe2, 0xe0, 0x2b, 0xe3, 0xdd, 0x30, 0x16, 0x1a, 0x57, +0x15, 0x19, 0x56, 0x15, 0x19, 0x55, 0x15, 0x19, 0x54, 0x71, 0x70, 0x31, +0xe3, 0xe1, 0x32, 0xe1, 0xdf, 0x2a, 0x2b, 0x2d, 0x48, 0x14, 0x17, 0x50, +0xcb, 0xc4, 0x18, 0xe3, 0xdd, 0x30, 0xe8, 0xe2, 0x3f, 0xe0, 0xda, 0x25, +0xcc, 0xc6, 0x19, 0x59, 0x59, 0x35, 0x12, 0x16, 0x4b, 0x12, 0x16, 0x4b, +0x12, 0x15, 0x4a, 0x12, 0x15, 0x49, 0x12, 0x15, 0x49, 0x12, 0x15, 0x48, +0xcd, 0xc7, 0x0e, 0xe2, 0xdc, 0x2d, 0xde, 0xd8, 0x1f, 0x6f, 0x6d, 0x29, +0x11, 0x14, 0x45, 0x11, 0x14, 0x45, 0x11, 0x14, 0x44, 0x10, 0x14, 0x44, +0x10, 0x12, 0x42, 0x10, 0x12, 0x42, 0x10, 0x12, 0x41, 0x10, 0x12, 0x41, +0x10, 0x12, 0x40, 0x0f, 0x12, 0x40, 0x0f, 0x11, 0x3f, 0x0e, 0x11, 0x3f, +0x0e, 0x11, 0x3e, 0x0e, 0x11, 0x3e, 0x0e, 0x10, 0x37, 0x01, 0x01, 0x05, +0x13, 0x16, 0x49, 0x27, 0x2d, 0x94, 0x29, 0x2f, 0x9c, 0x23, 0x29, 0x83, +0x20, 0x26, 0x7a, 0x20, 0x26, 0x7c, 0x21, 0x27, 0x7e, 0x21, 0x28, 0x80, +0x22, 0x29, 0x81, 0x23, 0x2a, 0x84, 0x24, 0x2b, 0x86, 0x25, 0x2c, 0x88, +0x26, 0x2d, 0x8a, 0x27, 0x2d, 0x8c, 0x28, 0x2f, 0x8f, 0x2a, 0x30, 0x91, +0xde, 0xdb, 0x1d, 0xdd, 0xd6, 0x1c, 0xde, 0xd8, 0x1f, 0xe3, 0xdd, 0x30, +0xe4, 0xde, 0x31, 0xe4, 0xde, 0x31, 0xe1, 0xda, 0x26, 0x33, 0x3b, 0xa7, +0x35, 0x3e, 0xaa, 0x37, 0x40, 0xad, 0x38, 0x42, 0xb0, 0x3b, 0x44, 0xb4, +0x3d, 0x46, 0xb8, 0x3e, 0x48, 0xbc, 0x3f, 0x4a, 0xbf, 0x40, 0x4a, 0xc3, +0x41, 0x4c, 0xc7, 0x42, 0x4d, 0xcc, 0x43, 0x4d, 0xd0, 0x43, 0x4f, 0xd5, +0x43, 0x50, 0xda, 0xc2, 0xbf, 0x37, 0xdb, 0xd4, 0x1c, 0xe1, 0xdb, 0x28, +0xd7, 0xd5, 0x1c, 0xe1, 0xdf, 0x2a, 0xd2, 0xcc, 0x1b, 0xc5, 0xc3, 0x37, +0x52, 0x61, 0xc1, 0x35, 0x3f, 0x7a, 0x18, 0x1e, 0x47, 0x19, 0x20, 0x4b, +0x1b, 0x22, 0x4f, 0x1d, 0x24, 0x54, 0x61, 0x64, 0x3d, 0xde, 0xd7, 0x1d, +0xe0, 0xde, 0x25, 0xde, 0xd8, 0x1f, 0xd1, 0xcf, 0x1a, 0xcc, 0xc6, 0x19, +0xd2, 0xcc, 0x1b, 0xab, 0xab, 0x36, 0x3c, 0x4a, 0xa3, 0x43, 0x52, 0xb4, +0x48, 0x59, 0xc6, 0x4e, 0x61, 0xdb, 0x56, 0x6b, 0xf4, 0x61, 0x79, 0xfd, +0x73, 0x8e, 0xfd, 0xb3, 0xd1, 0xfd, 0xf5, 0xfd, 0xfd, 0xbb, 0xdd, 0xfd, +0xa3, 0xc3, 0xfd, 0x98, 0xb6, 0xfd, 0x87, 0xa2, 0xfd, 0x77, 0x8f, 0xfd, +0x69, 0x7e, 0xfd, 0x5c, 0x6f, 0xe9, 0x5b, 0x6c, 0xd9, 0xe1, 0xda, 0x26, +0xe3, 0xdd, 0x30, 0xcf, 0xc9, 0x1a, 0xde, 0xdb, 0x1d, 0xde, 0xdb, 0x1d, +0xce, 0xcc, 0x19, 0xd1, 0xcc, 0x13, 0x2c, 0x35, 0x6d, 0x28, 0x30, 0x66, +0x25, 0x2c, 0x5f, 0x22, 0x29, 0x59, 0x1f, 0x26, 0x54, 0x1d, 0x23, 0x4e, +0x1b, 0x21, 0x4a, 0x19, 0x1f, 0x46, 0xde, 0xd7, 0x1d, 0xe3, 0xdd, 0x2e, +0xe1, 0xda, 0x26, 0xe0, 0xd9, 0x23, 0xd7, 0xd5, 0x1c, 0x9f, 0x9c, 0x16, +0x10, 0x15, 0x33, 0x12, 0x17, 0x36, 0x12, 0x17, 0x35, 0x11, 0x16, 0x33, +0x13, 0x18, 0x36, 0x40, 0x42, 0x2a, 0xd9, 0xd2, 0x1c, 0xdd, 0xd6, 0x1c, +0xe0, 0xda, 0x25, 0x64, 0x65, 0x38, 0x30, 0x38, 0x6b, 0x37, 0x3f, 0x7c, +0x3d, 0x45, 0x8b, 0x41, 0x4b, 0x9a, 0x44, 0x4d, 0xa3, 0x44, 0x4d, 0xa8, +0x40, 0x49, 0xa5, 0x62, 0x67, 0x7f, 0xdf, 0xd9, 0x22, 0xd1, 0xca, 0x1a, +0xde, 0xdb, 0x1d, 0xdd, 0xd6, 0x1c, 0xde, 0xd8, 0x1f, 0xa9, 0xa7, 0x35, +0x2e, 0x36, 0x8f, 0x2c, 0x33, 0x8d, 0x2c, 0x32, 0x8b, 0x2a, 0x30, 0x88, +0x28, 0x2f, 0x87, 0x27, 0x2e, 0x85, 0x26, 0x2d, 0x82, 0xba, 0xb6, 0x22, +0xd5, 0xcf, 0x1c, 0xde, 0xd7, 0x1d, 0xde, 0xdc, 0x1f, 0xd1, 0xcf, 0x1a, +0xe1, 0xdb, 0x28, 0xa4, 0xa1, 0x2c, 0xb9, 0xb5, 0x1f, 0xdd, 0xd6, 0x1c, +0xd1, 0xcf, 0x1a, 0xd2, 0xcc, 0x1b, 0xdb, 0xd4, 0x1c, 0xe1, 0xdb, 0x28, +0xd7, 0xd5, 0x1c, 0xe1, 0xdf, 0x2a, 0xce, 0xc9, 0x12, 0x74, 0x74, 0x3d, +0x19, 0x1e, 0x67, 0x19, 0x1d, 0x65, 0x18, 0x1d, 0x64, 0x18, 0x1d, 0x63, +0x18, 0x1c, 0x62, 0x17, 0x1c, 0x61, 0x17, 0x1b, 0x60, 0x17, 0x1b, 0x5f, +0x16, 0x1a, 0x5d, 0x5b, 0x5b, 0x3f, 0xd1, 0xcf, 0x1a, 0xcc, 0xc6, 0x19, +0xd2, 0xcc, 0x1b, 0xe1, 0xda, 0x26, 0xe2, 0xe0, 0x2d, 0x15, 0x19, 0x57, +0x15, 0x18, 0x56, 0x14, 0x18, 0x55, 0x14, 0x18, 0x54, 0xce, 0xc8, 0x0f, +0xe4, 0xde, 0x31, 0x88, 0x85, 0x28, 0x13, 0x17, 0x51, 0x13, 0x17, 0x50, +0xe2, 0xe0, 0x2b, 0xe4, 0xde, 0x33, 0xe2, 0xe0, 0x2b, 0xd7, 0xd5, 0x1c, +0xd5, 0xcf, 0x1c, 0x58, 0x59, 0x35, 0x12, 0x15, 0x4b, 0x12, 0x15, 0x4b, +0x12, 0x15, 0x4a, 0x11, 0x15, 0x49, 0x11, 0x15, 0x49, 0x6f, 0x6d, 0x2b, +0xce, 0xcc, 0x19, 0xdf, 0xd9, 0x22, 0xb6, 0xb1, 0x14, 0x11, 0x14, 0x45, +0x10, 0x14, 0x45, 0x10, 0x14, 0x45, 0x10, 0x13, 0x44, 0x10, 0x13, 0x44, +0x10, 0x12, 0x42, 0x10, 0x12, 0x42, 0x0f, 0x12, 0x41, 0x0f, 0x12, 0x41, +0x0f, 0x12, 0x40, 0x0f, 0x12, 0x40, 0x0f, 0x12, 0x3f, 0x0e, 0x11, 0x3f, +0x0e, 0x11, 0x3e, 0x0e, 0x11, 0x3e, 0x0e, 0x0f, 0x37, 0x01, 0x01, 0x05, +0x14, 0x17, 0x49, 0x29, 0x2f, 0x94, 0x2a, 0x32, 0x9c, 0x24, 0x2b, 0x82, +0x21, 0x28, 0x7a, 0x22, 0x28, 0x7c, 0x22, 0x29, 0x7e, 0x23, 0x2a, 0x80, +0x24, 0x2a, 0x81, 0x25, 0x2c, 0x84, 0x26, 0x2d, 0x86, 0x27, 0x2e, 0x88, +0x28, 0x2f, 0x8a, 0x29, 0x30, 0x8c, 0x2a, 0x32, 0x8f, 0x2c, 0x33, 0x90, +0xd1, 0xcf, 0x1a, 0xdc, 0xda, 0x1d, 0xd7, 0xd5, 0x1c, 0xe0, 0xda, 0x25, +0xe6, 0xe4, 0x39, 0xdb, 0xd4, 0x1c, 0xe1, 0xda, 0x26, 0x34, 0x3c, 0xa6, +0x34, 0x3e, 0xa9, 0x35, 0x3e, 0xad, 0x36, 0x40, 0xb0, 0x37, 0x40, 0xb3, +0x37, 0x41, 0xb7, 0x38, 0x42, 0xbb, 0x38, 0x41, 0xbf, 0x38, 0x43, 0xc3, +0x39, 0x44, 0xc7, 0x3a, 0x44, 0xcc, 0x3a, 0x45, 0xd0, 0x3b, 0x46, 0xd4, +0x3b, 0x46, 0xd9, 0xc0, 0xbd, 0x37, 0xe4, 0xe2, 0x33, 0xce, 0xcc, 0x19, +0xdf, 0xd8, 0x20, 0xdf, 0xd8, 0x20, 0xce, 0xcc, 0x19, 0x70, 0x70, 0x24, +0x14, 0x1a, 0x3f, 0x15, 0x1b, 0x42, 0x16, 0x1d, 0x45, 0x18, 0x1e, 0x49, +0x19, 0x20, 0x4d, 0x1b, 0x22, 0x51, 0x60, 0x62, 0x3b, 0xe1, 0xdb, 0x2a, +0xdb, 0xd4, 0x1c, 0xd4, 0xcd, 0x1b, 0xc1, 0xbb, 0x16, 0xc9, 0xc7, 0x18, +0xd2, 0xcc, 0x1b, 0xa9, 0xa8, 0x33, 0x35, 0x42, 0x98, 0x3b, 0x4a, 0xa7, +0x40, 0x50, 0xb6, 0x46, 0x57, 0xc8, 0x4d, 0x60, 0xdd, 0x59, 0x6e, 0xf7, +0x71, 0x88, 0xfd, 0xb6, 0xcf, 0xfd, 0xb8, 0xd2, 0xfd, 0x95, 0xb0, 0xfd, +0x83, 0x9d, 0xfd, 0x7d, 0x96, 0xfd, 0x74, 0x8b, 0xfd, 0x69, 0x7e, 0xfd, +0x5e, 0x71, 0xee, 0x56, 0x67, 0xd8, 0x6e, 0x79, 0x99, 0xdf, 0xd8, 0x20, +0xdf, 0xd9, 0x22, 0xe1, 0xda, 0x26, 0xdf, 0xd9, 0x22, 0xe1, 0xda, 0x26, +0xe1, 0xda, 0x26, 0x93, 0x93, 0x36, 0x2a, 0x33, 0x6b, 0x27, 0x2f, 0x63, +0x23, 0x2b, 0x5d, 0x21, 0x28, 0x57, 0x1e, 0x25, 0x52, 0x1c, 0x23, 0x4e, +0x1a, 0x20, 0x49, 0x18, 0x1e, 0x45, 0xdf, 0xd9, 0x22, 0xdf, 0xd9, 0x22, +0xd7, 0xd5, 0x1c, 0xdb, 0xd4, 0x1c, 0xd7, 0xd5, 0x1c, 0xad, 0xac, 0x31, +0x4c, 0x58, 0xaa, 0x4a, 0x55, 0xa6, 0x46, 0x51, 0x9e, 0x42, 0x4b, 0x93, +0x3e, 0x48, 0x8b, 0xc0, 0xbc, 0x23, 0xe1, 0xda, 0x26, 0xde, 0xdc, 0x1f, +0xab, 0xa9, 0x2d, 0x37, 0x3f, 0x7a, 0x34, 0x3c, 0x74, 0x35, 0x3c, 0x75, +0x34, 0x3c, 0x75, 0x32, 0x39, 0x70, 0x31, 0x38, 0x6d, 0x33, 0x3a, 0x72, +0x30, 0x37, 0x6c, 0x6c, 0x6f, 0x4b, 0xdb, 0xd4, 0x1c, 0xc1, 0xbb, 0x16, +0xd1, 0xcf, 0x1a, 0xdc, 0xda, 0x1d, 0xd7, 0xd5, 0x1c, 0x85, 0x87, 0x53, +0x36, 0x3e, 0x8f, 0x34, 0x3c, 0x8d, 0x32, 0x3a, 0x8b, 0x30, 0x37, 0x88, +0x2f, 0x36, 0x87, 0x2d, 0x34, 0x85, 0x2b, 0x32, 0x82, 0xe1, 0xdf, 0x2a, +0xdf, 0xd9, 0x22, 0xd5, 0xcf, 0x1c, 0xde, 0xd7, 0x1d, 0xde, 0xdc, 0x1f, +0xcb, 0xc4, 0x18, 0xd1, 0xcf, 0x1a, 0xe1, 0xda, 0x26, 0xe1, 0xda, 0x26, +0xdf, 0xd8, 0x20, 0xde, 0xd7, 0x1d, 0xe4, 0xe2, 0x33, 0xcf, 0xc9, 0x12, +0xa3, 0xa0, 0x28, 0x60, 0x61, 0x49, 0x1d, 0x22, 0x69, 0x1c, 0x21, 0x68, +0x1c, 0x20, 0x67, 0x1b, 0x1f, 0x65, 0x1b, 0x1f, 0x64, 0x1a, 0x1e, 0x63, +0x19, 0x1e, 0x62, 0x19, 0x1d, 0x61, 0x18, 0x1d, 0x60, 0x18, 0x1c, 0x5e, +0x17, 0x1c, 0x5d, 0x5c, 0x5c, 0x3f, 0xc1, 0xbb, 0x16, 0xc9, 0xc7, 0x18, +0xd2, 0xcc, 0x1b, 0xd1, 0xcf, 0x1a, 0xdc, 0xda, 0x1d, 0x15, 0x19, 0x57, +0x15, 0x19, 0x56, 0x14, 0x18, 0x55, 0x71, 0x70, 0x31, 0xdf, 0xd8, 0x20, +0xdc, 0xda, 0x1d, 0x2a, 0x2c, 0x49, 0x13, 0x17, 0x51, 0x13, 0x16, 0x50, +0xe8, 0xe6, 0x3f, 0xe0, 0xde, 0x25, 0xc6, 0xc0, 0x17, 0xe3, 0xdd, 0x2e, +0xdc, 0xda, 0x1d, 0x58, 0x58, 0x35, 0x11, 0x15, 0x4b, 0x11, 0x15, 0x4b, +0x11, 0x15, 0x4a, 0x11, 0x14, 0x49, 0x28, 0x2a, 0x41, 0xcd, 0xc7, 0x0e, +0xe1, 0xda, 0x26, 0xe1, 0xdf, 0x2a, 0x3e, 0x3f, 0x37, 0x10, 0x13, 0x45, +0x10, 0x13, 0x45, 0x10, 0x13, 0x45, 0x10, 0x13, 0x44, 0x10, 0x13, 0x44, +0x0f, 0x12, 0x42, 0x0f, 0x12, 0x42, 0x0f, 0x12, 0x41, 0x0f, 0x12, 0x41, +0x0f, 0x12, 0x40, 0x0f, 0x12, 0x40, 0x0f, 0x12, 0x3f, 0x0f, 0x11, 0x3f, +0x0f, 0x11, 0x3e, 0x0e, 0x11, 0x3e, 0x0e, 0x0f, 0x37, 0x01, 0x01, 0x05, +0x14, 0x18, 0x49, 0x29, 0x32, 0x94, 0x2c, 0x34, 0x99, 0x26, 0x2c, 0x82, +0x23, 0x29, 0x7a, 0x24, 0x29, 0x7c, 0x25, 0x2a, 0x7e, 0x26, 0x2c, 0x80, +0x27, 0x2d, 0x81, 0x27, 0x2e, 0x83, 0x28, 0x2e, 0x86, 0x28, 0x2f, 0x88, +0x28, 0x30, 0x8a, 0x29, 0x30, 0x8c, 0x2a, 0x31, 0x8e, 0x2b, 0x32, 0x90, +0xd0, 0xcb, 0x16, 0xd1, 0xcf, 0x1a, 0xdb, 0xd4, 0x1c, 0xe4, 0xde, 0x31, +0xdf, 0xd8, 0x20, 0xe2, 0xe0, 0x2b, 0xe0, 0xde, 0x25, 0x43, 0x49, 0x94, +0x30, 0x39, 0xa9, 0x31, 0x39, 0xad, 0x31, 0x3a, 0xb0, 0x32, 0x3b, 0xb3, +0x32, 0x3b, 0xb6, 0x32, 0x3c, 0xba, 0x33, 0x3d, 0xbe, 0x35, 0x3e, 0xc2, +0x38, 0x43, 0xc7, 0x3b, 0x46, 0xcb, 0x3f, 0x4b, 0xcf, 0x45, 0x50, 0xd4, +0x4a, 0x56, 0xd8, 0xde, 0xd7, 0x1d, 0xe4, 0xe2, 0x33, 0xe1, 0xda, 0x26, +0xd4, 0xcd, 0x1b, 0xcc, 0xc6, 0x19, 0xd2, 0xcc, 0x1b, 0x58, 0x59, 0x29, +0x13, 0x19, 0x3e, 0x14, 0x1a, 0x41, 0x15, 0x1c, 0x44, 0x16, 0x1d, 0x47, +0x18, 0x1f, 0x4b, 0x19, 0x20, 0x4e, 0x47, 0x4b, 0x42, 0xe4, 0xe2, 0x35, +0xe0, 0xde, 0x25, 0xc9, 0xc7, 0x18, 0xd1, 0xcf, 0x1a, 0xce, 0xc7, 0x19, +0xc3, 0xbd, 0x16, 0xbc, 0xb9, 0x22, 0x30, 0x3c, 0x8d, 0x34, 0x42, 0x9a, +0x39, 0x47, 0xa7, 0x40, 0x50, 0xb8, 0x48, 0x59, 0xca, 0x50, 0x63, 0xdd, +0x77, 0x8b, 0xfd, 0xb0, 0xc6, 0xfd, 0x94, 0xaa, 0xfd, 0x7c, 0x93, 0xfd, +0x70, 0x86, 0xfd, 0x69, 0x7f, 0xfd, 0x64, 0x78, 0xfb, 0x5d, 0x70, 0xea, +0x56, 0x67, 0xd8, 0x4e, 0x5e, 0xc6, 0x9e, 0xa1, 0x54, 0xe2, 0xe0, 0x2b, +0xdf, 0xd8, 0x20, 0xe0, 0xda, 0x25, 0xde, 0xdc, 0x1f, 0xe3, 0xdd, 0x30, +0xe6, 0xdf, 0x37, 0x52, 0x57, 0x55, 0x26, 0x2f, 0x65, 0x24, 0x2c, 0x5f, +0x22, 0x29, 0x5a, 0x1f, 0x26, 0x55, 0x1e, 0x24, 0x50, 0x1b, 0x22, 0x4c, +0x1a, 0x20, 0x48, 0x18, 0x1e, 0x44, 0xa0, 0x9e, 0x1a, 0xce, 0xc7, 0x19, +0xd9, 0xd2, 0x1c, 0xd7, 0xd5, 0x1c, 0xde, 0xd7, 0x1d, 0xd3, 0xce, 0x16, +0x4d, 0x58, 0xae, 0x51, 0x5d, 0xb8, 0x4e, 0x59, 0xb3, 0x50, 0x5b, 0xba, +0x92, 0x96, 0x6c, 0xe1, 0xda, 0x26, 0xdb, 0xd4, 0x1c, 0xd4, 0xcf, 0x1b, +0x5c, 0x64, 0xa0, 0x49, 0x53, 0xac, 0x46, 0x52, 0xa9, 0x45, 0x4f, 0xa3, +0x43, 0x4b, 0x9c, 0x40, 0x4a, 0x99, 0x40, 0x48, 0x96, 0x3e, 0x47, 0x93, +0x3c, 0x44, 0x8d, 0xad, 0xab, 0x34, 0xd1, 0xca, 0x1a, 0xd1, 0xca, 0x1a, +0xd7, 0xd5, 0x1c, 0xd1, 0xcf, 0x1a, 0xdb, 0xd4, 0x1c, 0x70, 0x73, 0x57, +0x36, 0x3d, 0x80, 0x35, 0x3c, 0x7f, 0x34, 0x3c, 0x7e, 0x36, 0x3d, 0x81, +0x36, 0x3e, 0x87, 0x34, 0x3a, 0x84, 0x59, 0x5d, 0x66, 0xdf, 0xd9, 0x22, +0xdd, 0xd6, 0x1c, 0xdb, 0xd4, 0x1c, 0xdf, 0xd9, 0x22, 0xd7, 0xd5, 0x1c, +0xbb, 0xb7, 0x20, 0x67, 0x69, 0x51, 0x66, 0x67, 0x4f, 0x65, 0x67, 0x4e, +0x65, 0x66, 0x4d, 0x38, 0x3c, 0x63, 0x22, 0x28, 0x6f, 0x21, 0x27, 0x6d, +0x20, 0x26, 0x6c, 0x20, 0x25, 0x6a, 0x1f, 0x25, 0x69, 0x1f, 0x24, 0x68, +0x1e, 0x23, 0x67, 0x1d, 0x22, 0x65, 0x1d, 0x21, 0x64, 0x1c, 0x21, 0x63, +0x1b, 0x20, 0x62, 0x1b, 0x20, 0x61, 0x1a, 0x1f, 0x5f, 0x19, 0x1e, 0x5e, +0x19, 0x1d, 0x5d, 0x5d, 0x5d, 0x3f, 0xd1, 0xcf, 0x1a, 0xce, 0xc7, 0x19, +0xc3, 0xbd, 0x16, 0xcf, 0xc9, 0x1a, 0xe1, 0xdb, 0x2a, 0x2c, 0x2f, 0x4e, +0x16, 0x1a, 0x56, 0x2b, 0x2e, 0x4c, 0xe2, 0xdc, 0x2d, 0xdf, 0xd9, 0x22, +0x88, 0x86, 0x28, 0x14, 0x18, 0x52, 0x14, 0x18, 0x51, 0x14, 0x17, 0x50, +0xd4, 0xcd, 0x1b, 0xde, 0xd8, 0x1f, 0xe3, 0xdd, 0x2e, 0xe1, 0xdf, 0x2a, +0xd1, 0xca, 0x1a, 0x58, 0x59, 0x35, 0x12, 0x15, 0x4b, 0x12, 0x15, 0x4a, +0x12, 0x15, 0x4a, 0x11, 0x15, 0x49, 0x86, 0x84, 0x24, 0xe3, 0xdd, 0x30, +0xe6, 0xdf, 0x37, 0x86, 0x84, 0x23, 0x10, 0x13, 0x45, 0x10, 0x13, 0x45, +0x10, 0x13, 0x45, 0x10, 0x13, 0x45, 0x10, 0x13, 0x44, 0x10, 0x13, 0x44, +0x0f, 0x12, 0x42, 0x0f, 0x12, 0x41, 0x0f, 0x12, 0x41, 0x0f, 0x12, 0x40, +0x0f, 0x12, 0x40, 0x0f, 0x12, 0x40, 0x0e, 0x11, 0x3f, 0x0e, 0x10, 0x3f, +0x0e, 0x10, 0x3e, 0x0e, 0x10, 0x3e, 0x0e, 0x0f, 0x37, 0x01, 0x01, 0x05, +0x14, 0x19, 0x49, 0x2b, 0x32, 0x94, 0x2c, 0x35, 0x99, 0x26, 0x2c, 0x82, +0x22, 0x29, 0x7a, 0x23, 0x29, 0x7c, 0x24, 0x2a, 0x7e, 0x24, 0x2a, 0x80, +0x25, 0x2b, 0x81, 0x25, 0x2c, 0x83, 0x26, 0x2c, 0x85, 0x26, 0x2d, 0x88, +0x27, 0x2d, 0x8a, 0x27, 0x2e, 0x8c, 0x28, 0x2f, 0x8e, 0x28, 0x2f, 0x90, +0xa7, 0xa4, 0x35, 0xcf, 0xc9, 0x1a, 0xe1, 0xdf, 0x2a, 0xe2, 0xe0, 0x2d, +0xe0, 0xd9, 0x23, 0xdb, 0xd4, 0x1c, 0xe2, 0xe0, 0x2d, 0x6a, 0x6d, 0x70, +0x2c, 0x35, 0xa8, 0x2e, 0x37, 0xac, 0x31, 0x39, 0xaf, 0x33, 0x3c, 0xb3, +0x35, 0x3e, 0xb6, 0x38, 0x42, 0xba, 0x3c, 0x47, 0xbd, 0x40, 0x4a, 0xc2, +0x44, 0x4f, 0xc5, 0x4a, 0x56, 0xc9, 0x50, 0x5d, 0xce, 0x52, 0x5d, 0xc5, +0x69, 0x70, 0x7f, 0xe1, 0xda, 0x26, 0xde, 0xdb, 0x1d, 0xe1, 0xda, 0x26, +0xd9, 0xd2, 0x1c, 0xdc, 0xda, 0x1d, 0xd5, 0xcf, 0x1c, 0x11, 0x16, 0x39, +0x12, 0x18, 0x3c, 0x13, 0x19, 0x3f, 0x14, 0x1a, 0x42, 0x15, 0x1c, 0x45, +0x16, 0x1d, 0x48, 0x17, 0x1e, 0x4c, 0x19, 0x21, 0x50, 0xe1, 0xdf, 0x2a, +0xde, 0xd8, 0x1f, 0xd9, 0xd2, 0x1c, 0xe0, 0xde, 0x25, 0xd5, 0xcf, 0x1c, +0xc7, 0xc1, 0x18, 0xdf, 0xd8, 0x20, 0x2b, 0x37, 0x84, 0x2e, 0x3b, 0x8e, +0x34, 0x41, 0x9a, 0x3b, 0x49, 0xa9, 0x42, 0x52, 0xb8, 0x55, 0x66, 0xd3, +0x79, 0x8a, 0xfd, 0x90, 0xa2, 0xfd, 0x7a, 0x8d, 0xfd, 0x6a, 0x7d, 0xfb, +0x60, 0x73, 0xf0, 0x5b, 0x6d, 0xe6, 0x58, 0x69, 0xdd, 0x53, 0x64, 0xd1, +0x4d, 0x5d, 0xc3, 0x46, 0x55, 0xb4, 0xe5, 0xdf, 0x34, 0xd7, 0xd0, 0x1c, +0xd2, 0xcc, 0x1b, 0xe3, 0xe1, 0x32, 0xe4, 0xe2, 0x33, 0xe5, 0xdf, 0x36, +0xbb, 0xb7, 0x1d, 0x25, 0x2e, 0x66, 0x23, 0x2b, 0x60, 0x21, 0x29, 0x5b, +0x1f, 0x26, 0x56, 0x1d, 0x24, 0x52, 0x3c, 0x49, 0x8a, 0x3f, 0x4b, 0x8e, +0x32, 0x3c, 0x73, 0x27, 0x2f, 0x5e, 0xa0, 0x9e, 0x1a, 0xd7, 0xd5, 0x1c, +0xd4, 0xcd, 0x1b, 0xd9, 0xd2, 0x1c, 0xdc, 0xda, 0x1d, 0xde, 0xdb, 0x1d, +0x53, 0x60, 0xbe, 0x50, 0x5c, 0xba, 0x52, 0x5d, 0xbd, 0x61, 0x6b, 0xaa, +0xd5, 0xcf, 0x1c, 0xdc, 0xda, 0x1d, 0xdb, 0xd4, 0x1c, 0x81, 0x86, 0x82, +0x4d, 0x59, 0xbe, 0x4b, 0x55, 0xba, 0x49, 0x53, 0xb7, 0x47, 0x51, 0xb4, +0x44, 0x4e, 0xb0, 0x44, 0x4c, 0xad, 0x42, 0x4b, 0xa9, 0x41, 0x4a, 0xa6, +0x40, 0x4a, 0xa4, 0xc0, 0xbd, 0x29, 0xe7, 0xe1, 0x3c, 0xe4, 0xde, 0x31, +0xdb, 0xd4, 0x1c, 0xcf, 0xc9, 0x1a, 0xe1, 0xdf, 0x2a, 0x4b, 0x52, 0x81, +0x38, 0x41, 0x8e, 0x37, 0x40, 0x8d, 0x36, 0x3e, 0x8a, 0x36, 0x3d, 0x88, +0x35, 0x3c, 0x86, 0x34, 0x3a, 0x84, 0x6e, 0x71, 0x59, 0xe0, 0xd9, 0x23, +0xe1, 0xdb, 0x2a, 0xd7, 0xd5, 0x1c, 0xd7, 0xd5, 0x1c, 0xde, 0xdc, 0x1f, +0xa8, 0xa6, 0x2c, 0x2c, 0x32, 0x76, 0x2b, 0x31, 0x74, 0x29, 0x30, 0x72, +0x28, 0x2f, 0x71, 0x27, 0x2d, 0x6f, 0x26, 0x2c, 0x6f, 0x25, 0x2a, 0x6d, +0x24, 0x29, 0x6c, 0x23, 0x28, 0x6a, 0x22, 0x27, 0x69, 0x21, 0x26, 0x68, +0x20, 0x25, 0x66, 0x1f, 0x25, 0x65, 0x1e, 0x24, 0x64, 0x1d, 0x23, 0x63, +0x1d, 0x22, 0x62, 0x1d, 0x21, 0x60, 0x1c, 0x21, 0x5f, 0x1b, 0x20, 0x5e, +0x1b, 0x20, 0x5d, 0x5e, 0x5f, 0x3f, 0xe0, 0xde, 0x25, 0xd5, 0xcf, 0x1c, +0xc7, 0xc1, 0x18, 0xdf, 0xd8, 0x20, 0xdb, 0xd4, 0x1c, 0x5c, 0x5d, 0x3c, +0x17, 0x1c, 0x56, 0x89, 0x87, 0x29, 0xdf, 0xd9, 0x22, 0xde, 0xdc, 0x1f, +0x2c, 0x2f, 0x49, 0x16, 0x1a, 0x52, 0x15, 0x19, 0x51, 0x15, 0x19, 0x50, +0xa0, 0x9c, 0x1f, 0xe2, 0xe0, 0x2b, 0xdf, 0xd9, 0x22, 0xd4, 0xcd, 0x1b, +0xdb, 0xd4, 0x1c, 0x9f, 0x9c, 0x1e, 0x13, 0x16, 0x4b, 0x12, 0x16, 0x4a, +0x12, 0x16, 0x4a, 0x40, 0x41, 0x3a, 0xe4, 0xe2, 0x33, 0xe5, 0xdf, 0x36, +0xb6, 0xb1, 0x15, 0x11, 0x14, 0x47, 0x11, 0x14, 0x45, 0x11, 0x14, 0x45, +0x10, 0x14, 0x45, 0x10, 0x14, 0x45, 0x10, 0x13, 0x44, 0x10, 0x13, 0x43, +0x10, 0x12, 0x42, 0x0f, 0x12, 0x41, 0x0f, 0x12, 0x41, 0x0f, 0x12, 0x40, +0x0f, 0x12, 0x40, 0x0f, 0x12, 0x3f, 0x0f, 0x12, 0x3f, 0x0f, 0x11, 0x3f, +0x0f, 0x11, 0x3e, 0x0e, 0x10, 0x3e, 0x0e, 0x0f, 0x37, 0x01, 0x01, 0x05, +0x14, 0x17, 0x49, 0x29, 0x31, 0x93, 0x2a, 0x32, 0x99, 0x24, 0x2b, 0x82, +0x21, 0x28, 0x7a, 0x21, 0x28, 0x7c, 0x22, 0x29, 0x7e, 0x22, 0x29, 0x80, +0x23, 0x2a, 0x81, 0x23, 0x2a, 0x83, 0x23, 0x2b, 0x85, 0x24, 0x2b, 0x87, +0x24, 0x2c, 0x8a, 0x25, 0x2c, 0x8b, 0x25, 0x2d, 0x8e, 0x26, 0x2d, 0x90, +0x7b, 0x7c, 0x54, 0xe6, 0xe0, 0x39, 0xe6, 0xdf, 0x37, 0xd7, 0xd0, 0x1c, +0xcb, 0xc4, 0x18, 0xe0, 0xda, 0x25, 0xd5, 0xcf, 0x1c, 0x94, 0x94, 0x4d, +0x33, 0x3b, 0xa8, 0x35, 0x3f, 0xac, 0x38, 0x41, 0xaf, 0x3b, 0x46, 0xb2, +0x3f, 0x49, 0xb6, 0x43, 0x4d, 0xb9, 0x48, 0x54, 0xbd, 0x4e, 0x59, 0xbf, +0x47, 0x52, 0xa7, 0x3b, 0x43, 0x85, 0x28, 0x2e, 0x5b, 0x0c, 0x10, 0x2a, +0x54, 0x55, 0x1f, 0xde, 0xd7, 0x1d, 0xdc, 0xda, 0x1d, 0xcc, 0xc6, 0x19, +0xdd, 0xd6, 0x1c, 0xd7, 0xd5, 0x1c, 0xcd, 0xc8, 0x0c, 0x11, 0x16, 0x38, +0x11, 0x17, 0x3b, 0x12, 0x18, 0x3d, 0x13, 0x19, 0x40, 0x1b, 0x22, 0x4f, +0x39, 0x45, 0x89, 0x27, 0x31, 0x66, 0x17, 0x1f, 0x4d, 0xb8, 0xb4, 0x17, +0xd2, 0xcc, 0x1b, 0xe0, 0xda, 0x25, 0xe2, 0xe0, 0x2d, 0xd9, 0xd2, 0x1c, +0xe1, 0xdf, 0x2a, 0xd7, 0xd0, 0x1c, 0x50, 0x57, 0x61, 0x2b, 0x37, 0x85, +0x30, 0x3d, 0x8f, 0x36, 0x44, 0x9c, 0x40, 0x4f, 0xac, 0x59, 0x68, 0xca, +0x78, 0x87, 0xee, 0x79, 0x89, 0xf4, 0x68, 0x79, 0xe6, 0x5c, 0x6d, 0xdb, +0x55, 0x66, 0xd3, 0x50, 0x60, 0xcb, 0x4e, 0x5d, 0xc4, 0x4b, 0x5a, 0xbc, +0x45, 0x53, 0xb1, 0x89, 0x8d, 0x5e, 0xe2, 0xdc, 0x2d, 0xe2, 0xe0, 0x2b, +0xe2, 0xe0, 0x2b, 0xe0, 0xde, 0x25, 0xdf, 0xd8, 0x20, 0xe2, 0xe0, 0x2d, +0x4d, 0x52, 0x50, 0x21, 0x29, 0x60, 0x20, 0x28, 0x5b, 0x1e, 0x26, 0x57, +0x1d, 0x24, 0x53, 0x1b, 0x22, 0x4e, 0x28, 0x31, 0x63, 0x46, 0x53, 0x9f, +0x57, 0x67, 0xcf, 0x57, 0x66, 0xdf, 0xb6, 0xb7, 0x4f, 0xdb, 0xd4, 0x1c, +0xe2, 0xe0, 0x2d, 0xde, 0xdc, 0x1f, 0xd7, 0xd5, 0x1c, 0xc1, 0xbf, 0x16, +0x59, 0x66, 0xd4, 0x57, 0x66, 0xd2, 0x55, 0x62, 0xce, 0xc5, 0xc2, 0x32, +0xd9, 0xd2, 0x1c, 0xde, 0xd8, 0x1f, 0xa2, 0xa4, 0x5b, 0x4f, 0x5b, 0xc2, +0x4c, 0x57, 0xbe, 0x49, 0x55, 0xba, 0x48, 0x52, 0xb7, 0x45, 0x4f, 0xb3, +0x44, 0x4e, 0xb0, 0x42, 0x4c, 0xad, 0x3f, 0x4a, 0xa9, 0x3f, 0x47, 0xa6, +0x3d, 0x46, 0xa3, 0xe4, 0xe2, 0x33, 0xe6, 0xdf, 0x37, 0xe1, 0xdf, 0x2a, +0xd7, 0xd5, 0x1c, 0xe6, 0xe0, 0x39, 0xe6, 0xdf, 0x37, 0x36, 0x3d, 0x90, +0x35, 0x3c, 0x8e, 0x34, 0x3b, 0x8c, 0x33, 0x3a, 0x8a, 0x32, 0x3a, 0x87, +0x31, 0x39, 0x86, 0x31, 0x38, 0x84, 0x6c, 0x6f, 0x59, 0xe4, 0xde, 0x31, +0xe2, 0xe0, 0x2b, 0xc7, 0xc5, 0x18, 0xcc, 0xc6, 0x19, 0xdf, 0xd9, 0x22, +0xa8, 0xa5, 0x2c, 0x2b, 0x32, 0x75, 0x2a, 0x31, 0x74, 0x2a, 0x30, 0x72, +0x29, 0x2f, 0x70, 0x29, 0x2f, 0x6f, 0x28, 0x2e, 0x6e, 0x27, 0x2d, 0x6d, +0x27, 0x2d, 0x6c, 0x26, 0x2c, 0x6a, 0x26, 0x2b, 0x69, 0x25, 0x29, 0x68, +0x23, 0x29, 0x66, 0x22, 0x27, 0x65, 0x22, 0x27, 0x64, 0x20, 0x25, 0x63, +0x20, 0x24, 0x62, 0x1f, 0x23, 0x60, 0x1e, 0x23, 0x5f, 0x1d, 0x22, 0x5e, +0x1d, 0x21, 0x5d, 0x5f, 0x60, 0x3f, 0xe2, 0xe0, 0x2d, 0xd9, 0xd2, 0x1c, +0xe1, 0xdf, 0x2a, 0xd7, 0xd0, 0x1c, 0xd9, 0xd2, 0x1c, 0x5d, 0x5d, 0x3b, +0x2f, 0x32, 0x4d, 0xdd, 0xd6, 0x1c, 0xd1, 0xca, 0x1a, 0x89, 0x87, 0x28, +0x17, 0x1b, 0x52, 0x16, 0x1a, 0x51, 0x16, 0x1a, 0x51, 0x16, 0x1a, 0x50, +0xa0, 0x9d, 0x1f, 0xe1, 0xdf, 0x2a, 0xd7, 0xd0, 0x1c, 0xd4, 0xcd, 0x1b, +0xd7, 0xd5, 0x1c, 0xa0, 0x9c, 0x1e, 0x14, 0x17, 0x4b, 0x13, 0x17, 0x4a, +0x13, 0x16, 0x4a, 0xce, 0xc8, 0x0e, 0xdf, 0xd8, 0x20, 0xe2, 0xe0, 0x2d, +0x29, 0x2b, 0x3f, 0x12, 0x15, 0x47, 0x11, 0x14, 0x45, 0x11, 0x14, 0x45, +0x11, 0x14, 0x45, 0x11, 0x14, 0x45, 0x11, 0x14, 0x44, 0x10, 0x13, 0x43, +0x10, 0x12, 0x42, 0x10, 0x12, 0x41, 0x10, 0x12, 0x41, 0x10, 0x12, 0x40, +0x10, 0x12, 0x40, 0x0f, 0x12, 0x3f, 0x0f, 0x12, 0x3f, 0x0f, 0x11, 0x3f, +0x0f, 0x11, 0x3e, 0x0f, 0x11, 0x3e, 0x0e, 0x0f, 0x37, 0x01, 0x01, 0x05, +0x13, 0x17, 0x48, 0x28, 0x2e, 0x93, 0x2a, 0x31, 0x99, 0x24, 0x2a, 0x82, +0x20, 0x26, 0x79, 0x20, 0x26, 0x7b, 0x21, 0x26, 0x7d, 0x21, 0x27, 0x7f, +0x21, 0x28, 0x81, 0x22, 0x28, 0x83, 0x22, 0x29, 0x85, 0x23, 0x29, 0x87, +0x23, 0x2a, 0x89, 0x24, 0x2b, 0x8b, 0x25, 0x2c, 0x8d, 0x27, 0x2e, 0x90, +0x52, 0x56, 0x73, 0xe6, 0xdf, 0x37, 0xe1, 0xdb, 0x28, 0xde, 0xd7, 0x1d, +0xc9, 0xc7, 0x18, 0xdf, 0xd9, 0x22, 0xe2, 0xdc, 0x2d, 0xd2, 0xcc, 0x18, +0x3b, 0x43, 0xa8, 0x3d, 0x46, 0xab, 0x41, 0x4b, 0xae, 0x46, 0x50, 0xb1, +0x46, 0x50, 0xa9, 0x3f, 0x49, 0x93, 0x34, 0x3c, 0x76, 0x23, 0x29, 0x51, +0x0b, 0x0f, 0x28, 0x0b, 0x0e, 0x27, 0x0b, 0x0f, 0x29, 0x0c, 0x10, 0x2a, +0x84, 0x82, 0x17, 0xde, 0xdb, 0x1d, 0xc7, 0xc5, 0x18, 0xde, 0xd7, 0x1d, +0xe1, 0xda, 0x26, 0xdb, 0xd4, 0x1c, 0x9f, 0x9c, 0x18, 0x2f, 0x38, 0x6f, +0x44, 0x50, 0x9d, 0x53, 0x63, 0xcc, 0x55, 0x65, 0xda, 0x4e, 0x5e, 0xbe, +0x3e, 0x4b, 0x95, 0x26, 0x2f, 0x64, 0x16, 0x1d, 0x4b, 0x72, 0x74, 0x2e, +0xe0, 0xde, 0x25, 0xdf, 0xd8, 0x20, 0xce, 0xc7, 0x19, 0xdf, 0xd8, 0x20, +0xe1, 0xda, 0x26, 0xdb, 0xd4, 0x1c, 0x7a, 0x7d, 0x44, 0x29, 0x34, 0x7d, +0x2d, 0x39, 0x86, 0x31, 0x3d, 0x8e, 0x40, 0x4d, 0xa2, 0x55, 0x62, 0xbc, +0x70, 0x7e, 0xdb, 0x66, 0x74, 0xd3, 0x5a, 0x69, 0xca, 0x51, 0x60, 0xc2, +0x4c, 0x5b, 0xbc, 0x46, 0x55, 0xb4, 0x43, 0x52, 0xae, 0x40, 0x4e, 0xa7, +0x4e, 0x59, 0x8e, 0xe3, 0xdd, 0x30, 0xdf, 0xd8, 0x20, 0xe0, 0xd9, 0x23, +0xdf, 0xd9, 0x22, 0xe3, 0xdd, 0x2e, 0xe1, 0xdb, 0x2a, 0x8e, 0x8e, 0x31, +0x20, 0x28, 0x60, 0x1e, 0x26, 0x5a, 0x1d, 0x25, 0x57, 0x1c, 0x23, 0x53, +0x1a, 0x21, 0x4f, 0x19, 0x20, 0x4b, 0x18, 0x1e, 0x48, 0x2e, 0x38, 0x6e, +0x4e, 0x5c, 0xb4, 0x5b, 0x6a, 0xde, 0x94, 0x99, 0x7f, 0xde, 0xdb, 0x1d, +0xde, 0xd7, 0x1d, 0xd9, 0xd2, 0x1c, 0xde, 0xd8, 0x1f, 0xdb, 0xd4, 0x1c, +0x52, 0x60, 0xe0, 0x57, 0x63, 0xdb, 0x95, 0x99, 0x7a, 0xcf, 0xc9, 0x1a, +0xd7, 0xd5, 0x1c, 0xc4, 0xc1, 0x32, 0x4f, 0x5a, 0xc5, 0x4d, 0x58, 0xc1, +0x4a, 0x55, 0xbd, 0x48, 0x53, 0xb9, 0x47, 0x52, 0xb6, 0x46, 0x4f, 0xb2, +0x43, 0x4d, 0xaf, 0x41, 0x4b, 0xac, 0x40, 0x49, 0xa8, 0x3e, 0x47, 0xa5, +0x61, 0x66, 0x7f, 0xe0, 0xde, 0x25, 0xdf, 0xd9, 0x22, 0xe2, 0xe0, 0x2d, +0xe4, 0xe2, 0x35, 0xe6, 0xdf, 0x37, 0xaa, 0xa8, 0x35, 0x32, 0x3b, 0x90, +0x32, 0x39, 0x8e, 0x31, 0x38, 0x8c, 0x30, 0x37, 0x89, 0x30, 0x36, 0x87, +0x2f, 0x36, 0x86, 0x2e, 0x35, 0x83, 0x6a, 0x6d, 0x58, 0xde, 0xd8, 0x1f, +0xdf, 0xd9, 0x22, 0xe1, 0xdf, 0x2a, 0xd5, 0xcf, 0x1c, 0xcb, 0xc4, 0x18, +0xbb, 0xb7, 0x20, 0x28, 0x2f, 0x75, 0x28, 0x2f, 0x73, 0x28, 0x2f, 0x72, +0x28, 0x2e, 0x70, 0x28, 0x2d, 0x6f, 0x26, 0x2c, 0x6e, 0x26, 0x2c, 0x6d, +0x25, 0x2b, 0x6b, 0x25, 0x2a, 0x6a, 0x25, 0x2a, 0x69, 0x24, 0x29, 0x67, +0x23, 0x29, 0x66, 0x23, 0x28, 0x65, 0x23, 0x28, 0x64, 0x22, 0x27, 0x63, +0x21, 0x26, 0x61, 0x21, 0x26, 0x60, 0x21, 0x25, 0x5f, 0x20, 0x24, 0x5e, +0x1f, 0x23, 0x5d, 0x1e, 0x23, 0x5c, 0xce, 0xc7, 0x19, 0xdf, 0xd8, 0x20, +0xe1, 0xda, 0x26, 0xdb, 0xd4, 0x1c, 0xdf, 0xd9, 0x22, 0x5e, 0x5f, 0x3b, +0x8a, 0x89, 0x2a, 0xd7, 0xd0, 0x1c, 0xce, 0xc9, 0x0f, 0x2e, 0x31, 0x4a, +0x18, 0x1c, 0x52, 0x17, 0x1c, 0x51, 0x17, 0x1c, 0x51, 0x16, 0x1b, 0x50, +0xa0, 0x9d, 0x1f, 0xe0, 0xd9, 0x23, 0xdc, 0xda, 0x1d, 0xd2, 0xcc, 0x1b, +0xe1, 0xda, 0x26, 0xa0, 0x9d, 0x1e, 0x14, 0x18, 0x4b, 0x14, 0x18, 0x4a, +0xa0, 0x9c, 0x1d, 0xe3, 0xdd, 0x2e, 0xe1, 0xdb, 0x2a, 0x59, 0x59, 0x32, +0x13, 0x16, 0x47, 0x13, 0x16, 0x47, 0x12, 0x15, 0x45, 0x12, 0x15, 0x45, +0x12, 0x14, 0x45, 0x11, 0x14, 0x44, 0x11, 0x14, 0x44, 0x11, 0x14, 0x43, +0x10, 0x13, 0x42, 0x10, 0x13, 0x41, 0x10, 0x13, 0x41, 0x10, 0x12, 0x40, +0x10, 0x12, 0x40, 0x10, 0x12, 0x3f, 0x10, 0x12, 0x3f, 0x0f, 0x12, 0x3f, +0x0f, 0x11, 0x3e, 0x0f, 0x11, 0x3e, 0x0f, 0x10, 0x37, 0x01, 0x01, 0x05, +0x13, 0x16, 0x48, 0x27, 0x2d, 0x93, 0x29, 0x2f, 0x99, 0x23, 0x28, 0x82, +0x1f, 0x24, 0x79, 0x1f, 0x25, 0x7b, 0x20, 0x25, 0x7d, 0x21, 0x26, 0x7f, +0x21, 0x28, 0x81, 0x22, 0x29, 0x82, 0x23, 0x2a, 0x84, 0x25, 0x2c, 0x87, +0x26, 0x2d, 0x89, 0x28, 0x2e, 0x8a, 0x28, 0x30, 0x8d, 0x2a, 0x32, 0x8f, +0x2d, 0x34, 0x91, 0xbc, 0xb9, 0x26, 0xe0, 0xda, 0x25, 0xc0, 0xba, 0x15, +0xe2, 0xdc, 0x2b, 0xe2, 0xdc, 0x2b, 0xe1, 0xda, 0x26, 0xdf, 0xd8, 0x20, +0x8b, 0x8d, 0x60, 0x40, 0x4a, 0x99, 0x37, 0x40, 0x81, 0x30, 0x37, 0x6b, +0x21, 0x27, 0x4e, 0x0b, 0x0f, 0x27, 0x09, 0x0d, 0x23, 0x09, 0x0d, 0x24, +0x0a, 0x0e, 0x26, 0x0a, 0x0e, 0x27, 0x0b, 0x0f, 0x28, 0x0b, 0x0f, 0x29, +0x9d, 0x9a, 0x13, 0xce, 0xcc, 0x19, 0xdf, 0xd8, 0x20, 0xdc, 0xda, 0x1d, +0xdf, 0xd8, 0x20, 0xde, 0xdb, 0x1d, 0x93, 0x98, 0x7e, 0x4a, 0x59, 0xdd, +0x4a, 0x59, 0xdc, 0x4f, 0x5f, 0xdb, 0x54, 0x65, 0xda, 0x4c, 0x5b, 0xba, +0x31, 0x3b, 0x77, 0x14, 0x1b, 0x45, 0x15, 0x1c, 0x49, 0x2c, 0x32, 0x44, +0xdd, 0xd6, 0x1c, 0xdb, 0xd4, 0x1c, 0xdc, 0xda, 0x1d, 0xc7, 0xc5, 0x18, +0xc3, 0xbd, 0x16, 0xe1, 0xdb, 0x28, 0xcf, 0xca, 0x12, 0x26, 0x30, 0x75, +0x29, 0x34, 0x7c, 0x31, 0x3d, 0x88, 0x3e, 0x4a, 0x99, 0x50, 0x5c, 0xae, +0x5b, 0x68, 0xbc, 0x54, 0x61, 0xb7, 0x4b, 0x59, 0xb0, 0x45, 0x53, 0xab, +0x41, 0x4e, 0xa6, 0x3c, 0x49, 0x9f, 0x3a, 0x47, 0x9c, 0x38, 0x44, 0x96, +0xab, 0xaa, 0x34, 0xdf, 0xd8, 0x20, 0xd7, 0xd5, 0x1c, 0xd7, 0xd5, 0x1c, +0xe0, 0xde, 0x25, 0xe4, 0xe2, 0x33, 0xcf, 0xca, 0x11, 0x20, 0x29, 0x61, +0x1e, 0x26, 0x5c, 0x1c, 0x24, 0x57, 0x1a, 0x22, 0x53, 0x19, 0x20, 0x4f, +0x18, 0x1f, 0x4c, 0x17, 0x1e, 0x48, 0x16, 0x1d, 0x45, 0x16, 0x1c, 0x43, +0x32, 0x3c, 0x75, 0x4f, 0x5d, 0xb8, 0x86, 0x8f, 0x97, 0xd7, 0xd5, 0x1c, +0xc7, 0xc1, 0x18, 0xdf, 0xd9, 0x22, 0xd7, 0xd5, 0x1c, 0xe0, 0xde, 0x25, +0x78, 0x7d, 0x96, 0x66, 0x6f, 0xab, 0xde, 0xd7, 0x1d, 0xcb, 0xc4, 0x18, +0xd4, 0xcf, 0x1d, 0x5c, 0x66, 0xb2, 0x4b, 0x56, 0xc3, 0x4a, 0x55, 0xc0, +0x49, 0x52, 0xbc, 0x46, 0x51, 0xb8, 0x44, 0x4f, 0xb4, 0x43, 0x4d, 0xb1, +0x42, 0x4b, 0xae, 0x40, 0x4a, 0xab, 0x40, 0x48, 0xa8, 0x3d, 0x47, 0xa5, +0x74, 0x77, 0x6e, 0xdc, 0xda, 0x1d, 0xe3, 0xdd, 0x30, 0xe4, 0xde, 0x31, +0xe3, 0xe1, 0x32, 0xe2, 0xe0, 0x2d, 0xaa, 0xa8, 0x35, 0x32, 0x3a, 0x8f, +0x31, 0x39, 0x8e, 0x31, 0x37, 0x8b, 0x2f, 0x36, 0x89, 0x2e, 0x35, 0x87, +0x2c, 0x34, 0x85, 0x2c, 0x33, 0x83, 0x54, 0x57, 0x66, 0xe1, 0xdf, 0x2a, +0xe0, 0xde, 0x25, 0xdb, 0xd4, 0x1c, 0xdf, 0xd9, 0x22, 0xde, 0xd7, 0x1d, +0xd5, 0xcf, 0x1c, 0x28, 0x2e, 0x75, 0x27, 0x2d, 0x73, 0x27, 0x2c, 0x72, +0x26, 0x2c, 0x70, 0x26, 0x2c, 0x6f, 0x25, 0x2a, 0x6e, 0x24, 0x2a, 0x6d, +0x24, 0x29, 0x6b, 0x23, 0x29, 0x6a, 0x23, 0x28, 0x69, 0x23, 0x27, 0x67, +0x22, 0x27, 0x66, 0x22, 0x27, 0x65, 0x21, 0x26, 0x64, 0x20, 0x25, 0x62, +0x20, 0x25, 0x61, 0x20, 0x25, 0x60, 0x20, 0x24, 0x5f, 0x1f, 0x24, 0x5e, +0x1f, 0x23, 0x5d, 0x1e, 0x23, 0x5c, 0xdc, 0xda, 0x1d, 0xc7, 0xc5, 0x18, +0xc3, 0xbd, 0x16, 0xe1, 0xdb, 0x28, 0xe1, 0xda, 0x26, 0x75, 0x74, 0x32, +0xe3, 0xdd, 0x30, 0xe3, 0xdd, 0x30, 0x74, 0x74, 0x31, 0x1a, 0x1e, 0x53, +0x19, 0x1d, 0x52, 0x18, 0x1c, 0x51, 0x18, 0x1c, 0x51, 0x18, 0x1c, 0x50, +0xa1, 0x9d, 0x1f, 0xe4, 0xe2, 0x35, 0xe0, 0xde, 0x25, 0xd9, 0xd2, 0x1c, +0xe4, 0xde, 0x33, 0xa0, 0x9d, 0x1e, 0x15, 0x19, 0x4b, 0x5a, 0x5b, 0x33, +0xe0, 0xde, 0x25, 0xe4, 0xe2, 0x33, 0xa0, 0x9c, 0x1c, 0x13, 0x17, 0x48, +0x13, 0x16, 0x47, 0x13, 0x16, 0x47, 0x12, 0x16, 0x45, 0x12, 0x15, 0x45, +0x12, 0x15, 0x45, 0x12, 0x15, 0x44, 0x12, 0x15, 0x44, 0x11, 0x14, 0x43, +0x10, 0x14, 0x42, 0x10, 0x13, 0x41, 0x10, 0x13, 0x41, 0x10, 0x13, 0x40, +0x10, 0x13, 0x40, 0x10, 0x12, 0x3f, 0x10, 0x12, 0x3f, 0x0f, 0x12, 0x3e, +0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3e, 0x0f, 0x10, 0x37, 0x01, 0x01, 0x05, +0x13, 0x16, 0x48, 0x27, 0x2d, 0x93, 0x28, 0x2e, 0x98, 0x23, 0x28, 0x82, +0x20, 0x26, 0x79, 0x20, 0x27, 0x7b, 0x21, 0x28, 0x7d, 0x22, 0x29, 0x7f, +0x24, 0x2a, 0x81, 0x25, 0x2b, 0x82, 0x26, 0x2c, 0x84, 0x28, 0x2e, 0x86, +0x29, 0x30, 0x88, 0x2b, 0x32, 0x8a, 0x2d, 0x34, 0x8c, 0x2f, 0x37, 0x8f, +0x31, 0x38, 0x91, 0x59, 0x5f, 0x74, 0xdd, 0xd6, 0x1c, 0xe6, 0xdf, 0x37, +0xe6, 0xe4, 0x39, 0xde, 0xd8, 0x1f, 0xdf, 0xd9, 0x22, 0xe0, 0xd9, 0x23, +0xd1, 0xcb, 0x12, 0x36, 0x3a, 0x44, 0x10, 0x14, 0x2d, 0x08, 0x0b, 0x20, +0x08, 0x0c, 0x21, 0x09, 0x0c, 0x22, 0x09, 0x0d, 0x23, 0x09, 0x0d, 0x24, +0x0a, 0x0d, 0x25, 0x0c, 0x11, 0x2c, 0x23, 0x29, 0x52, 0x36, 0x3f, 0x7b, +0xd1, 0xcf, 0x1a, 0xd7, 0xd0, 0x1c, 0xd7, 0xd5, 0x1c, 0xde, 0xd7, 0x1d, +0xdd, 0xd6, 0x1c, 0xe2, 0xdc, 0x2b, 0x78, 0x7f, 0x97, 0x46, 0x54, 0xdd, +0x4a, 0x59, 0xdc, 0x50, 0x60, 0xdb, 0x53, 0x63, 0xcf, 0x3e, 0x4a, 0x93, +0x21, 0x2a, 0x5a, 0x22, 0x2a, 0x5c, 0x25, 0x2f, 0x64, 0x37, 0x44, 0x89, +0x9f, 0xa3, 0x55, 0xe1, 0xda, 0x26, 0xcb, 0xc4, 0x18, 0xd9, 0xd2, 0x1c, +0xce, 0xc7, 0x19, 0xde, 0xd8, 0x1f, 0xcc, 0xc6, 0x19, 0x79, 0x7b, 0x40, +0x27, 0x31, 0x74, 0x30, 0x3b, 0x81, 0x3c, 0x47, 0x90, 0x4b, 0x56, 0xa1, +0x4c, 0x58, 0xa5, 0x47, 0x53, 0xa2, 0x3f, 0x4b, 0x9b, 0x3b, 0x48, 0x98, +0x39, 0x45, 0x94, 0x35, 0x41, 0x90, 0x33, 0x3f, 0x8c, 0x81, 0x84, 0x4e, +0xd7, 0xd0, 0x1c, 0xd4, 0xcd, 0x1b, 0xe2, 0xe0, 0x2d, 0xe3, 0xdd, 0x30, +0xe3, 0xdd, 0x30, 0xcf, 0xca, 0x11, 0x36, 0x3c, 0x58, 0x1e, 0x27, 0x5c, +0x1d, 0x24, 0x58, 0x33, 0x3f, 0x7e, 0x19, 0x20, 0x50, 0x17, 0x1e, 0x4c, +0x16, 0x1d, 0x48, 0x16, 0x1c, 0x46, 0x15, 0x1b, 0x43, 0x14, 0x1a, 0x41, +0x13, 0x19, 0x3e, 0x33, 0x3c, 0x76, 0x83, 0x8b, 0x83, 0xd7, 0xd5, 0x1c, +0xce, 0xc7, 0x19, 0xd4, 0xcd, 0x1b, 0xdb, 0xd4, 0x1c, 0xcf, 0xc9, 0x1a, +0x86, 0x8a, 0x7d, 0xd2, 0xcd, 0x1e, 0xde, 0xdb, 0x1d, 0xdc, 0xda, 0x1d, +0x63, 0x69, 0x9f, 0x40, 0x4b, 0xc6, 0x43, 0x4d, 0xc3, 0x43, 0x4e, 0xbf, +0x45, 0x50, 0xbb, 0x44, 0x4e, 0xb8, 0x43, 0x4c, 0xb4, 0x41, 0x4b, 0xb0, +0x40, 0x4a, 0xad, 0x3f, 0x47, 0xaa, 0x3d, 0x47, 0xa7, 0x3c, 0x44, 0xa4, +0xad, 0xab, 0x3a, 0xe5, 0xdf, 0x34, 0xe1, 0xdb, 0x28, 0xdb, 0xd4, 0x1c, +0xe3, 0xdd, 0x30, 0xe0, 0xde, 0x25, 0x6e, 0x71, 0x63, 0x32, 0x3a, 0x8f, +0x31, 0x38, 0x8d, 0x30, 0x36, 0x8b, 0x2e, 0x35, 0x88, 0x2e, 0x35, 0x87, +0x2c, 0x34, 0x85, 0x2c, 0x33, 0x83, 0x2a, 0x32, 0x81, 0xdc, 0xda, 0x1d, +0xde, 0xdc, 0x1f, 0xde, 0xd8, 0x1f, 0xe0, 0xde, 0x25, 0xe2, 0xe0, 0x2d, +0xdd, 0xd6, 0x1c, 0x66, 0x67, 0x50, 0x25, 0x2b, 0x73, 0x25, 0x2a, 0x71, +0x25, 0x2a, 0x70, 0x24, 0x29, 0x6f, 0x24, 0x29, 0x6d, 0x23, 0x28, 0x6c, +0x23, 0x28, 0x6b, 0x22, 0x27, 0x6a, 0x22, 0x27, 0x68, 0x21, 0x26, 0x67, +0x36, 0x3a, 0x5b, 0xb9, 0xb5, 0x1c, 0x20, 0x24, 0x63, 0x1f, 0x24, 0x62, +0x1f, 0x24, 0x61, 0x1f, 0x23, 0x60, 0x1f, 0x23, 0x5f, 0x1e, 0x22, 0x5e, +0x1e, 0x22, 0x5d, 0x1e, 0x22, 0x5c, 0xcb, 0xc4, 0x18, 0xd9, 0xd2, 0x1c, +0xce, 0xc7, 0x19, 0xde, 0xd8, 0x1f, 0xcc, 0xc6, 0x19, 0xe2, 0xe0, 0x2d, +0xe6, 0xe4, 0x3b, 0xce, 0xc9, 0x0f, 0x1a, 0x1e, 0x54, 0x1a, 0x1e, 0x53, +0x1a, 0x1e, 0x52, 0x19, 0x1d, 0x51, 0x19, 0x1d, 0x51, 0x19, 0x1d, 0x50, +0xa1, 0x9e, 0x1f, 0xde, 0xdc, 0x1f, 0xdb, 0xd4, 0x1c, 0xe0, 0xde, 0x25, +0xd7, 0xd0, 0x1c, 0xa0, 0x9d, 0x1e, 0x2c, 0x2f, 0x43, 0xce, 0xc8, 0x0e, +0xe3, 0xdd, 0x30, 0xce, 0xc8, 0x0e, 0x14, 0x18, 0x48, 0x14, 0x18, 0x48, +0x13, 0x17, 0x47, 0x13, 0x17, 0x47, 0x13, 0x16, 0x45, 0x13, 0x16, 0x45, +0x12, 0x16, 0x45, 0x12, 0x15, 0x44, 0x12, 0x15, 0x44, 0x12, 0x15, 0x43, +0x11, 0x15, 0x42, 0x11, 0x14, 0x41, 0x11, 0x14, 0x41, 0x10, 0x14, 0x40, +0x10, 0x14, 0x40, 0x10, 0x13, 0x3f, 0x10, 0x13, 0x3f, 0x10, 0x13, 0x3e, +0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3e, 0x0f, 0x10, 0x37, 0x01, 0x01, 0x05, +0x13, 0x17, 0x48, 0x28, 0x2f, 0x92, 0x2a, 0x32, 0x98, 0x25, 0x2b, 0x82, +0x22, 0x28, 0x79, 0x23, 0x29, 0x7a, 0x24, 0x2a, 0x7c, 0x26, 0x2b, 0x7e, +0x27, 0x2d, 0x80, 0x28, 0x2f, 0x81, 0x2a, 0x30, 0x83, 0x2c, 0x32, 0x86, +0x2d, 0x34, 0x88, 0x2f, 0x36, 0x8a, 0x32, 0x39, 0x8c, 0x33, 0x3b, 0x8e, +0x37, 0x3f, 0x90, 0x39, 0x41, 0x93, 0xbf, 0xbc, 0x25, 0xe4, 0xde, 0x31, +0xe4, 0xde, 0x31, 0xe4, 0xe2, 0x35, 0xe6, 0xdf, 0x37, 0xe2, 0xdc, 0x2b, +0xdc, 0xda, 0x1d, 0x9b, 0x98, 0x0f, 0x08, 0x0b, 0x1f, 0x08, 0x0b, 0x20, +0x08, 0x0c, 0x21, 0x10, 0x14, 0x30, 0x1f, 0x25, 0x4b, 0x2f, 0x36, 0x69, +0x3a, 0x43, 0x85, 0x46, 0x51, 0xa6, 0x4f, 0x5b, 0xc7, 0x4b, 0x57, 0xcb, +0xcc, 0xc6, 0x19, 0xdd, 0xd6, 0x1c, 0xcc, 0xc6, 0x19, 0xd9, 0xd2, 0x1c, +0xe0, 0xde, 0x25, 0xe0, 0xde, 0x25, 0x53, 0x5d, 0xc7, 0x46, 0x54, 0xde, +0x4d, 0x5c, 0xdc, 0x56, 0x66, 0xdc, 0x47, 0x54, 0xa9, 0x46, 0x53, 0xa6, +0x46, 0x54, 0xa9, 0x4b, 0x5b, 0xb8, 0x52, 0x63, 0xd5, 0x4e, 0x61, 0xd3, +0x15, 0x1c, 0x4a, 0xce, 0xc8, 0x0e, 0xdf, 0xd9, 0x22, 0xe0, 0xde, 0x25, +0xe2, 0xe0, 0x2d, 0xd2, 0xcc, 0x1b, 0xd2, 0xcc, 0x1b, 0xe6, 0xe0, 0x39, +0x3b, 0x44, 0x64, 0x2f, 0x39, 0x7a, 0x39, 0x43, 0x87, 0x45, 0x50, 0x95, +0x41, 0x4c, 0x93, 0x3c, 0x47, 0x8f, 0x37, 0x42, 0x8b, 0x34, 0x3f, 0x89, +0x32, 0x3d, 0x86, 0x2f, 0x3a, 0x82, 0x6a, 0x6f, 0x57, 0xdf, 0xd8, 0x20, +0xcf, 0xc9, 0x1a, 0xdf, 0xd9, 0x22, 0xdd, 0xd6, 0x1c, 0xd4, 0xcd, 0x1b, +0xcf, 0xca, 0x11, 0x35, 0x3c, 0x57, 0x24, 0x2d, 0x66, 0x1d, 0x25, 0x59, +0x1b, 0x22, 0x54, 0x33, 0x3f, 0x7f, 0x49, 0x59, 0xb1, 0x50, 0x62, 0xc6, +0x15, 0x1c, 0x46, 0x14, 0x1b, 0x43, 0x14, 0x1a, 0x41, 0x13, 0x19, 0x3e, +0x12, 0x18, 0x3c, 0x22, 0x29, 0x55, 0x65, 0x6c, 0x75, 0xd5, 0xcf, 0x1c, +0xc9, 0xc3, 0x18, 0xdb, 0xd4, 0x1c, 0xe0, 0xd9, 0x23, 0xc9, 0xc3, 0x18, +0xc9, 0xc7, 0x18, 0xd9, 0xd2, 0x1c, 0xde, 0xd7, 0x1d, 0x71, 0x76, 0x8b, +0x36, 0x3f, 0xc9, 0x36, 0x40, 0xc5, 0x39, 0x42, 0xc1, 0x39, 0x44, 0xbd, +0x3b, 0x45, 0xba, 0x3b, 0x46, 0xb6, 0x3d, 0x47, 0xb3, 0x3e, 0x47, 0xb0, +0x3e, 0x47, 0xac, 0x3c, 0x46, 0xa9, 0x3c, 0x45, 0xa6, 0x3a, 0x42, 0xa3, +0xac, 0xaa, 0x3a, 0xe2, 0xe0, 0x2b, 0xdf, 0xd8, 0x20, 0xe1, 0xdf, 0x2a, +0xe2, 0xdc, 0x2b, 0xbc, 0xb6, 0x15, 0x6e, 0x71, 0x63, 0x31, 0x39, 0x8e, +0x31, 0x38, 0x8d, 0x30, 0x36, 0x8a, 0x2e, 0x35, 0x88, 0x2d, 0x35, 0x87, +0x2d, 0x34, 0x84, 0x2b, 0x32, 0x82, 0x2a, 0x32, 0x80, 0xbb, 0xb7, 0x21, +0xde, 0xd8, 0x1f, 0xe1, 0xdb, 0x2a, 0xe2, 0xdc, 0x2b, 0xde, 0xd8, 0x1f, +0xdf, 0xd8, 0x20, 0xd0, 0xca, 0x13, 0x24, 0x2a, 0x73, 0x24, 0x29, 0x71, +0x23, 0x29, 0x70, 0x23, 0x29, 0x6f, 0x22, 0x28, 0x6d, 0x21, 0x27, 0x6c, +0x21, 0x27, 0x6b, 0x21, 0x26, 0x69, 0x20, 0x26, 0x68, 0x77, 0x77, 0x3c, +0xe0, 0xda, 0x25, 0xdf, 0xd8, 0x20, 0x1f, 0x24, 0x63, 0x1e, 0x24, 0x62, +0x1e, 0x23, 0x61, 0x1e, 0x22, 0x60, 0x1e, 0x22, 0x5f, 0x1d, 0x22, 0x5e, +0x1d, 0x21, 0x5d, 0x1d, 0x21, 0x5c, 0xdf, 0xd9, 0x22, 0xe0, 0xde, 0x25, +0xe2, 0xe0, 0x2d, 0xd2, 0xcc, 0x1b, 0xd2, 0xcc, 0x1b, 0xe6, 0xe0, 0x39, +0xde, 0xdb, 0x1d, 0x73, 0x74, 0x31, 0x19, 0x1e, 0x54, 0x19, 0x1d, 0x53, +0x19, 0x1d, 0x52, 0x19, 0x1d, 0x51, 0x18, 0x1c, 0x50, 0x18, 0x1c, 0x50, +0x73, 0x72, 0x2f, 0xd4, 0xcd, 0x1b, 0xe3, 0xdd, 0x30, 0xdf, 0xd8, 0x20, +0xcf, 0xc9, 0x1a, 0xdf, 0xd9, 0x22, 0xb7, 0xb2, 0x16, 0xd4, 0xcd, 0x1b, +0xd7, 0xd0, 0x1c, 0x2b, 0x2e, 0x41, 0x15, 0x19, 0x48, 0x15, 0x19, 0x48, +0x15, 0x18, 0x47, 0x14, 0x18, 0x47, 0x14, 0x17, 0x45, 0x14, 0x17, 0x45, +0x13, 0x17, 0x45, 0x13, 0x16, 0x44, 0x13, 0x16, 0x44, 0x12, 0x16, 0x43, +0x12, 0x15, 0x42, 0x12, 0x15, 0x41, 0x11, 0x15, 0x41, 0x11, 0x14, 0x40, +0x11, 0x14, 0x40, 0x11, 0x14, 0x3f, 0x10, 0x14, 0x3f, 0x10, 0x13, 0x3e, +0x10, 0x13, 0x3e, 0x10, 0x13, 0x3d, 0x0f, 0x11, 0x37, 0x01, 0x01, 0x05, +0x14, 0x18, 0x48, 0x29, 0x32, 0x92, 0x2d, 0x35, 0x98, 0x27, 0x2d, 0x81, +0x25, 0x2a, 0x78, 0x26, 0x2c, 0x7a, 0x26, 0x2d, 0x7c, 0x28, 0x2f, 0x7e, +0x2a, 0x30, 0x80, 0x2c, 0x32, 0x81, 0x2d, 0x35, 0x83, 0x2f, 0x36, 0x85, +0x32, 0x38, 0x87, 0x34, 0x3c, 0x89, 0x37, 0x3f, 0x8b, 0x38, 0x40, 0x89, +0x34, 0x3c, 0x7c, 0x30, 0x36, 0x6f, 0x3d, 0x42, 0x54, 0xcf, 0xca, 0x0e, +0xe0, 0xda, 0x25, 0xe3, 0xe1, 0x32, 0xe6, 0xe0, 0x39, 0xe2, 0xe0, 0x2d, +0xdd, 0xd6, 0x1c, 0xe0, 0xde, 0x25, 0xcf, 0xc9, 0x0e, 0x3d, 0x42, 0x53, +0x35, 0x3c, 0x77, 0x3d, 0x47, 0x90, 0x46, 0x51, 0xab, 0x49, 0x55, 0xba, +0x46, 0x51, 0xbe, 0x42, 0x4d, 0xc1, 0x3f, 0x49, 0xc6, 0x74, 0x79, 0x89, +0xe0, 0xde, 0x25, 0xdd, 0xd6, 0x1c, 0xd1, 0xca, 0x1a, 0xce, 0xc7, 0x19, +0xd9, 0xd2, 0x1c, 0xde, 0xdb, 0x1d, 0x44, 0x52, 0xdf, 0x4b, 0x59, 0xde, +0x54, 0x63, 0xdd, 0x56, 0x65, 0xdc, 0x55, 0x64, 0xdb, 0x53, 0x64, 0xd9, +0x4d, 0x5d, 0xd8, 0x47, 0x57, 0xd7, 0x51, 0x62, 0xd5, 0x13, 0x1a, 0x44, +0x14, 0x1b, 0x47, 0x2b, 0x31, 0x42, 0xe0, 0xda, 0x25, 0xe3, 0xdd, 0x30, +0xdf, 0xd8, 0x20, 0xe0, 0xda, 0x25, 0xe6, 0xdf, 0x37, 0xe2, 0xe0, 0x2d, +0xd0, 0xca, 0x12, 0x6a, 0x6f, 0x4f, 0x36, 0x40, 0x7f, 0x3b, 0x45, 0x86, +0x38, 0x42, 0x84, 0x34, 0x3e, 0x81, 0x30, 0x3b, 0x7e, 0x2f, 0x39, 0x7c, +0x2c, 0x36, 0x7a, 0x91, 0x92, 0x39, 0xdf, 0xd8, 0x20, 0xe0, 0xde, 0x25, +0xe4, 0xde, 0x33, 0xdb, 0xd4, 0x1c, 0xd7, 0xd5, 0x1c, 0xcf, 0xca, 0x11, +0x35, 0x3c, 0x56, 0x1e, 0x26, 0x5c, 0x1d, 0x24, 0x58, 0x42, 0x51, 0xa1, +0x19, 0x21, 0x50, 0x18, 0x1f, 0x4e, 0x47, 0x56, 0xab, 0x54, 0x65, 0xd7, +0x4e, 0x5f, 0xd8, 0x43, 0x50, 0x9e, 0x12, 0x18, 0x3e, 0x12, 0x17, 0x3c, +0x11, 0x16, 0x3a, 0x10, 0x16, 0x38, 0x35, 0x3f, 0x7a, 0xd2, 0xcc, 0x1b, +0xd9, 0xd2, 0x1c, 0xe1, 0xdb, 0x28, 0xd7, 0xd5, 0x1c, 0xbb, 0xb5, 0x14, +0xd1, 0xcf, 0x1a, 0xde, 0xd7, 0x1d, 0x99, 0x9a, 0x60, 0x38, 0x43, 0xcb, +0x37, 0x41, 0xc7, 0x35, 0x3f, 0xc3, 0x33, 0x3d, 0xbf, 0x31, 0x3b, 0xbc, +0x33, 0x3c, 0xb8, 0x35, 0x3d, 0xb5, 0x35, 0x3e, 0xb2, 0x36, 0x3f, 0xae, +0x37, 0x3f, 0xab, 0x37, 0x40, 0xa8, 0x38, 0x41, 0xa5, 0x39, 0x42, 0xa2, +0xdf, 0xd8, 0x20, 0xd2, 0xcc, 0x1b, 0xe2, 0xdc, 0x2b, 0xd4, 0xcd, 0x1b, +0xe2, 0xe0, 0x2d, 0xe6, 0xe0, 0x3b, 0xbd, 0xb9, 0x25, 0x31, 0x38, 0x8e, +0x30, 0x36, 0x8c, 0x2f, 0x35, 0x8a, 0x2d, 0x35, 0x87, 0x2d, 0x34, 0x86, +0x2c, 0x33, 0x84, 0x2b, 0x32, 0x82, 0x2a, 0x32, 0x80, 0x7d, 0x7d, 0x49, +0xdf, 0xd8, 0x20, 0xe0, 0xde, 0x25, 0xe1, 0xda, 0x26, 0xdf, 0xd8, 0x20, +0xde, 0xdc, 0x1f, 0xde, 0xdb, 0x1d, 0xba, 0xb6, 0x1e, 0x39, 0x3c, 0x65, +0x23, 0x29, 0x6f, 0x22, 0x28, 0x6f, 0x22, 0x28, 0x6d, 0x21, 0x27, 0x6c, +0x21, 0x26, 0x6a, 0x77, 0x77, 0x3d, 0xcf, 0xc9, 0x12, 0xd9, 0xd2, 0x1c, +0xdb, 0xd4, 0x1c, 0xd5, 0xcf, 0x1c, 0x1d, 0x23, 0x63, 0x1d, 0x23, 0x62, +0x1d, 0x22, 0x61, 0x1c, 0x22, 0x60, 0x1d, 0x22, 0x5f, 0x1c, 0x21, 0x5e, +0x1c, 0x21, 0x5d, 0x1c, 0x21, 0x5c, 0xe0, 0xda, 0x25, 0xe3, 0xdd, 0x30, +0xdf, 0xd8, 0x20, 0xe0, 0xda, 0x25, 0xe6, 0xdf, 0x37, 0xe2, 0xe0, 0x2d, +0xb8, 0xb3, 0x18, 0x19, 0x1e, 0x54, 0x19, 0x1d, 0x53, 0x19, 0x1d, 0x53, +0x18, 0x1c, 0x52, 0x18, 0x1c, 0x51, 0x18, 0x1c, 0x50, 0x18, 0x1c, 0x50, +0x5c, 0x5c, 0x37, 0xcf, 0xc9, 0x1a, 0xdf, 0xd8, 0x20, 0xe0, 0xde, 0x25, +0xe4, 0xde, 0x33, 0xdb, 0xd4, 0x1c, 0xd7, 0xd5, 0x1c, 0xdf, 0xd8, 0x20, +0x5a, 0x5b, 0x33, 0x15, 0x19, 0x49, 0x15, 0x19, 0x48, 0x15, 0x18, 0x48, +0x14, 0x18, 0x47, 0x14, 0x18, 0x46, 0x14, 0x18, 0x45, 0x14, 0x17, 0x45, +0x14, 0x17, 0x45, 0x14, 0x17, 0x44, 0x14, 0x17, 0x44, 0x13, 0x17, 0x43, +0x13, 0x16, 0x42, 0x12, 0x16, 0x41, 0x12, 0x16, 0x41, 0x12, 0x15, 0x40, +0x12, 0x15, 0x40, 0x11, 0x15, 0x3f, 0x11, 0x14, 0x3f, 0x11, 0x14, 0x3e, +0x10, 0x14, 0x3e, 0x10, 0x13, 0x3d, 0x0f, 0x11, 0x37, 0x01, 0x01, 0x05, +0x16, 0x19, 0x48, 0x2d, 0x33, 0x92, 0x2f, 0x37, 0x97, 0x29, 0x2f, 0x81, +0x26, 0x2d, 0x78, 0x28, 0x2f, 0x7a, 0x2a, 0x2f, 0x7b, 0x2b, 0x32, 0x7d, +0x2d, 0x34, 0x7f, 0x2f, 0x36, 0x81, 0x32, 0x39, 0x82, 0x35, 0x3c, 0x85, +0x34, 0x3c, 0x80, 0x31, 0x38, 0x75, 0x2d, 0x33, 0x69, 0x29, 0x2f, 0x5e, +0x23, 0x29, 0x50, 0x1b, 0x1f, 0x40, 0x17, 0x1b, 0x37, 0x2a, 0x2c, 0x2b, +0xcd, 0xc8, 0x0b, 0xe6, 0xe0, 0x3b, 0xe0, 0xde, 0x25, 0xe0, 0xde, 0x25, +0xde, 0xd7, 0x1d, 0xe0, 0xde, 0x25, 0xde, 0xd7, 0x1d, 0xdc, 0xda, 0x1d, +0x9d, 0x9d, 0x52, 0x65, 0x6b, 0x8c, 0x3f, 0x49, 0xb6, 0x3b, 0x45, 0xb9, +0x39, 0x43, 0xbc, 0x36, 0x40, 0xc0, 0x33, 0x3d, 0xc4, 0x82, 0x85, 0x71, +0xe4, 0xde, 0x33, 0xe1, 0xda, 0x26, 0xdc, 0xda, 0x1d, 0xd1, 0xcf, 0x1a, +0xde, 0xd8, 0x1f, 0xaf, 0xaf, 0x4f, 0x49, 0x56, 0xdf, 0x4d, 0x5a, 0xde, +0x4c, 0x5b, 0xdd, 0x4b, 0x59, 0xdd, 0x48, 0x57, 0xdc, 0x43, 0x52, 0xdb, +0x3f, 0x4d, 0xd9, 0x54, 0x64, 0xd8, 0x11, 0x18, 0x40, 0x12, 0x18, 0x41, +0x13, 0x19, 0x44, 0x14, 0x1b, 0x47, 0x5b, 0x5d, 0x34, 0xd4, 0xcd, 0x1b, +0xe1, 0xda, 0x26, 0xe5, 0xdf, 0x34, 0xe0, 0xde, 0x25, 0xe3, 0xdd, 0x2e, +0xe6, 0xe0, 0x3b, 0xe0, 0xde, 0x25, 0xbd, 0xba, 0x20, 0x6f, 0x73, 0x53, +0x44, 0x4c, 0x6b, 0x2e, 0x38, 0x76, 0x69, 0x6d, 0x4f, 0x7c, 0x7f, 0x42, +0xd0, 0xcb, 0x12, 0xe0, 0xd9, 0x23, 0xe2, 0xe0, 0x2b, 0xe2, 0xdc, 0x2b, +0xd2, 0xcc, 0x1b, 0xc3, 0xbd, 0x16, 0xb9, 0xb6, 0x1b, 0x34, 0x3b, 0x54, +0x1d, 0x25, 0x5a, 0x1c, 0x24, 0x57, 0x1b, 0x22, 0x53, 0x21, 0x2a, 0x5e, +0x53, 0x65, 0xd0, 0x28, 0x31, 0x67, 0x22, 0x2b, 0x5c, 0x54, 0x66, 0xd3, +0x4d, 0x5e, 0xd9, 0x48, 0x58, 0xda, 0x4e, 0x5d, 0xdb, 0x31, 0x3b, 0x74, +0x10, 0x16, 0x38, 0x10, 0x15, 0x36, 0x19, 0x20, 0x46, 0xd4, 0xcd, 0x1b, +0xe2, 0xdc, 0x2b, 0xde, 0xdb, 0x1d, 0xd7, 0xd0, 0x1c, 0xcb, 0xc4, 0x18, +0xdc, 0xda, 0x1d, 0xb0, 0xae, 0x4a, 0x3f, 0x4a, 0xcd, 0x3c, 0x46, 0xc9, +0x39, 0x43, 0xc5, 0x37, 0x40, 0xc1, 0x34, 0x3e, 0xbe, 0x33, 0x3c, 0xba, +0x31, 0x3b, 0xb7, 0x30, 0x38, 0xb3, 0x2f, 0x38, 0xb0, 0x30, 0x38, 0xad, +0x31, 0x3a, 0xaa, 0x31, 0x3a, 0xa7, 0x33, 0x3a, 0xa4, 0x33, 0x3a, 0xa1, +0xde, 0xd7, 0x1d, 0xd2, 0xcc, 0x1b, 0xd1, 0xca, 0x1a, 0xcc, 0xc6, 0x19, +0xe2, 0xe0, 0x2d, 0xe1, 0xdf, 0x2a, 0xe6, 0xe4, 0x39, 0xa9, 0xa7, 0x33, +0x6c, 0x6e, 0x5f, 0x6b, 0x6d, 0x5d, 0x93, 0x93, 0x40, 0xbc, 0xb8, 0x23, +0x69, 0x6b, 0x59, 0x2a, 0x31, 0x81, 0x2a, 0x31, 0x7f, 0x2a, 0x30, 0x7d, +0xd0, 0xca, 0x14, 0xe0, 0xd9, 0x23, 0xe1, 0xda, 0x26, 0xe1, 0xdf, 0x2a, +0xe2, 0xdc, 0x2b, 0xd7, 0xd0, 0x1c, 0xde, 0xd8, 0x1f, 0xe0, 0xde, 0x25, +0xa5, 0xa2, 0x29, 0xa4, 0xa2, 0x29, 0xa4, 0xa1, 0x28, 0xa4, 0xa1, 0x28, +0xde, 0xd8, 0x1f, 0xe1, 0xdb, 0x28, 0xde, 0xd8, 0x1f, 0xe1, 0xda, 0x26, +0xcf, 0xc9, 0x11, 0x49, 0x4d, 0x4f, 0x1d, 0x23, 0x63, 0x1d, 0x22, 0x62, +0x1c, 0x22, 0x61, 0x1c, 0x21, 0x60, 0x1c, 0x21, 0x5e, 0x1b, 0x21, 0x5d, +0x1b, 0x20, 0x5c, 0x1b, 0x20, 0x5b, 0xce, 0xc9, 0x10, 0xd4, 0xcd, 0x1b, +0xe1, 0xda, 0x26, 0xe5, 0xdf, 0x34, 0xe0, 0xde, 0x25, 0xe3, 0xdd, 0x2e, +0x46, 0x48, 0x43, 0x18, 0x1d, 0x54, 0x18, 0x1c, 0x53, 0x18, 0x1c, 0x53, +0x18, 0x1c, 0x52, 0x18, 0x1c, 0x51, 0x17, 0x1b, 0x50, 0x17, 0x1b, 0x4f, +0x5c, 0x5c, 0x37, 0xe0, 0xd9, 0x23, 0xe2, 0xe0, 0x2b, 0xe2, 0xdc, 0x2b, +0xd2, 0xcc, 0x1b, 0xc3, 0xbd, 0x16, 0xdb, 0xd4, 0x1c, 0x88, 0x86, 0x24, +0x15, 0x18, 0x49, 0x15, 0x18, 0x49, 0x15, 0x18, 0x48, 0x15, 0x18, 0x48, +0x14, 0x18, 0x47, 0x14, 0x17, 0x45, 0x14, 0x17, 0x45, 0x13, 0x17, 0x45, +0x13, 0x17, 0x45, 0x13, 0x16, 0x44, 0x13, 0x16, 0x44, 0x13, 0x16, 0x42, +0x13, 0x16, 0x42, 0x12, 0x16, 0x41, 0x12, 0x16, 0x41, 0x12, 0x15, 0x40, +0x12, 0x15, 0x40, 0x12, 0x15, 0x3f, 0x11, 0x15, 0x3f, 0x11, 0x14, 0x3e, +0x11, 0x14, 0x3e, 0x11, 0x14, 0x3d, 0x10, 0x12, 0x37, 0x01, 0x01, 0x05, +0x17, 0x1a, 0x48, 0x2f, 0x37, 0x90, 0x32, 0x3b, 0x97, 0x2c, 0x32, 0x80, +0x2a, 0x30, 0x77, 0x2c, 0x32, 0x79, 0x2d, 0x34, 0x7b, 0x2f, 0x35, 0x7d, +0x32, 0x39, 0x7f, 0x32, 0x39, 0x7a, 0x30, 0x36, 0x72, 0x2d, 0x32, 0x68, +0x27, 0x2d, 0x5c, 0x23, 0x29, 0x51, 0x23, 0x28, 0x4f, 0x22, 0x27, 0x4a, +0x1e, 0x23, 0x45, 0x1e, 0x23, 0x45, 0x23, 0x29, 0x51, 0x28, 0x2f, 0x5c, +0x41, 0x46, 0x5d, 0xbd, 0xba, 0x20, 0xdd, 0xd6, 0x1c, 0xd7, 0xd0, 0x1c, +0xe3, 0xdd, 0x2e, 0xdf, 0xd9, 0x22, 0xd5, 0xcf, 0x1c, 0xe0, 0xde, 0x25, +0xd1, 0xca, 0x1a, 0xd4, 0xcd, 0x1b, 0xe0, 0xd9, 0x23, 0xbd, 0xba, 0x2e, +0xa9, 0xa8, 0x43, 0xaa, 0xa8, 0x44, 0xcf, 0xc9, 0x1a, 0xe2, 0xe0, 0x2d, +0xe0, 0xde, 0x25, 0xdd, 0xd6, 0x1c, 0xd9, 0xd2, 0x1c, 0xd9, 0xd2, 0x1c, +0xe1, 0xda, 0x26, 0x9e, 0x9f, 0x67, 0x44, 0x51, 0xe0, 0x44, 0x51, 0xdf, +0x44, 0x51, 0xde, 0x3f, 0x4d, 0xdd, 0x3b, 0x48, 0xdc, 0x3a, 0x48, 0xdb, +0x56, 0x66, 0xda, 0x10, 0x15, 0x3b, 0x11, 0x16, 0x3d, 0x11, 0x18, 0x40, +0x12, 0x19, 0x42, 0x13, 0x1a, 0x44, 0x15, 0x1b, 0x47, 0x54, 0x5a, 0x58, +0xce, 0xc9, 0x0e, 0xd4, 0xcd, 0x1b, 0xe3, 0xdd, 0x30, 0xe2, 0xe0, 0x2d, +0xdc, 0xda, 0x1d, 0xd1, 0xca, 0x1a, 0xe1, 0xdf, 0x2a, 0xe2, 0xe0, 0x2b, +0xce, 0xcc, 0x19, 0xcb, 0xc4, 0x18, 0xcb, 0xc4, 0x18, 0xce, 0xcc, 0x19, +0xe2, 0xdc, 0x2d, 0xe0, 0xde, 0x25, 0xe3, 0xdd, 0x30, 0xe1, 0xdf, 0x2a, +0xde, 0xd8, 0x1f, 0x77, 0x78, 0x36, 0x1e, 0x26, 0x5b, 0x1d, 0x24, 0x58, +0x1c, 0x24, 0x56, 0x1a, 0x22, 0x53, 0x19, 0x20, 0x50, 0x18, 0x1f, 0x4d, +0x46, 0x55, 0xa8, 0x4f, 0x61, 0xd7, 0x43, 0x50, 0x9f, 0x3d, 0x4a, 0x91, +0x50, 0x61, 0xda, 0x47, 0x56, 0xdb, 0x43, 0x51, 0xdc, 0x41, 0x4f, 0xdd, +0x55, 0x64, 0xdd, 0x24, 0x2b, 0x58, 0x0e, 0x13, 0x33, 0xe1, 0xdb, 0x2a, +0xcc, 0xc6, 0x19, 0xce, 0xc7, 0x19, 0xdf, 0xd8, 0x20, 0xe1, 0xdf, 0x2a, +0xb3, 0xb2, 0x4b, 0x49, 0x55, 0xcf, 0x44, 0x4f, 0xcb, 0x3f, 0x4a, 0xc7, +0x3c, 0x46, 0xc3, 0x39, 0x42, 0xc0, 0x36, 0x3f, 0xbc, 0x34, 0x3e, 0xb9, +0x32, 0x3b, 0xb5, 0x30, 0x3a, 0xb2, 0x2f, 0x38, 0xaf, 0x2e, 0x36, 0xac, +0x2c, 0x35, 0xa9, 0x2c, 0x34, 0xa6, 0x2d, 0x35, 0xa4, 0x2e, 0x36, 0xa0, +0xbc, 0xb9, 0x28, 0xc9, 0xc3, 0x18, 0xce, 0xc7, 0x19, 0xe1, 0xdf, 0x2a, +0xeb, 0xe6, 0x4a, 0xe6, 0xe4, 0x39, 0xdb, 0xd4, 0x1c, 0xe0, 0xd9, 0x23, +0xe2, 0xdc, 0x2b, 0xde, 0xd8, 0x1f, 0xdd, 0xd6, 0x1c, 0xd7, 0xd0, 0x1c, +0x68, 0x6b, 0x59, 0x2a, 0x31, 0x81, 0x2a, 0x30, 0x7f, 0x29, 0x2e, 0x7d, +0x3c, 0x41, 0x6f, 0xd0, 0xca, 0x14, 0xe0, 0xd9, 0x23, 0xe1, 0xda, 0x26, +0xd4, 0xcd, 0x1b, 0xde, 0xd7, 0x1d, 0xcf, 0xc9, 0x1a, 0xe2, 0xe0, 0x2d, +0xe0, 0xde, 0x25, 0xdd, 0xd6, 0x1c, 0xd9, 0xd2, 0x1c, 0xd9, 0xd2, 0x1c, +0xe1, 0xda, 0x26, 0xdf, 0xd8, 0x20, 0xe1, 0xda, 0x26, 0x8c, 0x8b, 0x31, +0x1e, 0x24, 0x65, 0x1d, 0x23, 0x64, 0x1d, 0x23, 0x63, 0x1d, 0x22, 0x62, +0x1c, 0x21, 0x60, 0x1c, 0x21, 0x5f, 0x1c, 0x21, 0x5e, 0x1b, 0x20, 0x5d, +0x1b, 0x20, 0x5c, 0x1b, 0x20, 0x5b, 0xa2, 0x9f, 0x22, 0xdb, 0xd4, 0x1c, +0xe1, 0xda, 0x26, 0xd4, 0xcd, 0x1b, 0xe3, 0xdd, 0x30, 0xb8, 0xb3, 0x18, +0x18, 0x1d, 0x55, 0x18, 0x1d, 0x54, 0x18, 0x1c, 0x53, 0x17, 0x1c, 0x52, +0x17, 0x1c, 0x52, 0x17, 0x1c, 0x51, 0x17, 0x1b, 0x50, 0x16, 0x1b, 0x4f, +0x5b, 0x5c, 0x37, 0xe0, 0xde, 0x25, 0xe3, 0xdd, 0x30, 0xe1, 0xdf, 0x2a, +0xde, 0xd8, 0x1f, 0xd1, 0xcf, 0x1a, 0xb7, 0xb2, 0x16, 0x15, 0x19, 0x4a, +0x14, 0x18, 0x49, 0x14, 0x18, 0x49, 0x14, 0x18, 0x48, 0x14, 0x18, 0x48, +0x13, 0x17, 0x47, 0x13, 0x17, 0x45, 0x13, 0x17, 0x45, 0x13, 0x17, 0x45, +0x13, 0x17, 0x45, 0x13, 0x16, 0x44, 0x13, 0x16, 0x44, 0x12, 0x16, 0x42, +0x12, 0x16, 0x42, 0x12, 0x16, 0x41, 0x12, 0x15, 0x41, 0x12, 0x15, 0x40, +0x12, 0x15, 0x40, 0x11, 0x15, 0x3f, 0x11, 0x15, 0x3f, 0x11, 0x14, 0x3e, +0x11, 0x14, 0x3e, 0x11, 0x14, 0x3d, 0x10, 0x12, 0x37, 0x01, 0x01, 0x05, +0x19, 0x1d, 0x48, 0x33, 0x3b, 0x90, 0x37, 0x3f, 0x97, 0x30, 0x36, 0x80, +0x2d, 0x34, 0x77, 0x2f, 0x35, 0x79, 0x2f, 0x35, 0x74, 0x2e, 0x34, 0x71, +0x2c, 0x32, 0x67, 0x2b, 0x30, 0x63, 0x2a, 0x30, 0x5f, 0x2b, 0x30, 0x5c, +0x28, 0x2e, 0x57, 0x26, 0x2a, 0x53, 0x25, 0x2b, 0x54, 0x29, 0x2f, 0x5e, +0x2d, 0x33, 0x68, 0x32, 0x39, 0x76, 0x35, 0x3d, 0x80, 0x39, 0x41, 0x8b, +0x3c, 0x45, 0x97, 0x3b, 0x43, 0x99, 0x85, 0x87, 0x59, 0xd2, 0xcd, 0x18, +0xd2, 0xcc, 0x1b, 0xde, 0xd8, 0x1f, 0xe2, 0xdc, 0x2b, 0xdf, 0xd9, 0x22, +0xe0, 0xd9, 0x23, 0xe0, 0xd9, 0x23, 0xdb, 0xd4, 0x1c, 0xdf, 0xd8, 0x20, +0xdd, 0xd6, 0x1c, 0xdd, 0xd6, 0x1c, 0xd9, 0xd2, 0x1c, 0xdf, 0xd8, 0x20, +0xe3, 0xe1, 0x32, 0xde, 0xdc, 0x1f, 0xdf, 0xd9, 0x22, 0xc1, 0xbe, 0x34, +0x89, 0x8d, 0x7a, 0x50, 0x5a, 0xc3, 0x3d, 0x49, 0xdf, 0x3b, 0x47, 0xdf, +0x38, 0x44, 0xdf, 0x35, 0x41, 0xde, 0x3b, 0x48, 0xdd, 0x57, 0x66, 0xdc, +0x0f, 0x14, 0x38, 0x0f, 0x15, 0x39, 0x10, 0x16, 0x3b, 0x11, 0x17, 0x3e, +0x11, 0x18, 0x40, 0x12, 0x19, 0x42, 0x45, 0x53, 0xa8, 0x31, 0x3c, 0x79, +0x47, 0x50, 0x73, 0xa5, 0xa4, 0x26, 0xe6, 0xdf, 0x37, 0xcc, 0xc6, 0x19, +0xce, 0xc7, 0x19, 0xe1, 0xda, 0x26, 0xe2, 0xe0, 0x2d, 0xd7, 0xd5, 0x1c, +0xbc, 0xb6, 0x15, 0xc6, 0xc4, 0x17, 0xdf, 0xd8, 0x20, 0xdf, 0xd8, 0x20, +0xe2, 0xe0, 0x2d, 0xde, 0xd8, 0x1f, 0xd9, 0xd2, 0x1c, 0xd9, 0xd2, 0x1c, +0x76, 0x77, 0x34, 0x1d, 0x24, 0x58, 0x1b, 0x23, 0x55, 0x1b, 0x22, 0x53, +0x1a, 0x21, 0x51, 0x19, 0x20, 0x4e, 0x18, 0x1f, 0x4c, 0x17, 0x1d, 0x49, +0x29, 0x32, 0x68, 0x53, 0x65, 0xd8, 0x49, 0x5a, 0xd9, 0x55, 0x67, 0xd5, +0x4f, 0x5f, 0xbf, 0x4c, 0x5b, 0xdb, 0x41, 0x50, 0xdc, 0x3e, 0x4b, 0xdd, +0x3a, 0x46, 0xde, 0x46, 0x53, 0xdf, 0x77, 0x80, 0xab, 0xd7, 0xd0, 0x1c, +0xd7, 0xd0, 0x1c, 0xdb, 0xd4, 0x1c, 0xe2, 0xdc, 0x2b, 0xd5, 0xd0, 0x1e, +0x5f, 0x69, 0xb9, 0x4b, 0x57, 0xcd, 0x48, 0x52, 0xc9, 0x43, 0x4f, 0xc5, +0x40, 0x4a, 0xc2, 0x3c, 0x46, 0xbe, 0x38, 0x42, 0xba, 0x35, 0x3f, 0xb7, +0x34, 0x3d, 0xb4, 0x32, 0x3a, 0xb1, 0x30, 0x39, 0xae, 0x2e, 0x37, 0xaa, +0x2d, 0x35, 0xa7, 0x2c, 0x35, 0xa5, 0x2a, 0x33, 0xa2, 0x29, 0x31, 0x9f, +0x68, 0x6b, 0x6b, 0xe1, 0xdb, 0x2a, 0xe5, 0xdf, 0x36, 0xe6, 0xdf, 0x37, +0xe4, 0xe2, 0x35, 0xe0, 0xd9, 0x23, 0xe1, 0xdb, 0x2a, 0xe2, 0xdc, 0x2d, +0xd4, 0xcd, 0x1b, 0xcc, 0xc6, 0x19, 0xbc, 0xb8, 0x23, 0x7d, 0x7e, 0x4c, +0x2a, 0x30, 0x82, 0x2a, 0x30, 0x80, 0x28, 0x2e, 0x7e, 0x28, 0x2e, 0x7c, +0x28, 0x2e, 0x7c, 0x3b, 0x3f, 0x6d, 0xd0, 0xca, 0x13, 0xdf, 0xd8, 0x20, +0xdd, 0xd6, 0x1c, 0xdd, 0xd6, 0x1c, 0xd9, 0xd2, 0x1c, 0xdf, 0xd8, 0x20, +0xe3, 0xe1, 0x32, 0xde, 0xdc, 0x1f, 0xdf, 0xd9, 0x22, 0xe2, 0xdc, 0x2b, +0xd7, 0xd0, 0x1c, 0x8d, 0x8b, 0x32, 0x34, 0x39, 0x5c, 0x1e, 0x24, 0x66, +0x1e, 0x24, 0x65, 0x1d, 0x23, 0x64, 0x1d, 0x22, 0x62, 0x1c, 0x22, 0x61, +0x1c, 0x21, 0x60, 0x1c, 0x21, 0x5f, 0x1c, 0x20, 0x5e, 0x1b, 0x20, 0x5d, +0x1b, 0x20, 0x5c, 0x1b, 0x1f, 0x5b, 0xce, 0xc9, 0x10, 0xdd, 0xd6, 0x1c, +0xd4, 0xcd, 0x1b, 0xe2, 0xe0, 0x2b, 0xe6, 0xdf, 0x37, 0x2f, 0x32, 0x4d, +0x18, 0x1c, 0x55, 0x18, 0x1c, 0x54, 0x17, 0x1c, 0x53, 0x17, 0x1c, 0x52, +0x17, 0x1c, 0x52, 0x17, 0x1b, 0x51, 0x16, 0x1b, 0x50, 0x16, 0x1b, 0x4f, +0x5b, 0x5c, 0x37, 0xde, 0xd8, 0x1f, 0xd9, 0xd2, 0x1c, 0xd9, 0xd2, 0x1c, +0xe2, 0xe0, 0x2b, 0xce, 0xc8, 0x0e, 0x2b, 0x2e, 0x42, 0x15, 0x19, 0x4a, +0x14, 0x18, 0x49, 0x14, 0x18, 0x49, 0x14, 0x17, 0x48, 0x13, 0x17, 0x47, +0x13, 0x17, 0x47, 0x13, 0x17, 0x45, 0x13, 0x17, 0x45, 0x13, 0x16, 0x45, +0x13, 0x16, 0x45, 0x12, 0x16, 0x44, 0x12, 0x16, 0x44, 0x12, 0x15, 0x42, +0x12, 0x15, 0x42, 0x12, 0x15, 0x41, 0x12, 0x15, 0x41, 0x11, 0x15, 0x40, +0x11, 0x15, 0x40, 0x11, 0x14, 0x3f, 0x11, 0x14, 0x3f, 0x11, 0x14, 0x3e, +0x11, 0x14, 0x3e, 0x10, 0x14, 0x3d, 0x0f, 0x12, 0x37, 0x01, 0x01, 0x05, +0x1a, 0x1e, 0x48, 0x38, 0x3e, 0x90, 0x3b, 0x45, 0x96, 0x33, 0x3b, 0x7e, +0x2e, 0x34, 0x6f, 0x2f, 0x34, 0x6d, 0x2e, 0x34, 0x6b, 0x2f, 0x35, 0x68, +0x2e, 0x35, 0x65, 0x2d, 0x33, 0x62, 0x2a, 0x30, 0x5f, 0x28, 0x2d, 0x5c, +0x2c, 0x32, 0x66, 0x2f, 0x36, 0x6f, 0x31, 0x39, 0x78, 0x35, 0x3d, 0x82, +0x38, 0x40, 0x8d, 0x37, 0x3f, 0x8f, 0x36, 0x3e, 0x91, 0x35, 0x3e, 0x93, +0x35, 0x3c, 0x96, 0x33, 0x3b, 0x98, 0x32, 0x3a, 0x9b, 0x31, 0x39, 0x9d, +0x6c, 0x6f, 0x6d, 0xa8, 0xa6, 0x3b, 0xd0, 0xcb, 0x19, 0xe1, 0xda, 0x26, +0xe5, 0xdf, 0x36, 0xe1, 0xdf, 0x2a, 0xe1, 0xdf, 0x2a, 0xd4, 0xcd, 0x1b, +0xd5, 0xcf, 0x1c, 0xdf, 0xd8, 0x20, 0xdd, 0xd6, 0x1c, 0xab, 0xaa, 0x45, +0x99, 0x99, 0x5c, 0x75, 0x7a, 0x88, 0x3d, 0x49, 0xcd, 0x3c, 0x48, 0xd0, +0x3c, 0x47, 0xd5, 0x39, 0x45, 0xd9, 0x36, 0x41, 0xdd, 0x31, 0x3d, 0xdf, +0x2f, 0x3a, 0xdf, 0x3c, 0x48, 0xde, 0x58, 0x67, 0xdd, 0x0e, 0x13, 0x34, +0x0e, 0x13, 0x35, 0x0f, 0x14, 0x38, 0x0f, 0x15, 0x39, 0x10, 0x16, 0x3c, +0x2a, 0x34, 0x6b, 0x53, 0x64, 0xd7, 0x4b, 0x5b, 0xb8, 0x44, 0x53, 0xa6, +0x4d, 0x5d, 0xbe, 0x17, 0x1e, 0x4a, 0x30, 0x35, 0x47, 0x8c, 0x8b, 0x28, +0xcf, 0xca, 0x10, 0xe4, 0xe2, 0x33, 0xdf, 0xd9, 0x22, 0xd4, 0xcd, 0x1b, +0xc9, 0xc7, 0x18, 0xd4, 0xcd, 0x1b, 0xe2, 0xdc, 0x2b, 0xe1, 0xdb, 0x2a, +0xe2, 0xe0, 0x2d, 0xde, 0xd7, 0x1d, 0xdb, 0xd4, 0x1c, 0xcf, 0xc9, 0x1a, +0xd1, 0xcc, 0x13, 0x1a, 0x22, 0x53, 0x19, 0x21, 0x50, 0x19, 0x20, 0x4f, +0x18, 0x1f, 0x4d, 0x17, 0x1e, 0x4a, 0x16, 0x1d, 0x48, 0x15, 0x1c, 0x46, +0x39, 0x46, 0x88, 0x48, 0x56, 0xab, 0x4a, 0x5a, 0xda, 0x45, 0x54, 0xdb, +0x51, 0x61, 0xdb, 0x56, 0x66, 0xdc, 0x47, 0x56, 0xdd, 0x3c, 0x4a, 0xde, +0x39, 0x45, 0xdf, 0x36, 0x42, 0xdf, 0x5f, 0x67, 0xb0, 0xb2, 0xb1, 0x4f, +0xb3, 0xb3, 0x42, 0xa8, 0xa6, 0x27, 0xaf, 0xae, 0x36, 0x5f, 0x69, 0xa9, +0x52, 0x5e, 0xce, 0x4e, 0x59, 0xca, 0x49, 0x54, 0xc7, 0x46, 0x51, 0xc3, +0x42, 0x4d, 0xbf, 0x40, 0x4a, 0xbd, 0x3c, 0x46, 0xb9, 0x38, 0x43, 0xb6, +0x36, 0x3f, 0xb2, 0x34, 0x3d, 0xaf, 0x32, 0x3a, 0xac, 0x2f, 0x38, 0xaa, +0x2e, 0x36, 0xa7, 0x2d, 0x35, 0xa4, 0x2b, 0x34, 0xa1, 0x2a, 0x32, 0x9e, +0x29, 0x31, 0x9c, 0x7b, 0x7c, 0x58, 0xd0, 0xca, 0x17, 0xdb, 0xd4, 0x1c, +0xd4, 0xcd, 0x1b, 0xde, 0xd7, 0x1d, 0xa6, 0xa4, 0x33, 0xa6, 0xa4, 0x33, +0x67, 0x6a, 0x5d, 0x29, 0x2f, 0x87, 0x29, 0x2f, 0x85, 0x29, 0x2f, 0x84, +0x29, 0x2f, 0x82, 0x29, 0x2f, 0x80, 0x28, 0x2e, 0x7e, 0x27, 0x2d, 0x7c, +0x27, 0x2c, 0x7b, 0x26, 0x2c, 0x79, 0x26, 0x2b, 0x78, 0x65, 0x66, 0x51, +0xa5, 0xa2, 0x2b, 0xdf, 0xd8, 0x20, 0xdd, 0xd6, 0x1c, 0xe0, 0xda, 0x25, +0xe4, 0xde, 0x33, 0xe4, 0xde, 0x33, 0xa4, 0xa1, 0x28, 0x77, 0x77, 0x3e, +0x35, 0x3a, 0x5e, 0x20, 0x25, 0x68, 0x1f, 0x25, 0x67, 0x1e, 0x24, 0x66, +0x1e, 0x24, 0x65, 0x1d, 0x23, 0x63, 0x1d, 0x22, 0x62, 0x1c, 0x22, 0x61, +0x1c, 0x21, 0x60, 0x1c, 0x21, 0x5f, 0x1c, 0x20, 0x5e, 0x1b, 0x20, 0x5d, +0x1b, 0x20, 0x5c, 0x1b, 0x1f, 0x5b, 0xa2, 0x9f, 0x22, 0xa2, 0x9e, 0x22, +0xa2, 0x9e, 0x22, 0xa1, 0x9e, 0x21, 0x73, 0x72, 0x32, 0x18, 0x1c, 0x55, +0x18, 0x1c, 0x55, 0x18, 0x1c, 0x54, 0x17, 0x1c, 0x53, 0x17, 0x1b, 0x52, +0x17, 0x1b, 0x51, 0x17, 0x1b, 0x51, 0x16, 0x1a, 0x50, 0x16, 0x1a, 0x4f, +0x2c, 0x2f, 0x46, 0xa0, 0x9d, 0x1e, 0xa0, 0x9d, 0x1e, 0xa0, 0x9d, 0x1e, +0xa0, 0x9d, 0x1e, 0x42, 0x44, 0x3c, 0x15, 0x18, 0x4a, 0x14, 0x17, 0x4a, +0x13, 0x17, 0x49, 0x13, 0x17, 0x49, 0x13, 0x17, 0x48, 0x13, 0x16, 0x47, +0x13, 0x16, 0x47, 0x13, 0x16, 0x45, 0x13, 0x16, 0x45, 0x12, 0x16, 0x45, +0x12, 0x16, 0x45, 0x12, 0x15, 0x44, 0x12, 0x15, 0x43, 0x12, 0x15, 0x42, +0x11, 0x15, 0x41, 0x11, 0x15, 0x41, 0x11, 0x14, 0x40, 0x11, 0x14, 0x40, +0x11, 0x14, 0x40, 0x11, 0x14, 0x3f, 0x11, 0x14, 0x3f, 0x10, 0x14, 0x3e, +0x10, 0x14, 0x3e, 0x10, 0x13, 0x3d, 0x0f, 0x11, 0x37, 0x01, 0x01, 0x05, +0x1c, 0x21, 0x48, 0x3b, 0x42, 0x8f, 0x40, 0x48, 0x96, 0x36, 0x3f, 0x7d, +0x32, 0x39, 0x71, 0x32, 0x38, 0x6d, 0x30, 0x35, 0x6b, 0x2e, 0x34, 0x6a, +0x2c, 0x32, 0x67, 0x2c, 0x34, 0x6b, 0x2e, 0x35, 0x70, 0x32, 0x39, 0x7b, +0x35, 0x3c, 0x84, 0x34, 0x3b, 0x86, 0x34, 0x3b, 0x88, 0x32, 0x3b, 0x8a, +0x31, 0x39, 0x8c, 0x30, 0x39, 0x8e, 0x30, 0x37, 0x90, 0x2f, 0x37, 0x93, +0x2f, 0x36, 0x95, 0x2d, 0x35, 0x98, 0x2c, 0x34, 0x9a, 0x2b, 0x32, 0x9d, +0x2a, 0x32, 0x9f, 0x29, 0x31, 0xa1, 0x2a, 0x33, 0xa5, 0x2b, 0x33, 0xa7, +0x54, 0x5a, 0x86, 0x6a, 0x6e, 0x75, 0x6b, 0x6f, 0x77, 0x6c, 0x70, 0x79, +0x59, 0x5f, 0x8f, 0x34, 0x3e, 0xb9, 0x37, 0x41, 0xbc, 0x3a, 0x44, 0xc0, +0x3b, 0x46, 0xc3, 0x3a, 0x45, 0xc7, 0x3a, 0x44, 0xca, 0x39, 0x43, 0xcf, +0x37, 0x41, 0xd2, 0x32, 0x3d, 0xd6, 0x2e, 0x39, 0xda, 0x2d, 0x37, 0xde, +0x3c, 0x49, 0xdf, 0x59, 0x68, 0xdf, 0x1e, 0x24, 0x4e, 0x1c, 0x22, 0x4c, +0x1e, 0x25, 0x50, 0x0e, 0x14, 0x36, 0x0f, 0x14, 0x38, 0x3c, 0x48, 0x8e, +0x4e, 0x5e, 0xd9, 0x53, 0x63, 0xd8, 0x51, 0x62, 0xcd, 0x52, 0x64, 0xd7, +0x42, 0x50, 0x9e, 0x17, 0x1d, 0x48, 0x44, 0x52, 0x9f, 0x1c, 0x23, 0x50, +0x20, 0x27, 0x54, 0x5a, 0x6c, 0xd0, 0x5e, 0x6c, 0x9d, 0x62, 0x65, 0x3d, +0x62, 0x64, 0x3c, 0x60, 0x63, 0x3b, 0xdf, 0xd8, 0x20, 0xe2, 0xe0, 0x2d, +0xde, 0xd7, 0x1d, 0xe0, 0xde, 0x25, 0xdd, 0xd6, 0x1c, 0xd7, 0xd5, 0x1c, +0xdf, 0xd9, 0x22, 0x73, 0x74, 0x2e, 0x18, 0x1f, 0x4c, 0x17, 0x1e, 0x4a, +0x16, 0x1d, 0x48, 0x16, 0x1c, 0x47, 0x15, 0x1b, 0x45, 0x14, 0x1b, 0x43, +0x43, 0x50, 0x9e, 0x4e, 0x5d, 0xbb, 0x54, 0x65, 0xdb, 0x43, 0x52, 0xdb, +0x3f, 0x4e, 0xdc, 0x4a, 0x59, 0xdd, 0x50, 0x5f, 0xde, 0x44, 0x51, 0xdf, +0x39, 0x45, 0xdf, 0x35, 0x41, 0xe0, 0x32, 0x3d, 0xe1, 0x31, 0x3d, 0xdf, +0x3f, 0x4b, 0xdb, 0x51, 0x5d, 0xd7, 0x33, 0x3c, 0x74, 0x3d, 0x46, 0x8a, +0x48, 0x52, 0xa9, 0x50, 0x5c, 0xc8, 0x4a, 0x56, 0xc4, 0x48, 0x53, 0xc1, +0x44, 0x4f, 0xbe, 0x41, 0x4c, 0xba, 0x3f, 0x49, 0xb7, 0x3b, 0x45, 0xb4, +0x38, 0x41, 0xb0, 0x36, 0x3f, 0xad, 0x34, 0x3c, 0xab, 0x31, 0x39, 0xa8, +0x2f, 0x37, 0xa6, 0x2d, 0x35, 0xa2, 0x2c, 0x34, 0xa0, 0x2b, 0x33, 0x9d, +0x29, 0x31, 0x9b, 0x28, 0x30, 0x98, 0x27, 0x2e, 0x96, 0x27, 0x2d, 0x93, +0x25, 0x2c, 0x91, 0x25, 0x2c, 0x8f, 0x25, 0x2b, 0x8d, 0x26, 0x2c, 0x8b, +0x26, 0x2c, 0x89, 0x25, 0x2c, 0x86, 0x25, 0x2c, 0x85, 0x26, 0x2d, 0x83, +0x26, 0x2c, 0x81, 0x26, 0x2d, 0x7f, 0x26, 0x2d, 0x7d, 0x26, 0x2c, 0x7c, +0x26, 0x2c, 0x7b, 0x26, 0x2b, 0x79, 0x25, 0x2b, 0x77, 0x24, 0x2a, 0x75, +0x23, 0x2a, 0x74, 0x23, 0x29, 0x72, 0x23, 0x29, 0x71, 0x22, 0x28, 0x6f, +0x21, 0x28, 0x6e, 0x21, 0x27, 0x6c, 0x20, 0x26, 0x6c, 0x20, 0x26, 0x6a, +0x1f, 0x25, 0x69, 0x1f, 0x25, 0x68, 0x1f, 0x25, 0x67, 0x1e, 0x24, 0x65, +0x1e, 0x23, 0x64, 0x1d, 0x23, 0x63, 0x1c, 0x22, 0x62, 0x1c, 0x22, 0x61, +0x1c, 0x21, 0x60, 0x1c, 0x21, 0x5f, 0x1c, 0x20, 0x5e, 0x1b, 0x20, 0x5d, +0x1b, 0x20, 0x5c, 0x1b, 0x1f, 0x5b, 0x1a, 0x1f, 0x5a, 0x1a, 0x1e, 0x59, +0x1a, 0x1e, 0x58, 0x19, 0x1d, 0x57, 0x19, 0x1d, 0x56, 0x18, 0x1c, 0x55, +0x18, 0x1c, 0x54, 0x17, 0x1c, 0x54, 0x17, 0x1c, 0x53, 0x17, 0x1b, 0x52, +0x17, 0x1b, 0x51, 0x17, 0x1b, 0x50, 0x16, 0x1a, 0x50, 0x16, 0x1a, 0x4f, +0x16, 0x1a, 0x4e, 0x16, 0x1a, 0x4e, 0x15, 0x19, 0x4d, 0x15, 0x19, 0x4c, +0x15, 0x19, 0x4c, 0x15, 0x18, 0x4b, 0x14, 0x18, 0x4a, 0x14, 0x17, 0x4a, +0x13, 0x17, 0x49, 0x13, 0x17, 0x48, 0x13, 0x17, 0x48, 0x13, 0x16, 0x47, +0x13, 0x16, 0x47, 0x12, 0x16, 0x45, 0x12, 0x16, 0x45, 0x12, 0x16, 0x45, +0x12, 0x15, 0x44, 0x12, 0x15, 0x44, 0x12, 0x15, 0x43, 0x11, 0x15, 0x42, +0x11, 0x15, 0x41, 0x11, 0x15, 0x41, 0x11, 0x14, 0x40, 0x11, 0x14, 0x40, +0x11, 0x14, 0x3f, 0x11, 0x14, 0x3f, 0x10, 0x14, 0x3f, 0x10, 0x13, 0x3e, +0x10, 0x13, 0x3e, 0x10, 0x13, 0x3d, 0x0f, 0x11, 0x37, 0x01, 0x01, 0x05, +0x1e, 0x22, 0x47, 0x3f, 0x48, 0x8f, 0x41, 0x4b, 0x95, 0x35, 0x3f, 0x7d, +0x30, 0x36, 0x70, 0x2e, 0x34, 0x6f, 0x2d, 0x33, 0x6e, 0x2f, 0x35, 0x74, +0x31, 0x38, 0x7d, 0x31, 0x38, 0x7f, 0x30, 0x37, 0x80, 0x30, 0x37, 0x81, +0x2f, 0x36, 0x84, 0x2f, 0x36, 0x86, 0x2e, 0x35, 0x87, 0x2d, 0x34, 0x89, +0x2c, 0x34, 0x8c, 0x2c, 0x33, 0x8d, 0x2c, 0x32, 0x90, 0x2b, 0x31, 0x92, +0x29, 0x31, 0x94, 0x28, 0x30, 0x97, 0x27, 0x2e, 0x98, 0x27, 0x2f, 0x9b, +0x28, 0x30, 0x9d, 0x29, 0x32, 0xa1, 0x2b, 0x32, 0xa3, 0x2c, 0x33, 0xa5, +0x2c, 0x35, 0xa8, 0x2d, 0x36, 0xab, 0x2f, 0x38, 0xae, 0x31, 0x3a, 0xb1, +0x33, 0x3d, 0xb5, 0x36, 0x3f, 0xb8, 0x38, 0x42, 0xba, 0x38, 0x42, 0xbe, +0x37, 0x41, 0xc1, 0x37, 0x41, 0xc5, 0x35, 0x40, 0xc8, 0x32, 0x3c, 0xcc, +0x2f, 0x3a, 0xd0, 0x2c, 0x36, 0xd3, 0x2f, 0x3b, 0xd6, 0x3e, 0x4a, 0xdb, +0x59, 0x67, 0xde, 0x39, 0x43, 0x84, 0x39, 0x43, 0x84, 0x3c, 0x47, 0x8c, +0x2d, 0x36, 0x6c, 0x1e, 0x25, 0x51, 0x4a, 0x58, 0xb0, 0x4c, 0x5b, 0xdb, +0x4b, 0x5a, 0xda, 0x51, 0x60, 0xd9, 0x4d, 0x5e, 0xd9, 0x50, 0x60, 0xd9, +0x2d, 0x37, 0x6e, 0x3d, 0x49, 0x8d, 0x50, 0x61, 0xbe, 0x1b, 0x22, 0x4c, +0x47, 0x54, 0x9e, 0x5c, 0x6e, 0xdf, 0x51, 0x61, 0xb9, 0x1e, 0x25, 0x53, +0x1d, 0x24, 0x52, 0x1c, 0x23, 0x51, 0x8b, 0x8a, 0x27, 0xe3, 0xdd, 0x2e, +0xe1, 0xda, 0x26, 0xe1, 0xda, 0x26, 0xd5, 0xcf, 0x1c, 0xdb, 0xd4, 0x1c, +0xdd, 0xd6, 0x1c, 0xd4, 0xcd, 0x1b, 0x2c, 0x32, 0x40, 0x16, 0x1c, 0x47, +0x15, 0x1b, 0x45, 0x14, 0x1b, 0x43, 0x14, 0x1a, 0x42, 0x13, 0x19, 0x40, +0x12, 0x18, 0x3e, 0x54, 0x63, 0xd0, 0x56, 0x65, 0xdc, 0x4b, 0x5a, 0xdc, +0x3d, 0x4a, 0xdd, 0x3b, 0x48, 0xde, 0x45, 0x53, 0xdf, 0x4a, 0x58, 0xdf, +0x3f, 0x4b, 0xe0, 0x35, 0x42, 0xe1, 0x31, 0x3d, 0xe0, 0x30, 0x3b, 0xdc, +0x2f, 0x3a, 0xd7, 0x37, 0x42, 0xd4, 0x45, 0x51, 0xd1, 0x4d, 0x58, 0xb9, +0x39, 0x42, 0x82, 0x45, 0x4f, 0xa2, 0x4c, 0x57, 0xb9, 0x4a, 0x55, 0xbf, +0x46, 0x50, 0xbb, 0x43, 0x4d, 0xb8, 0x3f, 0x49, 0xb5, 0x3d, 0x46, 0xb2, +0x3a, 0x44, 0xaf, 0x38, 0x42, 0xac, 0x36, 0x3f, 0xa9, 0x33, 0x3b, 0xa6, +0x31, 0x39, 0xa4, 0x2f, 0x36, 0xa1, 0x2d, 0x35, 0x9e, 0x2b, 0x33, 0x9c, +0x29, 0x31, 0x99, 0x29, 0x31, 0x97, 0x27, 0x2f, 0x95, 0x27, 0x2e, 0x92, +0x26, 0x2d, 0x91, 0x25, 0x2c, 0x8e, 0x25, 0x2a, 0x8c, 0x23, 0x2a, 0x8a, +0x23, 0x29, 0x88, 0x23, 0x29, 0x86, 0x23, 0x29, 0x85, 0x23, 0x29, 0x82, +0x24, 0x2a, 0x80, 0x24, 0x2a, 0x7f, 0x24, 0x2a, 0x7d, 0x23, 0x2a, 0x7b, +0x24, 0x2a, 0x7a, 0x23, 0x2a, 0x78, 0x23, 0x2a, 0x77, 0x23, 0x2a, 0x75, +0x23, 0x29, 0x73, 0x23, 0x29, 0x72, 0x22, 0x28, 0x70, 0x21, 0x28, 0x6f, +0x21, 0x27, 0x6e, 0x20, 0x26, 0x6c, 0x20, 0x26, 0x6b, 0x1f, 0x25, 0x6a, +0x1f, 0x25, 0x69, 0x1f, 0x25, 0x68, 0x1e, 0x24, 0x66, 0x1e, 0x23, 0x65, +0x1d, 0x23, 0x64, 0x1d, 0x22, 0x63, 0x1c, 0x22, 0x62, 0x1c, 0x22, 0x61, +0x1c, 0x21, 0x5f, 0x1c, 0x20, 0x5e, 0x1b, 0x20, 0x5d, 0x1b, 0x20, 0x5c, +0x1b, 0x1f, 0x5b, 0x1b, 0x1f, 0x5a, 0x1a, 0x1f, 0x5a, 0x1a, 0x1e, 0x59, +0x1a, 0x1e, 0x58, 0x19, 0x1d, 0x57, 0x18, 0x1d, 0x56, 0x18, 0x1c, 0x55, +0x18, 0x1c, 0x54, 0x17, 0x1c, 0x53, 0x17, 0x1c, 0x53, 0x17, 0x1b, 0x52, +0x17, 0x1b, 0x51, 0x16, 0x1a, 0x50, 0x16, 0x1a, 0x50, 0x16, 0x1a, 0x4f, +0x16, 0x1a, 0x4e, 0x16, 0x19, 0x4d, 0x15, 0x19, 0x4d, 0x15, 0x19, 0x4c, +0x15, 0x18, 0x4b, 0x15, 0x18, 0x4b, 0x14, 0x18, 0x4a, 0x13, 0x17, 0x49, +0x13, 0x16, 0x49, 0x13, 0x16, 0x48, 0x13, 0x16, 0x48, 0x13, 0x16, 0x47, +0x13, 0x16, 0x47, 0x12, 0x15, 0x45, 0x12, 0x15, 0x45, 0x12, 0x15, 0x45, +0x12, 0x15, 0x44, 0x12, 0x15, 0x44, 0x12, 0x14, 0x43, 0x11, 0x14, 0x42, +0x11, 0x14, 0x41, 0x11, 0x14, 0x41, 0x11, 0x14, 0x40, 0x11, 0x14, 0x40, +0x10, 0x13, 0x3f, 0x10, 0x13, 0x3f, 0x10, 0x13, 0x3e, 0x10, 0x13, 0x3e, +0x10, 0x13, 0x3e, 0x10, 0x13, 0x3d, 0x0f, 0x11, 0x37, 0x01, 0x01, 0x05, +0x1e, 0x22, 0x47, 0x3c, 0x43, 0x8e, 0x3e, 0x46, 0x95, 0x32, 0x3a, 0x7e, +0x2e, 0x34, 0x75, 0x2e, 0x34, 0x77, 0x2d, 0x33, 0x78, 0x2d, 0x33, 0x7a, +0x2c, 0x33, 0x7c, 0x2c, 0x34, 0x7e, 0x2b, 0x32, 0x7f, 0x2b, 0x32, 0x81, +0x2b, 0x32, 0x83, 0x2a, 0x30, 0x85, 0x29, 0x30, 0x86, 0x29, 0x2f, 0x88, +0x28, 0x2f, 0x8b, 0x27, 0x2e, 0x8c, 0x26, 0x2e, 0x8f, 0x26, 0x2d, 0x91, +0x26, 0x2c, 0x93, 0x26, 0x2d, 0x95, 0x26, 0x2e, 0x97, 0x27, 0x2f, 0x9a, +0x29, 0x31, 0x9c, 0x2a, 0x31, 0x9f, 0x2a, 0x32, 0xa1, 0x2b, 0x34, 0xa4, +0x2d, 0x36, 0xa7, 0x2f, 0x37, 0xaa, 0x31, 0x3a, 0xac, 0x33, 0x3c, 0xaf, +0x36, 0x3f, 0xb2, 0x36, 0x3e, 0xb5, 0x35, 0x3e, 0xb9, 0x35, 0x3e, 0xbc, +0x34, 0x3e, 0xbf, 0x32, 0x3c, 0xc2, 0x2f, 0x39, 0xc5, 0x2d, 0x36, 0xc9, +0x2a, 0x34, 0xcd, 0x32, 0x3d, 0xd0, 0x41, 0x4d, 0xd4, 0x4f, 0x5b, 0xbf, +0x46, 0x50, 0xa1, 0x4c, 0x58, 0xb4, 0x4d, 0x58, 0xb5, 0x46, 0x51, 0xa2, +0x3c, 0x47, 0x8c, 0x54, 0x62, 0xcd, 0x49, 0x58, 0xdc, 0x44, 0x52, 0xdc, +0x4a, 0x59, 0xdb, 0x49, 0x58, 0xdb, 0x47, 0x56, 0xda, 0x56, 0x66, 0xd5, +0x37, 0x42, 0x81, 0x56, 0x67, 0xdc, 0x3a, 0x45, 0x85, 0x1a, 0x20, 0x49, +0x56, 0x67, 0xe0, 0x56, 0x68, 0xdf, 0x54, 0x64, 0xc1, 0x1c, 0x22, 0x4d, +0x1b, 0x21, 0x4d, 0x1a, 0x20, 0x4c, 0x2f, 0x34, 0x43, 0xd4, 0xcf, 0x19, +0xd1, 0xcf, 0x1a, 0xce, 0xc7, 0x19, 0xcc, 0xc6, 0x19, 0xe0, 0xde, 0x25, +0xde, 0xd8, 0x1f, 0xde, 0xd7, 0x1d, 0xce, 0xc8, 0x0e, 0x2b, 0x30, 0x3c, +0x14, 0x1a, 0x42, 0x13, 0x19, 0x40, 0x13, 0x19, 0x3f, 0x12, 0x18, 0x3e, +0x11, 0x17, 0x3c, 0x3f, 0x4b, 0x93, 0x51, 0x61, 0xdd, 0x4e, 0x5c, 0xdd, +0x43, 0x52, 0xde, 0x38, 0x44, 0xdf, 0x37, 0x43, 0xdf, 0x40, 0x4c, 0xe0, +0x46, 0x53, 0xe0, 0x3b, 0x46, 0xe0, 0x34, 0x3f, 0xdd, 0x31, 0x3c, 0xd9, +0x2f, 0x3a, 0xd5, 0x2f, 0x39, 0xd1, 0x31, 0x3c, 0xce, 0x3c, 0x47, 0xca, +0x49, 0x55, 0xc6, 0x3d, 0x46, 0x8b, 0x41, 0x4a, 0x96, 0x49, 0x54, 0xb0, +0x49, 0x54, 0xba, 0x44, 0x4e, 0xb6, 0x40, 0x4b, 0xb3, 0x3d, 0x48, 0xb0, +0x3b, 0x45, 0xad, 0x39, 0x42, 0xab, 0x37, 0x40, 0xa8, 0x34, 0x3e, 0xa5, +0x33, 0x3b, 0xa2, 0x31, 0x39, 0xa0, 0x2f, 0x36, 0x9d, 0x2d, 0x35, 0x9b, +0x2b, 0x33, 0x98, 0x29, 0x31, 0x96, 0x28, 0x30, 0x94, 0x27, 0x2f, 0x92, +0x26, 0x2d, 0x90, 0x25, 0x2c, 0x8d, 0x25, 0x2b, 0x8c, 0x24, 0x2a, 0x89, +0x23, 0x29, 0x87, 0x22, 0x28, 0x85, 0x21, 0x28, 0x84, 0x21, 0x28, 0x82, +0x22, 0x27, 0x80, 0x22, 0x27, 0x7e, 0x21, 0x27, 0x7c, 0x22, 0x27, 0x7b, +0x21, 0x27, 0x79, 0x22, 0x28, 0x78, 0x22, 0x27, 0x76, 0x22, 0x27, 0x74, +0x21, 0x27, 0x73, 0x21, 0x27, 0x71, 0x21, 0x27, 0x70, 0x21, 0x27, 0x6e, +0x20, 0x26, 0x6d, 0x20, 0x26, 0x6c, 0x1f, 0x25, 0x6b, 0x1f, 0x25, 0x6a, +0x1f, 0x25, 0x69, 0x1e, 0x24, 0x67, 0x1e, 0x23, 0x66, 0x1e, 0x23, 0x65, +0x1d, 0x22, 0x64, 0x1c, 0x22, 0x63, 0x1c, 0x21, 0x61, 0x1c, 0x21, 0x60, +0x1c, 0x21, 0x5f, 0x1b, 0x20, 0x5e, 0x1b, 0x20, 0x5d, 0x1b, 0x20, 0x5c, +0x1b, 0x1f, 0x5b, 0x1a, 0x1f, 0x5a, 0x1a, 0x1e, 0x59, 0x1a, 0x1e, 0x58, +0x19, 0x1d, 0x57, 0x19, 0x1d, 0x57, 0x18, 0x1d, 0x56, 0x18, 0x1c, 0x55, +0x18, 0x1c, 0x54, 0x17, 0x1c, 0x53, 0x17, 0x1b, 0x52, 0x17, 0x1b, 0x52, +0x17, 0x1b, 0x51, 0x16, 0x1a, 0x50, 0x16, 0x1a, 0x4f, 0x16, 0x1a, 0x4f, +0x16, 0x1a, 0x4e, 0x15, 0x19, 0x4d, 0x15, 0x19, 0x4d, 0x15, 0x19, 0x4c, +0x15, 0x18, 0x4b, 0x15, 0x18, 0x4b, 0x14, 0x18, 0x4a, 0x13, 0x16, 0x49, +0x13, 0x16, 0x49, 0x13, 0x16, 0x48, 0x13, 0x16, 0x48, 0x13, 0x16, 0x47, +0x12, 0x15, 0x45, 0x12, 0x15, 0x45, 0x12, 0x15, 0x45, 0x12, 0x15, 0x45, +0x12, 0x15, 0x44, 0x12, 0x15, 0x44, 0x12, 0x14, 0x43, 0x11, 0x14, 0x42, +0x11, 0x14, 0x41, 0x11, 0x14, 0x41, 0x10, 0x14, 0x40, 0x10, 0x14, 0x40, +0x10, 0x13, 0x3f, 0x10, 0x13, 0x3f, 0x10, 0x13, 0x3e, 0x10, 0x13, 0x3e, +0x10, 0x13, 0x3e, 0x0f, 0x13, 0x3d, 0x0f, 0x11, 0x37, 0x01, 0x01, 0x05, +0x1b, 0x1f, 0x46, 0x37, 0x3e, 0x8e, 0x38, 0x40, 0x94, 0x2f, 0x35, 0x7e, +0x2a, 0x30, 0x75, 0x2a, 0x30, 0x76, 0x2a, 0x30, 0x78, 0x29, 0x2f, 0x7a, +0x29, 0x2f, 0x7b, 0x28, 0x2e, 0x7d, 0x28, 0x2e, 0x7e, 0x27, 0x2e, 0x80, +0x27, 0x2e, 0x82, 0x26, 0x2d, 0x84, 0x25, 0x2c, 0x86, 0x25, 0x2c, 0x87, +0x25, 0x2b, 0x8a, 0x24, 0x2a, 0x8c, 0x24, 0x2b, 0x8d, 0x24, 0x2b, 0x90, +0x26, 0x2c, 0x92, 0x26, 0x2d, 0x94, 0x27, 0x2f, 0x97, 0x27, 0x2f, 0x99, +0x28, 0x30, 0x9c, 0x2a, 0x31, 0x9e, 0x2b, 0x33, 0xa0, 0x2c, 0x35, 0xa3, +0x2f, 0x36, 0xa5, 0x30, 0x39, 0xa8, 0x32, 0x3a, 0xab, 0x33, 0x3c, 0xae, +0x32, 0x3c, 0xb1, 0x31, 0x3b, 0xb4, 0x32, 0x3b, 0xb7, 0x32, 0x3b, 0xba, +0x2f, 0x38, 0xbd, 0x2d, 0x37, 0xc0, 0x2b, 0x34, 0xc3, 0x2a, 0x34, 0xc7, +0x34, 0x3e, 0xca, 0x43, 0x4f, 0xce, 0x47, 0x52, 0xa7, 0x48, 0x54, 0xab, +0x4e, 0x5b, 0xbc, 0x53, 0x5f, 0xca, 0x53, 0x60, 0xca, 0x4d, 0x58, 0xb5, +0x56, 0x64, 0xde, 0x45, 0x53, 0xde, 0x3e, 0x4b, 0xde, 0x43, 0x51, 0xdd, +0x45, 0x53, 0xdc, 0x43, 0x51, 0xdc, 0x4a, 0x59, 0xdc, 0x4b, 0x59, 0xb2, +0x58, 0x68, 0xdd, 0x51, 0x61, 0xdd, 0x17, 0x1d, 0x43, 0x4e, 0x5c, 0xb1, +0x4f, 0x5e, 0xe1, 0x52, 0x62, 0xe0, 0x57, 0x68, 0xcd, 0x1a, 0x20, 0x49, +0x19, 0x1f, 0x48, 0x18, 0x1e, 0x48, 0x2f, 0x3a, 0x72, 0x86, 0x8f, 0x8f, +0xde, 0xd8, 0x1f, 0xd4, 0xcd, 0x1b, 0xcc, 0xc6, 0x19, 0xe0, 0xde, 0x25, +0xe0, 0xde, 0x25, 0xdd, 0xd6, 0x1c, 0xc9, 0xc3, 0x18, 0xce, 0xc8, 0x0d, +0x41, 0x44, 0x32, 0x12, 0x18, 0x3e, 0x12, 0x17, 0x3c, 0x11, 0x17, 0x3b, +0x11, 0x16, 0x39, 0x27, 0x2c, 0x32, 0x84, 0x8b, 0x95, 0xb2, 0xb2, 0x4e, +0x48, 0x56, 0xdf, 0x3d, 0x4a, 0xdf, 0x33, 0x3e, 0xe0, 0x34, 0x40, 0xe0, +0x3b, 0x46, 0xe0, 0x41, 0x4e, 0xdd, 0x3a, 0x45, 0xd9, 0x33, 0x3f, 0xd6, +0x30, 0x3a, 0xd2, 0x2f, 0x39, 0xce, 0x2e, 0x38, 0xcb, 0x2f, 0x38, 0xc8, +0x37, 0x40, 0xc4, 0x41, 0x4b, 0xc1, 0x4c, 0x58, 0xbe, 0x3f, 0x49, 0x95, +0x45, 0x50, 0xa8, 0x48, 0x52, 0xb4, 0x44, 0x4d, 0xb1, 0x3f, 0x49, 0xae, +0x3d, 0x46, 0xab, 0x3a, 0x43, 0xa9, 0x37, 0x41, 0xa6, 0x36, 0x3f, 0xa4, +0x34, 0x3d, 0xa1, 0x33, 0x3a, 0x9f, 0x30, 0x38, 0x9c, 0x2e, 0x35, 0x9a, +0x2d, 0x34, 0x97, 0x2a, 0x32, 0x95, 0x29, 0x30, 0x93, 0x28, 0x2f, 0x91, +0x26, 0x2e, 0x8e, 0x25, 0x2c, 0x8c, 0x24, 0x2b, 0x8b, 0x24, 0x2a, 0x88, +0x23, 0x29, 0x86, 0x22, 0x28, 0x84, 0x22, 0x28, 0x83, 0x21, 0x27, 0x81, +0x20, 0x26, 0x7f, 0x1f, 0x25, 0x7d, 0x1f, 0x25, 0x7b, 0x20, 0x25, 0x7b, +0x20, 0x25, 0x79, 0x20, 0x25, 0x77, 0x1f, 0x25, 0x75, 0x20, 0x25, 0x74, +0x20, 0x25, 0x72, 0x20, 0x25, 0x71, 0x20, 0x25, 0x6f, 0x20, 0x25, 0x6e, +0x1f, 0x25, 0x6c, 0x1f, 0x25, 0x6c, 0x1f, 0x25, 0x6a, 0x1f, 0x25, 0x69, +0x1f, 0x24, 0x68, 0x1e, 0x23, 0x67, 0x1e, 0x23, 0x66, 0x1e, 0x23, 0x65, +0x1c, 0x22, 0x63, 0x1c, 0x22, 0x62, 0x1c, 0x21, 0x61, 0x1c, 0x21, 0x60, +0x1c, 0x21, 0x5f, 0x1b, 0x20, 0x5e, 0x1b, 0x20, 0x5d, 0x1b, 0x1f, 0x5c, +0x1a, 0x1f, 0x5b, 0x1a, 0x1f, 0x5a, 0x1a, 0x1e, 0x59, 0x1a, 0x1e, 0x58, +0x19, 0x1d, 0x57, 0x18, 0x1d, 0x56, 0x18, 0x1d, 0x56, 0x18, 0x1c, 0x55, +0x18, 0x1c, 0x54, 0x17, 0x1c, 0x53, 0x17, 0x1b, 0x52, 0x17, 0x1b, 0x52, +0x17, 0x1b, 0x51, 0x16, 0x1a, 0x50, 0x16, 0x1a, 0x4f, 0x16, 0x1a, 0x4f, +0x16, 0x1a, 0x4e, 0x15, 0x19, 0x4d, 0x15, 0x19, 0x4d, 0x15, 0x19, 0x4c, +0x15, 0x18, 0x4b, 0x14, 0x18, 0x4b, 0x14, 0x18, 0x4a, 0x13, 0x16, 0x49, +0x13, 0x16, 0x49, 0x13, 0x16, 0x48, 0x13, 0x16, 0x48, 0x13, 0x16, 0x47, +0x12, 0x15, 0x45, 0x12, 0x15, 0x45, 0x12, 0x15, 0x45, 0x12, 0x15, 0x45, +0x12, 0x15, 0x44, 0x12, 0x15, 0x44, 0x11, 0x14, 0x42, 0x11, 0x14, 0x42, +0x11, 0x14, 0x41, 0x10, 0x14, 0x41, 0x10, 0x13, 0x40, 0x10, 0x13, 0x40, +0x10, 0x13, 0x3f, 0x10, 0x13, 0x3f, 0x10, 0x13, 0x3e, 0x10, 0x13, 0x3e, +0x0f, 0x12, 0x3d, 0x0f, 0x12, 0x3d, 0x0f, 0x10, 0x37, 0x01, 0x01, 0x05, +0x1a, 0x1d, 0x46, 0x32, 0x39, 0x8d, 0x34, 0x3b, 0x94, 0x2a, 0x30, 0x7d, +0x27, 0x2d, 0x75, 0x27, 0x2d, 0x76, 0x26, 0x2d, 0x77, 0x26, 0x2c, 0x79, +0x25, 0x2c, 0x7b, 0x24, 0x2b, 0x7d, 0x25, 0x2a, 0x7e, 0x24, 0x2a, 0x7f, +0x24, 0x2a, 0x81, 0x23, 0x29, 0x83, 0x22, 0x29, 0x85, 0x22, 0x29, 0x87, +0x22, 0x2a, 0x89, 0x23, 0x2a, 0x8b, 0x24, 0x2a, 0x8c, 0x25, 0x2b, 0x8f, +0x25, 0x2c, 0x91, 0x26, 0x2d, 0x93, 0x26, 0x2e, 0x96, 0x28, 0x30, 0x97, +0x29, 0x31, 0x9a, 0x2b, 0x32, 0x9c, 0x2c, 0x35, 0x9f, 0x2e, 0x35, 0xa1, +0x2f, 0x38, 0xa4, 0x31, 0x3a, 0xa7, 0x31, 0x3a, 0xa9, 0x30, 0x39, 0xac, +0x30, 0x39, 0xaf, 0x2f, 0x39, 0xb1, 0x2e, 0x37, 0xb4, 0x2c, 0x36, 0xb7, +0x2b, 0x34, 0xbb, 0x28, 0x32, 0xbe, 0x2c, 0x35, 0xc0, 0x35, 0x3f, 0xc4, +0x44, 0x50, 0xc7, 0x46, 0x50, 0xa6, 0x49, 0x54, 0xaf, 0x50, 0x5c, 0xc1, +0x55, 0x62, 0xd2, 0x53, 0x62, 0xce, 0x53, 0x5f, 0xca, 0x51, 0x5f, 0xdf, +0x43, 0x50, 0xdf, 0x3a, 0x46, 0xdf, 0x3e, 0x4a, 0xde, 0x41, 0x4f, 0xde, +0x3f, 0x4d, 0xdd, 0x3f, 0x4d, 0xdd, 0x51, 0x60, 0xdd, 0x59, 0x68, 0xdc, +0x4b, 0x5a, 0xde, 0x5a, 0x6a, 0xdf, 0x16, 0x1c, 0x41, 0x53, 0x62, 0xe1, +0x4b, 0x5a, 0xe1, 0x4f, 0x5f, 0xe0, 0x59, 0x69, 0xd4, 0x18, 0x1e, 0x45, +0x17, 0x1d, 0x45, 0x16, 0x1c, 0x43, 0x47, 0x55, 0xa7, 0x53, 0x63, 0xda, +0xb6, 0xb7, 0x4d, 0xd7, 0xd5, 0x1c, 0xdb, 0xd4, 0x1c, 0xe0, 0xd9, 0x23, +0xdd, 0xd6, 0x1c, 0xd4, 0xcd, 0x1b, 0xd7, 0xd5, 0x1c, 0xd4, 0xcd, 0x1b, +0xdb, 0xd4, 0x1c, 0xcd, 0xc8, 0x0c, 0xa3, 0xa1, 0x20, 0xa2, 0x9f, 0x1d, +0xcd, 0xc8, 0x0c, 0xde, 0xdb, 0x1d, 0xe3, 0xdd, 0x30, 0xdd, 0xd6, 0x1c, +0x46, 0x52, 0xdf, 0x42, 0x4f, 0xe0, 0x37, 0x43, 0xe1, 0x2e, 0x39, 0xe0, +0x31, 0x3c, 0xdd, 0x39, 0x44, 0xda, 0x40, 0x4b, 0xd6, 0x39, 0x44, 0xd3, +0x33, 0x3e, 0xcf, 0x2f, 0x39, 0xcc, 0x2f, 0x38, 0xc8, 0x2c, 0x36, 0xc5, +0x2b, 0x34, 0xc1, 0x31, 0x3b, 0xbe, 0x39, 0x43, 0xbc, 0x43, 0x4d, 0xb8, +0x41, 0x4a, 0x9a, 0x43, 0x4d, 0xa0, 0x47, 0x50, 0xb0, 0x42, 0x4b, 0xad, +0x3e, 0x48, 0xaa, 0x3b, 0x44, 0xa7, 0x39, 0x41, 0xa5, 0x37, 0x40, 0xa2, +0x35, 0x3e, 0xa0, 0x33, 0x3b, 0x9d, 0x31, 0x39, 0x9b, 0x30, 0x38, 0x98, +0x2e, 0x35, 0x96, 0x2c, 0x34, 0x94, 0x2a, 0x32, 0x91, 0x29, 0x30, 0x90, +0x27, 0x2e, 0x8d, 0x26, 0x2d, 0x8b, 0x25, 0x2c, 0x8a, 0x24, 0x2b, 0x88, +0x23, 0x2a, 0x85, 0x23, 0x29, 0x84, 0x22, 0x28, 0x82, 0x21, 0x27, 0x80, +0x20, 0x26, 0x7e, 0x20, 0x25, 0x7d, 0x1f, 0x25, 0x7b, 0x1e, 0x24, 0x7a, +0x1e, 0x24, 0x78, 0x1e, 0x24, 0x77, 0x1e, 0x24, 0x75, 0x1e, 0x23, 0x73, +0x1e, 0x23, 0x72, 0x1e, 0x23, 0x70, 0x1e, 0x23, 0x6f, 0x1e, 0x23, 0x6e, +0x1e, 0x23, 0x6c, 0x1e, 0x23, 0x6c, 0x1e, 0x23, 0x6a, 0x1e, 0x23, 0x69, +0x1e, 0x23, 0x68, 0x1e, 0x23, 0x67, 0x1e, 0x22, 0x65, 0x1d, 0x22, 0x64, +0x1c, 0x22, 0x63, 0x1c, 0x21, 0x62, 0x1c, 0x21, 0x61, 0x1c, 0x20, 0x60, +0x1c, 0x20, 0x5f, 0x1b, 0x20, 0x5e, 0x1b, 0x20, 0x5d, 0x1b, 0x1f, 0x5c, +0x1a, 0x1f, 0x5b, 0x1a, 0x1e, 0x5a, 0x1a, 0x1e, 0x59, 0x19, 0x1d, 0x58, +0x19, 0x1d, 0x57, 0x18, 0x1d, 0x56, 0x18, 0x1c, 0x55, 0x18, 0x1c, 0x55, +0x18, 0x1c, 0x54, 0x17, 0x1c, 0x53, 0x17, 0x1b, 0x52, 0x17, 0x1b, 0x51, +0x17, 0x1b, 0x51, 0x16, 0x1a, 0x50, 0x16, 0x1a, 0x4f, 0x16, 0x1a, 0x4e, +0x16, 0x19, 0x4e, 0x15, 0x19, 0x4d, 0x15, 0x19, 0x4c, 0x15, 0x19, 0x4c, +0x14, 0x18, 0x4b, 0x14, 0x18, 0x4a, 0x14, 0x18, 0x4a, 0x13, 0x16, 0x49, +0x13, 0x16, 0x49, 0x13, 0x16, 0x48, 0x13, 0x16, 0x47, 0x13, 0x16, 0x47, +0x12, 0x15, 0x45, 0x12, 0x15, 0x45, 0x12, 0x15, 0x45, 0x12, 0x15, 0x45, +0x12, 0x15, 0x44, 0x12, 0x15, 0x44, 0x11, 0x14, 0x42, 0x11, 0x14, 0x42, +0x10, 0x14, 0x41, 0x10, 0x14, 0x41, 0x10, 0x13, 0x40, 0x10, 0x13, 0x40, +0x10, 0x13, 0x3f, 0x10, 0x13, 0x3f, 0x10, 0x13, 0x3e, 0x0f, 0x12, 0x3e, +0x0f, 0x12, 0x3d, 0x0f, 0x12, 0x3d, 0x0f, 0x10, 0x37, 0x01, 0x01, 0x05, +0x17, 0x1b, 0x45, 0x2e, 0x37, 0x8d, 0x2f, 0x37, 0x93, 0x28, 0x2e, 0x7d, +0x24, 0x29, 0x74, 0x24, 0x29, 0x75, 0x24, 0x29, 0x77, 0x23, 0x29, 0x78, +0x22, 0x28, 0x7a, 0x22, 0x27, 0x7c, 0x21, 0x28, 0x7e, 0x21, 0x28, 0x7f, +0x21, 0x27, 0x80, 0x20, 0x27, 0x82, 0x21, 0x28, 0x85, 0x22, 0x29, 0x86, +0x23, 0x29, 0x88, 0x23, 0x2a, 0x8a, 0x24, 0x2a, 0x8c, 0x25, 0x2b, 0x8e, +0x25, 0x2c, 0x90, 0x26, 0x2d, 0x92, 0x27, 0x2f, 0x94, 0x28, 0x30, 0x97, +0x2a, 0x31, 0x99, 0x2b, 0x33, 0x9c, 0x2d, 0x35, 0x9d, 0x2f, 0x37, 0xa0, +0x2f, 0x36, 0xa3, 0x2f, 0x36, 0xa5, 0x2e, 0x36, 0xa7, 0x2e, 0x36, 0xab, +0x2e, 0x36, 0xad, 0x2b, 0x35, 0xb0, 0x2b, 0x33, 0xb3, 0x29, 0x32, 0xb6, +0x27, 0x30, 0xb9, 0x2d, 0x36, 0xbc, 0x37, 0x40, 0xbe, 0x45, 0x50, 0xc1, +0x46, 0x51, 0xa7, 0x4b, 0x56, 0xb7, 0x4f, 0x5b, 0xc5, 0x51, 0x5f, 0xce, +0x53, 0x60, 0xd1, 0x55, 0x62, 0xd2, 0x4f, 0x5d, 0xd8, 0x40, 0x4d, 0xdc, +0x36, 0x41, 0xdf, 0x39, 0x45, 0xdf, 0x3d, 0x49, 0xdf, 0x3c, 0x48, 0xdf, +0x3a, 0x46, 0xde, 0x45, 0x52, 0xde, 0x58, 0x67, 0xde, 0x4c, 0x5b, 0xdf, +0x46, 0x55, 0xe0, 0x50, 0x5e, 0xb9, 0x56, 0x64, 0xc8, 0x45, 0x54, 0xe2, +0x47, 0x56, 0xe2, 0x4d, 0x5c, 0xe1, 0x5c, 0x6c, 0xde, 0x16, 0x1c, 0x42, +0x15, 0x1b, 0x41, 0x14, 0x1a, 0x40, 0x57, 0x68, 0xd7, 0x4e, 0x5e, 0xdc, +0x50, 0x60, 0xdb, 0xb2, 0xb3, 0x41, 0xe1, 0xdf, 0x2a, 0xd7, 0xd5, 0x1c, +0xbb, 0xb5, 0x14, 0xd7, 0xd0, 0x1c, 0xd9, 0xd2, 0x1c, 0xd1, 0xcf, 0x1a, +0xdf, 0xd8, 0x20, 0xde, 0xd8, 0x1f, 0xe1, 0xda, 0x26, 0xdf, 0xd9, 0x22, +0xdf, 0xd9, 0x22, 0xdd, 0xd6, 0x1c, 0xd5, 0xcf, 0x1c, 0xc5, 0xc3, 0x37, +0x42, 0x4f, 0xe0, 0x40, 0x4d, 0xe1, 0x3c, 0x49, 0xe0, 0x33, 0x3f, 0xdd, +0x2d, 0x37, 0xd9, 0x31, 0x3c, 0xd6, 0x37, 0x42, 0xd3, 0x3f, 0x4a, 0xcf, +0x37, 0x42, 0xcc, 0x32, 0x3c, 0xc8, 0x2e, 0x38, 0xc6, 0x2d, 0x36, 0xc2, +0x2c, 0x35, 0xbf, 0x2b, 0x34, 0xbc, 0x2d, 0x36, 0xb9, 0x34, 0x3d, 0xb6, +0x3c, 0x46, 0xb3, 0x45, 0x4f, 0xb1, 0x4a, 0x54, 0xad, 0x45, 0x4f, 0xab, +0x41, 0x4a, 0xa8, 0x3e, 0x47, 0xa6, 0x3a, 0x43, 0xa3, 0x38, 0x41, 0xa1, +0x36, 0x3e, 0x9e, 0x33, 0x3c, 0x9c, 0x32, 0x3a, 0x9a, 0x30, 0x38, 0x97, +0x2e, 0x36, 0x95, 0x2d, 0x34, 0x93, 0x2c, 0x33, 0x90, 0x29, 0x31, 0x8f, +0x28, 0x2f, 0x8c, 0x27, 0x2e, 0x8a, 0x26, 0x2d, 0x89, 0x25, 0x2c, 0x87, +0x23, 0x2a, 0x85, 0x22, 0x29, 0x83, 0x22, 0x28, 0x81, 0x22, 0x27, 0x80, +0x21, 0x26, 0x7e, 0x20, 0x25, 0x7c, 0x1f, 0x25, 0x7a, 0x1f, 0x24, 0x79, +0x1e, 0x23, 0x78, 0x1d, 0x23, 0x76, 0x1c, 0x22, 0x74, 0x1c, 0x22, 0x73, +0x1c, 0x22, 0x71, 0x1c, 0x22, 0x70, 0x1d, 0x21, 0x6e, 0x1d, 0x21, 0x6d, +0x1d, 0x22, 0x6c, 0x1d, 0x21, 0x6b, 0x1c, 0x21, 0x6a, 0x1d, 0x22, 0x69, +0x1c, 0x21, 0x67, 0x1c, 0x21, 0x66, 0x1c, 0x21, 0x65, 0x1c, 0x21, 0x64, +0x1c, 0x21, 0x63, 0x1c, 0x21, 0x62, 0x1c, 0x21, 0x61, 0x1c, 0x20, 0x5f, +0x1b, 0x20, 0x5e, 0x1b, 0x1f, 0x5d, 0x1a, 0x1f, 0x5c, 0x1a, 0x1f, 0x5b, +0x1a, 0x1e, 0x5a, 0x1a, 0x1e, 0x5a, 0x1a, 0x1e, 0x59, 0x19, 0x1d, 0x58, +0x18, 0x1d, 0x57, 0x18, 0x1c, 0x56, 0x18, 0x1c, 0x55, 0x18, 0x1c, 0x54, +0x17, 0x1c, 0x54, 0x17, 0x1b, 0x53, 0x17, 0x1b, 0x52, 0x17, 0x1b, 0x51, +0x16, 0x1a, 0x50, 0x16, 0x1a, 0x50, 0x16, 0x1a, 0x4f, 0x16, 0x19, 0x4e, +0x16, 0x19, 0x4e, 0x15, 0x19, 0x4d, 0x15, 0x19, 0x4c, 0x15, 0x19, 0x4c, +0x14, 0x18, 0x4b, 0x14, 0x18, 0x4a, 0x13, 0x17, 0x49, 0x13, 0x16, 0x49, +0x13, 0x16, 0x48, 0x13, 0x16, 0x48, 0x13, 0x16, 0x47, 0x13, 0x16, 0x47, +0x12, 0x15, 0x45, 0x12, 0x15, 0x45, 0x12, 0x15, 0x45, 0x12, 0x15, 0x45, +0x12, 0x15, 0x44, 0x12, 0x14, 0x43, 0x11, 0x14, 0x42, 0x11, 0x14, 0x41, +0x10, 0x14, 0x41, 0x10, 0x13, 0x40, 0x10, 0x13, 0x40, 0x10, 0x13, 0x40, +0x10, 0x13, 0x3f, 0x10, 0x13, 0x3f, 0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3e, +0x0f, 0x12, 0x3d, 0x0f, 0x12, 0x3d, 0x0f, 0x10, 0x36, 0x01, 0x01, 0x05, +0x16, 0x1a, 0x45, 0x2c, 0x32, 0x8b, 0x2d, 0x35, 0x93, 0x26, 0x2b, 0x7c, +0x21, 0x27, 0x74, 0x21, 0x26, 0x74, 0x20, 0x26, 0x76, 0x20, 0x26, 0x78, +0x1f, 0x26, 0x79, 0x1f, 0x26, 0x7b, 0x1f, 0x25, 0x7d, 0x1f, 0x25, 0x7e, +0x20, 0x26, 0x80, 0x20, 0x27, 0x82, 0x21, 0x28, 0x84, 0x22, 0x28, 0x85, +0x23, 0x28, 0x87, 0x23, 0x29, 0x89, 0x24, 0x2a, 0x8b, 0x24, 0x2b, 0x8d, +0x25, 0x2c, 0x8f, 0x26, 0x2e, 0x91, 0x28, 0x2f, 0x93, 0x2a, 0x31, 0x96, +0x2b, 0x33, 0x97, 0x2c, 0x34, 0x9a, 0x2d, 0x35, 0x9c, 0x2d, 0x35, 0x9f, +0x2c, 0x35, 0xa1, 0x2d, 0x35, 0xa4, 0x2b, 0x34, 0xa6, 0x2b, 0x34, 0xa8, +0x2a, 0x32, 0xab, 0x29, 0x31, 0xae, 0x27, 0x2f, 0xb1, 0x27, 0x2f, 0xb4, +0x2e, 0x37, 0xb7, 0x37, 0x40, 0xb9, 0x46, 0x50, 0xbc, 0x48, 0x52, 0xaf, +0x4c, 0x58, 0xc0, 0x4e, 0x5a, 0xc5, 0x4e, 0x5a, 0xc8, 0x50, 0x5c, 0xcb, +0x51, 0x5f, 0xce, 0x4c, 0x59, 0xd1, 0x40, 0x4c, 0xd5, 0x36, 0x41, 0xd8, +0x36, 0x41, 0xdb, 0x38, 0x44, 0xde, 0x39, 0x44, 0xe0, 0x36, 0x42, 0xdf, +0x3b, 0x47, 0xdf, 0x4b, 0x58, 0xe0, 0x4e, 0x5b, 0xe0, 0x42, 0x50, 0xe0, +0x4d, 0x5b, 0xe1, 0x3d, 0x48, 0x88, 0x50, 0x5e, 0xe2, 0x41, 0x4f, 0xe3, +0x43, 0x51, 0xe2, 0x4b, 0x5a, 0xe1, 0x5c, 0x6c, 0xe0, 0x14, 0x1a, 0x3e, +0x14, 0x19, 0x3d, 0x13, 0x19, 0x3d, 0x54, 0x64, 0xdd, 0x4a, 0x58, 0xdc, +0x4b, 0x5a, 0xdc, 0x57, 0x68, 0xdc, 0xa0, 0xa3, 0x66, 0xe0, 0xd9, 0x23, +0xdb, 0xd4, 0x1c, 0xd1, 0xcf, 0x1a, 0xcb, 0xc4, 0x18, 0xcf, 0xc9, 0x1a, +0xce, 0xcc, 0x19, 0xdb, 0xd4, 0x1c, 0xe5, 0xdf, 0x34, 0xe2, 0xdc, 0x2d, +0xd3, 0xcf, 0x18, 0x8c, 0x8a, 0x25, 0x3d, 0x3f, 0x28, 0x3e, 0x48, 0x8d, +0x47, 0x54, 0xe1, 0x3f, 0x4b, 0xdf, 0x3d, 0x49, 0xdc, 0x39, 0x45, 0xd9, +0x31, 0x3c, 0xd6, 0x2c, 0x36, 0xd3, 0x2f, 0x3a, 0xcf, 0x37, 0x40, 0xcc, +0x3c, 0x46, 0xc9, 0x37, 0x40, 0xc6, 0x32, 0x3b, 0xc3, 0x2e, 0x36, 0xc0, +0x2b, 0x35, 0xbd, 0x2a, 0x33, 0xb9, 0x2a, 0x32, 0xb7, 0x2a, 0x32, 0xb4, +0x2f, 0x39, 0xb1, 0x36, 0x3f, 0xae, 0x3d, 0x47, 0xac, 0x46, 0x50, 0xa9, +0x43, 0x4d, 0xa6, 0x40, 0x48, 0xa4, 0x3d, 0x45, 0xa2, 0x39, 0x42, 0x9f, +0x36, 0x3f, 0x9d, 0x34, 0x3d, 0x9a, 0x32, 0x3a, 0x98, 0x31, 0x39, 0x96, +0x2f, 0x37, 0x94, 0x2e, 0x35, 0x91, 0x2d, 0x34, 0x90, 0x2b, 0x32, 0x8e, +0x29, 0x31, 0x8b, 0x28, 0x2f, 0x8a, 0x27, 0x2d, 0x88, 0x25, 0x2c, 0x86, +0x24, 0x2b, 0x84, 0x23, 0x2a, 0x82, 0x22, 0x29, 0x81, 0x22, 0x27, 0x7f, +0x21, 0x26, 0x7d, 0x20, 0x26, 0x7b, 0x1f, 0x25, 0x7a, 0x1f, 0x24, 0x79, +0x1e, 0x23, 0x77, 0x1e, 0x23, 0x75, 0x1d, 0x23, 0x74, 0x1c, 0x22, 0x72, +0x1c, 0x22, 0x71, 0x1b, 0x21, 0x6f, 0x1b, 0x21, 0x6e, 0x1b, 0x20, 0x6c, +0x1b, 0x20, 0x6c, 0x1b, 0x20, 0x6b, 0x1b, 0x20, 0x6a, 0x1b, 0x20, 0x68, +0x1b, 0x20, 0x67, 0x1c, 0x20, 0x66, 0x1b, 0x20, 0x65, 0x1b, 0x1f, 0x63, +0x1b, 0x20, 0x62, 0x1b, 0x20, 0x61, 0x1b, 0x1f, 0x60, 0x1b, 0x20, 0x5f, +0x1b, 0x1f, 0x5e, 0x1b, 0x1f, 0x5d, 0x1a, 0x1f, 0x5c, 0x1a, 0x1e, 0x5b, +0x1a, 0x1e, 0x5a, 0x19, 0x1d, 0x59, 0x19, 0x1d, 0x58, 0x19, 0x1d, 0x57, +0x18, 0x1d, 0x57, 0x18, 0x1c, 0x56, 0x18, 0x1c, 0x55, 0x17, 0x1b, 0x54, +0x17, 0x1b, 0x53, 0x17, 0x1b, 0x53, 0x17, 0x1b, 0x52, 0x17, 0x1b, 0x51, +0x16, 0x1a, 0x50, 0x16, 0x1a, 0x50, 0x16, 0x1a, 0x4f, 0x16, 0x19, 0x4e, +0x15, 0x19, 0x4d, 0x15, 0x19, 0x4d, 0x15, 0x19, 0x4c, 0x14, 0x18, 0x4b, +0x14, 0x18, 0x4b, 0x14, 0x18, 0x4a, 0x13, 0x17, 0x49, 0x13, 0x16, 0x49, +0x13, 0x16, 0x48, 0x13, 0x16, 0x48, 0x13, 0x16, 0x47, 0x13, 0x16, 0x47, +0x12, 0x15, 0x45, 0x12, 0x15, 0x45, 0x12, 0x15, 0x45, 0x12, 0x15, 0x44, +0x12, 0x15, 0x44, 0x12, 0x14, 0x43, 0x11, 0x14, 0x42, 0x10, 0x14, 0x41, +0x10, 0x14, 0x41, 0x10, 0x13, 0x40, 0x10, 0x13, 0x40, 0x10, 0x13, 0x3f, +0x10, 0x13, 0x3f, 0x10, 0x13, 0x3f, 0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3e, +0x0f, 0x12, 0x3d, 0x0f, 0x12, 0x3d, 0x0f, 0x10, 0x36, 0x01, 0x01, 0x05, +0x14, 0x17, 0x45, 0x29, 0x2f, 0x8b, 0x2a, 0x31, 0x90, 0x23, 0x29, 0x7c, +0x1e, 0x24, 0x72, 0x1e, 0x24, 0x74, 0x1e, 0x24, 0x75, 0x1e, 0x24, 0x77, +0x1d, 0x24, 0x79, 0x1d, 0x24, 0x7a, 0x1e, 0x25, 0x7c, 0x1f, 0x25, 0x7d, +0x20, 0x26, 0x7f, 0x20, 0x27, 0x81, 0x21, 0x28, 0x83, 0x21, 0x28, 0x84, +0x22, 0x28, 0x86, 0x24, 0x29, 0x88, 0x24, 0x2a, 0x8a, 0x24, 0x2c, 0x8b, +0x26, 0x2d, 0x8e, 0x27, 0x2f, 0x90, 0x29, 0x30, 0x92, 0x2a, 0x31, 0x94, +0x2a, 0x32, 0x96, 0x2a, 0x32, 0x98, 0x2a, 0x32, 0x9b, 0x2b, 0x33, 0x9d, +0x2b, 0x32, 0xa0, 0x2a, 0x32, 0xa2, 0x29, 0x31, 0xa4, 0x28, 0x30, 0xa7, +0x27, 0x2f, 0xa9, 0x27, 0x2e, 0xac, 0x28, 0x30, 0xae, 0x2e, 0x37, 0xb1, +0x38, 0x41, 0xb4, 0x46, 0x51, 0xb7, 0x4c, 0x57, 0xb9, 0x4a, 0x55, 0xbc, +0x4a, 0x56, 0xbf, 0x4b, 0x56, 0xc2, 0x4c, 0x57, 0xc5, 0x4e, 0x5a, 0xc8, +0x4a, 0x57, 0xcb, 0x3f, 0x4b, 0xce, 0x36, 0x40, 0xd1, 0x35, 0x40, 0xd4, +0x36, 0x41, 0xd7, 0x37, 0x43, 0xda, 0x34, 0x40, 0xdd, 0x33, 0x3e, 0xe0, +0x3f, 0x4b, 0xe0, 0x4f, 0x5d, 0xe0, 0x42, 0x50, 0xe1, 0x3d, 0x49, 0xe1, +0x54, 0x62, 0xe2, 0x5d, 0x6c, 0xe1, 0x42, 0x50, 0xe3, 0x3e, 0x4b, 0xe3, +0x40, 0x4e, 0xe3, 0x4a, 0x58, 0xe2, 0x5c, 0x6c, 0xe1, 0x13, 0x18, 0x3b, +0x13, 0x18, 0x3b, 0x12, 0x17, 0x3a, 0x4d, 0x5c, 0xde, 0x45, 0x53, 0xde, +0x47, 0x55, 0xdd, 0x52, 0x61, 0xdd, 0x49, 0x56, 0xdd, 0x65, 0x6e, 0xae, +0x9d, 0x9f, 0x66, 0xd2, 0xcd, 0x1f, 0xd4, 0xcd, 0x1b, 0xd4, 0xcd, 0x1b, +0xc1, 0xbf, 0x16, 0x9f, 0x9c, 0x18, 0x97, 0x97, 0x3a, 0x74, 0x7e, 0xa3, +0x55, 0x63, 0xcc, 0x4e, 0x5a, 0xb6, 0x1c, 0x22, 0x49, 0x0d, 0x11, 0x2f, +0x58, 0x66, 0xde, 0x3e, 0x4a, 0xdb, 0x3c, 0x48, 0xd7, 0x3c, 0x47, 0xd5, +0x36, 0x41, 0xd2, 0x2f, 0x3a, 0xcf, 0x2b, 0x35, 0xcc, 0x2f, 0x39, 0xc9, +0x34, 0x3e, 0xc6, 0x3b, 0x45, 0xc3, 0x34, 0x3e, 0xc0, 0x31, 0x39, 0xbd, +0x2d, 0x36, 0xba, 0x2b, 0x34, 0xb7, 0x2a, 0x32, 0xb5, 0x2a, 0x32, 0xb2, +0x29, 0x31, 0xaf, 0x2c, 0x34, 0xac, 0x31, 0x3a, 0xa9, 0x37, 0x40, 0xa7, +0x3e, 0x47, 0xa5, 0x42, 0x4c, 0xa2, 0x3e, 0x47, 0xa0, 0x3b, 0x44, 0x9e, +0x38, 0x40, 0x9b, 0x35, 0x3d, 0x99, 0x33, 0x3b, 0x97, 0x31, 0x39, 0x94, +0x30, 0x37, 0x93, 0x2e, 0x36, 0x90, 0x2d, 0x34, 0x8f, 0x2b, 0x32, 0x8c, +0x2b, 0x32, 0x8a, 0x29, 0x30, 0x89, 0x28, 0x2e, 0x87, 0x27, 0x2d, 0x85, +0x25, 0x2c, 0x83, 0x24, 0x2b, 0x82, 0x23, 0x2a, 0x80, 0x22, 0x28, 0x7e, +0x21, 0x27, 0x7c, 0x20, 0x26, 0x7a, 0x20, 0x26, 0x79, 0x1f, 0x24, 0x78, +0x1e, 0x23, 0x76, 0x1e, 0x23, 0x75, 0x1d, 0x22, 0x73, 0x1c, 0x22, 0x72, +0x1c, 0x21, 0x70, 0x1c, 0x21, 0x6f, 0x1b, 0x20, 0x6e, 0x1a, 0x20, 0x6c, +0x1a, 0x1f, 0x6c, 0x1a, 0x1f, 0x6a, 0x1a, 0x1f, 0x69, 0x1a, 0x1f, 0x68, +0x1a, 0x1f, 0x67, 0x19, 0x1e, 0x65, 0x1a, 0x1e, 0x64, 0x1a, 0x1e, 0x63, +0x1a, 0x1e, 0x62, 0x1a, 0x1e, 0x61, 0x1a, 0x1e, 0x60, 0x1a, 0x1f, 0x5f, +0x19, 0x1e, 0x5e, 0x1a, 0x1e, 0x5d, 0x1a, 0x1e, 0x5c, 0x19, 0x1e, 0x5b, +0x1a, 0x1e, 0x5a, 0x19, 0x1d, 0x59, 0x19, 0x1d, 0x58, 0x18, 0x1c, 0x57, +0x18, 0x1c, 0x56, 0x18, 0x1c, 0x56, 0x18, 0x1c, 0x55, 0x17, 0x1b, 0x54, +0x17, 0x1b, 0x53, 0x17, 0x1b, 0x52, 0x17, 0x1b, 0x52, 0x16, 0x1a, 0x51, +0x16, 0x1a, 0x50, 0x16, 0x1a, 0x4f, 0x16, 0x1a, 0x4f, 0x16, 0x19, 0x4e, +0x15, 0x19, 0x4d, 0x15, 0x19, 0x4d, 0x15, 0x18, 0x4c, 0x14, 0x18, 0x4b, +0x14, 0x18, 0x4b, 0x14, 0x18, 0x4a, 0x13, 0x16, 0x49, 0x13, 0x16, 0x49, +0x13, 0x16, 0x48, 0x13, 0x16, 0x48, 0x13, 0x16, 0x47, 0x12, 0x15, 0x45, +0x12, 0x15, 0x45, 0x12, 0x15, 0x45, 0x12, 0x15, 0x45, 0x12, 0x15, 0x44, +0x12, 0x15, 0x44, 0x12, 0x14, 0x43, 0x11, 0x14, 0x42, 0x10, 0x14, 0x41, +0x10, 0x14, 0x41, 0x10, 0x13, 0x40, 0x10, 0x13, 0x40, 0x10, 0x13, 0x3f, +0x10, 0x13, 0x3f, 0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3e, +0x0f, 0x12, 0x3d, 0x0f, 0x12, 0x3d, 0x0f, 0x10, 0x36, 0x01, 0x01, 0x05, +0x13, 0x16, 0x45, 0x25, 0x2d, 0x8a, 0x27, 0x2e, 0x90, 0x21, 0x27, 0x7b, +0x1d, 0x22, 0x72, 0x1d, 0x22, 0x74, 0x1d, 0x22, 0x75, 0x1d, 0x23, 0x76, +0x1d, 0x23, 0x78, 0x1e, 0x24, 0x7a, 0x1e, 0x25, 0x7b, 0x1f, 0x25, 0x7d, +0x20, 0x26, 0x7e, 0x21, 0x27, 0x80, 0x21, 0x27, 0x82, 0x22, 0x28, 0x84, +0x23, 0x28, 0x85, 0x24, 0x2a, 0x87, 0x24, 0x2b, 0x89, 0x26, 0x2d, 0x8b, +0x26, 0x2e, 0x8c, 0x28, 0x2f, 0x8f, 0x29, 0x30, 0x91, 0x29, 0x30, 0x93, +0x29, 0x30, 0x95, 0x29, 0x30, 0x97, 0x29, 0x30, 0x99, 0x29, 0x30, 0x9b, +0x28, 0x30, 0x9e, 0x27, 0x2f, 0xa0, 0x26, 0x2e, 0xa3, 0x26, 0x2d, 0xa5, +0x24, 0x2d, 0xa7, 0x28, 0x31, 0xaa, 0x2f, 0x38, 0xad, 0x38, 0x41, 0xaf, +0x45, 0x50, 0xb2, 0x48, 0x52, 0xb4, 0x47, 0x52, 0xb7, 0x48, 0x52, 0xba, +0x47, 0x53, 0xbc, 0x49, 0x54, 0xbf, 0x4b, 0x56, 0xc2, 0x49, 0x55, 0xc5, +0x3f, 0x49, 0xc7, 0x36, 0x40, 0xcb, 0x33, 0x3d, 0xce, 0x35, 0x3f, 0xd1, +0x37, 0x41, 0xd3, 0x34, 0x3f, 0xd6, 0x32, 0x3d, 0xd9, 0x38, 0x43, 0xdc, +0x44, 0x50, 0xdf, 0x43, 0x50, 0xe2, 0x3a, 0x46, 0xe2, 0x42, 0x4f, 0xe2, +0x5c, 0x6b, 0xe3, 0x4c, 0x5a, 0xe3, 0x39, 0x45, 0xe4, 0x3b, 0x47, 0xe4, +0x3f, 0x4b, 0xe3, 0x49, 0x56, 0xe2, 0x5d, 0x6c, 0xe2, 0x12, 0x17, 0x39, +0x11, 0x16, 0x38, 0x21, 0x29, 0x54, 0x47, 0x56, 0xdf, 0x41, 0x4f, 0xde, +0x42, 0x50, 0xde, 0x4c, 0x5a, 0xde, 0x46, 0x53, 0xde, 0x3d, 0x4a, 0xde, +0x3f, 0x4c, 0xde, 0x3b, 0x47, 0xdf, 0x32, 0x3e, 0xdf, 0x3e, 0x4b, 0xdf, +0x54, 0x62, 0xdf, 0x44, 0x4f, 0x9c, 0x35, 0x3f, 0x7b, 0x56, 0x63, 0xcf, +0x59, 0x68, 0xe1, 0x5a, 0x68, 0xe1, 0x48, 0x54, 0xa8, 0x0d, 0x11, 0x30, +0x2e, 0x35, 0x69, 0x4b, 0x58, 0xd7, 0x3b, 0x47, 0xd4, 0x3a, 0x46, 0xd1, +0x3a, 0x44, 0xce, 0x34, 0x3e, 0xcc, 0x2f, 0x38, 0xc8, 0x2a, 0x33, 0xc6, +0x2e, 0x37, 0xc3, 0x33, 0x3d, 0xc0, 0x39, 0x42, 0xbd, 0x33, 0x3d, 0xbb, +0x2f, 0x39, 0xb8, 0x2c, 0x34, 0xb5, 0x2a, 0x32, 0xb3, 0x29, 0x31, 0xb0, +0x28, 0x30, 0xad, 0x27, 0x2f, 0xaa, 0x29, 0x31, 0xa8, 0x2d, 0x35, 0xa6, +0x33, 0x3c, 0xa3, 0x39, 0x41, 0xa1, 0x3f, 0x48, 0x9e, 0x3d, 0x45, 0x9c, +0x3a, 0x42, 0x99, 0x37, 0x40, 0x98, 0x35, 0x3c, 0x95, 0x31, 0x3a, 0x94, +0x30, 0x37, 0x91, 0x2e, 0x37, 0x8f, 0x2d, 0x35, 0x8d, 0x2d, 0x33, 0x8b, +0x2b, 0x31, 0x89, 0x2a, 0x31, 0x88, 0x28, 0x2f, 0x86, 0x27, 0x2e, 0x84, +0x27, 0x2d, 0x82, 0x25, 0x2b, 0x81, 0x23, 0x2a, 0x7f, 0x22, 0x29, 0x7d, +0x21, 0x28, 0x7b, 0x21, 0x27, 0x7a, 0x20, 0x26, 0x78, 0x20, 0x25, 0x77, +0x1f, 0x24, 0x76, 0x1e, 0x23, 0x74, 0x1e, 0x22, 0x73, 0x1d, 0x22, 0x71, +0x1c, 0x21, 0x70, 0x1c, 0x21, 0x6e, 0x1b, 0x20, 0x6d, 0x1b, 0x1f, 0x6b, +0x1a, 0x1f, 0x6b, 0x1a, 0x1e, 0x69, 0x19, 0x1e, 0x69, 0x19, 0x1d, 0x67, +0x19, 0x1d, 0x66, 0x19, 0x1d, 0x65, 0x19, 0x1d, 0x64, 0x19, 0x1d, 0x63, +0x19, 0x1d, 0x62, 0x19, 0x1d, 0x61, 0x19, 0x1d, 0x60, 0x19, 0x1d, 0x5e, +0x18, 0x1d, 0x5d, 0x19, 0x1d, 0x5d, 0x19, 0x1d, 0x5c, 0x18, 0x1d, 0x5b, +0x19, 0x1d, 0x5a, 0x18, 0x1d, 0x59, 0x18, 0x1c, 0x58, 0x18, 0x1c, 0x57, +0x18, 0x1c, 0x56, 0x17, 0x1b, 0x55, 0x17, 0x1b, 0x54, 0x17, 0x1b, 0x54, +0x17, 0x1b, 0x53, 0x17, 0x1b, 0x52, 0x16, 0x1a, 0x51, 0x16, 0x1a, 0x51, +0x16, 0x1a, 0x50, 0x16, 0x19, 0x4f, 0x15, 0x19, 0x4e, 0x15, 0x19, 0x4e, +0x15, 0x19, 0x4d, 0x15, 0x18, 0x4c, 0x15, 0x18, 0x4c, 0x14, 0x18, 0x4b, +0x14, 0x18, 0x4a, 0x14, 0x18, 0x4a, 0x13, 0x16, 0x49, 0x13, 0x16, 0x49, +0x13, 0x16, 0x48, 0x13, 0x16, 0x47, 0x13, 0x16, 0x47, 0x12, 0x15, 0x45, +0x12, 0x15, 0x45, 0x12, 0x15, 0x45, 0x12, 0x15, 0x45, 0x12, 0x15, 0x44, +0x12, 0x15, 0x44, 0x11, 0x14, 0x42, 0x10, 0x14, 0x42, 0x10, 0x14, 0x41, +0x10, 0x14, 0x41, 0x10, 0x13, 0x40, 0x10, 0x13, 0x40, 0x10, 0x13, 0x3f, +0x10, 0x13, 0x3f, 0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3d, +0x0f, 0x12, 0x3d, 0x0f, 0x12, 0x3d, 0x0f, 0x10, 0x36, 0x01, 0x01, 0x05, +0x12, 0x16, 0x44, 0x24, 0x2b, 0x8a, 0x25, 0x2c, 0x8f, 0x1f, 0x25, 0x7a, +0x1c, 0x21, 0x72, 0x1c, 0x21, 0x72, 0x1d, 0x22, 0x74, 0x1d, 0x23, 0x76, +0x1d, 0x23, 0x77, 0x1e, 0x24, 0x79, 0x1e, 0x25, 0x7b, 0x1f, 0x25, 0x7c, +0x1f, 0x26, 0x7d, 0x20, 0x27, 0x7f, 0x21, 0x27, 0x81, 0x22, 0x28, 0x83, +0x23, 0x29, 0x84, 0x24, 0x2a, 0x86, 0x25, 0x2c, 0x88, 0x26, 0x2e, 0x8a, +0x27, 0x2e, 0x8b, 0x27, 0x2f, 0x8d, 0x27, 0x2f, 0x90, 0x27, 0x2f, 0x91, +0x28, 0x2f, 0x94, 0x27, 0x2f, 0x96, 0x27, 0x2f, 0x98, 0x26, 0x2d, 0x9a, +0x25, 0x2d, 0x9c, 0x25, 0x2c, 0x9f, 0x24, 0x2b, 0xa1, 0x24, 0x2c, 0xa3, +0x29, 0x31, 0xa6, 0x2f, 0x38, 0xa8, 0x38, 0x41, 0xaa, 0x44, 0x4e, 0xad, +0x44, 0x4e, 0xb0, 0x44, 0x4f, 0xb2, 0x44, 0x4e, 0xb4, 0x45, 0x4f, 0xb7, +0x46, 0x50, 0xba, 0x47, 0x53, 0xbc, 0x47, 0x51, 0xbf, 0x3d, 0x48, 0xc2, +0x36, 0x40, 0xc5, 0x31, 0x3b, 0xc8, 0x33, 0x3d, 0xca, 0x35, 0x3f, 0xcd, +0x34, 0x3e, 0xd0, 0x32, 0x3c, 0xd2, 0x33, 0x3e, 0xd5, 0x3d, 0x49, 0xd8, +0x46, 0x52, 0xdb, 0x3c, 0x47, 0xde, 0x36, 0x42, 0xe1, 0x48, 0x54, 0xe3, +0x59, 0x67, 0xe4, 0x40, 0x4d, 0xe4, 0x36, 0x42, 0xe5, 0x38, 0x44, 0xe4, +0x3d, 0x49, 0xe3, 0x47, 0x54, 0xe3, 0x5d, 0x6b, 0xe1, 0x19, 0x1f, 0x44, +0x10, 0x15, 0x36, 0x41, 0x4c, 0x93, 0x42, 0x50, 0xe0, 0x3d, 0x4a, 0xe0, +0x3e, 0x4b, 0xe0, 0x47, 0x54, 0xdf, 0x43, 0x50, 0xdf, 0x39, 0x45, 0xdf, +0x3b, 0x48, 0xdf, 0x39, 0x46, 0xdf, 0x30, 0x3c, 0xdf, 0x35, 0x42, 0xe0, +0x48, 0x56, 0xe0, 0x5b, 0x6a, 0xe0, 0x35, 0x3f, 0x7a, 0x56, 0x64, 0xd0, +0x53, 0x61, 0xdf, 0x55, 0x62, 0xdd, 0x57, 0x64, 0xda, 0x39, 0x42, 0x82, +0x0b, 0x10, 0x2b, 0x4b, 0x56, 0xb0, 0x43, 0x4f, 0xd1, 0x3a, 0x44, 0xce, +0x39, 0x43, 0xcb, 0x38, 0x42, 0xc8, 0x32, 0x3c, 0xc6, 0x2c, 0x36, 0xc3, +0x2a, 0x32, 0xc0, 0x2e, 0x36, 0xbd, 0x31, 0x3b, 0xbb, 0x37, 0x40, 0xb8, +0x32, 0x3b, 0xb5, 0x2e, 0x37, 0xb3, 0x2b, 0x33, 0xb1, 0x29, 0x30, 0xad, +0x28, 0x30, 0xab, 0x27, 0x30, 0xa9, 0x26, 0x2e, 0xa6, 0x26, 0x2f, 0xa4, +0x2a, 0x33, 0xa2, 0x2f, 0x37, 0x9f, 0x34, 0x3b, 0x9d, 0x39, 0x41, 0x9a, +0x3c, 0x44, 0x98, 0x39, 0x41, 0x96, 0x36, 0x3e, 0x94, 0x34, 0x3c, 0x92, +0x31, 0x39, 0x90, 0x2f, 0x37, 0x8e, 0x2d, 0x35, 0x8c, 0x2d, 0x33, 0x8a, +0x2c, 0x32, 0x89, 0x2a, 0x31, 0x87, 0x29, 0x30, 0x85, 0x27, 0x2f, 0x83, +0x27, 0x2d, 0x81, 0x26, 0x2c, 0x80, 0x25, 0x2a, 0x7e, 0x23, 0x29, 0x7c, +0x22, 0x29, 0x7b, 0x21, 0x28, 0x79, 0x20, 0x26, 0x78, 0x20, 0x25, 0x77, +0x1f, 0x24, 0x75, 0x1e, 0x23, 0x73, 0x1e, 0x23, 0x72, 0x1d, 0x22, 0x70, +0x1c, 0x21, 0x6f, 0x1c, 0x21, 0x6e, 0x1b, 0x20, 0x6c, 0x1b, 0x1f, 0x6b, +0x1a, 0x1f, 0x6a, 0x1a, 0x1e, 0x69, 0x1a, 0x1e, 0x68, 0x19, 0x1d, 0x67, +0x19, 0x1d, 0x66, 0x18, 0x1c, 0x65, 0x17, 0x1c, 0x63, 0x18, 0x1c, 0x62, +0x18, 0x1c, 0x61, 0x18, 0x1c, 0x60, 0x18, 0x1c, 0x5f, 0x18, 0x1c, 0x5e, +0x18, 0x1c, 0x5d, 0x17, 0x1c, 0x5c, 0x17, 0x1c, 0x5b, 0x18, 0x1c, 0x5a, +0x18, 0x1c, 0x59, 0x18, 0x1c, 0x58, 0x18, 0x1c, 0x58, 0x18, 0x1c, 0x57, +0x17, 0x1b, 0x56, 0x17, 0x1b, 0x55, 0x17, 0x1b, 0x54, 0x17, 0x1b, 0x53, +0x17, 0x1b, 0x53, 0x16, 0x1a, 0x52, 0x16, 0x1a, 0x51, 0x16, 0x1a, 0x50, +0x16, 0x1a, 0x50, 0x16, 0x19, 0x4f, 0x15, 0x19, 0x4e, 0x15, 0x19, 0x4e, +0x15, 0x19, 0x4d, 0x15, 0x18, 0x4c, 0x14, 0x18, 0x4c, 0x14, 0x18, 0x4b, +0x14, 0x18, 0x4a, 0x13, 0x17, 0x49, 0x13, 0x16, 0x49, 0x13, 0x16, 0x49, +0x13, 0x16, 0x48, 0x13, 0x16, 0x47, 0x13, 0x16, 0x47, 0x12, 0x15, 0x45, +0x12, 0x15, 0x45, 0x12, 0x15, 0x45, 0x12, 0x15, 0x45, 0x12, 0x15, 0x44, +0x12, 0x15, 0x44, 0x11, 0x14, 0x42, 0x10, 0x14, 0x42, 0x10, 0x14, 0x41, +0x10, 0x14, 0x41, 0x10, 0x13, 0x40, 0x10, 0x13, 0x40, 0x10, 0x13, 0x3f, +0x10, 0x13, 0x3f, 0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3d, +0x0f, 0x12, 0x3d, 0x0f, 0x12, 0x3d, 0x0f, 0x10, 0x36, 0x01, 0x01, 0x05, +0x11, 0x14, 0x44, 0x23, 0x28, 0x89, 0x24, 0x2a, 0x8e, 0x1f, 0x25, 0x7a, +0x1c, 0x21, 0x71, 0x1c, 0x21, 0x72, 0x1d, 0x22, 0x74, 0x1d, 0x22, 0x75, +0x1d, 0x23, 0x76, 0x1e, 0x24, 0x78, 0x1e, 0x25, 0x7a, 0x1f, 0x25, 0x7b, +0x20, 0x26, 0x7d, 0x21, 0x27, 0x7e, 0x22, 0x28, 0x80, 0x23, 0x29, 0x82, +0x24, 0x2a, 0x84, 0x24, 0x2b, 0x85, 0x25, 0x2d, 0x87, 0x26, 0x2d, 0x89, +0x26, 0x2e, 0x8b, 0x26, 0x2d, 0x8c, 0x26, 0x2d, 0x8e, 0x26, 0x2e, 0x91, +0x25, 0x2d, 0x92, 0x25, 0x2c, 0x94, 0x25, 0x2c, 0x96, 0x24, 0x2b, 0x99, +0x23, 0x2a, 0x9b, 0x22, 0x2a, 0x9d, 0x25, 0x2c, 0x9f, 0x29, 0x30, 0xa1, +0x30, 0x38, 0xa3, 0x39, 0x41, 0xa6, 0x40, 0x4a, 0xa8, 0x41, 0x4a, 0xaa, +0x40, 0x4b, 0xad, 0x41, 0x4b, 0xb0, 0x41, 0x4b, 0xb2, 0x43, 0x4e, 0xb5, +0x45, 0x4f, 0xb7, 0x45, 0x4f, 0xba, 0x3c, 0x46, 0xbc, 0x35, 0x3f, 0xbf, +0x30, 0x3a, 0xc1, 0x31, 0x3c, 0xc4, 0x33, 0x3d, 0xc7, 0x33, 0x3d, 0xc9, +0x32, 0x3c, 0xcc, 0x2f, 0x3a, 0xcf, 0x38, 0x43, 0xd1, 0x42, 0x4e, 0xd4, +0x3e, 0x4a, 0xd7, 0x36, 0x42, 0xd9, 0x3c, 0x47, 0xdc, 0x4f, 0x5c, 0xdf, +0x49, 0x56, 0xe2, 0x37, 0x42, 0xe4, 0x33, 0x3e, 0xe5, 0x35, 0x41, 0xe5, +0x3c, 0x47, 0xe4, 0x45, 0x52, 0xe3, 0x5d, 0x6c, 0xe3, 0x27, 0x2e, 0x5c, +0x10, 0x14, 0x34, 0x54, 0x60, 0xc6, 0x3e, 0x4a, 0xe1, 0x3a, 0x46, 0xe1, +0x3b, 0x46, 0xe0, 0x43, 0x50, 0xe0, 0x40, 0x4d, 0xe0, 0x38, 0x43, 0xe0, +0x37, 0x44, 0xe0, 0x39, 0x44, 0xe0, 0x30, 0x3b, 0xe0, 0x2f, 0x3a, 0xe1, +0x3e, 0x4a, 0xe1, 0x4f, 0x5d, 0xe0, 0x4f, 0x5c, 0xba, 0x4f, 0x5b, 0xb9, +0x54, 0x61, 0xdb, 0x51, 0x5d, 0xd8, 0x52, 0x60, 0xd6, 0x50, 0x5b, 0xc0, +0x2a, 0x31, 0x61, 0x1e, 0x25, 0x4a, 0x4e, 0x5b, 0xcc, 0x3b, 0x46, 0xca, +0x37, 0x42, 0xc8, 0x37, 0x41, 0xc5, 0x35, 0x3f, 0xc2, 0x2f, 0x39, 0xc0, +0x2a, 0x34, 0xbd, 0x29, 0x31, 0xbb, 0x2d, 0x36, 0xb8, 0x30, 0x39, 0xb6, +0x35, 0x3d, 0xb3, 0x31, 0x39, 0xb1, 0x2d, 0x36, 0xae, 0x2a, 0x32, 0xab, +0x28, 0x30, 0xa9, 0x27, 0x2f, 0xa6, 0x25, 0x2e, 0xa4, 0x25, 0x2d, 0xa2, +0x25, 0x2c, 0xa0, 0x27, 0x2f, 0x9d, 0x2b, 0x32, 0x9b, 0x30, 0x37, 0x99, +0x34, 0x3c, 0x97, 0x39, 0x40, 0x94, 0x38, 0x3f, 0x93, 0x35, 0x3d, 0x91, +0x33, 0x3a, 0x8e, 0x31, 0x38, 0x8d, 0x2f, 0x35, 0x8b, 0x2d, 0x34, 0x89, +0x2c, 0x33, 0x88, 0x2b, 0x31, 0x86, 0x29, 0x30, 0x84, 0x28, 0x2f, 0x82, +0x27, 0x2d, 0x81, 0x26, 0x2c, 0x7f, 0x25, 0x2b, 0x7d, 0x24, 0x2a, 0x7b, +0x23, 0x29, 0x7a, 0x22, 0x28, 0x78, 0x20, 0x27, 0x77, 0x20, 0x26, 0x76, +0x20, 0x25, 0x74, 0x1f, 0x24, 0x73, 0x1e, 0x23, 0x71, 0x1d, 0x22, 0x70, +0x1d, 0x21, 0x6e, 0x1c, 0x21, 0x6d, 0x1c, 0x20, 0x6c, 0x1b, 0x1f, 0x6b, +0x1a, 0x1f, 0x69, 0x1a, 0x1f, 0x69, 0x1a, 0x1e, 0x68, 0x19, 0x1d, 0x66, +0x18, 0x1d, 0x65, 0x18, 0x1c, 0x64, 0x18, 0x1c, 0x63, 0x18, 0x1b, 0x62, +0x17, 0x1b, 0x61, 0x17, 0x1b, 0x60, 0x17, 0x1b, 0x5f, 0x17, 0x1b, 0x5e, +0x17, 0x1b, 0x5d, 0x17, 0x1b, 0x5c, 0x16, 0x1b, 0x5b, 0x17, 0x1b, 0x5a, +0x17, 0x1b, 0x59, 0x17, 0x1b, 0x58, 0x17, 0x1b, 0x57, 0x16, 0x1a, 0x56, +0x17, 0x1b, 0x56, 0x16, 0x1a, 0x55, 0x16, 0x1a, 0x54, 0x16, 0x1a, 0x53, +0x16, 0x1a, 0x52, 0x16, 0x1a, 0x52, 0x16, 0x1a, 0x51, 0x16, 0x1a, 0x50, +0x16, 0x19, 0x4f, 0x16, 0x19, 0x4f, 0x15, 0x19, 0x4e, 0x15, 0x19, 0x4d, +0x15, 0x19, 0x4d, 0x15, 0x18, 0x4c, 0x14, 0x18, 0x4b, 0x14, 0x18, 0x4b, +0x14, 0x18, 0x4a, 0x13, 0x17, 0x49, 0x13, 0x16, 0x49, 0x13, 0x16, 0x48, +0x13, 0x16, 0x48, 0x13, 0x16, 0x47, 0x13, 0x16, 0x47, 0x12, 0x15, 0x45, +0x12, 0x15, 0x45, 0x12, 0x15, 0x45, 0x12, 0x15, 0x44, 0x12, 0x14, 0x44, +0x11, 0x14, 0x43, 0x10, 0x14, 0x42, 0x10, 0x14, 0x41, 0x10, 0x14, 0x41, +0x10, 0x13, 0x40, 0x10, 0x13, 0x40, 0x10, 0x13, 0x40, 0x10, 0x13, 0x3f, +0x10, 0x13, 0x3f, 0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3d, +0x0f, 0x12, 0x3d, 0x0f, 0x12, 0x3c, 0x0f, 0x10, 0x36, 0x01, 0x01, 0x05, +0x11, 0x14, 0x44, 0x23, 0x28, 0x89, 0x24, 0x2a, 0x8e, 0x20, 0x24, 0x79, +0x1c, 0x21, 0x71, 0x1c, 0x22, 0x72, 0x1c, 0x22, 0x73, 0x1d, 0x23, 0x74, +0x1d, 0x23, 0x76, 0x1e, 0x24, 0x77, 0x1e, 0x25, 0x79, 0x1f, 0x26, 0x7b, +0x20, 0x26, 0x7c, 0x21, 0x27, 0x7d, 0x22, 0x28, 0x7f, 0x23, 0x29, 0x81, +0x24, 0x2b, 0x83, 0x24, 0x2b, 0x84, 0x24, 0x2b, 0x85, 0x24, 0x2b, 0x87, +0x24, 0x2c, 0x8a, 0x24, 0x2b, 0x8b, 0x24, 0x2c, 0x8d, 0x25, 0x2b, 0x8f, +0x24, 0x2b, 0x91, 0x23, 0x2a, 0x93, 0x22, 0x2a, 0x95, 0x22, 0x29, 0x97, +0x21, 0x29, 0x99, 0x25, 0x2c, 0x9b, 0x29, 0x31, 0x9d, 0x2f, 0x38, 0x9f, +0x39, 0x41, 0xa2, 0x3e, 0x48, 0xa4, 0x3e, 0x48, 0xa6, 0x3e, 0x48, 0xa9, +0x3f, 0x47, 0xab, 0x3e, 0x48, 0xad, 0x40, 0x4b, 0xb0, 0x41, 0x4b, 0xb2, +0x43, 0x4c, 0xb4, 0x3b, 0x44, 0xb7, 0x34, 0x3d, 0xb9, 0x2e, 0x38, 0xbc, +0x30, 0x3a, 0xbf, 0x31, 0x3b, 0xc1, 0x33, 0x3d, 0xc3, 0x30, 0x3b, 0xc5, +0x2f, 0x39, 0xc8, 0x33, 0x3e, 0xcb, 0x3c, 0x46, 0xce, 0x41, 0x4d, 0xd0, +0x39, 0x44, 0xd3, 0x34, 0x3e, 0xd5, 0x41, 0x4d, 0xd8, 0x56, 0x63, 0xdb, +0x40, 0x4c, 0xdd, 0x31, 0x3b, 0xdf, 0x32, 0x3d, 0xe1, 0x33, 0x3f, 0xe2, +0x3b, 0x46, 0xe3, 0x45, 0x52, 0xe4, 0x5c, 0x6a, 0xe3, 0x37, 0x41, 0x7c, +0x20, 0x27, 0x4f, 0x58, 0x67, 0xe2, 0x3a, 0x46, 0xe1, 0x37, 0x43, 0xe1, +0x37, 0x43, 0xe1, 0x3e, 0x4b, 0xe1, 0x3e, 0x4a, 0xe1, 0x35, 0x41, 0xe1, +0x35, 0x40, 0xe1, 0x36, 0x42, 0xe1, 0x2f, 0x3a, 0xe0, 0x2a, 0x34, 0xde, +0x37, 0x42, 0xdd, 0x48, 0x55, 0xdb, 0x56, 0x64, 0xda, 0x46, 0x52, 0xa3, +0x56, 0x62, 0xd6, 0x4d, 0x5a, 0xd4, 0x4f, 0x5c, 0xd2, 0x4f, 0x5c, 0xd0, +0x45, 0x50, 0xa1, 0x20, 0x25, 0x4d, 0x3d, 0x47, 0x8c, 0x46, 0x51, 0xc6, +0x37, 0x41, 0xc4, 0x36, 0x40, 0xc1, 0x35, 0x3f, 0xbf, 0x33, 0x3d, 0xbd, +0x2d, 0x36, 0xba, 0x2a, 0x32, 0xb8, 0x28, 0x30, 0xb5, 0x2b, 0x34, 0xb3, +0x2e, 0x38, 0xb1, 0x32, 0x3b, 0xae, 0x2f, 0x38, 0xac, 0x2c, 0x34, 0xa9, +0x29, 0x31, 0xa7, 0x26, 0x2e, 0xa5, 0x26, 0x2e, 0xa2, 0x25, 0x2d, 0xa0, +0x24, 0x2c, 0x9e, 0x24, 0x2b, 0x9c, 0x25, 0x2c, 0x99, 0x28, 0x30, 0x98, +0x2c, 0x33, 0x95, 0x30, 0x38, 0x93, 0x34, 0x3c, 0x91, 0x36, 0x3f, 0x8f, +0x34, 0x3b, 0x8d, 0x31, 0x39, 0x8c, 0x30, 0x37, 0x8a, 0x2d, 0x35, 0x87, +0x2c, 0x33, 0x86, 0x2a, 0x31, 0x84, 0x2a, 0x30, 0x83, 0x28, 0x2f, 0x81, +0x27, 0x2e, 0x7f, 0x26, 0x2c, 0x7e, 0x25, 0x2b, 0x7c, 0x25, 0x2b, 0x7b, +0x24, 0x29, 0x79, 0x22, 0x29, 0x78, 0x21, 0x28, 0x77, 0x20, 0x27, 0x75, +0x1f, 0x26, 0x74, 0x1f, 0x25, 0x72, 0x1f, 0x24, 0x71, 0x1e, 0x23, 0x6f, +0x1d, 0x22, 0x6e, 0x1d, 0x21, 0x6d, 0x1c, 0x20, 0x6b, 0x1b, 0x20, 0x6b, +0x1a, 0x1f, 0x69, 0x1a, 0x1f, 0x68, 0x19, 0x1e, 0x67, 0x19, 0x1e, 0x66, +0x19, 0x1d, 0x65, 0x18, 0x1d, 0x64, 0x18, 0x1c, 0x63, 0x18, 0x1c, 0x62, +0x17, 0x1b, 0x61, 0x17, 0x1b, 0x5f, 0x17, 0x1a, 0x5e, 0x16, 0x1a, 0x5d, +0x16, 0x1a, 0x5c, 0x16, 0x1a, 0x5c, 0x16, 0x1a, 0x5b, 0x16, 0x1a, 0x5a, +0x16, 0x1a, 0x59, 0x16, 0x1a, 0x58, 0x16, 0x1a, 0x57, 0x16, 0x1a, 0x56, +0x15, 0x19, 0x55, 0x16, 0x1a, 0x55, 0x15, 0x19, 0x54, 0x16, 0x1a, 0x53, +0x15, 0x19, 0x52, 0x15, 0x19, 0x51, 0x15, 0x19, 0x51, 0x15, 0x19, 0x50, +0x15, 0x19, 0x4f, 0x16, 0x19, 0x4f, 0x15, 0x19, 0x4e, 0x15, 0x19, 0x4d, +0x15, 0x19, 0x4d, 0x14, 0x18, 0x4c, 0x14, 0x18, 0x4b, 0x14, 0x18, 0x4b, +0x14, 0x17, 0x4a, 0x13, 0x16, 0x49, 0x13, 0x16, 0x49, 0x13, 0x16, 0x48, +0x13, 0x16, 0x48, 0x13, 0x16, 0x47, 0x13, 0x16, 0x46, 0x12, 0x15, 0x45, +0x12, 0x15, 0x45, 0x12, 0x15, 0x45, 0x12, 0x14, 0x44, 0x12, 0x14, 0x44, +0x11, 0x14, 0x43, 0x10, 0x14, 0x42, 0x10, 0x14, 0x41, 0x10, 0x14, 0x41, +0x10, 0x13, 0x40, 0x10, 0x13, 0x40, 0x10, 0x13, 0x3f, 0x10, 0x13, 0x3f, +0x10, 0x13, 0x3f, 0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3d, +0x0f, 0x12, 0x3d, 0x0f, 0x12, 0x3c, 0x0f, 0x10, 0x36, 0x01, 0x01, 0x05, +0x11, 0x14, 0x44, 0x22, 0x28, 0x87, 0x24, 0x2a, 0x8d, 0x1f, 0x24, 0x79, +0x1b, 0x21, 0x70, 0x1b, 0x21, 0x71, 0x1c, 0x22, 0x72, 0x1c, 0x22, 0x73, +0x1d, 0x23, 0x75, 0x1e, 0x24, 0x76, 0x1f, 0x25, 0x78, 0x20, 0x26, 0x7a, +0x20, 0x26, 0x7b, 0x21, 0x27, 0x7d, 0x22, 0x28, 0x7e, 0x24, 0x2a, 0x80, +0x23, 0x29, 0x81, 0x23, 0x29, 0x83, 0x23, 0x2a, 0x84, 0x24, 0x2a, 0x86, +0x24, 0x2a, 0x88, 0x24, 0x2a, 0x8a, 0x23, 0x29, 0x8b, 0x23, 0x2a, 0x8e, +0x22, 0x29, 0x90, 0x21, 0x29, 0x91, 0x21, 0x28, 0x93, 0x21, 0x29, 0x96, +0x25, 0x2c, 0x97, 0x2a, 0x31, 0x9a, 0x30, 0x38, 0x9b, 0x37, 0x41, 0x9e, +0x3c, 0x45, 0xa0, 0x3c, 0x45, 0xa2, 0x3c, 0x45, 0xa4, 0x3b, 0x44, 0xa6, +0x3c, 0x46, 0xa9, 0x3e, 0x47, 0xab, 0x3f, 0x49, 0xae, 0x40, 0x4b, 0xb0, +0x39, 0x43, 0xb2, 0x33, 0x3d, 0xb4, 0x2e, 0x37, 0xb7, 0x2e, 0x37, 0xb9, +0x30, 0x3a, 0xbc, 0x32, 0x3b, 0xbe, 0x30, 0x3a, 0xc0, 0x2e, 0x38, 0xc2, +0x2f, 0x3a, 0xc5, 0x37, 0x41, 0xc8, 0x3f, 0x4a, 0xca, 0x3b, 0x45, 0xcc, +0x34, 0x3f, 0xcf, 0x38, 0x43, 0xd1, 0x46, 0x53, 0xd4, 0x4a, 0x56, 0xd6, +0x39, 0x43, 0xd9, 0x31, 0x3b, 0xdb, 0x33, 0x3d, 0xdc, 0x34, 0x3f, 0xdd, +0x3c, 0x47, 0xde, 0x47, 0x54, 0xdf, 0x59, 0x67, 0xd9, 0x3c, 0x45, 0x87, +0x2b, 0x32, 0x62, 0x52, 0x5f, 0xdf, 0x36, 0x42, 0xe0, 0x35, 0x40, 0xe0, +0x34, 0x40, 0xe0, 0x3b, 0x46, 0xdf, 0x3c, 0x48, 0xde, 0x35, 0x40, 0xde, +0x33, 0x3e, 0xdd, 0x34, 0x3f, 0xdc, 0x30, 0x3b, 0xdb, 0x2a, 0x34, 0xda, +0x31, 0x3c, 0xd8, 0x41, 0x4d, 0xd7, 0x4e, 0x5a, 0xd5, 0x49, 0x54, 0xab, +0x52, 0x5d, 0xc5, 0x4d, 0x59, 0xd0, 0x4c, 0x58, 0xce, 0x4b, 0x58, 0xcc, +0x51, 0x5d, 0xca, 0x3a, 0x43, 0x85, 0x17, 0x1c, 0x3c, 0x4d, 0x59, 0xbd, +0x3e, 0x49, 0xc1, 0x35, 0x3f, 0xbe, 0x34, 0x3e, 0xbc, 0x33, 0x3d, 0xb9, +0x31, 0x39, 0xb7, 0x2c, 0x34, 0xb5, 0x28, 0x31, 0xb3, 0x28, 0x2f, 0xb1, +0x2a, 0x33, 0xae, 0x2d, 0x36, 0xac, 0x30, 0x39, 0xa9, 0x2e, 0x36, 0xa7, +0x2b, 0x33, 0xa5, 0x28, 0x30, 0xa2, 0x26, 0x2e, 0xa1, 0x24, 0x2d, 0x9e, +0x24, 0x2b, 0x9c, 0x24, 0x2b, 0x9a, 0x23, 0x2a, 0x98, 0x23, 0x2a, 0x96, +0x26, 0x2d, 0x93, 0x29, 0x31, 0x92, 0x2c, 0x34, 0x90, 0x30, 0x37, 0x8e, +0x34, 0x3b, 0x8c, 0x32, 0x3b, 0x8a, 0x31, 0x38, 0x88, 0x2f, 0x35, 0x87, +0x2c, 0x34, 0x85, 0x2c, 0x32, 0x83, 0x2a, 0x30, 0x81, 0x28, 0x2f, 0x80, +0x27, 0x2e, 0x7f, 0x26, 0x2c, 0x7d, 0x25, 0x2c, 0x7b, 0x25, 0x2b, 0x7a, +0x24, 0x2a, 0x78, 0x23, 0x28, 0x77, 0x22, 0x27, 0x76, 0x21, 0x27, 0x74, +0x20, 0x26, 0x73, 0x1f, 0x25, 0x71, 0x1e, 0x25, 0x70, 0x1e, 0x24, 0x6f, +0x1e, 0x22, 0x6d, 0x1d, 0x22, 0x6c, 0x1c, 0x21, 0x6b, 0x1b, 0x20, 0x69, +0x1b, 0x1f, 0x68, 0x1a, 0x1f, 0x68, 0x1a, 0x1e, 0x66, 0x19, 0x1e, 0x66, +0x19, 0x1d, 0x64, 0x18, 0x1d, 0x63, 0x18, 0x1c, 0x62, 0x17, 0x1c, 0x61, +0x17, 0x1b, 0x60, 0x17, 0x1b, 0x5f, 0x17, 0x1a, 0x5e, 0x16, 0x1a, 0x5d, +0x16, 0x1a, 0x5c, 0x15, 0x19, 0x5b, 0x15, 0x1a, 0x5a, 0x15, 0x19, 0x59, +0x15, 0x19, 0x58, 0x15, 0x19, 0x58, 0x15, 0x19, 0x57, 0x15, 0x19, 0x56, +0x15, 0x19, 0x55, 0x15, 0x19, 0x54, 0x15, 0x19, 0x54, 0x15, 0x19, 0x53, +0x15, 0x19, 0x52, 0x15, 0x19, 0x51, 0x14, 0x18, 0x50, 0x15, 0x19, 0x50, +0x15, 0x18, 0x4f, 0x15, 0x18, 0x4e, 0x15, 0x18, 0x4e, 0x14, 0x18, 0x4d, +0x14, 0x18, 0x4c, 0x14, 0x18, 0x4c, 0x14, 0x18, 0x4b, 0x14, 0x17, 0x4a, +0x14, 0x17, 0x4a, 0x13, 0x16, 0x49, 0x13, 0x16, 0x49, 0x13, 0x16, 0x48, +0x13, 0x16, 0x47, 0x13, 0x16, 0x47, 0x12, 0x15, 0x45, 0x12, 0x15, 0x45, +0x12, 0x15, 0x45, 0x12, 0x15, 0x45, 0x12, 0x14, 0x44, 0x12, 0x14, 0x44, +0x10, 0x14, 0x42, 0x10, 0x14, 0x42, 0x10, 0x13, 0x41, 0x10, 0x13, 0x41, +0x10, 0x13, 0x40, 0x10, 0x13, 0x40, 0x10, 0x13, 0x3f, 0x10, 0x13, 0x3f, +0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3d, +0x0f, 0x12, 0x3d, 0x0f, 0x12, 0x3c, 0x0f, 0x10, 0x36, 0x01, 0x01, 0x04, +0x11, 0x14, 0x43, 0x22, 0x28, 0x86, 0x23, 0x2a, 0x8d, 0x1f, 0x24, 0x78, +0x1b, 0x21, 0x6f, 0x1b, 0x21, 0x71, 0x1c, 0x22, 0x71, 0x1d, 0x23, 0x73, +0x1e, 0x24, 0x74, 0x1f, 0x24, 0x76, 0x1f, 0x25, 0x77, 0x20, 0x26, 0x79, +0x21, 0x27, 0x7a, 0x22, 0x27, 0x7b, 0x22, 0x28, 0x7d, 0x22, 0x28, 0x7f, +0x22, 0x28, 0x80, 0x22, 0x28, 0x82, 0x22, 0x28, 0x84, 0x23, 0x28, 0x85, +0x23, 0x28, 0x87, 0x22, 0x29, 0x89, 0x21, 0x28, 0x8b, 0x21, 0x27, 0x8c, +0x20, 0x27, 0x8e, 0x20, 0x26, 0x90, 0x21, 0x28, 0x92, 0x25, 0x2c, 0x94, +0x2a, 0x31, 0x96, 0x2f, 0x37, 0x98, 0x37, 0x3f, 0x9a, 0x3a, 0x42, 0x9c, +0x39, 0x42, 0x9e, 0x3a, 0x42, 0xa0, 0x3a, 0x43, 0xa3, 0x3a, 0x43, 0xa4, +0x3b, 0x44, 0xa6, 0x3c, 0x46, 0xa9, 0x3e, 0x48, 0xab, 0x38, 0x41, 0xae, +0x32, 0x3b, 0xb0, 0x2e, 0x37, 0xb2, 0x2d, 0x36, 0xb4, 0x2e, 0x37, 0xb7, +0x2f, 0x39, 0xb9, 0x2f, 0x39, 0xbb, 0x2e, 0x37, 0xbd, 0x2d, 0x37, 0xc0, +0x32, 0x3c, 0xc2, 0x3a, 0x44, 0xc4, 0x3c, 0x47, 0xc7, 0x36, 0x40, 0xc9, +0x31, 0x3b, 0xcb, 0x3d, 0x47, 0xcd, 0x4d, 0x58, 0xd0, 0x41, 0x4c, 0xd2, +0x32, 0x3d, 0xd5, 0x31, 0x3b, 0xd6, 0x31, 0x3b, 0xd7, 0x35, 0x3f, 0xd8, +0x3b, 0x46, 0xd9, 0x48, 0x54, 0xd9, 0x52, 0x5e, 0xc1, 0x3e, 0x48, 0x8b, +0x2b, 0x33, 0x62, 0x4d, 0x59, 0xda, 0x35, 0x40, 0xda, 0x34, 0x3f, 0xdb, +0x34, 0x3e, 0xda, 0x39, 0x45, 0xda, 0x3d, 0x47, 0xd9, 0x35, 0x40, 0xd9, +0x32, 0x3d, 0xd7, 0x34, 0x3f, 0xd7, 0x30, 0x3b, 0xd6, 0x2b, 0x35, 0xd5, +0x2d, 0x37, 0xd4, 0x3a, 0x45, 0xd3, 0x47, 0x53, 0xd1, 0x52, 0x60, 0xcf, +0x4c, 0x58, 0xb6, 0x4e, 0x5a, 0xcc, 0x48, 0x54, 0xca, 0x49, 0x54, 0xc8, +0x4a, 0x55, 0xc6, 0x4a, 0x55, 0xb4, 0x32, 0x3a, 0x70, 0x32, 0x3a, 0x72, +0x47, 0x51, 0xbe, 0x38, 0x43, 0xbc, 0x34, 0x3d, 0xb9, 0x33, 0x3c, 0xb7, +0x31, 0x3b, 0xb5, 0x2e, 0x38, 0xb3, 0x2a, 0x33, 0xb1, 0x27, 0x2f, 0xae, +0x27, 0x2f, 0xac, 0x29, 0x31, 0xa9, 0x2c, 0x34, 0xa7, 0x2e, 0x37, 0xa5, +0x2d, 0x36, 0xa3, 0x2a, 0x32, 0xa1, 0x28, 0x2f, 0x9e, 0x25, 0x2d, 0x9d, +0x24, 0x2b, 0x9a, 0x23, 0x2a, 0x98, 0x22, 0x29, 0x96, 0x22, 0x29, 0x94, +0x22, 0x28, 0x93, 0x23, 0x2b, 0x90, 0x27, 0x2d, 0x8e, 0x29, 0x30, 0x8d, +0x2c, 0x34, 0x8b, 0x30, 0x37, 0x89, 0x32, 0x39, 0x87, 0x30, 0x37, 0x86, +0x2d, 0x35, 0x84, 0x2c, 0x33, 0x82, 0x2b, 0x31, 0x80, 0x29, 0x30, 0x7f, +0x27, 0x2e, 0x7e, 0x26, 0x2d, 0x7c, 0x25, 0x2c, 0x7a, 0x25, 0x2b, 0x79, +0x24, 0x2a, 0x77, 0x23, 0x29, 0x76, 0x22, 0x27, 0x75, 0x21, 0x27, 0x74, +0x21, 0x26, 0x72, 0x20, 0x26, 0x71, 0x1f, 0x25, 0x6f, 0x1e, 0x24, 0x6e, +0x1d, 0x23, 0x6d, 0x1d, 0x22, 0x6b, 0x1d, 0x21, 0x6a, 0x1c, 0x21, 0x69, +0x1b, 0x20, 0x68, 0x1a, 0x1f, 0x66, 0x1a, 0x1f, 0x66, 0x19, 0x1e, 0x65, +0x19, 0x1d, 0x64, 0x19, 0x1d, 0x63, 0x18, 0x1c, 0x62, 0x18, 0x1c, 0x61, +0x18, 0x1c, 0x60, 0x17, 0x1b, 0x5f, 0x17, 0x1b, 0x5e, 0x16, 0x1a, 0x5d, +0x16, 0x1a, 0x5c, 0x16, 0x1a, 0x5b, 0x15, 0x1a, 0x5a, 0x15, 0x19, 0x59, +0x14, 0x19, 0x58, 0x14, 0x18, 0x57, 0x14, 0x18, 0x56, 0x15, 0x18, 0x56, +0x14, 0x18, 0x55, 0x15, 0x18, 0x54, 0x14, 0x18, 0x53, 0x14, 0x18, 0x52, +0x14, 0x18, 0x52, 0x14, 0x18, 0x51, 0x14, 0x18, 0x50, 0x14, 0x18, 0x50, +0x14, 0x18, 0x4f, 0x14, 0x18, 0x4e, 0x14, 0x17, 0x4d, 0x14, 0x17, 0x4d, +0x14, 0x17, 0x4c, 0x14, 0x17, 0x4c, 0x14, 0x17, 0x4b, 0x14, 0x17, 0x4a, +0x13, 0x16, 0x49, 0x13, 0x16, 0x49, 0x13, 0x16, 0x48, 0x13, 0x16, 0x48, +0x13, 0x16, 0x47, 0x13, 0x16, 0x47, 0x12, 0x15, 0x45, 0x12, 0x15, 0x45, +0x12, 0x15, 0x45, 0x12, 0x15, 0x45, 0x12, 0x14, 0x44, 0x12, 0x14, 0x44, +0x10, 0x14, 0x42, 0x10, 0x14, 0x42, 0x10, 0x13, 0x41, 0x10, 0x13, 0x41, +0x10, 0x13, 0x40, 0x10, 0x13, 0x40, 0x10, 0x13, 0x3f, 0x10, 0x13, 0x3f, +0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3d, 0x0f, 0x12, 0x3d, +0x0f, 0x12, 0x3d, 0x0f, 0x12, 0x3c, 0x0f, 0x10, 0x36, 0x01, 0x01, 0x04, +0x11, 0x13, 0x42, 0x22, 0x28, 0x86, 0x23, 0x29, 0x8c, 0x1f, 0x24, 0x77, +0x1b, 0x21, 0x6f, 0x1b, 0x22, 0x70, 0x1c, 0x22, 0x71, 0x1d, 0x23, 0x72, +0x1e, 0x24, 0x73, 0x1f, 0x24, 0x75, 0x1f, 0x25, 0x76, 0x20, 0x26, 0x78, +0x21, 0x26, 0x79, 0x21, 0x27, 0x7b, 0x21, 0x27, 0x7c, 0x21, 0x27, 0x7d, +0x21, 0x27, 0x7f, 0x21, 0x27, 0x81, 0x21, 0x27, 0x83, 0x21, 0x27, 0x84, +0x20, 0x27, 0x86, 0x20, 0x27, 0x88, 0x1f, 0x26, 0x8a, 0x1f, 0x26, 0x8b, +0x1f, 0x25, 0x8d, 0x21, 0x28, 0x8f, 0x25, 0x2c, 0x91, 0x29, 0x30, 0x92, +0x2f, 0x38, 0x95, 0x37, 0x3f, 0x96, 0x37, 0x40, 0x98, 0x37, 0x40, 0x9b, +0x37, 0x40, 0x9c, 0x37, 0x41, 0x9f, 0x38, 0x41, 0xa0, 0x3a, 0x42, 0xa3, +0x3a, 0x43, 0xa4, 0x3b, 0x44, 0xa6, 0x37, 0x3f, 0xa9, 0x32, 0x3a, 0xab, +0x2d, 0x36, 0xad, 0x2b, 0x34, 0xaf, 0x2d, 0x36, 0xb1, 0x2e, 0x37, 0xb4, +0x2f, 0x37, 0xb6, 0x2e, 0x37, 0xb7, 0x2c, 0x35, 0xba, 0x2f, 0x38, 0xbc, +0x35, 0x3f, 0xbe, 0x3d, 0x47, 0xc1, 0x37, 0x41, 0xc3, 0x32, 0x3c, 0xc5, +0x34, 0x3e, 0xc8, 0x41, 0x4c, 0xca, 0x49, 0x55, 0xcc, 0x39, 0x43, 0xce, +0x2e, 0x38, 0xd0, 0x30, 0x3a, 0xd1, 0x31, 0x3b, 0xd2, 0x35, 0x40, 0xd3, +0x3c, 0x47, 0xd3, 0x49, 0x55, 0xd4, 0x4d, 0x58, 0xb2, 0x3f, 0x49, 0x8e, +0x31, 0x3a, 0x6f, 0x49, 0x55, 0xd5, 0x35, 0x3f, 0xd6, 0x33, 0x3e, 0xd6, +0x33, 0x3e, 0xd6, 0x38, 0x42, 0xd5, 0x3b, 0x47, 0xd5, 0x34, 0x3f, 0xd4, +0x31, 0x3c, 0xd3, 0x32, 0x3d, 0xd3, 0x31, 0x3c, 0xd1, 0x2b, 0x35, 0xd0, +0x2a, 0x34, 0xcf, 0x34, 0x3f, 0xce, 0x42, 0x4c, 0xcc, 0x4c, 0x57, 0xcb, +0x46, 0x52, 0xa5, 0x4f, 0x5b, 0xc8, 0x48, 0x53, 0xc6, 0x46, 0x51, 0xc4, +0x47, 0x53, 0xc2, 0x49, 0x55, 0xc1, 0x43, 0x4d, 0x9f, 0x2a, 0x31, 0x60, +0x42, 0x4b, 0x9b, 0x3f, 0x49, 0xb8, 0x34, 0x3d, 0xb6, 0x31, 0x3a, 0xb4, +0x31, 0x3a, 0xb2, 0x30, 0x39, 0xb0, 0x2d, 0x35, 0xad, 0x29, 0x30, 0xab, +0x26, 0x2e, 0xa9, 0x26, 0x2d, 0xa7, 0x28, 0x30, 0xa5, 0x2b, 0x33, 0xa3, +0x2d, 0x35, 0xa1, 0x2d, 0x34, 0x9f, 0x29, 0x31, 0x9d, 0x27, 0x2e, 0x9b, +0x24, 0x2b, 0x98, 0x23, 0x2a, 0x97, 0x22, 0x2a, 0x95, 0x22, 0x28, 0x93, +0x22, 0x28, 0x91, 0x21, 0x27, 0x8f, 0x21, 0x28, 0x8d, 0x24, 0x2b, 0x8c, +0x26, 0x2e, 0x8a, 0x2a, 0x30, 0x88, 0x2c, 0x34, 0x86, 0x30, 0x37, 0x85, +0x2f, 0x36, 0x83, 0x2d, 0x34, 0x81, 0x2b, 0x32, 0x7f, 0x2a, 0x30, 0x7e, +0x28, 0x2f, 0x7d, 0x27, 0x2e, 0x7b, 0x25, 0x2c, 0x79, 0x25, 0x2b, 0x78, +0x24, 0x2a, 0x77, 0x23, 0x29, 0x76, 0x22, 0x27, 0x74, 0x21, 0x27, 0x73, +0x21, 0x26, 0x71, 0x20, 0x26, 0x70, 0x1f, 0x25, 0x6f, 0x1e, 0x24, 0x6d, +0x1d, 0x24, 0x6c, 0x1d, 0x23, 0x6b, 0x1c, 0x21, 0x69, 0x1c, 0x21, 0x68, +0x1b, 0x20, 0x68, 0x1b, 0x20, 0x66, 0x1b, 0x1f, 0x66, 0x19, 0x1e, 0x65, +0x19, 0x1d, 0x63, 0x19, 0x1d, 0x62, 0x18, 0x1c, 0x61, 0x18, 0x1c, 0x60, +0x18, 0x1c, 0x5f, 0x17, 0x1b, 0x5e, 0x17, 0x1b, 0x5d, 0x16, 0x1a, 0x5c, +0x16, 0x1a, 0x5b, 0x16, 0x1a, 0x5b, 0x16, 0x1a, 0x5a, 0x15, 0x19, 0x59, +0x15, 0x19, 0x58, 0x14, 0x19, 0x57, 0x14, 0x18, 0x56, 0x14, 0x18, 0x55, +0x14, 0x18, 0x55, 0x14, 0x18, 0x54, 0x14, 0x17, 0x53, 0x14, 0x17, 0x52, +0x13, 0x17, 0x51, 0x14, 0x17, 0x51, 0x14, 0x17, 0x50, 0x14, 0x17, 0x4f, +0x14, 0x17, 0x4f, 0x14, 0x17, 0x4e, 0x13, 0x17, 0x4d, 0x13, 0x17, 0x4d, +0x13, 0x17, 0x4c, 0x13, 0x16, 0x4b, 0x13, 0x17, 0x4b, 0x13, 0x16, 0x4a, +0x13, 0x16, 0x49, 0x13, 0x16, 0x49, 0x13, 0x16, 0x48, 0x13, 0x16, 0x48, +0x13, 0x16, 0x47, 0x13, 0x16, 0x47, 0x12, 0x15, 0x45, 0x12, 0x15, 0x45, +0x12, 0x14, 0x45, 0x12, 0x14, 0x44, 0x12, 0x14, 0x44, 0x11, 0x14, 0x43, +0x10, 0x14, 0x42, 0x10, 0x13, 0x41, 0x10, 0x13, 0x41, 0x10, 0x13, 0x40, +0x10, 0x13, 0x40, 0x10, 0x13, 0x40, 0x10, 0x13, 0x3f, 0x0f, 0x12, 0x3f, +0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3d, 0x0f, 0x12, 0x3d, +0x0f, 0x12, 0x3c, 0x0f, 0x12, 0x3c, 0x0f, 0x10, 0x36, 0x01, 0x01, 0x04, +0x11, 0x14, 0x42, 0x22, 0x28, 0x85, 0x23, 0x2a, 0x8b, 0x1f, 0x25, 0x77, +0x1c, 0x21, 0x6e, 0x1c, 0x22, 0x6f, 0x1d, 0x23, 0x71, 0x1e, 0x23, 0x71, +0x1e, 0x23, 0x72, 0x1f, 0x24, 0x74, 0x1f, 0x25, 0x75, 0x20, 0x25, 0x77, +0x20, 0x25, 0x79, 0x20, 0x25, 0x7a, 0x20, 0x25, 0x7b, 0x20, 0x26, 0x7c, +0x20, 0x26, 0x7e, 0x20, 0x26, 0x80, 0x1f, 0x26, 0x82, 0x1f, 0x26, 0x83, +0x1f, 0x25, 0x84, 0x1e, 0x25, 0x86, 0x1e, 0x25, 0x88, 0x1e, 0x24, 0x8a, +0x21, 0x28, 0x8b, 0x24, 0x2c, 0x8d, 0x29, 0x30, 0x8f, 0x2f, 0x36, 0x90, +0x35, 0x3d, 0x93, 0x35, 0x3d, 0x95, 0x36, 0x3d, 0x96, 0x35, 0x3d, 0x98, +0x36, 0x3d, 0x9b, 0x36, 0x3e, 0x9c, 0x36, 0x3f, 0x9f, 0x38, 0x41, 0xa0, +0x3a, 0x42, 0xa3, 0x35, 0x3d, 0xa4, 0x31, 0x39, 0xa6, 0x2c, 0x35, 0xa8, +0x2a, 0x32, 0xab, 0x2b, 0x34, 0xad, 0x2d, 0x36, 0xae, 0x2e, 0x36, 0xb1, +0x2c, 0x36, 0xb3, 0x2c, 0x34, 0xb5, 0x2c, 0x35, 0xb7, 0x31, 0x3a, 0xb9, +0x38, 0x41, 0xbb, 0x39, 0x42, 0xbd, 0x33, 0x3c, 0xbf, 0x2f, 0x38, 0xc2, +0x38, 0x42, 0xc3, 0x44, 0x50, 0xc6, 0x40, 0x4b, 0xc8, 0x34, 0x3d, 0xca, +0x2f, 0x38, 0xcc, 0x2f, 0x39, 0xcd, 0x31, 0x3b, 0xce, 0x36, 0x40, 0xce, +0x3d, 0x47, 0xcf, 0x4a, 0x56, 0xd0, 0x4a, 0x55, 0xab, 0x3e, 0x47, 0x8b, +0x3b, 0x44, 0x85, 0x45, 0x51, 0xd1, 0x33, 0x3e, 0xd1, 0x32, 0x3c, 0xd1, +0x31, 0x3c, 0xd1, 0x37, 0x42, 0xd0, 0x3b, 0x47, 0xd0, 0x34, 0x3f, 0xcf, +0x30, 0x3a, 0xcf, 0x31, 0x3b, 0xce, 0x31, 0x3c, 0xcd, 0x2d, 0x36, 0xcc, +0x28, 0x32, 0xcb, 0x2f, 0x3a, 0xca, 0x3c, 0x46, 0xc8, 0x46, 0x51, 0xc7, +0x4f, 0x5a, 0xc3, 0x4e, 0x5a, 0xc2, 0x49, 0x53, 0xc2, 0x44, 0x4f, 0xc1, +0x44, 0x4f, 0xbe, 0x44, 0x50, 0xbd, 0x4b, 0x56, 0xbb, 0x3c, 0x44, 0x8b, +0x27, 0x2e, 0x5a, 0x47, 0x51, 0xb5, 0x3a, 0x43, 0xb3, 0x31, 0x3a, 0xb1, +0x31, 0x39, 0xaf, 0x2f, 0x38, 0xad, 0x2e, 0x37, 0xab, 0x2b, 0x33, 0xa9, +0x28, 0x30, 0xa7, 0x25, 0x2c, 0xa5, 0x24, 0x2c, 0xa3, 0x27, 0x2f, 0xa1, +0x29, 0x32, 0x9f, 0x2c, 0x34, 0x9d, 0x2a, 0x32, 0x9b, 0x27, 0x2f, 0x98, +0x26, 0x2d, 0x97, 0x24, 0x2b, 0x95, 0x22, 0x29, 0x93, 0x22, 0x28, 0x91, +0x22, 0x28, 0x8f, 0x21, 0x27, 0x8d, 0x21, 0x26, 0x8c, 0x21, 0x27, 0x8a, +0x22, 0x29, 0x88, 0x25, 0x2b, 0x86, 0x26, 0x2d, 0x85, 0x2a, 0x30, 0x83, +0x2c, 0x33, 0x82, 0x2e, 0x34, 0x80, 0x2c, 0x33, 0x7e, 0x2a, 0x31, 0x7d, +0x29, 0x2f, 0x7c, 0x28, 0x2e, 0x7a, 0x26, 0x2d, 0x79, 0x25, 0x2b, 0x77, +0x24, 0x2a, 0x75, 0x23, 0x29, 0x75, 0x22, 0x28, 0x73, 0x22, 0x27, 0x72, +0x21, 0x26, 0x71, 0x20, 0x26, 0x6f, 0x1f, 0x25, 0x6e, 0x1f, 0x25, 0x6d, +0x1e, 0x24, 0x6b, 0x1d, 0x23, 0x6a, 0x1d, 0x22, 0x69, 0x1d, 0x22, 0x68, +0x1c, 0x21, 0x67, 0x1c, 0x20, 0x66, 0x1b, 0x1f, 0x65, 0x1a, 0x1f, 0x64, +0x1a, 0x1e, 0x63, 0x19, 0x1d, 0x62, 0x18, 0x1d, 0x61, 0x18, 0x1c, 0x60, +0x18, 0x1c, 0x5f, 0x17, 0x1b, 0x5e, 0x17, 0x1b, 0x5d, 0x16, 0x1a, 0x5c, +0x16, 0x1a, 0x5b, 0x16, 0x1a, 0x5a, 0x15, 0x19, 0x59, 0x15, 0x19, 0x58, +0x15, 0x19, 0x58, 0x14, 0x19, 0x57, 0x14, 0x18, 0x56, 0x14, 0x18, 0x55, +0x14, 0x17, 0x54, 0x13, 0x17, 0x53, 0x13, 0x17, 0x53, 0x13, 0x17, 0x52, +0x13, 0x17, 0x51, 0x13, 0x17, 0x50, 0x13, 0x17, 0x50, 0x13, 0x17, 0x4f, +0x13, 0x16, 0x4e, 0x13, 0x17, 0x4e, 0x13, 0x16, 0x4d, 0x13, 0x16, 0x4c, +0x13, 0x16, 0x4c, 0x12, 0x16, 0x4b, 0x13, 0x16, 0x4b, 0x12, 0x16, 0x4a, +0x12, 0x16, 0x49, 0x12, 0x16, 0x49, 0x12, 0x16, 0x48, 0x12, 0x16, 0x48, +0x12, 0x15, 0x47, 0x12, 0x14, 0x45, 0x12, 0x15, 0x45, 0x12, 0x14, 0x45, +0x12, 0x14, 0x45, 0x12, 0x14, 0x44, 0x12, 0x14, 0x44, 0x11, 0x14, 0x43, +0x10, 0x14, 0x42, 0x10, 0x13, 0x41, 0x10, 0x13, 0x41, 0x10, 0x13, 0x40, +0x10, 0x13, 0x40, 0x10, 0x12, 0x3f, 0x10, 0x12, 0x3f, 0x0f, 0x12, 0x3f, +0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3d, 0x0f, 0x12, 0x3d, +0x0f, 0x12, 0x3c, 0x0f, 0x12, 0x3c, 0x0f, 0x10, 0x36, 0x01, 0x01, 0x04, +0x11, 0x14, 0x42, 0x22, 0x28, 0x84, 0x23, 0x2a, 0x8b, 0x1f, 0x25, 0x76, +0x1c, 0x21, 0x6d, 0x1d, 0x22, 0x6f, 0x1d, 0x23, 0x70, 0x1e, 0x23, 0x71, +0x1e, 0x24, 0x72, 0x1e, 0x24, 0x73, 0x1f, 0x24, 0x75, 0x1f, 0x25, 0x76, +0x1f, 0x25, 0x78, 0x1f, 0x25, 0x79, 0x1f, 0x25, 0x7b, 0x1f, 0x25, 0x7b, +0x1f, 0x25, 0x7d, 0x1e, 0x25, 0x7f, 0x1e, 0x24, 0x80, 0x1e, 0x24, 0x82, +0x1d, 0x24, 0x83, 0x1e, 0x23, 0x85, 0x1e, 0x25, 0x87, 0x21, 0x28, 0x89, +0x24, 0x2c, 0x8a, 0x29, 0x30, 0x8c, 0x2e, 0x36, 0x8e, 0x32, 0x3b, 0x90, +0x33, 0x3b, 0x91, 0x33, 0x3b, 0x93, 0x32, 0x3b, 0x95, 0x33, 0x3b, 0x96, +0x34, 0x3d, 0x99, 0x36, 0x3d, 0x9b, 0x36, 0x3e, 0x9c, 0x36, 0x3f, 0x9f, +0x34, 0x3d, 0xa0, 0x30, 0x38, 0xa2, 0x2c, 0x34, 0xa4, 0x29, 0x31, 0xa6, +0x2b, 0x32, 0xa8, 0x2b, 0x34, 0xaa, 0x2c, 0x35, 0xac, 0x2b, 0x34, 0xae, +0x2b, 0x33, 0xb0, 0x2b, 0x33, 0xb2, 0x2d, 0x37, 0xb4, 0x34, 0x3d, 0xb6, +0x39, 0x44, 0xb8, 0x34, 0x3d, 0xba, 0x2f, 0x39, 0xbd, 0x32, 0x3b, 0xbe, +0x3b, 0x46, 0xc0, 0x48, 0x52, 0xc2, 0x39, 0x43, 0xc4, 0x2f, 0x39, 0xc6, +0x2e, 0x38, 0xc7, 0x2e, 0x39, 0xc8, 0x30, 0x3b, 0xca, 0x35, 0x40, 0xca, +0x3d, 0x48, 0xca, 0x4b, 0x57, 0xcc, 0x49, 0x54, 0xab, 0x3f, 0x48, 0x8f, +0x43, 0x4d, 0x99, 0x42, 0x4c, 0xcd, 0x32, 0x3d, 0xcd, 0x31, 0x3b, 0xcc, +0x31, 0x3b, 0xcc, 0x36, 0x40, 0xcc, 0x3b, 0x45, 0xcb, 0x34, 0x3f, 0xcb, +0x2f, 0x38, 0xca, 0x2f, 0x3a, 0xca, 0x31, 0x3c, 0xc8, 0x2d, 0x37, 0xc8, +0x29, 0x32, 0xc7, 0x2c, 0x37, 0xc6, 0x37, 0x40, 0xc4, 0x40, 0x4a, 0xc3, +0x49, 0x54, 0xc1, 0x49, 0x53, 0xb0, 0x49, 0x53, 0xbe, 0x43, 0x4d, 0xbd, +0x41, 0x4c, 0xbc, 0x42, 0x4d, 0xb9, 0x43, 0x4d, 0xb8, 0x46, 0x51, 0xaa, +0x35, 0x3d, 0x7a, 0x3a, 0x42, 0x85, 0x40, 0x4a, 0xb1, 0x34, 0x3d, 0xae, +0x30, 0x38, 0xac, 0x2f, 0x38, 0xaa, 0x2e, 0x36, 0xa9, 0x2c, 0x34, 0xa6, +0x29, 0x31, 0xa5, 0x26, 0x2e, 0xa2, 0x24, 0x2b, 0xa1, 0x24, 0x2c, 0x9f, +0x26, 0x2e, 0x9d, 0x27, 0x30, 0x9b, 0x2a, 0x32, 0x99, 0x2a, 0x31, 0x97, +0x27, 0x2e, 0x95, 0x25, 0x2c, 0x93, 0x23, 0x2a, 0x92, 0x22, 0x29, 0x90, +0x21, 0x27, 0x8e, 0x21, 0x26, 0x8d, 0x21, 0x26, 0x8b, 0x20, 0x25, 0x89, +0x1f, 0x25, 0x87, 0x20, 0x27, 0x86, 0x22, 0x29, 0x84, 0x25, 0x2b, 0x82, +0x27, 0x2d, 0x80, 0x2a, 0x30, 0x7f, 0x2b, 0x33, 0x7e, 0x2b, 0x32, 0x7c, +0x2a, 0x30, 0x7b, 0x29, 0x2e, 0x79, 0x27, 0x2d, 0x78, 0x25, 0x2c, 0x76, +0x24, 0x2b, 0x75, 0x24, 0x29, 0x74, 0x23, 0x28, 0x73, 0x22, 0x27, 0x71, +0x21, 0x26, 0x70, 0x20, 0x26, 0x6f, 0x1f, 0x25, 0x6d, 0x1f, 0x24, 0x6c, +0x1e, 0x24, 0x6b, 0x1d, 0x23, 0x69, 0x1d, 0x23, 0x68, 0x1d, 0x22, 0x68, +0x1c, 0x21, 0x66, 0x1c, 0x20, 0x66, 0x1b, 0x20, 0x65, 0x1b, 0x1f, 0x64, +0x1a, 0x1e, 0x63, 0x19, 0x1d, 0x61, 0x18, 0x1d, 0x60, 0x18, 0x1d, 0x5f, +0x18, 0x1c, 0x5e, 0x17, 0x1b, 0x5d, 0x17, 0x1b, 0x5d, 0x17, 0x1b, 0x5c, +0x16, 0x1a, 0x5b, 0x16, 0x1a, 0x5a, 0x16, 0x1a, 0x59, 0x15, 0x19, 0x58, +0x15, 0x19, 0x57, 0x15, 0x18, 0x56, 0x14, 0x18, 0x56, 0x14, 0x18, 0x55, +0x14, 0x18, 0x54, 0x13, 0x17, 0x53, 0x13, 0x17, 0x52, 0x13, 0x17, 0x52, +0x13, 0x16, 0x51, 0x12, 0x16, 0x50, 0x13, 0x16, 0x50, 0x12, 0x16, 0x4f, +0x12, 0x16, 0x4e, 0x12, 0x16, 0x4d, 0x12, 0x16, 0x4d, 0x12, 0x16, 0x4c, +0x12, 0x16, 0x4c, 0x12, 0x16, 0x4b, 0x12, 0x15, 0x4a, 0x12, 0x15, 0x49, +0x12, 0x15, 0x49, 0x12, 0x15, 0x49, 0x12, 0x16, 0x48, 0x12, 0x15, 0x47, +0x12, 0x15, 0x47, 0x12, 0x14, 0x45, 0x12, 0x14, 0x45, 0x11, 0x14, 0x45, +0x12, 0x14, 0x45, 0x11, 0x14, 0x44, 0x11, 0x14, 0x44, 0x10, 0x13, 0x42, +0x10, 0x13, 0x42, 0x10, 0x13, 0x41, 0x10, 0x13, 0x41, 0x10, 0x13, 0x40, +0x10, 0x13, 0x40, 0x10, 0x12, 0x3f, 0x0f, 0x12, 0x3f, 0x0f, 0x12, 0x3e, +0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3d, 0x0f, 0x12, 0x3d, +0x0e, 0x11, 0x3c, 0x0e, 0x11, 0x3c, 0x0e, 0x10, 0x35, 0x01, 0x01, 0x04, +0x11, 0x14, 0x42, 0x22, 0x28, 0x84, 0x24, 0x2a, 0x8a, 0x1f, 0x25, 0x75, +0x1c, 0x22, 0x6d, 0x1d, 0x23, 0x6e, 0x1d, 0x23, 0x6f, 0x1d, 0x23, 0x70, +0x1e, 0x23, 0x71, 0x1d, 0x23, 0x72, 0x1e, 0x24, 0x74, 0x1e, 0x24, 0x75, +0x1e, 0x24, 0x77, 0x1e, 0x24, 0x78, 0x1e, 0x24, 0x7a, 0x1d, 0x24, 0x7b, +0x1e, 0x23, 0x7c, 0x1d, 0x23, 0x7e, 0x1d, 0x23, 0x7f, 0x1d, 0x22, 0x81, +0x1d, 0x22, 0x83, 0x1e, 0x24, 0x83, 0x21, 0x27, 0x85, 0x24, 0x2c, 0x87, +0x29, 0x30, 0x89, 0x2e, 0x35, 0x8a, 0x31, 0x38, 0x8c, 0x31, 0x38, 0x8e, +0x32, 0x39, 0x90, 0x32, 0x39, 0x91, 0x31, 0x39, 0x93, 0x32, 0x3a, 0x95, +0x33, 0x3b, 0x96, 0x34, 0x3d, 0x99, 0x36, 0x3d, 0x9b, 0x32, 0x3b, 0x9c, +0x2f, 0x37, 0x9e, 0x2b, 0x33, 0xa0, 0x28, 0x30, 0xa2, 0x29, 0x32, 0xa4, +0x2a, 0x32, 0xa6, 0x2b, 0x33, 0xa7, 0x2b, 0x33, 0xa9, 0x2a, 0x32, 0xab, +0x2a, 0x32, 0xad, 0x2b, 0x33, 0xaf, 0x30, 0x38, 0xb1, 0x36, 0x40, 0xb3, +0x35, 0x3e, 0xb5, 0x31, 0x3a, 0xb7, 0x2e, 0x36, 0xb9, 0x34, 0x3e, 0xbb, +0x3e, 0x49, 0xbc, 0x3f, 0x49, 0xbe, 0x34, 0x3d, 0xc0, 0x2d, 0x36, 0xc2, +0x2d, 0x36, 0xc3, 0x2e, 0x37, 0xc4, 0x31, 0x3a, 0xc5, 0x36, 0x40, 0xc6, +0x3e, 0x48, 0xc6, 0x4b, 0x56, 0xc7, 0x49, 0x54, 0xaa, 0x41, 0x4a, 0x92, +0x49, 0x54, 0xab, 0x3e, 0x4a, 0xc8, 0x31, 0x3b, 0xc8, 0x30, 0x3a, 0xc8, +0x2f, 0x3a, 0xc8, 0x34, 0x3e, 0xc7, 0x39, 0x43, 0xc7, 0x33, 0x3d, 0xc7, +0x2f, 0x38, 0xc6, 0x2f, 0x39, 0xc6, 0x31, 0x3b, 0xc4, 0x2d, 0x37, 0xc4, +0x29, 0x32, 0xc3, 0x2a, 0x33, 0xc1, 0x32, 0x3c, 0xc1, 0x3c, 0x46, 0xbf, +0x44, 0x4f, 0xbe, 0x4a, 0x54, 0xb6, 0x49, 0x54, 0xbb, 0x43, 0x4e, 0xb9, +0x3f, 0x49, 0xb8, 0x40, 0x4a, 0xb6, 0x40, 0x4a, 0xb5, 0x44, 0x4e, 0xb3, +0x40, 0x49, 0x99, 0x31, 0x39, 0x71, 0x44, 0x4e, 0xa8, 0x3a, 0x43, 0xac, +0x30, 0x39, 0xa9, 0x2e, 0x37, 0xa8, 0x2d, 0x35, 0xa6, 0x2d, 0x35, 0xa4, +0x2a, 0x33, 0xa2, 0x28, 0x2f, 0xa1, 0x24, 0x2d, 0x9e, 0x23, 0x2a, 0x9d, +0x23, 0x2a, 0x9b, 0x25, 0x2c, 0x99, 0x27, 0x2e, 0x97, 0x29, 0x31, 0x95, +0x28, 0x30, 0x93, 0x27, 0x2d, 0x92, 0x24, 0x2b, 0x90, 0x22, 0x29, 0x8e, +0x21, 0x27, 0x8d, 0x21, 0x27, 0x8b, 0x20, 0x26, 0x89, 0x20, 0x25, 0x87, +0x1f, 0x25, 0x86, 0x1f, 0x24, 0x84, 0x1f, 0x25, 0x83, 0x20, 0x27, 0x81, +0x22, 0x28, 0x7f, 0x25, 0x2b, 0x7e, 0x27, 0x2d, 0x7d, 0x2a, 0x2f, 0x7b, +0x2b, 0x31, 0x7a, 0x29, 0x2f, 0x78, 0x28, 0x2e, 0x77, 0x26, 0x2d, 0x75, +0x25, 0x2b, 0x75, 0x24, 0x2a, 0x73, 0x24, 0x29, 0x72, 0x22, 0x27, 0x70, +0x21, 0x27, 0x6f, 0x21, 0x26, 0x6e, 0x20, 0x25, 0x6d, 0x1f, 0x24, 0x6b, +0x1e, 0x24, 0x6a, 0x1d, 0x23, 0x69, 0x1d, 0x23, 0x68, 0x1c, 0x22, 0x67, +0x1c, 0x22, 0x65, 0x1b, 0x21, 0x65, 0x1a, 0x20, 0x63, 0x1a, 0x1f, 0x63, +0x1a, 0x1f, 0x62, 0x1a, 0x1e, 0x61, 0x19, 0x1d, 0x60, 0x19, 0x1d, 0x5f, +0x18, 0x1c, 0x5e, 0x17, 0x1c, 0x5d, 0x17, 0x1b, 0x5c, 0x16, 0x1b, 0x5b, +0x16, 0x1a, 0x5a, 0x16, 0x1a, 0x59, 0x16, 0x1a, 0x59, 0x15, 0x19, 0x58, +0x15, 0x19, 0x57, 0x15, 0x18, 0x56, 0x14, 0x18, 0x55, 0x14, 0x18, 0x54, +0x14, 0x18, 0x54, 0x14, 0x17, 0x53, 0x13, 0x17, 0x52, 0x13, 0x17, 0x51, +0x13, 0x17, 0x51, 0x13, 0x16, 0x50, 0x12, 0x16, 0x4f, 0x12, 0x16, 0x4f, +0x12, 0x16, 0x4e, 0x12, 0x15, 0x4d, 0x12, 0x16, 0x4d, 0x12, 0x15, 0x4c, +0x12, 0x15, 0x4b, 0x12, 0x15, 0x4b, 0x12, 0x15, 0x4a, 0x11, 0x15, 0x49, +0x11, 0x15, 0x49, 0x12, 0x15, 0x48, 0x12, 0x15, 0x48, 0x11, 0x14, 0x47, +0x12, 0x15, 0x47, 0x11, 0x14, 0x45, 0x11, 0x14, 0x45, 0x11, 0x14, 0x45, +0x11, 0x14, 0x45, 0x11, 0x14, 0x44, 0x11, 0x14, 0x43, 0x10, 0x13, 0x42, +0x10, 0x13, 0x41, 0x10, 0x13, 0x41, 0x10, 0x13, 0x41, 0x10, 0x13, 0x40, +0x10, 0x13, 0x40, 0x0f, 0x12, 0x3f, 0x0f, 0x12, 0x3f, 0x0f, 0x12, 0x3e, +0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3d, 0x0f, 0x12, 0x3d, 0x0f, 0x12, 0x3d, +0x0e, 0x11, 0x3c, 0x0e, 0x11, 0x3c, 0x0e, 0x10, 0x35, 0x01, 0x01, 0x04, +0x11, 0x14, 0x41, 0x22, 0x29, 0x83, 0x24, 0x2a, 0x88, 0x20, 0x25, 0x75, +0x1c, 0x22, 0x6c, 0x1d, 0x22, 0x6d, 0x1c, 0x22, 0x6e, 0x1d, 0x23, 0x70, +0x1c, 0x23, 0x71, 0x1d, 0x23, 0x71, 0x1d, 0x23, 0x73, 0x1d, 0x23, 0x74, +0x1d, 0x23, 0x76, 0x1d, 0x23, 0x77, 0x1d, 0x23, 0x79, 0x1c, 0x23, 0x7a, +0x1c, 0x22, 0x7b, 0x1d, 0x22, 0x7c, 0x1c, 0x22, 0x7e, 0x1d, 0x22, 0x80, +0x1e, 0x24, 0x81, 0x21, 0x27, 0x83, 0x24, 0x2b, 0x84, 0x29, 0x30, 0x86, +0x2e, 0x35, 0x87, 0x2f, 0x37, 0x89, 0x2f, 0x37, 0x8a, 0x2f, 0x38, 0x8c, +0x2f, 0x37, 0x8e, 0x2f, 0x37, 0x90, 0x31, 0x38, 0x91, 0x31, 0x39, 0x93, +0x32, 0x3a, 0x95, 0x33, 0x3b, 0x96, 0x31, 0x39, 0x98, 0x2e, 0x36, 0x9b, +0x2a, 0x32, 0x9c, 0x27, 0x2f, 0x9e, 0x28, 0x2f, 0x9f, 0x28, 0x31, 0xa1, +0x2a, 0x32, 0xa4, 0x2a, 0x32, 0xa5, 0x29, 0x32, 0xa7, 0x29, 0x31, 0xa8, +0x29, 0x31, 0xab, 0x2d, 0x35, 0xac, 0x31, 0x3b, 0xae, 0x36, 0x3f, 0xb0, +0x31, 0x3b, 0xb2, 0x2d, 0x37, 0xb4, 0x2e, 0x37, 0xb6, 0x37, 0x41, 0xb8, +0x42, 0x4c, 0xba, 0x39, 0x42, 0xbb, 0x2f, 0x38, 0xbc, 0x2c, 0x35, 0xbe, +0x2c, 0x36, 0xc0, 0x2e, 0x37, 0xc0, 0x31, 0x3b, 0xc1, 0x36, 0x40, 0xc2, +0x3f, 0x49, 0xc3, 0x4b, 0x56, 0xc3, 0x48, 0x53, 0xaa, 0x41, 0x4b, 0x96, +0x4d, 0x58, 0xb8, 0x3c, 0x46, 0xc3, 0x31, 0x3a, 0xc4, 0x30, 0x39, 0xc4, +0x2e, 0x38, 0xc4, 0x33, 0x3c, 0xc3, 0x37, 0x41, 0xc3, 0x32, 0x3c, 0xc2, +0x2e, 0x38, 0xc2, 0x2d, 0x37, 0xc2, 0x2f, 0x39, 0xc1, 0x2e, 0x37, 0xc0, +0x29, 0x32, 0xbe, 0x27, 0x30, 0xbe, 0x2e, 0x37, 0xbd, 0x37, 0x40, 0xbc, +0x3f, 0x4a, 0xba, 0x47, 0x51, 0xb9, 0x49, 0x54, 0xb8, 0x43, 0x4d, 0xb6, +0x3f, 0x48, 0xb5, 0x3f, 0x48, 0xb3, 0x3e, 0x47, 0xb1, 0x3e, 0x48, 0xb0, +0x45, 0x4e, 0xae, 0x3b, 0x44, 0x8c, 0x33, 0x3a, 0x74, 0x40, 0x4a, 0xa9, +0x35, 0x3e, 0xa7, 0x2d, 0x35, 0xa6, 0x2d, 0x35, 0xa4, 0x2c, 0x34, 0xa2, +0x2b, 0x33, 0xa0, 0x29, 0x31, 0x9e, 0x26, 0x2e, 0x9d, 0x24, 0x2b, 0x9b, +0x22, 0x28, 0x98, 0x22, 0x2a, 0x97, 0x24, 0x2b, 0x95, 0x26, 0x2d, 0x93, +0x28, 0x30, 0x92, 0x27, 0x2e, 0x90, 0x25, 0x2c, 0x8e, 0x23, 0x2a, 0x8d, +0x21, 0x29, 0x8b, 0x20, 0x26, 0x89, 0x20, 0x25, 0x87, 0x1f, 0x25, 0x86, +0x1f, 0x24, 0x85, 0x1e, 0x24, 0x83, 0x1d, 0x23, 0x81, 0x1e, 0x24, 0x80, +0x1f, 0x25, 0x7e, 0x20, 0x27, 0x7d, 0x23, 0x28, 0x7c, 0x24, 0x2b, 0x7a, +0x27, 0x2d, 0x79, 0x29, 0x2f, 0x77, 0x28, 0x2e, 0x76, 0x27, 0x2d, 0x75, +0x25, 0x2c, 0x74, 0x24, 0x2b, 0x72, 0x24, 0x29, 0x71, 0x23, 0x28, 0x70, +0x21, 0x27, 0x6e, 0x21, 0x26, 0x6d, 0x20, 0x25, 0x6c, 0x1f, 0x24, 0x6b, +0x1e, 0x23, 0x69, 0x1e, 0x23, 0x68, 0x1d, 0x23, 0x67, 0x1c, 0x22, 0x66, +0x1c, 0x22, 0x65, 0x1b, 0x21, 0x65, 0x1b, 0x21, 0x63, 0x1a, 0x20, 0x63, +0x1a, 0x1f, 0x62, 0x1a, 0x1e, 0x60, 0x19, 0x1e, 0x5f, 0x19, 0x1d, 0x5f, +0x18, 0x1c, 0x5e, 0x18, 0x1c, 0x5d, 0x17, 0x1c, 0x5c, 0x17, 0x1b, 0x5b, +0x17, 0x1b, 0x5a, 0x16, 0x1a, 0x59, 0x16, 0x1a, 0x58, 0x15, 0x19, 0x57, +0x15, 0x19, 0x57, 0x15, 0x19, 0x56, 0x14, 0x18, 0x55, 0x14, 0x18, 0x54, +0x14, 0x17, 0x53, 0x14, 0x17, 0x53, 0x13, 0x17, 0x52, 0x13, 0x17, 0x51, +0x13, 0x16, 0x50, 0x13, 0x16, 0x50, 0x12, 0x16, 0x4f, 0x12, 0x16, 0x4e, +0x12, 0x16, 0x4e, 0x12, 0x15, 0x4d, 0x12, 0x15, 0x4c, 0x12, 0x15, 0x4c, +0x11, 0x15, 0x4b, 0x11, 0x15, 0x4a, 0x11, 0x15, 0x4a, 0x11, 0x15, 0x49, +0x11, 0x15, 0x49, 0x11, 0x14, 0x48, 0x11, 0x14, 0x48, 0x11, 0x14, 0x47, +0x11, 0x14, 0x45, 0x11, 0x14, 0x45, 0x11, 0x14, 0x45, 0x11, 0x14, 0x45, +0x11, 0x14, 0x44, 0x11, 0x14, 0x44, 0x11, 0x14, 0x43, 0x10, 0x13, 0x42, +0x10, 0x13, 0x41, 0x10, 0x13, 0x41, 0x10, 0x13, 0x40, 0x10, 0x13, 0x40, +0x10, 0x12, 0x3f, 0x0f, 0x12, 0x3f, 0x0f, 0x12, 0x3f, 0x0f, 0x12, 0x3e, +0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3d, 0x0f, 0x12, 0x3d, 0x0e, 0x11, 0x3c, +0x0e, 0x11, 0x3c, 0x0e, 0x11, 0x3c, 0x0e, 0x10, 0x35, 0x01, 0x01, 0x04, +0x10, 0x14, 0x41, 0x22, 0x29, 0x83, 0x23, 0x2a, 0x82, 0x1b, 0x21, 0x68, +0x19, 0x1d, 0x5c, 0x18, 0x1d, 0x5d, 0x19, 0x1e, 0x5f, 0x19, 0x1e, 0x60, +0x19, 0x1e, 0x61, 0x19, 0x1e, 0x62, 0x19, 0x1e, 0x63, 0x19, 0x1e, 0x64, +0x19, 0x1e, 0x65, 0x19, 0x1d, 0x66, 0x19, 0x1e, 0x67, 0x19, 0x1d, 0x68, +0x19, 0x1d, 0x6a, 0x18, 0x1c, 0x6a, 0x19, 0x1e, 0x6c, 0x1a, 0x20, 0x6d, +0x1e, 0x22, 0x6f, 0x20, 0x25, 0x70, 0x24, 0x29, 0x71, 0x27, 0x2e, 0x72, +0x28, 0x2e, 0x73, 0x28, 0x2e, 0x75, 0x28, 0x2e, 0x77, 0x28, 0x2e, 0x77, +0x28, 0x2f, 0x79, 0x29, 0x30, 0x7b, 0x29, 0x30, 0x7d, 0x2b, 0x31, 0x7d, +0x2b, 0x32, 0x7e, 0x2a, 0x31, 0x80, 0x27, 0x2e, 0x81, 0x25, 0x2b, 0x83, +0x22, 0x29, 0x85, 0x22, 0x28, 0x86, 0x22, 0x29, 0x88, 0x23, 0x2b, 0x8a, +0x25, 0x2b, 0x8a, 0x24, 0x2b, 0x8c, 0x23, 0x2a, 0x8d, 0x22, 0x29, 0x8f, +0x25, 0x2d, 0x91, 0x29, 0x30, 0x92, 0x2e, 0x35, 0x94, 0x2c, 0x32, 0x96, +0x28, 0x30, 0x96, 0x25, 0x2d, 0x97, 0x2b, 0x32, 0x99, 0x32, 0x3a, 0x9b, +0x36, 0x3e, 0x9d, 0x2d, 0x34, 0x9f, 0x26, 0x2e, 0xa0, 0x25, 0x2e, 0xa1, +0x26, 0x2e, 0xa2, 0x27, 0x2f, 0xa2, 0x2b, 0x33, 0xa3, 0x2f, 0x37, 0xa3, +0x36, 0x3e, 0xa3, 0x40, 0x4b, 0xa3, 0x3f, 0x48, 0x96, 0x39, 0x40, 0x81, +0x43, 0x4b, 0xa4, 0x32, 0x3b, 0xa5, 0x29, 0x32, 0xa5, 0x28, 0x31, 0xa5, +0x28, 0x31, 0xa5, 0x2b, 0x33, 0xa5, 0x2e, 0x37, 0xa4, 0x2c, 0x34, 0xa4, +0x28, 0x30, 0xa3, 0x27, 0x2f, 0xa3, 0x28, 0x30, 0xa2, 0x28, 0x30, 0xa2, +0x24, 0x2c, 0xa2, 0x22, 0x29, 0xa1, 0x25, 0x2e, 0xa0, 0x2d, 0x35, 0x9f, +0x32, 0x3b, 0x9d, 0x39, 0x41, 0x9d, 0x3f, 0x48, 0x9b, 0x3b, 0x44, 0x9a, +0x37, 0x3e, 0x98, 0x34, 0x3b, 0x97, 0x34, 0x3d, 0x96, 0x34, 0x3d, 0x95, +0x37, 0x3f, 0x94, 0x39, 0x42, 0x8d, 0x30, 0x37, 0x6f, 0x35, 0x3c, 0x7e, +0x32, 0x3b, 0x8e, 0x2b, 0x32, 0x8c, 0x26, 0x2e, 0x8b, 0x26, 0x2d, 0x8a, +0x25, 0x2d, 0x89, 0x24, 0x2c, 0x87, 0x22, 0x29, 0x85, 0x21, 0x26, 0x83, +0x1e, 0x25, 0x82, 0x1d, 0x23, 0x80, 0x1e, 0x23, 0x7e, 0x1f, 0x25, 0x7e, +0x21, 0x26, 0x7d, 0x22, 0x28, 0x7b, 0x22, 0x27, 0x7a, 0x20, 0x25, 0x78, +0x1e, 0x25, 0x77, 0x1d, 0x23, 0x75, 0x1c, 0x22, 0x73, 0x1b, 0x20, 0x73, +0x1a, 0x20, 0x71, 0x1a, 0x20, 0x70, 0x1a, 0x20, 0x6f, 0x19, 0x1f, 0x6d, +0x19, 0x1e, 0x6d, 0x1a, 0x1f, 0x6b, 0x1b, 0x22, 0x6a, 0x1d, 0x22, 0x68, +0x1f, 0x23, 0x67, 0x20, 0x25, 0x66, 0x22, 0x26, 0x65, 0x22, 0x27, 0x64, +0x22, 0x26, 0x64, 0x21, 0x26, 0x63, 0x20, 0x25, 0x61, 0x1f, 0x24, 0x60, +0x1e, 0x22, 0x5f, 0x1d, 0x22, 0x5d, 0x1c, 0x21, 0x5c, 0x1b, 0x20, 0x5c, +0x1b, 0x20, 0x5b, 0x1a, 0x1f, 0x5a, 0x19, 0x1e, 0x58, 0x19, 0x1e, 0x57, +0x19, 0x1e, 0x57, 0x18, 0x1d, 0x56, 0x18, 0x1d, 0x56, 0x17, 0x1c, 0x55, +0x17, 0x1b, 0x54, 0x17, 0x1a, 0x53, 0x17, 0x1a, 0x52, 0x17, 0x19, 0x51, +0x16, 0x19, 0x50, 0x16, 0x19, 0x50, 0x15, 0x19, 0x4f, 0x15, 0x18, 0x4e, +0x15, 0x18, 0x4e, 0x15, 0x18, 0x4d, 0x14, 0x17, 0x4c, 0x13, 0x17, 0x4b, +0x13, 0x17, 0x4b, 0x13, 0x16, 0x4a, 0x13, 0x16, 0x4a, 0x12, 0x16, 0x49, +0x12, 0x16, 0x48, 0x12, 0x15, 0x47, 0x11, 0x15, 0x47, 0x11, 0x15, 0x46, +0x11, 0x15, 0x45, 0x10, 0x14, 0x45, 0x10, 0x14, 0x45, 0x10, 0x14, 0x44, +0x10, 0x13, 0x43, 0x10, 0x13, 0x43, 0x10, 0x13, 0x42, 0x10, 0x13, 0x42, +0x0f, 0x13, 0x41, 0x0f, 0x12, 0x40, 0x0f, 0x12, 0x3f, 0x0f, 0x12, 0x3f, +0x0f, 0x12, 0x3f, 0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3e, +0x0f, 0x12, 0x3c, 0x0f, 0x12, 0x3c, 0x0e, 0x12, 0x3c, 0x0f, 0x12, 0x3c, +0x0e, 0x12, 0x3b, 0x0e, 0x12, 0x3b, 0x0e, 0x10, 0x39, 0x0e, 0x10, 0x39, +0x0e, 0x10, 0x39, 0x0e, 0x10, 0x39, 0x0e, 0x10, 0x38, 0x0e, 0x10, 0x38, +0x0d, 0x10, 0x37, 0x0d, 0x10, 0x37, 0x0d, 0x10, 0x36, 0x0d, 0x10, 0x36, +0x0d, 0x10, 0x36, 0x0d, 0x10, 0x35, 0x0d, 0x10, 0x35, 0x0c, 0x0f, 0x34, +0x0c, 0x0f, 0x34, 0x0c, 0x0f, 0x34, 0x0c, 0x0f, 0x32, 0x01, 0x01, 0x04, +0x02, 0x02, 0x08, 0x0a, 0x0d, 0x29, 0x02, 0x03, 0x09, 0x00, 0x00, 0x02, +0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, +0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, +0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, +0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, +0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, +0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, +0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, +0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, +0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, +0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, +0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, +0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, +0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, +0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, +0x00, 0x00, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x00, 0x01, +0x00, 0x01, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, +0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, +0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, +0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, +0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, +0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, +0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, +0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, +0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, +0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, +0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, +0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, +0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, +0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, +0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, +0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, +0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, +0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, +0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, +0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, +0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, +0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, +0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, +0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, +0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, +0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; diff --git a/src/main.c b/src/main.c new file mode 100644 index 00000000..157b9ac0 --- /dev/null +++ b/src/main.c @@ -0,0 +1,436 @@ +/* + * GQview image viewer + * (C)1999 John Ellis + * + * Author: John Ellis + * + */ + +#include "gqview.h" +#include /* for keyboard values */ + +static void parse_command_line(int argc, char *argv[], gchar **path, gchar **file); +static void setup_default_options(); + +/* + *----------------------------------------------------------------------------- + * path manipulation routines (public) + *----------------------------------------------------------------------------- + */ + +gchar *filename_from_path(char *t) +{ + char *p; + + p = t + strlen(t); + while(p > t && p[0] != '/') p--; + if (p[0] == '/') p++; + return p; +} + +gchar *remove_level_from_path(gchar *path) +{ + gchar *new_path; + gchar *ptr = path; + gint p; + + if (!path) return NULL; + + p = strlen(path) - 1; + if (p < 0) return NULL; + while(ptr[p] != '/' && p > 0) p--; + if (p == 0 && ptr[p] == '/') p++; + new_path = g_strndup(path, (guint)p); + return new_path; +} + +void parse_out_relatives(gchar *path) +{ + gint s, t; + + if (!path) return; + + s = t = 0; + + while (path[s] != '\0') + { + if (path[s] == '/' && path[s+1] == '.' && (path[s+2] == '/' || path[s+2] == '\0') ) + { + s += 2; + } + else if (path[s] == '/' && path[s+1] == '.' && path[s+2] == '.' && (path[s+3] == '/' || path[s+3] == '\0') ) + { + s += 3; + if (t > 0) t--; + while (path[t] != '/' && t > 0) t--; + } + else + { + if (s != t) path[t] = path[s]; + t++; + s++; + } + } + if (t == 0 && path[t] == '/') t++; + if (t > 1 && path[t-1] == '/') t--; + path[t] = '\0'; +} + +/* + *----------------------------------------------------------------------------- + * external editor start routines (public) + *----------------------------------------------------------------------------- + */ + +void start_editor_from_file(gint n, gchar *path) +{ + gchar *cmd; + if (!path) return; + cmd = g_strdup_printf("%s \"%s\" &", editor_command[n], path); + printf(_("GQview running: %s\n"),cmd); + system(cmd); + g_free(cmd); +} + +void start_editor_from_image(gint n) +{ + start_editor_from_file(n, image_get_path()); +} + +void start_editor_from_list(gint n) +{ + gchar *cmd; + gchar *buf; + GList *list = file_get_selected_list(); + GList *work; + if (!list) return; + work = list; + cmd = g_strconcat(editor_command[n], " ", NULL); + while(work) + { + buf = cmd; + cmd = g_strconcat(buf, "\"", work->data, "\" ", NULL); + g_free(buf); + work = work->next; + } + buf = cmd; + cmd = g_strconcat(buf, "&", NULL); + g_free(buf); + printf(_("GQview running: %s\n"),cmd); + system(cmd); + g_free(cmd); + free_selected_list(list); +} + +/* + *----------------------------------------------------------------------------- + * keyboard functions + *----------------------------------------------------------------------------- + */ + +void keyboard_scroll_calc(gint *x, gint *y, GdkEventKey *event) +{ + static gint delta = 0; + static guint32 time_old = 0; + static guint keyval_old = 0; + + if (progressive_key_scrolling) + { + guint32 time_diff; + + time_diff = event->time - time_old; + + /* key pressed within 125ms ? (1/8 second) */ + if (time_diff > 125 || event->keyval != keyval_old) delta = 0; + + time_old = event->time; + keyval_old = event->keyval; + + delta += 2; + } + else + { + delta = 8; + } + + *x = *x * delta; + *y = *y * delta; +} + +gint key_press_cb(GtkWidget *widget, GdkEventKey *event) +{ + gint stop_signal = FALSE; + gint x = 0; + gint y = 0; + + if (GTK_WIDGET_HAS_FOCUS(path_entry)) + { + if (event->keyval == GDK_Escape) + gtk_entry_set_text(GTK_ENTRY(path_entry), current_path); + return stop_signal; + } + + if (full_screen_window || GTK_WIDGET_HAS_FOCUS(main_image->viewport)) + { + switch (event->keyval) + { + case GDK_Left: + x -= 1; + stop_signal = TRUE; + break; + case GDK_Right: + x += 1; + stop_signal = TRUE; + break; + case GDK_Up: + y -= 1; + stop_signal = TRUE; + break; + case GDK_Down: + y += 1; + stop_signal = TRUE; + break; + case GDK_BackSpace: + file_prev_image(); + stop_signal = TRUE; + break; + case GDK_space: + file_next_image(); + stop_signal = TRUE; + break; + } + } + + switch (event->keyval) + { + case '+': + image_adjust_zoom(1); + break; + case GDK_Page_Up: + file_prev_image(); + stop_signal = TRUE; + break; + case GDK_Page_Down: + file_next_image(); + stop_signal = TRUE; + break; + case GDK_Home: + file_first_image(); + stop_signal = TRUE; + break; + case GDK_End: + file_last_image(); + stop_signal = TRUE; + break; + case GDK_Delete: + file_util_delete(image_get_path(), NULL); + stop_signal = TRUE; + break; + case GDK_Escape: + interrupt_thumbs(); + stop_signal = TRUE; + break; + case 'Q': case 'q': + if (event->state == 0 || (event->state & GDK_MODIFIER_MASK) == GDK_LOCK_MASK) + { + exit_gqview(); + return FALSE; + } + break; + } + + if (event->state & GDK_SHIFT_MASK) + { + x *= 3; + y *= 3; + } + + if (x != 0 || y!= 0) + { + keyboard_scroll_calc(&x, &y, event); + image_scroll(x, y); + } + + if (stop_signal) gtk_signal_emit_stop_by_name(GTK_OBJECT(widget), "key_press_event"); + + return stop_signal; +} + +/* + *----------------------------------------------------------------------------- + * command line parser (private) + *----------------------------------------------------------------------------- + */ + +static void parse_command_line(int argc, char *argv[], gchar **path, gchar **file) +{ + if (argc > 1) + { + gint i; + gchar *base_dir = get_current_dir(); + i = 1; + while (i < argc) + { + gchar *cmd_line = argv[i]; + gchar *cmd_all = g_strconcat(base_dir, "/", cmd_line, NULL); + + if (!*path && cmd_line[0] == '/' && isdir(cmd_line)) + { + *path = g_strdup(cmd_line); + } + else if (!*path && isdir(cmd_all)) + { + *path = g_strdup(cmd_all); + } + else if (!*file && cmd_line[0] == '/' && isfile(cmd_line)) + { + g_free(*path); + *path = remove_level_from_path(cmd_line); + *file = g_strdup(cmd_line); + } + else if (!*file && isfile(cmd_all)) + { + g_free(*path); + *path = remove_level_from_path(cmd_all); + *file = g_strdup(cmd_all); + } + else if (strcmp(cmd_line, "-debug") == 0) + { + debug = TRUE; + printf("debugging output enabled\n"); + } + else if (strcmp(cmd_line, "+t") == 0 || + strcmp(cmd_line, "+tools") == 0) + { + tools_float = FALSE; + tools_hidden = FALSE; + } + else if (strcmp(cmd_line, "-t") == 0 || + strcmp(cmd_line, "-tools") == 0) + { + tools_hidden = TRUE; + } + else if (strcmp(cmd_line, "-help") == 0) + { + printf("GQview version %s\n", VERSION); + printf(_("Usage: gqview [options] [path]\n\n")); + printf(_("valid options are:\n")); + printf(_(" +t, +tools force show of tools\n")); + printf(_(" -t, -tools force hide of tools\n")); + printf(_(" -debug turn on debug output\n")); + printf(_(" -help this message\n\n")); + exit (0); + } + else + { + printf(_("invalid or ignored: %s\nUse -help for options\n"), cmd_line); + } + g_free(cmd_all); + i++; + } + g_free(base_dir); + parse_out_relatives(*path); + parse_out_relatives(*file); + } +} + +/* + *----------------------------------------------------------------------------- + * startup, init, and exit + *----------------------------------------------------------------------------- + */ + +static void setup_default_options() +{ + gint i; + + for(i=0; i<8; i++) + { + editor_name[i] = NULL; + editor_command[i] = NULL; + } + + editor_name[0] = g_strdup(_("The Gimp")); + editor_command[0] = g_strdup("gimp"); + + editor_name[1] = g_strdup(_("Electric Eyes")); + editor_command[1] = g_strdup("ee"); + + editor_name[2] = g_strdup(_("XV")); + editor_command[2] = g_strdup("xv"); + + editor_name[3] = g_strdup(_("Xpaint")); + editor_command[3] = g_strdup("xpaint"); + + custom_filter = g_strdup(".eim;"); +} + +void exit_gqview() +{ + full_screen_stop(); + + gdk_window_get_position (mainwindow->window, &main_window_x, &main_window_y); + gdk_window_get_size(mainwindow->window, &main_window_w, &main_window_h); + + if (toolwindow) + { + gdk_window_get_position (toolwindow->window, &float_window_x, &float_window_y); + gdk_window_get_size(toolwindow->window, &float_window_w, &float_window_h); + } + save_options(); + + gtk_main_quit(); +} + +int main (int argc, char *argv[]) +{ + gchar *cmd_path = NULL; + gchar *cmd_file = NULL; + + /* setup locale, i18n */ + gtk_set_locale(); + bindtextdomain (PACKAGE, LOCALEDIR); + textdomain (PACKAGE); + + /* setup random seed for random slideshow */ + srand (time (0)); + + gtk_init (&argc, &argv); + gdk_imlib_init(); + + /* push the correct color depths to gtk, (for 8-bit psuedo color displays) + * they should be popped, too, I guess... + */ + gtk_widget_push_visual(gdk_imlib_get_visual()); + gtk_widget_push_colormap(gdk_imlib_get_colormap()); + + setup_default_options(); + load_options(); + + parse_command_line(argc, argv, &cmd_path, &cmd_file); + + if (cmd_path) + current_path = g_strdup(cmd_path); + else if (startup_path_enable && startup_path && isdir(startup_path)) + current_path = g_strdup(startup_path); + else + current_path = get_current_dir(); + + create_main_window(); + update_edit_menus(mainwindow_accel_grp); + rebuild_file_filter(); + filelist_refresh(); + + init_dnd(); + + while(gtk_events_pending()) gtk_main_iteration(); + image_change_to(cmd_file); + + g_free(cmd_path); + g_free(cmd_file); + + gtk_main (); + return 0; +} + + diff --git a/src/menu.c b/src/menu.c new file mode 100644 index 00000000..36818d0b --- /dev/null +++ b/src/menu.c @@ -0,0 +1,671 @@ +/* + * GQview image viewer + * (C)1999 John Ellis + * + * Author: John Ellis + * + */ + +#include "gqview.h" + +#include "icons/icon_thumb.xpm" +#include "icons/icon_home.xpm" +#include "icons/icon_reload.xpm" +#include "icons/icon_zoom_in.xpm" +#include "icons/icon_zoom_out.xpm" +#include "icons/icon_zoom_fit.xpm" +#include "icons/icon_zoom_norm.xpm" +#include "icons/icon_config.xpm" +#include "icons/icon_float.xpm" + +static void set_thumbnails(gint mode); + +static void add_menu_item(GtkWidget *menu, gchar *label, GtkAccelGroup *accel_group, + guint accel_key, guint accel_mods, GtkSignalFunc func, gpointer data); + +static void add_edit_items(GtkWidget *menu, GtkSignalFunc func, GtkAccelGroup *accel_grp); + +static void add_button_to_bar(GtkWidget *hbox, gchar **pixmap_data, + GtkTooltips *tooltips, gchar *tip_text, + GtkSignalFunc func, gpointer data); + +static void set_thumbnails(gint mode) +{ + if (thumbnails_enabled == mode) return; + thumbnails_enabled = mode; + gtk_check_menu_item_set_state(GTK_CHECK_MENU_ITEM(thumb_menu_item), thumbnails_enabled); + gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(thumb_button), thumbnails_enabled); + filelist_populate_clist(); +} + +/* + *----------------------------------------------------------------------------- + * menu and button callbacks (private) + *----------------------------------------------------------------------------- + */ + +static void exit_cb(GtkWidget *widget, gpointer data) +{ + exit_gqview(); +} + +static void about_cb(GtkWidget *widget, gpointer data) +{ + show_about_window(); +} + +static void create_dir_cb(GtkWidget *widget, gpointer data) +{ + file_util_create_dir(current_path); +} + +static void zoom_in_cb(GtkWidget *widget, gpointer data) +{ + image_adjust_zoom(1); +} + +static void zoom_out_cb(GtkWidget *widget, gpointer data) +{ + image_adjust_zoom(-1); +} + +static void zoom_1_1_cb(GtkWidget *widget, gpointer data) +{ + image_set_zoom(1); +} + +static void zoom_fit_cb(GtkWidget *widget, gpointer data) +{ + image_set_zoom(0); +} + +static void thumb_menu_cb(GtkWidget *widget, gpointer data) +{ + set_thumbnails(GTK_CHECK_MENU_ITEM(widget)->active); +} + +static void thumb_button_cb(GtkWidget *widget, gpointer data) +{ + set_thumbnails(GTK_TOGGLE_BUTTON(widget)->active); +} + +static void refresh_cb(GtkWidget *widget, gpointer data) +{ + gchar *buf = g_strdup(current_path); + filelist_change_to(buf); + g_free(buf); +} + +static void float_cb(GtkWidget *widget, gpointer data) +{ + toolwindow_float(); +} + +static void hide_cb(GtkWidget *widget, gpointer data) +{ + toolwindow_hide(); +} + +static void slideshow_cb(GtkWidget *widget, gpointer data) +{ + slideshow_toggle(); +} + +static void home_dir_cb(GtkWidget *widget, gpointer data) +{ + gchar *path = homedir(); + if (path) filelist_change_to(path); +} + +static void config_cb(GtkWidget *widget, gpointer data) +{ + show_config_window(); +} + +static void remove_thumb_cb(GtkWidget *widget, gpointer data) +{ + maintain_thumbnail_dir("/", TRUE); +} + +static void full_screen_cb(GtkWidget *widget, gpointer data) +{ + full_screen_toggle(); +} + + +/* + *----------------------------------------------------------------------------- + * image menu callbacks (private) + *----------------------------------------------------------------------------- + */ + +static void copy_image_cb(GtkWidget *widget, gpointer data) +{ + full_screen_stop(); + file_util_copy(image_get_path(), NULL, current_path); +} + +static void move_image_cb(GtkWidget *widget, gpointer data) +{ + full_screen_stop(); + file_util_move(image_get_path(), NULL, current_path); +} + +static void rename_image_cb(GtkWidget *widget, gpointer data) +{ + full_screen_stop(); + file_util_rename(image_get_path(), NULL); +} + +static void delete_image_cb(GtkWidget *widget, gpointer data) +{ + full_screen_stop(); + file_util_delete(image_get_path(), NULL); +} + +/* + *----------------------------------------------------------------------------- + * file menu callbacks (private) + *----------------------------------------------------------------------------- + */ + +static void copy_file_cb(GtkWidget *widget, gpointer data) +{ + file_util_copy(NULL, file_get_selected_list(), current_path); +} + +static void move_file_cb(GtkWidget *widget, gpointer data) +{ + file_util_move(NULL, file_get_selected_list(), current_path); +} + +static void rename_file_cb(GtkWidget *widget, gpointer data) +{ + file_util_rename(NULL, file_get_selected_list()); +} + +static void delete_file_cb(GtkWidget *widget, gpointer data) +{ + file_util_delete(NULL, file_get_selected_list()); +} + +/* + *----------------------------------------------------------------------------- + * filelist popup menu callbacks (private) + *----------------------------------------------------------------------------- + */ + +static void popup_copy_file_cb(GtkWidget *widget, gpointer data) +{ + if (file_clicked_is_selected()) + { + file_util_copy(NULL, file_get_selected_list(), current_path); + } + else + { + gchar *path = file_clicked_get_path(); + file_util_copy(path, NULL, current_path); + g_free(path); + } +} + +static void popup_move_file_cb(GtkWidget *widget, gpointer data) +{ + if (file_clicked_is_selected()) + { + file_util_move(NULL, file_get_selected_list(), current_path); + } + else + { + gchar *path = file_clicked_get_path(); + file_util_move(path, NULL, current_path); + g_free(path); + } +} + +static void popup_rename_file_cb(GtkWidget *widget, gpointer data) +{ + if (file_clicked_is_selected()) + { + file_util_rename(NULL, file_get_selected_list()); + } + else + { + gchar *path = file_clicked_get_path(); + file_util_rename(path, NULL); + g_free(path); + } +} + +static void popup_delete_file_cb(GtkWidget *widget, gpointer data) +{ + if (file_clicked_is_selected()) + { + file_util_delete(NULL, file_get_selected_list()); + } + else + { + gchar *path = file_clicked_get_path(); + file_util_delete(path, NULL); + g_free(path); + } +} + +static void edit_image_cb(GtkWidget *widget, gpointer data) +{ + gint n = GPOINTER_TO_INT(data); + start_editor_from_image(n); +} + +static void edit_list_cb(GtkWidget *widget, gpointer data) +{ + gint n = GPOINTER_TO_INT(data); + start_editor_from_list(n); +} + +static void edit_full_cb(GtkWidget *widget, gpointer data) +{ + gint n = GPOINTER_TO_INT(data); + full_screen_stop(); + start_editor_from_image(n); +} + +static void edit_view_cb(GtkWidget *widget, gpointer data) +{ + gint n = GPOINTER_TO_INT(data); + view_window_active_edit(n); +} + +static void popup_edit_list_cb(GtkWidget *widget, gpointer data) +{ + gint n = GPOINTER_TO_INT(data); + + if (file_clicked_is_selected()) + { + start_editor_from_list(n); + } + else + { + gchar *path; + start_editor_from_file(n, path); + g_free(path); + } +} + +static void new_window_file_cb(GtkWidget *widget, gpointer data) +{ + gchar *path = file_clicked_get_path(); + view_window_new(path); + g_free(path); +} + +static void new_window_image_cb(GtkWidget *widget, gpointer data) +{ + view_window_new(image_get_path()); +} + +static void menu_file_popup_hide_cb(GtkWidget *widget, gpointer data) +{ + file_clist_highlight_unset(); +} + + +/* + *----------------------------------------------------------------------------- + * menu addition utilities (private) + *----------------------------------------------------------------------------- + */ + +static void add_menu_item(GtkWidget *menu, gchar *label, GtkAccelGroup *accel_group, + guint accel_key, guint accel_mods, GtkSignalFunc func, gpointer data) +{ + GtkWidget *item; + + item = gtk_menu_item_new_with_label(label); + gtk_widget_add_accelerator (item, "activate", accel_group, accel_key, accel_mods, GTK_ACCEL_VISIBLE); + gtk_signal_connect (GTK_OBJECT (item), "activate",(GtkSignalFunc) func, data); + gtk_menu_append(GTK_MENU(menu), item); + gtk_widget_show(item); +} + +void add_menu_popup_item(GtkWidget *menu, gchar *label, + GtkSignalFunc func, gpointer data) +{ + GtkWidget *item; + + item = gtk_menu_item_new_with_label(label); + gtk_signal_connect (GTK_OBJECT (item), "activate",(GtkSignalFunc) func, data); + gtk_menu_append(GTK_MENU(menu), item); + gtk_widget_show(item); +} + +void add_menu_divider(GtkWidget *menu) +{ + GtkWidget *item = gtk_menu_item_new(); + gtk_menu_append(GTK_MENU(menu),item); + gtk_widget_show(item); +} + +/* + *----------------------------------------------------------------------------- + * edit menu routines + *----------------------------------------------------------------------------- + */ + +static void add_edit_items(GtkWidget *menu, GtkSignalFunc func, GtkAccelGroup *accel_grp) +{ + gint i; + for (i = 0; i < 8; i++) + { + if (editor_command[i] && strlen(editor_command[i]) > 0) + { + gchar *text; + if (editor_name[i] && strlen(editor_name[i]) > 0) + text = g_strdup_printf(_("in %s..."), editor_name[i]); + else + text = g_strdup(_("in (unknown)...")); + if (accel_grp) + add_menu_item(menu, text, accel_grp, i + 49, GDK_CONTROL_MASK, func, GINT_TO_POINTER(i)); + else + add_menu_popup_item(menu, text, func, GINT_TO_POINTER(i)); + g_free(text); + } + } +} + +void update_edit_menus(GtkAccelGroup *accel_grp) +{ + GtkWidget *menu; + + /* main edit menu */ + + menu = gtk_menu_new(); + add_edit_items(menu, edit_list_cb, accel_grp); + add_menu_divider(menu); + add_menu_item(menu, _("Options..."), accel_grp, 'O', GDK_CONTROL_MASK, config_cb, NULL); + add_menu_divider(menu); + add_menu_item(menu, _("Remove old thumbnails"), accel_grp, 'T', GDK_CONTROL_MASK, remove_thumb_cb, NULL); + gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_edit), menu); + + /* file edit popup */ + menu = gtk_menu_new(); + add_edit_items(menu, popup_edit_list_cb, NULL); + gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_filelist_edit), menu); + + /* image edit popup */ + menu = gtk_menu_new(); + add_edit_items(menu, edit_image_cb, NULL); + gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_image_edit), menu); + + /* full screen edit popup */ + menu = gtk_menu_new(); + add_edit_items(menu, edit_full_cb, NULL); + gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_window_full_edit), menu); + + /* view edit popup */ + menu = gtk_menu_new(); + add_edit_items(menu, edit_view_cb, NULL); + gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_window_view_edit), menu); +} + +/* + *----------------------------------------------------------------------------- + * menu bar setup routines + *----------------------------------------------------------------------------- + */ + +GtkWidget *create_menu_bar(GtkAccelGroup *accel_grp) +{ + GtkWidget *bar; + GtkWidget *menu; + + bar = gtk_menu_bar_new(); + + /* file menu */ + menu_file = gtk_menu_item_new_with_label(_("File")); + gtk_widget_show(menu_file); + + menu = gtk_menu_new(); + add_menu_item(menu, _("Create Dir..."), accel_grp, 'N', GDK_CONTROL_MASK, create_dir_cb, NULL); + add_menu_divider(menu); + add_menu_item(menu, _("Copy..."), accel_grp, 'C', GDK_CONTROL_MASK, copy_file_cb, NULL); + add_menu_item(menu, _("Move..."), accel_grp, 'M', GDK_CONTROL_MASK, move_file_cb, NULL); + add_menu_item(menu, _("Rename..."), accel_grp, 'R', GDK_CONTROL_MASK, rename_file_cb, NULL); + add_menu_item(menu, _("Delete..."), accel_grp, 'D', GDK_CONTROL_MASK, delete_file_cb, NULL); + add_menu_divider(menu); + add_menu_item(menu, _("Exit"), accel_grp, 'Q', GDK_CONTROL_MASK, exit_cb, NULL); + + gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_file),menu); + gtk_menu_bar_append(GTK_MENU_BAR(bar),menu_file); + + /* edit menu */ + menu_edit = gtk_menu_item_new_with_label(_("Edit")); + gtk_widget_show(menu_edit); + + menu = gtk_menu_new(); + + gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_edit), menu); + gtk_menu_bar_append(GTK_MENU_BAR(bar), menu_edit); + + /* view menu */ + menu_view = gtk_menu_item_new_with_label(_("View")); + gtk_widget_show(menu_view); + + menu = gtk_menu_new(); + add_menu_item(menu, _("Zoom in"), accel_grp, '=', FALSE, zoom_in_cb, NULL); + add_menu_item(menu, _("Zoom out"), accel_grp, '-', FALSE, zoom_out_cb, NULL); + add_menu_item(menu, _("Zoom 1:1"), accel_grp, 'Z', FALSE, zoom_1_1_cb, NULL); + add_menu_item(menu, _("Fit image to window"), accel_grp, 'X', FALSE, zoom_fit_cb, NULL); + add_menu_divider(menu); + + add_menu_item(menu, _("Full screen"), accel_grp, 'F', GDK_CONTROL_MASK, full_screen_cb, NULL); + thumb_menu_item = gtk_check_menu_item_new_with_label(_("Thumbnails")); + gtk_widget_add_accelerator (thumb_menu_item, "activate", accel_grp, 'T', FALSE, GTK_ACCEL_VISIBLE); + gtk_signal_connect (GTK_OBJECT (thumb_menu_item), "activate",(GtkSignalFunc) thumb_menu_cb, thumb_menu_item); + gtk_menu_append(GTK_MENU(menu), thumb_menu_item); + gtk_widget_show(thumb_menu_item); + + add_menu_divider(menu); + add_menu_item(menu, _("Refresh Lists"), accel_grp, 'R', FALSE, refresh_cb, NULL); + add_menu_item(menu, _("(Un)Float file list"), accel_grp, 'F', FALSE, float_cb, NULL); + add_menu_item(menu, _("(Un)Hide file list"), accel_grp, 'H', FALSE, hide_cb, NULL); + + add_menu_divider(menu); + add_menu_item(menu, _("Toggle slideshow"), accel_grp, 'S', FALSE, slideshow_cb, NULL); + + gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_view), menu); + gtk_menu_bar_append(GTK_MENU_BAR(bar), menu_view); + + /* help menu */ + menu_help = gtk_menu_item_new_with_label(_("Help")); + gtk_widget_show(menu_help); + + menu = gtk_menu_new(); + add_menu_item(menu, _("About"), accel_grp, 'A', GDK_CONTROL_MASK, about_cb, NULL); + + gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_help), menu); + gtk_menu_bar_append(GTK_MENU_BAR(bar), menu_help); + + return bar; +} + +/* + *----------------------------------------------------------------------------- + * menu file list routines (private) + *----------------------------------------------------------------------------- + */ + +static void create_menu_file_list_popup() +{ + menu_file_popup = gtk_menu_new(); + gtk_signal_connect(GTK_OBJECT(menu_file_popup), "hide", (GtkSignalFunc) menu_file_popup_hide_cb, NULL); + + menu_filelist_edit = gtk_menu_item_new_with_label(_("Edit")); + gtk_menu_append(GTK_MENU(menu_file_popup), menu_filelist_edit); + gtk_widget_show(menu_filelist_edit); + + add_menu_popup_item(menu_file_popup, _("View in new window"), new_window_file_cb, NULL); + + add_menu_divider(menu_file_popup); + add_menu_popup_item(menu_file_popup, _("Copy..."), popup_copy_file_cb, NULL); + add_menu_popup_item(menu_file_popup, _("Move..."), popup_move_file_cb, NULL); + add_menu_popup_item(menu_file_popup, _("Rename..."), popup_rename_file_cb, NULL); + add_menu_popup_item(menu_file_popup, _("Delete..."), popup_delete_file_cb, NULL); + add_menu_divider(menu_file_popup); + add_menu_popup_item(menu_file_popup, _("Refresh"), refresh_cb, NULL); +} + +/* + *----------------------------------------------------------------------------- + * menu image routines (private) + *----------------------------------------------------------------------------- + */ + +static void create_menu_image_popup() +{ + menu_image_popup = gtk_menu_new(); + + add_menu_popup_item(menu_image_popup, _("Zoom in"), zoom_in_cb, NULL); + add_menu_popup_item(menu_image_popup, _("Zoom out"), zoom_out_cb, NULL); + add_menu_popup_item(menu_image_popup, _("Zoom 1:1"), zoom_1_1_cb, NULL); + add_menu_popup_item(menu_image_popup, _("Fit image to window"), zoom_fit_cb, NULL); + add_menu_divider(menu_image_popup); + + menu_image_edit = gtk_menu_item_new_with_label(_("Edit")); + gtk_menu_append(GTK_MENU(menu_image_popup), menu_image_edit); + gtk_widget_show(menu_image_edit); + + add_menu_popup_item(menu_image_popup, _("View in new window"), new_window_image_cb, NULL); + + add_menu_divider(menu_image_popup); + add_menu_popup_item(menu_image_popup, _("Copy..."), copy_image_cb, NULL); + add_menu_popup_item(menu_image_popup, _("Move..."), move_image_cb, NULL); + add_menu_popup_item(menu_image_popup, _("Rename..."), rename_image_cb, NULL); + add_menu_popup_item(menu_image_popup, _("Delete..."), delete_image_cb, NULL); + add_menu_divider(menu_image_popup); + add_menu_popup_item(menu_image_popup, _("(Un)Hide file list"), hide_cb, NULL); + add_menu_popup_item(menu_image_popup, _("Full screen"), full_screen_cb, NULL); +} + +/* + *----------------------------------------------------------------------------- + * menu full screen routines (private) + *----------------------------------------------------------------------------- + */ + +/* this re-grabs the keyboard when the menu closes, needed for override redirect */ +static void menu_full_popup_hide_cb(GtkWidget *widget, gpointer data) +{ + if (full_screen_window) + { + gdk_keyboard_grab(full_screen_window->window, TRUE, GDK_CURRENT_TIME); + } +} + +static void create_menu_full_screen_popup() +{ + menu_window_full = gtk_menu_new(); + add_menu_popup_item(menu_window_full, _("Zoom in"), zoom_in_cb, NULL); + add_menu_popup_item(menu_window_full, _("Zoom out"), zoom_out_cb, NULL); + add_menu_popup_item(menu_window_full, _("Zoom 1:1"), zoom_1_1_cb, NULL); + add_menu_popup_item(menu_window_full, _("Fit image to window"), zoom_fit_cb, NULL); + add_menu_divider(menu_window_full); + + menu_window_full_edit = gtk_menu_item_new_with_label(_("Edit")); + gtk_menu_append(GTK_MENU(menu_window_full), menu_window_full_edit); + gtk_widget_show(menu_window_full_edit); + + add_menu_divider(menu_window_full); + add_menu_popup_item(menu_window_full, _("Copy..."), copy_image_cb, NULL); + add_menu_popup_item(menu_window_full, _("Move..."), move_image_cb, NULL); + add_menu_popup_item(menu_window_full, _("Rename..."), rename_image_cb, NULL); + add_menu_popup_item(menu_window_full, _("Delete..."), delete_image_cb, NULL); + + add_menu_divider(menu_window_full); + add_menu_popup_item(menu_window_full, _("Exit full screen"), full_screen_cb, NULL); + + gtk_signal_connect(GTK_OBJECT(menu_window_full), "hide", (GtkSignalFunc) menu_full_popup_hide_cb, NULL); +} + +void create_menu_popups() +{ + create_menu_file_list_popup(); + create_menu_image_popup(); + create_menu_full_screen_popup(); + create_menu_view_popup(); +} + +/* + *----------------------------------------------------------------------------- + * toolbar routines + *----------------------------------------------------------------------------- + */ + +static void add_button_to_bar(GtkWidget *hbox, gchar **pixmap_data, + GtkTooltips *tooltips, gchar *tip_text, + GtkSignalFunc func, gpointer data) +{ + GtkWidget *button; + GtkStyle *style; + GtkWidget *pixmapwid; + GdkPixmap *pixmap; + GdkBitmap *mask; + + style = gtk_widget_get_style(mainwindow); + + button = gtk_button_new (); + gtk_signal_connect (GTK_OBJECT (button), "clicked",(GtkSignalFunc) func, thumb_button); + gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0); + gtk_widget_show (button); + gtk_tooltips_set_tip (tooltips, button, tip_text, NULL); + + pixmap = gdk_pixmap_create_from_xpm_d(mainwindow->window, &mask, + &style->bg[GTK_STATE_NORMAL], (gchar **)pixmap_data); + pixmapwid = gtk_pixmap_new(pixmap, mask); + gtk_widget_show(pixmapwid); + gtk_container_add(GTK_CONTAINER(button), pixmapwid); +} + +GtkWidget *create_button_bar(GtkTooltips *tooltips) +{ + GtkWidget *hbox; + GtkStyle *style; + GtkWidget *pixmapwid; + GdkPixmap *pixmap; + GdkBitmap *mask; + + style = gtk_widget_get_style(mainwindow); + hbox = gtk_hbox_new(FALSE, 0); + + thumb_button = gtk_toggle_button_new (); + gtk_signal_connect (GTK_OBJECT (thumb_button), "clicked",(GtkSignalFunc) thumb_button_cb, thumb_button); + gtk_box_pack_start (GTK_BOX (hbox), thumb_button, FALSE, FALSE, 0); + gtk_widget_show (thumb_button); + gtk_tooltips_set_tip (tooltips, thumb_button, _("Create thumbnails"), NULL); + + pixmap = gdk_pixmap_create_from_xpm_d(mainwindow->window, &mask, + &style->bg[GTK_STATE_NORMAL], (gchar **)icon_thumb_xpm ); + pixmapwid = gtk_pixmap_new(pixmap, mask); + gtk_widget_show(pixmapwid); + gtk_container_add(GTK_CONTAINER(thumb_button), pixmapwid); + + add_button_to_bar(hbox, (gchar **)icon_home_xpm, + tooltips, _("Change to home directory"), home_dir_cb, NULL); + add_button_to_bar(hbox, (gchar **)icon_reload_xpm, + tooltips, _("Refresh file list"), refresh_cb, NULL); + add_button_to_bar(hbox, (gchar **)icon_zoom_in_xpm, + tooltips, _("Zoom in"), zoom_in_cb, NULL); + add_button_to_bar(hbox, (gchar **)icon_zoom_out_xpm, + tooltips, _("Zoom out"), zoom_out_cb, NULL); + add_button_to_bar(hbox, (gchar **)icon_zoom_fit_xpm, + tooltips, _("Fit image to window"), zoom_fit_cb, NULL); + add_button_to_bar(hbox, (gchar **)icon_zoom_norm_xpm, + tooltips, _("Set zoom 1:1"), zoom_1_1_cb, NULL); + add_button_to_bar(hbox, (gchar **)icon_config_xpm, + tooltips, _("Configure options"), config_cb, NULL); + add_button_to_bar(hbox, (gchar **)icon_float_xpm, + tooltips, _("Float Controls"), float_cb, NULL); + + return hbox; +} + diff --git a/src/pathsel.c b/src/pathsel.c new file mode 100644 index 00000000..914d57b9 --- /dev/null +++ b/src/pathsel.c @@ -0,0 +1,294 @@ +/* + * GQview image viewer + * (C)1999 John Ellis + * + * Author: John Ellis + * + */ + +#include "gqview.h" + +#define DEST_WIDTH 250 +#define DEST_HEIGHT 100 + +typedef struct _Dest_Data Dest_Data; +struct _Dest_Data +{ + GtkWidget *d_clist; + GtkWidget *f_clist; + GtkWidget *entry; + gchar *filter; + gchar *path; +}; + +static void dest_free_data(GtkWidget *widget, gpointer data); +static gint dest_check_filter(gchar *filter, gchar *file); +static gint dest_sort_cb(void *a, void *b); +static void dest_populate(Dest_Data *dd, gchar *path); +static void dest_select_cb(GtkWidget *clist, gint row, gint column, + GdkEventButton *bevent, gpointer data); + +/* + *----------------------------------------------------------------------------- + * destination widget routines (private) + *----------------------------------------------------------------------------- + */ + +static void dest_free_data(GtkWidget *widget, gpointer data) +{ + Dest_Data *dd = data; + g_free(dd->filter); + g_free(dd->path); + g_free(dd); +} + +static gint dest_check_filter(gchar *filter, gchar *file) +{ + gchar *f_ptr = filter; + gchar *file_ptr; + gchar *strt_ptr; + gint i; + + if (filter[0] == '*') return TRUE; + while (f_ptr < filter + strlen(filter)) + { + strt_ptr = f_ptr; + i=0; + while (*f_ptr != ';' && *f_ptr != '\0') + { + f_ptr++; + i++; + } + f_ptr++; + file_ptr = file + strlen(file) - i; + if (!strncasecmp(file_ptr, strt_ptr, i)) return TRUE; + } + return FALSE; +} + +static gint dest_sort_cb(void *a, void *b) +{ + return strcmp((gchar *)a, (gchar *)b); +} + +static void dest_populate(Dest_Data *dd, gchar *path) +{ + DIR *dp; + struct dirent *dir; + struct stat ent_sbuf; + gchar *buf[2]; + GList *path_list = NULL; + GList *file_list = NULL; + GList *list; + + buf[1] = NULL; + + if((dp = opendir(path))==NULL) + { + /* dir not found */ + return; + } + while ((dir = readdir(dp)) != NULL) + { + /* skips removed files */ + if (dir->d_ino > 0) + { + gchar *name = dir->d_name; + gchar *filepath = g_strconcat(path, "/", name, NULL); + if (stat(filepath,&ent_sbuf) >= 0 && S_ISDIR(ent_sbuf.st_mode)) + { + path_list = g_list_prepend(path_list, g_strdup(name)); + } + else if (dd->f_clist) + { + if (!dd->filter || (dd->filter && dest_check_filter(dd->filter, name))) + file_list = g_list_prepend(file_list, g_strdup(name)); + } + g_free(filepath); + } + } + closedir(dp); + + path_list = g_list_sort(path_list, (GCompareFunc) dest_sort_cb); + file_list = g_list_sort(file_list, (GCompareFunc) dest_sort_cb); + + gtk_clist_freeze(GTK_CLIST(dd->d_clist)); + gtk_clist_clear(GTK_CLIST(dd->d_clist)); + + list = path_list; + while (list) + { + gint row; + gchar *filepath; + if (strcmp(list->data, ".") == 0) + { + filepath = g_strdup(path); + } + else if (strcmp(list->data, "..") == 0) + { + gchar *p; + filepath = g_strdup(path); + p = filename_from_path(filepath); + if (p - 1 != filepath) p--; + p[0] = '\0'; + } + else if (strcmp(path, "/") == 0) + { + filepath = g_strconcat("/", list->data, NULL); + } + else + filepath = g_strconcat(path, "/", list->data, NULL); + + buf[0] = list->data; + row = gtk_clist_append(GTK_CLIST(dd->d_clist),buf); + gtk_clist_set_row_data_full(GTK_CLIST(dd->d_clist), row, + filepath, (GtkDestroyNotify) g_free); + g_free(list->data); + list = list->next; + } + + g_list_free(path_list); + + gtk_clist_thaw(GTK_CLIST(dd->d_clist)); + + if (dd->f_clist) + { + gtk_clist_freeze(GTK_CLIST(dd->f_clist)); + gtk_clist_clear(GTK_CLIST(dd->f_clist)); + + list = file_list; + while (list) + { + gint row; + gchar *filepath; + filepath = g_strconcat(path, "/", list->data, NULL); + + buf[0] = list->data; + row = gtk_clist_append(GTK_CLIST(dd->f_clist),buf); + gtk_clist_set_row_data_full(GTK_CLIST(dd->f_clist), row, + filepath, (GtkDestroyNotify) g_free); + g_free(list->data); + list = list->next; + } + + g_list_free(file_list); + + gtk_clist_thaw(GTK_CLIST(dd->f_clist)); + } + + g_free(dd->path); + dd->path = g_strdup(path); +} + +static void dest_select_cb(GtkWidget *clist, gint row, gint column, + GdkEventButton *bevent, gpointer data) +{ + Dest_Data *dd = data; + gchar *path = g_strdup(gtk_clist_get_row_data(GTK_CLIST(clist), row)); + gtk_entry_set_text(GTK_ENTRY(dd->entry),path); + + if (clist == dd->d_clist) dest_populate(dd, path); + g_free(path); +} + +/* + *----------------------------------------------------------------------------- + * destination widget setup routines (public) + *----------------------------------------------------------------------------- + */ + +GtkWidget *destination_widget_new_with_files(gchar *path, gchar *filter, GtkWidget *entry) +{ + GtkWidget *vbox; + Dest_Data *dd; + GtkWidget *scrolled; + + dd = g_new0(Dest_Data, 1); + + vbox = gtk_vbox_new(FALSE, 5); + gtk_widget_show(vbox); + + dd->entry = entry; + gtk_object_set_data(GTK_OBJECT(dd->entry), "destination_data", dd); + + scrolled = gtk_scrolled_window_new(NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled), + GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); + gtk_box_pack_start(GTK_BOX(vbox), scrolled, TRUE, TRUE, 0); + gtk_widget_show(scrolled); + + dd->d_clist=gtk_clist_new (1); + gtk_clist_set_column_auto_resize(GTK_CLIST(dd->d_clist), 0, TRUE); + gtk_signal_connect (GTK_OBJECT (dd->d_clist), "select_row",(GtkSignalFunc) dest_select_cb, dd); + gtk_signal_connect(GTK_OBJECT(dd->d_clist), "destroy", (GtkSignalFunc) dest_free_data, dd); + gtk_widget_set_usize(dd->d_clist, DEST_WIDTH, DEST_HEIGHT); + gtk_container_add (GTK_CONTAINER (scrolled), dd->d_clist); + gtk_widget_show (dd->d_clist); + + if (filter) + { + scrolled = gtk_scrolled_window_new(NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled), + GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); + gtk_box_pack_start(GTK_BOX(vbox), scrolled, TRUE, TRUE, 0); + gtk_widget_show(scrolled); + + dd->f_clist=gtk_clist_new (1); + gtk_clist_set_column_auto_resize(GTK_CLIST(dd->f_clist), 0, TRUE); + gtk_widget_set_usize(dd->f_clist, DEST_WIDTH, DEST_HEIGHT); + gtk_signal_connect (GTK_OBJECT (dd->f_clist), "select_row",(GtkSignalFunc) dest_select_cb, dd); + gtk_container_add (GTK_CONTAINER (scrolled), dd->f_clist); + gtk_widget_show (dd->f_clist); + + dd->filter = g_strdup(filter); + } + + if (isdir(path)) + { + dest_populate(dd, path); + } + else + { + gchar *buf = remove_level_from_path(path); + if (isdir(buf)) + { + dest_populate(dd, buf); + } + else + { + dest_populate(dd, homedir()); + } + g_free(buf); + } + return vbox; +} + +GtkWidget *destination_widget_new(gchar *path, GtkWidget *entry) +{ + return destination_widget_new_with_files(path, NULL, entry); +} + +void destination_widget_sync_to_entry(GtkWidget *entry) +{ + Dest_Data *dd = gtk_object_get_data(GTK_OBJECT(entry), "destination_data"); + gchar *path; + + if (!dd) return; + + path = gtk_entry_get_text(GTK_ENTRY(entry)); + + if (isdir(path) && strcmp(path, dd->path) != 0) + { + dest_populate(dd, path); + } + else + { + gchar *buf = remove_level_from_path(path); + if (isdir(buf) && strcmp(buf, dd->path) != 0) + { + dest_populate(dd, buf); + } + g_free(buf); + } +} + diff --git a/src/rcfile.c b/src/rcfile.c new file mode 100644 index 00000000..91ff2168 --- /dev/null +++ b/src/rcfile.c @@ -0,0 +1,434 @@ +/* + * GQview image viewer + * (C)1999 John Ellis + * + * Author: John Ellis + * + */ + +#include "gqview.h" + +static gchar *quoted_value(gchar *text); +static void write_char_option(FILE *f, gchar *label, gchar *text); +static gchar *read_char_option(FILE *f, gchar *option, gchar *label, gchar *value, gchar *text); +static void write_int_option(FILE *f, gchar *label, gint n); +static gint read_int_option(FILE *f, gchar *option, gchar *label, gchar *value, gint n); +static void write_bool_option(FILE *f, gchar *label, gint n); +static gint read_bool_option(FILE *f, gchar *option, gchar *label, gchar *value, gint n); + +/* + *----------------------------------------------------------------------------- + * line write/parse routines (private) + *----------------------------------------------------------------------------- + */ + +static gchar *quoted_value(gchar *text) +{ + gchar *ptr; + gint c = 0; + gint l = strlen(text); + + if (l == 0) return NULL; + + while (c < l && text[c] !='"') c++; + if (text[c] == '"') + { + c++; + ptr = text + c; + while (c < l && text[c] !='"') c++; + if (text[c] == '"') + { + text[c] = '\0'; + if (strlen(ptr) > 0) + { + return g_strdup(ptr); + } + } + } + else + /* for compatibility with older formats (<0.3.7) + * read a line without quotes too */ + { + c = 0; + while (c < l && text[c] !=' ' && text[c] !=8 && text[c] != '\n') c++; + if (c != 0) + { + text[c] = '\0'; + return g_strdup(text); + } + } + + return NULL; +} + +static void write_char_option(FILE *f, gchar *label, gchar *text) +{ + if (text) + fprintf(f,"%s: \"%s\"\n", label, text); + else + fprintf(f,"%s: \n", label); +} + +static gchar *read_char_option(FILE *f, gchar *option, gchar *label, gchar *value, gchar *text) +{ + if (!strcasecmp(option, label)) + { + g_free(text); + text = quoted_value(value); + } + return text; +} + +static void write_int_option(FILE *f, gchar *label, gint n) +{ + fprintf(f,"%s: %d\n\n", label, n); +} + +static gint read_int_option(FILE *f, gchar *option, gchar *label, gchar *value, gint n) +{ + if (!strcasecmp(option, label)) + { + n = strtol(value,NULL,0); + } + return n; +} + +static void write_bool_option(FILE *f, gchar *label, gint n) +{ + fprintf(f,"%s: ", label); + if (n) fprintf(f,"true\n"); else fprintf(f,"false\n"); + fprintf(f,"\n"); +} + +static gint read_bool_option(FILE *f, gchar *option, gchar *label, gchar *value, gint n) +{ + if (!strcasecmp(option, label)) + { + if (!strcasecmp(value, "true")) + n = TRUE; + else + n = FALSE; + } + return n; +} + +/* + *----------------------------------------------------------------------------- + * save configuration (public) + *----------------------------------------------------------------------------- + */ + +void save_options() +{ + FILE *f; + gchar *rc_path; + gint i; + + rc_path = g_strconcat(homedir(), "/", RC_FILE_NAME, NULL); + + f = fopen(rc_path,"w"); + if (!f) + { + printf(_("error saving config file: %s\n"), rc_path); + g_free(rc_path); + return; + } + + fprintf(f,"######################################################################\n"); + fprintf(f,"# GQview config file version %7s #\n", VERSION); + fprintf(f,"# #\n"); + fprintf(f,"# Everything in this file can be changed in the option dialogs. #\n"); + fprintf(f,"# (so there should be no need to edit this file by hand) #\n"); + fprintf(f,"# #\n"); + fprintf(f,"######################################################################\n"); + fprintf(f,"\n"); + fprintf(f,"##### General Options #####\n\n"); + + write_bool_option(f, "enable_startup_path", startup_path_enable); + write_char_option(f, "startup_path", startup_path); + fprintf(f,"\n"); + + fprintf(f,"zoom_mode: "); + if (zoom_mode == ZOOM_RESET_ORIGINAL) fprintf(f,"original\n"); + if (zoom_mode == ZOOM_RESET_FIT_WINDOW) fprintf(f,"fit\n"); + if (zoom_mode == ZOOM_RESET_NONE) fprintf(f,"dont_change\n"); + fprintf(f,"\n"); + + write_bool_option(f, "fit_window_to_image", fit_window); + write_bool_option(f, "limit_window_size", limit_window_size); + write_int_option(f, "max_window_size", max_window_size); + fprintf(f,"\n"); + + write_bool_option(f, "progressive_keyboard_scrolling", progressive_key_scrolling); + fprintf(f,"\n"); + + write_int_option(f, "thumbnail_width", thumb_max_width); + write_int_option(f, "thumbnail_height", thumb_max_height); + write_bool_option(f, "cache_thumbnails", enable_thumb_caching); + write_bool_option(f, "use_xvpics_thumbnails", use_xvpics_thumbnails); + fprintf(f,"\n"); + + write_bool_option(f, "confirm_delete", confirm_delete); + fprintf(f,"\n"); + write_bool_option(f, "tools_float", tools_float); + write_bool_option(f, "tools_hidden", tools_hidden); + write_bool_option(f, "restore_tool_state", restore_tool); + + fprintf(f,"\n##### Slideshow Options #####\n\n"); + + write_int_option(f, "slideshow_delay", slideshow_delay); + + write_bool_option(f, "slideshow_random", slideshow_random); + write_bool_option(f, "slideshow_repeat", slideshow_repeat); + + fprintf(f,"\n##### Filtering Options #####\n\n"); + + write_bool_option(f, "show_dotfiles", show_dot_files); + write_bool_option(f, "disable_filtering", file_filter_disable); + fprintf(f,"\n"); + write_bool_option(f, "filter_ppm", filter_include_ppm); + write_bool_option(f, "filter_png", filter_include_png); + write_bool_option(f, "filter_jpg", filter_include_jpg); + write_bool_option(f, "filter_tif", filter_include_tif); + write_bool_option(f, "filter_pgm", filter_include_pgm); + write_bool_option(f, "filter_xpm", filter_include_xpm); + write_bool_option(f, "filter_gif", filter_include_gif); + write_bool_option(f, "filter_pcx", filter_include_pcx); + write_bool_option(f, "filter_bmp", filter_include_bmp); + fprintf(f,"\n"); + write_char_option(f, "custom_filter", custom_filter); + + fprintf(f,"\n##### External Programs #####\n"); + fprintf(f,"# Maximum of 8 programs (external_1 through external 8)\n"); + fprintf(f,"# format: external_n: \"menu name\" \"command line\"\n\n"); + + for (i=0; i<8; i++) + { + fprintf(f,"external_%d: \"", i+1); + if (editor_name[i]) fprintf(f, editor_name[i]); + fprintf(f, "\" \""); + if (editor_command[i]) fprintf(f, editor_command[i]); + fprintf(f, "\"\n"); + } + + fprintf(f,"\n##### Window Positions #####\n\n"); + + write_bool_option(f, "restore_window_positions", save_window_positions); + fprintf(f,"\n"); + write_int_option(f, "main_window_x", main_window_x); + write_int_option(f, "main_window_y", main_window_y); + write_int_option(f, "main_window_width", main_window_w); + write_int_option(f, "main_window_height", main_window_h); + write_int_option(f, "float_window_x", float_window_x); + write_int_option(f, "float_window_y", float_window_y); + write_int_option(f, "float_window_width", float_window_w); + write_int_option(f, "float_window_height", float_window_h); + + fprintf(f,"######################################################################\n"); + fprintf(f,"# end of GQview config file #\n"); + fprintf(f,"######################################################################\n"); + + fclose(f); + + g_free(rc_path); +} + +/* + *----------------------------------------------------------------------------- + * load configuration (public) + *----------------------------------------------------------------------------- + */ + +void load_options() +{ + FILE *f; + gchar *rc_path; + gchar s_buf[1024]; + gchar *s_buf_ptr; + gchar option[1024]; + gchar value[1024]; + gchar value_all[1024]; + gint c,l,i; + rc_path = g_strconcat(homedir(), "/", RC_FILE_NAME, NULL); + + f = fopen(rc_path,"r"); + if (!f) + { + g_free(rc_path); + return; + } + + while (fgets(s_buf,1024,f)) + { + if (s_buf[0]=='#') continue; + if (s_buf[0]=='\n') continue; + c = 0; + l = strlen(s_buf); + while (s_buf[c] != ':' && c < l) c++; + if (c >= l) continue; + s_buf[c] = '\0'; + c++; + while (s_buf[c] == ' ' && c < l) c++; + while (s_buf[c] == 8 && c < l) c++; + while (s_buf[c] == ' ' && c < l) c++; + s_buf_ptr = s_buf + c; + strcpy(value_all,s_buf_ptr); + while (s_buf[c] != 8 && s_buf[c] != ' ' && s_buf[c] != '\n' && c < l) c++; + s_buf[c] = '\0'; + strcpy(option,s_buf); + strcpy(value,s_buf_ptr); + + /* general options */ + + startup_path_enable = read_bool_option(f, option, + "enable_startup_path", value, startup_path_enable); + startup_path = read_char_option(f, option, + "startup_path", value_all, startup_path); + + if (!strcasecmp(option,"zoom_mode")) + { + if (!strcasecmp(value,"original")) zoom_mode = ZOOM_RESET_ORIGINAL; + if (!strcasecmp(value,"fit")) zoom_mode = ZOOM_RESET_FIT_WINDOW; + if (!strcasecmp(value,"dont_change")) zoom_mode = ZOOM_RESET_NONE; + } + + fit_window = read_bool_option(f, option, + "fit_window_to_image", value, fit_window); + limit_window_size = read_bool_option(f, option, + "limit_window_size", value, limit_window_size); + max_window_size = read_int_option(f, option, + "max_window_size", value, max_window_size); + progressive_key_scrolling = read_bool_option(f, option, + "progressive_keyboard_scrolling", value, progressive_key_scrolling); + + thumb_max_width = read_int_option(f, option, + "thumbnail_width", value, thumb_max_width); + thumb_max_height = read_int_option(f, option, + "thumbnail_height", value, thumb_max_height); + enable_thumb_caching = read_bool_option(f, option, + "cache_thumbnails", value, enable_thumb_caching); + use_xvpics_thumbnails = read_bool_option(f, option, + "use_xvpics_thumbnails", value, use_xvpics_thumbnails); + + confirm_delete = read_bool_option(f, option, + "confirm_delete", value, confirm_delete); + + tools_float = read_bool_option(f, option, + "tools_float", value, tools_float); + tools_hidden = read_bool_option(f, option, + "tools_hidden", value, tools_hidden); + restore_tool = read_bool_option(f, option, + "restore_tool_state", value, restore_tool); + + /* slideshow opitons */ + + slideshow_delay = read_int_option(f, option, + "slideshow_delay", value, slideshow_delay); + slideshow_random = read_bool_option(f, option, + "slideshow_random", value, slideshow_random); + slideshow_repeat = read_bool_option(f, option, + "slideshow_repeat", value, slideshow_repeat); + + /* filtering options */ + + show_dot_files = read_bool_option(f, option, + "show_dotfiles", value, show_dot_files); + file_filter_disable = read_bool_option(f, option, + "disable_filtering", value, file_filter_disable); + + filter_include_ppm = read_bool_option(f, option, + "filter_ppm", value, filter_include_ppm); + filter_include_png = read_bool_option(f, option, + "filter_png", value, filter_include_png); + filter_include_jpg = read_bool_option(f, option, + "filter_jpg", value, filter_include_jpg); + filter_include_tif = read_bool_option(f, option, + "filter_tif", value, filter_include_tif); + filter_include_pgm = read_bool_option(f, option, + "filter_pgm", value, filter_include_pgm); + filter_include_xpm = read_bool_option(f, option, + "filter_xpm", value, filter_include_xpm); + filter_include_gif = read_bool_option(f, option, + "filter_gif", value, filter_include_gif); + filter_include_pcx = read_bool_option(f, option, + "filter_pcx", value, filter_include_pcx); + filter_include_bmp = read_bool_option(f, option, + "filter_bmp", value, filter_include_bmp); + + custom_filter = read_char_option(f, option, + "custom_filter", value_all, custom_filter); + + /* External Programs */ + + if (!strncasecmp(option,"external_",9)) + { + i = strtol(option + 9, NULL, 0); + if (i>0 && i<9) + { + gchar *ptr1, *ptr2; + i--; + c = 0; + l = strlen(value_all); + ptr1 = value_all; + + g_free(editor_name[i]); + editor_name[i] = NULL; + g_free(editor_command[i]); + editor_command[i] = NULL; + + while (cselection; + while(work) + { + list = g_list_prepend(list, work->data); + work = work->next; + } + slide_sel_list = TRUE; + } + list = g_list_reverse(list); + + return list; +} + +static GList *generate_random_list() +{ + GList *src_list = NULL; + GList *list = NULL; + GList *work; + + src_list = generate_list(); + + while(src_list) + { + gint p = (float)rand() / RAND_MAX * g_list_length(src_list); + work = g_list_nth(src_list, p); + list = g_list_prepend(list, work->data); + src_list = g_list_remove(src_list, work->data); + } + + return list; +} + +static void slideshow_init_list() +{ + if (slide_list) + { + g_list_free(slide_list); + } + + if (slideshow_random) + { + slide_list = generate_random_list(); + } + else + { + slide_list = generate_list(); + } +} + +static gint slideshow_should_continue() +{ + if (!slide_active || !slide_list || !slide_path || + slide_count != file_count() || + (slide_img && image_get_path() && strcmp(image_get_path(), slide_img) != 0) || + current_path == NULL || + strcmp(current_path, slide_path) != 0) + { + return FALSE; + } + + return TRUE; +} + +static gint slideshow_loop_cb(gpointer data) +{ + gint row; + gchar *buf; + + if (!slideshow_should_continue()) + { + slideshow_free_all(); + slide_timeout_id = -1; + return FALSE; + } + + row = GPOINTER_TO_INT(slide_list->data); + + g_free(slide_img); + slide_img = NULL; + buf = file_get_path(row); + slide_list = g_list_remove(slide_list, slide_list->data); + + if (!slide_list && slideshow_repeat) + { + slideshow_init_list(); + } + + if (slide_sel_list) + { + image_change_to(buf); + update_status_label(NULL); + } + else + { + file_image_change_to(row); + } + + slide_img = buf; + + if (!slide_list) + { + slideshow_free_all(); + slide_timeout_id = -1; + return FALSE; + } + + return TRUE; +} + +void slideshow_start() +{ + gint row; + gchar *buf; + + if (slide_active) return; + + if (file_count() < 2) return; + + slideshow_init_list(); + if (!slide_list) return; + + row = GPOINTER_TO_INT(slide_list->data); + + slide_active = TRUE; + slide_path = g_strdup(current_path); + slide_count = file_count(); + g_free(slide_img); + slide_img = NULL; + buf = file_get_path(row); + slide_list = g_list_remove(slide_list, slide_list->data); + + if (slide_sel_list) + { + image_change_to(buf); + update_status_label(NULL); + } + else + { + file_image_change_to(row); + } + + slide_img = buf; + + slide_timeout_id = gtk_timeout_add(slideshow_delay * 1000, slideshow_loop_cb, NULL); +} + +void slideshow_stop() +{ + if (!slide_active) return; + + slideshow_free_all(); + if (slide_timeout_id != -1) + { + gtk_timeout_remove(slide_timeout_id); + slide_timeout_id = -1; + } + update_status_label(NULL); +} + +void slideshow_toggle() +{ + if (!slide_active) + { + slideshow_start(); + } + else + { + slideshow_stop(); + } +} + +gint slideshow_is_running() +{ + if (!slide_active) return FALSE; + + if (!slideshow_should_continue()) + { + slideshow_free_all(); + if (slide_timeout_id != -1) + { + gtk_timeout_remove(slide_timeout_id); + slide_timeout_id = -1; + } + return FALSE; + } + + return TRUE; +} + diff --git a/src/tabcomp.c b/src/tabcomp.c new file mode 100644 index 00000000..0d861339 --- /dev/null +++ b/src/tabcomp.c @@ -0,0 +1,629 @@ +/* + * GQview image viewer + * (C)1999 John Ellis + * + * Author: John Ellis + * + */ + +#include "gqview.h" +#include /* for key values */ + +#include "tabcomp.xpm" + +/* ---------------------------------------------------------------- + Tab completion routines, can be connected to any gtkentry widget + using the tab_completion_add_to_entry() function. + Use remove_trailing_slash() to strip the trailing '/'. + ----------------------------------------------------------------*/ + +typedef struct _TabCompData TabCompData; +struct _TabCompData +{ + GtkWidget *entry; + gchar *dir_path; + GList *file_list; + void (*enter_func)(gchar *, gpointer); + void (*tab_func)(gchar *, gpointer); + gpointer enter_data; + gpointer tab_data; + + GtkWidget *combo; + gint has_history; + gchar *history_key; + gint history_levels; +}; + +typedef struct _HistoryData HistoryData; +struct _HistoryData +{ + gchar *key; + GList *list; +}; + +static GList *history_list = NULL; + +static void tab_completion_free_list(TabCompData *td); +static void tab_completion_read_dir(TabCompData *td, gchar *path); +static void tab_completion_destroy(GtkWidget *widget, gpointer data); +static void tab_completion_emit_enter_signal(TabCompData *td); +static void tab_completion_emit_tab_signal(TabCompData *td); +static gint tab_completion_do(TabCompData *td); +static gint tab_completion_key_pressed(GtkWidget *widget, GdkEventKey *event, gpointer data); +static void tab_completion_button_pressed(GtkWidget *widget, gpointer data); +static GtkWidget *tab_completion_create_complete_button(GtkWidget *window, GtkWidget *entry); + +static void history_list_free(HistoryData *hd); +static HistoryData *history_list_find_by_key(const gchar* key); +static gchar *history_list_find_last_path_by_key(const gchar* key); +static void history_list_free_key(const gchar *key); +static void history_list_add_to_key(const gchar *key, const gchar *path, gint max); + +static void history_list_free(HistoryData *hd) +{ + GList *work; + + if (!hd) return; + + work = hd->list; + while(work) + { + g_free(work->data); + work = work->next; + } + + g_free(hd->key); + g_free(hd); +} + +static HistoryData *history_list_find_by_key(const gchar* key) +{ + GList *work = history_list; + while(work) + { + HistoryData *hd = work->data; + if (strcmp(hd->key, key) == 0) return hd; + work = work->next; + } + return NULL; +} + +static gchar *history_list_find_last_path_by_key(const gchar* key) +{ + HistoryData *hd; + hd = history_list_find_by_key(key); + if (!hd || !hd->list) return NULL; + + return hd->list->data; +} + +static void history_list_free_key(const gchar *key) +{ + HistoryData *hd; + hd = history_list_find_by_key(key); + if (!hd) return; + + history_list = g_list_remove(history_list, hd); + history_list_free(hd); +} + +static void history_list_add_to_key(const gchar *key, const gchar *path, gint max) +{ + HistoryData *hd; + GList *work; + + hd = history_list_find_by_key(key); + if (!hd) + { + hd = g_new(HistoryData, 1); + hd->key = g_strdup(key); + hd->list = NULL; + history_list = g_list_prepend(history_list, hd); + } + + /* if already in the list, simply move it to the top */ + work = hd->list; + while(work) + { + gchar *buf = work->data; + work = work->next; + if (strcmp(buf, path) == 0) + { + hd->list = g_list_remove(hd->list, buf); + hd->list = g_list_prepend(hd->list, buf); + return; + } + } + + hd->list = g_list_prepend(hd->list, g_strdup(path)); + + if (max > 0) + { + while(hd->list && g_list_length(hd->list) > max) + { + GList *work = g_list_last(hd->list); + gchar *buf = work->data; + hd->list = g_list_remove(hd->list, buf); + g_free(buf); + } + } +} + +static void tab_completion_free_list(TabCompData *td) +{ + GList *list; + + g_free(td->dir_path); + td->dir_path = NULL; + + list = td->file_list; + + while(list) + { + g_free(list->data); + list = list->next; + } + + g_list_free(td->file_list); + td->file_list = NULL; +} + +static void tab_completion_read_dir(TabCompData *td, gchar *path) +{ + DIR *dp; + struct dirent *dir; + GList *list = NULL; + + tab_completion_free_list(td); + + if((dp = opendir(path))==NULL) + { + /* dir not found */ + return; + } + while ((dir = readdir(dp)) != NULL) + { + /* skips removed files */ + if (dir->d_ino > 0) + { + gchar *name = dir->d_name; + if (strcmp(name, ".") != 0 && strcmp(name, "..") != 0) + { + list = g_list_prepend(list, g_strdup(name)); + } + } + } + closedir(dp); + + td->dir_path = g_strdup(path); + td->file_list = list; +} + +static void tab_completion_destroy(GtkWidget *widget, gpointer data) +{ + TabCompData *td = data; + tab_completion_free_list(td); + g_free(td->history_key); + g_free(td); +} + +static void tab_completion_emit_enter_signal(TabCompData *td) +{ + gchar *text; + if (!td->enter_func) return; + + text = g_strdup(gtk_entry_get_text(GTK_ENTRY(td->entry))); + + if (text[0] == '~') + { + gchar *t = text; + text = g_strconcat(homedir(), t + 1, NULL); + g_free(t); + } + + td->enter_func(text, td->enter_data); + g_free(text); +} + +static void tab_completion_emit_tab_signal(TabCompData *td) +{ + gchar *text; + if (!td->tab_func) return; + + text = g_strdup(gtk_entry_get_text(GTK_ENTRY(td->entry))); + + if (text[0] == '~') + { + gchar *t = text; + text = g_strconcat(homedir(), t + 1, NULL); + g_free(t); + } + + td->tab_func(text, td->tab_data); + g_free(text); +} + +static gint tab_completion_do(TabCompData *td) +{ + gchar *entry_text = gtk_entry_get_text(GTK_ENTRY(td->entry)); + gchar *entry_file; + gchar *entry_dir; + gchar *ptr; + gint home_exp = FALSE; + + /* home dir expansion */ + if (entry_text[0] == '~') + { + entry_dir = g_strconcat(homedir(), entry_text + 1, NULL); + home_exp = TRUE; + } + else + { + entry_dir = g_strdup(entry_text); + } + + entry_file = filename_from_path(entry_text); + + if (isfile(entry_dir)) + { + if (home_exp) + { + gtk_entry_set_text(GTK_ENTRY(td->entry), entry_dir); + gtk_entry_set_position(GTK_ENTRY(td->entry), strlen(entry_dir)); + } + g_free(entry_dir); + return home_exp; + } + if (isdir(entry_dir) && strcmp(entry_file, ".") != 0 && strcmp(entry_file, "..") != 0) + { + ptr = entry_dir + strlen(entry_dir) - 1; + if (ptr[0] == '/') + { + if (home_exp) + { + gtk_entry_set_text(GTK_ENTRY(td->entry), entry_dir); + gtk_entry_set_position(GTK_ENTRY(td->entry), strlen(entry_dir)); + } + g_free(entry_dir); + return home_exp; + } + else + { + gchar *buf = g_strconcat(entry_dir, "/", NULL); + gtk_entry_set_text(GTK_ENTRY(td->entry), buf); + gtk_entry_set_position(GTK_ENTRY(td->entry), strlen(buf)); + g_free(buf); + g_free(entry_dir); + return TRUE; + } + } + + ptr = filename_from_path(entry_dir); + if (ptr > entry_dir) ptr--; + ptr[0] = '\0'; + + if (strlen(entry_dir) == 0) + { + g_free(entry_dir); + entry_dir = g_strdup("/"); + } + + if (isdir(entry_dir)) + { + GList *list; + GList *poss = NULL; + gint l = strlen(entry_file); + + if (!td->dir_path || !td->file_list || strcmp(td->dir_path, entry_dir) != 0) + { + tab_completion_read_dir(td, entry_dir); + } + + if (strcmp(entry_dir, "/") == 0) entry_dir[0] = '\0'; + + list = td->file_list; + while(list) + { + gchar *file = list->data; + if (strncmp(entry_file, file, l) == 0) + { + poss = g_list_prepend(poss, file); + } + list = list->next; + } + + if (poss) + { + if (!poss->next) + { + gchar *file = poss->data; + gchar *buf; + + buf = g_strconcat(entry_dir, "/", file, NULL); + + if (isdir(buf)) + { + g_free(buf); + buf = g_strconcat(entry_dir, "/", file, "/", NULL); + } + gtk_entry_set_text(GTK_ENTRY(td->entry), buf); + gtk_entry_set_position(GTK_ENTRY(td->entry), strlen(buf)); + g_free(buf); + g_list_free(poss); + g_free(entry_dir); + return TRUE; + } + else + { + gint c = strlen(entry_file); + gint done = FALSE; + gchar *test_file = poss->data; + + while (!done) + { + list = poss; + if (!list) done = TRUE; + while(list && !done) + { + gchar *file = list->data; + if (strlen(file) < c || strncmp(test_file, file, c) != 0) + { + done = TRUE; + } + list = list->next; + } + c++; + } + c -= 2; + if (c > 0) + { + gchar *file; + gchar *buf; + file = g_strdup(test_file); + file[c] = '\0'; + buf = g_strconcat(entry_dir, "/", file, NULL); + gtk_entry_set_text(GTK_ENTRY(td->entry), buf); + gtk_entry_set_position(GTK_ENTRY(td->entry), strlen(buf)); + g_free(file); + g_free(buf); + g_list_free(poss); + g_free(entry_dir); + return TRUE; + } + } + g_list_free(poss); + } + } + + g_free(entry_dir); + + return FALSE; +} + +static gint tab_completion_key_pressed(GtkWidget *widget, GdkEventKey *event, gpointer data) +{ + TabCompData *td = data; + gint stop_signal = FALSE; + + switch (event->keyval) + { + case GDK_Tab: + if (tab_completion_do(td)) + { + tab_completion_emit_tab_signal(td); + } + stop_signal = TRUE; + break; + case GDK_Return: + tab_completion_emit_enter_signal(td); + stop_signal = TRUE; + break; + default: + break; + } + + if (stop_signal) + { + if (stop_signal) gtk_signal_emit_stop_by_name(GTK_OBJECT(widget), "key_press_event"); + return TRUE; + } + + return FALSE; +} + +static void tab_completion_button_pressed(GtkWidget *widget, gpointer data) +{ + TabCompData *td; + GtkWidget *entry = data; + + td = gtk_object_get_data(GTK_OBJECT(entry), "tab_completion_data"); + + if (!td) return; + + if (!GTK_WIDGET_HAS_FOCUS(entry)) + { + gtk_widget_grab_focus(entry); + } + + if (tab_completion_do(td)) + { + tab_completion_emit_tab_signal(td); + } +} + +static GtkWidget *tab_completion_create_complete_button(GtkWidget *window, GtkWidget *entry) +{ + GtkWidget *button; + GtkWidget *icon; + GdkPixmap *pixmap = NULL; + GdkBitmap *mask = NULL; + GtkStyle *style; + + style = gtk_widget_get_style(window); + pixmap = gdk_pixmap_create_from_xpm_d(window->window, &mask, + &style->bg[GTK_STATE_NORMAL], (gchar **)tabcomp_xpm); + + button = gtk_button_new(); + GTK_WIDGET_UNSET_FLAGS(button, GTK_CAN_FOCUS); + gtk_signal_connect(GTK_OBJECT(button), "clicked", (GtkSignalFunc) tab_completion_button_pressed, entry); + + icon = gtk_pixmap_new(pixmap, mask); + gtk_container_add(GTK_CONTAINER(button), icon); + gtk_widget_show(icon); + + return button; +} + +/* + *---------------------------------------------------------------------------- + * public interface + *---------------------------------------------------------------------------- + */ + +GtkWidget *tab_completion_new_with_history(GtkWidget **entry, GtkWidget *window, gchar *text, + const gchar *history_key, gint max_levels, + void (*enter_func)(gchar *, gpointer), gpointer data) +{ + GtkWidget *combo; + GtkWidget *button; + HistoryData *hd; + TabCompData *td; + + combo = gtk_combo_new(); + gtk_combo_set_use_arrows(GTK_COMBO(combo), FALSE); + + button = tab_completion_create_complete_button(window, GTK_COMBO(combo)->entry); + gtk_box_pack_start(GTK_BOX(combo), button, FALSE, FALSE, 0); + gtk_box_reorder_child(GTK_BOX(combo), button, 1); + gtk_widget_show(button); + + tab_completion_add_to_entry(GTK_COMBO(combo)->entry, enter_func, data); + + td = gtk_object_get_data(GTK_OBJECT(GTK_COMBO(combo)->entry), "tab_completion_data"); + if (!td) return; /* this should never happen! */ + + td->combo = combo; + td->has_history = TRUE; + td->history_key = g_strdup(history_key); + td->history_levels = max_levels; + + hd = history_list_find_by_key(td->history_key); + if (hd && hd->list) + { + gtk_combo_set_popdown_strings(GTK_COMBO(combo), hd->list); + } + + if (text) gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(combo)->entry), text); + + if (entry) *entry = GTK_COMBO(combo)->entry; + return combo; +} + +gchar *tab_completion_set_to_last_history(GtkWidget *entry) +{ + TabCompData *td = gtk_object_get_data(GTK_OBJECT(entry), "tab_completion_data"); + gchar *buf; + + if (!td || !td->has_history) return NULL; + + buf = history_list_find_last_path_by_key(td->history_key); + if (buf) + { + gtk_entry_set_text(GTK_ENTRY(td->entry), buf); + } + + return buf; +} + +void tab_completion_append_to_history(GtkWidget *entry, gchar *path) +{ + TabCompData *td = gtk_object_get_data(GTK_OBJECT(entry), "tab_completion_data"); + HistoryData *hd; + + if (!td || !td->has_history) return; + + history_list_add_to_key(td->history_key, path, td->history_levels); + hd = history_list_find_by_key(td->history_key); + if (hd && hd->list) + { + gtk_combo_set_popdown_strings(GTK_COMBO(td->combo), hd->list); + } +} + +GtkWidget *tab_completion_new(GtkWidget **entry, GtkWidget *window, gchar *text, + void (*enter_func)(gchar *, gpointer), gpointer data) +{ + GtkWidget *hbox; + GtkWidget *button; + GtkWidget *newentry; + + hbox = gtk_hbox_new(FALSE, 0); + + newentry = gtk_entry_new(); + if (text) gtk_entry_set_text(GTK_ENTRY(newentry), text); + gtk_box_pack_start(GTK_BOX(hbox), newentry, TRUE, TRUE, 0); + gtk_widget_show(newentry); + + button = tab_completion_create_complete_button(window, newentry); + gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); + gtk_widget_show(button); + + tab_completion_add_to_entry(newentry, enter_func, data); + + if (entry) *entry = newentry; + return hbox; +} + +void tab_completion_add_to_entry(GtkWidget *entry, void (*enter_func)(gchar *, gpointer), gpointer data) +{ + TabCompData *td; + if (!entry) + { + printf("Tab completion error: entry != NULL\n"); + return; + } + + td = g_new0(TabCompData, 1); + td->entry = entry; + td->dir_path = NULL; + td->file_list = NULL; + td->enter_func = enter_func; + td->enter_data = data; + td->tab_func = NULL; + td->tab_data = NULL; + + td->has_history = FALSE; + td->history_key = NULL; + td->history_levels = 0; + + gtk_object_set_data(GTK_OBJECT(td->entry), "tab_completion_data", td); + + gtk_signal_connect(GTK_OBJECT(entry), "key_press_event", + (GtkSignalFunc) tab_completion_key_pressed, td); + gtk_signal_connect(GTK_OBJECT(entry), "destroy", + (GtkSignalFunc) tab_completion_destroy, td); +} + +void tab_completion_add_tab_func(GtkWidget *entry, void (*tab_func)(gchar *, gpointer), gpointer data) +{ + TabCompData *td = gtk_object_get_data(GTK_OBJECT(entry), "tab_completion_data"); + + if (!td) return; + + td->tab_func = tab_func; + td->tab_data = data; +} + +gchar *remove_trailing_slash(gchar *path) +{ + gchar *ret; + gint l; + if (!path) return NULL; + + ret = g_strdup(path); + l = strlen(ret); + if (l > 1 && ret[l - 1] == '/') ret[l - 1] = '\0'; + + return ret; +} + diff --git a/src/tabcomp.xpm b/src/tabcomp.xpm new file mode 100644 index 00000000..e73bf90b --- /dev/null +++ b/src/tabcomp.xpm @@ -0,0 +1,15 @@ +/* XPM */ +static char * tabcomp_xpm[] = { +"10 10 2 1", +" c None", +". c #000000", +" .", +" . .", +" .. .", +" ... .", +"........ .", +"........ .", +" ... .", +" .. .", +" . .", +" ."}; diff --git a/src/thumb.c b/src/thumb.c new file mode 100644 index 00000000..13e1fb2d --- /dev/null +++ b/src/thumb.c @@ -0,0 +1,371 @@ +/* + * GQview image viewer + * (C)1999 John Ellis + * + * Author: John Ellis + * + */ + +#include "gqview.h" +#include "icons/img_unknown.xpm" /* fixme! duplicate, included in image.c too */ + +#define THUMBNAIL_CACHE_DIR "/.gqview_thmb" + +static guchar *load_xv_thumbnail(gchar *filename, gint *widthp, gint *heightp); +static void normalize_thumb(gint *width, gint *height); +static gint get_xv_thumbnail(gchar *thumb_filename, GdkPixmap **thumb_pixmap, GdkBitmap **thumb_mask); + +/* + *----------------------------------------------------------------------------- + * thumbnail routines: creation, caching, and maintenance (public) + *----------------------------------------------------------------------------- + */ + +gint create_thumbnail(gchar *path, GdkPixmap **thumb_pixmap, GdkBitmap **thumb_mask) +{ + gint width, height; + gint space; + GdkImlibImage *thumb = NULL; + GdkImlibImage *image = NULL; + gint cached = FALSE; + + if (debug) printf("Gen thumbnail:%s\n",path); + + /* if xvpics enabled, check for that first */ + if (use_xvpics_thumbnails) + { + space = get_xv_thumbnail(path, thumb_pixmap, thumb_mask); + if (space != -1) + { + if (debug) printf("XV thumbnail found, loaded\n"); + return space; + } + } + + /* start load from cache */ + + if (enable_thumb_caching) + { + gchar *cache_path; + cache_path = g_strconcat(homedir(), THUMBNAIL_CACHE_DIR, path, ".png", NULL); + + if (isfile(cache_path) && filetime(cache_path) >= filetime(path)) + { + if (debug) printf("Found in cache:%s\n", path); + image = gdk_imlib_load_image(cache_path); + if (image && image->rgb_width != thumb_max_width && image->rgb_height != thumb_max_height) + { + if (debug) printf("Thumbnail size may have changed, reloading:%s\n", path); + unlink(cache_path); + gdk_imlib_destroy_image(image); + image = gdk_imlib_load_image(path); + } + else + { + cached = TRUE; + } + } + else + image = gdk_imlib_load_image(path); + + } + else + image = gdk_imlib_load_image(path); + + if (!image) + { + image = gdk_imlib_create_image_from_xpm_data((gchar **)img_unknown_xpm); + cached = TRUE; /* no need to save a thumbnail of the unknown pixmap */ + } + + if (image) + { + if (image->rgb_width > thumb_max_width || image->rgb_height > thumb_max_height) + { + if (((float)thumb_max_width / image->rgb_width) < ((float)thumb_max_height / image->rgb_height)) + { + width = thumb_max_width; + height = (float)width / image->rgb_width * image->rgb_height; + if (height < 1) height = 1; + } + else + { + height = thumb_max_height; + width = (float)height / image->rgb_height * image->rgb_width; + if (width < 1) width = 1; + } + } + else + { + width = image->rgb_width; + height = image->rgb_height; + cached = TRUE; /* don't cache images smaller than thumbnail size */ + } + if (*thumb_pixmap) gdk_imlib_free_pixmap(*thumb_pixmap); + *thumb_pixmap = NULL; + *thumb_mask = NULL; + + /* start save cache */ + + if (enable_thumb_caching && !cached) + { + gchar *thumb_path; + gchar *base_dir; + gchar *thumb_dir; + gchar *image_dir; + + /* attempt at speed-up? move this here */ + thumb = gdk_imlib_clone_scaled_image(image, width, height); + gdk_imlib_destroy_image(image); + image = NULL; + + base_dir = g_strconcat(homedir(), THUMBNAIL_CACHE_DIR, NULL); + if (!isdir(base_dir)) + { + if (debug) printf("creating thumbnail dir:%s\n", base_dir); + if (mkdir(base_dir, 0755) < 0) + printf(_("create dir failed: %s\n"), base_dir); + } + + image_dir = remove_level_from_path(path); + thumb_dir = g_strconcat(base_dir, image_dir, NULL); + g_free(image_dir); + if (!isdir(thumb_dir)) + { + gchar *p = thumb_dir; + while (p[0] != '\0') + { + p++; + if (p[0] == '/' || p[0] == '\0') + { + gint end = TRUE; + if (p[0] != '\0') + { + p[0] = '\0'; + end = FALSE; + } + if (!isdir(thumb_dir)) + { + if (debug) printf("creating sub dir:%s\n",thumb_dir); + if (mkdir(thumb_dir, 0755) < 0) + printf(_("create dir failed: %s\n"), thumb_dir); + } + if (!end) p[0] = '/'; + } + } + } + g_free(thumb_dir); + + thumb_path = g_strconcat(base_dir, path, ".png", NULL); + if (debug) printf("Saving thumb: %s\n",thumb_path); + + gdk_imlib_save_image(thumb, thumb_path, NULL); + + g_free(base_dir); + g_free(thumb_path); + } + else + { + thumb = image; + } + + /* end save cache */ + + gdk_imlib_render(thumb, width, height); + *thumb_pixmap = gdk_imlib_move_image(thumb); + *thumb_mask = gdk_imlib_move_mask(thumb); + if (*thumb_pixmap) + space = thumb_max_width - width; + gdk_imlib_destroy_image(thumb); + thumb = NULL; + } + else + { + space = -1; + } + return space; +} + +gint maintain_thumbnail_dir(gchar *dir, gint recursive) +{ + gchar *thumb_dir; + gint base_length; + gint still_have_a_file = FALSE; + + if (debug) printf("maintainance check: %s\n", dir); + + base_length = strlen(homedir()) + strlen(THUMBNAIL_CACHE_DIR); + thumb_dir = g_strconcat(homedir(), THUMBNAIL_CACHE_DIR, dir, NULL); + + if (isdir(thumb_dir)) + { + DIR *dp; + struct dirent *dirent; + struct stat ent_sbuf; + + if((dp = opendir(thumb_dir))==NULL) + { + /* dir not found */ + g_free(thumb_dir); + return FALSE; + } + + while ((dirent = readdir(dp)) != NULL) + { + /* skips removed files */ + if (dirent->d_ino > 0) + { + int l = 0; + gchar *path_buf; + if (strcmp(dirent->d_name, ".") == 0 || strcmp(dirent->d_name, "..") == 0) + continue; + path_buf = g_strconcat(thumb_dir, "/", dirent->d_name, NULL); + if (strlen(path_buf) > 4) l = strlen(path_buf) - 4; + + if (stat(path_buf,&ent_sbuf) >= 0 && S_ISDIR(ent_sbuf.st_mode)) + { + /* recurse dir then delete it */ + gchar *rdir = g_strconcat(dir, "/", dirent->d_name, NULL); + if (recursive && !maintain_thumbnail_dir(rdir, TRUE)) + { + if (debug) printf("Deleting thumb dir: %s\n",path_buf); + if ( (rmdir (path_buf) < 0) ) + printf(_("Unable to delete dir: %s\n"), path_buf); + } + else + still_have_a_file = TRUE; + g_free(rdir); + } + else + { + gchar *fp = path_buf + l; + fp[0] = '\0'; + if (strlen(path_buf) > base_length && + !isfile(path_buf + base_length)) + { + fp[0] = '.'; + if (debug) printf("Deleting thumb: %s\n",path_buf); + if ( (unlink (path_buf) < 0) ) + printf(_("failed to delete:%s\n"),path_buf); + } + else + still_have_a_file = TRUE; + } + g_free(path_buf); + } + } + closedir(dp); + } + g_free(thumb_dir); + return still_have_a_file; +} + +/* + *----------------------------------------------------------------------------- + * xvpics thumbnail support, read-only (private) + *----------------------------------------------------------------------------- + */ + +/* + * xvpics code originally supplied by: + * "Diederen Damien" + * + * Note: Code has been modified to fit the style of the other code, and to use + * a few more glib-isms. + */ + +#define XV_BUFFER 2048 +static guchar *load_xv_thumbnail(gchar *filename, gint *widthp, gint *heightp) +{ + FILE *file; + gchar buffer[XV_BUFFER]; + guchar *data; + gint width, height, depth; + + file = fopen(filename, "rt"); + if(!file) return NULL; + + fgets(buffer, XV_BUFFER, file); + if(strncmp(buffer, "P7 332", 6) != 0) + { + fclose(file); + return NULL; + } + + while(fgets(buffer, XV_BUFFER, file) && buffer[0] == '#') /* do_nothing() */; + + if(sscanf(buffer, "%d %d %d", &width, &height, &depth) != 3) + { + fclose(file); + return NULL; + } + + data = g_new(guchar, width * height); + fread(data, 1, width * height, file); + + fclose(file); + *widthp = width; + *heightp = height; + return data; +} +#undef XV_BUFFER + +static void normalize_thumb(gint *width, gint *height) +{ + if(*width > thumb_max_width || *height > thumb_max_height) + { + gfloat factor = MAX((gfloat) *width / thumb_max_width, (gfloat) *height / thumb_max_height); + *width = (gfloat) *width / factor; + *height = (gfloat) *height / factor; + } +} + +static gint get_xv_thumbnail(gchar *thumb_filename, GdkPixmap **thumb_pixmap, GdkBitmap **thumb_mask) +{ + gint width, height; + gchar *thumb_name; + gchar *tmp_string; + gchar *last_slash; + guchar *packed_data; + + tmp_string = g_strdup(thumb_filename); + last_slash = strrchr(tmp_string, '/'); + if(!last_slash) return -1; + *last_slash++ = '\0'; + + thumb_name = g_strconcat(tmp_string, "/.xvpics/", last_slash, NULL); + packed_data = load_xv_thumbnail(thumb_name, &width, &height); + g_free(tmp_string); + g_free(thumb_name); + + if(packed_data) + { + guchar *rgb_data; + GdkImlibImage *image; + gint i; + + rgb_data = g_new(guchar, width * height * 3); + for(i = 0; i < width * height; i++) + { + rgb_data[i * 3 + 0] = (packed_data[i] >> 5) * 36; + rgb_data[i * 3 + 1] = ((packed_data[i] & 28) >> 2) * 36; + rgb_data[i * 3 + 2] = (packed_data[i] & 3) * 85; + } + + g_free(packed_data); + image = gdk_imlib_create_image_from_data(rgb_data, NULL, width, height); + g_free(rgb_data); + normalize_thumb(&width, &height); + gdk_imlib_render(image, width, height); + + if(*thumb_pixmap) gdk_imlib_free_pixmap(*thumb_pixmap); + + *thumb_pixmap = gdk_imlib_move_image(image); + *thumb_mask = gdk_imlib_move_mask(image); + gdk_imlib_destroy_image(image); + return thumb_max_width - width; + } + + return -1; +} + diff --git a/src/utildlg.c b/src/utildlg.c new file mode 100644 index 00000000..29035d2b --- /dev/null +++ b/src/utildlg.c @@ -0,0 +1,226 @@ +/* + * GQview image viewer + * (C)1999 John Ellis + * + * Author: John Ellis + * + */ + +#include "gqview.h" + +static void warning_dialog_close(GtkWidget *w, gpointer data); +static void warning_dialog_destroy(GtkWidget *w, GdkEvent *event, gpointer data); + +static void confirm_dialog_click_cb(GtkWidget *w, gpointer data); +static void confirm_dialog_delete_cb(GtkWidget *w, GdkEvent *event, gpointer data); + +static void generic_dialog_delete_cb(GtkWidget *widget, GdkEvent *event, gpointer data); + + +/* + *----------------------------------------------------------------------------- + * warning dialog routines + *----------------------------------------------------------------------------- + */ + +static void warning_dialog_close(GtkWidget *w, gpointer data) +{ + GtkWidget *warning_window = data; + gtk_widget_destroy(warning_window); +} + +static void warning_dialog_destroy(GtkWidget *w, GdkEvent *event, gpointer data) +{ + warning_dialog_close(NULL, data); +} + +void warning_dialog(gchar *title, gchar *message) +{ + GtkWidget *warning_window; + GtkWidget *hbox; + GtkWidget *vbox; + GtkWidget *label; + GtkWidget *button; + + warning_window = gtk_window_new(GTK_WINDOW_DIALOG); + gtk_signal_connect (GTK_OBJECT (warning_window), "delete_event",(GtkSignalFunc) warning_dialog_destroy, warning_window); + gtk_window_set_policy (GTK_WINDOW(warning_window), FALSE, FALSE, TRUE); + gtk_window_set_title (GTK_WINDOW (warning_window), title); + gtk_container_border_width (GTK_CONTAINER (warning_window), 10); + + vbox = gtk_vbox_new(FALSE, 5); + gtk_container_add(GTK_CONTAINER(warning_window),vbox); + gtk_widget_show(vbox); + + label = gtk_label_new(message); + gtk_box_pack_start(GTK_BOX(vbox),label,FALSE,FALSE,0); + gtk_widget_show(label); + + label = gtk_hseparator_new(); + gtk_box_pack_start(GTK_BOX(vbox),label,FALSE,FALSE,0); + gtk_widget_show(label); + + hbox = gtk_hbox_new(TRUE, 5); + gtk_container_add(GTK_CONTAINER(vbox),hbox); + gtk_widget_show(hbox); + + button = gtk_button_new_with_label(_(" Ok ")); + gtk_signal_connect (GTK_OBJECT (button), "clicked",(GtkSignalFunc) warning_dialog_close, warning_window); + gtk_box_pack_start(GTK_BOX(hbox),button,FALSE,FALSE,0); + gtk_widget_show(button); + + gtk_widget_show(warning_window); +} + +/* + *----------------------------------------------------------------------------- + * confirmation dialog + *----------------------------------------------------------------------------- + */ + +static void confirm_dialog_click_cb(GtkWidget *w, gpointer data) +{ + ConfirmDialog *cd = data; + gtk_widget_destroy(cd->dialog); + g_free(cd); +} + +static void confirm_dialog_delete_cb(GtkWidget *w, GdkEvent *event, gpointer data) +{ + ConfirmDialog *cd = data; + cd->cancel_cb(NULL, cd->data); + confirm_dialog_click_cb(w, data); +} + +void confirm_dialog_add(ConfirmDialog *cd, gchar *text, void (*func_cb)(GtkWidget *, gpointer)) +{ + GtkWidget *button; + button = gtk_button_new_with_label(text); + gtk_signal_connect(GTK_OBJECT(button), "clicked", func_cb, cd->data); + gtk_signal_connect(GTK_OBJECT(button), "clicked", confirm_dialog_click_cb, cd); + gtk_box_pack_end(GTK_BOX(cd->hbox), button, TRUE, TRUE, 0); + gtk_widget_grab_focus(button); + gtk_widget_show(button); +} + +ConfirmDialog *confirm_dialog_new(gchar *title, gchar *message, void (*cancel_cb)(GtkWidget *, gpointer), gpointer data) +{ + ConfirmDialog *cd; + GtkWidget *vbox; + GtkWidget *label; + + cd = g_new0(ConfirmDialog, 1); + cd->data = data; + cd->cancel_cb = cancel_cb; + + cd->dialog = gtk_window_new(GTK_WINDOW_DIALOG); + gtk_signal_connect (GTK_OBJECT (cd->dialog), "delete_event", confirm_dialog_delete_cb, cd); + gtk_window_set_policy (GTK_WINDOW(cd->dialog), FALSE, FALSE, TRUE); + gtk_window_set_title (GTK_WINDOW (cd->dialog), title); + gtk_container_border_width (GTK_CONTAINER (cd->dialog), 10); + + vbox = gtk_vbox_new(FALSE, 15); + gtk_container_add(GTK_CONTAINER(cd->dialog),vbox); + gtk_widget_show(vbox); + + label = gtk_label_new(message); + gtk_box_pack_start(GTK_BOX(vbox),label,FALSE,FALSE,0); + gtk_widget_show(label); + + label = gtk_hseparator_new(); + gtk_box_pack_start(GTK_BOX(vbox),label,FALSE,FALSE,0); + gtk_widget_show(label); + + cd->hbox = gtk_hbox_new(TRUE, 15); + gtk_container_add(GTK_CONTAINER(vbox),cd->hbox); + gtk_widget_show(cd->hbox); + + gtk_widget_show(cd->dialog); + + confirm_dialog_add(cd, _("Cancel"), cd->cancel_cb); + + return cd; +} + +/* + *----------------------------------------------------------------------------- + * generic file ops dialog routines + *----------------------------------------------------------------------------- + */ + +void generic_dialog_close(GtkWidget *widget, gpointer data) +{ + FileDialog *fd = data; + if(fd->dialog) gtk_widget_destroy(fd->dialog); + g_free(fd->source_path); + g_free(fd->dest_path); + if (fd->source_list) free_selected_list(fd->source_list); + g_free(fd); +} + +static void generic_dialog_delete_cb(GtkWidget *widget, GdkEvent *event, gpointer data) +{ + generic_dialog_close(NULL, data); +} + +FileDialog *generic_dialog_new(gchar *title, gchar *text, gchar *btn1, gchar *btn2, + void (*btn1_cb)(GtkWidget *, gpointer), + void (*btn2_cb)(GtkWidget *, gpointer)) +{ + FileDialog *fd = NULL; + GtkWidget *button; + GtkWidget *hbox; + GtkWidget *label; + + fd = g_new0(FileDialog, 1); + + fd->dialog = gtk_window_new(GTK_WINDOW_DIALOG); + gtk_signal_connect (GTK_OBJECT (fd->dialog), "delete_event", (GtkSignalFunc)generic_dialog_delete_cb, fd); + gtk_window_set_policy (GTK_WINDOW(fd->dialog), FALSE, TRUE, FALSE); + gtk_window_set_title (GTK_WINDOW (fd->dialog), title); + gtk_container_border_width (GTK_CONTAINER (fd->dialog), 10); + + fd->vbox = gtk_vbox_new(FALSE,5); + gtk_container_add (GTK_CONTAINER(fd->dialog), fd->vbox); + gtk_widget_show(fd->vbox); + + if (text) + { + label = gtk_label_new(text); + gtk_box_pack_start(GTK_BOX(fd->vbox), label, FALSE, FALSE, 0); + gtk_widget_show(label); + } + + if (btn1_cb || btn2_cb) + { + GtkWidget *sep; + hbox = gtk_hbox_new(TRUE, 15); + gtk_box_pack_end(GTK_BOX(fd->vbox), hbox, FALSE, FALSE, 5); + gtk_widget_show(hbox); + + sep = gtk_hseparator_new(); + gtk_box_pack_end(GTK_BOX(fd->vbox), sep, FALSE, FALSE, 0); + gtk_widget_show(sep); + } + + if (btn1_cb) + { + button = gtk_button_new_with_label(btn1); + gtk_signal_connect (GTK_OBJECT (button), "clicked",(GtkSignalFunc) btn1_cb, fd); + gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 0); + gtk_widget_grab_focus(button); + gtk_widget_show(button); + } + + if (btn2_cb) + { + button = gtk_button_new_with_label(btn2); + gtk_signal_connect (GTK_OBJECT (button), "clicked",(GtkSignalFunc) btn2_cb, fd); + gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 0); + gtk_widget_show(button); + } + + gtk_widget_show(fd->dialog); + return fd; +} + diff --git a/src/utildlg.h b/src/utildlg.h new file mode 100644 index 00000000..bd8ab5b9 --- /dev/null +++ b/src/utildlg.h @@ -0,0 +1,44 @@ +/* + * GQview image viewer + * (C)1999 John Ellis + * + * Author: John Ellis + * + */ + +typedef struct _FileDialog FileDialog; +struct _FileDialog +{ + gint type; + gint multiple_files; + + GtkWidget *dialog; + GtkWidget *vbox; + GtkWidget *entry; + + gchar *source_path; + GList *source_list; + + gchar *dest_path; +}; + +typedef struct _ConfirmDialog ConfirmDialog; +struct _ConfirmDialog +{ + GtkWidget *dialog; + GtkWidget *hbox; + void (*cancel_cb)(GtkWidget *, gpointer); + gpointer data; +}; + + +void warning_dialog(gchar *title, gchar *message); + +ConfirmDialog *confirm_dialog_new(gchar *title, gchar *message, void (*cancel_cb)(GtkWidget *, gpointer), gpointer data); +void confirm_dialog_add(ConfirmDialog *cd, gchar *text, void (*func_cb)(GtkWidget *, gpointer)); + +FileDialog *generic_dialog_new(gchar *title, gchar *text, gchar *btn1, gchar *btn2, + void (*btn1_cb)(GtkWidget *, gpointer), + void (*btn2_cb)(GtkWidget *, gpointer)); +void generic_dialog_close(GtkWidget *widget, gpointer data); + diff --git a/src/utilops.c b/src/utilops.c new file mode 100644 index 00000000..29d0c991 --- /dev/null +++ b/src/utilops.c @@ -0,0 +1,961 @@ +/* + * GQview image viewer + * (C)1999 John Ellis + * + * Author: John Ellis + * + */ + +#include "gqview.h" + +enum { + DIALOG_NEW_DIR, + DIALOG_COPY, + DIALOG_MOVE, + DIALOG_DELETE, + DIALOG_RENAME +}; + +typedef struct _FileDataMult FileDataMult; +struct _FileDataMult +{ + gint confirm_all; + gint confirmed; + gint skip; + GList *source_list; + GList *source_next; + gchar *dest_base; + gchar *source; + gchar *dest; + gint copy; +}; + +typedef struct _FileDataSingle FileDataSingle; +struct _FileDataSingle +{ + gint confirmed; + gchar *source; + gchar *dest; + gint copy; +}; + +static FileDataMult *file_data_multiple_new(GList *source_list, gchar *dest, gint copy); +static void file_data_multiple_free(FileDataMult *fdm); +static void file_util_move_multiple(FileDataMult *fdm); +static void file_util_move_multiple_ok_cb(GtkWidget *widget, gpointer data); +static void file_util_move_multiple_all_cb(GtkWidget *widget, gpointer data); +static void file_util_move_multiple_skip_cb(GtkWidget *widget, gpointer data); +static void file_util_move_multiple_cancel_cb(GtkWidget *widget, gpointer data); +static void file_util_move_multiple(FileDataMult *fdm); + +static FileDataSingle *file_data_single_new(gchar *source, gchar *dest, gint copy); +static void file_data_single_free(FileDataSingle *fds); +static void file_util_move_single_ok_cb(GtkWidget *widget, gpointer data); +static void file_util_move_single(FileDataSingle *fds); +static void file_util_move_single_cancel_cb(GtkWidget *widget, gpointer data); +static void file_util_move_do(FileDialog *fd); +static void file_util_move_check(FileDialog *fd); +static void file_util_move_cb(GtkWidget *widget, gpointer data); +static void file_util_move_enter_cb(gchar *path, gpointer data); +static void file_util_move_completion_sync_cb(gchar *path, gpointer data); +static void real_file_util_move(gchar *source_path, GList *source_list, gchar *dest_path, gint copy); + +static void file_util_delete_multiple_ok_cb(GtkWidget *w, gpointer data); +static void file_util_delete_multiple_cancel_cb(GtkWidget *w, gpointer data); +static void file_util_delete_multiple(GList *source_list); +static void file_util_delete_ok_cb(GtkWidget *w, gpointer data); +static void file_util_delete_cancel_cb(GtkWidget *w, gpointer data); +static void file_util_delete_single(gchar *path); + +static void file_util_rename_multiple_ok_cb(GtkWidget *w, gpointer data); +static void file_util_rename_multiple_cancel_cb(GtkWidget *w, gpointer data); +static void file_util_rename_multiple(FileDialog *fd); +static void file_util_rename_multiple_cb(GtkWidget *w, gpointer data); +static void file_util_rename_multiple_select_cb(GtkWidget *clist, + gint row, gint column, GdkEventButton *bevent, gpointer data); +static void file_util_rename_multiple_do(GList *source_list); + +static void file_util_rename_single_ok_cb(GtkWidget *w, gpointer data); +static void file_util_rename_single_cancel_cb(GtkWidget *w, gpointer data); +static void file_util_rename_single(FileDataSingle *fds); +static void file_util_rename_single_cb(GtkWidget *w, gpointer data); +static void file_util_rename_single_do(gchar *source_path); + +static void file_util_create_dir_do(gchar *source, gchar *path); +static void file_util_create_dir_cb(GtkWidget *w, gpointer data); + +/* + *-------------------------------------------------------------------------- + * Move and Copy routines + *-------------------------------------------------------------------------- + */ + +/* + * Multi file move + */ + +static FileDataMult *file_data_multiple_new(GList *source_list, gchar *dest, gint copy) +{ + FileDataMult *fdm = g_new0(FileDataMult, 1); + fdm->confirm_all = FALSE; + fdm->confirmed = FALSE; + fdm->skip = FALSE; + fdm->source_list = source_list; + fdm->source_next = fdm->source_list; + fdm->dest_base = g_strdup(dest); + fdm->source = NULL; + fdm->dest = NULL; + fdm->copy = copy; + return fdm; +} + +static void file_data_multiple_free(FileDataMult *fdm) +{ + free_selected_list(fdm->source_list); + g_free(fdm->dest_base); + g_free(fdm->dest); + g_free(fdm); +} + +static void file_util_move_multiple_ok_cb(GtkWidget *widget, gpointer data) +{ + FileDataMult *fdm = data; + fdm->confirmed = TRUE; + file_util_move_multiple(fdm); +} + +static void file_util_move_multiple_all_cb(GtkWidget *widget, gpointer data) +{ + FileDataMult *fdm = data; + fdm->confirm_all = TRUE; + file_util_move_multiple(fdm); +} + +static void file_util_move_multiple_skip_cb(GtkWidget *widget, gpointer data) +{ + FileDataMult *fdm = data; + fdm->skip = TRUE; + file_util_move_multiple(fdm); +} + +static void file_util_move_multiple_cancel_cb(GtkWidget *widget, gpointer data) +{ + FileDataMult *fdm = data; + file_data_multiple_free(fdm); +} + +static void file_util_move_multiple(FileDataMult *fdm) +{ + while (fdm->dest || fdm->source_next) + { + if (!fdm->dest) + { + GList *work = fdm->source_next; + fdm->source = work->data; + fdm->dest = g_strconcat(fdm->dest_base, "/", filename_from_path(fdm->source), NULL); + fdm->source_next = work->next; + } + + if (isfile(fdm->dest) && !fdm->confirmed && !fdm->confirm_all && !fdm->skip) + { + ConfirmDialog *cd; + gchar *text = g_strdup_printf(_("Overwrite file:\n %s\n with:\b %s"), fdm->dest, fdm->source); + cd = confirm_dialog_new(_("Overwrite file"), text, file_util_move_multiple_cancel_cb, fdm); + confirm_dialog_add(cd, _("Skip"), file_util_move_multiple_skip_cb); + confirm_dialog_add(cd, _("Yes to all"), file_util_move_multiple_all_cb); + confirm_dialog_add(cd, _("Yes"), file_util_move_multiple_ok_cb); + g_free(text); + return; + } + else + { + gint success = FALSE; + if (fdm->skip) + { + success = TRUE; + fdm->skip = FALSE; + } + else + { + if (fdm->copy) + { + success = copy_file(fdm->source, fdm->dest); + } + else + { + if (move_file(fdm->source, fdm->dest)) + { + success = TRUE; + file_is_gone(fdm->source, fdm->source_list); + } + } + } + if (!success) + { + ConfirmDialog *cd; + gchar *title; + gchar *text; + if (fdm->copy) + { + title = _("Error copying file"); + text = g_strdup_printf(_("Unable to copy file:\n%sto:\n%s\n during multiple file copy."), fdm->source, fdm->dest); + } + else + { + title = _("Error moving file"); + text = g_strdup_printf(_("Unable to move file:\n%sto:\n%s\n during multiple file move."), fdm->source, fdm->dest); + } + cd = confirm_dialog_new(title, text, file_util_move_multiple_cancel_cb, fdm); + confirm_dialog_add(cd, _("Continue"), file_util_move_multiple_skip_cb); + g_free(text); + return; + } + fdm->confirmed = FALSE; + g_free(fdm->dest); + fdm->dest = NULL; + } + } + + file_data_multiple_free(fdm); +} + +/* + * Single file move + */ + +static FileDataSingle *file_data_single_new(gchar *source, gchar *dest, gint copy) +{ + FileDataSingle *fds = g_new0(FileDataSingle, 1); + fds->confirmed = FALSE; + fds->source = g_strdup(source); + fds->dest = g_strdup(dest); + fds->copy = copy; + return fds; +} + +static void file_data_single_free(FileDataSingle *fds) +{ + g_free(fds->source); + g_free(fds->dest); + g_free(fds); +} + +static void file_util_move_single_ok_cb(GtkWidget *widget, gpointer data) +{ + FileDataSingle *fds = data; + fds->confirmed = TRUE; + file_util_move_single(fds); +} + +static void file_util_move_single_cancel_cb(GtkWidget *widget, gpointer data) +{ + FileDataSingle *fds = data; + file_data_single_free(fds); +} + +static void file_util_move_single(FileDataSingle *fds) +{ + if (isfile(fds->dest) && !fds->confirmed) + { + ConfirmDialog *cd; + gchar *text = g_strdup_printf(_("Overwrite file:\n%s\n with:\n%s"), fds->dest, fds->source); + cd = confirm_dialog_new(_("Overwrite file"), text, file_util_move_single_cancel_cb, fds); + confirm_dialog_add(cd, _("Overwrite"), file_util_move_single_ok_cb); + g_free(text); + return; + } + else + { + gint success = FALSE; + if (fds->copy) + { + success = copy_file(fds->source, fds->dest); + } + else + { + if (move_file(fds->source, fds->dest)) + { + success = TRUE; + file_is_gone(fds->source, NULL); + } + } + if (!success) + { + gchar *title; + gchar *text; + if (fds->copy) + { + title = _("Error copying file"); + text = g_strdup_printf(_("Unable to copy file:\n%s\nto:\n%s"), fds->source, fds->dest); + } + else + { + title = _("Error moving file"); + text = g_strdup_printf(_("Unable to move file:\n%s\nto:\n%s"), fds->source, fds->dest); + } + warning_dialog(title, text); + g_free(text); + } + file_data_single_free(fds); + } +} + +/* + * file move dialog + */ + +static void file_util_move_do(FileDialog *fd) +{ + tab_completion_append_to_history(fd->entry, fd->dest_path); + if (fd->multiple_files) + { + file_util_move_multiple(file_data_multiple_new(fd->source_list, fd->dest_path, fd->type)); + fd->source_list = NULL; + } + else + { + if (isdir(fd->dest_path)) + { + gchar *buf = g_strconcat(fd->dest_path, "/", filename_from_path(fd->source_path), NULL); + g_free(fd->dest_path); + fd->dest_path = buf; + } + file_util_move_single(file_data_single_new(fd->source_path, fd->dest_path, fd->type)); + } + + generic_dialog_close(NULL, fd); +} + +static void file_util_move_check(FileDialog *fd) +{ + g_free(fd->dest_path); + fd->dest_path = remove_trailing_slash(gtk_entry_get_text(GTK_ENTRY(fd->entry))); + + if (fd->multiple_files && !isdir(fd->dest_path)) + { + if (isfile(fd->dest_path)) + warning_dialog(_("Invalid destination"), _("When operating with multiple files, please select\n a directory, not file.")); + else + warning_dialog(_("Invalid directory"), _("Please select an existing directory")); + return; + } + + file_util_move_do(fd); +} + +static void file_util_move_cb(GtkWidget *widget, gpointer data) +{ + FileDialog *fd = data; + file_util_move_check(fd); +} + +static void file_util_move_enter_cb(gchar *path, gpointer data) +{ + FileDialog *fd = data; + file_util_move_check(fd); +} + +static void file_util_move_completion_sync_cb(gchar *path, gpointer data) +{ + FileDialog *fd = data; + destination_widget_sync_to_entry(fd->entry); +} + +static void real_file_util_move(gchar *source_path, GList *source_list, gchar *dest_path, gint copy) +{ + FileDialog *fd; + gchar *path = NULL; + gint multiple; + gchar *text; + gchar *title; + gchar *op_text; + GtkWidget *tabcomp; + GtkWidget *dest; + gchar *last_path; + + if (!source_path && !source_list) return; + + if (source_path) + { + path = g_strdup(source_path); + multiple = FALSE; + } + else if (source_list->next) + { + multiple = TRUE; + } + else + { + path = g_strdup(source_list->data); + free_selected_list(source_list); + source_list = NULL; + multiple = FALSE; + } + + if (copy) + { + title = _("GQview - copy"); + op_text = _("Copy"); + if (path) + text = g_strdup_printf(_("Copy file:\n%s\nto:"), path); + else + text = g_strdup_printf(_("Copy multiple files from:\n%s\nto:"), dest_path); + } + else + { + title = _("GQview - move"); + op_text = _("Move"); + if (path) + text = g_strdup_printf(_("Move file:\n%s\nto:"), path); + else + text = g_strdup_printf(_("Move multiple files from:\n%s\nto:"), dest_path); + } + + fd = generic_dialog_new(title, text, op_text, _("Cancel"), + file_util_move_cb, generic_dialog_close); + + g_free(text); + + fd->type = copy; + fd->source_path = path; + fd->source_list = source_list; + fd->multiple_files = multiple; + + tabcomp = tab_completion_new_with_history(&fd->entry, fd->dialog, dest_path, + "move_copy", 32, file_util_move_enter_cb, fd); + last_path = tab_completion_set_to_last_history(fd->entry); + if (last_path) + { + fd->dest_path = g_strdup(last_path); + } + else + { + fd->dest_path = g_strdup(dest_path); + } + +/* tabcomp = tab_completion_new(&fd->entry, fd->dialog, fd->dest_path, file_util_move_enter_cb, fd); +*/ + gtk_box_pack_start(GTK_BOX(fd->vbox), tabcomp, FALSE, FALSE, 0); + gtk_widget_show(tabcomp); + + gtk_widget_grab_focus(fd->entry); + + dest = destination_widget_new(fd->dest_path, fd->entry); + + tab_completion_add_tab_func(fd->entry, file_util_move_completion_sync_cb, fd); + + gtk_box_pack_start(GTK_BOX(fd->vbox), dest, TRUE, TRUE, 0); +} + +void file_util_move(gchar *source_path, GList *source_list, gchar *dest_path) +{ + real_file_util_move(source_path, source_list, dest_path, FALSE); +} + +void file_util_copy(gchar *source_path, GList *source_list, gchar *dest_path) +{ + real_file_util_move(source_path, source_list, dest_path, TRUE); +} + +/* + *-------------------------------------------------------------------------- + * Delete routines + *-------------------------------------------------------------------------- + */ + +/* + * delete multiple files + */ + +static void file_util_delete_multiple_ok_cb(GtkWidget *w, gpointer data) +{ + GList *source_list = data; + + while(source_list) + { + gchar *path = source_list->data; + source_list = g_list_remove(source_list, path); + if (unlink (path) < 0) + { + ConfirmDialog *cd; + gchar *text; + if (source_list) + { + text = g_strdup_printf(_("Unable to delete file:\n %s\n Continue multiple delete operation?"), path); + cd = confirm_dialog_new(_("Delete failed"), text, file_util_delete_multiple_cancel_cb, source_list); + confirm_dialog_add(cd, _("Continue"), file_util_delete_multiple_ok_cb); + } + else + { + text = g_strdup_printf(_("Unable to delete file:\n%s"), path); + warning_dialog(_("Delete failed"), text); + } + g_free(text); + g_free(path); + return; + } + else + { + file_is_gone(path, source_list); + } + g_free(path); + } +} + +static void file_util_delete_multiple_cancel_cb(GtkWidget *w, gpointer data) +{ + GList *source_list = data; + free_selected_list(source_list); +} + +static void file_util_delete_multiple(GList *source_list) +{ + if (!confirm_delete) + { + file_util_delete_multiple_ok_cb(NULL, source_list); + } + else + { + ConfirmDialog *cd; + cd = confirm_dialog_new(_("Delete files"), _("About to delete multiple files..."), file_util_delete_multiple_cancel_cb, source_list); + confirm_dialog_add(cd, _("Delete"), file_util_delete_multiple_ok_cb); + } +} + +/* + * delete single file + */ + +static void file_util_delete_ok_cb(GtkWidget *w, gpointer data) +{ + gchar *path = data; + + if (unlink (path) < 0) + { + gchar *text = g_strdup_printf(_("Unable to delete file:\n%s"), path); + warning_dialog(_("File deletion failed"), text); + g_free(text); + } + else + { + file_is_gone(path, NULL); + } + + g_free(path); +} + +static void file_util_delete_cancel_cb(GtkWidget *w, gpointer data) +{ + gchar *path = data; + g_free(path); +} + +static void file_util_delete_single(gchar *path) +{ + gchar *buf = g_strdup(path); + + if (!confirm_delete) + { + file_util_delete_ok_cb(NULL, buf); + } + else + { + ConfirmDialog *cd; + gchar *text = g_strdup_printf(_("About to delete the file:\n %s"), buf); + cd = confirm_dialog_new(_("Delete file"), text, file_util_delete_cancel_cb, buf); + confirm_dialog_add(cd, _("Delete"), file_util_delete_ok_cb); + g_free(text); + } +} + +void file_util_delete(gchar *source_path, GList *source_list) +{ + if (!source_path && !source_list) return; + + if (source_path) + { + file_util_delete_single(source_path); + } + else if (!source_list->next) + { + file_util_delete_single(source_list->data); + free_selected_list(source_list); + } + else + { + file_util_delete_multiple(source_list); + } +} + +/* + *-------------------------------------------------------------------------- + * Rename routines + *-------------------------------------------------------------------------- + */ + +/* + * rename multiple files + */ + +static void file_util_rename_multiple_ok_cb(GtkWidget *w, gpointer data) +{ + FileDialog *fd = data; + if (!GTK_WIDGET_VISIBLE(fd->dialog)) gtk_widget_show(fd->dialog); + fd->type = TRUE; + file_util_rename_multiple(fd); +} + +static void file_util_rename_multiple_cancel_cb(GtkWidget *w, gpointer data) +{ + FileDialog *fd = data; + if (!GTK_WIDGET_VISIBLE(fd->dialog)) gtk_widget_show(fd->dialog); + return; +} + +static void file_util_rename_multiple(FileDialog *fd) +{ + if (isfile(fd->dest_path) && !fd->type) + { + ConfirmDialog *cd; + gchar *text = g_strdup_printf(_("Overwrite file:\n%s\nby renaming:\n%s"), fd->dest_path, fd->source_path); + cd = confirm_dialog_new(_("Overwrite file"), text, file_util_rename_multiple_cancel_cb, fd); + confirm_dialog_add(cd, _("Overwrite"), file_util_rename_multiple_ok_cb); + g_free(text); + gtk_widget_hide(fd->dialog); + return; + } + else + { + if (rename (fd->source_path, fd->dest_path) < 0) + { + gchar *text = g_strdup_printf(_("Unable to rename file:\n%s\n to:\n%s"), filename_from_path(fd->source_path), filename_from_path(fd->dest_path)); + warning_dialog(_("Error renaming file"), text); + g_free(text); + } + else + { + gint row; + gint n; + GtkWidget *clist; + gchar *path; + + file_is_renamed(fd->source_path, fd->dest_path); + + clist = gtk_object_get_user_data(GTK_OBJECT(fd->entry)); + path = gtk_object_get_user_data(GTK_OBJECT(clist)); + row = gtk_clist_find_row_from_data(GTK_CLIST(clist), path); + + n = g_list_length(GTK_CLIST(clist)->row_list); + if (debug) printf("r=%d n=%d\n", row, n); + if (n - 1 > row) + n = row; + else if (n > 1) + n = row - 1; + else + n = -1; + + if (n >= 0) + { + gtk_object_set_user_data(GTK_OBJECT(clist), NULL); + gtk_clist_remove(GTK_CLIST(clist), row); + gtk_clist_select_row(GTK_CLIST(clist), n, -1); + } + else + { + if (debug) printf("closed by #%d\n", n); + generic_dialog_close(NULL, fd); + } + } + } +} + +static void file_util_rename_multiple_cb(GtkWidget *w, gpointer data) +{ + FileDialog *fd = data; + gchar *base; + gchar *name; + + name = gtk_entry_get_text(GTK_ENTRY(fd->entry)); + base = remove_level_from_path(fd->source_path); + g_free(fd->dest_path); + fd->dest_path = g_strconcat(base, "/", name, NULL); + g_free(base); + + if (strlen(name) == 0 || strcmp(fd->source_path, fd->dest_path) == 0) + { + return; + } + + fd->type = FALSE; + file_util_rename_multiple(fd); +} + +static void file_util_rename_multiple_select_cb(GtkWidget *clist, + gint row, gint column, GdkEventButton *bevent, gpointer data) +{ + FileDialog *fd = data; + GtkWidget *label; + gchar *name; + gchar *path; + + label = gtk_object_get_user_data(GTK_OBJECT(fd->dialog)); + path = gtk_clist_get_row_data(GTK_CLIST(clist), row); + g_free(fd->source_path); + fd->source_path = g_strdup(path); + gtk_object_set_user_data(GTK_OBJECT(clist), path); + name = filename_from_path(fd->source_path); + + gtk_label_set(GTK_LABEL(label), name); + gtk_entry_set_text(GTK_ENTRY(fd->entry), name); + + gtk_widget_grab_focus(fd->entry); +} + +static void file_util_rename_multiple_do(GList *source_list) +{ + FileDialog *fd; + GtkWidget *scrolled; + GtkWidget *clist; + GtkWidget *label; + GList *work; + + fd = generic_dialog_new(_("GQview - rename"), _("Rename multiple files:"), _("Rename"), _("Cancel"), + file_util_rename_multiple_cb, generic_dialog_close); + + fd->source_path = g_strdup(source_list->data); + fd->dest_path = NULL; + + scrolled = gtk_scrolled_window_new(NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled), + GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); + gtk_box_pack_start(GTK_BOX(fd->vbox), scrolled, TRUE, TRUE, 0); + gtk_widget_show(scrolled); + + clist=gtk_clist_new (1); + gtk_clist_set_column_auto_resize(GTK_CLIST(clist), 0, TRUE); + gtk_signal_connect (GTK_OBJECT (clist), "select_row",(GtkSignalFunc) file_util_rename_multiple_select_cb, fd); + gtk_widget_set_usize(clist, 250, 150); + gtk_container_add (GTK_CONTAINER (scrolled), clist); + gtk_widget_show (clist); + + gtk_object_set_user_data(GTK_OBJECT(clist), source_list->data); + + work = source_list; + while(work) + { + gint row; + gchar *buf[2]; + buf[0] = filename_from_path(work->data); + buf[1] = NULL; + row = gtk_clist_append(GTK_CLIST(clist), buf); + gtk_clist_set_row_data_full(GTK_CLIST(clist), row, + work->data, (GtkDestroyNotify) g_free); + work = work->next; + } + + g_list_free(source_list); + + label = gtk_label_new(_("Rename:")); + gtk_box_pack_start(GTK_BOX(fd->vbox), label, FALSE, FALSE, 0); + gtk_widget_show(label); + + label = gtk_label_new(filename_from_path(fd->source_path)); + gtk_box_pack_start(GTK_BOX(fd->vbox), label, FALSE, FALSE, 0); + gtk_widget_show(label); + gtk_object_set_user_data(GTK_OBJECT(fd->dialog), label); + + label = gtk_label_new(_("to:")); + gtk_box_pack_start(GTK_BOX(fd->vbox), label, FALSE, FALSE, 0); + gtk_widget_show(label); + + fd->entry = gtk_entry_new(); + gtk_entry_set_text(GTK_ENTRY(fd->entry), filename_from_path(fd->source_path)); + gtk_box_pack_start(GTK_BOX(fd->vbox), fd->entry, FALSE, FALSE, 0); + gtk_widget_grab_focus(fd->entry); + gtk_widget_show(fd->entry); + + gtk_object_set_user_data(GTK_OBJECT(fd->entry), clist); +} + +/* + * rename single file + */ + +static void file_util_rename_single_ok_cb(GtkWidget *w, gpointer data) +{ + FileDataSingle *fds = data; + fds->confirmed = TRUE; + file_util_rename_single(fds); +} + +static void file_util_rename_single_cancel_cb(GtkWidget *w, gpointer data) +{ + FileDataSingle *fds = data; + file_data_single_free(fds); +} + +static void file_util_rename_single(FileDataSingle *fds) +{ + if (isfile(fds->dest) && !fds->confirmed) + { + ConfirmDialog *cd; + gchar *text = g_strdup_printf(_("Overwrite file:\n%s\nwith:\n%s"), fds->dest,fds->source); + cd = confirm_dialog_new(_("Overwrite file"), text, file_util_rename_single_cancel_cb, fds); + confirm_dialog_add(cd, _("Overwrite"), file_util_rename_single_ok_cb); + g_free(text); + return; + } + else + { + if (rename (fds->source, fds->dest) < 0) + { + gchar *text = g_strdup_printf(_("Unable to rename file:\n%s\nto:\n%s"), filename_from_path(fds->source), filename_from_path(fds->dest)); + warning_dialog(_("Error renaming file"), text); + g_free(text); + } + else + { + file_is_renamed(fds->source, fds->dest); + } + } + file_data_single_free(fds); +} + +static void file_util_rename_single_cb(GtkWidget *w, gpointer data) +{ + FileDialog *fd = data; + gchar *name = gtk_entry_get_text(GTK_ENTRY(fd->entry)); + gchar *buf = g_strconcat(fd->dest_path, "/", name, NULL); + + if (strlen(name) == 0 || strcmp(fd->source_path, buf) == 0) + { + g_free(buf); + return; + } + + g_free(fd->dest_path); + fd->dest_path = buf; + + file_util_rename_single(file_data_single_new(fd->source_path, fd->dest_path, fd->type)); + + generic_dialog_close(NULL, fd); +} + +static void file_util_rename_single_do(gchar *source_path) +{ + FileDialog *fd; + gchar *text; + gchar *name = filename_from_path(source_path); + + text = g_strdup_printf(_("Rename file:\n%s\nto:"), name); + fd = generic_dialog_new(_("GQview - rename"), text, _("Rename"), _("Cancel"), + file_util_rename_single_cb, generic_dialog_close); + g_free(text); + + fd->source_path = g_strdup(source_path); + fd->dest_path = remove_level_from_path(source_path); + + fd->entry = gtk_entry_new(); + gtk_entry_set_text(GTK_ENTRY(fd->entry), name); + gtk_box_pack_start(GTK_BOX(fd->vbox), fd->entry, FALSE, FALSE, 0); + gtk_widget_grab_focus(fd->entry); + gtk_widget_show(fd->entry); +} + +void file_util_rename(gchar *source_path, GList *source_list) +{ + if (!source_path && !source_list) return; + + if (source_path) + { + file_util_rename_single_do(source_path); + } + else if (!source_list->next) + { + file_util_rename_single_do(source_list->data); + free_selected_list(source_list); + } + else + { + file_util_rename_multiple_do(source_list); + } +} + +/* + *-------------------------------------------------------------------------- + * Create directory routines + *-------------------------------------------------------------------------- + */ + +static void file_util_create_dir_do(gchar *source, gchar *path) +{ + if (isfile(path)) + { + gchar *text = g_strdup_printf(_("The path:\n%s\nalready exists as a file."), filename_from_path(path)); + warning_dialog(_("Could not create directory"), text); + g_free(text); + } + else if (isdir(path)) + { + gchar *text = g_strdup_printf(_("The directory:\n%s\nalready exists."), filename_from_path(path)); + warning_dialog(_("Directory exists"), text); + g_free(text); + } + else + { + if (mkdir (path, 0755) < 0) + { + gchar *text = g_strdup_printf(_("Unable to create directory:\n%s"), filename_from_path(path)); + warning_dialog(_("Error creating directory"), text); + g_free(text); + } + else + { + if (strcmp(source, current_path) == 0) + { + gchar *buf = g_strdup(current_path); + filelist_change_to(buf); + g_free(buf); + } + } + } +} + +static void file_util_create_dir_cb(GtkWidget *w, gpointer data) +{ + FileDialog *fd = data; + gchar *name = gtk_entry_get_text(GTK_ENTRY(fd->entry)); + + if (strlen(name) == 0) return; + + g_free(fd->dest_path); + fd->dest_path = g_strconcat(fd->source_path, "/", name, NULL); + + file_util_create_dir_do(fd->source_path, fd->dest_path); + + generic_dialog_close(NULL, fd); +} + +void file_util_create_dir(gchar *path) +{ + FileDialog *fd; + gchar *text; + gchar *name; + + if (!isdir(path)) return; + name = filename_from_path(path); + + text = g_strdup_printf(_("Create directory in:\n%s\nnamed:"), path); + fd = generic_dialog_new(_("GQview - new directory"), text, _("Create"), _("Cancel"), + file_util_create_dir_cb, generic_dialog_close); + g_free(text); + + fd->source_path = g_strdup(path); + fd->dest_path = NULL; + + fd->entry = gtk_entry_new(); + gtk_box_pack_start(GTK_BOX(fd->vbox), fd->entry, FALSE, FALSE, 0); + gtk_widget_grab_focus(fd->entry); + gtk_widget_show(fd->entry); +} + diff --git a/src/window.c b/src/window.c new file mode 100644 index 00000000..85b2281a --- /dev/null +++ b/src/window.c @@ -0,0 +1,501 @@ +/* + * GQview image viewer + * (C)1999 John Ellis + * + * Author: John Ellis + * + */ + +#include "gqview.h" + +#define MAINWINDOW_DEF_WIDTH 500 +#define MAINWINDOW_DEF_HEIGHT 400 +#define TOOLWINDOW_DEF_WIDTH 224 +#define TOOLWINDOW_DEF_HEIGHT 450 +#define LIST_DEFAULT_WIDTH -1 +#define LIST_DEFAULT_HEIGHT 100 + +static GtkWidget *add_label(gchar *text, GtkWidget *box, gint start, gint size, gint expand); +static void info_area_create(GtkWidget *vbox); + +static void toolwindow_create(); +static void toolwindow_destroy(); +static void toolwindow_show(); + +static void image_focus_paint(GtkWidget *widget); +static gint image_focus_expose (GtkWidget *widget, GdkEventExpose *event, gpointer data); +static gint image_focus_in_cb(GtkWidget *widget, GdkEventFocus *event, gpointer data); +static gint image_focus_out_cb(GtkWidget *widget, GdkEventFocus *event, gpointer data); + +static void create_tools(GtkAccelGroup *accel_grp, GtkTooltips *tooltips); +static void mainwindow_destroy_cb(GtkWidget *widget, gpointer data); + +/* + *----------------------------------------------------------------------------- + * information widget creation routines (private) + *----------------------------------------------------------------------------- + */ + +static GtkWidget *add_label(gchar *text, GtkWidget *box, gint start, gint size, gint expand) +{ + GtkWidget *label; + GtkWidget *frame; + + frame = gtk_frame_new (NULL); + if (size) + gtk_widget_set_usize (frame, size, -1); + gtk_frame_set_shadow_type(GTK_FRAME(frame),GTK_SHADOW_IN); + if (start) + gtk_box_pack_start(GTK_BOX(box), frame, expand, expand, 0); + else + gtk_box_pack_end(GTK_BOX(box), frame, expand, expand, 0); + gtk_widget_show(frame); + + label = gtk_label_new(text); + gtk_container_add (GTK_CONTAINER (frame), label); + gtk_widget_show(label); + + return label; +} + +static void info_area_create(GtkWidget *vbox) +{ + gchar *status_text; + gchar *details_text; + gchar *zoom_text; + gchar *buf; + + if (info_status) + { + gtk_label_get(GTK_LABEL(info_status), &buf); + status_text = g_strdup(buf); + + gtk_label_get(GTK_LABEL(info_details), &buf); + details_text = g_strdup(buf); + + gtk_label_get(GTK_LABEL(info_zoom), &buf); + zoom_text = g_strdup(buf); + } + else + { + status_text = g_strdup(""); + details_text = g_strdup("GQview"); + zoom_text = g_strdup(":"); + } + + if (info_box) + { + gtk_widget_destroy(info_box); + info_box = NULL; + } + + if (vbox) + { + GtkWidget *hbox; + hbox = gtk_hbox_new(FALSE, 0); + gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); + gtk_widget_show(hbox); + + info_progress_bar = gtk_progress_bar_new(); + gtk_widget_set_usize(info_progress_bar,150,-1); + gtk_box_pack_start (GTK_BOX (hbox), info_progress_bar, FALSE, FALSE, 0); + gtk_widget_show(info_progress_bar); + + info_zoom = add_label(zoom_text, hbox, FALSE, 48, FALSE); + + info_status = add_label(status_text, vbox, TRUE, 0, FALSE); + info_details = add_label(details_text, vbox, TRUE, 0, FALSE); + } + else + { + info_box = gtk_hbox_new(FALSE, 0); + + info_progress_bar = gtk_progress_bar_new(); + gtk_widget_set_usize(info_progress_bar,150,-1); + gtk_box_pack_start (GTK_BOX (info_box), info_progress_bar, FALSE, FALSE, 0); + gtk_widget_show(info_progress_bar); + + info_status = add_label(status_text, info_box, TRUE, 0, TRUE); + info_details = add_label(details_text, info_box, TRUE, 0, TRUE); + info_zoom = add_label(zoom_text, info_box, FALSE, 48, FALSE); + + gtk_widget_show(info_box); + } + + image_set_labels(info_details, info_zoom); + + g_free(status_text); + g_free(details_text); + g_free(zoom_text); +} + +/* + *----------------------------------------------------------------------------- + * tool window create/show/hide routines (private) + *----------------------------------------------------------------------------- + */ + +static void toolwindow_destroy_cb(GtkWidget *widget, gpointer data) +{ + toolwindow_float(); +} + +static void toolwindow_create() +{ + GtkWidget *vbox; + GtkAllocation req_size; + + toolwindow = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_signal_connect (GTK_OBJECT (toolwindow), "delete_event",(GtkSignalFunc) toolwindow_destroy_cb, NULL); + gtk_window_set_policy(GTK_WINDOW(toolwindow), TRUE, TRUE, FALSE); + gtk_window_set_title (GTK_WINDOW (toolwindow), _("GQview Tools")); + gtk_window_set_wmclass(GTK_WINDOW (toolwindow), "tools", "GQview"); + gtk_container_border_width (GTK_CONTAINER (toolwindow), 0); + gtk_window_add_accel_group(GTK_WINDOW(toolwindow),mainwindow_accel_grp); + + gtk_signal_connect(GTK_OBJECT(toolwindow), "key_press_event", GTK_SIGNAL_FUNC(key_press_cb), NULL); + + if (save_window_positions) + { + gtk_window_set_default_size (GTK_WINDOW(toolwindow), float_window_w, float_window_h); + gtk_widget_set_uposition(toolwindow, float_window_x, float_window_y); + req_size.x = req_size.y = 0; + req_size.width = float_window_w; + req_size.height = float_window_h; + } + else + { + gtk_window_set_default_size (GTK_WINDOW(toolwindow), TOOLWINDOW_DEF_WIDTH, TOOLWINDOW_DEF_HEIGHT); + req_size.x = req_size.y = 0; + req_size.width = TOOLWINDOW_DEF_WIDTH; + req_size.height = TOOLWINDOW_DEF_HEIGHT; + } + gtk_widget_size_allocate(toolwindow, &req_size); + + vbox = gtk_vbox_new(FALSE, 0); + gtk_container_add(GTK_CONTAINER(toolwindow), vbox); + + gtk_widget_realize(toolwindow); + gtk_widget_realize(vbox); + + if (tool_vbox->parent) + { + gtk_widget_ref(tool_vbox); + gtk_container_remove(GTK_CONTAINER(tool_vbox->parent), tool_vbox); + gtk_box_pack_start(GTK_BOX(vbox), tool_vbox, TRUE, TRUE, 0); + gtk_widget_unref(tool_vbox); + } + else + { + gtk_box_pack_start(GTK_BOX(vbox), tool_vbox, TRUE, TRUE, 0); + } + + info_area_create(vbox); + + gtk_widget_show_all(vbox); +} + +static void toolwindow_destroy() +{ + if (toolwindow && GTK_WIDGET_VISIBLE(toolwindow)) + { + gdk_window_get_position (toolwindow->window, &float_window_x, &float_window_y); + gdk_window_get_size(toolwindow->window, &float_window_w, &float_window_h); + } + + info_area_create(NULL); + + gtk_widget_ref(tool_vbox); + gtk_container_remove(GTK_CONTAINER(tool_vbox->parent), tool_vbox); + gtk_box_pack_start(GTK_BOX(mainwindow_hbox), tool_vbox, FALSE, FALSE, 0); + gtk_widget_unref(tool_vbox); + + gtk_box_pack_start(GTK_BOX(mainwindow_vbox), info_box, FALSE, FALSE, 0); + gtk_widget_destroy(toolwindow); + toolwindow = NULL; +} + +static void toolwindow_show() +{ + gtk_widget_show(toolwindow); + if (save_window_positions) + gdk_window_move(toolwindow->window, float_window_x, float_window_y); + +} + +/* + *----------------------------------------------------------------------------- + * tool window hide/float routines (public) + *----------------------------------------------------------------------------- + */ + +void toolwindow_float() +{ + if (toolwindow) + { + if (GTK_WIDGET_VISIBLE(toolwindow)) + { + toolwindow_destroy(); + tools_float = FALSE; + tools_hidden = FALSE; + } + else + { + toolwindow_show(); + tools_float = TRUE; + tools_hidden = FALSE; + } + } + else + { + toolwindow_create(); + toolwindow_show(); + tools_float = TRUE; + tools_hidden = FALSE; + } +} + +void toolwindow_hide() +{ + if (toolwindow) + { + if (GTK_WIDGET_VISIBLE(toolwindow)) + { + gtk_widget_hide(toolwindow); + gdk_window_get_position (toolwindow->window, &float_window_x, &float_window_y); + gdk_window_get_size(toolwindow->window, &float_window_w, &float_window_h); + tools_hidden = TRUE; + } + else + { + if (tools_float) + toolwindow_show(); + else + toolwindow_destroy(); + tools_hidden = FALSE; + } + } + else + { + toolwindow_create(); + tools_hidden = TRUE; + } +} + +/* + *----------------------------------------------------------------------------- + * image viewport focus display (private) + *----------------------------------------------------------------------------- + */ + +static void image_focus_paint(GtkWidget *widget) +{ + gint width, height; + gdk_window_get_size (widget->window, &width, &height); + gdk_draw_rectangle (widget->window, + widget->style->black_gc, + FALSE, + 0, 0, width - 1, height - 1); +} + +static gint image_focus_expose (GtkWidget *widget, GdkEventExpose *event, gpointer data) +{ + image_focus_paint (widget); + return TRUE; +} + +static gint image_focus_in_cb(GtkWidget *widget, GdkEventFocus *event, gpointer data) +{ + gtk_signal_connect_after (GTK_OBJECT (widget), "draw", + GTK_SIGNAL_FUNC (image_focus_expose), NULL); + gtk_signal_connect (GTK_OBJECT (widget), "expose_event", + GTK_SIGNAL_FUNC (image_focus_paint), NULL); + GTK_WIDGET_SET_FLAGS(widget, GTK_HAS_FOCUS); + + gtk_widget_queue_draw (widget); + return FALSE; +} + +static gint image_focus_out_cb(GtkWidget *widget, GdkEventFocus *event, gpointer data) +{ + gtk_signal_disconnect_by_func (GTK_OBJECT (widget), + GTK_SIGNAL_FUNC (image_focus_paint), NULL); + gtk_signal_disconnect_by_func (GTK_OBJECT (widget), + GTK_SIGNAL_FUNC (image_focus_expose), NULL); + GTK_WIDGET_UNSET_FLAGS(widget, GTK_HAS_FOCUS); + gtk_widget_queue_clear (widget); + gtk_viewport_set_shadow_type (GTK_VIEWPORT(widget), GTK_SHADOW_IN); + return FALSE; +} + +/* + *----------------------------------------------------------------------------- + * main window setup + *----------------------------------------------------------------------------- + */ + +static void create_tools(GtkAccelGroup *accel_grp, GtkTooltips *tooltips) +{ + GtkWidget *menu_bar; + GtkWidget *button_bar; + GtkWidget *vpaned; + GtkWidget *scrolled; + GtkWidget *tabcomp; + + tool_vbox = gtk_vbox_new(FALSE, 0); + + menu_bar = create_menu_bar(accel_grp); + gtk_box_pack_start (GTK_BOX(tool_vbox), menu_bar,FALSE,FALSE,0); + gtk_widget_show(menu_bar); + + button_bar = create_button_bar(tooltips); + gtk_box_pack_start (GTK_BOX(tool_vbox), button_bar,FALSE,FALSE,0); + gtk_widget_show(button_bar); + + /* path entry */ + tabcomp = tab_completion_new(&path_entry, mainwindow, NULL, path_entry_cb, NULL); + gtk_box_pack_start (GTK_BOX (tool_vbox), tabcomp, FALSE, FALSE, 0); + gtk_widget_show (tabcomp); + + /* history button */ + history_menu = gtk_option_menu_new (); + gtk_box_pack_start (GTK_BOX (tool_vbox), history_menu, FALSE, FALSE, 0); + gtk_widget_show (history_menu); + + vpaned = gtk_vpaned_new (); + gtk_paned_handle_size (GTK_PANED(vpaned), 10); + gtk_paned_gutter_size (GTK_PANED(vpaned), 10); + gtk_box_pack_start (GTK_BOX (tool_vbox), vpaned, TRUE, TRUE, 0); + gtk_widget_show (vpaned); + + /* dir list */ + scrolled = gtk_scrolled_window_new(NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled), + GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); + gtk_paned_add1 (GTK_PANED(vpaned), scrolled); + gtk_widget_show(scrolled); + + dir_clist=gtk_clist_new(1); + gtk_signal_connect (GTK_OBJECT (dir_clist), "button_press_event",(GtkSignalFunc) dir_press_cb, NULL); + gtk_signal_connect (GTK_OBJECT (dir_clist), "select_row",(GtkSignalFunc) dir_select_cb, NULL); + gtk_clist_column_titles_passive (GTK_CLIST (dir_clist)); + gtk_widget_set_usize(dir_clist, LIST_DEFAULT_WIDTH, LIST_DEFAULT_HEIGHT); + gtk_container_add (GTK_CONTAINER (scrolled), dir_clist); + gtk_widget_show(dir_clist); + + /* file list */ + scrolled = gtk_scrolled_window_new(NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled), + GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); + gtk_paned_add2 (GTK_PANED(vpaned), scrolled); + gtk_widget_show(scrolled); + + file_clist=gtk_clist_new(1); + gtk_clist_set_selection_mode(GTK_CLIST(file_clist), GTK_SELECTION_EXTENDED); + gtk_signal_connect (GTK_OBJECT (file_clist), "button_press_event",(GtkSignalFunc) file_press_cb, NULL); + gtk_signal_connect (GTK_OBJECT (file_clist), "select_row",(GtkSignalFunc) file_select_cb, NULL); + gtk_signal_connect_after (GTK_OBJECT (file_clist), "unselect_row",(GtkSignalFunc) file_unselect_cb, NULL); + gtk_clist_column_titles_passive (GTK_CLIST (file_clist)); + gtk_widget_set_usize(file_clist, LIST_DEFAULT_WIDTH, LIST_DEFAULT_HEIGHT); + gtk_container_add (GTK_CONTAINER (scrolled), file_clist); + gtk_widget_show(file_clist); + + gtk_widget_show(tool_vbox); +} + +static void mainwindow_destroy_cb(GtkWidget *widget, gpointer data) +{ + exit_gqview(); +} + +void create_main_window() +{ + GtkWidget *image_window; + GtkAllocation req_size; + GtkTooltips *tooltips; + GdkColormap *colormap; + static GdkColor tooltip_color = { 0, 0xffff, 0xf9f9, 0xcbcb }; /*255 249 203*/ + + mainwindow = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_window_set_policy(GTK_WINDOW(mainwindow), TRUE, TRUE, FALSE); + + gtk_signal_connect (GTK_OBJECT (mainwindow), "delete_event",(GtkSignalFunc) mainwindow_destroy_cb, NULL); + + gtk_window_set_title(GTK_WINDOW (mainwindow), "GQview"); + gtk_window_set_wmclass(GTK_WINDOW (mainwindow), "gqview", "GQview"); + gtk_container_border_width (GTK_CONTAINER (mainwindow), 0); + + gtk_signal_connect(GTK_OBJECT(mainwindow), "key_press_event", GTK_SIGNAL_FUNC(key_press_cb), NULL); + + if (save_window_positions) + { + req_size.x = main_window_x; + req_size.y = main_window_y; + req_size.width = main_window_w; + req_size.height = main_window_h; + gtk_window_set_default_size (GTK_WINDOW(mainwindow), main_window_w, main_window_h); + gtk_widget_set_uposition(mainwindow, main_window_x, main_window_y); + + } + else + { + req_size.x = 0; + req_size.y = 0; + req_size.width = MAINWINDOW_DEF_WIDTH; + req_size.height = MAINWINDOW_DEF_HEIGHT; + gtk_window_set_default_size (GTK_WINDOW(mainwindow), MAINWINDOW_DEF_WIDTH, MAINWINDOW_DEF_HEIGHT); + } + + gtk_widget_size_allocate(mainwindow, &req_size); + + gtk_widget_realize(mainwindow); + + mainwindow_accel_grp = gtk_accel_group_new (); + gtk_window_add_accel_group(GTK_WINDOW(mainwindow),mainwindow_accel_grp); + + tooltips = gtk_tooltips_new(); + colormap = gdk_window_get_colormap (mainwindow->window); + gdk_color_alloc (colormap, &tooltip_color); + gtk_tooltips_set_colors(tooltips, &tooltip_color, &mainwindow->style->fg[GTK_STATE_NORMAL]); + + create_menu_popups(); + create_tools(mainwindow_accel_grp, tooltips); + + image_window = image_create(); + + mainwindow_vbox = gtk_vbox_new(FALSE, 0); + gtk_container_add (GTK_CONTAINER (mainwindow), mainwindow_vbox); + gtk_widget_show(mainwindow_vbox); + + mainwindow_hbox = gtk_hbox_new(FALSE, 0); + gtk_box_pack_start(GTK_BOX(mainwindow_vbox), mainwindow_hbox, TRUE, TRUE, 0); + gtk_widget_show(mainwindow_hbox); + + if (tools_float || tools_hidden) + { + toolwindow_create(); + if (!tools_hidden) + { + toolwindow_show(); + } + } + else + { + info_area_create(NULL); + gtk_box_pack_start(GTK_BOX(mainwindow_hbox), tool_vbox, FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(mainwindow_vbox), info_box, FALSE, FALSE, 0); + } + + gtk_box_pack_end(GTK_BOX(mainwindow_hbox), image_window, TRUE, TRUE, 0); + gtk_widget_show_all(image_window); + + GTK_WIDGET_SET_FLAGS(main_image->viewport, GTK_CAN_FOCUS); + gtk_signal_connect(GTK_OBJECT(main_image->viewport), "focus_in_event", GTK_SIGNAL_FUNC(image_focus_in_cb), NULL); + gtk_signal_connect(GTK_OBJECT(main_image->viewport), "focus_out_event", GTK_SIGNAL_FUNC(image_focus_out_cb), NULL); + + gtk_widget_show(mainwindow); + + if (save_window_positions) + gdk_window_move(mainwindow->window, main_window_x, main_window_y); +} +